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+CmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQvLmN2c2lnbm9yZSBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC8uY3ZzaWdub3JlCmluZGV4IGQ5ZTQzNDAuLmRlOGI3M2YgMTAwNjQ0Ci0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC8uY3ZzaWdub3JlCisrKyBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC8uY3ZzaWdub3JlCkBAIC0xLDIgKzEsMiBAQAotKi5iaW4uZGlzdC56aXAKIGJ1aWxkLnhtbAorb3JnLmVjbGlwc2UuanB0XzEuMC4wLioKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Ly5jdnNpZ25vcmUgYi9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDI1NGIxLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Ly5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLWJpbgotdGVtcC5mb2xkZXIKLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvLnByb2plY3QgYi9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjUxYjA0Yy4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFlYzI5ZC4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNTdW4gTWF5IDI3IDE1OjEwOjA5IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L01FVEEtSU5GL01BTklGRVNULk1GIGIvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhYzYxM2UuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qcHQ7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4wLnF1YWxpZmllcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCmRpZmYgLS1naXQgYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9hYm91dC5odG1sIGIvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E2MDZiMS4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvYWJvdXQuaW5pIGIvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODhhMzI1Li4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT1lY2xpcHNlMzIuZ2lmCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAodHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAidGlwc0FuZFRyaWNrc0hyZWYiIGNvbnRhaW5zIHRoZSBIZWxwIHRvcGljIGhyZWYgdG8gYSB0aXBzIGFuZCB0cmlja3MgcGFnZSAKLSMgb3B0aW9uYWwKLXRpcHNBbmRUcmlja3NIcmVmPS9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGlwc19hbmRfdHJpY2tzLmh0bQotCi0KZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2Fib3V0Lm1hcHBpbmdzIGIvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZGFhYjQuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRAClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvYWJvdXQucHJvcGVydGllcyBiL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1OWJmY2UuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotYmx1cmI9SmF2YSBQZXJzaXN0ZW5jZSBBUEkgVG9vbHNcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwNi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzCmRpZmYgLS1naXQgYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9idWlsZC5wcm9wZXJ0aWVzIGIvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNjZmIwZS4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0LmluaSxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lm1hcHBpbmdzLFwKLSAgICAgICAgICAgICAgIGFib3V0LnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZWNsaXBzZTMyLmdpZixcCi0gICAgICAgICAgICAgICBlY2xpcHNlMzIucG5nLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGNvbXBvbmVudC54bWwKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2NvbXBvbmVudC54bWwgYi9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWYxMzNmLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNvbXBvbmVudCAgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIgbmFtZT0ib3JnLmVjbGlwc2UuanB0Ij4KLTxkZXNjcmlwdGlvbiB1cmw9IiI+PC9kZXNjcmlwdGlvbj4KLTxjb21wb25lbnQtZGVwZW5kcyB1bnJlc3RyaWN0ZWQ9InRydWUiPjwvY29tcG9uZW50LWRlcGVuZHM+Ci08cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQiIGZyYWdtZW50PSJmYWxzZSIvPgotPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LmNvcmUiIGZyYWdtZW50PSJmYWxzZSIvPgotPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LmRiIiBmcmFnbWVudD0iZmFsc2UiLz4KLTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5kYi51aSIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQuZ2VuIiBmcmFnbWVudD0iZmFsc2UiLz4KLTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC51aSIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQudXRpbGl0eSIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08L2NvbXBvbmVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9lY2xpcHNlMzIuZ2lmIGIvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvZWNsaXBzZTMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZhZDdjYy4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9lY2xpcHNlMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvZWNsaXBzZTMyLnBuZyBiL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2VjbGlwc2UzMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2OGZhYzEuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvZWNsaXBzZTMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L3BsdWdpbi5wcm9wZXJ0aWVzIGIvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0NWEwOGQuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWUgPSBKYXZhIFBlcnNpc3RlbmNlIEFQSSBUb29scwotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS8ucHJvamVjdCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhlYjJmMC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWI1ODM3Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNTdW4gTWF5IDI3IDE1OjEwOjQ3IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyMDA5MzkuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL2VwbC12MTAuaHRtbCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+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+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJiMzlmMy4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1KYXZhIFBlcnNpc3RlbmNlIEFQSSBUb29scwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPUphdmEgUGVyc2lzdGVuY2UgQVBJIChKUEEpIFRvb2xzCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNi0wNyBPcmFjbGUgQ29ycG9yYXRpb24uXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1KdW5lIDA2LCAyMDA3XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotICAgIC0gQ29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvZmVhdHVyZS54bWwgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2ZThhNTQuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjEuMC4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICAgICBpbWFnZT0iZWNsaXBzZV91cGRhdGVfMTIwLmpwZyI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9ImxpY2Vuc2UuaHRtbCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFVwZGF0ZXMiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMiLz4KLSAgICAgIDxkaXNjb3ZlcnkgbGFiZWw9IldlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBVcGRhdGVzIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzIi8+Ci0gICAgICA8ZGlzY292ZXJ5IGxhYmVsPSJEYWxpIEphdmEgUGVyc2lzdGVuY2UgQVBJIFRvb2xzIChKUEEpIFVwZGF0ZXMiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMvIi8+Ci0gICA8L3VybD4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIi8+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuZmVhdHVyZSIvPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLmZlYXR1cmUiLz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuZGF0YXRvb2xzLnNxbGRldnRvb2xzLmZlYXR1cmUiLz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuZGF0YXRvb2xzLmVuYWJsZW1lbnQuZmVhdHVyZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuZGIuZ2VuZXJpYy51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuZGIuZ2VuZXJpYyIvPiAgCi0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZGF0YXRvb2xzLmRvYy51c2VyIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamR0LmNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmVtZi5lY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZW0iLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZW0udXRpbCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2giLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3QuajJlZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS50ZXh0Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UueHNkIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZHJhdzJkIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZW1mLmVkaXQudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZHQudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LmoyZWUudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS5pZGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC53ZWIudWkiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQudXRpbGl0eSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5kYiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5kYi51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5nZW4iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5kb2MudXNlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNzczNzIuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczYy5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9sb29zZS5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxIVE1MPjxIRUFEPjxUSVRMRT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvVElUTEU+Ci08TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TUVUQSBjb250ZW50PSJNU0hUTUwgNi4wMC4yODAwLjE0NzkiIG5hbWU9R0VORVJBVE9SPjwvSEVBRD4KLTxCT0RZIGxhbmc9RU4tVVMgdkxpbms9cHVycGxlIGxpbms9Ymx1ZT4KLTxIMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L0gyPgotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLTxIMz5Vc2FnZSBPZiBDb250ZW50PC9IMz4KLTxQPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiAKLUFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GIAotVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCAKLUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgCi1CWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgCi1BR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgCi1BUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSAKLU1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvUD4KLTxIMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9IMz4KLTxQPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSAKLUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSAKLVB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyAKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxBIAotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci08UD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAKLSgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgCi1hcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvUD4KLTxQPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSAKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IAotY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgCi1hc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIAotbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLjwvUD4KLTxQPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZCAKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIAotRmVhdHVyZXMuPC9QPgotPFA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgCi1pbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyAKLUZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAotKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgCi1kaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyAKLWxvY2F0aW9uczo8L1A+Ci08VUw+Ci0gIDxMST5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnkgCi0gIDxMST5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllcyAKLSAgPExJPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWlucyAKLSAgPExJPkZlYXR1cmUgZGlyZWN0b3JpZXMgPC9MST48L1VMPgotPFA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIAotdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIAotRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgCi1hbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiAKLWxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiAKLWZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSAKLVVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCAKLWRpcmVjdG9yeS48L1A+Ci08UD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCAKLU9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSAKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9QPgotPFVMPgotICA8TEk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvQT4pIAotCi0gIDxMST5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvQT4pIAotCi0gIDxMST5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9BPikgCi0KLSAgPExJPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L0E+KSAKLSAgPC9MST4KLSAgCi0gIDxMST5Db21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwiPmh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCk8L0E+Ci0gIDwvTEk+Ci08L1VMPgotPFA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiAKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIAotcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIAotY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9QPgotPEgzPkNyeXB0b2dyYXBoeTwvSDM+Ci08UD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciAKLXJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgCi1lbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgCi1jb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCAKLXRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L1A+PC9CT0RZPjwvSFRNTD4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk3ZGQzZi4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9XAotZXBsLXYxMC5odG1sLFwKLWVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotZmVhdHVyZS54bWwsXAotZmVhdHVyZS5wcm9wZXJ0aWVzLFwKLWxpY2Vuc2UuaHRtbApkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMmFkMjkuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzFkYTE1Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBBUEkgKEpQQSkgVG9vbHMKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1EYWxpIEphdmEgUGVyc2lzdGVuY2UgQVBJIChKUEEpIFRvb2xzCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNiBPcmFjbGUgQ29ycG9yYXRpb24uXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1KdW5lIDA2LCAyMDA3XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotICAgIC0gQ29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUueG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJlMjY3ZS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmZlYXR1cmUuc291cmNlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjEuMC4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSJsaWNlbnNlLmh0bWwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5mZWF0dXJlLnNvdXJjZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWM0YTQ4Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5KdW5lIDA2LCAyMDA3PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotICAgCi08dWw+Ci0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0JPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+ICAgCi0gCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotICA8TEk+Q29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sIj5odHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpPC9BPgotICA8L0xJPgotPC9VTD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLSAgIAotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDkxNmRmLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLQotPHA+SnVuZSAwNiwgMjAwNzwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08aDM+U291cmNlIENvZGU8L2gzPgotPHA+VGhpcyBwbHVnLWluIGNvbnRhaW5zIHNvdXJjZSBjb2RlIHppcCBmaWxlcyAoJnF1b3Q7U291cmNlIFppcHMmcXVvdDspIHRoYXQgY29ycmVzcG9uZCB0byBiaW5hcnkgY29udGVudCBpbiBvdGhlciBwbHVnLWlucy4gVGhlc2UgU291cmNlIFppcHMgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIGRpZmZlcmVudCBsaWNlbnNlCi1hZ3JlZW1lbnRzIGFuZC9vciBub3RpY2VzLiBEZXRhaWxzIGFib3V0IHRoZXNlIGxpY2Vuc2UgYWdyZWVtZW50cyBhbmQgbm90aWNlcyBhcmUgY29udGFpbmVkIGluICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgZmlsZXMgKCZxdW90O0Fib3V0cyZxdW90OykgbG9jYXRlZCBpbiBzdWItZGlyZWN0b3JpZXMgaW4gdGhlCi1zcmMvIGRpcmVjdG9yeSBvZiB0aGlzIHBsdWctaW4uIFN1Y2ggQWJvdXRzIGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgU291cmNlIFppcHMgaW4gdGhhdCBkaXJlY3RvcnksIG5vdCB0aGUgRVBMLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaSBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZWUzNmEuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAid2luZG93SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2luZG93IGljb24gKDE2eDE2KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9ZWNsaXBzZTMyLmdpZgotCi0jIFByb3BlcnR5ICJhYm91dEltYWdlIiBjb250YWlucyBwYXRoIHRvIHByb2R1Y3QgaW1hZ2UgKDUwMHgzMzAgb3IgMTE1eDE2NCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKG5vdCB0cmFuc2xhdGVkKQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBlcnNwZWN0aXZlIiBjb250YWlucyB0aGUgaWQgb2YgdGhlIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRoZQotIyB3ZWxjb21lIHBhZ2UgaXMgdG8gYmUgb3BlbmVkLgotIyBvcHRpb25hbAotCi0KLQotCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyODM5MGEuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU1MmNiMi4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotIwotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQotCi1ibHVyYj1KYXZhU2VydmVyIEZhY2VzIFRvb2xpbmcgU291cmNlXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDUuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwotCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzA5OGIzLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotYmluLmluY2x1ZGVzID1cCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0LmluaSxcCi0gICAgICAgICAgICAgICBhYm91dC5tYXBwaW5ncyxcCi0gICAgICAgICAgICAgICBhYm91dC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2UzMi5naWYsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBzcmMvKiosXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvCi1zb3VyY2VQbHVnaW4gPSB0cnVlCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLmdpZiBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmFkN2NjLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5wbmcgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBhZTQ5ZC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZXBsLXYxMC5odG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIyYWQyOS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+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+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2xpY2Vuc2UuaHRtbCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0YjFkNTAuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+SnVuZSAwNiwgMjAwNzwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0gICAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKLSAgIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLSAgIAotPHVsPgotCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0JPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0JPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPiAgIAotIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLQk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0JCQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLSAgCi0gIDxMST5Db21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwiPmh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCk8L0E+Ci0gIDwvTEk+Ci08L1VMPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotICAgCi08c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg4MTYxZi4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWUgPSBEYWxpIEphdmEgUGVyc2lzdGVuY2UgQVBJIChKUEEpIFRvb2xzCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5mZWF0dXJlLy5jdnNpZ25vcmUgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmZlYXR1cmUvLmN2c2lnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTQ0ODdjCi0tLSAvZGV2L251bGwKKysrIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5mZWF0dXJlLy5jdnNpZ25vcmUKQEAgLTAsMCArMSBAQAorYnVpbGQueG1sCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmZlYXR1cmUvZmVhdHVyZS54bWwKaW5kZXggMjAzNGNhYy4uZDBkNGIxMSAxMDA2NDQKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuZmVhdHVyZS9mZWF0dXJlLnhtbApAQCAtMiw3ICsyLDcgQEAKIDxmZWF0dXJlCiAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LnRlc3RzLmZlYXR1cmUiCiAgICAgICBsYWJlbD0iRGFsaSBKYXZhIFBlcnNpc3RlbmNlIEFQSSBUb29scyAoSlBBKSBKVW5pdCBUZXN0cyIKLSAgICAgIHZlcnNpb249IjEuMC4wLnF1YWxpZmllciIKKyAgICAgIHZlcnNpb249IjIuMC4wLnF1YWxpZmllciIKICAgICAgIHByb3ZpZGVyLW5hbWU9IkVjbGlwc2Uub3JnIj4KIAogICAgPGRlc2NyaXB0aW9uPgpAQCAtMjksNCArMjksMTAgQEAKICAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKICAgICAgICAgIHZlcnNpb249IjAuMC4wIiAvPgogCisgICA8cGx1Z2luCisgICAgICAgICBpZD0idGVzdFBsdWdpbiIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIwLjAuMCIgLz4KKwogPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZS8ucHJvamVjdCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzZGE3NTAuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjYzdkNGIuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNTdW4gTWF5IDI3IDE1OjA5OjU5IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg3MjRjNi4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcKLSAgICAgICAgICAgICAgIAotc3JjLmluY2x1ZGVzID0gYnVpbGQucHJvcGVydGllcwotCi1nZW5lcmF0ZS5mZWF0dXJlQG9yZy5lY2xpcHNlLmpwdC5mZWF0dXJlLnNvdXJjZT1vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmZlYXR1cmUvZXBsLXYxMC5odG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE0MjA0YS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPUphdmEgUGVyc2lzdGVuY2UgQVBJIFRvb2xzIFBsdWctaW4gU0RLCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249U291cmNlIGNvZGUgemlwcyBmb3IgSlBBIFRvb2xzCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNi0wNyBPcmFjbGUgQ29ycG9yYXRpb24uXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1KdW5lIDA2LCAyMDA3XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotICAgIC0gQ29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhmM2RlMS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanB0X3Nkay5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjEuMC4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSJsaWNlbnNlLmh0bWwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS5zb3VyY2UiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzc3MzcyLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzNjLm9yZy9UUi8xOTk5L1JFQy1odG1sNDAxLTE5OTkxMjI0L2xvb3NlLmR0ZCI+Ci08IS0tIHNhdmVkIGZyb20gdXJsPSgwMDQ0KWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsL25vdGljZS5odG1sIC0tPgotPEhUTUw+PEhFQUQ+PFRJVExFPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9USVRMRT4KLTxNRVRBIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxNRVRBIGNvbnRlbnQ9Ik1TSFRNTCA2LjAwLjI4MDAuMTQ3OSIgbmFtZT1HRU5FUkFUT1I+PC9IRUFEPgotPEJPRFkgbGFuZz1FTi1VUyB2TGluaz1wdXJwbGUgbGluaz1ibHVlPgotPEgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvSDI+Ci08UD5KdW5lIDA2LCAyMDA3PC9QPgotPEgzPlVzYWdlIE9mIENvbnRlbnQ8L0gzPgotPFA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIAotQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiBVU0UgT0YgCi1USEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIAotQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCAKLUJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSAKLUFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSAKLUFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIAotTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9QPgotPEgzPkFwcGxpY2FibGUgTGljZW5zZXM8L0gzPgotPFA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIAotRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIAotUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPEEgCi1ocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLTxQPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCAKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5IAotKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSAKLWFyY2hpdmVzICgiRG93bmxvYWRzIikuPC9QPgotPFA+Q29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzIAotKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIAotUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgCi1jb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyAKLWFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgCi1uYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICJmZWF0dXJlcyIuPC9QPgotPFA+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkIAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgCi1GZWF0dXJlcy48L1A+Ci08UD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCAKLWluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIAotRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgCi0oIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSAKLWRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIAotbG9jYXRpb25zOjwvUD4KLTxVTD4KLSAgPExJPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeSAKLSAgPExJPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzIAotICA8TEk+U3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zIAotICA8TEk+RmVhdHVyZSBkaXJlY3RvcmllcyA8L0xJPjwvVUw+Ci08UD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgCi11c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgCi1GZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyAKLWFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIAotbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIAotZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIAotVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgCi1hbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IAotZGlyZWN0b3J5LjwvUD4KLTxQPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIAotT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFIAotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L1A+Ci08VUw+Ci0gIDxMST5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9BPikgCi0KLSAgPExJPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9BPikgCi0KLSAgPExJPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L0E+KSAKLQotICA8TEk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvQT4pIAotICA8L0xJPgotICAKLSAgPExJPkNvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCI+aHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKTwvQT4KLSAgPC9MST4KLTwvVUw+Ci08UD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgCi1wcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgCi1jb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L1A+Ci08SDM+Q3J5cHRvZ3JhcGh5PC9IMz4KLTxQPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSAKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIAotcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSAKLWVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyAKLWNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIAotdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvUD48L0JPRFk+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvLmN2c2lnbm9yZSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlLy5jdnNpZ25vcmUKaW5kZXggNjA0NjNhZi4uYTE5NmRkNyAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvLmN2c2lnbm9yZQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS8uY3ZzaWdub3JlCkBAIC0xLDIgKzEsNiBAQAogYmluCitAZG90Cit0ZW1wLmZvbGRlcgogYnVpbGQueG1sCitqYXZhQ29tcGlsZXIuLi5hcmdzCitqYXZhQ29tcGlsZXIuLi5hcmdzLioKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCmluZGV4IDNhNWZhMWEuLjYwZjAwOTEgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0zLDcgKzMsNyBAQAogQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCiBCdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qcHQuY29yZTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiAyLjAuMC5xdWFsaWZpZXIKIEJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkpwdENvcmVQbHVnaW4KIEJ1bmRsZS1DbGFzc1BhdGg6IC4KIEJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvbW9kZWwvY29yZS5lY29yZSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL21vZGVsL2NvcmUuZWNvcmUKaW5kZXggZWFmMGYwZS4uOWY3ODI5MiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvbW9kZWwvY29yZS5lY29yZQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9tb2RlbC9jb3JlLmVjb3JlCkBAIC0yMzEsMTAgKzIzMSwyMSBAQAogICAgIDwvZUNsYXNzaWZpZXJzPgogICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSUNvbHVtbiIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSIKICAgICAgICAgZVN1cGVyVHlwZXM9IiMvL21hcHBpbmdzL0lBYnN0cmFjdENvbHVtbiI+CisgICAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0RGVmYXVsdExlbmd0aCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VJbnQiLz4KKyAgICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXREZWZhdWx0UHJlY2lzaW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIHBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRUludCIvPgorICAgICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldERlZmF1bHRTY2FsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VJbnQiLz4KICAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsZW5ndGgiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VJbnQiCi0gICAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iMjU1Ii8+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJlY2lzaW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FSW50Ii8+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2NhbGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VJbnQiLz4KKyAgICAgICAgICBjaGFuZ2VhYmxlPSJmYWxzZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiLz4KKyAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzcGVjaWZpZWRMZW5ndGgiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgcGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FSW50IgorICAgICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9Ii0xIi8+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJlY2lzaW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FSW50IgorICAgICAgICAgIGNoYW5nZWFibGU9ImZhbHNlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIvPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNwZWNpZmllZFByZWNpc2lvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VJbnQiCisgICAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iLTEiLz4KKyAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzY2FsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUludCIKKyAgICAgICAgICBjaGFuZ2VhYmxlPSJmYWxzZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiLz4KKyAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzcGVjaWZpZWRTY2FsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VJbnQiCisgICAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iLTEiLz4KICAgICA8L2VDbGFzc2lmaWVycz4KICAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklDb2x1bW5NYXBwaW5nIiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIj4KICAgICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRDb2x1bW4iIGVUeXBlPSIjLy9tYXBwaW5ncy9JQ29sdW1uIi8+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9tb2RlbC9jb3JlTW9kZWxzLmdlbm1vZGVsIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvbW9kZWwvY29yZU1vZGVscy5nZW5tb2RlbAppbmRleCAxM2IyNGRjLi4yMjk4MTM4IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9tb2RlbC9jb3JlTW9kZWxzLmdlbm1vZGVsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL21vZGVsL2NvcmVNb2RlbHMuZ2VubW9kZWwKQEAgLTIyNSw4ICsyMjUsMTQgQEAKICAgICAgIDwvZ2VuQ2xhc3Nlcz4KICAgICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImNvcmUuZWNvcmUjLy9tYXBwaW5ncy9JQ29sdW1uIj4KICAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvcmUuZWNvcmUjLy9tYXBwaW5ncy9JQ29sdW1uL2xlbmd0aCIvPgorICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29yZS5lY29yZSMvL21hcHBpbmdzL0lDb2x1bW4vc3BlY2lmaWVkTGVuZ3RoIi8+CiAgICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBjb3JlLmVjb3JlIy8vbWFwcGluZ3MvSUNvbHVtbi9wcmVjaXNpb24iLz4KKyAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvcmUuZWNvcmUjLy9tYXBwaW5ncy9JQ29sdW1uL3NwZWNpZmllZFByZWNpc2lvbiIvPgogICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29yZS5lY29yZSMvL21hcHBpbmdzL0lDb2x1bW4vc2NhbGUiLz4KKyAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvcmUuZWNvcmUjLy9tYXBwaW5ncy9JQ29sdW1uL3NwZWNpZmllZFNjYWxlIi8+CisgICAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJjb3JlLmVjb3JlIy8vbWFwcGluZ3MvSUNvbHVtbi9nZXREZWZhdWx0TGVuZ3RoIi8+CisgICAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJjb3JlLmVjb3JlIy8vbWFwcGluZ3MvSUNvbHVtbi9nZXREZWZhdWx0UHJlY2lzaW9uIi8+CisgICAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJjb3JlLmVjb3JlIy8vbWFwcGluZ3MvSUNvbHVtbi9nZXREZWZhdWx0U2NhbGUiLz4KICAgICAgIDwvZ2VuQ2xhc3Nlcz4KICAgICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImNvcmUuZWNvcmUjLy9tYXBwaW5ncy9JQ29sdW1uTWFwcGluZyI+CiAgICAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJjb3JlLmVjb3JlIy8vbWFwcGluZ3MvSUNvbHVtbk1hcHBpbmcvZ2V0Q29sdW1uIi8+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9tb2RlbC9qcHRSZXNvdXJjZU1vZGVscy5nZW5tb2RlbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL21vZGVsL2pwdFJlc291cmNlTW9kZWxzLmdlbm1vZGVsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkOTQ1MjgKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9tb2RlbC9qcHRSZXNvdXJjZU1vZGVscy5nZW5tb2RlbApAQCAtMCwwICsxLDQ5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGdlbm1vZGVsOkdlbk1vZGVsIHhtaTp2ZXJzaW9uPSIyLjAiCisgICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIKKyAgICB4bWxuczpnZW5tb2RlbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCIgbW9kZWxEaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMiCisgICAgY3JlYXRpb25Db21tYW5kcz0iZmFsc2UiIGNyZWF0aW9uSWNvbnM9ImZhbHNlIiBlZGl0RGlyZWN0b3J5PSIiIGVkaXRvckRpcmVjdG9yeT0iIgorICAgIG1vZGVsUGx1Z2luSUQ9Im9yZy5lY2xpcHNlLmpwdC5jb3JlIiBtb2RlbE5hbWU9IkNvcmUiIGVkaXRQbHVnaW5DbGFzcz0iIiBlZGl0b3JQbHVnaW5DbGFzcz0iIgorICAgIHN1cHByZXNzSW50ZXJmYWNlcz0idHJ1ZSIgdGVzdHNEaXJlY3Rvcnk9IiIgdGVzdFN1aXRlQ2xhc3M9IiIgaW1wb3J0ZXJJRD0ib3JnLmVjbGlwc2UuZW1mLmltcG9ydGVyLmVjb3JlIgorICAgIGNvbXBsaWFuY2VMZXZlbD0iNS4wIiBjb3B5cmlnaHRGaWVsZHM9ImZhbHNlIiB1c2VkR2VuUGFja2FnZXM9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmdlbm1vZGVsIy8vZWNvcmUiPgorICA8Zm9yZWlnbk1vZGVsPnBlcnNpc3RlbmNlLmVjb3JlPC9mb3JlaWduTW9kZWw+CisgIDxnZW5QYWNrYWdlcyBwcmVmaXg9IlBlcnNpc3RlbmNlIiBiYXNlUGFja2FnZT0ib3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UiCisgICAgICBkaXNwb3NhYmxlUHJvdmlkZXJGYWN0b3J5PSJ0cnVlIiBlY29yZVBhY2thZ2U9InBlcnNpc3RlbmNlLmVjb3JlIy8iPgorICAgIDxnZW5FbnVtcyB0eXBlU2FmZUVudW1Db21wYXRpYmxlPSJmYWxzZSIgZWNvcmVFbnVtPSJwZXJzaXN0ZW5jZS5lY29yZSMvL1BlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSI+CisgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InBlcnNpc3RlbmNlLmVjb3JlIy8vUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlL0pUQSIvPgorICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJwZXJzaXN0ZW5jZS5lY29yZSMvL1BlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZS9SRVNPVVJDRV9MT0NBTCIvPgorICAgIDwvZ2VuRW51bXM+CisgICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJwZXJzaXN0ZW5jZS5lY29yZSMvL1BlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZU9iamVjdCIvPgorICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0icGVyc2lzdGVuY2UuZWNvcmUjLy9WZXJzaW9uIi8+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0icGVyc2lzdGVuY2UuZWNvcmUjLy9QZXJzaXN0ZW5jZSI+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHBlcnNpc3RlbmNlLmVjb3JlIy8vUGVyc2lzdGVuY2UvcGVyc2lzdGVuY2VVbml0cyIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHBlcnNpc3RlbmNlLmVjb3JlIy8vUGVyc2lzdGVuY2UvdmVyc2lvbiIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJwZXJzaXN0ZW5jZS5lY29yZSMvL1BlcnNpc3RlbmNlVW5pdCI+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgcGVyc2lzdGVuY2UuZWNvcmUjLy9QZXJzaXN0ZW5jZVVuaXQvZGVzY3JpcHRpb24iLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBwZXJzaXN0ZW5jZS5lY29yZSMvL1BlcnNpc3RlbmNlVW5pdC9wcm92aWRlciIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHBlcnNpc3RlbmNlLmVjb3JlIy8vUGVyc2lzdGVuY2VVbml0L2p0YURhdGFTb3VyY2UiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBwZXJzaXN0ZW5jZS5lY29yZSMvL1BlcnNpc3RlbmNlVW5pdC9ub25KdGFEYXRhU291cmNlIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHBlcnNpc3RlbmNlLmVjb3JlIy8vUGVyc2lzdGVuY2VVbml0L21hcHBpbmdGaWxlcyIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHBlcnNpc3RlbmNlLmVjb3JlIy8vUGVyc2lzdGVuY2VVbml0L2phckZpbGVzIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHBlcnNpc3RlbmNlLmVjb3JlIy8vUGVyc2lzdGVuY2VVbml0L2NsYXNzZXMiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBwZXJzaXN0ZW5jZS5lY29yZSMvL1BlcnNpc3RlbmNlVW5pdC9leGNsdWRlVW5saXN0ZWRDbGFzc2VzIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHBlcnNpc3RlbmNlLmVjb3JlIy8vUGVyc2lzdGVuY2VVbml0L3Byb3BlcnRpZXMiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBwZXJzaXN0ZW5jZS5lY29yZSMvL1BlcnNpc3RlbmNlVW5pdC9uYW1lIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgcGVyc2lzdGVuY2UuZWNvcmUjLy9QZXJzaXN0ZW5jZVVuaXQvdHJhbnNhY3Rpb25UeXBlIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InBlcnNpc3RlbmNlLmVjb3JlIy8vTWFwcGluZ0ZpbGVSZWYiPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHBlcnNpc3RlbmNlLmVjb3JlIy8vTWFwcGluZ0ZpbGVSZWYvZmlsZU5hbWUiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0icGVyc2lzdGVuY2UuZWNvcmUjLy9KYXZhQ2xhc3NSZWYiPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHBlcnNpc3RlbmNlLmVjb3JlIy8vSmF2YUNsYXNzUmVmL2phdmFDbGFzcyIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJwZXJzaXN0ZW5jZS5lY29yZSMvL1Byb3BlcnRpZXMiPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBwZXJzaXN0ZW5jZS5lY29yZSMvL1Byb3BlcnRpZXMvcHJvcGVydGllcyIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJwZXJzaXN0ZW5jZS5lY29yZSMvL1Byb3BlcnR5Ij4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBwZXJzaXN0ZW5jZS5lY29yZSMvL1Byb3BlcnR5L25hbWUiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBwZXJzaXN0ZW5jZS5lY29yZSMvL1Byb3BlcnR5L3ZhbHVlIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICA8L2dlblBhY2thZ2VzPgorPC9nZW5tb2RlbDpHZW5Nb2RlbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL21vZGVsL29sZF9jb3JlLmVjb3JlIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvbW9kZWwvb2xkX2NvcmUuZWNvcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY3ODI5MgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL21vZGVsL29sZF9jb3JlLmVjb3JlCkBAIC0wLDAgKzEsNTg4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGVjb3JlOkVQYWNrYWdlIHhtaTp2ZXJzaW9uPSIyLjAiCisgICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiBuYW1lPSJpbnRlcm5hbCIKKyAgICBuc1VSST0ianB0LmNvcmUueG1pIiBuc1ByZWZpeD0ianB0LmNvcmUiPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklKcGFNb2RlbCIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSIvPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkpwYU1vZGVsIiBlU3VwZXJUeXBlcz0iIy8vSnBhRU9iamVjdCAjLy9JSnBhTW9kZWwiPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcm9qZWN0cyIgdXBwZXJCb3VuZD0iLTEiCisgICAgICAgIGVUeXBlPSIjLy9JSnBhUHJvamVjdCIgY29udGFpbm1lbnQ9InRydWUiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSUpwYUVPYmplY3QiIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiPgorICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRKcGFQcm9qZWN0IiBlVHlwZT0iIy8vSUpwYVByb2plY3QiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSnBhRU9iamVjdCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9JSnBhRU9iamVjdCIvPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklKcGFQcm9qZWN0IiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIgorICAgICAgZVN1cGVyVHlwZXM9IiMvL0lKcGFFT2JqZWN0Ij4KKyAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0TW9kZWwiIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9JSnBhTW9kZWwiLz4KKyAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0UGxhdGZvcm0iIG9yZGVyZWQ9ImZhbHNlIiB1bmlxdWU9ImZhbHNlIiBsb3dlckJvdW5kPSIxIgorICAgICAgICBlVHlwZT0iIy8vSUpwYVBsYXRmb3JtIi8+CisgICAgPGVPcGVyYXRpb25zIG5hbWU9InNldFBsYXRmb3JtIj4KKyAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJwbGF0Zm9ybUlkIiBvcmRlcmVkPSJmYWxzZSIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VTdHJpbmciLz4KKyAgICA8L2VPcGVyYXRpb25zPgorICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXREYXRhU291cmNlIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vSUpwYURhdGFTb3VyY2UiLz4KKyAgICA8ZU9wZXJhdGlvbnMgbmFtZT0ic2V0RGF0YVNvdXJjZSIgb3JkZXJlZD0iZmFsc2UiIHVuaXF1ZT0iZmFsc2UiIGxvd2VyQm91bmQ9IjEiPgorICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9ImNvbm5lY3Rpb25Qcm9maWxlTmFtZSIgb3JkZXJlZD0iZmFsc2UiIHVuaXF1ZT0iZmFsc2UiIGxvd2VyQm91bmQ9IjEiCisgICAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VTdHJpbmciLz4KKyAgICA8L2VPcGVyYXRpb25zPgorICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJpc0Rpc2NvdmVyQW5ub3RhdGVkQ2xhc3NlcyIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VCb29sZWFuIi8+CisgICAgPGVPcGVyYXRpb25zIG5hbWU9InNldERpc2NvdmVyQW5ub3RhdGVkQ2xhc3NlcyIgb3JkZXJlZD0iZmFsc2UiIHVuaXF1ZT0iZmFsc2UiCisgICAgICAgIGxvd2VyQm91bmQ9IjEiPgorICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9ImRpc2NvdmVyQW5ub3RhdGVkQ2xhc3NlcyIgb3JkZXJlZD0iZmFsc2UiIHVuaXF1ZT0iZmFsc2UiCisgICAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VCb29sZWFuIi8+CisgICAgPC9lT3BlcmF0aW9ucz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSnBhUHJvamVjdCIgZVN1cGVyVHlwZXM9IiMvL0pwYUVPYmplY3QgIy8vSUpwYVByb2plY3QiPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwbGF0Zm9ybSIgb3JkZXJlZD0iZmFsc2UiCisgICAgICAgIHVuaXF1ZT0iZmFsc2UiIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9JSnBhUGxhdGZvcm0iIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkYXRhU291cmNlIiBvcmRlcmVkPSJmYWxzZSIKKyAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL0lKcGFEYXRhU291cmNlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRpc2NvdmVyQW5ub3RhdGVkQ2xhc3NlcyIKKyAgICAgICAgb3JkZXJlZD0iZmFsc2UiIHVuaXF1ZT0iZmFsc2UiIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgcGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FQm9vbGVhbiIKKyAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZmlsZXMiIHVwcGVyQm91bmQ9Ii0xIgorICAgICAgICBlVHlwZT0iIy8vSUpwYUZpbGUiIGNvbnRhaW5tZW50PSJ0cnVlIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklKcGFQbGF0Zm9ybSIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSIvPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklKcGFEYXRhU291cmNlIiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIgorICAgICAgZVN1cGVyVHlwZXM9IiMvL0lKcGFFT2JqZWN0Ij4KKyAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0Q29ubmVjdGlvblByb2ZpbGVOYW1lIiBvcmRlcmVkPSJmYWxzZSIgdW5pcXVlPSJmYWxzZSIgbG93ZXJCb3VuZD0iMSIKKyAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VTdHJpbmciLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSnBhRGF0YVNvdXJjZSIgZVN1cGVyVHlwZXM9IiMvL0pwYUVPYmplY3QgIy8vSUpwYURhdGFTb3VyY2UiPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb25uZWN0aW9uUHJvZmlsZU5hbWUiCisgICAgICAgIG9yZGVyZWQ9ImZhbHNlIiB1bmlxdWU9ImZhbHNlIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklKcGFGaWxlIiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIgorICAgICAgZVN1cGVyVHlwZXM9IiMvL0lKcGFFT2JqZWN0Ij4KKyAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0Q29udGVudElkIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+CisgICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldENvbnRlbnQiIGVUeXBlPSIjLy9JSnBhUm9vdENvbnRlbnROb2RlIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkpwYUZpbGUiIGVTdXBlclR5cGVzPSIjLy9KcGFFT2JqZWN0ICMvL0lKcGFGaWxlIj4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29udGVudElkIiBsb3dlckJvdW5kPSIxIgorICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbnRlbnQiIGVUeXBlPSIjLy9JSnBhUm9vdENvbnRlbnROb2RlIgorICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9JSnBhUm9vdENvbnRlbnROb2RlL2pwYUZpbGUiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSUpwYVNvdXJjZU9iamVjdCIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSIKKyAgICAgIGVTdXBlclR5cGVzPSIjLy9JSnBhRU9iamVjdCI+CisgICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldEpwYUZpbGUiIGVUeXBlPSIjLy9JSnBhRmlsZSIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJWG1sRU9iamVjdCIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSIKKyAgICAgIGVTdXBlclR5cGVzPSIjLy9JSnBhRU9iamVjdCAjLy9JSnBhU291cmNlT2JqZWN0Ii8+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sRU9iamVjdCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9KcGFFT2JqZWN0ICMvL0lYbWxFT2JqZWN0Ii8+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSUpwYUNvbnRlbnROb2RlIiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIgorICAgICAgZVN1cGVyVHlwZXM9IiMvL0lKcGFTb3VyY2VPYmplY3QiPgorICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRKcGFGaWxlIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vSUpwYUZpbGUiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSUpwYVJvb3RDb250ZW50Tm9kZSIgYWJzdHJhY3Q9InRydWUiCisgICAgICBpbnRlcmZhY2U9InRydWUiIGVTdXBlclR5cGVzPSIjLy9JSnBhQ29udGVudE5vZGUiPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJqcGFGaWxlIiBlVHlwZT0iIy8vSUpwYUZpbGUiCisgICAgICAgIGNoYW5nZWFibGU9ImZhbHNlIiBlT3Bwb3NpdGU9IiMvL0pwYUZpbGUvY29udGVudCIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJUGVyc2lzdGVudFR5cGUiIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiCisgICAgICBlU3VwZXJUeXBlcz0iIy8vSUpwYUNvbnRlbnROb2RlIj4KKyAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0TWFwcGluZyIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL0lUeXBlTWFwcGluZyIvPgorICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJwYXJlbnRQZXJzaXN0ZW50VHlwZSIgZVR5cGU9IiMvL0lQZXJzaXN0ZW50VHlwZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtYXBwaW5nS2V5IiBsb3dlckJvdW5kPSIxIgorICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklUeXBlTWFwcGluZyIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSIKKyAgICAgIGVTdXBlclR5cGVzPSIjLy9JSnBhU291cmNlT2JqZWN0Ij4KKyAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0UGVyc2lzdGVudFR5cGUiIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9JUGVyc2lzdGVudFR5cGUiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIKKyAgICAgICAgY2hhbmdlYWJsZT0iZmFsc2UiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRhYmxlTmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIKKyAgICAgICAgY2hhbmdlYWJsZT0iZmFsc2UiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik51bGxUeXBlTWFwcGluZyIgZVN1cGVyVHlwZXM9IiMvL0pwYUVPYmplY3QgIy8vSVR5cGVNYXBwaW5nICMvL0lKcGFTb3VyY2VPYmplY3QiLz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJUGVyc2lzdGVudEF0dHJpYnV0ZSIgYWJzdHJhY3Q9InRydWUiCisgICAgICBpbnRlcmZhY2U9InRydWUiIGVTdXBlclR5cGVzPSIjLy9JSnBhQ29udGVudE5vZGUiPgorICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJ0eXBlTWFwcGluZyIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL0lUeXBlTWFwcGluZyIvPgorICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXROYW1lIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIHBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRVN0cmluZyIvPgorICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJtYXBwaW5nS2V5IiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+CisgICAgPGVPcGVyYXRpb25zIG5hbWU9ImRlZmF1bHRNYXBwaW5nS2V5IiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1hcHBpbmciIGxvd2VyQm91bmQ9IjEiCisgICAgICAgIGVUeXBlPSIjLy9JQXR0cmlidXRlTWFwcGluZyIgY2hhbmdlYWJsZT0iZmFsc2UiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiCisgICAgICAgIGRlcml2ZWQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJQXR0cmlidXRlTWFwcGluZyIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSIKKyAgICAgIGVTdXBlclR5cGVzPSIjLy9JSnBhU291cmNlT2JqZWN0Ij4KKyAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL0lQZXJzaXN0ZW50QXR0cmlidXRlIi8+CisgICAgPGVPcGVyYXRpb25zIG5hbWU9ImlzRGVmYXVsdCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VCb29sZWFuIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iQWNjZXNzVHlwZSI+CisgICAgPGVMaXRlcmFscyBuYW1lPSJEZWZhdWx0IiBsaXRlcmFsPSJEZWZhdWx0Ii8+CisgICAgPGVMaXRlcmFscyBuYW1lPSJQUk9QRVJUWSIgdmFsdWU9IjEiIGxpdGVyYWw9IlByb3BlcnR5Ii8+CisgICAgPGVMaXRlcmFscyBuYW1lPSJGSUVMRCIgdmFsdWU9IjIiIGxpdGVyYWw9IkZpZWxkIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZVN1YnBhY2thZ2VzIG5hbWU9Im1hcHBpbmdzIiBuc1VSST0ianB0LmNvcmUubWFwcGluZ3MueG1pIiBuc1ByZWZpeD0ianB0LmNvcmUubWFwcGluZ3MiPgorICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSU1hcHBlZFN1cGVyY2xhc3MiIGFic3RyYWN0PSJ0cnVlIgorICAgICAgICBpbnRlcmZhY2U9InRydWUiIGVTdXBlclR5cGVzPSIjLy9JVHlwZU1hcHBpbmciPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlkQ2xhc3MiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgcGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FU3RyaW5nIi8+CisgICAgPC9lQ2xhc3NpZmllcnM+CisgICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJRW50aXR5IiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIgorICAgICAgICBlU3VwZXJUeXBlcz0iIy8vSVR5cGVNYXBwaW5nIj4KKyAgICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJkaXNjcmltaW5hdG9yVmFsdWVJc0FsbG93ZWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+CisgICAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0U2Vjb25kYXJ5VGFibGVzIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL21hcHBpbmdzL0lTZWNvbmRhcnlUYWJsZSIvPgorICAgICAgPGVPcGVyYXRpb25zIG5hbWU9InBhcmVudEVudGl0eSIgZVR5cGU9IiMvL21hcHBpbmdzL0lFbnRpdHkiLz4KKyAgICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJyb290RW50aXR5IiBlVHlwZT0iIy8vbWFwcGluZ3MvSUVudGl0eSIvPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNwZWNpZmllZE5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KKyAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZWZhdWx0TmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIKKyAgICAgICAgICBjaGFuZ2VhYmxlPSJmYWxzZSIvPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRhYmxlIiBsb3dlckJvdW5kPSIxIgorICAgICAgICAgIGVUeXBlPSIjLy9tYXBwaW5ncy9JVGFibGUiIGNoYW5nZWFibGU9ImZhbHNlIiBjb250YWlubWVudD0idHJ1ZSIvPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNwZWNpZmllZFNlY29uZGFyeVRhYmxlcyIKKyAgICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL21hcHBpbmdzL0lTZWNvbmRhcnlUYWJsZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByaW1hcnlLZXlKb2luQ29sdW1ucyIKKyAgICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL21hcHBpbmdzL0lQcmltYXJ5S2V5Sm9pbkNvbHVtbiIgY2hhbmdlYWJsZT0iZmFsc2UiCisgICAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucyIKKyAgICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL21hcHBpbmdzL0lQcmltYXJ5S2V5Sm9pbkNvbHVtbiIgY29udGFpbm1lbnQ9InRydWUiCisgICAgICAgICAgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucyIKKyAgICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL21hcHBpbmdzL0lQcmltYXJ5S2V5Sm9pbkNvbHVtbiIgY29udGFpbm1lbnQ9InRydWUiCisgICAgICAgICAgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaW5oZXJpdGFuY2VTdHJhdGVneSIKKyAgICAgICAgICBlVHlwZT0iIy8vbWFwcGluZ3MvSW5oZXJpdGFuY2VUeXBlIi8+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVmYXVsdERpc2NyaW1pbmF0b3JWYWx1ZSIKKyAgICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIHBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRVN0cmluZyIvPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSIKKyAgICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIHBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRVN0cmluZyIvPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRpc2NyaW1pbmF0b3JWYWx1ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VTdHJpbmciCisgICAgICAgICAgY2hhbmdlYWJsZT0iZmFsc2UiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiLz4KKyAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkaXNjcmltaW5hdG9yQ29sdW1uIgorICAgICAgICAgIGVUeXBlPSIjLy9tYXBwaW5ncy9JRGlzY3JpbWluYXRvckNvbHVtbiIgY2hhbmdlYWJsZT0iZmFsc2UiIGNvbnRhaW5tZW50PSJ0cnVlIi8+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2VxdWVuY2VHZW5lcmF0b3IiIGVUeXBlPSIjLy9tYXBwaW5ncy9JU2VxdWVuY2VHZW5lcmF0b3IiCisgICAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KKyAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0YWJsZUdlbmVyYXRvciIgZVR5cGU9IiMvL21hcHBpbmdzL0lUYWJsZUdlbmVyYXRvciIKKyAgICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImF0dHJpYnV0ZU92ZXJyaWRlcyIgdXBwZXJCb3VuZD0iLTEiCisgICAgICAgICAgZVR5cGU9IiMvL21hcHBpbmdzL0lBdHRyaWJ1dGVPdmVycmlkZSIgY2hhbmdlYWJsZT0iZmFsc2UiIHZvbGF0aWxlPSJ0cnVlIgorICAgICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyIKKyAgICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL21hcHBpbmdzL0lBdHRyaWJ1dGVPdmVycmlkZSIgY29udGFpbm1lbnQ9InRydWUiCisgICAgICAgICAgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlcyIKKyAgICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL21hcHBpbmdzL0lBdHRyaWJ1dGVPdmVycmlkZSIgY29udGFpbm1lbnQ9InRydWUiCisgICAgICAgICAgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYXNzb2NpYXRpb25PdmVycmlkZXMiCisgICAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9tYXBwaW5ncy9JQXNzb2NpYXRpb25PdmVycmlkZSIgY2hhbmdlYWJsZT0iZmFsc2UiCisgICAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzIgorICAgICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vbWFwcGluZ3MvSUFzc29jaWF0aW9uT3ZlcnJpZGUiIGNvbnRhaW5tZW50PSJ0cnVlIgorICAgICAgICAgIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlZmF1bHRBc3NvY2lhdGlvbk92ZXJyaWRlcyIKKyAgICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL21hcHBpbmdzL0lBc3NvY2lhdGlvbk92ZXJyaWRlIiBjb250YWlubWVudD0idHJ1ZSIKKyAgICAgICAgICByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KKyAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJuYW1lZFF1ZXJpZXMiIHVwcGVyQm91bmQ9Ii0xIgorICAgICAgICAgIGVUeXBlPSIjLy9tYXBwaW5ncy9JTmFtZWRRdWVyeSIgY29udGFpbm1lbnQ9InRydWUiLz4KKyAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJuYW1lZE5hdGl2ZVF1ZXJpZXMiIHVwcGVyQm91bmQ9Ii0xIgorICAgICAgICAgIGVUeXBlPSIjLy9tYXBwaW5ncy9JTmFtZWROYXRpdmVRdWVyeSIgY29udGFpbm1lbnQ9InRydWUiLz4KKyAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpZENsYXNzIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIHBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRVN0cmluZyIvPgorICAgIDwvZUNsYXNzaWZpZXJzPgorICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSUVtYmVkZGFibGUiIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiCisgICAgICAgIGVTdXBlclR5cGVzPSIjLy9JVHlwZU1hcHBpbmciLz4KKyAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklUYWJsZSIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSIKKyAgICAgICAgZVN1cGVyVHlwZXM9IiMvL0lKcGFTb3VyY2VPYmplY3QiPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciCisgICAgICAgICAgY2hhbmdlYWJsZT0iZmFsc2UiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIi8+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3BlY2lmaWVkTmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlZmF1bHROYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIgorICAgICAgICAgIGNoYW5nZWFibGU9ImZhbHNlIi8+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2F0YWxvZyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIKKyAgICAgICAgICBjaGFuZ2VhYmxlPSJmYWxzZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiLz4KKyAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzcGVjaWZpZWRDYXRhbG9nIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVmYXVsdENhdGFsb2ciIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciCisgICAgICAgICAgY2hhbmdlYWJsZT0iZmFsc2UiLz4KKyAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzY2hlbWEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciCisgICAgICAgICAgY2hhbmdlYWJsZT0iZmFsc2UiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIi8+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3BlY2lmaWVkU2NoZW1hIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVmYXVsdFNjaGVtYSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIKKyAgICAgICAgICBjaGFuZ2VhYmxlPSJmYWxzZSIvPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InVuaXF1ZUNvbnN0cmFpbnRzIiB1cHBlckJvdW5kPSItMSIKKyAgICAgICAgICBlVHlwZT0iIy8vbWFwcGluZ3MvSVVuaXF1ZUNvbnN0cmFpbnQiIGNvbnRhaW5tZW50PSJ0cnVlIi8+CisgICAgPC9lQ2xhc3NpZmllcnM+CisgICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJVW5pcXVlQ29uc3RyYWludCIgYWJzdHJhY3Q9InRydWUiCisgICAgICAgIGludGVyZmFjZT0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0lKcGFTb3VyY2VPYmplY3QiPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvbHVtbk5hbWVzIiB1bmlxdWU9ImZhbHNlIgorICAgICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIHBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRVN0cmluZyIvPgorICAgIDwvZUNsYXNzaWZpZXJzPgorICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSU5hbWVkQ29sdW1uIiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIgorICAgICAgICBlU3VwZXJUeXBlcz0iIy8vSUpwYVNvdXJjZU9iamVjdCI+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIKKyAgICAgICAgICBjaGFuZ2VhYmxlPSJmYWxzZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiLz4KKyAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzcGVjaWZpZWROYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVmYXVsdE5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciCisgICAgICAgICAgY2hhbmdlYWJsZT0iZmFsc2UiLz4KKyAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb2x1bW5EZWZpbml0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+CisgICAgPC9lQ2xhc3NpZmllcnM+CisgICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJQWJzdHJhY3RDb2x1bW4iIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiCisgICAgICAgIGVTdXBlclR5cGVzPSIjLy9tYXBwaW5ncy9JTmFtZWRDb2x1bW4iPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVuaXF1ZSIgZVR5cGU9IiMvL21hcHBpbmdzL0RlZmF1bHRGYWxzZUJvb2xlYW4iLz4KKyAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJudWxsYWJsZSIgZVR5cGU9IiMvL21hcHBpbmdzL0RlZmF1bHRUcnVlQm9vbGVhbiIvPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imluc2VydGFibGUiIGVUeXBlPSIjLy9tYXBwaW5ncy9EZWZhdWx0VHJ1ZUJvb2xlYW4iLz4KKyAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1cGRhdGFibGUiIGVUeXBlPSIjLy9tYXBwaW5ncy9EZWZhdWx0VHJ1ZUJvb2xlYW4iLz4KKyAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0YWJsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIKKyAgICAgICAgICBjaGFuZ2VhYmxlPSJmYWxzZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiLz4KKyAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzcGVjaWZpZWRUYWJsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlZmF1bHRUYWJsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIKKyAgICAgICAgICBjaGFuZ2VhYmxlPSJmYWxzZSIvPgorICAgIDwvZUNsYXNzaWZpZXJzPgorICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSUNvbHVtbiIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSIKKyAgICAgICAgZVN1cGVyVHlwZXM9IiMvL21hcHBpbmdzL0lBYnN0cmFjdENvbHVtbiI+CisgICAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0RGVmYXVsdExlbmd0aCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VJbnQiLz4KKyAgICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXREZWZhdWx0UHJlY2lzaW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIHBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRUludCIvPgorICAgICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldERlZmF1bHRTY2FsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VJbnQiLz4KKyAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsZW5ndGgiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VJbnQiCisgICAgICAgICAgY2hhbmdlYWJsZT0iZmFsc2UiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIi8+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3BlY2lmaWVkTGVuZ3RoIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIHBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRUludCIKKyAgICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSItMSIvPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByZWNpc2lvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUludCIKKyAgICAgICAgICBjaGFuZ2VhYmxlPSJmYWxzZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiLz4KKyAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzcGVjaWZpZWRQcmVjaXNpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgcGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FSW50IgorICAgICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9Ii0xIi8+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2NhbGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VJbnQiCisgICAgICAgICAgY2hhbmdlYWJsZT0iZmFsc2UiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIi8+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3BlY2lmaWVkU2NhbGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgcGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FSW50IgorICAgICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9Ii0xIi8+CisgICAgPC9lQ2xhc3NpZmllcnM+CisgICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJQ29sdW1uTWFwcGluZyIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSI+CisgICAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0Q29sdW1uIiBlVHlwZT0iIy8vbWFwcGluZ3MvSUNvbHVtbiIvPgorICAgIDwvZUNsYXNzaWZpZXJzPgorICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSUJhc2ljIiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIgorICAgICAgICBlU3VwZXJUeXBlcz0iIy8vSUF0dHJpYnV0ZU1hcHBpbmcgIy8vbWFwcGluZ3MvSUNvbHVtbk1hcHBpbmciPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZldGNoIiBlVHlwZT0iIy8vbWFwcGluZ3MvRGVmYXVsdEVhZ2VyRmV0Y2hUeXBlIi8+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3B0aW9uYWwiIGVUeXBlPSIjLy9tYXBwaW5ncy9EZWZhdWx0VHJ1ZUJvb2xlYW4iLz4KKyAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb2x1bW4iIGxvd2VyQm91bmQ9IjEiCisgICAgICAgICAgZVR5cGU9IiMvL21hcHBpbmdzL0lDb2x1bW4iIGNoYW5nZWFibGU9ImZhbHNlIiBjb250YWlubWVudD0idHJ1ZSIvPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxvYiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KKyAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0ZW1wb3JhbCIgZVR5cGU9IiMvL21hcHBpbmdzL1RlbXBvcmFsVHlwZSIvPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVudW1lcmF0ZWQiIGVUeXBlPSIjLy9tYXBwaW5ncy9FbnVtVHlwZSIvPgorICAgIDwvZUNsYXNzaWZpZXJzPgorICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSUlkIiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIgorICAgICAgICBlU3VwZXJUeXBlcz0iIy8vSUF0dHJpYnV0ZU1hcHBpbmcgIy8vbWFwcGluZ3MvSUNvbHVtbk1hcHBpbmciPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbHVtbiIgbG93ZXJCb3VuZD0iMSIKKyAgICAgICAgICBlVHlwZT0iIy8vbWFwcGluZ3MvSUNvbHVtbiIgY2hhbmdlYWJsZT0iZmFsc2UiIGNvbnRhaW5tZW50PSJ0cnVlIi8+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZ2VuZXJhdGVkVmFsdWUiIGVUeXBlPSIjLy9tYXBwaW5ncy9JR2VuZXJhdGVkVmFsdWUiCisgICAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KKyAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0ZW1wb3JhbCIgZVR5cGU9IiMvL21hcHBpbmdzL1RlbXBvcmFsVHlwZSIvPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRhYmxlR2VuZXJhdG9yIiBlVHlwZT0iIy8vbWFwcGluZ3MvSVRhYmxlR2VuZXJhdG9yIgorICAgICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2VxdWVuY2VHZW5lcmF0b3IiIGVUeXBlPSIjLy9tYXBwaW5ncy9JU2VxdWVuY2VHZW5lcmF0b3IiCisgICAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KKyAgICA8L2VDbGFzc2lmaWVycz4KKyAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklUcmFuc2llbnQiIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiCisgICAgICAgIGVTdXBlclR5cGVzPSIjLy9JQXR0cmlidXRlTWFwcGluZyIvPgorICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSVZlcnNpb24iIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiCisgICAgICAgIGVTdXBlclR5cGVzPSIjLy9JQXR0cmlidXRlTWFwcGluZyAjLy9tYXBwaW5ncy9JQ29sdW1uTWFwcGluZyI+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29sdW1uIiBsb3dlckJvdW5kPSIxIgorICAgICAgICAgIGVUeXBlPSIjLy9tYXBwaW5ncy9JQ29sdW1uIiBjaGFuZ2VhYmxlPSJmYWxzZSIgY29udGFpbm1lbnQ9InRydWUiLz4KKyAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0ZW1wb3JhbCIgZVR5cGU9IiMvL21hcHBpbmdzL1RlbXBvcmFsVHlwZSIvPgorICAgIDwvZUNsYXNzaWZpZXJzPgorICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSUVtYmVkZGVkSWQiIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiCisgICAgICAgIGVTdXBlclR5cGVzPSIjLy9JQXR0cmlidXRlTWFwcGluZyIvPgorICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSUVtYmVkZGVkIiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIgorICAgICAgICBlU3VwZXJUeXBlcz0iIy8vSUF0dHJpYnV0ZU1hcHBpbmciPgorICAgICAgPGVPcGVyYXRpb25zIG5hbWU9ImVtYmVkZGFibGUiIGVUeXBlPSIjLy9tYXBwaW5ncy9JRW1iZWRkYWJsZSIvPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImF0dHJpYnV0ZU92ZXJyaWRlcyIgdXBwZXJCb3VuZD0iLTEiCisgICAgICAgICAgZVR5cGU9IiMvL21hcHBpbmdzL0lBdHRyaWJ1dGVPdmVycmlkZSIgY2hhbmdlYWJsZT0iZmFsc2UiIHZvbGF0aWxlPSJ0cnVlIgorICAgICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyIKKyAgICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL21hcHBpbmdzL0lBdHRyaWJ1dGVPdmVycmlkZSIgY29udGFpbm1lbnQ9InRydWUiCisgICAgICAgICAgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlcyIKKyAgICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL21hcHBpbmdzL0lBdHRyaWJ1dGVPdmVycmlkZSIgY29udGFpbm1lbnQ9InRydWUiCisgICAgICAgICAgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+CisgICAgPC9lQ2xhc3NpZmllcnM+CisgICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJUmVsYXRpb25zaGlwTWFwcGluZyIgYWJzdHJhY3Q9InRydWUiCisgICAgICAgIGludGVyZmFjZT0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0lBdHRyaWJ1dGVNYXBwaW5nIj4KKyAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0YXJnZXRFbnRpdHkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciCisgICAgICAgICAgY2hhbmdlYWJsZT0iZmFsc2UiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIi8+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3BlY2lmaWVkVGFyZ2V0RW50aXR5IgorICAgICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KKyAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZWZhdWx0VGFyZ2V0RW50aXR5IgorICAgICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciCisgICAgICAgICAgY2hhbmdlYWJsZT0iZmFsc2UiLz4KKyAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZXNvbHZlZFRhcmdldEVudGl0eSIKKyAgICAgICAgICBlVHlwZT0iIy8vbWFwcGluZ3MvSUVudGl0eSIvPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNhc2NhZGUiIGVUeXBlPSIjLy9tYXBwaW5ncy9JQ2FzY2FkZSIKKyAgICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgorICAgIDwvZUNsYXNzaWZpZXJzPgorICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSU5vbk93bmluZ01hcHBpbmciIGFic3RyYWN0PSJ0cnVlIgorICAgICAgICBpbnRlcmZhY2U9InRydWUiIGVTdXBlclR5cGVzPSIjLy9tYXBwaW5ncy9JUmVsYXRpb25zaGlwTWFwcGluZyI+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWFwcGVkQnkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgcGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FU3RyaW5nIi8+CisgICAgPC9lQ2xhc3NpZmllcnM+CisgICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nIiBhYnN0cmFjdD0idHJ1ZSIKKyAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vbWFwcGluZ3MvSU5vbk93bmluZ01hcHBpbmciPgorICAgICAgPGVPcGVyYXRpb25zIG5hbWU9ImlzTm9PcmRlcmluZyIgb3JkZXJlZD0iZmFsc2UiIHVuaXF1ZT0iZmFsc2UiIGxvd2VyQm91bmQ9IjEiCisgICAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KKyAgICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJzZXROb09yZGVyaW5nIiBvcmRlcmVkPSJmYWxzZSIgdW5pcXVlPSJmYWxzZSIvPgorICAgICAgPGVPcGVyYXRpb25zIG5hbWU9ImlzT3JkZXJCeVBrIiBvcmRlcmVkPSJmYWxzZSIgdW5pcXVlPSJmYWxzZSIgbG93ZXJCb3VuZD0iMSIKKyAgICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIHBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRUJvb2xlYW4iLz4KKyAgICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJzZXRPcmRlckJ5UGsiIG9yZGVyZWQ9ImZhbHNlIiB1bmlxdWU9ImZhbHNlIi8+CisgICAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iaXNDdXN0b21PcmRlcmluZyIgb3JkZXJlZD0iZmFsc2UiIHVuaXF1ZT0iZmFsc2UiIGxvd2VyQm91bmQ9IjEiCisgICAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VCb29sZWFuIi8+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3JkZXJCeSIgb3JkZXJlZD0iZmFsc2UiCisgICAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VTdHJpbmciLz4KKyAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmZXRjaCIgZVR5cGU9IiMvL21hcHBpbmdzL0RlZmF1bHRMYXp5RmV0Y2hUeXBlIi8+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iam9pblRhYmxlIiBsb3dlckJvdW5kPSIxIgorICAgICAgICAgIGVUeXBlPSIjLy9tYXBwaW5ncy9JSm9pblRhYmxlIiBjaGFuZ2VhYmxlPSJmYWxzZSIgY29udGFpbm1lbnQ9InRydWUiLz4KKyAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtYXBLZXkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgcGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FU3RyaW5nIi8+CisgICAgPC9lQ2xhc3NpZmllcnM+CisgICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJT25lVG9NYW55IiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIgorICAgICAgICBlU3VwZXJUeXBlcz0iIy8vbWFwcGluZ3MvSU11bHRpUmVsYXRpb25zaGlwTWFwcGluZyIvPgorICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSU1hbnlUb01hbnkiIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiCisgICAgICAgIGVTdXBlclR5cGVzPSIjLy9tYXBwaW5ncy9JTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nIi8+CisgICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZyIgYWJzdHJhY3Q9InRydWUiCisgICAgICAgIGludGVyZmFjZT0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL21hcHBpbmdzL0lSZWxhdGlvbnNoaXBNYXBwaW5nIj4KKyAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmZXRjaCIgZVR5cGU9IiMvL21hcHBpbmdzL0RlZmF1bHRFYWdlckZldGNoVHlwZSIvPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImpvaW5Db2x1bW5zIiB1cHBlckJvdW5kPSItMSIKKyAgICAgICAgICBlVHlwZT0iIy8vbWFwcGluZ3MvSUpvaW5Db2x1bW4iIGNoYW5nZWFibGU9ImZhbHNlIiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIgorICAgICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3BlY2lmaWVkSm9pbkNvbHVtbnMiCisgICAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9tYXBwaW5ncy9JSm9pbkNvbHVtbiIgY29udGFpbm1lbnQ9InRydWUiLz4KKyAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZWZhdWx0Sm9pbkNvbHVtbnMiIHVwcGVyQm91bmQ9Ii0xIgorICAgICAgICAgIGVUeXBlPSIjLy9tYXBwaW5ncy9JSm9pbkNvbHVtbiIgY29udGFpbm1lbnQ9InRydWUiLz4KKyAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvcHRpb25hbCIgZVR5cGU9IiMvL21hcHBpbmdzL0RlZmF1bHRUcnVlQm9vbGVhbiIvPgorICAgIDwvZUNsYXNzaWZpZXJzPgorICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSU1hbnlUb09uZSIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSIKKyAgICAgICAgZVN1cGVyVHlwZXM9IiMvL21hcHBpbmdzL0lTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nIi8+CisgICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJT25lVG9PbmUiIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiCisgICAgICAgIGVTdXBlclR5cGVzPSIjLy9tYXBwaW5ncy9JU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZyAjLy9tYXBwaW5ncy9JTm9uT3duaW5nTWFwcGluZyIvPgorICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJEZWZhdWx0RWFnZXJGZXRjaFR5cGUiPgorICAgICAgPGVMaXRlcmFscyBuYW1lPSJEZWZhdWx0IiBsaXRlcmFsPSJEZWZhdWx0IChFYWdlcikiLz4KKyAgICAgIDxlTGl0ZXJhbHMgbmFtZT0iRUFHRVIiIHZhbHVlPSIxIiBsaXRlcmFsPSJFYWdlciIvPgorICAgICAgPGVMaXRlcmFscyBuYW1lPSJMQVpZIiB2YWx1ZT0iMiIgbGl0ZXJhbD0iTGF6eSIvPgorICAgIDwvZUNsYXNzaWZpZXJzPgorICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJEZWZhdWx0TGF6eUZldGNoVHlwZSI+CisgICAgICA8ZUxpdGVyYWxzIG5hbWU9IkRlZmF1bHQiIGxpdGVyYWw9IkRlZmF1bHQgKExhenkpIi8+CisgICAgICA8ZUxpdGVyYWxzIG5hbWU9IkxBWlkiIHZhbHVlPSIxIiBsaXRlcmFsPSJMYXp5Ii8+CisgICAgICA8ZUxpdGVyYWxzIG5hbWU9IkVBR0VSIiB2YWx1ZT0iMiIgbGl0ZXJhbD0iRWFnZXIiLz4KKyAgICA8L2VDbGFzc2lmaWVycz4KKyAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iRGVmYXVsdEZhbHNlQm9vbGVhbiI+CisgICAgICA8ZUxpdGVyYWxzIG5hbWU9IkRlZmF1bHQiIGxpdGVyYWw9IkRlZmF1bHQgKEZhbHNlKSIvPgorICAgICAgPGVMaXRlcmFscyBuYW1lPSJmYWxzZSIgdmFsdWU9IjEiIGxpdGVyYWw9IkZhbHNlIi8+CisgICAgICA8ZUxpdGVyYWxzIG5hbWU9InRydWUiIHZhbHVlPSIyIiBsaXRlcmFsPSJUcnVlIi8+CisgICAgPC9lQ2xhc3NpZmllcnM+CisgICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IkRlZmF1bHRUcnVlQm9vbGVhbiI+CisgICAgICA8ZUxpdGVyYWxzIG5hbWU9IkRlZmF1bHQiIGxpdGVyYWw9IkRlZmF1bHQgKFRydWUpIi8+CisgICAgICA8ZUxpdGVyYWxzIG5hbWU9InRydWUiIHZhbHVlPSIxIiBsaXRlcmFsPSJUcnVlIi8+CisgICAgICA8ZUxpdGVyYWxzIG5hbWU9ImZhbHNlIiB2YWx1ZT0iMiIgbGl0ZXJhbD0iRmFsc2UiLz4KKyAgICA8L2VDbGFzc2lmaWVycz4KKyAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iVGVtcG9yYWxUeXBlIj4KKyAgICAgIDxlTGl0ZXJhbHMgbmFtZT0iTnVsbCIgbGl0ZXJhbD0iIi8+CisgICAgICA8ZUxpdGVyYWxzIG5hbWU9IkRBVEUiIHZhbHVlPSIxIiBsaXRlcmFsPSJEYXRlIi8+CisgICAgICA8ZUxpdGVyYWxzIG5hbWU9IlRJTUUiIHZhbHVlPSIyIiBsaXRlcmFsPSJUaW1lIi8+CisgICAgICA8ZUxpdGVyYWxzIG5hbWU9IlRJTUVTVEFNUCIgdmFsdWU9IjMiIGxpdGVyYWw9IlRpbWVzdGFtcCIvPgorICAgIDwvZUNsYXNzaWZpZXJzPgorICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSUpvaW5UYWJsZSIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSIKKyAgICAgICAgZVN1cGVyVHlwZXM9IiMvL21hcHBpbmdzL0lUYWJsZSI+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iam9pbkNvbHVtbnMiIHVwcGVyQm91bmQ9Ii0xIgorICAgICAgICAgIGVUeXBlPSIjLy9tYXBwaW5ncy9JSm9pbkNvbHVtbiIgY2hhbmdlYWJsZT0iZmFsc2UiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiCisgICAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KKyAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzcGVjaWZpZWRKb2luQ29sdW1ucyIKKyAgICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL21hcHBpbmdzL0lKb2luQ29sdW1uIiBjb250YWlubWVudD0idHJ1ZSIvPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlZmF1bHRKb2luQ29sdW1ucyIgdXBwZXJCb3VuZD0iLTEiCisgICAgICAgICAgZVR5cGU9IiMvL21hcHBpbmdzL0lKb2luQ29sdW1uIiBjb250YWlubWVudD0idHJ1ZSIvPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImludmVyc2VKb2luQ29sdW1ucyIgdXBwZXJCb3VuZD0iLTEiCisgICAgICAgICAgZVR5cGU9IiMvL21hcHBpbmdzL0lKb2luQ29sdW1uIiBjaGFuZ2VhYmxlPSJmYWxzZSIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIKKyAgICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucyIKKyAgICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL21hcHBpbmdzL0lKb2luQ29sdW1uIiBjb250YWlubWVudD0idHJ1ZSIvPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbnMiCisgICAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9tYXBwaW5ncy9JSm9pbkNvbHVtbiIgY29udGFpbm1lbnQ9InRydWUiLz4KKyAgICA8L2VDbGFzc2lmaWVycz4KKyAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklBYnN0cmFjdEpvaW5Db2x1bW4iIGFic3RyYWN0PSJ0cnVlIgorICAgICAgICBpbnRlcmZhY2U9InRydWUiIGVTdXBlclR5cGVzPSIjLy9tYXBwaW5ncy9JTmFtZWRDb2x1bW4iPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlZmVyZW5jZWRDb2x1bW5OYW1lIgorICAgICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciCisgICAgICAgICAgY2hhbmdlYWJsZT0iZmFsc2UiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIi8+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUiCisgICAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSIKKyAgICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIgorICAgICAgICAgIGNoYW5nZWFibGU9ImZhbHNlIi8+CisgICAgPC9lQ2xhc3NpZmllcnM+CisgICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJSm9pbkNvbHVtbiIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSIKKyAgICAgICAgZVN1cGVyVHlwZXM9IiMvL21hcHBpbmdzL0lBYnN0cmFjdENvbHVtbiAjLy9tYXBwaW5ncy9JQWJzdHJhY3RKb2luQ29sdW1uIi8+CisgICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJT3ZlcnJpZGUiIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiCisgICAgICAgIGVTdXBlclR5cGVzPSIjLy9JSnBhU291cmNlT2JqZWN0Ij4KKyAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIHBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRVN0cmluZyIvPgorICAgIDwvZUNsYXNzaWZpZXJzPgorICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSUF0dHJpYnV0ZU92ZXJyaWRlIiBhYnN0cmFjdD0idHJ1ZSIKKyAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vbWFwcGluZ3MvSU92ZXJyaWRlICMvL21hcHBpbmdzL0lDb2x1bW5NYXBwaW5nIj4KKyAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb2x1bW4iIGxvd2VyQm91bmQ9IjEiCisgICAgICAgICAgZVR5cGU9IiMvL21hcHBpbmdzL0lDb2x1bW4iIGNoYW5nZWFibGU9ImZhbHNlIiBjb250YWlubWVudD0idHJ1ZSIvPgorICAgIDwvZUNsYXNzaWZpZXJzPgorICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSUFzc29jaWF0aW9uT3ZlcnJpZGUiIGFic3RyYWN0PSJ0cnVlIgorICAgICAgICBpbnRlcmZhY2U9InRydWUiIGVTdXBlclR5cGVzPSIjLy9tYXBwaW5ncy9JT3ZlcnJpZGUiPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImpvaW5Db2x1bW5zIiB1cHBlckJvdW5kPSItMSIKKyAgICAgICAgICBlVHlwZT0iIy8vbWFwcGluZ3MvSUpvaW5Db2x1bW4iIGNoYW5nZWFibGU9ImZhbHNlIiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIgorICAgICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3BlY2lmaWVkSm9pbkNvbHVtbnMiCisgICAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9tYXBwaW5ncy9JSm9pbkNvbHVtbiIgY29udGFpbm1lbnQ9InRydWUiLz4KKyAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZWZhdWx0Sm9pbkNvbHVtbnMiIHVwcGVyQm91bmQ9Ii0xIgorICAgICAgICAgIGVUeXBlPSIjLy9tYXBwaW5ncy9JSm9pbkNvbHVtbiIgY29udGFpbm1lbnQ9InRydWUiLz4KKyAgICA8L2VDbGFzc2lmaWVycz4KKyAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklEaXNjcmltaW5hdG9yQ29sdW1uIiBhYnN0cmFjdD0idHJ1ZSIKKyAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vbWFwcGluZ3MvSU5hbWVkQ29sdW1uIj4KKyAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkaXNjcmltaW5hdG9yVHlwZSIgZVR5cGU9IiMvL21hcHBpbmdzL0Rpc2NyaW1pbmF0b3JUeXBlIi8+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVmYXVsdExlbmd0aCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VJbnQiCisgICAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iMzEiLz4KKyAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzcGVjaWZpZWRMZW5ndGgiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgcGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FSW50IgorICAgICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9Ii0xIi8+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGVuZ3RoIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIHBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRUludCIKKyAgICAgICAgICBjaGFuZ2VhYmxlPSJmYWxzZSIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIvPgorICAgIDwvZUNsYXNzaWZpZXJzPgorICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJJbmhlcml0YW5jZVR5cGUiPgorICAgICAgPGVMaXRlcmFscyBuYW1lPSJEZWZhdWx0IiBsaXRlcmFsPSJEZWZhdWx0IChTaW5nbGUgVGFibGUpIi8+CisgICAgICA8ZUxpdGVyYWxzIG5hbWU9IlNJTkdMRV9UQUJMRSIgdmFsdWU9IjEiIGxpdGVyYWw9IlNpbmdsZSBUYWJsZSIvPgorICAgICAgPGVMaXRlcmFscyBuYW1lPSJKT0lORUQiIHZhbHVlPSIyIiBsaXRlcmFsPSJKb2luZWQiLz4KKyAgICAgIDxlTGl0ZXJhbHMgbmFtZT0iVEFCTEVfUEVSX0NMQVNTIiB2YWx1ZT0iMyIgbGl0ZXJhbD0iVGFibGUgcGVyIENsYXNzIi8+CisgICAgPC9lQ2xhc3NpZmllcnM+CisgICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IkRpc2NyaW1pbmF0b3JUeXBlIj4KKyAgICAgIDxlTGl0ZXJhbHMgbmFtZT0iRGVmYXVsdCIgbGl0ZXJhbD0iRGVmYXVsdCAoU3RyaW5nKSIvPgorICAgICAgPGVMaXRlcmFscyBuYW1lPSJTVFJJTkciIHZhbHVlPSIxIiBsaXRlcmFsPSJTdHJpbmciLz4KKyAgICAgIDxlTGl0ZXJhbHMgbmFtZT0iQ0hBUiIgdmFsdWU9IjIiIGxpdGVyYWw9IkNoYXIiLz4KKyAgICAgIDxlTGl0ZXJhbHMgbmFtZT0iSU5URUdFUiIgdmFsdWU9IjMiIGxpdGVyYWw9IkludGVnZXIiLz4KKyAgICA8L2VDbGFzc2lmaWVycz4KKyAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklTZWNvbmRhcnlUYWJsZSIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSIKKyAgICAgICAgZVN1cGVyVHlwZXM9IiMvL21hcHBpbmdzL0lUYWJsZSI+CisgICAgICA8ZU9wZXJhdGlvbnMgbmFtZT0idHlwZU1hcHBpbmciIGVUeXBlPSIjLy9JVHlwZU1hcHBpbmciLz4KKyAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmltYXJ5S2V5Sm9pbkNvbHVtbnMiCisgICAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9tYXBwaW5ncy9JUHJpbWFyeUtleUpvaW5Db2x1bW4iIGNoYW5nZWFibGU9ImZhbHNlIgorICAgICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KKyAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMiCisgICAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9tYXBwaW5ncy9JUHJpbWFyeUtleUpvaW5Db2x1bW4iIGNvbnRhaW5tZW50PSJ0cnVlIgorICAgICAgICAgIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMiCisgICAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9tYXBwaW5ncy9JUHJpbWFyeUtleUpvaW5Db2x1bW4iIGNvbnRhaW5tZW50PSJ0cnVlIgorICAgICAgICAgIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICAgIDwvZUNsYXNzaWZpZXJzPgorICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSVByaW1hcnlLZXlKb2luQ29sdW1uIiBhYnN0cmFjdD0idHJ1ZSIKKyAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vbWFwcGluZ3MvSUFic3RyYWN0Sm9pbkNvbHVtbiIvPgorICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSUdlbmVyYXRvciIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSIKKyAgICAgICAgZVN1cGVyVHlwZXM9IiMvL0lKcGFTb3VyY2VPYmplY3QiPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KKyAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpbml0aWFsVmFsdWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgcGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FSW50IgorICAgICAgICAgIGNoYW5nZWFibGU9ImZhbHNlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIvPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNwZWNpZmllZEluaXRpYWxWYWx1ZSIKKyAgICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIHBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRUludCIKKyAgICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSItMSIvPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlZmF1bHRJbml0aWFsVmFsdWUiCisgICAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VJbnQiCisgICAgICAgICAgY2hhbmdlYWJsZT0iZmFsc2UiLz4KKyAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhbGxvY2F0aW9uU2l6ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VJbnQiCisgICAgICAgICAgY2hhbmdlYWJsZT0iZmFsc2UiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIi8+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3BlY2lmaWVkQWxsb2NhdGlvblNpemUiCisgICAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VJbnQiCisgICAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iLTEiLz4KKyAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZWZhdWx0QWxsb2NhdGlvblNpemUiCisgICAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VJbnQiCisgICAgICAgICAgY2hhbmdlYWJsZT0iZmFsc2UiLz4KKyAgICA8L2VDbGFzc2lmaWVycz4KKyAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklUYWJsZUdlbmVyYXRvciIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSIKKyAgICAgICAgZVN1cGVyVHlwZXM9IiMvL21hcHBpbmdzL0lHZW5lcmF0b3IiPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRhYmxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIgorICAgICAgICAgIGNoYW5nZWFibGU9ImZhbHNlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIvPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNwZWNpZmllZFRhYmxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVmYXVsdFRhYmxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIgorICAgICAgICAgIGNoYW5nZWFibGU9ImZhbHNlIi8+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2F0YWxvZyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIKKyAgICAgICAgICBjaGFuZ2VhYmxlPSJmYWxzZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiLz4KKyAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzcGVjaWZpZWRDYXRhbG9nIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVmYXVsdENhdGFsb2ciIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciCisgICAgICAgICAgY2hhbmdlYWJsZT0iZmFsc2UiLz4KKyAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzY2hlbWEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciCisgICAgICAgICAgY2hhbmdlYWJsZT0iZmFsc2UiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIi8+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3BlY2lmaWVkU2NoZW1hIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVmYXVsdFNjaGVtYSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIKKyAgICAgICAgICBjaGFuZ2VhYmxlPSJmYWxzZSIvPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBrQ29sdW1uTmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIKKyAgICAgICAgICBjaGFuZ2VhYmxlPSJmYWxzZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiLz4KKyAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzcGVjaWZpZWRQa0NvbHVtbk5hbWUiCisgICAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlZmF1bHRQa0NvbHVtbk5hbWUiCisgICAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIKKyAgICAgICAgICBjaGFuZ2VhYmxlPSJmYWxzZSIvPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlQ29sdW1uTmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIKKyAgICAgICAgICBjaGFuZ2VhYmxlPSJmYWxzZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiLz4KKyAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWUiCisgICAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlZmF1bHRWYWx1ZUNvbHVtbk5hbWUiCisgICAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIKKyAgICAgICAgICBjaGFuZ2VhYmxlPSJmYWxzZSIvPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBrQ29sdW1uVmFsdWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciCisgICAgICAgICAgY2hhbmdlYWJsZT0iZmFsc2UiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIi8+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3BlY2lmaWVkUGtDb2x1bW5WYWx1ZSIKKyAgICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVmYXVsdFBrQ29sdW1uVmFsdWUiCisgICAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIKKyAgICAgICAgICBjaGFuZ2VhYmxlPSJmYWxzZSIvPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InVuaXF1ZUNvbnN0cmFpbnRzIiB1cHBlckJvdW5kPSItMSIKKyAgICAgICAgICBlVHlwZT0iIy8vbWFwcGluZ3MvSVVuaXF1ZUNvbnN0cmFpbnQiIGNvbnRhaW5tZW50PSJ0cnVlIi8+CisgICAgPC9lQ2xhc3NpZmllcnM+CisgICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJU2VxdWVuY2VHZW5lcmF0b3IiIGFic3RyYWN0PSJ0cnVlIgorICAgICAgICBpbnRlcmZhY2U9InRydWUiIGVTdXBlclR5cGVzPSIjLy9tYXBwaW5ncy9JR2VuZXJhdG9yIj4KKyAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzZXF1ZW5jZU5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciCisgICAgICAgICAgY2hhbmdlYWJsZT0iZmFsc2UiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIi8+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3BlY2lmaWVkU2VxdWVuY2VOYW1lIgorICAgICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KKyAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZWZhdWx0U2VxdWVuY2VOYW1lIgorICAgICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciCisgICAgICAgICAgY2hhbmdlYWJsZT0iZmFsc2UiLz4KKyAgICA8L2VDbGFzc2lmaWVycz4KKyAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklHZW5lcmF0ZWRWYWx1ZSIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSIKKyAgICAgICAgZVN1cGVyVHlwZXM9IiMvL0lKcGFTb3VyY2VPYmplY3QiPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0cmF0ZWd5IiBlVHlwZT0iIy8vbWFwcGluZ3MvR2VuZXJhdGlvblR5cGUiLz4KKyAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJnZW5lcmF0b3IiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgcGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FU3RyaW5nIi8+CisgICAgPC9lQ2xhc3NpZmllcnM+CisgICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IkdlbmVyYXRpb25UeXBlIj4KKyAgICAgIDxlTGl0ZXJhbHMgbmFtZT0iRGVmYXVsdCIgbGl0ZXJhbD0iRGVmYXVsdCAoQXV0bykiLz4KKyAgICAgIDxlTGl0ZXJhbHMgbmFtZT0iQVVUTyIgdmFsdWU9IjEiIGxpdGVyYWw9IkF1dG8iLz4KKyAgICAgIDxlTGl0ZXJhbHMgbmFtZT0iSURFTlRJVFkiIHZhbHVlPSIyIiBsaXRlcmFsPSJJZGVudGl0eSIvPgorICAgICAgPGVMaXRlcmFscyBuYW1lPSJTRVFVRU5DRSIgdmFsdWU9IjMiIGxpdGVyYWw9IlNlcXVlbmNlIi8+CisgICAgICA8ZUxpdGVyYWxzIG5hbWU9IlRBQkxFIiB2YWx1ZT0iNCIgbGl0ZXJhbD0iVGFibGUiLz4KKyAgICA8L2VDbGFzc2lmaWVycz4KKyAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iRW51bVR5cGUiPgorICAgICAgPGVMaXRlcmFscyBuYW1lPSJEZWZhdWx0IiBsaXRlcmFsPSJEZWZhdWx0IChPcmRpbmFsKSIvPgorICAgICAgPGVMaXRlcmFscyBuYW1lPSJPUkRJTkFMIiB2YWx1ZT0iMSIgbGl0ZXJhbD0iT3JkaW5hbCIvPgorICAgICAgPGVMaXRlcmFscyBuYW1lPSJTVFJJTkciIHZhbHVlPSIyIiBsaXRlcmFsPSJTdHJpbmciLz4KKyAgICA8L2VDbGFzc2lmaWVycz4KKyAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklRdWVyeSIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSIKKyAgICAgICAgZVN1cGVyVHlwZXM9IiMvL0lKcGFTb3VyY2VPYmplY3QiPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgcGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FU3RyaW5nIi8+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icXVlcnkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgcGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FU3RyaW5nIi8+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaGludHMiIHVwcGVyQm91bmQ9Ii0xIgorICAgICAgICAgIGVUeXBlPSIjLy9tYXBwaW5ncy9JUXVlcnlIaW50IiBjb250YWlubWVudD0idHJ1ZSIvPgorICAgIDwvZUNsYXNzaWZpZXJzPgorICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSU5hbWVkUXVlcnkiIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiCisgICAgICAgIGVTdXBlclR5cGVzPSIjLy9JSnBhU291cmNlT2JqZWN0ICMvL21hcHBpbmdzL0lRdWVyeSIvPgorICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSU5hbWVkTmF0aXZlUXVlcnkiIGFic3RyYWN0PSJ0cnVlIgorICAgICAgICBpbnRlcmZhY2U9InRydWUiIGVTdXBlclR5cGVzPSIjLy9JSnBhU291cmNlT2JqZWN0ICMvL21hcHBpbmdzL0lRdWVyeSI+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVzdWx0Q2xhc3MiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgcGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FU3RyaW5nIi8+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVzdWx0U2V0TWFwcGluZyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VTdHJpbmciLz4KKyAgICA8L2VDbGFzc2lmaWVycz4KKyAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklRdWVyeUhpbnQiIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiCisgICAgICAgIGVTdXBlclR5cGVzPSIjLy9JSnBhU291cmNlT2JqZWN0Ij4KKyAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIHBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRVN0cmluZyIvPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIHBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRVN0cmluZyIvPgorICAgIDwvZUNsYXNzaWZpZXJzPgorICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJDYXNjYWRlVHlwZSI+CisgICAgICA8ZUxpdGVyYWxzIG5hbWU9IkFMTCIgbGl0ZXJhbD0iQWxsIi8+CisgICAgICA8ZUxpdGVyYWxzIG5hbWU9IlBFUlNJU1QiIHZhbHVlPSIxIiBsaXRlcmFsPSJQZXJzaXN0Ii8+CisgICAgICA8ZUxpdGVyYWxzIG5hbWU9Ik1FUkdFIiB2YWx1ZT0iMiIgbGl0ZXJhbD0iTWVyZ2UiLz4KKyAgICAgIDxlTGl0ZXJhbHMgbmFtZT0iUkVNT1ZFIiB2YWx1ZT0iMyIgbGl0ZXJhbD0iUmVtb3ZlIi8+CisgICAgICA8ZUxpdGVyYWxzIG5hbWU9IlJFRlJFU0giIHZhbHVlPSI0IiBsaXRlcmFsPSJSZWZyZXNoIi8+CisgICAgPC9lQ2xhc3NpZmllcnM+CisgICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJQ2FzY2FkZSIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSIKKyAgICAgICAgZVN1cGVyVHlwZXM9IiMvL0lKcGFTb3VyY2VPYmplY3QiPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFsbCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VCb29sZWFuIi8+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGVyc2lzdCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VCb29sZWFuIi8+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWVyZ2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgcGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FQm9vbGVhbiIvPgorICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlbW92ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VCb29sZWFuIi8+CisgICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVmcmVzaCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VCb29sZWFuIi8+CisgICAgPC9lQ2xhc3NpZmllcnM+CisgIDwvZVN1YnBhY2thZ2VzPgorPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL21vZGVsL29sZF9jb3JlTW9kZWxzLmdlbm1vZGVsIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvbW9kZWwvb2xkX2NvcmVNb2RlbHMuZ2VubW9kZWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJmMzgyOAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL21vZGVsL29sZF9jb3JlTW9kZWxzLmdlbm1vZGVsCkBAIC0wLDAgKzEsNzEwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGdlbm1vZGVsOkdlbk1vZGVsIHhtaTp2ZXJzaW9uPSIyLjAiCisgICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIKKyAgICB4bWxuczpnZW5tb2RlbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCIgbW9kZWxEaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMiCisgICAgY3JlYXRpb25Db21tYW5kcz0iZmFsc2UiIGNyZWF0aW9uSWNvbnM9ImZhbHNlIiBlZGl0RGlyZWN0b3J5PSIiIGVkaXRvckRpcmVjdG9yeT0iIgorICAgIG1vZGVsUGx1Z2luSUQ9Im9yZy5lY2xpcHNlLmpwdC5jb3JlIiBtb2RlbE5hbWU9IkNvcmUiIGVkaXRQbHVnaW5DbGFzcz0iIiBlZGl0b3JQbHVnaW5DbGFzcz0iIgorICAgIHN1cHByZXNzSW50ZXJmYWNlcz0idHJ1ZSIgY29kZUZvcm1hdHRpbmc9InRydWUiIHRlc3RzRGlyZWN0b3J5PSIiIHRlc3RTdWl0ZUNsYXNzPSIiCisgICAgaW1wb3J0ZXJJRD0ib3JnLmVjbGlwc2UuZW1mLmltcG9ydGVyLmVjb3JlIiBjb21wbGlhbmNlTGV2ZWw9IjUuMCIgY29weXJpZ2h0RmllbGRzPSJmYWxzZSIKKyAgICB1c2VkR2VuUGFja2FnZXM9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmdlbm1vZGVsIy8vZWNvcmUiPgorICA8Zm9yZWlnbk1vZGVsPm9sZF9jb3JlLmVjb3JlPC9mb3JlaWduTW9kZWw+CisgIDxmb3JlaWduTW9kZWw+b2xkX2phdmEuZWNvcmU8L2ZvcmVpZ25Nb2RlbD4KKyAgPGZvcmVpZ25Nb2RlbD5vbGRfb3JtLmVjb3JlPC9mb3JlaWduTW9kZWw+CisgIDxmb3JlaWduTW9kZWw+b2xkX3BlcnNpc3RlbmNlLmVjb3JlPC9mb3JlaWduTW9kZWw+CisgIDxnZW5QYWNrYWdlcyBwcmVmaXg9IkpwYUNvcmUiIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS5qcHQuY29yZSIgZGlzcG9zYWJsZVByb3ZpZGVyRmFjdG9yeT0idHJ1ZSIKKyAgICAgIGVjb3JlUGFja2FnZT0ib2xkX2NvcmUuZWNvcmUjLyI+CisgICAgPGdlbkVudW1zIHR5cGVTYWZlRW51bUNvbXBhdGlibGU9ImZhbHNlIiBlY29yZUVudW09Im9sZF9jb3JlLmVjb3JlIy8vQWNjZXNzVHlwZSI+CisgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9Im9sZF9jb3JlLmVjb3JlIy8vQWNjZXNzVHlwZS9EZWZhdWx0Ii8+CisgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9Im9sZF9jb3JlLmVjb3JlIy8vQWNjZXNzVHlwZS9QUk9QRVJUWSIvPgorICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJvbGRfY29yZS5lY29yZSMvL0FjY2Vzc1R5cGUvRklFTEQiLz4KKyAgICA8L2dlbkVudW1zPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9sZF9jb3JlLmVjb3JlIy8vSUpwYU1vZGVsIi8+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib2xkX2NvcmUuZWNvcmUjLy9KcGFNb2RlbCI+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9sZF9jb3JlLmVjb3JlIy8vSnBhTW9kZWwvcHJvamVjdHMiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib2xkX2NvcmUuZWNvcmUjLy9JSnBhRU9iamVjdCI+CisgICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0ib2xkX2NvcmUuZWNvcmUjLy9JSnBhRU9iamVjdC9nZXRKcGFQcm9qZWN0Ii8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib2xkX2NvcmUuZWNvcmUjLy9KcGFFT2JqZWN0Ii8+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib2xkX2NvcmUuZWNvcmUjLy9JSnBhUHJvamVjdCI+CisgICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0ib2xkX2NvcmUuZWNvcmUjLy9JSnBhUHJvamVjdC9nZXRNb2RlbCIvPgorICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249Im9sZF9jb3JlLmVjb3JlIy8vSUpwYVByb2plY3QvZ2V0UGxhdGZvcm0iLz4KKyAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJvbGRfY29yZS5lY29yZSMvL0lKcGFQcm9qZWN0L3NldFBsYXRmb3JtIj4KKyAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9Im9sZF9jb3JlLmVjb3JlIy8vSUpwYVByb2plY3Qvc2V0UGxhdGZvcm0vcGxhdGZvcm1JZCIvPgorICAgICAgPC9nZW5PcGVyYXRpb25zPgorICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249Im9sZF9jb3JlLmVjb3JlIy8vSUpwYVByb2plY3QvZ2V0RGF0YVNvdXJjZSIvPgorICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249Im9sZF9jb3JlLmVjb3JlIy8vSUpwYVByb2plY3Qvc2V0RGF0YVNvdXJjZSI+CisgICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJvbGRfY29yZS5lY29yZSMvL0lKcGFQcm9qZWN0L3NldERhdGFTb3VyY2UvY29ubmVjdGlvblByb2ZpbGVOYW1lIi8+CisgICAgICA8L2dlbk9wZXJhdGlvbnM+CisgICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0ib2xkX2NvcmUuZWNvcmUjLy9JSnBhUHJvamVjdC9pc0Rpc2NvdmVyQW5ub3RhdGVkQ2xhc3NlcyIvPgorICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249Im9sZF9jb3JlLmVjb3JlIy8vSUpwYVByb2plY3Qvc2V0RGlzY292ZXJBbm5vdGF0ZWRDbGFzc2VzIj4KKyAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9Im9sZF9jb3JlLmVjb3JlIy8vSUpwYVByb2plY3Qvc2V0RGlzY292ZXJBbm5vdGF0ZWRDbGFzc2VzL2Rpc2NvdmVyQW5ub3RhdGVkQ2xhc3NlcyIvPgorICAgICAgPC9nZW5PcGVyYXRpb25zPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvbGRfY29yZS5lY29yZSMvL0pwYVByb2plY3QiPgorICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9sZF9jb3JlLmVjb3JlIy8vSnBhUHJvamVjdC9wbGF0Zm9ybSIvPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvbGRfY29yZS5lY29yZSMvL0pwYVByb2plY3QvZGF0YVNvdXJjZSIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9sZF9jb3JlLmVjb3JlIy8vSnBhUHJvamVjdC9kaXNjb3ZlckFubm90YXRlZENsYXNzZXMiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb2xkX2NvcmUuZWNvcmUjLy9KcGFQcm9qZWN0L2ZpbGVzIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9sZF9jb3JlLmVjb3JlIy8vSUpwYVBsYXRmb3JtIi8+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib2xkX2NvcmUuZWNvcmUjLy9JSnBhRGF0YVNvdXJjZSI+CisgICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0ib2xkX2NvcmUuZWNvcmUjLy9JSnBhRGF0YVNvdXJjZS9nZXRDb25uZWN0aW9uUHJvZmlsZU5hbWUiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib2xkX2NvcmUuZWNvcmUjLy9KcGFEYXRhU291cmNlIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvbGRfY29yZS5lY29yZSMvL0pwYURhdGFTb3VyY2UvY29ubmVjdGlvblByb2ZpbGVOYW1lIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9sZF9jb3JlLmVjb3JlIy8vSUpwYUZpbGUiPgorICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249Im9sZF9jb3JlLmVjb3JlIy8vSUpwYUZpbGUvZ2V0Q29udGVudElkIi8+CisgICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0ib2xkX2NvcmUuZWNvcmUjLy9JSnBhRmlsZS9nZXRDb250ZW50Ii8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9sZF9jb3JlLmVjb3JlIy8vSnBhRmlsZSI+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb2xkX2NvcmUuZWNvcmUjLy9KcGFGaWxlL2NvbnRlbnRJZCIvPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvbGRfY29yZS5lY29yZSMvL0pwYUZpbGUvY29udGVudCIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvbGRfY29yZS5lY29yZSMvL0lKcGFTb3VyY2VPYmplY3QiPgorICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249Im9sZF9jb3JlLmVjb3JlIy8vSUpwYVNvdXJjZU9iamVjdC9nZXRKcGFGaWxlIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib2xkX2NvcmUuZWNvcmUjLy9JWG1sRU9iamVjdCIvPgorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib2xkX2NvcmUuZWNvcmUjLy9YbWxFT2JqZWN0Ii8+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib2xkX2NvcmUuZWNvcmUjLy9JSnBhQ29udGVudE5vZGUiPgorICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249Im9sZF9jb3JlLmVjb3JlIy8vSUpwYUNvbnRlbnROb2RlL2dldEpwYUZpbGUiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib2xkX2NvcmUuZWNvcmUjLy9JSnBhUm9vdENvbnRlbnROb2RlIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvbGRfY29yZS5lY29yZSMvL0lKcGFSb290Q29udGVudE5vZGUvanBhRmlsZSIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvbGRfY29yZS5lY29yZSMvL0lQZXJzaXN0ZW50VHlwZSI+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb2xkX2NvcmUuZWNvcmUjLy9JUGVyc2lzdGVudFR5cGUvbWFwcGluZ0tleSIvPgorICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249Im9sZF9jb3JlLmVjb3JlIy8vSVBlcnNpc3RlbnRUeXBlL2dldE1hcHBpbmciLz4KKyAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJvbGRfY29yZS5lY29yZSMvL0lQZXJzaXN0ZW50VHlwZS9wYXJlbnRQZXJzaXN0ZW50VHlwZSIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvbGRfY29yZS5lY29yZSMvL0lUeXBlTWFwcGluZyI+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9IlJlYWRvbmx5IiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvbGRfY29yZS5lY29yZSMvL0lUeXBlTWFwcGluZy9uYW1lIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9IlJlYWRvbmx5IiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvbGRfY29yZS5lY29yZSMvL0lUeXBlTWFwcGluZy90YWJsZU5hbWUiLz4KKyAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJvbGRfY29yZS5lY29yZSMvL0lUeXBlTWFwcGluZy9nZXRQZXJzaXN0ZW50VHlwZSIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvbGRfY29yZS5lY29yZSMvL051bGxUeXBlTWFwcGluZyIvPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9sZF9jb3JlLmVjb3JlIy8vSVBlcnNpc3RlbnRBdHRyaWJ1dGUiPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJSZWFkb25seSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb2xkX2NvcmUuZWNvcmUjLy9JUGVyc2lzdGVudEF0dHJpYnV0ZS9tYXBwaW5nIi8+CisgICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0ib2xkX2NvcmUuZWNvcmUjLy9JUGVyc2lzdGVudEF0dHJpYnV0ZS90eXBlTWFwcGluZyIvPgorICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249Im9sZF9jb3JlLmVjb3JlIy8vSVBlcnNpc3RlbnRBdHRyaWJ1dGUvZ2V0TmFtZSIvPgorICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249Im9sZF9jb3JlLmVjb3JlIy8vSVBlcnNpc3RlbnRBdHRyaWJ1dGUvbWFwcGluZ0tleSIvPgorICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249Im9sZF9jb3JlLmVjb3JlIy8vSVBlcnNpc3RlbnRBdHRyaWJ1dGUvZGVmYXVsdE1hcHBpbmdLZXkiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib2xkX2NvcmUuZWNvcmUjLy9JQXR0cmlidXRlTWFwcGluZyI+CisgICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0ib2xkX2NvcmUuZWNvcmUjLy9JQXR0cmlidXRlTWFwcGluZy9nZXRQZXJzaXN0ZW50QXR0cmlidXRlIi8+CisgICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0ib2xkX2NvcmUuZWNvcmUjLy9JQXR0cmlidXRlTWFwcGluZy9pc0RlZmF1bHQiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPG5lc3RlZEdlblBhY2thZ2VzIHByZWZpeD0iSnBhQ29yZU1hcHBpbmdzIiBiYXNlUGFja2FnZT0ib3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwiCisgICAgICAgIGRpc3Bvc2FibGVQcm92aWRlckZhY3Rvcnk9InRydWUiIGVjb3JlUGFja2FnZT0ib2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncyI+CisgICAgICA8Z2VuRW51bXMgdHlwZVNhZmVFbnVtQ29tcGF0aWJsZT0iZmFsc2UiIGVjb3JlRW51bT0ib2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9EZWZhdWx0RWFnZXJGZXRjaFR5cGUiPgorICAgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9Im9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvRGVmYXVsdEVhZ2VyRmV0Y2hUeXBlL0RlZmF1bHQiLz4KKyAgICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0RlZmF1bHRFYWdlckZldGNoVHlwZS9FQUdFUiIvPgorICAgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9Im9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvRGVmYXVsdEVhZ2VyRmV0Y2hUeXBlL0xBWlkiLz4KKyAgICAgIDwvZ2VuRW51bXM+CisgICAgICA8Z2VuRW51bXMgdHlwZVNhZmVFbnVtQ29tcGF0aWJsZT0iZmFsc2UiIGVjb3JlRW51bT0ib2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9EZWZhdWx0TGF6eUZldGNoVHlwZSI+CisgICAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0ib2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9EZWZhdWx0TGF6eUZldGNoVHlwZS9EZWZhdWx0Ii8+CisgICAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0ib2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9EZWZhdWx0TGF6eUZldGNoVHlwZS9MQVpZIi8+CisgICAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0ib2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9EZWZhdWx0TGF6eUZldGNoVHlwZS9FQUdFUiIvPgorICAgICAgPC9nZW5FbnVtcz4KKyAgICAgIDxnZW5FbnVtcyB0eXBlU2FmZUVudW1Db21wYXRpYmxlPSJmYWxzZSIgZWNvcmVFbnVtPSJvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0RlZmF1bHRGYWxzZUJvb2xlYW4iPgorICAgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9Im9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvRGVmYXVsdEZhbHNlQm9vbGVhbi9EZWZhdWx0Ii8+CisgICAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0ib2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9EZWZhdWx0RmFsc2VCb29sZWFuL2ZhbHNlIi8+CisgICAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0ib2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9EZWZhdWx0RmFsc2VCb29sZWFuL3RydWUiLz4KKyAgICAgIDwvZ2VuRW51bXM+CisgICAgICA8Z2VuRW51bXMgdHlwZVNhZmVFbnVtQ29tcGF0aWJsZT0iZmFsc2UiIGVjb3JlRW51bT0ib2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9EZWZhdWx0VHJ1ZUJvb2xlYW4iPgorICAgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9Im9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvRGVmYXVsdFRydWVCb29sZWFuL0RlZmF1bHQiLz4KKyAgICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0RlZmF1bHRUcnVlQm9vbGVhbi90cnVlIi8+CisgICAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0ib2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9EZWZhdWx0VHJ1ZUJvb2xlYW4vZmFsc2UiLz4KKyAgICAgIDwvZ2VuRW51bXM+CisgICAgICA8Z2VuRW51bXMgdHlwZVNhZmVFbnVtQ29tcGF0aWJsZT0iZmFsc2UiIGVjb3JlRW51bT0ib2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9UZW1wb3JhbFR5cGUiPgorICAgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9Im9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvVGVtcG9yYWxUeXBlL051bGwiLz4KKyAgICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL1RlbXBvcmFsVHlwZS9EQVRFIi8+CisgICAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0ib2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9UZW1wb3JhbFR5cGUvVElNRSIvPgorICAgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9Im9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvVGVtcG9yYWxUeXBlL1RJTUVTVEFNUCIvPgorICAgICAgPC9nZW5FbnVtcz4KKyAgICAgIDxnZW5FbnVtcyB0eXBlU2FmZUVudW1Db21wYXRpYmxlPSJmYWxzZSIgZWNvcmVFbnVtPSJvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0luaGVyaXRhbmNlVHlwZSI+CisgICAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0ib2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9Jbmhlcml0YW5jZVR5cGUvRGVmYXVsdCIvPgorICAgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9Im9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSW5oZXJpdGFuY2VUeXBlL1NJTkdMRV9UQUJMRSIvPgorICAgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9Im9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSW5oZXJpdGFuY2VUeXBlL0pPSU5FRCIvPgorICAgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9Im9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSW5oZXJpdGFuY2VUeXBlL1RBQkxFX1BFUl9DTEFTUyIvPgorICAgICAgPC9nZW5FbnVtcz4KKyAgICAgIDxnZW5FbnVtcyB0eXBlU2FmZUVudW1Db21wYXRpYmxlPSJmYWxzZSIgZWNvcmVFbnVtPSJvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0Rpc2NyaW1pbmF0b3JUeXBlIj4KKyAgICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0Rpc2NyaW1pbmF0b3JUeXBlL0RlZmF1bHQiLz4KKyAgICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0Rpc2NyaW1pbmF0b3JUeXBlL1NUUklORyIvPgorICAgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9Im9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvRGlzY3JpbWluYXRvclR5cGUvQ0hBUiIvPgorICAgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9Im9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvRGlzY3JpbWluYXRvclR5cGUvSU5URUdFUiIvPgorICAgICAgPC9nZW5FbnVtcz4KKyAgICAgIDxnZW5FbnVtcyB0eXBlU2FmZUVudW1Db21wYXRpYmxlPSJmYWxzZSIgZWNvcmVFbnVtPSJvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0dlbmVyYXRpb25UeXBlIj4KKyAgICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0dlbmVyYXRpb25UeXBlL0RlZmF1bHQiLz4KKyAgICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0dlbmVyYXRpb25UeXBlL0FVVE8iLz4KKyAgICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0dlbmVyYXRpb25UeXBlL0lERU5USVRZIi8+CisgICAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0ib2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9HZW5lcmF0aW9uVHlwZS9TRVFVRU5DRSIvPgorICAgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9Im9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvR2VuZXJhdGlvblR5cGUvVEFCTEUiLz4KKyAgICAgIDwvZ2VuRW51bXM+CisgICAgICA8Z2VuRW51bXMgdHlwZVNhZmVFbnVtQ29tcGF0aWJsZT0iZmFsc2UiIGVjb3JlRW51bT0ib2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9FbnVtVHlwZSI+CisgICAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0ib2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9FbnVtVHlwZS9EZWZhdWx0Ii8+CisgICAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0ib2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9FbnVtVHlwZS9PUkRJTkFMIi8+CisgICAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0ib2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9FbnVtVHlwZS9TVFJJTkciLz4KKyAgICAgIDwvZ2VuRW51bXM+CisgICAgICA8Z2VuRW51bXMgdHlwZVNhZmVFbnVtQ29tcGF0aWJsZT0iZmFsc2UiIGVjb3JlRW51bT0ib2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9DYXNjYWRlVHlwZSI+CisgICAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0ib2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9DYXNjYWRlVHlwZS9BTEwiLz4KKyAgICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0Nhc2NhZGVUeXBlL1BFUlNJU1QiLz4KKyAgICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0Nhc2NhZGVUeXBlL01FUkdFIi8+CisgICAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0ib2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9DYXNjYWRlVHlwZS9SRU1PVkUiLz4KKyAgICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0Nhc2NhZGVUeXBlL1JFRlJFU0giLz4KKyAgICAgIDwvZ2VuRW51bXM+CisgICAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lNYXBwZWRTdXBlcmNsYXNzIj4KKyAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSU1hcHBlZFN1cGVyY2xhc3MvaWRDbGFzcyIvPgorICAgICAgPC9nZW5DbGFzc2VzPgorICAgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JRW50aXR5Ij4KKyAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSUVudGl0eS9zcGVjaWZpZWROYW1lIi8+CisgICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iUmVhZG9ubHkiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSUVudGl0eS9kZWZhdWx0TmFtZSIvPgorICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSUVudGl0eS90YWJsZSIvPgorICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSUVudGl0eS9zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMiLz4KKyAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JRW50aXR5L3ByaW1hcnlLZXlKb2luQ29sdW1ucyIvPgorICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSUVudGl0eS9zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMiLz4KKyAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lFbnRpdHkvZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucyIvPgorICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JRW50aXR5L2luaGVyaXRhbmNlU3RyYXRlZ3kiLz4KKyAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSUVudGl0eS9kZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlIi8+CisgICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lFbnRpdHkvc3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlIi8+CisgICAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiCisgICAgICAgICAgICBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JRW50aXR5L2Rpc2NyaW1pbmF0b3JWYWx1ZSIvPgorICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSUVudGl0eS9kaXNjcmltaW5hdG9yQ29sdW1uIi8+CisgICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JRW50aXR5L3NlcXVlbmNlR2VuZXJhdG9yIi8+CisgICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JRW50aXR5L3RhYmxlR2VuZXJhdG9yIi8+CisgICAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiCisgICAgICAgICAgICBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JRW50aXR5L2F0dHJpYnV0ZU92ZXJyaWRlcyIvPgorICAgICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIgorICAgICAgICAgICAgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSUVudGl0eS9zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMiLz4KKyAgICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIKKyAgICAgICAgICAgIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lFbnRpdHkvZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlcyIvPgorICAgICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIgorICAgICAgICAgICAgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSUVudGl0eS9hc3NvY2lhdGlvbk92ZXJyaWRlcyIvPgorICAgICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIgorICAgICAgICAgICAgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSUVudGl0eS9zcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyIvPgorICAgICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIgorICAgICAgICAgICAgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSUVudGl0eS9kZWZhdWx0QXNzb2NpYXRpb25PdmVycmlkZXMiLz4KKyAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lFbnRpdHkvbmFtZWRRdWVyaWVzIi8+CisgICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JRW50aXR5L25hbWVkTmF0aXZlUXVlcmllcyIvPgorICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JRW50aXR5L2lkQ2xhc3MiLz4KKyAgICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249Im9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSUVudGl0eS9kaXNjcmltaW5hdG9yVmFsdWVJc0FsbG93ZWQiLz4KKyAgICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249Im9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSUVudGl0eS9nZXRTZWNvbmRhcnlUYWJsZXMiLz4KKyAgICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249Im9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSUVudGl0eS9wYXJlbnRFbnRpdHkiLz4KKyAgICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249Im9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSUVudGl0eS9yb290RW50aXR5Ii8+CisgICAgICA8L2dlbkNsYXNzZXM+CisgICAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lFbWJlZGRhYmxlIi8+CisgICAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lUYWJsZSI+CisgICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iUmVhZG9ubHkiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSVRhYmxlL25hbWUiLz4KKyAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJSZWFkb25seSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JVGFibGUvc3BlY2lmaWVkTmFtZSIvPgorICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JVGFibGUvZGVmYXVsdE5hbWUiLz4KKyAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJSZWFkb25seSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JVGFibGUvY2F0YWxvZyIvPgorICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JVGFibGUvc3BlY2lmaWVkQ2F0YWxvZyIvPgorICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9IlJlYWRvbmx5IiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lUYWJsZS9kZWZhdWx0Q2F0YWxvZyIvPgorICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9IlJlYWRvbmx5IiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lUYWJsZS9zY2hlbWEiLz4KKyAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSVRhYmxlL3NwZWNpZmllZFNjaGVtYSIvPgorICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9IlJlYWRvbmx5IiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lUYWJsZS9kZWZhdWx0U2NoZW1hIi8+CisgICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JVGFibGUvdW5pcXVlQ29uc3RyYWludHMiLz4KKyAgICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSVVuaXF1ZUNvbnN0cmFpbnQiPgorICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JVW5pcXVlQ29uc3RyYWludC9jb2x1bW5OYW1lcyIvPgorICAgICAgPC9nZW5DbGFzc2VzPgorICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lOYW1lZENvbHVtbiI+CisgICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iUmVhZG9ubHkiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSU5hbWVkQ29sdW1uL25hbWUiLz4KKyAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSU5hbWVkQ29sdW1uL3NwZWNpZmllZE5hbWUiLz4KKyAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJSZWFkb25seSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JTmFtZWRDb2x1bW4vZGVmYXVsdE5hbWUiLz4KKyAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSU5hbWVkQ29sdW1uL2NvbHVtbkRlZmluaXRpb24iLz4KKyAgICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JQWJzdHJhY3RDb2x1bW4iPgorICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JQWJzdHJhY3RDb2x1bW4vdW5pcXVlIi8+CisgICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lBYnN0cmFjdENvbHVtbi9udWxsYWJsZSIvPgorICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JQWJzdHJhY3RDb2x1bW4vaW5zZXJ0YWJsZSIvPgorICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JQWJzdHJhY3RDb2x1bW4vdXBkYXRhYmxlIi8+CisgICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iUmVhZG9ubHkiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSUFic3RyYWN0Q29sdW1uL3RhYmxlIi8+CisgICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lBYnN0cmFjdENvbHVtbi9zcGVjaWZpZWRUYWJsZSIvPgorICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9IlJlYWRvbmx5IiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lBYnN0cmFjdENvbHVtbi9kZWZhdWx0VGFibGUiLz4KKyAgICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSUNvbHVtbiI+CisgICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lDb2x1bW4vbGVuZ3RoIi8+CisgICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lDb2x1bW4vc3BlY2lmaWVkTGVuZ3RoIi8+CisgICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lDb2x1bW4vcHJlY2lzaW9uIi8+CisgICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lDb2x1bW4vc3BlY2lmaWVkUHJlY2lzaW9uIi8+CisgICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lDb2x1bW4vc2NhbGUiLz4KKyAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSUNvbHVtbi9zcGVjaWZpZWRTY2FsZSIvPgorICAgICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0ib2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JQ29sdW1uL2dldERlZmF1bHRMZW5ndGgiLz4KKyAgICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249Im9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSUNvbHVtbi9nZXREZWZhdWx0UHJlY2lzaW9uIi8+CisgICAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lDb2x1bW4vZ2V0RGVmYXVsdFNjYWxlIi8+CisgICAgICA8L2dlbkNsYXNzZXM+CisgICAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lDb2x1bW5NYXBwaW5nIj4KKyAgICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249Im9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSUNvbHVtbk1hcHBpbmcvZ2V0Q29sdW1uIi8+CisgICAgICA8L2dlbkNsYXNzZXM+CisgICAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lCYXNpYyI+CisgICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lCYXNpYy9mZXRjaCIvPgorICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JQmFzaWMvb3B0aW9uYWwiLz4KKyAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JQmFzaWMvY29sdW1uIi8+CisgICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lCYXNpYy9sb2IiLz4KKyAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lCYXNpYy90ZW1wb3JhbCIvPgorICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JQmFzaWMvZW51bWVyYXRlZCIvPgorICAgICAgPC9nZW5DbGFzc2VzPgorICAgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JSWQiPgorICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lJZC9jb2x1bW4iLz4KKyAgICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIKKyAgICAgICAgICAgIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lJZC9nZW5lcmF0ZWRWYWx1ZSIvPgorICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JSWQvdGVtcG9yYWwiLz4KKyAgICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIKKyAgICAgICAgICAgIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lJZC90YWJsZUdlbmVyYXRvciIvPgorICAgICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIgorICAgICAgICAgICAgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSUlkL3NlcXVlbmNlR2VuZXJhdG9yIi8+CisgICAgICA8L2dlbkNsYXNzZXM+CisgICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSVRyYW5zaWVudCIvPgorICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lWZXJzaW9uIj4KKyAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JVmVyc2lvbi9jb2x1bW4iLz4KKyAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSVZlcnNpb24vdGVtcG9yYWwiLz4KKyAgICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JRW1iZWRkZWRJZCIvPgorICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lFbWJlZGRlZCI+CisgICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSUVtYmVkZGVkL2F0dHJpYnV0ZU92ZXJyaWRlcyIvPgorICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSUVtYmVkZGVkL3NwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyIvPgorICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSUVtYmVkZGVkL2RlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZXMiLz4KKyAgICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249Im9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSUVtYmVkZGVkL2VtYmVkZGFibGUiLz4KKyAgICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSVJlbGF0aW9uc2hpcE1hcHBpbmciPgorICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9IlJlYWRvbmx5IiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lSZWxhdGlvbnNoaXBNYXBwaW5nL3RhcmdldEVudGl0eSIvPgorICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JUmVsYXRpb25zaGlwTWFwcGluZy9zcGVjaWZpZWRUYXJnZXRFbnRpdHkiLz4KKyAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJSZWFkb25seSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JUmVsYXRpb25zaGlwTWFwcGluZy9kZWZhdWx0VGFyZ2V0RW50aXR5Ii8+CisgICAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiCisgICAgICAgICAgICBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JUmVsYXRpb25zaGlwTWFwcGluZy9yZXNvbHZlZFRhcmdldEVudGl0eSIvPgorICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSVJlbGF0aW9uc2hpcE1hcHBpbmcvY2FzY2FkZSIvPgorICAgICAgPC9nZW5DbGFzc2VzPgorICAgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JTm9uT3duaW5nTWFwcGluZyI+CisgICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lOb25Pd25pbmdNYXBwaW5nL21hcHBlZEJ5Ii8+CisgICAgICA8L2dlbkNsYXNzZXM+CisgICAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmciPgorICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nL29yZGVyQnkiLz4KKyAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSU11bHRpUmVsYXRpb25zaGlwTWFwcGluZy9mZXRjaCIvPgorICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcvam9pblRhYmxlIi8+CisgICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcvbWFwS2V5Ii8+CisgICAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcvaXNOb09yZGVyaW5nIi8+CisgICAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcvc2V0Tm9PcmRlcmluZyIvPgorICAgICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0ib2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nL2lzT3JkZXJCeVBrIi8+CisgICAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcvc2V0T3JkZXJCeVBrIi8+CisgICAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcvaXNDdXN0b21PcmRlcmluZyIvPgorICAgICAgPC9nZW5DbGFzc2VzPgorICAgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JT25lVG9NYW55Ii8+CisgICAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lNYW55VG9NYW55Ii8+CisgICAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nIj4KKyAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcvZmV0Y2giLz4KKyAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy9qb2luQ29sdW1ucyIvPgorICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcvc3BlY2lmaWVkSm9pbkNvbHVtbnMiLz4KKyAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nL2RlZmF1bHRKb2luQ29sdW1ucyIvPgorICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy9vcHRpb25hbCIvPgorICAgICAgPC9nZW5DbGFzc2VzPgorICAgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JTWFueVRvT25lIi8+CisgICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSU9uZVRvT25lIi8+CisgICAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lKb2luVGFibGUiPgorICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lKb2luVGFibGUvam9pbkNvbHVtbnMiLz4KKyAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lKb2luVGFibGUvc3BlY2lmaWVkSm9pbkNvbHVtbnMiLz4KKyAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lKb2luVGFibGUvZGVmYXVsdEpvaW5Db2x1bW5zIi8+CisgICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSUpvaW5UYWJsZS9pbnZlcnNlSm9pbkNvbHVtbnMiLz4KKyAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lKb2luVGFibGUvc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zIi8+CisgICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JSm9pblRhYmxlL2RlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbnMiLz4KKyAgICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSUFic3RyYWN0Sm9pbkNvbHVtbiI+CisgICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iUmVhZG9ubHkiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSUFic3RyYWN0Sm9pbkNvbHVtbi9yZWZlcmVuY2VkQ29sdW1uTmFtZSIvPgorICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JQWJzdHJhY3RKb2luQ29sdW1uL3NwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lIi8+CisgICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iUmVhZG9ubHkiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSUFic3RyYWN0Sm9pbkNvbHVtbi9kZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUiLz4KKyAgICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSUpvaW5Db2x1bW4iLz4KKyAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JT3ZlcnJpZGUiPgorICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JT3ZlcnJpZGUvbmFtZSIvPgorICAgICAgPC9nZW5DbGFzc2VzPgorICAgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JQXR0cmlidXRlT3ZlcnJpZGUiPgorICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lBdHRyaWJ1dGVPdmVycmlkZS9jb2x1bW4iLz4KKyAgICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSUFzc29jaWF0aW9uT3ZlcnJpZGUiPgorICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lBc3NvY2lhdGlvbk92ZXJyaWRlL2pvaW5Db2x1bW5zIi8+CisgICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JQXNzb2NpYXRpb25PdmVycmlkZS9zcGVjaWZpZWRKb2luQ29sdW1ucyIvPgorICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSUFzc29jaWF0aW9uT3ZlcnJpZGUvZGVmYXVsdEpvaW5Db2x1bW5zIi8+CisgICAgICA8L2dlbkNsYXNzZXM+CisgICAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lEaXNjcmltaW5hdG9yQ29sdW1uIj4KKyAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSURpc2NyaW1pbmF0b3JDb2x1bW4vZGlzY3JpbWluYXRvclR5cGUiLz4KKyAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSURpc2NyaW1pbmF0b3JDb2x1bW4vZGVmYXVsdExlbmd0aCIvPgorICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JRGlzY3JpbWluYXRvckNvbHVtbi9zcGVjaWZpZWRMZW5ndGgiLz4KKyAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJSZWFkb25seSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JRGlzY3JpbWluYXRvckNvbHVtbi9sZW5ndGgiLz4KKyAgICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSVNlY29uZGFyeVRhYmxlIj4KKyAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JU2Vjb25kYXJ5VGFibGUvcHJpbWFyeUtleUpvaW5Db2x1bW5zIi8+CisgICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JU2Vjb25kYXJ5VGFibGUvc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zIi8+CisgICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JU2Vjb25kYXJ5VGFibGUvZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucyIvPgorICAgICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0ib2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JU2Vjb25kYXJ5VGFibGUvdHlwZU1hcHBpbmciLz4KKyAgICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JUHJpbWFyeUtleUpvaW5Db2x1bW4iLz4KKyAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JR2VuZXJhdG9yIj4KKyAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSUdlbmVyYXRvci9uYW1lIi8+CisgICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iUmVhZG9ubHkiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSUdlbmVyYXRvci9pbml0aWFsVmFsdWUiLz4KKyAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSUdlbmVyYXRvci9zcGVjaWZpZWRJbml0aWFsVmFsdWUiLz4KKyAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJSZWFkb25seSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JR2VuZXJhdG9yL2RlZmF1bHRJbml0aWFsVmFsdWUiLz4KKyAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJSZWFkb25seSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JR2VuZXJhdG9yL2FsbG9jYXRpb25TaXplIi8+CisgICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lHZW5lcmF0b3Ivc3BlY2lmaWVkQWxsb2NhdGlvblNpemUiLz4KKyAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJSZWFkb25seSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JR2VuZXJhdG9yL2RlZmF1bHRBbGxvY2F0aW9uU2l6ZSIvPgorICAgICAgPC9nZW5DbGFzc2VzPgorICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lUYWJsZUdlbmVyYXRvciI+CisgICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iUmVhZG9ubHkiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSVRhYmxlR2VuZXJhdG9yL3RhYmxlIi8+CisgICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lUYWJsZUdlbmVyYXRvci9zcGVjaWZpZWRUYWJsZSIvPgorICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9IlJlYWRvbmx5IiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lUYWJsZUdlbmVyYXRvci9kZWZhdWx0VGFibGUiLz4KKyAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJSZWFkb25seSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JVGFibGVHZW5lcmF0b3IvY2F0YWxvZyIvPgorICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JVGFibGVHZW5lcmF0b3Ivc3BlY2lmaWVkQ2F0YWxvZyIvPgorICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9IlJlYWRvbmx5IiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lUYWJsZUdlbmVyYXRvci9kZWZhdWx0Q2F0YWxvZyIvPgorICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9IlJlYWRvbmx5IiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lUYWJsZUdlbmVyYXRvci9zY2hlbWEiLz4KKyAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSVRhYmxlR2VuZXJhdG9yL3NwZWNpZmllZFNjaGVtYSIvPgorICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9IlJlYWRvbmx5IiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lUYWJsZUdlbmVyYXRvci9kZWZhdWx0U2NoZW1hIi8+CisgICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iUmVhZG9ubHkiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSVRhYmxlR2VuZXJhdG9yL3BrQ29sdW1uTmFtZSIvPgorICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JVGFibGVHZW5lcmF0b3Ivc3BlY2lmaWVkUGtDb2x1bW5OYW1lIi8+CisgICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iUmVhZG9ubHkiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSVRhYmxlR2VuZXJhdG9yL2RlZmF1bHRQa0NvbHVtbk5hbWUiLz4KKyAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJSZWFkb25seSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JVGFibGVHZW5lcmF0b3IvdmFsdWVDb2x1bW5OYW1lIi8+CisgICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lUYWJsZUdlbmVyYXRvci9zcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWUiLz4KKyAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJSZWFkb25seSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JVGFibGVHZW5lcmF0b3IvZGVmYXVsdFZhbHVlQ29sdW1uTmFtZSIvPgorICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9IlJlYWRvbmx5IiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lUYWJsZUdlbmVyYXRvci9wa0NvbHVtblZhbHVlIi8+CisgICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lUYWJsZUdlbmVyYXRvci9zcGVjaWZpZWRQa0NvbHVtblZhbHVlIi8+CisgICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iUmVhZG9ubHkiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSVRhYmxlR2VuZXJhdG9yL2RlZmF1bHRQa0NvbHVtblZhbHVlIi8+CisgICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JVGFibGVHZW5lcmF0b3IvdW5pcXVlQ29uc3RyYWludHMiLz4KKyAgICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JU2VxdWVuY2VHZW5lcmF0b3IiPgorICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9IlJlYWRvbmx5IiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lTZXF1ZW5jZUdlbmVyYXRvci9zZXF1ZW5jZU5hbWUiLz4KKyAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSVNlcXVlbmNlR2VuZXJhdG9yL3NwZWNpZmllZFNlcXVlbmNlTmFtZSIvPgorICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9IlJlYWRvbmx5IiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lTZXF1ZW5jZUdlbmVyYXRvci9kZWZhdWx0U2VxdWVuY2VOYW1lIi8+CisgICAgICA8L2dlbkNsYXNzZXM+CisgICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSUdlbmVyYXRlZFZhbHVlIj4KKyAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSUdlbmVyYXRlZFZhbHVlL3N0cmF0ZWd5Ii8+CisgICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lHZW5lcmF0ZWRWYWx1ZS9nZW5lcmF0b3IiLz4KKyAgICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JUXVlcnkiPgorICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JUXVlcnkvbmFtZSIvPgorICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JUXVlcnkvcXVlcnkiLz4KKyAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lRdWVyeS9oaW50cyIvPgorICAgICAgPC9nZW5DbGFzc2VzPgorICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lOYW1lZFF1ZXJ5Ii8+CisgICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSU5hbWVkTmF0aXZlUXVlcnkiPgorICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JTmFtZWROYXRpdmVRdWVyeS9yZXN1bHRDbGFzcyIvPgorICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JTmFtZWROYXRpdmVRdWVyeS9yZXN1bHRTZXRNYXBwaW5nIi8+CisgICAgICA8L2dlbkNsYXNzZXM+CisgICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSVF1ZXJ5SGludCI+CisgICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lRdWVyeUhpbnQvbmFtZSIvPgorICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JUXVlcnlIaW50L3ZhbHVlIi8+CisgICAgICA8L2dlbkNsYXNzZXM+CisgICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSUNhc2NhZGUiPgorICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JQ2FzY2FkZS9hbGwiLz4KKyAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSUNhc2NhZGUvcGVyc2lzdCIvPgorICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JQ2FzY2FkZS9tZXJnZSIvPgorICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JQ2FzY2FkZS9yZW1vdmUiLz4KKyAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSUNhc2NhZGUvcmVmcmVzaCIvPgorICAgICAgPC9nZW5DbGFzc2VzPgorICAgIDwvbmVzdGVkR2VuUGFja2FnZXM+CisgIDwvZ2VuUGFja2FnZXM+CisgIDxnZW5QYWNrYWdlcyBwcmVmaXg9IkpwYUphdmEiIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50IgorICAgICAgZGlzcG9zYWJsZVByb3ZpZGVyRmFjdG9yeT0idHJ1ZSIgZWNvcmVQYWNrYWdlPSJvbGRfamF2YS5lY29yZSMvIj4KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9sZF9qYXZhLmVjb3JlIy8vSmF2YUVPYmplY3QiPgorICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249Im9sZF9qYXZhLmVjb3JlIy8vSmF2YUVPYmplY3QvZ2V0SnBhRmlsZSIvPgorICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249Im9sZF9qYXZhLmVjb3JlIy8vSmF2YUVPYmplY3QvZ2V0Um9vdCIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvbGRfamF2YS5lY29yZSMvL0pwYUNvbXBpbGF0aW9uVW5pdCI+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9sZF9qYXZhLmVjb3JlIy8vSnBhQ29tcGlsYXRpb25Vbml0L3R5cGVzIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9sZF9qYXZhLmVjb3JlIy8vSmF2YVBlcnNpc3RlbnRUeXBlIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb2xkX2phdmEuZWNvcmUjLy9KYXZhUGVyc2lzdGVudFR5cGUvbWFwcGluZyIvPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvbGRfamF2YS5lY29yZSMvL0phdmFQZXJzaXN0ZW50VHlwZS9hdHRyaWJ1dGVzIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb2xkX2phdmEuZWNvcmUjLy9KYXZhUGVyc2lzdGVudFR5cGUvYWNjZXNzIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9sZF9qYXZhLmVjb3JlIy8vSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUiPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvbGRfamF2YS5lY29yZSMvL0phdmFQZXJzaXN0ZW50QXR0cmlidXRlL2RlZmF1bHRNYXBwaW5nIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9sZF9qYXZhLmVjb3JlIy8vSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUvc3BlY2lmaWVkTWFwcGluZyIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9sZF9qYXZhLmVjb3JlIy8vSUphdmFUeXBlTWFwcGluZyIvPgorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib2xkX2phdmEuZWNvcmUjLy9JSmF2YUF0dHJpYnV0ZU1hcHBpbmciLz4KKyAgICA8bmVzdGVkR2VuUGFja2FnZXMgcHJlZml4PSJKcGFKYXZhTWFwcGluZ3MiIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEiCisgICAgICAgIGRpc3Bvc2FibGVQcm92aWRlckZhY3Rvcnk9InRydWUiIGVjb3JlUGFja2FnZT0ib2xkX2phdmEuZWNvcmUjLy9tYXBwaW5ncyI+CisgICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9sZF9qYXZhLmVjb3JlIy8vbWFwcGluZ3MvSUphdmFFbnRpdHkiLz4KKyAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib2xkX2phdmEuZWNvcmUjLy9tYXBwaW5ncy9JSmF2YUVtYmVkZGFibGUiLz4KKyAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib2xkX2phdmEuZWNvcmUjLy9tYXBwaW5ncy9JSmF2YU1hcHBlZFN1cGVyY2xhc3MiLz4KKyAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib2xkX2phdmEuZWNvcmUjLy9tYXBwaW5ncy9JSmF2YUJhc2ljIi8+CisgICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9sZF9qYXZhLmVjb3JlIy8vbWFwcGluZ3MvSUphdmFFbWJlZGRlZCIvPgorICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvbGRfamF2YS5lY29yZSMvL21hcHBpbmdzL0lKYXZhRW1iZWRkZWRJZCIvPgorICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvbGRfamF2YS5lY29yZSMvL21hcHBpbmdzL0lKYXZhSWQiLz4KKyAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib2xkX2phdmEuZWNvcmUjLy9tYXBwaW5ncy9JSmF2YU1hbnlUb01hbnkiLz4KKyAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib2xkX2phdmEuZWNvcmUjLy9tYXBwaW5ncy9JSmF2YU1hbnlUb09uZSIvPgorICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvbGRfamF2YS5lY29yZSMvL21hcHBpbmdzL0lKYXZhT25lVG9NYW55Ii8+CisgICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9sZF9qYXZhLmVjb3JlIy8vbWFwcGluZ3MvSUphdmFPbmVUb09uZSIvPgorICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvbGRfamF2YS5lY29yZSMvL21hcHBpbmdzL0lKYXZhVHJhbnNpZW50Ii8+CisgICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9sZF9qYXZhLmVjb3JlIy8vbWFwcGluZ3MvSUphdmFWZXJzaW9uIi8+CisgICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9sZF9qYXZhLmVjb3JlIy8vbWFwcGluZ3MvSmF2YVR5cGVNYXBwaW5nIi8+CisgICAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvbGRfamF2YS5lY29yZSMvL21hcHBpbmdzL0phdmFFbnRpdHkiLz4KKyAgICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9sZF9qYXZhLmVjb3JlIy8vbWFwcGluZ3MvSmF2YU1hcHBlZFN1cGVyY2xhc3MiLz4KKyAgICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9sZF9qYXZhLmVjb3JlIy8vbWFwcGluZ3MvSmF2YUVtYmVkZGFibGUiLz4KKyAgICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9sZF9qYXZhLmVjb3JlIy8vbWFwcGluZ3MvSmF2YU51bGxUeXBlTWFwcGluZyIvPgorICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvbGRfamF2YS5lY29yZSMvL21hcHBpbmdzL0phdmFBdHRyaWJ1dGVNYXBwaW5nIi8+CisgICAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvbGRfamF2YS5lY29yZSMvL21hcHBpbmdzL0phdmFCYXNpYyIvPgorICAgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib2xkX2phdmEuZWNvcmUjLy9tYXBwaW5ncy9KYXZhSWQiLz4KKyAgICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9sZF9qYXZhLmVjb3JlIy8vbWFwcGluZ3MvSmF2YVRyYW5zaWVudCIvPgorICAgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib2xkX2phdmEuZWNvcmUjLy9tYXBwaW5ncy9KYXZhVmVyc2lvbiIvPgorICAgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib2xkX2phdmEuZWNvcmUjLy9tYXBwaW5ncy9KYXZhRW1iZWRkZWRJZCIvPgorICAgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib2xkX2phdmEuZWNvcmUjLy9tYXBwaW5ncy9KYXZhRW1iZWRkZWQiLz4KKyAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib2xkX2phdmEuZWNvcmUjLy9tYXBwaW5ncy9KYXZhUmVsYXRpb25zaGlwTWFwcGluZyIvPgorICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvbGRfamF2YS5lY29yZSMvL21hcHBpbmdzL0phdmFTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nIi8+CisgICAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvbGRfamF2YS5lY29yZSMvL21hcHBpbmdzL0phdmFNYW55VG9PbmUiLz4KKyAgICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9sZF9qYXZhLmVjb3JlIy8vbWFwcGluZ3MvSmF2YU9uZVRvT25lIi8+CisgICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9sZF9qYXZhLmVjb3JlIy8vbWFwcGluZ3MvSmF2YU11bHRpUmVsYXRpb25zaGlwTWFwcGluZyIvPgorICAgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib2xkX2phdmEuZWNvcmUjLy9tYXBwaW5ncy9KYXZhT25lVG9NYW55Ii8+CisgICAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvbGRfamF2YS5lY29yZSMvL21hcHBpbmdzL0phdmFNYW55VG9NYW55Ii8+CisgICAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvbGRfamF2YS5lY29yZSMvL21hcHBpbmdzL0phdmFOdWxsQXR0cmlidXRlTWFwcGluZyIvPgorICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvbGRfamF2YS5lY29yZSMvL21hcHBpbmdzL0Fic3RyYWN0SmF2YVRhYmxlIi8+CisgICAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvbGRfamF2YS5lY29yZSMvL21hcHBpbmdzL0phdmFUYWJsZSIvPgorICAgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib2xkX2phdmEuZWNvcmUjLy9tYXBwaW5ncy9KYXZhU2Vjb25kYXJ5VGFibGUiLz4KKyAgICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9sZF9qYXZhLmVjb3JlIy8vbWFwcGluZ3MvSmF2YUpvaW5UYWJsZSIvPgorICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvbGRfamF2YS5lY29yZSMvL21hcHBpbmdzL0phdmFOYW1lZENvbHVtbiIvPgorICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvbGRfamF2YS5lY29yZSMvL21hcHBpbmdzL0Fic3RyYWN0SmF2YUNvbHVtbiIvPgorICAgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib2xkX2phdmEuZWNvcmUjLy9tYXBwaW5ncy9KYXZhQ29sdW1uIi8+CisgICAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvbGRfamF2YS5lY29yZSMvL21hcHBpbmdzL0phdmFKb2luQ29sdW1uIi8+CisgICAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvbGRfamF2YS5lY29yZSMvL21hcHBpbmdzL0phdmFPdmVycmlkZSIvPgorICAgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib2xkX2phdmEuZWNvcmUjLy9tYXBwaW5ncy9KYXZhQXR0cmlidXRlT3ZlcnJpZGUiLz4KKyAgICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9sZF9qYXZhLmVjb3JlIy8vbWFwcGluZ3MvSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUiLz4KKyAgICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9sZF9qYXZhLmVjb3JlIy8vbWFwcGluZ3MvSmF2YURpc2NyaW1pbmF0b3JDb2x1bW4iLz4KKyAgICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9sZF9qYXZhLmVjb3JlIy8vbWFwcGluZ3MvSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uIi8+CisgICAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvbGRfamF2YS5lY29yZSMvL21hcHBpbmdzL0phdmFHZW5lcmF0ZWRWYWx1ZSIvPgorICAgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib2xkX2phdmEuZWNvcmUjLy9tYXBwaW5ncy9KYXZhR2VuZXJhdG9yIi8+CisgICAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvbGRfamF2YS5lY29yZSMvL21hcHBpbmdzL0phdmFUYWJsZUdlbmVyYXRvciIvPgorICAgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib2xkX2phdmEuZWNvcmUjLy9tYXBwaW5ncy9KYXZhU2VxdWVuY2VHZW5lcmF0b3IiLz4KKyAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib2xkX2phdmEuZWNvcmUjLy9tYXBwaW5ncy9KYXZhQWJzdHJhY3RRdWVyeSIvPgorICAgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib2xkX2phdmEuZWNvcmUjLy9tYXBwaW5ncy9KYXZhTmFtZWRRdWVyeSIvPgorICAgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib2xkX2phdmEuZWNvcmUjLy9tYXBwaW5ncy9KYXZhTmFtZWROYXRpdmVRdWVyeSIvPgorICAgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib2xkX2phdmEuZWNvcmUjLy9tYXBwaW5ncy9KYXZhUXVlcnlIaW50Ii8+CisgICAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvbGRfamF2YS5lY29yZSMvL21hcHBpbmdzL0phdmFVbmlxdWVDb25zdHJhaW50Ii8+CisgICAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvbGRfamF2YS5lY29yZSMvL21hcHBpbmdzL0phdmFDYXNjYWRlIi8+CisgICAgPC9uZXN0ZWRHZW5QYWNrYWdlcz4KKyAgPC9nZW5QYWNrYWdlcz4KKyAgPGdlblBhY2thZ2VzIHByZWZpeD0iT3JtIiBiYXNlUGFja2FnZT0ib3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudCIgZGlzcG9zYWJsZVByb3ZpZGVyRmFjdG9yeT0idHJ1ZSIKKyAgICAgIGVjb3JlUGFja2FnZT0ib2xkX29ybS5lY29yZSMvIj4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvbGRfb3JtLmVjb3JlIy8vWG1sUm9vdENvbnRlbnROb2RlIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvbGRfb3JtLmVjb3JlIy8vWG1sUm9vdENvbnRlbnROb2RlL2VudGl0eU1hcHBpbmdzIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9sZF9vcm0uZWNvcmUjLy9FbnRpdHlNYXBwaW5nc0ludGVybmFsIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvbGRfb3JtLmVjb3JlIy8vRW50aXR5TWFwcGluZ3NJbnRlcm5hbC9yb290Ii8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb2xkX29ybS5lY29yZSMvL0VudGl0eU1hcHBpbmdzSW50ZXJuYWwvdmVyc2lvbiIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9sZF9vcm0uZWNvcmUjLy9FbnRpdHlNYXBwaW5nc0ludGVybmFsL2Rlc2NyaXB0aW9uIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvbGRfb3JtLmVjb3JlIy8vRW50aXR5TWFwcGluZ3NJbnRlcm5hbC9wZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUludGVybmFsIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb2xkX29ybS5lY29yZSMvL0VudGl0eU1hcHBpbmdzSW50ZXJuYWwvcGFja2FnZUludGVybmFsIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb2xkX29ybS5lY29yZSMvL0VudGl0eU1hcHBpbmdzSW50ZXJuYWwvZGVmYXVsdFNjaGVtYSIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9sZF9vcm0uZWNvcmUjLy9FbnRpdHlNYXBwaW5nc0ludGVybmFsL3NwZWNpZmllZFNjaGVtYSIvPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJSZWFkb25seSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb2xkX29ybS5lY29yZSMvL0VudGl0eU1hcHBpbmdzSW50ZXJuYWwvc2NoZW1hIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb2xkX29ybS5lY29yZSMvL0VudGl0eU1hcHBpbmdzSW50ZXJuYWwvZGVmYXVsdENhdGFsb2ciLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvbGRfb3JtLmVjb3JlIy8vRW50aXR5TWFwcGluZ3NJbnRlcm5hbC9zcGVjaWZpZWRDYXRhbG9nIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9IlJlYWRvbmx5IiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvbGRfb3JtLmVjb3JlIy8vRW50aXR5TWFwcGluZ3NJbnRlcm5hbC9jYXRhbG9nIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb2xkX29ybS5lY29yZSMvL0VudGl0eU1hcHBpbmdzSW50ZXJuYWwvZGVmYXVsdEFjY2VzcyIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9sZF9vcm0uZWNvcmUjLy9FbnRpdHlNYXBwaW5nc0ludGVybmFsL3NwZWNpZmllZEFjY2VzcyIvPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJSZWFkb25seSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb2xkX29ybS5lY29yZSMvL0VudGl0eU1hcHBpbmdzSW50ZXJuYWwvYWNjZXNzIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9sZF9vcm0uZWNvcmUjLy9FbnRpdHlNYXBwaW5nc0ludGVybmFsL3R5cGVNYXBwaW5ncyIvPgorICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9sZF9vcm0uZWNvcmUjLy9FbnRpdHlNYXBwaW5nc0ludGVybmFsL3BlcnNpc3RlbnRUeXBlcyIvPgorICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9sZF9vcm0uZWNvcmUjLy9FbnRpdHlNYXBwaW5nc0ludGVybmFsL3NlcXVlbmNlR2VuZXJhdG9ycyIvPgorICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9sZF9vcm0uZWNvcmUjLy9FbnRpdHlNYXBwaW5nc0ludGVybmFsL3RhYmxlR2VuZXJhdG9ycyIvPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvbGRfb3JtLmVjb3JlIy8vRW50aXR5TWFwcGluZ3NJbnRlcm5hbC9uYW1lZFF1ZXJpZXMiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb2xkX29ybS5lY29yZSMvL0VudGl0eU1hcHBpbmdzSW50ZXJuYWwvbmFtZWROYXRpdmVRdWVyaWVzIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9sZF9vcm0uZWNvcmUjLy9FbnRpdHlNYXBwaW5ncyI+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9IlJlYWRvbmx5IiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvbGRfb3JtLmVjb3JlIy8vRW50aXR5TWFwcGluZ3MvcGVyc2lzdGVuY2VVbml0TWV0YWRhdGEiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvbGRfb3JtLmVjb3JlIy8vRW50aXR5TWFwcGluZ3MvcGFja2FnZSIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvbGRfb3JtLmVjb3JlIy8vRW50aXR5TWFwcGluZ3NGb3JYbWwiPgorICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9sZF9vcm0uZWNvcmUjLy9FbnRpdHlNYXBwaW5nc0ZvclhtbC9wZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUZvclhtbCIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9sZF9vcm0uZWNvcmUjLy9FbnRpdHlNYXBwaW5nc0ZvclhtbC9wYWNrYWdlRm9yWG1sIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib2xkX29ybS5lY29yZSMvL1htbFR5cGVNYXBwaW5nIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvbGRfb3JtLmVjb3JlIy8vWG1sVHlwZU1hcHBpbmcvZGVmYXVsdEFjY2VzcyIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9sZF9vcm0uZWNvcmUjLy9YbWxUeXBlTWFwcGluZy9zcGVjaWZpZWRBY2Nlc3MiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iUmVhZG9ubHkiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9sZF9vcm0uZWNvcmUjLy9YbWxUeXBlTWFwcGluZy9hY2Nlc3MiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvbGRfb3JtLmVjb3JlIy8vWG1sVHlwZU1hcHBpbmcvbWV0YWRhdGFDb21wbGV0ZSIvPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvbGRfb3JtLmVjb3JlIy8vWG1sVHlwZU1hcHBpbmcvcGVyc2lzdGVudFR5cGUiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib2xkX29ybS5lY29yZSMvL1htbFBlcnNpc3RlbnRUeXBlIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvbGRfb3JtLmVjb3JlIy8vWG1sUGVyc2lzdGVudFR5cGUvY2xhc3MiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb2xkX29ybS5lY29yZSMvL1htbFBlcnNpc3RlbnRUeXBlL2F0dHJpYnV0ZU1hcHBpbmdzIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9sZF9vcm0uZWNvcmUjLy9YbWxQZXJzaXN0ZW50VHlwZS9zcGVjaWZpZWRBdHRyaWJ1dGVNYXBwaW5ncyIvPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvbGRfb3JtLmVjb3JlIy8vWG1sUGVyc2lzdGVudFR5cGUvdmlydHVhbEF0dHJpYnV0ZU1hcHBpbmdzIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb2xkX29ybS5lY29yZSMvL1htbFBlcnNpc3RlbnRUeXBlL3BlcnNpc3RlbnRBdHRyaWJ1dGVzIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb2xkX29ybS5lY29yZSMvL1htbFBlcnNpc3RlbnRUeXBlL3NwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGVzIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb2xkX29ybS5lY29yZSMvL1htbFBlcnNpc3RlbnRUeXBlL3ZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlcyIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvbGRfb3JtLmVjb3JlIy8vWG1sTWFwcGVkU3VwZXJjbGFzcyI+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9sZF9vcm0uZWNvcmUjLy9YbWxNYXBwZWRTdXBlcmNsYXNzL2lkQ2xhc3NGb3JYbWwiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib2xkX29ybS5lY29yZSMvL1htbEVudGl0eUludGVybmFsIi8+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib2xkX29ybS5lY29yZSMvL1htbEVudGl0eUZvclhtbCI+CisgICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb2xkX29ybS5lY29yZSMvL1htbEVudGl0eUZvclhtbC90YWJsZUZvclhtbCIvPgorICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9sZF9vcm0uZWNvcmUjLy9YbWxFbnRpdHlGb3JYbWwvZGlzY3JpbWluYXRvckNvbHVtbkZvclhtbCIvPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvbGRfb3JtLmVjb3JlIy8vWG1sRW50aXR5Rm9yWG1sL2lkQ2xhc3NGb3JYbWwiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb2xkX29ybS5lY29yZSMvL1htbEVudGl0eUZvclhtbC9pbmhlcml0YW5jZUZvclhtbCIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvbGRfb3JtLmVjb3JlIy8vWG1sRW50aXR5Ij4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9sZF9vcm0uZWNvcmUjLy9YbWxFbnRpdHkvc2Vjb25kYXJ5VGFibGVzIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9sZF9vcm0uZWNvcmUjLy9YbWxFbnRpdHkvdmlydHVhbFNlY29uZGFyeVRhYmxlcyIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvbGRfb3JtLmVjb3JlIy8vWG1sRW1iZWRkYWJsZSIvPgorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib2xkX29ybS5lY29yZSMvL1htbEF0dHJpYnV0ZU1hcHBpbmciPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvbGRfb3JtLmVjb3JlIy8vWG1sQXR0cmlidXRlTWFwcGluZy9wZXJzaXN0ZW50QXR0cmlidXRlIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9sZF9vcm0uZWNvcmUjLy9YbWxOdWxsQXR0cmlidXRlTWFwcGluZyIvPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9sZF9vcm0uZWNvcmUjLy9YbWxCYXNpYyIvPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9sZF9vcm0uZWNvcmUjLy9YbWxJZCIvPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9sZF9vcm0uZWNvcmUjLy9YbWxUcmFuc2llbnQiLz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvbGRfb3JtLmVjb3JlIy8vWG1sRW1iZWRkZWQiLz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvbGRfb3JtLmVjb3JlIy8vWG1sRW1iZWRkZWRJZCIvPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9sZF9vcm0uZWNvcmUjLy9YbWxWZXJzaW9uIi8+CisgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvbGRfb3JtLmVjb3JlIy8vWG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nSW50ZXJuYWwiLz4KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9sZF9vcm0uZWNvcmUjLy9YbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdGb3JYbWwiPgorICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9sZF9vcm0uZWNvcmUjLy9YbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdGb3JYbWwvam9pblRhYmxlRm9yWG1sIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb2xkX29ybS5lY29yZSMvL1htbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ0ZvclhtbC9tYXBLZXlGb3JYbWwiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvbGRfb3JtLmVjb3JlIy8vWG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nIi8+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib2xkX29ybS5lY29yZSMvL1htbE9uZVRvTWFueSIvPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9sZF9vcm0uZWNvcmUjLy9YbWxNYW55VG9NYW55Ii8+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib2xkX29ybS5lY29yZSMvL1htbFBlcnNpc3RlbnRBdHRyaWJ1dGUiPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9sZF9vcm0uZWNvcmUjLy9YbWxQZXJzaXN0ZW50QXR0cmlidXRlL25hbWUiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib2xkX29ybS5lY29yZSMvL1BlcnNpc3RlbmNlVW5pdE1ldGFkYXRhSW50ZXJuYWwiPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9sZF9vcm0uZWNvcmUjLy9QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUludGVybmFsL3htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlSW50ZXJuYWwiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9sZF9vcm0uZWNvcmUjLy9QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUludGVybmFsL3BlcnNpc3RlbmNlVW5pdERlZmF1bHRzSW50ZXJuYWwiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib2xkX29ybS5lY29yZSMvL1BlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvbGRfb3JtLmVjb3JlIy8vUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEveG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iUmVhZG9ubHkiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9sZF9vcm0uZWNvcmUjLy9QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS9wZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvbGRfb3JtLmVjb3JlIy8vUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFGb3JYbWwiPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9sZF9vcm0uZWNvcmUjLy9QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUZvclhtbC94bWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZUZvclhtbCIvPgorICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9sZF9vcm0uZWNvcmUjLy9QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUZvclhtbC9wZXJzaXN0ZW5jZVVuaXREZWZhdWx0c0ZvclhtbCIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvbGRfb3JtLmVjb3JlIy8vUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNJbnRlcm5hbCI+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb2xkX29ybS5lY29yZSMvL1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzSW50ZXJuYWwvc2NoZW1hSW50ZXJuYWwiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvbGRfb3JtLmVjb3JlIy8vUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNJbnRlcm5hbC9jYXRhbG9nSW50ZXJuYWwiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvbGRfb3JtLmVjb3JlIy8vUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNJbnRlcm5hbC9hY2Nlc3NJbnRlcm5hbCIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9sZF9vcm0uZWNvcmUjLy9QZXJzaXN0ZW5jZVVuaXREZWZhdWx0c0ludGVybmFsL2Nhc2NhZGVQZXJzaXN0SW50ZXJuYWwiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib2xkX29ybS5lY29yZSMvL1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvbGRfb3JtLmVjb3JlIy8vUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMvc2NoZW1hIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb2xkX29ybS5lY29yZSMvL1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzL2NhdGFsb2ciLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvbGRfb3JtLmVjb3JlIy8vUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMvYWNjZXNzIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb2xkX29ybS5lY29yZSMvL1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzL2Nhc2NhZGVQZXJzaXN0Ii8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9sZF9vcm0uZWNvcmUjLy9QZXJzaXN0ZW5jZVVuaXREZWZhdWx0c0ZvclhtbCI+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb2xkX29ybS5lY29yZSMvL1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzRm9yWG1sL3NjaGVtYUZvclhtbCIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9sZF9vcm0uZWNvcmUjLy9QZXJzaXN0ZW5jZVVuaXREZWZhdWx0c0ZvclhtbC9jYXRhbG9nRm9yWG1sIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb2xkX29ybS5lY29yZSMvL1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzRm9yWG1sL2FjY2Vzc0ZvclhtbCIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9sZF9vcm0uZWNvcmUjLy9QZXJzaXN0ZW5jZVVuaXREZWZhdWx0c0ZvclhtbC9jYXNjYWRlUGVyc2lzdEZvclhtbCIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvbGRfb3JtLmVjb3JlIy8vWG1sVGFibGUiLz4KKyAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9sZF9vcm0uZWNvcmUjLy9BYnN0cmFjdFhtbE5hbWVkQ29sdW1uIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvbGRfb3JtLmVjb3JlIy8vQWJzdHJhY3RYbWxOYW1lZENvbHVtbi9zcGVjaWZpZWROYW1lRm9yWG1sIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb2xkX29ybS5lY29yZSMvL0Fic3RyYWN0WG1sTmFtZWRDb2x1bW4vY29sdW1uRGVmaW5pdGlvbkZvclhtbCIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvbGRfb3JtLmVjb3JlIy8vQWJzdHJhY3RYbWxDb2x1bW4iPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9sZF9vcm0uZWNvcmUjLy9BYnN0cmFjdFhtbENvbHVtbi91bmlxdWVGb3JYbWwiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvbGRfb3JtLmVjb3JlIy8vQWJzdHJhY3RYbWxDb2x1bW4vbnVsbGFibGVGb3JYbWwiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvbGRfb3JtLmVjb3JlIy8vQWJzdHJhY3RYbWxDb2x1bW4vaW5zZXJ0YWJsZUZvclhtbCIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9sZF9vcm0uZWNvcmUjLy9BYnN0cmFjdFhtbENvbHVtbi91cGRhdGFibGVGb3JYbWwiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvbGRfb3JtLmVjb3JlIy8vQWJzdHJhY3RYbWxDb2x1bW4vc3BlY2lmaWVkVGFibGVGb3JYbWwiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib2xkX29ybS5lY29yZSMvL1htbENvbHVtbiI+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb2xkX29ybS5lY29yZSMvL1htbENvbHVtbi9sZW5ndGhGb3JYbWwiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvbGRfb3JtLmVjb3JlIy8vWG1sQ29sdW1uL3ByZWNpc2lvbkZvclhtbCIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9sZF9vcm0uZWNvcmUjLy9YbWxDb2x1bW4vc2NhbGVGb3JYbWwiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib2xkX29ybS5lY29yZSMvL1htbEpvaW5Db2x1bW4iPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9sZF9vcm0uZWNvcmUjLy9YbWxKb2luQ29sdW1uL3NwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lRm9yWG1sIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9sZF9vcm0uZWNvcmUjLy9JWG1sQ29sdW1uTWFwcGluZyI+CisgICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb2xkX29ybS5lY29yZSMvL0lYbWxDb2x1bW5NYXBwaW5nL2NvbHVtbkZvclhtbCIvPgorICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249Im9sZF9vcm0uZWNvcmUjLy9JWG1sQ29sdW1uTWFwcGluZy9tYWtlQ29sdW1uRm9yWG1sTm9uTnVsbCIvPgorICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249Im9sZF9vcm0uZWNvcmUjLy9JWG1sQ29sdW1uTWFwcGluZy9tYWtlQ29sdW1uRm9yWG1sTnVsbCIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvbGRfb3JtLmVjb3JlIy8vWG1sTWFueVRvT25lIi8+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib2xkX29ybS5lY29yZSMvL1htbE9uZVRvT25lIi8+CisgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvbGRfb3JtLmVjb3JlIy8vWG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZyIvPgorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib2xkX29ybS5lY29yZSMvL1htbFJlbGF0aW9uc2hpcE1hcHBpbmciLz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvbGRfb3JtLmVjb3JlIy8vWG1sSm9pblRhYmxlIi8+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib2xkX29ybS5lY29yZSMvL0Fic3RyYWN0WG1sVGFibGUiPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9sZF9vcm0uZWNvcmUjLy9BYnN0cmFjdFhtbFRhYmxlL3NwZWNpZmllZE5hbWVGb3JYbWwiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvbGRfb3JtLmVjb3JlIy8vQWJzdHJhY3RYbWxUYWJsZS9zcGVjaWZpZWRDYXRhbG9nRm9yWG1sIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb2xkX29ybS5lY29yZSMvL0Fic3RyYWN0WG1sVGFibGUvc3BlY2lmaWVkU2NoZW1hRm9yWG1sIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib2xkX29ybS5lY29yZSMvL1htbE92ZXJyaWRlIi8+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib2xkX29ybS5lY29yZSMvL1htbEF0dHJpYnV0ZU92ZXJyaWRlIi8+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib2xkX29ybS5lY29yZSMvL1htbEFzc29jaWF0aW9uT3ZlcnJpZGUiLz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvbGRfb3JtLmVjb3JlIy8vWG1sRGlzY3JpbWluYXRvckNvbHVtbiI+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb2xkX29ybS5lY29yZSMvL1htbERpc2NyaW1pbmF0b3JDb2x1bW4vZGlzY3JpbWluYXRvclR5cGVGb3JYbWwiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvbGRfb3JtLmVjb3JlIy8vWG1sRGlzY3JpbWluYXRvckNvbHVtbi9zcGVjaWZpZWRMZW5ndGhGb3JYbWwiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib2xkX29ybS5lY29yZSMvL1htbFNlY29uZGFyeVRhYmxlIi8+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib2xkX29ybS5lY29yZSMvL1htbFByaW1hcnlLZXlKb2luQ29sdW1uIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvbGRfb3JtLmVjb3JlIy8vWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4vc3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWVGb3JYbWwiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib2xkX29ybS5lY29yZSMvL1htbEdlbmVyYXRlZFZhbHVlIi8+CisgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvbGRfb3JtLmVjb3JlIy8vWG1sR2VuZXJhdG9yIi8+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib2xkX29ybS5lY29yZSMvL1htbFNlcXVlbmNlR2VuZXJhdG9yIi8+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib2xkX29ybS5lY29yZSMvL1htbFRhYmxlR2VuZXJhdG9yIi8+CisgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvbGRfb3JtLmVjb3JlIy8vQWJzdHJhY3RYbWxRdWVyeSIvPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9sZF9vcm0uZWNvcmUjLy9YbWxOYW1lZFF1ZXJ5Ii8+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib2xkX29ybS5lY29yZSMvL1htbE5hbWVkTmF0aXZlUXVlcnkiLz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvbGRfb3JtLmVjb3JlIy8vWG1sUXVlcnlIaW50Ii8+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib2xkX29ybS5lY29yZSMvL1htbFVuaXF1ZUNvbnN0cmFpbnQiLz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvbGRfb3JtLmVjb3JlIy8vWG1sQ2FzY2FkZSIvPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9sZF9vcm0uZWNvcmUjLy9YbWxJZENsYXNzIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvbGRfb3JtLmVjb3JlIy8vWG1sSWRDbGFzcy92YWx1ZSIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvbGRfb3JtLmVjb3JlIy8vWG1sSW5oZXJpdGFuY2UiPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9sZF9vcm0uZWNvcmUjLy9YbWxJbmhlcml0YW5jZS9zdHJhdGVneSIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvbGRfb3JtLmVjb3JlIy8vWG1sTWFwS2V5Ij4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvbGRfb3JtLmVjb3JlIy8vWG1sTWFwS2V5L25hbWUiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgIDwvZ2VuUGFja2FnZXM+CisgIDxnZW5QYWNrYWdlcyBwcmVmaXg9IlBlcnNpc3RlbmNlIiBiYXNlUGFja2FnZT0ib3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudCIKKyAgICAgIGRpc3Bvc2FibGVQcm92aWRlckZhY3Rvcnk9InRydWUiIGVjb3JlUGFja2FnZT0ib2xkX3BlcnNpc3RlbmNlLmVjb3JlIy8iPgorICAgIDxnZW5FbnVtcyB0eXBlU2FmZUVudW1Db21wYXRpYmxlPSJmYWxzZSIgZWNvcmVFbnVtPSJvbGRfcGVyc2lzdGVuY2UuZWNvcmUjLy9QZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUiPgorICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJvbGRfcGVyc2lzdGVuY2UuZWNvcmUjLy9QZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUvSlRBIi8+CisgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9Im9sZF9wZXJzaXN0ZW5jZS5lY29yZSMvL1BlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZS9SRVNPVVJDRV9MT0NBTCIvPgorICAgIDwvZ2VuRW51bXM+CisgICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJvbGRfcGVyc2lzdGVuY2UuZWNvcmUjLy9QZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGVPYmplY3QiLz4KKyAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im9sZF9wZXJzaXN0ZW5jZS5lY29yZSMvL1ZlcnNpb24iLz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvbGRfcGVyc2lzdGVuY2UuZWNvcmUjLy9QZXJzaXN0ZW5jZVhtbFJvb3RDb250ZW50Tm9kZSI+CisgICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb2xkX3BlcnNpc3RlbmNlLmVjb3JlIy8vUGVyc2lzdGVuY2VYbWxSb290Q29udGVudE5vZGUvcGVyc2lzdGVuY2UiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib2xkX3BlcnNpc3RlbmNlLmVjb3JlIy8vUGVyc2lzdGVuY2UiPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvbGRfcGVyc2lzdGVuY2UuZWNvcmUjLy9QZXJzaXN0ZW5jZS9wZXJzaXN0ZW5jZVVuaXRzIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb2xkX3BlcnNpc3RlbmNlLmVjb3JlIy8vUGVyc2lzdGVuY2UvdmVyc2lvbiIvPgorICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9sZF9wZXJzaXN0ZW5jZS5lY29yZSMvL1BlcnNpc3RlbmNlL3Jvb3QiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib2xkX3BlcnNpc3RlbmNlLmVjb3JlIy8vUGVyc2lzdGVuY2VVbml0Ij4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvbGRfcGVyc2lzdGVuY2UuZWNvcmUjLy9QZXJzaXN0ZW5jZVVuaXQvZGVzY3JpcHRpb24iLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvbGRfcGVyc2lzdGVuY2UuZWNvcmUjLy9QZXJzaXN0ZW5jZVVuaXQvcHJvdmlkZXIiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvbGRfcGVyc2lzdGVuY2UuZWNvcmUjLy9QZXJzaXN0ZW5jZVVuaXQvanRhRGF0YVNvdXJjZSIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9sZF9wZXJzaXN0ZW5jZS5lY29yZSMvL1BlcnNpc3RlbmNlVW5pdC9ub25KdGFEYXRhU291cmNlIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb2xkX3BlcnNpc3RlbmNlLmVjb3JlIy8vUGVyc2lzdGVuY2VVbml0L21hcHBpbmdGaWxlcyIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9sZF9wZXJzaXN0ZW5jZS5lY29yZSMvL1BlcnNpc3RlbmNlVW5pdC9qYXJGaWxlcyIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9sZF9wZXJzaXN0ZW5jZS5lY29yZSMvL1BlcnNpc3RlbmNlVW5pdC9jbGFzc2VzIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb2xkX3BlcnNpc3RlbmNlLmVjb3JlIy8vUGVyc2lzdGVuY2VVbml0L2V4Y2x1ZGVVbmxpc3RlZENsYXNzZXMiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb2xkX3BlcnNpc3RlbmNlLmVjb3JlIy8vUGVyc2lzdGVuY2VVbml0L3Byb3BlcnRpZXMiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvbGRfcGVyc2lzdGVuY2UuZWNvcmUjLy9QZXJzaXN0ZW5jZVVuaXQvbmFtZSIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9sZF9wZXJzaXN0ZW5jZS5lY29yZSMvL1BlcnNpc3RlbmNlVW5pdC90cmFuc2FjdGlvblR5cGUiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib2xkX3BlcnNpc3RlbmNlLmVjb3JlIy8vTWFwcGluZ0ZpbGVSZWYiPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJSZWFkb25seSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb2xkX3BlcnNpc3RlbmNlLmVjb3JlIy8vTWFwcGluZ0ZpbGVSZWYvZmlsZU5hbWUiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib2xkX3BlcnNpc3RlbmNlLmVjb3JlIy8vSmF2YUNsYXNzUmVmIj4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iUmVhZG9ubHkiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9sZF9wZXJzaXN0ZW5jZS5lY29yZSMvL0phdmFDbGFzc1JlZi9qYXZhQ2xhc3MiLz4KKyAgICA8L2dlbkNsYXNzZXM+CisgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib2xkX3BlcnNpc3RlbmNlLmVjb3JlIy8vUHJvcGVydGllcyI+CisgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9sZF9wZXJzaXN0ZW5jZS5lY29yZSMvL1Byb3BlcnRpZXMvcHJvcGVydGllcyIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvbGRfcGVyc2lzdGVuY2UuZWNvcmUjLy9Qcm9wZXJ0eSI+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb2xkX3BlcnNpc3RlbmNlLmVjb3JlIy8vUHJvcGVydHkvbmFtZSIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9sZF9wZXJzaXN0ZW5jZS5lY29yZSMvL1Byb3BlcnR5L3ZhbHVlIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICA8L2dlblBhY2thZ2VzPgorPC9nZW5tb2RlbDpHZW5Nb2RlbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL21vZGVsL29sZF9qYXZhLmVjb3JlIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvbW9kZWwvb2xkX2phdmEuZWNvcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEzMTBjMAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL21vZGVsL29sZF9qYXZhLmVjb3JlCkBAIC0wLDAgKzEsMTEwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGVjb3JlOkVQYWNrYWdlIHhtaTp2ZXJzaW9uPSIyLjAiCisgICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiBuYW1lPSJqYXZhIgorICAgIG5zVVJJPSJodHRwOi8vb3JnLmVjbGlwc2UuanB0LmNvcmUvb2xkX2phdmEuZWNvcmUiIG5zUHJlZml4PSJvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZW50LmphdmEiPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkphdmFFT2JqZWN0IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9Im9sZF9jb3JlLmVjb3JlIy8vSnBhRU9iamVjdCBvbGRfY29yZS5lY29yZSMvL0lKcGFTb3VyY2VPYmplY3QiPgorICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRKcGFGaWxlIiBlVHlwZT0iZWNvcmU6RUNsYXNzIG9sZF9jb3JlLmVjb3JlIy8vSUpwYUZpbGUiLz4KKyAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0Um9vdCIgZVR5cGU9ImVjb3JlOkVDbGFzcyBvbGRfY29yZS5lY29yZSMvL0lKcGFSb290Q29udGVudE5vZGUiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSnBhQ29tcGlsYXRpb25Vbml0IiBlU3VwZXJUeXBlcz0iIy8vSmF2YUVPYmplY3Qgb2xkX2NvcmUuZWNvcmUjLy9JSnBhUm9vdENvbnRlbnROb2RlIj4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idHlwZXMiIHVwcGVyQm91bmQ9Ii0xIgorICAgICAgICBlVHlwZT0iIy8vSmF2YVBlcnNpc3RlbnRUeXBlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkphdmFQZXJzaXN0ZW50VHlwZSIgZVN1cGVyVHlwZXM9IiMvL0phdmFFT2JqZWN0IG9sZF9jb3JlLmVjb3JlIy8vSVBlcnNpc3RlbnRUeXBlIj4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWFwcGluZyIgbG93ZXJCb3VuZD0iMSIKKyAgICAgICAgZVR5cGU9IiMvL0lKYXZhVHlwZU1hcHBpbmciIGNvbnRhaW5tZW50PSJ0cnVlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImF0dHJpYnV0ZXMiIHVwcGVyQm91bmQ9Ii0xIgorICAgICAgICBlVHlwZT0iIy8vSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWNjZXNzIiBlVHlwZT0iZWNvcmU6RUVudW0gb2xkX2NvcmUuZWNvcmUjLy9BY2Nlc3NUeXBlIgorICAgICAgICBjaGFuZ2VhYmxlPSJmYWxzZSIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSIgZVN1cGVyVHlwZXM9IiMvL0phdmFFT2JqZWN0IG9sZF9jb3JlLmVjb3JlIy8vSVBlcnNpc3RlbnRBdHRyaWJ1dGUiPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZWZhdWx0TWFwcGluZyIgbG93ZXJCb3VuZD0iMSIKKyAgICAgICAgZVR5cGU9IiMvL0lKYXZhQXR0cmlidXRlTWFwcGluZyIgY29udGFpbm1lbnQ9InRydWUiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3BlY2lmaWVkTWFwcGluZyIgbG93ZXJCb3VuZD0iMSIKKyAgICAgICAgZVR5cGU9IiMvL0lKYXZhQXR0cmlidXRlTWFwcGluZyIgY29udGFpbm1lbnQ9InRydWUiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSUphdmFUeXBlTWFwcGluZyIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSIKKyAgICAgIGVTdXBlclR5cGVzPSJvbGRfY29yZS5lY29yZSMvL0lUeXBlTWFwcGluZyIvPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklKYXZhQXR0cmlidXRlTWFwcGluZyIgYWJzdHJhY3Q9InRydWUiCisgICAgICBpbnRlcmZhY2U9InRydWUiIGVTdXBlclR5cGVzPSJvbGRfY29yZS5lY29yZSMvL0lBdHRyaWJ1dGVNYXBwaW5nIi8+CisgIDxlU3VicGFja2FnZXMgbmFtZT0ibWFwcGluZ3MiIG5zVVJJPSJqcHQuY29yZS5qYXZhLm1hcHBpbmdzLnhtaSIgbnNQcmVmaXg9ImpwdC5jb3JlLmphdmEubWFwcGluZ3MiPgorICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSUphdmFFbnRpdHkiIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiCisgICAgICAgIGVTdXBlclR5cGVzPSIjLy9JSmF2YVR5cGVNYXBwaW5nIG9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSUVudGl0eSIvPgorICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSUphdmFFbWJlZGRhYmxlIiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIgorICAgICAgICBlU3VwZXJUeXBlcz0iIy8vSUphdmFUeXBlTWFwcGluZyBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lFbWJlZGRhYmxlIi8+CisgICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJSmF2YU1hcHBlZFN1cGVyY2xhc3MiIGFic3RyYWN0PSJ0cnVlIgorICAgICAgICBpbnRlcmZhY2U9InRydWUiIGVTdXBlclR5cGVzPSIjLy9JSmF2YVR5cGVNYXBwaW5nIG9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSU1hcHBlZFN1cGVyY2xhc3MiLz4KKyAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklKYXZhQmFzaWMiIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiCisgICAgICAgIGVTdXBlclR5cGVzPSIjLy9JSmF2YUF0dHJpYnV0ZU1hcHBpbmcgb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JQmFzaWMiLz4KKyAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklKYXZhRW1iZWRkZWQiIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiCisgICAgICAgIGVTdXBlclR5cGVzPSIjLy9JSmF2YUF0dHJpYnV0ZU1hcHBpbmcgb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JRW1iZWRkZWQiLz4KKyAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklKYXZhRW1iZWRkZWRJZCIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSIKKyAgICAgICAgZVN1cGVyVHlwZXM9IiMvL0lKYXZhQXR0cmlidXRlTWFwcGluZyBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lFbWJlZGRlZElkIi8+CisgICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJSmF2YUlkIiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIgorICAgICAgICBlU3VwZXJUeXBlcz0iIy8vSUphdmFBdHRyaWJ1dGVNYXBwaW5nIG9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSUlkIi8+CisgICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJSmF2YU1hbnlUb01hbnkiIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiCisgICAgICAgIGVTdXBlclR5cGVzPSIjLy9JSmF2YUF0dHJpYnV0ZU1hcHBpbmcgb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JTWFueVRvTWFueSIvPgorICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSUphdmFNYW55VG9PbmUiIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiCisgICAgICAgIGVTdXBlclR5cGVzPSIjLy9JSmF2YUF0dHJpYnV0ZU1hcHBpbmcgb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JTWFueVRvT25lIi8+CisgICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJSmF2YU9uZVRvTWFueSIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSIKKyAgICAgICAgZVN1cGVyVHlwZXM9IiMvL0lKYXZhQXR0cmlidXRlTWFwcGluZyBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lPbmVUb01hbnkiLz4KKyAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklKYXZhT25lVG9PbmUiIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiCisgICAgICAgIGVTdXBlclR5cGVzPSIjLy9JSmF2YUF0dHJpYnV0ZU1hcHBpbmcgb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JT25lVG9PbmUiLz4KKyAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklKYXZhVHJhbnNpZW50IiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIgorICAgICAgICBlU3VwZXJUeXBlcz0iIy8vSUphdmFBdHRyaWJ1dGVNYXBwaW5nIG9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSVRyYW5zaWVudCIvPgorICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSUphdmFWZXJzaW9uIiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIgorICAgICAgICBlU3VwZXJUeXBlcz0iIy8vSUphdmFBdHRyaWJ1dGVNYXBwaW5nIG9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSVZlcnNpb24iLz4KKyAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkphdmFUeXBlTWFwcGluZyIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9KYXZhRU9iamVjdCAjLy9JSmF2YVR5cGVNYXBwaW5nIi8+CisgICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJKYXZhRW50aXR5IiBlU3VwZXJUeXBlcz0iIy8vbWFwcGluZ3MvSmF2YVR5cGVNYXBwaW5nICMvL21hcHBpbmdzL0lKYXZhRW50aXR5Ii8+CisgICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJKYXZhTWFwcGVkU3VwZXJjbGFzcyIgZVN1cGVyVHlwZXM9IiMvL21hcHBpbmdzL0phdmFUeXBlTWFwcGluZyAjLy9tYXBwaW5ncy9JSmF2YU1hcHBlZFN1cGVyY2xhc3MiLz4KKyAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkphdmFFbWJlZGRhYmxlIiBlU3VwZXJUeXBlcz0iIy8vbWFwcGluZ3MvSmF2YVR5cGVNYXBwaW5nICMvL21hcHBpbmdzL0lKYXZhRW1iZWRkYWJsZSIvPgorICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSmF2YU51bGxUeXBlTWFwcGluZyIgZVN1cGVyVHlwZXM9IiMvL21hcHBpbmdzL0phdmFUeXBlTWFwcGluZyIvPgorICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSmF2YUF0dHJpYnV0ZU1hcHBpbmciIGFic3RyYWN0PSJ0cnVlIgorICAgICAgICBlU3VwZXJUeXBlcz0iIy8vSmF2YUVPYmplY3QgIy8vSUphdmFBdHRyaWJ1dGVNYXBwaW5nIi8+CisgICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJKYXZhQmFzaWMiIGVTdXBlclR5cGVzPSIjLy9tYXBwaW5ncy9KYXZhQXR0cmlidXRlTWFwcGluZyAjLy9tYXBwaW5ncy9JSmF2YUJhc2ljIi8+CisgICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJKYXZhSWQiIGVTdXBlclR5cGVzPSIjLy9tYXBwaW5ncy9KYXZhQXR0cmlidXRlTWFwcGluZyAjLy9tYXBwaW5ncy9JSmF2YUlkIi8+CisgICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJKYXZhVHJhbnNpZW50IiBlU3VwZXJUeXBlcz0iIy8vbWFwcGluZ3MvSmF2YUF0dHJpYnV0ZU1hcHBpbmcgIy8vbWFwcGluZ3MvSUphdmFUcmFuc2llbnQiLz4KKyAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkphdmFWZXJzaW9uIiBlU3VwZXJUeXBlcz0iIy8vbWFwcGluZ3MvSmF2YUF0dHJpYnV0ZU1hcHBpbmcgIy8vbWFwcGluZ3MvSUphdmFWZXJzaW9uIi8+CisgICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJKYXZhRW1iZWRkZWRJZCIgZVN1cGVyVHlwZXM9IiMvL21hcHBpbmdzL0phdmFBdHRyaWJ1dGVNYXBwaW5nICMvL21hcHBpbmdzL0lKYXZhRW1iZWRkZWRJZCIvPgorICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSmF2YUVtYmVkZGVkIiBlU3VwZXJUeXBlcz0iIy8vbWFwcGluZ3MvSmF2YUF0dHJpYnV0ZU1hcHBpbmcgIy8vbWFwcGluZ3MvSUphdmFFbWJlZGRlZCIvPgorICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSmF2YVJlbGF0aW9uc2hpcE1hcHBpbmciIGFic3RyYWN0PSJ0cnVlIgorICAgICAgICBlU3VwZXJUeXBlcz0iIy8vbWFwcGluZ3MvSmF2YUF0dHJpYnV0ZU1hcHBpbmcgb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JUmVsYXRpb25zaGlwTWFwcGluZyIvPgorICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSmF2YVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmciIGFic3RyYWN0PSJ0cnVlIgorICAgICAgICBlU3VwZXJUeXBlcz0iIy8vbWFwcGluZ3MvSmF2YVJlbGF0aW9uc2hpcE1hcHBpbmcgb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZyIvPgorICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSmF2YU1hbnlUb09uZSIgZVN1cGVyVHlwZXM9IiMvL21hcHBpbmdzL0phdmFTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nICMvL21hcHBpbmdzL0lKYXZhTWFueVRvT25lIi8+CisgICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJKYXZhT25lVG9PbmUiIGVTdXBlclR5cGVzPSIjLy9tYXBwaW5ncy9KYXZhU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZyAjLy9tYXBwaW5ncy9JSmF2YU9uZVRvT25lIi8+CisgICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJKYXZhTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nIiBhYnN0cmFjdD0idHJ1ZSIKKyAgICAgICAgZVN1cGVyVHlwZXM9IiMvL21hcHBpbmdzL0phdmFSZWxhdGlvbnNoaXBNYXBwaW5nIG9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSU11bHRpUmVsYXRpb25zaGlwTWFwcGluZyIvPgorICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSmF2YU9uZVRvTWFueSIgZVN1cGVyVHlwZXM9IiMvL21hcHBpbmdzL0phdmFNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcgIy8vbWFwcGluZ3MvSUphdmFPbmVUb01hbnkiLz4KKyAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkphdmFNYW55VG9NYW55IiBlU3VwZXJUeXBlcz0iIy8vbWFwcGluZ3MvSmF2YU11bHRpUmVsYXRpb25zaGlwTWFwcGluZyAjLy9tYXBwaW5ncy9JSmF2YU1hbnlUb01hbnkiLz4KKyAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkphdmFOdWxsQXR0cmlidXRlTWFwcGluZyIgZVN1cGVyVHlwZXM9IiMvL21hcHBpbmdzL0phdmFBdHRyaWJ1dGVNYXBwaW5nIi8+CisgICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBYnN0cmFjdEphdmFUYWJsZSIgYWJzdHJhY3Q9InRydWUiCisgICAgICAgIGVTdXBlclR5cGVzPSIjLy9KYXZhRU9iamVjdCBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lUYWJsZSIvPgorICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSmF2YVRhYmxlIiBlU3VwZXJUeXBlcz0iIy8vbWFwcGluZ3MvQWJzdHJhY3RKYXZhVGFibGUiLz4KKyAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkphdmFTZWNvbmRhcnlUYWJsZSIgZVN1cGVyVHlwZXM9IiMvL21hcHBpbmdzL0Fic3RyYWN0SmF2YVRhYmxlIG9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSVNlY29uZGFyeVRhYmxlIi8+CisgICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJKYXZhSm9pblRhYmxlIiBlU3VwZXJUeXBlcz0iIy8vbWFwcGluZ3MvQWJzdHJhY3RKYXZhVGFibGUgb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JSm9pblRhYmxlIi8+CisgICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJKYXZhTmFtZWRDb2x1bW4iIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vSmF2YUVPYmplY3Qgb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JTmFtZWRDb2x1bW4iLz4KKyAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFic3RyYWN0SmF2YUNvbHVtbiIgYWJzdHJhY3Q9InRydWUiCisgICAgICAgIGVTdXBlclR5cGVzPSIjLy9tYXBwaW5ncy9KYXZhTmFtZWRDb2x1bW4gb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JQWJzdHJhY3RDb2x1bW4iLz4KKyAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkphdmFDb2x1bW4iIGVTdXBlclR5cGVzPSIjLy9tYXBwaW5ncy9BYnN0cmFjdEphdmFDb2x1bW4gb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JQ29sdW1uIi8+CisgICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJKYXZhSm9pbkNvbHVtbiIgZVN1cGVyVHlwZXM9IiMvL21hcHBpbmdzL0Fic3RyYWN0SmF2YUNvbHVtbiBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lKb2luQ29sdW1uIi8+CisgICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJKYXZhT3ZlcnJpZGUiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vSmF2YUVPYmplY3Qgb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JT3ZlcnJpZGUiLz4KKyAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkphdmFBdHRyaWJ1dGVPdmVycmlkZSIgZVN1cGVyVHlwZXM9IiMvL21hcHBpbmdzL0phdmFPdmVycmlkZSBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lBdHRyaWJ1dGVPdmVycmlkZSIvPgorICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUiIGVTdXBlclR5cGVzPSIjLy9tYXBwaW5ncy9KYXZhT3ZlcnJpZGUgb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JQXNzb2NpYXRpb25PdmVycmlkZSIvPgorICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSmF2YURpc2NyaW1pbmF0b3JDb2x1bW4iIGVTdXBlclR5cGVzPSIjLy9tYXBwaW5ncy9KYXZhTmFtZWRDb2x1bW4gb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JRGlzY3JpbWluYXRvckNvbHVtbiIvPgorICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uIiBlU3VwZXJUeXBlcz0iIy8vbWFwcGluZ3MvSmF2YU5hbWVkQ29sdW1uIG9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSVByaW1hcnlLZXlKb2luQ29sdW1uIi8+CisgICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJKYXZhR2VuZXJhdGVkVmFsdWUiIGVTdXBlclR5cGVzPSIjLy9KYXZhRU9iamVjdCBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lHZW5lcmF0ZWRWYWx1ZSIvPgorICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSmF2YUdlbmVyYXRvciIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9KYXZhRU9iamVjdCBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lHZW5lcmF0b3IiLz4KKyAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkphdmFUYWJsZUdlbmVyYXRvciIgZVN1cGVyVHlwZXM9IiMvL21hcHBpbmdzL0phdmFHZW5lcmF0b3Igb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JVGFibGVHZW5lcmF0b3IiLz4KKyAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkphdmFTZXF1ZW5jZUdlbmVyYXRvciIgZVN1cGVyVHlwZXM9IiMvL21hcHBpbmdzL0phdmFHZW5lcmF0b3Igb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JU2VxdWVuY2VHZW5lcmF0b3IiLz4KKyAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkphdmFBYnN0cmFjdFF1ZXJ5IiBhYnN0cmFjdD0idHJ1ZSIKKyAgICAgICAgZVN1cGVyVHlwZXM9IiMvL0phdmFFT2JqZWN0IG9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSVF1ZXJ5Ii8+CisgICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJKYXZhTmFtZWRRdWVyeSIgZVN1cGVyVHlwZXM9IiMvL21hcHBpbmdzL0phdmFBYnN0cmFjdFF1ZXJ5IG9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSU5hbWVkUXVlcnkiLz4KKyAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkphdmFOYW1lZE5hdGl2ZVF1ZXJ5IiBlU3VwZXJUeXBlcz0iIy8vbWFwcGluZ3MvSmF2YUFic3RyYWN0UXVlcnkgb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JTmFtZWROYXRpdmVRdWVyeSIvPgorICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSmF2YVF1ZXJ5SGludCIgZVN1cGVyVHlwZXM9IiMvL0phdmFFT2JqZWN0IG9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSVF1ZXJ5SGludCIvPgorICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSmF2YVVuaXF1ZUNvbnN0cmFpbnQiIGVTdXBlclR5cGVzPSIjLy9KYXZhRU9iamVjdCBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lVbmlxdWVDb25zdHJhaW50Ii8+CisgICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJKYXZhQ2FzY2FkZSIgZVN1cGVyVHlwZXM9IiMvL0phdmFFT2JqZWN0IG9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSUNhc2NhZGUiLz4KKyAgPC9lU3VicGFja2FnZXM+Cis8L2Vjb3JlOkVQYWNrYWdlPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvbW9kZWwvb2xkX29ybS5lY29yZSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL21vZGVsL29sZF9vcm0uZWNvcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMwZjE3NgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL21vZGVsL29sZF9vcm0uZWNvcmUKQEAgLTAsMCArMSwyNzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCIKKyAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIG5hbWU9Im9ybSIKKyAgICBuc1VSST0ianB0Lm9ybS54bWkiIG5zUHJlZml4PSJvcmcuZWNsaXBzZS5qcHQuY29yZS5jb250ZW50Lm9ybSI+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sUm9vdENvbnRlbnROb2RlIiBlU3VwZXJUeXBlcz0ib2xkX2NvcmUuZWNvcmUjLy9YbWxFT2JqZWN0IG9sZF9jb3JlLmVjb3JlIy8vSUpwYVJvb3RDb250ZW50Tm9kZSI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVudGl0eU1hcHBpbmdzIiBvcmRlcmVkPSJmYWxzZSIKKyAgICAgICAgdW5pcXVlPSJmYWxzZSIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL0VudGl0eU1hcHBpbmdzSW50ZXJuYWwiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKKyAgICAgICAgZU9wcG9zaXRlPSIjLy9FbnRpdHlNYXBwaW5nc0ludGVybmFsL3Jvb3QiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRW50aXR5TWFwcGluZ3NJbnRlcm5hbCIgZVN1cGVyVHlwZXM9Im9sZF9jb3JlLmVjb3JlIy8vWG1sRU9iamVjdCBvbGRfY29yZS5lY29yZSMvL0lKcGFDb250ZW50Tm9kZSAjLy9FbnRpdHlNYXBwaW5nc0ZvclhtbCAjLy9FbnRpdHlNYXBwaW5ncyI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJvb3QiIG9yZGVyZWQ9ImZhbHNlIiB1bmlxdWU9ImZhbHNlIgorICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vWG1sUm9vdENvbnRlbnROb2RlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiIGVPcHBvc2l0ZT0iIy8vWG1sUm9vdENvbnRlbnROb2RlL2VudGl0eU1hcHBpbmdzIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZlcnNpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVzY3JpcHRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icGVyc2lzdGVuY2VVbml0TWV0YWRhdGFJbnRlcm5hbCIKKyAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL1BlcnNpc3RlbmNlVW5pdE1ldGFkYXRhSW50ZXJuYWwiIGNoYW5nZWFibGU9ImZhbHNlIgorICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwYWNrYWdlSW50ZXJuYWwiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVmYXVsdFNjaGVtYSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzcGVjaWZpZWRTY2hlbWEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2NoZW1hIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIgorICAgICAgICBjaGFuZ2VhYmxlPSJmYWxzZSIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZWZhdWx0Q2F0YWxvZyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzcGVjaWZpZWRDYXRhbG9nIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNhdGFsb2ciIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciCisgICAgICAgIGNoYW5nZWFibGU9ImZhbHNlIiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlZmF1bHRBY2Nlc3MiIGVUeXBlPSJlY29yZTpFRW51bSBvbGRfY29yZS5lY29yZSMvL0FjY2Vzc1R5cGUiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3BlY2lmaWVkQWNjZXNzIiBlVHlwZT0iZWNvcmU6RUVudW0gb2xkX2NvcmUuZWNvcmUjLy9BY2Nlc3NUeXBlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjY2VzcyIgZVR5cGU9ImVjb3JlOkVFbnVtIG9sZF9jb3JlLmVjb3JlIy8vQWNjZXNzVHlwZSIKKyAgICAgICAgY2hhbmdlYWJsZT0iZmFsc2UiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idHlwZU1hcHBpbmdzIiB1cHBlckJvdW5kPSItMSIKKyAgICAgICAgZVR5cGU9IiMvL1htbFR5cGVNYXBwaW5nIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBlcnNpc3RlbnRUeXBlcyIgdXBwZXJCb3VuZD0iLTEiCisgICAgICAgIGVUeXBlPSIjLy9YbWxQZXJzaXN0ZW50VHlwZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNlcXVlbmNlR2VuZXJhdG9ycyIgdXBwZXJCb3VuZD0iLTEiCisgICAgICAgIGVUeXBlPSIjLy9YbWxTZXF1ZW5jZUdlbmVyYXRvciIgY29udGFpbm1lbnQ9InRydWUiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGFibGVHZW5lcmF0b3JzIiB1cHBlckJvdW5kPSItMSIKKyAgICAgICAgZVR5cGU9IiMvL1htbFRhYmxlR2VuZXJhdG9yIiBjb250YWlubWVudD0idHJ1ZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJuYW1lZFF1ZXJpZXMiIHVwcGVyQm91bmQ9Ii0xIgorICAgICAgICBlVHlwZT0iIy8vWG1sTmFtZWRRdWVyeSIgY29udGFpbm1lbnQ9InRydWUiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibmFtZWROYXRpdmVRdWVyaWVzIiB1cHBlckJvdW5kPSItMSIKKyAgICAgICAgZVR5cGU9IiMvL1htbE5hbWVkTmF0aXZlUXVlcnkiIGNvbnRhaW5tZW50PSJ0cnVlIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkVudGl0eU1hcHBpbmdzIiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIj4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icGVyc2lzdGVuY2VVbml0TWV0YWRhdGEiCisgICAgICAgIGVUeXBlPSIjLy9QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSIgY2hhbmdlYWJsZT0iZmFsc2UiIHZvbGF0aWxlPSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGFja2FnZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIKKyAgICAgICAgdm9sYXRpbGU9InRydWUiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRW50aXR5TWFwcGluZ3NGb3JYbWwiIGFic3RyYWN0PSJ0cnVlIgorICAgICAgaW50ZXJmYWNlPSJ0cnVlIj4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icGVyc2lzdGVuY2VVbml0TWV0YWRhdGFGb3JYbWwiCisgICAgICAgIGVUeXBlPSIjLy9QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUZvclhtbCIgdm9sYXRpbGU9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwYWNrYWdlRm9yWG1sIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIgorICAgICAgICB2b2xhdGlsZT0idHJ1ZSIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxUeXBlTWFwcGluZyIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSJvbGRfY29yZS5lY29yZSMvL1htbEVPYmplY3Qgb2xkX2NvcmUuZWNvcmUjLy9JVHlwZU1hcHBpbmciPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZWZhdWx0QWNjZXNzIiBlVHlwZT0iZWNvcmU6RUVudW0gb2xkX2NvcmUuZWNvcmUjLy9BY2Nlc3NUeXBlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNwZWNpZmllZEFjY2VzcyIgZVR5cGU9ImVjb3JlOkVFbnVtIG9sZF9jb3JlLmVjb3JlIy8vQWNjZXNzVHlwZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY2Nlc3MiIGVUeXBlPSJlY29yZTpFRW51bSBvbGRfY29yZS5lY29yZSMvL0FjY2Vzc1R5cGUiCisgICAgICAgIGNoYW5nZWFibGU9ImZhbHNlIiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1ldGFkYXRhQ29tcGxldGUiIGVUeXBlPSJlY29yZTpFRW51bSBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0RlZmF1bHRGYWxzZUJvb2xlYW4iLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icGVyc2lzdGVudFR5cGUiIGxvd2VyQm91bmQ9IjEiCisgICAgICAgIGVUeXBlPSIjLy9YbWxQZXJzaXN0ZW50VHlwZSIgY29udGFpbm1lbnQ9InRydWUiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sUGVyc2lzdGVudFR5cGUiIGVTdXBlclR5cGVzPSJvbGRfY29yZS5lY29yZSMvL1htbEVPYmplY3Qgb2xkX2NvcmUuZWNvcmUjLy9JUGVyc2lzdGVudFR5cGUiPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjbGFzcyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VTdHJpbmciLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYXR0cmlidXRlTWFwcGluZ3MiIHVwcGVyQm91bmQ9Ii0xIgorICAgICAgICBlVHlwZT0iIy8vWG1sQXR0cmlidXRlTWFwcGluZyIgY2hhbmdlYWJsZT0iZmFsc2UiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiCisgICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3BlY2lmaWVkQXR0cmlidXRlTWFwcGluZ3MiCisgICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vWG1sQXR0cmlidXRlTWFwcGluZyIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ2aXJ0dWFsQXR0cmlidXRlTWFwcGluZ3MiCisgICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vWG1sQXR0cmlidXRlTWFwcGluZyIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwZXJzaXN0ZW50QXR0cmlidXRlcyIgdXBwZXJCb3VuZD0iLTEiCisgICAgICAgIGVUeXBlPSIjLy9YbWxQZXJzaXN0ZW50QXR0cmlidXRlIiBjaGFuZ2VhYmxlPSJmYWxzZSIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIKKyAgICAgICAgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGVzIgorICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1htbFBlcnNpc3RlbnRBdHRyaWJ1dGUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ2aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZXMiCisgICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vWG1sUGVyc2lzdGVudEF0dHJpYnV0ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbE1hcHBlZFN1cGVyY2xhc3MiIGVTdXBlclR5cGVzPSIjLy9YbWxUeXBlTWFwcGluZyBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lNYXBwZWRTdXBlcmNsYXNzIj4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaWRDbGFzc0ZvclhtbCIgZVR5cGU9IiMvL1htbElkQ2xhc3MiCisgICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sRW50aXR5SW50ZXJuYWwiIGVTdXBlclR5cGVzPSIjLy9YbWxUeXBlTWFwcGluZyAjLy9YbWxFbnRpdHlGb3JYbWwgIy8vWG1sRW50aXR5Ii8+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sRW50aXR5Rm9yWG1sIiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIj4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGFibGVGb3JYbWwiIGVUeXBlPSIjLy9YbWxUYWJsZSIKKyAgICAgICAgdm9sYXRpbGU9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkaXNjcmltaW5hdG9yQ29sdW1uRm9yWG1sIgorICAgICAgICBlVHlwZT0iIy8vWG1sRGlzY3JpbWluYXRvckNvbHVtbiIgdm9sYXRpbGU9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpZENsYXNzRm9yWG1sIiBlVHlwZT0iIy8vWG1sSWRDbGFzcyIKKyAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbmhlcml0YW5jZUZvclhtbCIgZVR5cGU9IiMvL1htbEluaGVyaXRhbmNlIgorICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEVudGl0eSIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSIKKyAgICAgIGVTdXBlclR5cGVzPSJvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lFbnRpdHkiPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzZWNvbmRhcnlUYWJsZXMiIHVwcGVyQm91bmQ9Ii0xIgorICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIG9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSVNlY29uZGFyeVRhYmxlIiBjaGFuZ2VhYmxlPSJmYWxzZSIKKyAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ2aXJ0dWFsU2Vjb25kYXJ5VGFibGVzIgorICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVDbGFzcyBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lTZWNvbmRhcnlUYWJsZSIKKyAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxFbWJlZGRhYmxlIiBlU3VwZXJUeXBlcz0iIy8vWG1sVHlwZU1hcHBpbmcgb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JRW1iZWRkYWJsZSIvPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEF0dHJpYnV0ZU1hcHBpbmciIGFic3RyYWN0PSJ0cnVlIgorICAgICAgZVN1cGVyVHlwZXM9Im9sZF9jb3JlLmVjb3JlIy8vWG1sRU9iamVjdCBvbGRfY29yZS5lY29yZSMvL0lBdHRyaWJ1dGVNYXBwaW5nIj4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icGVyc2lzdGVudEF0dHJpYnV0ZSIgbG93ZXJCb3VuZD0iMSIKKyAgICAgICAgZVR5cGU9IiMvL1htbFBlcnNpc3RlbnRBdHRyaWJ1dGUiIGNvbnRhaW5tZW50PSJ0cnVlIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nIiBlU3VwZXJUeXBlcz0iIy8vWG1sQXR0cmlidXRlTWFwcGluZyIvPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEJhc2ljIiBlU3VwZXJUeXBlcz0iIy8vWG1sQXR0cmlidXRlTWFwcGluZyBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lCYXNpYyAjLy9JWG1sQ29sdW1uTWFwcGluZyIvPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbElkIiBlU3VwZXJUeXBlcz0iIy8vWG1sQXR0cmlidXRlTWFwcGluZyBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lJZCAjLy9JWG1sQ29sdW1uTWFwcGluZyIvPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFRyYW5zaWVudCIgZVN1cGVyVHlwZXM9IiMvL1htbEF0dHJpYnV0ZU1hcHBpbmcgb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JVHJhbnNpZW50Ii8+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sRW1iZWRkZWQiIGVTdXBlclR5cGVzPSIjLy9YbWxBdHRyaWJ1dGVNYXBwaW5nIG9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSUVtYmVkZGVkIi8+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sRW1iZWRkZWRJZCIgZVN1cGVyVHlwZXM9IiMvL1htbEF0dHJpYnV0ZU1hcHBpbmcgb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JRW1iZWRkZWRJZCIvPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFZlcnNpb24iIGVTdXBlclR5cGVzPSIjLy9YbWxBdHRyaWJ1dGVNYXBwaW5nIG9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSVZlcnNpb24gIy8vSVhtbENvbHVtbk1hcHBpbmciLz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdJbnRlcm5hbCIKKyAgICAgIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vWG1sUmVsYXRpb25zaGlwTWFwcGluZyBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcgIy8vWG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nRm9yWG1sICMvL1htbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZyIvPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ0ZvclhtbCIgYWJzdHJhY3Q9InRydWUiCisgICAgICBpbnRlcmZhY2U9InRydWUiPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJqb2luVGFibGVGb3JYbWwiIGVUeXBlPSIjLy9YbWxKb2luVGFibGUiCisgICAgICAgIHZvbGF0aWxlPSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWFwS2V5Rm9yWG1sIiBlVHlwZT0iIy8vWG1sTWFwS2V5IgorICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZyIgYWJzdHJhY3Q9InRydWUiCisgICAgICBpbnRlcmZhY2U9InRydWUiIGVTdXBlclR5cGVzPSJvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmciLz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxPbmVUb01hbnkiIGVTdXBlclR5cGVzPSIjLy9YbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdJbnRlcm5hbCBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lPbmVUb01hbnkiLz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxNYW55VG9NYW55IiBlU3VwZXJUeXBlcz0iIy8vWG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nSW50ZXJuYWwgb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JTWFueVRvTWFueSIvPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFBlcnNpc3RlbnRBdHRyaWJ1dGUiIGVTdXBlclR5cGVzPSJvbGRfY29yZS5lY29yZSMvL1htbEVPYmplY3Qgb2xkX2NvcmUuZWNvcmUjLy9JUGVyc2lzdGVudEF0dHJpYnV0ZSI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFJbnRlcm5hbCIgZVN1cGVyVHlwZXM9Im9sZF9jb3JlLmVjb3JlIy8vWG1sRU9iamVjdCAjLy9QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUZvclhtbCAjLy9QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlSW50ZXJuYWwiCisgICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBlcnNpc3RlbmNlVW5pdERlZmF1bHRzSW50ZXJuYWwiCisgICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9QZXJzaXN0ZW5jZVVuaXREZWZhdWx0c0ludGVybmFsIiBjaGFuZ2VhYmxlPSJmYWxzZSIKKyAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEiIGFic3RyYWN0PSJ0cnVlIgorICAgICAgaW50ZXJmYWNlPSJ0cnVlIiBlU3VwZXJUeXBlcz0ib2xkX2NvcmUuZWNvcmUjLy9JWG1sRU9iamVjdCI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlIgorICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIgdm9sYXRpbGU9InRydWUiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icGVyc2lzdGVuY2VVbml0RGVmYXVsdHMiCisgICAgICAgIGVUeXBlPSIjLy9QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyIgY2hhbmdlYWJsZT0iZmFsc2UiIHZvbGF0aWxlPSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFGb3JYbWwiIGFic3RyYWN0PSJ0cnVlIgorICAgICAgaW50ZXJmYWNlPSJ0cnVlIiBlU3VwZXJUeXBlcz0ib2xkX2NvcmUuZWNvcmUjLy9JWG1sRU9iamVjdCI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlRm9yWG1sIgorICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIgdm9sYXRpbGU9InRydWUiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icGVyc2lzdGVuY2VVbml0RGVmYXVsdHNGb3JYbWwiCisgICAgICAgIGVUeXBlPSIjLy9QZXJzaXN0ZW5jZVVuaXREZWZhdWx0c0ZvclhtbCIgdm9sYXRpbGU9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c0ludGVybmFsIiBlU3VwZXJUeXBlcz0ib2xkX2NvcmUuZWNvcmUjLy9YbWxFT2JqZWN0ICMvL1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzICMvL1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzRm9yWG1sIj4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2NoZW1hSW50ZXJuYWwiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2F0YWxvZ0ludGVybmFsIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjY2Vzc0ludGVybmFsIiBlVHlwZT0iZWNvcmU6RUVudW0gb2xkX2NvcmUuZWNvcmUjLy9BY2Nlc3NUeXBlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNhc2NhZGVQZXJzaXN0SW50ZXJuYWwiCisgICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIiBhYnN0cmFjdD0idHJ1ZSIKKyAgICAgIGludGVyZmFjZT0idHJ1ZSIgZVN1cGVyVHlwZXM9Im9sZF9jb3JlLmVjb3JlIy8vSVhtbEVPYmplY3QiPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzY2hlbWEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciCisgICAgICAgIHZvbGF0aWxlPSJ0cnVlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNhdGFsb2ciIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciCisgICAgICAgIHZvbGF0aWxlPSJ0cnVlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjY2VzcyIgZVR5cGU9ImVjb3JlOkVFbnVtIG9sZF9jb3JlLmVjb3JlIy8vQWNjZXNzVHlwZSIKKyAgICAgICAgdm9sYXRpbGU9InRydWUiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2FzY2FkZVBlcnNpc3QiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIgorICAgICAgICB2b2xhdGlsZT0idHJ1ZSIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c0ZvclhtbCIgYWJzdHJhY3Q9InRydWUiCisgICAgICBpbnRlcmZhY2U9InRydWUiIGVTdXBlclR5cGVzPSJvbGRfY29yZS5lY29yZSMvL0lYbWxFT2JqZWN0Ij4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2NoZW1hRm9yWG1sIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIgorICAgICAgICB2b2xhdGlsZT0idHJ1ZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjYXRhbG9nRm9yWG1sIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIgorICAgICAgICB2b2xhdGlsZT0idHJ1ZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY2Nlc3NGb3JYbWwiIGVUeXBlPSJlY29yZTpFRW51bSBvbGRfY29yZS5lY29yZSMvL0FjY2Vzc1R5cGUiCisgICAgICAgIHZvbGF0aWxlPSJ0cnVlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNhc2NhZGVQZXJzaXN0Rm9yWG1sIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIKKyAgICAgICAgdm9sYXRpbGU9InRydWUiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sVGFibGUiIGVTdXBlclR5cGVzPSIjLy9BYnN0cmFjdFhtbFRhYmxlIG9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSVRhYmxlIi8+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQWJzdHJhY3RYbWxOYW1lZENvbHVtbiIgYWJzdHJhY3Q9InRydWUiCisgICAgICBlU3VwZXJUeXBlcz0ib2xkX2NvcmUuZWNvcmUjLy9YbWxFT2JqZWN0IG9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSU5hbWVkQ29sdW1uIj4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3BlY2lmaWVkTmFtZUZvclhtbCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIKKyAgICAgICAgdm9sYXRpbGU9InRydWUiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29sdW1uRGVmaW5pdGlvbkZvclhtbCIKKyAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIgdm9sYXRpbGU9InRydWUiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQWJzdHJhY3RYbWxDb2x1bW4iIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vQWJzdHJhY3RYbWxOYW1lZENvbHVtbiBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lBYnN0cmFjdENvbHVtbiI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVuaXF1ZUZvclhtbCIgZVR5cGU9ImVjb3JlOkVFbnVtIG9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvRGVmYXVsdEZhbHNlQm9vbGVhbiIKKyAgICAgICAgdm9sYXRpbGU9InRydWUiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibnVsbGFibGVGb3JYbWwiIGVUeXBlPSJlY29yZTpFRW51bSBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0RlZmF1bHRUcnVlQm9vbGVhbiIKKyAgICAgICAgdm9sYXRpbGU9InRydWUiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaW5zZXJ0YWJsZUZvclhtbCIgZVR5cGU9ImVjb3JlOkVFbnVtIG9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvRGVmYXVsdFRydWVCb29sZWFuIgorICAgICAgICB2b2xhdGlsZT0idHJ1ZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1cGRhdGFibGVGb3JYbWwiIGVUeXBlPSJlY29yZTpFRW51bSBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0RlZmF1bHRUcnVlQm9vbGVhbiIKKyAgICAgICAgdm9sYXRpbGU9InRydWUiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3BlY2lmaWVkVGFibGVGb3JYbWwiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciCisgICAgICAgIHZvbGF0aWxlPSJ0cnVlIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbENvbHVtbiIgZVN1cGVyVHlwZXM9IiMvL0Fic3RyYWN0WG1sQ29sdW1uIG9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSUNvbHVtbiI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imxlbmd0aEZvclhtbCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUludCIKKyAgICAgICAgdm9sYXRpbGU9InRydWUiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IjI1NSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcmVjaXNpb25Gb3JYbWwiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VJbnQiCisgICAgICAgIHZvbGF0aWxlPSJ0cnVlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNjYWxlRm9yWG1sIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FSW50IgorICAgICAgICB2b2xhdGlsZT0idHJ1ZSIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxKb2luQ29sdW1uIiBlU3VwZXJUeXBlcz0iIy8vQWJzdHJhY3RYbWxDb2x1bW4gb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JSm9pbkNvbHVtbiI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lRm9yWG1sIgorICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIiB2b2xhdGlsZT0idHJ1ZSIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJWG1sQ29sdW1uTWFwcGluZyIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSIKKyAgICAgIGVTdXBlclR5cGVzPSJvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lDb2x1bW5NYXBwaW5nIj4KKyAgICA8ZU9wZXJhdGlvbnMgbmFtZT0ibWFrZUNvbHVtbkZvclhtbE5vbk51bGwiLz4KKyAgICA8ZU9wZXJhdGlvbnMgbmFtZT0ibWFrZUNvbHVtbkZvclhtbE51bGwiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29sdW1uRm9yWG1sIiBlVHlwZT0iIy8vWG1sQ29sdW1uIgorICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbE1hbnlUb09uZSIgZVN1cGVyVHlwZXM9IiMvL1htbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcgb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JTWFueVRvT25lIi8+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sT25lVG9PbmUiIGVTdXBlclR5cGVzPSIjLy9YbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nIG9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSU9uZVRvT25lIi8+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZyIgYWJzdHJhY3Q9InRydWUiCisgICAgICBlU3VwZXJUeXBlcz0iIy8vWG1sUmVsYXRpb25zaGlwTWFwcGluZyBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nIi8+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sUmVsYXRpb25zaGlwTWFwcGluZyIgYWJzdHJhY3Q9InRydWUiCisgICAgICBlU3VwZXJUeXBlcz0iIy8vWG1sQXR0cmlidXRlTWFwcGluZyBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lSZWxhdGlvbnNoaXBNYXBwaW5nIi8+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sSm9pblRhYmxlIiBlU3VwZXJUeXBlcz0iIy8vQWJzdHJhY3RYbWxUYWJsZSBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lKb2luVGFibGUiLz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBYnN0cmFjdFhtbFRhYmxlIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9Im9sZF9jb3JlLmVjb3JlIy8vWG1sRU9iamVjdCBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lUYWJsZSI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNwZWNpZmllZE5hbWVGb3JYbWwiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciCisgICAgICAgIHZvbGF0aWxlPSJ0cnVlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNwZWNpZmllZENhdGFsb2dGb3JYbWwiCisgICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciIHZvbGF0aWxlPSJ0cnVlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNwZWNpZmllZFNjaGVtYUZvclhtbCIKKyAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIgdm9sYXRpbGU9InRydWUiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sT3ZlcnJpZGUiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0ib2xkX2NvcmUuZWNvcmUjLy9YbWxFT2JqZWN0IG9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSU92ZXJyaWRlIi8+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sQXR0cmlidXRlT3ZlcnJpZGUiIGVTdXBlclR5cGVzPSIjLy9YbWxPdmVycmlkZSBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lBdHRyaWJ1dGVPdmVycmlkZSAjLy9JWG1sQ29sdW1uTWFwcGluZyIvPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEFzc29jaWF0aW9uT3ZlcnJpZGUiIGVTdXBlclR5cGVzPSIjLy9YbWxPdmVycmlkZSBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lBc3NvY2lhdGlvbk92ZXJyaWRlIi8+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sRGlzY3JpbWluYXRvckNvbHVtbiIgZVN1cGVyVHlwZXM9IiMvL0Fic3RyYWN0WG1sTmFtZWRDb2x1bW4gb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JRGlzY3JpbWluYXRvckNvbHVtbiI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRpc2NyaW1pbmF0b3JUeXBlRm9yWG1sIgorICAgICAgICBlVHlwZT0iZWNvcmU6RUVudW0gb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9EaXNjcmltaW5hdG9yVHlwZSIgdm9sYXRpbGU9InRydWUiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3BlY2lmaWVkTGVuZ3RoRm9yWG1sIgorICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIHBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRUludCIKKyAgICAgICAgdm9sYXRpbGU9InRydWUiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9Ii0xIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFNlY29uZGFyeVRhYmxlIiBlU3VwZXJUeXBlcz0iIy8vQWJzdHJhY3RYbWxUYWJsZSBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lTZWNvbmRhcnlUYWJsZSIvPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFByaW1hcnlLZXlKb2luQ29sdW1uIiBlU3VwZXJUeXBlcz0iIy8vQWJzdHJhY3RYbWxOYW1lZENvbHVtbiBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lQcmltYXJ5S2V5Sm9pbkNvbHVtbiI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lRm9yWG1sIgorICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIiB2b2xhdGlsZT0idHJ1ZSIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxHZW5lcmF0ZWRWYWx1ZSIgZVN1cGVyVHlwZXM9Im9sZF9jb3JlLmVjb3JlIy8vWG1sRU9iamVjdCBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lHZW5lcmF0ZWRWYWx1ZSIvPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEdlbmVyYXRvciIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSJvbGRfY29yZS5lY29yZSMvL1htbEVPYmplY3Qgb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JR2VuZXJhdG9yIi8+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sU2VxdWVuY2VHZW5lcmF0b3IiIGVTdXBlclR5cGVzPSIjLy9YbWxHZW5lcmF0b3Igb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JU2VxdWVuY2VHZW5lcmF0b3IiLz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxUYWJsZUdlbmVyYXRvciIgZVN1cGVyVHlwZXM9IiMvL1htbEdlbmVyYXRvciBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lUYWJsZUdlbmVyYXRvciIvPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFic3RyYWN0WG1sUXVlcnkiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0ib2xkX2NvcmUuZWNvcmUjLy9YbWxFT2JqZWN0IG9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSVF1ZXJ5Ii8+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sTmFtZWRRdWVyeSIgZVN1cGVyVHlwZXM9IiMvL0Fic3RyYWN0WG1sUXVlcnkgb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JTmFtZWRRdWVyeSIvPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbE5hbWVkTmF0aXZlUXVlcnkiIGVTdXBlclR5cGVzPSIjLy9BYnN0cmFjdFhtbFF1ZXJ5IG9sZF9jb3JlLmVjb3JlIy8vbWFwcGluZ3MvSU5hbWVkTmF0aXZlUXVlcnkiLz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxRdWVyeUhpbnQiIGVTdXBlclR5cGVzPSJvbGRfY29yZS5lY29yZSMvL1htbEVPYmplY3Qgb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9JUXVlcnlIaW50Ii8+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sVW5pcXVlQ29uc3RyYWludCIgZVN1cGVyVHlwZXM9Im9sZF9jb3JlLmVjb3JlIy8vWG1sRU9iamVjdCBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lVbmlxdWVDb25zdHJhaW50Ii8+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sQ2FzY2FkZSIgZVN1cGVyVHlwZXM9Im9sZF9jb3JlLmVjb3JlIy8vWG1sRU9iamVjdCBvbGRfY29yZS5lY29yZSMvL21hcHBpbmdzL0lDYXNjYWRlIi8+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sSWRDbGFzcyIgZVN1cGVyVHlwZXM9Im9sZF9jb3JlLmVjb3JlIy8vWG1sRU9iamVjdCI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIHBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRVN0cmluZyIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxJbmhlcml0YW5jZSIgZVN1cGVyVHlwZXM9Im9sZF9jb3JlLmVjb3JlIy8vWG1sRU9iamVjdCI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0cmF0ZWd5IiBlVHlwZT0iZWNvcmU6RUVudW0gb2xkX2NvcmUuZWNvcmUjLy9tYXBwaW5ncy9Jbmhlcml0YW5jZVR5cGUiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sTWFwS2V5IiBlU3VwZXJUeXBlcz0ib2xkX2NvcmUuZWNvcmUjLy9YbWxFT2JqZWN0Ij4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgorICA8L2VDbGFzc2lmaWVycz4KKzwvZWNvcmU6RVBhY2thZ2U+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9tb2RlbC9vbGRfcGVyc2lzdGVuY2UuZWNvcmUgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9tb2RlbC9vbGRfcGVyc2lzdGVuY2UuZWNvcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRlY2NiMQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL21vZGVsL29sZF9wZXJzaXN0ZW5jZS5lY29yZQpAQCAtMCwwICsxLDcwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGVjb3JlOkVQYWNrYWdlIHhtaTp2ZXJzaW9uPSIyLjAiCisgICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiBuYW1lPSJwZXJzaXN0ZW5jZSIKKyAgICBuc1VSST0icGVyc2lzdGVuY2UueG1pIiBuc1ByZWZpeD0ib3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGVudC5wZXJzaXN0ZW5jZSI+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUGVyc2lzdGVuY2VYbWxSb290Q29udGVudE5vZGUiIGVTdXBlclR5cGVzPSJvbGRfY29yZS5lY29yZSMvL1htbEVPYmplY3Qgb2xkX2NvcmUuZWNvcmUjLy9JSnBhUm9vdENvbnRlbnROb2RlIj4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icGVyc2lzdGVuY2UiIGVUeXBlPSIjLy9QZXJzaXN0ZW5jZSIKKyAgICAgICAgZU9wcG9zaXRlPSIjLy9QZXJzaXN0ZW5jZS9yb290Ii8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBlcnNpc3RlbmNlIiBlU3VwZXJUeXBlcz0ib2xkX2NvcmUuZWNvcmUjLy9YbWxFT2JqZWN0IG9sZF9jb3JlLmVjb3JlIy8vSUpwYUNvbnRlbnROb2RlIj4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icGVyc2lzdGVuY2VVbml0cyIgdXBwZXJCb3VuZD0iLTEiCisgICAgICAgIGVUeXBlPSIjLy9QZXJzaXN0ZW5jZVVuaXQiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmVyc2lvbiIgdW5pcXVlPSJmYWxzZSIKKyAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL1ZlcnNpb24iLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icm9vdCIgb3JkZXJlZD0iZmFsc2UiIHVuaXF1ZT0iZmFsc2UiCisgICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9QZXJzaXN0ZW5jZVhtbFJvb3RDb250ZW50Tm9kZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgorICAgICAgICBlT3Bwb3NpdGU9IiMvL1BlcnNpc3RlbmNlWG1sUm9vdENvbnRlbnROb2RlL3BlcnNpc3RlbmNlIi8+CisgIDwvZUNsYXNzaWZpZXJzPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBlcnNpc3RlbmNlVW5pdCIgZVN1cGVyVHlwZXM9Im9sZF9jb3JlLmVjb3JlIy8vWG1sRU9iamVjdCBvbGRfY29yZS5lY29yZSMvL0lKcGFDb250ZW50Tm9kZSI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlc2NyaXB0aW9uIiB1bmlxdWU9ImZhbHNlIgorICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcm92aWRlciIgdW5pcXVlPSJmYWxzZSIKKyAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ianRhRGF0YVNvdXJjZSIgdW5pcXVlPSJmYWxzZSIKKyAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibm9uSnRhRGF0YVNvdXJjZSIgdW5pcXVlPSJmYWxzZSIKKyAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWFwcGluZ0ZpbGVzIiB1bmlxdWU9ImZhbHNlIgorICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01hcHBpbmdGaWxlUmVmIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImphckZpbGVzIiB1bmlxdWU9ImZhbHNlIgorICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY2xhc3NlcyIgdW5pcXVlPSJmYWxzZSIKKyAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9KYXZhQ2xhc3NSZWYiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXhjbHVkZVVubGlzdGVkQ2xhc3NlcyIKKyAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgorICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcm9wZXJ0aWVzIiBlVHlwZT0iIy8vUHJvcGVydGllcyIKKyAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiB1bmlxdWU9ImZhbHNlIiBsb3dlckJvdW5kPSIxIgorICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0cmFuc2FjdGlvblR5cGUiIHVuaXF1ZT0iZmFsc2UiCisgICAgICAgIGVUeXBlPSIjLy9QZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IkpUQSIgdW5zZXR0YWJsZT0idHJ1ZSIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNYXBwaW5nRmlsZVJlZiIgZVN1cGVyVHlwZXM9Im9sZF9jb3JlLmVjb3JlIy8vWG1sRU9iamVjdCI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpbGVOYW1lIiBvcmRlcmVkPSJmYWxzZSIKKyAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VTdHJpbmciCisgICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJKYXZhQ2xhc3NSZWYiIGVTdXBlclR5cGVzPSJvbGRfY29yZS5lY29yZSMvL1htbEVPYmplY3QiPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJqYXZhQ2xhc3MiIG9yZGVyZWQ9ImZhbHNlIgorICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIHBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRVN0cmluZyIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9wZXJ0aWVzIiBlU3VwZXJUeXBlcz0ib2xkX2NvcmUuZWNvcmUjLy9YbWxFT2JqZWN0Ij4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJvcGVydGllcyIgdXBwZXJCb3VuZD0iLTEiCisgICAgICAgIGVUeXBlPSIjLy9Qcm9wZXJ0eSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9wZXJ0eSIgZVN1cGVyVHlwZXM9Im9sZF9jb3JlLmVjb3JlIy8vWG1sRU9iamVjdCI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIHVuaXF1ZT0iZmFsc2UiIGxvd2VyQm91bmQ9IjEiCisgICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlIiB1bmlxdWU9ImZhbHNlIiBsb3dlckJvdW5kPSIxIgorICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IlBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSI+CisgICAgPGVMaXRlcmFscyBuYW1lPSJKVEEiLz4KKyAgICA8ZUxpdGVyYWxzIG5hbWU9IlJFU09VUkNFX0xPQ0FMIiB2YWx1ZT0iMSIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGVPYmplY3QiCisgICAgICBpbnN0YW5jZUNsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3IiLz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJWZXJzaW9uIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyIvPgorPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL21vZGVsL3BlcnNpc3RlbmNlLmVjb3JlIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvbW9kZWwvcGVyc2lzdGVuY2UuZWNvcmUKaW5kZXggYjI2YzM2Ny4uOWZmNGQxZSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvbW9kZWwvcGVyc2lzdGVuY2UuZWNvcmUKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvbW9kZWwvcGVyc2lzdGVuY2UuZWNvcmUKQEAgLTIsMjEgKzIsMTQgQEAKIDxlY29yZTpFUGFja2FnZSB4bWk6dmVyc2lvbj0iMi4wIgogICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKICAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgbmFtZT0icGVyc2lzdGVuY2UiCi0gICAgbnNVUkk9InBlcnNpc3RlbmNlLnhtaSIgbnNQcmVmaXg9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLmNvbnRlbnQucGVyc2lzdGVuY2UiPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBlcnNpc3RlbmNlWG1sUm9vdENvbnRlbnROb2RlIiBlU3VwZXJUeXBlcz0iY29yZS5lY29yZSMvL1htbEVPYmplY3QgY29yZS5lY29yZSMvL0lKcGFSb290Q29udGVudE5vZGUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwZXJzaXN0ZW5jZSIgZVR5cGU9IiMvL1BlcnNpc3RlbmNlIgotICAgICAgICBlT3Bwb3NpdGU9IiMvL1BlcnNpc3RlbmNlL3Jvb3QiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUGVyc2lzdGVuY2UiIGVTdXBlclR5cGVzPSJjb3JlLmVjb3JlIy8vWG1sRU9iamVjdCI+CisgICAgbnNVUkk9ImpwdC5wZXJzaXN0ZW5jZS54bWkiIG5zUHJlZml4PSJvcmcuZWNsaXBzZS5qcHQuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZSI+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUGVyc2lzdGVuY2UiPgogICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwZXJzaXN0ZW5jZVVuaXRzIiB1cHBlckJvdW5kPSItMSIKICAgICAgICAgZVR5cGU9IiMvL1BlcnNpc3RlbmNlVW5pdCIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgogICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2ZXJzaW9uIiB1bmlxdWU9ImZhbHNlIgogICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vVmVyc2lvbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyb290IiBvcmRlcmVkPSJmYWxzZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL1BlcnNpc3RlbmNlWG1sUm9vdENvbnRlbnROb2RlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0gICAgICAgIGVPcHBvc2l0ZT0iIy8vUGVyc2lzdGVuY2VYbWxSb290Q29udGVudE5vZGUvcGVyc2lzdGVuY2UiLz4KICAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUGVyc2lzdGVuY2VVbml0IiBlU3VwZXJUeXBlcz0iY29yZS5lY29yZSMvL1htbEVPYmplY3QiPgorICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBlcnNpc3RlbmNlVW5pdCI+CiAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlc2NyaXB0aW9uIiB1bmlxdWU9ImZhbHNlIgogICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgogICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcm92aWRlciIgdW5pcXVlPSJmYWxzZSIKQEAgLTQxLDIwICszNCwyMCBAQAogICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0cmFuc2FjdGlvblR5cGUiIHVuaXF1ZT0iZmFsc2UiCiAgICAgICAgIGVUeXBlPSIjLy9QZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IkpUQSIgdW5zZXR0YWJsZT0idHJ1ZSIvPgogICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNYXBwaW5nRmlsZVJlZiIgZVN1cGVyVHlwZXM9ImNvcmUuZWNvcmUjLy9YbWxFT2JqZWN0Ij4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNYXBwaW5nRmlsZVJlZiI+CiAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpbGVOYW1lIiBvcmRlcmVkPSJmYWxzZSIKICAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VTdHJpbmciCiAgICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgogICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJKYXZhQ2xhc3NSZWYiIGVTdXBlclR5cGVzPSJjb3JlLmVjb3JlIy8vWG1sRU9iamVjdCI+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSmF2YUNsYXNzUmVmIj4KICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iamF2YUNsYXNzIiBvcmRlcmVkPSJmYWxzZSIKICAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VTdHJpbmciLz4KICAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvcGVydGllcyIgZVN1cGVyVHlwZXM9ImNvcmUuZWNvcmUjLy9YbWxFT2JqZWN0Ij4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9wZXJ0aWVzIj4KICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJvcGVydGllcyIgdXBwZXJCb3VuZD0iLTEiCiAgICAgICAgIGVUeXBlPSIjLy9Qcm9wZXJ0eSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgogICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9wZXJ0eSIgZVN1cGVyVHlwZXM9ImNvcmUuZWNvcmUjLy9YbWxFT2JqZWN0Ij4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9wZXJ0eSI+CiAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIHVuaXF1ZT0iZmFsc2UiIGxvd2VyQm91bmQ9IjEiCiAgICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+CiAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlIiB1bmlxdWU9ImZhbHNlIiBsb3dlckJvdW5kPSIxIgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvcGx1Z2luLnhtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3BsdWdpbi54bWwKaW5kZXggODUzMWEzZC4uZjY0NWE1OSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvcGx1Z2luLnhtbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9wbHVnaW4ueG1sCkBAIC0xODEsNiArMTgxLDE0IEBACiAJCTwvdmFsaWRhdG9yPgogCQkKIAk8L2V4dGVuc2lvbj4KKyA8ZXh0ZW5zaW9uCisgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5nZW5lcmF0ZWRfcGFja2FnZSI+CisgICAgPHBhY2thZ2UKKyAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLkpwYUphdmFNYXBwaW5nc1BhY2thZ2UiCisgICAgICAgICAgZ2VuTW9kZWw9Im1vZGVsL29sZF9jb3JlTW9kZWxzLmdlbm1vZGVsIgorICAgICAgICAgIHVyaT0iaHR0cDovL29yZy5lY2xpcHNlLmpwdC5jb3JlL29sZF9qYXZhLmVjb3JlIj4KKyAgICA8L3BhY2thZ2U+CisgPC9leHRlbnNpb24+CiAJCiAJCiA8L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9JSnBhQ29udGVudE5vZGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9JSnBhQ29udGVudE5vZGUuamF2YQppbmRleCA1ZDgzYzEyLi41Njc2ZDJlIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvSUpwYUNvbnRlbnROb2RlLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL0lKcGFDb250ZW50Tm9kZS5qYXZhCkBAIC0xLDggKzEsOCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgpAQCAtMzUsMTIgKzM1LDYgQEAKIAlPYmplY3QgZ2V0SWQoKTsKIAogCS8qKgotCSAqIFJldHVybiB0aGUgdGV4dCByYW5nZSBmb3IgdGhpcyBjb250ZW50Tm9kZS4gIFRoaXMgaXMgdGhlIGFsbC1pbmNsdXNpdmUKLQkgKiB0ZXh0IHJhbmdlIHRvIGJlIHVzZWQgZm9yIGZpbmRpbmcgYSBwYXJ0aWN1bGFyIGNvbnRlbnQgbm9kZSBnaXZlbiBhIHNvdXJjZSBsb2NhdGlvbi4KLQkgKi8KLQlJVGV4dFJhbmdlIGZ1bGxUZXh0UmFuZ2UoKTsKLQotCS8qKgogCSAqIFJldHVybiB0aGUgdGV4dCByYW5nZSB0byBiZSB1c2VkIGZvciBzZWxlY3Rpb24uIFRoaXMgaXMgdGhlIHRleHQgeW91IHdhbnQgc2VsZWN0ZWQKIAkgKiB3aGVuIHNlbGVjdGluZyB0aGUgb2JqZWN0IGluIHRoZSBlZGl0b3IuIFN0cnVjdHVyZVZpZXcgdXNlcyB0aGlzIGZvciBzZWxlY3Rpb24KIAkgKiBmcm9tIHRoZSBzdHJ1Y3R1cmUgdG8gdGhlIHNvdXJjZSBlZGl0b3IuCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvSUpwYURhdGFTb3VyY2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9JSnBhRGF0YVNvdXJjZS5qYXZhCmluZGV4IGEyNjdhOGYuLjRhYWU1MWMgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9JSnBhRGF0YVNvdXJjZS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9JSnBhRGF0YVNvdXJjZS5qYXZhCkBAIC05LDggKzksNiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWw7CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwuQ29ubmVjdGlvbjsKLQogLyoqCiAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SUpwYSBEYXRhIFNvdXJjZTwvYj48L2VtPicuCkBAIC0zMyw1ICszMSw3IEBACiAKIAl2b2lkIHNldENvbm5lY3Rpb25Qcm9maWxlTmFtZShTdHJpbmcgbmV3Q29ubmVjdGlvblByb2ZpbGVOYW1lKTsKIAotCUNvbm5lY3Rpb24gZ2V0Q29ubmVjdGlvbigpOworCWJvb2xlYW4gaXNDb25uZWN0ZWQoKTsKKworCWJvb2xlYW4gaGFzQUNvbm5lY3Rpb24oKTsKIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9JSnBhRU9iamVjdC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL0lKcGFFT2JqZWN0LmphdmEKaW5kZXggODBhMmFhYS4uZWUwYzgxMCAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL0lKcGFFT2JqZWN0LmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL0lKcGFFT2JqZWN0LmphdmEKQEAgLTM2LDQgKzM2LDggQEAKIAkgKiBSZXR1cm4gdGhlIHJlc291cmNlIHRoYXQgbW9zdCBkaXJlY3RseSBjb250YWlucyB0aGlzIG9iamVjdAogCSAqLwogCUlSZXNvdXJjZSBnZXRSZXNvdXJjZSgpOworCisJSUpwYUZhY3RvcnkganBhRmFjdG9yeSgpOworCisJSUpwYVBsYXRmb3JtIGpwYVBsYXRmb3JtKCk7CiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvSUpwYUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9JSnBhRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3ZDM4OGUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvSUpwYUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDY0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24gYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLklKYXZhQmFzaWM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLklKYXZhRW1iZWRkYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSUphdmFFbWJlZGRlZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSUphdmFFbWJlZGRlZElkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5JSmF2YUVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSUphdmFJZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSUphdmFNYW55VG9NYW55OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5JSmF2YU1hbnlUb09uZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSUphdmFNYXBwZWRTdXBlcmNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5JSmF2YU9uZVRvTWFueTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSUphdmFPbmVUb09uZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSUphdmFUcmFuc2llbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLklKYXZhVmVyc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qZHR1dGlsaXR5LkF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qZHR1dGlsaXR5LlR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucGxhdGZvcm0uQmFzZUpwYUZhY3Rvcnk7CisKKy8qKgorICogVXNlIElKcGFGYWN0b3J5IHRvIGNyZWF0ZSBhbnkgSUphdmFUeXBlTWFwcGluZyBvciBJSmF2YUF0dHJpYnV0ZU1hcHBpbmdzLiAgVGhpcyBpcyBuZWNlc3NhcnkKKyAqIHNvIHRoYXQgcGxhdGZvcm1zIGNhbiBleHRlbmQgdGhlIGphdmEgbW9kZWwgd2l0aCB0aGVpciBvd24gYW5ub3RhdGlvbnMuIAorICogSUphdmFUeXBlTWFwcGluZ1Byb3ZpZGVyIGFuZCBJSmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlciB1c2UgdGhpcyBmYWN0b3J5LgorICogU2VlIElKcGFQbGF0Zm9ybS5qYXZhVHlwZU1hcHBpbmdQcm92aWRlcnMoKSBhbmQgSUpwYVBsYXRmb3JtLmphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXJzKCkKKyAqIGZvciBjcmVhdGluZyBuZXcgbWFwcGluZ3MgdHlwZXMuCisgKiBAc2VlIEJhc2VKcGFGYWN0b3J5CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSUpwYUZhY3RvcnkKK3sKKwlJSmF2YUVudGl0eSBjcmVhdGVKYXZhRW50aXR5KFR5cGUgdHlwZSk7CisJCisJSUphdmFFbWJlZGRhYmxlIGNyZWF0ZUphdmFFbWJlZGRhYmxlKFR5cGUgdHlwZSk7CisJCisJSUphdmFNYXBwZWRTdXBlcmNsYXNzIGNyZWF0ZUphdmFNYXBwZWRTdXBlcmNsYXNzKFR5cGUgdHlwZSk7CisJCQorCUlKYXZhQmFzaWMgY3JlYXRlSmF2YUJhc2ljKEF0dHJpYnV0ZSBhdHRyaWJ1dGUpOworCQorCUlKYXZhRW1iZWRkZWQgY3JlYXRlSmF2YUVtYmVkZGVkKEF0dHJpYnV0ZSBhdHRyaWJ1dGUpOworCQorCUlKYXZhRW1iZWRkZWRJZCBjcmVhdGVKYXZhRW1iZWRkZWRJZChBdHRyaWJ1dGUgYXR0cmlidXRlKTsKKwkKKwlJSmF2YUlkIGNyZWF0ZUphdmFJZChBdHRyaWJ1dGUgYXR0cmlidXRlKTsKKwkKKwlJSmF2YU1hbnlUb01hbnkgY3JlYXRlSmF2YU1hbnlUb01hbnkoQXR0cmlidXRlIGF0dHJpYnV0ZSk7CisJCisJSUphdmFNYW55VG9PbmUgY3JlYXRlSmF2YU1hbnlUb09uZShBdHRyaWJ1dGUgYXR0cmlidXRlKTsKKwkKKwlJSmF2YU9uZVRvTWFueSBjcmVhdGVKYXZhT25lVG9NYW55KEF0dHJpYnV0ZSBhdHRyaWJ1dGUpOworCQorCUlKYXZhT25lVG9PbmUgY3JlYXRlSmF2YU9uZVRvT25lKEF0dHJpYnV0ZSBhdHRyaWJ1dGUpOworCQorCUlKYXZhVHJhbnNpZW50IGNyZWF0ZUphdmFUcmFuc2llbnQoQXR0cmlidXRlIGF0dHJpYnV0ZSk7CisJCisJSUphdmFWZXJzaW9uIGNyZWF0ZUphdmFWZXJzaW9uKEF0dHJpYnV0ZSBhdHRyaWJ1dGUpOworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL0lKcGFGaWxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvSUpwYUZpbGUuamF2YQppbmRleCBmNTUzNDNiLi5mNzQ4NDVhIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvSUpwYUZpbGUuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvSUpwYUZpbGUuamF2YQpAQCAtMSw4ICsxLDggQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KQEAgLTM1LDYgKzM1LDggQEAKIAkgKi8KIAlJSnBhUm9vdENvbnRlbnROb2RlIGdldENvbnRlbnQoKTsKIAorCXZvaWQgc2V0Q29udGVudChJSnBhUm9vdENvbnRlbnROb2RlIGNvbnRlbnQpOworCiAJLyoqCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9JSnBhRmlsZUNvbnRlbnRQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL0lKcGFGaWxlQ29udGVudFByb3ZpZGVyLmphdmEKaW5kZXggNzViNTY1MC4uYzZlNmM0OCAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL0lKcGFGaWxlQ29udGVudFByb3ZpZGVyLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL0lKcGFGaWxlQ29udGVudFByb3ZpZGVyLmphdmEKQEAgLTEsMTUgKzEsMTQgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsOwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CiAKIC8qKgogICogQSBKcGFQcm9qZWN0IGNvcnJlc3BvbmRzIHRvIGFuIElQcm9qZWN0IGFuZCBjb250YWludHMgb2YgSnBhRmlsZXMuCkBAIC0yOCw3ICsyNyw3IEBACiAJICogVGhlIGZpbGUgcGFzc2VkIGluIHdpbGwgaGF2ZSBhIGNvbnRlbnRUeXBlIHRoYXQgbWF0Y2hlcwogCSAqIHRoZSBvbmUgcmV0dXJuZWQgYnkgdGhlIGNvbnRlbnRUeXBlKCkgbWV0aG9kLgogCSAqLwotCUlKcGFSb290Q29udGVudE5vZGUgYnVpbGRSb290Q29udGVudChJRmlsZSBmaWxlKTsKKwlJSnBhUm9vdENvbnRlbnROb2RlIGJ1aWxkUm9vdENvbnRlbnQoSUpwYUZpbGUganBhRmlsZSk7CiAJCiAJLyoqCiAJICogUmV0dXJuIHRoZSBjb250ZW50VHlwZSBvZiB0aGUgZmlsZSB0byBiZSBpbmNsdWRlZCBpbiB0aGUgSnBhUHJvamVjdC4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9JSnBhUGxhdGZvcm0uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9JSnBhUGxhdGZvcm0uamF2YQppbmRleCBiYjU4ZTJjLi4xZjZjZDdlIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvSUpwYVBsYXRmb3JtLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL0lKcGFQbGF0Zm9ybS5qYXZhCkBAIC05LDExICs5LDE0IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbDsKIAotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5JRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLklKYXZhQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEuSUphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLklKYXZhVHlwZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLklKYXZhVHlwZU1hcHBpbmdQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5wbGF0Zm9ybS5JQ29udGV4dDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwpAQCAtNTUsNiArNTgsOCBAQAogCSAqLwogCXZvaWQgc2V0UHJvamVjdChJSnBhUHJvamVjdCBqcGFQcm9qZWN0KTsKIAorCUlKcGFGYWN0b3J5IGdldEpwYUZhY3RvcnkoKTsKKwogCS8vICoqKioqKioqKiogUGVyc2lzdGVuY2UgVW5pdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCWJvb2xlYW4gY29udGFpbnNQZXJzaXN0ZW5jZVVuaXROYW1lZChTdHJpbmcgbmFtZSk7CiAKQEAgLTc3LDEyICs4MiwzNSBAQAogCUl0ZXJhdG9yPElKcGFGaWxlPiB2YWxpZFBlcnNpc3RlbmNlWG1sRmlsZXMoKTsKIAogCS8qKgotCSAqIFJldHVybiBhIGNvbGxlY3Rpb24gb2YgSUpwYUZpbGVDb250ZW50UHJvdmlkZXJzLiAgVGhlc2Ugd2lsbCBiZSB1c2VkIHRvIAorCSAqIFJldHVybiBhbiBJdGVyYXRvciBvZiBJSnBhRmlsZUNvbnRlbnRQcm92aWRlcnMuICBUaGVzZSB3aWxsIGJlIHVzZWQgdG8gCiAJICogZGV0ZXJtaW5lIHdoaWNoIGZpbGVzIHdpbGwgYmUgcmVhZCBmcm9tIGFuIElQcm9qZWN0IGJhc2VkIG9uIGNvbnRlbnRUeXBlLgogCSAqIFRoZXNlIGNvbnRlbnRQcm92aWRlcnMgc2hvdWxkIGhhdmUgdW5pcXVlIGNvbnRlbnRUeXBlcy4gCi0JICogQHJldHVybgogCSAqLwotCUNvbGxlY3Rpb248SUpwYUZpbGVDb250ZW50UHJvdmlkZXI+IGpwYUZpbGVDb250ZW50UHJvdmlkZXJzKCk7CisJSXRlcmF0b3I8SUpwYUZpbGVDb250ZW50UHJvdmlkZXI+IGpwYUZpbGVDb250ZW50UHJvdmlkZXJzKCk7CisKKwlJSnBhRmlsZUNvbnRlbnRQcm92aWRlciBmaWxlQ29udGVudFByb3ZpZGVyKFN0cmluZyBjb250ZW50VHlwZUlkKTsKKworCS8qKgorCSAqIFJldHVybiBhbiBJdGVyYXRvciBvZiBJSmF2YVR5cGVNYXBwaW5nUHJvdmlkZXJzLiAgVGhlc2UgZGVmaW5lIHdoaWNoCisJICogSUphdmFUeXBlTWFwcGluZ3MgYXJlIHN1cHBvcnRlZCBhbmQgd2hpY2ggYW5ub3RhdGlvbiBhcHBsaWVzLiAKKwkgKi8KKwlJdGVyYXRvcjxJSmF2YVR5cGVNYXBwaW5nUHJvdmlkZXI+IGphdmFUeXBlTWFwcGluZ1Byb3ZpZGVycygpOworCisJSUphdmFUeXBlTWFwcGluZ1Byb3ZpZGVyIGphdmFUeXBlTWFwcGluZ1Byb3ZpZGVyKFN0cmluZyB0eXBlTWFwcGluZ0tleSk7CisKKwkvKioKKwkgKiBSZXR1cm4gYW4gSXRlcmF0b3Igb2YgSUphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXJzLiAgVGhlc2UgZGVmaW5lIHdoaWNoCisJICogSUphdmFBdHRyaWJ1dGVNYXBwaW5ncyBhcmUgc3VwcG9ydGVkIGFuZCB3aGljaCBhbm5vdGF0aW9uIGFwcGxpZXMuIAorCSAqLworCUl0ZXJhdG9yPElKYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyPiBqYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVycygpOworCisJSUphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIgamF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcihTdHJpbmcgYXR0cmlidXRlTWFwcGluZ0tleSk7CisKKwkvKioKKwkgKiBSZXR1cm4gYSBMaXN0SXRlcmF0b3Igb2YgSURlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyLiAgVGhpcyBpcyBhIExpc3QKKwkgKiBiZWNhdXNlIHRoZSBkZWZhdWx0cyBhcmUgY2hlY2tlZCBpbiBvcmRlci4KKwkgKi8KKwlMaXN0SXRlcmF0b3I8SURlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyPiBkZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcnMoKTsKIAogCS8qKgogCSAqIEJ1aWxkIGEgcHJvamVjdCBjb250ZXh0IHRvIGJlIHVzZWQgd2hlbiByZXN5bmNoaW5nIHRoZSBpbnRyYS1tb2RlbApAQCAtOTMsNyArMTIxLDYgQEAKIAkgKiBhbmQgdGhlIG1hcHBpbmcgZmlsZXMgYW5kIGNsYXNzZXMgaXQgY29udGFpbnMuCiAJICogCiAJICogQHNlZSByZWZyZXNoRGVmYXVsdHMoT2JqZWN0KQotCSAqIEByZXR1cm4KIAkgKi8KIAlJQ29udGV4dCBidWlsZFByb2plY3RDb250ZXh0KCk7CiAKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9JSnBhUHJvamVjdC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL0lKcGFQcm9qZWN0LmphdmEKaW5kZXggY2EwYzZkYi4uYzdmZmIxZCAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL0lKcGFQcm9qZWN0LmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL0lKcGFQcm9qZWN0LmphdmEKQEAgLTEsOCArMSw4IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24gYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCkBAIC0xOCw2ICsxOCw4IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwuQ29ubmVjdGlvblByb2ZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29tbWFuZEV4ZWN1dG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbW1hbmRFeGVjdXRvclByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7CiAKIC8qKgpAQCAtMTM0LDQgKzEzNiwyMSBAQAogCUl0ZXJhdG9yPElNZXNzYWdlPiB2YWxpZGF0aW9uTWVzc2FnZXMoKTsKIAogCUNvbm5lY3Rpb25Qcm9maWxlIGNvbm5lY3Rpb25Qcm9maWxlKCk7CisKKwkvKioKKwkgKiBSZXR1cm4gYSB0aHJlYWQtc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gb2YgdGhlIENvbW1hbmRFeGVjdXRvcgorCSAqIGludGVyZmFjZSB0aGF0IHdpbGwgYmUgdXNlZCB0byBleGVjdXRlIGEgY29tbWFuZCB0byBtb2RpZnkgYSBzaGFyZWQKKwkgKiBkb2N1bWVudC4KKwkgKi8KKwlDb21tYW5kRXhlY3V0b3IgZ2V0VGhyZWFkTG9jYWxNb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvcigpOworCisJLyoqCisJICogU2V0IGEgdGhyZWFkLXNwZWNpZmljIGltcGxlbWVudGF0aW9uIG9mIHRoZSBDb21tYW5kRXhlY3V0b3IKKwkgKiBpbnRlcmZhY2UgdGhhdCB3aWxsIGJlIHVzZWQgdG8gZXhlY3V0ZSBhIGNvbW1hbmQgdG8gbW9kaWZ5IGEgc2hhcmVkCisJICogZG9jdW1lbnQuIFRoaXMgYWxsb3dzIGJhY2tncm91bmQgY2xpZW50cyB0byBtb2RpZnkgZG9jdW1lbnRzIHRoYXQgYXJlCisJICogYWxyZWFkeSBwcmVzZW50IGluIHRoZSBVSS4KKwkgKi8KKwl2b2lkIHNldFRocmVhZExvY2FsTW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IoQ29tbWFuZEV4ZWN1dG9yIGNvbW1hbmRFeGVjdXRvcik7CisKKwlDb21tYW5kRXhlY3V0b3JQcm92aWRlciBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvclByb3ZpZGVyKCk7CiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvSVBlcnNpc3RlbnRBdHRyaWJ1dGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9JUGVyc2lzdGVudEF0dHJpYnV0ZS5qYXZhCmluZGV4IDg4YmJkODAuLmE5YzNhOGUgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9JUGVyc2lzdGVudEF0dHJpYnV0ZS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9JUGVyc2lzdGVudEF0dHJpYnV0ZS5qYXZhCkBAIC05LDcgKzksNiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWw7CiAKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuamR0dXRpbGl0eS5BdHRyaWJ1dGU7CiAKIC8qKgpAQCAtODUsMTEgKzg0LDYgQEAKIAl2b2lkIHNldFNwZWNpZmllZE1hcHBpbmdLZXkoU3RyaW5nIGtleSk7CiAKIAkvKioKLQkgKiBSZXR1cm4gYWxsIHRoZSBhdHRyaWJ1dGUncyBtYXBwaW5nIGtleXMuCi0JICovCi0JSXRlcmF0b3I8U3RyaW5nPiBjYW5kaWRhdGVNYXBwaW5nS2V5cygpOwotCi0JLyoqCiAJICogUmV0dXJuIHRoZSBhdHRyaWJ1dGUncyBKYXZhIGF0dHJpYnV0ZS4KIAkgKi8KIAlBdHRyaWJ1dGUgZ2V0QXR0cmlidXRlKCk7CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvSVBlcnNpc3RlbnRUeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvSVBlcnNpc3RlbnRUeXBlLmphdmEKaW5kZXggMWI4Y2ZiNS4uMGZhYTEzZSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL0lQZXJzaXN0ZW50VHlwZS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9JUGVyc2lzdGVudFR5cGUuamF2YQpAQCAtNTcsMTEgKzU3LDYgQEAKIAl2b2lkIHNldE1hcHBpbmdLZXkoU3RyaW5nIHZhbHVlKTsKIAogCS8qKgotCSAqIFJldHVybnMgYW4gaXRlcmF0b3Igb24gYWxsIG1hcHBpbmcga2V5cyB0aGF0IGFyZSBhdmFpbGFibGUgZm9yIHRoaXMgdHlwZS4KLQkgKi8KLQlJdGVyYXRvcjxTdHJpbmc+IGNhbmRpZGF0ZU1hcHBpbmdLZXlzKCk7Ci0KLQkvKioKIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDxwPgogCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hcHBpbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL0pwYUNvcmVGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvSnBhQ29yZUZhY3RvcnkuamF2YQppbmRleCBkNWMzNzgyLi4zNWM0N2ExIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvSnBhQ29yZUZhY3RvcnkuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvSnBhQ29yZUZhY3RvcnkuamF2YQpAQCAtMSwxNCArMSwxNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWw7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CkBAIC0xMzYsNiArMTM3LDExIEBACiAJCXJldHVybiBqcGFQcm9qZWN0OwogCX0KIAorCXB1YmxpYyBKcGFQcm9qZWN0IGNyZWF0ZUpwYVByb2plY3QoSVByb2plY3QgcHJvamVjdCkgeworCQlKcGFQcm9qZWN0IGpwYVByb2plY3QgPSBuZXcgSnBhUHJvamVjdChwcm9qZWN0KTsKKwkJcmV0dXJuIGpwYVByb2plY3Q7CisJfQorCiAJLyoqCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9KcGFEYXRhU291cmNlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvSnBhRGF0YVNvdXJjZS5qYXZhCmluZGV4IDM5ZjNlOTEuLjA4NTllZTIgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9KcGFEYXRhU291cmNlLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL0pwYURhdGFTb3VyY2UuamF2YQpAQCAtMTIsNyArMTIsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC5Db25uZWN0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC5Db25uZWN0aW9uTGlzdGVuZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLkNvbm5lY3Rpb25Qcm9maWxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC5Db25uZWN0aW9uUHJvZmlsZVJlcG9zaXRvcnk7CkBAIC0xMDEsMjcgKzEwMCwyNyBAQAogCiAJcHJpdmF0ZSBDb25uZWN0aW9uTGlzdGVuZXIgYnVpbGRDb25uZWN0aW9uTGlzdGVuZXIoKSB7CiAJCXJldHVybiBuZXcgQ29ubmVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgb3BlbmVkKENvbm5lY3Rpb24gY29ubmVjdGlvbikgeworCQkJcHVibGljIHZvaWQgb3BlbmVkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpIHsKIAkJCQlnZXRQcm9qZWN0KCkucmVzeW5jaCgpOwogCQkJfQogCi0JCQlwdWJsaWMgdm9pZCBhYm91dFRvQ2xvc2UoQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7fQorCQkJcHVibGljIHZvaWQgYWJvdXRUb0Nsb3NlKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpIHt9CiAKLQkJCXB1YmxpYyBib29sZWFuIG9rVG9DbG9zZShDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKKwkJCXB1YmxpYyBib29sZWFuIG9rVG9DbG9zZShDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKSB7CiAJCQkJcmV0dXJuIHRydWU7CiAJCQl9CiAKLQkJCXB1YmxpYyB2b2lkIGNsb3NlZChDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKKwkJCXB1YmxpYyB2b2lkIGNsb3NlZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKSB7CiAJCQkJZ2V0UHJvamVjdCgpLnJlc3luY2goKTsKIAkJCX0KIAotCQkJcHVibGljIHZvaWQgbW9kaWZpZWQoQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7fQorCQkJcHVibGljIHZvaWQgbW9kaWZpZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkge30KIAotCQkJcHVibGljIHZvaWQgZGF0YWJhc2VDaGFuZ2VkKENvbm5lY3Rpb24gY29ubmVjdGlvbiwgRGF0YWJhc2UgZGF0YWJhc2UpIHt9CisJCQlwdWJsaWMgdm9pZCBkYXRhYmFzZUNoYW5nZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgRGF0YWJhc2UgZGF0YWJhc2UpIHt9CiAKLQkJCXB1YmxpYyB2b2lkIHNjaGVtYUNoYW5nZWQoQ29ubmVjdGlvbiBjb25uZWN0aW9uLCBTY2hlbWEgc2NoZW1hKSB7fQorCQkJcHVibGljIHZvaWQgc2NoZW1hQ2hhbmdlZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBTY2hlbWEgc2NoZW1hKSB7fQogCi0JCQlwdWJsaWMgdm9pZCB0YWJsZUNoYW5nZWQoQ29ubmVjdGlvbiBjb25uZWN0aW9uLCBUYWJsZSB0YWJsZSkge30KKwkJCXB1YmxpYyB2b2lkIHRhYmxlQ2hhbmdlZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBUYWJsZSB0YWJsZSkge30KIAkJfTsKIAl9CiAKQEAgLTE5Niw4ICsxOTUsMTQgQEAKIAkJZ2V0UHJvamVjdCgpLnJlc3luY2goKTsKIAl9CiAKLQlwdWJsaWMgQ29ubmVjdGlvbiBnZXRDb25uZWN0aW9uKCkgewotCQlyZXR1cm4gQ29ubmVjdGlvblByb2ZpbGVSZXBvc2l0b3J5Lmluc3RhbmNlKCkuZ2V0Q29ubmVjdGlvbldpdGhQcm9maWxlTmFtZWQoZ2V0Q29ubmVjdGlvblByb2ZpbGVOYW1lKCkpOworCXB1YmxpYyBib29sZWFuIGlzQ29ubmVjdGVkKCkgeworCQlDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlID0gQ29ubmVjdGlvblByb2ZpbGVSZXBvc2l0b3J5Lmluc3RhbmNlKCkucHJvZmlsZU5hbWVkKGdldENvbm5lY3Rpb25Qcm9maWxlTmFtZSgpKTsKKwkJcmV0dXJuIHByb2ZpbGUuaXNDb25uZWN0ZWQoKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBoYXNBQ29ubmVjdGlvbigpIHsKKwkJQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSA9IENvbm5lY3Rpb25Qcm9maWxlUmVwb3NpdG9yeS5pbnN0YW5jZSgpLnByb2ZpbGVOYW1lZChnZXRDb25uZWN0aW9uUHJvZmlsZU5hbWUoKSk7CisJCXJldHVybiAhcHJvZmlsZS5pc051bGwoKTsKIAl9CiAKIAkvKioKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9KcGFFT2JqZWN0LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvSnBhRU9iamVjdC5qYXZhCmluZGV4IDc2ZmJhZGMuLmQ3ODIyZmUgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9KcGFFT2JqZWN0LmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL0pwYUVPYmplY3QuamF2YQpAQCAtNjUsNiArNjUsMTQgQEAKIAkJcmV0dXJuIHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKTsKIAl9CiAKKwlwdWJsaWMgSUpwYVBsYXRmb3JtIGpwYVBsYXRmb3JtKCkgeworCQlyZXR1cm4gZ2V0SnBhUHJvamVjdCgpLmdldFBsYXRmb3JtKCk7CisJfQorCisJcHVibGljIElKcGFGYWN0b3J5IGpwYUZhY3RvcnkoKSB7CisJCXJldHVybiBqcGFQbGF0Zm9ybSgpLmdldEpwYUZhY3RvcnkoKTsKKwl9CisKIAlwdWJsaWMgQ29ubmVjdGlvblByb2ZpbGUgY29ubmVjdGlvblByb2ZpbGUoKSB7CiAJCXJldHVybiB0aGlzLmdldEpwYVByb2plY3QoKS5jb25uZWN0aW9uUHJvZmlsZSgpOwogCX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9KcGFGaWxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvSnBhRmlsZS5qYXZhCmluZGV4IDZlN2RhMzQuLmVmNTY0NjAgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9KcGFGaWxlLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL0pwYUZpbGUuamF2YQpAQCAtMjAyLDYgKzIwMiw3IEBACiAJICovCiAJdm9pZCBkaXNwb3NlKCkgewogCQlnZXRDb250ZW50KCkuZGlzcG9zZSgpOworCQkoKEpwYVByb2plY3QpIGdldEpwYVByb2plY3QoKSkuZ2V0RmlsZXMoKS5yZW1vdmUodGhpcyk7CiAJfQogCiAJLyoqCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvSnBhTW9kZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9KcGFNb2RlbC5qYXZhCmluZGV4IDUyNDVlMjYuLmI5NjgwMTYgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9KcGFNb2RlbC5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9KcGFNb2RlbC5qYXZhCkBAIC0xNjUsMjEgKzE2NSwxMiBAQAogCSAqLwogCXZvaWQgZGlzcG9zZSgpIHsKIAkJZm9yIChJdGVyYXRvcjxJSnBhUHJvamVjdD4gc3RyZWFtID0gbmV3IENsb25lSXRlcmF0b3I8SUpwYVByb2plY3Q+KGdldFByb2plY3RzKCkpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJZGlzcG9zZVByb2plY3QoKEpwYVByb2plY3QpIHN0cmVhbS5uZXh0KCkpOworCQkJKChKcGFQcm9qZWN0KSBzdHJlYW0ubmV4dCgpKS5kaXNwb3NlKCk7CiAJCX0KIAl9CiAKIAkvKioKIAkgKiBJTlRFUk5BTCBPTkxZCi0JICogRGlzcG9zZSBwcm9qZWN0IGFuZCByZW1vdmUgaXQKLQkgKi8KLQl2b2lkIGRpc3Bvc2VQcm9qZWN0KEpwYVByb2plY3QganBhUHJvamVjdCkgewotCQlqcGFQcm9qZWN0LmRpc3Bvc2UoKTsKLQkJZ2V0UHJvamVjdHMoKS5yZW1vdmUoanBhUHJvamVjdCk7Ci0JfQotCi0JLyoqCi0JICogSU5URVJOQUwgT05MWQogCSAqIEhhbmRsZSBqYXZhIGVsZW1lbnQgY2hhbmdlIGV2ZW50LgogCSAqLwogCXZvaWQgaGFuZGxlRXZlbnQoRWxlbWVudENoYW5nZWRFdmVudCBldmVudCkgewpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL0pwYU1vZGVsTWFuYWdlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL0pwYU1vZGVsTWFuYWdlci5qYXZhCmluZGV4IGE5MmFkZWMuLmY2OWQ0NjIgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9KcGFNb2RlbE1hbmFnZXIuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvSnBhTW9kZWxNYW5hZ2VyLmphdmEKQEAgLTMzLDExICszMywyMyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5wcmVmcy5KcGFQcmVmZXJlbmNlQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLkZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JRmFjZXRlZFByb2plY3RFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXI7CiAKIHB1YmxpYyBjbGFzcyBKcGFNb2RlbE1hbmFnZXIKIHsKLQlwcml2YXRlIHN0YXRpYyBKcGFNb2RlbE1hbmFnZXIgSU5TVEFOQ0U7CisJZmluYWwgSnBhTW9kZWwgbW9kZWw7CiAJCisJcHJpdmF0ZSBmaW5hbCBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciByZXNvdXJjZUNoYW5nZUxpc3RlbmVyOworCQorCXByaXZhdGUgZmluYWwgSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIgZmFjZXRlZFByb2plY3RMaXN0ZW5lcjsKKwkKKwlwcml2YXRlIGZpbmFsIElFbGVtZW50Q2hhbmdlZExpc3RlbmVyIGVsZW1lbnRDaGFuZ2VMaXN0ZW5lcjsKKwkKKwlwcml2YXRlIGZpbmFsIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHByZWZlcmVuY2VzTGlzdGVuZXI7CisJCisKKwlwcml2YXRlIHN0YXRpYyBKcGFNb2RlbE1hbmFnZXIgSU5TVEFOQ0U7CiAJCiAJLyoqCiAJICogUmV0dXJucyB0aGUgc2luZ2xldG9uIEpwYU1vZGVsTWFuYWdlcgpAQCAtNTAsNDkgKzYyLDMwIEBACiAJfQogCQogCQotCS8qKgotCSAqIFVuaXF1ZSBoYW5kbGUgb250byB0aGUgSnBhTW9kZWwKLQkgKi8KLQlKcGFNb2RlbCBtb2RlbDsKLQkKLQkvKioKLQkgKiBQcm9jZXNzZXMgcmVzb3VyY2UgY2hhbmdlcwotCSAqLwotCXByaXZhdGUgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgcmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLQkKLQkvKioKLQkgKiBQcm9jZXNzIGVsZW1lbnQgY2hhbmdlcwotCSAqLwotCXByaXZhdGUgSUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIgZWxlbWVudENoYW5nZUxpc3RlbmVyOwotCQotCS8qKgotCSAqIFByb2Nlc3MgY2hhbmdlcyB0byBwcmVmZXJlbmNlcwotCSAqLwotCXByaXZhdGUgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgcHJlZmVyZW5jZXNMaXN0ZW5lcjsKLQkKLQkKIAlwcml2YXRlIEpwYU1vZGVsTWFuYWdlcigpIHsKIAkJc3VwZXIoKTsKIAkJbW9kZWwgPSBKcGFDb3JlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSnBhTW9kZWwoKTsKIAkJcmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciA9IG5ldyBSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKCk7CisJCWZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIgPSBuZXcgRmFjZXRlZFByb2plY3RMaXN0ZW5lcigpOwogCQllbGVtZW50Q2hhbmdlTGlzdGVuZXIgPSBuZXcgRWxlbWVudENoYW5nZUxpc3RlbmVyKCk7CiAJCXByZWZlcmVuY2VzTGlzdGVuZXIgPSBuZXcgUHJlZmVyZW5jZXNMaXN0ZW5lcigpOwogCX0KIAkKLQlwdWJsaWMgdm9pZCBzdGFydHVwKCkgeworCXZvaWQgc3RhcnQoKSB7CiAJCXRyeSB7Ci0JCQlidWlsZFdvcmtzcGFjZSgpOworCQkJdGhpcy5idWlsZFdvcmtzcGFjZSgpOwogCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIocmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcik7CisJCQlGYWNldGVkUHJvamVjdEZyYW1ld29yay5hZGRMaXN0ZW5lcihmYWNldGVkUHJvamVjdExpc3RlbmVyLCBJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlLnZhbHVlcygpKTsKIAkJCUphdmFDb3JlLmFkZEVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIoZWxlbWVudENoYW5nZUxpc3RlbmVyKTsKIAkJCUpwdENvcmVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHByZWZlcmVuY2VzTGlzdGVuZXIpOwogCQl9Ci0JCWNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7Ci0JCQlKcHRDb3JlUGx1Z2luLmxvZyhyZSk7Ci0JCQlzaHV0ZG93bigpOworCQljYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgeworCQkJSnB0Q29yZVBsdWdpbi5sb2coZXgpOworCQkJdGhpcy5zdG9wKCk7CiAJCX0KIAl9CiAJCi0JcHVibGljIHZvaWQgc2h1dGRvd24oKSB7CisJdm9pZCBzdG9wKCkgewogCQlKcHRDb3JlUGx1Z2luLmdldFBsdWdpbigpLmdldFBsdWdpblByZWZlcmVuY2VzKCkucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcmVmZXJlbmNlc0xpc3RlbmVyKTsKIAkJSmF2YUNvcmUucmVtb3ZlRWxlbWVudENoYW5nZWRMaXN0ZW5lcihlbGVtZW50Q2hhbmdlTGlzdGVuZXIpOwogCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihyZXNvdXJjZUNoYW5nZUxpc3RlbmVyKTsKQEAgLTE0NSw3ICsxMzgsNyBAQAogCQkJcmV0dXJuIG51bGw7CiAJCX0KIAkJCi0JCXJldHVybiBtb2RlbC5nZXRKcGFQcm9qZWN0KHByb2plY3QpOworCQlyZXR1cm4gdGhpcy5tb2RlbC5nZXRKcGFQcm9qZWN0KHByb2plY3QpOwogCX0KIAkKIAkvKioKQEAgLTE4OCw4ICsxODEsNyBAQAogCXB1YmxpYyBzeW5jaHJvbml6ZWQgSUpwYVByb2plY3QgY3JlYXRlSnBhUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSAKIAkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKIAkJaWYgKEZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrLmhhc1Byb2plY3RGYWNldChwcm9qZWN0LCBKcHRDb3JlUGx1Z2luLkZBQ0VUX0lEKSkgewotCQkJSnBhUHJvamVjdCBqcGFQcm9qZWN0ID0gSnBhQ29yZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUpwYVByb2plY3QoKTsKLQkJCWpwYVByb2plY3Quc2V0UHJvamVjdChwcm9qZWN0KTsKKwkJCUpwYVByb2plY3QganBhUHJvamVjdCA9IEpwYUNvcmVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVKcGFQcm9qZWN0KHByb2plY3QpOwogCQkJbW9kZWwuZ2V0UHJvamVjdHMoKS5hZGQoanBhUHJvamVjdCk7CiAJCQlyZXR1cm4ganBhUHJvamVjdDsKIAkJfQpAQCAtMjE2LDcgKzIwOCw3IEBACiAJICogRGlzcG9zZSB0aGUgSUpwYVByb2plY3QKIAkgKi8KIAlwdWJsaWMgdm9pZCBkaXNwb3NlSnBhUHJvamVjdChJSnBhUHJvamVjdCBqcGFQcm9qZWN0KSB7Ci0JCW1vZGVsLmRpc3Bvc2VQcm9qZWN0KChKcGFQcm9qZWN0KSBqcGFQcm9qZWN0KTsKKwkJKChKcGFQcm9qZWN0KSBqcGFQcm9qZWN0KS5kaXNwb3NlKCk7CiAJfQogCQogCS8qKgpAQCAtMjMwLDcgKzIyMiw3IEBACiAJCX0KIAkJCiAJCUlQcm9qZWN0IHByb2plY3QgPSBmaWxlLmdldFByb2plY3QoKTsKLQkJSnBhUHJvamVjdCBqcGFQcm9qZWN0ID0gKEpwYVByb2plY3QpIGdldEpwYVByb2plY3QocHJvamVjdCk7CisJCUpwYVByb2plY3QganBhUHJvamVjdCA9IChKcGFQcm9qZWN0KSB0aGlzLmdldEpwYVByb2plY3QocHJvamVjdCk7CiAJCWlmIChqcGFQcm9qZWN0ID09IG51bGwpIHsKIAkJCXJldHVybiBudWxsOwogCQl9CkBAIC0zMTAsNiArMzAyLDcgQEAKIAkJCQkKIAkJCQlzd2l0Y2ggKGV2ZW50LmdldFR5cGUoKSl7CiAJCQkJCWNhc2UgSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0RFTEVURSA6CisJCQkJCWNhc2UgSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0NMT1NFIDoKIAkJCQkJCXRyeSB7CiAJCQkJCQkJaWYgKChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QpCiAJCQkJCQkJCQkmJiAoRmFjZXRlZFByb2plY3RGcmFtZXdvcmsuaGFzUHJvamVjdEZhY2V0KApAQCAtMzI4LDkgKzMyMSw2IEBACiAJCQkJCQkJY2hlY2tGb3JGaWxlc0JlaW5nQWRkZWRPclJlbW92ZWQoZGVsdGEpOwogCQkJCQkJfQogCQkJCQkJcmV0dXJuOwotCQkJCQkJCi0JCQkJCWNhc2UgSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0NMT1NFIDoKLQkJCQkJCXJldHVybjsKIAkJCQl9CiAJCQl9CiAJCX0KQEAgLTQxNywxOSArNDA3LDcgQEAKIAkJCQkJCQkJCQkJSnB0Q29yZVBsdWdpbi5sb2coY2UpOwogCQkJCQkJCQkJCX0KIAkJCQkJCQkJCX0KLQkJCQkJCQkJfSAKLQkJCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCQkvLyBwcm9qZWN0IGhhcyBiZWVuIGNsb3NlZC4gIGRpc3Bvc2UganBhIHByb2plY3QgaWYgaXQgZXhpc3RzLgotCQkJCQkJCQkJaWYgKGpwYVByb2plY3QgIT0gbnVsbCkgewotCQkJCQkJCQkJCW1vZGVsLmRpc3Bvc2VQcm9qZWN0KGpwYVByb2plY3QpOwotCQkJCQkJCQkJfQogCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgaWYgKChkZWx0YS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuREVTQ1JJUFRJT04pICE9IDApIHsKLQkJCQkJCQkJLy8gYWdhaW4sIG5vdCBzdXJlIC4uLgotCQkJCQkJCX0gCi0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCS8vIC4uLgogCQkJCQkJCX0JCQogCQkJCQkJCWJyZWFrOwogCQkJCQl9CkBAIC00NDksNyArNDI3LDcgQEAKIAkJcHJpdmF0ZSB2b2lkIHByb2plY3RCZWluZ0RlbGV0ZWQoSVByb2plY3QgcHJvamVjdCkgewogCQkJLy8gY291bGQgYmUgcHJvYmxlbXMgaGVyZSAuLi4KIAkJCUpwYVByb2plY3QganBhUHJvamVjdCA9IChKcGFQcm9qZWN0KSBtb2RlbC5nZXRKcGFQcm9qZWN0KHByb2plY3QpOwotCQkJbW9kZWwuZGlzcG9zZVByb2plY3QoanBhUHJvamVjdCk7CisJCQlqcGFQcm9qZWN0LmRpc3Bvc2UoKTsKIAkJfQogCQkKIAkJLyoqCkBAIC00OTUsNDIgKzQ3MywxMDYgQEAKIAl9CiAJCiAJCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRWxlbWVudENoYW5nZUxpc3RlbmVyIAotCQlpbXBsZW1lbnRzIElFbGVtZW50Q2hhbmdlZExpc3RlbmVyCisJLy8gKioqKioqKioqKioqKioqKiBmYWNldGVkIHByb2plY3QgbGlzdGVuZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCisJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRmFjZXRlZFByb2plY3RMaXN0ZW5lciAKKwkJaW1wbGVtZW50cyBJRmFjZXRlZFByb2plY3RMaXN0ZW5lcgogCXsKLQkJVGhyZWFkTG9jYWw8RWxlbWVudENoYW5nZVByb2Nlc3Nvcj4gZWxlbWVudENoYW5nZVByb2Nlc3NvcnMgPSBuZXcgVGhyZWFkTG9jYWw8RWxlbWVudENoYW5nZVByb2Nlc3Nvcj4oKTsKKwkJVGhyZWFkTG9jYWw8RmFjZXRlZFByb2plY3RDaGFuZ2VQcm9jZXNzb3I+IHByb2Nlc3NvcnMgPSAKKwkJCQluZXcgVGhyZWFkTG9jYWw8RmFjZXRlZFByb2plY3RDaGFuZ2VQcm9jZXNzb3I+KCk7CiAJCQotCQlFbGVtZW50Q2hhbmdlTGlzdGVuZXIoKSB7CisJCUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIoKSB7CiAJCQlzdXBlcigpOwogCQl9CiAJCQotCQlwdWJsaWMgdm9pZCBlbGVtZW50Q2hhbmdlZChFbGVtZW50Q2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQlnZXRFbGVtZW50Q2hhbmdlUHJvY2Vzc29yKCkuZWxlbWVudENoYW5nZWQoZXZlbnQpOworCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJRmFjZXRlZFByb2plY3RFdmVudCBldmVudCkgeworCQkJZ2V0UHJvY2Vzc29yKCkuaGFuZGxlRXZlbnQoZXZlbnQpOwogCQl9CiAJCQotCQlwdWJsaWMgRWxlbWVudENoYW5nZVByb2Nlc3NvciBnZXRFbGVtZW50Q2hhbmdlUHJvY2Vzc29yKCkgewotCQkJRWxlbWVudENoYW5nZVByb2Nlc3NvciBwcm9jZXNzb3IgPSB0aGlzLmVsZW1lbnRDaGFuZ2VQcm9jZXNzb3JzLmdldCgpOwotCQkJaWYgKHByb2Nlc3NvciA9PSBudWxsKSB7Ci0JCQkJcHJvY2Vzc29yID0gbmV3IEVsZW1lbnRDaGFuZ2VQcm9jZXNzb3IoKTsKLQkJCQl0aGlzLmVsZW1lbnRDaGFuZ2VQcm9jZXNzb3JzLnNldChwcm9jZXNzb3IpOworCQlwdWJsaWMgRmFjZXRlZFByb2plY3RDaGFuZ2VQcm9jZXNzb3IgZ2V0UHJvY2Vzc29yKCkgeworCQkJRmFjZXRlZFByb2plY3RDaGFuZ2VQcm9jZXNzb3IgcHJvY2Vzc29yID0gcHJvY2Vzc29ycy5nZXQoKTsKKwkJCWlmIChwcm9jZXNzb3IgPT0gbnVsbCkgeyAKKwkJCQlwcm9jZXNzb3IgPSBuZXcgRmFjZXRlZFByb2plY3RDaGFuZ2VQcm9jZXNzb3IoKTsKKwkJCQlwcm9jZXNzb3JzLnNldChwcm9jZXNzb3IpOwogCQkJfQogCQkJcmV0dXJuIHByb2Nlc3NvcjsKIAkJfQogCX0KIAkKIAkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBFbGVtZW50Q2hhbmdlUHJvY2Vzc29yCisJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRmFjZXRlZFByb2plY3RDaGFuZ2VQcm9jZXNzb3IKIAl7Ci0JCUVsZW1lbnRDaGFuZ2VQcm9jZXNzb3IoKSB7Ci0JCQlzdXBlcigpOworCQlwcml2YXRlIEpwYU1vZGVsIG1vZGVsOworCQkKKwkJRmFjZXRlZFByb2plY3RDaGFuZ2VQcm9jZXNzb3IoKSB7CisJCQltb2RlbCA9IEpwYU1vZGVsTWFuYWdlci5pbnN0YW5jZSgpLm1vZGVsOwogCQl9CiAJCQotCQlwdWJsaWMgdm9pZCBlbGVtZW50Q2hhbmdlZChFbGVtZW50Q2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQlKcGFNb2RlbE1hbmFnZXIuaW5zdGFuY2UoKS5tb2RlbC5oYW5kbGVFdmVudChldmVudCk7CisJCXByb3RlY3RlZCB2b2lkIGhhbmRsZUV2ZW50KElGYWNldGVkUHJvamVjdEV2ZW50IGV2ZW50KSB7CisJCQlJUHJvamVjdCBwcm9qZWN0ID0gZXZlbnQuZ2V0UHJvamVjdCgpLmdldFByb2plY3QoKTsKKwkJCUpwYVByb2plY3QganBhUHJvamVjdCA9IChKcGFQcm9qZWN0KSBtb2RlbC5nZXRKcGFQcm9qZWN0KHByb2plY3QpOworCQkJYm9vbGVhbiBqcGFGYWNldEV4aXN0cyA9IGZhbHNlOworCQkJdHJ5IHsKKwkJCQlqcGFGYWNldEV4aXN0cyA9IEZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrLmhhc1Byb2plY3RGYWNldChwcm9qZWN0LCBKcHRDb3JlUGx1Z2luLkZBQ0VUX0lEKTsKKwkJCX0KKwkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7CisJCQkJLy8gbm90aGluZyB0byBkbywgYXNzdW1lIGZhY2V0IGRvZXNuJ3QgZXhpc3QKKwkJCQlKcHRDb3JlUGx1Z2luLmxvZyhjZSk7CisJCQl9CisJCQkKKwkJCWlmIChqcGFGYWNldEV4aXN0cyAmJiBqcGFQcm9qZWN0ID09IG51bGwpIHsKKwkJCQl0cnkgeworCQkJCQlKcGFNb2RlbE1hbmFnZXIuaW5zdGFuY2UoKS5jcmVhdGVGaWxsZWRKcGFQcm9qZWN0KHByb2plY3QpOworCQkJCX0KKwkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgeworCQkJCS8vIG5vdGhpbmcgdG8gZG8sIG5vdGhpbmcgd2UgKmNhbiogZG8KKwkJCQlKcHRDb3JlUGx1Z2luLmxvZyhjZSk7CisJCQkJfQorCQkJfQorCQkJZWxzZSBpZiAoanBhUHJvamVjdCAhPSBudWxsICYmICEganBhRmFjZXRFeGlzdHMpIHsKKwkJCQlqcGFQcm9qZWN0LmRpc3Bvc2UoKTsKKwkJCX0KIAkJfQogCX0KIAkKIAkKKwkvLyAqKioqKioqKioqKioqKioqIGVsZW1lbnQgY2hhbmdlIGxpc3RlbmVyICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCXByaXZhdGUgc3RhdGljIGNsYXNzIEVsZW1lbnRDaGFuZ2VMaXN0ZW5lciAKKwkJaW1wbGVtZW50cyBJRWxlbWVudENoYW5nZWRMaXN0ZW5lcgorCXsKKwkJVGhyZWFkTG9jYWw8RWxlbWVudENoYW5nZVByb2Nlc3Nvcj4gZWxlbWVudENoYW5nZVByb2Nlc3NvciA9IG5ldyBUaHJlYWRMb2NhbDxFbGVtZW50Q2hhbmdlUHJvY2Vzc29yPigpOworCQkKKwkJRWxlbWVudENoYW5nZUxpc3RlbmVyKCkgeworCQkJc3VwZXIoKTsKKwkJfQorCQkKKwkJcHVibGljIHZvaWQgZWxlbWVudENoYW5nZWQoRWxlbWVudENoYW5nZWRFdmVudCBldmVudCkgeworCQkJdGhpcy5nZXRFbGVtZW50Q2hhbmdlUHJvY2Vzc29yKCkuZWxlbWVudENoYW5nZWQoZXZlbnQpOworCQl9CisJCQorCQlwdWJsaWMgRWxlbWVudENoYW5nZVByb2Nlc3NvciBnZXRFbGVtZW50Q2hhbmdlUHJvY2Vzc29yKCkgeworCQkJRWxlbWVudENoYW5nZVByb2Nlc3NvciBwcm9jZXNzb3IgPSB0aGlzLmVsZW1lbnRDaGFuZ2VQcm9jZXNzb3IuZ2V0KCk7CisJCQlpZiAocHJvY2Vzc29yID09IG51bGwpIHsKKwkJCQlwcm9jZXNzb3IgPSBuZXcgRWxlbWVudENoYW5nZVByb2Nlc3NvcigpOworCQkJCXRoaXMuZWxlbWVudENoYW5nZVByb2Nlc3Nvci5zZXQocHJvY2Vzc29yKTsKKwkJCX0KKwkJCXJldHVybiBwcm9jZXNzb3I7CisJCX0KKworCQlwcml2YXRlIHN0YXRpYyBjbGFzcyBFbGVtZW50Q2hhbmdlUHJvY2Vzc29yIHsKKwkJCUVsZW1lbnRDaGFuZ2VQcm9jZXNzb3IoKSB7CisJCQkJc3VwZXIoKTsKKwkJCX0KKwkJCXB1YmxpYyB2b2lkIGVsZW1lbnRDaGFuZ2VkKEVsZW1lbnRDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKKwkJCQlKcGFNb2RlbE1hbmFnZXIuaW5zdGFuY2UoKS5tb2RlbC5oYW5kbGVFdmVudChldmVudCk7CisJCQl9CisJCX0KKwl9CisJCisJCisJLy8gKioqKioqKioqKiBwcmVmZXJlbmNlcyBsaXN0ZW5lciAqKioqKioqKioqCQorCiAJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUHJlZmVyZW5jZXNMaXN0ZW5lcgogCQlpbXBsZW1lbnRzIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyCiAJewpAQCAtNTQyLDEwICs1ODQsMTEgQEAKIAkJCQl0cnkgewogCQkJCQlKYXZhQ29yZS5zZXRDbGFzc3BhdGhWYXJpYWJsZSgiREVGQVVMVF9KUEFfTElCIiwgbmV3IFBhdGgoKFN0cmluZykgZXZlbnQuZ2V0TmV3VmFsdWUoKSksIG51bGwpOwogCQkJCX0KLQkJCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotCQkJCQlKcHRDb3JlUGx1Z2luLmxvZyhqbWUpOworCQkJCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKKwkJCQkJSnB0Q29yZVBsdWdpbi5sb2coZXgpOwogCQkJCX0KIAkJCX0KIAkJfQogCX0KKwogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL0pwYVBsYXRmb3JtUmVnaXN0cnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9KcGFQbGF0Zm9ybVJlZ2lzdHJ5LmphdmEKaW5kZXggN2UzOTZkOC4uYTA4MThjZCAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL0pwYVBsYXRmb3JtUmVnaXN0cnkuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvSnBhUGxhdGZvcm1SZWdpc3RyeS5qYXZhCkBAIC0yNSw4ICsyNSwxNiBAQAogCiBwdWJsaWMgY2xhc3MgSnBhUGxhdGZvcm1SZWdpc3RyeSAKIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEpwYVBsYXRmb3JtUmVnaXN0cnkgSU5TVEFOQ0UgPSBuZXcgSnBhUGxhdGZvcm1SZWdpc3RyeSgpOworCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIEpwYVBsYXRmb3JtUmVnaXN0cnkgSU5TVEFOQ0UgPSBuZXcgSnBhUGxhdGZvcm1SZWdpc3RyeSgpOwogCQorCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgorCSAqLworCXB1YmxpYyBzdGF0aWMgSnBhUGxhdGZvcm1SZWdpc3RyeSBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKwogCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fSUQgPSAKIAkJImpwYVBsYXRmb3JtIjsgLy8kTk9OLU5MUy0xJAogCQpAQCAtOTgsNyArMTA2LDcgQEAKIAkgKiAgICAgSUpwYVByb2plY3QsIGVpdGhlciB3aGVuIGNyZWF0aW5nIHRoZSBwcm9qZWN0LCBvciB3aGVuIGNoYW5naW5nIHRoZSAKIAkgKiAgICAgcGxhdGZvcm0uCiAJICovCi0JcHVibGljIElKcGFQbGF0Zm9ybSBnZXRKcGFQbGF0Zm9ybShTdHJpbmcgaWQpIHsKKwlwdWJsaWMgSUpwYVBsYXRmb3JtIGpwYVBsYXRmb3JtKFN0cmluZyBpZCkgewogCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgcmVnaXN0ZXJlZENvbmZpZ0VsZW1lbnQgPSB0aGlzLmpwYVBsYXRmb3Jtcy5nZXQoaWQpOwogCQkKIAkJaWYgKHJlZ2lzdGVyZWRDb25maWdFbGVtZW50ID09IG51bGwpIHsKQEAgLTEyOSw3ICsxMzcsNyBAQAogCSAqIFJldHVybiB0aGUgbGFiZWwgZm9yIHRoZSBwbGF0Zm9ybSB3aXRoIHRoZSBnaXZlbiBpZC4KIAkgKiBUaGlzIGRvZXMgbm90IGxvYWQgdGhlIHBsYXRmb3JtJ3MgcGx1Z2luIGNsYXNzZXMuCiAJICovCi0JcHVibGljIFN0cmluZyBnZXRKcGFQbGF0Zm9ybUxhYmVsKFN0cmluZyBpZCkgeworCXB1YmxpYyBTdHJpbmcganBhUGxhdGZvcm1MYWJlbChTdHJpbmcgaWQpIHsKIAkJcmV0dXJuIGpwYVBsYXRmb3Jtcy5nZXQoaWQpLmdldEF0dHJpYnV0ZShBVF9MQUJFTCk7CiAJfQogCQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL0pwYVByb2plY3QuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9KcGFQcm9qZWN0LmphdmEKaW5kZXggNWVhZGViOC4uNjI3Njg3NiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL0pwYVByb2plY3QuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvSnBhUHJvamVjdC5qYXZhCkBAIC0xLDE0ICsxLDE1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24gYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbDsKIAoraW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CkBAIC0yMyw3ICsyNCw5IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklKb2JDaGFuZ2VFdmVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JSm9iQ2hhbmdlTGlzdGVuZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwpAQCAtNDYsNiArNDksOSBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnBsYXRmb3JtLklDb250ZXh0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC5Db25uZWN0aW9uUHJvZmlsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwuSnB0RGJQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbW1hbmRFeGVjdXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db21tYW5kRXhlY3V0b3JQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVJdGVyYXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLklNb2R1bGVDb25zdGFudHM7CkBAIC0xNDQsNiArMTUwLDEyIEBACiAJYm9vbGVhbiByZXN5bmNoaW5nID0gZmFsc2U7CiAKIAkvKioKKwkgKiBGbGFnIHRvIGluZGljYXRlIHRoYXQgdGhlIGRpc3Bvc2luZyBqb2IgaGFzIGJlZW4gc2NoZWR1bGVkIG9yIGlzIHJ1bm5pbmcKKwkgKiAob3IgaGFzIGJlZW4gcnVuLCBpbiBzb21lIGNhc2VzKQorCSAqLworCWJvb2xlYW4gZGlzcG9zaW5nID0gZmFsc2U7CisKKwkvKioKIAkgKiBGbGFnIHRvIGluZGljYXRlIHRoYXQgdGhlIHJlc3luY2hKb2IgbmVlZHMgdG8gYmUgcnVuLiAgVGhpcyBpcwogCSAqIHNldCB0byB0cnVlIGlmIHJlc3luY2hpbmcgPSB0cnVlIHNvIHRoYXQgdGhlIG5leHQgdGltZSB0aGUgam9iIGNvbXBsZXRlcwogCSAqIGl0IHdpbGwgYmUgcnVuIGFnYWluLiAKQEAgLTE1OCwyNyArMTcwLDM2IEBACiAKIAlwcml2YXRlIElKb2JDaGFuZ2VMaXN0ZW5lciByZXN5bmNoSm9iTGlzdGVuZXI7CiAKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQgTk9UCi0JICovCi0JcHJvdGVjdGVkIEpwYVByb2plY3QoKSB7CisJcHJpdmF0ZSBDb21tYW5kRXhlY3V0b3JQcm92aWRlciBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvclByb3ZpZGVyOworCisJcHJpdmF0ZSBUaHJlYWRMb2NhbDxDb21tYW5kRXhlY3V0b3I+IHRocmVhZExvY2FsTW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IgPSBuZXcgVGhyZWFkTG9jYWw8Q29tbWFuZEV4ZWN1dG9yPigpOworCisJSnBhUHJvamVjdCgpIHsKIAkJc3VwZXIoKTsKKwl9CisKKwlwcm90ZWN0ZWQgSnBhUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7CisJCXRoaXMoKTsKKwkJdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKIAkJdGhpcy5yZXN5bmNoSm9iID0gYnVpbGRSZXN5bmNoSm9iKCk7CiAJCXRoaXMucmVzeW5jaEpvYkxpc3RlbmVyID0gYnVpbGRSZXN5bmNoSm9iTGlzdGVuZXIoKTsKIAkJSm9iLmdldEpvYk1hbmFnZXIoKS5hZGRKb2JDaGFuZ2VMaXN0ZW5lcih0aGlzLnJlc3luY2hKb2JMaXN0ZW5lcik7CiAJfQogCiAJcHJpdmF0ZSBKb2IgYnVpbGRSZXN5bmNoSm9iKCkgewotCQlyZXR1cm4gbmV3IEpvYigiUmVzeW5jaGluZyBKUEEgbW9kZWwgLi4uIikgeworCQlKb2Igam9iID0gbmV3IEpvYigiUmVzeW5jaGluZyBKUEEgbW9kZWwgLi4uIikgewogCQkJQE92ZXJyaWRlCiAJCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CiAJCQkJSUNvbnRleHQgY29udGV4dEhpZXJhcmNoeSA9IGdldFBsYXRmb3JtKCkuYnVpbGRQcm9qZWN0Q29udGV4dCgpOworCQkJCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKIAkJCQlnZXRQbGF0Zm9ybSgpLnJlc3luY2goY29udGV4dEhpZXJhcmNoeSk7CisJCQkJbG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oKGVuZCAtIHN0YXJ0KSArICIgbXMgLSByZXN5bmNoIik7CiAJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7CiAJCQl9CiAJCX07CisJCWpvYi5zZXRSdWxlKHByb2plY3QpOworCQlyZXR1cm4gam9iOwogCX0KIAogCXByaXZhdGUgSUpvYkNoYW5nZUxpc3RlbmVyIGJ1aWxkUmVzeW5jaEpvYkxpc3RlbmVyKCkgewpAQCAtMTg3LDggKzIwOCwxMSBAQAogCQkJcHVibGljIHZvaWQgZG9uZShJSm9iQ2hhbmdlRXZlbnQgZXZlbnQpIHsKIAkJCQlzdXBlci5kb25lKGV2ZW50KTsKIAkJCQlpZiAoZXZlbnQuZ2V0Sm9iKCkgPT0gSnBhUHJvamVjdC50aGlzLnJlc3luY2hKb2IpIHsKLQkJCQkJSnBhUHJvamVjdC50aGlzLnJlc3luY2hpbmcgPSBmYWxzZTsKLQkJCQkJaWYgKEpwYVByb2plY3QudGhpcy5uZWVkc1RvUmVzeW5jaCkgeworCQkJCQlyZXN5bmNoaW5nID0gZmFsc2U7CisJCQkJCWlmIChldmVudC5nZXRSZXN1bHQoKS5tYXRjaGVzKElTdGF0dXMuQ0FOQ0VMKSkgeworCQkJCQkJbmVlZHNUb1Jlc3luY2ggPSBmYWxzZTsKKwkJCQkJfQorCQkJCQllbHNlIGlmIChuZWVkc1RvUmVzeW5jaCkgewogCQkJCQkJcmVzeW5jaCgpOwogCQkJCQl9CiAJCQkJfQpAQCAtMjEzLDEwICsyMzcsNiBAQAogCQlyZXR1cm4gcHJvamVjdDsKIAl9CiAKLQl2b2lkIHNldFByb2plY3QoSVByb2plY3QgdGhlUHJvamVjdCkgewotCQlwcm9qZWN0ID0gdGhlUHJvamVjdDsKLQl9Ci0KIAlwdWJsaWMgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KCkgewogCQlyZXR1cm4gSmF2YUNvcmUuY3JlYXRlKGdldFByb2plY3QoKSk7CiAJfQpAQCAtMjc3LDcgKzI5Nyw3IEBACiAJICogQHNlZSBJSnBhUHJvamVjdCNzZXRQbGF0Zm9ybShTdHJpbmcpCiAJICovCiAJcHVibGljIHZvaWQgc2V0UGxhdGZvcm0oU3RyaW5nIHBsYXRmb3JtSWQpIHsKLQkJc2V0UGxhdGZvcm0oSnBhUGxhdGZvcm1SZWdpc3RyeS5JTlNUQU5DRS5nZXRKcGFQbGF0Zm9ybShwbGF0Zm9ybUlkKSk7CisJCXNldFBsYXRmb3JtKEpwYVBsYXRmb3JtUmVnaXN0cnkuaW5zdGFuY2UoKS5qcGFQbGF0Zm9ybShwbGF0Zm9ybUlkKSk7CiAJfQogCiAJLyoqCkBAIC00ODQsNiArNTA0LDcgQEAKIAkJaWYgKGZpbGxlZCkgewogCQkJcmV0dXJuOwogCQl9CisJCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKIAkJSVJlc291cmNlUHJveHlWaXNpdG9yIHZpc2l0b3IgPSBuZXcgSVJlc291cmNlUHJveHlWaXNpdG9yKCkgewogCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlUHJveHkgcmVzb3VyY2UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKIAkJCQlzd2l0Y2ggKHJlc291cmNlLmdldFR5cGUoKSkgewpAQCAtNTAxLDI0ICs1MjIsMjEgQEAKIAkJCX0KIAkJfTsKIAkJZ2V0UHJvamVjdCgpLmFjY2VwdCh2aXNpdG9yLCBJUmVzb3VyY2UuTk9ORSk7Ci0JCXJlc3luY2goKTsKKwkJbG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKGVuZCAtIHN0YXJ0ICsgIiBtcyAtIGZpbGwiKTsKIAkJZmlsbGVkID0gdHJ1ZTsKKwkJcmVzeW5jaCgpOwogCX0KIAogCS8qKgogCSAqIEBzZWUgSUpwYVByb2plY3QjZ2V0SnBhRmlsZShJRmlsZSkKIAkgKi8KIAlwdWJsaWMgc3luY2hyb25pemVkIElKcGFGaWxlIGdldEpwYUZpbGUoSUZpbGUgZmlsZSkgewotCQlJSnBhRmlsZSBqcGFGaWxlID0gZ2V0SnBhRmlsZUludGVybmFsKGZpbGUpOwotCQlpZiAoanBhRmlsZSAhPSBudWxsKSB7CisJCUlKcGFGaWxlIGpwYUZpbGUgPSB0aGlzLmdldEpwYUZpbGVJbnRlcm5hbChmaWxlKTsKKwkJaWYgKHRoaXMuZmlsbGVkKSB7CiAJCQlyZXR1cm4ganBhRmlsZTsKIAkJfQotCQllbHNlIGlmICghZmlsbGVkKSB7Ci0JCQlyZXR1cm4gY3JlYXRlSnBhRmlsZShmaWxlKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9CisJCXJldHVybiAoanBhRmlsZSAhPSBudWxsKSA/IGpwYUZpbGUgOiB0aGlzLmNyZWF0ZUpwYUZpbGUoZmlsZSk7CiAJfQogCiAJc3luY2hyb25pemVkIElKcGFGaWxlIGdldEpwYUZpbGVJbnRlcm5hbChJRmlsZSBmaWxlKSB7CkBAIC01NjMsMjIgKzU4MSwyOSBAQAogCiAJLyoqCiAJICogSU5URVJOQUwgT05MWQotCSAqIERpc3Bvc2Ugb2YgcHJvamVjdCBiZWZvcmUgaXQgaXMgcmVtb3ZlZAorCSAqIERpc3Bvc2UgYW5kIHJlbW92ZSBwcm9qZWN0CiAJICovCiAJdm9pZCBkaXNwb3NlKCkgewotCQlmb3IgKEl0ZXJhdG9yPElKcGFGaWxlPiBzdHJlYW0gPSBuZXcgQ2xvbmVJdGVyYXRvcjxJSnBhRmlsZT4oZ2V0RmlsZXMoKSk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlkaXNwb3NlRmlsZSgoSnBhRmlsZSkgc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQkJSm9iLmdldEpvYk1hbmFnZXIoKS5yZW1vdmVKb2JDaGFuZ2VMaXN0ZW5lcih0aGlzLnJlc3luY2hKb2JMaXN0ZW5lcik7CisJCWlmIChkaXNwb3NpbmcpCisJCQlyZXR1cm47CisJCWRpc3Bvc2luZyA9IHRydWU7CisJCUpvYiBqb2IgPSBuZXcgSm9iKCJEaXNwb3NpbmcgSlBBIHByb2plY3QgLi4uIikgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJCQkJZGlzcG9zZV8oKTsKKwkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKKwkJCX0KKwkJfTsKKwkJam9iLnNldFJ1bGUocHJvamVjdCk7CisJCWpvYi5zY2hlZHVsZSgpOwogCX0KIAotCS8qKgotCSAqIElOVEVSTkFMIE9OTFkKLQkgKiBEaXNwb3NlIGZpbGUgYW5kIHJlbW92ZSBpdAotCSAqLwotCXZvaWQgZGlzcG9zZUZpbGUoSnBhRmlsZSBqcGFGaWxlKSB7Ci0JCWpwYUZpbGUuZGlzcG9zZSgpOwotCQlnZXRGaWxlcygpLnJlbW92ZShqcGFGaWxlKTsKKwlwcml2YXRlIHZvaWQgZGlzcG9zZV8oKSB7CisJCUpvYi5nZXRKb2JNYW5hZ2VyKCkucmVtb3ZlSm9iQ2hhbmdlTGlzdGVuZXIocmVzeW5jaEpvYkxpc3RlbmVyKTsKKwkJZm9yIChJSnBhRmlsZSBqcGFGaWxlIDogQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oZ2V0RmlsZXMoKSkpIHsKKwkJCSgoSnBhRmlsZSkganBhRmlsZSkuZGlzcG9zZSgpOworCQl9CisJCSgoSnBhTW9kZWwpIGdldE1vZGVsKCkpLmdldFByb2plY3RzKCkucmVtb3ZlKHRoaXMpOwogCX0KIAogCS8qKgpAQCAtNjA5LDcgKzYzNCw3IEBACiAJCQkJCQljYXNlIElSZXNvdXJjZURlbHRhLlJFTU9WRUQgOgogCQkJCQkJCUpwYUZpbGUganBhRmlsZSA9IChKcGFGaWxlKSBnZXRKcGFGaWxlKGZpbGUpOwogCQkJCQkJCWlmIChqcGFGaWxlICE9IG51bGwpIHsKLQkJCQkJCQkJZGlzcG9zZUZpbGUoanBhRmlsZSk7CisJCQkJCQkJCWpwYUZpbGUuZGlzcG9zZSgpOwogCQkJCQkJCQlKcGFQcm9qZWN0LnRoaXMucmVzeW5jaCgpOy8vVE9ETyBkaWZmZXJlbnQgYXBpIGZvciB0aGlzPwogCQkJCQkJCX0KIAkJCQkJCQlicmVhazsKQEAgLTYyMiwxNiArNjQ3LDQxIEBACiAJCX07CiAJfQogCisJLy8gUFdGVE9ETyAKKwkvLyBSZXR1cm4gYSBOdWxsUGVyc2lzdGVuY2VGaWxlIGlmIG5vIGNvbnRlbnQgZm91bmQ/CiAJc3luY2hyb25pemVkIElKcGFGaWxlIGNyZWF0ZUpwYUZpbGUoSUZpbGUgZmlsZSkgewotCQlpZiAoIUphdmFDb3JlLmNyZWF0ZShnZXRQcm9qZWN0KCkpLmlzT25DbGFzc3BhdGgoZmlsZSkpIHsKKwkJaWYgKCFKYXZhQ29yZS5jcmVhdGUodGhpcy5wcm9qZWN0KS5pc09uQ2xhc3NwYXRoKGZpbGUpKSB7CiAJCQlyZXR1cm4gbnVsbDsKIAkJfQotCQlJSnBhRmlsZSBqcGFGaWxlID0gSnBhRmlsZUNvbnRlbnRSZWdpc3RyeS5nZXRGaWxlKHRoaXMsIGZpbGUpOwotCQkvLyBQV0ZUT0RPIAotCQkvLyBSZXR1cm4gYSBOdWxsUGVyc2lzdGVuY2VGaWxlIGlmIG5vIGNvbnRlbnQgZm91bmQ/Ci0JCWlmIChqcGFGaWxlICE9IG51bGwpIHsKLQkJCWdldEZpbGVzKCkuYWRkKGpwYUZpbGUpOwotCQkJcmV0dXJuIGpwYUZpbGU7CisJCUlDb250ZW50VHlwZSBjb250ZW50VHlwZSA9IHRoaXMuY29udGVudFR5cGUoZmlsZSk7CisJCWlmIChjb250ZW50VHlwZSA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlTdHJpbmcgY29udGVudFR5cGVJZCA9IGNvbnRlbnRUeXBlLmdldElkKCk7CisJCUlKcGFGaWxlQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0gdGhpcy5nZXRQbGF0Zm9ybSgpLmZpbGVDb250ZW50UHJvdmlkZXIoY29udGVudFR5cGVJZCk7CisJCWlmIChwcm92aWRlciA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlKcGFGaWxlIGpwYUZpbGUgPSBKcGFDb3JlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSnBhRmlsZSgpOworCQl0aGlzLmdldEZpbGVzKCkuYWRkKGpwYUZpbGUpOworCQlqcGFGaWxlLnNldEZpbGUoZmlsZSk7CisJCWpwYUZpbGUuc2V0Q29udGVudElkKGNvbnRlbnRUeXBlSWQpOworCQlwcm92aWRlci5idWlsZFJvb3RDb250ZW50KGpwYUZpbGUpOworCQlyZXR1cm4ganBhRmlsZTsKKwl9CisKKwkvL2F0dGVtcHRpbmcgdG8gZ2V0IHRoZSBjb250ZW50VHlwZSBiYXNlZCBvbiB0aGUgZmlsZSBjb250ZW50cy4KKwkvL2hhdmUgdG8gY2hlY2sgdGhlIGZpbGUgY29udGVudHMgaW5zdGVhZCBvZiBqdXN0IHRoZSBmaWxlIG5hbWUKKwkvL2JlY2F1c2UgZm9yIHhtbCB3ZSBiYXNlIGl0IG9uIHRoZSByb290RWxlbWVudCBuYW1lCisJcHJpdmF0ZSBJQ29udGVudFR5cGUgY29udGVudFR5cGUoSUZpbGUgZmlsZSkgeworCQl0cnkgeworCQkJcmV0dXJuIFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmZpbmRDb250ZW50VHlwZUZvcihmaWxlLmdldENvbnRlbnRzKCksIGZpbGUuZ2V0TmFtZSgpKTsKKwkJfQorCQljYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKwkJCUpwdENvcmVQbHVnaW4ubG9nKGV4KTsKKwkJfQorCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgeworCQkJSnB0Q29yZVBsdWdpbi5sb2coZXgpOwogCQl9CiAJCXJldHVybiBudWxsOwogCX0KQEAgLTY1OSw2ICs3MDksOSBAQAogCS8vcGFzc2luZyBpdCBvbiB0byB0aGUgSnBhTW9kZWwuICBXZSBkb24ndCBjdXJyZW50bHkgc3VwcG9ydAogCS8vbXVsdGlwbGUgcHJvamVjdHMgaGF2aW5nIGNyb3NzLXJlZmVyZW5jZXMKIAlwdWJsaWMgdm9pZCByZXN5bmNoKCkgeworCQkvL2Rvbid0IHJlc3luY2ggdW50aWwgdGhlIHByb2plY3QgaXMgZmlsbGVkCisJCWlmIChkaXNwb3NpbmcgfHwgIWZpbGxlZCkKKwkJCXJldHVybjsKIAkJaWYgKCF0aGlzLnJlc3luY2hpbmcpIHsKIAkJCXRoaXMucmVzeW5jaGluZyA9IHRydWU7CiAJCQl0aGlzLm5lZWRzVG9SZXN5bmNoID0gZmFsc2U7CkBAIC03NzUsOSArODI4LDYgQEAKIAkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwogCX0KIAotCS8qKgotCSAqIEBnZW5lcmF0ZWQgTk9UCi0JICovCiAJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CkBAIC03ODUsOCArODM1LDM5IEBACiAJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgQ29ubmVjdGlvblByb2ZpbGUgY29ubmVjdGlvblByb2ZpbGUoKSB7CiAJCVN0cmluZyBwcm9maWxlTmFtZSA9IGdldERhdGFTb3VyY2UoKS5nZXRDb25uZWN0aW9uUHJvZmlsZU5hbWUoKTsKIAkJcmV0dXJuIEpwdERiUGx1Z2luLmdldERlZmF1bHQoKS5nZXRDb25uZWN0aW9uUHJvZmlsZVJlcG9zaXRvcnkoKS5wcm9maWxlTmFtZWQocHJvZmlsZU5hbWUpOwogCX0KKworCXB1YmxpYyBDb21tYW5kRXhlY3V0b3IgZ2V0VGhyZWFkTG9jYWxNb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvcigpIHsKKwkJQ29tbWFuZEV4ZWN1dG9yIGNvbW1hbmRFeGVjdXRvciA9IHRoaXMudGhyZWFkTG9jYWxNb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvci5nZXQoKTsKKwkJcmV0dXJuIChjb21tYW5kRXhlY3V0b3IgIT0gbnVsbCkgPyBjb21tYW5kRXhlY3V0b3IgOiBDb21tYW5kRXhlY3V0b3IuRGVmYXVsdC5pbnN0YW5jZSgpOworCX0KKworCXB1YmxpYyB2b2lkIHNldFRocmVhZExvY2FsTW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IoQ29tbWFuZEV4ZWN1dG9yIGNvbW1hbmRFeGVjdXRvcikgeworCQl0aGlzLnRocmVhZExvY2FsTW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3Iuc2V0KGNvbW1hbmRFeGVjdXRvcik7CisJfQorCisJcHVibGljIENvbW1hbmRFeGVjdXRvclByb3ZpZGVyIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yUHJvdmlkZXIoKSB7CisJCWlmICh0aGlzLm1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yUHJvdmlkZXIgPT0gbnVsbCkgeworCQkJdGhpcy5tb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvclByb3ZpZGVyID0gbmV3IE1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yUHJvdmlkZXIoKTsKKwkJfQorCQlyZXR1cm4gdGhpcy5tb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvclByb3ZpZGVyOworCX0KKworCisJLy8gKioqKioqKioqKiBtZW1iZXIgY2xhc3MgKioqKioqKioqKgorCXByaXZhdGUgY2xhc3MgTW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3JQcm92aWRlcgorCQlpbXBsZW1lbnRzIENvbW1hbmRFeGVjdXRvclByb3ZpZGVyCisJeworCQlNb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvclByb3ZpZGVyKCkgeworCQkJc3VwZXIoKTsKKwkJfQorCisJCXB1YmxpYyBDb21tYW5kRXhlY3V0b3IgY29tbWFuZEV4ZWN1dG9yKCkgeworCQkJcmV0dXJuIEpwYVByb2plY3QudGhpcy5nZXRUaHJlYWRMb2NhbE1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yKCk7CisJCX0KKwl9CiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvSnB0Q29yZVBsdWdpbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL0pwdENvcmVQbHVnaW4uamF2YQppbmRleCAyZGI1Njc1Li4zOGM0Mjk4IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvSnB0Q29yZVBsdWdpbi5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9KcHRDb3JlUGx1Z2luLmphdmEKQEAgLTI3LDE5ICsyNywxOSBAQAogCSAqIFRoZSBwbHVnLWluIGlkZW50aWZpZXIgb2YgdGhlIHBlcnNpc3RlbmNlIHN1cHBvcnQKIAkgKiAodmFsdWUgPGNvZGU+Im9yZy5lY2xpcHNlLmpwdC5jb3JlIjwvY29kZT4pLgogCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qcHQuY29yZSI7ICAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpwdC5jb3JlIjsgIC8vJE5PTi1OTFMtMSQKIAkKIAkvKioKIAkgKiBUaGUgaWRlbnRpZmllciBmb3IgdGhlIEpQQSBmYWNldAogCSAqICh2YWx1ZSA8Y29kZT4ianB0LmpwYSI8L2NvZGU+KS4KIAkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBGQUNFVF9JRCA9ICJqcHQuanBhIjsgIC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQUNFVF9JRCA9ICJqcHQuanBhIjsgIC8vJE5PTi1OTFMtMSQKIAkKIAkvKioKIAkgKiBUaGUgaWRlbnRpZmllciBmb3IgdGhlIEpQQSB2YWxpZGF0aW9uIG1hcmtlcgogCSAqICh2YWx1ZSA8Y29kZT4ib3JnLmVjbGlwc2UuanB0LmNvcmUuanBhUHJvYmxlbU1hcmtlciI8L2NvZGU+KS4KIAkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWQUxJREFUSU9OX01BUktFUl9JRCA9IFBMVUdJTl9JRCArICIuanBhUHJvYmxlbU1hcmtlciI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9NQVJLRVJfSUQgPSBQTFVHSU5fSUQgKyAiLmpwYVByb2JsZW1NYXJrZXIiOwogCQogCS8qKgogCSAqIFZhbHVlIG9mIHRoZSBjb250ZW50LXR5cGUgZm9yIG9ybS54bWwgbWFwcGluZ3MgZmlsZXMuIFVzZSB0aGlzIHZhbHVlIHRvIHJldHJpZXZlIApAQCAtNTMsNiArNTMsMTMgQEAKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5DRV9YTUxfQ09OVEVOVF9UWVBFID0gUExVR0lOX0lEICsgIi5jb250ZW50LnBlcnNpc3RlbmNlIjsgLy8kTk9OLU5MUy0xJAogCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV9DT05URU5UX1RZUEUgPSBKYXZhQ29yZS5KQVZBX1NPVVJDRV9DT05URU5UX1RZUEU7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIGN1cnJlbnQgd29ya3NwYWNlJ3MgbW9kZWwgbWFuYWdlci4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBKcGFNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyKCkgeworCQlyZXR1cm4gSnBhTW9kZWxNYW5hZ2VyLmluc3RhbmNlKCk7CisJfQogCQogCS8qKgogCSAqIFJldHVybnMgdGhlIHNpbmd1bGFyIElKcGFNb2RlbCBjb3JyZXNwb25kaW5nIHRvIHRoZSBjdXJyZW50IHdvcmtzcGFjZS4KQEAgLTYwLDcgKzY3LDcgQEAKIAkgKiBAcmV0dXJuIHRoZSBzaW5ndWxhciBJSnBhTW9kZWwgY29ycmVzcG9uZGluZyB0byB0aGUgY3VycmVudCB3b3Jrc3BhY2UuCiAJICovCiAJcHVibGljIHN0YXRpYyBJSnBhTW9kZWwgZ2V0SnBhTW9kZWwoKSB7Ci0JCXJldHVybiBKcGFNb2RlbE1hbmFnZXIuaW5zdGFuY2UoKS5nZXRKcGFNb2RlbCgpOworCQlyZXR1cm4gbW9kZWxNYW5hZ2VyKCkuZ2V0SnBhTW9kZWwoKTsKIAl9CiAJCiAJLyoqCkBAIC03NCw3ICs4MSw3IEBACiAJICogSUpwYVByb2plY3QKIAkgKi8KIAlwdWJsaWMgc3RhdGljIElKcGFQcm9qZWN0IGdldEpwYVByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gSnBhTW9kZWxNYW5hZ2VyLmluc3RhbmNlKCkuZ2V0SnBhUHJvamVjdChwcm9qZWN0KTsKKwkJcmV0dXJuIG1vZGVsTWFuYWdlcigpLmdldEpwYVByb2plY3QocHJvamVjdCk7CiAJfQogCQogCS8qKgpAQCAtODgsNyArOTUsNyBAQAogCSAqIElKcGFGaWxlCiAJICovCiAJcHVibGljIHN0YXRpYyBJSnBhRmlsZSBnZXRKcGFGaWxlKElGaWxlIGZpbGUpIHsKLQkJcmV0dXJuIEpwYU1vZGVsTWFuYWdlci5pbnN0YW5jZSgpLmdldEpwYUZpbGUoZmlsZSk7CisJCXJldHVybiBtb2RlbE1hbmFnZXIoKS5nZXRKcGFGaWxlKGZpbGUpOwogCX0KIAkKIAkvKioKQEAgLTEwOSwxMCArMTE2LDE1IEBACiAJcHVibGljIHN0YXRpYyB2b2lkIGxvZyhUaHJvd2FibGUgdGhyb3dhYmxlKSB7CiAJCWxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBMVUdJTl9JRCwgSVN0YXR1cy5PSywgdGhyb3dhYmxlLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgdGhyb3dhYmxlKSk7CiAJfQotCQotCQorCisKKwkvLyAqKioqKioqKioqIHBsdWctaW4gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgorCiAJcHVibGljIEpwdENvcmVQbHVnaW4oKSB7CiAJCXN1cGVyKCk7CisJCWlmIChJTlNUQU5DRSAhPSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisJCX0KIAkJSU5TVEFOQ0UgPSB0aGlzOwogCX0KIAkKQEAgLTEyMCw3ICsxMzIsNyBAQAogCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlKcGFNb2RlbE1hbmFnZXIuaW5zdGFuY2UoKS5zdGFydHVwKCk7CisJCW1vZGVsTWFuYWdlcigpLnN0YXJ0KCk7CiAJCU9ybUluaXQuaW5pdCgpOwogCQlQZXJzaXN0ZW5jZUluaXQuaW5pdCgpOwogCX0KQEAgLTEyOCw3ICsxNDAsNyBAQAogCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJdHJ5IHsKLQkJCUpwYU1vZGVsTWFuYWdlci5pbnN0YW5jZSgpLnNodXRkb3duKCk7CisJCQltb2RlbE1hbmFnZXIoKS5zdG9wKCk7CiAJCX0KIAkJZmluYWxseSB7CiAJCQlzdXBlci5zdG9wKGNvbnRleHQpOwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL051bGxUeXBlTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL051bGxUeXBlTWFwcGluZy5qYXZhCmluZGV4IDAxZGJkM2IuLmM2MDAyNWIgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9OdWxsVHlwZU1hcHBpbmcuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvTnVsbFR5cGVNYXBwaW5nLmphdmEKQEAgLTEzLDYgKzEzLDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5FbGVtZW50Q2hhbmdlZEV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklUYWJsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwuU2NoZW1hOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC5UYWJsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlJdGVyYXRvcjsKQEAgLTIxMywxNSArMjE0LDE1IEBACiAKIAlwdWJsaWMgdm9pZCBqYXZhRWxlbWVudENoYW5nZWQoRWxlbWVudENoYW5nZWRFdmVudCBldmVudCkge30KIAotCXB1YmxpYyBJdGVyYXRvciBhc3NvY2lhdGVkVGFibGVOYW1lc0luY2x1ZGluZ0luaGVyaXRlZCgpIHsKKwlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBhc3NvY2lhdGVkVGFibGVOYW1lc0luY2x1ZGluZ0luaGVyaXRlZCgpIHsKIAkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKIAl9CiAKLQlwdWJsaWMgSXRlcmF0b3IgYXNzb2NpYXRlZFRhYmxlcygpIHsKKwlwdWJsaWMgSXRlcmF0b3I8SVRhYmxlPiBhc3NvY2lhdGVkVGFibGVzKCkgewogCQlyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwogCX0KIAotCXB1YmxpYyBJdGVyYXRvciBhc3NvY2lhdGVkVGFibGVzSW5jbHVkaW5nSW5oZXJpdGVkKCkgeworCXB1YmxpYyBJdGVyYXRvcjxJVGFibGU+IGFzc29jaWF0ZWRUYWJsZXNJbmNsdWRpbmdJbmhlcml0ZWQoKSB7CiAJCXJldHVybiBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7CiAJfQogCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL0lEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9JRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTdmYmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9JRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDMxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHkuQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnBsYXRmb3JtLkRlZmF1bHRzQ29udGV4dDsKKworLyoqCisgKiBNYXAgYSBzdHJpbmcga2V5IHRvIGFuIGF0dHJpYnV0ZSBtYXBwaW5nIGFuZCBpdHMgY29ycmVzcG9uZGluZworICogSmF2YSBhbm5vdGF0aW9uIGFkYXB0ZXIuICAKKyAqLworcHVibGljIGludGVyZmFjZSBJRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIgZXh0ZW5kcyBJSmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlciB7CisKKwkvKioKKwkgKiBHaXZlbiB0aGUgQXR0cmlidXRlIGFuZCBEZWZhdWx0Q29udGV4dCByZXR1cm4gd2hldGhlciB0aGUgZGVmYXVsdCBtYXBwaW5nIGFwcGxpZXMuCisJICogVGhpcyB3aWxsIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBkZWZhdWx0IG1hcHBpbmcgaW4gdGhlIGNhc2Ugd2hlcmUgbm8gCisJICogbWFwcGluZyBoYXMgYmVlbiBzcGVjaWZpZWQuCisJICogQHBhcmFtIGF0dHJpYnV0ZQorCSAqIEBwYXJhbSBkZWZhdWx0c0NvbnRleHQKKwkgKiBAcmV0dXJuCisJICovCisJYm9vbGVhbiBkZWZhdWx0QXBwbGllcyhBdHRyaWJ1dGUgYXR0cmlidXRlLCBEZWZhdWx0c0NvbnRleHQgZGVmYXVsdHNDb250ZXh0KTsKKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9JSmF2YUF0dHJpYnV0ZU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvSUphdmFBdHRyaWJ1dGVNYXBwaW5nLmphdmEKaW5kZXggOTE4Zjc3Yy4uNWIyZjVjYSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9JSmF2YUF0dHJpYnV0ZU1hcHBpbmcuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL0lKYXZhQXR0cmlidXRlTWFwcGluZy5qYXZhCkBAIC0yNywxOCArMjcsNiBAQAogICovCiBwdWJsaWMgaW50ZXJmYWNlIElKYXZhQXR0cmlidXRlTWFwcGluZyBleHRlbmRzIElBdHRyaWJ1dGVNYXBwaW5nCiB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBJbml0aWFsaXplIHRoZSBtb2RlbCBhZnRlciB0aGUgQXR0cmlidXRlTWFwcGluZyBoYXMgYmVlbgotCSAqIGNyZWF0ZWQgYW5kIGFkZGVkIHRvIGl0cyBjb250YWluZXIuICBTb21lIHRoaW5ncwotCSAqIGNhbid0IGJlIGFjY2Vzc2VkLiAgQnVpbGQgYW55dGhpbmcgdGhhdCBkb2Vzbid0IGRlcGVuZAotCSAqIG9uIHJlc291cmNlcyB0aHJvdWdob3V0IHRoZSBtb2RlbCBiZWluZyBidWlsdC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBpbml0aWFsaXplKCk7Ci0KIAl2b2lkIHVwZGF0ZUZyb21KYXZhKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKIAogCS8qKgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9JSmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9JSmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlci5qYXZhCmluZGV4IGZmNzE3NjQuLjE2YWQ4NGUgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvSUphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL0lKYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyLmphdmEKQEAgLTksOSArOSw5IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmE7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JSnBhRmFjdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qZHR1dGlsaXR5LkF0dHJpYnV0ZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qZHR1dGlsaXR5LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucGxhdGZvcm0uRGVmYXVsdHNDb250ZXh0OwogCiAvKioKICAqIE1hcCBhIHN0cmluZyBrZXkgdG8gYW4gYXR0cmlidXRlIG1hcHBpbmcgYW5kIGl0cyBjb3JyZXNwb25kaW5nCkBAIC0xOSwxMSArMTksMTkgQEAKICAqLwogcHVibGljIGludGVyZmFjZSBJSmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlciB7CiAKKwkvKioKKwkgKiBBIHVuaXF1ZSBTdHJpbmcgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgSUphdmFBdHRyaWJ1dGVNYXBwaW5nIGtleSAKKwkgKi8KIAlTdHJpbmcga2V5KCk7CiAKLQlib29sZWFuIGRlZmF1bHRBcHBsaWVzKEF0dHJpYnV0ZSBhdHRyaWJ1dGUsIERlZmF1bHRzQ29udGV4dCBkZWZhdWx0c0NvbnRleHQpOwotCi0JSUphdmFBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkTWFwcGluZyhBdHRyaWJ1dGUgYXR0cmlidXRlKTsKKwkvKioKKwkgKiBDcmVhdGUgYW4gSUphdmFBdHRyaWJ1dGVNYXBwaW5nIGZvciB0aGUgZ2l2ZW4gYXR0cmlidXRlLiAgVXNlIHRoZSBJSnBhRmFjdG9yeQorCSAqIGZvciBjcmVhdGlvbiBzbyB0aGF0IGV4dGVuZGVycyBjYW4gY3JlYXRlIHRoZWlyIG93biBJSnBhRmFjdG9yeSBpbnN0ZWFkIG9mIAorCSAqIGNyZWF0aW5nIHRoZWlyIG93biBhdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIuCisJICogQHBhcmFtIGF0dHJpYnV0ZQorCSAqIEBwYXJhbSBqcGFGYWN0b3J5CisJICovCisJSUphdmFBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkTWFwcGluZyhBdHRyaWJ1dGUgYXR0cmlidXRlLCBJSnBhRmFjdG9yeSBqcGFGYWN0b3J5KTsKIAogCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigpOwogCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL0lKYXZhVHlwZU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvSUphdmFUeXBlTWFwcGluZy5qYXZhCmluZGV4IDRhOTY0NjQuLjhiOTliNGYgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvSUphdmFUeXBlTWFwcGluZy5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvSUphdmFUeXBlTWFwcGluZy5qYXZhCkBAIC0yNiwxNCArMjYsNiBAQAogICovCiBwdWJsaWMgaW50ZXJmYWNlIElKYXZhVHlwZU1hcHBpbmcgZXh0ZW5kcyBJVHlwZU1hcHBpbmcKIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIGluaXRpYWxpemUoKTsKLQogCXZvaWQgdXBkYXRlRnJvbUphdmEoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwogCiAJLyoqCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL0lKYXZhVHlwZU1hcHBpbmdQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9JSmF2YVR5cGVNYXBwaW5nUHJvdmlkZXIuamF2YQppbmRleCA5ZjM0Njc1Li5iMjE0MTIwIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL0lKYXZhVHlwZU1hcHBpbmdQcm92aWRlci5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvSUphdmFUeXBlTWFwcGluZ1Byb3ZpZGVyLmphdmEKQEAgLTksNiArOSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmE7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JSnBhRmFjdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qZHR1dGlsaXR5LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuamR0dXRpbGl0eS5UeXBlOwogCkBAIC0xOCw5ICsxOSwxOSBAQAogICovCiBwdWJsaWMgaW50ZXJmYWNlIElKYXZhVHlwZU1hcHBpbmdQcm92aWRlciB7CiAKKwkvKioKKwkgKiBBIHVuaXF1ZSBTdHJpbmcgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgSUphdmFUeXBlTWFwcGluZyBrZXkgCisJICovCiAJU3RyaW5nIGtleSgpOwogCi0JSUphdmFUeXBlTWFwcGluZyBidWlsZE1hcHBpbmcoVHlwZSB0eXBlKTsKKwkvKioKKwkgKiBDcmVhdGUgYW4gSUphdmFUeXBlTWFwcGluZyBmb3IgdGhlIGdpdmVuIGF0dHJpYnV0ZS4gIFVzZSB0aGUgSUpwYUZhY3RvcnkKKwkgKiBmb3IgY3JlYXRpb24gc28gdGhhdCBleHRlbmRlcnMgY2FuIGNyZWF0ZSB0aGVpciBvd24gSUpwYUZhY3RvcnkgaW5zdGVhZCBvZiAKKwkgKiBjcmVhdGluZyB0aGVpciBvd24gdHlwZU1hcHBpbmdQcm92aWRlci4KKwkgKiBAcGFyYW0gdHlwZQorCSAqIEBwYXJhbSBqcGFGYWN0b3J5CisJICovCisJSUphdmFUeXBlTWFwcGluZyBidWlsZE1hcHBpbmcoVHlwZSB0eXBlLCBJSnBhRmFjdG9yeSBmYWN0b3J5KTsKIAogCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigpOwogCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL0phdmFKcGFGaWxlQ29udGVudFByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL0phdmFKcGFGaWxlQ29udGVudFByb3ZpZGVyLmphdmEKaW5kZXggMjdjNTYxYi4uM2FhZWQ5YiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9KYXZhSnBhRmlsZUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvSmF2YUpwYUZpbGVDb250ZW50UHJvdmlkZXIuamF2YQpAQCAtMSwzMyArMSw0MiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KICAqIAogICogQ29udHJpYnV0b3JzOgogICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhOwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSUpwYUZpbGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSUpwYUZpbGVDb250ZW50UHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSUpwYVJvb3RDb250ZW50Tm9kZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5KcHRDb3JlUGx1Z2luOwogCiBwdWJsaWMgY2xhc3MgSmF2YUpwYUZpbGVDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJSnBhRmlsZUNvbnRlbnRQcm92aWRlcgogewotCXB1YmxpYyBzdGF0aWMgSmF2YUpwYUZpbGVDb250ZW50UHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgSmF2YUpwYUZpbGVDb250ZW50UHJvdmlkZXIoKTsKKwkvL3NpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFKcGFGaWxlQ29udGVudFByb3ZpZGVyIElOU1RBTkNFID0gbmV3IEphdmFKcGFGaWxlQ29udGVudFByb3ZpZGVyKCk7CiAJCiAJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCisJICovCisJcHVibGljIHN0YXRpYyBJSnBhRmlsZUNvbnRlbnRQcm92aWRlciBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKworCS8qKgogCSAqIFJlc3RyaWN0IGFjY2VzcwogCSAqLwogCXByaXZhdGUgSmF2YUpwYUZpbGVDb250ZW50UHJvdmlkZXIoKSB7CiAJCXN1cGVyKCk7CiAJfQogCQotCXB1YmxpYyBJSnBhUm9vdENvbnRlbnROb2RlIGJ1aWxkUm9vdENvbnRlbnQoSUZpbGUgcmVzb3VyY2VGaWxlKSB7CisJcHVibGljIElKcGFSb290Q29udGVudE5vZGUgYnVpbGRSb290Q29udGVudChJSnBhRmlsZSBqcGFGaWxlKSB7CiAJCUpwYUNvbXBpbGF0aW9uVW5pdCBjb250ZW50ID0gSnBhSmF2YUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUpwYUNvbXBpbGF0aW9uVW5pdCgpOwotCQljb250ZW50LnNldEZpbGUocmVzb3VyY2VGaWxlKTsKKwkJanBhRmlsZS5zZXRDb250ZW50KGNvbnRlbnQpOworCQljb250ZW50LnNldEZpbGUoanBhRmlsZS5nZXRGaWxlKCkpOwogCQlyZXR1cm4gY29udGVudDsKIAl9CiAJCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL0phdmFQZXJzaXN0ZW50QXR0cmlidXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL0phdmFQZXJzaXN0ZW50QXR0cmlidXRlLmphdmEKaW5kZXggMDczZTJkOC4uMjU1OTZiZiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuamF2YQpAQCAtOSw5ICs5LDggQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YTsKIAotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CkBAIC0yNSwyMyArMjQsMTEgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JVGV4dFJhbmdlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklUeXBlTWFwcGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5KcGFDb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSmF2YUJhc2ljUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLkphdmFFbWJlZGRlZElkUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLkphdmFFbWJlZGRlZFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5KYXZhSWRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSmF2YU1hbnlUb01hbnlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSmF2YU1hbnlUb09uZVByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5KYXZhTnVsbEF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSmF2YU9uZVRvTWFueVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5KYXZhT25lVG9PbmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSmF2YVRyYW5zaWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5KYXZhVmVyc2lvblByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHkuQXR0cmlidXRlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHkuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5wbGF0Zm9ybS5EZWZhdWx0c0NvbnRleHQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOwogCiAvKioKICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC04NSwxNiArNzIsNiBAQAogCiAJcHJpdmF0ZSBBdHRyaWJ1dGUgYXR0cmlidXRlOwogCi0JLy8gVE9ETyBtb3ZlIHRoZXNlIHRvIHRoZSBwbGF0Zm9ybQotCXByaXZhdGUgSUphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXJbXSBhdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXJzOwotCi0JLyoqCi0JICogdGhlICJudWxsIiBhdHRyaWJ1dGUgbWFwcGluZyBpcyB1c2VkIHdoZW4gdGhlIGF0dHJpYnV0ZSBpcyBuZWl0aGVyCi0JICogbW9kaWZpZWQgd2l0aCBhIG1hcHBpbmcgYW5ub3RhdGlvbiBub3IgbWFwcGVkIGJ5IGEgImRlZmF1bHQiIG1hcHBpbmcKLQkgKi8KLQkvLyBUT0RPIG1vdmUgdGhpcyB0byB0aGUgcGxhdGZvcm0KLQlwcml2YXRlIElKYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyIG51bGxBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXI7Ci0KIAkvKioKIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtMTA3LDM2ICs4NCwyMyBAQAogCXByb3RlY3RlZCBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZShBdHRyaWJ1dGUgYXR0cmlidXRlKSB7CiAJCXN1cGVyKCk7CiAJCXRoaXMuYXR0cmlidXRlID0gYXR0cmlidXRlOwotCQl0aGlzLmF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcnMgPSB0aGlzLmJ1aWxkQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVycygpOwotCQl0aGlzLm51bGxBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIgPSB0aGlzLmJ1aWxkTnVsbEF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcigpOwotCQl0aGlzLnNldERlZmF1bHRNYXBwaW5nKHRoaXMubnVsbEF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlci5idWlsZE1hcHBpbmcodGhpcy5hdHRyaWJ1dGUpKTsKKwkJLy9ubyBhY2Nlc3MgdG8gdGhlIGpwYUZhY3RvcnkoKSBpbiB0aGUgY29uc3RydWN0b3IgYmVjYXVzZSB0aGUgcGFyZW50IGlzIG5vdCBzZXQgeWV0CisJCXRoaXMuc2V0RGVmYXVsdE1hcHBpbmcodGhpcy5udWxsQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyKCkuYnVpbGRNYXBwaW5nKHRoaXMuYXR0cmlidXRlLCBudWxsKSk7CiAJfQogCi0JcHJpdmF0ZSBJSmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcltdIGJ1aWxkQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVycygpIHsKLQkJTGlzdDxJSmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcj4gcHJvdmlkZXJzID0gbmV3IEFycmF5TGlzdDxJSmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcj4oKTsKLQkJdGhpcy5hZGRBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXJzVG8ocHJvdmlkZXJzKTsKLQkJcmV0dXJuIHByb3ZpZGVycy50b0FycmF5KG5ldyBJSmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcltwcm92aWRlcnMuc2l6ZSgpXSk7CisJcHJpdmF0ZSBJdGVyYXRvcjxJSmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcj4gYXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVycygpIHsKKwkJcmV0dXJuIGpwYVBsYXRmb3JtKCkuamF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcnMoKTsKKwl9CisKKwlwcml2YXRlIExpc3RJdGVyYXRvcjxJRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXI+IGRlZmF1bHRBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXJzKCkgeworCQlyZXR1cm4ganBhUGxhdGZvcm0oKS5kZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcnMoKTsKIAl9CiAKIAkvKioKLQkgKiBPdmVycmlkZSB0aGlzIHRvIHNwZWNpZnkgbW9yZSBvciBkaWZmZXJlbnQgYXR0cmlidXRlIG1hcHBpbmcgcHJvdmlkZXJzLgotCSAqIFRoZSBkZWZhdWx0IGluY2x1ZGVzIHRoZSBKUEEgc3BlYy1kZWZpbmVkIHR5cGUgbWFwcGluZ3Mgb2YgCi0JICogQmFzaWMsIElkLCBPbmVUb09uZSwgT25lVG9NYW55LCBNYW55VG9PbmUsIE1hbnlUb01hbnksIEVtYmVkZGFibGUsIEVtYmVkZGVkSWQuCisJICogdGhlICJudWxsIiBhdHRyaWJ1dGUgbWFwcGluZyBpcyB1c2VkIHdoZW4gdGhlIGF0dHJpYnV0ZSBpcyBuZWl0aGVyCisJICogbW9kaWZpZWQgd2l0aCBhIG1hcHBpbmcgYW5ub3RhdGlvbiBub3IgbWFwcGVkIGJ5IGEgImRlZmF1bHQiIG1hcHBpbmcKIAkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXJzVG8oTGlzdDxJSmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcj4gcHJvdmlkZXJzKSB7Ci0JCXByb3ZpZGVycy5hZGQoSmF2YUVtYmVkZGVkUHJvdmlkZXIuaW5zdGFuY2UoKSk7IC8vYnVnIDE5MDM0NCBuZWVkIHRvIHRlc3QgZGVmYXVsdCBlbWJlZGRlZCBiZWZvcmUgYmFzaWMKLQkJcHJvdmlkZXJzLmFkZChKYXZhQmFzaWNQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChKYXZhSWRQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChKYXZhVHJhbnNpZW50UHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoSmF2YU9uZVRvTWFueVByb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKEphdmFNYW55VG9PbmVQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChKYXZhTWFueVRvTWFueVByb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKEphdmFPbmVUb09uZVByb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKEphdmFFbWJlZGRlZElkUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoSmF2YVZlcnNpb25Qcm92aWRlci5pbnN0YW5jZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIgYnVpbGROdWxsQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyKCkgeworCXByb3RlY3RlZCBJSmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlciBudWxsQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyKCkgewogCQlyZXR1cm4gSmF2YU51bGxBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIuaW5zdGFuY2UoKTsKIAl9CiAKQEAgLTQ3MSwxMiArNDM1LDEyIEBACiAJCX0KIAkJZWxzZSB7CiAJCQkvLyBhZGQgb3IgcmVwbGFjZSBtYXBwaW5nIGFubm90YXRpb24KLQkJCXRoaXMuc2V0U3BlY2lmaWVkTWFwcGluZyh0aGlzLmF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlckZvcihuZXdLZXkpLmJ1aWxkTWFwcGluZyh0aGlzLmF0dHJpYnV0ZSkpOworCQkJdGhpcy5zZXRTcGVjaWZpZWRNYXBwaW5nKHRoaXMuYXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyKG5ld0tleSkuYnVpbGRNYXBwaW5nKHRoaXMuYXR0cmlidXRlLCBqcGFGYWN0b3J5KCkpKTsKIAkJCWlmIChvbGRLZXkgIT0gbnVsbCkgewogCQkJCXRoaXMuYXR0cmlidXRlLnJlbW92ZUFubm90YXRpb24odGhpcy5kZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyRm9yQXR0cmlidXRlTWFwcGluZ0tleShvbGRLZXkpKTsKIAkJCX0KIAkJCXRoaXMuYXR0cmlidXRlLm5ld01hcmtlckFubm90YXRpb24odGhpcy5kZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyRm9yQXR0cmlidXRlTWFwcGluZ0tleShuZXdLZXkpKTsKLQkJCXRoaXMuc3BlY2lmaWVkTWFwcGluZy5pbml0aWFsaXplKCk7CisJCQl0aGlzLnNwZWNpZmllZE1hcHBpbmcudXBkYXRlRnJvbUphdmEoZ2V0QXR0cmlidXRlKCkuYXN0Um9vdCgpKTsKIAkJfQogCQlpZiAodGhpcy5lTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewogCQkJdGhpcy5lTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKcGFKYXZhUGFja2FnZS5KQVZBX1BFUlNJU1RFTlRfQVRUUklCVVRFX19NQVBQSU5HLCBvbGQsIHRoaXMuZ2V0TWFwcGluZygpKSk7CkBAIC00ODQsMjggKzQ0OCwxNCBAQAogCX0KIAogCXByaXZhdGUgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyRm9yQXR0cmlidXRlTWFwcGluZ0tleShTdHJpbmcgYXR0cmlidXRlTWFwcGluZ0tleSkgewotCQlyZXR1cm4gdGhpcy5hdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXJGb3IoYXR0cmlidXRlTWFwcGluZ0tleSkuZGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigpOworCQlyZXR1cm4gdGhpcy5hdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIoYXR0cmlidXRlTWFwcGluZ0tleSkuZGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigpOwogCX0KIAogCS8qKgogCSAqIHRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgcHJvdmlkZXIgaXMgbm90IGZvdW5kCiAJICovCi0JcHJpdmF0ZSBJSmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlciBhdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXJGb3IoU3RyaW5nIGF0dHJpYnV0ZU1hcHBpbmdLZXkpIHsKLQkJZm9yIChJSmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlciBwcm92aWRlciA6IHRoaXMuYXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVycykgewotCQkJaWYgKHByb3ZpZGVyLmtleSgpID09IGF0dHJpYnV0ZU1hcHBpbmdLZXkpIHsKLQkJCQlyZXR1cm4gcHJvdmlkZXI7Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgYXR0cmlidXRlIG1hcHBpbmcga2V5OiAiICsgYXR0cmlidXRlTWFwcGluZ0tleSk7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gY2FuZGlkYXRlTWFwcGluZ0tleXMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxJSmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlciwgU3RyaW5nPihuZXcgQXJyYXlJdGVyYXRvcjxJSmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcj4odGhpcy5hdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXJzKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShJSmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlciBwcm92aWRlcikgewotCQkJCXJldHVybiBwcm92aWRlci5rZXkoKTsKLQkJCX0KLQkJfTsKKwlwcml2YXRlIElKYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyIGF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcihTdHJpbmcgYXR0cmlidXRlTWFwcGluZ0tleSkgeworCQlyZXR1cm4ganBhUGxhdGZvcm0oKS5qYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyKGF0dHJpYnV0ZU1hcHBpbmdLZXkpOwogCX0KIAogCXB1YmxpYyBPYmplY3QgZ2V0SWQoKSB7CkBAIC01NTksOCArNTA5LDcgQEAKIAkJCX0KIAkJCWVsc2UgewogCQkJCS8vIHRoZSBtYXBwaW5nIGhhcyBjaGFuZ2VkCi0JCQkJdGhpcy5zZXRTcGVjaWZpZWRNYXBwaW5nKGphdmFQcm92aWRlci5idWlsZE1hcHBpbmcodGhpcy5hdHRyaWJ1dGUpKTsKLQkJCQl0aGlzLnNwZWNpZmllZE1hcHBpbmcuaW5pdGlhbGl6ZSgpOworCQkJCXRoaXMuc2V0U3BlY2lmaWVkTWFwcGluZyhqYXZhUHJvdmlkZXIuYnVpbGRNYXBwaW5nKHRoaXMuYXR0cmlidXRlLCBqcGFGYWN0b3J5KCkpKTsKIAkJCX0KIAkJCWlmICh0aGlzLmVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7CiAJCQkJdGhpcy5lTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKcGFKYXZhUGFja2FnZS5KQVZBX1BFUlNJU1RFTlRfQVRUUklCVVRFX19NQVBQSU5HLCBvbGQsIHRoaXMuZ2V0TWFwcGluZygpKSk7CkBAIC01NzUsNyArNTI0LDggQEAKIAkgKiByZXR1cm4gbnVsbCBpZiB3ZSBjYW4ndCBmaW5kIGEgbWFwcGluZyBhbm5vdGF0aW9uIG9uIHRoZSBhdHRyaWJ1dGUKIAkgKi8KIAlwcml2YXRlIElKYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyIGphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJZm9yIChJSmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlciBwcm92aWRlciA6IHRoaXMuYXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVycykgeworCQlmb3IgKEl0ZXJhdG9yPElKYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyPiBpID0gdGhpcy5hdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXJzKCk7IGkuaGFzTmV4dCgpOykgeworCQkJSUphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIgcHJvdmlkZXIgPSBpLm5leHQoKTsKIAkJCWlmICh0aGlzLmF0dHJpYnV0ZS5jb250YWluc0Fubm90YXRpb24ocHJvdmlkZXIuZGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigpLCBhc3RSb290KSkgewogCQkJCXJldHVybiBwcm92aWRlcjsKIAkJCX0KQEAgLTYxNCw4ICs1NjQsOCBAQAogCQl9CiAJCS8vIHRoZSAiZGVmYXVsdCIgbWFwcGluZyBoYXMgY2hhbmdlZAogCQlJSmF2YUF0dHJpYnV0ZU1hcHBpbmcgb2xkID0gdGhpcy5nZXRNYXBwaW5nKCk7Ci0JCXRoaXMuc2V0RGVmYXVsdE1hcHBpbmcoZGVmYXVsdFByb3ZpZGVyLmJ1aWxkTWFwcGluZyh0aGlzLmF0dHJpYnV0ZSkpOwotCQl0aGlzLmRlZmF1bHRNYXBwaW5nLnVwZGF0ZUZyb21KYXZhKHRoaXMuYXR0cmlidXRlLmFzdFJvb3QoKSk7CisJCXRoaXMuc2V0RGVmYXVsdE1hcHBpbmcoZGVmYXVsdFByb3ZpZGVyLmJ1aWxkTWFwcGluZyh0aGlzLmF0dHJpYnV0ZSwganBhRmFjdG9yeSgpKSk7CisJCXRoaXMuZGVmYXVsdE1hcHBpbmcudXBkYXRlRnJvbUphdmEoZGVmYXVsdHNDb250ZXh0LmFzdFJvb3QoKSk7CiAJCWlmICh0aGlzLmVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7CiAJCQl0aGlzLmVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpwYUphdmFQYWNrYWdlLkpBVkFfUEVSU0lTVEVOVF9BVFRSSUJVVEVfX01BUFBJTkcsIG9sZCwgdGhpcy5nZXRNYXBwaW5nKCkpKTsKIAkJfQpAQCAtNjI2LDEyICs1NzYsMTMgQEAKIAkgKiByZXR1cm4gdGhlIG51bGwgcHJvdmlkZXIgaWYgd2UgY2FuJ3QgZmluZCBhIHByb3ZpZGVyCiAJICovCiAJcHJpdmF0ZSBJSmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlciBkZWZhdWx0QXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyKERlZmF1bHRzQ29udGV4dCBkZWZhdWx0c0NvbnRleHQpIHsKLQkJZm9yIChJSmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlciBwcm92aWRlciA6IHRoaXMuYXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVycykgeworCQlmb3IgKEl0ZXJhdG9yPElEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcj4gaSA9IHRoaXMuZGVmYXVsdEF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcnMoKTsgaS5oYXNOZXh0KCk7KSB7CisJCQlJRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIgcHJvdmlkZXIgPSBpLm5leHQoKTsKIAkJCWlmIChwcm92aWRlci5kZWZhdWx0QXBwbGllcyh0aGlzLmF0dHJpYnV0ZSwgZGVmYXVsdHNDb250ZXh0KSkgewogCQkJCXJldHVybiBwcm92aWRlcjsKIAkJCX0KIAkJfQotCQlyZXR1cm4gdGhpcy5udWxsQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyOworCQlyZXR1cm4gdGhpcy5udWxsQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyKCk7CiAJfQogCiAJcHVibGljIGJvb2xlYW4gaXNPdmVycmlkYWJsZUF0dHJpYnV0ZSgpIHsKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvSmF2YVBlcnNpc3RlbnRUeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL0phdmFQZXJzaXN0ZW50VHlwZS5qYXZhCmluZGV4IDdkODYyMGQuLjgyNjZlZTkgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvSmF2YVBlcnNpc3RlbnRUeXBlLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9KYXZhUGVyc2lzdGVudFR5cGUuamF2YQpAQCAtMjcsNiArMjcsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JVHlwZUJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuQWNjZXNzVHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JSnBhQ29udGVudE5vZGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSVBlcnNpc3RlbnRBdHRyaWJ1dGU7CkBAIC0zNywxOSArMzgsMTUgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSmF2YUF0dHJpYnV0ZU92ZXJyaWRlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5KYXZhQmFzaWM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLkphdmFDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLkphdmFFbWJlZGRhYmxlUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLkphdmFFbWJlZGRlZDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSmF2YUVtYmVkZGVkSWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLkphdmFFbnRpdHlQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSmF2YUdlbmVyYXRlZFZhbHVlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5KYXZhSWQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLkphdmFKb2luQ29sdW1uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5KYXZhSm9pblRhYmxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5KYXZhTWFueVRvTWFueTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSmF2YU1hbnlUb09uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSmF2YU1hcHBlZFN1cGVyY2xhc3NQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSmF2YU11bHRpUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSmF2YU51bGxUeXBlTWFwcGluZ1Byb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5KYXZhT25lVG9NYW55OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5KYXZhT25lVG9PbmU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLkphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbjsKQEAgLTYxLDEyICs1OCwxMSBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHkuQXR0cmlidXRlQW5ub3RhdGlvblRvb2xzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHkuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qZHR1dGlsaXR5LkZpZWxkQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHkuSkRUVG9vbHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuamR0dXRpbGl0eS5NZXRob2RBdHRyaWJ1dGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuamR0dXRpbGl0eS5UeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnBsYXRmb3JtLkRlZmF1bHRzQ29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db21tYW5kRXhlY3V0b3JQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNoYWluSXRlcmF0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lSXRlcmF0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNvbXBvc2l0ZUl0ZXJhdG9yOwpAQCAtMTU1LDggKzE1MSw2IEBACiAKIAlwcml2YXRlIFR5cGUgdHlwZTsKIAotCXByaXZhdGUgSUphdmFUeXBlTWFwcGluZ1Byb3ZpZGVyW10gdHlwZU1hcHBpbmdQcm92aWRlcnM7Ci0KIAlwcml2YXRlIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJbXSBhdHRyaWJ1dGVNYXBwaW5nQW5ub3RhdGlvbkFkYXB0ZXJzOwogCiAJLyoqCkBAIC0xNzgsMjggKzE3Miw5IEBACiAKIAlwcm90ZWN0ZWQgSmF2YVBlcnNpc3RlbnRUeXBlKCkgewogCQlzdXBlcigpOwotCQl0aGlzLnR5cGVNYXBwaW5nUHJvdmlkZXJzID0gdGhpcy5idWlsZFR5cGVNYXBwaW5nUHJvdmlkZXJzKCk7CiAJCXRoaXMuYXR0cmlidXRlTWFwcGluZ0Fubm90YXRpb25BZGFwdGVycyA9IHRoaXMuYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQW5ub3RhdGlvbkFkYXB0ZXJzKCk7CiAJfQogCi0JcHJpdmF0ZSBJSmF2YVR5cGVNYXBwaW5nUHJvdmlkZXJbXSBidWlsZFR5cGVNYXBwaW5nUHJvdmlkZXJzKCkgewotCQlBcnJheUxpc3Q8SUphdmFUeXBlTWFwcGluZ1Byb3ZpZGVyPiBwcm92aWRlcnMgPSBuZXcgQXJyYXlMaXN0PElKYXZhVHlwZU1hcHBpbmdQcm92aWRlcj4oKTsKLQkJdGhpcy5hZGRUeXBlTWFwcGluZ1Byb3ZpZGVyc1RvKHByb3ZpZGVycyk7Ci0JCXJldHVybiBwcm92aWRlcnMudG9BcnJheShuZXcgSUphdmFUeXBlTWFwcGluZ1Byb3ZpZGVyW3Byb3ZpZGVycy5zaXplKCldKTsKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkZSB0aGlzIHRvIHNwZWNpZnkgbW9yZSBvciBkaWZmZXJlbnQgdHlwZSBtYXBwaW5nIHByb3ZpZGVycy4KLQkgKiBUaGUgZGVmYXVsdCBpbmNsdWRlcyB0aGUgSlBBIHNwZWMtZGVmaW5lZCB0eXBlIG1hcHBpbmdzIG9mIAotCSAqIEVudGl0eSwgTWFwcGVkU3VwZXJjbGFzcywgYW5kIEVtYmVkZGFibGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUeXBlTWFwcGluZ1Byb3ZpZGVyc1RvKENvbGxlY3Rpb248SUphdmFUeXBlTWFwcGluZ1Byb3ZpZGVyPiBwcm92aWRlcnMpIHsKLQkJcHJvdmlkZXJzLmFkZChKYXZhTnVsbFR5cGVNYXBwaW5nUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoSmF2YUVudGl0eVByb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKEphdmFNYXBwZWRTdXBlcmNsYXNzUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoSmF2YUVtYmVkZGFibGVQcm92aWRlci5pbnN0YW5jZSgpKTsKLQl9Ci0KIAlwcml2YXRlIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJbXSBidWlsZEF0dHJpYnV0ZU1hcHBpbmdBbm5vdGF0aW9uQWRhcHRlcnMoKSB7CiAJCUFycmF5TGlzdDxEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyPiBhZGFwdGVycyA9IG5ldyBBcnJheUxpc3Q8RGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcj4oKTsKIAkJdGhpcy5hZGRBdHRyaWJ1dGVNYXBwaW5nQW5ub3RhdGlvbkFkYXB0ZXJzVG8oYWRhcHRlcnMpOwpAQCAtMzY5LDE2ICszNDQsMTUgQEAKIAl9CiAKIAlwcml2YXRlIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXJGb3JUeXBlTWFwcGluZ0tleShTdHJpbmcgdHlwZU1hcHBpbmdLZXkpIHsKLQkJcmV0dXJuIHRoaXMudHlwZU1hcHBpbmdQcm92aWRlckZvcih0eXBlTWFwcGluZ0tleSkuZGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigpOworCQlyZXR1cm4gdGhpcy50eXBlTWFwcGluZ1Byb3ZpZGVyKHR5cGVNYXBwaW5nS2V5KS5kZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCk7CiAJfQogCi0JcHJpdmF0ZSBJSmF2YVR5cGVNYXBwaW5nUHJvdmlkZXIgdHlwZU1hcHBpbmdQcm92aWRlckZvcihTdHJpbmcgdHlwZU1hcHBpbmdLZXkpIHsKLQkJZm9yIChJSmF2YVR5cGVNYXBwaW5nUHJvdmlkZXIgcHJvdmlkZXIgOiB0aGlzLnR5cGVNYXBwaW5nUHJvdmlkZXJzKSB7Ci0JCQlpZiAocHJvdmlkZXIua2V5KCkgPT0gdHlwZU1hcHBpbmdLZXkpIHsKLQkJCQlyZXR1cm4gcHJvdmlkZXI7Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgdHlwZSBtYXBwaW5nIGtleTogIiArIHR5cGVNYXBwaW5nS2V5KTsKKwlwcm90ZWN0ZWQgSXRlcmF0b3I8SUphdmFUeXBlTWFwcGluZ1Byb3ZpZGVyPiB0eXBlTWFwcGluZ1Byb3ZpZGVycygpIHsKKwkJcmV0dXJuIGpwYVBsYXRmb3JtKCkuamF2YVR5cGVNYXBwaW5nUHJvdmlkZXJzKCk7CisJfQorCisJcHJpdmF0ZSBJSmF2YVR5cGVNYXBwaW5nUHJvdmlkZXIgdHlwZU1hcHBpbmdQcm92aWRlcihTdHJpbmcgdHlwZU1hcHBpbmdLZXkpIHsKKwkJcmV0dXJuIGpwYVBsYXRmb3JtKCkuamF2YVR5cGVNYXBwaW5nUHJvdmlkZXIodHlwZU1hcHBpbmdLZXkpOwogCX0KIAogCS8qKgpAQCAtNTk5LDggKzU3MywxNSBAQAogCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CiAJfQogCisJLyoqCisJICogZGVsZWdhdGUgdG8gdGhlIHR5cGUncyBwcm9qZWN0ICh0aGVyZSBpcyBvbmUgcHJvdmlkZXIgcGVyIHByb2plY3QpCisJICovCisJcHJpdmF0ZSBDb21tYW5kRXhlY3V0b3JQcm92aWRlciBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvclByb3ZpZGVyKCkgeworCQlyZXR1cm4gdGhpcy5nZXRKcGFQcm9qZWN0KCkubW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3JQcm92aWRlcigpOworCX0KKwogCXB1YmxpYyB2b2lkIHNldEpkdFR5cGUoSVR5cGUgaVR5cGUsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMudHlwZSA9IG5ldyBUeXBlKGlUeXBlKTsKKwkJdGhpcy50eXBlID0gbmV3IFR5cGUoaVR5cGUsIHRoaXMubW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3JQcm92aWRlcigpKTsKIAkJdGhpcy5zZXRBY2Nlc3ModGhpcy5qYXZhQWNjZXNzVHlwZShhc3RSb290KSk7CiAJCXRoaXMuY3JlYXRlQW5kU2V0UGVyc2lzdGVudFR5cGVNYXBwaW5nRnJvbUphdmEodGhpcy5qYXZhVHlwZU1hcHBpbmdLZXkoYXN0Um9vdCkpOwogCX0KQEAgLTYxNCwxMCArNTk1LDEwIEBACiAJcHVibGljIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGNyZWF0ZUphdmFQZXJzaXN0ZW50QXR0cmlidXRlKElNZW1iZXIgbWVtYmVyKSB7CiAJCUF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBudWxsOwogCQlpZiAobWVtYmVyIGluc3RhbmNlb2YgSUZpZWxkKSB7Ci0JCQlhdHRyaWJ1dGUgPSBuZXcgRmllbGRBdHRyaWJ1dGUoKElGaWVsZCkgbWVtYmVyKTsKKwkJCWF0dHJpYnV0ZSA9IG5ldyBGaWVsZEF0dHJpYnV0ZSgoSUZpZWxkKSBtZW1iZXIsIHRoaXMubW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3JQcm92aWRlcigpKTsKIAkJfQogCQllbHNlIGlmIChtZW1iZXIgaW5zdGFuY2VvZiBJTWV0aG9kKSB7Ci0JCQlhdHRyaWJ1dGUgPSBuZXcgTWV0aG9kQXR0cmlidXRlKChJTWV0aG9kKSBtZW1iZXIpOworCQkJYXR0cmlidXRlID0gbmV3IE1ldGhvZEF0dHJpYnV0ZSgoSU1ldGhvZCkgbWVtYmVyLCB0aGlzLm1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yUHJvdmlkZXIoKSk7CiAJCX0KIAkJZWxzZSB7CiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CkBAIC02MzEsNyArNjEyLDcgQEAKIAl9CiAKIAlwcml2YXRlIElKYXZhVHlwZU1hcHBpbmcgYnVpbGRKYXZhVHlwZU1hcHBpbmcoU3RyaW5nIGtleSkgewotCQlyZXR1cm4gdGhpcy50eXBlTWFwcGluZ1Byb3ZpZGVyRm9yKGtleSkuYnVpbGRNYXBwaW5nKHRoaXMudHlwZSk7CisJCXJldHVybiB0aGlzLnR5cGVNYXBwaW5nUHJvdmlkZXIoa2V5KS5idWlsZE1hcHBpbmcodGhpcy50eXBlLCB0aGlzLmpwYUZhY3RvcnkoKSk7CiAJfQogCiAJcHVibGljIFR5cGUgZ2V0VHlwZSgpIHsKQEAgLTcxNSw3ICs2OTYsOCBAQAogCX0KIAogCXByaXZhdGUgU3RyaW5nIGphdmFUeXBlTWFwcGluZ0tleShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlmb3IgKElKYXZhVHlwZU1hcHBpbmdQcm92aWRlciBwcm92aWRlciA6IHRoaXMudHlwZU1hcHBpbmdQcm92aWRlcnMpIHsKKwkJZm9yIChJdGVyYXRvcjxJSmF2YVR5cGVNYXBwaW5nUHJvdmlkZXI+IGkgPSB0aGlzLnR5cGVNYXBwaW5nUHJvdmlkZXJzKCk7IGkuaGFzTmV4dCgpOykgeworCQkJSUphdmFUeXBlTWFwcGluZ1Byb3ZpZGVyIHByb3ZpZGVyID0gaS5uZXh0KCk7CiAJCQlpZiAodGhpcy50eXBlLmNvbnRhaW5zQW5ub3RhdGlvbihwcm92aWRlci5kZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCksIGFzdFJvb3QpKSB7CiAJCQkJcmV0dXJuIHByb3ZpZGVyLmtleSgpOwogCQkJfQpAQCAtNzIzLDE1ICs3MDUsNiBAQAogCQlyZXR1cm4gbnVsbDsKIAl9CiAKLQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBjYW5kaWRhdGVNYXBwaW5nS2V5cygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPElKYXZhVHlwZU1hcHBpbmdQcm92aWRlciwgU3RyaW5nPihuZXcgQXJyYXlJdGVyYXRvcjxJSmF2YVR5cGVNYXBwaW5nUHJvdmlkZXI+KHRoaXMudHlwZU1hcHBpbmdQcm92aWRlcnMpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKElKYXZhVHlwZU1hcHBpbmdQcm92aWRlciBwKSB7Ci0JCQkJcmV0dXJuIHAua2V5KCk7Ci0JCQl9Ci0JCX07Ci0JfQotCiAJcHJvdGVjdGVkIEl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzTmFtZWQoZmluYWwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKIAkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4oYXR0cmlidXRlcygpKSB7CiAJCQlAT3ZlcnJpZGUKQEAgLTgxNCw3ICs3ODcsNiBAQAogCQlyZXR1cm4gbnVsbDsKIAl9CiAKLQkvL1RPRE8gQ2xvbmVJdGVyYXRvcgogCXB1YmxpYyBJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlcygpIHsKIAkJcmV0dXJuIG5ldyBDbG9uZUl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPihnZXRBdHRyaWJ1dGVzKCkpOwogCX0KQEAgLTg4NSw3ICs4NTcsNyBAQAogCQlib29sZWFuIGhhc1BlcnNpc3RhYmxlUHJvcGVydGllcyA9IGZhbHNlOwogCQlmb3IgKElGaWVsZCBmaWVsZCA6IEF0dHJpYnV0ZUFubm90YXRpb25Ub29scy5wZXJzaXN0YWJsZUZpZWxkcyhqZHRUeXBlKSkgewogCQkJaGFzUGVyc2lzdGFibGVGaWVsZHMgPSB0cnVlOwotCQkJRmllbGRBdHRyaWJ1dGUgZmEgPSBuZXcgRmllbGRBdHRyaWJ1dGUoZmllbGQpOworCQkJRmllbGRBdHRyaWJ1dGUgZmEgPSBuZXcgRmllbGRBdHRyaWJ1dGUoZmllbGQsIG51bGwpOyAvLyBhIGJpdCBoYWNreS4uLgogCQkJaWYgKGZhLmNvbnRhaW5zQW55QW5ub3RhdGlvbih0aGlzLmF0dHJpYnV0ZU1hcHBpbmdBbm5vdGF0aW9uQWRhcHRlcnMsIGFzdFJvb3QpKSB7CiAJCQkJLy8gYW55IGZpZWxkIGlzIGFubm90YXRlZCA9PiBGSUVMRAogCQkJCXJldHVybiBBY2Nlc3NUeXBlLkZJRUxEOwpAQCAtODkzLDcgKzg2NSw3IEBACiAJCX0KIAkJZm9yIChJTWV0aG9kIG1ldGhvZCA6IEF0dHJpYnV0ZUFubm90YXRpb25Ub29scy5wZXJzaXN0YWJsZVByb3BlcnR5R2V0dGVycyhqZHRUeXBlKSkgewogCQkJaGFzUGVyc2lzdGFibGVQcm9wZXJ0aWVzID0gdHJ1ZTsKLQkJCU1ldGhvZEF0dHJpYnV0ZSBtYSA9IG5ldyBNZXRob2RBdHRyaWJ1dGUobWV0aG9kKTsKKwkJCU1ldGhvZEF0dHJpYnV0ZSBtYSA9IG5ldyBNZXRob2RBdHRyaWJ1dGUobWV0aG9kLCBudWxsKTsgLy8gYSBiaXQgaGFja3kuLi4KIAkJCWlmIChtYS5jb250YWluc0FueUFubm90YXRpb24odGhpcy5hdHRyaWJ1dGVNYXBwaW5nQW5ub3RhdGlvbkFkYXB0ZXJzLCBhc3RSb290KSkgewogCQkJCS8vIG5vbmUgb2YgdGhlIGZpZWxkcyBhcmUgYW5ub3RhdGVkIGFuZCBhIGdldHRlciBpcyBhbm5vdGF0ZWQgPT4gUFJPUEVSVFkKIAkJCQlyZXR1cm4gQWNjZXNzVHlwZS5QUk9QRVJUWTsKQEAgLTkxMSwyNyArODgzLDI3IEBACiAJfQogCiAJcHJpdmF0ZSB2b2lkIHJlZnJlc2hQYXJlbnRQZXJzaXN0ZW50VHlwZShEZWZhdWx0c0NvbnRleHQgY29udGV4dCkgewotCQlTdHJpbmcgc3VwZXJjbGFzc1R5cGVTaWduYXR1cmUgPSB0aGlzLnN1cGVyY2xhc3NUeXBlU2lnbmF0dXJlKCk7Ci0JCWlmIChzdXBlcmNsYXNzVHlwZVNpZ25hdHVyZSA9PSBudWxsKSB7Ci0JCQl0aGlzLnBhcmVudFBlcnNpc3RlbnRUeXBlID0gbnVsbDsKLQkJCXJldHVybjsKKwkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gZ2V0VHlwZSgpLnR5cGVCaW5kaW5nKGNvbnRleHQuYXN0Um9vdCgpKTsKKwkJdGhpcy5wYXJlbnRQZXJzaXN0ZW50VHlwZSA9IHBhcmVudFBlcnNpc3RlbnRUeXBlKGNvbnRleHQsIHR5cGVCaW5kaW5nKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIElQZXJzaXN0ZW50VHlwZSBwYXJlbnRQZXJzaXN0ZW50VHlwZShEZWZhdWx0c0NvbnRleHQgY29udGV4dCwgSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nKSB7CisJCWlmICh0eXBlQmluZGluZyA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKIAkJfQotCQlTdHJpbmcgZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSA9IEpEVFRvb2xzLnJlc29sdmVTaWduYXR1cmUoc3VwZXJjbGFzc1R5cGVTaWduYXR1cmUsIHRoaXMuamR0VHlwZSgpKTsKLQkJaWYgKGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUgPT0gbnVsbCkgewotCQkJdGhpcy5wYXJlbnRQZXJzaXN0ZW50VHlwZSA9IG51bGw7Ci0JCQlyZXR1cm47CisJCUlUeXBlQmluZGluZyBzdXBlckNsYXNzVHlwZUJpbmRpbmcgPSB0eXBlQmluZGluZy5nZXRTdXBlcmNsYXNzKCk7CisJCWlmIChzdXBlckNsYXNzVHlwZUJpbmRpbmcgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CiAJCX0KKwkJU3RyaW5nIGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUgPSBzdXBlckNsYXNzVHlwZUJpbmRpbmcuZ2V0UXVhbGlmaWVkTmFtZSgpOwogCQlJUGVyc2lzdGVudFR5cGUgcG9zc2libGVQYXJlbnQgPSBjb250ZXh0LnBlcnNpc3RlbnRUeXBlKGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUpOwogCQlpZiAocG9zc2libGVQYXJlbnQgPT0gbnVsbCkgewogCQkJLy9UT0RPIGxvb2sgdG8gc3VwZXJjbGFzcwotCQkJdGhpcy5wYXJlbnRQZXJzaXN0ZW50VHlwZSA9IG51bGw7Ci0JCQlyZXR1cm47CisJCQlyZXR1cm4gbnVsbDsKIAkJfQogCQlpZiAocG9zc2libGVQYXJlbnQuZ2V0TWFwcGluZ0tleSgpICE9IG51bGwpIHsKLQkJCXRoaXMucGFyZW50UGVyc2lzdGVudFR5cGUgPSBwb3NzaWJsZVBhcmVudDsKKwkJCXJldHVybiBwb3NzaWJsZVBhcmVudDsKIAkJfQotCQllbHNlIHsKLQkJCXRoaXMucGFyZW50UGVyc2lzdGVudFR5cGUgPSBwb3NzaWJsZVBhcmVudC5wYXJlbnRQZXJzaXN0ZW50VHlwZSgpOwotCQl9CisJCXJldHVybiBwb3NzaWJsZVBhcmVudC5wYXJlbnRQZXJzaXN0ZW50VHlwZSgpOwogCX0KIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL0pwYUNvbXBpbGF0aW9uVW5pdC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9KcGFDb21waWxhdGlvblVuaXQuamF2YQppbmRleCAxZDhiZGJjLi4xMWNlOWVhIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL0pwYUNvbXBpbGF0aW9uVW5pdC5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvSnBhQ29tcGlsYXRpb25Vbml0LmphdmEKQEAgLTM0LDkgKzM0LDkgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JVGV4dFJhbmdlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkpwYUNvcmVQYWNrYWdlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkpwYUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuamR0dXRpbGl0eS5BU1ROb2RlVGV4dFJhbmdlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHkuQXR0cmlidXRlQW5ub3RhdGlvblRvb2xzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHkuSkRUVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQml0VG9vbHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuRmlsdGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOwogCkBAIC0yODgsMTAgKzI4OCw2IEBACiAJCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKIAl9CiAKLQlwdWJsaWMgSVRleHRSYW5nZSBmdWxsVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gbmV3IEFTVE5vZGVUZXh0UmFuZ2UodGhpcy5hc3RSb290KCkpOwotCX0KLQogCXB1YmxpYyBJVGV4dFJhbmdlIHZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7CiAJCXJldHVybiB0aGlzLnNlbGVjdGlvblRleHRSYW5nZSgpOwogCX0KQEAgLTM3OCw4ICszNzQsMTAgQEAKIAl9CiAKIAlwcml2YXRlIHZvaWQgc3luY2hDb21waWxhdGlvblVuaXRXaXRoSmF2YURlbHRhKElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7Ci0JCS8vIGlnbm9yZSBjaGFuZ2VzIHRvL2Zyb20gcHJpbWFyeSB3b3JraW5nIGNvcHkgLSBubyBjb250ZW50IGhhcyBjaGFuZ2VkCi0JCWlmICgoZGVsdGEuZ2V0RmxhZ3MoKSAmIElKYXZhRWxlbWVudERlbHRhLkZfUFJJTUFSWV9XT1JLSU5HX0NPUFkpICE9IDApIHsKKwkJLy8gaWdub3JlIGNoYW5nZXMgdG8vZnJvbSBwcmltYXJ5IHdvcmtpbmcgY29weSAtIG5vIGNvbnRlbnQgaGFzIGNoYW5nZWQ7CisJCS8vIGFuZCBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vIG90aGVyIGZsYWdzIHNldCB0aGF0IGluZGljYXRlIGJvdGggYSBjaGFuZ2UgdG8vZnJvbQorCQkvLyBwcmltYXJ5IHdvcmtpbmcgY29weSBBTkQgY29udGVudCBoYXMgY2hhbmdlZAorCQlpZiAoQml0VG9vbHMub25seUZsYWdJc1NldChkZWx0YS5nZXRGbGFncygpLCBJSmF2YUVsZW1lbnREZWx0YS5GX1BSSU1BUllfV09SS0lOR19DT1BZKSkgewogCQkJcmV0dXJuOwogCQl9CiAJCS8vIHN5bmNocm9uaXplIGlmIHRoZSBjaGFuZ2UgaXMgZm9yIHRoaXMgY29tcGlsYXRpb24gdW5pdApAQCAtNDQzLDggKzQ0MSw4IEBACiAJCXJldHVybiBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7CiAJfQogCi0JcHVibGljIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KCkgewotCQlyZXR1cm4gSkRUVG9vbHMuY3JlYXRlQVNUUm9vdCh0aGlzLmNvbXBpbGF0aW9uVW5pdCk7CisJcHJpdmF0ZSBDb21waWxhdGlvblVuaXQgYXN0Um9vdCgpIHsKKwkJcmV0dXJuIEpEVFRvb2xzLmJ1aWxkQVNUUm9vdCh0aGlzLmNvbXBpbGF0aW9uVW5pdCk7CiAJfQogCiAJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvSnBhSmF2YUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvSnBhSmF2YUZhY3RvcnkuamF2YQppbmRleCBmZjU1YmY1Li4yNDBmYmJhIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL0pwYUphdmFGYWN0b3J5LmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9KcGFKYXZhRmFjdG9yeS5qYXZhCkBAIC00Miw3ICs0Miw3IEBACiAJICovCiAJcHVibGljIHN0YXRpYyBKcGFKYXZhRmFjdG9yeSBpbml0KCkgewogCQl0cnkgewotCQkJSnBhSmF2YUZhY3RvcnkgdGhlSnBhSmF2YUZhY3RvcnkgPSAoSnBhSmF2YUZhY3RvcnkpIEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVGYWN0b3J5KCJqcHQuamF2YS54bWkiKTsKKwkJCUpwYUphdmFGYWN0b3J5IHRoZUpwYUphdmFGYWN0b3J5ID0gKEpwYUphdmFGYWN0b3J5KSBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFRmFjdG9yeSgiaHR0cDovL29yZy5lY2xpcHNlLmpwdC5jb3JlL29sZF9qYXZhLmVjb3JlIik7CiAJCQlpZiAodGhlSnBhSmF2YUZhY3RvcnkgIT0gbnVsbCkgewogCQkJCXJldHVybiB0aGVKcGFKYXZhRmFjdG9yeTsKIAkJCX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvSnBhSmF2YVBhY2thZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvSnBhSmF2YVBhY2thZ2UuamF2YQppbmRleCBkNjI0YjU3Li41MzlmMDdmIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL0pwYUphdmFQYWNrYWdlLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9KcGFKYXZhUGFja2FnZS5qYXZhCkBAIC01Miw3ICs1Miw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGVOU19VUkkgPSAianB0LmphdmEueG1pIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBlTlNfVVJJID0gImh0dHA6Ly9vcmcuZWNsaXBzZS5qcHQuY29yZS9vbGRfamF2YS5lY29yZSI7CiAKIAkvKioKIAkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4KQEAgLTY1NCw5ICs2NTQsNyBAQAogCQlpbml0RVJlZmVyZW5jZShnZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZV9EZWZhdWx0TWFwcGluZygpLCB0aGlzLmdldElKYXZhQXR0cmlidXRlTWFwcGluZygpLCBudWxsLCAiZGVmYXVsdE1hcHBpbmciLCBudWxsLCAxLCAxLCBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKIAkJaW5pdEVSZWZlcmVuY2UoZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGVfU3BlY2lmaWVkTWFwcGluZygpLCB0aGlzLmdldElKYXZhQXR0cmlidXRlTWFwcGluZygpLCBudWxsLCAic3BlY2lmaWVkTWFwcGluZyIsIG51bGwsIDEsIDEsIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwogCQlpbml0RUNsYXNzKGlKYXZhVHlwZU1hcHBpbmdFQ2xhc3MsIElKYXZhVHlwZU1hcHBpbmcuY2xhc3MsICJJSmF2YVR5cGVNYXBwaW5nIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJYWRkRU9wZXJhdGlvbihpSmF2YVR5cGVNYXBwaW5nRUNsYXNzLCBudWxsLCAiaW5pdGlhbGl6ZSIsIDAsIDEsIElTX1VOSVFVRSwgSVNfT1JERVJFRCk7CiAJCWluaXRFQ2xhc3MoaUphdmFBdHRyaWJ1dGVNYXBwaW5nRUNsYXNzLCBJSmF2YUF0dHJpYnV0ZU1hcHBpbmcuY2xhc3MsICJJSmF2YUF0dHJpYnV0ZU1hcHBpbmciLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlhZGRFT3BlcmF0aW9uKGlKYXZhQXR0cmlidXRlTWFwcGluZ0VDbGFzcywgbnVsbCwgImluaXRpYWxpemUiLCAwLCAxLCBJU19VTklRVUUsIElTX09SREVSRUQpOwogCQkvLyBDcmVhdGUgcmVzb3VyY2UKIAkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7CiAJfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9tYXBwaW5ncy9JSmF2YUJhc2ljLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL21hcHBpbmdzL0lKYXZhQmFzaWMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDc2MjIwCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9tYXBwaW5ncy9JSmF2YUJhc2ljLmphdmEKQEAgLTAsMCArMSwyNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3M7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEuSUphdmFBdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklCYXNpYzsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SUphdmEgQmFzaWM8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLkpwYUphdmFNYXBwaW5nc1BhY2thZ2UjZ2V0SUphdmFCYXNpYygpCisgKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSUphdmFCYXNpYyBleHRlbmRzIElKYXZhQXR0cmlidXRlTWFwcGluZywgSUJhc2ljCit7fSAvLyBJSmF2YUJhc2ljCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL21hcHBpbmdzL0lKYXZhRW1iZWRkYWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9tYXBwaW5ncy9JSmF2YUVtYmVkZGFibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmRhMjNjCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9tYXBwaW5ncy9JSmF2YUVtYmVkZGFibGUuamF2YQpAQCAtMCwwICsxLDI2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5nczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5JSmF2YVR5cGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklFbWJlZGRhYmxlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JSmF2YSBFbWJlZGRhYmxlPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5KcGFKYXZhTWFwcGluZ3NQYWNrYWdlI2dldElKYXZhRW1iZWRkYWJsZSgpCisgKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSUphdmFFbWJlZGRhYmxlIGV4dGVuZHMgSUphdmFUeXBlTWFwcGluZywgSUVtYmVkZGFibGUKK3t9IC8vIElKYXZhRW1iZWRkYWJsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9tYXBwaW5ncy9JSmF2YUVtYmVkZGVkLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL21hcHBpbmdzL0lKYXZhRW1iZWRkZWQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTJiOTgwCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9tYXBwaW5ncy9JSmF2YUVtYmVkZGVkLmphdmEKQEAgLTAsMCArMSwyNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3M7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEuSUphdmFBdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklFbWJlZGRlZDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SUphdmEgRW1iZWRkZWQ8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLkpwYUphdmFNYXBwaW5nc1BhY2thZ2UjZ2V0SUphdmFFbWJlZGRlZCgpCisgKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSUphdmFFbWJlZGRlZCBleHRlbmRzIElKYXZhQXR0cmlidXRlTWFwcGluZywgSUVtYmVkZGVkCit7fSAvLyBJSmF2YUVtYmVkZGVkCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL21hcHBpbmdzL0lKYXZhRW1iZWRkZWRJZC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9tYXBwaW5ncy9JSmF2YUVtYmVkZGVkSWQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWY1M2M5Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9tYXBwaW5ncy9JSmF2YUVtYmVkZGVkSWQuamF2YQpAQCAtMCwwICsxLDI2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5nczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5JSmF2YUF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSUVtYmVkZGVkSWQ7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPklKYXZhIEVtYmVkZGVkIElkPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5KcGFKYXZhTWFwcGluZ3NQYWNrYWdlI2dldElKYXZhRW1iZWRkZWRJZCgpCisgKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSUphdmFFbWJlZGRlZElkIGV4dGVuZHMgSUphdmFBdHRyaWJ1dGVNYXBwaW5nLCBJRW1iZWRkZWRJZAore30gLy8gSUphdmFFbWJlZGRlZElkCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL21hcHBpbmdzL0lKYXZhRW50aXR5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL21hcHBpbmdzL0lKYXZhRW50aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ3NzVmNwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvbWFwcGluZ3MvSUphdmFFbnRpdHkuamF2YQpAQCAtMCwwICsxLDI2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5nczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5JSmF2YVR5cGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklFbnRpdHk7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPklKYXZhIEVudGl0eTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSnBhSmF2YU1hcHBpbmdzUGFja2FnZSNnZXRJSmF2YUVudGl0eSgpCisgKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSUphdmFFbnRpdHkgZXh0ZW5kcyBJSmF2YVR5cGVNYXBwaW5nLCBJRW50aXR5Cit7fSAvLyBJSmF2YUVudGl0eQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9tYXBwaW5ncy9JSmF2YUlkLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL21hcHBpbmdzL0lKYXZhSWQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2Y1Y2IwCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9tYXBwaW5ncy9JSmF2YUlkLmphdmEKQEAgLTAsMCArMSwyNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3M7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEuSUphdmFBdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklJZDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SUphdmEgSWQ8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLkpwYUphdmFNYXBwaW5nc1BhY2thZ2UjZ2V0SUphdmFJZCgpCisgKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSUphdmFJZCBleHRlbmRzIElKYXZhQXR0cmlidXRlTWFwcGluZywgSUlkCit7fSAvLyBJSmF2YUlkCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL21hcHBpbmdzL0lKYXZhTWFueVRvTWFueS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9tYXBwaW5ncy9JSmF2YU1hbnlUb01hbnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjFmOWJmCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9tYXBwaW5ncy9JSmF2YU1hbnlUb01hbnkuamF2YQpAQCAtMCwwICsxLDI2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5nczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5JSmF2YUF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSU1hbnlUb01hbnk7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPklKYXZhIE1hbnkgVG8gTWFueTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSnBhSmF2YU1hcHBpbmdzUGFja2FnZSNnZXRJSmF2YU1hbnlUb01hbnkoKQorICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIElKYXZhTWFueVRvTWFueSBleHRlbmRzIElKYXZhQXR0cmlidXRlTWFwcGluZywgSU1hbnlUb01hbnkKK3t9IC8vIElKYXZhTWFueVRvTWFueQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9tYXBwaW5ncy9JSmF2YU1hbnlUb09uZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9tYXBwaW5ncy9JSmF2YU1hbnlUb09uZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5NDI2NmUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL21hcHBpbmdzL0lKYXZhTWFueVRvT25lLmphdmEKQEAgLTAsMCArMSwyNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3M7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEuSUphdmFBdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklNYW55VG9PbmU7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPklKYXZhIE1hbnkgVG8gT25lPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5KcGFKYXZhTWFwcGluZ3NQYWNrYWdlI2dldElKYXZhTWFueVRvT25lKCkKKyAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBJSmF2YU1hbnlUb09uZSBleHRlbmRzIElKYXZhQXR0cmlidXRlTWFwcGluZywgSU1hbnlUb09uZQore30gLy8gSUphdmFNYW55VG9PbmUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvbWFwcGluZ3MvSUphdmFNYXBwZWRTdXBlcmNsYXNzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL21hcHBpbmdzL0lKYXZhTWFwcGVkU3VwZXJjbGFzcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMjk2NDUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL21hcHBpbmdzL0lKYXZhTWFwcGVkU3VwZXJjbGFzcy5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLklKYXZhVHlwZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSU1hcHBlZFN1cGVyY2xhc3M7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPklKYXZhIE1hcHBlZCBTdXBlcmNsYXNzPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5KcGFKYXZhTWFwcGluZ3NQYWNrYWdlI2dldElKYXZhTWFwcGVkU3VwZXJjbGFzcygpCisgKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSUphdmFNYXBwZWRTdXBlcmNsYXNzCisJZXh0ZW5kcyBJSmF2YVR5cGVNYXBwaW5nLCBJTWFwcGVkU3VwZXJjbGFzcwore30gLy8gSUphdmFNYXBwZWRTdXBlcmNsYXNzCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL21hcHBpbmdzL0lKYXZhT25lVG9NYW55LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL21hcHBpbmdzL0lKYXZhT25lVG9NYW55LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYzNDk2ZAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvbWFwcGluZ3MvSUphdmFPbmVUb01hbnkuamF2YQpAQCAtMCwwICsxLDI2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5nczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5JSmF2YUF0dHJpYnV0ZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSU9uZVRvTWFueTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SUphdmEgT25lIFRvIE1hbnk8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLkpwYUphdmFNYXBwaW5nc1BhY2thZ2UjZ2V0SUphdmFPbmVUb01hbnkoKQorICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIElKYXZhT25lVG9NYW55IGV4dGVuZHMgSUphdmFBdHRyaWJ1dGVNYXBwaW5nLCBJT25lVG9NYW55Cit7fSAvLyBJSmF2YU9uZVRvTWFueQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9tYXBwaW5ncy9JSmF2YU9uZVRvT25lLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL21hcHBpbmdzL0lKYXZhT25lVG9PbmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2RhZjczCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9tYXBwaW5ncy9JSmF2YU9uZVRvT25lLmphdmEKQEAgLTAsMCArMSwyNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3M7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEuSUphdmFBdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklPbmVUb09uZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SUphdmEgT25lIFRvIE9uZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSnBhSmF2YU1hcHBpbmdzUGFja2FnZSNnZXRJSmF2YU9uZVRvT25lKCkKKyAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBJSmF2YU9uZVRvT25lIGV4dGVuZHMgSUphdmFBdHRyaWJ1dGVNYXBwaW5nLCBJT25lVG9PbmUKK3t9IC8vIElKYXZhT25lVG9PbmUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvbWFwcGluZ3MvSUphdmFUcmFuc2llbnQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvbWFwcGluZ3MvSUphdmFUcmFuc2llbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmRmNTZlCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9tYXBwaW5ncy9JSmF2YVRyYW5zaWVudC5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLklKYXZhQXR0cmlidXRlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JVHJhbnNpZW50OworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JSmF2YSBUcmFuc2llbnQ8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLkpwYUphdmFNYXBwaW5nc1BhY2thZ2UjZ2V0SUphdmFUcmFuc2llbnQoKQorICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIElKYXZhVHJhbnNpZW50IGV4dGVuZHMgSUphdmFBdHRyaWJ1dGVNYXBwaW5nLCBJVHJhbnNpZW50Cit7fSAvLyBJSmF2YVRyYW5zaWVudApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9tYXBwaW5ncy9JSmF2YVZlcnNpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvbWFwcGluZ3MvSUphdmFWZXJzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVlOWU2OAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvbWFwcGluZ3MvSUphdmFWZXJzaW9uLmphdmEKQEAgLTAsMCArMSwyNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3M7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEuSUphdmFBdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklWZXJzaW9uOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JSmF2YSBWZXJzaW9uPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5KcGFKYXZhTWFwcGluZ3NQYWNrYWdlI2dldElKYXZhVmVyc2lvbigpCisgKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSUphdmFWZXJzaW9uIGV4dGVuZHMgSUphdmFBdHRyaWJ1dGVNYXBwaW5nLCBJVmVyc2lvbgore30gLy8gSUphdmFWZXJzaW9uCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL21hcHBpbmdzL0phdmFBdHRyaWJ1dGVNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL21hcHBpbmdzL0phdmFBdHRyaWJ1dGVNYXBwaW5nLmphdmEKaW5kZXggYTEyZWVlYS4uNTQxY2VmYiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9tYXBwaW5ncy9KYXZhQXR0cmlidXRlTWFwcGluZy5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvbWFwcGluZ3MvSmF2YUF0dHJpYnV0ZU1hcHBpbmcuamF2YQpAQCAtNzYsMTAgKzc2LDYgQEAKIAkJcmV0dXJuIEpwYUphdmFNYXBwaW5nc1BhY2thZ2UuTGl0ZXJhbHMuSkFWQV9BVFRSSUJVVEVfTUFQUElORzsKIAl9CiAKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKCkgewotCQl0aGlzLnVwZGF0ZUZyb21KYXZhKHRoaXMuYXR0cmlidXRlLmFzdFJvb3QoKSk7Ci0JfQotCiAJcHVibGljIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKSB7CiAJCXJldHVybiAoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHRoaXMuZUNvbnRhaW5lcigpOwogCX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvbWFwcGluZ3MvSmF2YUJhc2ljLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL21hcHBpbmdzL0phdmFCYXNpYy5qYXZhCmluZGV4IDdhYjBmNDEuLjk0YzQwZjkgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvbWFwcGluZ3MvSmF2YUJhc2ljLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9tYXBwaW5ncy9KYXZhQmFzaWMuamF2YQpAQCAtMTUsMTMgKzE1LDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlSGllcmFyY2h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5TaWduYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuV29ya2luZ0NvcHlPd25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQm9vbGVhbkxpdGVyYWw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JTWFwcGluZ0tleXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuamR0dXRpbGl0eS5Bbm5vdGF0aW9uQWRhcHRlcjsKQEAgLTMzLDcgKzI2LDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qZHR1dGlsaXR5LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuamR0dXRpbGl0eS5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qZHR1dGlsaXR5LkVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qZHR1dGlsaXR5LkpEVFRvb2xzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHkuTWVtYmVyQW5ub3RhdGlvbkFkYXB0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuamR0dXRpbGl0eS5TaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuamR0dXRpbGl0eS5TaW1wbGVCb29sZWFuQW5ub3RhdGlvbkFkYXB0ZXI7CkBAIC00Niw3ICszOCw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSUNvbHVtbk1hcHBpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSnBhQ29yZU1hcHBpbmdzUGFja2FnZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5UZW1wb3JhbFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkZpbHRlcjsKIAogLyoqCkBAIC01OSw3ICs1MCw3IEBACiAgKiBAbW9kZWwga2luZD0iY2xhc3MiCiAgKiBAZ2VuZXJhdGVkCiAgKi8KLXB1YmxpYyBjbGFzcyBKYXZhQmFzaWMgZXh0ZW5kcyBKYXZhQXR0cmlidXRlTWFwcGluZyBpbXBsZW1lbnRzIElCYXNpYworcHVibGljIGNsYXNzIEphdmFCYXNpYyBleHRlbmRzIEphdmFBdHRyaWJ1dGVNYXBwaW5nIGltcGxlbWVudHMgSUphdmFCYXNpYwogewogCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gb3B0aW9uYWxBZGFwdGVyOwogCkBAIC02MjgsNiArNjE5LDEyIEBACiAJCQkJCXJldHVybiAtMTsKIAkJCX0KIAkJfQorCQlpZiAoYmFzZUNsYXNzID09IElKYXZhQmFzaWMuY2xhc3MpIHsKKwkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkgeworCQkJCWRlZmF1bHQgOgorCQkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0KIAkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwogCX0KIApAQCAtNjYyLDYgKzY1OSwxMiBAQAogCQkJCQlyZXR1cm4gLTE7CiAJCQl9CiAJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBJSmF2YUJhc2ljLmNsYXNzKSB7CisJCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpIHsKKwkJCQlkZWZhdWx0IDoKKwkJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9CiAJCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKIAl9CiAKQEAgLTc0MCwxNzUgKzc0MywxMyBAQAogCiAJLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCiAJcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZE9wdGlvbmFsQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nLCBCb29sZWFuTGl0ZXJhbD4oREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBKUEEuQkFTSUNfX09QVElPTkFMLCBmYWxzZSwgQm9vbGVhblN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7CisJCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBKUEEuQkFTSUNfX09QVElPTkFMLCBmYWxzZSwgQm9vbGVhblN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7CiAJfQogCiAJcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZEZldGNoQWRhcHRlcigpIHsKIAkJcmV0dXJuIG5ldyBFbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBKUEEuQkFTSUNfX0ZFVENILCBmYWxzZSk7CiAJfQogCi0JLyoqCi0JICogRnJvbSB0aGUgSlBBIHNwZWMsIHdoZW4gdGhlIGJhc2ljIG1hcHBpbmcgYXBwbGllczoKLQkgKiBJZiB0aGUgdHlwZSBvZiB0aGUgYXR0cmlidXRlIChmaWVsZCBvciBwcm9wZXJ0eSkgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmcKLQkgKiBpdCBtdXN0IGJlIG1hcHBlZCBhcyBAQmFzaWM6Ci0JICogICAgIHByaW1pdGl2ZSB0eXBlcwotCSAqICAgICBieXRlW10KLQkgKiAgICAgQnl0ZVtdCi0JICogICAgIGNoYXJbXQotCSAqICAgICBDaGFyYWN0ZXJbXQotCSAqICAgICBwcmltaXRpdmUgd3JhcHBlcnMKLQkgKiAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqICAgICBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqICAgICBqYXZhLm1hdGguQmlnRGVjaW1hbAotCSAqICAgICBqYXZhLnV0aWwuRGF0ZQotCSAqICAgICBqYXZhLnV0aWwuQ2FsZW5kYXIKLQkgKiAgICAgamF2YS5zcWwuRGF0ZQotCSAqICAgICBqYXZhLnNxbC5UaW1lCi0JICogICAgIGphdmEuc3FsLlRpbWVzdGFtcAotCSAqICAgICBlbnVtcwotCSAqICAgICBhbnkgb3RoZXIgdHlwZSB0aGF0IGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2lnbmF0dXJlSXNCYXNpYyhTdHJpbmcgc2lnbmF0dXJlLCBJVHlwZSBzY29wZSkgewotCQlpZiAoSkRUVG9vbHMuc2lnbmF0dXJlSXNQcmltaXRpdmUoc2lnbmF0dXJlKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaW50IGFycmF5Q291bnQgPSBTaWduYXR1cmUuZ2V0QXJyYXlDb3VudChzaWduYXR1cmUpOwotCQlpZiAoYXJyYXlDb3VudCA+IDEpIHsKLQkJCXJldHVybiBmYWxzZTsgLy8gbXVsdGktZGltZW5zaW9uYWwgYXJyYXlzIGFyZSBub3Qgc3VwcG9ydGVkCi0JCX0KLQkJc2lnbmF0dXJlID0gU2lnbmF0dXJlLmdldEVsZW1lbnRUeXBlKHNpZ25hdHVyZSk7Ci0JCVN0cmluZyB0eXBlTmFtZSA9IEpEVFRvb2xzLnJlc29sdmVTaWduYXR1cmUoc2lnbmF0dXJlLCBzY29wZSk7Ci0JCWlmICh0eXBlTmFtZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7IC8vIHVuYWJsZSB0byByZXNvbHZlIHRoZSB0eXBlCi0JCX0KLQkJaWYgKGFycmF5Q291bnQgPT0gMSkgewotCQkJcmV0dXJuIGVsZW1lbnRUeXBlSXNWYWxpZCh0eXBlTmFtZSk7Ci0JCX0KLQkJaWYgKHR5cGVJc1ByaW1pdGl2ZVdyYXBwZXIodHlwZU5hbWUpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAodHlwZUlzT3RoZXJTdXBwb3J0ZWRUeXBlKHR5cGVOYW1lKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJSVR5cGUgdHlwZSA9IGZpbmRUeXBlKHNjb3BlLmdldENvbXBpbGF0aW9uVW5pdCgpLmdldEphdmFQcm9qZWN0KCksIHR5cGVOYW1lKTsKLQkJaWYgKHR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOyAvLyB0eXBlIG5vdCBmb3VuZAotCQl9Ci0JCWlmICh0eXBlSXNFbnVtKHR5cGUpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAodHlwZUltcGxlbWVudHNTZXJpYWxpemFibGUodHlwZSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJVHlwZSBmaW5kVHlwZShJSmF2YVByb2plY3QgamF2YVByb2plY3QsIFN0cmluZyB0eXBlTmFtZSkgewotCQl0cnkgewotCQkJcmV0dXJuIGphdmFQcm9qZWN0LmZpbmRUeXBlKHR5cGVOYW1lKTsKLQkJfQotCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHR5cGUgaXMgYSB2YWxpZCBlbGVtZW50IHR5cGUgZm9yCi0JICogYSBvbmUtZGltZW5zaW9uYWwgYXJyYXk6Ci0JICogICAgIGJ5dGUKLQkgKiAgICAgY2hhcgotCSAqICAgICBqYXZhLmxhbmcuQnl0ZQotCSAqICAgICBqYXZhLmxhbmcuQ2hhcmFjdGVyCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBlbGVtZW50VHlwZUlzVmFsaWQoU3RyaW5nIGVsZW1lbnRUeXBlTmFtZSkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKFZBTElEX0VMRU1FTlRfVFlQRV9OQU1FUywgZWxlbWVudFR5cGVOYW1lKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBWQUxJRF9FTEVNRU5UX1RZUEVfTkFNRVMgPSB7Ci0JCWJ5dGUuY2xhc3MuZ2V0TmFtZSgpLAotCQljaGFyLmNsYXNzLmdldE5hbWUoKSwKLQkJamF2YS5sYW5nLkJ5dGUuY2xhc3MuZ2V0TmFtZSgpLAotCQlqYXZhLmxhbmcuQ2hhcmFjdGVyLmNsYXNzLmdldE5hbWUoKQotCX07Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHR5cGUgaXMgYSBwcmltaXRpdmUgd3JhcHBlci4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHR5cGVJc1ByaW1pdGl2ZVdyYXBwZXIoU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoUFJJTUlUSVZFX1dSQVBQRVJfVFlQRV9OQU1FUywgdHlwZU5hbWUpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFBSSU1JVElWRV9XUkFQUEVSX1RZUEVfTkFNRVMgPSB7Ci0JCWphdmEubGFuZy5CeXRlLmNsYXNzLmdldE5hbWUoKSwKLQkJamF2YS5sYW5nLkNoYXJhY3Rlci5jbGFzcy5nZXROYW1lKCksCi0JCWphdmEubGFuZy5Eb3VibGUuY2xhc3MuZ2V0TmFtZSgpLAotCQlqYXZhLmxhbmcuRmxvYXQuY2xhc3MuZ2V0TmFtZSgpLAotCQlqYXZhLmxhbmcuSW50ZWdlci5jbGFzcy5nZXROYW1lKCksCi0JCWphdmEubGFuZy5Mb25nLmNsYXNzLmdldE5hbWUoKSwKLQkJamF2YS5sYW5nLlNob3J0LmNsYXNzLmdldE5hbWUoKSwKLQkJamF2YS5sYW5nLkJvb2xlYW4uY2xhc3MuZ2V0TmFtZSgpLAotCX07Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHR5cGUgaXMgYW1vbmcgdGhlIHZhcmlvdXMgb3RoZXIgdHlwZXMKLQkgKiB0aGF0IGRlZmF1bHQgdG8gYSBCYXNpYyBtYXBwaW5nLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gdHlwZUlzT3RoZXJTdXBwb3J0ZWRUeXBlKFN0cmluZyB0eXBlTmFtZSkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKE9USEVSX1NVUFBPUlRFRF9UWVBFX05BTUVTLCB0eXBlTmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gT1RIRVJfU1VQUE9SVEVEX1RZUEVfTkFNRVMgPSB7Ci0JCWphdmEubGFuZy5TdHJpbmcuY2xhc3MuZ2V0TmFtZSgpLAotCQlqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzcy5nZXROYW1lKCksCi0JCWphdmEubWF0aC5CaWdEZWNpbWFsLmNsYXNzLmdldE5hbWUoKSwKLQkJamF2YS51dGlsLkRhdGUuY2xhc3MuZ2V0TmFtZSgpLAotCQlqYXZhLnV0aWwuQ2FsZW5kYXIuY2xhc3MuZ2V0TmFtZSgpLAotCQlqYXZhLnNxbC5EYXRlLmNsYXNzLmdldE5hbWUoKSwKLQkJamF2YS5zcWwuVGltZS5jbGFzcy5nZXROYW1lKCksCi0JCWphdmEuc3FsLlRpbWVzdGFtcC5jbGFzcy5nZXROYW1lKCksCi0JfTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgdHlwZSBpcyBhbiBlbnVtLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gdHlwZUlzRW51bShJVHlwZSB0eXBlKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gdHlwZS5pc0VudW0oKTsKLQkJfQotCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHR5cGUgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZS4KLQkgKi8KLQkvLyBUT0RPIHNob3VsZCB3ZSBiZSB1c2luZyBJVHlwZS5nZXRTdXBlckludGVyZmFjZVR5cGVTaWduYXR1cmVzKCkgaW5zdGVhZD8KLQkvLyB3b3VsZCB0aGlzIGJlIGxlc3Mgb2YgYSBwZXJmb3JtYW5jZSBob2c/PwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gdHlwZUltcGxlbWVudHNTZXJpYWxpemFibGUoSVR5cGUgdHlwZSkgewotCQlJVHlwZUhpZXJhcmNoeSBoaWVyYXJjaHkgPSB0eXBlSGllcmFyY2h5KHR5cGUpOwotCQlJVHlwZVtdIGludGVyZmFjZXMgPSBoaWVyYXJjaHkuZ2V0QWxsU3VwZXJJbnRlcmZhY2VzKHR5cGUpOwotCQlmb3IgKGludCBpID0gaW50ZXJmYWNlcy5sZW5ndGg7IGktLSA+IDA7KSB7Ci0JCQlpZiAoaW50ZXJmYWNlc1tpXS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKS5lcXVhbHMoU0VSSUFMSVpBQkxFX1RZUEVfTkFNRSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUklBTElaQUJMRV9UWVBFX05BTUUgPSBqYXZhLmlvLlNlcmlhbGl6YWJsZS5jbGFzcy5nZXROYW1lKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBJVHlwZUhpZXJhcmNoeSB0eXBlSGllcmFyY2h5KElUeXBlIHR5cGUpIHsKLQkJLy8gVE9ETyBobW0uLi4gd2hhdCB0byBkbyBhYm91dCB0aGUgd29ya2luZyBjb3B5LCBwcm9iYWJseSBzaG91bGRuJ3QgcGFzcyBpbiBudWxsOwotCQkvLyBhbHNvLCB0aGlzIGxvb2tzIGxpa2UgYSBwZXJmb3JtYW5jZSBob2csIG90aGVyIHdheXMgdG8gZG8gdGhpcz8KLQkJdHJ5IHsKLQkJCXJldHVybiB0eXBlLm5ld1N1cGVydHlwZUhpZXJhcmNoeSgoV29ya2luZ0NvcHlPd25lcikgbnVsbCwgbnVsbCk7Ci0JCX0KLQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQl9Ci0JfQotCiAJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gaXNPdmVycmlkYWJsZUF0dHJpYnV0ZU1hcHBpbmcoKSB7CiAJCXJldHVybiB0cnVlOwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9tYXBwaW5ncy9KYXZhQmFzaWNQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9tYXBwaW5ncy9KYXZhQmFzaWNQcm92aWRlci5qYXZhCmluZGV4IGUwODY3M2IuLjQ0NGM5NDcgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvbWFwcGluZ3MvSmF2YUJhc2ljUHJvdmlkZXIuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL21hcHBpbmdzL0phdmFCYXNpY1Byb3ZpZGVyLmphdmEKQEAgLTksMTggKzksMTUgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5nczsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZUhpZXJhcmNoeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuU2lnbmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLldvcmtpbmdDb3B5T3duZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JVHlwZUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSUpwYUZhY3Rvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSU1hcHBpbmdLZXlzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5JRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLklKYXZhQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEuSUphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuamR0dXRpbGl0eS5BdHRyaWJ1dGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuamR0dXRpbGl0eS5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHkuSkRUVG9vbHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucGxhdGZvcm0uRGVmYXVsdHNDb250ZXh0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKIApAQCAtMjgsNyArMjUsNyBAQAogICogCiAgKi8KIHB1YmxpYyBjbGFzcyBKYXZhQmFzaWNQcm92aWRlcgotCWltcGxlbWVudHMgSUphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIKKwlpbXBsZW1lbnRzIElEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcgogewogCiAJLy8gc2luZ2xldG9uCkBAIC0zNyw3ICszNCw3IEBACiAJLyoqCiAJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCiAJICovCi0JcHVibGljIHN0YXRpYyBJSmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlciBpbnN0YW5jZSgpIHsKKwlwdWJsaWMgc3RhdGljIElEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlciBpbnN0YW5jZSgpIHsKIAkJcmV0dXJuIElOU1RBTkNFOwogCX0KIApAQCAtNTMsMTEgKzUwLDEyIEBACiAJfQogCiAJcHVibGljIGJvb2xlYW4gZGVmYXVsdEFwcGxpZXMoQXR0cmlidXRlIGF0dHJpYnV0ZSwgRGVmYXVsdHNDb250ZXh0IGRlZmF1bHRzQ29udGV4dCkgewotCQlyZXR1cm4gc2lnbmF0dXJlSXNCYXNpYyhhdHRyaWJ1dGUudHlwZVNpZ25hdHVyZSgpLCBhdHRyaWJ1dGUuZ2V0RGVjbGFyaW5nVHlwZSgpLmdldEpkdE1lbWJlcigpKTsKKwkJQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QgPSBkZWZhdWx0c0NvbnRleHQuYXN0Um9vdCgpOworCQlyZXR1cm4gdHlwZUlzQmFzaWMoYXR0cmlidXRlLnR5cGVCaW5kaW5nKGFzdFJvb3QpLCBhc3RSb290LmdldEFTVCgpKTsKIAl9CiAKLQlwdWJsaWMgSUphdmFBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkTWFwcGluZyhBdHRyaWJ1dGUgYXR0cmlidXRlKSB7Ci0JCXJldHVybiBKcGFKYXZhTWFwcGluZ3NGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVKYXZhQmFzaWMoYXR0cmlidXRlKTsKKwlwdWJsaWMgSUphdmFBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkTWFwcGluZyhBdHRyaWJ1dGUgYXR0cmlidXRlLCBJSnBhRmFjdG9yeSBmYWN0b3J5KSB7CisJCXJldHVybiBmYWN0b3J5LmNyZWF0ZUphdmFCYXNpYyhhdHRyaWJ1dGUpOwogCX0KIAogCXB1YmxpYyBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoKSB7CkBAIC04Nyw0OSArODUsMzkgQEAKIAkgKiAgICAgZW51bXMKIAkgKiAgICAgYW55IG90aGVyIHR5cGUgdGhhdCBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlCiAJICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHNpZ25hdHVyZUlzQmFzaWMoU3RyaW5nIHNpZ25hdHVyZSwgSVR5cGUgc2NvcGUpIHsKLQkJaWYgKEpEVFRvb2xzLnNpZ25hdHVyZUlzUHJpbWl0aXZlKHNpZ25hdHVyZSkpIHsKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdHlwZUlzQmFzaWMoSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nLCBBU1QgYXN0KSB7CisJCWlmICh0eXBlQmluZGluZyA9PSBudWxsKSB7CisJCQlyZXR1cm4gZmFsc2U7IC8vIHR5cGUgbm90IGZvdW5kCisJCX0KKwkJaWYgKHR5cGVCaW5kaW5nLmlzUHJpbWl0aXZlKCkpIHsKIAkJCXJldHVybiB0cnVlOwogCQl9Ci0JCWludCBhcnJheUNvdW50ID0gU2lnbmF0dXJlLmdldEFycmF5Q291bnQoc2lnbmF0dXJlKTsKLQkJaWYgKGFycmF5Q291bnQgPiAxKSB7Ci0JCQlyZXR1cm4gZmFsc2U7ICAvLyBtdWx0aS1kaW1lbnNpb25hbCBhcnJheXMgYXJlIG5vdCBzdXBwb3J0ZWQKKwkJaWYgKHR5cGVCaW5kaW5nLmlzQXJyYXkoKSkgeworCQkJaWYgKHR5cGVCaW5kaW5nLmdldERpbWVuc2lvbnMoKSA+IDEpIHsKKwkJCQlyZXR1cm4gZmFsc2U7IC8vIG11bHRpLWRpbWVuc2lvbmFsIGFycmF5cyBhcmUgbm90IHN1cHBvcnRlZAorCQkJfQorCQkJSVR5cGVCaW5kaW5nIGVsZW1lbnRUeXBlQmluZGluZyA9IHR5cGVCaW5kaW5nLmdldEVsZW1lbnRUeXBlKCk7CisJCQlpZiAoZWxlbWVudFR5cGVCaW5kaW5nID09IG51bGwpIHsKKwkJCQlyZXR1cm4gZmFsc2U7Ly8gdW5hYmxlIHRvIHJlc29sdmUgdGhlIHR5cGUKKwkJCX0KKwkJCXJldHVybiBlbGVtZW50VHlwZUlzVmFsaWQoZWxlbWVudFR5cGVCaW5kaW5nLmdldFF1YWxpZmllZE5hbWUoKSk7CiAJCX0KLQkJc2lnbmF0dXJlID0gU2lnbmF0dXJlLmdldEVsZW1lbnRUeXBlKHNpZ25hdHVyZSk7Ci0JCVN0cmluZyB0eXBlTmFtZSA9IEpEVFRvb2xzLnJlc29sdmVTaWduYXR1cmUoc2lnbmF0dXJlLCBzY29wZSk7Ci0JCWlmICh0eXBlTmFtZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7ICAvLyB1bmFibGUgdG8gcmVzb2x2ZSB0aGUgdHlwZQotCQl9Ci0JCWlmIChhcnJheUNvdW50ID09IDEpIHsKLQkJCXJldHVybiBlbGVtZW50VHlwZUlzVmFsaWQodHlwZU5hbWUpOwotCQl9CisJCVN0cmluZyB0eXBlTmFtZSA9IHR5cGVCaW5kaW5nLmdldFF1YWxpZmllZE5hbWUoKTsKIAkJaWYgKHR5cGVJc1ByaW1pdGl2ZVdyYXBwZXIodHlwZU5hbWUpKSB7CiAJCQlyZXR1cm4gdHJ1ZTsKIAkJfQogCQlpZiAodHlwZUlzT3RoZXJTdXBwb3J0ZWRUeXBlKHR5cGVOYW1lKSkgewogCQkJcmV0dXJuIHRydWU7CiAJCX0KLQkJSVR5cGUgdHlwZSA9IGZpbmRUeXBlKHNjb3BlLmdldENvbXBpbGF0aW9uVW5pdCgpLmdldEphdmFQcm9qZWN0KCksIHR5cGVOYW1lKTsKLQkJaWYgKHR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOyAgLy8gdHlwZSBub3QgZm91bmQKLQkJfQotCQlpZiAodHlwZUlzRW51bSh0eXBlKSkgeworCQlpZiAodHlwZUJpbmRpbmcuaXNFbnVtKCkpIHsKIAkJCXJldHVybiB0cnVlOwogCQl9Ci0JCWlmICh0eXBlSW1wbGVtZW50c1NlcmlhbGl6YWJsZSh0eXBlKSkgeworCQlpZiAodHlwZUltcGxlbWVudHNTZXJpYWxpemFibGUodHlwZUJpbmRpbmcsIGFzdCkpIHsKIAkJCXJldHVybiB0cnVlOwogCQl9CiAJCXJldHVybiBmYWxzZTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBJVHlwZSBmaW5kVHlwZShJSmF2YVByb2plY3QgamF2YVByb2plY3QsIFN0cmluZyB0eXBlTmFtZSkgewotCQl0cnkgewotCQkJcmV0dXJuIGphdmFQcm9qZWN0LmZpbmRUeXBlKHR5cGVOYW1lKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0JCX0KLQl9Ci0KIAkvKioKIAkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHR5cGUgaXMgYSB2YWxpZCBlbGVtZW50IHR5cGUgZm9yCiAJICogYSBvbmUtZGltZW5zaW9uYWwgYXJyYXk6CkBAIC0xODUsNDQgKzE3MywxNCBAQAogCQlqYXZhLnNxbC5UaW1lLmNsYXNzLmdldE5hbWUoKSwKIAkJamF2YS5zcWwuVGltZXN0YW1wLmNsYXNzLmdldE5hbWUoKSwKIAl9OwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCB0eXBlIGlzIGFuIGVudW0uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiB0eXBlSXNFbnVtKElUeXBlIHR5cGUpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiB0eXBlLmlzRW51bSgpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLQkJfQotCX0KIAkKIAkvKioKIAkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHR5cGUgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZS4KIAkgKi8KLQkvLyBUT0RPIHNob3VsZCB3ZSBiZSB1c2luZyBJVHlwZS5nZXRTdXBlckludGVyZmFjZVR5cGVTaWduYXR1cmVzKCkgaW5zdGVhZD8KLQkvLyB3b3VsZCB0aGlzIGJlIGxlc3Mgb2YgYSBwZXJmb3JtYW5jZSBob2c/PwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gdHlwZUltcGxlbWVudHNTZXJpYWxpemFibGUoSVR5cGUgdHlwZSkgewotCQlJVHlwZUhpZXJhcmNoeSBoaWVyYXJjaHkgPSB0eXBlSGllcmFyY2h5KHR5cGUpOwotCQlJVHlwZVtdIGludGVyZmFjZXMgPSBoaWVyYXJjaHkuZ2V0QWxsU3VwZXJJbnRlcmZhY2VzKHR5cGUpOwotCQlmb3IgKGludCBpID0gaW50ZXJmYWNlcy5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaWYgKGludGVyZmFjZXNbaV0uZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkuZXF1YWxzKFNFUklBTElaQUJMRV9UWVBFX05BTUUpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gdHlwZUltcGxlbWVudHNTZXJpYWxpemFibGUoSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nLCBBU1QgYXN0KSB7CisJCUlUeXBlQmluZGluZyBzZXJpYWxpemFibGVUeXBlQmluZGluZyA9IGFzdC5yZXNvbHZlV2VsbEtub3duVHlwZShTRVJJQUxJWkFCTEVfVFlQRV9OQU1FKTsKKwkJcmV0dXJuIHR5cGVCaW5kaW5nLmlzQXNzaWdubWVudENvbXBhdGlibGUoc2VyaWFsaXphYmxlVHlwZUJpbmRpbmcpOwogCX0KIAogCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJJQUxJWkFCTEVfVFlQRV9OQU1FID0gamF2YS5pby5TZXJpYWxpemFibGUuY2xhc3MuZ2V0TmFtZSgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgSVR5cGVIaWVyYXJjaHkgdHlwZUhpZXJhcmNoeShJVHlwZSB0eXBlKSB7Ci0JCS8vIFRPRE8gaG1tLi4uIHdoYXQgdG8gZG8gYWJvdXQgdGhlIHdvcmtpbmcgY29weSwgcHJvYmFibHkgc2hvdWxkbid0IHBhc3MgaW4gbnVsbDsKLQkJLy8gYWxzbywgdGhpcyBsb29rcyBsaWtlIGEgcGVyZm9ybWFuY2UgaG9nLCBvdGhlciB3YXlzIHRvIGRvIHRoaXM/Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gdHlwZS5uZXdTdXBlcnR5cGVIaWVyYXJjaHkoKFdvcmtpbmdDb3B5T3duZXIpIG51bGwsIG51bGwpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLQkJfQotCX0KLQogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9tYXBwaW5ncy9KYXZhQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL21hcHBpbmdzL0phdmFDb2x1bW4uamF2YQppbmRleCA2ZmQzYmRiLi5iMzUzNDE2IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL21hcHBpbmdzL0phdmFDb2x1bW4uamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL21hcHBpbmdzL0phdmFDb2x1bW4uamF2YQpAQCAtNDIsMTcgKzQyLDI3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgTEVOR1RIX0VERUZBVUxUID0gMjU1OworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IExFTkdUSF9FREVGQVVMVCA9IDA7CiAKIAkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMZW5ndGgoKSA8ZW0+TGVuZ3RoPC9lbT59JyBhdHRyaWJ1dGUuCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNwZWNpZmllZExlbmd0aCgpIDxlbT5TcGVjaWZpZWQgTGVuZ3RoPC9lbT59JyBhdHRyaWJ1dGUuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMZW5ndGgoKQorCSAqIEBzZWUgI2dldFNwZWNpZmllZExlbmd0aCgpCiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIGludCBsZW5ndGggPSBMRU5HVEhfRURFRkFVTFQ7CisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgU1BFQ0lGSUVEX0xFTkdUSF9FREVGQVVMVCA9IC0xOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3BlY2lmaWVkTGVuZ3RoKCkgPGVtPlNwZWNpZmllZCBMZW5ndGg8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFNwZWNpZmllZExlbmd0aCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGludCBzcGVjaWZpZWRMZW5ndGggPSBTUEVDSUZJRURfTEVOR1RIX0VERUZBVUxUOwogCiAJLyoqCiAJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZWNpc2lvbigpIDxlbT5QcmVjaXNpb248L2VtPn0nIGF0dHJpYnV0ZS4KQEAgLTY1LDE0ICs3NSwyNCBAQAogCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFBSRUNJU0lPTl9FREVGQVVMVCA9IDA7CiAKIAkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVjaXNpb24oKSA8ZW0+UHJlY2lzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNwZWNpZmllZFByZWNpc2lvbigpIDxlbT5TcGVjaWZpZWQgUHJlY2lzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVjaXNpb24oKQorCSAqIEBzZWUgI2dldFNwZWNpZmllZFByZWNpc2lvbigpCiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIGludCBwcmVjaXNpb24gPSBQUkVDSVNJT05fRURFRkFVTFQ7CisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgU1BFQ0lGSUVEX1BSRUNJU0lPTl9FREVGQVVMVCA9IC0xOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCkgPGVtPlNwZWNpZmllZCBQcmVjaXNpb248L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFNwZWNpZmllZFByZWNpc2lvbigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGludCBzcGVjaWZpZWRQcmVjaXNpb24gPSBTUEVDSUZJRURfUFJFQ0lTSU9OX0VERUZBVUxUOwogCiAJLyoqCiAJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNjYWxlKCkgPGVtPlNjYWxlPC9lbT59JyBhdHRyaWJ1dGUuCkBAIC04NSwxNCArMTA1LDI0IEBACiAJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgU0NBTEVfRURFRkFVTFQgPSAwOwogCiAJLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2NhbGUoKSA8ZW0+U2NhbGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3BlY2lmaWVkU2NhbGUoKSA8ZW0+U3BlY2lmaWVkIFNjYWxlPC9lbT59JyBhdHRyaWJ1dGUuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTY2FsZSgpCisJICogQHNlZSAjZ2V0U3BlY2lmaWVkU2NhbGUoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBpbnQgc2NhbGUgPSBTQ0FMRV9FREVGQVVMVDsKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBTUEVDSUZJRURfU0NBTEVfRURFRkFVTFQgPSAtMTsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNwZWNpZmllZFNjYWxlKCkgPGVtPlNwZWNpZmllZCBTY2FsZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0U3BlY2lmaWVkU2NhbGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBpbnQgc3BlY2lmaWVkU2NhbGUgPSBTUEVDSUZJRURfU0NBTEVfRURFRkFVTFQ7CiAKIAlwcml2YXRlIGZpbmFsIEludEFubm90YXRpb25FbGVtZW50QWRhcHRlciBsZW5ndGhBZGFwdGVyOwogCkBAIC0xNzgsMTA0ICsyMDgsMTMwIEBACiAJCXJldHVybiBKcGFKYXZhTWFwcGluZ3NQYWNrYWdlLkxpdGVyYWxzLkpBVkFfQ09MVU1OOwogCX0KIAotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxlbmd0aDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIyNTUiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkxlbmd0aDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MZW5ndGg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExlbmd0aChpbnQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSnBhSmF2YU1hcHBpbmdzUGFja2FnZSNnZXRJQ29sdW1uX0xlbmd0aCgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IjI1NSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCiAJcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBsZW5ndGg7CisJCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWRMZW5ndGgoKSA9PSBTUEVDSUZJRURfTEVOR1RIX0VERUZBVUxUKSA/IGdldERlZmF1bHRMZW5ndGgoKSA6IHRoaXMuZ2V0U3BlY2lmaWVkTGVuZ3RoKCk7CiAJfQogCiAJLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLkphdmFDb2x1bW4jZ2V0TGVuZ3RoIDxlbT5MZW5ndGg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxlbmd0aDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TGVuZ3RoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGVuZ3RoKGludCBuZXdMZW5ndGgpIHsKLQkJaW50IG9sZExlbmd0aCA9IGxlbmd0aDsKLQkJbGVuZ3RoID0gbmV3TGVuZ3RoOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKcGFKYXZhTWFwcGluZ3NQYWNrYWdlLkpBVkFfQ09MVU1OX19MRU5HVEgsIG9sZExlbmd0aCwgbGVuZ3RoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlY2lzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3BlY2lmaWVkIExlbmd0aDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiItMSI8L2NvZGU+LgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJlY2lzaW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TcGVjaWZpZWQgTGVuZ3RoPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKIAkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCiAJICogPC9wPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByZWNpc2lvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHJlY2lzaW9uKGludCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5KcGFKYXZhTWFwcGluZ3NQYWNrYWdlI2dldElDb2x1bW5fUHJlY2lzaW9uKCkKLQkgKiBAbW9kZWwKKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TcGVjaWZpZWQgTGVuZ3RoPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRTcGVjaWZpZWRMZW5ndGgoaW50KQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLkpwYUphdmFNYXBwaW5nc1BhY2thZ2UjZ2V0SUNvbHVtbl9TcGVjaWZpZWRMZW5ndGgoKQorCSAqIEBtb2RlbCBkZWZhdWx0PSItMSIKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJcHVibGljIGludCBnZXRTcGVjaWZpZWRMZW5ndGgoKSB7CisJCXJldHVybiBzcGVjaWZpZWRMZW5ndGg7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLkphdmFDb2x1bW4jZ2V0U3BlY2lmaWVkTGVuZ3RoIDxlbT5TcGVjaWZpZWQgTGVuZ3RoPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TcGVjaWZpZWQgTGVuZ3RoPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRTcGVjaWZpZWRMZW5ndGgoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRMZW5ndGgoaW50IG5ld1NwZWNpZmllZExlbmd0aCkgeworCQlpbnQgb2xkU3BlY2lmaWVkTGVuZ3RoID0gc3BlY2lmaWVkTGVuZ3RoOworCQlzcGVjaWZpZWRMZW5ndGggPSBuZXdTcGVjaWZpZWRMZW5ndGg7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpwYUphdmFNYXBwaW5nc1BhY2thZ2UuSkFWQV9DT0xVTU5fX1NQRUNJRklFRF9MRU5HVEgsIG9sZFNwZWNpZmllZExlbmd0aCwgc3BlY2lmaWVkTGVuZ3RoKSk7CisJfQorCiAJcHVibGljIGludCBnZXRQcmVjaXNpb24oKSB7Ci0JCXJldHVybiBwcmVjaXNpb247CisJCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWRQcmVjaXNpb24oKSA9PSBTUEVDSUZJRURfUFJFQ0lTSU9OX0VERUZBVUxUKSA/IGdldERlZmF1bHRQcmVjaXNpb24oKSA6IHRoaXMuZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCk7CiAJfQogCiAJLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLkphdmFDb2x1bW4jZ2V0UHJlY2lzaW9uIDxlbT5QcmVjaXNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByZWNpc2lvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UHJlY2lzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlY2lzaW9uKGludCBuZXdQcmVjaXNpb24pIHsKLQkJaW50IG9sZFByZWNpc2lvbiA9IHByZWNpc2lvbjsKLQkJcHJlY2lzaW9uID0gbmV3UHJlY2lzaW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKcGFKYXZhTWFwcGluZ3NQYWNrYWdlLkpBVkFfQ09MVU1OX19QUkVDSVNJT04sIG9sZFByZWNpc2lvbiwgcHJlY2lzaW9uKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2NhbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TcGVjaWZpZWQgUHJlY2lzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+Ii0xIjwvY29kZT4uCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TY2FsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3BlY2lmaWVkIFByZWNpc2lvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCiAJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgogCSAqIDwvcD4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TY2FsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U2NhbGUoaW50KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLkpwYUphdmFNYXBwaW5nc1BhY2thZ2UjZ2V0SUNvbHVtbl9TY2FsZSgpCi0JICogQG1vZGVsCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3BlY2lmaWVkIFByZWNpc2lvbjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0U3BlY2lmaWVkUHJlY2lzaW9uKGludCkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5KcGFKYXZhTWFwcGluZ3NQYWNrYWdlI2dldElDb2x1bW5fU3BlY2lmaWVkUHJlY2lzaW9uKCkKKwkgKiBAbW9kZWwgZGVmYXVsdD0iLTEiCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBpbnQgZ2V0U2NhbGUoKSB7Ci0JCXJldHVybiBzY2FsZTsKKwlwdWJsaWMgaW50IGdldFNwZWNpZmllZFByZWNpc2lvbigpIHsKKwkJcmV0dXJuIHNwZWNpZmllZFByZWNpc2lvbjsKIAl9CiAKIAkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSmF2YUNvbHVtbiNnZXRTY2FsZSA8ZW0+U2NhbGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSmF2YUNvbHVtbiNnZXRTcGVjaWZpZWRQcmVjaXNpb24gPGVtPlNwZWNpZmllZCBQcmVjaXNpb248L2VtPn0nIGF0dHJpYnV0ZS4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNjYWxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTY2FsZSgpCisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3BlY2lmaWVkIFByZWNpc2lvbjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIHZvaWQgc2V0U2NhbGUoaW50IG5ld1NjYWxlKSB7Ci0JCWludCBvbGRTY2FsZSA9IHNjYWxlOwotCQlzY2FsZSA9IG5ld1NjYWxlOworCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFByZWNpc2lvbihpbnQgbmV3U3BlY2lmaWVkUHJlY2lzaW9uKSB7CisJCWludCBvbGRTcGVjaWZpZWRQcmVjaXNpb24gPSBzcGVjaWZpZWRQcmVjaXNpb247CisJCXNwZWNpZmllZFByZWNpc2lvbiA9IG5ld1NwZWNpZmllZFByZWNpc2lvbjsKIAkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSnBhSmF2YU1hcHBpbmdzUGFja2FnZS5KQVZBX0NPTFVNTl9fU0NBTEUsIG9sZFNjYWxlLCBzY2FsZSkpOworCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSnBhSmF2YU1hcHBpbmdzUGFja2FnZS5KQVZBX0NPTFVNTl9fU1BFQ0lGSUVEX1BSRUNJU0lPTiwgb2xkU3BlY2lmaWVkUHJlY2lzaW9uLCBzcGVjaWZpZWRQcmVjaXNpb24pKTsKKwl9CisKKwlwdWJsaWMgaW50IGdldFNjYWxlKCkgeworCQlyZXR1cm4gKHRoaXMuZ2V0U3BlY2lmaWVkU2NhbGUoKSA9PSBTUEVDSUZJRURfU0NBTEVfRURFRkFVTFQpID8gZ2V0RGVmYXVsdFNjYWxlKCkgOiB0aGlzLmdldFNwZWNpZmllZFNjYWxlKCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3BlY2lmaWVkIFNjYWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+Ii0xIjwvY29kZT4uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TcGVjaWZpZWQgU2NhbGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3BlY2lmaWVkIFNjYWxlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRTcGVjaWZpZWRTY2FsZShpbnQpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSnBhSmF2YU1hcHBpbmdzUGFja2FnZSNnZXRJQ29sdW1uX1NwZWNpZmllZFNjYWxlKCkKKwkgKiBAbW9kZWwgZGVmYXVsdD0iLTEiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBpbnQgZ2V0U3BlY2lmaWVkU2NhbGUoKSB7CisJCXJldHVybiBzcGVjaWZpZWRTY2FsZTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSmF2YUNvbHVtbiNnZXRTcGVjaWZpZWRTY2FsZSA8ZW0+U3BlY2lmaWVkIFNjYWxlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TcGVjaWZpZWQgU2NhbGU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldFNwZWNpZmllZFNjYWxlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkU2NhbGUoaW50IG5ld1NwZWNpZmllZFNjYWxlKSB7CisJCWludCBvbGRTcGVjaWZpZWRTY2FsZSA9IHNwZWNpZmllZFNjYWxlOworCQlzcGVjaWZpZWRTY2FsZSA9IG5ld1NwZWNpZmllZFNjYWxlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKcGFKYXZhTWFwcGluZ3NQYWNrYWdlLkpBVkFfQ09MVU1OX19TUEVDSUZJRURfU0NBTEUsIG9sZFNwZWNpZmllZFNjYWxlLCBzcGVjaWZpZWRTY2FsZSkpOworCX0KKworCXB1YmxpYyBpbnQgZ2V0RGVmYXVsdExlbmd0aCgpIHsKKwkJcmV0dXJuIERFRkFVTFRfTEVOR1RIOworCX0KKworCXB1YmxpYyBpbnQgZ2V0RGVmYXVsdFByZWNpc2lvbigpIHsKKwkJcmV0dXJuIERFRkFVTFRfUFJFQ0lTSU9OOworCX0KKworCXB1YmxpYyBpbnQgZ2V0RGVmYXVsdFNjYWxlKCkgeworCQlyZXR1cm4gREVGQVVMVF9TQ0FMRTsKIAl9CiAKIAkvKioKQEAgLTI4OCwxMCArMzQ0LDE2IEBACiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEpwYUphdmFNYXBwaW5nc1BhY2thZ2UuSkFWQV9DT0xVTU5fX0xFTkdUSCA6CiAJCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKGdldExlbmd0aCgpKTsKKwkJCWNhc2UgSnBhSmF2YU1hcHBpbmdzUGFja2FnZS5KQVZBX0NPTFVNTl9fU1BFQ0lGSUVEX0xFTkdUSCA6CisJCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKGdldFNwZWNpZmllZExlbmd0aCgpKTsKIAkJCWNhc2UgSnBhSmF2YU1hcHBpbmdzUGFja2FnZS5KQVZBX0NPTFVNTl9fUFJFQ0lTSU9OIDoKIAkJCQlyZXR1cm4gbmV3IEludGVnZXIoZ2V0UHJlY2lzaW9uKCkpOworCQkJY2FzZSBKcGFKYXZhTWFwcGluZ3NQYWNrYWdlLkpBVkFfQ09MVU1OX19TUEVDSUZJRURfUFJFQ0lTSU9OIDoKKwkJCQlyZXR1cm4gbmV3IEludGVnZXIoZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCkpOwogCQkJY2FzZSBKcGFKYXZhTWFwcGluZ3NQYWNrYWdlLkpBVkFfQ09MVU1OX19TQ0FMRSA6CiAJCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKGdldFNjYWxlKCkpOworCQkJY2FzZSBKcGFKYXZhTWFwcGluZ3NQYWNrYWdlLkpBVkFfQ09MVU1OX19TUEVDSUZJRURfU0NBTEUgOgorCQkJCXJldHVybiBuZXcgSW50ZWdlcihnZXRTcGVjaWZpZWRTY2FsZSgpKTsKIAkJfQogCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKIAl9CkBAIC0zMDQsMTQgKzM2NiwxNCBAQAogCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEpwYUphdmFNYXBwaW5nc1BhY2thZ2UuSkFWQV9DT0xVTU5fX0xFTkdUSCA6Ci0JCQkJc2V0TGVuZ3RoKCgoSW50ZWdlcikgbmV3VmFsdWUpLmludFZhbHVlKCkpOworCQkJY2FzZSBKcGFKYXZhTWFwcGluZ3NQYWNrYWdlLkpBVkFfQ09MVU1OX19TUEVDSUZJRURfTEVOR1RIIDoKKwkJCQlzZXRTcGVjaWZpZWRMZW5ndGgoKChJbnRlZ2VyKSBuZXdWYWx1ZSkuaW50VmFsdWUoKSk7CiAJCQkJcmV0dXJuOwotCQkJY2FzZSBKcGFKYXZhTWFwcGluZ3NQYWNrYWdlLkpBVkFfQ09MVU1OX19QUkVDSVNJT04gOgotCQkJCXNldFByZWNpc2lvbigoKEludGVnZXIpIG5ld1ZhbHVlKS5pbnRWYWx1ZSgpKTsKKwkJCWNhc2UgSnBhSmF2YU1hcHBpbmdzUGFja2FnZS5KQVZBX0NPTFVNTl9fU1BFQ0lGSUVEX1BSRUNJU0lPTiA6CisJCQkJc2V0U3BlY2lmaWVkUHJlY2lzaW9uKCgoSW50ZWdlcikgbmV3VmFsdWUpLmludFZhbHVlKCkpOwogCQkJCXJldHVybjsKLQkJCWNhc2UgSnBhSmF2YU1hcHBpbmdzUGFja2FnZS5KQVZBX0NPTFVNTl9fU0NBTEUgOgotCQkJCXNldFNjYWxlKCgoSW50ZWdlcikgbmV3VmFsdWUpLmludFZhbHVlKCkpOworCQkJY2FzZSBKcGFKYXZhTWFwcGluZ3NQYWNrYWdlLkpBVkFfQ09MVU1OX19TUEVDSUZJRURfU0NBTEUgOgorCQkJCXNldFNwZWNpZmllZFNjYWxlKCgoSW50ZWdlcikgbmV3VmFsdWUpLmludFZhbHVlKCkpOwogCQkJCXJldHVybjsKIAkJfQogCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwpAQCAtMzI1LDE0ICszODcsMTQgQEAKIAlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKcGFKYXZhTWFwcGluZ3NQYWNrYWdlLkpBVkFfQ09MVU1OX19MRU5HVEggOgotCQkJCXNldExlbmd0aChMRU5HVEhfRURFRkFVTFQpOworCQkJY2FzZSBKcGFKYXZhTWFwcGluZ3NQYWNrYWdlLkpBVkFfQ09MVU1OX19TUEVDSUZJRURfTEVOR1RIIDoKKwkJCQlzZXRTcGVjaWZpZWRMZW5ndGgoU1BFQ0lGSUVEX0xFTkdUSF9FREVGQVVMVCk7CiAJCQkJcmV0dXJuOwotCQkJY2FzZSBKcGFKYXZhTWFwcGluZ3NQYWNrYWdlLkpBVkFfQ09MVU1OX19QUkVDSVNJT04gOgotCQkJCXNldFByZWNpc2lvbihQUkVDSVNJT05fRURFRkFVTFQpOworCQkJY2FzZSBKcGFKYXZhTWFwcGluZ3NQYWNrYWdlLkpBVkFfQ09MVU1OX19TUEVDSUZJRURfUFJFQ0lTSU9OIDoKKwkJCQlzZXRTcGVjaWZpZWRQcmVjaXNpb24oU1BFQ0lGSUVEX1BSRUNJU0lPTl9FREVGQVVMVCk7CiAJCQkJcmV0dXJuOwotCQkJY2FzZSBKcGFKYXZhTWFwcGluZ3NQYWNrYWdlLkpBVkFfQ09MVU1OX19TQ0FMRSA6Ci0JCQkJc2V0U2NhbGUoU0NBTEVfRURFRkFVTFQpOworCQkJY2FzZSBKcGFKYXZhTWFwcGluZ3NQYWNrYWdlLkpBVkFfQ09MVU1OX19TUEVDSUZJRURfU0NBTEUgOgorCQkJCXNldFNwZWNpZmllZFNjYWxlKFNQRUNJRklFRF9TQ0FMRV9FREVGQVVMVCk7CiAJCQkJcmV0dXJuOwogCQl9CiAJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwpAQCAtMzQ3LDExICs0MDksMTcgQEAKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKcGFKYXZhTWFwcGluZ3NQYWNrYWdlLkpBVkFfQ09MVU1OX19MRU5HVEggOgotCQkJCXJldHVybiBsZW5ndGggIT0gTEVOR1RIX0VERUZBVUxUOworCQkJCXJldHVybiBnZXRMZW5ndGgoKSAhPSBMRU5HVEhfRURFRkFVTFQ7CisJCQljYXNlIEpwYUphdmFNYXBwaW5nc1BhY2thZ2UuSkFWQV9DT0xVTU5fX1NQRUNJRklFRF9MRU5HVEggOgorCQkJCXJldHVybiBzcGVjaWZpZWRMZW5ndGggIT0gU1BFQ0lGSUVEX0xFTkdUSF9FREVGQVVMVDsKIAkJCWNhc2UgSnBhSmF2YU1hcHBpbmdzUGFja2FnZS5KQVZBX0NPTFVNTl9fUFJFQ0lTSU9OIDoKLQkJCQlyZXR1cm4gcHJlY2lzaW9uICE9IFBSRUNJU0lPTl9FREVGQVVMVDsKKwkJCQlyZXR1cm4gZ2V0UHJlY2lzaW9uKCkgIT0gUFJFQ0lTSU9OX0VERUZBVUxUOworCQkJY2FzZSBKcGFKYXZhTWFwcGluZ3NQYWNrYWdlLkpBVkFfQ09MVU1OX19TUEVDSUZJRURfUFJFQ0lTSU9OIDoKKwkJCQlyZXR1cm4gc3BlY2lmaWVkUHJlY2lzaW9uICE9IFNQRUNJRklFRF9QUkVDSVNJT05fRURFRkFVTFQ7CiAJCQljYXNlIEpwYUphdmFNYXBwaW5nc1BhY2thZ2UuSkFWQV9DT0xVTU5fX1NDQUxFIDoKLQkJCQlyZXR1cm4gc2NhbGUgIT0gU0NBTEVfRURFRkFVTFQ7CisJCQkJcmV0dXJuIGdldFNjYWxlKCkgIT0gU0NBTEVfRURFRkFVTFQ7CisJCQljYXNlIEpwYUphdmFNYXBwaW5nc1BhY2thZ2UuSkFWQV9DT0xVTU5fX1NQRUNJRklFRF9TQ0FMRSA6CisJCQkJcmV0dXJuIHNwZWNpZmllZFNjYWxlICE9IFNQRUNJRklFRF9TQ0FMRV9FREVGQVVMVDsKIAkJfQogCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CiAJfQpAQCAtMzY3LDEwICs0MzUsMTYgQEAKIAkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkgewogCQkJCWNhc2UgSnBhSmF2YU1hcHBpbmdzUGFja2FnZS5KQVZBX0NPTFVNTl9fTEVOR1RIIDoKIAkJCQkJcmV0dXJuIEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSUNPTFVNTl9fTEVOR1RIOworCQkJCWNhc2UgSnBhSmF2YU1hcHBpbmdzUGFja2FnZS5KQVZBX0NPTFVNTl9fU1BFQ0lGSUVEX0xFTkdUSCA6CisJCQkJCXJldHVybiBKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLklDT0xVTU5fX1NQRUNJRklFRF9MRU5HVEg7CiAJCQkJY2FzZSBKcGFKYXZhTWFwcGluZ3NQYWNrYWdlLkpBVkFfQ09MVU1OX19QUkVDSVNJT04gOgogCQkJCQlyZXR1cm4gSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JQ09MVU1OX19QUkVDSVNJT047CisJCQkJY2FzZSBKcGFKYXZhTWFwcGluZ3NQYWNrYWdlLkpBVkFfQ09MVU1OX19TUEVDSUZJRURfUFJFQ0lTSU9OIDoKKwkJCQkJcmV0dXJuIEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSUNPTFVNTl9fU1BFQ0lGSUVEX1BSRUNJU0lPTjsKIAkJCQljYXNlIEpwYUphdmFNYXBwaW5nc1BhY2thZ2UuSkFWQV9DT0xVTU5fX1NDQUxFIDoKIAkJCQkJcmV0dXJuIEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSUNPTFVNTl9fU0NBTEU7CisJCQkJY2FzZSBKcGFKYXZhTWFwcGluZ3NQYWNrYWdlLkpBVkFfQ09MVU1OX19TUEVDSUZJRURfU0NBTEUgOgorCQkJCQlyZXR1cm4gSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JQ09MVU1OX19TUEVDSUZJRURfU0NBTEU7CiAJCQkJZGVmYXVsdCA6CiAJCQkJCXJldHVybiAtMTsKIAkJCX0KQEAgLTM4OSwxMCArNDYzLDE2IEBACiAJCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpIHsKIAkJCQljYXNlIEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSUNPTFVNTl9fTEVOR1RIIDoKIAkJCQkJcmV0dXJuIEpwYUphdmFNYXBwaW5nc1BhY2thZ2UuSkFWQV9DT0xVTU5fX0xFTkdUSDsKKwkJCQljYXNlIEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSUNPTFVNTl9fU1BFQ0lGSUVEX0xFTkdUSCA6CisJCQkJCXJldHVybiBKcGFKYXZhTWFwcGluZ3NQYWNrYWdlLkpBVkFfQ09MVU1OX19TUEVDSUZJRURfTEVOR1RIOwogCQkJCWNhc2UgSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JQ09MVU1OX19QUkVDSVNJT04gOgogCQkJCQlyZXR1cm4gSnBhSmF2YU1hcHBpbmdzUGFja2FnZS5KQVZBX0NPTFVNTl9fUFJFQ0lTSU9OOworCQkJCWNhc2UgSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JQ09MVU1OX19TUEVDSUZJRURfUFJFQ0lTSU9OIDoKKwkJCQkJcmV0dXJuIEpwYUphdmFNYXBwaW5nc1BhY2thZ2UuSkFWQV9DT0xVTU5fX1NQRUNJRklFRF9QUkVDSVNJT047CiAJCQkJY2FzZSBKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLklDT0xVTU5fX1NDQUxFIDoKIAkJCQkJcmV0dXJuIEpwYUphdmFNYXBwaW5nc1BhY2thZ2UuSkFWQV9DT0xVTU5fX1NDQUxFOworCQkJCWNhc2UgSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JQ09MVU1OX19TUEVDSUZJRURfU0NBTEUgOgorCQkJCQlyZXR1cm4gSnBhSmF2YU1hcHBpbmdzUGFja2FnZS5KQVZBX0NPTFVNTl9fU1BFQ0lGSUVEX1NDQUxFOwogCQkJCWRlZmF1bHQgOgogCQkJCQlyZXR1cm4gLTE7CiAJCQl9CkBAIC00MTAsMTIgKzQ5MCwxMiBAQAogCQlpZiAoZUlzUHJveHkoKSkKIAkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwogCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChsZW5ndGg6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGxlbmd0aCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcHJlY2lzaW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwcmVjaXNpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIHNjYWxlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzY2FsZSk7CisJCXJlc3VsdC5hcHBlbmQoIiAoc3BlY2lmaWVkTGVuZ3RoOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChzcGVjaWZpZWRMZW5ndGgpOworCQlyZXN1bHQuYXBwZW5kKCIsIHNwZWNpZmllZFByZWNpc2lvbjogIik7CisJCXJlc3VsdC5hcHBlbmQoc3BlY2lmaWVkUHJlY2lzaW9uKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBzcGVjaWZpZWRTY2FsZTogIik7CisJCXJlc3VsdC5hcHBlbmQoc3BlY2lmaWVkU2NhbGUpOwogCQlyZXN1bHQuYXBwZW5kKCcpJyk7CiAJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKIAl9CkBAIC00MjgsOSArNTA4LDkgQEAKIAlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCB1cGRhdGVGcm9tSmF2YShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewogCQlzdXBlci51cGRhdGVGcm9tSmF2YShhc3RSb290KTsKLQkJdGhpcy5zZXRMZW5ndGgodGhpcy5sZW5ndGhBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpKTsKLQkJdGhpcy5zZXRQcmVjaXNpb24odGhpcy5wcmVjaXNpb25BZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpKTsKLQkJdGhpcy5zZXRTY2FsZSh0aGlzLnNjYWxlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KSk7CisJCXRoaXMuc2V0U3BlY2lmaWVkTGVuZ3RoKHRoaXMubGVuZ3RoQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KSk7CisJCXRoaXMuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKHRoaXMucHJlY2lzaW9uQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KSk7CisJCXRoaXMuc2V0U3BlY2lmaWVkU2NhbGUodGhpcy5zY2FsZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCkpOwogCX0KIAogCXB1YmxpYyB2b2lkIHJlZnJlc2hEZWZhdWx0cyhEZWZhdWx0c0NvbnRleHQgZGVmYXVsdHNDb250ZXh0KSB7CkBAIC00MzksNyArNTE5LDcgQEAKIAl9CiAKIAkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQlzdGF0aWMgSmF2YUNvbHVtbiBjcmVhdGVDb2x1bW5NYXBwaW5nQ29sdW1uKE93bmVyIG93bmVyLCBNZW1iZXIgbWVtYmVyKSB7CisJcHVibGljIHN0YXRpYyBKYXZhQ29sdW1uIGNyZWF0ZUNvbHVtbk1hcHBpbmdDb2x1bW4oT3duZXIgb3duZXIsIE1lbWJlciBtZW1iZXIpIHsKIAkJcmV0dXJuIEpwYUphdmFNYXBwaW5nc0ZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUphdmFDb2x1bW4ob3duZXIsIG1lbWJlciwgTUFQUElOR19ERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOwogCX0KIApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9tYXBwaW5ncy9KYXZhRW1iZWRkYWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9tYXBwaW5ncy9KYXZhRW1iZWRkYWJsZS5qYXZhCmluZGV4IDA4YjhhM2MuLmFkZDcxNTUgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvbWFwcGluZ3MvSmF2YUVtYmVkZGFibGUuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL21hcHBpbmdzL0phdmFFbWJlZGRhYmxlLmphdmEKQEAgLTE0LDcgKzE0LDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qZHR1dGlsaXR5LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuamR0dXRpbGl0eS5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHkuVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JRW1iZWRkYWJsZTsKIAogLyoqCiAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtMjYsNyArMjUsNyBAQAogICogQG1vZGVsIGtpbmQ9ImNsYXNzIgogICogQGdlbmVyYXRlZAogICovCi1wdWJsaWMgY2xhc3MgSmF2YUVtYmVkZGFibGUgZXh0ZW5kcyBKYXZhVHlwZU1hcHBpbmcgaW1wbGVtZW50cyBJRW1iZWRkYWJsZQorcHVibGljIGNsYXNzIEphdmFFbWJlZGRhYmxlIGV4dGVuZHMgSmF2YVR5cGVNYXBwaW5nIGltcGxlbWVudHMgSUphdmFFbWJlZGRhYmxlCiB7CiAJcHVibGljIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEpQQS5FTUJFRERBQkxFKTsKIApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9tYXBwaW5ncy9KYXZhRW1iZWRkYWJsZVByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL21hcHBpbmdzL0phdmFFbWJlZGRhYmxlUHJvdmlkZXIuamF2YQppbmRleCA3MTRhODE1Li4yYmRkYWIwIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL21hcHBpbmdzL0phdmFFbWJlZGRhYmxlUHJvdmlkZXIuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL21hcHBpbmdzL0phdmFFbWJlZGRhYmxlUHJvdmlkZXIuamF2YQpAQCAtOSw2ICs5LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5nczsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklKcGFGYWN0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklNYXBwaW5nS2V5czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEuSUphdmFUeXBlTWFwcGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEuSUphdmFUeXBlTWFwcGluZ1Byb3ZpZGVyOwpAQCAtNDMsOCArNDQsOCBAQAogCQlyZXR1cm4gSU1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWTsKIAl9CiAKLQlwdWJsaWMgSUphdmFUeXBlTWFwcGluZyBidWlsZE1hcHBpbmcoVHlwZSB0eXBlKSB7Ci0JCXJldHVybiBKcGFKYXZhTWFwcGluZ3NGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVKYXZhRW1iZWRkYWJsZSh0eXBlKTsKKwlwdWJsaWMgSUphdmFUeXBlTWFwcGluZyBidWlsZE1hcHBpbmcoVHlwZSB0eXBlLCBJSnBhRmFjdG9yeSBmYWN0b3J5KSB7CisJCXJldHVybiBmYWN0b3J5LmNyZWF0ZUphdmFFbWJlZGRhYmxlKHR5cGUpOwogCX0KIAogCXB1YmxpYyBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoKSB7CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL21hcHBpbmdzL0phdmFFbWJlZGRlZC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9tYXBwaW5ncy9KYXZhRW1iZWRkZWQuamF2YQppbmRleCBiNjlmMTExLi5hNjY2MTNhIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL21hcHBpbmdzL0phdmFFbWJlZGRlZC5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvbWFwcGluZ3MvSmF2YUVtYmVkZGVkLmphdmEKQEAgLTQ5LDcgKzQ5LDcgQEAKICAqIEBtb2RlbCBraW5kPSJjbGFzcyIKICAqIEBnZW5lcmF0ZWQKICAqLwotcHVibGljIGNsYXNzIEphdmFFbWJlZGRlZCBleHRlbmRzIEphdmFBdHRyaWJ1dGVNYXBwaW5nIGltcGxlbWVudHMgSUVtYmVkZGVkCitwdWJsaWMgY2xhc3MgSmF2YUVtYmVkZGVkIGV4dGVuZHMgSmF2YUF0dHJpYnV0ZU1hcHBpbmcgaW1wbGVtZW50cyBJSmF2YUVtYmVkZGVkCiB7CiAJLyoqCiAJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkgPGVtPlNwZWNpZmllZCBBdHRyaWJ1dGUgT3ZlcnJpZGVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTM5NSw2ICszOTUsMTIgQEAKIAkJCQkJcmV0dXJuIC0xOwogCQkJfQogCQl9CisJCWlmIChiYXNlQ2xhc3MgPT0gSUphdmFFbWJlZGRlZC5jbGFzcykgeworCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKSB7CisJCQkJZGVmYXVsdCA6CisJCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfQogCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7CiAJfQogCkBAIC00MTcsNiArNDIzLDEyIEBACiAJCQkJCXJldHVybiAtMTsKIAkJCX0KIAkJfQorCQlpZiAoYmFzZUNsYXNzID09IElKYXZhRW1iZWRkZWQuY2xhc3MpIHsKKwkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkgeworCQkJCWRlZmF1bHQgOgorCQkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0KIAkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwogCX0KIApAQCAtNTYyLDEzICs1NzQsMTQgQEAKIAogCS8vKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioKIAlwdWJsaWMgc3RhdGljIElFbWJlZGRhYmxlIGVtYmVkZGFibGVGb3IoQXR0cmlidXRlIGF0dHJpYnV0ZSwgRGVmYXVsdHNDb250ZXh0IGRlZmF1bHRzQ29udGV4dCkgewotCQlTdHJpbmcgcmVzb2x2ZWRUeXBlTmFtZSA9IGF0dHJpYnV0ZS5yZXNvbHZlZFR5cGVOYW1lKCk7CisJCUNvbXBpbGF0aW9uVW5pdCBhc3RSb290ID0gZGVmYXVsdHNDb250ZXh0LmFzdFJvb3QoKTsKKwkJU3RyaW5nIHJlc29sdmVkVHlwZU5hbWUgPSBhdHRyaWJ1dGUucmVzb2x2ZWRUeXBlTmFtZShhc3RSb290KTsKIAkJaWYgKHJlc29sdmVkVHlwZU5hbWUgPT0gbnVsbCkgewogCQkJcmV0dXJuIG51bGw7CiAJCX0KIAkJSVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZGVmYXVsdHNDb250ZXh0LnBlcnNpc3RlbnRUeXBlKHJlc29sdmVkVHlwZU5hbWUpOwogCQlpZiAocGVyc2lzdGVudFR5cGUgIT0gbnVsbCkgewotCQkJaWYgKHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIElFbWJlZGRhYmxlKSB7CisJCQlpZiAocGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZ0tleSgpID09IElNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVkpIHsKIAkJCQlyZXR1cm4gKElFbWJlZGRhYmxlKSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CiAJCQl9CiAJCX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvbWFwcGluZ3MvSmF2YUVtYmVkZGVkSWQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvbWFwcGluZ3MvSmF2YUVtYmVkZGVkSWQuamF2YQppbmRleCBhOTA0ZjkzLi4wZjE2ZTVkIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL21hcHBpbmdzL0phdmFFbWJlZGRlZElkLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9tYXBwaW5ncy9KYXZhRW1iZWRkZWRJZC5qYXZhCkBAIC0xNCw3ICsxNCw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuamR0dXRpbGl0eS5BdHRyaWJ1dGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuamR0dXRpbGl0eS5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHkuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JRW1iZWRkZWRJZDsKIAogLyoqCiAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtMjYsNyArMjUsOCBAQAogICogQG1vZGVsIGtpbmQ9ImNsYXNzIgogICogQGdlbmVyYXRlZAogICovCi1wdWJsaWMgY2xhc3MgSmF2YUVtYmVkZGVkSWQgZXh0ZW5kcyBKYXZhQXR0cmlidXRlTWFwcGluZyBpbXBsZW1lbnRzIElFbWJlZGRlZElkCitwdWJsaWMgY2xhc3MgSmF2YUVtYmVkZGVkSWQgZXh0ZW5kcyBKYXZhQXR0cmlidXRlTWFwcGluZworCWltcGxlbWVudHMgSUphdmFFbWJlZGRlZElkCiB7CiAJcHVibGljIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEpQQS5FTUJFRERFRF9JRCk7CiAKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvbWFwcGluZ3MvSmF2YUVtYmVkZGVkSWRQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9tYXBwaW5ncy9KYXZhRW1iZWRkZWRJZFByb3ZpZGVyLmphdmEKaW5kZXggNDcwY2M0MC4uYjNiNjAyZCAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9tYXBwaW5ncy9KYXZhRW1iZWRkZWRJZFByb3ZpZGVyLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9tYXBwaW5ncy9KYXZhRW1iZWRkZWRJZFByb3ZpZGVyLmphdmEKQEAgLTksMTIgKzksMTIgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5nczsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklKcGFGYWN0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklNYXBwaW5nS2V5czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEuSUphdmFBdHRyaWJ1dGVNYXBwaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5JSmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qZHR1dGlsaXR5LkF0dHJpYnV0ZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qZHR1dGlsaXR5LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucGxhdGZvcm0uRGVmYXVsdHNDb250ZXh0OwogCiAvKioKICAqIApAQCAtNDQsMTIgKzQ0LDggQEAKIAkJcmV0dXJuIElNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVk7CiAJfQogCQotCXB1YmxpYyBib29sZWFuIGRlZmF1bHRBcHBsaWVzKEF0dHJpYnV0ZSBhdHRyaWJ1dGUsIERlZmF1bHRzQ29udGV4dCBkZWZhdWx0c0NvbnRleHQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBJSmF2YUF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRNYXBwaW5nKEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKLQkJcmV0dXJuIEpwYUphdmFNYXBwaW5nc0ZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUphdmFFbWJlZGRlZElkKGF0dHJpYnV0ZSk7CisJcHVibGljIElKYXZhQXR0cmlidXRlTWFwcGluZyBidWlsZE1hcHBpbmcoQXR0cmlidXRlIGF0dHJpYnV0ZSwgSUpwYUZhY3RvcnkgZmFjdG9yeSkgeworCQlyZXR1cm4gZmFjdG9yeS5jcmVhdGVKYXZhRW1iZWRkZWRJZChhdHRyaWJ1dGUpOwogCX0KIAogCXB1YmxpYyBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoKSB7CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL21hcHBpbmdzL0phdmFFbWJlZGRlZFByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL21hcHBpbmdzL0phdmFFbWJlZGRlZFByb3ZpZGVyLmphdmEKaW5kZXggNmUzOWYyMy4uNmZhN2IwNyAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9tYXBwaW5ncy9KYXZhRW1iZWRkZWRQcm92aWRlci5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvbWFwcGluZ3MvSmF2YUVtYmVkZGVkUHJvdmlkZXIuamF2YQpAQCAtOSwxMCArOSwxMCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSUpwYUZhY3Rvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSU1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklQZXJzaXN0ZW50VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEuSURlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5JSmF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLklKYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHkuQXR0cmlidXRlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHkuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JRW1iZWRkYWJsZTsKQEAgLTIyLDcgKzIyLDcgQEAKICAqIAogICovCiBwdWJsaWMgY2xhc3MgSmF2YUVtYmVkZGVkUHJvdmlkZXIKLQlpbXBsZW1lbnRzIElKYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyCisJaW1wbGVtZW50cyBJRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIKIHsKIAogCS8vIHNpbmdsZXRvbgpAQCAtMzEsNyArMzEsNyBAQAogCS8qKgogCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgSUphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIgaW5zdGFuY2UoKSB7CisJcHVibGljIHN0YXRpYyBJRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIgaW5zdGFuY2UoKSB7CiAJCXJldHVybiBJTlNUQU5DRTsKIAl9CiAKQEAgLTUxLDE5ICs1MSwxMSBAQAogCX0KIAkKIAlwcml2YXRlIElFbWJlZGRhYmxlIGVtYmVkZGFibGVGb3IoQXR0cmlidXRlIGF0dHJpYnV0ZSwgRGVmYXVsdHNDb250ZXh0IGRlZmF1bHRzQ29udGV4dCkgewotCQlTdHJpbmcgcmVzb2x2ZWRUeXBlTmFtZSA9IGF0dHJpYnV0ZS5yZXNvbHZlZFR5cGVOYW1lKCk7Ci0JCWlmIChyZXNvbHZlZFR5cGVOYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUlQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGRlZmF1bHRzQ29udGV4dC5wZXJzaXN0ZW50VHlwZShyZXNvbHZlZFR5cGVOYW1lKTsKLQkJaWYgKHBlcnNpc3RlbnRUeXBlICE9IG51bGwgJiYgcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZ0tleSgpID09IElNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVkpIHsKLQkJCXJldHVybiAoSUVtYmVkZGFibGUpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKKwkJcmV0dXJuIEphdmFFbWJlZGRlZC5lbWJlZGRhYmxlRm9yKGF0dHJpYnV0ZSwgZGVmYXVsdHNDb250ZXh0KTsKIAl9CiAKLQlwdWJsaWMgSUphdmFBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkTWFwcGluZyhBdHRyaWJ1dGUgYXR0cmlidXRlKSB7Ci0JCXJldHVybiBKcGFKYXZhTWFwcGluZ3NGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVKYXZhRW1iZWRkZWQoYXR0cmlidXRlKTsKKwlwdWJsaWMgSUphdmFBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkTWFwcGluZyhBdHRyaWJ1dGUgYXR0cmlidXRlLCBJSnBhRmFjdG9yeSBmYWN0b3J5KSB7CisJCXJldHVybiBmYWN0b3J5LmNyZWF0ZUphdmFFbWJlZGRlZChhdHRyaWJ1dGUpOwogCX0KIAogCXB1YmxpYyBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoKSB7CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL21hcHBpbmdzL0phdmFFbnRpdHkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvbWFwcGluZ3MvSmF2YUVudGl0eS5qYXZhCmluZGV4IGE2NDgxODYuLmY5NmVhNGMgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvbWFwcGluZ3MvSmF2YUVudGl0eS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvbWFwcGluZ3MvSmF2YUVudGl0eS5qYXZhCkBAIC0yMyw3ICsyMyw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UeXBlTGl0ZXJhbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JTWFwcGluZ0tleXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSVBlcnNpc3RlbnRBdHRyaWJ1dGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSVBlcnNpc3RlbnRUeXBlOwpAQCAtNzQsNyArNzMsNyBAQAogICogQG1vZGVsIGtpbmQ9ImNsYXNzIgogICogQGdlbmVyYXRlZAogICovCi1wdWJsaWMgY2xhc3MgSmF2YUVudGl0eSBleHRlbmRzIEphdmFUeXBlTWFwcGluZyBpbXBsZW1lbnRzIElFbnRpdHkKK3B1YmxpYyBjbGFzcyBKYXZhRW50aXR5IGV4dGVuZHMgSmF2YVR5cGVNYXBwaW5nIGltcGxlbWVudHMgSUphdmFFbnRpdHkKIHsKIAkvKioKIAkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3BlY2lmaWVkTmFtZSgpIDxlbT5TcGVjaWZpZWQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgpAQCAtMjI0Niw2ICsyMjQ1LDEyIEBACiAJCQkJCXJldHVybiAtMTsKIAkJCX0KIAkJfQorCQlpZiAoYmFzZUNsYXNzID09IElKYXZhRW50aXR5LmNsYXNzKSB7CisJCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpIHsKKwkJCQlkZWZhdWx0IDoKKwkJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9CiAJCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKIAl9CiAKQEAgLTIzMDgsNiArMjMxMywxMiBAQAogCQkJCQlyZXR1cm4gLTE7CiAJCQl9CiAJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBJSmF2YUVudGl0eS5jbGFzcykgeworCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKSB7CisJCQkJZGVmYXVsdCA6CisJCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfQogCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7CiAJfQogCkBAIC0yOTk0LDYgKzMwMDUsNiBAQAogCiAJLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCiAJcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZElkQ2xhc3NWYWx1ZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZywgVHlwZUxpdGVyYWw+KElEX0NMQVNTX0FEQVBURVIsIEpQQS5JRF9DTEFTU19fVkFMVUUsIGZhbHNlLCBTaW1wbGVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKKwkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihJRF9DTEFTU19BREFQVEVSLCBKUEEuSURfQ0xBU1NfX1ZBTFVFLCBmYWxzZSwgU2ltcGxlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9tYXBwaW5ncy9KYXZhRW50aXR5UHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvbWFwcGluZ3MvSmF2YUVudGl0eVByb3ZpZGVyLmphdmEKaW5kZXggZmUzNzk2ZC4uZmQ4Mzk4NiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9tYXBwaW5ncy9KYXZhRW50aXR5UHJvdmlkZXIuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL21hcHBpbmdzL0phdmFFbnRpdHlQcm92aWRlci5qYXZhCkBAIC05LDYgKzksNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSUpwYUZhY3Rvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSU1hcHBpbmdLZXlzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5JSmF2YVR5cGVNYXBwaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5JSmF2YVR5cGVNYXBwaW5nUHJvdmlkZXI7CkBAIC00Myw4ICs0NCw4IEBACiAJCXJldHVybiBJTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVk7CiAJfQogCi0JcHVibGljIElKYXZhVHlwZU1hcHBpbmcgYnVpbGRNYXBwaW5nKFR5cGUgdHlwZSkgewotCQlyZXR1cm4gSnBhSmF2YU1hcHBpbmdzRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSmF2YUVudGl0eSh0eXBlKTsKKwlwdWJsaWMgSUphdmFUeXBlTWFwcGluZyBidWlsZE1hcHBpbmcoVHlwZSB0eXBlLCBJSnBhRmFjdG9yeSBmYWN0b3J5KSB7CisJCXJldHVybiBmYWN0b3J5LmNyZWF0ZUphdmFFbnRpdHkodHlwZSk7CiAJfQogCiAJcHVibGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigpIHsKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvbWFwcGluZ3MvSmF2YUdlbmVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9tYXBwaW5ncy9KYXZhR2VuZXJhdG9yLmphdmEKaW5kZXggODA2NmU1My4uMjVjNTNhYyAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9tYXBwaW5ncy9KYXZhR2VuZXJhdG9yLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9tYXBwaW5ncy9KYXZhR2VuZXJhdG9yLmphdmEKQEAgLTEzLDcgKzEzLDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk51bWJlckxpdGVyYWw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSVRleHRSYW5nZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEuSmF2YUVPYmplY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuamR0dXRpbGl0eS5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CkBAIC01NjUsNiArNTY0LDYgQEAKIAl9CiAKIAlwcm90ZWN0ZWQgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGROdW1iZXJBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIsIFN0cmluZyBlbGVtZW50TmFtZSkgewotCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmcsIE51bWJlckxpdGVyYWw+KGFubm90YXRpb25BZGFwdGVyLCBlbGVtZW50TmFtZSwgTnVtYmVyU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKKwkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihhbm5vdGF0aW9uQWRhcHRlciwgZWxlbWVudE5hbWUsIE51bWJlclN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7CiAJfQogfSAvLyBKYXZhR2VuZXJhdG9yCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL21hcHBpbmdzL0phdmFJZC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9tYXBwaW5ncy9KYXZhSWQuamF2YQppbmRleCBmMGI3ZTRlLi41NmU3MzJkIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL21hcHBpbmdzL0phdmFJZC5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvbWFwcGluZ3MvSmF2YUlkLmphdmEKQEAgLTQ3LDcgKzQ3LDcgQEAKICAqIEBtb2RlbCBraW5kPSJjbGFzcyIKICAqIEBnZW5lcmF0ZWQKICAqLwotcHVibGljIGNsYXNzIEphdmFJZCBleHRlbmRzIEphdmFBdHRyaWJ1dGVNYXBwaW5nIGltcGxlbWVudHMgSUlkCitwdWJsaWMgY2xhc3MgSmF2YUlkIGV4dGVuZHMgSmF2YUF0dHJpYnV0ZU1hcHBpbmcgaW1wbGVtZW50cyBJSmF2YUlkCiB7CiAJcHJpdmF0ZSBBbm5vdGF0aW9uQWRhcHRlciBnZW5lcmF0ZWRWYWx1ZUFubm90YXRpb25BZGFwdGVyOwogCkBAIC01ODgsNiArNTg4LDEyIEBACiAJCQkJCXJldHVybiAtMTsKIAkJCX0KIAkJfQorCQlpZiAoYmFzZUNsYXNzID09IElKYXZhSWQuY2xhc3MpIHsKKwkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkgeworCQkJCWRlZmF1bHQgOgorCQkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0KIAkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwogCX0KIApAQCAtNjIwLDYgKzYyNiwxMiBAQAogCQkJCQlyZXR1cm4gLTE7CiAJCQl9CiAJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBJSmF2YUlkLmNsYXNzKSB7CisJCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpIHsKKwkJCQlkZWZhdWx0IDoKKwkJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9CiAJCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvbWFwcGluZ3MvSmF2YUlkUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvbWFwcGluZ3MvSmF2YUlkUHJvdmlkZXIuamF2YQppbmRleCA3Yjc3NTc4Li4yZmNhYTEyIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL21hcHBpbmdzL0phdmFJZFByb3ZpZGVyLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9tYXBwaW5ncy9KYXZhSWRQcm92aWRlci5qYXZhCkBAIC05LDEyICs5LDEyIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3M7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JSnBhRmFjdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JTWFwcGluZ0tleXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLklKYXZhQXR0cmlidXRlTWFwcGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEuSUphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuamR0dXRpbGl0eS5BdHRyaWJ1dGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuamR0dXRpbGl0eS5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnBsYXRmb3JtLkRlZmF1bHRzQ29udGV4dDsKIAogLyoqCiAgKiAKQEAgLTQ0LDEyICs0NCw4IEBACiAJCXJldHVybiBJTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZOwogCX0KIAkKLQlwdWJsaWMgYm9vbGVhbiBkZWZhdWx0QXBwbGllcyhBdHRyaWJ1dGUgYXR0cmlidXRlLCBEZWZhdWx0c0NvbnRleHQgZGVmYXVsdHNDb250ZXh0KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgSUphdmFBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkTWFwcGluZyhBdHRyaWJ1dGUgYXR0cmlidXRlKSB7Ci0JCXJldHVybiBKcGFKYXZhTWFwcGluZ3NGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVKYXZhSWQoYXR0cmlidXRlKTsKKwlwdWJsaWMgSUphdmFBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkTWFwcGluZyhBdHRyaWJ1dGUgYXR0cmlidXRlLCBJSnBhRmFjdG9yeSBmYWN0b3J5KSB7CisJCXJldHVybiBmYWN0b3J5LmNyZWF0ZUphdmFJZChhdHRyaWJ1dGUpOwogCX0KIAogCXB1YmxpYyBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoKSB7CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL21hcHBpbmdzL0phdmFNYW55VG9NYW55LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL21hcHBpbmdzL0phdmFNYW55VG9NYW55LmphdmEKaW5kZXggMjhmNWExZS4uYWMwMTZkZCAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9tYXBwaW5ncy9KYXZhTWFueVRvTWFueS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvbWFwcGluZ3MvSmF2YU1hbnlUb01hbnkuamF2YQpAQCAtMTYsNyArMTYsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHkuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qZHR1dGlsaXR5LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHkuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JTWFueVRvTWFueTsKIAogLyoqCiAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtMjksNyArMjgsNyBAQAogICogQGdlbmVyYXRlZAogICovCiBwdWJsaWMgY2xhc3MgSmF2YU1hbnlUb01hbnkgZXh0ZW5kcyBKYXZhTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nCi0JaW1wbGVtZW50cyBJTWFueVRvTWFueQorCWltcGxlbWVudHMgSUphdmFNYW55VG9NYW55CiB7CiAJcHVibGljIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEpQQS5NQU5ZX1RPX01BTlkpOwogCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL21hcHBpbmdzL0phdmFNYW55VG9NYW55UHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvbWFwcGluZ3MvSmF2YU1hbnlUb01hbnlQcm92aWRlci5qYXZhCmluZGV4IDc4M2Y1NGUuLjNkNzc5MzcgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvbWFwcGluZ3MvSmF2YU1hbnlUb01hbnlQcm92aWRlci5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvbWFwcGluZ3MvSmF2YU1hbnlUb01hbnlQcm92aWRlci5qYXZhCkBAIC05LDEyICs5LDEyIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3M7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JSnBhRmFjdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JTWFwcGluZ0tleXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLklKYXZhQXR0cmlidXRlTWFwcGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEuSUphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuamR0dXRpbGl0eS5BdHRyaWJ1dGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuamR0dXRpbGl0eS5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnBsYXRmb3JtLkRlZmF1bHRzQ29udGV4dDsKIAogLyoqCiAgKiAKQEAgLTQzLDEzICs0Myw5IEBACiAJcHVibGljIFN0cmluZyBrZXkoKSB7CiAJCXJldHVybiBJTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKIAl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZGVmYXVsdEFwcGxpZXMoQXR0cmlidXRlIGF0dHJpYnV0ZSwgRGVmYXVsdHNDb250ZXh0IGRlZmF1bHRzQ29udGV4dCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQogCi0JcHVibGljIElKYXZhQXR0cmlidXRlTWFwcGluZyBidWlsZE1hcHBpbmcoQXR0cmlidXRlIGF0dHJpYnV0ZSkgewotCQlyZXR1cm4gSnBhSmF2YU1hcHBpbmdzRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSmF2YU1hbnlUb01hbnkoYXR0cmlidXRlKTsKKwlwdWJsaWMgSUphdmFBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkTWFwcGluZyhBdHRyaWJ1dGUgYXR0cmlidXRlLCBJSnBhRmFjdG9yeSBmYWN0b3J5KSB7CisJCXJldHVybiBmYWN0b3J5LmNyZWF0ZUphdmFNYW55VG9NYW55KGF0dHJpYnV0ZSk7CiAJfQogCiAJcHVibGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigpIHsKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvbWFwcGluZ3MvSmF2YU1hbnlUb09uZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9tYXBwaW5ncy9KYXZhTWFueVRvT25lLmphdmEKaW5kZXggZTU0YmYzZi4uNWJhNWU5ZSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9tYXBwaW5ncy9KYXZhTWFueVRvT25lLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9tYXBwaW5ncy9KYXZhTWFueVRvT25lLmphdmEKQEAgLTE1LDcgKzE1LDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qZHR1dGlsaXR5LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuamR0dXRpbGl0eS5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qZHR1dGlsaXR5LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSU1hbnlUb09uZTsKIAogLyoqCiAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtMjgsNyArMjcsNyBAQAogICogQGdlbmVyYXRlZAogICovCiBwdWJsaWMgY2xhc3MgSmF2YU1hbnlUb09uZSBleHRlbmRzIEphdmFTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nCi0JaW1wbGVtZW50cyBJTWFueVRvT25lCisJaW1wbGVtZW50cyBJSmF2YU1hbnlUb09uZQogewogCXB1YmxpYyBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihKUEEuTUFOWV9UT19PTkUpOwogCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL21hcHBpbmdzL0phdmFNYW55VG9PbmVQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9tYXBwaW5ncy9KYXZhTWFueVRvT25lUHJvdmlkZXIuamF2YQppbmRleCA1MmUwYWI0Li45ZDlhZjNlIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL21hcHBpbmdzL0phdmFNYW55VG9PbmVQcm92aWRlci5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvbWFwcGluZ3MvSmF2YU1hbnlUb09uZVByb3ZpZGVyLmphdmEKQEAgLTksMTIgKzksMTIgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5nczsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklKcGFGYWN0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklNYXBwaW5nS2V5czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEuSUphdmFBdHRyaWJ1dGVNYXBwaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5JSmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qZHR1dGlsaXR5LkF0dHJpYnV0ZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qZHR1dGlsaXR5LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucGxhdGZvcm0uRGVmYXVsdHNDb250ZXh0OwogCiAvKioKICAqIApAQCAtNDMsMTMgKzQzLDkgQEAKIAlwdWJsaWMgU3RyaW5nIGtleSgpIHsKIAkJcmV0dXJuIElNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVk7CiAJfQotCQotCXB1YmxpYyBib29sZWFuIGRlZmF1bHRBcHBsaWVzKEF0dHJpYnV0ZSBhdHRyaWJ1dGUsIERlZmF1bHRzQ29udGV4dCBkZWZhdWx0c0NvbnRleHQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KIAotCXB1YmxpYyBJSmF2YUF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRNYXBwaW5nKEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKLQkJcmV0dXJuIEpwYUphdmFNYXBwaW5nc0ZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUphdmFNYW55VG9PbmUoYXR0cmlidXRlKTsKKwlwdWJsaWMgSUphdmFBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkTWFwcGluZyhBdHRyaWJ1dGUgYXR0cmlidXRlLCBJSnBhRmFjdG9yeSBmYWN0b3J5KSB7CisJCXJldHVybiBmYWN0b3J5LmNyZWF0ZUphdmFNYW55VG9PbmUoYXR0cmlidXRlKTsKIAl9CiAKIAlwdWJsaWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCkgewpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9tYXBwaW5ncy9KYXZhTWFwcGVkU3VwZXJjbGFzcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9tYXBwaW5ncy9KYXZhTWFwcGVkU3VwZXJjbGFzcy5qYXZhCmluZGV4IGVjNTA1YjIuLjg2YjRhZDcgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvbWFwcGluZ3MvSmF2YU1hcHBlZFN1cGVyY2xhc3MuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL21hcHBpbmdzL0phdmFNYXBwZWRTdXBlcmNsYXNzLmphdmEKQEAgLTE0LDcgKzE0LDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGVMaXRlcmFsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklNYXBwaW5nS2V5czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JUGVyc2lzdGVudEF0dHJpYnV0ZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qZHR1dGlsaXR5LkFubm90YXRpb25BZGFwdGVyOwpAQCAtNDMsNyArNDIsNyBAQAogICogQGdlbmVyYXRlZAogICovCiBwdWJsaWMgY2xhc3MgSmF2YU1hcHBlZFN1cGVyY2xhc3MgZXh0ZW5kcyBKYXZhVHlwZU1hcHBpbmcKLQlpbXBsZW1lbnRzIElNYXBwZWRTdXBlcmNsYXNzCisJaW1wbGVtZW50cyBJSmF2YU1hcHBlZFN1cGVyY2xhc3MKIHsKIAkvKioKIAkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWRDbGFzcygpIDxlbT5JZCBDbGFzczwvZW0+fScgYXR0cmlidXRlLgpAQCAtMjMwLDYgKzIyOSwxMiBAQAogCQkJCQlyZXR1cm4gLTE7CiAJCQl9CiAJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBJSmF2YU1hcHBlZFN1cGVyY2xhc3MuY2xhc3MpIHsKKwkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkgeworCQkJCWRlZmF1bHQgOgorCQkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0KIAkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwogCX0KIApAQCAtMjQ4LDYgKzI1MywxMiBAQAogCQkJCQlyZXR1cm4gLTE7CiAJCQl9CiAJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBJSmF2YU1hcHBlZFN1cGVyY2xhc3MuY2xhc3MpIHsKKwkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkgeworCQkJCWRlZmF1bHQgOgorCQkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0KIAkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwogCX0KIApAQCAtMzI1LDYgKzMzNiw2IEBACiAKIAkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKIAlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkSWRDbGFzc1ZhbHVlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nLCBUeXBlTGl0ZXJhbD4oSURfQ0xBU1NfQURBUFRFUiwgSlBBLklEX0NMQVNTX19WQUxVRSwgZmFsc2UsIFNpbXBsZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOworCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KElEX0NMQVNTX0FEQVBURVIsIEpQQS5JRF9DTEFTU19fVkFMVUUsIGZhbHNlLCBTaW1wbGVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL21hcHBpbmdzL0phdmFNYXBwZWRTdXBlcmNsYXNzUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvbWFwcGluZ3MvSmF2YU1hcHBlZFN1cGVyY2xhc3NQcm92aWRlci5qYXZhCmluZGV4IGIxNDlmY2EuLmMxNWZiNzEgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvbWFwcGluZ3MvSmF2YU1hcHBlZFN1cGVyY2xhc3NQcm92aWRlci5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvbWFwcGluZ3MvSmF2YU1hcHBlZFN1cGVyY2xhc3NQcm92aWRlci5qYXZhCkBAIC05LDYgKzksNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSUpwYUZhY3Rvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSU1hcHBpbmdLZXlzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5JSmF2YVR5cGVNYXBwaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5JSmF2YVR5cGVNYXBwaW5nUHJvdmlkZXI7CkBAIC00Myw4ICs0NCw4IEBACiAJCXJldHVybiBJTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWTsKIAl9CiAKLQlwdWJsaWMgSUphdmFUeXBlTWFwcGluZyBidWlsZE1hcHBpbmcoVHlwZSB0eXBlKSB7Ci0JCXJldHVybiBKcGFKYXZhTWFwcGluZ3NGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVKYXZhTWFwcGVkU3VwZXJjbGFzcyh0eXBlKTsKKwlwdWJsaWMgSUphdmFUeXBlTWFwcGluZyBidWlsZE1hcHBpbmcoVHlwZSB0eXBlLCBJSnBhRmFjdG9yeSBmYWN0b3J5KSB7CisJCXJldHVybiBmYWN0b3J5LmNyZWF0ZUphdmFNYXBwZWRTdXBlcmNsYXNzKHR5cGUpOwogCX0KIAogCXB1YmxpYyBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoKSB7CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL21hcHBpbmdzL0phdmFNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvbWFwcGluZ3MvSmF2YU11bHRpUmVsYXRpb25zaGlwTWFwcGluZy5qYXZhCmluZGV4IDUxZTkzYTguLjlhYjIyZGIgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvbWFwcGluZ3MvSmF2YU11bHRpUmVsYXRpb25zaGlwTWFwcGluZy5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvbWFwcGluZ3MvSmF2YU11bHRpUmVsYXRpb25zaGlwTWFwcGluZy5qYXZhCkBAIC0xNSw5ICsxNSw5IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlNpZ25hdHVyZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JVHlwZUJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSVRleHRSYW5nZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JVHlwZU1hcHBpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuamR0dXRpbGl0eS5Bbm5vdGF0aW9uQWRhcHRlcjsKQEAgLTc4NSwxOCArNzg1LDE4IEBACiAJICogYW5vdGhlciBjb250YWluZXIgb3IgYW4gYXJyYXkgb3IgYSBwcmltaXRpdmUgb3Igb3RoZXIgQmFzaWMgdHlwZSkKIAkgKi8KIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGphdmFEZWZhdWx0VGFyZ2V0RW50aXR5KFN0cmluZyBzaWduYXR1cmUpIHsKLQkJU3RyaW5nIHR5cGVOYW1lID0gc3VwZXIuamF2YURlZmF1bHRUYXJnZXRFbnRpdHkoc2lnbmF0dXJlKTsKLQkJcmV0dXJuIHR5cGVOYW1lZElzQ29udGFpbmVyKHR5cGVOYW1lKSA/IHRoaXMuamF2YURlZmF1bHRUYXJnZXRFbnRpdHlGcm9tQ29udGFpbmVyKHNpZ25hdHVyZSkgOiBudWxsOworCXByb3RlY3RlZCBTdHJpbmcgamF2YURlZmF1bHRUYXJnZXRFbnRpdHkoSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nKSB7CisJCVN0cmluZyB0eXBlTmFtZSA9IHN1cGVyLmphdmFEZWZhdWx0VGFyZ2V0RW50aXR5KHR5cGVCaW5kaW5nKTsKKwkJcmV0dXJuIHR5cGVOYW1lZElzQ29udGFpbmVyKHR5cGVOYW1lKSA/IGphdmFEZWZhdWx0VGFyZ2V0RW50aXR5RnJvbUNvbnRhaW5lcih0eXBlQmluZGluZykgOiBudWxsOwogCX0KIAotCXByb3RlY3RlZCBTdHJpbmcgamF2YURlZmF1bHRUYXJnZXRFbnRpdHlGcm9tQ29udGFpbmVyKFN0cmluZyBzaWduYXR1cmUpIHsKLQkJU3RyaW5nW10gcGFybVNpZ25hdHVyZXMgPSBTaWduYXR1cmUuZ2V0VHlwZUFyZ3VtZW50cyhzaWduYXR1cmUpOwotCQlpZiAoKHBhcm1TaWduYXR1cmVzID09IG51bGwpIHx8IChwYXJtU2lnbmF0dXJlcy5sZW5ndGggIT0gMSkpIHsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBqYXZhRGVmYXVsdFRhcmdldEVudGl0eUZyb21Db250YWluZXIoSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nKSB7CisJCUlUeXBlQmluZGluZ1tdIHR5cGVBcmd1bWVudHMgPSB0eXBlQmluZGluZy5nZXRUeXBlQXJndW1lbnRzKCk7CisJCWlmICh0eXBlQXJndW1lbnRzLmxlbmd0aCAhPSAxKSB7CiAJCQlyZXR1cm4gbnVsbDsKIAkJfQotCQlTdHJpbmcgZWxlbWVudFNpZ25hdHVyZSA9IHBhcm1TaWduYXR1cmVzWzBdOwotCQlTdHJpbmcgZWxlbWVudFR5cGVOYW1lID0gYnVpbGRSZWZlcmVuY2VFbnRpdHlUeXBlTmFtZShlbGVtZW50U2lnbmF0dXJlLCBqZHRUeXBlKCkpOworCQlJVHlwZUJpbmRpbmcgZWxlbWVudFR5cGVCaW5kaW5nID0gdHlwZUFyZ3VtZW50c1swXTsKKwkJU3RyaW5nIGVsZW1lbnRUeXBlTmFtZSA9IGJ1aWxkUmVmZXJlbmNlRW50aXR5VHlwZU5hbWUoZWxlbWVudFR5cGVCaW5kaW5nKTsKIAkJcmV0dXJuIHR5cGVOYW1lZElzQ29udGFpbmVyKGVsZW1lbnRUeXBlTmFtZSkgPyBudWxsIDogZWxlbWVudFR5cGVOYW1lOwogCX0KIApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9tYXBwaW5ncy9KYXZhTmFtZWRDb2x1bW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvbWFwcGluZ3MvSmF2YU5hbWVkQ29sdW1uLmphdmEKaW5kZXggNjFiN2RhNi4uMzcwMjM2MCAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9tYXBwaW5ncy9KYXZhTmFtZWRDb2x1bW4uamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL21hcHBpbmdzL0phdmFOYW1lZENvbHVtbi5qYXZhCkBAIC0xMyw5ICsxMyw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkJvb2xlYW5MaXRlcmFsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk51bWJlckxpdGVyYWw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSVRleHRSYW5nZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEuSmF2YUVPYmplY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuamR0dXRpbGl0eS5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CkBAIC0xNTIsMTEgKzE1MCwxMSBAQAogCX0KIAogCXByb3RlY3RlZCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkQm9vbGVhbkVsZW1lbnRBZGFwdGVyKFN0cmluZyBlbGVtZW50TmFtZSkgewotCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmcsIEJvb2xlYW5MaXRlcmFsPih0aGlzLmRhYSwgZWxlbWVudE5hbWUsIEJvb2xlYW5TdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOworCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuZGFhLCBlbGVtZW50TmFtZSwgQm9vbGVhblN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7CiAJfQogCiAJcHJvdGVjdGVkIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRJbnRFbGVtZW50QWRhcHRlcihTdHJpbmcgZWxlbWVudE5hbWUpIHsKLQkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nLCBOdW1iZXJMaXRlcmFsPih0aGlzLmRhYSwgZWxlbWVudE5hbWUsIE51bWJlclN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7CisJCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5kYWEsIGVsZW1lbnROYW1lLCBOdW1iZXJTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwogCX0KIAogCXByb3RlY3RlZCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZFNob3J0Q2lyY3VpdEVsZW1lbnRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSkgewpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9tYXBwaW5ncy9KYXZhTnVsbEF0dHJpYnV0ZU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvbWFwcGluZ3MvSmF2YU51bGxBdHRyaWJ1dGVNYXBwaW5nLmphdmEKaW5kZXggYjk1NTJjNy4uN2FlZDUxZiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9tYXBwaW5ncy9KYXZhTnVsbEF0dHJpYnV0ZU1hcHBpbmcuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL21hcHBpbmdzL0phdmFOdWxsQXR0cmlidXRlTWFwcGluZy5qYXZhCkBAIC0zMiw3ICszMiw3IEBACiAJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVXNlIEphdmFOdWxsQXR0cmlidXRlTWFwcGluZyhBdHRyaWJ1dGUpIGluc3RlYWQiKTsKIAl9CiAKLQlwcm90ZWN0ZWQgSmF2YU51bGxBdHRyaWJ1dGVNYXBwaW5nKEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKKwlwdWJsaWMgSmF2YU51bGxBdHRyaWJ1dGVNYXBwaW5nKEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKIAkJc3VwZXIoYXR0cmlidXRlKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvbWFwcGluZ3MvSmF2YU51bGxBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvbWFwcGluZ3MvSmF2YU51bGxBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIuamF2YQppbmRleCAwYzM1YjVmLi4zN2Q4ZDI0IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL21hcHBpbmdzL0phdmFOdWxsQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9tYXBwaW5ncy9KYXZhTnVsbEF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlci5qYXZhCkBAIC05LDExICs5LDExIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3M7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JSnBhRmFjdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEuSUphdmFBdHRyaWJ1dGVNYXBwaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5JSmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qZHR1dGlsaXR5LkF0dHJpYnV0ZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qZHR1dGlsaXR5LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucGxhdGZvcm0uRGVmYXVsdHNDb250ZXh0OwogCiAvKioKICAqIFRoaXMgbWFwcGluZyBwcm92aWRlciBpbXBsZW1lbnRhdGlvbiBpcyB1c2VkIHRvIGNyZWF0ZSBhIEphdmFOdWxsQXR0cmlidXRlTWFwcGluZy4KQEAgLTQ0LDEyICs0NCwxMiBAQAogCXB1YmxpYyBTdHJpbmcga2V5KCkgewogCQlyZXR1cm4gbnVsbDsKIAl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZGVmYXVsdEFwcGxpZXMoQXR0cmlidXRlIGF0dHJpYnV0ZSwgRGVmYXVsdHNDb250ZXh0IGRlZmF1bHRzQ29udGV4dCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQogCi0JcHVibGljIElKYXZhQXR0cmlidXRlTWFwcGluZyBidWlsZE1hcHBpbmcoQXR0cmlidXRlIGF0dHJpYnV0ZSkgeworCS8vRG8gbm90IHVzZSB0aGUgSUpwYUZhY3RvcnkgZm9yIGJ1aWxkaW5nIHRoaXMgbWFwcGluZywgc2VlIGNvbnN0cnVjdG9yIGZvciBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZQorCS8vd2hlcmUgd2UgZG8gbm8gaGF2ZSBhY2Nlc3MgdG8gdGhlIGZhY3RvcnkgZHVyaW5nIGNvbnN0cnV0aW9uLiAgVGhpcyBpcyBub3QgYSBtYXBwaW5nIHRoYXQKKwkvL25lZWRzIHRvIGJlIGV4dGVuc2libGUsIGJ1dCBpdCBpcyBlYXNpZXIgdG8gaGF2ZSBhIG1hcHBpbmdQcm92aWRlciBmb3IgaXQgc28gd2UgZG9uJ3QgaGF2ZSAKKwkvL3RvIGhhbmRsZSBudWxsIHByb3ZpZGVyIHNlcGFyYXRlbHkKKwlwdWJsaWMgSUphdmFBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkTWFwcGluZyhBdHRyaWJ1dGUgYXR0cmlidXRlLCBJSnBhRmFjdG9yeSBmYWN0b3J5KSB7CiAJCXJldHVybiBKcGFKYXZhTWFwcGluZ3NGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVKYXZhTnVsbEF0dHJpYnV0ZU1hcHBpbmcoYXR0cmlidXRlKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvbWFwcGluZ3MvSmF2YU51bGxUeXBlTWFwcGluZ1Byb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL21hcHBpbmdzL0phdmFOdWxsVHlwZU1hcHBpbmdQcm92aWRlci5qYXZhCmluZGV4IDNlMTJhOTYuLmFjN2E5ZWIgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvbWFwcGluZ3MvSmF2YU51bGxUeXBlTWFwcGluZ1Byb3ZpZGVyLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9tYXBwaW5ncy9KYXZhTnVsbFR5cGVNYXBwaW5nUHJvdmlkZXIuamF2YQpAQCAtOSw2ICs5LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5nczsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklKcGFGYWN0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5JSmF2YVR5cGVNYXBwaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5JSmF2YVR5cGVNYXBwaW5nUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuamR0dXRpbGl0eS5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwpAQCAtNDQsNyArNDUsNyBAQAogCQlyZXR1cm4gbnVsbDsKIAl9CiAKLQlwdWJsaWMgSUphdmFUeXBlTWFwcGluZyBidWlsZE1hcHBpbmcoVHlwZSB0eXBlKSB7CisJcHVibGljIElKYXZhVHlwZU1hcHBpbmcgYnVpbGRNYXBwaW5nKFR5cGUgdHlwZSwgSUpwYUZhY3RvcnkgZmFjdG9yeSkgewogCQlyZXR1cm4gSnBhSmF2YU1hcHBpbmdzRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSmF2YU51bGxUeXBlTWFwcGluZyh0eXBlKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvbWFwcGluZ3MvSmF2YU9uZVRvTWFueS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9tYXBwaW5ncy9KYXZhT25lVG9NYW55LmphdmEKaW5kZXggODMzNTljYS4uYWEzN2Q5NiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9tYXBwaW5ncy9KYXZhT25lVG9NYW55LmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9tYXBwaW5ncy9KYXZhT25lVG9NYW55LmphdmEKQEAgLTE2LDcgKzE2LDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qZHR1dGlsaXR5LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuamR0dXRpbGl0eS5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qZHR1dGlsaXR5LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSU9uZVRvTWFueTsKIAogLyoqCiAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtMjksNyArMjgsNyBAQAogICogQGdlbmVyYXRlZAogICovCiBwdWJsaWMgY2xhc3MgSmF2YU9uZVRvTWFueSBleHRlbmRzIEphdmFNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcKLQlpbXBsZW1lbnRzIElPbmVUb01hbnkKKwlpbXBsZW1lbnRzIElKYXZhT25lVG9NYW55CiB7CiAJcHVibGljIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEpQQS5PTkVfVE9fTUFOWSk7CiAKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvbWFwcGluZ3MvSmF2YU9uZVRvTWFueVByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL21hcHBpbmdzL0phdmFPbmVUb01hbnlQcm92aWRlci5qYXZhCmluZGV4IGM4MTdjZTguLjdmMThkNzUgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvbWFwcGluZ3MvSmF2YU9uZVRvTWFueVByb3ZpZGVyLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9tYXBwaW5ncy9KYXZhT25lVG9NYW55UHJvdmlkZXIuamF2YQpAQCAtOSwxMiArOSwxMiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSUpwYUZhY3Rvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSU1hcHBpbmdLZXlzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5JSmF2YUF0dHJpYnV0ZU1hcHBpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLklKYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHkuQXR0cmlidXRlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHkuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5wbGF0Zm9ybS5EZWZhdWx0c0NvbnRleHQ7CiAKIC8qKgogICogCkBAIC00MywxMyArNDMsOSBAQAogCXB1YmxpYyBTdHJpbmcga2V5KCkgewogCQlyZXR1cm4gSU1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKIAl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZGVmYXVsdEFwcGxpZXMoQXR0cmlidXRlIGF0dHJpYnV0ZSwgRGVmYXVsdHNDb250ZXh0IGRlZmF1bHRzQ29udGV4dCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQogCi0JcHVibGljIElKYXZhQXR0cmlidXRlTWFwcGluZyBidWlsZE1hcHBpbmcoQXR0cmlidXRlIGF0dHJpYnV0ZSkgewotCQlyZXR1cm4gSnBhSmF2YU1hcHBpbmdzRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSmF2YU9uZVRvTWFueShhdHRyaWJ1dGUpOworCXB1YmxpYyBJSmF2YUF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRNYXBwaW5nKEF0dHJpYnV0ZSBhdHRyaWJ1dGUsIElKcGFGYWN0b3J5IGZhY3RvcnkpIHsKKwkJcmV0dXJuIGZhY3RvcnkuY3JlYXRlSmF2YU9uZVRvTWFueShhdHRyaWJ1dGUpOwogCX0KIAogCXB1YmxpYyBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoKSB7CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL21hcHBpbmdzL0phdmFPbmVUb09uZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9tYXBwaW5ncy9KYXZhT25lVG9PbmUuamF2YQppbmRleCA3YzIxZjZkLi5hOTE2MzVjIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL21hcHBpbmdzL0phdmFPbmVUb09uZS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvbWFwcGluZ3MvSmF2YU9uZVRvT25lLmphdmEKQEAgLTM4LDcgKzM4LDcgQEAKICAqIEBnZW5lcmF0ZWQKICAqLwogcHVibGljIGNsYXNzIEphdmFPbmVUb09uZSBleHRlbmRzIEphdmFTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nCi0JaW1wbGVtZW50cyBJT25lVG9PbmUKKwlpbXBsZW1lbnRzIElKYXZhT25lVG9PbmUKIHsKIAkvKioKIAkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFwcGVkQnkoKSA8ZW0+TWFwcGVkIEJ5PC9lbT59JyBhdHRyaWJ1dGUuCkBAIC0yNTIsNiArMjUyLDEyIEBACiAJCQkJCXJldHVybiAtMTsKIAkJCX0KIAkJfQorCQlpZiAoYmFzZUNsYXNzID09IElKYXZhT25lVG9PbmUuY2xhc3MpIHsKKwkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkgeworCQkJCWRlZmF1bHQgOgorCQkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0KIAkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwogCX0KIApAQCAtMjc2LDYgKzI4MiwxMiBAQAogCQkJCQlyZXR1cm4gLTE7CiAJCQl9CiAJCX0KKwkJaWYgKGJhc2VDbGFzcyA9PSBJSmF2YU9uZVRvT25lLmNsYXNzKSB7CisJCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpIHsKKwkJCQlkZWZhdWx0IDoKKwkJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9CiAJCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvbWFwcGluZ3MvSmF2YU9uZVRvT25lUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvbWFwcGluZ3MvSmF2YU9uZVRvT25lUHJvdmlkZXIuamF2YQppbmRleCBlNmRkYmQ3Li5kNmMyNGEzIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL21hcHBpbmdzL0phdmFPbmVUb09uZVByb3ZpZGVyLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9tYXBwaW5ncy9KYXZhT25lVG9PbmVQcm92aWRlci5qYXZhCkBAIC05LDEyICs5LDEyIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3M7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JSnBhRmFjdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JTWFwcGluZ0tleXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLklKYXZhQXR0cmlidXRlTWFwcGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEuSUphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuamR0dXRpbGl0eS5BdHRyaWJ1dGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuamR0dXRpbGl0eS5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnBsYXRmb3JtLkRlZmF1bHRzQ29udGV4dDsKIAogLyoqCiAgKiAKQEAgLTQ0LDEyICs0NCw4IEBACiAJCXJldHVybiBJTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVk7CiAJfQogCQotCXB1YmxpYyBib29sZWFuIGRlZmF1bHRBcHBsaWVzKEF0dHJpYnV0ZSBhdHRyaWJ1dGUsIERlZmF1bHRzQ29udGV4dCBkZWZhdWx0c0NvbnRleHQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBJSmF2YUF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRNYXBwaW5nKEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKLQkJcmV0dXJuIEpwYUphdmFNYXBwaW5nc0ZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUphdmFPbmVUb09uZShhdHRyaWJ1dGUpOworCXB1YmxpYyBJSmF2YUF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRNYXBwaW5nKEF0dHJpYnV0ZSBhdHRyaWJ1dGUsIElKcGFGYWN0b3J5IGZhY3RvcnkpIHsKKwkJcmV0dXJuIGZhY3RvcnkuY3JlYXRlSmF2YU9uZVRvT25lKGF0dHJpYnV0ZSk7CiAJfQogCiAJcHVibGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigpIHsKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvbWFwcGluZ3MvSmF2YVJlbGF0aW9uc2hpcE1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvbWFwcGluZ3MvSmF2YVJlbGF0aW9uc2hpcE1hcHBpbmcuamF2YQppbmRleCA5ZGVhY2ZmLi41M2ExNmIyIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL21hcHBpbmdzL0phdmFSZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9tYXBwaW5ncy9KYXZhUmVsYXRpb25zaGlwTWFwcGluZy5qYXZhCkBAIC0xNSwxMCArMTUsMTEgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuU2lnbmF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklUeXBlQmluZGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHlwZUxpdGVyYWw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSVBlcnNpc3RlbnRUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklUeXBlTWFwcGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qZHR1dGlsaXR5LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKQEAgLTI5LDcgKzMwLDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qZHR1dGlsaXR5LkVudW1BcnJheURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHkuRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHkuRXhwcmVzc2lvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qZHR1dGlsaXR5LkpEVFRvb2xzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHkuU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHkuU2ltcGxlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuamR0dXRpbGl0eS5TdHJpbmdFeHByZXNzaW9uQ29udmVydGVyOwpAQCAtNTQ5LDI1ICs1NDksNDYgQEAKIAkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwogCX0KIAotCXB1YmxpYyBTdHJpbmcgZnVsbHlRdWFsaWZpZWRUYXJnZXRFbnRpdHkoKSB7Ci0JCXJldHVybiAoZ2V0VGFyZ2V0RW50aXR5KCkgPT0gbnVsbCkgPyBudWxsIDogSkRUVG9vbHMucmVzb2x2ZShnZXRUYXJnZXRFbnRpdHkoKSwgdGhpcy5qZHRUeXBlKCkpOworCXB1YmxpYyBTdHJpbmcgZnVsbHlRdWFsaWZpZWRUYXJnZXRFbnRpdHkoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJaWYgKGdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpID09IG51bGwpIHsKKwkJCXJldHVybiBnZXREZWZhdWx0VGFyZ2V0RW50aXR5KCk7IC8vYWxyZWFkeSBmdWxseSBxdWFsaWZpZWQsIG9yIG51bGwgd2hpY2ggaXMgZmluZQorCQl9CisJCS8vbm90IHBvc2l0aXZlIHRoaXMgaXMgdGhlIHJpZ2h0IHdheSB0byBoYW5kbGUgdGhpcworCQlFeHByZXNzaW9uIGV4cHJlc3Npb24gPSB0aGlzLnRhcmdldEVudGl0eUFkYXB0ZXIuZXhwcmVzc2lvbihhc3RSb290KTsKKwkJaWYgKGV4cHJlc3Npb24uZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLlRZUEVfTElURVJBTCkgeworCQkJSVR5cGVCaW5kaW5nIHJlc29sdmVkVHlwZUJpbmRpbmcgPSAoKFR5cGVMaXRlcmFsKSBleHByZXNzaW9uKS5nZXRUeXBlKCkucmVzb2x2ZUJpbmRpbmcoKTsKKwkJCWlmIChyZXNvbHZlZFR5cGVCaW5kaW5nICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gcmVzb2x2ZWRUeXBlQmluZGluZy5nZXRRdWFsaWZpZWROYW1lKCk7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CiAJfQogCiAJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgdXBkYXRlRnJvbUphdmEoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKIAkJc3VwZXIudXBkYXRlRnJvbUphdmEoYXN0Um9vdCk7Ci0JCXNldERlZmF1bHRUYXJnZXRFbnRpdHkodGhpcy5qYXZhRGVmYXVsdFRhcmdldEVudGl0eSgpKTsKKwkJdXBkYXRlRGVmYXVsdFRhcmdldEVudGl0eUZyb21KYXZhKGFzdFJvb3QpOwogCQlzZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkodGhpcy50YXJnZXRFbnRpdHlBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpKTsKIAkJdGhpcy51cGRhdGVGZXRjaEZyb21KYXZhKGFzdFJvb3QpOwogCQlpZiAodGhpcy5jYXNjYWRlICE9IG51bGwpIHsKIAkJCSgoSmF2YUNhc2NhZGUpIHRoaXMuY2FzY2FkZSkudXBkYXRlRnJvbUphdmEoYXN0Um9vdCk7CiAJCX0KLQkJZWxzZSBpZiAoY2FzY2FkZUFkYXB0ZXIoKS5leHByZXNzaW9uKGdldEF0dHJpYnV0ZSgpLm1vZGlmaWVkRGVjbGFyYXRpb24oKSkgIT0gbnVsbCkgeworCQllbHNlIGlmIChjYXNjYWRlQWRhcHRlcigpLmV4cHJlc3Npb24oZ2V0QXR0cmlidXRlKCkubW9kaWZpZWREZWNsYXJhdGlvbihhc3RSb290KSkgIT0gbnVsbCkgewogCQkJc2V0Q2FzY2FkZShjcmVhdGVDYXNjYWRlKCkpOwogCQkJKChKYXZhQ2FzY2FkZSkgdGhpcy5jYXNjYWRlKS51cGRhdGVGcm9tSmF2YShhc3RSb290KTsKIAkJfQogCX0KIAorCXByaXZhdGUgdm9pZCB1cGRhdGVEZWZhdWx0VGFyZ2V0RW50aXR5RnJvbUphdmEoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gZ2V0QXR0cmlidXRlKCkudHlwZUJpbmRpbmcoYXN0Um9vdCk7CisJCWlmICh0eXBlQmluZGluZyAhPSBudWxsKSB7CisJCQlzZXREZWZhdWx0VGFyZ2V0RW50aXR5KGphdmFEZWZhdWx0VGFyZ2V0RW50aXR5KHR5cGVCaW5kaW5nKSk7CisJCX0KKwkJZWxzZSB7CisJCQlzZXREZWZhdWx0VGFyZ2V0RW50aXR5KG51bGwpOworCQl9CisJfQorCiAJLyoqCiAJICogZGVsZWdhdGUgdG8gc3ViY2xhc3NlcyBiZWNhdXNlIHRoZXJlIGFyZSBkaWZmZXJlbnQgJ2ZldGNoJwogCSAqIGRlZmF1bHRzIGFjcm9zcyB0aGUgc3ViY2xhc3NlcwpAQCAtNTc4LDIwICs1OTksMTYgQEAKIAkgKiB0aGUgZGVmYXVsdCAndGFyZ2V0RW50aXR5JyBpcyBjYWxjdWxhdGVkIGZyb20gdGhlIGF0dHJpYnV0ZSB0eXBlOwogCSAqIHJldHVybiBudWxsIGlmIHRoZSBhdHRyaWJ1dGUgdHlwZSBjYW5ub3QgcG9zc2libHkgYmUgYW4gZW50aXR5CiAJICovCi0JcHJvdGVjdGVkIFN0cmluZyBqYXZhRGVmYXVsdFRhcmdldEVudGl0eSgpIHsKLQkJcmV0dXJuIHRoaXMuamF2YURlZmF1bHRUYXJnZXRFbnRpdHkodGhpcy5nZXRBdHRyaWJ1dGUoKS50eXBlU2lnbmF0dXJlKCkpOworCXByb3RlY3RlZCBTdHJpbmcgamF2YURlZmF1bHRUYXJnZXRFbnRpdHkoSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nKSB7CisJCXJldHVybiBidWlsZFJlZmVyZW5jZUVudGl0eVR5cGVOYW1lKHR5cGVCaW5kaW5nKTsKIAl9CiAKLQlwcm90ZWN0ZWQgU3RyaW5nIGphdmFEZWZhdWx0VGFyZ2V0RW50aXR5KFN0cmluZyBzaWduYXR1cmUpIHsKLQkJcmV0dXJuIGJ1aWxkUmVmZXJlbmNlRW50aXR5VHlwZU5hbWUoc2lnbmF0dXJlLCBqZHRUeXBlKCkpOwotCX0KLQotCS8vIFRPRE8gRW1iZWRkYWJsZT8/PwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJ1aWxkUmVmZXJlbmNlRW50aXR5VHlwZU5hbWUoU3RyaW5nIHNpZ25hdHVyZSwgSVR5cGUgamR0VHlwZSkgewotCQlpZiAoU2lnbmF0dXJlLmdldEFycmF5Q291bnQoc2lnbmF0dXJlKSA+IDApIHsKLQkJCXJldHVybiBudWxsOyAvLyBhcnJheXMgY2Fubm90IGJlIGVudGl0aWVzCisJLy8JLy8gVE9ETyBFbWJlZGRhYmxlPz8/CisJcHVibGljIHN0YXRpYyBTdHJpbmcgYnVpbGRSZWZlcmVuY2VFbnRpdHlUeXBlTmFtZShJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcpIHsKKwkJaWYgKCF0eXBlQmluZGluZy5pc0FycmF5KCkpIHsgLy8gYXJyYXlzIGNhbm5vdCBiZSBlbnRpdGllcworCQkJcmV0dXJuIHR5cGVCaW5kaW5nLmdldFF1YWxpZmllZE5hbWUoKTsKIAkJfQotCQlyZXR1cm4gSkRUVG9vbHMucmVzb2x2ZShTaWduYXR1cmUudG9TdHJpbmcoc2lnbmF0dXJlKSwgamR0VHlwZSk7CisJCXJldHVybiBudWxsOwogCX0KIAogCXB1YmxpYyBJRW50aXR5IGdldEVudGl0eSgpIHsKQEAgLTYwNSw3ICs2MjIsNyBAQAogCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHJlZnJlc2hEZWZhdWx0cyhEZWZhdWx0c0NvbnRleHQgZGVmYXVsdHNDb250ZXh0KSB7CiAJCXN1cGVyLnJlZnJlc2hEZWZhdWx0cyhkZWZhdWx0c0NvbnRleHQpOwotCQlTdHJpbmcgdGFyZ2V0RW50aXR5TmFtZSA9IGZ1bGx5UXVhbGlmaWVkVGFyZ2V0RW50aXR5KCk7CisJCVN0cmluZyB0YXJnZXRFbnRpdHlOYW1lID0gZnVsbHlRdWFsaWZpZWRUYXJnZXRFbnRpdHkoZGVmYXVsdHNDb250ZXh0LmFzdFJvb3QoKSk7CiAJCWlmICh0YXJnZXRFbnRpdHlOYW1lICE9IG51bGwpIHsKIAkJCUlQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGRlZmF1bHRzQ29udGV4dC5wZXJzaXN0ZW50VHlwZSh0YXJnZXRFbnRpdHlOYW1lKTsKIAkJCWlmIChwZXJzaXN0ZW50VHlwZSAhPSBudWxsKSB7CkBAIC02NTQsOCArNjcxLDggQEAKIAkJcmV0dXJuIGJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGFubm90YXRpb25BZGFwdGVyLCBlbGVtZW50TmFtZSwgU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKIAl9CiAKLQlwcm90ZWN0ZWQgc3RhdGljIDxUIGV4dGVuZHMgRXhwcmVzc2lvbj4gRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyLCBTdHJpbmcgZWxlbWVudE5hbWUsIEV4cHJlc3Npb25Db252ZXJ0ZXI8U3RyaW5nLCBUPiBjb252ZXJ0ZXIpIHsKLQkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nLCBUPihhbm5vdGF0aW9uQWRhcHRlciwgZWxlbWVudE5hbWUsIGZhbHNlLCBjb252ZXJ0ZXIpOworCXByb3RlY3RlZCBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyLCBTdHJpbmcgZWxlbWVudE5hbWUsIEV4cHJlc3Npb25Db252ZXJ0ZXI8U3RyaW5nPiBjb252ZXJ0ZXIpIHsKKwkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihhbm5vdGF0aW9uQWRhcHRlciwgZWxlbWVudE5hbWUsIGZhbHNlLCBjb252ZXJ0ZXIpOwogCX0KIAogCXByb3RlY3RlZCBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZEVudW1Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlciwgU3RyaW5nIGVsZW1lbnROYW1lKSB7CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL21hcHBpbmdzL0phdmFTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL21hcHBpbmdzL0phdmFTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEKaW5kZXggNzNkZDc0Zi4uMGQzMjVjYiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9tYXBwaW5ncy9KYXZhU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvbWFwcGluZ3MvSmF2YVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcuamF2YQpAQCAtMSw4ICsxLDggQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KQEAgLTIwLDggKzIwLDggQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Cb29sZWFuTGl0ZXJhbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JVHlwZUJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuamR0dXRpbGl0eS5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuamR0dXRpbGl0eS5BdHRyaWJ1dGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuamR0dXRpbGl0eS5Cb29sZWFuU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlcjsKQEAgLTQ5LDggKzQ5LDYgQEAKIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKYXZhU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZwogCWV4dGVuZHMgSmF2YVJlbGF0aW9uc2hpcE1hcHBpbmcgaW1wbGVtZW50cyBJU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZwogewotCXByaXZhdGUgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gb3B0aW9uYWxBZGFwdGVyOwotCiAJLyoqCiAJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZldGNoKCkgPGVtPkZldGNoPC9lbT59JyBhdHRyaWJ1dGUuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTExMSw2ICsxMDksOCBAQAogCSAqLwogCXByb3RlY3RlZCBEZWZhdWx0VHJ1ZUJvb2xlYW4gb3B0aW9uYWwgPSBPUFRJT05BTF9FREVGQVVMVDsKIAorCXByaXZhdGUgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gb3B0aW9uYWxBZGFwdGVyOworCiAJcHJvdGVjdGVkIEphdmFTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nKCkgewogCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlVzZSBKYXZhU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZyhBdHRyaWJ1dGUpIGluc3RlYWQiKTsKIAl9CkBAIC02NDYsOCArNjQ2LDggQEAKIAkgKiBleHRlbmQgdG8gZWxpbWluYXRlIGFueSAiY29udGFpbmVyIiB0eXBlcwogCSAqLwogCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgamF2YURlZmF1bHRUYXJnZXRFbnRpdHkoKSB7Ci0JCVN0cmluZyB0eXBlTmFtZSA9IHN1cGVyLmphdmFEZWZhdWx0VGFyZ2V0RW50aXR5KCk7CisJcHJvdGVjdGVkIFN0cmluZyBqYXZhRGVmYXVsdFRhcmdldEVudGl0eShJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcpIHsKKwkJU3RyaW5nIHR5cGVOYW1lID0gc3VwZXIuamF2YURlZmF1bHRUYXJnZXRFbnRpdHkodHlwZUJpbmRpbmcpOwogCQkvLyBpZiB0aGUgYXR0cmlidXRlIGlzIGEgY29udGFpbmVyLCBkb24ndCB1c2UgaXQKIAkJcmV0dXJuIHR5cGVOYW1lZElzQ29udGFpbmVyKHR5cGVOYW1lKSA/IG51bGwgOiB0eXBlTmFtZTsKIAl9CkBAIC02ODEsNiArNjgxLDYgQEAKIAogCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgogCXByb3RlY3RlZCBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZE9wdGlvbmFsQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyLCBTdHJpbmcgZWxlbWVudE5hbWUpIHsKLQkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nLCBCb29sZWFuTGl0ZXJhbD4oYW5ub3RhdGlvbkFkYXB0ZXIsIGVsZW1lbnROYW1lLCBmYWxzZSwgQm9vbGVhblN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7CisJCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oYW5ub3RhdGlvbkFkYXB0ZXIsIGVsZW1lbnROYW1lLCBmYWxzZSwgQm9vbGVhblN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7CiAJfQogfSAvLyBKYXZhU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9tYXBwaW5ncy9KYXZhVHJhbnNpZW50LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL21hcHBpbmdzL0phdmFUcmFuc2llbnQuamF2YQppbmRleCBkYTljNjUwLi42MWM2YTE0IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL21hcHBpbmdzL0phdmFUcmFuc2llbnQuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL21hcHBpbmdzL0phdmFUcmFuc2llbnQuamF2YQpAQCAtMTQsNyArMTQsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHkuQXR0cmlidXRlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHkuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qZHR1dGlsaXR5LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSVRyYW5zaWVudDsKIAogLyoqCiAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtMjYsNyArMjUsOCBAQAogICogQG1vZGVsIGtpbmQ9ImNsYXNzIgogICogQGdlbmVyYXRlZAogICovCi1wdWJsaWMgY2xhc3MgSmF2YVRyYW5zaWVudCBleHRlbmRzIEphdmFBdHRyaWJ1dGVNYXBwaW5nIGltcGxlbWVudHMgSVRyYW5zaWVudAorcHVibGljIGNsYXNzIEphdmFUcmFuc2llbnQgZXh0ZW5kcyBKYXZhQXR0cmlidXRlTWFwcGluZworCWltcGxlbWVudHMgSUphdmFUcmFuc2llbnQKIHsKIAlwdWJsaWMgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoSlBBLlRSQU5TSUVOVCk7CiAKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvbWFwcGluZ3MvSmF2YVRyYW5zaWVudFByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL21hcHBpbmdzL0phdmFUcmFuc2llbnRQcm92aWRlci5qYXZhCmluZGV4IDc5YjdkZTguLjRlODg5YTQgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvbWFwcGluZ3MvSmF2YVRyYW5zaWVudFByb3ZpZGVyLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9tYXBwaW5ncy9KYXZhVHJhbnNpZW50UHJvdmlkZXIuamF2YQpAQCAtOSwxMiArOSwxMiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSUpwYUZhY3Rvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSU1hcHBpbmdLZXlzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5JSmF2YUF0dHJpYnV0ZU1hcHBpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLklKYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHkuQXR0cmlidXRlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHkuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5wbGF0Zm9ybS5EZWZhdWx0c0NvbnRleHQ7CiAKIC8qKgogICogCkBAIC00MywxMyArNDMsOSBAQAogCXB1YmxpYyBTdHJpbmcga2V5KCkgewogCQlyZXR1cm4gSU1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVk7CiAJfQotCQotCXB1YmxpYyBib29sZWFuIGRlZmF1bHRBcHBsaWVzKEF0dHJpYnV0ZSBhdHRyaWJ1dGUsIERlZmF1bHRzQ29udGV4dCBkZWZhdWx0c0NvbnRleHQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KIAotCXB1YmxpYyBJSmF2YUF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRNYXBwaW5nKEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKLQkJcmV0dXJuIEpwYUphdmFNYXBwaW5nc0ZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUphdmFUcmFuc2llbnQoYXR0cmlidXRlKTsKKwlwdWJsaWMgSUphdmFBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkTWFwcGluZyhBdHRyaWJ1dGUgYXR0cmlidXRlLCBJSnBhRmFjdG9yeSBmYWN0b3J5KSB7CisJCXJldHVybiBmYWN0b3J5LmNyZWF0ZUphdmFUcmFuc2llbnQoYXR0cmlidXRlKTsKIAl9CiAKIAlwdWJsaWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCkgewpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9tYXBwaW5ncy9KYXZhVHlwZU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvbWFwcGluZ3MvSmF2YVR5cGVNYXBwaW5nLmphdmEKaW5kZXggZWQyYWU0OC4uOWI2MjE2NSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9tYXBwaW5ncy9KYXZhVHlwZU1hcHBpbmcuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL21hcHBpbmdzL0phdmFUeXBlTWFwcGluZy5qYXZhCkBAIC0xMDEsMTggKzEwMSw2IEBACiAJCXJldHVybiB0aGlzLmdldFR5cGUoKS5nZXROYW1lKCk7CiAJfQogCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kCi0JCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQogCXB1YmxpYyBJUGVyc2lzdGVudFR5cGUgZ2V0UGVyc2lzdGVudFR5cGUoKSB7CiAJCXJldHVybiAoSVBlcnNpc3RlbnRUeXBlKSB0aGlzLmVDb250YWluZXIoKTsKIAl9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL21hcHBpbmdzL0phdmFVbmlxdWVDb25zdHJhaW50LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL21hcHBpbmdzL0phdmFVbmlxdWVDb25zdHJhaW50LmphdmEKaW5kZXggMmU4MTY1Zi4uNTFlYzZlZSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9tYXBwaW5ncy9KYXZhVW5pcXVlQ29uc3RyYWludC5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvbWFwcGluZ3MvSmF2YVVuaXF1ZUNvbnN0cmFpbnQuamF2YQpAQCAtMTYsMTEgKzE2LDExIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FRGF0YVR5cGVFTGlzdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQXJyYXlJbml0aWFsaXplcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklUZXh0UmFuZ2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLkphdmFFT2JqZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHkuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHkuQW5ub3RhdGlvblN0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qZHR1dGlsaXR5LkNvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qZHR1dGlsaXR5LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuamR0dXRpbGl0eS5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKQEAgLTMyLDcgKzMyLDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qZHR1dGlsaXR5Lk5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHkuU2hvcnRDaXJjdWl0QXJyYXlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuamR0dXRpbGl0eS5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHkuU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklVbmlxdWVDb25zdHJhaW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLkpwYUNvcmVNYXBwaW5nc1BhY2thZ2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwpAQCAtOTcsMTEgKzk2LDExIEBACiAJfQogCiAJcHJvdGVjdGVkIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYnVpbGRBcnJheUFubm90YXRpb25FbGVtZW50QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyLCBTdHJpbmcgZWxlbWVudE5hbWUpIHsKLQkJcmV0dXJuIGJ1aWxkQXJyYXlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoYW5ub3RhdGlvbkFkYXB0ZXIsIGVsZW1lbnROYW1lLCBTdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIuZm9yU3RyaW5nTGl0ZXJhbHMoKSk7CisJCXJldHVybiBidWlsZEFycmF5QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGFubm90YXRpb25BZGFwdGVyLCBlbGVtZW50TmFtZSwgQW5ub3RhdGlvblN0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlci5mb3JTdHJpbmdzKCkpOwogCX0KIAotCXByb3RlY3RlZCBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGJ1aWxkQXJyYXlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlciwgU3RyaW5nIGVsZW1lbnROYW1lLCBFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZ1tdLCBBcnJheUluaXRpYWxpemVyPiBjb252ZXJ0ZXIpIHsKLQkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10sIEFycmF5SW5pdGlhbGl6ZXI+KGFubm90YXRpb25BZGFwdGVyLCBlbGVtZW50TmFtZSwgZmFsc2UsIGNvbnZlcnRlcik7CisJcHJvdGVjdGVkIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYnVpbGRBcnJheUFubm90YXRpb25FbGVtZW50QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyLCBTdHJpbmcgZWxlbWVudE5hbWUsIEV4cHJlc3Npb25Db252ZXJ0ZXI8U3RyaW5nW10+IGNvbnZlcnRlcikgeworCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4oYW5ub3RhdGlvbkFkYXB0ZXIsIGVsZW1lbnROYW1lLCBmYWxzZSwgY29udmVydGVyKTsKIAl9CiAKIAlAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvbWFwcGluZ3MvSmF2YVZlcnNpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvbWFwcGluZ3MvSmF2YVZlcnNpb24uamF2YQppbmRleCA0MTUzMjgxLi4wMzIwODFkIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL21hcHBpbmdzL0phdmFWZXJzaW9uLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9tYXBwaW5ncy9KYXZhVmVyc2lvbi5qYXZhCkBAIC00Myw3ICs0Myw3IEBACiAgKiBAbW9kZWwga2luZD0iY2xhc3MiCiAgKiBAZ2VuZXJhdGVkCiAgKi8KLXB1YmxpYyBjbGFzcyBKYXZhVmVyc2lvbiBleHRlbmRzIEphdmFBdHRyaWJ1dGVNYXBwaW5nIGltcGxlbWVudHMgSVZlcnNpb24KK3B1YmxpYyBjbGFzcyBKYXZhVmVyc2lvbiBleHRlbmRzIEphdmFBdHRyaWJ1dGVNYXBwaW5nIGltcGxlbWVudHMgSUphdmFWZXJzaW9uCiB7CiAJcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uQWRhcHRlciB0ZW1wb3JhbEFubm90YXRpb25BZGFwdGVyOwogCkBAIC0yOTAsNiArMjkwLDEyIEBACiAJCQkJCXJldHVybiAtMTsKIAkJCX0KIAkJfQorCQlpZiAoYmFzZUNsYXNzID09IElKYXZhVmVyc2lvbi5jbGFzcykgeworCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKSB7CisJCQkJZGVmYXVsdCA6CisJCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfQogCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7CiAJfQogCkBAIC0zMTYsNiArMzIyLDEyIEBACiAJCQkJCXJldHVybiAtMTsKIAkJCX0KIAkJfQorCQlpZiAoYmFzZUNsYXNzID09IElKYXZhVmVyc2lvbi5jbGFzcykgeworCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKSB7CisJCQkJZGVmYXVsdCA6CisJCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfQogCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7CiAJfQogCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL21hcHBpbmdzL0phdmFWZXJzaW9uUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvbWFwcGluZ3MvSmF2YVZlcnNpb25Qcm92aWRlci5qYXZhCmluZGV4IGNkNTU2YmIuLjNjZDcxNjcgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvbWFwcGluZ3MvSmF2YVZlcnNpb25Qcm92aWRlci5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvbWFwcGluZ3MvSmF2YVZlcnNpb25Qcm92aWRlci5qYXZhCkBAIC05LDEyICs5LDEyIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3M7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JSnBhRmFjdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JTWFwcGluZ0tleXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLklKYXZhQXR0cmlidXRlTWFwcGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEuSUphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuamR0dXRpbGl0eS5BdHRyaWJ1dGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuamR0dXRpbGl0eS5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnBsYXRmb3JtLkRlZmF1bHRzQ29udGV4dDsKIAogLyoqCiAgKiAKQEAgLTQ0LDEyICs0NCw4IEBACiAJCXJldHVybiBJTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVk7CiAJfQogCQotCXB1YmxpYyBib29sZWFuIGRlZmF1bHRBcHBsaWVzKEF0dHJpYnV0ZSBhdHRyaWJ1dGUsIERlZmF1bHRzQ29udGV4dCBkZWZhdWx0c0NvbnRleHQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBJSmF2YUF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRNYXBwaW5nKEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKLQkJcmV0dXJuIEpwYUphdmFNYXBwaW5nc0ZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUphdmFWZXJzaW9uKGF0dHJpYnV0ZSk7CisJcHVibGljIElKYXZhQXR0cmlidXRlTWFwcGluZyBidWlsZE1hcHBpbmcoQXR0cmlidXRlIGF0dHJpYnV0ZSwgSUpwYUZhY3RvcnkgZmFjdG9yeSkgeworCQlyZXR1cm4gZmFjdG9yeS5jcmVhdGVKYXZhVmVyc2lvbihhdHRyaWJ1dGUpOwogCX0KIAogCXB1YmxpYyBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoKSB7CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL21hcHBpbmdzL0pwYUphdmFNYXBwaW5nc1BhY2thZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvbWFwcGluZ3MvSnBhSmF2YU1hcHBpbmdzUGFja2FnZS5qYXZhCmluZGV4IGRhNGM2NDYuLjBiYzNjZWEgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvbWFwcGluZ3MvSnBhSmF2YU1hcHBpbmdzUGFja2FnZS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvbWFwcGluZ3MvSnBhSmF2YU1hcHBpbmdzUGFja2FnZS5qYXZhCkBAIC02OSw2ICs2OSwxMDM2IEBACiAJcHVibGljIHN0YXRpYyBmaW5hbCBKcGFKYXZhTWFwcGluZ3NQYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5KcGFKYXZhTWFwcGluZ3NQYWNrYWdlLmluaXQoKTsKIAogCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLklKYXZhRW50aXR5IDxlbT5JSmF2YSBFbnRpdHk8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSUphdmFFbnRpdHkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5KcGFKYXZhTWFwcGluZ3NQYWNrYWdlI2dldElKYXZhRW50aXR5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUpBVkFfRU5USVRZID0gMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJSkFWQV9FTlRJVFlfX05BTUUgPSBKcGFKYXZhUGFja2FnZS5JSkFWQV9UWVBFX01BUFBJTkdfX05BTUU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFibGUgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUpBVkFfRU5USVRZX19UQUJMRV9OQU1FID0gSnBhSmF2YVBhY2thZ2UuSUpBVkFfVFlQRV9NQVBQSU5HX19UQUJMRV9OQU1FOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNwZWNpZmllZCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJSkFWQV9FTlRJVFlfX1NQRUNJRklFRF9OQU1FID0gSnBhSmF2YVBhY2thZ2UuSUpBVkFfVFlQRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUpBVkFfRU5USVRZX19ERUZBVUxUX05BTUUgPSBKcGFKYXZhUGFja2FnZS5JSkFWQV9UWVBFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFibGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElKQVZBX0VOVElUWV9fVEFCTEUgPSBKcGFKYXZhUGFja2FnZS5JSkFWQV9UWVBFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3BlY2lmaWVkIFNlY29uZGFyeSBUYWJsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUpBVkFfRU5USVRZX19TUEVDSUZJRURfU0VDT05EQVJZX1RBQkxFUyA9IEpwYUphdmFQYWNrYWdlLklKQVZBX1RZUEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmltYXJ5IEtleSBKb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUpBVkFfRU5USVRZX19QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlMgPSBKcGFKYXZhUGFja2FnZS5JSkFWQV9UWVBFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3BlY2lmaWVkIFByaW1hcnkgS2V5IEpvaW4gQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJSkFWQV9FTlRJVFlfX1NQRUNJRklFRF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlMgPSBKcGFKYXZhUGFja2FnZS5JSkFWQV9UWVBFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBQcmltYXJ5IEtleSBKb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUpBVkFfRU5USVRZX19ERUZBVUxUX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OUyA9IEpwYUphdmFQYWNrYWdlLklKQVZBX1RZUEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Jbmhlcml0YW5jZSBTdHJhdGVneTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUpBVkFfRU5USVRZX19JTkhFUklUQU5DRV9TVFJBVEVHWSA9IEpwYUphdmFQYWNrYWdlLklKQVZBX1RZUEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IERpc2NyaW1pbmF0b3IgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElKQVZBX0VOVElUWV9fREVGQVVMVF9ESVNDUklNSU5BVE9SX1ZBTFVFID0gSnBhSmF2YVBhY2thZ2UuSUpBVkFfVFlQRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyA4OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNwZWNpZmllZCBEaXNjcmltaW5hdG9yIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJSkFWQV9FTlRJVFlfX1NQRUNJRklFRF9ESVNDUklNSU5BVE9SX1ZBTFVFID0gSnBhSmF2YVBhY2thZ2UuSUpBVkFfVFlQRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyA5OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc2NyaW1pbmF0b3IgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElKQVZBX0VOVElUWV9fRElTQ1JJTUlOQVRPUl9WQUxVRSA9IEpwYUphdmFQYWNrYWdlLklKQVZBX1RZUEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzY3JpbWluYXRvciBDb2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElKQVZBX0VOVElUWV9fRElTQ1JJTUlOQVRPUl9DT0xVTU4gPSBKcGFKYXZhUGFja2FnZS5JSkFWQV9UWVBFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDExOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcXVlbmNlIEdlbmVyYXRvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUpBVkFfRU5USVRZX19TRVFVRU5DRV9HRU5FUkFUT1IgPSBKcGFKYXZhUGFja2FnZS5JSkFWQV9UWVBFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDEyOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhYmxlIEdlbmVyYXRvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUpBVkFfRU5USVRZX19UQUJMRV9HRU5FUkFUT1IgPSBKcGFKYXZhUGFja2FnZS5JSkFWQV9UWVBFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDEzOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZSBPdmVycmlkZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUpBVkFfRU5USVRZX19BVFRSSUJVVEVfT1ZFUlJJREVTID0gSnBhSmF2YVBhY2thZ2UuSUpBVkFfVFlQRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxNDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TcGVjaWZpZWQgQXR0cmlidXRlIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJSkFWQV9FTlRJVFlfX1NQRUNJRklFRF9BVFRSSUJVVEVfT1ZFUlJJREVTID0gSnBhSmF2YVBhY2thZ2UuSUpBVkFfVFlQRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxNTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IEF0dHJpYnV0ZSBPdmVycmlkZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUpBVkFfRU5USVRZX19ERUZBVUxUX0FUVFJJQlVURV9PVkVSUklERVMgPSBKcGFKYXZhUGFja2FnZS5JSkFWQV9UWVBFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDE2OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc29jaWF0aW9uIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJSkFWQV9FTlRJVFlfX0FTU09DSUFUSU9OX09WRVJSSURFUyA9IEpwYUphdmFQYWNrYWdlLklKQVZBX1RZUEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTc7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3BlY2lmaWVkIEFzc29jaWF0aW9uIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJSkFWQV9FTlRJVFlfX1NQRUNJRklFRF9BU1NPQ0lBVElPTl9PVkVSUklERVMgPSBKcGFKYXZhUGFja2FnZS5JSkFWQV9UWVBFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDE4OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgQXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElKQVZBX0VOVElUWV9fREVGQVVMVF9BU1NPQ0lBVElPTl9PVkVSUklERVMgPSBKcGFKYXZhUGFja2FnZS5JSkFWQV9UWVBFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDE5OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWVkIFF1ZXJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUpBVkFfRU5USVRZX19OQU1FRF9RVUVSSUVTID0gSnBhSmF2YVBhY2thZ2UuSUpBVkFfVFlQRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAyMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lZCBOYXRpdmUgUXVlcmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJSkFWQV9FTlRJVFlfX05BTUVEX05BVElWRV9RVUVSSUVTID0gSnBhSmF2YVBhY2thZ2UuSUpBVkFfVFlQRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAyMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZCBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUpBVkFfRU5USVRZX19JRF9DTEFTUyA9IEpwYUphdmFQYWNrYWdlLklKQVZBX1RZUEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMjI7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+SUphdmEgRW50aXR5PC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUpBVkFfRU5USVRZX0ZFQVRVUkVfQ09VTlQgPSBKcGFKYXZhUGFja2FnZS5JSkFWQV9UWVBFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDIzOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSUphdmFFbWJlZGRhYmxlIDxlbT5JSmF2YSBFbWJlZGRhYmxlPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLklKYXZhRW1iZWRkYWJsZQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLkpwYUphdmFNYXBwaW5nc1BhY2thZ2UjZ2V0SUphdmFFbWJlZGRhYmxlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUpBVkFfRU1CRUREQUJMRSA9IDE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUpBVkFfRU1CRUREQUJMRV9fTkFNRSA9IEpwYUphdmFQYWNrYWdlLklKQVZBX1RZUEVfTUFQUElOR19fTkFNRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYWJsZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJSkFWQV9FTUJFRERBQkxFX19UQUJMRV9OQU1FID0gSnBhSmF2YVBhY2thZ2UuSUpBVkFfVFlQRV9NQVBQSU5HX19UQUJMRV9OQU1FOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPklKYXZhIEVtYmVkZGFibGU8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJSkFWQV9FTUJFRERBQkxFX0ZFQVRVUkVfQ09VTlQgPSBKcGFKYXZhUGFja2FnZS5JSkFWQV9UWVBFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5JSmF2YU1hcHBlZFN1cGVyY2xhc3MgPGVtPklKYXZhIE1hcHBlZCBTdXBlcmNsYXNzPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLklKYXZhTWFwcGVkU3VwZXJjbGFzcworCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLkpwYUphdmFNYXBwaW5nc1BhY2thZ2UjZ2V0SUphdmFNYXBwZWRTdXBlcmNsYXNzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUpBVkFfTUFQUEVEX1NVUEVSQ0xBU1MgPSAyOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElKQVZBX01BUFBFRF9TVVBFUkNMQVNTX19OQU1FID0gSnBhSmF2YVBhY2thZ2UuSUpBVkFfVFlQRV9NQVBQSU5HX19OQU1FOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhYmxlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElKQVZBX01BUFBFRF9TVVBFUkNMQVNTX19UQUJMRV9OQU1FID0gSnBhSmF2YVBhY2thZ2UuSUpBVkFfVFlQRV9NQVBQSU5HX19UQUJMRV9OQU1FOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkIENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJSkFWQV9NQVBQRURfU1VQRVJDTEFTU19fSURfQ0xBU1MgPSBKcGFKYXZhUGFja2FnZS5JSkFWQV9UWVBFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+SUphdmEgTWFwcGVkIFN1cGVyY2xhc3M8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJSkFWQV9NQVBQRURfU1VQRVJDTEFTU19GRUFUVVJFX0NPVU5UID0gSnBhSmF2YVBhY2thZ2UuSUpBVkFfVFlQRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSUphdmFCYXNpYyA8ZW0+SUphdmEgQmFzaWM8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSUphdmFCYXNpYworCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLkpwYUphdmFNYXBwaW5nc1BhY2thZ2UjZ2V0SUphdmFCYXNpYygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElKQVZBX0JBU0lDID0gMzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GZXRjaDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUpBVkFfQkFTSUNfX0ZFVENIID0gSnBhSmF2YVBhY2thZ2UuSUpBVkFfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElKQVZBX0JBU0lDX19PUFRJT05BTCA9IEpwYUphdmFQYWNrYWdlLklKQVZBX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbHVtbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUpBVkFfQkFTSUNfX0NPTFVNTiA9IEpwYUphdmFQYWNrYWdlLklKQVZBX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAyOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvYjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUpBVkFfQkFTSUNfX0xPQiA9IEpwYUphdmFQYWNrYWdlLklKQVZBX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAzOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlbXBvcmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJSkFWQV9CQVNJQ19fVEVNUE9SQUwgPSBKcGFKYXZhUGFja2FnZS5JSkFWQV9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbnVtZXJhdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJSkFWQV9CQVNJQ19fRU5VTUVSQVRFRCA9IEpwYUphdmFQYWNrYWdlLklKQVZBX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyA1OworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPklKYXZhIEJhc2ljPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUpBVkFfQkFTSUNfRkVBVFVSRV9DT1VOVCA9IEpwYUphdmFQYWNrYWdlLklKQVZBX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyA2OworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSUphdmFFbWJlZGRlZCA8ZW0+SUphdmEgRW1iZWRkZWQ8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSUphdmFFbWJlZGRlZAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLkpwYUphdmFNYXBwaW5nc1BhY2thZ2UjZ2V0SUphdmFFbWJlZGRlZCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElKQVZBX0VNQkVEREVEID0gNDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElKQVZBX0VNQkVEREVEX19BVFRSSUJVVEVfT1ZFUlJJREVTID0gSnBhSmF2YVBhY2thZ2UuSUpBVkFfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3BlY2lmaWVkIEF0dHJpYnV0ZSBPdmVycmlkZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUpBVkFfRU1CRURERURfX1NQRUNJRklFRF9BVFRSSUJVVEVfT1ZFUlJJREVTID0gSnBhSmF2YVBhY2thZ2UuSUpBVkFfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBBdHRyaWJ1dGUgT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElKQVZBX0VNQkVEREVEX19ERUZBVUxUX0FUVFJJQlVURV9PVkVSUklERVMgPSBKcGFKYXZhUGFja2FnZS5JSkFWQV9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMjsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5JSmF2YSBFbWJlZGRlZDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElKQVZBX0VNQkVEREVEX0ZFQVRVUkVfQ09VTlQgPSBKcGFKYXZhUGFja2FnZS5JSkFWQV9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMzsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLklKYXZhRW1iZWRkZWRJZCA8ZW0+SUphdmEgRW1iZWRkZWQgSWQ8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSUphdmFFbWJlZGRlZElkCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSnBhSmF2YU1hcHBpbmdzUGFja2FnZSNnZXRJSmF2YUVtYmVkZGVkSWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJSkFWQV9FTUJFRERFRF9JRCA9IDU7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+SUphdmEgRW1iZWRkZWQgSWQ8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJSkFWQV9FTUJFRERFRF9JRF9GRUFUVVJFX0NPVU5UID0gSnBhSmF2YVBhY2thZ2UuSUpBVkFfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5JSmF2YUlkIDxlbT5JSmF2YSBJZDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5JSmF2YUlkCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSnBhSmF2YU1hcHBpbmdzUGFja2FnZSNnZXRJSmF2YUlkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUpBVkFfSUQgPSA2OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbHVtbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUpBVkFfSURfX0NPTFVNTiA9IEpwYUphdmFQYWNrYWdlLklKQVZBX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlZCBWYWx1ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUpBVkFfSURfX0dFTkVSQVRFRF9WQUxVRSA9IEpwYUphdmFQYWNrYWdlLklKQVZBX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlbXBvcmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJSkFWQV9JRF9fVEVNUE9SQUwgPSBKcGFKYXZhUGFja2FnZS5JSkFWQV9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYWJsZSBHZW5lcmF0b3I8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElKQVZBX0lEX19UQUJMRV9HRU5FUkFUT1IgPSBKcGFKYXZhUGFja2FnZS5JSkFWQV9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXF1ZW5jZSBHZW5lcmF0b3I8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElKQVZBX0lEX19TRVFVRU5DRV9HRU5FUkFUT1IgPSBKcGFKYXZhUGFja2FnZS5JSkFWQV9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5JSmF2YSBJZDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElKQVZBX0lEX0ZFQVRVUkVfQ09VTlQgPSBKcGFKYXZhUGFja2FnZS5JSkFWQV9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNTsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLklKYXZhTWFueVRvTWFueSA8ZW0+SUphdmEgTWFueSBUbyBNYW55PC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLklKYXZhTWFueVRvTWFueQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLkpwYUphdmFNYXBwaW5nc1BhY2thZ2UjZ2V0SUphdmFNYW55VG9NYW55KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUpBVkFfTUFOWV9UT19NQU5ZID0gNzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQgRW50aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJSkFWQV9NQU5ZX1RPX01BTllfX1RBUkdFVF9FTlRJVFkgPSBKcGFKYXZhUGFja2FnZS5JSkFWQV9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TcGVjaWZpZWQgVGFyZ2V0IEVudGl0eTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUpBVkFfTUFOWV9UT19NQU5ZX19TUEVDSUZJRURfVEFSR0VUX0VOVElUWSA9IEpwYUphdmFQYWNrYWdlLklKQVZBX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgVGFyZ2V0IEVudGl0eTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUpBVkFfTUFOWV9UT19NQU5ZX19ERUZBVUxUX1RBUkdFVF9FTlRJVFkgPSBKcGFKYXZhUGFja2FnZS5JSkFWQV9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXNvbHZlZCBUYXJnZXQgRW50aXR5PC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJSkFWQV9NQU5ZX1RPX01BTllfX1JFU09MVkVEX1RBUkdFVF9FTlRJVFkgPSBKcGFKYXZhUGFja2FnZS5JSkFWQV9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYXNjYWRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJSkFWQV9NQU5ZX1RPX01BTllfX0NBU0NBREUgPSBKcGFKYXZhUGFja2FnZS5JSkFWQV9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXBwZWQgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElKQVZBX01BTllfVE9fTUFOWV9fTUFQUEVEX0JZID0gSnBhSmF2YVBhY2thZ2UuSUpBVkFfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXIgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElKQVZBX01BTllfVE9fTUFOWV9fT1JERVJfQlkgPSBKcGFKYXZhUGFja2FnZS5JSkFWQV9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GZXRjaDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUpBVkFfTUFOWV9UT19NQU5ZX19GRVRDSCA9IEpwYUphdmFQYWNrYWdlLklKQVZBX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyA3OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkpvaW4gVGFibGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElKQVZBX01BTllfVE9fTUFOWV9fSk9JTl9UQUJMRSA9IEpwYUphdmFQYWNrYWdlLklKQVZBX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyA4OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElKQVZBX01BTllfVE9fTUFOWV9fTUFQX0tFWSA9IEpwYUphdmFQYWNrYWdlLklKQVZBX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyA5OworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPklKYXZhIE1hbnkgVG8gTWFueTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElKQVZBX01BTllfVE9fTUFOWV9GRUFUVVJFX0NPVU5UID0gSnBhSmF2YVBhY2thZ2UuSUpBVkFfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDEwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSUphdmFNYW55VG9PbmUgPGVtPklKYXZhIE1hbnkgVG8gT25lPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLklKYXZhTWFueVRvT25lCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSnBhSmF2YU1hcHBpbmdzUGFja2FnZSNnZXRJSmF2YU1hbnlUb09uZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElKQVZBX01BTllfVE9fT05FID0gODsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQgRW50aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJSkFWQV9NQU5ZX1RPX09ORV9fVEFSR0VUX0VOVElUWSA9IEpwYUphdmFQYWNrYWdlLklKQVZBX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNwZWNpZmllZCBUYXJnZXQgRW50aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJSkFWQV9NQU5ZX1RPX09ORV9fU1BFQ0lGSUVEX1RBUkdFVF9FTlRJVFkgPSBKcGFKYXZhUGFja2FnZS5JSkFWQV9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IFRhcmdldCBFbnRpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElKQVZBX01BTllfVE9fT05FX19ERUZBVUxUX1RBUkdFVF9FTlRJVFkgPSBKcGFKYXZhUGFja2FnZS5JSkFWQV9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXNvbHZlZCBUYXJnZXQgRW50aXR5PC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJSkFWQV9NQU5ZX1RPX09ORV9fUkVTT0xWRURfVEFSR0VUX0VOVElUWSA9IEpwYUphdmFQYWNrYWdlLklKQVZBX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAzOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhc2NhZGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElKQVZBX01BTllfVE9fT05FX19DQVNDQURFID0gSnBhSmF2YVBhY2thZ2UuSUpBVkFfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmV0Y2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElKQVZBX01BTllfVE9fT05FX19GRVRDSCA9IEpwYUphdmFQYWNrYWdlLklKQVZBX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyA1OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkpvaW4gQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJSkFWQV9NQU5ZX1RPX09ORV9fSk9JTl9DT0xVTU5TID0gSnBhSmF2YVBhY2thZ2UuSUpBVkFfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDY7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3BlY2lmaWVkIEpvaW4gQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJSkFWQV9NQU5ZX1RPX09ORV9fU1BFQ0lGSUVEX0pPSU5fQ09MVU1OUyA9IEpwYUphdmFQYWNrYWdlLklKQVZBX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyA3OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgSm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElKQVZBX01BTllfVE9fT05FX19ERUZBVUxUX0pPSU5fQ09MVU1OUyA9IEpwYUphdmFQYWNrYWdlLklKQVZBX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyA4OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJSkFWQV9NQU5ZX1RPX09ORV9fT1BUSU9OQUwgPSBKcGFKYXZhUGFja2FnZS5JSkFWQV9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgOTsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5JSmF2YSBNYW55IFRvIE9uZTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElKQVZBX01BTllfVE9fT05FX0ZFQVRVUkVfQ09VTlQgPSBKcGFKYXZhUGFja2FnZS5JSkFWQV9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5JSmF2YU9uZVRvTWFueSA8ZW0+SUphdmEgT25lIFRvIE1hbnk8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSUphdmFPbmVUb01hbnkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5KcGFKYXZhTWFwcGluZ3NQYWNrYWdlI2dldElKYXZhT25lVG9NYW55KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUpBVkFfT05FX1RPX01BTlkgPSA5OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhcmdldCBFbnRpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElKQVZBX09ORV9UT19NQU5ZX19UQVJHRVRfRU5USVRZID0gSnBhSmF2YVBhY2thZ2UuSUpBVkFfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3BlY2lmaWVkIFRhcmdldCBFbnRpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElKQVZBX09ORV9UT19NQU5ZX19TUEVDSUZJRURfVEFSR0VUX0VOVElUWSA9IEpwYUphdmFQYWNrYWdlLklKQVZBX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgVGFyZ2V0IEVudGl0eTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUpBVkFfT05FX1RPX01BTllfX0RFRkFVTFRfVEFSR0VUX0VOVElUWSA9IEpwYUphdmFQYWNrYWdlLklKQVZBX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAyOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc29sdmVkIFRhcmdldCBFbnRpdHk8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElKQVZBX09ORV9UT19NQU5ZX19SRVNPTFZFRF9UQVJHRVRfRU5USVRZID0gSnBhSmF2YVBhY2thZ2UuSUpBVkFfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDM7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUpBVkFfT05FX1RPX01BTllfX0NBU0NBREUgPSBKcGFKYXZhUGFja2FnZS5JSkFWQV9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXBwZWQgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElKQVZBX09ORV9UT19NQU5ZX19NQVBQRURfQlkgPSBKcGFKYXZhUGFja2FnZS5JSkFWQV9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlciBCeTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUpBVkFfT05FX1RPX01BTllfX09SREVSX0JZID0gSnBhSmF2YVBhY2thZ2UuSUpBVkFfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDY7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmV0Y2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElKQVZBX09ORV9UT19NQU5ZX19GRVRDSCA9IEpwYUphdmFQYWNrYWdlLklKQVZBX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyA3OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkpvaW4gVGFibGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElKQVZBX09ORV9UT19NQU5ZX19KT0lOX1RBQkxFID0gSnBhSmF2YVBhY2thZ2UuSUpBVkFfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDg7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUpBVkFfT05FX1RPX01BTllfX01BUF9LRVkgPSBKcGFKYXZhUGFja2FnZS5JSkFWQV9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgOTsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5JSmF2YSBPbmUgVG8gTWFueTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElKQVZBX09ORV9UT19NQU5ZX0ZFQVRVUkVfQ09VTlQgPSBKcGFKYXZhUGFja2FnZS5JSkFWQV9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5JSmF2YU9uZVRvT25lIDxlbT5JSmF2YSBPbmUgVG8gT25lPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLklKYXZhT25lVG9PbmUKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5KcGFKYXZhTWFwcGluZ3NQYWNrYWdlI2dldElKYXZhT25lVG9PbmUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJSkFWQV9PTkVfVE9fT05FID0gMTA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0IEVudGl0eTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUpBVkFfT05FX1RPX09ORV9fVEFSR0VUX0VOVElUWSA9IEpwYUphdmFQYWNrYWdlLklKQVZBX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNwZWNpZmllZCBUYXJnZXQgRW50aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJSkFWQV9PTkVfVE9fT05FX19TUEVDSUZJRURfVEFSR0VUX0VOVElUWSA9IEpwYUphdmFQYWNrYWdlLklKQVZBX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgVGFyZ2V0IEVudGl0eTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUpBVkFfT05FX1RPX09ORV9fREVGQVVMVF9UQVJHRVRfRU5USVRZID0gSnBhSmF2YVBhY2thZ2UuSUpBVkFfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzb2x2ZWQgVGFyZ2V0IEVudGl0eTwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUpBVkFfT05FX1RPX09ORV9fUkVTT0xWRURfVEFSR0VUX0VOVElUWSA9IEpwYUphdmFQYWNrYWdlLklKQVZBX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAzOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhc2NhZGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElKQVZBX09ORV9UT19PTkVfX0NBU0NBREUgPSBKcGFKYXZhUGFja2FnZS5JSkFWQV9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GZXRjaDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUpBVkFfT05FX1RPX09ORV9fRkVUQ0ggPSBKcGFKYXZhUGFja2FnZS5JSkFWQV9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Kb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUpBVkFfT05FX1RPX09ORV9fSk9JTl9DT0xVTU5TID0gSnBhSmF2YVBhY2thZ2UuSUpBVkFfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDY7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3BlY2lmaWVkIEpvaW4gQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJSkFWQV9PTkVfVE9fT05FX19TUEVDSUZJRURfSk9JTl9DT0xVTU5TID0gSnBhSmF2YVBhY2thZ2UuSUpBVkFfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDc7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBKb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUpBVkFfT05FX1RPX09ORV9fREVGQVVMVF9KT0lOX0NPTFVNTlMgPSBKcGFKYXZhUGFja2FnZS5JSkFWQV9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgODsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUpBVkFfT05FX1RPX09ORV9fT1BUSU9OQUwgPSBKcGFKYXZhUGFja2FnZS5JSkFWQV9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgOTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXBwZWQgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElKQVZBX09ORV9UT19PTkVfX01BUFBFRF9CWSA9IEpwYUphdmFQYWNrYWdlLklKQVZBX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxMDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5JSmF2YSBPbmUgVG8gT25lPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUpBVkFfT05FX1RPX09ORV9GRUFUVVJFX0NPVU5UID0gSnBhSmF2YVBhY2thZ2UuSUpBVkFfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDExOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSUphdmFUcmFuc2llbnQgPGVtPklKYXZhIFRyYW5zaWVudDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5JSmF2YVRyYW5zaWVudAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLkpwYUphdmFNYXBwaW5nc1BhY2thZ2UjZ2V0SUphdmFUcmFuc2llbnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJSkFWQV9UUkFOU0lFTlQgPSAxMTsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5JSmF2YSBUcmFuc2llbnQ8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJSkFWQV9UUkFOU0lFTlRfRkVBVFVSRV9DT1VOVCA9IEpwYUphdmFQYWNrYWdlLklKQVZBX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSUphdmFWZXJzaW9uIDxlbT5JSmF2YSBWZXJzaW9uPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLklKYXZhVmVyc2lvbgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLkpwYUphdmFNYXBwaW5nc1BhY2thZ2UjZ2V0SUphdmFWZXJzaW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUpBVkFfVkVSU0lPTiA9IDEyOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbHVtbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUpBVkFfVkVSU0lPTl9fQ09MVU1OID0gSnBhSmF2YVBhY2thZ2UuSUpBVkFfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVtcG9yYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElKQVZBX1ZFUlNJT05fX1RFTVBPUkFMID0gSnBhSmF2YVBhY2thZ2UuSUpBVkFfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+SUphdmEgVmVyc2lvbjwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElKQVZBX1ZFUlNJT05fRkVBVFVSRV9DT1VOVCA9IEpwYUphdmFQYWNrYWdlLklKQVZBX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAyOworCisJLyoqCiAJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSmF2YVR5cGVNYXBwaW5nIDxlbT5KYXZhIFR5cGUgTWFwcGluZzwvZW0+fScgY2xhc3MuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTc2LDcgKzExMDYsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLkpwYUphdmFNYXBwaW5nc1BhY2thZ2UjZ2V0SmF2YVR5cGVNYXBwaW5nKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9UWVBFX01BUFBJTkcgPSAwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpBVkFfVFlQRV9NQVBQSU5HID0gMTM7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgpAQCAtMTEzLDcgKzExNDMsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLkpwYUphdmFNYXBwaW5nc1BhY2thZ2UjZ2V0SmF2YUVudGl0eSgpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpBVkFfRU5USVRZID0gMTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKQVZBX0VOVElUWSA9IDE0OwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KQEAgLTM1Nyw3ICsxMzg3LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5KcGFKYXZhTWFwcGluZ3NQYWNrYWdlI2dldEphdmFNYXBwZWRTdXBlcmNsYXNzKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9NQVBQRURfU1VQRVJDTEFTUyA9IDI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9NQVBQRURfU1VQRVJDTEFTUyA9IDE1OwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KQEAgLTQwMyw3ICsxNDMzLDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5KcGFKYXZhTWFwcGluZ3NQYWNrYWdlI2dldEphdmFFbWJlZGRhYmxlKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9FTUJFRERBQkxFID0gMzsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKQVZBX0VNQkVEREFCTEUgPSAxNjsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCkBAIC00NDAsNyArMTQ3MCw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSnBhSmF2YU1hcHBpbmdzUGFja2FnZSNnZXRKYXZhTnVsbFR5cGVNYXBwaW5nKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9OVUxMX1RZUEVfTUFQUElORyA9IDQ7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9OVUxMX1RZUEVfTUFQUElORyA9IDE3OwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KQEAgLTQ3Nyw3ICsxNTA3LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5KcGFKYXZhTWFwcGluZ3NQYWNrYWdlI2dldEphdmFBdHRyaWJ1dGVNYXBwaW5nKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9BVFRSSUJVVEVfTUFQUElORyA9IDU7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9BVFRSSUJVVEVfTUFQUElORyA9IDE4OwogCiAJLyoqCiAJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkphdmEgQXR0cmlidXRlIE1hcHBpbmc8L2VtPicgY2xhc3MuCkBAIC00OTYsNyArMTUyNiw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSnBhSmF2YU1hcHBpbmdzUGFja2FnZSNnZXRKYXZhTnVsbEF0dHJpYnV0ZU1hcHBpbmcoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKQVZBX05VTExfQVRUUklCVVRFX01BUFBJTkcgPSAxOTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKQVZBX05VTExfQVRUUklCVVRFX01BUFBJTkcgPSAzMjsKIAogCS8qKgogCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLkphdmFCYXNpYyA8ZW0+SmF2YSBCYXNpYzwvZW0+fScgY2xhc3MuCkBAIC01MDYsNyArMTUzNiw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSnBhSmF2YU1hcHBpbmdzUGFja2FnZSNnZXRKYXZhQmFzaWMoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKQVZBX0JBU0lDID0gNjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKQVZBX0JBU0lDID0gMTk7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmV0Y2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KQEAgLTU3OSw3ICsxNjA5LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5KcGFKYXZhTWFwcGluZ3NQYWNrYWdlI2dldEphdmFJZCgpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpBVkFfSUQgPSA3OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpBVkFfSUQgPSAyMDsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KQEAgLTY0Myw3ICsxNjczLDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5KcGFKYXZhTWFwcGluZ3NQYWNrYWdlI2dldEphdmFUcmFuc2llbnQoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKQVZBX1RSQU5TSUVOVCA9IDg7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9UUkFOU0lFTlQgPSAyMTsKIAogCS8qKgogCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5KYXZhIFRyYW5zaWVudDwvZW0+JyBjbGFzcy4KQEAgLTY2Miw3ICsxNjkyLDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5KcGFKYXZhTWFwcGluZ3NQYWNrYWdlI2dldEphdmFWZXJzaW9uKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9WRVJTSU9OID0gOTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKQVZBX1ZFUlNJT04gPSAyMjsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KQEAgLTY5OSw3ICsxNzI5LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5KcGFKYXZhTWFwcGluZ3NQYWNrYWdlI2dldEphdmFFbWJlZGRlZElkKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9FTUJFRERFRF9JRCA9IDEwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpBVkFfRU1CRURERURfSUQgPSAyMzsKIAogCS8qKgogCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5KYXZhIEVtYmVkZGVkIElkPC9lbT4nIGNsYXNzLgpAQCAtNzE4LDcgKzE3NDgsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLkpwYUphdmFNYXBwaW5nc1BhY2thZ2UjZ2V0SmF2YUVtYmVkZGVkKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9FTUJFRERFRCA9IDExOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpBVkFfRU1CRURERUQgPSAyNDsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTc2NCw3ICsxNzk0LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5KcGFKYXZhTWFwcGluZ3NQYWNrYWdlI2dldEphdmFSZWxhdGlvbnNoaXBNYXBwaW5nKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9SRUxBVElPTlNISVBfTUFQUElORyA9IDEyOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpBVkFfUkVMQVRJT05TSElQX01BUFBJTkcgPSAyNTsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQgRW50aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCkBAIC04MjgsNyArMTg1OCw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSnBhSmF2YU1hcHBpbmdzUGFja2FnZSNnZXRKYXZhU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpBVkFfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HID0gMTM7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkcgPSAyNjsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQgRW50aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCkBAIC05MzcsNyArMTk2Nyw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSnBhSmF2YU1hcHBpbmdzUGFja2FnZSNnZXRKYXZhTWFueVRvT25lKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9NQU5ZX1RPX09ORSA9IDE0OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpBVkFfTUFOWV9UT19PTkUgPSAyNzsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQgRW50aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCkBAIC0xMDQ2LDcgKzIwNzYsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLkpwYUphdmFNYXBwaW5nc1BhY2thZ2UjZ2V0SmF2YU9uZVRvT25lKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9PTkVfVE9fT05FID0gMTU7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9PTkVfVE9fT05FID0gMjg7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0IEVudGl0eTwvYj48L2VtPicgYXR0cmlidXRlLgpAQCAtMTE2NCw3ICsyMTk0LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5KcGFKYXZhTWFwcGluZ3NQYWNrYWdlI2dldEphdmFNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKQVZBX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HID0gMTY7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElORyA9IDI5OwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhcmdldCBFbnRpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KQEAgLTEyNzMsNyArMjMwMyw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSnBhSmF2YU1hcHBpbmdzUGFja2FnZSNnZXRKYXZhT25lVG9NYW55KCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9PTkVfVE9fTUFOWSA9IDE3OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpBVkFfT05FX1RPX01BTlkgPSAzMDsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQgRW50aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCkBAIC0xMzgyLDcgKzI0MTIsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLkpwYUphdmFNYXBwaW5nc1BhY2thZ2UjZ2V0SmF2YU1hbnlUb01hbnkoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKQVZBX01BTllfVE9fTUFOWSA9IDE4OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpBVkFfTUFOWV9UT19NQU5ZID0gMzE7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0IEVudGl0eTwvYj48L2VtPicgYXR0cmlidXRlLgpAQCAtMTUwMCw3ICsyNTMwLDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5KcGFKYXZhTWFwcGluZ3NQYWNrYWdlI2dldEFic3RyYWN0SmF2YVRhYmxlKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1RfSkFWQV9UQUJMRSA9IDIwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX0pBVkFfVEFCTEUgPSAzMzsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCkBAIC0xNjA5LDcgKzI2MzksNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLkpwYUphdmFNYXBwaW5nc1BhY2thZ2UjZ2V0SmF2YVRhYmxlKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9UQUJMRSA9IDIxOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpBVkFfVEFCTEUgPSAzNDsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCkBAIC0xNzE4LDcgKzI3NDgsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLkpwYUphdmFNYXBwaW5nc1BhY2thZ2UjZ2V0SmF2YUpvaW5UYWJsZSgpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpBVkFfSk9JTl9UQUJMRSA9IDIzOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpBVkFfSk9JTl9UQUJMRSA9IDM2OwogCiAJLyoqCiAJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSmF2YUNvbHVtbiA8ZW0+SmF2YSBDb2x1bW48L2VtPn0nIGNsYXNzLgpAQCAtMTcyOCw3ICsyNzU4LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5KcGFKYXZhTWFwcGluZ3NQYWNrYWdlI2dldEphdmFDb2x1bW4oKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKQVZBX0NPTFVNTiA9IDI2OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpBVkFfQ09MVU1OID0gMzk7CiAKIAkvKioKIAkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5KYXZhSm9pbkNvbHVtbiA8ZW0+SmF2YSBKb2luIENvbHVtbjwvZW0+fScgY2xhc3MuCkBAIC0xNzM4LDcgKzI3NjgsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLkpwYUphdmFNYXBwaW5nc1BhY2thZ2UjZ2V0SmF2YUpvaW5Db2x1bW4oKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKQVZBX0pPSU5fQ09MVU1OID0gMjc7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9KT0lOX0NPTFVNTiA9IDQwOwogCiAJLyoqCiAJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSmF2YUF0dHJpYnV0ZU92ZXJyaWRlIDxlbT5KYXZhIEF0dHJpYnV0ZSBPdmVycmlkZTwvZW0+fScgY2xhc3MuCkBAIC0xNzQ4LDcgKzI3NzgsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLkpwYUphdmFNYXBwaW5nc1BhY2thZ2UjZ2V0SmF2YUF0dHJpYnV0ZU92ZXJyaWRlKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9BVFRSSUJVVEVfT1ZFUlJJREUgPSAyOTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKQVZBX0FUVFJJQlVURV9PVkVSUklERSA9IDQyOwogCiAJLyoqCiAJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgPGVtPkphdmEgQXNzb2NpYXRpb24gT3ZlcnJpZGU8L2VtPn0nIGNsYXNzLgpAQCAtMTc1OCw3ICsyNzg4LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5KcGFKYXZhTWFwcGluZ3NQYWNrYWdlI2dldEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9BU1NPQ0lBVElPTl9PVkVSUklERSA9IDMwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpBVkFfQVNTT0NJQVRJT05fT1ZFUlJJREUgPSA0MzsKIAogCS8qKgogCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLkphdmFEaXNjcmltaW5hdG9yQ29sdW1uIDxlbT5KYXZhIERpc2NyaW1pbmF0b3IgQ29sdW1uPC9lbT59JyBjbGFzcy4KQEAgLTE3NjgsNyArMjc5OCw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSnBhSmF2YU1hcHBpbmdzUGFja2FnZSNnZXRKYXZhRGlzY3JpbWluYXRvckNvbHVtbigpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpBVkFfRElTQ1JJTUlOQVRPUl9DT0xVTU4gPSAzMTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKQVZBX0RJU0NSSU1JTkFUT1JfQ09MVU1OID0gNDQ7CiAKIAkvKioKIAkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5KYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gPGVtPkphdmEgUHJpbWFyeSBLZXkgSm9pbiBDb2x1bW48L2VtPn0nIGNsYXNzLgpAQCAtMTc3OCw3ICsyODA4LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5KcGFKYXZhTWFwcGluZ3NQYWNrYWdlI2dldEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbigpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpBVkFfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4gPSAzMjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKQVZBX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OID0gNDU7CiAKIAkvKioKIAkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5KYXZhR2VuZXJhdGVkVmFsdWUgPGVtPkphdmEgR2VuZXJhdGVkIFZhbHVlPC9lbT59JyBjbGFzcy4KQEAgLTE3ODgsNyArMjgxOCw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSnBhSmF2YU1hcHBpbmdzUGFja2FnZSNnZXRKYXZhR2VuZXJhdGVkVmFsdWUoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKQVZBX0dFTkVSQVRFRF9WQUxVRSA9IDMzOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpBVkFfR0VORVJBVEVEX1ZBTFVFID0gNDY7CiAKIAkvKioKIAkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5KYXZhR2VuZXJhdG9yIDxlbT5KYXZhIEdlbmVyYXRvcjwvZW0+fScgY2xhc3MuCkBAIC0xNzk4LDcgKzI4MjgsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLkpwYUphdmFNYXBwaW5nc1BhY2thZ2UjZ2V0SmF2YUdlbmVyYXRvcigpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpBVkFfR0VORVJBVE9SID0gMzQ7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9HRU5FUkFUT1IgPSA0NzsKIAogCS8qKgogCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLkphdmFUYWJsZUdlbmVyYXRvciA8ZW0+SmF2YSBUYWJsZSBHZW5lcmF0b3I8L2VtPn0nIGNsYXNzLgpAQCAtMTgwOCw3ICsyODM4LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5KcGFKYXZhTWFwcGluZ3NQYWNrYWdlI2dldEphdmFUYWJsZUdlbmVyYXRvcigpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpBVkFfVEFCTEVfR0VORVJBVE9SID0gMzU7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9UQUJMRV9HRU5FUkFUT1IgPSA0ODsKIAogCS8qKgogCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLkphdmFTZXF1ZW5jZUdlbmVyYXRvciA8ZW0+SmF2YSBTZXF1ZW5jZSBHZW5lcmF0b3I8L2VtPn0nIGNsYXNzLgpAQCAtMTgxOCw3ICsyODQ4LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5KcGFKYXZhTWFwcGluZ3NQYWNrYWdlI2dldEphdmFTZXF1ZW5jZUdlbmVyYXRvcigpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpBVkFfU0VRVUVOQ0VfR0VORVJBVE9SID0gMzY7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9TRVFVRU5DRV9HRU5FUkFUT1IgPSA0OTsKIAogCS8qKgogCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLkphdmFTZWNvbmRhcnlUYWJsZSA8ZW0+SmF2YSBTZWNvbmRhcnkgVGFibGU8L2VtPn0nIGNsYXNzLgpAQCAtMTgyOCw3ICsyODU4LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5KcGFKYXZhTWFwcGluZ3NQYWNrYWdlI2dldEphdmFTZWNvbmRhcnlUYWJsZSgpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpBVkFfU0VDT05EQVJZX1RBQkxFID0gMjI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9TRUNPTkRBUllfVEFCTEUgPSAzNTsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCkBAIC0yMTE3LDcgKzMxNDcsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLkpwYUphdmFNYXBwaW5nc1BhY2thZ2UjZ2V0SmF2YU5hbWVkQ29sdW1uKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9OQU1FRF9DT0xVTU4gPSAyNDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKQVZBX05BTUVEX0NPTFVNTiA9IDM3OwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KQEAgLTIxNzIsNyArMzIwMiw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSnBhSmF2YU1hcHBpbmdzUGFja2FnZSNnZXRBYnN0cmFjdEphdmFDb2x1bW4oKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9KQVZBX0NPTFVNTiA9IDI1OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX0pBVkFfQ09MVU1OID0gMzg7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgpAQCAtMjM5MSwxMyArMzQyMSwzMSBAQAogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpBVkFfQ09MVU1OX19MRU5HVEggPSBBQlNUUkFDVF9KQVZBX0NPTFVNTl9GRUFUVVJFX0NPVU5UICsgMDsKIAogCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TcGVjaWZpZWQgTGVuZ3RoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKQVZBX0NPTFVNTl9fU1BFQ0lGSUVEX0xFTkdUSCA9IEFCU1RSQUNUX0pBVkFfQ09MVU1OX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWNpc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9DT0xVTU5fX1BSRUNJU0lPTiA9IEFCU1RSQUNUX0pBVkFfQ09MVU1OX0ZFQVRVUkVfQ09VTlQgKyAxOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpBVkFfQ09MVU1OX19QUkVDSVNJT04gPSBBQlNUUkFDVF9KQVZBX0NPTFVNTl9GRUFUVVJFX0NPVU5UICsgMjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TcGVjaWZpZWQgUHJlY2lzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKQVZBX0NPTFVNTl9fU1BFQ0lGSUVEX1BSRUNJU0lPTiA9IEFCU1RSQUNUX0pBVkFfQ09MVU1OX0ZFQVRVUkVfQ09VTlQgKyAzOwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNjYWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCkBAIC0yNDA2LDcgKzM0NTQsMTYgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKQVZBX0NPTFVNTl9fU0NBTEUgPSBBQlNUUkFDVF9KQVZBX0NPTFVNTl9GRUFUVVJFX0NPVU5UICsgMjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKQVZBX0NPTFVNTl9fU0NBTEUgPSBBQlNUUkFDVF9KQVZBX0NPTFVNTl9GRUFUVVJFX0NPVU5UICsgNDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TcGVjaWZpZWQgU2NhbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpBVkFfQ09MVU1OX19TUEVDSUZJRURfU0NBTEUgPSBBQlNUUkFDVF9KQVZBX0NPTFVNTl9GRUFUVVJFX0NPVU5UICsgNTsKIAogCS8qKgogCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5KYXZhIENvbHVtbjwvZW0+JyBjbGFzcy4KQEAgLTI0MTUsNyArMzQ3Miw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9DT0xVTU5fRkVBVFVSRV9DT1VOVCA9IEFCU1RSQUNUX0pBVkFfQ09MVU1OX0ZFQVRVUkVfQ09VTlQgKyAzOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpBVkFfQ09MVU1OX0ZFQVRVUkVfQ09VTlQgPSBBQlNUUkFDVF9KQVZBX0NPTFVNTl9GRUFUVVJFX0NPVU5UICsgNjsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCkBAIC0yNTYwLDcgKzM2MTcsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLkpwYUphdmFNYXBwaW5nc1BhY2thZ2UjZ2V0SmF2YU92ZXJyaWRlKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9PVkVSUklERSA9IDI4OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpBVkFfT1ZFUlJJREUgPSA0MTsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCkBAIC0zMjU0LDcgKzQzMTEsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLkpwYUphdmFNYXBwaW5nc1BhY2thZ2UjZ2V0SmF2YUFic3RyYWN0UXVlcnkoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKQVZBX0FCU1RSQUNUX1FVRVJZID0gMzc7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9BQlNUUkFDVF9RVUVSWSA9IDUwOwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KQEAgLTMzMDAsNyArNDM1Nyw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSnBhSmF2YU1hcHBpbmdzUGFja2FnZSNnZXRKYXZhTmFtZWRRdWVyeSgpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpBVkFfTkFNRURfUVVFUlkgPSAzODsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKQVZBX05BTUVEX1FVRVJZID0gNTE7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgpAQCAtMzM0Niw3ICs0NDAzLDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5KcGFKYXZhTWFwcGluZ3NQYWNrYWdlI2dldEphdmFOYW1lZE5hdGl2ZVF1ZXJ5KCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9OQU1FRF9OQVRJVkVfUVVFUlkgPSAzOTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKQVZBX05BTUVEX05BVElWRV9RVUVSWSA9IDUyOwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KQEAgLTM0MTAsNyArNDQ2Nyw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSnBhSmF2YU1hcHBpbmdzUGFja2FnZSNnZXRKYXZhUXVlcnlIaW50KCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9RVUVSWV9ISU5UID0gNDA7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9RVUVSWV9ISU5UID0gNTM7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgpAQCAtMzQ0Nyw3ICs0NTA0LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5KcGFKYXZhTWFwcGluZ3NQYWNrYWdlI2dldEphdmFVbmlxdWVDb25zdHJhaW50KCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9VTklRVUVfQ09OU1RSQUlOVCA9IDQxOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpBVkFfVU5JUVVFX0NPTlNUUkFJTlQgPSA1NDsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db2x1bW4gTmFtZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgpAQCAtMzQ3NSw3ICs0NTMyLDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5KcGFKYXZhTWFwcGluZ3NQYWNrYWdlI2dldEphdmFDYXNjYWRlKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9DQVNDQURFID0gNDI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9DQVNDQURFID0gNTU7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCkBAIC0zNTM2LDYgKzQ1OTMsOTcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJcHJpdmF0ZSBFQ2xhc3MgaUphdmFFbnRpdHlFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgaUphdmFFbWJlZGRhYmxlRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIGlKYXZhTWFwcGVkU3VwZXJjbGFzc0VDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBpSmF2YUJhc2ljRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIGlKYXZhRW1iZWRkZWRFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgaUphdmFFbWJlZGRlZElkRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIGlKYXZhSWRFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgaUphdmFNYW55VG9NYW55RUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIGlKYXZhTWFueVRvT25lRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIGlKYXZhT25lVG9NYW55RUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIGlKYXZhT25lVG9PbmVFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgaUphdmFUcmFuc2llbnRFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgaUphdmFWZXJzaW9uRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLwogCXByaXZhdGUgRUNsYXNzIGphdmFFbnRpdHlFQ2xhc3MgPSBudWxsOwogCiAJLyoqCkBAIC0zOTE0LDYgKzUwNjIsMTYyIEBACiAJfQogCiAJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLklKYXZhRW50aXR5IDxlbT5JSmF2YSBFbnRpdHk8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SUphdmEgRW50aXR5PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLklKYXZhRW50aXR5CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0SUphdmFFbnRpdHkoKSB7CisJCXJldHVybiBpSmF2YUVudGl0eUVDbGFzczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSUphdmFFbWJlZGRhYmxlIDxlbT5JSmF2YSBFbWJlZGRhYmxlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPklKYXZhIEVtYmVkZGFibGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSUphdmFFbWJlZGRhYmxlCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0SUphdmFFbWJlZGRhYmxlKCkgeworCQlyZXR1cm4gaUphdmFFbWJlZGRhYmxlRUNsYXNzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5JSmF2YU1hcHBlZFN1cGVyY2xhc3MgPGVtPklKYXZhIE1hcHBlZCBTdXBlcmNsYXNzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPklKYXZhIE1hcHBlZCBTdXBlcmNsYXNzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLklKYXZhTWFwcGVkU3VwZXJjbGFzcworCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldElKYXZhTWFwcGVkU3VwZXJjbGFzcygpIHsKKwkJcmV0dXJuIGlKYXZhTWFwcGVkU3VwZXJjbGFzc0VDbGFzczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSUphdmFCYXNpYyA8ZW0+SUphdmEgQmFzaWM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SUphdmEgQmFzaWM8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSUphdmFCYXNpYworCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldElKYXZhQmFzaWMoKSB7CisJCXJldHVybiBpSmF2YUJhc2ljRUNsYXNzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5JSmF2YUVtYmVkZGVkIDxlbT5JSmF2YSBFbWJlZGRlZDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JSmF2YSBFbWJlZGRlZDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5JSmF2YUVtYmVkZGVkCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0SUphdmFFbWJlZGRlZCgpIHsKKwkJcmV0dXJuIGlKYXZhRW1iZWRkZWRFQ2xhc3M7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLklKYXZhRW1iZWRkZWRJZCA8ZW0+SUphdmEgRW1iZWRkZWQgSWQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SUphdmEgRW1iZWRkZWQgSWQ8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSUphdmFFbWJlZGRlZElkCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0SUphdmFFbWJlZGRlZElkKCkgeworCQlyZXR1cm4gaUphdmFFbWJlZGRlZElkRUNsYXNzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5JSmF2YUlkIDxlbT5JSmF2YSBJZDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JSmF2YSBJZDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5JSmF2YUlkCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0SUphdmFJZCgpIHsKKwkJcmV0dXJuIGlKYXZhSWRFQ2xhc3M7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLklKYXZhTWFueVRvTWFueSA8ZW0+SUphdmEgTWFueSBUbyBNYW55PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPklKYXZhIE1hbnkgVG8gTWFueTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5JSmF2YU1hbnlUb01hbnkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRJSmF2YU1hbnlUb01hbnkoKSB7CisJCXJldHVybiBpSmF2YU1hbnlUb01hbnlFQ2xhc3M7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLklKYXZhTWFueVRvT25lIDxlbT5JSmF2YSBNYW55IFRvIE9uZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JSmF2YSBNYW55IFRvIE9uZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5JSmF2YU1hbnlUb09uZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldElKYXZhTWFueVRvT25lKCkgeworCQlyZXR1cm4gaUphdmFNYW55VG9PbmVFQ2xhc3M7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLklKYXZhT25lVG9NYW55IDxlbT5JSmF2YSBPbmUgVG8gTWFueTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JSmF2YSBPbmUgVG8gTWFueTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5JSmF2YU9uZVRvTWFueQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldElKYXZhT25lVG9NYW55KCkgeworCQlyZXR1cm4gaUphdmFPbmVUb01hbnlFQ2xhc3M7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLklKYXZhT25lVG9PbmUgPGVtPklKYXZhIE9uZSBUbyBPbmU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SUphdmEgT25lIFRvIE9uZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5JSmF2YU9uZVRvT25lCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0SUphdmFPbmVUb09uZSgpIHsKKwkJcmV0dXJuIGlKYXZhT25lVG9PbmVFQ2xhc3M7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLklKYXZhVHJhbnNpZW50IDxlbT5JSmF2YSBUcmFuc2llbnQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SUphdmEgVHJhbnNpZW50PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLklKYXZhVHJhbnNpZW50CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0SUphdmFUcmFuc2llbnQoKSB7CisJCXJldHVybiBpSmF2YVRyYW5zaWVudEVDbGFzczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSUphdmFWZXJzaW9uIDxlbT5JSmF2YSBWZXJzaW9uPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPklKYXZhIFZlcnNpb248L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSUphdmFWZXJzaW9uCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0SUphdmFWZXJzaW9uKCkgeworCQlyZXR1cm4gaUphdmFWZXJzaW9uRUNsYXNzOworCX0KKworCS8qKgogCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5KYXZhRW50aXR5IDxlbT5KYXZhIEVudGl0eTwvZW0+fScuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTQ0NTksNiArNTc2MywxOSBAQAogCQkJcmV0dXJuOwogCQlpc0NyZWF0ZWQgPSB0cnVlOwogCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKKwkJaUphdmFFbnRpdHlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSUpBVkFfRU5USVRZKTsKKwkJaUphdmFFbWJlZGRhYmxlRUNsYXNzID0gY3JlYXRlRUNsYXNzKElKQVZBX0VNQkVEREFCTEUpOworCQlpSmF2YU1hcHBlZFN1cGVyY2xhc3NFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSUpBVkFfTUFQUEVEX1NVUEVSQ0xBU1MpOworCQlpSmF2YUJhc2ljRUNsYXNzID0gY3JlYXRlRUNsYXNzKElKQVZBX0JBU0lDKTsKKwkJaUphdmFFbWJlZGRlZEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJSkFWQV9FTUJFRERFRCk7CisJCWlKYXZhRW1iZWRkZWRJZEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJSkFWQV9FTUJFRERFRF9JRCk7CisJCWlKYXZhSWRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSUpBVkFfSUQpOworCQlpSmF2YU1hbnlUb01hbnlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSUpBVkFfTUFOWV9UT19NQU5ZKTsKKwkJaUphdmFNYW55VG9PbmVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSUpBVkFfTUFOWV9UT19PTkUpOworCQlpSmF2YU9uZVRvTWFueUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJSkFWQV9PTkVfVE9fTUFOWSk7CisJCWlKYXZhT25lVG9PbmVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSUpBVkFfT05FX1RPX09ORSk7CisJCWlKYXZhVHJhbnNpZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKElKQVZBX1RSQU5TSUVOVCk7CisJCWlKYXZhVmVyc2lvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJSkFWQV9WRVJTSU9OKTsKIAkJamF2YVR5cGVNYXBwaW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKEpBVkFfVFlQRV9NQVBQSU5HKTsKIAkJamF2YUVudGl0eUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhKQVZBX0VOVElUWSk7CiAJCWphdmFNYXBwZWRTdXBlcmNsYXNzRUNsYXNzID0gY3JlYXRlRUNsYXNzKEpBVkFfTUFQUEVEX1NVUEVSQ0xBU1MpOwpAQCAtNDUzMiw0MyArNTg0OSw2OSBAQAogCQkvLyBDcmVhdGUgdHlwZSBwYXJhbWV0ZXJzCiAJCS8vIFNldCBib3VuZHMgZm9yIHR5cGUgcGFyYW1ldGVycwogCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCisJCWlKYXZhRW50aXR5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUpwYUphdmFQYWNrYWdlLmdldElKYXZhVHlwZU1hcHBpbmcoKSk7CisJCWlKYXZhRW50aXR5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuZ2V0SUVudGl0eSgpKTsKKwkJaUphdmFFbWJlZGRhYmxlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUpwYUphdmFQYWNrYWdlLmdldElKYXZhVHlwZU1hcHBpbmcoKSk7CisJCWlKYXZhRW1iZWRkYWJsZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLmdldElFbWJlZGRhYmxlKCkpOworCQlpSmF2YU1hcHBlZFN1cGVyY2xhc3NFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlSnBhSmF2YVBhY2thZ2UuZ2V0SUphdmFUeXBlTWFwcGluZygpKTsKKwkJaUphdmFNYXBwZWRTdXBlcmNsYXNzRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuZ2V0SU1hcHBlZFN1cGVyY2xhc3MoKSk7CisJCWlKYXZhQmFzaWNFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlSnBhSmF2YVBhY2thZ2UuZ2V0SUphdmFBdHRyaWJ1dGVNYXBwaW5nKCkpOworCQlpSmF2YUJhc2ljRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuZ2V0SUJhc2ljKCkpOworCQlpSmF2YUVtYmVkZGVkRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUpwYUphdmFQYWNrYWdlLmdldElKYXZhQXR0cmlidXRlTWFwcGluZygpKTsKKwkJaUphdmFFbWJlZGRlZEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLmdldElFbWJlZGRlZCgpKTsKKwkJaUphdmFFbWJlZGRlZElkRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUpwYUphdmFQYWNrYWdlLmdldElKYXZhQXR0cmlidXRlTWFwcGluZygpKTsKKwkJaUphdmFFbWJlZGRlZElkRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuZ2V0SUVtYmVkZGVkSWQoKSk7CisJCWlKYXZhSWRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlSnBhSmF2YVBhY2thZ2UuZ2V0SUphdmFBdHRyaWJ1dGVNYXBwaW5nKCkpOworCQlpSmF2YUlkRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuZ2V0SUlkKCkpOworCQlpSmF2YU1hbnlUb01hbnlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlSnBhSmF2YVBhY2thZ2UuZ2V0SUphdmFBdHRyaWJ1dGVNYXBwaW5nKCkpOworCQlpSmF2YU1hbnlUb01hbnlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5nZXRJTWFueVRvTWFueSgpKTsKKwkJaUphdmFNYW55VG9PbmVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlSnBhSmF2YVBhY2thZ2UuZ2V0SUphdmFBdHRyaWJ1dGVNYXBwaW5nKCkpOworCQlpSmF2YU1hbnlUb09uZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLmdldElNYW55VG9PbmUoKSk7CisJCWlKYXZhT25lVG9NYW55RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUpwYUphdmFQYWNrYWdlLmdldElKYXZhQXR0cmlidXRlTWFwcGluZygpKTsKKwkJaUphdmFPbmVUb01hbnlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5nZXRJT25lVG9NYW55KCkpOworCQlpSmF2YU9uZVRvT25lRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUpwYUphdmFQYWNrYWdlLmdldElKYXZhQXR0cmlidXRlTWFwcGluZygpKTsKKwkJaUphdmFPbmVUb09uZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLmdldElPbmVUb09uZSgpKTsKKwkJaUphdmFUcmFuc2llbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlSnBhSmF2YVBhY2thZ2UuZ2V0SUphdmFBdHRyaWJ1dGVNYXBwaW5nKCkpOworCQlpSmF2YVRyYW5zaWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLmdldElUcmFuc2llbnQoKSk7CisJCWlKYXZhVmVyc2lvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVKcGFKYXZhUGFja2FnZS5nZXRJSmF2YUF0dHJpYnV0ZU1hcHBpbmcoKSk7CisJCWlKYXZhVmVyc2lvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLmdldElWZXJzaW9uKCkpOwogCQlqYXZhVHlwZU1hcHBpbmdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlSnBhSmF2YVBhY2thZ2UuZ2V0SmF2YUVPYmplY3QoKSk7CiAJCWphdmFUeXBlTWFwcGluZ0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVKcGFKYXZhUGFja2FnZS5nZXRJSmF2YVR5cGVNYXBwaW5nKCkpOwogCQlqYXZhRW50aXR5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SmF2YVR5cGVNYXBwaW5nKCkpOwotCQlqYXZhRW50aXR5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuZ2V0SUVudGl0eSgpKTsKKwkJamF2YUVudGl0eUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldElKYXZhRW50aXR5KCkpOwogCQlqYXZhTWFwcGVkU3VwZXJjbGFzc0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEphdmFUeXBlTWFwcGluZygpKTsKLQkJamF2YU1hcHBlZFN1cGVyY2xhc3NFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5nZXRJTWFwcGVkU3VwZXJjbGFzcygpKTsKKwkJamF2YU1hcHBlZFN1cGVyY2xhc3NFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRJSmF2YU1hcHBlZFN1cGVyY2xhc3MoKSk7CiAJCWphdmFFbWJlZGRhYmxlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SmF2YVR5cGVNYXBwaW5nKCkpOwotCQlqYXZhRW1iZWRkYWJsZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLmdldElFbWJlZGRhYmxlKCkpOworCQlqYXZhRW1iZWRkYWJsZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldElKYXZhRW1iZWRkYWJsZSgpKTsKIAkJamF2YU51bGxUeXBlTWFwcGluZ0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEphdmFUeXBlTWFwcGluZygpKTsKIAkJamF2YUF0dHJpYnV0ZU1hcHBpbmdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlSnBhSmF2YVBhY2thZ2UuZ2V0SmF2YUVPYmplY3QoKSk7CiAJCWphdmFBdHRyaWJ1dGVNYXBwaW5nRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUpwYUphdmFQYWNrYWdlLmdldElKYXZhQXR0cmlidXRlTWFwcGluZygpKTsKIAkJamF2YUJhc2ljRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SmF2YUF0dHJpYnV0ZU1hcHBpbmcoKSk7Ci0JCWphdmFCYXNpY0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLmdldElCYXNpYygpKTsKKwkJamF2YUJhc2ljRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SUphdmFCYXNpYygpKTsKIAkJamF2YUlkRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SmF2YUF0dHJpYnV0ZU1hcHBpbmcoKSk7Ci0JCWphdmFJZEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLmdldElJZCgpKTsKKwkJamF2YUlkRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SUphdmFJZCgpKTsKIAkJamF2YVRyYW5zaWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEphdmFBdHRyaWJ1dGVNYXBwaW5nKCkpOwotCQlqYXZhVHJhbnNpZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuZ2V0SVRyYW5zaWVudCgpKTsKKwkJamF2YVRyYW5zaWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldElKYXZhVHJhbnNpZW50KCkpOwogCQlqYXZhVmVyc2lvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEphdmFBdHRyaWJ1dGVNYXBwaW5nKCkpOwotCQlqYXZhVmVyc2lvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLmdldElWZXJzaW9uKCkpOworCQlqYXZhVmVyc2lvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldElKYXZhVmVyc2lvbigpKTsKIAkJamF2YUVtYmVkZGVkSWRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRKYXZhQXR0cmlidXRlTWFwcGluZygpKTsKLQkJamF2YUVtYmVkZGVkSWRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5nZXRJRW1iZWRkZWRJZCgpKTsKKwkJamF2YUVtYmVkZGVkSWRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRJSmF2YUVtYmVkZGVkSWQoKSk7CiAJCWphdmFFbWJlZGRlZEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEphdmFBdHRyaWJ1dGVNYXBwaW5nKCkpOwotCQlqYXZhRW1iZWRkZWRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5nZXRJRW1iZWRkZWQoKSk7CisJCWphdmFFbWJlZGRlZEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldElKYXZhRW1iZWRkZWQoKSk7CiAJCWphdmFSZWxhdGlvbnNoaXBNYXBwaW5nRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SmF2YUF0dHJpYnV0ZU1hcHBpbmcoKSk7CiAJCWphdmFSZWxhdGlvbnNoaXBNYXBwaW5nRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuZ2V0SVJlbGF0aW9uc2hpcE1hcHBpbmcoKSk7CiAJCWphdmFTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SmF2YVJlbGF0aW9uc2hpcE1hcHBpbmcoKSk7CiAJCWphdmFTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuZ2V0SVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcoKSk7CiAJCWphdmFNYW55VG9PbmVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRKYXZhU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZygpKTsKLQkJamF2YU1hbnlUb09uZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLmdldElNYW55VG9PbmUoKSk7CisJCWphdmFNYW55VG9PbmVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRJSmF2YU1hbnlUb09uZSgpKTsKIAkJamF2YU9uZVRvT25lRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SmF2YVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcoKSk7Ci0JCWphdmFPbmVUb09uZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLmdldElPbmVUb09uZSgpKTsKKwkJamF2YU9uZVRvT25lRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SUphdmFPbmVUb09uZSgpKTsKIAkJamF2YU11bHRpUmVsYXRpb25zaGlwTWFwcGluZ0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEphdmFSZWxhdGlvbnNoaXBNYXBwaW5nKCkpOwogCQlqYXZhTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuZ2V0SU11bHRpUmVsYXRpb25zaGlwTWFwcGluZygpKTsKIAkJamF2YU9uZVRvTWFueUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEphdmFNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcoKSk7Ci0JCWphdmFPbmVUb01hbnlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5nZXRJT25lVG9NYW55KCkpOworCQlqYXZhT25lVG9NYW55RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SUphdmFPbmVUb01hbnkoKSk7CiAJCWphdmFNYW55VG9NYW55RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SmF2YU11bHRpUmVsYXRpb25zaGlwTWFwcGluZygpKTsKLQkJamF2YU1hbnlUb01hbnlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5nZXRJTWFueVRvTWFueSgpKTsKKwkJamF2YU1hbnlUb01hbnlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRJSmF2YU1hbnlUb01hbnkoKSk7CiAJCWphdmFOdWxsQXR0cmlidXRlTWFwcGluZ0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEphdmFBdHRyaWJ1dGVNYXBwaW5nKCkpOwogCQlhYnN0cmFjdEphdmFUYWJsZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVKcGFKYXZhUGFja2FnZS5nZXRKYXZhRU9iamVjdCgpKTsKIAkJYWJzdHJhY3RKYXZhVGFibGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5nZXRJVGFibGUoKSk7CkBAIC00NjE2LDYgKzU5NTksMTkgQEAKIAkJamF2YUNhc2NhZGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlSnBhSmF2YVBhY2thZ2UuZ2V0SmF2YUVPYmplY3QoKSk7CiAJCWphdmFDYXNjYWRlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuZ2V0SUNhc2NhZGUoKSk7CiAJCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCisJCWluaXRFQ2xhc3MoaUphdmFFbnRpdHlFQ2xhc3MsIElKYXZhRW50aXR5LmNsYXNzLCAiSUphdmFFbnRpdHkiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RUNsYXNzKGlKYXZhRW1iZWRkYWJsZUVDbGFzcywgSUphdmFFbWJlZGRhYmxlLmNsYXNzLCAiSUphdmFFbWJlZGRhYmxlIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVDbGFzcyhpSmF2YU1hcHBlZFN1cGVyY2xhc3NFQ2xhc3MsIElKYXZhTWFwcGVkU3VwZXJjbGFzcy5jbGFzcywgIklKYXZhTWFwcGVkU3VwZXJjbGFzcyIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFQ2xhc3MoaUphdmFCYXNpY0VDbGFzcywgSUphdmFCYXNpYy5jbGFzcywgIklKYXZhQmFzaWMiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RUNsYXNzKGlKYXZhRW1iZWRkZWRFQ2xhc3MsIElKYXZhRW1iZWRkZWQuY2xhc3MsICJJSmF2YUVtYmVkZGVkIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVDbGFzcyhpSmF2YUVtYmVkZGVkSWRFQ2xhc3MsIElKYXZhRW1iZWRkZWRJZC5jbGFzcywgIklKYXZhRW1iZWRkZWRJZCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFQ2xhc3MoaUphdmFJZEVDbGFzcywgSUphdmFJZC5jbGFzcywgIklKYXZhSWQiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RUNsYXNzKGlKYXZhTWFueVRvTWFueUVDbGFzcywgSUphdmFNYW55VG9NYW55LmNsYXNzLCAiSUphdmFNYW55VG9NYW55IiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVDbGFzcyhpSmF2YU1hbnlUb09uZUVDbGFzcywgSUphdmFNYW55VG9PbmUuY2xhc3MsICJJSmF2YU1hbnlUb09uZSIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFQ2xhc3MoaUphdmFPbmVUb01hbnlFQ2xhc3MsIElKYXZhT25lVG9NYW55LmNsYXNzLCAiSUphdmFPbmVUb01hbnkiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RUNsYXNzKGlKYXZhT25lVG9PbmVFQ2xhc3MsIElKYXZhT25lVG9PbmUuY2xhc3MsICJJSmF2YU9uZVRvT25lIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVDbGFzcyhpSmF2YVRyYW5zaWVudEVDbGFzcywgSUphdmFUcmFuc2llbnQuY2xhc3MsICJJSmF2YVRyYW5zaWVudCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFQ2xhc3MoaUphdmFWZXJzaW9uRUNsYXNzLCBJSmF2YVZlcnNpb24uY2xhc3MsICJJSmF2YVZlcnNpb24iLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwogCQlpbml0RUNsYXNzKGphdmFUeXBlTWFwcGluZ0VDbGFzcywgSmF2YVR5cGVNYXBwaW5nLmNsYXNzLCAiSmF2YVR5cGVNYXBwaW5nIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CiAJCWluaXRFQ2xhc3MoamF2YUVudGl0eUVDbGFzcywgSmF2YUVudGl0eS5jbGFzcywgIkphdmFFbnRpdHkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CiAJCWluaXRFQ2xhc3MoamF2YU1hcHBlZFN1cGVyY2xhc3NFQ2xhc3MsIEphdmFNYXBwZWRTdXBlcmNsYXNzLmNsYXNzLCAiSmF2YU1hcHBlZFN1cGVyY2xhc3MiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CkBAIC00Njc3LDYgKzYwMzMsMTM2IEBACiAJcHVibGljIGludGVyZmFjZSBMaXRlcmFscwogCXsKIAkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSUphdmFFbnRpdHkgPGVtPklKYXZhIEVudGl0eTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5JSmF2YUVudGl0eQorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5KcGFKYXZhTWFwcGluZ3NQYWNrYWdlI2dldElKYXZhRW50aXR5KCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgSUpBVkFfRU5USVRZID0gZUlOU1RBTkNFLmdldElKYXZhRW50aXR5KCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSUphdmFFbWJlZGRhYmxlIDxlbT5JSmF2YSBFbWJlZGRhYmxlPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLklKYXZhRW1iZWRkYWJsZQorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5KcGFKYXZhTWFwcGluZ3NQYWNrYWdlI2dldElKYXZhRW1iZWRkYWJsZSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIElKQVZBX0VNQkVEREFCTEUgPSBlSU5TVEFOQ0UuZ2V0SUphdmFFbWJlZGRhYmxlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSUphdmFNYXBwZWRTdXBlcmNsYXNzIDxlbT5JSmF2YSBNYXBwZWQgU3VwZXJjbGFzczwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5JSmF2YU1hcHBlZFN1cGVyY2xhc3MKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSnBhSmF2YU1hcHBpbmdzUGFja2FnZSNnZXRJSmF2YU1hcHBlZFN1cGVyY2xhc3MoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBJSkFWQV9NQVBQRURfU1VQRVJDTEFTUyA9IGVJTlNUQU5DRS5nZXRJSmF2YU1hcHBlZFN1cGVyY2xhc3MoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5JSmF2YUJhc2ljIDxlbT5JSmF2YSBCYXNpYzwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5JSmF2YUJhc2ljCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLkpwYUphdmFNYXBwaW5nc1BhY2thZ2UjZ2V0SUphdmFCYXNpYygpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIElKQVZBX0JBU0lDID0gZUlOU1RBTkNFLmdldElKYXZhQmFzaWMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5JSmF2YUVtYmVkZGVkIDxlbT5JSmF2YSBFbWJlZGRlZDwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5JSmF2YUVtYmVkZGVkCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLkpwYUphdmFNYXBwaW5nc1BhY2thZ2UjZ2V0SUphdmFFbWJlZGRlZCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIElKQVZBX0VNQkVEREVEID0gZUlOU1RBTkNFLmdldElKYXZhRW1iZWRkZWQoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5JSmF2YUVtYmVkZGVkSWQgPGVtPklKYXZhIEVtYmVkZGVkIElkPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLklKYXZhRW1iZWRkZWRJZAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5KcGFKYXZhTWFwcGluZ3NQYWNrYWdlI2dldElKYXZhRW1iZWRkZWRJZCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIElKQVZBX0VNQkVEREVEX0lEID0gZUlOU1RBTkNFLmdldElKYXZhRW1iZWRkZWRJZCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLklKYXZhSWQgPGVtPklKYXZhIElkPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLklKYXZhSWQKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSnBhSmF2YU1hcHBpbmdzUGFja2FnZSNnZXRJSmF2YUlkKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgSUpBVkFfSUQgPSBlSU5TVEFOQ0UuZ2V0SUphdmFJZCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLklKYXZhTWFueVRvTWFueSA8ZW0+SUphdmEgTWFueSBUbyBNYW55PC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLklKYXZhTWFueVRvTWFueQorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5KcGFKYXZhTWFwcGluZ3NQYWNrYWdlI2dldElKYXZhTWFueVRvTWFueSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIElKQVZBX01BTllfVE9fTUFOWSA9IGVJTlNUQU5DRS5nZXRJSmF2YU1hbnlUb01hbnkoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5JSmF2YU1hbnlUb09uZSA8ZW0+SUphdmEgTWFueSBUbyBPbmU8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSUphdmFNYW55VG9PbmUKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSnBhSmF2YU1hcHBpbmdzUGFja2FnZSNnZXRJSmF2YU1hbnlUb09uZSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIElKQVZBX01BTllfVE9fT05FID0gZUlOU1RBTkNFLmdldElKYXZhTWFueVRvT25lKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSUphdmFPbmVUb01hbnkgPGVtPklKYXZhIE9uZSBUbyBNYW55PC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLklKYXZhT25lVG9NYW55CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLkpwYUphdmFNYXBwaW5nc1BhY2thZ2UjZ2V0SUphdmFPbmVUb01hbnkoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBJSkFWQV9PTkVfVE9fTUFOWSA9IGVJTlNUQU5DRS5nZXRJSmF2YU9uZVRvTWFueSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLklKYXZhT25lVG9PbmUgPGVtPklKYXZhIE9uZSBUbyBPbmU8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSUphdmFPbmVUb09uZQorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5KcGFKYXZhTWFwcGluZ3NQYWNrYWdlI2dldElKYXZhT25lVG9PbmUoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBJSkFWQV9PTkVfVE9fT05FID0gZUlOU1RBTkNFLmdldElKYXZhT25lVG9PbmUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5JSmF2YVRyYW5zaWVudCA8ZW0+SUphdmEgVHJhbnNpZW50PC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLklKYXZhVHJhbnNpZW50CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLkpwYUphdmFNYXBwaW5nc1BhY2thZ2UjZ2V0SUphdmFUcmFuc2llbnQoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBJSkFWQV9UUkFOU0lFTlQgPSBlSU5TVEFOQ0UuZ2V0SUphdmFUcmFuc2llbnQoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5JSmF2YVZlcnNpb24gPGVtPklKYXZhIFZlcnNpb248L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSUphdmFWZXJzaW9uCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLkpwYUphdmFNYXBwaW5nc1BhY2thZ2UjZ2V0SUphdmFWZXJzaW9uKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgSUpBVkFfVkVSU0lPTiA9IGVJTlNUQU5DRS5nZXRJSmF2YVZlcnNpb24oKTsKKworCQkvKioKIAkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5KYXZhRW50aXR5IDxlbT5KYXZhIEVudGl0eTwvZW0+fScgY2xhc3MuCiAJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9tYXBwaW5ncy91dGlsL0pwYUphdmFNYXBwaW5nc0FkYXB0ZXJGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL21hcHBpbmdzL3V0aWwvSnBhSmF2YU1hcHBpbmdzQWRhcHRlckZhY3RvcnkuamF2YQppbmRleCBlNGRmNWJmLi41YjdjZWVhIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL21hcHBpbmdzL3V0aWwvSnBhSmF2YU1hcHBpbmdzQWRhcHRlckZhY3RvcnkuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL21hcHBpbmdzL3V0aWwvSnBhSmF2YU1hcHBpbmdzQWRhcHRlckZhY3RvcnkuamF2YQpAQCAtMjMsNiArMjMsMTkgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEuSmF2YUVPYmplY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLkFic3RyYWN0SmF2YUNvbHVtbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuQWJzdHJhY3RKYXZhVGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLklKYXZhQmFzaWM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLklKYXZhRW1iZWRkYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSUphdmFFbWJlZGRlZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSUphdmFFbWJlZGRlZElkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5JSmF2YUVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSUphdmFJZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSUphdmFNYW55VG9NYW55OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5JSmF2YU1hbnlUb09uZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSUphdmFNYXBwZWRTdXBlcmNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5JSmF2YU9uZVRvTWFueTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSUphdmFPbmVUb09uZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSUphdmFUcmFuc2llbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLklKYXZhVmVyc2lvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSmF2YUFic3RyYWN0UXVlcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLkphdmFBc3NvY2lhdGlvbk92ZXJyaWRlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5KYXZhQXR0cmlidXRlTWFwcGluZzsKQEAgLTE2NCw2ICsxNzcsNzEgQEAKIAkgKi8KIAlwcm90ZWN0ZWQgSnBhSmF2YU1hcHBpbmdzU3dpdGNoPEFkYXB0ZXI+IG1vZGVsU3dpdGNoID0gbmV3IEpwYUphdmFNYXBwaW5nc1N3aXRjaDxBZGFwdGVyPigpIHsKIAkJQE92ZXJyaWRlCisJCXB1YmxpYyBBZGFwdGVyIGNhc2VJSmF2YUVudGl0eShJSmF2YUVudGl0eSBvYmplY3QpIHsKKwkJCXJldHVybiBjcmVhdGVJSmF2YUVudGl0eUFkYXB0ZXIoKTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgQWRhcHRlciBjYXNlSUphdmFFbWJlZGRhYmxlKElKYXZhRW1iZWRkYWJsZSBvYmplY3QpIHsKKwkJCXJldHVybiBjcmVhdGVJSmF2YUVtYmVkZGFibGVBZGFwdGVyKCk7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIEFkYXB0ZXIgY2FzZUlKYXZhTWFwcGVkU3VwZXJjbGFzcyhJSmF2YU1hcHBlZFN1cGVyY2xhc3Mgb2JqZWN0KSB7CisJCQlyZXR1cm4gY3JlYXRlSUphdmFNYXBwZWRTdXBlcmNsYXNzQWRhcHRlcigpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBBZGFwdGVyIGNhc2VJSmF2YUJhc2ljKElKYXZhQmFzaWMgb2JqZWN0KSB7CisJCQlyZXR1cm4gY3JlYXRlSUphdmFCYXNpY0FkYXB0ZXIoKTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgQWRhcHRlciBjYXNlSUphdmFFbWJlZGRlZChJSmF2YUVtYmVkZGVkIG9iamVjdCkgeworCQkJcmV0dXJuIGNyZWF0ZUlKYXZhRW1iZWRkZWRBZGFwdGVyKCk7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIEFkYXB0ZXIgY2FzZUlKYXZhRW1iZWRkZWRJZChJSmF2YUVtYmVkZGVkSWQgb2JqZWN0KSB7CisJCQlyZXR1cm4gY3JlYXRlSUphdmFFbWJlZGRlZElkQWRhcHRlcigpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBBZGFwdGVyIGNhc2VJSmF2YUlkKElKYXZhSWQgb2JqZWN0KSB7CisJCQlyZXR1cm4gY3JlYXRlSUphdmFJZEFkYXB0ZXIoKTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgQWRhcHRlciBjYXNlSUphdmFNYW55VG9NYW55KElKYXZhTWFueVRvTWFueSBvYmplY3QpIHsKKwkJCXJldHVybiBjcmVhdGVJSmF2YU1hbnlUb01hbnlBZGFwdGVyKCk7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIEFkYXB0ZXIgY2FzZUlKYXZhTWFueVRvT25lKElKYXZhTWFueVRvT25lIG9iamVjdCkgeworCQkJcmV0dXJuIGNyZWF0ZUlKYXZhTWFueVRvT25lQWRhcHRlcigpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBBZGFwdGVyIGNhc2VJSmF2YU9uZVRvTWFueShJSmF2YU9uZVRvTWFueSBvYmplY3QpIHsKKwkJCXJldHVybiBjcmVhdGVJSmF2YU9uZVRvTWFueUFkYXB0ZXIoKTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgQWRhcHRlciBjYXNlSUphdmFPbmVUb09uZShJSmF2YU9uZVRvT25lIG9iamVjdCkgeworCQkJcmV0dXJuIGNyZWF0ZUlKYXZhT25lVG9PbmVBZGFwdGVyKCk7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIEFkYXB0ZXIgY2FzZUlKYXZhVHJhbnNpZW50KElKYXZhVHJhbnNpZW50IG9iamVjdCkgeworCQkJcmV0dXJuIGNyZWF0ZUlKYXZhVHJhbnNpZW50QWRhcHRlcigpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBBZGFwdGVyIGNhc2VJSmF2YVZlcnNpb24oSUphdmFWZXJzaW9uIG9iamVjdCkgeworCQkJcmV0dXJuIGNyZWF0ZUlKYXZhVmVyc2lvbkFkYXB0ZXIoKTsKKwkJfQorCisJCUBPdmVycmlkZQogCQlwdWJsaWMgQWRhcHRlciBjYXNlSmF2YVR5cGVNYXBwaW5nKEphdmFUeXBlTWFwcGluZyBvYmplY3QpIHsKIAkJCXJldHVybiBjcmVhdGVKYXZhVHlwZU1hcHBpbmdBZGFwdGVyKCk7CiAJCX0KQEAgLTM4NCwyMSArNDYyLDExIEBACiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZUpwYUVPYmplY3QoSnBhRU9iamVjdCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVKcGFFT2JqZWN0QWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCiAJCXB1YmxpYyBBZGFwdGVyIGNhc2VJSnBhU291cmNlT2JqZWN0KElKcGFTb3VyY2VPYmplY3Qgb2JqZWN0KSB7CiAJCQlyZXR1cm4gY3JlYXRlSUpwYVNvdXJjZU9iamVjdEFkYXB0ZXIoKTsKIAkJfQogCiAJCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlSmF2YUVPYmplY3QoSmF2YUVPYmplY3Qgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlSmF2YUVPYmplY3RBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKIAkJcHVibGljIEFkYXB0ZXIgY2FzZUlUeXBlTWFwcGluZyhJVHlwZU1hcHBpbmcgb2JqZWN0KSB7CiAJCQlyZXR1cm4gY3JlYXRlSVR5cGVNYXBwaW5nQWRhcHRlcigpOwogCQl9CkBAIC00MTQsMTMgKzQ4MiwxMyBAQAogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VJTWFwcGVkU3VwZXJjbGFzcyhJTWFwcGVkU3VwZXJjbGFzcyBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVJTWFwcGVkU3VwZXJjbGFzc0FkYXB0ZXIoKTsKKwkJcHVibGljIEFkYXB0ZXIgY2FzZUlFbWJlZGRhYmxlKElFbWJlZGRhYmxlIG9iamVjdCkgeworCQkJcmV0dXJuIGNyZWF0ZUlFbWJlZGRhYmxlQWRhcHRlcigpOwogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VJRW1iZWRkYWJsZShJRW1iZWRkYWJsZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVJRW1iZWRkYWJsZUFkYXB0ZXIoKTsKKwkJcHVibGljIEFkYXB0ZXIgY2FzZUlNYXBwZWRTdXBlcmNsYXNzKElNYXBwZWRTdXBlcmNsYXNzIG9iamVjdCkgeworCQkJcmV0dXJuIGNyZWF0ZUlNYXBwZWRTdXBlcmNsYXNzQWRhcHRlcigpOwogCQl9CiAKIAkJQE92ZXJyaWRlCkBAIC00NDQsMTggKzUxMiw4IEBACiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZUlJZChJSWQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlSUlkQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VJVHJhbnNpZW50KElUcmFuc2llbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlSVRyYW5zaWVudEFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlSVZlcnNpb24oSVZlcnNpb24gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlSVZlcnNpb25BZGFwdGVyKCk7CisJCXB1YmxpYyBBZGFwdGVyIGNhc2VJRW1iZWRkZWQoSUVtYmVkZGVkIG9iamVjdCkgeworCQkJcmV0dXJuIGNyZWF0ZUlFbWJlZGRlZEFkYXB0ZXIoKTsKIAkJfQogCiAJCUBPdmVycmlkZQpAQCAtNDY0LDggKzUyMiw4IEBACiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZUlFbWJlZGRlZChJRW1iZWRkZWQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlSUVtYmVkZGVkQWRhcHRlcigpOworCQlwdWJsaWMgQWRhcHRlciBjYXNlSUlkKElJZCBvYmplY3QpIHsKKwkJCXJldHVybiBjcmVhdGVJSWRBZGFwdGVyKCk7CiAJCX0KIAogCQlAT3ZlcnJpZGUKQEAgLTQ3NCw2ICs1MzIsMjEgQEAKIAkJfQogCiAJCUBPdmVycmlkZQorCQlwdWJsaWMgQWRhcHRlciBjYXNlSU5vbk93bmluZ01hcHBpbmcoSU5vbk93bmluZ01hcHBpbmcgb2JqZWN0KSB7CisJCQlyZXR1cm4gY3JlYXRlSU5vbk93bmluZ01hcHBpbmdBZGFwdGVyKCk7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIEFkYXB0ZXIgY2FzZUlNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcoSU11bHRpUmVsYXRpb25zaGlwTWFwcGluZyBvYmplY3QpIHsKKwkJCXJldHVybiBjcmVhdGVJTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nQWRhcHRlcigpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBBZGFwdGVyIGNhc2VJTWFueVRvTWFueShJTWFueVRvTWFueSBvYmplY3QpIHsKKwkJCXJldHVybiBjcmVhdGVJTWFueVRvTWFueUFkYXB0ZXIoKTsKKwkJfQorCisJCUBPdmVycmlkZQogCQlwdWJsaWMgQWRhcHRlciBjYXNlSVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcoSVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcgb2JqZWN0KSB7CiAJCQlyZXR1cm4gY3JlYXRlSVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdBZGFwdGVyKCk7CiAJCX0KQEAgLTQ4NCw4ICs1NTcsOCBAQAogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VJTm9uT3duaW5nTWFwcGluZyhJTm9uT3duaW5nTWFwcGluZyBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVJTm9uT3duaW5nTWFwcGluZ0FkYXB0ZXIoKTsKKwkJcHVibGljIEFkYXB0ZXIgY2FzZUlPbmVUb01hbnkoSU9uZVRvTWFueSBvYmplY3QpIHsKKwkJCXJldHVybiBjcmVhdGVJT25lVG9NYW55QWRhcHRlcigpOwogCQl9CiAKIAkJQE92ZXJyaWRlCkBAIC00OTQsMTggKzU2NywyMyBAQAogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VJTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nKElNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlSU11bHRpUmVsYXRpb25zaGlwTWFwcGluZ0FkYXB0ZXIoKTsKKwkJcHVibGljIEFkYXB0ZXIgY2FzZUlUcmFuc2llbnQoSVRyYW5zaWVudCBvYmplY3QpIHsKKwkJCXJldHVybiBjcmVhdGVJVHJhbnNpZW50QWRhcHRlcigpOwogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VJT25lVG9NYW55KElPbmVUb01hbnkgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlSU9uZVRvTWFueUFkYXB0ZXIoKTsKKwkJcHVibGljIEFkYXB0ZXIgY2FzZUlWZXJzaW9uKElWZXJzaW9uIG9iamVjdCkgeworCQkJcmV0dXJuIGNyZWF0ZUlWZXJzaW9uQWRhcHRlcigpOwogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VJTWFueVRvTWFueShJTWFueVRvTWFueSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVJTWFueVRvTWFueUFkYXB0ZXIoKTsKKwkJcHVibGljIEFkYXB0ZXIgY2FzZUpwYUVPYmplY3QoSnBhRU9iamVjdCBvYmplY3QpIHsKKwkJCXJldHVybiBjcmVhdGVKcGFFT2JqZWN0QWRhcHRlcigpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBBZGFwdGVyIGNhc2VKYXZhRU9iamVjdChKYXZhRU9iamVjdCBvYmplY3QpIHsKKwkJCXJldHVybiBjcmVhdGVKYXZhRU9iamVjdEFkYXB0ZXIoKTsKIAkJfQogCiAJCUBPdmVycmlkZQpAQCAtNjQzLDYgKzcyMSwxODggQEAKIAl9CiAKIAkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5JSmF2YUVudGl0eSA8ZW0+SUphdmEgRW50aXR5PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5JSmF2YUVudGl0eQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVJSmF2YUVudGl0eUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLklKYXZhRW1iZWRkYWJsZSA8ZW0+SUphdmEgRW1iZWRkYWJsZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSUphdmFFbWJlZGRhYmxlCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlKYXZhRW1iZWRkYWJsZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLklKYXZhTWFwcGVkU3VwZXJjbGFzcyA8ZW0+SUphdmEgTWFwcGVkIFN1cGVyY2xhc3M8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLklKYXZhTWFwcGVkU3VwZXJjbGFzcworCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVJSmF2YU1hcHBlZFN1cGVyY2xhc3NBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5JSmF2YUJhc2ljIDxlbT5JSmF2YSBCYXNpYzwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSUphdmFCYXNpYworCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVJSmF2YUJhc2ljQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSUphdmFFbWJlZGRlZCA8ZW0+SUphdmEgRW1iZWRkZWQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLklKYXZhRW1iZWRkZWQKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlSUphdmFFbWJlZGRlZEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLklKYXZhRW1iZWRkZWRJZCA8ZW0+SUphdmEgRW1iZWRkZWQgSWQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLklKYXZhRW1iZWRkZWRJZAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVJSmF2YUVtYmVkZGVkSWRBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5JSmF2YUlkIDxlbT5JSmF2YSBJZDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSUphdmFJZAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVJSmF2YUlkQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSUphdmFNYW55VG9NYW55IDxlbT5JSmF2YSBNYW55IFRvIE1hbnk8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLklKYXZhTWFueVRvTWFueQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVJSmF2YU1hbnlUb01hbnlBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5JSmF2YU1hbnlUb09uZSA8ZW0+SUphdmEgTWFueSBUbyBPbmU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLklKYXZhTWFueVRvT25lCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlKYXZhTWFueVRvT25lQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSUphdmFPbmVUb01hbnkgPGVtPklKYXZhIE9uZSBUbyBNYW55PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5JSmF2YU9uZVRvTWFueQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVJSmF2YU9uZVRvTWFueUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLklKYXZhT25lVG9PbmUgPGVtPklKYXZhIE9uZSBUbyBPbmU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLklKYXZhT25lVG9PbmUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlSUphdmFPbmVUb09uZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLklKYXZhVHJhbnNpZW50IDxlbT5JSmF2YSBUcmFuc2llbnQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLklKYXZhVHJhbnNpZW50CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlKYXZhVHJhbnNpZW50QWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSUphdmFWZXJzaW9uIDxlbT5JSmF2YSBWZXJzaW9uPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5JSmF2YVZlcnNpb24KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlSUphdmFWZXJzaW9uQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCiAJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSmF2YUVudGl0eSA8ZW0+SmF2YSBFbnRpdHk8L2VtPn0nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9tYXBwaW5ncy91dGlsL0pwYUphdmFNYXBwaW5nc1N3aXRjaC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvamF2YS9tYXBwaW5ncy91dGlsL0pwYUphdmFNYXBwaW5nc1N3aXRjaC5qYXZhCmluZGV4IGQ2MDUyYjQuLmEwYzQ4NWEgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L2phdmEvbWFwcGluZ3MvdXRpbC9KcGFKYXZhTWFwcGluZ3NTd2l0Y2guamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9qYXZhL21hcHBpbmdzL3V0aWwvSnBhSmF2YU1hcHBpbmdzU3dpdGNoLmphdmEKQEAgLTIyLDYgKzIyLDE5IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLkphdmFFT2JqZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5BYnN0cmFjdEphdmFDb2x1bW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLkFic3RyYWN0SmF2YVRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5JSmF2YUJhc2ljOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5JSmF2YUVtYmVkZGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLklKYXZhRW1iZWRkZWQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLklKYXZhRW1iZWRkZWRJZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSUphdmFFbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLklKYXZhSWQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLklKYXZhTWFueVRvTWFueTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSUphdmFNYW55VG9PbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLklKYXZhTWFwcGVkU3VwZXJjbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSUphdmFPbmVUb01hbnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLklKYXZhT25lVG9PbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLklKYXZhVHJhbnNpZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5JSmF2YVZlcnNpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLkphdmFBYnN0cmFjdFF1ZXJ5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5KYXZhQXNzb2NpYXRpb25PdmVycmlkZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSmF2YUF0dHJpYnV0ZU1hcHBpbmc7CkBAIC0xNzgsNiArMTkxLDI1NSBAQAogCSAqLwogCXByb3RlY3RlZCBUIGRvU3dpdGNoKGludCBjbGFzc2lmaWVySUQsIEVPYmplY3QgdGhlRU9iamVjdCkgewogCQlzd2l0Y2ggKGNsYXNzaWZpZXJJRCkgeworCQkJY2FzZSBKcGFKYXZhTWFwcGluZ3NQYWNrYWdlLklKQVZBX0VOVElUWSA6IHsKKwkJCQlJSmF2YUVudGl0eSBpSmF2YUVudGl0eSA9IChJSmF2YUVudGl0eSkgdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VJSmF2YUVudGl0eShpSmF2YUVudGl0eSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBjYXNlSUphdmFUeXBlTWFwcGluZyhpSmF2YUVudGl0eSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBjYXNlSUVudGl0eShpSmF2YUVudGl0eSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBjYXNlSVR5cGVNYXBwaW5nKGlKYXZhRW50aXR5KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQkJCXJlc3VsdCA9IGNhc2VJSnBhU291cmNlT2JqZWN0KGlKYXZhRW50aXR5KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQkJCXJlc3VsdCA9IGNhc2VJSnBhRU9iamVjdChpSmF2YUVudGl0eSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBKcGFKYXZhTWFwcGluZ3NQYWNrYWdlLklKQVZBX0VNQkVEREFCTEUgOiB7CisJCQkJSUphdmFFbWJlZGRhYmxlIGlKYXZhRW1iZWRkYWJsZSA9IChJSmF2YUVtYmVkZGFibGUpIHRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlSUphdmFFbWJlZGRhYmxlKGlKYXZhRW1iZWRkYWJsZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBjYXNlSUphdmFUeXBlTWFwcGluZyhpSmF2YUVtYmVkZGFibGUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUlFbWJlZGRhYmxlKGlKYXZhRW1iZWRkYWJsZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBjYXNlSVR5cGVNYXBwaW5nKGlKYXZhRW1iZWRkYWJsZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBjYXNlSUpwYVNvdXJjZU9iamVjdChpSmF2YUVtYmVkZGFibGUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUlKcGFFT2JqZWN0KGlKYXZhRW1iZWRkYWJsZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBKcGFKYXZhTWFwcGluZ3NQYWNrYWdlLklKQVZBX01BUFBFRF9TVVBFUkNMQVNTIDogeworCQkJCUlKYXZhTWFwcGVkU3VwZXJjbGFzcyBpSmF2YU1hcHBlZFN1cGVyY2xhc3MgPSAoSUphdmFNYXBwZWRTdXBlcmNsYXNzKSB0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZUlKYXZhTWFwcGVkU3VwZXJjbGFzcyhpSmF2YU1hcHBlZFN1cGVyY2xhc3MpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUlKYXZhVHlwZU1hcHBpbmcoaUphdmFNYXBwZWRTdXBlcmNsYXNzKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQkJCXJlc3VsdCA9IGNhc2VJTWFwcGVkU3VwZXJjbGFzcyhpSmF2YU1hcHBlZFN1cGVyY2xhc3MpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUlUeXBlTWFwcGluZyhpSmF2YU1hcHBlZFN1cGVyY2xhc3MpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUlKcGFTb3VyY2VPYmplY3QoaUphdmFNYXBwZWRTdXBlcmNsYXNzKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQkJCXJlc3VsdCA9IGNhc2VJSnBhRU9iamVjdChpSmF2YU1hcHBlZFN1cGVyY2xhc3MpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgSnBhSmF2YU1hcHBpbmdzUGFja2FnZS5JSkFWQV9CQVNJQyA6IHsKKwkJCQlJSmF2YUJhc2ljIGlKYXZhQmFzaWMgPSAoSUphdmFCYXNpYykgdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VJSmF2YUJhc2ljKGlKYXZhQmFzaWMpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUlKYXZhQXR0cmlidXRlTWFwcGluZyhpSmF2YUJhc2ljKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQkJCXJlc3VsdCA9IGNhc2VJQmFzaWMoaUphdmFCYXNpYyk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBjYXNlSUF0dHJpYnV0ZU1hcHBpbmcoaUphdmFCYXNpYyk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBjYXNlSUNvbHVtbk1hcHBpbmcoaUphdmFCYXNpYyk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBjYXNlSUpwYVNvdXJjZU9iamVjdChpSmF2YUJhc2ljKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQkJCXJlc3VsdCA9IGNhc2VJSnBhRU9iamVjdChpSmF2YUJhc2ljKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIEpwYUphdmFNYXBwaW5nc1BhY2thZ2UuSUpBVkFfRU1CRURERUQgOiB7CisJCQkJSUphdmFFbWJlZGRlZCBpSmF2YUVtYmVkZGVkID0gKElKYXZhRW1iZWRkZWQpIHRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlSUphdmFFbWJlZGRlZChpSmF2YUVtYmVkZGVkKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQkJCXJlc3VsdCA9IGNhc2VJSmF2YUF0dHJpYnV0ZU1hcHBpbmcoaUphdmFFbWJlZGRlZCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBjYXNlSUVtYmVkZGVkKGlKYXZhRW1iZWRkZWQpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUlBdHRyaWJ1dGVNYXBwaW5nKGlKYXZhRW1iZWRkZWQpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUlKcGFTb3VyY2VPYmplY3QoaUphdmFFbWJlZGRlZCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBjYXNlSUpwYUVPYmplY3QoaUphdmFFbWJlZGRlZCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBKcGFKYXZhTWFwcGluZ3NQYWNrYWdlLklKQVZBX0VNQkVEREVEX0lEIDogeworCQkJCUlKYXZhRW1iZWRkZWRJZCBpSmF2YUVtYmVkZGVkSWQgPSAoSUphdmFFbWJlZGRlZElkKSB0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZUlKYXZhRW1iZWRkZWRJZChpSmF2YUVtYmVkZGVkSWQpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUlKYXZhQXR0cmlidXRlTWFwcGluZyhpSmF2YUVtYmVkZGVkSWQpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUlFbWJlZGRlZElkKGlKYXZhRW1iZWRkZWRJZCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBjYXNlSUF0dHJpYnV0ZU1hcHBpbmcoaUphdmFFbWJlZGRlZElkKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQkJCXJlc3VsdCA9IGNhc2VJSnBhU291cmNlT2JqZWN0KGlKYXZhRW1iZWRkZWRJZCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBjYXNlSUpwYUVPYmplY3QoaUphdmFFbWJlZGRlZElkKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIEpwYUphdmFNYXBwaW5nc1BhY2thZ2UuSUpBVkFfSUQgOiB7CisJCQkJSUphdmFJZCBpSmF2YUlkID0gKElKYXZhSWQpIHRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlSUphdmFJZChpSmF2YUlkKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQkJCXJlc3VsdCA9IGNhc2VJSmF2YUF0dHJpYnV0ZU1hcHBpbmcoaUphdmFJZCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBjYXNlSUlkKGlKYXZhSWQpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUlBdHRyaWJ1dGVNYXBwaW5nKGlKYXZhSWQpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUlDb2x1bW5NYXBwaW5nKGlKYXZhSWQpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUlKcGFTb3VyY2VPYmplY3QoaUphdmFJZCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBjYXNlSUpwYUVPYmplY3QoaUphdmFJZCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBKcGFKYXZhTWFwcGluZ3NQYWNrYWdlLklKQVZBX01BTllfVE9fTUFOWSA6IHsKKwkJCQlJSmF2YU1hbnlUb01hbnkgaUphdmFNYW55VG9NYW55ID0gKElKYXZhTWFueVRvTWFueSkgdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VJSmF2YU1hbnlUb01hbnkoaUphdmFNYW55VG9NYW55KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQkJCXJlc3VsdCA9IGNhc2VJSmF2YUF0dHJpYnV0ZU1hcHBpbmcoaUphdmFNYW55VG9NYW55KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQkJCXJlc3VsdCA9IGNhc2VJTWFueVRvTWFueShpSmF2YU1hbnlUb01hbnkpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUlBdHRyaWJ1dGVNYXBwaW5nKGlKYXZhTWFueVRvTWFueSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBjYXNlSU11bHRpUmVsYXRpb25zaGlwTWFwcGluZyhpSmF2YU1hbnlUb01hbnkpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUlKcGFTb3VyY2VPYmplY3QoaUphdmFNYW55VG9NYW55KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQkJCXJlc3VsdCA9IGNhc2VJTm9uT3duaW5nTWFwcGluZyhpSmF2YU1hbnlUb01hbnkpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUlKcGFFT2JqZWN0KGlKYXZhTWFueVRvTWFueSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBjYXNlSVJlbGF0aW9uc2hpcE1hcHBpbmcoaUphdmFNYW55VG9NYW55KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIEpwYUphdmFNYXBwaW5nc1BhY2thZ2UuSUpBVkFfTUFOWV9UT19PTkUgOiB7CisJCQkJSUphdmFNYW55VG9PbmUgaUphdmFNYW55VG9PbmUgPSAoSUphdmFNYW55VG9PbmUpIHRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlSUphdmFNYW55VG9PbmUoaUphdmFNYW55VG9PbmUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUlKYXZhQXR0cmlidXRlTWFwcGluZyhpSmF2YU1hbnlUb09uZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBjYXNlSU1hbnlUb09uZShpSmF2YU1hbnlUb09uZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBjYXNlSUF0dHJpYnV0ZU1hcHBpbmcoaUphdmFNYW55VG9PbmUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUlTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nKGlKYXZhTWFueVRvT25lKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQkJCXJlc3VsdCA9IGNhc2VJSnBhU291cmNlT2JqZWN0KGlKYXZhTWFueVRvT25lKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQkJCXJlc3VsdCA9IGNhc2VJUmVsYXRpb25zaGlwTWFwcGluZyhpSmF2YU1hbnlUb09uZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBjYXNlSUpwYUVPYmplY3QoaUphdmFNYW55VG9PbmUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgSnBhSmF2YU1hcHBpbmdzUGFja2FnZS5JSkFWQV9PTkVfVE9fTUFOWSA6IHsKKwkJCQlJSmF2YU9uZVRvTWFueSBpSmF2YU9uZVRvTWFueSA9IChJSmF2YU9uZVRvTWFueSkgdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VJSmF2YU9uZVRvTWFueShpSmF2YU9uZVRvTWFueSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBjYXNlSUphdmFBdHRyaWJ1dGVNYXBwaW5nKGlKYXZhT25lVG9NYW55KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQkJCXJlc3VsdCA9IGNhc2VJT25lVG9NYW55KGlKYXZhT25lVG9NYW55KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQkJCXJlc3VsdCA9IGNhc2VJQXR0cmlidXRlTWFwcGluZyhpSmF2YU9uZVRvTWFueSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBjYXNlSU11bHRpUmVsYXRpb25zaGlwTWFwcGluZyhpSmF2YU9uZVRvTWFueSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBjYXNlSUpwYVNvdXJjZU9iamVjdChpSmF2YU9uZVRvTWFueSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBjYXNlSU5vbk93bmluZ01hcHBpbmcoaUphdmFPbmVUb01hbnkpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUlKcGFFT2JqZWN0KGlKYXZhT25lVG9NYW55KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQkJCXJlc3VsdCA9IGNhc2VJUmVsYXRpb25zaGlwTWFwcGluZyhpSmF2YU9uZVRvTWFueSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBKcGFKYXZhTWFwcGluZ3NQYWNrYWdlLklKQVZBX09ORV9UT19PTkUgOiB7CisJCQkJSUphdmFPbmVUb09uZSBpSmF2YU9uZVRvT25lID0gKElKYXZhT25lVG9PbmUpIHRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlSUphdmFPbmVUb09uZShpSmF2YU9uZVRvT25lKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQkJCXJlc3VsdCA9IGNhc2VJSmF2YUF0dHJpYnV0ZU1hcHBpbmcoaUphdmFPbmVUb09uZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBjYXNlSU9uZVRvT25lKGlKYXZhT25lVG9PbmUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUlBdHRyaWJ1dGVNYXBwaW5nKGlKYXZhT25lVG9PbmUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUlTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nKGlKYXZhT25lVG9PbmUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUlOb25Pd25pbmdNYXBwaW5nKGlKYXZhT25lVG9PbmUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUlKcGFTb3VyY2VPYmplY3QoaUphdmFPbmVUb09uZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBjYXNlSVJlbGF0aW9uc2hpcE1hcHBpbmcoaUphdmFPbmVUb09uZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBjYXNlSUpwYUVPYmplY3QoaUphdmFPbmVUb09uZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBKcGFKYXZhTWFwcGluZ3NQYWNrYWdlLklKQVZBX1RSQU5TSUVOVCA6IHsKKwkJCQlJSmF2YVRyYW5zaWVudCBpSmF2YVRyYW5zaWVudCA9IChJSmF2YVRyYW5zaWVudCkgdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VJSmF2YVRyYW5zaWVudChpSmF2YVRyYW5zaWVudCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBjYXNlSUphdmFBdHRyaWJ1dGVNYXBwaW5nKGlKYXZhVHJhbnNpZW50KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQkJCXJlc3VsdCA9IGNhc2VJVHJhbnNpZW50KGlKYXZhVHJhbnNpZW50KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQkJCXJlc3VsdCA9IGNhc2VJQXR0cmlidXRlTWFwcGluZyhpSmF2YVRyYW5zaWVudCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBjYXNlSUpwYVNvdXJjZU9iamVjdChpSmF2YVRyYW5zaWVudCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBjYXNlSUpwYUVPYmplY3QoaUphdmFUcmFuc2llbnQpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgSnBhSmF2YU1hcHBpbmdzUGFja2FnZS5JSkFWQV9WRVJTSU9OIDogeworCQkJCUlKYXZhVmVyc2lvbiBpSmF2YVZlcnNpb24gPSAoSUphdmFWZXJzaW9uKSB0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZUlKYXZhVmVyc2lvbihpSmF2YVZlcnNpb24pOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUlKYXZhQXR0cmlidXRlTWFwcGluZyhpSmF2YVZlcnNpb24pOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUlWZXJzaW9uKGlKYXZhVmVyc2lvbik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBjYXNlSUF0dHJpYnV0ZU1hcHBpbmcoaUphdmFWZXJzaW9uKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQkJCXJlc3VsdCA9IGNhc2VJQ29sdW1uTWFwcGluZyhpSmF2YVZlcnNpb24pOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUlKcGFTb3VyY2VPYmplY3QoaUphdmFWZXJzaW9uKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQkJCXJlc3VsdCA9IGNhc2VJSnBhRU9iamVjdChpSmF2YVZlcnNpb24pOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KIAkJCWNhc2UgSnBhSmF2YU1hcHBpbmdzUGFja2FnZS5KQVZBX1RZUEVfTUFQUElORyA6IHsKIAkJCQlKYXZhVHlwZU1hcHBpbmcgamF2YVR5cGVNYXBwaW5nID0gKEphdmFUeXBlTWFwcGluZykgdGhlRU9iamVjdDsKIAkJCQlUIHJlc3VsdCA9IGNhc2VKYXZhVHlwZU1hcHBpbmcoamF2YVR5cGVNYXBwaW5nKTsKQEAgLTIwMywxOCArNDY1LDIwIEBACiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQogCQkJCQlyZXN1bHQgPSBjYXNlSmF2YVR5cGVNYXBwaW5nKGphdmFFbnRpdHkpOwogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJcmVzdWx0ID0gY2FzZUlFbnRpdHkoamF2YUVudGl0eSk7CisJCQkJCXJlc3VsdCA9IGNhc2VJSmF2YUVudGl0eShqYXZhRW50aXR5KTsKIAkJCQlpZiAocmVzdWx0ID09IG51bGwpCiAJCQkJCXJlc3VsdCA9IGNhc2VKYXZhRU9iamVjdChqYXZhRW50aXR5KTsKIAkJCQlpZiAocmVzdWx0ID09IG51bGwpCiAJCQkJCXJlc3VsdCA9IGNhc2VJSmF2YVR5cGVNYXBwaW5nKGphdmFFbnRpdHkpOwogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJcmVzdWx0ID0gY2FzZUlUeXBlTWFwcGluZyhqYXZhRW50aXR5KTsKKwkJCQkJcmVzdWx0ID0gY2FzZUlFbnRpdHkoamF2YUVudGl0eSk7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQogCQkJCQlyZXN1bHQgPSBjYXNlSnBhRU9iamVjdChqYXZhRW50aXR5KTsKIAkJCQlpZiAocmVzdWx0ID09IG51bGwpCiAJCQkJCXJlc3VsdCA9IGNhc2VJSnBhU291cmNlT2JqZWN0KGphdmFFbnRpdHkpOwogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUlUeXBlTWFwcGluZyhqYXZhRW50aXR5KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpCiAJCQkJCXJlc3VsdCA9IGNhc2VJSnBhRU9iamVjdChqYXZhRW50aXR5KTsKIAkJCQlpZiAocmVzdWx0ID09IG51bGwpCiAJCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwpAQCAtMjI2LDE4ICs0OTAsMjAgQEAKIAkJCQlpZiAocmVzdWx0ID09IG51bGwpCiAJCQkJCXJlc3VsdCA9IGNhc2VKYXZhVHlwZU1hcHBpbmcoamF2YU1hcHBlZFN1cGVyY2xhc3MpOwogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJcmVzdWx0ID0gY2FzZUlNYXBwZWRTdXBlcmNsYXNzKGphdmFNYXBwZWRTdXBlcmNsYXNzKTsKKwkJCQkJcmVzdWx0ID0gY2FzZUlKYXZhTWFwcGVkU3VwZXJjbGFzcyhqYXZhTWFwcGVkU3VwZXJjbGFzcyk7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQogCQkJCQlyZXN1bHQgPSBjYXNlSmF2YUVPYmplY3QoamF2YU1hcHBlZFN1cGVyY2xhc3MpOwogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKIAkJCQkJcmVzdWx0ID0gY2FzZUlKYXZhVHlwZU1hcHBpbmcoamF2YU1hcHBlZFN1cGVyY2xhc3MpOwogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJcmVzdWx0ID0gY2FzZUlUeXBlTWFwcGluZyhqYXZhTWFwcGVkU3VwZXJjbGFzcyk7CisJCQkJCXJlc3VsdCA9IGNhc2VJTWFwcGVkU3VwZXJjbGFzcyhqYXZhTWFwcGVkU3VwZXJjbGFzcyk7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQogCQkJCQlyZXN1bHQgPSBjYXNlSnBhRU9iamVjdChqYXZhTWFwcGVkU3VwZXJjbGFzcyk7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQogCQkJCQlyZXN1bHQgPSBjYXNlSUpwYVNvdXJjZU9iamVjdChqYXZhTWFwcGVkU3VwZXJjbGFzcyk7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBjYXNlSVR5cGVNYXBwaW5nKGphdmFNYXBwZWRTdXBlcmNsYXNzKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpCiAJCQkJCXJlc3VsdCA9IGNhc2VJSnBhRU9iamVjdChqYXZhTWFwcGVkU3VwZXJjbGFzcyk7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQogCQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKQEAgLTI0OSwxOCArNTE1LDIwIEBACiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQogCQkJCQlyZXN1bHQgPSBjYXNlSmF2YVR5cGVNYXBwaW5nKGphdmFFbWJlZGRhYmxlKTsKIAkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCXJlc3VsdCA9IGNhc2VJRW1iZWRkYWJsZShqYXZhRW1iZWRkYWJsZSk7CisJCQkJCXJlc3VsdCA9IGNhc2VJSmF2YUVtYmVkZGFibGUoamF2YUVtYmVkZGFibGUpOwogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKIAkJCQkJcmVzdWx0ID0gY2FzZUphdmFFT2JqZWN0KGphdmFFbWJlZGRhYmxlKTsKIAkJCQlpZiAocmVzdWx0ID09IG51bGwpCiAJCQkJCXJlc3VsdCA9IGNhc2VJSmF2YVR5cGVNYXBwaW5nKGphdmFFbWJlZGRhYmxlKTsKIAkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCXJlc3VsdCA9IGNhc2VJVHlwZU1hcHBpbmcoamF2YUVtYmVkZGFibGUpOworCQkJCQlyZXN1bHQgPSBjYXNlSUVtYmVkZGFibGUoamF2YUVtYmVkZGFibGUpOwogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKIAkJCQkJcmVzdWx0ID0gY2FzZUpwYUVPYmplY3QoamF2YUVtYmVkZGFibGUpOwogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKIAkJCQkJcmVzdWx0ID0gY2FzZUlKcGFTb3VyY2VPYmplY3QoamF2YUVtYmVkZGFibGUpOwogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUlUeXBlTWFwcGluZyhqYXZhRW1iZWRkYWJsZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQogCQkJCQlyZXN1bHQgPSBjYXNlSUpwYUVPYmplY3QoamF2YUVtYmVkZGFibGUpOwogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKIAkJCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CkBAIC0zMTIsMjAgKzU4MCwyMiBAQAogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKIAkJCQkJcmVzdWx0ID0gY2FzZUphdmFBdHRyaWJ1dGVNYXBwaW5nKGphdmFCYXNpYyk7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQlyZXN1bHQgPSBjYXNlSUJhc2ljKGphdmFCYXNpYyk7CisJCQkJCXJlc3VsdCA9IGNhc2VJSmF2YUJhc2ljKGphdmFCYXNpYyk7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQogCQkJCQlyZXN1bHQgPSBjYXNlSmF2YUVPYmplY3QoamF2YUJhc2ljKTsKIAkJCQlpZiAocmVzdWx0ID09IG51bGwpCiAJCQkJCXJlc3VsdCA9IGNhc2VJSmF2YUF0dHJpYnV0ZU1hcHBpbmcoamF2YUJhc2ljKTsKIAkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCXJlc3VsdCA9IGNhc2VJQXR0cmlidXRlTWFwcGluZyhqYXZhQmFzaWMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJcmVzdWx0ID0gY2FzZUlDb2x1bW5NYXBwaW5nKGphdmFCYXNpYyk7CisJCQkJCXJlc3VsdCA9IGNhc2VJQmFzaWMoamF2YUJhc2ljKTsKIAkJCQlpZiAocmVzdWx0ID09IG51bGwpCiAJCQkJCXJlc3VsdCA9IGNhc2VKcGFFT2JqZWN0KGphdmFCYXNpYyk7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQogCQkJCQlyZXN1bHQgPSBjYXNlSUpwYVNvdXJjZU9iamVjdChqYXZhQmFzaWMpOwogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUlBdHRyaWJ1dGVNYXBwaW5nKGphdmFCYXNpYyk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBjYXNlSUNvbHVtbk1hcHBpbmcoamF2YUJhc2ljKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpCiAJCQkJCXJlc3VsdCA9IGNhc2VJSnBhRU9iamVjdChqYXZhQmFzaWMpOwogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKIAkJCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CkBAIC0zMzcsMjAgKzYwNywyMiBAQAogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKIAkJCQkJcmVzdWx0ID0gY2FzZUphdmFBdHRyaWJ1dGVNYXBwaW5nKGphdmFJZCk7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQlyZXN1bHQgPSBjYXNlSUlkKGphdmFJZCk7CisJCQkJCXJlc3VsdCA9IGNhc2VJSmF2YUlkKGphdmFJZCk7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQogCQkJCQlyZXN1bHQgPSBjYXNlSmF2YUVPYmplY3QoamF2YUlkKTsKIAkJCQlpZiAocmVzdWx0ID09IG51bGwpCiAJCQkJCXJlc3VsdCA9IGNhc2VJSmF2YUF0dHJpYnV0ZU1hcHBpbmcoamF2YUlkKTsKIAkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCXJlc3VsdCA9IGNhc2VJQXR0cmlidXRlTWFwcGluZyhqYXZhSWQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJcmVzdWx0ID0gY2FzZUlDb2x1bW5NYXBwaW5nKGphdmFJZCk7CisJCQkJCXJlc3VsdCA9IGNhc2VJSWQoamF2YUlkKTsKIAkJCQlpZiAocmVzdWx0ID09IG51bGwpCiAJCQkJCXJlc3VsdCA9IGNhc2VKcGFFT2JqZWN0KGphdmFJZCk7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQogCQkJCQlyZXN1bHQgPSBjYXNlSUpwYVNvdXJjZU9iamVjdChqYXZhSWQpOwogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUlBdHRyaWJ1dGVNYXBwaW5nKGphdmFJZCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBjYXNlSUNvbHVtbk1hcHBpbmcoamF2YUlkKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpCiAJCQkJCXJlc3VsdCA9IGNhc2VJSnBhRU9iamVjdChqYXZhSWQpOwogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKIAkJCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CkBAIC0zNjIsMTggKzYzNCwyMCBAQAogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKIAkJCQkJcmVzdWx0ID0gY2FzZUphdmFBdHRyaWJ1dGVNYXBwaW5nKGphdmFUcmFuc2llbnQpOwogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJcmVzdWx0ID0gY2FzZUlUcmFuc2llbnQoamF2YVRyYW5zaWVudCk7CisJCQkJCXJlc3VsdCA9IGNhc2VJSmF2YVRyYW5zaWVudChqYXZhVHJhbnNpZW50KTsKIAkJCQlpZiAocmVzdWx0ID09IG51bGwpCiAJCQkJCXJlc3VsdCA9IGNhc2VKYXZhRU9iamVjdChqYXZhVHJhbnNpZW50KTsKIAkJCQlpZiAocmVzdWx0ID09IG51bGwpCiAJCQkJCXJlc3VsdCA9IGNhc2VJSmF2YUF0dHJpYnV0ZU1hcHBpbmcoamF2YVRyYW5zaWVudCk7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQlyZXN1bHQgPSBjYXNlSUF0dHJpYnV0ZU1hcHBpbmcoamF2YVRyYW5zaWVudCk7CisJCQkJCXJlc3VsdCA9IGNhc2VJVHJhbnNpZW50KGphdmFUcmFuc2llbnQpOwogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKIAkJCQkJcmVzdWx0ID0gY2FzZUpwYUVPYmplY3QoamF2YVRyYW5zaWVudCk7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQogCQkJCQlyZXN1bHQgPSBjYXNlSUpwYVNvdXJjZU9iamVjdChqYXZhVHJhbnNpZW50KTsKIAkJCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQkJCXJlc3VsdCA9IGNhc2VJQXR0cmlidXRlTWFwcGluZyhqYXZhVHJhbnNpZW50KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpCiAJCQkJCXJlc3VsdCA9IGNhc2VJSnBhRU9iamVjdChqYXZhVHJhbnNpZW50KTsKIAkJCQlpZiAocmVzdWx0ID09IG51bGwpCiAJCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwpAQCAtMzg1LDIwICs2NTksMjIgQEAKIAkJCQlpZiAocmVzdWx0ID09IG51bGwpCiAJCQkJCXJlc3VsdCA9IGNhc2VKYXZhQXR0cmlidXRlTWFwcGluZyhqYXZhVmVyc2lvbik7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQlyZXN1bHQgPSBjYXNlSVZlcnNpb24oamF2YVZlcnNpb24pOworCQkJCQlyZXN1bHQgPSBjYXNlSUphdmFWZXJzaW9uKGphdmFWZXJzaW9uKTsKIAkJCQlpZiAocmVzdWx0ID09IG51bGwpCiAJCQkJCXJlc3VsdCA9IGNhc2VKYXZhRU9iamVjdChqYXZhVmVyc2lvbik7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQogCQkJCQlyZXN1bHQgPSBjYXNlSUphdmFBdHRyaWJ1dGVNYXBwaW5nKGphdmFWZXJzaW9uKTsKIAkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCXJlc3VsdCA9IGNhc2VJQXR0cmlidXRlTWFwcGluZyhqYXZhVmVyc2lvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQlyZXN1bHQgPSBjYXNlSUNvbHVtbk1hcHBpbmcoamF2YVZlcnNpb24pOworCQkJCQlyZXN1bHQgPSBjYXNlSVZlcnNpb24oamF2YVZlcnNpb24pOwogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKIAkJCQkJcmVzdWx0ID0gY2FzZUpwYUVPYmplY3QoamF2YVZlcnNpb24pOwogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKIAkJCQkJcmVzdWx0ID0gY2FzZUlKcGFTb3VyY2VPYmplY3QoamF2YVZlcnNpb24pOwogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUlBdHRyaWJ1dGVNYXBwaW5nKGphdmFWZXJzaW9uKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQkJCXJlc3VsdCA9IGNhc2VJQ29sdW1uTWFwcGluZyhqYXZhVmVyc2lvbik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQogCQkJCQlyZXN1bHQgPSBjYXNlSUpwYUVPYmplY3QoamF2YVZlcnNpb24pOwogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKIAkJCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CkBAIC00MTAsMTggKzY4NiwyMCBAQAogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKIAkJCQkJcmVzdWx0ID0gY2FzZUphdmFBdHRyaWJ1dGVNYXBwaW5nKGphdmFFbWJlZGRlZElkKTsKIAkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCXJlc3VsdCA9IGNhc2VJRW1iZWRkZWRJZChqYXZhRW1iZWRkZWRJZCk7CisJCQkJCXJlc3VsdCA9IGNhc2VJSmF2YUVtYmVkZGVkSWQoamF2YUVtYmVkZGVkSWQpOwogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKIAkJCQkJcmVzdWx0ID0gY2FzZUphdmFFT2JqZWN0KGphdmFFbWJlZGRlZElkKTsKIAkJCQlpZiAocmVzdWx0ID09IG51bGwpCiAJCQkJCXJlc3VsdCA9IGNhc2VJSmF2YUF0dHJpYnV0ZU1hcHBpbmcoamF2YUVtYmVkZGVkSWQpOwogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJcmVzdWx0ID0gY2FzZUlBdHRyaWJ1dGVNYXBwaW5nKGphdmFFbWJlZGRlZElkKTsKKwkJCQkJcmVzdWx0ID0gY2FzZUlFbWJlZGRlZElkKGphdmFFbWJlZGRlZElkKTsKIAkJCQlpZiAocmVzdWx0ID09IG51bGwpCiAJCQkJCXJlc3VsdCA9IGNhc2VKcGFFT2JqZWN0KGphdmFFbWJlZGRlZElkKTsKIAkJCQlpZiAocmVzdWx0ID09IG51bGwpCiAJCQkJCXJlc3VsdCA9IGNhc2VJSnBhU291cmNlT2JqZWN0KGphdmFFbWJlZGRlZElkKTsKIAkJCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQkJCXJlc3VsdCA9IGNhc2VJQXR0cmlidXRlTWFwcGluZyhqYXZhRW1iZWRkZWRJZCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQogCQkJCQlyZXN1bHQgPSBjYXNlSUpwYUVPYmplY3QoamF2YUVtYmVkZGVkSWQpOwogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKIAkJCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CkBAIC00MzMsMTggKzcxMSwyMCBAQAogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKIAkJCQkJcmVzdWx0ID0gY2FzZUphdmFBdHRyaWJ1dGVNYXBwaW5nKGphdmFFbWJlZGRlZCk7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQlyZXN1bHQgPSBjYXNlSUVtYmVkZGVkKGphdmFFbWJlZGRlZCk7CisJCQkJCXJlc3VsdCA9IGNhc2VJSmF2YUVtYmVkZGVkKGphdmFFbWJlZGRlZCk7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQogCQkJCQlyZXN1bHQgPSBjYXNlSmF2YUVPYmplY3QoamF2YUVtYmVkZGVkKTsKIAkJCQlpZiAocmVzdWx0ID09IG51bGwpCiAJCQkJCXJlc3VsdCA9IGNhc2VJSmF2YUF0dHJpYnV0ZU1hcHBpbmcoamF2YUVtYmVkZGVkKTsKIAkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCXJlc3VsdCA9IGNhc2VJQXR0cmlidXRlTWFwcGluZyhqYXZhRW1iZWRkZWQpOworCQkJCQlyZXN1bHQgPSBjYXNlSUVtYmVkZGVkKGphdmFFbWJlZGRlZCk7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQogCQkJCQlyZXN1bHQgPSBjYXNlSnBhRU9iamVjdChqYXZhRW1iZWRkZWQpOwogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKIAkJCQkJcmVzdWx0ID0gY2FzZUlKcGFTb3VyY2VPYmplY3QoamF2YUVtYmVkZGVkKTsKIAkJCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQkJCXJlc3VsdCA9IGNhc2VJQXR0cmlidXRlTWFwcGluZyhqYXZhRW1iZWRkZWQpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKIAkJCQkJcmVzdWx0ID0gY2FzZUlKcGFFT2JqZWN0KGphdmFFbWJlZGRlZCk7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQogCQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKQEAgLTUwNiwyNiArNzg2LDI4IEBACiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQogCQkJCQlyZXN1bHQgPSBjYXNlSmF2YVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcoamF2YU1hbnlUb09uZSk7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQlyZXN1bHQgPSBjYXNlSU1hbnlUb09uZShqYXZhTWFueVRvT25lKTsKKwkJCQkJcmVzdWx0ID0gY2FzZUlKYXZhTWFueVRvT25lKGphdmFNYW55VG9PbmUpOwogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKIAkJCQkJcmVzdWx0ID0gY2FzZUphdmFSZWxhdGlvbnNoaXBNYXBwaW5nKGphdmFNYW55VG9PbmUpOwogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKIAkJCQkJcmVzdWx0ID0gY2FzZUlTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nKGphdmFNYW55VG9PbmUpOwogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUlKYXZhQXR0cmlidXRlTWFwcGluZyhqYXZhTWFueVRvT25lKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQkJCXJlc3VsdCA9IGNhc2VJTWFueVRvT25lKGphdmFNYW55VG9PbmUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKIAkJCQkJcmVzdWx0ID0gY2FzZUphdmFBdHRyaWJ1dGVNYXBwaW5nKGphdmFNYW55VG9PbmUpOwogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKIAkJCQkJcmVzdWx0ID0gY2FzZUlSZWxhdGlvbnNoaXBNYXBwaW5nKGphdmFNYW55VG9PbmUpOwogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJcmVzdWx0ID0gY2FzZUphdmFFT2JqZWN0KGphdmFNYW55VG9PbmUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJcmVzdWx0ID0gY2FzZUlKYXZhQXR0cmlidXRlTWFwcGluZyhqYXZhTWFueVRvT25lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpCiAJCQkJCXJlc3VsdCA9IGNhc2VJQXR0cmlidXRlTWFwcGluZyhqYXZhTWFueVRvT25lKTsKIAkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCXJlc3VsdCA9IGNhc2VKcGFFT2JqZWN0KGphdmFNYW55VG9PbmUpOworCQkJCQlyZXN1bHQgPSBjYXNlSmF2YUVPYmplY3QoamF2YU1hbnlUb09uZSk7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQogCQkJCQlyZXN1bHQgPSBjYXNlSUpwYVNvdXJjZU9iamVjdChqYXZhTWFueVRvT25lKTsKIAkJCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQkJCXJlc3VsdCA9IGNhc2VKcGFFT2JqZWN0KGphdmFNYW55VG9PbmUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKIAkJCQkJcmVzdWx0ID0gY2FzZUlKcGFFT2JqZWN0KGphdmFNYW55VG9PbmUpOwogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKIAkJCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CkBAIC01MzcsMjggKzgxOSwzMCBAQAogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKIAkJCQkJcmVzdWx0ID0gY2FzZUphdmFTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nKGphdmFPbmVUb09uZSk7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQlyZXN1bHQgPSBjYXNlSU9uZVRvT25lKGphdmFPbmVUb09uZSk7CisJCQkJCXJlc3VsdCA9IGNhc2VJSmF2YU9uZVRvT25lKGphdmFPbmVUb09uZSk7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQogCQkJCQlyZXN1bHQgPSBjYXNlSmF2YVJlbGF0aW9uc2hpcE1hcHBpbmcoamF2YU9uZVRvT25lKTsKIAkJCQlpZiAocmVzdWx0ID09IG51bGwpCiAJCQkJCXJlc3VsdCA9IGNhc2VJU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZyhqYXZhT25lVG9PbmUpOwogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJcmVzdWx0ID0gY2FzZUlOb25Pd25pbmdNYXBwaW5nKGphdmFPbmVUb09uZSk7CisJCQkJCXJlc3VsdCA9IGNhc2VJSmF2YUF0dHJpYnV0ZU1hcHBpbmcoamF2YU9uZVRvT25lKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQkJCXJlc3VsdCA9IGNhc2VJT25lVG9PbmUoamF2YU9uZVRvT25lKTsKIAkJCQlpZiAocmVzdWx0ID09IG51bGwpCiAJCQkJCXJlc3VsdCA9IGNhc2VKYXZhQXR0cmlidXRlTWFwcGluZyhqYXZhT25lVG9PbmUpOwogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKIAkJCQkJcmVzdWx0ID0gY2FzZUlSZWxhdGlvbnNoaXBNYXBwaW5nKGphdmFPbmVUb09uZSk7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQlyZXN1bHQgPSBjYXNlSmF2YUVPYmplY3QoamF2YU9uZVRvT25lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCXJlc3VsdCA9IGNhc2VJSmF2YUF0dHJpYnV0ZU1hcHBpbmcoamF2YU9uZVRvT25lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpCiAJCQkJCXJlc3VsdCA9IGNhc2VJQXR0cmlidXRlTWFwcGluZyhqYXZhT25lVG9PbmUpOwogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJcmVzdWx0ID0gY2FzZUpwYUVPYmplY3QoamF2YU9uZVRvT25lKTsKKwkJCQkJcmVzdWx0ID0gY2FzZUlOb25Pd25pbmdNYXBwaW5nKGphdmFPbmVUb09uZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBjYXNlSmF2YUVPYmplY3QoamF2YU9uZVRvT25lKTsKIAkJCQlpZiAocmVzdWx0ID09IG51bGwpCiAJCQkJCXJlc3VsdCA9IGNhc2VJSnBhU291cmNlT2JqZWN0KGphdmFPbmVUb09uZSk7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBjYXNlSnBhRU9iamVjdChqYXZhT25lVG9PbmUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKIAkJCQkJcmVzdWx0ID0gY2FzZUlKcGFFT2JqZWN0KGphdmFPbmVUb09uZSk7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQogCQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKQEAgLTU5OSwyOCArODgzLDMwIEBACiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQogCQkJCQlyZXN1bHQgPSBjYXNlSmF2YU11bHRpUmVsYXRpb25zaGlwTWFwcGluZyhqYXZhT25lVG9NYW55KTsKIAkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCXJlc3VsdCA9IGNhc2VJT25lVG9NYW55KGphdmFPbmVUb01hbnkpOworCQkJCQlyZXN1bHQgPSBjYXNlSUphdmFPbmVUb01hbnkoamF2YU9uZVRvTWFueSk7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQogCQkJCQlyZXN1bHQgPSBjYXNlSmF2YVJlbGF0aW9uc2hpcE1hcHBpbmcoamF2YU9uZVRvTWFueSk7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQogCQkJCQlyZXN1bHQgPSBjYXNlSU11bHRpUmVsYXRpb25zaGlwTWFwcGluZyhqYXZhT25lVG9NYW55KTsKIAkJCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQkJCXJlc3VsdCA9IGNhc2VJSmF2YUF0dHJpYnV0ZU1hcHBpbmcoamF2YU9uZVRvTWFueSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBjYXNlSU9uZVRvTWFueShqYXZhT25lVG9NYW55KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpCiAJCQkJCXJlc3VsdCA9IGNhc2VKYXZhQXR0cmlidXRlTWFwcGluZyhqYXZhT25lVG9NYW55KTsKIAkJCQlpZiAocmVzdWx0ID09IG51bGwpCiAJCQkJCXJlc3VsdCA9IGNhc2VJUmVsYXRpb25zaGlwTWFwcGluZyhqYXZhT25lVG9NYW55KTsKIAkJCQlpZiAocmVzdWx0ID09IG51bGwpCiAJCQkJCXJlc3VsdCA9IGNhc2VJTm9uT3duaW5nTWFwcGluZyhqYXZhT25lVG9NYW55KTsKIAkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCXJlc3VsdCA9IGNhc2VKYXZhRU9iamVjdChqYXZhT25lVG9NYW55KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCXJlc3VsdCA9IGNhc2VJSmF2YUF0dHJpYnV0ZU1hcHBpbmcoamF2YU9uZVRvTWFueSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKQogCQkJCQlyZXN1bHQgPSBjYXNlSUF0dHJpYnV0ZU1hcHBpbmcoamF2YU9uZVRvTWFueSk7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQlyZXN1bHQgPSBjYXNlSnBhRU9iamVjdChqYXZhT25lVG9NYW55KTsKKwkJCQkJcmVzdWx0ID0gY2FzZUphdmFFT2JqZWN0KGphdmFPbmVUb01hbnkpOwogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKIAkJCQkJcmVzdWx0ID0gY2FzZUlKcGFTb3VyY2VPYmplY3QoamF2YU9uZVRvTWFueSk7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBjYXNlSnBhRU9iamVjdChqYXZhT25lVG9NYW55KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpCiAJCQkJCXJlc3VsdCA9IGNhc2VJSnBhRU9iamVjdChqYXZhT25lVG9NYW55KTsKIAkJCQlpZiAocmVzdWx0ID09IG51bGwpCiAJCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwpAQCAtNjMyLDI4ICs5MTgsMzAgQEAKIAkJCQlpZiAocmVzdWx0ID09IG51bGwpCiAJCQkJCXJlc3VsdCA9IGNhc2VKYXZhTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nKGphdmFNYW55VG9NYW55KTsKIAkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCXJlc3VsdCA9IGNhc2VJTWFueVRvTWFueShqYXZhTWFueVRvTWFueSk7CisJCQkJCXJlc3VsdCA9IGNhc2VJSmF2YU1hbnlUb01hbnkoamF2YU1hbnlUb01hbnkpOwogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKIAkJCQkJcmVzdWx0ID0gY2FzZUphdmFSZWxhdGlvbnNoaXBNYXBwaW5nKGphdmFNYW55VG9NYW55KTsKIAkJCQlpZiAocmVzdWx0ID09IG51bGwpCiAJCQkJCXJlc3VsdCA9IGNhc2VJTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nKGphdmFNYW55VG9NYW55KTsKIAkJCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQkJCXJlc3VsdCA9IGNhc2VJSmF2YUF0dHJpYnV0ZU1hcHBpbmcoamF2YU1hbnlUb01hbnkpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUlNYW55VG9NYW55KGphdmFNYW55VG9NYW55KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpCiAJCQkJCXJlc3VsdCA9IGNhc2VKYXZhQXR0cmlidXRlTWFwcGluZyhqYXZhTWFueVRvTWFueSk7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQogCQkJCQlyZXN1bHQgPSBjYXNlSVJlbGF0aW9uc2hpcE1hcHBpbmcoamF2YU1hbnlUb01hbnkpOwogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKIAkJCQkJcmVzdWx0ID0gY2FzZUlOb25Pd25pbmdNYXBwaW5nKGphdmFNYW55VG9NYW55KTsKIAkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCXJlc3VsdCA9IGNhc2VKYXZhRU9iamVjdChqYXZhTWFueVRvTWFueSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQlyZXN1bHQgPSBjYXNlSUphdmFBdHRyaWJ1dGVNYXBwaW5nKGphdmFNYW55VG9NYW55KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpCiAJCQkJCXJlc3VsdCA9IGNhc2VJQXR0cmlidXRlTWFwcGluZyhqYXZhTWFueVRvTWFueSk7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQlyZXN1bHQgPSBjYXNlSnBhRU9iamVjdChqYXZhTWFueVRvTWFueSk7CisJCQkJCXJlc3VsdCA9IGNhc2VKYXZhRU9iamVjdChqYXZhTWFueVRvTWFueSk7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQogCQkJCQlyZXN1bHQgPSBjYXNlSUpwYVNvdXJjZU9iamVjdChqYXZhTWFueVRvTWFueSk7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBjYXNlSnBhRU9iamVjdChqYXZhTWFueVRvTWFueSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQogCQkJCQlyZXN1bHQgPSBjYXNlSUpwYUVPYmplY3QoamF2YU1hbnlUb01hbnkpOwogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKIAkJCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CkBAIC0xMTQ1LDYgKzE0MzMsMjAxIEBACiAJfQogCiAJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUphdmEgRW50aXR5PC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUphdmEgRW50aXR5PC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlSUphdmFFbnRpdHkoSUphdmFFbnRpdHkgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklKYXZhIEVtYmVkZGFibGU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JSmF2YSBFbWJlZGRhYmxlPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlSUphdmFFbWJlZGRhYmxlKElKYXZhRW1iZWRkYWJsZSBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUphdmEgTWFwcGVkIFN1cGVyY2xhc3M8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JSmF2YSBNYXBwZWQgU3VwZXJjbGFzczwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZUlKYXZhTWFwcGVkU3VwZXJjbGFzcyhJSmF2YU1hcHBlZFN1cGVyY2xhc3Mgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklKYXZhIEJhc2ljPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUphdmEgQmFzaWM8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VJSmF2YUJhc2ljKElKYXZhQmFzaWMgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklKYXZhIEVtYmVkZGVkPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUphdmEgRW1iZWRkZWQ8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VJSmF2YUVtYmVkZGVkKElKYXZhRW1iZWRkZWQgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklKYXZhIEVtYmVkZGVkIElkPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUphdmEgRW1iZWRkZWQgSWQ8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VJSmF2YUVtYmVkZGVkSWQoSUphdmFFbWJlZGRlZElkIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JSmF2YSBJZDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklKYXZhIElkPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlSUphdmFJZChJSmF2YUlkIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JSmF2YSBNYW55IFRvIE1hbnk8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JSmF2YSBNYW55IFRvIE1hbnk8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VJSmF2YU1hbnlUb01hbnkoSUphdmFNYW55VG9NYW55IG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JSmF2YSBNYW55IFRvIE9uZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklKYXZhIE1hbnkgVG8gT25lPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlSUphdmFNYW55VG9PbmUoSUphdmFNYW55VG9PbmUgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklKYXZhIE9uZSBUbyBNYW55PC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUphdmEgT25lIFRvIE1hbnk8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VJSmF2YU9uZVRvTWFueShJSmF2YU9uZVRvTWFueSBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUphdmEgT25lIFRvIE9uZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklKYXZhIE9uZSBUbyBPbmU8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VJSmF2YU9uZVRvT25lKElKYXZhT25lVG9PbmUgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklKYXZhIFRyYW5zaWVudDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklKYXZhIFRyYW5zaWVudDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZUlKYXZhVHJhbnNpZW50KElKYXZhVHJhbnNpZW50IG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JSmF2YSBWZXJzaW9uPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUphdmEgVmVyc2lvbjwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZUlKYXZhVmVyc2lvbihJSmF2YVZlcnNpb24gb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgogCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkphdmEgRW50aXR5PC9lbT4nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9vcm0vT3JtUGFja2FnZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvb3JtL09ybVBhY2thZ2UuamF2YQppbmRleCA2NDk0YTZlLi4xMGU1ZDJkIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9vcm0vT3JtUGFja2FnZS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L29ybS9Pcm1QYWNrYWdlLmphdmEKQEAgLTM1ODIsMTMgKzM1ODIsMzEgQEAKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09MVU1OX19MRU5HVEggPSBBQlNUUkFDVF9YTUxfQ09MVU1OX0ZFQVRVUkVfQ09VTlQgKyAwOwogCiAJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNwZWNpZmllZCBMZW5ndGg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT0xVTU5fX1NQRUNJRklFRF9MRU5HVEggPSBBQlNUUkFDVF9YTUxfQ09MVU1OX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWNpc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTFVNTl9fUFJFQ0lTSU9OID0gQUJTVFJBQ1RfWE1MX0NPTFVNTl9GRUFUVVJFX0NPVU5UICsgMTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09MVU1OX19QUkVDSVNJT04gPSBBQlNUUkFDVF9YTUxfQ09MVU1OX0ZFQVRVUkVfQ09VTlQgKyAyOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNwZWNpZmllZCBQcmVjaXNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT0xVTU5fX1NQRUNJRklFRF9QUkVDSVNJT04gPSBBQlNUUkFDVF9YTUxfQ09MVU1OX0ZFQVRVUkVfQ09VTlQgKyAzOwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNjYWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCkBAIC0zNTk3LDcgKzM2MTUsMTYgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09MVU1OX19TQ0FMRSA9IEFCU1RSQUNUX1hNTF9DT0xVTU5fRkVBVFVSRV9DT1VOVCArIDI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTFVNTl9fU0NBTEUgPSBBQlNUUkFDVF9YTUxfQ09MVU1OX0ZFQVRVUkVfQ09VTlQgKyA0OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNwZWNpZmllZCBTY2FsZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTFVNTl9fU1BFQ0lGSUVEX1NDQUxFID0gQUJTVFJBQ1RfWE1MX0NPTFVNTl9GRUFUVVJFX0NPVU5UICsgNTsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MZW5ndGggRm9yIFhtbDwvYj48L2VtPicgYXR0cmlidXRlLgpAQCAtMzYwNiw3ICszNjMzLDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09MVU1OX19MRU5HVEhfRk9SX1hNTCA9IEFCU1RSQUNUX1hNTF9DT0xVTU5fRkVBVFVSRV9DT1VOVCArIDM7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTFVNTl9fTEVOR1RIX0ZPUl9YTUwgPSBBQlNUUkFDVF9YTUxfQ09MVU1OX0ZFQVRVUkVfQ09VTlQgKyA2OwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWNpc2lvbiBGb3IgWG1sPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCkBAIC0zNjE1LDcgKzM2NDIsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT0xVTU5fX1BSRUNJU0lPTl9GT1JfWE1MID0gQUJTVFJBQ1RfWE1MX0NPTFVNTl9GRUFUVVJFX0NPVU5UICsgNDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09MVU1OX19QUkVDSVNJT05fRk9SX1hNTCA9IEFCU1RSQUNUX1hNTF9DT0xVTU5fRkVBVFVSRV9DT1VOVCArIDc7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2NhbGUgRm9yIFhtbDwvYj48L2VtPicgYXR0cmlidXRlLgpAQCAtMzYyNCw3ICszNjUxLDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09MVU1OX19TQ0FMRV9GT1JfWE1MID0gQUJTVFJBQ1RfWE1MX0NPTFVNTl9GRUFUVVJFX0NPVU5UICsgNTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09MVU1OX19TQ0FMRV9GT1JfWE1MID0gQUJTVFJBQ1RfWE1MX0NPTFVNTl9GRUFUVVJFX0NPVU5UICsgODsKIAogCS8qKgogCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgQ29sdW1uPC9lbT4nIGNsYXNzLgpAQCAtMzYzMyw3ICszNjYwLDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09MVU1OX0ZFQVRVUkVfQ09VTlQgPSBBQlNUUkFDVF9YTUxfQ09MVU1OX0ZFQVRVUkVfQ09VTlQgKyA2OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT0xVTU5fRkVBVFVSRV9DT1VOVCA9IEFCU1RSQUNUX1hNTF9DT0xVTU5fRkVBVFVSRV9DT1VOVCArIDk7CiAKIAkvKioKIAkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQub3JtLlhtbEpvaW5Db2x1bW4gPGVtPlhtbCBKb2luIENvbHVtbjwvZW0+fScgY2xhc3MuCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9vcm0vT3JtWG1sSnBhRmlsZUNvbnRlbnRQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvb3JtL09ybVhtbEpwYUZpbGVDb250ZW50UHJvdmlkZXIuamF2YQppbmRleCBiYzFhZWVmLi5jODVlYzljIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9vcm0vT3JtWG1sSnBhRmlsZUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L29ybS9Pcm1YbWxKcGFGaWxlQ29udGVudFByb3ZpZGVyLmphdmEKQEAgLTEsOCArMSw4IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24gYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgogICogCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCkBAIC0xMSw2ICsxMSw3IEBACiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKKwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwpAQCAtMTksNiArMjAsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSUpwYUZpbGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSUpwYUZpbGVDb250ZW50UHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSUpwYVJvb3RDb250ZW50Tm9kZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5KcHRDb3JlUGx1Z2luOwpAQCAtMjYsMzIgKzI4LDM4IEBACiAKIHB1YmxpYyBjbGFzcyBPcm1YbWxKcGFGaWxlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSUpwYUZpbGVDb250ZW50UHJvdmlkZXIKIHsKLQlwdWJsaWMgc3RhdGljIE9ybVhtbEpwYUZpbGVDb250ZW50UHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgT3JtWG1sSnBhRmlsZUNvbnRlbnRQcm92aWRlcigpOworCS8vc2luZ2xldG9uCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgT3JtWG1sSnBhRmlsZUNvbnRlbnRQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBPcm1YbWxKcGFGaWxlQ29udGVudFByb3ZpZGVyKCk7CiAJCi0JCi0JcHJpdmF0ZSBJRmlsZSByZXNvdXJjZUZpbGU7CisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCisJICovCisJcHVibGljIHN0YXRpYyBJSnBhRmlsZUNvbnRlbnRQcm92aWRlciBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KIAkKIAkKIAkvKioKIAkgKiBSZXN0cmljdCBhY2Nlc3MKIAkgKi8KIAlwcml2YXRlIE9ybVhtbEpwYUZpbGVDb250ZW50UHJvdmlkZXIoKSB7Ci0JCQorCQlzdXBlcigpOwogCX0KIAotCXB1YmxpYyBJSnBhUm9vdENvbnRlbnROb2RlIGJ1aWxkUm9vdENvbnRlbnQoSUZpbGUgcmVzb3VyY2VGaWxlKSB7CisJcHVibGljIElKcGFSb290Q29udGVudE5vZGUgYnVpbGRSb290Q29udGVudChJSnBhRmlsZSBqcGFGaWxlKSB7CisJCUlGaWxlIHJlc291cmNlRmlsZSA9IGpwYUZpbGUuZ2V0RmlsZSgpOwogCQlPcm1YbWxSZXNvdXJjZUZhY3RvcnkucmVnaXN0ZXIoKTsKLQkJdGhpcy5yZXNvdXJjZUZpbGUgPSByZXNvdXJjZUZpbGU7Ci0JCVVSSSBmaWxlVVJJID0gVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkocmVzb3VyY2VGaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7CisJCVVSSSBmaWxlVVJJID0gVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkocmVzb3VyY2VGaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSwgdHJ1ZSk7CiAJCU9ybVhtbFJlc291cmNlIHJlc291cmNlID0gKE9ybVhtbFJlc291cmNlKSBnZXRSZXNvdXJjZVNldChyZXNvdXJjZUZpbGUpLmdldFJlc291cmNlKGZpbGVVUkksIHRydWUpOwogCQlYbWxSb290Q29udGVudE5vZGUgcm9vdCA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFJvb3RDb250ZW50Tm9kZSgpOworCQlqcGFGaWxlLnNldENvbnRlbnQocm9vdCk7CiAJCXJvb3Quc2V0RW50aXR5TWFwcGluZ3MocmVzb3VyY2UuZ2V0WG1sRmlsZUNvbnRlbnQoKSk7Ci0JCXJlc291cmNlLmVBZGFwdGVycygpLmFkZChidWlsZFJvb3ROb2RlTGlzdGVuZXIocm9vdCkpOworCQlyZXNvdXJjZS5lQWRhcHRlcnMoKS5hZGQoYnVpbGRSb290Tm9kZUxpc3RlbmVyKHJlc291cmNlRmlsZSwgcm9vdCkpOwogCQlyZXR1cm4gcm9vdDsKIAl9CiAJCi0JcHJpdmF0ZSBBZGFwdGVyIGJ1aWxkUm9vdE5vZGVMaXN0ZW5lcihYbWxSb290Q29udGVudE5vZGUgcm9vdCkgewotCQlyZXR1cm4gbmV3IFJvb3RBZGFwdGVyKHJvb3QpOworCXByaXZhdGUgQWRhcHRlciBidWlsZFJvb3ROb2RlTGlzdGVuZXIoSUZpbGUgcmVzb3VyY2VGaWxlLCBYbWxSb290Q29udGVudE5vZGUgcm9vdCkgeworCQlyZXR1cm4gbmV3IFJvb3RBZGFwdGVyKHJlc291cmNlRmlsZSwgcm9vdCk7CiAJfQogCiAJcHJvdGVjdGVkIFJlc291cmNlU2V0IGdldFJlc291cmNlU2V0KElGaWxlIGZpbGUpIHsKQEAgLTY1LDIzICs3MywyNiBAQAogCQogCXByaXZhdGUgY2xhc3MgUm9vdEFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCAKIAl7Ci0JCVhtbFJvb3RDb250ZW50Tm9kZSByb290OworCQlmaW5hbCBJRmlsZSByZXNvdXJjZUZpbGU7CisJCWZpbmFsIFhtbFJvb3RDb250ZW50Tm9kZSByb290Q29udGVudE5vZGU7CiAJCQotCQlwcml2YXRlIFJvb3RBZGFwdGVyKFhtbFJvb3RDb250ZW50Tm9kZSByb290Q29udGVudE5vZGUpIHsKKwkJUm9vdEFkYXB0ZXIoSUZpbGUgcmVzb3VyY2VGaWxlLCBYbWxSb290Q29udGVudE5vZGUgcm9vdENvbnRlbnROb2RlKSB7CiAJCQlzdXBlcigpOwotCQkJcm9vdCA9IHJvb3RDb250ZW50Tm9kZTsKKwkJCXRoaXMucmVzb3VyY2VGaWxlID0gcmVzb3VyY2VGaWxlOworCQkJdGhpcy5yb290Q29udGVudE5vZGUgPSByb290Q29udGVudE5vZGU7CiAJCX0KKwkJQE92ZXJyaWRlCiAJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewogCQkJaW50IGZlYXR1cmVJZCA9IG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUmVzb3VyY2UuY2xhc3MpOwogCQkJaWYgKGZlYXR1cmVJZCA9PSBSZXNvdXJjZS5SRVNPVVJDRV9fQ09OVEVOVFMpIHsKIAkJCQlpZiAobm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpID09IE5vdGlmaWNhdGlvbi5BREQKIAkJCQkJCXx8IG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uUkVNT1ZFKSB7CiAJCQkJCU9ybVhtbFJlc291cmNlIHJlc291cmNlID0gKE9ybVhtbFJlc291cmNlKSBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKTsKLQkJCQkJcm9vdC5zZXRFbnRpdHlNYXBwaW5ncyhyZXNvdXJjZS5nZXRYbWxGaWxlQ29udGVudCgpKTsKKwkJCQkJdGhpcy5yb290Q29udGVudE5vZGUuc2V0RW50aXR5TWFwcGluZ3MocmVzb3VyY2UuZ2V0WG1sRmlsZUNvbnRlbnQoKSk7CiAJCQkJfQogCQkJfQogCQkJZWxzZSBpZiAoZmVhdHVyZUlkID09IFJlc291cmNlLlJFU09VUkNFX19JU19MT0FERUQpIHsKLQkJCQlpZiAocmVzb3VyY2VGaWxlLmV4aXN0cygpKSB7CisJCQkJaWYgKHRoaXMucmVzb3VyY2VGaWxlLmV4aXN0cygpKSB7CiAJCQkJCS8vIGR1bWIgdHJhbnNsYXRvciBpcyB1bmxvYWRpbmcgbXkgcmVzb3VyY2UsIHJlbG9hZCBpdAogCQkJCQlpZiAobm90aWZpY2F0aW9uLmdldE5ld0Jvb2xlYW5WYWx1ZSgpID09IGZhbHNlKSB7CiAJCQkJCQlPcm1YbWxSZXNvdXJjZSByZXNvdXJjZSA9IChPcm1YbWxSZXNvdXJjZSkgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCk7CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9vcm0vWG1sQXR0cmlidXRlTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvb3JtL1htbEF0dHJpYnV0ZU1hcHBpbmcuamF2YQppbmRleCBmNTQ4YTU4Li4yMzRhOGIwIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9vcm0vWG1sQXR0cmlidXRlTWFwcGluZy5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L29ybS9YbWxBdHRyaWJ1dGVNYXBwaW5nLmphdmEKQEAgLTMxNCwxMCArMzE0LDYgQEAKIAkgKi8KIAlwdWJsaWMgYWJzdHJhY3QgaW50IHhtbFNlcXVlbmNlKCk7CiAKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKCkgewotCS8vZG8gbm90aGluZyBhcyB0aGlzIHdpbGwgYmUgaGFuZGxlIGJ5IHRoZSBYbWwgVHJhbnNsYXRvcnMKLQl9Ci0KIAlwdWJsaWMgdm9pZCByZWZyZXNoRGVmYXVsdHMoRGVmYXVsdHNDb250ZXh0IGRlZmF1bHRzQ29udGV4dCkgewogCS8vIGRvIG5vdGhpbmcKIAl9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9vcm0vWG1sQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9vcm0vWG1sQ29sdW1uLmphdmEKaW5kZXggMDA5ZjY1OC4uZmFlNmY5MSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvb3JtL1htbENvbHVtbi5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L29ybS9YbWxDb2x1bW4uamF2YQpAQCAtNDcsMTcgKzQ3LDI3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgTEVOR1RIX0VERUZBVUxUID0gMjU1OworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IExFTkdUSF9FREVGQVVMVCA9IDA7CiAKIAkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMZW5ndGgoKSA8ZW0+TGVuZ3RoPC9lbT59JyBhdHRyaWJ1dGUuCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNwZWNpZmllZExlbmd0aCgpIDxlbT5TcGVjaWZpZWQgTGVuZ3RoPC9lbT59JyBhdHRyaWJ1dGUuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMZW5ndGgoKQorCSAqIEBzZWUgI2dldFNwZWNpZmllZExlbmd0aCgpCiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIGludCBsZW5ndGggPSBMRU5HVEhfRURFRkFVTFQ7CisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgU1BFQ0lGSUVEX0xFTkdUSF9FREVGQVVMVCA9IC0xOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3BlY2lmaWVkTGVuZ3RoKCkgPGVtPlNwZWNpZmllZCBMZW5ndGg8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFNwZWNpZmllZExlbmd0aCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGludCBzcGVjaWZpZWRMZW5ndGggPSBTUEVDSUZJRURfTEVOR1RIX0VERUZBVUxUOwogCiAJLyoqCiAJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZWNpc2lvbigpIDxlbT5QcmVjaXNpb248L2VtPn0nIGF0dHJpYnV0ZS4KQEAgLTcwLDE0ICs4MCwyNCBAQAogCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFBSRUNJU0lPTl9FREVGQVVMVCA9IDA7CiAKIAkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVjaXNpb24oKSA8ZW0+UHJlY2lzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNwZWNpZmllZFByZWNpc2lvbigpIDxlbT5TcGVjaWZpZWQgUHJlY2lzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVjaXNpb24oKQorCSAqIEBzZWUgI2dldFNwZWNpZmllZFByZWNpc2lvbigpCiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIGludCBwcmVjaXNpb24gPSBQUkVDSVNJT05fRURFRkFVTFQ7CisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgU1BFQ0lGSUVEX1BSRUNJU0lPTl9FREVGQVVMVCA9IC0xOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCkgPGVtPlNwZWNpZmllZCBQcmVjaXNpb248L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFNwZWNpZmllZFByZWNpc2lvbigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGludCBzcGVjaWZpZWRQcmVjaXNpb24gPSBTUEVDSUZJRURfUFJFQ0lTSU9OX0VERUZBVUxUOwogCiAJLyoqCiAJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNjYWxlKCkgPGVtPlNjYWxlPC9lbT59JyBhdHRyaWJ1dGUuCkBAIC05MCwxNCArMTEwLDI0IEBACiAJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgU0NBTEVfRURFRkFVTFQgPSAwOwogCiAJLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2NhbGUoKSA8ZW0+U2NhbGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3BlY2lmaWVkU2NhbGUoKSA8ZW0+U3BlY2lmaWVkIFNjYWxlPC9lbT59JyBhdHRyaWJ1dGUuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTY2FsZSgpCisJICogQHNlZSAjZ2V0U3BlY2lmaWVkU2NhbGUoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBpbnQgc2NhbGUgPSBTQ0FMRV9FREVGQVVMVDsKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBTUEVDSUZJRURfU0NBTEVfRURFRkFVTFQgPSAtMTsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNwZWNpZmllZFNjYWxlKCkgPGVtPlNwZWNpZmllZCBTY2FsZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0U3BlY2lmaWVkU2NhbGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBpbnQgc3BlY2lmaWVkU2NhbGUgPSBTUEVDSUZJRURfU0NBTEVfRURFRkFVTFQ7CiAKIAkvKioKIAkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGVuZ3RoRm9yWG1sKCkgPGVtPkxlbmd0aCBGb3IgWG1sPC9lbT59JyBhdHRyaWJ1dGUuCkBAIC0xNTIsMTM0ICsxODIsMTQ4IEBACiAJCXJldHVybiBPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9DT0xVTU47CiAJfQogCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGVuZ3RoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IjI1NSI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TGVuZ3RoPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxlbmd0aDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TGVuZ3RoKGludCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQub3JtLk9ybVBhY2thZ2UjZ2V0SUNvbHVtbl9MZW5ndGgoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIyNTUiCi0JICogQGdlbmVyYXRlZAotCSAqLwogCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gbGVuZ3RoOworCQlyZXR1cm4gKHRoaXMuZ2V0U3BlY2lmaWVkTGVuZ3RoKCkgPT0gU1BFQ0lGSUVEX0xFTkdUSF9FREVGQVVMVCkgPyBnZXREZWZhdWx0TGVuZ3RoKCkgOiB0aGlzLmdldFNwZWNpZmllZExlbmd0aCgpOwogCX0KIAogCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQub3JtLlhtbENvbHVtbiNnZXRMZW5ndGggPGVtPkxlbmd0aDwvZW0+fScgYXR0cmlidXRlLgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNwZWNpZmllZCBMZW5ndGg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iLTEiPC9jb2RlPi4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNwZWNpZmllZCBMZW5ndGg8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGVuZ3RoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRMZW5ndGgoKQorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNwZWNpZmllZCBMZW5ndGg8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldFNwZWNpZmllZExlbmd0aChpbnQpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50Lm9ybS5Pcm1QYWNrYWdlI2dldElDb2x1bW5fU3BlY2lmaWVkTGVuZ3RoKCkKKwkgKiBAbW9kZWwgZGVmYXVsdD0iLTEiCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyB2b2lkIHNldExlbmd0aEdlbihpbnQgbmV3TGVuZ3RoKSB7Ci0JCWludCBvbGRMZW5ndGggPSBsZW5ndGg7Ci0JCWxlbmd0aCA9IG5ld0xlbmd0aDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfQ09MVU1OX19MRU5HVEgsIG9sZExlbmd0aCwgbGVuZ3RoKSk7CisJcHVibGljIGludCBnZXRTcGVjaWZpZWRMZW5ndGgoKSB7CisJCXJldHVybiBzcGVjaWZpZWRMZW5ndGg7CiAJfQogCi0JcHVibGljIHZvaWQgc2V0TGVuZ3RoKGludCBuZXdMZW5ndGgpIHsKLQkJc2V0TGVuZ3RoR2VuKG5ld0xlbmd0aCk7Ci0JCWlmIChuZXdMZW5ndGggIT0gTEVOR1RIX0VERUZBVUxUKSB7CisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5vcm0uWG1sQ29sdW1uI2dldFNwZWNpZmllZExlbmd0aCA8ZW0+U3BlY2lmaWVkIExlbmd0aDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3BlY2lmaWVkIExlbmd0aDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0U3BlY2lmaWVkTGVuZ3RoKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkTGVuZ3RoR2VuKGludCBuZXdTcGVjaWZpZWRMZW5ndGgpIHsKKwkJaW50IG9sZFNwZWNpZmllZExlbmd0aCA9IHNwZWNpZmllZExlbmd0aDsKKwkJc3BlY2lmaWVkTGVuZ3RoID0gbmV3U3BlY2lmaWVkTGVuZ3RoOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9DT0xVTU5fX1NQRUNJRklFRF9MRU5HVEgsIG9sZFNwZWNpZmllZExlbmd0aCwgc3BlY2lmaWVkTGVuZ3RoKSk7CisJfQorCisJcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkTGVuZ3RoKGludCBuZXdTcGVjaWZpZWRMZW5ndGgpIHsKKwkJc2V0U3BlY2lmaWVkTGVuZ3RoR2VuKG5ld1NwZWNpZmllZExlbmd0aCk7CisJCWlmIChuZXdTcGVjaWZpZWRMZW5ndGggIT0gTEVOR1RIX0VERUZBVUxUKSB7CiAJCQlnZXRDb2x1bW5NYXBwaW5nKCkubWFrZUNvbHVtbkZvclhtbE5vbk51bGwoKTsKIAkJfQotCQlzZXRMZW5ndGhGb3JYbWwobmV3TGVuZ3RoKTsKKwkJc2V0TGVuZ3RoRm9yWG1sKG5ld1NwZWNpZmllZExlbmd0aCk7CiAJCWlmIChpc0FsbEZlYXR1cmVzVW5zZXQoKSkgewogCQkJZ2V0Q29sdW1uTWFwcGluZygpLm1ha2VDb2x1bW5Gb3JYbWxOdWxsKCk7CiAJCX0KIAl9CiAKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmVjaXNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByZWNpc2lvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVjaXNpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFByZWNpc2lvbihpbnQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50Lm9ybS5Pcm1QYWNrYWdlI2dldElDb2x1bW5fUHJlY2lzaW9uKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCiAJcHVibGljIGludCBnZXRQcmVjaXNpb24oKSB7Ci0JCXJldHVybiBwcmVjaXNpb247CisJCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWRQcmVjaXNpb24oKSA9PSBTUEVDSUZJRURfUFJFQ0lTSU9OX0VERUZBVUxUKSA/IGdldERlZmF1bHRQcmVjaXNpb24oKSA6IHRoaXMuZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCk7CiAJfQogCiAJLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5vcm0uWG1sQ29sdW1uI2dldFByZWNpc2lvbiA8ZW0+UHJlY2lzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3BlY2lmaWVkIFByZWNpc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiItMSI8L2NvZGU+LgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3BlY2lmaWVkIFByZWNpc2lvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVjaXNpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFByZWNpc2lvbigpCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3BlY2lmaWVkIFByZWNpc2lvbjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0U3BlY2lmaWVkUHJlY2lzaW9uKGludCkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQub3JtLk9ybVBhY2thZ2UjZ2V0SUNvbHVtbl9TcGVjaWZpZWRQcmVjaXNpb24oKQorCSAqIEBtb2RlbCBkZWZhdWx0PSItMSIKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIHZvaWQgc2V0UHJlY2lzaW9uR2VuKGludCBuZXdQcmVjaXNpb24pIHsKLQkJaW50IG9sZFByZWNpc2lvbiA9IHByZWNpc2lvbjsKLQkJcHJlY2lzaW9uID0gbmV3UHJlY2lzaW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9DT0xVTU5fX1BSRUNJU0lPTiwgb2xkUHJlY2lzaW9uLCBwcmVjaXNpb24pKTsKKwlwdWJsaWMgaW50IGdldFNwZWNpZmllZFByZWNpc2lvbigpIHsKKwkJcmV0dXJuIHNwZWNpZmllZFByZWNpc2lvbjsKIAl9CiAKLQlwdWJsaWMgdm9pZCBzZXRQcmVjaXNpb24oaW50IG5ld1ByZWNpc2lvbikgewotCQlzZXRQcmVjaXNpb25HZW4obmV3UHJlY2lzaW9uKTsKLQkJaWYgKG5ld1ByZWNpc2lvbiAhPSBQUkVDSVNJT05fRURFRkFVTFQpIHsKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50Lm9ybS5YbWxDb2x1bW4jZ2V0U3BlY2lmaWVkUHJlY2lzaW9uIDxlbT5TcGVjaWZpZWQgUHJlY2lzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TcGVjaWZpZWQgUHJlY2lzaW9uPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRTcGVjaWZpZWRQcmVjaXNpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRQcmVjaXNpb25HZW4oaW50IG5ld1NwZWNpZmllZFByZWNpc2lvbikgeworCQlpbnQgb2xkU3BlY2lmaWVkUHJlY2lzaW9uID0gc3BlY2lmaWVkUHJlY2lzaW9uOworCQlzcGVjaWZpZWRQcmVjaXNpb24gPSBuZXdTcGVjaWZpZWRQcmVjaXNpb247CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0NPTFVNTl9fU1BFQ0lGSUVEX1BSRUNJU0lPTiwgb2xkU3BlY2lmaWVkUHJlY2lzaW9uLCBzcGVjaWZpZWRQcmVjaXNpb24pKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRQcmVjaXNpb24oaW50IG5ld1NwZWNpZmllZFByZWNpc2lvbikgeworCQlzZXRTcGVjaWZpZWRQcmVjaXNpb25HZW4obmV3U3BlY2lmaWVkUHJlY2lzaW9uKTsKKwkJaWYgKG5ld1NwZWNpZmllZFByZWNpc2lvbiAhPSBQUkVDSVNJT05fRURFRkFVTFQpIHsKIAkJCWdldENvbHVtbk1hcHBpbmcoKS5tYWtlQ29sdW1uRm9yWG1sTm9uTnVsbCgpOwogCQl9Ci0JCXNldFByZWNpc2lvbkZvclhtbChuZXdQcmVjaXNpb24pOworCQlzZXRQcmVjaXNpb25Gb3JYbWwobmV3U3BlY2lmaWVkUHJlY2lzaW9uKTsKIAkJaWYgKGlzQWxsRmVhdHVyZXNVbnNldCgpKSB7CiAJCQlnZXRDb2x1bW5NYXBwaW5nKCkubWFrZUNvbHVtbkZvclhtbE51bGwoKTsKIAkJfQogCX0KIAorCXB1YmxpYyBpbnQgZ2V0U2NhbGUoKSB7CisJCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWRTY2FsZSgpID09IFNQRUNJRklFRF9TQ0FMRV9FREVGQVVMVCkgPyBnZXREZWZhdWx0U2NhbGUoKSA6IHRoaXMuZ2V0U3BlY2lmaWVkU2NhbGUoKTsKKwl9CisKIAkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TY2FsZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNwZWNpZmllZCBTY2FsZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiItMSI8L2NvZGU+LgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2NhbGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNwZWNpZmllZCBTY2FsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCiAJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgogCSAqIDwvcD4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TY2FsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U2NhbGUoaW50KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5vcm0uT3JtUGFja2FnZSNnZXRJQ29sdW1uX1NjYWxlKCkKLQkgKiBAbW9kZWwKKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TcGVjaWZpZWQgU2NhbGU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldFNwZWNpZmllZFNjYWxlKGludCkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQub3JtLk9ybVBhY2thZ2UjZ2V0SUNvbHVtbl9TcGVjaWZpZWRTY2FsZSgpCisJICogQG1vZGVsIGRlZmF1bHQ9Ii0xIgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgaW50IGdldFNjYWxlKCkgewotCQlyZXR1cm4gc2NhbGU7CisJcHVibGljIGludCBnZXRTcGVjaWZpZWRTY2FsZSgpIHsKKwkJcmV0dXJuIHNwZWNpZmllZFNjYWxlOwogCX0KIAogCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQub3JtLlhtbENvbHVtbiNnZXRTY2FsZSA8ZW0+U2NhbGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50Lm9ybS5YbWxDb2x1bW4jZ2V0U3BlY2lmaWVkU2NhbGUgPGVtPlNwZWNpZmllZCBTY2FsZTwvZW0+fScgYXR0cmlidXRlLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2NhbGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFNjYWxlKCkKKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TcGVjaWZpZWQgU2NhbGU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldFNwZWNpZmllZFNjYWxlKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIHZvaWQgc2V0U2NhbGVHZW4oaW50IG5ld1NjYWxlKSB7Ci0JCWludCBvbGRTY2FsZSA9IHNjYWxlOwotCQlzY2FsZSA9IG5ld1NjYWxlOworCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFNjYWxlR2VuKGludCBuZXdTcGVjaWZpZWRTY2FsZSkgeworCQlpbnQgb2xkU3BlY2lmaWVkU2NhbGUgPSBzcGVjaWZpZWRTY2FsZTsKKwkJc3BlY2lmaWVkU2NhbGUgPSBuZXdTcGVjaWZpZWRTY2FsZTsKIAkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfQ09MVU1OX19TQ0FMRSwgb2xkU2NhbGUsIHNjYWxlKSk7CisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9DT0xVTU5fX1NQRUNJRklFRF9TQ0FMRSwgb2xkU3BlY2lmaWVkU2NhbGUsIHNwZWNpZmllZFNjYWxlKSk7CiAJfQogCi0JcHVibGljIHZvaWQgc2V0U2NhbGUoaW50IG5ld1NjYWxlKSB7Ci0JCXNldFNjYWxlR2VuKG5ld1NjYWxlKTsKLQkJaWYgKG5ld1NjYWxlICE9IFNDQUxFX0VERUZBVUxUKSB7CisJcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkU2NhbGUoaW50IG5ld1NwZWNpZmllZFNjYWxlKSB7CisJCXNldFNwZWNpZmllZFNjYWxlR2VuKG5ld1NwZWNpZmllZFNjYWxlKTsKKwkJaWYgKG5ld1NwZWNpZmllZFNjYWxlICE9IFNDQUxFX0VERUZBVUxUKSB7CiAJCQlnZXRDb2x1bW5NYXBwaW5nKCkubWFrZUNvbHVtbkZvclhtbE5vbk51bGwoKTsKIAkJfQotCQlzZXRTY2FsZUZvclhtbChuZXdTY2FsZSk7CisJCXNldFNjYWxlRm9yWG1sKG5ld1NwZWNpZmllZFNjYWxlKTsKIAkJaWYgKGlzQWxsRmVhdHVyZXNVbnNldCgpKSB7CiAJCQlnZXRDb2x1bW5NYXBwaW5nKCkubWFrZUNvbHVtbkZvclhtbE51bGwoKTsKIAkJfQpAQCAtMzEzLDcgKzM1Nyw3IEBACiAJICogQGdlbmVyYXRlZCBOT1QKIAkgKi8KIAlwdWJsaWMgdm9pZCBzZXRMZW5ndGhGb3JYbWwoaW50IG5ld0xlbmd0aEZvclhtbCkgewotCQlzZXRMZW5ndGhHZW4obmV3TGVuZ3RoRm9yWG1sKTsKKwkJc2V0U3BlY2lmaWVkTGVuZ3RoR2VuKG5ld0xlbmd0aEZvclhtbCk7CiAJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKIAkJCS8vcGFzcyBpbiBvbGRWYWx1ZSBvZiBudWxsIGJlY2F1c2Ugd2UgZG9uJ3Qgc3RvcmUgdGhlIHZhbHVlIGZyb20gdGhlIHhtbCwgc2VlIHN1cGVyLmVOb3RpZnkoKQogCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfQ09MVU1OX19MRU5HVEhfRk9SX1hNTCwgbnVsbCwgbmV3TGVuZ3RoRm9yWG1sKSk7CkBAIC0zNDYsNyArMzkwLDcgQEAKIAkgKiBAZ2VuZXJhdGVkIE5PVAogCSAqLwogCXB1YmxpYyB2b2lkIHNldFByZWNpc2lvbkZvclhtbChpbnQgbmV3UHJlY2lzaW9uRm9yWG1sKSB7Ci0JCXNldFByZWNpc2lvbkdlbihuZXdQcmVjaXNpb25Gb3JYbWwpOworCQlzZXRTcGVjaWZpZWRQcmVjaXNpb25HZW4obmV3UHJlY2lzaW9uRm9yWG1sKTsKIAkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQogCQkJLy9wYXNzIGluIG9sZFZhbHVlIG9mIG51bGwgYmVjYXVzZSB3ZSBkb24ndCBzdG9yZSB0aGUgdmFsdWUgZnJvbSB0aGUgeG1sLCBzZWUgc3VwZXIuZU5vdGlmeSgpCiAJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9DT0xVTU5fX1BSRUNJU0lPTl9GT1JfWE1MLCBudWxsLCBuZXdQcmVjaXNpb25Gb3JYbWwpKTsKQEAgLTM3OSwxMiArNDIzLDI0IEBACiAJICogQGdlbmVyYXRlZCBOT1QKIAkgKi8KIAlwdWJsaWMgdm9pZCBzZXRTY2FsZUZvclhtbChpbnQgbmV3U2NhbGVGb3JYbWwpIHsKLQkJc2V0U2NhbGVHZW4obmV3U2NhbGVGb3JYbWwpOworCQlzZXRTcGVjaWZpZWRTY2FsZUdlbihuZXdTY2FsZUZvclhtbCk7CiAJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKIAkJCS8vcGFzcyBpbiBvbGRWYWx1ZSBvZiBudWxsIGJlY2F1c2Ugd2UgZG9uJ3Qgc3RvcmUgdGhlIHZhbHVlIGZyb20gdGhlIHhtbCwgc2VlIHN1cGVyLmVOb3RpZnkoKQogCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfQ09MVU1OX19TQ0FMRV9GT1JfWE1MLCBudWxsLCBuZXdTY2FsZUZvclhtbCkpOwogCX0KIAorCXB1YmxpYyBpbnQgZ2V0RGVmYXVsdExlbmd0aCgpIHsKKwkJcmV0dXJuIERFRkFVTFRfTEVOR1RIOworCX0KKworCXB1YmxpYyBpbnQgZ2V0RGVmYXVsdFByZWNpc2lvbigpIHsKKwkJcmV0dXJuIERFRkFVTFRfUFJFQ0lTSU9OOworCX0KKworCXB1YmxpYyBpbnQgZ2V0RGVmYXVsdFNjYWxlKCkgeworCQlyZXR1cm4gREVGQVVMVF9TQ0FMRTsKKwl9CisKIAkvKioKIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtMzk1LDEwICs0NTEsMTYgQEAKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQ09MVU1OX19MRU5HVEggOgogCQkJCXJldHVybiBuZXcgSW50ZWdlcihnZXRMZW5ndGgoKSk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0NPTFVNTl9fU1BFQ0lGSUVEX0xFTkdUSCA6CisJCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKGdldFNwZWNpZmllZExlbmd0aCgpKTsKIAkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQ09MVU1OX19QUkVDSVNJT04gOgogCQkJCXJldHVybiBuZXcgSW50ZWdlcihnZXRQcmVjaXNpb24oKSk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0NPTFVNTl9fU1BFQ0lGSUVEX1BSRUNJU0lPTiA6CisJCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKGdldFNwZWNpZmllZFByZWNpc2lvbigpKTsKIAkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQ09MVU1OX19TQ0FMRSA6CiAJCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKGdldFNjYWxlKCkpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9DT0xVTU5fX1NQRUNJRklFRF9TQ0FMRSA6CisJCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKGdldFNwZWNpZmllZFNjYWxlKCkpOwogCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9DT0xVTU5fX0xFTkdUSF9GT1JfWE1MIDoKIAkJCQlyZXR1cm4gbmV3IEludGVnZXIoZ2V0TGVuZ3RoRm9yWG1sKCkpOwogCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9DT0xVTU5fX1BSRUNJU0lPTl9GT1JfWE1MIDoKQEAgLTQxNywxNCArNDc5LDE0IEBACiAJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQ09MVU1OX19MRU5HVEggOgotCQkJCXNldExlbmd0aCgoKEludGVnZXIpIG5ld1ZhbHVlKS5pbnRWYWx1ZSgpKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQ09MVU1OX19TUEVDSUZJRURfTEVOR1RIIDoKKwkJCQlzZXRTcGVjaWZpZWRMZW5ndGgoKChJbnRlZ2VyKSBuZXdWYWx1ZSkuaW50VmFsdWUoKSk7CiAJCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9DT0xVTU5fX1BSRUNJU0lPTiA6Ci0JCQkJc2V0UHJlY2lzaW9uKCgoSW50ZWdlcikgbmV3VmFsdWUpLmludFZhbHVlKCkpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9DT0xVTU5fX1NQRUNJRklFRF9QUkVDSVNJT04gOgorCQkJCXNldFNwZWNpZmllZFByZWNpc2lvbigoKEludGVnZXIpIG5ld1ZhbHVlKS5pbnRWYWx1ZSgpKTsKIAkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0NPTFVNTl9fU0NBTEUgOgotCQkJCXNldFNjYWxlKCgoSW50ZWdlcikgbmV3VmFsdWUpLmludFZhbHVlKCkpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9DT0xVTU5fX1NQRUNJRklFRF9TQ0FMRSA6CisJCQkJc2V0U3BlY2lmaWVkU2NhbGUoKChJbnRlZ2VyKSBuZXdWYWx1ZSkuaW50VmFsdWUoKSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9DT0xVTU5fX0xFTkdUSF9GT1JfWE1MIDoKIAkJCQlzZXRMZW5ndGhGb3JYbWwoKChJbnRlZ2VyKSBuZXdWYWx1ZSkuaW50VmFsdWUoKSk7CkBAIC00NDcsMTQgKzUwOSwxNCBAQAogCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0NPTFVNTl9fTEVOR1RIIDoKLQkJCQlzZXRMZW5ndGgoTEVOR1RIX0VERUZBVUxUKTsKKwkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQ09MVU1OX19TUEVDSUZJRURfTEVOR1RIIDoKKwkJCQlzZXRTcGVjaWZpZWRMZW5ndGgoU1BFQ0lGSUVEX0xFTkdUSF9FREVGQVVMVCk7CiAJCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9DT0xVTU5fX1BSRUNJU0lPTiA6Ci0JCQkJc2V0UHJlY2lzaW9uKFBSRUNJU0lPTl9FREVGQVVMVCk7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0NPTFVNTl9fU1BFQ0lGSUVEX1BSRUNJU0lPTiA6CisJCQkJc2V0U3BlY2lmaWVkUHJlY2lzaW9uKFNQRUNJRklFRF9QUkVDSVNJT05fRURFRkFVTFQpOwogCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQ09MVU1OX19TQ0FMRSA6Ci0JCQkJc2V0U2NhbGUoU0NBTEVfRURFRkFVTFQpOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9DT0xVTU5fX1NQRUNJRklFRF9TQ0FMRSA6CisJCQkJc2V0U3BlY2lmaWVkU2NhbGUoU1BFQ0lGSUVEX1NDQUxFX0VERUZBVUxUKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0NPTFVNTl9fTEVOR1RIX0ZPUl9YTUwgOgogCQkJCXNldExlbmd0aEZvclhtbChMRU5HVEhfRk9SX1hNTF9FREVGQVVMVCk7CkBAIC00NzgsMTEgKzU0MCwxNyBAQAogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0NPTFVNTl9fTEVOR1RIIDoKLQkJCQlyZXR1cm4gbGVuZ3RoICE9IExFTkdUSF9FREVGQVVMVDsKKwkJCQlyZXR1cm4gZ2V0TGVuZ3RoKCkgIT0gTEVOR1RIX0VERUZBVUxUOworCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9DT0xVTU5fX1NQRUNJRklFRF9MRU5HVEggOgorCQkJCXJldHVybiBzcGVjaWZpZWRMZW5ndGggIT0gU1BFQ0lGSUVEX0xFTkdUSF9FREVGQVVMVDsKIAkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQ09MVU1OX19QUkVDSVNJT04gOgotCQkJCXJldHVybiBwcmVjaXNpb24gIT0gUFJFQ0lTSU9OX0VERUZBVUxUOworCQkJCXJldHVybiBnZXRQcmVjaXNpb24oKSAhPSBQUkVDSVNJT05fRURFRkFVTFQ7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0NPTFVNTl9fU1BFQ0lGSUVEX1BSRUNJU0lPTiA6CisJCQkJcmV0dXJuIHNwZWNpZmllZFByZWNpc2lvbiAhPSBTUEVDSUZJRURfUFJFQ0lTSU9OX0VERUZBVUxUOwogCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9DT0xVTU5fX1NDQUxFIDoKLQkJCQlyZXR1cm4gc2NhbGUgIT0gU0NBTEVfRURFRkFVTFQ7CisJCQkJcmV0dXJuIGdldFNjYWxlKCkgIT0gU0NBTEVfRURFRkFVTFQ7CisJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0NPTFVNTl9fU1BFQ0lGSUVEX1NDQUxFIDoKKwkJCQlyZXR1cm4gc3BlY2lmaWVkU2NhbGUgIT0gU1BFQ0lGSUVEX1NDQUxFX0VERUZBVUxUOwogCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9DT0xVTU5fX0xFTkdUSF9GT1JfWE1MIDoKIAkJCQlyZXR1cm4gZ2V0TGVuZ3RoRm9yWG1sKCkgIT0gTEVOR1RIX0ZPUl9YTUxfRURFRkFVTFQ7CiAJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0NPTFVNTl9fUFJFQ0lTSU9OX0ZPUl9YTUwgOgpAQCAtNTA0LDEwICs1NzIsMTYgQEAKIAkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkgewogCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQ09MVU1OX19MRU5HVEggOgogCQkJCQlyZXR1cm4gSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JQ09MVU1OX19MRU5HVEg7CisJCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9DT0xVTU5fX1NQRUNJRklFRF9MRU5HVEggOgorCQkJCQlyZXR1cm4gSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JQ09MVU1OX19TUEVDSUZJRURfTEVOR1RIOwogCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQ09MVU1OX19QUkVDSVNJT04gOgogCQkJCQlyZXR1cm4gSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JQ09MVU1OX19QUkVDSVNJT047CisJCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9DT0xVTU5fX1NQRUNJRklFRF9QUkVDSVNJT04gOgorCQkJCQlyZXR1cm4gSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JQ09MVU1OX19TUEVDSUZJRURfUFJFQ0lTSU9OOwogCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQ09MVU1OX19TQ0FMRSA6CiAJCQkJCXJldHVybiBKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLklDT0xVTU5fX1NDQUxFOworCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQ09MVU1OX19TUEVDSUZJRURfU0NBTEUgOgorCQkJCQlyZXR1cm4gSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JQ09MVU1OX19TUEVDSUZJRURfU0NBTEU7CiAJCQkJZGVmYXVsdCA6CiAJCQkJCXJldHVybiAtMTsKIAkJCX0KQEAgLTUyNiwxMCArNjAwLDE2IEBACiAJCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpIHsKIAkJCQljYXNlIEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSUNPTFVNTl9fTEVOR1RIIDoKIAkJCQkJcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0NPTFVNTl9fTEVOR1RIOworCQkJCWNhc2UgSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JQ09MVU1OX19TUEVDSUZJRURfTEVOR1RIIDoKKwkJCQkJcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0NPTFVNTl9fU1BFQ0lGSUVEX0xFTkdUSDsKIAkJCQljYXNlIEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSUNPTFVNTl9fUFJFQ0lTSU9OIDoKIAkJCQkJcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0NPTFVNTl9fUFJFQ0lTSU9OOworCQkJCWNhc2UgSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JQ09MVU1OX19TUEVDSUZJRURfUFJFQ0lTSU9OIDoKKwkJCQkJcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0NPTFVNTl9fU1BFQ0lGSUVEX1BSRUNJU0lPTjsKIAkJCQljYXNlIEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSUNPTFVNTl9fU0NBTEUgOgogCQkJCQlyZXR1cm4gT3JtUGFja2FnZS5YTUxfQ09MVU1OX19TQ0FMRTsKKwkJCQljYXNlIEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSUNPTFVNTl9fU1BFQ0lGSUVEX1NDQUxFIDoKKwkJCQkJcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0NPTFVNTl9fU1BFQ0lGSUVEX1NDQUxFOwogCQkJCWRlZmF1bHQgOgogCQkJCQlyZXR1cm4gLTE7CiAJCQl9CkBAIC01NDcsMTIgKzYyNywxMiBAQAogCQlpZiAoZUlzUHJveHkoKSkKIAkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwogCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChsZW5ndGg6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGxlbmd0aCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcHJlY2lzaW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwcmVjaXNpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIHNjYWxlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzY2FsZSk7CisJCXJlc3VsdC5hcHBlbmQoIiAoc3BlY2lmaWVkTGVuZ3RoOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChzcGVjaWZpZWRMZW5ndGgpOworCQlyZXN1bHQuYXBwZW5kKCIsIHNwZWNpZmllZFByZWNpc2lvbjogIik7CisJCXJlc3VsdC5hcHBlbmQoc3BlY2lmaWVkUHJlY2lzaW9uKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBzcGVjaWZpZWRTY2FsZTogIik7CisJCXJlc3VsdC5hcHBlbmQoc3BlY2lmaWVkU2NhbGUpOwogCQlyZXN1bHQuYXBwZW5kKCcpJyk7CiAJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKIAl9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9vcm0vWG1sRW1iZWRkZWQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L29ybS9YbWxFbWJlZGRlZC5qYXZhCmluZGV4IDg0NGQ3OWUuLjAyYjg3NGIgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L29ybS9YbWxFbWJlZGRlZC5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L29ybS9YbWxFbWJlZGRlZC5qYXZhCkBAIC0yMiw3ICsyMiw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JTWFwcGluZ0tleXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSVBlcnNpc3RlbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5KYXZhRW1iZWRkZWQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuamR0dXRpbGl0eS5BdHRyaWJ1dGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSUF0dHJpYnV0ZU92ZXJyaWRlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklFbWJlZGRhYmxlOwpAQCAtMzY2LDE2ICszNjYsNiBAQAogCQlpZiAoYXR0cmlidXRlID09IG51bGwpIHsKIAkJCXJldHVybiBudWxsOwogCQl9Ci0JCVN0cmluZyByZXNvbHZlZFR5cGVOYW1lID0gYXR0cmlidXRlLnJlc29sdmVkVHlwZU5hbWUoKTsKLQkJaWYgKHJlc29sdmVkVHlwZU5hbWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZGVmYXVsdHNDb250ZXh0LnBlcnNpc3RlbnRUeXBlKHJlc29sdmVkVHlwZU5hbWUpOwotCQlpZiAocGVyc2lzdGVudFR5cGUgIT0gbnVsbCkgewotCQkJaWYgKHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIElFbWJlZGRhYmxlKSB7Ci0JCQkJcmV0dXJuIChJRW1iZWRkYWJsZSkgcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOworCQlyZXR1cm4gSmF2YUVtYmVkZGVkLmVtYmVkZGFibGVGb3IoYXR0cmlidXRlLCBkZWZhdWx0c0NvbnRleHQpOwogCX0KIH0gLy8gWG1sRW1iZWRkZWQKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L29ybS9YbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdJbnRlcm5hbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvb3JtL1htbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ0ludGVybmFsLmphdmEKaW5kZXggOTFiYmE2Ny4uNmUwZWIwMCAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvb3JtL1htbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ0ludGVybmFsLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvb3JtL1htbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ0ludGVybmFsLmphdmEKQEAgLTE2LDEwICsxNiwxMCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5TaWduYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklUeXBlQmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JVGV4dFJhbmdlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklUeXBlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSmF2YU11bHRpUmVsYXRpb25zaGlwTWFwcGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSmF2YVJlbGF0aW9uc2hpcE1hcHBpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5vcm0ucmVzb3VyY2UuT3JtWG1sTWFwcGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmVtZnV0aWxpdHkuRE9NVXRpbGl0aWVzOwpAQCAtODI1LDIyICs4MjUsMTIgQEAKIAkgKiBhbm90aGVyIGNvbnRhaW5lciBvciBhbiBhcnJheSBvciBhIHByaW1pdGl2ZSBvciBvdGhlciBCYXNpYyB0eXBlKQogCSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgamF2YURlZmF1bHRUYXJnZXRFbnRpdHkoU3RyaW5nIHNpZ25hdHVyZSkgewotCQlTdHJpbmcgdHlwZU5hbWUgPSBzdXBlci5qYXZhRGVmYXVsdFRhcmdldEVudGl0eShzaWduYXR1cmUpOwotCQlyZXR1cm4gSmF2YVJlbGF0aW9uc2hpcE1hcHBpbmcudHlwZU5hbWVkSXNDb250YWluZXIodHlwZU5hbWUpID8gdGhpcy5qYXZhRGVmYXVsdFRhcmdldEVudGl0eUZyb21Db250YWluZXIoc2lnbmF0dXJlKSA6IG51bGw7CisJcHJvdGVjdGVkIFN0cmluZyBqYXZhRGVmYXVsdFRhcmdldEVudGl0eShJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcpIHsKKwkJU3RyaW5nIHR5cGVOYW1lID0gc3VwZXIuamF2YURlZmF1bHRUYXJnZXRFbnRpdHkodHlwZUJpbmRpbmcpOworCQlyZXR1cm4gSmF2YVJlbGF0aW9uc2hpcE1hcHBpbmcudHlwZU5hbWVkSXNDb250YWluZXIodHlwZU5hbWUpID8gdGhpcy5qYXZhRGVmYXVsdFRhcmdldEVudGl0eUZyb21Db250YWluZXIodHlwZUJpbmRpbmcpIDogbnVsbDsKIAl9CiAKLQlwcm90ZWN0ZWQgU3RyaW5nIGphdmFEZWZhdWx0VGFyZ2V0RW50aXR5RnJvbUNvbnRhaW5lcihTdHJpbmcgc2lnbmF0dXJlKSB7Ci0JCVN0cmluZ1tdIHBhcm1TaWduYXR1cmVzID0gU2lnbmF0dXJlLmdldFR5cGVBcmd1bWVudHMoc2lnbmF0dXJlKTsKLQkJaWYgKChwYXJtU2lnbmF0dXJlcyA9PSBudWxsKSB8fCAocGFybVNpZ25hdHVyZXMubGVuZ3RoICE9IDEpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJVHlwZSBpVHlwZSA9IGdldFBlcnNpc3RlbnRUeXBlKCkuZmluZEpkdFR5cGUoKTsKLQkJaWYgKGlUeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZyBlbGVtZW50U2lnbmF0dXJlID0gcGFybVNpZ25hdHVyZXNbMF07Ci0JCVN0cmluZyBlbGVtZW50VHlwZU5hbWUgPSBidWlsZFJlZmVyZW5jZUVudGl0eVR5cGVOYW1lKGVsZW1lbnRTaWduYXR1cmUsIGlUeXBlKTsKLQkJcmV0dXJuIEphdmFSZWxhdGlvbnNoaXBNYXBwaW5nLnR5cGVOYW1lZElzQ29udGFpbmVyKGVsZW1lbnRUeXBlTmFtZSkgPyBudWxsIDogZWxlbWVudFR5cGVOYW1lOworCXByb3RlY3RlZCBTdHJpbmcgamF2YURlZmF1bHRUYXJnZXRFbnRpdHlGcm9tQ29udGFpbmVyKElUeXBlQmluZGluZyB0eXBlQmluZGluZykgeworCQlyZXR1cm4gSmF2YU11bHRpUmVsYXRpb25zaGlwTWFwcGluZy5qYXZhRGVmYXVsdFRhcmdldEVudGl0eUZyb21Db250YWluZXIodHlwZUJpbmRpbmcpOwogCX0KIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L29ybS9YbWxQZXJzaXN0ZW50QXR0cmlidXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9vcm0vWG1sUGVyc2lzdGVudEF0dHJpYnV0ZS5qYXZhCmluZGV4IGIxN2M1ODMuLjJiZjQ2ODcgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L29ybS9YbWxQZXJzaXN0ZW50QXR0cmlidXRlLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvb3JtL1htbFBlcnNpc3RlbnRBdHRyaWJ1dGUuamF2YQpAQCAtMjQsNyArMjQsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHkuQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOwogCiAvKioKICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC0yODUsMTUgKzI4NCw2IEBACiAJCXJldHVybiBJWG1sQ29udGVudE5vZGVzLlBFUlNJU1RFTlRfQVRUUklCVVRFX0lEOwogCX0KIAotCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGNhbmRpZGF0ZU1hcHBpbmdLZXlzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8SVhtbEF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlciwgU3RyaW5nPih0aGlzLmF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcnMuaXRlcmF0b3IoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShJWG1sQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyIHByb3ZpZGVyKSB7Ci0JCQkJcmV0dXJuIHByb3ZpZGVyLmtleSgpOwotCQkJfQotCQl9OwotCX0KLQogCXB1YmxpYyBDb2xsZWN0aW9uPElYbWxBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXI+IGF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcnMoKSB7CiAJCXJldHVybiB0aGlzLmF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcnM7CiAJfQpAQCAtMzE1LDcgKzMwNSw3IEBACiAJfQogCiAJcHVibGljIEF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGUoKSB7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSAoKFhtbFBlcnNpc3RlbnRUeXBlKSB0eXBlTWFwcGluZygpLmdldFBlcnNpc3RlbnRUeXBlKCkpLmZpbmRKYXZhUGVyc2lzdGVudFR5cGUoKTsKKwkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IHR5cGVNYXBwaW5nKCkuZ2V0UGVyc2lzdGVudFR5cGUoKS5maW5kSmF2YVBlcnNpc3RlbnRUeXBlKCk7CiAJCWlmIChqYXZhUGVyc2lzdGVudFR5cGUgPT0gbnVsbCkgewogCQkJcmV0dXJuIG51bGw7CiAJCX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L29ybS9YbWxQZXJzaXN0ZW50VHlwZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvb3JtL1htbFBlcnNpc3RlbnRUeXBlLmphdmEKaW5kZXggNzM1OGYyMi4uODJmYzQ4YSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvb3JtL1htbFBlcnNpc3RlbnRUeXBlLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvb3JtL1htbFBlcnNpc3RlbnRUeXBlLmphdmEKQEAgLTEsMTEgKzEsMTIgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCiAgKiAKLSAqIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50Lm9ybTsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CkBAIC0yNCw3ICsyNSw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdEVMaXN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JVHlwZUJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSUpwYUNvbnRlbnROb2RlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklKcGFGaWxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklQZXJzaXN0ZW50QXR0cmlidXRlOwpAQCAtNTE0LDE0ICs1MTUsNiBAQAogCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CiAJfQogCi0JcHVibGljIEl0ZXJhdG9yIGNhbmRpZGF0ZU1hcHBpbmdLZXlzKCkgewotCQlDb2xsZWN0aW9uIG1hcHBpbmdLZXlzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKElYbWxUeXBlTWFwcGluZ1Byb3ZpZGVyIHByb3ZpZGVyIDogdHlwZU1hcHBpbmdQcm92aWRlcnMoKSkgewotCQkJbWFwcGluZ0tleXMuYWRkKHByb3ZpZGVyLmtleSgpKTsKLQkJfQotCQlyZXR1cm4gbWFwcGluZ0tleXMuaXRlcmF0b3IoKTsKLQl9Ci0KIAkvKioKIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtODI0LDkgKzgxNywxMCBAQAogCiAJcHVibGljIEl0ZXJhdG9yPElQZXJzaXN0ZW50VHlwZT4gaW5oZXJpdGFuY2VIaWVyYXJjaHkoKSB7CiAJCS8vIHVzaW5nIGEgY2hhaW4gaXRlcmF0b3IgdG8gdHJhdmVyc2UgdXAgdGhlIGluaGVyaXRhbmNlIHRyZWUKLQkJcmV0dXJuIG5ldyBDaGFpbkl0ZXJhdG9yKHRoaXMpIHsKLQkJCXByb3RlY3RlZCBPYmplY3QgbmV4dExpbmsoT2JqZWN0IGN1cnJlbnRMaW5rKSB7Ci0JCQkJcmV0dXJuICgoSVBlcnNpc3RlbnRUeXBlKSBjdXJyZW50TGluaykucGFyZW50UGVyc2lzdGVudFR5cGUoKTsKKwkJcmV0dXJuIG5ldyBDaGFpbkl0ZXJhdG9yPElQZXJzaXN0ZW50VHlwZT4odGhpcykgeworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgSVBlcnNpc3RlbnRUeXBlIG5leHRMaW5rKElQZXJzaXN0ZW50VHlwZSBwdCkgeworCQkJCXJldHVybiBwdC5wYXJlbnRQZXJzaXN0ZW50VHlwZSgpOwogCQkJfQogCQl9OwogCX0KQEAgLTgzNSwyMiArODI5LDggQEAKIAkJcmV0dXJuIHRoaXMucGFyZW50UGVyc2lzdGVudFR5cGU7CiAJfQogCi0JcHJpdmF0ZSBTdHJpbmcgc3VwZXJjbGFzc1R5cGVTaWduYXR1cmUoKSB7Ci0JCUlUeXBlIGphdmFUeXBlID0gdGhpcy5maW5kSmR0VHlwZSgpOwotCQlpZiAoamF2YVR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJdHJ5IHsKLQkJCXJldHVybiBqYXZhVHlwZS5nZXRTdXBlcmNsYXNzVHlwZVNpZ25hdHVyZSgpOwotCQl9Ci0JCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLQkJfQotCX0KLQogCXB1YmxpYyBJSnBhQ29udGVudE5vZGUgZ2V0Q29udGVudE5vZGUoaW50IG9mZnNldCkgewotCQlmb3IgKEl0ZXJhdG9yIGkgPSBnZXRTcGVjaWZpZWRBdHRyaWJ1dGVNYXBwaW5ncygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJWG1sQXR0cmlidXRlTWFwcGluZyBtYXBwaW5nID0gKFhtbEF0dHJpYnV0ZU1hcHBpbmcpIGkubmV4dCgpOworCQlmb3IgKFhtbEF0dHJpYnV0ZU1hcHBpbmcgbWFwcGluZyA6IHRoaXMuZ2V0U3BlY2lmaWVkQXR0cmlidXRlTWFwcGluZ3MoKSkgewogCQkJaWYgKG1hcHBpbmcuZ2V0Tm9kZSgpLmNvbnRhaW5zKG9mZnNldCkpIHsKIAkJCQlyZXR1cm4gbWFwcGluZy5nZXRDb250ZW50Tm9kZShvZmZzZXQpOwogCQkJfQpAQCAtODYzLDMzICs4NDMsMTUgQEAKIAl9CiAKIAlwcml2YXRlIHZvaWQgcmVmcmVzaFBhcmVudFBlcnNpc3RlbnRUeXBlKERlZmF1bHRzQ29udGV4dCBjb250ZXh0KSB7Ci0JCVN0cmluZyBzdXBlcmNsYXNzVHlwZVNpZ25hdHVyZSA9IHRoaXMuc3VwZXJjbGFzc1R5cGVTaWduYXR1cmUoKTsKLQkJaWYgKHN1cGVyY2xhc3NUeXBlU2lnbmF0dXJlID09IG51bGwpIHsKKwkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IGZpbmRKYXZhUGVyc2lzdGVudFR5cGUoKTsKKwkJaWYgKGphdmFQZXJzaXN0ZW50VHlwZSA9PSBudWxsKSB7CiAJCQl0aGlzLnBhcmVudFBlcnNpc3RlbnRUeXBlID0gbnVsbDsKIAkJCXJldHVybjsKIAkJfQotCQlJVHlwZSBqZHRUeXBlID0gdGhpcy5maW5kSmR0VHlwZSgpOwotCQlpZiAoamR0VHlwZSA9PSBudWxsKSB7Ci0JCQl0aGlzLnBhcmVudFBlcnNpc3RlbnRUeXBlID0gbnVsbDsKLQkJCXJldHVybjsKLQkJfQotCQlTdHJpbmcgZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSA9IEpEVFRvb2xzLnJlc29sdmVTaWduYXR1cmUoc3VwZXJjbGFzc1R5cGVTaWduYXR1cmUsIGpkdFR5cGUpOwotCQlpZiAoZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSA9PSBudWxsKSB7Ci0JCQl0aGlzLnBhcmVudFBlcnNpc3RlbnRUeXBlID0gbnVsbDsKLQkJCXJldHVybjsKLQkJfQotCQlJUGVyc2lzdGVudFR5cGUgcG9zc2libGVQYXJlbnQgPSBjb250ZXh0LnBlcnNpc3RlbnRUeXBlKGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUpOwotCQlpZiAocG9zc2libGVQYXJlbnQgIT0gbnVsbCkgewotCQkJaWYgKHBvc3NpYmxlUGFyZW50LmdldE1hcHBpbmdLZXkoKSAhPSBudWxsKSB7Ci0JCQkJdGhpcy5wYXJlbnRQZXJzaXN0ZW50VHlwZSA9IHBvc3NpYmxlUGFyZW50OwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGhpcy5wYXJlbnRQZXJzaXN0ZW50VHlwZSA9IHBvc3NpYmxlUGFyZW50LnBhcmVudFBlcnNpc3RlbnRUeXBlKCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLnBhcmVudFBlcnNpc3RlbnRUeXBlID0gbnVsbDsKLQkJfQorCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0VHlwZSgpLnR5cGVCaW5kaW5nKGNvbnRleHQuYXN0Um9vdCgpKTsKKwkJSVBlcnNpc3RlbnRUeXBlIHBhcmVudFBlcnNpc3RlbnRUeXBlID0gSmF2YVBlcnNpc3RlbnRUeXBlLnBhcmVudFBlcnNpc3RlbnRUeXBlKGNvbnRleHQsIHR5cGVCaW5kaW5nKTsKKwkJdGhpcy5wYXJlbnRQZXJzaXN0ZW50VHlwZSA9IHBhcmVudFBlcnNpc3RlbnRUeXBlOworCQlyZXR1cm47CiAJfQogCiAJcHJvdGVjdGVkIEl0ZXJhdG9yPFhtbFBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXNOYW1lZChmaW5hbCBTdHJpbmcgYXR0cmlidXRlTmFtZSkgewpAQCAtOTAzLDI1ICs4NjUsMTQgQEAKIAogCXB1YmxpYyBYbWxQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZU5hbWVkKFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7CiAJCUl0ZXJhdG9yPFhtbFBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzTmFtZWQoYXR0cmlidXRlTmFtZSk7Ci0JCWlmIChhdHRyaWJ1dGVzLmhhc05leHQoKSkgewotCQkJcmV0dXJuIGF0dHJpYnV0ZXMubmV4dCgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KKwkJcmV0dXJuIGF0dHJpYnV0ZXMuaGFzTmV4dCgpID8gYXR0cmlidXRlcy5uZXh0KCkgOiBudWxsOwogCX0KIAogCXB1YmxpYyBJUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvbHZlQXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7CiAJCUl0ZXJhdG9yPFhtbFBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzTmFtZWQoYXR0cmlidXRlTmFtZSk7CiAJCWlmIChhdHRyaWJ1dGVzLmhhc05leHQoKSkgewogCQkJWG1sUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJCWlmIChhdHRyaWJ1dGVzLmhhc05leHQoKSkgewotCQkJCS8vIG1vcmUgdGhhbiBvbmUKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJldHVybiBhdHRyaWJ1dGU7Ci0JCQl9CisJCQlyZXR1cm4gYXR0cmlidXRlcy5oYXNOZXh0KCkgPyBudWxsIC8qIG1vcmUgdGhhbiBvbmUgKi86IGF0dHJpYnV0ZTsKIAkJfQogCQllbHNlIGlmIChwYXJlbnRQZXJzaXN0ZW50VHlwZSgpICE9IG51bGwpIHsKIAkJCXJldHVybiBwYXJlbnRQZXJzaXN0ZW50VHlwZSgpLnJlc29sdmVBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7CkBAIC05NTMsNyArOTA0LDcgQEAKIAlwcml2YXRlIGFic3RyYWN0IGNsYXNzIEF0dHJpYnV0ZU1hcHBpbmdzTGlzdDxFPgogCQlleHRlbmRzIEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbEF0dHJpYnV0ZU1hcHBpbmc+CiAJewotCQlwcml2YXRlIEF0dHJpYnV0ZU1hcHBpbmdzTGlzdChpbnQgZmVhdHVyZSkgeworCQlBdHRyaWJ1dGVNYXBwaW5nc0xpc3QoaW50IGZlYXR1cmUpIHsKIAkJCXN1cGVyKFhtbEF0dHJpYnV0ZU1hcHBpbmcuY2xhc3MsIFhtbFBlcnNpc3RlbnRUeXBlLnRoaXMsIGZlYXR1cmUpOwogCQl9CiAKQEAgLTk3NCw3ICs5MjUsNyBAQAogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGRpZENsZWFyKGludCBzaXplLCBPYmplY3RbXSBvbGRPYmplY3RzKSB7CisJCXByb3RlY3RlZCB2b2lkIGRpZENsZWFyKGludCBsZW4sIE9iamVjdFtdIG9sZE9iamVjdHMpIHsKIAkJCXBlcnNpc3RlbnRBdHRyaWJ1dGVzKCkuY2xlYXIoKTsKIAkJfQogCkBAIC05OTgsNyArOTQ5LDcgQEAKIAlwcml2YXRlIGNsYXNzIFNwZWNpZmllZEF0dHJpYnV0ZU1hcHBpbmdzTGlzdDxFPgogCQlleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmdzTGlzdDxYbWxBdHRyaWJ1dGVNYXBwaW5nPgogCXsKLQkJcHJpdmF0ZSBTcGVjaWZpZWRBdHRyaWJ1dGVNYXBwaW5nc0xpc3QoKSB7CisJCVNwZWNpZmllZEF0dHJpYnV0ZU1hcHBpbmdzTGlzdCgpIHsKIAkJCXN1cGVyKE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTlRfVFlQRV9fU1BFQ0lGSUVEX0FUVFJJQlVURV9NQVBQSU5HUyk7CiAJCX0KIApAQCAtMTAxMiw3ICs5NjMsNyBAQAogCXByaXZhdGUgY2xhc3MgVmlydHVhbEF0dHJpYnV0ZU1hcHBpbmdzTGlzdDxFPgogCQlleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmdzTGlzdDxYbWxBdHRyaWJ1dGVNYXBwaW5nPgogCXsKLQkJcHJpdmF0ZSBWaXJ0dWFsQXR0cmlidXRlTWFwcGluZ3NMaXN0KCkgeworCQlWaXJ0dWFsQXR0cmlidXRlTWFwcGluZ3NMaXN0KCkgewogCQkJc3VwZXIoT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOVF9UWVBFX19WSVJUVUFMX0FUVFJJQlVURV9NQVBQSU5HUyk7CiAJCX0KIApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvb3JtL1htbFJlbGF0aW9uc2hpcE1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L29ybS9YbWxSZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEKaW5kZXggMmY1MmIwMy4uOTZkZWJmZiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvb3JtL1htbFJlbGF0aW9uc2hpcE1hcHBpbmcuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9vcm0vWG1sUmVsYXRpb25zaGlwTWFwcGluZy5qYXZhCkBAIC0xNCwxMSArMTQsMTEgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuU2lnbmF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklUeXBlQmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JUGVyc2lzdGVudFR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSVR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHkuSkRUVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLkphdmFSZWxhdGlvbnNoaXBNYXBwaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklDYXNjYWRlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklFbnRpdHk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSVJlbGF0aW9uc2hpcE1hcHBpbmc7CkBAIC01MTEsNyArNTExLDcgQEAKIAkJcmV0dXJuIG51bGw7CiAJfQogCi0JcHVibGljIFN0cmluZyBmdWxseVF1YWxpZmllZFRhcmdldEVudGl0eSgpIHsKKwlwdWJsaWMgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkVGFyZ2V0RW50aXR5KENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7CiAJCWlmIChnZXRUYXJnZXRFbnRpdHkoKSA9PSBudWxsKSB7CiAJCQlyZXR1cm4gbnVsbDsKIAkJfQpAQCAtNTQyLDcgKzU0Miw3IEBACiAJcHVibGljIHZvaWQgcmVmcmVzaERlZmF1bHRzKERlZmF1bHRzQ29udGV4dCBkZWZhdWx0c0NvbnRleHQpIHsKIAkJc3VwZXIucmVmcmVzaERlZmF1bHRzKGRlZmF1bHRzQ29udGV4dCk7CiAJCXNldERlZmF1bHRUYXJnZXRFbnRpdHkoKFN0cmluZykgZGVmYXVsdHNDb250ZXh0LmdldERlZmF1bHQoQmFzZUpwYVBsYXRmb3JtLkRFRkFVTFRfVEFSR0VUX0VOVElUWV9LRVkpKTsKLQkJU3RyaW5nIHRhcmdldEVudGl0eSA9IGZ1bGx5UXVhbGlmaWVkVGFyZ2V0RW50aXR5KCk7CisJCVN0cmluZyB0YXJnZXRFbnRpdHkgPSBmdWxseVF1YWxpZmllZFRhcmdldEVudGl0eShkZWZhdWx0c0NvbnRleHQuYXN0Um9vdCgpKTsKIAkJaWYgKHRhcmdldEVudGl0eSAhPSBudWxsKSB7CiAJCQlJUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBkZWZhdWx0c0NvbnRleHQucGVyc2lzdGVudFR5cGUodGFyZ2V0RW50aXR5KTsKIAkJCWlmIChwZXJzaXN0ZW50VHlwZSAhPSBudWxsKSB7CkBAIC01NTksMjMgKzU1OSwxOSBAQAogCSAqIHRoZSBkZWZhdWx0ICd0YXJnZXRFbnRpdHknIGlzIGNhbGN1bGF0ZWQgZnJvbSB0aGUgYXR0cmlidXRlIHR5cGU7CiAJICogcmV0dXJuIG51bGwgaWYgdGhlIGF0dHJpYnV0ZSB0eXBlIGNhbm5vdCBwb3NzaWJseSBiZSBhbiBlbnRpdHkKIAkgKi8KLQlwdWJsaWMgU3RyaW5nIGphdmFEZWZhdWx0VGFyZ2V0RW50aXR5KCkgewotCQlyZXR1cm4gdGhpcy5qYXZhRGVmYXVsdFRhcmdldEVudGl0eSh0aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRBdHRyaWJ1dGUoKS50eXBlU2lnbmF0dXJlKCkpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgamF2YURlZmF1bHRUYXJnZXRFbnRpdHkoU3RyaW5nIHNpZ25hdHVyZSkgewotCQlJVHlwZSBpVHlwZSA9IGdldFBlcnNpc3RlbnRUeXBlKCkuZmluZEpkdFR5cGUoKTsKLQkJaWYgKGlUeXBlICE9IG51bGwpIHsKLQkJCXJldHVybiBidWlsZFJlZmVyZW5jZUVudGl0eVR5cGVOYW1lKHNpZ25hdHVyZSwgaVR5cGUpOworCXB1YmxpYyBTdHJpbmcgamF2YURlZmF1bHRUYXJnZXRFbnRpdHkoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gdGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0QXR0cmlidXRlKCkudHlwZUJpbmRpbmcoYXN0Um9vdCk7CisJCWlmICh0eXBlQmluZGluZyAhPSBudWxsKSB7CisJCQlyZXR1cm4gdGhpcy5qYXZhRGVmYXVsdFRhcmdldEVudGl0eSh0eXBlQmluZGluZyk7CiAJCX0KIAkJcmV0dXJuIG51bGw7CiAJfQogCi0JLy8gVE9ETyBFbWJlZGRhYmxlPz8/Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYnVpbGRSZWZlcmVuY2VFbnRpdHlUeXBlTmFtZShTdHJpbmcgc2lnbmF0dXJlLCBJVHlwZSBqZHRUeXBlKSB7Ci0JCWlmIChTaWduYXR1cmUuZ2V0QXJyYXlDb3VudChzaWduYXR1cmUpID4gMCkgewotCQkJcmV0dXJuIG51bGw7IC8vIGFycmF5cyBjYW5ub3QgYmUgZW50aXRpZXMKLQkJfQotCQlyZXR1cm4gSkRUVG9vbHMucmVzb2x2ZShTaWduYXR1cmUudG9TdHJpbmcoc2lnbmF0dXJlKSwgamR0VHlwZSk7CisJcHJvdGVjdGVkIFN0cmluZyBqYXZhRGVmYXVsdFRhcmdldEVudGl0eShJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcpIHsKKwkJcmV0dXJuIGJ1aWxkUmVmZXJlbmNlRW50aXR5VHlwZU5hbWUodHlwZUJpbmRpbmcpOworCX0KKworCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRSZWZlcmVuY2VFbnRpdHlUeXBlTmFtZShJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcpIHsKKwkJcmV0dXJuIEphdmFSZWxhdGlvbnNoaXBNYXBwaW5nLmJ1aWxkUmVmZXJlbmNlRW50aXR5VHlwZU5hbWUodHlwZUJpbmRpbmcpOwogCX0KIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L29ybS9YbWxUeXBlTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvb3JtL1htbFR5cGVNYXBwaW5nLmphdmEKaW5kZXggMzVhNzhmMS4uMGE1OGNhMyAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvb3JtL1htbFR5cGVNYXBwaW5nLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvb3JtL1htbFR5cGVNYXBwaW5nLmphdmEKQEAgLTU5MywxMCArNTkzLDYgQEAKIAkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwogCX0KIAotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoKSB7Ci0JLy9kbyBub3RoaW5nIGFzIHRoaXMgd2lsbCBiZSBoYW5kbGUgYnkgdGhlIFhtbCBUcmFuc2xhdG9ycwotCX0KLQogCS8qKgogCSAqIElUeXBlTWFwcGluZyBpcyBjaGFuZ2VkIGFuZCB2YXJpb3VzIElUeXBlTWFwcGluZ3MgbWF5IGhhdmUKIAkgKiBjb21tb24gc2V0dGluZ3MuICBJbiB0aGlzIG1ldGhvZCBpbml0aWFsaXplIHRoZSBuZXcgSVR5cGVNYXBwaW5nICh0aGlzKQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlLmphdmEKaW5kZXggZGE2ZTQ1Ny4uZjc4YmIyNyAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2UuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZS5qYXZhCkBAIC05LDYgKzksNyBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LnBlcnNpc3RlbmNlOwogCiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CkBAIC0xNyw5ICsxOCwxMSBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSUpwYUNvbnRlbnROb2RlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklKcGFGaWxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklKcGFQcm9qZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLlhtbEVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5wZXJzaXN0ZW5jZS5yZXNvdXJjZS5JUGVyc2lzdGVuY2VYbWxDb250ZW50Tm9kZXM7CiAKIC8qKgogICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTM5LDcgKzQyLDcgQEAKICAqIEBtb2RlbCBraW5kPSJjbGFzcyIKICAqIEBnZW5lcmF0ZWQKICAqLwotcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlIGV4dGVuZHMgWG1sRU9iamVjdAorcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlIGV4dGVuZHMgWG1sRU9iamVjdCBpbXBsZW1lbnRzIElKcGFDb250ZW50Tm9kZQogewogCS8qKgogCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBlcnNpc3RlbmNlVW5pdHMoKSA8ZW0+UGVyc2lzdGVuY2UgVW5pdHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMzQ1LDQgKzM0OCwxOCBAQAogCQlJSnBhRmlsZSBmaWxlID0gZ2V0SnBhRmlsZSgpOwogCQlyZXR1cm4gKGZpbGUgPT0gbnVsbCkgPyBudWxsIDogZmlsZS5nZXRKcGFQcm9qZWN0KCk7CiAJfQorCisJcHVibGljIElKcGFDb250ZW50Tm9kZSBnZXRDb250ZW50Tm9kZShpbnQgb2Zmc2V0KSB7CisJCWZvciAoSXRlcmF0b3I8UGVyc2lzdGVuY2VVbml0PiBpID0gZ2V0UGVyc2lzdGVuY2VVbml0cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworCQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGkubmV4dCgpOworCQkJaWYgKHBlcnNpc3RlbmNlVW5pdC5nZXROb2RlKCkuY29udGFpbnMob2Zmc2V0KSkgeworCQkJCXJldHVybiBwZXJzaXN0ZW5jZVVuaXQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIHRoaXM7CisJfQorCisJcHVibGljIE9iamVjdCBnZXRJZCgpIHsKKwkJcmV0dXJuIElQZXJzaXN0ZW5jZVhtbENvbnRlbnROb2Rlcy5QRVJTSVNURU5DRVhNTF9ST09UX0lEOworCX0KIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlUGFja2FnZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VQYWNrYWdlLmphdmEKaW5kZXggOTJmOTg3MC4uNmM5ZGVhMiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VQYWNrYWdlLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VQYWNrYWdlLmphdmEKQEAgLTEwNTYsNyArMTA1Niw5IEBACiAJCXBlcnNpc3RlbmNlWG1sUm9vdENvbnRlbnROb2RlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUpwYUNvcmVQYWNrYWdlLmdldFhtbEVPYmplY3QoKSk7CiAJCXBlcnNpc3RlbmNlWG1sUm9vdENvbnRlbnROb2RlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUpwYUNvcmVQYWNrYWdlLmdldElKcGFSb290Q29udGVudE5vZGUoKSk7CiAJCXBlcnNpc3RlbmNlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUpwYUNvcmVQYWNrYWdlLmdldFhtbEVPYmplY3QoKSk7CisJCXBlcnNpc3RlbmNlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUpwYUNvcmVQYWNrYWdlLmdldElKcGFDb250ZW50Tm9kZSgpKTsKIAkJcGVyc2lzdGVuY2VVbml0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUpwYUNvcmVQYWNrYWdlLmdldFhtbEVPYmplY3QoKSk7CisJCXBlcnNpc3RlbmNlVW5pdEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVKcGFDb3JlUGFja2FnZS5nZXRJSnBhQ29udGVudE5vZGUoKSk7CiAJCW1hcHBpbmdGaWxlUmVmRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUpwYUNvcmVQYWNrYWdlLmdldFhtbEVPYmplY3QoKSk7CiAJCWphdmFDbGFzc1JlZkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVKcGFDb3JlUGFja2FnZS5nZXRYbWxFT2JqZWN0KCkpOwogCQlwcm9wZXJ0aWVzRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUpwYUNvcmVQYWNrYWdlLmdldFhtbEVPYmplY3QoKSk7CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVVuaXQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlVW5pdC5qYXZhCmluZGV4IGIwZTJkZjYuLmU0YmIzNmMgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlVW5pdC5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlVW5pdC5qYXZhCkBAIC0xOCw3ICsxOCw5IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRURhdGFUeXBlRUxpc3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JSnBhQ29udGVudE5vZGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuWG1sRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LnBlcnNpc3RlbmNlLnJlc291cmNlLklQZXJzaXN0ZW5jZVhtbENvbnRlbnROb2RlczsKIAogLyoqCiAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtNDYsNyArNDgsNyBAQAogICogQG1vZGVsIGtpbmQ9ImNsYXNzIgogICogQGdlbmVyYXRlZAogICovCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VVbml0IGV4dGVuZHMgWG1sRU9iamVjdAorcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlVW5pdCBleHRlbmRzIFhtbEVPYmplY3QgaW1wbGVtZW50cyBJSnBhQ29udGVudE5vZGUKIHsKIAkvKioKIAkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KQEAgLTg3NCw0ICs4NzYsOCBAQAogCQlyZXN1bHQuYXBwZW5kKCcpJyk7CiAJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKIAl9CisKKwlwdWJsaWMgT2JqZWN0IGdldElkKCkgeworCQlyZXR1cm4gSVBlcnNpc3RlbmNlWG1sQ29udGVudE5vZGVzLlBFUlNJU1RFTkNFX1VOSVRfSUQ7CisJfQogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VYbWxKcGFGaWxlQ29udGVudFByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVhtbEpwYUZpbGVDb250ZW50UHJvdmlkZXIuamF2YQppbmRleCBjNWU1MzIyLi44NzU3YWNiIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVhtbEpwYUZpbGVDb250ZW50UHJvdmlkZXIuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVhtbEpwYUZpbGVDb250ZW50UHJvdmlkZXIuamF2YQpAQCAtMSw4ICsxLDggQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCiAgKiAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KQEAgLTExLDYgKzExLDcgQEAKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CkBAIC0xOSw2ICsyMCw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JSnBhRmlsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JSnBhRmlsZUNvbnRlbnRQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JSnBhUm9vdENvbnRlbnROb2RlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkpwdENvcmVQbHVnaW47CkBAIC0yNywzMiArMjksMzggQEAKIAogcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlWG1sSnBhRmlsZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElKcGFGaWxlQ29udGVudFByb3ZpZGVyCiB7Ci0JcHVibGljIHN0YXRpYyBQZXJzaXN0ZW5jZVhtbEpwYUZpbGVDb250ZW50UHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgUGVyc2lzdGVuY2VYbWxKcGFGaWxlQ29udGVudFByb3ZpZGVyKCk7CisJLy9zaW5nbGV0b24KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBQZXJzaXN0ZW5jZVhtbEpwYUZpbGVDb250ZW50UHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgUGVyc2lzdGVuY2VYbWxKcGFGaWxlQ29udGVudFByb3ZpZGVyKCk7CiAJCi0JCi0JcHJpdmF0ZSBJRmlsZSByZXNvdXJjZUZpbGU7CisJLyoqCisJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCisJICovCisJcHVibGljIHN0YXRpYyBJSnBhRmlsZUNvbnRlbnRQcm92aWRlciBpbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KIAkKIAkKIAkvKioKIAkgKiBSZXN0cmljdCBhY2Nlc3MKIAkgKi8KIAlwcml2YXRlIFBlcnNpc3RlbmNlWG1sSnBhRmlsZUNvbnRlbnRQcm92aWRlcigpIHsKLQkJCisJCXN1cGVyKCk7CiAJfQogCi0JcHVibGljIElKcGFSb290Q29udGVudE5vZGUgYnVpbGRSb290Q29udGVudChJRmlsZSByZXNvdXJjZUZpbGUpIHsKKwlwdWJsaWMgSUpwYVJvb3RDb250ZW50Tm9kZSBidWlsZFJvb3RDb250ZW50KElKcGFGaWxlIGpwYUZpbGUpIHsKKwkJSUZpbGUgcmVzb3VyY2VGaWxlID0ganBhRmlsZS5nZXRGaWxlKCk7CiAJCVBlcnNpc3RlbmNlWG1sUmVzb3VyY2VGYWN0b3J5LnJlZ2lzdGVyKCk7Ci0JCXRoaXMucmVzb3VyY2VGaWxlID0gcmVzb3VyY2VGaWxlOwotCQlVUkkgZmlsZVVSSSA9IFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKHJlc291cmNlRmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpOworCQlVUkkgZmlsZVVSSSA9IFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKHJlc291cmNlRmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIHRydWUpOwogCQlQZXJzaXN0ZW5jZVJlc291cmNlIHJlc291cmNlID0gKFBlcnNpc3RlbmNlUmVzb3VyY2UpIGdldFJlc291cmNlU2V0KHJlc291cmNlRmlsZSkuZ2V0UmVzb3VyY2UoZmlsZVVSSSwgdHJ1ZSk7CiAJCVBlcnNpc3RlbmNlWG1sUm9vdENvbnRlbnROb2RlIHJvb3QgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBlcnNpc3RlbmNlWG1sUm9vdENvbnRlbnROb2RlKCk7CisJCWpwYUZpbGUuc2V0Q29udGVudChyb290KTsKIAkJcm9vdC5zZXRQZXJzaXN0ZW5jZShyZXNvdXJjZS5nZXRQZXJzaXN0ZW5jZSgpKTsKLQkJcmVzb3VyY2UuZUFkYXB0ZXJzKCkuYWRkKGJ1aWxkUm9vdE5vZGVMaXN0ZW5lcihyb290KSk7CisJCXJlc291cmNlLmVBZGFwdGVycygpLmFkZChidWlsZFJvb3ROb2RlTGlzdGVuZXIocmVzb3VyY2VGaWxlLCByb290KSk7CiAJCXJldHVybiByb290OwogCX0KIAkKLQlwcml2YXRlIEFkYXB0ZXIgYnVpbGRSb290Tm9kZUxpc3RlbmVyKFBlcnNpc3RlbmNlWG1sUm9vdENvbnRlbnROb2RlIHJvb3QpIHsKLQkJcmV0dXJuIG5ldyBSb290QWRhcHRlcihyb290KTsKKwlwcml2YXRlIEFkYXB0ZXIgYnVpbGRSb290Tm9kZUxpc3RlbmVyKElGaWxlIHJlc291cmNlRmlsZSwgUGVyc2lzdGVuY2VYbWxSb290Q29udGVudE5vZGUgcm9vdENvbnRlbnROb2RlKSB7CisJCXJldHVybiBuZXcgUm9vdEFkYXB0ZXIocmVzb3VyY2VGaWxlLCByb290Q29udGVudE5vZGUpOwogCX0KIAogCXByb3RlY3RlZCBSZXNvdXJjZVNldCBnZXRSZXNvdXJjZVNldChJRmlsZSBmaWxlKSB7CkBAIC02NiwyNCArNzQsMjcgQEAKIAkKIAlwcml2YXRlIGNsYXNzIFJvb3RBZGFwdGVyIGV4dGVuZHMgQWRhcHRlckltcGwgCiAJewotCQlQZXJzaXN0ZW5jZVhtbFJvb3RDb250ZW50Tm9kZSByb290OworCQlmaW5hbCBJRmlsZSByZXNvdXJjZUZpbGU7CisJCWZpbmFsIFBlcnNpc3RlbmNlWG1sUm9vdENvbnRlbnROb2RlIHJvb3RDb250ZW50Tm9kZTsKIAkJCi0JCXByaXZhdGUgUm9vdEFkYXB0ZXIoUGVyc2lzdGVuY2VYbWxSb290Q29udGVudE5vZGUgcm9vdENvbnRlbnROb2RlKSB7CisJCVJvb3RBZGFwdGVyKElGaWxlIHJlc291cmNlRmlsZSwgUGVyc2lzdGVuY2VYbWxSb290Q29udGVudE5vZGUgcm9vdENvbnRlbnROb2RlKSB7CiAJCQlzdXBlcigpOwotCQkJcm9vdCA9IHJvb3RDb250ZW50Tm9kZTsKKwkJCXRoaXMucmVzb3VyY2VGaWxlID0gcmVzb3VyY2VGaWxlOworCQkJdGhpcy5yb290Q29udGVudE5vZGUgPSByb290Q29udGVudE5vZGU7CiAJCX0KIAkJCisJCUBPdmVycmlkZQogCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKIAkJCWludCBmZWF0dXJlSWQgPSBub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFJlc291cmNlLmNsYXNzKTsKIAkJCWlmIChmZWF0dXJlSWQgPT0gUmVzb3VyY2UuUkVTT1VSQ0VfX0NPTlRFTlRTKSB7CiAJCQkJaWYgKG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uQURECiAJCQkJCQl8fCBub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLlJFTU9WRSkgewogCQkJCQlQZXJzaXN0ZW5jZVJlc291cmNlIHJlc291cmNlID0gKFBlcnNpc3RlbmNlUmVzb3VyY2UpIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpOwotCQkJCQlyb290LnNldFBlcnNpc3RlbmNlKHJlc291cmNlLmdldFBlcnNpc3RlbmNlKCkpOworCQkJCQl0aGlzLnJvb3RDb250ZW50Tm9kZS5zZXRQZXJzaXN0ZW5jZShyZXNvdXJjZS5nZXRQZXJzaXN0ZW5jZSgpKTsKIAkJCQl9CiAJCQl9CiAJCQllbHNlIGlmIChmZWF0dXJlSWQgPT0gUmVzb3VyY2UuUkVTT1VSQ0VfX0lTX0xPQURFRCkgewotCQkJCWlmIChyZXNvdXJjZUZpbGUuZXhpc3RzKCkpIHsKKwkJCQlpZiAodGhpcy5yZXNvdXJjZUZpbGUuZXhpc3RzKCkpIHsKIAkJCQkJLy8gZHVtYiB0cmFuc2xhdG9yIGlzIHVubG9hZGluZyBteSByZXNvdXJjZSwgcmVsb2FkIGl0CiAJCQkJCWlmIChub3RpZmljYXRpb24uZ2V0TmV3Qm9vbGVhblZhbHVlKCkgPT0gZmFsc2UpIHsKIAkJCQkJCVBlcnNpc3RlbmNlUmVzb3VyY2UgcmVzb3VyY2UgPSAoUGVyc2lzdGVuY2VSZXNvdXJjZSkgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCk7CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVhtbFJvb3RDb250ZW50Tm9kZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VYbWxSb290Q29udGVudE5vZGUuamF2YQppbmRleCA3N2JkOGFkLi5mMTliNzI5IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVhtbFJvb3RDb250ZW50Tm9kZS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlWG1sUm9vdENvbnRlbnROb2RlLmphdmEKQEAgLTM0Niw4ICszNDYsMTAgQEAKIAl9CiAKIAlwdWJsaWMgSUpwYUNvbnRlbnROb2RlIGdldENvbnRlbnROb2RlKGludCBvZmZzZXQpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKKwkJaWYgKGdldFBlcnNpc3RlbmNlKCkgPT0gbnVsbCB8fCAhZ2V0UGVyc2lzdGVuY2UoKS5nZXROb2RlKCkuY29udGFpbnMob2Zmc2V0KSkgeworCQkJcmV0dXJuIHRoaXM7CisJCX0KKwkJcmV0dXJuIGdldFBlcnNpc3RlbmNlKCkuZ2V0Q29udGVudE5vZGUob2Zmc2V0KTsKIAl9CiAKIAlwdWJsaWMgT2JqZWN0IGdldElkKCkgewpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvcGVyc2lzdGVuY2UvcmVzb3VyY2UvSVBlcnNpc3RlbmNlWG1sQ29udGVudE5vZGVzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9wZXJzaXN0ZW5jZS9yZXNvdXJjZS9JUGVyc2lzdGVuY2VYbWxDb250ZW50Tm9kZXMuamF2YQppbmRleCA2OTk1MThiLi4zYzM4OWFkIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9wZXJzaXN0ZW5jZS9yZXNvdXJjZS9JUGVyc2lzdGVuY2VYbWxDb250ZW50Tm9kZXMuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9wZXJzaXN0ZW5jZS9yZXNvdXJjZS9JUGVyc2lzdGVuY2VYbWxDb250ZW50Tm9kZXMuamF2YQpAQCAtMTQsNCArMTQsNiBAQAogewogCVN0cmluZyBQRVJTSVNURU5DRVhNTF9ST09UX0lEID0gSnB0Q29yZVBsdWdpbi5QTFVHSU5fSUQgKyAiLnBlcnNpc3RlbmNleG1sLlJvb3QiOwogCQorCVN0cmluZyBQRVJTSVNURU5DRV9VTklUX0lEID0gSnB0Q29yZVBsdWdpbi5QTFVHSU5fSUQgKyAiLnBlcnNpc3RlbmNleG1sLlBlcnNpc3RlbmNlVW5pdCI7CisJCiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9wZXJzaXN0ZW5jZS9yZXNvdXJjZS9QZXJzaXN0ZW5jZVRyYW5zbGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L3BlcnNpc3RlbmNlL3Jlc291cmNlL1BlcnNpc3RlbmNlVHJhbnNsYXRvci5qYXZhCmluZGV4IDEyM2QxODEuLjFlOGUwYjkgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L3BlcnNpc3RlbmNlL3Jlc291cmNlL1BlcnNpc3RlbmNlVHJhbnNsYXRvci5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L3BlcnNpc3RlbmNlL3Jlc291cmNlL1BlcnNpc3RlbmNlVHJhbnNsYXRvci5qYXZhCkBAIC0xMjMsNyArMTIzLDcgQEAKIAl9CiAJCiAJcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVQcm9wZXJ0eVRyYW5zbGF0b3IoKSB7Ci0JCUdlbmVyaWNUcmFuc2xhdG9yIHRyYW5zbGF0b3IgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoUFJPUEVSVFksIFBFUlNJU1RFTkNFX1BLRy5nZXRQcm9wZXJ0aWVzX1Byb3BlcnRpZXMoKSk7CisJCUdlbmVyaWNUcmFuc2xhdG9yIHRyYW5zbGF0b3IgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoUFJPUEVSVFksIFBFUlNJU1RFTkNFX1BLRy5nZXRQcm9wZXJ0aWVzX1Byb3BlcnRpZXMoKSwgRU5EX1RBR19OT19JTkRFTlQpOwogCQl0cmFuc2xhdG9yLnNldENoaWxkcmVuKAogCQkJbmV3IFRyYW5zbGF0b3JbXSB7CiAJCQkJY3JlYXRlUHJvcGVydHlOYW1lVHJhbnNsYXRvcigpLApAQCAtMTM0LDEwICsxMzQsMTAgQEAKIAl9CiAJCiAJcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVQcm9wZXJ0eU5hbWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoUFJPUEVSVFlfTkFNRSwgUEVSU0lTVEVOQ0VfUEtHLmdldFByb3BlcnR5X05hbWUoKSk7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihQUk9QRVJUWV9OQU1FLCBQRVJTSVNURU5DRV9QS0cuZ2V0UHJvcGVydHlfTmFtZSgpLCBET01fQVRUUklCVVRFKTsKIAl9CiAJCiAJcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVQcm9wZXJ0eVZhbHVlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKFBST1BFUlRZX1ZBTFVFLCBQRVJTSVNURU5DRV9QS0cuZ2V0UHJvcGVydHlfVmFsdWUoKSk7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihQUk9QRVJUWV9WQUxVRSwgUEVSU0lTVEVOQ0VfUEtHLmdldFByb3BlcnR5X1ZhbHVlKCksIERPTV9BVFRSSUJVVEUpOwogCX0KIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L3BlcnNpc3RlbmNlL3V0aWwvUGVyc2lzdGVuY2VTd2l0Y2guamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9jb250ZW50L3BlcnNpc3RlbmNlL3V0aWwvUGVyc2lzdGVuY2VTd2l0Y2guamF2YQppbmRleCAwZDJjYjU2Li5kMTE1ZWU1IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvY29udGVudC9wZXJzaXN0ZW5jZS91dGlsL1BlcnNpc3RlbmNlU3dpdGNoLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2NvbnRlbnQvcGVyc2lzdGVuY2UvdXRpbC9QZXJzaXN0ZW5jZVN3aXRjaC5qYXZhCkBAIC0xMjcsMTQgKzEyNywxNiBAQAogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKIAkJCQkJcmVzdWx0ID0gY2FzZVhtbEVPYmplY3QocGVyc2lzdGVuY2UpOwogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJcmVzdWx0ID0gY2FzZUlKcGFDb250ZW50Tm9kZShwZXJzaXN0ZW5jZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQogCQkJCQlyZXN1bHQgPSBjYXNlSnBhRU9iamVjdChwZXJzaXN0ZW5jZSk7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQogCQkJCQlyZXN1bHQgPSBjYXNlSVhtbEVPYmplY3QocGVyc2lzdGVuY2UpOwogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJcmVzdWx0ID0gY2FzZUlKcGFFT2JqZWN0KHBlcnNpc3RlbmNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpCiAJCQkJCXJlc3VsdCA9IGNhc2VJSnBhU291cmNlT2JqZWN0KHBlcnNpc3RlbmNlKTsKIAkJCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQkJCXJlc3VsdCA9IGNhc2VJSnBhRU9iamVjdChwZXJzaXN0ZW5jZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQogCQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKIAkJCQlyZXR1cm4gcmVzdWx0OwogCQkJfQpAQCAtMTQ0LDE0ICsxNDYsMTYgQEAKIAkJCQlpZiAocmVzdWx0ID09IG51bGwpCiAJCQkJCXJlc3VsdCA9IGNhc2VYbWxFT2JqZWN0KHBlcnNpc3RlbmNlVW5pdCk7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBjYXNlSUpwYUNvbnRlbnROb2RlKHBlcnNpc3RlbmNlVW5pdCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQogCQkJCQlyZXN1bHQgPSBjYXNlSnBhRU9iamVjdChwZXJzaXN0ZW5jZVVuaXQpOwogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKIAkJCQkJcmVzdWx0ID0gY2FzZUlYbWxFT2JqZWN0KHBlcnNpc3RlbmNlVW5pdCk7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQlyZXN1bHQgPSBjYXNlSUpwYUVPYmplY3QocGVyc2lzdGVuY2VVbml0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpCiAJCQkJCXJlc3VsdCA9IGNhc2VJSnBhU291cmNlT2JqZWN0KHBlcnNpc3RlbmNlVW5pdCk7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBjYXNlSUpwYUVPYmplY3QocGVyc2lzdGVuY2VVbml0KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpCiAJCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwogCQkJCXJldHVybiByZXN1bHQ7CiAJCQl9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvZmFjZXQvSnBhRmFjZXREYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2ZhY2V0L0pwYUZhY2V0RGF0YU1vZGVsUHJvdmlkZXIuamF2YQppbmRleCA1NzAzZWNiLi40MTgwZmIwIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvZmFjZXQvSnBhRmFjZXREYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9mYWNldC9KcGFGYWNldERhdGFNb2RlbFByb3ZpZGVyLmphdmEKQEAgLTEwLDggKzEwLDggQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuZmFjZXQ7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwpAQCAtOTksMjUgKzk5LDE1IEBACiAJcHVibGljIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcltdIGdldFZhbGlkUHJvcGVydHlEZXNjcmlwdG9ycyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7CiAJCWlmIChKUEFfTElCUkFSWS5lcXVhbHMocHJvcGVydHlOYW1lKSkgewogCQkJU3RyaW5nW10gbGlicmFyaWVzID0gSmF2YUNvcmUuZ2V0VXNlckxpYnJhcnlOYW1lcygpOworCQkJQXJyYXlzLnNvcnQobGlicmFyaWVzKTsKIAkJCURhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzID0gbmV3IERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcltsaWJyYXJpZXMubGVuZ3RoICsgMV07CiAJCQkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlicmFyaWVzLmxlbmd0aCA7IGkgKyspIHsKLQkJCQlkZXNjcmlwdG9yc1tpICsgMV0gPSBuZXcgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yKGxpYnJhcmllc1tpXSwgbGlicmFyaWVzW2ldKTsKLQkJCX0KLQkJCQotCQkJaWYoZGVzY3JpcHRvcnMubGVuZ3RoID4gMil7Ci0JCQkJQXJyYXlzLnNvcnQoZGVzY3JpcHRvcnMsIDAsIGRlc2NyaXB0b3JzLmxlbmd0aCAtIDIsIAotCQkJCQkJbmV3IENvbXBhcmF0b3IoKSB7Ci0JCQkJCQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgewotCQkJCQkJCQlEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IgZDEgPSAoRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yKWFyZzA7Ci0JCQkJCQkJCURhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvciBkMiA9IChEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IpYXJnMTsKLQkJCQkJCQkJcmV0dXJuIGQxLmdldFByb3BlcnR5RGVzY3JpcHRpb24oKS5jb21wYXJlVG8oZDIuZ2V0UHJvcGVydHlEZXNjcmlwdGlvbigpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCSk7Ci0JCQl9Ci0JCQkKIAkJCWRlc2NyaXB0b3JzWzBdID0gbmV3IERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcigiIiwgV1RQQ29tbW9uUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKFdUUENvbW1vbk1lc3NhZ2VzLlJVTlRJTUVfTk9ORSwgbnVsbCkpOworCQkJCisJCQlpbnQgaSA9IDE7CisJCQlmb3IgKFN0cmluZyBsaWJyYXJ5IDogbGlicmFyaWVzKSB7CisJCQkJZGVzY3JpcHRvcnNbaSsrXSA9IG5ldyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IobGlicmFyeSwgbGlicmFyeSk7CisJCQl9CQogCQkJcmV0dXJuIGRlc2NyaXB0b3JzOwogCQl9CiAJCQpAQCAtMTYyLDcgKzE1Miw3IEBACiAJfQogCQogCXByaXZhdGUgSVN0YXR1cyB2YWxpZGF0ZUNvbm5lY3Rpb24oU3RyaW5nIGNvbm5lY3Rpb25OYW1lKSB7Ci0JCWlmIChjb25uZWN0aW9uTmFtZSA9PSBudWxsIHx8IGNvbm5lY3Rpb25OYW1lLmVxdWFscygiIikgfHwgISBDb25uZWN0aW9uUHJvZmlsZVJlcG9zaXRvcnkuaW5zdGFuY2UoKS5nZXRDb25uZWN0aW9uV2l0aFByb2ZpbGVOYW1lZChjb25uZWN0aW9uTmFtZSkuaXNDb25uZWN0ZWQoKSkgeworCQlpZiAoY29ubmVjdGlvbk5hbWUgPT0gbnVsbCB8fCBjb25uZWN0aW9uTmFtZS5lcXVhbHMoIiIpIHx8ICEgQ29ubmVjdGlvblByb2ZpbGVSZXBvc2l0b3J5Lmluc3RhbmNlKCkucHJvZmlsZU5hbWVkKGNvbm5lY3Rpb25OYW1lKS5pc0Nvbm5lY3RlZCgpKSB7CiAJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLklORk8sIEpwdENvcmVQbHVnaW4uUExVR0lOX0lELCBKcHRDb3JlTWVzc2FnZXMuVkFMSURBVEVfQ09OTkVDVElPTl9OT1RfQ09OTkVDVEVEKTsKIAkJfQogCQllbHNlIHsKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9mYWNldC9KcGFGYWNldFBvc3RJbnN0YWxsRGVsZWdhdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9mYWNldC9KcGFGYWNldFBvc3RJbnN0YWxsRGVsZWdhdGUuamF2YQppbmRleCBlZWEzYzE0Li5lNGNkNGNiIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvZmFjZXQvSnBhRmFjZXRQb3N0SW5zdGFsbERlbGVnYXRlLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2ZhY2V0L0pwYUZhY2V0UG9zdEluc3RhbGxEZWxlZ2F0ZS5qYXZhCkBAIC0yNSw3ICsyNSw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5vcm0uRW50aXR5TWFwcGluZ3NJbnRlcm5hbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50Lm9ybS5Pcm1GYWN0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQub3JtLk9ybVhtbFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQucGVyc2lzdGVuY2UuTWFwcGluZ0ZpbGVSZWY7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKQEAgLTc5LDEzICs3OCw2IEBACiAJCXBlcnNpc3RlbmNlLnNldFZlcnNpb24oIjEuMCIpOwogCQlQZXJzaXN0ZW5jZVVuaXQgcFVuaXQgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBlcnNpc3RlbmNlVW5pdCgpOwogCQlwVW5pdC5zZXROYW1lKHByb2plY3QuZ2V0TmFtZSgpKTsKLQkJCi0JCWlmIChkYXRhTW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KENSRUFURV9PUk1fWE1MKSkgewotCQkJTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGUgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1hcHBpbmdGaWxlUmVmKCk7Ci0JCQltYXBwaW5nRmlsZS5zZXRGaWxlTmFtZShPUk1fWE1MX0ZJTEVfUEFUSCk7Ci0JCQlwVW5pdC5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGUpOwotCQl9Ci0JCQogCQlwZXJzaXN0ZW5jZS5nZXRQZXJzaXN0ZW5jZVVuaXRzKCkuYWRkKHBVbml0KTsKIAkJCiAJCXRyeSB7CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvZmFjZXQvSnBhRmFjZXRVdGlscy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2ZhY2V0L0pwYUZhY2V0VXRpbHMuamF2YQppbmRleCA5MzY4MTg4Li5jNDhjMmI1IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvZmFjZXQvSnBhRmFjZXRVdGlscy5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9mYWNldC9KcGFGYWNldFV0aWxzLmphdmEKQEAgLTIwLDcgKzIwLDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5KcGFQcm9qZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkpwdENvcmVQbHVnaW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucGxhdGZvcm0uZ2VuZXJpYy5HZW5lcmljUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLkNvbm5lY3Rpb25Qcm9maWxlUmVwb3NpdG9yeTsKIGltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLnByZWZzLkJhY2tpbmdTdG9yZUV4Y2VwdGlvbjsKIAogcHVibGljIGNsYXNzIEpwYUZhY2V0VXRpbHMKQEAgLTY2LDcgKzY1LDcgQEAKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24ocHJvamVjdC5nZXROYW1lKCkpOwogCQl9CiAJCQotCQlpZiAoSnBhUGxhdGZvcm1SZWdpc3RyeS5JTlNUQU5DRS5nZXRKcGFQbGF0Zm9ybShqcGFQbGF0Zm9ybUlkKSA9PSBudWxsKSB7CisJCWlmIChKcGFQbGF0Zm9ybVJlZ2lzdHJ5Lmluc3RhbmNlKCkuanBhUGxhdGZvcm0oanBhUGxhdGZvcm1JZCkgPT0gbnVsbCkgewogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihqcGFQbGF0Zm9ybUlkKTsKIAkJfQogCQkKQEAgLTk5LDEwICs5OCw2IEBACiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHByb2plY3QuZ2V0TmFtZSgpKTsKIAkJfQogCQkKLQkJaWYgKENvbm5lY3Rpb25Qcm9maWxlUmVwb3NpdG9yeS5pbnN0YW5jZSgpLmdldENvbm5lY3Rpb25XaXRoUHJvZmlsZU5hbWVkKGNvbm5lY3Rpb25OYW1lKSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGNvbm5lY3Rpb25OYW1lKTsKLQkJfQotCQkKIAkJanBhUHJvamVjdC5zZXREYXRhU291cmNlKGNvbm5lY3Rpb25OYW1lKTsKIAkJcHJvamVjdC5zZXRQZXJzaXN0ZW50UHJvcGVydHkoQ09OTkVDVElPTl9LRVksIGNvbm5lY3Rpb25OYW1lKTsKIAl9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvamR0dXRpbGl0eS9BYnN0cmFjdEV4cHJlc3Npb25Db252ZXJ0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qZHR1dGlsaXR5L0Fic3RyYWN0RXhwcmVzc2lvbkNvbnZlcnRlci5qYXZhCmluZGV4IGMyOTkwOTkuLjExZjRhZDMgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qZHR1dGlsaXR5L0Fic3RyYWN0RXhwcmVzc2lvbkNvbnZlcnRlci5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qZHR1dGlsaXR5L0Fic3RyYWN0RXhwcmVzc2lvbkNvbnZlcnRlci5qYXZhCkBAIC0xNCwzNyArMTQsNjQgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKIAogLyoqCi0gKiBHYXRoZXIgdG9nZXRoZXIganVzdCB0aGUgdGluaWVzdCBiaXQgb2YgY29tbW9uIGJlaGF2aW9yLgotICogRSBpcyB0aGUgZXhwcmVzc2lvbiB0eXBlLgorICogR2F0aGVyIHRvZ2V0aGVyIHRoZSBjb21tb24gaW1wbGVtZW50YXRpb24gYmVoYXZpb3IuCiAgKiBUIGlzIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QgdG8gYmUgY29udmVydGVkIHRvIGFuZCBmcm9tIGFuIGV4cHJlc3Npb24uCisgKiAKKyAqIFdlJ3JlIHN0aWxsIGZpZ3VyaW5nIG91dCBKYXZhIEdlbmVyaWNzIGhlcmUuLi4uIFRoZSBtZXRob2RzIGluIHRoaXMgYWJzdHJhY3QKKyAqIGNsYXNzIHdvcmsgZmluZSB3aXRoIGFueSBzdWJjbGFzcyBvZiBFeHByZXNzaW9uIEU7IGJ1dCBhIENsYXNzQ2FzdEV4Y2VwdGlvbgorICogd2lsbCBvY2N1ciBhcyBzb29uIGFzIHdlIGNhbGwgYW55IG1ldGhvZCBpbXBsZW1lbnRlZCBieSBhIHN1YmNsYXNzCisgKiAoZS5nLiBTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyKSB0aGF0IGV4cGVjdHMgYSBwYXJ0aWN1bGFyIHN1YmNsYXNzIG9mCisgKiBFeHByZXNzaW9uIChlLmcuIFN0cmluZ0xpdGVyYWwpLgogICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RFeHByZXNzaW9uQ29udmVydGVyPFQsIEUgZXh0ZW5kcyBFeHByZXNzaW9uPgotCWltcGxlbWVudHMgRXhwcmVzc2lvbkNvbnZlcnRlcjxULCBFPgorcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RXhwcmVzc2lvbkNvbnZlcnRlcjxUPgorCWltcGxlbWVudHMgRXhwcmVzc2lvbkNvbnZlcnRlcjxUPgogewogCiAJcHJvdGVjdGVkIEFic3RyYWN0RXhwcmVzc2lvbkNvbnZlcnRlcigpIHsKIAkJc3VwZXIoKTsKIAl9CiAKLQlwdWJsaWMgRSBjb252ZXJ0KFQgb2JqZWN0LCBBU1QgYXN0KSB7Ci0JCXJldHVybiAob2JqZWN0ID09IG51bGwpID8gbnVsbCA6IHRoaXMuY29udmVydF8ob2JqZWN0LCBhc3QpOworCisJLy8gKioqKioqKioqKiBvYmplY3QgLT4gZXhwcmVzc2lvbiAqKioqKioqKioqCisKKwlwdWJsaWMgRXhwcmVzc2lvbiBjb252ZXJ0KFQgb2JqZWN0LCBBU1QgYXN0KSB7CisJCXJldHVybiAob2JqZWN0ID09IG51bGwpID8gdGhpcy5jb252ZXJ0TnVsbChhc3QpIDogdGhpcy5jb252ZXJ0T2JqZWN0KG9iamVjdCwgYXN0KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIGV4cHJlc3Npb24gZm9yIGEgbnVsbCBvYmplY3QuIEJ5IGRlZmF1bHQsIGEgbnVsbCBvYmplY3Qgd2lsbAorCSAqIGJlIGNvbnZlcnRlZCBpbnRvIGEgbnVsbCBleHByZXNzaW9uLgorCSAqLworCXByb3RlY3RlZCBFeHByZXNzaW9uIGNvbnZlcnROdWxsKEFTVCBhc3QpIHsKKwkJcmV0dXJuIG51bGw7CiAJfQogCiAJLyoqCiAJICogVGhlIHNwZWNpZmllZCBvYmplY3QgaXMgbm90IG51bGwuCiAJICogQHNlZSAjY29udmVydChULCBBU1QpCiAJICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IEUgY29udmVydF8oVCBvYmplY3QsIEFTVCBhc3QpOworCXByb3RlY3RlZCBhYnN0cmFjdCBFeHByZXNzaW9uIGNvbnZlcnRPYmplY3QoVCBvYmplY3QsIEFTVCBhc3QpOwogCi0JcHVibGljIFQgY29udmVydChFIGV4cHJlc3Npb24pIHsKLQkJcmV0dXJuIChleHByZXNzaW9uID09IG51bGwpID8gbnVsbCA6IHRoaXMuY29udmVydF8oZXhwcmVzc2lvbik7CisKKwkvLyAqKioqKioqKioqIGV4cHJlc3Npb24gLT4gb2JqZWN0ICoqKioqKioqKioKKworCXB1YmxpYyBUIGNvbnZlcnQoRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisJCXJldHVybiAoZXhwcmVzc2lvbiA9PSBudWxsKSA/IHRoaXMuY29udmVydE51bGwoKSA6IHRoaXMuY29udmVydEV4cHJlc3Npb24oZXhwcmVzc2lvbik7CisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSBvYmplY3QgZm9yIGEgbnVsbCBleHByZXNzaW9uLiBCeSBkZWZhdWx0LCBhIG51bGwgZXhwcmVzc2lvbiB3aWxsCisJICogYmUgY29udmVydGVkIGludG8gYSBudWxsIG9iamVjdC4KKwkgKi8KKwlwcm90ZWN0ZWQgVCBjb252ZXJ0TnVsbCgpIHsKKwkJcmV0dXJuIG51bGw7CiAJfQogCiAJLyoqCiAJICogVGhlIHNwZWNpZmllZCBleHByZXNzaW9uIGlzIG5vdCBudWxsLgogCSAqIEBzZWUgI2NvbnZlcnQoRXhwcmVzc2lvbikKIAkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgVCBjb252ZXJ0XyhFIGV4cHJlc3Npb24pOworCXByb3RlY3RlZCBhYnN0cmFjdCBUIGNvbnZlcnRFeHByZXNzaW9uKEV4cHJlc3Npb24gZXhwcmVzc2lvbik7CiAKIAlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pkdHV0aWxpdHkvQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qZHR1dGlsaXR5L0Fubm90YXRpb25FZGl0Rm9ybWF0dGVyLmphdmEKaW5kZXggODgxOWQwMS4uOTFlYjUzYyAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pkdHV0aWxpdHkvQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvamR0dXRpbGl0eS9Bbm5vdGF0aW9uRWRpdEZvcm1hdHRlci5qYXZhCkBAIC0xLDE1NSArMSwyNCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KICAqIAotICogQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAgICAgICAgCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qZHR1dGlsaXR5OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLkluc2VydEVkaXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NYWxmb3JtZWRUcmVlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTXVsdGlUZXh0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwogaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuVGV4dEVkaXQ7CiAKLS8qKgotICogVGhpcyB3aWxsIGFwcGx5IFRleHRFZGl0J3MgdG8gYSBkb2MgYW5kIGRvIHNvbWUgZXh0cmEgd29yayB0byBjbGVhbnVwIHNvbWUKLSAqIG9mIHRoZSBuYXN0eSBFY2xpcHNlIGFubm90YXRpb24gZm9ybWF0dGluZyAoZS5nLiBhcnJheXMgb2YgYW5ub3RhdGlvbnMpLgotICovCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIgewotCQotCXByb3RlY3RlZCBJRG9jdW1lbnQgZG9jOwotCi0JcHVibGljIEFubm90YXRpb25FZGl0Rm9ybWF0dGVyKElEb2N1bWVudCBkb2MpIHsKLQkJdGhpcy5kb2MgPSBkb2M7Ci0JfQotCQotCS8qKgotCSAqIEFwcGx5IHRoZSBlZGl0cyB0byBvdXIgZG9jIGRvaW5nIGV4dHJhIGZvcm1hdHRpbmcgYXMgbmVlZGVkLiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBhcHBseShUZXh0RWRpdCBlZGl0cykgdGhyb3dzIE1hbGZvcm1lZFRyZWVFeGNlcHRpb24sIAotCQkJQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQllZGl0cy5hcHBseShkb2MsIFRleHRFZGl0LlVQREFURV9SRUdJT05TKTsKLQkJTXVsdGlUZXh0RWRpdCBleHRyYSA9IG5ldyBNdWx0aVRleHRFZGl0KCk7Ci0JCVRleHRFZGl0W10gYWxsID0gZWRpdHMuZ2V0Q2hpbGRyZW4oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbGwubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChhbGxbaV0gaW5zdGFuY2VvZiBJbnNlcnRFZGl0KSB7Ci0JCQkJSW5zZXJ0RWRpdCBhID0gKEluc2VydEVkaXQpYWxsW2ldOwotCQkJCWlmIChpICsgMSA8IGFsbC5sZW5ndGggJiYgYWxsW2kgKyAxXSBpbnN0YW5jZW9mIEluc2VydEVkaXQpIHsKLQkJCQkJSW5zZXJ0RWRpdCBiID0gKEluc2VydEVkaXQpYWxsW2kgKyAxXTsKLQkJCQkJaWYgKCIgIi5lcXVhbHMoYi5nZXRUZXh0KCkpICYmIGlzQW5ub3RhdGlvbihhKSkgewotCQkJCQkJLy8gQW5ub3RhdGlvbiBiZWluZyBpbnNlcnRlZCBiZWZvcmUgc29tZXRoaW5nIG9uIHRoZSBzYW1lIGxpbmUuCi0JCQkJCQkvLyBJbnNlcnQgYSBuZXdsaW5lIGFuZCBpbmRlbnQgYWZ0ZXIgdGhlIGFubm90YXRpb24uCi0JCQkJCQlSZXBsYWNlRWRpdCByZSA9IG5ldyBSZXBsYWNlRWRpdChiLmdldE9mZnNldCgpLCAxLCAKLQkJCQkJCQkJZ2V0TmV3bGluZUFuZElkZW50KGIuZ2V0T2Zmc2V0KCkpKTsKLQkJCQkJCWV4dHJhLmFkZENoaWxkKHJlKTsKLQkJCQkJCWkrKzsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCWlmICgiLCAiLmVxdWFscyhhLmdldFRleHQoKSkgJiYgaXNBbm5vdGF0aW9uKGIpKSB7Ci0JCQkJCQkvLyBBbm5vdGF0aW9uIGJlaW5nIGluc2VydGVkIGluIGFuIGFycmF5IGluaXRpYWxpemVyIG9uIHRoZQotCQkJCQkJLy8gc2FtZSBsaW5lIGFzIHRoZSBwcmV2aW91cyBhcnJheSBlbGVtZW50LgotCQkJCQkJLy8gSW5zZXJ0IGEgbmV3bGluZSBhbmQgaW5kZW50IGJlZm9yZSB0aGUgYW5ub3RhdGlvbi4KLQkJCQkJCVJlcGxhY2VFZGl0IHJlID0gbmV3IFJlcGxhY2VFZGl0KGEuZ2V0T2Zmc2V0KCkgKyAxLCAxLCAKLQkJCQkJCQkJZ2V0TmV3bGluZUFuZElkZW50KGEuZ2V0T2Zmc2V0KCkpKTsKLQkJCQkJCWV4dHJhLmFkZENoaWxkKHJlKTsKLQkJCQkJCWkrKzsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChmb3JtYXRBcnJheUluaXQoYSwgZXh0cmEpKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlleHRyYS5hcHBseShkb2MsIDApOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBTdHJpbmcgY29udGFpbmluZyBhIGxpbmUgZGVsaW1ldGVyIGFuZCBpbmRlbnRpbmcgY2hhcmFjdGVycyAKLQkgKiBtYXRjaGluZyB0aGUgaW5kZW50IGxldmVsIG9mIHRoZSBsaW5lIGNvbnRhaW5pbmcgY2hhcmFjdGVyIG9mZnNldC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE5ld2xpbmVBbmRJZGVudChpbnQgb2Zmc2V0KSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlpbnQgbGluZSA9IGRvYy5nZXRMaW5lT2ZPZmZzZXQob2Zmc2V0KTsKLQkJb2Zmc2V0ID0gZG9jLmdldExpbmVPZmZzZXQobGluZSk7Ci0JCVN0cmluZ0J1ZmZlciBzID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlzLmFwcGVuZChkb2MuZ2V0TGluZURlbGltaXRlcihsaW5lKSk7Ci0JCWZvciAoOzspIHsKLQkJCWNoYXIgYyA9IGRvYy5nZXRDaGFyKG9mZnNldCsrKTsKLQkJCWlmIChjID09ICcgJyB8fCBjID09ICdcdCcpIHsKLQkJCQlzLmFwcGVuZChjKTsKLQkJCX0gZWxzZSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHMudG9TdHJpbmcoKTsKLQl9Ci0JCi0JLyoqCi0JICogSXMgZSBpbnNlcnRpbmcgYW4gYW5ub3RhdGlvbj8gCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNBbm5vdGF0aW9uKEluc2VydEVkaXQgZSkgewotCQlTdHJpbmcgcyA9IGUuZ2V0VGV4dCgpOwotCQlyZXR1cm4gcy5sZW5ndGgoKSA+IDEgJiYgcy5jaGFyQXQoMCkgPT0gJ0AnOwotCX0KK3B1YmxpYyBpbnRlcmZhY2UgQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIgewogCiAJLyoqCi0JICogSWYgYSBpcyBpbnNlcnRpbmcgYW4gYW5ub3RhdGlvbiBjb250YWluaW5nIGFuIGFycmF5IG9mIGFubm90YXRpb25zIGFzCi0JICogaXRzIHZhbHVlIHRoZW4gZm9ybWF0IHRoZW0gbmljZWx5IGFuZCByZXR1cm4gdHJ1ZS4KKwkgKiBSZXZpZXcgdGhlIHNwZWNpZmllZCBlZGl0cyBhbmQgZm9ybWF0IHRoZSBzcGVjaWZpZWQgZG9jdW1lbnQgYXMgbmVlZGVkLgogCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGZvcm1hdEFycmF5SW5pdChJbnNlcnRFZGl0IGEsIE11bHRpVGV4dEVkaXQgZXh0cmEpIAotCQkJdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHMgPSBhLmdldFRleHQoKTsKLQkJaW50IG4gPSBzLmxlbmd0aCgpOwotCQlpZiAobiA8IDYgfHwgcy5jaGFyQXQoMCkgIT0gJ0AnKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaW50IHBvczsKLQkJZm9yIChwb3MgPSAxOyBwb3MgPCBuICYmIHMuY2hhckF0KHBvcysrKSAhPSAnKCc7ICkgey8qIGp1c3QgbW92ZSAncG9zJyAqL30KLQkJaWYgKHBvcyA9PSBuKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJZm9yICg7IHBvcyA8IG47ICkgewotCQkJY2hhciBjID0gcy5jaGFyQXQocG9zKyspOwotCQkJaWYgKGMgPT0gJ3snKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoYyAhPSAnICcpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJaWYgKHBvcyA9PSBuKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJLy8gbm93IGxvb2sgZm9yIEAgbm90IGluc2lkZSBwYXJlbnRoZXNpcyBhbmQgcHV0IGluIAotCQkvLyBsaW5lIGRlbGltZXRlciBhbmQgaW5kZW50IHN0cmluZyBiZWZvcmUgZWFjaAotCQlpbnQgb2Zmc2V0ID0gYS5nZXRPZmZzZXQoKTsKLQkJU3RyaW5nIGluZGVudCA9IG51bGw7Ci0JCWludCBwYXJlbkNvdW50ID0gMDsKLQkJZm9yICg7IHBvcyA8IG47IHBvcysrKSB7Ci0JCQljaGFyIGMgPSBzLmNoYXJBdChwb3MpOwotCQkJc3dpdGNoIChjKSB7Ci0JCQljYXNlICcoJzoKLQkJCQkrK3BhcmVuQ291bnQ7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICcpJzoKLQkJCQktLXBhcmVuQ291bnQ7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdAJzoKLQkJCQlpZiAocGFyZW5Db3VudCA9PSAwKSB7Ci0JCQkJCWlmIChpbmRlbnQgPT0gbnVsbCkgewotCQkJCQkJaW5kZW50ID0gZ2V0TmV3bGluZUFuZElkZW50KG9mZnNldCkgKyAiXHQiOwotCQkJCQl9Ci0JCQkJCUluc2VydEVkaXQgaWUgPSBuZXcgSW5zZXJ0RWRpdChvZmZzZXQgKyBwb3MsIGluZGVudCk7Ci0JCQkJCWV4dHJhLmFkZENoaWxkKGllKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluZGVudCAhPSBudWxsOwotCX0KLQkKKwl2b2lkIGZvcm1hdChJRG9jdW1lbnQgZG9jLCBUZXh0RWRpdCBlZGl0VHJlZSkgdGhyb3dzIE1hbGZvcm1lZFRyZWVFeGNlcHRpb24sIEJhZExvY2F0aW9uRXhjZXB0aW9uOworCiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvamR0dXRpbGl0eS9Bbm5vdGF0aW9uU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvamR0dXRpbGl0eS9Bbm5vdGF0aW9uU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE1NTdmNgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qZHR1dGlsaXR5L0Fubm90YXRpb25TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIuamF2YQpAQCAtMCwwICsxLDk1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KKyAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BcnJheUluaXRpYWxpemVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOworCisvKioKKyAqIENvbnZlcnQgYW4gYXJyYXkgaW5pdGlhbGl6ZXIgb3Igc2luZ2xlIGV4cHJlc3Npb24gdG8vZnJvbSBhbiBhcnJheSBvZgorICogc3RyaW5ncyAoZS5nLiB7InRleHQwIiwgInRleHQxIn0pLgorICogRSBpcyB0aGUgdHlwZSBvZiB0aGUgZXhwcmVzc2lvbnMgdG8gYmUgZm91bmQgZWl0aGVyIHN0YW5kYWxvbmUgb3IKKyAqIGFzIGVsZW1lbnRzIGluIHRoZSBhcnJheSBpbml0aWFsaXplci4KKyAqLworcHVibGljIGNsYXNzIEFubm90YXRpb25TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIKKwlleHRlbmRzIEFic3RyYWN0RXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmdbXT4KK3sKKwlwcml2YXRlIGZpbmFsIEV4cHJlc3Npb25Db252ZXJ0ZXI8U3RyaW5nPiBlbGVtZW50Q29udmVydGVyOworCXByaXZhdGUgZmluYWwgU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyIGFycmF5Q29udmVydGVyOworCisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0byByZW1vdmUgdGhlIGFycmF5IGluaXRpYWxpemVyIGlmIGl0IGlzIGVtcHR5LgorCSAqLworCXB1YmxpYyBBbm5vdGF0aW9uU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyKEV4cHJlc3Npb25Db252ZXJ0ZXI8U3RyaW5nPiBlbGVtZW50Q29udmVydGVyKSB7CisJCXRoaXMoZWxlbWVudENvbnZlcnRlciwgdHJ1ZSk7CisJfQorCisJcHVibGljIEFubm90YXRpb25TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIoRXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmc+IGVsZW1lbnRDb252ZXJ0ZXIsIGJvb2xlYW4gcmVtb3ZlQXJyYXlJbml0aWFsaXplcldoZW5FbXB0eSkgeworCQlzdXBlcigpOworCQl0aGlzLmVsZW1lbnRDb252ZXJ0ZXIgPSBlbGVtZW50Q29udmVydGVyOworCQl0aGlzLmFycmF5Q29udmVydGVyID0gbmV3IFN0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlcihlbGVtZW50Q29udmVydGVyLCByZW1vdmVBcnJheUluaXRpYWxpemVyV2hlbkVtcHR5KTsKKwl9CisKKwkvKioKKwkgKiBpZiB3ZSBvbmx5IGhhdmUgYSBzaW5nbGUgc3RyaW5nIGluIHRoZSBhcnJheSByZXR1cm4gdGhlIHNpbmdsZSBleHByZXNzaW9uLAorCSAqIHdpdGhvdXQgYnJhY2VzLCBpbnN0ZWFkIG9mIGFuIGFycmF5IGluaXRpYWxpemVyCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEV4cHJlc3Npb24gY29udmVydE9iamVjdChTdHJpbmdbXSBzdHJpbmdzLCBBU1QgYXN0KSB7CisJCXJldHVybiAoc3RyaW5ncy5sZW5ndGggPT0gMSkgPworCQkJCXRoaXMuZWxlbWVudENvbnZlcnRlci5jb252ZXJ0KHN0cmluZ3NbMF0sIGFzdCkKKwkJCToKKwkJCQl0aGlzLmFycmF5Q29udmVydGVyLmNvbnZlcnRPYmplY3Qoc3RyaW5ncywgYXN0KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RyaW5nW10gY29udmVydE51bGwoKSB7CisJCXJldHVybiB0aGlzLmFycmF5Q29udmVydGVyLmNvbnZlcnROdWxsKCk7CisJfQorCisJLyoqCisJICogY2hlY2sgZm9yIGEgc2luZ2xlIGV4cHJlc3Npb24gd2l0aCBubyBzdXJyb3VuZGluZyBicmFjZXMsIGltcGx5aW5nIGEKKwkgKiBzaW5nbGUtZW50cnkgYXJyYXkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RyaW5nW10gY29udmVydEV4cHJlc3Npb24oRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisJCXJldHVybiAoZXhwcmVzc2lvbi5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuQVJSQVlfSU5JVElBTElaRVIpID8KKwkJCQl0aGlzLmFycmF5Q29udmVydGVyLmNvbnZlcnRBcnJheUluaXRpYWxpemVyKChBcnJheUluaXRpYWxpemVyKSBleHByZXNzaW9uKQorCQkJOgorCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5lbGVtZW50Q29udmVydGVyLmNvbnZlcnQoZXhwcmVzc2lvbil9OworCX0KKworCisJLy8gKioqKioqKioqKiBmYWN0b3J5IG1ldGhvZHMgKioqKioqKioqKgorCisJLyoqCisJICogQnVpbGQgYW4gZXhwcmVzc2lvbiBjb252ZXJ0ZXIgZm9yIGFuIGFubm90YXRpb24gZWxlbWVudCBvZiB0eXBlIFN0cmluZ1tdLgorCSAqICAgICBARm9vKGJhcj17InRleHQwIiwgInRleHQxIn0pCisJICogb3IKKwkgKiAgICAgQEZvbyhiYXI9InRleHQwIikKKwkgKi8KKwlwdWJsaWMgc3RhdGljIEFubm90YXRpb25TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIgZm9yU3RyaW5ncygpIHsKKwkJcmV0dXJuIG5ldyBBbm5vdGF0aW9uU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyKFN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7CisJfQorCisJLyoqCisJICogQnVpbGQgYW4gZXhwcmVzc2lvbiBjb252ZXJ0ZXIgZm9yIGFuIGFubm90YXRpb24gZWxlbWVudCBvZiB0eXBlIDxlbnVtPltdLgorCSAqICAgICBARm9vKGJhcj17QkFaLCBCQVR9KQorCSAqIG9yCisJICogICAgIEBGb28oYmFyPUJBWikKKwkgKi8KKwlwdWJsaWMgc3RhdGljIEFubm90YXRpb25TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIgZm9yTmFtZXMoKSB7CisJCXJldHVybiBuZXcgQW5ub3RhdGlvblN0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlcihOYW1lU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qZHR1dGlsaXR5L0F0dHJpYnV0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pkdHV0aWxpdHkvQXR0cmlidXRlLmphdmEKaW5kZXggYmI0NjAwOC4uNjBkYzk1OCAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pkdHV0aWxpdHkvQXR0cmlidXRlLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pkdHV0aWxpdHkvQXR0cmlidXRlLmphdmEKQEAgLTEwLDE0ICsxMCwxNyBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qZHR1dGlsaXR5OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1lbWJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JVHlwZUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29tbWFuZEV4ZWN1dG9yUHJvdmlkZXI7CiAKIC8qKgogICogQ29tYmluZSBiZWhhdmlvciBjb21tb24gdG8gRmllbGRBdHRyaWJ1dGUgYW5kIE1ldGhvZEF0dHJpYnV0ZS4KICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIEF0dHJpYnV0ZSBleHRlbmRzIE1lbWJlciB7CiAKLQlBdHRyaWJ1dGUoSU1lbWJlciBqZHRNZW1iZXIpIHsKLQkJc3VwZXIoamR0TWVtYmVyKTsKKwlBdHRyaWJ1dGUoSU1lbWJlciBqZHRNZW1iZXIsIENvbW1hbmRFeGVjdXRvclByb3ZpZGVyIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yUHJvdmlkZXIpIHsKKwkJc3VwZXIoamR0TWVtYmVyLCBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvclByb3ZpZGVyKTsKIAl9CiAKIAlwdWJsaWMgYm9vbGVhbiBpc0ZpZWxkKCkgewpAQCAtMzAsMTQgKzMzLDggQEAKIAogCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgYXR0cmlidXRlTmFtZSgpOwogCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyB0eXBlU2lnbmF0dXJlKCk7Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1ByaW1pdGl2ZVR5cGUoKSB7Ci0JCXJldHVybiBKRFRUb29scy5zaWduYXR1cmVJc1ByaW1pdGl2ZSh0aGlzLnR5cGVTaWduYXR1cmUoKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdHlwZUlzKFN0cmluZyBmdWxseVF1YWxpZmllZFR5cGVOYW1lKSB7Ci0JCXJldHVybiBmdWxseVF1YWxpZmllZFR5cGVOYW1lLmVxdWFscyh0aGlzLnJlc29sdmVkVHlwZU5hbWUoKSk7CisJcHVibGljIGJvb2xlYW4gdHlwZUlzKFN0cmluZyBmdWxseVF1YWxpZmllZFR5cGVOYW1lLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gZnVsbHlRdWFsaWZpZWRUeXBlTmFtZS5lcXVhbHModGhpcy5yZXNvbHZlZFR5cGVOYW1lKGFzdFJvb3QpKTsKIAl9CiAKIAkvKioKQEAgLTQ1LDggKzQyLDE0IEBACiAJICogUmV0dXJuIHRoZSBmdWxseS1xdWFsaWZpZWQgdHlwZSBuYW1lIG9yIHJldHVybiBudWxsIGlmIGl0IGNhbm5vdCBiZQogCSAqIHJlc29sdmVkIHVuYW1iaWd1b3VzbHkuCiAJICovCi0JcHVibGljIFN0cmluZyByZXNvbHZlZFR5cGVOYW1lKCkgewotCQlyZXR1cm4gSkRUVG9vbHMucmVzb2x2ZVNpZ25hdHVyZSh0aGlzLnR5cGVTaWduYXR1cmUoKSwgdGhpcy5nZXRKZHRNZW1iZXIoKS5nZXREZWNsYXJpbmdUeXBlKCkpOworCXB1YmxpYyBTdHJpbmcgcmVzb2x2ZWRUeXBlTmFtZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSB0eXBlQmluZGluZyhhc3RSb290KTsKKwkJaWYgKHR5cGVCaW5kaW5nICE9IG51bGwpIHsKKwkJCXJldHVybiB0eXBlQmluZGluZy5nZXRRdWFsaWZpZWROYW1lKCk7CisJCX0KKwkJcmV0dXJuIG51bGw7CiAJfQogCisKKwlwdWJsaWMgYWJzdHJhY3QgSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qZHR1dGlsaXR5L0Jvb2xlYW5TdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvamR0dXRpbGl0eS9Cb29sZWFuU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5qYXZhCmluZGV4IDBmNTg1NGUuLmY3YmY1ZDYgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qZHR1dGlsaXR5L0Jvb2xlYW5TdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pkdHV0aWxpdHkvQm9vbGVhblN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuamF2YQpAQCAtMTAsMjIgKzEwLDIyIEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHk7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Cb29sZWFuTGl0ZXJhbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbjsKIAogLyoqCiAgKiBDb252ZXJ0IGEgYm9vbGVhbiBsaXRlcmFsIHRvL2Zyb20gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBib29sZWFuCiAgKiAoZS5nLiAidHJ1ZSIpLgogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgQm9vbGVhblN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIKLQlleHRlbmRzIEFic3RyYWN0RXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmcsIEJvb2xlYW5MaXRlcmFsPgorCWV4dGVuZHMgQWJzdHJhY3RFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZz4KIHsKLQlwcml2YXRlIHN0YXRpYyBFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZywgQm9vbGVhbkxpdGVyYWw+IElOU1RBTkNFOworCXByaXZhdGUgc3RhdGljIEV4cHJlc3Npb25Db252ZXJ0ZXI8U3RyaW5nPiBJTlNUQU5DRTsKIAogCS8qKgogCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgRXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmcsIEJvb2xlYW5MaXRlcmFsPiBpbnN0YW5jZSgpIHsKKwlwdWJsaWMgc3RhdGljIEV4cHJlc3Npb25Db252ZXJ0ZXI8U3RyaW5nPiBpbnN0YW5jZSgpIHsKIAkJaWYgKElOU1RBTkNFID09IG51bGwpIHsKIAkJCUlOU1RBTkNFID0gbmV3IEJvb2xlYW5TdHJpbmdFeHByZXNzaW9uQ29udmVydGVyKCk7CiAJCX0KQEAgLTQwLDE2ICs0MCwxNCBAQAogCX0KIAogCUBPdmVycmlkZQotCXByb3RlY3RlZCBCb29sZWFuTGl0ZXJhbCBjb252ZXJ0XyhTdHJpbmcgc3RyaW5nLCBBU1QgYXN0KSB7CisJcHJvdGVjdGVkIEJvb2xlYW5MaXRlcmFsIGNvbnZlcnRPYmplY3QoU3RyaW5nIHN0cmluZywgQVNUIGFzdCkgewogCQlyZXR1cm4gYXN0Lm5ld0Jvb2xlYW5MaXRlcmFsKEJvb2xlYW4udmFsdWVPZihzdHJpbmcpLmJvb2xlYW5WYWx1ZSgpKTsKIAl9CiAKIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbnZlcnRfKEJvb2xlYW5MaXRlcmFsIGJvb2xlYW5MaXRlcmFsKSB7Ci0JCXJldHVybiAoYm9vbGVhbkxpdGVyYWwuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLkJPT0xFQU5fTElURVJBTCkgPwotCQkJQm9vbGVhbi50b1N0cmluZyhib29sZWFuTGl0ZXJhbC5ib29sZWFuVmFsdWUoKSkKLQkJOgotCQkJbnVsbDsKKwlwcm90ZWN0ZWQgU3RyaW5nIGNvbnZlcnRFeHByZXNzaW9uKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworCQlPYmplY3QgdmFsdWUgPSBleHByZXNzaW9uLnJlc29sdmVDb25zdGFudEV4cHJlc3Npb25WYWx1ZSgpOworCQlyZXR1cm4gKHZhbHVlIGluc3RhbmNlb2YgQm9vbGVhbikgPyAoKEJvb2xlYW4pIHZhbHVlKS50b1N0cmluZygpIDogbnVsbDsKIAl9CiAKIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qZHR1dGlsaXR5L0NoYXJhY3RlclN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qZHR1dGlsaXR5L0NoYXJhY3RlclN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuamF2YQppbmRleCAxZmEwNTVkLi5kZmMyZmRjIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvamR0dXRpbGl0eS9DaGFyYWN0ZXJTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pkdHV0aWxpdHkvQ2hhcmFjdGVyU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5qYXZhCkBAIC0xMCwyMiArMTAsMjIgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuamR0dXRpbGl0eTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNoYXJhY3RlckxpdGVyYWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247CiAKIC8qKgogICogQ29udmVydCBhIGNoYXJhY3RlciBsaXRlcmFsIHRvL2Zyb20gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBjaGFyYWN0ZXIKICAqIChlLmcuICJBIikuCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBDaGFyYWN0ZXJTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyCi0JZXh0ZW5kcyBBYnN0cmFjdEV4cHJlc3Npb25Db252ZXJ0ZXI8U3RyaW5nLCBDaGFyYWN0ZXJMaXRlcmFsPgorCWV4dGVuZHMgQWJzdHJhY3RFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZz4KIHsKLQlwcml2YXRlIHN0YXRpYyBFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZywgQ2hhcmFjdGVyTGl0ZXJhbD4gSU5TVEFOQ0U7CisJcHJpdmF0ZSBzdGF0aWMgRXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmc+IElOU1RBTkNFOwogCiAJLyoqCiAJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCiAJICovCi0JcHVibGljIHN0YXRpYyBFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZywgQ2hhcmFjdGVyTGl0ZXJhbD4gaW5zdGFuY2UoKSB7CisJcHVibGljIHN0YXRpYyBFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZz4gaW5zdGFuY2UoKSB7CiAJCWlmIChJTlNUQU5DRSA9PSBudWxsKSB7CiAJCQlJTlNUQU5DRSA9IG5ldyBDaGFyYWN0ZXJTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyKCk7CiAJCX0KQEAgLTQwLDE4ICs0MCwxNiBAQAogCX0KIAkKIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ2hhcmFjdGVyTGl0ZXJhbCBjb252ZXJ0XyhTdHJpbmcgc3RyaW5nLCBBU1QgYXN0KSB7CisJcHJvdGVjdGVkIENoYXJhY3RlckxpdGVyYWwgY29udmVydE9iamVjdChTdHJpbmcgc3RyaW5nLCBBU1QgYXN0KSB7CiAJCUNoYXJhY3RlckxpdGVyYWwgY2hhcmFjdGVyTGl0ZXJhbCA9IGFzdC5uZXdDaGFyYWN0ZXJMaXRlcmFsKCk7CiAJCWNoYXJhY3RlckxpdGVyYWwuc2V0Q2hhclZhbHVlKHN0cmluZy5jaGFyQXQoMCkpOwogCQlyZXR1cm4gY2hhcmFjdGVyTGl0ZXJhbDsKIAl9CiAKIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbnZlcnRfKENoYXJhY3RlckxpdGVyYWwgY2hhcmFjdGVyTGl0ZXJhbCkgewotCQlyZXR1cm4gKGNoYXJhY3RlckxpdGVyYWwuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLkNIQVJBQ1RFUl9MSVRFUkFMKSA/Ci0JCQlDaGFyYWN0ZXIudG9TdHJpbmcoY2hhcmFjdGVyTGl0ZXJhbC5jaGFyVmFsdWUoKSkKLQkJOgotCQkJbnVsbDsKKwlwcm90ZWN0ZWQgU3RyaW5nIGNvbnZlcnRFeHByZXNzaW9uKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworCQlPYmplY3QgdmFsdWUgPSBleHByZXNzaW9uLnJlc29sdmVDb25zdGFudEV4cHJlc3Npb25WYWx1ZSgpOworCQlyZXR1cm4gKHZhbHVlIGluc3RhbmNlb2YgQ2hhcmFjdGVyKSA/ICgoQ2hhcmFjdGVyKSB2YWx1ZSkudG9TdHJpbmcoKSA6IG51bGw7CiAJfQogCiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvamR0dXRpbGl0eS9Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qZHR1dGlsaXR5L0NvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5qYXZhCmluZGV4IDExZWFkOWQuLmY2Y2YwMTAgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qZHR1dGlsaXR5L0NvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qZHR1dGlsaXR5L0NvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5qYXZhCkBAIC0xMSw3OCArMTEsNTEgQEAKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TdHJpbmdMaXRlcmFsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwogCiAvKioKICAqIFdyYXAgYSBkZWNsYXJhdGlvbiBhbm5vdGF0aW9uIGVsZW1lbnQgYWRhcHRlciB0aGF0IGRlYWxzIHdpdGggQVNUCiAgKiBleHByZXNzaW9ucywgY29udmVydGluZyB0aGVtIHRvL2Zyb20gdmFyaW91cyBvdGhlciBvYmplY3RzLgogICogVCBpcyB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0IHRvIGJlIHBhc3NlZCB0byBhbmQgcmV0dXJuZWQgYnkgdGhlIGFkYXB0ZXIuCi0gKiBFIGlzIHRoZSB0eXBlIG9mIHRoZSBleHByZXNzaW9uIHRvIGJlIGNvbnZlcnRlZCBieSB0aGUgY29udmVydGVyLgogICovCi1wdWJsaWMgY2xhc3MgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFQsIEUgZXh0ZW5kcyBFeHByZXNzaW9uPgorcHVibGljIGNsYXNzIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxUPgogCWltcGxlbWVudHMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8VD4KIHsKIAkvKioKIAkgKiBUaGUgd3JhcHBlZCBhZGFwdGVyIHRoYXQgcmV0dXJucyBhbmQgdGFrZXMgQVNUIGV4cHJlc3Npb25zLgogCSAqLwotCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8RT4gYWRhcHRlcjsKKwlwcml2YXRlIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEV4cHJlc3Npb24+IGFkYXB0ZXI7CiAKIAkvKioKIAkgKiBUaGUgY29udmVydGVyIHRoYXQgY29udmVydHMgQVNUIGV4cHJlc3Npb25zIHRvIG90aGVyIG9iamVjdHMKIAkgKiAoZS5nLiBTdHJpbmdzKS4KIAkgKi8KLQlwcml2YXRlIGZpbmFsIEV4cHJlc3Npb25Db252ZXJ0ZXI8VCwgRT4gY29udmVydGVyOworCXByaXZhdGUgZmluYWwgRXhwcmVzc2lvbkNvbnZlcnRlcjxUPiBjb252ZXJ0ZXI7CiAKIAogCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKIAogCS8qKgogCSAqIFRoZSBkZWZhdWx0IGVsZW1lbnQgbmFtZSBpcyAidmFsdWUiOyB0aGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0bwotCSAqIHJlbW92ZSB0aGUgYW5ub3RhdGlvbiB3aGVuIHRoZSBsYXN0IGVsZW1lbnQgaXMgcmVtb3ZlZDsKLQkgKiB0aGUgZGVmYXVsdCBleHByZXNzaW9uIGNvbnZlcnRlciBleHBlY3RzIHN0cmluZyBsaXRlcmFscy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmcsIFN0cmluZ0xpdGVyYWw+IGZvclN0cmluZ3MoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlcikgewotCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmcsIFN0cmluZ0xpdGVyYWw+KGFubm90YXRpb25BZGFwdGVyLCBTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGVsZW1lbnQgbmFtZSBpcyAidmFsdWUiOyB0aGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0bwogCSAqIHJlbW92ZSB0aGUgYW5ub3RhdGlvbiB3aGVuIHRoZSBsYXN0IGVsZW1lbnQgaXMgcmVtb3ZlZC4KIAkgKi8KLQlwdWJsaWMgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIsIEV4cHJlc3Npb25Db252ZXJ0ZXI8VCwgRT4gY29udmVydGVyKSB7Ci0JCXRoaXMobmV3IEV4cHJlc3Npb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxFPihhbm5vdGF0aW9uQWRhcHRlciksIGNvbnZlcnRlcik7Ci0JfQotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gcmVtb3ZlIHRoZSBhbm5vdGF0aW9uIHdoZW4gdGhlIGxhc3QKLQkgKiBlbGVtZW50IGlzIHJlbW92ZWQ7IHRoZSBkZWZhdWx0IGV4cHJlc3Npb24gY29udmVydGVyIGV4cGVjdHMKLQkgKiBzdHJpbmcgbGl0ZXJhbHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nLCBTdHJpbmdMaXRlcmFsPiBmb3JTdHJpbmdzKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIsIFN0cmluZyBlbGVtZW50TmFtZSkgewotCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmcsIFN0cmluZ0xpdGVyYWw+KGFubm90YXRpb25BZGFwdGVyLCBlbGVtZW50TmFtZSwgU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKKwlwdWJsaWMgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIsIEV4cHJlc3Npb25Db252ZXJ0ZXI8VD4gY29udmVydGVyKSB7CisJCXRoaXMobmV3IEV4cHJlc3Npb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxFeHByZXNzaW9uPihhbm5vdGF0aW9uQWRhcHRlciksIGNvbnZlcnRlcik7CiAJfQogCiAJLyoqCiAJICogVGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gcmVtb3ZlIHRoZSBhbm5vdGF0aW9uIHdoZW4gdGhlIGxhc3QKIAkgKiBlbGVtZW50IGlzIHJlbW92ZWQuCiAJICovCi0JcHVibGljIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyLCBTdHJpbmcgZWxlbWVudE5hbWUsIEV4cHJlc3Npb25Db252ZXJ0ZXI8VCwgRT4gY29udmVydGVyKSB7Ci0JCXRoaXMobmV3IEV4cHJlc3Npb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxFPihhbm5vdGF0aW9uQWRhcHRlciwgZWxlbWVudE5hbWUpLCBjb252ZXJ0ZXIpOworCXB1YmxpYyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlciwgU3RyaW5nIGVsZW1lbnROYW1lLCBFeHByZXNzaW9uQ29udmVydGVyPFQ+IGNvbnZlcnRlcikgeworCQl0aGlzKG5ldyBFeHByZXNzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8RXhwcmVzc2lvbj4oYW5ub3RhdGlvbkFkYXB0ZXIsIGVsZW1lbnROYW1lKSwgY29udmVydGVyKTsKIAl9CiAKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBleHByZXNzaW9uIGNvbnZlcnRlciBleHBlY3RzIHN0cmluZyBsaXRlcmFscy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmcsIFN0cmluZ0xpdGVyYWw+IGZvclN0cmluZ3MoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlciwgU3RyaW5nIGVsZW1lbnROYW1lLCBib29sZWFuIHJlbW92ZUFubm90YXRpb25XaGVuRW1wdHkpIHsKLQkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nLCBTdHJpbmdMaXRlcmFsPihhbm5vdGF0aW9uQWRhcHRlciwgZWxlbWVudE5hbWUsIHJlbW92ZUFubm90YXRpb25XaGVuRW1wdHksIFN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7CisJcHVibGljIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyLCBTdHJpbmcgZWxlbWVudE5hbWUsIGJvb2xlYW4gcmVtb3ZlQW5ub3RhdGlvbldoZW5FbXB0eSwgRXhwcmVzc2lvbkNvbnZlcnRlcjxUPiBjb252ZXJ0ZXIpIHsKKwkJdGhpcyhuZXcgRXhwcmVzc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEV4cHJlc3Npb24+KGFubm90YXRpb25BZGFwdGVyLCBlbGVtZW50TmFtZSwgcmVtb3ZlQW5ub3RhdGlvbldoZW5FbXB0eSksIGNvbnZlcnRlcik7CiAJfQogCi0JcHVibGljIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyLCBTdHJpbmcgZWxlbWVudE5hbWUsIGJvb2xlYW4gcmVtb3ZlQW5ub3RhdGlvbldoZW5FbXB0eSwgRXhwcmVzc2lvbkNvbnZlcnRlcjxULCBFPiBjb252ZXJ0ZXIpIHsKLQkJdGhpcyhuZXcgRXhwcmVzc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEU+KGFubm90YXRpb25BZGFwdGVyLCBlbGVtZW50TmFtZSwgcmVtb3ZlQW5ub3RhdGlvbldoZW5FbXB0eSksIGNvbnZlcnRlcik7Ci0JfQotCi0JcHVibGljIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxFPiBhZGFwdGVyLCBFeHByZXNzaW9uQ29udmVydGVyPFQsIEU+IGNvbnZlcnRlcikgeworCXB1YmxpYyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8RXhwcmVzc2lvbj4gYWRhcHRlciwgRXhwcmVzc2lvbkNvbnZlcnRlcjxUPiBjb252ZXJ0ZXIpIHsKIAkJc3VwZXIoKTsKIAkJdGhpcy5hZGFwdGVyID0gYWRhcHRlcjsKIAkJdGhpcy5jb252ZXJ0ZXIgPSBjb252ZXJ0ZXI7CkBAIC05Niw3ICs2OSw3IEBACiAJfQogCiAJcHVibGljIHZvaWQgc2V0VmFsdWUoVCB2YWx1ZSwgTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQl0aGlzLmFkYXB0ZXIuc2V0VmFsdWUodGhpcy5jb252ZXJ0ZXIuY29udmVydCh2YWx1ZSwgdGhpcy5hZGFwdGVyLmFzdE5vZGUoZGVjbGFyYXRpb24pLmdldEFTVCgpKSwgZGVjbGFyYXRpb24pOworCQl0aGlzLmFkYXB0ZXIuc2V0VmFsdWUodGhpcy5jb252ZXJ0ZXIuY29udmVydCh2YWx1ZSwgZGVjbGFyYXRpb24uZ2V0QVNUKCkpLCBkZWNsYXJhdGlvbik7CiAJfQogCiAJcHVibGljIEV4cHJlc3Npb24gZXhwcmVzc2lvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7CkBAIC0xMTIsNCArODUsMTA3IEBACiAJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuYWRhcHRlcik7CiAJfQogCisKKwkvLyAqKioqKioqKioqIGZhY3Rvcnkgc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgorCisJLyoqCisJICogVGhlIGRlZmF1bHQgZWxlbWVudCBuYW1lIGlzICJ2YWx1ZSI7IHRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvCisJICogcmVtb3ZlIHRoZSBhbm5vdGF0aW9uIHdoZW4gdGhlIGxhc3QgZWxlbWVudCBpcyByZW1vdmVkOworCSAqIHRoZSBkZWZhdWx0IGV4cHJlc3Npb24gY29udmVydGVyIGV4cGVjdHMgc3RyaW5nIGNvbnN0YW50IGV4cHJlc3Npb25zLgorCSAqLworCXB1YmxpYyBzdGF0aWMgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZm9yU3RyaW5ncyhEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyKSB7CisJCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oYW5ub3RhdGlvbkFkYXB0ZXIsIFN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7CisJfQorCisJLyoqCisJICogVGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gcmVtb3ZlIHRoZSBhbm5vdGF0aW9uIHdoZW4gdGhlIGxhc3QKKwkgKiBlbGVtZW50IGlzIHJlbW92ZWQ7IHRoZSBkZWZhdWx0IGV4cHJlc3Npb24gY29udmVydGVyIGV4cGVjdHMKKwkgKiBzdHJpbmcgY29uc3RhbnQgZXhwcmVzc2lvbnMuCisJICovCisJcHVibGljIHN0YXRpYyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBmb3JTdHJpbmdzKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIsIFN0cmluZyBlbGVtZW50TmFtZSkgeworCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGFubm90YXRpb25BZGFwdGVyLCBlbGVtZW50TmFtZSwgU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKKwl9CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCBleHByZXNzaW9uIGNvbnZlcnRlciBleHBlY3RzIHN0cmluZyBjb25zdGFudCBleHByZXNzaW9ucy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGZvclN0cmluZ3MoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlciwgU3RyaW5nIGVsZW1lbnROYW1lLCBib29sZWFuIHJlbW92ZUFubm90YXRpb25XaGVuRW1wdHkpIHsKKwkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihhbm5vdGF0aW9uQWRhcHRlciwgZWxlbWVudE5hbWUsIHJlbW92ZUFubm90YXRpb25XaGVuRW1wdHksIFN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7CisJfQorCisJLyoqCisJICogVGhlIGRlZmF1bHQgZWxlbWVudCBuYW1lIGlzICJ2YWx1ZSI7IHRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvCisJICogcmVtb3ZlIHRoZSBhbm5vdGF0aW9uIHdoZW4gdGhlIGxhc3QgZWxlbWVudCBpcyByZW1vdmVkOworCSAqIHRoZSBkZWZhdWx0IGV4cHJlc3Npb24gY29udmVydGVyIGV4cGVjdHMgbnVtYmVyIGNvbnN0YW50IGV4cHJlc3Npb25zLgorCSAqLworCXB1YmxpYyBzdGF0aWMgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZm9yTnVtYmVycyhEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyKSB7CisJCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oYW5ub3RhdGlvbkFkYXB0ZXIsIE51bWJlclN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7CisJfQorCisJLyoqCisJICogVGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gcmVtb3ZlIHRoZSBhbm5vdGF0aW9uIHdoZW4gdGhlIGxhc3QKKwkgKiBlbGVtZW50IGlzIHJlbW92ZWQ7IHRoZSBkZWZhdWx0IGV4cHJlc3Npb24gY29udmVydGVyIGV4cGVjdHMKKwkgKiBudW1iZXIgY29uc3RhbnQgZXhwcmVzc2lvbnMuCisJICovCisJcHVibGljIHN0YXRpYyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBmb3JOdW1iZXJzKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIsIFN0cmluZyBlbGVtZW50TmFtZSkgeworCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGFubm90YXRpb25BZGFwdGVyLCBlbGVtZW50TmFtZSwgTnVtYmVyU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKKwl9CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCBleHByZXNzaW9uIGNvbnZlcnRlciBleHBlY3RzIG51bWJlciBjb25zdGFudCBleHByZXNzaW9ucy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGZvck51bWJlcnMoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlciwgU3RyaW5nIGVsZW1lbnROYW1lLCBib29sZWFuIHJlbW92ZUFubm90YXRpb25XaGVuRW1wdHkpIHsKKwkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihhbm5vdGF0aW9uQWRhcHRlciwgZWxlbWVudE5hbWUsIHJlbW92ZUFubm90YXRpb25XaGVuRW1wdHksIE51bWJlclN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7CisJfQorCisJLyoqCisJICogVGhlIGRlZmF1bHQgZWxlbWVudCBuYW1lIGlzICJ2YWx1ZSI7IHRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvCisJICogcmVtb3ZlIHRoZSBhbm5vdGF0aW9uIHdoZW4gdGhlIGxhc3QgZWxlbWVudCBpcyByZW1vdmVkOworCSAqIHRoZSBkZWZhdWx0IGV4cHJlc3Npb24gY29udmVydGVyIGV4cGVjdHMgYm9vbGVhbiBjb25zdGFudCBleHByZXNzaW9ucy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGZvckJvb2xlYW5zKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIpIHsKKwkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihhbm5vdGF0aW9uQWRhcHRlciwgQm9vbGVhblN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7CisJfQorCisJLyoqCisJICogVGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gcmVtb3ZlIHRoZSBhbm5vdGF0aW9uIHdoZW4gdGhlIGxhc3QKKwkgKiBlbGVtZW50IGlzIHJlbW92ZWQ7IHRoZSBkZWZhdWx0IGV4cHJlc3Npb24gY29udmVydGVyIGV4cGVjdHMKKwkgKiBib29sZWFuIGNvbnN0YW50IGV4cHJlc3Npb25zLgorCSAqLworCXB1YmxpYyBzdGF0aWMgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZm9yQm9vbGVhbnMoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlciwgU3RyaW5nIGVsZW1lbnROYW1lKSB7CisJCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oYW5ub3RhdGlvbkFkYXB0ZXIsIGVsZW1lbnROYW1lLCBCb29sZWFuU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKKwl9CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCBleHByZXNzaW9uIGNvbnZlcnRlciBleHBlY3RzIGJvb2xlYW4gY29uc3RhbnQgZXhwcmVzc2lvbnMuCisJICovCisJcHVibGljIHN0YXRpYyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBmb3JCb29sZWFucyhEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyLCBTdHJpbmcgZWxlbWVudE5hbWUsIGJvb2xlYW4gcmVtb3ZlQW5ub3RhdGlvbldoZW5FbXB0eSkgeworCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGFubm90YXRpb25BZGFwdGVyLCBlbGVtZW50TmFtZSwgcmVtb3ZlQW5ub3RhdGlvbldoZW5FbXB0eSwgQm9vbGVhblN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7CisJfQorCisJLyoqCisJICogVGhlIGRlZmF1bHQgZWxlbWVudCBuYW1lIGlzICJ2YWx1ZSI7IHRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvCisJICogcmVtb3ZlIHRoZSBhbm5vdGF0aW9uIHdoZW4gdGhlIGxhc3QgZWxlbWVudCBpcyByZW1vdmVkOworCSAqIHRoZSBkZWZhdWx0IGV4cHJlc3Npb24gY29udmVydGVyIGV4cGVjdHMgY2hhcmFjdGVyIGNvbnN0YW50IGV4cHJlc3Npb25zLgorCSAqLworCXB1YmxpYyBzdGF0aWMgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZm9yQ2hhcmFjdGVycyhEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyKSB7CisJCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oYW5ub3RhdGlvbkFkYXB0ZXIsIENoYXJhY3RlclN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7CisJfQorCisJLyoqCisJICogVGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gcmVtb3ZlIHRoZSBhbm5vdGF0aW9uIHdoZW4gdGhlIGxhc3QKKwkgKiBlbGVtZW50IGlzIHJlbW92ZWQ7IHRoZSBkZWZhdWx0IGV4cHJlc3Npb24gY29udmVydGVyIGV4cGVjdHMKKwkgKiBjaGFyYWN0ZXIgY29uc3RhbnQgZXhwcmVzc2lvbnMuCisJICovCisJcHVibGljIHN0YXRpYyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBmb3JDaGFyYWN0ZXJzKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIsIFN0cmluZyBlbGVtZW50TmFtZSkgeworCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGFubm90YXRpb25BZGFwdGVyLCBlbGVtZW50TmFtZSwgQ2hhcmFjdGVyU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKKwl9CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCBleHByZXNzaW9uIGNvbnZlcnRlciBleHBlY3RzIGNoYXJhY3RlciBjb25zdGFudCBleHByZXNzaW9ucy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGZvckNoYXJhY3RlcnMoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlciwgU3RyaW5nIGVsZW1lbnROYW1lLCBib29sZWFuIHJlbW92ZUFubm90YXRpb25XaGVuRW1wdHkpIHsKKwkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihhbm5vdGF0aW9uQWRhcHRlciwgZWxlbWVudE5hbWUsIHJlbW92ZUFubm90YXRpb25XaGVuRW1wdHksIENoYXJhY3RlclN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7CisJfQorCiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvamR0dXRpbGl0eS9EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pkdHV0aWxpdHkvRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuamF2YQppbmRleCAzZDA4NDQ1Li5jOGExYmUyIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvamR0dXRpbGl0eS9EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qZHR1dGlsaXR5L0RlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmphdmEKQEAgLTIxLDcgKzIxLDggQEAKIAogCS8qKgogCSAqIEdpdmVuIHRoZSBzcGVjaWZpZWQgZGVjbGFyYXRpb24sIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlCi0JICogYW5ub3RhdGlvbiBlbGVtZW50LiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBpcyBub3QgcHJlc2VudC4KKwkgKiBhbm5vdGF0aW9uIGVsZW1lbnQuIFJldHVybiBudWxsIG9yIGFuIGVtcHR5IGFycmF5CisJICogaWYgdGhlIGVsZW1lbnQgaXMgbm90IHByZXNlbnQuCiAJICovCiAJVCBnZXRWYWx1ZShNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKTsKIApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pkdHV0aWxpdHkvRGVmYXVsdEFubm90YXRpb25FZGl0Rm9ybWF0dGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvamR0dXRpbGl0eS9EZWZhdWx0QW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjJlMjE1Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pkdHV0aWxpdHkvRGVmYXVsdEFubm90YXRpb25FZGl0Rm9ybWF0dGVyLmphdmEKQEAgLTAsMCArMSwyMTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuamR0dXRpbGl0eTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5JbnNlcnRFZGl0OworaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk11bHRpVGV4dEVkaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5SZXBsYWNlRWRpdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlRleHRFZGl0OworCisvKioKKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gd2lsbCBjbGVhbiB1cCBzb21lIG9mIHRoZSBuYXN0eSBFY2xpcHNlIGFubm90YXRpb24KKyAqIGZvcm1hdHRpbmcgKG9yIGxhY2sgdGhlcmVvZik7IGUuZy4gYXJyYXlzIG9mIGFubm90YXRpb25zLgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgRGVmYXVsdEFubm90YXRpb25FZGl0Rm9ybWF0dGVyCisJaW1wbGVtZW50cyBBbm5vdGF0aW9uRWRpdEZvcm1hdHRlcgoreworCXByaXZhdGUgc3RhdGljIERlZmF1bHRBbm5vdGF0aW9uRWRpdEZvcm1hdHRlciBJTlNUQU5DRSA9IG5ldyBEZWZhdWx0QW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIoKTsKKworCS8qKgorCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgorCSAqLworCXB1YmxpYyBzdGF0aWMgRGVmYXVsdEFubm90YXRpb25FZGl0Rm9ybWF0dGVyIGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCisJLyoqCisJICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KKwkgKi8KKwlwcml2YXRlIERlZmF1bHRBbm5vdGF0aW9uRWRpdEZvcm1hdHRlcigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiBUT0RPCisJICovCisJcHVibGljIHZvaWQgZm9ybWF0KElEb2N1bWVudCBkb2MsIFRleHRFZGl0IGVkaXRUcmVlKSB0aHJvd3MgTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbiwgQmFkTG9jYXRpb25FeGNlcHRpb24geworCQlUZXh0RWRpdFtdIGVkaXRzID0gZWRpdFRyZWUuZ2V0Q2hpbGRyZW4oKTsKKwkJaW50IGxlbiA9IGVkaXRzLmxlbmd0aDsKKwkJaWYgKGxlbiA9PSAwKSB7CisJCQlyZXR1cm47CisJCX0KKworCQlNdWx0aVRleHRFZGl0IGV4dHJhRWRpdHMgPSBuZXcgTXVsdGlUZXh0RWRpdCgpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCQlUZXh0RWRpdCBlZGl0MSA9IGVkaXRzW2ldOworCQkJaWYgKCAhIChlZGl0MSBpbnN0YW5jZW9mIEluc2VydEVkaXQpKSB7CisJCQkJY29udGludWU7ICAvLyBpZiB0aGUgZWRpdCBpcyBub3QgYW4gaW5zZXJ0LCBza2lwIHRvIHRoZSBuZXh0IGVkaXQKKwkJCX0KKwkJCUluc2VydEVkaXQgaW5zZXJ0MSA9IChJbnNlcnRFZGl0KSBlZGl0MTsKKwkJCWludCBqID0gaSArIDE7CisJCQlpZiAoaiA8IGxlbikgeworCQkJCVRleHRFZGl0IGVkaXQyID0gZWRpdHNbal07CisJCQkJaWYgKGVkaXQyIGluc3RhbmNlb2YgSW5zZXJ0RWRpdCkgeworCQkJCQlJbnNlcnRFZGl0IGluc2VydDIgPSAoSW5zZXJ0RWRpdCkgZWRpdDI7CisJCQkJCVN0cmluZyB0ZXh0MSA9IGluc2VydDEuZ2V0VGV4dCgpOworCQkJCQlTdHJpbmcgdGV4dDIgPSBpbnNlcnQyLmdldFRleHQoKTsKKwkJCQkJaW50IG9mZnNldDEgPSBpbnNlcnQxLmdldE9mZnNldCgpOworCQkJCQlpbnQgb2Zmc2V0MiA9IGluc2VydDIuZ2V0T2Zmc2V0KCk7CisJCQkJCWlmICh0aGlzLnN0cmluZ0lzQW5ub3RhdGlvbih0ZXh0MSkgJiYgdGV4dDIuZXF1YWxzKCIgIikpIHsKKwkJCQkJCS8vIGFuIGFubm90YXRpb24gd2FzIGluc2VydGVkIGJlZm9yZSBzb21ldGhpbmcgb24gdGhlIHNhbWUgbGluZTsKKwkJCQkJCS8vIHJlcGxhY2UgdGhlIHRyYWlsaW5nIHNwYWNlIHdpdGggYSBuZXdsaW5lIGFuZCBhcHByb3ByaWF0ZSBpbmRlbnQKKwkJCQkJCWV4dHJhRWRpdHMuYWRkQ2hpbGQobmV3IFJlcGxhY2VFZGl0KG9mZnNldDIsIDEsIHRoaXMuYnVpbGRDUihkb2MsIG9mZnNldDIpKSk7CisJCQkJCQlpKys7ICAvLyBqdW1wIHRoZSBpbmRleCBwYXN0ICdlZGl0MicKKwkJCQkJCWNvbnRpbnVlOyAgLy8gZ28gdG8gdGhlIG5leHQgZWRpdAorCQkJCQl9CisJCQkJCWludCBjb21tYTFMZW5ndGggPSB0aGlzLmNvbW1hTGVuZ3RoKHRleHQxKTsKKwkJCQkJaWYgKChjb21tYTFMZW5ndGggIT0gMCkgJiYgdGhpcy5zdHJpbmdJc0Fubm90YXRpb24odGV4dDIpKSB7CisJCQkJCQkvLyBhbiBhbm5vdGF0aW9uIHdhcyBpbnNlcnRlZCBpbiBhbiBhcnJheSBpbml0aWFsaXplciBvbiB0aGUKKwkJCQkJCS8vIHNhbWUgbGluZSBhcyB0aGUgcHJldmlvdXMgYXJyYXkgZWxlbWVudDsKKwkJCQkJCS8vIHJlcGxhY2UgdGhlIHByZWNlZGluZyBzcGFjZSB3aXRoIGEgbmV3bGluZSBhbmQgYXBwcm9wcmlhdGUgaW5kZW50CisJCQkJCQlleHRyYUVkaXRzLmFkZENoaWxkKG5ldyBSZXBsYWNlRWRpdChvZmZzZXQxICsgY29tbWExTGVuZ3RoLCB0ZXh0MS5sZW5ndGgoKSAtIGNvbW1hMUxlbmd0aCwgdGhpcy5idWlsZENSKGRvYywgb2Zmc2V0MSkpKTsKKwkJCQkJCWkrKzsgIC8vIGp1bXAgdGhlIGluZGV4IHBhc3QgJ2VkaXQyJworCQkJCQkJY29udGludWU7ICAvLyBnbyB0byB0aGUgbmV4dCBlZGl0CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQl0aGlzLmZvcm1hdEFycmF5SW5pdGlhbGl6ZXIoZG9jLCBpbnNlcnQxLCBleHRyYUVkaXRzKTsKKwkJfQorCQlleHRyYUVkaXRzLmFwcGx5KGRvYywgVGV4dEVkaXQuTk9ORSk7CisJfQorCisJLyoqCisJICogSWYgdGhlIGluc2VydCBlZGl0IGlzIGluc2VydGluZyBhbiBhbm5vdGF0aW9uIGNvbnRhaW5pbmcgYW4gYXJyYXkgb2YgYW5ub3RhdGlvbnMgYXMKKwkgKiBpdHMgdmFsdWUgdGhlbiBmb3JtYXQgdGhlbSBuaWNlbHkuCisJICovCisJcHJpdmF0ZSB2b2lkIGZvcm1hdEFycmF5SW5pdGlhbGl6ZXIoSURvY3VtZW50IGRvYywgSW5zZXJ0RWRpdCBpbnNlcnRFZGl0LCBNdWx0aVRleHRFZGl0IGV4dHJhRWRpdHMpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7CisJCVN0cmluZyBzID0gaW5zZXJ0RWRpdC5nZXRUZXh0KCk7CisJCWlmICggISB0aGlzLnN0cmluZ0lzQW5ub3RhdGlvbihzKSkgeworCQkJcmV0dXJuOworCQl9CisJCWludCBsZW4gPSBzLmxlbmd0aCgpOworCQlpbnQgcG9zID0gMTsgIC8vIHNraXAgJ0AnCisJCXdoaWxlIChwb3MgPCBsZW4pIHsKKwkJCWNoYXIgYyA9IHMuY2hhckF0KHBvcyk7CisJCQlwb3MrKzsgIC8vIGJ1bXAgdG8ganVzdCBwYXN0IGZpcnN0ICcoJworCQkJaWYgKGMgPT0gJygnKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKHBvcyA9PSBsZW4pIHsKKwkJCXJldHVybjsgIC8vIHJlYWNoZWQgZW5kIG9mIHN0cmluZworCQl9CisJCXdoaWxlIChwb3MgPCBsZW4pIHsKKwkJCWNoYXIgYyA9IHMuY2hhckF0KHBvcyk7CisJCQlwb3MrKzsgIC8vIGJ1bXAgdG8ganVzdCBwYXN0IGZpcnN0ICd7JworCQkJaWYgKGMgPT0gJ3snKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoYyAhPSAnICcpIHsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwkJaWYgKHBvcyA9PSBsZW4pIHsKKwkJCXJldHVybjsgIC8vIHJlYWNoZWQgZW5kIG9mIHN0cmluZworCQl9CisJCS8vIG5vdyBsb29rIGZvciAnQCcgbm90IGluc2lkZSBwYXJlbnRoZXNlcyBhbmQgcHV0IGluIAorCQkvLyBsaW5lIGRlbGltZXRlciBhbmQgaW5kZW50IHN0cmluZyBiZWZvcmUgZWFjaAorCQlpbnQgb2Zmc2V0ID0gaW5zZXJ0RWRpdC5nZXRPZmZzZXQoKTsKKwkJU3RyaW5nIGluZGVudCA9IG51bGw7CisJCWludCBwYXJlbkRlcHRoID0gMDsKKwkJd2hpbGUgKHBvcyA8IGxlbikgeworCQkJc3dpdGNoIChzLmNoYXJBdChwb3MpKSB7CisJCQkJY2FzZSAnKCcgOgorCQkJCQlwYXJlbkRlcHRoKys7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJyknIDoKKwkJCQkJcGFyZW5EZXB0aC0tOworCQkJCQlicmVhazsKKwkJCQljYXNlICdAJyA6CisJCQkJCWlmIChwYXJlbkRlcHRoID09IDApIHsKKwkJCQkJCWlmIChpbmRlbnQgPT0gbnVsbCkgeworCQkJCQkJCWluZGVudCA9IHRoaXMuYnVpbGRDUihkb2MsIG9mZnNldCwgIlx0Iik7ICAvLyBUT0RPIHVzZSB0YWIgcHJlZmVyZW5jZT8KKwkJCQkJCX0KKwkJCQkJCWV4dHJhRWRpdHMuYWRkQ2hpbGQobmV3IEluc2VydEVkaXQob2Zmc2V0ICsgcG9zLCBpbmRlbnQpKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlICd9JyA6CisJCQkJCWlmIChwYXJlbkRlcHRoID09IDApIHsKKwkJCQkJCWV4dHJhRWRpdHMuYWRkQ2hpbGQobmV3IEluc2VydEVkaXQob2Zmc2V0ICsgcG9zLCB0aGlzLmJ1aWxkQ1IoZG9jLCBvZmZzZXQpKSk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQl9CisJCQlwb3MrKzsKKwkJfQorCX0KKworCS8qKgorCSAqIEJ1aWxkIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBsaW5lIGRlbGltZXRlciBhbmQgaW5kZW50aW5nIGNoYXJhY3RlcnMgCisJICogbWF0Y2hpbmcgdGhlIGluZGVudCBsZXZlbCBvZiB0aGUgbGluZSBjb250YWluaW5nIHRoZSBjaGFyYWN0ZXIgb2Zmc2V0CisJICogKGkuZS4gdGhlIG5ldyBsaW5lJ3MgaW5kZW50IG1hdGNoZXMgdGhlIGN1cnJlbnQgbGluZSkuCisJICovCisJcHJpdmF0ZSBTdHJpbmcgYnVpbGRDUihJRG9jdW1lbnQgZG9jLCBpbnQgb2Zmc2V0KSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24geworCQlyZXR1cm4gdGhpcy5idWlsZENSKGRvYywgb2Zmc2V0LCAiIik7CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgYnVpbGRDUihJRG9jdW1lbnQgZG9jLCBpbnQgb2Zmc2V0LCBTdHJpbmcgc3VmZml4KSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24geworCQlpbnQgbGluZSA9IGRvYy5nZXRMaW5lT2ZPZmZzZXQob2Zmc2V0KTsKKwkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQlzYi5hcHBlbmQoZG9jLmdldExpbmVEZWxpbWl0ZXIobGluZSkpOyAgLy8gdXNlIHNhbWUgQ1IgYXMgY3VycmVudCBsaW5lCisKKwkJaW50IG8gPSBkb2MuZ2V0TGluZU9mZnNldChsaW5lKTsgIC8vIG1hdGNoIHRoZSB3aGl0ZXNwYWNlIG9mIHRoZSBjdXJyZW50IGxpbmUKKwkJY2hhciBjID0gZG9jLmdldENoYXIobysrKTsKKwkJd2hpbGUgKChjID09ICcgJykgfHwgKGMgPT0gJ1x0JykpIHsKKwkJCXNiLmFwcGVuZChjKTsKKwkJCWMgPSBkb2MuZ2V0Q2hhcihvKyspOworCQl9CisJCXNiLmFwcGVuZChzdWZmaXgpOworCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBpcyBhbiBhbm5vdGF0aW9uLgorCSAqLworCXByaXZhdGUgYm9vbGVhbiBzdHJpbmdJc0Fubm90YXRpb24oU3RyaW5nIHN0cmluZykgeworCQlyZXR1cm4gKHN0cmluZy5sZW5ndGgoKSA+IDEpICYmIHN0cmluZy5jaGFyQXQoMCkgPT0gJ0AnOworCX0KKworCS8qKgorCSAqIElmIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGlzIGEgc2luZ2xlIGNvbW1hLCBwb3NzaWJseSBzdXJyb3VuZGVkIGJ5CisJICogc3BhY2VzLCByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgc3Vic3RyaW5nIGNvbnRhaW5pbmcgdGhlCisJICogaW5pdGlhbCBzcGFjZXMgYW5kIHRoZSBjb21tYS4KKwkgKi8KKwlwcml2YXRlIGludCBjb21tYUxlbmd0aChTdHJpbmcgc3RyaW5nKSB7CisJCWJvb2xlYW4gY29tbWEgPSBmYWxzZTsKKwkJaW50IGxlbiA9IHN0cmluZy5sZW5ndGgoKTsKKwkJaW50IHJlc3VsdCA9IDA7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJCXN3aXRjaCAoc3RyaW5nLmNoYXJBdChpKSkgeworCQkJCWNhc2UgJyAnIDoKKwkJCQkJaWYgKCAhIGNvbW1hKSB7CisJCQkJCQlyZXN1bHQrKzsgIC8vIHNwYWNlIHByZWNlZGluZyBjb21tYQorCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJywnIDoKKwkJCQkJaWYgKGNvbW1hKSB7CisJCQkJCQlyZXR1cm4gMDsgIC8vIHNlY29uZCBjb21tYSEKKwkJCQkJfQorCQkJCQljb21tYSA9IHRydWU7CisJCQkJCXJlc3VsdCsrOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlyZXR1cm4gMDsgIC8vIG5vbi1jb21tYSwgbm9uLXNwYWNlIGNoYXIKKwkJCX0KKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKworfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pkdHV0aWxpdHkvRW51bUFycmF5RGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qZHR1dGlsaXR5L0VudW1BcnJheURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmphdmEKaW5kZXggN2QxNTNiOWIuLjYzMzA4ODUgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qZHR1dGlsaXR5L0VudW1BcnJheURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pkdHV0aWxpdHkvRW51bUFycmF5RGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuamF2YQpAQCAtMTAsMTAgKzEwLDEwIEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHk7CiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BcnJheUluaXRpYWxpemVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5OYW1lOwogCiAvKioKICAqIFdyYXAgYSBkZWNsYXJhdGlvbiBhbm5vdGF0aW9uIGVsZW1lbnQgYWRhcHRlciBhbmQgc2ltcGx5CkBAIC0yNSw3ICsyNSw5IEBACiAJLyoqCiAJICogVGhlIHdyYXBwZWQgYWRhcHRlciB0aGF0IHJldHVybnMgYW5kIHRha2VzIG5hbWUgc3RyaW5ncyAoZW51bXMpLgogCSAqLwotCXByaXZhdGUgZmluYWwgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdLCBBcnJheUluaXRpYWxpemVyPiBhZGFwdGVyOworCXByaXZhdGUgZmluYWwgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBhZGFwdGVyOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gRU1QVFlfU1RSSU5HX0FSUkFZID0gbmV3IFN0cmluZ1swXTsKIAogCiAJLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgpAQCAtNDAsMjEgKzQyLDI4IEBACiAKIAkvKioKIAkgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0byByZW1vdmUgdGhlIGFubm90YXRpb24gd2hlbiB0aGUgbGFzdAotCSAqIGVsZW1lbnQgaXMgcmVtb3ZlZC4KKwkgKiBlbGVtZW50IGlzIHJlbW92ZWQgYW5kIHJlbW92ZSB0aGUgYXJyYXkgaW5pdGlhbGl6ZXIgaWYgaXQgaXMgZW1wdHkuCiAJICovCiAJcHVibGljIEVudW1BcnJheURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIsIFN0cmluZyBlbGVtZW50TmFtZSkgewogCQl0aGlzKGFubm90YXRpb25BZGFwdGVyLCBlbGVtZW50TmFtZSwgdHJ1ZSk7CiAJfQogCisJLyoqCisJICogVGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gcmVtb3ZlIHRoZSBhcnJheSBpbml0aWFsaXplciBpZiBpdCBpcyBlbXB0eS4KKwkgKi8KIAlwdWJsaWMgRW51bUFycmF5RGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlciwgU3RyaW5nIGVsZW1lbnROYW1lLCBib29sZWFuIHJlbW92ZUFubm90YXRpb25XaGVuRW1wdHkpIHsKLQkJdGhpcyhuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdLCBBcnJheUluaXRpYWxpemVyPihhbm5vdGF0aW9uQWRhcHRlciwgZWxlbWVudE5hbWUsIHJlbW92ZUFubm90YXRpb25XaGVuRW1wdHksIGJ1aWxkRXhwcmVzc2lvbkNvbnZlcnRlcigpKSk7CisJCXRoaXMoYW5ub3RhdGlvbkFkYXB0ZXIsIGVsZW1lbnROYW1lLCByZW1vdmVBbm5vdGF0aW9uV2hlbkVtcHR5LCB0cnVlKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZ1tdLCBBcnJheUluaXRpYWxpemVyPiBidWlsZEV4cHJlc3Npb25Db252ZXJ0ZXIoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyPE5hbWU+KE5hbWVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOworCXB1YmxpYyBFbnVtQXJyYXlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyLCBTdHJpbmcgZWxlbWVudE5hbWUsIGJvb2xlYW4gcmVtb3ZlQW5ub3RhdGlvbldoZW5FbXB0eSwgYm9vbGVhbiByZW1vdmVBcnJheUluaXRpYWxpemVyV2hlbkVtcHR5KSB7CisJCXRoaXMobmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4oYW5ub3RhdGlvbkFkYXB0ZXIsIGVsZW1lbnROYW1lLCByZW1vdmVBbm5vdGF0aW9uV2hlbkVtcHR5LCBidWlsZEV4cHJlc3Npb25Db252ZXJ0ZXIocmVtb3ZlQXJyYXlJbml0aWFsaXplcldoZW5FbXB0eSkpKTsKIAl9CiAKLQlwcm90ZWN0ZWQgRW51bUFycmF5RGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdLCBBcnJheUluaXRpYWxpemVyPiBhZGFwdGVyKSB7CisJcHJpdmF0ZSBzdGF0aWMgRXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmdbXT4gYnVpbGRFeHByZXNzaW9uQ29udmVydGVyKGJvb2xlYW4gcmVtb3ZlQXJyYXlJbml0aWFsaXplcldoZW5FbXB0eSkgeworCQlyZXR1cm4gbmV3IEFubm90YXRpb25TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIoTmFtZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSwgcmVtb3ZlQXJyYXlJbml0aWFsaXplcldoZW5FbXB0eSk7CisJfQorCisJcHJvdGVjdGVkIEVudW1BcnJheURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYWRhcHRlcikgewogCQlzdXBlcigpOwogCQl0aGlzLmFkYXB0ZXIgPSBhZGFwdGVyOwogCX0KQEAgLTYzLDYgKzcyLDcgQEAKIAkvLyAqKioqKioqKioqIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKIAogCXB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZShNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7CisJCS8vIGlnbm9yZSB0aGUgYWRhcHRlcidzIGdldFZhbHVlKCkgLSB3ZSB3YW50IHRoZSBleHByZXNzaW9uCiAJCXJldHVybiB0aGlzLnJlc29sdmUodGhpcy5hZGFwdGVyLmV4cHJlc3Npb24oZGVjbGFyYXRpb24pLCBkZWNsYXJhdGlvbik7CiAJfQogCkBAIC04MiwyOSArOTIsNDkgQEAKIAkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgogCiAJLyoqCi0JICogcmVzb2x2ZSB0aGUgZW51bXMKKwkgKiByZXNvbHZlIHRoZSBlbnVtcywgd2hpY2ggY2FuIGJlCisJICogICAgIG51bGwKKwkgKiBvcgorCSAqICAgICB7Rk9PLCBCQVIsIEJBWn0KKwkgKiBvcgorCSAqICAgICBGT08KIAkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nW10gcmVzb2x2ZShFeHByZXNzaW9uIGVudW1zRXhwcmVzc2lvbiwgTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlpZiAoZW51bXNFeHByZXNzaW9uID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOworCXByb3RlY3RlZCBTdHJpbmdbXSByZXNvbHZlKEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgeworCQlpZiAoZXhwcmVzc2lvbiA9PSBudWxsKSB7CisJCQlyZXR1cm4gRU1QVFlfU1RSSU5HX0FSUkFZOworCQl9IGVsc2UgaWYgKGV4cHJlc3Npb24uZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLkFSUkFZX0lOSVRJQUxJWkVSKSB7CisJCQlyZXR1cm4gdGhpcy5yZXNvbHZlQXJyYXkoKEFycmF5SW5pdGlhbGl6ZXIpIGV4cHJlc3Npb24sIGRlY2xhcmF0aW9uKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiB0aGlzLnJlc29sdmVTaW5nbGVFbGVtZW50KGV4cHJlc3Npb24sIGRlY2xhcmF0aW9uKTsKIAkJfQotCQlBcnJheUluaXRpYWxpemVyIGFpID0gKEFycmF5SW5pdGlhbGl6ZXIpIGVudW1zRXhwcmVzc2lvbjsKKwl9CisKKwlwcm90ZWN0ZWQgU3RyaW5nW10gcmVzb2x2ZUFycmF5KEFycmF5SW5pdGlhbGl6ZXIgYWksIE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKIAkJTGlzdDxFeHByZXNzaW9uPiBleHByZXNzaW9ucyA9IHRoaXMuZXhwcmVzc2lvbnMoYWkpOwogCQlpbnQgbGVuID0gZXhwcmVzc2lvbnMuc2l6ZSgpOwogCQlTdHJpbmdbXSBlbnVtcyA9IG5ldyBTdHJpbmdbbGVuXTsKIAkJZm9yIChpbnQgaSA9IGxlbjsgaS0tID4gMDsgKSB7Ci0JCQllbnVtc1tpXSA9IEpEVFRvb2xzLnJlc29sdmVFbnVtKGRlY2xhcmF0aW9uLmlDb21waWxhdGlvblVuaXQoKSwgZXhwcmVzc2lvbnMuZ2V0KGkpKTsKKwkJCWVudW1zW2ldID0gdGhpcy5yZXNvbHZlRW51bShleHByZXNzaW9ucy5nZXQoaSkpOwogCQl9CiAJCXJldHVybiBlbnVtczsKIAl9CiAKKwlwcm90ZWN0ZWQgU3RyaW5nW10gcmVzb2x2ZVNpbmdsZUVsZW1lbnQoRXhwcmVzc2lvbiBlbnVtRXhwcmVzc2lvbiwgTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgeworCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHt0aGlzLnJlc29sdmVFbnVtKGVudW1FeHByZXNzaW9uKX07CisJfQorCisJcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlRW51bShFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKwkJcmV0dXJuIEpEVFRvb2xzLnJlc29sdmVFbnVtKGV4cHJlc3Npb24pOworCX0KKwogCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogCXByaXZhdGUgTGlzdDxFeHByZXNzaW9uPiBleHByZXNzaW9ucyhBcnJheUluaXRpYWxpemVyIGFycmF5SW5pdGlhbGl6ZXIpIHsKIAkJcmV0dXJuIGFycmF5SW5pdGlhbGl6ZXIuZXhwcmVzc2lvbnMoKTsKIAl9CiAKIAkvKioKLQkgKiBjb252ZXJ0IHRoZSBmdWxseS1xdWFsaWZpZWQgZW51bXMgdG8gc3RhdGljIGltcG9ydHMgYW5kIHNob3J0IG5hbWVzCisJICogY29udmVydCB0aGUgZnVsbHktcXVhbGlmaWVkIGVudW1zIHRvIHN0YXRpYyBpbXBvcnRzIGFuZCBzaG9ydCBuYW1lczsKKwkgKiBOQjogdGhlIGltcG9ydHMgYXJlIGFkZGVkIGFzIGEgc2lkZS1lZmZlY3QgOi0oCiAJICovCiAJcHJvdGVjdGVkIFN0cmluZ1tdIGNvbnZlcnRUb1Nob3J0TmFtZXMoU3RyaW5nW10gZW51bXMsIE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKIAkJaWYgKGVudW1zID09IG51bGwpIHsKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qZHR1dGlsaXR5L0VudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pkdHV0aWxpdHkvRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmphdmEKaW5kZXggODM4ODYwZi4uZWRhNTg1MyAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pkdHV0aWxpdHkvRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pkdHV0aWxpdHkvRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmphdmEKQEAgLTExLDcgKzExLDYgQEAKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5OYW1lOwogCiAvKioKICAqIFdyYXAgYSBkZWNsYXJhdGlvbiBhbm5vdGF0aW9uIGVsZW1lbnQgYWRhcHRlciBhbmQgc2ltcGx5CkBAIC0yMyw3ICsyMiw3IEBACiAJLyoqCiAJICogVGhlIHdyYXBwZWQgYWRhcHRlciB0aGF0IHJldHVybnMgYW5kIHRha2VzIG5hbWUgc3RyaW5ncyAoZW51bXMpLgogCSAqLwotCXByaXZhdGUgZmluYWwgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZywgTmFtZT4gYWRhcHRlcjsKKwlwcml2YXRlIGZpbmFsIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFkYXB0ZXI7CiAKIAogCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKQEAgLTQ1LDEwICs0NCwxMCBAQAogCX0KIAogCXB1YmxpYyBFbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlciwgU3RyaW5nIGVsZW1lbnROYW1lLCBib29sZWFuIHJlbW92ZUFubm90YXRpb25XaGVuRW1wdHkpIHsKLQkJdGhpcyhuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZywgTmFtZT4oYW5ub3RhdGlvbkFkYXB0ZXIsIGVsZW1lbnROYW1lLCByZW1vdmVBbm5vdGF0aW9uV2hlbkVtcHR5LCBOYW1lU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKSk7CisJCXRoaXMobmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGFubm90YXRpb25BZGFwdGVyLCBlbGVtZW50TmFtZSwgcmVtb3ZlQW5ub3RhdGlvbldoZW5FbXB0eSwgTmFtZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSkpOwogCX0KIAotCXByb3RlY3RlZCBFbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZywgTmFtZT4gYWRhcHRlcikgeworCXByb3RlY3RlZCBFbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWRhcHRlcikgewogCQlzdXBlcigpOwogCQl0aGlzLmFkYXB0ZXIgPSBhZGFwdGVyOwogCX0KQEAgLTU3LDcgKzU2LDcgQEAKIAkvLyAqKioqKioqKioqIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKIAogCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlyZXR1cm4gdGhpcy5yZXNvbHZlKHRoaXMuYWRhcHRlci5leHByZXNzaW9uKGRlY2xhcmF0aW9uKSwgZGVjbGFyYXRpb24pOworCQlyZXR1cm4gdGhpcy5yZXNvbHZlKHRoaXMuYWRhcHRlci5leHByZXNzaW9uKGRlY2xhcmF0aW9uKSk7CiAJfQogCiAJcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlLCBNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7CkBAIC03OCw4ICs3Nyw4IEBACiAJLyoqCiAJICogcmVzb2x2ZSB0aGUgZW51bQogCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcmVzb2x2ZShFeHByZXNzaW9uIGVudW1FeHByZXNzaW9uLCBNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXJldHVybiAoZW51bUV4cHJlc3Npb24gPT0gbnVsbCkgPyBudWxsIDogSkRUVG9vbHMucmVzb2x2ZUVudW0oZGVjbGFyYXRpb24uaUNvbXBpbGF0aW9uVW5pdCgpLCBlbnVtRXhwcmVzc2lvbik7CisJcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworCQlyZXR1cm4gSkRUVG9vbHMucmVzb2x2ZUVudW0oZXhwcmVzc2lvbik7CiAJfQogCiAJLyoqCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvamR0dXRpbGl0eS9FeHByZXNzaW9uQ29udmVydGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvamR0dXRpbGl0eS9FeHByZXNzaW9uQ29udmVydGVyLmphdmEKaW5kZXggNGJjZTQzNC4uZmNlODI4NCAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pkdHV0aWxpdHkvRXhwcmVzc2lvbkNvbnZlcnRlci5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qZHR1dGlsaXR5L0V4cHJlc3Npb25Db252ZXJ0ZXIuamF2YQpAQCAtMTUsMTAgKzE1LDkgQEAKIC8qKgogICogRGVmaW5lIHRoZSBwcm90b2NvbCBmb3IgY29udmVydGluZyBhbiBBU1QgZXhwcmVzc2lvbiBiYWNrIGFuZCBmb3J0aAogICogZnJvbSBhbiBhcmJpdHJhcnkgdHlwZSAoZS5nLiBTdHJpbmdMaXRlcmFsIDw9PiBTdHJpbmcpLgotICogRSBpcyB0aGUgZXhwcmVzc2lvbiB0eXBlLgogICogVCBpcyB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0IHRvIGJlIGNvbnZlcnRlZCB0byBhbmQgZnJvbSBhbiBleHByZXNzaW9uLgogICovCi1wdWJsaWMgaW50ZXJmYWNlIEV4cHJlc3Npb25Db252ZXJ0ZXI8VCwgRSBleHRlbmRzIEV4cHJlc3Npb24+IHsKK3B1YmxpYyBpbnRlcmZhY2UgRXhwcmVzc2lvbkNvbnZlcnRlcjxUPiB7CiAKIAkvKioKIAkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgb2JqZWN0IHRvIGFuCkBAIC0yNiwxMiArMjUsMTIgQEAKIAkgKiBUaGUgdHlwZSBvZiB0aGUgb2JqZWN0IGlzIGRldGVybWluZWQgYnkgdGhlCiAJICogY29udHJhY3Qgc3BlY2lmaWVkIGJ5IHRoZSBjbGllbnQuCiAJICovCi0JRSBjb252ZXJ0KFQgb2JqZWN0LCBBU1QgYXN0KTsKKwlFeHByZXNzaW9uIGNvbnZlcnQoVCBvYmplY3QsIEFTVCBhc3QpOwogCiAJLyoqCiAJICogQ29udmVydCB0aGUgc3BlY2lmaWVkIGV4cHJlc3Npb24gdG8gYW4gb2JqZWN0IG9mIHNvbWUKIAkgKiBwcmUtZGV0ZXJtaW5lZCB0eXBlLgogCSAqLwotCVQgY29udmVydChFIGV4cHJlc3Npb24pOworCVQgY29udmVydChFeHByZXNzaW9uIGV4cHJlc3Npb24pOwogCiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvamR0dXRpbGl0eS9GaWVsZEF0dHJpYnV0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pkdHV0aWxpdHkvRmllbGRBdHRyaWJ1dGUuamF2YQppbmRleCBmZTM0M2I0Li42MmY2MzYwIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvamR0dXRpbGl0eS9GaWVsZEF0dHJpYnV0ZS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qZHR1dGlsaXR5L0ZpZWxkQXR0cmlidXRlLmphdmEKQEAgLTExLDEwICsxMSwxMSBAQAogCiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5GaWVsZERlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JVHlwZUJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db21tYW5kRXhlY3V0b3JQcm92aWRlcjsKIAogLyoqCiAgKiBBZGFwdCBhbmQgZXh0ZW5kIGEgamR0IGZpZWxkLgpAQCAtMjMsOCArMjQsOCBAQAogICovCiBwdWJsaWMgY2xhc3MgRmllbGRBdHRyaWJ1dGUgZXh0ZW5kcyBBdHRyaWJ1dGUgewogCi0JcHVibGljIEZpZWxkQXR0cmlidXRlKElGaWVsZCBmaWVsZCkgewotCQlzdXBlcihmaWVsZCk7CisJcHVibGljIEZpZWxkQXR0cmlidXRlKElGaWVsZCBmaWVsZCwgQ29tbWFuZEV4ZWN1dG9yUHJvdmlkZXIgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3JQcm92aWRlcikgeworCQlzdXBlcihmaWVsZCwgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3JQcm92aWRlcik7CiAJfQogCiAJQE92ZXJyaWRlCkBAIC0zMiwxMSArMzMsNiBAQAogCQlyZXR1cm4gKElGaWVsZCkgc3VwZXIuZ2V0SmR0TWVtYmVyKCk7CiAJfQogCi0JQE92ZXJyaWRlCi0JcHVibGljIEZpZWxkRGVjbGFyYXRpb24gYm9keURlY2xhcmF0aW9uKCkgewotCQlyZXR1cm4gKEZpZWxkRGVjbGFyYXRpb24pIHN1cGVyLmJvZHlEZWNsYXJhdGlvbigpOwotCX0KLQogCiAJLy8gKioqKioqKioqKiBNZW1iZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgogCkBAIC02OSwxNSArNjUsMTAgQEAKIAl9CiAKIAlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHR5cGVTaWduYXR1cmUoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRKZHRNZW1iZXIoKS5nZXRUeXBlU2lnbmF0dXJlKCk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQl9CisJcHVibGljIElUeXBlQmluZGluZyB0eXBlQmluZGluZyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgeworCQlyZXR1cm4gYm9keURlY2xhcmF0aW9uKGFzdFJvb3QpLmdldFR5cGUoKS5yZXNvbHZlQmluZGluZygpOwogCX0KIAotCiAJLy8gKioqKioqKioqKiBtaXNjZWxsYW5lb3VzICoqKioqKioqKioKIAogCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pkdHV0aWxpdHkvSkRUVG9vbHMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qZHR1dGlsaXR5L0pEVFRvb2xzLmphdmEKaW5kZXggMzQ5MWRmMC4uY2YxYjI4NCAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pkdHV0aWxpdHkvSkRUVG9vbHMuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvamR0dXRpbGl0eS9KRFRUb29scy5qYXZhCkBAIC05LDIxMSArOSwxMDkgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHk7CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5GbGFnczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NGaWxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUltcG9ydERlY2xhcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWVtYmVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5TaWduYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuQ2F0ZWdvcml6ZWRQcm9ibGVtOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFBhcnNlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb2RlYXNzaXN0LklTZWxlY3Rpb25SZXF1ZXN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvZGVhc3Npc3QuU2VsZWN0aW9uRW5naW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkRlZmF1bHRXb3JraW5nQ29weU93bmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLlNlYXJjaGFibGVFbnZpcm9ubWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklWYXJpYWJsZUJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5hbWU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSnB0Q29yZVBsdWdpbjsKIAogcHVibGljIGNsYXNzIEpEVFRvb2xzIHsKIAorCS8vIFRPRE8gZ2V0IHJpZCBvZiB0aGUgImxpZ2h0d2VpZ2h0IiBtZXRob2RzIGFmdGVyIHJld29ya2luZyBob3cKKwkvLyBWYWxpZGF0aW9uTWVzc2FnZXMgZGV0ZXJtaW5lIGxpbmUgbnVtYmVycwogCS8qKgotCSAqIGFkZCBhICJub3JtYWwiIGltcG9ydCwgYXMgb3Bwb3NlZCB0byBhICJzdGF0aWMiIGltcG9ydAorCSAqIEJ1aWxkIGFuIEFTVCBmb3IgdGhlIHNwZWNpZmllZCBtZW1iZXIncyBjb21waWxhdGlvbiB1bml0IG9yCisJICogKHNvdXJjZS1hdHRhY2hlZCkgY2xhc3MgZmlsZS4gQnVpbGQgdGhlIEFTVCB3aXRob3V0IGl0cyBiaW5kaW5ncworCSAqIHJlc29sdmVkLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgSUltcG9ydERlY2xhcmF0aW9uIGFkZEltcG9ydChJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCwgU3RyaW5nIGltcG9ydEVsZW1lbnQpIHsKLQkJcmV0dXJuIGFkZEltcG9ydChjb21waWxhdGlvblVuaXQsIGltcG9ydEVsZW1lbnQsIEZsYWdzLkFjY0RlZmF1bHQpOworCXB1YmxpYyBzdGF0aWMgQ29tcGlsYXRpb25Vbml0IGJ1aWxkTGlnaHR3ZWlnaHRBU1RSb290KElNZW1iZXIgbWVtYmVyKSB7CisJCXJldHVybiBidWlsZEFTVFJvb3QobWVtYmVyLCBmYWxzZSk7CiAJfQogCiAJLyoqCi0JICogdGhpcyBkb2Vzbid0IHdvcmsgeWV0Li4uIHNlZSBlY2xpcHNlIGJ1Z3ppbGxhIDE0MzY4NAorCSAqIEJ1aWxkIGFuIEFTVCBmb3IgdGhlIHNwZWNpZmllZCBtZW1iZXIncyBjb21waWxhdGlvbiB1bml0IG9yCisJICogKHNvdXJjZS1hdHRhY2hlZCkgY2xhc3MgZmlsZS4gQnVpbGQgdGhlIEFTVCB3aXRoIGl0cyBiaW5kaW5ncworCSAqIHJlc29sdmVkIChhbmQgdGhlIHJlc3VsdGFudCBwZXJmb3JtYW5jZSBoaXQpLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgSUltcG9ydERlY2xhcmF0aW9uIGFkZFN0YXRpY0ltcG9ydChJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCwgU3RyaW5nIGltcG9ydEVsZW1lbnQpIHsKLQkJcmV0dXJuIGFkZEltcG9ydChjb21waWxhdGlvblVuaXQsIGltcG9ydEVsZW1lbnQsIEZsYWdzLkFjY1N0YXRpYyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJSW1wb3J0RGVjbGFyYXRpb24gYWRkSW1wb3J0KElDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0LCBTdHJpbmcgaW1wb3J0RWxlbWVudCwgaW50IGZsYWdzKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gY29tcGlsYXRpb25Vbml0LmNyZWF0ZUltcG9ydChpbXBvcnRFbGVtZW50LCBudWxsLCBmbGFncywgbnVsbCk7ICAvLyBudWxsID0gcGxhY2UgYXQgZW5kIG9mIGltcG9ydCBsaXN0OyBudWxsID0gbm8gcHJvZ3Jlc3MgbW9uaXRvcgotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLQkJfQorCXB1YmxpYyBzdGF0aWMgQ29tcGlsYXRpb25Vbml0IGJ1aWxkQVNUUm9vdChJTWVtYmVyIG1lbWJlcikgeworCQlyZXR1cm4gYnVpbGRBU1RSb290KG1lbWJlciwgdHJ1ZSk7CiAJfQogCiAJLyoqCi0JICogQnVpbGQgYW4gQVNUIGZvciB0aGUgc3BlY2lmaWVkIG1lbWJlcidzIGNvbXBpbGF0aW9uIHVuaXQgb3IgY2xhc3MgZmlsZS4KKwkgKiBCdWlsZCBhbiBBU1QgZm9yIHRoZSBzcGVjaWZpZWQgbWVtYmVyJ3MgY29tcGlsYXRpb24gdW5pdCBvcgorCSAqIChzb3VyY2UtYXR0YWNoZWQpIGNsYXNzIGZpbGUuCiAJICovCi0JcHVibGljIHN0YXRpYyBDb21waWxhdGlvblVuaXQgY3JlYXRlQVNUUm9vdChJTWVtYmVyIG1lbWJlcikgeworCXByaXZhdGUgc3RhdGljIENvbXBpbGF0aW9uVW5pdCBidWlsZEFTVFJvb3QoSU1lbWJlciBtZW1iZXIsIGJvb2xlYW4gcmVzb2x2ZUJpbmRpbmdzKSB7CiAJCXJldHVybiAobWVtYmVyLmlzQmluYXJ5KCkpID8KLQkJCWNyZWF0ZUFTVFJvb3QobWVtYmVyLmdldENsYXNzRmlsZSgpKSAgLy8gdGhlIGNsYXNzIGZpbGUgbXVzdCBoYXZlIGEgc291cmNlIGF0dGFjaG1lbnQKKwkJCWJ1aWxkQVNUUm9vdChtZW1iZXIuZ2V0Q2xhc3NGaWxlKCksIHJlc29sdmVCaW5kaW5ncykgIC8vIHRoZSBjbGFzcyBmaWxlIG11c3QgaGF2ZSBhIHNvdXJjZSBhdHRhY2htZW50CiAJCToKLQkJCWNyZWF0ZUFTVFJvb3QobWVtYmVyLmdldENvbXBpbGF0aW9uVW5pdCgpKTsKKwkJCWJ1aWxkQVNUUm9vdChtZW1iZXIuZ2V0Q29tcGlsYXRpb25Vbml0KCksIHJlc29sdmVCaW5kaW5ncyk7CiAJfQogCQotCXB1YmxpYyBzdGF0aWMgQ29tcGlsYXRpb25Vbml0IGNyZWF0ZUFTVFJvb3QoSUNsYXNzRmlsZSBjbGFzc0ZpbGUpIHsKKwlwdWJsaWMgc3RhdGljIENvbXBpbGF0aW9uVW5pdCBidWlsZEFTVFJvb3QoSUNsYXNzRmlsZSBjbGFzc0ZpbGUpIHsKKwkJcmV0dXJuIGJ1aWxkQVNUUm9vdChjbGFzc0ZpbGUsIHRydWUpOworCX0KKwkKKwlwcml2YXRlIHN0YXRpYyBDb21waWxhdGlvblVuaXQgYnVpbGRBU1RSb290KElDbGFzc0ZpbGUgY2xhc3NGaWxlLCBib29sZWFuIHJlc29sdmVCaW5kaW5ncykgewogCQlBU1RQYXJzZXIgcGFyc2VyID0gQVNUUGFyc2VyLm5ld1BhcnNlcihBU1QuSkxTMyk7CiAJCXBhcnNlci5zZXRTb3VyY2UoY2xhc3NGaWxlKTsKKwkJcGFyc2VyLnNldFJlc29sdmVCaW5kaW5ncyhyZXNvbHZlQmluZGluZ3MpOwogCQlyZXR1cm4gKENvbXBpbGF0aW9uVW5pdCkgcGFyc2VyLmNyZWF0ZUFTVChudWxsKTsKLQkJCiAJfQogCQotCXB1YmxpYyBzdGF0aWMgQ29tcGlsYXRpb25Vbml0IGNyZWF0ZUFTVFJvb3QoSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQpIHsKKwlwdWJsaWMgc3RhdGljIENvbXBpbGF0aW9uVW5pdCBidWlsZEFTVFJvb3QoSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQpIHsKKwkJcmV0dXJuIGJ1aWxkQVNUUm9vdChjb21waWxhdGlvblVuaXQsIHRydWUpOworCX0KKwkKKwlwcml2YXRlIHN0YXRpYyBDb21waWxhdGlvblVuaXQgYnVpbGRBU1RSb290KElDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0LCBib29sZWFuIHJlc29sdmVCaW5kaW5ncykgewogCQlBU1RQYXJzZXIgcGFyc2VyID0gQVNUUGFyc2VyLm5ld1BhcnNlcihBU1QuSkxTMyk7CiAJCXBhcnNlci5zZXRTb3VyY2UoY29tcGlsYXRpb25Vbml0KTsKKwkJcGFyc2VyLnNldFJlc29sdmVCaW5kaW5ncyhyZXNvbHZlQmluZGluZ3MpOwogCQlyZXR1cm4gKENvbXBpbGF0aW9uVW5pdCkgcGFyc2VyLmNyZWF0ZUFTVChudWxsKTsKIAl9CiAJCiAJcHVibGljIHN0YXRpYyBJVHlwZSBmaW5kVHlwZShTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBxdWFsaWZpZWRUeXBlTmFtZSwgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB7CiAJCXRyeSB7Ci0JCQlpZiAoamF2YVByb2plY3QgIT0gbnVsbCkgewotCQkJCXJldHVybiBqYXZhUHJvamVjdC5maW5kVHlwZShwYWNrYWdlTmFtZSwgcXVhbGlmaWVkVHlwZU5hbWUucmVwbGFjZSgnJCcsICcuJykpOwotCQkJfQotCQl9IAotCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotCQkJSnB0Q29yZVBsdWdpbi5sb2coam1lKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXNvbHZlIHRoZSBzcGVjaWZpZWQgc2lnbmF0dXJlIGluIHRoZSBzY29wZSBvZiB0aGUgc3BlY2lmaWVkIGpkdCB0eXBlLgotCSAqIFJldHVybiB0aGUgZnVsbHktcXVhbGlmaWVkIHR5cGUgbmFtZSBvciByZXR1cm4gbnVsbCBpZiBpdCBjYW5ub3QgYmUKLQkgKiByZXNvbHZlZCB1bmFtYmlndW91c2x5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlc29sdmVTaWduYXR1cmUoU3RyaW5nIHNpZ25hdHVyZSwgSVR5cGUgdHlwZSkgewotCQlTdHJpbmcgZWxlbWVudFNpZ25hdHVyZSA9IFNpZ25hdHVyZS5nZXRFbGVtZW50VHlwZShzaWduYXR1cmUpOwotCQlpZiAoc2lnbmF0dXJlSXNQcmltaXRpdmUoZWxlbWVudFNpZ25hdHVyZSkpIHsKLQkJCXJldHVybiBTaWduYXR1cmUudG9TdHJpbmcoc2lnbmF0dXJlKTsgIC8vIG5vIG5lZWQgdG8gcmVzb2x2ZSBwcmltaXRpdmVzCi0JCX0KLQkJU3RyaW5nIGVsZW1lbnRUeXBlTmFtZSA9IFNpZ25hdHVyZS50b1N0cmluZyhlbGVtZW50U2lnbmF0dXJlKTsKLQkJZWxlbWVudFR5cGVOYW1lID0gcmVzb2x2ZShlbGVtZW50VHlwZU5hbWUsIHR5cGUpOwotCQlpZiAoZWxlbWVudFR5cGVOYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOyAgLy8gdW5hYmxlIHRvIHJlc29sdmUgdHlwZQotCQl9Ci0JCWludCBhcnJheUNvdW50ID0gU2lnbmF0dXJlLmdldEFycmF5Q291bnQoc2lnbmF0dXJlKTsKLQkJaWYgKGFycmF5Q291bnQgPT0gMCkgewotCQkJcmV0dXJuIGVsZW1lbnRUeXBlTmFtZTsKLQkJfQotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKGVsZW1lbnRUeXBlTmFtZS5sZW5ndGgoKSArIDIqYXJyYXlDb3VudCk7Ci0JCXNiLmFwcGVuZChlbGVtZW50VHlwZU5hbWUpOwotCQlmb3IgKGludCBpID0gYXJyYXlDb3VudDsgaS0tID4gMDsgKSB7Ci0JCQlzYi5hcHBlbmQoJ1snKS5hcHBlbmQoJ10nKTsKLQkJfQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXNvbHZlIHRoZSBzcGVjaWZpZWQgdHlwZSBuYW1lIGluIHRoZSBzY29wZSBvZiB0aGUgc3BlY2lmaWVkIGpkdCB0eXBlLgotCSAqIFJldHVybiB0aGUgZnVsbHktcXVhbGlmaWVkIHR5cGUgbmFtZSBvciByZXR1cm4gbnVsbCBpZiBpdCBjYW5ub3QgYmUKLQkgKiByZXNvbHZlZCB1bmFtYmlndW91c2x5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlc29sdmUoU3RyaW5nIHR5cGVOYW1lLCBJVHlwZSB0eXBlKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gcmVzb2x2ZV8odHlwZU5hbWUsIHR5cGUpOworCQkJcmV0dXJuIGphdmFQcm9qZWN0LmZpbmRUeXBlKHBhY2thZ2VOYW1lLCBxdWFsaWZpZWRUeXBlTmFtZS5yZXBsYWNlKCckJywgJy4nKSk7CiAJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHJlc29sdmVfKFN0cmluZyB0eXBlTmFtZSwgSVR5cGUgdHlwZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCVN0cmluZ1tdW10gcmVzb2x2ZWRUeXBlcyA9IHR5cGUucmVzb2x2ZVR5cGUodHlwZU5hbWUpOwotCQkvLyBpZiBtb3JlIHRoYW4gb25lIHJlc29sdmVkIHR5cGUgaXMgcmV0dXJuZWQsIHRoZSB0eXBlIG5hbWUgaXMgYW1iaWd1b3VzCi0JCWlmIChyZXNvbHZlZFR5cGVzID09IG51bGwpIHsKKwkJCUpwdENvcmVQbHVnaW4ubG9nKGV4KTsKIAkJCXJldHVybiBudWxsOwogCQl9Ci0JCWlmIChyZXNvbHZlZFR5cGVzLmxlbmd0aCA+IDEpIHsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyByZXNvbHZlRW51bShFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKwkJaWYgKGV4cHJlc3Npb24gPT0gbnVsbCkgewogCQkJcmV0dXJuIG51bGw7CiAJCX0KLQkJaWYgKHJlc29sdmVkVHlwZXNbMF1bMF0ubGVuZ3RoKCkgPT0gMCkgewotCQkJLy9oYW5kbGUgRGVmYXVsdCBwYWNrYWdlIGNhc2UgLSBidWcgIzE5MzYxOAotCQkJcmV0dXJuIHJlc29sdmVkVHlwZXNbMF1bMV07Ci0JCX0KLQkJcmV0dXJuIHJlc29sdmVkVHlwZXNbMF1bMF0gKyAiLiIgKyByZXNvbHZlZFR5cGVzWzBdWzFdOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzaWduYXR1cmVJc1ByaW1pdGl2ZShTdHJpbmcgc2lnbmF0dXJlKSB7Ci0JCXJldHVybiBTaWduYXR1cmUuZ2V0VHlwZVNpZ25hdHVyZUtpbmQoc2lnbmF0dXJlKSA9PSBTaWduYXR1cmUuQkFTRV9UWVBFX1NJR05BVFVSRTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXNvbHZlRW51bShJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQsIEV4cHJlc3Npb24gZW51bUV4cHJlc3Npb24pIHsKLQkJcmV0dXJuIHJlc29sdmVFbnVtKHNvdXJjZVVuaXQsIGVudW1FeHByZXNzaW9uLmdldFN0YXJ0UG9zaXRpb24oKSwgZW51bUV4cHJlc3Npb24uZ2V0U3RhcnRQb3NpdGlvbigpICsgZW51bUV4cHJlc3Npb24uZ2V0TGVuZ3RoKCkgLSAxKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXNvbHZlRW51bShJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQsIGludCBlbnVtU291cmNlU3RhcnQsIGludCBlbnVtU291cmNlRW5kKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gcmVzb2x2ZUVudW1fKHNvdXJjZVVuaXQsIGVudW1Tb3VyY2VTdGFydCwgZW51bVNvdXJjZUVuZCk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOworCQlzd2l0Y2ggKGV4cHJlc3Npb24uZ2V0Tm9kZVR5cGUoKSkgeworCQkJY2FzZSBBU1ROb2RlLlFVQUxJRklFRF9OQU1FOgorCQkJY2FzZSBBU1ROb2RlLlNJTVBMRV9OQU1FOgorCQkJCXJldHVybiByZXNvbHZlRW51bSgoTmFtZSkgZXhwcmVzc2lvbik7CisJCQlkZWZhdWx0OgorCQkJCXJldHVybiBudWxsOwogCQl9CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHJlc29sdmVFbnVtXyhJQ29tcGlsYXRpb25Vbml0IHNvdXJjZVVuaXQsIGludCBlbnVtU291cmNlU3RhcnQsIGludCBlbnVtU291cmNlRW5kKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJU3RyaW5nW11bXSByZXNvbHZlZEVudW1zID0gcmVzb2x2ZUZpZWxkXygob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuQ29tcGlsYXRpb25Vbml0KSBzb3VyY2VVbml0LCBlbnVtU291cmNlU3RhcnQsIGVudW1Tb3VyY2VFbmQpOwotCQkvLyBpZiBtb3JlIHRoYW4gb25lIHJlc29sdmVkIGVudW0gaXMgcmV0dXJuZWQsIHRoZSBlbnVtIG5hbWUgaXMgYW1iaWd1b3VzCi0JCWlmIChyZXNvbHZlZEVudW1zID09IG51bGwpIHsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyByZXNvbHZlRW51bShOYW1lIGVudW1FeHByZXNzaW9uKSB7CisJCUlCaW5kaW5nIGJpbmRpbmcgPSBlbnVtRXhwcmVzc2lvbi5yZXNvbHZlQmluZGluZygpOworCQlpZiAoYmluZGluZyA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsgIC8vIFRPRE8gZmlndXJlIHdoeSB0aGlzIGlzIG51bGwgc29tZXRpbWVzCisJCX0KKwkJaWYgKGJpbmRpbmcuZ2V0S2luZCgpICE9IElCaW5kaW5nLlZBUklBQkxFKSB7CiAJCQlyZXR1cm4gbnVsbDsKIAkJfQotCQlpZiAocmVzb2x2ZWRFbnVtcy5sZW5ndGggPiAxKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gcmVzb2x2ZWRFbnVtc1swXVswXSArICIuIiArIHJlc29sdmVkRW51bXNbMF1bMV0gKyAiLiIgKyByZXNvbHZlZEVudW1zWzBdWzJdOworCQlJVmFyaWFibGVCaW5kaW5nIHZhcmlhYmxlQmluZGluZyA9IChJVmFyaWFibGVCaW5kaW5nKSBiaW5kaW5nOworCQlyZXR1cm4gdmFyaWFibGVCaW5kaW5nLmdldFR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkgKyAiLiIgKyB2YXJpYWJsZUJpbmRpbmcuZ2V0TmFtZSgpOwogCX0KIAotCS8vIGNvZGUgbGlmdGVkIGZyb20gU291cmNlVHlwZS5yZXNvbHZlVHlwZShTdHJpbmcsIFdvcmtpbmdDb3B5T3duZXIpCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW11bXSByZXNvbHZlRmllbGRfKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkNvbXBpbGF0aW9uVW5pdCBzb3VyY2VVbml0LCBpbnQgc2VsZWN0aW9uU291cmNlU3RhcnQsIGludCBzZWxlY3Rpb25Tb3VyY2VFbmQpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQljbGFzcyBUeXBlUmVzb2x2ZVJlcXVlc3RvciBpbXBsZW1lbnRzIElTZWxlY3Rpb25SZXF1ZXN0b3IgewotCQkJU3RyaW5nW11bXSBhbnN3ZXJzID0gbnVsbDsKLQkJCXB1YmxpYyB2b2lkIGFjY2VwdFR5cGUoY2hhcltdIHBhY2thZ2VOYW1lLCBjaGFyW10gdE5hbWUsIGludCBtb2RpZmllcnMsIGJvb2xlYW4gaXNEZWNsYXJhdGlvbiwgY2hhcltdIHVuaXF1ZUtleSwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBhY2NlcHRFcnJvcihDYXRlZ29yaXplZFByb2JsZW0gZXJyb3IpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGFjY2VwdEZpZWxkKGNoYXJbXSBkZWNsYXJpbmdUeXBlUGFja2FnZU5hbWUsIGNoYXJbXSBkZWNsYXJpbmdUeXBlTmFtZSwgY2hhcltdIGZpZWxkTmFtZSwgYm9vbGVhbiBpc0RlY2xhcmF0aW9uLCBjaGFyW10gdW5pcXVlS2V5LCBpbnQgc3RhcnQsIGludCBlbmQpIHsKLQkJCQlTdHJpbmdbXSBhbnN3ZXIgPSBuZXcgU3RyaW5nW10gIHtuZXcgU3RyaW5nKGRlY2xhcmluZ1R5cGVQYWNrYWdlTmFtZSksIG5ldyBTdHJpbmcoZGVjbGFyaW5nVHlwZU5hbWUpLCBuZXcgU3RyaW5nKGZpZWxkTmFtZSkgfTsKLQkJCQlpZiAodGhpcy5hbnN3ZXJzID09IG51bGwpIHsKLQkJCQkJdGhpcy5hbnN3ZXJzID0gbmV3IFN0cmluZ1tdW117IGFuc3dlciB9OwotCQkJCX0gZWxzZSB7Ci0JCQkJCWludCBsZW4gPSB0aGlzLmFuc3dlcnMubGVuZ3RoOwotCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHRoaXMuYW5zd2VycywgMCwgdGhpcy5hbnN3ZXJzID0gbmV3IFN0cmluZ1tsZW4rMV1bXSwgMCwgbGVuKTsKLQkJCQkJdGhpcy5hbnN3ZXJzW2xlbl0gPSBhbnN3ZXI7Ci0JCQkJfQotCQkJfQotCQkJcHVibGljIHZvaWQgYWNjZXB0TWV0aG9kKGNoYXJbXSBkZWNsYXJpbmdUeXBlUGFja2FnZU5hbWUsIGNoYXJbXSBkZWNsYXJpbmdUeXBlTmFtZSwgU3RyaW5nIGVuY2xvc2luZ0RlY2xhcmluZ1R5cGVTaWduYXR1cmUsIGNoYXJbXSBzZWxlY3RvciwgY2hhcltdW10gcGFyYW1ldGVyUGFja2FnZU5hbWVzLCBjaGFyW11bXSBwYXJhbWV0ZXJUeXBlTmFtZXMsIFN0cmluZ1tdIHBhcmFtZXRlclNpZ25hdHVyZXMsIGNoYXJbXVtdIHR5cGVQYXJhbWV0ZXJOYW1lcywgY2hhcltdW11bXSB0eXBlUGFyYW1ldGVyQm91bmROYW1lcywgYm9vbGVhbiBpc0NvbnN0cnVjdG9yLCBib29sZWFuIGlzRGVjbGFyYXRpb24sIGNoYXJbXSB1bmlxdWVLZXksIGludCBzdGFydCwgaW50IGVuZCkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQkJcHVibGljIHZvaWQgYWNjZXB0UGFja2FnZShjaGFyW10gcGFja2FnZU5hbWUpewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQkJcHVibGljIHZvaWQgYWNjZXB0VHlwZVBhcmFtZXRlcihjaGFyW10gZGVjbGFyaW5nVHlwZVBhY2thZ2VOYW1lLCBjaGFyW10gZGVjbGFyaW5nVHlwZU5hbWUsIGNoYXJbXSB0eXBlUGFyYW1ldGVyTmFtZSwgYm9vbGVhbiBpc0RlY2xhcmF0aW9uLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGFjY2VwdE1ldGhvZFR5cGVQYXJhbWV0ZXIoY2hhcltdIGRlY2xhcmluZ1R5cGVQYWNrYWdlTmFtZSwgY2hhcltdIGRlY2xhcmluZ1R5cGVOYW1lLCBjaGFyW10gc2VsZWN0b3IsIGludCBzZWxlY3RvclN0YXJ0LCBpbnQgc2VsY2V0b3JFbmQsIGNoYXJbXSB0eXBlUGFyYW1ldGVyTmFtZSwgYm9vbGVhbiBpc0RlY2xhcmF0aW9uLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQkKLQkJfQotCQlUeXBlUmVzb2x2ZVJlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgVHlwZVJlc29sdmVSZXF1ZXN0b3IoKTsKLQkJSmF2YVByb2plY3QgcHJvamVjdCA9IChKYXZhUHJvamVjdCkgc291cmNlVW5pdC5nZXRKYXZhUHJvamVjdCgpOwotCQlTZWFyY2hhYmxlRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgPSBwcm9qZWN0Lm5ld1NlYXJjaGFibGVOYW1lRW52aXJvbm1lbnQoRGVmYXVsdFdvcmtpbmdDb3B5T3duZXIuUFJJTUFSWSk7Ci0JCi0JCVNlbGVjdGlvbkVuZ2luZSBlbmdpbmUgPSBuZXcgU2VsZWN0aW9uRW5naW5lKGVudmlyb25tZW50LCByZXF1ZXN0b3IsIHByb2plY3QuZ2V0T3B0aW9ucyh0cnVlKSk7Ci0JCQkKLQkJZW5naW5lLnNlbGVjdChzb3VyY2VVbml0LCBzZWxlY3Rpb25Tb3VyY2VTdGFydCwgc2VsZWN0aW9uU291cmNlRW5kKTsKLQkJcmV0dXJuIHJlcXVlc3Rvci5hbnN3ZXJzOwotCX0KIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qZHR1dGlsaXR5L01lbWJlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pkdHV0aWxpdHkvTWVtYmVyLmphdmEKaW5kZXggZTc2OTI3Yi4uZmNhN2ViZCAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pkdHV0aWxpdHkvTWVtYmVyLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pkdHV0aWxpdHkvTWVtYmVyLmphdmEKQEAgLTExLDYgKzExLDcgQEAKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuRmlsZUJ1ZmZlcnM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JVGV4dEZpbGVCdWZmZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5Mb2NhdGlvbktpbmQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWVtYmVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklTb3VyY2VSYW5nZTsKQEAgLTI3LDcgKzI4LDExIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSVRleHRSYW5nZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5TaW1wbGVUZXh0UmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29tbWFuZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db21tYW5kRXhlY3V0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29tbWFuZEV4ZWN1dG9yUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NYWxmb3JtZWRUcmVlRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuVGV4dEVkaXQ7CiAKIC8qKgpAQCAtNDAsMTQgKzQ1LDE3IEBACiAJLyoqIHRoaXMgd2lsbCBiZSBudWxsIGZvciBhIHRvcC1sZXZlbCB0eXBlICovCiAJcHJpdmF0ZSBmaW5hbCBUeXBlIGRlY2xhcmluZ1R5cGU7CiAKKwlwcml2YXRlIGZpbmFsIENvbW1hbmRFeGVjdXRvclByb3ZpZGVyIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yUHJvdmlkZXI7CisKIAogCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgogCi0JTWVtYmVyKElNZW1iZXIgamR0TWVtYmVyKSB7CisJTWVtYmVyKElNZW1iZXIgamR0TWVtYmVyLCBDb21tYW5kRXhlY3V0b3JQcm92aWRlciBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvclByb3ZpZGVyKSB7CiAJCXN1cGVyKCk7CiAJCXRoaXMuamR0TWVtYmVyID0gamR0TWVtYmVyOwogCQlJVHlwZSBqZHREZWNsYXJpbmdUeXBlID0gamR0TWVtYmVyLmdldERlY2xhcmluZ1R5cGUoKTsKLQkJdGhpcy5kZWNsYXJpbmdUeXBlID0gKGpkdERlY2xhcmluZ1R5cGUgPT0gbnVsbCkgPyBudWxsIDogbmV3IFR5cGUoamR0RGVjbGFyaW5nVHlwZSk7CisJCXRoaXMuZGVjbGFyaW5nVHlwZSA9IChqZHREZWNsYXJpbmdUeXBlID09IG51bGwpID8gbnVsbCA6IG5ldyBUeXBlKGpkdERlY2xhcmluZ1R5cGUsIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yUHJvdmlkZXIpOworCQl0aGlzLm1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yUHJvdmlkZXIgPSBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvclByb3ZpZGVyOwogCX0KIAogCkBAIC04OCw3ICs5NiwxNCBAQAogCSAqIG5vdGU6IHRoaXMgY3JlYXRlcyBhICpuZXcqIEFTVAogCSAqLwogCXB1YmxpYyBDb21waWxhdGlvblVuaXQgYXN0Um9vdCgpIHsKLQkJcmV0dXJuIEpEVFRvb2xzLmNyZWF0ZUFTVFJvb3QodGhpcy5qZHRNZW1iZXIpOworCQlyZXR1cm4gSkRUVG9vbHMuYnVpbGRBU1RSb290KHRoaXMuamR0TWVtYmVyKTsKKwl9CisKKwkvKioKKwkgKiBub3RlOiB0aGlzIGNyZWF0ZXMgYSAqbmV3KiBBU1QKKwkgKi8KKwlwcml2YXRlIENvbXBpbGF0aW9uVW5pdCBsaWdodHdlaWdodEFTVFJvb3QoKSB7CisJCXJldHVybiBKRFRUb29scy5idWlsZExpZ2h0d2VpZ2h0QVNUUm9vdCh0aGlzLmpkdE1lbWJlcik7CiAJfQogCiAJcHVibGljIE1vZGlmaWVkRGVjbGFyYXRpb24gbW9kaWZpZWREZWNsYXJhdGlvbigpIHsKQEAgLTk5LDEyICsxMTQsOCBAQAogCQlyZXR1cm4gbmV3IE1vZGlmaWVkRGVjbGFyYXRpb24odGhpcy5ib2R5RGVjbGFyYXRpb24oYXN0Um9vdCkpOwogCX0KIAotCXB1YmxpYyBCb2R5RGVjbGFyYXRpb24gYm9keURlY2xhcmF0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5ib2R5RGVjbGFyYXRpb24odGhpcy5hc3RSb290KCkpOwotCX0KLQogCXB1YmxpYyBJVGV4dFJhbmdlIHRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMudGV4dFJhbmdlKHRoaXMuYXN0Um9vdCgpKTsKKwkJcmV0dXJuIHRoaXMudGV4dFJhbmdlKHRoaXMubGlnaHR3ZWlnaHRBU1RSb290KCkpOwogCX0KIAogCXB1YmxpYyBJVGV4dFJhbmdlIHRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewpAQCAtMTE2LDIzICsxMjcsMjMgQEAKIAl9CiAKIAlwdWJsaWMgSVRleHRSYW5nZSBuYW1lVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lVGV4dFJhbmdlKHRoaXMuYXN0Um9vdCgpKTsKKwkJcmV0dXJuIHRoaXMubmFtZVRleHRSYW5nZSh0aGlzLmxpZ2h0d2VpZ2h0QVNUUm9vdCgpKTsKIAl9CiAJCiAJcHVibGljIElUZXh0UmFuZ2UgbmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewogCQlJU291cmNlUmFuZ2Ugc291cmNlUmFuZ2UgPSB0aGlzLm5hbWVTb3VyY2VSYW5nZSgpOwotCQlyZXR1cm4gCisJCXJldHVybgogCQkJbmV3IFNpbXBsZVRleHRSYW5nZSgKIAkJCQlzb3VyY2VSYW5nZS5nZXRPZmZzZXQoKSwgCiAJCQkJc291cmNlUmFuZ2UuZ2V0TGVuZ3RoKCksCi0JCQkJYXN0Um9vdC5nZXRMaW5lTnVtYmVyKHNvdXJjZVJhbmdlLmdldE9mZnNldCgpKSk7CisJCQkJYXN0Um9vdC5nZXRMaW5lTnVtYmVyKHNvdXJjZVJhbmdlLmdldE9mZnNldCgpKQorCQkJKTsKIAl9CiAJCiAJcHJpdmF0ZSBJU291cmNlUmFuZ2UgbmFtZVNvdXJjZVJhbmdlKCkgewogCQl0cnkgewotCQkJcmV0dXJuIGdldEpkdE1lbWJlcigpLmdldE5hbWVSYW5nZSgpOwotCQl9Ci0JCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKKwkJCXJldHVybiB0aGlzLmpkdE1lbWJlci5nZXROYW1lUmFuZ2UoKTsKKwkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7CiAJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7CiAJCX0KIAl9CkBAIC0zNzQsMTIgKzM4NSwxMiBAQAogCQkJY29tcGlsYXRpb25Vbml0LmJlY29tZVdvcmtpbmdDb3B5KG51bGwpOwogCQl9CiAKLQkJSVRleHRGaWxlQnVmZmVyIGJ1ZmZlciA9IEZpbGVCdWZmZXJzLmdldFRleHRGaWxlQnVmZmVyTWFuYWdlcigpLmdldFRleHRGaWxlQnVmZmVyKGNvbXBpbGF0aW9uVW5pdC5nZXRSZXNvdXJjZSgpLmdldEZ1bGxQYXRoKCkpOwotCQlib29sZWFuIHRleHRFZGl0b3JQcmVzZW50ID0gKGJ1ZmZlciAhPSBudWxsKTsKLQkJSURvY3VtZW50IGRvYyA9IHRleHRFZGl0b3JQcmVzZW50ID8KLQkJCWJ1ZmZlci5nZXREb2N1bWVudCgpCi0JCToKLQkJCW5ldyBEb2N1bWVudChjb21waWxhdGlvblVuaXQuZ2V0QnVmZmVyKCkuZ2V0Q29udGVudHMoKSk7CisJCUlUZXh0RmlsZUJ1ZmZlciBidWZmZXIgPSBGaWxlQnVmZmVycy5nZXRUZXh0RmlsZUJ1ZmZlck1hbmFnZXIoKS5nZXRUZXh0RmlsZUJ1ZmZlcihjb21waWxhdGlvblVuaXQuZ2V0UmVzb3VyY2UoKS5nZXRGdWxsUGF0aCgpLCBMb2NhdGlvbktpbmQuTk9STUFMSVpFKTsKKwkJYm9vbGVhbiBzaGFyZWREb2N1bWVudCA9IChidWZmZXIgIT0gbnVsbCk7ICAvLyBkb2N1bWVudHMgYXJlIHR5cGljYWxseSBzaGFyZWQgd2hlbiB0aGV5IGFyZSBhbHJlYWR5IG9wZW4gaW4gYW4gZWRpdG9yCisJCUlEb2N1bWVudCBkb2MgPSBzaGFyZWREb2N1bWVudCA/CisJCQkJYnVmZmVyLmdldERvY3VtZW50KCkKKwkJCToKKwkJCQluZXcgRG9jdW1lbnQoY29tcGlsYXRpb25Vbml0LmdldEJ1ZmZlcigpLmdldENvbnRlbnRzKCkpOwogCiAJCUNvbXBpbGF0aW9uVW5pdCBhc3RSb290ID0gdGhpcy5hc3RSb290KCk7CiAJCWFzdFJvb3QucmVjb3JkTW9kaWZpY2F0aW9ucygpOwpAQCAtMzg3LDE2ICszOTgsMzYgQEAKIAkJZWRpdG9yLmVkaXQodGhpcy5tb2RpZmllZERlY2xhcmF0aW9uKGFzdFJvb3QpKTsKIAogCQlUZXh0RWRpdCBlZGl0cyA9IGFzdFJvb3QucmV3cml0ZShkb2MsIGNvbXBpbGF0aW9uVW5pdC5nZXRKYXZhUHJvamVjdCgpLmdldE9wdGlvbnModHJ1ZSkpOwotCQlBbm5vdGF0aW9uRWRpdEZvcm1hdHRlciBmb3JtYXR0ZXIgPSBuZXcgQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIoZG9jKTsKLQkJZm9ybWF0dGVyLmFwcGx5KGVkaXRzKTsKKwkJaWYgKHNoYXJlZERvY3VtZW50KSB7CisJCQl0aGlzLm1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yKCkuZXhlY3V0ZShuZXcgTW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kKGVkaXRzLCBkb2MpKTsKKwkJfSBlbHNlIHsKKwkJCXRoaXMuYXBwbHlFZGl0cyhlZGl0cywgZG9jKTsKKwkJfQogCi0JCWlmICggISB0ZXh0RWRpdG9yUHJlc2VudCkgeworCQlpZiAoICEgc2hhcmVkRG9jdW1lbnQpIHsKIAkJCWNvbXBpbGF0aW9uVW5pdC5nZXRCdWZmZXIoKS5zZXRDb250ZW50cyhkb2MuZ2V0KCkpOwotCQkJY29tcGlsYXRpb25Vbml0LmNvbW1pdFdvcmtpbmdDb3B5KHRydWUsIG51bGwpOworCQkJY29tcGlsYXRpb25Vbml0LmNvbW1pdFdvcmtpbmdDb3B5KHRydWUsIG51bGwpOyAgLy8gdHJ1ZT0iZm9yY2UiCiAJCQljb21waWxhdGlvblVuaXQuZGlzY2FyZFdvcmtpbmdDb3B5KCk7CiAJCX0KIAl9CiAKKwkvKioKKwkgKiBhcHBseSB0aGUgc3BlY2lmaWVkIGVkaXRzIHRvIHRoZSBzcGVjaWZpZWQgZG9jdW1lbnQsCisJICogcmVmb3JtYXR0aW5nIHRoZSBkb2N1bWVudCBpZiBuZWNlc3NhcnkKKwkgKi8KKwl2b2lkIGFwcGx5RWRpdHMoVGV4dEVkaXQgZWRpdHMsIElEb2N1bWVudCBkb2MpIHRocm93cyBNYWxmb3JtZWRUcmVlRXhjZXB0aW9uLCBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7CisJCWVkaXRzLmFwcGx5KGRvYywgVGV4dEVkaXQuVVBEQVRFX1JFR0lPTlMpOworCQl0aGlzLmFubm90YXRpb25FZGl0Rm9ybWF0dGVyKCkuZm9ybWF0KGRvYywgZWRpdHMpOworCX0KKworCXByaXZhdGUgQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIgYW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIoKSB7CisJCXJldHVybiBEZWZhdWx0QW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIuaW5zdGFuY2UoKTsKKwl9CisKKwlwcml2YXRlIENvbW1hbmRFeGVjdXRvciBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvcigpIHsKKwkJcmV0dXJuIHRoaXMubW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3JQcm92aWRlci5jb21tYW5kRXhlY3V0b3IoKTsKKwl9CisKIAogCS8vICoqKioqKioqKiogImVkaXRvciIgaW50ZXJmYWNlICoqKioqKioqKioKIApAQCAtNDEzLDQgKzQ0NCwzMyBAQAogCiAJfQogCisKKwkvLyAqKioqKioqKioqIG1vZGlmeSBzaGFyZWQgZG9jdW1lbnQgY29tbWFuZCBjbGFzcyAqKioqKioqKioqCisKKwkvKioKKwkgKiBzaW1wbGUgY29tbWFuZCB0aGF0IGNhbGxzIGJhY2sgdG8gdGhlIG1lbWJlciB0byBhcHBseSB0aGUgZWRpdHMKKwkgKiBpbiB0aGUgc2FtZSB3YXkgYXMgaWYgdGhlIGRvY3VtZW50IHdlcmUgbm90IHNoYXJlZAorCSAqLworCWNsYXNzIE1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZCBpbXBsZW1lbnRzIENvbW1hbmQgeworCQlwcml2YXRlIGZpbmFsIFRleHRFZGl0IGVkaXRzOworCQlwcml2YXRlIGZpbmFsIElEb2N1bWVudCBkb2M7CisKKwkJTW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kKFRleHRFZGl0IGVkaXRzLCBJRG9jdW1lbnQgZG9jKSB7CisJCQlzdXBlcigpOworCQkJdGhpcy5lZGl0cyA9IGVkaXRzOworCQkJdGhpcy5kb2MgPSBkb2M7CisJCX0KKworCQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgeworCQkJdHJ5IHsKKwkJCQlNZW1iZXIudGhpcy5hcHBseUVkaXRzKHRoaXMuZWRpdHMsIHRoaXMuZG9jKTsKKwkJCX0gY2F0Y2ggKE1hbGZvcm1lZFRyZWVFeGNlcHRpb24gZXgpIHsKKwkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7CisJCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBleCkgeworCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKKwkJCX0KKwkJfQorCisJfQorCiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvamR0dXRpbGl0eS9NZXRob2RBdHRyaWJ1dGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qZHR1dGlsaXR5L01ldGhvZEF0dHJpYnV0ZS5qYXZhCmluZGV4IGIzMjk3OTguLmY2MzZhZDYgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qZHR1dGlsaXR5L01ldGhvZEF0dHJpYnV0ZS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qZHR1dGlsaXR5L01ldGhvZEF0dHJpYnV0ZS5qYXZhCkBAIC0xMSw5ICsxMSwxMSBAQAogCiBpbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSU1ldGhvZEJpbmRpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklUeXBlQmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWV0aG9kRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29tbWFuZEV4ZWN1dG9yUHJvdmlkZXI7CiAKIC8qKgogICogQWRhcHQgYW5kIGV4dGVuZCBhIGpkdCBtZXRob2QuCkBAIC0zMCw4ICszMiw4IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBNZXRob2RBdHRyaWJ1dGUgZXh0ZW5kcyBBdHRyaWJ1dGUgewogCi0JcHVibGljIE1ldGhvZEF0dHJpYnV0ZShJTWV0aG9kIGdldE1ldGhvZCkgewotCQlzdXBlcihnZXRNZXRob2QpOworCXB1YmxpYyBNZXRob2RBdHRyaWJ1dGUoSU1ldGhvZCBnZXRNZXRob2QsIENvbW1hbmRFeGVjdXRvclByb3ZpZGVyIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yUHJvdmlkZXIpIHsKKwkJc3VwZXIoZ2V0TWV0aG9kLCBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvclByb3ZpZGVyKTsKIAl9CiAKIAlAT3ZlcnJpZGUKQEAgLTM5LDExICs0MSw2IEBACiAJCXJldHVybiAoSU1ldGhvZCkgc3VwZXIuZ2V0SmR0TWVtYmVyKCk7CiAJfQogCi0JQE92ZXJyaWRlCi0JcHVibGljIE1ldGhvZERlY2xhcmF0aW9uIGJvZHlEZWNsYXJhdGlvbigpIHsKLQkJcmV0dXJuIChNZXRob2REZWNsYXJhdGlvbikgc3VwZXIuYm9keURlY2xhcmF0aW9uKCk7Ci0JfQotCiAKIAkvLyAqKioqKioqKioqIE1lbWJlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCiAKQEAgLTgxLDE0ICs3OCwxMyBAQAogCQl9CiAJCXJldHVybiBJbnRyb3NwZWN0b3IuZGVjYXBpdGFsaXplKG1ldGhvZE5hbWUuc3Vic3RyaW5nKGJlZ2luSW5kZXgpKTsKIAl9Ci0KKwkKIAlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHR5cGVTaWduYXR1cmUoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRKZHRNZW1iZXIoKS5nZXRSZXR1cm5UeXBlKCk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOworCXB1YmxpYyBJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJSU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZyA9IGJvZHlEZWNsYXJhdGlvbihhc3RSb290KS5yZXNvbHZlQmluZGluZygpOworCQlpZiAobWV0aG9kQmluZGluZyAhPSBudWxsKSB7CisJCQlyZXR1cm4gbWV0aG9kQmluZGluZy5nZXRSZXR1cm5UeXBlKCk7CiAJCX0KKwkJcmV0dXJuIG51bGw7CiAJfQotCiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvamR0dXRpbGl0eS9Nb2RpZmllZERlY2xhcmF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvamR0dXRpbGl0eS9Nb2RpZmllZERlY2xhcmF0aW9uLmphdmEKaW5kZXggMThjODUyMC4uOWFmNjlhMiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pkdHV0aWxpdHkvTW9kaWZpZWREZWNsYXJhdGlvbi5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qZHR1dGlsaXR5L01vZGlmaWVkRGVjbGFyYXRpb24uamF2YQpAQCAtMjAsNiArMjAsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Cb2R5RGVjbGFyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSUV4dGVuZGVkTW9kaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklUeXBlQmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSW1wb3J0RGVjbGFyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uOwpAQCAtNzEsNyArNzIsNyBAQAogCSAqIFJldHVybiB0aGUgImRlY2xhcmF0aW9uIiBBU1Qgbm9kZS4KIAkgKi8KIAlwdWJsaWMgQVNUTm9kZSBnZXREZWNsYXJhdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuYWRhcHRlci5nZXREZWNsYXJhdGlvbigpOworCQlyZXR1cm4gdGhpcy5hZGFwdGVyLmRlY2xhcmF0aW9uKCk7CiAJfQogCiAJLyoqCkBAIC0yNzcsMTkgKzI3OCwzMCBAQAogCX0KIAogCXByaXZhdGUgU3RyaW5nIHF1YWxpZmllZE5hbWUoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCVN0cmluZyBuYW1lID0gYW5ub3RhdGlvbi5nZXRUeXBlTmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOwotCQlpZiAobmFtZS5pbmRleE9mKCcuJykgIT0gLTEpIHsKLQkJCXJldHVybiBuYW1lOyAgLy8gbmFtZSBpcyBhbHJlYWR5IHF1YWxpZmllZAotCQl9Ci0JCVN0cmluZyByZXNvbHZlZE5hbWUgPSBKRFRUb29scy5yZXNvbHZlKG5hbWUsIHRoaXMudHlwZSgpKTsKLQkJaWYgKHJlc29sdmVkTmFtZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVzb2x2ZWROYW1lOworCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSBhbm5vdGF0aW9uLnJlc29sdmVUeXBlQmluZGluZygpOworCQlpZiAodHlwZUJpbmRpbmcgIT0gbnVsbCkgeworCQkJU3RyaW5nIHJlc29sdmVkTmFtZSA9IHR5cGVCaW5kaW5nLmdldFF1YWxpZmllZE5hbWUoKTsKKwkJCWlmIChyZXNvbHZlZE5hbWUgIT0gbnVsbCkgeworCQkJCXJldHVybiByZXNvbHZlZE5hbWU7CisJCQl9CiAJCX0KIAkJLy8gaGFjayg/KTogY2hlY2sgZm9yIGEgbWF0Y2hpbmcgaW1wb3J0IGJlY2F1c2Ugd2hlbiBtb3ZpbmcgYSBzdGFuZC1hbG9uZQogCQkvLyBhbm5vdGF0aW9uIHRvIGl0cyBjb250YWluZXIgaW4gQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcgogCQkvLyB0aGUgY29udGFpbmVyJ3MgaW1wb3J0IGlzIGFkZGVkIGJ1dCB0aGVuIGl0IHdvbid0ICJyZXNvbHZlIiB1cG9uCiAJCS8vIHN1YnNlcXVlbnQgbG9va3Vwcy4uLiA6LSgKLQkJcmV0dXJuIHRoaXMuaW1wb3J0Rm9yKG5hbWUpOyAgLy8gbG9vayBmb3IgYSBtYXRjaGluZyBpbXBvcnQKKwkJcmV0dXJuIHRoaXMuaW1wb3J0Rm9yKGFubm90YXRpb24uZ2V0VHlwZU5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7ICAvLyBsb29rIGZvciBhIG1hdGNoaW5nIGltcG9ydAorCisJCS8vIE9MRCBNRVRIT0QgU09VUkNFOgorLy8JCVN0cmluZyBuYW1lID0gYW5ub3RhdGlvbi5nZXRUeXBlTmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOworLy8JCWlmIChuYW1lLmluZGV4T2YoJy4nKSAhPSAtMSkgeworLy8JCQlyZXR1cm4gbmFtZTsgIC8vIG5hbWUgaXMgYWxyZWFkeSBxdWFsaWZpZWQKKy8vCQl9CisvLwkJU3RyaW5nIHJlc29sdmVkTmFtZSA9IEpEVFRvb2xzLnJlc29sdmUobmFtZSwgdGhpcy50eXBlKCkpOworLy8JCS8vIGhhY2soPyk6IGNoZWNrIGZvciBhIG1hdGNoaW5nIGltcG9ydCBiZWNhdXNlIHdoZW4gbW92aW5nIGEgc3RhbmQtYWxvbmUKKy8vCQkvLyBhbm5vdGF0aW9uIHRvIGl0cyBjb250YWluZXIgaW4gQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcgorLy8JCS8vIHRoZSBjb250YWluZXIncyBpbXBvcnQgaXMgYWRkZWQgYnV0IHRoZW4gaXQgd29uJ3QgInJlc29sdmUiIHVwb24KKy8vCQkvLyBzdWJzZXF1ZW50IGxvb2t1cHMuLi4gOi0oCisvLwkJcmV0dXJuIHRoaXMuaW1wb3J0Rm9yKG5hbWUpOyAgLy8gbG9vayBmb3IgYSBtYXRjaGluZyBpbXBvcnQKIAl9CiAKIAkvKioKQEAgLTM1Myw3ICszNjUsNyBAQAogCQkvKioKIAkJICogUmV0dXJuIHRoZSBhZGFwdGVkICJkZWNsYXJhdGlvbiIuCiAJCSAqLwotCQlBU1ROb2RlIGdldERlY2xhcmF0aW9uKCk7CisJCUFTVE5vZGUgZGVjbGFyYXRpb24oKTsKIAogCQkvKioKIAkJICogUmV0dXJuIHRoZSAiZGVjbGFyYXRpb24iJ3MgbGlzdCBvZiBtb2RpZmllcnMuCkBAIC0zNjksNyArMzgxLDcgQEAKIAkJCXN1cGVyKCk7CiAJCQl0aGlzLmRlY2xhcmF0aW9uID0gZGVjbGFyYXRpb247CiAJCX0KLQkJcHVibGljIEFTVE5vZGUgZ2V0RGVjbGFyYXRpb24oKSB7CisJCXB1YmxpYyBBU1ROb2RlIGRlY2xhcmF0aW9uKCkgewogCQkJcmV0dXJuIHRoaXMuZGVjbGFyYXRpb247CiAJCX0KIAkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCkBAIC0zODgsNyArNDAwLDcgQEAKIAkJCXN1cGVyKCk7CiAJCQl0aGlzLmRlY2xhcmF0aW9uID0gZGVjbGFyYXRpb247CiAJCX0KLQkJcHVibGljIEFTVE5vZGUgZ2V0RGVjbGFyYXRpb24oKSB7CisJCXB1YmxpYyBBU1ROb2RlIGRlY2xhcmF0aW9uKCkgewogCQkJcmV0dXJuIHRoaXMuZGVjbGFyYXRpb247CiAJCX0KIAkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCkBAIC00MDcsNyArNDE5LDcgQEAKIAkJCXN1cGVyKCk7CiAJCQl0aGlzLmRlY2xhcmF0aW9uID0gZGVjbGFyYXRpb247CiAJCX0KLQkJcHVibGljIEFTVE5vZGUgZ2V0RGVjbGFyYXRpb24oKSB7CisJCXB1YmxpYyBBU1ROb2RlIGRlY2xhcmF0aW9uKCkgewogCQkJcmV0dXJuIHRoaXMuZGVjbGFyYXRpb247CiAJCX0KIAkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCkBAIC00MjYsNyArNDM4LDcgQEAKIAkJCXN1cGVyKCk7CiAJCQl0aGlzLmRlY2xhcmF0aW9uID0gZGVjbGFyYXRpb247CiAJCX0KLQkJcHVibGljIEFTVE5vZGUgZ2V0RGVjbGFyYXRpb24oKSB7CisJCXB1YmxpYyBBU1ROb2RlIGRlY2xhcmF0aW9uKCkgewogCQkJcmV0dXJuIHRoaXMuZGVjbGFyYXRpb247CiAJCX0KIAkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvamR0dXRpbGl0eS9OYW1lU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pkdHV0aWxpdHkvTmFtZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuamF2YQppbmRleCAwNzg4MzVlLi4wYWFhNzAzIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvamR0dXRpbGl0eS9OYW1lU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qZHR1dGlsaXR5L05hbWVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmphdmEKQEAgLTExLDYgKzExLDcgQEAKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5hbWU7CiAKIC8qKgpAQCAtMTgsMTQgKzE5LDE0IEBACiAgKiAoZS5nLiAiY29tLnh4eC5Gb28uVkFMVUUxIiBvciAidmFsdWUiKS4KICAqLwogcHVibGljIGZpbmFsIGNsYXNzIE5hbWVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyCi0JZXh0ZW5kcyBBYnN0cmFjdEV4cHJlc3Npb25Db252ZXJ0ZXI8U3RyaW5nLCBOYW1lPgorCWV4dGVuZHMgQWJzdHJhY3RFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZz4KIHsKLQlwcml2YXRlIHN0YXRpYyBFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZywgTmFtZT4gSU5TVEFOQ0U7CisJcHJpdmF0ZSBzdGF0aWMgRXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmc+IElOU1RBTkNFOwogCiAJLyoqCiAJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCiAJICovCi0JcHVibGljIHN0YXRpYyBFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZywgTmFtZT4gaW5zdGFuY2UoKSB7CisJcHVibGljIHN0YXRpYyBFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZz4gaW5zdGFuY2UoKSB7CiAJCWlmIChJTlNUQU5DRSA9PSBudWxsKSB7CiAJCQlJTlNUQU5DRSA9IG5ldyBOYW1lU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlcigpOwogCQl9CkBAIC00MCwxNiArNDEsMTYgQEAKIAl9CiAKIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTmFtZSBjb252ZXJ0XyhTdHJpbmcgc3RyaW5nLCBBU1QgYXN0KSB7CisJcHJvdGVjdGVkIE5hbWUgY29udmVydE9iamVjdChTdHJpbmcgc3RyaW5nLCBBU1QgYXN0KSB7CiAJCXJldHVybiBhc3QubmV3TmFtZShzdHJpbmcpOwogCX0KIAogCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgY29udmVydF8oTmFtZSBuYW1lKSB7Ci0JCXN3aXRjaCAobmFtZS5nZXROb2RlVHlwZSgpKSB7CisJcHJvdGVjdGVkIFN0cmluZyBjb252ZXJ0RXhwcmVzc2lvbihFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKwkJc3dpdGNoIChleHByZXNzaW9uLmdldE5vZGVUeXBlKCkpIHsKIAkJCWNhc2UgQVNUTm9kZS5RVUFMSUZJRURfTkFNRToKIAkJCWNhc2UgQVNUTm9kZS5TSU1QTEVfTkFNRToKLQkJCQlyZXR1cm4gbmFtZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKTsKKwkJCQlyZXR1cm4gKChOYW1lKSBleHByZXNzaW9uKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKTsKIAkJCWRlZmF1bHQ6CiAJCQkJcmV0dXJuIG51bGw7CiAJCX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qZHR1dGlsaXR5L051bGxBbm5vdGF0aW9uRWRpdEZvcm1hdHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pkdHV0aWxpdHkvTnVsbEFubm90YXRpb25FZGl0Rm9ybWF0dGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZlODMxZQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qZHR1dGlsaXR5L051bGxBbm5vdGF0aW9uRWRpdEZvcm1hdHRlci5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgorICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuamR0dXRpbGl0eTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NYWxmb3JtZWRUcmVlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuVGV4dEVkaXQ7CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBOdWxsQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIKKwlpbXBsZW1lbnRzIEFubm90YXRpb25FZGl0Rm9ybWF0dGVyCit7CisKKwlwcml2YXRlIHN0YXRpYyBOdWxsQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIgSU5TVEFOQ0UgPSBuZXcgTnVsbEFubm90YXRpb25FZGl0Rm9ybWF0dGVyKCk7CisKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEFubm90YXRpb25FZGl0Rm9ybWF0dGVyIGluc3RhbmNlKCkgeworCQlyZXR1cm4gSU5TVEFOQ0U7CisJfQorCisJLyoqCisJICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KKwkgKi8KKwlwcml2YXRlIE51bGxBbm5vdGF0aW9uRWRpdEZvcm1hdHRlcigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBmb3JtYXQoSURvY3VtZW50IGRvYywgVGV4dEVkaXQgZWRpdFRyZWUpIHRocm93cyBNYWxmb3JtZWRUcmVlRXhjZXB0aW9uLCBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7CisJCS8vIG5vIGZvcm1hdHRpbmcKKwl9CisKK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qZHR1dGlsaXR5L051bGxFeHByZXNzaW9uQ29udmVydGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvamR0dXRpbGl0eS9OdWxsRXhwcmVzc2lvbkNvbnZlcnRlci5qYXZhCmluZGV4IGU1OGYzYWYuLmI0NWMwY2UgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qZHR1dGlsaXR5L051bGxFeHByZXNzaW9uQ29udmVydGVyLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pkdHV0aWxpdHkvTnVsbEV4cHJlc3Npb25Db252ZXJ0ZXIuamF2YQpAQCAtMTcsMTYgKzE3LDE2IEBACiAgKiBObyBjb252ZXJzaW9uLgogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgTnVsbEV4cHJlc3Npb25Db252ZXJ0ZXIKLQlpbXBsZW1lbnRzIEV4cHJlc3Npb25Db252ZXJ0ZXI8RXhwcmVzc2lvbiwgRXhwcmVzc2lvbj4KKwlpbXBsZW1lbnRzIEV4cHJlc3Npb25Db252ZXJ0ZXI8RXhwcmVzc2lvbj4KIHsKIAogCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIEV4cHJlc3Npb25Db252ZXJ0ZXI8RXhwcmVzc2lvbiwgRXhwcmVzc2lvbj4gSU5TVEFOQ0UgPSBuZXcgTnVsbEV4cHJlc3Npb25Db252ZXJ0ZXIoKTsKKwlwcml2YXRlIHN0YXRpYyBFeHByZXNzaW9uQ29udmVydGVyPEV4cHJlc3Npb24+IElOU1RBTkNFID0gbmV3IE51bGxFeHByZXNzaW9uQ29udmVydGVyKCk7CiAKIAkvKioKIAkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIEV4cHJlc3Npb25Db252ZXJ0ZXI8RXhwcmVzc2lvbiwgRXhwcmVzc2lvbj4gaW5zdGFuY2UoKSB7CisJcHVibGljIHN0YXRpYyBFeHByZXNzaW9uQ29udmVydGVyPEV4cHJlc3Npb24+IGluc3RhbmNlKCkgewogCQlpZiAoSU5TVEFOQ0UgPT0gbnVsbCkgewogCQkJSU5TVEFOQ0UgPSBuZXcgTnVsbEV4cHJlc3Npb25Db252ZXJ0ZXIoKTsKIAkJfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pkdHV0aWxpdHkvTnVtYmVyU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pkdHV0aWxpdHkvTnVtYmVyU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5qYXZhCmluZGV4IDBiMzEyZmIuLmVhZDJkYTkgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qZHR1dGlsaXR5L051bWJlclN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvamR0dXRpbGl0eS9OdW1iZXJTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmphdmEKQEAgLTEwLDcgKzEwLDcgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuamR0dXRpbGl0eTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk51bWJlckxpdGVyYWw7CiAKIC8qKgpAQCAtMTgsMTQgKzE4LDE0IEBACiAgKiAoZS5nLiAiNDgiKS4KICAqLwogcHVibGljIGZpbmFsIGNsYXNzIE51bWJlclN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIKLQlleHRlbmRzIEFic3RyYWN0RXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmcsIE51bWJlckxpdGVyYWw+CisJZXh0ZW5kcyBBYnN0cmFjdEV4cHJlc3Npb25Db252ZXJ0ZXI8U3RyaW5nPgogewotCXByaXZhdGUgc3RhdGljIEV4cHJlc3Npb25Db252ZXJ0ZXI8U3RyaW5nLCBOdW1iZXJMaXRlcmFsPiBJTlNUQU5DRTsKKwlwcml2YXRlIHN0YXRpYyBFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZz4gSU5TVEFOQ0U7CiAKIAkvKioKIAkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIEV4cHJlc3Npb25Db252ZXJ0ZXI8U3RyaW5nLCBOdW1iZXJMaXRlcmFsPiBpbnN0YW5jZSgpIHsKKwlwdWJsaWMgc3RhdGljIEV4cHJlc3Npb25Db252ZXJ0ZXI8U3RyaW5nPiBpbnN0YW5jZSgpIHsKIAkJaWYgKElOU1RBTkNFID09IG51bGwpIHsKIAkJCUlOU1RBTkNFID0gbmV3IE51bWJlclN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIoKTsKIAkJfQpAQCAtNDAsMTYgKzQwLDE0IEBACiAJfQogCQogCUBPdmVycmlkZQotCXByb3RlY3RlZCBOdW1iZXJMaXRlcmFsIGNvbnZlcnRfKFN0cmluZyBzdHJpbmcsIEFTVCBhc3QpIHsKKwlwcm90ZWN0ZWQgTnVtYmVyTGl0ZXJhbCBjb252ZXJ0T2JqZWN0KFN0cmluZyBzdHJpbmcsIEFTVCBhc3QpIHsKIAkJcmV0dXJuIGFzdC5uZXdOdW1iZXJMaXRlcmFsKHN0cmluZyk7CiAJfQogCiAJQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBjb252ZXJ0XyhOdW1iZXJMaXRlcmFsIG51bWJlckxpdGVyYWwpIHsKLQkJcmV0dXJuIChudW1iZXJMaXRlcmFsLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5OVU1CRVJfTElURVJBTCkgPwotCQkJbnVtYmVyTGl0ZXJhbC5nZXRUb2tlbigpCi0JCToKLQkJCW51bGw7CisJcHJvdGVjdGVkIFN0cmluZyBjb252ZXJ0RXhwcmVzc2lvbihFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKwkJT2JqZWN0IHZhbHVlID0gZXhwcmVzc2lvbi5yZXNvbHZlQ29uc3RhbnRFeHByZXNzaW9uVmFsdWUoKTsKKwkJcmV0dXJuICh2YWx1ZSBpbnN0YW5jZW9mIE51bWJlcikgPyAoKE51bWJlcikgdmFsdWUpLnRvU3RyaW5nKCkgOiBudWxsOwogCX0KIAogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pkdHV0aWxpdHkvUHJpbWl0aXZlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qZHR1dGlsaXR5L1ByaW1pdGl2ZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmphdmEKaW5kZXggNDlmNmQ5OS4uOTEwZDczNSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pkdHV0aWxpdHkvUHJpbWl0aXZlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvamR0dXRpbGl0eS9QcmltaXRpdmVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5qYXZhCkBAIC0xMSw2ICsxMSw3IEBACiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5QcmltaXRpdmVUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UeXBlTGl0ZXJhbDsKIApAQCAtMTksMTQgKzIwLDE0IEBACiAgKiAoZS5nLiAiaW50IikuCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBQcmltaXRpdmVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlcgotCWV4dGVuZHMgQWJzdHJhY3RFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZywgVHlwZUxpdGVyYWw+CisJZXh0ZW5kcyBBYnN0cmFjdEV4cHJlc3Npb25Db252ZXJ0ZXI8U3RyaW5nPgogewotCXByaXZhdGUgc3RhdGljIEV4cHJlc3Npb25Db252ZXJ0ZXI8U3RyaW5nLCBUeXBlTGl0ZXJhbD4gSU5TVEFOQ0U7CisJcHJpdmF0ZSBzdGF0aWMgRXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmc+IElOU1RBTkNFOwogCiAJLyoqCiAJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCiAJICovCi0JcHVibGljIHN0YXRpYyBFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZywgVHlwZUxpdGVyYWw+IGluc3RhbmNlKCkgeworCXB1YmxpYyBzdGF0aWMgRXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmc+IGluc3RhbmNlKCkgewogCQlpZiAoSU5TVEFOQ0UgPT0gbnVsbCkgewogCQkJSU5TVEFOQ0UgPSBuZXcgUHJpbWl0aXZlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIoKTsKIAkJfQpAQCAtNDEsNyArNDIsNyBAQAogCX0KIAogCUBPdmVycmlkZQotCXByb3RlY3RlZCBUeXBlTGl0ZXJhbCBjb252ZXJ0XyhTdHJpbmcgc3RyaW5nLCBBU1QgYXN0KSB7CisJcHJvdGVjdGVkIFR5cGVMaXRlcmFsIGNvbnZlcnRPYmplY3QoU3RyaW5nIHN0cmluZywgQVNUIGFzdCkgewogCQlvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHlwZSB0eXBlID0gYXN0Lm5ld1ByaW1pdGl2ZVR5cGUoUHJpbWl0aXZlVHlwZS50b0NvZGUoc3RyaW5nKSk7CiAJCVR5cGVMaXRlcmFsIHR5cGVMaXRlcmFsID0gYXN0Lm5ld1R5cGVMaXRlcmFsKCk7CiAJCXR5cGVMaXRlcmFsLnNldFR5cGUodHlwZSk7CkBAIC00OSw5ICs1MCw5IEBACiAJfQogCiAJQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBjb252ZXJ0XyhUeXBlTGl0ZXJhbCB0eXBlTGl0ZXJhbCkgewotCQlpZiAodHlwZUxpdGVyYWwuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLlRZUEVfTElURVJBTCkgewotCQkJb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGUgdHlwZSA9IHR5cGVMaXRlcmFsLmdldFR5cGUoKTsKKwlwcm90ZWN0ZWQgU3RyaW5nIGNvbnZlcnRFeHByZXNzaW9uKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworCQlpZiAoZXhwcmVzc2lvbi5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuVFlQRV9MSVRFUkFMKSB7CisJCQlvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHlwZSB0eXBlID0gKChUeXBlTGl0ZXJhbCkgZXhwcmVzc2lvbikuZ2V0VHlwZSgpOwogCQkJaWYgKHR5cGUuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLlBSSU1JVElWRV9UWVBFKSB7CiAJCQkJcmV0dXJuICgoUHJpbWl0aXZlVHlwZSkgdHlwZSkuZ2V0UHJpbWl0aXZlVHlwZUNvZGUoKS50b1N0cmluZygpOwogCQkJfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pkdHV0aWxpdHkvU2ltcGxlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qZHR1dGlsaXR5L1NpbXBsZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmphdmEKaW5kZXggNDM1NjZjYi4uZTU5NmEzMyAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pkdHV0aWxpdHkvU2ltcGxlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvamR0dXRpbGl0eS9TaW1wbGVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5qYXZhCkBAIC0xMSw2ICsxMSw3IEBACiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5OYW1lOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW1wbGVUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UeXBlTGl0ZXJhbDsKQEAgLTIwLDE0ICsyMSwxNCBAQAogICogKGUuZy4gImphdmEubGFuZy5PYmplY3QiKS4KICAqLwogcHVibGljIGZpbmFsIGNsYXNzIFNpbXBsZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyCi0JZXh0ZW5kcyBBYnN0cmFjdEV4cHJlc3Npb25Db252ZXJ0ZXI8U3RyaW5nLCBUeXBlTGl0ZXJhbD4KKwlleHRlbmRzIEFic3RyYWN0RXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmc+CiB7Ci0JcHJpdmF0ZSBzdGF0aWMgRXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmcsIFR5cGVMaXRlcmFsPiBJTlNUQU5DRTsKKwlwcml2YXRlIHN0YXRpYyBFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZz4gSU5TVEFOQ0U7CiAKIAkvKioKIAkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIEV4cHJlc3Npb25Db252ZXJ0ZXI8U3RyaW5nLCBUeXBlTGl0ZXJhbD4gaW5zdGFuY2UoKSB7CisJcHVibGljIHN0YXRpYyBFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZz4gaW5zdGFuY2UoKSB7CiAJCWlmIChJTlNUQU5DRSA9PSBudWxsKSB7CiAJCQlJTlNUQU5DRSA9IG5ldyBTaW1wbGVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlcigpOwogCQl9CkBAIC00Miw3ICs0Myw3IEBACiAJfQogCiAJQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFR5cGVMaXRlcmFsIGNvbnZlcnRfKFN0cmluZyBzdHJpbmcsIEFTVCBhc3QpIHsKKwlwcm90ZWN0ZWQgVHlwZUxpdGVyYWwgY29udmVydE9iamVjdChTdHJpbmcgc3RyaW5nLCBBU1QgYXN0KSB7CiAJCU5hbWUgbmFtZSA9IGFzdC5uZXdOYW1lKHN0cmluZyk7CiAJCW9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UeXBlIHR5cGUgPSBhc3QubmV3U2ltcGxlVHlwZShuYW1lKTsKIAkJVHlwZUxpdGVyYWwgdHlwZUxpdGVyYWwgPSBhc3QubmV3VHlwZUxpdGVyYWwoKTsKQEAgLTUxLDkgKzUyLDkgQEAKIAl9CiAKIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbnZlcnRfKFR5cGVMaXRlcmFsIHR5cGVMaXRlcmFsKSB7Ci0JCWlmICh0eXBlTGl0ZXJhbC5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuVFlQRV9MSVRFUkFMKSB7Ci0JCQlvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHlwZSB0eXBlID0gdHlwZUxpdGVyYWwuZ2V0VHlwZSgpOworCXByb3RlY3RlZCBTdHJpbmcgY29udmVydEV4cHJlc3Npb24oRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisJCWlmIChleHByZXNzaW9uLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5UWVBFX0xJVEVSQUwpIHsKKwkJCW9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UeXBlIHR5cGUgPSAoKFR5cGVMaXRlcmFsKSBleHByZXNzaW9uKS5nZXRUeXBlKCk7CiAJCQlpZiAodHlwZS5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuU0lNUExFX1RZUEUpIHsKIAkJCQlyZXR1cm4gKChTaW1wbGVUeXBlKSB0eXBlKS5nZXROYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7CiAJCQl9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvamR0dXRpbGl0eS9TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qZHR1dGlsaXR5L1N0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlci5qYXZhCmluZGV4IDA4ZjlmZTEuLjMxZDYxYWIgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qZHR1dGlsaXR5L1N0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlci5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qZHR1dGlsaXR5L1N0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlci5qYXZhCkBAIC0xMCwyNyArMTAsNTUgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuamR0dXRpbGl0eTsKIAogaW1wb3J0IGphdmEudXRpbC5MaXN0OworCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQXJyYXlJbml0aWFsaXplcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU3RyaW5nTGl0ZXJhbDsKIAogLyoqCiAgKiBDb252ZXJ0IGFuIGFycmF5IGluaXRpYWxpemVyIHRvL2Zyb20gYW4gYXJyYXkgb2Ygc3RyaW5ncyAoZS5nLiB7InRleHQwIiwgInRleHQxIn0pLgotICogRSBpcyB0aGUgdHlwZSBvZiB0aGUgZXhwcmVzc2lvbnMgdG8gYmUgZm91bmQgaW4gdGhlIGFycmF5IGluaXRpYWxpemVyLgorICogCisgKiBEbyBOT1QgdXNlIHRoaXMgY2xhc3MgZm9yIGNvbnZlcnRpbmcgYXJyYXkgaW5pdGlhbGl6ZXJzIGluIGFubm90YXRpb24gZWxlbWVudHMuCisgKiBKYXZhNSBoYXMgYSBiaXQgb2Ygc3ludGFjdGljIHN1Z2FyIHRoYXQgYWxsb3dzIGEgc2luZ2xlLWVsZW1lbnQgYXJyYXkKKyAqIGluaXRpYWxpemVyIHRvIG5vdCBoYXZlIGN1cmx5IGJyYWNlcy4gVGhpcyBjb252ZXJ0ZXIgd2lsbCByZXR1cm4gbnVsbCBpZiBpdCBlbmNvdW50ZXJzCisgKiBhbnl0aGluZyBvdGhlciB0aGFuIGFuIGFycmF5IGluaXRpYWxpemVyLgorICogCisgKiBJbnZhbGlkIGVudHJpZXMgaW4gdGhlIGFycmF5IGluaXRpYWxpemVyIHdpbGwgcmVzdWx0IGluIG51bGwgZWxlbWVudHMgaW4gdGhlCisgKiByZXN1bHRpbmcgc3RyaW5nIGFycmF5LiBUaGlzIGFsbG93cyBjbGllbnRzIHRvIG1hbmlwdWxhdGUgZWxlbWVudHMgYXQKKyAqIHRoZSBhcHByb3ByaWF0ZSBpbmRleC4KICAqLwotcHVibGljIGNsYXNzIFN0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlcjxFIGV4dGVuZHMgRXhwcmVzc2lvbj4KLQlleHRlbmRzIEFic3RyYWN0RXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmdbXSwgQXJyYXlJbml0aWFsaXplcj4KK3B1YmxpYyBjbGFzcyBTdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIKKwlleHRlbmRzIEFic3RyYWN0RXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmdbXT4KIHsKLQlwcml2YXRlIGZpbmFsIEV4cHJlc3Npb25Db252ZXJ0ZXI8U3RyaW5nLCBFPiBlbGVtZW50Q29udmVydGVyOworCXByaXZhdGUgZmluYWwgRXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmc+IGVsZW1lbnRDb252ZXJ0ZXI7CisJcHJpdmF0ZSBmaW5hbCBib29sZWFuIHJlbW92ZUFycmF5SW5pdGlhbGl6ZXJXaGVuRW1wdHk7CiAKLQlwdWJsaWMgU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyKEV4cHJlc3Npb25Db252ZXJ0ZXI8U3RyaW5nLCBFPiBlbGVtZW50Q29udmVydGVyKSB7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gRU1QVFlfU1RSSU5HX0FSUkFZID0gbmV3IFN0cmluZ1swXTsKKworCisJLyoqCisJICogVGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gcmVtb3ZlIHRoZSBhcnJheSBpbml0aWFsaXplciBpZiBpdCBpcyBlbXB0eS4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyKEV4cHJlc3Npb25Db252ZXJ0ZXI8U3RyaW5nPiBlbGVtZW50Q29udmVydGVyKSB7CisJCXRoaXMoZWxlbWVudENvbnZlcnRlciwgdHJ1ZSk7CisJfQorCisJcHVibGljIFN0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlcihFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZz4gZWxlbWVudENvbnZlcnRlciwgYm9vbGVhbiByZW1vdmVBcnJheUluaXRpYWxpemVyV2hlbkVtcHR5KSB7CiAJCXN1cGVyKCk7CiAJCXRoaXMuZWxlbWVudENvbnZlcnRlciA9IGVsZW1lbnRDb252ZXJ0ZXI7CisJCXRoaXMucmVtb3ZlQXJyYXlJbml0aWFsaXplcldoZW5FbXB0eSA9IHJlbW92ZUFycmF5SW5pdGlhbGl6ZXJXaGVuRW1wdHk7CiAJfQogCiAJQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEFycmF5SW5pdGlhbGl6ZXIgY29udmVydF8oU3RyaW5nW10gc3RyaW5ncywgQVNUIGFzdCkgeworCS8qCisJICogdGhpcyBtZXRob2QgaXMgJ3B1YmxpYycgc28gaXQgY2FuIGJlIGNhbGxlZCBieQorCSAqIEFubm90YXRpb25TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIKKwkgKi8KKwlwdWJsaWMgQXJyYXlJbml0aWFsaXplciBjb252ZXJ0T2JqZWN0KFN0cmluZ1tdIHN0cmluZ3MsIEFTVCBhc3QpIHsKKwkJaWYgKChzdHJpbmdzLmxlbmd0aCA9PSAwKSAmJiB0aGlzLnJlbW92ZUFycmF5SW5pdGlhbGl6ZXJXaGVuRW1wdHkpIHsKKwkJCXJldHVybiBudWxsOworCQl9CiAJCUFycmF5SW5pdGlhbGl6ZXIgYXJyYXlJbml0aWFsaXplciA9IGFzdC5uZXdBcnJheUluaXRpYWxpemVyKCk7CiAJCUxpc3Q8RXhwcmVzc2lvbj4gZXhwcmVzc2lvbnMgPSB0aGlzLmV4cHJlc3Npb25zKGFycmF5SW5pdGlhbGl6ZXIpOwogCQlmb3IgKFN0cmluZyBzdHJpbmcgOiBzdHJpbmdzKSB7CkBAIC00NCw5ICs3MiwyOSBAQAogCQlyZXR1cm4gYXJyYXlJbml0aWFsaXplci5leHByZXNzaW9ucygpOwogCX0KIAorCS8qCisJICogdGhpcyBtZXRob2QgaXMgJ3B1YmxpYycgc28gaXQgY2FuIGJlIGNhbGxlZCBieQorCSAqIEFubm90YXRpb25TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIKKwkgKi8KIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nW10gY29udmVydF8oQXJyYXlJbml0aWFsaXplciBhcnJheUluaXRpYWxpemVyKSB7Ci0JCUxpc3Q8RT4gZXhwcmVzc2lvbnMgPSB0aGlzLmRvd25jYXN0RXhwcmVzc2lvbnMoYXJyYXlJbml0aWFsaXplcik7CisJcHVibGljIFN0cmluZ1tdIGNvbnZlcnROdWxsKCkgeworCQlyZXR1cm4gRU1QVFlfU1RSSU5HX0FSUkFZOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmdbXSBjb252ZXJ0RXhwcmVzc2lvbihFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKwkJcmV0dXJuIChleHByZXNzaW9uLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5BUlJBWV9JTklUSUFMSVpFUikgPworCQkJCXRoaXMuY29udmVydEFycmF5SW5pdGlhbGl6ZXIoKEFycmF5SW5pdGlhbGl6ZXIpIGV4cHJlc3Npb24pCisJCQk6CisJCQkJRU1QVFlfU1RSSU5HX0FSUkFZOworCX0KKworCS8qCisJICogdGhpcyBtZXRob2QgaXMgJ3B1YmxpYycgc28gaXQgY2FuIGJlIGNhbGxlZCBieQorCSAqIEFubm90YXRpb25TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIKKwkgKi8KKwlwdWJsaWMgU3RyaW5nW10gY29udmVydEFycmF5SW5pdGlhbGl6ZXIoQXJyYXlJbml0aWFsaXplciBhcnJheUluaXRpYWxpemVyKSB7CisJCUxpc3Q8RXhwcmVzc2lvbj4gZXhwcmVzc2lvbnMgPSB0aGlzLmRvd25jYXN0RXhwcmVzc2lvbnMoYXJyYXlJbml0aWFsaXplcik7CiAJCWludCBsZW4gPSBleHByZXNzaW9ucy5zaXplKCk7CiAJCVN0cmluZ1tdIHN0cmluZ3MgPSBuZXcgU3RyaW5nW2xlbl07CiAJCWZvciAoaW50IGkgPSBsZW47IGktLSA+IDA7ICkgewpAQCAtNTYsMTYgKzEwNCw4IEBACiAJfQogCiAJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBMaXN0PEU+IGRvd25jYXN0RXhwcmVzc2lvbnMoQXJyYXlJbml0aWFsaXplciBhcnJheUluaXRpYWxpemVyKSB7CisJcHJpdmF0ZSBMaXN0PEV4cHJlc3Npb24+IGRvd25jYXN0RXhwcmVzc2lvbnMoQXJyYXlJbml0aWFsaXplciBhcnJheUluaXRpYWxpemVyKSB7CiAJCXJldHVybiBhcnJheUluaXRpYWxpemVyLmV4cHJlc3Npb25zKCk7CiAJfQogCi0JLyoqCi0JICogQnVpbGQgYW4gZXhwcmVzc2lvbiBjb252ZXJ0ZXIgZm9yIGFuIGFubm90YXRpb24gZWxlbWVudCBvZiB0eXBlIFN0cmluZ1tdLgotCSAqICAgICBARm9vKGJhcj17InRleHQwIiwgInRleHQxIn0pCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXI8U3RyaW5nTGl0ZXJhbD4gZm9yU3RyaW5nTGl0ZXJhbHMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZ0xpdGVyYWw+KFN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvamR0dXRpbGl0eS9TdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvamR0dXRpbGl0eS9TdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmphdmEKaW5kZXggNDQ0NjUwZi4uOTU2MGNhMiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pkdHV0aWxpdHkvU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qZHR1dGlsaXR5L1N0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuamF2YQpAQCAtMTAsMjEgKzEwLDIxIEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHk7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TdHJpbmdMaXRlcmFsOwogCiAvKioKICAqIENvbnZlcnQgYSBzdHJpbmcgbGl0ZXJhbCB0by9mcm9tIGEgc3RyaW5nIChlLmcuICJ0ZXh0IikuCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyCi0JZXh0ZW5kcyBBYnN0cmFjdEV4cHJlc3Npb25Db252ZXJ0ZXI8U3RyaW5nLCBTdHJpbmdMaXRlcmFsPgorCWV4dGVuZHMgQWJzdHJhY3RFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZz4KIHsKLQlwcml2YXRlIHN0YXRpYyBFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZywgU3RyaW5nTGl0ZXJhbD4gSU5TVEFOQ0U7CisJcHJpdmF0ZSBzdGF0aWMgRXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmc+IElOU1RBTkNFOwogCiAJLyoqCiAJICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCiAJICovCi0JcHVibGljIHN0YXRpYyBFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZywgU3RyaW5nTGl0ZXJhbD4gaW5zdGFuY2UoKSB7CisJcHVibGljIHN0YXRpYyBFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZz4gaW5zdGFuY2UoKSB7CiAJCWlmIChJTlNUQU5DRSA9PSBudWxsKSB7CiAJCQlJTlNUQU5DRSA9IG5ldyBTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyKCk7CiAJCX0KQEAgLTM5LDE4ICszOSwxNiBAQAogCX0KIAogCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmdMaXRlcmFsIGNvbnZlcnRfKFN0cmluZyBzdHJpbmcsIEFTVCBhc3QpIHsKKwlwcm90ZWN0ZWQgU3RyaW5nTGl0ZXJhbCBjb252ZXJ0T2JqZWN0KFN0cmluZyBzdHJpbmcsIEFTVCBhc3QpIHsKIAkJU3RyaW5nTGl0ZXJhbCBzdHJpbmdMaXRlcmFsID0gYXN0Lm5ld1N0cmluZ0xpdGVyYWwoKTsKIAkJc3RyaW5nTGl0ZXJhbC5zZXRMaXRlcmFsVmFsdWUoc3RyaW5nKTsKIAkJcmV0dXJuIHN0cmluZ0xpdGVyYWw7CiAJfQogCiAJQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBjb252ZXJ0XyhTdHJpbmdMaXRlcmFsIHN0cmluZ0xpdGVyYWwpIHsKLQkJcmV0dXJuIChzdHJpbmdMaXRlcmFsLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5TVFJJTkdfTElURVJBTCkgPwotCQkJc3RyaW5nTGl0ZXJhbC5nZXRMaXRlcmFsVmFsdWUoKQotCQk6Ci0JCQludWxsOworCXByb3RlY3RlZCBTdHJpbmcgY29udmVydEV4cHJlc3Npb24oRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisJCU9iamVjdCB2YWx1ZSA9IGV4cHJlc3Npb24ucmVzb2x2ZUNvbnN0YW50RXhwcmVzc2lvblZhbHVlKCk7CisJCXJldHVybiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpID8gKFN0cmluZykgdmFsdWUgOiBudWxsOwogCX0KIAogfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pkdHV0aWxpdHkvVHlwZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL2pkdHV0aWxpdHkvVHlwZS5qYXZhCmluZGV4IDY1ZjAxOGUuLmI3MjFmNGYgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9qZHR1dGlsaXR5L1R5cGUuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvamR0dXRpbGl0eS9UeXBlLmphdmEKQEAgLTEwLDE3ICsxMCwyMCBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qZHR1dGlsaXR5OwogCiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5GbGFnczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFic3RyYWN0VHlwZURlY2xhcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklUeXBlQmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHlwZURlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbW1hbmRFeGVjdXRvclByb3ZpZGVyOwogCiBwdWJsaWMgY2xhc3MgVHlwZSBleHRlbmRzIE1lbWJlciB7CiAKLQlwdWJsaWMgVHlwZShJVHlwZSB0eXBlKSB7Ci0JCXN1cGVyKHR5cGUpOworCXB1YmxpYyBUeXBlKElUeXBlIHR5cGUsIENvbW1hbmRFeGVjdXRvclByb3ZpZGVyIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yUHJvdmlkZXIpIHsKKwkJc3VwZXIodHlwZSwgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3JQcm92aWRlcik7CiAJfQogCiAJQE92ZXJyaWRlCkBAIC0yOCwxMSArMzEsNiBAQAogCQlyZXR1cm4gKElUeXBlKSBzdXBlci5nZXRKZHRNZW1iZXIoKTsKIAl9CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVHlwZURlY2xhcmF0aW9uIGJvZHlEZWNsYXJhdGlvbigpIHsKLQkJcmV0dXJuIChUeXBlRGVjbGFyYXRpb24pIHN1cGVyLmJvZHlEZWNsYXJhdGlvbigpOwotCX0KLQogCXB1YmxpYyBib29sZWFuIGlzQWJzdHJhY3QoKSB7CiAJCXRyeSB7CiAJCQlyZXR1cm4gRmxhZ3MuaXNBYnN0cmFjdCh0aGlzLmdldEpkdE1lbWJlcigpLmdldEZsYWdzKCkpOwpAQCAtNTEsNiArNDksMTAgQEAKIAl9CiAKIAorCXB1YmxpYyBJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKKwkJcmV0dXJuIGJvZHlEZWNsYXJhdGlvbihhc3RSb290KS5yZXNvbHZlQmluZGluZygpOworCX0KKwogCS8vICoqKioqKioqKiogTWVtYmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKIAogCUBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL21hcHBpbmdzL0lDb2x1bW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9tYXBwaW5ncy9JQ29sdW1uLmphdmEKaW5kZXggYWFmODQ2Ny4uOWFiYmM4ZiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL21hcHBpbmdzL0lDb2x1bW4uamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvbWFwcGluZ3MvSUNvbHVtbi5qYXZhCkBAIC0yMCw4ICsyMCwxMSBAQAogICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgogICogPHVsPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklDb2x1bW4jZ2V0TGVuZ3RoIDxlbT5MZW5ndGg8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklDb2x1bW4jZ2V0U3BlY2lmaWVkTGVuZ3RoIDxlbT5TcGVjaWZpZWQgTGVuZ3RoPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JQ29sdW1uI2dldFByZWNpc2lvbiA8ZW0+UHJlY2lzaW9uPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JQ29sdW1uI2dldFNwZWNpZmllZFByZWNpc2lvbiA8ZW0+U3BlY2lmaWVkIFByZWNpc2lvbjwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSUNvbHVtbiNnZXRTY2FsZSA8ZW0+U2NhbGU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklDb2x1bW4jZ2V0U3BlY2lmaWVkU2NhbGUgPGVtPlNwZWNpZmllZCBTY2FsZTwvZW0+fTwvbGk+CiAgKiA8L3VsPgogICogPC9wPgogICoKQEAgLTMxLDkgKzM0LDE0IEBACiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSUNvbHVtbiBleHRlbmRzIElBYnN0cmFjdENvbHVtbgogeworCWludCBERUZBVUxUX0xFTkdUSCA9IDI1NTsKKworCWludCBERUZBVUxUX1BSRUNJU0lPTiA9IDA7CisKKwlpbnQgREVGQVVMVF9TQ0FMRSA9IDA7CisKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MZW5ndGg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iMjU1IjwvY29kZT4uCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8cD4KIAkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5MZW5ndGg8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLApAQCAtNDEsMjIgKzQ5LDM4IEBACiAJICogPC9wPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxlbmd0aDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TGVuZ3RoKGludCkKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLkpwYUNvcmVNYXBwaW5nc1BhY2thZ2UjZ2V0SUNvbHVtbl9MZW5ndGgoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIyNTUiCisJICogQG1vZGVsIGNoYW5nZWFibGU9ImZhbHNlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKIAkgKiBAZ2VuZXJhdGVkCiAJICovCiAJaW50IGdldExlbmd0aCgpOwogCiAJLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSUNvbHVtbiNnZXRMZW5ndGggPGVtPkxlbmd0aDwvZW0+fScgYXR0cmlidXRlLgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNwZWNpZmllZCBMZW5ndGg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iLTEiPC9jb2RlPi4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNwZWNpZmllZCBMZW5ndGg8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGVuZ3RoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRMZW5ndGgoKQorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNwZWNpZmllZCBMZW5ndGg8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldFNwZWNpZmllZExlbmd0aChpbnQpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5KcGFDb3JlTWFwcGluZ3NQYWNrYWdlI2dldElDb2x1bW5fU3BlY2lmaWVkTGVuZ3RoKCkKKwkgKiBAbW9kZWwgZGVmYXVsdD0iLTEiCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXZvaWQgc2V0TGVuZ3RoKGludCB2YWx1ZSk7CisJaW50IGdldFNwZWNpZmllZExlbmd0aCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSUNvbHVtbiNnZXRTcGVjaWZpZWRMZW5ndGggPGVtPlNwZWNpZmllZCBMZW5ndGg8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNwZWNpZmllZCBMZW5ndGg8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldFNwZWNpZmllZExlbmd0aCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0U3BlY2lmaWVkTGVuZ3RoKGludCB2YWx1ZSk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmVjaXNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KQEAgLTY3LDIyICs5MSwzOCBAQAogCSAqIDwvcD4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVjaXNpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFByZWNpc2lvbihpbnQpCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5KcGFDb3JlTWFwcGluZ3NQYWNrYWdlI2dldElDb2x1bW5fUHJlY2lzaW9uKCkKLQkgKiBAbW9kZWwKKwkgKiBAbW9kZWwgY2hhbmdlYWJsZT0iZmFsc2UiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KIAlpbnQgZ2V0UHJlY2lzaW9uKCk7CiAKIAkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JQ29sdW1uI2dldFByZWNpc2lvbiA8ZW0+UHJlY2lzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3BlY2lmaWVkIFByZWNpc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiItMSI8L2NvZGU+LgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3BlY2lmaWVkIFByZWNpc2lvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVjaXNpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFByZWNpc2lvbigpCisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3BlY2lmaWVkIFByZWNpc2lvbjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0U3BlY2lmaWVkUHJlY2lzaW9uKGludCkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLkpwYUNvcmVNYXBwaW5nc1BhY2thZ2UjZ2V0SUNvbHVtbl9TcGVjaWZpZWRQcmVjaXNpb24oKQorCSAqIEBtb2RlbCBkZWZhdWx0PSItMSIKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0Jdm9pZCBzZXRQcmVjaXNpb24oaW50IHZhbHVlKTsKKwlpbnQgZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JQ29sdW1uI2dldFNwZWNpZmllZFByZWNpc2lvbiA8ZW0+U3BlY2lmaWVkIFByZWNpc2lvbjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3BlY2lmaWVkIFByZWNpc2lvbjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRTcGVjaWZpZWRQcmVjaXNpb24oaW50IHZhbHVlKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNjYWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCkBAIC05MywyMiArMTMzLDYyIEBACiAJICogPC9wPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNjYWxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTY2FsZShpbnQpCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5KcGFDb3JlTWFwcGluZ3NQYWNrYWdlI2dldElDb2x1bW5fU2NhbGUoKQotCSAqIEBtb2RlbAorCSAqIEBtb2RlbCBjaGFuZ2VhYmxlPSJmYWxzZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCiAJICogQGdlbmVyYXRlZAogCSAqLwogCWludCBnZXRTY2FsZSgpOwogCiAJLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSUNvbHVtbiNnZXRTY2FsZSA8ZW0+U2NhbGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TcGVjaWZpZWQgU2NhbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iLTEiPC9jb2RlPi4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNwZWNpZmllZCBTY2FsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TY2FsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U2NhbGUoKQorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNwZWNpZmllZCBTY2FsZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0U3BlY2lmaWVkU2NhbGUoaW50KQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSnBhQ29yZU1hcHBpbmdzUGFja2FnZSNnZXRJQ29sdW1uX1NwZWNpZmllZFNjYWxlKCkKKwkgKiBAbW9kZWwgZGVmYXVsdD0iLTEiCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXZvaWQgc2V0U2NhbGUoaW50IHZhbHVlKTsKKwlpbnQgZ2V0U3BlY2lmaWVkU2NhbGUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklDb2x1bW4jZ2V0U3BlY2lmaWVkU2NhbGUgPGVtPlNwZWNpZmllZCBTY2FsZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3BlY2lmaWVkIFNjYWxlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRTcGVjaWZpZWRTY2FsZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0U3BlY2lmaWVkU2NhbGUoaW50IHZhbHVlKTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQG1vZGVsIGtpbmQ9Im9wZXJhdGlvbiIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IGdldERlZmF1bHRMZW5ndGgoKTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQG1vZGVsIGtpbmQ9Im9wZXJhdGlvbiIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IGdldERlZmF1bHRQcmVjaXNpb24oKTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQG1vZGVsIGtpbmQ9Im9wZXJhdGlvbiIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IGdldERlZmF1bHRTY2FsZSgpOwogCiAJdm9pZCByZWZyZXNoRGVmYXVsdHMoRGVmYXVsdHNDb250ZXh0IGRlZmF1bHRzQ29udGV4dCk7CiAKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9tYXBwaW5ncy9JUmVsYXRpb25zaGlwTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL21hcHBpbmdzL0lSZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEKaW5kZXggM2I3NTc5Ny4uZjFkYTEyNyAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL21hcHBpbmdzL0lSZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL21hcHBpbmdzL0lSZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEKQEAgLTksNiArOSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5nczsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSUF0dHJpYnV0ZU1hcHBpbmc7CiAKIC8qKgpAQCAtMTUxLDcgKzE1Miw3IEBACiAJICogYXMgZnVsbHkgcXVhbGlmaWVkIHRoZW4ganVzdCByZXR1cm4gdGhhdC4KIAkgKiBAcmV0dXJuCiAJICovCi0JU3RyaW5nIGZ1bGx5UXVhbGlmaWVkVGFyZ2V0RW50aXR5KCk7CisJU3RyaW5nIGZ1bGx5UXVhbGlmaWVkVGFyZ2V0RW50aXR5KENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKIAogCS8qKgogCSAqIFJldHVybiB0aGUgRW50aXR5IHRoYXQgb3ducyB0aGlzIHJlbGF0aW9uc2hpcCBtYXBwaW5nCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvbWFwcGluZ3MvSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL21hcHBpbmdzL0pwYUNvcmVNYXBwaW5nc1BhY2thZ2UuamF2YQppbmRleCAzNWViMjM2Li4yY2Q4YzA4IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvbWFwcGluZ3MvSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9tYXBwaW5ncy9KcGFDb3JlTWFwcGluZ3NQYWNrYWdlLmphdmEKQEAgLTgyNywxMyArODI3LDMxIEBACiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUNPTFVNTl9fTEVOR1RIID0gSUFCU1RSQUNUX0NPTFVNTl9GRUFUVVJFX0NPVU5UICsgMDsKIAogCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TcGVjaWZpZWQgTGVuZ3RoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJQ09MVU1OX19TUEVDSUZJRURfTEVOR1RIID0gSUFCU1RSQUNUX0NPTFVNTl9GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVjaXNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElDT0xVTU5fX1BSRUNJU0lPTiA9IElBQlNUUkFDVF9DT0xVTU5fRkVBVFVSRV9DT1VOVCArIDE7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUNPTFVNTl9fUFJFQ0lTSU9OID0gSUFCU1RSQUNUX0NPTFVNTl9GRUFUVVJFX0NPVU5UICsgMjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TcGVjaWZpZWQgUHJlY2lzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJQ09MVU1OX19TUEVDSUZJRURfUFJFQ0lTSU9OID0gSUFCU1RSQUNUX0NPTFVNTl9GRUFUVVJFX0NPVU5UICsgMzsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TY2FsZTwvYj48L2VtPicgYXR0cmlidXRlLgpAQCAtODQyLDcgKzg2MCwxNiBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElDT0xVTU5fX1NDQUxFID0gSUFCU1RSQUNUX0NPTFVNTl9GRUFUVVJFX0NPVU5UICsgMjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJQ09MVU1OX19TQ0FMRSA9IElBQlNUUkFDVF9DT0xVTU5fRkVBVFVSRV9DT1VOVCArIDQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3BlY2lmaWVkIFNjYWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJQ09MVU1OX19TUEVDSUZJRURfU0NBTEUgPSBJQUJTVFJBQ1RfQ09MVU1OX0ZFQVRVUkVfQ09VTlQgKyA1OwogCiAJLyoqCiAJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPklDb2x1bW48L2VtPicgY2xhc3MuCkBAIC04NTEsNyArODc4LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJQ09MVU1OX0ZFQVRVUkVfQ09VTlQgPSBJQUJTVFJBQ1RfQ09MVU1OX0ZFQVRVUkVfQ09VTlQgKyAzOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElDT0xVTU5fRkVBVFVSRV9DT1VOVCA9IElBQlNUUkFDVF9DT0xVTU5fRkVBVFVSRV9DT1VOVCArIDY7CiAKIAkvKioKIAkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklDb2x1bW5NYXBwaW5nIDxlbT5JQ29sdW1uIE1hcHBpbmc8L2VtPn0nIGNsYXNzLgpAQCAtNDczMyw2ICs0NzYwLDE5IEBACiAJfQogCiAJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JQ29sdW1uI2dldFNwZWNpZmllZExlbmd0aCA8ZW0+U3BlY2lmaWVkIExlbmd0aDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNwZWNpZmllZCBMZW5ndGg8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JQ29sdW1uI2dldFNwZWNpZmllZExlbmd0aCgpCisJICogQHNlZSAjZ2V0SUNvbHVtbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldElDb2x1bW5fU3BlY2lmaWVkTGVuZ3RoKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGlDb2x1bW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKwkvKioKIAkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklDb2x1bW4jZ2V0UHJlY2lzaW9uIDxlbT5QcmVjaXNpb248L2VtPn0nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC00NzQyLDcgKzQ3ODIsMjAgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCiAJcHVibGljIEVBdHRyaWJ1dGUgZ2V0SUNvbHVtbl9QcmVjaXNpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgaUNvbHVtbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGlDb2x1bW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklDb2x1bW4jZ2V0U3BlY2lmaWVkUHJlY2lzaW9uIDxlbT5TcGVjaWZpZWQgUHJlY2lzaW9uPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3BlY2lmaWVkIFByZWNpc2lvbjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklDb2x1bW4jZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCkKKwkgKiBAc2VlICNnZXRJQ29sdW1uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0SUNvbHVtbl9TcGVjaWZpZWRQcmVjaXNpb24oKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSkgaUNvbHVtbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwogCX0KIAogCS8qKgpAQCAtNDc1NSw3ICs0ODA4LDIwIEBACiAJICogQGdlbmVyYXRlZAogCSAqLwogCXB1YmxpYyBFQXR0cmlidXRlIGdldElDb2x1bW5fU2NhbGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgaUNvbHVtbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGlDb2x1bW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklDb2x1bW4jZ2V0U3BlY2lmaWVkU2NhbGUgPGVtPlNwZWNpZmllZCBTY2FsZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNwZWNpZmllZCBTY2FsZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklDb2x1bW4jZ2V0U3BlY2lmaWVkU2NhbGUoKQorCSAqIEBzZWUgI2dldElDb2x1bW4oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJQ29sdW1uX1NwZWNpZmllZFNjYWxlKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGlDb2x1bW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKIAl9CiAKIAkvKioKQEAgLTY1OTQsOCArNjY2MCwxMSBAQAogCQljcmVhdGVFQXR0cmlidXRlKGlBYnN0cmFjdENvbHVtbkVDbGFzcywgSUFCU1RSQUNUX0NPTFVNTl9fREVGQVVMVF9UQUJMRSk7CiAJCWlDb2x1bW5FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSUNPTFVNTik7CiAJCWNyZWF0ZUVBdHRyaWJ1dGUoaUNvbHVtbkVDbGFzcywgSUNPTFVNTl9fTEVOR1RIKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShpQ29sdW1uRUNsYXNzLCBJQ09MVU1OX19TUEVDSUZJRURfTEVOR1RIKTsKIAkJY3JlYXRlRUF0dHJpYnV0ZShpQ29sdW1uRUNsYXNzLCBJQ09MVU1OX19QUkVDSVNJT04pOworCQljcmVhdGVFQXR0cmlidXRlKGlDb2x1bW5FQ2xhc3MsIElDT0xVTU5fX1NQRUNJRklFRF9QUkVDSVNJT04pOwogCQljcmVhdGVFQXR0cmlidXRlKGlDb2x1bW5FQ2xhc3MsIElDT0xVTU5fX1NDQUxFKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShpQ29sdW1uRUNsYXNzLCBJQ09MVU1OX19TUEVDSUZJRURfU0NBTEUpOwogCQlpQ29sdW1uTWFwcGluZ0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJQ09MVU1OX01BUFBJTkcpOwogCQlpQmFzaWNFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSUJBU0lDKTsKIAkJY3JlYXRlRUF0dHJpYnV0ZShpQmFzaWNFQ2xhc3MsIElCQVNJQ19fRkVUQ0gpOwpAQCAtNjg3Miw5ICs2OTQxLDE1IEBACiAJCWluaXRFQXR0cmlidXRlKGdldElBYnN0cmFjdENvbHVtbl9TcGVjaWZpZWRUYWJsZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAic3BlY2lmaWVkVGFibGUiLCBudWxsLCAwLCAxLCBJQWJzdHJhY3RDb2x1bW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CiAJCWluaXRFQXR0cmlidXRlKGdldElBYnN0cmFjdENvbHVtbl9EZWZhdWx0VGFibGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRlZmF1bHRUYWJsZSIsIG51bGwsIDAsIDEsIElBYnN0cmFjdENvbHVtbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCAhSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CiAJCWluaXRFQ2xhc3MoaUNvbHVtbkVDbGFzcywgSUNvbHVtbi5jbGFzcywgIklDb2x1bW4iLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRJQ29sdW1uX0xlbmd0aCgpLCBlY29yZVBhY2thZ2UuZ2V0RUludCgpLCAibGVuZ3RoIiwgIjI1NSIsIDAsIDEsIElDb2x1bW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldElDb2x1bW5fUHJlY2lzaW9uKCksIGVjb3JlUGFja2FnZS5nZXRFSW50KCksICJwcmVjaXNpb24iLCBudWxsLCAwLCAxLCBJQ29sdW1uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRJQ29sdW1uX1NjYWxlKCksIGVjb3JlUGFja2FnZS5nZXRFSW50KCksICJzY2FsZSIsIG51bGwsIDAsIDEsIElDb2x1bW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFQXR0cmlidXRlKGdldElDb2x1bW5fTGVuZ3RoKCksIGVjb3JlUGFja2FnZS5nZXRFSW50KCksICJsZW5ndGgiLCBudWxsLCAwLCAxLCBJQ29sdW1uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgIUlTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFQXR0cmlidXRlKGdldElDb2x1bW5fU3BlY2lmaWVkTGVuZ3RoKCksIHRoZUVjb3JlUGFja2FnZS5nZXRFSW50KCksICJzcGVjaWZpZWRMZW5ndGgiLCAiLTEiLCAwLCAxLCBJQ29sdW1uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXRJQ29sdW1uX1ByZWNpc2lvbigpLCBlY29yZVBhY2thZ2UuZ2V0RUludCgpLCAicHJlY2lzaW9uIiwgbnVsbCwgMCwgMSwgSUNvbHVtbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsICFJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXRJQ29sdW1uX1NwZWNpZmllZFByZWNpc2lvbigpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RUludCgpLCAic3BlY2lmaWVkUHJlY2lzaW9uIiwgIi0xIiwgMCwgMSwgSUNvbHVtbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0SUNvbHVtbl9TY2FsZSgpLCBlY29yZVBhY2thZ2UuZ2V0RUludCgpLCAic2NhbGUiLCBudWxsLCAwLCAxLCBJQ29sdW1uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgIUlTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFQXR0cmlidXRlKGdldElDb2x1bW5fU3BlY2lmaWVkU2NhbGUoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVJbnQoKSwgInNwZWNpZmllZFNjYWxlIiwgIi0xIiwgMCwgMSwgSUNvbHVtbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJYWRkRU9wZXJhdGlvbihpQ29sdW1uRUNsYXNzLCB0aGVFY29yZVBhY2thZ2UuZ2V0RUludCgpLCAiZ2V0RGVmYXVsdExlbmd0aCIsIDAsIDEsIElTX1VOSVFVRSwgSVNfT1JERVJFRCk7CisJCWFkZEVPcGVyYXRpb24oaUNvbHVtbkVDbGFzcywgdGhlRWNvcmVQYWNrYWdlLmdldEVJbnQoKSwgImdldERlZmF1bHRQcmVjaXNpb24iLCAwLCAxLCBJU19VTklRVUUsIElTX09SREVSRUQpOworCQlhZGRFT3BlcmF0aW9uKGlDb2x1bW5FQ2xhc3MsIHRoZUVjb3JlUGFja2FnZS5nZXRFSW50KCksICJnZXREZWZhdWx0U2NhbGUiLCAwLCAxLCBJU19VTklRVUUsIElTX09SREVSRUQpOwogCQlpbml0RUNsYXNzKGlDb2x1bW5NYXBwaW5nRUNsYXNzLCBJQ29sdW1uTWFwcGluZy5jbGFzcywgIklDb2x1bW5NYXBwaW5nIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKIAkJYWRkRU9wZXJhdGlvbihpQ29sdW1uTWFwcGluZ0VDbGFzcywgdGhpcy5nZXRJQ29sdW1uKCksICJnZXRDb2x1bW4iLCAwLCAxLCBJU19VTklRVUUsIElTX09SREVSRUQpOwogCQlpbml0RUNsYXNzKGlCYXNpY0VDbGFzcywgSUJhc2ljLmNsYXNzLCAiSUJhc2ljIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKQEAgLTc1MzMsNiArNzYwOCwxNCBAQAogCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgSUNPTFVNTl9fTEVOR1RIID0gZUlOU1RBTkNFLmdldElDb2x1bW5fTGVuZ3RoKCk7CiAKIAkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TcGVjaWZpZWQgTGVuZ3RoPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBJQ09MVU1OX19TUEVDSUZJRURfTEVOR1RIID0gZUlOU1RBTkNFLmdldElDb2x1bW5fU3BlY2lmaWVkTGVuZ3RoKCk7CisKKwkJLyoqCiAJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QcmVjaXNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgogCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTc1NDEsNiArNzYyNCwxNCBAQAogCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgSUNPTFVNTl9fUFJFQ0lTSU9OID0gZUlOU1RBTkNFLmdldElDb2x1bW5fUHJlY2lzaW9uKCk7CiAKIAkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TcGVjaWZpZWQgUHJlY2lzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBJQ09MVU1OX19TUEVDSUZJRURfUFJFQ0lTSU9OID0gZUlOU1RBTkNFLmdldElDb2x1bW5fU3BlY2lmaWVkUHJlY2lzaW9uKCk7CisKKwkJLyoqCiAJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TY2FsZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCiAJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtNzU0OSw2ICs3NjQwLDE0IEBACiAJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBJQ09MVU1OX19TQ0FMRSA9IGVJTlNUQU5DRS5nZXRJQ29sdW1uX1NjYWxlKCk7CiAKIAkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TcGVjaWZpZWQgU2NhbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIElDT0xVTU5fX1NQRUNJRklFRF9TQ0FMRSA9IGVJTlNUQU5DRS5nZXRJQ29sdW1uX1NwZWNpZmllZFNjYWxlKCk7CisKKwkJLyoqCiAJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JQ29sdW1uTWFwcGluZyA8ZW0+SUNvbHVtbiBNYXBwaW5nPC9lbT59JyBjbGFzcy4KIAkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcGxhdGZvcm0vQWJzdHJhY3RKb2luQ29sdW1uQ29udGV4dC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3BsYXRmb3JtL0Fic3RyYWN0Sm9pbkNvbHVtbkNvbnRleHQuamF2YQppbmRleCAzZjI2NmY0Li5kYWUxOWI4IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcGxhdGZvcm0vQWJzdHJhY3RKb2luQ29sdW1uQ29udGV4dC5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9wbGF0Zm9ybS9BYnN0cmFjdEpvaW5Db2x1bW5Db250ZXh0LmphdmEKQEAgLTgsNyArOCw2IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucGxhdGZvcm07CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JUGVyc2lzdGVudFR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSUFic3RyYWN0Sm9pbkNvbHVtbjsKIAogcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Sm9pbkNvbHVtbkNvbnRleHQ8RSBleHRlbmRzIElBYnN0cmFjdEpvaW5Db2x1bW4+IGV4dGVuZHMgQmFzZUNvbnRleHQKQEAgLTMxLDggKzMwLDggQEAKIAkJdGhpcy5jb2x1bW4ucmVmcmVzaERlZmF1bHRzKHdyYXBEZWZhdWx0c0NvbnRleHQoZGVmYXVsdHNDb250ZXh0KSk7CiAJfQogCQotCXB1YmxpYyBEZWZhdWx0c0NvbnRleHQgd3JhcERlZmF1bHRzQ29udGV4dChmaW5hbCBEZWZhdWx0c0NvbnRleHQgZGVmYXVsdHNDb250ZXh0KSB7Ci0JCXJldHVybiBuZXcgRGVmYXVsdHNDb250ZXh0KCkgeworCXB1YmxpYyBEZWZhdWx0c0NvbnRleHQgd3JhcERlZmF1bHRzQ29udGV4dChEZWZhdWx0c0NvbnRleHQgZGVmYXVsdHNDb250ZXh0KSB7CisJCXJldHVybiBuZXcgRGVmYXVsdHNDb250ZXh0V3JhcHBlcihkZWZhdWx0c0NvbnRleHQpIHsKIAkJCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdChTdHJpbmcga2V5KSB7CiAJCQkJaWYgKGtleS5lcXVhbHMoQmFzZUpwYVBsYXRmb3JtLkRFRkFVTFRfSk9JTl9DT0xVTU5fTkFNRV9LRVkpKSB7CiAJCQkJCXJldHVybiBidWlsZERlZmF1bHROYW1lKCk7CkBAIC00MCwxMSArMzksNyBAQAogCQkJCWlmIChrZXkuZXF1YWxzKEJhc2VKcGFQbGF0Zm9ybS5ERUZBVUxUX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfS0VZKSkgewogCQkJCQlyZXR1cm4gYnVpbGREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKTsKIAkJCQl9Ci0JCQkJcmV0dXJuIGRlZmF1bHRzQ29udGV4dC5nZXREZWZhdWx0KGtleSk7Ci0JCQl9Ci0JCQotCQkJcHVibGljIElQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZShTdHJpbmcgZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSkgewotCQkJCXJldHVybiBkZWZhdWx0c0NvbnRleHQucGVyc2lzdGVudFR5cGUoZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSk7CisJCQkJcmV0dXJuIHN1cGVyLmdldERlZmF1bHQoa2V5KTsKIAkJCX0KIAkJfTsKIAl9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcGxhdGZvcm0vQXR0cmlidXRlT3ZlcnJpZGVDb250ZXh0LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcGxhdGZvcm0vQXR0cmlidXRlT3ZlcnJpZGVDb250ZXh0LmphdmEKaW5kZXggOGQxNWMwMy4uMDI2MTJiYiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3BsYXRmb3JtL0F0dHJpYnV0ZU92ZXJyaWRlQ29udGV4dC5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9wbGF0Zm9ybS9BdHRyaWJ1dGVPdmVycmlkZUNvbnRleHQuamF2YQpAQCAtOSw3ICs5LDYgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucGxhdGZvcm07CiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JUGVyc2lzdGVudFR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSVR5cGVNYXBwaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklBdHRyaWJ1dGVPdmVycmlkZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JQ29sdW1uOwpAQCAtMzcsMTIgKzM2LDggQEAKIAkJcmV0dXJuIG5ldyBDb2x1bW5Db250ZXh0KHRoaXMsIHRoaXMuYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkpOwogCX0KIAkKLQlwdWJsaWMgRGVmYXVsdHNDb250ZXh0IHdyYXBEZWZhdWx0c0NvbnRleHQoZmluYWwgRGVmYXVsdHNDb250ZXh0IGRlZmF1bHRzQ29udGV4dCkgewotCQlyZXR1cm4gbmV3IERlZmF1bHRzQ29udGV4dCgpIHsKLQkJCXB1YmxpYyBJUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUoU3RyaW5nIGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUpIHsKLQkJCQlyZXR1cm4gZGVmYXVsdHNDb250ZXh0LnBlcnNpc3RlbnRUeXBlKGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUpOwotCQkJfQotCQkKKwlwdWJsaWMgRGVmYXVsdHNDb250ZXh0IHdyYXBEZWZhdWx0c0NvbnRleHQoRGVmYXVsdHNDb250ZXh0IGRlZmF1bHRzQ29udGV4dCkgeworCQlyZXR1cm4gbmV3IERlZmF1bHRzQ29udGV4dFdyYXBwZXIoZGVmYXVsdHNDb250ZXh0KSB7CQogCQkJcHVibGljIE9iamVjdCBnZXREZWZhdWx0KFN0cmluZyBrZXkpIHsKIAkJCQlpZiAoa2V5LmVxdWFscyhCYXNlSnBhUGxhdGZvcm0uREVGQVVMVF9DT0xVTU5fTkFNRV9LRVkpKSB7CiAJCQkJCXJldHVybiBidWlsZERlZmF1bHRDb2x1bW5OYW1lKCk7CkBAIC01NCw3ICs0OSw3IEBACiAJCQkJCX0KIAkJCQkKIAkJCQl9Ci0JCQkJcmV0dXJuIGRlZmF1bHRzQ29udGV4dC5nZXREZWZhdWx0KGtleSk7CisJCQkJcmV0dXJuIHN1cGVyLmdldERlZmF1bHQoa2V5KTsKIAkJCX0KIAkJfTsKIAl9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcGxhdGZvcm0vQmFzZUpwYUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9wbGF0Zm9ybS9CYXNlSnBhRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0NzQ1NmIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcGxhdGZvcm0vQmFzZUpwYUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDgzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24gYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnBsYXRmb3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSUpwYUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLklKYXZhQmFzaWM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLklKYXZhRW1iZWRkYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSUphdmFFbWJlZGRlZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSUphdmFFbWJlZGRlZElkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5JSmF2YUVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSUphdmFJZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSUphdmFNYW55VG9NYW55OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5JSmF2YU1hbnlUb09uZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSUphdmFNYXBwZWRTdXBlcmNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5JSmF2YU9uZVRvTWFueTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSUphdmFPbmVUb09uZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSUphdmFUcmFuc2llbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLklKYXZhVmVyc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSnBhSmF2YU1hcHBpbmdzRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qZHR1dGlsaXR5LkF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qZHR1dGlsaXR5LlR5cGU7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlSnBhRmFjdG9yeSBpbXBsZW1lbnRzIElKcGFGYWN0b3J5Cit7CisJcHVibGljIElKYXZhRW50aXR5IGNyZWF0ZUphdmFFbnRpdHkoVHlwZSB0eXBlKSB7CisJCXJldHVybiBKcGFKYXZhTWFwcGluZ3NGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVKYXZhRW50aXR5KHR5cGUpOworCX0KKwkKKwlwdWJsaWMgSUphdmFFbWJlZGRhYmxlIGNyZWF0ZUphdmFFbWJlZGRhYmxlKFR5cGUgdHlwZSkgeworCQlyZXR1cm4gSnBhSmF2YU1hcHBpbmdzRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSmF2YUVtYmVkZGFibGUodHlwZSk7CisJfQorCQorCXB1YmxpYyBJSmF2YU1hcHBlZFN1cGVyY2xhc3MgY3JlYXRlSmF2YU1hcHBlZFN1cGVyY2xhc3MoVHlwZSB0eXBlKSB7CisJCXJldHVybiBKcGFKYXZhTWFwcGluZ3NGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVKYXZhTWFwcGVkU3VwZXJjbGFzcyh0eXBlKTsKKwl9CisJCQorCXB1YmxpYyBJSmF2YUJhc2ljIGNyZWF0ZUphdmFCYXNpYyhBdHRyaWJ1dGUgYXR0cmlidXRlKSB7CisJCXJldHVybiBKcGFKYXZhTWFwcGluZ3NGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVKYXZhQmFzaWMoYXR0cmlidXRlKTsKKwl9CisJCisJcHVibGljIElKYXZhRW1iZWRkZWQgY3JlYXRlSmF2YUVtYmVkZGVkKEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKKwkJcmV0dXJuIEpwYUphdmFNYXBwaW5nc0ZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUphdmFFbWJlZGRlZChhdHRyaWJ1dGUpOworCX0KKwkKKwlwdWJsaWMgSUphdmFFbWJlZGRlZElkIGNyZWF0ZUphdmFFbWJlZGRlZElkKEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKKwkJcmV0dXJuIEpwYUphdmFNYXBwaW5nc0ZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUphdmFFbWJlZGRlZElkKGF0dHJpYnV0ZSk7CisJfQorCQorCXB1YmxpYyBJSmF2YUlkIGNyZWF0ZUphdmFJZChBdHRyaWJ1dGUgYXR0cmlidXRlKSB7CisJCXJldHVybiBKcGFKYXZhTWFwcGluZ3NGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVKYXZhSWQoYXR0cmlidXRlKTsKKwl9CisJCisJcHVibGljIElKYXZhTWFueVRvTWFueSBjcmVhdGVKYXZhTWFueVRvTWFueShBdHRyaWJ1dGUgYXR0cmlidXRlKSB7CisJCXJldHVybiBKcGFKYXZhTWFwcGluZ3NGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVKYXZhTWFueVRvTWFueShhdHRyaWJ1dGUpOworCX0KKwkKKwlwdWJsaWMgSUphdmFNYW55VG9PbmUgY3JlYXRlSmF2YU1hbnlUb09uZShBdHRyaWJ1dGUgYXR0cmlidXRlKSB7CisJCXJldHVybiBKcGFKYXZhTWFwcGluZ3NGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVKYXZhTWFueVRvT25lKGF0dHJpYnV0ZSk7CisJfQorCQorCXB1YmxpYyBJSmF2YU9uZVRvTWFueSBjcmVhdGVKYXZhT25lVG9NYW55KEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKKwkJcmV0dXJuIEpwYUphdmFNYXBwaW5nc0ZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUphdmFPbmVUb01hbnkoYXR0cmlidXRlKTsKKwl9CisJCisJcHVibGljIElKYXZhT25lVG9PbmUgY3JlYXRlSmF2YU9uZVRvT25lKEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKKwkJcmV0dXJuIEpwYUphdmFNYXBwaW5nc0ZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUphdmFPbmVUb09uZShhdHRyaWJ1dGUpOworCX0KKwkKKwlwdWJsaWMgSUphdmFUcmFuc2llbnQgY3JlYXRlSmF2YVRyYW5zaWVudChBdHRyaWJ1dGUgYXR0cmlidXRlKSB7CisJCXJldHVybiBKcGFKYXZhTWFwcGluZ3NGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVKYXZhVHJhbnNpZW50KGF0dHJpYnV0ZSk7CisJfQorCQorCXB1YmxpYyBJSmF2YVZlcnNpb24gY3JlYXRlSmF2YVZlcnNpb24oQXR0cmlidXRlIGF0dHJpYnV0ZSkgeworCQlyZXR1cm4gSnBhSmF2YU1hcHBpbmdzRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSmF2YVZlcnNpb24oYXR0cmlidXRlKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcGxhdGZvcm0vQmFzZUpwYVBsYXRmb3JtLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcGxhdGZvcm0vQmFzZUpwYVBsYXRmb3JtLmphdmEKaW5kZXggMzMwYTI5NC4uZDUxYWUxZCAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3BsYXRmb3JtL0Jhc2VKcGFQbGF0Zm9ybS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9wbGF0Zm9ybS9CYXNlSnBhUGxhdGZvcm0uamF2YQpAQCAtMTMsMzMgKzEzLDU1IEBACiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSUpwYUZhY3Rvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSUpwYUZpbGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSUpwYUZpbGVDb250ZW50UHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSUpwYVBsYXRmb3JtOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklKcGFQcm9qZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklNYXBwaW5nS2V5czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JUGVyc2lzdGVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLklEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEuSUphdmFBdHRyaWJ1dGVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5JSmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEuSUphdmFUeXBlTWFwcGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEuSUphdmFUeXBlTWFwcGluZ1Byb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5KYXZhSnBhRmlsZUNvbnRlbnRQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSmF2YUJhc2ljOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5KYXZhQmFzaWNQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSmF2YUVtYmVkZGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLkphdmFFbWJlZGRhYmxlUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLkphdmFFbWJlZGRlZDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSmF2YUVtYmVkZGVkSWQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLkphdmFFbWJlZGRlZElkUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLkphdmFFbWJlZGRlZFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5KYXZhRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5KYXZhRW50aXR5UHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLkphdmFJZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSmF2YUlkUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLkphdmFNYW55VG9NYW55OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5KYXZhTWFueVRvTWFueVByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5KYXZhTWFueVRvT25lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5KYXZhTWFueVRvT25lUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLkphdmFNYXBwZWRTdXBlcmNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5KYXZhTWFwcGVkU3VwZXJjbGFzc1Byb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5KYXZhTnVsbEF0dHJpYnV0ZU1hcHBpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLkphdmFOdWxsVHlwZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLkphdmFOdWxsVHlwZU1hcHBpbmdQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSmF2YU9uZVRvTWFueTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSmF2YU9uZVRvTWFueVByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5KYXZhT25lVG9PbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLkphdmFPbmVUb09uZVByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5KYXZhVHJhbnNpZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5KYXZhVHJhbnNpZW50UHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLm1hcHBpbmdzLkphdmFWZXJzaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5KYXZhVmVyc2lvblByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQub3JtLk9ybVhtbEpwYUZpbGVDb250ZW50UHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVhtbEpwYUZpbGVDb250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lSXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lTGlzdEl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7CiAKIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlSnBhUGxhdGZvcm0gaW1wbGVtZW50cyBJSnBhUGxhdGZvcm0KQEAgLTY0LDggKzg2LDIzIEBACiAJCiAJcHJpdmF0ZSBDb2xsZWN0aW9uPElKcGFGaWxlQ29udGVudFByb3ZpZGVyPiBjb250ZW50UHJvdmlkZXJzOwogCQorCXByaXZhdGUgQ29sbGVjdGlvbjxJSmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcj4gamF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcnM7CisJCisJcHJpdmF0ZSBMaXN0PElEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcj4gZGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXJzOworCQkKKwlwcml2YXRlIENvbGxlY3Rpb248SUphdmFUeXBlTWFwcGluZ1Byb3ZpZGVyPiBqYXZhVHlwZU1hcHBpbmdQcm92aWRlcnM7CisJCisJcHJpdmF0ZSBJSnBhRmFjdG9yeSBqcGFGYWN0b3J5OworCQogCXByaXZhdGUgSUNvbnRleHQgY29udGV4dDsKIAkKKwlwcm90ZWN0ZWQgQmFzZUpwYVBsYXRmb3JtKCkgeworCQlzdXBlcigpOworCQl0aGlzLmpwYUZhY3RvcnkgPSBjcmVhdGVKcGFGYWN0b3J5KCk7CisJfQorCQorCXByb3RlY3RlZCBhYnN0cmFjdCBJSnBhRmFjdG9yeSBjcmVhdGVKcGFGYWN0b3J5KCk7CisJCiAJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKIAkJcmV0dXJuIHRoaXMuaWQ7CiAJfQpAQCAtODksNiArMTI2LDEwIEBACiAJCXRoaXMucHJvamVjdCA9IGpwYVByb2plY3Q7CiAJfQogCisJcHVibGljIElKcGFGYWN0b3J5IGdldEpwYUZhY3RvcnkoKSB7CisJCXJldHVybiB0aGlzLmpwYUZhY3Rvcnk7CisJfQorCQogCS8vICoqKioqKioqKiogUGVyc2lzdGVuY2UgVW5pdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAJcHVibGljIGJvb2xlYW4gY29udGFpbnNQZXJzaXN0ZW5jZVVuaXROYW1lZChTdHJpbmcgbmFtZSkgewpAQCAtMTEzLDIyICsxNTQsMTMzIEBACiAJcHVibGljIEl0ZXJhdG9yPElQZXJzaXN0ZW50VHlwZT4gcGVyc2lzdGVudFR5cGVzKFN0cmluZyBwZXJzaXN0ZW5jZVVuaXROYW1lKSB7CiAJCVBlcnNpc3RlbmNlVW5pdENvbnRleHQgcHVDb250ZXh0ID0gCiAJCQkoKEJhc2VKcGFQcm9qZWN0Q29udGV4dCkgdGhpcy5jb250ZXh0KS5wZXJzaXN0ZW5jZVVuaXRDb250ZXh0KHBlcnNpc3RlbmNlVW5pdE5hbWUpOwotCQlyZXR1cm4gKHB1Q29udGV4dCA9PSBudWxsKSA/IG51bGwgOiBwdUNvbnRleHQucGVyc2lzdGVudFR5cGVzKCk7CisJCWlmIChwdUNvbnRleHQgPT0gbnVsbCkgeworCQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKKwkJfQorCQlyZXR1cm4gcHVDb250ZXh0LnBlcnNpc3RlbnRUeXBlcygpOworCQkvL2htbSwgY29tcGlsZXIgZXJyb3Igd2l0aCB0ZXJuYXJ5IG9wZXJhdG9yCisvLwkJcmV0dXJuIChwdUNvbnRleHQgPT0gbnVsbCkgPyBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCkgOiBwdUNvbnRleHQucGVyc2lzdGVudFR5cGVzKCk7CiAJfQogCQogCQogCS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCQotCXB1YmxpYyBDb2xsZWN0aW9uPElKcGFGaWxlQ29udGVudFByb3ZpZGVyPiBqcGFGaWxlQ29udGVudFByb3ZpZGVycygpIHsKKwlwdWJsaWMgSXRlcmF0b3I8SUpwYUZpbGVDb250ZW50UHJvdmlkZXI+IGpwYUZpbGVDb250ZW50UHJvdmlkZXJzKCkgewogCQlpZiAodGhpcy5jb250ZW50UHJvdmlkZXJzID09IG51bGwpIHsKIAkJCXRoaXMuY29udGVudFByb3ZpZGVycyA9IG5ldyBBcnJheUxpc3Q8SUpwYUZpbGVDb250ZW50UHJvdmlkZXI+KCk7Ci0JCQl0aGlzLmNvbnRlbnRQcm92aWRlcnMuYWRkKFBlcnNpc3RlbmNlWG1sSnBhRmlsZUNvbnRlbnRQcm92aWRlci5JTlNUQU5DRSk7Ci0JCQl0aGlzLmNvbnRlbnRQcm92aWRlcnMuYWRkKEphdmFKcGFGaWxlQ29udGVudFByb3ZpZGVyLklOU1RBTkNFKTsKLQkJCXRoaXMuY29udGVudFByb3ZpZGVycy5hZGQoT3JtWG1sSnBhRmlsZUNvbnRlbnRQcm92aWRlci5JTlNUQU5DRSk7CisJCQlhZGRKcGFGaWxlQ29udGVudFByb3ZpZGVyc1RvKHRoaXMuY29udGVudFByb3ZpZGVycyk7CiAJCX0KLQkJcmV0dXJuIHRoaXMuY29udGVudFByb3ZpZGVyczsKKwkJcmV0dXJuIG5ldyBDbG9uZUl0ZXJhdG9yPElKcGFGaWxlQ29udGVudFByb3ZpZGVyPih0aGlzLmNvbnRlbnRQcm92aWRlcnMpOwogCX0KIAkKKwlwdWJsaWMgSUpwYUZpbGVDb250ZW50UHJvdmlkZXIgZmlsZUNvbnRlbnRQcm92aWRlcihTdHJpbmcgY29udGVudFR5cGVJZCkgeworCQlmb3IgKEl0ZXJhdG9yPElKcGFGaWxlQ29udGVudFByb3ZpZGVyPiBpID0gdGhpcy5qcGFGaWxlQ29udGVudFByb3ZpZGVycygpOyBpLmhhc05leHQoKTsgKSB7CisJCQlJSnBhRmlsZUNvbnRlbnRQcm92aWRlciBwcm92aWRlciA9IGkubmV4dCgpOworCQkJaWYgKHByb3ZpZGVyLmNvbnRlbnRUeXBlKCkuZXF1YWxzKGNvbnRlbnRUeXBlSWQpKSB7CisJCQkJcmV0dXJuIHByb3ZpZGVyOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIE92ZXJyaWRlIHRoaXMgdG8gc3BlY2lmeSBtb3JlIG9yIGRpZmZlcmVudCBKUEEgZmlsZSBjb250ZW50IHByb3ZpZGVycy4KKwkgKiBUaGUgZGVmYXVsdCBpbmNsdWRlcyB0aGUgSlBBIHNwZWMtZGVmaW5lZCBjb250ZW50IHByb3ZpZGVycyBvZgorCSAqIHBlcnNpc3RlbmNlLnhtbCwgb3JtLnhtbCwgYW5kIGphdmEgZmlsZXMuCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkSnBhRmlsZUNvbnRlbnRQcm92aWRlcnNUbyhDb2xsZWN0aW9uPElKcGFGaWxlQ29udGVudFByb3ZpZGVyPiBwcm92aWRlcnMpIHsKKwkJcHJvdmlkZXJzLmFkZChQZXJzaXN0ZW5jZVhtbEpwYUZpbGVDb250ZW50UHJvdmlkZXIuaW5zdGFuY2UoKSk7CisJCXByb3ZpZGVycy5hZGQoSmF2YUpwYUZpbGVDb250ZW50UHJvdmlkZXIuaW5zdGFuY2UoKSk7CisJCXByb3ZpZGVycy5hZGQoT3JtWG1sSnBhRmlsZUNvbnRlbnRQcm92aWRlci5pbnN0YW5jZSgpKTsKKwl9CisJCisJcHVibGljIEl0ZXJhdG9yPElKYXZhVHlwZU1hcHBpbmdQcm92aWRlcj4gamF2YVR5cGVNYXBwaW5nUHJvdmlkZXJzKCkgeworCQlpZiAodGhpcy5qYXZhVHlwZU1hcHBpbmdQcm92aWRlcnMgPT0gbnVsbCkgeworCQkJdGhpcy5qYXZhVHlwZU1hcHBpbmdQcm92aWRlcnMgPSBuZXcgQXJyYXlMaXN0PElKYXZhVHlwZU1hcHBpbmdQcm92aWRlcj4oKTsKKwkJCXRoaXMuYWRkSmF2YVR5cGVNYXBwaW5nUHJvdmlkZXJzVG8odGhpcy5qYXZhVHlwZU1hcHBpbmdQcm92aWRlcnMpOworCQl9CisJCXJldHVybiBuZXcgQ2xvbmVJdGVyYXRvcjxJSmF2YVR5cGVNYXBwaW5nUHJvdmlkZXI+KHRoaXMuamF2YVR5cGVNYXBwaW5nUHJvdmlkZXJzKTsKKwl9CisKKwkvKioKKwkgKiBPdmVycmlkZSB0aGlzIHRvIHNwZWNpZnkgbW9yZSBvciBkaWZmZXJlbnQgdHlwZSBtYXBwaW5nIHByb3ZpZGVycy4KKwkgKiBUaGUgZGVmYXVsdCBpbmNsdWRlcyB0aGUgSlBBIHNwZWMtZGVmaW5lZCB0eXBlIG1hcHBpbmdzIG9mIAorCSAqIEVudGl0eSwgTWFwcGVkU3VwZXJjbGFzcywgYW5kIEVtYmVkZGFibGUKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRKYXZhVHlwZU1hcHBpbmdQcm92aWRlcnNUbyhDb2xsZWN0aW9uPElKYXZhVHlwZU1hcHBpbmdQcm92aWRlcj4gcHJvdmlkZXJzKSB7CisJCXByb3ZpZGVycy5hZGQoSmF2YU51bGxUeXBlTWFwcGluZ1Byb3ZpZGVyLmluc3RhbmNlKCkpOworCQlwcm92aWRlcnMuYWRkKEphdmFFbnRpdHlQcm92aWRlci5pbnN0YW5jZSgpKTsKKwkJcHJvdmlkZXJzLmFkZChKYXZhTWFwcGVkU3VwZXJjbGFzc1Byb3ZpZGVyLmluc3RhbmNlKCkpOworCQlwcm92aWRlcnMuYWRkKEphdmFFbWJlZGRhYmxlUHJvdmlkZXIuaW5zdGFuY2UoKSk7CisJfQorCisJcHVibGljIElKYXZhVHlwZU1hcHBpbmdQcm92aWRlciBqYXZhVHlwZU1hcHBpbmdQcm92aWRlcihTdHJpbmcgdHlwZU1hcHBpbmdLZXkpIHsKKwkJZm9yIChJdGVyYXRvcjxJSmF2YVR5cGVNYXBwaW5nUHJvdmlkZXI+IGkgPSB0aGlzLmphdmFUeXBlTWFwcGluZ1Byb3ZpZGVycygpOyBpLmhhc05leHQoKTsgKSB7CisJCQlJSmF2YVR5cGVNYXBwaW5nUHJvdmlkZXIgcHJvdmlkZXIgPSBpLm5leHQoKTsKKwkJCWlmIChwcm92aWRlci5rZXkoKSA9PSB0eXBlTWFwcGluZ0tleSkgeworCQkJCXJldHVybiBwcm92aWRlcjsKKwkJCX0KKwkJfQorCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbnN1cHBvcnRlZCBqYXZhIHR5cGUgbWFwcGluZyBrZXk6ICIgKyB0eXBlTWFwcGluZ0tleSk7CisJfQorCQorCXB1YmxpYyBJdGVyYXRvcjxJSmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcj4gamF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcnMoKSB7CisJCWlmICh0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXJzID09IG51bGwpIHsKKwkJCXRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcnMgPSBuZXcgQXJyYXlMaXN0PElKYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyPigpOworCQkJdGhpcy5hZGRKYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyc1RvKHRoaXMuamF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcnMpOworCQl9CisJCXJldHVybiBuZXcgQ2xvbmVJdGVyYXRvcjxJSmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcj4odGhpcy5qYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVycyk7CisJfQorCQorCS8qKgorCSAqIE92ZXJyaWRlIHRoaXMgdG8gc3BlY2lmeSBtb3JlIG9yIGRpZmZlcmVudCBhdHRyaWJ1dGUgbWFwcGluZyBwcm92aWRlcnMuCisJICogVGhlIGRlZmF1bHQgaW5jbHVkZXMgdGhlIEpQQSBzcGVjLWRlZmluZWQgYXR0cmlidXRlIG1hcHBpbmdzIG9mIAorCSAqIEJhc2ljLCBJZCwgVHJhbnNpZW50IE9uZVRvT25lLCBPbmVUb01hbnksIE1hbnlUb09uZSwgTWFueVRvTWFueSwgRW1iZWRkYWJsZSwgRW1iZWRkZWRJZCwgVmVyc2lvbi4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRKYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyc1RvKENvbGxlY3Rpb248SUphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXI+IHByb3ZpZGVycykgeworCQlwcm92aWRlcnMuYWRkKEphdmFCYXNpY1Byb3ZpZGVyLmluc3RhbmNlKCkpOworCQlwcm92aWRlcnMuYWRkKEphdmFJZFByb3ZpZGVyLmluc3RhbmNlKCkpOworCQlwcm92aWRlcnMuYWRkKEphdmFUcmFuc2llbnRQcm92aWRlci5pbnN0YW5jZSgpKTsKKwkJcHJvdmlkZXJzLmFkZChKYXZhT25lVG9NYW55UHJvdmlkZXIuaW5zdGFuY2UoKSk7CisJCXByb3ZpZGVycy5hZGQoSmF2YU1hbnlUb09uZVByb3ZpZGVyLmluc3RhbmNlKCkpOworCQlwcm92aWRlcnMuYWRkKEphdmFNYW55VG9NYW55UHJvdmlkZXIuaW5zdGFuY2UoKSk7CisJCXByb3ZpZGVycy5hZGQoSmF2YU9uZVRvT25lUHJvdmlkZXIuaW5zdGFuY2UoKSk7CisJCXByb3ZpZGVycy5hZGQoSmF2YUVtYmVkZGVkUHJvdmlkZXIuaW5zdGFuY2UoKSk7CisJCXByb3ZpZGVycy5hZGQoSmF2YUVtYmVkZGVkSWRQcm92aWRlci5pbnN0YW5jZSgpKTsKKwkJcHJvdmlkZXJzLmFkZChKYXZhVmVyc2lvblByb3ZpZGVyLmluc3RhbmNlKCkpOworCX0KKwkKKwkvKioKKwkgKiB0aHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIHByb3ZpZGVyIGlzIG5vdCBmb3VuZAorCSAqLworCXB1YmxpYyBJSmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlciBqYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyKFN0cmluZyBhdHRyaWJ1dGVNYXBwaW5nS2V5KSB7CisJCWZvciAoSXRlcmF0b3I8SUphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXI+IGkgPSB0aGlzLmphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXJzKCk7IGkuaGFzTmV4dCgpOyApIHsKKwkJCUlKYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVyIHByb3ZpZGVyID0gaS5uZXh0KCk7CisJCQlpZiAocHJvdmlkZXIua2V5KCkgPT0gYXR0cmlidXRlTWFwcGluZ0tleSkgeworCQkJCXJldHVybiBwcm92aWRlcjsKKwkJCX0KKwkJfQorCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbnN1cHBvcnRlZCBqYXZhIGF0dHJpYnV0ZSBtYXBwaW5nIGtleTogIiArIGF0dHJpYnV0ZU1hcHBpbmdLZXkpOworCX0KKwkKKwlwdWJsaWMgTGlzdEl0ZXJhdG9yPElEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcj4gZGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXJzKCkgeworCQlpZiAodGhpcy5kZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcnMgPT0gbnVsbCkgeworCQkJdGhpcy5kZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcnMgPSBuZXcgQXJyYXlMaXN0PElEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcj4oKTsKKwkJCXRoaXMuYWRkRGVmYXVsdEF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcnNUbyh0aGlzLmRlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1Byb3ZpZGVycyk7CisJCX0KKwkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxJRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXI+KHRoaXMuZGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXJzKTsKKwl9CisJCisJLyoqCisJICogT3ZlcnJpZGUgdGhpcyB0byBzcGVjaWZ5IG1vcmUgb3IgZGlmZmVyZW50IGRlZmF1bHQgYXR0cmlidXRlIG1hcHBpbmcgcHJvdmlkZXJzLgorCSAqIFRoZSBkZWZhdWx0IGluY2x1ZGVzIHRoZSBKUEEgc3BlYy1kZWZpbmVkIGF0dHJpYnV0ZSBtYXBwaW5ncyBvZiAKKwkgKiBFbWJlZGRlZCBhbmQgQmFzaWMuCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkRGVmYXVsdEF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcnNUbyhMaXN0PElEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdQcm92aWRlcj4gcHJvdmlkZXJzKSB7CisJCXByb3ZpZGVycy5hZGQoSmF2YUVtYmVkZGVkUHJvdmlkZXIuaW5zdGFuY2UoKSk7IC8vYnVnIDE5MDM0NCBuZWVkIHRvIHRlc3QgZGVmYXVsdCBlbWJlZGRlZCBiZWZvcmUgYmFzaWMKKwkJcHJvdmlkZXJzLmFkZChKYXZhQmFzaWNQcm92aWRlci5pbnN0YW5jZSgpKTsKKwl9CisKIAlwdWJsaWMgSUNvbnRleHQgYnVpbGRQcm9qZWN0Q29udGV4dCgpIHsKIAkJdGhpcy5jb250ZXh0ID0gbmV3IEJhc2VKcGFQcm9qZWN0Q29udGV4dChnZXRQcm9qZWN0KCkpOwogCQlyZXR1cm4gdGhpcy5jb250ZXh0OwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3BsYXRmb3JtL0Jhc2VKcGFQcm9qZWN0Q29udGV4dC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3BsYXRmb3JtL0Jhc2VKcGFQcm9qZWN0Q29udGV4dC5qYXZhCmluZGV4IGRjNzBhODcuLjVhNmMwNzcgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9wbGF0Zm9ybS9CYXNlSnBhUHJvamVjdENvbnRleHQuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcGxhdGZvcm0vQmFzZUpwYVByb2plY3RDb250ZXh0LmphdmEKQEAgLTEyLDkgKzEyLDExIEBACiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OworCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JSnBhRmlsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JSnBhUGxhdGZvcm07CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSUpwYVByb2plY3Q7CkBAIC0yOCw3ICszMCw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVhtbFJvb3RDb250ZW50Tm9kZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLklKcGFWYWxpZGF0aW9uTWVzc2FnZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLkNvbm5lY3Rpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLkNvbm5lY3Rpb25Qcm9maWxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKQEAgLTE2NCw2ICsxNjUsOSBAQAogCQkJcHVibGljIElQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZShTdHJpbmcgZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSkgewogCQkJCXJldHVybiBudWxsOwogCQkJfQorCQkJcHVibGljIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KCkgeworCQkJCXJldHVybiBudWxsOworCQkJfQogCQl9OwogCX0KIAkKQEAgLTI3NSw4ICsyNzksNyBAQAogCXByb3RlY3RlZCBib29sZWFuIG9rVG9Qcm9jZWVkRm9yQ29ubmVjdGlvblZhbGlkYXRpb24gPSB0cnVlOwogCQogCXByb3RlY3RlZCB2b2lkIGFkZE5vQ29ubmVjdGlvbk1lc3NhZ2UoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJQ29ubmVjdGlvbiBjb25uZWN0aW9uID0ganBhUHJvamVjdC5nZXREYXRhU291cmNlKCkuZ2V0Q29ubmVjdGlvbigpOwotCQlpZiAoY29ubmVjdGlvbiA9PSBudWxsKSB7CisJCWlmICghIGpwYVByb2plY3QuZ2V0RGF0YVNvdXJjZSgpLmhhc0FDb25uZWN0aW9uKCkpIHsKIAkJCW1lc3NhZ2VzLmFkZCgKIAkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKIAkJCQkJCUlNZXNzYWdlLk5PUk1BTF9TRVZFUklUWSwKQEAgLTI4OCw4ICsyOTEsNyBAQAogCX0KIAkKIAlwcm90ZWN0ZWQgdm9pZCBhZGRJbmFjdGl2ZUNvbm5lY3Rpb25NZXNzYWdlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCUNvbm5lY3Rpb24gY29ubmVjdGlvbiA9IGpwYVByb2plY3QuZ2V0RGF0YVNvdXJjZSgpLmdldENvbm5lY3Rpb24oKTsKLQkJaWYgKG9rVG9Qcm9jZWVkRm9yQ29ubmVjdGlvblZhbGlkYXRpb24gJiYgISBjb25uZWN0aW9uLmlzQ29ubmVjdGVkKCkpIHsKKwkJaWYgKG9rVG9Qcm9jZWVkRm9yQ29ubmVjdGlvblZhbGlkYXRpb24gJiYgISBqcGFQcm9qZWN0LmdldERhdGFTb3VyY2UoKS5pc0Nvbm5lY3RlZCgpKSB7CiAJCQltZXNzYWdlcy5hZGQoCiAJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCiAJCQkJCQlJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFksCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcGxhdGZvcm0vRGVmYXVsdHNDb250ZXh0LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcGxhdGZvcm0vRGVmYXVsdHNDb250ZXh0LmphdmEKaW5kZXggNTU2OTE3Zi4uOTg1Y2I1MiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3BsYXRmb3JtL0RlZmF1bHRzQ29udGV4dC5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9wbGF0Zm9ybS9EZWZhdWx0c0NvbnRleHQuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5wbGF0Zm9ybTsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSVBlcnNpc3RlbnRUeXBlOwogCiBwdWJsaWMgaW50ZXJmYWNlIERlZmF1bHRzQ29udGV4dApAQCAtMjcsNCArMjgsMTIgQEAKIAkgKiBAcmV0dXJuCiAJICovCiAJSVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlKFN0cmluZyBmdWxseVF1YWxpZmllZFR5cGVOYW1lKTsKKwkKKwkvKioKKwkgKiBSZXR1cm4gbnVsbCBpbiBpbnN0YW5jZXMgd2hlcmUgdGhlIHNjb3BlIGlzIG5vdCB3aXRoaW4gYSBQZXJzaXN0ZW50VHlwZS4KKwkgKiBPdGhlcndpc2UgcmV0dXJuIHRoZSBDb21waWxhdGlvblVuaXQgZm9yIHRoZSBwZXJzaXN0ZW50VHlwZSBzbyB0aGF0IHdlCisJICogZG9uJ3QgaGF2ZSB0byBidWlsZCB0aGlzIGV2ZXJ5dGhpbmcuICBJdCBpcyBjb3N0bHkgdG8gYnVpbGQgYW5kIHJlc29sdmUgYmluZGluZ3MuCisJICogQHJldHVybgorCSAqLworCUNvbXBpbGF0aW9uVW5pdCBhc3RSb290KCk7CiB9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcGxhdGZvcm0vRGVmYXVsdHNDb250ZXh0V3JhcHBlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3BsYXRmb3JtL0RlZmF1bHRzQ29udGV4dFdyYXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzg4NjdmCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3BsYXRmb3JtL0RlZmF1bHRzQ29udGV4dFdyYXBwZXIuamF2YQpAQCAtMCwwICsxLDI4IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnBsYXRmb3JtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JUGVyc2lzdGVudFR5cGU7CisKK3B1YmxpYyBjbGFzcyBEZWZhdWx0c0NvbnRleHRXcmFwcGVyIGltcGxlbWVudHMgRGVmYXVsdHNDb250ZXh0Cit7CisJcHJpdmF0ZSBEZWZhdWx0c0NvbnRleHQgd3JhcHBlZERlZmF1bHRzQ29udGV4dDsKKwkKKwlwdWJsaWMgRGVmYXVsdHNDb250ZXh0V3JhcHBlcihEZWZhdWx0c0NvbnRleHQgd3JhcHBlZERlZmF1bHRzQ29udGV4dCkgeworCQl0aGlzLndyYXBwZWREZWZhdWx0c0NvbnRleHQgPSB3cmFwcGVkRGVmYXVsdHNDb250ZXh0OworCX0KKwlwdWJsaWMgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QoKSB7CisJCXJldHVybiB0aGlzLndyYXBwZWREZWZhdWx0c0NvbnRleHQuYXN0Um9vdCgpOworCX0KKworCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdChTdHJpbmcga2V5KSB7CisJCXJldHVybiB0aGlzLndyYXBwZWREZWZhdWx0c0NvbnRleHQuZ2V0RGVmYXVsdChrZXkpOworCX0KKworCXB1YmxpYyBJUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUoU3RyaW5nIGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUpIHsKKwkJcmV0dXJuIHRoaXMud3JhcHBlZERlZmF1bHRzQ29udGV4dC5wZXJzaXN0ZW50VHlwZShmdWxseVF1YWxpZmllZFR5cGVOYW1lKTsKKwl9CisJCisJcHJvdGVjdGVkIERlZmF1bHRzQ29udGV4dCBnZXRXcmFwcGVkRGVmYXVsdHNDb250ZXh0KCkgeworCQlyZXR1cm4gdGhpcy53cmFwcGVkRGVmYXVsdHNDb250ZXh0OworCX0KK30KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9wbGF0Zm9ybS9KYXZhQXR0cmlidXRlQ29udGV4dC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3BsYXRmb3JtL0phdmFBdHRyaWJ1dGVDb250ZXh0LmphdmEKaW5kZXggZWY0MGU2YS4uYmY3NWY2MyAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3BsYXRmb3JtL0phdmFBdHRyaWJ1dGVDb250ZXh0LmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3BsYXRmb3JtL0phdmFBdHRyaWJ1dGVDb250ZXh0LmphdmEKQEAgLTEzLDcgKzEzLDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSUF0dHJpYnV0ZU1hcHBpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSU1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklQZXJzaXN0ZW50VHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JVHlwZU1hcHBpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLklKYXZhQXR0cmlidXRlTWFwcGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7CkBAIC02NiwxNCArNjUsMTAgQEAKIAkJcmV0dXJuIHRoaXMuYXR0cmlidXRlTWFwcGluZzsKIAl9CiAJCi0JcHVibGljIGZpbmFsIERlZmF1bHRzQ29udGV4dCB3cmFwRGVmYXVsdHNDb250ZXh0KGZpbmFsIERlZmF1bHRzQ29udGV4dCBkZWZhdWx0c0NvbnRleHQpIHsKLQkJcmV0dXJuIG5ldyBEZWZhdWx0c0NvbnRleHQoKSB7CisJcHVibGljIGZpbmFsIERlZmF1bHRzQ29udGV4dCB3cmFwRGVmYXVsdHNDb250ZXh0KERlZmF1bHRzQ29udGV4dCBkZWZhdWx0c0NvbnRleHQpIHsKKwkJcmV0dXJuIG5ldyBEZWZhdWx0c0NvbnRleHRXcmFwcGVyKGRlZmF1bHRzQ29udGV4dCkgewogCQkJcHVibGljIE9iamVjdCBnZXREZWZhdWx0KFN0cmluZyBrZXkpIHsKLQkJCQlyZXR1cm4gSmF2YUF0dHJpYnV0ZUNvbnRleHQudGhpcy5nZXREZWZhdWx0KGtleSwgZGVmYXVsdHNDb250ZXh0KTsKLQkJCX0KLQkJCi0JCQlwdWJsaWMgSVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlKFN0cmluZyBmdWxseVF1YWxpZmllZFR5cGVOYW1lKSB7Ci0JCQkJcmV0dXJuIGRlZmF1bHRzQ29udGV4dC5wZXJzaXN0ZW50VHlwZShmdWxseVF1YWxpZmllZFR5cGVOYW1lKTsKKwkJCQlyZXR1cm4gSmF2YUF0dHJpYnV0ZUNvbnRleHQudGhpcy5nZXREZWZhdWx0KGtleSwgZ2V0V3JhcHBlZERlZmF1bHRzQ29udGV4dCgpKTsKIAkJCX0KIAkJfTsKIAl9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcGxhdGZvcm0vSmF2YUVudGl0eUNvbnRleHQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9wbGF0Zm9ybS9KYXZhRW50aXR5Q29udGV4dC5qYXZhCmluZGV4IGE5NzZkZDkuLjk3ZDVlODkgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9wbGF0Zm9ybS9KYXZhRW50aXR5Q29udGV4dC5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9wbGF0Zm9ybS9KYXZhRW50aXR5Q29udGV4dC5qYXZhCkBAIC0xMyw2ICsxMyw3IEBACiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSVBlcnNpc3RlbnRBdHRyaWJ1dGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSVBlcnNpc3RlbnRUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5tYXBwaW5ncy5KYXZhQXNzb2NpYXRpb25PdmVycmlkZTsKQEAgLTEzOSw3ICsxNDAsMTEgQEAKIAkJfQogCX0KIAkKLQlwdWJsaWMgRGVmYXVsdHNDb250ZXh0IHdyYXBEZWZhdWx0c0NvbnRleHQoZmluYWwgRGVmYXVsdHNDb250ZXh0IGRlZmF1bHRzQ29udGV4dCkgeworCS8vVE9ETyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhpcyBjbGFzcyBhbmQgSmF2YVR5cGVDb250ZXh0IGlzIHZlcnkgY29uZnVzZWQKKwkvL3dlIGVuZCB1cCB3cmFwcGluZyB0aGUgZGVmYXVsdHMgY29udGV4dCBtdWx0aXBsZSB0aW1lcy4gIE1heWJlIHdlIHNob3VsZAorCS8vbWFrZSB0aGlzIG1vcmUgbGlrZSBKYXZhQXR0cmlidXRlQ29udGV4dC4gIG9yIG1heWJlIHdlIG5lZWQgYSBKYXZhUGVyc2lzdGVudFR5cGVDb250ZXh0CisJLy9JIHRyaWVkIHRvIG1pbmltaXplIHRoZSBjaGFuZ2Ugc28gYXMgbm90IHRvIGJyZWFrIHRoZSBkZWZhdWx0cyBjYWxjdWxhdGlvbnMKKwlwcml2YXRlIERlZmF1bHRzQ29udGV4dCB3cmFwRGVmYXVsdHNDb250ZXh0KGZpbmFsIERlZmF1bHRzQ29udGV4dCBkZWZhdWx0c0NvbnRleHQpIHsKIAkJRGVmYXVsdHNDb250ZXh0IHdyYXBwZWREZWZhdWx0c0NvbnRleHQgPSBuZXcgRGVmYXVsdHNDb250ZXh0KCkgewogCQkJcHVibGljIE9iamVjdCBnZXREZWZhdWx0KFN0cmluZyBrZXkpIHsKIAkJCQlpZiAoa2V5LmVxdWFscyhCYXNlSnBhUGxhdGZvcm0uREVGQVVMVF9UQUJMRV9OQU1FX0tFWSkpIHsKQEAgLTE1OCw2ICsxNjMsOSBAQAogCQkJcHVibGljIElQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZShTdHJpbmcgZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSkgewogCQkJCXJldHVybiBkZWZhdWx0c0NvbnRleHQucGVyc2lzdGVudFR5cGUoZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSk7CiAJCQl9CisJCQlwdWJsaWMgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QoKSB7CisJCQkJcmV0dXJuIGdldEFzdFJvb3QoKTsKKwkJCX0KIAkJfTsKIAkJaWYgKHRoaXMudGFibGVDb250ZXh0ICE9IG51bGwpIHsKIAkJCXJldHVybiB0aGlzLnRhYmxlQ29udGV4dC53cmFwRGVmYXVsdHNDb250ZXh0KHdyYXBwZWREZWZhdWx0c0NvbnRleHQpOwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3BsYXRmb3JtL0phdmFQZXJzaXN0ZW50QXR0cmlidXRlQ29udGV4dC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3BsYXRmb3JtL0phdmFQZXJzaXN0ZW50QXR0cmlidXRlQ29udGV4dC5qYXZhCmluZGV4IDU3M2RhYjUuLjhiYjQ1NzUgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9wbGF0Zm9ybS9KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZUNvbnRleHQuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcGxhdGZvcm0vSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGVDb250ZXh0LmphdmEKQEAgLTEwLDcgKzEwLDYgQEAKIAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklNYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JUGVyc2lzdGVudFR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLklKYXZhQXR0cmlidXRlTWFwcGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKQEAgLTgzLDE0ICs4MiwxMCBAQAogCQlyZXR1cm4gdGhpcy5qYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKIAl9CiAJCi0JcHVibGljIGZpbmFsIERlZmF1bHRzQ29udGV4dCB3cmFwRGVmYXVsdHNDb250ZXh0KGZpbmFsIERlZmF1bHRzQ29udGV4dCBkZWZhdWx0c0NvbnRleHQpIHsKLQkJcmV0dXJuIG5ldyBEZWZhdWx0c0NvbnRleHQoKSB7CisJcHVibGljIGZpbmFsIERlZmF1bHRzQ29udGV4dCB3cmFwRGVmYXVsdHNDb250ZXh0KERlZmF1bHRzQ29udGV4dCBkZWZhdWx0c0NvbnRleHQpIHsKKwkJcmV0dXJuIG5ldyBEZWZhdWx0c0NvbnRleHRXcmFwcGVyKGRlZmF1bHRzQ29udGV4dCkgewogCQkJcHVibGljIE9iamVjdCBnZXREZWZhdWx0KFN0cmluZyBrZXkpIHsKLQkJCQlyZXR1cm4gSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGVDb250ZXh0LnRoaXMuZ2V0RGVmYXVsdChrZXksIGRlZmF1bHRzQ29udGV4dCk7Ci0JCQl9Ci0JCQotCQkJcHVibGljIElQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZShTdHJpbmcgZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSkgewotCQkJCXJldHVybiBkZWZhdWx0c0NvbnRleHQucGVyc2lzdGVudFR5cGUoZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSk7CisJCQkJcmV0dXJuIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlQ29udGV4dC50aGlzLmdldERlZmF1bHQoa2V5LCBnZXRXcmFwcGVkRGVmYXVsdHNDb250ZXh0KCkpOwogCQkJfQogCQl9OwogCX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9wbGF0Zm9ybS9KYXZhUmVsYXRpb25zaGlwTWFwcGluZ0NvbnRleHQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9wbGF0Zm9ybS9KYXZhUmVsYXRpb25zaGlwTWFwcGluZ0NvbnRleHQuamF2YQppbmRleCA4YzViMWY0Li4xZTBmOGY1IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcGxhdGZvcm0vSmF2YVJlbGF0aW9uc2hpcE1hcHBpbmdDb250ZXh0LmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3BsYXRmb3JtL0phdmFSZWxhdGlvbnNoaXBNYXBwaW5nQ29udGV4dC5qYXZhCkBAIC0yNSw3ICsyNSw3IEBACiAJfQogCQogCXByb3RlY3RlZCBJRW50aXR5IHRhcmdldEVudGl0eShEZWZhdWx0c0NvbnRleHQgZGVmYXVsdHNDb250ZXh0KSB7Ci0JCVN0cmluZyB0YXJnZXRFbnRpdHkgPSBnZXRNYXBwaW5nKCkuZnVsbHlRdWFsaWZpZWRUYXJnZXRFbnRpdHkoKTsKKwkJU3RyaW5nIHRhcmdldEVudGl0eSA9IGdldE1hcHBpbmcoKS5mdWxseVF1YWxpZmllZFRhcmdldEVudGl0eShkZWZhdWx0c0NvbnRleHQuYXN0Um9vdCgpKTsKIAkJaWYgKHRhcmdldEVudGl0eSA9PSBudWxsKSB7CiAJCQlyZXR1cm4gbnVsbDsKIAkJfQpAQCAtNDMsNyArNDMsNyBAQAogCUBPdmVycmlkZQogCXByb3RlY3RlZCBPYmplY3QgZ2V0RGVmYXVsdChTdHJpbmcga2V5LCBEZWZhdWx0c0NvbnRleHQgZGVmYXVsdHNDb250ZXh0KSB7CiAJCWlmIChrZXkuZXF1YWxzKEJhc2VKcGFQbGF0Zm9ybS5ERUZBVUxUX1RBUkdFVF9FTlRJVFlfS0VZKSkgewotCQkJcmV0dXJuIGdldE1hcHBpbmcoKS5mdWxseVF1YWxpZmllZFRhcmdldEVudGl0eSgpOworCQkJcmV0dXJuIGdldE1hcHBpbmcoKS5mdWxseVF1YWxpZmllZFRhcmdldEVudGl0eShkZWZhdWx0c0NvbnRleHQuYXN0Um9vdCgpKTsKIAkJfQogCQlyZXR1cm4gc3VwZXIuZ2V0RGVmYXVsdChrZXksIGRlZmF1bHRzQ29udGV4dCk7CiAJfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3BsYXRmb3JtL0phdmFTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nQ29udGV4dC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3BsYXRmb3JtL0phdmFTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nQ29udGV4dC5qYXZhCmluZGV4IGE5NTI2MjkuLmYyZmE4NTMgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9wbGF0Zm9ybS9KYXZhU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ0NvbnRleHQuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcGxhdGZvcm0vSmF2YVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdDb250ZXh0LmphdmEKQEAgLTE0LDcgKzE0LDYgQEAKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSVBlcnNpc3RlbnRUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklUeXBlTWFwcGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSmF2YVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSUVudGl0eTsKQEAgLTY1LDggKzY0LDggQEAKIAkJfQogCX0KIAkKLQlwcm90ZWN0ZWQgRGVmYXVsdHNDb250ZXh0IHdyYXBEZWZhdWx0c0NvbnRleHRGb3JKb2luQ29sdW1uKGZpbmFsIERlZmF1bHRzQ29udGV4dCBkZWZhdWx0c0NvbnRleHQpIHsKLQkJcmV0dXJuIG5ldyBEZWZhdWx0c0NvbnRleHQoKSB7CisJcHJvdGVjdGVkIERlZmF1bHRzQ29udGV4dCB3cmFwRGVmYXVsdHNDb250ZXh0Rm9ySm9pbkNvbHVtbihEZWZhdWx0c0NvbnRleHQgZGVmYXVsdHNDb250ZXh0KSB7CisJCXJldHVybiBuZXcgRGVmYXVsdHNDb250ZXh0V3JhcHBlcihkZWZhdWx0c0NvbnRleHQpIHsKIAkJCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdChTdHJpbmcga2V5KSB7CiAJCQkJaWYgKGtleS5lcXVhbHMoQmFzZUpwYVBsYXRmb3JtLkRFRkFVTFRfSk9JTl9DT0xVTU5fVEFCTEVfS0VZKSkgewogCQkJCQlJVGFibGUgdGFibGUgPSBnZXRUYWJsZSgpOwpAQCAtNzUsMTEgKzc0LDcgQEAKIAkJCQkJfQogCQkJCQlyZXR1cm4gdGFibGUuZ2V0TmFtZSgpOwogCQkJCX0KLQkJCQlyZXR1cm4gZGVmYXVsdHNDb250ZXh0LmdldERlZmF1bHQoa2V5KTsKLQkJCX0KLQkJCQotCQkJcHVibGljIElQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZShTdHJpbmcgZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSkgewotCQkJCXJldHVybiBkZWZhdWx0c0NvbnRleHQucGVyc2lzdGVudFR5cGUoZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSk7CisJCQkJcmV0dXJuIHN1cGVyLmdldERlZmF1bHQoa2V5KTsKIAkJCX0KIAkJfTsKIAl9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcGxhdGZvcm0vSmF2YVR5cGVDb250ZXh0LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcGxhdGZvcm0vSmF2YVR5cGVDb250ZXh0LmphdmEKaW5kZXggMTJjZTcxZC4uNDM0MjRmMCAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3BsYXRmb3JtL0phdmFUeXBlQ29udGV4dC5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9wbGF0Zm9ybS9KYXZhVHlwZUNvbnRleHQuamF2YQpAQCAtMTIsNiArMTIsNyBAQAogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklQZXJzaXN0ZW50VHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEuSUphdmFUeXBlTWFwcGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7CkBAIC0yNyw2ICsyOCw4IEBACiAJCiAJcHJpdmF0ZSBib29sZWFuIHJlZnJlc2hlZDsKIAkKKwlwcml2YXRlIENvbXBpbGF0aW9uVW5pdCBhc3RSb290OworCQogCXB1YmxpYyBKYXZhVHlwZUNvbnRleHQoSUNvbnRleHQgcGFyZW50Q29udGV4dCwgSUphdmFUeXBlTWFwcGluZyB0eXBlTWFwcGluZykgewogCQlzdXBlcihwYXJlbnRDb250ZXh0KTsKIAkJdGhpcy50eXBlTWFwcGluZyA9IHR5cGVNYXBwaW5nOwpAQCAtNTQsMTIgKzU3LDMwIEBACiAKIAlwdWJsaWMgdm9pZCByZWZyZXNoRGVmYXVsdHMoRGVmYXVsdHNDb250ZXh0IGRlZmF1bHRzQ29udGV4dCkgewogCQl0aGlzLnJlZnJlc2hlZCA9IHRydWU7Ci0JCXRoaXMuZ2V0UGVyc2lzdGVudFR5cGUoKS5yZWZyZXNoRGVmYXVsdHMoZGVmYXVsdHNDb250ZXh0KTsKKwkJRGVmYXVsdHNDb250ZXh0IHdyYXBwZWREZWZhdWx0c0NvbnRleHQgPSB3cmFwRGVmYXVsdHNDb250ZXh0KGRlZmF1bHRzQ29udGV4dCk7CisJCXRoaXMuZ2V0UGVyc2lzdGVudFR5cGUoKS5yZWZyZXNoRGVmYXVsdHMod3JhcHBlZERlZmF1bHRzQ29udGV4dCk7CiAJCWZvciAoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGVDb250ZXh0IGNvbnRleHQgOiB0aGlzLmphdmFQZXJzaXN0ZW50QXR0cmlidXRlQ29udGV4dHMpIHsKLQkJCWNvbnRleHQucmVmcmVzaERlZmF1bHRzKGRlZmF1bHRzQ29udGV4dCk7CisJCQljb250ZXh0LnJlZnJlc2hEZWZhdWx0cyh3cmFwcGVkRGVmYXVsdHNDb250ZXh0KTsKIAkJfQogCX0KIAkKKwlwcml2YXRlIERlZmF1bHRzQ29udGV4dCB3cmFwRGVmYXVsdHNDb250ZXh0KERlZmF1bHRzQ29udGV4dCBkZWZhdWx0c0NvbnRleHQpIHsKKwkJcmV0dXJuIG5ldyBEZWZhdWx0c0NvbnRleHRXcmFwcGVyKGRlZmF1bHRzQ29udGV4dCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QoKSB7CisJCQkJcmV0dXJuIEphdmFUeXBlQ29udGV4dC50aGlzLmdldEFzdFJvb3QoKTsKKwkJCX0KKwkJfTsKKwl9CisJCisJcHJvdGVjdGVkIENvbXBpbGF0aW9uVW5pdCBnZXRBc3RSb290KCkgeworCQlpZiAodGhpcy5hc3RSb290ID09IG51bGwpIHsKKwkJCXRoaXMuYXN0Um9vdCA9IGdldFBlcnNpc3RlbnRUeXBlKCkuZ2V0VHlwZSgpLmFzdFJvb3QoKTsKKwkJfQorCQlyZXR1cm4gdGhpcy5hc3RSb290OworCQkKKwl9CisJCiAJcHVibGljIEphdmFQZXJzaXN0ZW50VHlwZSBnZXRQZXJzaXN0ZW50VHlwZSgpIHsKIAkJcmV0dXJuIChKYXZhUGVyc2lzdGVudFR5cGUpIHR5cGVNYXBwaW5nLmdldFBlcnNpc3RlbnRUeXBlKCk7CiAJfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3BsYXRmb3JtL0pvaW5UYWJsZUNvbnRleHQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9wbGF0Zm9ybS9Kb2luVGFibGVDb250ZXh0LmphdmEKaW5kZXggMmI3MzUxNi4uNjg5MDVjMSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3BsYXRmb3JtL0pvaW5UYWJsZUNvbnRleHQuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcGxhdGZvcm0vSm9pblRhYmxlQ29udGV4dC5qYXZhCkBAIC0xMSw3ICsxMSw2IEBACiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JUGVyc2lzdGVudFR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5vcm0uWG1sUmVsYXRpb25zaGlwTWFwcGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JSm9pbkNvbHVtbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JSm9pblRhYmxlOwpAQCAtNzAsOCArNjksOCBAQAogCQl9CiAJfQogCQotCXByb3RlY3RlZCBEZWZhdWx0c0NvbnRleHQgd3JhcERlZmF1bHRzQ29udGV4dEZvckpvaW5Db2x1bW4oZmluYWwgRGVmYXVsdHNDb250ZXh0IGRlZmF1bHRzQ29udGV4dCkgewotCQlyZXR1cm4gbmV3IERlZmF1bHRzQ29udGV4dCgpIHsKKwlwcm90ZWN0ZWQgRGVmYXVsdHNDb250ZXh0IHdyYXBEZWZhdWx0c0NvbnRleHRGb3JKb2luQ29sdW1uKERlZmF1bHRzQ29udGV4dCBkZWZhdWx0c0NvbnRleHQpIHsKKwkJcmV0dXJuIG5ldyBEZWZhdWx0c0NvbnRleHRXcmFwcGVyKGRlZmF1bHRzQ29udGV4dCkgewogCQkJcHVibGljIE9iamVjdCBnZXREZWZhdWx0KFN0cmluZyBrZXkpIHsKIAkJCQkvKioKIAkJCQkgKiBieSBkZWZhdWx0LCB0aGUgam9pbiBjb2x1bW4gaXMsIG9idmlvdXNseSwgaW4gdGhlIGpvaW4gdGFibGU7CkBAIC04MCwyNiArNzksMTggQEAKIAkJCQlpZiAoa2V5LmVxdWFscyhCYXNlSnBhUGxhdGZvcm0uREVGQVVMVF9KT0lOX0NPTFVNTl9UQUJMRV9LRVkpKSB7CiAJCQkJCXJldHVybiBnZXRUYWJsZSgpLmdldE5hbWUoKTsKIAkJCQl9Ci0JCQkJcmV0dXJuIGRlZmF1bHRzQ29udGV4dC5nZXREZWZhdWx0KGtleSk7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBJUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUoU3RyaW5nIGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUpIHsKLQkJCQlyZXR1cm4gZGVmYXVsdHNDb250ZXh0LnBlcnNpc3RlbnRUeXBlKGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUpOworCQkJCXJldHVybiBzdXBlci5nZXREZWZhdWx0KGtleSk7CiAJCQl9CiAJCX07CiAJfQogCQotCXByb3RlY3RlZCBEZWZhdWx0c0NvbnRleHQgd3JhcERlZmF1bHRzQ29udGV4dEZvckludmVyc2VKb2luQ29sdW1uKGZpbmFsIERlZmF1bHRzQ29udGV4dCBkZWZhdWx0c0NvbnRleHQpIHsKLQkJcmV0dXJuIG5ldyBEZWZhdWx0c0NvbnRleHQoKSB7CisJcHJvdGVjdGVkIERlZmF1bHRzQ29udGV4dCB3cmFwRGVmYXVsdHNDb250ZXh0Rm9ySW52ZXJzZUpvaW5Db2x1bW4oRGVmYXVsdHNDb250ZXh0IGRlZmF1bHRzQ29udGV4dCkgeworCQlyZXR1cm4gbmV3IERlZmF1bHRzQ29udGV4dFdyYXBwZXIoZGVmYXVsdHNDb250ZXh0KSB7CiAJCQlwdWJsaWMgT2JqZWN0IGdldERlZmF1bHQoU3RyaW5nIGtleSkgewogCQkJCWlmIChrZXkuZXF1YWxzKEJhc2VKcGFQbGF0Zm9ybS5ERUZBVUxUX0pPSU5fQ09MVU1OX1RBQkxFX0tFWSkpIHsKIAkJCQkJcmV0dXJuIGdldFRhYmxlKCkuZ2V0TmFtZSgpOwogCQkJCX0KLQkJCQlyZXR1cm4gZGVmYXVsdHNDb250ZXh0LmdldERlZmF1bHQoa2V5KTsKLQkJCX0KLQkJCQotCQkJcHVibGljIElQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZShTdHJpbmcgZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSkgewotCQkJCXJldHVybiBkZWZhdWx0c0NvbnRleHQucGVyc2lzdGVudFR5cGUoZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSk7CisJCQkJcmV0dXJuIHN1cGVyLmdldERlZmF1bHQoa2V5KTsKIAkJCX0KIAkJfTsKIAl9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcGxhdGZvcm0vTWFwcGluZ0ZpbGVDb250ZXh0LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcGxhdGZvcm0vTWFwcGluZ0ZpbGVDb250ZXh0LmphdmEKaW5kZXggODgxN2RhMi4uZDZkMmQxYyAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3BsYXRmb3JtL01hcHBpbmdGaWxlQ29udGV4dC5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9wbGF0Zm9ybS9NYXBwaW5nRmlsZUNvbnRleHQuamF2YQpAQCAtMTAwLDggKzEwMCw4IEBACiAJCX0KIAl9CiAJCi0JcHJpdmF0ZSBEZWZhdWx0c0NvbnRleHQgd3JhcERlZmF1bHRzQ29udGV4dChmaW5hbCBEZWZhdWx0c0NvbnRleHQgZGVmYXVsdHNDb250ZXh0KSB7Ci0JCXJldHVybiBuZXcgRGVmYXVsdHNDb250ZXh0KCkgeworCXByaXZhdGUgRGVmYXVsdHNDb250ZXh0IHdyYXBEZWZhdWx0c0NvbnRleHQoRGVmYXVsdHNDb250ZXh0IGRlZmF1bHRzQ29udGV4dCkgeworCQlyZXR1cm4gbmV3IERlZmF1bHRzQ29udGV4dFdyYXBwZXIoZGVmYXVsdHNDb250ZXh0KSB7CiAJCQlwdWJsaWMgT2JqZWN0IGdldERlZmF1bHQoU3RyaW5nIGtleSkgewogCQkJCWlmIChrZXkuZXF1YWxzKEJhc2VKcGFQbGF0Zm9ybS5ERUZBVUxUX1RBQkxFX1NDSEVNQV9LRVkpCiAJCQkJCXx8ICBrZXkuZXF1YWxzKEJhc2VKcGFQbGF0Zm9ybS5ERUZBVUxUX1RBQkxFX0dFTkVSQVRPUl9TQ0hFTUFfS0VZKSkgewpAQCAtMTE3LDExICsxMTcsNyBAQAogCQkJCQl9CiAJCQkJfQogCQkJCQotCQkJCXJldHVybiBkZWZhdWx0c0NvbnRleHQuZ2V0RGVmYXVsdChrZXkpOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgSVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlKFN0cmluZyBmdWxseVF1YWxpZmllZFR5cGVOYW1lKSB7Ci0JCQkJcmV0dXJuIGRlZmF1bHRzQ29udGV4dC5wZXJzaXN0ZW50VHlwZShmdWxseVF1YWxpZmllZFR5cGVOYW1lKTsKKwkJCQlyZXR1cm4gc3VwZXIuZ2V0RGVmYXVsdChrZXkpOwogCQkJfQogCQl9OwogCX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9wbGF0Zm9ybS9QZXJzaXN0ZW5jZVVuaXRDb250ZXh0LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcGxhdGZvcm0vUGVyc2lzdGVuY2VVbml0Q29udGV4dC5qYXZhCmluZGV4IGJkZWNhYjQuLmQwNzFmNjAgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9wbGF0Zm9ybS9QZXJzaXN0ZW5jZVVuaXRDb250ZXh0LmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3BsYXRmb3JtL1BlcnNpc3RlbmNlVW5pdENvbnRleHQuamF2YQpAQCAtMTIsNiArMTIsOCBAQAogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5BY2Nlc3NUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklKcGFGaWxlOwpAQCAtMzYsMTAgKzM4LDE2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNvbXBvc2l0ZUl0ZXJhdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZvbGRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwogCiBwdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VVbml0Q29udGV4dCBleHRlbmRzIEJhc2VDb250ZXh0CiB7CQorCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIElNUExJRURfTUFQUElOR19GSUxFX0xPQ0FUSU9OID0gIk1FVEEtSU5GL29ybS54bWwiOworCQogCXByaXZhdGUgUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdDsKIAkKIAlwcml2YXRlIExpc3Q8UGVyc2lzdGVuY2VVbml0TWV0YWRhdGE+IHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhczsgIC8vIGRhdGFzID8/ICBkYXRhZSA/PyAgZGF0YXRhID8/CkBAIC04NiwxNSArOTQsMzEgQEAKIAkKIAlwcm90ZWN0ZWQgTGlzdDxNYXBwaW5nRmlsZUNvbnRleHQ+IGJ1aWxkTWFwcGluZ0ZpbGVDb250ZXh0cygpIHsKIAkJTGlzdDxNYXBwaW5nRmlsZUNvbnRleHQ+IGNvbnRleHRzID0gbmV3IEFycmF5TGlzdDxNYXBwaW5nRmlsZUNvbnRleHQ+KCk7Ci0JCWZvciAoTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgOiBwZXJzaXN0ZW5jZVVuaXQuZ2V0TWFwcGluZ0ZpbGVzKCkpIHsKLQkJCVhtbFJvb3RDb250ZW50Tm9kZSB4bWxSb290Q29udGVudE5vZGUgPSB4bWxSb290Q29udGVudE5vZGVGb3IobWFwcGluZ0ZpbGVSZWYpOwotCQkJaWYgKHhtbFJvb3RDb250ZW50Tm9kZSAhPSBudWxsICYmIHhtbFJvb3RDb250ZW50Tm9kZS5nZXRFbnRpdHlNYXBwaW5ncygpICE9IG51bGwpIHsKLQkJCQljb250ZXh0cy5hZGQobmV3IE1hcHBpbmdGaWxlQ29udGV4dCh0aGlzLCB4bWxSb290Q29udGVudE5vZGUpKTsKLQkJCX0KKwkJZm9yIChYbWxSb290Q29udGVudE5vZGUgY29udGVudCA6IGFsbFVuaXF1ZU1hcHBpbmdGaWxlQ29udGVudHMoKSkgeworCQkJY29udGV4dHMuYWRkKG5ldyBNYXBwaW5nRmlsZUNvbnRleHQodGhpcywgY29udGVudCkpOwogCQl9CiAJCXJldHVybiBjb250ZXh0czsKIAl9CiAJCisJcHJvdGVjdGVkIExpc3Q8WG1sUm9vdENvbnRlbnROb2RlPiBhbGxVbmlxdWVNYXBwaW5nRmlsZUNvbnRlbnRzKCkgeworCQlMaXN0PFhtbFJvb3RDb250ZW50Tm9kZT4gY29udGVudHMgPSBuZXcgQXJyYXlMaXN0PFhtbFJvb3RDb250ZW50Tm9kZT4oKTsKKwkJZm9yIChNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA6IHBlcnNpc3RlbmNlVW5pdC5nZXRNYXBwaW5nRmlsZXMoKSkgeworCQkJWG1sUm9vdENvbnRlbnROb2RlIHhtbFJvb3RDb250ZW50Tm9kZSA9IHhtbFJvb3RDb250ZW50Tm9kZUZvcihtYXBwaW5nRmlsZVJlZik7CisJCQlpZiAoeG1sUm9vdENvbnRlbnROb2RlICE9IG51bGwgCisJCQkJCSYmIHhtbFJvb3RDb250ZW50Tm9kZS5nZXRFbnRpdHlNYXBwaW5ncygpICE9IG51bGwKKwkJCQkJJiYgISBjb250ZW50cy5jb250YWlucyh4bWxSb290Q29udGVudE5vZGUpKSB7CisJCQkJY29udGVudHMuYWRkKHhtbFJvb3RDb250ZW50Tm9kZSk7CisJCQl9CisJCX0KKwkJWG1sUm9vdENvbnRlbnROb2RlIGltcGxpZWRNYXBwaW5nRmlsZUNvbnRlbnQgPSBpbXBsaWVkTWFwcGluZ0ZpbGVDb250ZW50KCk7CisJCWlmIChpbXBsaWVkTWFwcGluZ0ZpbGVDb250ZW50ICE9IG51bGwKKwkJCQkJJiYgaW1wbGllZE1hcHBpbmdGaWxlQ29udGVudC5nZXRFbnRpdHlNYXBwaW5ncygpICE9IG51bGwKKwkJCQkJJiYgISBjb250ZW50cy5jb250YWlucyhpbXBsaWVkTWFwcGluZ0ZpbGVDb250ZW50KSkgeworCQkJY29udGVudHMuYWRkKGltcGxpZWRNYXBwaW5nRmlsZUNvbnRlbnQpOworCQl9CisJCXJldHVybiBjb250ZW50czsKKwl9CisJCiAJcHJpdmF0ZSBYbWxSb290Q29udGVudE5vZGUgeG1sUm9vdENvbnRlbnROb2RlRm9yKE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmKSB7CiAJCUlKcGFGaWxlIGpwYUZpbGUgPSBtYXBwaW5nRmlsZVJlZi5nZXRNYXBwaW5nRmlsZSgpOwogCQlpZiAoanBhRmlsZSAhPSBudWxsKSB7CkBAIC0xMDYsNiArMTMwLDMzIEBACiAJCXJldHVybiBudWxsOwogCX0KIAkKKwlwcm90ZWN0ZWQgWG1sUm9vdENvbnRlbnROb2RlIGltcGxpZWRNYXBwaW5nRmlsZUNvbnRlbnQoKSB7CisJCS8vIGNoZWNrIGZsZXhpYmxlIHByb2plY3Qgc3RydWN0dXJlCisJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHBlcnNpc3RlbmNlVW5pdC5nZXRKcGFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpKTsKKwkJSVZpcnR1YWxGb2xkZXIgdmlydHVhbFJvb3RGb2xkZXIgPSBjb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpOworCQlJVmlydHVhbEZpbGUgdmlydHVhbE1hcHBpbmdGaWxlID0gdmlydHVhbFJvb3RGb2xkZXIuZ2V0RmlsZShuZXcgUGF0aChJTVBMSUVEX01BUFBJTkdfRklMRV9MT0NBVElPTikpOworCQkvLyBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgb25lIGhhcyBiZWVuIGZvdW5kIHNvIHRoYXQgd2UgbWF5IGtub3cgaWYgbXVsdGlwbGUgZXhpc3QKKwkJSUpwYUZpbGUgbWFwcGluZ0ZpbGUgPSBudWxsOworCQlmb3IgKElGaWxlIHVuZGVybHlpbmdGaWxlIDogdmlydHVhbE1hcHBpbmdGaWxlLmdldFVuZGVybHlpbmdGaWxlcygpKSB7CisJCQlJSnBhRmlsZSBqcGFGaWxlID0gSnB0Q29yZVBsdWdpbi5nZXRKcGFGaWxlKHVuZGVybHlpbmdGaWxlKTsKKwkJCWlmIChqcGFGaWxlICE9IG51bGwpIHsKKwkJCQlpZiAobWFwcGluZ0ZpbGUgIT0gbnVsbCkgeworCQkJCQlyZXR1cm4gbnVsbDsgLy8gbXVsdGlwbGUgZG8gZXhpc3QKKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCW1hcHBpbmdGaWxlID0ganBhRmlsZTsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKG1hcHBpbmdGaWxlICE9IG51bGwpIHsKKwkJCXRyeSB7CisJCQkJcmV0dXJuIChYbWxSb290Q29udGVudE5vZGUpIG1hcHBpbmdGaWxlLmdldENvbnRlbnQoKTsKKwkJCX0KKwkJCWNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gY2NlKSB7IC8qIGRvIG5vdGhpbmcsIHJldHVybiBudWxsICovIH0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisJCiAJcHJvdGVjdGVkIExpc3Q8SmF2YVR5cGVDb250ZXh0PiBidWlsZEphdmFDbGFzc2VzQ29udGV4dHMoKSB7CiAJCUxpc3Q8SmF2YVR5cGVDb250ZXh0PiBqYXZhUGVyc2lzdGVudFR5cGVDb250ZXh0cyA9IG5ldyBBcnJheUxpc3Q8SmF2YVR5cGVDb250ZXh0PigpOwogCQlmb3IgKEphdmFQZXJzaXN0ZW50VHlwZSBqcFR5cGUgOiBhbGxJbmNsdWRlZEphdmFQZXJzaXN0ZW50VHlwZXMoKSkgewpAQCAtMjQ5LDExICszMDAsOCBAQAogCX0KIAkKIAlwcm90ZWN0ZWQgRGVmYXVsdHNDb250ZXh0IHdyYXBEZWZhdWx0c0NvbnRleHQoRGVmYXVsdHNDb250ZXh0IGRlZmF1bHRzKSB7Ci0JCWZpbmFsIERlZmF1bHRzQ29udGV4dCBwdURlZmF1bHRzID0gYnVpbGRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyhkZWZhdWx0cyk7Ci0JCXJldHVybiBuZXcgRGVmYXVsdHNDb250ZXh0KCl7Ci0JCQlwdWJsaWMgT2JqZWN0IGdldERlZmF1bHQoU3RyaW5nIGtleSkgewotCQkJCXJldHVybiBwdURlZmF1bHRzLmdldERlZmF1bHQoa2V5KTsKLQkJCX0KKwkJRGVmYXVsdHNDb250ZXh0IHB1RGVmYXVsdHMgPSBidWlsZFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKGRlZmF1bHRzKTsKKwkJcmV0dXJuIG5ldyBEZWZhdWx0c0NvbnRleHRXcmFwcGVyKHB1RGVmYXVsdHMpewogCQkJcHVibGljIElQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZShTdHJpbmcgZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSkgewogCQkJCWZvciAoSXRlcmF0b3I8VHlwZUNvbnRleHQ+IGkgPSB0eXBlQ29udGV4dHMoKTsgaS5oYXNOZXh0KCk7ICkgewogCQkJCQlUeXBlQ29udGV4dCB0eXBlQ29udGV4dCA9IGkubmV4dCgpOwpAQCAtMjcyLDE0ICszMjAsMTQgQEAKIAkJfTsKIAl9CiAJCi0JcHJvdGVjdGVkIERlZmF1bHRzQ29udGV4dCBidWlsZFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKGZpbmFsIERlZmF1bHRzQ29udGV4dCBkZWZhdWx0cykgeworCXByb3RlY3RlZCBEZWZhdWx0c0NvbnRleHQgYnVpbGRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyhEZWZhdWx0c0NvbnRleHQgZGVmYXVsdHMpIHsKIAkJaWYgKHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhcy5zaXplKCkgPT0gMSkgewogCQkJZmluYWwgUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcHVEZWZhdWx0cyA9IHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhcy5nZXQoMCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKIAkJCWlmIChwdURlZmF1bHRzLmlzQWxsRmVhdHVyZXNVbnNldCgpKSB7CiAJCQkJcmV0dXJuIGRlZmF1bHRzOwogCQkJfQogCQkJCi0JCQlyZXR1cm4gbmV3IERlZmF1bHRzQ29udGV4dCgpIHsKKwkJCXJldHVybiBuZXcgRGVmYXVsdHNDb250ZXh0V3JhcHBlcihkZWZhdWx0cykgewogCQkJCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdChTdHJpbmcga2V5KSB7CiAJCQkJCWlmIChrZXkuZXF1YWxzKEJhc2VKcGFQbGF0Zm9ybS5ERUZBVUxUX1RBQkxFX1NDSEVNQV9LRVkpCiAJCQkJCQl8fCBrZXkuZXF1YWxzKEJhc2VKcGFQbGF0Zm9ybS5ERUZBVUxUX1RBQkxFX0dFTkVSQVRPUl9TQ0hFTUFfS0VZKSkgewpAQCAtMzAwLDEwICszNDgsNyBAQAogCQkJCQkJCXJldHVybiBhY2Nlc3M7CiAJCQkJCQl9CiAJCQkJCX0KLQkJCQkJcmV0dXJuIGRlZmF1bHRzLmdldERlZmF1bHQoa2V5KTsKLQkJCQl9Ci0JCQkJcHVibGljIElQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZShTdHJpbmcgZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSkgewotCQkJCQlyZXR1cm4gZGVmYXVsdHMucGVyc2lzdGVudFR5cGUoZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSk7CisJCQkJCXJldHVybiBzdXBlci5nZXREZWZhdWx0KGtleSk7CiAJCQkJfQogCQkJfTsKIAkJfQpAQCAtNDM2LDIwICs0ODEsMjcgQEAKIAkJCX0KIAkJfSAKIAl9Ci0JCisKKwlwcm90ZWN0ZWQgSGFzaEJhZzxTdHJpbmc+IG1hcHBpbmdGaWxlTmFtZUJhZygpIHsKKwkJTGlzdDxNYXBwaW5nRmlsZVJlZj4gcmVmcyA9IHRoaXMucGVyc2lzdGVuY2VVbml0LmdldE1hcHBpbmdGaWxlcygpOworCQlIYXNoQmFnPFN0cmluZz4gZmlsZU5hbWVCYWcgPSBuZXcgSGFzaEJhZzxTdHJpbmc+KHJlZnMuc2l6ZSgpKTsKKwkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChmaWxlTmFtZUJhZywgdGhpcy5maWxlUmVmTmFtZXMocmVmcy5pdGVyYXRvcigpKSk7CisJCXJldHVybiBmaWxlTmFtZUJhZzsKKwl9CisKKwlwcm90ZWN0ZWQgSXRlcmF0b3I8U3RyaW5nPiBmaWxlUmVmTmFtZXMoSXRlcmF0b3I8TWFwcGluZ0ZpbGVSZWY+IHJlZnMpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPE1hcHBpbmdGaWxlUmVmLCBTdHJpbmc+KHJlZnMpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oTWFwcGluZ0ZpbGVSZWYgcmVmKSB7CisJCQkJcmV0dXJuIHJlZi5nZXRGaWxlTmFtZSgpOworCQkJfQorCQl9OworCX0KKwogCXByb3RlY3RlZCB2b2lkIGFkZER1cGxpY2F0ZU1hcHBpbmdGaWxlTWVzc2FnZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJSGFzaEJhZyBmaWxlQmFnID0gbmV3IEhhc2hCYWcoCi0JCQkJQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oCi0JCQkJCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcihwZXJzaXN0ZW5jZVVuaXQuZ2V0TWFwcGluZ0ZpbGVzKCkuaXRlcmF0b3IoKSkgewotCQkJCQkJCUBPdmVycmlkZQotCQkJCQkJCXByb3RlY3RlZCBPYmplY3QgdHJhbnNmb3JtKE9iamVjdCBuZXh0KSB7Ci0JCQkJCQkJCXJldHVybiAoKE1hcHBpbmdGaWxlUmVmKSBuZXh0KS5nZXRGaWxlTmFtZSgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkpCi0JCSk7CisJCUhhc2hCYWc8U3RyaW5nPiBmaWxlTmFtZUJhZyA9IHRoaXMubWFwcGluZ0ZpbGVOYW1lQmFnKCk7CiAJCWZvciAoTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgOiBwZXJzaXN0ZW5jZVVuaXQuZ2V0TWFwcGluZ0ZpbGVzKCkpIHsKLQkJCWlmIChmaWxlQmFnLmNvdW50KG1hcHBpbmdGaWxlUmVmLmdldEZpbGVOYW1lKCkpID4gMSkgeworCQkJaWYgKGZpbGVOYW1lQmFnLmNvdW50KG1hcHBpbmdGaWxlUmVmLmdldEZpbGVOYW1lKCkpID4gMSkgewogCQkJCW1lc3NhZ2VzLmFkZCgKIAkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKIAkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCkBAIC01MTgsMjAgKzU3MCwyNyBAQAogCQl9IAogCX0KIAkKKwlwcm90ZWN0ZWQgSGFzaEJhZzxTdHJpbmc+IGNsYXNzTmFtZUJhZygpIHsKKwkJTGlzdDxKYXZhQ2xhc3NSZWY+IHJlZnMgPSB0aGlzLnBlcnNpc3RlbmNlVW5pdC5nZXRDbGFzc2VzKCk7CisJCUhhc2hCYWc8U3RyaW5nPiBjbGFzc05hbWVCYWcgPSBuZXcgSGFzaEJhZzxTdHJpbmc+KHJlZnMuc2l6ZSgpKTsKKwkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChjbGFzc05hbWVCYWcsIHRoaXMuY2xhc3NSZWZOYW1lcyhyZWZzLml0ZXJhdG9yKCkpKTsKKwkJcmV0dXJuIGNsYXNzTmFtZUJhZzsKKwl9CisKKwlwcm90ZWN0ZWQgSXRlcmF0b3I8U3RyaW5nPiBjbGFzc1JlZk5hbWVzKEl0ZXJhdG9yPEphdmFDbGFzc1JlZj4gcmVmcykgeworCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8SmF2YUNsYXNzUmVmLCBTdHJpbmc+KHJlZnMpIHsKKwkJCUBPdmVycmlkZQorCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oSmF2YUNsYXNzUmVmIHJlZikgeworCQkJCXJldHVybiByZWYuZ2V0SmF2YUNsYXNzKCk7CisJCQl9CisJCX07CisJfQorCiAJcHJvdGVjdGVkIHZvaWQgYWRkRHVwbGljYXRlQ2xhc3NNZXNzYWdlcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewotCQlIYXNoQmFnIGZpbGVCYWcgPSBuZXcgSGFzaEJhZygKLQkJCQlDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbigKLQkJCQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yKHBlcnNpc3RlbmNlVW5pdC5nZXRDbGFzc2VzKCkuaXRlcmF0b3IoKSkgewotCQkJCQkJCUBPdmVycmlkZQotCQkJCQkJCXByb3RlY3RlZCBPYmplY3QgdHJhbnNmb3JtKE9iamVjdCBuZXh0KSB7Ci0JCQkJCQkJCXJldHVybiAoKEphdmFDbGFzc1JlZikgbmV4dCkuZ2V0SmF2YUNsYXNzKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCSkKLQkJKTsKKwkJSGFzaEJhZzxTdHJpbmc+IGNsYXNzTmFtZUJhZyA9IHRoaXMuY2xhc3NOYW1lQmFnKCk7CiAJCWZvciAoSmF2YUNsYXNzUmVmIGphdmFDbGFzc1JlZiA6IHBlcnNpc3RlbmNlVW5pdC5nZXRDbGFzc2VzKCkpIHsKIAkJCWlmIChqYXZhQ2xhc3NSZWYuZ2V0SmF2YUNsYXNzKCkgIT0gbnVsbAotCQkJCQkmJiBmaWxlQmFnLmNvdW50KGphdmFDbGFzc1JlZi5nZXRKYXZhQ2xhc3MoKSkgPiAxKSB7CisJCQkJCSYmIGNsYXNzTmFtZUJhZy5jb3VudChqYXZhQ2xhc3NSZWYuZ2V0SmF2YUNsYXNzKCkpID4gMSkgewogCQkJCW1lc3NhZ2VzLmFkZCgKIAkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKIAkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCkBAIC01NDMsNiArNjAyLDcgQEAKIAkJfQogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0ZvciggdGhpcywgdGhpcy5wZXJzaXN0ZW5jZVVuaXQuZ2V0TmFtZSgpKTsKIAl9CQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3BsYXRmb3JtL1NlY29uZGFyeVRhYmxlQ29udGV4dC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3BsYXRmb3JtL1NlY29uZGFyeVRhYmxlQ29udGV4dC5qYXZhCmluZGV4IGRmYzNkMTkuLjA0OWI1NGMgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9wbGF0Zm9ybS9TZWNvbmRhcnlUYWJsZUNvbnRleHQuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcGxhdGZvcm0vU2Vjb25kYXJ5VGFibGVDb250ZXh0LmphdmEKQEAgLTExLDcgKzExLDYgQEAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklQZXJzaXN0ZW50VHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JUHJpbWFyeUtleUpvaW5Db2x1bW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSVNlY29uZGFyeVRhYmxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSUpwYVZhbGlkYXRpb25NZXNzYWdlczsKQEAgLTUzLDE3ICs1MiwxNCBAQAogCQl9CiAJfQogCQotCXB1YmxpYyBEZWZhdWx0c0NvbnRleHQgd3JhcERlZmF1bHRzQ29udGV4dChmaW5hbCBEZWZhdWx0c0NvbnRleHQgZGVmYXVsdHNDb250ZXh0KSB7Ci0JCXJldHVybiBuZXcgRGVmYXVsdHNDb250ZXh0KCkgeworCXB1YmxpYyBEZWZhdWx0c0NvbnRleHQgd3JhcERlZmF1bHRzQ29udGV4dChEZWZhdWx0c0NvbnRleHQgZGVmYXVsdHNDb250ZXh0KSB7CisJCXJldHVybiBuZXcgRGVmYXVsdHNDb250ZXh0V3JhcHBlcihkZWZhdWx0c0NvbnRleHQpIHsKIAkJCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdChTdHJpbmcga2V5KSB7CisJCQkJLy9UT0RPIGhtbSwgd2h5IGlzIHRoaXMgY29tbWVudGVkIG91dD8/PyB0aGlzIHdyYXBwZXIgaXMgZG9pbmcgbm90aGluZyAtIGtmbSA4LzE3LzA3CiAvLwkJCQlpZiAoa2V5LmVxdWFscyhCYXNlSnBhUGxhdGZvcm0uREVGQVVMVF9DT0xVTU5fVEFCTEVfS0VZKSkgewogLy8JCQkJCXJldHVybiBnZXRUYWJsZSgpLmdldE5hbWUoKTsKIC8vCQkJCX0KLQkJCQlyZXR1cm4gZGVmYXVsdHNDb250ZXh0LmdldERlZmF1bHQoa2V5KTsKLQkJCX0KLQkJCQotCQkJcHVibGljIElQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZShTdHJpbmcgZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSkgewotCQkJCXJldHVybiBkZWZhdWx0c0NvbnRleHQucGVyc2lzdGVudFR5cGUoZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSk7CisJCQkJcmV0dXJuIHN1cGVyLmdldERlZmF1bHQoa2V5KTsKIAkJCX0KIAkJfTsKIAl9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcGxhdGZvcm0vVGFibGVDb250ZXh0LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcGxhdGZvcm0vVGFibGVDb250ZXh0LmphdmEKaW5kZXggOTk0OWE4Yi4uOThkMzNiNCAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3BsYXRmb3JtL1RhYmxlQ29udGV4dC5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9wbGF0Zm9ybS9UYWJsZUNvbnRleHQuamF2YQpAQCAtOSw3ICs5LDYgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucGxhdGZvcm07CiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JUGVyc2lzdGVudFR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSVRhYmxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSUpwYVZhbGlkYXRpb25NZXNzYWdlczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKQEAgLTM1LDE3ICszNCwxMyBAQAogCQl0aGlzLnRhYmxlLnJlZnJlc2hEZWZhdWx0cyhkZWZhdWx0c0NvbnRleHQpOwogCX0KIAkKLQlwdWJsaWMgRGVmYXVsdHNDb250ZXh0IHdyYXBEZWZhdWx0c0NvbnRleHQoZmluYWwgRGVmYXVsdHNDb250ZXh0IGRlZmF1bHRzQ29udGV4dCkgewotCQlyZXR1cm4gbmV3IERlZmF1bHRzQ29udGV4dCgpIHsKKwlwdWJsaWMgRGVmYXVsdHNDb250ZXh0IHdyYXBEZWZhdWx0c0NvbnRleHQoRGVmYXVsdHNDb250ZXh0IGRlZmF1bHRzQ29udGV4dCkgeworCQlyZXR1cm4gbmV3IERlZmF1bHRzQ29udGV4dFdyYXBwZXIoZGVmYXVsdHNDb250ZXh0KSB7CiAJCQlwdWJsaWMgT2JqZWN0IGdldERlZmF1bHQoU3RyaW5nIGtleSkgewogCQkJCWlmIChrZXkuZXF1YWxzKEJhc2VKcGFQbGF0Zm9ybS5ERUZBVUxUX0NPTFVNTl9UQUJMRV9LRVkpKSB7CiAJCQkJCXJldHVybiBnZXRUYWJsZSgpLmdldE5hbWUoKTsKIAkJCQl9Ci0JCQkJcmV0dXJuIGRlZmF1bHRzQ29udGV4dC5nZXREZWZhdWx0KGtleSk7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBJUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUoU3RyaW5nIGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUpIHsKLQkJCQlyZXR1cm4gZGVmYXVsdHNDb250ZXh0LnBlcnNpc3RlbnRUeXBlKGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUpOworCQkJCXJldHVybiBzdXBlci5nZXREZWZhdWx0KGtleSk7CiAJCQl9CiAJCX07CiAJfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3BsYXRmb3JtL1htbEF0dHJpYnV0ZUNvbnRleHQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9wbGF0Zm9ybS9YbWxBdHRyaWJ1dGVDb250ZXh0LmphdmEKaW5kZXggMTE4MjdjNy4uZGExYmFjNyAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3BsYXRmb3JtL1htbEF0dHJpYnV0ZUNvbnRleHQuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcGxhdGZvcm0vWG1sQXR0cmlidXRlQ29udGV4dC5qYXZhCkBAIC0xMyw3ICsxMyw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklBdHRyaWJ1dGVNYXBwaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklNYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JUGVyc2lzdGVudFR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSVR5cGVNYXBwaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwpAQCAtNzYsMTQgKzc1LDEwIEBACiAJCXJldHVybiBhdHRyaWJ1dGVNYXBwaW5nKCkudHlwZU1hcHBpbmcoKS5nZXRLZXkoKSA9PSBJTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVk7CiAJfQogCQotCXB1YmxpYyBmaW5hbCBEZWZhdWx0c0NvbnRleHQgd3JhcERlZmF1bHRzQ29udGV4dChmaW5hbCBEZWZhdWx0c0NvbnRleHQgZGVmYXVsdHNDb250ZXh0KSB7Ci0JCXJldHVybiBuZXcgRGVmYXVsdHNDb250ZXh0KCkgeworCXB1YmxpYyBmaW5hbCBEZWZhdWx0c0NvbnRleHQgd3JhcERlZmF1bHRzQ29udGV4dChEZWZhdWx0c0NvbnRleHQgZGVmYXVsdHNDb250ZXh0KSB7CisJCXJldHVybiBuZXcgRGVmYXVsdHNDb250ZXh0V3JhcHBlcihkZWZhdWx0c0NvbnRleHQpIHsKIAkJCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdChTdHJpbmcga2V5KSB7Ci0JCQkJcmV0dXJuIFhtbEF0dHJpYnV0ZUNvbnRleHQudGhpcy5nZXREZWZhdWx0KGtleSwgZGVmYXVsdHNDb250ZXh0KTsKLQkJCX0KLQkJCi0JCQlwdWJsaWMgSVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlKFN0cmluZyBmdWxseVF1YWxpZmllZFR5cGVOYW1lKSB7Ci0JCQkJcmV0dXJuIGRlZmF1bHRzQ29udGV4dC5wZXJzaXN0ZW50VHlwZShmdWxseVF1YWxpZmllZFR5cGVOYW1lKTsKKwkJCQlyZXR1cm4gWG1sQXR0cmlidXRlQ29udGV4dC50aGlzLmdldERlZmF1bHQoa2V5LCBnZXRXcmFwcGVkRGVmYXVsdHNDb250ZXh0KCkpOwogCQkJfQogCQl9OwogCX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9wbGF0Zm9ybS9YbWxSZWxhdGlvbnNoaXBNYXBwaW5nQ29udGV4dC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3BsYXRmb3JtL1htbFJlbGF0aW9uc2hpcE1hcHBpbmdDb250ZXh0LmphdmEKaW5kZXggMjMzNjQxMi4uMjc3MmNlYiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3BsYXRmb3JtL1htbFJlbGF0aW9uc2hpcE1hcHBpbmdDb250ZXh0LmphdmEKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3BsYXRmb3JtL1htbFJlbGF0aW9uc2hpcE1hcHBpbmdDb250ZXh0LmphdmEKQEAgLTI0LDcgKzI0LDcgQEAKIAl9CiAJCiAJcHJvdGVjdGVkIElFbnRpdHkgdGFyZ2V0RW50aXR5KERlZmF1bHRzQ29udGV4dCBkZWZhdWx0c0NvbnRleHQpIHsKLQkJU3RyaW5nIHRhcmdldEVudGl0eSA9IHJlbGF0aW9uc2hpcE1hcHBpbmcoKS5mdWxseVF1YWxpZmllZFRhcmdldEVudGl0eSgpOworCQlTdHJpbmcgdGFyZ2V0RW50aXR5ID0gcmVsYXRpb25zaGlwTWFwcGluZygpLmZ1bGx5UXVhbGlmaWVkVGFyZ2V0RW50aXR5KGRlZmF1bHRzQ29udGV4dC5hc3RSb290KCkpOwogCQlpZiAodGFyZ2V0RW50aXR5ID09IG51bGwpIHsKIAkJCXJldHVybiBudWxsOwogCQl9CkBAIC03MCw3ICs3MCw3IEBACiAJCQlpZiAoYXR0cmlidXRlICE9IG51bGwpIHsKIAkJCQlJVHlwZSBpVHlwZSA9IHJlbGF0aW9uc2hpcE1hcHBpbmcoKS5nZXRQZXJzaXN0ZW50VHlwZSgpLmZpbmRKZHRUeXBlKCk7CiAJCQkJaWYgKGlUeXBlICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIHJlbGF0aW9uc2hpcE1hcHBpbmcoKS5qYXZhRGVmYXVsdFRhcmdldEVudGl0eSgpOworCQkJCQlyZXR1cm4gcmVsYXRpb25zaGlwTWFwcGluZygpLmphdmFEZWZhdWx0VGFyZ2V0RW50aXR5KGRlZmF1bHRzQ29udGV4dC5hc3RSb290KCkpOwogCQkJCX0KIAkJCX0KIAkJfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3BsYXRmb3JtL1htbFR5cGVDb250ZXh0LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcGxhdGZvcm0vWG1sVHlwZUNvbnRleHQuamF2YQppbmRleCAyNGM4MmQzLi42ZmU0NThmIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcGxhdGZvcm0vWG1sVHlwZUNvbnRleHQuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcGxhdGZvcm0vWG1sVHlwZUNvbnRleHQuamF2YQpAQCAtMTMsOSArMTMsOSBAQAogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklNYXBwaW5nS2V5czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JUGVyc2lzdGVudFR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLklKYXZhVHlwZU1hcHBpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7CkBAIC0xNzQsMTQgKzE3NCwxNSBAQAogCQl0aGlzLmphdmFUeXBlQ29udGV4dCA9IG51bGw7CiAJfQogCQotCXB1YmxpYyBEZWZhdWx0c0NvbnRleHQgd3JhcERlZmF1bHRzQ29udGV4dChmaW5hbCBEZWZhdWx0c0NvbnRleHQgZGVmYXVsdHNDb250ZXh0KSB7Ci0JCXJldHVybiBuZXcgRGVmYXVsdHNDb250ZXh0KCkgeworCXB1YmxpYyBEZWZhdWx0c0NvbnRleHQgd3JhcERlZmF1bHRzQ29udGV4dChEZWZhdWx0c0NvbnRleHQgZGVmYXVsdHNDb250ZXh0KSB7CisJCXJldHVybiBuZXcgRGVmYXVsdHNDb250ZXh0V3JhcHBlcihkZWZhdWx0c0NvbnRleHQpIHsKIAkJCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdChTdHJpbmcga2V5KSB7Ci0JCQkJcmV0dXJuIFhtbFR5cGVDb250ZXh0LnRoaXMuZ2V0RGVmYXVsdChrZXksIGRlZmF1bHRzQ29udGV4dCk7CisJCQkJcmV0dXJuIFhtbFR5cGVDb250ZXh0LnRoaXMuZ2V0RGVmYXVsdChrZXksIGdldFdyYXBwZWREZWZhdWx0c0NvbnRleHQoKSk7CiAJCQl9Ci0JCQkKLQkJCXB1YmxpYyBJUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUoU3RyaW5nIGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUpIHsKLQkJCQlyZXR1cm4gZGVmYXVsdHNDb250ZXh0LnBlcnNpc3RlbnRUeXBlKGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUpOworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QoKSB7CisJCQkJLy9UT0RPIG5lZWQgdG8gc29tZWhvdyBub3QgYnVpbGQgdGhpcyBhc3RSb290IGV2ZXJ5IHRpbWUuICBjYW4gd2Ugc3RvcmUgdGhlIEphdmFQZXJzaXN0ZW50VHlwZSB3ZSBhcmUgZmluZGluZz8KKwkJCQlyZXR1cm4gamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0VHlwZSgpLmFzdFJvb3QoKTsKIAkJCX0KIAkJfTsKIAl9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9HZW5lcmljSnBhRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvR2VuZXJpY0pwYUZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWEyNTk0Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvR2VuZXJpY0pwYUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDE1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24gYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnBsYXRmb3JtLmdlbmVyaWM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5wbGF0Zm9ybS5CYXNlSnBhRmFjdG9yeTsKKworcHVibGljIGNsYXNzIEdlbmVyaWNKcGFGYWN0b3J5IGV4dGVuZHMgQmFzZUpwYUZhY3RvcnkKK3t9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9HZW5lcmljUGxhdGZvcm0uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL0dlbmVyaWNQbGF0Zm9ybS5qYXZhCmluZGV4IDU3NzYwODEuLmU5MzQzZmUgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL0dlbmVyaWNQbGF0Zm9ybS5qYXZhCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL0dlbmVyaWNQbGF0Zm9ybS5qYXZhCkBAIC05LDEwICs5LDE2IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5wbGF0Zm9ybS5nZW5lcmljOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSUpwYUZhY3Rvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucGxhdGZvcm0uQmFzZUpwYVBsYXRmb3JtOwogCiBwdWJsaWMgY2xhc3MgR2VuZXJpY1BsYXRmb3JtIAogCWV4dGVuZHMgQmFzZUpwYVBsYXRmb3JtCiB7CiAJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSUQgPSAiZ2VuZXJpYyI7CisJCisJcHJvdGVjdGVkIElKcGFGYWN0b3J5IGNyZWF0ZUpwYUZhY3RvcnkoKSB7CisJCXJldHVybiBuZXcgR2VuZXJpY0pwYUZhY3RvcnkoKTsKKwl9CisKIH0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9jb21tb24vdHJhbnNsYXRvcnMvQm9vbGVhblRyYW5zbGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9jb21tb24vdHJhbnNsYXRvcnMvQm9vbGVhblRyYW5zbGF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjZlMDIxCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL2NvbW1vbi90cmFuc2xhdG9ycy9Cb29sZWFuVHJhbnNsYXRvci5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCisgKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKKyAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5jb21tb24udHJhbnNsYXRvcnM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7CisKK3B1YmxpYyBjbGFzcyBCb29sZWFuVHJhbnNsYXRvciBleHRlbmRzIFRyYW5zbGF0b3IKK3sKKwlwdWJsaWMgQm9vbGVhblRyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUpIHsKKwkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlLCBCT09MRUFOX0ZFQVRVUkUgfCBCT09MRUFOX0xPV0VSQ0FTRSk7CisJfQorCQorCXB1YmxpYyBCb29sZWFuVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSwgaW50IHN0eWxlKSB7CisJCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBhRmVhdHVyZSwgQk9PTEVBTl9GRUFUVVJFIHwgQk9PTEVBTl9MT1dFUkNBU0UgfCBzdHlsZSk7CisJfQorCQkKKwlwdWJsaWMgT2JqZWN0IGNvbnZlcnRTdHJpbmdUb1ZhbHVlKFN0cmluZyBzdHJWYWx1ZSwgRU9iamVjdCBvd25lcikgeworCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHN0clZhbHVlKTsKKwl9CisJCisJcHVibGljIFN0cmluZyBjb252ZXJ0VmFsdWVUb1N0cmluZyhPYmplY3QgdmFsdWUsIEVPYmplY3Qgb3duZXIpIHsKKwkJcmV0dXJuICgoQm9vbGVhbikgdmFsdWUpLnRvU3RyaW5nKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL3BlcnNpc3RlbmNlL0phdmFDbGFzc1JlZi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL3BlcnNpc3RlbmNlL0phdmFDbGFzc1JlZi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NWJkZTMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvcGVyc2lzdGVuY2UvSmF2YUNsYXNzUmVmLmphdmEKQEAgLTAsMCArMSwxOTQgQEAKKy8qKgorICogPGNvcHlyaWdodD4KKyAqIDwvY29weXJpZ2h0PgorICoKKyAqICRJZDogSmF2YUNsYXNzUmVmLmphdmEsdiAxLjEgMjAwNy8wNy8zMCAyMDoxMzo0NiBwZnVsbGJyaWdodCBFeHAgJAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5KYXZhIENsYXNzIFJlZjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5KYXZhQ2xhc3NSZWYjZ2V0SmF2YUNsYXNzIDxlbT5KYXZhIENsYXNzPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBhY2thZ2UjZ2V0SmF2YUNsYXNzUmVmKCkKKyAqIEBtb2RlbCBraW5kPSJjbGFzcyIKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIEphdmFDbGFzc1JlZiBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgRU9iamVjdAoreworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRKYXZhQ2xhc3MoKSA8ZW0+SmF2YSBDbGFzczwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0SmF2YUNsYXNzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBX0NMQVNTX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEphdmFDbGFzcygpIDxlbT5KYXZhIENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRKYXZhQ2xhc3MoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgamF2YUNsYXNzID0gSkFWQV9DTEFTU19FREVGQVVMVDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBKYXZhQ2xhc3NSZWYoKQorCXsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCisJeworCQlyZXR1cm4gUGVyc2lzdGVuY2VQYWNrYWdlLkxpdGVyYWxzLkpBVkFfQ0xBU1NfUkVGOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkphdmEgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkphdmEgQ2xhc3M8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SmF2YSBDbGFzczwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0SmF2YUNsYXNzKFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGFja2FnZSNnZXRKYXZhQ2xhc3NSZWZfSmF2YUNsYXNzKCkKKwkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgb3JkZXJlZD0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0SmF2YUNsYXNzKCkKKwl7CisJCXJldHVybiBqYXZhQ2xhc3M7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UuSmF2YUNsYXNzUmVmI2dldEphdmFDbGFzcyA8ZW0+SmF2YSBDbGFzczwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SmF2YSBDbGFzczwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0SmF2YUNsYXNzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0SmF2YUNsYXNzKFN0cmluZyBuZXdKYXZhQ2xhc3MpCisJeworCQlTdHJpbmcgb2xkSmF2YUNsYXNzID0gamF2YUNsYXNzOworCQlqYXZhQ2xhc3MgPSBuZXdKYXZhQ2xhc3M7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFBlcnNpc3RlbmNlUGFja2FnZS5KQVZBX0NMQVNTX1JFRl9fSkFWQV9DTEFTUywgb2xkSmF2YUNsYXNzLCBqYXZhQ2xhc3MpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLkpBVkFfQ0xBU1NfUkVGX19KQVZBX0NMQVNTOgorCQkJCXJldHVybiBnZXRKYXZhQ2xhc3MoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5KQVZBX0NMQVNTX1JFRl9fSkFWQV9DTEFTUzoKKwkJCQlzZXRKYXZhQ2xhc3MoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuSkFWQV9DTEFTU19SRUZfX0pBVkFfQ0xBU1M6CisJCQkJc2V0SmF2YUNsYXNzKEpBVkFfQ0xBU1NfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5KQVZBX0NMQVNTX1JFRl9fSkFWQV9DTEFTUzoKKwkJCQlyZXR1cm4gSkFWQV9DTEFTU19FREVGQVVMVCA9PSBudWxsID8gamF2YUNsYXNzICE9IG51bGwgOiAhSkFWQV9DTEFTU19FREVGQVVMVC5lcXVhbHMoamF2YUNsYXNzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpCisJeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAoamF2YUNsYXNzOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChqYXZhQ2xhc3MpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKK30gLy8gSmF2YUNsYXNzUmVmCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvcGVyc2lzdGVuY2UvTWFwcGluZ0ZpbGVSZWYuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9wZXJzaXN0ZW5jZS9NYXBwaW5nRmlsZVJlZi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjZGI1MTMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvcGVyc2lzdGVuY2UvTWFwcGluZ0ZpbGVSZWYuamF2YQpAQCAtMCwwICsxLDE5NSBAQAorLyoqCisgKiA8Y29weXJpZ2h0PgorICogPC9jb3B5cmlnaHQ+CisgKgorICogJElkOiBNYXBwaW5nRmlsZVJlZi5qYXZhLHYgMS4xIDIwMDcvMDcvMzAgMjA6MTM6NDYgcGZ1bGxicmlnaHQgRXhwICQKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWFwcGluZyBGaWxlIFJlZjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5NYXBwaW5nRmlsZVJlZiNnZXRGaWxlTmFtZSA8ZW0+RmlsZSBOYW1lPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBhY2thZ2UjZ2V0TWFwcGluZ0ZpbGVSZWYoKQorICogQG1vZGVsIGtpbmQ9ImNsYXNzIgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgTWFwcGluZ0ZpbGVSZWYgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEVPYmplY3QKK3sKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmlsZU5hbWUoKSA8ZW0+RmlsZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRGaWxlTmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9OQU1FX0VERUZBVUxUID0gIiI7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaWxlTmFtZSgpIDxlbT5GaWxlIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEZpbGVOYW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGZpbGVOYW1lID0gRklMRV9OQU1FX0VERUZBVUxUOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIE1hcHBpbmdGaWxlUmVmKCkKKwl7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQorCXsKKwkJcmV0dXJuIFBlcnNpc3RlbmNlUGFja2FnZS5MaXRlcmFscy5NQVBQSU5HX0ZJTEVfUkVGOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZpbGUgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkZpbGUgTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaWxlIE5hbWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldEZpbGVOYW1lKFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGFja2FnZSNnZXRNYXBwaW5nRmlsZVJlZl9GaWxlTmFtZSgpCisJICogQG1vZGVsIGRlZmF1bHQ9IiIgdW5pcXVlPSJmYWxzZSIgb3JkZXJlZD0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZU5hbWUoKQorCXsKKwkJcmV0dXJuIGZpbGVOYW1lOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLk1hcHBpbmdGaWxlUmVmI2dldEZpbGVOYW1lIDxlbT5GaWxlIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZpbGUgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0RmlsZU5hbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRGaWxlTmFtZShTdHJpbmcgbmV3RmlsZU5hbWUpCisJeworCQlTdHJpbmcgb2xkRmlsZU5hbWUgPSBmaWxlTmFtZTsKKwkJZmlsZU5hbWUgPSBuZXdGaWxlTmFtZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUGVyc2lzdGVuY2VQYWNrYWdlLk1BUFBJTkdfRklMRV9SRUZfX0ZJTEVfTkFNRSwgb2xkRmlsZU5hbWUsIGZpbGVOYW1lKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5NQVBQSU5HX0ZJTEVfUkVGX19GSUxFX05BTUU6CisJCQkJcmV0dXJuIGdldEZpbGVOYW1lKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuTUFQUElOR19GSUxFX1JFRl9fRklMRV9OQU1FOgorCQkJCXNldEZpbGVOYW1lKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLk1BUFBJTkdfRklMRV9SRUZfX0ZJTEVfTkFNRToKKwkJCQlzZXRGaWxlTmFtZShGSUxFX05BTUVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5NQVBQSU5HX0ZJTEVfUkVGX19GSUxFX05BTUU6CisJCQkJcmV0dXJuIEZJTEVfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gZmlsZU5hbWUgIT0gbnVsbCA6ICFGSUxFX05BTUVfRURFRkFVTFQuZXF1YWxzKGZpbGVOYW1lKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpCisJeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAoZmlsZU5hbWU6ICIpOworCQlyZXN1bHQuYXBwZW5kKGZpbGVOYW1lKTsKKwkJcmVzdWx0LmFwcGVuZCgnKScpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCit9IC8vIE1hcHBpbmdGaWxlUmVmCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ZTk1OWIKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2UuamF2YQpAQCAtMCwwICsxLDI2NSBAQAorLyoqCisgKiA8Y29weXJpZ2h0PgorICogPC9jb3B5cmlnaHQ+CisgKgorICogJElkOiBQZXJzaXN0ZW5jZS5qYXZhLHYgMS4xIDIwMDcvMDcvMzAgMjA6MTM6NDYgcGZ1bGxicmlnaHQgRXhwICQKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZTsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QZXJzaXN0ZW5jZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZSNnZXRQZXJzaXN0ZW5jZVVuaXRzIDxlbT5QZXJzaXN0ZW5jZSBVbml0czwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2UjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQYWNrYWdlI2dldFBlcnNpc3RlbmNlKCkKKyAqIEBtb2RlbCBraW5kPSJjbGFzcyIKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBFT2JqZWN0Cit7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGVyc2lzdGVuY2VVbml0cygpIDxlbT5QZXJzaXN0ZW5jZSBVbml0czwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRQZXJzaXN0ZW5jZVVuaXRzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8UGVyc2lzdGVuY2VVbml0PiBwZXJzaXN0ZW5jZVVuaXRzOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZlcnNpb24oKSA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VmVyc2lvbigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTl9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWZXJzaW9uKCkgPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFZlcnNpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgdmVyc2lvbiA9IFZFUlNJT05fRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUGVyc2lzdGVuY2UoKQorCXsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCisJeworCQlyZXR1cm4gUGVyc2lzdGVuY2VQYWNrYWdlLkxpdGVyYWxzLlBFUlNJU1RFTkNFOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZlcnNpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmVyc2lvbjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0VmVyc2lvbihTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBhY2thZ2UjZ2V0UGVyc2lzdGVuY2VfVmVyc2lvbigpCisJICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5WZXJzaW9uIiByZXF1aXJlZD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkKKwl7CisJCXJldHVybiB2ZXJzaW9uOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlI2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZlcnNpb248L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldFZlcnNpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKFN0cmluZyBuZXdWZXJzaW9uKQorCXsKKwkJU3RyaW5nIG9sZFZlcnNpb24gPSB2ZXJzaW9uOworCQl2ZXJzaW9uID0gbmV3VmVyc2lvbjsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUGVyc2lzdGVuY2VQYWNrYWdlLlBFUlNJU1RFTkNFX19WRVJTSU9OLCBvbGRWZXJzaW9uLCB2ZXJzaW9uKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGVyc2lzdGVuY2UgVW5pdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXR9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGVyc2lzdGVuY2UgVW5pdHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QZXJzaXN0ZW5jZSBVbml0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGFja2FnZSNnZXRQZXJzaXN0ZW5jZV9QZXJzaXN0ZW5jZVVuaXRzKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFTGlzdDxQZXJzaXN0ZW5jZVVuaXQ+IGdldFBlcnNpc3RlbmNlVW5pdHMoKQorCXsKKwkJaWYgKHBlcnNpc3RlbmNlVW5pdHMgPT0gbnVsbCkKKwkJeworCQkJcGVyc2lzdGVuY2VVbml0cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxQZXJzaXN0ZW5jZVVuaXQ+KFBlcnNpc3RlbmNlVW5pdC5jbGFzcywgdGhpcywgUGVyc2lzdGVuY2VQYWNrYWdlLlBFUlNJU1RFTkNFX19QRVJTSVNURU5DRV9VTklUUyk7CisJCX0KKwkJcmV0dXJuIHBlcnNpc3RlbmNlVW5pdHM7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5QRVJTSVNURU5DRV9fUEVSU0lTVEVOQ0VfVU5JVFM6CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRQZXJzaXN0ZW5jZVVuaXRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5QRVJTSVNURU5DRV9fUEVSU0lTVEVOQ0VfVU5JVFM6CisJCQkJcmV0dXJuIGdldFBlcnNpc3RlbmNlVW5pdHMoKTsKKwkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlBFUlNJU1RFTkNFX19WRVJTSU9OOgorCQkJCXJldHVybiBnZXRWZXJzaW9uKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuUEVSU0lTVEVOQ0VfX1BFUlNJU1RFTkNFX1VOSVRTOgorCQkJCWdldFBlcnNpc3RlbmNlVW5pdHMoKS5jbGVhcigpOworCQkJCWdldFBlcnNpc3RlbmNlVW5pdHMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFBlcnNpc3RlbmNlVW5pdD4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlBFUlNJU1RFTkNFX19WRVJTSU9OOgorCQkJCXNldFZlcnNpb24oKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuUEVSU0lTVEVOQ0VfX1BFUlNJU1RFTkNFX1VOSVRTOgorCQkJCWdldFBlcnNpc3RlbmNlVW5pdHMoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlBFUlNJU1RFTkNFX19WRVJTSU9OOgorCQkJCXNldFZlcnNpb24oVkVSU0lPTl9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlBFUlNJU1RFTkNFX19QRVJTSVNURU5DRV9VTklUUzoKKwkJCQlyZXR1cm4gcGVyc2lzdGVuY2VVbml0cyAhPSBudWxsICYmICFwZXJzaXN0ZW5jZVVuaXRzLmlzRW1wdHkoKTsKKwkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlBFUlNJU1RFTkNFX19WRVJTSU9OOgorCQkJCXJldHVybiBWRVJTSU9OX0VERUZBVUxUID09IG51bGwgPyB2ZXJzaW9uICE9IG51bGwgOiAhVkVSU0lPTl9FREVGQVVMVC5lcXVhbHModmVyc2lvbik7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorCXsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKHZlcnNpb246ICIpOworCQlyZXN1bHQuYXBwZW5kKHZlcnNpb24pOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKK30gLy8gUGVyc2lzdGVuY2UKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZUZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmEyODNmCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMjg1IEBACisvKioKKyAqIDxjb3B5cmlnaHQ+CisgKiA8L2NvcHlyaWdodD4KKyAqCisgKiAkSWQ6IFBlcnNpc3RlbmNlRmFjdG9yeS5qYXZhLHYgMS4xIDIwMDcvMDcvMzAgMjA6MTM6NDYgcGZ1bGxicmlnaHQgRXhwICQKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5wbHVnaW4uRWNvcmVQbHVnaW47CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIFRoZSA8Yj5GYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgorICogSXQgcHJvdmlkZXMgYSBjcmVhdGUgbWV0aG9kIGZvciBlYWNoIG5vbi1hYnN0cmFjdCBjbGFzcyBvZiB0aGUgbW9kZWwuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQYWNrYWdlCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZUZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeUltcGwKK3sKKwkvKioKKwkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgUGVyc2lzdGVuY2VGYWN0b3J5IGVJTlNUQU5DRSA9IGluaXQoKTsKKworCS8qKgorCSAqIENyZWF0ZXMgdGhlIGRlZmF1bHQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFBlcnNpc3RlbmNlRmFjdG9yeSBpbml0KCkKKwl7CisJCXRyeQorCQl7CisJCQlQZXJzaXN0ZW5jZUZhY3RvcnkgdGhlUGVyc2lzdGVuY2VGYWN0b3J5ID0gKFBlcnNpc3RlbmNlRmFjdG9yeSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFRmFjdG9yeSgianB0LnBlcnNpc3RlbmNlLnhtaSIpOyAKKwkJCWlmICh0aGVQZXJzaXN0ZW5jZUZhY3RvcnkgIT0gbnVsbCkKKwkJCXsKKwkJCQlyZXR1cm4gdGhlUGVyc2lzdGVuY2VGYWN0b3J5OworCQkJfQorCQl9CisJCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKQorCQl7CisJCQlFY29yZVBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKKwkJfQorCQlyZXR1cm4gbmV3IFBlcnNpc3RlbmNlRmFjdG9yeSgpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFBlcnNpc3RlbmNlRmFjdG9yeSgpCisJeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgZUNsYXNzKQorCXsKKwkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpCisJCXsKKwkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlBFUlNJU1RFTkNFOiByZXR1cm4gY3JlYXRlUGVyc2lzdGVuY2UoKTsKKwkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlBFUlNJU1RFTkNFX1VOSVQ6IHJldHVybiBjcmVhdGVQZXJzaXN0ZW5jZVVuaXQoKTsKKwkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLk1BUFBJTkdfRklMRV9SRUY6IHJldHVybiBjcmVhdGVNYXBwaW5nRmlsZVJlZigpOworCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuSkFWQV9DTEFTU19SRUY6IHJldHVybiBjcmVhdGVKYXZhQ2xhc3NSZWYoKTsKKwkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlBST1BFUlRJRVM6IHJldHVybiBjcmVhdGVQcm9wZXJ0aWVzKCk7CisJCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5QUk9QRVJUWTogcmV0dXJuIGNyZWF0ZVByb3BlcnR5KCk7CisJCQlkZWZhdWx0OgorCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7CisJCX0KKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGNyZWF0ZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkKKwl7CisJCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKQorCQl7CisJCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5QRVJTSVNURU5DRV9VTklUX1RSQU5TQUNUSU9OX1RZUEU6CisJCQkJcmV0dXJuIGNyZWF0ZVBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOworCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuUEVSU0lTVEVOQ0VfVU5JVF9UUkFOU0FDVElPTl9UWVBFX09CSkVDVDoKKwkJCQlyZXR1cm4gY3JlYXRlUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlT2JqZWN0RnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7CisJCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5WRVJTSU9OOgorCQkJCXJldHVybiBjcmVhdGVWZXJzaW9uRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7CisJCQlkZWZhdWx0OgorCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7CisJCX0KKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkKKwl7CisJCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKQorCQl7CisJCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5QRVJTSVNURU5DRV9VTklUX1RSQU5TQUNUSU9OX1RZUEU6CisJCQkJcmV0dXJuIGNvbnZlcnRQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOworCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuUEVSU0lTVEVOQ0VfVU5JVF9UUkFOU0FDVElPTl9UWVBFX09CSkVDVDoKKwkJCQlyZXR1cm4gY29udmVydFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZU9iamVjdFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7CisJCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5WRVJTSU9OOgorCQkJCXJldHVybiBjb252ZXJ0VmVyc2lvblRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7CisJCQlkZWZhdWx0OgorCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7CisJCX0KKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgUGVyc2lzdGVuY2UgY3JlYXRlUGVyc2lzdGVuY2UoKQorCXsKKwkJUGVyc2lzdGVuY2UgcGVyc2lzdGVuY2UgPSBuZXcgUGVyc2lzdGVuY2UoKTsKKwkJcmV0dXJuIHBlcnNpc3RlbmNlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXQgY3JlYXRlUGVyc2lzdGVuY2VVbml0KCkKKwl7CisJCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBuZXcgUGVyc2lzdGVuY2VVbml0KCk7CisJCXJldHVybiBwZXJzaXN0ZW5jZVVuaXQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE1hcHBpbmdGaWxlUmVmIGNyZWF0ZU1hcHBpbmdGaWxlUmVmKCkKKwl7CisJCU1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gbmV3IE1hcHBpbmdGaWxlUmVmKCk7CisJCXJldHVybiBtYXBwaW5nRmlsZVJlZjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSmF2YUNsYXNzUmVmIGNyZWF0ZUphdmFDbGFzc1JlZigpCisJeworCQlKYXZhQ2xhc3NSZWYgamF2YUNsYXNzUmVmID0gbmV3IEphdmFDbGFzc1JlZigpOworCQlyZXR1cm4gamF2YUNsYXNzUmVmOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBQcm9wZXJ0aWVzIGNyZWF0ZVByb3BlcnRpZXMoKQorCXsKKwkJUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKKwkJcmV0dXJuIHByb3BlcnRpZXM7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFByb3BlcnR5IGNyZWF0ZVByb3BlcnR5KCkKKwl7CisJCVByb3BlcnR5IHByb3BlcnR5ID0gbmV3IFByb3BlcnR5KCk7CisJCXJldHVybiBwcm9wZXJ0eTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIGNyZWF0ZVBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkKKwl7CisJCVBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSByZXN1bHQgPSBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUuZ2V0KGluaXRpYWxWYWx1ZSk7CisJCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgY29udmVydFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKQorCXsKKwkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVudW1lcmF0b3IgY3JlYXRlUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlT2JqZWN0RnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKQorCXsKKwkJcmV0dXJuIChFbnVtZXJhdG9yKXN1cGVyLmNyZWF0ZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgY29udmVydFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZU9iamVjdFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKQorCXsKKwkJcmV0dXJuIHN1cGVyLmNvbnZlcnRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgY3JlYXRlVmVyc2lvbkZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkKKwl7CisJCXJldHVybiAoU3RyaW5nKXN1cGVyLmNyZWF0ZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgY29udmVydFZlcnNpb25Ub1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkKKwl7CisJCXJldHVybiBzdXBlci5jb252ZXJ0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgUGVyc2lzdGVuY2VQYWNrYWdlIGdldFBlcnNpc3RlbmNlUGFja2FnZSgpCisJeworCQlyZXR1cm4gKFBlcnNpc3RlbmNlUGFja2FnZSlnZXRFUGFja2FnZSgpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGRlcHJlY2F0ZWQKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQERlcHJlY2F0ZWQKKwlwdWJsaWMgc3RhdGljIFBlcnNpc3RlbmNlUGFja2FnZSBnZXRQYWNrYWdlKCkKKwl7CisJCXJldHVybiBQZXJzaXN0ZW5jZVBhY2thZ2UuZUlOU1RBTkNFOworCX0KKworfSAvL1BlcnNpc3RlbmNlRmFjdG9yeQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlUGFja2FnZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlUGFja2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwZmFmOTUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VQYWNrYWdlLmphdmEKQEAgLTAsMCArMSwxMjg1IEBACisvKioKKyAqIDxjb3B5cmlnaHQ+CisgKiA8L2NvcHlyaWdodD4KKyAqCisgKiAkSWQ6IFBlcnNpc3RlbmNlUGFja2FnZS5qYXZhLHYgMS4xIDIwMDcvMDcvMzAgMjA6MTM6NDYgcGZ1bGxicmlnaHQgRXhwICQKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5YTUxUeXBlUGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogVGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGUgbW9kZWwuCisgKiBJdCBjb250YWlucyBhY2Nlc3NvcnMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdG8gcmVwcmVzZW50CisgKiA8dWw+CisgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+CisgKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgorICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+CisgKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgorICogPC91bD4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUZhY3RvcnkKKyAqIEBtb2RlbCBraW5kPSJwYWNrYWdlIgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2VJbXBsCit7CisJLyoqCisJICogVGhlIHBhY2thZ2UgbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBlTkFNRSA9ICJwZXJzaXN0ZW5jZSI7CisKKwkvKioKKwkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgVVJJLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGVOU19VUkkgPSAianB0LnBlcnNpc3RlbmNlLnhtaSI7CisKKwkvKioKKwkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBlTlNfUFJFRklYID0gIm9yZy5lY2xpcHNlLmpwdC5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlIjsKKworCS8qKgorCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBQZXJzaXN0ZW5jZVBhY2thZ2UgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQYWNrYWdlLmluaXQoKTsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2UgPGVtPlBlcnNpc3RlbmNlPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2UKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGFja2FnZSNnZXRQZXJzaXN0ZW5jZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBFUlNJU1RFTkNFID0gMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBVbml0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQRVJTSVNURU5DRV9fUEVSU0lTVEVOQ0VfVU5JVFMgPSAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBFUlNJU1RFTkNFX19WRVJTSU9OID0gMTsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5QZXJzaXN0ZW5jZTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBFUlNJU1RFTkNFX0ZFQVRVUkVfQ09VTlQgPSAyOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQgPGVtPlVuaXQ8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGFja2FnZSNnZXRQZXJzaXN0ZW5jZVVuaXQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQRVJTSVNURU5DRV9VTklUID0gMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEVSU0lTVEVOQ0VfVU5JVF9fREVTQ1JJUFRJT04gPSAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3ZpZGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQRVJTSVNURU5DRV9VTklUX19QUk9WSURFUiA9IDE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SnRhIERhdGEgU291cmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQRVJTSVNURU5DRV9VTklUX19KVEFfREFUQV9TT1VSQ0UgPSAyOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vbiBKdGEgRGF0YSBTb3VyY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBFUlNJU1RFTkNFX1VOSVRfX05PTl9KVEFfREFUQV9TT1VSQ0UgPSAzOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcHBpbmcgRmlsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEVSU0lTVEVOQ0VfVU5JVF9fTUFQUElOR19GSUxFUyA9IDQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SmFyIEZpbGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBFUlNJU1RFTkNFX1VOSVRfX0pBUl9GSUxFUyA9IDU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2xhc3NlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQRVJTSVNURU5DRV9VTklUX19DTEFTU0VTID0gNjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGNsdWRlIFVubGlzdGVkIENsYXNzZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBFUlNJU1RFTkNFX1VOSVRfX0VYQ0xVREVfVU5MSVNURURfQ0xBU1NFUyA9IDc7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEVSU0lTVEVOQ0VfVU5JVF9fUFJPUEVSVElFUyA9IDg7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEVSU0lTVEVOQ0VfVU5JVF9fTkFNRSA9IDk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHJhbnNhY3Rpb24gVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEVSU0lTVEVOQ0VfVU5JVF9fVFJBTlNBQ1RJT05fVFlQRSA9IDEwOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlVuaXQ8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQRVJTSVNURU5DRV9VTklUX0ZFQVRVUkVfQ09VTlQgPSAxMTsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UuTWFwcGluZ0ZpbGVSZWYgPGVtPk1hcHBpbmcgRmlsZSBSZWY8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5NYXBwaW5nRmlsZVJlZgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQYWNrYWdlI2dldE1hcHBpbmdGaWxlUmVmKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFQUElOR19GSUxFX1JFRiA9IDI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmlsZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVBQSU5HX0ZJTEVfUkVGX19GSUxFX05BTUUgPSAwOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk1hcHBpbmcgRmlsZSBSZWY8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVBQSU5HX0ZJTEVfUkVGX0ZFQVRVUkVfQ09VTlQgPSAxOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5KYXZhQ2xhc3NSZWYgPGVtPkphdmEgQ2xhc3MgUmVmPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UuSmF2YUNsYXNzUmVmCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBhY2thZ2UjZ2V0SmF2YUNsYXNzUmVmKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9DTEFTU19SRUYgPSAzOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkphdmEgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpBVkFfQ0xBU1NfUkVGX19KQVZBX0NMQVNTID0gMDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5KYXZhIENsYXNzIFJlZjwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpBVkFfQ0xBU1NfUkVGX0ZFQVRVUkVfQ09VTlQgPSAxOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5Qcm9wZXJ0aWVzIDxlbT5Qcm9wZXJ0aWVzPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UuUHJvcGVydGllcworCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQYWNrYWdlI2dldFByb3BlcnRpZXMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUSUVTID0gNDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRJRVNfX1BST1BFUlRJRVMgPSAwOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlByb3BlcnRpZXM8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUSUVTX0ZFQVRVUkVfQ09VTlQgPSAxOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5Qcm9wZXJ0eSA8ZW0+UHJvcGVydHk8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5Qcm9wZXJ0eQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQYWNrYWdlI2dldFByb3BlcnR5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFkgPSA1OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX19OQU1FID0gMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfX1ZBTFVFID0gMTsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Qcm9wZXJ0eTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0ZFQVRVUkVfQ09VTlQgPSAyOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgPGVtPlVuaXQgVHJhbnNhY3Rpb24gVHlwZTwvZW0+fScgZW51bS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBhY2thZ2UjZ2V0UGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEVSU0lTVEVOQ0VfVU5JVF9UUkFOU0FDVElPTl9UWVBFID0gNjsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+VW5pdCBUcmFuc2FjdGlvbiBUeXBlIE9iamVjdDwvZW0+JyBkYXRhIHR5cGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBhY2thZ2UjZ2V0UGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlT2JqZWN0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEVSU0lTVEVOQ0VfVU5JVF9UUkFOU0FDVElPTl9UWVBFX09CSkVDVCA9IDc7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlZlcnNpb248L2VtPicgZGF0YSB0eXBlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBhY2thZ2UjZ2V0VmVyc2lvbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZFUlNJT04gPSA4OworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgcGVyc2lzdGVuY2VFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgcGVyc2lzdGVuY2VVbml0RUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIG1hcHBpbmdGaWxlUmVmRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIGphdmFDbGFzc1JlZkVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBwcm9wZXJ0aWVzRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHByb3BlcnR5RUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUVudW0gcGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlRUVudW0gPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFRGF0YVR5cGUgcGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlT2JqZWN0RURhdGFUeXBlID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRURhdGFUeXBlIHZlcnNpb25FRGF0YVR5cGUgPSBudWxsOworCisJLyoqCisJICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4sIHJlZ2lzdGVyZWQgd2l0aAorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkgRVBhY2thZ2UuUmVnaXN0cnl9IGJ5IHRoZSBwYWNrYWdlCisJICogcGFja2FnZSBVUkkgdmFsdWUuCisJICogPHA+Tm90ZTogdGhlIGNvcnJlY3Qgd2F5IHRvIGNyZWF0ZSB0aGUgcGFja2FnZSBpcyB2aWEgdGhlIHN0YXRpYworCSAqIGZhY3RvcnkgbWV0aG9kIHtAbGluayAjaW5pdCBpbml0KCl9LCB3aGljaCBhbHNvIHBlcmZvcm1zCisJICogaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UsIG9yIHJldHVybnMgdGhlIHJlZ2lzdGVyZWQgcGFja2FnZSwKKwkgKiBpZiBvbmUgYWxyZWFkeSBleGlzdHMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQYWNrYWdlI2VOU19VUkkKKwkgKiBAc2VlICNpbml0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBQZXJzaXN0ZW5jZVBhY2thZ2UoKQorCXsKKwkJc3VwZXIoZU5TX1VSSSwgUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOworCisJLyoqCisJICogQ3JlYXRlcywgcmVnaXN0ZXJzLCBhbmQgaW5pdGlhbGl6ZXMgdGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGlzCisJICogbW9kZWwsIGFuZCBmb3IgYW55IG90aGVycyB1cG9uIHdoaWNoIGl0IGRlcGVuZHMuICBTaW1wbGUKKwkgKiBkZXBlbmRlbmNpZXMgYXJlIHNhdGlzZmllZCBieSBjYWxsaW5nIHRoaXMgbWV0aG9kIG9uIGFsbAorCSAqIGRlcGVuZGVudCBwYWNrYWdlcyBiZWZvcmUgZG9pbmcgYW55dGhpbmcgZWxzZS4gIFRoaXMgbWV0aG9kIGRyaXZlcworCSAqIGluaXRpYWxpemF0aW9uIGZvciBpbnRlcmRlcGVuZGVudCBwYWNrYWdlcyBkaXJlY3RseSwgaW4gcGFyYWxsZWwKKwkgKiB3aXRoIHRoaXMgcGFja2FnZSwgaXRzZWxmLgorCSAqIDxwPk9mIHRoaXMgcGFja2FnZSBhbmQgaXRzIGludGVyZGVwZW5kZW5jaWVzLCBhbGwgcGFja2FnZXMgd2hpY2gKKwkgKiBoYXZlIG5vdCB5ZXQgYmVlbiByZWdpc3RlcmVkIGJ5IHRoZWlyIFVSSSB2YWx1ZXMgYXJlIGZpcnN0IGNyZWF0ZWQKKwkgKiBhbmQgcmVnaXN0ZXJlZC4gIFRoZSBwYWNrYWdlcyBhcmUgdGhlbiBpbml0aWFsaXplZCBpbiB0d28gc3RlcHM6CisJICogbWV0YS1tb2RlbCBvYmplY3RzIGZvciBhbGwgb2YgdGhlIHBhY2thZ2VzIGFyZSBjcmVhdGVkIGJlZm9yZSBhbnkKKwkgKiBhcmUgaW5pdGlhbGl6ZWQsIHNpbmNlIG9uZSBwYWNrYWdlJ3MgbWV0YS1tb2RlbCBvYmplY3RzIG1heSByZWZlciB0bworCSAqIHRob3NlIG9mIGFub3RoZXIuCisJICogPHA+SW52b2NhdGlvbiBvZiB0aGlzIG1ldGhvZCB3aWxsIG5vdCBhZmZlY3QgYW55IHBhY2thZ2VzIHRoYXQgaGF2ZQorCSAqIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2VOU19VUkkKKwkgKiBAc2VlICNjcmVhdGVQYWNrYWdlQ29udGVudHMoKQorCSAqIEBzZWUgI2luaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFBlcnNpc3RlbmNlUGFja2FnZSBpbml0KCkKKwl7CisJCWlmIChpc0luaXRlZCkgcmV0dXJuIChQZXJzaXN0ZW5jZVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoUGVyc2lzdGVuY2VQYWNrYWdlLmVOU19VUkkpOworCisJCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKKwkJUGVyc2lzdGVuY2VQYWNrYWdlIHRoZVBlcnNpc3RlbmNlUGFja2FnZSA9IChQZXJzaXN0ZW5jZVBhY2thZ2UpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIGluc3RhbmNlb2YgUGVyc2lzdGVuY2VQYWNrYWdlID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgOiBuZXcgUGVyc2lzdGVuY2VQYWNrYWdlKCkpOworCisJCWlzSW5pdGVkID0gdHJ1ZTsKKworCQkvLyBJbml0aWFsaXplIHNpbXBsZSBkZXBlbmRlbmNpZXMKKwkJRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKKwkJWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOworCisJCS8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzCisJCXRoZVBlcnNpc3RlbmNlUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKKworCQkvLyBJbml0aWFsaXplIGNyZWF0ZWQgbWV0YS1kYXRhCisJCXRoZVBlcnNpc3RlbmNlUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CisKKwkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZAorCQl0aGVQZXJzaXN0ZW5jZVBhY2thZ2UuZnJlZXplKCk7CisKKwkJcmV0dXJuIHRoZVBlcnNpc3RlbmNlUGFja2FnZTsKKwl9CisKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlIDxlbT5QZXJzaXN0ZW5jZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QZXJzaXN0ZW5jZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0UGVyc2lzdGVuY2UoKQorCXsKKwkJcmV0dXJuIHBlcnNpc3RlbmNlRUNsYXNzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2UjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZlcnNpb248L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZSNnZXRWZXJzaW9uKCkKKwkgKiBAc2VlICNnZXRQZXJzaXN0ZW5jZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFBlcnNpc3RlbmNlX1ZlcnNpb24oKQorCXsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXBlcnNpc3RlbmNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlI2dldFBlcnNpc3RlbmNlVW5pdHMgPGVtPlBlcnNpc3RlbmNlIFVuaXRzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5QZXJzaXN0ZW5jZSBVbml0czwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlI2dldFBlcnNpc3RlbmNlVW5pdHMoKQorCSAqIEBzZWUgI2dldFBlcnNpc3RlbmNlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0UGVyc2lzdGVuY2VfUGVyc2lzdGVuY2VVbml0cygpCisJeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpcGVyc2lzdGVuY2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQgPGVtPlVuaXQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VW5pdDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFBlcnNpc3RlbmNlVW5pdCgpCisJeworCQlyZXR1cm4gcGVyc2lzdGVuY2VVbml0RUNsYXNzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0I2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0I2dldE5hbWUoKQorCSAqIEBzZWUgI2dldFBlcnNpc3RlbmNlVW5pdCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFBlcnNpc3RlbmNlVW5pdF9OYW1lKCkKKwl7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlwZXJzaXN0ZW5jZVVuaXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg5KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdCNnZXRUcmFuc2FjdGlvblR5cGUgPGVtPlRyYW5zYWN0aW9uIFR5cGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UcmFuc2FjdGlvbiBUeXBlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0I2dldFRyYW5zYWN0aW9uVHlwZSgpCisJICogQHNlZSAjZ2V0UGVyc2lzdGVuY2VVbml0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0UGVyc2lzdGVuY2VVbml0X1RyYW5zYWN0aW9uVHlwZSgpCisJeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcGVyc2lzdGVuY2VVbml0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTApOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0I2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0I2dldERlc2NyaXB0aW9uKCkKKwkgKiBAc2VlICNnZXRQZXJzaXN0ZW5jZVVuaXQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQZXJzaXN0ZW5jZVVuaXRfRGVzY3JpcHRpb24oKQorCXsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXBlcnNpc3RlbmNlVW5pdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0I2dldFByb3ZpZGVyIDxlbT5Qcm92aWRlcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlByb3ZpZGVyPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0I2dldFByb3ZpZGVyKCkKKwkgKiBAc2VlICNnZXRQZXJzaXN0ZW5jZVVuaXQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQZXJzaXN0ZW5jZVVuaXRfUHJvdmlkZXIoKQorCXsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXBlcnNpc3RlbmNlVW5pdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0I2dldEp0YURhdGFTb3VyY2UgPGVtPkp0YSBEYXRhIFNvdXJjZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkp0YSBEYXRhIFNvdXJjZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdCNnZXRKdGFEYXRhU291cmNlKCkKKwkgKiBAc2VlICNnZXRQZXJzaXN0ZW5jZVVuaXQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQZXJzaXN0ZW5jZVVuaXRfSnRhRGF0YVNvdXJjZSgpCisJeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcGVyc2lzdGVuY2VVbml0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQjZ2V0Tm9uSnRhRGF0YVNvdXJjZSA8ZW0+Tm9uIEp0YSBEYXRhIFNvdXJjZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5vbiBKdGEgRGF0YSBTb3VyY2U8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQjZ2V0Tm9uSnRhRGF0YVNvdXJjZSgpCisJICogQHNlZSAjZ2V0UGVyc2lzdGVuY2VVbml0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0UGVyc2lzdGVuY2VVbml0X05vbkp0YURhdGFTb3VyY2UoKQorCXsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXBlcnNpc3RlbmNlVW5pdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQjZ2V0TWFwcGluZ0ZpbGVzIDxlbT5NYXBwaW5nIEZpbGVzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5NYXBwaW5nIEZpbGVzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0I2dldE1hcHBpbmdGaWxlcygpCisJICogQHNlZSAjZ2V0UGVyc2lzdGVuY2VVbml0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0UGVyc2lzdGVuY2VVbml0X01hcHBpbmdGaWxlcygpCisJeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpcGVyc2lzdGVuY2VVbml0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdCNnZXRKYXJGaWxlcyA8ZW0+SmFyIEZpbGVzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5KYXIgRmlsZXM8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQjZ2V0SmFyRmlsZXMoKQorCSAqIEBzZWUgI2dldFBlcnNpc3RlbmNlVW5pdCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFBlcnNpc3RlbmNlVW5pdF9KYXJGaWxlcygpCisJeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcGVyc2lzdGVuY2VVbml0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdCNnZXRDbGFzc2VzIDxlbT5DbGFzc2VzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5DbGFzc2VzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0I2dldENsYXNzZXMoKQorCSAqIEBzZWUgI2dldFBlcnNpc3RlbmNlVW5pdCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFBlcnNpc3RlbmNlVW5pdF9DbGFzc2VzKCkKKwl7CisJCXJldHVybiAoRVJlZmVyZW5jZSlwZXJzaXN0ZW5jZVVuaXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdCNpc0V4Y2x1ZGVVbmxpc3RlZENsYXNzZXMgPGVtPkV4Y2x1ZGUgVW5saXN0ZWQgQ2xhc3NlczwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkV4Y2x1ZGUgVW5saXN0ZWQgQ2xhc3NlczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdCNpc0V4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoKQorCSAqIEBzZWUgI2dldFBlcnNpc3RlbmNlVW5pdCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFBlcnNpc3RlbmNlVW5pdF9FeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCkKKwl7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlwZXJzaXN0ZW5jZVVuaXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdCNnZXRQcm9wZXJ0aWVzIDxlbT5Qcm9wZXJ0aWVzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UHJvcGVydGllczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdCNnZXRQcm9wZXJ0aWVzKCkKKwkgKiBAc2VlICNnZXRQZXJzaXN0ZW5jZVVuaXQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQZXJzaXN0ZW5jZVVuaXRfUHJvcGVydGllcygpCisJeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpcGVyc2lzdGVuY2VVbml0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UuTWFwcGluZ0ZpbGVSZWYgPGVtPk1hcHBpbmcgRmlsZSBSZWY8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TWFwcGluZyBGaWxlIFJlZjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLk1hcHBpbmdGaWxlUmVmCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0TWFwcGluZ0ZpbGVSZWYoKQorCXsKKwkJcmV0dXJuIG1hcHBpbmdGaWxlUmVmRUNsYXNzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UuTWFwcGluZ0ZpbGVSZWYjZ2V0RmlsZU5hbWUgPGVtPkZpbGUgTmFtZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZpbGUgTmFtZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLk1hcHBpbmdGaWxlUmVmI2dldEZpbGVOYW1lKCkKKwkgKiBAc2VlICNnZXRNYXBwaW5nRmlsZVJlZigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldE1hcHBpbmdGaWxlUmVmX0ZpbGVOYW1lKCkKKwl7CisJCXJldHVybiAoRUF0dHJpYnV0ZSltYXBwaW5nRmlsZVJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLkphdmFDbGFzc1JlZiA8ZW0+SmF2YSBDbGFzcyBSZWY8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SmF2YSBDbGFzcyBSZWY8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5KYXZhQ2xhc3NSZWYKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRKYXZhQ2xhc3NSZWYoKQorCXsKKwkJcmV0dXJuIGphdmFDbGFzc1JlZkVDbGFzczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLkphdmFDbGFzc1JlZiNnZXRKYXZhQ2xhc3MgPGVtPkphdmEgQ2xhc3M8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5KYXZhIENsYXNzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UuSmF2YUNsYXNzUmVmI2dldEphdmFDbGFzcygpCisJICogQHNlZSAjZ2V0SmF2YUNsYXNzUmVmKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0SmF2YUNsYXNzUmVmX0phdmFDbGFzcygpCisJeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpamF2YUNsYXNzUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UuUHJvcGVydGllcyA8ZW0+UHJvcGVydGllczwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Qcm9wZXJ0aWVzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UuUHJvcGVydGllcworCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFByb3BlcnRpZXMoKQorCXsKKwkJcmV0dXJuIHByb3BlcnRpZXNFQ2xhc3M7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLlByb3BlcnRpZXMjZ2V0UHJvcGVydGllcyA8ZW0+UHJvcGVydGllczwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UHJvcGVydGllczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLlByb3BlcnRpZXMjZ2V0UHJvcGVydGllcygpCisJICogQHNlZSAjZ2V0UHJvcGVydGllcygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFByb3BlcnRpZXNfUHJvcGVydGllcygpCisJeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpcHJvcGVydGllc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLlByb3BlcnR5IDxlbT5Qcm9wZXJ0eTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Qcm9wZXJ0eTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLlByb3BlcnR5CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0UHJvcGVydHkoKQorCXsKKwkJcmV0dXJuIHByb3BlcnR5RUNsYXNzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UuUHJvcGVydHkjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5Qcm9wZXJ0eSNnZXROYW1lKCkKKwkgKiBAc2VlICNnZXRQcm9wZXJ0eSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb3BlcnR5X05hbWUoKQorCXsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXByb3BlcnR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5Qcm9wZXJ0eSNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYWx1ZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLlByb3BlcnR5I2dldFZhbHVlKCkKKwkgKiBAc2VlICNnZXRQcm9wZXJ0eSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb3BlcnR5X1ZhbHVlKCkKKwl7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlwcm9wZXJ0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIDxlbT5Vbml0IFRyYW5zYWN0aW9uIFR5cGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5Vbml0IFRyYW5zYWN0aW9uIFR5cGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVFbnVtIGdldFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSgpCisJeworCQlyZXR1cm4gcGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlRUVudW07CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yIDxlbT5Vbml0IFRyYW5zYWN0aW9uIFR5cGUgT2JqZWN0PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5Vbml0IFRyYW5zYWN0aW9uIFR5cGUgT2JqZWN0PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3IKKwkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0ib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3IiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFRGF0YVR5cGUgZ2V0UGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlT2JqZWN0KCkKKwl7CisJCXJldHVybiBwZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGVPYmplY3RFRGF0YVR5cGU7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPlZlcnNpb248L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlZlcnNpb248L2VtPicuCisJICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCisJICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFRGF0YVR5cGUgZ2V0VmVyc2lvbigpCisJeworCQlyZXR1cm4gdmVyc2lvbkVEYXRhVHlwZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgUGVyc2lzdGVuY2VGYWN0b3J5IGdldFBlcnNpc3RlbmNlRmFjdG9yeSgpCisJeworCQlyZXR1cm4gKFBlcnNpc3RlbmNlRmFjdG9yeSlnZXRFRmFjdG9yeUluc3RhbmNlKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBib29sZWFuIGlzQ3JlYXRlZCA9IGZhbHNlOworCisJLyoqCisJICogQ3JlYXRlcyB0aGUgbWV0YS1tb2RlbCBvYmplY3RzIGZvciB0aGUgcGFja2FnZS4gIFRoaXMgbWV0aG9kIGlzCisJICogZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGNyZWF0ZVBhY2thZ2VDb250ZW50cygpCisJeworCQlpZiAoaXNDcmVhdGVkKSByZXR1cm47CisJCWlzQ3JlYXRlZCA9IHRydWU7CisKKwkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCisJCXBlcnNpc3RlbmNlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBFUlNJU1RFTkNFKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShwZXJzaXN0ZW5jZUVDbGFzcywgUEVSU0lTVEVOQ0VfX1BFUlNJU1RFTkNFX1VOSVRTKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShwZXJzaXN0ZW5jZUVDbGFzcywgUEVSU0lTVEVOQ0VfX1ZFUlNJT04pOworCisJCXBlcnNpc3RlbmNlVW5pdEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQRVJTSVNURU5DRV9VTklUKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShwZXJzaXN0ZW5jZVVuaXRFQ2xhc3MsIFBFUlNJU1RFTkNFX1VOSVRfX0RFU0NSSVBUSU9OKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShwZXJzaXN0ZW5jZVVuaXRFQ2xhc3MsIFBFUlNJU1RFTkNFX1VOSVRfX1BST1ZJREVSKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShwZXJzaXN0ZW5jZVVuaXRFQ2xhc3MsIFBFUlNJU1RFTkNFX1VOSVRfX0pUQV9EQVRBX1NPVVJDRSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUocGVyc2lzdGVuY2VVbml0RUNsYXNzLCBQRVJTSVNURU5DRV9VTklUX19OT05fSlRBX0RBVEFfU09VUkNFKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShwZXJzaXN0ZW5jZVVuaXRFQ2xhc3MsIFBFUlNJU1RFTkNFX1VOSVRfX01BUFBJTkdfRklMRVMpOworCQljcmVhdGVFQXR0cmlidXRlKHBlcnNpc3RlbmNlVW5pdEVDbGFzcywgUEVSU0lTVEVOQ0VfVU5JVF9fSkFSX0ZJTEVTKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShwZXJzaXN0ZW5jZVVuaXRFQ2xhc3MsIFBFUlNJU1RFTkNFX1VOSVRfX0NMQVNTRVMpOworCQljcmVhdGVFQXR0cmlidXRlKHBlcnNpc3RlbmNlVW5pdEVDbGFzcywgUEVSU0lTVEVOQ0VfVU5JVF9fRVhDTFVERV9VTkxJU1RFRF9DTEFTU0VTKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShwZXJzaXN0ZW5jZVVuaXRFQ2xhc3MsIFBFUlNJU1RFTkNFX1VOSVRfX1BST1BFUlRJRVMpOworCQljcmVhdGVFQXR0cmlidXRlKHBlcnNpc3RlbmNlVW5pdEVDbGFzcywgUEVSU0lTVEVOQ0VfVU5JVF9fTkFNRSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUocGVyc2lzdGVuY2VVbml0RUNsYXNzLCBQRVJTSVNURU5DRV9VTklUX19UUkFOU0FDVElPTl9UWVBFKTsKKworCQltYXBwaW5nRmlsZVJlZkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNQVBQSU5HX0ZJTEVfUkVGKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShtYXBwaW5nRmlsZVJlZkVDbGFzcywgTUFQUElOR19GSUxFX1JFRl9fRklMRV9OQU1FKTsKKworCQlqYXZhQ2xhc3NSZWZFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSkFWQV9DTEFTU19SRUYpOworCQljcmVhdGVFQXR0cmlidXRlKGphdmFDbGFzc1JlZkVDbGFzcywgSkFWQV9DTEFTU19SRUZfX0pBVkFfQ0xBU1MpOworCisJCXByb3BlcnRpZXNFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFJPUEVSVElFUyk7CisJCWNyZWF0ZUVSZWZlcmVuY2UocHJvcGVydGllc0VDbGFzcywgUFJPUEVSVElFU19fUFJPUEVSVElFUyk7CisKKwkJcHJvcGVydHlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFJPUEVSVFkpOworCQljcmVhdGVFQXR0cmlidXRlKHByb3BlcnR5RUNsYXNzLCBQUk9QRVJUWV9fTkFNRSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUocHJvcGVydHlFQ2xhc3MsIFBST1BFUlRZX19WQUxVRSk7CisKKwkJLy8gQ3JlYXRlIGVudW1zCisJCXBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZUVFbnVtID0gY3JlYXRlRUVudW0oUEVSU0lTVEVOQ0VfVU5JVF9UUkFOU0FDVElPTl9UWVBFKTsKKworCQkvLyBDcmVhdGUgZGF0YSB0eXBlcworCQlwZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGVPYmplY3RFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoUEVSU0lTVEVOQ0VfVU5JVF9UUkFOU0FDVElPTl9UWVBFX09CSkVDVCk7CisJCXZlcnNpb25FRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoVkVSU0lPTik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKworCS8qKgorCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCisJICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkKKwl7CisJCWlmIChpc0luaXRpYWxpemVkKSByZXR1cm47CisJCWlzSW5pdGlhbGl6ZWQgPSB0cnVlOworCisJCS8vIEluaXRpYWxpemUgcGFja2FnZQorCQlzZXROYW1lKGVOQU1FKTsKKwkJc2V0TnNQcmVmaXgoZU5TX1BSRUZJWCk7CisJCXNldE5zVVJJKGVOU19VUkkpOworCisJCS8vIE9idGFpbiBvdGhlciBkZXBlbmRlbnQgcGFja2FnZXMKKwkJWE1MVHlwZVBhY2thZ2UgdGhlWE1MVHlwZVBhY2thZ2UgPSAoWE1MVHlwZVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoWE1MVHlwZVBhY2thZ2UuZU5TX1VSSSk7CisJCUVjb3JlUGFja2FnZSB0aGVFY29yZVBhY2thZ2UgPSAoRWNvcmVQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjb3JlUGFja2FnZS5lTlNfVVJJKTsKKworCQkvLyBDcmVhdGUgdHlwZSBwYXJhbWV0ZXJzCisKKwkJLy8gU2V0IGJvdW5kcyBmb3IgdHlwZSBwYXJhbWV0ZXJzCisKKwkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcworCisJCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCisJCWluaXRFQ2xhc3MocGVyc2lzdGVuY2VFQ2xhc3MsIFBlcnNpc3RlbmNlLmNsYXNzLCAiUGVyc2lzdGVuY2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFUmVmZXJlbmNlKGdldFBlcnNpc3RlbmNlX1BlcnNpc3RlbmNlVW5pdHMoKSwgdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKSwgbnVsbCwgInBlcnNpc3RlbmNlVW5pdHMiLCBudWxsLCAwLCAtMSwgUGVyc2lzdGVuY2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFQXR0cmlidXRlKGdldFBlcnNpc3RlbmNlX1ZlcnNpb24oKSwgdGhpcy5nZXRWZXJzaW9uKCksICJ2ZXJzaW9uIiwgbnVsbCwgMSwgMSwgUGVyc2lzdGVuY2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisJCWluaXRFQ2xhc3MocGVyc2lzdGVuY2VVbml0RUNsYXNzLCBQZXJzaXN0ZW5jZVVuaXQuY2xhc3MsICJQZXJzaXN0ZW5jZVVuaXQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFQXR0cmlidXRlKGdldFBlcnNpc3RlbmNlVW5pdF9EZXNjcmlwdGlvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgUGVyc2lzdGVuY2VVbml0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0UGVyc2lzdGVuY2VVbml0X1Byb3ZpZGVyKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicHJvdmlkZXIiLCBudWxsLCAwLCAxLCBQZXJzaXN0ZW5jZVVuaXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXRQZXJzaXN0ZW5jZVVuaXRfSnRhRGF0YVNvdXJjZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImp0YURhdGFTb3VyY2UiLCBudWxsLCAwLCAxLCBQZXJzaXN0ZW5jZVVuaXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXRQZXJzaXN0ZW5jZVVuaXRfTm9uSnRhRGF0YVNvdXJjZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm5vbkp0YURhdGFTb3VyY2UiLCBudWxsLCAwLCAxLCBQZXJzaXN0ZW5jZVVuaXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RVJlZmVyZW5jZShnZXRQZXJzaXN0ZW5jZVVuaXRfTWFwcGluZ0ZpbGVzKCksIHRoaXMuZ2V0TWFwcGluZ0ZpbGVSZWYoKSwgbnVsbCwgIm1hcHBpbmdGaWxlcyIsIG51bGwsIDAsIC0xLCBQZXJzaXN0ZW5jZVVuaXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXRQZXJzaXN0ZW5jZVVuaXRfSmFyRmlsZXMoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJqYXJGaWxlcyIsIG51bGwsIDAsIC0xLCBQZXJzaXN0ZW5jZVVuaXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RVJlZmVyZW5jZShnZXRQZXJzaXN0ZW5jZVVuaXRfQ2xhc3NlcygpLCB0aGlzLmdldEphdmFDbGFzc1JlZigpLCBudWxsLCAiY2xhc3NlcyIsIG51bGwsIDAsIC0xLCBQZXJzaXN0ZW5jZVVuaXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXRQZXJzaXN0ZW5jZVVuaXRfRXhjbHVkZVVubGlzdGVkQ2xhc3NlcygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuKCksICJleGNsdWRlVW5saXN0ZWRDbGFzc2VzIiwgImZhbHNlIiwgMCwgMSwgUGVyc2lzdGVuY2VVbml0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RVJlZmVyZW5jZShnZXRQZXJzaXN0ZW5jZVVuaXRfUHJvcGVydGllcygpLCB0aGlzLmdldFByb3BlcnRpZXMoKSwgbnVsbCwgInByb3BlcnRpZXMiLCBudWxsLCAwLCAxLCBQZXJzaXN0ZW5jZVVuaXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFQXR0cmlidXRlKGdldFBlcnNpc3RlbmNlVW5pdF9OYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibmFtZSIsIG51bGwsIDEsIDEsIFBlcnNpc3RlbmNlVW5pdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFQXR0cmlidXRlKGdldFBlcnNpc3RlbmNlVW5pdF9UcmFuc2FjdGlvblR5cGUoKSwgdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUoKSwgInRyYW5zYWN0aW9uVHlwZSIsICJKVEEiLCAwLCAxLCBQZXJzaXN0ZW5jZVVuaXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKwkJaW5pdEVDbGFzcyhtYXBwaW5nRmlsZVJlZkVDbGFzcywgTWFwcGluZ0ZpbGVSZWYuY2xhc3MsICJNYXBwaW5nRmlsZVJlZiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWFwcGluZ0ZpbGVSZWZfRmlsZU5hbWUoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImZpbGVOYW1lIiwgIiIsIDAsIDEsIE1hcHBpbmdGaWxlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7CisKKwkJaW5pdEVDbGFzcyhqYXZhQ2xhc3NSZWZFQ2xhc3MsIEphdmFDbGFzc1JlZi5jbGFzcywgIkphdmFDbGFzc1JlZiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0SmF2YUNsYXNzUmVmX0phdmFDbGFzcygpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiamF2YUNsYXNzIiwgbnVsbCwgMCwgMSwgSmF2YUNsYXNzUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7CisKKwkJaW5pdEVDbGFzcyhwcm9wZXJ0aWVzRUNsYXNzLCBQcm9wZXJ0aWVzLmNsYXNzLCAiUHJvcGVydGllcyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0UHJvcGVydGllc19Qcm9wZXJ0aWVzKCksIHRoaXMuZ2V0UHJvcGVydHkoKSwgbnVsbCwgInByb3BlcnRpZXMiLCBudWxsLCAwLCAtMSwgUHJvcGVydGllcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKHByb3BlcnR5RUNsYXNzLCBQcm9wZXJ0eS5jbGFzcywgIlByb3BlcnR5IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RUF0dHJpYnV0ZShnZXRQcm9wZXJ0eV9OYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibmFtZSIsIG51bGwsIDEsIDEsIFByb3BlcnR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0UHJvcGVydHlfVmFsdWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJ2YWx1ZSIsIG51bGwsIDEsIDEsIFByb3BlcnR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQkvLyBJbml0aWFsaXplIGVudW1zIGFuZCBhZGQgZW51bSBsaXRlcmFscworCQlpbml0RUVudW0ocGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlRUVudW0sIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZS5jbGFzcywgIlBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSIpOworCQlhZGRFRW51bUxpdGVyYWwocGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlRUVudW0sIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZS5KVEEpOworCQlhZGRFRW51bUxpdGVyYWwocGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlRUVudW0sIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZS5SRVNPVVJDRV9MT0NBTCk7CisKKwkJLy8gSW5pdGlhbGl6ZSBkYXRhIHR5cGVzCisJCWluaXRFRGF0YVR5cGUocGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlT2JqZWN0RURhdGFUeXBlLCBFbnVtZXJhdG9yLmNsYXNzLCAiUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlT2JqZWN0IiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVEYXRhVHlwZSh2ZXJzaW9uRURhdGFUeXBlLCBTdHJpbmcuY2xhc3MsICJWZXJzaW9uIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKworCQkvLyBDcmVhdGUgcmVzb3VyY2UKKwkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBEZWZpbmVzIGxpdGVyYWxzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRoYXQgcmVwcmVzZW50CisJICogPHVsPgorCSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KKwkgKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgorCSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgorCSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+CisJICogPC91bD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGludGVyZmFjZSBMaXRlcmFscworCXsKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZSA8ZW0+UGVyc2lzdGVuY2U8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZQorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGFja2FnZSNnZXRQZXJzaXN0ZW5jZSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFBFUlNJU1RFTkNFID0gZUlOU1RBTkNFLmdldFBlcnNpc3RlbmNlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBQRVJTSVNURU5DRV9fVkVSU0lPTiA9IGVJTlNUQU5DRS5nZXRQZXJzaXN0ZW5jZV9WZXJzaW9uKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBVbml0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBQRVJTSVNURU5DRV9fUEVSU0lTVEVOQ0VfVU5JVFMgPSBlSU5TVEFOQ0UuZ2V0UGVyc2lzdGVuY2VfUGVyc2lzdGVuY2VVbml0cygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0IDxlbT5Vbml0PC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQYWNrYWdlI2dldFBlcnNpc3RlbmNlVW5pdCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFBFUlNJU1RFTkNFX1VOSVQgPSBlSU5TVEFOQ0UuZ2V0UGVyc2lzdGVuY2VVbml0KCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBQRVJTSVNURU5DRV9VTklUX19OQU1FID0gZUlOU1RBTkNFLmdldFBlcnNpc3RlbmNlVW5pdF9OYW1lKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UcmFuc2FjdGlvbiBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBQRVJTSVNURU5DRV9VTklUX19UUkFOU0FDVElPTl9UWVBFID0gZUlOU1RBTkNFLmdldFBlcnNpc3RlbmNlVW5pdF9UcmFuc2FjdGlvblR5cGUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBQRVJTSVNURU5DRV9VTklUX19ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRQZXJzaXN0ZW5jZVVuaXRfRGVzY3JpcHRpb24oKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByb3ZpZGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBQRVJTSVNURU5DRV9VTklUX19QUk9WSURFUiA9IGVJTlNUQU5DRS5nZXRQZXJzaXN0ZW5jZVVuaXRfUHJvdmlkZXIoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkp0YSBEYXRhIFNvdXJjZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgUEVSU0lTVEVOQ0VfVU5JVF9fSlRBX0RBVEFfU09VUkNFID0gZUlOU1RBTkNFLmdldFBlcnNpc3RlbmNlVW5pdF9KdGFEYXRhU291cmNlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Ob24gSnRhIERhdGEgU291cmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBQRVJTSVNURU5DRV9VTklUX19OT05fSlRBX0RBVEFfU09VUkNFID0gZUlOU1RBTkNFLmdldFBlcnNpc3RlbmNlVW5pdF9Ob25KdGFEYXRhU291cmNlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NYXBwaW5nIEZpbGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFBFUlNJU1RFTkNFX1VOSVRfX01BUFBJTkdfRklMRVMgPSBlSU5TVEFOQ0UuZ2V0UGVyc2lzdGVuY2VVbml0X01hcHBpbmdGaWxlcygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SmFyIEZpbGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFBFUlNJU1RFTkNFX1VOSVRfX0pBUl9GSUxFUyA9IGVJTlNUQU5DRS5nZXRQZXJzaXN0ZW5jZVVuaXRfSmFyRmlsZXMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNsYXNzZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgUEVSU0lTVEVOQ0VfVU5JVF9fQ0xBU1NFUyA9IGVJTlNUQU5DRS5nZXRQZXJzaXN0ZW5jZVVuaXRfQ2xhc3NlcygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXhjbHVkZSBVbmxpc3RlZCBDbGFzc2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBQRVJTSVNURU5DRV9VTklUX19FWENMVURFX1VOTElTVEVEX0NMQVNTRVMgPSBlSU5TVEFOQ0UuZ2V0UGVyc2lzdGVuY2VVbml0X0V4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFBFUlNJU1RFTkNFX1VOSVRfX1BST1BFUlRJRVMgPSBlSU5TVEFOQ0UuZ2V0UGVyc2lzdGVuY2VVbml0X1Byb3BlcnRpZXMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLk1hcHBpbmdGaWxlUmVmIDxlbT5NYXBwaW5nIEZpbGUgUmVmPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UuTWFwcGluZ0ZpbGVSZWYKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBhY2thZ2UjZ2V0TWFwcGluZ0ZpbGVSZWYoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBNQVBQSU5HX0ZJTEVfUkVGID0gZUlOU1RBTkNFLmdldE1hcHBpbmdGaWxlUmVmKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5GaWxlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIE1BUFBJTkdfRklMRV9SRUZfX0ZJTEVfTkFNRSA9IGVJTlNUQU5DRS5nZXRNYXBwaW5nRmlsZVJlZl9GaWxlTmFtZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UuSmF2YUNsYXNzUmVmIDxlbT5KYXZhIENsYXNzIFJlZjwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLkphdmFDbGFzc1JlZgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGFja2FnZSNnZXRKYXZhQ2xhc3NSZWYoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBKQVZBX0NMQVNTX1JFRiA9IGVJTlNUQU5DRS5nZXRKYXZhQ2xhc3NSZWYoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkphdmEgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIEpBVkFfQ0xBU1NfUkVGX19KQVZBX0NMQVNTID0gZUlOU1RBTkNFLmdldEphdmFDbGFzc1JlZl9KYXZhQ2xhc3MoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLlByb3BlcnRpZXMgPGVtPlByb3BlcnRpZXM8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5Qcm9wZXJ0aWVzCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQYWNrYWdlI2dldFByb3BlcnRpZXMoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBQUk9QRVJUSUVTID0gZUlOU1RBTkNFLmdldFByb3BlcnRpZXMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgUFJPUEVSVElFU19fUFJPUEVSVElFUyA9IGVJTlNUQU5DRS5nZXRQcm9wZXJ0aWVzX1Byb3BlcnRpZXMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLlByb3BlcnR5IDxlbT5Qcm9wZXJ0eTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLlByb3BlcnR5CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQYWNrYWdlI2dldFByb3BlcnR5KCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgUFJPUEVSVFkgPSBlSU5TVEFOQ0UuZ2V0UHJvcGVydHkoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFBST1BFUlRZX19OQU1FID0gZUlOU1RBTkNFLmdldFByb3BlcnR5X05hbWUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBQUk9QRVJUWV9fVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0UHJvcGVydHlfVmFsdWUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSA8ZW0+VW5pdCBUcmFuc2FjdGlvbiBUeXBlPC9lbT59JyBlbnVtLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBhY2thZ2UjZ2V0UGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFRW51bSBQRVJTSVNURU5DRV9VTklUX1RSQU5TQUNUSU9OX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0UGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5Vbml0IFRyYW5zYWN0aW9uIFR5cGUgT2JqZWN0PC9lbT4nIGRhdGEgdHlwZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3IKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBhY2thZ2UjZ2V0UGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlT2JqZWN0KCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJcHVibGljIHN0YXRpYyBmaW5hbCBFRGF0YVR5cGUgUEVSU0lTVEVOQ0VfVU5JVF9UUkFOU0FDVElPTl9UWVBFX09CSkVDVCA9IGVJTlNUQU5DRS5nZXRQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGVPYmplY3QoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPlZlcnNpb248L2VtPicgZGF0YSB0eXBlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQYWNrYWdlI2dldFZlcnNpb24oKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVEYXRhVHlwZSBWRVJTSU9OID0gZUlOU1RBTkNFLmdldFZlcnNpb24oKTsKKworCX0KKworfSAvL1BlcnNpc3RlbmNlUGFja2FnZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlUmVzb3VyY2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdiMDNkYQotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVJlc291cmNlLmphdmEKQEAgLTAsMCArMSw2NiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UudHJhbnNsYXRvcnMuUGVyc2lzdGVuY2VUcmFuc2xhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvclJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3JSZXNvdXJjZUltcGw7CisKK3B1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZVJlc291cmNlIGV4dGVuZHMgVHJhbnNsYXRvclJlc291cmNlSW1wbAoreworCXB1YmxpYyBQZXJzaXN0ZW5jZVJlc291cmNlKFJlbmRlcmVyIGFSZW5kZXJlcikgeworCQlzdXBlcihhUmVuZGVyZXIpOworCX0KKworCXB1YmxpYyBQZXJzaXN0ZW5jZVJlc291cmNlKFVSSSB1cmksIFJlbmRlcmVyIGFSZW5kZXJlcikgeworCQlzdXBlcih1cmksIGFSZW5kZXJlcik7CisJfQorCQorCS8qKgorCSAqIEBzZWUgVHJhbnNsYXRvclJlc291cmNlSW1wbCNnZXREZWZhdWx0UHVibGljSWQoKSAKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRQdWJsaWNJZCgpIHsKKwkJcmV0dXJuIG51bGw7CisJCS8vIG9ubHkgYXBwbGljYWJsZSBmb3IgRFRELWJhc2VkIGZpbGVzCisJfQorCQorCS8qKgorCSAqIEBzZWUgVHJhbnNsYXRvclJlc291cmNlSW1wbCNnZXREZWZhdWx0U3lzdGVtSWQoKSAKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRTeXN0ZW1JZCgpIHsKKwkJcmV0dXJuIG51bGw7CisJCS8vIG9ubHkgYXBwbGljYWJsZSBmb3IgRFRELWJhc2VkIGZpbGVzCisJfQorCQorCS8qKgorCSAqIEBzZWUgVHJhbnNsYXRvclJlc291cmNlSW1wbCNnZXREZWZhdWx0VmVyc2lvbklkKCkgCisJICovCisJcHJvdGVjdGVkIGludCBnZXREZWZhdWx0VmVyc2lvbklEKCkgeworCQlyZXR1cm4gMTA7CisJCS8vIHRoaXMgc2VlbXMgdG8gYmUgdGhlIGRlZmF1bHQgdmVyc2lvbiBvZiB0aGUgc3BlYyBmb3IgdGhpcyBkb2MKKwkJLy8gYW5kIHRoZSBpZCAxMCBtYXBzIHRvIHRoZSB2ZXJzaW9uIDEuMAorCX0KKwkKKwkvKioKKwkgKiBAc2VlIFRyYW5zbGF0b3JSZXNvdXJjZSNnZXREb2N0eXBlKCkgCisJICovCisJcHVibGljIFN0cmluZyBnZXREb2N0eXBlKCkgeworCQlyZXR1cm4gbnVsbDsKKwkJLy8gb25seSBhcHBsaWNhYmxlIGZvciBEVEQtYmFzZWQgZmlsZXMKKwl9CisJCisJLyoqCisJICogQHNlZSBUcmFuc2xhdG9yUmVzb3VyY2UjZ2V0Um9vdFRyYW5zbGF0b3IoKSAKKwkgKi8KKwlwdWJsaWMgVHJhbnNsYXRvciBnZXRSb290VHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIFBlcnNpc3RlbmNlVHJhbnNsYXRvci5JTlNUQU5DRTsKKwl9CisJCisJLyoqCisJICogQHNlZSBQZXJzaXN0ZW5jZVJlc291cmNlI2dldFBlcnNpc3RlbmNlKCkKKwkgKi8KKwlwdWJsaWMgUGVyc2lzdGVuY2UgZ2V0UGVyc2lzdGVuY2UoKSB7CisJCXJldHVybiAoUGVyc2lzdGVuY2UpIGdldFJvb3RPYmplY3QoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VVbml0LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VVbml0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVhODcxZAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVVuaXQuamF2YQpAQCAtMCwwICsxLDk1NCBAQAorLyoqCisgKiA8Y29weXJpZ2h0PgorICogPC9jb3B5cmlnaHQ+CisgKgorICogJElkOiBQZXJzaXN0ZW5jZVVuaXQuamF2YSx2IDEuMSAyMDA3LzA3LzMwIDIwOjEzOjQ2IHBmdWxsYnJpZ2h0IEV4cCAkCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRURhdGFUeXBlRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VW5pdDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQjZ2V0UHJvdmlkZXIgPGVtPlByb3ZpZGVyPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQjZ2V0SnRhRGF0YVNvdXJjZSA8ZW0+SnRhIERhdGEgU291cmNlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQjZ2V0Tm9uSnRhRGF0YVNvdXJjZSA8ZW0+Tm9uIEp0YSBEYXRhIFNvdXJjZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0I2dldE1hcHBpbmdGaWxlcyA8ZW0+TWFwcGluZyBGaWxlczwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0I2dldEphckZpbGVzIDxlbT5KYXIgRmlsZXM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdCNnZXRDbGFzc2VzIDxlbT5DbGFzc2VzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQjaXNFeGNsdWRlVW5saXN0ZWRDbGFzc2VzIDxlbT5FeGNsdWRlIFVubGlzdGVkIENsYXNzZXM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdCNnZXRQcm9wZXJ0aWVzIDxlbT5Qcm9wZXJ0aWVzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0I2dldFRyYW5zYWN0aW9uVHlwZSA8ZW0+VHJhbnNhY3Rpb24gVHlwZTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQYWNrYWdlI2dldFBlcnNpc3RlbmNlVW5pdCgpCisgKiBAbW9kZWwga2luZD0iY2xhc3MiCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZVVuaXQgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEVPYmplY3QKK3sKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb24gPSBERVNDUklQVElPTl9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcm92aWRlcigpIDxlbT5Qcm92aWRlcjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UHJvdmlkZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1ZJREVSX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb3ZpZGVyKCkgPGVtPlByb3ZpZGVyPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRQcm92aWRlcigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBwcm92aWRlciA9IFBST1ZJREVSX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEp0YURhdGFTb3VyY2UoKSA8ZW0+SnRhIERhdGEgU291cmNlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRKdGFEYXRhU291cmNlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBKVEFfREFUQV9TT1VSQ0VfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SnRhRGF0YVNvdXJjZSgpIDxlbT5KdGEgRGF0YSBTb3VyY2U8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEp0YURhdGFTb3VyY2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcganRhRGF0YVNvdXJjZSA9IEpUQV9EQVRBX1NPVVJDRV9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROb25KdGFEYXRhU291cmNlKCkgPGVtPk5vbiBKdGEgRGF0YSBTb3VyY2U8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE5vbkp0YURhdGFTb3VyY2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5PTl9KVEFfREFUQV9TT1VSQ0VfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Tm9uSnRhRGF0YVNvdXJjZSgpIDxlbT5Ob24gSnRhIERhdGEgU291cmNlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXROb25KdGFEYXRhU291cmNlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIG5vbkp0YURhdGFTb3VyY2UgPSBOT05fSlRBX0RBVEFfU09VUkNFX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFwcGluZ0ZpbGVzKCkgPGVtPk1hcHBpbmcgRmlsZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TWFwcGluZ0ZpbGVzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8TWFwcGluZ0ZpbGVSZWY+IG1hcHBpbmdGaWxlczsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEphckZpbGVzKCkgPGVtPkphciBGaWxlczwvZW0+fScgYXR0cmlidXRlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRKYXJGaWxlcygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVMaXN0PFN0cmluZz4gamFyRmlsZXM7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDbGFzc2VzKCkgPGVtPkNsYXNzZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Q2xhc3NlcygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVMaXN0PEphdmFDbGFzc1JlZj4gY2xhc3NlczsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0V4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoKSA8ZW0+RXhjbHVkZSBVbmxpc3RlZCBDbGFzc2VzPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc0V4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBFWENMVURFX1VOTElTVEVEX0NMQVNTRVNfRURFRkFVTFQgPSBmYWxzZTsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRXhjbHVkZVVubGlzdGVkQ2xhc3NlcygpIDxlbT5FeGNsdWRlIFVubGlzdGVkIENsYXNzZXM8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzRXhjbHVkZVVubGlzdGVkQ2xhc3NlcygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gZXhjbHVkZVVubGlzdGVkQ2xhc3NlcyA9IEVYQ0xVREVfVU5MSVNURURfQ0xBU1NFU19FREVGQVVMVDsKKworCS8qKgorCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgRXhjbHVkZSBVbmxpc3RlZCBDbGFzc2VzIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBleGNsdWRlVW5saXN0ZWRDbGFzc2VzRVNldDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb3BlcnRpZXMoKSA8ZW0+UHJvcGVydGllczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UHJvcGVydGllcygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFByb3BlcnRpZXMgcHJvcGVydGllczsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE5hbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXROYW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRyYW5zYWN0aW9uVHlwZSgpIDxlbT5UcmFuc2FjdGlvbiBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRUcmFuc2FjdGlvblR5cGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIFRSQU5TQUNUSU9OX1RZUEVfRURFRkFVTFQgPSBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUuSlRBOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHJhbnNhY3Rpb25UeXBlKCkgPGVtPlRyYW5zYWN0aW9uIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFRyYW5zYWN0aW9uVHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSB0cmFuc2FjdGlvblR5cGUgPSBUUkFOU0FDVElPTl9UWVBFX0VERUZBVUxUOworCisJLyoqCisJICogVGhpcyBpcyB0cnVlIGlmIHRoZSBUcmFuc2FjdGlvbiBUeXBlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiB0cmFuc2FjdGlvblR5cGVFU2V0OworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdCgpCisJeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKKwl7CisJCXJldHVybiBQZXJzaXN0ZW5jZVBhY2thZ2UuTGl0ZXJhbHMuUEVSU0lTVEVOQ0VfVU5JVDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQYWNrYWdlI2dldFBlcnNpc3RlbmNlVW5pdF9OYW1lKCkKKwkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHJlcXVpcmVkPSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQorCXsKKwkJcmV0dXJuIG5hbWU7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0I2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldE5hbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKQorCXsKKwkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOworCQluYW1lID0gbmV3TmFtZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUGVyc2lzdGVuY2VQYWNrYWdlLlBFUlNJU1RFTkNFX1VOSVRfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UcmFuc2FjdGlvbiBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IkpUQSI8L2NvZGU+LgorCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UcmFuc2FjdGlvbiBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRyYW5zYWN0aW9uIFR5cGU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlCisJICogQHNlZSAjaXNTZXRUcmFuc2FjdGlvblR5cGUoKQorCSAqIEBzZWUgI3Vuc2V0VHJhbnNhY3Rpb25UeXBlKCkKKwkgKiBAc2VlICNzZXRUcmFuc2FjdGlvblR5cGUoUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQYWNrYWdlI2dldFBlcnNpc3RlbmNlVW5pdF9UcmFuc2FjdGlvblR5cGUoKQorCSAqIEBtb2RlbCBkZWZhdWx0PSJKVEEiIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgZ2V0VHJhbnNhY3Rpb25UeXBlKCkKKwl7CisJCXJldHVybiB0cmFuc2FjdGlvblR5cGU7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0I2dldFRyYW5zYWN0aW9uVHlwZSA8ZW0+VHJhbnNhY3Rpb24gVHlwZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHJhbnNhY3Rpb24gVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUKKwkgKiBAc2VlICNpc1NldFRyYW5zYWN0aW9uVHlwZSgpCisJICogQHNlZSAjdW5zZXRUcmFuc2FjdGlvblR5cGUoKQorCSAqIEBzZWUgI2dldFRyYW5zYWN0aW9uVHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFRyYW5zYWN0aW9uVHlwZShQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgbmV3VHJhbnNhY3Rpb25UeXBlKQorCXsKKwkJUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIG9sZFRyYW5zYWN0aW9uVHlwZSA9IHRyYW5zYWN0aW9uVHlwZTsKKwkJdHJhbnNhY3Rpb25UeXBlID0gbmV3VHJhbnNhY3Rpb25UeXBlID09IG51bGwgPyBUUkFOU0FDVElPTl9UWVBFX0VERUZBVUxUIDogbmV3VHJhbnNhY3Rpb25UeXBlOworCQlib29sZWFuIG9sZFRyYW5zYWN0aW9uVHlwZUVTZXQgPSB0cmFuc2FjdGlvblR5cGVFU2V0OworCQl0cmFuc2FjdGlvblR5cGVFU2V0ID0gdHJ1ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUGVyc2lzdGVuY2VQYWNrYWdlLlBFUlNJU1RFTkNFX1VOSVRfX1RSQU5TQUNUSU9OX1RZUEUsIG9sZFRyYW5zYWN0aW9uVHlwZSwgdHJhbnNhY3Rpb25UeXBlLCAhb2xkVHJhbnNhY3Rpb25UeXBlRVNldCkpOworCX0KKworCS8qKgorCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0I2dldFRyYW5zYWN0aW9uVHlwZSA8ZW0+VHJhbnNhY3Rpb24gVHlwZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNTZXRUcmFuc2FjdGlvblR5cGUoKQorCSAqIEBzZWUgI2dldFRyYW5zYWN0aW9uVHlwZSgpCisJICogQHNlZSAjc2V0VHJhbnNhY3Rpb25UeXBlKFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgdW5zZXRUcmFuc2FjdGlvblR5cGUoKQorCXsKKwkJUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIG9sZFRyYW5zYWN0aW9uVHlwZSA9IHRyYW5zYWN0aW9uVHlwZTsKKwkJYm9vbGVhbiBvbGRUcmFuc2FjdGlvblR5cGVFU2V0ID0gdHJhbnNhY3Rpb25UeXBlRVNldDsKKwkJdHJhbnNhY3Rpb25UeXBlID0gVFJBTlNBQ1RJT05fVFlQRV9FREVGQVVMVDsKKwkJdHJhbnNhY3Rpb25UeXBlRVNldCA9IGZhbHNlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIFBlcnNpc3RlbmNlUGFja2FnZS5QRVJTSVNURU5DRV9VTklUX19UUkFOU0FDVElPTl9UWVBFLCBvbGRUcmFuc2FjdGlvblR5cGUsIFRSQU5TQUNUSU9OX1RZUEVfRURFRkFVTFQsIG9sZFRyYW5zYWN0aW9uVHlwZUVTZXQpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdCNnZXRUcmFuc2FjdGlvblR5cGUgPGVtPlRyYW5zYWN0aW9uIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRyYW5zYWN0aW9uIFR5cGU8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KKwkgKiBAc2VlICN1bnNldFRyYW5zYWN0aW9uVHlwZSgpCisJICogQHNlZSAjZ2V0VHJhbnNhY3Rpb25UeXBlKCkKKwkgKiBAc2VlICNzZXRUcmFuc2FjdGlvblR5cGUoUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1NldFRyYW5zYWN0aW9uVHlwZSgpCisJeworCQlyZXR1cm4gdHJhbnNhY3Rpb25UeXBlRVNldDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldERlc2NyaXB0aW9uKFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGFja2FnZSNnZXRQZXJzaXN0ZW5jZVVuaXRfRGVzY3JpcHRpb24oKQorCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpCisJeworCQlyZXR1cm4gZGVzY3JpcHRpb247CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0I2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIG5ld0Rlc2NyaXB0aW9uKQorCXsKKwkJU3RyaW5nIG9sZERlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisJCWRlc2NyaXB0aW9uID0gbmV3RGVzY3JpcHRpb247CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFBlcnNpc3RlbmNlUGFja2FnZS5QRVJTSVNURU5DRV9VTklUX19ERVNDUklQVElPTiwgb2xkRGVzY3JpcHRpb24sIGRlc2NyaXB0aW9uKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJvdmlkZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByb3ZpZGVyPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb3ZpZGVyPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRQcm92aWRlcihTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBhY2thZ2UjZ2V0UGVyc2lzdGVuY2VVbml0X1Byb3ZpZGVyKCkKKwkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0UHJvdmlkZXIoKQorCXsKKwkJcmV0dXJuIHByb3ZpZGVyOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdCNnZXRQcm92aWRlciA8ZW0+UHJvdmlkZXI8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByb3ZpZGVyPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRQcm92aWRlcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFByb3ZpZGVyKFN0cmluZyBuZXdQcm92aWRlcikKKwl7CisJCVN0cmluZyBvbGRQcm92aWRlciA9IHByb3ZpZGVyOworCQlwcm92aWRlciA9IG5ld1Byb3ZpZGVyOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBQZXJzaXN0ZW5jZVBhY2thZ2UuUEVSU0lTVEVOQ0VfVU5JVF9fUFJPVklERVIsIG9sZFByb3ZpZGVyLCBwcm92aWRlcikpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkp0YSBEYXRhIFNvdXJjZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SnRhIERhdGEgU291cmNlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkp0YSBEYXRhIFNvdXJjZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0SnRhRGF0YVNvdXJjZShTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBhY2thZ2UjZ2V0UGVyc2lzdGVuY2VVbml0X0p0YURhdGFTb3VyY2UoKQorCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRKdGFEYXRhU291cmNlKCkKKwl7CisJCXJldHVybiBqdGFEYXRhU291cmNlOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdCNnZXRKdGFEYXRhU291cmNlIDxlbT5KdGEgRGF0YSBTb3VyY2U8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkp0YSBEYXRhIFNvdXJjZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0SnRhRGF0YVNvdXJjZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEp0YURhdGFTb3VyY2UoU3RyaW5nIG5ld0p0YURhdGFTb3VyY2UpCisJeworCQlTdHJpbmcgb2xkSnRhRGF0YVNvdXJjZSA9IGp0YURhdGFTb3VyY2U7CisJCWp0YURhdGFTb3VyY2UgPSBuZXdKdGFEYXRhU291cmNlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBQZXJzaXN0ZW5jZVBhY2thZ2UuUEVSU0lTVEVOQ0VfVU5JVF9fSlRBX0RBVEFfU09VUkNFLCBvbGRKdGFEYXRhU291cmNlLCBqdGFEYXRhU291cmNlKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Tm9uIEp0YSBEYXRhIFNvdXJjZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Tm9uIEp0YSBEYXRhIFNvdXJjZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Ob24gSnRhIERhdGEgU291cmNlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXROb25KdGFEYXRhU291cmNlKFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGFja2FnZSNnZXRQZXJzaXN0ZW5jZVVuaXRfTm9uSnRhRGF0YVNvdXJjZSgpCisJICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5vbkp0YURhdGFTb3VyY2UoKQorCXsKKwkJcmV0dXJuIG5vbkp0YURhdGFTb3VyY2U7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0I2dldE5vbkp0YURhdGFTb3VyY2UgPGVtPk5vbiBKdGEgRGF0YSBTb3VyY2U8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5vbiBKdGEgRGF0YSBTb3VyY2U8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldE5vbkp0YURhdGFTb3VyY2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXROb25KdGFEYXRhU291cmNlKFN0cmluZyBuZXdOb25KdGFEYXRhU291cmNlKQorCXsKKwkJU3RyaW5nIG9sZE5vbkp0YURhdGFTb3VyY2UgPSBub25KdGFEYXRhU291cmNlOworCQlub25KdGFEYXRhU291cmNlID0gbmV3Tm9uSnRhRGF0YVNvdXJjZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUGVyc2lzdGVuY2VQYWNrYWdlLlBFUlNJU1RFTkNFX1VOSVRfX05PTl9KVEFfREFUQV9TT1VSQ0UsIG9sZE5vbkp0YURhdGFTb3VyY2UsIG5vbkp0YURhdGFTb3VyY2UpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYXBwaW5nIEZpbGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UuTWFwcGluZ0ZpbGVSZWZ9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWFwcGluZyBGaWxlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1hcHBpbmcgRmlsZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBhY2thZ2UjZ2V0UGVyc2lzdGVuY2VVbml0X01hcHBpbmdGaWxlcygpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUxpc3Q8TWFwcGluZ0ZpbGVSZWY+IGdldE1hcHBpbmdGaWxlcygpCisJeworCQlpZiAobWFwcGluZ0ZpbGVzID09IG51bGwpCisJCXsKKwkJCW1hcHBpbmdGaWxlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxNYXBwaW5nRmlsZVJlZj4oTWFwcGluZ0ZpbGVSZWYuY2xhc3MsIHRoaXMsIFBlcnNpc3RlbmNlUGFja2FnZS5QRVJTSVNURU5DRV9VTklUX19NQVBQSU5HX0ZJTEVTKTsKKwkJfQorCQlyZXR1cm4gbWFwcGluZ0ZpbGVzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkphciBGaWxlczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SmFyIEZpbGVzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SmFyIEZpbGVzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQYWNrYWdlI2dldFBlcnNpc3RlbmNlVW5pdF9KYXJGaWxlcygpCisJICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRKYXJGaWxlcygpCisJeworCQlpZiAoamFyRmlsZXMgPT0gbnVsbCkKKwkJeworCQkJamFyRmlsZXMgPSBuZXcgRURhdGFUeXBlRUxpc3Q8U3RyaW5nPihTdHJpbmcuY2xhc3MsIHRoaXMsIFBlcnNpc3RlbmNlUGFja2FnZS5QRVJTSVNURU5DRV9VTklUX19KQVJfRklMRVMpOworCQl9CisJCXJldHVybiBqYXJGaWxlczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DbGFzc2VzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UuSmF2YUNsYXNzUmVmfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNsYXNzZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DbGFzc2VzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQYWNrYWdlI2dldFBlcnNpc3RlbmNlVW5pdF9DbGFzc2VzKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFTGlzdDxKYXZhQ2xhc3NSZWY+IGdldENsYXNzZXMoKQorCXsKKwkJaWYgKGNsYXNzZXMgPT0gbnVsbCkKKwkJeworCQkJY2xhc3NlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxKYXZhQ2xhc3NSZWY+KEphdmFDbGFzc1JlZi5jbGFzcywgdGhpcywgUGVyc2lzdGVuY2VQYWNrYWdlLlBFUlNJU1RFTkNFX1VOSVRfX0NMQVNTRVMpOworCQl9CisJCXJldHVybiBjbGFzc2VzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4Y2x1ZGUgVW5saXN0ZWQgQ2xhc3NlczwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJmYWxzZSI8L2NvZGU+LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RXhjbHVkZSBVbmxpc3RlZCBDbGFzc2VzPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4Y2x1ZGUgVW5saXN0ZWQgQ2xhc3NlczwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjaXNTZXRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCkKKwkgKiBAc2VlICN1bnNldEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoKQorCSAqIEBzZWUgI3NldEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoYm9vbGVhbikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGFja2FnZSNnZXRQZXJzaXN0ZW5jZVVuaXRfRXhjbHVkZVVubGlzdGVkQ2xhc3NlcygpCisJICogQG1vZGVsIGRlZmF1bHQ9ImZhbHNlIiB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBib29sZWFuIGlzRXhjbHVkZVVubGlzdGVkQ2xhc3NlcygpCisJeworCQlyZXR1cm4gZXhjbHVkZVVubGlzdGVkQ2xhc3NlczsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQjaXNFeGNsdWRlVW5saXN0ZWRDbGFzc2VzIDxlbT5FeGNsdWRlIFVubGlzdGVkIENsYXNzZXM8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkV4Y2x1ZGUgVW5saXN0ZWQgQ2xhc3NlczwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjaXNTZXRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCkKKwkgKiBAc2VlICN1bnNldEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoKQorCSAqIEBzZWUgI2lzRXhjbHVkZVVubGlzdGVkQ2xhc3NlcygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoYm9vbGVhbiBuZXdFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKQorCXsKKwkJYm9vbGVhbiBvbGRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzID0gZXhjbHVkZVVubGlzdGVkQ2xhc3NlczsKKwkJZXhjbHVkZVVubGlzdGVkQ2xhc3NlcyA9IG5ld0V4Y2x1ZGVVbmxpc3RlZENsYXNzZXM7CisJCWJvb2xlYW4gb2xkRXhjbHVkZVVubGlzdGVkQ2xhc3Nlc0VTZXQgPSBleGNsdWRlVW5saXN0ZWRDbGFzc2VzRVNldDsKKwkJZXhjbHVkZVVubGlzdGVkQ2xhc3Nlc0VTZXQgPSB0cnVlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBQZXJzaXN0ZW5jZVBhY2thZ2UuUEVSU0lTVEVOQ0VfVU5JVF9fRVhDTFVERV9VTkxJU1RFRF9DTEFTU0VTLCBvbGRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzLCBleGNsdWRlVW5saXN0ZWRDbGFzc2VzLCAhb2xkRXhjbHVkZVVubGlzdGVkQ2xhc3Nlc0VTZXQpKTsKKwl9CisKKwkvKioKKwkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdCNpc0V4Y2x1ZGVVbmxpc3RlZENsYXNzZXMgPGVtPkV4Y2x1ZGUgVW5saXN0ZWQgQ2xhc3NlczwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNTZXRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCkKKwkgKiBAc2VlICNpc0V4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoKQorCSAqIEBzZWUgI3NldEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoYm9vbGVhbikKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgdW5zZXRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCkKKwl7CisJCWJvb2xlYW4gb2xkRXhjbHVkZVVubGlzdGVkQ2xhc3NlcyA9IGV4Y2x1ZGVVbmxpc3RlZENsYXNzZXM7CisJCWJvb2xlYW4gb2xkRXhjbHVkZVVubGlzdGVkQ2xhc3Nlc0VTZXQgPSBleGNsdWRlVW5saXN0ZWRDbGFzc2VzRVNldDsKKwkJZXhjbHVkZVVubGlzdGVkQ2xhc3NlcyA9IEVYQ0xVREVfVU5MSVNURURfQ0xBU1NFU19FREVGQVVMVDsKKwkJZXhjbHVkZVVubGlzdGVkQ2xhc3Nlc0VTZXQgPSBmYWxzZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBQZXJzaXN0ZW5jZVBhY2thZ2UuUEVSU0lTVEVOQ0VfVU5JVF9fRVhDTFVERV9VTkxJU1RFRF9DTEFTU0VTLCBvbGRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzLCBFWENMVURFX1VOTElTVEVEX0NMQVNTRVNfRURFRkFVTFQsIG9sZEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXNFU2V0KSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQjaXNFeGNsdWRlVW5saXN0ZWRDbGFzc2VzIDxlbT5FeGNsdWRlIFVubGlzdGVkIENsYXNzZXM8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4Y2x1ZGUgVW5saXN0ZWQgQ2xhc3NlczwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgorCSAqIEBzZWUgI3Vuc2V0RXhjbHVkZVVubGlzdGVkQ2xhc3NlcygpCisJICogQHNlZSAjaXNFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCkKKwkgKiBAc2VlICNzZXRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKGJvb2xlYW4pCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBib29sZWFuIGlzU2V0RXhjbHVkZVVubGlzdGVkQ2xhc3NlcygpCisJeworCQlyZXR1cm4gZXhjbHVkZVVubGlzdGVkQ2xhc3Nlc0VTZXQ7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJvcGVydGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRQcm9wZXJ0aWVzKFByb3BlcnRpZXMpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBhY2thZ2UjZ2V0UGVyc2lzdGVuY2VVbml0X1Byb3BlcnRpZXMoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFByb3BlcnRpZXMgZ2V0UHJvcGVydGllcygpCisJeworCQlyZXR1cm4gcHJvcGVydGllczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQcm9wZXJ0aWVzKFByb3BlcnRpZXMgbmV3UHJvcGVydGllcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKKwl7CisJCVByb3BlcnRpZXMgb2xkUHJvcGVydGllcyA9IHByb3BlcnRpZXM7CisJCXByb3BlcnRpZXMgPSBuZXdQcm9wZXJ0aWVzOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCXsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBQZXJzaXN0ZW5jZVBhY2thZ2UuUEVSU0lTVEVOQ0VfVU5JVF9fUFJPUEVSVElFUywgb2xkUHJvcGVydGllcywgbmV3UHJvcGVydGllcyk7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0I2dldFByb3BlcnRpZXMgPGVtPlByb3BlcnRpZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByb3BlcnRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldFByb3BlcnRpZXMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0aWVzKFByb3BlcnRpZXMgbmV3UHJvcGVydGllcykKKwl7CisJCWlmIChuZXdQcm9wZXJ0aWVzICE9IHByb3BlcnRpZXMpCisJCXsKKwkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOworCQkJaWYgKHByb3BlcnRpZXMgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpcHJvcGVydGllcykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFBlcnNpc3RlbmNlUGFja2FnZS5QRVJTSVNURU5DRV9VTklUX19QUk9QRVJUSUVTLCBudWxsLCBtc2dzKTsKKwkJCWlmIChuZXdQcm9wZXJ0aWVzICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1Byb3BlcnRpZXMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBQZXJzaXN0ZW5jZVBhY2thZ2UuUEVSU0lTVEVOQ0VfVU5JVF9fUFJPUEVSVElFUywgbnVsbCwgbXNncyk7CisJCQltc2dzID0gYmFzaWNTZXRQcm9wZXJ0aWVzKG5ld1Byb3BlcnRpZXMsIG1zZ3MpOworCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOworCQl9CisJCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUGVyc2lzdGVuY2VQYWNrYWdlLlBFUlNJU1RFTkNFX1VOSVRfX1BST1BFUlRJRVMsIG5ld1Byb3BlcnRpZXMsIG5ld1Byb3BlcnRpZXMpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlBFUlNJU1RFTkNFX1VOSVRfX01BUFBJTkdfRklMRVM6CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRNYXBwaW5nRmlsZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuUEVSU0lTVEVOQ0VfVU5JVF9fQ0xBU1NFUzoKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldENsYXNzZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuUEVSU0lTVEVOQ0VfVU5JVF9fUFJPUEVSVElFUzoKKwkJCQlyZXR1cm4gYmFzaWNTZXRQcm9wZXJ0aWVzKG51bGwsIG1zZ3MpOworCQl9CisJCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlBFUlNJU1RFTkNFX1VOSVRfX0RFU0NSSVBUSU9OOgorCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOworCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuUEVSU0lTVEVOQ0VfVU5JVF9fUFJPVklERVI6CisJCQkJcmV0dXJuIGdldFByb3ZpZGVyKCk7CisJCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5QRVJTSVNURU5DRV9VTklUX19KVEFfREFUQV9TT1VSQ0U6CisJCQkJcmV0dXJuIGdldEp0YURhdGFTb3VyY2UoKTsKKwkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlBFUlNJU1RFTkNFX1VOSVRfX05PTl9KVEFfREFUQV9TT1VSQ0U6CisJCQkJcmV0dXJuIGdldE5vbkp0YURhdGFTb3VyY2UoKTsKKwkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlBFUlNJU1RFTkNFX1VOSVRfX01BUFBJTkdfRklMRVM6CisJCQkJcmV0dXJuIGdldE1hcHBpbmdGaWxlcygpOworCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuUEVSU0lTVEVOQ0VfVU5JVF9fSkFSX0ZJTEVTOgorCQkJCXJldHVybiBnZXRKYXJGaWxlcygpOworCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuUEVSU0lTVEVOQ0VfVU5JVF9fQ0xBU1NFUzoKKwkJCQlyZXR1cm4gZ2V0Q2xhc3NlcygpOworCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuUEVSU0lTVEVOQ0VfVU5JVF9fRVhDTFVERV9VTkxJU1RFRF9DTEFTU0VTOgorCQkJCXJldHVybiBpc0V4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7CisJCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5QRVJTSVNURU5DRV9VTklUX19QUk9QRVJUSUVTOgorCQkJCXJldHVybiBnZXRQcm9wZXJ0aWVzKCk7CisJCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5QRVJTSVNURU5DRV9VTklUX19OQU1FOgorCQkJCXJldHVybiBnZXROYW1lKCk7CisJCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5QRVJTSVNURU5DRV9VTklUX19UUkFOU0FDVElPTl9UWVBFOgorCQkJCXJldHVybiBnZXRUcmFuc2FjdGlvblR5cGUoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5QRVJTSVNURU5DRV9VTklUX19ERVNDUklQVElPTjoKKwkJCQlzZXREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5QRVJTSVNURU5DRV9VTklUX19QUk9WSURFUjoKKwkJCQlzZXRQcm92aWRlcigoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5QRVJTSVNURU5DRV9VTklUX19KVEFfREFUQV9TT1VSQ0U6CisJCQkJc2V0SnRhRGF0YVNvdXJjZSgoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5QRVJTSVNURU5DRV9VTklUX19OT05fSlRBX0RBVEFfU09VUkNFOgorCQkJCXNldE5vbkp0YURhdGFTb3VyY2UoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuUEVSU0lTVEVOQ0VfVU5JVF9fTUFQUElOR19GSUxFUzoKKwkJCQlnZXRNYXBwaW5nRmlsZXMoKS5jbGVhcigpOworCQkJCWdldE1hcHBpbmdGaWxlcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgTWFwcGluZ0ZpbGVSZWY+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5QRVJTSVNURU5DRV9VTklUX19KQVJfRklMRVM6CisJCQkJZ2V0SmFyRmlsZXMoKS5jbGVhcigpOworCQkJCWdldEphckZpbGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5QRVJTSVNURU5DRV9VTklUX19DTEFTU0VTOgorCQkJCWdldENsYXNzZXMoKS5jbGVhcigpOworCQkJCWdldENsYXNzZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIEphdmFDbGFzc1JlZj4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlBFUlNJU1RFTkNFX1VOSVRfX0VYQ0xVREVfVU5MSVNURURfQ0xBU1NFUzoKKwkJCQlzZXRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlBFUlNJU1RFTkNFX1VOSVRfX1BST1BFUlRJRVM6CisJCQkJc2V0UHJvcGVydGllcygoUHJvcGVydGllcyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuUEVSU0lTVEVOQ0VfVU5JVF9fTkFNRToKKwkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlBFUlNJU1RFTkNFX1VOSVRfX1RSQU5TQUNUSU9OX1RZUEU6CisJCQkJc2V0VHJhbnNhY3Rpb25UeXBlKChQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlBFUlNJU1RFTkNFX1VOSVRfX0RFU0NSSVBUSU9OOgorCQkJCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5QRVJTSVNURU5DRV9VTklUX19QUk9WSURFUjoKKwkJCQlzZXRQcm92aWRlcihQUk9WSURFUl9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuUEVSU0lTVEVOQ0VfVU5JVF9fSlRBX0RBVEFfU09VUkNFOgorCQkJCXNldEp0YURhdGFTb3VyY2UoSlRBX0RBVEFfU09VUkNFX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5QRVJTSVNURU5DRV9VTklUX19OT05fSlRBX0RBVEFfU09VUkNFOgorCQkJCXNldE5vbkp0YURhdGFTb3VyY2UoTk9OX0pUQV9EQVRBX1NPVVJDRV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuUEVSU0lTVEVOQ0VfVU5JVF9fTUFQUElOR19GSUxFUzoKKwkJCQlnZXRNYXBwaW5nRmlsZXMoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlBFUlNJU1RFTkNFX1VOSVRfX0pBUl9GSUxFUzoKKwkJCQlnZXRKYXJGaWxlcygpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuUEVSU0lTVEVOQ0VfVU5JVF9fQ0xBU1NFUzoKKwkJCQlnZXRDbGFzc2VzKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5QRVJTSVNURU5DRV9VTklUX19FWENMVURFX1VOTElTVEVEX0NMQVNTRVM6CisJCQkJdW5zZXRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuUEVSU0lTVEVOQ0VfVU5JVF9fUFJPUEVSVElFUzoKKwkJCQlzZXRQcm9wZXJ0aWVzKChQcm9wZXJ0aWVzKW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlBFUlNJU1RFTkNFX1VOSVRfX05BTUU6CisJCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5QRVJTSVNURU5DRV9VTklUX19UUkFOU0FDVElPTl9UWVBFOgorCQkJCXVuc2V0VHJhbnNhY3Rpb25UeXBlKCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlBFUlNJU1RFTkNFX1VOSVRfX0RFU0NSSVBUSU9OOgorCQkJCXJldHVybiBERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gZGVzY3JpcHRpb24gIT0gbnVsbCA6ICFERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMoZGVzY3JpcHRpb24pOworCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuUEVSU0lTVEVOQ0VfVU5JVF9fUFJPVklERVI6CisJCQkJcmV0dXJuIFBST1ZJREVSX0VERUZBVUxUID09IG51bGwgPyBwcm92aWRlciAhPSBudWxsIDogIVBST1ZJREVSX0VERUZBVUxULmVxdWFscyhwcm92aWRlcik7CisJCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5QRVJTSVNURU5DRV9VTklUX19KVEFfREFUQV9TT1VSQ0U6CisJCQkJcmV0dXJuIEpUQV9EQVRBX1NPVVJDRV9FREVGQVVMVCA9PSBudWxsID8ganRhRGF0YVNvdXJjZSAhPSBudWxsIDogIUpUQV9EQVRBX1NPVVJDRV9FREVGQVVMVC5lcXVhbHMoanRhRGF0YVNvdXJjZSk7CisJCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5QRVJTSVNURU5DRV9VTklUX19OT05fSlRBX0RBVEFfU09VUkNFOgorCQkJCXJldHVybiBOT05fSlRBX0RBVEFfU09VUkNFX0VERUZBVUxUID09IG51bGwgPyBub25KdGFEYXRhU291cmNlICE9IG51bGwgOiAhTk9OX0pUQV9EQVRBX1NPVVJDRV9FREVGQVVMVC5lcXVhbHMobm9uSnRhRGF0YVNvdXJjZSk7CisJCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5QRVJTSVNURU5DRV9VTklUX19NQVBQSU5HX0ZJTEVTOgorCQkJCXJldHVybiBtYXBwaW5nRmlsZXMgIT0gbnVsbCAmJiAhbWFwcGluZ0ZpbGVzLmlzRW1wdHkoKTsKKwkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlBFUlNJU1RFTkNFX1VOSVRfX0pBUl9GSUxFUzoKKwkJCQlyZXR1cm4gamFyRmlsZXMgIT0gbnVsbCAmJiAhamFyRmlsZXMuaXNFbXB0eSgpOworCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuUEVSU0lTVEVOQ0VfVU5JVF9fQ0xBU1NFUzoKKwkJCQlyZXR1cm4gY2xhc3NlcyAhPSBudWxsICYmICFjbGFzc2VzLmlzRW1wdHkoKTsKKwkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlBFUlNJU1RFTkNFX1VOSVRfX0VYQ0xVREVfVU5MSVNURURfQ0xBU1NFUzoKKwkJCQlyZXR1cm4gaXNTZXRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCk7CisJCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5QRVJTSVNURU5DRV9VTklUX19QUk9QRVJUSUVTOgorCQkJCXJldHVybiBwcm9wZXJ0aWVzICE9IG51bGw7CisJCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5QRVJTSVNURU5DRV9VTklUX19OQU1FOgorCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7CisJCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5QRVJTSVNURU5DRV9VTklUX19UUkFOU0FDVElPTl9UWVBFOgorCQkJCXJldHVybiBpc1NldFRyYW5zYWN0aW9uVHlwZSgpOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKwl7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChkZXNjcmlwdGlvbjogIik7CisJCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb24pOworCQlyZXN1bHQuYXBwZW5kKCIsIHByb3ZpZGVyOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChwcm92aWRlcik7CisJCXJlc3VsdC5hcHBlbmQoIiwganRhRGF0YVNvdXJjZTogIik7CisJCXJlc3VsdC5hcHBlbmQoanRhRGF0YVNvdXJjZSk7CisJCXJlc3VsdC5hcHBlbmQoIiwgbm9uSnRhRGF0YVNvdXJjZTogIik7CisJCXJlc3VsdC5hcHBlbmQobm9uSnRhRGF0YVNvdXJjZSk7CisJCXJlc3VsdC5hcHBlbmQoIiwgamFyRmlsZXM6ICIpOworCQlyZXN1bHQuYXBwZW5kKGphckZpbGVzKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBleGNsdWRlVW5saXN0ZWRDbGFzc2VzOiAiKTsKKwkJaWYgKGV4Y2x1ZGVVbmxpc3RlZENsYXNzZXNFU2V0KSByZXN1bHQuYXBwZW5kKGV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBuYW1lOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChuYW1lKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCB0cmFuc2FjdGlvblR5cGU6ICIpOworCQlpZiAodHJhbnNhY3Rpb25UeXBlRVNldCkgcmVzdWx0LmFwcGVuZCh0cmFuc2FjdGlvblR5cGUpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKKwkJcmVzdWx0LmFwcGVuZCgnKScpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCit9IC8vIFBlcnNpc3RlbmNlVW5pdApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyNTgwNmUKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlLmphdmEKQEAgLTAsMCArMSwyMjcgQEAKKy8qKgorICogPGNvcHlyaWdodD4KKyAqIDwvY29weXJpZ2h0PgorICoKKyAqICRJZDogUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlLmphdmEsdiAxLjEgMjAwNy8wNy8zMCAyMDoxMzo0NiBwZnVsbGJyaWdodCBFeHAgJAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+VW5pdCBUcmFuc2FjdGlvbiBUeXBlPC9iPjwvZW0+JywKKyAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGFja2FnZSNnZXRQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUoKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBlbnVtIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSBpbXBsZW1lbnRzIEVudW1lcmF0b3IKK3sKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5KVEE8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjSlRBX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJSlRBKDAsICJKVEEiLCAiSlRBIiksCisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5SRVNPVVJDRSBMT0NBTDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNSRVNPVVJDRV9MT0NBTF9WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCVJFU09VUkNFX0xPQ0FMKDEsICJSRVNPVVJDRV9MT0NBTCIsICJSRVNPVVJDRV9MT0NBTCIpOworCisJLyoqCisJICogVGhlICc8ZW0+PGI+SlRBPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5KVEE8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjSlRBCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSlRBX1ZBTFVFID0gMDsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPlJFU09VUkNFIExPQ0FMPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5SRVNPVVJDRSBMT0NBTDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNSRVNPVVJDRV9MT0NBTAorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU09VUkNFX0xPQ0FMX1ZBTFVFID0gMTsKKworCS8qKgorCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5Vbml0IFRyYW5zYWN0aW9uIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZVtdIFZBTFVFU19BUlJBWSA9CisJCW5ldyBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGVbXQorCQl7CisJCQlKVEEsCisJCQlSRVNPVVJDRV9MT0NBTCwKKwkJfTsKKworCS8qKgorCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5Vbml0IFRyYW5zYWN0aW9uIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGU+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+VW5pdCBUcmFuc2FjdGlvbiBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIGdldChTdHJpbmcgbGl0ZXJhbCkKKwl7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKQorCQl7CisJCQlQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOworCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkKKwkJCXsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+VW5pdCBUcmFuc2FjdGlvbiBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkKKwl7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKQorCQl7CisJCQlQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOworCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKQorCQkJeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgJzxlbT48Yj5Vbml0IFRyYW5zYWN0aW9uIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgZ2V0KGludCB2YWx1ZSkKKwl7CisJCXN3aXRjaCAodmFsdWUpCisJCXsKKwkJCWNhc2UgSlRBX1ZBTFVFOiByZXR1cm4gSlRBOworCQkJY2FzZSBSRVNPVVJDRV9MT0NBTF9WQUxVRTogcmV0dXJuIFJFU09VUkNFX0xPQ0FMOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgaW50IHZhbHVlOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgU3RyaW5nIGxpdGVyYWw7CisKKwkvKioKKwkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpCisJeworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJCXRoaXMubGl0ZXJhbCA9IGxpdGVyYWw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGludCBnZXRWYWx1ZSgpCisJeworCSAgcmV0dXJuIHZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCisJeworCSAgcmV0dXJuIG5hbWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRMaXRlcmFsKCkKKwl7CisJICByZXR1cm4gbGl0ZXJhbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBsaXRlcmFsIHZhbHVlIG9mIHRoZSBlbnVtZXJhdG9yLCB3aGljaCBpcyBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorCXsKKwkJcmV0dXJuIGxpdGVyYWw7CisJfQorCQorfSAvL1BlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL3BlcnNpc3RlbmNlL1Byb3BlcnRpZXMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9wZXJzaXN0ZW5jZS9Qcm9wZXJ0aWVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZmMTI4ZgotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9wZXJzaXN0ZW5jZS9Qcm9wZXJ0aWVzLmphdmEKQEAgLTAsMCArMSwxODAgQEAKKy8qKgorICogPGNvcHlyaWdodD4KKyAqIDwvY29weXJpZ2h0PgorICoKKyAqICRJZDogUHJvcGVydGllcy5qYXZhLHYgMS4xIDIwMDcvMDcvMzAgMjA6MTM6NDYgcGZ1bGxicmlnaHQgRXhwICQKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZTsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb3BlcnRpZXM8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UuUHJvcGVydGllcyNnZXRQcm9wZXJ0aWVzIDxlbT5Qcm9wZXJ0aWVzPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBhY2thZ2UjZ2V0UHJvcGVydGllcygpCisgKiBAbW9kZWwga2luZD0iY2xhc3MiCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBQcm9wZXJ0aWVzIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBFT2JqZWN0Cit7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvcGVydGllcygpIDxlbT5Qcm9wZXJ0aWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFByb3BlcnRpZXMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFTGlzdDxQcm9wZXJ0eT4gcHJvcGVydGllczsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBQcm9wZXJ0aWVzKCkKKwl7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQorCXsKKwkJcmV0dXJuIFBlcnNpc3RlbmNlUGFja2FnZS5MaXRlcmFscy5QUk9QRVJUSUVTOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5Qcm9wZXJ0eX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvcGVydGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGFja2FnZSNnZXRQcm9wZXJ0aWVzX1Byb3BlcnRpZXMoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVMaXN0PFByb3BlcnR5PiBnZXRQcm9wZXJ0aWVzKCkKKwl7CisJCWlmIChwcm9wZXJ0aWVzID09IG51bGwpCisJCXsKKwkJCXByb3BlcnRpZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8UHJvcGVydHk+KFByb3BlcnR5LmNsYXNzLCB0aGlzLCBQZXJzaXN0ZW5jZVBhY2thZ2UuUFJPUEVSVElFU19fUFJPUEVSVElFUyk7CisJCX0KKwkJcmV0dXJuIHByb3BlcnRpZXM7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5QUk9QRVJUSUVTX19QUk9QRVJUSUVTOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0UHJvcGVydGllcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuUFJPUEVSVElFU19fUFJPUEVSVElFUzoKKwkJCQlyZXR1cm4gZ2V0UHJvcGVydGllcygpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlBST1BFUlRJRVNfX1BST1BFUlRJRVM6CisJCQkJZ2V0UHJvcGVydGllcygpLmNsZWFyKCk7CisJCQkJZ2V0UHJvcGVydGllcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgUHJvcGVydHk+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5QUk9QRVJUSUVTX19QUk9QRVJUSUVTOgorCQkJCWdldFByb3BlcnRpZXMoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5QUk9QRVJUSUVTX19QUk9QRVJUSUVTOgorCQkJCXJldHVybiBwcm9wZXJ0aWVzICE9IG51bGwgJiYgIXByb3BlcnRpZXMuaXNFbXB0eSgpOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKK30gLy8gUHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL3BlcnNpc3RlbmNlL1Byb3BlcnR5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvcGVyc2lzdGVuY2UvUHJvcGVydHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTVjYWIxCi0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL3BlcnNpc3RlbmNlL1Byb3BlcnR5LmphdmEKQEAgLTAsMCArMSwyNjIgQEAKKy8qKgorICogPGNvcHlyaWdodD4KKyAqIDwvY29weXJpZ2h0PgorICoKKyAqICRJZDogUHJvcGVydHkuamF2YSx2IDEuMSAyMDA3LzA3LzMwIDIwOjEzOjQ2IHBmdWxsYnJpZ2h0IEV4cCAkCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb3BlcnR5PC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLlByb3BlcnR5I2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLlByb3BlcnR5I2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQYWNrYWdlI2dldFByb3BlcnR5KCkKKyAqIEBtb2RlbCBraW5kPSJjbGFzcyIKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFByb3BlcnR5IGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBFT2JqZWN0Cit7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE5hbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgdmFsdWUgPSBWQUxVRV9FREVGQVVMVDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBQcm9wZXJ0eSgpCisJeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKKwl7CisJCXJldHVybiBQZXJzaXN0ZW5jZVBhY2thZ2UuTGl0ZXJhbHMuUFJPUEVSVFk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGFja2FnZSNnZXRQcm9wZXJ0eV9OYW1lKCkKKwkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHJlcXVpcmVkPSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQorCXsKKwkJcmV0dXJuIG5hbWU7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UuUHJvcGVydHkjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0TmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpCisJeworCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7CisJCW5hbWUgPSBuZXdOYW1lOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBQZXJzaXN0ZW5jZVBhY2thZ2UuUFJPUEVSVFlfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldFZhbHVlKFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGFja2FnZSNnZXRQcm9wZXJ0eV9WYWx1ZSgpCisJICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiByZXF1aXJlZD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpCisJeworCQlyZXR1cm4gdmFsdWU7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UuUHJvcGVydHkjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0VmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmV3VmFsdWUpCisJeworCQlTdHJpbmcgb2xkVmFsdWUgPSB2YWx1ZTsKKwkJdmFsdWUgPSBuZXdWYWx1ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUGVyc2lzdGVuY2VQYWNrYWdlLlBST1BFUlRZX19WQUxVRSwgb2xkVmFsdWUsIHZhbHVlKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKKwl7CisJCXN3aXRjaCAoZmVhdHVyZUlEKQorCQl7CisJCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5QUk9QRVJUWV9fTkFNRToKKwkJCQlyZXR1cm4gZ2V0TmFtZSgpOworCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuUFJPUEVSVFlfX1ZBTFVFOgorCQkJCXJldHVybiBnZXRWYWx1ZSgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlBST1BFUlRZX19OQU1FOgorCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuUFJPUEVSVFlfX1ZBTFVFOgorCQkJCXNldFZhbHVlKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQorCXsKKwkJc3dpdGNoIChmZWF0dXJlSUQpCisJCXsKKwkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlBST1BFUlRZX19OQU1FOgorCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuUFJPUEVSVFlfX1ZBTFVFOgorCQkJCXNldFZhbHVlKFZBTFVFX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCisJeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkKKwkJeworCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuUFJPUEVSVFlfX05BTUU6CisJCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKKwkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlBST1BFUlRZX19WQUxVRToKKwkJCQlyZXR1cm4gVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IHZhbHVlICE9IG51bGwgOiAhVkFMVUVfRURFRkFVTFQuZXF1YWxzKHZhbHVlKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpCisJeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7CisJCXJlc3VsdC5hcHBlbmQobmFtZSk7CisJCXJlc3VsdC5hcHBlbmQoIiwgdmFsdWU6ICIpOworCQlyZXN1bHQuYXBwZW5kKHZhbHVlKTsKKwkJcmVzdWx0LmFwcGVuZCgnKScpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCit9IC8vIFByb3BlcnR5CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvcGVyc2lzdGVuY2UvdHJhbnNsYXRvcnMvSmF2YUNsYXNzUmVmVHJhbnNsYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL3BlcnNpc3RlbmNlL3RyYW5zbGF0b3JzL0phdmFDbGFzc1JlZlRyYW5zbGF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGZlNDI1Ci0tLSAvZGV2L251bGwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL3BlcnNpc3RlbmNlL3RyYW5zbGF0b3JzL0phdmFDbGFzc1JlZlRyYW5zbGF0b3IuamF2YQpAQCAtMCwwICsxLDQzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLnRyYW5zbGF0b3JzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKKworcHVibGljIGNsYXNzIEphdmFDbGFzc1JlZlRyYW5zbGF0b3IgZXh0ZW5kcyBUcmFuc2xhdG9yCit7CisJcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGNoaWxkcmVuOworCQorCQorCXB1YmxpYyBKYXZhQ2xhc3NSZWZUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIGludCBzdHlsZSkgeworCQlzdXBlcihkb21OYW1lQW5kUGF0aCwgZmVhdHVyZSwgc3R5bGUpOworCX0KKwkKKwlwdWJsaWMgSmF2YUNsYXNzUmVmVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7CisJCXN1cGVyKGRvbU5hbWVBbmRQYXRoLCBmZWF0dXJlKTsKKwl9CisJCisJCisJcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgdGFyZ2V0LCBpbnQgdmVyc2lvbklEKSB7CisJCWlmIChjaGlsZHJlbiA9PSBudWxsKSB7CisJCQljaGlsZHJlbiA9IGNyZWF0ZUNoaWxkcmVuKCk7CisJCX0KKwkJcmV0dXJuIGNoaWxkcmVuOworCX0KKwkKKwlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gY3JlYXRlQ2hpbGRyZW4oKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKKwkJCW5ldyBUcmFuc2xhdG9yKFRFWFRfQVRUUklCVVRFX1ZBTFVFLCBQZXJzaXN0ZW5jZVBhY2thZ2UuZUlOU1RBTkNFLmdldEphdmFDbGFzc1JlZl9KYXZhQ2xhc3MoKSkKKwkJfTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvcGVyc2lzdGVuY2UvdHJhbnNsYXRvcnMvTWFwcGluZ0ZpbGVUcmFuc2xhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvcGVyc2lzdGVuY2UvdHJhbnNsYXRvcnMvTWFwcGluZ0ZpbGVUcmFuc2xhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU2N2ZiMAotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9wZXJzaXN0ZW5jZS90cmFuc2xhdG9ycy9NYXBwaW5nRmlsZVRyYW5zbGF0b3IuamF2YQpAQCAtMCwwICsxLDQzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogCisgKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLnRyYW5zbGF0b3JzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKKworcHVibGljIGNsYXNzIE1hcHBpbmdGaWxlVHJhbnNsYXRvciBleHRlbmRzIFRyYW5zbGF0b3IKK3sKKwlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gY2hpbGRyZW47CisJCisJCisJcHVibGljIE1hcHBpbmdGaWxlVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBpbnQgc3R5bGUpIHsKKwkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGZlYXR1cmUsIHN0eWxlKTsKKwl9CisKKwlwdWJsaWMgTWFwcGluZ0ZpbGVUcmFuc2xhdG9yKFN0cmluZyBkb21OYW1lQW5kUGF0aCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKKwkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGZlYXR1cmUpOworCX0KKwkKKwkKKwlwdWJsaWMgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKE9iamVjdCB0YXJnZXQsIGludCB2ZXJzaW9uSUQpIHsKKwkJaWYgKGNoaWxkcmVuID09IG51bGwpIHsKKwkJCWNoaWxkcmVuID0gY3JlYXRlQ2hpbGRyZW4oKTsKKwkJfQorCQlyZXR1cm4gY2hpbGRyZW47CisJfQorCQorCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBjcmVhdGVDaGlsZHJlbigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10geworCQkJbmV3IFRyYW5zbGF0b3IoVEVYVF9BVFRSSUJVVEVfVkFMVUUsIFBlcnNpc3RlbmNlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWFwcGluZ0ZpbGVSZWZfRmlsZU5hbWUoKSkKKwkJfTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvcGVyc2lzdGVuY2UvdHJhbnNsYXRvcnMvUGVyc2lzdGVuY2VUcmFuc2xhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvcGVyc2lzdGVuY2UvdHJhbnNsYXRvcnMvUGVyc2lzdGVuY2VUcmFuc2xhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVhZDM4NwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9wZXJzaXN0ZW5jZS90cmFuc2xhdG9ycy9QZXJzaXN0ZW5jZVRyYW5zbGF0b3IuamF2YQpAQCAtMCwwICsxLDE0NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKKyAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKKyAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcworICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLnRyYW5zbGF0b3JzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuY29tbW9uLnRyYW5zbGF0b3JzLkJvb2xlYW5UcmFuc2xhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5Db25zdGFudEF0dHJpYnV0ZVRyYW5zbGF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuR2VuZXJpY1RyYW5zbGF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuSURUcmFuc2xhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJvb3RUcmFuc2xhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7CisKK3B1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZVRyYW5zbGF0b3IgZXh0ZW5kcyBSb290VHJhbnNsYXRvcgorCWltcGxlbWVudHMgUGVyc2lzdGVuY2VYTUxNYXBwZXIKK3sKKwlwdWJsaWMgc3RhdGljIFBlcnNpc3RlbmNlVHJhbnNsYXRvciBJTlNUQU5DRSA9IG5ldyBQZXJzaXN0ZW5jZVRyYW5zbGF0b3IoKTsKKwkKKwlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gY2hpbGRyZW47CisJCisJcHJpdmF0ZSBzdGF0aWMgUGVyc2lzdGVuY2VQYWNrYWdlIFBFUlNJU1RFTkNFX1BLRyA9IFBlcnNpc3RlbmNlUGFja2FnZS5lSU5TVEFOQ0U7CisJCisJCisJcHVibGljIFBlcnNpc3RlbmNlVHJhbnNsYXRvcigpIHsKKwkJc3VwZXIoUEVSU0lTVEVOQ0UsIFBFUlNJU1RFTkNFX1BLRy5lSU5TVEFOQ0UuZ2V0UGVyc2lzdGVuY2UoKSk7CisJfQorCQorCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHRhcmdldCwgaW50IHZlcnNpb25JRCkgeworCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCkgeworCQkJY2hpbGRyZW4gPSBjcmVhdGVDaGlsZHJlbigpOworCQl9CisJCXJldHVybiBjaGlsZHJlbjsKKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGNyZWF0ZUNoaWxkcmVuKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7CisJCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCisJCQljcmVhdGVWZXJzaW9uVHJhbnNsYXRvcigpLAorCQkJbmV3IENvbnN0YW50QXR0cmlidXRlVHJhbnNsYXRvcihYTUxfTlMsIFBFUlNJU1RFTkNFX05TX1VSTCksCisJCQluZXcgQ29uc3RhbnRBdHRyaWJ1dGVUcmFuc2xhdG9yKFhNTF9OU19YU0ksIFhTSV9OU19VUkwpLAorCQkJbmV3IENvbnN0YW50QXR0cmlidXRlVHJhbnNsYXRvcihYU0lfU0NIRU1BX0xPQ0FUSU9OLCBQRVJTSVNURU5DRV9OU19VUkwgKyAnICcgKyBQRVJTSVNURU5DRV9TQ0hFTUFfTE9DXzFfMCksCisJCQljcmVhdGVQZXJzaXN0ZW5jZVVuaXRUcmFuc2xhdG9yKCkKKwkJfTsKKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVWZXJzaW9uVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKFBFUlNJU1RFTkNFX1ZFUlNJT04sIFBFUlNJU1RFTkNFX1BLRy5nZXRQZXJzaXN0ZW5jZV9WZXJzaW9uKCksIERPTV9BVFRSSUJVVEUpOworCX0KKwkKKwlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZVBlcnNpc3RlbmNlVW5pdFRyYW5zbGF0b3IoKSB7CisJCUdlbmVyaWNUcmFuc2xhdG9yIHRyYW5zbGF0b3IgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoUEVSU0lTVEVOQ0VfVU5JVCwgUEVSU0lTVEVOQ0VfUEtHLmdldFBlcnNpc3RlbmNlX1BlcnNpc3RlbmNlVW5pdHMoKSk7CisJCXRyYW5zbGF0b3Iuc2V0Q2hpbGRyZW4oCisJCQluZXcgVHJhbnNsYXRvcltdIHsKKwkJCQlJRFRyYW5zbGF0b3IuSU5TVEFOQ0UsCisJCQkJY3JlYXRlUGVyc2lzdGVuY2VVbml0TmFtZVRyYW5zbGF0b3IoKSwKKwkJCQljcmVhdGVUcmFuc2FjdGlvblR5cGVUcmFuc2xhdG9yKCksCisJCQkJY3JlYXRlUGVyc2lzdGVuY2VVbml0RGVzY3JpcHRpb25UcmFuc2xhdG9yKCksCisJCQkJY3JlYXRlUGVyc2lzdGVuY2VVbml0UHJvdmlkZXJUcmFuc2xhdG9yKCksCisJCQkJY3JlYXRlSnRhRGF0YVNvdXJjZVRyYW5zbGF0b3IoKSwKKwkJCQljcmVhdGVOb25KdGFEYXRhU291cmNlVHJhbnNsYXRvcigpLAorCQkJCWNyZWF0ZU1hcHBpbmdGaWxlVHJhbnNsYXRvcigpLAorCQkJCWNyZWF0ZUphckZpbGVUcmFuc2xhdG9yKCksCisJCQkJY3JlYXRlQ2xhc3NUcmFuc2xhdG9yKCksCisJCQkJY3JlYXRlRXhjbHVkZVVubGlzdGVkQ2xhc3Nlc1RyYW5zbGF0b3IoKSwKKwkJCQljcmVhdGVQcm9wZXJ0aWVzVHJhbnNsYXRvcigpCisJCQl9CisJCSk7CisJCXJldHVybiB0cmFuc2xhdG9yOworCX0KKwkKKwlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZVBlcnNpc3RlbmNlVW5pdE5hbWVUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoUEVSU0lTVEVOQ0VfVU5JVF9OQU1FLCBQRVJTSVNURU5DRV9QS0cuZ2V0UGVyc2lzdGVuY2VVbml0X05hbWUoKSwgRE9NX0FUVFJJQlVURSk7CisJfQorCQorCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlVHJhbnNhY3Rpb25UeXBlVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2FjdGlvblR5cGVUcmFuc2xhdG9yKCk7CisJfQorCQorCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlUGVyc2lzdGVuY2VVbml0RGVzY3JpcHRpb25UcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoUEVSU0lTVEVOQ0VfVU5JVF9ERVNDUklQVElPTiwgUEVSU0lTVEVOQ0VfUEtHLmdldFBlcnNpc3RlbmNlVW5pdF9EZXNjcmlwdGlvbigpKTsKKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVQZXJzaXN0ZW5jZVVuaXRQcm92aWRlclRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihQRVJTSVNURU5DRV9VTklUX1BST1ZJREVSLCBQRVJTSVNURU5DRV9QS0cuZ2V0UGVyc2lzdGVuY2VVbml0X1Byb3ZpZGVyKCksIFVOU0VUX0lGX05VTEwpOworCX0KKwkKKwlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZUp0YURhdGFTb3VyY2VUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlRBX0RBVEFfU09VUkNFLCBQRVJTSVNURU5DRV9QS0cuZ2V0UGVyc2lzdGVuY2VVbml0X0p0YURhdGFTb3VyY2UoKSk7CisJfQorCQorCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlTm9uSnRhRGF0YVNvdXJjZVRyYW5zbGF0b3IoKSB7CisJCXJldHVybiBuZXcgVHJhbnNsYXRvcihOT05fSlRBX0RBVEFfU09VUkNFLCBQRVJTSVNURU5DRV9QS0cuZ2V0UGVyc2lzdGVuY2VVbml0X05vbkp0YURhdGFTb3VyY2UoKSk7CisJfQorCQorCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlTWFwcGluZ0ZpbGVUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IE1hcHBpbmdGaWxlVHJhbnNsYXRvcihNQVBQSU5HX0ZJTEUsIFBFUlNJU1RFTkNFX1BLRy5nZXRQZXJzaXN0ZW5jZVVuaXRfTWFwcGluZ0ZpbGVzKCkpOworCX0KKwkKKwlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZUphckZpbGVUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSkFSX0ZJTEUsIFBFUlNJU1RFTkNFX1BLRy5nZXRQZXJzaXN0ZW5jZVVuaXRfSmFyRmlsZXMoKSk7CisJfQorCQorCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlQ2xhc3NUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IEphdmFDbGFzc1JlZlRyYW5zbGF0b3IoQ0xBU1MsIFBFUlNJU1RFTkNFX1BLRy5nZXRQZXJzaXN0ZW5jZVVuaXRfQ2xhc3NlcygpKTsKKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVFeGNsdWRlVW5saXN0ZWRDbGFzc2VzVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBCb29sZWFuVHJhbnNsYXRvcihFWENMVURFX1VOTElTVEVEX0NMQVNTRVMsIFBFUlNJU1RFTkNFX1BLRy5nZXRQZXJzaXN0ZW5jZVVuaXRfRXhjbHVkZVVubGlzdGVkQ2xhc3NlcygpLCBVTlNFVF9JRl9OVUxMKTsKKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVQcm9wZXJ0aWVzVHJhbnNsYXRvcigpIHsKKwkJR2VuZXJpY1RyYW5zbGF0b3IgdHJhbnNsYXRvciA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihQUk9QRVJUSUVTLCBQRVJTSVNURU5DRV9QS0cuZ2V0UGVyc2lzdGVuY2VVbml0X1Byb3BlcnRpZXMoKSk7CisJCXRyYW5zbGF0b3Iuc2V0Q2hpbGRyZW4oCisJCQluZXcgVHJhbnNsYXRvcltdIHsKKwkJCQljcmVhdGVQcm9wZXJ0eVRyYW5zbGF0b3IoKQorCQkJfQorCQkpOworCQlyZXR1cm4gdHJhbnNsYXRvcjsKKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvciBjcmVhdGVQcm9wZXJ0eVRyYW5zbGF0b3IoKSB7CisJCUdlbmVyaWNUcmFuc2xhdG9yIHRyYW5zbGF0b3IgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoUFJPUEVSVFksIFBFUlNJU1RFTkNFX1BLRy5nZXRQcm9wZXJ0aWVzX1Byb3BlcnRpZXMoKSwgRU5EX1RBR19OT19JTkRFTlQpOworCQl0cmFuc2xhdG9yLnNldENoaWxkcmVuKAorCQkJbmV3IFRyYW5zbGF0b3JbXSB7CisJCQkJY3JlYXRlUHJvcGVydHlOYW1lVHJhbnNsYXRvcigpLAorCQkJCWNyZWF0ZVByb3BlcnR5VmFsdWVUcmFuc2xhdG9yKCkKKwkJCX0KKwkJKTsKKwkJcmV0dXJuIHRyYW5zbGF0b3I7CisJfQorCQorCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlUHJvcGVydHlOYW1lVHJhbnNsYXRvcigpIHsKKwkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKFBST1BFUlRZX05BTUUsIFBFUlNJU1RFTkNFX1BLRy5nZXRQcm9wZXJ0eV9OYW1lKCksIERPTV9BVFRSSUJVVEUpOworCX0KKwkKKwlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yIGNyZWF0ZVByb3BlcnR5VmFsdWVUcmFuc2xhdG9yKCkgeworCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoUFJPUEVSVFlfVkFMVUUsIFBFUlNJU1RFTkNFX1BLRy5nZXRQcm9wZXJ0eV9WYWx1ZSgpLCBET01fQVRUUklCVVRFKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvcGVyc2lzdGVuY2UvdHJhbnNsYXRvcnMvUGVyc2lzdGVuY2VYTUxNYXBwZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9wZXJzaXN0ZW5jZS90cmFuc2xhdG9ycy9QZXJzaXN0ZW5jZVhNTE1hcHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0Yjg0MmMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvcGVyc2lzdGVuY2UvdHJhbnNsYXRvcnMvUGVyc2lzdGVuY2VYTUxNYXBwZXIuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcworICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCisgKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UudHJhbnNsYXRvcnM7CisKK3B1YmxpYyBpbnRlcmZhY2UgUGVyc2lzdGVuY2VYTUxNYXBwZXIKK3sKKwlTdHJpbmcgWE1MX05TID0gInhtbG5zIjsgIC8vJE5PTi1OTFMtMSQKKwlTdHJpbmcgWE1MX05TX1hTSSA9ICJ4bWxuczp4c2kiOyAgLy8kTk9OLU5MUy0xJAorCVN0cmluZyBYU0lfU0NIRU1BX0xPQ0FUSU9OID0gInhzaTpzY2hlbWFMb2NhdGlvbiI7ICAvLyROT04tTkxTLTEkCisJU3RyaW5nIFhTSV9OU19VUkwgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiOyAgLy8kTk9OLU5MUy0xJAorCVN0cmluZyBQRVJTSVNURU5DRV9OU19VUkwgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvcGVyc2lzdGVuY2UiOyAgLy8kTk9OLU5MUy0xJAorCVN0cmluZyBQRVJTSVNURU5DRV9TQ0hFTUFfTE9DXzFfMCA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wZXJzaXN0ZW5jZS9wZXJzaXN0ZW5jZV8xXzAueHNkIjsgIC8vJE5PTi1OTFMtMSQKKwkKKwkKKwlTdHJpbmcgUEVSU0lTVEVOQ0UgPSAicGVyc2lzdGVuY2UiOyAgLy8kTk9OLU5MUy0xJAorCVN0cmluZyBQRVJTSVNURU5DRV9WRVJTSU9OID0gInZlcnNpb24iOyAgLy8kTk9OLU5MUy0xJAorCVN0cmluZyBQRVJTSVNURU5DRV9VTklUID0gInBlcnNpc3RlbmNlLXVuaXQiOyAgLy8kTk9OLU5MUy0xJAorCVN0cmluZyBQRVJTSVNURU5DRV9VTklUX05BTUUgPSAibmFtZSI7ICAvLyROT04tTkxTLTEkCisJU3RyaW5nIFBFUlNJU1RFTkNFX1VOSVRfREVTQ1JJUFRJT04gPSAiZGVzY3JpcHRpb24iOyAgLy8kTk9OLU5MUy0xJAorCVN0cmluZyBQRVJTSVNURU5DRV9VTklUX1BST1ZJREVSID0gInByb3ZpZGVyIjsgIC8vJE5PTi1OTFMtMSQKKwlTdHJpbmcgSlRBX0RBVEFfU09VUkNFID0gImp0YS1kYXRhLXNvdXJjZSI7ICAvLyROT04tTkxTLTEkCisJU3RyaW5nIE5PTl9KVEFfREFUQV9TT1VSQ0UgPSAibm9uLWp0YS1kYXRhLXNvdXJjZSI7ICAvLyROT04tTkxTLTEkCisJU3RyaW5nIE1BUFBJTkdfRklMRSA9ICJtYXBwaW5nLWZpbGUiOyAgLy8kTk9OLU5MUy0xJAorCVN0cmluZyBKQVJfRklMRSA9ICJqYXItZmlsZSI7ICAvLyROT04tTkxTLTEkCisJU3RyaW5nIENMQVNTID0gImNsYXNzIjsgIC8vJE5PTi1OTFMtMSQKKwlTdHJpbmcgRVhDTFVERV9VTkxJU1RFRF9DTEFTU0VTID0gImV4Y2x1ZGUtdW5saXN0ZWQtY2xhc3NlcyI7ICAvLyROT04tTkxTLTEkCisJU3RyaW5nIFBST1BFUlRJRVMgPSAicHJvcGVydGllcyI7ICAvLyROT04tTkxTLTEkCisJU3RyaW5nIFBST1BFUlRZID0gInByb3BlcnR5IjsgIC8vJE5PTi1OTFMtMSQKKwlTdHJpbmcgUFJPUEVSVFlfTkFNRSA9ICJuYW1lIjsgIC8vJE5PTi1OTFMtMSQKKwlTdHJpbmcgUFJPUEVSVFlfVkFMVUUgPSAidmFsdWUiOyAgLy8kTk9OLU5MUy0xJAorCVN0cmluZyBUUkFOU0FDVElPTl9UWVBFID0gInRyYW5zYWN0aW9uLXR5cGUiOyAgLy8kTk9OLU5MUy0xJAorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL3BlcnNpc3RlbmNlL3RyYW5zbGF0b3JzL1RyYW5zYWN0aW9uVHlwZVRyYW5zbGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9wZXJzaXN0ZW5jZS90cmFuc2xhdG9ycy9UcmFuc2FjdGlvblR5cGVUcmFuc2xhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFkM2M5NwotLS0gL2Rldi9udWxsCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9wZXJzaXN0ZW5jZS90cmFuc2xhdG9ycy9UcmFuc2FjdGlvblR5cGVUcmFuc2xhdG9yLmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKKyAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKKyAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcworICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLnRyYW5zbGF0b3JzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOworCitwdWJsaWMgY2xhc3MgVHJhbnNhY3Rpb25UeXBlVHJhbnNsYXRvciBleHRlbmRzIFRyYW5zbGF0b3IKKwlpbXBsZW1lbnRzIFBlcnNpc3RlbmNlWE1MTWFwcGVyCit7CisJcHVibGljIFRyYW5zYWN0aW9uVHlwZVRyYW5zbGF0b3IoKSB7CisJCXN1cGVyKFRSQU5TQUNUSU9OX1RZUEUsIFBlcnNpc3RlbmNlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGVyc2lzdGVuY2VVbml0X1RyYW5zYWN0aW9uVHlwZSgpKTsKKwl9CisJCisJcHVibGljIE9iamVjdCBjb252ZXJ0U3RyaW5nVG9WYWx1ZShTdHJpbmcgc3RyVmFsdWUsIEVPYmplY3Qgb3duZXIpIHsKKwkJU3RyaW5nIGFkalN0clZhbHVlID0gc3RyVmFsdWU7CisJCVN0cmluZyBqdGFTdHJWYWx1ZSA9IFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZS5KVEEuZ2V0TmFtZSgpOworCQlTdHJpbmcgcmVzb3VyY2VMb2NhbFN0clZhbHVlID0gUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlLlJFU09VUkNFX0xPQ0FMLmdldE5hbWUoKTsKKwkJCisJCWlmIChqdGFTdHJWYWx1ZS5lcXVhbHMoc3RyVmFsdWUudG9VcHBlckNhc2UoKSkpIHsgIC8vJE5PTi1OTFMtMSQKKwkJCWFkalN0clZhbHVlID0ganRhU3RyVmFsdWU7CisJCX0KKwkJZWxzZSBpZiAocmVzb3VyY2VMb2NhbFN0clZhbHVlLmVxdWFscyhzdHJWYWx1ZS50b1VwcGVyQ2FzZSgpKSkgeyAgLy8kTk9OLU5MUy0xJAorCQkJYWRqU3RyVmFsdWUgPSByZXNvdXJjZUxvY2FsU3RyVmFsdWU7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmNvbnZlcnRTdHJpbmdUb1ZhbHVlKGFkalN0clZhbHVlLCBvd25lcik7CisJfQorfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL3BlcnNpc3RlbmNlL3V0aWwvUGVyc2lzdGVuY2VBZGFwdGVyRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3Jlc291cmNlL3BlcnNpc3RlbmNlL3V0aWwvUGVyc2lzdGVuY2VBZGFwdGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhOGVhNWQKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvcGVyc2lzdGVuY2UvdXRpbC9QZXJzaXN0ZW5jZUFkYXB0ZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwyMzkgQEAKKy8qKgorICogPGNvcHlyaWdodD4KKyAqIDwvY29weXJpZ2h0PgorICoKKyAqICRJZDogUGVyc2lzdGVuY2VBZGFwdGVyRmFjdG9yeS5qYXZhLHYgMS4yIDIwMDcvMDgvMjEgMTY6MTk6MzYga21vb3JlIEV4cCAkCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UudXRpbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UuSmF2YUNsYXNzUmVmOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLk1hcHBpbmdGaWxlUmVmOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UuUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5Qcm9wZXJ0eTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogVGhlIDxiPkFkYXB0ZXIgRmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KKyAqIEl0IHByb3ZpZGVzIGFuIGFkYXB0ZXIgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGFja2FnZQorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbAoreworCS8qKgorCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIFBlcnNpc3RlbmNlUGFja2FnZSBtb2RlbFBhY2thZ2U7CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBhZGFwdGVyIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFBlcnNpc3RlbmNlQWRhcHRlckZhY3RvcnkoKQorCXsKKwkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKQorCQl7CisJCQltb2RlbFBhY2thZ2UgPSBQZXJzaXN0ZW5jZVBhY2thZ2UuZUlOU1RBTkNFOworCQl9CisJfQorCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvYmplY3QgaXMgZWl0aGVyIHRoZSBtb2RlbCdzIHBhY2thZ2Ugb3IgaXMgYW4gaW5zdGFuY2Ugb2JqZWN0IG9mIHRoZSBtb2RlbC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IG9iamVjdCkKKwl7CisJCWlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKQorCQl7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkKKwkJeworCQkJcmV0dXJuICgoRU9iamVjdClvYmplY3QpLmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gbW9kZWxQYWNrYWdlOworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKioKKwkgKiBUaGUgc3dpdGNoIHRoZSBkZWxlZ2F0ZXMgdG8gdGhlIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VTd2l0Y2g8QWRhcHRlcj4gbW9kZWxTd2l0Y2ggPQorCQluZXcgUGVyc2lzdGVuY2VTd2l0Y2g8QWRhcHRlcj4oKQorCQl7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VQZXJzaXN0ZW5jZShQZXJzaXN0ZW5jZSBvYmplY3QpCisJCQl7CisJCQkJcmV0dXJuIGNyZWF0ZVBlcnNpc3RlbmNlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlUGVyc2lzdGVuY2VVbml0KFBlcnNpc3RlbmNlVW5pdCBvYmplY3QpCisJCQl7CisJCQkJcmV0dXJuIGNyZWF0ZVBlcnNpc3RlbmNlVW5pdEFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZU1hcHBpbmdGaWxlUmVmKE1hcHBpbmdGaWxlUmVmIG9iamVjdCkKKwkJCXsKKwkJCQlyZXR1cm4gY3JlYXRlTWFwcGluZ0ZpbGVSZWZBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VKYXZhQ2xhc3NSZWYoSmF2YUNsYXNzUmVmIG9iamVjdCkKKwkJCXsKKwkJCQlyZXR1cm4gY3JlYXRlSmF2YUNsYXNzUmVmQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlUHJvcGVydGllcyhQcm9wZXJ0aWVzIG9iamVjdCkKKwkJCXsKKwkJCQlyZXR1cm4gY3JlYXRlUHJvcGVydGllc0FkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZVByb3BlcnR5KFByb3BlcnR5IG9iamVjdCkKKwkJCXsKKwkJCQlyZXR1cm4gY3JlYXRlUHJvcGVydHlBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KQorCQkJeworCQkJCXJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOworCQkJfQorCQl9OworCisJLyoqCisJICogQ3JlYXRlcyBhbiBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB0YXJnZXQgdGhlIG9iamVjdCB0byBhZGFwdC4KKwkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpCisJeworCQlyZXR1cm4gbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKKwl9CisKKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2UgPGVtPlBlcnNpc3RlbmNlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBlcnNpc3RlbmNlQWRhcHRlcigpCisJeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdCA8ZW0+VW5pdDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlUGVyc2lzdGVuY2VVbml0QWRhcHRlcigpCisJeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLk1hcHBpbmdGaWxlUmVmIDxlbT5NYXBwaW5nIEZpbGUgUmVmPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLk1hcHBpbmdGaWxlUmVmCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1hcHBpbmdGaWxlUmVmQWRhcHRlcigpCisJeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLkphdmFDbGFzc1JlZiA8ZW0+SmF2YSBDbGFzcyBSZWY8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UuSmF2YUNsYXNzUmVmCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUphdmFDbGFzc1JlZkFkYXB0ZXIoKQorCXsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5Qcm9wZXJ0aWVzIDxlbT5Qcm9wZXJ0aWVzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLlByb3BlcnRpZXMKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvcGVydGllc0FkYXB0ZXIoKQorCXsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5Qcm9wZXJ0eSA8ZW0+UHJvcGVydHk8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UuUHJvcGVydHkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvcGVydHlBZGFwdGVyKCkKKwl7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgdGhlIGRlZmF1bHQgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCkKKwl7CisJCXJldHVybiBudWxsOworCX0KKworfSAvL1BlcnNpc3RlbmNlQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9wZXJzaXN0ZW5jZS91dGlsL1BlcnNpc3RlbmNlU3dpdGNoLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvcGVyc2lzdGVuY2UvdXRpbC9QZXJzaXN0ZW5jZVN3aXRjaC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3ZjAzNjMKLS0tIC9kZXYvbnVsbAorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvcGVyc2lzdGVuY2UvdXRpbC9QZXJzaXN0ZW5jZVN3aXRjaC5qYXZhCkBAIC0wLDAgKzEsMjYxIEBACisvKioKKyAqIDxjb3B5cmlnaHQ+CisgKiA8L2NvcHlyaWdodD4KKyAqCisgKiAkSWQ6IFBlcnNpc3RlbmNlU3dpdGNoLmphdmEsdiAxLjIgMjAwNy8wOC8yMSAxNjoxOTozNiBrbW9vcmUgRXhwICQKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS51dGlsOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5KYXZhQ2xhc3NSZWY7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UuTWFwcGluZ0ZpbGVSZWY7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5Qcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLlByb3BlcnR5OworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBUaGUgPGI+U3dpdGNoPC9iPiBmb3IgdGhlIG1vZGVsJ3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5LgorICogSXQgc3VwcG9ydHMgdGhlIGNhbGwge0BsaW5rICNkb1N3aXRjaChFT2JqZWN0KSBkb1N3aXRjaChvYmplY3QpfQorICogdG8gaW52b2tlIHRoZSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLAorICogc3RhcnRpbmcgd2l0aCB0aGUgYWN0dWFsIGNsYXNzIG9mIHRoZSBvYmplY3QKKyAqIGFuZCBwcm9jZWVkaW5nIHVwIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkKKyAqIHVudGlsIGEgbm9uLW51bGwgcmVzdWx0IGlzIHJldHVybmVkLAorICogd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiB0aGUgc3dpdGNoLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGFja2FnZQorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VTd2l0Y2g8VD4KK3sKKwkvKioKKwkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIFBlcnNpc3RlbmNlUGFja2FnZSBtb2RlbFBhY2thZ2U7CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzd2l0Y2guCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFBlcnNpc3RlbmNlU3dpdGNoKCkKKwl7CisJCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkKKwkJeworCQkJbW9kZWxQYWNrYWdlID0gUGVyc2lzdGVuY2VQYWNrYWdlLmVJTlNUQU5DRTsKKwkJfQorCX0KKworCS8qKgorCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KQorCXsKKwkJcmV0dXJuIGRvU3dpdGNoKHRoZUVPYmplY3QuZUNsYXNzKCksIHRoZUVPYmplY3QpOworCX0KKworCS8qKgorCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFQgZG9Td2l0Y2goRUNsYXNzIHRoZUVDbGFzcywgRU9iamVjdCB0aGVFT2JqZWN0KQorCXsKKwkJaWYgKHRoZUVDbGFzcy5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlKQorCQl7CisJCQlyZXR1cm4gZG9Td2l0Y2godGhlRUNsYXNzLmdldENsYXNzaWZpZXJJRCgpLCB0aGVFT2JqZWN0KTsKKwkJfQorCQllbHNlCisJCXsKKwkJCUxpc3Q8RUNsYXNzPiBlU3VwZXJUeXBlcyA9IHRoZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpOworCQkJcmV0dXJuCisJCQkJZVN1cGVyVHlwZXMuaXNFbXB0eSgpID8KKwkJCQkJZGVmYXVsdENhc2UodGhlRU9iamVjdCkgOgorCQkJCQlkb1N3aXRjaChlU3VwZXJUeXBlcy5nZXQoMCksIHRoZUVPYmplY3QpOworCQl9CisJfQorCisJLyoqCisJICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVCBkb1N3aXRjaChpbnQgY2xhc3NpZmllcklELCBFT2JqZWN0IHRoZUVPYmplY3QpCisJeworCQlzd2l0Y2ggKGNsYXNzaWZpZXJJRCkKKwkJeworCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuUEVSU0lTVEVOQ0U6CisJCQl7CisJCQkJUGVyc2lzdGVuY2UgcGVyc2lzdGVuY2UgPSAoUGVyc2lzdGVuY2UpdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VQZXJzaXN0ZW5jZShwZXJzaXN0ZW5jZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuUEVSU0lTVEVOQ0VfVU5JVDoKKwkJCXsKKwkJCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gKFBlcnNpc3RlbmNlVW5pdCl0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZVBlcnNpc3RlbmNlVW5pdChwZXJzaXN0ZW5jZVVuaXQpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLk1BUFBJTkdfRklMRV9SRUY6CisJCQl7CisJCQkJTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSAoTWFwcGluZ0ZpbGVSZWYpdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VNYXBwaW5nRmlsZVJlZihtYXBwaW5nRmlsZVJlZik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuSkFWQV9DTEFTU19SRUY6CisJCQl7CisJCQkJSmF2YUNsYXNzUmVmIGphdmFDbGFzc1JlZiA9IChKYXZhQ2xhc3NSZWYpdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VKYXZhQ2xhc3NSZWYoamF2YUNsYXNzUmVmKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5QUk9QRVJUSUVTOgorCQkJeworCQkJCVByb3BlcnRpZXMgcHJvcGVydGllcyA9IChQcm9wZXJ0aWVzKXRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlUHJvcGVydGllcyhwcm9wZXJ0aWVzKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5QUk9QRVJUWToKKwkJCXsKKwkJCQlQcm9wZXJ0eSBwcm9wZXJ0eSA9IChQcm9wZXJ0eSl0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZVByb3BlcnR5KHByb3BlcnR5KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQlkZWZhdWx0OiByZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QZXJzaXN0ZW5jZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBlcnNpc3RlbmNlPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlUGVyc2lzdGVuY2UoUGVyc2lzdGVuY2Ugb2JqZWN0KQorCXsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VW5pdDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlVuaXQ8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VQZXJzaXN0ZW5jZVVuaXQoUGVyc2lzdGVuY2VVbml0IG9iamVjdCkKKwl7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1hcHBpbmcgRmlsZSBSZWY8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NYXBwaW5nIEZpbGUgUmVmPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlTWFwcGluZ0ZpbGVSZWYoTWFwcGluZ0ZpbGVSZWYgb2JqZWN0KQorCXsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SmF2YSBDbGFzcyBSZWY8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5KYXZhIENsYXNzIFJlZjwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZUphdmFDbGFzc1JlZihKYXZhQ2xhc3NSZWYgb2JqZWN0KQorCXsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvcGVydGllczwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb3BlcnRpZXM8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VQcm9wZXJ0aWVzKFByb3BlcnRpZXMgb2JqZWN0KQorCXsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvcGVydHk8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9wZXJ0eTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZVByb3BlcnR5KFByb3BlcnR5IG9iamVjdCkKKwl7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaCwgYnV0IHRoaXMgaXMgdGhlIGxhc3QgY2FzZSBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpCisJeworCQlyZXR1cm4gbnVsbDsKKwl9CisKK30gLy9QZXJzaXN0ZW5jZVN3aXRjaApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3N5bmNoL1N5bmNocm9uaXplQ2xhc3Nlc0pvYi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL2ludGVybmFsL3N5bmNoL1N5bmNocm9uaXplQ2xhc3Nlc0pvYi5qYXZhCmluZGV4IGZmNzYwYzEuLjM2Y2YxNDUgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS9pbnRlcm5hbC9zeW5jaC9TeW5jaHJvbml6ZUNsYXNzZXNKb2IuamF2YQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvaW50ZXJuYWwvc3luY2gvU3luY2hyb25pemVDbGFzc2VzSm9iLmphdmEKQEAgLTkyLDEwICs5Miw5IEBACiAJCVBlcnNpc3RlbmNlUmVzb3VyY2UgcmVzb3VyY2UgPSAoUGVyc2lzdGVuY2VSZXNvdXJjZSkgcGVyc2lzdGVuY2VVbml0LmVSZXNvdXJjZSgpOwogCQkKIAkJcGVyc2lzdGVuY2VVbml0LmdldENsYXNzZXMoKS5jbGVhcigpOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gbWFwcGVkVHlwZU5hbWVzKHBlcnNpc3RlbmNlVW5pdCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJU3RyaW5nIHR5cGVOYW1lID0gc3RyZWFtLm5leHQoKTsKKwkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuc29ydGVkTWFwcGVkVHlwZU5hbWVzKHBlcnNpc3RlbmNlVW5pdCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewogCQkJSmF2YUNsYXNzUmVmIGNsYXNzUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVKYXZhQ2xhc3NSZWYoKTsKLQkJCWNsYXNzUmVmLnNldEphdmFDbGFzcyh0eXBlTmFtZSk7CisJCQljbGFzc1JlZi5zZXRKYXZhQ2xhc3Moc3RyZWFtLm5leHQoKSk7CiAJCQlwZXJzaXN0ZW5jZVVuaXQuZ2V0Q2xhc3NlcygpLmFkZChjbGFzc1JlZik7CiAJCX0KIAkJCkBAIC0xMTEsMTUgKzExMCwxNyBAQAogCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKIAl9CiAJCisJcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IHNvcnRlZE1hcHBlZFR5cGVOYW1lcyhQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0KSB7CisJCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuc29ydCh0aGlzLm1hcHBlZFR5cGVOYW1lcyhwZXJzaXN0ZW5jZVVuaXQpKTsKKwl9CisJCiAJcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IG1hcHBlZFR5cGVOYW1lcyhQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0KSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuc29ydCgKLQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPElQZXJzaXN0ZW50VHlwZSwgU3RyaW5nPihtYXBwZWRUeXBlcyhwZXJzaXN0ZW5jZVVuaXQpKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oSVBlcnNpc3RlbnRUeXBlIG5leHQpIHsKLQkJCQkJcmV0dXJuIG5leHQuZmluZEpkdFR5cGUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKTsKLQkJCQl9CisJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxJUGVyc2lzdGVudFR5cGUsIFN0cmluZz4odGhpcy5tYXBwZWRUeXBlcyhwZXJzaXN0ZW5jZVVuaXQpKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKElQZXJzaXN0ZW50VHlwZSBwVHlwZSkgeworCQkJCXJldHVybiBwVHlwZS5maW5kSmR0VHlwZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOwogCQkJfQotCQkpOworCQl9OwogCX0KIAkKIAlwcml2YXRlIEl0ZXJhdG9yPElQZXJzaXN0ZW50VHlwZT4gbWFwcGVkVHlwZXMoUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCkgewpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpLy5jbGFzc3BhdGggYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA0ZTg2MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvLmN2c2lnbm9yZSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTRjNmE4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbAotamF2YUNvbXBpbGVyLi4uYXJncwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS8ucHJvamVjdCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhlYTVkYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuZGIudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlNGI4YzEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1N1biBNYXkgMjcgMTU6MTA6MzggRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0MmMyODYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI1N1biBNYXkgMjcgMTQ6NTk6NDIgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGE0ZDkxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qcHQuZGIudWkKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC5xdWFsaWZpZXIKLUJ1bmRsZS1DbGFzc1BhdGg6IC4KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpwdC5kYi51aS5pbnRlcm5hbDsgeC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanB0LnVpIgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpLAotIG9yZy5lY2xpcHNlLmpwdC5kYiwKLSBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LnVpLAotIG9yZy5lY2xpcHNlLmRhdGF0b29scy5zcWx0b29scy5lZGl0b3IuY29yZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvYWJvdXQuaHRtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTczYmRhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvYnVpbGQucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDU2OTgxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLWphcnMuY29tcGlsZS5vcmRlciA9IC4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS9jb21wb25lbnQueG1sIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpL2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNjQ4YWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpL2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pjxjb21wb25lbnQgIHhtbG5zPSJodHRwOi8vZWNsaXBzZS5vcmcvd3RwL3JlbGVuZy90b29scy9jb21wb25lbnQtbW9kZWwiIG5hbWU9Im9yZy5lY2xpcHNlLmpwdC5kYi51aSI+PGRlc2NyaXB0aW9uIHVybD0iIj48L2Rlc2NyaXB0aW9uPjxjb21wb25lbnQtZGVwZW5kcyB1bnJlc3RyaWN0ZWQ9InRydWUiPjwvY29tcG9uZW50LWRlcGVuZHM+PHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LmRiLnVpIiBmcmFnbWVudD0iZmFsc2UiLz48L2NvbXBvbmVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMGU1ODMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUbyBjb2RlIGRldmVsb3BlcjoKLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1wbHVnaW5OYW1lID0gSmF2YSBQZXJzaXN0ZW5jZSBBUEkgVG9vbHMgLSBEQiBVSQotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKLQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdWkvaW50ZXJuYWwvRFRQVWlUb29scy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdWkvaW50ZXJuYWwvRFRQVWlUb29scy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzJmZTgxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3VpL2ludGVybmFsL0RUUFVpVG9vbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LklDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LklDb25uZWN0aW9uUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LklQcm9maWxlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5Qcm9maWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmludGVybmFsLkNvbm5lY3Rpb25Qcm9maWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmludGVybmFsLnVpLndpemFyZHMuQ1BXaXphcmROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuaW50ZXJuYWwudWkud2l6YXJkcy5OZXdDUFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmludGVybmFsLnVpLndpemFyZHMuUHJvZmlsZVdpemFyZFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkudWkud2l6YXJkcy5JV2l6YXJkQ2F0ZWdvcnlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLkNvbm5lY3Rpb25Qcm9maWxlUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqICBDb25uZWN0aW9uUHJvZmlsZVVpVG9vbHMKLSAqLwotcHVibGljIGNsYXNzIERUUFVpVG9vbHMgewotCQotCS8qKgotCSAqIExhdW5jaCB0aGUgRFRQIE5ldyBDb25uZWN0aW9uIFByb2ZpbGUgd2l6YXJkIHRvIGNyZWF0ZSBhIG5ldyBkYXRhYmFzZSBjb25uZWN0aW9uIHByb2ZpbGUuCi0JICogCi0JICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgYWRkZWQgcHJvZmlsZSwgb3IgbnVsbCBpZiB0aGUgd2l6YXJkIGlzIGNhbmNlbGxlZC4gQ29ubmVjdGlvblByb2ZpbGVSZXBvc2l0b3J5IAotCSAqIGNhbiBiZSB1c2VkIHRvIHJldHJpZXZlIHRoZSBhZGRlZCBjb25uZWN0aW9uIHByb2ZpbGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlTmV3UHJvZmlsZSgpIHsKLQkJTmV3Q1BXaXphcmQgd2l6YXJkOwotCQlXaXphcmREaWFsb2cgd2l6YXJkRGlhbG9nOwotCi0JCS8vIEZpbHRlciBkYXRhc291cmNlIGNhdGVnb3J5Ci0JICAJVmlld2VyRmlsdGVyIHZpZXdlckZpbHRlciA9IG5ldyBWaWV3ZXJGaWx0ZXIoKSB7Ci0KLQkJCXB1YmxpYyBib29sZWFuIHNlbGVjdCggVmlld2VyIHZpZXdlciwgT2JqZWN0IHBhcmVudEVsZW1lbnQsIE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJCi0JCQkJQ1BXaXphcmROb2RlIHdpemFyZE5vZGUgPSAoIENQV2l6YXJkTm9kZSkgZWxlbWVudDsKLQkJCQlpZiggISggd2l6YXJkTm9kZS5nZXRQcm92aWRlcigpIGluc3RhbmNlb2YgSVdpemFyZENhdGVnb3J5UHJvdmlkZXIpKSB7Ci0JCQkJCUlDYXRlZ29yeSBjYXQgPSBDb25uZWN0aW9uUHJvZmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRQcm92aWRlcigKLQkJCQkJCQkJCSgoIFByb2ZpbGVXaXphcmRQcm92aWRlcikgd2l6YXJkTm9kZS5nZXRQcm92aWRlcigpKS5nZXRQcm9maWxlKCkpLmdldENhdGVnb3J5KCk7Ci0JCQkJCQotCQkJCQkvLyBPbmx5IGRpc3BsYXkgd2l6YXJkcyBiZWxvbmcgdG8gZGF0YWJhc2UgY2F0ZWdvcnkKLQkJCQkJd2hpbGUoIGNhdCAhPSBudWxsKSB7Ci0JCQkJCQlpZiggY2F0LmdldElkKCkuZXF1YWxzKCBDb25uZWN0aW9uUHJvZmlsZVJlcG9zaXRvcnkuREFUQUJBU0VfQ0FURUdPUllfSUQpKQotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJZWxzZQotCQkJCQkJCWNhdCA9IGNhdC5nZXRQYXJlbnQoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0JCXdpemFyZCA9IG5ldyBOZXdDUFdpemFyZCggdmlld2VyRmlsdGVyLCBudWxsKTsKLQkJU2hlbGwgY3VycmVudFNoZWxsID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKTsKLQkJd2l6YXJkRGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyggY3VycmVudFNoZWxsLCB3aXphcmQpOwotCQl3aXphcmREaWFsb2cuc2V0QmxvY2tPbk9wZW4oIHRydWUpOwotCQkKLQkJTG9jYWxQcm9maWxlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTG9jYWxQcm9maWxlTGlzdGVuZXIoKTsKLQkJUHJvZmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5hZGRQcm9maWxlTGlzdGVuZXIoIGxpc3RlbmVyKTsKLQkJCi0JCWlmKCB3aXphcmREaWFsb2cub3BlbigpID09IFdpbmRvdy5DQU5DRUwpIHsKLQkJCVByb2ZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVtb3ZlUHJvZmlsZUxpc3RlbmVyKCBsaXN0ZW5lcik7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJQ29ubmVjdGlvblByb2ZpbGUgYWRkZWRQcm9maWxlID0gbGlzdGVuZXIuYWRkZWRQcm9maWxlOwotCQlQcm9maWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlbW92ZVByb2ZpbGVMaXN0ZW5lciggbGlzdGVuZXIpOwotCQkKLQkJcmV0dXJuIGFkZGVkUHJvZmlsZS5nZXROYW1lKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTG9jYWxQcm9maWxlTGlzdGVuZXIgaW1wbGVtZW50cyBJUHJvZmlsZUxpc3RlbmVyIHsKLQkJSUNvbm5lY3Rpb25Qcm9maWxlIGFkZGVkUHJvZmlsZTsKLQkJCi0JCXB1YmxpYyB2b2lkIHByb2ZpbGVBZGRlZCggSUNvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpIHsKLQkJCWFkZGVkUHJvZmlsZSA9IHByb2ZpbGU7Ci0JCX0KLQkKLQkJcHVibGljIHZvaWQgcHJvZmlsZUNoYW5nZWQoIElDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQkKLQkJcHVibGljIHZvaWQgcHJvZmlsZURlbGV0ZWQoIElDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQl9Ci0JCSAgCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvLmNsYXNzcGF0aCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDRlODYxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi8uY3ZzaWdub3JlIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNGM2YTguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLWJpbgotYnVpbGQueG1sCi1qYXZhQ29tcGlsZXIuLi5hcmdzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLy5wcm9qZWN0IGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Njc1YTQ4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5kYjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk3ZWEwMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jU3VuIE1heSAyNyAxNToxMDoyOSBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI5ZDU0NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jU3VuIE1heSAyNyAxNDo1OToxOCBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4ZGE0NzUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC5kYgotQnVuZGxlLVZlcnNpb246IDEuMC4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLkpwdERiUGx1Z2luCi1CdW5kbGUtQ2xhc3NQYXRoOiAuCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmRhdGF0b29scy5zcWx0b29scy5lZGl0b3IuY29yZSwKLSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvYWJvdXQuaHRtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTczYmRhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvYnVpbGQucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzRlYWRhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotamF2YWNTb3VyY2U9MS41Ci1qYXZhY1RhcmdldD0xLjUKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1qYXJzLmNvbXBpbGUub3JkZXIgPSAuCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvY29tcG9uZW50LnhtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDRjMzk2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48Y29tcG9uZW50ICB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIiBuYW1lPSJvcmcuZWNsaXBzZS5qcHQuZGIiPjxkZXNjcmlwdGlvbiB1cmw9IiI+PC9kZXNjcmlwdGlvbj48Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj48L2NvbXBvbmVudC1kZXBlbmRzPjxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5kYiIgZnJhZ21lbnQ9ImZhbHNlIi8+PC9jb21wb25lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3BsdWdpbi5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODdhMmQzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgVG8gY29kZSBkZXZlbG9wZXI6Ci0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlCi0jICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UKLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotcGx1Z2luTmFtZSA9IEphdmEgUGVyc2lzdGVuY2UgQVBJIFRvb2xzIC0gREIKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCi0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0NhdGFsb2cuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0NhdGFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM0MjM4ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC9DYXRhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnRleHQuQ29sbGF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuc3FtLmNvcmUucnRlLklDYXRhbG9nT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuc3FtLmNvcmUucnRlLklDYXRhbG9nT2JqZWN0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi0vKioKLSAqICBXcmFwIGEgRFRQIENhdGFsb2dzCi0gKi8KLWZpbmFsIGNsYXNzIENhdGFsb2cgZXh0ZW5kcyBEVFBXcmFwcGVyIGltcGxlbWVudHMgQ29tcGFyYWJsZTxDYXRhbG9nPiB7Ci0JcHJpdmF0ZSBmaW5hbCBEYXRhYmFzZSBkYXRhYmFzZTsKLQlmaW5hbCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuQ2F0YWxvZyBkdHBDYXRhbG9nOwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQotCXByaXZhdGUgSUNhdGFsb2dPYmplY3RMaXN0ZW5lciBjYXRhbG9nTGlzdGVuZXI7CQkvL1RPRE8gbGlzdGVuIGZvciBjaGFuZ2UKLQkKLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQlDYXRhbG9nKCBEYXRhYmFzZSBkYXRhYmFzZSwgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkNhdGFsb2cgZHRwQ2F0YWxvZykgewotCQlzdXBlcigpOwotCQl0aGlzLmRhdGFiYXNlID0gZGF0YWJhc2U7Ci0JCXRoaXMuZHRwQ2F0YWxvZyA9IGR0cENhdGFsb2c7Ci0JfQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29ubmVjdGlvbklzT25saW5lKCkgewotCQlyZXR1cm4gdGhpcy5kYXRhYmFzZS5jb25uZWN0aW9uSXNPbmxpbmUoKTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLQlwcml2YXRlIElDYXRhbG9nT2JqZWN0TGlzdGVuZXIgYnVpbGRDYXRhbG9nTGlzdGVuZXIoKSB7Ci0gICAgICAgcmV0dXJuIG5ldyBJQ2F0YWxvZ09iamVjdExpc3RlbmVyKCkgewotICAgIAkgICAgcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZCggZmluYWwgSUNhdGFsb2dPYmplY3QgY2F0YWxvZywgZmluYWwgaW50IGV2ZW50VHlwZSkgeyAgICAgCi0gICAgCQkJaWYoIGNhdGFsb2cgPT0gQ2F0YWxvZy50aGlzLmR0cENhdGFsb2cpIHsJCi0vLyAgICAJCQkJQ2F0YWxvZy50aGlzLnJlZnJlc2goKTsKLS8vICAgIAkJCQlDYXRhbG9nLnRoaXMuZGF0YWJhc2UuY2F0YWxvZ0NoYW5nZWQoIENhdGFsb2cudGhpcywgZXZlbnRUeXBlKTsKLSAgICAJCQl9Ci0gICAgCSAgICB9Ci0gICAgICAgIH07Ci0gICAgfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzcG9zZSgpIHsKLS8vCQl0aGlzLnJlbW92ZUNhdGFsb2dPYmplY3RMaXN0ZW5lcigoIElDYXRhbG9nT2JqZWN0KSB0aGlzLmR0cENhdGFsb2csIHRoaXMuY2F0YWxvZ0xpc3RlbmVyKTsKLQl9Ci0JCi0JYm9vbGVhbiB3cmFwcyggb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkNhdGFsb2cgY2F0YWxvZykgewotCQlyZXR1cm4gdGhpcy5kdHBDYXRhbG9nID09IGNhdGFsb2c7Ci0JfQotCQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmR0cENhdGFsb2cuZ2V0TmFtZSgpOwotCX0KLQkKLQlib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGF0YWJhc2UuaXNDYXNlU2Vuc2l0aXZlKCk7Ci0JfQotCi0JQ29sdW1uIGNvbHVtbiggb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLkNvbHVtbiBkdHBDb2x1bW4pIHsKLQkJcmV0dXJuIHRoaXMuZGF0YWJhc2UuY29sdW1uKGR0cENvbHVtbik7Ci0JfQotCi0JLy8gKioqKiogc2NoZW1hdGEKLQotCXN5bmNocm9uaXplZCBTZXQ8U2NoZW1hPiBidWlsZFNjaGVtYXRhKCkgewotCQlFTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuU2NoZW1hPiBkdHBTY2hlbWF0YSA9IHRoaXMuZHRwU2NoZW1hdGEoKTsKLQkJCi0JCVNldDxTY2hlbWE+IHJlc3VsdCA9IG5ldyBIYXNoU2V0PFNjaGVtYT4oIGR0cFNjaGVtYXRhLnNpemUoKSk7Ci0JCWZvciAob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNjaGVtYSBkdHBTY2hlbWEgOiBkdHBTY2hlbWF0YSkgewotCQkJcmVzdWx0LmFkZCggdGhpcy53cmFwKGR0cFNjaGVtYSkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBFTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuU2NoZW1hPiBkdHBTY2hlbWF0YSgpIHsKLQkJcmV0dXJuIHRoaXMuZHRwQ2F0YWxvZy5nZXRTY2hlbWFzKCk7Ci0JfQotCi0JcHJpdmF0ZSBTY2hlbWEgd3JhcCggb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNjaGVtYSBzY2hlbWEpIHsKLQotCQlyZXR1cm4gbmV3IFNjaGVtYSggdGhpcy5kYXRhYmFzZSwgc2NoZW1hKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIENvbXBhcmFibGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIGludCBjb21wYXJlVG8oIENhdGFsb2cgY2F0YWxvZykgewotCQlyZXR1cm4gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKS5jb21wYXJlKCB0aGlzLmdldE5hbWUoKSwgY2F0YWxvZy5nZXROYW1lKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC9Db2x1bW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ3YmEwMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC9Db2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudGV4dC5Db2xsYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuc3FtLmNvcmUucnRlLklDYXRhbG9nT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuc3FtLmNvcmUucnRlLklDYXRhbG9nT2JqZWN0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuZGF0YXR5cGVzLkRhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLmRhdGF0eXBlcy5QcmVkZWZpbmVkRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuSmF2YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuTmFtZVRvb2xzOwotCi0vKioKLSAqICBXcmFwIGEgRFRQIENvbHVtbgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29sdW1uIGV4dGVuZHMgRFRQV3JhcHBlciBpbXBsZW1lbnRzIENvbXBhcmFibGU8Q29sdW1uPiB7Ci0JcHJpdmF0ZSBmaW5hbCBUYWJsZSB0YWJsZTsKLQlwcml2YXRlIGZpbmFsIG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5Db2x1bW4gZHRwQ29sdW1uOwotCXByaXZhdGUgSUNhdGFsb2dPYmplY3RMaXN0ZW5lciBjb2x1bW5MaXN0ZW5lcjsKLQotCS8vIFRPRE8gT2JqZWN0IGlzIHRoZSBkZWZhdWx0PwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFUeXBlIERFRkFVTFRfSkFWQV9UWVBFID0gbmV3IEphdmFUeXBlKGphdmEubGFuZy5PYmplY3QuY2xhc3MpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YVR5cGUgQkxPQl9KQVZBX1RZUEUgPSBuZXcgSmF2YVR5cGUoamF2YS5zcWwuQmxvYi5jbGFzcyk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YVR5cGUgQllURV9BUlJBWV9KQVZBX1RZUEUgPSBuZXcgSmF2YVR5cGUoYnl0ZVtdLmNsYXNzKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFUeXBlIENMT0JfSkFWQV9UWVBFID0gbmV3IEphdmFUeXBlKGphdmEuc3FsLkNsb2IuY2xhc3MpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFUeXBlIFNUUklOR19KQVZBX1RZUEUgPSBuZXcgSmF2YVR5cGUoamF2YS5sYW5nLlN0cmluZy5jbGFzcyk7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCUNvbHVtbiggVGFibGUgdGFibGUsIG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5Db2x1bW4gZHRwQ29sdW1uKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMudGFibGUgPSB0YWJsZTsKLQkJdGhpcy5kdHBDb2x1bW4gPSBkdHBDb2x1bW47Ci0JCXRoaXMuaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCWlmKCB0aGlzLmNvbm5lY3Rpb25Jc09ubGluZSgpKSB7Ci0JCQl0aGlzLmNvbHVtbkxpc3RlbmVyID0gdGhpcy5idWlsZENvbHVtbkxpc3RlbmVyKCk7Ci0JCQl0aGlzLmFkZENhdGFsb2dPYmplY3RMaXN0ZW5lcigoIElDYXRhbG9nT2JqZWN0KSB0aGlzLmR0cENvbHVtbiwgdGhpcy5jb2x1bW5MaXN0ZW5lcik7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29ubmVjdGlvbklzT25saW5lKCkgewotCQlyZXR1cm4gdGhpcy50YWJsZS5jb25uZWN0aW9uSXNPbmxpbmUoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ2F0YWxvZ09iamVjdExpc3RlbmVyIGJ1aWxkQ29sdW1uTGlzdGVuZXIoKSB7Ci0gICAgICAgcmV0dXJuIG5ldyBJQ2F0YWxvZ09iamVjdExpc3RlbmVyKCkgewotICAgIAkgICAgcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZCggZmluYWwgSUNhdGFsb2dPYmplY3QgY29sdW1uLCBmaW5hbCBpbnQgZXZlbnRUeXBlKSB7IAotLy8JCQkJVE9ETwotLy8gICAgCQkJaWYoIGNvbHVtbiA9PSBDb2x1bW4udGhpcy5kdHBDb2x1bW4pIHsJICAgIAkgICAgCQotLy8gICAgCQkJCUNvbHVtbi50aGlzLnRhYmxlLmNvbHVtbkNoYW5nZWQoIENvbHVtbi50aGlzLCBldmVudFR5cGUpOwotLy8gICAgCQkJfQotICAgIAkgICAgfQotICAgICAgICB9OwotICAgIH0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNwb3NlKCkgewotCQkKLQkJdGhpcy5yZW1vdmVDYXRhbG9nT2JqZWN0TGlzdGVuZXIoKCBJQ2F0YWxvZ09iamVjdCkgdGhpcy5kdHBDb2x1bW4sIHRoaXMuY29sdW1uTGlzdGVuZXIpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5kdHBDb2x1bW4uZ2V0TmFtZSgpOwotCX0KLQotCWJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlKCkgewotCQlyZXR1cm4gdGhpcy50YWJsZS5pc0Nhc2VTZW5zaXRpdmUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGRhdGFUeXBlTmFtZSgpIHsKLQkJRGF0YVR5cGUgZGF0YVR5cGUgPSB0aGlzLmR0cENvbHVtbi5nZXREYXRhVHlwZSgpOwotCQlyZXR1cm4gKGRhdGFUeXBlID09IG51bGwpID8gbnVsbCA6IGRhdGFUeXBlLmdldE5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGphdmFGaWVsZE5hbWUoKSB7Ci0JCVN0cmluZyBqTmFtZSA9IHRoaXMuZ2V0TmFtZSgpOwotCQlpZiAoICEgdGhpcy5pc0Nhc2VTZW5zaXRpdmUoKSkgewotCQkJak5hbWUgPSBqTmFtZS50b0xvd2VyQ2FzZSgpOwotCQl9Ci0JCXJldHVybiBOYW1lVG9vbHMuY29udmVydFRvSmF2YUlkZW50aWZpZXIoak5hbWUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG1hdGNoZXNKYXZhRmllbGROYW1lKFN0cmluZyBqYXZhRmllbGROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmlzQ2FzZVNlbnNpdGl2ZSgpID8KLQkJCXRoaXMuZ2V0TmFtZSgpLmVxdWFscyhqYXZhRmllbGROYW1lKQotCQk6Ci0JCQl0aGlzLmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKGphdmFGaWVsZE5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIEphdmEgdHlwZSBkZWNsYXJhdGlvbiB0aGF0IGlzIHJlYXNvbmFibHkKLQkgKiBzaW1pbGFyIHRvIHRoZSBjb2x1bW4ncyBkYXRhIHR5cGUuCi0JICovCi0JcHVibGljIFN0cmluZyBqYXZhVHlwZURlY2xhcmF0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5qYXZhVHlwZSgpLmRlY2xhcmF0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgSmF2YSB0eXBlIHRoYXQgaXMgcmVhc29uYWJseQotCSAqIHNpbWlsYXIgdG8gdGhlIGNvbHVtbidzIGRhdGEgdHlwZS4KLQkgKi8KLQlwdWJsaWMgSmF2YVR5cGUgamF2YVR5cGUoKSB7Ci0JCURhdGFUeXBlIGRhdGFUeXBlID0gdGhpcy5kdHBDb2x1bW4uZ2V0RGF0YVR5cGUoKTsKLQkJcmV0dXJuIChkYXRhVHlwZSBpbnN0YW5jZW9mIFByZWRlZmluZWREYXRhVHlwZSkgPwotCQkJdGhpcy5qcGFTcGVjQ29tcGxpYW50SmF2YVR5cGUoRFRQVG9vbHMuamF2YVR5cGVGb3IoKChQcmVkZWZpbmVkRGF0YVR5cGUpIGRhdGFUeXBlKS5nZXRQcmltaXRpdmVUeXBlKCkpKQotCQk6Ci0JCQlERUZBVUxUX0pBVkFfVFlQRTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgSkRCQyBzcGVjIHNheXMgSkRCQyBkcml2ZXJzIHNob3VsZCBiZSBhYmxlIHRvIG1hcCBCTE9CcyBhbmQgQ0xPQnMKLQkgKiBkaXJlY3RseSwgYnV0IHRoZSBKUEEgc3BlYyBkb2VzIG5vdCBhbGxvdyB0aGVtLgotCSAqLwotCXByaXZhdGUgSmF2YVR5cGUganBhU3BlY0NvbXBsaWFudEphdmFUeXBlKEphdmFUeXBlIGphdmFUeXBlKSB7Ci0JCWlmIChqYXZhVHlwZS5lcXVhbHMoQkxPQl9KQVZBX1RZUEUpKSB7Ci0JCQlyZXR1cm4gQllURV9BUlJBWV9KQVZBX1RZUEU7Ci0JCX0KLQkJaWYgKGphdmFUeXBlLmVxdWFscyhDTE9CX0pBVkFfVFlQRSkpIHsKLQkJCXJldHVybiBTVFJJTkdfSkFWQV9UWVBFOwotCQl9Ci0JCXJldHVybiBqYXZhVHlwZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0xvYigpIHsKLQkJRGF0YVR5cGUgZGF0YVR5cGUgPSB0aGlzLmR0cENvbHVtbi5nZXREYXRhVHlwZSgpOwotCQlyZXR1cm4gKGRhdGFUeXBlIGluc3RhbmNlb2YgUHJlZGVmaW5lZERhdGFUeXBlKSA/Ci0JCQlEVFBUb29scy5kYXRhVHlwZUlzTG9iKCgoUHJlZGVmaW5lZERhdGFUeXBlKSBkYXRhVHlwZSkuZ2V0UHJpbWl0aXZlVHlwZSgpKQotCQk6Ci0JCQlmYWxzZTsKLQl9Ci0KLQlib29sZWFuIHdyYXBzKCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuQ29sdW1uIGNvbHVtbikgewotCQlyZXR1cm4gdGhpcy5kdHBDb2x1bW4gPT0gY29sdW1uOwotCX0KLQotCS8vICoqKioqKioqKiogQ29tcGFyYWJsZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0JCi0JcHVibGljIGludCBjb21wYXJlVG8oIENvbHVtbiBjb2x1bW4pIHsKLQkJcmV0dXJuIENvbGxhdG9yLmdldEluc3RhbmNlKCkuY29tcGFyZSggdGhpcy5nZXROYW1lKCksIGNvbHVtbi5nZXROYW1lKCkpOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvQ29ubmVjdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvQ29ubmVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTFlNzM2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0Nvbm5lY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsOwotCi1pbXBvcnQgamF2YS50ZXh0LkNvbGxhdG9yOwotCi0KLS8qKgotICogIENvbm5lY3Rpb24gd3JhcHBlciBiYXNlIGNsYXNzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29ubmVjdGlvbiBleHRlbmRzIERUUFdyYXBwZXIgaW1wbGVtZW50cyBDb21wYXJhYmxlPENvbm5lY3Rpb24+IHsKLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENyZWF0ZSBhIHdyYXBwZXIgZm9yIHRoZSBnaXZlbiBJTWFuYWdlZENvbm5lY3Rpb24uCi0JICovCi0Jc3RhdGljIENvbm5lY3Rpb24gY3JlYXRlQ29ubmVjdGlvbiggb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5JTWFuYWdlZENvbm5lY3Rpb24gZHRwQ29ubmVjdGlvbikgewotCQlyZXR1cm4gKCBkdHBDb25uZWN0aW9uID09IG51bGwpID8gTnVsbENvbm5lY3Rpb24uaW5zdGFuY2UoKSA6IG5ldyBEVFBDb25uZWN0aW9uV3JhcHBlciggZHRwQ29ubmVjdGlvbik7Ci0JfQotCi0JQ29ubmVjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGxpc3RlbmVycyAqKioqKioqKioqCi0KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBhZGRDb25uZWN0aW9uTGlzdGVuZXIoIENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCByZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIoIENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JYWJzdHJhY3Qgdm9pZCBkYXRhYmFzZUNoYW5nZWQoIERhdGFiYXNlIGRhdGFiYXNlLCBpbnQgZXZlbnRUeXBlKTsKLQotCWFic3RyYWN0IHZvaWQgc2NoZW1hQ2hhbmdlZCggU2NoZW1hIHNjaGVtYSwgRGF0YWJhc2UgZGF0YWJhc2UsIGludCBldmVudFR5cGUpOwotCQotCWFic3RyYWN0IHZvaWQgdGFibGVDaGFuZ2VkKCBUYWJsZSB0YWJsZSwgU2NoZW1hIHNjaGVtYSwgRGF0YWJhc2UgZGF0YWJhc2UsIGludCBldmVudFR5cGUpOwotCQotCi0JLy8gKioqKioqKioqKiBxdWVyaWVzICoqKioqKioqKioKLQkKLQlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0Nvbm5lY3RlZCgpOwotCQotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0RmFjdG9yeUlkKCk7Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb25uZWN0aW9uSXNPbmxpbmUoKSB7Ci0JCXJldHVybiB0aGlzLmlzQ29ubmVjdGVkKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBDb21wYXJhYmxlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBpbnQgY29tcGFyZVRvKENvbm5lY3Rpb24gY29ubmVjdGlvbikgewotCQlyZXR1cm4gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKS5jb21wYXJlKCB0aGlzLmdldE5hbWUoKSwgY29ubmVjdGlvbi5nZXROYW1lKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvQ29ubmVjdGlvbkxpc3RlbmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC9Db25uZWN0aW9uTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc3OGNiYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC9Db25uZWN0aW9uTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsOwotCi0KLS8qKgotICogQ29ubmVjdGlvbkxpc3RlbmVyIGludGVncmF0ZSB0aCBEVFAgSU1hbmFnZWRDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIuCi0gKiBUaGlzIGNsYXNzIHB1cnBvc2UgaXMgdG8gZGVjb3VwbGUgZnJvbSB0aGUgRFRQIGxpc3RlbmVycyBieSBhY2NlcHRpbmcgd3JhcHBlcnMgYXMgcGFyYW1ldGVyLgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuSU1hbmFnZWRDb25uZWN0aW9uTGlzdGVuZXIKLSAqLwotcHVibGljIGludGVyZmFjZSBDb25uZWN0aW9uTGlzdGVuZXIgewotICAgIAotICAgIHB1YmxpYyB2b2lkIG9wZW5lZCggQ29ubmVjdGlvbiBjb25uZWN0aW9uKTsKLSAgICBwdWJsaWMgdm9pZCBtb2RpZmllZCggQ29ubmVjdGlvbiBjb25uZWN0aW9uKTsKLSAgICBwdWJsaWMgYm9vbGVhbiBva1RvQ2xvc2UoIENvbm5lY3Rpb24gY29ubmVjdGlvbik7Ci0gICAgcHVibGljIHZvaWQgYWJvdXRUb0Nsb3NlKCBDb25uZWN0aW9uIGNvbm5lY3Rpb24pOwotICAgIHB1YmxpYyB2b2lkIGNsb3NlZCggQ29ubmVjdGlvbiBjb25uZWN0aW9uKTsKLQotICAgIHB1YmxpYyB2b2lkIGRhdGFiYXNlQ2hhbmdlZCggQ29ubmVjdGlvbiBjb25uZWN0aW9uLCBEYXRhYmFzZSBkYXRhYmFzZSk7Ci0gICAgcHVibGljIHZvaWQgc2NoZW1hQ2hhbmdlZCggQ29ubmVjdGlvbiBjb25uZWN0aW9uLCBTY2hlbWEgc2NoZW1hKTsKLSAgICBwdWJsaWMgdm9pZCB0YWJsZUNoYW5nZWQoIENvbm5lY3Rpb24gY29ubmVjdGlvbiwgVGFibGUgdGFibGUpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC9Db25uZWN0aW9uUHJvZmlsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvQ29ubmVjdGlvblByb2ZpbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBjMzhkMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC9Db25uZWN0aW9uUHJvZmlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsOwotCi1pbXBvcnQgamF2YS50ZXh0LkNvbGxhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5zcW0uY29yZS5ydGUuSUNhdGFsb2dPYmplY3RMaXN0ZW5lcjsKLQotLyoqCi0gKiAgQ29ubmVjdGlvblByb2ZpbGUgd3JhcHBlciBiYXNlIGNsYXNzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29ubmVjdGlvblByb2ZpbGUgZXh0ZW5kcyBEVFBXcmFwcGVyIGltcGxlbWVudHMgQ29tcGFyYWJsZTxDb25uZWN0aW9uUHJvZmlsZT4gewotCQotCXByaXZhdGUgQ29ubmVjdGlvbiBjb25uZWN0aW9uOyAvLyBMYXp5IGluaXRpYWxpemVkCi0JcHJpdmF0ZSBEYXRhYmFzZSBkYXRhYmFzZTsgLy8gTGF6eSBpbml0aWFsaXplZAotCXByaXZhdGUgU3RyaW5nIGNhdGFsb2dOYW1lOyAgLy8gQ2F0YWxvZyB1c2VkIGZvciB0aGlzIHByb2ZpbGUKLQkKLQlwcml2YXRlIENvbm5lY3Rpb25MaXN0ZW5lciBjb25uZWN0aW9uTGlzdGVuZXI7Ci0JCi0JcHJpdmF0ZSBDb25uZWN0aW9uUHJvZmlsZVJlcG9zaXRvcnkgcHJvZmlsZVJlcG9zaXRvcnk7Ci0JCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0Jc3RhdGljIENvbm5lY3Rpb25Qcm9maWxlIGNyZWF0ZVByb2ZpbGUoIENvbm5lY3Rpb25Qcm9maWxlUmVwb3NpdG9yeSBwcm9maWxlUmVwb3NpdG9yeSwgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5JQ29ubmVjdGlvblByb2ZpbGUgZHRwUHJvZmlsZSkgewotCQlyZXR1cm4gKCBkdHBQcm9maWxlID09IG51bGwpID8gTnVsbENvbm5lY3Rpb25Qcm9maWxlLmluc3RhbmNlKCkgOiBuZXcgRFRQQ29ubmVjdGlvblByb2ZpbGVXcmFwcGVyKCBwcm9maWxlUmVwb3NpdG9yeSwgZHRwUHJvZmlsZSk7Ci0JfQotCi0JQ29ubmVjdGlvblByb2ZpbGUoIENvbm5lY3Rpb25Qcm9maWxlUmVwb3NpdG9yeSBwcm9maWxlUmVwb3NpdG9yeSkgewotCQlzdXBlcigpOwotCQl0aGlzLnByb2ZpbGVSZXBvc2l0b3J5ID0gcHJvZmlsZVJlcG9zaXRvcnk7Ci0JCXRoaXMuY29ubmVjdGlvbkxpc3RlbmVyID0gYnVpbGRDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jYXRhbG9nTmFtZSA9ICIiOwotCX0KLQkKLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGNvbm5lY3QoKTsKLQkKLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBkaXNjb25uZWN0KCk7Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IENvbm5lY3Rpb24gYnVpbGRDb25uZWN0aW9uKCk7Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IERhdGFiYXNlIGJ1aWxkRGF0YWJhc2UoKTsKLQkKLQlhYnN0cmFjdCB2b2lkIGRhdGFiYXNlQ2hhbmdlZCggRGF0YWJhc2UgZGIsIGludCBldmVudFR5cGUpOwotCQotCWFic3RyYWN0IHZvaWQgY2F0YWxvZ0NoYW5nZWQoIENhdGFsb2cgY2F0YWxvZywgRGF0YWJhc2UgZGIsIGludCBldmVudFR5cGUpOwotCQotCWFic3RyYWN0IHZvaWQgc2NoZW1hQ2hhbmdlZCggU2NoZW1hIHNjaGVtYSwgRGF0YWJhc2UgZGIsIGludCBldmVudFR5cGUpOwotCQotCWFic3RyYWN0IHZvaWQgdGFibGVDaGFuZ2VkKCBUYWJsZSB0YWJsZSwgU2NoZW1hIHNjaGVtYSwgRGF0YWJhc2UgZGIsIGludCBldmVudFR5cGUpOwotCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaERhdGFiYXNlKCkgewotCQl0aGlzLmRpc3Bvc2VEYXRhYmFzZSgpOwotCQl0aGlzLmRhdGFiYXNlID0gbnVsbDsKLSAgICB9Ci0gICAgCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzcG9zZSgpIHsKLQkJdGhpcy5kaXNlbmdhZ2VDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJCi0JCXRoaXMuZGlzcG9zZUNvbm5lY3Rpb24oKTsKLQkJdGhpcy5kaXNwb3NlRGF0YWJhc2UoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGRpc3Bvc2VDb25uZWN0aW9uKCkgewotCQlpZiggdGhpcy5jb25uZWN0aW9uICE9IG51bGwpIHsKLQkJCXRoaXMuZ2V0Q29ubmVjdGlvbigpLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgZGlzcG9zZURhdGFiYXNlKCkgewotCQlpZiggdGhpcy5kYXRhYmFzZSAhPSBudWxsKSB7Ci0JCQl0aGlzLmdldERhdGFiYXNlKCkuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JLy8gKioqKioqKioqKiBxdWVyaWVzICoqKioqKioqKioKLQkKLQlwdWJsaWMgQ29ubmVjdGlvbiBnZXRDb25uZWN0aW9uKCkgewotCQkKLQkJaWYoIHRoaXMuY29ubmVjdGlvbiA9PSBudWxsKSB7Ci0JCQl0aGlzLmNvbm5lY3Rpb24gPSB0aGlzLmJ1aWxkQ29ubmVjdGlvbigpOwotCQkJdGhpcy5lbmdhZ2VDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQotCQl9Ci0JCXJldHVybiB0aGlzLmNvbm5lY3Rpb247Ci0JfQotCi0JcHVibGljIERhdGFiYXNlIGdldERhdGFiYXNlKCkgewotCQkKLQkJaWYoIHRoaXMuZGF0YWJhc2UgPT0gbnVsbCkgewotCQkJdGhpcy5kYXRhYmFzZSA9IHRoaXMuYnVpbGREYXRhYmFzZSgpOwotCQkJdGhpcy5zZXREZWZhdWx0Q2F0YWxvZ05hbWUoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5kYXRhYmFzZTsKLQl9Ci0JCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXREYXRhYmFzZU5hbWUoKTsKLQotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0RGF0YWJhc2VQcm9kdWN0KCk7Ci0JCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXREYXRhYmFzZVZlbmRvcigpOwotCQotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0RGF0YWJhc2VWZXJzaW9uKCk7Ci0JCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXREcml2ZXJDbGFzcygpOwotCQotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0VXJsKCk7Ci0JCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRVc2VyTmFtZSgpOwotCQotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0VXNlclBhc3N3b3JkKCk7Ci0JCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRJbnN0YW5jZUlkKCk7Ci0KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFByb3ZpZGVySWQoKTsKLQotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0RHJpdmVyRGVmaW5pdGlvbklkKCk7Ci0JCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXREcml2ZXJKYXJMaXN0KCk7Ci0JCi0JcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNDb25uZWN0ZWQoKTsKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGNvbm5lY3Rpb25Jc09ubGluZSgpIHsKLQkJcmV0dXJuIHRoaXMuaXNDb25uZWN0ZWQoKTsKLQl9Ci0JCi0JYWJzdHJhY3QgYm9vbGVhbiB3cmFwcyggb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5JQ29ubmVjdGlvblByb2ZpbGUgZHRwUHJvZmlsZSk7Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNOdWxsKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JQ29ubmVjdGlvblByb2ZpbGVSZXBvc2l0b3J5IGdldFByb2ZpbGVSZXBvc2l0b3J5KCkgewotCQlyZXR1cm4gdGhpcy5wcm9maWxlUmVwb3NpdG9yeTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRDYXRhbG9nTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuY2F0YWxvZ05hbWU7Ci0JfQotCQotCS8qKgotCSAqIFNldCB0aGUgZGVmYXVsdCBjYXRhbG9nIG5hbWUgZm9yIHRoaXMgcHJvZmlsZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0Q2F0YWxvZ05hbWUoKSB7Ci0JCXRoaXMuc2V0Q2F0YWxvZ05hbWUoIHRoaXMuZGF0YWJhc2UuZ2V0RGVmYXVsdENhdGFsb2dOYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIENhbiBvbmx5IHNldCB0aGUgY2F0YWxvZyB0byB1c2UgZm9yIHRoaXMgcHJvZmlsZSwgd2hlbiB0aGUgZGF0YWJhc2Ugc3VwcG9ydHMgY2F0YWxvZ3MuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2F0YWxvZ05hbWUoIFN0cmluZyBjYXRhbG9nTmFtZSkgewotCQlpZiggdGhpcy5jYXRhbG9nTmFtZSA9PSBjYXRhbG9nTmFtZSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmKCB0aGlzLmRhdGFiYXNlLnN1cHBvcnRzQ2F0YWxvZ3MoKSkgewotCQkJU3RyaW5nIG5hbWUgPSAoIGNhdGFsb2dOYW1lICE9IG51bGwpID8gY2F0YWxvZ05hbWUgOiB0aGlzLmRhdGFiYXNlLmdldERlZmF1bHRDYXRhbG9nTmFtZSgpOwotCQkJCi0JCQlDYXRhbG9nIGNhdGFsb2cgPSB0aGlzLmRhdGFiYXNlLmNhdGFsb2dOYW1lZCggbmFtZSk7Ci0JCQlpZiggY2F0YWxvZyA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQkJCX0KLQkJCXRoaXMuY2F0YWxvZ05hbWUgPSBuYW1lOwotCQkJdGhpcy5kYXRhYmFzZS5yZWZyZXNoKCk7Ci0JCQl0aGlzLmNhdGFsb2dDaGFuZ2VkKCBjYXRhbG9nLCB0aGlzLmRhdGFiYXNlLCBJQ2F0YWxvZ09iamVjdExpc3RlbmVyLkV2ZW50VHlwZUVudW1lcmF0aW9uLkVMRU1FTlRfUkVGUkVTSCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLmNhdGFsb2dOYW1lID0gIiI7Ci0JCQl0aGlzLmRhdGFiYXNlLnJlZnJlc2goKTsKLQkJfQotCX0KLQkKLQkvLyAqKioqKioqKioqIGxpc3RlbmVycyAqKioqKioqKioqCi0KLQlhYnN0cmFjdCBwdWJsaWMgdm9pZCBhZGRQcm9maWxlTGlzdGVuZXIoIFByb2ZpbGVMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQlhYnN0cmFjdCBwdWJsaWMgdm9pZCByZW1vdmVQcm9maWxlTGlzdGVuZXIoIFByb2ZpbGVMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQlhYnN0cmFjdCBwdWJsaWMgdm9pZCBhZGRDb25uZWN0aW9uTGlzdGVuZXIoIENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQlhYnN0cmFjdCBwdWJsaWMgdm9pZCByZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIoIENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLSAgICBwcml2YXRlIENvbm5lY3Rpb25MaXN0ZW5lciBidWlsZENvbm5lY3Rpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDb25uZWN0aW9uTGlzdGVuZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIGFib3V0VG9DbG9zZShDb25uZWN0aW9uIGMpIHsKLQkJCQkvLyBub3QgaW50ZXJlc3RlZCB0byB0aGlzIGV2ZW50LgotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBjbG9zZWQoQ29ubmVjdGlvbiBjKSB7Ci0JCQkJQ29ubmVjdGlvblByb2ZpbGUudGhpcy5yZWZyZXNoRGF0YWJhc2UoKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbW9kaWZpZWQoQ29ubmVjdGlvbiBjKSB7Ci0JCQkJLy8gbm90IGludGVyZXN0ZWQgdG8gdGhpcyBldmVudC4KLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIG9rVG9DbG9zZShDb25uZWN0aW9uIGMpIHsKLQkJCQkvLyBub3QgaW50ZXJlc3RlZCB0byB0aGlzIGV2ZW50LgotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBvcGVuZWQoQ29ubmVjdGlvbiBjKSB7Ci0JCQkJQ29ubmVjdGlvblByb2ZpbGUudGhpcy5yZWZyZXNoRGF0YWJhc2UoKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgZGF0YWJhc2VDaGFuZ2VkKENvbm5lY3Rpb24gYywgZmluYWwgRGF0YWJhc2UgZGIpIHsKLQkJCQkvLyBub3QgaW50ZXJlc3RlZCB0byB0aGlzIGV2ZW50LgotCQkJCXJldHVybjsKLQkJCX0KLQkJCQotCQkJcHVibGljIHZvaWQgc2NoZW1hQ2hhbmdlZChDb25uZWN0aW9uIGMsIGZpbmFsIFNjaGVtYSBzY2hlbWEpIHsKLQkJCQkvLyBub3QgaW50ZXJlc3RlZCB0byB0aGlzIGV2ZW50LgotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgdGFibGVDaGFuZ2VkKENvbm5lY3Rpb24gYywgZmluYWwgVGFibGUgdGFibGUpIHsKLQkJCQkvLyBub3QgaW50ZXJlc3RlZCB0byB0aGlzIGV2ZW50LgotCQkJCXJldHVybjsKLQkJCX0KLQkJfTsKLSAgICB9Ci0gICAgCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlQ29ubmVjdGlvbkxpc3RlbmVyKCkgewotCQl0aGlzLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUNvbm5lY3Rpb25MaXN0ZW5lcigpIHsKLQkJdGhpcy5hZGRDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkQ29ubmVjdGlvbkxpc3RlbmVyKCkgewotCQl0aGlzLmFkZENvbm5lY3Rpb25MaXN0ZW5lciggdGhpcy5jb25uZWN0aW9uTGlzdGVuZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKCkgewotCQl0aGlzLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lciggdGhpcy5jb25uZWN0aW9uTGlzdGVuZXIpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIENvbXBhcmFibGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIGludCBjb21wYXJlVG8oIENvbm5lY3Rpb25Qcm9maWxlIGNvbm5lY3Rpb25Qcm9maWxlKSB7Ci0JCXJldHVybiBDb2xsYXRvci5nZXRJbnN0YW5jZSgpLmNvbXBhcmUoIHRoaXMuZ2V0TmFtZSgpLCBjb25uZWN0aW9uUHJvZmlsZS5nZXROYW1lKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvQ29ubmVjdGlvblByb2ZpbGVSZXBvc2l0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC9Db25uZWN0aW9uUHJvZmlsZVJlcG9zaXRvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVlN2VhNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC9Db25uZWN0aW9uUHJvZmlsZVJlcG9zaXRvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5JQ29ubmVjdGlvblByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5JUHJvZmlsZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuUHJvZmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7Ci0KLS8qKgotICogIENvbm5lY3Rpb25Qcm9maWxlUmVwb3NpdG9yeSBpcyBhIG1lZGlhdG9yIHRvIHRoZSBEVFAgUHJvZmlsZU1hbmFnZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25uZWN0aW9uUHJvZmlsZVJlcG9zaXRvcnkgewotCXByaXZhdGUgUHJvZmlsZU1hbmFnZXIgZHRwUHJvZmlsZU1hbmFnZXI7Ci0JCi0JcHJpdmF0ZSBMb2NhbFJlcG9zaXRvcnlMaXN0ZW5lciByZXBvc2l0b3J5TGlzdGVuZXI7Ci0JcHJpdmF0ZSBMb2NhbFByb2ZpbGVMaXN0ZW5lciBwcm9maWxlTGlzdGVuZXI7Ci0JcHJpdmF0ZSBTZXQ8Q29ubmVjdGlvblByb2ZpbGU+IHByb2ZpbGVzOwotCi0JcHJpdmF0ZSBzdGF0aWMgQ29ubmVjdGlvblByb2ZpbGVSZXBvc2l0b3J5IElOU1RBTkNFOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQUJBU0VfQ0FURUdPUllfSUQgPSAib3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5kYi5jYXRlZ29yeSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIHNpbmdsZXRvbiBzdXBwb3J0Ci0JICovCi0JcHVibGljIHN0YXRpYyBDb25uZWN0aW9uUHJvZmlsZVJlcG9zaXRvcnkgaW5zdGFuY2UoKSB7Ci0JCWlmIChJTlNUQU5DRSA9PSBudWxsKSB7Ci0JCQlJTlNUQU5DRSA9IG5ldyBDb25uZWN0aW9uUHJvZmlsZVJlcG9zaXRvcnkoKTsKLQkJfQotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCXByaXZhdGUgQ29ubmVjdGlvblByb2ZpbGVSZXBvc2l0b3J5KCkgewotCQlzdXBlcigpOwotCQl0aGlzLmR0cFByb2ZpbGVNYW5hZ2VyID0gUHJvZmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplTGlzdGVuZXJzKCkgewotCi0JCWlmKCB0aGlzLnJlcG9zaXRvcnlMaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQl0aGlzLnJlcG9zaXRvcnlMaXN0ZW5lciA9IG5ldyBMb2NhbFJlcG9zaXRvcnlMaXN0ZW5lcigpOwotCQkJdGhpcy5kdHBQcm9maWxlTWFuYWdlci5hZGRQcm9maWxlTGlzdGVuZXIoIHRoaXMucmVwb3NpdG9yeUxpc3RlbmVyKTsKLQkJfQotCQlpZiggdGhpcy5wcm9maWxlTGlzdGVuZXIgPT0gbnVsbCkgewotCQkJdGhpcy5wcm9maWxlTGlzdGVuZXIgPSBuZXcgTG9jYWxQcm9maWxlTGlzdGVuZXIoKTsKLQkJCXRoaXMuZHRwUHJvZmlsZU1hbmFnZXIuYWRkUHJvZmlsZUxpc3RlbmVyKCB0aGlzLnByb2ZpbGVMaXN0ZW5lcik7CQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZUxpc3RlbmVycygpIHsKLQkJZm9yKCBJdGVyYXRvcjxDb25uZWN0aW9uUHJvZmlsZT4gc3RyZWFtID0gdGhpcy5wcm9maWxlcygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCXN0cmVhbS5uZXh0KCkuZGlzcG9zZSgpOwotCQl9Ci0JCWlmKCB0aGlzLnJlcG9zaXRvcnlMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQl0aGlzLmR0cFByb2ZpbGVNYW5hZ2VyLnJlbW92ZVByb2ZpbGVMaXN0ZW5lciggdGhpcy5yZXBvc2l0b3J5TGlzdGVuZXIpOwotCQkJdGhpcy5yZXBvc2l0b3J5TGlzdGVuZXIgPSBudWxsOwotCQl9Ci0JCWlmKCB0aGlzLnByb2ZpbGVMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQl0aGlzLmR0cFByb2ZpbGVNYW5hZ2VyLnJlbW92ZVByb2ZpbGVMaXN0ZW5lciggdGhpcy5wcm9maWxlTGlzdGVuZXIpOwotCQkJdGhpcy5wcm9maWxlTGlzdGVuZXIgPSBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIENvbm5lY3Rpb24gZ2V0Q29ubmVjdGlvbldpdGhQcm9maWxlTmFtZWQoIFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiB0aGlzLnByb2ZpbGVOYW1lZCggbmFtZSkuZ2V0Q29ubmVjdGlvbigpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gdGhpcy5wcm9maWxlcy50b1N0cmluZygpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIHByb2ZpbGVzCi0KLQlwdWJsaWMgSXRlcmF0b3I8Q29ubmVjdGlvblByb2ZpbGU+IHByb2ZpbGVzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQcm9maWxlcygpLml0ZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gcHJvZmlsZU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8Q29ubmVjdGlvblByb2ZpbGUsIFN0cmluZz4oIHRoaXMucHJvZmlsZXMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybSggQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgewotCQkJCSByZXR1cm4gcHJvZmlsZS5nZXROYW1lKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGVOYW1lZCggU3RyaW5nIG5hbWUpIHsKLQkJZm9yKCBJdGVyYXRvcjxDb25uZWN0aW9uUHJvZmlsZT4gc3RyZWFtID0gdGhpcy5wcm9maWxlcygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCUNvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUgPSBzdHJlYW0ubmV4dCgpOwotCQkJaWYoIHByb2ZpbGUuZ2V0TmFtZSgpLmVxdWFscyggbmFtZSkpIHsKLQkJCQlyZXR1cm4gcHJvZmlsZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gTnVsbENvbm5lY3Rpb25Qcm9maWxlLmluc3RhbmNlKCk7Ci0JfQotCQotCXByaXZhdGUgU2V0PENvbm5lY3Rpb25Qcm9maWxlPiBnZXRQcm9maWxlcygpIHsKLQotCQlpZiggdGhpcy5wcm9maWxlcyA9PSBudWxsKSB7Ci0JCQl0aGlzLnByb2ZpbGVzID0gdGhpcy5idWlsZFByb2ZpbGVzKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMucHJvZmlsZXM7Ci0JfQotCi0JcHJpdmF0ZSBTZXQ8Q29ubmVjdGlvblByb2ZpbGU+IGJ1aWxkUHJvZmlsZXMoKSB7Ci0JCUlDb25uZWN0aW9uUHJvZmlsZVtdIGR0cFByb2ZpbGVzID0gdGhpcy5kdHBQcm9maWxlTWFuYWdlci5nZXRQcm9maWxlcygpOwotCQlTZXQ8Q29ubmVjdGlvblByb2ZpbGU+IHJlc3VsdCA9IG5ldyBIYXNoU2V0PENvbm5lY3Rpb25Qcm9maWxlPiggZHRwUHJvZmlsZXMubGVuZ3RoKTsKLQkJZm9yIChJQ29ubmVjdGlvblByb2ZpbGUgZHRwUHJvZmlsZSA6IGR0cFByb2ZpbGVzKSB7Ci0JCQlyZXN1bHQuYWRkKCBDb25uZWN0aW9uUHJvZmlsZS5jcmVhdGVQcm9maWxlKCB0aGlzLCBkdHBQcm9maWxlKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQl2b2lkIGFkZFByb2ZpbGUoIElDb25uZWN0aW9uUHJvZmlsZSBkdHBQcm9maWxlKSB7Ci0JCQotCQlpZiggIXRoaXMucHJvZmlsZUV4aXN0cyggZHRwUHJvZmlsZSkpIHsKLQkJCUNvbm5lY3Rpb25Qcm9maWxlIG5ld1Byb2ZpbGUgPSBDb25uZWN0aW9uUHJvZmlsZS5jcmVhdGVQcm9maWxlKCBDb25uZWN0aW9uUHJvZmlsZVJlcG9zaXRvcnkudGhpcywgZHRwUHJvZmlsZSk7Ci0JCQl0aGlzLnByb2ZpbGVzLmFkZCggbmV3UHJvZmlsZSk7Ci0JCX0KLQl9Ci0JCi0Jdm9pZCByZW1vdmVQcm9maWxlKCBJQ29ubmVjdGlvblByb2ZpbGUgZHRwUHJvZmlsZSkgewotCQkKLQkJdGhpcy5wcm9maWxlcy5yZW1vdmUoIHRoaXMuZ2V0UHJvZmlsZSggZHRwUHJvZmlsZSkpOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gcHJvZmlsZUV4aXN0cyggSUNvbm5lY3Rpb25Qcm9maWxlIGR0cFByb2ZpbGUpIHsKLQotCQlyZXR1cm4gKCB0aGlzLmdldFByb2ZpbGUoIGR0cFByb2ZpbGUpID09IG51bGwpID8gZmFsc2UgOiB0cnVlOwotCX0KLQotCUNvbm5lY3Rpb25Qcm9maWxlIGdldFByb2ZpbGUoIElDb25uZWN0aW9uUHJvZmlsZSBkdHBQcm9maWxlKSB7Ci0JCQotCQlmb3IoIEl0ZXJhdG9yPENvbm5lY3Rpb25Qcm9maWxlPiBzdHJlYW0gPSB0aGlzLnByb2ZpbGVzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlpZiggcHJvZmlsZS53cmFwcyggZHRwUHJvZmlsZSkpIHsKLQkJCQlyZXR1cm4gcHJvZmlsZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGxpc3RlbmVycyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBhZGRQcm9maWxlTGlzdGVuZXIoIFByb2ZpbGVMaXN0ZW5lciBsaXN0ZW5lcikgewotCi0JCXRoaXMucHJvZmlsZUxpc3RlbmVyLmFkZFByb2ZpbGVMaXN0ZW5lciggbGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVByb2ZpbGVMaXN0ZW5lciggUHJvZmlsZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQotCQl0aGlzLnByb2ZpbGVMaXN0ZW5lci5yZW1vdmVQcm9maWxlTGlzdGVuZXIoIGxpc3RlbmVyKTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLQlwcml2YXRlIHZvaWQgYWRkSW50ZXJuYWxQcm9maWxlTGlzdGVuZXIoIElQcm9maWxlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQotCQl0aGlzLmR0cFByb2ZpbGVNYW5hZ2VyLmFkZFByb2ZpbGVMaXN0ZW5lciggbGlzdGVuZXIpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQotCXByaXZhdGUgdm9pZCByZW1vdmVJbnRlcm5hbFByb2ZpbGVMaXN0ZW5lciggSVByb2ZpbGVMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkKLQkJdGhpcy5kdHBQcm9maWxlTWFuYWdlci5yZW1vdmVQcm9maWxlTGlzdGVuZXIoIGxpc3RlbmVyKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIG1lbWJlciBjbGFzcyAqKioqKioqKioqCi0JLyoqCi0JICogTGlzdGVucyB0byBQcm9maWxlTWFuYWdlciBldmVudHMgYW5kIHVwZGF0ZXMgdGhlIHJlcG9zaXRvcnkuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBMb2NhbFJlcG9zaXRvcnlMaXN0ZW5lciBpbXBsZW1lbnRzIElQcm9maWxlTGlzdGVuZXIgewotCi0JCUxvY2FsUmVwb3NpdG9yeUxpc3RlbmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHByb2ZpbGVBZGRlZCggSUNvbm5lY3Rpb25Qcm9maWxlIGNvbm5lY3Rpb25Qcm9maWxlKSB7Ci0JCQlDb25uZWN0aW9uUHJvZmlsZVJlcG9zaXRvcnkudGhpcy5hZGRQcm9maWxlKCBjb25uZWN0aW9uUHJvZmlsZSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwcm9maWxlQ2hhbmdlZCggSUNvbm5lY3Rpb25Qcm9maWxlIGNvbm5lY3Rpb25Qcm9maWxlKSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBwcm9maWxlRGVsZXRlZCggSUNvbm5lY3Rpb25Qcm9maWxlIGNvbm5lY3Rpb25Qcm9maWxlKSB7Ci0JCQlDb25uZWN0aW9uUHJvZmlsZVJlcG9zaXRvcnkudGhpcy5yZW1vdmVQcm9maWxlKCBjb25uZWN0aW9uUHJvZmlsZSk7Ci0JCX0KLQl9Ci0JCi0KLQkvKioKLQkgKiBUaGlzIGxpc3RlbmVyIHRyYW5zbGF0ZXMgYW5kIGZvcndhcmRzIElQcm9maWxlTGlzdGVuZXIgZXZlbnRzIHRvIFByb2ZpbGVMaXN0ZW5lci4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIExvY2FsUHJvZmlsZUxpc3RlbmVyIGltcGxlbWVudHMgSVByb2ZpbGVMaXN0ZW5lciB7Ci0JCXByaXZhdGUgQ29sbGVjdGlvbjxQcm9maWxlTGlzdGVuZXI+IGxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8UHJvZmlsZUxpc3RlbmVyPigpOwotCi0JCUxvY2FsUHJvZmlsZUxpc3RlbmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXZvaWQgYWRkUHJvZmlsZUxpc3RlbmVyKCBQcm9maWxlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCXRoaXMubGlzdGVuZXJzLmFkZCggbGlzdGVuZXIpOwotCQl9Ci0KLQkJdm9pZCByZW1vdmVQcm9maWxlTGlzdGVuZXIoIFByb2ZpbGVMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJdGhpcy5saXN0ZW5lcnMucmVtb3ZlKCBsaXN0ZW5lcik7Ci0JCX0KLQkJCi0JCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCQkKLQkJcHVibGljIHZvaWQgcHJvZmlsZUFkZGVkKCBJQ29ubmVjdGlvblByb2ZpbGUgZHRwUHJvZmlsZSkgewotCQkJQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSA9IGdldFByb2ZpbGUoIGR0cFByb2ZpbGUpOwotCQkJZm9yIChQcm9maWxlTGlzdGVuZXIgbGlzdGVuZXIgOiB0aGlzLmxpc3RlbmVycykgewotCQkJCWxpc3RlbmVyLnByb2ZpbGVBZGRlZCggcHJvZmlsZSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwcm9maWxlQ2hhbmdlZCggSUNvbm5lY3Rpb25Qcm9maWxlIGR0cFByb2ZpbGUpIHsKLQkJCUNvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUgPSBnZXRQcm9maWxlKCBkdHBQcm9maWxlKTsKLQkJCWZvciAoUHJvZmlsZUxpc3RlbmVyIGxpc3RlbmVyIDogdGhpcy5saXN0ZW5lcnMpIHsKLQkJCQlsaXN0ZW5lci5wcm9maWxlQ2hhbmdlZCggcHJvZmlsZSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwcm9maWxlRGVsZXRlZCggSUNvbm5lY3Rpb25Qcm9maWxlIGR0cFByb2ZpbGUpIHsKLQkJCVN0cmluZyBwcm9maWxlTmFtZSA9IGR0cFByb2ZpbGUuZ2V0TmFtZSgpOwotCQkJZm9yIChQcm9maWxlTGlzdGVuZXIgbGlzdGVuZXIgOiB0aGlzLmxpc3RlbmVycykgewotCQkJCWxpc3RlbmVyLnByb2ZpbGVEZWxldGVkKCBwcm9maWxlTmFtZSk7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvRFRQQ29ubmVjdGlvblByb2ZpbGVXcmFwcGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC9EVFBDb25uZWN0aW9uUHJvZmlsZVdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ2MmI0OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC9EVFBDb25uZWN0aW9uUHJvZmlsZVdyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuSU1hbmFnZWRDb25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuZGIuZ2VuZXJpYy5JREJEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuZHJpdmVycy5Ecml2ZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5zcWx0b29scy5jb3JlLkRhdGFiYXNlSWRlbnRpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuc3FsdG9vbHMuY29yZS5wcm9maWxlLlByb2ZpbGVVdGlsOwotCi0vKioKLSAqICBXcmFwIGEgRFRQIENvbm5lY3Rpb25Qcm9maWxlCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBEVFBDb25uZWN0aW9uUHJvZmlsZVdyYXBwZXIgZXh0ZW5kcyBDb25uZWN0aW9uUHJvZmlsZSB7Ci0JCi0JZmluYWwgcHJpdmF0ZSBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LklDb25uZWN0aW9uUHJvZmlsZSBkdHBDb25uZWN0aW9uUHJvZmlsZTsKLQkKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05ORUNUSU9OX1RZUEUgPSAiamF2YS5zcWwuQ29ubmVjdGlvbiI7ICAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OTkVDVElPTl9QUk9GSUxFX1RZUEUgPSAib3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5kYi5nZW5lcmljLmNvbm5lY3Rpb25Qcm9maWxlIjsgIC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBQkFTRV9QUk9EVUNUX1BST1BFUlRZID0gIm9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuc2VydmVyLnZlcnNpb24iOyAgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIFRoaXMgcHJvcGVydHkgaXMgdXNlZCBpbiBDb25uZWN0aW9uUHJvZmlsZSBjcmVhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBQkFTRV9TQVZFX1BXRF9QUk9QX0lEID0gSURCRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50cy5QUk9QX1BSRUZJWCArICJzYXZlUFdEIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIFRoaXMgcHJvcGVydHkgaXMgdXNlZCBpbiBDb25uZWN0aW9uUHJvZmlsZSBjcmVhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEUklWRVJfREVGSU5JVElPTl9QUk9QX0lEID0gIm9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuZHJpdmVyRGVmaW5pdGlvbklEIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIFRoaXMgcHJvcGVydHkgaXMgdXNlZCBpbiBEcml2ZXJEZWZpbml0aW9uIGNyZWF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERSSVZFUl9ERUZJTklUSU9OX1RZUEVfUFJPUF9JRCA9ICJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmRyaXZlcnMuZGVmblR5cGUiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogVGhpcyBwcm9wZXJ0eSBpcyB1c2VkIGluIERyaXZlckRlZmluaXRpb24gY3JlYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFJJVkVSX0pBUl9MSVNUX1BST1BfSUQgPSAiamFyTGlzdCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCURUUENvbm5lY3Rpb25Qcm9maWxlV3JhcHBlciggQ29ubmVjdGlvblByb2ZpbGVSZXBvc2l0b3J5IHByb2ZpbGVSZXBvc2l0b3J5LCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LklDb25uZWN0aW9uUHJvZmlsZSBkdHBDb25uZWN0aW9uUHJvZmlsZSkgewotCQlzdXBlciggcHJvZmlsZVJlcG9zaXRvcnkpOwotCQl0aGlzLmR0cENvbm5lY3Rpb25Qcm9maWxlID0gZHRwQ29ubmVjdGlvblByb2ZpbGU7Ci0JfQotCQotCS8vICoqKioqKioqKiogbGlzdGVuZXJzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZFByb2ZpbGVMaXN0ZW5lciggUHJvZmlsZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQotCQl0aGlzLmdldFByb2ZpbGVSZXBvc2l0b3J5KCkuYWRkUHJvZmlsZUxpc3RlbmVyKCBsaXN0ZW5lcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcmVtb3ZlUHJvZmlsZUxpc3RlbmVyKCBQcm9maWxlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCi0JCXRoaXMuZ2V0UHJvZmlsZVJlcG9zaXRvcnkoKS5yZW1vdmVQcm9maWxlTGlzdGVuZXIoIGxpc3RlbmVyKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkQ29ubmVjdGlvbkxpc3RlbmVyKCBDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCi0JCXRoaXMuZ2V0Q29ubmVjdGlvbigpLmFkZENvbm5lY3Rpb25MaXN0ZW5lciggbGlzdGVuZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lciggQ29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0KLQkJdGhpcy5nZXRDb25uZWN0aW9uKCkucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKCBsaXN0ZW5lcik7Ci0JfQotCQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCQotCXByaXZhdGUgSU1hbmFnZWRDb25uZWN0aW9uIGJ1aWxkRHRwTWFuYWdlZENvbm5lY3Rpb24oIG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuSUNvbm5lY3Rpb25Qcm9maWxlIGR0cFByb2ZpbGUpIHsKLQkJcmV0dXJuIGR0cFByb2ZpbGUuZ2V0TWFuYWdlZENvbm5lY3Rpb24oIENPTk5FQ1RJT05fVFlQRSk7Ci0JfQotCS8qKgotCSAqIENvbm5lY3QgdXNpbmcgdGhpcyBwcm9maWxlLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGNvbm5lY3QoKSB7Ci0JCWlmKCAhdGhpcy5kdHBDb25uZWN0aW9uUHJvZmlsZS5pc0Nvbm5lY3RlZCgpKSB7Ci0JCQkKLQkJCUlTdGF0dXMgc3RhdHVzID0gdGhpcy5kdHBDb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCQlpZiggIXN0YXR1cy5pc09LKCkpIHsKLQkJCQlpZiggc3RhdHVzLmlzTXVsdGlTdGF0dXMoKSkgewotCQkJCQlJU3RhdHVzW10gc3RhdHVzQ2hpbGRyZW4gPSBzdGF0dXMuZ2V0Q2hpbGRyZW4oKTsKLQkJCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIHN0YXR1c0NoaWxkcmVuWyAwXS5nZXRNZXNzYWdlKCksIHN0YXR1c0NoaWxkcmVuWyAwXS5nZXRFeGNlcHRpb24oKSk7Ci0JCQkJfQotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCBzdGF0dXMuZ2V0TWVzc2FnZSgpLCBzdGF0dXMuZ2V0RXhjZXB0aW9uKCkpOwotCQkJfQotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc2Nvbm5lY3QoKSB7Ci0JCQotCQlJU3RhdHVzIHN0YXR1cyA9IHRoaXMuZHRwQ29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCQlpZiggIXN0YXR1cy5pc09LKCkpIHsKLQkJCWlmKCBzdGF0dXMuaXNNdWx0aVN0YXR1cygpKSB7Ci0JCQkJSVN0YXR1c1tdIHN0YXR1c0NoaWxkcmVuID0gc3RhdHVzLmdldENoaWxkcmVuKCk7Ci0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIHN0YXR1c0NoaWxkcmVuWyAwXS5nZXRNZXNzYWdlKCksIHN0YXR1c0NoaWxkcmVuWyAwXS5nZXRFeGNlcHRpb24oKSk7Ci0JCQl9Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggc3RhdHVzLmdldE1lc3NhZ2UoKSwgc3RhdHVzLmdldEV4Y2VwdGlvbigpKTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQl2b2lkIGRhdGFiYXNlQ2hhbmdlZCggRGF0YWJhc2UgZGF0YWJhc2UsIGludCBldmVudFR5cGUpIHsKLQkJdGhpcy5nZXRDb25uZWN0aW9uKCkuZGF0YWJhc2VDaGFuZ2VkKCBkYXRhYmFzZSwgZXZlbnRUeXBlKTsKLQkJcmV0dXJuOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQkgdm9pZCBjYXRhbG9nQ2hhbmdlZCggQ2F0YWxvZyBjYXRhbG9nLCBEYXRhYmFzZSBkYXRhYmFzZSwgaW50IGV2ZW50VHlwZSkgewotCQkgLy9UT0RPCi0vLwkJdGhpcy5nZXRDb25uZWN0aW9uKCkuY2F0YWxvZ0NoYW5nZWQoIGNhdGFsb2csIGV2ZW50VHlwZSk7Ci0JCSByZXR1cm47Ci0JfQotCQotCUBPdmVycmlkZQotCXZvaWQgc2NoZW1hQ2hhbmdlZCggU2NoZW1hIHNjaGVtYSwgRGF0YWJhc2UgZGF0YWJhc2UsIGludCBldmVudFR5cGUpIHsKLQkJdGhpcy5nZXRDb25uZWN0aW9uKCkuc2NoZW1hQ2hhbmdlZCggc2NoZW1hLCBkYXRhYmFzZSwgZXZlbnRUeXBlKTsKLQl9Ci0JCQotCUBPdmVycmlkZQotCXZvaWQgdGFibGVDaGFuZ2VkKCBUYWJsZSB0YWJsZSwgU2NoZW1hIHNjaGVtYSwgRGF0YWJhc2UgZGF0YWJhc2UsIGludCBldmVudFR5cGUpIHsKLQkJdGhpcy5nZXRDb25uZWN0aW9uKCkudGFibGVDaGFuZ2VkKCB0YWJsZSwgc2NoZW1hLCBkYXRhYmFzZSwgZXZlbnRUeXBlKTsKLQl9Ci0JCQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc0Nvbm5lY3RlZCgpIHsKLQotCQlyZXR1cm4gdGhpcy5nZXRDb25uZWN0aW9uKCkuaXNDb25uZWN0ZWQoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNOdWxsKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQotCQlyZXR1cm4gdGhpcy5kdHBDb25uZWN0aW9uUHJvZmlsZS5nZXROYW1lKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YWJhc2VOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydHkoIElEQkRyaXZlckRlZmluaXRpb25Db25zdGFudHMuREFUQUJBU0VfTkFNRV9QUk9QX0lEKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXREYXRhYmFzZVByb2R1Y3QoKSB7Ci0JCXJldHVybiB0aGlzLmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0eSggREFUQUJBU0VfUFJPRFVDVF9QUk9QRVJUWSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YWJhc2VWZW5kb3IoKSB7Ci0JCXJldHVybiB0aGlzLmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0eSggSURCRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50cy5EQVRBQkFTRV9WRU5ET1JfUFJPUF9JRCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YWJhc2VWZXJzaW9uKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydHkoIElEQkRyaXZlckRlZmluaXRpb25Db25zdGFudHMuREFUQUJBU0VfVkVSU0lPTl9QUk9QX0lEKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFVzZXJOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydHkoIElEQkRyaXZlckRlZmluaXRpb25Db25zdGFudHMuVVNFUk5BTUVfUFJPUF9JRCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRVc2VyUGFzc3dvcmQoKSB7Ci0JCXJldHVybiB0aGlzLmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0eSggSURCRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50cy5QQVNTV09SRF9QUk9QX0lEKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldERyaXZlckNsYXNzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydHkoIElEQkRyaXZlckRlZmluaXRpb25Db25zdGFudHMuRFJJVkVSX0NMQVNTX1BST1BfSUQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VXJsKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydHkoIElEQkRyaXZlckRlZmluaXRpb25Db25zdGFudHMuVVJMX1BST1BfSUQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldEluc3RhbmNlSWQoKSB7Ci0JCXJldHVybiB0aGlzLmR0cENvbm5lY3Rpb25Qcm9maWxlLmdldEluc3RhbmNlSUQoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFByb3ZpZGVySWQoKSB7Ci0JCXJldHVybiB0aGlzLmR0cENvbm5lY3Rpb25Qcm9maWxlLmdldFByb3ZpZGVySWQoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldERyaXZlckRlZmluaXRpb25JZCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnR5KCBEVFBDb25uZWN0aW9uUHJvZmlsZVdyYXBwZXIuRFJJVkVSX0RFRklOSVRJT05fUFJPUF9JRCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXREcml2ZXJKYXJMaXN0KCkgewotCQlyZXR1cm4gRHJpdmVyTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldERyaXZlckluc3RhbmNlQnlJRCggdGhpcy5nZXREcml2ZXJEZWZpbml0aW9uSWQoKSkuZ2V0SmFyTGlzdCgpOwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnRpZXMgZ2V0UHJvcGVydGllcygpIHsKLQkJcmV0dXJuIHRoaXMuZHRwQ29ubmVjdGlvblByb2ZpbGUuZ2V0QmFzZVByb3BlcnRpZXMoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbm5lY3Rpb24gYnVpbGRDb25uZWN0aW9uKCkgewotCi0JCUNvbm5lY3Rpb24gY29ubmVjdGlvbiA9IENvbm5lY3Rpb24uY3JlYXRlQ29ubmVjdGlvbiggdGhpcy5idWlsZER0cE1hbmFnZWRDb25uZWN0aW9uKCB0aGlzLmR0cENvbm5lY3Rpb25Qcm9maWxlKSk7ICAvLyROT04tTkxTLTEkCi0JCXJldHVybiBjb25uZWN0aW9uOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBEYXRhYmFzZSBidWlsZERhdGFiYXNlKCkgewotCQkKLQkJb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkRhdGFiYXNlIGR0cERhdGFiYXNlOwotCQlpZiggdGhpcy5pc0Nvbm5lY3RlZCgpKSB7Ci0JCQlkdHBEYXRhYmFzZSA9IFByb2ZpbGVVdGlsLmdldERhdGFiYXNlKCBuZXcgRGF0YWJhc2VJZGVudGlmaWVyKCB0aGlzLmdldE5hbWUoKSwgdGhpcy5nZXREYXRhYmFzZU5hbWUoKSksIGZhbHNlKTsKLQkJCXJldHVybiBEYXRhYmFzZS5jcmVhdGVEYXRhYmFzZSggdGhpcywgZHRwRGF0YWJhc2UpOwotCQl9Ci0JCXJldHVybiBOdWxsRGF0YWJhc2UuaW5zdGFuY2UoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JYm9vbGVhbiB3cmFwcyggb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5JQ29ubmVjdGlvblByb2ZpbGUgZHRwUHJvZmlsZSkgewotCQlyZXR1cm4gdGhpcy5kdHBDb25uZWN0aW9uUHJvZmlsZSA9PSBkdHBQcm9maWxlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvRFRQQ29ubmVjdGlvbldyYXBwZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0RUUENvbm5lY3Rpb25XcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0NDBiMzUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvRFRQQ29ubmVjdGlvbldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LkNvbm5lY3RFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LklNYW5hZ2VkQ29ubmVjdGlvbkxpc3RlbmVyOwotCi0vKioKLSAqICBXcmFwIGEgRFRQIENvbm5lY3Rpb24KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIERUUENvbm5lY3Rpb25XcmFwcGVyIGV4dGVuZHMgQ29ubmVjdGlvbiB7Ci0JCi0JZmluYWwgcHJpdmF0ZSBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LklNYW5hZ2VkQ29ubmVjdGlvbiBkdHBDb25uZWN0aW9uOwotCXByaXZhdGUgTG9jYWxDb25uZWN0aW9uTGlzdGVuZXIgY29ubmVjdGlvbkxpc3RlbmVyOwotCQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCURUUENvbm5lY3Rpb25XcmFwcGVyKCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LklNYW5hZ2VkQ29ubmVjdGlvbiBkdHBDb25uZWN0aW9uKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZHRwQ29ubmVjdGlvbiA9IGR0cENvbm5lY3Rpb247Ci0JCXRoaXMuaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXRoaXMuY29ubmVjdGlvbkxpc3RlbmVyID0gbmV3IExvY2FsQ29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuZHRwQ29ubmVjdGlvbi5hZGRDb25uZWN0aW9uTGlzdGVuZXIoIHRoaXMuY29ubmVjdGlvbkxpc3RlbmVyKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzcG9zZSgpIHsKLQkJdGhpcy5kdHBDb25uZWN0aW9uLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lciggdGhpcy5jb25uZWN0aW9uTGlzdGVuZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQotCQlyZXR1cm4gdGhpcy5kdHBDb25uZWN0aW9uLmdldENvbm5lY3Rpb24oKS5nZXRDb25uZWN0aW9uUHJvZmlsZSgpLmdldE5hbWUoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNDb25uZWN0ZWQoKSB7Ci0KLQkJcmV0dXJuIHRoaXMuZHRwQ29ubmVjdGlvbi5pc0Nvbm5lY3RlZCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0RmFjdG9yeUlkKCkgewotCQkKLQkJcmV0dXJuIHRoaXMuZHRwQ29ubmVjdGlvbi5nZXRGYWN0b3J5SUQoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQl2b2lkIGRhdGFiYXNlQ2hhbmdlZCggRGF0YWJhc2UgZGF0YWJhc2UsIGludCBldmVudFR5cGUpIHsKLQkJCi0JCXRoaXMuY29ubmVjdGlvbkxpc3RlbmVyLmRhdGFiYXNlQ2hhbmdlZCggZGF0YWJhc2UsIGV2ZW50VHlwZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXZvaWQgc2NoZW1hQ2hhbmdlZCggU2NoZW1hIHNjaGVtYSwgRGF0YWJhc2UgZGF0YWJhc2UsIGludCBldmVudFR5cGUpIHsKLQkJCi0JCXRoaXMuY29ubmVjdGlvbkxpc3RlbmVyLnNjaGVtYUNoYW5nZWQoIHNjaGVtYSwgZGF0YWJhc2UsIGV2ZW50VHlwZSk7Ci0JfQotCQkKLQlAT3ZlcnJpZGUKLQl2b2lkIHRhYmxlQ2hhbmdlZCggVGFibGUgdGFibGUsIFNjaGVtYSBzY2hlbWEsIERhdGFiYXNlIGRhdGFiYXNlLCBpbnQgZXZlbnRUeXBlKSB7Ci0JCQotCQl0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lci50YWJsZUNoYW5nZWQoIHRhYmxlLCBzY2hlbWEsIGRhdGFiYXNlLCBldmVudFR5cGUpOwotCX0KLQkJCi0JLy8gKioqKioqKioqKiBsaXN0ZW5lcnMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkQ29ubmVjdGlvbkxpc3RlbmVyKCBDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJLy8gaG9vayB1cCB0aGUgc3BlY2lmaWVkIGxpc3RlbmVyIHRvIG91ciBpbnRlcm1lZGlhdGUgbGlzdGVuZXJzCi0JCXRoaXMuY29ubmVjdGlvbkxpc3RlbmVyLmFkZENvbm5lY3Rpb25MaXN0ZW5lciggbGlzdGVuZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lciggQ29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0KLQkJdGhpcy5jb25uZWN0aW9uTGlzdGVuZXIucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKCBsaXN0ZW5lcik7Ci0JfQotCQotCS8vICoqKioqKioqKiogbWVtYmVyIGNsYXNzZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhpcyBsaXN0ZW5lciB0cmFuc2xhdGVzIGFuZCBmb3J3YXJkcyBJTWFuYWdlZENvbm5lY3Rpb25MaXN0ZW5lciBldmVudHMgdG8gQ29ubmVjdGlvbkxpc3RlbmVycy4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIExvY2FsQ29ubmVjdGlvbkxpc3RlbmVyIGltcGxlbWVudHMgSU1hbmFnZWRDb25uZWN0aW9uTGlzdGVuZXIgewotCQlwcml2YXRlIENvbGxlY3Rpb248Q29ubmVjdGlvbkxpc3RlbmVyPiBsaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PENvbm5lY3Rpb25MaXN0ZW5lcj4oKTsKLQotCQlMb2NhbENvbm5lY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQl2b2lkIGFkZENvbm5lY3Rpb25MaXN0ZW5lciggQ29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQl0aGlzLmxpc3RlbmVycy5hZGQoIGxpc3RlbmVyKTsKLQkJfQotCi0JCXZvaWQgcmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKCBDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCXRoaXMubGlzdGVuZXJzLnJlbW92ZSggbGlzdGVuZXIpOwotCQl9Ci0KLQkJLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0JCQotCQlwdWJsaWMgdm9pZCBhYm91dFRvQ2xvc2UoIENvbm5lY3RFdmVudCBldmVudCkgewotCQkJZm9yIChDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgOiB0aGlzLmxpc3RlbmVycykgewotCQkJCWxpc3RlbmVyLmFib3V0VG9DbG9zZSggRFRQQ29ubmVjdGlvbldyYXBwZXIudGhpcyk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBjbG9zZWQoIENvbm5lY3RFdmVudCBldmVudCkgewotCQkJZm9yIChDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgOiB0aGlzLmxpc3RlbmVycykgewotCQkJCWxpc3RlbmVyLmNsb3NlZCggRFRQQ29ubmVjdGlvbldyYXBwZXIudGhpcyk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBtb2RpZmllZCggQ29ubmVjdEV2ZW50IGV2ZW50KSB7Ci0JCQlmb3IgKENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA6IHRoaXMubGlzdGVuZXJzKSB7Ci0JCQkJbGlzdGVuZXIubW9kaWZpZWQoIERUUENvbm5lY3Rpb25XcmFwcGVyLnRoaXMpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gb2tUb0Nsb3NlKCBDb25uZWN0RXZlbnQgZXZlbnQpIHsKLQkJCWZvciAoQ29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyIDogdGhpcy5saXN0ZW5lcnMpIHsKLQkJCQlpZiggIWxpc3RlbmVyLm9rVG9DbG9zZSggRFRQQ29ubmVjdGlvbldyYXBwZXIudGhpcykpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBvcGVuZWQoIENvbm5lY3RFdmVudCBldmVudCkgewotCQkJZm9yIChDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgOiB0aGlzLmxpc3RlbmVycykgewotCQkJCWxpc3RlbmVyLm9wZW5lZCggRFRQQ29ubmVjdGlvbldyYXBwZXIudGhpcyk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXZvaWQgZGF0YWJhc2VDaGFuZ2VkKCBEYXRhYmFzZSBkYXRhYmFzZSwgaW50IGV2ZW50VHlwZSkgewotCQkJZm9yIChDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgOiB0aGlzLmxpc3RlbmVycykgewotCQkJCWxpc3RlbmVyLmRhdGFiYXNlQ2hhbmdlZCggRFRQQ29ubmVjdGlvbldyYXBwZXIudGhpcywgZGF0YWJhc2UpOwotCQkJfQotCQl9Ci0JCQotCQl2b2lkIHNjaGVtYUNoYW5nZWQoIFNjaGVtYSBzY2hlbWEsIERhdGFiYXNlIGRhdGFiYXNlLCBpbnQgZXZlbnRUeXBlKSB7Ci0JCQlmb3IgKENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA6IHRoaXMubGlzdGVuZXJzKSB7Ci0JCQkJbGlzdGVuZXIuc2NoZW1hQ2hhbmdlZCggRFRQQ29ubmVjdGlvbldyYXBwZXIudGhpcywgc2NoZW1hKTsKLQkJCX0KLQkJfQotCQkKLQkJdm9pZCB0YWJsZUNoYW5nZWQoIFRhYmxlIHRhYmxlLCBTY2hlbWEgc2NoZW1hLCBEYXRhYmFzZSBkYXRhYmFzZSwgaW50IGV2ZW50VHlwZSkgewotCQkJZm9yIChDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgOiB0aGlzLmxpc3RlbmVycykgewotCQkJCWxpc3RlbmVyLnRhYmxlQ2hhbmdlZCggRFRQQ29ubmVjdGlvbldyYXBwZXIudGhpcywgdGFibGUpOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC9EVFBEYXRhYmFzZVdyYXBwZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0RUUERhdGFiYXNlV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGIxZGFkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0RUUERhdGFiYXNlV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5zcW0uY29yZS5ydGUuSUNhdGFsb2dPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5zcW0uY29yZS5ydGUuSUNhdGFsb2dPYmplY3RMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLS8qKgotICogIFdyYXAgYSBEVFAgRGF0YWJhc2UKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIERUUERhdGFiYXNlV3JhcHBlciBleHRlbmRzIERhdGFiYXNlIHsKLQkKLQlmaW5hbCBDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlOwotCWZpbmFsIG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5EYXRhYmFzZSBkdHBEYXRhYmFzZTsKLQlwcml2YXRlIElDYXRhbG9nT2JqZWN0TGlzdGVuZXIgZGF0YWJhc2VMaXN0ZW5lcjsKLQkKLQlwcml2YXRlIFNldDxDYXRhbG9nPiBjYXRhbG9nczsgIC8vIGxhenktaW5pdGlhbGl6ZWQKLQlwcml2YXRlIFNldDxTY2hlbWE+IHNjaGVtYXRhOyAgLy8gbGF6eS1pbml0aWFsaXplZAotCi0JRFRQRGF0YWJhc2VXcmFwcGVyKCBDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuRGF0YWJhc2UgZHRwRGF0YWJhc2UpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5kdHBEYXRhYmFzZSA9IGR0cERhdGFiYXNlOwotCQl0aGlzLnByb2ZpbGUgPSBwcm9maWxlOwotCQl0aGlzLmluaXRpYWxpemUoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgewotCQkKLQkJaWYoIHRoaXMuY29ubmVjdGlvbklzT25saW5lKCkpIHsKLQkJCXRoaXMuZGF0YWJhc2VMaXN0ZW5lciA9IHRoaXMuYnVpbGREYXRhYmFzZUxpc3RlbmVyKCk7Ci0JCQl0aGlzLmFkZENhdGFsb2dPYmplY3RMaXN0ZW5lcigoIElDYXRhbG9nT2JqZWN0KSB0aGlzLmR0cERhdGFiYXNlLCB0aGlzLmRhdGFiYXNlTGlzdGVuZXIpOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGNvbm5lY3Rpb25Jc09ubGluZSgpIHsKLQkJcmV0dXJuIHRoaXMucHJvZmlsZS5pc0Nvbm5lY3RlZCgpOwotCX0KLQkKLQlwcml2YXRlIElDYXRhbG9nT2JqZWN0TGlzdGVuZXIgYnVpbGREYXRhYmFzZUxpc3RlbmVyKCkgewotCSAgIHJldHVybiBuZXcgSUNhdGFsb2dPYmplY3RMaXN0ZW5lcigpIHsKLQkJICAgIHB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoIGZpbmFsIElDYXRhbG9nT2JqZWN0IGRhdGFiYXNlLCBmaW5hbCBpbnQgZXZlbnRUeXBlKSB7ICAgICAKLQkJCQlpZiggZGF0YWJhc2UgPT0gRFRQRGF0YWJhc2VXcmFwcGVyLnRoaXMuZHRwRGF0YWJhc2UpIHsJCi0JCQkJCURUUERhdGFiYXNlV3JhcHBlci50aGlzLnJlZnJlc2goKTsKLQkJCQkJRFRQRGF0YWJhc2VXcmFwcGVyLnRoaXMucHJvZmlsZS5kYXRhYmFzZUNoYW5nZWQoIERUUERhdGFiYXNlV3JhcHBlci50aGlzLCBldmVudFR5cGUpOwotCQkJCX0KLQkJICAgIH0KLQkgICAgfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQl2b2lkIHJlZnJlc2goKSB7Ci0JCXRoaXMuZGlzcG9zZVNjaGVtYXRhKCk7Ci0JCXRoaXMuZGlzcG9zZUNhdGFsb2dzKCk7Ci0JCQotCQl0aGlzLnNjaGVtYXRhID0gbnVsbDsKLQkJdGhpcy5jYXRhbG9ncyA9IG51bGw7Ci0JfQotCQotCUBPdmVycmlkZQotCXZvaWQgY2F0YWxvZ0NoYW5nZWQoIENhdGFsb2cgY2F0YWxvZywgaW50IGV2ZW50VHlwZSkgewotCQl0aGlzLnByb2ZpbGUuY2F0YWxvZ0NoYW5nZWQoIGNhdGFsb2csIHRoaXMsIGV2ZW50VHlwZSk7Ci0JCXJldHVybjsKLQl9CQotCQkKLQlAT3ZlcnJpZGUKLQl2b2lkIHNjaGVtYUNoYW5nZWQoIFNjaGVtYSBzY2hlbWEsIGludCBldmVudFR5cGUpIHsKLQkJdGhpcy5wcm9maWxlLnNjaGVtYUNoYW5nZWQoIHNjaGVtYSwgdGhpcywgZXZlbnRUeXBlKTsKLQkJcmV0dXJuOwotCX0KLQotCUBPdmVycmlkZQotCXZvaWQgdGFibGVDaGFuZ2VkKCBUYWJsZSB0YWJsZSwgIFNjaGVtYSBzY2hlbWEsIGludCBldmVudFR5cGUpIHsKLQkJdGhpcy5wcm9maWxlLnRhYmxlQ2hhbmdlZCggdGFibGUsIHNjaGVtYSwgdGhpcywgZXZlbnRUeXBlKTsKLQkJcmV0dXJuOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNwb3NlKCkgewotCQl0aGlzLnJlbW92ZUNhdGFsb2dPYmplY3RMaXN0ZW5lcigoIElDYXRhbG9nT2JqZWN0KSB0aGlzLmR0cERhdGFiYXNlLCB0aGlzLmRhdGFiYXNlTGlzdGVuZXIpOwotCi0JCXRoaXMuZGlzcG9zZVNjaGVtYXRhKCk7Ci0JCXRoaXMuZGlzcG9zZUNhdGFsb2dzKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRpc3Bvc2VTY2hlbWF0YSgpIHsKLQkJaWYoIHRoaXMuc2NoZW1hdGEgIT0gbnVsbCkgewotCQkJZm9yKCBJdGVyYXRvcjxTY2hlbWE+IHN0cmVhbSA9IHRoaXMuc2NoZW1hdGEoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQkJc3RyZWFtLm5leHQoKS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGRpc3Bvc2VDYXRhbG9ncygpIHsKLQkJaWYoIHRoaXMuY2F0YWxvZ3MgIT0gbnVsbCkgewotCQkJZm9yKCBJdGVyYXRvcjxDYXRhbG9nPiBzdHJlYW0gPSB0aGlzLmNhdGFsb2dzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJCXN0cmVhbS5uZXh0KCkuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0KLQkJcmV0dXJuIHRoaXMuZHRwRGF0YWJhc2UuZ2V0TmFtZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VmVuZG9yKCkgewotCQkKLQkJcmV0dXJuIHRoaXMuZHRwRGF0YWJhc2UuZ2V0VmVuZG9yKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKLQkJCi0JCXJldHVybiB0aGlzLmR0cERhdGFiYXNlLmdldFZlcnNpb24oKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogc2NoZW1hdGEKLQotCUBPdmVycmlkZQotCXN5bmNocm9uaXplZCBTZXQ8U2NoZW1hPiBnZXRTY2hlbWF0YSgpIHsKLQkJaWYoIHRoaXMuc2NoZW1hdGEgPT0gbnVsbCkgewotCQkJdGhpcy5zY2hlbWF0YSA9IHRoaXMuYnVpbGRTY2hlbWF0YSgpOwotCQl9Ci0JCXJldHVybiB0aGlzLnNjaGVtYXRhOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgRUxpc3Q8b3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNjaGVtYT4gZHRwU2NoZW1hdGEoKSB7Ci0JCXJldHVybiB0aGlzLmR0cERhdGFiYXNlLmdldFNjaGVtYXMoKTsKLQl9Ci0KLQlwcml2YXRlIFNldDxTY2hlbWE+IGJ1aWxkU2NoZW1hdGEoKSB7Ci0JCVNldDxTY2hlbWE+IHJlc3VsdDsKLQkJaWYoIHRoaXMuc3VwcG9ydHNDYXRhbG9ncygpKSB7Ci0JCQlyZXN1bHQgPSB0aGlzLmdldFNjaGVtYXRhRm9yQ2F0YWxvZ05hbWVkKCB0aGlzLnByb2ZpbGUuZ2V0Q2F0YWxvZ05hbWUoKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlFTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuU2NoZW1hPiBkdHBTY2hlbWF0YSA9IHRoaXMuZHRwU2NoZW1hdGEoKTsKLQkJCXJlc3VsdCA9IG5ldyBIYXNoU2V0PFNjaGVtYT4oIGR0cFNjaGVtYXRhLnNpemUoKSk7Ci0JCQlmb3IgKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWEgZHRwU2NoZW1hIDogZHRwU2NoZW1hdGEpIHsKLQkJCQlyZXN1bHQuYWRkKCB0aGlzLndyYXAoZHRwU2NoZW1hKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JLy8gKioqKiogY2F0YWxvZ3MKLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzQ2F0YWxvZ3MoKSB7Ci0JCUVMaXN0PG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWE+IGR0cFNjaGVtYXRhID0gdGhpcy5kdHBTY2hlbWF0YSgpOwotCQlyZXR1cm4gKCBkdHBTY2hlbWF0YSA9PSBudWxsIHx8IGR0cFNjaGVtYXRhLnNpemUoKSA9PSAwKTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIEVMaXN0PG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5DYXRhbG9nPiBkdHBDYXRhbG9ncygpIHsKLQkJcmV0dXJuIHRoaXMuZHRwRGF0YWJhc2UuZ2V0Q2F0YWxvZ3MoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDYXRhbG9nTmFtZSgpIHsKLQkJCi0JCWlmKCAhdGhpcy5zdXBwb3J0c0NhdGFsb2dzKCkpIHsJLy8gdGhpcyBkYXRhYmFzZSBkb2Vzbid0IHN1cHBvcnQgY2F0YWxvZ3MKLQkJCXJldHVybiAiIjsKLQkJfQotCQlTdHJpbmcgdXNlck5hbWUgPSB0aGlzLnByb2ZpbGUuZ2V0VXNlck5hbWUoKTsKLQkJZm9yIChvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuQ2F0YWxvZyBkdHBDYXRhbG9nIDogdGhpcy5kdHBDYXRhbG9ncygpKSB7Ci0JCQlpZiggZHRwQ2F0YWxvZy5nZXROYW1lKCkubGVuZ3RoKCkgPT0gMCkgewkvLyBzcGVjaWFsIGNhdGFsb2cgdGhhdCBjb250YWlucyBhbGwgc2NoZW1hdGEKLQkJCQlyZXR1cm4gIiI7Ci0JCQl9Ci0JCQllbHNlIGlmKCBkdHBDYXRhbG9nLmdldE5hbWUoKS5lcXVhbHMoIHVzZXJOYW1lKSkgewotCQkJCXJldHVybiB1c2VyTmFtZTsJCS8vIHJldHVybnMgdXNlciBuYW1lIGFzIGRlZmF1bHQgY2F0YWxvZwotCQkJfQotCQkJZWxzZSBpZiggZHRwQ2F0YWxvZy5nZXROYW1lKCkuZXF1YWxzKCB0aGlzLmdldE5hbWUoKSkpIHsKLQkJCQlyZXR1cm4gdGhpcy5nZXROYW1lKCk7CQkgLy8gc3BlY2lhbCBjYXRhbG9nIHdpdGggc2FtZSBuYW1lIGFzIERCIChQb3N0Z3JlU1FMKQotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXN5bmNocm9uaXplZCBTZXQ8Q2F0YWxvZz4gZ2V0Q2F0YWxvZ3MoKSB7Ci0JCWlmKCB0aGlzLmNhdGFsb2dzID09IG51bGwpIHsKLQkJCXRoaXMuY2F0YWxvZ3MgPSB0aGlzLmJ1aWxkQ2F0YWxvZ3MoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5jYXRhbG9nczsKLQl9Ci0KLQlwcml2YXRlIFNldDxDYXRhbG9nPiBidWlsZENhdGFsb2dzKCkgewotCQkKLQkJRUxpc3Q8b3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkNhdGFsb2c+IGR0cENhdGFsb2dzID0gdGhpcy5kdHBDYXRhbG9ncygpOwotCQlpZiggZHRwQ2F0YWxvZ3MgPT0gbnVsbCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5U2V0KCk7Ci0JCX0KLQkJU2V0PENhdGFsb2c+IHJlc3VsdCA9IG5ldyBIYXNoU2V0PENhdGFsb2c+KCBkdHBDYXRhbG9ncy5zaXplKCkpOwotCQlmb3IgKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5DYXRhbG9nIGR0cENhdGFsb2cgOiBkdHBDYXRhbG9ncykgewotCQkJcmVzdWx0LmFkZCggdGhpcy53cmFwKGR0cENhdGFsb2cpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwcml2YXRlIFNldDxTY2hlbWE+IGdldFNjaGVtYXRhRm9yQ2F0YWxvZ05hbWVkKCBTdHJpbmcgY2F0YWxvZ05hbWUpIHsKLQotCQlDYXRhbG9nIGNhdGFsb2cgPSB0aGlzLmNhdGFsb2dOYW1lZCggY2F0YWxvZ05hbWUpOwotCQlyZXR1cm4gKCBjYXRhbG9nICE9IG51bGwpID8gY2F0YWxvZy5idWlsZFNjaGVtYXRhKCkgOiBDb2xsZWN0aW9ucy48U2NoZW1hPmVtcHR5U2V0KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvRFRQVG9vbHMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0RUUFRvb2xzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNDZlZmQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvRFRQVG9vbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuc3FsLlR5cGVzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLmRhdGF0eXBlcy5QcmltaXRpdmVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkpEQkNUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5KREJDVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5KYXZhVHlwZTsKLQotLyoqCi0gKiBIZWxwZXIgbWV0aG9kcyBmb3IgZGVhbGluZyB3aXRoIEVjbGlwc2UgRFRQLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRFRQVG9vbHMgewotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBKREJDIHR5cGUgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIFByaW1pdGl2ZSB0eXBlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSkRCQ1R5cGUgamRiY1R5cGVGb3JQcmltaXRpdmVUeXBlTmFtZWQoU3RyaW5nIHByaW1pdGl2ZVR5cGVOYW1lKSB7Ci0JCVByaW1pdGl2ZVRvSkRCQ1R5cGVNYXBwaW5nIG1hcHBpbmcgPSBwcmltaXRpdmVUb0pEQkNUeXBlTWFwcGluZyhwcmltaXRpdmVUeXBlTmFtZSk7Ci0JCXJldHVybiAobWFwcGluZyA9PSBudWxsKSA/IERFRkFVTFRfSkRCQ19UWVBFIDogbWFwcGluZy5nZXRKREJDVHlwZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgSkRCQyB0eXBlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBQcmltaXRpdmUgdHlwZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpEQkNUeXBlIGpkYmNUeXBlRm9yKFByaW1pdGl2ZVR5cGUgcHJpbWl0aXZlVHlwZSkgewotCQlyZXR1cm4gamRiY1R5cGVGb3JQcmltaXRpdmVUeXBlTmFtZWQocHJpbWl0aXZlVHlwZS5nZXROYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgSkRCQyB0eXBlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBQcmltaXRpdmUgdHlwZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpEQkNUeXBlIGpkYmNUeXBlRm9yUHJpbWl0aXZlVHlwZUNvZGUoaW50IHByaW1pdGl2ZVR5cGVDb2RlKSB7Ci0JCXJldHVybiBqZGJjVHlwZUZvcihQcmltaXRpdmVUeXBlLmdldChwcmltaXRpdmVUeXBlQ29kZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgSmF2YSB0eXBlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBQcmltaXRpdmUgdHlwZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFUeXBlIGphdmFUeXBlRm9yUHJpbWl0aXZlVHlwZU5hbWVkKFN0cmluZyBwcmltaXRpdmVUeXBlTmFtZSkgewotCQlyZXR1cm4gSkRCQ1Rvb2xzLmphdmFUeXBlRm9yKGpkYmNUeXBlRm9yUHJpbWl0aXZlVHlwZU5hbWVkKHByaW1pdGl2ZVR5cGVOYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBKYXZhIHR5cGUgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIFByaW1pdGl2ZSB0eXBlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YVR5cGUgamF2YVR5cGVGb3IoUHJpbWl0aXZlVHlwZSBwcmltaXRpdmVUeXBlKSB7Ci0JCXJldHVybiBKREJDVG9vbHMuamF2YVR5cGVGb3IoamRiY1R5cGVGb3IocHJpbWl0aXZlVHlwZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgSmF2YSB0eXBlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBQcmltaXRpdmUgdHlwZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFUeXBlIGphdmFUeXBlRm9yUHJpbWl0aXZlVHlwZUNvZGUoaW50IHByaW1pdGl2ZVR5cGVDb2RlKSB7Ci0JCXJldHVybiBKREJDVG9vbHMuamF2YVR5cGVGb3IoamRiY1R5cGVGb3JQcmltaXRpdmVUeXBlQ29kZShwcmltaXRpdmVUeXBlQ29kZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgUHJpbWl0aXZlIHR5cGUgaXMgYSBMT0IKLQkgKiAoaS5lLiBhIEJMT0IsIENMT0IsIG9yIE5DTE9CKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZGF0YVR5cGVJc0xvYihQcmltaXRpdmVUeXBlIHByaW1pdGl2ZVR5cGUpIHsKLQkJcmV0dXJuIChwcmltaXRpdmVUeXBlID09IFByaW1pdGl2ZVR5cGUuQklOQVJZX0xBUkdFX09CSkVDVF9MSVRFUkFMKQotCQkJCXx8IChwcmltaXRpdmVUeXBlID09IFByaW1pdGl2ZVR5cGUuQ0hBUkFDVEVSX0xBUkdFX09CSkVDVF9MSVRFUkFMKQotCQkJCXx8IChwcmltaXRpdmVUeXBlID09IFByaW1pdGl2ZVR5cGUuTkFUSU9OQUxfQ0hBUkFDVEVSX0xBUkdFX09CSkVDVF9MSVRFUkFMKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgc3R1ZmYgKioqKioqKioqKgotCi0KLQkvLyAqKioqKioqKioqIERUUCBQcmltaXRpdmUgPT4gSkRCQyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBQcmltaXRpdmUgPT4gSkRCQyB0eXBlIG1hcHBpbmdzLCBrZXllZCBieSBQcmltaXRpdmUgdHlwZSBuYW1lIChlLmcuICJDSEFSQUNURVJfVkFSWUlORyIpCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIFByaW1pdGl2ZVRvSkRCQ1R5cGVNYXBwaW5nPiBQUklNSVRJVkVfVE9fSkRCQ19UWVBFX01BUFBJTkdTOyAgLy8gcHNldWRvICdmaW5hbCcgLSBsYXp5LWluaXRpYWxpemVkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSkRCQ1R5cGUgREVGQVVMVF9KREJDX1RZUEUgPSBKREJDVHlwZS50eXBlKFR5cGVzLlZBUkNIQVIpOyAgLy8gVE9ETyBWQVJDSEFSIGlzIHRoZSBkZWZhdWx0PwotCi0KLQlwcml2YXRlIHN0YXRpYyBQcmltaXRpdmVUb0pEQkNUeXBlTWFwcGluZyBwcmltaXRpdmVUb0pEQkNUeXBlTWFwcGluZyhTdHJpbmcgcHJpbWl0aXZlVHlwZU5hbWUpIHsKLQkJcmV0dXJuIHByaW1pdGl2ZVRvSkRCQ1R5cGVNYXBwaW5ncygpLmdldChwcmltaXRpdmVUeXBlTmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIEhhc2hNYXA8U3RyaW5nLCBQcmltaXRpdmVUb0pEQkNUeXBlTWFwcGluZz4gcHJpbWl0aXZlVG9KREJDVHlwZU1hcHBpbmdzKCkgewotCQlpZiAoUFJJTUlUSVZFX1RPX0pEQkNfVFlQRV9NQVBQSU5HUyA9PSBudWxsKSB7Ci0JCQlQUklNSVRJVkVfVE9fSkRCQ19UWVBFX01BUFBJTkdTID0gYnVpbGRQcmltaXRpdmVUb0pEQkNUeXBlTWFwcGluZ3MoKTsKLQkJfQotCQlyZXR1cm4gUFJJTUlUSVZFX1RPX0pEQkNfVFlQRV9NQVBQSU5HUzsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBIYXNoTWFwPFN0cmluZywgUHJpbWl0aXZlVG9KREJDVHlwZU1hcHBpbmc+IGJ1aWxkUHJpbWl0aXZlVG9KREJDVHlwZU1hcHBpbmdzKCkgewotCQlIYXNoTWFwPFN0cmluZywgUHJpbWl0aXZlVG9KREJDVHlwZU1hcHBpbmc+IG1hcHBpbmdzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBQcmltaXRpdmVUb0pEQkNUeXBlTWFwcGluZz4oKTsKLQkJYWRkUHJpbWl0aXZlVG9KREJDVHlwZU1hcHBpbmdzVG8obWFwcGluZ3MpOwotCQlyZXR1cm4gbWFwcGluZ3M7Ci0JfQotCi0JLyoqCi0JICogaGFyZCBjb2RlIHRoZSBkZWZhdWx0IG1hcHBpbmdzIGZyb20gdGhlIERUUCBwcmltaXRpdmUgdHlwZXMgdG8gdGhlCi0JICogYXBwcm9wcmlhdGUgSkRCQyB0eXBlczsKLQkgKiBwcmV0dHkgbXVjaCBhIHN0cmFpZ2h0IG9uZS10by1vbmUgbWFwcGluZyBiYXNlZCBvbiBzaW1pbGFyIG5hbWVzOwotCSAqIFRPRE8gc29tZSBKREJDIHR5cGVzIGFyZSBtaXNzaW5nOiBJTlRFUlZBTCwgWE1MX1RZUEUKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZFByaW1pdGl2ZVRvSkRCQ1R5cGVNYXBwaW5nc1RvKEhhc2hNYXA8U3RyaW5nLCBQcmltaXRpdmVUb0pEQkNUeXBlTWFwcGluZz4gbWFwcGluZ3MpIHsKLQkJYWRkUHJpbWl0aXZlVG9KREJDVHlwZU1hcHBpbmdUbyhQcmltaXRpdmVUeXBlLkJJR0lOVF9MSVRFUkFMLCBUeXBlcy5CSUdJTlQsIG1hcHBpbmdzKTsKLQkJYWRkUHJpbWl0aXZlVG9KREJDVHlwZU1hcHBpbmdUbyhQcmltaXRpdmVUeXBlLkJJTkFSWV9MQVJHRV9PQkpFQ1RfTElURVJBTCwgVHlwZXMuQkxPQiwgbWFwcGluZ3MpOwotCQlhZGRQcmltaXRpdmVUb0pEQkNUeXBlTWFwcGluZ1RvKFByaW1pdGl2ZVR5cGUuQklOQVJZX0xJVEVSQUwsIFR5cGVzLkJJTkFSWSwgbWFwcGluZ3MpOwotCQlhZGRQcmltaXRpdmVUb0pEQkNUeXBlTWFwcGluZ1RvKFByaW1pdGl2ZVR5cGUuQklOQVJZX1ZBUllJTkdfTElURVJBTCwgVHlwZXMuVkFSQklOQVJZLCBtYXBwaW5ncyk7Ci0JCWFkZFByaW1pdGl2ZVRvSkRCQ1R5cGVNYXBwaW5nVG8oUHJpbWl0aXZlVHlwZS5CT09MRUFOX0xJVEVSQUwsIFR5cGVzLkJPT0xFQU4sIG1hcHBpbmdzKTsKLQkJYWRkUHJpbWl0aXZlVG9KREJDVHlwZU1hcHBpbmdUbyhQcmltaXRpdmVUeXBlLkNIQVJBQ1RFUl9MQVJHRV9PQkpFQ1RfTElURVJBTCwgVHlwZXMuQ0xPQiwgbWFwcGluZ3MpOwotCQlhZGRQcmltaXRpdmVUb0pEQkNUeXBlTWFwcGluZ1RvKFByaW1pdGl2ZVR5cGUuQ0hBUkFDVEVSX0xJVEVSQUwsIFR5cGVzLkNIQVIsIG1hcHBpbmdzKTsKLQkJYWRkUHJpbWl0aXZlVG9KREJDVHlwZU1hcHBpbmdUbyhQcmltaXRpdmVUeXBlLkNIQVJBQ1RFUl9WQVJZSU5HX0xJVEVSQUwsIFR5cGVzLlZBUkNIQVIsIG1hcHBpbmdzKTsKLQkJYWRkUHJpbWl0aXZlVG9KREJDVHlwZU1hcHBpbmdUbyhQcmltaXRpdmVUeXBlLkRBVEFMSU5LX0xJVEVSQUwsIFR5cGVzLkRBVEFMSU5LLCBtYXBwaW5ncyk7Ci0JCWFkZFByaW1pdGl2ZVRvSkRCQ1R5cGVNYXBwaW5nVG8oUHJpbWl0aXZlVHlwZS5EQVRFX0xJVEVSQUwsIFR5cGVzLkRBVEUsIG1hcHBpbmdzKTsKLQkJYWRkUHJpbWl0aXZlVG9KREJDVHlwZU1hcHBpbmdUbyhQcmltaXRpdmVUeXBlLkRFQ0lNQUxfTElURVJBTCwgVHlwZXMuREVDSU1BTCwgbWFwcGluZ3MpOwotCQlhZGRQcmltaXRpdmVUb0pEQkNUeXBlTWFwcGluZ1RvKFByaW1pdGl2ZVR5cGUuRE9VQkxFX1BSRUNJU0lPTl9MSVRFUkFMLCBUeXBlcy5ET1VCTEUsIG1hcHBpbmdzKTsKLQkJYWRkUHJpbWl0aXZlVG9KREJDVHlwZU1hcHBpbmdUbyhQcmltaXRpdmVUeXBlLkZMT0FUX0xJVEVSQUwsIFR5cGVzLkZMT0FULCBtYXBwaW5ncyk7Ci0JCWFkZFByaW1pdGl2ZVRvSkRCQ1R5cGVNYXBwaW5nVG8oUHJpbWl0aXZlVHlwZS5JTlRFR0VSX0xJVEVSQUwsIFR5cGVzLklOVEVHRVIsIG1hcHBpbmdzKTsKLQkJYWRkUHJpbWl0aXZlVG9KREJDVHlwZU1hcHBpbmdUbyhQcmltaXRpdmVUeXBlLklOVEVSVkFMX0xJVEVSQUwsIFR5cGVzLk9USEVSLCBtYXBwaW5ncyk7ICAvLyA/Pz8KLQkJYWRkUHJpbWl0aXZlVG9KREJDVHlwZU1hcHBpbmdUbyhQcmltaXRpdmVUeXBlLk5BVElPTkFMX0NIQVJBQ1RFUl9MQVJHRV9PQkpFQ1RfTElURVJBTCwgVHlwZXMuQ0xPQiwgbWFwcGluZ3MpOwotCQlhZGRQcmltaXRpdmVUb0pEQkNUeXBlTWFwcGluZ1RvKFByaW1pdGl2ZVR5cGUuTkFUSU9OQUxfQ0hBUkFDVEVSX0xJVEVSQUwsIFR5cGVzLkNIQVIsIG1hcHBpbmdzKTsKLQkJYWRkUHJpbWl0aXZlVG9KREJDVHlwZU1hcHBpbmdUbyhQcmltaXRpdmVUeXBlLk5BVElPTkFMX0NIQVJBQ1RFUl9WQVJZSU5HX0xJVEVSQUwsIFR5cGVzLlZBUkNIQVIsIG1hcHBpbmdzKTsKLQkJYWRkUHJpbWl0aXZlVG9KREJDVHlwZU1hcHBpbmdUbyhQcmltaXRpdmVUeXBlLk5VTUVSSUNfTElURVJBTCwgVHlwZXMuTlVNRVJJQywgbWFwcGluZ3MpOwotCQlhZGRQcmltaXRpdmVUb0pEQkNUeXBlTWFwcGluZ1RvKFByaW1pdGl2ZVR5cGUuUkVBTF9MSVRFUkFMLCBUeXBlcy5SRUFMLCBtYXBwaW5ncyk7Ci0JCWFkZFByaW1pdGl2ZVRvSkRCQ1R5cGVNYXBwaW5nVG8oUHJpbWl0aXZlVHlwZS5TTUFMTElOVF9MSVRFUkFMLCBUeXBlcy5TTUFMTElOVCwgbWFwcGluZ3MpOwotCQlhZGRQcmltaXRpdmVUb0pEQkNUeXBlTWFwcGluZ1RvKFByaW1pdGl2ZVR5cGUuVElNRV9MSVRFUkFMLCBUeXBlcy5USU1FLCBtYXBwaW5ncyk7Ci0JCWFkZFByaW1pdGl2ZVRvSkRCQ1R5cGVNYXBwaW5nVG8oUHJpbWl0aXZlVHlwZS5USU1FU1RBTVBfTElURVJBTCwgVHlwZXMuVElNRVNUQU1QLCBtYXBwaW5ncyk7Ci0JCWFkZFByaW1pdGl2ZVRvSkRCQ1R5cGVNYXBwaW5nVG8oUHJpbWl0aXZlVHlwZS5YTUxfVFlQRV9MSVRFUkFMLCBUeXBlcy5PVEhFUiwgbWFwcGluZ3MpOyAgLy8gPz8/Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRQcmltaXRpdmVUb0pEQkNUeXBlTWFwcGluZ1RvKFByaW1pdGl2ZVR5cGUgcHJpbWl0aXZlVHlwZSwgaW50IGpkYmNUeXBlQ29kZSwgSGFzaE1hcDxTdHJpbmcsIFByaW1pdGl2ZVRvSkRCQ1R5cGVNYXBwaW5nPiBtYXBwaW5ncykgewotCQkvLyBjaGVjayBmb3IgZHVwbGljYXRlcwotCQlPYmplY3QgcHJldiA9IG1hcHBpbmdzLnB1dChwcmltaXRpdmVUeXBlLmdldE5hbWUoKSwgYnVpbGRQcmltaXRpdmVUb0pEQkNUeXBlTWFwcGluZyhwcmltaXRpdmVUeXBlLCBqZGJjVHlwZUNvZGUpKTsKLQkJaWYgKHByZXYgIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZHVwbGljYXRlIEphdmEgY2xhc3M6ICIgKyAoKFByaW1pdGl2ZVRvSkRCQ1R5cGVNYXBwaW5nKSBwcmV2KS5nZXRQcmltaXRpdmVUeXBlKCkuZ2V0TmFtZSgpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIFByaW1pdGl2ZVRvSkRCQ1R5cGVNYXBwaW5nIGJ1aWxkUHJpbWl0aXZlVG9KREJDVHlwZU1hcHBpbmcoUHJpbWl0aXZlVHlwZSBwcmltaXRpdmVUeXBlLCBpbnQgamRiY1R5cGVDb2RlKSB7Ci0JCXJldHVybiBuZXcgUHJpbWl0aXZlVG9KREJDVHlwZU1hcHBpbmcocHJpbWl0aXZlVHlwZSwgSkRCQ1R5cGUudHlwZShqZGJjVHlwZUNvZGUpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JLyoqCi0JICogU3VwcHJlc3MgZGVmYXVsdCBjb25zdHJ1Y3RvciwgZW5zdXJpbmcgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkgKi8KLQlwcml2YXRlIERUUFRvb2xzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWVtYmVyIGNsYXNzZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUHJpbWl0aXZlID0+IEpEQkMKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBQcmltaXRpdmVUb0pEQkNUeXBlTWFwcGluZyB7Ci0JCXByaXZhdGUgZmluYWwgUHJpbWl0aXZlVHlwZSBwcmltaXRpdmVUeXBlOwotCQlwcml2YXRlIGZpbmFsIEpEQkNUeXBlIGpkYmNUeXBlOwotCi0JCVByaW1pdGl2ZVRvSkRCQ1R5cGVNYXBwaW5nKFByaW1pdGl2ZVR5cGUgcHJpbWl0aXZlVHlwZSwgSkRCQ1R5cGUgamRiY1R5cGUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnByaW1pdGl2ZVR5cGUgPSBwcmltaXRpdmVUeXBlOwotCQkJdGhpcy5qZGJjVHlwZSA9IGpkYmNUeXBlOwotCQl9Ci0KLQkJcHVibGljIFByaW1pdGl2ZVR5cGUgZ2V0UHJpbWl0aXZlVHlwZSgpIHsKLQkJCXJldHVybiB0aGlzLnByaW1pdGl2ZVR5cGU7Ci0JCX0KLQotCQlwdWJsaWMgSkRCQ1R5cGUgZ2V0SkRCQ1R5cGUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5qZGJjVHlwZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIG1hcHMoUHJpbWl0aXZlVHlwZSBwdCkgewotCQkJcmV0dXJuIHRoaXMucHJpbWl0aXZlVHlwZS5lcXVhbHMocHQpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gbWFwcyhTdHJpbmcgcHJpbWl0aXZlVHlwZU5hbWUpIHsKLQkJCXJldHVybiB0aGlzLnByaW1pdGl2ZVR5cGUuZ2V0TmFtZSgpLmVxdWFscyhwcmltaXRpdmVUeXBlTmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBtYXBzKGludCBwcmltaXRpdmVUeXBlQ29kZSkgewotCQkJcmV0dXJuIHRoaXMucHJpbWl0aXZlVHlwZS5nZXRWYWx1ZSgpID09IHByaW1pdGl2ZVR5cGVDb2RlOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQl0aGlzLmFwcGVuZFRvKHNiKTsKLQkJCXJldHVybiBzYi50b1N0cmluZygpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgYXBwZW5kVG8oU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCQlzYi5hcHBlbmQodGhpcy5wcmltaXRpdmVUeXBlLmdldE5hbWUoKSk7Ci0JCQlzYi5hcHBlbmQoIiA9PiAiKTsKLQkJCXRoaXMuamRiY1R5cGUuYXBwZW5kVG8oc2IpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvRFRQV3JhcHBlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvRFRQV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWU5ODA4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0RUUFdyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5zcW0uY29yZS5ydGUuSUNhdGFsb2dPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5zcW0uY29yZS5ydGUuSUNhdGFsb2dPYmplY3RMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LnNxbS5jb3JlLnJ0ZS5SZWZyZXNoTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiAgRGF0YVRvb2xzIFdyYXBwZXIgYmFzZSBjbGFzcy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIERUUFdyYXBwZXIgewotCQotCURUUFdyYXBwZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGRpc3Bvc2UoKTsKLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBjb25uZWN0aW9uSXNPbmxpbmUoKTsKLQotCXByb3RlY3RlZCB2b2lkIGFkZENhdGFsb2dPYmplY3RMaXN0ZW5lciggSUNhdGFsb2dPYmplY3QgY2F0YWxvZ09iamVjdCwgSUNhdGFsb2dPYmplY3RMaXN0ZW5lciBjYXRhbG9nT2JqZWN0TGlzdGVuZXIpIHsKLQkJaWYoIHRoaXMuY29ubmVjdGlvbklzT25saW5lKCkpIHsKLQkJCVJlZnJlc2hNYW5hZ2VyLmdldEluc3RhbmNlKCkuQWRkTGlzdGVuZXIoIGNhdGFsb2dPYmplY3QsIGNhdGFsb2dPYmplY3RMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVDYXRhbG9nT2JqZWN0TGlzdGVuZXIoIElDYXRhbG9nT2JqZWN0IGNhdGFsb2dPYmplY3QsIElDYXRhbG9nT2JqZWN0TGlzdGVuZXIgY2F0YWxvZ09iamVjdExpc3RlbmVyKSB7Ci0JCWlmKCB0aGlzLmNvbm5lY3Rpb25Jc09ubGluZSgpKSB7Ci0JICAgICAgICBSZWZyZXNoTWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlbW92ZUxpc3RlbmVyKCBjYXRhbG9nT2JqZWN0LCBjYXRhbG9nT2JqZWN0TGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLy8gKioqKioqKioqKiBxdWVyaWVzICoqKioqKioqKioKLQotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0TmFtZSgpOwotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKCB0aGlzLCB0aGlzLmdldE5hbWUoKSk7Ci0JfQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC9EYXRhYmFzZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvRGF0YWJhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI3ZjU2NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC9EYXRhYmFzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsOwotCi1pbXBvcnQgamF2YS50ZXh0LkNvbGxhdG9yOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7Ci0KLS8qKgotICogIERhdGFiYXNlIHdyYXBwZXIgYmFzZSBjbGFzcy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIERhdGFiYXNlIGV4dGVuZHMgRFRQV3JhcHBlciBpbXBsZW1lbnRzIENvbXBhcmFibGU8RGF0YWJhc2U+IHsKLQkKLQlwcml2YXRlIGJvb2xlYW4gY2FzZVNlbnNpdGl2ZSA9IGZhbHNlOyAgLy8gVE9ETyBhbGxvdyB1c2VyIHRvIGNvbmZpZ3VyZQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0Jc3RhdGljIERhdGFiYXNlIGNyZWF0ZURhdGFiYXNlKCBDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuRGF0YWJhc2UgZHRwRGF0YWJhc2UpIHsKLQkJcmV0dXJuICggZHRwRGF0YWJhc2UgPT0gbnVsbCkgPyBOdWxsRGF0YWJhc2UuaW5zdGFuY2UoKSA6IG5ldyBEVFBEYXRhYmFzZVdyYXBwZXIoIHByb2ZpbGUsIGR0cERhdGFiYXNlKTsKLQl9Ci0KLQlEYXRhYmFzZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCWFic3RyYWN0IHZvaWQgY2F0YWxvZ0NoYW5nZWQoIENhdGFsb2cgY2F0YWxvZywgaW50IGV2ZW50VHlwZSk7Ci0KLQlhYnN0cmFjdCB2b2lkIHNjaGVtYUNoYW5nZWQoIFNjaGVtYSBzY2hlbWEsIGludCBldmVudFR5cGUpOwotCi0JYWJzdHJhY3Qgdm9pZCB0YWJsZUNoYW5nZWQoIFRhYmxlIHRhYmxlLCAgU2NoZW1hIHNjaGVtYSwgaW50IGV2ZW50VHlwZSk7Ci0JCi0JYWJzdHJhY3Qgdm9pZCByZWZyZXNoKCk7Ci0JCi0JcHJvdGVjdGVkIFNjaGVtYSB3cmFwKCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuU2NoZW1hIHNjaGVtYSkgewotCQlyZXR1cm4gbmV3IFNjaGVtYSggdGhpcywgc2NoZW1hKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIENhdGFsb2cgd3JhcCggb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkNhdGFsb2cgY2F0YWxvZykgewotCQlyZXR1cm4gbmV3IENhdGFsb2coIHRoaXMsIGNhdGFsb2cpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRWZW5kb3IoKTsKLQkKLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFZlcnNpb24oKTsKLQotCS8qKgotCSAqIHJldHVybiB0aGUgY29sdW1uIGZvciB0aGUgc3BlY2lmaWVkIGR0cCBjb2x1bW4KLQkgKi8KLQlDb2x1bW4gY29sdW1uKCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuQ29sdW1uIGR0cENvbHVtbikgewotCQlyZXR1cm4gdGhpcy50YWJsZSggZHRwQ29sdW1uLmdldFRhYmxlKCkpLmNvbHVtbiggZHRwQ29sdW1uKTsKLQl9Ci0JCi0JLyoqCi0JICogcmV0dXJuIHRoZSB0YWJsZSBmb3IgdGhlIHNwZWNpZmllZCBkdHAgdGFibGUKLQkgKi8KLQlUYWJsZSB0YWJsZSggb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLlRhYmxlIGR0cFRhYmxlKSB7Ci0JCXJldHVybiB0aGlzLnNjaGVtYSggZHRwVGFibGUuZ2V0U2NoZW1hKCkpLnRhYmxlKCBkdHBUYWJsZSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBDb21wYXJhYmxlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBpbnQgY29tcGFyZVRvKCBEYXRhYmFzZSBkYXRhYmFzZSkgewotCQlyZXR1cm4gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKS5jb21wYXJlKCB0aGlzLmdldE5hbWUoKSwgZGF0YWJhc2UuZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvLyAqKioqKiBjYXNlU2Vuc2l0aXZlCi0KLQlwdWJsaWMgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUoKSB7Ci0JCXJldHVybiB0aGlzLmNhc2VTZW5zaXRpdmU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2FzZVNlbnNpdGl2ZSggYm9vbGVhbiBjYXNlU2Vuc2l0aXZlKSB7Ci0JCXRoaXMuY2FzZVNlbnNpdGl2ZSA9IGNhc2VTZW5zaXRpdmU7Ci0JfQotCi0JLy8gKioqKiogY2F0YWxvZ3MKLQotCWFic3RyYWN0IFNldDxDYXRhbG9nPiBnZXRDYXRhbG9ncygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoaXMgZGF0YWJhc2UgYWNjZXB0cyBjYXRhbG9ncy4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBzdXBwb3J0c0NhdGFsb2dzKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2F0YWxvZyB0byB1c2UgYnkgZGVmYXVsdC4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldERlZmF1bHRDYXRhbG9nTmFtZSgpOwotCQotCXB1YmxpYyBJdGVyYXRvcjxDYXRhbG9nPiBjYXRhbG9ncygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2F0YWxvZ3MoKS5pdGVyYXRvcigpOwotCX0KLQotCXB1YmxpYyBpbnQgY2F0YWxvZ1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmdldENhdGFsb2dzKCkuc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGNhdGFsb2dOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPENhdGFsb2csIFN0cmluZz4oIHRoaXMuY2F0YWxvZ3MoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybSggQ2F0YWxvZyBjYXRhbG9nKSB7Ci0JCQkJIHJldHVybiBjYXRhbG9nLmdldE5hbWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc0NhdGFsb2dOYW1lZCggU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuY2F0YWxvZ05hbWVkKCBuYW1lKSAhPSBudWxsOwotCX0KLQotCXB1YmxpYyBDYXRhbG9nIGNhdGFsb2dOYW1lZCggU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuaXNDYXNlU2Vuc2l0aXZlKCkgPyB0aGlzLmNhdGFsb2dOYW1lZEludGVybmFsKCBuYW1lKSA6IHRoaXMuY2F0YWxvZ05hbWVkSWdub3JlQ2FzZSggbmFtZSk7Ci0JfQotCQotCXByaXZhdGUgQ2F0YWxvZyBjYXRhbG9nTmFtZWRJbnRlcm5hbCggU3RyaW5nIG5hbWUpIHsKLQkJZm9yICggSXRlcmF0b3I8Q2F0YWxvZz4gc3RyZWFtID0gdGhpcy5jYXRhbG9ncygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCUNhdGFsb2cgY2F0YWxvZyA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlpZiAoIGNhdGFsb2cuZ2V0TmFtZSgpLmVxdWFscyggbmFtZSkpIHsKLQkJCQlyZXR1cm4gY2F0YWxvZzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBDYXRhbG9nIGNhdGFsb2dOYW1lZElnbm9yZUNhc2UoIFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoIEl0ZXJhdG9yPENhdGFsb2c+IHN0cmVhbSA9IHRoaXMuY2F0YWxvZ3MoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlDYXRhbG9nIGNhdGFsb2cgPSBzdHJlYW0ubmV4dCgpOwotCQkJaWYgKCBTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWxJZ25vcmVDYXNlKCBjYXRhbG9nLmdldE5hbWUoKSwgbmFtZSkpIHsKLQkJCQlyZXR1cm4gY2F0YWxvZzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm4gdGhlIGNhdGFsb2cgZm9yIHRoZSBzcGVjaWZpZWQgZHRwIGNhdGFsb2cKLQkgKi8KLQlDYXRhbG9nIGNhdGFsb2coIG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5DYXRhbG9nIGR0cENhdGFsb2cpIHsKLQkJZm9yICggSXRlcmF0b3I8Q2F0YWxvZz4gc3RyZWFtID0gdGhpcy5jYXRhbG9ncygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCUNhdGFsb2cgY2F0YWxvZyA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlpZiAoY2F0YWxvZy53cmFwcyggZHRwQ2F0YWxvZykpIHsKLQkJCQlyZXR1cm4gY2F0YWxvZzsKLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAiaW52YWxpZCBkdHAgY2F0YWxvZzogIiArIGR0cENhdGFsb2cpOwotCX0KLQotCi0JLy8gKioqKiogc2NoZW1hdGEKLQotCWFic3RyYWN0IFNldDxTY2hlbWE+IGdldFNjaGVtYXRhKCk7Ci0KLQlwdWJsaWMgSXRlcmF0b3I8U2NoZW1hPiBzY2hlbWF0YSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0U2NoZW1hdGEoKS5pdGVyYXRvcigpOwotCX0KLQotCXB1YmxpYyBpbnQgc2NoZW1hdGFTaXplKCkgewotCQlyZXR1cm4gdGhpcy5nZXRTY2hlbWF0YSgpLnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzY2hlbWF0YUNvbnRhaW5zKCBDb2x1bW4gY29sdW1uKSB7Ci0JCXJldHVybiB0aGlzLmdldFNjaGVtYXRhKCkuY29udGFpbnMoIGNvbHVtbik7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gc2NoZW1hTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxTY2hlbWEsIFN0cmluZz4oIHRoaXMuc2NoZW1hdGEoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybSggU2NoZW1hIHNjaGVtYSkgewotCQkJCSByZXR1cm4gc2NoZW1hLmdldE5hbWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc1NjaGVtYU5hbWVkKCBTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gdGhpcy5zY2hlbWFOYW1lZCggbmFtZSkgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU2NoZW1hIHNjaGVtYU5hbWVkKCBTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gdGhpcy5pc0Nhc2VTZW5zaXRpdmUoKSA/IHRoaXMuc2NoZW1hTmFtZWRJbnRlcm5hbCggbmFtZSkgOiB0aGlzLnNjaGVtYU5hbWVkSWdub3JlQ2FzZSggbmFtZSk7Ci0JfQotCQotCXByaXZhdGUgU2NoZW1hIHNjaGVtYU5hbWVkSW50ZXJuYWwoIFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoIEl0ZXJhdG9yPFNjaGVtYT4gc3RyZWFtID0gdGhpcy5zY2hlbWF0YSgpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCVNjaGVtYSBzY2hlbWEgPSBzdHJlYW0ubmV4dCgpOwotCQkJaWYgKCBzY2hlbWEuZ2V0TmFtZSgpLmVxdWFscyggbmFtZSkpIHsKLQkJCQlyZXR1cm4gc2NoZW1hOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIFNjaGVtYSBzY2hlbWFOYW1lZElnbm9yZUNhc2UoIFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoIEl0ZXJhdG9yPFNjaGVtYT4gc3RyZWFtID0gdGhpcy5zY2hlbWF0YSgpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCVNjaGVtYSBzY2hlbWEgPSBzdHJlYW0ubmV4dCgpOwotCQkJaWYgKCBTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWxJZ25vcmVDYXNlKCBzY2hlbWEuZ2V0TmFtZSgpLCBuYW1lKSkgewotCQkJCXJldHVybiBzY2hlbWE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJuIHRoZSBzY2hlbWEgZm9yIHRoZSBzcGVjaWZpZWQgZHRwIHNjaGVtYQotCSAqLwotCVNjaGVtYSBzY2hlbWEoIG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWEgZHRwU2NoZW1hKSB7Ci0JCWZvciAoIEl0ZXJhdG9yPFNjaGVtYT4gc3RyZWFtID0gdGhpcy5zY2hlbWF0YSgpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCVNjaGVtYSBzY2hlbWEgPSBzdHJlYW0ubmV4dCgpOwotCQkJaWYgKCBzY2hlbWEud3JhcHMoIGR0cFNjaGVtYSkpIHsKLQkJCQlyZXR1cm4gc2NoZW1hOwotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJpbnZhbGlkIGR0cCBzY2hlbWE6ICIgKyBkdHBTY2hlbWEpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvRm9yZWlnbktleS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvRm9yZWlnbktleS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmMwNTAxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0ZvcmVpZ25LZXkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudGV4dC5Db2xsYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuc3FtLmNvcmUucnRlLklDYXRhbG9nT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuc3FtLmNvcmUucnRlLklDYXRhbG9nT2JqZWN0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkZpbHRlcmluZ0l0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOwotCi0vKioKLSAqICBXcmFwIGEgRFRQIEZvcmVpZ25LZXkKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEZvcmVpZ25LZXkgZXh0ZW5kcyBEVFBXcmFwcGVyIGltcGxlbWVudHMgQ29tcGFyYWJsZTxGb3JlaWduS2V5PiB7Ci0JcHJpdmF0ZSBmaW5hbCBUYWJsZSBiYXNlVGFibGU7Ci0JcHJpdmF0ZSBmaW5hbCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5jb25zdHJhaW50cy5Gb3JlaWduS2V5IGR0cEZvcmVpZ25LZXk7Ci0JcHJpdmF0ZSBJQ2F0YWxvZ09iamVjdExpc3RlbmVyIGZvcmVpZ25LZXlMaXN0ZW5lcjsKLQotCXByaXZhdGUgVGFibGUgcmVmZXJlbmNlZFRhYmxlOyAgLy8gbGF6eS1pbml0aWFsaXplZAotCXByaXZhdGUgU2V0PENvbHVtblBhaXI+IGNvbHVtblBhaXJzOyAgLy8gbGF6eS1pbml0aWFsaXplZAotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRFbnRpdHlGaWVsZE5hbWU7ICAvLyBsYXp5LWluaXRpYWxpemVkCi0JcHJpdmF0ZSBib29sZWFuIGRlZmF1bHRFbnRpdHlGaWVsZE5hbWVDYWxjdWxhdGVkID0gZmFsc2U7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCUZvcmVpZ25LZXkoVGFibGUgYmFzZVRhYmxlLCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5jb25zdHJhaW50cy5Gb3JlaWduS2V5IGR0cEZvcmVpZ25LZXkpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5iYXNlVGFibGUgPSBiYXNlVGFibGU7Ci0JCXRoaXMuZHRwRm9yZWlnbktleSA9IGR0cEZvcmVpZ25LZXk7Ci0JCXRoaXMuaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCWlmKCB0aGlzLmNvbm5lY3Rpb25Jc09ubGluZSgpKSB7Ci0JCQl0aGlzLmZvcmVpZ25LZXlMaXN0ZW5lciA9IHRoaXMuYnVpbGRGb3JlaWduS2V5TGlzdGVuZXIoKTsKLQkJCXRoaXMuYWRkQ2F0YWxvZ09iamVjdExpc3RlbmVyKCggSUNhdGFsb2dPYmplY3QpIHRoaXMuZHRwRm9yZWlnbktleSwgdGhpcy5mb3JlaWduS2V5TGlzdGVuZXIpOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGNvbm5lY3Rpb25Jc09ubGluZSgpIHsKLQkJcmV0dXJuIHRoaXMuYmFzZVRhYmxlLmNvbm5lY3Rpb25Jc09ubGluZSgpOwotCX0KLQkKLQlwcml2YXRlIElDYXRhbG9nT2JqZWN0TGlzdGVuZXIgYnVpbGRGb3JlaWduS2V5TGlzdGVuZXIoKSB7Ci0gICAgICAgcmV0dXJuIG5ldyBJQ2F0YWxvZ09iamVjdExpc3RlbmVyKCkgewotICAgIAkgICAgcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZCggZmluYWwgSUNhdGFsb2dPYmplY3QgZm9yZWlnbktleSwgZmluYWwgaW50IGV2ZW50VHlwZSkgeyAKLS8vCQkJCVRPRE8KLS8vICAgIAkJCWlmKCBmb3JlaWduS2V5ID09IEZvcmVpZ25LZXkudGhpcy5kdHBGb3JlaWduS2V5KSB7CSAgICAJICAgIAkKLS8vICAgIAkJCQlGb3JlaWduS2V5LnRoaXMuYmFzZVRhYmxlLmZvcmVpZ25LZXlDaGFuZ2VkKCBGb3JlaWduS2V5LnRoaXMsIGV2ZW50VHlwZSk7Ci0vLyAgICAJCQl9Ci0gICAgCSAgICB9Ci0gICAgICAgIH07Ci0gICAgfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzcG9zZSgpIHsKLQkJCi0JCXRoaXMucmVtb3ZlQ2F0YWxvZ09iamVjdExpc3RlbmVyKCggSUNhdGFsb2dPYmplY3QpIHRoaXMuZHRwRm9yZWlnbktleSwgdGhpcy5mb3JlaWduS2V5TGlzdGVuZXIpOwotCX0KLQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0KLQlwdWJsaWMgVGFibGUgZ2V0QmFzZVRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5iYXNlVGFibGU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5kdHBGb3JlaWduS2V5LmdldE5hbWUoKTsKLQl9Ci0KLQlib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZSgpIHsKLQkJcmV0dXJuIHRoaXMuYmFzZVRhYmxlLmlzQ2FzZVNlbnNpdGl2ZSgpOwotCX0KLQotCWJvb2xlYW4gd3JhcHMob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuY29uc3RyYWludHMuRm9yZWlnbktleSBmb3JlaWduS2V5KSB7Ci0JCXJldHVybiB0aGlzLmR0cEZvcmVpZ25LZXkgPT0gZm9yZWlnbktleTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmdldE5hbWUoKSArICI6ICIgKyB0aGlzLmdldENvbHVtblBhaXJzKCkpOwotCX0KLQotCXB1YmxpYyBUYWJsZSBnZXRSZWZlcmVuY2VkVGFibGUoKSB7Ci0JCWlmICh0aGlzLnJlZmVyZW5jZWRUYWJsZSA9PSBudWxsKSB7Ci0JCQl0aGlzLnJlZmVyZW5jZWRUYWJsZSA9IHRoaXMuYmFzZVRhYmxlLnRhYmxlKHRoaXMuZHRwRm9yZWlnbktleS5nZXRVbmlxdWVDb25zdHJhaW50KCkuZ2V0QmFzZVRhYmxlKCkpOwotCQl9Ci0JCXJldHVybiB0aGlzLnJlZmVyZW5jZWRUYWJsZTsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm4gdGhlIGZvcmVpZ24ga2V5J3MgImJhc2UiIGNvbHVtbnMKLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3I8Q29sdW1uPiBiYXNlQ29sdW1ucygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPENvbHVtblBhaXIsIENvbHVtbj4odGhpcy5jb2x1bW5QYWlycygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDb2x1bW4gdHJhbnNmb3JtKENvbHVtblBhaXIgcGFpcikgewotCQkJCXJldHVybiBwYWlyLmdldEJhc2VDb2x1bW4oKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm4gdGhlIGZvcmVpZ24ga2V5J3MgImJhc2UiIGNvbHVtbnMgdGhhdCBhcmUgbm90IHBhcnQgb2YKLQkgKiB0aGUgYmFzZSB0YWJsZSdzIHByaW1hcnkga2V5Ci0JICovCi0JcHVibGljIEl0ZXJhdG9yPENvbHVtbj4gbm9uUHJpbWFyeUtleUJhc2VDb2x1bW5zKCkgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPENvbHVtbj4odGhpcy5iYXNlQ29sdW1ucygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChPYmplY3QgbykgewotCQkJCXJldHVybiAhIEZvcmVpZ25LZXkudGhpcy5nZXRCYXNlVGFibGUoKS5wcmltYXJ5S2V5Q29sdW1uc0NvbnRhaW5zKChDb2x1bW4pIG8pOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIHJldHVybiB0aGUgZm9yZWlnbiBrZXkncyAicmVmZXJlbmNlZCIgY29sdW1ucwotCSAqLwotCXB1YmxpYyBJdGVyYXRvcjxDb2x1bW4+IHJlZmVyZW5jZWRDb2x1bW5zKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8Q29sdW1uUGFpciwgQ29sdW1uPih0aGlzLmNvbHVtblBhaXJzKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIENvbHVtbiB0cmFuc2Zvcm0oQ29sdW1uUGFpciBjb2x1bW5QYWlyKSB7Ci0JCQkJcmV0dXJuIGNvbHVtblBhaXIuZ2V0UmVmZXJlbmNlZENvbHVtbigpOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgamF2YUZpZWxkTmFtZSgpIHsKLQkJU3RyaW5nIGZpZWxkTmFtZSA9IHRoaXMuZ2V0RGVmYXVsdEVudGl0eUZpZWxkTmFtZSgpOwotCQlyZXR1cm4gKGZpZWxkTmFtZSA9PSBudWxsKSA/Ci0JCQl0aGlzLm5vbkRlZmF1bHRFbnRpdHlGaWVsZE5hbWUoKQotCQk6Ci0JCQlmaWVsZE5hbWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbWF0Y2hlc0phdmFGaWVsZE5hbWUoU3RyaW5nIGphdmFGaWVsZE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuaXNDYXNlU2Vuc2l0aXZlKCkgPwotCQkJamF2YUZpZWxkTmFtZS5lcXVhbHModGhpcy5nZXREZWZhdWx0RW50aXR5RmllbGROYW1lKCkpCi0JCToKLQkJCWphdmFGaWVsZE5hbWUuZXF1YWxzSWdub3JlQ2FzZSh0aGlzLmdldERlZmF1bHRFbnRpdHlGaWVsZE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0Rm9yKFN0cmluZyBqYXZhRmllbGROYW1lKSB7Ci0JCWlmICh0aGlzLmNvbHVtblBhaXJzU2l6ZSgpICE9IDEpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmICh0aGlzLmdldFJlZmVyZW5jZWRUYWJsZSgpLnByaW1hcnlLZXlDb2x1bW5zU2l6ZSgpICE9IDEpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCUNvbHVtblBhaXIgY29sdW1uUGFpciA9IHRoaXMuY29sdW1uUGFpcnMoKS5uZXh0KCk7Ci0JCUNvbHVtbiBwa0NvbHVtbiA9IHRoaXMuZ2V0UmVmZXJlbmNlZFRhYmxlKCkucHJpbWFyeUtleUNvbHVtbnMoKS5uZXh0KCk7Ci0JCWlmIChjb2x1bW5QYWlyLmdldFJlZmVyZW5jZWRDb2x1bW4oKSAhPSBwa0NvbHVtbikgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIGNvbHVtblBhaXIuZ2V0QmFzZUNvbHVtbigpLm1hdGNoZXNKYXZhRmllbGROYW1lKGphdmFGaWVsZE5hbWUgKyAiXyIgKyBwa0NvbHVtbi5nZXROYW1lKCkpOwotCX0KLQotCi0JLy8gKioqKiogY29sdW1uIHBhaXJzCi0KLQlwcml2YXRlIHN5bmNocm9uaXplZCBTZXQ8Q29sdW1uUGFpcj4gZ2V0Q29sdW1uUGFpcnMoKSB7Ci0JCWlmICh0aGlzLmNvbHVtblBhaXJzID09IG51bGwpIHsKLQkJCXRoaXMuY29sdW1uUGFpcnMgPSB0aGlzLmJ1aWxkQ29sdW1uUGFpcnMoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5jb2x1bW5QYWlyczsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIExpc3Q8b3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLkNvbHVtbj4gZHRwQmFzZUNvbHVtbnMoKSB7Ci0JCXJldHVybiB0aGlzLmR0cEZvcmVpZ25LZXkuZ2V0TWVtYmVycygpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuQ29sdW1uPiBkdHBSZWZDb2x1bW5zKCkgewotCQlyZXR1cm4gdGhpcy5kdHBGb3JlaWduS2V5LmdldFVuaXF1ZUNvbnN0cmFpbnQoKS5nZXRNZW1iZXJzKCk7Ci0JfQotCi0JcHJpdmF0ZSBTZXQ8Q29sdW1uUGFpcj4gYnVpbGRDb2x1bW5QYWlycygpIHsKLQkJTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuQ29sdW1uPiBiYXNlQ29sdW1ucyA9IHRoaXMuZHRwQmFzZUNvbHVtbnMoKTsKLQkJaW50IHNpemUgPSBiYXNlQ29sdW1ucy5zaXplKCk7Ci0JCUxpc3Q8b3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLkNvbHVtbj4gcmVmQ29sdW1ucyA9IHRoaXMuZHRwUmVmQ29sdW1ucygpOwotCQlpZiAocmVmQ29sdW1ucy5zaXplKCkgIT0gc2l6ZSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibWlzbWF0Y2hlZCBzaXplczogIiArIHNpemUgKyAiIHZzLiAiICsgcmVmQ29sdW1ucy5zaXplKCkpOwotCQl9Ci0JCVNldDxDb2x1bW5QYWlyPiByZXN1bHQgPSBuZXcgSGFzaFNldDxDb2x1bW5QYWlyPihiYXNlQ29sdW1ucy5zaXplKCkpOwotCQlmb3IgKGludCBpID0gYmFzZUNvbHVtbnMuc2l6ZSgpOyBpLS0gPiAwOyApIHsKLQkJCUNvbHVtbiBiYXNlQ29sdW1uID0gdGhpcy5iYXNlVGFibGUuY29sdW1uKGJhc2VDb2x1bW5zLmdldChpKSk7Ci0JCQlDb2x1bW4gcmVmQ29sdW1uID0gdGhpcy5iYXNlVGFibGUuY29sdW1uKHJlZkNvbHVtbnMuZ2V0KGkpKTsKLQkJCXJlc3VsdC5hZGQobmV3IENvbHVtblBhaXIoYmFzZUNvbHVtbiwgcmVmQ29sdW1uKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8Q29sdW1uUGFpcj4gY29sdW1uUGFpcnMoKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbHVtblBhaXJzKCkuaXRlcmF0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGNvbHVtblBhaXJzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29sdW1uUGFpcnMoKS5zaXplKCk7Ci0JfQotCi0KLQkvLyAqKioqKiBkZWZhdWx0IGVudGl0eSBmaWVsZCBuYW1lCi0KLQkvKioKLQkgKiBJZiB0aGUgbmFtZSBvZiB0aGUgImJhc2UiIGNvbHVtbiBhZGhlcmVzIHRvIHRoZSBFSkIgc3RhbmRhcmQgZm9yIGEKLQkgKiBkZWZhdWx0IG1hcHBpbmcgKGkuZS4gaXQgZW5kcyB3aXRoIGFuIHVuZGVyc2NvcmUgZm9sbG93ZWQgYnkgdGhlIG5hbWUKLQkgKiBvZiB0aGUgInJlZmVyZW5jZWQiIGNvbHVtbiwgYW5kIHRoZSAicmVmZXJlbmNlZCIgY29sdW1uIGlzIHRoZSBzaW5nbGUKLQkgKiBwcmltYXJ5IGtleSBjb2x1bW4gb2YgdGhlICJyZWZlcmVuY2VkIiB0YWJsZSksIHJldHVybiB0aGUgY29ycmVzcG9uZGluZwotCSAqIGRlZmF1bHQgZW50aXR5IGZpZWxkIG5hbWU6Ci0JICogICAgIEZvcmVpZ25LZXkoRU1QLkNVQklDTEVfSUQgPT4gQ1VCSUNMRS5JRCkgPT4gIkNVQklDTEUiCi0JICogUmV0dXJuIGEgbnVsbCBpZiBpdCBkb2VzIG5vdCBhZGhlcmUgdG8gdGhlIEVKQiBzdGFuZGFyZDoKLQkgKiAgICAgRm9yZWlnbktleShFTVAuQ1VCSUNMRV9JRCA9PiBDVUJJQ0xFLkNVQklDTEVfSUQpID0+IG51bGwKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXREZWZhdWx0RW50aXR5RmllbGROYW1lKCkgewotCQlpZiAoICEgdGhpcy5kZWZhdWx0RW50aXR5RmllbGROYW1lQ2FsY3VsYXRlZCkgewotCQkJdGhpcy5kZWZhdWx0RW50aXR5RmllbGROYW1lQ2FsY3VsYXRlZCA9IHRydWU7Ci0JCQl0aGlzLmRlZmF1bHRFbnRpdHlGaWVsZE5hbWUgPSB0aGlzLmJ1aWxkRGVmYXVsdEVudGl0eUZpZWxkTmFtZSgpOwotCQl9Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRFbnRpdHlGaWVsZE5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSAjZ2V0RGVmYXVsdEVudGl0eUZpZWxkTmFtZSgpCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGREZWZhdWx0RW50aXR5RmllbGROYW1lKCkgewotCQlpZiAoICEgdGhpcy5yZWZlcmVuY2VzU2luZ2xlQ29sdW1uUHJpbWFyeUtleSgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlDb2x1bW5QYWlyIGNvbHVtblBhaXIgPSB0aGlzLmNvbHVtblBhaXJzKCkubmV4dCgpOwotCQlTdHJpbmcgYmFzZUNvbE5hbWUgPSBjb2x1bW5QYWlyLmdldEJhc2VDb2x1bW4oKS5nZXROYW1lKCk7Ci0JCVN0cmluZyByZWZDb2xOYW1lID0gY29sdW1uUGFpci5nZXRSZWZlcmVuY2VkQ29sdW1uKCkuZ2V0TmFtZSgpOwotCQlpZiAoYmFzZUNvbE5hbWUubGVuZ3RoKCkgPD0gKHJlZkNvbE5hbWUubGVuZ3RoKCkgKyAxKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaWYgKCAhIGJhc2VDb2xOYW1lLmVuZHNXaXRoKHJlZkNvbE5hbWUpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpbnQgX2luZGV4ID0gYmFzZUNvbE5hbWUubGVuZ3RoKCkgLSByZWZDb2xOYW1lLmxlbmd0aCgpIC0gMTsKLQkJaWYgKGJhc2VDb2xOYW1lLmNoYXJBdChfaW5kZXgpICE9ICdfJykgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nIG5hbWUgPSBiYXNlQ29sTmFtZS5zdWJzdHJpbmcoMCwgX2luZGV4KTsKLQkJcmV0dXJuIHRoaXMuaXNDYXNlU2Vuc2l0aXZlKCkgPyBuYW1lIDogbmFtZS50b0xvd2VyQ2FzZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBmb3JlaWduIGtleSByZWZlcmVuY2VzIHRoZSBwcmltYXJ5IGtleSBvZiB0aGUKLQkgKiAicmVmZXJlbmNlZCIgdGFibGUgYW5kIHRoYXQgcHJpbWFyeSBrZXkgaGFzIG9ubHkgYSBzaW5nbGUgY29sdW1uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlZmVyZW5jZXNTaW5nbGVDb2x1bW5QcmltYXJ5S2V5KCkgewotCQlpZiAodGhpcy5jb2x1bW5QYWlyc1NpemUoKSAhPSAxKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKHRoaXMuZ2V0UmVmZXJlbmNlZFRhYmxlKCkucHJpbWFyeUtleUNvbHVtbnNTaXplKCkgIT0gMSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJQ29sdW1uUGFpciBjb2x1bW5QYWlyID0gdGhpcy5jb2x1bW5QYWlycygpLm5leHQoKTsKLQkJcmV0dXJuIGNvbHVtblBhaXIuZ2V0UmVmZXJlbmNlZENvbHVtbigpID09IHRoaXMuZ2V0UmVmZXJlbmNlZFRhYmxlKCkucHJpbWFyeUtleUNvbHVtbnMoKS5uZXh0KCk7Ci0JfQotCi0JLyoqCi0JICogSWYgdGhpcyBpcyBhIHNpbXBsZSAoc2luZ2xlLWNvbHVtbikgZm9yZWlnbiBrZXksIHJldHVybiB0aGUgamF2YSBmaWVsZAotCSAqIG5hbWUgb2YgdGhlIHNpbmdsZSBiYXNlIGNvbHVtbi4gSWYgdGhpcyBpcyBhIGNvbXBvdW5kIGZvcmVpZ24ga2V5LAotCSAqIHJldHVybiB0aGUgamF2YSBmaWVsZCBuYW1lIG9mIHRoZSByZWZlcmVuY2VkIHRhYmxlLgotCSAqLwotCS8vIFRPRE8gaWYgdGhlcmUgaXMgb25seSBvbmUgRksgdG8gYSBnaXZlbiB0YWJsZSwgdXNlIHRoZSB0YWJsZSdzIG5hbWUgaW5zdGVhZCBvZiB0aGUgY29sdW1uJ3MgbmFtZT8KLQkvLyBUT0RPIGlmIHRoZSBGSyBjb2x1bW4gbmFtZSBlbmRzIHdpdGggdGhlIFBLIGNvbHVtbiBuYW1lLCBzdHJpcCB0aGUgUEsgY29sdW1uIG5hbWU/Ci0JcHJpdmF0ZSBTdHJpbmcgbm9uRGVmYXVsdEVudGl0eUZpZWxkTmFtZSgpIHsKLQkJcmV0dXJuICh0aGlzLmNvbHVtblBhaXJzU2l6ZSgpID09IDEpID8KLQkJCXRoaXMuY29sdW1uUGFpcnMoKS5uZXh0KCkuZ2V0QmFzZUNvbHVtbigpLmphdmFGaWVsZE5hbWUoKQotCQk6Ci0JCQl0aGlzLmdldFJlZmVyZW5jZWRUYWJsZSgpLmphdmFGaWVsZE5hbWUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ29tcGFyYWJsZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgaW50IGNvbXBhcmVUbyhGb3JlaWduS2V5IGZvcmVpZ25LZXkpIHsKLQkJcmV0dXJuIENvbGxhdG9yLmdldEluc3RhbmNlKCkuY29tcGFyZSh0aGlzLmdldE5hbWUoKSwgZm9yZWlnbktleS5nZXROYW1lKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtZW1iZXIgY2xhc3MgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBDb2x1bW5QYWlyIGltcGxlbWVudHMgQ29tcGFyYWJsZTxDb2x1bW5QYWlyPiB7Ci0JCXByaXZhdGUgZmluYWwgQ29sdW1uIGJhc2VDb2x1bW47Ci0JCXByaXZhdGUgZmluYWwgQ29sdW1uIHJlZmVyZW5jZWRDb2x1bW47Ci0KLQkJQ29sdW1uUGFpcihDb2x1bW4gYmFzZUNvbHVtbiwgQ29sdW1uIHJlZmVyZW5jZWRDb2x1bW4pIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmJhc2VDb2x1bW4gPSBiYXNlQ29sdW1uOwotCQkJdGhpcy5yZWZlcmVuY2VkQ29sdW1uID0gcmVmZXJlbmNlZENvbHVtbjsKLQkJfQotCi0JCXB1YmxpYyBDb2x1bW4gZ2V0QmFzZUNvbHVtbigpIHsKLQkJCXJldHVybiB0aGlzLmJhc2VDb2x1bW47Ci0JCX0KLQotCQlwdWJsaWMgQ29sdW1uIGdldFJlZmVyZW5jZWRDb2x1bW4oKSB7Ci0JCQlyZXR1cm4gdGhpcy5yZWZlcmVuY2VkQ29sdW1uOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCBiYXNlQ29sdW1uLmdldE5hbWUoKSArICI9PiIgKyB0aGlzLnJlZmVyZW5jZWRDb2x1bW4uZ2V0TmFtZSgpKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgY29tcGFyZVRvKENvbHVtblBhaXIgY3ApIHsKLQkJCXJldHVybiBDb2xsYXRvci5nZXRJbnN0YW5jZSgpLmNvbXBhcmUodGhpcy5nZXRCYXNlQ29sdW1uKCkuZ2V0TmFtZSgpLCBjcC5nZXRCYXNlQ29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJfQotCi0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvSnB0RGJQbHVnaW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL0pwdERiUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkOWYyMTcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvSnB0RGJQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgSnB0RGJQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCXByaXZhdGUgQ29ubmVjdGlvblByb2ZpbGVSZXBvc2l0b3J5IGNvbm5lY3Rpb25Qcm9maWxlUmVwb3NpdG9yeTsKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKLQlwcml2YXRlIHN0YXRpYyBKcHREYlBsdWdpbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpwdERiUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBKcHREYlBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdXBvbiBwbHVnLWluIGFjdGl2YXRpb24KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZVJlcG9zaXRvcnkgPSBDb25uZWN0aW9uUHJvZmlsZVJlcG9zaXRvcnkuaW5zdGFuY2UoKTsKLSAgICAgICAgdGhpcy5jb25uZWN0aW9uUHJvZmlsZVJlcG9zaXRvcnkuaW5pdGlhbGl6ZUxpc3RlbmVycygpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBwbHVnLWluIGlzIHN0b3BwZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGVSZXBvc2l0b3J5LmRpc3Bvc2VMaXN0ZW5lcnMoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZVJlcG9zaXRvcnkgPSBudWxsOwotCQlwbHVnaW4gPSBudWxsOwotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQotCi0JcHVibGljIENvbm5lY3Rpb25Qcm9maWxlUmVwb3NpdG9yeSBnZXRDb25uZWN0aW9uUHJvZmlsZVJlcG9zaXRvcnkoKSB7Ci0JCXJldHVybiB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlUmVwb3NpdG9yeTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC9OdWxsQ29ubmVjdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvTnVsbENvbm5lY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA5NTYzMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC9OdWxsQ29ubmVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5DbGFzc1Rvb2xzOwotCi0vKioKLSAqICBOdWxsQ29ubmVjdGlvbgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTnVsbENvbm5lY3Rpb24gZXh0ZW5kcyBDb25uZWN0aW9uIHsKLQotCXByaXZhdGUgc3RhdGljIE51bGxDb25uZWN0aW9uIElOU1RBTkNFOwotCi0JLyoqCi0JICogc2luZ2xldG9uIHN1cHBvcnQKLQkgKi8KLQlzdGF0aWMgc3luY2hyb25pemVkIENvbm5lY3Rpb24gaW5zdGFuY2UoKSB7Ci0JCWlmKCBJTlNUQU5DRSA9PSBudWxsKSB7Ci0JCQlJTlNUQU5DRSA9IG5ldyBOdWxsQ29ubmVjdGlvbigpOwotCQl9Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQlwcml2YXRlIE51bGxDb25uZWN0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIENsYXNzVG9vbHMuc2hvcnRDbGFzc05hbWVGb3JPYmplY3QoIHRoaXMpOwotCX0KLQotCUBPdmVycmlkZQotCXZvaWQgZGF0YWJhc2VDaGFuZ2VkKCBEYXRhYmFzZSBkYXRhYmFzZSwgaW50IGV2ZW50VHlwZSkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCQotCUBPdmVycmlkZQotCSB2b2lkIHNjaGVtYUNoYW5nZWQoIFNjaGVtYSBzY2hlbWEsIERhdGFiYXNlIGRhdGFiYXNlLCBpbnQgZXZlbnRUeXBlKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JIHZvaWQgdGFibGVDaGFuZ2VkKCBUYWJsZSB0YWJsZSwgU2NoZW1hIHNjaGVtYSwgRGF0YWJhc2UgZGF0YWJhc2UsIGludCBldmVudFR5cGUpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc0Nvbm5lY3RlZCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0RmFjdG9yeUlkKCkgewotCQlyZXR1cm4gIiI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkQ29ubmVjdGlvbkxpc3RlbmVyKCBDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lciggQ29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC9OdWxsQ29ubmVjdGlvblByb2ZpbGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL051bGxDb25uZWN0aW9uUHJvZmlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWNkNWUwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL051bGxDb25uZWN0aW9uUHJvZmlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5kcml2ZXJzLkRyaXZlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ2xhc3NUb29sczsKLQotLyoqCi0gKiAgTnVsbENvbm5lY3Rpb25Qcm9maWxlCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBOdWxsQ29ubmVjdGlvblByb2ZpbGUgZXh0ZW5kcyBDb25uZWN0aW9uUHJvZmlsZSB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgTnVsbENvbm5lY3Rpb25Qcm9maWxlIElOU1RBTkNFOwotCi0JLyoqCi0JICogc2luZ2xldG9uIHN1cHBvcnQKLQkgKi8KLQlzdGF0aWMgc3luY2hyb25pemVkIENvbm5lY3Rpb25Qcm9maWxlIGluc3RhbmNlKCkgewotCQlpZiggSU5TVEFOQ0UgPT0gbnVsbCkgewotCQkJSU5TVEFOQ0UgPSBuZXcgTnVsbENvbm5lY3Rpb25Qcm9maWxlKCk7Ci0JCX0KLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCXByaXZhdGUgTnVsbENvbm5lY3Rpb25Qcm9maWxlKCkgewotCQlzdXBlciggbnVsbCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29ubmVjdGlvbiBidWlsZENvbm5lY3Rpb24oKSB7Ci0JCXJldHVybiBOdWxsQ29ubmVjdGlvbi5pbnN0YW5jZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBEYXRhYmFzZSBidWlsZERhdGFiYXNlKCkgewotCQlyZXR1cm4gTnVsbERhdGFiYXNlLmluc3RhbmNlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGNvbm5lY3QoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkaXNjb25uZWN0KCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCQotCUBPdmVycmlkZQotCXZvaWQgZGF0YWJhc2VDaGFuZ2VkKCBEYXRhYmFzZSBkYXRhYmFzZSwgaW50IGV2ZW50VHlwZSkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCQotCUBPdmVycmlkZQotCSB2b2lkIGNhdGFsb2dDaGFuZ2VkKCBDYXRhbG9nIGNhdGFsb2csIERhdGFiYXNlIGRhdGFiYXNlLCBpbnQgZXZlbnRUeXBlKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JIHZvaWQgc2NoZW1hQ2hhbmdlZCggU2NoZW1hIHNjaGVtYSwgRGF0YWJhc2UgZGF0YWJhc2UsIGludCBldmVudFR5cGUpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQkKLQlAT3ZlcnJpZGUKLQkgdm9pZCB0YWJsZUNoYW5nZWQoIFRhYmxlIHRhYmxlLCBTY2hlbWEgc2NoZW1hLCBEYXRhYmFzZSBkYXRhYmFzZSwgaW50IGV2ZW50VHlwZSkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLy8gKioqKioqKioqKiBxdWVyaWVzICoqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ29ubmVjdGlvbiBnZXRDb25uZWN0aW9uKCkgewotCQlyZXR1cm4gTnVsbENvbm5lY3Rpb24uaW5zdGFuY2UoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRGF0YWJhc2UgZ2V0RGF0YWJhc2UoKSB7Ci0JCXJldHVybiBOdWxsRGF0YWJhc2UuaW5zdGFuY2UoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gQ2xhc3NUb29scy5zaG9ydENsYXNzTmFtZUZvck9iamVjdCggdGhpcyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXREYXRhYmFzZU5hbWUoKSB7Ci0JCXJldHVybiAiIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldERhdGFiYXNlUHJvZHVjdCgpIHsKLQkJcmV0dXJuICIiOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YWJhc2VWZW5kb3IoKSB7Ci0JCXJldHVybiAiIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldERhdGFiYXNlVmVyc2lvbigpIHsKLQkJcmV0dXJuICIiOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VXNlck5hbWUoKSB7Ci0JCXJldHVybiAiIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFVzZXJQYXNzd29yZCgpIHsKLQkJcmV0dXJuICIiOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0RHJpdmVyQ2xhc3MoKSB7Ci0JCXJldHVybiAiIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFVybCgpIHsKLQkJcmV0dXJuICIiOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldEluc3RhbmNlSWQoKSB7Ci0JCXJldHVybiAiIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFByb3ZpZGVySWQoKSB7Ci0JCXJldHVybiAiIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldERyaXZlckRlZmluaXRpb25JZCgpIHsKLQkJcmV0dXJuICIiOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0RHJpdmVySmFyTGlzdCgpIHsKLQkJcmV0dXJuICIiOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc0Nvbm5lY3RlZCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlib29sZWFuIHdyYXBzKCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LklDb25uZWN0aW9uUHJvZmlsZSBkdHBQcm9maWxlKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBsaXN0ZW5lcnMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkUHJvZmlsZUxpc3RlbmVyKCBQcm9maWxlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJlbW92ZVByb2ZpbGVMaXN0ZW5lciggUHJvZmlsZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkQ29ubmVjdGlvbkxpc3RlbmVyKCBDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lciggQ29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL051bGxEYXRhYmFzZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvTnVsbERhdGFiYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhMzE2YjguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvTnVsbERhdGFiYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5DbGFzc1Rvb2xzOwotCi0vKioKLSAqICBOdWxsRGF0YWJhc2UKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE51bGxEYXRhYmFzZSBleHRlbmRzIERhdGFiYXNlIHsKLQotCXByaXZhdGUgc3RhdGljIE51bGxEYXRhYmFzZSBJTlNUQU5DRTsKLQotCS8qKgotCSAqIHNpbmdsZXRvbiBzdXBwb3J0Ci0JICovCi0Jc3RhdGljIHN5bmNocm9uaXplZCBEYXRhYmFzZSBpbnN0YW5jZSgpIHsKLQkJaWYoIElOU1RBTkNFID09IG51bGwpIHsKLQkJCUlOU1RBTkNFID0gbmV3IE51bGxEYXRhYmFzZSgpOwotCQl9Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQlwcml2YXRlIE51bGxEYXRhYmFzZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQl2b2lkIGNhdGFsb2dDaGFuZ2VkKCBDYXRhbG9nIGNhdGFsb2csIGludCBldmVudFR5cGUpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCUBPdmVycmlkZQotCXZvaWQgc2NoZW1hQ2hhbmdlZCggU2NoZW1hIHNjaGVtYSwgaW50IGV2ZW50VHlwZSkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JQE92ZXJyaWRlCi0Jdm9pZCB0YWJsZUNoYW5nZWQoIFRhYmxlIHRhYmxlLCAgU2NoZW1hIHNjaGVtYSxpbnQgZXZlbnRUeXBlKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0JCi0JQE92ZXJyaWRlCi0Jdm9pZCByZWZyZXNoKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29ubmVjdGlvbklzT25saW5lKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLy8gKioqKioqKioqKiBxdWVyaWVzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIENsYXNzVG9vbHMuc2hvcnRDbGFzc05hbWVGb3JPYmplY3QoIHRoaXMpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VmVuZG9yKCkgewotCQlyZXR1cm4gdGhpcy5nZXROYW1lKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKLQkJcmV0dXJuICIiOwotCX0KLQotCS8vICoqKioqIGNhdGFsb2dzCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0NhdGFsb2dzKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0Q2F0YWxvZ05hbWUoKSB7Ci0JCXJldHVybiAiIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlTZXQ8Q2F0YWxvZz4gZ2V0Q2F0YWxvZ3MoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOwotCX0KLQotCS8vICoqKioqIHNjaGVtYXRhCi0JCi0JQE92ZXJyaWRlCi0JU2V0PFNjaGVtYT4gZ2V0U2NoZW1hdGEoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL1Byb2ZpbGVMaXN0ZW5lci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvUHJvZmlsZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3N2IzOGMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvUHJvZmlsZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbDsKLQotLyoqCi0gKiBQcm9maWxlTGlzdGVuZXIgaW50ZWdyYXRlIHRoIERUUCBJUHJvZmlsZUxpc3RlbmVyIGxpc3RlbmVyLgotICogVGhpcyBjbGFzcyBwdXJwb3NlIGlzIHRvIGRlY291cGxlIGZyb20gdGhlIERUUCBsaXN0ZW5lcnMgYnkgYWNjZXB0aW5nIHdyYXBwZXJzIGFzIHBhcmFtZXRlci4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LklQcm9maWxlTGlzdGVuZXIKLSAqLwotcHVibGljIGludGVyZmFjZSBQcm9maWxlTGlzdGVuZXIgewotCS8qKgotCSAqIFRoZSBzcGVjaWZpZWQgcHJvZmlsZSBoYXMgYmVlbiBhZGRlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwcm9maWxlQWRkZWQoIENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpOwotCi0JLyoqCi0JICogVGhlIHNwZWNpZmllZCBwcm9maWxlIGhhcyBiZWVuIGRlbGV0ZWQuCi0JICovCi0JcHVibGljIHZvaWQgcHJvZmlsZURlbGV0ZWQoIFN0cmluZyBwcm9maWxlTmFtZSk7Ci0KLQkvKioKLQkgKiBUaGUgc3BlY2lmaWVkIHByb2ZpbGUgaGFzIGJlZW4gbW9kaWZpZWQuICBNb2RpZmljYXRpb24gaW5jbHVkZXMKLQkgKiBjaGFuZ2VzIHRvIGFueSBwcm9wZXJ0aWVzLCB0aGUgbmFtZSwgYXV0by1jb25uZWN0IGZsYWcsIGV0Yy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwcm9maWxlQ2hhbmdlZCggQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL1NjaGVtYS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvU2NoZW1hLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllZjJjN2YuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvU2NoZW1hLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnRleHQuQ29sbGF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LnNxbS5jb3JlLnJ0ZS5JQ2F0YWxvZ09iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LnNxbS5jb3JlLnJ0ZS5JQ2F0YWxvZ09iamVjdExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOwotCi0vKioKLSAqICBXcmFwIGEgRFRQIFNjaGVtYQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU2NoZW1hIGV4dGVuZHMgRFRQV3JhcHBlciBpbXBsZW1lbnRzIENvbXBhcmFibGU8U2NoZW1hPiB7Ci0JZmluYWwgRGF0YWJhc2UgZGF0YWJhc2U7Ci0JZmluYWwgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNjaGVtYSBkdHBTY2hlbWE7Ci0JcHJpdmF0ZSBJQ2F0YWxvZ09iamVjdExpc3RlbmVyIHNjaGVtYUxpc3RlbmVyOwotCQotCXByaXZhdGUgU2V0PFRhYmxlPiB0YWJsZXM7ICAvLyBsYXp5LWluaXRpYWxpemVkCi0JcHJpdmF0ZSBTZXQ8U2VxdWVuY2U+IHNlcXVlbmNlczsgIC8vIGxhenktaW5pdGlhbGl6ZWQKLQkKLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCVNjaGVtYSggRGF0YWJhc2UgZGF0YWJhc2UsIG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWEgZHRwU2NoZW1hKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZGF0YWJhc2UgPSBkYXRhYmFzZTsKLQkJdGhpcy5kdHBTY2hlbWEgPSBkdHBTY2hlbWE7Ci0JCXRoaXMuaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCWlmKCB0aGlzLmNvbm5lY3Rpb25Jc09ubGluZSgpKSB7Ci0JCQl0aGlzLnNjaGVtYUxpc3RlbmVyID0gdGhpcy5idWlsZFNjaGVtYUxpc3RlbmVyKCk7Ci0JCQl0aGlzLmFkZENhdGFsb2dPYmplY3RMaXN0ZW5lcigoIElDYXRhbG9nT2JqZWN0KSB0aGlzLmR0cFNjaGVtYSwgdGhpcy5zY2hlbWFMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29ubmVjdGlvbklzT25saW5lKCkgewotCQlyZXR1cm4gdGhpcy5kYXRhYmFzZS5jb25uZWN0aW9uSXNPbmxpbmUoKTsKLQl9Ci0KLQlwcml2YXRlIElDYXRhbG9nT2JqZWN0TGlzdGVuZXIgYnVpbGRTY2hlbWFMaXN0ZW5lcigpIHsKLSAgICAgICByZXR1cm4gbmV3IElDYXRhbG9nT2JqZWN0TGlzdGVuZXIoKSB7Ci0gICAgCSAgICBwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKCBmaW5hbCBJQ2F0YWxvZ09iamVjdCBzY2hlbWEsIGZpbmFsIGludCBldmVudFR5cGUpIHsgICAgIAotICAgIAkJCWlmKCBzY2hlbWEgPT0gU2NoZW1hLnRoaXMuZHRwU2NoZW1hKSB7CQotICAgIAkJCQlTY2hlbWEudGhpcy5yZWZyZXNoKCk7Ci0gICAgCQkJCVNjaGVtYS50aGlzLmRhdGFiYXNlLnNjaGVtYUNoYW5nZWQoIFNjaGVtYS50aGlzLCBldmVudFR5cGUpOwotICAgIAkJCX0KLSAgICAJICAgIH0KLSAgICAgICAgfTsKLSAgICB9Ci0KLQl2b2lkIHJlZnJlc2goKSB7Ci0JCXRoaXMuZGlzcG9zZVRhYmxlcygpOwotCQl0aGlzLmRpc3Bvc2VTZXF1ZW5jZXMoKTsKLQkJCi0JCXRoaXMudGFibGVzID0gbnVsbDsKLQkJdGhpcy5zZXF1ZW5jZXMgPSBudWxsOwotCX0KLQotCXZvaWQgdGFibGVDaGFuZ2VkKCBUYWJsZSB0YWJsZSwgaW50IGV2ZW50VHlwZSkgewotCQl0aGlzLmRhdGFiYXNlLnRhYmxlQ2hhbmdlZCggdGFibGUsIHRoaXMsIGV2ZW50VHlwZSk7Ci0JfQotCQotCXByb3RlY3RlZCBUYWJsZSB3cmFwKCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuVGFibGUgdGFibGUpIHsKLQkJcmV0dXJuIG5ldyBUYWJsZSggdGhpcywgdGFibGUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU2VxdWVuY2Ugd3JhcCggIG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TZXF1ZW5jZSBzZXF1ZW5jZSkgewotCQlyZXR1cm4gbmV3IFNlcXVlbmNlKCB0aGlzLCBzZXF1ZW5jZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzcG9zZSgpIHsKLQkJdGhpcy5yZW1vdmVDYXRhbG9nT2JqZWN0TGlzdGVuZXIoKCBJQ2F0YWxvZ09iamVjdCkgdGhpcy5kdHBTY2hlbWEsIHRoaXMuc2NoZW1hTGlzdGVuZXIpOwotCi0JCXRoaXMuZGlzcG9zZVRhYmxlcygpOwotCQl0aGlzLmRpc3Bvc2VTZXF1ZW5jZXMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGlzcG9zZVRhYmxlcygpIHsKLQkJaWYoIHRoaXMudGFibGVzICE9IG51bGwpIHsKLQkJCWZvciggSXRlcmF0b3I8VGFibGU+IHN0cmVhbSA9IHRoaXMudGFibGVzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJCXN0cmVhbS5uZXh0KCkuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRpc3Bvc2VTZXF1ZW5jZXMoKSB7Ci0JCWlmKCB0aGlzLnNlcXVlbmNlcyAhPSBudWxsKSB7Ci0JCQlmb3IoIEl0ZXJhdG9yPFNlcXVlbmNlPiBzdHJlYW0gPSB0aGlzLnNlcXVlbmNlcygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCQlzdHJlYW0ubmV4dCgpLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5kdHBTY2hlbWEuZ2V0TmFtZSgpOwotCX0KLQkKLQlib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGF0YWJhc2UuaXNDYXNlU2Vuc2l0aXZlKCk7Ci0JfQotCi0JQ29sdW1uIGNvbHVtbiggb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLkNvbHVtbiBkdHBDb2x1bW4pIHsKLQkJcmV0dXJuIHRoaXMuZGF0YWJhc2UuY29sdW1uKGR0cENvbHVtbik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHRhYmxlcyAqKioqKioqKioqCi0KLQlwcml2YXRlIHN5bmNocm9uaXplZCBDb2xsZWN0aW9uPFRhYmxlPiBnZXRUYWJsZXMoKSB7Ci0JCWlmKCB0aGlzLnRhYmxlcyA9PSBudWxsKSB7Ci0JCQl0aGlzLnRhYmxlcyA9IHRoaXMuYnVpbGRUYWJsZXMoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy50YWJsZXM7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5UYWJsZT4gZHRwVGFibGVzKCkgewotCQlyZXR1cm4gdGhpcy5kdHBTY2hlbWEuZ2V0VGFibGVzKCk7Ci0JfQotCi0JcHJpdmF0ZSBTZXQ8VGFibGU+IGJ1aWxkVGFibGVzKCkgewotCQlDb2xsZWN0aW9uPG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5UYWJsZT4gZHRwVGFibGVzID0gdGhpcy5kdHBUYWJsZXMoKTsKLQkJU2V0PFRhYmxlPiByZXN1bHQgPSBuZXcgSGFzaFNldDxUYWJsZT4oIGR0cFRhYmxlcy5zaXplKCkpOwotCQlmb3IgKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5UYWJsZSBkdHBUYWJsZSA6IGR0cFRhYmxlcykgewotCQkJcmVzdWx0LmFkZCggdGhpcy53cmFwKGR0cFRhYmxlKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIEl0ZXJhdG9yPFRhYmxlPiB0YWJsZXMoKSB7Ci0JCXJldHVybiB0aGlzLmdldFRhYmxlcygpLml0ZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIGludCB0YWJsZXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5nZXRUYWJsZXMoKS5zaXplKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdGFibGVzQ29udGFpbnMoIENvbHVtbiBjb2x1bW4pIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VGFibGVzKCkuY29udGFpbnMoIGNvbHVtbik7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gdGFibGVOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPFRhYmxlLCBTdHJpbmc+KCB0aGlzLnRhYmxlcygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKCBUYWJsZSB0YWJsZSkgewotCQkJCSByZXR1cm4gdGFibGUuZ2V0TmFtZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zVGFibGVOYW1lZCggU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIHRoaXMudGFibGVOYW1lZCggbmFtZSkgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgVGFibGUgdGFibGVOYW1lZCggU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuaXNDYXNlU2Vuc2l0aXZlKCkgPyB0aGlzLnRhYmxlTmFtZWRJbnRlcm5hbCggbmFtZSkgOiB0aGlzLnRhYmxlTmFtZWRJZ25vcmVDYXNlKCBuYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUYWJsZSB0YWJsZU5hbWVkSW50ZXJuYWwoIFN0cmluZyBuYW1lKSB7Ci0JCWZvciggSXRlcmF0b3I8VGFibGU+IHN0cmVhbSA9IHRoaXMudGFibGVzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJVGFibGUgdGFibGUgPSBzdHJlYW0ubmV4dCgpOwotCQkJaWYoIHRhYmxlLmdldE5hbWUoKS5lcXVhbHMoIG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHRhYmxlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIFRhYmxlIHRhYmxlTmFtZWRJZ25vcmVDYXNlKCBTdHJpbmcgbmFtZSkgewotCQlmb3IoIEl0ZXJhdG9yPFRhYmxlPiBzdHJlYW0gPSB0aGlzLnRhYmxlcygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCVRhYmxlIHRhYmxlID0gc3RyZWFtLm5leHQoKTsKLQkJCWlmKCBTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWxJZ25vcmVDYXNlKCB0YWJsZS5nZXROYW1lKCksIG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHRhYmxlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIHJldHVybiB0aGUgdGFibGUgZm9yIHRoZSBzcGVjaWZpZWQgZHRwIHRhYmxlCi0JICovCi0JVGFibGUgdGFibGUoIG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5UYWJsZSBkdHBUYWJsZSkgewotCQlpZiggZHRwVGFibGUuZ2V0U2NoZW1hKCkgIT0gdGhpcy5kdHBTY2hlbWEpIHsKLQkJCXJldHVybiB0aGlzLmRhdGFiYXNlLnRhYmxlKCBkdHBUYWJsZSk7Ci0JCX0KLQkJZm9yKCBJdGVyYXRvcjxUYWJsZT4gc3RyZWFtID0gdGhpcy50YWJsZXMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlUYWJsZSB0YWJsZSA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlpZiggdGFibGUud3JhcHMoIGR0cFRhYmxlKSkgewotCQkJCXJldHVybiB0YWJsZTsKLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAiaW52YWxpZCBEVFAgdGFibGU6ICIgKyBkdHBUYWJsZSk7Ci0JfQotCi0JLy8gKioqKiogc2VxdWVuY2VzCi0KLQlwcml2YXRlIHN5bmNocm9uaXplZCBDb2xsZWN0aW9uPFNlcXVlbmNlPiBnZXRTZXF1ZW5jZXMoKSB7Ci0JCWlmKCB0aGlzLnNlcXVlbmNlcyA9PSBudWxsKSB7Ci0JCQl0aGlzLnNlcXVlbmNlcyA9IHRoaXMuYnVpbGRTZXF1ZW5jZXMoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5zZXF1ZW5jZXM7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TZXF1ZW5jZT4gZHRwU2VxdWVuY2VzKCkgewotCQlyZXR1cm4gdGhpcy5kdHBTY2hlbWEuZ2V0U2VxdWVuY2VzKCk7Ci0JfQotCi0JcHJpdmF0ZSBTZXQ8U2VxdWVuY2U+IGJ1aWxkU2VxdWVuY2VzKCkgewotCQlDb2xsZWN0aW9uPG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TZXF1ZW5jZT4gZHRwU2VxdWVuY2VzID0gdGhpcy5kdHBTZXF1ZW5jZXMoKTsKLQkJU2V0PFNlcXVlbmNlPiByZXN1bHQgPSBuZXcgSGFzaFNldDxTZXF1ZW5jZT4oIGR0cFNlcXVlbmNlcy5zaXplKCkpOwotCQlmb3IgKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TZXF1ZW5jZSBkdHBTZXF1ZW5jZSA6IGR0cFNlcXVlbmNlcykgewotCQkJcmVzdWx0LmFkZCggdGhpcy53cmFwKGR0cFNlcXVlbmNlKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8U2VxdWVuY2U+IHNlcXVlbmNlcygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0U2VxdWVuY2VzKCkuaXRlcmF0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IHNlcXVlbmNlc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmdldFNlcXVlbmNlcygpLnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzZXF1ZW5jZXNDb250YWlucyggQ29sdW1uIGNvbHVtbikgewotCQlyZXR1cm4gdGhpcy5nZXRTZXF1ZW5jZXMoKS5jb250YWlucyggY29sdW1uKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBzZXF1ZW5jZU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8U2VxdWVuY2UsIFN0cmluZz4odGhpcy5zZXF1ZW5jZXMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybSggU2VxdWVuY2Ugc2VxdWVuY2UpIHsKLQkJCQkgcmV0dXJuIHNlcXVlbmNlLmdldE5hbWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc1NlcXVlbmNlTmFtZWQoIFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiB0aGlzLnNlcXVlbmNlTmFtZWQoIG5hbWUpICE9IG51bGw7Ci0JfQotCi0JcHVibGljIFNlcXVlbmNlIHNlcXVlbmNlTmFtZWQoIFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiB0aGlzLmlzQ2FzZVNlbnNpdGl2ZSgpID8gdGhpcy5zZXF1ZW5jZU5hbWVkSW50ZXJuYWwoIG5hbWUpIDogdGhpcy5zZXF1ZW5jZU5hbWVkSWdub3JlQ2FzZSggbmFtZSk7Ci0JfQotCQotCXByaXZhdGUgU2VxdWVuY2Ugc2VxdWVuY2VOYW1lZEludGVybmFsKCBTdHJpbmcgbmFtZSkgewotCQlmb3IoIEl0ZXJhdG9yPFNlcXVlbmNlPiBzdHJlYW0gPSB0aGlzLnNlcXVlbmNlcygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCVNlcXVlbmNlIHNlcXVlbmNlID0gc3RyZWFtLm5leHQoKTsKLQkJCWlmKCBzZXF1ZW5jZS5nZXROYW1lKCkuZXF1YWxzKCBuYW1lKSkgewotCQkJCXJldHVybiBzZXF1ZW5jZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIFNlcXVlbmNlIHNlcXVlbmNlTmFtZWRJZ25vcmVDYXNlKCBTdHJpbmcgbmFtZSkgewotCQlmb3IoIEl0ZXJhdG9yPFNlcXVlbmNlPiBzdHJlYW0gPSB0aGlzLnNlcXVlbmNlcygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCVNlcXVlbmNlIHNlcXVlbmNlID0gc3RyZWFtLm5leHQoKTsKLQkJCWlmKCBzZXF1ZW5jZS5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSggbmFtZSkpIHsKLQkJCQlyZXR1cm4gc2VxdWVuY2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCWJvb2xlYW4gd3JhcHMoIG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWEgc2NoZW1hKSB7Ci0JCXJldHVybiB0aGlzLmR0cFNjaGVtYSA9PSBzY2hlbWE7Ci0JfQotCi0JLy8gKioqKioqKioqKiBDb21wYXJhYmxlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBpbnQgY29tcGFyZVRvKCBTY2hlbWEgc2NoZW1hKSB7Ci0JCXJldHVybiBDb2xsYXRvci5nZXRJbnN0YW5jZSgpLmNvbXBhcmUoIHRoaXMuZ2V0TmFtZSgpLCBzY2hlbWEuZ2V0TmFtZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL1NlcXVlbmNlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi9pbnRlcm5hbC9TZXF1ZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2I2OGE0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL1NlcXVlbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudGV4dC5Db2xsYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuc3FtLmNvcmUucnRlLklDYXRhbG9nT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuc3FtLmNvcmUucnRlLklDYXRhbG9nT2JqZWN0TGlzdGVuZXI7Ci0KLS8qKgotICogIFdyYXAgYSBEVFAgU2VxdWVuY2UKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNlcXVlbmNlIGV4dGVuZHMgRFRQV3JhcHBlciBpbXBsZW1lbnRzIENvbXBhcmFibGU8U2VxdWVuY2U+IHsKLQlwcml2YXRlIGZpbmFsIFNjaGVtYSBzY2hlbWE7Ci0JcHJpdmF0ZSBmaW5hbCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuU2VxdWVuY2UgZHRwU2VxdWVuY2U7Ci0JcHJpdmF0ZSBJQ2F0YWxvZ09iamVjdExpc3RlbmVyIHNlcXVlbmNlTGlzdGVuZXI7Ci0KLQlTZXF1ZW5jZSggU2NoZW1hIHNjaGVtYSwgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNlcXVlbmNlIGR0cFNlcXVlbmNlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuc2NoZW1hID0gc2NoZW1hOwotCQl0aGlzLmR0cFNlcXVlbmNlID0gZHRwU2VxdWVuY2U7Ci0JCXRoaXMuaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCWlmKCB0aGlzLmNvbm5lY3Rpb25Jc09ubGluZSgpKSB7Ci0JCQl0aGlzLnNlcXVlbmNlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkU2VxdWVuY2VMaXN0ZW5lcigpOwotCQkJdGhpcy5hZGRDYXRhbG9nT2JqZWN0TGlzdGVuZXIoKCBJQ2F0YWxvZ09iamVjdCkgdGhpcy5kdHBTZXF1ZW5jZSwgdGhpcy5zZXF1ZW5jZUxpc3RlbmVyKTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb25uZWN0aW9uSXNPbmxpbmUoKSB7Ci0JCXJldHVybiB0aGlzLnNjaGVtYS5jb25uZWN0aW9uSXNPbmxpbmUoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ2F0YWxvZ09iamVjdExpc3RlbmVyIGJ1aWxkU2VxdWVuY2VMaXN0ZW5lcigpIHsKLSAgICAgICByZXR1cm4gbmV3IElDYXRhbG9nT2JqZWN0TGlzdGVuZXIoKSB7Ci0gICAgCSAgICBwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKCBmaW5hbCBJQ2F0YWxvZ09iamVjdCBzZXF1ZW5jZSwgZmluYWwgaW50IGV2ZW50VHlwZSkgewotLy8JCQkJVE9ETwotLy8gICAgCQkJaWYoIHNlcXVlbmNlID09IFNlcXVlbmNlLnRoaXMuZHRwU2VxdWVuY2UpIHsJICAgIAkgICAgCQotLy8gICAgCQkJCVNlcXVlbmNlLnRoaXMuc2NoZW1hLnNlcXVlbmNlQ2hhbmdlZCggU2VxdWVuY2UudGhpcywgZXZlbnRUeXBlKTsKLS8vICAgIAkJCX0KLSAgICAJICAgIH0KLSAgICAgICAgfTsKLSAgICB9Ci0KLQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNwb3NlKCkgewotCQkKLQkJdGhpcy5yZW1vdmVDYXRhbG9nT2JqZWN0TGlzdGVuZXIoKCBJQ2F0YWxvZ09iamVjdCkgdGhpcy5kdHBTZXF1ZW5jZSwgdGhpcy5zZXF1ZW5jZUxpc3RlbmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmR0cFNlcXVlbmNlLmdldE5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGNvbXBhcmVUbyggU2VxdWVuY2Ugc2VxdWVuY2UpIHsKLQkJcmV0dXJuIENvbGxhdG9yLmdldEluc3RhbmNlKCkuY29tcGFyZSggdGhpcy5nZXROYW1lKCksIHNlcXVlbmNlLmdldE5hbWUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvVGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL2ludGVybmFsL1RhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNDliNzIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvaW50ZXJuYWwvVGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudGV4dC5Db2xsYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LnNxbS5jb3JlLnJ0ZS5JQ2F0YWxvZ09iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LnNxbS5jb3JlLnJ0ZS5JQ2F0YWxvZ09iamVjdExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLmNvbnN0cmFpbnRzLlByaW1hcnlLZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLkJhc2VUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuTmFtZVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOwotCi0vKioKLSAqICBXcmFwIGEgRFRQIFRhYmxlCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBUYWJsZSBleHRlbmRzIERUUFdyYXBwZXIgaW1wbGVtZW50cyBDb21wYXJhYmxlPFRhYmxlPiB7Ci0JZmluYWwgU2NoZW1hIHNjaGVtYTsKLQlmaW5hbCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuVGFibGUgZHRwVGFibGU7Ci0JcHJpdmF0ZSBJQ2F0YWxvZ09iamVjdExpc3RlbmVyIHRhYmxlTGlzdGVuZXI7Ci0JCi0JcHJpdmF0ZSBTZXQ8Q29sdW1uPiBjb2x1bW5zOyAgLy8gbGF6eS1pbml0aWFsaXplZAotCXByaXZhdGUgU2V0PENvbHVtbj4gcHJpbWFyeUtleUNvbHVtbnM7ICAvLyBsYXp5LWluaXRpYWxpemVkCi0JcHJpdmF0ZSBTZXQ8Rm9yZWlnbktleT4gZm9yZWlnbktleXM7ICAvLyBsYXp5LWluaXRpYWxpemVkCi0JcHJpdmF0ZSBTZXQ8Q29sdW1uPiBmb3JlaWduS2V5Q29sdW1uczsgIC8vIGxhenktaW5pdGlhbGl6ZWQKLQkKLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQlUYWJsZShTY2hlbWEgc2NoZW1hLCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuVGFibGUgZHRwVGFibGUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5zY2hlbWEgPSBzY2hlbWE7Ci0JCXRoaXMuZHRwVGFibGUgPSBkdHBUYWJsZTsKLQkJdGhpcy5pbml0aWFsaXplKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgewotCQlpZiggdGhpcy5jb25uZWN0aW9uSXNPbmxpbmUoKSkgewotCQkJdGhpcy50YWJsZUxpc3RlbmVyID0gdGhpcy5idWlsZFRhYmxlTGlzdGVuZXIoKTsKLQkJCXRoaXMuYWRkQ2F0YWxvZ09iamVjdExpc3RlbmVyKCggSUNhdGFsb2dPYmplY3QpIHRoaXMuZHRwVGFibGUsIHRoaXMudGFibGVMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29ubmVjdGlvbklzT25saW5lKCkgewotCQlyZXR1cm4gdGhpcy5zY2hlbWEuY29ubmVjdGlvbklzT25saW5lKCk7Ci0JfQotCQotCXByaXZhdGUgSUNhdGFsb2dPYmplY3RMaXN0ZW5lciBidWlsZFRhYmxlTGlzdGVuZXIoKSB7Ci0gICAgICAgcmV0dXJuIG5ldyBJQ2F0YWxvZ09iamVjdExpc3RlbmVyKCkgewotICAgIAkgICAgcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZCggZmluYWwgSUNhdGFsb2dPYmplY3QgdGFibGUsIGZpbmFsIGludCBldmVudFR5cGUpIHsgICAgIAotICAgIAkJCWlmKCB0YWJsZSA9PSBUYWJsZS50aGlzLmR0cFRhYmxlKSB7CSAgICAJICAgIAkKLSAgICAJCQkJVGFibGUudGhpcy5yZWZyZXNoKCk7Ci0JICAgIAkJCVRhYmxlLnRoaXMuc2NoZW1hLnRhYmxlQ2hhbmdlZCggVGFibGUudGhpcywgZXZlbnRUeXBlKTsKLSAgICAJCQl9Ci0gICAgCSAgICB9Ci0gICAgICAgIH07Ci0gICAgfQotCi0gICAgdm9pZCByZWZyZXNoKCkgewotCQl0aGlzLmRpc3Bvc2VDb2x1bW5zKCk7Ci0JCQotICAgIAl0aGlzLmNvbHVtbnMgPSBudWxsOwotICAgIAl0aGlzLnByaW1hcnlLZXlDb2x1bW5zID0gbnVsbDsKLSAgICAJdGhpcy5mb3JlaWduS2V5cyA9IG51bGw7Ci0gICAgCXRoaXMuZm9yZWlnbktleUNvbHVtbnMgPSBudWxsOwotICAgIH0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXRoaXMucmVtb3ZlQ2F0YWxvZ09iamVjdExpc3RlbmVyKCggSUNhdGFsb2dPYmplY3QpIHRoaXMuZHRwVGFibGUsIHRoaXMudGFibGVMaXN0ZW5lcik7Ci0JCQotCQl0aGlzLmRpc3Bvc2VDb2x1bW5zKCk7Ci0JCXRoaXMuZGlzcG9zZUZvcmVpZ25LZXkoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGlzcG9zZUNvbHVtbnMoKSB7Ci0JCWlmKCB0aGlzLmNvbHVtbnMgIT0gbnVsbCkgewotCQkJZm9yKCBJdGVyYXRvcjxDb2x1bW4+IHN0cmVhbSA9IHRoaXMuY29sdW1ucygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCQlzdHJlYW0ubmV4dCgpLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBkaXNwb3NlRm9yZWlnbktleSgpIHsKLQkJaWYoIHRoaXMuZm9yZWlnbktleXMgIT0gbnVsbCkgewotCQkJZm9yKCBJdGVyYXRvcjxGb3JlaWduS2V5PiBzdHJlYW0gPSB0aGlzLmZvcmVpZ25LZXlzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJCXN0cmVhbS5uZXh0KCkuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JLy8gKioqKioqKioqKiBxdWVyaWVzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZHRwVGFibGUuZ2V0TmFtZSgpOwotCX0KLQkKLQlib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc2NoZW1hLmlzQ2FzZVNlbnNpdGl2ZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgc2hvcnRKYXZhQ2xhc3NOYW1lKCkgewotCQlTdHJpbmcgak5hbWUgPSB0aGlzLmdldE5hbWUoKTsKLQkJaWYgKCAhIHRoaXMuaXNDYXNlU2Vuc2l0aXZlKCkpIHsKLQkJCWpOYW1lID0gU3RyaW5nVG9vbHMuY2FwaXRhbGl6ZShqTmFtZS50b0xvd2VyQ2FzZSgpKTsKLQkJfQotCQlyZXR1cm4gTmFtZVRvb2xzLmNvbnZlcnRUb0phdmFJZGVudGlmaWVyKGpOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBtYXRjaGVzU2hvcnRKYXZhQ2xhc3NOYW1lKFN0cmluZyBzaG9ydEphdmFDbGFzc05hbWUpIHsKLQkJcmV0dXJuIHRoaXMuaXNDYXNlU2Vuc2l0aXZlKCkgPwotCQkJdGhpcy5nZXROYW1lKCkuZXF1YWxzKHNob3J0SmF2YUNsYXNzTmFtZSkKLQkJOgotCQkJdGhpcy5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShzaG9ydEphdmFDbGFzc05hbWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgamF2YUZpZWxkTmFtZSgpIHsKLQkJU3RyaW5nIGpOYW1lID0gdGhpcy5nZXROYW1lKCk7Ci0JCWlmICggISB0aGlzLmlzQ2FzZVNlbnNpdGl2ZSgpKSB7Ci0JCQlqTmFtZSA9IGpOYW1lLnRvTG93ZXJDYXNlKCk7Ci0JCX0KLQkJcmV0dXJuIE5hbWVUb29scy5jb252ZXJ0VG9KYXZhSWRlbnRpZmllcihqTmFtZSk7Ci0JfQotCi0JYm9vbGVhbiB3cmFwcyhvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuVGFibGUgdGFibGUpIHsKLQkJcmV0dXJuIHRoaXMuZHRwVGFibGUgPT0gdGFibGU7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJuIHRoZSB0YWJsZSBmb3IgdGhlIHNwZWNpZmllZCBEVFAgdGFibGUKLQkgKi8KLQlUYWJsZSB0YWJsZShvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuVGFibGUgdGFibGUpIHsKLQkJcmV0dXJuIHRoaXMuc2NoZW1hLnRhYmxlKHRhYmxlKTsKLQl9Ci0KLQkvLyAqKioqKiBjb2x1bW5zCi0KLQlwcml2YXRlIHN5bmNocm9uaXplZCBTZXQ8Q29sdW1uPiBnZXRDb2x1bW5zKCkgewotCQlpZiAodGhpcy5jb2x1bW5zID09IG51bGwpIHsKLQkJCXRoaXMuY29sdW1ucyA9IHRoaXMuYnVpbGRDb2x1bW5zKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuY29sdW1uczsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIENvbGxlY3Rpb248b3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLkNvbHVtbj4gZHRwQ29sdW1ucygpIHsKLQkJcmV0dXJuIHRoaXMuZHRwVGFibGUuZ2V0Q29sdW1ucygpOwotCX0KLQotCXByaXZhdGUgU2V0PENvbHVtbj4gYnVpbGRDb2x1bW5zKCkgewotCQlDb2xsZWN0aW9uPG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5Db2x1bW4+IGR0cENvbHVtbnMgPSB0aGlzLmR0cENvbHVtbnMoKTsKLQkJU2V0PENvbHVtbj4gcmVzdWx0ID0gbmV3IEhhc2hTZXQ8Q29sdW1uPihkdHBDb2x1bW5zLnNpemUoKSk7Ci0JCWZvciAob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLkNvbHVtbiBjIDogZHRwQ29sdW1ucykgewotCQkJcmVzdWx0LmFkZChuZXcgQ29sdW1uKHRoaXMsIGMpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxDb2x1bW4+IGNvbHVtbnMoKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbHVtbnMoKS5pdGVyYXRvcigpOwotCX0KLQotCXB1YmxpYyBpbnQgY29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbHVtbnMoKS5zaXplKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29sdW1uc0NvbnRhaW5zKENvbHVtbiBjb2x1bW4pIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29sdW1ucygpLmNvbnRhaW5zKGNvbHVtbik7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gY29sdW1uTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxDb2x1bW4sIFN0cmluZz4odGhpcy5jb2x1bW5zKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQ29sdW1uIG5leHQpIHsKLQkJCQkgcmV0dXJuIG5leHQuZ2V0TmFtZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zQ29sdW1uTmFtZWQoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuY29sdW1uTmFtZWQobmFtZSkgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQ29sdW1uIGNvbHVtbk5hbWVkKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiB0aGlzLmlzQ2FzZVNlbnNpdGl2ZSgpID8gdGhpcy5jb2x1bW5OYW1lZEludGVybmFsKG5hbWUpIDogdGhpcy5jb2x1bW5OYW1lZElnbm9yZUNhc2UobmFtZSk7Ci0JfQotCQotCXByaXZhdGUgQ29sdW1uIGNvbHVtbk5hbWVkSW50ZXJuYWwoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChJdGVyYXRvcjxDb2x1bW4+IHN0cmVhbSA9IHRoaXMuY29sdW1ucygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCUNvbHVtbiBjb2x1bW4gPSBzdHJlYW0ubmV4dCgpOwotCQkJaWYgKGNvbHVtbi5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIGNvbHVtbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIENvbHVtbiBjb2x1bW5OYW1lZElnbm9yZUNhc2UoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChJdGVyYXRvcjxDb2x1bW4+IHN0cmVhbSA9IHRoaXMuY29sdW1ucygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCUNvbHVtbiBjb2x1bW4gPSBzdHJlYW0ubmV4dCgpOwotCQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbElnbm9yZUNhc2UoY29sdW1uLmdldE5hbWUoKSwgbmFtZSkpIHsKLQkJCQlyZXR1cm4gY29sdW1uOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiByZXR1cm4gdGhlIGNvbHVtbiBmb3IgdGhlIHNwZWNpZmllZCBkdHAgY29sdW1uCi0JICovCi0JQ29sdW1uIGNvbHVtbihvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuQ29sdW1uIGR0cENvbHVtbikgewotCQlpZiAoZHRwQ29sdW1uLmdldFRhYmxlKCkgIT0gdGhpcy5kdHBUYWJsZSkgewotCQkJcmV0dXJuIHRoaXMuc2NoZW1hLmNvbHVtbihkdHBDb2x1bW4pOwotCQl9Ci0JCWZvciAoSXRlcmF0b3I8Q29sdW1uPiBzdHJlYW0gPSB0aGlzLmNvbHVtbnMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlDb2x1bW4gY29sdW1uID0gc3RyZWFtLm5leHQoKTsKLQkJCWlmIChjb2x1bW4ud3JhcHMoZHRwQ29sdW1uKSkgewotCQkJCXJldHVybiBjb2x1bW47Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBkdHAgY29sdW1uOiAiICsgZHRwQ29sdW1uKTsKLQl9Ci0KLQotCS8vICoqKioqIHByaW1hcnlLZXlDb2x1bW5zCi0KLQlwcml2YXRlIHN5bmNocm9uaXplZCBTZXQ8Q29sdW1uPiBnZXRQcmltYXJ5S2V5Q29sdW1ucygpIHsKLQkJaWYgKHRoaXMucHJpbWFyeUtleUNvbHVtbnMgPT0gbnVsbCkgewotCQkJdGhpcy5wcmltYXJ5S2V5Q29sdW1ucyA9IHRoaXMuYnVpbGRQcmltYXJ5S2V5Q29sdW1ucygpOwotCQl9Ci0JCXJldHVybiB0aGlzLnByaW1hcnlLZXlDb2x1bW5zOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgQ29sbGVjdGlvbjxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuQ29sdW1uPiBjb2x1bW5zKFByaW1hcnlLZXkgcGspIHsKLQkJcmV0dXJuIHBrLmdldE1lbWJlcnMoKTsKLQl9Ci0KLQlwcml2YXRlIFNldDxDb2x1bW4+IGJ1aWxkUHJpbWFyeUtleUNvbHVtbnMoKSB7Ci0JCWlmICggISAodGhpcy5kdHBUYWJsZSBpbnN0YW5jZW9mIEJhc2VUYWJsZSkpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOwotCQl9Ci0JCVByaW1hcnlLZXkgcGsgPSAoKEJhc2VUYWJsZSkgdGhpcy5kdHBUYWJsZSkuZ2V0UHJpbWFyeUtleSgpOwotCQlpZiAocGsgPT0gbnVsbCkgewotCQkJLy8gbm8gUEsgd2FzIGRlZmluZWQKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOwotCQl9Ci0JCUNvbGxlY3Rpb248b3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLkNvbHVtbj4gcGtDb2x1bW5zID0gdGhpcy5jb2x1bW5zKHBrKTsKLQkJU2V0PENvbHVtbj4gcmVzdWx0ID0gbmV3IEhhc2hTZXQ8Q29sdW1uPihwa0NvbHVtbnMuc2l6ZSgpKTsKLQkJZm9yIChvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuQ29sdW1uIHBrQ29sdW1uIDogcGtDb2x1bW5zKSB7Ci0JCQlyZXN1bHQuYWRkKHRoaXMuY29sdW1uKHBrQ29sdW1uKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8Q29sdW1uPiBwcmltYXJ5S2V5Q29sdW1ucygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UHJpbWFyeUtleUNvbHVtbnMoKS5pdGVyYXRvcigpOwotCX0KLQotCXB1YmxpYyBpbnQgcHJpbWFyeUtleUNvbHVtbnNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQcmltYXJ5S2V5Q29sdW1ucygpLnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwcmltYXJ5S2V5Q29sdW1uc0NvbnRhaW5zKENvbHVtbiBjb2x1bW4pIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UHJpbWFyeUtleUNvbHVtbnMoKS5jb250YWlucyhjb2x1bW4pOwotCX0KLQotCi0JLy8gKioqKiogZm9yZWlnbktleXMKLQotCXByaXZhdGUgc3luY2hyb25pemVkIFNldDxGb3JlaWduS2V5PiBnZXRGb3JlaWduS2V5cygpIHsKLQkJaWYgKHRoaXMuZm9yZWlnbktleXMgPT0gbnVsbCkgewotCQkJdGhpcy5mb3JlaWduS2V5cyA9IHRoaXMuYnVpbGRGb3JlaWduS2V5cygpOwotCQl9Ci0JCXJldHVybiB0aGlzLmZvcmVpZ25LZXlzOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgQ29sbGVjdGlvbjxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5jb25zdHJhaW50cy5Gb3JlaWduS2V5PiBkdHBGb3JlaWduS2V5cygpIHsKLQkJcmV0dXJuICgoQmFzZVRhYmxlKSB0aGlzLmR0cFRhYmxlKS5nZXRGb3JlaWduS2V5cygpOwotCX0KLQotCXByaXZhdGUgU2V0PEZvcmVpZ25LZXk+IGJ1aWxkRm9yZWlnbktleXMoKSB7Ci0JCWlmICggISAodGhpcy5kdHBUYWJsZSBpbnN0YW5jZW9mIEJhc2VUYWJsZSkpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOwotCQl9Ci0JCUNvbGxlY3Rpb248b3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuY29uc3RyYWludHMuRm9yZWlnbktleT4gZHRwRm9yZWlnbktleXMgPSB0aGlzLmR0cEZvcmVpZ25LZXlzKCk7Ci0JCVNldDxGb3JlaWduS2V5PiByZXN1bHQgPSBuZXcgSGFzaFNldDxGb3JlaWduS2V5PihkdHBGb3JlaWduS2V5cy5zaXplKCkpOwotCQlmb3IgKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLmNvbnN0cmFpbnRzLkZvcmVpZ25LZXkgZHRwRm9yZWlnbktleSA6IGR0cEZvcmVpZ25LZXlzKSB7Ci0JCQlyZXN1bHQuYWRkKG5ldyBGb3JlaWduS2V5KHRoaXMsIGR0cEZvcmVpZ25LZXkpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxGb3JlaWduS2V5PiBmb3JlaWduS2V5cygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Rm9yZWlnbktleXMoKS5pdGVyYXRvcigpOwotCX0KLQotCXB1YmxpYyBpbnQgZm9yZWlnbktleXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5nZXRGb3JlaWduS2V5cygpLnNpemUoKTsKLQl9Ci0KLQotCS8vICoqKioqIGZvcmVpZ25LZXlDb2x1bW5zCi0KLQlwcml2YXRlIHN5bmNocm9uaXplZCBTZXQ8Q29sdW1uPiBnZXRGb3JlaWduS2V5Q29sdW1ucygpIHsKLQkJaWYgKHRoaXMuZm9yZWlnbktleUNvbHVtbnMgPT0gbnVsbCkgewotCQkJdGhpcy5mb3JlaWduS2V5Q29sdW1ucyA9IHRoaXMuYnVpbGRGb3JlaWduS2V5Q29sdW1ucygpOwotCQl9Ci0JCXJldHVybiB0aGlzLmZvcmVpZ25LZXlDb2x1bW5zOwotCX0KLQotCXByaXZhdGUgU2V0PENvbHVtbj4gYnVpbGRGb3JlaWduS2V5Q29sdW1ucygpIHsKLQkJaWYgKCAhICh0aGlzLmR0cFRhYmxlIGluc3RhbmNlb2YgQmFzZVRhYmxlKSkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5U2V0KCk7Ci0JCX0KLQkJU2V0PENvbHVtbj4gcmVzdWx0ID0gbmV3IEhhc2hTZXQ8Q29sdW1uPih0aGlzLmNvbHVtbnNTaXplKCkpOwotCQlmb3IgKEl0ZXJhdG9yPEZvcmVpZ25LZXk+IHN0cmVhbSA9IHRoaXMuZm9yZWlnbktleXMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHJlc3VsdCwgc3RyZWFtLm5leHQoKS5iYXNlQ29sdW1ucygpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxDb2x1bW4+IGZvcmVpZ25LZXlDb2x1bW5zKCkgewotCQlyZXR1cm4gdGhpcy5nZXRGb3JlaWduS2V5Q29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIGludCBmb3JlaWduS2V5Q29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmdldEZvcmVpZ25LZXlDb2x1bW5zKCkuc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGZvcmVpZ25LZXlDb2x1bW5zQ29udGFpbnMoQ29sdW1uIGNvbHVtbikgewotCQlyZXR1cm4gdGhpcy5nZXRGb3JlaWduS2V5Q29sdW1ucygpLmNvbnRhaW5zKGNvbHVtbik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBDb21wYXJhYmxlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBpbnQgY29tcGFyZVRvKCBUYWJsZSB0YWJsZSkgewotCQlyZXR1cm4gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKS5jb21wYXJlKCB0aGlzLmdldE5hbWUoKSwgdGFibGUuZ2V0TmFtZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvYWJvdXQuaHRtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9hYm91dC5odG1sCmluZGV4IDc5NGFmNzUuLjhmMjFjYjggMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9hYm91dC5odG1sCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9hYm91dC5odG1sCkBAIC00LDggKzQsOCBAQAogPGhlYWQ+CiA8IS0tIFJ1biBkYXRlID0gTWF5IDIxLCAyMDA3IDY6MzU6NTkgLS0+CiA8bWV0YSBuYW1lPSJPQUNfSUdOT1JFX1NLSVBfTkFWIiBjb250ZW50PSJ0cnVlIiAvPgotPHRpdGxlPkFib3V0IHRoaXMgY29udGVudDwvdGl0bGU+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KKzx0aXRsZT5BYm91dCB0aGlzIGNvbnRlbnQ8L3RpdGxlPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KIDxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIC0gVmVyc2lvbiA0LjUuMyBCdWlsZCAwMiIgLz4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jb25jZXB0X21hcHBpbmcuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NvbmNlcHRfbWFwcGluZy5odG0KaW5kZXggYzE3ZTkxNi4uMWI4MjZhNSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NvbmNlcHRfbWFwcGluZy5odG0KKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NvbmNlcHRfbWFwcGluZy5odG0KQEAgLTQsOCArNCw4IEBACiA8aGVhZD4KIDwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDcgNjozNTo1MyAtLT4KIDxtZXRhIG5hbWU9Ik9BQ19JR05PUkVfU0tJUF9OQVYiIGNvbnRlbnQ9InRydWUiIC8+Ci08dGl0bGU+VW5kZXJzdGFuZGluZyBPUiBtYXBwaW5nczwvdGl0bGU+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KKzx0aXRsZT5VbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzPC90aXRsZT4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+CiA8bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAtIFZlcnNpb24gNC41LjMgQnVpbGQgMDIiIC8+CkBAIC0yOSw3ICsyOSw3IEBACiA8L3RkPgogPC90cj4KIDwvdGFibGU+Ci08cD48YSBpZD0ic3RocmVmNDQiIG5hbWU9InN0aHJlZjQ0Ij48L2E+PGEgaWQ9InN0aHJlZjQ1IiBuYW1lPSJzdGhyZWY0NSI+PC9hPlRoZSBEYWxpIE9SIChvYmplY3QtcmVsYXRpb25hbCkgTWFwcGluZyBUb29sIGFsbG93cyB5b3UgdG8gZGVzY3JpYmUgaG93IHlvdXIgZW50aXR5IG9iamVjdHMgPHNwYW4gY2xhc3M9Iml0YWxpYyI+bWFwPC9zcGFuPiB0byB0aGUgZGF0YSBzb3VyY2UgKG9yIG90aGVyIG9iamVjdHMpLiBUaGlzIGFwcHJvYWNoIGlzb2xhdGVzIHBlcnNpc3RlbmNlIGluZm9ybWF0aW9uIGZyb20gdGhlIG9iamVjdCBtb2RlbCZuZGFzaDtkZXZlbG9wZXJzIGFyZSBmcmVlIHRvIGRlc2lnbiB0aGVpciBpZGVhbCBvYmplY3QgbW9kZWwsIGFuZCBEQkFzIGFyZSBmcmVlIHRvIGRlc2lnbiB0aGVpciBpZGVhbCBzY2hlbWEuPC9wPgorPHA+PGEgaWQ9InN0aHJlZjQ0IiBuYW1lPSJzdGhyZWY0NCI+PC9hPjxhIGlkPSJzdGhyZWY0NSIgbmFtZT0ic3RocmVmNDUiPjwvYT5UaGUgRGFsaSBPUiAob2JqZWN0LXJlbGF0aW9uYWwpIE1hcHBpbmcgVG9vbCBhbGxvd3MgeW91IHRvIGRlc2NyaWJlIGhvdyB5b3VyIGVudGl0eSBvYmplY3RzIDxzcGFuIGNsYXNzPSJpdGFsaWMiPm1hcDwvc3Bhbj4gdG8gdGhlIGRhdGEgc291cmNlIChvciBvdGhlciBvYmplY3RzKS4gVGhpcyBhcHByb2FjaCBpc29sYXRlcyBwZXJzaXN0ZW5jZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBvYmplY3QgbW9kZWwuIERldmVsb3BlcnMgYXJlIGZyZWUgdG8gZGVzaWduIHRoZWlyIGlkZWFsIG9iamVjdCBtb2RlbCwgYW5kIERCQXMgYXJlIGZyZWUgdG8gZGVzaWduIHRoZWlyIGlkZWFsIHNjaGVtYS48L3A+CiA8cD5UaGVzZSBtYXBwaW5ncyB0cmFuc2Zvcm0gYW4gb2JqZWN0IGRhdGEgbWVtYmVyIHR5cGUgdG8gYSBjb3JyZXNwb25kaW5nIHJlbGF0aW9uYWwgZGF0YWJhc2UgZGF0YSBzb3VyY2UgcmVwcmVzZW50YXRpb24uIFRoZXNlIE9SIG1hcHBpbmdzIGNhbiBhbHNvIHRyYW5zZm9ybSBvYmplY3QgZGF0YSBtZW1iZXJzIHRoYXQgcmVmZXJlbmNlIG90aGVyIGRvbWFpbiBvYmplY3RzIHN0b3JlZCBpbiBvdGhlciB0YWJsZXMgaW4gdGhlIGRhdGFiYXNlIGFuZCBhcmUgcmVsYXRlZCB0aHJvdWdoIGZvcmVpZ24ga2V5cy48L3A+CiA8cD5Zb3UgY2FuIHVzZSB0aGVzZSBtYXBwaW5ncyB0byBtYXAgc2ltcGxlIGRhdGEgdHlwZXMgaW5jbHVkaW5nIHByaW1pdGl2ZXMgKHN1Y2ggYXMgPGNvZGU+aW50PC9jb2RlPiksIEpESyBjbGFzc2VzIChzdWNoIGFzIDxjb2RlPlN0cmluZzwvY29kZT4pLCBhbmQgbGFyZ2Ugb2JqZWN0IChMT0IpIHZhbHVlcy4gWW91IGNhbiBhbHNvIHVzZSB0aGVtIHRvIHRyYW5zZm9ybSBvYmplY3QgZGF0YSBtZW1iZXJzIHRoYXQgcmVmZXJlbmNlIG90aGVyIGRvbWFpbiBvYmplY3RzIGJ5IHdheSBvZiBhc3NvY2lhdGlvbiB3aGVyZSBkYXRhIHNvdXJjZSByZXByZXNlbnRhdGlvbnMgcmVxdWlyZSBvYmplY3QgaWRlbnRpdHkgbWFpbnRlbmFuY2UgKHN1Y2ggYXMgc2VxdWVuY2luZyBhbmQgYmFjayByZWZlcmVuY2VzKSBhbmQgcG9zc2VzcyB2YXJpb3VzIHR5cGVzIG9mIG11bHRpcGxpY2l0eSBhbmQgbmF2aWdhYmlsaXR5LiBUaGUgYXBwcm9wcmlhdGUgbWFwcGluZyBjbGFzcyBpcyBjaG9zZW4gcHJpbWFyaWx5IGJ5IHRoZSBjYXJkaW5hbGl0eSBvZiB0aGUgcmVsYXRpb25zaGlwLjwvcD4KIDxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0KaW5kZXggY2Y5ODQxNi4uOGYzMzllNSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NvbmNlcHRfcGVyc2lzdGVuY2UuaHRtCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jb25jZXB0X3BlcnNpc3RlbmNlLmh0bQpAQCAtNCw4ICs0LDggQEAKIDxoZWFkPgogPCEtLSBSdW4gZGF0ZSA9IE1heSAyMSwgMjAwNyA2OjM1OjUzIC0tPgogPG1ldGEgbmFtZT0iT0FDX0lHTk9SRV9TS0lQX05BViIgY29udGVudD0idHJ1ZSIgLz4KLTx0aXRsZT5VbmRlcnN0YW5kaW5nIEphdmEgcGVyc2lzdGVuY2U8L3RpdGxlPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Cis8dGl0bGU+VW5kZXJzdGFuZGluZyBKYXZhIHBlcnNpc3RlbmNlPC90aXRsZT4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+CiA8bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAtIFZlcnNpb24gNC41LjMgQnVpbGQgMDIiIC8+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29uY2VwdHMuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NvbmNlcHRzLmh0bQppbmRleCBlNzA5NzMwLi4zOGY2M2Q4IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29uY2VwdHMuaHRtCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jb25jZXB0cy5odG0KQEAgLTQsOCArNCw4IEBACiA8aGVhZD4KIDwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDcgNjozNTo1MyAtLT4KIDxtZXRhIG5hbWU9Ik9BQ19JR05PUkVfU0tJUF9OQVYiIGNvbnRlbnQ9InRydWUiIC8+Ci08dGl0bGU+Q29uY2VwdHM8L3RpdGxlPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Cis8dGl0bGU+Q29uY2VwdHM8L3RpdGxlPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KIDxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIC0gVmVyc2lvbiA0LjUuMyBCdWlsZCAwMiIgLz4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jb25jZXB0czAwMS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29uY2VwdHMwMDEuaHRtCmluZGV4IGM5YWM5YjIuLjlhZDVjYzEgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jb25jZXB0czAwMS5odG0KKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NvbmNlcHRzMDAxLmh0bQpAQCAtNCw4ICs0LDggQEAKIDxoZWFkPgogPCEtLSBSdW4gZGF0ZSA9IE1heSAyMSwgMjAwNyA2OjM1OjUzIC0tPgogPG1ldGEgbmFtZT0iT0FDX0lHTk9SRV9TS0lQX05BViIgY29udGVudD0idHJ1ZSIgLz4KLTx0aXRsZT5VbmRlcnN0YW5kaW5nIEVKQiAzLjAgSmF2YSBQZXJzaXN0ZW5jZSBBUEk8L3RpdGxlPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Cis8dGl0bGU+VW5kZXJzdGFuZGluZyBFSkIgMy4wIEphdmEgUGVyc2lzdGVuY2UgQVBJPC90aXRsZT4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+CiA8bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAtIFZlcnNpb24gNC41LjMgQnVpbGQgMDIiIC8+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29uY2VwdHMwMDIuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NvbmNlcHRzMDAyLmh0bQppbmRleCAyZDg2MDI3Li40MDcxNmI1IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29uY2VwdHMwMDIuaHRtCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jb25jZXB0czAwMi5odG0KQEAgLTQsOCArNCw4IEBACiA8aGVhZD4KIDwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDcgNjozNTo1MyAtLT4KIDxtZXRhIG5hbWU9Ik9BQ19JR05PUkVfU0tJUF9OQVYiIGNvbnRlbnQ9InRydWUiIC8+Ci08dGl0bGU+VGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlPC90aXRsZT4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgorPHRpdGxlPlRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZTwvdGl0bGU+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgogPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgLSBWZXJzaW9uIDQuNS4zIEJ1aWxkIDAyIiAvPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NvbmNlcHRzMDAzLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jb25jZXB0czAwMy5odG0KaW5kZXggNWY0YmQ5MC4uODAzOTViMCAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NvbmNlcHRzMDAzLmh0bQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29uY2VwdHMwMDMuaHRtCkBAIC00LDggKzQsOCBAQAogPGhlYWQ+CiA8IS0tIFJ1biBkYXRlID0gTWF5IDIxLCAyMDA3IDY6MzU6NTMgLS0+CiA8bWV0YSBuYW1lPSJPQUNfSUdOT1JFX1NLSVBfTkFWIiBjb250ZW50PSJ0cnVlIiAvPgotPHRpdGxlPlRoZSBvcm0ueG1sIGZpbGU8L3RpdGxlPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Cis8dGl0bGU+VGhlIG9ybS54bWwgZmlsZTwvdGl0bGU+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgogPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgLSBWZXJzaW9uIDQuNS4zIEJ1aWxkIDAyIiAvPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2Rjb21tb24vaHRtbC9jcHlyLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9kY29tbW9uL2h0bWwvY3B5ci5odG0KaW5kZXggMzgyZWM2Ny4uZmU1MmU5NSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2Rjb21tb24vaHRtbC9jcHlyLmh0bQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvZGNvbW1vbi9odG1sL2NweXIuaHRtCkBAIC0zLDYgKzMsNyBAQAogPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgogCiA8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgogPCEtLSAgPG1ldGEgaHR0cC1lcXVpdj0icmVmcmVzaCIgY29udGVudD0iMDt1cmw9Li4vLi4vbGVnYWwuaHRtIj4gLS0+CiA8L2hlYWQ+CiA8Ym9keT4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9nZXR0aW5nX3N0YXJ0ZWQuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZC5odG0KaW5kZXggYzBmNzhmNi4uNjU4MDIyYiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZC5odG0KKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZC5odG0KQEAgLTQsOCArNCw4IEBACiA8aGVhZD4KIDwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDcgNjozNTo1MiAtLT4KIDxtZXRhIG5hbWU9Ik9BQ19JR05PUkVfU0tJUF9OQVYiIGNvbnRlbnQ9InRydWUiIC8+Ci08dGl0bGU+R2V0dGluZyBzdGFydGVkPC90aXRsZT4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgorPHRpdGxlPkdldHRpbmcgc3RhcnRlZDwvdGl0bGU+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgogPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgLSBWZXJzaW9uIDQuNS4zIEJ1aWxkIDAyIiAvPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAwMS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvZ2V0dGluZ19zdGFydGVkMDAxLmh0bQppbmRleCBmZmVlODNhLi5lMTdlYTkxIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvZ2V0dGluZ19zdGFydGVkMDAxLmh0bQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvZ2V0dGluZ19zdGFydGVkMDAxLmh0bQpAQCAtNCw4ICs0LDggQEAKIDxoZWFkPgogPCEtLSBSdW4gZGF0ZSA9IE1heSAyMSwgMjAwNyA2OjM1OjUyIC0tPgogPG1ldGEgbmFtZT0iT0FDX0lHTk9SRV9TS0lQX05BViIgY29udGVudD0idHJ1ZSIgLz4KLTx0aXRsZT5SZXF1aXJlbWVudHMgYW5kIGluc3RhbGxhdGlvbjwvdGl0bGU+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KKzx0aXRsZT5SZXF1aXJlbWVudHMgYW5kIGluc3RhbGxhdGlvbjwvdGl0bGU+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgogPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgLSBWZXJzaW9uIDQuNS4zIEJ1aWxkIDAyIiAvPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAwMi5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvZ2V0dGluZ19zdGFydGVkMDAyLmh0bQppbmRleCBlZmJhMGViLi41MmY0ZTI1IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvZ2V0dGluZ19zdGFydGVkMDAyLmh0bQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvZ2V0dGluZ19zdGFydGVkMDAyLmh0bQpAQCAtNCw4ICs0LDggQEAKIDxoZWFkPgogPCEtLSBSdW4gZGF0ZSA9IE1heSAyMSwgMjAwNyA2OjM1OjUyIC0tPgogPG1ldGEgbmFtZT0iT0FDX0lHTk9SRV9TS0lQX05BViIgY29udGVudD0idHJ1ZSIgLz4KLTx0aXRsZT5EYWxpIHF1aWNrIHN0YXJ0PC90aXRsZT4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgorPHRpdGxlPkRhbGkgcXVpY2sgc3RhcnQ8L3RpdGxlPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KIDxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIC0gVmVyc2lvbiA0LjUuMyBCdWlsZCAwMiIgLz4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9nZXR0aW5nX3N0YXJ0ZWQwMDMuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAwMy5odG0KaW5kZXggYzBiYzVlNi4uZGMwY2JlZCAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAwMy5odG0KKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAwMy5odG0KQEAgLTQsOCArNCw4IEBACiA8aGVhZD4KIDwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDcgNjozNTo1MiAtLT4KIDxtZXRhIG5hbWU9Ik9BQ19JR05PUkVfU0tJUF9OQVYiIGNvbnRlbnQ9InRydWUiIC8+Ci08dGl0bGU+Q3JlYXRpbmcgYSBuZXcgcHJvamVjdDwvdGl0bGU+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KKzx0aXRsZT5DcmVhdGluZyBhIG5ldyBwcm9qZWN0PC90aXRsZT4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+CiA8bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAtIFZlcnNpb24gNC41LjMgQnVpbGQgMDIiIC8+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvZ2V0dGluZ19zdGFydGVkMDA0Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9nZXR0aW5nX3N0YXJ0ZWQwMDQuaHRtCmluZGV4IGRhNzkwMGEuLjhiYzZiMjYgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9nZXR0aW5nX3N0YXJ0ZWQwMDQuaHRtCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9nZXR0aW5nX3N0YXJ0ZWQwMDQuaHRtCkBAIC00LDggKzQsOCBAQAogPGhlYWQ+CiA8IS0tIFJ1biBkYXRlID0gTWF5IDIxLCAyMDA3IDY6MzU6NTIgLS0+CiA8bWV0YSBuYW1lPSJPQUNfSUdOT1JFX1NLSVBfTkFWIiBjb250ZW50PSJ0cnVlIiAvPgotPHRpdGxlPkNyZWF0aW5nIGEgSmF2YSBwZXJzaXN0ZW50IGVudGl0eTwvdGl0bGU+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KKzx0aXRsZT5DcmVhdGluZyBhIEphdmEgcGVyc2lzdGVudCBlbnRpdHk8L3RpdGxlPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KIDxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIC0gVmVyc2lvbiA0LjUuMyBCdWlsZCAwMiIgLz4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9nZXR0aW5nX3N0YXJ0ZWQwMDUuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAwNS5odG0KaW5kZXggZjNlNTY0ZS4uNTMwMTdlNyAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAwNS5odG0KKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAwNS5odG0KQEAgLTQsOCArNCw4IEBACiA8aGVhZD4KIDwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDcgNjozNTo1MiAtLT4KIDxtZXRhIG5hbWU9Ik9BQ19JR05PUkVfU0tJUF9OQVYiIGNvbnRlbnQ9InRydWUiIC8+Ci08dGl0bGU+TWFwcGluZyBhbiBlbnRpdHk8L3RpdGxlPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Cis8dGl0bGU+TWFwcGluZyBhbiBlbnRpdHk8L3RpdGxlPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KIDxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIC0gVmVyc2lvbiA0LjUuMyBCdWlsZCAwMiIgLz4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9nZXR0aW5nX3N0YXJ0ZWQwMDYuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAwNi5odG0KaW5kZXggMjhkYzg2ZS4uMmRkZTRhMiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAwNi5odG0KKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAwNi5odG0KQEAgLTQsOCArNCw4IEBACiA8aGVhZD4KIDwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDcgNjozNTo1MiAtLT4KIDxtZXRhIG5hbWU9Ik9BQ19JR05PUkVfU0tJUF9OQVYiIGNvbnRlbnQ9InRydWUiIC8+Ci08dGl0bGU+RGFsaSBiYXNpYyB0dXRvcmlhbDwvdGl0bGU+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KKzx0aXRsZT5EYWxpIGJhc2ljIHR1dG9yaWFsPC90aXRsZT4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+CiA8bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAtIFZlcnNpb24gNC41LjMgQnVpbGQgMDIiIC8+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvZ2V0dGluZ19zdGFydGVkMDA3Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9nZXR0aW5nX3N0YXJ0ZWQwMDcuaHRtCmluZGV4IDkwOWFkMWYuLjY1NGIwYzkgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9nZXR0aW5nX3N0YXJ0ZWQwMDcuaHRtCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9nZXR0aW5nX3N0YXJ0ZWQwMDcuaHRtCkBAIC00LDggKzQsOCBAQAogPGhlYWQ+CiA8IS0tIFJ1biBkYXRlID0gTWF5IDIxLCAyMDA3IDY6MzU6NTIgLS0+CiA8bWV0YSBuYW1lPSJPQUNfSUdOT1JFX1NLSVBfTkFWIiBjb250ZW50PSJ0cnVlIiAvPgotPHRpdGxlPkdlbmVyYXRlIHRoZSB0dXRvcmlhbCBkYXRhYmFzZSBzY2hlbWE8L3RpdGxlPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Cis8dGl0bGU+R2VuZXJhdGUgdGhlIHR1dG9yaWFsIGRhdGFiYXNlIHNjaGVtYTwvdGl0bGU+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgogPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgLSBWZXJzaW9uIDQuNS4zIEJ1aWxkIDAyIiAvPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAwOC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvZ2V0dGluZ19zdGFydGVkMDA4Lmh0bQppbmRleCA0ZTQ1ODVjLi5lMjc3ZmVkIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvZ2V0dGluZ19zdGFydGVkMDA4Lmh0bQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvZ2V0dGluZ19zdGFydGVkMDA4Lmh0bQpAQCAtNCw4ICs0LDggQEAKIDxoZWFkPgogPCEtLSBSdW4gZGF0ZSA9IE1heSAyMSwgMjAwNyA2OjM1OjUyIC0tPgogPG1ldGEgbmFtZT0iT0FDX0lHTk9SRV9TS0lQX05BViIgY29udGVudD0idHJ1ZSIgLz4KLTx0aXRsZT5DcmVhdGUgYSBkYXRhYmFzZSBjb25uZWN0aW9uPC90aXRsZT4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgorPHRpdGxlPkNyZWF0ZSBhIGRhdGFiYXNlIGNvbm5lY3Rpb248L3RpdGxlPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KIDxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIC0gVmVyc2lvbiA0LjUuMyBCdWlsZCAwMiIgLz4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9nZXR0aW5nX3N0YXJ0ZWQwMDkuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAwOS5odG0KaW5kZXggYzkxOTBlNS4uZmVkMGNmYSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAwOS5odG0KKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAwOS5odG0KQEAgLTQsOCArNCw4IEBACiA8aGVhZD4KIDwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDcgNjozNTo1MiAtLT4KIDxtZXRhIG5hbWU9Ik9BQ19JR05PUkVfU0tJUF9OQVYiIGNvbnRlbnQ9InRydWUiIC8+Ci08dGl0bGU+Q3JlYXRlIGEgSlBBIHByb2plY3Q8L3RpdGxlPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Cis8dGl0bGU+Q3JlYXRlIGEgSlBBIHByb2plY3Q8L3RpdGxlPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KIDxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIC0gVmVyc2lvbiA0LjUuMyBCdWlsZCAwMiIgLz4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9nZXR0aW5nX3N0YXJ0ZWQwMTAuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAxMC5odG0KaW5kZXggZGY2ODVlZi4uNjllYzIwMiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAxMC5odG0KKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAxMC5odG0KQEAgLTQsOCArNCw4IEBACiA8aGVhZD4KIDwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDcgNjozNTo1MiAtLT4KIDxtZXRhIG5hbWU9Ik9BQ19JR05PUkVfU0tJUF9OQVYiIGNvbnRlbnQ9InRydWUiIC8+Ci08dGl0bGU+Q3JlYXRlIHBlcnNpc3RlbnQgSmF2YSBlbnRpdGllczwvdGl0bGU+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KKzx0aXRsZT5DcmVhdGUgcGVyc2lzdGVudCBKYXZhIGVudGl0aWVzPC90aXRsZT4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+CiA8bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAtIFZlcnNpb24gNC41LjMgQnVpbGQgMDIiIC8+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvZ2V0dGluZ19zdGFydGVkMDExLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9nZXR0aW5nX3N0YXJ0ZWQwMTEuaHRtCmluZGV4IDU1YWIwNWYuLjBjZDQ1YTkgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9nZXR0aW5nX3N0YXJ0ZWQwMTEuaHRtCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9nZXR0aW5nX3N0YXJ0ZWQwMTEuaHRtCkBAIC00LDggKzQsOCBAQAogPGhlYWQ+CiA8IS0tIFJ1biBkYXRlID0gTWF5IDIxLCAyMDA3IDY6MzU6NTIgLS0+CiA8bWV0YSBuYW1lPSJPQUNfSUdOT1JFX1NLSVBfTkFWIiBjb250ZW50PSJ0cnVlIiAvPgotPHRpdGxlPkFkZCBmaWVsZHMgdG8gdGhlIGVudGl0aWVzPC90aXRsZT4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgorPHRpdGxlPkFkZCBmaWVsZHMgdG8gdGhlIGVudGl0aWVzPC90aXRsZT4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+CiA8bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAtIFZlcnNpb24gNC41LjMgQnVpbGQgMDIiIC8+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvZ2V0dGluZ19zdGFydGVkMDEyLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9nZXR0aW5nX3N0YXJ0ZWQwMTIuaHRtCmluZGV4IDNiMDg3OTguLjVmNjk1MGUgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9nZXR0aW5nX3N0YXJ0ZWQwMTIuaHRtCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9nZXR0aW5nX3N0YXJ0ZWQwMTIuaHRtCkBAIC00LDggKzQsOCBAQAogPGhlYWQ+CiA8IS0tIFJ1biBkYXRlID0gTWF5IDIxLCAyMDA3IDY6MzU6NTIgLS0+CiA8bWV0YSBuYW1lPSJPQUNfSUdOT1JFX1NLSVBfTkFWIiBjb250ZW50PSJ0cnVlIiAvPgotPHRpdGxlPkFzc29jaWF0ZSB0aGUgZW50aXR5IHdpdGggYSBkYXRhYmFzZSB0YWJsZTwvdGl0bGU+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KKzx0aXRsZT5Bc3NvY2lhdGUgdGhlIGVudGl0eSB3aXRoIGEgZGF0YWJhc2UgdGFibGU8L3RpdGxlPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KIDxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIC0gVmVyc2lvbiA0LjUuMyBCdWlsZCAwMiIgLz4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9nZXR0aW5nX3N0YXJ0ZWQwMTMuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAxMy5odG0KaW5kZXggNzg1YTY1OS4uZDE5MjhlNiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAxMy5odG0KKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAxMy5odG0KQEAgLTQsOCArNCw4IEBACiA8aGVhZD4KIDwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDcgNjozNTo1MiAtLT4KIDxtZXRhIG5hbWU9Ik9BQ19JR05PUkVfU0tJUF9OQVYiIGNvbnRlbnQ9InRydWUiIC8+Ci08dGl0bGU+Q3JlYXRlIE9SIG1hcHBpbmdzPC90aXRsZT4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgorPHRpdGxlPkNyZWF0ZSBPUiBtYXBwaW5nczwvdGl0bGU+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgogPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgLSBWZXJzaW9uIDQuNS4zIEJ1aWxkIDAyIiAvPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAxNC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvZ2V0dGluZ19zdGFydGVkMDE0Lmh0bQppbmRleCBkZTQ0NDdkLi5hNGNkYTc2IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvZ2V0dGluZ19zdGFydGVkMDE0Lmh0bQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvZ2V0dGluZ19zdGFydGVkMDE0Lmh0bQpAQCAtNCw4ICs0LDggQEAKIDxoZWFkPgogPCEtLSBSdW4gZGF0ZSA9IE1heSAyMSwgMjAwNyA2OjM1OjUyIC0tPgogPG1ldGEgbmFtZT0iT0FDX0lHTk9SRV9TS0lQX05BViIgY29udGVudD0idHJ1ZSIgLz4KLTx0aXRsZT5DcmVhdGUgSUQgbWFwcGluZ3M8L3RpdGxlPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Cis8dGl0bGU+Q3JlYXRlIElEIG1hcHBpbmdzPC90aXRsZT4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+CiA8bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAtIFZlcnNpb24gNC41LjMgQnVpbGQgMDIiIC8+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvZ2V0dGluZ19zdGFydGVkMDE1Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9nZXR0aW5nX3N0YXJ0ZWQwMTUuaHRtCmluZGV4IDYzZTlmODAuLjNkNWZmMDQgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9nZXR0aW5nX3N0YXJ0ZWQwMTUuaHRtCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9nZXR0aW5nX3N0YXJ0ZWQwMTUuaHRtCkBAIC00LDggKzQsOCBAQAogPGhlYWQ+CiA8IS0tIFJ1biBkYXRlID0gTWF5IDIxLCAyMDA3IDY6MzU6NTIgLS0+CiA8bWV0YSBuYW1lPSJPQUNfSUdOT1JFX1NLSVBfTkFWIiBjb250ZW50PSJ0cnVlIiAvPgotPHRpdGxlPkNyZWF0ZSBiYXNpYyBtYXBwaW5nczwvdGl0bGU+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KKzx0aXRsZT5DcmVhdGUgYmFzaWMgbWFwcGluZ3M8L3RpdGxlPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KIDxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIC0gVmVyc2lvbiA0LjUuMyBCdWlsZCAwMiIgLz4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9nZXR0aW5nX3N0YXJ0ZWQwMTYuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAxNi5odG0KaW5kZXggMGIyMWZjMS4uZTU3YzRmNSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAxNi5odG0KKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAxNi5odG0KQEAgLTQsOCArNCw4IEBACiA8aGVhZD4KIDwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDcgNjozNTo1MyAtLT4KIDxtZXRhIG5hbWU9Ik9BQ19JR05PUkVfU0tJUF9OQVYiIGNvbnRlbnQ9InRydWUiIC8+Ci08dGl0bGU+Q3JlYXRlIG9uZS10by1vbmUgbWFwcGluZ3M8L3RpdGxlPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Cis8dGl0bGU+Q3JlYXRlIG9uZS10by1vbmUgbWFwcGluZ3M8L3RpdGxlPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KIDxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIC0gVmVyc2lvbiA0LjUuMyBCdWlsZCAwMiIgLz4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9nZXR0aW5nX3N0YXJ0ZWQwMTcuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAxNy5odG0KaW5kZXggZDc1YTAwZC4uM2I2OWIzNCAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAxNy5odG0KKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAxNy5odG0KQEAgLTQsOCArNCw4IEBACiA8aGVhZD4KIDwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDcgNjozNTo1MyAtLT4KIDxtZXRhIG5hbWU9Ik9BQ19JR05PUkVfU0tJUF9OQVYiIGNvbnRlbnQ9InRydWUiIC8+Ci08dGl0bGU+Q3JlYXRlIG9uZS10by1tYW55IG1hcHBpbmdzPC90aXRsZT4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgorPHRpdGxlPkNyZWF0ZSBvbmUtdG8tbWFueSBtYXBwaW5nczwvdGl0bGU+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgogPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgLSBWZXJzaW9uIDQuNS4zIEJ1aWxkIDAyIiAvPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAxOC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvZ2V0dGluZ19zdGFydGVkMDE4Lmh0bQppbmRleCBmMjYyN2YwLi4yNzk4YmU4IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvZ2V0dGluZ19zdGFydGVkMDE4Lmh0bQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvZ2V0dGluZ19zdGFydGVkMDE4Lmh0bQpAQCAtNCw4ICs0LDggQEAKIDxoZWFkPgogPCEtLSBSdW4gZGF0ZSA9IE1heSAyMSwgMjAwNyA2OjM1OjUzIC0tPgogPG1ldGEgbmFtZT0iT0FDX0lHTk9SRV9TS0lQX05BViIgY29udGVudD0idHJ1ZSIgLz4KLTx0aXRsZT5DcmVhdGUgbWFueS10by1vbmUgbWFwcGluZ3M8L3RpdGxlPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Cis8dGl0bGU+Q3JlYXRlIG1hbnktdG8tb25lIG1hcHBpbmdzPC90aXRsZT4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+CiA8bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAtIFZlcnNpb24gNC41LjMgQnVpbGQgMDIiIC8+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvZ2V0dGluZ19zdGFydGVkMDE5Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9nZXR0aW5nX3N0YXJ0ZWQwMTkuaHRtCmluZGV4IDkyMjMwODIuLjNiOGM4ODMgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9nZXR0aW5nX3N0YXJ0ZWQwMTkuaHRtCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9nZXR0aW5nX3N0YXJ0ZWQwMTkuaHRtCkBAIC00LDggKzQsOCBAQAogPGhlYWQ+CiA8IS0tIFJ1biBkYXRlID0gTWF5IDIxLCAyMDA3IDY6MzU6NTMgLS0+CiA8bWV0YSBuYW1lPSJPQUNfSUdOT1JFX1NLSVBfTkFWIiBjb250ZW50PSJ0cnVlIiAvPgotPHRpdGxlPkNyZWF0ZSB2ZXJzaW9uIG1hcHBpbmdzPC90aXRsZT4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgorPHRpdGxlPkNyZWF0ZSB2ZXJzaW9uIG1hcHBpbmdzPC90aXRsZT4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+CiA8bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAtIFZlcnNpb24gNC41LjMgQnVpbGQgMDIiIC8+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvbGVnYWwuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2xlZ2FsLmh0bQppbmRleCBhMzZhMjE2Li4xMmQ4YjY5IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvbGVnYWwuaHRtCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9sZWdhbC5odG0KQEAgLTQsOCArNCw4IEBACiA8aGVhZD4KIDwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDcgNjozNTo1OSAtLT4KIDxtZXRhIG5hbWU9Ik9BQ19JR05PUkVfU0tJUF9OQVYiIGNvbnRlbnQ9InRydWUiIC8+Ci08dGl0bGU+TGVnYWw8L3RpdGxlPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Cis8dGl0bGU+TGVnYWw8L3RpdGxlPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KIDxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIC0gVmVyc2lvbiA0LjUuMyBCdWlsZCAwMiIgLz4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9wbHVnaW4ueG1sIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3BsdWdpbi54bWwKaW5kZXggZTdkMTIxYS4uYTI2N2JiYyAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3BsdWdpbi54bWwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3BsdWdpbi54bWwKQEAgLTEsNiArMSw2IEBACiA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgogPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbiBuYW1lPSJKUEEgRG9jdW1lbnRhdGlvbiBQbHVnLWluIiBpZD0ib3JnLmVjbGlwc2UuanB0LmRvYy51c2VyIiB2ZXJzaW9uPSIxLjAuMCIgcHJvdmlkZXItbmFtZT0iT3JhY2xlIj4KKzxwbHVnaW4+CiAJPCEtLSA9PT09PT09PT09PSAtLT4KIAk8IS0tIERlZmluZSBUT0MgIC0tPgogCTwhLS0gPT09PT09PT09PT0gLS0+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2RldGFpbHNfb3JtLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfZGV0YWlsc19vcm0uaHRtCmluZGV4IDNlMTRiM2UuLjMyNzY4ZDQgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfZGV0YWlsc19vcm0uaHRtCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfZGV0YWlsc19vcm0uaHRtCkBAIC00LDggKzQsOCBAQAogPGhlYWQ+CiA8IS0tIFJ1biBkYXRlID0gTWF5IDIxLCAyMDA3IDY6MzU6NTcgLS0+CiA8bWV0YSBuYW1lPSJPQUNfSUdOT1JFX1NLSVBfTkFWIiBjb250ZW50PSJ0cnVlIiAvPgotPHRpdGxlPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBvcm0ueG1sKTwvdGl0bGU+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KKzx0aXRsZT5KUEEgRGV0YWlscyB2aWV3IChmb3Igb3JtLnhtbCk8L3RpdGxlPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KIDxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIC0gVmVyc2lvbiA0LjUuMyBCdWlsZCAwMiIgLz4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfanBhX2ZhY2V0Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfanBhX2ZhY2V0Lmh0bQppbmRleCAzMDVkZTRmLi5iZGZkNWZkIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2pwYV9mYWNldC5odG0KKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9qcGFfZmFjZXQuaHRtCkBAIC00LDggKzQsOCBAQAogPGhlYWQ+CiA8IS0tIFJ1biBkYXRlID0gTWF5IDIxLCAyMDA3IDY6MzU6NTcgLS0+CiA8bWV0YSBuYW1lPSJPQUNfSUdOT1JFX1NLSVBfTkFWIiBjb250ZW50PSJ0cnVlIiAvPgotPHRpdGxlPkpQQSBGYWNldCBwYWdlPC90aXRsZT4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgorPHRpdGxlPkpQQSBGYWNldCBwYWdlPC90aXRsZT4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+CiA8bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAtIFZlcnNpb24gNC41LjMgQnVpbGQgMDIiIC8+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX21hcHBpbmdfZ2VuZXJhbC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX21hcHBpbmdfZ2VuZXJhbC5odG0KaW5kZXggODVhZjE0OS4uNDAwZjI0MiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9tYXBwaW5nX2dlbmVyYWwuaHRtCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfbWFwcGluZ19nZW5lcmFsLmh0bQpAQCAtNCw4ICs0LDggQEAKIDxoZWFkPgogPCEtLSBSdW4gZGF0ZSA9IE1heSAyMSwgMjAwNyA2OjM1OjU3IC0tPgogPG1ldGEgbmFtZT0iT0FDX0lHTk9SRV9TS0lQX05BViIgY29udGVudD0idHJ1ZSIgLz4KLTx0aXRsZT5HZW5lcmFsIGluZm9ybWF0aW9uPC90aXRsZT4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgorPHRpdGxlPkdlbmVyYWwgaW5mb3JtYXRpb248L3RpdGxlPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KIDxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIC0gVmVyc2lvbiA0LjUuMyBCdWlsZCAwMiIgLz4KQEAgLTcyLDEwICs3MiwxMCBAQAogPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQ2IHIxYzItdDYiPkRlZmluZXMgaG93IGRhdGEgaXMgbG9hZGVkIGZyb20gdGhlIGRhdGFiYXNlOgogPHVsPgogPGxpIHR5cGU9ImRpc2MiPgotPHA+RWFnZXIgJm5kYXNoOyBEYXRhIGlzIGxvYWRlZCBpbiBiZWZvcmUgaXQgaXMgYWN0dWFsbHkgbmVlZGVkLjwvcD4KKzxwPkVhZ2VyIC0gRGF0YSBpcyBsb2FkZWQgaW4gYmVmb3JlIGl0IGlzIGFjdHVhbGx5IG5lZWRlZC48L3A+CiA8L2xpPgogPGxpIHR5cGU9ImRpc2MiPgotPHA+TGF6eSAmbmRhc2g7IERhdGEgaXMgbG9hZGVkIG9ubHkgd2hlbiByZXF1aXJlZCBieSB0aGUgdHJhbnNhY3Rpb24uPC9wPgorPHA+TGF6eSAtIERhdGEgaXMgbG9hZGVkIG9ubHkgd2hlbiByZXF1aXJlZCBieSB0aGUgdHJhbnNhY3Rpb24uPC9wPgogPC9saT4KIDwvdWw+CiA8L3RkPgpAQCAtMTAxLDEzICsxMDEsMTMgQEAKIDx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjljMS10NiByMWMyLXQ2Ij5TcGVjaWZpZXMgaWYgdGhpcyBmaWVsZCBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKIDx1bD4KIDxsaSB0eXBlPSJkaXNjIj4KLTxwPkRhdGUgJm5kYXNoOyA8Y29kZT5qYXZhLnNxbC5EYXRlPC9jb2RlPjwvcD4KKzxwPkRhdGUgLSA8Y29kZT5qYXZhLnNxbC5EYXRlPC9jb2RlPjwvcD4KIDwvbGk+CiA8bGkgdHlwZT0iZGlzYyI+Ci08cD5UaW1lICZuZGFzaDsgPGNvZGU+amF2YS5zcWwuVGltZTwvY29kZT48L3A+Cis8cD5UaW1lIC0gPGNvZGU+amF2YS5zcWwuVGltZTwvY29kZT48L3A+CiA8L2xpPgogPGxpIHR5cGU9ImRpc2MiPgotPHA+VGltZXN0YW1wICZuZGFzaDsgPGNvZGU+amF2YS5zcWwuVGltZXN0YW1wPC9jb2RlPjwvcD4KKzxwPlRpbWVzdGFtcCAtIDxjb2RlPmphdmEuc3FsLlRpbWVzdGFtcDwvY29kZT48L3A+CiA8L2xpPgogPC91bD4KIDxwPlRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBUZW1wb3JhbDwvY29kZT4gYW5ub3RhdGlvbi48L3A+CkBAIC0xNDIsNyArMTQyLDcgQEAKIDx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEyYzEtdDYgcjFjMi10NiI+U3BlY2lmeSB3aGljaCBvcGVyYXRpb25zIGFyZSBwcm9wYWdhdGVkIHRocm91Z2hvdXQgdGhlIGVudGl0eS4KIDx1bD4KIDxsaSB0eXBlPSJkaXNjIj4KLTxwPkFsbCAmbmRhc2g7IEFsbCBvcGVyYXRpb25zPC9wPgorPHA+QWxsIC0gQWxsIG9wZXJhdGlvbnM8L3A+CiA8L2xpPgogPGxpIHR5cGU9ImRpc2MiPgogPHA+UGVyc2lzdDwvcD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfbmV3X2pwYV9wcm9qZWN0Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfbmV3X2pwYV9wcm9qZWN0Lmh0bQppbmRleCAyYTQ5OGQ3Li5iZTM3Y2ZhIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX25ld19qcGFfcHJvamVjdC5odG0KKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9uZXdfanBhX3Byb2plY3QuaHRtCkBAIC00LDggKzQsOCBAQAogPGhlYWQ+CiA8IS0tIFJ1biBkYXRlID0gTWF5IDIxLCAyMDA3IDY6MzU6NTcgLS0+CiA8bWV0YSBuYW1lPSJPQUNfSUdOT1JFX1NLSVBfTkFWIiBjb250ZW50PSJ0cnVlIiAvPgotPHRpdGxlPk5ldyBKUEEgUHJvamVjdCBwYWdlPC90aXRsZT4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgorPHRpdGxlPk5ldyBKUEEgUHJvamVjdCBwYWdlPC90aXRsZT4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+CiA8bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAtIFZlcnNpb24gNC41LjMgQnVpbGQgMDIiIC8+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX25ld19qcGFfcHJvamVjdF93aXphcmQuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9uZXdfanBhX3Byb2plY3Rfd2l6YXJkLmh0bQppbmRleCBiNjhkM2ZlLi40ZmNlYzljIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX25ld19qcGFfcHJvamVjdF93aXphcmQuaHRtCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfbmV3X2pwYV9wcm9qZWN0X3dpemFyZC5odG0KQEAgLTQsOCArNCw4IEBACiA8aGVhZD4KIDwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDcgNjozNTo1NyAtLT4KIDxtZXRhIG5hbWU9Ik9BQ19JR05PUkVfU0tJUF9OQVYiIGNvbnRlbnQ9InRydWUiIC8+Ci08dGl0bGU+Q3JlYXRlIE5ldyBKUEEgUHJvamVjdCB3aXphcmQ8L3RpdGxlPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Cis8dGl0bGU+Q3JlYXRlIE5ldyBKUEEgUHJvamVjdCB3aXphcmQ8L3RpdGxlPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KIDxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIC0gVmVyc2lvbiA0LjUuMyBCdWlsZCAwMiIgLz4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0KaW5kZXggMTJmZmZlNi4uYjkzYWUzMyAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0KKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0KQEAgLTQsOCArNCw4IEBACiA8aGVhZD4KIDwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDcgNjozNTo1NyAtLT4KIDxtZXRhIG5hbWU9Ik9BQ19JR05PUkVfU0tJUF9OQVYiIGNvbnRlbnQ9InRydWUiIC8+Ci08dGl0bGU+SlBBIERldGFpbHMgdmlldyAoZm9yIGF0dHJpYnV0ZXMpPC90aXRsZT4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgorPHRpdGxlPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKTwvdGl0bGU+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgogPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgLSBWZXJzaW9uIDQuNS4zIEJ1aWxkIDAyIiAvPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9wZXJzaXN0ZW5jZV9vdXRsaW5lLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0KaW5kZXggMDgzYzI3Ni4uOTJjYzM0ZCAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9wZXJzaXN0ZW5jZV9vdXRsaW5lLmh0bQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtCkBAIC00LDggKzQsOCBAQAogPGhlYWQ+CiA8IS0tIFJ1biBkYXRlID0gTWF5IDIxLCAyMDA3IDY6MzU6NTcgLS0+CiA8bWV0YSBuYW1lPSJPQUNfSUdOT1JFX1NLSVBfTkFWIiBjb250ZW50PSJ0cnVlIiAvPgotPHRpdGxlPkpQQSBTdHJ1Y3R1cmUgdmlldzwvdGl0bGU+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KKzx0aXRsZT5KUEEgU3RydWN0dXJlIHZpZXc8L3RpdGxlPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KIDxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIC0gVmVyc2lvbiA0LjUuMyBCdWlsZCAwMiIgLz4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcGVyc2lzdGVuY2VfcGVyc3BlY3RpdmUuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9wZXJzaXN0ZW5jZV9wZXJzcGVjdGl2ZS5odG0KaW5kZXggOTI2NDFjYS4uMWRiYzc5MiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9wZXJzaXN0ZW5jZV9wZXJzcGVjdGl2ZS5odG0KKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9wZXJzaXN0ZW5jZV9wZXJzcGVjdGl2ZS5odG0KQEAgLTQsOCArNCw4IEBACiA8aGVhZD4KIDwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDcgNjozNTo1NyAtLT4KIDxtZXRhIG5hbWU9Ik9BQ19JR05PUkVfU0tJUF9OQVYiIGNvbnRlbnQ9InRydWUiIC8+Ci08dGl0bGU+SlBBIERldmVsb3BtZW50IHBlcnNwZWN0aXZlPC90aXRsZT4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgorPHRpdGxlPkpQQSBEZXZlbG9wbWVudCBwZXJzcGVjdGl2ZTwvdGl0bGU+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgogPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgLSBWZXJzaW9uIDQuNS4zIEJ1aWxkIDAyIiAvPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtCmluZGV4IDgzZTBkMTAuLmE2ZWExMDcgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0KQEAgLTQsOCArNCw4IEBACiA8aGVhZD4KIDwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDcgNjozNTo1NyAtLT4KIDxtZXRhIG5hbWU9Ik9BQ19JR05PUkVfU0tJUF9OQVYiIGNvbnRlbnQ9InRydWUiIC8+Ci08dGl0bGU+SlBBIERldGFpbHMgdmlldyAoZm9yIGVudGl0aWVzKTwvdGl0bGU+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KKzx0aXRsZT5KUEEgRGV0YWlscyB2aWV3IChmb3IgZW50aXRpZXMpPC90aXRsZT4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+CiA8bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAtIFZlcnNpb24gNC41LjMgQnVpbGQgMDIiIC8+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3ByaW1hcnlfa2V5Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcHJpbWFyeV9rZXkuaHRtCmluZGV4IDg4NzU4MDAuLmQ1MDg0ZTcgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcHJpbWFyeV9rZXkuaHRtCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcHJpbWFyeV9rZXkuaHRtCkBAIC00LDggKzQsOCBAQAogPGhlYWQ+CiA8IS0tIFJ1biBkYXRlID0gTWF5IDIxLCAyMDA3IDY6MzU6NTcgLS0+CiA8bWV0YSBuYW1lPSJPQUNfSUdOT1JFX1NLSVBfTkFWIiBjb250ZW50PSJ0cnVlIiAvPgotPHRpdGxlPlByaW1hcnkgS2V5IEdlbmVyYXRpb24gaW5mb3JtYXRpb248L3RpdGxlPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Cis8dGl0bGU+UHJpbWFyeSBLZXkgR2VuZXJhdGlvbiBpbmZvcm1hdGlvbjwvdGl0bGU+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgogPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgLSBWZXJzaW9uIDQuNS4zIEJ1aWxkIDAyIiAvPgpAQCAtNTEsMTMgKzUxLDEzIEBACiA8dWw+CiA8bGkgdHlwZT0iZGlzYyI+QXV0bzwvbGk+CiA8bGkgdHlwZT0iZGlzYyI+Ci08cD5JZGVudGl0eSAmbmRhc2g7IFZhbHVlcyBhcmUgYXNzaWduZWQgYnkgdGhlIGRhdGFiYXNlJ3MgPHNwYW4gY2xhc3M9ImJvbGQiPklkZW50aXR5PC9zcGFuPiBjb2x1bW4uPC9wPgorPHA+SWRlbnRpdHkgLSBWYWx1ZXMgYXJlIGFzc2lnbmVkIGJ5IHRoZSBkYXRhYmFzZSdzIDxzcGFuIGNsYXNzPSJib2xkIj5JZGVudGl0eTwvc3Bhbj4gY29sdW1uLjwvcD4KIDwvbGk+CiA8bGkgdHlwZT0iZGlzYyI+Ci08cD5TZXF1ZW5jZSAmbmRhc2g7IFZhbHVlcyBhcmUgYXNzaWduZWQgYnkgYSBzZXF1ZW5jZSB0YWJsZSAoc2VlIDxhIGhyZWY9IiNDQUNGRkhFSCI+U2VxdWVuY2UmbmJzcDtHZW5lcmF0b3I8L2E+KS48L3A+Cis8cD5TZXF1ZW5jZSAtIFZhbHVlcyBhcmUgYXNzaWduZWQgYnkgYSBzZXF1ZW5jZSB0YWJsZSAoc2VlIDxhIGhyZWY9IiNDQUNGRkhFSCI+U2VxdWVuY2UmbmJzcDtHZW5lcmF0b3I8L2E+KS48L3A+CiA8L2xpPgogPGxpIHR5cGU9ImRpc2MiPgotPHA+VGFibGUgJm5kYXNoOyBWYWx1ZXMgYXJlIGFzc2lnbmVkIGJ5IGEgZGF0YWJhc2UgdGFibGUgKHNlZSA8YSBocmVmPSIjQ0FDR0ZFQUgiPlRhYmxlIEdlbmVyYXRvcjwvYT4pLjwvcD4KKzxwPlRhYmxlIC0gVmFsdWVzIGFyZSBhc3NpZ25lZCBieSBhIGRhdGFiYXNlIHRhYmxlIChzZWUgPGEgaHJlZj0iI0NBQ0dGRUFIIj5UYWJsZSBHZW5lcmF0b3I8L2E+KS48L3A+CiA8L2xpPgogPC91bD4KIDwvdGQ+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3Byb2plY3RfcHJvcGVydGllcy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3Byb2plY3RfcHJvcGVydGllcy5odG0KaW5kZXggOWI3YWM5NC4uOWZjNTAwNSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9wcm9qZWN0X3Byb3BlcnRpZXMuaHRtCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcHJvamVjdF9wcm9wZXJ0aWVzLmh0bQpAQCAtNCw4ICs0LDggQEAKIDxoZWFkPgogPCEtLSBSdW4gZGF0ZSA9IE1heSAyMSwgMjAwNyA2OjM1OjU3IC0tPgogPG1ldGEgbmFtZT0iT0FDX0lHTk9SRV9TS0lQX05BViIgY29udGVudD0idHJ1ZSIgLz4KLTx0aXRsZT5Qcm9qZWN0IFByb3BlcnRpZXMgcGFnZSAtIEpQQSBPcHRpb25zPC90aXRsZT4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgorPHRpdGxlPlByb2plY3QgUHJvcGVydGllcyBwYWdlIC0gSlBBIE9wdGlvbnM8L3RpdGxlPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KIDxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIC0gVmVyc2lvbiA0LjUuMyBCdWlsZCAwMiIgLz4KQEAgLTI1LDcgKzI1LDcgQEAKIDx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgogPHRyIHZhbGlnbj0iYm90dG9tIj4KIDx0ZCBhbGlnbj0ibGVmdCIgd2lkdGg9Ijg2JSI+Ci08aDE+UHJvamVjdCBQcm9wZXJ0aWVzIHBhZ2UgJm5kYXNoOyBKUEEgT3B0aW9uczwvaDE+Cis8aDE+UHJvamVjdCBQcm9wZXJ0aWVzIHBhZ2UgLSBKUEEgT3B0aW9uczwvaDE+CiA8L3RkPgogPC90cj4KIDwvdGFibGU+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UuaHRtCmluZGV4IDdlODJkZTAuLjVkYzg5YTIgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UuaHRtCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UuaHRtCkBAIC00LDggKzQsOCBAQAogPGhlYWQ+CiA8IS0tIFJ1biBkYXRlID0gTWF5IDIxLCAyMDA3IDY6MzU6NTcgLS0+CiA8bWV0YSBuYW1lPSJPQUNfSUdOT1JFX1NLSVBfTkFWIiBjb250ZW50PSJ0cnVlIiAvPgotPHRpdGxlPlJlZmVyZW5jZTwvdGl0bGU+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KKzx0aXRsZT5SZWZlcmVuY2U8L3RpdGxlPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KIDxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIC0gVmVyc2lvbiA0LjUuMyBCdWlsZCAwMiIgLz4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDEuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwMS5odG0KaW5kZXggY2M2MzAwZi4uZDBhODU2YjggMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDEuaHRtCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDEuaHRtCkBAIC00LDggKzQsOCBAQAogPGhlYWQ+CiA8IS0tIFJ1biBkYXRlID0gTWF5IDIxLCAyMDA3IDY6MzU6NTcgLS0+CiA8bWV0YSBuYW1lPSJPQUNfSUdOT1JFX1NLSVBfTkFWIiBjb250ZW50PSJ0cnVlIiAvPgotPHRpdGxlPldpemFyZHM8L3RpdGxlPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Cis8dGl0bGU+V2l6YXJkczwvdGl0bGU+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgogPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgLSBWZXJzaW9uIDQuNS4zIEJ1aWxkIDAyIiAvPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwMi5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDAyLmh0bQppbmRleCA4YTYzNzRiLi5iNWE5OWE5IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDAyLmh0bQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDAyLmh0bQpAQCAtNCw4ICs0LDggQEAKIDxoZWFkPgogPCEtLSBSdW4gZGF0ZSA9IE1heSAyMSwgMjAwNyA2OjM1OjU3IC0tPgogPG1ldGEgbmFtZT0iT0FDX0lHTk9SRV9TS0lQX05BViIgY29udGVudD0idHJ1ZSIgLz4KLTx0aXRsZT5Qcm9wZXJ0eSBwYWdlczwvdGl0bGU+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KKzx0aXRsZT5Qcm9wZXJ0eSBwYWdlczwvdGl0bGU+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgogPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgLSBWZXJzaW9uIDQuNS4zIEJ1aWxkIDAyIiAvPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwMy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDAzLmh0bQppbmRleCA1N2Q5NzcwLi41ODYwMWIxIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDAzLmh0bQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDAzLmh0bQpAQCAtNCw4ICs0LDggQEAKIDxoZWFkPgogPCEtLSBSdW4gZGF0ZSA9IE1heSAyMSwgMjAwNyA2OjM1OjU3IC0tPgogPG1ldGEgbmFtZT0iT0FDX0lHTk9SRV9TS0lQX05BViIgY29udGVudD0idHJ1ZSIgLz4KLTx0aXRsZT5HZW5lcmFsIGluZm9ybWF0aW9uPC90aXRsZT4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgorPHRpdGxlPkdlbmVyYWwgaW5mb3JtYXRpb248L3RpdGxlPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KIDxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIC0gVmVyc2lvbiA0LjUuMyBCdWlsZCAwMiIgLz4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDQuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwNC5odG0KaW5kZXggYjY5NWY2OC4uNzQ3NzVhOCAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwNC5odG0KKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwNC5odG0KQEAgLTQsOCArNCw4IEBACiA8aGVhZD4KIDwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDcgNjozNTo1NyAtLT4KIDxtZXRhIG5hbWU9Ik9BQ19JR05PUkVfU0tJUF9OQVYiIGNvbnRlbnQ9InRydWUiIC8+Ci08dGl0bGU+U2Vjb25kYXJ5IHRhYmxlIGluZm9ybWF0aW9uPC90aXRsZT4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgorPHRpdGxlPlNlY29uZGFyeSB0YWJsZSBpbmZvcm1hdGlvbjwvdGl0bGU+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgogPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgLSBWZXJzaW9uIDQuNS4zIEJ1aWxkIDAyIiAvPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwNS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDA1Lmh0bQppbmRleCA2ZmE3NWExLi5jOTA1YWFlIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDA1Lmh0bQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDA1Lmh0bQpAQCAtNCw4ICs0LDggQEAKIDxoZWFkPgogPCEtLSBSdW4gZGF0ZSA9IE1heSAyMSwgMjAwNyA2OjM1OjU3IC0tPgogPG1ldGEgbmFtZT0iT0FDX0lHTk9SRV9TS0lQX05BViIgY29udGVudD0idHJ1ZSIgLz4KLTx0aXRsZT5Jbmhlcml0YW5jZSBpbmZvcm1hdGlvbjwvdGl0bGU+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KKzx0aXRsZT5Jbmhlcml0YW5jZSBpbmZvcm1hdGlvbjwvdGl0bGU+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgogPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgLSBWZXJzaW9uIDQuNS4zIEJ1aWxkIDAyIiAvPgpAQCAtNDUsMTMgKzQ1LDEzIEBACiA8dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDUgcjFjMi10NSI+U3BlY2lmeSB0aGUgc3RyYXRlZ3kgdG8gdXNlIHdoZW4gbWFwcGluZyBhIGNsYXNzIG9yIGNsYXNzIGhpZXJhcmNoeToKIDx1bD4KIDxsaSB0eXBlPSJkaXNjIj4KLTxwPlNpbmdsZSB0YWJsZSAmbmRhc2g7IEFsbCBjbGFzc2VzIGluIHRoZSBoaWVyYXJjaHkgYXJlIG1hcHBlZCB0byBhIHNpbmdsZSB0YWJsZS48L3A+Cis8cD5TaW5nbGUgdGFibGUgLSBBbGwgY2xhc3NlcyBpbiB0aGUgaGllcmFyY2h5IGFyZSBtYXBwZWQgdG8gYSBzaW5nbGUgdGFibGUuPC9wPgogPC9saT4KIDxsaSB0eXBlPSJkaXNjIj4KLTxwPkpvaW5lZCAmbmRhc2g7IFRoZSByb290IG9mIHRoZSBoaWVyYXJjaHkgaXMgbWFwcGVkIHRvIGEgc2luZ2xlIHRhYmxlOyBlYWNoIGNoaWxkIG1hcHMgdG8gaXRzIG93biB0YWJsZS48L3A+Cis8cD5Kb2luZWQgLSBUaGUgcm9vdCBvZiB0aGUgaGllcmFyY2h5IGlzIG1hcHBlZCB0byBhIHNpbmdsZSB0YWJsZTsgZWFjaCBjaGlsZCBtYXBzIHRvIGl0cyBvd24gdGFibGUuPC9wPgogPC9saT4KIDxsaSB0eXBlPSJkaXNjIj4KLTxwPlRhYmxlIHBlciBjbGFzcyAmbmRhc2g7IEVhY2ggY2xhc3MgaXMgbWFwcGVkIHRvIGEgc2VwYXJhdGUgdGFibGUuPC9wPgorPHA+VGFibGUgcGVyIGNsYXNzIC0gRWFjaCBjbGFzcyBpcyBtYXBwZWQgdG8gYSBzZXBhcmF0ZSB0YWJsZS48L3A+CiA8L2xpPgogPC91bD4KIDwvdGQ+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDA2Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDYuaHRtCmluZGV4IGU2ZGVlNDAuLjQ1YjljMTIgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDYuaHRtCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDYuaHRtCkBAIC00LDggKzQsOCBAQAogPGhlYWQ+CiA8IS0tIFJ1biBkYXRlID0gTWF5IDIxLCAyMDA3IDY6MzU6NTcgLS0+CiA8bWV0YSBuYW1lPSJPQUNfSUdOT1JFX1NLSVBfTkFWIiBjb250ZW50PSJ0cnVlIiAvPgotPHRpdGxlPkpvaW4gVGFibGUgSW5mb3JtYXRpb248L3RpdGxlPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Cis8dGl0bGU+Sm9pbiBUYWJsZSBJbmZvcm1hdGlvbjwvdGl0bGU+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgogPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgLSBWZXJzaW9uIDQuNS4zIEJ1aWxkIDAyIiAvPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwNy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDA3Lmh0bQppbmRleCA5Y2E1MGNkLi5mYjUxZjJlIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDA3Lmh0bQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDA3Lmh0bQpAQCAtNCw4ICs0LDggQEAKIDxoZWFkPgogPCEtLSBSdW4gZGF0ZSA9IE1heSAyMSwgMjAwNyA2OjM1OjU3IC0tPgogPG1ldGEgbmFtZT0iT0FDX0lHTk9SRV9TS0lQX05BViIgY29udGVudD0idHJ1ZSIgLz4KLTx0aXRsZT5Kb2luIENvbHVtbnMgSW5mb3JtYXRpb248L3RpdGxlPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Cis8dGl0bGU+Sm9pbiBDb2x1bW5zIEluZm9ybWF0aW9uPC90aXRsZT4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+CiA8bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAtIFZlcnNpb24gNC41LjMgQnVpbGQgMDIiIC8+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDA4Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDguaHRtCmluZGV4IGVjOWI1NGQuLjhlODE5NzEgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDguaHRtCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDguaHRtCkBAIC00LDggKzQsOCBAQAogPGhlYWQ+CiA8IS0tIFJ1biBkYXRlID0gTWF5IDIxLCAyMDA3IDY6MzU6NTcgLS0+CiA8bWV0YSBuYW1lPSJPQUNfSUdOT1JFX1NLSVBfTkFWIiBjb250ZW50PSJ0cnVlIiAvPgotPHRpdGxlPkdlbmVyYWwgaW5mb3JtYXRpb248L3RpdGxlPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Cis8dGl0bGU+R2VuZXJhbCBpbmZvcm1hdGlvbjwvdGl0bGU+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgogPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgLSBWZXJzaW9uIDQuNS4zIEJ1aWxkIDAyIiAvPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwOS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDA5Lmh0bQppbmRleCBlZmMyY2Y3Li41YTg0ZGE1IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDA5Lmh0bQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDA5Lmh0bQpAQCAtNCw4ICs0LDggQEAKIDxoZWFkPgogPCEtLSBSdW4gZGF0ZSA9IE1heSAyMSwgMjAwNyA2OjM1OjU3IC0tPgogPG1ldGEgbmFtZT0iT0FDX0lHTk9SRV9TS0lQX05BViIgY29udGVudD0idHJ1ZSIgLz4KLTx0aXRsZT5QZXJzaXN0ZW5jZSBVbml0IGluZm9ybWF0aW9uPC90aXRsZT4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgorPHRpdGxlPlBlcnNpc3RlbmNlIFVuaXQgaW5mb3JtYXRpb248L3RpdGxlPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KIDxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIC0gVmVyc2lvbiA0LjUuMyBCdWlsZCAwMiIgLz4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTAuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxMC5odG0KaW5kZXggYmYwMmE2NC4uODdiZmM2YiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxMC5odG0KKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxMC5odG0KQEAgLTQsOCArNCw4IEBACiA8aGVhZD4KIDwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDcgNjozNTo1NyAtLT4KIDxtZXRhIG5hbWU9Ik9BQ19JR05PUkVfU0tJUF9OQVYiIGNvbnRlbnQ9InRydWUiIC8+Ci08dGl0bGU+UHJlZmVyZW5jZXM8L3RpdGxlPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Cis8dGl0bGU+UHJlZmVyZW5jZXM8L3RpdGxlPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KIDxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIC0gVmVyc2lvbiA0LjUuMyBCdWlsZCAwMiIgLz4KQEAgLTMyLDcgKzMyLDcgQEAKIDxwPlRoaXMgc2VjdGlvbiBpbmNsdWRlcyBpbmZvcm1hdGlvbiBvbiB0aGUgZm9sbG93aW5nIHByZWZlcmVuY2UgcGFnZXM6PC9wPgogPHVsPgogPGxpIHR5cGU9ImRpc2MiPgotPHA+PGEgaHJlZj0icmVmX3Byb2plY3RfcHJvcGVydGllcy5odG0jQkFCSkhCQ0kiPlByb2plY3QgUHJvcGVydGllcyBwYWdlICZuZGFzaDsgSlBBIE9wdGlvbnM8L2E+PC9wPgorPHA+PGEgaHJlZj0icmVmX3Byb2plY3RfcHJvcGVydGllcy5odG0jQkFCSkhCQ0kiPlByb2plY3QgUHJvcGVydGllcyBwYWdlIC0gSlBBIE9wdGlvbnM8L2E+PC9wPgogPC9saT4KIDwvdWw+CiA8IS0tIFN0YXJ0IEZvb3RlciAtLT4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTEuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxMS5odG0KaW5kZXggZmYwZWM5Ny4uOTQyZWFmNSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxMS5odG0KKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxMS5odG0KQEAgLTQsOCArNCw4IEBACiA8aGVhZD4KIDwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDcgNjozNTo1NyAtLT4KIDxtZXRhIG5hbWU9Ik9BQ19JR05PUkVfU0tJUF9OQVYiIGNvbnRlbnQ9InRydWUiIC8+Ci08dGl0bGU+RGlhbG9nczwvdGl0bGU+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KKzx0aXRsZT5EaWFsb2dzPC90aXRsZT4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+CiA8bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAtIFZlcnNpb24gNC41LjMgQnVpbGQgMDIiIC8+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDEyLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTIuaHRtCmluZGV4IDZjMDFjNjUuLjUxMGVjYjMgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTIuaHRtCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTIuaHRtCkBAIC00LDggKzQsOCBAQAogPGhlYWQ+CiA8IS0tIFJ1biBkYXRlID0gTWF5IDIxLCAyMDA3IDY6MzU6NTcgLS0+CiA8bWV0YSBuYW1lPSJPQUNfSUdOT1JFX1NLSVBfTkFWIiBjb250ZW50PSJ0cnVlIiAvPgotPHRpdGxlPkVkaXQgSm9pbiBDb2x1bW5zIERpYWxvZzwvdGl0bGU+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KKzx0aXRsZT5FZGl0IEpvaW4gQ29sdW1ucyBEaWFsb2c8L3RpdGxlPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KIDxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIC0gVmVyc2lvbiA0LjUuMyBCdWlsZCAwMiIgLz4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTMuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxMy5odG0KaW5kZXggOGY5ZGEyZi4uMDg5MzdlMiAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxMy5odG0KKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxMy5odG0KQEAgLTQsOCArNCw4IEBACiA8aGVhZD4KIDwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDcgNjozNTo1OCAtLT4KIDxtZXRhIG5hbWU9Ik9BQ19JR05PUkVfU0tJUF9OQVYiIGNvbnRlbnQ9InRydWUiIC8+Ci08dGl0bGU+SWNvbnMgYW5kIGJ1dHRvbnM8L3RpdGxlPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Cis8dGl0bGU+SWNvbnMgYW5kIGJ1dHRvbnM8L3RpdGxlPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KIDxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIC0gVmVyc2lvbiA0LjUuMyBCdWlsZCAwMiIgLz4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTQuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxNC5odG0KaW5kZXggMjJlOTI5Mi4uMDQzZDBhMCAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxNC5odG0KKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxNC5odG0KQEAgLTQsOCArNCw4IEBACiA8aGVhZD4KIDwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDcgNjozNTo1OCAtLT4KIDxtZXRhIG5hbWU9Ik9BQ19JR05PUkVfU0tJUF9OQVYiIGNvbnRlbnQ9InRydWUiIC8+Ci08dGl0bGU+SWNvbnM8L3RpdGxlPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Cis8dGl0bGU+SWNvbnM8L3RpdGxlPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KIDxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIC0gVmVyc2lvbiA0LjUuMyBCdWlsZCAwMiIgLz4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTUuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxNS5odG0KaW5kZXggNDBlMWVmMi4uMzc1MzFiZSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxNS5odG0KKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxNS5odG0KQEAgLTQsOCArNCw4IEBACiA8aGVhZD4KIDwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDcgNjozNTo1OCAtLT4KIDxtZXRhIG5hbWU9Ik9BQ19JR05PUkVfU0tJUF9OQVYiIGNvbnRlbnQ9InRydWUiIC8+Ci08dGl0bGU+QnV0dG9uczwvdGl0bGU+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KKzx0aXRsZT5CdXR0b25zPC90aXRsZT4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+CiA8bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAtIFZlcnNpb24gNC41LjMgQnVpbGQgMDIiIC8+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDE2Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTYuaHRtCmluZGV4IDdjN2M1MjcuLjcwMTI3NDMgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTYuaHRtCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTYuaHRtCkBAIC00LDggKzQsOCBAQAogPGhlYWQ+CiA8IS0tIFJ1biBkYXRlID0gTWF5IDIxLCAyMDA3IDY6MzU6NTggLS0+CiA8bWV0YSBuYW1lPSJPQUNfSUdOT1JFX1NLSVBfTkFWIiBjb250ZW50PSJ0cnVlIiAvPgotPHRpdGxlPkphdmFkb2M8L3RpdGxlPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Cis8dGl0bGU+SmF2YWRvYzwvdGl0bGU+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgogPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgLSBWZXJzaW9uIDQuNS4zIEJ1aWxkIDAyIiAvPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxNy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDE3Lmh0bQppbmRleCA2NzYxMjI5Li4wODBkMDkyIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDE3Lmh0bQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDE3Lmh0bQpAQCAtNCw4ICs0LDggQEAKIDxoZWFkPgogPCEtLSBSdW4gZGF0ZSA9IE1heSAyMSwgMjAwNyA2OjM1OjU4IC0tPgogPG1ldGEgbmFtZT0iT0FDX0lHTk9SRV9TS0lQX05BViIgY29udGVudD0idHJ1ZSIgLz4KLTx0aXRsZT5EYWxpIERldmVsb3BlciBEb2N1bWVudGF0aW9uPC90aXRsZT4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgorPHRpdGxlPkRhbGkgRGV2ZWxvcGVyIERvY3VtZW50YXRpb248L3RpdGxlPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KIDxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIC0gVmVyc2lvbiA0LjUuMyBCdWlsZCAwMiIgLz4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19hZGRfcGVyc2lzdGVuY2UuaHRtCmluZGV4IDk0NjNjOGIuLmZiYjFlZDAgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0KKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bQpAQCAtNCw4ICs0LDggQEAKIDxoZWFkPgogPCEtLSBSdW4gZGF0ZSA9IE1heSAyMSwgMjAwNyA2OjM1OjU0IC0tPgogPG1ldGEgbmFtZT0iT0FDX0lHTk9SRV9TS0lQX05BViIgY29udGVudD0idHJ1ZSIgLz4KLTx0aXRsZT5BZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzczwvdGl0bGU+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KKzx0aXRsZT5BZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzczwvdGl0bGU+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgogPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgLSBWZXJzaW9uIDQuNS4zIEJ1aWxkIDAyIiAvPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfYWRkaXRvbmFsX3RhYmxlcy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19hZGRpdG9uYWxfdGFibGVzLmh0bQppbmRleCAwNjc0ZmNkLi4xNDE2MjA1IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19hZGRpdG9uYWxfdGFibGVzLmh0bQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19hZGRpdG9uYWxfdGFibGVzLmh0bQpAQCAtNCw4ICs0LDggQEAKIDxoZWFkPgogPCEtLSBSdW4gZGF0ZSA9IE1heSAyMSwgMjAwNyA2OjM1OjU0IC0tPgogPG1ldGEgbmFtZT0iT0FDX0lHTk9SRV9TS0lQX05BViIgY29udGVudD0idHJ1ZSIgLz4KLTx0aXRsZT5TcGVjaWZ5aW5nIGFkZGl0aW9uYWwgdGFibGVzPC90aXRsZT4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgorPHRpdGxlPlNwZWNpZnlpbmcgYWRkaXRpb25hbCB0YWJsZXM8L3RpdGxlPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KIDxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIC0gVmVyc2lvbiA0LjUuMyBCdWlsZCAwMiIgLz4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX2NyZWF0ZV9uZXdfcHJvamVjdC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtCmluZGV4IDYxMjM5NTYuLmI2ZDMzZmEgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX2NyZWF0ZV9uZXdfcHJvamVjdC5odG0KKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bQpAQCAtNCw4ICs0LDggQEAKIDxoZWFkPgogPCEtLSBSdW4gZGF0ZSA9IE1heSAyMSwgMjAwNyA2OjM1OjUzIC0tPgogPG1ldGEgbmFtZT0iT0FDX0lHTk9SRV9TS0lQX05BViIgY29udGVudD0idHJ1ZSIgLz4KLTx0aXRsZT5DcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdDwvdGl0bGU+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KKzx0aXRsZT5DcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdDwvdGl0bGU+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgogPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgLSBWZXJzaW9uIDQuNS4zIEJ1aWxkIDAyIiAvPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfZ2VuZXJhdGVfZW50aXRpZXMuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfZ2VuZXJhdGVfZW50aXRpZXMuaHRtCmluZGV4IDRhYzFiMDkuLjc0M2VjZTEgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX2dlbmVyYXRlX2VudGl0aWVzLmh0bQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19nZW5lcmF0ZV9lbnRpdGllcy5odG0KQEAgLTQsOCArNCw4IEBACiA8aGVhZD4KIDwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDcgNjozNTo1NyAtLT4KIDxtZXRhIG5hbWU9Ik9BQ19JR05PUkVfU0tJUF9OQVYiIGNvbnRlbnQ9InRydWUiIC8+Ci08dGl0bGU+R2VuZXJhdGUgRW50aXRpZXMgZnJvbSBUYWJsZXMgZGlhbG9nPC90aXRsZT4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgorPHRpdGxlPkdlbmVyYXRlIEVudGl0aWVzIGZyb20gVGFibGVzIGRpYWxvZzwvdGl0bGU+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgogPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgLSBWZXJzaW9uIDQuNS4zIEJ1aWxkIDAyIiAvPgpAQCAtNTAsNyArNTAsNyBAQAogPC90cj4KIDx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgogPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MTMiIGhlYWRlcnM9InIxYzEtdDEzIj5UYWJsZXM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQxMyByMWMyLXQxMyI+U2VsZWN0IHRoZSB0YWJsZXMgZnJvbSB3aGljaCB0byBjcmVhdGUgSmF2YSBwZXJzaXN0ZW50IGVudGl0aWVzLiBUaGUgdGFibGVzIHNob3duIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIHRoYXQgeW91IGRlZmluZWQgaW4gdGhlIDxhIGhyZWY9InJlZl9wcm9qZWN0X3Byb3BlcnRpZXMuaHRtI0JBQkpIQkNJIj5Qcm9qZWN0IFByb3BlcnRpZXMgcGFnZSAmbmRhc2g7IEpQQSBPcHRpb25zPC9hPi48L3RkPgorPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQxMyByMWMyLXQxMyI+U2VsZWN0IHRoZSB0YWJsZXMgZnJvbSB3aGljaCB0byBjcmVhdGUgSmF2YSBwZXJzaXN0ZW50IGVudGl0aWVzLiBUaGUgdGFibGVzIHNob3duIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIHRoYXQgeW91IGRlZmluZWQgaW4gdGhlIDxhIGhyZWY9InJlZl9wcm9qZWN0X3Byb3BlcnRpZXMuaHRtI0JBQkpIQkNJIj5Qcm9qZWN0IFByb3BlcnRpZXMgcGFnZSAtIEpQQSBPcHRpb25zPC9hPi48L3RkPgogPC90cj4KIDwvdGJvZHk+CiA8L3RhYmxlPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfaW5oZXJpdGFuY2UuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfaW5oZXJpdGFuY2UuaHRtCmluZGV4IDkwNzM3NjQuLjQyMDE1YzAgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX2luaGVyaXRhbmNlLmh0bQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19pbmhlcml0YW5jZS5odG0KQEAgLTQsOCArNCw4IEBACiA8aGVhZD4KIDwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDcgNjozNTo1NCAtLT4KIDxtZXRhIG5hbWU9Ik9BQ19JR05PUkVfU0tJUF9OQVYiIGNvbnRlbnQ9InRydWUiIC8+Ci08dGl0bGU+U3BlY2lmeWluZyBlbnRpdHkgaW5oZXJpdGFuY2U8L3RpdGxlPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Cis8dGl0bGU+U3BlY2lmeWluZyBlbnRpdHkgaW5oZXJpdGFuY2U8L3RpdGxlPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KIDxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIC0gVmVyc2lvbiA0LjUuMyBCdWlsZCAwMiIgLz4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX21hbmFnZV9vcm0uaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfbWFuYWdlX29ybS5odG0KaW5kZXggNTI0NmVmYy4uYzc0OWQ5NyAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfbWFuYWdlX29ybS5odG0KKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfbWFuYWdlX29ybS5odG0KQEAgLTQsOCArNCw4IEBACiA8aGVhZD4KIDwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDcgNjozNTo1NCAtLT4KIDxtZXRhIG5hbWU9Ik9BQ19JR05PUkVfU0tJUF9OQVYiIGNvbnRlbnQ9InRydWUiIC8+Ci08dGl0bGU+TWFuYWdpbmcgdGhlIG9ybS54bWwgZmlsZTwvdGl0bGU+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KKzx0aXRsZT5NYW5hZ2luZyB0aGUgb3JtLnhtbCBmaWxlPC90aXRsZT4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+CiA8bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAtIFZlcnNpb24gNC41LjMgQnVpbGQgMDIiIC8+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19tYW5hZ2VfcGVyc2lzdGVuY2UuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfbWFuYWdlX3BlcnNpc3RlbmNlLmh0bQppbmRleCA4MTUwNTE5Li4xOGJkODY0IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19tYW5hZ2VfcGVyc2lzdGVuY2UuaHRtCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX21hbmFnZV9wZXJzaXN0ZW5jZS5odG0KQEAgLTQsOCArNCw4IEBACiA8aGVhZD4KIDwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDcgNjozNTo1MyAtLT4KIDxtZXRhIG5hbWU9Ik9BQ19JR05PUkVfU0tJUF9OQVYiIGNvbnRlbnQ9InRydWUiIC8+Ci08dGl0bGU+TWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlPC90aXRsZT4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgorPHRpdGxlPk1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZTwvdGl0bGU+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgogPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgLSBWZXJzaW9uIDQuNS4zIEJ1aWxkIDAyIiAvPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfbWFwcGluZy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19tYXBwaW5nLmh0bQppbmRleCBlOWJiMWMzLi44YzFkNmRmIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19tYXBwaW5nLmh0bQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19tYXBwaW5nLmh0bQpAQCAtNCw4ICs0LDggQEAKIDxoZWFkPgogPCEtLSBSdW4gZGF0ZSA9IE1heSAyMSwgMjAwNyA2OjM1OjU1IC0tPgogPG1ldGEgbmFtZT0iT0FDX0lHTk9SRV9TS0lQX05BViIgY29udGVudD0idHJ1ZSIgLz4KLTx0aXRsZT5NYXBwaW5nIGFuIGVudGl0eTwvdGl0bGU+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KKzx0aXRsZT5NYXBwaW5nIGFuIGVudGl0eTwvdGl0bGU+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgogPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgLSBWZXJzaW9uIDQuNS4zIEJ1aWxkIDAyIiAvPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrcy5odG0KaW5kZXggMGUxYjI3Yy4uNzIwOTgzMyAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzLmh0bQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MuaHRtCkBAIC00LDggKzQsOCBAQAogPGhlYWQ+CiA8IS0tIFJ1biBkYXRlID0gTWF5IDIxLCAyMDA3IDY6MzU6NTMgLS0+CiA8bWV0YSBuYW1lPSJPQUNfSUdOT1JFX1NLSVBfTkFWIiBjb250ZW50PSJ0cnVlIiAvPgotPHRpdGxlPlRhc2tzPC90aXRsZT4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgorPHRpdGxlPlRhc2tzPC90aXRsZT4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+CiA8bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAtIFZlcnNpb24gNC41LjMgQnVpbGQgMDIiIC8+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDEuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDAxLmh0bQppbmRleCA0OGUzYzEzLi41YjY0M2E0IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDEuaHRtCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwMS5odG0KQEAgLTQsOCArNCw4IEBACiA8aGVhZD4KIDwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDcgNjozNTo1MyAtLT4KIDxtZXRhIG5hbWU9Ik9BQ19JR05PUkVfU0tJUF9OQVYiIGNvbnRlbnQ9InRydWUiIC8+Ci08dGl0bGU+V29ya2luZyB3aXRoIHBlcnNpc3RlbmNlLnhtbCBmaWxlPC90aXRsZT4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgorPHRpdGxlPldvcmtpbmcgd2l0aCBwZXJzaXN0ZW5jZS54bWwgZmlsZTwvdGl0bGU+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgogPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgLSBWZXJzaW9uIDQuNS4zIEJ1aWxkIDAyIiAvPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDAyLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwMi5odG0KaW5kZXggMTNhYTIyYi4uMmYxMTI5YyAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDAyLmh0bQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDIuaHRtCkBAIC00LDggKzQsOCBAQAogPGhlYWQ+CiA8IS0tIFJ1biBkYXRlID0gTWF5IDIxLCAyMDA3IDY6MzU6NTQgLS0+CiA8bWV0YSBuYW1lPSJPQUNfSUdOT1JFX1NLSVBfTkFWIiBjb250ZW50PSJ0cnVlIiAvPgotPHRpdGxlPlN5bmNocm9uaXppbmcgY2xhc3NlczwvdGl0bGU+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KKzx0aXRsZT5TeW5jaHJvbml6aW5nIGNsYXNzZXM8L3RpdGxlPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KIDxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIC0gVmVyc2lvbiA0LjUuMyBCdWlsZCAwMiIgLz4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwMy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDMuaHRtCmluZGV4IDQwMDA5MWQuLmM2NTIzNjUgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwMy5odG0KKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDAzLmh0bQpAQCAtNCw4ICs0LDggQEAKIDxoZWFkPgogPCEtLSBSdW4gZGF0ZSA9IE1heSAyMSwgMjAwNyA2OjM1OjU0IC0tPgogPG1ldGEgbmFtZT0iT0FDX0lHTk9SRV9TS0lQX05BViIgY29udGVudD0idHJ1ZSIgLz4KLTx0aXRsZT5Xb3JraW5nIHdpdGggb3JtLnhtbCBmaWxlPC90aXRsZT4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgorPHRpdGxlPldvcmtpbmcgd2l0aCBvcm0ueG1sIGZpbGU8L3RpdGxlPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KIDxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIC0gVmVyc2lvbiA0LjUuMyBCdWlsZCAwMiIgLz4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwNC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDQuaHRtCmluZGV4IGZlZGRmNGQuLjEzMzBiMDQgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwNC5odG0KKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDA0Lmh0bQpAQCAtNCw4ICs0LDggQEAKIDxoZWFkPgogPCEtLSBSdW4gZGF0ZSA9IE1heSAyMSwgMjAwNyA2OjM1OjU0IC0tPgogPG1ldGEgbmFtZT0iT0FDX0lHTk9SRV9TS0lQX05BViIgY29udGVudD0idHJ1ZSIgLz4KLTx0aXRsZT5FbnRpdHk8L3RpdGxlPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Cis8dGl0bGU+RW50aXR5PC90aXRsZT4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+CiA8bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAtIFZlcnNpb24gNC41LjMgQnVpbGQgMDIiIC8+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDUuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDA1Lmh0bQppbmRleCAxZDIyMGRkLi40ZmVhM2UwIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDUuaHRtCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwNS5odG0KQEAgLTQsOCArNCw4IEBACiA8aGVhZD4KIDwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDcgNjozNTo1NCAtLT4KIDxtZXRhIG5hbWU9Ik9BQ19JR05PUkVfU0tJUF9OQVYiIGNvbnRlbnQ9InRydWUiIC8+Ci08dGl0bGU+RW1iZWRkYWJsZTwvdGl0bGU+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KKzx0aXRsZT5FbWJlZGRhYmxlPC90aXRsZT4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+CiA8bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAtIFZlcnNpb24gNC41LjMgQnVpbGQgMDIiIC8+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDYuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDA2Lmh0bQppbmRleCA3NDg2MjA5Li4wMDEyYWEyIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDYuaHRtCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwNi5odG0KQEAgLTQsOCArNCw4IEBACiA8aGVhZD4KIDwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDcgNjozNTo1NCAtLT4KIDxtZXRhIG5hbWU9Ik9BQ19JR05PUkVfU0tJUF9OQVYiIGNvbnRlbnQ9InRydWUiIC8+Ci08dGl0bGU+TWFwcGVkIHN1cGVyY2xhc3M8L3RpdGxlPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Cis8dGl0bGU+TWFwcGVkIHN1cGVyY2xhc3M8L3RpdGxlPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KIDxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIC0gVmVyc2lvbiA0LjUuMyBCdWlsZCAwMiIgLz4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwNy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDcuaHRtCmluZGV4IDEwYmI0Y2IuLjRhZDNlZjYgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwNy5odG0KKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDA3Lmh0bQpAQCAtNCw4ICs0LDggQEAKIDxoZWFkPgogPCEtLSBSdW4gZGF0ZSA9IE1heSAyMSwgMjAwNyA2OjM1OjU1IC0tPgogPG1ldGEgbmFtZT0iT0FDX0lHTk9SRV9TS0lQX05BViIgY29udGVudD0idHJ1ZSIgLz4KLTx0aXRsZT5CYXNpYyBtYXBwaW5nPC90aXRsZT4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgorPHRpdGxlPkJhc2ljIG1hcHBpbmc8L3RpdGxlPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KIDxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIC0gVmVyc2lvbiA0LjUuMyBCdWlsZCAwMiIgLz4KQEAgLTEwMywxNiArMTAzLDE2IEBACiA8dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDQgcjFjMi10NCI+VGhlIGRhdGFiYXNlIGNvbHVtbiBtYXBwZWQgdG8gdGhlIGVudGl0eSBhdHRyaWJ1dGUuIFNlZSA8YSBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNDQUNHQ0JIQiI+IkNvbHVtbiI8L2E+IGZvciBkZXRhaWxzLgogPHVsPgogPGxpIHR5cGU9ImRpc2MiPgotPHA+TmFtZSAmbmRhc2g7IE5hbWUgb2YgdGhlIGRhdGFiYXNlIGNvbHVtbi48L3A+Cis8cD5OYW1lIC0gTmFtZSBvZiB0aGUgZGF0YWJhc2UgY29sdW1uLjwvcD4KIDwvbGk+CiA8bGkgdHlwZT0iZGlzYyI+Ci08cD5UYWJsZSAmbmRhc2g7IE5hbWUgb2YgdGhlIGRhdGFiYXNlIHRhYmxlLjwvcD4KKzxwPlRhYmxlIC0gTmFtZSBvZiB0aGUgZGF0YWJhc2UgdGFibGUuPC9wPgogPC9saT4KIDxsaSB0eXBlPSJkaXNjIj4KLTxwPkluc2VydGFibGUgJm5kYXNoOyBTcGVjaWZ5IGlmIHRoZSBjb2x1bW4gaXMgYWx3YXlzIGluY2x1ZGVkIGluIDxjb2RlPlNRTCBJTlNFUlQ8L2NvZGU+IHN0YXRlbWVudHMuPC9wPgorPHA+SW5zZXJ0YWJsZSAtIFNwZWNpZnkgaWYgdGhlIGNvbHVtbiBpcyBhbHdheXMgaW5jbHVkZWQgaW4gPGNvZGU+U1FMIElOU0VSVDwvY29kZT4gc3RhdGVtZW50cy48L3A+CiA8L2xpPgogPGxpIHR5cGU9ImRpc2MiPgotPHA+VXBkYXRhYmxlICZuZGFzaDsgU3BlY2lmeSBpZiB0aGUgY29sdW1uIGlzIGFsd2F5cyBpbmNsdWRlZCBpbiA8Y29kZT5TUUwgVVBEQVRFPC9jb2RlPiBzdGF0ZW1lbnRzLjwvcD4KKzxwPlVwZGF0YWJsZSAtIFNwZWNpZnkgaWYgdGhlIGNvbHVtbiBpcyBhbHdheXMgaW5jbHVkZWQgaW4gPGNvZGU+U1FMIFVQREFURTwvY29kZT4gc3RhdGVtZW50cy48L3A+CiA8L2xpPgogPC91bD4KIDwvdGQ+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDguaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDA4Lmh0bQppbmRleCBmNjIxYTM3Li5iZGJiYTcxIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDguaHRtCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwOC5odG0KQEAgLTQsOCArNCw4IEBACiA8aGVhZD4KIDwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDcgNjozNTo1NSAtLT4KIDxtZXRhIG5hbWU9Ik9BQ19JR05PUkVfU0tJUF9OQVYiIGNvbnRlbnQ9InRydWUiIC8+Ci08dGl0bGU+RW1iZWRkZWQgbWFwcGluZzwvdGl0bGU+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KKzx0aXRsZT5FbWJlZGRlZCBtYXBwaW5nPC90aXRsZT4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+CiA8bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAtIFZlcnNpb24gNC41LjMgQnVpbGQgMDIiIC8+CkBAIC02NiwxNiArNjYsMTYgQEAKIDx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10NSByMWMyLXQ1Ij5UaGUgZGF0YWJhc2UgY29sdW1uIChhbmQgaXRzIHRhYmxlKSBtYXBwZWQgdG8gdGhlIGVudGl0eSBhdHRyaWJ1dGUuIFNlZSA8YSBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNDQUNHQ0JIQiI+IkNvbHVtbiI8L2E+IGZvciBkZXRhaWxzLgogPHVsPgogPGxpIHR5cGU9ImRpc2MiPgotPHA+TmFtZSAmbmRhc2g7IE5hbWUgb2YgdGhlIGRhdGFiYXNlIGNvbHVtbi48L3A+Cis8cD5OYW1lIC0gTmFtZSBvZiB0aGUgZGF0YWJhc2UgY29sdW1uLjwvcD4KIDwvbGk+CiA8bGkgdHlwZT0iZGlzYyI+Ci08cD5UYWJsZSAmbmRhc2g7IE5hbWUgb2YgdGhlIGRhdGFiYXNlIHRhYmxlLjwvcD4KKzxwPlRhYmxlIC0gTmFtZSBvZiB0aGUgZGF0YWJhc2UgdGFibGUuPC9wPgogPC9saT4KIDxsaSB0eXBlPSJkaXNjIj4KLTxwPkluc2VydGFibGUgJm5kYXNoOyBTcGVjaWZ5IGlmIHRoZSBjb2x1bW4gaXMgYWx3YXlzIGluY2x1ZGVkIGluIDxjb2RlPlNRTCBJTlNFUlQ8L2NvZGU+IHN0YXRlbWVudHMuPC9wPgorPHA+SW5zZXJ0YWJsZSAtIFNwZWNpZnkgaWYgdGhlIGNvbHVtbiBpcyBhbHdheXMgaW5jbHVkZWQgaW4gPGNvZGU+U1FMIElOU0VSVDwvY29kZT4gc3RhdGVtZW50cy48L3A+CiA8L2xpPgogPGxpIHR5cGU9ImRpc2MiPgotPHA+VXBkYXRhYmxlICZuZGFzaDsgU3BlY2lmeSBpZiB0aGUgY29sdW1uIGlzIGFsd2F5cyBpbmNsdWRlZCBpbiA8Y29kZT5TUUwgVVBEQVRFPC9jb2RlPiBzdGF0ZW1lbnRzLjwvcD4KKzxwPlVwZGF0YWJsZSAtIFNwZWNpZnkgaWYgdGhlIGNvbHVtbiBpcyBhbHdheXMgaW5jbHVkZWQgaW4gPGNvZGU+U1FMIFVQREFURTwvY29kZT4gc3RhdGVtZW50cy48L3A+CiA8L2xpPgogPC91bD4KIDwvdGQ+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDkuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDA5Lmh0bQppbmRleCAxZGY5NjQ4Li42OTk5ZGQxIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDkuaHRtCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwOS5odG0KQEAgLTQsOCArNCw4IEBACiA8aGVhZD4KIDwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDcgNjozNTo1NSAtLT4KIDxtZXRhIG5hbWU9Ik9BQ19JR05PUkVfU0tJUF9OQVYiIGNvbnRlbnQ9InRydWUiIC8+Ci08dGl0bGU+RW1iZWRkZWQgSUQgbWFwcGluZzwvdGl0bGU+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KKzx0aXRsZT5FbWJlZGRlZCBJRCBtYXBwaW5nPC90aXRsZT4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+CiA8bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAtIFZlcnNpb24gNC41LjMgQnVpbGQgMDIiIC8+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTAuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDEwLmh0bQppbmRleCBlOGE0MzgwLi41NDcyMDc4IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTAuaHRtCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxMC5odG0KQEAgLTQsOCArNCw4IEBACiA8aGVhZD4KIDwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDcgNjozNTo1NSAtLT4KIDxtZXRhIG5hbWU9Ik9BQ19JR05PUkVfU0tJUF9OQVYiIGNvbnRlbnQ9InRydWUiIC8+Ci08dGl0bGU+SUQgbWFwcGluZzwvdGl0bGU+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KKzx0aXRsZT5JRCBtYXBwaW5nPC90aXRsZT4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+CiA8bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAtIFZlcnNpb24gNC41LjMgQnVpbGQgMDIiIC8+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTEuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDExLmh0bQppbmRleCBkOGMyZmY5Li5hZTEyY2MwIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTEuaHRtCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxMS5odG0KQEAgLTQsOCArNCw4IEBACiA8aGVhZD4KIDwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDcgNjozNTo1NSAtLT4KIDxtZXRhIG5hbWU9Ik9BQ19JR05PUkVfU0tJUF9OQVYiIGNvbnRlbnQ9InRydWUiIC8+Ci08dGl0bGU+TWFueS10by1tYW55IG1hcHBpbmc8L3RpdGxlPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Cis8dGl0bGU+TWFueS10by1tYW55IG1hcHBpbmc8L3RpdGxlPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KIDxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIC0gVmVyc2lvbiA0LjUuMyBCdWlsZCAwMiIgLz4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxMi5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTIuaHRtCmluZGV4IDcxYmNmM2QuLjgyYWJjNTMgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxMi5odG0KKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDEyLmh0bQpAQCAtNCw4ICs0LDggQEAKIDxoZWFkPgogPCEtLSBSdW4gZGF0ZSA9IE1heSAyMSwgMjAwNyA2OjM1OjU1IC0tPgogPG1ldGEgbmFtZT0iT0FDX0lHTk9SRV9TS0lQX05BViIgY29udGVudD0idHJ1ZSIgLz4KLTx0aXRsZT5NYW55LXRvLW9uZSBtYXBwaW5nPC90aXRsZT4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgorPHRpdGxlPk1hbnktdG8tb25lIG1hcHBpbmc8L3RpdGxlPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KIDxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIC0gVmVyc2lvbiA0LjUuMyBCdWlsZCAwMiIgLz4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxMy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTMuaHRtCmluZGV4IDYxYTcyYWYuLjVjNWFjMDkgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxMy5odG0KKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDEzLmh0bQpAQCAtNCw4ICs0LDggQEAKIDxoZWFkPgogPCEtLSBSdW4gZGF0ZSA9IE1heSAyMSwgMjAwNyA2OjM1OjU1IC0tPgogPG1ldGEgbmFtZT0iT0FDX0lHTk9SRV9TS0lQX05BViIgY29udGVudD0idHJ1ZSIgLz4KLTx0aXRsZT5PbmUtdG8tbWFueSBtYXBwaW5nPC90aXRsZT4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgorPHRpdGxlPk9uZS10by1tYW55IG1hcHBpbmc8L3RpdGxlPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KIDxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIC0gVmVyc2lvbiA0LjUuMyBCdWlsZCAwMiIgLz4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxNC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTQuaHRtCmluZGV4IDk5ZDI5ZmEuLmM2N2NiZDYgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxNC5odG0KKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDE0Lmh0bQpAQCAtNCw4ICs0LDggQEAKIDxoZWFkPgogPCEtLSBSdW4gZGF0ZSA9IE1heSAyMSwgMjAwNyA2OjM1OjU2IC0tPgogPG1ldGEgbmFtZT0iT0FDX0lHTk9SRV9TS0lQX05BViIgY29udGVudD0idHJ1ZSIgLz4KLTx0aXRsZT5PbmUtdG8tb25lIG1hcHBpbmc8L3RpdGxlPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Cis8dGl0bGU+T25lLXRvLW9uZSBtYXBwaW5nPC90aXRsZT4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+CiA8bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAtIFZlcnNpb24gNC41LjMgQnVpbGQgMDIiIC8+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTUuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDE1Lmh0bQppbmRleCA5MjY0M2M0Li5hY2Y5MjE1IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTUuaHRtCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxNS5odG0KQEAgLTQsOCArNCw4IEBACiA8aGVhZD4KIDwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDcgNjozNTo1NiAtLT4KIDxtZXRhIG5hbWU9Ik9BQ19JR05PUkVfU0tJUF9OQVYiIGNvbnRlbnQ9InRydWUiIC8+Ci08dGl0bGU+VHJhbnNpZW50IG1hcHBpbmc8L3RpdGxlPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Cis8dGl0bGU+VHJhbnNpZW50IG1hcHBpbmc8L3RpdGxlPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KIDxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIC0gVmVyc2lvbiA0LjUuMyBCdWlsZCAwMiIgLz4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxNi5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTYuaHRtCmluZGV4IDMwNDNkZTUuLmMxYjQyOTEgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxNi5odG0KKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDE2Lmh0bQpAQCAtNCw4ICs0LDggQEAKIDxoZWFkPgogPCEtLSBSdW4gZGF0ZSA9IE1heSAyMSwgMjAwNyA2OjM1OjU2IC0tPgogPG1ldGEgbmFtZT0iT0FDX0lHTk9SRV9TS0lQX05BViIgY29udGVudD0idHJ1ZSIgLz4KLTx0aXRsZT5WZXJzaW9uIG1hcHBpbmc8L3RpdGxlPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Cis8dGl0bGU+VmVyc2lvbiBtYXBwaW5nPC90aXRsZT4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+CiA8bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAtIFZlcnNpb24gNC41LjMgQnVpbGQgMDIiIC8+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTcuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDE3Lmh0bQppbmRleCA1NzE0NDhmLi43OTU5YWQzIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTcuaHRtCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxNy5odG0KQEAgLTQsOCArNCw4IEBACiA8aGVhZD4KIDwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDcgNjozNTo1NiAtLT4KIDxtZXRhIG5hbWU9Ik9BQ19JR05PUkVfU0tJUF9OQVYiIGNvbnRlbnQ9InRydWUiIC8+Ci08dGl0bGU+R2VuZXJhdGluZyBlbnRpdGllcyBmcm9tIHRhYmxlczwvdGl0bGU+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KKzx0aXRsZT5HZW5lcmF0aW5nIGVudGl0aWVzIGZyb20gdGFibGVzPC90aXRsZT4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+CiA8bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAtIFZlcnNpb24gNC41LjMgQnVpbGQgMDIiIC8+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTguaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDE4Lmh0bQppbmRleCBlOWNlZTBlLi45ODZiNGZhIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTguaHRtCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxOC5odG0KQEAgLTQsOCArNCw4IEBACiA8aGVhZD4KIDwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDcgNjozNTo1NiAtLT4KIDxtZXRhIG5hbWU9Ik9BQ19JR05PUkVfU0tJUF9OQVYiIGNvbnRlbnQ9InRydWUiIC8+Ci08dGl0bGU+VmFsaWRhdGluZyBtYXBwaW5ncyBhbmQgcmVwb3J0aW5nIHByb2JsZW1zPC90aXRsZT4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgorPHRpdGxlPlZhbGlkYXRpbmcgbWFwcGluZ3MgYW5kIHJlcG9ydGluZyBwcm9ibGVtczwvdGl0bGU+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgogPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgLSBWZXJzaW9uIDQuNS4zIEJ1aWxkIDAyIiAvPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDE5Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxOS5odG0KaW5kZXggMDYwYWUyZC4uMWVhODg1MCAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDE5Lmh0bQorKysgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTkuaHRtCkBAIC00LDggKzQsOCBAQAogPGhlYWQ+CiA8IS0tIFJ1biBkYXRlID0gTWF5IDIxLCAyMDA3IDY6MzU6NTYgLS0+CiA8bWV0YSBuYW1lPSJPQUNfSUdOT1JFX1NLSVBfTkFWIiBjb250ZW50PSJ0cnVlIiAvPgotPHRpdGxlPkVycm9yIG1lc3NhZ2VzPC90aXRsZT4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgorPHRpdGxlPkVycm9yIG1lc3NhZ2VzPC90aXRsZT4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+CiA8bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAtIFZlcnNpb24gNC41LjMgQnVpbGQgMDIiIC8+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMjAuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDIwLmh0bQppbmRleCAzY2M4ZWQ4Li4wMTg2MWRmIDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMjAuaHRtCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAyMC5odG0KQEAgLTQsOCArNCw4IEBACiA8aGVhZD4KIDwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDcgNjozNTo1NiAtLT4KIDxtZXRhIG5hbWU9Ik9BQ19JR05PUkVfU0tJUF9OQVYiIGNvbnRlbnQ9InRydWUiIC8+Ci08dGl0bGU+V2FybmluZyBtZXNzYWdlczwvdGl0bGU+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KKzx0aXRsZT5XYXJuaW5nIG1lc3NhZ2VzPC90aXRsZT4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+CiA8bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAtIFZlcnNpb24gNC41LjMgQnVpbGQgMDIiIC8+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMjEuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDIxLmh0bQppbmRleCAxNmJkMThiLi5mMDk1NmI3IDEwMDY0NAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMjEuaHRtCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAyMS5odG0KQEAgLTQsOCArNCw4IEBACiA8aGVhZD4KIDwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDcgNjozNTo1NiAtLT4KIDxtZXRhIG5hbWU9Ik9BQ19JR05PUkVfU0tJUF9OQVYiIGNvbnRlbnQ9InRydWUiIC8+Ci08dGl0bGU+TW9kaWZ5aW5nIHBlcnNpc3RlbnQgcHJvamVjdCBwcm9wZXJ0aWVzPC90aXRsZT4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgorPHRpdGxlPk1vZGlmeWluZyBwZXJzaXN0ZW50IHByb2plY3QgcHJvcGVydGllczwvdGl0bGU+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgogPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgLSBWZXJzaW9uIDQuNS4zIEJ1aWxkIDAyIiAvPgpAQCAtMzUsMTEgKzM1LDExIEBACiA8bGk+CiA8cD5SaWdodC1jbGljayB0aGUgcHJvamVjdCBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkV4cGxvcmVyPC9zcGFuPiB2aWV3IGFuZCBzZWxlY3QgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtYWN0aW9uIj5Qcm9wZXJ0aWVzPC9zcGFuPi4gVGhlIFByb3BlcnRpZXMgcGFnZSBhcHBlYXJzLjwvcD4KIDxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjE4NCIgbmFtZT0ic3RocmVmMTg0Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+UHJvcGVydGllcyAmbmRhc2g7IFBlcnNpc3RlbmNlIFBhZ2U8L3A+Cis8cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+UHJvcGVydGllcyAtIFBlcnNpc3RlbmNlIFBhZ2U8L3A+CiA8aW1nIHNyYz0iaW1nL3Byb3BlcnRpZXNfcGVyc2lzdGVuY2UucG5nIiBhbHQ9IlRoaXMgZmlndXJlIHNob3dzIHRoZSBKUEEgb3B0aW9ucyBvbiB0aGUgUHJvcGVydGllcyBkaWFsb2cuIiB0aXRsZT0iVGhpcyBmaWd1cmUgc2hvd3MgdGhlIEpQQSBvcHRpb25zIG9uIHRoZSBQcm9wZXJ0aWVzIGRpYWxvZy4iIC8+PGJyIC8+PC9kaXY+CiA8IS0tIGNsYXNzPSJmaWd1cmUiIC0tPjwvbGk+CiA8bGk+Ci08cD5Vc2UgdGhpcyB0YWJsZSB0byBjb21wbGV0ZSB0aGUgcmVtYWluaW5nIGZpZWxkcyBvbiB0aGUgUHJvcGVydGllcyAmbmRhc2g7IEpQQSBwYWdlIGFuZCBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+T0s8L3NwYW4+LjwvcD4KKzxwPlVzZSB0aGlzIHRhYmxlIHRvIGNvbXBsZXRlIHRoZSByZW1haW5pbmcgZmllbGRzIG9uIHRoZSBQcm9wZXJ0aWVzIC0gSlBBIHBhZ2UgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5PSzwvc3Bhbj4uPC9wPgogPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KIDx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGluIHRoZSBQcm9wZXJ0aWVzIC0gSmF2YSBQZXJzaXN0ZW5jZSBkaWFsb2cuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBmaWVsZHMgaW4gdGhlIFByb3BlcnRpZXMgLSBKYXZhIFBlcnNpc3RlbmNlIGRpYWxvZy4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgogPHRoZWFkPgpAQCAtNzAsNyArNzAsNyBAQAogPHA+Jm5ic3A7PC9wPgogPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+CiA8YnIgLz4KLTxhIGhyZWY9InJlZl9wcm9qZWN0X3Byb3BlcnRpZXMuaHRtI0JBQkpIQkNJIj5Qcm9qZWN0IFByb3BlcnRpZXMgcGFnZSAmbmRhc2g7IEpQQSBPcHRpb25zPC9hPgorPGEgaHJlZj0icmVmX3Byb2plY3RfcHJvcGVydGllcy5odG0jQkFCSkhCQ0kiPlByb2plY3QgUHJvcGVydGllcyBwYWdlIC0gSlBBIE9wdGlvbnM8L2E+CiA8cD4mbmJzcDs8L3A+CiA8aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgogPGJyIC8+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGlwc19hbmRfdHJpY2tzLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90aXBzX2FuZF90cmlja3MuaHRtCmluZGV4IGY0MTc1NDcuLjczOWVjYmIgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90aXBzX2FuZF90cmlja3MuaHRtCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90aXBzX2FuZF90cmlja3MuaHRtCkBAIC00LDggKzQsOCBAQAogPGhlYWQ+CiA8IS0tIFJ1biBkYXRlID0gTWF5IDIxLCAyMDA3IDY6MzU6NTggLS0+CiA8bWV0YSBuYW1lPSJPQUNfSUdOT1JFX1NLSVBfTkFWIiBjb250ZW50PSJ0cnVlIiAvPgotPHRpdGxlPlRpcHMgYW5kIHRyaWNrczwvdGl0bGU+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KKzx0aXRsZT5UaXBzIGFuZCB0cmlja3M8L3RpdGxlPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KIDxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIC0gVmVyc2lvbiA0LjUuMyBCdWlsZCAwMiIgLz4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90b2MueG1sIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3RvYy54bWwKaW5kZXggMGRjMWFiYi4uMmJjOWVlOCAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3RvYy54bWwKKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3RvYy54bWwKQEAgLTEsNCArMSw1IEBACiA8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdpc28tODg1OS0xJz8+Cis8P05MUyAgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KIDwhLS0gVXNlciBHdWlkZSAtLT4KICAgPHRvYyBsYWJlbD0iRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIFVzZXIgR3VpZGUiPjx0b3BpYyBsYWJlbD0iRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIFVzZXIgR3VpZGUiPgogICAgIDx0b3BpYyBocmVmPSJnZXR0aW5nX3N0YXJ0ZWQuaHRtIiBsYWJlbD0iR2V0dGluZyBzdGFydGVkIj4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci93aGF0c19uZXcuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3doYXRzX25ldy5odG0KaW5kZXggNGQ0ZGExZS4uOGM3NzdkMSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3doYXRzX25ldy5odG0KKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3doYXRzX25ldy5odG0KQEAgLTQsOCArNCw4IEBACiA8aGVhZD4KIDwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDcgNjozNTo1OCAtLT4KIDxtZXRhIG5hbWU9Ik9BQ19JR05PUkVfU0tJUF9OQVYiIGNvbnRlbnQ9InRydWUiIC8+Ci08dGl0bGU+V2hhdCdzIG5ldzwvdGl0bGU+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KKzx0aXRsZT5XaGF0J3MgbmV3PC90aXRsZT4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+CiA8bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAtIFZlcnNpb24gNC41LjMgQnVpbGQgMDIiIC8+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvd2hhdHNfbmV3MDAxLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci93aGF0c19uZXcwMDEuaHRtCmluZGV4IDY1ZmQ4YTkuLjI2NjU0Y2EgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci93aGF0c19uZXcwMDEuaHRtCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci93aGF0c19uZXcwMDEuaHRtCkBAIC00LDggKzQsOCBAQAogPGhlYWQ+CiA8IS0tIFJ1biBkYXRlID0gTWF5IDIxLCAyMDA3IDY6MzU6NTggLS0+CiA8bWV0YSBuYW1lPSJPQUNfSUdOT1JFX1NLSVBfTkFWIiBjb250ZW50PSJ0cnVlIiAvPgotPHRpdGxlPkdlbmVyYXRlIFBlcnNpc3RlbnQgRW50aXRpZXMgZnJvbSBUYWJsZXMgd2l6YXJkPC90aXRsZT4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgorPHRpdGxlPkdlbmVyYXRlIFBlcnNpc3RlbnQgRW50aXRpZXMgZnJvbSBUYWJsZXMgd2l6YXJkPC90aXRsZT4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+CiA8bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAtIFZlcnNpb24gNC41LjMgQnVpbGQgMDIiIC8+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvd2hhdHNfbmV3MDAyLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci93aGF0c19uZXcwMDIuaHRtCmluZGV4IDRmZDIyYWYuLjQ1NTgyNmIgMTAwNjQ0Ci0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci93aGF0c19uZXcwMDIuaHRtCisrKyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci93aGF0c19uZXcwMDIuaHRtCkBAIC00LDggKzQsOCBAQAogPGhlYWQ+CiA8IS0tIFJ1biBkYXRlID0gTWF5IDIxLCAyMDA3IDY6MzU6NTggLS0+CiA8bWV0YSBuYW1lPSJPQUNfSUdOT1JFX1NLSVBfTkFWIiBjb250ZW50PSJ0cnVlIiAvPgotPHRpdGxlPkNyZWF0ZSBhbmQgTWFuYWdlIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZTwvdGl0bGU+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KKzx0aXRsZT5DcmVhdGUgYW5kIE1hbmFnZSB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGU8L3RpdGxlPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KIDxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIC0gVmVyc2lvbiA0LjUuMyBCdWlsZCAwMiIgLz4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci93aGF0c19uZXcwMDMuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3doYXRzX25ldzAwMy5odG0KaW5kZXggZjAyYWJhNC4uYjc1YzBhOSAxMDA2NDQKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3doYXRzX25ldzAwMy5odG0KKysrIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3doYXRzX25ldzAwMy5odG0KQEAgLTQsOCArNCw4IEBACiA8aGVhZD4KIDwhLS0gUnVuIGRhdGUgPSBNYXkgMjEsIDIwMDcgNjozNTo1OCAtLT4KIDxtZXRhIG5hbWU9Ik9BQ19JR05PUkVfU0tJUF9OQVYiIGNvbnRlbnQ9InRydWUiIC8+Ci08dGl0bGU+Q3JlYXRlIGFuZCBNYW5hZ2UgdGhlIG9ybS54bWwgZmlsZTwvdGl0bGU+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KKzx0aXRsZT5DcmVhdGUgYW5kIE1hbmFnZSB0aGUgb3JtLnhtbCBmaWxlPC90aXRsZT4KIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+CiA8bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAtIFZlcnNpb24gNC41LjMgQnVpbGQgMDIiIC8+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuLy5jbGFzc3BhdGggYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNGU4NjEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vLmN2c2lnbm9yZSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQxNDk4OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLWJpbgotQGRvdAotYnVpbGQueG1sCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuLy5wcm9qZWN0IGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYyZDUwOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmdlbjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTY5MGI0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jU3VuIE1heSAyNyAxNToxMDo1NSBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTFkNTBhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jU3VuIE1heSAyNyAxNDoyODo1NCBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL01FVEEtSU5GL01BTklGRVNULk1GIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE2MmE3Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC5nZW4KLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC5xdWFsaWZpZXIKLUJ1bmRsZS1DbGFzc1BhdGg6IC4KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWw7IHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC51aSIKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmUsCi0gb3JnLmVjbGlwc2UuanB0LmNvcmUsCi0gb3JnLmVjbGlwc2UuanB0LmRiLAotIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5Ci1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vYWJvdXQuaHRtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU3M2JkYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lIDA2LCAyMDA3PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vYnVpbGQucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE4MzdlYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1qYXJzLmNvbXBpbGUub3JkZXIgPSAuCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL2NvbXBvbmVudC54bWwgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhNGUwNGUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48Y29tcG9uZW50ICB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIiBuYW1lPSJvcmcuZWNsaXBzZS5qcHQuZ2VuIj48ZGVzY3JpcHRpb24gdXJsPSIiPjwvZGVzY3JpcHRpb24+PGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSI+PC9jb21wb25lbnQtZGVwZW5kcz48cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQuZ2VuIiBmcmFnbWVudD0iZmFsc2UiLz48L2NvbXBvbmVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3BsdWdpbi5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg3NWE4Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyAgQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gCi0jICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSMgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKLSMgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotIyAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgIAotIyAgQ29udHJpYnV0b3JzOiAKLSMgIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgVG8gY29kZSBkZXZlbG9wZXI6Ci0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlCi0jICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UKLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotcGx1Z2luTmFtZSA9IEphdmEgUGVyc2lzdGVuY2UgQVBJIFRvb2xzIC0gRW50aXR5IEdlbgotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvRW50aXR5R2VuZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL0VudGl0eUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGQwN2E1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvRW50aXR5R2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7Ci1pbXBvcnQgamF2YS50ZXh0LkNvbGxhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEubWFwcGluZ3MuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLkZvcmVpZ25LZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkluZGVudGluZ1ByaW50V3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkphdmFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5GaWx0ZXJpbmdJdGVyYXRvcjsKLQotLy8gVE9ETyBoYW5kbGUgdGFibGUgbmFtZXMgdGhhdCBhcmUgaWxsZWdhbCBjbGFzcyBuYW1lcwotLy8gVE9ETyBoYW5kbGUgdGFibGUgbmFtZXMgdGhhdCBhcmUgaWxsZWdhbCBmaWxlIG5hbWVzCi0vLyBUT0RPIGhhbmRsZSBjb2x1bW4gbmFtZXMgdGhhdCBhcmUgaWxsZWdhbCBmaWVsZC9tZXRob2QgbmFtZXMKLS8vIFRPRE8gZm9ybWF0IGNvZGUgcGVyIHByZWZlcmVuY2VzCi0vLyBUT0RPIG9yZ2FuaXplIGltcG9ydHMgcGVyIHByZWZlcmVuY2VzCi0vLyBUT0RPIHByb21wdCB1c2VyIHRvIG92ZXJ3cml0ZSBleGlzdGluZyBjbGFzc2VzCi0vKioKLSAqIFRoaXMgZ2VuZXJhdG9yIHdpbGwgZ2VuZXJhdGUgYW4gZW50aXR5IGZvciBhIHRhYmxlLgotICovCi1wdWJsaWMgY2xhc3MgRW50aXR5R2VuZXJhdG9yIHsKLQlmaW5hbCBDb25maWcgY29uZmlnOwotCXByaXZhdGUgZmluYWwgSVBhY2thZ2VGcmFnbWVudCBwYWNrYWdlRnJhZ21lbnQ7Ci0JcHJpdmF0ZSBmaW5hbCBHZW5UYWJsZSBnZW5UYWJsZTsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBlbnRpdHlDbGFzc05hbWU7Ci0JcHJpdmF0ZSBmaW5hbCBPdmVyd3JpdGVDb25maXJtZXIgb3ZlcndyaXRlQ29uZmlybWVyOwotCXByaXZhdGUgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yOwotCi0KLQkvLyAqKioqKioqKioqIHB1YmxpYyBBUEkgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyB2b2lkIGdlbmVyYXRlRW50aXR5KENvbmZpZyBjb25maWcsIElQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50LCBHZW5UYWJsZSBnZW5UYWJsZSwgT3ZlcndyaXRlQ29uZmlybWVyIG92ZXJ3cml0ZUNvbmZpcm1lciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmICgoY29uZmlnID09IG51bGwpIHx8IChwYWNrYWdlRnJhZ21lbnQgPT0gbnVsbCkgfHwgKGdlblRhYmxlID09IG51bGwpKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQluZXcgRW50aXR5R2VuZXJhdG9yKGNvbmZpZywgcGFja2FnZUZyYWdtZW50LCBnZW5UYWJsZSwgb3ZlcndyaXRlQ29uZmlybWVyLCBtb25pdG9yKS5nZW5lcmF0ZUVudGl0eSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rvci9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcml2YXRlIEVudGl0eUdlbmVyYXRvcihDb25maWcgY29uZmlnLCBJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnbWVudCwgR2VuVGFibGUgZ2VuVGFibGUsIE92ZXJ3cml0ZUNvbmZpcm1lciBvdmVyd3JpdGVDb25maXJtZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlzdXBlcigpOwotCQl0aGlzLmNvbmZpZyA9IGNvbmZpZzsKLQkJdGhpcy5wYWNrYWdlRnJhZ21lbnQgPSBwYWNrYWdlRnJhZ21lbnQ7Ci0JCXRoaXMuZ2VuVGFibGUgPSBnZW5UYWJsZTsKLQkJdGhpcy5lbnRpdHlDbGFzc05hbWUgPSB0aGlzLmZ1bGx5UXVhbGlmeSh0aGlzLmVudGl0eU5hbWUoKSk7Ci0JCXRoaXMub3ZlcndyaXRlQ29uZmlybWVyID0gb3ZlcndyaXRlQ29uZmlybWVyOwotCQl0aGlzLm1vbml0b3IgPSBtb25pdG9yOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb2RlIGdlbiAqKioqKioqKioqCi0KLQlwcml2YXRlIHZvaWQgZ2VuZXJhdGVFbnRpdHkoKSB7Ci0JCXRyeSB7Ci0JCQl0aGlzLmdlbmVyYXRlRW50aXR5XygpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBnZW5lcmF0ZUVudGl0eV8oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGZpbGVOYW1lID0gdGhpcy5lbnRpdHlOYW1lKCkgKyAiLmphdmEiOwotCQlTdHJpbmcgc291cmNlID0gdGhpcy5idWlsZFNvdXJjZSgpOwotCQl0cnkgewotCQkJdGhpcy5wYWNrYWdlRnJhZ21lbnQuY3JlYXRlQ29tcGlsYXRpb25Vbml0KGZpbGVOYW1lLCBzb3VyY2UsIGZhbHNlLCB0aGlzLm1vbml0b3IpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCWlmIChleC5nZXRKYXZhTW9kZWxTdGF0dXMoKS5nZXRDb2RlKCkgPT0gSUphdmFNb2RlbFN0YXR1c0NvbnN0YW50cy5OQU1FX0NPTExJU0lPTikgewotCQkJCWlmICh0aGlzLm92ZXJ3cml0ZUNvbmZpcm1lci5vdmVyd3JpdGUodGhpcy5lbnRpdHlDbGFzc05hbWUpKSB7Ci0JCQkJCXRoaXMucGFja2FnZUZyYWdtZW50LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChmaWxlTmFtZSwgc291cmNlLCB0cnVlLCB0aGlzLm1vbml0b3IpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJdGhyb3cgZXg7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBidWlsZCB0aGUgImJvZHkiIHNvdXJjZSBmaXJzdDsgdGhlbiBidWlsZCB0aGUgInBhY2thZ2UiIGFuZCAiaW1wb3J0cyIgc291cmNlCi0JICogYW5kIGNvbmNhdGVuYXRlIHRoZSAiYm9keSIgc291cmNlIHRvIGl0Ci0JICovCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRTb3VyY2UoKSB7Ci0JCS8vIGJ1aWxkIHRoZSBib2R5IHNvdXJjZSBmaXJzdCBzbyB3ZSBjYW4gZ2F0aGVyIHVwIHRoZSBpbXBvcnQgc3RhdGVtZW50cwotCQlCb2R5U291cmNlIGJvZHlTb3VyY2UgPSB0aGlzLmJ1aWxkQm9keVNvdXJjZSgpOwotCi0JCVN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoYm9keVNvdXJjZS5sZW5ndGgoKSArIDEwMDApOwotCQlQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihzdyk7Ci0JCXRoaXMucHJpbnRQYWNrYWdlQW5kSW1wb3J0c09uKHB3LCBib2R5U291cmNlKTsKLQkJcHcucHJpbnQoYm9keVNvdXJjZS5zb3VyY2UoKSk7Ci0JCXJldHVybiBzdy50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgQm9keVNvdXJjZSBidWlsZEJvZHlTb3VyY2UoKSB7Ci0JCUVudGl0eVNvdXJjZVdyaXRlciBwdyA9IG5ldyBFbnRpdHlTb3VyY2VXcml0ZXIodGhpcy5wYWNrYWdlTmFtZSgpLCB0aGlzLmVudGl0eUNsYXNzTmFtZSk7Ci0JCXRoaXMucHJpbnRCb2R5U291cmNlT24ocHcpOwotCQlyZXR1cm4gcHc7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50Qm9keVNvdXJjZU9uKEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQl0aGlzLnByaW50Q2xhc3NEZWNsYXJhdGlvbk9uKHB3KTsKLQotCQlwdy5pbmRlbnQoKTsKLQkJCXRoaXMucHJpbnRFbnRpdHlQcmltYXJ5S2V5RmllbGRzT24ocHcpOwotCQkJdGhpcy5wcmludEVudGl0eU5vblByaW1hcnlLZXlCYXNpY0ZpZWxkc09uKHB3KTsKLQkJCXRoaXMucHJpbnRFbnRpdHlNYW55VG9PbmVGaWVsZHNPbihwdyk7Ci0JCQl0aGlzLnByaW50RW50aXR5T25lVG9NYW55RmllbGRzT24ocHcpOwotCQkJdGhpcy5wcmludEVudGl0eU93bmVkTWFueVRvTWFueUZpZWxkc09uKHB3KTsKLQkJCXRoaXMucHJpbnRFbnRpdHlOb25Pd25lZE1hbnlUb01hbnlGaWVsZHNPbihwdyk7Ci0JCQl0aGlzLnByaW50U2VyaWFsVmVyc2lvblVJRChwdyk7Ci0JCQlwdy5wcmludGxuKCk7Ci0KLQkJCXRoaXMucHJpbnRaZXJvQXJndW1lbnRDb25zdHJ1Y3Rvck9uKHRoaXMuZW50aXR5TmFtZSgpLCB0aGlzLmNvbmZpZy5tZXRob2RWaXNpYmlsaXR5KCksIHB3KTsKLQkJCWlmICh0aGlzLmNvbmZpZy5wcm9wZXJ0eUFjY2Vzc1R5cGUoKSB8fCB0aGlzLmNvbmZpZy5nZW5lcmF0ZUdldHRlcnNBbmRTZXR0ZXJzKCkpIHsKLQkJCQl0aGlzLnByaW50RW50aXR5UHJpbWFyeUtleUdldHRlcnNBbmRTZXR0ZXJzT24ocHcpOwotCQkJCXRoaXMucHJpbnRFbnRpdHlOb25QcmltYXJ5S2V5QmFzaWNHZXR0ZXJzQW5kU2V0dGVyc09uKHB3KTsKLQkJCQl0aGlzLnByaW50RW50aXR5TWFueVRvT25lR2V0dGVyc0FuZFNldHRlcnNPbihwdyk7Ci0JCQkJdGhpcy5wcmludEVudGl0eU9uZVRvTWFueUdldHRlcnNBbmRTZXR0ZXJzT24ocHcpOwotCQkJCXRoaXMucHJpbnRFbnRpdHlPd25lZE1hbnlUb01hbnlHZXR0ZXJzQW5kU2V0dGVyc09uKHB3KTsKLQkJCQl0aGlzLnByaW50RW50aXR5Tm9uT3duZWRNYW55VG9NYW55R2V0dGVyc0FuZFNldHRlcnNPbihwdyk7Ci0JCQl9Ci0KLQkJCXRoaXMucHJpbnRQcmltYXJ5S2V5Q2xhc3NPbihwdyk7Ci0JCXB3LnVuZGVudCgpOwotCi0JCXB3LnByaW50KCd9Jyk7Ci0JCXB3LnByaW50bG4oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRDbGFzc0RlY2xhcmF0aW9uT24oRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCXRoaXMucHJpbnRFbnRpdHlBbm5vdGF0aW9uT24ocHcpOwotCQl0aGlzLnByaW50VGFibGVBbm5vdGF0aW9uT24ocHcpOwotCQl0aGlzLnByaW50SWRDbGFzc0Fubm90YXRpb25Pbihwdyk7Ci0KLQkJcHcucHJpbnQoInB1YmxpYyBjbGFzcyAiKTsKLQkJcHcucHJpbnRUeXBlRGVjbGFyYXRpb24odGhpcy5lbnRpdHlDbGFzc05hbWUpOwotCQlpZiAoY29uZmlnLnNlcmlhbGl6YWJsZSgpKSB7Ci0JCQlwdy5wcmludCgiIGltcGxlbWVudHMgIik7Ci0JCQlwdy5wcmludFR5cGVEZWNsYXJhdGlvbihTZXJpYWxpemFibGUuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJfQotCQlwdy5wcmludCgiIHsiKTsKLQkJcHcucHJpbnRsbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludEVudGl0eUFubm90YXRpb25PbihFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJcHcucHJpbnRBbm5vdGF0aW9uKEpQQS5FTlRJVFkpOwotCQlwdy5wcmludGxuKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50VGFibGVBbm5vdGF0aW9uT24oRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCWlmICggISB0aGlzLnRhYmxlKCkubWF0Y2hlc1Nob3J0SmF2YUNsYXNzTmFtZSh0aGlzLmVudGl0eU5hbWUoKSkpIHsKLQkJCXB3LnByaW50QW5ub3RhdGlvbihKUEEuVEFCTEUpOwotCQkJcHcucHJpbnQoIihuYW1lPVwiIik7Ci0JCQlwdy5wcmludCh0aGlzLnRhYmxlKCkuZ2V0TmFtZSgpKTsKLQkJCXB3LnByaW50KCJcIikiKTsKLQkJCXB3LnByaW50bG4oKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludElkQ2xhc3NBbm5vdGF0aW9uT24oRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCWlmICgodGhpcy50YWJsZSgpLnByaW1hcnlLZXlDb2x1bW5zU2l6ZSgpID4gMSkgJiYgdGhpcy5jb25maWcuZ2VuZXJhdGVJZENsYXNzRm9yQ29tcG91bmRQSygpKSB7Ci0JCQlwdy5wcmludEFubm90YXRpb24oSlBBLklEX0NMQVNTKTsKLQkJCXB3LnByaW50KCcoJyk7Ci0JCQlwdy5wcmludFR5cGVEZWNsYXJhdGlvbih0aGlzLmVudGl0eUNsYXNzTmFtZSArICIuUEsiKTsKLQkJCXB3LnByaW50KCIuY2xhc3MpIik7Ci0JCQlwdy5wcmludGxuKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRFbnRpdHlQcmltYXJ5S2V5RmllbGRzT24oRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCWlmICgodGhpcy50YWJsZSgpLnByaW1hcnlLZXlDb2x1bW5zU2l6ZSgpID4gMSkgJiYgdGhpcy5jb25maWcuZ2VuZXJhdGVFbWJlZGRlZElkRm9yQ29tcG91bmRQSygpKSB7Ci0JCQl0aGlzLnByaW50RW50aXR5RW1iZWRkZWRJZFByaW1hcnlLZXlGaWVsZE9uKHB3KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMucHJpbnRFbnRpdHlSZWFkT25seVByaW1hcnlLZXlGaWVsZHNPbihwdyk7Ci0JCQl0aGlzLnByaW50RW50aXR5V3JpdGFibGVQcmltYXJ5S2V5RmllbGRzT24ocHcpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50RW50aXR5RW1iZWRkZWRJZFByaW1hcnlLZXlGaWVsZE9uKEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlpZiAodGhpcy5jb25maWcuZmllbGRBY2Nlc3NUeXBlKCkpIHsKLQkJCXB3LnByaW50QW5ub3RhdGlvbihKUEEuRU1CRURERURfSUQpOwotCQkJcHcucHJpbnRsbigpOwotCQl9Ci0JCXB3LnByaW50VmlzaWJpbGl0eSh0aGlzLmNvbmZpZy5maWVsZFZpc2liaWxpdHkoKSk7Ci0JCXB3LnByaW50VHlwZURlY2xhcmF0aW9uKHRoaXMuZW50aXR5Q2xhc3NOYW1lICsgIi5QSyIpOwotCQlwdy5wcmludCgnICcpOwotCQlwdy5wcmludCh0aGlzLmdlblRhYmxlLmZpZWxkTmFtZUZvckVtYmVkZGVkSWQoKSk7Ci0JCXB3LnByaW50KCc7Jyk7Ci0JCXB3LnByaW50bG4oKTsKLQkJcHcucHJpbnRsbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludEVudGl0eVJlYWRPbmx5UHJpbWFyeUtleUZpZWxkc09uKEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlmb3IgKEl0ZXJhdG9yPENvbHVtbj4gc3RyZWFtID0gdGhpcy5nZW5UYWJsZS5yZWFkT25seVByaW1hcnlLZXlDb2x1bW5zKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJdGhpcy5wcmludEVudGl0eVJlYWRPbmx5UHJpbWFyeUtleUZpZWxkT24oc3RyZWFtLm5leHQoKSwgcHcpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50RW50aXR5UmVhZE9ubHlQcmltYXJ5S2V5RmllbGRPbihDb2x1bW4gY29sdW1uLCBFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJU3RyaW5nIGZpZWxkTmFtZSA9IHRoaXMuZ2VuVGFibGUuZmllbGROYW1lRm9yKGNvbHVtbik7Ci0JCWlmICh0aGlzLmNvbmZpZy5maWVsZEFjY2Vzc1R5cGUoKSkgewotCQkJcHcucHJpbnRBbm5vdGF0aW9uKEpQQS5JRCk7Ci0JCQlwdy5wcmludGxuKCk7Ci0JCQlpZiAoY29sdW1uLm1hdGNoZXNKYXZhRmllbGROYW1lKGZpZWxkTmFtZSkpIHsKLQkJCQl0aGlzLnByaW50UmVhZE9ubHlDb2x1bW5Bbm5vdGF0aW9uT24ocHcpOyAgLy8gbm8gQ29sdW1uIG5hbWUgbmVlZGVkCi0JCQl9IGVsc2UgewotCQkJCXRoaXMucHJpbnRSZWFkT25seUNvbHVtbkFubm90YXRpb25Pbihjb2x1bW4uZ2V0TmFtZSgpLCBwdyk7Ci0JCQl9Ci0JCX0KLQkJcHcucHJpbnRWaXNpYmlsaXR5KHRoaXMuY29uZmlnLmZpZWxkVmlzaWJpbGl0eSgpKTsKLQkJcHcucHJpbnRUeXBlRGVjbGFyYXRpb24oY29sdW1uLmphdmFUeXBlRGVjbGFyYXRpb24oKSk7Ci0JCXB3LnByaW50KCcgJyk7Ci0JCXB3LnByaW50KGZpZWxkTmFtZSk7Ci0JCXB3LnByaW50KCc7Jyk7Ci0JCXB3LnByaW50bG4oKTsKLQkJcHcucHJpbnRsbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludFJlYWRPbmx5Q29sdW1uQW5ub3RhdGlvbk9uKFN0cmluZyBjb2x1bW5OYW1lLCBFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJcHcucHJpbnRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pOwotCQlwdy5wcmludCgiKG5hbWU9XCIiKTsKLQkJcHcucHJpbnQoY29sdW1uTmFtZSk7Ci0JCXB3LnByaW50KCJcIiwgaW5zZXJ0YWJsZT1mYWxzZSwgdXBkYXRhYmxlPWZhbHNlKSIpOwotCQlwdy5wcmludGxuKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50UmVhZE9ubHlDb2x1bW5Bbm5vdGF0aW9uT24oRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCXB3LnByaW50QW5ub3RhdGlvbihKUEEuQ09MVU1OKTsKLQkJcHcucHJpbnQoIihpbnNlcnRhYmxlPWZhbHNlLCB1cGRhdGFibGU9ZmFsc2UpIik7Ci0JCXB3LnByaW50bG4oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRFbnRpdHlXcml0YWJsZVByaW1hcnlLZXlGaWVsZHNPbihFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJZm9yIChJdGVyYXRvcjxDb2x1bW4+IHN0cmVhbSA9IHRoaXMuZ2VuVGFibGUud3JpdGFibGVQcmltYXJ5S2V5Q29sdW1ucygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCXRoaXMucHJpbnRFbnRpdHlXcml0YWJsZVByaW1hcnlLZXlGaWVsZE9uKHN0cmVhbS5uZXh0KCksIHB3KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludEVudGl0eVdyaXRhYmxlUHJpbWFyeUtleUZpZWxkT24oQ29sdW1uIGNvbHVtbiwgRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCVN0cmluZyBmaWVsZE5hbWUgPSB0aGlzLmdlblRhYmxlLmZpZWxkTmFtZUZvcihjb2x1bW4pOwotCQlpZiAodGhpcy5jb25maWcuZmllbGRBY2Nlc3NUeXBlKCkpIHsKLQkJCXB3LnByaW50QW5ub3RhdGlvbihKUEEuSUQpOwotCQkJcHcucHJpbnRsbigpOwotCQkJaWYgKCAhIGNvbHVtbi5tYXRjaGVzSmF2YUZpZWxkTmFtZShmaWVsZE5hbWUpKSB7Ci0JCQkJdGhpcy5wcmludENvbHVtbkFubm90YXRpb25Pbihjb2x1bW4uZ2V0TmFtZSgpLCBwdyk7Ci0JCQl9Ci0JCX0KLQkJcHcucHJpbnRWaXNpYmlsaXR5KHRoaXMuY29uZmlnLmZpZWxkVmlzaWJpbGl0eSgpKTsKLQkJcHcucHJpbnRUeXBlRGVjbGFyYXRpb24oY29sdW1uLmphdmFUeXBlRGVjbGFyYXRpb24oKSk7Ci0JCXB3LnByaW50KCcgJyk7Ci0JCXB3LnByaW50KGZpZWxkTmFtZSk7Ci0JCXB3LnByaW50KCc7Jyk7Ci0JCXB3LnByaW50bG4oKTsKLQkJcHcucHJpbnRsbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludEVudGl0eU5vblByaW1hcnlLZXlCYXNpY0ZpZWxkc09uKEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlmb3IgKEl0ZXJhdG9yPENvbHVtbj4gc3RyZWFtID0gdGhpcy5nZW5UYWJsZS5ub25QcmltYXJ5S2V5QmFzaWNDb2x1bW5zKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJdGhpcy5wcmludEVudGl0eU5vblByaW1hcnlLZXlCYXNpY0ZpZWxkT24oc3RyZWFtLm5leHQoKSwgcHcpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50RW50aXR5Tm9uUHJpbWFyeUtleUJhc2ljRmllbGRPbihDb2x1bW4gY29sdW1uLCBFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJU3RyaW5nIGZpZWxkTmFtZSA9IHRoaXMuZ2VuVGFibGUuZmllbGROYW1lRm9yKGNvbHVtbik7Ci0JCWlmICh0aGlzLmNvbmZpZy5maWVsZEFjY2Vzc1R5cGUoKSkgewotCQkJaWYgKCAhIGNvbHVtbi5tYXRjaGVzSmF2YUZpZWxkTmFtZShmaWVsZE5hbWUpKSB7Ci0JCQkJdGhpcy5wcmludENvbHVtbkFubm90YXRpb25Pbihjb2x1bW4uZ2V0TmFtZSgpLCBwdyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGNvbHVtbi5pc0xvYigpKSB7Ci0JCQlwdy5wcmludEFubm90YXRpb24oSlBBLkxPQik7Ci0JCQlwdy5wcmludGxuKCk7Ci0JCX0KLQkJcHcucHJpbnRWaXNpYmlsaXR5KHRoaXMuY29uZmlnLmZpZWxkVmlzaWJpbGl0eSgpKTsKLQkJcHcucHJpbnRUeXBlRGVjbGFyYXRpb24oY29sdW1uLmphdmFUeXBlRGVjbGFyYXRpb24oKSk7Ci0JCXB3LnByaW50KCcgJyk7Ci0JCXB3LnByaW50KGZpZWxkTmFtZSk7Ci0JCXB3LnByaW50KCc7Jyk7Ci0JCXB3LnByaW50bG4oKTsKLQkJcHcucHJpbnRsbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludENvbHVtbkFubm90YXRpb25PbihTdHJpbmcgY29sdW1uTmFtZSwgRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCXB3LnByaW50QW5ub3RhdGlvbihKUEEuQ09MVU1OKTsKLQkJcHcucHJpbnQoIihuYW1lPVwiIik7Ci0JCXB3LnByaW50KGNvbHVtbk5hbWUpOwotCQlwdy5wcmludCgiXCIpIik7Ci0JCXB3LnByaW50bG4oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRFbnRpdHlNYW55VG9PbmVGaWVsZHNPbihFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJZm9yIChJdGVyYXRvcjxNYW55VG9PbmVSZWxhdGlvbj4gc3RyZWFtID0gdGhpcy5nZW5UYWJsZS5tYW55VG9PbmVSZWxhdGlvbnMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQl0aGlzLnByaW50RW50aXR5TWFueVRvT25lRmllbGRPbihzdHJlYW0ubmV4dCgpLCBwdyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRFbnRpdHlNYW55VG9PbmVGaWVsZE9uKE1hbnlUb09uZVJlbGF0aW9uIHJlbGF0aW9uLCBFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJU3RyaW5nIGZpZWxkTmFtZSA9IHRoaXMuZ2VuVGFibGUuZmllbGROYW1lRm9yKHJlbGF0aW9uKTsKLQkJaWYgKHRoaXMuY29uZmlnLmZpZWxkQWNjZXNzVHlwZSgpKSB7Ci0JCQl0aGlzLnByaW50TWFueVRvT25lQW5ub3RhdGlvbk9uKGZpZWxkTmFtZSwgcmVsYXRpb24sIHB3KTsKLQkJfQotCQlwdy5wcmludFZpc2liaWxpdHkodGhpcy5jb25maWcuZmllbGRWaXNpYmlsaXR5KCkpOwotCQlwdy5wcmludFR5cGVEZWNsYXJhdGlvbih0aGlzLmZ1bGx5UXVhbGlmeShyZWxhdGlvbi5yZWZlcmVuY2VkRW50aXR5TmFtZSgpKSk7Ci0JCXB3LnByaW50KCcgJyk7Ci0JCXB3LnByaW50KGZpZWxkTmFtZSk7Ci0JCXB3LnByaW50KCc7Jyk7Ci0JCXB3LnByaW50bG4oKTsKLQkJcHcucHJpbnRsbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludE1hbnlUb09uZUFubm90YXRpb25PbihTdHJpbmcgZmllbGROYW1lLCBNYW55VG9PbmVSZWxhdGlvbiByZWxhdGlvbiwgRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCXB3LnByaW50QW5ub3RhdGlvbihKUEEuTUFOWV9UT19PTkUpOwotCQlwdy5wcmludGxuKCk7Ci0JCUZvcmVpZ25LZXkgZmsgPSByZWxhdGlvbi5nZXRGb3JlaWduS2V5KCk7Ci0JCWlmIChmay5tYXRjaGVzSmF2YUZpZWxkTmFtZShmaWVsZE5hbWUpKSB7Ci0JCQlyZXR1cm47ICAvLyBubyBKb2luQ29sdW1uIGFubm90YXRpb24gbmVlZGVkCi0JCX0KLQkJaWYgKGZrLnJlZmVyZW5jZXNTaW5nbGVDb2x1bW5QcmltYXJ5S2V5KCkpIHsKLQkJCXB3LnByaW50QW5ub3RhdGlvbihKUEEuSk9JTl9DT0xVTU4pOwotCQkJcHcucHJpbnQoIihuYW1lPVwiIik7Ci0JCQlwdy5wcmludChmay5jb2x1bW5QYWlycygpLm5leHQoKS5nZXRCYXNlQ29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJCXB3LnByaW50KCJcIikiKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChmay5jb2x1bW5QYWlyc1NpemUoKSA+IDEpIHsKLQkJCQlwdy5wcmludEFubm90YXRpb24oSlBBLkpPSU5fQ09MVU1OUyk7Ci0JCQkJcHcucHJpbnQoIih7Iik7Ci0JCQkJcHcucHJpbnRsbigpOwotCQkJCXB3LmluZGVudCgpOwotCQkJfQotCQkJdGhpcy5wcmludEpvaW5Db2x1bW5Bbm5vdGF0aW9uc09uKGZrLCBwdyk7Ci0JCQlpZiAoZmsuY29sdW1uUGFpcnNTaXplKCkgPiAxKSB7Ci0JCQkJcHcudW5kZW50KCk7Ci0JCQkJcHcucHJpbnRsbigpOwotCQkJCXB3LnByaW50KCJ9KSIpOwotCQkJfQotCQl9Ci0JCXB3LnByaW50bG4oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRKb2luQ29sdW1uQW5ub3RhdGlvbnNPbihGb3JlaWduS2V5IGZvcmVpZ25LZXksIEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlmb3IgKEl0ZXJhdG9yPEZvcmVpZ25LZXkuQ29sdW1uUGFpcj4gc3RyZWFtID0gZm9yZWlnbktleS5jb2x1bW5QYWlycygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCXRoaXMucHJpbnRKb2luQ29sdW1uQW5ub3RhdGlvbk9uKHN0cmVhbS5uZXh0KCksIHB3KTsKLQkJCWlmIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQkJcHcucHJpbnRsbignLCcpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50Sm9pbkNvbHVtbkFubm90YXRpb25PbihGb3JlaWduS2V5LkNvbHVtblBhaXIgY29sdW1uUGFpciwgRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCXRoaXMucHJpbnRKb2luQ29sdW1uQW5ub3RhdGlvbk9uKGNvbHVtblBhaXIuZ2V0QmFzZUNvbHVtbigpLmdldE5hbWUoKSwgY29sdW1uUGFpci5nZXRSZWZlcmVuY2VkQ29sdW1uKCkuZ2V0TmFtZSgpLCBwdyk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIHRoYXQgYXQgbGVhc3Qgb25lIG9mIHRoZSB0d28gbmFtZXMgaXMgbm90IG51bGwKLQkgKi8KLQlwcml2YXRlIHZvaWQgcHJpbnRKb2luQ29sdW1uQW5ub3RhdGlvbk9uKFN0cmluZyBiYXNlQ29sdW1uTmFtZSwgU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lLCBFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJcHcucHJpbnRBbm5vdGF0aW9uKEpQQS5KT0lOX0NPTFVNTik7Ci0JCXB3LnByaW50KCcoJyk7Ci0JCWlmIChiYXNlQ29sdW1uTmFtZSAhPSBudWxsKSB7Ci0JCQlwdy5wcmludCgibmFtZT1cIiIpOwotCQkJcHcucHJpbnQoYmFzZUNvbHVtbk5hbWUpOwotCQl9Ci0JCWlmIChyZWZlcmVuY2VkQ29sdW1uTmFtZSAhPSBudWxsKSB7Ci0JCQlpZiAoYmFzZUNvbHVtbk5hbWUgIT0gbnVsbCkgewotCQkJCXB3LnByaW50KCJcIiwgIik7Ci0JCQl9Ci0JCQlwdy5wcmludCgicmVmZXJlbmNlZENvbHVtbk5hbWU9XCIiKTsKLQkJCXB3LnByaW50KHJlZmVyZW5jZWRDb2x1bW5OYW1lKTsKLQkJfQotCQlwdy5wcmludCgiXCIpIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50RW50aXR5T25lVG9NYW55RmllbGRzT24oRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCWZvciAoSXRlcmF0b3I8T25lVG9NYW55UmVsYXRpb24+IHN0cmVhbSA9IHRoaXMuZ2VuVGFibGUub25lVG9NYW55UmVsYXRpb25zKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJdGhpcy5wcmludEVudGl0eU9uZVRvTWFueUZpZWxkT24oc3RyZWFtLm5leHQoKSwgcHcpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50RW50aXR5T25lVG9NYW55RmllbGRPbihPbmVUb01hbnlSZWxhdGlvbiByZWxhdGlvbiwgRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCVN0cmluZyBmaWVsZE5hbWUgPSB0aGlzLmdlblRhYmxlLmZpZWxkTmFtZUZvcihyZWxhdGlvbik7Ci0JCWlmICh0aGlzLmNvbmZpZy5maWVsZEFjY2Vzc1R5cGUoKSkgewotCQkJdGhpcy5wcmludE9uZVRvTWFueUFubm90YXRpb25PbihmaWVsZE5hbWUsIHJlbGF0aW9uLCBwdyk7Ci0JCX0KLQkJcHcucHJpbnRWaXNpYmlsaXR5KHRoaXMuY29uZmlnLmZpZWxkVmlzaWJpbGl0eSgpKTsKLQkJcHcucHJpbnRUeXBlRGVjbGFyYXRpb24odGhpcy5jb25maWcuZ2V0Q29sbGVjdGlvblR5cGVOYW1lKCkpOwotCQlwdy5wcmludCgnPCcpOwotCQlwdy5wcmludFR5cGVEZWNsYXJhdGlvbih0aGlzLmZ1bGx5UXVhbGlmeShyZWxhdGlvbi5yZWZlcmVuY2VkRW50aXR5TmFtZSgpKSk7Ci0JCXB3LnByaW50KCc+Jyk7Ci0JCXB3LnByaW50KCcgJyk7Ci0JCXB3LnByaW50KGZpZWxkTmFtZSk7Ci0JCXB3LnByaW50KCc7Jyk7Ci0JCXB3LnByaW50bG4oKTsKLQkJcHcucHJpbnRsbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludE9uZVRvTWFueUFubm90YXRpb25PbihTdHJpbmcgZmllbGROYW1lLCBPbmVUb01hbnlSZWxhdGlvbiByZWxhdGlvbiwgRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCXB3LnByaW50QW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOwotCQlwdy5wcmludCgiKG1hcHBlZEJ5PVwiIik7Ci0JCXB3LnByaW50KHJlbGF0aW9uLm1hcHBlZEJ5KCkpOwotCQlwdy5wcmludCgiXCIpIik7Ci0JCXB3LnByaW50bG4oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRFbnRpdHlPd25lZE1hbnlUb01hbnlGaWVsZHNPbihFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJZm9yIChJdGVyYXRvcjxNYW55VG9NYW55UmVsYXRpb24+ICBzdHJlYW0gPSB0aGlzLmdlblRhYmxlLm93bmVkTWFueVRvTWFueVJlbGF0aW9ucygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCXRoaXMucHJpbnRFbnRpdHlPd25lZE1hbnlUb01hbnlGaWVsZE9uKHN0cmVhbS5uZXh0KCksIHB3KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludEVudGl0eU93bmVkTWFueVRvTWFueUZpZWxkT24oTWFueVRvTWFueVJlbGF0aW9uIHJlbGF0aW9uLCBFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJU3RyaW5nIGZpZWxkTmFtZSA9IHRoaXMuZ2VuVGFibGUuZmllbGROYW1lRm9yKHJlbGF0aW9uKTsKLQkJaWYgKHRoaXMuY29uZmlnLmZpZWxkQWNjZXNzVHlwZSgpKSB7Ci0JCQl0aGlzLnByaW50T3duZWRNYW55VG9NYW55QW5ub3RhdGlvbk9uKGZpZWxkTmFtZSwgcmVsYXRpb24sIHB3KTsKLQkJfQotCQlwdy5wcmludFZpc2liaWxpdHkodGhpcy5jb25maWcuZmllbGRWaXNpYmlsaXR5KCkpOwotCQlwdy5wcmludFR5cGVEZWNsYXJhdGlvbih0aGlzLmNvbmZpZy5nZXRDb2xsZWN0aW9uVHlwZU5hbWUoKSk7Ci0JCXB3LnByaW50KCc8Jyk7Ci0JCXB3LnByaW50VHlwZURlY2xhcmF0aW9uKHRoaXMuZnVsbHlRdWFsaWZ5KHJlbGF0aW9uLm5vbk93bmluZ0VudGl0eU5hbWUoKSkpOwotCQlwdy5wcmludCgnPicpOwotCQlwdy5wcmludCgnICcpOwotCQlwdy5wcmludChmaWVsZE5hbWUpOwotCQlwdy5wcmludCgnOycpOwotCQlwdy5wcmludGxuKCk7Ci0JCXB3LnByaW50bG4oKTsKLQl9Ci0KLQkvKioKLQkgKiBJIGd1ZXNzIHlvdSBjb3VsZCBidWlsZCBhIHN0YXRlIG1hY2hpbmUgZm9yIGFsbCB0aGlzIGNyYXAsCi0JICogYnV0IHRoYXQgc2VlbXMgbGlrZSBvdmVya2lsbC4uLgotCSAqLwotCXByaXZhdGUgdm9pZCBwcmludE93bmVkTWFueVRvTWFueUFubm90YXRpb25PbihTdHJpbmcgZmllbGROYW1lLCBNYW55VG9NYW55UmVsYXRpb24gcmVsYXRpb24sIEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlwdy5wcmludEFubm90YXRpb24oSlBBLk1BTllfVE9fTUFOWSk7Ci0JCXB3LnByaW50bG4oKTsKLQkJYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0JCWJvb2xlYW4gY29tbWEgPSBmYWxzZTsKLQkJaWYgKCAhIHJlbGF0aW9uLmpvaW5UYWJsZU5hbWVJc0RlZmF1bHQoKSkgewotCQkJaWYgKGZpcnN0KSB7Ci0JCQkJZmlyc3QgPSBmYWxzZTsKLQkJCQlwdy5wcmludEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpOwotCQkJCXB3LnByaW50KCcoJyk7Ci0JCQl9Ci0JCQlwdy5wcmludCgibmFtZT1cIiIpOwotCQkJcHcucHJpbnQocmVsYXRpb24uZ2V0Sm9pblRhYmxlKCkubmFtZSgpKTsKLQkJCXB3LnByaW50KCdcIicpOwotCQkJY29tbWEgPSB0cnVlOwotCQl9Ci0JCWlmICggISByZWxhdGlvbi5qb2luQ29sdW1uc0lzRGVmYXVsdEZvcihmaWVsZE5hbWUpKSB7Ci0JCQlpZiAoZmlyc3QpIHsKLQkJCQlmaXJzdCA9IGZhbHNlOwotCQkJCXB3LnByaW50QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSk7Ci0JCQkJcHcucHJpbnQoJygnKTsKLQkJCX0gZWxzZSBpZiAoY29tbWEpIHsKLQkJCQlwdy5wcmludCgnLCcpOwotCQkJfQotCQkJcHcucHJpbnRsbigpOwotCQkJcHcuaW5kZW50KCk7Ci0JCQl0aGlzLnByaW50Sm9pblRhYmxlSm9pbkNvbHVtbnNPbigiam9pbkNvbHVtbnMiLCBmaWVsZE5hbWUsIHJlbGF0aW9uLmdldE93bmluZ0ZvcmVpZ25LZXkoKSwgcHcpOwotCQkJcHcudW5kZW50KCk7Ci0JCQljb21tYSA9IHRydWU7Ci0JCX0KLQkJU3RyaW5nIGludmVyc2VGaWVsZE5hbWUgPSByZWxhdGlvbi5nZXROb25Pd25pbmdUYWJsZSgpLmZpZWxkTmFtZUZvcihyZWxhdGlvbik7Ci0JCWlmICggISByZWxhdGlvbi5pbnZlcnNlSm9pbkNvbHVtbnNJc0RlZmF1bHRGb3IoaW52ZXJzZUZpZWxkTmFtZSkpIHsKLQkJCWlmIChmaXJzdCkgewotCQkJCWZpcnN0ID0gZmFsc2U7Ci0JCQkJcHcucHJpbnRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKTsKLQkJCQlwdy5wcmludCgnKCcpOwotCQkJfSBlbHNlIGlmIChjb21tYSkgewotCQkJCXB3LnByaW50KCcsJyk7Ci0JCQl9Ci0JCQlwdy5wcmludGxuKCk7Ci0JCQlwdy5pbmRlbnQoKTsKLQkJCXRoaXMucHJpbnRKb2luVGFibGVKb2luQ29sdW1uc09uKCJpbnZlcnNlSm9pbkNvbHVtbnMiLCBpbnZlcnNlRmllbGROYW1lLCByZWxhdGlvbi5nZXROb25Pd25pbmdGb3JlaWduS2V5KCksIHB3KTsKLQkJCXB3LnVuZGVudCgpOwotCQkJY29tbWEgPSB0cnVlOwotCQl9Ci0JCWlmICggISBmaXJzdCkgewotCQkJcHcucHJpbnQoJyknKTsKLQkJfQotCQlwdy5wcmludGxuKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50Sm9pblRhYmxlSm9pbkNvbHVtbnNPbihTdHJpbmcgZWxlbWVudE5hbWUsIFN0cmluZyBmaWVsZE5hbWUsIEZvcmVpZ25LZXkgZm9yZWlnbktleSwgRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCWlmIChmb3JlaWduS2V5LmNvbHVtblBhaXJzU2l6ZSgpICE9IDEpIHsKLQkJCXRoaXMucHJpbnRKb2luVGFibGVKb2luQ29sdW1uc09uKGVsZW1lbnROYW1lLCBmb3JlaWduS2V5LCBwdyk7Ci0JCX0gZWxzZSBpZiAoZm9yZWlnbktleS5nZXRSZWZlcmVuY2VkVGFibGUoKS5wcmltYXJ5S2V5Q29sdW1uc1NpemUoKSAhPSAxKSB7Ci0JCQkvLyBpZiB0aGUgcmVmZXJlbmNlZCB0YWJsZSBoYXMgYSBjb21wb3NpdGUgcHJpbWFyeSBrZXksIG5laXRoZXIgb2YgdGhlIGNvbHVtbnMgY2FuIGJlIGEgZGVmYXVsdAotCQkJLy8gc2luY2UgYm90aCBvZiB0aGUgZGVmYXVsdHMgcmVxdWlyZSBhIHNpbmdsZS1jb2x1bW4gcHJpbWFyeSBrZXkKLQkJCXRoaXMucHJpbnRKb2luVGFibGVKb2luQ29sdW1uc09uKGVsZW1lbnROYW1lLCBmb3JlaWduS2V5LCBwdyk7Ci0JCX0gZWxzZSB7Ci0JCQlGb3JlaWduS2V5LkNvbHVtblBhaXIgY29sdW1uUGFpciA9IGZvcmVpZ25LZXkuY29sdW1uUGFpcnMoKS5uZXh0KCk7Ci0JCQlDb2x1bW4gcGtDb2x1bW4gPSBmb3JlaWduS2V5LmdldFJlZmVyZW5jZWRUYWJsZSgpLnByaW1hcnlLZXlDb2x1bW5zKCkubmV4dCgpOwotCQkJaWYgKGNvbHVtblBhaXIuZ2V0QmFzZUNvbHVtbigpLm1hdGNoZXNKYXZhRmllbGROYW1lKGZpZWxkTmFtZSArICJfIiArIHBrQ29sdW1uLmdldE5hbWUoKSkpIHsKLQkJCQlpZiAoY29sdW1uUGFpci5nZXRSZWZlcmVuY2VkQ29sdW1uKCkgPT0gcGtDb2x1bW4pIHsKLQkJCQkJLy8gd2Ugc2hvdWxkbid0IGdldCBoZXJlLi4uCi0JCQkJfSBlbHNlIHsKLQkJCQkJcHcucHJpbnQoZWxlbWVudE5hbWUpOwotCQkJCQlwdy5wcmludCgnPScpOwotCQkJCQl0aGlzLnByaW50Sm9pbkNvbHVtbkFubm90YXRpb25PbihudWxsLCBjb2x1bW5QYWlyLmdldFJlZmVyZW5jZWRDb2x1bW4oKS5nZXROYW1lKCksIHB3KTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmIChjb2x1bW5QYWlyLmdldFJlZmVyZW5jZWRDb2x1bW4oKSA9PSBwa0NvbHVtbikgewotCQkJCQlwdy5wcmludChlbGVtZW50TmFtZSk7Ci0JCQkJCXB3LnByaW50KCc9Jyk7Ci0JCQkJCXRoaXMucHJpbnRKb2luQ29sdW1uQW5ub3RhdGlvbk9uKGNvbHVtblBhaXIuZ2V0QmFzZUNvbHVtbigpLmdldE5hbWUoKSwgbnVsbCwgcHcpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXRoaXMucHJpbnRKb2luVGFibGVKb2luQ29sdW1uc09uKGVsZW1lbnROYW1lLCBmb3JlaWduS2V5LCBwdyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50Sm9pblRhYmxlSm9pbkNvbHVtbnNPbihTdHJpbmcgZWxlbWVudE5hbWUsIEZvcmVpZ25LZXkgZm9yZWlnbktleSwgRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCXB3LnByaW50KGVsZW1lbnROYW1lKTsKLQkJcHcucHJpbnQoJz0nKTsKLQkJaWYgKGZvcmVpZ25LZXkuY29sdW1uUGFpcnNTaXplKCkgPiAxKSB7Ci0JCQlwdy5wcmludCgneycpOwotCQkJcHcucHJpbnRsbigpOwotCQkJcHcuaW5kZW50KCk7Ci0JCX0KLQkJdGhpcy5wcmludEpvaW5Db2x1bW5Bbm5vdGF0aW9uc09uKGZvcmVpZ25LZXksIHB3KTsKLQkJaWYgKGZvcmVpZ25LZXkuY29sdW1uUGFpcnNTaXplKCkgPiAxKSB7Ci0JCQlwdy51bmRlbnQoKTsKLQkJCXB3LnByaW50bG4oKTsKLQkJCXB3LnByaW50KCd9Jyk7Ci0JCQlwdy5wcmludGxuKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRFbnRpdHlOb25Pd25lZE1hbnlUb01hbnlGaWVsZHNPbihFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJZm9yIChJdGVyYXRvcjxNYW55VG9NYW55UmVsYXRpb24+IHN0cmVhbSA9IHRoaXMuZ2VuVGFibGUubm9uT3duZWRNYW55VG9NYW55UmVsYXRpb25zKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJdGhpcy5wcmludEVudGl0eU5vbk93bmVkTWFueVRvTWFueUZpZWxkT24oc3RyZWFtLm5leHQoKSwgcHcpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50RW50aXR5Tm9uT3duZWRNYW55VG9NYW55RmllbGRPbihNYW55VG9NYW55UmVsYXRpb24gcmVsYXRpb24sIEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlTdHJpbmcgZmllbGROYW1lID0gdGhpcy5nZW5UYWJsZS5maWVsZE5hbWVGb3IocmVsYXRpb24pOwotCQlpZiAodGhpcy5jb25maWcuZmllbGRBY2Nlc3NUeXBlKCkpIHsKLQkJCXRoaXMucHJpbnROb25Pd25lZE1hbnlUb01hbnlBbm5vdGF0aW9uT24oZmllbGROYW1lLCByZWxhdGlvbiwgcHcpOwotCQl9Ci0JCXB3LnByaW50VmlzaWJpbGl0eSh0aGlzLmNvbmZpZy5maWVsZFZpc2liaWxpdHkoKSk7Ci0JCXB3LnByaW50VHlwZURlY2xhcmF0aW9uKHRoaXMuY29uZmlnLmdldENvbGxlY3Rpb25UeXBlTmFtZSgpKTsKLQkJcHcucHJpbnQoJzwnKTsKLQkJcHcucHJpbnRUeXBlRGVjbGFyYXRpb24odGhpcy5mdWxseVF1YWxpZnkocmVsYXRpb24ub3duaW5nRW50aXR5TmFtZSgpKSk7Ci0JCXB3LnByaW50KCc+Jyk7Ci0JCXB3LnByaW50KCcgJyk7Ci0JCXB3LnByaW50KGZpZWxkTmFtZSk7Ci0JCXB3LnByaW50KCc7Jyk7Ci0JCXB3LnByaW50bG4oKTsKLQkJcHcucHJpbnRsbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludE5vbk93bmVkTWFueVRvTWFueUFubm90YXRpb25PbihTdHJpbmcgZmllbGROYW1lLCBNYW55VG9NYW55UmVsYXRpb24gcmVsYXRpb24sIEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlwdy5wcmludEFubm90YXRpb24oSlBBLk1BTllfVE9fTUFOWSk7Ci0JCXB3LnByaW50KCIobWFwcGVkQnk9XCIiKTsKLQkJcHcucHJpbnQocmVsYXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCXB3LnByaW50KCJcIikiKTsKLQkJcHcucHJpbnRsbigpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGZ1bGx5UXVhbGlmeShTdHJpbmcgc2hvcnRDbGFzc05hbWUpIHsKLQkJU3RyaW5nIHBrZyA9IHRoaXMucGFja2FnZU5hbWUoKTsKLQkJcmV0dXJuIChwa2cubGVuZ3RoKCkgPT0gMCkgPyBzaG9ydENsYXNzTmFtZSA6IHBrZyArICcuJyArIHNob3J0Q2xhc3NOYW1lOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludFNlcmlhbFZlcnNpb25VSUQoRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCWlmICh0aGlzLmNvbmZpZy5nZW5lcmF0ZVNlcmlhbFZlcnNpb25VSUQoKSkgewotCQkJcHcucHJpbnQoInByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOyIpOwotCQkJcHcucHJpbnRsbigpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50WmVyb0FyZ3VtZW50Q29uc3RydWN0b3JPbihTdHJpbmcgY3Rvck5hbWUsIFN0cmluZyB2aXNpYmlsaXR5LCBFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJaWYgKHRoaXMuY29uZmlnLmdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yKCkpIHsKLQkJCXB3LnByaW50VmlzaWJpbGl0eSh2aXNpYmlsaXR5KTsKLQkJCXB3LnByaW50KGN0b3JOYW1lKTsKLQkJCXB3LnByaW50KCIoKSB7Iik7Ci0JCQlwdy5wcmludGxuKCk7Ci0JCQlwdy5pbmRlbnQoKTsKLQkJCQlwdy5wcmludGxuKCJzdXBlcigpOyIpOwotCQkJcHcudW5kZW50KCk7Ci0JCQlwdy5wcmludCgnfScpOwotCQkJcHcucHJpbnRsbigpOwotCQkJcHcucHJpbnRsbigpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50RW50aXR5UHJpbWFyeUtleUdldHRlcnNBbmRTZXR0ZXJzT24oRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCWlmICgodGhpcy50YWJsZSgpLnByaW1hcnlLZXlDb2x1bW5zU2l6ZSgpID4gMSkgJiYgdGhpcy5jb25maWcuZ2VuZXJhdGVFbWJlZGRlZElkRm9yQ29tcG91bmRQSygpKSB7Ci0JCQl0aGlzLnByaW50RW50aXR5RW1iZWRkZWRJZFByaW1hcnlLZXlHZXR0ZXJBbmRTZXR0ZXJPbihwdyk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLnByaW50RW50aXR5UmVhZE9ubHlQcmltYXJ5S2V5R2V0dGVyc0FuZFNldHRlcnNPbihwdyk7Ci0JCQl0aGlzLnByaW50RW50aXR5V3JpdGFibGVQcmltYXJ5S2V5R2V0dGVyc0FuZFNldHRlcnNPbihwdyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRFbnRpdHlFbWJlZGRlZElkUHJpbWFyeUtleUdldHRlckFuZFNldHRlck9uKEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlpZiAodGhpcy5jb25maWcucHJvcGVydHlBY2Nlc3NUeXBlKCkpIHsKLQkJCXB3LnByaW50QW5ub3RhdGlvbihKUEEuRU1CRURERURfSUQpOwotCQkJcHcucHJpbnRsbigpOwotCQl9Ci0JCXB3LnByaW50R2V0dGVyQW5kU2V0dGVyKHRoaXMuZ2VuVGFibGUuZmllbGROYW1lRm9yRW1iZWRkZWRJZCgpLCB0aGlzLmVudGl0eUNsYXNzTmFtZSArICIuUEsiLCB0aGlzLmNvbmZpZy5tZXRob2RWaXNpYmlsaXR5KCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludEVudGl0eVJlYWRPbmx5UHJpbWFyeUtleUdldHRlcnNBbmRTZXR0ZXJzT24oRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCWZvciAoSXRlcmF0b3I8Q29sdW1uPiBzdHJlYW0gPSB0aGlzLmdlblRhYmxlLnJlYWRPbmx5UHJpbWFyeUtleUNvbHVtbnMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQl0aGlzLnByaW50RW50aXR5UmVhZE9ubHlQcmltYXJ5S2V5R2V0dGVyQW5kU2V0dGVyT24oc3RyZWFtLm5leHQoKSwgcHcpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50RW50aXR5UmVhZE9ubHlQcmltYXJ5S2V5R2V0dGVyQW5kU2V0dGVyT24oQ29sdW1uIGNvbHVtbiwgRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCVN0cmluZyBwcm9wZXJ0eU5hbWUgPSB0aGlzLmdlblRhYmxlLmZpZWxkTmFtZUZvcihjb2x1bW4pOwotCQlpZiAodGhpcy5jb25maWcucHJvcGVydHlBY2Nlc3NUeXBlKCkpIHsKLQkJCXB3LnByaW50QW5ub3RhdGlvbihKUEEuSUQpOwotCQkJcHcucHJpbnRsbigpOwotCQkJaWYgKGNvbHVtbi5tYXRjaGVzSmF2YUZpZWxkTmFtZShwcm9wZXJ0eU5hbWUpKSB7Ci0JCQkJdGhpcy5wcmludFJlYWRPbmx5Q29sdW1uQW5ub3RhdGlvbk9uKHB3KTsgIC8vIG5vIENvbHVtbiBuYW1lIG5lZWRlZAotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLnByaW50UmVhZE9ubHlDb2x1bW5Bbm5vdGF0aW9uT24oY29sdW1uLmdldE5hbWUoKSwgcHcpOwotCQkJfQotCQl9Ci0KLQkJcHcucHJpbnRHZXR0ZXJBbmRTZXR0ZXIocHJvcGVydHlOYW1lLCBjb2x1bW4uamF2YVR5cGVEZWNsYXJhdGlvbigpLCB0aGlzLmNvbmZpZy5tZXRob2RWaXNpYmlsaXR5KCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludEVudGl0eVdyaXRhYmxlUHJpbWFyeUtleUdldHRlcnNBbmRTZXR0ZXJzT24oRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCWZvciAoSXRlcmF0b3I8Q29sdW1uPiBzdHJlYW0gPSB0aGlzLmdlblRhYmxlLndyaXRhYmxlUHJpbWFyeUtleUNvbHVtbnMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQl0aGlzLnByaW50RW50aXR5V3JpdGFibGVQcmltYXJ5S2V5R2V0dGVyQW5kU2V0dGVyT24oc3RyZWFtLm5leHQoKSwgcHcpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50RW50aXR5V3JpdGFibGVQcmltYXJ5S2V5R2V0dGVyQW5kU2V0dGVyT24oQ29sdW1uIGNvbHVtbiwgRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCVN0cmluZyBwcm9wZXJ0eU5hbWUgPSB0aGlzLmdlblRhYmxlLmZpZWxkTmFtZUZvcihjb2x1bW4pOwotCQlpZiAodGhpcy5jb25maWcucHJvcGVydHlBY2Nlc3NUeXBlKCkpIHsKLQkJCXB3LnByaW50QW5ub3RhdGlvbihKUEEuSUQpOwotCQkJcHcucHJpbnRsbigpOwotCQkJaWYgKCAhIGNvbHVtbi5tYXRjaGVzSmF2YUZpZWxkTmFtZShwcm9wZXJ0eU5hbWUpKSB7Ci0JCQkJdGhpcy5wcmludENvbHVtbkFubm90YXRpb25Pbihjb2x1bW4uZ2V0TmFtZSgpLCBwdyk7Ci0JCQl9Ci0JCX0KLQotCQlwdy5wcmludEdldHRlckFuZFNldHRlcihwcm9wZXJ0eU5hbWUsIGNvbHVtbi5qYXZhVHlwZURlY2xhcmF0aW9uKCksIHRoaXMuY29uZmlnLm1ldGhvZFZpc2liaWxpdHkoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50RW50aXR5Tm9uUHJpbWFyeUtleUJhc2ljR2V0dGVyc0FuZFNldHRlcnNPbihFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJZm9yIChJdGVyYXRvcjxDb2x1bW4+IHN0cmVhbSA9IHRoaXMuZ2VuVGFibGUubm9uUHJpbWFyeUtleUJhc2ljQ29sdW1ucygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCXRoaXMucHJpbnRFbnRpdHlOb25QcmltYXJ5S2V5QmFzaWNHZXR0ZXJBbmRTZXR0ZXJPbihzdHJlYW0ubmV4dCgpLCBwdyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRFbnRpdHlOb25QcmltYXJ5S2V5QmFzaWNHZXR0ZXJBbmRTZXR0ZXJPbihDb2x1bW4gY29sdW1uLCBFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IHRoaXMuZ2VuVGFibGUuZmllbGROYW1lRm9yKGNvbHVtbik7Ci0JCWlmICh0aGlzLmNvbmZpZy5wcm9wZXJ0eUFjY2Vzc1R5cGUoKSkgewotCQkJaWYgKCAhIGNvbHVtbi5tYXRjaGVzSmF2YUZpZWxkTmFtZShwcm9wZXJ0eU5hbWUpKSB7Ci0JCQkJdGhpcy5wcmludENvbHVtbkFubm90YXRpb25Pbihjb2x1bW4uZ2V0TmFtZSgpLCBwdyk7Ci0JCQl9Ci0JCX0KLQotCQlwdy5wcmludEdldHRlckFuZFNldHRlcihwcm9wZXJ0eU5hbWUsIGNvbHVtbi5qYXZhVHlwZURlY2xhcmF0aW9uKCksIHRoaXMuY29uZmlnLm1ldGhvZFZpc2liaWxpdHkoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50RW50aXR5TWFueVRvT25lR2V0dGVyc0FuZFNldHRlcnNPbihFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJZm9yIChJdGVyYXRvcjxNYW55VG9PbmVSZWxhdGlvbj4gc3RyZWFtID0gdGhpcy5nZW5UYWJsZS5tYW55VG9PbmVSZWxhdGlvbnMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQl0aGlzLnByaW50RW50aXR5TWFueVRvT25lR2V0dGVyQW5kU2V0dGVyT24oc3RyZWFtLm5leHQoKSwgcHcpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50RW50aXR5TWFueVRvT25lR2V0dGVyQW5kU2V0dGVyT24oTWFueVRvT25lUmVsYXRpb24gcmVsYXRpb24sIEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gdGhpcy5nZW5UYWJsZS5maWVsZE5hbWVGb3IocmVsYXRpb24pOwotCQlpZiAodGhpcy5jb25maWcucHJvcGVydHlBY2Nlc3NUeXBlKCkpIHsKLQkJCXRoaXMucHJpbnRNYW55VG9PbmVBbm5vdGF0aW9uT24ocHJvcGVydHlOYW1lLCByZWxhdGlvbiwgcHcpOwotCQl9Ci0KLQkJU3RyaW5nIHR5cGVEZWNsYXJhdGlvbiA9IHRoaXMuZnVsbHlRdWFsaWZ5KHJlbGF0aW9uLnJlZmVyZW5jZWRFbnRpdHlOYW1lKCkpOwotCQlwdy5wcmludEdldHRlckFuZFNldHRlcihwcm9wZXJ0eU5hbWUsIHR5cGVEZWNsYXJhdGlvbiwgdGhpcy5jb25maWcubWV0aG9kVmlzaWJpbGl0eSgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRFbnRpdHlPbmVUb01hbnlHZXR0ZXJzQW5kU2V0dGVyc09uKEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlmb3IgKEl0ZXJhdG9yPE9uZVRvTWFueVJlbGF0aW9uPiBzdHJlYW0gPSB0aGlzLmdlblRhYmxlLm9uZVRvTWFueVJlbGF0aW9ucygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCXRoaXMucHJpbnRFbnRpdHlPbmVUb01hbnlHZXR0ZXJBbmRTZXR0ZXJPbihzdHJlYW0ubmV4dCgpLCBwdyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRFbnRpdHlPbmVUb01hbnlHZXR0ZXJBbmRTZXR0ZXJPbihPbmVUb01hbnlSZWxhdGlvbiByZWxhdGlvbiwgRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCVN0cmluZyBwcm9wZXJ0eU5hbWUgPSB0aGlzLmdlblRhYmxlLmZpZWxkTmFtZUZvcihyZWxhdGlvbik7Ci0JCWlmICh0aGlzLmNvbmZpZy5wcm9wZXJ0eUFjY2Vzc1R5cGUoKSkgewotCQkJdGhpcy5wcmludE9uZVRvTWFueUFubm90YXRpb25Pbihwcm9wZXJ0eU5hbWUsIHJlbGF0aW9uLCBwdyk7Ci0JCX0KLQotCQlTdHJpbmcgZWxlbWVudFR5cGVEZWNsYXJhdGlvbiA9IHRoaXMuZnVsbHlRdWFsaWZ5KHJlbGF0aW9uLnJlZmVyZW5jZWRFbnRpdHlOYW1lKCkpOwotCQlwdy5wcmludENvbGxlY3Rpb25HZXR0ZXJBbmRTZXR0ZXIocHJvcGVydHlOYW1lLCB0aGlzLmNvbmZpZy5nZXRDb2xsZWN0aW9uVHlwZU5hbWUoKSwgZWxlbWVudFR5cGVEZWNsYXJhdGlvbiwgdGhpcy5jb25maWcubWV0aG9kVmlzaWJpbGl0eSgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRFbnRpdHlPd25lZE1hbnlUb01hbnlHZXR0ZXJzQW5kU2V0dGVyc09uKEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlmb3IgKEl0ZXJhdG9yPE1hbnlUb01hbnlSZWxhdGlvbj4gc3RyZWFtID0gdGhpcy5nZW5UYWJsZS5vd25lZE1hbnlUb01hbnlSZWxhdGlvbnMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQl0aGlzLnByaW50RW50aXR5T3duZWRNYW55VG9NYW55R2V0dGVyQW5kU2V0dGVyT24oc3RyZWFtLm5leHQoKSwgcHcpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50RW50aXR5T3duZWRNYW55VG9NYW55R2V0dGVyQW5kU2V0dGVyT24oTWFueVRvTWFueVJlbGF0aW9uIHJlbGF0aW9uLCBFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IHRoaXMuZ2VuVGFibGUuZmllbGROYW1lRm9yKHJlbGF0aW9uKTsKLQkJaWYgKHRoaXMuY29uZmlnLnByb3BlcnR5QWNjZXNzVHlwZSgpKSB7Ci0JCQl0aGlzLnByaW50T3duZWRNYW55VG9NYW55QW5ub3RhdGlvbk9uKHByb3BlcnR5TmFtZSwgcmVsYXRpb24sIHB3KTsKLQkJfQotCi0JCVN0cmluZyBlbGVtZW50VHlwZURlY2xhcmF0aW9uID0gdGhpcy5mdWxseVF1YWxpZnkocmVsYXRpb24ubm9uT3duaW5nRW50aXR5TmFtZSgpKTsKLQkJcHcucHJpbnRDb2xsZWN0aW9uR2V0dGVyQW5kU2V0dGVyKHByb3BlcnR5TmFtZSwgdGhpcy5jb25maWcuZ2V0Q29sbGVjdGlvblR5cGVOYW1lKCksIGVsZW1lbnRUeXBlRGVjbGFyYXRpb24sIHRoaXMuY29uZmlnLm1ldGhvZFZpc2liaWxpdHkoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50RW50aXR5Tm9uT3duZWRNYW55VG9NYW55R2V0dGVyc0FuZFNldHRlcnNPbihFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJZm9yIChJdGVyYXRvcjxNYW55VG9NYW55UmVsYXRpb24+IHN0cmVhbSA9IHRoaXMuZ2VuVGFibGUubm9uT3duZWRNYW55VG9NYW55UmVsYXRpb25zKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJdGhpcy5wcmludEVudGl0eU5vbk93bmVkTWFueVRvTWFueUdldHRlckFuZFNldHRlck9uKHN0cmVhbS5uZXh0KCksIHB3KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludEVudGl0eU5vbk93bmVkTWFueVRvTWFueUdldHRlckFuZFNldHRlck9uKE1hbnlUb01hbnlSZWxhdGlvbiByZWxhdGlvbiwgRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCVN0cmluZyBwcm9wZXJ0eU5hbWUgPSB0aGlzLmdlblRhYmxlLmZpZWxkTmFtZUZvcihyZWxhdGlvbik7Ci0JCWlmICh0aGlzLmNvbmZpZy5wcm9wZXJ0eUFjY2Vzc1R5cGUoKSkgewotCQkJdGhpcy5wcmludE5vbk93bmVkTWFueVRvTWFueUFubm90YXRpb25Pbihwcm9wZXJ0eU5hbWUsIHJlbGF0aW9uLCBwdyk7Ci0JCX0KLQotCQlTdHJpbmcgZWxlbWVudFR5cGVEZWNsYXJhdGlvbiA9IHRoaXMuZnVsbHlRdWFsaWZ5KHJlbGF0aW9uLm93bmluZ0VudGl0eU5hbWUoKSk7Ci0JCXB3LnByaW50Q29sbGVjdGlvbkdldHRlckFuZFNldHRlcihwcm9wZXJ0eU5hbWUsIHRoaXMuY29uZmlnLmdldENvbGxlY3Rpb25UeXBlTmFtZSgpLCBlbGVtZW50VHlwZURlY2xhcmF0aW9uLCB0aGlzLmNvbmZpZy5tZXRob2RWaXNpYmlsaXR5KCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludFByaW1hcnlLZXlDbGFzc09uKEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlpZiAodGhpcy50YWJsZSgpLnByaW1hcnlLZXlDb2x1bW5zU2l6ZSgpIDw9IDEpIHsKLQkJCXJldHVybjsKLQkJfQotCQlwdy5wcmludGxuKCk7Ci0JCWlmICh0aGlzLmNvbmZpZy5nZW5lcmF0ZUVtYmVkZGVkSWRGb3JDb21wb3VuZFBLKCkpIHsKLQkJCXB3LnByaW50QW5ub3RhdGlvbihKUEEuRU1CRUREQUJMRSk7Ci0JCQlwdy5wcmludGxuKCk7Ci0JCX0KLQkJcHcucHJpbnQoInB1YmxpYyBzdGF0aWMgY2xhc3MgUEsgaW1wbGVtZW50cyAiKTsKLQkJcHcucHJpbnRUeXBlRGVjbGFyYXRpb24oU2VyaWFsaXphYmxlLmNsYXNzLmdldE5hbWUoKSk7Ci0JCXB3LnByaW50KCIgeyIpOwotCQlwdy5wcmludGxuKCk7Ci0KLQkJcHcuaW5kZW50KCk7Ci0JCQl0aGlzLnByaW50SWRGaWVsZHNPbihwdyk7Ci0JCQl0aGlzLnByaW50U2VyaWFsVmVyc2lvblVJRChwdyk7Ci0JCQlwdy5wcmludGxuKCk7Ci0JCQl0aGlzLnByaW50WmVyb0FyZ3VtZW50Q29uc3RydWN0b3JPbigiUEsiLCAicHVibGljIiwgcHcpOwotCi0JCQlpZiAodGhpcy5jb25maWcucHJvcGVydHlBY2Nlc3NUeXBlKCkgfHwgdGhpcy5jb25maWcuZ2VuZXJhdGVHZXR0ZXJzQW5kU2V0dGVycygpKSB7Ci0JCQkJdGhpcy5wcmludElkR2V0dGVyc0FuZFNldHRlcnNPbihwdyk7Ci0JCQl9Ci0KLQkJCXRoaXMucHJpbnRFcXVhbHNNZXRob2RPbigiUEsiLCB0aGlzLnRhYmxlKCkucHJpbWFyeUtleUNvbHVtbnMoKSwgcHcpOwotCQkJdGhpcy5wcmludEhhc2hDb2RlTWV0aG9kT24odGhpcy50YWJsZSgpLnByaW1hcnlLZXlDb2x1bW5zKCksIHB3KTsKLQkJcHcudW5kZW50KCk7Ci0KLQkJcHcucHJpbnQoJ30nKTsKLQkJcHcucHJpbnRsbigpOwotCQlwdy5wcmludGxuKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50SWRGaWVsZHNPbihFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJZm9yIChJdGVyYXRvcjxDb2x1bW4+IHN0cmVhbSA9IHRoaXMudGFibGUoKS5wcmltYXJ5S2V5Q29sdW1ucygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCXRoaXMucHJpbnRJZEZpZWxkT24oc3RyZWFtLm5leHQoKSwgcHcpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50SWRGaWVsZE9uKENvbHVtbiBjb2x1bW4sIEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlTdHJpbmcgZmllbGROYW1lID0gdGhpcy5nZW5UYWJsZS5maWVsZE5hbWVGb3IoY29sdW1uKTsKLQkJcHcucHJpbnRWaXNpYmlsaXR5KHRoaXMuY29uZmlnLmZpZWxkVmlzaWJpbGl0eSgpKTsKLQkJcHcucHJpbnRUeXBlRGVjbGFyYXRpb24oY29sdW1uLmphdmFUeXBlRGVjbGFyYXRpb24oKSk7Ci0JCXB3LnByaW50KCcgJyk7Ci0JCXB3LnByaW50KGZpZWxkTmFtZSk7Ci0JCXB3LnByaW50KCc7Jyk7Ci0JCXB3LnByaW50bG4oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRJZEdldHRlcnNBbmRTZXR0ZXJzT24oRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCWZvciAoSXRlcmF0b3I8Q29sdW1uPiBzdHJlYW0gPSB0aGlzLnRhYmxlKCkucHJpbWFyeUtleUNvbHVtbnMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQl0aGlzLnByaW50SWRHZXR0ZXJBbmRTZXR0ZXJPbihzdHJlYW0ubmV4dCgpLCBwdyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRJZEdldHRlckFuZFNldHRlck9uKENvbHVtbiBjb2x1bW4sIEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gdGhpcy5nZW5UYWJsZS5maWVsZE5hbWVGb3IoY29sdW1uKTsKLQkJcHcucHJpbnRHZXR0ZXJBbmRTZXR0ZXIocHJvcGVydHlOYW1lLCBjb2x1bW4uamF2YVR5cGVEZWNsYXJhdGlvbigpLCB0aGlzLmNvbmZpZy5tZXRob2RWaXNpYmlsaXR5KCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludEVxdWFsc01ldGhvZE9uKFN0cmluZyBjbGFzc05hbWUsIEl0ZXJhdG9yPENvbHVtbj4gY29sdW1ucywgRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCXB3LnByaW50QW5ub3RhdGlvbigiamF2YS5sYW5nLk92ZXJyaWRlIik7Ci0JCXB3LnByaW50bG4oKTsKLQotCQlwdy5wcmludGxuKCJwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsiKTsKLQkJcHcuaW5kZW50KCk7Ci0JCQlwdy5wcmludGxuKCJpZiAobyA9PSB0aGlzKSB7Iik7Ci0JCQlwdy5pbmRlbnQoKTsKLQkJCQlwdy5wcmludGxuKCJyZXR1cm4gdHJ1ZTsiKTsKLQkJCXB3LnVuZGVudCgpOwotCQkJcHcucHJpbnQoJ30nKTsKLQkJCXB3LnByaW50bG4oKTsKLQotCQkJcHcucHJpbnQoImlmICggISAobyBpbnN0YW5jZW9mICIpOwotCQkJcHcucHJpbnQoY2xhc3NOYW1lKTsKLQkJCXB3LnByaW50KCIpKSB7Iik7Ci0JCQlwdy5wcmludGxuKCk7Ci0JCQlwdy5pbmRlbnQoKTsKLQkJCQlwdy5wcmludGxuKCJyZXR1cm4gZmFsc2U7Iik7Ci0JCQlwdy51bmRlbnQoKTsKLQkJCXB3LnByaW50KCd9Jyk7Ci0JCQlwdy5wcmludGxuKCk7Ci0KLQkJCXB3LnByaW50KGNsYXNzTmFtZSk7Ci0JCQlwdy5wcmludCgiIG90aGVyID0gKCIpOwotCQkJcHcucHJpbnQoY2xhc3NOYW1lKTsKLQkJCXB3LnByaW50KCIpIG87Iik7Ci0JCQlwdy5wcmludGxuKCk7Ci0KLQkJCXB3LnByaW50KCJyZXR1cm4gIik7Ci0JCQlwdy5pbmRlbnQoKTsKLQkJCQl3aGlsZSAoY29sdW1ucy5oYXNOZXh0KCkpIHsKLQkJCQkJdGhpcy5wcmludEVxdWFsc0NsYXVzZU9uKGNvbHVtbnMubmV4dCgpLCBwdyk7Ci0JCQkJCWlmIChjb2x1bW5zLmhhc05leHQoKSkgewotCQkJCQkJcHcucHJpbnRsbigpOwotCQkJCQkJcHcucHJpbnQoIiYmICIpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXB3LnByaW50KCc7Jyk7Ci0JCQkJcHcucHJpbnRsbigpOwotCQkJcHcudW5kZW50KCk7Ci0JCXB3LnVuZGVudCgpOwotCQlwdy5wcmludCgnfScpOwotCQlwdy5wcmludGxuKCk7Ci0JCXB3LnByaW50bG4oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRFcXVhbHNDbGF1c2VPbihDb2x1bW4gY29sdW1uLCBFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJU3RyaW5nIGZpZWxkTmFtZSA9IHRoaXMuZ2VuVGFibGUuZmllbGROYW1lRm9yKGNvbHVtbik7Ci0JCUphdmFUeXBlIGphdmFUeXBlID0gY29sdW1uLmphdmFUeXBlKCk7Ci0JCWlmIChqYXZhVHlwZS5pc1ByaW1pdGl2ZSgpKSB7Ci0JCQl0aGlzLnByaW50UHJpbWl0aXZlRXF1YWxzQ2xhdXNlT24oZmllbGROYW1lLCBwdyk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLnByaW50UmVmZXJlbmNlRXF1YWxzQ2xhdXNlT24oZmllbGROYW1lLCBwdyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRQcmltaXRpdmVFcXVhbHNDbGF1c2VPbihTdHJpbmcgZmllbGROYW1lLCBFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJcHcucHJpbnQoIih0aGlzLiIpOwotCQlwdy5wcmludChmaWVsZE5hbWUpOwotCQlwdy5wcmludCgiID09IG90aGVyLiIpOwotCQlwdy5wcmludChmaWVsZE5hbWUpOwotCQlwdy5wcmludCgnKScpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludFJlZmVyZW5jZUVxdWFsc0NsYXVzZU9uKFN0cmluZyBmaWVsZE5hbWUsIEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlwdy5wcmludCgidGhpcy4iKTsKLQkJcHcucHJpbnQoZmllbGROYW1lKTsKLQkJcHcucHJpbnQoIi5lcXVhbHMob3RoZXIuIik7Ci0JCXB3LnByaW50KGZpZWxkTmFtZSk7Ci0JCXB3LnByaW50KCcpJyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50SGFzaENvZGVNZXRob2RPbihJdGVyYXRvcjxDb2x1bW4+IGNvbHVtbnMsIEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlwdy5wcmludEFubm90YXRpb24oImphdmEubGFuZy5PdmVycmlkZSIpOwotCQlwdy5wcmludGxuKCk7Ci0KLQkJcHcucHJpbnRsbigicHVibGljIGludCBoYXNoQ29kZSgpIHsiKTsKLQkJcHcuaW5kZW50KCk7Ci0JCQlwdy5wcmludCgicmV0dXJuICIpOwotCQkJcHcuaW5kZW50KCk7Ci0JCQkJd2hpbGUgKGNvbHVtbnMuaGFzTmV4dCgpKSB7Ci0JCQkJCXRoaXMucHJpbnRIYXNoQ29kZUNsYXVzZU9uKGNvbHVtbnMubmV4dCgpLCBwdyk7Ci0JCQkJCWlmIChjb2x1bW5zLmhhc05leHQoKSkgewotCQkJCQkJcHcucHJpbnRsbigpOwotCQkJCQkJcHcucHJpbnQoIl4gIik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcHcucHJpbnQoJzsnKTsKLQkJCQlwdy5wcmludGxuKCk7Ci0JCQlwdy51bmRlbnQoKTsKLQkJcHcudW5kZW50KCk7Ci0JCXB3LnByaW50KCd9Jyk7Ci0JCXB3LnByaW50bG4oKTsKLQkJcHcucHJpbnRsbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludEhhc2hDb2RlQ2xhdXNlT24oQ29sdW1uIGNvbHVtbiwgRW50aXR5U291cmNlV3JpdGVyIHB3KSB7Ci0JCVN0cmluZyBmaWVsZE5hbWUgPSB0aGlzLmdlblRhYmxlLmZpZWxkTmFtZUZvcihjb2x1bW4pOwotCQlKYXZhVHlwZSBqYXZhVHlwZSA9IGNvbHVtbi5qYXZhVHlwZSgpOwotCQlpZiAoamF2YVR5cGUuaXNQcmltaXRpdmUoKSkgewotCQkJdGhpcy5wcmludFByaW1pdGl2ZUhhc2hDb2RlQ2xhdXNlT24oamF2YVR5cGUuZ2V0RWxlbWVudFR5cGVOYW1lKCksIGZpZWxkTmFtZSwgcHcpOwotCQl9IGVsc2UgewotCQkJdGhpcy5wcmludFJlZmVyZW5jZUhhc2hDb2RlQ2xhdXNlT24oZmllbGROYW1lLCBwdyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRQcmltaXRpdmVIYXNoQ29kZUNsYXVzZU9uKFN0cmluZyBwcmltaXRpdmVOYW1lLCBTdHJpbmcgZmllbGROYW1lLCBFbnRpdHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJaWYgKHByaW1pdGl2ZU5hbWUuZXF1YWxzKCJpbnQiKSB8fCBwcmltaXRpdmVOYW1lLmVxdWFscygic2hvcnQiKSB8fCBwcmltaXRpdmVOYW1lLmVxdWFscygiYnl0ZSIpIHx8IHByaW1pdGl2ZU5hbWUuZXF1YWxzKCJjaGFyIikpIHsKLQkJCXB3LnByaW50KCJ0aGlzLiIpOwotCQkJcHcucHJpbnQoZmllbGROYW1lKTsKLQkJfSBlbHNlIGlmIChwcmltaXRpdmVOYW1lLmVxdWFscygibG9uZyIpKSB7ICAvLyBjcmliYmVkIGZyb20gTG9uZyNoYXNoQ29kZSgpCi0JCQkvLyAoKGludCkgKHRoaXMudmFsdWUgXiAodGhpcy52YWx1ZSA+Pj4gMzIpKSkKLQkJCXB3LnByaW50KCIoKGludCkgKHRoaXMuIik7Ci0JCQlwdy5wcmludChmaWVsZE5hbWUpOwotCQkJcHcucHJpbnQoIiBeICh0aGlzLiIpOwotCQkJcHcucHJpbnQoZmllbGROYW1lKTsKLQkJCXB3LnByaW50KCIgPj4+IDMyKSkpIik7Ci0JCX0gZWxzZSBpZiAocHJpbWl0aXZlTmFtZS5lcXVhbHMoImRvdWJsZSIpKSB7ICAvLyBjcmliYmVkIGZyb20gRG91YmxlI2hhc2hDb2RlKCkKLQkJCS8vCSgoaW50KSAoamF2YS5sYW5nLkRvdWJsZS5kb3VibGVUb0xvbmdCaXRzKHRoaXMudmFsdWUpIF4gKGphdmEubGFuZy5Eb3VibGUuZG91YmxlVG9Mb25nQml0cyh0aGlzLnZhbHVlKSA+Pj4gMzIpKSkKLQkJCXB3LnByaW50KCIoKGludCkgKCIpOwotCQkJcHcucHJpbnRUeXBlRGVjbGFyYXRpb24oImphdmEubGFuZy5Eb3VibGUiKTsKLQkJCXB3LnByaW50KCIuZG91YmxlVG9Mb25nQml0cyh0aGlzLiIpOwotCQkJcHcucHJpbnQoZmllbGROYW1lKTsKLQkJCXB3LnByaW50KCIpIF4gKCIpOwotCQkJcHcucHJpbnRUeXBlRGVjbGFyYXRpb24oImphdmEubGFuZy5Eb3VibGUiKTsKLQkJCXB3LnByaW50KCIuZG91YmxlVG9Mb25nQml0cyh0aGlzLiIpOwotCQkJcHcucHJpbnQoZmllbGROYW1lKTsKLQkJCXB3LnByaW50KCIpID4+PiAzMikpKSIpOwotCQl9IGVsc2UgaWYgKHByaW1pdGl2ZU5hbWUuZXF1YWxzKCJmbG9hdCIpKSB7ICAvLyBjcmliYmVkIGZyb20gRmxvYXQjaGFzaENvZGUoKQotCQkJLy8gamF2YS5sYW5nLkZsb2F0LmZsb2F0VG9JbnRCaXRzKHRoaXMudmFsdWUpCi0JCQlwdy5wcmludFR5cGVEZWNsYXJhdGlvbigiamF2YS5sYW5nLkZsb2F0Iik7Ci0JCQlwdy5wcmludCgiLmZsb2F0VG9JbnRCaXRzKHRoaXMuIik7Ci0JCQlwdy5wcmludChmaWVsZE5hbWUpOwotCQkJcHcucHJpbnQoJyknKTsKLQkJfSBlbHNlIGlmIChwcmltaXRpdmVOYW1lLmVxdWFscygiYm9vbGVhbiIpKSB7ICAvLyBjcmliYmVkIGZyb20gQm9vbGVhbiNoYXNoQ29kZSgpCi0JCQkvLyAodGhpcy52YWx1ZSA/IDEyMzEgOiAxMjM3KQotCQkJcHcucHJpbnQoIih0aGlzLiIpOwotCQkJcHcucHJpbnQoZmllbGROYW1lKTsKLQkJCXB3LnByaW50KCIgPyAxMjMxIDogMTIzNykiKTsKLQkJfSBlbHNlIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24ocHJpbWl0aXZlTmFtZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRSZWZlcmVuY2VIYXNoQ29kZUNsYXVzZU9uKFN0cmluZyBmaWVsZE5hbWUsIEVudGl0eVNvdXJjZVdyaXRlciBwdykgewotCQlwdy5wcmludCgidGhpcy4iKTsKLQkJcHcucHJpbnQoZmllbGROYW1lKTsKLQkJcHcucHJpbnQoIi5oYXNoQ29kZSgpIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50UGFja2FnZUFuZEltcG9ydHNPbihQcmludFdyaXRlciBwdywgQm9keVNvdXJjZSBib2R5U291cmNlKSB7Ci0JCWlmICh0aGlzLnBhY2thZ2VOYW1lKCkubGVuZ3RoKCkgIT0gMCkgewotCQkJcHcucHJpbnQoInBhY2thZ2UgIik7Ci0JCQlwdy5wcmludCh0aGlzLnBhY2thZ2VOYW1lKCkpOwotCQkJcHcucHJpbnQoJzsnKTsKLQkJCXB3LnByaW50bG4oKTsKLQkJCXB3LnByaW50bG4oKTsKLQkJfQotCi0JCWZvciAoSXRlcmF0b3I8TWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPj4gc3RyZWFtID0gYm9keVNvdXJjZS5pbXBvcnRFbnRyaWVzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPiBlbnRyeSA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlwdy5wcmludCgiaW1wb3J0ICIpOwotCQkJcHcucHJpbnQoZW50cnkuZ2V0VmFsdWUoKSk7ICAvLyBwYWNrYWdlCi0JCQlwdy5wcmludCgnLicpOwotCQkJcHcucHJpbnQoZW50cnkuZ2V0S2V5KCkpOyAgLy8gc2hvcnQgY2xhc3MgbmFtZQotCQkJcHcucHJpbnQoJzsnKTsKLQkJCXB3LnByaW50bG4oKTsKLQkJfQotCQlwdy5wcmludGxuKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnZlbmllbmNlIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBTdHJpbmcgcGFja2FnZU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnBhY2thZ2VGcmFnbWVudC5nZXRFbGVtZW50TmFtZSgpOwotCX0KLQotCXByaXZhdGUgVGFibGUgdGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLmdlblRhYmxlLmdldFRhYmxlKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZW50aXR5TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2VuVGFibGUuZ2V0RW50aXR5TmFtZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB3cml0ZXIgKioqKioqKioqKgotCi0JcHJpdmF0ZSBpbnRlcmZhY2UgQm9keVNvdXJjZSB7Ci0KLQkJLyoqCi0JCSAqIHJldHVybiBhIHNvcnRlZCBzZXQgb2YgbWFwIGVudHJpZXM7IHRoZSBrZXkgaXMgdGhlIHNob3J0IGNsYXNzIG5hbWUsCi0JCSAqIHRoZSB2YWx1ZSBpcyB0aGUgcGFja2FnZSBuYW1lCi0JCSAqLwotCQlJdGVyYXRvcjxNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+PiBpbXBvcnRFbnRyaWVzKCk7Ci0KLQkJLyoqCi0JCSAqIHJldHVybiB0aGUgYm9keSBzb3VyY2UgY29kZQotCQkgKi8KLQkJU3RyaW5nIHNvdXJjZSgpOwotCi0JCS8qKgotCQkgKiByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgYm9keSBzb3VyY2UgY29kZQotCQkgKi8KLQkJaW50IGxlbmd0aCgpOwotCi0JfQotCi0JLyoqCi0JICogRXh0ZW5kIEluZGVudGluZ1ByaW50V3JpdGVyIHdpdGggc29tZSBtZXRob2RzIHRoYXQgZmFjaWxpdGF0ZSBidWlsZGluZwotCSAqIGVudGl0eSBzb3VyY2UgY29kZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBFbnRpdHlTb3VyY2VXcml0ZXIgZXh0ZW5kcyBJbmRlbnRpbmdQcmludFdyaXRlciBpbXBsZW1lbnRzIEJvZHlTb3VyY2UgewotCQlmaW5hbCBTdHJpbmcgcGFja2FnZU5hbWU7Ci0JCWZpbmFsIFN0cmluZyBlbnRpdHlDbGFzc05hbWU7Ci0JCS8vIGtleSA9IHNob3J0IGNsYXNzIG5hbWU7IHZhbHVlID0gcGFja2FnZSBuYW1lCi0JCXByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBpbXBvcnRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0KLQkJRW50aXR5U291cmNlV3JpdGVyKFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIGVudGl0eUNsYXNzTmFtZSkgewotCQkJc3VwZXIobmV3IFN0cmluZ1dyaXRlcigyMDAwMCkpOwotCQkJdGhpcy5wYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lOwotCQkJdGhpcy5lbnRpdHlDbGFzc05hbWUgPSBlbnRpdHlDbGFzc05hbWU7Ci0JCX0KLQotCQl2b2lkIHByaW50VmlzaWJpbGl0eShTdHJpbmcgdmlzaWJpbGl0eU1vZGlmaWVyKSB7Ci0JCQlpZiAodmlzaWJpbGl0eU1vZGlmaWVyLmxlbmd0aCgpICE9IDApIHsKLQkJCQl0aGlzLnByaW50KHZpc2liaWxpdHlNb2RpZmllcik7Ci0JCQkJdGhpcy5wcmludCgnICcpOwotCQkJfQotCQl9Ci0KLQkJdm9pZCBwcmludEFubm90YXRpb24oU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCQl0aGlzLnByaW50KCdAJyk7Ci0JCQl0aGlzLnByaW50VHlwZURlY2xhcmF0aW9uKGFubm90YXRpb25OYW1lKTsKLQkJfQotCi0JCXZvaWQgcHJpbnRUeXBlRGVjbGFyYXRpb24oU3RyaW5nIHR5cGVEZWNsYXJhdGlvbikgewotCQkJdGhpcy5wcmludCh0aGlzLmltcG9ydGVkVHlwZURlY2xhcmF0aW9uKHR5cGVEZWNsYXJhdGlvbikpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIGNsYXNzJ3MgImltcG9ydGVkIiBuYW1lLgotCQkgKiBUaGUgY2xhc3MgZGVjbGFyYXRpb24gbXVzdCBiZSBvZiB0aGUgZm9ybToKLQkJICogICAgICJpbnQiCi0JCSAqICAgICAiaW50W10iIChub3QgIltJIikKLQkJICogICAgICJqYXZhLmxhbmcuT2JqZWN0IgotCQkgKiAgICAgImphdmEubGFuZy5PYmplY3RbXSIgKG5vdCAiW0xqYXZhLmxhbmcuT2JqZWN0OyIpCi0JCSAqICAgICAiamF2YS51dGlsLk1hcC5FbnRyeSIgKG5vdCAiamF2YS51dGlsLk1hcCRFbnRyeSIpCi0JCSAqICAgICAiamF2YS51dGlsLk1hcC5FbnRyeVtdW10iIChub3QgIltbTGphdmEudXRpbC5NYXAkRW50cnk7IikKLQkJICovCi0JCXByaXZhdGUgU3RyaW5nIGltcG9ydGVkVHlwZURlY2xhcmF0aW9uKFN0cmluZyB0eXBlRGVjbGFyYXRpb24pIHsKLQkJCWlmICh0aGlzLnR5cGVEZWNsYXJhdGlvbklzTWVtYmVyQ2xhc3ModHlwZURlY2xhcmF0aW9uKSkgewotCQkJCS8vIG5vIG5lZWQgZm9yIGFuIGltcG9ydCwganVzdCByZXR1cm4gdGhlIHBhcnRpYWxseS1xdWFsaWZpZWQgbmFtZQotCQkJCXJldHVybiB0aGlzLm1lbWJlckNsYXNzVHlwZURlY2xhcmF0aW9uKHR5cGVEZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCQlpbnQgbGFzdCA9IHR5cGVEZWNsYXJhdGlvbi5sYXN0SW5kZXhPZignLicpOwotCQkJU3RyaW5nIHBrZyA9IChsYXN0ID09IC0xKSA/ICIiIDogdHlwZURlY2xhcmF0aW9uLnN1YnN0cmluZygwLCBsYXN0KTsKLQkJCVN0cmluZyBzaG9ydFR5cGVEZWNsYXJhdGlvbiA9IHR5cGVEZWNsYXJhdGlvbi5zdWJzdHJpbmcobGFzdCArIDEpOwotCQkJU3RyaW5nIHNob3J0RWxlbWVudFR5cGVOYW1lID0gc2hvcnRUeXBlRGVjbGFyYXRpb247Ci0JCQl3aGlsZSAoc2hvcnRFbGVtZW50VHlwZU5hbWUuZW5kc1dpdGgoIltdIikpIHsKLQkJCQlzaG9ydEVsZW1lbnRUeXBlTmFtZSA9IHNob3J0RWxlbWVudFR5cGVOYW1lLnN1YnN0cmluZygwLCBzaG9ydEVsZW1lbnRUeXBlTmFtZS5sZW5ndGgoKSAtIDIpOwotCQkJfQotCQkJU3RyaW5nIHByZXYgPSB0aGlzLmltcG9ydHMuZ2V0KHNob3J0RWxlbWVudFR5cGVOYW1lKTsKLQkJCWlmIChwcmV2ID09IG51bGwpIHsKLQkJCQkvLyB0aGlzIGlzIHRoZSBmaXJzdCBjbGFzcyB3aXRoIHRoaXMgc2hvcnQgZWxlbWVudCB0eXBlIG5hbWUKLQkJCQl0aGlzLmltcG9ydHMucHV0KHNob3J0RWxlbWVudFR5cGVOYW1lLCBwa2cpOwotCQkJCXJldHVybiBzaG9ydFR5cGVEZWNsYXJhdGlvbjsKLQkJCX0KLQkJCWlmIChwcmV2LmVxdWFscyhwa2cpKSB7Ci0JCQkJLy8gdGhpcyBlbGVtZW50IHR5cGUgaGFzIGFscmVhZHkgYmVlbiBpbXBvcnRlZAotCQkJCXJldHVybiBzaG9ydFR5cGVEZWNsYXJhdGlvbjsKLQkJCX0KLQkJCS8vIGFub3RoZXIgY2xhc3Mgd2l0aCB0aGUgc2FtZSBzaG9ydCBlbGVtZW50IHR5cGUgbmFtZSBoYXMgYmVlbgotCQkJLy8gcHJldmlvdXNseSBpbXBvcnRlZCwgc28gdGhpcyBvbmUgbXVzdCBiZSB1c2VkIGZ1bGx5LXF1YWxpZmllZAotCQkJcmV0dXJuIHR5cGVEZWNsYXJhdGlvbjsKLQkJfQotCi0JCS8qKgotCQkgKiBlLmcuICJmb28uYmFyLkVtcGxveWVlLlBLIiB3aWxsIHJldHVybiB0cnVlCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gdHlwZURlY2xhcmF0aW9uSXNNZW1iZXJDbGFzcyhTdHJpbmcgdHlwZURlY2xhcmF0aW9uKSB7Ci0JCQlyZXR1cm4gKHR5cGVEZWNsYXJhdGlvbi5sZW5ndGgoKSA+IHRoaXMuZW50aXR5Q2xhc3NOYW1lLmxlbmd0aCgpKQotCQkJCQkmJiB0eXBlRGVjbGFyYXRpb24uc3RhcnRzV2l0aCh0aGlzLmVudGl0eUNsYXNzTmFtZSkKLQkJCQkJJiYgKHR5cGVEZWNsYXJhdGlvbi5jaGFyQXQodGhpcy5lbnRpdHlDbGFzc05hbWUubGVuZ3RoKCkpID09ICcuJyk7Ci0JCX0KLQotCQkvKioKLQkJICogZS5nLiAiZm9vLmJhci5FbXBsb3llZS5QSyIgd2lsbCByZXR1cm4gIkVtcGxveWVlLlBLIgotCQkgKiB0aGlzIHByZXZlbnRzIGNvbGxpc2lvbnMgd2l0aCBvdGhlciBpbXBvcnRlZCBjbGFzc2VzIChlLmcuICJqb28uamFyLlBLIikKLQkJICovCi0JCXByaXZhdGUgU3RyaW5nIG1lbWJlckNsYXNzVHlwZURlY2xhcmF0aW9uKFN0cmluZyB0eXBlRGVjbGFyYXRpb24pIHsKLQkJCWludCBpbmRleCA9IHRoaXMucGFja2FnZU5hbWUubGVuZ3RoKCk7Ci0JCQlpZiAoaW5kZXggIT0gMCkgewotCQkJCWluZGV4Kys7ICAvLyBidW1wIHBhc3QgdGhlICcuJwotCQkJfQotCQkJcmV0dXJuIHR5cGVEZWNsYXJhdGlvbi5zdWJzdHJpbmcoaW5kZXgpOwotCQl9Ci0KLQkJcHVibGljIEl0ZXJhdG9yPE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4+IGltcG9ydEVudHJpZXMoKSB7Ci0JCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4+KHRoaXMuc29ydGVkSW1wb3J0RW50cmllcygpKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBuZXh0KSB7Ci0JCQkJCVN0cmluZyBwa2cgPSAoKE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4pIG5leHQpLmdldFZhbHVlKCk7Ci0JCQkJCWlmIChwa2cuZXF1YWxzKCIiKQotCQkJCQkJCXx8IHBrZy5lcXVhbHMoImphdmEubGFuZyIpCi0JCQkJCQkJfHwgcGtnLmVxdWFscyhFbnRpdHlTb3VyY2VXcml0ZXIudGhpcy5wYWNrYWdlTmFtZSkpIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJcHJpdmF0ZSBJdGVyYXRvcjxNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+PiBzb3J0ZWRJbXBvcnRFbnRyaWVzKCkgewotCQkJVHJlZVNldDxNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+PiBzb3J0ZWRJbXBvcnRzID0gbmV3IFRyZWVTZXQ8TWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPj4odGhpcy5idWlsZEltcG9ydEVudHJpZXNDb21wYXJhdG9yKCkpOwotCQkJc29ydGVkSW1wb3J0cy5hZGRBbGwodGhpcy5pbXBvcnRzLmVudHJ5U2V0KCkpOwotCQkJcmV0dXJuIHNvcnRlZEltcG9ydHMuaXRlcmF0b3IoKTsKLQkJfQotCi0JCXByaXZhdGUgQ29tcGFyYXRvcjxNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+PiBidWlsZEltcG9ydEVudHJpZXNDb21wYXJhdG9yKCkgewotCQkJcmV0dXJuIG5ldyBDb21wYXJhdG9yPE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4+KCkgewotCQkJCXB1YmxpYyBpbnQgY29tcGFyZShNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+IGUxLCBNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+IGUyKSB7Ci0JCQkJCUNvbGxhdG9yIGNvbGxhdG9yID0gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKTsKLQkJCQkJaW50IHBrZyA9IGNvbGxhdG9yLmNvbXBhcmUoZTEuZ2V0VmFsdWUoKSwgZTIuZ2V0VmFsdWUoKSk7Ci0JCQkJCXJldHVybiAocGtnID09IDApID8gY29sbGF0b3IuY29tcGFyZShlMS5nZXRLZXkoKSwgZTIuZ2V0S2V5KCkpIDogcGtnOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQl2b2lkIHByaW50R2V0dGVyQW5kU2V0dGVyKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyB0eXBlRGVjbGFyYXRpb24sIFN0cmluZyB2aXNpYmlsaXR5KSB7Ci0JCQl0aGlzLnByaW50R2V0dGVyKHByb3BlcnR5TmFtZSwgdHlwZURlY2xhcmF0aW9uLCB2aXNpYmlsaXR5KTsKLQkJCXRoaXMucHJpbnRsbigpOwotCQkJdGhpcy5wcmludGxuKCk7Ci0KLQkJCXRoaXMucHJpbnRTZXR0ZXIocHJvcGVydHlOYW1lLCB0eXBlRGVjbGFyYXRpb24sIHZpc2liaWxpdHkpOwotCQkJdGhpcy5wcmludGxuKCk7Ci0JCQl0aGlzLnByaW50bG4oKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBwcmludEdldHRlcihTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgdHlwZURlY2xhcmF0aW9uLCBTdHJpbmcgdmlzaWJpbGl0eSkgewotCQkJdGhpcy5wcmludFZpc2liaWxpdHkodmlzaWJpbGl0eSk7Ci0JCQl0aGlzLnByaW50VHlwZURlY2xhcmF0aW9uKHR5cGVEZWNsYXJhdGlvbik7Ci0JCQl0aGlzLnByaW50KCcgJyk7Ci0JCQl0aGlzLnByaW50KHR5cGVEZWNsYXJhdGlvbi5lcXVhbHMoImJvb2xlYW4iKSA/ICJpcyIgOiAiZ2V0Iik7Ci0JCQl0aGlzLnByaW50KFN0cmluZ1Rvb2xzLmNhcGl0YWxpemUocHJvcGVydHlOYW1lKSk7Ci0JCQl0aGlzLnByaW50KCIoKSB7Iik7Ci0JCQl0aGlzLnByaW50bG4oKTsKLQotCQkJdGhpcy5pbmRlbnQoKTsKLQkJCQl0aGlzLnByaW50KCJyZXR1cm4gdGhpcy4iKTsKLQkJCQl0aGlzLnByaW50KHByb3BlcnR5TmFtZSk7Ci0JCQkJdGhpcy5wcmludCgnOycpOwotCQkJCXRoaXMucHJpbnRsbigpOwotCQkJdGhpcy51bmRlbnQoKTsKLQotCQkJdGhpcy5wcmludCgnfScpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHByaW50U2V0dGVyKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyB0eXBlRGVjbGFyYXRpb24sIFN0cmluZyB2aXNpYmlsaXR5KSB7Ci0JCQl0aGlzLnByaW50VmlzaWJpbGl0eSh2aXNpYmlsaXR5KTsKLQkJCXRoaXMucHJpbnQoInZvaWQgc2V0Iik7Ci0JCQl0aGlzLnByaW50KFN0cmluZ1Rvb2xzLmNhcGl0YWxpemUocHJvcGVydHlOYW1lKSk7Ci0JCQl0aGlzLnByaW50KCcoJyk7Ci0JCQl0aGlzLnByaW50VHlwZURlY2xhcmF0aW9uKHR5cGVEZWNsYXJhdGlvbik7Ci0JCQl0aGlzLnByaW50KCcgJyk7Ci0JCQl0aGlzLnByaW50KHByb3BlcnR5TmFtZSk7Ci0JCQl0aGlzLnByaW50KCIpIHsiKTsKLQkJCXRoaXMucHJpbnRsbigpOwotCi0JCQl0aGlzLmluZGVudCgpOwotCQkJCXRoaXMucHJpbnQoInRoaXMuIik7Ci0JCQkJdGhpcy5wcmludChwcm9wZXJ0eU5hbWUpOwotCQkJCXRoaXMucHJpbnQoIiA9ICIpOwotCQkJCXRoaXMucHJpbnQocHJvcGVydHlOYW1lKTsKLQkJCQl0aGlzLnByaW50KCc7Jyk7Ci0JCQkJdGhpcy5wcmludGxuKCk7Ci0JCQl0aGlzLnVuZGVudCgpOwotCi0JCQl0aGlzLnByaW50KCd9Jyk7Ci0JCX0KLQotCQl2b2lkIHByaW50Q29sbGVjdGlvbkdldHRlckFuZFNldHRlcihTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgY29sbGVjdGlvblR5cGVEZWNsYXJhdGlvbiwgU3RyaW5nIGVsZW1lbnRUeXBlRGVjbGFyYXRpb24sIFN0cmluZyB2aXNpYmlsaXR5KSB7Ci0JCQl0aGlzLnByaW50Q29sbGVjdGlvbkdldHRlcihwcm9wZXJ0eU5hbWUsIGNvbGxlY3Rpb25UeXBlRGVjbGFyYXRpb24sIGVsZW1lbnRUeXBlRGVjbGFyYXRpb24sIHZpc2liaWxpdHkpOwotCQkJdGhpcy5wcmludGxuKCk7Ci0JCQl0aGlzLnByaW50bG4oKTsKLQotCQkJdGhpcy5wcmludENvbGxlY3Rpb25TZXR0ZXIocHJvcGVydHlOYW1lLCBjb2xsZWN0aW9uVHlwZURlY2xhcmF0aW9uLCBlbGVtZW50VHlwZURlY2xhcmF0aW9uLCB2aXNpYmlsaXR5KTsKLQkJCXRoaXMucHJpbnRsbigpOwotCQkJdGhpcy5wcmludGxuKCk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgcHJpbnRDb2xsZWN0aW9uR2V0dGVyKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBjb2xsZWN0aW9uVHlwZURlY2xhcmF0aW9uLCBTdHJpbmcgZWxlbWVudFR5cGVEZWNsYXJhdGlvbiwgU3RyaW5nIHZpc2liaWxpdHkpIHsKLQkJCXRoaXMucHJpbnRWaXNpYmlsaXR5KHZpc2liaWxpdHkpOwotCQkJdGhpcy5wcmludFR5cGVEZWNsYXJhdGlvbihjb2xsZWN0aW9uVHlwZURlY2xhcmF0aW9uKTsKLQkJCXRoaXMucHJpbnQoJzwnKTsKLQkJCXRoaXMucHJpbnRUeXBlRGVjbGFyYXRpb24oZWxlbWVudFR5cGVEZWNsYXJhdGlvbik7Ci0JCQl0aGlzLnByaW50KCI+IGdldCIpOwotCQkJdGhpcy5wcmludChTdHJpbmdUb29scy5jYXBpdGFsaXplKHByb3BlcnR5TmFtZSkpOwotCQkJdGhpcy5wcmludCgiKCkgeyIpOwotCQkJdGhpcy5wcmludGxuKCk7Ci0KLQkJCXRoaXMuaW5kZW50KCk7Ci0JCQkJdGhpcy5wcmludCgicmV0dXJuIHRoaXMuIik7Ci0JCQkJdGhpcy5wcmludChwcm9wZXJ0eU5hbWUpOwotCQkJCXRoaXMucHJpbnQoJzsnKTsKLQkJCQl0aGlzLnByaW50bG4oKTsKLQkJCXRoaXMudW5kZW50KCk7Ci0KLQkJCXRoaXMucHJpbnQoJ30nKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBwcmludENvbGxlY3Rpb25TZXR0ZXIoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIGNvbGxlY3Rpb25UeXBlRGVjbGFyYXRpb24sIFN0cmluZyBlbGVtZW50VHlwZURlY2xhcmF0aW9uLCBTdHJpbmcgdmlzaWJpbGl0eSkgewotCQkJdGhpcy5wcmludFZpc2liaWxpdHkodmlzaWJpbGl0eSk7Ci0JCQl0aGlzLnByaW50KCJ2b2lkIHNldCIpOwotCQkJdGhpcy5wcmludChTdHJpbmdUb29scy5jYXBpdGFsaXplKHByb3BlcnR5TmFtZSkpOwotCQkJdGhpcy5wcmludCgnKCcpOwotCQkJdGhpcy5wcmludFR5cGVEZWNsYXJhdGlvbihjb2xsZWN0aW9uVHlwZURlY2xhcmF0aW9uKTsKLQkJCXRoaXMucHJpbnQoJzwnKTsKLQkJCXRoaXMucHJpbnRUeXBlRGVjbGFyYXRpb24oZWxlbWVudFR5cGVEZWNsYXJhdGlvbik7Ci0JCQl0aGlzLnByaW50KCc+Jyk7Ci0JCQl0aGlzLnByaW50KCcgJyk7Ci0JCQl0aGlzLnByaW50KHByb3BlcnR5TmFtZSk7Ci0JCQl0aGlzLnByaW50KCIpIHsiKTsKLQkJCXRoaXMucHJpbnRsbigpOwotCi0JCQl0aGlzLmluZGVudCgpOwotCQkJCXRoaXMucHJpbnQoInRoaXMuIik7Ci0JCQkJdGhpcy5wcmludChwcm9wZXJ0eU5hbWUpOwotCQkJCXRoaXMucHJpbnQoIiA9ICIpOwotCQkJCXRoaXMucHJpbnQocHJvcGVydHlOYW1lKTsKLQkJCQl0aGlzLnByaW50KCc7Jyk7Ci0JCQkJdGhpcy5wcmludGxuKCk7Ci0JCQl0aGlzLnVuZGVudCgpOwotCi0JCQl0aGlzLnByaW50KCd9Jyk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIHNvdXJjZSgpIHsKLQkJCXJldHVybiB0aGlzLm91dC50b1N0cmluZygpOwotCQl9Ci0KLQkJcHVibGljIGludCBsZW5ndGgoKSB7Ci0JCQlyZXR1cm4gKChTdHJpbmdXcml0ZXIpIHRoaXMub3V0KS5nZXRCdWZmZXIoKS5sZW5ndGgoKTsKLQkJfQotCi0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbmZpZyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIENvbmZpZyB7Ci0JCXByaXZhdGUgYm9vbGVhbiBjb252ZXJ0VG9DYW1lbENhc2UgPSB0cnVlOwotCQlwcml2YXRlIGJvb2xlYW4gcHJvcGVydHlBY2Nlc3NUeXBlID0gZmFsc2U7ICAvLyBhcyBvcHBvc2VkIHRvICJmaWVsZCIKLQkJcHJpdmF0ZSBTdHJpbmcgY29sbGVjdGlvblR5cGVOYW1lID0gU2V0LmNsYXNzLmdldE5hbWUoKTsKLQkJcHJpdmF0ZSBpbnQgZmllbGRWaXNpYmlsaXR5ID0gTW9kaWZpZXIuUFJJVkFURTsKLQkJcHJpdmF0ZSBpbnQgbWV0aG9kVmlzaWJpbGl0eSA9IE1vZGlmaWVyLlBVQkxJQzsKLQkJcHJpdmF0ZSBib29sZWFuIGdlbmVyYXRlR2V0dGVyc0FuZFNldHRlcnMgPSB0cnVlOwotCQlwcml2YXRlIGJvb2xlYW4gZ2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IgPSB0cnVlOwotCQlwcml2YXRlIGJvb2xlYW4gc2VyaWFsaXphYmxlID0gdHJ1ZTsKLQkJcHJpdmF0ZSBib29sZWFuIGdlbmVyYXRlU2VyaWFsVmVyc2lvblVJRCA9IHRydWU7Ci0JCXByaXZhdGUgYm9vbGVhbiBnZW5lcmF0ZUVtYmVkZGVkSWRGb3JDb21wb3VuZFBLID0gdHJ1ZTsgIC8vIGFzIG9wcG9zZWQgdG8gSWRDbGFzcwotCQlwcml2YXRlIE1hcDxUYWJsZSwgU3RyaW5nPiBvdmVycmlkZUVudGl0eU5hbWVzID0gbmV3IEhhc2hNYXA8VGFibGUsIFN0cmluZz4oKTsKLQotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUklWQVRFID0gMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFDS0FHRSA9IDE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1RFQ1RFRCA9IDI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBVQkxJQyA9IDM7Ci0KLQotCQlwdWJsaWMgYm9vbGVhbiBjb252ZXJ0VG9DYW1lbENhc2UoKSB7Ci0JCQlyZXR1cm4gdGhpcy5jb252ZXJ0VG9DYW1lbENhc2U7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0Q29udmVydFRvQ2FtZWxDYXNlKGJvb2xlYW4gY29udmVydFRvQ2FtZWxDYXNlKSB7Ci0JCQl0aGlzLmNvbnZlcnRUb0NhbWVsQ2FzZSA9IGNvbnZlcnRUb0NhbWVsQ2FzZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHByb3BlcnR5QWNjZXNzVHlwZSgpIHsKLQkJCXJldHVybiB0aGlzLnByb3BlcnR5QWNjZXNzVHlwZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eUFjY2Vzc1R5cGUoYm9vbGVhbiBwcm9wZXJ0eUFjY2Vzc1R5cGUpIHsKLQkJCXRoaXMucHJvcGVydHlBY2Nlc3NUeXBlID0gcHJvcGVydHlBY2Nlc3NUeXBlOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gZmllbGRBY2Nlc3NUeXBlKCkgewotCQkJcmV0dXJuICEgdGhpcy5wcm9wZXJ0eUFjY2Vzc1R5cGU7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0RmllbGRBY2Nlc3NUeXBlKGJvb2xlYW4gZmllbGRBY2Nlc3NUeXBlKSB7Ci0JCQl0aGlzLnByb3BlcnR5QWNjZXNzVHlwZSA9ICEgZmllbGRBY2Nlc3NUeXBlOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRDb2xsZWN0aW9uVHlwZU5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5jb2xsZWN0aW9uVHlwZU5hbWU7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0Q29sbGVjdGlvblR5cGVOYW1lKFN0cmluZyBjb2xsZWN0aW9uVHlwZU5hbWUpIHsKLQkJCXRoaXMuY29sbGVjdGlvblR5cGVOYW1lID0gY29sbGVjdGlvblR5cGVOYW1lOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRGaWVsZFZpc2liaWxpdHkoKSB7Ci0JCQlyZXR1cm4gdGhpcy5maWVsZFZpc2liaWxpdHk7Ci0JCX0KLQkJLyoqIGVudGl0eSBmaWVsZHMgY2Fubm90IGJlICdwdWJsaWMnICovCi0JCXB1YmxpYyB2b2lkIHNldEZpZWxkVmlzaWJpbGl0eShpbnQgZmllbGRWaXNpYmlsaXR5KSB7Ci0JCQlzd2l0Y2ggKGZpZWxkVmlzaWJpbGl0eSkgewotCQkJCWNhc2UgUFJJVkFURToKLQkJCQljYXNlIFBBQ0tBR0U6Ci0JCQkJY2FzZSBQUk9URUNURUQ6Ci0JCQkJCXRoaXMuZmllbGRWaXNpYmlsaXR5ID0gZmllbGRWaXNpYmlsaXR5OwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIGZpZWxkIHZpc2liaWxpdHk6ICIgKyBmaWVsZFZpc2liaWxpdHkpOwotCQkJfQotCQl9Ci0JCVN0cmluZyBmaWVsZFZpc2liaWxpdHkoKSB7Ci0JCQlzd2l0Y2ggKHRoaXMuZmllbGRWaXNpYmlsaXR5KSB7Ci0JCQkJY2FzZSBQUklWQVRFOgotCQkJCQlyZXR1cm4gInByaXZhdGUiOwotCQkJCWNhc2UgUEFDS0FHRToKLQkJCQkJcmV0dXJuICIiOwotCQkJCWNhc2UgUFJPVEVDVEVEOgotCQkJCQlyZXR1cm4gInByb3RlY3RlZCI7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiaW52YWxpZCBmaWVsZCB2aXNpYmlsaXR5OiAiICsgdGhpcy5maWVsZFZpc2liaWxpdHkpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIGludCBnZXRNZXRob2RWaXNpYmlsaXR5KCkgewotCQkJcmV0dXJuIHRoaXMubWV0aG9kVmlzaWJpbGl0eTsKLQkJfQotCQkvKiogZW50aXR5IHByb3BlcnRpZXMgbXVzdCBiZSAncHVibGljJyBvciAncHJvdGVjdGVkJyAqLwotCQlwdWJsaWMgdm9pZCBzZXRNZXRob2RWaXNpYmlsaXR5KGludCBtZXRob2RWaXNpYmlsaXR5KSB7Ci0JCQlzd2l0Y2ggKG1ldGhvZFZpc2liaWxpdHkpIHsKLQkJCQljYXNlIFBST1RFQ1RFRDoKLQkJCQljYXNlIFBVQkxJQzoKLQkJCQkJdGhpcy5tZXRob2RWaXNpYmlsaXR5ID0gbWV0aG9kVmlzaWJpbGl0eTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBtZXRob2QgdmlzaWJpbGl0eTogIiArIG1ldGhvZFZpc2liaWxpdHkpOwotCQkJfQotCQl9Ci0JCVN0cmluZyBtZXRob2RWaXNpYmlsaXR5KCkgewotCQkJc3dpdGNoICh0aGlzLm1ldGhvZFZpc2liaWxpdHkpIHsKLQkJCQljYXNlIFBST1RFQ1RFRDoKLQkJCQkJcmV0dXJuICJwcm90ZWN0ZWQiOwotCQkJCWNhc2UgUFVCTElDOgotCQkJCQlyZXR1cm4gInB1YmxpYyI7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiaW52YWxpZCBtZXRob2QgdmlzaWJpbGl0eTogIiArIHRoaXMubWV0aG9kVmlzaWJpbGl0eSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBnZW5lcmF0ZUdldHRlcnNBbmRTZXR0ZXJzKCkgewotCQkJcmV0dXJuIHRoaXMuZ2VuZXJhdGVHZXR0ZXJzQW5kU2V0dGVyczsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZUdldHRlcnNBbmRTZXR0ZXJzKGJvb2xlYW4gZ2VuZXJhdGVHZXR0ZXJzQW5kU2V0dGVycykgewotCQkJdGhpcy5nZW5lcmF0ZUdldHRlcnNBbmRTZXR0ZXJzID0gZ2VuZXJhdGVHZXR0ZXJzQW5kU2V0dGVyczsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yKCkgewotCQkJcmV0dXJuIHRoaXMuZ2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3I7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0R2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IoYm9vbGVhbiBnZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvcikgewotCQkJdGhpcy5nZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciA9IGdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gc2VyaWFsaXphYmxlKCkgewotCQkJcmV0dXJuIHRoaXMuc2VyaWFsaXphYmxlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldFNlcmlhbGl6YWJsZShib29sZWFuIHNlcmlhbGl6YWJsZSkgewotCQkJdGhpcy5zZXJpYWxpemFibGUgPSBzZXJpYWxpemFibGU7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBnZW5lcmF0ZVNlcmlhbFZlcnNpb25VSUQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZW5lcmF0ZVNlcmlhbFZlcnNpb25VSUQ7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0R2VuZXJhdGVTZXJpYWxWZXJzaW9uVUlEKGJvb2xlYW4gZ2VuZXJhdGVTZXJpYWxWZXJzaW9uVUlEKSB7Ci0JCQl0aGlzLmdlbmVyYXRlU2VyaWFsVmVyc2lvblVJRCA9IGdlbmVyYXRlU2VyaWFsVmVyc2lvblVJRDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGdlbmVyYXRlRW1iZWRkZWRJZEZvckNvbXBvdW5kUEsoKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZW5lcmF0ZUVtYmVkZGVkSWRGb3JDb21wb3VuZFBLOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldEdlbmVyYXRlRW1iZWRkZWRJZEZvckNvbXBvdW5kUEsoYm9vbGVhbiBnZW5lcmF0ZUVtYmVkZGVkSWRGb3JDb21wb3VuZFBLKSB7Ci0JCQl0aGlzLmdlbmVyYXRlRW1iZWRkZWRJZEZvckNvbXBvdW5kUEsgPSBnZW5lcmF0ZUVtYmVkZGVkSWRGb3JDb21wb3VuZFBLOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gZ2VuZXJhdGVJZENsYXNzRm9yQ29tcG91bmRQSygpIHsKLQkJCXJldHVybiAhIHRoaXMuZ2VuZXJhdGVFbWJlZGRlZElkRm9yQ29tcG91bmRQSzsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZUlkQ2xhc3NGb3JDb21wb3VuZFBLKGJvb2xlYW4gZ2VuZXJhdGVJZENsYXNzRm9yQ29tcG91bmRQSykgewotCQkJdGhpcy5nZW5lcmF0ZUVtYmVkZGVkSWRGb3JDb21wb3VuZFBLID0gISBnZW5lcmF0ZUlkQ2xhc3NGb3JDb21wb3VuZFBLOwotCQl9Ci0KLQkJLyoqCi0JCSAqIGtleSA9IHRhYmxlCi0JCSAqIHZhbHVlID0gdXNlci1zdXBwbGllZCBvdmVycmlkZSBlbnRpdHkgbmFtZQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRPdmVycmlkZUVudGl0eU5hbWUoVGFibGUgdGFibGUpIHsKLQkJCXJldHVybiB0aGlzLm92ZXJyaWRlRW50aXR5TmFtZXMuZ2V0KHRhYmxlKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRPdmVycmlkZUVudGl0eU5hbWUoVGFibGUgdGFibGUsIFN0cmluZyBvdmVycmlkZUVudGl0eU5hbWUpIHsKLQkJCXRoaXMub3ZlcnJpZGVFbnRpdHlOYW1lcy5wdXQodGFibGUsIG92ZXJyaWRlRW50aXR5TmFtZSk7Ci0JCX0KLQkJcHVibGljIHZvaWQgY2xlYXJPdmVycmlkZUVudGl0eU5hbWVzKCkgewotCQkJdGhpcy5vdmVycmlkZUVudGl0eU5hbWVzLmNsZWFyKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0T3ZlcnJpZGVFbnRpdHlOYW1lcyhNYXA8VGFibGUsIFN0cmluZz4gb3ZlcnJpZGVFbnRpdHlOYW1lcykgewotCQkJdGhpcy5jbGVhck92ZXJyaWRlRW50aXR5TmFtZXMoKTsKLQkJCWZvciAoTWFwLkVudHJ5PFRhYmxlLCBTdHJpbmc+IGVudHJ5IDogb3ZlcnJpZGVFbnRpdHlOYW1lcy5lbnRyeVNldCgpKSB7Ci0JCQkJdGhpcy5zZXRPdmVycmlkZUVudGl0eU5hbWUoZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCkpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29uZmlnICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIE92ZXJ3cml0ZUNvbmZpcm1lciB7Ci0JCS8qKgotCQkgKiBSZXR1cm4gd2hldGhlciB0aGUgZW50aXR5IGdlbmVyYXRvciBzaG91bGQgb3ZlcndyaXRlIHRoZSBzcGVjaWZpZWQKLQkJICogZmlsZS4KLQkJICovCi0JCWJvb2xlYW4gb3ZlcndyaXRlKFN0cmluZyBjbGFzc05hbWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC9HZW5TY29wZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC9HZW5TY29wZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTlkYjdmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvR2VuU2NvcGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5GaWx0ZXJpbmdJdGVyYXRvcjsKLQotY2xhc3MgR2VuU2NvcGUgewotCXByaXZhdGUgZmluYWwgTWFwPFRhYmxlLCBHZW5UYWJsZT4gZ2VuVGFibGVzID0gbmV3IEhhc2hNYXA8VGFibGUsIEdlblRhYmxlPigpOwotCi0JcHJpdmF0ZSBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcjsKLQkKLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdGlvbi9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlHZW5TY29wZShDb2xsZWN0aW9uPFRhYmxlPiB0YWJsZXMsIEVudGl0eUdlbmVyYXRvci5Db25maWcgZW50aXR5Q29uZmlnLCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgewotCQlzdXBlcigpOwotCQl0aGlzLmluaXRpYWxpemUodGFibGVzLCBlbnRpdHlDb25maWcsIHByb2dyZXNzTW9uaXRvcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrQ2FuY2VsZWQoKSB7Ci0JCWlmICh0aGlzLnByb2dyZXNzTW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQl9CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoQ29sbGVjdGlvbjxUYWJsZT4gdGFibGVzLCBFbnRpdHlHZW5lcmF0b3IuQ29uZmlnIGVudGl0eUNvbmZpZywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXRoaXMucHJvZ3Jlc3NNb25pdG9yID0gbW9uaXRvcjsKLQkJdGhpcy5idWlsZEdlblRhYmxlcyh0YWJsZXMsIGVudGl0eUNvbmZpZyk7Ci0JCWNoZWNrQ2FuY2VsZWQoKTsKLQkJdGhpcy5jb25maWd1cmVNYW55VG9NYW55UmVsYXRpb25zKCk7Ci0JCWNoZWNrQ2FuY2VsZWQoKTsKLQkJdGhpcy5jb25maWd1cmVNYW55VG9PbmVSZWxhdGlvbnMoKTsKLQkJY2hlY2tDYW5jZWxlZCgpOwotCQl0aGlzLmNvbmZpZ3VyZUZpZWxkTmFtZXMoKTsKLQkJY2hlY2tDYW5jZWxlZCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZEdlblRhYmxlcyhDb2xsZWN0aW9uPFRhYmxlPiB0YWJsZXMsIEVudGl0eUdlbmVyYXRvci5Db25maWcgZW50aXR5Q29uZmlnKSB7Ci0JCWludCBzaXplID0gdGFibGVzLnNpemUoKTsKLQkJLy8gcGFzcyBhcm91bmQgYSBncm93aW5nIGxpc3Qgb2YgdGhlIGVudGl0eSBuYW1lcyBzbyB3ZSBjYW4gYXZvaWQgZHVwbGljYXRlcwotCQlTZXQ8U3RyaW5nPiBlbnRpdHlOYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oc2l6ZSk7Ci0JCWZvciAoVGFibGUgdGFibGUgOiB0YWJsZXMpIHsKLQkJCXRoaXMuYnVpbGRHZW5UYWJsZSh0YWJsZSwgZW50aXR5Q29uZmlnLCBlbnRpdHlOYW1lcyk7Ci0JCQl0aGlzLnByb2dyZXNzTW9uaXRvci53b3JrZWQoNDAvc2l6ZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRHZW5UYWJsZShUYWJsZSB0YWJsZSwgRW50aXR5R2VuZXJhdG9yLkNvbmZpZyBlbnRpdHlDb25maWcsIENvbGxlY3Rpb248U3RyaW5nPiBlbnRpdHlOYW1lcykgewotCQl0aGlzLmdlblRhYmxlcy5wdXQodGFibGUsIG5ldyBHZW5UYWJsZSh0aGlzLCB0YWJsZSwgZW50aXR5Q29uZmlnLCBlbnRpdHlOYW1lcykpOwotCX0KLQotCS8qKgotCSAqIGZpbmQgYWxsIHRoZSAiam9pbiIgdGFibGVzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNvbmZpZ3VyZU1hbnlUb01hbnlSZWxhdGlvbnMoKSB7Ci0JCWludCB0YWJsZXNTaXplID0gQ29sbGVjdGlvblRvb2xzLnNpemUodGhpcy50YWJsZXMoKSk7Ci0KLQkJLy9maXJzdCB0aW1lIHRha2VzIHRoZSBsb25nZXN0LCBzaG91bGQgd2UgdGFrZSB0aGF0IGludG8gYWNjb3VudD8KLQkJZm9yIChJdGVyYXRvcjxHZW5UYWJsZT4gc3RyZWFtID0gdGhpcy50YWJsZXMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQljaGVja0NhbmNlbGVkKCk7Ci0JCQlzdHJlYW0ubmV4dCgpLmNvbmZpZ3VyZU1hbnlUb01hbnlSZWxhdGlvbnMoKTsKLQkJCXRoaXMucHJvZ3Jlc3NNb25pdG9yLndvcmtlZCg3MzAvdGFibGVzU2l6ZSk7Ci0JCX0KLQkJLy8gcmV2ZXJ0IGFueSAiam9pbiIgdGFibGUgdGhhdCBpcyByZWZlcmVuY2VkIGJ5IGFub3RoZXIgdGFibGUgYmFjayB0byBhbiAiZW50aXR5IiB0YWJsZQotCQlTZXQ8R2VuVGFibGU+IHJlZmVyZW5jZWRUYWJsZXMgPSB0aGlzLmJ1aWxkUmVmZXJlbmNlZFRhYmxlcygpOwotCQl0YWJsZXNTaXplID0gQ29sbGVjdGlvblRvb2xzLnNpemUodGhpcy5qb2luVGFibGVzKCkpOwotCQlmb3IgKEl0ZXJhdG9yPEdlblRhYmxlPiBzdHJlYW0gPSB0aGlzLmpvaW5UYWJsZXMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlHZW5UYWJsZSBqb2luR2VuVGFibGUgPSBzdHJlYW0ubmV4dCgpOwotCQkJaWYgKHJlZmVyZW5jZWRUYWJsZXMuY29udGFpbnMoam9pbkdlblRhYmxlKSkgewotCQkJCWpvaW5HZW5UYWJsZS5jbGVhckpvaW5UYWJsZVJlbGF0aW9uKCk7Ci0JCQl9Ci0JCQl0aGlzLnByb2dyZXNzTW9uaXRvci53b3JrZWQoNDAvdGFibGVzU2l6ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBmaW5kIGFsbCB0aGUgbWFueS10by1vbmUgYW5kIG9uZS10by1tYW55IHJlbGF0aW9ucwotCSAqLwotCXByaXZhdGUgdm9pZCBjb25maWd1cmVNYW55VG9PbmVSZWxhdGlvbnMoKSB7Ci0JCWludCB0YWJsZXNTaXplID0gQ29sbGVjdGlvblRvb2xzLnNpemUodGhpcy5lbnRpdHlUYWJsZXMoKSk7Ci0JCWZvciAoSXRlcmF0b3I8R2VuVGFibGU+IHN0cmVhbSA9IHRoaXMuZW50aXR5VGFibGVzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJc3RyZWFtLm5leHQoKS5jb25maWd1cmVNYW55VG9PbmVSZWxhdGlvbnMoKTsKLQkJCXRoaXMucHJvZ3Jlc3NNb25pdG9yLndvcmtlZCg1MC90YWJsZXNTaXplKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGRldGVybWluZSBhbGwgdGhlIEphdmEgZmllbGQgbmFtZXMgdXAtZnJvbnQgYmVjYXVzZSB3ZSB3aWxsCi0JICogbmVlZCB0aGVtIGZvciB0aGluZ3MgbGlrZSAnbWFwcGVkQnknIGFubm90YXRpb24gZWxlbWVudHMKLQkgKi8KLQlwcml2YXRlIHZvaWQgY29uZmlndXJlRmllbGROYW1lcygpIHsKLQkJaW50IHRhYmxlc1NpemUgPSBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0aGlzLmVudGl0eVRhYmxlcygpKTsKLQkJZm9yIChJdGVyYXRvcjxHZW5UYWJsZT4gc3RyZWFtID0gdGhpcy5lbnRpdHlUYWJsZXMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlzdHJlYW0ubmV4dCgpLmNvbmZpZ3VyZUZpZWxkTmFtZXMoKTsKLQkJCXRoaXMucHJvZ3Jlc3NNb25pdG9yLndvcmtlZCg1MC90YWJsZXNTaXplKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBwYWNrYWdlIEFQSSAqKioqKioqKioqCi0KLQkvKioKLQkgKiByZXR1cm4gb25seSB0aGUgZ2VuIHRhYmxlcyB0aGF0IGFyZSBzdWl0YWJsZSBmb3IgZ2VuZXJhdGluZwotCSAqIGVudGl0aWVzIChpLmUuIGV4Y2x1ZGUgdGhlICJqb2luIiB0YWJsZXMpCi0JICovCi0JSXRlcmF0b3I8R2VuVGFibGU+IGVudGl0eVRhYmxlcygpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxHZW5UYWJsZT4odGhpcy50YWJsZXMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG5leHQpIHsKLQkJCQlyZXR1cm4gISAoKEdlblRhYmxlKSBuZXh0KS5pc0pvaW5UYWJsZSgpOwotCQkJfQotCQl9OwotCX0KLQotCWludCBudW1FbnRpdHlUYWJsZXMoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuc2l6ZShlbnRpdHlUYWJsZXMoKSk7Ci0JfQotCQotCS8qKgotCSAqIHJldHVybiB0aGUgZ2VuIHRhYmxlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCB0YWJsZQotCSAqLwotCUdlblRhYmxlIGdlblRhYmxlKFRhYmxlIHRhYmxlKSB7Ci0JCXJldHVybiB0aGlzLmdlblRhYmxlcy5nZXQodGFibGUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBBUEkgKioqKioqKioqKgotCi0JcHJpdmF0ZSBJdGVyYXRvcjxHZW5UYWJsZT4gdGFibGVzKCkgewotCQlyZXR1cm4gdGhpcy5nZW5UYWJsZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm4gb25seSB0aGUgImpvaW4iIGdlbiB0YWJsZXMKLQkgKi8KLQlwcml2YXRlIEl0ZXJhdG9yPEdlblRhYmxlPiBqb2luVGFibGVzKCkgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPEdlblRhYmxlPih0aGlzLnRhYmxlcygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChPYmplY3QgbmV4dCkgewotCQkJCXJldHVybiAoKEdlblRhYmxlKSBuZXh0KS5pc0pvaW5UYWJsZSgpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIGJ1aWxkIGEgc2V0IG9mIHRoZSB0YWJsZXMgdGhhdCBhcmUgcmVmZXJlbmNlZCBieSBvdGhlciB0YWJsZXMKLQkgKiBpbiB0aGUgc2NvcGUKLQkgKi8KLQlwcml2YXRlIFNldDxHZW5UYWJsZT4gYnVpbGRSZWZlcmVuY2VkVGFibGVzKCkgewotCQlpbnQgc2l6ZSA9IENvbGxlY3Rpb25Ub29scy5zaXplKHRoaXMudGFibGVzKCkpOwotCQlTZXQ8R2VuVGFibGU+IHJlZmVyZW5jZWRUYWJsZXMgPSBuZXcgSGFzaFNldDxHZW5UYWJsZT4odGhpcy5nZW5UYWJsZXMuc2l6ZSgpKTsKLQkJZm9yIChJdGVyYXRvcjxHZW5UYWJsZT4gc3RyZWFtID0gdGhpcy50YWJsZXMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlzdHJlYW0ubmV4dCgpLmFkZFJlZmVyZW5jZWRUYWJsZXNUbyhyZWZlcmVuY2VkVGFibGVzKTsKLQkJCXRoaXMucHJvZ3Jlc3NNb25pdG9yLndvcmtlZCgyMC9zaXplKTsKLQkJfQotCQlyZXR1cm4gcmVmZXJlbmNlZFRhYmxlczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvR2VuVGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvR2VuVGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE3ZmQzZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL0dlblRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLkZvcmVpZ25LZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5OYW1lVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkZpbHRlcmluZ0l0ZXJhdG9yOwotCi0vKioKLSAqIGFzc29jaWF0ZSBhIHRhYmxlIHdpdGggdGhlIHZhcmlvdXMgcmVsYXRpb25zIHRoYXQgd2lsbCBiZSB1c2VkIHdoZW4KLSAqIGdlbmVyYXRpbmcgdGhlIGVudGl0eQotICovCi1jbGFzcyBHZW5UYWJsZSB7Ci0JcHJpdmF0ZSBmaW5hbCBHZW5TY29wZSBzY29wZTsKLQlwcml2YXRlIGZpbmFsIFRhYmxlIHRhYmxlOwotCXByaXZhdGUgZmluYWwgRW50aXR5R2VuZXJhdG9yLkNvbmZpZyBlbnRpdHlDb25maWc7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZW50aXR5TmFtZTsKLQlwcml2YXRlIE1hbnlUb01hbnlSZWxhdGlvbiBqb2luVGFibGVSZWxhdGlvbjsKLQlwcml2YXRlIENvbGxlY3Rpb248TWFueVRvTWFueVJlbGF0aW9uPiBvd25lZE1hbnlUb01hbnlSZWxhdGlvbnMgPSBuZXcgQXJyYXlMaXN0PE1hbnlUb01hbnlSZWxhdGlvbj4oKTsKLQlwcml2YXRlIENvbGxlY3Rpb248TWFueVRvTWFueVJlbGF0aW9uPiBub25Pd25lZE1hbnlUb01hbnlSZWxhdGlvbnMgPSBuZXcgQXJyYXlMaXN0PE1hbnlUb01hbnlSZWxhdGlvbj4oKTsKLQlwcml2YXRlIENvbGxlY3Rpb248TWFueVRvT25lUmVsYXRpb24+IG1hbnlUb09uZVJlbGF0aW9ucyA9IG5ldyBBcnJheUxpc3Q8TWFueVRvT25lUmVsYXRpb24+KCk7Ci0JcHJpdmF0ZSBDb2xsZWN0aW9uPE9uZVRvTWFueVJlbGF0aW9uPiBvbmVUb01hbnlSZWxhdGlvbnMgPSBuZXcgQXJyYXlMaXN0PE9uZVRvTWFueVJlbGF0aW9uPigpOwotCXByaXZhdGUgU2V0PENvbHVtbj4gZm9yZWlnbktleUNvbHVtbnMgPSBuZXcgSGFzaFNldDxDb2x1bW4+KCk7Ci0KLQkvLyBrZXk9Y29sdW1uL3JlbGF0aW9uOyB2YWx1ZT1uYW1lCi0JcHJpdmF0ZSBmaW5hbCBNYXA8T2JqZWN0LCBTdHJpbmc+IGZpZWxkTmFtZXMgPSBuZXcgSGFzaE1hcDxPYmplY3QsIFN0cmluZz4oKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBFTUJFRERFRF9JRF9WSVJUVUFMX0NPTFVNTiA9IG5ldyBPYmplY3QoKTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rpb24vaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JR2VuVGFibGUoR2VuU2NvcGUgc2NvcGUsIFRhYmxlIHRhYmxlLCBFbnRpdHlHZW5lcmF0b3IuQ29uZmlnIGVudGl0eUNvbmZpZywgQ29sbGVjdGlvbjxTdHJpbmc+IGVudGl0eU5hbWVzKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuc2NvcGUgPSBzY29wZTsKLQkJdGhpcy50YWJsZSA9IHRhYmxlOwotCQl0aGlzLmVudGl0eUNvbmZpZyA9IGVudGl0eUNvbmZpZzsKLQkJdGhpcy5lbnRpdHlOYW1lID0gdGhpcy5idWlsZEVudGl0eU5hbWUoZW50aXR5TmFtZXMpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkRW50aXR5TmFtZShDb2xsZWN0aW9uPFN0cmluZz4gZW50aXR5TmFtZXMpIHsKLQkJU3RyaW5nIG5hbWUgPSB0aGlzLnRhYmxlLnNob3J0SmF2YUNsYXNzTmFtZSgpOwotCQlTdHJpbmcgb3ZlcnJpZGVFbnRpdHlOYW1lID0gdGhpcy5lbnRpdHlDb25maWcuZ2V0T3ZlcnJpZGVFbnRpdHlOYW1lKHRoaXMudGFibGUpOwotCQlpZiAob3ZlcnJpZGVFbnRpdHlOYW1lID09IG51bGwpIHsKLQkJCWlmICh0aGlzLmVudGl0eUNvbmZpZy5jb252ZXJ0VG9DYW1lbENhc2UoKSkgewotCQkJCW5hbWUgPSBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZShuYW1lKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCW5hbWUgPSBvdmVycmlkZUVudGl0eU5hbWU7Ci0JCX0KLQkJbmFtZSA9IE5hbWVUb29scy51bmlxdWVOYW1lRm9ySWdub3JlQ2FzZShuYW1lLCBlbnRpdHlOYW1lcyk7Ci0JCWVudGl0eU5hbWVzLmFkZChuYW1lKTsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHBhY2thZ2UgQVBJICoqKioqKioqKioKLQotCS8qKgotCSAqIGRldGVybWluZSB3aGV0aGVyIHRoZSB0YWJsZSBpcyBhICJqb2luIiB0YWJsZSB3aXRoaW4gdGhlIHRhYmxlJ3Mgc2NvcGUKLQkgKi8KLQl2b2lkIGNvbmZpZ3VyZU1hbnlUb01hbnlSZWxhdGlvbnMoKSB7Ci0JCWlmICh0aGlzLnRhYmxlLmZvcmVpZ25LZXlzU2l6ZSgpICE9IDIpIHsKLQkJCS8vIHRoZSB0YWJsZSBtdXN0IGhhdmUgZXhhY3RseSAyIGZvcmVpZ24ga2V5cwotCQkJcmV0dXJuOwotCQl9Ci0JCWZvciAoSXRlcmF0b3I8Q29sdW1uPiBzdHJlYW0gPSB0aGlzLnRhYmxlLmNvbHVtbnMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlpZiAoICEgdGhpcy50YWJsZS5mb3JlaWduS2V5Q29sdW1uc0NvbnRhaW5zKHN0cmVhbS5uZXh0KCkpKSB7Ci0JCQkJLy8gYWxsIHRoZSB0YWJsZSdzIGNvbHVtbnMgbXVzdCBiZWxvbmcgdG8gb25lIChvciBib3RoKSBvZiB0aGUgMiBmb3JlaWduIGtleXMKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJSXRlcmF0b3I8Rm9yZWlnbktleT4gZktleXMgPSB0aGlzLnRhYmxlLmZvcmVpZ25LZXlzKCk7Ci0JCUZvcmVpZ25LZXkgb3duaW5nRksgPSBmS2V5cy5uZXh0KCk7Ci0JCUZvcmVpZ25LZXkgbm9uT3duaW5nRksgPSBmS2V5cy5uZXh0KCk7Ci0JCUdlblRhYmxlIG93bmluZ1RhYmxlID0gdGhpcy5zY29wZS5nZW5UYWJsZShvd25pbmdGSy5nZXRSZWZlcmVuY2VkVGFibGUoKSk7Ci0JCUdlblRhYmxlIG5vbk93bmluZ1RhYmxlID0gdGhpcy5zY29wZS5nZW5UYWJsZShub25Pd25pbmdGSy5nZXRSZWZlcmVuY2VkVGFibGUoKSk7Ci0JCWlmICgob3duaW5nVGFibGUgPT0gbnVsbCkgfHwgKG5vbk93bmluZ1RhYmxlID09IG51bGwpKSB7Ci0JCQkvLyBib3RoIHRhYmxlcyBtdXN0IGJlIGluIHRoZSBzY29wZQotCQkJcmV0dXJuOwotCQl9Ci0JCXRoaXMuam9pblRhYmxlUmVsYXRpb24gPSBuZXcgTWFueVRvTWFueVJlbGF0aW9uKHRoaXMsIG93bmluZ0ZLLCBvd25pbmdUYWJsZSwgbm9uT3duaW5nRkssIG5vbk93bmluZ1RhYmxlKTsKLQl9Ci0KLQl2b2lkIGFkZFJlZmVyZW5jZWRUYWJsZXNUbyhTZXQ8R2VuVGFibGU+IHJlZmVyZW5jZWRUYWJsZXMpIHsKLQkJZm9yIChJdGVyYXRvcjxGb3JlaWduS2V5PiBzdHJlYW0gPSB0aGlzLnRhYmxlLmZvcmVpZ25LZXlzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJRm9yZWlnbktleSBmayA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlHZW5UYWJsZSBnZW5UYWJsZSA9IHRoaXMuc2NvcGUuZ2VuVGFibGUoZmsuZ2V0UmVmZXJlbmNlZFRhYmxlKCkpOwotCQkJaWYgKGdlblRhYmxlICE9IG51bGwpIHsKLQkJCQlyZWZlcmVuY2VkVGFibGVzLmFkZChnZW5UYWJsZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQl2b2lkIGNsZWFySm9pblRhYmxlUmVsYXRpb24oKSB7Ci0JCXRoaXMuam9pblRhYmxlUmVsYXRpb24uY2xlYXIoKTsKLQkJdGhpcy5qb2luVGFibGVSZWxhdGlvbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogZmluZCAiaW4tc2NvcGUiIGZvcmVpZ24ga2V5cwotCSAqLwotCXZvaWQgY29uZmlndXJlTWFueVRvT25lUmVsYXRpb25zKCkgewotCQlmb3IgKEl0ZXJhdG9yPEZvcmVpZ25LZXk+IHN0cmVhbSA9IHRoaXMudGFibGUuZm9yZWlnbktleXMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlGb3JlaWduS2V5IGZrID0gc3RyZWFtLm5leHQoKTsKLQkJCUdlblRhYmxlIHJlZmVyZW5jZWR0YWJsZSA9IHRoaXMuc2NvcGUuZ2VuVGFibGUoZmsuZ2V0UmVmZXJlbmNlZFRhYmxlKCkpOwotCQkJaWYgKHJlZmVyZW5jZWR0YWJsZSA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7ICAvLyBza2lwIHRvIG5leHQgRksKLQkJCX0KLQkJCXRoaXMubWFueVRvT25lUmVsYXRpb25zLmFkZChuZXcgTWFueVRvT25lUmVsYXRpb24odGhpcywgZmssIHJlZmVyZW5jZWR0YWJsZSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogbm93IHRoYXQgYWxsIHRoZSByZWxhdGlvbnMgYXJlIGluIHBsYWNlLCB3ZSBjYW4gY29uZmlndXJlIHRoZSBKYXZhCi0JICogZmllbGQgbmFtZXMKLQkgKi8KLQl2b2lkIGNvbmZpZ3VyZUZpZWxkTmFtZXMoKSB7Ci0JCVNldDxDb2x1bW4+IGNvbHVtbnMgPSBDb2xsZWN0aW9uVG9vbHMuc2V0KHRoaXMudGFibGUuY29sdW1ucygpKTsKLQkJaWYgKCh0aGlzLnRhYmxlLnByaW1hcnlLZXlDb2x1bW5zU2l6ZSgpID4gMSkgJiYgdGhpcy5lbnRpdHlDb25maWcuZ2VuZXJhdGVFbWJlZGRlZElkRm9yQ29tcG91bmRQSygpKSB7Ci0JCQkvLyBpZiB3ZSBhcmUgZ29pbmcgdG8gZ2VuZXJhdGUgYW4gRW1iZWRkZWRJZCBmaWVsZCwgYWRkIGl0IHRvCi0JCQkvLyAnZmllbGROYW1lcycgc28gd2UgZG9uJ3QgY29sbGlkZSB3aXRoIGl0IGxhdGVyLCB3aGVuIGdlbmVyYXRpbmcKLQkJCS8vIGZpZWxkIG5hbWVzIGZvciB0aGUgY29sdW1ucyBldGMuCi0JCQl0aGlzLmNvbmZpZ3VyZUZpZWxkTmFtZShFTUJFRERFRF9JRF9WSVJUVUFMX0NPTFVNTiwgInBrIik7Ci0JCX0KLQkJdGhpcy5jb25maWd1cmVNYW55VG9PbmVGaWVsZE5hbWVzKGNvbHVtbnMpOwotCQl0aGlzLmNvbmZpZ3VyZUJhc2ljRmllbGROYW1lcyhjb2x1bW5zKTsKLQkJdGhpcy5jb25maWd1cmVPbmVUb01hbnlGaWVsZE5hbWVzKCk7Ci0JCXRoaXMuY29uZmlndXJlT3duZWRNYW55VG9NYW55RmllbGROYW1lcygpOwotCQl0aGlzLmNvbmZpZ3VyZU5vbk93bmVkTWFueVRvTWFueUZpZWxkTmFtZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm4gdGhlIGNvbHVtbnMgdGhhdCBhcmUgcGFydCBvZiB0aGUgdGFibGUncyBwcmltYXJ5IGtleQotCSAqIGJ1dCBhcmUgYWxzbyBwYXJ0IG9mIGFuICJpbi1zY29wZSIgZm9yZWlnbiBrZXkKLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3I8Q29sdW1uPiByZWFkT25seVByaW1hcnlLZXlDb2x1bW5zKCkgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPENvbHVtbj4odGhpcy50YWJsZS5wcmltYXJ5S2V5Q29sdW1ucygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChPYmplY3QgY29sdW1uKSB7Ci0JCQkJcmV0dXJuIEdlblRhYmxlLnRoaXMuZm9yZWlnbktleUNvbHVtbnNDb250YWlucygoQ29sdW1uKSBjb2x1bW4pOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIHJldHVybiB0aGUgY29sdW1ucyB0aGF0IGFyZSBwYXJ0IG9mIHRoZSB0YWJsZSdzIHByaW1hcnkga2V5Ci0JICogYnV0IGFyZSBOT1QgcGFydCBvZiBhbnkgImluLXNjb3BlIiBmb3JlaWduIGtleQotCSAqLwotCUl0ZXJhdG9yPENvbHVtbj4gd3JpdGFibGVQcmltYXJ5S2V5Q29sdW1ucygpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxDb2x1bW4+KHRoaXMudGFibGUucHJpbWFyeUtleUNvbHVtbnMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IGNvbHVtbikgewotCQkJCXJldHVybiAhIEdlblRhYmxlLnRoaXMuZm9yZWlnbktleUNvbHVtbnNDb250YWlucygoQ29sdW1uKSBjb2x1bW4pOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIHJldHVybiB0aGUgY29sdW1ucyB0aGF0IE5FSVRIRVIgcGFydCBvZiB0aGUgdGFibGUncyBwcmltYXJ5IGtleQotCSAqIE5PUiBwYXJ0IG9mIGFueSBmb3JlaWduIGtleQotCSAqLwotCXB1YmxpYyBJdGVyYXRvcjxDb2x1bW4+IG5vblByaW1hcnlLZXlCYXNpY0NvbHVtbnMoKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8Q29sdW1uPih0aGlzLnRhYmxlLmNvbHVtbnMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IGNvbHVtbikgewotCQkJCXJldHVybiAhIChHZW5UYWJsZS50aGlzLnByaW1hcnlLZXlDb2x1bW5zQ29udGFpbnMoKENvbHVtbikgY29sdW1uKQotCQkJCQkJfHwgR2VuVGFibGUudGhpcy5mb3JlaWduS2V5Q29sdW1uc0NvbnRhaW5zKChDb2x1bW4pIGNvbHVtbikpOwotCQkJfQotCQl9OwotCX0KLQotCVRhYmxlIGdldFRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy50YWJsZTsKLQl9Ci0KLQlTdHJpbmcgZ2V0RW50aXR5TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZW50aXR5TmFtZTsKLQl9Ci0KLQlib29sZWFuIGlzSm9pblRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5qb2luVGFibGVSZWxhdGlvbiAhPSBudWxsOwotCX0KLQotCXZvaWQgYWRkT3duZWRNYW55VG9NYW55UmVsYXRpb24oTWFueVRvTWFueVJlbGF0aW9uIHJlbGF0aW9uKSB7Ci0JCXRoaXMub3duZWRNYW55VG9NYW55UmVsYXRpb25zLmFkZChyZWxhdGlvbik7Ci0JfQotCi0Jdm9pZCByZW1vdmVPd25lZE1hbnlUb01hbnlSZWxhdGlvbihNYW55VG9NYW55UmVsYXRpb24gcmVsYXRpb24pIHsKLQkJdGhpcy5vd25lZE1hbnlUb01hbnlSZWxhdGlvbnMucmVtb3ZlKHJlbGF0aW9uKTsKLQl9Ci0KLQl2b2lkIGFkZE5vbk93bmVkTWFueVRvTWFueVJlbGF0aW9uKE1hbnlUb01hbnlSZWxhdGlvbiByZWxhdGlvbikgewotCQl0aGlzLm5vbk93bmVkTWFueVRvTWFueVJlbGF0aW9ucy5hZGQocmVsYXRpb24pOwotCX0KLQotCXZvaWQgcmVtb3ZlTm9uT3duZWRNYW55VG9NYW55UmVsYXRpb24oTWFueVRvTWFueVJlbGF0aW9uIHJlbGF0aW9uKSB7Ci0JCXRoaXMubm9uT3duZWRNYW55VG9NYW55UmVsYXRpb25zLnJlbW92ZShyZWxhdGlvbik7Ci0JfQotCi0Jdm9pZCBhZGRPbmVUb01hbnlSZWxhdGlvbihPbmVUb01hbnlSZWxhdGlvbiByZWxhdGlvbikgewotCQl0aGlzLm9uZVRvTWFueVJlbGF0aW9ucy5hZGQocmVsYXRpb24pOwotCX0KLQotCVN0cmluZyBqYXZhRmllbGROYW1lKCkgewotCQlyZXR1cm4gdGhpcy50YWJsZS5qYXZhRmllbGROYW1lKCk7Ci0JfQotCi0JSXRlcmF0b3I8TWFueVRvT25lUmVsYXRpb24+IG1hbnlUb09uZVJlbGF0aW9ucygpIHsKLQkJcmV0dXJuIHRoaXMubWFueVRvT25lUmVsYXRpb25zLml0ZXJhdG9yKCk7Ci0JfQotCi0JSXRlcmF0b3I8T25lVG9NYW55UmVsYXRpb24+IG9uZVRvTWFueVJlbGF0aW9ucygpIHsKLQkJcmV0dXJuIHRoaXMub25lVG9NYW55UmVsYXRpb25zLml0ZXJhdG9yKCk7Ci0JfQotCi0JSXRlcmF0b3I8TWFueVRvTWFueVJlbGF0aW9uPiBvd25lZE1hbnlUb01hbnlSZWxhdGlvbnMoKSB7Ci0JCXJldHVybiB0aGlzLm93bmVkTWFueVRvTWFueVJlbGF0aW9ucy5pdGVyYXRvcigpOwotCX0KLQotCUl0ZXJhdG9yPE1hbnlUb01hbnlSZWxhdGlvbj4gbm9uT3duZWRNYW55VG9NYW55UmVsYXRpb25zKCkgewotCQlyZXR1cm4gdGhpcy5ub25Pd25lZE1hbnlUb01hbnlSZWxhdGlvbnMuaXRlcmF0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiB0aGUga2V5IGNhbiBiZSBhIGNvbHVtbiBvciByZWxhdGlvbgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGZpZWxkTmFtZUZvckludGVybmFsKE9iamVjdCBvKSB7Ci0JCXJldHVybiB0aGlzLmZpZWxkTmFtZXMuZ2V0KG8pOwotCX0KLQotCS8qKgotCSAqIHRoaXMgd2lsbCByZXR1cm4gbnVsbCBpZiB3ZSBkb24ndCB3YW50IGFuIGVtYmVkZGVkIGlkIGZpZWxkCi0JICovCi0JU3RyaW5nIGZpZWxkTmFtZUZvckVtYmVkZGVkSWQoKSB7Ci0JCXJldHVybiB0aGlzLmZpZWxkTmFtZUZvckludGVybmFsKEVNQkVEREVEX0lEX1ZJUlRVQUxfQ09MVU1OKTsKLQl9Ci0KLQlTdHJpbmcgZmllbGROYW1lRm9yKENvbHVtbiBjb2x1bW4pIHsKLQkJcmV0dXJuIHRoaXMuZmllbGROYW1lRm9ySW50ZXJuYWwoY29sdW1uKTsKLQl9Ci0KLQlTdHJpbmcgZmllbGROYW1lRm9yKE1hbnlUb09uZVJlbGF0aW9uIHJlbGF0aW9uKSB7Ci0JCXJldHVybiB0aGlzLmZpZWxkTmFtZUZvckludGVybmFsKHJlbGF0aW9uKTsKLQl9Ci0KLQlTdHJpbmcgZmllbGROYW1lRm9yKE9uZVRvTWFueVJlbGF0aW9uIHJlbGF0aW9uKSB7Ci0JCXJldHVybiB0aGlzLmZpZWxkTmFtZUZvckludGVybmFsKHJlbGF0aW9uKTsKLQl9Ci0KLQlTdHJpbmcgZmllbGROYW1lRm9yKE1hbnlUb01hbnlSZWxhdGlvbiByZWxhdGlvbikgewotCQlyZXR1cm4gdGhpcy5maWVsZE5hbWVGb3JJbnRlcm5hbChyZWxhdGlvbik7Ci0JfQotCi0JU3RyaW5nIG5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnRhYmxlLmdldE5hbWUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgQVBJICoqKioqKioqKioKLQotCS8qKgotCSAqIHdoaWxlIHdlIGFyZSBmaWd1cmluZyBvdXQgdGhlIG5hbWVzIGZvciB0aGUgbToxIGZpZWxkcywgcmVtb3ZlIGZyb20gdGhlCi0JICogc3BlY2lmaWVkIHNldCBvZiBjb2x1bW5zIHRoZSBjb2x1bW5zIHRoYXQgYXJlIG9ubHkgcGFydCBvZiB0aGUgZm9yZWlnbiBrZXlzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNvbmZpZ3VyZU1hbnlUb09uZUZpZWxkTmFtZXMoU2V0PENvbHVtbj4gY29sdW1ucykgewotCQlmb3IgKE1hbnlUb09uZVJlbGF0aW9uIHJlbGF0aW9uIDogdGhpcy5tYW55VG9PbmVSZWxhdGlvbnMpIHsKLQkJCUNvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGwoY29sdW1ucywgcmVsYXRpb24uZ2V0Rm9yZWlnbktleSgpLm5vblByaW1hcnlLZXlCYXNlQ29sdW1ucygpKTsKLQkJCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwodGhpcy5mb3JlaWduS2V5Q29sdW1ucywgcmVsYXRpb24uZ2V0Rm9yZWlnbktleSgpLmJhc2VDb2x1bW5zKCkpOwotCQkJcmVsYXRpb24uc2V0TWFwcGVkQnkodGhpcy5jb25maWd1cmVGaWVsZE5hbWUocmVsYXRpb24sIHJlbGF0aW9uLmphdmFGaWVsZE5hbWUoKSkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgY29uZmlndXJlRmllbGROYW1lKE9iamVjdCBvLCBTdHJpbmcgZmllbGROYW1lKSB7Ci0JCWZpZWxkTmFtZSA9IHRoaXMuY2FtZWxDYXNlKGZpZWxkTmFtZSk7Ci0JCWZpZWxkTmFtZSA9IE5hbWVUb29scy51bmlxdWVOYW1lRm9yKGZpZWxkTmFtZSwgdGhpcy5maWVsZE5hbWVzLnZhbHVlcygpKTsKLQkJdGhpcy5maWVsZE5hbWVzLnB1dChvLCBmaWVsZE5hbWUpOwotCQlyZXR1cm4gZmllbGROYW1lOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGNhbWVsQ2FzZShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gdGhpcy5lbnRpdHlDb25maWcuY29udmVydFRvQ2FtZWxDYXNlKCkgPwotCQkJU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UobmFtZSwgZmFsc2UpICAvLyBmYWxzZSA9IGRvbid0IGNhcGl0YWxpemUgZmlyc3QgbGV0dGVyCi0JCToKLQkJCW5hbWU7Ci0JfQotCi0JLyoqCi0JICogYnVpbGQgYSB1bmlxdWUgZmllbGQgbmFtZSBmb3IgdGhlIHNwZWNpZmllZCAiYmFzaWMiIGNvbHVtbnMsCi0JICogY2hlY2tpbmcgZm9yIG5hbWUgY29sbGlzaW9ucwotCSAqLwotCXByaXZhdGUgdm9pZCBjb25maWd1cmVCYXNpY0ZpZWxkTmFtZXMoU2V0PENvbHVtbj4gY29sdW1ucykgewotCQlmb3IgKENvbHVtbiBjb2x1bW4gOiBjb2x1bW5zKSB7Ci0JCQl0aGlzLmNvbmZpZ3VyZUZpZWxkTmFtZShjb2x1bW4sIGNvbHVtbi5qYXZhRmllbGROYW1lKCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvbmZpZ3VyZU9uZVRvTWFueUZpZWxkTmFtZXMoKSB7Ci0JCWZvciAoT25lVG9NYW55UmVsYXRpb24gcmVsYXRpb24gOiB0aGlzLm9uZVRvTWFueVJlbGF0aW9ucykgewotCQkJdGhpcy5jb25maWd1cmVGaWVsZE5hbWUocmVsYXRpb24sIHJlbGF0aW9uLmphdmFGaWVsZE5hbWUoKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY29uZmlndXJlT3duZWRNYW55VG9NYW55RmllbGROYW1lcygpIHsKLQkJZm9yIChNYW55VG9NYW55UmVsYXRpb24gcmVsYXRpb24gOiB0aGlzLm93bmVkTWFueVRvTWFueVJlbGF0aW9ucykgewotCQkJcmVsYXRpb24uc2V0TWFwcGVkQnkodGhpcy5jb25maWd1cmVGaWVsZE5hbWUocmVsYXRpb24sIHJlbGF0aW9uLmphdmFGaWVsZE5hbWVGb3IodGhpcykpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjb25maWd1cmVOb25Pd25lZE1hbnlUb01hbnlGaWVsZE5hbWVzKCkgewotCQlmb3IgKE1hbnlUb01hbnlSZWxhdGlvbiByZWxhdGlvbiA6IHRoaXMubm9uT3duZWRNYW55VG9NYW55UmVsYXRpb25zKSB7Ci0JCQl0aGlzLmNvbmZpZ3VyZUZpZWxkTmFtZShyZWxhdGlvbiwgcmVsYXRpb24uamF2YUZpZWxkTmFtZUZvcih0aGlzKSk7Ci0JCX0KLQl9Ci0KLQlib29sZWFuIGZvcmVpZ25LZXlDb2x1bW5zQ29udGFpbnMoQ29sdW1uIGNvbHVtbikgewotCQlyZXR1cm4gdGhpcy5mb3JlaWduS2V5Q29sdW1ucy5jb250YWlucyhjb2x1bW4pOwotCX0KLQotCWJvb2xlYW4gcHJpbWFyeUtleUNvbHVtbnNDb250YWlucyhDb2x1bW4gY29sdW1uKSB7Ci0JCXJldHVybiB0aGlzLnRhYmxlLnByaW1hcnlLZXlDb2x1bW5zQ29udGFpbnMoY29sdW1uKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvTWFueVRvTWFueVJlbGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL01hbnlUb01hbnlSZWxhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODc2MDg3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvTWFueVRvTWFueVJlbGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLkZvcmVpZ25LZXk7Ci0KLS8qKgotICogVGhpcyBvYmplY3QgaXMgc2hhcmVkIGJ5IHRoZSB0d28gZ2VuIHRhYmxlcyB0aGF0IG1ha2UgdXAgdGhlIHJlbGF0aW9uLgotICogVXBvbiBjb25zdHJ1Y3Rpb24sICdtYXBwZWRCeScgd2lsbCBiZSAnbnVsbCcuIFRoZSBmaXJzdCBnZW4gdGFibGUgdG8gYmUKLSAqIHVzZWQgdG8gZ2VuZXJhdGUgYW4gZW50aXR5IHdpbGwgZmlsbCBpbiAnbWFwcGVkQnknIHdpdGggdGhlIGFwcHJvcHJpYXRlCi0gKiBmaWVsZC9wcm9wZXJ0eSBuYW1lLgotICovCi1jbGFzcyBNYW55VG9NYW55UmVsYXRpb24gewotCXByaXZhdGUgZmluYWwgR2VuVGFibGUgam9pblRhYmxlOwotCXByaXZhdGUgZmluYWwgRm9yZWlnbktleSBvd25pbmdGb3JlaWduS2V5OwotCXByaXZhdGUgZmluYWwgR2VuVGFibGUgb3duaW5nVGFibGU7Ci0JcHJpdmF0ZSBmaW5hbCBGb3JlaWduS2V5IG5vbk93bmluZ0ZvcmVpZ25LZXk7Ci0JcHJpdmF0ZSBmaW5hbCBHZW5UYWJsZSBub25Pd25pbmdUYWJsZTsKLQlwcml2YXRlIFN0cmluZyBtYXBwZWRCeTsKLQotCi0JTWFueVRvTWFueVJlbGF0aW9uKEdlblRhYmxlIGpvaW5UYWJsZSwgRm9yZWlnbktleSBvd25pbmdGb3JlaWduS2V5LCBHZW5UYWJsZSBvd25pbmdUYWJsZSwgRm9yZWlnbktleSBub25Pd25pbmdGb3JlaWduS2V5LCBHZW5UYWJsZSBub25Pd25pbmdUYWJsZSkgewotCQlzdXBlcigpOwotCQl0aGlzLmpvaW5UYWJsZSA9IGpvaW5UYWJsZTsKLQotCQl0aGlzLm93bmluZ0ZvcmVpZ25LZXkgPSBvd25pbmdGb3JlaWduS2V5OwotCQl0aGlzLm93bmluZ1RhYmxlID0gb3duaW5nVGFibGU7Ci0JCW93bmluZ1RhYmxlLmFkZE93bmVkTWFueVRvTWFueVJlbGF0aW9uKHRoaXMpOwotCi0JCXRoaXMubm9uT3duaW5nRm9yZWlnbktleSA9IG5vbk93bmluZ0ZvcmVpZ25LZXk7Ci0JCXRoaXMubm9uT3duaW5nVGFibGUgPSBub25Pd25pbmdUYWJsZTsKLQkJbm9uT3duaW5nVGFibGUuYWRkTm9uT3duZWRNYW55VG9NYW55UmVsYXRpb24odGhpcyk7Ci0JfQotCi0JR2VuVGFibGUgZ2V0Sm9pblRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5qb2luVGFibGU7Ci0JfQotCi0JRm9yZWlnbktleSBnZXRPd25pbmdGb3JlaWduS2V5KCkgewotCQlyZXR1cm4gdGhpcy5vd25pbmdGb3JlaWduS2V5OwotCX0KLQotCUdlblRhYmxlIGdldE93bmluZ1RhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5vd25pbmdUYWJsZTsKLQl9Ci0KLQlGb3JlaWduS2V5IGdldE5vbk93bmluZ0ZvcmVpZ25LZXkoKSB7Ci0JCXJldHVybiB0aGlzLm5vbk93bmluZ0ZvcmVpZ25LZXk7Ci0JfQotCi0JR2VuVGFibGUgZ2V0Tm9uT3duaW5nVGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLm5vbk93bmluZ1RhYmxlOwotCX0KLQotCXByaXZhdGUgR2VuVGFibGUgb3RoZXJUYWJsZShHZW5UYWJsZSB0YWJsZSkgewotCQlyZXR1cm4gKHRhYmxlID09IHRoaXMub3duaW5nVGFibGUpID8gdGhpcy5ub25Pd25pbmdUYWJsZSA6IHRoaXMub3duaW5nVGFibGU7Ci0JfQotCi0JU3RyaW5nIGphdmFGaWVsZE5hbWVGb3IoR2VuVGFibGUgdGFibGUpIHsKLQkJLy8gVE9ETyBpMThuPwotCQlyZXR1cm4gdGhpcy5vdGhlclRhYmxlKHRhYmxlKS5qYXZhRmllbGROYW1lKCkgKyAiX2NvbGxlY3Rpb24iOwotCX0KLQotCXZvaWQgY2xlYXIoKSB7Ci0JCXRoaXMub3duaW5nVGFibGUucmVtb3ZlT3duZWRNYW55VG9NYW55UmVsYXRpb24odGhpcyk7Ci0JCXRoaXMubm9uT3duaW5nVGFibGUucmVtb3ZlTm9uT3duZWRNYW55VG9NYW55UmVsYXRpb24odGhpcyk7Ci0JfQotCi0JU3RyaW5nIGdldE1hcHBlZEJ5KCkgewotCQlyZXR1cm4gdGhpcy5tYXBwZWRCeTsKLQl9Ci0KLQl2b2lkIHNldE1hcHBlZEJ5KFN0cmluZyBtYXBwZWRCeSkgewotCQl0aGlzLm1hcHBlZEJ5ID0gbWFwcGVkQnk7Ci0JfQotCi0JU3RyaW5nIG93bmluZ0VudGl0eU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm93bmluZ1RhYmxlLmdldEVudGl0eU5hbWUoKTsKLQl9Ci0KLQlTdHJpbmcgbm9uT3duaW5nRW50aXR5TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubm9uT3duaW5nVGFibGUuZ2V0RW50aXR5TmFtZSgpOwotCX0KLQotCWJvb2xlYW4gam9pblRhYmxlTmFtZUlzRGVmYXVsdCgpIHsKLQkJcmV0dXJuIHRoaXMuam9pblRhYmxlLm5hbWUoKS5lcXVhbHModGhpcy5nZXRPd25pbmdUYWJsZSgpLm5hbWUoKSArICJfIiArIHRoaXMuZ2V0Tm9uT3duaW5nVGFibGUoKS5uYW1lKCkpOwotCX0KLQotCWJvb2xlYW4gam9pbkNvbHVtbnNJc0RlZmF1bHRGb3IoU3RyaW5nIGphdmFGaWVsZE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMub3duaW5nRm9yZWlnbktleS5pc0RlZmF1bHRGb3IoamF2YUZpZWxkTmFtZSk7Ci0JfQotCi0JYm9vbGVhbiBpbnZlcnNlSm9pbkNvbHVtbnNJc0RlZmF1bHRGb3IoU3RyaW5nIGphdmFGaWVsZE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMubm9uT3duaW5nRm9yZWlnbktleS5pc0RlZmF1bHRGb3IoamF2YUZpZWxkTmFtZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL01hbnlUb09uZVJlbGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL01hbnlUb09uZVJlbGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzMzAxOGQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2dlbi9pbnRlcm5hbC9NYW55VG9PbmVSZWxhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLkZvcmVpZ25LZXk7Ci0KLWNsYXNzIE1hbnlUb09uZVJlbGF0aW9uIHsKLQlwcml2YXRlIGZpbmFsIEdlblRhYmxlIGJhc2VUYWJsZTsgIC8vIHRoZSAibWFueSIgc2lkZQotCXByaXZhdGUgZmluYWwgRm9yZWlnbktleSBmb3JlaWduS2V5OwotCXByaXZhdGUgZmluYWwgR2VuVGFibGUgcmVmZXJlbmNlZFRhYmxlOyAgLy8gdGhlICJvbmUiIHNpZGUKLQlwcml2YXRlIFN0cmluZyBtYXBwZWRCeTsKLQotCi0JTWFueVRvT25lUmVsYXRpb24oR2VuVGFibGUgYmFzZVRhYmxlLCBGb3JlaWduS2V5IGZvcmVpZ25LZXksIEdlblRhYmxlIHJlZmVyZW5jZWRUYWJsZSkgewotCQlzdXBlcigpOwotCQl0aGlzLmJhc2VUYWJsZSA9IGJhc2VUYWJsZTsKLQkJdGhpcy5mb3JlaWduS2V5ID0gZm9yZWlnbktleTsKLQkJdGhpcy5yZWZlcmVuY2VkVGFibGUgPSByZWZlcmVuY2VkVGFibGU7Ci0JCXJlZmVyZW5jZWRUYWJsZS5hZGRPbmVUb01hbnlSZWxhdGlvbihuZXcgT25lVG9NYW55UmVsYXRpb24odGhpcykpOwotCX0KLQotCUdlblRhYmxlIGdldEJhc2VUYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuYmFzZVRhYmxlOwotCX0KLQotCUZvcmVpZ25LZXkgZ2V0Rm9yZWlnbktleSgpIHsKLQkJcmV0dXJuIHRoaXMuZm9yZWlnbktleTsKLQl9Ci0KLQlHZW5UYWJsZSBnZXRSZWZlcmVuY2VkVGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLnJlZmVyZW5jZWRUYWJsZTsKLQl9Ci0KLQlTdHJpbmcgamF2YUZpZWxkTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZm9yZWlnbktleS5qYXZhRmllbGROYW1lKCk7Ci0JfQotCi0JU3RyaW5nIGdldE1hcHBlZEJ5KCkgewotCQlyZXR1cm4gdGhpcy5tYXBwZWRCeTsKLQl9Ci0KLQl2b2lkIHNldE1hcHBlZEJ5KFN0cmluZyBtYXBwZWRCeSkgewotCQl0aGlzLm1hcHBlZEJ5ID0gbWFwcGVkQnk7Ci0JfQotCi0JU3RyaW5nIGJhc2VFbnRpdHlOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5iYXNlVGFibGUuZ2V0RW50aXR5TmFtZSgpOwotCX0KLQotCVN0cmluZyByZWZlcmVuY2VkRW50aXR5TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMucmVmZXJlbmNlZFRhYmxlLmdldEVudGl0eU5hbWUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvT25lVG9NYW55UmVsYXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvT25lVG9NYW55UmVsYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY1NmQwMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL09uZVRvTWFueVJlbGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWw7Ci0KLWNsYXNzIE9uZVRvTWFueVJlbGF0aW9uIHsKLQlwcml2YXRlIGZpbmFsIE1hbnlUb09uZVJlbGF0aW9uIG1hbnlUb09uZVJlbGF0aW9uOwotCi0JT25lVG9NYW55UmVsYXRpb24oTWFueVRvT25lUmVsYXRpb24gbWFueVRvT25lUmVsYXRpb24pIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5tYW55VG9PbmVSZWxhdGlvbiA9IG1hbnlUb09uZVJlbGF0aW9uOwotCX0KLQotCU1hbnlUb09uZVJlbGF0aW9uIGdldE1hbnlUb09uZVJlbGF0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5tYW55VG9PbmVSZWxhdGlvbjsKLQl9Ci0KLQlTdHJpbmcgamF2YUZpZWxkTmFtZSgpIHsKLQkJLy8gVE9ETyBpMThuPwotCQlyZXR1cm4gdGhpcy5tYW55VG9PbmVSZWxhdGlvbi5nZXRCYXNlVGFibGUoKS5qYXZhRmllbGROYW1lKCkgKyAiX2NvbGxlY3Rpb24iOwotCX0KLQotCVN0cmluZyBtYXBwZWRCeSgpIHsKLQkJcmV0dXJuIHRoaXMubWFueVRvT25lUmVsYXRpb24uZ2V0TWFwcGVkQnkoKTsKLQl9Ci0KLQlTdHJpbmcgcmVmZXJlbmNlZEVudGl0eU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm1hbnlUb09uZVJlbGF0aW9uLmJhc2VFbnRpdHlOYW1lKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZ2VuL2ludGVybmFsL1BhY2thZ2VHZW5lcmF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvUGFja2FnZUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2UwZGEzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9nZW4vaW50ZXJuYWwvUGFja2FnZUdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsLkVudGl0eUdlbmVyYXRvci5PdmVyd3JpdGVDb25maXJtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotCi0vKioKLSAqIFRoaXMgZ2VuZXJhdG9yIHdpbGwgZ2VuZXJhdGUgYSBwYWNrYWdlIG9mIGVudGl0aWVzIGZvciBhIHNldCBvZiB0YWJsZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBQYWNrYWdlR2VuZXJhdG9yIHsKLQlwcml2YXRlIGZpbmFsIENvbmZpZyBjb25maWc7Ci0JcHJpdmF0ZSBmaW5hbCBFbnRpdHlHZW5lcmF0b3IuQ29uZmlnIGVudGl0eUNvbmZpZzsKLQlwcml2YXRlIGZpbmFsIEdlblNjb3BlIHNjb3BlOwotCXByaXZhdGUgZmluYWwgT3ZlcndyaXRlQ29uZmlybWVyIG92ZXJ3cml0ZUNvbmZpcm1lcjsKLQlwcml2YXRlIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcjsKLQotCi0JLy8gKioqKioqKioqKiBwdWJsaWMgQVBJICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBnZW5lcmF0ZUVudGl0aWVzKENvbmZpZyBjb25maWcsIEVudGl0eUdlbmVyYXRvci5Db25maWcgZW50aXR5Q29uZmlnLCBDb2xsZWN0aW9uPFRhYmxlPiB0YWJsZXMsIE92ZXJ3cml0ZUNvbmZpcm1lciBvdmVyd3JpdGVDb25maXJtZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAoKGNvbmZpZyA9PSBudWxsKSB8fCAoZW50aXR5Q29uZmlnID09IG51bGwpIHx8ICh0YWJsZXMgPT0gbnVsbCkpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCW5ldyBQYWNrYWdlR2VuZXJhdG9yKGNvbmZpZywgZW50aXR5Q29uZmlnLCB0YWJsZXMsIG92ZXJ3cml0ZUNvbmZpcm1lciwgbW9uaXRvcikuZ2VuZXJhdGVFbnRpdGllcygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rpb24vaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJpdmF0ZSBQYWNrYWdlR2VuZXJhdG9yKENvbmZpZyBjb25maWcsIEVudGl0eUdlbmVyYXRvci5Db25maWcgZW50aXR5Q29uZmlnLCBDb2xsZWN0aW9uPFRhYmxlPiB0YWJsZXMsIE92ZXJ3cml0ZUNvbmZpcm1lciBvdmVyd3JpdGVDb25maXJtZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlzdXBlcigpOwotCQl0aGlzLmNvbmZpZyA9IGNvbmZpZzsKLQkJdGhpcy5lbnRpdHlDb25maWcgPSBlbnRpdHlDb25maWc7Ci0JCXRoaXMuc2NvcGUgPSBuZXcgR2VuU2NvcGUodGFibGVzLCBlbnRpdHlDb25maWcsIG1vbml0b3IpOwotCQl0aGlzLm92ZXJ3cml0ZUNvbmZpcm1lciA9IG92ZXJ3cml0ZUNvbmZpcm1lcjsKLQkJdGhpcy5tb25pdG9yID0gbW9uaXRvcjsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZ2VuZXJhdGlvbiAqKioqKioqKioqCi0KLQlwcml2YXRlIHZvaWQgZ2VuZXJhdGVFbnRpdGllcygpIHsKLQkJaW50IHNpemUgPSBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0aGlzLnNjb3BlLmVudGl0eVRhYmxlcygpKTsKLQkJZm9yIChJdGVyYXRvcjxHZW5UYWJsZT4gc3RyZWFtID0gdGhpcy5zY29wZS5lbnRpdHlUYWJsZXMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQljaGVja0NhbmNlbGVkKCk7Ci0JCQl0aGlzLmJ1aWxkRW50aXR5KHN0cmVhbS5uZXh0KCkpOwotCQkJdGhpcy5tb25pdG9yLndvcmtlZCg1MC9zaXplKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja0NhbmNlbGVkKCkgewotCQlpZiAodGhpcy5tb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCX0JCQotCX0KLQkKLQotCXByaXZhdGUgdm9pZCBidWlsZEVudGl0eShHZW5UYWJsZSBnZW5UYWJsZSkgewotCQlFbnRpdHlHZW5lcmF0b3IuZ2VuZXJhdGVFbnRpdHkodGhpcy5lbnRpdHlDb25maWcsIHRoaXMuY29uZmlnLmdldFBhY2thZ2VGcmFnbWVudCgpLCBnZW5UYWJsZSwgb3ZlcndyaXRlQ29uZmlybWVyLCB0aGlzLm1vbml0b3IpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25maWcgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBDb25maWcgewotCQlwcml2YXRlIElQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50OwotCi0JCXB1YmxpYyBJUGFja2FnZUZyYWdtZW50IGdldFBhY2thZ2VGcmFnbWVudCgpIHsKLQkJCXJldHVybiB0aGlzLnBhY2thZ2VGcmFnbWVudDsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRQYWNrYWdlRnJhZ21lbnQoSVBhY2thZ2VGcmFnbWVudCBwYWNrYWdlRnJhZ21lbnQpIHsKLQkJCXRoaXMucGFja2FnZUZyYWdtZW50ID0gcGFja2FnZUZyYWdtZW50OwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS8uY2xhc3NwYXRoIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlZTdjNzYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJwcm9wZXJ0eV9maWxlcyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pzdC8qKiIvPgotCQk8L2FjY2Vzc3J1bGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS8uY3ZzaWdub3JlIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS8ucHJvamVjdCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBlZjllMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmMzg5OWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1N1biBNYXkgMjcgMTU6MTE6MjUgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5MDljMTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI1N1biBNYXkgMjcgMTQ6NTU6MDEgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWQ1MzI5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qcHQudWk7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnB0VWlQbHVnaW4KLUJ1bmRsZS1DbGFzc1BhdGg6IC4KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5kcmF3MmQsCi0gb3JnLmVjbGlwc2UuZW1mLmVkaXQudWksCi0gb3JnLmVjbGlwc2UuamR0LmNvcmUsCi0gb3JnLmVjbGlwc2UuamR0LnVpLAotIG9yZy5lY2xpcHNlLmplbSwKLSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LAotIG9yZy5lY2xpcHNlLmpwdC5jb3JlLAotIG9yZy5lY2xpcHNlLmpwdC5kYiwKLSBvcmcuZWNsaXBzZS5qcHQuZGIudWksCi0gb3JnLmVjbGlwc2UuanB0LmdlbiwKLSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS51aSwKLSBvcmcuZWNsaXBzZS51aS5pZGUsCi0gb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQsCi0gb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWksCi0gb3JnLmVjbGlwc2Uud3N0LndlYi51aQotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWw7IHgtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmFjdGlvbnM7IHgtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7IHgtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRpYWxvZ3M7IHgtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmdlbmVyaWM7IHgtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEuZGV0YWlsczsgeC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamF2YS5tYXBwaW5ncy5wcm9wZXJ0aWVzOyB4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLnN0cnVjdHVyZTsgeC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamZhY2U7IHgtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzOyB4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOyB4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wZXJzcGVjdGl2ZTsgeC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucHJlZnM7IHgtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnByb3BlcnRpZXM7IHgtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnNlbGVjdGlvbjsgeC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3RydWN0dXJlOyB4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsOyB4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC52aWV3czsgeC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0czsgeC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkczsgeC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwueG1sOyB4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC54bWwuZGV0YWlsczsgeC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwueG1sLnN0cnVjdHVyZTsgeC1pbnRlcm5hbDo9dHJ1ZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvYWJvdXQuaHRtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTczYmRhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvYnVpbGQucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWExYzM3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1qYXZhY1NvdXJjZSA9IDEuNQotamF2YWNUYXJnZXQgPSAxLjUKLXNvdXJjZS4uID0gc3JjLyxcCi0gICAgICAgICAgICAgICBwcm9wZXJ0eV9maWxlcy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotamFycy5jb21waWxlLm9yZGVyID0gLgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2NvbXBvbmVudC54bWwgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY4MjdiNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvY29tcG9uZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PGNvbXBvbmVudCAgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIgbmFtZT0ib3JnLmVjbGlwc2UuanB0LnVpIj48ZGVzY3JpcHRpb24gdXJsPSIiPjwvZGVzY3JpcHRpb24+PGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSI+PC9jb21wb25lbnQtZGVwZW5kcz48cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQudWkiIGZyYWdtZW50PSJmYWxzZSIvPjwvY29tcG9uZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL2R0b29sMTYvbmV3X2pwYXByb2plY3Rfd2l6LmdpZiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL2R0b29sMTYvbmV3X2pwYXByb2plY3Rfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMzNzY4Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9kdG9vbDE2L25ld19qcGFwcm9qZWN0X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9ldG9vbDE2L2pwYV9mYWNldC5naWYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9ldG9vbDE2L2pwYV9mYWNldC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwYWI5MTcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9qcGFfZmFjZXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9uZXdfanBhcHJvamVjdF93aXouZ2lmIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9uZXdfanBhcHJvamVjdF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmRhODA3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL2V0b29sMTYvbmV3X2pwYXByb2plY3Rfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL2V2aWV3MTYvanBhX2RldGFpbHMuZ2lmIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvZXZpZXcxNi9qcGFfZGV0YWlscy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyODAxMzguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvZXZpZXcxNi9qcGFfZGV0YWlscy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9ldmlldzE2L2pwYV9wZXJzcGVjdGl2ZS5naWYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9ldmlldzE2L2pwYV9wZXJzcGVjdGl2ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwYWI5MTcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvZXZpZXcxNi9qcGFfcGVyc3BlY3RpdmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvZXZpZXcxNi9qcGFfc3RydWN0dXJlLmdpZiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL2V2aWV3MTYvanBhX3N0cnVjdHVyZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4MmM5MGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvZXZpZXcxNi9qcGFfc3RydWN0dXJlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L2Jhc2ljLmdpZiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L2Jhc2ljLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU0N2Q3NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9iYXNpYy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9lbWJlZGRhYmxlLmdpZiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L2VtYmVkZGFibGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODU2Zjc4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L2VtYmVkZGFibGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvZW1iZWRkZWQtaWQuZ2lmIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvZW1iZWRkZWQtaWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWM4ZTIxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L2VtYmVkZGVkLWlkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L2VtYmVkZGVkLmdpZiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L2VtYmVkZGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJhZTY2NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9lbWJlZGRlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9lbnRpdHktbWFwcGluZ3MuZ2lmIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvZW50aXR5LW1hcHBpbmdzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM0OWM5Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9lbnRpdHktbWFwcGluZ3MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvZW50aXR5LmdpZiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L2VudGl0eS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2MDZmNDguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvZW50aXR5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L2lkLmdpZiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L2lkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIwNWVjMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9pZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9tYW55LXRvLW1hbnkuZ2lmIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvbWFueS10by1tYW55LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg4ODViMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9tYW55LXRvLW1hbnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvbWFueS10by1vbmUuZ2lmIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvbWFueS10by1vbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTFlMmI5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L21hbnktdG8tb25lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L21hcHBlZC1zdXBlcmNsYXNzLmdpZiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L21hcHBlZC1zdXBlcmNsYXNzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNjMzc2NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9tYXBwZWQtc3VwZXJjbGFzcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9udWxsLWF0dHJpYnV0ZS1tYXBwaW5nLmdpZiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L251bGwtYXR0cmlidXRlLW1hcHBpbmcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGE5YzIzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L251bGwtYXR0cmlidXRlLW1hcHBpbmcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvbnVsbC10eXBlLW1hcHBpbmcuZ2lmIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvbnVsbC10eXBlLW1hcHBpbmcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Mjc5NDc4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L251bGwtdHlwZS1tYXBwaW5nLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L29uZS10by1tYW55LmdpZiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L29uZS10by1tYW55LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU5MDAyNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9vbmUtdG8tbWFueS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9vbmUtdG8tb25lLmdpZiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L29uZS10by1vbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzhlYzM2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L29uZS10by1vbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvcGVyc2lzdGVuY2UtdW5pdC5naWYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9wZXJzaXN0ZW5jZS11bml0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNjNDVmNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9wZXJzaXN0ZW5jZS11bml0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L3BlcnNpc3RlbmNlLmdpZiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL29iajE2L3BlcnNpc3RlbmNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFmNjE2ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi9wZXJzaXN0ZW5jZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi90cmFuc2llbnQuZ2lmIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvdHJhbnNpZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M1ZDgzZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi90cmFuc2llbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL2ljb25zL2Z1bGwvb2JqMTYvdmVyc2lvbi5naWYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi92ZXJzaW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAyYTgxMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC9vYmoxNi92ZXJzaW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL3dpemJhbi9qcGFfZmFjZXRfd2l6YmFuLmdpZiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9pY29ucy9mdWxsL3dpemJhbi9qcGFfZmFjZXRfd2l6YmFuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNlMTgxZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvaWNvbnMvZnVsbC93aXpiYW4vanBhX2ZhY2V0X3dpemJhbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNDdmNDAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRvIGNvZGUgZGV2ZWxvcGVyOgotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1wbHVnaW5OYW1lPSBKYXZhIFBlcnNpc3RlbmNlIEFQSSBUb29scyAtIFVJCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotSlBBX1BMQVRGT1JNPSJKUEEgUGxhdGZvcm0gVUkiCi0KLQotanBhV2l6YXJkQ2F0ZWdvcnlOYW1lID0gSlBBCi1uZXdKcGFQcm9qZWN0V2l6YXJkTmFtZSA9IEpQQSBQcm9qZWN0Ci1uZXdKcGFQcm9qZWN0V2l6YXJkRGVzYyA9IENyZWF0ZSBhIEpQQSBwcm9qZWN0Ci0KLWpwYU1lbnVOYW1lID0gSlBBIFRvb2xzCi1nZW5lcmF0ZUVudGl0aWVzID0gR2VuZXJhdGUgRW50aXRpZXMuLi4KLWdlbmVyYXRlRERMID0gR2VuZXJhdGUgRERMLi4uCi1zeW5jaHJvbml6ZUNsYXNzZXMgPSBTeW5jaHJvbml6ZSBDbGFzc2VzCi1hZGRQZXJzaXN0ZW50Q2xhc3MgPSBBZGQgcGVyc2lzdGVudCBjbGFzcyAuLi4KLXJlbW92ZVBlcnNpc3RlbnRDbGFzcyA9IFJlbW92ZSBwZXJzaXN0ZW50IGNsYXNzCi1hZGRQZXJzaXN0ZW50QXR0cmlidXRlVG9YbWwgPSBBZGQgcGVyc2lzdGVudCBhdHRyaWJ1dGUgdG8gWE1MCi1hZGRQZXJzaXN0ZW50QXR0cmlidXRlVG9YbWxBbmRNYXAgPSBBZGQgcGVyc2lzdGVudCBhdHRyaWJ1dGUgdG8gWE1MIC4uLgotcmVtb3ZlUGVyc2lzdGVudEF0dHJpYnV0ZUZyb21YbWwgPSBSZW1vdmUgcGVyc2lzdGVudCBhdHRyaWJ1dGUgZnJvbSBYTUwKLQotanBhUHJlZmVyZW5jZVBhZ2UgPSBKUEEKLQotanBhUHJvamVjdFByb3BlcnRpZXNQYWdlID0gSlBBCi0KLWpwYVBlcnNwZWN0aXZlID0gSlBBIERldmVsb3BtZW50Ci1qcGFEZXRhaWxzID0gSlBBIERldGFpbHMKLWpwYVN0cnVjdHVyZSA9IEpQQSBTdHJ1Y3R1cmUKLQotSnBhUHJvcG9zYWxDYXRlZ29yeSA9IEpQQSBQcm9wb3NhbHMKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9wbHVnaW4ueG1sIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNTYxZmYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvcHJvcGVydHlfZmlsZXMvanB0X3VpLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvcHJvcGVydHlfZmlsZXMvanB0X3VpLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmZjg4MGIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3Byb3BlcnR5X2ZpbGVzL2pwdF91aS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1BZGRQZXJzaXN0ZW50QXR0cmlidXRlRGlhbG9nX3RpdGxlPUFkZCBQZXJzaXN0ZW50IEF0dHJpYnV0ZQotQWRkUGVyc2lzdGVudEF0dHJpYnV0ZURpYWxvZ19hdHRyaWJ1dGVMYWJlbD1BdHRyaWJ1dGU6Ci1BZGRQZXJzaXN0ZW50QXR0cmlidXRlRGlhbG9nX21hcHBpbmdMYWJlbD1NYXAgYXM6Ci1BZGRQZXJzaXN0ZW50QXR0cmlidXRlRGlhbG9nX25vTWFwcGluZ0tleUVycm9yPVlvdSBtdXN0IHNwZWNpZnkgYSBtYXBwaW5nIHR5cGUKLQotQWRkUGVyc2lzdGVudENsYXNzRGlhbG9nX3RpdGxlPUFkZCBQZXJzaXN0ZW50IENsYXNzCi1BZGRQZXJzaXN0ZW50Q2xhc3NEaWFsb2dfY2xhc3NMYWJlbD1DbGFzczoKLUFkZFBlcnNpc3RlbnRDbGFzc0RpYWxvZ19jbGFzc0RpYWxvZ190aXRsZT1QZXJzaXN0ZW50IENsYXNzIFNlbGVjdGlvbgotQWRkUGVyc2lzdGVudENsYXNzRGlhbG9nX2NsYXNzRGlhbG9nX21lc3NhZ2U9Q2hvb3NlIGEgY2xhc3M6Ci1BZGRQZXJzaXN0ZW50Q2xhc3NEaWFsb2dfbWFwcGluZ0xhYmVsPU1hcCBhczoKLUFkZFBlcnNpc3RlbnRDbGFzc0RpYWxvZ19ub0NsYXNzRXJyb3I9WW91IG11c3Qgc3BlY2lmeSBhIGNsYXNzCi1BZGRQZXJzaXN0ZW50Q2xhc3NEaWFsb2dfZHVwbGljYXRlQ2xhc3NXYXJuaW5nPUZpbGUgYWxyZWFkeSBjb250YWlucyB0aGF0IHBlcnNpc3RlbnQgY2xhc3MKLUFkZFBlcnNpc3RlbnRDbGFzc0RpYWxvZ19jbGFzc05vdEZvdW5kV2FybmluZz1DYW5ub3QgcmVzb2x2ZSBjbGFzcwotQWRkUGVyc2lzdGVudENsYXNzRGlhbG9nX25vTWFwcGluZ0tleUVycm9yPVlvdSBtdXN0IHNwZWNpZnkgYSBtYXBwaW5nIHR5cGUKLQotRGF0YWJhc2VSZWNvbm5lY3RXaXphcmRQYWdlX2RhdGFiYXNlPURhdGFiYXNlIFNldHRpbmdzCi1EYXRhYmFzZVJlY29ubmVjdFdpemFyZFBhZ2VfZGF0YWJhc2VDb25uZWN0aW9uPURhdGFiYXNlIENvbm5lY3Rpb24KLURhdGFiYXNlUmVjb25uZWN0V2l6YXJkUGFnZV9yZWNvbm5lY3RUb0RhdGFiYXNlPVJlY29ubmVjdCB0byB0aGUgZGF0YWJhc2UuCi1EYXRhYmFzZVJlY29ubmVjdFdpemFyZFBhZ2VfY29ubmVjdGlvbj1Db25uZWN0aW9uOgotRGF0YWJhc2VSZWNvbm5lY3RXaXphcmRQYWdlX3NjaGVtYT1TY2hlbWE6Ci1EYXRhYmFzZVJlY29ubmVjdFdpemFyZFBhZ2Vfc2NoZW1hSW5mbz0oTm90ZTogIE11c3QgaGF2ZSBhY3RpdmUgY29ubmVjdGlvbiB0byBzZWxlY3Qgc2NoZW1hKQotRGF0YWJhc2VSZWNvbm5lY3RXaXphcmRQYWdlX2FkZENvbm5lY3Rpb25MaW5rPTxhPkFkZCBjb25uZWN0aW9ucy4uLjwvYT4KLURhdGFiYXNlUmVjb25uZWN0V2l6YXJkUGFnZV9yZWNvbm5lY3RMaW5rPTxhPlJlY29ubmVjdC4uLjwvYT4KLQotR2VuZXJhbF9icm93c2U9QnJvd3NlLi4uCi1HZW5lcmFsX2Rlc2VsZWN0QWxsPURlc2VsZWN0IEFsbAotR2VuZXJhbF9zZWxlY3RBbGw9U2VsZWN0IEFsbAotCi1HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2dlbmVyYXRlRW50aXRpZXM9R2VuZXJhdGUgRW50aXRpZXMKLUdlbmVyYXRlRW50aXRpZXNXaXphcmRQYWdlX2Nob29zZUVudGl0eVRhYmxlPUNob29zZSB0YWJsZXMgdG8gZ2VuZXJhdGUgZW50aXRpZXMgZnJvbS4KLUdlbmVyYXRlRW50aXRpZXNXaXphcmRQYWdlX2dlbmVyYXRlRW50aXRpZXM9R2VuZXJhdGUgRW50aXRpZXMgZnJvbSBUYWJsZXMKLUdlbmVyYXRlRW50aXRpZXNXaXphcmRQYWdlX3N5bmNocm9uaXplQ2xhc3Nlcz1TeW5jaHJvbml6ZSBDbGFzc2VzIGluIHBlcnNpc3RlbmNlLnhtbAotR2VuZXJhdGVFbnRpdGllc1dpemFyZFBhZ2VfdGFibGVzPVRhYmxlczoKLUdlbmVyYXRlRW50aXRpZXNXaXphcmRQYWdlX3RhYmxlQ29sdW1uPVRhYmxlCi1HZW5lcmF0ZUVudGl0aWVzV2l6YXJkUGFnZV9lbnRpdHlOYW1lQ29sdW1uPUVudGl0eSBOYW1lCi0KLUdlbmVyaWNQbGF0Zm9ybVVpRGlhbG9nX25vdFN1cHBvcnRlZE1lc3NhZ2VUaXRsZT1EREwgR2VuZXJhdGlvbgotR2VuZXJpY1BsYXRmb3JtVWlEaWFsb2dfbm90U3VwcG9ydGVkTWVzc2FnZVRleHQ9RERMIEdlbmVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgR2VuZXJpYyBQbGF0Zm9ybS4KLQotSnBhUHJlZmVyZW5jZVBhZ2VfZGVmYXVsdEpwYUxpYj1EZWZhdWx0IEpQQSBpbXBsZW1lbnRhdGlvbiBsaWJyYXJ5OgotSnBhUHJlZmVyZW5jZVBhZ2VfdXNlckxpYnNMaW5rPTxhPkNvbmZpZ3VyZSB1c2VyIGxpYnJhcmllcyAuLi48L2E+Ci1KcGFQcmVmZXJlbmNlUGFnZV9pbnZhbGlkSnBhTGliPUludmFsaWQgTGlicmFyeTogIE11c3QgY29udGFpbiBqYXZheC5wZXJzaXN0ZW5jZSBjbGFzc2VzLgotCi1KcGFTdHJ1Y3R1cmVWaWV3X3ZpZXdOb3RBdmFpbGFibGU9U3RydWN0dXJlIGlzIG5vdCBhdmFpbGFibGUgZm9yIHRoZSBjdXJyZW50IHNlbGVjdGlvbi4KLUpwYVN0cnVjdHVyZVZpZXdfbGlua1dpdGhFZGl0b3JUZXh0PUxpbmsgd2l0aCBFZGl0b3IKLUpwYVN0cnVjdHVyZVZpZXdfbGlua1dpdGhFZGl0b3JEZXNjPUxpbmsgd2l0aCBBY3RpdmUgRWRpdG9yCi1KcGFTdHJ1Y3R1cmVWaWV3X2xpbmtXaXRoRWRpdG9yVG9vbHRpcD1MaW5rIHdpdGggRWRpdG9yCi0KLUpwYURldGFpbHNWaWV3X3ZpZXdOb3RBdmFpbGFibGU9RGV0YWlscyBhcmUgbm90IGF2YWlsYWJsZSBmb3IgdGhlIGN1cnJlbnQgc2VsZWN0aW9uLgotCi1OZXdKcGFQcm9qZWN0V2l6YXJkX3RpdGxlPU5ldyBKUEEgUHJvamVjdAotTmV3SnBhUHJvamVjdFdpemFyZF9maXJzdFBhZ2VfdGl0bGU9SlBBIFByb2plY3QKLU5ld0pwYVByb2plY3RXaXphcmRfZmlyc3RQYWdlX2Rlc2NyaXB0aW9uPUNvbmZpZ3VyZSBKUEEgcHJvamVjdCBzZXR0aW5ncy4KLQotSnBhRmFjZXRXaXphcmRQYWdlX3RpdGxlPUpQQSBGYWNldAotSnBhRmFjZXRXaXphcmRQYWdlX2Rlc2NyaXB0aW9uPUNvbmZpZ3VyZSBKUEEgc2V0dGluZ3MuCi1KcGFGYWNldFdpemFyZFBhZ2VfcGxhdGZvcm1MYWJlbD1QbGF0Zm9ybQotSnBhRmFjZXRXaXphcmRQYWdlX2Nvbm5lY3Rpb25MYWJlbD1Db25uZWN0aW9uCi1KcGFGYWNldFdpemFyZFBhZ2VfY29ubmVjdGlvbkxpbms9PGE+QWRkIGNvbm5lY3Rpb24gLi4uPC9hPgotSnBhRmFjZXRXaXphcmRQYWdlX2pwYUltcGxlbWVudGF0aW9uTGFiZWw9SlBBIGltcGxlbWVudGF0aW9uCi1KcGFGYWNldFdpemFyZFBhZ2VfdXNlclNlcnZlckxpYkxhYmVsPVVzZSBpbXBsZW1lbnRhdGlvbiBwcm92aWRlZCBieSBzZXJ2ZXIgcnVudGltZQotSnBhRmFjZXRXaXphcmRQYWdlX3NwZWNpZnlMaWJMYWJlbD1Vc2UgaW1wbGVtZW50YXRpb24gbGlicmFyeToKLUpwYUZhY2V0V2l6YXJkUGFnZV9qcGFQcmVmc0xpbms9PGE+Q29uZmlndXJlIGRlZmF1bHQgSlBBIGltcGxlbWVudGF0aW9uIGxpYnJhcnkgLi4uPC9hPgotSnBhRmFjZXRXaXphcmRQYWdlX3VzZXJMaWJzTGluaz08YT5Db25maWd1cmUgdXNlciBsaWJyYXJpZXMgLi4uPC9hPgotSnBhRmFjZXRXaXphcmRQYWdlX3BlcnNpc3RlbnRDbGFzc01hbmFnZW1lbnRMYWJlbD1QZXJzaXN0ZW50IGNsYXNzIG1hbmFnZW1lbnQKLUpwYUZhY2V0V2l6YXJkUGFnZV9kaXNjb3ZlckNsYXNzZXNCdXR0b249RGlzY292ZXIgYW5ub3RhdGVkIGNsYXNzZXMgYXV0b21hdGljYWxseQotSnBhRmFjZXRXaXphcmRQYWdlX2xpc3RDbGFzc2VzQnV0dG9uPUFubm90YXRlZCBjbGFzc2VzIG11c3QgYmUgbGlzdGVkIGluIHBlcnNpc3RlbmNlLnhtbAotSnBhRmFjZXRXaXphcmRQYWdlX2NyZWF0ZU9ybVhtbEJ1dHRvbj1DcmVhdGUgb3JtLnhtbAotCi1QZXJzaXN0ZW50QXR0cmlidXRlUGFnZV9tYXBBcz1NYXAgQXM6Ci0KLVBlcnNpc3RlbnRUeXBlUGFnZV9tYXBBcz1NYXAgQXM6Ci0KLU92ZXJ3cml0ZUNvbmZpcm1lckRpYWxvZ190aXRsZT1PdmVyd3JpdGUgRXhpc3RpbmcgQ2xhc3MKLU92ZXJ3cml0ZUNvbmZpcm1lckRpYWxvZ190ZXh0PU92ZXJ3cml0ZSBzb3VyY2UgY29kZSBmb3IgdGhlIGNsYXNzICcnezB9Jyc/CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvcHJvcGVydHlfZmlsZXMvanB0X3VpX21hcHBpbmdzLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvcHJvcGVydHlfZmlsZXMvanB0X3VpX21hcHBpbmdzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4ZDYzYWUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3Byb3BlcnR5X2ZpbGVzL2pwdF91aV9tYXBwaW5ncy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0jIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgCi0KLVBlcnNpc3RlbnRUeXBlUGFnZV9FbnRpdHlMYWJlbD1FbnRpdHkKLVBlcnNpc3RlbnRUeXBlUGFnZV9FbWJlZGRhYmxlTGFiZWw9RW1iZWRkYWJsZQotUGVyc2lzdGVudFR5cGVQYWdlX01hcHBlZFN1cGVyY2xhc3NMYWJlbD1NYXBwZWQgU3VwZXJjbGFzcwotCi1QZXJzaXN0ZW50QXR0cmlidXRlUGFnZV9CYXNpY0xhYmVsPUJhc2ljCi1QZXJzaXN0ZW50QXR0cmlidXRlUGFnZV9JZExhYmVsPUlkCi1QZXJzaXN0ZW50QXR0cmlidXRlUGFnZV9PbmVUb01hbnlMYWJlbD1PbmUgdG8gTWFueQotUGVyc2lzdGVudEF0dHJpYnV0ZVBhZ2VfTWFueVRvT25lTGFiZWw9TWFueSB0byBPbmUKLVBlcnNpc3RlbnRBdHRyaWJ1dGVQYWdlX01hbnlUb01hbnlMYWJlbD1NYW55IHRvIE1hbnkKLVBlcnNpc3RlbnRBdHRyaWJ1dGVQYWdlX1RyYW5zaWVudExhYmVsPVRyYW5zaWVudAotUGVyc2lzdGVudEF0dHJpYnV0ZVBhZ2VfVmVyc2lvbkxhYmVsPVZlcnNpb24KLVBlcnNpc3RlbnRBdHRyaWJ1dGVQYWdlX0VtYmVkZGVkTGFiZWw9RW1iZWRkZWQKLVBlcnNpc3RlbnRBdHRyaWJ1dGVQYWdlX0VtYmVkZGVkSWRMYWJlbD1FbWJlZGRlZCBJZAotUGVyc2lzdGVudEF0dHJpYnV0ZVBhZ2VfT25lVG9PbmVMYWJlbD1PbmUgdG8gT25lCi0KLUVudGl0eUNvbXBvc2l0ZV90YWJsZURlZmF1bHQ9RGVmYXVsdCAoezB9KQotRW50aXR5Q29tcG9zaXRlX3RhYmxlTm9EZWZhdWx0U3BlY2lmaWVkPURlZmF1bHQgKCkKLUVudGl0eUNvbXBvc2l0ZV9pbmhlcml0YW5jZT1Jbmhlcml0YW5jZQotCi1FbnRpdHlHZW5lcmFsU2VjdGlvbl9uYW1lRGVmYXVsdFdpdGhPbmVQYXJhbT1EZWZhdWx0ICh7MH0pCi1FbnRpdHlHZW5lcmFsU2VjdGlvbl9uYW1lRGVmYXVsdEVtcHR5PURlZmF1bHQgKCkKLUVudGl0eUdlbmVyYWxTZWN0aW9uX25hbWU9TmFtZToKLQotQmFzaWNHZW5lcmFsU2VjdGlvbl9uYW1lPU5hbWU6Ci1CYXNpY0dlbmVyYWxTZWN0aW9uX25hbWVEZWZhdWx0PURlZmF1bHQgKHswfSkKLUJhc2ljR2VuZXJhbFNlY3Rpb25fZmV0Y2hMYWJlbD1GZXRjaDoKLUJhc2ljR2VuZXJhbFNlY3Rpb25fb3B0aW9uYWxMYWJlbD1PcHRpb25hbDoKLUJhc2ljR2VuZXJhbFNlY3Rpb25fbG9iTGFiZWw9TG9iCi1CYXNpY0dlbmVyYWxTZWN0aW9uX3RlbXBvcmFsTGFiZWw9VGVtcG9yYWw6Ci1CYXNpY0dlbmVyYWxTZWN0aW9uX2VudW1lcmF0ZWRMYWJlbD1FbnVtZXJhdGVkOgotCi1UYWJsZUNob29zZXJfbGFiZWw9TmFtZToKLUNhdGFsb2dDaG9vc2VyX2xhYmVsPUNhdGFsb2c6Ci1TY2hlbWFDaG9vc2VyX2xhYmVsPVNjaGVtYToKLVRhYmxlQ29tcG9zaXRlX3RhYmxlU2VjdGlvbj1UYWJsZToKLVRhYmxlQ29tcG9zaXRlX2RlZmF1bHRFbXB0eT1EZWZhdWx0ICgpCi1UYWJsZUNvbXBvc2l0ZV9kZWZhdWx0V2l0aE9uZVBhcmFtPURlZmF1bHQgKHswfSkKLQotQ29sdW1uQ2hvb3Nlcl9sYWJlbD1OYW1lOgotQ29sdW1uVGFibGVDaG9vc2VyX2xhYmVsPVRhYmxlOgotCi1UYXJnZXRFbnRpdHlDaG9vc2VyX2xhYmVsPVRhcmdldCBFbnRpdHk6Ci1UYXJnZXRFbnRpdHlDaG9vc2VyX2RlZmF1bHRFbXB0eT1EZWZhdWx0ICgpCi1UYXJnZXRFbnRpdHlDaG9vc2VyX2RlZmF1bHRXaXRoT25lUGFyYW09RGVmYXVsdCAoezB9KQotVGFyZ2V0RW50aXR5Q2hvb3Nlcl9icm93c2U9QnJvd3NlLi4uCi0KLU5vbk93bmluZ01hcHBpbmdfbWFwcGVkQnlMYWJlbD1NYXBwZWQgQnk6Ci0KLUpvaW5UYWJsZUNvbXBvc2l0ZV9hZGQ9QWRkLi4uCi1Kb2luVGFibGVDb21wb3NpdGVfZGVmYXVsdEVtcHR5PURlZmF1bHQoKQotSm9pblRhYmxlQ29tcG9zaXRlX2RlZmF1bHRXaXRoT25lUGFyYW09RGVmYXVsdCAoezB9KQotSm9pblRhYmxlQ29tcG9zaXRlX2VkaXQ9RWRpdC4uLgotSm9pblRhYmxlQ29tcG9zaXRlX2ludmVyc2VKb2luQ29sdW1uPUludmVyc2UgSm9pbiBDb2x1bW5zCi0KLUpvaW5UYWJsZUNvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtc0RlZmF1bHQ9RGVmYXVsdCAoezB9IC0+IHsxfSkKLUpvaW5UYWJsZUNvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtc0ZpcnN0RGVmYXVsdD1EZWZhdWx0ICh7MH0pIC0+IHsxfQotSm9pblRhYmxlQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zU2VjRGVmYXVsdD17MH0gLT4gRGVmYXVsdCAoezF9KQotSm9pblRhYmxlQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zQm90aERlZmF1bHQ9RGVmYXVsdCAoezB9KSAtPiBEZWZhdWx0ICh7MX0pCi1Kb2luVGFibGVDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXM9ezB9IC0+IHsxfQotSm9pblRhYmxlQ29tcG9zaXRlX2pvaW5Db2x1bW49Sm9pbiBDb2x1bW5zCi1Kb2luVGFibGVDb21wb3NpdGVfbmFtZT1OYW1lOgotSm9pblRhYmxlQ29tcG9zaXRlX3JlbW92ZT1SZW1vdmUKLUpvaW5UYWJsZUNvbXBvc2l0ZV9vdmVycmlkZURlZmF1bHRKb2luQ29sdW1ucz1PdmVycmlkZSBEZWZhdWx0Ci1Kb2luVGFibGVDb21wb3NpdGVfb3ZlcnJpZGVEZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW5zPU92ZXJyaWRlIERlZmF1bHQKLQotSW52ZXJzZUpvaW5Db2x1bW5EaWFsb2dfZWRpdEludmVyc2VKb2luQ29sdW1uPUVkaXQgSW52ZXJzZSBKb2luIENvbHVtbgotSW52ZXJzZUpvaW5Db2x1bW5EaWFsb2dfZGVmYXVsdFdpdGhPbmVQYXJhbT1EZWZhdWx0ICh7MH0pCi0KLUpvaW5Db2x1bW5EaWFsb2dfYWRkSm9pbkNvbHVtbj1BZGQgSm9pbiBDb2x1bW4KLUpvaW5Db2x1bW5EaWFsb2dfZWRpdEpvaW5Db2x1bW49RWRpdCBKb2luIENvbHVtbgotSm9pbkNvbHVtbkRpYWxvZ19uYW1lPU5hbWU6Ci1Kb2luQ29sdW1uRGlhbG9nX3JlZmVyZW5jZWRDb2x1bW5OYW1lPVJlZmVyZW5jZWQgQ29sdW1uIE5hbWU6Ci1Kb2luQ29sdW1uRGlhbG9nX2RlZmF1bHRXaXRoT25lUGFyYW09RGVmYXVsdCAoezB9KQotSm9pbkNvbHVtbkRpYWxvZ19pbnNlcnRhYmxlPUluc2VydGFibGU6Ci1Kb2luQ29sdW1uRGlhbG9nX3VwZGF0YWJsZT1VcGRhdGFibGU6Ci1Kb2luQ29sdW1uRGlhbG9nX3RhYmxlPVRhYmxlOgotCi1NdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdDb21wb3NpdGVfZ2VuZXJhbD1HZW5lcmFsCi1NdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdDb21wb3NpdGVfam9pblRhYmxlPUpvaW4gVGFibGUKLU11bHRpUmVsYXRpb25zaGlwTWFwcGluZ0NvbXBvc2l0ZV90YXJnZXRFbnRpdHk9VGFyZ2V0IEVudGl0eToKLU11bHRpUmVsYXRpb25zaGlwTWFwcGluZ0NvbXBvc2l0ZV9jYXNjYWRlVHlwZT1DYXNjYWRlIFR5cGU6Ci1NdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdDb21wb3NpdGVfZmV0Y2hUeXBlPUZldGNoIFR5cGU6Ci1NdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdDb21wb3NpdGVfbWFwcGVkQnk9TWFwcGVkIEJ5OgotCi1Db2x1bW5Db21wb3NpdGVfY29sdW1uU2VjdGlvbj1Db2x1bW46Ci1Db2x1bW5Db21wb3NpdGVfZGVmYXVsdFdpdGhPbmVQYXJhbT1EZWZhdWx0ICh7MH0pCi1Db2x1bW5Db21wb3NpdGVfZGVmYXVsdEVtcHR5PURlZmF1bHQgKCkKLUNvbHVtbkNvbXBvc2l0ZV9pbnNlcnRhYmxlPUluc2VydGFibGU6Ci1Db2x1bW5Db21wb3NpdGVfdXBkYXRhYmxlPVVwZGF0YWJsZToKLQotSm9pbkNvbHVtbkNvbXBvc2l0ZV9qb2luQ29sdW1uPUpvaW4gQ29sdW1ucwotSm9pbkNvbHVtbkNvbXBvc2l0ZV9kZWZhdWx0RW1wdHk9RGVmYXVsdCgpCi1Kb2luQ29sdW1uQ29tcG9zaXRlX25hbWU9TmFtZToKLUpvaW5Db2x1bW5Db21wb3NpdGVfZGVmYXVsdFdpdGhPbmVQYXJhbT1EZWZhdWx0ICh7MH0pCi1Kb2luQ29sdW1uQ29tcG9zaXRlX2FkZD1BZGQuLi4KLUpvaW5Db2x1bW5Db21wb3NpdGVfZWRpdD1FZGl0Li4uCi1Kb2luQ29sdW1uQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zPXswfSAtPiB7MX0KLUpvaW5Db2x1bW5Db21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNEZWZhdWx0PURlZmF1bHQgKHswfSAtPiB7MX0pCi1Kb2luQ29sdW1uQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zQm90aERlZmF1bHQ9RGVmYXVsdCAoezB9KSAtPiBEZWZhdWx0ICh7MX0pCi1Kb2luQ29sdW1uQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zRmlyc3REZWZhdWx0PURlZmF1bHQgKHswfSkgLT4gezF9Ci1Kb2luQ29sdW1uQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zU2VjRGVmYXVsdD17MH0gLT4gRGVmYXVsdCAoezF9KQotSm9pbkNvbHVtbkNvbXBvc2l0ZV9yZW1vdmU9UmVtb3ZlCi1Kb2luQ29sdW1uQ29tcG9zaXRlX292ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5zPU92ZXJyaWRlIERlZmF1bHQKLQotUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX292ZXJyaWRlRGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucz1PdmVycmlkZSBEZWZhdWx0Ci1QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfYWRkPUFkZC4uLgotUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX2VkaXQ9RWRpdC4uLgotUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX3JlbW92ZT1SZW1vdmUKLVByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9kZWZhdWx0RW1wdHk9RGVmYXVsdCgpCi1QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfZGVmYXVsdFdpdGhPbmVQYXJhbT1EZWZhdWx0ICh7MH0pCi1QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfcHJpbWFyeUtleUpvaW5Db2x1bW49UHJpbWFyeSBLZXkgSm9pbiBDb2x1bW5zCi1QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXM9ezB9IC0+IHsxfQotUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zRGVmYXVsdD1EZWZhdWx0ICh7MH0gLT4gezF9KQotUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zQm90aERlZmF1bHQ9RGVmYXVsdCAoezB9KSAtPiBEZWZhdWx0ICh7MX0pCi1QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNGaXJzdERlZmF1bHQ9RGVmYXVsdCAoezB9KSAtPiB7MX0KLVByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtc1NlY0RlZmF1bHQ9ezB9IC0+IERlZmF1bHQgKHsxfSkKLQotQXR0cmlidXRlT3ZlcnJpZGVzQ29tcG9zaXRlX2F0dHJpYnV0ZU92ZXJyaWRlcz1BdHRyaWJ1dGUgT3ZlcnJpZGVzCi1BdHRyaWJ1dGVPdmVycmlkZXNDb21wb3NpdGVfb3ZlcnJpZERlZmF1bHQ9T3ZlcnJpZGUgRGVmYXVsdAotT3ZlcnJpZGVzQ29tcG9zaXRlX2pvaW5Db2x1bW49Sm9pbiBDb2x1bW5zCi1Jbmhlcml0YW5jZUNvbXBvc2l0ZV9kZWZhdWx0PURlZmF1bHQgKHswfSkKLUluaGVyaXRhbmNlQ29tcG9zaXRlX3N0cmF0ZWd5PVN0cmF0ZWd5OgotSW5oZXJpdGFuY2VDb21wb3NpdGVfZGlzY3JpbWluYXRvclZhbHVlPURpc2NyaW1pbmF0b3IgVmFsdWU6Ci1Jbmhlcml0YW5jZUNvbXBvc2l0ZV9kaXNjcmltaW5hdG9yVmFsdWVEZWZhdWx0V2l0aE9uZVBhcmFtPURlZmF1bHQgKHswfSkKLQotRGlzY3JpbWluYXRvckNvbHVtbkNvbXBvc2l0ZV9jb2x1bW49RGlzY3JpbWluYXRvciBDb2x1bW46Ci1EaXNjcmltaW5hdG9yQ29sdW1uQ29tcG9zaXRlX2Rpc2NyaW1pbmF0b3JUeXBlPURpc2NyaW1pbmF0b3IgVHlwZToKLURpc2NyaW1pbmF0b3JDb2x1bW5Db21wb3NpdGVfZGVmYXVsdEVtcHR5PURlZmF1bHQoPHByb3ZpZGVyLXNwZWNpZmljPikKLQotSWRNYXBwaW5nQ29tcG9zaXRlX3BrX2dlbmVyYXRpb249UEsgR2VuZXJhdGlvbgotSWRNYXBwaW5nQ29tcG9zaXRlX3ByaW1hcnlLZXlHZW5lcmF0aW9uPVByaW1hcnkgS2V5IEdlbmVyYXRpb24KLUlkTWFwcGluZ0NvbXBvc2l0ZV90YWJsZUdlbmVyYXRvcj1UYWJsZSBHZW5lcmF0b3IKLUlkTWFwcGluZ0NvbXBvc2l0ZV9zZXF1ZW5jZUdlbmVyYXRvcj1TZXF1ZW5jZSBHZW5lcmF0b3IKLQotR2VuZXJhdGVkVmFsdWVDb21wb3NpdGVfZ2VuZXJhdGVkVmFsdWU9R2VuZXJhdGVkIFZhbHVlCi1HZW5lcmF0ZWRWYWx1ZUNvbXBvc2l0ZV9nZW5lcmF0b3JOYW1lPUdlbmVyYXRvciBOYW1lOgotR2VuZXJhdGVkVmFsdWVDb21wb3NpdGVfc3RyYXRlZ3k9U3RyYXRlZ3k6Ci0KLVNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlX3NlcXVlbmNlR2VuZXJhdG9yPVNlcXVlbmNlIEdlbmVyYXRvcgotU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGVfbmFtZT1OYW1lOgotU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGVfc2VxdWVuY2U9U2VxdWVuY2U6Ci1TZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZV9kZWZhdWx0PURlZmF1bHQKLQotVGFibGVHZW5lcmF0b3JDb21wb3NpdGVfbmFtZT1OYW1lOgotVGFibGVHZW5lcmF0b3JDb21wb3NpdGVfdGFibGU9VGFibGU6Ci1UYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV90YWJsZUdlbmVyYXRvcj1UYWJsZSBHZW5lcmF0b3IKLVRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX3BrQ29sdW1uPVByaW1hcnkgS2V5IENvbHVtbjoKLVRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX3ZhbHVlQ29sdW1uPVZhbHVlIENvbHVtbjoKLVRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX3BrQ29sdW1uVmFsdWU9UHJpbWFyeSBLZXkgQ29sdW1uIFZhbHVlOgotVGFibGVHZW5lcmF0b3JDb21wb3NpdGVfZGVmYXVsdD1EZWZhdWx0Ci0KLU9yZGVyQnlDb21wb3NpdGVfb3JkZXJCeUdyb3VwPU9yZGVyIEJ5Ci1PcmRlckJ5Q29tcG9zaXRlX29yZGVyQnlMYWJlbD1PcmRlciBCeToKLU9yZGVyQnlDb21wb3NpdGVfbm9PcmRlcmluZz1ObyBPcmRlcmluZwotT3JkZXJCeUNvbXBvc2l0ZV9wcmltYXJ5S2V5T3JkZXJpbmc9UHJpbWFyeSBLZXkgT3JkZXJpbmcKLU9yZGVyQnlDb21wb3NpdGVfY3VzdG9tT3JkZXJpbmc9Q3VzdG9tIE9yZGVyaW5nCi0KLVNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZV9zZWNvbmRhcnlUYWJsZXM9U2Vjb25kYXJ5IFRhYmxlcwotU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlX2FkZD1BZGQuLi4KLVNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZV9lZGl0PUVkaXQuLi4KLVNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZV9yZW1vdmU9UmVtb3ZlCi0KLVNlY29uZGFyeVRhYmxlRGlhbG9nX2VkaXRTZWNvbmRhcnlUYWJsZT1FZGl0IFNlY29uZGFyeSBUYWJsZQotU2Vjb25kYXJ5VGFibGVEaWFsb2dfbmFtZT1OYW1lOgotU2Vjb25kYXJ5VGFibGVEaWFsb2dfY2F0YWxvZz1DYXRhbG9nOgotU2Vjb25kYXJ5VGFibGVEaWFsb2dfc2NoZW1hPVNjaGVtYToKLVNlY29uZGFyeVRhYmxlRGlhbG9nX2RlZmF1bHRTY2hlbWE9RGVmYXVsdCAoezB9KQotU2Vjb25kYXJ5VGFibGVEaWFsb2dfZGVmYXVsdENhdGFsb2c9RGVmYXVsdCAoezB9KQotCi1BY2Nlc3NUeXBlQ29tYm9fZGVmYXVsdD1EZWZhdWx0Ci1FbnVtQ29tYm9WaWV3ZXJfZGVmYXVsdD1EZWZhdWx0ICh7MH0pCi1NZXRhRGF0YUNvbXBsZXRlQ29tYm9fRGVmYXVsdD1EZWZhdWx0ICh7MH0pCi1Kb2luQ29sdW1uRGlhbG9nX2RlZmF1bHRUcnVlPURlZmF1bHQgKHswfSkKLUluaGVyaXRhbmNlQ29tcG9zaXRlX2RlZmF1bHREaXNjcmltaW5hdG9yVHlwZT1EZWZhdWx0ICh7MH0pCi1HZW5lcmF0ZWRWYWx1ZUNvbXBvc2l0ZV9kZWZhdWx0PURlZmF1bHQgKHswfSkKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9wcm9wZXJ0eV9maWxlcy9qcHRfdWlfeG1sLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvcHJvcGVydHlfZmlsZXMvanB0X3VpX3htbC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTgxZWE0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9wcm9wZXJ0eV9maWxlcy9qcHRfdWlfeG1sLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotIyB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIAotCi1QZXJzaXN0ZW50VHlwZVBhZ2VfamF2YUNsYXNzTGFiZWw9SmF2YSBDbGFzczoKLVBlcnNpc3RlbnRUeXBlUGFnZV9NZXRhZGF0YUNvbXBsZXRlTGFiZWw9TWV0YWRhdGEgQ29tcGxldGU6Ci1QZXJzaXN0ZW50VHlwZVBhZ2VfQWNjZXNzTGFiZWw9QWNjZXNzOgotCi1QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YVNlY3Rpb25fU2NoZW1hRGVmYXVsdD1EZWZhdWx0Ci1QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YVNlY3Rpb25fQ2F0YWxvZ0RlZmF1bHQ9RGVmYXVsdAotCi1QZXJzaXN0ZW50QXR0cmlidXRlUGFnZV9qYXZhQXR0cmlidXRlTGFiZWw9SmF2YSBBdHRyaWJ1dGU6Ci0KLVhNTEVudGl0eU1hcHBpbmdzUGFnZV9YbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZUNoZWNrQm94PVhNTCBNYXBwaW5nIE1ldGFkYXRhIENvbXBsZXRlCi1YTUxFbnRpdHlNYXBwaW5nc1BhZ2VfQ2FzY2FkZVBlcnNpc3RDaGVja0JveD1DYXNjYWRlIFBlcnNpc3QKLVhNTEVudGl0eU1hcHBpbmdzUGFnZV9QZXJzaXN0ZW5jZVVuaXRTZWN0aW9uPVBlcnNpc3RlbmNlIFVuaXQKLVhNTEVudGl0eU1hcHBpbmdzUGFnZV9TY2hlbWFEZWZhdWx0PURlZmF1bHQgKHswfSkKLVhNTEVudGl0eU1hcHBpbmdzUGFnZV9TY2hlbWFOb0RlZmF1bHRTcGVjaWZpZWQ9RGVmYXVsdAotWE1MRW50aXR5TWFwcGluZ3NQYWdlX0NhdGFsb2dEZWZhdWx0PURlZmF1bHQgKHswfSkKLVhNTEVudGl0eU1hcHBpbmdzUGFnZV9DYXRhbG9nTm9EZWZhdWx0U3BlY2lmaWVkPURlZmF1bHQKLQotWG1sU2NoZW1hQ2hvb3Nlcl9TY2hlbWFDaG9vc2VyPVNjaGVtYToKLVhtbENhdGFsb2dDaG9vc2VyX0NhdGFsb2dDaG9vc2VyPUNhdGFsb2c6Ci0KLVhtbEphdmFDbGFzc0Nob29zZXJfWG1sSmF2YUNsYXNzRGlhbG9nX3RpdGxlPUNsYXNzIFNlbGVjdGlvbgotWG1sSmF2YUNsYXNzQ2hvb3Nlcl9YbWxKYXZhQ2xhc3NEaWFsb2dfbWVzc2FnZT1DaG9vc2UgYSB0eXBlOgotCi1YbWxQYWNrYWdlQ2hvb3Nlcl9QYWNrYWdlRGlhbG9nX3RpdGxlPVBhY2thZ2UgU2VsZWN0aW9uCi1YbWxQYWNrYWdlQ2hvb3Nlcl9QYWNrYWdlRGlhbG9nX21lc3NhZ2U9Q2hvb3NlIGEgZm9sZGVyOiAKLQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NjaGVtYS9qcGFQbGF0Zm9ybS5leHNkIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NjaGVtYS9qcGFQbGF0Zm9ybS5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmQxMDg1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zY2hlbWEvanBhUGxhdGZvcm0uZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5qcHQudWkiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmpwdC51aSIgaWQ9ImpwYVZlbmRvciIgbmFtZT0iSlBBIFVJIFZlbmRvciIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZGVzY3JpcHRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJqcGFQbGF0Zm9ybSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJqcGFQbGF0Zm9ybSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgRXh0ZW5kIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFuZCB5b3UgbXVzdCBhbHNvIGV4dGVuZCB0aGUgb3JnLmVjbGlwc2UuanB0LmNvcmUuanBhUGxhdGZvcm0gCi0gICAgICAgICAgICBleHRlbnNpb24gcG9pbnQuICBUaGUgaWRzIG11c3QgbWF0Y2guICBPbmUganBhUGxhdGZvcm0gd2lsbCBiZSBjaG9zZW4gcGVyIEpwYVByb2plY3QuICBUaGUgCi0gICAgICAgICAgICBwb3NzaWJsZSBqcGFQbGF0Zm9ybXMgd2lsbCBiZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIgYXMgYSBwcm9qZWN0IHByb3BlcnR5LgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgaWQgbXVzdCBtYXRjaCB0aGUgY29ycmVzcG9uZGluZyBvcmcuZWNsaXBzZS5qcHQuY29yZS5qcGFWZW5kb3IgZXh0ZW5zaW9uIGlkLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLklKcGFQbGF0Zm9ybVVJIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciB0aGUgZmlyc3QgcmVsZWFzZSBpbiB3aGljaCB0aGlzIGV4dGVuc2lvbiBwb2ludCBhcHBlYXJzLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9CYXNlSnBhUGxhdGZvcm1VaS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvQmFzZUpwYVBsYXRmb3JtVWkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzUzZTVkOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9CYXNlSnBhUGxhdGZvcm1VaS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5JSnBhRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5nZW5lcmljLkVudGl0aWVzR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLmRldGFpbHMuSmF2YURldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamF2YS5zdHJ1Y3R1cmUuSmF2YVN0cnVjdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zdHJ1Y3R1cmUuSUpwYVN0cnVjdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC54bWwuZGV0YWlscy5YbWxEZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnhtbC5zdHJ1Y3R1cmUuWG1sU3RydWN0dXJlUHJvdmlkZXI7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlSnBhUGxhdGZvcm1VaSBpbXBsZW1lbnRzIElKcGFQbGF0Zm9ybVVpCi17Ci0JcHJpdmF0ZSBDb2xsZWN0aW9uPElKcGFEZXRhaWxzUHJvdmlkZXI+IGRldGFpbHNQcm92aWRlcnM7Ci0JcHJpdmF0ZSBDb2xsZWN0aW9uPElKcGFTdHJ1Y3R1cmVQcm92aWRlcj4gc3RydWN0dXJlUHJvdmlkZXJzOwotCQotCXByb3RlY3RlZCBCYXNlSnBhUGxhdGZvcm1VaSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQkKLQlwdWJsaWMgQ29sbGVjdGlvbjxJSnBhRGV0YWlsc1Byb3ZpZGVyPiBkZXRhaWxzUHJvdmlkZXJzKCkgewotCQlpZiAodGhpcy5kZXRhaWxzUHJvdmlkZXJzID09IG51bGwpIHsKLQkJCXRoaXMuZGV0YWlsc1Byb3ZpZGVycyA9IHRoaXMuYnVpbGRKcGFEZXRhaWxzUHJvdmlkZXIoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5kZXRhaWxzUHJvdmlkZXJzOwotCX0KLQkJCi0JcHJvdGVjdGVkIENvbGxlY3Rpb248SUpwYURldGFpbHNQcm92aWRlcj4gYnVpbGRKcGFEZXRhaWxzUHJvdmlkZXIoKSB7Ci0JCUNvbGxlY3Rpb248SUpwYURldGFpbHNQcm92aWRlcj4gZGV0YWlsc1Byb3ZpZGVycyA9IG5ldyBBcnJheUxpc3Q8SUpwYURldGFpbHNQcm92aWRlcj4oKTsKLQkJZGV0YWlsc1Byb3ZpZGVycy5hZGQobmV3IEphdmFEZXRhaWxzUHJvdmlkZXIoKSk7Ci0JCWRldGFpbHNQcm92aWRlcnMuYWRkKG5ldyBYbWxEZXRhaWxzUHJvdmlkZXIoKSk7Ci0JCXJldHVybiBkZXRhaWxzUHJvdmlkZXJzOwotCX0KLQkKLQlwdWJsaWMgQ29sbGVjdGlvbjxJSnBhU3RydWN0dXJlUHJvdmlkZXI+IHN0cnVjdHVyZVByb3ZpZGVycygpIHsKLQkJaWYgKHRoaXMuc3RydWN0dXJlUHJvdmlkZXJzID09IG51bGwpIHsKLQkJCXRoaXMuc3RydWN0dXJlUHJvdmlkZXJzID0gdGhpcy5idWlsZEpwYVN0cnVjdHVyZVByb3ZpZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuc3RydWN0dXJlUHJvdmlkZXJzOwotCX0KLQkKLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxJSnBhU3RydWN0dXJlUHJvdmlkZXI+IGJ1aWxkSnBhU3RydWN0dXJlUHJvdmlkZXIoKSB7Ci0JCUNvbGxlY3Rpb248SUpwYVN0cnVjdHVyZVByb3ZpZGVyPiBzdHJ1Y3R1cmVQcm92aWRlcnMgPSBuZXcgQXJyYXlMaXN0PElKcGFTdHJ1Y3R1cmVQcm92aWRlcj4oKTsKLQkJc3RydWN0dXJlUHJvdmlkZXJzLmFkZChuZXcgSmF2YVN0cnVjdHVyZVByb3ZpZGVyKCkpOwotCQlzdHJ1Y3R1cmVQcm92aWRlcnMuYWRkKG5ldyBYbWxTdHJ1Y3R1cmVQcm92aWRlcigpKTsKLQkJcmV0dXJuIHN0cnVjdHVyZVByb3ZpZGVyczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBnZW5lcmF0ZUVudGl0aWVzKElKcGFQcm9qZWN0IHByb2plY3QsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCi0JCUVudGl0aWVzR2VuZXJhdG9yLmdlbmVyYXRlKHByb2plY3QsIHNlbGVjdGlvbik7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvSUpwYUhlbHBDb250ZXh0SWRzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9JSnBhSGVscENvbnRleHRJZHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdmZTEyNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9JSnBhSGVscENvbnRleHRJZHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24gYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbDsKLQotCi0vKioKLSAqIEhlbHAgY29udGV4dCBpZHMgZm9yIHRoZSBEYWxpIEpQQSBVSS4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgY29udGFpbnMgY29uc3RhbnRzIG9ubHk7IGl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZQotICogaW1wbGVtZW50ZWQuCi0gKiA8L3A+Ci0gKiAgCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUpwYUhlbHBDb250ZXh0SWRzIHsKLQotCi0JLy9Db250ZXh0SUQgcHJlZml4Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYID0gSnB0VWlQbHVnaW4uUExVR0lOX0lEICsgIi4iOyAgLy8kTk9OLU5MUy0xJAotCQotCS8vUGVyc2lzdGVudCBUeXBlIGNvbXBvc2l0ZXMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfQUNDRVNTX1RZUEUgPSBQUkVGSVggKyAiZW50aXR5X2FjY2Vzc1R5cGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX0FUVFJJQlVURV9PVkVSUklERVMgPSBQUkVGSVggKyAiZW50aXR5X2F0dHJpYnV0ZU92ZXJyaWRlcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfQVRUUklCVVRFX09WRVJSSURFU19DT0xVTU4gPSBQUkVGSVggKyAiZW50aXR5X2F0dHJpYnV0ZU92ZXJyaWRlc0NvbHVtbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfQ0FUQUxPRyA9IFBSRUZJWCArICJlbnRpdHlfY2F0YWxvZyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfSU5IRVJJVEFOQ0VfU1RSQVRFR1kgPSBQUkVGSVggKyAiZW50aXR5X2luaGVyaXRhbmNlU3RyYXRlZ3kiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX0lOSEVSSVRBTkNFX0RJU0NSSU1JTkFUT1JfVFlQRSA9IFBSRUZJWCArICJlbnRpdHlfaW5oZXJpdGFuY2VEaXNjcmltaW5hdG9yVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfSU5IRVJJVEFOQ0VfRElTQ1JJTUlOQVRPUl9DT0xVTU4gPSBQUkVGSVggKyAiZW50aXR5X2luaGVyaXRhbmNlRGlzY3JpbWluYXRvckNvbHVtbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfSU5IRVJJVEFOQ0VfRElTQ1JJTUlOQVRPUl9WQUxVRSA9IFBSRUZJWCArICJlbnRpdHlfaW5oZXJpdGFuY2VEaXNjcmltaW5hdG9yVmFsdWUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX05BTUUgPSBQUkVGSVggKyAiZW50aXR5X25hbWUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX09STV9QQUNLQUdFID0gUFJFRklYICsgIm9ybV9wYWNrYWdlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9PUk1fU0NIRU1BID0gUFJFRklYICsgIm9ybV9zY2hlbWEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX09STV9DQVRBTE9HID0gUFJFRklYICsgIm9ybV9jYXRhbG9nIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9PUk1fQUNDRVNTID0gUFJFRklYICsgIm9ybV9hY2Nlc3MiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX09STV9DQVNDQURFID0gUFJFRklYICsgIm9ybV9jYXNjYWRlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9PUk1fWE1MID0gUFJFRklYICsgIm9ybV94bWwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX1NDSEVNQSA9IFBSRUZJWCArICJlbnRpdHlfc2NoZW1hIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9UQUJMRSA9IFBSRUZJWCArICJlbnRpdHlfdGFibGUiOyAvLyROT04tTkxTLTEkCi0KLQkKLQkvL1BlcnNpc3RlbnQgQXR0cmlidXRlIGNvbXBvc2l0ZXMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX0NBU0NBREVfVFlQRSA9IFBSRUZJWCArICJtYXBwaW5nX2Nhc2NhZGVUeXBlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfQ09MVU1OID0gUFJFRklYICsgIm1hcHBpbmdfY29sdW1uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfQ09MVU1OX0lOU0VSVEFCTEUgPSBQUkVGSVggKyAibWFwcGluZ19jb2x1bW5JbnNlcnRhYmxlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfQ09MVU1OX1RBQkxFID0gUFJFRklYICsgIm1hcHBpbmdfY29sdW1uVGFibGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19DT0xVTU5fVVBEQVRBQkxFPSBQUkVGSVggKyAibWFwcGluZ19jb2x1bW5VcGRhdGFibGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19FTUJFRERFRF9BVFRSSUJVVEVfT1ZFUlJJREVTID0gUFJFRklYICsgIm1hcHBpbmdfZW1iZWRkZWRBdHRyaWJ1dGVPdmVycmlkZXMiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX0VNQkVEREVEX0FUVFJJQlVURV9PVkVSUklERVNfQ09MVU1OID0gUFJFRklYICsgIm1hcHBpbmdfZW1iZWRkZWRBdHRyaWJ1dGVPdmVycmlkZXNDb2x1bW4iOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX0VOVU1FUkFURUQgPSBQUkVGSVggKyAibWFwcGluZ19lbnVtZXJhdGVkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfRkVUQ0hfVFlQRSA9IFBSRUZJWCArICJtYXBwaW5nX2ZldGNoVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX0dFTkVSQVRFRF9WQUxVRV9TVFJBVEVHWSA9IFBSRUZJWCArICJtYXBwaW5nX2dlbmVyYXRlZFZhbHVlU3RyYXRlZ3kiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19HRU5FUkFURURfVkFMVUVfR0VORVJBVE9SX05BTUUgPSBQUkVGSVggKyAibWFwcGluZ19nZW5lcmF0ZWRWYWx1ZUdlbmVyYXRvck5hbWUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19KT0lOX0NPTFVNTl9OQU1FID0gUFJFRklYICsgIm1hcHBpbmdfam9pbkNvbHVtbk5hbWUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19KT0lOX1JFRkVSRU5DRURfQ09MVU1OID0gUFJFRklYICsgIm1hcHBpbmdfam9pblJlZmVyZW5jZWRDb2x1bW4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19KT0lOX1RBQkxFX05BTUUgPSBQUkVGSVggKyAibWFwcGluZ19qb2luVGFibGVOYW1lIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfSk9JTl9UQUJMRV9DT0xVTU5TID0gUFJFRklYICsgIm1hcHBpbmdfam9pblRhYmxlSm9pbkNvbHVtbnMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19KT0lOX1RBQkxFX0lOVkVSU0VfSk9JTl9DT0xVTU5TID0gUFJFRklYICsgIm1hcHBpbmdfam9pblRhYmxlSW52ZXJzZUpvaW5Db2x1bW5zIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfTE9CID0gUFJFRklYICsgIm1hcHBpbmdfbG9iIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfTUFQX0FTID0gUFJFRklYICsgIm1hcHBpbmdfbWFwQXMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19NQVBQRURfQlkgPSBQUkVGSVggKyAibWFwcGluZ19tYXBwZWRCeSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX09QVElPTkFMID0gUFJFRklYICsgIm1hcHBpbmdfb3B0aW9uYWwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19PUkRFUl9CWSA9IFBSRUZJWCArICJtYXBwaW5nX29yZGVyQnkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19PUkRFUl9CWV9OT19PUkRFUklORyA9IFBSRUZJWCArICJtYXBwaW5nX29yZGVyQnlOb09yZGVyaW5nIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfT1JERVJfQllfUFJJTUFSWV9LRVlfT1JERVJJTkcgPSBQUkVGSVggKyAibWFwcGluZ19vcmRlckJ5UHJpbWFyeUtleU9yZGVyaW5nIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfT1JERVJfQllfQ1VTVE9NX09SREVSSU5HID0gUFJFRklYICsgIm1hcHBpbmdfb3JkZXJCeUN1c3RvbU9yZGVyaW5nIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfUFJJTUFSWV9LRVlfR0VORVJBVElPTiA9IFBSRUZJWCArICJtYXBwaW5nX3ByaW1hcnlLZXlHZW5lcmF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfU0VRVUVOQ0VfR0VORVJBVE9SID0gUFJFRklYICsgIm1hcHBpbmdfc2VxdWVuY2VHZW5lcmF0b3IiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19TRVFVRU5DRV9HRU5FUkFUT1JfTkFNRSA9IFBSRUZJWCArICJtYXBwaW5nX3NlcXVlbmNlR2VuZXJhdG9yTmFtZSI7IC8vJE5PTi1OTFMtMSQgCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19TRVFVRU5DRV9HRU5FUkFUT1JfU0VRVUVOQ0UgPSBQUkVGSVggKyAibWFwcGluZ19zZXF1ZW5jZUdlbmVyYXRvclNlcXVlbmNlIjsgLy8kTk9OLU5MUy0xJCAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX1RBQkxFX0dFTkVSQVRPUiA9IFBSRUZJWCArICJtYXBwaW5nX3RhYmxlR2VuZXJhdG9yIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfVEFCTEVfR0VORVJBVE9SX05BTUUgPSBQUkVGSVggKyAibWFwcGluZ190YWJsZUdlbmVyYXRvck5hbWUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19UQUJMRV9HRU5FUkFUT1JfUFJJTUFSWV9LRVlfQ09MVU1OID0gUFJFRklYICsgIm1hcHBpbmdfdGFibGVHZW5lcmF0b3JQcmltYXJ5S2V5Q29sdW1uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfVEFCTEVfR0VORVJBVE9SX1BSSU1BUllfS0VZX0NPTFVNTl9WQUxVRSA9IFBSRUZJWCArICJtYXBwaW5nX3RhYmxlR2VuZXJhdG9yUHJpbWFyeUtleUNvbHVtblZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfVEFCTEVfR0VORVJBVE9SX1RBQkxFPSBQUkVGSVggKyAibWFwcGluZ190YWJsZUdlbmVyYXRvclRhYmxlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfVEFCTEVfR0VORVJBVE9SX1ZBTFVFX0NPTFVNTiA9IFBSRUZJWCArICJtYXBwaW5nX3RhYmxlR2VuZXJhdG9yVmFsdWVDb2x1bW4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19UQVJHRVRfRU5USVRZID0gUFJFRklYICsgIm1hcHBpbmdfdGFyZ2V0RW50aXR5IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfVEVNUE9SQUwgPSBQUkVGSVggKyAibWFwcGluZ190ZW1wb3JhbCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vUHJvamVjdCBwcm9wZXJ0aWVzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVElFU19KQVZBX1BFUlNJU1RFTkNFID0gUFJFRklYICsgInByb3BlcnRpZXNfamF2YVBlcnNpc3RlbmNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRJRVNfSkFWQV9QRVJTSVNURU5DRV9DT05ORUNUSU9OID0gUFJFRklYICsgInByb3BlcnRpZXNfamF2YVBlcnNpc3RlbmNlQ29ubmVjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUSUVTX0pBVkFfUEVSU0lTVEVOQ0VfU0NIRU1BID0gUFJFRklYICsgInByb3BlcnRpZXNfamF2YVBlcnNpc3RlbmNlU2NoZW1hIjsgLy8kTk9OLU5MUy0xJAotCQotCS8vRGlhbG9ncywgV2l6YXJkcwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJQUxPR19DUkVBVEVfT1JNID0gUFJFRklYICsgImRpYWxvZ19jcmVhdGVPUk0iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElBTE9HX0VESVRfSU5WRVJTRV9KT0lOX0NPTFVOTiA9IFBSRUZJWCArICJkaWFsb2dfZWRpdEludmVyc2VKb2luQ29sdW1uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJQUxPR19HRU5FUkFURV9FTlRJVElFUyA9IFBSRUZJWCArICJkaWFsb2dfZ2VuZXJhdGVFbnRpdGllcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESUFMT0dfR0VORVJBVEVfRU5USVRJRVNfU09VUkNFID0gUFJFRklYICsgImRpYWxvZ19nZW5lcmF0ZUVudGl0aWVzX3NvdXJjZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESUFMT0dfR0VORVJBVEVfRU5USVRJRVNfUEFDS0FHRSA9IFBSRUZJWCArICJkaWFsb2dfZ2VuZXJhdGVFbnRpdGllc19wYWNrYWdlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJQUxPR19HRU5FUkFURV9FTlRJVElFU19UQUJMRVMgPSBQUkVGSVggKyAiZGlhbG9nX2dlbmVyYXRlRW50aXRpZXNfdGFibGVzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJQUxPR19KUEFfRkFDRVQgPSBQUkVGSVggKyAiZGlhbG9nX0pQQUZhY2V0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJQUxPR19KUEFfUExBVEZPUk0gPSBQUkVGSVggKyAiZGlhbG9nX0pQQVBsYXRmb3JtIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19KUEFfUFJPSkVDVCA9IFBSRUZJWCArICJkaWFsb2dfbmV3SlBBUHJvamVjdCI7IC8vJE5PTi1OTFMtMSQKLSAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0pQQV9QUk9KRUNUX0NPTlRFTlRfUEFHRV9DTEFTU1BBVEggPSBQUkVGSVggKyAiZGlhbG9nX2FkZEphdmFQZXJzaXN0ZW5jZV9jbGFzc3BhdGgiOyAvLyROT04tTkxTLTEkCi0gCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19KUEFfUFJPSkVDVF9DT05URU5UX1BBR0VfREFUQUJBU0UgPSBQUkVGSVggKyAiZGlhbG9nX2FkZEphdmFQZXJzaXN0ZW5jZV9kYXRhYmFzZSI7IC8vJE5PTi1OTFMtMSQKLSAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0pQQV9QUk9KRUNUX0NPTlRFTlRfUEFHRV9QQUNLQUdJTkcgPSBQUkVGSVggKyAiZGlhbG9nX2FkZEphdmFQZXJzaXN0ZW5jZV9wYWNrYWdpbmciOyAvLyROT04tTkxTLTEkCi0gCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19KUEFfUFJPSkVDVF9DUkVBVElPTl9QQUdFID0gUFJFRklYICsgImRpYWxvZ19hZGRKYXZhUGVyc2lzdGVuY2UiOyAvLyROT04tTkxTLTEkCi0JCi0JLy9PdGhlcgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTkNFX09VVExJTkUgPSBQUkVGSVggKyAicGVyc2lzdGVuY2VPdXRsaW5lIjsgLy8kTk9OLU5MUy0xJAotCi0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9JSnBhUGxhdGZvcm1VaS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvSUpwYVBsYXRmb3JtVWkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdmY2IxOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9JSnBhUGxhdGZvcm1VaS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSUpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuSUpwYURldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3RydWN0dXJlLklKcGFTdHJ1Y3R1cmVQcm92aWRlcjsKLQotcHVibGljIGludGVyZmFjZSBJSnBhUGxhdGZvcm1VaQotewotCUNvbGxlY3Rpb248SUpwYVN0cnVjdHVyZVByb3ZpZGVyPiBzdHJ1Y3R1cmVQcm92aWRlcnMoKTsKLQkKLQlDb2xsZWN0aW9uPElKcGFEZXRhaWxzUHJvdmlkZXI+IGRldGFpbHNQcm92aWRlcnMoKTsKLQkKLQl2b2lkIGdlbmVyYXRlRERMKElKcGFQcm9qZWN0IHByb2plY3QsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbik7Ci0JCi0Jdm9pZCBnZW5lcmF0ZUVudGl0aWVzKElKcGFQcm9qZWN0IHByb2plY3QsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbik7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9KcGFDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvSnBhQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhiOTM3My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9KcGFDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuQ29tcGxldGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuamF2YS5Db250ZW50QXNzaXN0SW52b2NhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuamF2YS5JSmF2YUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmphdmEuSmF2YUNvbnRlbnRBc3Npc3RJbnZvY2F0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklKcGFGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkpwdENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLkpwYUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLXB1YmxpYyBjbGFzcyBKcGFDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlciBpbXBsZW1lbnRzIElKYXZhQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIgewotCi0JcHVibGljIEpwYUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNlc3Npb25TdGFydGVkKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIExpc3QgY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoQ29udGVudEFzc2lzdEludm9jYXRpb25Db250ZXh0IGNvbnRleHQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlyZXR1cm4gKGNvbnRleHQgaW5zdGFuY2VvZiBKYXZhQ29udGVudEFzc2lzdEludm9jYXRpb25Db250ZXh0KSA/Ci0JCQl0aGlzLmNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKChKYXZhQ29udGVudEFzc2lzdEludm9jYXRpb25Db250ZXh0KSBjb250ZXh0KQotCQk6Ci0JCQlDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8SUNvbXBsZXRpb25Qcm9wb3NhbD4gY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoSmF2YUNvbnRlbnRBc3Npc3RJbnZvY2F0aW9uQ29udGV4dCBjb250ZXh0KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gdGhpcy5jb21wdXRlQ29tcGxldGlvblByb3Bvc2Fsc18oY29udGV4dCk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PElDb21wbGV0aW9uUHJvcG9zYWw+IGNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzXyhKYXZhQ29udGVudEFzc2lzdEludm9jYXRpb25Db250ZXh0IGNvbnRleHQpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY29udGV4dC5nZXRDb21waWxhdGlvblVuaXQoKTsKLQkJaWYgKGN1ID09IG51bGwpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQkJfQotCi0JCUlKcGFGaWxlIGpwYUZpbGUgPSBKcHRDb3JlUGx1Z2luLmdldEpwYUZpbGUoKElGaWxlKSBjdS5nZXRDb3JyZXNwb25kaW5nUmVzb3VyY2UoKSk7Ci0JCWlmIChqcGFGaWxlID09IG51bGwpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQkJfQotCi0JCUpwYUNvbXBpbGF0aW9uVW5pdCBqcGFDVSA9IChKcGFDb21waWxhdGlvblVuaXQpIGpwYUZpbGUuZ2V0Q29udGVudCgpOwotCQlDb21wbGV0aW9uQ29udGV4dCBjYyA9IGNvbnRleHQuZ2V0Q29yZUNvbnRleHQoKTsKLQotCQkvLyB0aGUgY29udGV4dCdzICJ0b2tlbiIgaXMgcmVhbGx5IGEgc29ydCBvZiAicHJlZml4IiAtIGl0IGRvZXMgTk9UCi0JCS8vIGNvcnJlc3BvbmQgdG8gdGhlICJzdGFydCIgYW5kICJlbmQiIHdlIGdldCBiZWxvdy4uLiAKLQkJY2hhcltdIHByZWZpeCA9IGNjLmdldFRva2VuKCk7Ci0JCUZpbHRlcjxTdHJpbmc+IGZpbHRlciA9ICgocHJlZml4ID09IG51bGwpID8gRmlsdGVyLk51bGwuPFN0cmluZz5pbnN0YW5jZSgpIDogbmV3IElnbm9yZUNhc2VQcmVmaXhGaWx0ZXIocHJlZml4KSk7Ci0JCS8vIHRoZSB0b2tlbiAic3RhcnQiIGlzIHRoZSBvZmZzZXQgb2YgdGhlIHRva2VuJ3MgZmlyc3QgY2hhcmFjdGVyCi0JCWludCB0b2tlblN0YXJ0ID0gY2MuZ2V0VG9rZW5TdGFydCgpOwotCQkvLyB0aGUgdG9rZW4gImVuZCIgaXMgdGhlIG9mZnNldCBvZiB0aGUgdG9rZW4ncyBsYXN0IGNoYXJhY3RlciAoeXVrKQotCQlpbnQgdG9rZW5FbmQgPSBjYy5nZXRUb2tlbkVuZCgpOwotCi0vLwkJU3lzdGVtLm91dC5wcmludGxuKCJwcmVmaXg6ICIgKyBuZXcgU3RyaW5nKHByZWZpeCkpOwotLy8JCVN5c3RlbS5vdXQucHJpbnRsbigidG9rZW4gc3RhcnQ6ICIgKyB0b2tlblN0YXJ0KTsKLS8vCQlTeXN0ZW0ub3V0LnByaW50bG4oInRva2VuIGVuZDogIiArIHRva2VuRW5kKTsKLS8vCQlTdHJpbmcgc291cmNlID0gY3UuZ2V0U291cmNlKCk7Ci0vLwkJU3RyaW5nIHRva2VuID0gc291cmNlLnN1YnN0cmluZyh0b2tlblN0YXJ0LCB0b2tlbkVuZCArIDEpOwotLy8JCVN5c3RlbS5vdXQucHJpbnRsbigidG9rZW46ID0+IiArIHRva2VuICsgIjw9Iik7Ci0vLwkJU3RyaW5nIHNuaXBwZXQgPSBzb3VyY2Uuc3Vic3RyaW5nKE1hdGgubWF4KDAsIHRva2VuU3RhcnQgLSAyMCksIE1hdGgubWluKHNvdXJjZS5sZW5ndGgoKSwgdG9rZW5FbmQgKyAyMSkpOwotLy8JCVN5c3RlbS5vdXQucHJpbnRsbigic3Vycm91bmRpbmcgc25pcHBldDogPT4iICsgc25pcHBldCArICI8PSIpOwotCi0JCUxpc3Q8SUNvbXBsZXRpb25Qcm9wb3NhbD4gcHJvcG9zYWxzID0gbmV3IEFycmF5TGlzdDxJQ29tcGxldGlvblByb3Bvc2FsPigpOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0ganBhQ1UuY2FuZGlkYXRlVmFsdWVzRm9yKGNvbnRleHQuZ2V0SW52b2NhdGlvbk9mZnNldCgpLCBmaWx0ZXIpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCVN0cmluZyBzID0gc3RyZWFtLm5leHQoKTsKLQkJCXByb3Bvc2Fscy5hZGQobmV3IENvbXBsZXRpb25Qcm9wb3NhbChzLCB0b2tlblN0YXJ0LCB0b2tlbkVuZCAtIHRva2VuU3RhcnQgKyAxLCBzLmxlbmd0aCgpKSk7Ci0JCX0KLQkJcmV0dXJuIHByb3Bvc2FsczsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgTGlzdCBjb21wdXRlQ29udGV4dEluZm9ybWF0aW9uKENvbnRlbnRBc3Npc3RJbnZvY2F0aW9uQ29udGV4dCBjb250ZXh0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNlc3Npb25FbmRlZCgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIElnbm9yZUNhc2VQcmVmaXhGaWx0ZXIgaW1wbGVtZW50cyBGaWx0ZXI8U3RyaW5nPiB7Ci0JCXByaXZhdGUgZmluYWwgY2hhcltdIHByZWZpeDsKLQkJSWdub3JlQ2FzZVByZWZpeEZpbHRlcihjaGFyW10gcHJlZml4KSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5wcmVmaXggPSBwcmVmaXg7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KFN0cmluZyBzKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuc3RyaW5nU3RhcnRzV2l0aElnbm9yZUNhc2Uocy50b0NoYXJBcnJheSgpLCBwcmVmaXgpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9KcHRVaUljb25zLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9KcHRVaUljb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZGQ1MjUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvSnB0VWlJY29ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCi0gKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWw7Ci0KLXB1YmxpYyBjbGFzcyBKcHRVaUljb25zCi17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlBBX1dJWl9CQU5ORVIgPSAiZnVsbC93aXpiYW4vanBhX2ZhY2V0X3dpemJhbiI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL0pwdFVpTWVzc2FnZXMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL0pwdFVpTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RjMTQyZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9KcHRVaU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAgIAotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgSnB0VWlNZXNzYWdlcyBleHRlbmRzIE5MUyAKLXsJCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gImpwdF91aSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlzdGF0aWMgewotCQkvLyBpbml0aWFsaXplIHJlc291cmNlIGJ1bmRsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBKcHRVaU1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkUGVyc2lzdGVudEF0dHJpYnV0ZURpYWxvZ190aXRsZTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRQZXJzaXN0ZW50QXR0cmlidXRlRGlhbG9nX2F0dHJpYnV0ZUxhYmVsOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFBlcnNpc3RlbnRBdHRyaWJ1dGVEaWFsb2dfbWFwcGluZ0xhYmVsOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFBlcnNpc3RlbnRBdHRyaWJ1dGVEaWFsb2dfbm9NYXBwaW5nS2V5RXJyb3I7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkUGVyc2lzdGVudENsYXNzRGlhbG9nX3RpdGxlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFBlcnNpc3RlbnRDbGFzc0RpYWxvZ19jbGFzc0xhYmVsOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFBlcnNpc3RlbnRDbGFzc0RpYWxvZ19jbGFzc0RpYWxvZ190aXRsZTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRQZXJzaXN0ZW50Q2xhc3NEaWFsb2dfY2xhc3NEaWFsb2dfbWVzc2FnZTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRQZXJzaXN0ZW50Q2xhc3NEaWFsb2dfbWFwcGluZ0xhYmVsOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFBlcnNpc3RlbnRDbGFzc0RpYWxvZ19ub0NsYXNzRXJyb3I7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkUGVyc2lzdGVudENsYXNzRGlhbG9nX2R1cGxpY2F0ZUNsYXNzV2FybmluZzsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRQZXJzaXN0ZW50Q2xhc3NEaWFsb2dfY2xhc3NOb3RGb3VuZFdhcm5pbmc7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkUGVyc2lzdGVudENsYXNzRGlhbG9nX25vTWFwcGluZ0tleUVycm9yOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERhdGFiYXNlUmVjb25uZWN0V2l6YXJkUGFnZV9kYXRhYmFzZTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEYXRhYmFzZVJlY29ubmVjdFdpemFyZFBhZ2VfZGF0YWJhc2VDb25uZWN0aW9uOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERhdGFiYXNlUmVjb25uZWN0V2l6YXJkUGFnZV9yZWNvbm5lY3RUb0RhdGFiYXNlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERhdGFiYXNlUmVjb25uZWN0V2l6YXJkUGFnZV9jb25uZWN0aW9uOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERhdGFiYXNlUmVjb25uZWN0V2l6YXJkUGFnZV9zY2hlbWE7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGF0YWJhc2VSZWNvbm5lY3RXaXphcmRQYWdlX3NjaGVtYUluZm87Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGF0YWJhc2VSZWNvbm5lY3RXaXphcmRQYWdlX2FkZENvbm5lY3Rpb25MaW5rOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGF0YWJhc2VSZWNvbm5lY3RXaXphcmRQYWdlX3JlY29ubmVjdExpbms7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmFsX2Jyb3dzZTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmFsX2Rlc2VsZWN0QWxsOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYWxfc2VsZWN0QWxsOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRW50aXRpZXNXaXphcmRfZ2VuZXJhdGVFbnRpdGllczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRW50aXRpZXNXaXphcmRQYWdlX2Nob29zZUVudGl0eVRhYmxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZFBhZ2VfZ2VuZXJhdGVFbnRpdGllczsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkUGFnZV9zeW5jaHJvbml6ZUNsYXNzZXM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkUGFnZV90YWJsZXM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkUGFnZV90YWJsZUNvbHVtbjsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkUGFnZV9lbnRpdHlOYW1lQ29sdW1uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJpY1BsYXRmb3JtVWlEaWFsb2dfbm90U3VwcG9ydGVkTWVzc2FnZVRpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJpY1BsYXRmb3JtVWlEaWFsb2dfbm90U3VwcG9ydGVkTWVzc2FnZVRleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFQcmVmZXJlbmNlUGFnZV9kZWZhdWx0SnBhTGliOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYVByZWZlcmVuY2VQYWdlX3VzZXJMaWJzTGluazsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFQcmVmZXJlbmNlUGFnZV9pbnZhbGlkSnBhTGliOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYVN0cnVjdHVyZVZpZXdfdmlld05vdEF2YWlsYWJsZTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFTdHJ1Y3R1cmVWaWV3X2xpbmtXaXRoRWRpdG9yVGV4dDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFTdHJ1Y3R1cmVWaWV3X2xpbmtXaXRoRWRpdG9yRGVzYzsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFTdHJ1Y3R1cmVWaWV3X2xpbmtXaXRoRWRpdG9yVG9vbHRpcDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFEZXRhaWxzVmlld192aWV3Tm90QXZhaWxhYmxlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0pwYVByb2plY3RXaXphcmRfdGl0bGU7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3SnBhUHJvamVjdFdpemFyZF9maXJzdFBhZ2VfdGl0bGU7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3SnBhUHJvamVjdFdpemFyZF9maXJzdFBhZ2VfZGVzY3JpcHRpb247Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSnBhRmFjZXRXaXphcmRQYWdlX3RpdGxlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYUZhY2V0V2l6YXJkUGFnZV9kZXNjcmlwdGlvbjsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFGYWNldFdpemFyZFBhZ2VfcGxhdGZvcm1MYWJlbDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFGYWNldFdpemFyZFBhZ2VfY29ubmVjdGlvbkxhYmVsOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYUZhY2V0V2l6YXJkUGFnZV9jb25uZWN0aW9uTGluazsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFGYWNldFdpemFyZFBhZ2VfanBhSW1wbGVtZW50YXRpb25MYWJlbDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFGYWNldFdpemFyZFBhZ2VfdXNlclNlcnZlckxpYkxhYmVsOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYUZhY2V0V2l6YXJkUGFnZV9zcGVjaWZ5TGliTGFiZWw7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSnBhRmFjZXRXaXphcmRQYWdlX2pwYVByZWZzTGluazsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFGYWNldFdpemFyZFBhZ2VfdXNlckxpYnNMaW5rOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYUZhY2V0V2l6YXJkUGFnZV9wZXJzaXN0ZW50Q2xhc3NNYW5hZ2VtZW50TGFiZWw7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSnBhRmFjZXRXaXphcmRQYWdlX2Rpc2NvdmVyQ2xhc3Nlc0J1dHRvbjsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFGYWNldFdpemFyZFBhZ2VfbGlzdENsYXNzZXNCdXR0b247Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSnBhRmFjZXRXaXphcmRQYWdlX2NyZWF0ZU9ybVhtbEJ1dHRvbjsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW50QXR0cmlidXRlUGFnZV9tYXBBczsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW50VHlwZVBhZ2VfbWFwQXM7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3ZlcndyaXRlQ29uZmlybWVyRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3ZlcndyaXRlQ29uZmlybWVyRGlhbG9nX3RleHQ7Ci0KLQkKLQlwcml2YXRlIEpwdFVpTWVzc2FnZXMoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL0pwdFVpUGx1Z2luLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9KcHRVaVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2U2OTdjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL0pwdFVpUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqICBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiAgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiAgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBKcHRVaVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4KLXsKLQlwcml2YXRlIHN0YXRpYyBKcHRVaVBsdWdpbiBJTlNUQU5DRTsKLQkKLQkvKioKLQkgKiBUaGUgcGx1Zy1pbiBpZGVudGlmaWVyIG9mIEpQQSBVSSBzdXBwb3J0Ci0JICogKHZhbHVlIDxjb2RlPiJvcmcuZWNsaXBzZS5qcHQudWkiPC9jb2RlPikuCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpwdC51aSI7ICAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2luZ2xldG9uIFBsdWdpbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSnB0VWlQbHVnaW4gZ2V0UGx1Z2luKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coSVN0YXR1cyBzdGF0dXMpIHsKLSAgICAgICAgSU5TVEFOQ0UuZ2V0TG9nKCkubG9nKHN0YXR1cyk7Ci0gICAgfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coU3RyaW5nIG1zZykgewotICAgICAgICBsb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIElTdGF0dXMuT0ssIG1zZywgbnVsbCkpOwotICAgIH0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFRocm93YWJsZSB0aHJvd2FibGUpIHsKLQkJbG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCBJU3RhdHVzLk9LLCB0aHJvd2FibGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCB0aHJvd2FibGUpKTsKLQl9Ci0JCi0JCi0JcHVibGljIEpwdFVpUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlJTlNUQU5DRSA9IHRoaXM7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgZ2V0cyBhIC5naWYgZnJvbSB0aGUgaWNvbnMgZm9sZGVyLgotCSAqLwotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBrZXkpIHsKLQkJaWYgKCEga2V5LnN0YXJ0c1dpdGgoImljb25zLyIpKSB7Ci0JCQlrZXkgPSAiaWNvbnMvIiArIGtleTsKLQkJfQotCQlpZiAoISBrZXkuZW5kc1dpdGgoIi5naWYiKSkgewotCQkJa2V5ID0ga2V5ICsgIi5naWYiOwotCQl9Ci0JCXJldHVybiBpbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKFBMVUdJTl9JRCwga2V5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9QbGF0Zm9ybVJlZ2lzdHJ5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9QbGF0Zm9ybVJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNjE2ZjIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvUGxhdGZvcm1SZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqICB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqICBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5Db21wb3NpdGVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25JdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIFBsYXRmb3JtUmVnaXN0cnkgCi17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBQbGF0Zm9ybVJlZ2lzdHJ5IElOU1RBTkNFID0gbmV3IFBsYXRmb3JtUmVnaXN0cnkoKTsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX0lEID0gCi0JCSJqcGFQbGF0Zm9ybSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxfUExBVEZPUk0gPQotCQkianBhUGxhdGZvcm0iOyAvLyROT04tTkxTLTEkCQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUX0lEID0KLQkJImlkIjsgLy8kTk9OLU5MUy0xJAkKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVF9DTEFTUyA9Ci0JCSJjbGFzcyI7IC8vJE5PTi1OTFMtMSQJCi0JCQotCS8vIGtleTogU3RyaW5nIGpwYVBsYXRmb3JtIGlkICB2YWx1ZTogSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNsYXNzIGRlc2NyaXB0b3IKLQlwcml2YXRlIE1hcDxTdHJpbmcsIElDb25maWd1cmF0aW9uRWxlbWVudD4ganBhUGxhdGZvcm1zOwotCQotCQotCS8qIChub24gSmF2YSBkb2MpCi0JICogcmVzdHJpY3QgYWNjZXNzCi0JICovCi0JcHJpdmF0ZSBQbGF0Zm9ybVJlZ2lzdHJ5KCkgewotCQlidWlsZEpwYVBsYXRmb3JtcygpOwotCX0KLQkKLQkKLQlwcml2YXRlIHZvaWQgYnVpbGRKcGFQbGF0Zm9ybXMoKSB7Ci0JCXRoaXMuanBhUGxhdGZvcm1zID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJQ29uZmlndXJhdGlvbkVsZW1lbnQ+KCk7Ci0JCQotCQlmb3IgKEl0ZXJhdG9yIHN0cmVhbSA9IGFsbENvbmZpZ0VsZW1lbnRzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJYnVpbGRKcGFQbGF0Zm9ybSgoSUNvbmZpZ3VyYXRpb25FbGVtZW50KSBzdHJlYW0ubmV4dCgpKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgYnVpbGRKcGFQbGF0Zm9ybShJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCkgewotCQlpZiAoISBjb25maWdFbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoRUxfUExBVEZPUk0pKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCVN0cmluZyBwbGF0Zm9ybUlkID0gY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRfSUQpOwotCQlTdHJpbmcgcGxhdGZvcm1DbGFzcyA9IGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKEFUX0NMQVNTKTsKLQkJCi0JCWlmICgocGxhdGZvcm1JZCA9PSBudWxsKSB8fCAocGxhdGZvcm1DbGFzcyA9PSBudWxsKSkgewotCQkJaWYgKHBsYXRmb3JtSWQgPT0gbnVsbCkgewotCQkJCXJlcG9ydE1pc3NpbmdBdHRyaWJ1dGUoY29uZmlnRWxlbWVudCwgQVRfSUQpOwotCQkJfQotCQkJaWYgKHBsYXRmb3JtQ2xhc3MgPT0gbnVsbCkgewotCQkJCXJlcG9ydE1pc3NpbmdBdHRyaWJ1dGUoY29uZmlnRWxlbWVudCwgQVRfQ0xBU1MpOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZiAoanBhUGxhdGZvcm1zLmNvbnRhaW5zS2V5KHBsYXRmb3JtSWQpKSB7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgb3RoZXJDb25maWdFbGVtZW50ID0ganBhUGxhdGZvcm1zLmdldChwbGF0Zm9ybUlkKTsKLQkJCXJlcG9ydER1cGxpY2F0ZVBsYXRmb3JtKGNvbmZpZ0VsZW1lbnQsIG90aGVyQ29uZmlnRWxlbWVudCk7Ci0JCX0KLQkJCi0JCWpwYVBsYXRmb3Jtcy5wdXQocGxhdGZvcm1JZCwgY29uZmlnRWxlbWVudCk7Ci0JfQotCQotCXB1YmxpYyBJSnBhUGxhdGZvcm1VaSBnZXRKcGFQbGF0Zm9ybShTdHJpbmcgdmVuZG9ySWQpIHsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IHJlZ2lzdGVyZWRDb25maWdFbGVtZW50ID0gdGhpcy5qcGFQbGF0Zm9ybXMuZ2V0KHZlbmRvcklkKTsKLQkJCi0JCWlmIChyZWdpc3RlcmVkQ29uZmlnRWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJdHJ5IHsKLQkJCXJldHVybiAoSUpwYVBsYXRmb3JtVWkpIHJlZ2lzdGVyZWRDb25maWdFbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQVRfQ0xBU1MpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQlyZXBvcnRGYWlsZWRJbnN0YW50aWF0aW9uKHJlZ2lzdGVyZWRDb25maWdFbGVtZW50KTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCXByaXZhdGUgSXRlcmF0b3IgYWxsQ29uZmlnRWxlbWVudHMoKSB7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IAotCQkJcmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoSnB0VWlQbHVnaW4uUExVR0lOX0lELCBFWFRFTlNJT05fSUQpOwotCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IGV4dGVuc2lvblBvaW50LmdldEV4dGVuc2lvbnMoKTsKLQkJCi0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmF0b3IoCi0JCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3IoQ29sbGVjdGlvblRvb2xzLml0ZXJhdG9yKGV4dGVuc2lvbnMpKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgT2JqZWN0IHRyYW5zZm9ybShPYmplY3QgbmV4dCkgewotCQkJCQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5pdGVyYXRvcigoKElFeHRlbnNpb24pIG5leHQpLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpKTsKLQkJCQkJfQotCQkJCX0KLQkJCSk7Ci0JfQotCQotCS8vIFRPRE8gZXh0ZXJuYWxpemUgc3RyaW5ncwotCXByaXZhdGUgdm9pZCByZXBvcnRNaXNzaW5nQXR0cmlidXRlKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50LCBTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQlTdHJpbmcgbWVzc2FnZSA9IAotCQkJIkFuIGV4dGVuc2lvbiBlbGVtZW50IFwiIgotCQkJKyBjb25maWdFbGVtZW50LmdldE5hbWUoKQotCQkJKyAiXCIgaW4gcGx1Z2luIFwiIgotCQkJKyBjb25maWdFbGVtZW50LmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpCi0JCQkrICJcIiBpcyBtaXNzaW5nIGEgcmVxdWlyZWQgYXR0cmlidXRlIFwiIgotCQkJKyBhdHRyaWJ1dGVOYW1lCi0JCQkrICJcIi4iOwotCQlKcHRVaVBsdWdpbi5sb2cobWVzc2FnZSk7Ci0JfQotCQotCS8vIFRPRE8gZXh0ZXJuYWxpemUgc3RyaW5ncwotCXByaXZhdGUgdm9pZCByZXBvcnREdXBsaWNhdGVQbGF0Zm9ybSgKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBvbmVDb25maWdFbGVtZW50LCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgb3RoZXJDb25maWdFbGVtZW50KSB7Ci0JCVN0cmluZyBtZXNzYWdlID0KLQkJCSJUaGUgcGx1Z2lucyBcIiIKLQkJCSsgb25lQ29uZmlnRWxlbWVudC5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKQotCQkJKyAiXCIgYW5kIFwiIgotCQkJKyBvdGhlckNvbmZpZ0VsZW1lbnQuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCkKLQkJCSsgIlwiIGhhdmUgcmVnaXN0ZXJlZCBhIGR1cGxpY2F0ZSBhdHRyaWJ1dGUgXCJpZFwiICIKLQkJCSsgImZvciB0aGUgZXh0ZW5zaW9uIGVsZW1lbnQgXCJqcGFWZW5kb3JcIi4iOwotCQlKcHRVaVBsdWdpbi5sb2cobWVzc2FnZSk7Ci0JfQotCQkKLQkvLyBUT0RPIGV4dGVybmFsaXplIHN0cmluZ3MKLQlwcml2YXRlIHZvaWQgcmVwb3J0RmFpbGVkSW5zdGFudGlhdGlvbihJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCkgewotCQlTdHJpbmcgbWVzc2FnZSA9Ci0JCQkiQ291bGQgbm90IGluc3RhbnRpYXRlIHRoZSBjbGFzcyBcIiIKLQkJCSsgY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRfQ0xBU1MpCi0JCQkrICJcIiBmb3IgdGhlIGV4dGVuc2lvbiBlbGVtZW50IFwiIgotCQkJKyBjb25maWdFbGVtZW50LmdldE5hbWUoKQotCQkJKyAiXCIgaW4gdGhlIHBsdWdpbiBcIiIKLQkJCSsgY29uZmlnRWxlbWVudC5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKQotCQkJKyAiXCIuIjsKLQkJSnB0VWlQbHVnaW4ubG9nKG1lc3NhZ2UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2FjdGlvbnMvQWRkUGVyc2lzdGVudEF0dHJpYnV0ZVRvWG1sQWN0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9hY3Rpb25zL0FkZFBlcnNpc3RlbnRBdHRyaWJ1dGVUb1htbEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzhlZmQ5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2FjdGlvbnMvQWRkUGVyc2lzdGVudEF0dHJpYnV0ZVRvWG1sQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5vcm0uWG1sUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkRlbGVnYXRlOwotCi1wdWJsaWMgY2xhc3MgQWRkUGVyc2lzdGVudEF0dHJpYnV0ZVRvWG1sQWN0aW9uIGV4dGVuZHMgQWN0aW9uRGVsZWdhdGUKLXsJCi0JCi0JcHJpdmF0ZSBJU2VsZWN0aW9uIHNlbGVjdGlvbjsKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzdXBlci5zZWxlY3Rpb25DaGFuZ2VkKGFjdGlvbiwgc2VsZWN0aW9uKTsKLQkJdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlpZiAodGhpcy5zZWxlY3Rpb24gaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yPFhtbFBlcnNpc3RlbnRBdHRyaWJ1dGU+IGkgPSAoKFN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgewotCQkJCVhtbFBlcnNpc3RlbnRBdHRyaWJ1dGUgeG1sUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGkubmV4dCgpOwotCQkJCXhtbFBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0VmlydHVhbChmYWxzZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2FjdGlvbnMvQWRkUGVyc2lzdGVudEF0dHJpYnV0ZVRvWG1sQW5kTWFwQWN0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9hY3Rpb25zL0FkZFBlcnNpc3RlbnRBdHRyaWJ1dGVUb1htbEFuZE1hcEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzVhOTZkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2FjdGlvbnMvQWRkUGVyc2lzdGVudEF0dHJpYnV0ZVRvWG1sQW5kTWFwQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50Lm9ybS5YbWxQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kaWFsb2dzLkFkZFBlcnNpc3RlbnRBdHRyaWJ1dGVUb1htbEFuZE1hcERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JT2JqZWN0QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci0KLXB1YmxpYyBjbGFzcyBBZGRQZXJzaXN0ZW50QXR0cmlidXRlVG9YbWxBbmRNYXBBY3Rpb24KLQlpbXBsZW1lbnRzIElPYmplY3RBY3Rpb25EZWxlZ2F0ZQotewotCXByaXZhdGUgU2hlbGwgc2hlbGw7Ci0JCi0JcHJpdmF0ZSBYbWxQZXJzaXN0ZW50QXR0cmlidXRlIHVubWFwcGVkWG1sQXR0cmlidXRlOwotCQotCQotCXB1YmxpYyBBZGRQZXJzaXN0ZW50QXR0cmlidXRlVG9YbWxBbmRNYXBBY3Rpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlBZGRQZXJzaXN0ZW50QXR0cmlidXRlVG9YbWxBbmRNYXBEaWFsb2cgZGlhbG9nID0gbmV3IEFkZFBlcnNpc3RlbnRBdHRyaWJ1dGVUb1htbEFuZE1hcERpYWxvZyhzaGVsbCwgdW5tYXBwZWRYbWxBdHRyaWJ1dGUpOwotCQkKLQkJZGlhbG9nLmNyZWF0ZSgpOwotCQlkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXVubWFwcGVkWG1sQXR0cmlidXRlID0gKFhtbFBlcnNpc3RlbnRBdHRyaWJ1dGUpICgoU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlUGFydChJQWN0aW9uIGFjdGlvbiwgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydCkgewotCQlzaGVsbCA9IHRhcmdldFBhcnQuZ2V0U2l0ZSgpLmdldFNoZWxsKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvYWN0aW9ucy9BZGRQZXJzaXN0ZW50Q2xhc3NBY3Rpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2FjdGlvbnMvQWRkUGVyc2lzdGVudENsYXNzQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzYjRkZWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvYWN0aW9ucy9BZGRQZXJzaXN0ZW50Q2xhc3NBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAotICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQub3JtLkVudGl0eU1hcHBpbmdzSW50ZXJuYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRpYWxvZ3MuQWRkUGVyc2lzdGVudENsYXNzRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklPYmplY3RBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLQotcHVibGljIGNsYXNzIEFkZFBlcnNpc3RlbnRDbGFzc0FjdGlvbgotCWltcGxlbWVudHMgSU9iamVjdEFjdGlvbkRlbGVnYXRlCi17Ci0JcHJpdmF0ZSBTaGVsbCBzaGVsbDsKLQkKLQlwcml2YXRlIEVudGl0eU1hcHBpbmdzSW50ZXJuYWwgZW50aXR5TWFwcGluZ3M7Ci0JCi0JCi0JcHVibGljIEFkZFBlcnNpc3RlbnRDbGFzc0FjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCUFkZFBlcnNpc3RlbnRDbGFzc0RpYWxvZyBkaWFsb2cgPSBuZXcgQWRkUGVyc2lzdGVudENsYXNzRGlhbG9nKHNoZWxsLCBlbnRpdHlNYXBwaW5ncyk7Ci0JCQotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWRpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJZW50aXR5TWFwcGluZ3MgPSAoRW50aXR5TWFwcGluZ3NJbnRlcm5hbCkgKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXJ0KElBY3Rpb24gYWN0aW9uLCBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0KSB7Ci0JCXNoZWxsID0gdGFyZ2V0UGFydC5nZXRTaXRlKCkuZ2V0U2hlbGwoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9hY3Rpb25zL0dlbmVyYXRlRERMQWN0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9hY3Rpb25zL0dlbmVyYXRlRERMQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiN2E0MTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvYWN0aW9ucy9HZW5lcmF0ZURETEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklKcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5JSnBhUGxhdGZvcm1VaTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuUGxhdGZvcm1SZWdpc3RyeTsKLQotLyoqCi0gKiAgR2VuZXJhdGVERExBY3Rpb24KLSAqLwotcHVibGljIGNsYXNzIEdlbmVyYXRlRERMQWN0aW9uIGV4dGVuZHMgUHJvamVjdEFjdGlvbiB7Ci0JCi0JcHVibGljIEdlbmVyYXRlRERMQWN0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGUoSUpwYVByb2plY3QgcHJvamVjdCkgewotICAgICAgICBTdHJpbmcgdmVuZG9ySWQgPSBwcm9qZWN0LmdldFBsYXRmb3JtKCkuZ2V0SWQoKTsKLQkJCi0gICAgICAgIHRoaXMuanBhUGxhdGZvcm1VSSh2ZW5kb3JJZCkuZ2VuZXJhdGVEREwocHJvamVjdCwgdGhpcy5nZXRDdXJyZW50U2VsZWN0aW9uKCkpOwotCX0KLQkKLQlwcml2YXRlIElKcGFQbGF0Zm9ybVVpIGpwYVBsYXRmb3JtVUkoU3RyaW5nIHZlbmRvcklkKSB7Ci0gICAgICAgIHJldHVybiBQbGF0Zm9ybVJlZ2lzdHJ5LklOU1RBTkNFLmdldEpwYVBsYXRmb3JtKHZlbmRvcklkKTsgCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9hY3Rpb25zL0dlbmVyYXRlRW50aXRpZXNBY3Rpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2FjdGlvbnMvR2VuZXJhdGVFbnRpdGllc0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTI1NzkxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2FjdGlvbnMvR2VuZXJhdGVFbnRpdGllc0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSUpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLklKcGFQbGF0Zm9ybVVpOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5QbGF0Zm9ybVJlZ2lzdHJ5OwotCi0vKioKLSAqICBHZW5lcmF0ZUVudGl0aWVzQWN0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmF0ZUVudGl0aWVzQWN0aW9uIGV4dGVuZHMgUHJvamVjdEFjdGlvbiB7Ci0JcHVibGljIEdlbmVyYXRlRW50aXRpZXNBY3Rpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZShJSnBhUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgICAgIFN0cmluZyB2ZW5kb3JJZCA9IHByb2plY3QuZ2V0UGxhdGZvcm0oKS5nZXRJZCgpOwotCQkKLSAgICAgICAgdGhpcy5qcGFQbGF0Zm9ybVVJKHZlbmRvcklkKS5nZW5lcmF0ZUVudGl0aWVzKHByb2plY3QsIHRoaXMuZ2V0Q3VycmVudFNlbGVjdGlvbigpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJSnBhUGxhdGZvcm1VaSBqcGFQbGF0Zm9ybVVJKFN0cmluZyB2ZW5kb3JJZCkgewotICAgICAgICByZXR1cm4gUGxhdGZvcm1SZWdpc3RyeS5JTlNUQU5DRS5nZXRKcGFQbGF0Zm9ybSh2ZW5kb3JJZCk7IAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvYWN0aW9ucy9QZXJzaXN0ZW50QXR0cmlidXRlQWN0aW9uRmlsdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9hY3Rpb25zL1BlcnNpc3RlbnRBdHRyaWJ1dGVBY3Rpb25GaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU2Mzk2Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9hY3Rpb25zL1BlcnNpc3RlbnRBdHRyaWJ1dGVBY3Rpb25GaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklNYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRmlsdGVyOwotCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVudEF0dHJpYnV0ZUFjdGlvbkZpbHRlciAKLQlpbXBsZW1lbnRzIElBY3Rpb25GaWx0ZXIKLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJU19NQVBQRUQgPSAiaXNNYXBwZWQiOwotCQotCQotCXB1YmxpYyBib29sZWFuIHRlc3RBdHRyaWJ1dGUoT2JqZWN0IHRhcmdldCwgU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotCQlpZiAoISBJU19NQVBQRUQuZXF1YWxzKG5hbWUpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCUJvb2xlYW4gYm9vbGVhblZhbHVlOwotCQlpZiAoInRydWUiLmVxdWFscyh2YWx1ZSkpIHsKLQkJCWJvb2xlYW5WYWx1ZSA9IHRydWU7Ci0JCX0KLQkJZWxzZSBpZiAoImZhbHNlIi5lcXVhbHModmFsdWUpKSB7Ci0JCQlib29sZWFuVmFsdWUgPSBmYWxzZTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJYm9vbGVhbiBtYXBwZWQgPSAoKElQZXJzaXN0ZW50QXR0cmlidXRlKSB0YXJnZXQpLm1hcHBpbmdLZXkoKSAhPSBJTWFwcGluZ0tleXMuTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JCXJldHVybiBtYXBwZWQgPT0gYm9vbGVhblZhbHVlOwotCX0KLQkKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZhY3RvcnkKLQkJaW1wbGVtZW50cyBJQWRhcHRlckZhY3RvcnkKLQl7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzW10gQURBUFRFUl9UWVBFUyA9IHsgSUFjdGlvbkZpbHRlci5jbGFzcyB9OwotCQkKLQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKGZpbmFsIE9iamVjdCBhZGFwdGFibGUsIGZpbmFsIENsYXNzIGFkYXB0ZXJUeXBlICkgewotCQkJaWYoIGFkYXB0ZXJUeXBlID09IElBY3Rpb25GaWx0ZXIuY2xhc3MgKSB7Ci0JCQkJcmV0dXJuIG5ldyBQZXJzaXN0ZW50QXR0cmlidXRlQWN0aW9uRmlsdGVyKCk7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JICAgIAotCQlwdWJsaWMgQ2xhc3NbXSBnZXRBZGFwdGVyTGlzdCgpIHsKLQkJCXJldHVybiBBREFQVEVSX1RZUEVTOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvYWN0aW9ucy9Qcm9qZWN0QWN0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9hY3Rpb25zL1Byb2plY3RBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRlNjU3ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9hY3Rpb25zL1Byb2plY3RBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSUpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSnB0Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU9iamVjdEFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotCi0vKioKLSAqIE92ZXJyaWRlIGFueSBvZiB0aGUgI2V4ZWN1dGUoKSBtZXRob2RzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJvamVjdEFjdGlvbiBpbXBsZW1lbnRzIElPYmplY3RBY3Rpb25EZWxlZ2F0ZSB7Ci0KLQlwcml2YXRlIElTZWxlY3Rpb24gY3VycmVudFNlbGVjdGlvbjsKLSAgICAKLQotCXB1YmxpYyBQcm9qZWN0QWN0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSU9iamVjdEFjdGlvbkRlbGVnYXRlI3NldEFjdGl2ZVBhcnQoSUFjdGlvbiwgSVdvcmtiZW5jaFBhcnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlUGFydChJQWN0aW9uIGFjdGlvbiwgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogQHNlZSBJQWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uLCBJU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0gICAgICAgIHRoaXMuY3VycmVudFNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRTZWxlY3Rpb24gZ2V0Q3VycmVudFNlbGVjdGlvbigpIHsKLQkJaWYgKHRoaXMuY3VycmVudFNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlyZXR1cm4gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0aGlzLmN1cnJlbnRTZWxlY3Rpb247Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgSUFjdGlvbkRlbGVnYXRlI3J1bihJQWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlpZiAodGhpcy5jdXJyZW50U2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCWZvciAoSXRlcmF0b3Igc3RyZWFtID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgdGhpcy5jdXJyZW50U2VsZWN0aW9uKS5pdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCQl0aGlzLmV4ZWN1dGUoc3RyZWFtLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKE9iamVjdCBzZWxlY3Rpb24pIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IHRoaXMucHJvamVjdEZyb21TZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJdGhpcy5leGVjdXRlKHByb2plY3QpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIElQcm9qZWN0IHByb2plY3RGcm9tU2VsZWN0aW9uKE9iamVjdCBzZWxlY3Rpb24pIHsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElQcm9qZWN0KSB7Ci0JCQlyZXR1cm4gKElQcm9qZWN0KSBzZWxlY3Rpb247Ci0JCX0KLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElKYXZhUHJvamVjdCkgewotCQkJcmV0dXJuICgoSUphdmFQcm9qZWN0KSBzZWxlY3Rpb24pLmdldFByb2plY3QoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKElQcm9qZWN0IHByb2plY3QpIHsKLQkJSUpwYVByb2plY3QganBhUHJvamVjdCA9IEpwdENvcmVQbHVnaW4uZ2V0SnBhUHJvamVjdChwcm9qZWN0KTsKLQkJaWYgKGpwYVByb2plY3QgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXRoaXMuZXhlY3V0ZShqcGFQcm9qZWN0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKElKcGFQcm9qZWN0IHByb2plY3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9hY3Rpb25zL1JlbW92ZVBlcnNpc3RlbnRBdHRyaWJ1dGVGcm9tWG1sQWN0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9hY3Rpb25zL1JlbW92ZVBlcnNpc3RlbnRBdHRyaWJ1dGVGcm9tWG1sQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyNjk0OWUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvYWN0aW9ucy9SZW1vdmVQZXJzaXN0ZW50QXR0cmlidXRlRnJvbVhtbEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQub3JtLlhtbFBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5vcm0uWG1sUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5vcm0uWG1sVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25EZWxlZ2F0ZTsKLQotcHVibGljIGNsYXNzIFJlbW92ZVBlcnNpc3RlbnRBdHRyaWJ1dGVGcm9tWG1sQWN0aW9uIGV4dGVuZHMgQWN0aW9uRGVsZWdhdGUKLXsJCi0JcHJpdmF0ZSBJU2VsZWN0aW9uIHNlbGVjdGlvbjsKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzdXBlci5zZWxlY3Rpb25DaGFuZ2VkKGFjdGlvbiwgc2VsZWN0aW9uKTsKLQkJdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlpZiAodGhpcy5zZWxlY3Rpb24gaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yPFhtbFBlcnNpc3RlbnRBdHRyaWJ1dGU+IGkgPSAoKFN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgewotCQkJCVhtbFBlcnNpc3RlbnRBdHRyaWJ1dGUgeG1sUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGkubmV4dCgpOwotCQkJCVhtbFBlcnNpc3RlbnRUeXBlIHhtbFBlcnNpc3RlbnRUeXBlID0gKChYbWxUeXBlTWFwcGluZykgeG1sUGVyc2lzdGVudEF0dHJpYnV0ZS50eXBlTWFwcGluZygpKS5nZXRQZXJzaXN0ZW50VHlwZSgpOwotCQkJCXhtbFBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZU1hcHBpbmdzKCkucmVtb3ZlKHhtbFBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvYWN0aW9ucy9SZW1vdmVQZXJzaXN0ZW50Q2xhc3NBY3Rpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2FjdGlvbnMvUmVtb3ZlUGVyc2lzdGVudENsYXNzQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkOGE1NWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvYWN0aW9ucy9SZW1vdmVQZXJzaXN0ZW50Q2xhc3NBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAotICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQub3JtLkVudGl0eU1hcHBpbmdzSW50ZXJuYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5vcm0uWG1sUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5vcm0uWG1sVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU9iamVjdEFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotCi1wdWJsaWMgY2xhc3MgUmVtb3ZlUGVyc2lzdGVudENsYXNzQWN0aW9uCi0JaW1wbGVtZW50cyBJT2JqZWN0QWN0aW9uRGVsZWdhdGUKLXsKLQlwcml2YXRlIFhtbFBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRDbGFzczsKLQkKLQkKLQlwdWJsaWMgUmVtb3ZlUGVyc2lzdGVudENsYXNzQWN0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJWG1sVHlwZU1hcHBpbmcgbWFwcGluZyA9IHBlcnNpc3RlbnRDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCSgoRW50aXR5TWFwcGluZ3NJbnRlcm5hbCkgbWFwcGluZy5nZXRFbnRpdHlNYXBwaW5ncygpKS5nZXRUeXBlTWFwcGluZ3MoKS5yZW1vdmUobWFwcGluZyk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXBlcnNpc3RlbnRDbGFzcyA9IChYbWxQZXJzaXN0ZW50VHlwZSkgKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXJ0KElBY3Rpb24gYWN0aW9uLCBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9hY3Rpb25zL1N5bmNocm9uaXplQ2xhc3Nlc0FjdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvYWN0aW9ucy9TeW5jaHJvbml6ZUNsYXNzZXNBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I0ZGI4ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9hY3Rpb25zL1N5bmNocm9uaXplQ2xhc3Nlc0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCi0gKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuc3luY2guU3luY2hyb25pemVDbGFzc2VzSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklPYmplY3RBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLQotcHVibGljIGNsYXNzIFN5bmNocm9uaXplQ2xhc3Nlc0FjdGlvbiAKLQlpbXBsZW1lbnRzIElPYmplY3RBY3Rpb25EZWxlZ2F0ZSAKLXsKLQlwcml2YXRlIElGaWxlIGZpbGU7Ci0JCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlUGFydChJQWN0aW9uIGFjdGlvbiwgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydCkgewotCQkvLyBuby1vcCBmb3Igbm93Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCVN5bmNocm9uaXplQ2xhc3Nlc0pvYiBqb2IgPSBuZXcgU3luY2hyb25pemVDbGFzc2VzSm9iKGZpbGUpOwotCQlqb2Iuc2NoZWR1bGUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkvLyBvbmx5IG9uZSBlbGVtZW50IGluIGFjdHVhbCBzZWxlY3Rpb24KLQkJZmlsZSA9IChJRmlsZSkgKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2FjdGlvbnMvWG1sUGVyc2lzdGVudEF0dHJpYnV0ZUFjdGlvbkZpbHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvYWN0aW9ucy9YbWxQZXJzaXN0ZW50QXR0cmlidXRlQWN0aW9uRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1ZjU3YTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvYWN0aW9ucy9YbWxQZXJzaXN0ZW50QXR0cmlidXRlQWN0aW9uRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50Lm9ybS5YbWxQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25GaWx0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBYbWxQZXJzaXN0ZW50QXR0cmlidXRlQWN0aW9uRmlsdGVyIAotCWV4dGVuZHMgUGVyc2lzdGVudEF0dHJpYnV0ZUFjdGlvbkZpbHRlcgotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElTX1ZJUlRVQUwgPSAiaXNWaXJ0dWFsIjsKLQkKLQkKLQlwdWJsaWMgYm9vbGVhbiB0ZXN0QXR0cmlidXRlKE9iamVjdCB0YXJnZXQsIFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKCEgSVNfVklSVFVBTC5lcXVhbHMobmFtZSkpIHsKLQkJCXJldHVybiBzdXBlci50ZXN0QXR0cmlidXRlKHRhcmdldCwgbmFtZSwgdmFsdWUpOwotCQl9Ci0JCQotCQlCb29sZWFuIGJvb2xlYW5WYWx1ZTsKLQkJaWYgKCJ0cnVlIi5lcXVhbHModmFsdWUpKSB7Ci0JCQlib29sZWFuVmFsdWUgPSB0cnVlOwotCQl9Ci0JCWVsc2UgaWYgKCJmYWxzZSIuZXF1YWxzKHZhbHVlKSkgewotCQkJYm9vbGVhblZhbHVlID0gZmFsc2U7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuICgoWG1sUGVyc2lzdGVudEF0dHJpYnV0ZSkgdGFyZ2V0KS5pc1ZpcnR1YWwoKSA9PSBib29sZWFuVmFsdWU7Ci0JfQotCQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmFjdG9yeQotCQlpbXBsZW1lbnRzIElBZGFwdGVyRmFjdG9yeQotCXsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3NbXSBBREFQVEVSX1RZUEVTID0geyBJQWN0aW9uRmlsdGVyLmNsYXNzIH07Ci0JCQotCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoZmluYWwgT2JqZWN0IGFkYXB0YWJsZSwgZmluYWwgQ2xhc3MgYWRhcHRlclR5cGUgKSB7Ci0JCQlpZiggYWRhcHRlclR5cGUgPT0gSUFjdGlvbkZpbHRlci5jbGFzcyApIHsKLQkJCQlyZXR1cm4gbmV3IFhtbFBlcnNpc3RlbnRBdHRyaWJ1dGVBY3Rpb25GaWx0ZXIoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQkgICAgCi0JCXB1YmxpYyBDbGFzc1tdIGdldEFkYXB0ZXJMaXN0KCkgewotCQkJcmV0dXJuIEFEQVBURVJfVFlQRVM7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Jhc2VKcGFDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQmFzZUpwYUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzNmZjhiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQmFzZUpwYUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZUpwYUNvbXBvc2l0ZSBleHRlbmRzIEJhc2VKcGFDb250cm9sbGVyCi0JaW1wbGVtZW50cyBJSnBhQ29tcG9zaXRlCi17Ci0JcHJpdmF0ZSBDb21wb3NpdGUgY29tcG9zaXRlOwotCQotCXB1YmxpYyBCYXNlSnBhQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSwgQ29tbWFuZFN0YWNrIHRoZUNvbW1hbmRTdGFjaywgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlzdXBlcihwYXJlbnQsIHN0eWxlLCB0aGVDb21tYW5kU3RhY2ssIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlwdWJsaWMgQmFzZUpwYUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBDb21tYW5kU3RhY2sgdGhlQ29tbWFuZFN0YWNrLFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJdGhpcyhwYXJlbnQsIFNXVC5OVUxMLCB0aGVDb21tYW5kU3RhY2ssIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBidWlsZFdpZGdldChDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJc3VwZXIuYnVpbGRXaWRnZXQocGFyZW50KTsKLQkJdGhpcy5jb21wb3NpdGUgPSBjcmVhdGVDb21wb3NpdGUocGFyZW50LCBzdHlsZSk7Ci0JCWluaXRpYWxpemVMYXlvdXQodGhpcy5jb21wb3NpdGUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJcmV0dXJuIHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVDb21wb3NpdGUocGFyZW50LCBzdHlsZSk7Ci0JfQotCQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbXBvc2l0ZSk7Ci0KLQlwdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCkgewotCQlyZXR1cm4gdGhpcy5jb21wb3NpdGU7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9CYXNlSnBhQ29udHJvbGxlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9CYXNlSnBhQ29udHJvbGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDQwMWViLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvQmFzZUpwYUNvbnRyb2xsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqICBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiAgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiAgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZUpwYUNvbnRyb2xsZXIgCi17Ci0JcHJvdGVjdGVkIENvbW1hbmRTdGFjayBjb21tYW5kU3RhY2s7Ci0JCi0JcHJvdGVjdGVkIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3Rvcnk7Ci0KLQkvL3B1dCBpbiB0aGUgcG9wdWxhdGluZyBmbGFnIHRvIHN0b3AgdGhlIGNpcmN1bGFyIHBvcHVsYXRpb24gb2YgdGhlIGVudGl0eSBuYW1lIGNvbWJvCi0JLy9wb3B1bGF0ZUVudGl0eU5hbWVDb21ibyBpcyBjYWxsaW5nIHNlbGVjdCgpIHdoaWNoIGNhdXNlcyBlbnRpdHlOYW1lQ29tYm9Nb2RpZmllZCgpIHRvIGJlIGNhbGxlZAotCS8vdGhpcyBzZXRzIHRoZSBuYW1lIGluIHRoZSBtb2RlbCB3aGljaCBzdGFydHMgdGhlIGNpcmNsZSBvdmVyIGFnYWluLiBXZSBzaG91bGQgcHJvYmFibHkKLQkvL3Nob3J0LWNpcmN1aXQgdGhpcyBkaWZmZXJlbnRseSwgbGlrZSBpbiB0aGUgZW1mIG1vZGVsLCBrZWVwIHRoZSBwcm9wZXJ0eSBjaGFuZ2UgZnJvbSBiZWluZyBmaXJlZCBpZiAKLQkvL2EgY2hhbmdlIGRpZCBub3QgYWN0dWFsbHkgb2NjdXIgLSBLRk0KLQlwcml2YXRlIGJvb2xlYW4gcG9wdWxhdGluZzsKLQkKLQkKLQlwdWJsaWMgQmFzZUpwYUNvbnRyb2xsZXIoQ29tcG9zaXRlIHBhcmVudCwgQ29tbWFuZFN0YWNrIHRoZUNvbW1hbmRTdGFjaywgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlzdXBlcigpOwotCQl0aGlzLndpZGdldEZhY3RvcnkgPSB3aWRnZXRGYWN0b3J5OwotCQlidWlsZFdpZGdldChwYXJlbnQpOwotCQl0aGlzLmNvbW1hbmRTdGFjayA9IHRoZUNvbW1hbmRTdGFjazsKLQl9Ci0JCi0JcHVibGljIEJhc2VKcGFDb250cm9sbGVyKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSwgQ29tbWFuZFN0YWNrIHRoZUNvbW1hbmRTdGFjaywgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlzdXBlcigpOwotCQl0aGlzLndpZGdldEZhY3RvcnkgPSB3aWRnZXRGYWN0b3J5OwotCQlidWlsZFdpZGdldChwYXJlbnQsIHN0eWxlKTsKLQkJdGhpcy5jb21tYW5kU3RhY2sgPSB0aGVDb21tYW5kU3RhY2s7Ci0JfQotCQotCQotCS8qKgotCSAqIE92ZXJyaWRlIHRoaXMgbWV0aG9kIGlmIHVzaW5nIHRoZSBjb25zdHJ1Y3RvciB3aXRob3V0IHRoZSBzdHlsZSBiaXQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBidWlsZFdpZGdldChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIG5vIG9wCi0JfQotCQotCS8qKgotCSAqIE92ZXJyaWRlIHRoaXMgbWV0aG9kIGlmIHVzaW5nIHRoZSBjb25zdHJ1Y3RvciB3aXRoIHRoZSBzdHlsZSBiaXQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBidWlsZFdpZGdldChDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJLy8gbm8gb3AKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGZyb20gb3V0c2lkZSB3aGVuIHNldHRpbmcgdGhlIG9iamVjdCBvZiBpbnRlcmVzdAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHBvcHVsYXRlKEVPYmplY3Qgb2JqKSB7Ci0JCWlmIChnZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdGhpcy5wb3B1bGF0aW5nID0gdHJ1ZTsKLQkJZGlzZW5nYWdlTGlzdGVuZXJzKCk7Ci0JCWRvUG9wdWxhdGUob2JqKTsKLQkJZW5nYWdlTGlzdGVuZXJzKCk7Ci0JCXRoaXMucG9wdWxhdGluZyA9IGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgKHBlcmhhcHMgaW50ZXJuYWxseSkgd2hlbiB0aGlzIG5lZWRzIHRvIHJlcG9wdWxhdGUgCi0JICogYnV0IHRoZSBvYmplY3Qgb2YgaW50ZXJlc3QgaGFzIG5vdCBjaGFuZ2VkCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgcG9wdWxhdGUoKSB7Ci0JCWlmIChnZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdGhpcy5wb3B1bGF0aW5nID0gdHJ1ZTsKLQkJZG9Qb3B1bGF0ZSgpOwotCQl0aGlzLnBvcHVsYXRpbmcgPSBmYWxzZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZG9Qb3B1bGF0ZShFT2JqZWN0IG9iaik7Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZG9Qb3B1bGF0ZSgpOwotCQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGVuZ2FnZUxpc3RlbmVycygpOwotCQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGRpc2VuZ2FnZUxpc3RlbmVycygpOwotCQotCXByb3RlY3RlZCBib29sZWFuIGlzUG9wdWxhdGluZygpIHsKLQkJcmV0dXJuIHRoaXMucG9wdWxhdGluZzsKLQl9Ci0JCi0JcHVibGljIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGdldFdpZGdldEZhY3RvcnkoKSB7Ci0JCXJldHVybiB0aGlzLndpZGdldEZhY3Rvcnk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWRpc2VuZ2FnZUxpc3RlbmVycygpOwotCX0KLQkKLQlwdWJsaWMgYWJzdHJhY3QgQ29udHJvbCBnZXRDb250cm9sKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Jhc2VKcGFEZXRhaWxzUGFnZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9CYXNlSnBhRGV0YWlsc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU3ZTEzZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0Jhc2VKcGFEZXRhaWxzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JSnBhQ29udGVudE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2Nyb2xsZWRGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZUpwYURldGFpbHNQYWdlIGV4dGVuZHMgQmFzZUpwYUNvbXBvc2l0ZSAKLQlpbXBsZW1lbnRzIElKcGFEZXRhaWxzUGFnZSAKLXsKLQlwcml2YXRlIENvbXBvc2l0ZSBjb250cm9sOwotCi0JcHVibGljIEJhc2VKcGFEZXRhaWxzUGFnZSgKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIENvbW1hbmRTdGFjayB0aGVDb21tYW5kU3RhY2ssIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJc3VwZXIocGFyZW50LCB0aGVDb21tYW5kU3RhY2ssIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCXB1YmxpYyBCYXNlSnBhRGV0YWlsc1BhZ2UoCi0JCQlDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUsIENvbW1hbmRTdGFjayB0aGVDb21tYW5kU3RhY2ssIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJc3VwZXIocGFyZW50LCBzdHlsZSwgdGhlQ29tbWFuZFN0YWNrLCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JLy91c2luZyB0aGlzIHRvIGdldCBhIFNjcm9sbCBiYXIgb24gdGhlIEpwYURldGFpbHNWaWV3Ci0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCVNjcm9sbGVkRm9ybSBzY3JvbGxlZEZvcm0gPSB0aGlzLndpZGdldEZhY3RvcnkuY3JlYXRlU2Nyb2xsZWRGb3JtKHBhcmVudCk7Ci0JCS8vTmVzdGluZyBhbm90aGVyIGNvbXBvc2l0ZSBiZWNhdXNlIGNvbWJvcyBvbiB0aGUgU2Nyb2xsZWRGb3JtIGRpZG4ndCBoYXZlIGEgYm9yZGVyCi0JCXNjcm9sbGVkRm9ybS5nZXRCb2R5KCkuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gc3VwZXIuY3JlYXRlQ29tcG9zaXRlKHNjcm9sbGVkRm9ybS5nZXRCb2R5KCksIHN0eWxlKTsKLQkJdGhpcy5jb250cm9sID0gc2Nyb2xsZWRGb3JtOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXB1YmxpYyBmaW5hbCB2b2lkIHBvcHVsYXRlKElKcGFDb250ZW50Tm9kZSBjb250ZW50Tm9kZSkgewotCQlzdXBlci5wb3B1bGF0ZShjb250ZW50Tm9kZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGRvUG9wdWxhdGUoRU9iamVjdCBvYmopIHsKLQkJZG9Qb3B1bGF0ZSgoSUpwYUNvbnRlbnROb2RlKSBvYmopOwotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBkb1BvcHVsYXRlKElKcGFDb250ZW50Tm9kZSBjb250ZW50Tm9kZSk7Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpIHsKLQkJcmV0dXJuIHRoaXMuY29udHJvbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvSUpwYUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9JSnBhQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkMDlmZWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9JSnBhQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAgICAgICAgCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElKcGFDb21wb3NpdGU8RSBleHRlbmRzIEVPYmplY3Q+IHsKLQotCXZvaWQgcG9wdWxhdGUoRSBtb2RlbCk7Ci0JCi0JQ29udHJvbCBnZXRDb250cm9sKCk7Ci0JCi0Jdm9pZCBkaXNwb3NlKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0lKcGFEZXRhaWxzUGFnZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9JSnBhRGV0YWlsc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU3OGQyZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0lKcGFEZXRhaWxzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSUpwYUNvbnRlbnROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUpwYURldGFpbHNQYWdlCi17Ci0JQ29udHJvbCBnZXRDb250cm9sKCk7Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGNvbnRlbnQgZm9yIHRoZSBwYWdlIGFuZCBwb3B1bGF0ZSB3aWRnZXRzCi0JICovCi0Jdm9pZCBwb3B1bGF0ZShJSnBhQ29udGVudE5vZGUgY29udGVudE5vZGUpOwotCQotCQotCS8qKgotCSAqIFBlcmZvcm0gYW55IG90aGVyIGRpc3Bvc2FsIG5lZWRlZAotCSAqLwotCXZvaWQgZGlzcG9zZSgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9JSnBhRGV0YWlsc1Byb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0lKcGFEZXRhaWxzUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFiMmY2Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL0lKcGFEZXRhaWxzUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqICB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqICBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLQotcHVibGljIGludGVyZmFjZSBJSnBhRGV0YWlsc1Byb3ZpZGVyIAotewotCi0JU3RyaW5nIGZpbGVDb250ZW50VHlwZSgpOwotCQotCS8qKgotCSAqIEJ1aWxkIGEgcHJvcGVydGllcyBwYWdlIGdpdmVuIHRoZSBwYXJlbnQgQ29tcG9zaXRlIGFuZCB0aGUKLQkgKiBjb250ZW50IG5vZGUgaWQuCi0JICogSXQgaXMgbGVnYWwgdG8gc2V0IHRoZSBsYXlvdXQgZm9yIHRoZSBnaXZlbiBDb21wb3NpdGUuCi0JICovCi0JSUpwYURldGFpbHNQYWdlIGJ1aWxkRGV0YWlsc1BhZ2UoQ29tcG9zaXRlIHBhcmVudENvbXBvc2l0ZSwgT2JqZWN0IGNvbnRlbnROb2RlSWQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpOwotCQotCXZvaWQgZGlzcG9zZSgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9QYWdlQm9va01hbmFnZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvUGFnZUJvb2tNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwYzU4M2IuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9QYWdlQm9va01hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IFZlcnNhbnQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogVmVyc2FudC4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUGFnZUJvb2s7Ci0KLS8qKgotICogQSB3cmFwcGVyIGZvciBhIDxjb2RlPlBhZ2VCb29rPC9jb2RlPiB3aXRoIGNvbnZlbmllbmNlIG1ldGhvZHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBQYWdlQm9va01hbmFnZXIgZXh0ZW5kcyBQYWdlQm9vayB7Ci0KLQlwcml2YXRlIE1hcCBwYWdlUmVjb3JkczsKLQlwcml2YXRlIE9iamVjdCBhY3RpdmU7Ci0JcHJpdmF0ZSBQYWdlQm9vayBwYWdlQm9vazsKLQlwcml2YXRlIENvbXBvc2l0ZSBkZWZhdWx0Q29tcG9zaXRlOwotCQotCS8qKgotCSAqIEEgPGNvZGU+UGFnZUJvb2tNYW5hZ2VyPGNvZGU+IGlzIGEgd3JhcHBlciBmb3IgYSA8Y29kZT5QYWdlQm9vazwvY29kZT4uIEl0IHByb3ZpZGVzCi0JICogY29udmVuaWVuY2UgbWV0aG9kcyB0byBhZGQsIHJlbW92ZSwgYWN0aXZhdGUgYW5kIGluYWN0aXZlIHBhZ2VzIGluIHRoZSBpbnRlcm5hbCA8Y29kZT5QYWdlQm9vazwvY29kZT4uCi0JICogSWYgYSBwYWdlIGdldHMgZGVhY3RpdmF0ZWQsIHRoZSBtYW5hZ2VyIGFjdGl2YXRlcyBhIGRlZmF1bHQgcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29tcG9zaXRlIHRvIHRoaXMgbWFuYWdlcgotCSAqIEBwYXJhbSBhRGVmYXVsdExhYmVsIFRoZSBsYWJlbCBvbiB0aGUgdGhlIGRlZmF1bHQgcGFnZS4KLQkgKi8KLQlwdWJsaWMgUGFnZUJvb2tNYW5hZ2VyKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBhRGVmYXVsdExhYmVsKSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULk5VTEwpOwotCQl0aGlzLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJdGhpcy5wYWdlUmVjb3JkcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCXRoaXMucGFnZUJvb2sgPSBuZXcgUGFnZUJvb2sodGhpcywgU1dULk5PTkUpOwotCQl0aGlzLmRlZmF1bHRDb21wb3NpdGUgPSBuZXcgRGVmYXVsdENvbXBvc2l0ZShwYWdlQm9vaywgYURlZmF1bHRMYWJlbCk7Ci0JCXRoaXMucGFnZUJvb2suc2hvd1BhZ2UodGhpcy5kZWZhdWx0Q29tcG9zaXRlKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYW5PYmogQWN0aXZhdGVzIChmbGlwcyB0byB0b3AgaW4gdGhlIDxjb2RlPlBhZ2VCb29rPC9jb2RlPikgdGhlIGFzc29jaWF0ZWQgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiAKLQkgKiBmb3IgdGhlIGdpdmVuIDxjb2RlPk9iamVjdDwvY29kZT4uIEFjdGl2YXRlcyB0aGUgPGNvZGU+RGVmYXVsdENvbXBvc2l0ZTwvY29kZT4gaWYgdGhlcmUgaXMgbm8gYXNzb2NpYXRpb24KLQkgKiBmb3IgdGhlIGdpdmVuIDxjb2RlPk9iamVjdDwvY29kZT4uCi0JICogQHJldHVybiBSZXR1cm4gZmFsc2UgaWYgdGhlcmUgaXMgbm8gPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiBhc3NvY2lhdGlvbiB0byB0aGUgZ2l2ZW4gPGNvZGU+T2JqZWN0PC9jb2RlPiBvcgotCSAqIHRoZSBhc3NvY2lhdGVkIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gaXMgYWxyZWFkeSBhY3RpdmUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gYWN0aXZhdGUoT2JqZWN0IGFuT2JqKSB7Ci0JCWlmKGFuT2JqICE9IG51bGwgJiYgIWFuT2JqLmVxdWFscyh0aGlzLmFjdGl2ZSkgJiYgdGhpcy5wYWdlUmVjb3Jkcy5jb250YWluc0tleShhbk9iaikpIHsKLQkJCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSB0aGlzLnBhZ2VSZWNvcmRzLmdldChhbk9iaik7Ci0JCQl0aGlzLnBhZ2VCb29rLnNob3dQYWdlKGNvbXBvc2l0ZSk7Ci0JCQl0aGlzLmFjdGl2ZSA9IGFuT2JqOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZigoYW5PYmogPT0gbnVsbCB8fCAhYW5PYmouZXF1YWxzKHRoaXMuYWN0aXZlKSkgJiYgIXRoaXMucGFnZVJlY29yZHMuY29udGFpbnNLZXkoYW5PYmopKSB7Ci0JCQl0aGlzLnBhZ2VCb29rLnNob3dQYWdlKHRoaXMuZGVmYXVsdENvbXBvc2l0ZSk7Ci0JCQl0aGlzLmFjdGl2ZSA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gYW5PYmoKLQkgKiBAcmV0dXJuIFJldHVybnMgdHJ1ZSBpZiB0aGUgYXNzb2NpYXRlZCA8Y29kZT5Db21wb3NpdGU8L2NvZGU+IGhhcyBiZWVuIGRlYWN0aXZhdGVkLgotCSAqIFJldHVybnMgZmFsc2UgaWYgdGhlcmUgaXMgbm8gPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiBmb3IgdGhlIGdpdmVuIDxjb2RlPk9iamVjdDwvY29kZT4KLQkgKiBvciB0aGUgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiBpcyBhbHJlYWR5IGluYWN0aXZlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGRlYWN0aXZhdGUoT2JqZWN0IGFuT2JqKSB7Ci0JCWlmKGFuT2JqLmVxdWFscyh0aGlzLmFjdGl2ZSkpIHsKLQkJCXRoaXMucGFnZUJvb2suc2hvd1BhZ2UodGhpcy5kZWZhdWx0Q29tcG9zaXRlKTsKLQkJCXRoaXMuYWN0aXZlID0gbnVsbDsKLQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0gICAgICogQXNzb2NpYXRlcyB0aGUgc3BlY2lmaWVkIDxjb2RlPk9iamVjdDwvY29kZT4gd2l0aCB0aGUgc3BlY2lmaWVkIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4KLSAgICAgKiBpbiB0aGlzIDxjb2RlPlBhZ2VCb29rTWFuYWdlcjwvY29kZT4uCi0gICAgICogSWYgdGhpcyBtYW5hZ2VyIHByZXZpb3VzbHkgY29udGFpbmVkIGEgbWFwcGluZyBmb3IgdGhlIDxjb2RlPk9iamVjdDwvY29kZT4sIHRoZSBvbGQKLSAgICAgKiA8Y29kZT5Db21wb3NpdGU8L2NvZGU+IGlzIHJlcGxhY2VkIGJ5IHRoZSBzcGVjaWZpZWQgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPi4KLSAgICAgKiAKLQkgKiBAcGFyYW0gYW5PYmogPGNvZGU+T2JqZWN0PC9jb2RlPiB3aXRoIHdoaWNoIHRoZSBzcGVjaWZpZWQgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiBpcyB0byBiZSBhc3NvY2lhdGVkLgotCSAqIEBwYXJhbSBhQ29tcG9zaXRlIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgPGNvZGU+T2JqZWN0PC9jb2RlPi4KLQkgKiAKLSAgICAgKiBAcmV0dXJuIHByZXZpb3VzIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gYXNzb2NpYXRlZCB3aXRoIHNwZWNpZmllZCA8Y29kZT5PYmplY3Q8L2NvZGU+LAotICAgICAqIAkJICAgb3IgPHR0Pm51bGw8L3R0PiBpZiB0aGVyZSB3YXMgbm8gbWFwcGluZyBmb3IgPGNvZGU+T2JqZWN0PC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlIHB1dChPYmplY3QgYW5PYmosIENvbXBvc2l0ZSBhQ29tcG9zaXRlKSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSB0aGlzLnBhZ2VSZWNvcmRzLnB1dChhbk9iaiwgYUNvbXBvc2l0ZSk7Ci0JCXRoaXMuYWN0aXZhdGUoYW5PYmopOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQkKLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIHRoZSBtYXBwaW5nIGZvciB0aGlzIDxjb2RlPk9iamVjdDwvY29kZT4gZnJvbSB0aGlzIHBhZ2Vib29rbWFuYWdlciBpZiBpdCBpcyBwcmVzZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIGFuT2JqIDxjb2RlPk9iamVjdDwvY29kZT4gd2hvc2UgbWFwcGluZyBpcyB0byBiZSByZW1vdmVkIGZyb20gdGhpcyA8Y29kZT5QYWdlQm9va01hbmFnZXI8L2NvZGU+LgotICAgICAqIEByZXR1cm4gcHJldmlvdXMgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiBhc3NvY2lhdGVkIHdpdGggc3BlY2lmaWVkIDxjb2RlPk9iamVjdDwvY29kZT4uCi0gICAgICovCi0JcHVibGljIENvbXBvc2l0ZSByZW1vdmUoT2JqZWN0IGFuT2JqKSB7Ci0JCWlmKGFuT2JqLmVxdWFscyh0aGlzLmFjdGl2ZSkpIHsKLQkJCXRoaXMuYWN0aXZlID0gbnVsbDsKLQkJCXRoaXMucGFnZUJvb2suc2hvd1BhZ2UodGhpcy5kZWZhdWx0Q29tcG9zaXRlKTsKLQkJfQkKLQkJcmV0dXJuIChDb21wb3NpdGUpIHRoaXMucGFnZVJlY29yZHMucmVtb3ZlKGFuT2JqKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYW5PYmogd2hvc2UgcHJlc2VuY2UgaW4gdGhpcyBtYXAgaXMgdG8gYmUgdGVzdGVkCi0JICogQHJldHVybiB0cnVlIGlmIHRoaXMgPGNvZGU+UGFnZUJvb2tNYW5hZ2VyPC9jb2RlPiBjb250YWlucyBhIG1hcHBpbmcgZm9yIHRoZQotCSAqIAkJICAgZ2l2ZW4gPGNvZGU+T2JqZWN0PC9jb2RlPi4gRmFsc2Ugb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBhbk9iaikgewotCQlyZXR1cm4gdGhpcy5wYWdlUmVjb3Jkcy5jb250YWluc0tleShhbk9iaik7Ci0JfQotCQotCXB1YmxpYyBDb21wb3NpdGUgZ2V0KE9iamVjdCBrZXkpIHsKLQkJcmV0dXJuIChDb21wb3NpdGUpIHBhZ2VSZWNvcmRzLmdldChrZXkpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gVGhlIGN1cnJlbnRseSBhY3RpdmUgY29tcG9zaXRlCi0JICovCi0JcHVibGljIENvbXBvc2l0ZSBnZXRBY3RpdmUoKSB7Ci0JCWlmKHRoaXMuYWN0aXZlID09IG51bGwpIHsKLQkJCXJldHVybiB0aGlzLmRlZmF1bHRDb21wb3NpdGU7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKENvbXBvc2l0ZSkgdGhpcy5wYWdlUmVjb3Jkcy5nZXQodGhpcy5hY3RpdmUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBUaGUgaW50ZXJuYWwgPGNvZGU+UGFnZUJvb2s8L2NvZGU+IG9mIHRoaXMgPGNvZGU+UGFnZUJvb2tNYW5hZ2VyPC9jb2RlPi4gCi0JICogPGNvZGU+Q29tcG9zaXRlPC9jb2RlPnMgd2hpY2ggc2hvdWxkIHdvcmsgd2l0aCB0aGlzIG1hbmFnZXIgbmVlZHMgdG8gYmUgY3JlYXRlZAotCSAqIHdpdGggdGhpcyA8Y29kZT5Db21wb3NpdGU8L2NvZGU+IGFzIHRoZWlyIHBhcmVudCBjb21wb3NpdGUuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZSBnZXRDb21wb3NpdGUoKSB7Ci0JCXJldHVybiB0aGlzLnBhZ2VCb29rOwotCX0KLQotCS8vIGEgZGVmYXVsdCBjb21wb3NpdGUgd2hpY2ggaXMgc2hvdyBpZiB0aGUgYWN0aXZlIGNvbXBvc2l0ZQotCS8vIGdldHMgZGVhY3RpdmF0ZWQKLQlwcml2YXRlIGNsYXNzIERlZmF1bHRDb21wb3NpdGUgZXh0ZW5kcyBDb21wb3NpdGUgewotCQlwdWJsaWMgRGVmYXVsdENvbXBvc2l0ZShDb21wb3NpdGUgYVBhcmVudCwgU3RyaW5nIGFEZWZhdWx0TGFiZWwpIHsKLQkJCXN1cGVyKGFQYXJlbnQsIFNXVC5OT05FKTsKLQkJCXNldExheW91dChuZXcgRmlsbExheW91dChTV1QuVkVSVElDQUwpKTsKLQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHRoaXMsIFNXVC5MRUZUKTsKLQkJCWxhYmVsLnNldFRleHQoYURlZmF1bHRMYWJlbCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQlDb2xsZWN0aW9uIGNvbXBvc2l0ZXMgPSB0aGlzLnBhZ2VSZWNvcmRzLnZhbHVlcygpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBjb21wb3NpdGVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApIHsKLQkJCSgoQ29tcG9zaXRlKSBpLm5leHQoKSkuZGlzcG9zZSgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9QZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMmEzMTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZGV0YWlscy9QZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQmFzaWNDb21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JSnBhQ29udGVudE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSnBhQ29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEuZGV0YWlscy5JQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEubWFwcGluZ3MucHJvcGVydGllcy5CYXNpY01hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLm1hcHBpbmdzLnByb3BlcnRpZXMuRGVmYXVsdEJhc2ljTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEubWFwcGluZ3MucHJvcGVydGllcy5EZWZhdWx0RW1iZWRkZWRNYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamF2YS5tYXBwaW5ncy5wcm9wZXJ0aWVzLkVtYmVkZGVkSWRNYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamF2YS5tYXBwaW5ncy5wcm9wZXJ0aWVzLkVtYmVkZGVkTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEubWFwcGluZ3MucHJvcGVydGllcy5JZE1hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLm1hcHBpbmdzLnByb3BlcnRpZXMuTWFueVRvTWFueU1hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLm1hcHBpbmdzLnByb3BlcnRpZXMuTWFueVRvT25lTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEubWFwcGluZ3MucHJvcGVydGllcy5OdWxsQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEubWFwcGluZ3MucHJvcGVydGllcy5PbmVUb01hbnlNYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamF2YS5tYXBwaW5ncy5wcm9wZXJ0aWVzLk9uZVRvT25lTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEubWFwcGluZ3MucHJvcGVydGllcy5UcmFuc2llbnRNYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamF2YS5tYXBwaW5ncy5wcm9wZXJ0aWVzLlZlcnNpb25NYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5DQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBhZ2VCb29rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQYWdlIGV4dGVuZHMgQmFzZUpwYURldGFpbHNQYWdlIAotewotCXByaXZhdGUgSVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlOwotCXByaXZhdGUgSUF0dHJpYnV0ZU1hcHBpbmcgYXR0cmlidXRlTWFwcGluZzsKLQlwcml2YXRlIEFkYXB0ZXIgcGVyc2lzdGVudEF0dHJpYnV0ZUxpc3RlbmVyOwotCXByaXZhdGUgQWRhcHRlciBhdHRyaWJ1dGVNYXBwaW5nTGlzdGVuZXI7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgY3VycmVudE1hcHBpbmdLZXk7Ci0JCi0JcHJpdmF0ZSBDQ29tYm9WaWV3ZXIgbWFwcGluZ0NvbWJvOwotCQotCXByaXZhdGUgTWFwPFN0cmluZywgSUpwYUNvbXBvc2l0ZTxJQXR0cmlidXRlTWFwcGluZz4+IG1hcHBpbmdDb21wb3NpdGVzOwotCXByb3RlY3RlZCBQYWdlQm9vayBtYXBwaW5nUGFnZUJvb2s7CQotCXByaXZhdGUgSUpwYUNvbXBvc2l0ZTxJQXR0cmlidXRlTWFwcGluZz4gY3VycmVudE1hcHBpbmdDb21wb3NpdGU7Ci0JCi0JLyoqCi0JICogVGhlc2UgSUF0dHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnMgd2lsbCBiZSB1c2VkIGFzIGVsZW1lbnRzIGluIHRoZSBhdHRyaWJ1dGVNYXBwaW5nIGNvbWJvCi0JICogVGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIGNvbWJvIHdpbGwgYmUgb25lIG9mIHRoZSBkZWZhdWx0QXR0cmlidXRlbWFwcGluZ1VpUHJvdmlkZXJzIG9yCi0JICogaWYgbm9uZSBvZiB0aG9zZSBhcHBseSB0aGUgbnVsbEF0dHJpdWJ0ZU1hcHBpbmdVaVByb3ZpZGVyIHdpbGwgYmUgdXNlZC4gVGhlIHJlc3Qgb2YgdGhlIGVsZW1lbnRzCi0JICogd2lsbCBiZSB0aGUgYXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJzLiAgVGhlIGRlZmF1bHRBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlciBpcwotCSAqIGRldGVybWluZWQgYnkgbWF0Y2hpbmcgaXRzIGtleSB3aXRoIHRoZSBrZXkgb2YgdGhlIGN1cnJlbnQgYXR0cml1YnRlTWFwcGluZy4gIAotCSAqLwotCXByaXZhdGUgQ29sbGVjdGlvbjxJQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI+IGF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyczsKLQlwcml2YXRlIENvbGxlY3Rpb248SUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyPiBkZWZhdWx0QXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJzOwotCXByaXZhdGUgSUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyIG51bGxBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjsKLQkKLQlwdWJsaWMgUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQYWdlKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJc3VwZXIocGFyZW50LCBTV1QuTk9ORSwgbmV3IEJhc2ljQ29tbWFuZFN0YWNrKCksIHdpZGdldEZhY3RvcnkpOwotCQlwZXJzaXN0ZW50QXR0cmlidXRlTGlzdGVuZXIgPSBidWlsZEF0dHJpYnV0ZUxpc3RlbmVyKCk7Ci0JCWF0dHJpYnV0ZU1hcHBpbmdMaXN0ZW5lciA9IGJ1aWxkQXR0cmlidXRlTWFwcGluZ0xpc3RlbmVyKCk7Ci0JCW1hcHBpbmdDb21wb3NpdGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJSnBhQ29tcG9zaXRlPElBdHRyaWJ1dGVNYXBwaW5nPj4oKTsKLQkJdGhpcy5hdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnMgPSBidWlsZEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVycygpOwotCQl0aGlzLmRlZmF1bHRBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnMgPSBidWlsZERlZmF1bHRBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnMoKTsKLQkJdGhpcy5udWxsQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXIgPSBidWlsZE51bGxBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyIGJ1aWxkTnVsbEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyKCkgewotCQlyZXR1cm4gTnVsbEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyLmluc3RhbmNlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBDb2xsZWN0aW9uPElBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcj4gYnVpbGRBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnMoKSB7Ci0JCUNvbGxlY3Rpb248SUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyPiBwcm92aWRlcnMgPSBuZXcgQXJyYXlMaXN0PElBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcj4oKTsKLQkJcHJvdmlkZXJzLmFkZChCYXNpY01hcHBpbmdVaVByb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKEVtYmVkZGVkTWFwcGluZ1VpUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoRW1iZWRkZWRJZE1hcHBpbmdVaVByb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKElkTWFwcGluZ1VpUHJvdmlkZXIuaW5zdGFuY2UoKSk7CQkJCi0JCXByb3ZpZGVycy5hZGQoTWFueVRvTWFueU1hcHBpbmdVaVByb3ZpZGVyLmluc3RhbmNlKCkpOwkJCQotCQlwcm92aWRlcnMuYWRkKE1hbnlUb09uZU1hcHBpbmdVaVByb3ZpZGVyLmluc3RhbmNlKCkpOwkJCQotCQlwcm92aWRlcnMuYWRkKE9uZVRvTWFueU1hcHBpbmdVaVByb3ZpZGVyLmluc3RhbmNlKCkpOwkJCQotCQlwcm92aWRlcnMuYWRkKE9uZVRvT25lTWFwcGluZ1VpUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoVHJhbnNpZW50TWFwcGluZ1VpUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoVmVyc2lvbk1hcHBpbmdVaVByb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlyZXR1cm4gcHJvdmlkZXJzOwotCX0KLQkKLQlwcm90ZWN0ZWQgIENvbGxlY3Rpb248SUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyPiBhdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnMoKSB7Ci0JCXJldHVybiB0aGlzLmF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyczsKLQl9Ci0JCi0JcHJvdGVjdGVkIENvbGxlY3Rpb248SUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyPiBidWlsZERlZmF1bHRBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnMoKSB7Ci0JCUNvbGxlY3Rpb248SUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyPiBwcm92aWRlcnMgPSBuZXcgQXJyYXlMaXN0PElBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcj4oKTsKLQkJcHJvdmlkZXJzLmFkZChEZWZhdWx0QmFzaWNNYXBwaW5nVWlQcm92aWRlci5pbnN0YW5jZSgpKTsJCQotCQlwcm92aWRlcnMuYWRkKERlZmF1bHRFbWJlZGRlZE1hcHBpbmdVaVByb3ZpZGVyLmluc3RhbmNlKCkpOwkJCi0JCXJldHVybiBwcm92aWRlcnM7Ci0JfQotCQotCXByb3RlY3RlZCAgQ29sbGVjdGlvbjxJQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI+IGRlZmF1bHRBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnMoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnM7Ci0JfQotCQotCXByaXZhdGUgSUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyIGF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyKFN0cmluZyBrZXkpIHsKLQkJZm9yIChJQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXIgcHJvdmlkZXIgOiBhdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnMoKSkgewotCQkJaWYgKHByb3ZpZGVyLmtleSgpID09IGtleSkgewotCQkJCXJldHVybiBwcm92aWRlcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdGhpcy5udWxsQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI7Ci0JfQotCXByaXZhdGUgSUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyIGRlZmF1bHRBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcihTdHJpbmcga2V5KSB7Ci0JCWZvciAoSUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyIHByb3ZpZGVyIDogZGVmYXVsdEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVycygpKSB7Ci0JCQlpZiAocHJvdmlkZXIua2V5KCkgPT0ga2V5KSB7Ci0JCQkJcmV0dXJuIHByb3ZpZGVyOwotCQkJfQotCQl9Ci0JCXJldHVybiB0aGlzLm51bGxBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjsKLQl9Ci0JCi0JcHJpdmF0ZSBBZGFwdGVyIGJ1aWxkQXR0cmlidXRlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkJCXBlcnNpc3RlbnRBdHRyaWJ1dGVDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXZvaWQgcGVyc2lzdGVudEF0dHJpYnV0ZUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSVBlcnNpc3RlbnRBdHRyaWJ1dGUuY2xhc3MpKSB7Ci0JCQljYXNlIEpwYUNvcmVQYWNrYWdlLklQRVJTSVNURU5UX0FUVFJJQlVURV9fTUFQUElORzoKLQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMoCi0JCQkJCW5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQlwb3B1bGF0ZSgpOwotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQlicmVhazsKLQkJfQotCX0KLQkKLQlwcml2YXRlIEFkYXB0ZXIgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkJCWF0dHJpYnV0ZU1hcHBpbmdDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXZvaWQgYXR0cmlidXRlTWFwcGluZ0NoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotLy8JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChJQXR0cmlidXRlTWFwcGluZy5jbGFzcykpIHsKLS8vCQkJY2FzZSBKcGFDb3JlUGFja2FnZS5JQVRUUklCVVRFX01BUFBJTkdfX0RFRkFVTFQ6Ci0vLwkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMoCi0vLwkJCQkJbmV3IFJ1bm5hYmxlKCkgewotLy8JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0vLwkJCQkJCQlwb3B1bGF0ZSgpOwotLy8JCQkJCQl9Ci0vLwkJCQkJfSk7Ci0vLwkJCQlicmVhazsKLS8vCQl9Ci0JfQotCQkKLQlwcm90ZWN0ZWQgTGFiZWwgYnVpbGRNYXBwaW5nTGFiZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUxhYmVsKHBhcmVudCwgSnB0VWlNZXNzYWdlcy5QZXJzaXN0ZW50QXR0cmlidXRlUGFnZV9tYXBBcyk7Ci0JfQotCQotCXByb3RlY3RlZCBDQ29tYm9WaWV3ZXIgYnVpbGRNYXBwaW5nQ29tYm8oQ29tcG9zaXRlIHBhcmVudCkgewotCQlDQ29tYm8gY29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKHBhcmVudCk7Ci0JCW1hcHBpbmdDb21ibyA9IG5ldyBDQ29tYm9WaWV3ZXIoY29tYm8pOwotCQltYXBwaW5nQ29tYm8uc2V0Q29udGVudFByb3ZpZGVyKGJ1aWxkQ29udGVudFByb3ZpZGVyKCkpOwotCQltYXBwaW5nQ29tYm8uc2V0TGFiZWxQcm92aWRlcihidWlsZExhYmVsUHJvdmlkZXIoKSk7Ci0JCW1hcHBpbmdDb21iby5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCW1hcHBpbmdDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJfSk7Ci0JCXJldHVybiBtYXBwaW5nQ29tYm87Ci0JfQotCi0JcHJpdmF0ZSBJQ29udGVudFByb3ZpZGVyIGJ1aWxkQ29udGVudFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyKCkgewotCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCQkvLyBkbyBub3RoaW5nCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQkJaWYgKGlucHV0RWxlbWVudCA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBuZXcgT2JqZWN0W117fTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHVpUHJvdmlkZXJzRm9yKChJUGVyc2lzdGVudEF0dHJpYnV0ZSkgaW5wdXRFbGVtZW50KTsKLQkJCX0KLQkJCQotCQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQkJLy8gZG8gbm90aGluZwotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgSUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyW10gdWlQcm92aWRlcnNGb3IoSVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSkgewotCQlJQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJbXSBwcm92aWRlcnMgPSBuZXcgSUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyW2F0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVycygpLnNpemUoKSArMV07Ci0JCXByb3ZpZGVyc1swXSA9ICB0aGlzLm51bGxBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjsKLQkJZm9yIChJQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXIgdWlQcm92aWRlciA6IGRlZmF1bHRBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnMoKSkgewotCQkJaWYgKHVpUHJvdmlkZXIua2V5KCkgPT0gcGVyc2lzdGVudEF0dHJpYnV0ZS5kZWZhdWx0TWFwcGluZ0tleSgpKSB7Ci0JCQkJcHJvdmlkZXJzWzBdID0gdWlQcm92aWRlcjsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpbnQgaSA9IDE7Ci0JCWZvciAoSUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyIHVpUHJvdmlkZXIgOiBhdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnMoKSkgewotCQkJcHJvdmlkZXJzW2krK10gPSB1aVByb3ZpZGVyOwotCQl9Ci0JCXJldHVybiBwcm92aWRlcnM7Ci0JfQotCi0JcHJpdmF0ZSBJQmFzZUxhYmVsUHJvdmlkZXIgYnVpbGRMYWJlbFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCXJldHVybiAoKElBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcikgZWxlbWVudCkubGFiZWwoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFBhZ2VCb29rIGJ1aWxkTWFwcGluZ1BhZ2VCb29rKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJbWFwcGluZ1BhZ2VCb29rID0gbmV3IFBhZ2VCb29rKHBhcmVudCwgU1dULk5PTkUpOwotCQlyZXR1cm4gbWFwcGluZ1BhZ2VCb29rOwotCX0KLQkKLQlwcm90ZWN0ZWQgSUpwYUNvbXBvc2l0ZTxJQXR0cmlidXRlTWFwcGluZz4gYnVpbGRNYXBwaW5nQ29tcG9zaXRlKFBhZ2VCb29rIHBhZ2VCb29rLCBTdHJpbmcga2V5KSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZU1hcHBpbmcgPT0gbnVsbCB8fCB0aGlzLmF0dHJpYnV0ZU1hcHBpbmcuaXNEZWZhdWx0KCkpIHsKLQkJCXJldHVybiBkZWZhdWx0QXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXIoa2V5KS5idWlsZEF0dHJpYnV0ZU1hcHBpbmdDb21wb3NpdGUocGFnZUJvb2ssIHRoaXMuY29tbWFuZFN0YWNrLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCQl9Ci0KLQkJcmV0dXJuIGF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyKGtleSkuYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKHBhZ2VCb29rLCB0aGlzLmNvbW1hbmRTdGFjaywgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQl9Ci0JCQotCXZvaWQgbWFwcGluZ0NoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChpc1BvcHVsYXRpbmcoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChldmVudC5nZXRTZWxlY3Rpb24oKSBpbnN0YW5jZW9mIFN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCUlBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlciBwcm92aWRlciA9IChJQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXIpICgoU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCQkJU3RyaW5nIGtleSA9ICh0aGlzLmRlZmF1bHRBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnMoKS5jb250YWlucyhwcm92aWRlcikgPyBudWxsIDogcHJvdmlkZXIua2V5KCkpOwotCQkJYXR0cmlidXRlLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoa2V5KTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb1BvcHVsYXRlKElKcGFDb250ZW50Tm9kZSBwZXJzaXN0ZW50QXR0cmlidXRlTm9kZSkgewotCQlhdHRyaWJ1dGUgPSAoSVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHBlcnNpc3RlbnRBdHRyaWJ1dGVOb2RlOwotCQlwb3B1bGF0ZU1hcHBpbmdDb21ib0FuZFBhZ2UoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9Qb3B1bGF0ZSgpIHsKLQkJcG9wdWxhdGVNYXBwaW5nQ29tYm9BbmRQYWdlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUxpc3RlbmVycygpIHsKLQkJaWYgKGF0dHJpYnV0ZSAhPSBudWxsKSB7Ci0JCQlhdHRyaWJ1dGUuZUFkYXB0ZXJzKCkuYWRkKHBlcnNpc3RlbnRBdHRyaWJ1dGVMaXN0ZW5lcik7Ci0JCQlpZiAoYXR0cmlidXRlTWFwcGluZyAhPSBudWxsKSB7Ci0JCQkJYXR0cmlidXRlTWFwcGluZy5lQWRhcHRlcnMoKS5hZGQoYXR0cmlidXRlTWFwcGluZ0xpc3RlbmVyKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VMaXN0ZW5lcnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGUgIT0gbnVsbCkgewotCQkJYXR0cmlidXRlLmVBZGFwdGVycygpLnJlbW92ZShwZXJzaXN0ZW50QXR0cmlidXRlTGlzdGVuZXIpOwotCQkJaWYgKGF0dHJpYnV0ZU1hcHBpbmcgIT0gbnVsbCkgewotCQkJCWF0dHJpYnV0ZU1hcHBpbmcuZUFkYXB0ZXJzKCkucmVtb3ZlKGF0dHJpYnV0ZU1hcHBpbmdMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlTWFwcGluZ0NvbWJvQW5kUGFnZSgpIHsKLQkJaWYgKGF0dHJpYnV0ZSA9PSBudWxsKSB7Ci0JCQlhdHRyaWJ1dGVNYXBwaW5nID0gbnVsbDsKLQkJCWN1cnJlbnRNYXBwaW5nS2V5ID0gbnVsbDsKLQkJCW1hcHBpbmdDb21iby5zZXRJbnB1dChudWxsKTsKLQkJCW1hcHBpbmdDb21iby5zZXRTZWxlY3Rpb24oU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSk7Ci0JCQkKLQkJCWlmIChjdXJyZW50TWFwcGluZ0NvbXBvc2l0ZSAhPSBudWxsKSB7Ci0JCQkJY3VycmVudE1hcHBpbmdDb21wb3NpdGUucG9wdWxhdGUobnVsbCk7Ci0JCQkJY3VycmVudE1hcHBpbmdDb21wb3NpdGUgPSBudWxsOwotCQkJfQotCQkJCi0JCQlyZXR1cm47Ci0JCX0KLQkJYXR0cmlidXRlTWFwcGluZyA9IGF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCXNldENvbWJvRGF0YShhdHRyaWJ1dGUuY2FuZGlkYXRlTWFwcGluZ0tleXMoKSk7Ci0JCQotCQlwb3B1bGF0ZU1hcHBpbmdQYWdlKGF0dHJpYnV0ZU1hcHBpbmcgPT0gbnVsbCA/IG51bGwgOiBhdHRyaWJ1dGVNYXBwaW5nLmdldEtleSgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlTWFwcGluZ1BhZ2UoU3RyaW5nIG1hcHBpbmdLZXkpIHsKLQkJaWYgKGN1cnJlbnRNYXBwaW5nQ29tcG9zaXRlICE9IG51bGwpIHsKLQkJCWlmIChtYXBwaW5nS2V5ID09IGN1cnJlbnRNYXBwaW5nS2V5KSB7Ci0JCQkJaWYgKGN1cnJlbnRNYXBwaW5nQ29tcG9zaXRlICE9IG51bGwpIHsKLQkJCQkJY3VycmVudE1hcHBpbmdDb21wb3NpdGUucG9wdWxhdGUoYXR0cmlidXRlTWFwcGluZyk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQljdXJyZW50TWFwcGluZ0NvbXBvc2l0ZS5wb3B1bGF0ZShudWxsKTsKLQkJCQkvLyBkb24ndCByZXR1cm4KLQkJCX0KLQkJfQotCQkKLQkJY3VycmVudE1hcHBpbmdLZXkgPSBtYXBwaW5nS2V5OwotCQkKLQkJSUpwYUNvbXBvc2l0ZTxJQXR0cmlidXRlTWFwcGluZz4gY29tcG9zaXRlID0gbWFwcGluZ0NvbXBvc2l0ZUZvcihtYXBwaW5nS2V5KTsKLQkJbWFwcGluZ1BhZ2VCb29rLnNob3dQYWdlKGNvbXBvc2l0ZS5nZXRDb250cm9sKCkpOwotCQkKLQkJY3VycmVudE1hcHBpbmdDb21wb3NpdGUgPSBjb21wb3NpdGU7Ci0JCWN1cnJlbnRNYXBwaW5nQ29tcG9zaXRlLnBvcHVsYXRlKGF0dHJpYnV0ZU1hcHBpbmcpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0Q29tYm9EYXRhKEl0ZXJhdG9yPFN0cmluZz4gYXZhaWxhYmxlTWFwcGluZ0tleXMpIHsKLQkJaWYgKGF0dHJpYnV0ZSAhPSBtYXBwaW5nQ29tYm8uZ2V0SW5wdXQoKSkgewotCQkJbWFwcGluZ0NvbWJvLnNldElucHV0KGF0dHJpYnV0ZSk7Ci0JCX0KLQkJaWYgKGF0dHJpYnV0ZU1hcHBpbmcgPT0gbnVsbCB8fCBhdHRyaWJ1dGVNYXBwaW5nLmlzRGVmYXVsdCgpKSB7Ci0JCQltYXBwaW5nQ29tYm8uc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG1hcHBpbmdDb21iby5nZXRFbGVtZW50QXQoMCkpKTsKLQkJfQotCQllbHNlIHsKLQkJCUlBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlciBwcm92aWRlciA9IGF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyKGF0dHJpYnV0ZS5tYXBwaW5nS2V5KCkpOwotCQkJaWYgKHByb3ZpZGVyICE9IG51bGwgJiYgISBwcm92aWRlci5lcXVhbHMoKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBtYXBwaW5nQ29tYm8uZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpKSkgewotCQkJCW1hcHBpbmdDb21iby5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24ocHJvdmlkZXIpKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIElKcGFDb21wb3NpdGU8SUF0dHJpYnV0ZU1hcHBpbmc+IG1hcHBpbmdDb21wb3NpdGVGb3IoU3RyaW5nIGtleSkgewotCQlJSnBhQ29tcG9zaXRlPElBdHRyaWJ1dGVNYXBwaW5nPiBjb21wb3NpdGUgPSBtYXBwaW5nQ29tcG9zaXRlcy5nZXQoa2V5KTsKLQkJaWYgKGNvbXBvc2l0ZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY29tcG9zaXRlOwotCQl9Ci0JCQotCQljb21wb3NpdGUgPSBidWlsZE1hcHBpbmdDb21wb3NpdGUobWFwcGluZ1BhZ2VCb29rLCBrZXkpOwotCQkKLQkJaWYgKGNvbXBvc2l0ZSAhPSBudWxsKSB7Ci0JCQltYXBwaW5nQ29tcG9zaXRlcy5wdXQoa2V5LCBjb21wb3NpdGUpOwotCQl9Ci0JCQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQkJCi0vL1RPRE8gZm9jdXM/PwotLy8JcHVibGljIGJvb2xlYW4gc2V0Rm9jdXMoKSB7Ci0vLwkJc3VwZXIuc2V0Rm9jdXMoKTsKLS8vCQlyZXR1cm4gbWFwcGluZ0NvbWJvLmdldENvbWJvKCkuc2V0Rm9jdXMoKTsKLS8vCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlkaXNlbmdhZ2VMaXN0ZW5lcnMoKTsKLQkJZm9yIChJdGVyYXRvcjxJSnBhQ29tcG9zaXRlPElBdHRyaWJ1dGVNYXBwaW5nPj4gc3RyZWFtID0gbWFwcGluZ0NvbXBvc2l0ZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlzdHJlYW0ubmV4dCgpLmRpc3Bvc2UoKTsKLQkJfQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCQotCXB1YmxpYyBJUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiBhdHRyaWJ1dGU7Ci0JfQotCQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kZXRhaWxzL1BlcnNpc3RlbnRUeXBlRGV0YWlsc1BhZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvUGVyc2lzdGVudFR5cGVEZXRhaWxzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDgzNTNiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RldGFpbHMvUGVyc2lzdGVudFR5cGVEZXRhaWxzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovICAgICAgICAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5CYXNpY0NvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklKcGFDb250ZW50Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSnBhQ29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEuZGV0YWlscy5JVHlwZU1hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLm1hcHBpbmdzLnByb3BlcnRpZXMuRW1iZWRkYWJsZVVpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEubWFwcGluZ3MucHJvcGVydGllcy5FbnRpdHlVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLm1hcHBpbmdzLnByb3BlcnRpZXMuTWFwcGVkU3VwZXJjbGFzc1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEubWFwcGluZ3MucHJvcGVydGllcy5OdWxsVHlwZU1hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkNDb21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUGFnZUJvb2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQZXJzaXN0ZW50VHlwZURldGFpbHNQYWdlIGV4dGVuZHMgQmFzZUpwYURldGFpbHNQYWdlIAotewkKLQlwcml2YXRlIElQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZTsKLQlwcml2YXRlIEFkYXB0ZXIgcGVyc2lzdGVudFR5cGVMaXN0ZW5lcjsKLQkKLQlwcml2YXRlIFN0cmluZyBjdXJyZW50TWFwcGluZ0tleTsKLQkKLQlwcml2YXRlIENDb21ib1ZpZXdlciB0eXBlTWFwcGluZ0NvbWJvOwotCQotCS8qKgotCSAqIEEgTWFwIG9mIG1hcHBpbmcgQ29tcG9zaXRlcyBvZiB0eXBlIElQZXJzaXN0ZW5jZUNvbXBvc2l0ZSB0aGF0IGlzIGtleWVkIG9uIElDb25maWd1cmF0aW9uRWxlbWVudAotCSAqLwotCXByaXZhdGUgTWFwIGNvbXBvc2l0ZXM7Ci0JCi0JcHJvdGVjdGVkIFBhZ2VCb29rIHR5cGVNYXBwaW5nUGFnZUJvb2s7Ci0JCi0JcHJpdmF0ZSBJSnBhQ29tcG9zaXRlIHZpc2libGVNYXBwaW5nQ29tcG9zaXRlOwotCQotCXByaXZhdGUgQ29sbGVjdGlvbjxJVHlwZU1hcHBpbmdVaVByb3ZpZGVyPiB0eXBlTWFwcGluZ1VpUHJvdmlkZXJzOwotCQotCXB1YmxpYyBQZXJzaXN0ZW50VHlwZURldGFpbHNQYWdlKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJc3VwZXIocGFyZW50LCBTV1QuTk9ORSwgbmV3IEJhc2ljQ29tbWFuZFN0YWNrKCksIHdpZGdldEZhY3RvcnkpOwotCQl0aGlzLnBlcnNpc3RlbnRUeXBlTGlzdGVuZXIgPSBidWlsZFBlcnNpc3RlbnRUeXBlTGlzdGVuZXIoKTsKLQkJdGhpcy5jb21wb3NpdGVzID0gbmV3IEhhc2hNYXAoKTsKLQkJdGhpcy50eXBlTWFwcGluZ1VpUHJvdmlkZXJzID0gYnVpbGRUeXBlTWFwcGluZ1VpUHJvdmlkZXJzKCk7Ci0JfQotCQotCXByb3RlY3RlZCBDb2xsZWN0aW9uPElUeXBlTWFwcGluZ1VpUHJvdmlkZXI+IGJ1aWxkVHlwZU1hcHBpbmdVaVByb3ZpZGVycygpIHsKLQkJQ29sbGVjdGlvbjxJVHlwZU1hcHBpbmdVaVByb3ZpZGVyPiB0eXBlTWFwcGluZ1VpUHJvdmlkZXJzID0gbmV3IEFycmF5TGlzdDxJVHlwZU1hcHBpbmdVaVByb3ZpZGVyPigpOwotCQl0eXBlTWFwcGluZ1VpUHJvdmlkZXJzLmFkZChuZXcgTnVsbFR5cGVNYXBwaW5nVWlQcm92aWRlcigpKTsKLQkJdHlwZU1hcHBpbmdVaVByb3ZpZGVycy5hZGQobmV3IEVudGl0eVVpUHJvdmlkZXIoKSk7Ci0JCXR5cGVNYXBwaW5nVWlQcm92aWRlcnMuYWRkKG5ldyBNYXBwZWRTdXBlcmNsYXNzVWlQcm92aWRlcigpKTsJCQkKLQkJdHlwZU1hcHBpbmdVaVByb3ZpZGVycy5hZGQobmV3IEVtYmVkZGFibGVVaVByb3ZpZGVyKCkpOwkJCQotCQlyZXR1cm4gdHlwZU1hcHBpbmdVaVByb3ZpZGVyczsKLQl9Ci0JCi0JcHJpdmF0ZSBBZGFwdGVyIGJ1aWxkUGVyc2lzdGVudFR5cGVMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBBZGFwdGVySW1wbCgpIHsKLQkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkJCXBlcnNpc3RlbnRUeXBlQ2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcGVyc2lzdGVudFR5cGVDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKElQZXJzaXN0ZW50VHlwZS5jbGFzcykpIHsKLQkJCWNhc2UgSnBhQ29yZVBhY2thZ2UuSVBFUlNJU1RFTlRfVFlQRV9fTUFQUElOR19LRVk6Ci0JCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKAotCQkJCQluZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJcG9wdWxhdGUoKTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgTGFiZWwgYnVpbGRUeXBlTWFwcGluZ0xhYmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVMYWJlbChwYXJlbnQsIEpwdFVpTWVzc2FnZXMuUGVyc2lzdGVudFR5cGVQYWdlX21hcEFzKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIENDb21ib1ZpZXdlciBidWlsZFR5cGVNYXBwaW5nQ29tYm8oQ29tcG9zaXRlIHBhcmVudCkgewotCQlDQ29tYm8gY29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKHBhcmVudCk7Ci0JCXR5cGVNYXBwaW5nQ29tYm8gPSBuZXcgQ0NvbWJvVmlld2VyKGNvbWJvKTsKLQkJdHlwZU1hcHBpbmdDb21iby5zZXRDb250ZW50UHJvdmlkZXIoYnVpbGRDb250ZW50UHJvdmlkZXIoKSk7Ci0JCXR5cGVNYXBwaW5nQ29tYm8uc2V0TGFiZWxQcm92aWRlcihidWlsZExhYmVsUHJvdmlkZXIoKSk7Ci0JCXR5cGVNYXBwaW5nQ29tYm8uYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQl0eXBlTWFwcGluZ0NoYW5nZWQoZXZlbnQpOwotCQkJfQotCQl9KTsKLQkJcmV0dXJuIHR5cGVNYXBwaW5nQ29tYm87Ci0JfQotCQotCXByaXZhdGUgSUNvbnRlbnRQcm92aWRlciBidWlsZENvbnRlbnRQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQkJLy8gZG8gbm90aGluZwotCQkJfQotCQkJCi0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQkJCXJldHVybiAocGVyc2lzdGVudFR5cGUgPT0gbnVsbCkgPwotCQkJCQkJbmV3IFN0cmluZ1tdIHt9OgotCQkJCQkJUGVyc2lzdGVudFR5cGVEZXRhaWxzUGFnZS50aGlzLnR5cGVNYXBwaW5nVWlQcm92aWRlcnMudG9BcnJheSgpOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoCi0JCQkJCVZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQkJLy8gZG8gbm90aGluZwotCQkJfQotCQl9OwotCX0KLQlwcml2YXRlIElCYXNlTGFiZWxQcm92aWRlciBidWlsZExhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuICgoSVR5cGVNYXBwaW5nVWlQcm92aWRlcikgZWxlbWVudCkubGFiZWwoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFBhZ2VCb29rIGJ1aWxkVHlwZU1hcHBpbmdQYWdlQm9vayhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXR5cGVNYXBwaW5nUGFnZUJvb2sgPSBuZXcgUGFnZUJvb2socGFyZW50LCBTV1QuTk9ORSk7Ci0JCXJldHVybiB0eXBlTWFwcGluZ1BhZ2VCb29rOwotCX0KLQkJCi0JcHJpdmF0ZSBJSnBhUHJvamVjdCBnZXRKcGFQcm9qZWN0KCkgewotCQlyZXR1cm4gZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXRKcGFQcm9qZWN0KCk7Ci0JfQotCi0JcHJpdmF0ZSBJVHlwZU1hcHBpbmdVaVByb3ZpZGVyIHR5cGVNYXBwaW5nVWlQcm92aWRlcihTdHJpbmcga2V5KSB7Ci0JCWZvciAoSVR5cGVNYXBwaW5nVWlQcm92aWRlciBwcm92aWRlciA6IHRoaXMudHlwZU1hcHBpbmdVaVByb3ZpZGVycykgewotCQkJaWYgKHByb3ZpZGVyLmtleSgpID09IGtleSkgewotCQkJCXJldHVybiBwcm92aWRlcjsKLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bnN1cHBvcnRlZCB0eXBlIG1hcHBpbmcgVUkgcHJvdmlkZXIga2V5OiAiICsga2V5KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHR5cGVNYXBwaW5nQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGlzUG9wdWxhdGluZygpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGV2ZW50LmdldFNlbGVjdGlvbigpIGluc3RhbmNlb2YgU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJSVR5cGVNYXBwaW5nVWlQcm92aWRlciBwcm92aWRlciA9IChJVHlwZU1hcHBpbmdVaVByb3ZpZGVyKSAoKFN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCXBlcnNpc3RlbnRUeXBlLnNldE1hcHBpbmdLZXkocHJvdmlkZXIua2V5KCkpOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvUG9wdWxhdGUoSUpwYUNvbnRlbnROb2RlIHBlcnNpc3RlbnRUeXBlTm9kZSkgewotCQlwZXJzaXN0ZW50VHlwZSA9IChJUGVyc2lzdGVudFR5cGUpIHBlcnNpc3RlbnRUeXBlTm9kZTsKLQkJcG9wdWxhdGVNYXBwaW5nQ29tYm9BbmRQYWdlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvUG9wdWxhdGUoKSB7Ci0JCXBvcHVsYXRlTWFwcGluZ0NvbWJvQW5kUGFnZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VMaXN0ZW5lcnMoKSB7Ci0JCWlmIChwZXJzaXN0ZW50VHlwZSAhPSBudWxsKSB7Ci0JCQlwZXJzaXN0ZW50VHlwZS5lQWRhcHRlcnMoKS5hZGQocGVyc2lzdGVudFR5cGVMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTGlzdGVuZXJzKCkgewotCQlpZiAocGVyc2lzdGVudFR5cGUgIT0gbnVsbCkgewotCQkJcGVyc2lzdGVudFR5cGUuZUFkYXB0ZXJzKCkucmVtb3ZlKHBlcnNpc3RlbnRUeXBlTGlzdGVuZXIpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZU1hcHBpbmdDb21ib0FuZFBhZ2UoKSB7Ci0JCWlmIChwZXJzaXN0ZW50VHlwZSA9PSBudWxsKSB7Ci0JCQljdXJyZW50TWFwcGluZ0tleSA9IG51bGw7Ci0JCQl0eXBlTWFwcGluZ0NvbWJvLnNldElucHV0KG51bGwpOwotCQkJdHlwZU1hcHBpbmdDb21iby5zZXRTZWxlY3Rpb24oU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSk7Ci0JCQkKLQkJCWlmICh2aXNpYmxlTWFwcGluZ0NvbXBvc2l0ZSAhPSBudWxsKSB7Ci0JCQkJdmlzaWJsZU1hcHBpbmdDb21wb3NpdGUucG9wdWxhdGUobnVsbCk7Ci0JCQkJdmlzaWJsZU1hcHBpbmdDb21wb3NpdGUgPSBudWxsOwotCQkJfQotCQkJCi0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCVN0cmluZyBtYXBwaW5nS2V5ID0gcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLmdldEtleSgpOwotCQlzZXRDb21ib0RhdGEobWFwcGluZ0tleSwgcGVyc2lzdGVudFR5cGUuY2FuZGlkYXRlTWFwcGluZ0tleXMoKSk7Ci0JCQotCQlwb3B1bGF0ZU1hcHBpbmdQYWdlKG1hcHBpbmdLZXkpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVNYXBwaW5nUGFnZShTdHJpbmcgbWFwcGluZ0tleSkgewotCQlpZiAodmlzaWJsZU1hcHBpbmdDb21wb3NpdGUgIT0gbnVsbCkgewotCQkJaWYgKG1hcHBpbmdLZXkgID09IGN1cnJlbnRNYXBwaW5nS2V5KSB7Ci0JCQkJaWYgKHZpc2libGVNYXBwaW5nQ29tcG9zaXRlICE9IG51bGwpIHsKLQkJCQkJdmlzaWJsZU1hcHBpbmdDb21wb3NpdGUucG9wdWxhdGUocGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCXZpc2libGVNYXBwaW5nQ29tcG9zaXRlLnBvcHVsYXRlKG51bGwpOwotCQkJCS8vIGRvbid0IHJldHVybgotCQkJfQotCQl9Ci0JCQotCQljdXJyZW50TWFwcGluZ0tleSA9IG1hcHBpbmdLZXk7Ci0JCQotCQlJSnBhQ29tcG9zaXRlIG1hcHBpbmdDb21wb3NpdGUgPSBtYXBwaW5nQ29tcG9zaXRlRm9yKG1hcHBpbmdLZXkpOwotCQl0eXBlTWFwcGluZ1BhZ2VCb29rLnNob3dQYWdlKG1hcHBpbmdDb21wb3NpdGUuZ2V0Q29udHJvbCgpKTsKLQkJCi0JCXZpc2libGVNYXBwaW5nQ29tcG9zaXRlID0gbWFwcGluZ0NvbXBvc2l0ZTsKLQkJdmlzaWJsZU1hcHBpbmdDb21wb3NpdGUucG9wdWxhdGUocGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldENvbWJvRGF0YShTdHJpbmcgbWFwcGluZ0tleSwgSXRlcmF0b3IgYXZhaWxhYmxlTWFwcGluZ0tleXMpIHsKLQkJaWYgKHBlcnNpc3RlbnRUeXBlICE9IHR5cGVNYXBwaW5nQ29tYm8uZ2V0SW5wdXQoKSkgewotCQkJdHlwZU1hcHBpbmdDb21iby5zZXRJbnB1dChwZXJzaXN0ZW50VHlwZSk7Ci0JCX0KLQkJCi0JCUlUeXBlTWFwcGluZ1VpUHJvdmlkZXIgcHJvdmlkZXIgPSB0eXBlTWFwcGluZ1VpUHJvdmlkZXIobWFwcGluZ0tleSk7Ci0JCWlmICghIHByb3ZpZGVyLmVxdWFscygoKFN0cnVjdHVyZWRTZWxlY3Rpb24pIHR5cGVNYXBwaW5nQ29tYm8uZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpKSkgewotCQkJdHlwZU1hcHBpbmdDb21iby5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24ocHJvdmlkZXIpKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIElKcGFDb21wb3NpdGUgbWFwcGluZ0NvbXBvc2l0ZUZvcihTdHJpbmcga2V5KSB7Ci0JCUlKcGFDb21wb3NpdGUgbWFwcGluZ0NvbXBvc2l0ZSA9IChJSnBhQ29tcG9zaXRlKSBjb21wb3NpdGVzLmdldChrZXkpOwotCQlpZiAobWFwcGluZ0NvbXBvc2l0ZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbWFwcGluZ0NvbXBvc2l0ZTsKLQkJfQotCQkKLQkJbWFwcGluZ0NvbXBvc2l0ZSA9IGJ1aWxkTWFwcGluZ0NvbXBvc2l0ZSh0eXBlTWFwcGluZ1BhZ2VCb29rLCBrZXkpOwotCQkKLQkJaWYgKG1hcHBpbmdDb21wb3NpdGUgIT0gbnVsbCkgewotCQkJY29tcG9zaXRlcy5wdXQoa2V5LCBtYXBwaW5nQ29tcG9zaXRlKTsKLQkJfQotCQkKLQkJcmV0dXJuIG1hcHBpbmdDb21wb3NpdGU7Ci0JfQotCQotCXByb3RlY3RlZCBJSnBhQ29tcG9zaXRlIGJ1aWxkTWFwcGluZ0NvbXBvc2l0ZShQYWdlQm9vayBwYWdlQm9vaywgU3RyaW5nIGtleSkgIHsKLQkJLy9UT0RPIHdoYXQgYWJvdXQgbnVsbCBjb21wb3NpdGU/Ci0JCXJldHVybiB0eXBlTWFwcGluZ1VpUHJvdmlkZXIoa2V5KS5idWlsZFBlcnNpc3RlbnRUeXBlTWFwcGluZ0NvbXBvc2l0ZShwYWdlQm9vaywgdGhpcy5jb21tYW5kU3RhY2ssIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0vLwkJcmV0dXJuIG5ldyBOdWxsQ29tcG9zaXRlKHBhZ2VCb29rLCBjb21tYW5kU3RhY2spOwotCX0KLQotLy9UT0RPIGZvY3VzPz8KLS8vCXB1YmxpYyBib29sZWFuIHNldEZvY3VzKCkgewotLy8JCXN1cGVyLnNldEZvY3VzKCk7Ci0vLwkJcmV0dXJuIHR5cGVNYXBwaW5nQ29tYm8uZ2V0Q29tYm8oKS5zZXRGb2N1cygpOwotLy8JfQotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWRpc2VuZ2FnZUxpc3RlbmVycygpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBjb21wb3NpdGVzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApIHsKLQkJCSgoSUpwYUNvbXBvc2l0ZSkgaS5uZXh0KCkpLmRpc3Bvc2UoKTsKLQkJfQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCQotCXB1YmxpYyBJUGVyc2lzdGVudFR5cGUgZ2V0UGVyc2lzdGVudFR5cGUoKSB7Ci0JCXJldHVybiBwZXJzaXN0ZW50VHlwZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RpYWxvZ3MvQWRkUGVyc2lzdGVudEF0dHJpYnV0ZVRvWG1sQW5kTWFwRGlhbG9nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kaWFsb2dzL0FkZFBlcnNpc3RlbnRBdHRyaWJ1dGVUb1htbEFuZE1hcERpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWM3NTUwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RpYWxvZ3MvQWRkUGVyc2lzdGVudEF0dHJpYnV0ZVRvWG1sQW5kTWFwRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTMgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5TdGF0dXNEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklKcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQub3JtLlhtbFBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLmRldGFpbHMuSUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLm1hcHBpbmdzLnByb3BlcnRpZXMuQmFzaWNNYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamF2YS5tYXBwaW5ncy5wcm9wZXJ0aWVzLkVtYmVkZGVkSWRNYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamF2YS5tYXBwaW5ncy5wcm9wZXJ0aWVzLkVtYmVkZGVkTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEubWFwcGluZ3MucHJvcGVydGllcy5JZE1hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLm1hcHBpbmdzLnByb3BlcnRpZXMuTWFueVRvTWFueU1hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLm1hcHBpbmdzLnByb3BlcnRpZXMuTWFueVRvT25lTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEubWFwcGluZ3MucHJvcGVydGllcy5PbmVUb01hbnlNYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamF2YS5tYXBwaW5ncy5wcm9wZXJ0aWVzLk9uZVRvT25lTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEubWFwcGluZ3MucHJvcGVydGllcy5UcmFuc2llbnRNYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamF2YS5tYXBwaW5ncy5wcm9wZXJ0aWVzLlZlcnNpb25NYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBBZGRQZXJzaXN0ZW50QXR0cmlidXRlVG9YbWxBbmRNYXBEaWFsb2cgZXh0ZW5kcyBTdGF0dXNEaWFsb2cKLXsKLQlwcml2YXRlIFhtbFBlcnNpc3RlbnRBdHRyaWJ1dGUgdW5tYXBwZWRQZXJzaXN0ZW50QXR0cmlidXRlOwotCQotCXByaXZhdGUgTGFiZWwgYXR0cmlidXRlTGFiZWw7Ci0JCQotCXByaXZhdGUgVGV4dCBhdHRyaWJ1dGVUZXh0OwotCQotCXByaXZhdGUgTGFiZWwgbWFwcGluZ0xhYmVsOwotCQotCXByaXZhdGUgQ29tYm9WaWV3ZXIgbWFwcGluZ0NvbWJvOwotCQkKLQkKLQlwdWJsaWMgQWRkUGVyc2lzdGVudEF0dHJpYnV0ZVRvWG1sQW5kTWFwRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBYbWxQZXJzaXN0ZW50QXR0cmlidXRlIHVubWFwcGVkUGVyc2lzdGVudEF0dHJpYnV0ZSkgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCXRoaXMudW5tYXBwZWRQZXJzaXN0ZW50QXR0cmlidXRlID0gdW5tYXBwZWRQZXJzaXN0ZW50QXR0cmlidXRlOwotCQlzZXRUaXRsZShKcHRVaU1lc3NhZ2VzLkFkZFBlcnNpc3RlbnRBdHRyaWJ1dGVEaWFsb2dfdGl0bGUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGRpYWxvZ0FyZWEgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShkaWFsb2dBcmVhLCBTV1QuTlVMTCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJCi0JCWF0dHJpYnV0ZUxhYmVsID0gY3JlYXRlTGFiZWwoY29tcG9zaXRlLCAxLCBKcHRVaU1lc3NhZ2VzLkFkZFBlcnNpc3RlbnRBdHRyaWJ1dGVEaWFsb2dfYXR0cmlidXRlTGFiZWwpOwotCQkJCi0JCWF0dHJpYnV0ZVRleHQgPSBjcmVhdGVUZXh0KGNvbXBvc2l0ZSwgMSk7Ci0vLwkJYXR0cmlidXRlVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcigKLS8vCQkJCW5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLS8vCQkJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLS8vCQkJCQkJdmFsaWRhdGUoKTsKLS8vCQkJCQl9Ci0vLwkJCQl9Ci0vLwkJCSk7Ci0JCWF0dHJpYnV0ZVRleHQuc2V0VGV4dCh1bm1hcHBlZFBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXR0cmlidXRlVGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCQotCQltYXBwaW5nTGFiZWwgPSBjcmVhdGVMYWJlbChjb21wb3NpdGUsIDEsIEpwdFVpTWVzc2FnZXMuQWRkUGVyc2lzdGVudENsYXNzRGlhbG9nX21hcHBpbmdMYWJlbCk7Ci0JCQotCQltYXBwaW5nQ29tYm8gPSBuZXcgQ29tYm9WaWV3ZXIoY3JlYXRlQ29tYm8oY29tcG9zaXRlLCAxKSk7Ci0JCW1hcHBpbmdDb21iby5zZXRDb250ZW50UHJvdmlkZXIoCi0JCQluZXcgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHt9Ci0JCQkJCi0JCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7Ci0JCQkJCQlCYXNpY01hcHBpbmdVaVByb3ZpZGVyLmluc3RhbmNlKCksCi0JCQkJCQlJZE1hcHBpbmdVaVByb3ZpZGVyLmluc3RhbmNlKCksCi0JCQkJCQlWZXJzaW9uTWFwcGluZ1VpUHJvdmlkZXIuaW5zdGFuY2UoKSwKLQkJCQkJCU9uZVRvT25lTWFwcGluZ1VpUHJvdmlkZXIuaW5zdGFuY2UoKSwKLQkJCQkJCU9uZVRvTWFueU1hcHBpbmdVaVByb3ZpZGVyLmluc3RhbmNlKCksCi0JCQkJCQlNYW55VG9PbmVNYXBwaW5nVWlQcm92aWRlci5pbnN0YW5jZSgpLAotCQkJCQkJTWFueVRvTWFueU1hcHBpbmdVaVByb3ZpZGVyLmluc3RhbmNlKCksCi0JCQkJCQlFbWJlZGRlZE1hcHBpbmdVaVByb3ZpZGVyLmluc3RhbmNlKCksCi0JCQkJCQlFbWJlZGRlZElkTWFwcGluZ1VpUHJvdmlkZXIuaW5zdGFuY2UoKSwKLQkJCQkJCVRyYW5zaWVudE1hcHBpbmdVaVByb3ZpZGVyLmluc3RhbmNlKCkKLQkJCQkJfTsKLQkJCQl9Ci0JCQkJCi0JCQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7fQotCQkJfSk7Ci0JCW1hcHBpbmdDb21iby5zZXRMYWJlbFByb3ZpZGVyKAotCQkJbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJCXJldHVybiAoKElBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcikgZWxlbWVudCkubGFiZWwoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJbWFwcGluZ0NvbWJvLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJdmFsaWRhdGUoKTsKLQkJCX0KLQkJfSk7Ci0JCW1hcHBpbmdDb21iby5zZXRJbnB1dCgiRk9PIik7Ci0JCW1hcHBpbmdDb21iby5nZXRDb21ibygpLnNlbGVjdCgwKTsgIC8vIHNlbGVjdCBCYXNpYyB0byBiZWdpbgotCQkKLQkJLy8gVE9ETyAtIEYxIEhlbHAKLQkJLy8gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChncm91cCwgSURhbGlIZWxwQ29udGV4dElkcy5ORVdfSlBBX1BST0pFQ1RfQ09OVEVOVF9QQUdFX0RBVEFCQVNFKTsKLQkJCi0JCS8vZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpLnNldEVuYWJsZWQoZmFsc2UpOyAgLy8gZGlzYWJsZWQgdG8gc3RhcnQKLQkJYXBwbHlEaWFsb2dGb250KGRpYWxvZ0FyZWEpOwkJCi0JCQotCQl2YWxpZGF0ZSgpOwotCQkKLQkJcmV0dXJuIGRpYWxvZ0FyZWE7Ci0JfQotCQotCXByaXZhdGUgTGFiZWwgY3JlYXRlTGFiZWwoQ29tcG9zaXRlIGNvbnRhaW5lciwgaW50IHNwYW4sIFN0cmluZyB0ZXh0KSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbnRhaW5lciwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KHRleHQpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IHNwYW47Ci0JCWxhYmVsLnNldExheW91dERhdGEoZ2QpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCQotCXByaXZhdGUgVGV4dCBjcmVhdGVUZXh0KENvbXBvc2l0ZSBjb250YWluZXIsIGludCBzcGFuKSB7Ci0JCVRleHQgdGV4dCA9IG5ldyBUZXh0KGNvbnRhaW5lciwgU1dULkJPUkRFUiB8IFNXVC5TSU5HTEUpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IHNwYW47Ci0JCWdkLndpZHRoSGludCA9IDI1MDsKLQkJdGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCQotCXByaXZhdGUgQ29tYm8gY3JlYXRlQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lciwgaW50IHNwYW4pIHsKLQkJQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8oY29udGFpbmVyLCBTV1QuQk9SREVSIHwgU1dULlNJTkdMRSB8IFNXVC5SRUFEX09OTFkpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IHNwYW47Ci0JCWNvbWJvLnNldExheW91dERhdGEoZ2QpOwotCQlyZXR1cm4gY29tYm87Ci0JfQotCQotCXByaXZhdGUgSUpwYVByb2plY3QgZ2V0SnBhUHJvamVjdCgpIHsKLQkJcmV0dXJuIHVubWFwcGVkUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKcGFQcm9qZWN0KCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZSgpIHsKLQkJcmV0dXJuIGF0dHJpYnV0ZVRleHQuZ2V0VGV4dCgpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7Ci0JCVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pIG1hcHBpbmdDb21iby5nZXRTZWxlY3Rpb24oKTsKLQkJcmV0dXJuIChzZWxlY3Rpb24uaXNFbXB0eSgpKSA/IG51bGwgOiAoKElBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcikgc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpKS5rZXkoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlKCkgewotLy8JCWlmIChlbnRpdHlNYXBwaW5ncy5jb250YWluc1BlcnNpc3RlbnRUeXBlKHR5cGUpKSB7Ci0vLwkJCXVwZGF0ZVN0YXR1cygKLS8vCQkJCW5ldyBTdGF0dXMoCi0vLwkJCQkJSVN0YXR1cy5XQVJOSU5HLCBKcHRVaVBsdWdpbi5QTFVHSU5fSUQsIAotLy8JCQkJCUpwdFVpTWVzc2FnZXMuQWRkUGVyc2lzdGVudENsYXNzRGlhbG9nX2R1cGxpY2F0ZUNsYXNzV2FybmluZykpOwotLy8JCQlyZXR1cm47Ci0vLwkJfQotLy8JCQotCQlTdHJpbmcgbWFwcGluZ0tleSA9IGdldE1hcHBpbmdLZXkoKTsKLQkJaWYgKG1hcHBpbmdLZXkgPT0gbnVsbCkgewotCQkJdXBkYXRlU3RhdHVzKAotCQkJCW5ldyBTdGF0dXMoCi0JCQkJCUlTdGF0dXMuRVJST1IsIEpwdFVpUGx1Z2luLlBMVUdJTl9JRCwKLQkJCQkJSnB0VWlNZXNzYWdlcy5BZGRQZXJzaXN0ZW50QXR0cmlidXRlRGlhbG9nX25vTWFwcGluZ0tleUVycm9yKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXVwZGF0ZVN0YXR1cyhTdGF0dXMuT0tfU1RBVFVTKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotCQl1bm1hcHBlZFBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShnZXRNYXBwaW5nS2V5KCkpOwotCQl1bm1hcHBlZFBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0VmlydHVhbChmYWxzZSk7Ci0JCXN1cGVyLm9rUHJlc3NlZCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RpYWxvZ3MvQWRkUGVyc2lzdGVudENsYXNzRGlhbG9nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9kaWFsb2dzL0FkZFBlcnNpc3RlbnRDbGFzc0RpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmQ5NTViLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2RpYWxvZ3MvQWRkUGVyc2lzdGVudENsYXNzRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCi0gKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoRW5naW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5JSmF2YUVsZW1lbnRTZWFyY2hDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlN0YXR1c0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50Lm9ybS5FbnRpdHlNYXBwaW5nc0ludGVybmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamF2YS5kZXRhaWxzLklUeXBlTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEubWFwcGluZ3MucHJvcGVydGllcy5FbWJlZGRhYmxlVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamF2YS5tYXBwaW5ncy5wcm9wZXJ0aWVzLkVudGl0eVVpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEubWFwcGluZ3MucHJvcGVydGllcy5NYXBwZWRTdXBlcmNsYXNzVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcm9ncmVzcy5JUHJvZ3Jlc3NTZXJ2aWNlOwotCi1wdWJsaWMgY2xhc3MgQWRkUGVyc2lzdGVudENsYXNzRGlhbG9nIGV4dGVuZHMgU3RhdHVzRGlhbG9nCi17Ci0JcHJpdmF0ZSBFbnRpdHlNYXBwaW5nc0ludGVybmFsIGVudGl0eU1hcHBpbmdzOwotCQotCXByaXZhdGUgTGFiZWwgY2xhc3NMYWJlbDsKLQkJCi0JcHJpdmF0ZSBUZXh0IGNsYXNzVGV4dDsKLQkKLQlwcml2YXRlIEJ1dHRvbiBjbGFzc0Jyb3dzZUJ1dHRvbjsKLQkKLQlwcml2YXRlIExhYmVsIG1hcHBpbmdMYWJlbDsKLQkKLQlwcml2YXRlIENvbWJvVmlld2VyIG1hcHBpbmdDb21ibzsKLQkJCi0JCi0JcHVibGljIEFkZFBlcnNpc3RlbnRDbGFzc0RpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgRW50aXR5TWFwcGluZ3NJbnRlcm5hbCBlbnRpdHlNYXBwaW5ncykgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCXRoaXMuZW50aXR5TWFwcGluZ3MgPSBlbnRpdHlNYXBwaW5nczsKLQkJc2V0VGl0bGUoSnB0VWlNZXNzYWdlcy5BZGRQZXJzaXN0ZW50Q2xhc3NEaWFsb2dfdGl0bGUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGRpYWxvZ0FyZWEgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShkaWFsb2dBcmVhLCBTV1QuTlVMTCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQkKLQkJY2xhc3NMYWJlbCA9IGNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgMiwgSnB0VWlNZXNzYWdlcy5BZGRQZXJzaXN0ZW50Q2xhc3NEaWFsb2dfY2xhc3NMYWJlbCk7Ci0JCQkKLQkJY2xhc3NUZXh0ID0gY3JlYXRlVGV4dChjb21wb3NpdGUsIDEpOwotCQljbGFzc1RleHQuYWRkTW9kaWZ5TGlzdGVuZXIoCi0JCQkJbmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQkJCXZhbGlkYXRlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkpOwotCQkKLQkJY2xhc3NCcm93c2VCdXR0b24gPSBjcmVhdGVCdXR0b24oY29tcG9zaXRlLCAxLCBKcHRVaU1lc3NhZ2VzLkdlbmVyYWxfYnJvd3NlKTsKLQkJY2xhc3NCcm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUlUeXBlIHR5cGUgPSBjaG9vc2VUeXBlKCk7Ci0JCQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJCQljbGFzc1RleHQuc2V0VGV4dCh0eXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXdpZGdldFNlbGVjdGVkKGUpOwotCQkJfQotCQl9KTsKLQkJCi0JCW1hcHBpbmdMYWJlbCA9IGNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgMiwgSnB0VWlNZXNzYWdlcy5BZGRQZXJzaXN0ZW50Q2xhc3NEaWFsb2dfbWFwcGluZ0xhYmVsKTsKLQkJCi0JCW1hcHBpbmdDb21ibyA9IG5ldyBDb21ib1ZpZXdlcihjcmVhdGVDb21ibyhjb21wb3NpdGUsIDIpKTsKLQkJbWFwcGluZ0NvbWJvLnNldENvbnRlbnRQcm92aWRlcigKLQkJCW5ldyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkge30KLQkJCQkKLQkJCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQkJCQlyZXR1cm4gbmV3IE9iamVjdFtdIHsKLQkJCQkJCW5ldyBNYXBwZWRTdXBlcmNsYXNzVWlQcm92aWRlcigpLCAKLQkJCQkJCW5ldyBFbnRpdHlVaVByb3ZpZGVyKCksIAotCQkJCQkJbmV3IEVtYmVkZGFibGVVaVByb3ZpZGVyKCkKLQkJCQkJfTsKLQkJCQl9Ci0JCQkJCi0JCQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7fQotCQkJfSk7Ci0JCW1hcHBpbmdDb21iby5zZXRMYWJlbFByb3ZpZGVyKAotCQkJbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJCXJldHVybiAoKElUeXBlTWFwcGluZ1VpUHJvdmlkZXIpIGVsZW1lbnQpLmxhYmVsKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCW1hcHBpbmdDb21iby5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCXZhbGlkYXRlKCk7Ci0JCQl9Ci0JCX0pOwotCQltYXBwaW5nQ29tYm8uc2V0SW5wdXQoIkZPTyIpOwotCQltYXBwaW5nQ29tYm8uZ2V0Q29tYm8oKS5zZWxlY3QoMSk7ICAvLyBzZWxlY3QgRW50aXR5IHRvIGJlZ2luCi0JCQotCQkvLyBUT0RPIC0gRjEgSGVscAotCQkvLyBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGdyb3VwLCBJRGFsaUhlbHBDb250ZXh0SWRzLk5FV19KUEFfUFJPSkVDVF9DT05URU5UX1BBR0VfREFUQUJBU0UpOwotCQkKLQkJLy9nZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5PS19JRCkuc2V0RW5hYmxlZChmYWxzZSk7ICAvLyBkaXNhYmxlZCB0byBzdGFydAotCQlhcHBseURpYWxvZ0ZvbnQoZGlhbG9nQXJlYSk7CQkKLQkJCi0JCXZhbGlkYXRlKCk7Ci0JCQotCQlyZXR1cm4gZGlhbG9nQXJlYTsKLQl9Ci0JCi0JcHJpdmF0ZSBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgY29udGFpbmVyLCBpbnQgc3BhbiwgU3RyaW5nIHRleHQpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29udGFpbmVyLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQodGV4dCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gc3BhbjsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0JCi0JcHJpdmF0ZSBUZXh0IGNyZWF0ZVRleHQoQ29tcG9zaXRlIGNvbnRhaW5lciwgaW50IHNwYW4pIHsKLQkJVGV4dCB0ZXh0ID0gbmV3IFRleHQoY29udGFpbmVyLCBTV1QuQk9SREVSIHwgU1dULlNJTkdMRSk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gc3BhbjsKLQkJZ2Qud2lkdGhIaW50ID0gMjUwOwotCQl0ZXh0LnNldExheW91dERhdGEoZ2QpOwotCQlyZXR1cm4gdGV4dDsKLQl9Ci0JCi0JcHJpdmF0ZSBCdXR0b24gY3JlYXRlQnV0dG9uKENvbXBvc2l0ZSBjb250YWluZXIsIGludCBzcGFuLCBTdHJpbmcgdGV4dCkgewotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihjb250YWluZXIsIFNXVC5OT05FKTsKLQkJYnV0dG9uLnNldFRleHQodGV4dCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gc3BhbjsKLQkJYnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQlyZXR1cm4gYnV0dG9uOwotCX0KLQkKLQlwcml2YXRlIENvbWJvIGNyZWF0ZUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIsIGludCBzcGFuKSB7Ci0JCUNvbWJvIGNvbWJvID0gbmV3IENvbWJvKGNvbnRhaW5lciwgU1dULkJPUkRFUiB8IFNXVC5TSU5HTEUgfCBTV1QuUkVBRF9PTkxZKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSBzcGFuOwotCQljb21iby5zZXRMYXlvdXREYXRhKGdkKTsKLQkJcmV0dXJuIGNvbWJvOwotCX0KLQkKLQlwcml2YXRlIElKcGFQcm9qZWN0IGdldEpwYVByb2plY3QoKSB7Ci0JCXJldHVybiBlbnRpdHlNYXBwaW5ncy5nZXRKcGFQcm9qZWN0KCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotCQlyZXR1cm4gY2xhc3NUZXh0LmdldFRleHQoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRNYXBwaW5nS2V5KCkgewotCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBtYXBwaW5nQ29tYm8uZ2V0U2VsZWN0aW9uKCk7Ci0JCXJldHVybiAoc2VsZWN0aW9uLmlzRW1wdHkoKSkgPyBudWxsIDogKChJVHlwZU1hcHBpbmdVaVByb3ZpZGVyKSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkpLmtleSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSVR5cGUgY2hvb3NlVHlwZSgpIHsKLQkJSUphdmFFbGVtZW50W10gZWxlbWVudHM9IG5ldyBJSmF2YUVsZW1lbnRbXSB7IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUHJvamVjdCgpIH07Ci0JCUlKYXZhU2VhcmNoU2NvcGUgc2NvcGU9IFNlYXJjaEVuZ2luZS5jcmVhdGVKYXZhU2VhcmNoU2NvcGUoZWxlbWVudHMpOwotCQlJUHJvZ3Jlc3NTZXJ2aWNlIHNlcnZpY2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFByb2dyZXNzU2VydmljZSgpOwotCQkKLQkJU2VsZWN0aW9uRGlhbG9nIHR5cGVTZWxlY3Rpb25EaWFsb2c7Ci0JCXRyeSB7Ci0JCQl0eXBlU2VsZWN0aW9uRGlhbG9nID0gCi0JCQkJSmF2YVVJLmNyZWF0ZVR5cGVEaWFsb2coCi0JCQkJCQlnZXRTaGVsbCgpLCBzZXJ2aWNlLCBzY29wZSwgCi0JCQkJCQlJSmF2YUVsZW1lbnRTZWFyY2hDb25zdGFudHMuQ09OU0lERVJfQ0xBU1NFUywgCi0JCQkJCQlmYWxzZSwgZ2V0Q2xhc3NOYW1lKCkpOwotCQl9Ci0JCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJSnB0VWlQbHVnaW4ubG9nKGUpOwotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0JCX0KLQkJdHlwZVNlbGVjdGlvbkRpYWxvZy5zZXRUaXRsZShKcHRVaU1lc3NhZ2VzLkFkZFBlcnNpc3RlbnRDbGFzc0RpYWxvZ19jbGFzc0RpYWxvZ190aXRsZSk7IAotCQl0eXBlU2VsZWN0aW9uRGlhbG9nLnNldE1lc3NhZ2UoSnB0VWlNZXNzYWdlcy5BZGRQZXJzaXN0ZW50Q2xhc3NEaWFsb2dfY2xhc3NEaWFsb2dfbWVzc2FnZSk7IAotCi0JCWlmICh0eXBlU2VsZWN0aW9uRGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCXJldHVybiAoSVR5cGUpIHR5cGVTZWxlY3Rpb25EaWFsb2cuZ2V0UmVzdWx0KClbMF07Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZSgpIHsKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IGdldENsYXNzTmFtZSgpOwotCQkKLQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoY2xhc3NOYW1lKSkgewotCQkJdXBkYXRlU3RhdHVzKAotCQkJCW5ldyBTdGF0dXMoCi0JCQkJCUlTdGF0dXMuRVJST1IsIEpwdFVpUGx1Z2luLlBMVUdJTl9JRCwgCi0JCQkJCUpwdFVpTWVzc2FnZXMuQWRkUGVyc2lzdGVudENsYXNzRGlhbG9nX25vQ2xhc3NFcnJvcikpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlJVHlwZSB0eXBlOwotCQl0cnkgewotCQkJdHlwZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKGNsYXNzTmFtZSk7Ci0JCX0KLQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLQkJCXR5cGUgPSBudWxsOwotCQl9Ci0JCQotCQlpZiAodHlwZSA9PSBudWxsKSB7Ci0JCQl1cGRhdGVTdGF0dXMoCi0JCQkJbmV3IFN0YXR1cygKLQkJCQkJSVN0YXR1cy5XQVJOSU5HLCBKcHRVaVBsdWdpbi5QTFVHSU5fSUQsCi0JCQkJCUpwdFVpTWVzc2FnZXMuQWRkUGVyc2lzdGVudENsYXNzRGlhbG9nX2NsYXNzTm90Rm91bmRXYXJuaW5nKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmIChlbnRpdHlNYXBwaW5ncy5jb250YWluc1BlcnNpc3RlbnRUeXBlKHR5cGUpKSB7Ci0JCQl1cGRhdGVTdGF0dXMoCi0JCQkJbmV3IFN0YXR1cygKLQkJCQkJSVN0YXR1cy5XQVJOSU5HLCBKcHRVaVBsdWdpbi5QTFVHSU5fSUQsIAotCQkJCQlKcHRVaU1lc3NhZ2VzLkFkZFBlcnNpc3RlbnRDbGFzc0RpYWxvZ19kdXBsaWNhdGVDbGFzc1dhcm5pbmcpKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJU3RyaW5nIG1hcHBpbmdLZXkgPSBnZXRNYXBwaW5nS2V5KCk7Ci0JCWlmIChtYXBwaW5nS2V5ID09IG51bGwpIHsKLQkJCXVwZGF0ZVN0YXR1cygKLQkJCQluZXcgU3RhdHVzKAotCQkJCQlJU3RhdHVzLkVSUk9SLCBKcHRVaVBsdWdpbi5QTFVHSU5fSUQsCi0JCQkJCUpwdFVpTWVzc2FnZXMuQWRkUGVyc2lzdGVudENsYXNzRGlhbG9nX25vTWFwcGluZ0tleUVycm9yKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXVwZGF0ZVN0YXR1cyhTdGF0dXMuT0tfU1RBVFVTKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotCQllbnRpdHlNYXBwaW5ncy5hZGRNYXBwaW5nKGdldENsYXNzTmFtZSgpLCBnZXRNYXBwaW5nS2V5KCkpOwotCQlzdXBlci5va1ByZXNzZWQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9nZW5lcmljL0VudGl0aWVzR2VuZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9nZW5lcmljL0VudGl0aWVzR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1ZmU3MWMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvZ2VuZXJpYy9FbnRpdGllc0dlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZ2VuZXJpYzsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklKcGFGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklKcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnN5bmNoLlN5bmNocm9uaXplQ2xhc3Nlc0pvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsLkVudGl0eUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsLlBhY2thZ2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHMuR2VuZXJhdGVFbnRpdGllc1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiAgRW50aXRpZXNHZW5lcmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEVudGl0aWVzR2VuZXJhdG9yCi17Ci0JcHJpdmF0ZSBJSnBhUHJvamVjdCBwcm9qZWN0OwotCXByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uOwotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0Jc3RhdGljIHB1YmxpYyB2b2lkIGdlbmVyYXRlKCBJSnBhUHJvamVjdCBwcm9qZWN0LCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYocHJvamVjdCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQluZXcgRW50aXRpZXNHZW5lcmF0b3IoIHByb2plY3QsIHNlbGVjdGlvbikuZ2VuZXJhdGUoKTsKLQl9Ci0JCi0JcHVibGljIEVudGl0aWVzR2VuZXJhdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByaXZhdGUgRW50aXRpZXNHZW5lcmF0b3IoIElKcGFQcm9qZWN0IHByb2plY3QsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzdXBlcigpOwotCQl0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCXByb3RlY3RlZCB2b2lkIGdlbmVyYXRlKCkgewotCQlHZW5lcmF0ZUVudGl0aWVzV2l6YXJkIHdpemFyZCA9IG5ldyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkKHRoaXMucHJvamVjdCwgdGhpcy5zZWxlY3Rpb24pOwotCQkKLQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2codGhpcy5nZXRDdXJyZW50U2hlbGwoKSwgd2l6YXJkKTsKLQkJZGlhbG9nLmNyZWF0ZSgpOwotCQlpbnQgcmV0dXJuQ29kZSA9IGRpYWxvZy5vcGVuKCk7Ci0JCWlmIChyZXR1cm5Db2RlID09IFdpbmRvdy5PSykgewotCQkJSVdvcmtzcGFjZVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IEdlbmVyYXRlRW50aXRpZXNSdW5uYWJsZSgKLQkJCQkJd2l6YXJkLmdldFBhY2thZ2VHZW5lcmF0b3JDb25maWcoKSwKLQkJCQkJd2l6YXJkLmdldEVudGl0eUdlbmVyYXRvckNvbmZpZygpLAotCQkJCQl3aXphcmQuZ2V0U2VsZWN0ZWRUYWJsZXMoKSwKLQkJCQkJd2l6YXJkLnN5bmNocm9uaXplUGVyc2lzdGVuY2VYbWwoKSwKLQkJCQkJcHJvamVjdCwKLQkJCQkJbmV3IE92ZXJ3cml0ZUNvbmZpcm1lcih0aGlzLmdldEN1cnJlbnRTaGVsbCgpKQotCQkJKTsKLQkJCXRyeSB7Ci0JCQkJLy8gVE9ETyBwYXNzIGluIHJlYWwgUHJvZ3Jlc3NNb25pdG9yCi0JCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bihydW5uYWJsZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgU2hlbGwgZ2V0Q3VycmVudFNoZWxsKCkgewotCSAgICByZXR1cm4gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKTsKLQl9Ci0JICAKLQkvLyAqKioqKioqKioqIHJ1bm5hYmxlICoqKioqKioqKioKLQotCXN0YXRpYyBjbGFzcyBHZW5lcmF0ZUVudGl0aWVzUnVubmFibGUgaW1wbGVtZW50cyBJV29ya3NwYWNlUnVubmFibGUgewotCQlwcml2YXRlIGZpbmFsIFBhY2thZ2VHZW5lcmF0b3IuQ29uZmlnIHBhY2thZ2VDb25maWc7Ci0JCXByaXZhdGUgZmluYWwgRW50aXR5R2VuZXJhdG9yLkNvbmZpZyBlbnRpdHlDb25maWc7Ci0JCXByaXZhdGUgZmluYWwgQ29sbGVjdGlvbiBzZWxlY3RlZFRhYmxlczsKLQkJcHJpdmF0ZSBmaW5hbCBib29sZWFuIHN5bmNocm9uaXplUGVyc2lzdGVuY2VYbWw7Ci0JCXByaXZhdGUgZmluYWwgRW50aXR5R2VuZXJhdG9yLk92ZXJ3cml0ZUNvbmZpcm1lciBvdmVyd3JpdGVDb25maXJtZXI7Ci0JCXByaXZhdGUgZmluYWwgSUpwYVByb2plY3QgcHJvamVjdDsKLQkJCi0JCUdlbmVyYXRlRW50aXRpZXNSdW5uYWJsZSgKLQkJCQlQYWNrYWdlR2VuZXJhdG9yLkNvbmZpZyBwYWNrYWdlQ29uZmlnLAotCQkJCUVudGl0eUdlbmVyYXRvci5Db25maWcgZW50aXR5Q29uZmlnLAotCQkJCUNvbGxlY3Rpb24gc2VsZWN0ZWRUYWJsZXMsCi0JCQkJYm9vbGVhbiBzeW5jaHJvbml6ZVBlcnNpc3RlbmNlWG1sLAotCQkJCUlKcGFQcm9qZWN0IHByb2plY3QsCi0JCQkJRW50aXR5R2VuZXJhdG9yLk92ZXJ3cml0ZUNvbmZpcm1lciBvdmVyd3JpdGVDb25maXJtZXIKLQkJKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5wYWNrYWdlQ29uZmlnID0gcGFja2FnZUNvbmZpZzsKLQkJCXRoaXMuZW50aXR5Q29uZmlnID0gZW50aXR5Q29uZmlnOwotCQkJdGhpcy5zZWxlY3RlZFRhYmxlcyA9IHNlbGVjdGVkVGFibGVzOwotCQkJdGhpcy5zeW5jaHJvbml6ZVBlcnNpc3RlbmNlWG1sID0gc3luY2hyb25pemVQZXJzaXN0ZW5jZVhtbDsKLQkJCXRoaXMub3ZlcndyaXRlQ29uZmlybWVyID0gb3ZlcndyaXRlQ29uZmlybWVyOwotCQkJdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCW1vbml0b3IuYmVnaW5UYXNrKCIiLCAxMDAwKTsKLQkJCXRyeSB7Ci0JCQkJUGFja2FnZUdlbmVyYXRvci5nZW5lcmF0ZUVudGl0aWVzKHRoaXMucGFja2FnZUNvbmZpZywgdGhpcy5lbnRpdHlDb25maWcsIHRoaXMuc2VsZWN0ZWRUYWJsZXMsIHRoaXMub3ZlcndyaXRlQ29uZmlybWVyLCBtb25pdG9yKTsKLQkJCQlpZiAoc3luY2hyb25pemVQZXJzaXN0ZW5jZVhtbCkgewotCQkJCQkvLyB3ZSBjdXJyZW50bHkgb25seSBzdXBwb3J0ICpvbmUqIHBlcnNpc3RlbmNlLnhtbCBmaWxlIHBlciBwcm9qZWN0Ci0JCQkJCUlKcGFGaWxlIHJlc291cmNlID0gcHJvamVjdC5nZXRQbGF0Zm9ybSgpLnZhbGlkUGVyc2lzdGVuY2VYbWxGaWxlcygpLm5leHQoKTsKLQkJCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJCVN5bmNocm9uaXplQ2xhc3Nlc0pvYiBqb2IgPSBuZXcgU3luY2hyb25pemVDbGFzc2VzSm9iKHJlc291cmNlLmdldEZpbGUoKSk7Ci0JCQkJCQlqb2Iuc2NoZWR1bGUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQkJLy8gZmFsbCB0aHJvdWdoIGFuZCB0ZWxsIG1vbml0b3Igd2UgYXJlIGRvbmUKLQkJCX0KLQkJCW1vbml0b3IuZG9uZSgpOwotCQl9Ci0KLQl9Ci0KLQkvLyAqKioqKioqKioqIG92ZXJ3cml0ZSBjb25maXJtZXIgKioqKioqKioqKgotCi0Jc3RhdGljIGNsYXNzIE92ZXJ3cml0ZUNvbmZpcm1lciBpbXBsZW1lbnRzIEVudGl0eUdlbmVyYXRvci5PdmVyd3JpdGVDb25maXJtZXIgewotCQlwcml2YXRlIFNoZWxsIHNoZWxsOwotCQlwcml2YXRlIGJvb2xlYW4gb3ZlcndyaXRlQWxsID0gZmFsc2U7Ci0JCXByaXZhdGUgYm9vbGVhbiBza2lwQWxsID0gZmFsc2U7Ci0KLQkJT3ZlcndyaXRlQ29uZmlybWVyKFNoZWxsIHNoZWxsKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5zaGVsbCA9IHNoZWxsOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gb3ZlcndyaXRlKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJCWlmICh0aGlzLm92ZXJ3cml0ZUFsbCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJaWYgKHRoaXMuc2tpcEFsbCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXJldHVybiB0aGlzLnByb21wdFVzZXIoY2xhc3NOYW1lKTsKLQkJfQotCi0JCXByaXZhdGUgYm9vbGVhbiBwcm9tcHRVc2VyKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJCU92ZXJ3cml0ZUNvbmZpcm1lckRpYWxvZyBkaWFsb2cgPSBuZXcgT3ZlcndyaXRlQ29uZmlybWVyRGlhbG9nKHRoaXMuc2hlbGwsIGNsYXNzTmFtZSk7Ci0JCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuQ0FOQ0VMKSB7Ci0JCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlpZiAoZGlhbG9nLnllcygpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGVsc2UgaWYgKGRpYWxvZy55ZXNUb0FsbCgpKSB7Ci0JCQkJdGhpcy5vdmVyd3JpdGVBbGwgPSB0cnVlOwotCQkJCXJldHVybiB0cnVlOwotCQkJfSBlbHNlIGlmIChkaWFsb2cubm8oKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0gZWxzZSBpZiAoZGlhbG9nLm5vVG9BbGwoKSkgewotCQkJCXRoaXMuc2tpcEFsbCA9IHRydWU7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0KLQl9Ci0KLQkvLyAqKioqKioqKioqIGRpYWxvZyAqKioqKioqKioqCi0KLQlzdGF0aWMgY2xhc3MgT3ZlcndyaXRlQ29uZmlybWVyRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLQkJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgY2xhc3NOYW1lOwotCQlwcml2YXRlIGJvb2xlYW4geWVzID0gZmFsc2U7Ci0JCXByaXZhdGUgYm9vbGVhbiB5ZXNUb0FsbCA9IGZhbHNlOwotCQlwcml2YXRlIGJvb2xlYW4gbm8gPSBmYWxzZTsKLQkJcHJpdmF0ZSBib29sZWFuIG5vVG9BbGwgPSBmYWxzZTsKLQotCQlPdmVyd3JpdGVDb25maXJtZXJEaWFsb2coU2hlbGwgcGFyZW50LCBTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCQlzdXBlcihwYXJlbnQpOwotCQkJdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBzaGVsbCkgewotCQkJc3VwZXIuY29uZmlndXJlU2hlbGwoc2hlbGwpOwotCQkJc2hlbGwuc2V0VGV4dChKcHRVaU1lc3NhZ2VzLk92ZXJ3cml0ZUNvbmZpcm1lckRpYWxvZ190aXRsZSk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSAoR3JpZExheW91dCkgY29tcG9zaXRlLmdldExheW91dCgpOwotCQkJZ3JpZExheW91dC5udW1Db2x1bW5zID0gMjsKLQotCQkJTGFiZWwgdGV4dCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5MRUZUKTsKLQkJCXRleHQuc2V0VGV4dChOTFMuYmluZChKcHRVaU1lc3NhZ2VzLk92ZXJ3cml0ZUNvbmZpcm1lckRpYWxvZ190ZXh0LCB0aGlzLmNsYXNzTmFtZSkpOwotCQkJdGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQkJCQotCQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJdGhpcy5jcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLllFU19JRCwgSURpYWxvZ0NvbnN0YW50cy5ZRVNfTEFCRUwsIGZhbHNlKTsKLQkJCXRoaXMuY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5ZRVNfVE9fQUxMX0lELCBJRGlhbG9nQ29uc3RhbnRzLllFU19UT19BTExfTEFCRUwsIGZhbHNlKTsKLQkJCXRoaXMuY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5OT19JRCwgSURpYWxvZ0NvbnN0YW50cy5OT19MQUJFTCwgdHJ1ZSk7Ci0JCQl0aGlzLmNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuTk9fVE9fQUxMX0lELCBJRGlhbG9nQ29uc3RhbnRzLk5PX1RPX0FMTF9MQUJFTCwgZmFsc2UpOwotCQkJdGhpcy5jcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwsIGZhbHNlKTsKLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGJ1dHRvbklkKSB7Ci0JCQlzd2l0Y2ggKGJ1dHRvbklkKSB7Ci0JCQkJY2FzZSBJRGlhbG9nQ29uc3RhbnRzLllFU19JRCA6Ci0JCQkJCXRoaXMueWVzUHJlc3NlZCgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElEaWFsb2dDb25zdGFudHMuWUVTX1RPX0FMTF9JRCA6Ci0JCQkJCXRoaXMueWVzVG9BbGxQcmVzc2VkKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSURpYWxvZ0NvbnN0YW50cy5OT19JRCA6Ci0JCQkJCXRoaXMubm9QcmVzc2VkKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSURpYWxvZ0NvbnN0YW50cy5OT19UT19BTExfSUQgOgotCQkJCQl0aGlzLm5vVG9BbGxQcmVzc2VkKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQgOgotCQkJCQl0aGlzLmNhbmNlbFByZXNzZWQoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHllc1ByZXNzZWQoKSB7Ci0JCQl0aGlzLnllcyA9IHRydWU7Ci0JCQl0aGlzLnNldFJldHVybkNvZGUoT0spOwotCQkJdGhpcy5jbG9zZSgpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHllc1RvQWxsUHJlc3NlZCgpIHsKLQkJCXRoaXMueWVzVG9BbGwgPSB0cnVlOwotCQkJdGhpcy5zZXRSZXR1cm5Db2RlKE9LKTsKLQkJCXRoaXMuY2xvc2UoKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBub1ByZXNzZWQoKSB7Ci0JCQl0aGlzLm5vID0gdHJ1ZTsKLQkJCXRoaXMuc2V0UmV0dXJuQ29kZShPSyk7Ci0JCQl0aGlzLmNsb3NlKCk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgbm9Ub0FsbFByZXNzZWQoKSB7Ci0JCQl0aGlzLm5vVG9BbGwgPSB0cnVlOwotCQkJdGhpcy5zZXRSZXR1cm5Db2RlKE9LKTsKLQkJCXRoaXMuY2xvc2UoKTsKLQkJfQotCi0JCWJvb2xlYW4geWVzKCkgewotCQkJcmV0dXJuIHRoaXMueWVzOwotCQl9Ci0KLQkJYm9vbGVhbiB5ZXNUb0FsbCgpIHsKLQkJCXJldHVybiB0aGlzLnllc1RvQWxsOwotCQl9Ci0KLQkJYm9vbGVhbiBubygpIHsKLQkJCXJldHVybiB0aGlzLm5vOwotCQl9Ci0KLQkJYm9vbGVhbiBub1RvQWxsKCkgewotCQkJcmV0dXJuIHRoaXMubm9Ub0FsbDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2dlbmVyaWMvR2VuZXJpY1BsYXRmb3JtVWkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2dlbmVyaWMvR2VuZXJpY1BsYXRmb3JtVWkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE4OWVhNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9nZW5lcmljL0dlbmVyaWNQbGF0Zm9ybVVpLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5nZW5lcmljOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuQmFzZUpwYVBsYXRmb3JtVWk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNQbGF0Zm9ybVVpIGV4dGVuZHMgQmFzZUpwYVBsYXRmb3JtVWkKLXsKLQlwdWJsaWMgR2VuZXJpY1BsYXRmb3JtVWkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGdlbmVyYXRlRERMKElKcGFQcm9qZWN0IHByb2plY3QsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQl0aGlzLmRpc3BsYXlOb3RTdXBwb3J0ZWRNZXNzYWdlKEpwdFVpTWVzc2FnZXMuR2VuZXJpY1BsYXRmb3JtVWlEaWFsb2dfbm90U3VwcG9ydGVkTWVzc2FnZVRpdGxlLCBKcHRVaU1lc3NhZ2VzLkdlbmVyaWNQbGF0Zm9ybVVpRGlhbG9nX25vdFN1cHBvcnRlZE1lc3NhZ2VUZXh0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkaXNwbGF5Tm90U3VwcG9ydGVkTWVzc2FnZShTdHJpbmcgdGl0bGUsIFN0cmluZyBtZXNzYWdlKSB7Ci0JICAgIFN0cmluZyBmb3JtYXR0ZWRNZXNzYWdlID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoIG1lc3NhZ2UsIChPYmplY3QgW10pKG5ldyBTdHJpbmcgW10geyBtZXNzYWdlfSkpOwotCSAgICBTaGVsbCBjdXJyZW50U2hlbGwgPSBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpOwotCSAgICBNZXNzYWdlRGlhbG9nLm9wZW5JbmZvcm1hdGlvbihjdXJyZW50U2hlbGwsIHRpdGxlLCBmb3JtYXR0ZWRNZXNzYWdlKTsJICAKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL2RldGFpbHMvSUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL2RldGFpbHMvSUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNzZmZWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9kZXRhaWxzL0lBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamF2YS5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5JSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcgotewotCS8qKgotCSAqIEEgdW5pcXVlIHN0cmluZyB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgb2YgYSBNYXBwaW5nUHJvdmlkZXIgaW4gdGhlIGNvcmUKLQkgKiAoSUphdmFBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIgYW5kL29yIElYbWxBdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIpCi0JICovCi0JU3RyaW5nIGtleSgpOwotCi0JLyoqCi0JICogQSBsYWJlbCB0byBiZSBkaXNwbGF5ZWQgdG8gdGhlIGxhYmVsIGFzIGFuIG9wdGlvbiBpbiB0aGUgbWFwcGluZyB0eXBlIGNvbWJvIGJveCAKLQkgKiBAcmV0dXJuCi0JICovCi0JU3RyaW5nIGxhYmVsKCk7Ci0KLQkvKioKLQkgKiBUaGUgSUpwYUNvbXBvc2l0ZSB0aGF0IGNvcnJlcG9uZHMgdG8gdGhpcyBtYXBwaW5nIHR5cGUuICBUaGlzIHdpbGwgYmUgZGlzcGxheWVkCi0JICogYnkgdGhlIFBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUGFnZSB3aGVuIHRoZSBtYXBwaW5nIGtleSBtYXRjaGVzIHRoZSBrZXkgZ2l2ZW4KLQkgKiBieSB0aGlzIHByb3ZpZGVyLiAgVGhlIGNvbXBvc2l0ZXMgd2lsbCBiZSBzdG9yZWQgaW4gYSBNYXAgd2l0aCB0aGUgbWFwcGluZyBrZXkgYXMgdGhlIGtleS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIGNvbW1hbmRTdGFjawotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5Ci0JICogQHJldHVybgotCSAqLwotCUlKcGFDb21wb3NpdGU8SUF0dHJpYnV0ZU1hcHBpbmc+IGJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIENvbW1hbmRTdGFjayBjb21tYW5kU3RhY2ssIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpOwotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9kZXRhaWxzL0lUeXBlTWFwcGluZ1VpUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvZGV0YWlscy9JVHlwZU1hcHBpbmdVaVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2MTRhNTcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9kZXRhaWxzL0lUeXBlTWFwcGluZ1VpUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuSUpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVR5cGVNYXBwaW5nVWlQcm92aWRlcgotewotCS8qKgotCSAqIEEgdW5pcXVlIHN0cmluZyB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgb2YgYSBNYXBwaW5nUHJvdmlkZXIgaW4gdGhlIGNvcmUKLQkgKi8KLQlTdHJpbmcga2V5KCk7Ci0JCi0JLyoqCi0JICogQSBsYWJlbCB0byBiZSBkaXNwbGF5ZWQgdG8gdGhlIGxhYmVsIGFzIGFuIG9wdGlvbiBpbiB0aGUgbWFwcGluZyB0eXBlIGNvbWJvIGJveCAKLQkgKiBAcmV0dXJuCi0JICovCi0JU3RyaW5nIGxhYmVsKCk7Ci0KLQkvKioKLQkgKiBUaGUgSUpwYUNvbXBvc2l0ZSB0aGF0IGNvcnJlcG9uZHMgdG8gdGhpcyBtYXBwaW5nIHR5cGUuICBUaGlzIHdpbGwgYmUgZGlzcGxheWVkCi0JICogYnkgdGhlIFBlcnNpc3RlbnRUeXBlRGV0YWlsc1BhZ2Ugd2hlbiB0aGUgbWFwcGluZyBrZXkgbWF0Y2hlcyB0aGUga2V5IGdpdmVuCi0JICogYnkgdGhpcyBwcm92aWRlci4gIFRoZSBjb21wb3NpdGVzIHdpbGwgYmUgc3RvcmVkIGluIGEgTWFwIHdpdGggdGhlIG1hcHBpbmcga2V5IGFzIHRoZSBrZXkuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSBjb21tYW5kU3RhY2sKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeQotCSAqIEByZXR1cm4KLQkgKi8KLQlJSnBhQ29tcG9zaXRlIGJ1aWxkUGVyc2lzdGVudFR5cGVNYXBwaW5nQ29tcG9zaXRlKAotCQkJQ29tcG9zaXRlIHBhcmVudCwgQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjaywgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSk7Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL2RldGFpbHMvSmF2YURldGFpbHNQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9kZXRhaWxzL0phdmFEZXRhaWxzUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE0ZjFjNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL2RldGFpbHMvSmF2YURldGFpbHNQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamF2YS5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLklKYXZhQ29udGVudE5vZGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLklKcGFEZXRhaWxzUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5JSnBhRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLQotcHVibGljIGNsYXNzIEphdmFEZXRhaWxzUHJvdmlkZXIgCi0JaW1wbGVtZW50cyBJSnBhRGV0YWlsc1Byb3ZpZGVyCi17Ci0JcHVibGljIEphdmFEZXRhaWxzUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZmlsZUNvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gSmF2YUNvcmUuSkFWQV9TT1VSQ0VfQ09OVEVOVF9UWVBFOwotCX0KLQkKLQlwdWJsaWMgSUpwYURldGFpbHNQYWdlIGJ1aWxkRGV0YWlsc1BhZ2UoCi0JCQlDb21wb3NpdGUgcGFyZW50Q29tcG9zaXRlLCBPYmplY3QgY29udGVudE5vZGVJZCwgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlpZiAoY29udGVudE5vZGVJZC5lcXVhbHMoSUphdmFDb250ZW50Tm9kZXMuUEVSU0lTVEVOVF9UWVBFX0lEKSkgewotCQkJcmV0dXJuIG5ldyBKYXZhUGVyc2lzdGVudFR5cGVEZXRhaWxzUGFnZShwYXJlbnRDb21wb3NpdGUsIHdpZGdldEZhY3RvcnkpOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnROb2RlSWQuZXF1YWxzKElKYXZhQ29udGVudE5vZGVzLlBFUlNJU1RFTlRfQVRUUklCVVRFX0lEKSkgewotCQkJcmV0dXJuIG5ldyBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQYWdlKHBhcmVudENvbXBvc2l0ZSwgd2lkZ2V0RmFjdG9yeSk7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIG5vIG9wICAuLi4gZm9yIG5vdwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvZGV0YWlscy9KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQYWdlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL2RldGFpbHMvSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjQ5YjliLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvZGV0YWlscy9KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5QZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQ0NvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUGFnZUJvb2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQYWdlCi0JZXh0ZW5kcyBQZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2UgCi17Ci0JcHVibGljIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2UoQ29tcG9zaXRlIHBhcmVudCwgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlzdXBlcihwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQkKLQkJR3JpZERhdGEgZ3JpZERhdGE7Ci0JCQotCQlidWlsZE1hcHBpbmdMYWJlbChjb21wb3NpdGUpOwotCQkKLQkJQ0NvbWJvVmlld2VyIG1hcHBpbmdDb21ibyA9IGJ1aWxkTWFwcGluZ0NvbWJvKGNvbXBvc2l0ZSk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuQkVHSU5OSU5HOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJbWFwcGluZ0NvbWJvLmdldENvbWJvKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQotCQlQYWdlQm9vayBib29rID0gYnVpbGRNYXBwaW5nUGFnZUJvb2soY29tcG9zaXRlKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWJvb2suc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9kZXRhaWxzL0phdmFQZXJzaXN0ZW50VHlwZURldGFpbHNQYWdlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL2RldGFpbHMvSmF2YVBlcnNpc3RlbnRUeXBlRGV0YWlsc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIyZDI3My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL2RldGFpbHMvSmF2YVBlcnNpc3RlbnRUeXBlRGV0YWlsc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLlBlcnNpc3RlbnRUeXBlRGV0YWlsc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQ0NvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUGFnZUJvb2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhUGVyc2lzdGVudFR5cGVEZXRhaWxzUGFnZSBleHRlbmRzCi0JCVBlcnNpc3RlbnRUeXBlRGV0YWlsc1BhZ2UgCi17CQotCQotCXB1YmxpYyBKYXZhUGVyc2lzdGVudFR5cGVEZXRhaWxzUGFnZShDb21wb3NpdGUgcGFyZW50LCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXN1cGVyKHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewkgICAgCi0JICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JICAgIGdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0JCQotCSAgICBidWlsZFR5cGVNYXBwaW5nTGFiZWwoY29tcG9zaXRlKTsKLQkgICAgCi0JCUNDb21ib1ZpZXdlciB0eXBlTWFwcGluZ0NvbWJvID0gYnVpbGRUeXBlTWFwcGluZ0NvbWJvKGNvbXBvc2l0ZSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCSAgICBncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJdHlwZU1hcHBpbmdDb21iby5nZXRDb21ibygpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCVBhZ2VCb29rIHR5cGVNYXBwaW5nUGFnZUJvb2sgPSBidWlsZFR5cGVNYXBwaW5nUGFnZUJvb2soY29tcG9zaXRlKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXR5cGVNYXBwaW5nUGFnZUJvb2suc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JfQkKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9tYXBwaW5ncy9wcm9wZXJ0aWVzL0Jhc2ljTWFwcGluZ1VpUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvbWFwcGluZ3MvcHJvcGVydGllcy9CYXNpY01hcHBpbmdVaVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyYWY2YzUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9tYXBwaW5ncy9wcm9wZXJ0aWVzL0Jhc2ljTWFwcGluZ1VpUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEubWFwcGluZ3MucHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSU1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLklKcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEuZGV0YWlscy5JQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlscy5CYXNpY0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBCYXNpY01hcHBpbmdVaVByb3ZpZGVyCi0JaW1wbGVtZW50cyBJQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXIKLXsKLQkKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBCYXNpY01hcHBpbmdVaVByb3ZpZGVyIElOU1RBTkNFID0gbmV3IEJhc2ljTWFwcGluZ1VpUHJvdmlkZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBCYXNpY01hcHBpbmdVaVByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGtleSgpIHsKLQkJcmV0dXJuIElNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgbGFiZWwoKSB7Ci0JCXJldHVybiBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuUGVyc2lzdGVudEF0dHJpYnV0ZVBhZ2VfQmFzaWNMYWJlbDsKLQl9Ci0JCi0JcHVibGljIElKcGFDb21wb3NpdGUgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIENvbW1hbmRTdGFjayBjb21tYW5kU3RhY2ssIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBCYXNpY0NvbXBvc2l0ZShwYXJlbnQsIGNvbW1hbmRTdGFjaywgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9tYXBwaW5ncy9wcm9wZXJ0aWVzL0RlZmF1bHRCYXNpY01hcHBpbmdVaVByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL21hcHBpbmdzL3Byb3BlcnRpZXMvRGVmYXVsdEJhc2ljTWFwcGluZ1VpUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAxYzM1ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL21hcHBpbmdzL3Byb3BlcnRpZXMvRGVmYXVsdEJhc2ljTWFwcGluZ1VpUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEubWFwcGluZ3MucHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSU1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLklKcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEuZGV0YWlscy5JQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlscy5CYXNpY0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0QmFzaWNNYXBwaW5nVWlQcm92aWRlcgotCWltcGxlbWVudHMgSUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVmYXVsdEJhc2ljTWFwcGluZ1VpUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgRGVmYXVsdEJhc2ljTWFwcGluZ1VpUHJvdmlkZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBEZWZhdWx0QmFzaWNNYXBwaW5nVWlQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBrZXkoKSB7Ci0JCXJldHVybiBJTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGxhYmVsKCkgewotCQlyZXR1cm4gIkRlZmF1bHQgKCIgKyBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuUGVyc2lzdGVudEF0dHJpYnV0ZVBhZ2VfQmFzaWNMYWJlbCArICIpIjsKLQl9Ci0JCi0JcHVibGljIElKcGFDb21wb3NpdGUgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIENvbW1hbmRTdGFjayBjb21tYW5kU3RhY2ssIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBCYXNpY0NvbXBvc2l0ZShwYXJlbnQsIGNvbW1hbmRTdGFjaywgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9tYXBwaW5ncy9wcm9wZXJ0aWVzL0RlZmF1bHRFbWJlZGRlZE1hcHBpbmdVaVByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL21hcHBpbmdzL3Byb3BlcnRpZXMvRGVmYXVsdEVtYmVkZGVkTWFwcGluZ1VpUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdjNDkzMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL21hcHBpbmdzL3Byb3BlcnRpZXMvRGVmYXVsdEVtYmVkZGVkTWFwcGluZ1VpUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEubWFwcGluZ3MucHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSU1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLklKcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEuZGV0YWlscy5JQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlscy5FbWJlZGRlZENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0RW1iZWRkZWRNYXBwaW5nVWlQcm92aWRlcgotCWltcGxlbWVudHMgSUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVmYXVsdEVtYmVkZGVkTWFwcGluZ1VpUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgRGVmYXVsdEVtYmVkZGVkTWFwcGluZ1VpUHJvdmlkZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBEZWZhdWx0RW1iZWRkZWRNYXBwaW5nVWlQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBrZXkoKSB7Ci0JCXJldHVybiBJTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGxhYmVsKCkgewotCQlyZXR1cm4gIkRlZmF1bHQgKCIgKyBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuUGVyc2lzdGVudEF0dHJpYnV0ZVBhZ2VfRW1iZWRkZWRMYWJlbCArICIpIjsKLQl9Ci0JCi0JcHVibGljIElKcGFDb21wb3NpdGUgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIENvbW1hbmRTdGFjayBjb21tYW5kU3RhY2ssIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBFbWJlZGRlZENvbXBvc2l0ZShwYXJlbnQsIGNvbW1hbmRTdGFjaywgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9tYXBwaW5ncy9wcm9wZXJ0aWVzL0VtYmVkZGFibGVVaVByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL21hcHBpbmdzL3Byb3BlcnRpZXMvRW1iZWRkYWJsZVVpUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E0YTk3ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL21hcHBpbmdzL3Byb3BlcnRpZXMvRW1iZWRkYWJsZVVpUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEubWFwcGluZ3MucHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSU1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLklKcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEuZGV0YWlscy5JVHlwZU1hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHMuRW1iZWRkYWJsZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBFbWJlZGRhYmxlVWlQcm92aWRlciBpbXBsZW1lbnRzIElUeXBlTWFwcGluZ1VpUHJvdmlkZXIKLXsKLQlwdWJsaWMgU3RyaW5nIGtleSgpIHsKLQkJcmV0dXJuIElNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgbGFiZWwoKSB7Ci0JCXJldHVybiBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuUGVyc2lzdGVudFR5cGVQYWdlX0VtYmVkZGFibGVMYWJlbDsKLQl9Ci0JCi0JcHVibGljIElKcGFDb21wb3NpdGUgYnVpbGRQZXJzaXN0ZW50VHlwZU1hcHBpbmdDb21wb3NpdGUoCi0JCQkJQ29tcG9zaXRlIHBhcmVudCwgQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjaywgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IEVtYmVkZGFibGVDb21wb3NpdGUocGFyZW50LCBjb21tYW5kU3RhY2ssIHdpZGdldEZhY3RvcnkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL21hcHBpbmdzL3Byb3BlcnRpZXMvRW1iZWRkZWRJZE1hcHBpbmdVaVByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL21hcHBpbmdzL3Byb3BlcnRpZXMvRW1iZWRkZWRJZE1hcHBpbmdVaVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNDlhZjIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9tYXBwaW5ncy9wcm9wZXJ0aWVzL0VtYmVkZGVkSWRNYXBwaW5nVWlQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamF2YS5tYXBwaW5ncy5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuSUpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamF2YS5kZXRhaWxzLklBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzLkVtYmVkZGVkSWRDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgRW1iZWRkZWRJZE1hcHBpbmdVaVByb3ZpZGVyCi0JaW1wbGVtZW50cyBJQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXIKLXsKLQkKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFbWJlZGRlZElkTWFwcGluZ1VpUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgRW1iZWRkZWRJZE1hcHBpbmdVaVByb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgRW1iZWRkZWRJZE1hcHBpbmdVaVByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcga2V5KCkgewotCQlyZXR1cm4gSU1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBsYWJlbCgpIHsKLQkJcmV0dXJuIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5QZXJzaXN0ZW50QXR0cmlidXRlUGFnZV9FbWJlZGRlZElkTGFiZWw7Ci0JfQotCQotCXB1YmxpYyBJSnBhQ29tcG9zaXRlIGJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrLCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgRW1iZWRkZWRJZENvbXBvc2l0ZShwYXJlbnQsIGNvbW1hbmRTdGFjaywgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvbWFwcGluZ3MvcHJvcGVydGllcy9FbWJlZGRlZE1hcHBpbmdVaVByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL21hcHBpbmdzL3Byb3BlcnRpZXMvRW1iZWRkZWRNYXBwaW5nVWlQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGE5MzdiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvbWFwcGluZ3MvcHJvcGVydGllcy9FbWJlZGRlZE1hcHBpbmdVaVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLm1hcHBpbmdzLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklNYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5JSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLmRldGFpbHMuSUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHMuRW1iZWRkZWRDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgRW1iZWRkZWRNYXBwaW5nVWlQcm92aWRlcgotCWltcGxlbWVudHMgSUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyCi17Ci0JCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRW1iZWRkZWRNYXBwaW5nVWlQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBFbWJlZGRlZE1hcHBpbmdVaVByb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgRW1iZWRkZWRNYXBwaW5nVWlQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGtleSgpIHsKLQkJcmV0dXJuIElNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgbGFiZWwoKSB7Ci0JCXJldHVybiBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuUGVyc2lzdGVudEF0dHJpYnV0ZVBhZ2VfRW1iZWRkZWRMYWJlbDsKLQl9Ci0JCi0JcHVibGljIElKcGFDb21wb3NpdGUgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIENvbW1hbmRTdGFjayBjb21tYW5kU3RhY2ssIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBFbWJlZGRlZENvbXBvc2l0ZShwYXJlbnQsIGNvbW1hbmRTdGFjaywgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvbWFwcGluZ3MvcHJvcGVydGllcy9FbnRpdHlVaVByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL21hcHBpbmdzL3Byb3BlcnRpZXMvRW50aXR5VWlQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGQ0ODlhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvbWFwcGluZ3MvcHJvcGVydGllcy9FbnRpdHlVaVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24gYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLm1hcHBpbmdzLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklNYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5JSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLmRldGFpbHMuSVR5cGVNYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzLkVudGl0eUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBFbnRpdHlVaVByb3ZpZGVyIGltcGxlbWVudHMgSVR5cGVNYXBwaW5nVWlQcm92aWRlcgotewotCXB1YmxpYyBTdHJpbmcga2V5KCkgewotCQlyZXR1cm4gSU1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGxhYmVsKCkgewotCQlyZXR1cm4gSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlBlcnNpc3RlbnRUeXBlUGFnZV9FbnRpdHlMYWJlbDsKLQl9Ci0JCi0JcHVibGljIElKcGFDb21wb3NpdGUgYnVpbGRQZXJzaXN0ZW50VHlwZU1hcHBpbmdDb21wb3NpdGUoCi0JCQkJQ29tcG9zaXRlIHBhcmVudCwgQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjaywgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IEVudGl0eUNvbXBvc2l0ZShwYXJlbnQsIGNvbW1hbmRTdGFjaywgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9tYXBwaW5ncy9wcm9wZXJ0aWVzL0lkTWFwcGluZ1VpUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvbWFwcGluZ3MvcHJvcGVydGllcy9JZE1hcHBpbmdVaVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5OWIwZmIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9tYXBwaW5ncy9wcm9wZXJ0aWVzL0lkTWFwcGluZ1VpUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEubWFwcGluZ3MucHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSU1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLklKcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEuZGV0YWlscy5JQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlscy5JZENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBJZE1hcHBpbmdVaVByb3ZpZGVyCi0JaW1wbGVtZW50cyBJQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXIKLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJZE1hcHBpbmdVaVByb3ZpZGVyIElOU1RBTkNFID0gbmV3IElkTWFwcGluZ1VpUHJvdmlkZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBJZE1hcHBpbmdVaVByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcga2V5KCkgewotCQlyZXR1cm4gSU1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBsYWJlbCgpIHsKLQkJcmV0dXJuIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5QZXJzaXN0ZW50QXR0cmlidXRlUGFnZV9JZExhYmVsOwotCX0KLQotCXB1YmxpYyBJSnBhQ29tcG9zaXRlIGJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrLCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgSWRDb21wb3NpdGUocGFyZW50LCBjb21tYW5kU3RhY2ssIHdpZGdldEZhY3RvcnkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvbWFwcGluZ3MvcHJvcGVydGllcy9NYW55VG9NYW55TWFwcGluZ1VpUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvbWFwcGluZ3MvcHJvcGVydGllcy9NYW55VG9NYW55TWFwcGluZ1VpUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODUxNWQzNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL21hcHBpbmdzL3Byb3BlcnRpZXMvTWFueVRvTWFueU1hcHBpbmdVaVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24gYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLm1hcHBpbmdzLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklNYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5JSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLmRldGFpbHMuSUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHMuTWFueVRvTWFueUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBNYW55VG9NYW55TWFwcGluZ1VpUHJvdmlkZXIKLQlpbXBsZW1lbnRzIElBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hbnlUb01hbnlNYXBwaW5nVWlQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBNYW55VG9NYW55TWFwcGluZ1VpUHJvdmlkZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBNYW55VG9NYW55TWFwcGluZ1VpUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBrZXkoKSB7Ci0JCXJldHVybiBJTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBsYWJlbCgpIHsKLQkJcmV0dXJuIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5QZXJzaXN0ZW50QXR0cmlidXRlUGFnZV9NYW55VG9NYW55TGFiZWw7Ci0JfQotCi0JcHVibGljIElKcGFDb21wb3NpdGUgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIENvbW1hbmRTdGFjayBjb21tYW5kU3RhY2ssIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBNYW55VG9NYW55Q29tcG9zaXRlKHBhcmVudCwgY29tbWFuZFN0YWNrLCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL21hcHBpbmdzL3Byb3BlcnRpZXMvTWFueVRvT25lTWFwcGluZ1VpUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvbWFwcGluZ3MvcHJvcGVydGllcy9NYW55VG9PbmVNYXBwaW5nVWlQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODE4MzJjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvbWFwcGluZ3MvcHJvcGVydGllcy9NYW55VG9PbmVNYXBwaW5nVWlQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamF2YS5tYXBwaW5ncy5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuSUpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamF2YS5kZXRhaWxzLklBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzLk1hbnlUb09uZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBNYW55VG9PbmVNYXBwaW5nVWlQcm92aWRlcgotCWltcGxlbWVudHMgSUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFueVRvT25lTWFwcGluZ1VpUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgTWFueVRvT25lTWFwcGluZ1VpUHJvdmlkZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBNYW55VG9PbmVNYXBwaW5nVWlQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGtleSgpIHsKLQkJcmV0dXJuIElNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgbGFiZWwoKSB7Ci0JCXJldHVybiBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuUGVyc2lzdGVudEF0dHJpYnV0ZVBhZ2VfTWFueVRvT25lTGFiZWw7Ci0JfQotCi0JcHVibGljIElKcGFDb21wb3NpdGUgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIENvbW1hbmRTdGFjayBjb21tYW5kU3RhY2ssIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBNYW55VG9PbmVDb21wb3NpdGUocGFyZW50LCBjb21tYW5kU3RhY2ssIHdpZGdldEZhY3RvcnkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvbWFwcGluZ3MvcHJvcGVydGllcy9NYXBwZWRTdXBlcmNsYXNzVWlQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9tYXBwaW5ncy9wcm9wZXJ0aWVzL01hcHBlZFN1cGVyY2xhc3NVaVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhNzE0NzYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9tYXBwaW5ncy9wcm9wZXJ0aWVzL01hcHBlZFN1cGVyY2xhc3NVaVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24gYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLm1hcHBpbmdzLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklNYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5JSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLmRldGFpbHMuSVR5cGVNYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzLk1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgTWFwcGVkU3VwZXJjbGFzc1VpUHJvdmlkZXIgaW1wbGVtZW50cyBJVHlwZU1hcHBpbmdVaVByb3ZpZGVyCi17Ci0JcHVibGljIFN0cmluZyBrZXkoKSB7Ci0JCXJldHVybiBJTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBsYWJlbCgpIHsKLQkJcmV0dXJuIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5QZXJzaXN0ZW50VHlwZVBhZ2VfTWFwcGVkU3VwZXJjbGFzc0xhYmVsOwotCX0KLQotCXB1YmxpYyBJSnBhQ29tcG9zaXRlIGJ1aWxkUGVyc2lzdGVudFR5cGVNYXBwaW5nQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIENvbW1hbmRTdGFjayBjb21tYW5kU3RhY2ssIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlKHBhcmVudCwgY29tbWFuZFN0YWNrLCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL21hcHBpbmdzL3Byb3BlcnRpZXMvTnVsbEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL21hcHBpbmdzL3Byb3BlcnRpZXMvTnVsbEF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjMTYwNDcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9tYXBwaW5ncy9wcm9wZXJ0aWVzL051bGxBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamF2YS5tYXBwaW5ncy5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5JSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLmRldGFpbHMuSUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBOdWxsQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXIKLQlpbXBsZW1lbnRzIElBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcgotewotCQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIE51bGxBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBOdWxsQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBOdWxsQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0KLQlwdWJsaWMgU3RyaW5nIGtleSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgbGFiZWwoKSB7Ci0JCXJldHVybiAiIjsKLQl9Ci0JCi0JcHVibGljIElKcGFDb21wb3NpdGUgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIENvbW1hbmRTdGFjayBjb21tYW5kU3RhY2ssIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBOdWxsQ29tcG9zaXRlKHBhcmVudCk7Ci0JfQotCQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgTnVsbENvbXBvc2l0ZSBleHRlbmRzIENvbXBvc2l0ZSAKLQkJaW1wbGVtZW50cyBJSnBhQ29tcG9zaXRlIAotCXsKLQkJTnVsbENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlzdXBlcihwYXJlbnQsIFNXVC5OT05FKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgcG9wdWxhdGUoRU9iamVjdCBtb2RlbCkgewotCQkJLy8gbm8gb3AKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQlzdXBlci5kaXNwb3NlKCk7Ci0JCX0KLQkJcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpIHsKLQkJCXJldHVybiB0aGlzOwotCQl9Ci0JfQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL21hcHBpbmdzL3Byb3BlcnRpZXMvTnVsbFR5cGVNYXBwaW5nVWlQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9tYXBwaW5ncy9wcm9wZXJ0aWVzL051bGxUeXBlTWFwcGluZ1VpUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQzNWJkNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL21hcHBpbmdzL3Byb3BlcnRpZXMvTnVsbFR5cGVNYXBwaW5nVWlQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamF2YS5tYXBwaW5ncy5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5JSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLmRldGFpbHMuSVR5cGVNYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgTnVsbFR5cGVNYXBwaW5nVWlQcm92aWRlciBpbXBsZW1lbnRzIElUeXBlTWFwcGluZ1VpUHJvdmlkZXIKLXsKLQlwdWJsaWMgU3RyaW5nIGtleSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgbGFiZWwoKSB7Ci0JCXJldHVybiAiIjsKLQl9Ci0JCi0JcHVibGljIElKcGFDb21wb3NpdGUgYnVpbGRQZXJzaXN0ZW50VHlwZU1hcHBpbmdDb21wb3NpdGUoCi0JCQkJQ29tcG9zaXRlIHBhcmVudCwgQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjaywgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IE51bGxDb21wb3NpdGUocGFyZW50KTsKLQl9Ci0JCi0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBOdWxsQ29tcG9zaXRlIGV4dGVuZHMgQ29tcG9zaXRlIAotCWltcGxlbWVudHMgSUpwYUNvbXBvc2l0ZSAKLQl7Ci0JCXByaXZhdGUgQ29tcG9zaXRlIGNvbXBvc2l0ZTsKLQkJTnVsbENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlzdXBlcihwYXJlbnQsIFNXVC5OT05FKTsKLQkJCXRoaXMuY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgcG9wdWxhdGUoRU9iamVjdCBtb2RlbCkgewotCQkJLy8gbm8gb3AKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQlzdXBlci5kaXNwb3NlKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKSB7Ci0JCQlyZXR1cm4gdGhpcy5jb21wb3NpdGU7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9tYXBwaW5ncy9wcm9wZXJ0aWVzL09uZVRvTWFueU1hcHBpbmdVaVByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL21hcHBpbmdzL3Byb3BlcnRpZXMvT25lVG9NYW55TWFwcGluZ1VpUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmIxMzBiYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL21hcHBpbmdzL3Byb3BlcnRpZXMvT25lVG9NYW55TWFwcGluZ1VpUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEubWFwcGluZ3MucHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSU1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLklKcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEuZGV0YWlscy5JQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlscy5PbmVUb01hbnlDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgT25lVG9NYW55TWFwcGluZ1VpUHJvdmlkZXIKLQlpbXBsZW1lbnRzIElBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9uZVRvTWFueU1hcHBpbmdVaVByb3ZpZGVyIElOU1RBTkNFID0gbmV3IE9uZVRvTWFueU1hcHBpbmdVaVByb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgT25lVG9NYW55TWFwcGluZ1VpUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBrZXkoKSB7Ci0JCXJldHVybiBJTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGxhYmVsKCkgewotCQlyZXR1cm4gSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlBlcnNpc3RlbnRBdHRyaWJ1dGVQYWdlX09uZVRvTWFueUxhYmVsOwotCX0KLQotCXB1YmxpYyBJSnBhQ29tcG9zaXRlIGJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrLCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgT25lVG9NYW55Q29tcG9zaXRlKHBhcmVudCwgY29tbWFuZFN0YWNrLCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL21hcHBpbmdzL3Byb3BlcnRpZXMvT25lVG9PbmVNYXBwaW5nVWlQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9tYXBwaW5ncy9wcm9wZXJ0aWVzL09uZVRvT25lTWFwcGluZ1VpUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdmYTIyNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL21hcHBpbmdzL3Byb3BlcnRpZXMvT25lVG9PbmVNYXBwaW5nVWlQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamF2YS5tYXBwaW5ncy5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuSUpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamF2YS5kZXRhaWxzLklBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzLk9uZVRvT25lQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLQotcHVibGljIGNsYXNzIE9uZVRvT25lTWFwcGluZ1VpUHJvdmlkZXIKLQlpbXBsZW1lbnRzIElBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcgotewotCQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9uZVRvT25lTWFwcGluZ1VpUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgT25lVG9PbmVNYXBwaW5nVWlQcm92aWRlcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBJQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkgKi8KLQlwcml2YXRlIE9uZVRvT25lTWFwcGluZ1VpUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBrZXkoKSB7Ci0JCXJldHVybiBJTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgbGFiZWwoKSB7Ci0JCXJldHVybiBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuUGVyc2lzdGVudEF0dHJpYnV0ZVBhZ2VfT25lVG9PbmVMYWJlbDsKLQl9Ci0JCi0JcHVibGljIElKcGFDb21wb3NpdGUgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIENvbW1hbmRTdGFjayBjb21tYW5kU3RhY2ssIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBPbmVUb09uZUNvbXBvc2l0ZShwYXJlbnQsIGNvbW1hbmRTdGFjaywgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvbWFwcGluZ3MvcHJvcGVydGllcy9UcmFuc2llbnRNYXBwaW5nVWlQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9tYXBwaW5ncy9wcm9wZXJ0aWVzL1RyYW5zaWVudE1hcHBpbmdVaVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4YjQ4MTEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9tYXBwaW5ncy9wcm9wZXJ0aWVzL1RyYW5zaWVudE1hcHBpbmdVaVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLm1hcHBpbmdzLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklNYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5JSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLmRldGFpbHMuSUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHMuVHJhbnNpZW50Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLQotcHVibGljIGNsYXNzIFRyYW5zaWVudE1hcHBpbmdVaVByb3ZpZGVyCi0JaW1wbGVtZW50cyBJQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXIKLXsKLQkKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2llbnRNYXBwaW5nVWlQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBUcmFuc2llbnRNYXBwaW5nVWlQcm92aWRlcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBJQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkgKi8KLQlwcml2YXRlIFRyYW5zaWVudE1hcHBpbmdVaVByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcga2V5KCkgewotCQlyZXR1cm4gSU1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgbGFiZWwoKSB7Ci0JCXJldHVybiBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuUGVyc2lzdGVudEF0dHJpYnV0ZVBhZ2VfVHJhbnNpZW50TGFiZWw7Ci0JfQotCQotCXB1YmxpYyBJSnBhQ29tcG9zaXRlIGJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrLCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgVHJhbnNpZW50Q29tcG9zaXRlKHBhcmVudCwgY29tbWFuZFN0YWNrLCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9tYXBwaW5ncy9wcm9wZXJ0aWVzL1ZlcnNpb25NYXBwaW5nVWlQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9tYXBwaW5ncy9wcm9wZXJ0aWVzL1ZlcnNpb25NYXBwaW5nVWlQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWYxNGRmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvbWFwcGluZ3MvcHJvcGVydGllcy9WZXJzaW9uTWFwcGluZ1VpUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEubWFwcGluZ3MucHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSU1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLklKcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEuZGV0YWlscy5JQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlscy5WZXJzaW9uQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLQotcHVibGljIGNsYXNzIFZlcnNpb25NYXBwaW5nVWlQcm92aWRlcgotCWltcGxlbWVudHMgSUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyCi17Ci0JCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVmVyc2lvbk1hcHBpbmdVaVByb3ZpZGVyIElOU1RBTkNFID0gbmV3IFZlcnNpb25NYXBwaW5nVWlQcm92aWRlcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBJQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkgKi8KLQlwcml2YXRlIFZlcnNpb25NYXBwaW5nVWlQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGtleSgpIHsKLQkJcmV0dXJuIElNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBsYWJlbCgpIHsKLQkJcmV0dXJuIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5QZXJzaXN0ZW50QXR0cmlidXRlUGFnZV9WZXJzaW9uTGFiZWw7Ci0JfQotCQotCXB1YmxpYyBJSnBhQ29tcG9zaXRlIGJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrLCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgVmVyc2lvbkNvbXBvc2l0ZShwYXJlbnQsIGNvbW1hbmRTdGFjaywgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvc3RydWN0dXJlL0phdmFDb21waWxhdGlvblVuaXRJdGVtUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvc3RydWN0dXJlL0phdmFDb21waWxhdGlvblVuaXRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY0MzMyOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL3N0cnVjdHVyZS9KYXZhQ29tcGlsYXRpb25Vbml0SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKLSAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLnN0cnVjdHVyZTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLkpwYUphdmFQYWNrYWdlOwotCi1wdWJsaWMgY2xhc3MgSmF2YUNvbXBpbGF0aW9uVW5pdEl0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIKLQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCAKLQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIAotCQlJSXRlbUxhYmVsUHJvdmlkZXIKLXsKLQlwdWJsaWMgSmF2YUNvbXBpbGF0aW9uVW5pdEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChKcGFKYXZhUGFja2FnZS5MaXRlcmFscy5KUEFfQ09NUElMQVRJT05fVU5JVF9fVFlQRVMpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvc3RydWN0dXJlL0phdmFQZXJzaXN0ZW50QXR0cmlidXRlSXRlbVByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL3N0cnVjdHVyZS9KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDJjODMyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvc3RydWN0dXJlL0phdmFQZXJzaXN0ZW50QXR0cmlidXRlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamF2YS5zdHJ1Y3R1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSnBhQ29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSUJhc2ljOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklFbWJlZGRlZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JRW1iZWRkZWRJZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JSWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSU1hbnlUb01hbnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSU1hbnlUb09uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JT25lVG9NYW55OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklPbmVUb09uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JVHJhbnNpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzSW1hZ2VzOwotCi1wdWJsaWMgY2xhc3MgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyCi0JaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgCi0JCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCAKLQkJSUl0ZW1MYWJlbFByb3ZpZGVyCi17Ci0JcHVibGljIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCUlBdHRyaWJ1dGVNYXBwaW5nIG1hcHBpbmcgPSAoKElQZXJzaXN0ZW50QXR0cmlidXRlKSBvYmplY3QpLmdldE1hcHBpbmcoKTsKLQkJCi0JCWlmIChtYXBwaW5nIGluc3RhbmNlb2YgSUJhc2ljKSB7Ci0JCQlyZXR1cm4gSnB0VWlNYXBwaW5nc0ltYWdlcy5nZXRJbWFnZShKcHRVaU1hcHBpbmdzSW1hZ2VzLkJBU0lDKTsKLQkJfQotCQllbHNlIGlmIChtYXBwaW5nIGluc3RhbmNlb2YgSUlkKSB7Ci0JCQlyZXR1cm4gSnB0VWlNYXBwaW5nc0ltYWdlcy5nZXRJbWFnZShKcHRVaU1hcHBpbmdzSW1hZ2VzLklEKTsKLQkJfQotCQllbHNlIGlmIChtYXBwaW5nIGluc3RhbmNlb2YgSVZlcnNpb24pIHsKLQkJCXJldHVybiBKcHRVaU1hcHBpbmdzSW1hZ2VzLmdldEltYWdlKEpwdFVpTWFwcGluZ3NJbWFnZXMuVkVSU0lPTik7Ci0JCX0KLQkJZWxzZSBpZiAobWFwcGluZyBpbnN0YW5jZW9mIElFbWJlZGRlZCkgewotCQkJcmV0dXJuIEpwdFVpTWFwcGluZ3NJbWFnZXMuZ2V0SW1hZ2UoSnB0VWlNYXBwaW5nc0ltYWdlcy5FTUJFRERFRCk7Ci0JCX0KLQkJZWxzZSBpZiAobWFwcGluZyBpbnN0YW5jZW9mIElFbWJlZGRlZElkKSB7Ci0JCQlyZXR1cm4gSnB0VWlNYXBwaW5nc0ltYWdlcy5nZXRJbWFnZShKcHRVaU1hcHBpbmdzSW1hZ2VzLkVNQkVEREVEX0lEKTsKLQkJfQotCQllbHNlIGlmIChtYXBwaW5nIGluc3RhbmNlb2YgSU9uZVRvT25lKSB7Ci0JCQlyZXR1cm4gSnB0VWlNYXBwaW5nc0ltYWdlcy5nZXRJbWFnZShKcHRVaU1hcHBpbmdzSW1hZ2VzLk9ORV9UT19PTkUpOwotCQl9Ci0JCWVsc2UgaWYgKG1hcHBpbmcgaW5zdGFuY2VvZiBJT25lVG9NYW55KSB7Ci0JCQlyZXR1cm4gSnB0VWlNYXBwaW5nc0ltYWdlcy5nZXRJbWFnZShKcHRVaU1hcHBpbmdzSW1hZ2VzLk9ORV9UT19NQU5ZKTsKLQkJfQotCQllbHNlIGlmIChtYXBwaW5nIGluc3RhbmNlb2YgSU1hbnlUb09uZSkgewotCQkJcmV0dXJuIEpwdFVpTWFwcGluZ3NJbWFnZXMuZ2V0SW1hZ2UoSnB0VWlNYXBwaW5nc0ltYWdlcy5NQU5ZX1RPX09ORSk7Ci0JCX0KLQkJZWxzZSBpZiAobWFwcGluZyBpbnN0YW5jZW9mIElNYW55VG9NYW55KSB7Ci0JCQlyZXR1cm4gSnB0VWlNYXBwaW5nc0ltYWdlcy5nZXRJbWFnZShKcHRVaU1hcHBpbmdzSW1hZ2VzLk1BTllfVE9fTUFOWSk7Ci0JCX0KLQkJZWxzZSBpZiAobWFwcGluZyBpbnN0YW5jZW9mIElUcmFuc2llbnQpIHsKLQkJCXJldHVybiBKcHRVaU1hcHBpbmdzSW1hZ2VzLmdldEltYWdlKEpwdFVpTWFwcGluZ3NJbWFnZXMuVFJBTlNJRU5UKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBKcHRVaU1hcHBpbmdzSW1hZ2VzLmdldEltYWdlKEpwdFVpTWFwcGluZ3NJbWFnZXMuTlVMTF9BVFRSSUJVVEVfTUFQUElORyk7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuICgoSVBlcnNpc3RlbnRBdHRyaWJ1dGUpIG9iamVjdCkuZ2V0TmFtZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSVBlcnNpc3RlbnRBdHRyaWJ1dGUuY2xhc3MpKSB7Ci0JCWNhc2UgSnBhQ29yZVBhY2thZ2UuSVBFUlNJU1RFTlRfQVRUUklCVVRFX19NQVBQSU5HOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9zdHJ1Y3R1cmUvSmF2YVBlcnNpc3RlbnRUeXBlSXRlbVByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL3N0cnVjdHVyZS9KYXZhUGVyc2lzdGVudFR5cGVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFjZDViYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL3N0cnVjdHVyZS9KYXZhUGVyc2lzdGVudFR5cGVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAotICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEuc3RydWN0dXJlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSnBhQ29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50LmphdmEuSnBhSmF2YVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSUVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc0ltYWdlczsKLQotcHVibGljIGNsYXNzIEphdmFQZXJzaXN0ZW50VHlwZUl0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIKLQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCAKLQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIAotCQlJSXRlbUxhYmVsUHJvdmlkZXIKLXsKLQlwdWJsaWMgSmF2YVBlcnNpc3RlbnRUeXBlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKEpwYUphdmFQYWNrYWdlLkxpdGVyYWxzLkpBVkFfUEVSU0lTVEVOVF9UWVBFX19BVFRSSUJVVEVTKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCUlUeXBlTWFwcGluZyBtYXBwaW5nID0gKChJUGVyc2lzdGVudFR5cGUpIG9iamVjdCkuZ2V0TWFwcGluZygpOwotCQkKLQkJCi0JCWlmIChtYXBwaW5nIGluc3RhbmNlb2YgSUVudGl0eSkgewotCQkJcmV0dXJuIEpwdFVpTWFwcGluZ3NJbWFnZXMuZ2V0SW1hZ2UoSnB0VWlNYXBwaW5nc0ltYWdlcy5FTlRJVFkpOwotCQl9Ci0JCWVsc2UgaWYgKG1hcHBpbmcgaW5zdGFuY2VvZiBJRW1iZWRkYWJsZSkgewotCQkJcmV0dXJuIEpwdFVpTWFwcGluZ3NJbWFnZXMuZ2V0SW1hZ2UoSnB0VWlNYXBwaW5nc0ltYWdlcy5FTUJFRERBQkxFKTsKLQkJfQotCQllbHNlIGlmIChtYXBwaW5nIGluc3RhbmNlb2YgSU1hcHBlZFN1cGVyY2xhc3MpIHsKLQkJCXJldHVybiBKcHRVaU1hcHBpbmdzSW1hZ2VzLmdldEltYWdlKEpwdFVpTWFwcGluZ3NJbWFnZXMuTUFQUEVEX1NVUEVSQ0xBU1MpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJSVR5cGUgdHlwZSA9ICgoSVBlcnNpc3RlbnRUeXBlKSBvYmplY3QpLmZpbmRKZHRUeXBlKCk7Ci0JCXJldHVybiAodHlwZSA9PSBudWxsKSA/ICIiIDogdHlwZS5nZXRFbGVtZW50TmFtZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSmF2YVBlcnNpc3RlbnRUeXBlLmNsYXNzKSkgewotCQkJY2FzZSBKcGFDb3JlUGFja2FnZS5JUEVSU0lTVEVOVF9UWVBFX19NQVBQSU5HX0tFWToKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZCgKLQkJCQkJbmV3IFZpZXdlck5vdGlmaWNhdGlvbigKLQkJCQkJCW5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQkJcmV0dXJuOwotCQkJCi0JCQljYXNlIEpwYUphdmFQYWNrYWdlLkpBVkFfUEVSU0lTVEVOVF9UWVBFX19BVFRSSUJVVEVTOgotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKAotCQkJCQluZXcgVmlld2VyTm90aWZpY2F0aW9uKAotCQkJCQkJbm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL3N0cnVjdHVyZS9KYXZhU3RydWN0dXJlUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvc3RydWN0dXJlL0phdmFTdHJ1Y3R1cmVQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWFmMjhjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2phdmEvc3RydWN0dXJlL0phdmFTdHJ1Y3R1cmVQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCi0gKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamF2YS5zdHJ1Y3R1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zdHJ1Y3R1cmUuSUpwYVN0cnVjdHVyZVByb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgSmF2YVN0cnVjdHVyZVByb3ZpZGVyIGltcGxlbWVudHMgSUpwYVN0cnVjdHVyZVByb3ZpZGVyCi17Ci0JcHVibGljIFN0cmluZyBmaWxlQ29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBKYXZhQ29yZS5KQVZBX1NPVVJDRV9DT05URU5UX1RZUEU7Ci0JfQotCi0JcHVibGljIElUcmVlQ29udGVudFByb3ZpZGVyIGJ1aWxkQ29udGVudFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKG5ldyBKcGFDb3JlSmF2YUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOwotCX0KLQkKLQlwdWJsaWMgSUxhYmVsUHJvdmlkZXIgYnVpbGRMYWJlbFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcihuZXcgSnBhQ29yZUphdmFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL3N0cnVjdHVyZS9KcGFDb3JlSmF2YUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qYXZhL3N0cnVjdHVyZS9KcGFDb3JlSmF2YUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczMDg1MzQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamF2YS9zdHJ1Y3R1cmUvSnBhQ29yZUphdmFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAotICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEuc3RydWN0dXJlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5DaGFuZ2VOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklEaXNwb3NhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JTm90aWZ5Q2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5qYXZhLnV0aWwuSnBhSmF2YUFkYXB0ZXJGYWN0b3J5OwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGZhY3RvcnkgdGhhdCBpcyB1c2VkIHRvIHByb3ZpZGUgdGhlIGludGVyZmFjZXMgbmVlZGVkIHRvIHN1cHBvcnQgVmlld2Vycy4KLSAqIFRoZSBhZGFwdGVycyBnZW5lcmF0ZWQgYnkgdGhpcyBmYWN0b3J5IGNvbnZlcnQgRU1GIGFkYXB0ZXIgbm90aWZpY2F0aW9ucyBpbnRvIGNhbGxzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LgotICogVGhlIGFkYXB0ZXJzIGFsc28gc3VwcG9ydCBFY2xpcHNlIHByb3BlcnR5IHNoZWV0cy4KLSAqIE5vdGUgdGhhdCBtb3N0IG9mIHRoZSBhZGFwdGVycyBhcmUgc2hhcmVkIGFtb25nIG11bHRpcGxlIGluc3RhbmNlcy4KLSAqLwotcHVibGljIGNsYXNzIEpwYUNvcmVKYXZhSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKLQlleHRlbmRzIEpwYUphdmFBZGFwdGVyRmFjdG9yeQotCWltcGxlbWVudHMgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSwgCi0JCUlDaGFuZ2VOb3RpZmllciwgCi0JCUlEaXNwb3NhYmxlCi17Ci0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgcm9vdCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBkZWxlZ2F0ZXMgdG8gdGhpcyBhZGFwdGVyIGZhY3RvcnkuCi0JICovCi0JcHJvdGVjdGVkIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgcGFyZW50QWRhcHRlckZhY3Rvcnk7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHVzZWQgdG8gaW1wbGVtZW50IHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXJ9LgotCSAqLwotCXByb3RlY3RlZCBJQ2hhbmdlTm90aWZpZXIgY2hhbmdlTm90aWZpZXIgPSBuZXcgQ2hhbmdlTm90aWZpZXIoKTsKLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgYWxsIHRoZSBzdXBwb3J0ZWQgdHlwZXMgY2hlY2tlZCBieSB7QGxpbmsgI2lzRmFjdG9yeUZvclR5cGUgaXNGYWN0b3J5Rm9yVHlwZX0uCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gc3VwcG9ydGVkVHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkKLQlwdWJsaWMgSnBhQ29yZUphdmFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIHsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUl0ZW1MYWJlbFByb3ZpZGVyLmNsYXNzKTsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIEphdmFDb21waWxhdGlvblVuaXRJdGVtUHJvdmlkZXIgamF2YUNvbXBpbGF0aW9uVW5pdEl0ZW1Qcm92aWRlcjsKLQkKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVKcGFDb21waWxhdGlvblVuaXRBZGFwdGVyKCkgewotCQlpZiAoamF2YUNvbXBpbGF0aW9uVW5pdEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlqYXZhQ29tcGlsYXRpb25Vbml0SXRlbVByb3ZpZGVyID0gbmV3IEphdmFDb21waWxhdGlvblVuaXRJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQkJCi0JCXJldHVybiBqYXZhQ29tcGlsYXRpb25Vbml0SXRlbVByb3ZpZGVyOwotCX0KLQkKLQlwcm90ZWN0ZWQgSmF2YVBlcnNpc3RlbnRUeXBlSXRlbVByb3ZpZGVyIGphdmFQZXJzaXN0ZW50VHlwZUl0ZW1Qcm92aWRlcjsKLQkKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVKYXZhUGVyc2lzdGVudFR5cGVBZGFwdGVyKCkgewotCQlpZiAoamF2YVBlcnNpc3RlbnRUeXBlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWphdmFQZXJzaXN0ZW50VHlwZUl0ZW1Qcm92aWRlciA9IG5ldyBKYXZhUGVyc2lzdGVudFR5cGVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQkJCi0JCXJldHVybiBqYXZhUGVyc2lzdGVudFR5cGVJdGVtUHJvdmlkZXI7Ci0JfQotCQotCXByb3RlY3RlZCBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZUl0ZW1Qcm92aWRlciBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZUl0ZW1Qcm92aWRlcjsKLQkKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZUFkYXB0ZXIoKSB7Ci0JCWlmIChqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZUl0ZW1Qcm92aWRlciA9IG5ldyBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZUl0ZW1Qcm92aWRlcigKLQkJCQkJdGhpcyk7Ci0JCX0KLQkJCi0JCXJldHVybiBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZUl0ZW1Qcm92aWRlcjsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSByb290IGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGNvbnRhaW5zIHRoaXMgZmFjdG9yeS4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSBnZXRSb290QWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBwYXJlbnRBZGFwdGVyRmFjdG9yeSA9PSBudWxsID8gCi0JCQl0aGlzIDogCi0JCQlwYXJlbnRBZGFwdGVyRmFjdG9yeS5nZXRSb290QWRhcHRlckZhY3RvcnkoKTsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBzZXRzIHRoZSBjb21wb3NlZCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBjb250YWlucyB0aGlzIGZhY3RvcnkuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50QWRhcHRlckZhY3RvcnkoCi0JCQlDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHBhcmVudEFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXRoaXMucGFyZW50QWRhcHRlckZhY3RvcnkgPSBwYXJlbnRBZGFwdGVyRmFjdG9yeTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gc3VwcG9ydGVkVHlwZXMuY29udGFpbnModHlwZSkgfHwgc3VwZXIuaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKTsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzdWJzdGl0dXRlcyB0aGUgZmFjdG9yeSBpdHNlbGYgYXMgdGhlIGtleSBmb3IgdGhlIGFkYXB0ZXIuCi0JICovCi0JcHVibGljIEFkYXB0ZXIgYWRhcHQoTm90aWZpZXIgbm90aWZpZXIsIE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiBzdXBlci5hZGFwdChub3RpZmllciwgdGhpcyk7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgYWRhcHQoT2JqZWN0IG9iamVjdCwgT2JqZWN0IHR5cGUpIHsKLQkJaWYgKGlzRmFjdG9yeUZvclR5cGUodHlwZSkpIHsKLQkJCU9iamVjdCBhZGFwdGVyID0gc3VwZXIuYWRhcHQob2JqZWN0LCB0eXBlKTsKLQkJCWlmICghKHR5cGUgaW5zdGFuY2VvZiBDbGFzcykKLQkJCQkJfHwgKCgoQ2xhc3MpIHR5cGUpLmlzSW5zdGFuY2UoYWRhcHRlcikpKSB7Ci0JCQkJcmV0dXJuIGFkYXB0ZXI7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBsaXN0ZW5lci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgewotCQljaGFuZ2VOb3RpZmllci5hZGRMaXN0ZW5lcihub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIHJlbW92ZXMgYSBsaXN0ZW5lci4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgewotCQljaGFuZ2VOb3RpZmllci5yZW1vdmVMaXN0ZW5lcihub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIGRlbGVnYXRlcyB0byB7QGxpbmsgI2NoYW5nZU5vdGlmaWVyfSBhbmQgdG8ge0BsaW5rICNwYXJlbnRBZGFwdGVyRmFjdG9yeX0uCi0JICovCi0JcHVibGljIHZvaWQgZmlyZU5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQljaGFuZ2VOb3RpZmllci5maXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkKLQkJaWYgKHBhcmVudEFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCXBhcmVudEFkYXB0ZXJGYWN0b3J5LmZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBkaXNwb3NlcyBhbGwgb2YgdGhlIGl0ZW0gcHJvdmlkZXJzIGNyZWF0ZWQgYnkgdGhpcyBmYWN0b3J5LiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoamF2YUNvbXBpbGF0aW9uVW5pdEl0ZW1Qcm92aWRlciAhPSBudWxsKSB7Ci0JCQlqYXZhQ29tcGlsYXRpb25Vbml0SXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJfQotCQlpZiAoamF2YVBlcnNpc3RlbnRUeXBlSXRlbVByb3ZpZGVyICE9IG51bGwpIHsKLQkJCWphdmFQZXJzaXN0ZW50VHlwZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCX0KLQkJaWYgKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlSXRlbVByb3ZpZGVyICE9IG51bGwpIHsKLQkJCWphdmFQZXJzaXN0ZW50QXR0cmlidXRlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qZmFjZS9OdWxsTGFiZWxQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvamZhY2UvTnVsbExhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZiNjY1NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qZmFjZS9OdWxsTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qZmFjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotcHVibGljIGNsYXNzIE51bGxMYWJlbFByb3ZpZGVyIAotCWltcGxlbWVudHMgSUxhYmVsUHJvdmlkZXIgCi17Ci0JcHVibGljIHN0YXRpYyBOdWxsTGFiZWxQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBOdWxsTGFiZWxQcm92aWRlcigpOwotCQotCQotCXByaXZhdGUgTnVsbExhYmVsUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7fQotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7fQotCQotCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikge30KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pmYWNlL051bGxUcmVlQ29udGVudFByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9qZmFjZS9OdWxsVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjRhMjliLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL2pmYWNlL051bGxUcmVlQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqICBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiAgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiAgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpmYWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLQotcHVibGljIGNsYXNzIE51bGxUcmVlQ29udGVudFByb3ZpZGVyIAotCWltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIgCi17Ci0JcHVibGljIHN0YXRpYyBOdWxsVHJlZUNvbnRlbnRQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBOdWxsVHJlZUNvbnRlbnRQcm92aWRlcigpOwotCQotCQotCXByaXZhdGUgTnVsbFRyZWVDb250ZW50UHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQl9Ci0JCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7fQotCi0JcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7fQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvSnB0VWlNYXBwaW5nc0ltYWdlcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvSnB0VWlNYXBwaW5nc0ltYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWNhYjkzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL0pwdFVpTWFwcGluZ3NJbWFnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqICB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqICBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnB0VWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi1wdWJsaWMgY2xhc3MgSnB0VWlNYXBwaW5nc0ltYWdlcyAKLXsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBCQVNJQyA9ICJmdWxsL29iajE2L2Jhc2ljIjsKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBFTUJFRERBQkxFID0gImZ1bGwvb2JqMTYvZW1iZWRkYWJsZSI7Ci0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRU1CRURERUQgPSAiZnVsbC9vYmoxNi9lbWJlZGRlZCI7Ci0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRU1CRURERURfSUQgPSAiZnVsbC9vYmoxNi9lbWJlZGRlZC1pZCI7Ci0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRU5USVRZID0gImZ1bGwvb2JqMTYvZW50aXR5IjsKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBFTlRJVFlfTUFQUElOR1MgPSAiZnVsbC9vYmoxNi9lbnRpdHktbWFwcGluZ3MiOwotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElEID0gImZ1bGwvb2JqMTYvaWQiOwotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE5VTExfQVRUUklCVVRFX01BUFBJTkcgPSAiZnVsbC9vYmoxNi9udWxsLWF0dHJpYnV0ZS1tYXBwaW5nIjsKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBNQU5ZX1RPX01BTlkgPSAiZnVsbC9vYmoxNi9tYW55LXRvLW1hbnkiOwotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE1BTllfVE9fT05FID0gImZ1bGwvb2JqMTYvbWFueS10by1vbmUiOwotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE1BUFBFRF9TVVBFUkNMQVNTID0gImZ1bGwvb2JqMTYvbWFwcGVkLXN1cGVyY2xhc3MiOwotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE5VTExfVFlQRV9NQVBQSU5HID0gImZ1bGwvb2JqMTYvbnVsbC10eXBlLW1hcHBpbmciOwotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE9ORV9UT19NQU5ZID0gImZ1bGwvb2JqMTYvb25lLXRvLW1hbnkiOwotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE9ORV9UT19PTkUgPSAiZnVsbC9vYmoxNi9vbmUtdG8tb25lIjsKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBURU1QT1JBTCA9ICJmdWxsL29iajE2L3RlbXBvcmFsIjsKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBUUkFOU0lFTlQgPSAiZnVsbC9vYmoxNi90cmFuc2llbnQiOwotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZFUlNJT04gPSAiZnVsbC9vYmoxNi92ZXJzaW9uIjsKLQkKLQkKLQlwdWJsaWMgc3RhdGljIEltYWdlIGdldEltYWdlKFN0cmluZyBpbWFnZUxvY2F0b3IpIHsKLQkJcmV0dXJuIEpwdFVpUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlRGVzY3JpcHRvcihpbWFnZUxvY2F0b3IpLmNyZWF0ZUltYWdlKCk7Ci0JfQotCQotCQotCXByaXZhdGUgSnB0VWlNYXBwaW5nc0ltYWdlcygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvSnB0VWlNYXBwaW5nc01lc3NhZ2VzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9KcHRVaU1hcHBpbmdzTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDMzODBlNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9KcHRVaU1hcHBpbmdzTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24gYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovICAgCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBKcHRVaU1hcHBpbmdzTWVzc2FnZXMgZXh0ZW5kcyBOTFMgCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gImpwdF91aV9tYXBwaW5ncyI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW50VHlwZVBhZ2VfRW50aXR5TGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVudFR5cGVQYWdlX0VtYmVkZGFibGVMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW50VHlwZVBhZ2VfTWFwcGVkU3VwZXJjbGFzc0xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVudEF0dHJpYnV0ZVBhZ2VfQmFzaWNMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW50QXR0cmlidXRlUGFnZV9UcmFuc2llbnRMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW50QXR0cmlidXRlUGFnZV9JZExhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbnRBdHRyaWJ1dGVQYWdlX09uZVRvTWFueUxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbnRBdHRyaWJ1dGVQYWdlX01hbnlUb09uZUxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbnRBdHRyaWJ1dGVQYWdlX01hbnlUb01hbnlMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW50QXR0cmlidXRlUGFnZV9WZXJzaW9uTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVudEF0dHJpYnV0ZVBhZ2VfRW1iZWRkZWRMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW50QXR0cmlidXRlUGFnZV9FbWJlZGRlZElkTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVudEF0dHJpYnV0ZVBhZ2VfT25lVG9PbmVMYWJlbDsKLQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudGl0eUdlbmVyYWxTZWN0aW9uX25hbWVEZWZhdWx0V2l0aE9uZVBhcmFtOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudGl0eUdlbmVyYWxTZWN0aW9uX25hbWVEZWZhdWx0RW1wdHk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW50aXR5R2VuZXJhbFNlY3Rpb25fbmFtZTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCYXNpY0dlbmVyYWxTZWN0aW9uX25hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNHZW5lcmFsU2VjdGlvbl9uYW1lRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCYXNpY0dlbmVyYWxTZWN0aW9uX2ZldGNoTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNHZW5lcmFsU2VjdGlvbl9vcHRpb25hbExhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhc2ljR2VuZXJhbFNlY3Rpb25fbG9iTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNHZW5lcmFsU2VjdGlvbl90ZW1wb3JhbExhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhc2ljR2VuZXJhbFNlY3Rpb25fZW51bWVyYXRlZExhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW50aXR5Q29tcG9zaXRlX3RhYmxlRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbnRpdHlDb21wb3NpdGVfdGFibGVOb0RlZmF1bHRTcGVjaWZpZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW50aXR5Q29tcG9zaXRlX2luaGVyaXRhbmNlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhYmxlQ29tcG9zaXRlX3RhYmxlU2VjdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYWJsZUNvbXBvc2l0ZV9kZWZhdWx0RW1wdHk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFibGVDb21wb3NpdGVfZGVmYXVsdFdpdGhPbmVQYXJhbTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYWJsZUNob29zZXJfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2F0YWxvZ0Nob29zZXJfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZW1hQ2hvb3Nlcl9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbHVtbkNob29zZXJfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29sdW1uVGFibGVDaG9vc2VyX2xhYmVsOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhcmdldEVudGl0eUNob29zZXJfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFyZ2V0RW50aXR5Q2hvb3Nlcl9kZWZhdWx0RW1wdHk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFyZ2V0RW50aXR5Q2hvb3Nlcl9kZWZhdWx0V2l0aE9uZVBhcmFtOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhcmdldEVudGl0eUNob29zZXJfYnJvd3NlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5vbk93bmluZ01hcHBpbmdfbWFwcGVkQnlMYWJlbDsKLQkJCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pblRhYmxlQ29tcG9zaXRlX2FkZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luVGFibGVDb21wb3NpdGVfZGVmYXVsdEVtcHR5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5UYWJsZUNvbXBvc2l0ZV9kZWZhdWx0V2l0aE9uZVBhcmFtOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5UYWJsZUNvbXBvc2l0ZV9lZGl0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5UYWJsZUNvbXBvc2l0ZV9pbnZlcnNlSm9pbkNvbHVtbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luVGFibGVDb21wb3NpdGVfam9pbkNvbHVtbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luVGFibGVDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pblRhYmxlQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luVGFibGVDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNCb3RoRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luVGFibGVDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNGaXJzdERlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pblRhYmxlQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zU2VjRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luVGFibGVDb21wb3NpdGVfbmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luVGFibGVDb21wb3NpdGVfcmVtb3ZlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5UYWJsZUNvbXBvc2l0ZV9vdmVycmlkZURlZmF1bHRKb2luQ29sdW1uczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luVGFibGVDb21wb3NpdGVfb3ZlcnJpZGVEZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW5zOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pbkNvbHVtbkRpYWxvZ19hZGRKb2luQ29sdW1uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5Db2x1bW5EaWFsb2dfZWRpdEpvaW5Db2x1bW47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pbkNvbHVtbkRpYWxvZ19uYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5Db2x1bW5EaWFsb2dfaW5zZXJ0YWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uRGlhbG9nX3VwZGF0YWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uRGlhbG9nX2RlZmF1bHRXaXRoT25lUGFyYW07Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pbkNvbHVtbkRpYWxvZ19yZWZlcmVuY2VkQ29sdW1uTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uRGlhbG9nX3RhYmxlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEludmVyc2VKb2luQ29sdW1uRGlhbG9nX2RlZmF1bHRXaXRoT25lUGFyYW07Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW52ZXJzZUpvaW5Db2x1bW5EaWFsb2dfZWRpdEludmVyc2VKb2luQ29sdW1uOwotCi0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nQ29tcG9zaXRlX2Nhc2NhZGVUeXBlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ0NvbXBvc2l0ZV9mZXRjaFR5cGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nQ29tcG9zaXRlX2dlbmVyYWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nQ29tcG9zaXRlX2pvaW5UYWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdDb21wb3NpdGVfbWFwcGVkQnk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nQ29tcG9zaXRlX3RhcmdldEVudGl0eTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbHVtbkNvbXBvc2l0ZV9jb2x1bW5TZWN0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbHVtbkNvbXBvc2l0ZV9kZWZhdWx0V2l0aE9uZVBhcmFtOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbHVtbkNvbXBvc2l0ZV9kZWZhdWx0RW1wdHk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29sdW1uQ29tcG9zaXRlX2luc2VydGFibGU7CQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbHVtbkNvbXBvc2l0ZV91cGRhdGFibGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uQ29tcG9zaXRlX2RlZmF1bHRFbXB0eTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uQ29tcG9zaXRlX2RlZmF1bHRXaXRoT25lUGFyYW07Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pbkNvbHVtbkNvbXBvc2l0ZV9qb2luQ29sdW1uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5Db2x1bW5Db21wb3NpdGVfbmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uQ29tcG9zaXRlX2FkZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uQ29tcG9zaXRlX2VkaXQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pbkNvbHVtbkNvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zQm90aERlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pbkNvbHVtbkNvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtc0ZpcnN0RGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zU2VjRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uQ29tcG9zaXRlX3JlbW92ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uQ29tcG9zaXRlX292ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5zOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX292ZXJyaWRlRGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfYWRkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9lZGl0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9yZW1vdmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX2RlZmF1bHRFbXB0eTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfZGVmYXVsdFdpdGhPbmVQYXJhbTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfcHJpbWFyeUtleUpvaW5Db2x1bW47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtc0RlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zQm90aERlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zRmlyc3REZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtc1NlY0RlZmF1bHQ7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXR0cmlidXRlT3ZlcnJpZGVzQ29tcG9zaXRlX2F0dHJpYnV0ZU92ZXJyaWRlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdHRyaWJ1dGVPdmVycmlkZXNDb21wb3NpdGVfb3ZlcnJpZERlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3ZlcnJpZGVzQ29tcG9zaXRlX2pvaW5Db2x1bW47Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbmhlcml0YW5jZUNvbXBvc2l0ZV9kZWZhdWx0OwkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbmhlcml0YW5jZUNvbXBvc2l0ZV9zdHJhdGVneTsJCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5oZXJpdGFuY2VDb21wb3NpdGVfZGlzY3JpbWluYXRvclZhbHVlOwkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbmhlcml0YW5jZUNvbXBvc2l0ZV9kaXNjcmltaW5hdG9yVmFsdWVEZWZhdWx0V2l0aE9uZVBhcmFtOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlzY3JpbWluYXRvckNvbHVtbkNvbXBvc2l0ZV9kZWZhdWx0RW1wdHk7CQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpc2NyaW1pbmF0b3JDb2x1bW5Db21wb3NpdGVfY29sdW1uOwkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaXNjcmltaW5hdG9yQ29sdW1uQ29tcG9zaXRlX2Rpc2NyaW1pbmF0b3JUeXBlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVkVmFsdWVDb21wb3NpdGVfZ2VuZXJhdGVkVmFsdWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVkVmFsdWVDb21wb3NpdGVfZ2VuZXJhdG9yTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZWRWYWx1ZUNvbXBvc2l0ZV9zdHJhdGVneTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX2RlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFibGVHZW5lcmF0b3JDb21wb3NpdGVfbmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV9wa0NvbHVtbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV9wa0NvbHVtblZhbHVlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX3RhYmxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX3RhYmxlR2VuZXJhdG9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX3ZhbHVlQ29sdW1uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGVfc2VxdWVuY2VHZW5lcmF0b3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGVfbmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZV9zZXF1ZW5jZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZV9kZWZhdWx0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSWRNYXBwaW5nQ29tcG9zaXRlX3BrX2dlbmVyYXRpb247CQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElkTWFwcGluZ0NvbXBvc2l0ZV9wcmltYXJ5S2V5R2VuZXJhdGlvbjsJCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSWRNYXBwaW5nQ29tcG9zaXRlX3RhYmxlR2VuZXJhdG9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElkTWFwcGluZ0NvbXBvc2l0ZV9zZXF1ZW5jZUdlbmVyYXRvcjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9yZGVyQnlDb21wb3NpdGVfb3JkZXJCeUdyb3VwOwkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcmRlckJ5Q29tcG9zaXRlX25vT3JkZXJpbmc7CQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9yZGVyQnlDb21wb3NpdGVfcHJpbWFyeUtleU9yZGVyaW5nOwkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcmRlckJ5Q29tcG9zaXRlX2N1c3RvbU9yZGVyaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9yZGVyQnlDb21wb3NpdGVfb3JkZXJCeUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlX3NlY29uZGFyeVRhYmxlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWNvbmRhcnlUYWJsZXNDb21wb3NpdGVfYWRkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZV9lZGl0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZV9yZW1vdmU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWNvbmRhcnlUYWJsZURpYWxvZ19lZGl0U2Vjb25kYXJ5VGFibGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2Vjb25kYXJ5VGFibGVEaWFsb2dfbmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWNvbmRhcnlUYWJsZURpYWxvZ19jYXRhbG9nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlY29uZGFyeVRhYmxlRGlhbG9nX3NjaGVtYTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWNvbmRhcnlUYWJsZURpYWxvZ19kZWZhdWx0U2NoZW1hOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlY29uZGFyeVRhYmxlRGlhbG9nX2RlZmF1bHRDYXRhbG9nOwkKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY2Nlc3NUeXBlQ29tYm9fZGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbnVtQ29tYm9WaWV3ZXJfZGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNZXRhRGF0YUNvbXBsZXRlQ29tYm9fRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uRGlhbG9nX2RlZmF1bHRUcnVlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluaGVyaXRhbmNlQ29tcG9zaXRlX2RlZmF1bHREaXNjcmltaW5hdG9yVHlwZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZWRWYWx1ZUNvbXBvc2l0ZV9kZWZhdWx0OwotCQotCXN0YXRpYyB7Ci0JCS8vIGluaXRpYWxpemUgcmVzb3VyY2UgYnVuZGxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBKcHRVaU1hcHBpbmdzTWVzc2FnZXMoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9BYnN0cmFjdEpvaW5Db2x1bW5EaWFsb2cuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvQWJzdHJhY3RKb2luQ29sdW1uRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0MzVjMzAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9BYnN0cmFjdEpvaW5Db2x1bW5EaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24gYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklBYnN0cmFjdEpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5JSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLy9pZiB0aGVyZSBpcyBvbmx5IDEgam9pbkNvbHVtbiBhbmQgdGhlIHVzZXIgaXMgZWRpdGluZyBpdCwgdGhleSBzaG91bGQgYmUKLS8vYWJsZSB0byBkZWZpbmUgZGVmYXVsdHMuICBvdGhlcndpc2UsIHdlIHByb2JhYmx5IHNob3VsZG4ndCBhbGxvdyBpdC4KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEpvaW5Db2x1bW5EaWFsb2c8RSBleHRlbmRzIElBYnN0cmFjdEpvaW5Db2x1bW4+IGV4dGVuZHMgRGlhbG9nIHsKLQotCS8vaWYgY3JlYXRpbmcgYSBuZXcgSm9pbkNvbHVtbiwgdGhpcyB3aWxsIGJlIG51bGwsIAotCS8vc3BlY2lmeSB0aGUgSm9pbkNvbHVtbk93bmVyIGluc3RlYWQgaW4gdGhlIGFwcHJvcHJpYXRlIGNvbnN0cnV0b3IKLQlwcml2YXRlIEUgam9pbkNvbHVtbjsKLQkKLQlwcml2YXRlIENvbWJvIG5hbWVDb21ibzsKLQlwcml2YXRlIENvbWJvIHJlZmVyZW5jZWRDb2x1bW5OYW1lQ29tYm87Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGRlZmF1bHROYW1lU2VsZWN0ZWQ7Ci0JcHJpdmF0ZSBTdHJpbmcgc2VsZWN0ZWROYW1lOwotCXByaXZhdGUgYm9vbGVhbiBkZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWVTZWxlY3RlZDsKLQlwcml2YXRlIFN0cmluZyBzZWxlY3RlZFJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCQotCUFic3RyYWN0Sm9pbkNvbHVtbkRpYWxvZyhTaGVsbCBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQlBYnN0cmFjdEpvaW5Db2x1bW5EaWFsb2coU2hlbGwgcGFyZW50LCBFIGpvaW5Db2x1bW4pIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5qb2luQ29sdW1uID0gam9pbkNvbHVtbjsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRBZGRUaXRsZSgpIHsKLQkJcmV0dXJuIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Kb2luQ29sdW1uRGlhbG9nX2FkZEpvaW5Db2x1bW47Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRFZGl0VGl0bGUoKSB7Ci0JCXJldHVybiBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSm9pbkNvbHVtbkRpYWxvZ19lZGl0Sm9pbkNvbHVtbjsKLQl9Ci0JCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWlmICh0aGlzLmpvaW5Db2x1bW4gPT0gbnVsbCkgewotCQkJZ2V0U2hlbGwoKS5zZXRUZXh0KGdldEFkZFRpdGxlKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJZ2V0U2hlbGwoKS5zZXRUZXh0KGdldEVkaXRUaXRsZSgpKTsKLQkJfQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSAoR3JpZExheW91dCkgY29tcG9zaXRlLmdldExheW91dCgpOwotCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQkKLQkJTGFiZWwgbmFtZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULkxFRlQpOwotCQluYW1lTGFiZWwuc2V0VGV4dChKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSm9pbkNvbHVtbkRpYWxvZ19uYW1lKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJbmFtZUxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkKLQkJdGhpcy5uYW1lQ29tYm8gPSBuZXcgQ29tYm8oY29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCXRoaXMubmFtZUNvbWJvLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRoaXMubmFtZUNvbWJvLCBJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19KT0lOX0NPTFVNTl9OQU1FKTsKLQkJcG9wdWxhdGVOYW1lQ29tYm8oKTsKLQkKLQkJTGFiZWwgcmVmZXJlbmNlZENvbHVtbk5hbWVMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5MRUZUKTsKLQkJcmVmZXJlbmNlZENvbHVtbk5hbWVMYWJlbC5zZXRUZXh0KEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Kb2luQ29sdW1uRGlhbG9nX3JlZmVyZW5jZWRDb2x1bW5OYW1lKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJcmVmZXJlbmNlZENvbHVtbk5hbWVMYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQl0aGlzLnJlZmVyZW5jZWRDb2x1bW5OYW1lQ29tYm8gPSBuZXcgQ29tYm8oY29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCXRoaXMucmVmZXJlbmNlZENvbHVtbk5hbWVDb21iby5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0aGlzLnJlZmVyZW5jZWRDb2x1bW5OYW1lQ29tYm8sIElKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX0pPSU5fUkVGRVJFTkNFRF9DT0xVTU4pOwotCQlwb3B1bGF0ZVJlZmVyZW5jZWROYW1lQ29tYm8oKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZU5hbWVDb21ibygpIHsKLQkJdGhpcy5uYW1lQ29tYm8ucmVtb3ZlQWxsKCk7Ci0JCWlmIChnZXRKb2luQ29sdW1uKCkgIT0gbnVsbCkgewotCQkJdGhpcy5uYW1lQ29tYm8uYWRkKE5MUy5iaW5kKEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Kb2luQ29sdW1uRGlhbG9nX2RlZmF1bHRXaXRoT25lUGFyYW0sIGdldEpvaW5Db2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKSk7Ci0JCX0KLQkJVGFibGUgdGFibGUgPSBnZXROYW1lVGFibGUoKTsKLQkJaWYgKHRhYmxlICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaSA9IHRhYmxlLmNvbHVtbk5hbWVzKCk7IGkuaGFzTmV4dCgpOyApIHsKLQkJCQl0aGlzLm5hbWVDb21iby5hZGQoKFN0cmluZykgaS5uZXh0KCkpOwotCQkJfQotCQl9Ci0JCWlmIChnZXRKb2luQ29sdW1uKCkgIT0gbnVsbCkgewotCQkJaWYgKGdldEpvaW5Db2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkgIT0gbnVsbCkgewotCQkJCXRoaXMubmFtZUNvbWJvLnNldFRleHQoZ2V0Sm9pbkNvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0aGlzLm5hbWVDb21iby5zZWxlY3QoMCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIENvbWJvIGdldE5hbWVDb21ibygpIHsKLQkJcmV0dXJuIHRoaXMubmFtZUNvbWJvOwotCX0KLQkKLQlwcm90ZWN0ZWQgQ29tYm8gZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWVDb21ibygpIHsKLQkJcmV0dXJuIHRoaXMucmVmZXJlbmNlZENvbHVtbk5hbWVDb21ibzsKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IFRhYmxlIGdldE5hbWVUYWJsZSgpOwotCQotCXByb3RlY3RlZCBhYnN0cmFjdCBUYWJsZSBnZXRSZWZlcmVuY2VkTmFtZVRhYmxlKCk7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZVJlZmVyZW5jZWROYW1lQ29tYm8oKSB7Ci0JCWlmIChnZXRKb2luQ29sdW1uKCkgIT0gbnVsbCkgewotCQkJdGhpcy5yZWZlcmVuY2VkQ29sdW1uTmFtZUNvbWJvLmFkZChOTFMuYmluZChKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSm9pbkNvbHVtbkRpYWxvZ19kZWZhdWx0V2l0aE9uZVBhcmFtLCBnZXRKb2luQ29sdW1uKCkuZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpKTsKLQkJfQotCQlUYWJsZSByZWZlcmVuY2VkTmFtZVRhYmxlID0gZ2V0UmVmZXJlbmNlZE5hbWVUYWJsZSgpOwotCQlpZiAocmVmZXJlbmNlZE5hbWVUYWJsZSAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGkgPSByZWZlcmVuY2VkTmFtZVRhYmxlLmNvbHVtbk5hbWVzKCk7IGkuaGFzTmV4dCgpOyApIHsKLQkJCQl0aGlzLnJlZmVyZW5jZWRDb2x1bW5OYW1lQ29tYm8uYWRkKChTdHJpbmcpIGkubmV4dCgpKTsKLQkJCX0KLQkJfQotCQlpZiAoZ2V0Sm9pbkNvbHVtbigpICE9IG51bGwpIHsKLQkJCWlmIChnZXRKb2luQ29sdW1uKCkuZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSAhPSBudWxsKSB7Ci0JCQkJdGhpcy5yZWZlcmVuY2VkQ29sdW1uTmFtZUNvbWJvLnNldFRleHQoZ2V0Sm9pbkNvbHVtbigpLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGhpcy5yZWZlcmVuY2VkQ29sdW1uTmFtZUNvbWJvLnNlbGVjdCgwKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgRSBnZXRKb2luQ29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy5qb2luQ29sdW1uOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0RlZmF1bHROYW1lU2VsZWN0ZWQoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHROYW1lU2VsZWN0ZWQ7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5zZWxlY3RlZE5hbWU7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGlzRGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lU2VsZWN0ZWQoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZVNlbGVjdGVkOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgewotCQlyZXR1cm4gdGhpcy5zZWxlY3RlZFJlZmVyZW5jZWRDb2x1bW5OYW1lOwkJCQotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjbG9zZSgpIHsKLQkJdGhpcy5kZWZhdWx0TmFtZVNlbGVjdGVkID0gdGhpcy5uYW1lQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSA9PSAwOwotCQl0aGlzLnNlbGVjdGVkTmFtZSA9IHRoaXMubmFtZUNvbWJvLmdldFRleHQoKTsKLQkJdGhpcy5kZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWVTZWxlY3RlZCA9IHRoaXMucmVmZXJlbmNlZENvbHVtbk5hbWVDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpID09IDA7Ci0JCXRoaXMuc2VsZWN0ZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSA9IHRoaXMucmVmZXJlbmNlZENvbHVtbk5hbWVDb21iby5nZXRUZXh0KCk7Ci0JCXJldHVybiBzdXBlci5jbG9zZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9CYXNpY0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9CYXNpY0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTI1NDJiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvQmFzaWNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24gYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5EZWZhdWx0RWFnZXJGZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuRGVmYXVsdFRydWVCb29sZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLkVudW1UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklCYXNpYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5KcGFDb3JlTWFwcGluZ3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLlRlbXBvcmFsVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSUpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkJhc2VKcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHMuRW51bUNvbWJvVmlld2VyLkVudW1Ib2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSVdvcmtiZW5jaEhlbHBTeXN0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBCYXNpY0NvbXBvc2l0ZSBleHRlbmRzIEJhc2VKcGFDb21wb3NpdGUgCi17Ci0JcHJpdmF0ZSBJQmFzaWMgYmFzaWM7Ci0JCi0JcHJpdmF0ZSBDb2x1bW5Db21wb3NpdGUgY29sdW1uQ29tcG9zaXRlOwotCi0JcHJpdmF0ZSBFbnVtQ29tYm9WaWV3ZXIgZmV0Y2hUeXBlQ29tYm9WaWV3ZXI7Ci0JcHJpdmF0ZSBFbnVtQ29tYm9WaWV3ZXIgb3B0aW9uYWxDb21ib1ZpZXdlcjsKLQlwcml2YXRlIExvYkNoZWNrQm94IGxvYkNoZWNrQm94OwotCXByaXZhdGUgRW51bUNvbWJvVmlld2VyIHRlbXBvcmFsVHlwZVZpZXdlcjsKLQlwcml2YXRlIEVudW1Db21ib1ZpZXdlciBlbnVtZXJhdGVkVHlwZVZpZXdlcjsKLQkJCi0JcHVibGljIEJhc2ljQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIENvbW1hbmRTdGFjayBjb21tYW5kU3RhY2ssIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJc3VwZXIocGFyZW50LCBTV1QuTlVMTCwgY29tbWFuZFN0YWNrLCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCi0JCUNvbnRyb2wgZ2VuZXJhbENvbnRyb2wgPSBidWlsZEdlbmVyYWxDb21wb3NpdGUoY29tcG9zaXRlKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlnZW5lcmFsQ29udHJvbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCX0KLQkKLQlwcml2YXRlIENvbnRyb2wgYnVpbGRHZW5lcmFsQ29tcG9zaXRlKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJSVdvcmtiZW5jaEhlbHBTeXN0ZW0gaGVscFN5c3RlbSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpOwotCQkKLQkJQ29tcG9zaXRlIGdlbmVyYWxDb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ29tcG9zaXRlKGNvbXBvc2l0ZSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlnZW5lcmFsQ29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwkKLQotCQl0aGlzLmNvbHVtbkNvbXBvc2l0ZSA9IG5ldyBDb2x1bW5Db21wb3NpdGUoZ2VuZXJhbENvbXBvc2l0ZSwgdGhpcy5jb21tYW5kU3RhY2ssIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQl0aGlzLmNvbHVtbkNvbXBvc2l0ZS5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7CQkKLQkJCi0JCUNvbW1vbldpZGdldHMuYnVpbGRGZXRjaExhYmVsKGdlbmVyYWxDb21wb3NpdGUsIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCXRoaXMuZmV0Y2hUeXBlQ29tYm9WaWV3ZXIgPSBDb21tb25XaWRnZXRzLmJ1aWxkRmV0Y2hUeXBlQ29tYm9WaWV3ZXIoZ2VuZXJhbENvbXBvc2l0ZSwgdGhpcy5jb21tYW5kU3RhY2ssIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuQkVHSU5OSU5HOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJdGhpcy5mZXRjaFR5cGVDb21ib1ZpZXdlci5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWhlbHBTeXN0ZW0uc2V0SGVscChmZXRjaFR5cGVDb21ib1ZpZXdlci5nZXRDb250cm9sKCksIElKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX0ZFVENIX1RZUEUpOwotCi0JCUNvbW1vbldpZGdldHMuYnVpbGRPcHRpb25hbExhYmVsKGdlbmVyYWxDb21wb3NpdGUsIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCXRoaXMub3B0aW9uYWxDb21ib1ZpZXdlciA9IENvbW1vbldpZGdldHMuYnVpbGRFbnVtQ29tYm9WaWV3ZXIoZ2VuZXJhbENvbXBvc2l0ZSwgdGhpcy5jb21tYW5kU3RhY2ssIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuQkVHSU5OSU5HOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJdGhpcy5vcHRpb25hbENvbWJvVmlld2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJaGVscFN5c3RlbS5zZXRIZWxwKG9wdGlvbmFsQ29tYm9WaWV3ZXIuZ2V0Q29udHJvbCgpLCBJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19PUFRJT05BTCk7Ci0JCQkKLQkJQ29tbW9uV2lkZ2V0cy5idWlsZFRlbXBvcmFsTGFiZWwoZ2VuZXJhbENvbXBvc2l0ZSwgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQkJdGhpcy50ZW1wb3JhbFR5cGVWaWV3ZXIgPSBDb21tb25XaWRnZXRzLmJ1aWxkRW51bUNvbWJvVmlld2VyKGdlbmVyYWxDb21wb3NpdGUsIHRoaXMuY29tbWFuZFN0YWNrLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkJFR0lOTklORzsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXRoaXMudGVtcG9yYWxUeXBlVmlld2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJaGVscFN5c3RlbS5zZXRIZWxwKHRlbXBvcmFsVHlwZVZpZXdlci5nZXRDb250cm9sKCksIElKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX1RFTVBPUkFMKTsKLQotCQlDb21tb25XaWRnZXRzLmJ1aWxkRW51bWVyYXRlZExhYmVsKGdlbmVyYWxDb21wb3NpdGUsIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCXRoaXMuZW51bWVyYXRlZFR5cGVWaWV3ZXIgPSBDb21tb25XaWRnZXRzLmJ1aWxkRW51bUNvbWJvVmlld2VyKGdlbmVyYWxDb21wb3NpdGUsIHRoaXMuY29tbWFuZFN0YWNrLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkJFR0lOTklORzsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXRoaXMuZW51bWVyYXRlZFR5cGVWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQloZWxwU3lzdGVtLnNldEhlbHAoZW51bWVyYXRlZFR5cGVWaWV3ZXIuZ2V0Q29udHJvbCgpLCBJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19FTlVNRVJBVEVEKTsKLQotCSAgICB0aGlzLmxvYkNoZWNrQm94ID0gYnVpbGRMb2JDaGVja0JveChnZW5lcmFsQ29tcG9zaXRlKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5CRUdJTk5JTkc7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXRoaXMubG9iQ2hlY2tCb3guZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQloZWxwU3lzdGVtLnNldEhlbHAobG9iQ2hlY2tCb3guZ2V0Q29udHJvbCgpLCBJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19MT0IpOwotCi0JCXJldHVybiBnZW5lcmFsQ29tcG9zaXRlOwotCX0KLQkKLQlwcml2YXRlIExvYkNoZWNrQm94IGJ1aWxkTG9iQ2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IExvYkNoZWNrQm94KHBhcmVudCwgdGhpcy5jb21tYW5kU3RhY2ssIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRvUG9wdWxhdGUoRU9iamVjdCBvYmopIHsKLQkJdGhpcy5iYXNpYyA9IChJQmFzaWMpIG9iajsKLQkJaWYgKHRoaXMuYmFzaWMgIT0gbnVsbCkgewotCQkJdGhpcy5jb2x1bW5Db21wb3NpdGUucG9wdWxhdGUodGhpcy5iYXNpYy5nZXRDb2x1bW4oKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLmNvbHVtbkNvbXBvc2l0ZS5wb3B1bGF0ZShudWxsKTsKLQkJfQotCQl0aGlzLmZldGNoVHlwZUNvbWJvVmlld2VyLnBvcHVsYXRlKG5ldyBGZXRjaEhvbGRlcih0aGlzLmJhc2ljKSk7Ci0JCXRoaXMub3B0aW9uYWxDb21ib1ZpZXdlci5wb3B1bGF0ZShuZXcgT3B0aW9uYWxIb2xkZXIodGhpcy5iYXNpYykpOwotCQl0aGlzLmxvYkNoZWNrQm94LnBvcHVsYXRlKHRoaXMuYmFzaWMpOwotCQl0aGlzLnRlbXBvcmFsVHlwZVZpZXdlci5wb3B1bGF0ZShuZXcgVGVtcG9yYWxUeXBlSG9sZGVyKHRoaXMuYmFzaWMpKTsKLQkJdGhpcy5lbnVtZXJhdGVkVHlwZVZpZXdlci5wb3B1bGF0ZShuZXcgRW51bWVyYXRlZFR5cGVIb2xkZXIodGhpcy5iYXNpYykpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkb1BvcHVsYXRlKCkgewotCQl0aGlzLmNvbHVtbkNvbXBvc2l0ZS5wb3B1bGF0ZSgpOwotCQl0aGlzLmZldGNoVHlwZUNvbWJvVmlld2VyLnBvcHVsYXRlKCk7Ci0JCXRoaXMub3B0aW9uYWxDb21ib1ZpZXdlci5wb3B1bGF0ZSgpOwotCQl0aGlzLmxvYkNoZWNrQm94LnBvcHVsYXRlKCk7Ci0JCXRoaXMudGVtcG9yYWxUeXBlVmlld2VyLnBvcHVsYXRlKCk7Ci0JCXRoaXMuZW51bWVyYXRlZFR5cGVWaWV3ZXIucG9wdWxhdGUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTGlzdGVuZXJzKCkgewotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VMaXN0ZW5lcnMoKSB7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXRoaXMuY29sdW1uQ29tcG9zaXRlLmRpc3Bvc2UoKTsKLQkJdGhpcy5mZXRjaFR5cGVDb21ib1ZpZXdlci5kaXNwb3NlKCk7Ci0JCXRoaXMub3B0aW9uYWxDb21ib1ZpZXdlci5kaXNwb3NlKCk7Ci0JCXRoaXMubG9iQ2hlY2tCb3guZGlzcG9zZSgpOwotCQl0aGlzLnRlbXBvcmFsVHlwZVZpZXdlci5kaXNwb3NlKCk7Ci0JCXRoaXMuZW51bWVyYXRlZFR5cGVWaWV3ZXIuZGlzcG9zZSgpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBJQmFzaWMgZ2V0QmFzaWMoKSB7Ci0JCXJldHVybiB0aGlzLmJhc2ljOwotCX0KLQkKLQlwcml2YXRlIGNsYXNzIEZldGNoSG9sZGVyIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBFbnVtSG9sZGVyIHsKLQkJCi0JCXByaXZhdGUgSUJhc2ljIGJhc2ljOwotCQkKLQkJRmV0Y2hIb2xkZXIoSUJhc2ljIGJhc2ljKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5iYXNpYyA9IGJhc2ljOwotCQl9Ci0JCQotCQlwdWJsaWMgT2JqZWN0IGdldCgpIHsKLQkJCXJldHVybiB0aGlzLmJhc2ljLmdldEZldGNoKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNldChPYmplY3QgZW51bVNldHRpbmcpIHsKLQkJCXRoaXMuYmFzaWMuc2V0RmV0Y2goKERlZmF1bHRFYWdlckZldGNoVHlwZSkgZW51bVNldHRpbmcpOwotCQkJCi0JCX0KLQkJCi0JCXB1YmxpYyBDbGFzcyBmZWF0dXJlQ2xhc3MoKSB7Ci0JCQlyZXR1cm4gSUJhc2ljLmNsYXNzOwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGZlYXR1cmVJZCgpIHsKLQkJCXJldHVybiBKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLklCQVNJQ19fRkVUQ0g7Ci0JCX0KLQkJCi0JCXB1YmxpYyBFT2JqZWN0IHdyYXBwZWRPYmplY3QoKSB7Ci0JCQlyZXR1cm4gdGhpcy5iYXNpYzsKLQkJfQotCQkKLQkJcHVibGljIE9iamVjdFtdIGVudW1WYWx1ZXMoKSB7Ci0JCQlyZXR1cm4gRGVmYXVsdEVhZ2VyRmV0Y2hUeXBlLlZBTFVFUy50b0FycmF5KCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBPYmplY3QgZGVmYXVsdFZhbHVlKCkgewotCQkJcmV0dXJuIERlZmF1bHRFYWdlckZldGNoVHlwZS5ERUZBVUxUOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGRlZmF1bHRTdHJpbmcoKSB7Ci0JCQkvL1RPRE8gbW92ZSB0aGlzIG91dCBvZiB0aGUgVUkgaW50byB0aGUgbW9kZWwKLQkJCXJldHVybiAiRWFnZXIiOwotCQl9Ci0JfQotCi0JCi0JcHJpdmF0ZSBjbGFzcyBPcHRpb25hbEhvbGRlciBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgRW51bUhvbGRlciB7Ci0JCQotCQlwcml2YXRlIElCYXNpYyBiYXNpYzsKLQkJCi0JCU9wdGlvbmFsSG9sZGVyKElCYXNpYyBiYXNpYykgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuYmFzaWMgPSBiYXNpYzsKLQkJfQotCQkKLQkJcHVibGljIE9iamVjdCBnZXQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5iYXNpYy5nZXRPcHRpb25hbCgpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXQoT2JqZWN0IGVudW1TZXR0aW5nKSB7Ci0JCQl0aGlzLmJhc2ljLnNldE9wdGlvbmFsKChEZWZhdWx0VHJ1ZUJvb2xlYW4pIGVudW1TZXR0aW5nKTsKLQkJfQotCQkKLQkJcHVibGljIENsYXNzIGZlYXR1cmVDbGFzcygpIHsKLQkJCXJldHVybiBJQmFzaWMuY2xhc3M7Ci0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgZmVhdHVyZUlkKCkgewotCQkJcmV0dXJuIEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSUJBU0lDX19PUFRJT05BTDsKLQkJfQotCQkKLQkJcHVibGljIEVPYmplY3Qgd3JhcHBlZE9iamVjdCgpIHsKLQkJCXJldHVybiB0aGlzLmJhc2ljOwotCQl9Ci0JCQotCQlwdWJsaWMgT2JqZWN0W10gZW51bVZhbHVlcygpIHsKLQkJCXJldHVybiBEZWZhdWx0VHJ1ZUJvb2xlYW4uVkFMVUVTLnRvQXJyYXkoKTsKLQkJfQotCQkKLQkJcHVibGljIE9iamVjdCBkZWZhdWx0VmFsdWUoKSB7Ci0JCQlyZXR1cm4gRGVmYXVsdFRydWVCb29sZWFuLkRFRkFVTFQ7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZGVmYXVsdFN0cmluZygpIHsKLQkJCS8vVE9ETyBtb3ZlIHRoaXMgb3V0IG9mIHRoZSBVSSBpbnRvIHRoZSBtb2RlbAotCQkJcmV0dXJuICJUcnVlIjsKLQkJfQotCi0JfQotCi0JCi0JcHJpdmF0ZSBjbGFzcyBUZW1wb3JhbFR5cGVIb2xkZXIgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEVudW1Ib2xkZXIgewotCQkKLQkJcHJpdmF0ZSBJQmFzaWMgYmFzaWM7Ci0JCQotCQlUZW1wb3JhbFR5cGVIb2xkZXIoSUJhc2ljIGJhc2ljKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5iYXNpYyA9IGJhc2ljOwotCQl9Ci0JCQotCQlwdWJsaWMgT2JqZWN0IGdldCgpIHsKLQkJCXJldHVybiB0aGlzLmJhc2ljLmdldFRlbXBvcmFsKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNldChPYmplY3QgZW51bVNldHRpbmcpIHsKLQkJCXRoaXMuYmFzaWMuc2V0VGVtcG9yYWwoKFRlbXBvcmFsVHlwZSkgZW51bVNldHRpbmcpOwotCQl9Ci0JCQotCQlwdWJsaWMgQ2xhc3MgZmVhdHVyZUNsYXNzKCkgewotCQkJcmV0dXJuIElCYXNpYy5jbGFzczsKLQkJfQotCQkKLQkJcHVibGljIGludCBmZWF0dXJlSWQoKSB7Ci0JCQlyZXR1cm4gSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JQkFTSUNfX1RFTVBPUkFMOwotCQl9Ci0JCQotCQlwdWJsaWMgRU9iamVjdCB3cmFwcGVkT2JqZWN0KCkgewotCQkJcmV0dXJuIHRoaXMuYmFzaWM7Ci0JCX0KLQkJCi0JCXB1YmxpYyBPYmplY3RbXSBlbnVtVmFsdWVzKCkgewotCQkJcmV0dXJuIFRlbXBvcmFsVHlwZS5WQUxVRVMudG9BcnJheSgpOwotCQl9Ci0JCQotCQkvKioKLQkJICogVGVtcG9yYWxUeXBlIGhhcyBubyBEZWZhdWx0LCByZXR1cm4gbnVsbAotCQkgKi8KLQkJcHVibGljIE9iamVjdCBkZWZhdWx0VmFsdWUoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIFRlbXBvcmFsVHlwZSBoYXMgbm8gRGVmYXVsdCwgcmV0dXJuIG51bGwKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZGVmYXVsdFN0cmluZygpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCXByaXZhdGUgY2xhc3MgRW51bWVyYXRlZFR5cGVIb2xkZXIgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEVudW1Ib2xkZXIgewotCQkKLQkJcHJpdmF0ZSBJQmFzaWMgYmFzaWM7Ci0JCQotCQlFbnVtZXJhdGVkVHlwZUhvbGRlcihJQmFzaWMgYmFzaWMpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmJhc2ljID0gYmFzaWM7Ci0JCX0KLQkJCi0JCXB1YmxpYyBPYmplY3QgZ2V0KCkgewotCQkJcmV0dXJuIHRoaXMuYmFzaWMuZ2V0RW51bWVyYXRlZCgpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXQoT2JqZWN0IGVudW1TZXR0aW5nKSB7Ci0JCQl0aGlzLmJhc2ljLnNldEVudW1lcmF0ZWQoKEVudW1UeXBlKSBlbnVtU2V0dGluZyk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBDbGFzcyBmZWF0dXJlQ2xhc3MoKSB7Ci0JCQlyZXR1cm4gSUJhc2ljLmNsYXNzOwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGZlYXR1cmVJZCgpIHsKLQkJCXJldHVybiBKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLklCQVNJQ19fRU5VTUVSQVRFRDsKLQkJfQotCQkKLQkJcHVibGljIEVPYmplY3Qgd3JhcHBlZE9iamVjdCgpIHsKLQkJCXJldHVybiB0aGlzLmJhc2ljOwotCQl9Ci0JCQotCQlwdWJsaWMgT2JqZWN0W10gZW51bVZhbHVlcygpIHsKLQkJCXJldHVybiBFbnVtVHlwZS5WQUxVRVMudG9BcnJheSgpOwotCQl9Ci0JCQotCQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRWYWx1ZSgpIHsKLQkJCXJldHVybiBFbnVtVHlwZS5ERUZBVUxUOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGRlZmF1bHRTdHJpbmcoKSB7Ci0JCQkvL1RPRE8gbW92ZSB0aGlzIG91dCBvZiB0aGUgVUkgaW50byB0aGUgbW9kZWwKLQkJCXJldHVybiAiT3JkaW5hbCI7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0Nhc2NhZGVDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvQ2FzY2FkZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmViMGViLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvQ2FzY2FkZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSUNhc2NhZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSVJlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSnBhQ29yZU1hcHBpbmdzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5CYXNlSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRmlsbExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBDYXNjYWRlQ29tcG9zaXRlIGV4dGVuZHMgQmFzZUpwYUNvbXBvc2l0ZSAKLXsKLQlwcml2YXRlIElSZWxhdGlvbnNoaXBNYXBwaW5nIHJlbGF0aW9uc2hpcE1hcHBpbmc7CQotCXByaXZhdGUgSUNhc2NhZGUgY2FzY2FkZTsKLQkKLQlwcml2YXRlIEFkYXB0ZXIgcmVsYXRpb25zaGlwTWFwcGluZ0xpc3RlbmVyOwotCXByaXZhdGUgQWRhcHRlciBjYXNjYWRlTGlzdGVuZXI7Ci0JCi0JCi0JcHJpdmF0ZSBCdXR0b24gYWxsQ2hlY2tCb3g7Ci0JcHJpdmF0ZSBCdXR0b24gcGVyc2lzdENoZWNrQm94OwotCXByaXZhdGUgQnV0dG9uIG1lcmdlQ2hlY2tCb3g7Ci0JcHJpdmF0ZSBCdXR0b24gcmVtb3ZlQ2hlY2tCb3g7Ci0JcHJpdmF0ZSBCdXR0b24gcmVmcmVzaENoZWNrQm94OwotCQotCXB1YmxpYyBDYXNjYWRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIENvbW1hbmRTdGFjayBjb21tYW5kU3RhY2ssIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJc3VwZXIocGFyZW50LCBTV1QuTlVMTCwgY29tbWFuZFN0YWNrLCB3aWRnZXRGYWN0b3J5KTsKLQkJdGhpcy5yZWxhdGlvbnNoaXBNYXBwaW5nTGlzdGVuZXIgPSBidWlsZFJlbGF0aW9uc2hpcE1hcHBpbmdMaXN0ZW5lcigpOwotCQl0aGlzLmNhc2NhZGVMaXN0ZW5lciA9IGJ1aWxkQ2FzY2FkZUxpc3RlbmVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBBZGFwdGVyIGJ1aWxkUmVsYXRpb25zaGlwTWFwcGluZ0xpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IEFkYXB0ZXJJbXBsKCkgewotCQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCQkJcmVsYXRpb25zaGlwTWFwcGluZ0NoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIEFkYXB0ZXIgYnVpbGRDYXNjYWRlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJCQljYXNjYWRlQ2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJfQotCQl9OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJCi0JCUdyb3VwIGNhc2NhZGVHcm91cCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVHcm91cChjb21wb3NpdGUsICJDYXNjYWRlIik7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoNSwgZmFsc2UpOwotCQljYXNjYWRlR3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQotCQlHcmlkRGF0YSBncmlkRGF0YTsKLQkJCi0JCXRoaXMuYWxsQ2hlY2tCb3ggPSBjcmVhdGVBbGxDaGVja0JveChjYXNjYWRlR3JvdXApOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQl0aGlzLmFsbENoZWNrQm94LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCXRoaXMucGVyc2lzdENoZWNrQm94ID0gY3JlYXRlUGVyc2lzdENoZWNrQm94KGNhc2NhZGVHcm91cCk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCXRoaXMucGVyc2lzdENoZWNrQm94LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCXRoaXMubWVyZ2VDaGVja0JveCA9IGNyZWF0ZU1lcmdlQ2hlY2tCb3goY2FzY2FkZUdyb3VwKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJdGhpcy5tZXJnZUNoZWNrQm94LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCXRoaXMucmVtb3ZlQ2hlY2tCb3ggPSBjcmVhdGVSZW1vdmVDaGVja0JveChjYXNjYWRlR3JvdXApOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQl0aGlzLnJlbW92ZUNoZWNrQm94LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCXRoaXMucmVmcmVzaENoZWNrQm94ID0gY3JlYXRlUmVmcmVzaENoZWNrQm94KGNhc2NhZGVHcm91cCk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCXRoaXMucmVmcmVzaENoZWNrQm94LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCX0KLQkKLQlwcml2YXRlIEJ1dHRvbiBjcmVhdGVBbGxDaGVja0JveChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQnV0dG9uKGNvbXBvc2l0ZSwgIkFsbCIsIFNXVC5DSEVDSyk7Ci0JCWJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUNhc2NhZGVDb21wb3NpdGUudGhpcy5hbGxTZWxlY3RlZChlKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlDYXNjYWRlQ29tcG9zaXRlLnRoaXMuYWxsU2VsZWN0ZWQoZSk7CQkJCQotCQkJfQotCQl9KTsKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWxsU2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQlib29sZWFuIHNldFNlbGVjdGlvbiA9IGluaXRpYWxpemVDYXNjYWRlKCk7Ci0JCWlmIChzZXRTZWxlY3Rpb24pIHsKLQkJCXRoaXMuY2FzY2FkZS5zZXRBbGwodGhpcy5hbGxDaGVja0JveC5nZXRTZWxlY3Rpb24oKSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGluaXRpYWxpemVDYXNjYWRlKCkgewotCQlpZiAoYWxsQ2hlY2tCb3hlc0ZhbHNlKCkgJiYgdGhpcy5jYXNjYWRlICE9IG51bGwpIHsKLQkJCWRpc2VuZ2FnZUNhc2NhZGVMaXN0ZW5lcigpOwotCQkJdGhpcy5yZWxhdGlvbnNoaXBNYXBwaW5nLnNldENhc2NhZGUobnVsbCk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKHRoaXMuY2FzY2FkZSA9PSBudWxsKSB7Ci0JCQl0aGlzLmNhc2NhZGUgPSB0aGlzLnJlbGF0aW9uc2hpcE1hcHBpbmcuY3JlYXRlQ2FzY2FkZSgpOwotCQkJdGhpcy5yZWxhdGlvbnNoaXBNYXBwaW5nLnNldENhc2NhZGUodGhpcy5jYXNjYWRlKTsKLQkJCWVuZ2FnZUNhc2NhZGVMaXN0ZW5lcigpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcml2YXRlIEJ1dHRvbiBjcmVhdGVQZXJzaXN0Q2hlY2tCb3goQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlCdXR0b24gYnV0dG9uID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1dHRvbihjb21wb3NpdGUsICJQZXJzaXN0IiwgU1dULkNIRUNLKTsKLQkJYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJQ2FzY2FkZUNvbXBvc2l0ZS50aGlzLnBlcnNpc3RTZWxlY3RlZChlKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlDYXNjYWRlQ29tcG9zaXRlLnRoaXMucGVyc2lzdFNlbGVjdGVkKGUpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JCXJldHVybiBidXR0b247Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHBlcnNpc3RTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCWJvb2xlYW4gc2V0U2VsZWN0aW9uID0gaW5pdGlhbGl6ZUNhc2NhZGUoKTsKLQkJaWYgKHNldFNlbGVjdGlvbikgewotCQkJdGhpcy5jYXNjYWRlLnNldFBlcnNpc3QodGhpcy5wZXJzaXN0Q2hlY2tCb3guZ2V0U2VsZWN0aW9uKCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBCdXR0b24gY3JlYXRlTWVyZ2VDaGVja0JveChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQnV0dG9uKGNvbXBvc2l0ZSwgIk1lcmdlIiwgU1dULkNIRUNLKTsKLQkJYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJQ2FzY2FkZUNvbXBvc2l0ZS50aGlzLm1lcmdlU2VsZWN0ZWQoZSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJQ2FzY2FkZUNvbXBvc2l0ZS50aGlzLm1lcmdlU2VsZWN0ZWQoZSk7CQkJCQotCQkJfQotCQl9KTsKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgbWVyZ2VTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCWJvb2xlYW4gc2V0U2VsZWN0aW9uID0gaW5pdGlhbGl6ZUNhc2NhZGUoKTsKLQkJaWYgKHNldFNlbGVjdGlvbikgewotCQkJdGhpcy5jYXNjYWRlLnNldE1lcmdlKHRoaXMubWVyZ2VDaGVja0JveC5nZXRTZWxlY3Rpb24oKSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBCdXR0b24gY3JlYXRlUmVtb3ZlQ2hlY2tCb3goQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlCdXR0b24gYnV0dG9uID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1dHRvbihjb21wb3NpdGUsICJSZW1vdmUiLCBTV1QuQ0hFQ0spOwotCQlidXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlDYXNjYWRlQ29tcG9zaXRlLnRoaXMucmVtb3ZlU2VsZWN0ZWQoZSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJQ2FzY2FkZUNvbXBvc2l0ZS50aGlzLnJlbW92ZVNlbGVjdGVkKGUpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JCXJldHVybiBidXR0b247Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJYm9vbGVhbiBzZXRTZWxlY3Rpb24gPSBpbml0aWFsaXplQ2FzY2FkZSgpOwotCQlpZiAoc2V0U2VsZWN0aW9uKSB7Ci0JCQl0aGlzLmNhc2NhZGUuc2V0UmVtb3ZlKHRoaXMucmVtb3ZlQ2hlY2tCb3guZ2V0U2VsZWN0aW9uKCkpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgQnV0dG9uIGNyZWF0ZVJlZnJlc2hDaGVja0JveChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQnV0dG9uKGNvbXBvc2l0ZSwgIlJlZnJlc2giLCBTV1QuQ0hFQ0spOwotCQlidXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlDYXNjYWRlQ29tcG9zaXRlLnRoaXMucmVmcmVzaFNlbGVjdGVkKGUpOwotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUNhc2NhZGVDb21wb3NpdGUudGhpcy5yZWZyZXNoU2VsZWN0ZWQoZSk7CQkJCQotCQkJfQotCQl9KTsKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJYm9vbGVhbiBzZXRTZWxlY3Rpb24gPSBpbml0aWFsaXplQ2FzY2FkZSgpOwotCQlpZiAoc2V0U2VsZWN0aW9uKSB7Ci0JCQl0aGlzLmNhc2NhZGUuc2V0UmVmcmVzaCh0aGlzLnJlZnJlc2hDaGVja0JveC5nZXRTZWxlY3Rpb24oKSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGFsbENoZWNrQm94ZXNGYWxzZSgpIHsKLQkJcmV0dXJuICEodGhpcy5hbGxDaGVja0JveC5nZXRTZWxlY3Rpb24oKSAKLQkJCQl8fCB0aGlzLnBlcnNpc3RDaGVja0JveC5nZXRTZWxlY3Rpb24oKSAKLQkJCQl8fCB0aGlzLm1lcmdlQ2hlY2tCb3guZ2V0U2VsZWN0aW9uKCkgCi0JCQkJfHwgdGhpcy5yZW1vdmVDaGVja0JveC5nZXRTZWxlY3Rpb24oKSAKLQkJCQl8fCB0aGlzLnJlZnJlc2hDaGVja0JveC5nZXRTZWxlY3Rpb24oKSk7Ci0JCQotCQkJCi0JfQotCQotCXByaXZhdGUgdm9pZCByZWxhdGlvbnNoaXBNYXBwaW5nQ2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCWlmIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKElSZWxhdGlvbnNoaXBNYXBwaW5nLmNsYXNzKSA9PSAKLQkJCQlKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLklSRUxBVElPTlNISVBfTUFQUElOR19fQ0FTQ0FERSkgewotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKAotCQkJCW5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJaWYgKGdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoQ2FzY2FkZUNvbXBvc2l0ZS50aGlzLmNhc2NhZGUgIT0gbnVsbCkgewotCQkJCQkJCWRpc2VuZ2FnZUNhc2NhZGVMaXN0ZW5lcigpOwotCQkJCQkJfQotCQkJCQkJQ2FzY2FkZUNvbXBvc2l0ZS50aGlzLmNhc2NhZGUgPSBDYXNjYWRlQ29tcG9zaXRlLnRoaXMucmVsYXRpb25zaGlwTWFwcGluZy5nZXRDYXNjYWRlKCk7Ci0JCQkJCQlwb3B1bGF0ZUNhc2NhZGUoKTsKLQkJCQkJCQotCQkJCQkJaWYgKENhc2NhZGVDb21wb3NpdGUudGhpcy5jYXNjYWRlICE9IG51bGwpIHsKLQkJCQkJCQllbmdhZ2VDYXNjYWRlTGlzdGVuZXIoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0pOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjYXNjYWRlQ2hhbmdlZChmaW5hbCBOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChJQ2FzY2FkZS5jbGFzcykpIHsKLQkJCWNhc2UgSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JQ0FTQ0FERV9fQUxMIDoKLQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMoCi0JCQkJCW5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQlpZiAoZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJfQotCQkJCQkJCUNhc2NhZGVDb21wb3NpdGUudGhpcy5hbGxDaGVja0JveC5zZXRTZWxlY3Rpb24obm90aWZpY2F0aW9uLmdldE5ld0Jvb2xlYW5WYWx1ZSgpKTsKLQkJCQkJCX0KLQkJCQkJfSk7CQkJCi0JCQkJYnJlYWs7Ci0JCQljYXNlIEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSUNBU0NBREVfX1BFUlNJU1QgOgotCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYygKLQkJCQkJbmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCWlmIChnZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQkJCXJldHVybjsKLQkJCQkJCQl9Ci0JCQkJCQkJQ2FzY2FkZUNvbXBvc2l0ZS50aGlzLnBlcnNpc3RDaGVja0JveC5zZXRTZWxlY3Rpb24obm90aWZpY2F0aW9uLmdldE5ld0Jvb2xlYW5WYWx1ZSgpKTsKLQkJCQkJCX0KLQkJCQkJfSk7CQkJCi0JCQkJYnJlYWs7Ci0JCQljYXNlIEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSUNBU0NBREVfX01FUkdFIDoKLQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMoCi0JCQkJCW5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQlpZiAoZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJfQotCQkJCQkJCUNhc2NhZGVDb21wb3NpdGUudGhpcy5tZXJnZUNoZWNrQm94LnNldFNlbGVjdGlvbihub3RpZmljYXRpb24uZ2V0TmV3Qm9vbGVhblZhbHVlKCkpOwotCQkJCQkJfQotCQkJCQl9KTsJCQkKLQkJCQlicmVhazsKLQkJCWNhc2UgSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JQ0FTQ0FERV9fUkVNT1ZFIDoKLQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMoCi0JCQkJCW5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQlpZiAoZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJfQotCQkJCQkJCUNhc2NhZGVDb21wb3NpdGUudGhpcy5yZW1vdmVDaGVja0JveC5zZXRTZWxlY3Rpb24obm90aWZpY2F0aW9uLmdldE5ld0Jvb2xlYW5WYWx1ZSgpKTsKLQkJCQkJCX0KLQkJCQkJfSk7CQkJCi0JCQkJYnJlYWs7Ci0JCQljYXNlIEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSUNBU0NBREVfX1JFRlJFU0ggOgotCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYygKLQkJCQkJbmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCWlmIChnZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQkJCXJldHVybjsKLQkJCQkJCQl9Ci0JCQkJCQkJQ2FzY2FkZUNvbXBvc2l0ZS50aGlzLnJlZnJlc2hDaGVja0JveC5zZXRTZWxlY3Rpb24obm90aWZpY2F0aW9uLmdldE5ld0Jvb2xlYW5WYWx1ZSgpKTsKLQkJCQkJCX0KLQkJCQkJfSk7CQkJCi0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlicmVhazsKLQkJfQotCQlpZiAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChJQ2FzY2FkZS5jbGFzcykgPT0gCi0JCQkJSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JQ0FTQ0FERV9fQUxMKSB7Ci0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMoCi0JCQkJbmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlpZiAoZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJCUNhc2NhZGVDb21wb3NpdGUudGhpcy5hbGxDaGVja0JveC5zZXRTZWxlY3Rpb24obm90aWZpY2F0aW9uLmdldE5ld0Jvb2xlYW5WYWx1ZSgpKTsKLQkJCQkJfQotCQkJCX0pOwotCQl9Ci0JCQotCX0KLQkKLQotCXB1YmxpYyB2b2lkIGRvUG9wdWxhdGUoRU9iamVjdCBvYmopIHsKLQkJdGhpcy5yZWxhdGlvbnNoaXBNYXBwaW5nID0gKElSZWxhdGlvbnNoaXBNYXBwaW5nKSBvYmo7Ci0JCQotCQlpZiAodGhpcy5yZWxhdGlvbnNoaXBNYXBwaW5nICE9IG51bGwpIHsKLQkJCXRoaXMuY2FzY2FkZSA9IHRoaXMucmVsYXRpb25zaGlwTWFwcGluZy5nZXRDYXNjYWRlKCk7Ci0JCQlwb3B1bGF0ZUNhc2NhZGUoKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVDYXNjYWRlKCkgewotCQlpZiAodGhpcy5jYXNjYWRlICE9IG51bGwpIHsKLQkJCXRoaXMuYWxsQ2hlY2tCb3guc2V0U2VsZWN0aW9uKHRoaXMuY2FzY2FkZS5pc0FsbCgpKTsKLQkJCXRoaXMucGVyc2lzdENoZWNrQm94LnNldFNlbGVjdGlvbih0aGlzLmNhc2NhZGUuaXNQZXJzaXN0KCkpOwotCQkJdGhpcy5tZXJnZUNoZWNrQm94LnNldFNlbGVjdGlvbih0aGlzLmNhc2NhZGUuaXNNZXJnZSgpKTsKLQkJCXRoaXMucmVtb3ZlQ2hlY2tCb3guc2V0U2VsZWN0aW9uKHRoaXMuY2FzY2FkZS5pc1JlbW92ZSgpKTsKLQkJCXRoaXMucmVmcmVzaENoZWNrQm94LnNldFNlbGVjdGlvbih0aGlzLmNhc2NhZGUuaXNSZWZyZXNoKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5hbGxDaGVja0JveC5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJdGhpcy5wZXJzaXN0Q2hlY2tCb3guc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCXRoaXMubWVyZ2VDaGVja0JveC5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJdGhpcy5yZW1vdmVDaGVja0JveC5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJdGhpcy5yZWZyZXNoQ2hlY2tCb3guc2V0U2VsZWN0aW9uKGZhbHNlKTsJCQotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRvUG9wdWxhdGUoKSB7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUxpc3RlbmVycygpIHsKLQkJaWYgKHRoaXMucmVsYXRpb25zaGlwTWFwcGluZyAhPSBudWxsKSB7Ci0JCQl0aGlzLnJlbGF0aW9uc2hpcE1hcHBpbmcuZUFkYXB0ZXJzKCkuYWRkKHRoaXMucmVsYXRpb25zaGlwTWFwcGluZ0xpc3RlbmVyKTsKLQkJCWlmICh0aGlzLmNhc2NhZGUgIT0gbnVsbCkgewotCQkJCWVuZ2FnZUNhc2NhZGVMaXN0ZW5lcigpOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUNhc2NhZGVMaXN0ZW5lcigpIHsKLQkJdGhpcy5jYXNjYWRlLmVBZGFwdGVycygpLmFkZCh0aGlzLmNhc2NhZGVMaXN0ZW5lcik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZUNhc2NhZGVMaXN0ZW5lcigpIHsKLQkJdGhpcy5jYXNjYWRlLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzLmNhc2NhZGVMaXN0ZW5lcik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZUxpc3RlbmVycygpIHsKLQkJaWYgKHRoaXMucmVsYXRpb25zaGlwTWFwcGluZyAhPSBudWxsKSB7Ci0JCQl0aGlzLnJlbGF0aW9uc2hpcE1hcHBpbmcuZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMucmVsYXRpb25zaGlwTWFwcGluZ0xpc3RlbmVyKTsKLQkJCWlmICh0aGlzLmNhc2NhZGUgIT0gbnVsbCkgewotCQkJCWRpc2VuZ2FnZUNhc2NhZGVMaXN0ZW5lcigpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9DYXRhbG9nQ29tYm8uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvQ2F0YWxvZ0NvbWJvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1MWQwMTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9DYXRhbG9nQ29tYm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLkpwYUNvcmVNYXBwaW5nc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLkNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLkNvbm5lY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwuQ29ubmVjdGlvblByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLkRhdGFiYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkJhc2VKcGFDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLQotcHVibGljIGNsYXNzIENhdGFsb2dDb21ibyBleHRlbmRzIEJhc2VKcGFDb250cm9sbGVyCi17Ci0JcHJpdmF0ZSBJVGFibGUgdGFibGU7Ci0KLQlwcml2YXRlIEFkYXB0ZXIgbGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBDYWNoaW5nIHRoZSBjb25uZWN0aW9uUHJvZmlsZSBzbyB3ZSBjYW4gcmVtb3ZlIHRoZSBsaXN0ZW5lci4gSWYgdGhlCi0JICogY2FjaGVkIHRhYmxlIG9iamVjdCBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIG1vZGVsIHRoZW4gd2Ugbm8gbG9uZ2VyCi0JICogaGF2ZSBhY2Nlc3MgdG8gdGhlIHBhcmVudCBhbmQgY2Fubm90IGZpbmQgdGhlIGNvbm5lY3Rpb25Qcm9maWxlCi0JICovCi0JcHJpdmF0ZSBDb25uZWN0aW9uUHJvZmlsZSBjb25uZWN0aW9uUHJvZmlsZTsKLQotCXByaXZhdGUgQ29ubmVjdGlvbkxpc3RlbmVyIGNvbm5lY3Rpb25MaXN0ZW5lcjsKLQotCXByaXZhdGUgQ0NvbWJvIGNvbWJvOwotCi0JcHVibGljIENhdGFsb2dDb21ibyhDb21wb3NpdGUgcGFyZW50LCBDb21tYW5kU3RhY2sgdGhlQ29tbWFuZFN0YWNrLCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXN1cGVyKHBhcmVudCwgdGhlQ29tbWFuZFN0YWNrLCB3aWRnZXRGYWN0b3J5KTsKLQkJdGhpcy5saXN0ZW5lciA9IHRoaXMuYnVpbGRUYWJsZUxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvbkxpc3RlbmVyID0gdGhpcy5idWlsZENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCX0KLQotCXByaXZhdGUgQWRhcHRlciBidWlsZFRhYmxlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJCQlDYXRhbG9nQ29tYm8udGhpcy5jYXRhbG9nQ2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29ubmVjdGlvbkxpc3RlbmVyIGJ1aWxkQ29ubmVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENvbm5lY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFib3V0VG9DbG9zZShDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKLQkJCS8vIG5vdCBpbnRlcmVzdGVkIHRvIHRoaXMgZXZlbnQuCi0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGNsb3NlZChDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKLQkJCQlnZXRDb21ibygpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlpZiAoZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJCUNhdGFsb2dDb21iby50aGlzLnBvcHVsYXRlQ2F0YWxvZ0NvbWJvKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbW9kaWZpZWQoQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7Ci0JCQkJZ2V0Q29tYm8oKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJaWYgKGdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQlDYXRhbG9nQ29tYm8udGhpcy5wb3B1bGF0ZUNhdGFsb2dDb21ibygpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIG9rVG9DbG9zZShDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKLQkJCQkvLyBub3QgaW50ZXJlc3RlZCB0byB0aGlzIGV2ZW50LgotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBvcGVuZWQoQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7Ci0JCQkJZ2V0Q29tYm8oKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJaWYgKGdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQlDYXRhbG9nQ29tYm8udGhpcy5wb3B1bGF0ZUNhdGFsb2dDb21ibygpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGRhdGFiYXNlQ2hhbmdlZChDb25uZWN0aW9uIGNvbm5lY3Rpb24sIGZpbmFsIERhdGFiYXNlIGRhdGFiYXNlKSB7Ci0JCQkJZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlpZiAoZGF0YWJhc2UgPT0gQ2F0YWxvZ0NvbWJvLnRoaXMuZ2V0RGF0YWJhc2UoKSkgewotCQkJCQkJCWlmICghZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJCQlDYXRhbG9nQ29tYm8udGhpcy5wb3B1bGF0ZUNhdGFsb2dDb21ibygpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBzY2hlbWFDaGFuZ2VkKENvbm5lY3Rpb24gY29ubmVjdGlvbiwgZmluYWwgU2NoZW1hIHNjaGVtYSkgewotCQkJLy8gbm90IGludGVyZXN0ZWQgdG8gdGhpcyBldmVudC4KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgdGFibGVDaGFuZ2VkKENvbm5lY3Rpb24gY29ubmVjdGlvbiwgZmluYWwgVGFibGUgdGFibGUpIHsKLQkJCS8vIG5vdCBpbnRlcmVzdGVkIHRvIHRoaXMgZXZlbnQuCi0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYnVpbGRXaWRnZXQoQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmNvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhwYXJlbnQsIFNXVC5GTEFUKTsKLQkJdGhpcy5jb21iby5hZGQoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlRhYmxlQ29tcG9zaXRlX2RlZmF1bHRFbXB0eSk7Ci0JCXRoaXMuY29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJaWYgKGlzUG9wdWxhdGluZygpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIGNhdGFsb2dUZXh0ID0gKChDQ29tYm8pIGUuZ2V0U291cmNlKCkpLmdldFRleHQoKTsKLQkJCQlpZiAoY2F0YWxvZ1RleHQuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCWNhdGFsb2dUZXh0ID0gbnVsbDsKLQkJCQkJaWYgKENhdGFsb2dDb21iby50aGlzLnRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSA9PSBudWxsIHx8IENhdGFsb2dDb21iby50aGlzLnRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoY2F0YWxvZ1RleHQgIT0gbnVsbCAmJiBjb21iby5nZXRJdGVtQ291bnQoKSA+IDAgJiYgY2F0YWxvZ1RleHQuZXF1YWxzKGNvbWJvLmdldEl0ZW0oMCkpKSB7Ci0JCQkJCWNhdGFsb2dUZXh0ID0gbnVsbDsKLQkJCQl9Ci0JCQkJaWYgKENhdGFsb2dDb21iby50aGlzLnRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSA9PSBudWxsICYmIGNhdGFsb2dUZXh0ICE9IG51bGwpIHsKLQkJCQkJQ2F0YWxvZ0NvbWJvLnRoaXMuc2V0U3BlY2lmaWVkQ2F0YWxvZyhjYXRhbG9nVGV4dCk7Ci0JCQkJfQotCQkJCWlmIChDYXRhbG9nQ29tYm8udGhpcy50YWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkgIT0gbnVsbCAmJiAhQ2F0YWxvZ0NvbWJvLnRoaXMudGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpLmVxdWFscyhjYXRhbG9nVGV4dCkpIHsKLQkJCQkJQ2F0YWxvZ0NvbWJvLnRoaXMuc2V0U3BlY2lmaWVkQ2F0YWxvZyhjYXRhbG9nVGV4dCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0U3BlY2lmaWVkQ2F0YWxvZyhTdHJpbmcgY2F0YWxvZ05hbWUpIHsKLQkJdGhpcy50YWJsZS5zZXRTcGVjaWZpZWRDYXRhbG9nKGNhdGFsb2dOYW1lKTsKLQkJdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZSgpLnNldENhdGFsb2dOYW1lKGNhdGFsb2dOYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjYXRhbG9nQ2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCWlmIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKElUYWJsZS5jbGFzcykgPT0gSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JVEFCTEVfX1NQRUNJRklFRF9DQVRBTE9HKSB7Ci0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlDYXRhbG9nQ29tYm8udGhpcy5wb3B1bGF0ZUNhdGFsb2dOYW1lKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJZWxzZSBpZiAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChJVGFibGUuY2xhc3MpID09IEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSVRBQkxFX19ERUZBVUxUX0NBVEFMT0cpIHsKLQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCUNhdGFsb2dDb21iby50aGlzLnBvcHVsYXRlRGVmYXVsdENhdGFsb2dOYW1lKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBkb1BvcHVsYXRlKEVPYmplY3Qgb2JqKSB7Ci0JCXRoaXMudGFibGUgPSAoSVRhYmxlKSBvYmo7Ci0JCWlmICh0aGlzLnRhYmxlICE9IG51bGwpIHsKLQkJCXRoaXMucG9wdWxhdGVDYXRhbG9nQ29tYm8oKTsKLQkJfQotCQllbHNlIHsKLQkJCXRoaXMuY29ubmVjdGlvblByb2ZpbGUgPSBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZG9Qb3B1bGF0ZSgpIHsKLQkJdGhpcy5wb3B1bGF0ZUNhdGFsb2dDb21ibygpOwotCX0KLQotCXByb3RlY3RlZCBEYXRhYmFzZSBnZXREYXRhYmFzZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKS5nZXREYXRhYmFzZSgpOwotCX0KLQotCXByaXZhdGUgQ29ubmVjdGlvblByb2ZpbGUgZ2V0Q29ubmVjdGlvblByb2ZpbGUoKSB7Ci0JCWlmICh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlID09IG51bGwpIHsKLQkJCXRoaXMuY29ubmVjdGlvblByb2ZpbGUgPSB0aGlzLnRhYmxlLmdldEpwYVByb2plY3QoKS5jb25uZWN0aW9uUHJvZmlsZSgpOwotCQl9Ci0JCXJldHVybiB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlOwotCX0KLQotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZUNhdGFsb2dDb21ibygpIHsKLQkJaWYgKHRoaXMudGFibGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXRoaXMucG9wdWxhdGVEZWZhdWx0Q2F0YWxvZ05hbWUoKTsKLQkJaWYgKHRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKS5pc0Nvbm5lY3RlZCgpKSB7Ci0JCQl0aGlzLmNvbWJvLnJlbW92ZSgxLCB0aGlzLmNvbWJvLmdldEl0ZW1Db3VudCgpIC0gMSk7Ci0JCQlEYXRhYmFzZSBkYXRhYmFzZSA9IHRoaXMuZ2V0RGF0YWJhc2UoKTsKLQkJCWlmIChkYXRhYmFzZSAhPSBudWxsKSB7Ci0JCQkJSXRlcmF0b3I8U3RyaW5nPiBjYXRhbG9ncyA9IGRhdGFiYXNlLmNhdGFsb2dOYW1lcygpOwotCQkJCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSBDb2xsZWN0aW9uVG9vbHMuc29ydChjYXRhbG9ncyk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQkJCXRoaXMuY29tYm8uYWRkKHN0cmVhbS5uZXh0KCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXRoaXMuY29tYm8ucmVtb3ZlKDEsIHRoaXMuY29tYm8uZ2V0SXRlbUNvdW50KCkgLSAxKTsKLQkJfQotCQl0aGlzLnBvcHVsYXRlQ2F0YWxvZ05hbWUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZURlZmF1bHRDYXRhbG9nTmFtZSgpIHsKLQkJLy8gU3RyaW5nIGRlZmF1bHRDYXRhbG9nTmFtZSA9IHRoaXMudGFibGUuZ2V0RGVmYXVsdENhdGFsb2coKTsgLy8KLQkJLy8gRGVmYXVsdENhdGFsb2cgY2Fubm90IGJlIGluaXRpYWxpemVkIGlmIERCIG5vdCBvbmxpbmUKLQkJU3RyaW5nIGRlZmF1bHRDYXRhbG9nTmFtZSA9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXREZWZhdWx0Q2F0YWxvZ05hbWUoKTsgLy8gVE9SRVZJRVcKLQkJaW50IHNlbGVjdGlvbkluZGV4ID0gY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJY29tYm8uc2V0SXRlbSgwLCBOTFMuYmluZChKcHRVaU1hcHBpbmdzTWVzc2FnZXMuVGFibGVDb21wb3NpdGVfZGVmYXVsdFdpdGhPbmVQYXJhbSwgZGVmYXVsdENhdGFsb2dOYW1lKSk7Ci0JCWlmIChzZWxlY3Rpb25JbmRleCA9PSAwKSB7Ci0JCQljb21iby5jbGVhclNlbGVjdGlvbigpOwotCQkJY29tYm8uc2VsZWN0KDApOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVDYXRhbG9nTmFtZSgpIHsKLQkJaWYgKHRoaXMudGFibGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCVN0cmluZyBjYXRhbG9nTmFtZSA9IHRoaXMudGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpOwotCQkvLyBTdHJpbmcgZGVmYXVsdENhdGFsb2dOYW1lID0gdGhpcy50YWJsZS5nZXREZWZhdWx0Q2F0YWxvZygpOyAvLwotCQkvLyBEZWZhdWx0Q2F0YWxvZyBjYW5ub3QgYmUgaW5pdGlhbGl6ZWQgaWYgREIgbm90IG9ubGluZQotCQlTdHJpbmcgZGVmYXVsdENhdGFsb2dOYW1lID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldERlZmF1bHRDYXRhbG9nTmFtZSgpOyAvLyBUT1JFVklFVwotCQlpZiAoIVN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoY2F0YWxvZ05hbWUpKSB7Ci0JCQlpZiAoIXRoaXMuY29tYm8uZ2V0VGV4dCgpLmVxdWFscyhjYXRhbG9nTmFtZSkpIHsKLQkJCQl0aGlzLmNvbWJvLnNldFRleHQoY2F0YWxvZ05hbWUpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKCF0aGlzLmNvbWJvLmdldFRleHQoKS5lcXVhbHMoTkxTLmJpbmQoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlRhYmxlQ29tcG9zaXRlX2RlZmF1bHRXaXRoT25lUGFyYW0sIGRlZmF1bHRDYXRhbG9nTmFtZSkpKSB7Ci0JCQkJdGhpcy5jb21iby5zZWxlY3QoMCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgQ0NvbWJvIGdldENvbWJvKCkgewotCQlyZXR1cm4gdGhpcy5jb21ibzsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCkgewotCQlyZXR1cm4gZ2V0Q29tYm8oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VMaXN0ZW5lcnMoKSB7Ci0JCWlmICh0aGlzLnRhYmxlICE9IG51bGwpIHsKLQkJCXRoaXMucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCQl0aGlzLnRhYmxlLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzLmxpc3RlbmVyKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUxpc3RlbmVycygpIHsKLQkJaWYgKHRoaXMudGFibGUgIT0gbnVsbCkgewotCQkJdGhpcy50YWJsZS5lQWRhcHRlcnMoKS5hZGQodGhpcy5saXN0ZW5lcik7Ci0JCQl0aGlzLmFkZENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZENvbm5lY3Rpb25MaXN0ZW5lcigpIHsKLQkJdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZSgpLmFkZENvbm5lY3Rpb25MaXN0ZW5lcih0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcigpIHsKLQkJdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZSgpLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcih0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9Db2x1bW5Db21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvQ29sdW1uQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MDJmNzkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9Db2x1bW5Db21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSUpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuRGVmYXVsdFRydWVCb29sZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklBYnN0cmFjdENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklOYW1lZENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5KcGFDb3JlTWFwcGluZ3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC5Db25uZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLkNvbm5lY3Rpb25Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC5EYXRhYmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwuU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSUpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkJhc2VKcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlscy5FbnVtQ29tYm9WaWV3ZXIuRW51bUhvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSVdvcmtiZW5jaEhlbHBTeXN0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci0KLS8vVE9ETyByZXBvcHVsYXRlIHRoaXMgcGFuZWwgYmFzZWQgb24gdGhlIEVudGl0eSB0YWJsZSBjaGFuZ2luZwotcHVibGljIGNsYXNzIENvbHVtbkNvbXBvc2l0ZSBleHRlbmRzIEJhc2VKcGFDb21wb3NpdGUKLXsKLQkKLQlwcml2YXRlIElDb2x1bW4gY29sdW1uOwotCi0JcHJpdmF0ZSBBZGFwdGVyIGNvbHVtbkxpc3RlbmVyOwotCXByaXZhdGUgQ29ubmVjdGlvbkxpc3RlbmVyIGNvbm5lY3Rpb25MaXN0ZW5lcjsKLQkJCi0JcHJvdGVjdGVkIENDb21ibyBjb2x1bW5Db21ibzsKLQlwcm90ZWN0ZWQgQ0NvbWJvIHRhYmxlQ29tYm87Ci0JcHJvdGVjdGVkIEVudW1Db21ib1ZpZXdlciBpbnNlcnRhYmxlQ29tYm9WaWV3ZXI7Ci0JcHJvdGVjdGVkIEVudW1Db21ib1ZpZXdlciB1cGRhdGFibGVDb21ib1ZpZXdlcjsKLQotCXByaXZhdGUgQ29ubmVjdGlvblByb2ZpbGUgY29ubmVjdGlvblByb2ZpbGU7Ci0JCi0JcHVibGljIENvbHVtbkNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrLCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULk5VTEwsIGNvbW1hbmRTdGFjaywgd2lkZ2V0RmFjdG9yeSk7Ci0JCXRoaXMuY29sdW1uTGlzdGVuZXIgPSBidWlsZENvbHVtbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvbkxpc3RlbmVyID0gYnVpbGRDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBBZGFwdGVyIGJ1aWxkQ29sdW1uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJCQljb2x1bW5DaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0gICAgcHJpdmF0ZSBDb25uZWN0aW9uTGlzdGVuZXIgYnVpbGRDb25uZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ29ubmVjdGlvbkxpc3RlbmVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCBhYm91dFRvQ2xvc2UoQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7Ci0JCQkJLy8gbm90IGludGVyZXN0ZWQgdG8gdGhpcyBldmVudC4KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgY2xvc2VkKENvbm5lY3Rpb24gY29ubmVjdGlvbikgewotCQkJCWdldENvbnRyb2woKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKCBuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWlmIChnZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQkJQ29sdW1uQ29tcG9zaXRlLnRoaXMucG9wdWxhdGVDb2x1bW5Db21ibygpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIG1vZGlmaWVkKENvbm5lY3Rpb24gY29ubmVjdGlvbikgewotCQkJCWdldENvbnRyb2woKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKCBuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWlmIChnZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQkJQ29sdW1uQ29tcG9zaXRlLnRoaXMucG9wdWxhdGVDb2x1bW5Db21ibygpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIG9rVG9DbG9zZShDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKLQkJCQkvLyBub3QgaW50ZXJlc3RlZCB0byB0aGlzIGV2ZW50LgotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBvcGVuZWQoQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7Ci0JCQkJZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMoIG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJaWYgKGdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQlDb2x1bW5Db21wb3NpdGUudGhpcy5wb3B1bGF0ZUNvbHVtbkNvbWJvKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgZGF0YWJhc2VDaGFuZ2VkKENvbm5lY3Rpb24gY29ubmVjdGlvbiwgZmluYWwgRGF0YWJhc2UgZGF0YWJhc2UpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHNjaGVtYUNoYW5nZWQoQ29ubmVjdGlvbiBjb25uZWN0aW9uLCBmaW5hbCBTY2hlbWEgc2NoZW1hKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB0YWJsZUNoYW5nZWQoQ29ubmVjdGlvbiBjb25uZWN0aW9uLCBmaW5hbCBUYWJsZSB0YWJsZSkgewotCQkJCWdldENvbnRyb2woKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKCBuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWlmKHRhYmxlID09IGdldERiVGFibGUoKSkgewotCQkJCQkJCWlmICghZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJCQlDb2x1bW5Db21wb3NpdGUudGhpcy5wb3B1bGF0ZUNvbHVtbkNvbWJvKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX07Ci0gICAgfQotICAgIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlJV29ya2JlbmNoSGVscFN5c3RlbSBoZWxwU3lzdGVtID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsJCQotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7CQotCQkKLQkJR3JvdXAgY29sdW1uR3JvdXAgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlR3JvdXAoY29tcG9zaXRlLCBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQ29sdW1uQ29tcG9zaXRlX2NvbHVtblNlY3Rpb24pOwotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsJCQkJCi0JCWNvbHVtbkdyb3VwLnNldExheW91dChsYXlvdXQpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZT0gdHJ1ZTsKLQkJY29sdW1uR3JvdXAuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJLy9jcmVhdGVkIHRoaXMgY29tcG9zaXRlIGJlY2F1c2UgY29tYm9zIGFzIGRpcmVjdCBjaGlsZHJlbiBvZiBhIEdyb3VwIGRvIG5vdCBoYXZlIGEgYm9yZGVyLCBubyBjbHVlIHdoeQotCQlDb21wb3NpdGUgaW50ZXJtZWRpYXJ5Q29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNvbXBvc2l0ZShjb2x1bW5Hcm91cCk7Ci0JCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsJCQotCQlpbnRlcm1lZGlhcnlDb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZT0gdHJ1ZTsKLQkJaW50ZXJtZWRpYXJ5Q29tcG9zaXRlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkKLQkJCi0JCUNvbW1vbldpZGdldHMuYnVpbGRDb2x1bW5MYWJlbChpbnRlcm1lZGlhcnlDb21wb3NpdGUsIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCQotCQl0aGlzLmNvbHVtbkNvbWJvID0gYnVpbGRDb2x1bW5Db21ibyhpbnRlcm1lZGlhcnlDb21wb3NpdGUpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkJFR0lOTklORzsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXRoaXMuY29sdW1uQ29tYm8uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWhlbHBTeXN0ZW0uc2V0SGVscChjb2x1bW5Db21ibywgSUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfQ09MVU1OKTsKLQkJCi0JCQotCQlDb21tb25XaWRnZXRzLmJ1aWxkQ29sdW1uVGFibGVMYWJlbChpbnRlcm1lZGlhcnlDb21wb3NpdGUsIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCQotCQl0aGlzLnRhYmxlQ29tYm8gPSBidWlsZFRhYmxlQ29tYm8oaW50ZXJtZWRpYXJ5Q29tcG9zaXRlKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5CRUdJTk5JTkc7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQl0aGlzLnRhYmxlQ29tYm8uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWhlbHBTeXN0ZW0uc2V0SGVscCh0YWJsZUNvbWJvLCBJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19DT0xVTU5fVEFCTEUpOwotCi0JCWdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVMYWJlbChpbnRlcm1lZGlhcnlDb21wb3NpdGUsIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Db2x1bW5Db21wb3NpdGVfaW5zZXJ0YWJsZSk7Ci0KLQkJdGhpcy5pbnNlcnRhYmxlQ29tYm9WaWV3ZXIgPSBuZXcgRW51bUNvbWJvVmlld2VyKGludGVybWVkaWFyeUNvbXBvc2l0ZSwgdGhpcy5jb21tYW5kU3RhY2ssIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCXRoaXMuaW5zZXJ0YWJsZUNvbWJvVmlld2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpKTsKLQkJaGVscFN5c3RlbS5zZXRIZWxwKHRoaXMuaW5zZXJ0YWJsZUNvbWJvVmlld2VyLmdldENvbnRyb2woKSwgSUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfQ09MVU1OX0lOU0VSVEFCTEUpOwotCi0JCWdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVMYWJlbChpbnRlcm1lZGlhcnlDb21wb3NpdGUsIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Db2x1bW5Db21wb3NpdGVfdXBkYXRhYmxlKTsKLQotCQl0aGlzLnVwZGF0YWJsZUNvbWJvVmlld2VyID0gbmV3IEVudW1Db21ib1ZpZXdlcihpbnRlcm1lZGlhcnlDb21wb3NpdGUsIHRoaXMuY29tbWFuZFN0YWNrLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCQl0aGlzLnVwZGF0YWJsZUNvbWJvVmlld2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpKTsKLQkJaGVscFN5c3RlbS5zZXRIZWxwKHRoaXMudXBkYXRhYmxlQ29tYm9WaWV3ZXIuZ2V0Q29udHJvbCgpLCBJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19DT0xVTU5fVVBEQVRBQkxFKTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBDQ29tYm8gYnVpbGRDb2x1bW5Db21ibyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWZpbmFsIENDb21ibyBjb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8ocGFyZW50LCBTV1QuRkxBVCk7Ci0gIAkJY29tYm8uYWRkKEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Db2x1bW5Db21wb3NpdGVfZGVmYXVsdEVtcHR5KTsKLQkJY29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJaWYgKGlzUG9wdWxhdGluZygpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIGNvbHVtblRleHQgPSAoKENDb21ibykgZS5nZXRTb3VyY2UoKSkuZ2V0VGV4dCgpOwotCQkJCWlmIChjb2x1bW5UZXh0LmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQljb2x1bW5UZXh0ID0gbnVsbDsKLQkJCQkJaWYgKGNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkgPT0gbnVsbCB8fCBjb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCWlmIChjb2x1bW5UZXh0ICE9IG51bGwgJiYgY29tYm8uZ2V0SXRlbUNvdW50KCkgPiAwICYmIGNvbHVtblRleHQuZXF1YWxzKGNvbWJvLmdldEl0ZW0oMCkpKSB7Ci0JCQkJCWNvbHVtblRleHQgPSBudWxsOwotCQkJCX0KLQotCQkJCWlmIChjb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpID09IG51bGwgJiYgY29sdW1uVGV4dCAhPSBudWxsKSB7Ci0JCQkJCWNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKGNvbHVtblRleHQpOwotCQkJCX0KLQkJCQlpZiAoY29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSAhPSBudWxsICYmICFjb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpLmVxdWFscyhjb2x1bW5UZXh0KSkgewotCQkJCQljb2x1bW4uc2V0U3BlY2lmaWVkTmFtZShjb2x1bW5UZXh0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gY29tYm87Ci0JfQotCQotCXByaXZhdGUgQ0NvbWJvIGJ1aWxkVGFibGVDb21ibyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWZpbmFsIENDb21ibyBjb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8ocGFyZW50LCBTV1QuRkxBVCk7Ci0gIAkJY29tYm8uYWRkKEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Db2x1bW5Db21wb3NpdGVfZGVmYXVsdEVtcHR5KTsKLQkJY29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJaWYgKGlzUG9wdWxhdGluZygpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIHRhYmxlVGV4dCA9ICgoQ0NvbWJvKSBlLmdldFNvdXJjZSgpKS5nZXRUZXh0KCk7Ci0JCQkJaWYgKHRhYmxlVGV4dC5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJdGFibGVUZXh0ID0gbnVsbDsKLQkJCQkJaWYgKGNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpID09IG51bGwgfHwgY29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJaWYgKHRhYmxlVGV4dCAhPSBudWxsICYmIGNvbWJvLmdldEl0ZW1Db3VudCgpID4gMCAmJiB0YWJsZVRleHQuZXF1YWxzKGNvbWJvLmdldEl0ZW0oMCkpKSB7Ci0JCQkJCXRhYmxlVGV4dCA9IG51bGw7Ci0JCQkJfQotCi0JCQkJaWYgKGNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpID09IG51bGwgJiYgdGFibGVUZXh0ICE9IG51bGwpIHsKLQkJCQkJY29sdW1uLnNldFNwZWNpZmllZFRhYmxlKHRhYmxlVGV4dCk7Ci0JCQkJfQotCQkJCWlmIChjb2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSAhPSBudWxsICYmICFjb2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKS5lcXVhbHModGFibGVUZXh0KSkgewotCQkJCQljb2x1bW4uc2V0U3BlY2lmaWVkVGFibGUodGFibGVUZXh0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gY29tYm87Ci0JCQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjb2x1bW5DaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJaWYgKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSU5hbWVkQ29sdW1uLmNsYXNzKSA9PSBKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLklOQU1FRF9DT0xVTU5fX1NQRUNJRklFRF9OQU1FKSB7Ci0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkgfHwgaXNQb3B1bGF0aW5nKCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlwb3B1bGF0ZUNvbHVtbk5hbWUoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQllbHNlIGlmIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKElOYW1lZENvbHVtbi5jbGFzcykgPT0gSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JTkFNRURfQ09MVU1OX19ERUZBVUxUX05BTUUpIHsKLQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCXBvcHVsYXRlRGVmYXVsdENvbHVtbk5hbWUoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQllbHNlIGlmIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKElBYnN0cmFjdENvbHVtbi5jbGFzcykgPT0gSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JQUJTVFJBQ1RfQ09MVU1OX19ERUZBVUxUX1RBQkxFKSB7Ci0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlwb3B1bGF0ZURlZmF1bHRDb2x1bW5UYWJsZSgpOwotCQkJCQlwb3B1bGF0ZUNvbHVtbkNvbWJvKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJZWxzZSBpZiAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChJQWJzdHJhY3RDb2x1bW4uY2xhc3MpID09IEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSUFCU1RSQUNUX0NPTFVNTl9fU1BFQ0lGSUVEX1RBQkxFKSB7Ci0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlwb3B1bGF0ZUNvbHVtblRhYmxlKCk7Ci0JCQkJCXBvcHVsYXRlQ29sdW1uQ29tYm8oKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VMaXN0ZW5lcnMoKSB7Ci0JCWlmICh0aGlzLmNvbHVtbiAhPSBudWxsKSB7Ci0JCQl0aGlzLmNvbHVtbi5lQWRhcHRlcnMoKS5hZGQodGhpcy5jb2x1bW5MaXN0ZW5lcik7Ci0JCQl0aGlzLmFkZENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTGlzdGVuZXJzKCkgewotCQlpZiAodGhpcy5jb2x1bW4gIT0gbnVsbCkgewotCQkJdGhpcy5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJCXRoaXMuY29sdW1uLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzLmNvbHVtbkxpc3RlbmVyKTsKLQkJfQotCX0KLQotCXByaXZhdGUgQ29ubmVjdGlvblByb2ZpbGUgZ2V0Q29ubmVjdGlvblByb2ZpbGUoKSB7Ci0JCWlmICh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlID09IG51bGwpIHsKLQkJCXRoaXMuY29ubmVjdGlvblByb2ZpbGUgPSB0aGlzLmNvbHVtbi5nZXRKcGFQcm9qZWN0KCkuY29ubmVjdGlvblByb2ZpbGUoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5jb25uZWN0aW9uUHJvZmlsZTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZENvbm5lY3Rpb25MaXN0ZW5lcigpIHsKLQkJdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZSgpLmFkZENvbm5lY3Rpb25MaXN0ZW5lcih0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCByZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIodGhpcy5jb25uZWN0aW9uTGlzdGVuZXIpOwotCX0KLQkKLQlwcml2YXRlIFRhYmxlIGdldERiVGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLmNvbHVtbi5kYlRhYmxlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlQ29sdW1uQ29tYm8oKSB7Ci0JCS8vVE9ETyBkb24ndCBkbyBpbnN0YW5jZW9mIGNoZWNrIGhlcmUgLSBjaGVjayBvbiBUYWJsZSwgb3IgaXNSb290IGNoZWNrIG9uIEVudGl0eQotCQkvL3RoaXMudGFibGVDb21iby5zZXRFbmFibGVkKCEodGhpcy50YWJsZSBpbnN0YW5jZW9mIFNpbmdsZVRhYmxlSW5oZXJpdGFuY2VDaGlsZFRhYmxlSW1wbCkpOwotCQlwb3B1bGF0ZURlZmF1bHRDb2x1bW5OYW1lKCk7Ci0KLQkJaWYgKHRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKS5pc0Nvbm5lY3RlZCgpKSB7Ci0JCQl0aGlzLmNvbHVtbkNvbWJvLnJlbW92ZSgxLCB0aGlzLmNvbHVtbkNvbWJvLmdldEl0ZW1Db3VudCgpLTEpOwotCQkJVGFibGUgdGFibGUgPSBnZXREYlRhYmxlKCk7Ci0JCQlpZiAodGFibGUgIT0gbnVsbCkgewotCQkJCWZvciAoSXRlcmF0b3IgaSA9IENvbGxlY3Rpb25Ub29scy5zb3J0KENvbGxlY3Rpb25Ub29scy5saXN0KHRhYmxlLmNvbHVtbk5hbWVzKCkpKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQkJdGhpcy5jb2x1bW5Db21iby5hZGQoKFN0cmluZykgaS5uZXh0KCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXRoaXMuY29sdW1uQ29tYm8ucmVtb3ZlKDEsIHRoaXMuY29sdW1uQ29tYm8uZ2V0SXRlbUNvdW50KCktMSk7Ci0JCX0KLQkJcG9wdWxhdGVDb2x1bW5OYW1lKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlRGVmYXVsdENvbHVtbk5hbWUoKSB7Ci0JCVN0cmluZyBkZWZhdWx0VGFibGVOYW1lID0gY29sdW1uLmdldERlZmF1bHROYW1lKCk7Ci0JCWludCBzZWxlY3Rpb25JbmRleCA9IGNvbHVtbkNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCWNvbHVtbkNvbWJvLnNldEl0ZW0oMCwgTkxTLmJpbmQoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkNvbHVtbkNvbXBvc2l0ZV9kZWZhdWx0V2l0aE9uZVBhcmFtLCBkZWZhdWx0VGFibGVOYW1lKSk7Ci0JCWlmIChzZWxlY3Rpb25JbmRleCA9PSAwKSB7Ci0JCQkvL2NvbWJvIHRleHQgZG9lcyBub3QgdXBkYXRlIHdoZW4gc3dpdGNoaW5nIGJldHdlZW4gMiBtYXBwaW5ncyBvZiB0aGUgc2FtZSB0eXBlCi0JCQkvL3RoYXQgYm90aCBoYXZlIGEgZGVmYXVsdCBjb2x1bW4gbmFtZS4gIGNsZWFyIHRoZSBzZWxlY3Rpb24gYW5kIHRoZW4gc2V0IGl0IGFnYWluCi0JCQljb2x1bW5Db21iby5jbGVhclNlbGVjdGlvbigpOwotCQkJY29sdW1uQ29tYm8uc2VsZWN0KDApOwotCQl9CQkKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVDb2x1bW5OYW1lKCkgewotCQlTdHJpbmcgc3BlY2lmaWVkQ29sdW1uTmFtZSA9IHRoaXMuY29sdW1uLmdldFNwZWNpZmllZE5hbWUoKTsKLQkJaWYgKHNwZWNpZmllZENvbHVtbk5hbWUgIT0gbnVsbCkgewotCQkJaWYgKCF0aGlzLmNvbHVtbkNvbWJvLmdldFRleHQoKS5lcXVhbHMoc3BlY2lmaWVkQ29sdW1uTmFtZSkpIHsKLQkJCQl0aGlzLmNvbHVtbkNvbWJvLnNldFRleHQoc3BlY2lmaWVkQ29sdW1uTmFtZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlTdHJpbmcgZGVmYXVsdENvbHVtbk5hbWUgPSB0aGlzLmNvbHVtbi5nZXREZWZhdWx0TmFtZSgpOwotCQkJaWYgKCF0aGlzLmNvbHVtbkNvbWJvLmdldFRleHQoKS5lcXVhbHMoTkxTLmJpbmQoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkNvbHVtbkNvbXBvc2l0ZV9kZWZhdWx0V2l0aE9uZVBhcmFtLCBkZWZhdWx0Q29sdW1uTmFtZSkpKSB7Ci0JCQkJdGhpcy5jb2x1bW5Db21iby5zZWxlY3QoMCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlVGFibGVDb21ibygpIHsKLQkJLy9UT0RPIGRvbid0IGRvIGluc3RhbmNlb2YgY2hlY2sgaGVyZSAtIGNoZWNrIG9uIFRhYmxlLCBvciBpc1Jvb3QgY2hlY2sgb24gRW50aXR5Ci0JCS8vdGhpcy50YWJsZUNvbWJvLnNldEVuYWJsZWQoISh0aGlzLnRhYmxlIGluc3RhbmNlb2YgU2luZ2xlVGFibGVJbmhlcml0YW5jZUNoaWxkVGFibGVJbXBsKSk7Ci0JCXBvcHVsYXRlRGVmYXVsdENvbHVtblRhYmxlKCk7Ci0JCXRoaXMudGFibGVDb21iby5yZW1vdmUoMSwgdGhpcy50YWJsZUNvbWJvLmdldEl0ZW1Db3VudCgpLTEpOwotCQkKLQkJaWYgKHRoaXMuY29sdW1uICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaSA9IHRoaXMuY29sdW1uLmdldE93bmVyKCkuZ2V0VHlwZU1hcHBpbmcoKS5hc3NvY2lhdGVkVGFibGVOYW1lc0luY2x1ZGluZ0luaGVyaXRlZCgpOyBpLmhhc05leHQoKTsgKSB7Ci0JCQkJdGhpcy50YWJsZUNvbWJvLmFkZCgoU3RyaW5nKSBpLm5leHQoKSk7CQkJCi0JCQl9Ci0JCX0KLQkJcG9wdWxhdGVDb2x1bW5UYWJsZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZURlZmF1bHRDb2x1bW5UYWJsZSgpIHsKLQkJU3RyaW5nIGRlZmF1bHRUYWJsZU5hbWUgPSBjb2x1bW4uZ2V0RGVmYXVsdFRhYmxlKCk7Ci0JCWludCBzZWxlY3Rpb25JbmRleCA9IHRhYmxlQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJdGFibGVDb21iby5zZXRJdGVtKDAsIE5MUy5iaW5kKEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Db2x1bW5Db21wb3NpdGVfZGVmYXVsdFdpdGhPbmVQYXJhbSwgZGVmYXVsdFRhYmxlTmFtZSkpOwotCQlpZiAoc2VsZWN0aW9uSW5kZXggPT0gMCkgewotCQkJLy9jb21ibyB0ZXh0IGRvZXMgbm90IHVwZGF0ZSB3aGVuIHN3aXRjaGluZyBiZXR3ZWVuIDIgbWFwcGluZ3Mgb2YgdGhlIHNhbWUgdHlwZQotCQkJLy90aGF0IGJvdGggaGF2ZSBhIGRlZmF1bHQgY29sdW1uIG5hbWUuICBjbGVhciB0aGUgc2VsZWN0aW9uIGFuZCB0aGVuIHNldCBpdCBhZ2FpbgotCQkJdGFibGVDb21iby5jbGVhclNlbGVjdGlvbigpOwotCQkJdGFibGVDb21iby5zZWxlY3QoMCk7Ci0JCX0JCQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZUNvbHVtblRhYmxlKCkgewotCQlTdHJpbmcgdGFibGVOYW1lID0gdGhpcy5jb2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKTsKLQkJU3RyaW5nIGRlZmF1bHRUYWJsZU5hbWUgPSB0aGlzLmNvbHVtbi5nZXREZWZhdWx0VGFibGUoKTsKLQkJaWYgKHRhYmxlTmFtZSAhPSBudWxsKSB7Ci0JCQlpZiAoIXRoaXMudGFibGVDb21iby5nZXRUZXh0KCkuZXF1YWxzKHRhYmxlTmFtZSkpIHsKLQkJCQl0aGlzLnRhYmxlQ29tYm8uc2V0VGV4dCh0YWJsZU5hbWUpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKCF0aGlzLnRhYmxlQ29tYm8uZ2V0VGV4dCgpLmVxdWFscyhOTFMuYmluZChKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQ29sdW1uQ29tcG9zaXRlX2RlZmF1bHRXaXRoT25lUGFyYW0sIGRlZmF1bHRUYWJsZU5hbWUpKSkgewotCQkJCXRoaXMudGFibGVDb21iby5zZWxlY3QoMCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBkb1BvcHVsYXRlKEVPYmplY3Qgb2JqKSB7Ci0JCXRoaXMuY29sdW1uID0gKElDb2x1bW4pIG9iajsKLQkJaWYgKHRoaXMuY29sdW1uICE9IG51bGwpIHsKLQkJCXBvcHVsYXRlQ29sdW1uQ29tYm8oKTsKLQkJCXBvcHVsYXRlVGFibGVDb21ibygpOwotCQl9Ci0JCXRoaXMuaW5zZXJ0YWJsZUNvbWJvVmlld2VyLnBvcHVsYXRlKG5ldyBJbnNlcnRhYmxlSG9sZGVyKHRoaXMuY29sdW1uKSk7Ci0JCXRoaXMudXBkYXRhYmxlQ29tYm9WaWV3ZXIucG9wdWxhdGUobmV3IFVwZGF0YWJsZUhvbGRlcih0aGlzLmNvbHVtbikpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkb1BvcHVsYXRlKCkgewotCQlpZiAodGhpcy5jb2x1bW4gIT0gbnVsbCkgewotCQkJcG9wdWxhdGVDb2x1bW5Db21ibygpOwotCQkJcG9wdWxhdGVUYWJsZUNvbWJvKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlID0gbnVsbDsKLQkJfQotCQl0aGlzLmluc2VydGFibGVDb21ib1ZpZXdlci5wb3B1bGF0ZSgpOwotCQl0aGlzLnVwZGF0YWJsZUNvbWJvVmlld2VyLnBvcHVsYXRlKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGVuYWJsZVdpZGdldHMoYm9vbGVhbiBlbmFibGVkKSB7Ci0JCXRoaXMuY29sdW1uQ29tYm8uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJdGhpcy50YWJsZUNvbWJvLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCXRoaXMuaW5zZXJ0YWJsZUNvbWJvVmlld2VyLmdldENvbnRyb2woKS5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQl0aGlzLnVwZGF0YWJsZUNvbWJvVmlld2VyLmdldENvbnRyb2woKS5zZXRFbmFibGVkKGVuYWJsZWQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl0aGlzLmluc2VydGFibGVDb21ib1ZpZXdlci5kaXNwb3NlKCk7Ci0JCXRoaXMudXBkYXRhYmxlQ29tYm9WaWV3ZXIuZGlzcG9zZSgpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCQotCXByaXZhdGUgY2xhc3MgSW5zZXJ0YWJsZUhvbGRlciBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgRW51bUhvbGRlciB7Ci0JCQotCQlwcml2YXRlIElBYnN0cmFjdENvbHVtbiBjb2x1bW47Ci0JCQotCQlJbnNlcnRhYmxlSG9sZGVyKElBYnN0cmFjdENvbHVtbiBjb2x1bW4pIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmNvbHVtbiA9IGNvbHVtbjsKLQkJfQotCQkKLQkJcHVibGljIE9iamVjdCBnZXQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5jb2x1bW4uZ2V0SW5zZXJ0YWJsZSgpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXQoT2JqZWN0IGVudW1TZXR0aW5nKSB7Ci0JCQl0aGlzLmNvbHVtbi5zZXRJbnNlcnRhYmxlKChEZWZhdWx0VHJ1ZUJvb2xlYW4pIGVudW1TZXR0aW5nKTsKLQkJCQotCQl9Ci0JCQotCQlwdWJsaWMgQ2xhc3MgZmVhdHVyZUNsYXNzKCkgewotCQkJcmV0dXJuIElBYnN0cmFjdENvbHVtbi5jbGFzczsKLQkJfQotCQkKLQkJcHVibGljIGludCBmZWF0dXJlSWQoKSB7Ci0JCQlyZXR1cm4gSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JQUJTVFJBQ1RfQ09MVU1OX19JTlNFUlRBQkxFOwotCQl9Ci0JCQotCQlwdWJsaWMgRU9iamVjdCB3cmFwcGVkT2JqZWN0KCkgewotCQkJcmV0dXJuIHRoaXMuY29sdW1uOwotCQl9Ci0JCQotCQlwdWJsaWMgT2JqZWN0W10gZW51bVZhbHVlcygpIHsKLQkJCXJldHVybiBEZWZhdWx0VHJ1ZUJvb2xlYW4uVkFMVUVTLnRvQXJyYXkoKTsKLQkJfQotCQkKLQkJcHVibGljIE9iamVjdCBkZWZhdWx0VmFsdWUoKSB7Ci0JCQlyZXR1cm4gRGVmYXVsdFRydWVCb29sZWFuLkRFRkFVTFQ7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZGVmYXVsdFN0cmluZygpIHsKLQkJCS8vVE9ETyBtb3ZlIHRoaXMgb3V0IG9mIHRoZSBVSSBpbnRvIHRoZSBtb2RlbAotCQkJcmV0dXJuICJUcnVlIjsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgVXBkYXRhYmxlSG9sZGVyIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBFbnVtSG9sZGVyIHsKLQkJCi0JCXByaXZhdGUgSUFic3RyYWN0Q29sdW1uIGNvbHVtbjsKLQkJCi0JCVVwZGF0YWJsZUhvbGRlcihJQWJzdHJhY3RDb2x1bW4gY29sdW1uKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5jb2x1bW4gPSBjb2x1bW47Ci0JCX0KLQkJCi0JCXB1YmxpYyBPYmplY3QgZ2V0KCkgewotCQkJcmV0dXJuIHRoaXMuY29sdW1uLmdldFVwZGF0YWJsZSgpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXQoT2JqZWN0IGVudW1TZXR0aW5nKSB7Ci0JCQl0aGlzLmNvbHVtbi5zZXRVcGRhdGFibGUoKERlZmF1bHRUcnVlQm9vbGVhbikgZW51bVNldHRpbmcpOwotCQkJCi0JCX0KLQkJCi0JCXB1YmxpYyBDbGFzcyBmZWF0dXJlQ2xhc3MoKSB7Ci0JCQlyZXR1cm4gSUFic3RyYWN0Q29sdW1uLmNsYXNzOwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGZlYXR1cmVJZCgpIHsKLQkJCXJldHVybiBKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLklBQlNUUkFDVF9DT0xVTU5fX1VQREFUQUJMRTsKLQkJfQotCQkKLQkJcHVibGljIEVPYmplY3Qgd3JhcHBlZE9iamVjdCgpIHsKLQkJCXJldHVybiB0aGlzLmNvbHVtbjsKLQkJfQotCQkKLQkJcHVibGljIE9iamVjdFtdIGVudW1WYWx1ZXMoKSB7Ci0JCQlyZXR1cm4gRGVmYXVsdFRydWVCb29sZWFuLlZBTFVFUy50b0FycmF5KCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBPYmplY3QgZGVmYXVsdFZhbHVlKCkgewotCQkJcmV0dXJuIERlZmF1bHRUcnVlQm9vbGVhbi5ERUZBVUxUOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGRlZmF1bHRTdHJpbmcoKSB7Ci0JCQkvL1RPRE8gbW92ZSB0aGlzIG91dCBvZiB0aGUgVUkgaW50byB0aGUgbW9kZWwKLQkJCXJldHVybiAiVHJ1ZSI7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0NvbW1vbldpZGdldHMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvQ29tbW9uV2lkZ2V0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTc5NjZjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvQ29tbW9uV2lkZ2V0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuRGVmYXVsdEVhZ2VyRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLkRlZmF1bHRMYXp5RmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLkRlZmF1bHRUcnVlQm9vbGVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5FbnVtVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JQWJzdHJhY3RDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLkpwYUNvcmVNYXBwaW5nc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlscy5FbnVtQ29tYm9WaWV3ZXIuRW51bUhvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlscy5TdHJpbmdXaXRoRGVmYXVsdENob29zZXIuU3RyaW5nSG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgQ29tbW9uV2lkZ2V0cyAKLXsKLQlwdWJsaWMgc3RhdGljIExhYmVsIGJ1aWxkRW50aXR5TmFtZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIHdpZGdldEZhY3RvcnkuY3JlYXRlTGFiZWwocGFyZW50LCBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuRW50aXR5R2VuZXJhbFNlY3Rpb25fbmFtZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBFbnRpdHlOYW1lQ29tYm8gYnVpbGRFbnRpdHlOYW1lQ29tYm8oCi0JCQlDb21wb3NpdGUgcGFyZW50LCBDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrLCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgRW50aXR5TmFtZUNvbWJvKHBhcmVudCwgY29tbWFuZFN0YWNrLCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBMYWJlbCBidWlsZFRhYmxlTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gd2lkZ2V0RmFjdG9yeS5jcmVhdGVMYWJlbChwYXJlbnQsIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5UYWJsZUNob29zZXJfbGFiZWwpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIExhYmVsIGJ1aWxkQ2F0YWxvZ0xhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIHdpZGdldEZhY3RvcnkuY3JlYXRlTGFiZWwocGFyZW50LCBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQ2F0YWxvZ0Nob29zZXJfbGFiZWwpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIExhYmVsIGJ1aWxkU2NoZW1hTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gd2lkZ2V0RmFjdG9yeS5jcmVhdGVMYWJlbChwYXJlbnQsIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5TY2hlbWFDaG9vc2VyX2xhYmVsKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmdXaXRoRGVmYXVsdENob29zZXIgYnVpbGRTdHJpbmdXaXRoRGVmYXVsdENob29zZXIoCi0JCQlDb21wb3NpdGUgcGFyZW50LCBDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrLCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nV2l0aERlZmF1bHRDaG9vc2VyKHBhcmVudCwgY29tbWFuZFN0YWNrLCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQotCXB1YmxpYyBzdGF0aWMgTGFiZWwgYnVpbGRGZXRjaExhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIHdpZGdldEZhY3RvcnkuY3JlYXRlTGFiZWwocGFyZW50LCBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQmFzaWNHZW5lcmFsU2VjdGlvbl9mZXRjaExhYmVsKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBMYWJlbCBidWlsZFRhcmdldEVudGl0eUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIHdpZGdldEZhY3RvcnkuY3JlYXRlTGFiZWwocGFyZW50LCBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuVGFyZ2V0RW50aXR5Q2hvb3Nlcl9sYWJlbCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgTGFiZWwgYnVpbGRPcHRpb25hbExhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIHdpZGdldEZhY3RvcnkuY3JlYXRlTGFiZWwocGFyZW50LCBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQmFzaWNHZW5lcmFsU2VjdGlvbl9vcHRpb25hbExhYmVsKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBMYWJlbCBidWlsZFRlbXBvcmFsTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gd2lkZ2V0RmFjdG9yeS5jcmVhdGVMYWJlbChwYXJlbnQsIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5CYXNpY0dlbmVyYWxTZWN0aW9uX3RlbXBvcmFsTGFiZWwpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIExhYmVsIGJ1aWxkRW51bWVyYXRlZExhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIHdpZGdldEZhY3RvcnkuY3JlYXRlTGFiZWwocGFyZW50LCBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQmFzaWNHZW5lcmFsU2VjdGlvbl9lbnVtZXJhdGVkTGFiZWwpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIExhYmVsIGJ1aWxkTWFwcGVkQnlMYWJlbChDb21wb3NpdGUgcGFyZW50LCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiB3aWRnZXRGYWN0b3J5LmNyZWF0ZUxhYmVsKHBhcmVudCwgSnB0VWlNYXBwaW5nc01lc3NhZ2VzLk5vbk93bmluZ01hcHBpbmdfbWFwcGVkQnlMYWJlbCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgRW51bUNvbWJvVmlld2VyIGJ1aWxkRmV0Y2hUeXBlQ29tYm9WaWV3ZXIoCi0JCQlDb21wb3NpdGUgcGFyZW50LCBDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrLCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgRW51bUNvbWJvVmlld2VyKHBhcmVudCwgY29tbWFuZFN0YWNrLCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEVudW1Db21ib1ZpZXdlciBidWlsZEVudW1Db21ib1ZpZXdlcigKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIENvbW1hbmRTdGFjayBjb21tYW5kU3RhY2ssIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBFbnVtQ29tYm9WaWV3ZXIocGFyZW50LCBjb21tYW5kU3RhY2ssIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIEVudW1Ib2xkZXIgYnVpbGRNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdGZXRjaEVudW1Ib2xkZXIoSU11bHRpUmVsYXRpb25zaGlwTWFwcGluZyBtYXBwaW5nKSB7Ci0JCXJldHVybiBuZXcgRmV0Y2hIb2xkZXIobWFwcGluZyk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgRW51bUhvbGRlciBidWlsZFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdGZXRjaEVudW1Ib2xkZXIoSVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcgbWFwcGluZykgewotCQlyZXR1cm4gbmV3IFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdGZXRjaEhvbGRlcihtYXBwaW5nKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBFbnVtSG9sZGVyIGJ1aWxkT3B0aW9uYWxIb2xkZXIoSVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcgbWFwcGluZykgewotCQlyZXR1cm4gbmV3IE9wdGlvbmFsSG9sZGVyKG1hcHBpbmcpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIExhYmVsIGJ1aWxkQ29sdW1uTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gd2lkZ2V0RmFjdG9yeS5jcmVhdGVMYWJlbChwYXJlbnQsIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Db2x1bW5DaG9vc2VyX2xhYmVsKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBMYWJlbCBidWlsZENvbHVtblRhYmxlTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gd2lkZ2V0RmFjdG9yeS5jcmVhdGVMYWJlbChwYXJlbnQsIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Db2x1bW5UYWJsZUNob29zZXJfbGFiZWwpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIENvbHVtblRhYmxlSG9sZGVyIGJ1aWxkQ29sdW1uVGFibGVIb2xkZXIoSUNvbHVtbiBjb2x1bW4pIHsKLQkJcmV0dXJuIG5ldyBDb2x1bW5UYWJsZUhvbGRlcihjb2x1bW4pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVGFyZ2V0RW50aXR5Q2hvb3NlciBidWlsZFRhcmdldEVudGl0eUNob29zZXIoQ29tcG9zaXRlIHBhcmVudCwgQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjaywgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IFRhcmdldEVudGl0eUNob29zZXIocGFyZW50LCBjb21tYW5kU3RhY2ssIHdpZGdldEZhY3RvcnkpOwotCX0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBGZXRjaEhvbGRlciBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgRW51bUhvbGRlciB7Ci0JCQotCQlwcml2YXRlIElNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcgbWFwcGluZzsKLQkJCi0JCUZldGNoSG9sZGVyKElNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcgbWFwcGluZykgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMubWFwcGluZyA9IG1hcHBpbmc7Ci0JCX0KLQkJCi0JCXB1YmxpYyBPYmplY3QgZ2V0KCkgewotCQkJcmV0dXJuIHRoaXMubWFwcGluZy5nZXRGZXRjaCgpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXQoT2JqZWN0IGVudW1TZXR0aW5nKSB7Ci0JCQl0aGlzLm1hcHBpbmcuc2V0RmV0Y2goKERlZmF1bHRMYXp5RmV0Y2hUeXBlKSBlbnVtU2V0dGluZyk7Ci0JCQkKLQkJfQotCQkKLQkJcHVibGljIENsYXNzIGZlYXR1cmVDbGFzcygpIHsKLQkJCXJldHVybiBJTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLmNsYXNzOwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGZlYXR1cmVJZCgpIHsKLQkJCXJldHVybiBKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLklNVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fRkVUQ0g7Ci0JCX0KLQkJCi0JCXB1YmxpYyBFT2JqZWN0IHdyYXBwZWRPYmplY3QoKSB7Ci0JCQlyZXR1cm4gdGhpcy5tYXBwaW5nOwotCQl9Ci0JCQotCQlwdWJsaWMgT2JqZWN0W10gZW51bVZhbHVlcygpIHsKLQkJCXJldHVybiBEZWZhdWx0TGF6eUZldGNoVHlwZS5WQUxVRVMudG9BcnJheSgpOwotCQl9Ci0JCQotCQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRWYWx1ZSgpIHsKLQkJCXJldHVybiBEZWZhdWx0TGF6eUZldGNoVHlwZS5ERUZBVUxUOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGRlZmF1bHRTdHJpbmcoKSB7Ci0JCQkvL1RPRE8gbW92ZSB0aGlzIG91dCBvZiB0aGUgVUkgaW50byB0aGUgbW9kZWwKLQkJCXJldHVybiAiTGF6eSI7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ0ZldGNoSG9sZGVyIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBFbnVtSG9sZGVyIHsKLQkJCi0JCXByaXZhdGUgSVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcgbWFwcGluZzsKLQkJCi0JCVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdGZXRjaEhvbGRlcihJU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZyBtYXBwaW5nKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5tYXBwaW5nID0gbWFwcGluZzsKLQkJfQotCQkKLQkJcHVibGljIE9iamVjdCBnZXQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5tYXBwaW5nLmdldEZldGNoKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNldChPYmplY3QgZW51bVNldHRpbmcpIHsKLQkJCXRoaXMubWFwcGluZy5zZXRGZXRjaCgoRGVmYXVsdEVhZ2VyRmV0Y2hUeXBlKSBlbnVtU2V0dGluZyk7Ci0JCQkKLQkJfQotCQkKLQkJcHVibGljIENsYXNzIGZlYXR1cmVDbGFzcygpIHsKLQkJCXJldHVybiBJU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy5jbGFzczsKLQkJfQotCQkKLQkJcHVibGljIGludCBmZWF0dXJlSWQoKSB7Ci0JCQlyZXR1cm4gSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19GRVRDSDsKLQkJfQotCQkKLQkJcHVibGljIEVPYmplY3Qgd3JhcHBlZE9iamVjdCgpIHsKLQkJCXJldHVybiB0aGlzLm1hcHBpbmc7Ci0JCX0KLQkJCi0JCXB1YmxpYyBPYmplY3RbXSBlbnVtVmFsdWVzKCkgewotCQkJcmV0dXJuIERlZmF1bHRFYWdlckZldGNoVHlwZS5WQUxVRVMudG9BcnJheSgpOwotCQl9Ci0JCQotCQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRWYWx1ZSgpIHsKLQkJCXJldHVybiBEZWZhdWx0RWFnZXJGZXRjaFR5cGUuREVGQVVMVDsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBkZWZhdWx0U3RyaW5nKCkgewotCQkJLy9UT0RPIG1vdmUgdGhpcyBvdXQgb2YgdGhlIFVJIGludG8gdGhlIG1vZGVsCi0JCQlyZXR1cm4gIkVhZ2VyIjsKLQkJfQotCX0JCi0JcHJpdmF0ZSBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQ29sdW1uSG9sZGVyIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBTdHJpbmdIb2xkZXIgewotCQlwcml2YXRlIElBYnN0cmFjdENvbHVtbiBjb2x1bW47Ci0JCQotCQlDb2x1bW5Ib2xkZXIoSUFic3RyYWN0Q29sdW1uIGNvbHVtbikgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuY29sdW1uID0gY29sdW1uOwotCQl9Ci0JCQotCQlwdWJsaWMgQ2xhc3MgZmVhdHVyZUNsYXNzKCkgewotCQkJcmV0dXJuIElBYnN0cmFjdENvbHVtbi5jbGFzczsKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gc3VwcG9ydHNEZWZhdWx0KCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCXB1YmxpYyBFT2JqZWN0IHdyYXBwZWRPYmplY3QoKSB7Ci0JCQlyZXR1cm4gdGhpcy5jb2x1bW47Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCBJQWJzdHJhY3RDb2x1bW4gZ2V0Q29sdW1uKCkgewotCQkJcmV0dXJuIHRoaXMuY29sdW1uOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgQ29sdW1uVGFibGVIb2xkZXIgZXh0ZW5kcyBDb2x1bW5Ib2xkZXIgaW1wbGVtZW50cyBTdHJpbmdIb2xkZXIgewotCQkKLQkJQ29sdW1uVGFibGVIb2xkZXIoSUFic3RyYWN0Q29sdW1uIGNvbHVtbikgewotCQkJc3VwZXIoY29sdW1uKTsKLQkJfQotCQkJCi0JCXB1YmxpYyBpbnQgZmVhdHVyZUlkKCkgewotCQkJcmV0dXJuIEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSUFCU1RSQUNUX0NPTFVNTl9fU1BFQ0lGSUVEX1RBQkxFOwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGRlZmF1bHRGZWF0dXJlSWQoKSB7Ci0JCQlyZXR1cm4gSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JQUJTVFJBQ1RfQ09MVU1OX19ERUZBVUxUX1RBQkxFOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGRlZmF1bHRJdGVtKCkgewotCQkJU3RyaW5nIGRlZmF1bHROYW1lID0gZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdFRhYmxlKCk7Ci0JCQlpZiAoZGVmYXVsdE5hbWUgIT0gbnVsbCkgewotCQkJCXJldHVybiBOTFMuYmluZChKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQ29sdW1uQ29tcG9zaXRlX2RlZmF1bHRXaXRoT25lUGFyYW0sIGRlZmF1bHROYW1lKTsKLQkJCX0KLQkJCXJldHVybiBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQ29sdW1uQ29tcG9zaXRlX2RlZmF1bHRFbXB0eTsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXRTdHJpbmcoKSB7Ci0JCQlyZXR1cm4gZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkVGFibGUoKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgc2V0U3RyaW5nKFN0cmluZyBuZXdOYW1lKSB7Ci0JCQlnZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZShuZXdOYW1lKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBPcHRpb25hbEhvbGRlciBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgRW51bUhvbGRlciB7Ci0JCQotCQlwcml2YXRlIElTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nIG1hcHBpbmc7Ci0JCQotCQlPcHRpb25hbEhvbGRlcihJU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZyBtYXBwaW5nKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5tYXBwaW5nID0gbWFwcGluZzsKLQkJfQotCQkKLQkJcHVibGljIE9iamVjdCBnZXQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5tYXBwaW5nLmdldE9wdGlvbmFsKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNldChPYmplY3QgZW51bVNldHRpbmcpIHsKLQkJCXRoaXMubWFwcGluZy5zZXRPcHRpb25hbCgoRGVmYXVsdFRydWVCb29sZWFuKSBlbnVtU2V0dGluZyk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBDbGFzcyBmZWF0dXJlQ2xhc3MoKSB7Ci0JCQlyZXR1cm4gSVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcuY2xhc3M7Ci0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgZmVhdHVyZUlkKCkgewotCQkJcmV0dXJuIEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSVNJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fT1BUSU9OQUw7Ci0JCX0KLQkJCi0JCXB1YmxpYyBFT2JqZWN0IHdyYXBwZWRPYmplY3QoKSB7Ci0JCQlyZXR1cm4gdGhpcy5tYXBwaW5nOwotCQl9Ci0JCQotCQlwdWJsaWMgT2JqZWN0W10gZW51bVZhbHVlcygpIHsKLQkJCXJldHVybiBEZWZhdWx0VHJ1ZUJvb2xlYW4uVkFMVUVTLnRvQXJyYXkoKTsKLQkJfQotCQkKLQkJcHVibGljIE9iamVjdCBkZWZhdWx0VmFsdWUoKSB7Ci0JCQlyZXR1cm4gRGVmYXVsdFRydWVCb29sZWFuLkRFRkFVTFQ7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZGVmYXVsdFN0cmluZygpIHsKLQkJCS8vVE9ETyBtb3ZlIHRoaXMgb3V0IG9mIHRoZSBVSSBpbnRvIHRoZSBtb2RlbAotCQkJcmV0dXJuICJUcnVlIjsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0VtYmVkZGFibGVDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvRW1iZWRkYWJsZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzk4ZWIwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvRW1iZWRkYWJsZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklFbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkJhc2VKcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgRW1iZWRkYWJsZUNvbXBvc2l0ZSBleHRlbmRzIEJhc2VKcGFDb21wb3NpdGUgCi17Ci0JcHJpdmF0ZSBJRW1iZWRkYWJsZSBlbWJlZGRhYmxlOwotCXByaXZhdGUgQWRhcHRlciBtYXBwZWRTdXBlcmNsYXNzTGlzdGVuZXI7Ci0JCi0JcHJpdmF0ZSBDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrOwotCQotCQotCXB1YmxpYyBFbWJlZGRhYmxlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIENvbW1hbmRTdGFjayBjb21tYW5kU3RhY2ssIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJc3VwZXIocGFyZW50LCBTV1QuTlVMTCwgY29tbWFuZFN0YWNrLCB3aWRnZXRGYWN0b3J5KTsKLQkJdGhpcy5tYXBwZWRTdXBlcmNsYXNzTGlzdGVuZXIgPSBidWlsZE1hcHBlZFN1cGVyY2xhc3NMaXN0ZW5lcigpOwotCX0KLQkKLQlwcml2YXRlIEFkYXB0ZXIgYnVpbGRNYXBwZWRTdXBlcmNsYXNzTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkJCW1hcHBlZFN1cGVyY2xhc3NDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KFNXVC5WRVJUSUNBTCkpOwotCQkKLS8vCQlMYWJlbCBhY2Nlc3NUeXBlTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0vLwkJYWNjZXNzVHlwZUxhYmVsLnNldFRleHQoRGFsaVVpTWVzc2FnZXMuTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZV9hY2Nlc3NUeXBlKTsKLS8vCQl0aGlzLmFjY2Vzc1R5cGVDb21ib1ZpZXdlciA9IGJ1aWxkQWNjZXNzVHlwZUNvbWJvKGNvbXBvc2l0ZSk7Ci0vLwkJLy9ldmVudHVhbGx5IHRoaXMgd2lsbCBiZSBlbmFibGVkIGlmIGVkaXRpbmcgeG1sIGluc3RlYWQgb2YgamF2YQotLy8JCXRoaXMuYWNjZXNzVHlwZUNvbWJvVmlld2VyLmdldENvbWJvKCkuc2V0RW5hYmxlZChmYWxzZSk7Ci0vLwkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLS8vCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLS8vCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLS8vCQl0aGlzLmFjY2Vzc1R5cGVDb21ib1ZpZXdlci5nZXRDb21ibygpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotLy8JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGhpcy5hY2Nlc3NUeXBlQ29tYm9WaWV3ZXIuZ2V0Q29tYm8oKSwgSURhbGlIZWxwQ29udGV4dElkcy5FTlRJVFlfQUNDRVNTX1RZUEUpOwotCQkKLQl9Ci0JCi0vLwlwcml2YXRlIENvbWJvVmlld2VyIGJ1aWxkQWNjZXNzVHlwZUNvbWJvKENvbXBvc2l0ZSBwYXJlbnQpIHsKLS8vCQlDb21ib1ZpZXdlciB2aWV3ZXIgPSBuZXcgQ29tYm9WaWV3ZXIocGFyZW50LCBTV1QuUkVBRF9PTkxZKTsKLS8vCQl2aWV3ZXIuYWRkKEFjY2Vzc1R5cGUuVkFMVUVTLnRvQXJyYXkoKSk7Ci0vLwkJdmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLS8vCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLS8vCQkJCWlmIChwb3B1bGF0aW5nKSB7Ci0vLwkJCQkJcmV0dXJuOwotLy8JCQkJfQotLy8JCQkJaWYgKGV2ZW50LmdldFNlbGVjdGlvbigpIGluc3RhbmNlb2YgU3RydWN0dXJlZFNlbGVjdGlvbikgewotLy8JCQkJCVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpOwotLy8JCQkJCWVkaXRpbmdEb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShTZXRDb21tYW5kLmNyZWF0ZShlZGl0aW5nRG9tYWluLCBwZXJzaXN0ZW50VHlwZSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGVyc2lzdGVudFR5cGVfQWNjZXNzVHlwZSgpLCBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkpKTsKLS8vCQkJCX0KLS8vCQkJfQotLy8JCX0pOwotLy8JCXJldHVybiB2aWV3ZXI7Ci0vLwl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9Qb3B1bGF0ZShFT2JqZWN0IG1vZGVsKSB7Ci0JCXRoaXMuZW1iZWRkYWJsZSA9IChJRW1iZWRkYWJsZSkgbW9kZWw7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvUG9wdWxhdGUoKSB7Ci0JCQotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VMaXN0ZW5lcnMoKSB7Ci0vLwkJdGhpcy5wZXJzaXN0ZW50VHlwZUl0ZW1Qcm92aWRlci5hZGRMaXN0ZW5lcihnZXRQZXJzaXN0ZW50VHlwZUxpc3RlbmVyKCkpOwotLy8JCXRoaXMucGVyc2lzdGVudFR5cGUuZUFkYXB0ZXJzKCkuYWRkKHRoaXMucGVyc2lzdGVudFR5cGVJdGVtUHJvdmlkZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZUxpc3RlbmVycygpIHsKLS8vCQlpZiAodGhpcy5wZXJzaXN0ZW50VHlwZSAhPSBudWxsKXsKLS8vCQkJdGhpcy5wZXJzaXN0ZW50VHlwZS5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcy5wZXJzaXN0ZW50VHlwZUl0ZW1Qcm92aWRlcik7Ci0vLwkJCXRoaXMucGVyc2lzdGVudFR5cGVJdGVtUHJvdmlkZXIucmVtb3ZlTGlzdGVuZXIoZ2V0UGVyc2lzdGVudFR5cGVMaXN0ZW5lcigpKTsKLS8vCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBtYXBwZWRTdXBlcmNsYXNzQ2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCQotCX0KLQkKLS8vCXByaXZhdGUgSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciBnZXRQZXJzaXN0ZW50VHlwZUxpc3RlbmVyKCkgewotLy8JCWlmICh0aGlzLnBlcnNpc3RlbnRUeXBlTGlzdGVuZXIgPT0gbnVsbCkgewotLy8JCQl0aGlzLnBlcnNpc3RlbnRUeXBlTGlzdGVuZXIgPSBuZXcgSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcigpIHsKLS8vCQkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotLy8JCQkJCWlmIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFBlcnNpc3RlbnRUeXBlLmNsYXNzKSA9PSBPcm1QYWNrYWdlLlBFUlNJU1RFTlRfVFlQRV9fQUNDRVNTX1RZUEUpIHsKLS8vCQkJCQkJZmluYWwgQWNjZXNzVHlwZSBhY2Nlc3NUeXBlID0gKEFjY2Vzc1R5cGUpIG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpOwotLy8JCQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0vLwkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0vLwkJCQkJCQkJaWYgKCgoU3RydWN0dXJlZFNlbGVjdGlvbikgYWNjZXNzVHlwZUNvbWJvVmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKSAhPSBhY2Nlc3NUeXBlKSB7Ci0vLwkJCQkJCQkJCWFjY2Vzc1R5cGVDb21ib1ZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oYWNjZXNzVHlwZSkpOwotLy8JCQkJCQkJCX0KLS8vCQkJCQkJCX0KLS8vCQkJCQkJfSk7Ci0vLwkJCQkJfQotLy8JCQkJfQotLy8JCQl9OwotLy8JCX0KLS8vCQlyZXR1cm4gdGhpcy5wZXJzaXN0ZW50VHlwZUxpc3RlbmVyOwotLy8JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9FbWJlZGRlZEF0dHJpYnV0ZU92ZXJyaWRlc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9FbWJlZGRlZEF0dHJpYnV0ZU92ZXJyaWRlc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGRhMDYzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvRW1iZWRkZWRBdHRyaWJ1dGVPdmVycmlkZXNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGlzdFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSUF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklFbWJlZGRlZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5KcGFDb3JlTWFwcGluZ3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5JSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQmFzZUpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgRW1iZWRkZWRBdHRyaWJ1dGVPdmVycmlkZXNDb21wb3NpdGUgZXh0ZW5kcyBCYXNlSnBhQ29tcG9zaXRlCi17Ci0JcHJpdmF0ZSBMaXN0Vmlld2VyIGxpc3RWaWV3ZXI7Ci0JCi0JcHJpdmF0ZSBJRW1iZWRkZWQgZW1iZWRkZWQ7Ci0JcHJpdmF0ZSBBZGFwdGVyIGVtYmVkZGVkTGlzdGVuZXI7Ci0JCi0JcHJpdmF0ZSBJQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGU7Ci0JcHJpdmF0ZSBBZGFwdGVyIGF0dHJpYnV0ZU92ZXJyaWRlTGlzdGVuZXI7Ci0JCQotCXByb3RlY3RlZCBDb2x1bW5Db21wb3NpdGUgY29sdW1uQ29tcG9zaXRlOwotCQotCXByaXZhdGUgQnV0dG9uIG92ZXJyaWRlRGVmYXVsdEJ1dHRvbjsKLQkKLQlwdWJsaWMgRW1iZWRkZWRBdHRyaWJ1dGVPdmVycmlkZXNDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjaywgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlzdXBlcihwYXJlbnQsIFNXVC5OVUxMLCBjb21tYW5kU3RhY2ssIHdpZGdldEZhY3RvcnkpOwotCQl0aGlzLmVtYmVkZGVkTGlzdGVuZXIgPSBidWlsZEVtYmVkZGVkTGlzdGVuZXIoKTsKLQkJdGhpcy5hdHRyaWJ1dGVPdmVycmlkZUxpc3RlbmVyID0gYnVpbGRBdHRyaWJ1dGVPdmVycmlkZUxpc3RlbmVyKCk7Ci0JfQotCQotCXByaXZhdGUgQWRhcHRlciBidWlsZEVtYmVkZGVkTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJCQllbWJlZGRlZENoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBBZGFwdGVyIGJ1aWxkQXR0cmlidXRlT3ZlcnJpZGVMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBBZGFwdGVySW1wbCgpIHsKLQkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkJCWF0dHJpYnV0ZU92ZXJyaWRlQ2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJfQotCQl9OwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCi0JCUdyb3VwIGF0dHJpYnV0ZU92ZXJyaWRlc0dyb3VwID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUdyb3VwKAotCQkJY29tcG9zaXRlLCBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQXR0cmlidXRlT3ZlcnJpZGVzQ29tcG9zaXRlX2F0dHJpYnV0ZU92ZXJyaWRlcyk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlc0dyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCB0cnVlKSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gIG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZT0gdHJ1ZTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzR3JvdXAuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQotCQl0aGlzLmxpc3RWaWV3ZXIgPSBidWlsZEF0dHJpYnV0ZU92ZXJyaWRlc0xpc3RWaWV3ZXIoYXR0cmlidXRlT3ZlcnJpZGVzR3JvdXApOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS52ZXJ0aWNhbFNwYW4gPSAyOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZT0gdHJ1ZTsKLQkJdGhpcy5saXN0Vmlld2VyLmdldExpc3QoKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0aGlzLmxpc3RWaWV3ZXIuZ2V0TGlzdCgpLCBJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19FTUJFRERFRF9BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJCi0JCXRoaXMub3ZlcnJpZGVEZWZhdWx0QnV0dG9uID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1dHRvbihhdHRyaWJ1dGVPdmVycmlkZXNHcm91cCwgIk92ZXJyaWRlIERlZmF1bHQiLCBTV1QuQ0hFQ0spOwotCQl0aGlzLm92ZXJyaWRlRGVmYXVsdEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihidWlsZE92ZXJyaWRlRGVmYXVsdFNlbGVjdGlvbkxpc3RlbmVyKCkpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5CRUdJTk5JTkc7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCXRoaXMub3ZlcnJpZGVEZWZhdWx0QnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkKLQkJCi0JCXRoaXMuY29sdW1uQ29tcG9zaXRlID0gbmV3IENvbHVtbkNvbXBvc2l0ZShhdHRyaWJ1dGVPdmVycmlkZXNHcm91cCwgY29tbWFuZFN0YWNrLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5CRUdJTk5JTkc7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCXRoaXMuY29sdW1uQ29tcG9zaXRlLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCX0KLQkKLQlwcml2YXRlIFNlbGVjdGlvbkxpc3RlbmVyIGJ1aWxkT3ZlcnJpZGVEZWZhdWx0U2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKXsKLQkJCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJb3ZlcnJpZGVEZWZhdWx0QnV0dG9uU2VsZWN0ZWQoZSk7Ci0JCQl9Ci0JCQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlvdmVycmlkZURlZmF1bHRCdXR0b25TZWxlY3RlZChlKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIG92ZXJyaWRlRGVmYXVsdEJ1dHRvblNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJYm9vbGVhbiBzZWxlY3Rpb24gPSB0aGlzLm92ZXJyaWRlRGVmYXVsdEJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbikgewotCQkJaW50IGluZGV4ID0gdGhpcy5lbWJlZGRlZC5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5zaXplKCk7Ci0JCQlJQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSB0aGlzLmVtYmVkZGVkLmNyZWF0ZUF0dHJpYnV0ZU92ZXJyaWRlKGluZGV4KTsKLQkJCXRoaXMuZW1iZWRkZWQuZ2V0U3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKGF0dHJpYnV0ZU92ZXJyaWRlKTsKLQkJCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUodGhpcy5hdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQkJYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSh0aGlzLmF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7CQkJCi0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLmVtYmVkZGVkLmdldFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLnJlbW92ZSh0aGlzLmF0dHJpYnV0ZU92ZXJyaWRlKTsKLQkJfQotCX0KLQkKLQkKLQlwcml2YXRlIExpc3RWaWV3ZXIgYnVpbGRBdHRyaWJ1dGVPdmVycmlkZXNMaXN0Vmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJTGlzdFZpZXdlciBsaXN0Vmlld2VyID0gbmV3IExpc3RWaWV3ZXIocGFyZW50LCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCWxpc3RWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihidWlsZEF0dHJpYnV0ZU92ZXJyaWRlc0xhYmVsUHJvdmlkZXIoKSk7Ci0JCWxpc3RWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGJ1aWxkQXR0cmlidXRlT3ZlcnJpZGVzQ29udGVudFByb3ZpZGVyKCkpOwotCQkKLQkJbGlzdFZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCWF0dHJpYnV0ZU92ZXJyaWRlc0xpc3RTZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJfSk7Ci0KLQkJcmV0dXJuIGxpc3RWaWV3ZXI7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGF0dHJpYnV0ZU92ZXJyaWRlc0xpc3RTZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQlpZiAoKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKSkuaXNFbXB0eSgpKSB7Ci0JCQl0aGlzLmNvbHVtbkNvbXBvc2l0ZS5wb3B1bGF0ZShudWxsKTsKLQkJCXRoaXMuY29sdW1uQ29tcG9zaXRlLmVuYWJsZVdpZGdldHMoZmFsc2UpOwotCQkJdGhpcy5vdmVycmlkZURlZmF1bHRCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCXRoaXMub3ZlcnJpZGVEZWZhdWx0QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5hdHRyaWJ1dGVPdmVycmlkZSA9IGdldFNlbGVjdGVkQXR0cmlidXRlT3ZlcnJpZGUoKTsKLQkJCWJvb2xlYW4gc3BlY2lmaWVkT3ZlcnJpZGUgPSB0aGlzLmVtYmVkZGVkLmdldFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpLmNvbnRhaW5zKHRoaXMuYXR0cmlidXRlT3ZlcnJpZGUpOwotCQkJdGhpcy5vdmVycmlkZURlZmF1bHRCdXR0b24uc2V0U2VsZWN0aW9uKHNwZWNpZmllZE92ZXJyaWRlKTsKLQkJCXRoaXMuY29sdW1uQ29tcG9zaXRlLnBvcHVsYXRlKHRoaXMuYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkpOwotCQkJdGhpcy5jb2x1bW5Db21wb3NpdGUuZW5hYmxlV2lkZ2V0cyhzcGVjaWZpZWRPdmVycmlkZSk7Ci0JCQl0aGlzLm92ZXJyaWRlRGVmYXVsdEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgSUxhYmVsUHJvdmlkZXIgYnVpbGRBdHRyaWJ1dGVPdmVycmlkZXNMYWJlbFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQkvL1RPRE8gYWxzbyBkaXNwbGF5IGNvbHVtbiBuYW1lIHNvbWVob3cKLQkJCQlyZXR1cm4gKChJQXR0cmlidXRlT3ZlcnJpZGUpIGVsZW1lbnQpLmdldE5hbWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkKLQlwcml2YXRlIElDb250ZW50UHJvdmlkZXIgYnVpbGRBdHRyaWJ1dGVPdmVycmlkZXNDb250ZW50UHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJCX0KLQkJCi0JCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJfQotCQkKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQkJcmV0dXJuICgoSUVtYmVkZGVkKSBpbnB1dEVsZW1lbnQpLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIElBdHRyaWJ1dGVPdmVycmlkZSBnZXRTZWxlY3RlZEF0dHJpYnV0ZU92ZXJyaWRlKCkgewotCQlyZXR1cm4gKElBdHRyaWJ1dGVPdmVycmlkZSkgKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0aGlzLmxpc3RWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCBkb1BvcHVsYXRlKEVPYmplY3Qgb2JqKSB7Ci0JCXRoaXMuZW1iZWRkZWQgPSAoSUVtYmVkZGVkKSBvYmo7Ci0JCWlmICh0aGlzLmVtYmVkZGVkID09IG51bGwpIHsKLQkJCXRoaXMuYXR0cmlidXRlT3ZlcnJpZGUgPSBudWxsOwotCQkJdGhpcy5jb2x1bW5Db21wb3NpdGUucG9wdWxhdGUobnVsbCk7Ci0JCQl0aGlzLmxpc3RWaWV3ZXIuc2V0SW5wdXQobnVsbCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmICh0aGlzLmxpc3RWaWV3ZXIuZ2V0SW5wdXQoKSAhPSB0aGlzLmVtYmVkZGVkKSB7Ci0JCQl0aGlzLmxpc3RWaWV3ZXIuc2V0SW5wdXQodGhpcy5lbWJlZGRlZCk7Ci0JCX0KLQkJaWYgKCF0aGlzLmVtYmVkZGVkLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmlzRW1wdHkoKSkgewotCQkJaWYgKHRoaXMubGlzdFZpZXdlci5nZXRTZWxlY3Rpb24oKS5pc0VtcHR5KCkpIHsKLQkJCQlJQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSB0aGlzLmVtYmVkZGVkLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKTsKLQkJCQl0aGlzLmxpc3RWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGF0dHJpYnV0ZU92ZXJyaWRlKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0aGlzLmNvbHVtbkNvbXBvc2l0ZS5lbmFibGVXaWRnZXRzKHRydWUpOwotCQkJCXRoaXMuY29sdW1uQ29tcG9zaXRlLnBvcHVsYXRlKCgoSUF0dHJpYnV0ZU92ZXJyaWRlKSgoU3RydWN0dXJlZFNlbGVjdGlvbikgdGhpcy5saXN0Vmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKSkuZ2V0Q29sdW1uKCkpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5jb2x1bW5Db21wb3NpdGUucG9wdWxhdGUobnVsbCk7Ci0JCQl0aGlzLmNvbHVtbkNvbXBvc2l0ZS5lbmFibGVXaWRnZXRzKGZhbHNlKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvUG9wdWxhdGUoKSB7Ci0JCXRoaXMuY29sdW1uQ29tcG9zaXRlLmRvUG9wdWxhdGUoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTGlzdGVuZXJzKCkgewotCQlpZiAodGhpcy5lbWJlZGRlZCAhPSBudWxsKSB7Ci0JCQl0aGlzLmVtYmVkZGVkLmVBZGFwdGVycygpLmFkZCh0aGlzLmVtYmVkZGVkTGlzdGVuZXIpOwotCQkJZm9yIChJQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgOiB0aGlzLmVtYmVkZGVkLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpKSB7Ci0JCQkJYXR0cmlidXRlT3ZlcnJpZGUuZUFkYXB0ZXJzKCkuYWRkKHRoaXMuYXR0cmlidXRlT3ZlcnJpZGVMaXN0ZW5lcik7Ci0JCQl9CQotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZUxpc3RlbmVycygpIHsKLQkJaWYgKHRoaXMuZW1iZWRkZWQgIT0gbnVsbCkgewotCQkJdGhpcy5lbWJlZGRlZC5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcy5lbWJlZGRlZExpc3RlbmVyKTsKLQkJCWZvciAoSUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlIDogdGhpcy5lbWJlZGRlZC5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKSkgewotCQkJCWF0dHJpYnV0ZU92ZXJyaWRlLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzLmF0dHJpYnV0ZU92ZXJyaWRlTGlzdGVuZXIpOwotCQkJfQkKLQkJfQotCX0KLQotCQotCXByb3RlY3RlZCB2b2lkIGVtYmVkZGVkQ2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChJRW1iZWRkZWQuY2xhc3MpKSB7Ci0JCQljYXNlIEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSUVNQkVEREVEX19TUEVDSUZJRURfQVRUUklCVVRFX09WRVJSSURFUyA6Ci0JCQljYXNlIEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSUVNQkVEREVEX19ERUZBVUxUX0FUVFJJQlVURV9PVkVSUklERVMgOgotCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWlmIChsaXN0Vmlld2VyLmdldExpc3QoKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQlsaXN0Vmlld2VyLnJlZnJlc2goKTsKLQkJCQkJCWNvbHVtbkNvbXBvc2l0ZS5lbmFibGVXaWRnZXRzKCFsaXN0Vmlld2VyLmdldFNlbGVjdGlvbigpLmlzRW1wdHkoKSk7Ci0JCQkJCQlpZiAobGlzdFZpZXdlci5nZXRTZWxlY3Rpb24oKS5pc0VtcHR5KCkpIHsKLQkJCQkJCQljb2x1bW5Db21wb3NpdGUucG9wdWxhdGUobnVsbCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlpZiAobm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpID09IE5vdGlmaWNhdGlvbi5BREQpIHsKLQkJCQkJKChJQXR0cmlidXRlT3ZlcnJpZGUpIG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpKS5lQWRhcHRlcnMoKS5hZGQodGhpcy5hdHRyaWJ1dGVPdmVycmlkZUxpc3RlbmVyKTsKLQkJCQkJZmluYWwgT2JqZWN0IG5ld1ZhbHVlID0gbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJaWYgKGxpc3RWaWV3ZXIuZ2V0TGlzdCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJfQotCQkJCQkJCWxpc3RWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5ld1ZhbHVlKSk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQkJCQllbHNlIGlmIChub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLkFERF9NQU5ZKSB7Ci0JCQkJCUxpc3QgYWRkZWRMaXN0ID0gKExpc3QpIG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpOwotCQkJCQlmb3IgKEl0ZXJhdG9yPElBdHRyaWJ1dGVPdmVycmlkZT4gaSA9IGFkZGVkTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7Ci0JCQkJCQlJQXR0cmlidXRlT3ZlcnJpZGUgb3ZlcnJpZGUgPSBpLm5leHQoKTsKLQkJCQkJCW92ZXJyaWRlLmVBZGFwdGVycygpLmFkZCh0aGlzLmF0dHJpYnV0ZU92ZXJyaWRlTGlzdGVuZXIpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uUkVNT1ZFKSB7Ci0JCQkJCSgoSUF0dHJpYnV0ZU92ZXJyaWRlKSBub3RpZmljYXRpb24uZ2V0T2xkVmFsdWUoKSkuZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMuYXR0cmlidXRlT3ZlcnJpZGVMaXN0ZW5lcik7CQkJCQotCQkJCX0KLQkJCQllbHNlIGlmIChub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZKSB7Ci0JCQkJCUxpc3QgcmVtb3ZlZExpc3QgPSAoTGlzdCkgbm90aWZpY2F0aW9uLmdldE9sZFZhbHVlKCk7Ci0JCQkJCWZvciAoSXRlcmF0b3I8SUF0dHJpYnV0ZU92ZXJyaWRlPiBpID0gcmVtb3ZlZExpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgewotCQkJCQkJSUF0dHJpYnV0ZU92ZXJyaWRlIG92ZXJyaWRlID0gaS5uZXh0KCk7Ci0JCQkJCQlvdmVycmlkZS5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcy5hdHRyaWJ1dGVPdmVycmlkZUxpc3RlbmVyKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYXR0cmlidXRlT3ZlcnJpZGVDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKElBdHRyaWJ1dGVPdmVycmlkZS5jbGFzcykpIHsKLQkJCWNhc2UgSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JQVRUUklCVVRFX09WRVJSSURFX19OQU1FIDoKLQkJCQlmaW5hbCBJQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSAoSUF0dHJpYnV0ZU92ZXJyaWRlKSBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKTsKLQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlsaXN0Vmlld2VyLnJlZnJlc2goYXR0cmlidXRlT3ZlcnJpZGUpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlicmVhazsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl0aGlzLmNvbHVtbkNvbXBvc2l0ZS5kaXNwb3NlKCk7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0VtYmVkZGVkQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0VtYmVkZGVkQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczNGE5YzguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9FbWJlZGRlZENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSUVtYmVkZGVkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkJhc2VKcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBFbWJlZGRlZENvbXBvc2l0ZSBleHRlbmRzIEJhc2VKcGFDb21wb3NpdGUgCi17Ci0JcHJpdmF0ZSBJRW1iZWRkZWQgZW1iZWRkZWQ7Ci0JCi0JcHJpdmF0ZSBFbWJlZGRlZEF0dHJpYnV0ZU92ZXJyaWRlc0NvbXBvc2l0ZSBhdHRyaWJ1dGVPdmVycmlkZXNDb21wb3NpdGU7Ci0KLQlwdWJsaWMgRW1iZWRkZWRDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjaywgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlzdXBlcihwYXJlbnQsIFNXVC5OVUxMLCBjb21tYW5kU3RhY2ssIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCUdyaWREYXRhIGdyaWREYXRhOwotCQkKLQkJdGhpcy5hdHRyaWJ1dGVPdmVycmlkZXNDb21wb3NpdGUgPSBuZXcgRW1iZWRkZWRBdHRyaWJ1dGVPdmVycmlkZXNDb21wb3NpdGUoY29tcG9zaXRlLCB0aGlzLmNvbW1hbmRTdGFjaywgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQl0aGlzLmF0dHJpYnV0ZU92ZXJyaWRlc0NvbXBvc2l0ZS5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIGRvUG9wdWxhdGUoRU9iamVjdCBvYmopIHsKLQkJdGhpcy5lbWJlZGRlZCA9IChJRW1iZWRkZWQpIG9iajsKLQkJdGhpcy5hdHRyaWJ1dGVPdmVycmlkZXNDb21wb3NpdGUucG9wdWxhdGUob2JqKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZG9Qb3B1bGF0ZSgpIHsKLQkJdGhpcy5hdHRyaWJ1dGVPdmVycmlkZXNDb21wb3NpdGUucG9wdWxhdGUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTGlzdGVuZXJzKCkgewotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VMaXN0ZW5lcnMoKSB7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXRoaXMuYXR0cmlidXRlT3ZlcnJpZGVzQ29tcG9zaXRlLmRpc3Bvc2UoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvRW1iZWRkZWRJZENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9FbWJlZGRlZElkQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzMTExMDYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9FbWJlZGRlZElkQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5CYXNlSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgRW1iZWRkZWRJZENvbXBvc2l0ZSBleHRlbmRzIEJhc2VKcGFDb21wb3NpdGUgCi17Ci0JcHVibGljIEVtYmVkZGVkSWRDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjaywgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlzdXBlcihwYXJlbnQsIFNXVC5OVUxMLCBjb21tYW5kU3RhY2ssIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCBkb1BvcHVsYXRlKEVPYmplY3Qgb2JqKSB7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRvUG9wdWxhdGUoKSB7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUxpc3RlbmVycygpIHsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTGlzdGVuZXJzKCkgewotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9FbnRpdHlDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvRW50aXR5Q29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkZGYzYzkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9FbnRpdHlDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JTmFtZWRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JUXVlcnlIaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5KcGFDb3JlTWFwcGluZ3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5JSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQmFzZUpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzLlN0cmluZ1dpdGhEZWZhdWx0Q2hvb3Nlci5TdHJpbmdIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5FeHBhbmRhYmxlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLklXb3JrYmVuY2hIZWxwU3lzdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgRW50aXR5Q29tcG9zaXRlIGV4dGVuZHMgQmFzZUpwYUNvbXBvc2l0ZQotewotCXByaXZhdGUgSUVudGl0eSBlbnRpdHk7Ci0JCi0JcHJpdmF0ZSBFbnRpdHlOYW1lQ29tYm8gZW50aXR5TmFtZUNvbWJvOwotCQotCXByaXZhdGUgVGFibGVDb21wb3NpdGUgdGFibGVDb21wb3NpdGU7Ci0JcHJpdmF0ZSBJbmhlcml0YW5jZUNvbXBvc2l0ZSBpbmhlcml0YW5jZUNvbXBvc2l0ZTsKLQlwcml2YXRlIFNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZSBzZWNvbmRhcnlUYWJsZXNDb21wb3NpdGU7Ci0JcHJpdmF0ZSBPdmVycmlkZXNDb21wb3NpdGUgYXR0cmlidXRlT3ZlcnJpZGVzQ29tcG9zaXRlOwotCQotCXB1YmxpYyBFbnRpdHlDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjaywgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlzdXBlcihwYXJlbnQsIFNXVC5OVUxMLCBjb21tYW5kU3RhY2ssIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQotCQlDb250cm9sIGdlbmVyYWxDb250cm9sID0gYnVpbGRHZW5lcmFsQ29tcG9zaXRlKGNvbXBvc2l0ZSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ2VuZXJhbENvbnRyb2wuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJQ29udHJvbCBhdHRyaWJ1dGVPdmVycmlkZXNDb250cm9sID0gYnVpbGRBdHRyaWJ1dGVPdmVycmlkZXNDb21wb3NpdGUoY29tcG9zaXRlKTsKLQkgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlhdHRyaWJ1dGVPdmVycmlkZXNDb250cm9sLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCUNvbnRyb2wgc2Vjb25kYXJ5VGFibGVzQ29udHJvbCA9IGJ1aWxkU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlKGNvbXBvc2l0ZSk7Ci0JICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJc2Vjb25kYXJ5VGFibGVzQ29udHJvbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCi0JCUNvbnRyb2wgaW5oZXJpdGFuY2VDb250cm9sID0gYnVpbGRJbmhlcml0YW5jZUNvbXBvc2l0ZShjb21wb3NpdGUpOwotCSAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWluaGVyaXRhbmNlQ29udHJvbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQl9Ci0JCi0JcHJpdmF0ZSBDb250cm9sIGJ1aWxkR2VuZXJhbENvbXBvc2l0ZShDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUlXb3JrYmVuY2hIZWxwU3lzdGVtIGhlbHBTeXN0ZW0gPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKTsKLQkJCi0JCUNvbXBvc2l0ZSBnZW5lcmFsQ29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNvbXBvc2l0ZShjb21wb3NpdGUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJZ2VuZXJhbENvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsJCi0JCQkJCi0JCUNvbW1vbldpZGdldHMuYnVpbGRFbnRpdHlOYW1lTGFiZWwoZ2VuZXJhbENvbXBvc2l0ZSwgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQkJCi0JCXRoaXMuZW50aXR5TmFtZUNvbWJvID0gCi0JICAgIAlDb21tb25XaWRnZXRzLmJ1aWxkRW50aXR5TmFtZUNvbWJvKGdlbmVyYWxDb21wb3NpdGUsIHRoaXMuY29tbWFuZFN0YWNrLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCSAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXRoaXMuZW50aXR5TmFtZUNvbWJvLmdldENvbWJvKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWhlbHBTeXN0ZW0uc2V0SGVscChlbnRpdHlOYW1lQ29tYm8uZ2V0Q29tYm8oKSwgSUpwYUhlbHBDb250ZXh0SWRzLkVOVElUWV9OQU1FKTsKLQkJCi0JCQotCQl0aGlzLnRhYmxlQ29tcG9zaXRlID0gbmV3IFRhYmxlQ29tcG9zaXRlKGdlbmVyYWxDb21wb3NpdGUsIHRoaXMuY29tbWFuZFN0YWNrLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCSAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJdGhpcy50YWJsZUNvbXBvc2l0ZS5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQotCQlyZXR1cm4gZ2VuZXJhbENvbXBvc2l0ZTsKLQl9Ci0JCi0JcHJpdmF0ZSBDb250cm9sIGJ1aWxkU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkgICAgU2VjdGlvbiBzZWN0aW9uID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVNlY3Rpb24oY29tcG9zaXRlLCBTV1QuRkxBVCB8IEV4cGFuZGFibGVDb21wb3NpdGUuVFdJU1RJRSB8IEV4cGFuZGFibGVDb21wb3NpdGUuVElUTEVfQkFSKTsKLQkgICAgc2VjdGlvbi5zZXRUZXh0KEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5TZWNvbmRhcnlUYWJsZXNDb21wb3NpdGVfc2Vjb25kYXJ5VGFibGVzKTsKLQotCQlDb21wb3NpdGUgY2xpZW50ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNvbXBvc2l0ZShzZWN0aW9uKTsKLQkJc2VjdGlvbi5zZXRDbGllbnQoY2xpZW50KTsKLQkJCi0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJY2xpZW50LnNldExheW91dChsYXlvdXQpOwotCi0JCXRoaXMuc2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlID0gbmV3IFNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZShjbGllbnQsIHRoaXMuY29tbWFuZFN0YWNrLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQl0aGlzLnNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZS5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQotCQlyZXR1cm4gc2VjdGlvbjsKLQl9Ci0KLQlwcml2YXRlIENvbnRyb2wgYnVpbGRJbmhlcml0YW5jZUNvbXBvc2l0ZShDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JICAgIFNlY3Rpb24gc2VjdGlvbiA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVTZWN0aW9uKGNvbXBvc2l0ZSwgU1dULkZMQVQgfCBFeHBhbmRhYmxlQ29tcG9zaXRlLlRXSVNUSUUgfCBFeHBhbmRhYmxlQ29tcG9zaXRlLlRJVExFX0JBUik7Ci0JICAgIHNlY3Rpb24uc2V0VGV4dChKcHRVaU1hcHBpbmdzTWVzc2FnZXMuRW50aXR5Q29tcG9zaXRlX2luaGVyaXRhbmNlKTsKLQotCQlDb21wb3NpdGUgaW5oZXJpdGFuY2VDbGllbnQgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ29tcG9zaXRlKHNlY3Rpb24pOwotCQlzZWN0aW9uLnNldENsaWVudChpbmhlcml0YW5jZUNsaWVudCk7Ci0JCQotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWluaGVyaXRhbmNlQ2xpZW50LnNldExheW91dChsYXlvdXQpOwotCi0JCXRoaXMuaW5oZXJpdGFuY2VDb21wb3NpdGUgPSBuZXcgSW5oZXJpdGFuY2VDb21wb3NpdGUoaW5oZXJpdGFuY2VDbGllbnQsIHRoaXMuY29tbWFuZFN0YWNrLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQl0aGlzLmluaGVyaXRhbmNlQ29tcG9zaXRlLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCi0JCXJldHVybiBzZWN0aW9uOwotCX0KLQotCXByaXZhdGUgQ29udHJvbCBidWlsZEF0dHJpYnV0ZU92ZXJyaWRlc0NvbXBvc2l0ZShDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JICAgIFNlY3Rpb24gc2VjdGlvbiA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVTZWN0aW9uKGNvbXBvc2l0ZSwgU1dULkZMQVQgfCBFeHBhbmRhYmxlQ29tcG9zaXRlLlRXSVNUSUUgfCBFeHBhbmRhYmxlQ29tcG9zaXRlLlRJVExFX0JBUik7Ci0JICAgIHNlY3Rpb24uc2V0VGV4dChKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQXR0cmlidXRlT3ZlcnJpZGVzQ29tcG9zaXRlX2F0dHJpYnV0ZU92ZXJyaWRlcyk7Ci0JICAgIC8vc2VjdGlvbi5zZXRFeHBhbmRlZCh0cnVlKTsgLy9ub3QgZ29pbmcgdG8gZXhwYW5kIHRoaXMgZm9yIG5vdywgaXQgY2F1c2VzIHRoZSBzY3JvbGwgYmFyIG5vdCB0byBhcHBlYXIKLQkJQ29tcG9zaXRlIGNsaWVudCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDb21wb3NpdGUoc2VjdGlvbik7Ci0JCXNlY3Rpb24uc2V0Q2xpZW50KGNsaWVudCk7Ci0JCQotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNsaWVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQl0aGlzLmF0dHJpYnV0ZU92ZXJyaWRlc0NvbXBvc2l0ZSA9IG5ldyBPdmVycmlkZXNDb21wb3NpdGUoY2xpZW50LCB0aGlzLmNvbW1hbmRTdGFjaywgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJdGhpcy5hdHRyaWJ1dGVPdmVycmlkZXNDb21wb3NpdGUuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkKLQkJcmV0dXJuIHNlY3Rpb247Ci0JfQotCi0JLy9UT0RPIHRhbGsgdG8gSmF2YUVkaXRvciBwZW9wbGUgYWJvdXQgd2hhdCB3ZSBjYW4gZG8gdG8gaG9vayBpbiBUYWJiZWRQcm9wZXJ0aWVzIGZvciB0aGUgSmF2YUVkaXRvcgotCQotCXB1YmxpYyB2b2lkIGRvUG9wdWxhdGUoRU9iamVjdCBvYmopIHsKLQkJdGhpcy5lbnRpdHkgPSAoSUVudGl0eSkgb2JqOwotCQl0aGlzLmVudGl0eU5hbWVDb21iby5wb3B1bGF0ZShvYmopOwotCQl0aGlzLmF0dHJpYnV0ZU92ZXJyaWRlc0NvbXBvc2l0ZS5wb3B1bGF0ZShvYmopOwotCQl0aGlzLnNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZS5wb3B1bGF0ZShvYmopOwotCQl0aGlzLmluaGVyaXRhbmNlQ29tcG9zaXRlLnBvcHVsYXRlKG9iaik7Ci0JCWlmICh0aGlzLmVudGl0eSAhPSBudWxsKSB7Ci0JCQl0aGlzLnRhYmxlQ29tcG9zaXRlLnBvcHVsYXRlKHRoaXMuZW50aXR5LmdldFRhYmxlKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy50YWJsZUNvbXBvc2l0ZS5wb3B1bGF0ZShudWxsKTsJCQkJCQotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRvUG9wdWxhdGUoKSB7Ci0JCXRoaXMuZW50aXR5TmFtZUNvbWJvLnBvcHVsYXRlKCk7Ci0JCXRoaXMudGFibGVDb21wb3NpdGUucG9wdWxhdGUoKTsKLQkJdGhpcy5hdHRyaWJ1dGVPdmVycmlkZXNDb21wb3NpdGUucG9wdWxhdGUoKTsKLQkJdGhpcy5zZWNvbmRhcnlUYWJsZXNDb21wb3NpdGUucG9wdWxhdGUoKTsKLQkJdGhpcy5pbmhlcml0YW5jZUNvbXBvc2l0ZS5wb3B1bGF0ZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VMaXN0ZW5lcnMoKSB7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZUxpc3RlbmVycygpIHsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJdGhpcy5lbnRpdHlOYW1lQ29tYm8uZGlzcG9zZSgpOwotCQl0aGlzLnRhYmxlQ29tcG9zaXRlLmRpc3Bvc2UoKTsKLQkJdGhpcy5hdHRyaWJ1dGVPdmVycmlkZXNDb21wb3NpdGUuZGlzcG9zZSgpOwotCQl0aGlzLnNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZS5kaXNwb3NlKCk7Ci0JCXRoaXMuaW5oZXJpdGFuY2VDb21wb3NpdGUuZGlzcG9zZSgpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBJRW50aXR5IGdldEVudGl0eSgpIHsKLQkJcmV0dXJuIHRoaXMuZW50aXR5OwotCX0KLQkKLQkKLQlwcml2YXRlIGFic3RyYWN0IGNsYXNzIFRhYmxlSG9sZGVyIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBTdHJpbmdIb2xkZXIgewotCQlwcml2YXRlIElUYWJsZSB0YWJsZTsKLQkJCi0JCVRhYmxlSG9sZGVyKElUYWJsZSB0YWJsZSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMudGFibGUgPSB0YWJsZTsKLQkJfQotCQkKLQkJcHVibGljIENsYXNzIGZlYXR1cmVDbGFzcygpIHsKLQkJCXJldHVybiBJVGFibGUuY2xhc3M7Ci0JCX0KLQkJCi0JCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzRGVmYXVsdCgpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlwdWJsaWMgRU9iamVjdCB3cmFwcGVkT2JqZWN0KCkgewotCQkJcmV0dXJuIHRoaXMudGFibGU7Ci0JCX0KLQkJCi0JCXB1YmxpYyBJVGFibGUgZ2V0VGFibGUoKSB7Ci0JCQlyZXR1cm4gdGhpcy50YWJsZTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIGNsYXNzIFRhYmxlTmFtZUhvbGRlciBleHRlbmRzIFRhYmxlSG9sZGVyIGltcGxlbWVudHMgU3RyaW5nSG9sZGVyIHsKLQkJCi0JCVRhYmxlTmFtZUhvbGRlcihJVGFibGUgdGFibGUpIHsKLQkJCXN1cGVyKHRhYmxlKTsKLQkJfQotCQkJCi0JCXB1YmxpYyBpbnQgZmVhdHVyZUlkKCkgewotCQkJcmV0dXJuIEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSVRBQkxFX19TUEVDSUZJRURfTkFNRTsKLQkJfQotCQkKLQkJcHVibGljIGludCBkZWZhdWx0RmVhdHVyZUlkKCkgewotCQkJcmV0dXJuIEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSVRBQkxFX19ERUZBVUxUX05BTUU7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZGVmYXVsdEl0ZW0oKSB7Ci0JCQlTdHJpbmcgZGVmYXVsdE5hbWUgPSBnZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCk7Ci0JCQlpZiAoZGVmYXVsdE5hbWUgIT0gbnVsbCkgewotCQkJCXJldHVybiBOTFMuYmluZChKcHRVaU1hcHBpbmdzTWVzc2FnZXMuRW50aXR5Q29tcG9zaXRlX3RhYmxlRGVmYXVsdCwgZGVmYXVsdE5hbWUpOwotCQkJfQotCQkJcmV0dXJuIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5FbnRpdHlDb21wb3NpdGVfdGFibGVOb0RlZmF1bHRTcGVjaWZpZWQ7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKCkgewotCQkJcmV0dXJuIGdldFRhYmxlKCkuZ2V0U3BlY2lmaWVkTmFtZSgpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXRTdHJpbmcoU3RyaW5nIG5ld05hbWUpIHsKLQkJCWdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZShuZXdOYW1lKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIGNsYXNzIFRhYmxlQ2F0YWxvZ0hvbGRlciBleHRlbmRzIFRhYmxlSG9sZGVyIGltcGxlbWVudHMgU3RyaW5nSG9sZGVyIHsKLQkJCi0JCVRhYmxlQ2F0YWxvZ0hvbGRlcihJVGFibGUgdGFibGUpIHsKLQkJCXN1cGVyKHRhYmxlKTsKLQkJfQotCQkJCi0JCXB1YmxpYyBpbnQgZmVhdHVyZUlkKCkgewotCQkJcmV0dXJuIEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSVRBQkxFX19TUEVDSUZJRURfQ0FUQUxPRzsKLQkJfQotCQkKLQkJcHVibGljIGludCBkZWZhdWx0RmVhdHVyZUlkKCkgewotCQkJcmV0dXJuIEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSVRBQkxFX19ERUZBVUxUX0NBVEFMT0c7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZGVmYXVsdEl0ZW0oKSB7Ci0JCQlTdHJpbmcgZGVmYXVsdENhdGFsb2cgPSBnZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCk7Ci0JCQlpZiAoZGVmYXVsdENhdGFsb2cgIT0gbnVsbCkgewotCQkJCXJldHVybiBOTFMuYmluZChKcHRVaU1hcHBpbmdzTWVzc2FnZXMuRW50aXR5Q29tcG9zaXRlX3RhYmxlRGVmYXVsdCwgZGVmYXVsdENhdGFsb2cpOwotCQkJfQotCQkJcmV0dXJuIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5FbnRpdHlDb21wb3NpdGVfdGFibGVOb0RlZmF1bHRTcGVjaWZpZWQ7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKCkgewotCQkJcmV0dXJuIGdldFRhYmxlKCkuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXRTdHJpbmcoU3RyaW5nIG5ld05hbWUpIHsKLQkJCWdldFRhYmxlKCkuc2V0U3BlY2lmaWVkQ2F0YWxvZyhuZXdOYW1lKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIGNsYXNzIFRhYmxlU2NoZW1hSG9sZGVyIGV4dGVuZHMgVGFibGVIb2xkZXIgaW1wbGVtZW50cyBTdHJpbmdIb2xkZXIgewotCQkKLQkJVGFibGVTY2hlbWFIb2xkZXIoSVRhYmxlIHRhYmxlKSB7Ci0JCQlzdXBlcih0YWJsZSk7Ci0JCX0KLQkJCQotCQlwdWJsaWMgaW50IGZlYXR1cmVJZCgpIHsKLQkJCXJldHVybiBKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLklUQUJMRV9fU1BFQ0lGSUVEX1NDSEVNQTsKLQkJfQotCQkKLQkJcHVibGljIGludCBkZWZhdWx0RmVhdHVyZUlkKCkgewotCQkJcmV0dXJuIEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSVRBQkxFX19ERUZBVUxUX1NDSEVNQTsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBkZWZhdWx0SXRlbSgpIHsKLQkJCVN0cmluZyBkZWZhdWx0U2NoZW1hID0gZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCk7Ci0JCQlpZiAoZGVmYXVsdFNjaGVtYSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIE5MUy5iaW5kKEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5FbnRpdHlDb21wb3NpdGVfdGFibGVEZWZhdWx0LCBkZWZhdWx0U2NoZW1hKTsKLQkJCX0KLQkJCXJldHVybiBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuRW50aXR5Q29tcG9zaXRlX3RhYmxlTm9EZWZhdWx0U3BlY2lmaWVkOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZygpIHsKLQkJCXJldHVybiBnZXRUYWJsZSgpLmdldFNwZWNpZmllZFNjaGVtYSgpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXRTdHJpbmcoU3RyaW5nIG5ld05hbWUpIHsKLQkJCWdldFRhYmxlKCkuc2V0U3BlY2lmaWVkU2NoZW1hKG5ld05hbWUpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0VudGl0eU5hbWVDb21iby5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9FbnRpdHlOYW1lQ29tYm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZlMGZmYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0VudGl0eU5hbWVDb21iby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLkpwYUNvcmVNYXBwaW5nc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQmFzZUpwYUNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci0KLS8vIFRPRE8gZ2V0IERlZmF1bHQgdXBkYXRpbmcgYXBwcm9wcmlhdGVseSBiYXNlZCBvbiBFbnRpdHkgbmFtZSBkZWZhdWx0Ci0JCi1wdWJsaWMgY2xhc3MgRW50aXR5TmFtZUNvbWJvIGV4dGVuZHMgQmFzZUpwYUNvbnRyb2xsZXIKLXsKLQlwcml2YXRlIElFbnRpdHkgZW50aXR5OwotCXByaXZhdGUgQWRhcHRlciBlbnRpdHlMaXN0ZW5lcjsKLQkKLQlwcml2YXRlIENDb21ibyBjb21ibzsKLQkKLQkKLQlwdWJsaWMgRW50aXR5TmFtZUNvbWJvKENvbXBvc2l0ZSBwYXJlbnQsIENvbW1hbmRTdGFjayBjb21tYW5kU3RhY2ssIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJc3VwZXIocGFyZW50LCBjb21tYW5kU3RhY2ssIHdpZGdldEZhY3RvcnkpOwotCQlidWlsZEVudGl0eUxpc3RlbmVyKCk7Ci0JfQotCQotCQotCXByaXZhdGUgdm9pZCBidWlsZEVudGl0eUxpc3RlbmVyKCkgewotCQllbnRpdHlMaXN0ZW5lciA9IG5ldyBBZGFwdGVySW1wbCgpIHsKLQkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkJCWVudGl0eUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYnVpbGRXaWRnZXQoQ29tcG9zaXRlIHBhcmVudCkgewotCQljb21ibyA9IHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVDQ29tYm8ocGFyZW50LCBTV1QuRkxBVCk7Ci0JCWNvbWJvLmFkZE1vZGlmeUxpc3RlbmVyKAotCQkJbmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCQljb21ib01vZGlmaWVkKGUpOwotCQkJCX0KLQkJCX0pOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY29tYm9Nb2RpZmllZChNb2RpZnlFdmVudCBlKSB7Ci0JCWlmIChpc1BvcHVsYXRpbmcoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlTdHJpbmcgdGV4dCA9ICgoQ0NvbWJvKSBlLmdldFNvdXJjZSgpKS5nZXRUZXh0KCk7Ci0JCWlmICh0ZXh0LmVxdWFscyhjb21iby5nZXRJdGVtKDApKSkgewotCQkJdGV4dCA9IG51bGw7Ci0JCX0KLQkJCi0JCWVudGl0eS5zZXRTcGVjaWZpZWROYW1lKHRleHQpOwotCQkKLQkJLy8gVE9ETyBEb2VzIHRoaXMgbmVlZCB0byBiZSBkb25lPwotCQkvL3RoaXMuZWRpdGluZ0RvbWFpbi5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKFNldENvbW1hbmQuY3JlYXRlKHRoaXMuZWRpdGluZ0RvbWFpbiwgdGhpcy5lbnRpdHksIE1hcHBpbmdzUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RW50aXR5X1NwZWNpZmllZE5hbWUoKSwgdGV4dCkpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgZW50aXR5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChJRW50aXR5LmNsYXNzKSkgewotCQkJY2FzZSBKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLklFTlRJVFlfX1NQRUNJRklFRF9OQU1FIDoKLQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMoCi0JCQkJCW5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQlwb3B1bGF0ZSgpOwotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JRU5USVRZX19ERUZBVUxUX05BTUUgOgotCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYygKLQkJCQkJbmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCXBvcHVsYXRlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCWJyZWFrOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUxpc3RlbmVycygpIHsKLQkJaWYgKGVudGl0eSAhPSBudWxsKSB7Ci0JCQllbnRpdHkuZUFkYXB0ZXJzKCkuYWRkKGVudGl0eUxpc3RlbmVyKTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VMaXN0ZW5lcnMoKSB7Ci0JCWlmIChlbnRpdHkgIT0gbnVsbCkgewotCQkJZW50aXR5LmVBZGFwdGVycygpLnJlbW92ZShlbnRpdHlMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZG9Qb3B1bGF0ZShFT2JqZWN0IG9iaikgewotCQllbnRpdHkgPSAoSUVudGl0eSkgb2JqOwotCQlwb3B1bGF0ZUNvbWJvKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvUG9wdWxhdGUoKSB7Ci0JCXBvcHVsYXRlQ29tYm8oKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlQ29tYm8oKSB7Ci0JCWlmIChlbnRpdHkgPT0gbnVsbCkgewotCQkJY29tYm8uY2xlYXJTZWxlY3Rpb24oKTsKLQkJCWNvbWJvLnNldEl0ZW1zKG5ldyBTdHJpbmdbXSB7fSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCVN0cmluZyBkZWZhdWx0SXRlbSA9IE5MUy5iaW5kKEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5FbnRpdHlHZW5lcmFsU2VjdGlvbl9uYW1lRGVmYXVsdFdpdGhPbmVQYXJhbSwgZW50aXR5LmdldERlZmF1bHROYW1lKCkpOwotCQlTdHJpbmcgc3BlY2lmaWVkTmFtZSA9IGVudGl0eS5nZXRTcGVjaWZpZWROYW1lKCk7Ci0JCQotCQlpZiAoc3BlY2lmaWVkTmFtZSA9PSBudWxsKSB7Ci0JCQlzZXRDb21ib0RhdGEoZGVmYXVsdEl0ZW0sIG5ldyBTdHJpbmdbXSB7ZGVmYXVsdEl0ZW19KTsKLQkJfQotCQllbHNlIHsKLQkJCXNldENvbWJvRGF0YShzcGVjaWZpZWROYW1lLCBuZXcgU3RyaW5nW10ge2RlZmF1bHRJdGVtfSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldENvbWJvRGF0YShTdHJpbmcgdGV4dCwgU3RyaW5nW10gaXRlbXMpIHsKLQkJaWYgKCEgQXJyYXlzLmVxdWFscyhpdGVtcywgY29tYm8uZ2V0SXRlbXMoKSkpIHsKLQkJCWNvbWJvLnNldEl0ZW1zKGl0ZW1zKTsKLQkJfQotCQkKLQkJaWYgKCEgdGV4dC5lcXVhbHMoY29tYm8uZ2V0VGV4dCgpKSkgewotCQkJY29tYm8uc2V0VGV4dCh0ZXh0KTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgQ0NvbWJvIGdldENvbWJvKCkgewotCQlyZXR1cm4gY29tYm87Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKSB7Ci0JCXJldHVybiBnZXRDb21ibygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvRW51bUNvbWJvVmlld2VyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0VudW1Db21ib1ZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2Y2YjYxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvRW51bUNvbWJvVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLkluaGVyaXRhbmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5CYXNlSnBhQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkNDb21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBFbnVtQ29tYm9WaWV3ZXIgZXh0ZW5kcyBCYXNlSnBhQ29udHJvbGxlcgotewotCXByaXZhdGUgRW51bUhvbGRlciBlbnVtSG9sZGVyOwotCXByaXZhdGUgQWRhcHRlciBlbnVtTGlzdGVuZXI7Ci0JCi0JcHJpdmF0ZSBDQ29tYm9WaWV3ZXIgY29tYm9WaWV3ZXI7Ci0KLQotCXB1YmxpYyBFbnVtQ29tYm9WaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgQ29tbWFuZFN0YWNrIHRoZUNvbW1hbmRTdGFjaywgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlzdXBlcihwYXJlbnQsIHRoZUNvbW1hbmRTdGFjaywgd2lkZ2V0RmFjdG9yeSk7Ci0JCWJ1aWxkTGlzdGVuZXIoKTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkTGlzdGVuZXIoKSB7Ci0JCXRoaXMuZW51bUxpc3RlbmVyID0gbmV3IEFkYXB0ZXJJbXBsKCkgewotCQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCQkJbW9kZWxDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGJ1aWxkV2lkZ2V0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ0NvbWJvIGNvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhwYXJlbnQpOwotCQl0aGlzLmNvbWJvVmlld2VyID0gbmV3IENDb21ib1ZpZXdlcihjb21ibyk7Ci0JCXRoaXMuY29tYm9WaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihidWlsZExhYmVsUHJvdmlkZXIoKSk7Ci0JCXRoaXMuY29tYm9WaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlFbnVtQ29tYm9WaWV3ZXIudGhpcy5zZWxlY3Rpb25DaGFuZ2VkKGV2ZW50LmdldFNlbGVjdGlvbigpKTsKLQkJCX0KLQkJfSk7Ci0JfQotCXByb3RlY3RlZCBJQmFzZUxhYmVsUHJvdmlkZXIgYnVpbGRMYWJlbFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCWlmIChlbGVtZW50ID09IGVudW1Ib2xkZXIuZGVmYXVsdFZhbHVlKCkpIHsKLQkJCQkJcmV0dXJuIE5MUy5iaW5kKEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5FbnVtQ29tYm9WaWV3ZXJfZGVmYXVsdCwgZW51bUhvbGRlci5kZWZhdWx0U3RyaW5nKCkpOwotCQkJCX0KLQkJCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChlbGVtZW50KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQl2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSVNlbGVjdGlvbiBzZWwpIHsKLQkJaWYgKHNlbCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlPYmplY3Qgc2VsZWN0aW9uID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCWlmICggISB0aGlzLmVudW1Ib2xkZXIuZ2V0KCkuZXF1YWxzKHNlbGVjdGlvbikpIHsKLQkJCQl0aGlzLmVudW1Ib2xkZXIuc2V0KHNlbGVjdGlvbik7Ci0vLwkJCQl0aGlzLmVkaXRpbmdEb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZSgKLS8vCQkJCQlTZXRDb21tYW5kLmNyZWF0ZSgKLS8vCQkJCQkJdGhpcy5lZGl0aW5nRG9tYWluLAotLy8JCQkJCQl0aGlzLmJhc2ljTWFwcGluZywKLS8vCQkJCQkJT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QmFzaWNNYXBwaW5nX09wdGlvbmFsKCksCi0vLwkJCQkJCW9wdGlvbmFsCi0vLwkJCQkJKQotLy8JCQkJKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBtb2RlbENoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlpZiAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRCh0aGlzLmVudW1Ib2xkZXIuZmVhdHVyZUNsYXNzKCkpID09IAotCQkJCXRoaXMuZW51bUhvbGRlci5mZWF0dXJlSWQoKSkgewotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKAotCQkJCW5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJcG9wdWxhdGUoKTsKLQkJCQkJfQotCQkJCX0pOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUxpc3RlbmVycygpIHsKLQkJaWYgKHRoaXMuZW51bUhvbGRlciAhPSBudWxsICYmIHRoaXMuZW51bUhvbGRlci53cmFwcGVkT2JqZWN0KCkgIT0gbnVsbCkgewotCQkJdGhpcy5lbnVtSG9sZGVyLndyYXBwZWRPYmplY3QoKS5lQWRhcHRlcnMoKS5hZGQodGhpcy5lbnVtTGlzdGVuZXIpOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZUxpc3RlbmVycygpIHsKLQkJaWYgKHRoaXMuZW51bUhvbGRlciAhPSBudWxsICYmIHRoaXMuZW51bUhvbGRlci53cmFwcGVkT2JqZWN0KCkgIT0gbnVsbCkgewotCQkJdGhpcy5lbnVtSG9sZGVyLndyYXBwZWRPYmplY3QoKS5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcy5lbnVtTGlzdGVuZXIpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBmaW5hbCB2b2lkIHBvcHVsYXRlKEVudW1Ib2xkZXIgZW51bUhvbGRlcikgewotCQlzdXBlci5wb3B1bGF0ZShlbnVtSG9sZGVyKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZG9Qb3B1bGF0ZShFT2JqZWN0IG9iaikgewotCQl0aGlzLmVudW1Ib2xkZXIgPSAoRW51bUhvbGRlcikgb2JqOwotCQlwb3B1bGF0ZUNvbWJvKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvUG9wdWxhdGUoKSB7Ci0JCXBvcHVsYXRlQ29tYm8oKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlQ29tYm8oKSB7Ci0JCXRoaXMuY29tYm9WaWV3ZXIuZ2V0Q29tYm8oKS5yZW1vdmVBbGwoKTsKLQkJaWYgKHRoaXMuZW51bUhvbGRlci53cmFwcGVkT2JqZWN0KCkgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQl0aGlzLmNvbWJvVmlld2VyLmFkZCh0aGlzLmVudW1Ib2xkZXIuZW51bVZhbHVlcygpKTsKLQkJCi0JCU9iamVjdCBtb2RlbFNldHRpbmcgPSB0aGlzLmVudW1Ib2xkZXIuZ2V0KCk7Ci0JCQotCQlpZiAoKChJU3RydWN0dXJlZFNlbGVjdGlvbikgdGhpcy5jb21ib1ZpZXdlci5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCkgIT0gbW9kZWxTZXR0aW5nKSB7Ci0JCQl0aGlzLmNvbWJvVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihtb2RlbFNldHRpbmcpKTsKLQkJfQotCX0KLQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKSB7Ci0JCXJldHVybiB0aGlzLmNvbWJvVmlld2VyLmdldENvbWJvKCk7Ci0JfQotCQotCQotCS8qKgotCSAqIEFuIGludGVyZmFjZSB0byB3cmFwIGFuIG9iamVjdCB0aGF0IHN1cHBvcnRzIGFjY2Vzc1R5cGUKLQkgKiBBbiBvYmplY3Qgb2YgdGhpcyB0eXBlIG11c3QgYmUgcGFzc2VkIGluIHRvIHBvcHVsYXRlKEVPYmplY3QpCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgRW51bUhvbGRlciBleHRlbmRzIEVPYmplY3QgewotCQkvKioKLQkJICogUmV0dXJuIHRoZSBudW0gc2V0dGluZyBmcm9tIHRoZSB3cmFwcGVkIG9iamVjdAotCQkgKiBAcmV0dXJuCi0JCSAqLwotCQlPYmplY3QgZ2V0KCk7Ci0JCQotCQkvKioKLQkJICogU2V0IHRoZSBlbnVtIHNldHRpbmcgb24gdGhlIHdyYXBwZWQgb2JqZWN0Ci0JCSAqIEBwYXJhbSBmZXRjaAotCQkgKi8KLQkJdm9pZCBzZXQoT2JqZWN0IGVudW1TZXR0aW5nKTsKLQkJCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIENsYXNzIG9mIHRoZSB3cmFwcGVkIG9iamVjdAotCQkgKiBAcmV0dXJuCi0JCSAqLwotCQlDbGFzcyBmZWF0dXJlQ2xhc3MoKTsKLQkJCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIGZlYXR1cmUgaWQgb2YgZW51bSBzZXR0aW5nIG9uIHRoZSB3cmFwcGVkIG9iamVjdAotCQkgKiBAcmV0dXJuCi0JCSAqLwotCQlpbnQgZmVhdHVyZUlkKCk7Ci0JCQotCQkvKioKLQkJICogVGhlIHdyYXBwZWQgRU9iamVjdCB0aGF0IHRoZSBlbnVtIHNldHRpbmcgaXMgc3RvcmVkIG9uCi0JCSAqIEByZXR1cm4KLQkJICovCi0JCUVPYmplY3Qgd3JhcHBlZE9iamVjdCgpOwotCQkKLQkJT2JqZWN0W10gZW51bVZhbHVlcygpOwotCQkKLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgRGVmYXVsdCBFbnVtZXJhdG9yIG9iamVjdAotCQkgKi8KLQkJT2JqZWN0IGRlZmF1bHRWYWx1ZSgpOwotCQkKLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgU3RyaW5nIHRvIGJlIGRpc3BsYXllZCB0byB0aGUgdXNlcgotCQkgKiBEZWFmdWx0IChbZGVmYXVsdFN0cmluZygpXSkKLQkJICovCi0JCVN0cmluZyBkZWZhdWx0U3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9HZW5lcmF0ZWRWYWx1ZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9HZW5lcmF0ZWRWYWx1ZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTNjNWY3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvR2VuZXJhdGVkVmFsdWVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5HZW5lcmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JR2VuZXJhdGVkVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSUlkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLkluaGVyaXRhbmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5KcGFDb3JlTWFwcGluZ3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnBsYXRmb3JtLklHZW5lcmF0b3JSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnBsYXRmb3JtLk51bGxHZW5lcmF0b3JSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5JSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQmFzZUpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkNDb21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5JV29ya2JlbmNoSGVscFN5c3RlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLQotcHVibGljIGNsYXNzIEdlbmVyYXRlZFZhbHVlQ29tcG9zaXRlIGV4dGVuZHMgQmFzZUpwYUNvbXBvc2l0ZQotewotCXByaXZhdGUgSUlkIGlkOwotCXByaXZhdGUgSUdlbmVyYXRlZFZhbHVlIGdlbmVyYXRlZFZhbHVlOwotCXByaXZhdGUgQWRhcHRlciBnZW5lcmF0ZWRWYWx1ZUxpc3RlbmVyOwotCi0JcHJpdmF0ZSBDQ29tYm9WaWV3ZXIgc3RyYXRlZ3lDb21ib1ZpZXdlcjsKLQotCXByaXZhdGUgQ0NvbWJvIGdlbmVyYXRvck5hbWVDb21ibzsKLQotCXByb3RlY3RlZCBib29sZWFuIHBvcHVsYXRpbmc7Ci0KLQlwdWJsaWMgR2VuZXJhdGVkVmFsdWVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjaywgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlzdXBlcihwYXJlbnQsIFNXVC5OVUxMLCBjb21tYW5kU3RhY2ssIHdpZGdldEZhY3RvcnkpOwotCQl0aGlzLmdlbmVyYXRlZFZhbHVlTGlzdGVuZXIgPSBidWlsZEdlbmVyYXRlZFZhbHVlTGlzdGVuZXIoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBBZGFwdGVyIGJ1aWxkR2VuZXJhdGVkVmFsdWVMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBBZGFwdGVySW1wbCgpIHsKLQkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkJCWdlbmVyYXRlZFZhbHVlQ2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJfQotCQl9OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCi0JCUlXb3JrYmVuY2hIZWxwU3lzdGVtIGhlbHBTeXN0ZW0gPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKTsKLQkJCi0JCWdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVMYWJlbChjb21wb3NpdGUsIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5HZW5lcmF0ZWRWYWx1ZUNvbXBvc2l0ZV9zdHJhdGVneSk7Ci0JCQotCQl0aGlzLnN0cmF0ZWd5Q29tYm9WaWV3ZXIgPSBidWlsZFN0cmF0ZWd5Q29tYm9WaWV3ZXIoY29tcG9zaXRlKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQl0aGlzLnN0cmF0ZWd5Q29tYm9WaWV3ZXIuZ2V0Q29tYm8oKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJaGVscFN5c3RlbS5zZXRIZWxwKHRoaXMuc3RyYXRlZ3lDb21ib1ZpZXdlci5nZXRDb21ibygpLCBJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19HRU5FUkFURURfVkFMVUVfU1RSQVRFR1kpOwotCQkKLQkJZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkdlbmVyYXRlZFZhbHVlQ29tcG9zaXRlX2dlbmVyYXRvck5hbWUpOwotCQkKLQkJdGhpcy5nZW5lcmF0b3JOYW1lQ29tYm8gPSBidWlsZEdlbmVyYXRvck5hbWVDb21ibyhjb21wb3NpdGUpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXRoaXMuZ2VuZXJhdG9yTmFtZUNvbWJvLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQloZWxwU3lzdGVtLnNldEhlbHAodGhpcy5nZW5lcmF0b3JOYW1lQ29tYm8sIElKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX0dFTkVSQVRFRF9WQUxVRV9HRU5FUkFUT1JfTkFNRSk7Ci0JCQotCQkvLyBUT0RPCi0JCS8vIGJ1aWxkR2VuZXJhdG9yTmFtZVNlbGVjdGlvbkJ1dHRvbiggdGhpcyk7Ci0JfQotCi0JcHJpdmF0ZSBDQ29tYm9WaWV3ZXIgYnVpbGRTdHJhdGVneUNvbWJvVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ0NvbWJvIGNvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhwYXJlbnQpOwotCQlDQ29tYm9WaWV3ZXIgdmlld2VyID0gbmV3IENDb21ib1ZpZXdlcihjb21ibyk7Ci0JCXZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGJ1aWxkU3RyYXRlZ3lMYWJlbFByb3ZpZGVyKCkpOwotCQl2aWV3ZXIuYWRkKEdlbmVyYXRpb25UeXBlLlZBTFVFUy50b0FycmF5KCkpOwotCQl2aWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAocG9wdWxhdGluZykgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWlmIChldmVudC5nZXRTZWxlY3Rpb24oKSBpbnN0YW5jZW9mIFN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCQkJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCUdlbmVyYXRpb25UeXBlIHNlbGVjdGVkVHlwZSA9IChHZW5lcmF0aW9uVHlwZSkgc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCQlpZiAoZ2VuZXJhdGVkVmFsdWUgPT0gbnVsbCkgewotCQkJCQkJY3JlYXRlR2VuZXJhdGVkVmFsdWUoKTsKLQkJCQkJfQotCQkJCQlpZiAoIWdlbmVyYXRlZFZhbHVlLmdldFN0cmF0ZWd5KCkuZXF1YWxzKHNlbGVjdGVkVHlwZSkpIHsKLQkJCQkJCWdlbmVyYXRlZFZhbHVlLnNldFN0cmF0ZWd5KHNlbGVjdGVkVHlwZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gdmlld2VyOwotCX0KLQkKLQlwcml2YXRlIElCYXNlTGFiZWxQcm92aWRlciBidWlsZFN0cmF0ZWd5TGFiZWxQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlpZiAoZWxlbWVudCA9PSBHZW5lcmF0aW9uVHlwZS5ERUZBVUxUKSB7Ci0JCQkJCS8vVE9ETyBuZWVkIHRvIG1vdmUgdGhpcyB0byB0aGUgbW9kZWwsIGRvbid0IHdhbnQgaGFyZGNvZGVkIFN0cmluZwotCQkJCQlyZXR1cm4gTkxTLmJpbmQoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkdlbmVyYXRlZFZhbHVlQ29tcG9zaXRlX2RlZmF1bHQsICJBdXRvIik7Ci0JCQkJfQotCQkJCXJldHVybiBzdXBlci5nZXRUZXh0KGVsZW1lbnQpOwotCQkJfQotCQl9OwotCX0KLQkKLQotCXByb3RlY3RlZCBDQ29tYm8gYnVpbGRHZW5lcmF0b3JOYW1lQ29tYm8oQ29tcG9zaXRlIHBhcmVudCkgewotCQlDQ29tYm8gY29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKHBhcmVudCwgU1dULkZMQVQpOwotCQljb21iby5hZGQoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlRhYmxlQ29tcG9zaXRlX2RlZmF1bHRFbXB0eSk7Ci0JCWNvbWJvLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCWlmIChpc1BvcHVsYXRpbmcoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBnZW5lcmF0b3JOYW1lID0gKChDQ29tYm8pIGUuZ2V0U291cmNlKCkpLmdldFRleHQoKTsKLQkJCQkKLQkJCQlpZiAoZ2VuZXJhdG9yTmFtZS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKGdlbmVyYXRlZFZhbHVlLmdldEdlbmVyYXRvcigpID09IG51bGwgfHwgZ2VuZXJhdGVkVmFsdWUuZ2V0R2VuZXJhdG9yKCkuZXF1YWxzKCIiKSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCWdlbmVyYXRvck5hbWUgPSBudWxsOwotCQkJCX0KLQkJCQlpZiAoZ2VuZXJhdGVkVmFsdWUgPT0gbnVsbCkgewotCQkJCQljcmVhdGVHZW5lcmF0ZWRWYWx1ZSgpOwotCQkJCX0KLQkJCQlnZW5lcmF0ZWRWYWx1ZS5zZXRHZW5lcmF0b3IoZ2VuZXJhdG9yTmFtZSk7Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gY29tYm87Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUdlbmVyYXRlZFZhbHVlKCkgewotCQlJR2VuZXJhdGVkVmFsdWUgZ2VuZXJhdGVkVmFsdWUgPSB0aGlzLmlkLmNyZWF0ZUdlbmVyYXRlZFZhbHVlKCk7Ci0JCXRoaXMuaWQuc2V0R2VuZXJhdGVkVmFsdWUoZ2VuZXJhdGVkVmFsdWUpOwotCX0KLQkKLQotCXByb3RlY3RlZCB2b2lkIGdlbmVyYXRlZFZhbHVlQ2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCWlmIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKElHZW5lcmF0ZWRWYWx1ZS5jbGFzcykgPT0gSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JR0VORVJBVEVEX1ZBTFVFX19TVFJBVEVHWSkgewotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChnZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJaWYgKHNlbGVjdGVkU3RyYXRlZ3koKSAhPSBnZW5lcmF0ZWRWYWx1ZS5nZXRTdHJhdGVneSgpKSB7Ci0JCQkJCQlzdHJhdGVneUNvbWJvVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihnZW5lcmF0ZWRWYWx1ZS5nZXRTdHJhdGVneSgpKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQllbHNlIGlmIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKElHZW5lcmF0ZWRWYWx1ZS5jbGFzcykgPT0gSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JR0VORVJBVEVEX1ZBTFVFX19HRU5FUkFUT1IpIHsKLQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCXBvcHVsYXRlR2VuZXJhdG9yTmFtZSgpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9Qb3B1bGF0ZShFT2JqZWN0IG9iaikgewotCQl0aGlzLmlkID0gKElJZCkgb2JqOwotCQlpZiAodGhpcy5pZCA9PSBudWxsKSB7Ci0JCQl0aGlzLmdlbmVyYXRlZFZhbHVlPSBudWxsOwotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5nZW5lcmF0ZWRWYWx1ZSA9IHRoaXMuaWQuZ2V0R2VuZXJhdGVkVmFsdWUoKTsKLQkJfQotCQlpZiAodGhpcy5nZW5lcmF0ZWRWYWx1ZSA9PSBudWxsKSB7Ci0JCQl0aGlzLnN0cmF0ZWd5Q29tYm9WaWV3ZXIuZ2V0Q29tYm8oKS5kZXNlbGVjdEFsbCgpOwotCQkJdGhpcy5nZW5lcmF0b3JOYW1lQ29tYm8uc2V0VGV4dCgiIik7Ci0JCQl0aGlzLnBvcHVsYXRpbmcgPSBmYWxzZTsKLQkJCXJldHVybjsKLQkJfQotCQlwb3B1bGF0ZVN0cmF0ZWd5Q29tYm8oKTsKLQkJcG9wdWxhdGVHZW5lcmF0b3JOYW1lQ29tYm8oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb1BvcHVsYXRlKCkgewotCQkKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTGlzdGVuZXJzKCkgewotCQlpZiAodGhpcy5nZW5lcmF0ZWRWYWx1ZSAhPSBudWxsKSB7Ci0JCQl0aGlzLmdlbmVyYXRlZFZhbHVlLmVBZGFwdGVycygpLmFkZCh0aGlzLmdlbmVyYXRlZFZhbHVlTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTGlzdGVuZXJzKCkgewotCQlpZiAodGhpcy5nZW5lcmF0ZWRWYWx1ZSAhPSBudWxsKSB7Ci0JCQl0aGlzLmdlbmVyYXRlZFZhbHVlLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzLmdlbmVyYXRlZFZhbHVlTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJR2VuZXJhdG9yUmVwb3NpdG9yeSBnZXRHZW5lcmF0b3JSZXBvc2l0b3J5KCkgewotCQlyZXR1cm4gTnVsbEdlbmVyYXRvclJlcG9zaXRvcnkuaW5zdGFuY2UoKTsgLy90aGlzLmlkLmdldEpwYVByb2plY3QoKS5nZXRQbGF0Zm9ybSgpLmdlbmVyYXRvclJlcG9zaXRvcnkodGhpcy5pZC50eXBlTWFwcGluZygpLmdldFBlcnNpc3RlbnRUeXBlKCkpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVHZW5lcmF0b3JOYW1lQ29tYm8oKSB7Ci0JCXRoaXMuZ2VuZXJhdG9yTmFtZUNvbWJvLnJlbW92ZUFsbCgpOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gaSA9IGdldEdlbmVyYXRvclJlcG9zaXRvcnkoKS5nZW5lcmF0b3JOYW1lcygpOyBpLmhhc05leHQoKTsgKXsKLQkJCXRoaXMuZ2VuZXJhdG9yTmFtZUNvbWJvLmFkZChpLm5leHQoKSk7Ci0JCX0KLQotCQlwb3B1bGF0ZUdlbmVyYXRvck5hbWUoKTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlR2VuZXJhdG9yTmFtZSgpIHsKLQkJU3RyaW5nIGdlbmVyYXRvck5hbWUgPSB0aGlzLmdlbmVyYXRlZFZhbHVlLmdldEdlbmVyYXRvcigpOwotCQlpZiAoZ2VuZXJhdG9yTmFtZSA9PSBudWxsIHx8IGdlbmVyYXRvck5hbWUuZXF1YWxzKCIiKSkgewotCQkJdGhpcy5nZW5lcmF0b3JOYW1lQ29tYm8uc2V0VGV4dCgiIik7Ci0JCX0KLQkJZWxzZSBpZiAoIXRoaXMuZ2VuZXJhdG9yTmFtZUNvbWJvLmdldFRleHQoKS5lcXVhbHMoZ2VuZXJhdG9yTmFtZSkpIHsKLQkJCXRoaXMuZ2VuZXJhdG9yTmFtZUNvbWJvLnNldFRleHQoZ2VuZXJhdG9yTmFtZSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlU3RyYXRlZ3lDb21ibygpIHsKLQkJR2VuZXJhdGlvblR5cGUgc2VsZWN0ZWRUeXBlID0gc2VsZWN0ZWRTdHJhdGVneSgpOwotCQlHZW5lcmF0aW9uVHlwZSBzdHJhdGVneSA9IHRoaXMuZ2VuZXJhdGVkVmFsdWUuZ2V0U3RyYXRlZ3koKTsKLQkJaWYgKHN0cmF0ZWd5ID09IEdlbmVyYXRpb25UeXBlLkFVVE8pIHsKLQkJCWlmIChzZWxlY3RlZFR5cGUgIT0gR2VuZXJhdGlvblR5cGUuQVVUTykgewotCQkJCXRoaXMuc3RyYXRlZ3lDb21ib1ZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oR2VuZXJhdGlvblR5cGUuQVVUTykpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHN0cmF0ZWd5ID09IEdlbmVyYXRpb25UeXBlLlNFUVVFTkNFKSB7Ci0JCQlpZiAoc2VsZWN0ZWRUeXBlICE9IEdlbmVyYXRpb25UeXBlLlNFUVVFTkNFKSB7Ci0JCQkJdGhpcy5zdHJhdGVneUNvbWJvVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihHZW5lcmF0aW9uVHlwZS5TRVFVRU5DRSkpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHN0cmF0ZWd5ID09IEdlbmVyYXRpb25UeXBlLklERU5USVRZKSB7Ci0JCQlpZiAoc2VsZWN0ZWRUeXBlICE9IEdlbmVyYXRpb25UeXBlLklERU5USVRZKSB7Ci0JCQkJdGhpcy5zdHJhdGVneUNvbWJvVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihHZW5lcmF0aW9uVHlwZS5JREVOVElUWSkpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHN0cmF0ZWd5ID09IEdlbmVyYXRpb25UeXBlLlRBQkxFKSB7Ci0JCQlpZiAoc2VsZWN0ZWRUeXBlICE9IEdlbmVyYXRpb25UeXBlLlRBQkxFKSB7Ci0JCQkJdGhpcy5zdHJhdGVneUNvbWJvVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihHZW5lcmF0aW9uVHlwZS5UQUJMRSkpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKHNlbGVjdGVkVHlwZSAhPSBHZW5lcmF0aW9uVHlwZS5ERUZBVUxUKSB7Ci0JCQkJdGhpcy5zdHJhdGVneUNvbWJvVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihHZW5lcmF0aW9uVHlwZS5ERUZBVUxUKSk7Ci0JCQl9Ci0JCX0KLQkJLy8gVE9ETyBmaXJzdCBpbml0aWFsaXphdGlvbgotCX0KLQotCXByaXZhdGUgR2VuZXJhdGlvblR5cGUgc2VsZWN0ZWRTdHJhdGVneSgpIHsKLQkJcmV0dXJuIChHZW5lcmF0aW9uVHlwZSkgKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0aGlzLnN0cmF0ZWd5Q29tYm9WaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvR2VuZXJhdG9yQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0dlbmVyYXRvckNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWYwMjI3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvR2VuZXJhdG9yQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklJZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5KcGFDb3JlTWFwcGluZ3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkJhc2VKcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci0KLS8qKgotICogR2VuZXJhdG9yQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBHZW5lcmF0b3JDb21wb3NpdGU8RSBleHRlbmRzIElHZW5lcmF0b3I+IGV4dGVuZHMgQmFzZUpwYUNvbXBvc2l0ZQotewotCXByaXZhdGUgSUlkIGlkOwotCXByaXZhdGUgRSBnZW5lcmF0b3I7Ci0JcHJpdmF0ZSBBZGFwdGVyIGdlbmVyYXRvckxpc3RlbmVyOwotCi0JcHJvdGVjdGVkIFRleHQgbmFtZVRleHRXaWRnZXQ7Ci0KLQlwdWJsaWMgR2VuZXJhdG9yQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIENvbW1hbmRTdGFjayBjb21tYW5kU3RhY2ssIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJc3VwZXIocGFyZW50LCBTV1QuTlVMTCwgY29tbWFuZFN0YWNrLCB3aWRnZXRGYWN0b3J5KTsKLQkJdGhpcy5nZW5lcmF0b3JMaXN0ZW5lciA9IGJ1aWxkR2VuZXJhdG9yTGlzdG5lcigpOwotCX0KLQkKLQlwcml2YXRlIEFkYXB0ZXIgYnVpbGRHZW5lcmF0b3JMaXN0bmVyKCkgewotCQlyZXR1cm4gbmV3IEFkYXB0ZXJJbXBsKCkgewotCQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCQkJZ2VuZXJhdG9yQ2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEJ1aWxkcyB0aGUgR2VuZXJhdG9yIHNwZWNpZmllZE5hbWUgdmlld2VyLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIFRleHQgYnVpbGROYW1lVGV4dChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWZpbmFsIFRleHQgdGV4dCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVUZXh0KHBhcmVudCwgbnVsbCk7Ci0JCXRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50IGUpIHsKLQkJCQlpZiAoaXNQb3B1bGF0aW5nKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQkKLQkJCQlTdHJpbmcgbmFtZSA9IHRleHQuZ2V0VGV4dCgpOwotCQkJCWlmIChuYW1lLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAoZ2V0R2VuZXJhdG9yKCkuZ2V0TmFtZSgpID09IG51bGwpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQluYW1lID0gbnVsbDsKLQkJCQl9Ci0JCQkJSUdlbmVyYXRvciBnZW5lcmF0b3IgPSBnZXRHZW5lcmF0b3IoKTsKLQkJCQlpZiAoZ2VuZXJhdG9yID09IG51bGwpIHsKLQkJCQkJZ2VuZXJhdG9yID0gY3JlYXRlR2VuZXJhdG9yKCk7Ci0JCQkJfQotCQkJCWdlbmVyYXRvci5zZXROYW1lKG5hbWUpOwotCQkJfQotCQl9KTsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IEUgY3JlYXRlR2VuZXJhdG9yKCk7Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb1BvcHVsYXRlKEVPYmplY3Qgb2JqKSB7Ci0JCXRoaXMuaWQgPSAoSUlkKSBvYmo7Ci0JCWlmICh0aGlzLmlkICA9PSBudWxsKSB7Ci0JCQl0aGlzLmdlbmVyYXRvciA9IG51bGw7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdGhpcy5nZW5lcmF0b3IgPSBnZW5lcmF0b3IodGhpcy5pZCk7Ci0JCWlmICh0aGlzLmdlbmVyYXRvciA9PSBudWxsKSB7Ci0JCQljbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXBvcHVsYXRlTmFtZVZpZXdlcigpOwotCQlyZXR1cm47Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9Qb3B1bGF0ZSgpIHsKLQkJcG9wdWxhdGVOYW1lVmlld2VyKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUxpc3RlbmVycygpIHsKLQkJaWYgKHRoaXMuZ2VuZXJhdG9yICE9IG51bGwpIHsKLQkJCXRoaXMuZ2VuZXJhdG9yLmVBZGFwdGVycygpLmFkZCh0aGlzLmdlbmVyYXRvckxpc3RlbmVyKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZUxpc3RlbmVycygpIHsKLQkJaWYgKHRoaXMuZ2VuZXJhdG9yICE9IG51bGwpIHsKLQkJCXRoaXMuZ2VuZXJhdG9yLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzLmdlbmVyYXRvckxpc3RlbmVyKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBFIGdlbmVyYXRvcihJSWQgaWQpOwotCQotCXByb3RlY3RlZCBJSWQgaWRNYXBwaW5nKCkgewotCQlyZXR1cm4gdGhpcy5pZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0b3JDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJaWYgKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSUdlbmVyYXRvci5jbGFzcykgPT0gSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JR0VORVJBVE9SX19OQU1FKSB7Ci0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlpZiAobmFtZVRleHRXaWRnZXQuZ2V0VGV4dCgpID09IG51bGwgfHwgIW5hbWVUZXh0V2lkZ2V0LmdldFRleHQoKS5lcXVhbHMoZ2V0R2VuZXJhdG9yKCkuZ2V0TmFtZSgpKSkgewotCQkJCQkJaWYgKGdldEdlbmVyYXRvcigpLmdldE5hbWUoKSA9PSBudWxsKSB7Ci0JCQkJCQkJY2xlYXJOYW1lVmlld2VyKCk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQluYW1lVGV4dFdpZGdldC5zZXRUZXh0KGdldEdlbmVyYXRvcigpLmdldE5hbWUoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZU5hbWVWaWV3ZXIoKSB7Ci0JCVN0cmluZyBuYW1lID0gdGhpcy5nZXRHZW5lcmF0b3IoKS5nZXROYW1lKCk7Ci0JCWlmIChuYW1lICE9IG51bGwpIHsKLQkJCWlmICghdGhpcy5uYW1lVGV4dFdpZGdldC5nZXRUZXh0KCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJdGhpcy5uYW1lVGV4dFdpZGdldC5zZXRUZXh0KG5hbWUpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5jbGVhck5hbWVWaWV3ZXIoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBFIGdldEdlbmVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuZ2VuZXJhdG9yOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNsZWFyKCkgewotCQl0aGlzLmNsZWFyTmFtZVZpZXdlcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNsZWFyTmFtZVZpZXdlcigpIHsKLQkJdGhpcy5uYW1lVGV4dFdpZGdldC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvSWRDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvSWRDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjcxZDRjZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0lkQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JR2VuZXJhdGVkVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSUlkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklTZXF1ZW5jZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JVGFibGVHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSnBhQ29yZU1hcHBpbmdzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5UZW1wb3JhbFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLklKcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5CYXNlSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHMuRW51bUNvbWJvVmlld2VyLkVudW1Ib2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkV4cGFuZGFibGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSVdvcmtiZW5jaEhlbHBTeXN0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBJZENvbXBvc2l0ZSBleHRlbmRzIEJhc2VKcGFDb21wb3NpdGUgCi17Ci0JcHJpdmF0ZSBJSWQgaWQ7Ci0JcHJpdmF0ZSBBZGFwdGVyIGlkTGlzdGVuZXI7Ci0JCi0JcHJpdmF0ZSBDb2x1bW5Db21wb3NpdGUgY29sdW1uQ29tcG9zaXRlOwotCi0JcHJpdmF0ZSBFbnVtQ29tYm9WaWV3ZXIgdGVtcG9yYWxUeXBlVmlld2VyOwotCQotCXByaXZhdGUgU2VjdGlvbiBwa0dlbmVyYXRpb25TZWN0aW9uOwotCXByaXZhdGUgQnV0dG9uIHByaW1hcnlLZXlHZW5lcmF0aW9uQ2hlY2tCb3g7Ci0JcHJpdmF0ZSBHZW5lcmF0ZWRWYWx1ZUNvbXBvc2l0ZSBnZW5lcmF0ZWRWYWx1ZUNvbXBvc2l0ZTsKLQkKLQlwcml2YXRlIFNlY3Rpb24gdGFibGVHZW5TZWN0aW9uOwotCXByaXZhdGUgQnV0dG9uIHRhYmxlR2VuZXJhdG9yQ2hlY2tCb3g7Ci0JcHJpdmF0ZSBUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZSB0YWJsZUdlbmVyYXRvckNvbXBvc2l0ZTsKLQkKLQlwcml2YXRlIFNlY3Rpb24gc2VxdWVuY2VHZW5TZWN0aW9uOwotCXByaXZhdGUgQnV0dG9uIHNlcXVlbmNlR2VuZXJhdG9yQ2hlY2tCb3g7Ci0JcHJpdmF0ZSBTZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZSBzZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZTsKLQotCQotCXB1YmxpYyBJZENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrLCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULk5VTEwsIGNvbW1hbmRTdGFjaywgd2lkZ2V0RmFjdG9yeSk7Ci0JCXRoaXMuaWRMaXN0ZW5lciA9IGJ1aWxkSWRMaXN0ZW5lcigpOwotCX0KLQkKLQlwcml2YXRlIEFkYXB0ZXIgYnVpbGRJZExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IEFkYXB0ZXJJbXBsKCkgewotCQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCQkJaWRNYXBwaW5nQ2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJfQotCQl9OwotCX0KLQl2b2lkIGlkTWFwcGluZ0NoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSUlkLmNsYXNzKSkgewotCQkJY2FzZSBKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLklJRF9fVEFCTEVfR0VORVJBVE9SIDoKLQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlpZiAoZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJCUlkQ29tcG9zaXRlLnRoaXMucG9wdWxhdGVUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZSgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSUlEX19TRVFVRU5DRV9HRU5FUkFUT1IgOgotCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWlmIChnZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQkJSWRDb21wb3NpdGUudGhpcy5wb3B1bGF0ZVNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JSURfX0dFTkVSQVRFRF9WQUxVRSA6Ci0JCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJaWYgKGdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQlJZENvbXBvc2l0ZS50aGlzLnBvcHVsYXRlR2VuZXJhdGVkVmFsdWVDb21wb3NpdGUoKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCi0JCUNvbnRyb2wgZ2VuZXJhbENvbnRyb2wgPSBidWlsZEdlbmVyYWxDb21wb3NpdGUoY29tcG9zaXRlKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlnZW5lcmFsQ29udHJvbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQlDb250cm9sIGdlbmVyYXRpb25Db250cm9sID0gYnVpbGRHZW5lcmF0aW9uQ29tcG9zaXRlKGNvbXBvc2l0ZSk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ2VuZXJhdGlvbkNvbnRyb2wuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JfQotCQotCXByaXZhdGUgQ29udHJvbCBidWlsZEdlbmVyYWxDb21wb3NpdGUoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlDb21wb3NpdGUgZ2VuZXJhbENvbXBvc2l0ZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDb21wb3NpdGUoY29tcG9zaXRlKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWdlbmVyYWxDb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7CQotCQkKLQkJdGhpcy5jb2x1bW5Db21wb3NpdGUgPSBuZXcgQ29sdW1uQ29tcG9zaXRlKGdlbmVyYWxDb21wb3NpdGUsIHRoaXMuY29tbWFuZFN0YWNrLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJdGhpcy5jb2x1bW5Db21wb3NpdGUuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwkKLQotCQlDb21tb25XaWRnZXRzLmJ1aWxkVGVtcG9yYWxMYWJlbChnZW5lcmFsQ29tcG9zaXRlLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCQl0aGlzLnRlbXBvcmFsVHlwZVZpZXdlciA9IENvbW1vbldpZGdldHMuYnVpbGRFbnVtQ29tYm9WaWV3ZXIoZ2VuZXJhbENvbXBvc2l0ZSwgdGhpcy5jb21tYW5kU3RhY2ssIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuQkVHSU5OSU5HOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJdGhpcy50ZW1wb3JhbFR5cGVWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRlbXBvcmFsVHlwZVZpZXdlci5nZXRDb250cm9sKCksIElKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX1RFTVBPUkFMKTsKLQotCQlyZXR1cm4gZ2VuZXJhbENvbXBvc2l0ZTsKLQl9Ci0KLQlwcml2YXRlIENvbnRyb2wgYnVpbGRHZW5lcmF0aW9uQ29tcG9zaXRlKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJSVdvcmtiZW5jaEhlbHBTeXN0ZW0gaGVscFN5c3RlbSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpOwotCQkKLQkJdGhpcy5wa0dlbmVyYXRpb25TZWN0aW9uID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVNlY3Rpb24oY29tcG9zaXRlLCBTV1QuRkxBVCB8IEV4cGFuZGFibGVDb21wb3NpdGUuVFdJU1RJRSB8IEV4cGFuZGFibGVDb21wb3NpdGUuVElUTEVfQkFSKTsKLQkgICAgdGhpcy5wa0dlbmVyYXRpb25TZWN0aW9uLnNldFRleHQoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLklkTWFwcGluZ0NvbXBvc2l0ZV9wcmltYXJ5S2V5R2VuZXJhdGlvbik7Ci0KLQkJQ29tcG9zaXRlIGdlbmVyYXRpb25DbGllbnQgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ29tcG9zaXRlKHRoaXMucGtHZW5lcmF0aW9uU2VjdGlvbik7Ci0JCXRoaXMucGtHZW5lcmF0aW9uU2VjdGlvbi5zZXRDbGllbnQoZ2VuZXJhdGlvbkNsaWVudCk7Ci0JCQotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWdlbmVyYXRpb25DbGllbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJdGhpcy5wcmltYXJ5S2V5R2VuZXJhdGlvbkNoZWNrQm94ID0gYnVpbGRQcmltYXJ5S2V5R2VuZXJhdGlvbkNoZWNrQm94KGdlbmVyYXRpb25DbGllbnQpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQl0aGlzLnByaW1hcnlLZXlHZW5lcmF0aW9uQ2hlY2tCb3guc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWhlbHBTeXN0ZW0uc2V0SGVscChwcmltYXJ5S2V5R2VuZXJhdGlvbkNoZWNrQm94LCBJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19QUklNQVJZX0tFWV9HRU5FUkFUSU9OKTsKLQkJCi0JCXRoaXMuZ2VuZXJhdGVkVmFsdWVDb21wb3NpdGUgPSBuZXcgR2VuZXJhdGVkVmFsdWVDb21wb3NpdGUoZ2VuZXJhdGlvbkNsaWVudCwgdGhpcy5jb21tYW5kU3RhY2ssIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEluZGVudCA9IDIwOwotCQl0aGlzLmdlbmVyYXRlZFZhbHVlQ29tcG9zaXRlLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCi0JICAgIHRoaXMudGFibGVHZW5TZWN0aW9uID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVNlY3Rpb24oZ2VuZXJhdGlvbkNsaWVudCwgU1dULkZMQVQgfCBFeHBhbmRhYmxlQ29tcG9zaXRlLlRXSVNUSUUpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXRoaXMudGFibGVHZW5TZWN0aW9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkKLQkgICAgdGhpcy50YWJsZUdlblNlY3Rpb24uc2V0VGV4dChKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSWRNYXBwaW5nQ29tcG9zaXRlX3RhYmxlR2VuZXJhdG9yKTsKLQotCQlDb21wb3NpdGUgdGFibGVHZW5DbGllbnQgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ29tcG9zaXRlKHRoaXMudGFibGVHZW5TZWN0aW9uKTsKLQkJdGhpcy50YWJsZUdlblNlY3Rpb24uc2V0Q2xpZW50KHRhYmxlR2VuQ2xpZW50KTsKLQkJCi0JCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCXRhYmxlR2VuQ2xpZW50LnNldExheW91dChsYXlvdXQpOwotCQkKLQkJdGhpcy50YWJsZUdlbmVyYXRvckNoZWNrQm94ID0gYnVpbGRUYWJsZUdlbmVyYXRvckNoZWNrQm94KHRhYmxlR2VuQ2xpZW50KTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJdGhpcy50YWJsZUdlbmVyYXRvckNoZWNrQm94LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQloZWxwU3lzdGVtLnNldEhlbHAodGFibGVHZW5lcmF0b3JDaGVja0JveCwgSUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfVEFCTEVfR0VORVJBVE9SKTsKLQkJCi0JCXRoaXMudGFibGVHZW5lcmF0b3JDb21wb3NpdGUgPSBuZXcgVGFibGVHZW5lcmF0b3JDb21wb3NpdGUodGFibGVHZW5DbGllbnQsIHRoaXMuY29tbWFuZFN0YWNrLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmhvcml6b250YWxJbmRlbnQgPSAyMDsKLQkJdGhpcy50YWJsZUdlbmVyYXRvckNvbXBvc2l0ZS5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQotCi0JCQotCSAgICB0aGlzLnNlcXVlbmNlR2VuU2VjdGlvbiA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVTZWN0aW9uKGdlbmVyYXRpb25DbGllbnQsIFNXVC5GTEFUIHwgRXhwYW5kYWJsZUNvbXBvc2l0ZS5UV0lTVElFKTsKLQkgICAgdGhpcy5zZXF1ZW5jZUdlblNlY3Rpb24uc2V0VGV4dChKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSWRNYXBwaW5nQ29tcG9zaXRlX3NlcXVlbmNlR2VuZXJhdG9yKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQl0aGlzLnNlcXVlbmNlR2VuU2VjdGlvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQlDb21wb3NpdGUgc2VxdWVuY2VHZW5DbGllbnQgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ29tcG9zaXRlKHRoaXMuc2VxdWVuY2VHZW5TZWN0aW9uKTsKLQkJdGhpcy5zZXF1ZW5jZUdlblNlY3Rpb24uc2V0Q2xpZW50KHNlcXVlbmNlR2VuQ2xpZW50KTsKLQkJCi0JCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCXNlcXVlbmNlR2VuQ2xpZW50LnNldExheW91dChsYXlvdXQpOwotCQotCQl0aGlzLnNlcXVlbmNlR2VuZXJhdG9yQ2hlY2tCb3ggPSBidWlsZFNlcXVlbmNlR2VuZXJhdG9yQ2hlY2tCb3goc2VxdWVuY2VHZW5DbGllbnQpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQl0aGlzLnNlcXVlbmNlR2VuZXJhdG9yQ2hlY2tCb3guc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWhlbHBTeXN0ZW0uc2V0SGVscChzZXF1ZW5jZUdlbmVyYXRvckNoZWNrQm94LCBJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19TRVFVRU5DRV9HRU5FUkFUT1IpOwotCi0JCXRoaXMuc2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGUgPSBuZXcgU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGUoc2VxdWVuY2VHZW5DbGllbnQsIHRoaXMuY29tbWFuZFN0YWNrLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmhvcml6b250YWxJbmRlbnQgPSAyMDsKLQkJdGhpcy5zZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZS5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJcmV0dXJuIHRoaXMucGtHZW5lcmF0aW9uU2VjdGlvbjsKLQl9Ci0JCi0JcHJpdmF0ZSBCdXR0b24gYnVpbGRQcmltYXJ5S2V5R2VuZXJhdGlvbkNoZWNrQm94KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVCdXR0b24ocGFyZW50LEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5JZE1hcHBpbmdDb21wb3NpdGVfcHJpbWFyeUtleUdlbmVyYXRpb24sIFNXVC5DSEVDSyk7Ci0JCWJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJLy8gaWdub3JlCi0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJZENvbXBvc2l0ZS50aGlzLnByaW1hcnlLZXlHZW5lcmF0aW9uQ2hlY2tCb3hDbGlja2VkKGUpOwotCQkJfQotCQl9KTsKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0KLQl2b2lkIHByaW1hcnlLZXlHZW5lcmF0aW9uQ2hlY2tCb3hDbGlja2VkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJYm9vbGVhbiBtYXBwaW5nSGFzR2VuZXJhdGVkVmFsdWUgPSB0aGlzLmlkLmdldEdlbmVyYXRlZFZhbHVlKCkgIT0gbnVsbDsKLQkJYm9vbGVhbiBjaGVja2VkID0gdGhpcy5wcmltYXJ5S2V5R2VuZXJhdGlvbkNoZWNrQm94LmdldFNlbGVjdGlvbigpOwotCQlpZiAoY2hlY2tlZCA9PSBtYXBwaW5nSGFzR2VuZXJhdGVkVmFsdWUpIHsKLQkJCXJldHVybjsKLQkJfQotCQlJR2VuZXJhdGVkVmFsdWUgZ2VuZXJhdGVkVmFsdWUgPSBudWxsOwotCQlpZiAoY2hlY2tlZCkgewotCQkJZ2VuZXJhdGVkVmFsdWUgPSB0aGlzLmlkLmNyZWF0ZUdlbmVyYXRlZFZhbHVlKCk7Ci0JCX0KLQkJdGhpcy5pZC5zZXRHZW5lcmF0ZWRWYWx1ZShnZW5lcmF0ZWRWYWx1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBCdXR0b24gYnVpbGRUYWJsZUdlbmVyYXRvckNoZWNrQm94KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVCdXR0b24ocGFyZW50LEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5JZE1hcHBpbmdDb21wb3NpdGVfdGFibGVHZW5lcmF0b3IsIFNXVC5DSEVDSyk7Ci0JCWJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJLy8gaWdub3JlCi0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJZENvbXBvc2l0ZS50aGlzLnRhYmxlR2VuZXJhdG9yQ2hlY2tCb3hDbGlja2VkKGUpOwotCQkJfQotCQl9KTsKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0KLQl2b2lkIHRhYmxlR2VuZXJhdG9yQ2hlY2tCb3hDbGlja2VkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJYm9vbGVhbiBtYXBwaW5nSGFzVGFibGVHZW5lcmF0b3IgPSB0aGlzLmlkLmdldFRhYmxlR2VuZXJhdG9yKCkgIT0gbnVsbDsKLQkJYm9vbGVhbiBjaGVja2VkID0gdGhpcy50YWJsZUdlbmVyYXRvckNoZWNrQm94LmdldFNlbGVjdGlvbigpOwotCQlpZiAoY2hlY2tlZCA9PSBtYXBwaW5nSGFzVGFibGVHZW5lcmF0b3IpIHsKLQkJCXJldHVybjsKLQkJfQotCQlJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSBudWxsOwotCQlpZiAoY2hlY2tlZCkgewotCQkJdGFibGVHZW5lcmF0b3IgPSB0aGlzLmlkLmNyZWF0ZVRhYmxlR2VuZXJhdG9yKCk7Ci0JCX0KLQkJdGhpcy5pZC5zZXRUYWJsZUdlbmVyYXRvcih0YWJsZUdlbmVyYXRvcik7Ci0JCWlmIChjaGVja2VkKSB7Ci0JCQlJR2VuZXJhdGVkVmFsdWUgZ2VuZXJhdGVkVmFsdWUgPSB0aGlzLmlkLmdldEdlbmVyYXRlZFZhbHVlKCk7Ci0JCQlpZiAoZ2VuZXJhdGVkVmFsdWUgIT0gbnVsbCAmJiBnZW5lcmF0ZWRWYWx1ZS5nZXRHZW5lcmF0b3IoKSAhPSBudWxsKSB7Ci0JCQkJdGFibGVHZW5lcmF0b3Iuc2V0TmFtZShnZW5lcmF0ZWRWYWx1ZS5nZXRHZW5lcmF0b3IoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEJ1dHRvbiBidWlsZFNlcXVlbmNlR2VuZXJhdG9yQ2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCkgewotCQlCdXR0b24gYnV0dG9uID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1dHRvbihwYXJlbnQsSnB0VWlNYXBwaW5nc01lc3NhZ2VzLklkTWFwcGluZ0NvbXBvc2l0ZV9zZXF1ZW5jZUdlbmVyYXRvciwgU1dULkNIRUNLKTsKLQkJYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUlkQ29tcG9zaXRlLnRoaXMuc2VxdWVuY2VHZW5lcmF0b3JDaGVja0JveENsaWNrZWQoZSk7Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gYnV0dG9uOwotCX0KLQotCXZvaWQgc2VxdWVuY2VHZW5lcmF0b3JDaGVja0JveENsaWNrZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQlib29sZWFuIG1hcHBpbmdIYXNTZXF1ZW5jZUdlbmVyYXRvciA9IHRoaXMuaWQuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSAhPSBudWxsOwotCQlib29sZWFuIGNoZWNrZWQgPSB0aGlzLnNlcXVlbmNlR2VuZXJhdG9yQ2hlY2tCb3guZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChjaGVja2VkID09IG1hcHBpbmdIYXNTZXF1ZW5jZUdlbmVyYXRvcikgewotCQkJcmV0dXJuOwotCQl9Ci0JCUlTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvciA9IG51bGw7Ci0JCWlmIChjaGVja2VkKSB7Ci0JCQlzZXF1ZW5jZUdlbmVyYXRvciA9IHRoaXMuaWQuY3JlYXRlU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJfQotCQl0aGlzLmlkLnNldFNlcXVlbmNlR2VuZXJhdG9yKHNlcXVlbmNlR2VuZXJhdG9yKTsKLQkJaWYgKGNoZWNrZWQpIHsKLQkJCUlHZW5lcmF0ZWRWYWx1ZSBnZW5lcmF0ZWRWYWx1ZSA9IHRoaXMuaWQuZ2V0R2VuZXJhdGVkVmFsdWUoKTsKLQkJCWlmIChnZW5lcmF0ZWRWYWx1ZSAhPSBudWxsICYmIGdlbmVyYXRlZFZhbHVlLmdldEdlbmVyYXRvcigpICE9IG51bGwpIHsKLQkJCQlzZXF1ZW5jZUdlbmVyYXRvci5zZXROYW1lKGdlbmVyYXRlZFZhbHVlLmdldEdlbmVyYXRvcigpKTsKLQkJCX0KLQkJfQotCX0KLQotCQotCQotCXB1YmxpYyB2b2lkIGRvUG9wdWxhdGUoRU9iamVjdCBvYmopIHsKLQkJdGhpcy5pZCA9IChJSWQpIG9iajsKLQkJaWYgKHRoaXMuaWQgIT0gbnVsbCkgewotCQkJdGhpcy5jb2x1bW5Db21wb3NpdGUucG9wdWxhdGUodGhpcy5pZC5nZXRDb2x1bW4oKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLmNvbHVtbkNvbXBvc2l0ZS5wb3B1bGF0ZShudWxsKTsKLQkJCXRoaXMuZ2VuZXJhdGVkVmFsdWVDb21wb3NpdGUucG9wdWxhdGUobnVsbCk7Ci0JCQl0aGlzLnRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlLnBvcHVsYXRlKG51bGwpOwotCQkJdGhpcy5zZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZS5wb3B1bGF0ZShudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCSAgICB0aGlzLnBrR2VuZXJhdGlvblNlY3Rpb24uc2V0RXhwYW5kZWQodHJ1ZSk7Ci0JCXRoaXMudGVtcG9yYWxUeXBlVmlld2VyLnBvcHVsYXRlKG5ldyBUZW1wb3JhbFR5cGVIb2xkZXIodGhpcy5pZCkpOwotCQlwb3B1bGF0ZUdlbmVyYXRlZFZhbHVlQ29tcG9zaXRlKCk7Ci0JCXBvcHVsYXRlU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGUoKTsKLQkJcG9wdWxhdGVUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkb1BvcHVsYXRlKCkgewotCQl0aGlzLmNvbHVtbkNvbXBvc2l0ZS5wb3B1bGF0ZSgpOwotCQl0aGlzLnRlbXBvcmFsVHlwZVZpZXdlci5wb3B1bGF0ZSgpOwotCQl0aGlzLmdlbmVyYXRlZFZhbHVlQ29tcG9zaXRlLnBvcHVsYXRlKCk7Ci0JCXRoaXMudGFibGVHZW5lcmF0b3JDb21wb3NpdGUucG9wdWxhdGUoKTsKLQkJdGhpcy5zZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZS5wb3B1bGF0ZSgpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZSgpIHsKLQkJdGhpcy50YWJsZUdlbmVyYXRvckNvbXBvc2l0ZS5wb3B1bGF0ZSh0aGlzLmlkKTsKLQkJYm9vbGVhbiB0YWJsZUdlbmVyYXRvckV4aXN0cyA9IHRoaXMuaWQuZ2V0VGFibGVHZW5lcmF0b3IoKSAhPSBudWxsOwotCQl0aGlzLnRhYmxlR2VuZXJhdG9yQ2hlY2tCb3guc2V0U2VsZWN0aW9uKHRhYmxlR2VuZXJhdG9yRXhpc3RzKTsKLQkJaWYgKHRhYmxlR2VuZXJhdG9yRXhpc3RzKSB7Ci0JCQl0aGlzLnRhYmxlR2VuU2VjdGlvbi5zZXRFeHBhbmRlZCh0cnVlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZVNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlKCkgewotCQl0aGlzLnNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlLnBvcHVsYXRlKHRoaXMuaWQpOwotCQlib29sZWFuIHNlcXVlbmNlR2VuZXJhdG9yRXhpc3RzID0gdGhpcy5pZC5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpICE9IG51bGw7Ci0JCXRoaXMuc2VxdWVuY2VHZW5lcmF0b3JDaGVja0JveC5zZXRTZWxlY3Rpb24oc2VxdWVuY2VHZW5lcmF0b3JFeGlzdHMpOwotCQlpZiAoc2VxdWVuY2VHZW5lcmF0b3JFeGlzdHMpIHsKLQkJCXRoaXMuc2VxdWVuY2VHZW5TZWN0aW9uLnNldEV4cGFuZGVkKHRydWUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlR2VuZXJhdGVkVmFsdWVDb21wb3NpdGUoKSB7Ci0JCXRoaXMuZ2VuZXJhdGVkVmFsdWVDb21wb3NpdGUucG9wdWxhdGUodGhpcy5pZCk7Ci0JCXRoaXMucHJpbWFyeUtleUdlbmVyYXRpb25DaGVja0JveC5zZXRTZWxlY3Rpb24odGhpcy5pZC5nZXRHZW5lcmF0ZWRWYWx1ZSgpICE9IG51bGwpOwotCX0KLQotCQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUxpc3RlbmVycygpIHsKLQkJaWYgKHRoaXMuaWQgIT1udWxsKSB7Ci0JCQl0aGlzLmlkLmVBZGFwdGVycygpLmFkZCh0aGlzLmlkTGlzdGVuZXIpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZUxpc3RlbmVycygpIHsKLQkJaWYgKHRoaXMuaWQgIT1udWxsKSB7Ci0JCQl0aGlzLmlkLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzLmlkTGlzdGVuZXIpOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXRoaXMuY29sdW1uQ29tcG9zaXRlLmRpc3Bvc2UoKTsKLQkJdGhpcy50ZW1wb3JhbFR5cGVWaWV3ZXIuZGlzcG9zZSgpOwotCQl0aGlzLmdlbmVyYXRlZFZhbHVlQ29tcG9zaXRlLmRpc3Bvc2UoKTsKLQkJdGhpcy50YWJsZUdlbmVyYXRvckNvbXBvc2l0ZS5kaXNwb3NlKCk7Ci0JCXRoaXMuc2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGUuZGlzcG9zZSgpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBJSWQgZ2V0SWQoKSB7Ci0JCXJldHVybiB0aGlzLmlkOwotCX0KLQkKLQlwcml2YXRlIGNsYXNzIFRlbXBvcmFsVHlwZUhvbGRlciBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgRW51bUhvbGRlciB7Ci0JCQotCQlwcml2YXRlIElJZCBpZDsKLQkJCi0JCVRlbXBvcmFsVHlwZUhvbGRlcihJSWQgaWQpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmlkID0gaWQ7Ci0JCX0KLQkJCi0JCXB1YmxpYyBPYmplY3QgZ2V0KCkgewotCQkJcmV0dXJuIHRoaXMuaWQuZ2V0VGVtcG9yYWwoKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgc2V0KE9iamVjdCBlbnVtU2V0dGluZykgewotCQkJdGhpcy5pZC5zZXRUZW1wb3JhbCgoVGVtcG9yYWxUeXBlKSBlbnVtU2V0dGluZyk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBDbGFzcyBmZWF0dXJlQ2xhc3MoKSB7Ci0JCQlyZXR1cm4gSUlkLmNsYXNzOwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGZlYXR1cmVJZCgpIHsKLQkJCXJldHVybiBKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLklJRF9fVEVNUE9SQUw7Ci0JCX0KLQkJCi0JCXB1YmxpYyBFT2JqZWN0IHdyYXBwZWRPYmplY3QoKSB7Ci0JCQlyZXR1cm4gdGhpcy5pZDsKLQkJfQotCQkKLQkJcHVibGljIE9iamVjdFtdIGVudW1WYWx1ZXMoKSB7Ci0JCQlyZXR1cm4gVGVtcG9yYWxUeXBlLlZBTFVFUy50b0FycmF5KCk7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBUZW1wb3JhbFR5cGUgaGFzIG5vIERlZmF1bHQsIHJldHVybiBudWxsCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRWYWx1ZSgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQkvKioKLQkJICogVGVtcG9yYWxUeXBlIGhhcyBubyBEZWZhdWx0LCByZXR1cm4gbnVsbAotCQkgKi8KLQkJcHVibGljIFN0cmluZyBkZWZhdWx0U3RyaW5nKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0luaGVyaXRhbmNlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0luaGVyaXRhbmNlQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlYjYxNTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9Jbmhlcml0YW5jZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLkRpc2NyaW1pbmF0b3JUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklEaXNjcmltaW5hdG9yQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSU5hbWVkQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLkluaGVyaXRhbmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5KcGFDb3JlTWFwcGluZ3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC5Db25uZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLkNvbm5lY3Rpb25Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC5EYXRhYmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwuU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSUpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkJhc2VKcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5DQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLQotcHVibGljIGNsYXNzIEluaGVyaXRhbmNlQ29tcG9zaXRlIGV4dGVuZHMgQmFzZUpwYUNvbXBvc2l0ZSB7Ci0JCi0JcHJpdmF0ZSBJRW50aXR5IGVudGl0eTsKLQlwcml2YXRlIElEaXNjcmltaW5hdG9yQ29sdW1uIGRpc2NyaW1pbmF0b3JDb2x1bW47Ci0JcHJpdmF0ZSBmaW5hbCBBZGFwdGVyIGVudGl0eUxpc3RlbmVyOwotCXByaXZhdGUgZmluYWwgQWRhcHRlciBkaXNjcmltaW5hdG9yQ29sdW1uTGlzdGVuZXI7Ci0JCi0JcHJpdmF0ZSBDQ29tYm9WaWV3ZXIgc3RyYXRlZ3lWaWV3ZXI7Ci0JcHJpdmF0ZSBDQ29tYm8gY29sdW1uQ29tYm87Ci0JcHJpdmF0ZSBDQ29tYm9WaWV3ZXIgZGlzY3JpbWluYXRvclR5cGVWaWV3ZXI7Ci0JcHJpdmF0ZSBDQ29tYm8gZGlzY3JpbWluYXRvclZhbHVlQ29tYm87Ci0JCi0JcHJpdmF0ZSBDb25uZWN0aW9uTGlzdGVuZXIgY29ubmVjdGlvbkxpc3RlbmVyOwotCQotCXByaXZhdGUgQ29ubmVjdGlvblByb2ZpbGUgY29ubmVjdGlvblByb2ZpbGU7Ci0KLQkKLQlwcml2YXRlIFByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZSBwa0pvaW5Db2x1bW5zQ29tcG9zaXRlOwotCQotCXB1YmxpYyBJbmhlcml0YW5jZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrLCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULk5VTEwsIGNvbW1hbmRTdGFjaywgd2lkZ2V0RmFjdG9yeSk7Ci0JCXRoaXMuZW50aXR5TGlzdGVuZXIgPSBidWlsZEVudGl0eUxpc3RlbmVyKCk7Ci0JCXRoaXMuZGlzY3JpbWluYXRvckNvbHVtbkxpc3RlbmVyID0gYnVpbGREaXNjcmltaW5hdG9yQ29sdW1uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uTGlzdGVuZXIgPSBidWlsZENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCX0KLQkJCi0JcHJpdmF0ZSBBZGFwdGVyIGJ1aWxkRW50aXR5TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJCQllbnRpdHlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBBZGFwdGVyIGJ1aWxkRGlzY3JpbWluYXRvckNvbHVtbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IEFkYXB0ZXJJbXBsKCkgewotCQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCQkJZGlzY3JpbWluYXRvckNvbHVtbkNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0gICAgcHJpdmF0ZSBDb25uZWN0aW9uTGlzdGVuZXIgYnVpbGRDb25uZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ29ubmVjdGlvbkxpc3RlbmVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCBhYm91dFRvQ2xvc2UoQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7Ci0JCQkJLy8gbm90IGludGVyZXN0ZWQgdG8gdGhpcyBldmVudC4KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgY2xvc2VkKENvbm5lY3Rpb24gY29ubmVjdGlvbikgewotCQkJCWdldENvbnRyb2woKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKCBuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWlmIChnZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQkJSW5oZXJpdGFuY2VDb21wb3NpdGUudGhpcy5wb3B1bGF0ZUNvbHVtbkNvbWJvKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbW9kaWZpZWQoQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7Ci0JCQkJZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMoIG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJaWYgKGdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQlJbmhlcml0YW5jZUNvbXBvc2l0ZS50aGlzLnBvcHVsYXRlQ29sdW1uQ29tYm8oKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBva1RvQ2xvc2UoQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7Ci0JCQkJLy8gbm90IGludGVyZXN0ZWQgdG8gdGhpcyBldmVudC4KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgb3BlbmVkKENvbm5lY3Rpb24gY29ubmVjdGlvbikgewotCQkJCWdldENvbnRyb2woKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKCBuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWlmIChnZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQkJSW5oZXJpdGFuY2VDb21wb3NpdGUudGhpcy5wb3B1bGF0ZUNvbHVtbkNvbWJvKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgZGF0YWJhc2VDaGFuZ2VkKENvbm5lY3Rpb24gY29ubmVjdGlvbiwgZmluYWwgRGF0YWJhc2UgZGF0YWJhc2UpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHNjaGVtYUNoYW5nZWQoQ29ubmVjdGlvbiBjb25uZWN0aW9uLCBmaW5hbCBTY2hlbWEgc2NoZW1hKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB0YWJsZUNoYW5nZWQoQ29ubmVjdGlvbiBjb25uZWN0aW9uLCBmaW5hbCBUYWJsZSB0YWJsZSkgewotCQkJCWdldENvbnRyb2woKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKCBuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWlmKHRhYmxlID09IGdldERiVGFibGUoKSkgewotCQkJCQkJCWlmICghZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJCQlJbmhlcml0YW5jZUNvbXBvc2l0ZS50aGlzLnBvcHVsYXRlQ29sdW1uQ29tYm8oKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfTsKLSAgICB9CQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwkKLQotCQlHcmlkRGF0YSBncmlkRGF0YTsKLQotCQlnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlTGFiZWwoY29tcG9zaXRlLCBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSW5oZXJpdGFuY2VDb21wb3NpdGVfc3RyYXRlZ3kpOwotCi0JCXRoaXMuc3RyYXRlZ3lWaWV3ZXIgPSBidWlsZFN0cmF0ZWd5Q29tYm8oY29tcG9zaXRlKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQl0aGlzLnN0cmF0ZWd5Vmlld2VyLmdldENvbWJvKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGhpcy5zdHJhdGVneVZpZXdlci5nZXRDb21ibygpLCBJSnBhSGVscENvbnRleHRJZHMuRU5USVRZX0lOSEVSSVRBTkNFX1NUUkFURUdZKTsKLQotCQlnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlTGFiZWwoY29tcG9zaXRlLCBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuRGlzY3JpbWluYXRvckNvbHVtbkNvbXBvc2l0ZV9jb2x1bW4pOwotCi0JCXRoaXMuY29sdW1uQ29tYm8gPSBidWlsZENvbHVtbkNvbWJvKGNvbXBvc2l0ZSk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJdGhpcy5jb2x1bW5Db21iby5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0aGlzLmNvbHVtbkNvbWJvLCBJSnBhSGVscENvbnRleHRJZHMuRU5USVRZX0lOSEVSSVRBTkNFX0RJU0NSSU1JTkFUT1JfQ09MVU1OKTsKLQkJCi0JCWdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVMYWJlbChjb21wb3NpdGUsIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5EaXNjcmltaW5hdG9yQ29sdW1uQ29tcG9zaXRlX2Rpc2NyaW1pbmF0b3JUeXBlKTsKLQotCQl0aGlzLmRpc2NyaW1pbmF0b3JUeXBlVmlld2VyID0gYnVpbGREaXNjcmltaW5hdG9yVHlwZUNvbWJvKGNvbXBvc2l0ZSk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJdGhpcy5kaXNjcmltaW5hdG9yVHlwZVZpZXdlci5nZXRDb21ibygpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRoaXMuZGlzY3JpbWluYXRvclR5cGVWaWV3ZXIuZ2V0Q29tYm8oKSwgSUpwYUhlbHBDb250ZXh0SWRzLkVOVElUWV9JTkhFUklUQU5DRV9ESVNDUklNSU5BVE9SX1RZUEUpOwotCQotCQkKLQkJZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkluaGVyaXRhbmNlQ29tcG9zaXRlX2Rpc2NyaW1pbmF0b3JWYWx1ZSk7Ci0KLQkJdGhpcy5kaXNjcmltaW5hdG9yVmFsdWVDb21ibyA9IGJ1aWxkRGlzY3JpbWluYXRvclZhbHVlQ29tYm8oY29tcG9zaXRlKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQl0aGlzLmRpc2NyaW1pbmF0b3JWYWx1ZUNvbWJvLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRoaXMuZGlzY3JpbWluYXRvclZhbHVlQ29tYm8sIElKcGFIZWxwQ29udGV4dElkcy5FTlRJVFlfSU5IRVJJVEFOQ0VfRElTQ1JJTUlOQVRPUl9WQUxVRSk7Ci0JCQotCQl0aGlzLnBrSm9pbkNvbHVtbnNDb21wb3NpdGUgPSBuZXcgUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlKGNvbXBvc2l0ZSwgdGhpcy5jb21tYW5kU3RhY2ssIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJdGhpcy5wa0pvaW5Db2x1bW5zQ29tcG9zaXRlLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQl9Ci0JCi0JcHJpdmF0ZSBDQ29tYm9WaWV3ZXIgYnVpbGRTdHJhdGVneUNvbWJvKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ0NvbWJvIGNvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhwYXJlbnQpOwotCQlDQ29tYm9WaWV3ZXIgc3RyYXRlZ3lWaWV3ZXIgPSBuZXcgQ0NvbWJvVmlld2VyKGNvbWJvKTsKLQkJc3RyYXRlZ3lWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihidWlsZFN0cmF0ZWd5TGFiZWxQcm92aWRlcigpKTsKLQkJc3RyYXRlZ3lWaWV3ZXIuYWRkKEluaGVyaXRhbmNlVHlwZS5WQUxVRVMudG9BcnJheSgpKTsKLQkJc3RyYXRlZ3lWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlJbmhlcml0YW5jZUNvbXBvc2l0ZS50aGlzLnN0cmF0ZWd5U2VsZWN0aW9uQ2hhbmdlZChldmVudC5nZXRTZWxlY3Rpb24oKSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJcmV0dXJuIHN0cmF0ZWd5Vmlld2VyOwotCX0KLQkKLQlwcml2YXRlIElCYXNlTGFiZWxQcm92aWRlciBidWlsZFN0cmF0ZWd5TGFiZWxQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlpZiAoZWxlbWVudCA9PSBJbmhlcml0YW5jZVR5cGUuREVGQVVMVCkgewotCQkJCQkvL1RPRE8gbmVlZCB0byBtb3ZlIHRoaXMgdG8gdGhlIG1vZGVsLCBkb24ndCB3YW50IGhhcmRjb2RlZCBTdHJpbmcKLQkJCQkJcmV0dXJuIE5MUy5iaW5kKEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Jbmhlcml0YW5jZUNvbXBvc2l0ZV9kZWZhdWx0LCAiU2luZ2xlIFRhYmxlIik7Ci0JCQkJfQotCQkJCXJldHVybiBzdXBlci5nZXRUZXh0KGVsZW1lbnQpOwotCQkJfQotCQl9OwotCX0KLQkKLQl2b2lkIHN0cmF0ZWd5U2VsZWN0aW9uQ2hhbmdlZChJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCUluaGVyaXRhbmNlVHlwZSBpbmhlcml0YW5jZVR5cGUgPSAoSW5oZXJpdGFuY2VUeXBlKSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOwotCQkJaWYgKCAhIHRoaXMuZW50aXR5LmdldEluaGVyaXRhbmNlU3RyYXRlZ3koKS5lcXVhbHMoaW5oZXJpdGFuY2VUeXBlKSkgewotCQkJCXRoaXMuZW50aXR5LnNldEluaGVyaXRhbmNlU3RyYXRlZ3koaW5oZXJpdGFuY2VUeXBlKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIENDb21ibyBidWlsZENvbHVtbkNvbWJvKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJZmluYWwgQ0NvbWJvIGNvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhwYXJlbnQsIFNXVC5GTEFUKTsKLSAgCQljb21iby5hZGQoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkNvbHVtbkNvbXBvc2l0ZV9kZWZhdWx0RW1wdHkpOwotCQljb21iby5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlpZiAoaXNQb3B1bGF0aW5nKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgdGFibGVUZXh0ID0gKChDQ29tYm8pIGUuZ2V0U291cmNlKCkpLmdldFRleHQoKTsKLQkJCQlpZiAodGFibGVUZXh0LmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQl0YWJsZVRleHQgPSBudWxsOwotCQkJCQlpZiAoZGlzY3JpbWluYXRvckNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkgPT0gbnVsbCB8fCBkaXNjcmltaW5hdG9yQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlpZiAodGFibGVUZXh0ICE9IG51bGwgJiYgY29tYm8uZ2V0SXRlbUNvdW50KCkgPiAwICYmIHRhYmxlVGV4dC5lcXVhbHMoY29tYm8uZ2V0SXRlbSgwKSkpIHsKLQkJCQkJdGFibGVUZXh0ID0gbnVsbDsKLQkJCQl9Ci0KLQkJCQlpZiAoZGlzY3JpbWluYXRvckNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkgPT0gbnVsbCAmJiB0YWJsZVRleHQgIT0gbnVsbCkgewotCQkJCQlkaXNjcmltaW5hdG9yQ29sdW1uLnNldFNwZWNpZmllZE5hbWUodGFibGVUZXh0KTsKLQkJCQl9Ci0JCQkJaWYgKGRpc2NyaW1pbmF0b3JDb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpICE9IG51bGwgJiYgIWRpc2NyaW1pbmF0b3JDb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpLmVxdWFscyh0YWJsZVRleHQpKSB7Ci0JCQkJCWRpc2NyaW1pbmF0b3JDb2x1bW4uc2V0U3BlY2lmaWVkTmFtZSh0YWJsZVRleHQpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCXJldHVybiBjb21ibzsKLQkJCi0JfQotCQotCXByaXZhdGUgQ0NvbWJvVmlld2VyIGJ1aWxkRGlzY3JpbWluYXRvclR5cGVDb21ibyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNDb21ibyBjb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8ocGFyZW50KTsKLQkJQ0NvbWJvVmlld2VyIGRpc2NyaW1pbmF0b3JUeXBlVmlld2VyID0gbmV3IENDb21ib1ZpZXdlcihjb21ibyk7Ci0JCWRpc2NyaW1pbmF0b3JUeXBlVmlld2VyLnNldExhYmVsUHJvdmlkZXIoYnVpbGREaXNjcmltaW5hdG9yVHlwZUxhYmVsUHJvdmlkZXIoKSk7Ci0JCWRpc2NyaW1pbmF0b3JUeXBlVmlld2VyLmFkZChEaXNjcmltaW5hdG9yVHlwZS5WQUxVRVMudG9BcnJheSgpKTsKLQkJCi0JCWRpc2NyaW1pbmF0b3JUeXBlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJSW5oZXJpdGFuY2VDb21wb3NpdGUudGhpcy5kaXNjcmltaW5hdG9yVHlwZVNlbGVjdGlvbkNoYW5nZWQoZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOwotCQkJfQotCQl9KTsKLQkJCi0JCXJldHVybiBkaXNjcmltaW5hdG9yVHlwZVZpZXdlcjsKLQl9Ci0JCi0JcHJpdmF0ZSBJQmFzZUxhYmVsUHJvdmlkZXIgYnVpbGREaXNjcmltaW5hdG9yVHlwZUxhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJaWYgKGVsZW1lbnQgPT0gRGlzY3JpbWluYXRvclR5cGUuREVGQVVMVCkgewotCQkJCQkvL1RPRE8gbmVlZCB0byBtb3ZlIHRoaXMgdG8gdGhlIG1vZGVsLCBkb24ndCB3YW50IGhhcmRjb2RlZCBTdHJpbmcKLQkJCQkJcmV0dXJuIE5MUy5iaW5kKEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Jbmhlcml0YW5jZUNvbXBvc2l0ZV9kZWZhdWx0RGlzY3JpbWluYXRvclR5cGUsICJTdHJpbmciKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHN1cGVyLmdldFRleHQoZWxlbWVudCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXZvaWQgZGlzY3JpbWluYXRvclR5cGVTZWxlY3Rpb25DaGFuZ2VkKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJRGlzY3JpbWluYXRvclR5cGUgZGlzY3JpbWluYXRvclR5cGUgPSAoRGlzY3JpbWluYXRvclR5cGUpICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQlpZiAoICEgdGhpcy5kaXNjcmltaW5hdG9yQ29sdW1uLmdldERpc2NyaW1pbmF0b3JUeXBlKCkuZXF1YWxzKGRpc2NyaW1pbmF0b3JUeXBlKSkgewotCQkJCXRoaXMuZGlzY3JpbWluYXRvckNvbHVtbi5zZXREaXNjcmltaW5hdG9yVHlwZShkaXNjcmltaW5hdG9yVHlwZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBDQ29tYm8gYnVpbGREaXNjcmltaW5hdG9yVmFsdWVDb21ibyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWZpbmFsIENDb21ibyBjb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8ocGFyZW50LCBTV1QuRkxBVCk7Ci0JCWNvbWJvLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCWlmIChpc1BvcHVsYXRpbmcoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBkaXNjcmltaW5hdG9yVmFsdWUgPSBlbnRpdHkuZ2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlKCk7Ci0JCQkJU3RyaW5nIHZhbHVlID0gKChDQ29tYm8pIGUuZ2V0U291cmNlKCkpLmdldFRleHQoKTsKLQkJCQlpZiAodmFsdWUuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCXZhbHVlID0gbnVsbDsKLQkJCQkJaWYgKGRpc2NyaW1pbmF0b3JWYWx1ZSA9PSBudWxsIHx8IGRpc2NyaW1pbmF0b3JWYWx1ZS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlpZiAodmFsdWUgIT0gbnVsbCAmJiBjb21iby5nZXRJdGVtQ291bnQoKSA+IDAgJiYgdmFsdWUuZXF1YWxzKGNvbWJvLmdldEl0ZW0oMCkpKSB7Ci0JCQkJCXZhbHVlID0gbnVsbDsKLQkJCQl9Ci0KLQkJCQlpZiAoZGlzY3JpbWluYXRvclZhbHVlID09IG51bGwgfHwgIWRpc2NyaW1pbmF0b3JWYWx1ZS5lcXVhbHModmFsdWUpKSB7Ci0JCQkJCWVudGl0eS5zZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWUodmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCXJldHVybiBjb21ibzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkb1BvcHVsYXRlKEVPYmplY3Qgb2JqKSB7Ci0JCXRoaXMuZW50aXR5ID0gKElFbnRpdHkpIG9iajsKLQkJaWYgKHRoaXMuZW50aXR5ICE9IG51bGwpIHsKLQkJCXRoaXMuZGlzY3JpbWluYXRvckNvbHVtbiA9IHRoaXMuZW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKTsKLQkJCXBvcHVsYXRlQ29sdW1uQ29tYm8oKTsKLQkJCXBvcHVwbGF0ZURpc2NyaW1pbmF0b3JUeXBlQ29tYm9WaWV3ZXIoKTsJCQkKLQkJCXBvcHVsYXRlU3RyYXRlZ3lDb21ib1ZpZXdlcigpOwotCQkJcG9wdWxhdGVEaXNjcmltaW5hdG9yVmFsdWVDb21ibygpOwotCQkJdGhpcy5wa0pvaW5Db2x1bW5zQ29tcG9zaXRlLnBvcHVsYXRlKHRoaXMuZW50aXR5KTsJCi0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLmRpc2NyaW1pbmF0b3JDb2x1bW4gPSBudWxsOwotCQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZSA9IG51bGw7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgZG9Qb3B1bGF0ZSgpIHsKLQkJaWYgKHRoaXMuZW50aXR5ICE9IG51bGwpIHsKLQkJCXBvcHVsYXRlQ29sdW1uQ29tYm8oKTsKLS8vCQkJcG9wdXBsYXRlU3RyYXRlZ3lDb21ib1ZpZXdlcigpOwotLy8JCQlwb3B1cGxhdGVEaXNjcmltaW5hdG9yVmFsdWVDb21ibygpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTGlzdGVuZXJzKCkgewotCQlpZiAodGhpcy5lbnRpdHkgIT0gbnVsbCkgewotCQkJdGhpcy5lbnRpdHkuZUFkYXB0ZXJzKCkuYWRkKHRoaXMuZW50aXR5TGlzdGVuZXIpOwotCQkJdGhpcy5kaXNjcmltaW5hdG9yQ29sdW1uLmVBZGFwdGVycygpLmFkZCh0aGlzLmRpc2NyaW1pbmF0b3JDb2x1bW5MaXN0ZW5lcik7Ci0JCQl0aGlzLmFkZENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZUxpc3RlbmVycygpIHsKLQkJaWYgKHRoaXMuZW50aXR5ICE9IG51bGwpIHsKLQkJCXRoaXMuZW50aXR5LmVBZGFwdGVycygpLnJlbW92ZSh0aGlzLmVudGl0eUxpc3RlbmVyKTsKLQkJCXRoaXMucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCQl0aGlzLmRpc2NyaW1pbmF0b3JDb2x1bW4uZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMuZGlzY3JpbWluYXRvckNvbHVtbkxpc3RlbmVyKTsKLQkJfQotCX0KLQotCXByaXZhdGUgQ29ubmVjdGlvblByb2ZpbGUgZ2V0Q29ubmVjdGlvblByb2ZpbGUoKSB7Ci0JCWlmKHRoaXMuY29ubmVjdGlvblByb2ZpbGUgPT0gbnVsbCkgewotCQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZSA9IHRoaXMuZW50aXR5LmdldEpwYVByb2plY3QoKS5jb25uZWN0aW9uUHJvZmlsZSgpOwotCQl9Ci0JCXJldHVybiB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRDb25uZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKS5hZGRDb25uZWN0aW9uTGlzdGVuZXIodGhpcy5jb25uZWN0aW9uTGlzdGVuZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKCkgewotCQl0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlKCkucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKHRoaXMuY29ubmVjdGlvbkxpc3RlbmVyKTsKLQl9Ci0KLQlwcml2YXRlIFRhYmxlIGdldERiVGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLmVudGl0eS5wcmltYXJ5RGJUYWJsZSgpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVDb2x1bW5Db21ibygpIHsKLQkJLy9UT0RPIGRvbid0IGRvIGluc3RhbmNlb2YgY2hlY2sgaGVyZSAtIGNoZWNrIG9uIFRhYmxlLCBvciBpc1Jvb3QgY2hlY2sgb24gRW50aXR5Ci0JCS8vdGhpcy50YWJsZUNvbWJvLnNldEVuYWJsZWQoISh0aGlzLnRhYmxlIGluc3RhbmNlb2YgU2luZ2xlVGFibGVJbmhlcml0YW5jZUNoaWxkVGFibGVJbXBsKSk7Ci0JCXBvcHVsYXRlRGVmYXVsdENvbHVtbk5hbWUoKTsKLQotCQlpZiAodGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZSgpLmlzQ29ubmVjdGVkKCkpIHsKLQkJCXRoaXMuY29sdW1uQ29tYm8ucmVtb3ZlKDEsIHRoaXMuY29sdW1uQ29tYm8uZ2V0SXRlbUNvdW50KCktMSk7Ci0JCQlUYWJsZSB0YWJsZSA9IGdldERiVGFibGUoKTsKLQkJCWlmICh0YWJsZSAhPSBudWxsKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpID0gQ29sbGVjdGlvblRvb2xzLnNvcnQoQ29sbGVjdGlvblRvb2xzLmxpc3QodGFibGUuY29sdW1uTmFtZXMoKSkpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCQl0aGlzLmNvbHVtbkNvbWJvLmFkZCgoU3RyaW5nKSBpLm5leHQoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5jb2x1bW5Db21iby5yZW1vdmUoMSwgdGhpcy5jb2x1bW5Db21iby5nZXRJdGVtQ291bnQoKS0xKTsKLQkJfQotCQlwb3B1bGF0ZUNvbHVtbk5hbWUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVEZWZhdWx0Q29sdW1uTmFtZSgpIHsKLQkJU3RyaW5nIGRlZmF1bHRUYWJsZU5hbWUgPSBkaXNjcmltaW5hdG9yQ29sdW1uLmdldERlZmF1bHROYW1lKCk7Ci0JCWludCBzZWxlY3Rpb25JbmRleCA9IGNvbHVtbkNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCWNvbHVtbkNvbWJvLnNldEl0ZW0oMCwgTkxTLmJpbmQoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkNvbHVtbkNvbXBvc2l0ZV9kZWZhdWx0V2l0aE9uZVBhcmFtLCBkZWZhdWx0VGFibGVOYW1lKSk7Ci0JCWlmIChzZWxlY3Rpb25JbmRleCA9PSAwKSB7Ci0JCQkvL2NvbWJvIHRleHQgZG9lcyBub3QgdXBkYXRlIHdoZW4gc3dpdGNoaW5nIGJldHdlZW4gMiBtYXBwaW5ncyBvZiB0aGUgc2FtZSB0eXBlCi0JCQkvL3RoYXQgYm90aCBoYXZlIGEgZGVmYXVsdCBjb2x1bW4gbmFtZS4gIGNsZWFyIHRoZSBzZWxlY3Rpb24gYW5kIHRoZW4gc2V0IGl0IGFnYWluCi0JCQljb2x1bW5Db21iby5jbGVhclNlbGVjdGlvbigpOwotCQkJY29sdW1uQ29tYm8uc2VsZWN0KDApOwotCQl9CQkKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVDb2x1bW5OYW1lKCkgewotCQlTdHJpbmcgdGFibGVOYW1lID0gdGhpcy5kaXNjcmltaW5hdG9yQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKTsKLQkJU3RyaW5nIGRlZmF1bHROYW1lID0gdGhpcy5kaXNjcmltaW5hdG9yQ29sdW1uLmdldERlZmF1bHROYW1lKCk7Ci0JCWlmICh0YWJsZU5hbWUgIT0gbnVsbCkgewotCQkJaWYgKCF0aGlzLmNvbHVtbkNvbWJvLmdldFRleHQoKS5lcXVhbHModGFibGVOYW1lKSkgewotCQkJCXRoaXMuY29sdW1uQ29tYm8uc2V0VGV4dCh0YWJsZU5hbWUpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKCF0aGlzLmNvbHVtbkNvbWJvLmdldFRleHQoKS5lcXVhbHMoTkxTLmJpbmQoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkNvbHVtbkNvbXBvc2l0ZV9kZWZhdWx0V2l0aE9uZVBhcmFtLCBkZWZhdWx0TmFtZSkpKSB7Ci0JCQkJdGhpcy5jb2x1bW5Db21iby5zZWxlY3QoMCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wdXBsYXRlRGlzY3JpbWluYXRvclR5cGVDb21ib1ZpZXdlcigpIHsKLQkJaWYgKHRoaXMuZGlzY3JpbWluYXRvckNvbHVtbi5nZXREaXNjcmltaW5hdG9yVHlwZSgpID09IERpc2NyaW1pbmF0b3JUeXBlLkRFRkFVTFQpIHsKLQkJCWlmICgoKFN0cnVjdHVyZWRTZWxlY3Rpb24pIHRoaXMuZGlzY3JpbWluYXRvclR5cGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpICE9IERpc2NyaW1pbmF0b3JUeXBlLkRFRkFVTFQpIHsKLQkJCQl0aGlzLmRpc2NyaW1pbmF0b3JUeXBlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihEaXNjcmltaW5hdG9yVHlwZS5ERUZBVUxUKSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAodGhpcy5kaXNjcmltaW5hdG9yQ29sdW1uLmdldERpc2NyaW1pbmF0b3JUeXBlKCkgPT0gRGlzY3JpbWluYXRvclR5cGUuQ0hBUikgewotCQkJaWYgKCgoU3RydWN0dXJlZFNlbGVjdGlvbikgdGhpcy5kaXNjcmltaW5hdG9yVHlwZVZpZXdlci5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCkgIT0gRGlzY3JpbWluYXRvclR5cGUuQ0hBUikgewotCQkJCXRoaXMuZGlzY3JpbWluYXRvclR5cGVWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKERpc2NyaW1pbmF0b3JUeXBlLkNIQVIpKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmICh0aGlzLmRpc2NyaW1pbmF0b3JDb2x1bW4uZ2V0RGlzY3JpbWluYXRvclR5cGUoKSA9PSBEaXNjcmltaW5hdG9yVHlwZS5JTlRFR0VSKSB7Ci0JCQlpZiAoKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0aGlzLmRpc2NyaW1pbmF0b3JUeXBlVmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKSAhPSBEaXNjcmltaW5hdG9yVHlwZS5JTlRFR0VSKSB7Ci0JCQkJdGhpcy5kaXNjcmltaW5hdG9yVHlwZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oRGlzY3JpbWluYXRvclR5cGUuSU5URUdFUikpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKCgoU3RydWN0dXJlZFNlbGVjdGlvbikgdGhpcy5kaXNjcmltaW5hdG9yVHlwZVZpZXdlci5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCkgIT0gRGlzY3JpbWluYXRvclR5cGUuU1RSSU5HKSB7Ci0JCQkJdGhpcy5kaXNjcmltaW5hdG9yVHlwZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oRGlzY3JpbWluYXRvclR5cGUuU1RSSU5HKSk7Ci0JCQl9Ci0JCX0JCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVTdHJhdGVneUNvbWJvVmlld2VyKCkgewotCQlpZiAodGhpcy5lbnRpdHkuZ2V0SW5oZXJpdGFuY2VTdHJhdGVneSgpID09IEluaGVyaXRhbmNlVHlwZS5ERUZBVUxUKSB7Ci0JCQlpZiAoKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0aGlzLnN0cmF0ZWd5Vmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKSAhPSBJbmhlcml0YW5jZVR5cGUuREVGQVVMVCkgewotCQkJCXRoaXMuc3RyYXRlZ3lWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKEluaGVyaXRhbmNlVHlwZS5ERUZBVUxUKSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAodGhpcy5lbnRpdHkuZ2V0SW5oZXJpdGFuY2VTdHJhdGVneSgpID09IEluaGVyaXRhbmNlVHlwZS5KT0lORUQpIHsKLQkJCWlmICgoKFN0cnVjdHVyZWRTZWxlY3Rpb24pIHRoaXMuc3RyYXRlZ3lWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpICE9IEluaGVyaXRhbmNlVHlwZS5KT0lORUQpIHsKLQkJCQl0aGlzLnN0cmF0ZWd5Vmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihJbmhlcml0YW5jZVR5cGUuSk9JTkVEKSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAodGhpcy5lbnRpdHkuZ2V0SW5oZXJpdGFuY2VTdHJhdGVneSgpID09IEluaGVyaXRhbmNlVHlwZS5TSU5HTEVfVEFCTEUpIHsKLQkJCWlmICgoKFN0cnVjdHVyZWRTZWxlY3Rpb24pIHRoaXMuc3RyYXRlZ3lWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpICE9IEluaGVyaXRhbmNlVHlwZS5TSU5HTEVfVEFCTEUpIHsKLQkJCQl0aGlzLnN0cmF0ZWd5Vmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihJbmhlcml0YW5jZVR5cGUuU0lOR0xFX1RBQkxFKSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0aGlzLnN0cmF0ZWd5Vmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKSAhPSBJbmhlcml0YW5jZVR5cGUuVEFCTEVfUEVSX0NMQVNTKSB7Ci0JCQkJdGhpcy5zdHJhdGVneVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oSW5oZXJpdGFuY2VUeXBlLlRBQkxFX1BFUl9DTEFTUykpOwotCQkJfQotCQl9CQkKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVEaXNjcmltaW5hdG9yVmFsdWVDb21ibygpIHsKLQkJU3RyaW5nIHNwZWNpZmllZFZhbHVlID0gdGhpcy5lbnRpdHkuZ2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlKCk7Ci0JCVN0cmluZyBkZWZhdWx0VmFsdWUgPSB0aGlzLmVudGl0eS5nZXREZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlKCk7Ci0KLQkJaWYgKHRoaXMuZW50aXR5LmRpc2NyaW1pbmF0b3JWYWx1ZUlzQWxsb3dlZCgpKSB7Ci0JCQl0aGlzLmRpc2NyaW1pbmF0b3JWYWx1ZUNvbWJvLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlpZiAodGhpcy5kaXNjcmltaW5hdG9yVmFsdWVDb21iby5nZXRJdGVtQ291bnQoKSA9PSAwKSB7Ci0JCQkJdGhpcy5kaXNjcmltaW5hdG9yVmFsdWVDb21iby5hZGQoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkRpc2NyaW1pbmF0b3JDb2x1bW5Db21wb3NpdGVfZGVmYXVsdEVtcHR5KTsKLQkJCX0KLQkJCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotCQkJCXRoaXMuZGlzY3JpbWluYXRvclZhbHVlQ29tYm8uc2V0SXRlbSgwLCBOTFMuYmluZChKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQ29sdW1uQ29tcG9zaXRlX2RlZmF1bHRXaXRoT25lUGFyYW0sIGRlZmF1bHRWYWx1ZSkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGhpcy5kaXNjcmltaW5hdG9yVmFsdWVDb21iby5zZXRJdGVtKDAsIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5EaXNjcmltaW5hdG9yQ29sdW1uQ29tcG9zaXRlX2RlZmF1bHRFbXB0eSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLmRpc2NyaW1pbmF0b3JWYWx1ZUNvbWJvLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJaWYgKHRoaXMuZGlzY3JpbWluYXRvclZhbHVlQ29tYm8uZ2V0SXRlbUNvdW50KCkgPT0gMSkgewotCQkJCXRoaXMuZGlzY3JpbWluYXRvclZhbHVlQ29tYm8uc2V0VGV4dCgiIik7Ci0JCQkJdGhpcy5kaXNjcmltaW5hdG9yVmFsdWVDb21iby5yZW1vdmVBbGwoKTsKLQkJCX0KLQkJfQotCQkJCi0JCWlmIChzcGVjaWZpZWRWYWx1ZSAhPSBudWxsKSB7Ci0JCQlpZiAoIXRoaXMuZGlzY3JpbWluYXRvclZhbHVlQ29tYm8uZ2V0VGV4dCgpLmVxdWFscyhzcGVjaWZpZWRWYWx1ZSkpIHsKLQkJCQl0aGlzLmRpc2NyaW1pbmF0b3JWYWx1ZUNvbWJvLnNldFRleHQoc3BlY2lmaWVkVmFsdWUpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJLy9jb21ibyB0ZXh0IGRvZXMgbm90IHVwZGF0ZSB3aGVuIHN3aXRjaGluZyBiZXR3ZWVuIDIgZW50aXRpZXMgdGhhdCBib3RoIGhhdmUgYSBkZWZhdWx0IGRpc2NyaW1pbmF0b3IgdmFsdWUuICAKLQkJCS8vY2xlYXIgdGhlIHNlbGVjdGlvbiBhbmQgdGhlbiBzZXQgaXQgYWdhaW4KLQkJCXRoaXMuZGlzY3JpbWluYXRvclZhbHVlQ29tYm8uY2xlYXJTZWxlY3Rpb24oKTsKLQkJCXRoaXMuZGlzY3JpbWluYXRvclZhbHVlQ29tYm8uc2VsZWN0KDApOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBlbnRpdHlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsJCi0JCWlmIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKElFbnRpdHkuY2xhc3MpID09IEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSUVOVElUWV9fSU5IRVJJVEFOQ0VfU1RSQVRFR1kpIHsKLQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlJbmhlcml0YW5jZVR5cGUgaW5oZXJpdGFuY2VUeXBlID0gZW50aXR5LmdldEluaGVyaXRhbmNlU3RyYXRlZ3koKTsKLQkJCQkJIGlmICgoKFN0cnVjdHVyZWRTZWxlY3Rpb24pIHN0cmF0ZWd5Vmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKSAhPSBpbmhlcml0YW5jZVR5cGUpIHsKLQkJCQkJCXN0cmF0ZWd5Vmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihpbmhlcml0YW5jZVR5cGUpKTsKLQkJCQkJfQkJCQkJCi0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJZWxzZSBpZiAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChJRW50aXR5LmNsYXNzKSA9PSBKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLklFTlRJVFlfX1NQRUNJRklFRF9ESVNDUklNSU5BVE9SX1ZBTFVFKSB7Ci0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlTdHJpbmcgZGlzY3JpbWluYXRvclZhbHVlID0gZW50aXR5LmdldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSgpOwotCQkJCQlpZiAoZGlzY3JpbWluYXRvclZhbHVlQ29tYm8uZ2V0VGV4dCgpID09IG51bGwgfHwgIWRpc2NyaW1pbmF0b3JWYWx1ZUNvbWJvLmdldFRleHQoKS5lcXVhbHMoZGlzY3JpbWluYXRvclZhbHVlKSkgewotCQkJCQkJaWYgKGRpc2NyaW1pbmF0b3JWYWx1ZSA9PSBudWxsKSB7Ci0JCQkJCQkJZGlzY3JpbWluYXRvclZhbHVlQ29tYm8uc2VsZWN0KDApOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJZGlzY3JpbWluYXRvclZhbHVlQ29tYm8uc2V0VGV4dChkaXNjcmltaW5hdG9yVmFsdWUpOwotCQkJCQkJfQotCQkJCQl9CQkJCi0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJZWxzZSBpZiAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChJRW50aXR5LmNsYXNzKSA9PSBKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLklFTlRJVFlfX0RFRkFVTFRfRElTQ1JJTUlOQVRPUl9WQUxVRSkgewotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChnZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJcG9wdWxhdGVEaXNjcmltaW5hdG9yVmFsdWVDb21ibygpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGlzY3JpbWluYXRvckNvbHVtbkNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlpZiAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChJTmFtZWRDb2x1bW4uY2xhc3MpID09IEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSU5BTUVEX0NPTFVNTl9fU1BFQ0lGSUVEX05BTUUpIHsKLQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCXBvcHVsYXRlQ29sdW1uTmFtZSgpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCWVsc2UgaWYgKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSU5hbWVkQ29sdW1uLmNsYXNzKSA9PSBKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLklOQU1FRF9DT0xVTU5fX0RFRkFVTFRfTkFNRSkgewotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChnZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJcG9wdWxhdGVEZWZhdWx0Q29sdW1uTmFtZSgpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0KLQkJZWxzZSBpZiAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChJRGlzY3JpbWluYXRvckNvbHVtbi5jbGFzcykgPT0gSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JRElTQ1JJTUlOQVRPUl9DT0xVTU5fX0RJU0NSSU1JTkFUT1JfVFlQRSkgewotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCURpc2NyaW1pbmF0b3JUeXBlIGRpc2NyaW1pbmF0b3JUeXBlID0gZGlzY3JpbWluYXRvckNvbHVtbi5nZXREaXNjcmltaW5hdG9yVHlwZSgpOwotCQkJCQlpZiAoKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBkaXNjcmltaW5hdG9yVHlwZVZpZXdlci5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCkgIT0gZGlzY3JpbWluYXRvclR5cGUpIHsKLQkJCQkJCWRpc2NyaW1pbmF0b3JUeXBlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihkaXNjcmltaW5hdG9yVHlwZSkpOwotCQkJCQl9CQkJCQkKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXRoaXMucGtKb2luQ29sdW1uc0NvbXBvc2l0ZS5kaXNwb3NlKCk7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0ludmVyc2VKb2luQ29sdW1uRGlhbG9nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0ludmVyc2VKb2luQ29sdW1uRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkNDVkMzcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9JbnZlcnNlSm9pbkNvbHVtbkRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklKb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSU11bHRpUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi1wdWJsaWMgY2xhc3MgSW52ZXJzZUpvaW5Db2x1bW5EaWFsb2cgZXh0ZW5kcyBKb2luQ29sdW1uSW5Kb2luVGFibGVEaWFsb2cgewotCi0JSW52ZXJzZUpvaW5Db2x1bW5EaWFsb2coU2hlbGwgcGFyZW50LCBJSm9pblRhYmxlIGpvaW5UYWJsZSkgewotCQlzdXBlcihwYXJlbnQsIGpvaW5UYWJsZSk7Ci0JfQotCi0JSW52ZXJzZUpvaW5Db2x1bW5EaWFsb2coU2hlbGwgcGFyZW50LCBJSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCXN1cGVyKHBhcmVudCwgam9pbkNvbHVtbik7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGl0bGUoKSB7Ci0JCXJldHVybiBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSW52ZXJzZUpvaW5Db2x1bW5EaWFsb2dfZWRpdEludmVyc2VKb2luQ29sdW1uOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZU5hbWVDb21ibygpIHsKLQkJaWYgKGdldEpvaW5UYWJsZSgpID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoZ2V0Sm9pbkNvbHVtbigpICE9IG51bGwpIHsKLQkJCWdldE5hbWVDb21ibygpLmFkZChOTFMuYmluZChKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSW52ZXJzZUpvaW5Db2x1bW5EaWFsb2dfZGVmYXVsdFdpdGhPbmVQYXJhbSwgZ2V0Sm9pbkNvbHVtbigpLmdldERlZmF1bHROYW1lKCkpKTsKLQkJfQotCQlUYWJsZSBqb2luREJUYWJsZSA9IGdldEpvaW5UYWJsZSgpLmRiVGFibGUoKTsKLQkJaWYgKGpvaW5EQlRhYmxlICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaSA9IGpvaW5EQlRhYmxlLmNvbHVtbk5hbWVzKCk7IGkuaGFzTmV4dCgpOyApIHsKLQkJCQlnZXROYW1lQ29tYm8oKS5hZGQoKFN0cmluZykgaS5uZXh0KCkpOwotCQkJfQotCQl9Ci0JCWlmIChnZXRKb2luQ29sdW1uKCkgIT0gbnVsbCAmJiBnZXRKb2luQ29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpICE9IG51bGwpIHsKLQkJCWdldE5hbWVDb21ibygpLnNldFRleHQoZ2V0Sm9pbkNvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlnZXROYW1lQ29tYm8oKS5zZWxlY3QoMCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZVJlZmVyZW5jZWROYW1lQ29tYm8oKSB7Ci0JCWlmIChnZXRKb2luVGFibGUoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGdldEpvaW5Db2x1bW4oKSAhPSBudWxsKSB7Ci0JCQlnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZUNvbWJvKCkuYWRkKE5MUy5iaW5kKEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5JbnZlcnNlSm9pbkNvbHVtbkRpYWxvZ19kZWZhdWx0V2l0aE9uZVBhcmFtLCBnZXRKb2luQ29sdW1uKCkuZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpKTsKLQkJfQotCQlJTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nIG11bHRpUmVsYXRpb25zaGlwTWFwcGluZyA9IChJTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nKSBnZXRKb2luVGFibGUoKS5lQ29udGFpbmVyKCk7Ci0JCUlFbnRpdHkgdGFyZ2V0RW50aXR5ID0gbXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCk7Ci0JCWlmICh0YXJnZXRFbnRpdHkgIT0gbnVsbCkgewotCQkJVGFibGUgcmVmZXJlbmNlZERiVGFibGUgPSB0YXJnZXRFbnRpdHkucHJpbWFyeURiVGFibGUoKTsKLQkJCWlmIChyZWZlcmVuY2VkRGJUYWJsZSAhPSBudWxsKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpID0gcmVmZXJlbmNlZERiVGFibGUuY29sdW1uTmFtZXMoKTsgaS5oYXNOZXh0KCk7ICkgewotCQkJCQlnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZUNvbWJvKCkuYWRkKChTdHJpbmcpIGkubmV4dCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGdldEpvaW5Db2x1bW4oKSAhPSBudWxsICYmIGdldEpvaW5Db2x1bW4oKS5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpICE9IG51bGwpIHsKLQkJCWdldFJlZmVyZW5jZWRDb2x1bW5OYW1lQ29tYm8oKS5zZXRUZXh0KGdldEpvaW5Db2x1bW4oKS5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJfQotCQllbHNlIHsKLQkJCWdldFJlZmVyZW5jZWRDb2x1bW5OYW1lQ29tYm8oKS5zZWxlY3QoMCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0pvaW5Db2x1bW5Db21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvSm9pbkNvbHVtbkNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGI1MmU0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvSm9pbkNvbHVtbkNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MaXN0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLkRlZmF1bHRUcnVlQm9vbGVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JQWJzdHJhY3RDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSUFic3RyYWN0Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JTmFtZWRDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSnBhQ29yZU1hcHBpbmdzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSUpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkJhc2VKcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgSm9pbkNvbHVtbkNvbXBvc2l0ZQotCWV4dGVuZHMgQmFzZUpwYUNvbXBvc2l0ZQotewotCXByaXZhdGUgSVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcgc2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzsKLQlwcml2YXRlIGZpbmFsIEFkYXB0ZXIgc2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ0xpc3RlbmVyOwotCXByaXZhdGUgZmluYWwgQWRhcHRlciBqb2luQ29sdW1uTGlzdGVuZXI7Ci0KLQotCXByaXZhdGUgR3JvdXAgam9pbkNvbHVtbnNHcm91cDsKLQlCdXR0b24gb3ZlcnJpZGVEZWZhdWx0Sm9pbkNvbHVtbnNDaGVja0JveDsKLQlMaXN0Vmlld2VyIGpvaW5Db2x1bW5zTGlzdFZpZXdlcjsKLQlwcml2YXRlIEJ1dHRvbiBqb2luQ29sdW1uc1JlbW92ZUJ1dHRvbjsKLQlwcml2YXRlIEJ1dHRvbiBqb2luQ29sdW1uc0VkaXRCdXR0b247Ci0JCi0KLQkKLQlwdWJsaWMgSm9pbkNvbHVtbkNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrLCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULk5VTEwsIGNvbW1hbmRTdGFjaywgd2lkZ2V0RmFjdG9yeSk7Ci0JCXRoaXMuc2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ0xpc3RlbmVyID0gYnVpbGRTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nTGlzdGVuZXIoKTsKLQkJdGhpcy5qb2luQ29sdW1uTGlzdGVuZXIgPSBidWlsZEpvaW5Db2x1bW5MaXN0ZW5lcigpOwotCX0KLQotCQotCXByaXZhdGUgQWRhcHRlciBidWlsZFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBBZGFwdGVySW1wbCgpIHsKLQkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkJCXNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgQWRhcHRlciBidWlsZEpvaW5Db2x1bW5MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBBZGFwdGVySW1wbCgpIHsKLQkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkJCWpvaW5Db2x1bW5DaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCi0JCXRoaXMub3ZlcnJpZGVEZWZhdWx0Sm9pbkNvbHVtbnNDaGVja0JveCA9IAotCQkJZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1dHRvbigKLQkJCQljb21wb3NpdGUsIAotCQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Kb2luQ29sdW1uQ29tcG9zaXRlX292ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5zLCAKLQkJCQlTV1QuQ0hFQ0spOwotCQl0aGlzLm92ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5zQ2hlY2tCb3guYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkvLyBkbyBub3RoaW5nCi0JCQl9Ci0JCQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWlmIChKb2luQ29sdW1uQ29tcG9zaXRlLnRoaXMub3ZlcnJpZGVEZWZhdWx0Sm9pbkNvbHVtbnNDaGVja0JveC5nZXRTZWxlY3Rpb24oKSkgewotCQkJCQlJSm9pbkNvbHVtbiBkZWZhdWx0Sm9pbkNvbHVtbiA9IEpvaW5Db2x1bW5Db21wb3NpdGUudGhpcy5zaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLmdldERlZmF1bHRKb2luQ29sdW1ucygpLmdldCgwKTsKLQkJCQkJU3RyaW5nIGNvbHVtbk5hbWUgPSBkZWZhdWx0Sm9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpOwotCQkJCQlTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBkZWZhdWx0Sm9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKTsKLQkJCQkJCi0JCQkJCUlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBKb2luQ29sdW1uQ29tcG9zaXRlLnRoaXMuc2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy5jcmVhdGVKb2luQ29sdW1uKDApOwotCQkJCQlKb2luQ29sdW1uQ29tcG9zaXRlLnRoaXMuc2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLmFkZChqb2luQ29sdW1uKTsKLQkJCQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKGNvbHVtbk5hbWUpOwotCQkJCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKHJlZmVyZW5jZWRDb2x1bW5OYW1lKTsKLQkJCQl9IGVsc2UgewotCQkJCQlKb2luQ29sdW1uQ29tcG9zaXRlLnRoaXMuc2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLmNsZWFyKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQl0aGlzLmpvaW5Db2x1bW5zR3JvdXAgPSAKLQkJCWdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVHcm91cCgKLQkJCQljb21wb3NpdGUsIAotCQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Kb2luQ29sdW1uQ29tcG9zaXRlX2pvaW5Db2x1bW4pOwotCQl0aGlzLmpvaW5Db2x1bW5zR3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gIG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXRoaXMuam9pbkNvbHVtbnNHcm91cC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCQotCQl0aGlzLmpvaW5Db2x1bW5zTGlzdFZpZXdlciA9IG5ldyBMaXN0Vmlld2VyKHRoaXMuam9pbkNvbHVtbnNHcm91cCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSk7Ci0JCXRoaXMuam9pbkNvbHVtbnNMaXN0Vmlld2VyLnNldENvbnRlbnRQcm92aWRlcihidWlsZEpvaW5Db2x1bW5zTGlzdENvbnRlbnRQcm92aWRlcigpKTsKLQkJdGhpcy5qb2luQ29sdW1uc0xpc3RWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihidWlsZEpvaW5Db2x1bW5zTGlzdExhYmVsUHJvdmlkZXIoKSk7Ci0JCWdyaWREYXRhID0gIG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbFNwYW4gPSAzOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQl0aGlzLmpvaW5Db2x1bW5zTGlzdFZpZXdlci5nZXRMaXN0KCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGhpcy5qb2luQ29sdW1uc0xpc3RWaWV3ZXIuZ2V0TGlzdCgpLCBJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19KT0lOX1RBQkxFX0NPTFVNTlMpOwotCQkKLQkJQnV0dG9uIGFkZEpvaW5Db2x1bW5CdXR0b24gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQnV0dG9uKHRoaXMuam9pbkNvbHVtbnNHcm91cCwgSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkpvaW5Db2x1bW5Db21wb3NpdGVfYWRkLCBTV1QuTk9ORSk7Ci0JCWdyaWREYXRhID0gIG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJYWRkSm9pbkNvbHVtbkJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJYWRkSm9pbkNvbHVtbkJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQkKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlhZGRKb2luQ29sdW1uKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJdGhpcy5qb2luQ29sdW1uc0VkaXRCdXR0b24gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQnV0dG9uKHRoaXMuam9pbkNvbHVtbnNHcm91cCwgSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkpvaW5Db2x1bW5Db21wb3NpdGVfZWRpdCwgU1dULk5PTkUpOwotCQl0aGlzLmpvaW5Db2x1bW5zRWRpdEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQkKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQllZGl0Sm9pbkNvbHVtbigpOwotCQkJfQotCQl9KTsKLQkJZ3JpZERhdGEgPSAgbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQl0aGlzLmpvaW5Db2x1bW5zRWRpdEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQl0aGlzLmpvaW5Db2x1bW5zUmVtb3ZlQnV0dG9uID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1dHRvbih0aGlzLmpvaW5Db2x1bW5zR3JvdXAsIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Kb2luQ29sdW1uQ29tcG9zaXRlX3JlbW92ZSwgU1dULk5PTkUpOwotCQlncmlkRGF0YSA9ICBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuQkVHSU5OSU5HOwotCQl0aGlzLmpvaW5Db2x1bW5zUmVtb3ZlQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl0aGlzLmpvaW5Db2x1bW5zUmVtb3ZlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl9Ci0JCQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXJlbW92ZUpvaW5Db2x1bW4oKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQl0aGlzLmpvaW5Db2x1bW5zTGlzdFZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCXVwZGF0ZUVuYWJsZW1lbnQoKTsKLQkJCX0KLQkJfSk7Ci0KLQl9Ci0JcHJpdmF0ZSBJQ29udGVudFByb3ZpZGVyIGJ1aWxkSm9pbkNvbHVtbnNMaXN0Q29udGVudFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyKCl7Ci0JCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJCQkvLyBkbyBub3RoaW5nCi0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJCS8vIGRvIG5vdGhpbmcKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQkJcmV0dXJuICgoSVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcpIGlucHV0RWxlbWVudCkuZ2V0Sm9pbkNvbHVtbnMoKS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgSUxhYmVsUHJvdmlkZXIgYnVpbGRKb2luQ29sdW1uc0xpc3RMYWJlbFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gKElKb2luQ29sdW1uKSBlbGVtZW50OwotCQkJCXJldHVybiAoSm9pbkNvbHVtbkNvbXBvc2l0ZS50aGlzLnNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5zaXplKCkgPT0gMCkgPwotCQkJCQlidWlsZERlZmF1bHRKb2luQ29sdW1uTGFiZWwoam9pbkNvbHVtbikKLQkJCQk6Ci0JCQkJCWJ1aWxkSm9pbkNvbHVtbkxhYmVsKGpvaW5Db2x1bW4pOwotCQkJfQotCQl9OwotCX0KLQkKLQlTdHJpbmcgYnVpbGREZWZhdWx0Sm9pbkNvbHVtbkxhYmVsKElKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJcmV0dXJuIE5MUy5iaW5kKEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Kb2luQ29sdW1uQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zRGVmYXVsdCwgam9pbkNvbHVtbi5nZXROYW1lKCksIGpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7CQkJCQotCX0KLQkKLQlTdHJpbmcgYnVpbGRKb2luQ29sdW1uTGFiZWwoSUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQlpZiAoam9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkgPT0gbnVsbCkgewotCQkJaWYgKGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIE5MUy5iaW5kKEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Kb2luQ29sdW1uQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zQm90aERlZmF1bHQsIGpvaW5Db2x1bW4uZ2V0TmFtZSgpLGpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7CQkJCQotCQkJfQotCQkJcmV0dXJuIE5MUy5iaW5kKEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Kb2luQ29sdW1uQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zRmlyc3REZWZhdWx0LCBqb2luQ29sdW1uLmdldE5hbWUoKSwgam9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJfQotCQllbHNlIGlmIChqb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIE5MUy5iaW5kKEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Kb2luQ29sdW1uQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zU2VjRGVmYXVsdCwgam9pbkNvbHVtbi5nZXROYW1lKCksIGpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7CQkJCQotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIE5MUy5iaW5kKEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Kb2luQ29sdW1uQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zLCBqb2luQ29sdW1uLmdldE5hbWUoKSwgam9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsJCQkJCQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGpvaW5Db2x1bW5DaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJaWYgKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSU5hbWVkQ29sdW1uLmNsYXNzKSA9PSBKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLklOQU1FRF9DT0xVTU5fX1NQRUNJRklFRF9OQU1FCi0JCQl8fCBub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKElOYW1lZENvbHVtbi5jbGFzcykgPT0gSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JTkFNRURfQ09MVU1OX19ERUZBVUxUX05BTUUKLQkJCXx8IG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSUFic3RyYWN0Q29sdW1uLmNsYXNzKSA9PSBKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLklBQlNUUkFDVF9DT0xVTU5fX1NQRUNJRklFRF9UQUJMRQotCQkJfHwgbm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChJQWJzdHJhY3RDb2x1bW4uY2xhc3MpID09IEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSUFCU1RSQUNUX0NPTFVNTl9fREVGQVVMVF9UQUJMRQotCQkJfHwgbm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChJQWJzdHJhY3RKb2luQ29sdW1uLmNsYXNzKSA9PSBKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLklBQlNUUkFDVF9KT0lOX0NPTFVNTl9fU1BFQ0lGSUVEX1JFRkVSRU5DRURfQ09MVU1OX05BTUUKLQkJCXx8IG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSUFic3RyYWN0Sm9pbkNvbHVtbi5jbGFzcykgPT0gSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JQUJTVFJBQ1RfSk9JTl9DT0xVTU5fX0RFRkFVTFRfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSkgewotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChnZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJam9pbkNvbHVtbnNMaXN0Vmlld2VyLnJlZnJlc2goKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCXZvaWQgYWRkSm9pbkNvbHVtbigpIHsKLQkJSm9pbkNvbHVtbkRpYWxvZyBkaWFsb2cgPSBuZXcgSm9pbkNvbHVtbkluUmVsYXRpb25zaGlwTWFwcGluZ0RpYWxvZyh0aGlzLmdldENvbnRyb2woKS5nZXRTaGVsbCgpLCB0aGlzLnNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcpOwotCQl0aGlzLmFkZEpvaW5Db2x1bW5Gcm9tRGlhbG9nKGRpYWxvZyk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRKb2luQ29sdW1uRnJvbURpYWxvZyhKb2luQ29sdW1uRGlhbG9nIGRpYWxvZykgewotCQlpZiAoZGlhbG9nLm9wZW4oKSAhPSBXaW5kb3cuT0spIHsKLQkJCXJldHVybjsKLQkJfQotCQlpbnQgaW5kZXggPSB0aGlzLnNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5zaXplKCk7Ci0JCUlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSB0aGlzLnNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcuY3JlYXRlSm9pbkNvbHVtbihpbmRleCk7Ci0JCXRoaXMuc2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLmFkZChqb2luQ29sdW1uKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKGRpYWxvZy5nZXRTZWxlY3RlZE5hbWUoKSk7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoZGlhbG9nLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlpZiAoIWRpYWxvZy5pc0RlZmF1bHRUYWJsZVNlbGVjdGVkKCkpIHsKLQkJCS8vbm90IGNoZWNraW5nIHRoaXMgZm9yIG5hbWUgYW5kIHJlZmVyZW5jZWQgY29sdW1uIG5hbWUgYmVjYXVzZSB0aGVyZSBpcyBubwotCQkJLy9kZWZhdWx0IG9wdGlvbiB3aGVuIHlvdSBhcmUgYWRkaW5nIGEgc2Vjb25kIGpvaW4gY29sdW1uLiAgVGhlcmUgaXMgYWx3YXlzCi0JCQkvL2F0IGxlYXN0IDEgam9pbiBjb2x1bW4gKHRoZSBkZWZhdWx0KQotCQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRUYWJsZShkaWFsb2cuZ2V0U2VsZWN0ZWRUYWJsZSgpKTsKLQkJfQotCX0KLQkKLQl2b2lkIGVkaXRKb2luQ29sdW1uKCkgewotCQlJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gZ2V0U2VsZWN0ZWRKb2luQ29sdW1uKCk7Ci0JCUpvaW5Db2x1bW5EaWFsb2cgZGlhbG9nID0gbmV3IEpvaW5Db2x1bW5JblJlbGF0aW9uc2hpcE1hcHBpbmdEaWFsb2codGhpcy5nZXRDb250cm9sKCkuZ2V0U2hlbGwoKSwgam9pbkNvbHVtbik7Ci0JCWVkaXRKb2luQ29sdW1uRnJvbURpYWxvZyhkaWFsb2csIGpvaW5Db2x1bW4pOwotCX0KLQkKLQlwcml2YXRlIElKb2luQ29sdW1uIGdldFNlbGVjdGVkSm9pbkNvbHVtbigpIHsKLQkJcmV0dXJuIChJSm9pbkNvbHVtbikgKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0aGlzLmpvaW5Db2x1bW5zTGlzdFZpZXdlci5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGVkaXRKb2luQ29sdW1uRnJvbURpYWxvZyhKb2luQ29sdW1uRGlhbG9nIGRpYWxvZywgSUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCWVkaXRKb2luQ29sdW1uRGlhbG9nT2tkKGRpYWxvZywgam9pbkNvbHVtbik7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGVkaXRKb2luQ29sdW1uRGlhbG9nT2tkKEpvaW5Db2x1bW5EaWFsb2cgZGlhbG9nLCBJSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCVN0cmluZyBuYW1lID0gZGlhbG9nLmdldFNlbGVjdGVkTmFtZSgpOwotCQlTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBkaWFsb2cuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKTsKLQkJU3RyaW5nIHRhYmxlID0gZGlhbG9nLmdldFNlbGVjdGVkVGFibGUoKTsKLQotCQlpZiAoZGlhbG9nLmlzRGVmYXVsdE5hbWVTZWxlY3RlZCgpKSB7Ci0JCQlpZiAoam9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkgIT0gbnVsbCkgewotCQkJCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChqb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSA9PSBudWxsIHx8ICFqb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKS5lcXVhbHMobmFtZSkpewotCQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKG5hbWUpOwotCQl9Ci0JCWlmIChkaWFsb2cuaXNEZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWVTZWxlY3RlZCgpKSB7Ci0JCQlpZiAoam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpICE9IG51bGwpIHsKLQkJCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKG51bGwpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSA9PSBudWxsIHx8ICFqb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkuZXF1YWxzKHJlZmVyZW5jZWRDb2x1bW5OYW1lKSl7Ci0JCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKHJlZmVyZW5jZWRDb2x1bW5OYW1lKTsKLQkJfQotCQkKLQkJaWYgKGRpYWxvZy5pc0RlZmF1bHRUYWJsZVNlbGVjdGVkKCkpIHsKLQkJCWlmIChqb2luQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkgIT0gbnVsbCkgewotCQkJCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkVGFibGUobnVsbCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpID09IG51bGwgfHwgIWpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKS5lcXVhbHModGFibGUpKXsKLQkJCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkVGFibGUodGFibGUpOwotCQl9Ci0KLQkJRGVmYXVsdFRydWVCb29sZWFuIGluc2VydGFibGUgPSBkaWFsb2cuZ2V0SW5zZXJ0YWJsZSgpOwotCQlpZiAoam9pbkNvbHVtbi5nZXRJbnNlcnRhYmxlKCkgIT0gaW5zZXJ0YWJsZSkgewotCQkJam9pbkNvbHVtbi5zZXRJbnNlcnRhYmxlKGluc2VydGFibGUpOwotCQl9Ci0KLQkJRGVmYXVsdFRydWVCb29sZWFuIHVwZGF0YWJsZSA9IGRpYWxvZy5nZXRVcGRhdGFibGUoKTsKLQkJaWYgKGpvaW5Db2x1bW4uZ2V0VXBkYXRhYmxlKCkgIT0gdXBkYXRhYmxlKSB7Ci0JCQlqb2luQ29sdW1uLnNldFVwZGF0YWJsZSh1cGRhdGFibGUpOwotCQl9Ci0JfQotCQotCXZvaWQgcmVtb3ZlSm9pbkNvbHVtbigpIHsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB0aGlzLmpvaW5Db2x1bW5zTGlzdFZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCWZvciAoSXRlcmF0b3Igc3RyZWFtID0gKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJCXRoaXMuc2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLnJlbW92ZShzdHJlYW0ubmV4dCgpKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nQ2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCWlmIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKElTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLmNsYXNzKSA9PSBKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLklTSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfX1NQRUNJRklFRF9KT0lOX0NPTFVNTlMpIHsKLQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCUpvaW5Db2x1bW5Db21wb3NpdGUudGhpcy5qb2luQ29sdW1uc0xpc3RWaWV3ZXIucmVmcmVzaCgpOwotCQkJCQlKb2luQ29sdW1uQ29tcG9zaXRlLnRoaXMub3ZlcnJpZGVEZWZhdWx0Sm9pbkNvbHVtbnNDaGVja0JveC5zZXRTZWxlY3Rpb24oc2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy5jb250YWluc1NwZWNpZmllZEpvaW5Db2x1bW5zKCkpOwotCQkJCQlKb2luQ29sdW1uQ29tcG9zaXRlLnRoaXMudXBkYXRlRW5hYmxlbWVudCgpOwotCQkJCX0KLQkJCX0pOwotCQkJaWYgKG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uQUREKSB7Ci0JCQkJKChJSm9pbkNvbHVtbikgbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCkpLmVBZGFwdGVycygpLmFkZCh0aGlzLmpvaW5Db2x1bW5MaXN0ZW5lcik7Ci0JCQl9Ci0JCQllbHNlIGlmIChub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLlJFTU9WRSkgewotCQkJCSgoSUpvaW5Db2x1bW4pIG5vdGlmaWNhdGlvbi5nZXRPbGRWYWx1ZSgpKS5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcy5qb2luQ29sdW1uTGlzdGVuZXIpOwkJCQkKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgZW5hYmxlR3JvdXAoR3JvdXAgZ3JvdXAsIGJvb2xlYW4gZW5hYmxlZCkgewotCQlncm91cC5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGdyb3VwLmdldENoaWxkcmVuKCkubGVuZ3RoOyBpKyspIHsKLQkJCWdyb3VwLmdldENoaWxkcmVuKClbaV0uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJfQkKLQl9Ci0KLQkKLQkKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VMaXN0ZW5lcnMoKSB7Ci0JCWlmICh0aGlzLnNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcgIT0gbnVsbCkgewotCQkJdGhpcy5zaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLmVBZGFwdGVycygpLmFkZCh0aGlzLnNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdMaXN0ZW5lcik7Ci0JCQlmb3IgKEl0ZXJhdG9yIGkgPSB0aGlzLnNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7Ci0JCQkJKChJSm9pbkNvbHVtbikgaS5uZXh0KCkpLmVBZGFwdGVycygpLmFkZCh0aGlzLmpvaW5Db2x1bW5MaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTGlzdGVuZXJzKCkgewotCQlpZiAodGhpcy5zaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaSA9IHRoaXMuc2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApIHsKLQkJCQkoKElKb2luQ29sdW1uKSBpLm5leHQoKSkuZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMuam9pbkNvbHVtbkxpc3RlbmVyKTsKLQkJCX0KLQkJCXRoaXMuc2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcy5zaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nTGlzdGVuZXIpOwotCQl9Ci0JfQotCQkKLQlwdWJsaWMgdm9pZCBkb1BvcHVsYXRlKEVPYmplY3Qgb2JqKSB7Ci0JCXRoaXMuc2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZyA9IChJU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZykgb2JqOwotCQlpZiAodGhpcy5zaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nID09IG51bGwpIHsKLQkJCXRoaXMuam9pbkNvbHVtbnNMaXN0Vmlld2VyLnNldElucHV0KG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQl0aGlzLmpvaW5Db2x1bW5zTGlzdFZpZXdlci5zZXRJbnB1dCh0aGlzLnNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcpOwotCQkKLQotCQl1cGRhdGVFbmFibGVtZW50KCk7Ci0JCXRoaXMub3ZlcnJpZGVEZWZhdWx0Sm9pbkNvbHVtbnNDaGVja0JveC5zZXRTZWxlY3Rpb24odGhpcy5zaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLmNvbnRhaW5zU3BlY2lmaWVkSm9pbkNvbHVtbnMoKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvUG9wdWxhdGUoKSB7Ci0JCXRoaXMuam9pbkNvbHVtbnNMaXN0Vmlld2VyLnNldElucHV0KHRoaXMuc2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZyk7CQkKLQl9Ci0JCi0Jdm9pZCB1cGRhdGVFbmFibGVtZW50KCkgewotCQlib29sZWFuIGdyb3VwRW5hYmxlZFN0YXRlID0gdGhpcy5zaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLmNvbnRhaW5zU3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQkJZW5hYmxlR3JvdXAodGhpcy5qb2luQ29sdW1uc0dyb3VwLCBncm91cEVuYWJsZWRTdGF0ZSk7Ci0KLQkJdGhpcy5qb2luQ29sdW1uc1JlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKGdyb3VwRW5hYmxlZFN0YXRlICYmICEoKFN0cnVjdHVyZWRTZWxlY3Rpb24pIHRoaXMuam9pbkNvbHVtbnNMaXN0Vmlld2VyLmdldFNlbGVjdGlvbigpKS5pc0VtcHR5KCkpOwotCQl0aGlzLmpvaW5Db2x1bW5zRWRpdEJ1dHRvbi5zZXRFbmFibGVkKGdyb3VwRW5hYmxlZFN0YXRlICYmICgoU3RydWN0dXJlZFNlbGVjdGlvbikgdGhpcy5qb2luQ29sdW1uc0xpc3RWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLnNpemUoKSA9PSAxKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJZGlzZW5nYWdlTGlzdGVuZXJzKCk7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0pvaW5Db2x1bW5EaWFsb2cuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvSm9pbkNvbHVtbkRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzZiMTllLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvSm9pbkNvbHVtbkRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLkRlZmF1bHRUcnVlQm9vbGVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5Jbmhlcml0YW5jZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLlNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSUpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSVdvcmtiZW5jaEhlbHBTeXN0ZW07Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKb2luQ29sdW1uRGlhbG9nIGV4dGVuZHMgQWJzdHJhY3RKb2luQ29sdW1uRGlhbG9nPElKb2luQ29sdW1uPiB7Ci0JCi0JcHJpdmF0ZSBDb21ibyB0YWJsZUNvbWJvOwotCXByaXZhdGUgQ29tYm9WaWV3ZXIgaW5zZXJ0YWJsZUNvbWJvVmlld2VyOwotCXByaXZhdGUgQ29tYm9WaWV3ZXIgdXBkYXRhYmxlQ29tYm9WaWV3ZXI7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZGVmYXVsdFRhYmxlU2VsZWN0ZWQ7Ci0JcHJpdmF0ZSBTdHJpbmcgc2VsZWN0ZWRUYWJsZTsKLQlwcml2YXRlIERlZmF1bHRUcnVlQm9vbGVhbiBpbnNlcnRhYmxlOwotCXByaXZhdGUgRGVmYXVsdFRydWVCb29sZWFuIHVwZGF0YWJsZTsKLQkKLQlKb2luQ29sdW1uRGlhbG9nKFNoZWxsIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCUpvaW5Db2x1bW5EaWFsb2coU2hlbGwgcGFyZW50LCBJSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCXN1cGVyKHBhcmVudCwgam9pbkNvbHVtbik7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUlXb3JrYmVuY2hIZWxwU3lzdGVtIGhlbHBTeXN0ZW0gPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKTsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkKLQkJTGFiZWwgdGFibGVMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5MRUZUKTsKLQkJdGFibGVMYWJlbC5zZXRUZXh0KEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Kb2luQ29sdW1uRGlhbG9nX3RhYmxlKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJdGFibGVMYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQl0aGlzLnRhYmxlQ29tYm8gPSBuZXcgQ29tYm8oY29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0JCXRoaXMudGFibGVDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJcG9wdWxhdGVOYW1lQ29tYm8oKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJcG9wdWxhdGVOYW1lQ29tYm8oKTsKLQkJCX0KLQkJfSk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCXRoaXMudGFibGVDb21iby5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJLy9QbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRoaXMudGFibGVDb21ibywgSUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfSk9JTl9SRUZFUkVOQ0VEX0NPTFVNTik7Ci0JCXBvcHVsYXRlVGFibGVDb21ibygpOwotCi0JCUxhYmVsIGluc2VydGFibGVMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5MRUZUKTsKLQkJaW5zZXJ0YWJsZUxhYmVsLnNldFRleHQoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkpvaW5Db2x1bW5EaWFsb2dfaW5zZXJ0YWJsZSk7Ci0JCWluc2VydGFibGVMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQkJCi0JCXRoaXMuaW5zZXJ0YWJsZUNvbWJvVmlld2VyID0gdGhpcy5idWlsZEluc2VydGFibGVDb21ib1ZpZXdlcihjb21wb3NpdGUpOwotCQl0aGlzLmluc2VydGFibGVDb21ib1ZpZXdlci5nZXRDb21ibygpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCkpOwotCQloZWxwU3lzdGVtLnNldEhlbHAodGhpcy5pbnNlcnRhYmxlQ29tYm9WaWV3ZXIuZ2V0Q29tYm8oKSwgSUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfQ09MVU1OX0lOU0VSVEFCTEUpOwotCQotCQlMYWJlbCB1cGRhdGFibGVMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5MRUZUKTsKLQkJdXBkYXRhYmxlTGFiZWwuc2V0VGV4dChKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSm9pbkNvbHVtbkRpYWxvZ191cGRhdGFibGUpOwotCQl1cGRhdGFibGVMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQkJCi0JCXRoaXMudXBkYXRhYmxlQ29tYm9WaWV3ZXIgPSB0aGlzLmJ1aWxkVXBkYXRhYmxlQ29tYm9WaWV3ZXIoY29tcG9zaXRlKTsKLQkJdGhpcy51cGRhdGFibGVDb21ib1ZpZXdlci5nZXRDb21ibygpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCkpOwotCQloZWxwU3lzdGVtLnNldEhlbHAodGhpcy51cGRhdGFibGVDb21ib1ZpZXdlci5nZXRDb21ibygpLCBJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19DT0xVTU5fVVBEQVRBQkxFKTsKLQkKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcml2YXRlIENvbWJvVmlld2VyIGJ1aWxkSW5zZXJ0YWJsZUNvbWJvVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tYm9WaWV3ZXIgdmlld2VyID0gbmV3IENvbWJvVmlld2VyKHBhcmVudCwgU1dULlJFQURfT05MWSk7Ci0JCXZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGJ1aWxkRGVmYXVsdFRydWVMYWJlbFByb3ZpZGVyKCkpOwotCQl2aWV3ZXIuYWRkKERlZmF1bHRUcnVlQm9vbGVhbi5WQUxVRVMudG9BcnJheSgpKTsKLQkJCi0JCURlZmF1bHRUcnVlQm9vbGVhbiBzZWwgPSAodGhpcy5qb2luQ29sdW1uKCkgPT0gbnVsbCkgPyBEZWZhdWx0VHJ1ZUJvb2xlYW4uREVGQVVMVCA6IHRoaXMuam9pbkNvbHVtbigpLmdldEluc2VydGFibGUoKTsKLQkJdmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzZWwpKTsKLQkJcmV0dXJuIHZpZXdlcjsKLQl9Ci0JCi0JcHJpdmF0ZSBJQmFzZUxhYmVsUHJvdmlkZXIgYnVpbGREZWZhdWx0VHJ1ZUxhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJaWYgKGVsZW1lbnQgPT0gRGVmYXVsdFRydWVCb29sZWFuLkRFRkFVTFQpIHsKLQkJCQkJLy9UT0RPIG5lZWQgdG8gbW92ZSB0aGlzIHRvIHRoZSBtb2RlbCwgZG9uJ3Qgd2FudCBoYXJkY29kZWQgU3RyaW5nCi0JCQkJCXJldHVybiBOTFMuYmluZChKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSm9pbkNvbHVtbkRpYWxvZ19kZWZhdWx0VHJ1ZSwgIlRydWUiKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHN1cGVyLmdldFRleHQoZWxlbWVudCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21ib1ZpZXdlciBidWlsZFVwZGF0YWJsZUNvbWJvVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tYm9WaWV3ZXIgdmlld2VyID0gbmV3IENvbWJvVmlld2VyKHBhcmVudCwgU1dULlJFQURfT05MWSk7Ci0JCXZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGJ1aWxkRGVmYXVsdFRydWVMYWJlbFByb3ZpZGVyKCkpOwotCQl2aWV3ZXIuYWRkKERlZmF1bHRUcnVlQm9vbGVhbi5WQUxVRVMudG9BcnJheSgpKTsKLQkJRGVmYXVsdFRydWVCb29sZWFuIHNlbCA9ICh0aGlzLmpvaW5Db2x1bW4oKSA9PSBudWxsKSA/IERlZmF1bHRUcnVlQm9vbGVhbi5ERUZBVUxUIDogdGhpcy5qb2luQ29sdW1uKCkuZ2V0VXBkYXRhYmxlKCk7Ci0JCXZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc2VsKSk7Ci0JCXJldHVybiB2aWV3ZXI7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlVGFibGVDb21ibygpIHsKLQkJdGhpcy50YWJsZUNvbWJvLmFkZChOTFMuYmluZChKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSm9pbkNvbHVtbkRpYWxvZ19kZWZhdWx0V2l0aE9uZVBhcmFtLCBkZWZhdWx0VGFibGVOYW1lKCkpKTsKLQkJU2NoZW1hIHNjaGVtYSA9IHRoaXMuZ2V0U2NoZW1hKCk7Ci0JCWlmIChzY2hlbWEgIT0gbnVsbCkgewotCQkJSXRlcmF0b3I8U3RyaW5nPiB0YWJsZXMgPSBzY2hlbWEudGFibGVOYW1lcygpOwotCQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IENvbGxlY3Rpb25Ub29scy5zb3J0KCB0YWJsZXMpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCQl0aGlzLnRhYmxlQ29tYm8uYWRkKHN0cmVhbS5uZXh0KCkpOwotCQkJfQotCQl9Ci0JCWlmIChzcGVjaWZpZWRUYWJsZU5hbWUoKSAhPSBudWxsKSB7Ci0JCQl0aGlzLnRhYmxlQ29tYm8uc2V0VGV4dChzcGVjaWZpZWRUYWJsZU5hbWUoKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLnRhYmxlQ29tYm8uc2VsZWN0KDApOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZGVmYXVsdFRhYmxlTmFtZSgpOwotCQotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkVGFibGVOYW1lKCkgewotCQlpZiAoZ2V0Sm9pbkNvbHVtbigpICE9IG51bGwpIHsKLQkJCXJldHVybiBnZXRKb2luQ29sdW1uKCkuZ2V0U3BlY2lmaWVkVGFibGUoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyB0YWJsZU5hbWUoKSB7Ci0JCWlmICh0aGlzLnRhYmxlQ29tYm8gIT0gbnVsbCkgewotCQkJaWYgKHRoaXMudGFibGVDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpID09IDApIHsKLQkJCQlyZXR1cm4gZGVmYXVsdFRhYmxlTmFtZSgpOwotCQkJfQotCQkJcmV0dXJuIHRoaXMudGFibGVDb21iby5nZXRUZXh0KCk7Ci0JCX0KLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZFRhYmxlTmFtZSgpID09IG51bGwpID8gZGVmYXVsdFRhYmxlTmFtZSgpIDogdGhpcy5zcGVjaWZpZWRUYWJsZU5hbWUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IFNjaGVtYSBnZXRTY2hlbWEoKTsKLQkKLQlwcml2YXRlIElKb2luQ29sdW1uIGpvaW5Db2x1bW4oKSB7Ci0JCXJldHVybiB0aGlzLmdldEpvaW5Db2x1bW4oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0RlZmF1bHRUYWJsZVNlbGVjdGVkKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0VGFibGVTZWxlY3RlZDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNlbGVjdGVkVGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLnNlbGVjdGVkVGFibGU7Ci0JfQotCi0JcHVibGljIERlZmF1bHRUcnVlQm9vbGVhbiBnZXRJbnNlcnRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5pbnNlcnRhYmxlOwotCX0KLQotCXB1YmxpYyBEZWZhdWx0VHJ1ZUJvb2xlYW4gZ2V0VXBkYXRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy51cGRhdGFibGU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2xvc2UoKSB7Ci0JCXRoaXMuZGVmYXVsdFRhYmxlU2VsZWN0ZWQgPSB0aGlzLnRhYmxlQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSA9PSAwOwotCQl0aGlzLnNlbGVjdGVkVGFibGUgPSB0aGlzLnRhYmxlQ29tYm8uZ2V0VGV4dCgpOwotCi0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gdGhpcy5pbnNlcnRhYmxlQ29tYm9WaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJdGhpcy5pbnNlcnRhYmxlID0gKERlZmF1bHRUcnVlQm9vbGVhbikgKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJfQotCi0JCXNlbGVjdGlvbiA9IHRoaXMudXBkYXRhYmxlQ29tYm9WaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJdGhpcy51cGRhdGFibGUgPSAoRGVmYXVsdFRydWVCb29sZWFuKSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOwotCQl9Ci0KLQkJcmV0dXJuIHN1cGVyLmNsb3NlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0pvaW5Db2x1bW5JbkFzc29jaWF0aW9uT3ZlcnJpZGVEaWFsb2cuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvSm9pbkNvbHVtbkluQXNzb2NpYXRpb25PdmVycmlkZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzI0YTk1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvSm9pbkNvbHVtbkluQXNzb2NpYXRpb25PdmVycmlkZURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklBc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSVJlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLlNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLXB1YmxpYyBjbGFzcyBKb2luQ29sdW1uSW5Bc3NvY2lhdGlvbk92ZXJyaWRlRGlhbG9nIGV4dGVuZHMgSm9pbkNvbHVtbkRpYWxvZyB7Ci0KLQlwcml2YXRlIElBc3NvY2lhdGlvbk92ZXJyaWRlIGFzc29jaWF0aW9uT3ZlcnJpZGU7Ci0JCi0JSm9pbkNvbHVtbkluQXNzb2NpYXRpb25PdmVycmlkZURpYWxvZyhTaGVsbCBwYXJlbnQsIElBc3NvY2lhdGlvbk92ZXJyaWRlIGFzc29jaWF0aW9uT3ZlcnJpZGUpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlID0gYXNzb2NpYXRpb25PdmVycmlkZTsKLQl9Ci0KLQlKb2luQ29sdW1uSW5Bc3NvY2lhdGlvbk92ZXJyaWRlRGlhbG9nKFNoZWxsIHBhcmVudCwgSUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQlzdXBlcihwYXJlbnQsIGpvaW5Db2x1bW4pOwotCQl0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGUgPSAoSUFzc29jaWF0aW9uT3ZlcnJpZGUpIGpvaW5Db2x1bW4uZUNvbnRhaW5lcigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU2NoZW1hIGdldFNjaGVtYSgpIHsKLQkJcmV0dXJuIHRoaXMuYXNzb2NpYXRpb25PdmVycmlkZS50eXBlTWFwcGluZygpLmRiU2NoZW1hKCk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFRhYmxlTmFtZSgpIHsKLQkJaWYgKGdldEpvaW5Db2x1bW4oKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0Sm9pbkNvbHVtbigpLmdldERlZmF1bHRUYWJsZSgpOwotCQl9Ci0JCXJldHVybiB0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGUudHlwZU1hcHBpbmcoKS5nZXRUYWJsZU5hbWUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGFibGUgZ2V0TmFtZVRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlLnR5cGVNYXBwaW5nKCkucHJpbWFyeURiVGFibGUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFRhYmxlIGdldFJlZmVyZW5jZWROYW1lVGFibGUoKSB7Ci0JCUlBdHRyaWJ1dGVNYXBwaW5nIGF0dHJpYnV0ZU1hcHBpbmcgPSB0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0T3duZXIoKS5hdHRyaWJ1dGVNYXBwaW5nKHRoaXMuYXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlpZiAoYXR0cmlidXRlTWFwcGluZyA9PSBudWxsIHx8ICEoYXR0cmlidXRlTWFwcGluZyBpbnN0YW5jZW9mIElSZWxhdGlvbnNoaXBNYXBwaW5nKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSUVudGl0eSB0YXJnZXRFbnRpdHkgPSAoKElSZWxhdGlvbnNoaXBNYXBwaW5nKSBhdHRyaWJ1dGVNYXBwaW5nKS5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpOwotCQlpZiAodGFyZ2V0RW50aXR5ICE9IG51bGwpIHsKLQkJCXJldHVybiB0YXJnZXRFbnRpdHkucHJpbWFyeURiVGFibGUoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvSm9pbkNvbHVtbkluSm9pblRhYmxlRGlhbG9nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0pvaW5Db2x1bW5JbkpvaW5UYWJsZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YThhNzQ3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvSm9pbkNvbHVtbkluSm9pblRhYmxlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSUpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLy9pZiB0aGVyZSBpcyBvbmx5IDEgam9pbkNvbHVtbiBhbmQgdGhlIHVzZXIgaXMgZWRpdGluZyBpdCwgdGhleSBzaG91bGQgYmUKLS8vYWJsZSB0byBkZWZpbmUgZGVmYXVsdHMuICBvdGhlcndpc2UsIHdlIHByb2JhYmx5IHNob3VsZG4ndCBhbGxvdyBpdC4KLXB1YmxpYyBjbGFzcyBKb2luQ29sdW1uSW5Kb2luVGFibGVEaWFsb2cgZXh0ZW5kcyBBYnN0cmFjdEpvaW5Db2x1bW5EaWFsb2c8SUpvaW5Db2x1bW4+IHsKLQotCXByaXZhdGUgSUpvaW5UYWJsZSBqb2luVGFibGU7Ci0JCi0JSm9pbkNvbHVtbkluSm9pblRhYmxlRGlhbG9nKFNoZWxsIHBhcmVudCwgSUpvaW5UYWJsZSBqb2luVGFibGUpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5qb2luVGFibGUgPSBqb2luVGFibGU7Ci0JfQotCi0JSm9pbkNvbHVtbkluSm9pblRhYmxlRGlhbG9nKFNoZWxsIHBhcmVudCwgSUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQlzdXBlcihwYXJlbnQsIGpvaW5Db2x1bW4pOwotCQl0aGlzLmpvaW5UYWJsZSA9IChJSm9pblRhYmxlKSBqb2luQ29sdW1uLmVDb250YWluZXIoKTsKLQl9Ci0JcHJvdGVjdGVkIElKb2luVGFibGUgZ2V0Sm9pblRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5qb2luVGFibGU7Ci0JfQotCQotCXByb3RlY3RlZCBUYWJsZSBnZXROYW1lVGFibGUoKSB7Ci0JCXJldHVybiBnZXRKb2luVGFibGUoKS5kYlRhYmxlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBUYWJsZSBnZXRSZWZlcmVuY2VkTmFtZVRhYmxlKCkgewotCQlJTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nIG11bHRpUmVsYXRpb25zaGlwTWFwcGluZyA9IChJTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nKSBnZXRKb2luVGFibGUoKS5lQ29udGFpbmVyKCk7Ci0JCXJldHVybiBtdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcudHlwZU1hcHBpbmcoKS5wcmltYXJ5RGJUYWJsZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0pvaW5Db2x1bW5JblJlbGF0aW9uc2hpcE1hcHBpbmdEaWFsb2cuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvSm9pbkNvbHVtbkluUmVsYXRpb25zaGlwTWFwcGluZ0RpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjBhMDQ3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvSm9pbkNvbHVtbkluUmVsYXRpb25zaGlwTWFwcGluZ0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLlNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLXB1YmxpYyBjbGFzcyBKb2luQ29sdW1uSW5SZWxhdGlvbnNoaXBNYXBwaW5nRGlhbG9nIGV4dGVuZHMgSm9pbkNvbHVtbkRpYWxvZyB7Ci0KLQlwcml2YXRlIElTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nIHNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmc7Ci0JCi0JSm9pbkNvbHVtbkluUmVsYXRpb25zaGlwTWFwcGluZ0RpYWxvZyhTaGVsbCBwYXJlbnQsIElTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nIHNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5zaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nID0gc2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzsKLQl9Ci0KLQlKb2luQ29sdW1uSW5SZWxhdGlvbnNoaXBNYXBwaW5nRGlhbG9nKFNoZWxsIHBhcmVudCwgSUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQlzdXBlcihwYXJlbnQsIGpvaW5Db2x1bW4pOwotCQl0aGlzLnNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcgPSAoSVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcpIGpvaW5Db2x1bW4uZUNvbnRhaW5lcigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRUYWJsZU5hbWUoKSB7Ci0JCWlmIChnZXRKb2luQ29sdW1uKCkgIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldEpvaW5Db2x1bW4oKS5nZXREZWZhdWx0VGFibGUoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5zaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLnR5cGVNYXBwaW5nKCkuZ2V0VGFibGVOYW1lKCk7Ci0JfQotCQotCXByb3RlY3RlZCBTY2hlbWEgZ2V0U2NoZW1hKCkgewotCQlyZXR1cm4gdGhpcy5zaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLnR5cGVNYXBwaW5nKCkuZGJTY2hlbWEoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFRhYmxlIGdldE5hbWVUYWJsZSgpIHsKLQkJU2NoZW1hIHNjaGVtYSA9IHRoaXMuZ2V0U2NoZW1hKCk7Ci0JCXJldHVybiAoc2NoZW1hID09IG51bGwpID8gbnVsbCA6IHNjaGVtYS50YWJsZU5hbWVkKHRhYmxlTmFtZSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFRhYmxlIGdldFJlZmVyZW5jZWROYW1lVGFibGUoKSB7Ci0JCUlFbnRpdHkgdGFyZ2V0RW50aXR5ID0gdGhpcy5zaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCk7Ci0JCWlmICh0YXJnZXRFbnRpdHkgIT0gbnVsbCkgewotCQkJcmV0dXJuIHRhcmdldEVudGl0eS5wcmltYXJ5RGJUYWJsZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvSm9pbkNvbHVtbnNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvSm9pbkNvbHVtbnNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg2ZTIwMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0pvaW5Db2x1bW5zQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxpc3RWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklBYnN0cmFjdENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JQWJzdHJhY3RKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklOYW1lZENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5KcGFDb3JlTWFwcGluZ3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5JSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQmFzZUpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBKb2luQ29sdW1uc0NvbXBvc2l0ZSBleHRlbmRzIEJhc2VKcGFDb21wb3NpdGUKLXsKLQkKLQlwcml2YXRlIE93bmVyIG93bmVyOwotCXByaXZhdGUgZmluYWwgQWRhcHRlciBqb2luQ29sdW1uc093bmVyTGlzdGVuZXI7Ci0KLQlwcml2YXRlIExpc3RWaWV3ZXIgam9pbkNvbHVtbnNMaXN0Vmlld2VyOwotCQkKLQlwcml2YXRlIGZpbmFsIEFkYXB0ZXIgam9pbkNvbHVtbkxpc3RlbmVyOwotCQotCXByaXZhdGUgR3JvdXAgam9pbkNvbHVtbnNHcm91cDsKLQlwcml2YXRlIEJ1dHRvbiBqb2luQ29sdW1uc0FkZEJ1dHRvbjsKLQlwcml2YXRlIEJ1dHRvbiBqb2luQ29sdW1uc1JlbW92ZUJ1dHRvbjsKLQlwcml2YXRlIEJ1dHRvbiBqb2luQ29sdW1uc0VkaXRCdXR0b247Ci0JCi0KLQlwdWJsaWMgSm9pbkNvbHVtbnNDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjaywgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSwgU3RyaW5nIGdyb3VwVGl0bGUpIHsKLQkJc3VwZXIocGFyZW50LCBTV1QuTlVMTCwgY29tbWFuZFN0YWNrLCB3aWRnZXRGYWN0b3J5KTsKLQkJdGhpcy5qb2luQ29sdW1uc093bmVyTGlzdGVuZXIgPSBidWlsZEpvaW5Db2x1bW5zT3duZXJMaXN0ZW5lcigpOwotCQl0aGlzLmpvaW5Db2x1bW5MaXN0ZW5lciA9IGJ1aWxkSm9pbkNvbHVtbkxpc3RlbmVyKCk7Ci0JCXRoaXMuam9pbkNvbHVtbnNHcm91cC5zZXRUZXh0KGdyb3VwVGl0bGUpOwotCX0KLQkKLQlwcml2YXRlIEFkYXB0ZXIgYnVpbGRKb2luQ29sdW1uc093bmVyTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJCQlqb2luQ29sdW1uc093bmVyQ2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIEFkYXB0ZXIgYnVpbGRKb2luQ29sdW1uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJCQlqb2luQ29sdW1uQ2hhbmdlZChub3RpZmljYXRpb24sIGpvaW5Db2x1bW5zTGlzdFZpZXdlcik7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCXRoaXMuam9pbkNvbHVtbnNHcm91cCA9IAotCQkJZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUdyb3VwKAotCQkJCWNvbXBvc2l0ZSwgCi0JCQkJIiIpOwotCQl0aGlzLmpvaW5Db2x1bW5zR3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gIG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXRoaXMuam9pbkNvbHVtbnNHcm91cC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCQotCQl0aGlzLmpvaW5Db2x1bW5zTGlzdFZpZXdlciA9IG5ldyBMaXN0Vmlld2VyKHRoaXMuam9pbkNvbHVtbnNHcm91cCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSk7Ci0JCXRoaXMuam9pbkNvbHVtbnNMaXN0Vmlld2VyLnNldENvbnRlbnRQcm92aWRlcihidWlsZEpvaW5Db2x1bW5zTGlzdENvbnRlbnRQcm92aWRlcigpKTsKLQkJdGhpcy5qb2luQ29sdW1uc0xpc3RWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihidWlsZEpvaW5Db2x1bW5zTGlzdExhYmVsUHJvdmlkZXIoKSk7Ci0JCWdyaWREYXRhID0gIG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbFNwYW4gPSAzOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQl0aGlzLmpvaW5Db2x1bW5zTGlzdFZpZXdlci5nZXRMaXN0KCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGhpcy5qb2luQ29sdW1uc0xpc3RWaWV3ZXIuZ2V0TGlzdCgpLCBJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19KT0lOX1RBQkxFX0NPTFVNTlMpOwotCQkKLQkJdGhpcy5qb2luQ29sdW1uc0FkZEJ1dHRvbiA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVCdXR0b24odGhpcy5qb2luQ29sdW1uc0dyb3VwLCBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSm9pblRhYmxlQ29tcG9zaXRlX2FkZCwgU1dULk5PTkUpOwotCQlncmlkRGF0YSA9ICBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCXRoaXMuam9pbkNvbHVtbnNBZGRCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXRoaXMuam9pbkNvbHVtbnNBZGRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJb3duZXIuYWRkSm9pbkNvbHVtbigpOwotCQkJfQotCQl9KTsKLQkJCi0JCXRoaXMuam9pbkNvbHVtbnNFZGl0QnV0dG9uID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1dHRvbih0aGlzLmpvaW5Db2x1bW5zR3JvdXAsIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Kb2luVGFibGVDb21wb3NpdGVfZWRpdCwgU1dULk5PTkUpOwotCQl0aGlzLmpvaW5Db2x1bW5zRWRpdEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQkKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQllZGl0Sm9pbkNvbHVtbigpOwotCQkJfQotCQl9KTsKLQkJZ3JpZERhdGEgPSAgbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQl0aGlzLmpvaW5Db2x1bW5zRWRpdEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQl0aGlzLmpvaW5Db2x1bW5zUmVtb3ZlQnV0dG9uID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1dHRvbih0aGlzLmpvaW5Db2x1bW5zR3JvdXAsIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Kb2luVGFibGVDb21wb3NpdGVfcmVtb3ZlLCBTV1QuTk9ORSk7Ci0JCWdyaWREYXRhID0gIG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5CRUdJTk5JTkc7Ci0JCXRoaXMuam9pbkNvbHVtbnNSZW1vdmVCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXRoaXMuam9pbkNvbHVtbnNSZW1vdmVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJcmVtb3ZlSm9pbkNvbHVtbigpOwotCQkJfQotCQl9KTsKLQkJCi0JCXRoaXMuam9pbkNvbHVtbnNMaXN0Vmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJdXBkYXRlSm9pbkNvbHVtbnNFbmFibGVtZW50KCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbnRlbnRQcm92aWRlciBidWlsZEpvaW5Db2x1bW5zTGlzdENvbnRlbnRQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcigpewotCQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQl9Ci0JCQotCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCQkKLQkJCX0KLQkJCi0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQkJCXJldHVybiAoKE93bmVyKSBpbnB1dEVsZW1lbnQpLmdldEpvaW5Db2x1bW5zKCkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIGJ1aWxkSm9pbkNvbHVtbnNMaXN0TGFiZWxQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJSUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IChJSm9pbkNvbHVtbikgZWxlbWVudDsKLQkJCQlyZXR1cm4gKEpvaW5Db2x1bW5zQ29tcG9zaXRlLnRoaXMub3duZXIuY29udGFpbnNTcGVjaWZpZWRKb2luQ29sdW1ucygpKSA/Ci0JCQkJCWJ1aWxkSm9pbkNvbHVtbkxhYmVsKGpvaW5Db2x1bW4pCi0JCQkJOgotCQkJCQlidWlsZERlZmF1bHRKb2luQ29sdW1uTGFiZWwoam9pbkNvbHVtbik7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkRGVmYXVsdEpvaW5Db2x1bW5MYWJlbChJSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCXJldHVybiBOTFMuYmluZChKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSm9pblRhYmxlQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zRGVmYXVsdCwgam9pbkNvbHVtbi5nZXROYW1lKCksIGpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7CQkJCQotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBidWlsZEpvaW5Db2x1bW5MYWJlbChJSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCWlmIChqb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSA9PSBudWxsKSB7Ci0JCQlpZiAoam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpID09IG51bGwpIHsKLQkJCQlyZXR1cm4gTkxTLmJpbmQoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkpvaW5UYWJsZUNvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtc0JvdGhEZWZhdWx0LCBqb2luQ29sdW1uLmdldE5hbWUoKSxqb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwkJCQkKLQkJCX0KLQkJCXJldHVybiBOTFMuYmluZChKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSm9pblRhYmxlQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zRmlyc3REZWZhdWx0LCBqb2luQ29sdW1uLmdldE5hbWUoKSwgam9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJfQotCQllbHNlIGlmIChqb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIE5MUy5iaW5kKEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5Kb2luVGFibGVDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNTZWNEZWZhdWx0LCBqb2luQ29sdW1uLmdldE5hbWUoKSwgam9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsJCQkJCi0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gTkxTLmJpbmQoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkpvaW5UYWJsZUNvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtcywgam9pbkNvbHVtbi5nZXROYW1lKCksIGpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7CQkJCQkKLQkJfQotCX0KLQotCXZvaWQgZWRpdEpvaW5Db2x1bW4oKSB7Ci0JCXRoaXMub3duZXIuZWRpdEpvaW5Db2x1bW4oZ2V0U2VsZWN0ZWRKb2luQ29sdW1uKCkpOwotCX0KLQkJCi0Jdm9pZCByZW1vdmVKb2luQ29sdW1uKCkgewotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHRoaXMuam9pbkNvbHVtbnNMaXN0Vmlld2VyLmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJZm9yIChJdGVyYXRvciBzdHJlYW0gPSAoKFN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQkJdGhpcy5vd25lci5nZXRKb2luQ29sdW1ucygpLnJlbW92ZShzdHJlYW0ubmV4dCgpKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIElKb2luQ29sdW1uIGdldFNlbGVjdGVkSm9pbkNvbHVtbigpIHsKLQkJcmV0dXJuIChJSm9pbkNvbHVtbikgKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0aGlzLmpvaW5Db2x1bW5zTGlzdFZpZXdlci5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JfQotCQkKLQlwcm90ZWN0ZWQgdm9pZCBqb2luQ29sdW1uc093bmVyQ2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCWlmIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKG93bmVyLm93bmluZ0ZlYXR1cmVDbGFzcygpKSA9PSBvd25lci5zcGVjaWZpZWRKb2luQ29sdW1uc0ZlYXR1cmVJZCgpKSB7Ci0JCQlpZiAobm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpID09IE5vdGlmaWNhdGlvbi5BREQpIHsKLQkJCQkoKElKb2luQ29sdW1uKSBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKSkuZUFkYXB0ZXJzKCkuYWRkKHRoaXMuam9pbkNvbHVtbkxpc3RlbmVyKTsKLQkJCX0KLQkJCWVsc2UgaWYgKG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uUkVNT1ZFKSB7Ci0JCQkJKChJSm9pbkNvbHVtbikgbm90aWZpY2F0aW9uLmdldE9sZFZhbHVlKCkpLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzLmpvaW5Db2x1bW5MaXN0ZW5lcik7CQkJCQotCQkJfQotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChnZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJam9pbkNvbHVtbnNMaXN0Vmlld2VyLnJlZnJlc2goKTsKLQkJCQkJdXBkYXRlSm9pbkNvbHVtbnNFbmFibGVtZW50KCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGVuYWJsZUdyb3VwKEdyb3VwIGdyb3VwLCBib29sZWFuIGVuYWJsZWQpIHsKLQkJZ3JvdXAuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBncm91cC5nZXRDaGlsZHJlbigpLmxlbmd0aDsgaSsrKSB7Ci0JCQlncm91cC5nZXRDaGlsZHJlbigpW2ldLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCX0JCi0JfQotCQlwcm90ZWN0ZWQgdm9pZCBqb2luQ29sdW1uQ2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uLCBmaW5hbCBMaXN0Vmlld2VyIGxpc3RWaWV3ZXIpIHsKLQkJCWlmIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKElOYW1lZENvbHVtbi5jbGFzcykgPT0gSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JTkFNRURfQ09MVU1OX19TUEVDSUZJRURfTkFNRQotCQkJCXx8IG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSU5hbWVkQ29sdW1uLmNsYXNzKSA9PSBKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLklOQU1FRF9DT0xVTU5fX0RFRkFVTFRfTkFNRQotCQkJCXx8IG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSUFic3RyYWN0Q29sdW1uLmNsYXNzKSA9PSBKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLklBQlNUUkFDVF9DT0xVTU5fX1NQRUNJRklFRF9UQUJMRQotCQkJCXx8IG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSUFic3RyYWN0Q29sdW1uLmNsYXNzKSA9PSBKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLklBQlNUUkFDVF9DT0xVTU5fX0RFRkFVTFRfVEFCTEUKLQkJCQl8fCBub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKElBYnN0cmFjdEpvaW5Db2x1bW4uY2xhc3MpID09IEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSUFCU1RSQUNUX0pPSU5fQ09MVU1OX19TUEVDSUZJRURfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRQotCQkJCXx8IG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSUFic3RyYWN0Sm9pbkNvbHVtbi5jbGFzcykgPT0gSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JQUJTVFJBQ1RfSk9JTl9DT0xVTU5fX0RFRkFVTFRfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSkgewotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChnZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJbGlzdFZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0JCQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUxpc3RlbmVycygpIHsKLQkJaWYgKHRoaXMub3duZXIgIT0gbnVsbCkgewotCQkJdGhpcy5vd25lci5nZXRFT2JqZWN0KCkuZUFkYXB0ZXJzKCkuYWRkKHRoaXMuam9pbkNvbHVtbnNPd25lckxpc3RlbmVyKTsKLQkJCWZvciAoSUpvaW5Db2x1bW4gam9pbkNvbHVtbiA6IHRoaXMub3duZXIuZ2V0Sm9pbkNvbHVtbnMoKSkgewotCQkJCWpvaW5Db2x1bW4uZUFkYXB0ZXJzKCkuYWRkKHRoaXMuam9pbkNvbHVtbkxpc3RlbmVyKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VMaXN0ZW5lcnMoKSB7Ci0JCWlmICh0aGlzLm93bmVyICE9IG51bGwpIHsKLQkJCWZvciAoSUpvaW5Db2x1bW4gam9pbkNvbHVtbiA6IHRoaXMub3duZXIuZ2V0Sm9pbkNvbHVtbnMoKSkgewotCQkJCWpvaW5Db2x1bW4uZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMuam9pbkNvbHVtbkxpc3RlbmVyKTsKLQkJCX0KLQkJCXRoaXMub3duZXIuZ2V0RU9iamVjdCgpLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzLmpvaW5Db2x1bW5zT3duZXJMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0JCQotCXB1YmxpYyB2b2lkIGRvUG9wdWxhdGUoRU9iamVjdCBvYmopIHsKLQkJdGhpcy5vd25lciA9IChPd25lcikgb2JqOwotCQlpZiAodGhpcy5vd25lciA9PSBudWxsKSB7Ci0JCQl0aGlzLmpvaW5Db2x1bW5zTGlzdFZpZXdlci5zZXRJbnB1dChudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJdGhpcy5qb2luQ29sdW1uc0xpc3RWaWV3ZXIuc2V0SW5wdXQodGhpcy5vd25lcik7Ci0JCQotCQl1cGRhdGVFbmFibGVtZW50KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9Qb3B1bGF0ZSgpIHsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlRW5hYmxlbWVudCgpIHsKLQkJdXBkYXRlSm9pbkNvbHVtbnNFbmFibGVtZW50KCk7Ci0JfQotCQotCXZvaWQgdXBkYXRlSm9pbkNvbHVtbnNFbmFibGVtZW50KCkgewotCQlib29sZWFuIGdyb3VwRW5hYmxlZFN0YXRlID0gdGhpcy5vd25lci5jb250YWluc1NwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JCWVuYWJsZUdyb3VwKHRoaXMuam9pbkNvbHVtbnNHcm91cCwgZ3JvdXBFbmFibGVkU3RhdGUpOwotCi0JCXRoaXMuam9pbkNvbHVtbnNSZW1vdmVCdXR0b24uc2V0RW5hYmxlZChncm91cEVuYWJsZWRTdGF0ZSAmJiAhKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0aGlzLmpvaW5Db2x1bW5zTGlzdFZpZXdlci5nZXRTZWxlY3Rpb24oKSkuaXNFbXB0eSgpKTsKLQkJdGhpcy5qb2luQ29sdW1uc0VkaXRCdXR0b24uc2V0RW5hYmxlZChncm91cEVuYWJsZWRTdGF0ZSAmJiAoKFN0cnVjdHVyZWRTZWxlY3Rpb24pIHRoaXMuam9pbkNvbHVtbnNMaXN0Vmlld2VyLmdldFNlbGVjdGlvbigpKS5zaXplKCkgPT0gMSk7Ci0JfQotCQkKLQlwcm90ZWN0ZWQgdm9pZCBlbmFibGVXaWRnZXRzKGJvb2xlYW4gZW5hYmxlZCkgewotCQllbmFibGVHcm91cCh0aGlzLmpvaW5Db2x1bW5zR3JvdXAsIGVuYWJsZWQpOwotCQl0aGlzLmpvaW5Db2x1bW5zQWRkQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCXRoaXMuam9pbkNvbHVtbnNFZGl0QnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCXRoaXMuam9pbkNvbHVtbnNSZW1vdmVCdXR0b24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJdGhpcy5qb2luQ29sdW1uc0xpc3RWaWV3ZXIuZ2V0TGlzdCgpLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JfQotCi0JcHVibGljIGludGVyZmFjZSBPd25lciB7Ci0JCWludCBzcGVjaWZpZWRKb2luQ29sdW1uc0ZlYXR1cmVJZCgpOwotCQkKLQkJQ2xhc3Mgb3duaW5nRmVhdHVyZUNsYXNzKCk7Ci0KLQkJRU9iamVjdCBnZXRFT2JqZWN0KCk7Ci0JCQotCQlib29sZWFuIGNvbnRhaW5zU3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQkJCi0JCUxpc3Q8SUpvaW5Db2x1bW4+IGdldEpvaW5Db2x1bW5zKCk7Ci0JCQotCQlMaXN0PElKb2luQ29sdW1uPiBnZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCQkKLQkJSUpvaW5Db2x1bW4gY3JlYXRlSm9pbkNvbHVtbihpbnQgaW5kZXgpOwotCQkKLQkJdm9pZCBhZGRKb2luQ29sdW1uKCk7Ci0JCQotCQl2b2lkIGVkaXRKb2luQ29sdW1uKElKb2luQ29sdW1uIGpvaW5Db2x1bW4pOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvSm9pblRhYmxlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0pvaW5UYWJsZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWZkNjBjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvSm9pblRhYmxlQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklKcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSUpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5KcGFDb3JlTWFwcGluZ3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC5Db25uZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLkNvbm5lY3Rpb25Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC5EYXRhYmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwuU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSUpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkJhc2VKcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlscy5Kb2luQ29sdW1uc0NvbXBvc2l0ZS5Pd25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgSm9pblRhYmxlQ29tcG9zaXRlIGV4dGVuZHMgQmFzZUpwYUNvbXBvc2l0ZQotewotCQotCXByaXZhdGUgSUpvaW5UYWJsZSBqb2luVGFibGU7Ci0JcHJpdmF0ZSBmaW5hbCBBZGFwdGVyIGpvaW5UYWJsZUxpc3RlbmVyOwotCi0JcHJvdGVjdGVkIFRhYmxlQ29tYm8gdGFibGVDb21ibzsKLQotCXByaXZhdGUgQ29ubmVjdGlvblByb2ZpbGUgY29ubmVjdGlvblByb2ZpbGU7Ci0JcHJpdmF0ZSBDb25uZWN0aW9uTGlzdGVuZXIgY29ubmVjdGlvbkxpc3RlbmVyOwotCQotCXByaXZhdGUgQnV0dG9uIG92ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5zQ2hlY2tCb3g7Ci0JcHJpdmF0ZSBKb2luQ29sdW1uc0NvbXBvc2l0ZSBqb2luQ29sdW1uc0NvbXBvc2l0ZTsKLQkKLQlwcml2YXRlIEJ1dHRvbiBvdmVycmlkZURlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbnNDaGVja0JveDsKLQlwcml2YXRlIEpvaW5Db2x1bW5zQ29tcG9zaXRlIGludmVyc2VKb2luQ29sdW1uc0NvbXBvc2l0ZTsKLQotCXB1YmxpYyBKb2luVGFibGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjaywgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlzdXBlcihwYXJlbnQsIFNXVC5OVUxMLCBjb21tYW5kU3RhY2ssIHdpZGdldEZhY3RvcnkpOwotCQl0aGlzLmpvaW5UYWJsZUxpc3RlbmVyID0gYnVpbGRKb2luVGFibGVMaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lciA9IGJ1aWxkQ29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JfQotCQotCXByaXZhdGUgQWRhcHRlciBidWlsZEpvaW5UYWJsZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IEFkYXB0ZXJJbXBsKCkgewotCQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCQkJam9pblRhYmxlQ2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIENvbm5lY3Rpb25MaXN0ZW5lciBidWlsZENvbm5lY3Rpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDb25uZWN0aW9uTGlzdGVuZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIGFib3V0VG9DbG9zZShDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKLQkJCQkvLyBub3QgaW50ZXJlc3RlZCB0byB0aGlzIGV2ZW50LgotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBjbG9zZWQoQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7Ci0JCQkJZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMoIG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJSm9pblRhYmxlQ29tcG9zaXRlLnRoaXMudGFibGVDb21iby5wb3B1bGF0ZSgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIG1vZGlmaWVkKENvbm5lY3Rpb24gY29ubmVjdGlvbikgewotCQkJCWdldENvbnRyb2woKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKCBuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCUpvaW5UYWJsZUNvbXBvc2l0ZS50aGlzLnRhYmxlQ29tYm8ucG9wdWxhdGUoKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBva1RvQ2xvc2UoQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7Ci0JCQkJLy8gbm90IGludGVyZXN0ZWQgdG8gdGhpcyBldmVudC4KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgb3BlbmVkKENvbm5lY3Rpb24gY29ubmVjdGlvbikgewotCQkJCWdldENvbnRyb2woKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKCBuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCUpvaW5UYWJsZUNvbXBvc2l0ZS50aGlzLnRhYmxlQ29tYm8ucG9wdWxhdGUoKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBkYXRhYmFzZUNoYW5nZWQoQ29ubmVjdGlvbiBjb25uZWN0aW9uLCBmaW5hbCBEYXRhYmFzZSBkYXRhYmFzZSkgewotCQkJCWdldENvbnRyb2woKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKCBuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWlmKGRhdGFiYXNlID09IEpvaW5UYWJsZUNvbXBvc2l0ZS50aGlzLnRhYmxlQ29tYm8uZ2V0RGF0YWJhc2UoKSkgewotCQkJCQkJCWlmICghZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJCQlKb2luVGFibGVDb21wb3NpdGUudGhpcy50YWJsZUNvbWJvLnBvcHVsYXRlKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyB2b2lkIHNjaGVtYUNoYW5nZWQoQ29ubmVjdGlvbiBjb25uZWN0aW9uLCBmaW5hbCBTY2hlbWEgc2NoZW1hKSB7Ci0JCQkJZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMoIG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJaWYoc2NoZW1hID09IEpvaW5UYWJsZUNvbXBvc2l0ZS50aGlzLnRhYmxlQ29tYm8uZ2V0VGFibGVTY2hlbWEoKSkgewotCQkJCQkJCWlmICghZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJCQlKb2luVGFibGVDb21wb3NpdGUudGhpcy50YWJsZUNvbWJvLnBvcHVsYXRlKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHRhYmxlQ2hhbmdlZChDb25uZWN0aW9uIGNvbm5lY3Rpb24sIGZpbmFsIFRhYmxlIHRhYmxlKSB7Ci0JCQkJLy8gbm90IGludGVyZXN0ZWQgdG8gdGhpcyBldmVudC4KLQkJCX0KLQkJfTsKLSAgICB9Ci0KLQlwcml2YXRlIENvbm5lY3Rpb25Qcm9maWxlIGdldENvbm5lY3Rpb25Qcm9maWxlKCkgewotCQlpZih0aGlzLmNvbm5lY3Rpb25Qcm9maWxlID09IG51bGwpIHsKLQkJCUlKcGFQcm9qZWN0IGpwYVByb2plY3QgPSB0aGlzLmpvaW5UYWJsZS5nZXRKcGFQcm9qZWN0KCk7Ci0JCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlID0ganBhUHJvamVjdC5jb25uZWN0aW9uUHJvZmlsZSgpOwotCQl9Ci0JCXJldHVybiB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkQ29ubmVjdGlvbkxpc3RlbmVyKCkgewotCQl0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlKCkuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKHRoaXMuY29ubmVjdGlvbkxpc3RlbmVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcigpIHsKLQkJdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZSgpLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcih0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lcik7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQkKLQkJZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkpvaW5UYWJsZUNvbXBvc2l0ZV9uYW1lKTsKLQkJCi0JCXRoaXMudGFibGVDb21ibyA9IG5ldyBUYWJsZUNvbWJvKGNvbXBvc2l0ZSwgdGhpcy5jb21tYW5kU3RhY2ssIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuQkVHSU5OSU5HOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJdGhpcy50YWJsZUNvbWJvLmdldENvbWJvKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGhpcy50YWJsZUNvbWJvLmdldENvbWJvKCksIElKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX0pPSU5fVEFCTEVfTkFNRSk7Ci0JCQotCQl0aGlzLm92ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5zQ2hlY2tCb3ggPSAKLQkJCWdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVCdXR0b24oCi0JCQkJY29tcG9zaXRlLCAKLQkJCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSm9pblRhYmxlQ29tcG9zaXRlX292ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5zLCAKLQkJCQlTV1QuQ0hFQ0spOwotCQl0aGlzLm92ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5zQ2hlY2tCb3guYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkvLyBkbyBub3RoaW5nCi0JCQl9Ci0JCQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWlmIChKb2luVGFibGVDb21wb3NpdGUudGhpcy5vdmVycmlkZURlZmF1bHRKb2luQ29sdW1uc0NoZWNrQm94LmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJCUlKb2luQ29sdW1uIGRlZmF1bHRKb2luQ29sdW1uID0gSm9pblRhYmxlQ29tcG9zaXRlLnRoaXMuam9pblRhYmxlLmdldERlZmF1bHRKb2luQ29sdW1ucygpLmdldCgwKTsKLQkJCQkJU3RyaW5nIGNvbHVtbk5hbWUgPSBkZWZhdWx0Sm9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpOwotCQkJCQlTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBkZWZhdWx0Sm9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKTsKLQkJCQkJSUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IEpvaW5UYWJsZUNvbXBvc2l0ZS50aGlzLmpvaW5UYWJsZS5jcmVhdGVKb2luQ29sdW1uKDApOwotCQkJCQlKb2luVGFibGVDb21wb3NpdGUudGhpcy5qb2luVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5hZGQoam9pbkNvbHVtbik7Ci0JCQkJCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZShjb2x1bW5OYW1lKTsKLQkJCQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZShyZWZlcmVuY2VkQ29sdW1uTmFtZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJSm9pblRhYmxlQ29tcG9zaXRlLnRoaXMuam9pblRhYmxlLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuY2xlYXIoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCXRoaXMuam9pbkNvbHVtbnNDb21wb3NpdGUgPSBuZXcgSm9pbkNvbHVtbnNDb21wb3NpdGUoY29tcG9zaXRlLCB0aGlzLmNvbW1hbmRTdGFjaywgZ2V0V2lkZ2V0RmFjdG9yeSgpLCBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuSm9pblRhYmxlQ29tcG9zaXRlX2pvaW5Db2x1bW4pOwotCQlncmlkRGF0YSA9ICBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQl0aGlzLmpvaW5Db2x1bW5zQ29tcG9zaXRlLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCi0JCXRoaXMub3ZlcnJpZGVEZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW5zQ2hlY2tCb3ggPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQnV0dG9uKGNvbXBvc2l0ZSwgSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkpvaW5UYWJsZUNvbXBvc2l0ZV9vdmVycmlkZURlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbnMsIFNXVC5DSEVDSyk7Ci0JCXRoaXMub3ZlcnJpZGVEZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW5zQ2hlY2tCb3guYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkvLyBkbyBub3RoaW5nCi0JCQl9Ci0JCQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWlmIChKb2luVGFibGVDb21wb3NpdGUudGhpcy5vdmVycmlkZURlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbnNDaGVja0JveC5nZXRTZWxlY3Rpb24oKSkgewotCQkJCQlJSm9pbkNvbHVtbiBkZWZhdWx0Sm9pbkNvbHVtbiA9IEpvaW5UYWJsZUNvbXBvc2l0ZS50aGlzLmpvaW5UYWJsZS5nZXREZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW5zKCkuZ2V0KDApOwotCQkJCQlTdHJpbmcgY29sdW1uTmFtZSA9IGRlZmF1bHRKb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCk7Ci0JCQkJCVN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IGRlZmF1bHRKb2luQ29sdW1uLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpOwotCQkJCQlJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gSm9pblRhYmxlQ29tcG9zaXRlLnRoaXMuam9pblRhYmxlLmNyZWF0ZUludmVyc2VKb2luQ29sdW1uKDApOwotCQkJCQlKb2luVGFibGVDb21wb3NpdGUudGhpcy5qb2luVGFibGUuZ2V0U3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCkuYWRkKGpvaW5Db2x1bW4pOwotCQkJCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoY29sdW1uTmFtZSk7Ci0JCQkJCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUocmVmZXJlbmNlZENvbHVtbk5hbWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCUpvaW5UYWJsZUNvbXBvc2l0ZS50aGlzLmpvaW5UYWJsZS5nZXRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKS5jbGVhcigpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCXRoaXMuaW52ZXJzZUpvaW5Db2x1bW5zQ29tcG9zaXRlID0gbmV3IEpvaW5Db2x1bW5zQ29tcG9zaXRlKGNvbXBvc2l0ZSwgdGhpcy5jb21tYW5kU3RhY2ssIGdldFdpZGdldEZhY3RvcnkoKSwgSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkpvaW5UYWJsZUNvbXBvc2l0ZV9pbnZlcnNlSm9pbkNvbHVtbik7Ci0JCWdyaWREYXRhID0gIG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXRoaXMuaW52ZXJzZUpvaW5Db2x1bW5zQ29tcG9zaXRlLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQl9Ci0JCi0Jdm9pZCBhZGRKb2luQ29sdW1uKCkgewotCQlKb2luQ29sdW1uSW5Kb2luVGFibGVEaWFsb2cgZGlhbG9nID0gbmV3IEpvaW5Db2x1bW5JbkpvaW5UYWJsZURpYWxvZyh0aGlzLmdldENvbnRyb2woKS5nZXRTaGVsbCgpLCB0aGlzLmpvaW5UYWJsZSk7Ci0JCXRoaXMuYWRkSm9pbkNvbHVtbkZyb21EaWFsb2coZGlhbG9nKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZEpvaW5Db2x1bW5Gcm9tRGlhbG9nKEpvaW5Db2x1bW5JbkpvaW5UYWJsZURpYWxvZyBkaWFsb2cpIHsKLQkJaWYgKGRpYWxvZy5vcGVuKCkgIT0gV2luZG93Lk9LKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaW50IGluZGV4ID0gdGhpcy5qb2luVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKS5zaXplKCk7Ci0JCUlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSB0aGlzLmpvaW5UYWJsZS5jcmVhdGVKb2luQ29sdW1uKGluZGV4KTsKLQkJdGhpcy5qb2luVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5hZGQoam9pbkNvbHVtbik7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZShkaWFsb2cuZ2V0U2VsZWN0ZWROYW1lKCkpOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKGRpYWxvZy5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQl9Ci0JCi0Jdm9pZCBhZGRJbnZlcnNlSm9pbkNvbHVtbigpIHsKLQkJSW52ZXJzZUpvaW5Db2x1bW5EaWFsb2cgZGlhbG9nID0gbmV3IEludmVyc2VKb2luQ29sdW1uRGlhbG9nKHRoaXMuZ2V0Q29udHJvbCgpLmdldFNoZWxsKCksIHRoaXMuam9pblRhYmxlKTsKLQkJdGhpcy5hZGRJbnZlcnNlSm9pbkNvbHVtbkZyb21EaWFsb2coZGlhbG9nKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZEludmVyc2VKb2luQ29sdW1uRnJvbURpYWxvZyhJbnZlcnNlSm9pbkNvbHVtbkRpYWxvZyBkaWFsb2cpIHsKLQkJaWYgKGRpYWxvZy5vcGVuKCkgIT0gV2luZG93Lk9LKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaW50IGluZGV4ID0gdGhpcy5qb2luVGFibGUuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkuc2l6ZSgpOwotCQlJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gdGhpcy5qb2luVGFibGUuY3JlYXRlSW52ZXJzZUpvaW5Db2x1bW4oaW5kZXgpOwotCQl0aGlzLmpvaW5UYWJsZS5nZXRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKS5hZGQoam9pbkNvbHVtbik7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZShkaWFsb2cuZ2V0U2VsZWN0ZWROYW1lKCkpOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKGRpYWxvZy5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQl9Ci0KLQl2b2lkIGVkaXRKb2luQ29sdW1uKElKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJSm9pbkNvbHVtbkluSm9pblRhYmxlRGlhbG9nIGRpYWxvZyA9IG5ldyBKb2luQ29sdW1uSW5Kb2luVGFibGVEaWFsb2codGhpcy5nZXRDb250cm9sKCkuZ2V0U2hlbGwoKSwgam9pbkNvbHVtbik7Ci0JCWVkaXRKb2luQ29sdW1uRnJvbURpYWxvZyhkaWFsb2csIGpvaW5Db2x1bW4pOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgZWRpdEpvaW5Db2x1bW5Gcm9tRGlhbG9nKEpvaW5Db2x1bW5JbkpvaW5UYWJsZURpYWxvZyBkaWFsb2csIElKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQllZGl0Sm9pbkNvbHVtbkRpYWxvZ09rZChkaWFsb2csIGpvaW5Db2x1bW4pOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBlZGl0Sm9pbkNvbHVtbkRpYWxvZ09rZChKb2luQ29sdW1uSW5Kb2luVGFibGVEaWFsb2cgZGlhbG9nLCBJSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCVN0cmluZyBuYW1lID0gZGlhbG9nLmdldFNlbGVjdGVkTmFtZSgpOwotCQlTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBkaWFsb2cuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKTsKLQotCQlpZiAoZGlhbG9nLmlzRGVmYXVsdE5hbWVTZWxlY3RlZCgpKSB7Ci0JCQlpZiAoam9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkgIT0gbnVsbCkgewotCQkJCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChqb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSA9PSBudWxsIHx8ICFqb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKS5lcXVhbHMobmFtZSkpewotCQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKG5hbWUpOwotCQl9Ci0JCQotCQlpZiAoZGlhbG9nLmlzRGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lU2VsZWN0ZWQoKSkgewotCQkJaWYgKGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSAhPSBudWxsKSB7Ci0JCQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZShudWxsKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChqb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgPT0gbnVsbCB8fCAham9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpLmVxdWFscyhyZWZlcmVuY2VkQ29sdW1uTmFtZSkpewotCQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZShyZWZlcmVuY2VkQ29sdW1uTmFtZSk7Ci0JCX0KLQl9Ci0JCi0JCi0Jdm9pZCBlZGl0SW52ZXJzZUpvaW5Db2x1bW4oSUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQlJbnZlcnNlSm9pbkNvbHVtbkRpYWxvZyBkaWFsb2cgPSBuZXcgSW52ZXJzZUpvaW5Db2x1bW5EaWFsb2coZ2V0Q29udHJvbCgpLmdldFNoZWxsKCksIGpvaW5Db2x1bW4pOwotCQllZGl0Sm9pbkNvbHVtbkZyb21EaWFsb2coZGlhbG9nLCBqb2luQ29sdW1uKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgam9pblRhYmxlQ2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCWlmIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKElKb2luVGFibGUuY2xhc3MpID09IEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSUpPSU5fVEFCTEVfX1NQRUNJRklFRF9KT0lOX0NPTFVNTlMpIHsKLQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCW92ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5zQ2hlY2tCb3guc2V0U2VsZWN0aW9uKGpvaW5UYWJsZS5jb250YWluc1NwZWNpZmllZEpvaW5Db2x1bW5zKCkpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCWVsc2UgaWYgKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSUpvaW5UYWJsZS5jbGFzcykgPT0gSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JSk9JTl9UQUJMRV9fU1BFQ0lGSUVEX0lOVkVSU0VfSk9JTl9DT0xVTU5TKSB7Ci0KLQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCW92ZXJyaWRlRGVmYXVsdEludmVyc2VKb2luQ29sdW1uc0NoZWNrQm94LnNldFNlbGVjdGlvbihqb2luVGFibGUuY29udGFpbnNTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKSk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0JCQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUxpc3RlbmVycygpIHsKLQkJaWYgKHRoaXMuam9pblRhYmxlICE9IG51bGwpIHsKLQkJCXRoaXMuam9pblRhYmxlLmVBZGFwdGVycygpLmFkZCh0aGlzLmpvaW5UYWJsZUxpc3RlbmVyKTsKLQkJCXRoaXMuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKCk7CQkKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VMaXN0ZW5lcnMoKSB7Ci0JCWlmICh0aGlzLmpvaW5UYWJsZSAhPSBudWxsKSB7Ci0JCQl0aGlzLmpvaW5UYWJsZS5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcy5qb2luVGFibGVMaXN0ZW5lcik7Ci0JCQl0aGlzLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl9Ci0JfQotCQkKLQlwdWJsaWMgdm9pZCBkb1BvcHVsYXRlKEVPYmplY3Qgb2JqKSB7Ci0JCXRoaXMuam9pblRhYmxlID0gKElKb2luVGFibGUpIG9iajsKLQkJaWYgKHRoaXMuam9pblRhYmxlID09IG51bGwpIHsKLQkJCXRoaXMuam9pbkNvbHVtbnNDb21wb3NpdGUucG9wdWxhdGUobnVsbCk7Ci0JCQl0aGlzLmludmVyc2VKb2luQ29sdW1uc0NvbXBvc2l0ZS5wb3B1bGF0ZShudWxsKTsKLQkJCXRoaXMuY29ubmVjdGlvblByb2ZpbGUgPSBudWxsOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQl0aGlzLnRhYmxlQ29tYm8ucG9wdWxhdGUodGhpcy5qb2luVGFibGUpOwotCQl0aGlzLmpvaW5Db2x1bW5zQ29tcG9zaXRlLnBvcHVsYXRlKG5ldyBKb2luQ29sdW1uc093bmVyKHRoaXMuam9pblRhYmxlKSk7Ci0JCXRoaXMuaW52ZXJzZUpvaW5Db2x1bW5zQ29tcG9zaXRlLnBvcHVsYXRlKG5ldyBJbnZlcnNlSm9pbkNvbHVtbnNPd25lcih0aGlzLmpvaW5UYWJsZSkpOwotCQkKLQkJdGhpcy5vdmVycmlkZURlZmF1bHRKb2luQ29sdW1uc0NoZWNrQm94LnNldFNlbGVjdGlvbih0aGlzLmpvaW5UYWJsZS5jb250YWluc1NwZWNpZmllZEpvaW5Db2x1bW5zKCkpOwotCQl0aGlzLm92ZXJyaWRlRGVmYXVsdEludmVyc2VKb2luQ29sdW1uc0NoZWNrQm94LnNldFNlbGVjdGlvbih0aGlzLmpvaW5UYWJsZS5jb250YWluc1NwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb1BvcHVsYXRlKCkgewotCQl0aGlzLnRhYmxlQ29tYm8ucG9wdWxhdGUoKTsKLQkJdGhpcy5qb2luQ29sdW1uc0NvbXBvc2l0ZS5wb3B1bGF0ZSgpOwotCQl0aGlzLmludmVyc2VKb2luQ29sdW1uc0NvbXBvc2l0ZS5wb3B1bGF0ZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl0aGlzLnRhYmxlQ29tYm8uZGlzcG9zZSgpOwotCQl0aGlzLmpvaW5Db2x1bW5zQ29tcG9zaXRlLmRpc3Bvc2UoKTsKLQkJdGhpcy5pbnZlcnNlSm9pbkNvbHVtbnNDb21wb3NpdGUuZGlzcG9zZSgpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBKb2luQ29sdW1uc093bmVyIGV4dGVuZHMgSnBhRU9iamVjdCBpbXBsZW1lbnRzIE93bmVyIHsKLQkJCi0JCXByaXZhdGUgSUpvaW5UYWJsZSBqb2luVGFibGU7Ci0JCQotCQlwdWJsaWMgSm9pbkNvbHVtbnNPd25lcihJSm9pblRhYmxlIGpvaW5UYWJsZSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuam9pblRhYmxlID0gam9pblRhYmxlOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBhZGRKb2luQ29sdW1uKCkgewotCQkJSm9pblRhYmxlQ29tcG9zaXRlLnRoaXMuYWRkSm9pbkNvbHVtbigpOwotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBjb250YWluc1NwZWNpZmllZEpvaW5Db2x1bW5zKCkgewotCQkJcmV0dXJuIHRoaXMuam9pblRhYmxlLmNvbnRhaW5zU3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQkJfQotCQkKLQkJcHVibGljIElKb2luQ29sdW1uIGNyZWF0ZUpvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5qb2luVGFibGUuY3JlYXRlSm9pbkNvbHVtbihpbmRleCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBMaXN0PElKb2luQ29sdW1uPiBnZXRKb2luQ29sdW1ucygpIHsKLQkJCXJldHVybiB0aGlzLmpvaW5UYWJsZS5nZXRKb2luQ29sdW1ucygpOwotCQl9Ci0JCQotCQlwdWJsaWMgTGlzdDxJSm9pbkNvbHVtbj4gZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKSB7Ci0JCQlyZXR1cm4gdGhpcy5qb2luVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQkJfQotCQkKLQkJcHVibGljIGludCBzcGVjaWZpZWRKb2luQ29sdW1uc0ZlYXR1cmVJZCgpIHsKLQkJCXJldHVybiBKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLklKT0lOX1RBQkxFX19TUEVDSUZJRURfSk9JTl9DT0xVTU5TOwotCQl9Ci0JCQotCQlwdWJsaWMgQ2xhc3Mgb3duaW5nRmVhdHVyZUNsYXNzKCkgewotCQkJcmV0dXJuIElKb2luVGFibGUuY2xhc3M7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIGVkaXRKb2luQ29sdW1uKElKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJCUpvaW5UYWJsZUNvbXBvc2l0ZS50aGlzLmVkaXRKb2luQ29sdW1uKGpvaW5Db2x1bW4pOwotCQl9Ci0JCQotCQlwdWJsaWMgRU9iamVjdCBnZXRFT2JqZWN0KCkgewotCQkJcmV0dXJuIHRoaXMuam9pblRhYmxlOwotCQl9Ci0JfQotCQotCXByaXZhdGUgY2xhc3MgSW52ZXJzZUpvaW5Db2x1bW5zT3duZXIgZXh0ZW5kcyBKcGFFT2JqZWN0IGltcGxlbWVudHMgT3duZXIgewotCQkKLQkJcHJpdmF0ZSBJSm9pblRhYmxlIGpvaW5UYWJsZTsKLQkJCi0JCXB1YmxpYyBJbnZlcnNlSm9pbkNvbHVtbnNPd25lcihJSm9pblRhYmxlIGpvaW5UYWJsZSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuam9pblRhYmxlID0gam9pblRhYmxlOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBhZGRKb2luQ29sdW1uKCkgewotCQkJSm9pblRhYmxlQ29tcG9zaXRlLnRoaXMuYWRkSW52ZXJzZUpvaW5Db2x1bW4oKTsKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gY29udGFpbnNTcGVjaWZpZWRKb2luQ29sdW1ucygpIHsKLQkJCXJldHVybiB0aGlzLmpvaW5UYWJsZS5jb250YWluc1NwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpOwotCQl9Ci0JCQotCQlwdWJsaWMgSUpvaW5Db2x1bW4gY3JlYXRlSm9pbkNvbHVtbihpbnQgaW5kZXgpIHsKLQkJCXJldHVybiB0aGlzLmpvaW5UYWJsZS5jcmVhdGVKb2luQ29sdW1uKGluZGV4KTsKLQkJfQotCQkKLQkJcHVibGljIExpc3Q8SUpvaW5Db2x1bW4+IGdldEpvaW5Db2x1bW5zKCkgewotCQkJcmV0dXJuIHRoaXMuam9pblRhYmxlLmdldEludmVyc2VKb2luQ29sdW1ucygpOwotCQl9Ci0JCQotCQlwdWJsaWMgTGlzdDxJSm9pbkNvbHVtbj4gZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKSB7Ci0JCQlyZXR1cm4gdGhpcy5qb2luVGFibGUuZ2V0U3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgc3BlY2lmaWVkSm9pbkNvbHVtbnNGZWF0dXJlSWQoKSB7Ci0JCQlyZXR1cm4gSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JSk9JTl9UQUJMRV9fU1BFQ0lGSUVEX0lOVkVSU0VfSk9JTl9DT0xVTU5TOwotCQl9Ci0JCQotCQlwdWJsaWMgQ2xhc3Mgb3duaW5nRmVhdHVyZUNsYXNzKCkgewotCQkJcmV0dXJuIElKb2luVGFibGUuY2xhc3M7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIGVkaXRKb2luQ29sdW1uKElKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJCUpvaW5UYWJsZUNvbXBvc2l0ZS50aGlzLmVkaXRJbnZlcnNlSm9pbkNvbHVtbihqb2luQ29sdW1uKTsKLQkJfQotCQkKLQkJcHVibGljIEVPYmplY3QgZ2V0RU9iamVjdCgpIHsKLQkJCXJldHVybiB0aGlzLmpvaW5UYWJsZTsKLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvTG9iQ2hlY2tCb3guamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvTG9iQ2hlY2tCb3guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTgxOTQ0YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL0xvYkNoZWNrQm94LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklCYXNpYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5KcGFDb3JlTWFwcGluZ3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkJhc2VKcGFDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBMb2JDaGVja0JveCBleHRlbmRzIEJhc2VKcGFDb250cm9sbGVyCi17Ci0JcHJpdmF0ZSBJQmFzaWMgYmFzaWNNYXBwaW5nOwotCXByaXZhdGUgQWRhcHRlciBiYXNpY01hcHBpbmdMaXN0ZW5lcjsKLQkKLQlwcml2YXRlIEJ1dHRvbiBidXR0b247Ci0KLQotCXB1YmxpYyBMb2JDaGVja0JveChDb21wb3NpdGUgcGFyZW50LCBDb21tYW5kU3RhY2sgdGhlQ29tbWFuZFN0YWNrLCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXN1cGVyKHBhcmVudCwgdGhlQ29tbWFuZFN0YWNrLCB3aWRnZXRGYWN0b3J5KTsKLQkJYnVpbGRCYXNpY01hcHBpbmdMaXN0ZW5lcigpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYnVpbGRCYXNpY01hcHBpbmdMaXN0ZW5lcigpIHsKLQkJdGhpcy5iYXNpY01hcHBpbmdMaXN0ZW5lciA9IG5ldyBBZGFwdGVySW1wbCgpIHsKLQkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkJCWJzYWljTWFwcGluZ0NoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYnVpbGRXaWRnZXQoQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmJ1dHRvbiA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVCdXR0b24oCi0JCQkJCQlwYXJlbnQsIAotCQkJCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkJhc2ljR2VuZXJhbFNlY3Rpb25fbG9iTGFiZWwsCi0JCQkJCQlTV1QuQ0hFQ0spOwotCQkKLQkJdGhpcy5idXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlMb2JDaGVja0JveC50aGlzLmxvYlNlbGVjdGlvbkNoYW5nZWQoKTsKLQkJCX0KLQkJCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUxvYkNoZWNrQm94LnRoaXMubG9iU2VsZWN0aW9uQ2hhbmdlZCgpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0Jdm9pZCBsb2JTZWxlY3Rpb25DaGFuZ2VkKCkgewotCQlib29sZWFuIGxvYiA9IHRoaXMuYnV0dG9uLmdldFNlbGVjdGlvbigpOwotCQlpZiAodGhpcy5iYXNpY01hcHBpbmcuaXNMb2IoKSAhPSBsb2IpIHsKLQkJCXRoaXMuYmFzaWNNYXBwaW5nLnNldExvYihsb2IpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJzYWljTWFwcGluZ0NoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlpZiAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChJQmFzaWMuY2xhc3MpID09IAotCQkJCUpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSUJBU0lDX19MT0IpIHsKLQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYygKLQkJCQluZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCXBvcHVsYXRlKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VMaXN0ZW5lcnMoKSB7Ci0JCWlmICh0aGlzLmJhc2ljTWFwcGluZyAhPSBudWxsKSB7Ci0JCQl0aGlzLmJhc2ljTWFwcGluZy5lQWRhcHRlcnMoKS5hZGQodGhpcy5iYXNpY01hcHBpbmdMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTGlzdGVuZXJzKCkgewotCQlpZiAodGhpcy5iYXNpY01hcHBpbmcgIT0gbnVsbCkgewotCQkJdGhpcy5iYXNpY01hcHBpbmcuZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMuYmFzaWNNYXBwaW5nTGlzdGVuZXIpOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRvUG9wdWxhdGUoRU9iamVjdCBvYmopIHsKLQkJdGhpcy5iYXNpY01hcHBpbmcgPSAoSUJhc2ljKSBvYmo7Ci0JCXBvcHVsYXRlQnV0dG9uKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvUG9wdWxhdGUoKSB7Ci0JCXBvcHVsYXRlQnV0dG9uKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZUJ1dHRvbigpIHsKLQkJYm9vbGVhbiBsb2IgPSBmYWxzZTsKLQkJaWYgKHRoaXMuYmFzaWNNYXBwaW5nICE9IG51bGwpIHsKLQkJCWxvYiAgPSB0aGlzLmJhc2ljTWFwcGluZy5pc0xvYigpOwotCQl9Ci0JCQotCQlpZiAodGhpcy5idXR0b24uZ2V0U2VsZWN0aW9uKCkgIT0gbG9iKSB7Ci0JCQl0aGlzLmJ1dHRvbi5zZXRTZWxlY3Rpb24obG9iKTsKLQkJfQotCX0KLQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKSB7Ci0JCXJldHVybiB0aGlzLmJ1dHRvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL01hbnlUb01hbnlDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvTWFueVRvTWFueUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODUzZWJhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvTWFueVRvTWFueUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklNYW55VG9NYW55OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkJhc2VKcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRXhwYW5kYWJsZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBNYW55VG9NYW55Q29tcG9zaXRlIGV4dGVuZHMgQmFzZUpwYUNvbXBvc2l0ZSAKLXsKLQlwcml2YXRlIElNYW55VG9NYW55IG1hbnlUb01hbnk7Ci0JCi0JcHJpdmF0ZSBUYXJnZXRFbnRpdHlDaG9vc2VyIHRhcmdldEVudGl0eUNob29zZXI7Ci0KLQlwcml2YXRlIEVudW1Db21ib1ZpZXdlciBmZXRjaFR5cGVDb21ib1ZpZXdlcjsKLQotCXByaXZhdGUgTWFwcGVkQnlDb21ibyBtYXBwZWRCeUNvbWJvOwotCi0JcHJpdmF0ZSBDYXNjYWRlQ29tcG9zaXRlIGNhc2NhZGVDb21wb3NpdGU7Ci0KLQlwcml2YXRlIE9yZGVyaW5nQ29tcG9zaXRlIG9yZGVyaW5nQ29tcG9zaXRlOwotCi0JcHJpdmF0ZSBKb2luVGFibGVDb21wb3NpdGUgam9pblRhYmxlQ29tcG9zaXRlOwotCQotCi0JcHVibGljIE1hbnlUb01hbnlDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjaywgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlzdXBlcihwYXJlbnQsIFNXVC5OVUxMLCBjb21tYW5kU3RhY2ssIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQkKLQkJQ29udHJvbCBnZW5lcmFsQ29udHJvbCA9IGJ1aWxkR2VuZXJhbENvbXBvc2l0ZShjb21wb3NpdGUpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdlbmVyYWxDb250cm9sLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCUNvbnRyb2wgam9pblRhYmxlQ29udHJvbCA9IGJ1aWxkSm9pblRhYmxlQ29udHJvbChjb21wb3NpdGUpOwotCSAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWpvaW5UYWJsZUNvbnRyb2wuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JfQotCQotCXByaXZhdGUgQ29udHJvbCBidWlsZEdlbmVyYWxDb21wb3NpdGUoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotLy8JCUlXb3JrYmVuY2hIZWxwU3lzdGVtIGhlbHBTeXN0ZW0gPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKTsKLQkJCi0JCUNvbXBvc2l0ZSBnZW5lcmFsQ29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNvbXBvc2l0ZShjb21wb3NpdGUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJZ2VuZXJhbENvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsJCi0KLQkJdGhpcy50YXJnZXRFbnRpdHlDaG9vc2VyID0gQ29tbW9uV2lkZ2V0cy5idWlsZFRhcmdldEVudGl0eUNob29zZXIoZ2VuZXJhbENvbXBvc2l0ZSwgY29tbWFuZFN0YWNrLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkJFR0lOTklORzsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJdGhpcy50YXJnZXRFbnRpdHlDaG9vc2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQkKLQkJQ29tbW9uV2lkZ2V0cy5idWlsZEZldGNoTGFiZWwoZ2VuZXJhbENvbXBvc2l0ZSwgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQkJdGhpcy5mZXRjaFR5cGVDb21ib1ZpZXdlciA9IENvbW1vbldpZGdldHMuYnVpbGRGZXRjaFR5cGVDb21ib1ZpZXdlcihnZW5lcmFsQ29tcG9zaXRlLCB0aGlzLmNvbW1hbmRTdGFjaywgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5CRUdJTk5JTkc7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQl0aGlzLmZldGNoVHlwZUNvbWJvVmlld2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCi0JCUNvbW1vbldpZGdldHMuYnVpbGRNYXBwZWRCeUxhYmVsKGdlbmVyYWxDb21wb3NpdGUsIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCXRoaXMubWFwcGVkQnlDb21ibyA9IG5ldyBNYXBwZWRCeUNvbWJvKGdlbmVyYWxDb21wb3NpdGUsIHRoaXMuY29tbWFuZFN0YWNrLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkJFR0lOTklORzsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXRoaXMubWFwcGVkQnlDb21iby5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJdGhpcy5jYXNjYWRlQ29tcG9zaXRlID0gbmV3IENhc2NhZGVDb21wb3NpdGUoZ2VuZXJhbENvbXBvc2l0ZSwgdGhpcy5jb21tYW5kU3RhY2ssIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQl0aGlzLmNhc2NhZGVDb21wb3NpdGUuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0KLQkJdGhpcy5vcmRlcmluZ0NvbXBvc2l0ZSA9IG5ldyBPcmRlcmluZ0NvbXBvc2l0ZShjb21wb3NpdGUsIHRoaXMuY29tbWFuZFN0YWNrLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJdGhpcy5vcmRlcmluZ0NvbXBvc2l0ZS5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJcmV0dXJuIGdlbmVyYWxDb21wb3NpdGU7Ci0JfQotCQotCXByaXZhdGUgQ29udHJvbCBidWlsZEpvaW5UYWJsZUNvbnRyb2woQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCSAgICBTZWN0aW9uIHNlY3Rpb24gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlU2VjdGlvbihjb21wb3NpdGUsIFNXVC5GTEFUIHwgRXhwYW5kYWJsZUNvbXBvc2l0ZS5UV0lTVElFIHwgRXhwYW5kYWJsZUNvbXBvc2l0ZS5USVRMRV9CQVIpOwotCSAgICBzZWN0aW9uLnNldFRleHQoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLk11bHRpUmVsYXRpb25zaGlwTWFwcGluZ0NvbXBvc2l0ZV9qb2luVGFibGUpOwotCi0JCUNvbXBvc2l0ZSBqb2luVGFibGVDbGllbnQgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ29tcG9zaXRlKHNlY3Rpb24pOwotCQlzZWN0aW9uLnNldENsaWVudChqb2luVGFibGVDbGllbnQpOwotCQkKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlqb2luVGFibGVDbGllbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJdGhpcy5qb2luVGFibGVDb21wb3NpdGUgPSBuZXcgSm9pblRhYmxlQ29tcG9zaXRlKGpvaW5UYWJsZUNsaWVudCwgdGhpcy5jb21tYW5kU3RhY2ssIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCXRoaXMuam9pblRhYmxlQ29tcG9zaXRlLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCi0JCXJldHVybiBzZWN0aW9uOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkb1BvcHVsYXRlKEVPYmplY3Qgb2JqKSB7Ci0JCXRoaXMubWFueVRvTWFueSA9IChJTWFueVRvTWFueSkgb2JqOwotCQl0aGlzLnRhcmdldEVudGl0eUNob29zZXIucG9wdWxhdGUodGhpcy5tYW55VG9NYW55KTsKLQkJdGhpcy5mZXRjaFR5cGVDb21ib1ZpZXdlci5wb3B1bGF0ZShDb21tb25XaWRnZXRzLmJ1aWxkTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nRmV0Y2hFbnVtSG9sZGVyKHRoaXMubWFueVRvTWFueSkpOwotCQl0aGlzLm1hcHBlZEJ5Q29tYm8ucG9wdWxhdGUodGhpcy5tYW55VG9NYW55KTsKLQkJdGhpcy5jYXNjYWRlQ29tcG9zaXRlLnBvcHVsYXRlKHRoaXMubWFueVRvTWFueSk7Ci0JCWlmICh0aGlzLm1hbnlUb01hbnkgIT0gbnVsbCkgewotCQkJdGhpcy5qb2luVGFibGVDb21wb3NpdGUucG9wdWxhdGUodGhpcy5tYW55VG9NYW55LmdldEpvaW5UYWJsZSgpKTsKLQkJCXRoaXMub3JkZXJpbmdDb21wb3NpdGUucG9wdWxhdGUodGhpcy5tYW55VG9NYW55KTsKLQkJfQotCQllbHNlIHsKLQkJCXRoaXMuam9pblRhYmxlQ29tcG9zaXRlLnBvcHVsYXRlKG51bGwpOwotCQkJdGhpcy5vcmRlcmluZ0NvbXBvc2l0ZS5wb3B1bGF0ZShudWxsKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBkb1BvcHVsYXRlKCkgewotCQl0aGlzLnRhcmdldEVudGl0eUNob29zZXIucG9wdWxhdGUoKTsKLQkJdGhpcy5mZXRjaFR5cGVDb21ib1ZpZXdlci5wb3B1bGF0ZSgpOwotCQl0aGlzLm1hcHBlZEJ5Q29tYm8ucG9wdWxhdGUoKTsKLQkJdGhpcy5jYXNjYWRlQ29tcG9zaXRlLnBvcHVsYXRlKCk7Ci0JCXRoaXMuam9pblRhYmxlQ29tcG9zaXRlLnBvcHVsYXRlKCk7Ci0JCXRoaXMub3JkZXJpbmdDb21wb3NpdGUucG9wdWxhdGUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTGlzdGVuZXJzKCkgewotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VMaXN0ZW5lcnMoKSB7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXRoaXMudGFyZ2V0RW50aXR5Q2hvb3Nlci5kaXNwb3NlKCk7Ci0JCXRoaXMuZmV0Y2hUeXBlQ29tYm9WaWV3ZXIuZGlzcG9zZSgpOwotCQl0aGlzLm1hcHBlZEJ5Q29tYm8uZGlzcG9zZSgpOwotCQl0aGlzLmNhc2NhZGVDb21wb3NpdGUuZGlzcG9zZSgpOwotCQl0aGlzLmpvaW5UYWJsZUNvbXBvc2l0ZS5kaXNwb3NlKCk7Ci0JCXRoaXMub3JkZXJpbmdDb21wb3NpdGUuZGlzcG9zZSgpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL01hbnlUb09uZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9NYW55VG9PbmVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM2Y2Q3Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL01hbnlUb09uZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLkRlZmF1bHRUcnVlQm9vbGVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JTWFueVRvT25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLkpwYUNvcmVNYXBwaW5nc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLklKcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5CYXNlSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzLkVudW1Db21ib1ZpZXdlci5FbnVtSG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLklXb3JrYmVuY2hIZWxwU3lzdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgTWFueVRvT25lQ29tcG9zaXRlIGV4dGVuZHMgQmFzZUpwYUNvbXBvc2l0ZSAKLXsKLQlwcml2YXRlIElNYW55VG9PbmUgbWFueVRvT25lOwotCQotCXByaXZhdGUgVGFyZ2V0RW50aXR5Q2hvb3NlciB0YXJnZXRFbnRpdHlDaG9vc2VyOwotCi0JcHJpdmF0ZSBFbnVtQ29tYm9WaWV3ZXIgZmV0Y2hUeXBlQ29tYm9WaWV3ZXI7Ci0JCi0JcHJpdmF0ZSBFbnVtQ29tYm9WaWV3ZXIgb3B0aW9uYWxDb21ib1ZpZXdlcjsKLQotCXByaXZhdGUgT3JkZXJpbmdDb21wb3NpdGUgb3JkZXJCeUNvbXBvc2l0ZTsKLQotCXByaXZhdGUgQ2FzY2FkZUNvbXBvc2l0ZSBjYXNjYWRlQ29tcG9zaXRlOwotCi0JcHJpdmF0ZSBKb2luQ29sdW1uQ29tcG9zaXRlIGpvaW5Db2x1bW5Db21wb3NpdGU7Ci0JCQotCXB1YmxpYyBNYW55VG9PbmVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjaywgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlzdXBlcihwYXJlbnQsIFNXVC5OVUxMLCBjb21tYW5kU3RhY2ssIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQkKLQkJQ29udHJvbCBnZW5lcmFsQ29udHJvbCA9IGJ1aWxkR2VuZXJhbENvbXBvc2l0ZShjb21wb3NpdGUpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdlbmVyYWxDb250cm9sLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JfQotCQotCXByaXZhdGUgQ29udHJvbCBidWlsZEdlbmVyYWxDb21wb3NpdGUoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlJV29ya2JlbmNoSGVscFN5c3RlbSBoZWxwU3lzdGVtID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCk7Ci0JCQotCQlDb21wb3NpdGUgZ2VuZXJhbENvbXBvc2l0ZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDb21wb3NpdGUoY29tcG9zaXRlKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWdlbmVyYWxDb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7CQotCQkKLQkJdGhpcy50YXJnZXRFbnRpdHlDaG9vc2VyID0gQ29tbW9uV2lkZ2V0cy5idWlsZFRhcmdldEVudGl0eUNob29zZXIoZ2VuZXJhbENvbXBvc2l0ZSwgY29tbWFuZFN0YWNrLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkJFR0lOTklORzsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJdGhpcy50YXJnZXRFbnRpdHlDaG9vc2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJaGVscFN5c3RlbS5zZXRIZWxwKHRhcmdldEVudGl0eUNob29zZXIuZ2V0Q29udHJvbCgpLCBJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19UQVJHRVRfRU5USVRZKTsKLQkJCi0JCUNvbW1vbldpZGdldHMuYnVpbGRGZXRjaExhYmVsKGdlbmVyYWxDb21wb3NpdGUsIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCXRoaXMuZmV0Y2hUeXBlQ29tYm9WaWV3ZXIgPSBDb21tb25XaWRnZXRzLmJ1aWxkRmV0Y2hUeXBlQ29tYm9WaWV3ZXIoZ2VuZXJhbENvbXBvc2l0ZSwgdGhpcy5jb21tYW5kU3RhY2ssIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuQkVHSU5OSU5HOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJdGhpcy5mZXRjaFR5cGVDb21ib1ZpZXdlci5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWhlbHBTeXN0ZW0uc2V0SGVscChmZXRjaFR5cGVDb21ib1ZpZXdlci5nZXRDb250cm9sKCksIElKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX0ZFVENIX1RZUEUpOwotCQkKLQkJQ29tbW9uV2lkZ2V0cy5idWlsZE9wdGlvbmFsTGFiZWwoZ2VuZXJhbENvbXBvc2l0ZSwgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQkJdGhpcy5vcHRpb25hbENvbWJvVmlld2VyID0gQ29tbW9uV2lkZ2V0cy5idWlsZEVudW1Db21ib1ZpZXdlcihnZW5lcmFsQ29tcG9zaXRlLCB0aGlzLmNvbW1hbmRTdGFjaywgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5CRUdJTk5JTkc7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQl0aGlzLm9wdGlvbmFsQ29tYm9WaWV3ZXIuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCXRoaXMuY2FzY2FkZUNvbXBvc2l0ZSA9IG5ldyBDYXNjYWRlQ29tcG9zaXRlKGdlbmVyYWxDb21wb3NpdGUsIHRoaXMuY29tbWFuZFN0YWNrLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJdGhpcy5jYXNjYWRlQ29tcG9zaXRlLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQl0aGlzLmpvaW5Db2x1bW5Db21wb3NpdGUgPSBuZXcgSm9pbkNvbHVtbkNvbXBvc2l0ZShnZW5lcmFsQ29tcG9zaXRlLCB0aGlzLmNvbW1hbmRTdGFjaywgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQl0aGlzLmpvaW5Db2x1bW5Db21wb3NpdGUuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwkKLQotCQlyZXR1cm4gZ2VuZXJhbENvbXBvc2l0ZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZG9Qb3B1bGF0ZShFT2JqZWN0IG9iaikgewotCQl0aGlzLm1hbnlUb09uZSA9IChJTWFueVRvT25lKSBvYmo7Ci0JCXRoaXMudGFyZ2V0RW50aXR5Q2hvb3Nlci5wb3B1bGF0ZSh0aGlzLm1hbnlUb09uZSk7Ci0JCXRoaXMuZmV0Y2hUeXBlQ29tYm9WaWV3ZXIucG9wdWxhdGUoQ29tbW9uV2lkZ2V0cy5idWlsZFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdGZXRjaEVudW1Ib2xkZXIodGhpcy5tYW55VG9PbmUpKTsKLQkJdGhpcy5vcHRpb25hbENvbWJvVmlld2VyLnBvcHVsYXRlKENvbW1vbldpZGdldHMuYnVpbGRPcHRpb25hbEhvbGRlcih0aGlzLm1hbnlUb09uZSkpOwotCQl0aGlzLmNhc2NhZGVDb21wb3NpdGUucG9wdWxhdGUodGhpcy5tYW55VG9PbmUpOwotCQl0aGlzLmpvaW5Db2x1bW5Db21wb3NpdGUucG9wdWxhdGUodGhpcy5tYW55VG9PbmUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkb1BvcHVsYXRlKCkgewotCQl0aGlzLnRhcmdldEVudGl0eUNob29zZXIucG9wdWxhdGUoKTsKLQkJdGhpcy5mZXRjaFR5cGVDb21ib1ZpZXdlci5wb3B1bGF0ZSgpOwotCQl0aGlzLm9wdGlvbmFsQ29tYm9WaWV3ZXIucG9wdWxhdGUoKTsKLQkJdGhpcy5jYXNjYWRlQ29tcG9zaXRlLnBvcHVsYXRlKCk7Ci0JCXRoaXMuam9pbkNvbHVtbkNvbXBvc2l0ZS5wb3B1bGF0ZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VMaXN0ZW5lcnMoKSB7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZUxpc3RlbmVycygpIHsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJdGhpcy50YXJnZXRFbnRpdHlDaG9vc2VyLmRpc3Bvc2UoKTsKLQkJdGhpcy5mZXRjaFR5cGVDb21ib1ZpZXdlci5kaXNwb3NlKCk7Ci0JCXRoaXMub3B0aW9uYWxDb21ib1ZpZXdlci5kaXNwb3NlKCk7Ci0JCXRoaXMuY2FzY2FkZUNvbXBvc2l0ZS5kaXNwb3NlKCk7Ci0JCXRoaXMuam9pbkNvbHVtbkNvbXBvc2l0ZS5kaXNwb3NlKCk7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL01hcHBlZEJ5Q29tYm8uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvTWFwcGVkQnlDb21iby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDk5MzQ3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvTWFwcGVkQnlDb21iby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAotICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklOb25Pd25pbmdNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklSZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLkpwYUNvcmVNYXBwaW5nc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLklKcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5CYXNlSnBhQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBNYXBwZWRCeUNvbWJvIGV4dGVuZHMgQmFzZUpwYUNvbnRyb2xsZXIKLXsKLQlwcml2YXRlIElOb25Pd25pbmdNYXBwaW5nIG5vbk93bmluZ01hcHBpbmc7Ci0JcHJpdmF0ZSBBZGFwdGVyIG5vbk93bmluZ01hcHBpbmdMaXN0ZW5lcjsKLQkKLQlwcml2YXRlIENDb21ibyBjb21ibzsKLQkKLQlwdWJsaWMgTWFwcGVkQnlDb21ibyhDb21wb3NpdGUgcGFyZW50LCBDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrLCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXN1cGVyKHBhcmVudCwgY29tbWFuZFN0YWNrLCB3aWRnZXRGYWN0b3J5KTsKLQkJdGhpcy5ub25Pd25pbmdNYXBwaW5nTGlzdGVuZXIgPSBidWlsZExpc3RlbmVyKCk7Ci0JfQotCQotCXByaXZhdGUgQWRhcHRlciBidWlsZExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IEFkYXB0ZXJJbXBsKCkgewotCQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCQkJbm9uT3duaW5nTWFwcGluZ0NoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCX0KLQkJfTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYnVpbGRXaWRnZXQoQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmNvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhwYXJlbnQsIFNXVC5GTEFUKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb21ibyxJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19NQVBQRURfQlkpOwotCQl0aGlzLmNvbWJvLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCWlmIChpc1BvcHVsYXRpbmcoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBtYXBwZWRCeSA9ICgoQ0NvbWJvKSBlLmdldFNvdXJjZSgpKS5nZXRUZXh0KCk7Ci0JCQkJaWYgKG1hcHBlZEJ5LmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQltYXBwZWRCeSA9IG51bGw7Ci0JCQkJCWlmIChnZXROb25Pd25pbmdNYXBwaW5nKCkuZ2V0TWFwcGVkQnkoKSA9PSBudWxsIHx8IGdldE5vbk93bmluZ01hcHBpbmcoKS5nZXRNYXBwZWRCeSgpLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChnZXROb25Pd25pbmdNYXBwaW5nKCkuZ2V0TWFwcGVkQnkoKSA9PSBudWxsIHx8ICFnZXROb25Pd25pbmdNYXBwaW5nKCkuZ2V0TWFwcGVkQnkoKS5lcXVhbHMobWFwcGVkQnkpKSB7Ci0JCQkJCWdldE5vbk93bmluZ01hcHBpbmcoKS5zZXRNYXBwZWRCeShtYXBwZWRCeSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJTm9uT3duaW5nTWFwcGluZyBnZXROb25Pd25pbmdNYXBwaW5nKCkgewotCQlyZXR1cm4gdGhpcy5ub25Pd25pbmdNYXBwaW5nOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvUG9wdWxhdGUoRU9iamVjdCBvYmopIHsKLQkJdGhpcy5ub25Pd25pbmdNYXBwaW5nID0gKElOb25Pd25pbmdNYXBwaW5nKSBvYmo7Ci0JCQotCQlpZiAodGhpcy5ub25Pd25pbmdNYXBwaW5nID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJcG9wdWxhdGVDb21ibygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZUNvbWJvKCkgewotCQlwb3B1bGF0ZUNob2ljZXMoKTsKLQkJcG9wdWxhdGVNYXBwZWRCeVRleHQoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlQ2hvaWNlcygpIHsKLQkJaWYgKHRoaXMuY29tYm8uZ2V0SXRlbUNvdW50KCkgPiAwKSB7Ci0JCQl0aGlzLmNvbWJvLnJlbW92ZUFsbCgpOwotCQl9Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBpID0gdGhpcy5ub25Pd25pbmdNYXBwaW5nLmNhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKTsgaS5oYXNOZXh0KCk7ICkgewotCQkJdGhpcy5jb21iby5hZGQoaS5uZXh0KCkpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZU1hcHBlZEJ5VGV4dCgpIHsKLQkJU3RyaW5nIG1hcHBlZEJ5ID0gdGhpcy5ub25Pd25pbmdNYXBwaW5nLmdldE1hcHBlZEJ5KCk7Ci0JCWlmIChtYXBwZWRCeSAhPSBudWxsKSB7Ci0JCQlpZiAoIXRoaXMuY29tYm8uZ2V0VGV4dCgpLmVxdWFscyhtYXBwZWRCeSkpIHsKLQkJCQl0aGlzLmNvbWJvLnNldFRleHQobWFwcGVkQnkpOwotCQkJfQotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvUG9wdWxhdGUoKSB7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTGlzdGVuZXJzKCkgewotCQlpZiAodGhpcy5ub25Pd25pbmdNYXBwaW5nICE9IG51bGwpIHsKLQkJCXRoaXMubm9uT3duaW5nTWFwcGluZy5lQWRhcHRlcnMoKS5hZGQodGhpcy5ub25Pd25pbmdNYXBwaW5nTGlzdGVuZXIpOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZUxpc3RlbmVycygpIHsKLQkJaWYgKHRoaXMubm9uT3duaW5nTWFwcGluZyAhPSBudWxsKSB7Ci0JCQl0aGlzLm5vbk93bmluZ01hcHBpbmcuZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMubm9uT3duaW5nTWFwcGluZ0xpc3RlbmVyKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBub25Pd25pbmdNYXBwaW5nQ2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCWlmIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKElOb25Pd25pbmdNYXBwaW5nLmNsYXNzKSA9PSBKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLklOT05fT1dOSU5HX01BUFBJTkdfX01BUFBFRF9CWSkgewotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChnZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJcG9wdWxhdGVNYXBwZWRCeVRleHQoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQllbHNlIGlmIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKElSZWxhdGlvbnNoaXBNYXBwaW5nLmNsYXNzKSA9PSBKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLklSRUxBVElPTlNISVBfTUFQUElOR19fUkVTT0xWRURfVEFSR0VUX0VOVElUWSkgewotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChnZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJcG9wdWxhdGVDaG9pY2VzKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCkgewotCQlyZXR1cm4gdGhpcy5jb21ibzsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL01hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDIxZWM3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklNYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkJhc2VKcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZSBleHRlbmRzIEJhc2VKcGFDb21wb3NpdGUgCi17Ci0JcHJpdmF0ZSBJTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzOwotCXByaXZhdGUgQWRhcHRlciBtYXBwZWRTdXBlcmNsYXNzTGlzdGVuZXI7Ci0JCi0JcHJpdmF0ZSBDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrOwotCQotCQotCXB1YmxpYyBNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIENvbW1hbmRTdGFjayBjb21tYW5kU3RhY2ssIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJc3VwZXIocGFyZW50LCBTV1QuTlVMTCwgY29tbWFuZFN0YWNrLCB3aWRnZXRGYWN0b3J5KTsKLQkJdGhpcy5tYXBwZWRTdXBlcmNsYXNzTGlzdGVuZXIgPSBidWlsZE1hcHBlZFN1cGVyY2xhc3NMaXN0ZW5lcigpOwotCX0KLQkKLQlwcml2YXRlIEFkYXB0ZXIgYnVpbGRNYXBwZWRTdXBlcmNsYXNzTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkJCW1hcHBlZFN1cGVyY2xhc3NDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KFNXVC5WRVJUSUNBTCkpOwotCQkKLS8vCQlMYWJlbCBhY2Nlc3NUeXBlTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0vLwkJYWNjZXNzVHlwZUxhYmVsLnNldFRleHQoRGFsaVVpTWVzc2FnZXMuTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZV9hY2Nlc3NUeXBlKTsKLS8vCQl0aGlzLmFjY2Vzc1R5cGVDb21ib1ZpZXdlciA9IGJ1aWxkQWNjZXNzVHlwZUNvbWJvKGNvbXBvc2l0ZSk7Ci0vLwkJLy9ldmVudHVhbGx5IHRoaXMgd2lsbCBiZSBlbmFibGVkIGlmIGVkaXRpbmcgeG1sIGluc3RlYWQgb2YgamF2YQotLy8JCXRoaXMuYWNjZXNzVHlwZUNvbWJvVmlld2VyLmdldENvbWJvKCkuc2V0RW5hYmxlZChmYWxzZSk7Ci0vLwkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLS8vCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLS8vCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLS8vCQl0aGlzLmFjY2Vzc1R5cGVDb21ib1ZpZXdlci5nZXRDb21ibygpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotLy8JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGhpcy5hY2Nlc3NUeXBlQ29tYm9WaWV3ZXIuZ2V0Q29tYm8oKSwgSURhbGlIZWxwQ29udGV4dElkcy5FTlRJVFlfQUNDRVNTX1RZUEUpOwotCQkKLQl9Ci0JCi0vLwlwcml2YXRlIENvbWJvVmlld2VyIGJ1aWxkQWNjZXNzVHlwZUNvbWJvKENvbXBvc2l0ZSBwYXJlbnQpIHsKLS8vCQlDb21ib1ZpZXdlciB2aWV3ZXIgPSBuZXcgQ29tYm9WaWV3ZXIocGFyZW50LCBTV1QuUkVBRF9PTkxZKTsKLS8vCQl2aWV3ZXIuYWRkKEFjY2Vzc1R5cGUuVkFMVUVTLnRvQXJyYXkoKSk7Ci0vLwkJdmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLS8vCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLS8vCQkJCWlmIChwb3B1bGF0aW5nKSB7Ci0vLwkJCQkJcmV0dXJuOwotLy8JCQkJfQotLy8JCQkJaWYgKGV2ZW50LmdldFNlbGVjdGlvbigpIGluc3RhbmNlb2YgU3RydWN0dXJlZFNlbGVjdGlvbikgewotLy8JCQkJCVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpOwotLy8JCQkJCWVkaXRpbmdEb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShTZXRDb21tYW5kLmNyZWF0ZShlZGl0aW5nRG9tYWluLCBwZXJzaXN0ZW50VHlwZSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGVyc2lzdGVudFR5cGVfQWNjZXNzVHlwZSgpLCBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkpKTsKLS8vCQkJCX0KLS8vCQkJfQotLy8JCX0pOwotLy8JCXJldHVybiB2aWV3ZXI7Ci0vLwl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9Qb3B1bGF0ZShFT2JqZWN0IG1vZGVsKSB7Ci0JCXRoaXMubWFwcGVkU3VwZXJjbGFzcyA9IChJTWFwcGVkU3VwZXJjbGFzcykgbW9kZWw7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvUG9wdWxhdGUoKSB7Ci0JCQotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VMaXN0ZW5lcnMoKSB7Ci0vLwkJdGhpcy5wZXJzaXN0ZW50VHlwZUl0ZW1Qcm92aWRlci5hZGRMaXN0ZW5lcihnZXRQZXJzaXN0ZW50VHlwZUxpc3RlbmVyKCkpOwotLy8JCXRoaXMucGVyc2lzdGVudFR5cGUuZUFkYXB0ZXJzKCkuYWRkKHRoaXMucGVyc2lzdGVudFR5cGVJdGVtUHJvdmlkZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZUxpc3RlbmVycygpIHsKLS8vCQlpZiAodGhpcy5wZXJzaXN0ZW50VHlwZSAhPSBudWxsKXsKLS8vCQkJdGhpcy5wZXJzaXN0ZW50VHlwZS5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcy5wZXJzaXN0ZW50VHlwZUl0ZW1Qcm92aWRlcik7Ci0vLwkJCXRoaXMucGVyc2lzdGVudFR5cGVJdGVtUHJvdmlkZXIucmVtb3ZlTGlzdGVuZXIoZ2V0UGVyc2lzdGVudFR5cGVMaXN0ZW5lcigpKTsKLS8vCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBtYXBwZWRTdXBlcmNsYXNzQ2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCQotCX0KLQkKLS8vCXByaXZhdGUgSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciBnZXRQZXJzaXN0ZW50VHlwZUxpc3RlbmVyKCkgewotLy8JCWlmICh0aGlzLnBlcnNpc3RlbnRUeXBlTGlzdGVuZXIgPT0gbnVsbCkgewotLy8JCQl0aGlzLnBlcnNpc3RlbnRUeXBlTGlzdGVuZXIgPSBuZXcgSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcigpIHsKLS8vCQkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotLy8JCQkJCWlmIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFBlcnNpc3RlbnRUeXBlLmNsYXNzKSA9PSBPcm1QYWNrYWdlLlBFUlNJU1RFTlRfVFlQRV9fQUNDRVNTX1RZUEUpIHsKLS8vCQkJCQkJZmluYWwgQWNjZXNzVHlwZSBhY2Nlc3NUeXBlID0gKEFjY2Vzc1R5cGUpIG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpOwotLy8JCQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0vLwkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0vLwkJCQkJCQkJaWYgKCgoU3RydWN0dXJlZFNlbGVjdGlvbikgYWNjZXNzVHlwZUNvbWJvVmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKSAhPSBhY2Nlc3NUeXBlKSB7Ci0vLwkJCQkJCQkJCWFjY2Vzc1R5cGVDb21ib1ZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oYWNjZXNzVHlwZSkpOwotLy8JCQkJCQkJCX0KLS8vCQkJCQkJCX0KLS8vCQkJCQkJfSk7Ci0vLwkJCQkJfQotLy8JCQkJfQotLy8JCQl9OwotLy8JCX0KLS8vCQlyZXR1cm4gdGhpcy5wZXJzaXN0ZW50VHlwZUxpc3RlbmVyOwotLy8JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9PbmVUb01hbnlDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvT25lVG9NYW55Q29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMzE3M2YuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9PbmVUb01hbnlDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24gYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JT25lVG9NYW55OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5JSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQmFzZUpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkV4cGFuZGFibGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSVdvcmtiZW5jaEhlbHBTeXN0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBPbmVUb01hbnlDb21wb3NpdGUgZXh0ZW5kcyBCYXNlSnBhQ29tcG9zaXRlIAotewotCXByaXZhdGUgSU9uZVRvTWFueSBvbmVUb01hbnk7Ci0JCi0JcHJpdmF0ZSBFbnVtQ29tYm9WaWV3ZXIgZmV0Y2hUeXBlQ29tYm9WaWV3ZXI7Ci0JCi0JcHJpdmF0ZSBUYXJnZXRFbnRpdHlDaG9vc2VyIHRhcmdldEVudGl0eUNob29zZXI7Ci0JCi0JcHJpdmF0ZSBNYXBwZWRCeUNvbWJvIG1hcHBlZEJ5Q29tYm87Ci0KLQlwcml2YXRlIENhc2NhZGVDb21wb3NpdGUgY2FzY2FkZUNvbXBvc2l0ZTsKLQkKLQlwcml2YXRlIE9yZGVyaW5nQ29tcG9zaXRlIG9yZGVyaW5nQ29tcG9zaXRlOwotCi0JcHJpdmF0ZSBKb2luVGFibGVDb21wb3NpdGUgam9pblRhYmxlQ29tcG9zaXRlOwotCQotCXB1YmxpYyBPbmVUb01hbnlDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjaywgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlzdXBlcihwYXJlbnQsIFNXVC5OVUxMLCBjb21tYW5kU3RhY2ssIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQkKLQkJQ29udHJvbCBnZW5lcmFsQ29udHJvbCA9IGJ1aWxkR2VuZXJhbENvbnRyb2woY29tcG9zaXRlKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlnZW5lcmFsQ29udHJvbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQlDb250cm9sIGpvaW5UYWJsZUNvbnRyb2wgPSBidWlsZEpvaW5UYWJsZUNvbnRyb2woY29tcG9zaXRlKTsKLQkgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlqb2luVGFibGVDb250cm9sLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCX0KLQkKLQlwcml2YXRlIENvbnRyb2wgYnVpbGRHZW5lcmFsQ29udHJvbChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUlXb3JrYmVuY2hIZWxwU3lzdGVtIGhlbHBTeXN0ZW0gPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKTsKLQkJCi0JCUNvbXBvc2l0ZSBnZW5lcmFsQ29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNvbXBvc2l0ZShjb21wb3NpdGUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJZ2VuZXJhbENvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsJCi0KLQkJR3JpZERhdGEgZ3JpZERhdGE7Ci0JCQotCQl0aGlzLnRhcmdldEVudGl0eUNob29zZXIgPSBDb21tb25XaWRnZXRzLmJ1aWxkVGFyZ2V0RW50aXR5Q2hvb3NlcihnZW5lcmFsQ29tcG9zaXRlLCB0aGlzLmNvbW1hbmRTdGFjaywgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5CRUdJTk5JTkc7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXRoaXMudGFyZ2V0RW50aXR5Q2hvb3Nlci5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJQ29tbW9uV2lkZ2V0cy5idWlsZEZldGNoTGFiZWwoZ2VuZXJhbENvbXBvc2l0ZSwgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQkJdGhpcy5mZXRjaFR5cGVDb21ib1ZpZXdlciA9IENvbW1vbldpZGdldHMuYnVpbGRGZXRjaFR5cGVDb21ib1ZpZXdlcihnZW5lcmFsQ29tcG9zaXRlLCB0aGlzLmNvbW1hbmRTdGFjaywgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5CRUdJTk5JTkc7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQl0aGlzLmZldGNoVHlwZUNvbWJvVmlld2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJaGVscFN5c3RlbS5zZXRIZWxwKHRoaXMuZmV0Y2hUeXBlQ29tYm9WaWV3ZXIuZ2V0Q29udHJvbCgpLCBJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19GRVRDSF9UWVBFKTsKLQotCQlDb21tb25XaWRnZXRzLmJ1aWxkTWFwcGVkQnlMYWJlbChnZW5lcmFsQ29tcG9zaXRlLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCQl0aGlzLm1hcHBlZEJ5Q29tYm8gPSBuZXcgTWFwcGVkQnlDb21ibyhnZW5lcmFsQ29tcG9zaXRlLCB0aGlzLmNvbW1hbmRTdGFjaywgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5CRUdJTk5JTkc7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQl0aGlzLm1hcHBlZEJ5Q29tYm8uZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQloZWxwU3lzdGVtLnNldEhlbHAodGhpcy5tYXBwZWRCeUNvbWJvLmdldENvbnRyb2woKSwgSUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfTUFQUEVEX0JZKTsKLQkJCi0JCXRoaXMuY2FzY2FkZUNvbXBvc2l0ZSA9IG5ldyBDYXNjYWRlQ29tcG9zaXRlKGdlbmVyYWxDb21wb3NpdGUsIHRoaXMuY29tbWFuZFN0YWNrLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJdGhpcy5jYXNjYWRlQ29tcG9zaXRlLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkKLQkJdGhpcy5vcmRlcmluZ0NvbXBvc2l0ZSA9IG5ldyBPcmRlcmluZ0NvbXBvc2l0ZShnZW5lcmFsQ29tcG9zaXRlLCB0aGlzLmNvbW1hbmRTdGFjaywgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXRoaXMub3JkZXJpbmdDb21wb3NpdGUuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkKLQotCQlyZXR1cm4gZ2VuZXJhbENvbXBvc2l0ZTsKLQl9Ci0JCi0JcHJpdmF0ZSBDb250cm9sIGJ1aWxkSm9pblRhYmxlQ29udHJvbChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JICAgIFNlY3Rpb24gc2VjdGlvbiA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVTZWN0aW9uKGNvbXBvc2l0ZSwgU1dULkZMQVQgfCBFeHBhbmRhYmxlQ29tcG9zaXRlLlRXSVNUSUUgfCBFeHBhbmRhYmxlQ29tcG9zaXRlLlRJVExFX0JBUik7Ci0JICAgIHNlY3Rpb24uc2V0VGV4dChKcHRVaU1hcHBpbmdzTWVzc2FnZXMuTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nQ29tcG9zaXRlX2pvaW5UYWJsZSk7Ci0KLQkJQ29tcG9zaXRlIGpvaW5UYWJsZUNsaWVudCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDb21wb3NpdGUoc2VjdGlvbik7Ci0JCXNlY3Rpb24uc2V0Q2xpZW50KGpvaW5UYWJsZUNsaWVudCk7Ci0JCQotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWpvaW5UYWJsZUNsaWVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQl0aGlzLmpvaW5UYWJsZUNvbXBvc2l0ZSA9IG5ldyBKb2luVGFibGVDb21wb3NpdGUoam9pblRhYmxlQ2xpZW50LCB0aGlzLmNvbW1hbmRTdGFjaywgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJdGhpcy5qb2luVGFibGVDb21wb3NpdGUuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkKLQkJcmV0dXJuIHNlY3Rpb247Ci0JfQotCi0JcHVibGljIHZvaWQgZG9Qb3B1bGF0ZShFT2JqZWN0IG9iaikgewotCQl0aGlzLm9uZVRvTWFueSA9IChJT25lVG9NYW55KSBvYmo7Ci0JCXRoaXMuZmV0Y2hUeXBlQ29tYm9WaWV3ZXIucG9wdWxhdGUoQ29tbW9uV2lkZ2V0cy5idWlsZE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ0ZldGNoRW51bUhvbGRlcih0aGlzLm9uZVRvTWFueSkpOwotCQl0aGlzLnRhcmdldEVudGl0eUNob29zZXIucG9wdWxhdGUodGhpcy5vbmVUb01hbnkpOwotCQl0aGlzLm1hcHBlZEJ5Q29tYm8ucG9wdWxhdGUodGhpcy5vbmVUb01hbnkpOwotCQl0aGlzLmNhc2NhZGVDb21wb3NpdGUucG9wdWxhdGUodGhpcy5vbmVUb01hbnkpOwotCQlpZiAodGhpcy5vbmVUb01hbnkgIT0gbnVsbCkgewotCQkJdGhpcy5qb2luVGFibGVDb21wb3NpdGUucG9wdWxhdGUodGhpcy5vbmVUb01hbnkuZ2V0Sm9pblRhYmxlKCkpOwotCQkJdGhpcy5vcmRlcmluZ0NvbXBvc2l0ZS5wb3B1bGF0ZSh0aGlzLm9uZVRvTWFueSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLmpvaW5UYWJsZUNvbXBvc2l0ZS5wb3B1bGF0ZShudWxsKTsKLQkJCXRoaXMub3JkZXJpbmdDb21wb3NpdGUucG9wdWxhdGUobnVsbCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgZG9Qb3B1bGF0ZSgpIHsKLQkJdGhpcy5mZXRjaFR5cGVDb21ib1ZpZXdlci5wb3B1bGF0ZSgpOwotCQl0aGlzLnRhcmdldEVudGl0eUNob29zZXIucG9wdWxhdGUoKTsKLQkJdGhpcy5tYXBwZWRCeUNvbWJvLnBvcHVsYXRlKCk7Ci0JCXRoaXMuY2FzY2FkZUNvbXBvc2l0ZS5wb3B1bGF0ZSgpOwotCQl0aGlzLmpvaW5UYWJsZUNvbXBvc2l0ZS5wb3B1bGF0ZSgpOwotCQl0aGlzLm9yZGVyaW5nQ29tcG9zaXRlLnBvcHVsYXRlKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUxpc3RlbmVycygpIHsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTGlzdGVuZXJzKCkgewotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl0aGlzLmZldGNoVHlwZUNvbWJvVmlld2VyLmRpc3Bvc2UoKTsKLQkJdGhpcy50YXJnZXRFbnRpdHlDaG9vc2VyLmRpc3Bvc2UoKTsKLQkJdGhpcy5tYXBwZWRCeUNvbWJvLmRpc3Bvc2UoKTsKLQkJdGhpcy5jYXNjYWRlQ29tcG9zaXRlLmRpc3Bvc2UoKTsKLQkJdGhpcy5qb2luVGFibGVDb21wb3NpdGUuZGlzcG9zZSgpOwotCQl0aGlzLm9yZGVyaW5nQ29tcG9zaXRlLmRpc3Bvc2UoKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvT25lVG9PbmVDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvT25lVG9PbmVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE2YTM1MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL09uZVRvT25lQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuRGVmYXVsdFRydWVCb29sZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklPbmVUb09uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5KcGFDb3JlTWFwcGluZ3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkJhc2VKcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHMuRW51bUNvbWJvVmlld2VyLkVudW1Ib2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLQotcHVibGljIGNsYXNzIE9uZVRvT25lQ29tcG9zaXRlIGV4dGVuZHMgQmFzZUpwYUNvbXBvc2l0ZSAKLXsKLQlwcml2YXRlIElPbmVUb09uZSBvbmVUb09uZTsKLQkKLQlwcml2YXRlIFRhcmdldEVudGl0eUNob29zZXIgdGFyZ2V0RW50aXR5Q2hvb3NlcjsKLQotCXByaXZhdGUgRW51bUNvbWJvVmlld2VyIGZldGNoVHlwZUNvbWJvVmlld2VyOwotCQotCXByaXZhdGUgTWFwcGVkQnlDb21ibyBtYXBwZWRCeUNvbWJvOwotCi0JcHJpdmF0ZSBFbnVtQ29tYm9WaWV3ZXIgb3B0aW9uYWxDb21ib1ZpZXdlcjsKLQotCXByaXZhdGUgQ2FzY2FkZUNvbXBvc2l0ZSBjYXNjYWRlQ29tcG9zaXRlOwotCi0JcHJpdmF0ZSBKb2luQ29sdW1uQ29tcG9zaXRlIGpvaW5Db2x1bW5Db21wb3NpdGU7Ci0JCQotCXB1YmxpYyBPbmVUb09uZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrLCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULk5VTEwsIGNvbW1hbmRTdGFjaywgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCXByaXZhdGUgSU9uZVRvT25lIGdldE9uZVRvT25lKCkgewotCQlyZXR1cm4gdGhpcy5vbmVUb09uZTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCi0JCUNvbnRyb2wgZ2VuZXJhbENvbnRyb2wgPSBidWlsZEdlbmVyYWxDb21wb3NpdGUoY29tcG9zaXRlKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlnZW5lcmFsQ29udHJvbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCX0KLQkKLQlwcml2YXRlIENvbnRyb2wgYnVpbGRHZW5lcmFsQ29tcG9zaXRlKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLS8vCQlJV29ya2JlbmNoSGVscFN5c3RlbSBoZWxwU3lzdGVtID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCk7Ci0JCQotCQlDb21wb3NpdGUgZ2VuZXJhbENvbXBvc2l0ZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDb21wb3NpdGUoY29tcG9zaXRlKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWdlbmVyYWxDb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7CQotCQkKLQkJdGhpcy50YXJnZXRFbnRpdHlDaG9vc2VyID0gQ29tbW9uV2lkZ2V0cy5idWlsZFRhcmdldEVudGl0eUNob29zZXIoZ2VuZXJhbENvbXBvc2l0ZSwgdGhpcy5jb21tYW5kU3RhY2ssIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuQkVHSU5OSU5HOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQl0aGlzLnRhcmdldEVudGl0eUNob29zZXIuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkKLQotCQlDb21tb25XaWRnZXRzLmJ1aWxkRmV0Y2hMYWJlbChnZW5lcmFsQ29tcG9zaXRlLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCQl0aGlzLmZldGNoVHlwZUNvbWJvVmlld2VyID0gQ29tbW9uV2lkZ2V0cy5idWlsZEZldGNoVHlwZUNvbWJvVmlld2VyKGdlbmVyYWxDb21wb3NpdGUsIHRoaXMuY29tbWFuZFN0YWNrLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkJFR0lOTklORzsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXRoaXMuZmV0Y2hUeXBlQ29tYm9WaWV3ZXIuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCUNvbW1vbldpZGdldHMuYnVpbGRNYXBwZWRCeUxhYmVsKGdlbmVyYWxDb21wb3NpdGUsIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCXRoaXMubWFwcGVkQnlDb21ibyA9IG5ldyBNYXBwZWRCeUNvbWJvKGdlbmVyYWxDb21wb3NpdGUsIHRoaXMuY29tbWFuZFN0YWNrLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkJFR0lOTklORzsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXRoaXMubWFwcGVkQnlDb21iby5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQotCQlDb21tb25XaWRnZXRzLmJ1aWxkT3B0aW9uYWxMYWJlbChnZW5lcmFsQ29tcG9zaXRlLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCQl0aGlzLm9wdGlvbmFsQ29tYm9WaWV3ZXIgPSBDb21tb25XaWRnZXRzLmJ1aWxkRW51bUNvbWJvVmlld2VyKGdlbmVyYWxDb21wb3NpdGUsIHRoaXMuY29tbWFuZFN0YWNrLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkJFR0lOTklORzsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXRoaXMub3B0aW9uYWxDb21ib1ZpZXdlci5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJdGhpcy5jYXNjYWRlQ29tcG9zaXRlID0gbmV3IENhc2NhZGVDb21wb3NpdGUoZ2VuZXJhbENvbXBvc2l0ZSwgdGhpcy5jb21tYW5kU3RhY2ssIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQl0aGlzLmNhc2NhZGVDb21wb3NpdGUuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCXRoaXMuam9pbkNvbHVtbkNvbXBvc2l0ZSA9IG5ldyBKb2luQ29sdW1uQ29tcG9zaXRlKGdlbmVyYWxDb21wb3NpdGUsIHRoaXMuY29tbWFuZFN0YWNrLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXRoaXMuam9pbkNvbHVtbkNvbXBvc2l0ZS5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7CQotCi0JCXJldHVybiBnZW5lcmFsQ29tcG9zaXRlOwotCX0KLQotCXB1YmxpYyB2b2lkIGRvUG9wdWxhdGUoRU9iamVjdCBvYmopIHsKLQkJdGhpcy5vbmVUb09uZSA9IChJT25lVG9PbmUpIG9iajsKLQkJdGhpcy50YXJnZXRFbnRpdHlDaG9vc2VyLnBvcHVsYXRlKHRoaXMub25lVG9PbmUpOwotCQl0aGlzLmZldGNoVHlwZUNvbWJvVmlld2VyLnBvcHVsYXRlKENvbW1vbldpZGdldHMuYnVpbGRTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nRmV0Y2hFbnVtSG9sZGVyKHRoaXMub25lVG9PbmUpKTsKLQkJdGhpcy5tYXBwZWRCeUNvbWJvLnBvcHVsYXRlKHRoaXMub25lVG9PbmUpOwotCQl0aGlzLm9wdGlvbmFsQ29tYm9WaWV3ZXIucG9wdWxhdGUoQ29tbW9uV2lkZ2V0cy5idWlsZE9wdGlvbmFsSG9sZGVyKHRoaXMub25lVG9PbmUpKTsKLQkJdGhpcy5jYXNjYWRlQ29tcG9zaXRlLnBvcHVsYXRlKHRoaXMub25lVG9PbmUpOwotCQl0aGlzLmpvaW5Db2x1bW5Db21wb3NpdGUucG9wdWxhdGUodGhpcy5vbmVUb09uZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRvUG9wdWxhdGUoKSB7Ci0JCXRoaXMudGFyZ2V0RW50aXR5Q2hvb3Nlci5wb3B1bGF0ZSgpOwotCQl0aGlzLmZldGNoVHlwZUNvbWJvVmlld2VyLnBvcHVsYXRlKCk7Ci0JCXRoaXMubWFwcGVkQnlDb21iby5wb3B1bGF0ZSgpOwotCQl0aGlzLm9wdGlvbmFsQ29tYm9WaWV3ZXIucG9wdWxhdGUoKTsKLQkJdGhpcy5jYXNjYWRlQ29tcG9zaXRlLnBvcHVsYXRlKCk7Ci0JCXRoaXMuam9pbkNvbHVtbkNvbXBvc2l0ZS5wb3B1bGF0ZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VMaXN0ZW5lcnMoKSB7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZUxpc3RlbmVycygpIHsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJdGhpcy50YXJnZXRFbnRpdHlDaG9vc2VyLmRpc3Bvc2UoKTsKLQkJdGhpcy5mZXRjaFR5cGVDb21ib1ZpZXdlci5kaXNwb3NlKCk7Ci0JCXRoaXMubWFwcGVkQnlDb21iby5kaXNwb3NlKCk7Ci0JCXRoaXMub3B0aW9uYWxDb21ib1ZpZXdlci5kaXNwb3NlKCk7Ci0JCXRoaXMuY2FzY2FkZUNvbXBvc2l0ZS5kaXNwb3NlKCk7Ci0JCXRoaXMuam9pbkNvbHVtbkNvbXBvc2l0ZS5kaXNwb3NlKCk7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9PcmRlcmluZ0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9PcmRlcmluZ0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWIxYmM2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvT3JkZXJpbmdDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSnBhQ29yZU1hcHBpbmdzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSUpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkJhc2VKcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLklXb3JrYmVuY2hIZWxwU3lzdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotCi0vKioKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBPcmRlcmluZ0NvbXBvc2l0ZSBleHRlbmRzIEJhc2VKcGFDb21wb3NpdGUgIHsKLQotCXByaXZhdGUgSU11bHRpUmVsYXRpb25zaGlwTWFwcGluZyBtYXBwaW5nOwotCXByaXZhdGUgQWRhcHRlciBtYXBwaW5nTGlzdGVuZXI7Ci0JCi0JcHJpdmF0ZSBCdXR0b24gbm9PcmRlcmluZ1JhZGlvQnV0dG9uOwotCXByaXZhdGUgQnV0dG9uIHByaW1hcnlLZXlPcmRlcmluZ1JhZGlvQnV0dG9uOwotCXByaXZhdGUgQnV0dG9uIGN1c3RvbU9yZGVyaW5nUmFkaW9CdXR0b247Ci0JCi0JcHJpdmF0ZSBJVGV4dFZpZXdlciBvcmRlcmluZ1RleHRWaWV3ZXI7Ci0JCi0JLy8gc2hvcnQgY2lyY3VpdCBmbGFnIGZvciB1c2VyIHR5cGluZwotCXByaXZhdGUgYm9vbGVhbiB1cGRhdGluZ0N1c3RvbU9yZGVyQnkgPSBmYWxzZTsKLQkKLQotCXB1YmxpYyBPcmRlcmluZ0NvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrLCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXN1cGVyKHBhcmVudCwgY29tbWFuZFN0YWNrLCB3aWRnZXRGYWN0b3J5KTsKLQkJdGhpcy5tYXBwaW5nTGlzdGVuZXIgPSBidWlsZE1hcHBpbmdMaXN0ZW5lcigpOwotCX0KLQotCXByaXZhdGUgQWRhcHRlciBidWlsZE1hcHBpbmdMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBBZGFwdGVySW1wbCgpIHsKLQkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkJCW1hcHBpbmdDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUlXb3JrYmVuY2hIZWxwU3lzdGVtIGhlbHBTeXN0ZW0gPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKTsKLQkJCi0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCi0JCUdyb3VwIG9yZGVyQnlHcm91cCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVHcm91cChjb21wb3NpdGUsIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5PcmRlckJ5Q29tcG9zaXRlX29yZGVyQnlHcm91cCk7Ci0JCW9yZGVyQnlHcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSAgbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJb3JkZXJCeUdyb3VwLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQloZWxwU3lzdGVtLnNldEhlbHAob3JkZXJCeUdyb3VwLCBJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19PUkRFUl9CWSk7Ci0JCQotCi0JCXRoaXMubm9PcmRlcmluZ1JhZGlvQnV0dG9uID0gYnVpbGROb09yZGVyaW5nUmFkaW9CdXR0b24ob3JkZXJCeUdyb3VwKTsKLQkJZ3JpZERhdGEgPSAgbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJdGhpcy5ub09yZGVyaW5nUmFkaW9CdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0vLwkJaGVscFN5c3RlbSgpLnNldEhlbHAodGhpcy5ub09yZGVyaW5nUmFkaW9CdXR0b24sIElKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX09SREVSX0JZX05PX09SREVSSU5HKTsKLQotCi0JCXRoaXMucHJpbWFyeUtleU9yZGVyaW5nUmFkaW9CdXR0b24gPSBidWlsZFByaW1hcnlLZXlPcmRlcmluZ1JhZGlvQnV0dG9uKG9yZGVyQnlHcm91cCk7Ci0JCWdyaWREYXRhID0gIG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXRoaXMucHJpbWFyeUtleU9yZGVyaW5nUmFkaW9CdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0vLwkJaGVscFN5c3RlbSgpLnNldEhlbHAodGhpcy5wcmltYXJ5S2V5T3JkZXJpbmdSYWRpb0J1dHRvbiwgSUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfT1JERVJfQllfUFJJTUFSWV9LRVlfT1JERVJJTkcpOwotCi0JCXRoaXMuY3VzdG9tT3JkZXJpbmdSYWRpb0J1dHRvbiA9IGJ1aWxkQ3VzdG9tT3JkZXJpbmdSYWRpb0J1dHRvbihvcmRlckJ5R3JvdXApOwotCQlncmlkRGF0YSA9ICBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQl0aGlzLmN1c3RvbU9yZGVyaW5nUmFkaW9CdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0vLwkJaGVscFN5c3RlbSgpLnNldEhlbHAodGhpcy5jdXN0b21PcmRlcmluZ1JhZGlvQnV0dG9uLCBJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19PUkRFUl9CWV9DVVNUT01fT1JERVJJTkcpOwotCi0JCQotCQl0aGlzLm9yZGVyaW5nVGV4dFZpZXdlciA9IGJ1aWxkT3JkZXJCeVRlc3RWaWV3ZXIob3JkZXJCeUdyb3VwKTsKLQkJZ3JpZERhdGEgPSAgbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEluZGVudCA9IDE1OwotCQl0aGlzLm9yZGVyaW5nVGV4dFZpZXdlci5nZXRUZXh0V2lkZ2V0KCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWhlbHBTeXN0ZW0uc2V0SGVscCh0aGlzLm9yZGVyaW5nVGV4dFZpZXdlci5nZXRUZXh0V2lkZ2V0KCksIElKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX09SREVSX0JZKTsKLQl9Ci0JCi0JcHJpdmF0ZSBCdXR0b24gYnVpbGROb09yZGVyaW5nUmFkaW9CdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotCQlCdXR0b24gYnV0dG9uID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1dHRvbigKLQkJCXBhcmVudCwgCi0JCQlKcHRVaU1hcHBpbmdzTWVzc2FnZXMuT3JkZXJCeUNvbXBvc2l0ZV9ub09yZGVyaW5nLCAKLQkJCVNXVC5SQURJTyk7Ci0JCWJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCU9yZGVyaW5nQ29tcG9zaXRlLnRoaXMubm9PcmRlcmluZ1JhZGlvQnV0dG9uU2VsZWN0ZWQoZSk7Ci0JCQl9Ci0JCX0pOwotCi0JCXJldHVybiBidXR0b247Ci0JfQotCi0Jdm9pZCBub09yZGVyaW5nUmFkaW9CdXR0b25TZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCWlmICghKChCdXR0b24pIGUud2lkZ2V0KS5nZXRTZWxlY3Rpb24oKSkgewotCQkJLy9pZ25vcmUgY2FzZSB3aGVyZSByYWRpbyBidXR0b24gaXMgZGVzZWxlY3RlZAotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICh0aGlzLm1hcHBpbmcuaXNOb09yZGVyaW5nKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQl0aGlzLm1hcHBpbmcuc2V0Tm9PcmRlcmluZygpOwotCX0KLQkKLQlwcml2YXRlIEJ1dHRvbiBidWlsZFByaW1hcnlLZXlPcmRlcmluZ1JhZGlvQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVCdXR0b24oCi0JCQlwYXJlbnQsIAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLk9yZGVyQnlDb21wb3NpdGVfcHJpbWFyeUtleU9yZGVyaW5nLCAKLQkJCVNXVC5SQURJTyk7Ci0JCWJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCU9yZGVyaW5nQ29tcG9zaXRlLnRoaXMucHJpbWFyeUtleU9yZGVyaW5nUmFkaW9CdXR0b25TZWxlY3RlZChlKTsKLQkJCX0KLQkJfSk7Ci0JCXJldHVybiBidXR0b247Ci0JfQotCQotCXZvaWQgcHJpbWFyeUtleU9yZGVyaW5nUmFkaW9CdXR0b25TZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCWlmICghKChCdXR0b24pIGUud2lkZ2V0KS5nZXRTZWxlY3Rpb24oKSkgewotCQkJLy9pZ25vcmUgY2FzZSB3aGVyZSByYWRpbyBidXR0b24gaXMgZGVzZWxlY3RlZAotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICghIHRoaXMubWFwcGluZy5pc09yZGVyQnlQaygpKSB7Ci0JCQl0aGlzLm1hcHBpbmcuc2V0T3JkZXJCeVBrKCk7Ci0JCX0KLQkJc2V0VGV4dFZpZXdlckVuYWJsZWQoZmFsc2UpOwotCX0KLQotCXByaXZhdGUgQnV0dG9uIGJ1aWxkQ3VzdG9tT3JkZXJpbmdSYWRpb0J1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQnV0dG9uKAotCQkJcGFyZW50LCAKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5PcmRlckJ5Q29tcG9zaXRlX2N1c3RvbU9yZGVyaW5nLCAKLQkJCVNXVC5SQURJTyk7Ci0JCWJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCU9yZGVyaW5nQ29tcG9zaXRlLnRoaXMuY3VzdG9tT3JkZXJpbmdSYWRpb0J1dHRvblNlbGVjdGVkKGUpOwotCQkJfQotCQl9KTsKLQotCQlyZXR1cm4gYnV0dG9uOwotCX0KLQkKLQl2b2lkIGN1c3RvbU9yZGVyaW5nUmFkaW9CdXR0b25TZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCWlmICghKChCdXR0b24pIGUud2lkZ2V0KS5nZXRTZWxlY3Rpb24oKSkgewotCQkJLy9pZ25vcmUgY2FzZSB3aGVyZSByYWRpbyBidXR0b24gaXMgZGVzZWxlY3RlZAotCQkJcmV0dXJuOwotCQl9Ci0JCXNldFRleHRWaWV3ZXJFbmFibGVkKHRydWUpOwotCX0KLQkKLQlwcml2YXRlIElUZXh0Vmlld2VyIGJ1aWxkT3JkZXJCeVRlc3RWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlmaW5hbCBUZXh0Vmlld2VyIHRleHRWaWV3ZXIgPSBuZXcgVGV4dFZpZXdlcihwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJdGV4dFZpZXdlci5zZXREb2N1bWVudChuZXcgRG9jdW1lbnQoKSk7Ci0JCXRleHRWaWV3ZXIuYWRkVGV4dExpc3RlbmVyKG5ldyBJVGV4dExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgdGV4dENoYW5nZWQoVGV4dEV2ZW50IGV2ZW50KSB7Ci0JCQkJb3JkZXJpbmdUZXh0Vmlld2VyQ2hhbmdlZCgpOwotCQkJfQotCQl9KTsKLQkJcmV0dXJuIHRleHRWaWV3ZXI7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBvcmRlcmluZ1RleHRWaWV3ZXJDaGFuZ2VkKCkgewotCQlpZiAoaXNQb3B1bGF0aW5nKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlTdHJpbmcgb3JkZXJCeVZhbHVlID0gdGhpcy5vcmRlcmluZ1RleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKS5nZXQoKTsKLQkJaWYgKG9yZGVyQnlWYWx1ZS5lcXVhbHModGhpcy5tYXBwaW5nLmdldE9yZGVyQnkoKSkpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJdGhpcy51cGRhdGluZ0N1c3RvbU9yZGVyQnkgPSB0cnVlOwotCQl0aGlzLm1hcHBpbmcuc2V0T3JkZXJCeShvcmRlckJ5VmFsdWUpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0VGV4dFZpZXdlckVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7Ci0JCXRoaXMub3JkZXJpbmdUZXh0Vmlld2VyLnNldEVkaXRhYmxlKGVuYWJsZWQpOwotCQl0aGlzLm9yZGVyaW5nVGV4dFZpZXdlci5nZXRUZXh0V2lkZ2V0KCkuc2V0RW5hYmxlZChlbmFibGVkKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbWFwcGluZ0NoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlpZiAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChJTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLmNsYXNzKSA9PSBKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLklNVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fT1JERVJfQlkpIHsKLQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlwb3B1bGF0ZSgpOwotCQkJCX0KLQkJCX0pOwotCQl9CQkKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb1BvcHVsYXRlKEVPYmplY3Qgb2JqKSB7Ci0JCXRoaXMubWFwcGluZyA9IChJTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nKSBvYmo7Ci0JCWlmICh0aGlzLm1hcHBpbmcgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXBvcHVsYXRlT3JkZXJpbmdSYWRpb0J1dHRvbnMoKTsJCQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb1BvcHVsYXRlKCkgewotCQlwb3B1bGF0ZU9yZGVyaW5nUmFkaW9CdXR0b25zKCk7CQkKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VMaXN0ZW5lcnMoKSB7Ci0JCWlmICh0aGlzLm1hcHBpbmcgIT0gbnVsbCkgewotCQkJdGhpcy5tYXBwaW5nLmVBZGFwdGVycygpLmFkZCh0aGlzLm1hcHBpbmdMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VMaXN0ZW5lcnMoKSB7Ci0JCWlmICh0aGlzLm1hcHBpbmcgIT0gbnVsbCkgewotCQkJdGhpcy5tYXBwaW5nLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzLm1hcHBpbmdMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlT3JkZXJpbmdSYWRpb0J1dHRvbnMoKSB7Ci0JCS8vIHNob3J0IGNpcmN1aXQgaWYgdXNlciBpcyB0eXBpbmcKLQkJaWYgKHVwZGF0aW5nQ3VzdG9tT3JkZXJCeSkgewotCQkJdXBkYXRpbmdDdXN0b21PcmRlckJ5ID0gZmFsc2U7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmICh0aGlzLm1hcHBpbmcuaXNOb09yZGVyaW5nKCkpIHsKLQkJCXRoaXMucHJpbWFyeUtleU9yZGVyaW5nUmFkaW9CdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsJCQkKLQkJCXRoaXMuY3VzdG9tT3JkZXJpbmdSYWRpb0J1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJdGhpcy5ub09yZGVyaW5nUmFkaW9CdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJaWYgKCEgIiIuZXF1YWxzKHRoaXMub3JkZXJpbmdUZXh0Vmlld2VyLmdldERvY3VtZW50KCkuZ2V0KCkpKSB7Ci0JCQkJdGhpcy5vcmRlcmluZ1RleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKS5zZXQoIiIpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHRoaXMubWFwcGluZy5pc09yZGVyQnlQaygpKSB7Ci0JCQl0aGlzLmN1c3RvbU9yZGVyaW5nUmFkaW9CdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCXRoaXMubm9PcmRlcmluZ1JhZGlvQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQl0aGlzLnByaW1hcnlLZXlPcmRlcmluZ1JhZGlvQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsJCQkKLS8vCQkJU3RyaW5nIHZhbHVlID0gdGhpcy5vcmRlcmluZy5nZXRWYWx1ZSgpOwotLy8JCQlpZiAodmFsdWUgIT0gbnVsbCAmJiAhdmFsdWUuZXF1YWxzKHRoaXMub3JkZXJpbmdUZXh0Vmlld2VyLmdldERvY3VtZW50KCkuZ2V0KCkpKSB7Ci0vLwkJCQl0aGlzLm9yZGVyaW5nVGV4dFZpZXdlci5nZXREb2N1bWVudCgpLnNldCh2YWx1ZSk7Ci0vLwkJCX0KLS8vCQkJZWxzZSB7Ci0JCQkJaWYgKCEiIi5lcXVhbHModGhpcy5vcmRlcmluZ1RleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKS5nZXQoKSkpIHsKLQkJCQkJdGhpcy5vcmRlcmluZ1RleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKS5zZXQoIiIpOwkJCQkKLQkJCQl9Ci0vLwkJCX0KLQkJfQotCQllbHNlIGlmICh0aGlzLm1hcHBpbmcuaXNDdXN0b21PcmRlcmluZygpKSB7Ci0JCQl0aGlzLm5vT3JkZXJpbmdSYWRpb0J1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJdGhpcy5wcmltYXJ5S2V5T3JkZXJpbmdSYWRpb0J1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwkJCQotCQkJdGhpcy5jdXN0b21PcmRlcmluZ1JhZGlvQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCVN0cmluZyB2YWx1ZSA9IHRoaXMubWFwcGluZy5nZXRPcmRlckJ5KCk7Ci0JCQlpZiAodmFsdWUgIT0gbnVsbCAmJiAhdmFsdWUuZXF1YWxzKHRoaXMub3JkZXJpbmdUZXh0Vmlld2VyLmdldERvY3VtZW50KCkuZ2V0KCkpKSB7Ci0JCQkJdGhpcy5vcmRlcmluZ1RleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKS5zZXQodmFsdWUpOwotCQkJfQotCQl9Ci0JCQotCQlzZXRUZXh0Vmlld2VyRW5hYmxlZCh0aGlzLm1hcHBpbmcuaXNDdXN0b21PcmRlcmluZygpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL092ZXJyaWRlc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9PdmVycmlkZXNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg2YWFiMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL092ZXJyaWRlc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxpc3RWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSnBhQ29yZU1hcHBpbmdzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSUpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkJhc2VKcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlscy5Kb2luQ29sdW1uc0NvbXBvc2l0ZS5Pd25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5QYWdlQm9vazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLQotcHVibGljIGNsYXNzIE92ZXJyaWRlc0NvbXBvc2l0ZSBleHRlbmRzIEJhc2VKcGFDb21wb3NpdGUKLXsKLQlwcml2YXRlIExpc3RWaWV3ZXIgbGlzdFZpZXdlcjsKLQkKLQlwcml2YXRlIElFbnRpdHkgZW50aXR5OwotCXByaXZhdGUgQWRhcHRlciBlbnRpdHlMaXN0ZW5lcjsKLQkKLQlwcml2YXRlIElPdmVycmlkZSBzZWxlY3RlZE92ZXJyaWRlOwotCXByaXZhdGUgQWRhcHRlciBvdmVycmlkZUxpc3RlbmVyOwotCQotCXByb3RlY3RlZCBQYWdlQm9vayBvdmVycmlkZVBhZ2VCb29rOwotCi0JcHJvdGVjdGVkIENvbHVtbkNvbXBvc2l0ZSBjb2x1bW5Db21wb3NpdGU7Ci0JcHJvdGVjdGVkIEpvaW5Db2x1bW5zQ29tcG9zaXRlIGpvaW5Db2x1bW5zQ29tcG9zaXRlOwotCQotCXByaXZhdGUgQnV0dG9uIG92ZXJyaWRlRGVmYXVsdEJ1dHRvbjsKLQkKLQlwdWJsaWMgT3ZlcnJpZGVzQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIENvbW1hbmRTdGFjayBjb21tYW5kU3RhY2ssIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJc3VwZXIocGFyZW50LCBTV1QuTlVMTCwgY29tbWFuZFN0YWNrLCB3aWRnZXRGYWN0b3J5KTsKLQkJdGhpcy5lbnRpdHlMaXN0ZW5lciA9IGJ1aWxkRW50aXR5TGlzdGVuZXIoKTsKLQkJdGhpcy5vdmVycmlkZUxpc3RlbmVyID0gYnVpbGRPdmVycmlkZUxpc3RlbmVyKCk7Ci0JfQotCQotCXByaXZhdGUgQWRhcHRlciBidWlsZEVudGl0eUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IEFkYXB0ZXJJbXBsKCkgewotCQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCQkJZW50aXR5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIEFkYXB0ZXIgYnVpbGRPdmVycmlkZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IEFkYXB0ZXJJbXBsKCkgewotCQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCQkJb3ZlcnJpZGVDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQkKLQkJR3JvdXAgYXR0cmlidXRlT3ZlcnJpZGVzR3JvdXAgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlR3JvdXAoCi0JCQljb21wb3NpdGUsIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5BdHRyaWJ1dGVPdmVycmlkZXNDb21wb3NpdGVfYXR0cmlidXRlT3ZlcnJpZGVzKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzR3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIHRydWUpKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSAgbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlPSB0cnVlOwotCQlhdHRyaWJ1dGVPdmVycmlkZXNHcm91cC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCi0JCXRoaXMubGlzdFZpZXdlciA9IGJ1aWxkQXR0cmlidXRlT3ZlcnJpZGVzTGlzdFZpZXdlcihhdHRyaWJ1dGVPdmVycmlkZXNHcm91cCk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLnZlcnRpY2FsU3BhbiA9IDI7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlPSB0cnVlOwotCQl0aGlzLmxpc3RWaWV3ZXIuZ2V0TGlzdCgpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRoaXMubGlzdFZpZXdlci5nZXRMaXN0KCksIElKcGFIZWxwQ29udGV4dElkcy5FTlRJVFlfQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCQotCQl0aGlzLm92ZXJyaWRlRGVmYXVsdEJ1dHRvbiA9IAotCQkJZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1dHRvbigKLQkJCQlhdHRyaWJ1dGVPdmVycmlkZXNHcm91cCwgCi0JCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLkF0dHJpYnV0ZU92ZXJyaWRlc0NvbXBvc2l0ZV9vdmVycmlkRGVmYXVsdCwgCi0JCQkJU1dULkNIRUNLKTsKLQkJdGhpcy5vdmVycmlkZURlZmF1bHRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoYnVpbGRPdmVycmlkZURlZmF1bHRTZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuQkVHSU5OSU5HOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQl0aGlzLm92ZXJyaWRlRGVmYXVsdEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCi0JCQotCQl0aGlzLm92ZXJyaWRlUGFnZUJvb2sgPSBidWlsZE92ZXJyaWRlUGFnZUJvb2soYXR0cmlidXRlT3ZlcnJpZGVzR3JvdXApOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5CRUdJTk5JTkc7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCXRoaXMub3ZlcnJpZGVQYWdlQm9vay5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQl0aGlzLmpvaW5Db2x1bW5zQ29tcG9zaXRlID0gbmV3IEpvaW5Db2x1bW5zQ29tcG9zaXRlKHRoaXMub3ZlcnJpZGVQYWdlQm9vaywgdGhpcy5jb21tYW5kU3RhY2ssIGdldFdpZGdldEZhY3RvcnkoKSwgSnB0VWlNYXBwaW5nc01lc3NhZ2VzLk92ZXJyaWRlc0NvbXBvc2l0ZV9qb2luQ29sdW1uKTsKLQkJdGhpcy5jb2x1bW5Db21wb3NpdGUgPSBuZXcgQ29sdW1uQ29tcG9zaXRlKHRoaXMub3ZlcnJpZGVQYWdlQm9vaywgdGhpcy5jb21tYW5kU3RhY2ssIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCXRoaXMub3ZlcnJpZGVQYWdlQm9vay5zaG93UGFnZSh0aGlzLmpvaW5Db2x1bW5zQ29tcG9zaXRlLmdldENvbnRyb2woKSk7Ci0JfQotCQotCXByb3RlY3RlZCBQYWdlQm9vayBidWlsZE92ZXJyaWRlUGFnZUJvb2soQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IFBhZ2VCb29rKHBhcmVudCwgU1dULk5PTkUpOwotCX0KLQotCXByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgYnVpbGRPdmVycmlkZURlZmF1bHRTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpewotCQkKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlvdmVycmlkZURlZmF1bHRCdXR0b25TZWxlY3RlZChlKTsKLQkJCX0KLQkJCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCW92ZXJyaWRlRGVmYXVsdEJ1dHRvblNlbGVjdGVkKGUpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIHZvaWQgb3ZlcnJpZGVEZWZhdWx0QnV0dG9uU2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQlib29sZWFuIHNlbGVjdGlvbiA9IHRoaXMub3ZlcnJpZGVEZWZhdWx0QnV0dG9uLmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uKSB7Ci0JCQlpZiAoZ2V0U2VsZWN0ZWRPdmVycmlkZSgpIGluc3RhbmNlb2YgSUF0dHJpYnV0ZU92ZXJyaWRlKSB7Ci0JCQkJaW50IGluZGV4ID0gdGhpcy5lbnRpdHkuZ2V0U3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkuc2l6ZSgpOwotCQkJCUlBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IHRoaXMuZW50aXR5LmNyZWF0ZUF0dHJpYnV0ZU92ZXJyaWRlKGluZGV4KTsJCQkKLQkJCQl0aGlzLmVudGl0eS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoYXR0cmlidXRlT3ZlcnJpZGUpOwotCQkJCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUodGhpcy5zZWxlY3RlZE92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQkJYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgoKElBdHRyaWJ1dGVPdmVycmlkZSkgdGhpcy5zZWxlY3RlZE92ZXJyaWRlKS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaW50IGluZGV4ID0gdGhpcy5lbnRpdHkuZ2V0U3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKS5zaXplKCk7Ci0JCQkJSUFzc29jaWF0aW9uT3ZlcnJpZGUgYXNzb2NpYXRpb25PdmVycmlkZSA9IHRoaXMuZW50aXR5LmNyZWF0ZUFzc29jaWF0aW9uT3ZlcnJpZGUoaW5kZXgpOwotCQkJCVN0cmluZyBuYW1lID0gdGhpcy5zZWxlY3RlZE92ZXJyaWRlLmdldE5hbWUoKTsKLQkJCQl0aGlzLmVudGl0eS5nZXRTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmFkZChhc3NvY2lhdGlvbk92ZXJyaWRlKTsKLQkJCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUobmFtZSk7Ci0JCQkJLy9hdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKHRoaXMuYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsJCQkKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWlmIChnZXRTZWxlY3RlZE92ZXJyaWRlKCkgaW5zdGFuY2VvZiBJQXR0cmlidXRlT3ZlcnJpZGUpIHsKLQkJCQl0aGlzLmVudGl0eS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKS5yZW1vdmUodGhpcy5zZWxlY3RlZE92ZXJyaWRlKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXRoaXMuZW50aXR5LmdldFNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkucmVtb3ZlKHRoaXMuc2VsZWN0ZWRPdmVycmlkZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JCi0JcHJpdmF0ZSBMaXN0Vmlld2VyIGJ1aWxkQXR0cmlidXRlT3ZlcnJpZGVzTGlzdFZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUxpc3RWaWV3ZXIgbGlzdFZpZXdlciA9IG5ldyBMaXN0Vmlld2VyKHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlsaXN0Vmlld2VyLnNldExhYmVsUHJvdmlkZXIoYnVpbGRBdHRyaWJ1dGVPdmVycmlkZXNMYWJlbFByb3ZpZGVyKCkpOwotCQlsaXN0Vmlld2VyLnNldENvbnRlbnRQcm92aWRlcihidWlsZEF0dHJpYnV0ZU92ZXJyaWRlc0NvbnRlbnRQcm92aWRlcigpKTsKLQkJCi0JCWxpc3RWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlvdmVycmlkZXNMaXN0U2VsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCX0pOwotCi0JCXJldHVybiBsaXN0Vmlld2VyOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBvdmVycmlkZXNMaXN0U2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJaWYgKCgoU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCkpLmlzRW1wdHkoKSkgewotCQkJdGhpcy5jb2x1bW5Db21wb3NpdGUucG9wdWxhdGUobnVsbCk7Ci0JCQl0aGlzLmNvbHVtbkNvbXBvc2l0ZS5lbmFibGVXaWRnZXRzKGZhbHNlKTsKLQkJCXRoaXMub3ZlcnJpZGVEZWZhdWx0QnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQl0aGlzLm92ZXJyaWRlRGVmYXVsdEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfQotCQllbHNlIHsKLQkJCXRoaXMuc2VsZWN0ZWRPdmVycmlkZSA9IGdldFNlbGVjdGVkT3ZlcnJpZGUoKTsKLQkJCWlmICh0aGlzLnNlbGVjdGVkT3ZlcnJpZGUgaW5zdGFuY2VvZiBJQXR0cmlidXRlT3ZlcnJpZGUpIHsKLQkJCQlib29sZWFuIHNwZWNpZmllZE92ZXJyaWRlID0gdGhpcy5lbnRpdHkuZ2V0U3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkuY29udGFpbnModGhpcy5zZWxlY3RlZE92ZXJyaWRlKTsKLQkJCQl0aGlzLm92ZXJyaWRlRGVmYXVsdEJ1dHRvbi5zZXRTZWxlY3Rpb24oc3BlY2lmaWVkT3ZlcnJpZGUpOwotCQkJCXRoaXMub3ZlcnJpZGVQYWdlQm9vay5zaG93UGFnZSh0aGlzLmNvbHVtbkNvbXBvc2l0ZS5nZXRDb250cm9sKCkpOwotCQkJCXRoaXMuY29sdW1uQ29tcG9zaXRlLnBvcHVsYXRlKCgoSUF0dHJpYnV0ZU92ZXJyaWRlKSB0aGlzLnNlbGVjdGVkT3ZlcnJpZGUpLmdldENvbHVtbigpKTsKLQkJCQl0aGlzLmNvbHVtbkNvbXBvc2l0ZS5lbmFibGVXaWRnZXRzKHNwZWNpZmllZE92ZXJyaWRlKTsKLQkJCQl0aGlzLm92ZXJyaWRlRGVmYXVsdEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJYm9vbGVhbiBzcGVjaWZpZWRPdmVycmlkZSA9IHRoaXMuZW50aXR5LmdldFNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuY29udGFpbnModGhpcy5zZWxlY3RlZE92ZXJyaWRlKTsKLQkJCQl0aGlzLm92ZXJyaWRlRGVmYXVsdEJ1dHRvbi5zZXRTZWxlY3Rpb24oc3BlY2lmaWVkT3ZlcnJpZGUpOwotCQkJCXRoaXMub3ZlcnJpZGVQYWdlQm9vay5zaG93UGFnZSh0aGlzLmpvaW5Db2x1bW5zQ29tcG9zaXRlLmdldENvbnRyb2woKSk7Ci0JCQkJdGhpcy5qb2luQ29sdW1uc0NvbXBvc2l0ZS5wb3B1bGF0ZShuZXcgSm9pbkNvbHVtbnNPd25lcigoSUFzc29jaWF0aW9uT3ZlcnJpZGUpIGdldFNlbGVjdGVkT3ZlcnJpZGUoKSkpOwotCQkJCXRoaXMuam9pbkNvbHVtbnNDb21wb3NpdGUuZW5hYmxlV2lkZ2V0cyhzcGVjaWZpZWRPdmVycmlkZSk7Ci0JCQkJdGhpcy5vdmVycmlkZURlZmF1bHRCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIGJ1aWxkQXR0cmlidXRlT3ZlcnJpZGVzTGFiZWxQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJLy9UT0RPIGFsc28gZGlzcGxheSBjb2x1bW4gbmFtZSBzb21laG93Ci0JCQkJcmV0dXJuICgoSU92ZXJyaWRlKSBlbGVtZW50KS5nZXROYW1lKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JCi0JcHJpdmF0ZSBJQ29udGVudFByb3ZpZGVyIGJ1aWxkQXR0cmlidXRlT3ZlcnJpZGVzQ29udGVudFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyKCkgewotCQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQl9Ci0JCQotCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCX0KLQkJCi0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQkJCUlFbnRpdHkgZW50aXR5ID0gKElFbnRpdHkpIGlucHV0RWxlbWVudDsKLQkJCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmFkZEFsbCgKLQkJCQkJZW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnRvQXJyYXkobmV3IElPdmVycmlkZVtlbnRpdHkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuc2l6ZSgpXSksIAotCQkJCQllbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBJT3ZlcnJpZGUgZ2V0U2VsZWN0ZWRPdmVycmlkZSgpIHsKLQkJcmV0dXJuIChJT3ZlcnJpZGUpICgoU3RydWN0dXJlZFNlbGVjdGlvbikgdGhpcy5saXN0Vmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgZG9Qb3B1bGF0ZShFT2JqZWN0IG9iaikgewotCQl0aGlzLmVudGl0eSA9IChJRW50aXR5KSBvYmo7Ci0JCWlmICh0aGlzLmVudGl0eSA9PSBudWxsKSB7Ci0JCQl0aGlzLnNlbGVjdGVkT3ZlcnJpZGUgPSBudWxsOwotCQkJdGhpcy5jb2x1bW5Db21wb3NpdGUucG9wdWxhdGUobnVsbCk7Ci0JCQl0aGlzLmpvaW5Db2x1bW5zQ29tcG9zaXRlLnBvcHVsYXRlKG51bGwpOwotCQkJdGhpcy5saXN0Vmlld2VyLnNldElucHV0KG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZiAodGhpcy5saXN0Vmlld2VyLmdldElucHV0KCkgIT0gZW50aXR5KSB7Ci0JCQl0aGlzLmxpc3RWaWV3ZXIuc2V0SW5wdXQoZW50aXR5KTsKLQkJfQotCQlpZiAoIXRoaXMuZW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmlzRW1wdHkoKSkgewotCQkJaWYgKHRoaXMubGlzdFZpZXdlci5nZXRTZWxlY3Rpb24oKS5pc0VtcHR5KCkpIHsKLQkJCQlJT3ZlcnJpZGUgb3ZlcnJpZGUgPSB0aGlzLmVudGl0eS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCk7Ci0JCQkJdGhpcy5saXN0Vmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihvdmVycmlkZSkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJT2JqZWN0IHNlbGVjdGlvbiA9ICgoU3RydWN0dXJlZFNlbGVjdGlvbikgdGhpcy5saXN0Vmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSUF0dHJpYnV0ZU92ZXJyaWRlKSB7Ci0JCQkJCXRoaXMub3ZlcnJpZGVQYWdlQm9vay5zaG93UGFnZSh0aGlzLmNvbHVtbkNvbXBvc2l0ZS5nZXRDb250cm9sKCkpOwotCQkJCQl0aGlzLmNvbHVtbkNvbXBvc2l0ZS5lbmFibGVXaWRnZXRzKHRydWUpOwotCQkJCQl0aGlzLmNvbHVtbkNvbXBvc2l0ZS5wb3B1bGF0ZSgoKElBdHRyaWJ1dGVPdmVycmlkZSkgc2VsZWN0aW9uKS5nZXRDb2x1bW4oKSk7Ci0JCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJdGhpcy5vdmVycmlkZVBhZ2VCb29rLnNob3dQYWdlKHRoaXMuam9pbkNvbHVtbnNDb21wb3NpdGUuZ2V0Q29udHJvbCgpKTsKLQkJCQkJdGhpcy5qb2luQ29sdW1uc0NvbXBvc2l0ZS5lbmFibGVXaWRnZXRzKHRydWUpOwotCQkJCQl0aGlzLmpvaW5Db2x1bW5zQ29tcG9zaXRlLnBvcHVsYXRlKG5ldyBKb2luQ29sdW1uc093bmVyKChJQXNzb2NpYXRpb25PdmVycmlkZSkgc2VsZWN0aW9uKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5jb2x1bW5Db21wb3NpdGUucG9wdWxhdGUobnVsbCk7Ci0JCQl0aGlzLmNvbHVtbkNvbXBvc2l0ZS5lbmFibGVXaWRnZXRzKGZhbHNlKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvUG9wdWxhdGUoKSB7Ci0JCXRoaXMuY29sdW1uQ29tcG9zaXRlLmRvUG9wdWxhdGUoKTsKLQkJdGhpcy5qb2luQ29sdW1uc0NvbXBvc2l0ZS5kb1BvcHVsYXRlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUxpc3RlbmVycygpIHsKLQkJaWYgKHRoaXMuZW50aXR5ICE9IG51bGwpIHsKLQkJCXRoaXMuZW50aXR5LmVBZGFwdGVycygpLmFkZCh0aGlzLmVudGl0eUxpc3RlbmVyKTsKLQkJCWZvciAoSU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlIDogdGhpcy5lbnRpdHkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkpIHsKLQkJCQlhdHRyaWJ1dGVPdmVycmlkZS5lQWRhcHRlcnMoKS5hZGQodGhpcy5vdmVycmlkZUxpc3RlbmVyKTsKLQkJCX0JCi0JCQlmb3IgKElPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA6IHRoaXMuZW50aXR5LmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkpIHsKLQkJCQlhdHRyaWJ1dGVPdmVycmlkZS5lQWRhcHRlcnMoKS5hZGQodGhpcy5vdmVycmlkZUxpc3RlbmVyKTsKLQkJCX0JCi0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTGlzdGVuZXJzKCkgewotCQlpZiAodGhpcy5lbnRpdHkgIT0gbnVsbCkgewotCQkJdGhpcy5lbnRpdHkuZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMuZW50aXR5TGlzdGVuZXIpOwotCQkJZm9yIChJT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgOiB0aGlzLmVudGl0eS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKSkgewotCQkJCWF0dHJpYnV0ZU92ZXJyaWRlLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzLm92ZXJyaWRlTGlzdGVuZXIpOwotCQkJfQkKLQkJCWZvciAoSU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlIDogdGhpcy5lbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKSkgewotCQkJCWF0dHJpYnV0ZU92ZXJyaWRlLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzLm92ZXJyaWRlTGlzdGVuZXIpOwotCQkJfQkKLQkJfQotCX0KLQotCQotCXByb3RlY3RlZCB2b2lkIGVudGl0eUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSUVudGl0eS5jbGFzcykpIHsKLQkJCWNhc2UgSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JRU5USVRZX19TUEVDSUZJRURfQVRUUklCVVRFX09WRVJSSURFUyA6Ci0JCQljYXNlIEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSUVOVElUWV9fU1BFQ0lGSUVEX0FTU09DSUFUSU9OX09WRVJSSURFUyA6Ci0JCQljYXNlIEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSUVOVElUWV9fREVGQVVMVF9BVFRSSUJVVEVfT1ZFUlJJREVTIDoKLQkJCWNhc2UgSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JRU5USVRZX19ERUZBVUxUX0FTU09DSUFUSU9OX09WRVJSSURFUyA6Ci0JCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJaWYgKGxpc3RWaWV3ZXIuZ2V0TGlzdCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJCWxpc3RWaWV3ZXIucmVmcmVzaCgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJCQlpZiAobm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpID09IE5vdGlmaWNhdGlvbi5BREQpIHsKLQkJCQkJKChJT3ZlcnJpZGUpIG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpKS5lQWRhcHRlcnMoKS5hZGQodGhpcy5vdmVycmlkZUxpc3RlbmVyKTsKLQkJCQkJZmluYWwgT2JqZWN0IG5ld1ZhbHVlID0gbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCSgoSU92ZXJyaWRlKSBuZXdWYWx1ZSkuZUFkYXB0ZXJzKCkuYWRkKHRoaXMub3ZlcnJpZGVMaXN0ZW5lcik7Ci0JCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJaWYgKGxpc3RWaWV3ZXIuZ2V0TGlzdCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJfQotCQkJCQkJCWxpc3RWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5ld1ZhbHVlKSk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQkJCQllbHNlIGlmIChub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLkFERF9NQU5ZKSB7Ci0JCQkJCUxpc3Q8SU92ZXJyaWRlPiBhZGRlZExpc3QgPSAoTGlzdDxJT3ZlcnJpZGU+KSBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKTsKLQkJCQkJZm9yIChJT3ZlcnJpZGUgb3ZlcnJpZGUgOiBhZGRlZExpc3QpIHsKLQkJCQkJCW92ZXJyaWRlLmVBZGFwdGVycygpLmFkZCh0aGlzLm92ZXJyaWRlTGlzdGVuZXIpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uUkVNT1ZFKSB7Ci0JCQkJCSgoSU92ZXJyaWRlKSBub3RpZmljYXRpb24uZ2V0T2xkVmFsdWUoKSkuZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMub3ZlcnJpZGVMaXN0ZW5lcik7CQkJCQotCQkJCX0KLQkJCQllbHNlIGlmIChub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZKSB7Ci0JCQkJCUxpc3Q8SU92ZXJyaWRlPiByZW1vdmVkTGlzdCA9IChMaXN0PElPdmVycmlkZT4pIG5vdGlmaWNhdGlvbi5nZXRPbGRWYWx1ZSgpOwotCQkJCQlmb3IgKElPdmVycmlkZSBvdmVycmlkZSA6IHJlbW92ZWRMaXN0KSB7Ci0JCQkJCQlvdmVycmlkZS5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcy5vdmVycmlkZUxpc3RlbmVyKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlicmVhazsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIG92ZXJyaWRlQ2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChJT3ZlcnJpZGUuY2xhc3MpKSB7Ci0JCQljYXNlIEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSU9WRVJSSURFX19OQU1FIDoKLQkJCQlmaW5hbCBJT3ZlcnJpZGUgb3ZlcnJpZGUgPSAoSU92ZXJyaWRlKSBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKTsKLQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlPdmVycmlkZXNDb21wb3NpdGUudGhpcy5saXN0Vmlld2VyLnVwZGF0ZShvdmVycmlkZSwgbnVsbCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCWJyZWFrOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXRoaXMuY29sdW1uQ29tcG9zaXRlLmRpc3Bvc2UoKTsKLQkJdGhpcy5qb2luQ29sdW1uc0NvbXBvc2l0ZS5kaXNwb3NlKCk7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0JCi0KLQl2b2lkIGFkZEpvaW5Db2x1bW4oKSB7Ci0JCUpvaW5Db2x1bW5JbkFzc29jaWF0aW9uT3ZlcnJpZGVEaWFsb2cgZGlhbG9nID0gbmV3IEpvaW5Db2x1bW5JbkFzc29jaWF0aW9uT3ZlcnJpZGVEaWFsb2codGhpcy5nZXRDb250cm9sKCkuZ2V0U2hlbGwoKSwgKElBc3NvY2lhdGlvbk92ZXJyaWRlKSBnZXRTZWxlY3RlZE92ZXJyaWRlKCkpOwotCQl0aGlzLmFkZEpvaW5Db2x1bW5Gcm9tRGlhbG9nKGRpYWxvZyk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRKb2luQ29sdW1uRnJvbURpYWxvZyhKb2luQ29sdW1uSW5Bc3NvY2lhdGlvbk92ZXJyaWRlRGlhbG9nIGRpYWxvZykgewotCQlpZiAoZGlhbG9nLm9wZW4oKSAhPSBXaW5kb3cuT0spIHsKLQkJCXJldHVybjsKLQkJfQotCQlpbnQgaW5kZXggPSAoKElBc3NvY2lhdGlvbk92ZXJyaWRlKSBnZXRTZWxlY3RlZE92ZXJyaWRlKCkpLmdldEpvaW5Db2x1bW5zKCkuc2l6ZSgpOwotCQlJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gKChJQXNzb2NpYXRpb25PdmVycmlkZSkgZ2V0U2VsZWN0ZWRPdmVycmlkZSgpKS5jcmVhdGVKb2luQ29sdW1uKGluZGV4KTsKLQkJKChJQXNzb2NpYXRpb25PdmVycmlkZSkgZ2V0U2VsZWN0ZWRPdmVycmlkZSgpKS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLmFkZChqb2luQ29sdW1uKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKGRpYWxvZy5nZXRTZWxlY3RlZE5hbWUoKSk7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoZGlhbG9nLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCX0KLQotCXZvaWQgZWRpdEpvaW5Db2x1bW4oSUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQlKb2luQ29sdW1uSW5Bc3NvY2lhdGlvbk92ZXJyaWRlRGlhbG9nIGRpYWxvZyA9IG5ldyBKb2luQ29sdW1uSW5Bc3NvY2lhdGlvbk92ZXJyaWRlRGlhbG9nKHRoaXMuZ2V0Q29udHJvbCgpLmdldFNoZWxsKCksIGpvaW5Db2x1bW4pOwotCQllZGl0Sm9pbkNvbHVtbkZyb21EaWFsb2coZGlhbG9nLCBqb2luQ29sdW1uKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGVkaXRKb2luQ29sdW1uRnJvbURpYWxvZyhKb2luQ29sdW1uSW5Bc3NvY2lhdGlvbk92ZXJyaWRlRGlhbG9nIGRpYWxvZywgSUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCWVkaXRKb2luQ29sdW1uRGlhbG9nT2tkKGRpYWxvZywgam9pbkNvbHVtbik7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGVkaXRKb2luQ29sdW1uRGlhbG9nT2tkKEpvaW5Db2x1bW5JbkFzc29jaWF0aW9uT3ZlcnJpZGVEaWFsb2cgZGlhbG9nLCBJSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCVN0cmluZyBuYW1lID0gZGlhbG9nLmdldFNlbGVjdGVkTmFtZSgpOwotCQlTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBkaWFsb2cuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKTsKLQotCQlpZiAoZGlhbG9nLmlzRGVmYXVsdE5hbWVTZWxlY3RlZCgpKSB7Ci0JCQlpZiAoam9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkgIT0gbnVsbCkgewotCQkJCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChqb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSA9PSBudWxsIHx8ICFqb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKS5lcXVhbHMobmFtZSkpewotCQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKG5hbWUpOwotCQl9Ci0JCQotCQlpZiAoZGlhbG9nLmlzRGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lU2VsZWN0ZWQoKSkgewotCQkJaWYgKGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSAhPSBudWxsKSB7Ci0JCQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZShudWxsKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChqb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgPT0gbnVsbCB8fCAham9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpLmVxdWFscyhyZWZlcmVuY2VkQ29sdW1uTmFtZSkpewotCQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZShyZWZlcmVuY2VkQ29sdW1uTmFtZSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBjbGFzcyBKb2luQ29sdW1uc093bmVyIGV4dGVuZHMgSnBhRU9iamVjdCBpbXBsZW1lbnRzIE93bmVyIHsKLQkJCi0JCUlBc3NvY2lhdGlvbk92ZXJyaWRlIGFzc29jaWF0aW9uT3ZlcnJpZGU7Ci0JCQotCQlwdWJsaWMgSm9pbkNvbHVtbnNPd25lcihJQXNzb2NpYXRpb25PdmVycmlkZSBhc3NvY2lhdGlvbk92ZXJyaWRlKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlID0gYXNzb2NpYXRpb25PdmVycmlkZTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgYWRkSm9pbkNvbHVtbigpIHsKLQkJCU92ZXJyaWRlc0NvbXBvc2l0ZS50aGlzLmFkZEpvaW5Db2x1bW4oKTsKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gY29udGFpbnNTcGVjaWZpZWRKb2luQ29sdW1ucygpIHsKLQkJCXJldHVybiB0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGUuY29udGFpbnNTcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCQl9Ci0JCQotCQlwdWJsaWMgSUpvaW5Db2x1bW4gY3JlYXRlSm9pbkNvbHVtbihpbnQgaW5kZXgpIHsKLQkJCXJldHVybiB0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGUuY3JlYXRlSm9pbkNvbHVtbihpbmRleCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBMaXN0PElKb2luQ29sdW1uPiBnZXRKb2luQ29sdW1ucygpIHsKLQkJCXJldHVybiB0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKTsKLQkJfQotCQkKLQkJcHVibGljIExpc3Q8SUpvaW5Db2x1bW4+IGdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkgewotCQkJcmV0dXJuIHRoaXMuYXNzb2NpYXRpb25PdmVycmlkZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IHNwZWNpZmllZEpvaW5Db2x1bW5zRmVhdHVyZUlkKCkgewotCQkJcmV0dXJuIEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSUFTU09DSUFUSU9OX09WRVJSSURFX19TUEVDSUZJRURfSk9JTl9DT0xVTU5TOwotCQl9Ci0JCQotCQlwdWJsaWMgQ2xhc3Mgb3duaW5nRmVhdHVyZUNsYXNzKCkgewotCQkJcmV0dXJuIElBc3NvY2lhdGlvbk92ZXJyaWRlLmNsYXNzOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBlZGl0Sm9pbkNvbHVtbihJSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCQlPdmVycmlkZXNDb21wb3NpdGUudGhpcy5lZGl0Sm9pbkNvbHVtbihqb2luQ29sdW1uKTsKLQkJfQotCQkKLQkJcHVibGljIEVPYmplY3QgZ2V0RU9iamVjdCgpIHsKLQkJCXJldHVybiB0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGU7Ci0JCX0KLQl9Ci0JCi0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvUHJpbWFyeUtleUpvaW5Db2x1bW5EaWFsb2cuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvUHJpbWFyeUtleUpvaW5Db2x1bW5EaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdhYTk2NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1ByaW1hcnlLZXlKb2luQ29sdW1uRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAgICAgICAgCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JUHJpbWFyeUtleUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi1wdWJsaWMgY2xhc3MgUHJpbWFyeUtleUpvaW5Db2x1bW5EaWFsb2cgZXh0ZW5kcyBBYnN0cmFjdEpvaW5Db2x1bW5EaWFsb2c8SVByaW1hcnlLZXlKb2luQ29sdW1uPiB7Ci0KLQlwcml2YXRlIElFbnRpdHkgZW50aXR5OwotCQotCVByaW1hcnlLZXlKb2luQ29sdW1uRGlhbG9nKFNoZWxsIHBhcmVudCwgSUVudGl0eSBlbnRpdHkpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5lbnRpdHkgPSBlbnRpdHk7Ci0JfQotCi0JUHJpbWFyeUtleUpvaW5Db2x1bW5EaWFsb2coU2hlbGwgcGFyZW50LCBJUHJpbWFyeUtleUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQlzdXBlcihwYXJlbnQsIGpvaW5Db2x1bW4pOwotCQl0aGlzLmVudGl0eSA9IChJRW50aXR5KSBqb2luQ29sdW1uLmVDb250YWluZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGFibGUgZ2V0TmFtZVRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5lbnRpdHkucHJpbWFyeURiVGFibGUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFRhYmxlIGdldFJlZmVyZW5jZWROYW1lVGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLmVudGl0eS5wYXJlbnRFbnRpdHkoKS5wcmltYXJ5RGJUYWJsZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvUHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlRGlhbG9nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1ByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWEyMjBkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvUHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAgICAgICAgCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSVByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklTZWNvbmRhcnlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLXB1YmxpYyBjbGFzcyBQcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVEaWFsb2cgZXh0ZW5kcyBBYnN0cmFjdEpvaW5Db2x1bW5EaWFsb2c8SVByaW1hcnlLZXlKb2luQ29sdW1uPiB7Ci0KLQlwcml2YXRlIElTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZTsKLQkKLQlQcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVEaWFsb2coU2hlbGwgcGFyZW50LCBJU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5zZWNvbmRhcnlUYWJsZSA9IHNlY29uZGFyeVRhYmxlOwotCX0KLQotCVByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZURpYWxvZyhTaGVsbCBwYXJlbnQsIElQcmltYXJ5S2V5Sm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCXN1cGVyKHBhcmVudCwgam9pbkNvbHVtbik7Ci0JCXRoaXMuc2Vjb25kYXJ5VGFibGUgPSAoSVNlY29uZGFyeVRhYmxlKSBqb2luQ29sdW1uLmVDb250YWluZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGFibGUgZ2V0TmFtZVRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5zZWNvbmRhcnlUYWJsZS5kYlRhYmxlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBUYWJsZSBnZXRSZWZlcmVuY2VkTmFtZVRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5zZWNvbmRhcnlUYWJsZS50eXBlTWFwcGluZygpLnByaW1hcnlEYlRhYmxlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3YTc1MjQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGlzdFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JQWJzdHJhY3RKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSU5hbWVkQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklQcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5KcGFDb3JlTWFwcGluZ3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5JSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQmFzZUpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGUgZXh0ZW5kcyBCYXNlSnBhQ29tcG9zaXRlIAotewotCXByaXZhdGUgSUVudGl0eSBlbnRpdHk7Ci0JcHJpdmF0ZSBmaW5hbCBBZGFwdGVyIGVudGl0eUxpc3RlbmVyOwotCXByaXZhdGUgZmluYWwgQWRhcHRlciBwa0pvaW5Db2x1bW5MaXN0ZW5lcjsKLQkKLQlMaXN0Vmlld2VyIHBrSm9pbkNvbHVtbnNMaXN0Vmlld2VyOwotCi0JcHJpdmF0ZSBHcm91cCBwa0pvaW5Db2x1bW5zR3JvdXA7Ci0JQnV0dG9uIG92ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5zQ2hlY2tCb3g7Ci0JcHJpdmF0ZSBCdXR0b24gcGtKb2luQ29sdW1uc1JlbW92ZUJ1dHRvbjsKLQlwcml2YXRlIEJ1dHRvbiBwa0pvaW5Db2x1bW5zRWRpdEJ1dHRvbjsKLQkKLQkKLQlwdWJsaWMgUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIENvbW1hbmRTdGFjayBjb21tYW5kU3RhY2ssIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJc3VwZXIocGFyZW50LCBTV1QuTlVMTCwgY29tbWFuZFN0YWNrLCB3aWRnZXRGYWN0b3J5KTsKLQkJdGhpcy5lbnRpdHlMaXN0ZW5lciA9IGJ1aWxkRW50aXR5TGlzdGVuZXIoKTsKLQkJdGhpcy5wa0pvaW5Db2x1bW5MaXN0ZW5lciA9IGJ1aWxkUGtKb2luQ29sdW1uTGlzdGVuZXIoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBBZGFwdGVyIGJ1aWxkRW50aXR5TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJCQllbnRpdHlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgQWRhcHRlciBidWlsZFBrSm9pbkNvbHVtbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IEFkYXB0ZXJJbXBsKCkgewotCQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCQkJcGtKb2luQ29sdW1uQ2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJfQotCQl9OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCi0JCUdyaWREYXRhIGdyaWREYXRhID0gIG5ldyBHcmlkRGF0YSgpOwotCQl0aGlzLm92ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5zQ2hlY2tCb3ggPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQnV0dG9uKAotCQkJY29tcG9zaXRlLCAKLQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfb3ZlcnJpZGVEZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zLCAKLQkJCVNXVC5DSEVDSyk7Ci0JCXRoaXMub3ZlcnJpZGVEZWZhdWx0Sm9pbkNvbHVtbnNDaGVja0JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCS8vIGRvIG5vdGhpbmcKLQkJCX0KLQkJCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKFByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZS50aGlzLm92ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5zQ2hlY2tCb3guZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQkJSVByaW1hcnlLZXlKb2luQ29sdW1uIGRlZmF1bHRKb2luQ29sdW1uID0gUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlLnRoaXMuZW50aXR5LmdldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5nZXQoMCk7Ci0JCQkJCVN0cmluZyBjb2x1bW5OYW1lID0gZGVmYXVsdEpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKTsKLQkJCQkJU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gZGVmYXVsdEpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCk7Ci0JCQkJCQotCQkJCQlJUHJpbWFyeUtleUpvaW5Db2x1bW4gcGtKb2luQ29sdW1uID0gUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlLnRoaXMuZW50aXR5LmNyZWF0ZVByaW1hcnlLZXlKb2luQ29sdW1uKDApOwotCQkJCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGUudGhpcy5lbnRpdHkuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuYWRkKHBrSm9pbkNvbHVtbik7Ci0JCQkJCXBrSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKGNvbHVtbk5hbWUpOwotCQkJCQlwa0pvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUocmVmZXJlbmNlZENvbHVtbk5hbWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCVByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZS50aGlzLmVudGl0eS5nZXRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5jbGVhcigpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJdGhpcy5wa0pvaW5Db2x1bW5zR3JvdXAgPSAKLQkJCWdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVHcm91cCgKLQkJCQljb21wb3NpdGUsIAotCQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfcHJpbWFyeUtleUpvaW5Db2x1bW4pOwotCQl0aGlzLnBrSm9pbkNvbHVtbnNHcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJZ3JpZERhdGEgPSAgbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJdGhpcy5wa0pvaW5Db2x1bW5zR3JvdXAuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQkKLQkJdGhpcy5wa0pvaW5Db2x1bW5zTGlzdFZpZXdlciA9IG5ldyBMaXN0Vmlld2VyKHRoaXMucGtKb2luQ29sdW1uc0dyb3VwLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJKTsKLQkJdGhpcy5wa0pvaW5Db2x1bW5zTGlzdFZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoYnVpbGRKb2luQ29sdW1uc0xpc3RDb250ZW50UHJvdmlkZXIoKSk7Ci0JCXRoaXMucGtKb2luQ29sdW1uc0xpc3RWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihidWlsZEpvaW5Db2x1bW5zTGlzdExhYmVsUHJvdmlkZXIoKSk7Ci0JCWdyaWREYXRhID0gIG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbFNwYW4gPSAzOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQl0aGlzLnBrSm9pbkNvbHVtbnNMaXN0Vmlld2VyLmdldExpc3QoKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0aGlzLnBrSm9pbkNvbHVtbnNMaXN0Vmlld2VyLmdldExpc3QoKSwgSUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfSk9JTl9UQUJMRV9DT0xVTU5TKTsKLQkJCi0JCUJ1dHRvbiBhZGRKb2luQ29sdW1uQnV0dG9uID0gbmV3IEJ1dHRvbih0aGlzLnBrSm9pbkNvbHVtbnNHcm91cCwgU1dULk5PTkUpOwotCQlhZGRKb2luQ29sdW1uQnV0dG9uLnNldFRleHQoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9hZGQpOwotCQlncmlkRGF0YSA9ICBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWFkZEpvaW5Db2x1bW5CdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWFkZEpvaW5Db2x1bW5CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkvLyBkbyBub3RoaW5nCi0JCQl9Ci0JCQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWFkZFByaW1hcnlLZXlKb2luQ29sdW1uKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJdGhpcy5wa0pvaW5Db2x1bW5zRWRpdEJ1dHRvbiA9IG5ldyBCdXR0b24odGhpcy5wa0pvaW5Db2x1bW5zR3JvdXAsIFNXVC5OT05FKTsKLQkJdGhpcy5wa0pvaW5Db2x1bW5zRWRpdEJ1dHRvbi5zZXRUZXh0KEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfZWRpdCk7Ci0JCXRoaXMucGtKb2luQ29sdW1uc0VkaXRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkvLyBkbyBub3RoaW5nCi0JCQl9Ci0JCQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWVkaXRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpOwotCQkJfQotCQl9KTsKLQkJZ3JpZERhdGEgPSAgbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQl0aGlzLnBrSm9pbkNvbHVtbnNFZGl0QnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCXRoaXMucGtKb2luQ29sdW1uc1JlbW92ZUJ1dHRvbiA9IG5ldyBCdXR0b24odGhpcy5wa0pvaW5Db2x1bW5zR3JvdXAsIFNXVC5OT05FKTsKLQkJdGhpcy5wa0pvaW5Db2x1bW5zUmVtb3ZlQnV0dG9uLnNldFRleHQoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9yZW1vdmUpOwotCQlncmlkRGF0YSA9ICBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuQkVHSU5OSU5HOwotCQl0aGlzLnBrSm9pbkNvbHVtbnNSZW1vdmVCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXRoaXMucGtKb2luQ29sdW1uc1JlbW92ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCS8vIGRvIG5vdGhpbmcKLQkJCX0KLQkJCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJcmVtb3ZlUHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQl0aGlzLnBrSm9pbkNvbHVtbnNMaXN0Vmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJdXBkYXRlUHJpbWFyeUtleUpvaW5Db2x1bW5zRW5hYmxlbWVudCgpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29udGVudFByb3ZpZGVyIGJ1aWxkSm9pbkNvbHVtbnNMaXN0Q29udGVudFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyKCl7Ci0JCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJCQkvLyBkbyBub3RoaW5nCi0JCQl9Ci0JCQotCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCQkvLyBkbyBub3RoaW5nCi0JCQl9Ci0JCQotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gKChJRW50aXR5KSBpbnB1dEVsZW1lbnQpLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBidWlsZEpvaW5Db2x1bW5zTGlzdExhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCUlQcmltYXJ5S2V5Sm9pbkNvbHVtbiBqb2luQ29sdW1uID0gKElQcmltYXJ5S2V5Sm9pbkNvbHVtbikgZWxlbWVudDsKLQkJCQlyZXR1cm4gKFByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZS50aGlzLmVudGl0eS5jb250YWluc1NwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpKSA/Ci0JCQkJCWJ1aWxkSm9pbkNvbHVtbkxhYmVsKGpvaW5Db2x1bW4pCi0JCQkJOgotCQkJCQlidWlsZERlZmF1bHRKb2luQ29sdW1uTGFiZWwoam9pbkNvbHVtbik7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCVN0cmluZyBidWlsZERlZmF1bHRKb2luQ29sdW1uTGFiZWwoSVByaW1hcnlLZXlKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJcmV0dXJuIE5MUy5iaW5kKEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNEZWZhdWx0LCBqb2luQ29sdW1uLmdldE5hbWUoKSwgam9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsJCQkJCi0JfQotCQotCVN0cmluZyBidWlsZEpvaW5Db2x1bW5MYWJlbChJUHJpbWFyeUtleUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQlpZiAoam9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkgPT0gbnVsbCkgewotCQkJaWYgKGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIE5MUy5iaW5kKEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNCb3RoRGVmYXVsdCwgam9pbkNvbHVtbi5nZXROYW1lKCksam9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsJCQkJCi0JCQl9Ci0JCQlyZXR1cm4gTkxTLmJpbmQoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtc0ZpcnN0RGVmYXVsdCwgam9pbkNvbHVtbi5nZXROYW1lKCksIGpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCX0KLQkJZWxzZSBpZiAoam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpID09IG51bGwpIHsKLQkJCXJldHVybiBOTFMuYmluZChKcHRVaU1hcHBpbmdzTWVzc2FnZXMuUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zU2VjRGVmYXVsdCwgam9pbkNvbHVtbi5nZXROYW1lKCksIGpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7CQkJCQotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIE5MUy5iaW5kKEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXMsIGpvaW5Db2x1bW4uZ2V0TmFtZSgpLCBqb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwkJCQkJCi0JCX0KLQl9Ci0KLQkKLQl2b2lkIGFkZFByaW1hcnlLZXlKb2luQ29sdW1uKCkgewotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbkRpYWxvZyBkaWFsb2cgPSBuZXcgUHJpbWFyeUtleUpvaW5Db2x1bW5EaWFsb2codGhpcy5nZXRDb250cm9sKCkuZ2V0U2hlbGwoKSwgdGhpcy5lbnRpdHkpOwotCQlhZGRKb2luQ29sdW1uRnJvbURpYWxvZyhkaWFsb2cpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkSm9pbkNvbHVtbkZyb21EaWFsb2coUHJpbWFyeUtleUpvaW5Db2x1bW5EaWFsb2cgZGlhbG9nKSB7Ci0JCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJaW50IGluZGV4ID0gdGhpcy5lbnRpdHkuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuc2l6ZSgpOwotCQkJU3RyaW5nIG5hbWUgPSBkaWFsb2cuZ2V0U2VsZWN0ZWROYW1lKCk7Ci0JCQlTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBkaWFsb2cuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKTsKLQkJCUlQcmltYXJ5S2V5Sm9pbkNvbHVtbiBqb2luQ29sdW1uID0gdGhpcy5lbnRpdHkuY3JlYXRlUHJpbWFyeUtleUpvaW5Db2x1bW4oaW5kZXgpOwotCQkJdGhpcy5lbnRpdHkuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuYWRkKGpvaW5Db2x1bW4pOwotCQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKG5hbWUpOwotCQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZShyZWZlcmVuY2VkQ29sdW1uTmFtZSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBJUHJpbWFyeUtleUpvaW5Db2x1bW4gZ2V0U2VsZWN0ZWRKb2luQ29sdW1uKCkgewotCQlyZXR1cm4gKElQcmltYXJ5S2V5Sm9pbkNvbHVtbikgKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0aGlzLnBrSm9pbkNvbHVtbnNMaXN0Vmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQl9Ci0KLQl2b2lkIGVkaXRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpIHsKLQkJSVByaW1hcnlLZXlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBnZXRTZWxlY3RlZEpvaW5Db2x1bW4oKTsKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW5EaWFsb2cgZGlhbG9nID0gbmV3IFByaW1hcnlLZXlKb2luQ29sdW1uRGlhbG9nKHRoaXMuZ2V0Q29udHJvbCgpLmdldFNoZWxsKCksIGpvaW5Db2x1bW4pOwotCQllZGl0Sm9pbkNvbHVtbkZyb21EaWFsb2coZGlhbG9nLCBqb2luQ29sdW1uKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGVkaXRKb2luQ29sdW1uRnJvbURpYWxvZyhQcmltYXJ5S2V5Sm9pbkNvbHVtbkRpYWxvZyBkaWFsb2csIElQcmltYXJ5S2V5Sm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJZWRpdEpvaW5Db2x1bW5EaWFsb2dPa2QoZGlhbG9nLCBqb2luQ29sdW1uKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgZWRpdEpvaW5Db2x1bW5EaWFsb2dPa2QoUHJpbWFyeUtleUpvaW5Db2x1bW5EaWFsb2cgZGlhbG9nLCBJUHJpbWFyeUtleUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQlTdHJpbmcgbmFtZSA9IGRpYWxvZy5nZXRTZWxlY3RlZE5hbWUoKTsKLQkJU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gZGlhbG9nLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCk7Ci0KLQkJaWYgKGRpYWxvZy5pc0RlZmF1bHROYW1lU2VsZWN0ZWQoKSkgewotCQkJaWYgKGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpICE9IG51bGwpIHsKLQkJCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoam9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkgPT0gbnVsbCB8fCAham9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkuZXF1YWxzKG5hbWUpKXsKLQkJCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZShuYW1lKTsKLQkJfQotCQkKLQkJaWYgKGRpYWxvZy5pc0RlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZVNlbGVjdGVkKCkpIHsKLQkJCWlmIChqb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgIT0gbnVsbCkgewotCQkJCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUobnVsbCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpID09IG51bGwgfHwgIWpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKS5lcXVhbHMocmVmZXJlbmNlZENvbHVtbk5hbWUpKXsKLQkJCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUocmVmZXJlbmNlZENvbHVtbk5hbWUpOwotCQl9Ci0JfQotCQotCXZvaWQgcmVtb3ZlUHJpbWFyeUtleUpvaW5Db2x1bW4oKSB7Ci0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gdGhpcy5wa0pvaW5Db2x1bW5zTGlzdFZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCWZvciAoSXRlcmF0b3IgaSA9ICgoU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7Ci0JCQkJdGhpcy5lbnRpdHkuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkucmVtb3ZlKGkubmV4dCgpKTsKLQkJCX0KLQkJfQotCX0KLQkKLQl2b2lkIHVwZGF0ZVByaW1hcnlLZXlKb2luQ29sdW1uc0VuYWJsZW1lbnQoKSB7Ci0JCWJvb2xlYW4gZ3JvdXBFbmFibGVkU3RhdGUgPSB0aGlzLmVudGl0eS5jb250YWluc1NwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCQllbmFibGVHcm91cCh0aGlzLnBrSm9pbkNvbHVtbnNHcm91cCwgZ3JvdXBFbmFibGVkU3RhdGUpOwotCi0JCXRoaXMucGtKb2luQ29sdW1uc1JlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKGdyb3VwRW5hYmxlZFN0YXRlICYmICEoKFN0cnVjdHVyZWRTZWxlY3Rpb24pIHRoaXMucGtKb2luQ29sdW1uc0xpc3RWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmlzRW1wdHkoKSk7Ci0JCXRoaXMucGtKb2luQ29sdW1uc0VkaXRCdXR0b24uc2V0RW5hYmxlZChncm91cEVuYWJsZWRTdGF0ZSAmJiAoKFN0cnVjdHVyZWRTZWxlY3Rpb24pIHRoaXMucGtKb2luQ29sdW1uc0xpc3RWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLnNpemUoKSA9PSAxKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGVuYWJsZUdyb3VwKEdyb3VwIGdyb3VwLCBib29sZWFuIGVuYWJsZWQpIHsKLQkJZ3JvdXAuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBncm91cC5nZXRDaGlsZHJlbigpLmxlbmd0aDsgaSsrKSB7Ci0JCQlncm91cC5nZXRDaGlsZHJlbigpW2ldLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCX0JCi0JfQotCQotCQotCXB1YmxpYyB2b2lkIGRvUG9wdWxhdGUoRU9iamVjdCBvYmopIHsKLQkJdGhpcy5lbnRpdHkgPSAoSUVudGl0eSkgb2JqOwotCQlpZiAodGhpcy5lbnRpdHkgPT0gbnVsbCkgewotCQkJdGhpcy5wa0pvaW5Db2x1bW5zTGlzdFZpZXdlci5zZXRJbnB1dChudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJdGhpcy5wa0pvaW5Db2x1bW5zTGlzdFZpZXdlci5zZXRJbnB1dCh0aGlzLmVudGl0eSk7Ci0JCQotCi0JCXVwZGF0ZVByaW1hcnlLZXlKb2luQ29sdW1uc0VuYWJsZW1lbnQoKTsKLQkJdGhpcy5vdmVycmlkZURlZmF1bHRKb2luQ29sdW1uc0NoZWNrQm94LnNldFNlbGVjdGlvbih0aGlzLmVudGl0eS5jb250YWluc1NwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb1BvcHVsYXRlKCkgewotCX0KLQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUxpc3RlbmVycygpIHsKLQkJaWYgKHRoaXMuZW50aXR5ICE9IG51bGwpIHsKLQkJCXRoaXMuZW50aXR5LmVBZGFwdGVycygpLmFkZCh0aGlzLmVudGl0eUxpc3RlbmVyKTsKLQkJCWZvciAoSVByaW1hcnlLZXlKb2luQ29sdW1uIHBrSm9pbkNvbHVtbiA6IHRoaXMuZW50aXR5LmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpKSB7Ci0JCQkJcGtKb2luQ29sdW1uLmVBZGFwdGVycygpLmFkZCh0aGlzLnBrSm9pbkNvbHVtbkxpc3RlbmVyKTsKLQkJCX0KLQkJCS8vdGhpcy5hZGRDb25uZWN0aW9uTGlzdGVuZXIoKTsJCQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZUxpc3RlbmVycygpIHsKLQkJaWYgKHRoaXMuZW50aXR5ICE9IG51bGwpIHsKLQkJCS8vdGhpcy5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJCWZvciAoSVByaW1hcnlLZXlKb2luQ29sdW1uIHBrSm9pbkNvbHVtbiA6IHRoaXMuZW50aXR5LmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpKSB7Ci0JCQkJcGtKb2luQ29sdW1uLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzLnBrSm9pbkNvbHVtbkxpc3RlbmVyKTsKLQkJCX0KLQkJCXRoaXMuZW50aXR5LmVBZGFwdGVycygpLnJlbW92ZSh0aGlzLmVudGl0eUxpc3RlbmVyKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBlbnRpdHlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJaWYgKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSUVudGl0eS5jbGFzcykgPT0gSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JRU5USVRZX19TUEVDSUZJRURfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TKSB7Ci0JCQlpZiAobm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpID09IE5vdGlmaWNhdGlvbi5BREQpIHsKLQkJCQkoKElQcmltYXJ5S2V5Sm9pbkNvbHVtbikgbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCkpLmVBZGFwdGVycygpLmFkZCh0aGlzLnBrSm9pbkNvbHVtbkxpc3RlbmVyKTsKLQkJCX0KLQkJCWVsc2UgaWYgKG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uUkVNT1ZFKSB7Ci0JCQkJKChJUHJpbWFyeUtleUpvaW5Db2x1bW4pIG5vdGlmaWNhdGlvbi5nZXRPbGRWYWx1ZSgpKS5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcy5wa0pvaW5Db2x1bW5MaXN0ZW5lcik7CQkJCQotCQkJfQotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChnZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJcGtKb2luQ29sdW1uc0xpc3RWaWV3ZXIucmVmcmVzaCgpOwotCQkJCQlvdmVycmlkZURlZmF1bHRKb2luQ29sdW1uc0NoZWNrQm94LnNldFNlbGVjdGlvbihlbnRpdHkuY29udGFpbnNTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSk7Ci0JCQkJCXVwZGF0ZVByaW1hcnlLZXlKb2luQ29sdW1uc0VuYWJsZW1lbnQoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBrSm9pbkNvbHVtbkNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlpZiAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChJTmFtZWRDb2x1bW4uY2xhc3MpID09IEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSU5BTUVEX0NPTFVNTl9fU1BFQ0lGSUVEX05BTUUKLQkJCXx8IG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSUFic3RyYWN0Sm9pbkNvbHVtbi5jbGFzcykgPT0gSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JQUJTVFJBQ1RfSk9JTl9DT0xVTU5fX1NQRUNJRklFRF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FCi0JCQl8fCBub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKElOYW1lZENvbHVtbi5jbGFzcykgPT0gSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JTkFNRURfQ09MVU1OX19ERUZBVUxUX05BTUUKLQkJCXx8IG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSUFic3RyYWN0Sm9pbkNvbHVtbi5jbGFzcykgPT0gSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JQUJTVFJBQ1RfSk9JTl9DT0xVTU5fX0RFRkFVTFRfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSkgewotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChnZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJcGtKb2luQ29sdW1uc0xpc3RWaWV3ZXIucmVmcmVzaCgpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9QcmltYXJ5S2V5Sm9pbkNvbHVtbnNJblNlY29uZGFyeVRhYmxlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1ByaW1hcnlLZXlKb2luQ29sdW1uc0luU2Vjb25kYXJ5VGFibGVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FmYzU0Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1ByaW1hcnlLZXlKb2luQ29sdW1uc0luU2Vjb25kYXJ5VGFibGVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGlzdFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JQWJzdHJhY3RKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklOYW1lZENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JUHJpbWFyeUtleUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSVNlY29uZGFyeVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLkpwYUNvcmVNYXBwaW5nc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLklKcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5CYXNlSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLQotcHVibGljIGNsYXNzIFByaW1hcnlLZXlKb2luQ29sdW1uc0luU2Vjb25kYXJ5VGFibGVDb21wb3NpdGUgZXh0ZW5kcyBCYXNlSnBhQ29tcG9zaXRlIAotewotCXByaXZhdGUgSVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlOwotCXByaXZhdGUgZmluYWwgQWRhcHRlciBzZWNvbmRhcnlUYWJsZUxpc3RlbmVyOwotCXByaXZhdGUgZmluYWwgQWRhcHRlciBwa0pvaW5Db2x1bW5MaXN0ZW5lcjsKLQkKLQlMaXN0Vmlld2VyIHBrSm9pbkNvbHVtbnNMaXN0Vmlld2VyOwotCi0JcHJpdmF0ZSBHcm91cCBwa0pvaW5Db2x1bW5zR3JvdXA7Ci0JQnV0dG9uIG92ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5zQ2hlY2tCb3g7Ci0JcHJpdmF0ZSBCdXR0b24gcGtKb2luQ29sdW1uc0FkZEJ1dHRvbjsKLQlwcml2YXRlIEJ1dHRvbiBwa0pvaW5Db2x1bW5zUmVtb3ZlQnV0dG9uOwotCXByaXZhdGUgQnV0dG9uIHBrSm9pbkNvbHVtbnNFZGl0QnV0dG9uOwotCQotCQotCXB1YmxpYyBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNJblNlY29uZGFyeVRhYmxlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIENvbW1hbmRTdGFjayBjb21tYW5kU3RhY2ssIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJc3VwZXIocGFyZW50LCBTV1QuTlVMTCwgY29tbWFuZFN0YWNrLCB3aWRnZXRGYWN0b3J5KTsKLQkJdGhpcy5zZWNvbmRhcnlUYWJsZUxpc3RlbmVyID0gYnVpbGRTZWNvbmRhcnlUYWJsZUxpc3RlbmVyKCk7Ci0JCXRoaXMucGtKb2luQ29sdW1uTGlzdGVuZXIgPSBidWlsZFBrSm9pbkNvbHVtbkxpc3RlbmVyKCk7Ci0JfQotCQotCXByaXZhdGUgQWRhcHRlciBidWlsZFNlY29uZGFyeVRhYmxlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJCQlzZWNvbmRhcnlUYWJsZUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBBZGFwdGVyIGJ1aWxkUGtKb2luQ29sdW1uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJCQlwa0pvaW5Db2x1bW5DaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQkKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSAgbmV3IEdyaWREYXRhKCk7Ci0JCXRoaXMub3ZlcnJpZGVEZWZhdWx0Sm9pbkNvbHVtbnNDaGVja0JveCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVCdXR0b24oCi0JCQljb21wb3NpdGUsIAotCQkJSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9vdmVycmlkZURlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMsIAotCQkJU1dULkNIRUNLKTsKLQkJdGhpcy5vdmVycmlkZURlZmF1bHRKb2luQ29sdW1uc0NoZWNrQm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJLy8gZG8gbm90aGluZwotCQkJfQotCQkKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpZiAoUHJpbWFyeUtleUpvaW5Db2x1bW5zSW5TZWNvbmRhcnlUYWJsZUNvbXBvc2l0ZS50aGlzLm92ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5zQ2hlY2tCb3guZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQkJSVByaW1hcnlLZXlKb2luQ29sdW1uIGRlZmF1bHRKb2luQ29sdW1uID0gUHJpbWFyeUtleUpvaW5Db2x1bW5zSW5TZWNvbmRhcnlUYWJsZUNvbXBvc2l0ZS50aGlzLnNlY29uZGFyeVRhYmxlLmdldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5nZXQoMCk7Ci0JCQkJCVN0cmluZyBjb2x1bW5OYW1lID0gZGVmYXVsdEpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKTsKLQkJCQkJU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gZGVmYXVsdEpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCk7Ci0JCQkJCQotCQkJCQlJUHJpbWFyeUtleUpvaW5Db2x1bW4gcGtKb2luQ29sdW1uID0gUHJpbWFyeUtleUpvaW5Db2x1bW5zSW5TZWNvbmRhcnlUYWJsZUNvbXBvc2l0ZS50aGlzLnNlY29uZGFyeVRhYmxlLmNyZWF0ZVByaW1hcnlLZXlKb2luQ29sdW1uKDApOwotCQkJCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbnNJblNlY29uZGFyeVRhYmxlQ29tcG9zaXRlLnRoaXMuc2Vjb25kYXJ5VGFibGUuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuYWRkKHBrSm9pbkNvbHVtbik7Ci0JCQkJCXBrSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKGNvbHVtbk5hbWUpOwotCQkJCQlwa0pvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUocmVmZXJlbmNlZENvbHVtbk5hbWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCVByaW1hcnlLZXlKb2luQ29sdW1uc0luU2Vjb25kYXJ5VGFibGVDb21wb3NpdGUudGhpcy5zZWNvbmRhcnlUYWJsZS5nZXRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5jbGVhcigpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJdGhpcy5wa0pvaW5Db2x1bW5zR3JvdXAgPSAKLQkJCWdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVHcm91cCgKLQkJCQljb21wb3NpdGUsIAotCQkJCUpwdFVpTWFwcGluZ3NNZXNzYWdlcy5QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfcHJpbWFyeUtleUpvaW5Db2x1bW4pOwotCQl0aGlzLnBrSm9pbkNvbHVtbnNHcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJZ3JpZERhdGEgPSAgbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJdGhpcy5wa0pvaW5Db2x1bW5zR3JvdXAuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQkKLQkJdGhpcy5wa0pvaW5Db2x1bW5zTGlzdFZpZXdlciA9IG5ldyBMaXN0Vmlld2VyKHRoaXMucGtKb2luQ29sdW1uc0dyb3VwLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJKTsKLQkJdGhpcy5wa0pvaW5Db2x1bW5zTGlzdFZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoYnVpbGRKb2luQ29sdW1uc0xpc3RDb250ZW50UHJvdmlkZXIoKSk7Ci0JCXRoaXMucGtKb2luQ29sdW1uc0xpc3RWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihidWlsZEpvaW5Db2x1bW5zTGlzdExhYmVsUHJvdmlkZXIoKSk7Ci0JCWdyaWREYXRhID0gIG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbFNwYW4gPSAzOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQl0aGlzLnBrSm9pbkNvbHVtbnNMaXN0Vmlld2VyLmdldExpc3QoKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0aGlzLnBrSm9pbkNvbHVtbnNMaXN0Vmlld2VyLmdldExpc3QoKSwgSUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfSk9JTl9UQUJMRV9DT0xVTU5TKTsKLQkJCi0JCXRoaXMucGtKb2luQ29sdW1uc0FkZEJ1dHRvbiA9IG5ldyBCdXR0b24odGhpcy5wa0pvaW5Db2x1bW5zR3JvdXAsIFNXVC5OT05FKTsKLQkJdGhpcy5wa0pvaW5Db2x1bW5zQWRkQnV0dG9uLnNldFRleHQoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9hZGQpOwotCQlncmlkRGF0YSA9ICBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCXRoaXMucGtKb2luQ29sdW1uc0FkZEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJdGhpcy5wa0pvaW5Db2x1bW5zQWRkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJLy8gZG8gbm90aGluZwotCQkJfQotCQkKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlhZGRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpOwotCQkJfQotCQl9KTsKLQkJCi0JCXRoaXMucGtKb2luQ29sdW1uc0VkaXRCdXR0b24gPSBuZXcgQnV0dG9uKHRoaXMucGtKb2luQ29sdW1uc0dyb3VwLCBTV1QuTk9ORSk7Ci0JCXRoaXMucGtKb2luQ29sdW1uc0VkaXRCdXR0b24uc2V0VGV4dChKcHRVaU1hcHBpbmdzTWVzc2FnZXMuUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX2VkaXQpOwotCQl0aGlzLnBrSm9pbkNvbHVtbnNFZGl0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJLy8gZG8gbm90aGluZwotCQkJfQotCQkKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQllZGl0UHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKLQkJCX0KLQkJfSk7Ci0JCWdyaWREYXRhID0gIG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJdGhpcy5wa0pvaW5Db2x1bW5zRWRpdEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQl0aGlzLnBrSm9pbkNvbHVtbnNSZW1vdmVCdXR0b24gPSBuZXcgQnV0dG9uKHRoaXMucGtKb2luQ29sdW1uc0dyb3VwLCBTV1QuTk9ORSk7Ci0JCXRoaXMucGtKb2luQ29sdW1uc1JlbW92ZUJ1dHRvbi5zZXRUZXh0KEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfcmVtb3ZlKTsKLQkJZ3JpZERhdGEgPSAgbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkJFR0lOTklORzsKLQkJdGhpcy5wa0pvaW5Db2x1bW5zUmVtb3ZlQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl0aGlzLnBrSm9pbkNvbHVtbnNSZW1vdmVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkvLyBkbyBub3RoaW5nCi0JCQl9Ci0JCQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXJlbW92ZVByaW1hcnlLZXlKb2luQ29sdW1uKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJdGhpcy5wa0pvaW5Db2x1bW5zTGlzdFZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCXVwZGF0ZVByaW1hcnlLZXlKb2luQ29sdW1uc0VuYWJsZW1lbnQoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbnRlbnRQcm92aWRlciBidWlsZEpvaW5Db2x1bW5zTGlzdENvbnRlbnRQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcigpewotCQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQkJLy8gZG8gbm90aGluZwotCQkJfQotCQkKLQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQkJLy8gZG8gbm90aGluZwotCQkJfQotCQkKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQkJcmV0dXJuICgoSVNlY29uZGFyeVRhYmxlKSBpbnB1dEVsZW1lbnQpLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBidWlsZEpvaW5Db2x1bW5zTGlzdExhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCUlQcmltYXJ5S2V5Sm9pbkNvbHVtbiBqb2luQ29sdW1uID0gKElQcmltYXJ5S2V5Sm9pbkNvbHVtbikgZWxlbWVudDsKLQkJCQlyZXR1cm4gKFByaW1hcnlLZXlKb2luQ29sdW1uc0luU2Vjb25kYXJ5VGFibGVDb21wb3NpdGUudGhpcy5zZWNvbmRhcnlUYWJsZS5jb250YWluc1NwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpKSA/Ci0JCQkJCWJ1aWxkSm9pbkNvbHVtbkxhYmVsKGpvaW5Db2x1bW4pCi0JCQkJOgotCQkJCQlidWlsZERlZmF1bHRKb2luQ29sdW1uTGFiZWwoam9pbkNvbHVtbik7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCVN0cmluZyBidWlsZERlZmF1bHRKb2luQ29sdW1uTGFiZWwoSVByaW1hcnlLZXlKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJcmV0dXJuIE5MUy5iaW5kKEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNEZWZhdWx0LCBqb2luQ29sdW1uLmdldE5hbWUoKSwgam9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsJCQkJCi0JfQotCQotCVN0cmluZyBidWlsZEpvaW5Db2x1bW5MYWJlbChJUHJpbWFyeUtleUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQlpZiAoam9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkgPT0gbnVsbCkgewotCQkJaWYgKGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIE5MUy5iaW5kKEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNCb3RoRGVmYXVsdCwgam9pbkNvbHVtbi5nZXROYW1lKCksam9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsJCQkJCi0JCQl9Ci0JCQlyZXR1cm4gTkxTLmJpbmQoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtc0ZpcnN0RGVmYXVsdCwgam9pbkNvbHVtbi5nZXROYW1lKCksIGpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCX0KLQkJZWxzZSBpZiAoam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpID09IG51bGwpIHsKLQkJCXJldHVybiBOTFMuYmluZChKcHRVaU1hcHBpbmdzTWVzc2FnZXMuUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zU2VjRGVmYXVsdCwgam9pbkNvbHVtbi5nZXROYW1lKCksIGpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7CQkJCQotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIE5MUy5iaW5kKEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXMsIGpvaW5Db2x1bW4uZ2V0TmFtZSgpLCBqb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwkJCQkJCi0JCX0KLQl9Ci0KLQkKLQl2b2lkIGFkZFByaW1hcnlLZXlKb2luQ29sdW1uKCkgewotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVEaWFsb2cgZGlhbG9nID0gbmV3IFByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZURpYWxvZyh0aGlzLmdldENvbnRyb2woKS5nZXRTaGVsbCgpLCB0aGlzLnNlY29uZGFyeVRhYmxlKTsKLQkJYWRkSm9pbkNvbHVtbkZyb21EaWFsb2coZGlhbG9nKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZEpvaW5Db2x1bW5Gcm9tRGlhbG9nKFByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZURpYWxvZyBkaWFsb2cpIHsKLQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQlpbnQgaW5kZXggPSB0aGlzLnNlY29uZGFyeVRhYmxlLmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLnNpemUoKTsKLQkJCVN0cmluZyBuYW1lID0gZGlhbG9nLmdldFNlbGVjdGVkTmFtZSgpOwotCQkJU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gZGlhbG9nLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCk7Ci0JCQlJUHJpbWFyeUtleUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IHRoaXMuc2Vjb25kYXJ5VGFibGUuY3JlYXRlUHJpbWFyeUtleUpvaW5Db2x1bW4oaW5kZXgpOwotCQkJdGhpcy5zZWNvbmRhcnlUYWJsZS5nZXRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5hZGQoam9pbkNvbHVtbik7Ci0JCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUobmFtZSk7Ci0JCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKHJlZmVyZW5jZWRDb2x1bW5OYW1lKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIElQcmltYXJ5S2V5Sm9pbkNvbHVtbiBnZXRTZWxlY3RlZEpvaW5Db2x1bW4oKSB7Ci0JCXJldHVybiAoSVByaW1hcnlLZXlKb2luQ29sdW1uKSAoKFN0cnVjdHVyZWRTZWxlY3Rpb24pIHRoaXMucGtKb2luQ29sdW1uc0xpc3RWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCX0KLQotCXZvaWQgZWRpdFByaW1hcnlLZXlKb2luQ29sdW1uKCkgewotCQlJUHJpbWFyeUtleUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IGdldFNlbGVjdGVkSm9pbkNvbHVtbigpOwotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVEaWFsb2cgZGlhbG9nID0gbmV3IFByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZURpYWxvZyh0aGlzLmdldENvbnRyb2woKS5nZXRTaGVsbCgpLCBqb2luQ29sdW1uKTsKLQkJZWRpdEpvaW5Db2x1bW5Gcm9tRGlhbG9nKGRpYWxvZywgam9pbkNvbHVtbik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBlZGl0Sm9pbkNvbHVtbkZyb21EaWFsb2coUHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlRGlhbG9nIGRpYWxvZywgSVByaW1hcnlLZXlKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQllZGl0Sm9pbkNvbHVtbkRpYWxvZ09rZChkaWFsb2csIGpvaW5Db2x1bW4pOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBlZGl0Sm9pbkNvbHVtbkRpYWxvZ09rZChQcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVEaWFsb2cgZGlhbG9nLCBJUHJpbWFyeUtleUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQlTdHJpbmcgbmFtZSA9IGRpYWxvZy5nZXRTZWxlY3RlZE5hbWUoKTsKLQkJU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gZGlhbG9nLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCk7Ci0KLQkJaWYgKGRpYWxvZy5pc0RlZmF1bHROYW1lU2VsZWN0ZWQoKSkgewotCQkJaWYgKGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpICE9IG51bGwpIHsKLQkJCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoam9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkgPT0gbnVsbCB8fCAham9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkuZXF1YWxzKG5hbWUpKXsKLQkJCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZShuYW1lKTsKLQkJfQotCQkKLQkJaWYgKGRpYWxvZy5pc0RlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZVNlbGVjdGVkKCkpIHsKLQkJCWlmIChqb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgIT0gbnVsbCkgewotCQkJCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUobnVsbCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpID09IG51bGwgfHwgIWpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKS5lcXVhbHMocmVmZXJlbmNlZENvbHVtbk5hbWUpKXsKLQkJCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUocmVmZXJlbmNlZENvbHVtbk5hbWUpOwotCQl9Ci0JfQotCQotCXZvaWQgcmVtb3ZlUHJpbWFyeUtleUpvaW5Db2x1bW4oKSB7Ci0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gdGhpcy5wa0pvaW5Db2x1bW5zTGlzdFZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCWZvciAoSXRlcmF0b3IgaSA9ICgoU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7Ci0JCQkJdGhpcy5zZWNvbmRhcnlUYWJsZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5yZW1vdmUoaS5uZXh0KCkpOwotCQkJfQotCQl9Ci0JfQotCQotCXZvaWQgdXBkYXRlUHJpbWFyeUtleUpvaW5Db2x1bW5zRW5hYmxlbWVudCgpIHsKLQkJYm9vbGVhbiBncm91cEVuYWJsZWRTdGF0ZSA9IHRoaXMuc2Vjb25kYXJ5VGFibGUuY29udGFpbnNTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQkJZW5hYmxlR3JvdXAodGhpcy5wa0pvaW5Db2x1bW5zR3JvdXAsIGdyb3VwRW5hYmxlZFN0YXRlKTsKLQotCQl0aGlzLnBrSm9pbkNvbHVtbnNSZW1vdmVCdXR0b24uc2V0RW5hYmxlZChncm91cEVuYWJsZWRTdGF0ZSAmJiAhKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0aGlzLnBrSm9pbkNvbHVtbnNMaXN0Vmlld2VyLmdldFNlbGVjdGlvbigpKS5pc0VtcHR5KCkpOwotCQl0aGlzLnBrSm9pbkNvbHVtbnNFZGl0QnV0dG9uLnNldEVuYWJsZWQoZ3JvdXBFbmFibGVkU3RhdGUgJiYgKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0aGlzLnBrSm9pbkNvbHVtbnNMaXN0Vmlld2VyLmdldFNlbGVjdGlvbigpKS5zaXplKCkgPT0gMSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBlbmFibGVHcm91cChHcm91cCBncm91cCwgYm9vbGVhbiBlbmFibGVkKSB7Ci0JCWdyb3VwLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZ3JvdXAuZ2V0Q2hpbGRyZW4oKS5sZW5ndGg7IGkrKykgewotCQkJZ3JvdXAuZ2V0Q2hpbGRyZW4oKVtpXS5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQl9CQotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCBkb1BvcHVsYXRlKEVPYmplY3Qgb2JqKSB7Ci0JCXRoaXMuc2Vjb25kYXJ5VGFibGUgPSAoSVNlY29uZGFyeVRhYmxlKSBvYmo7Ci0JCWlmICh0aGlzLnNlY29uZGFyeVRhYmxlID09IG51bGwpIHsKLQkJCXRoaXMucGtKb2luQ29sdW1uc0xpc3RWaWV3ZXIuc2V0SW5wdXQobnVsbCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXRoaXMucGtKb2luQ29sdW1uc0xpc3RWaWV3ZXIuc2V0SW5wdXQodGhpcy5zZWNvbmRhcnlUYWJsZSk7Ci0JCQotCi0JCXVwZGF0ZVByaW1hcnlLZXlKb2luQ29sdW1uc0VuYWJsZW1lbnQoKTsKLQkJdGhpcy5vdmVycmlkZURlZmF1bHRKb2luQ29sdW1uc0NoZWNrQm94LnNldFNlbGVjdGlvbih0aGlzLnNlY29uZGFyeVRhYmxlLmNvbnRhaW5zU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvUG9wdWxhdGUoKSB7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTGlzdGVuZXJzKCkgewotCQlpZiAodGhpcy5zZWNvbmRhcnlUYWJsZSAhPSBudWxsKSB7Ci0JCQl0aGlzLnNlY29uZGFyeVRhYmxlLmVBZGFwdGVycygpLmFkZCh0aGlzLnNlY29uZGFyeVRhYmxlTGlzdGVuZXIpOwotCQkJZm9yIChJUHJpbWFyeUtleUpvaW5Db2x1bW4gcGtKb2luQ29sdW1uIDogdGhpcy5zZWNvbmRhcnlUYWJsZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSkgewotCQkJCXBrSm9pbkNvbHVtbi5lQWRhcHRlcnMoKS5hZGQodGhpcy5wa0pvaW5Db2x1bW5MaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTGlzdGVuZXJzKCkgewotCQlpZiAodGhpcy5zZWNvbmRhcnlUYWJsZSAhPSBudWxsKSB7Ci0JCQlmb3IgKElQcmltYXJ5S2V5Sm9pbkNvbHVtbiBwa0pvaW5Db2x1bW4gOiB0aGlzLnNlY29uZGFyeVRhYmxlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpKSB7Ci0JCQkJcGtKb2luQ29sdW1uLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzLnBrSm9pbkNvbHVtbkxpc3RlbmVyKTsKLQkJCX0KLQkJCXRoaXMuc2Vjb25kYXJ5VGFibGUuZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMuc2Vjb25kYXJ5VGFibGVMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2Vjb25kYXJ5VGFibGVDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJaWYgKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSVNlY29uZGFyeVRhYmxlLmNsYXNzKSA9PSBKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLklTRUNPTkRBUllfVEFCTEVfX1NQRUNJRklFRF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlMpIHsKLQkJCWlmIChub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLkFERCkgewotCQkJCSgoSVByaW1hcnlLZXlKb2luQ29sdW1uKSBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKSkuZUFkYXB0ZXJzKCkuYWRkKHRoaXMucGtKb2luQ29sdW1uTGlzdGVuZXIpOwotCQkJfQotCQkJZWxzZSBpZiAobm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpID09IE5vdGlmaWNhdGlvbi5SRU1PVkUpIHsKLQkJCQkoKElQcmltYXJ5S2V5Sm9pbkNvbHVtbikgbm90aWZpY2F0aW9uLmdldE9sZFZhbHVlKCkpLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzLnBrSm9pbkNvbHVtbkxpc3RlbmVyKTsJCQkJCi0JCQl9Ci0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlwa0pvaW5Db2x1bW5zTGlzdFZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJCW92ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5zQ2hlY2tCb3guc2V0U2VsZWN0aW9uKHNlY29uZGFyeVRhYmxlLmNvbnRhaW5zU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkpOwotCQkJCQl1cGRhdGVQcmltYXJ5S2V5Sm9pbkNvbHVtbnNFbmFibGVtZW50KCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwa0pvaW5Db2x1bW5DaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJaWYgKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSU5hbWVkQ29sdW1uLmNsYXNzKSA9PSBKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLklOQU1FRF9DT0xVTU5fX1NQRUNJRklFRF9OQU1FCi0JCQl8fCBub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKElBYnN0cmFjdEpvaW5Db2x1bW4uY2xhc3MpID09IEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSUFCU1RSQUNUX0pPSU5fQ09MVU1OX19TUEVDSUZJRURfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRQotCQkJfHwgbm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChJTmFtZWRDb2x1bW4uY2xhc3MpID09IEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSU5BTUVEX0NPTFVNTl9fREVGQVVMVF9OQU1FCi0JCQl8fCBub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKElBYnN0cmFjdEpvaW5Db2x1bW4uY2xhc3MpID09IEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSUFCU1RSQUNUX0pPSU5fQ09MVU1OX19ERUZBVUxUX1JFRkVSRU5DRURfQ09MVU1OX05BTUUpIHsKLQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCXBrSm9pbkNvbHVtbnNMaXN0Vmlld2VyLnJlZnJlc2goKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBlbmFibGVXaWRnZXRzKGJvb2xlYW4gZW5hYmxlZCkgewotCQl0aGlzLnBrSm9pbkNvbHVtbnNMaXN0Vmlld2VyLmdldENvbnRyb2woKS5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQl0aGlzLm92ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5zQ2hlY2tCb3guc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJdGhpcy5wa0pvaW5Db2x1bW5zRWRpdEJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQl0aGlzLnBrSm9pbkNvbHVtbnNSZW1vdmVCdXR0b24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJdGhpcy5wa0pvaW5Db2x1bW5zQWRkQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1NjaGVtYUNvbWJvLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1NjaGVtYUNvbWJvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2NTVjMjIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9TY2hlbWFDb21iby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSnBhQ29yZU1hcHBpbmdzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwuQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwuQ29ubmVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC5Db25uZWN0aW9uUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwuRGF0YWJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLlNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQmFzZUpwYUNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgU2NoZW1hQ29tYm8gZXh0ZW5kcyBCYXNlSnBhQ29udHJvbGxlcgotewotCXByaXZhdGUgSVRhYmxlIHRhYmxlOwotCi0JcHJpdmF0ZSBBZGFwdGVyIGxpc3RlbmVyOwotCi0JLyoqCi0JICogQ2FjaGluZyB0aGUgY29ubmVjdGlvblByb2ZpbGUgc28gd2UgY2FuIHJlbW92ZSB0aGUgbGlzdGVuZXIuIElmIHRoZQotCSAqIGNhY2hlZCB0YWJsZSBvYmplY3QgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBtb2RlbCB0aGVuIHdlIG5vIGxvbmdlcgotCSAqIGhhdmUgYWNjZXNzIHRvIHRoZSBwYXJlbnQgYW5kIGNhbm5vdCBmaW5kIHRoZSBjb25uZWN0aW9uUHJvZmlsZQotCSAqLwotCXByaXZhdGUgQ29ubmVjdGlvblByb2ZpbGUgY29ubmVjdGlvblByb2ZpbGU7Ci0KLQlwcml2YXRlIENvbm5lY3Rpb25MaXN0ZW5lciBjb25uZWN0aW9uTGlzdGVuZXI7Ci0KLQlwcml2YXRlIENDb21ibyBjb21ibzsKLQotCXB1YmxpYyBTY2hlbWFDb21ibyhDb21wb3NpdGUgcGFyZW50LCBDb21tYW5kU3RhY2sgdGhlQ29tbWFuZFN0YWNrLCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXN1cGVyKHBhcmVudCwgdGhlQ29tbWFuZFN0YWNrLCB3aWRnZXRGYWN0b3J5KTsKLQkJdGhpcy5saXN0ZW5lciA9IHRoaXMuYnVpbGRUYWJsZUxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvbkxpc3RlbmVyID0gdGhpcy5idWlsZENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCX0KLQotCXByaXZhdGUgQWRhcHRlciBidWlsZFRhYmxlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJCQlTY2hlbWFDb21iby50aGlzLnNjaGVtYUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbm5lY3Rpb25MaXN0ZW5lciBidWlsZENvbm5lY3Rpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDb25uZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhYm91dFRvQ2xvc2UoQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7Ci0JCQkvLyBub3QgaW50ZXJlc3RlZCB0byB0aGlzIGV2ZW50LgotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBjbG9zZWQoQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7Ci0JCQkJZ2V0Q29tYm8oKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJaWYgKGdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQlTY2hlbWFDb21iby50aGlzLnBvcHVsYXRlU2hlbWFDb21ibygpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIG1vZGlmaWVkKENvbm5lY3Rpb24gY29ubmVjdGlvbikgewotCQkJCWdldENvbWJvKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWlmIChnZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQkJU2NoZW1hQ29tYm8udGhpcy5wb3B1bGF0ZVNoZW1hQ29tYm8oKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBva1RvQ2xvc2UoQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7Ci0JCQkJLy8gbm90IGludGVyZXN0ZWQgdG8gdGhpcyBldmVudC4KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgb3BlbmVkKENvbm5lY3Rpb24gY29ubmVjdGlvbikgewotCQkJCWdldENvbWJvKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWlmIChnZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQkJU2NoZW1hQ29tYm8udGhpcy5wb3B1bGF0ZVNoZW1hQ29tYm8oKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBkYXRhYmFzZUNoYW5nZWQoQ29ubmVjdGlvbiBjb25uZWN0aW9uLCBmaW5hbCBEYXRhYmFzZSBkYXRhYmFzZSkgewotCQkJCWdldENvbnRyb2woKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJaWYgKGRhdGFiYXNlID09IFNjaGVtYUNvbWJvLnRoaXMuZ2V0RGF0YWJhc2UoKSkgewotCQkJCQkJCWlmICghZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJCQlTY2hlbWFDb21iby50aGlzLnBvcHVsYXRlU2hlbWFDb21ibygpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBzY2hlbWFDaGFuZ2VkKENvbm5lY3Rpb24gY29ubmVjdGlvbiwgZmluYWwgU2NoZW1hIHNjaGVtYSkgewotCQkJCWdldENvbnRyb2woKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJaWYgKHNjaGVtYSA9PSBTY2hlbWFDb21iby50aGlzLmdldFRhYmxlU2NoZW1hKCkpIHsKLQkJCQkJCQlpZiAoIWdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCQkJU2NoZW1hQ29tYm8udGhpcy5wb3B1bGF0ZVNoZW1hQ29tYm8oKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgdGFibGVDaGFuZ2VkKENvbm5lY3Rpb24gY29ubmVjdGlvbiwgZmluYWwgVGFibGUgdGFibGUpIHsKLQkJCS8vIG5vdCBpbnRlcmVzdGVkIHRvIHRoaXMgZXZlbnQuCi0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYnVpbGRXaWRnZXQoQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmNvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhwYXJlbnQsIFNXVC5GTEFUKTsKLQkJdGhpcy5jb21iby5hZGQoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlRhYmxlQ29tcG9zaXRlX2RlZmF1bHRFbXB0eSk7Ci0JCXRoaXMuY29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJaWYgKGlzUG9wdWxhdGluZygpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIHNjaGVtYVRleHQgPSAoKENDb21ibykgZS5nZXRTb3VyY2UoKSkuZ2V0VGV4dCgpOwotCQkJCWlmIChzY2hlbWFUZXh0LmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlzY2hlbWFUZXh0ID0gbnVsbDsKLQkJCQkJaWYgKFNjaGVtYUNvbWJvLnRoaXMudGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkgPT0gbnVsbCB8fCBTY2hlbWFDb21iby50aGlzLnRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChzY2hlbWFUZXh0ICE9IG51bGwgJiYgY29tYm8uZ2V0SXRlbUNvdW50KCkgPiAwICYmIHNjaGVtYVRleHQuZXF1YWxzKGNvbWJvLmdldEl0ZW0oMCkpKSB7Ci0JCQkJCXNjaGVtYVRleHQgPSBudWxsOwotCQkJCX0KLQkJCQlpZiAoU2NoZW1hQ29tYm8udGhpcy50YWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSA9PSBudWxsICYmIHNjaGVtYVRleHQgIT0gbnVsbCkgewotCQkJCQlTY2hlbWFDb21iby50aGlzLnRhYmxlLnNldFNwZWNpZmllZFNjaGVtYShzY2hlbWFUZXh0KTsKLQkJCQl9Ci0JCQkJaWYgKFNjaGVtYUNvbWJvLnRoaXMudGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkgIT0gbnVsbCAmJiAhU2NoZW1hQ29tYm8udGhpcy50YWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKS5lcXVhbHMoc2NoZW1hVGV4dCkpIHsKLQkJCQkJU2NoZW1hQ29tYm8udGhpcy50YWJsZS5zZXRTcGVjaWZpZWRTY2hlbWEoc2NoZW1hVGV4dCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzY2hlbWFDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJaWYgKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSVRhYmxlLmNsYXNzKSA9PSBKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLklUQUJMRV9fU1BFQ0lGSUVEX1NDSEVNQSkgewotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChnZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJU2NoZW1hQ29tYm8udGhpcy5wb3B1bGF0ZVNjaGVtYU5hbWUoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQllbHNlIGlmIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKElUYWJsZS5jbGFzcykgPT0gSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JVEFCTEVfX0RFRkFVTFRfU0NIRU1BKSB7Ci0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlTY2hlbWFDb21iby50aGlzLnBvcHVsYXRlRGVmYXVsdFNjaGVtYU5hbWUoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQllbHNlIGlmIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKElUYWJsZS5jbGFzcykgPT0gSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JVEFCTEVfX0RFRkFVTFRfQ0FUQUxPRykgewotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChnZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJU2NoZW1hQ29tYm8udGhpcy5wb3B1bGF0ZVNoZW1hQ29tYm8oKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQllbHNlIGlmIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKElUYWJsZS5jbGFzcykgPT0gSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JVEFCTEVfX1NQRUNJRklFRF9DQVRBTE9HKSB7Ci0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlTY2hlbWFDb21iby50aGlzLnBvcHVsYXRlU2hlbWFDb21ibygpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZG9Qb3B1bGF0ZShFT2JqZWN0IG9iaikgewotCQl0aGlzLnRhYmxlID0gKElUYWJsZSkgb2JqOwotCQlpZiAodGhpcy50YWJsZSAhPSBudWxsKSB7Ci0JCQl0aGlzLnBvcHVsYXRlU2hlbWFDb21ibygpOwotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBkb1BvcHVsYXRlKCkgewotCQl0aGlzLnBvcHVsYXRlU2hlbWFDb21ibygpOwotCX0KLQotCXByb3RlY3RlZCBEYXRhYmFzZSBnZXREYXRhYmFzZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKS5nZXREYXRhYmFzZSgpOwotCX0KLQotCXByaXZhdGUgQ29ubmVjdGlvblByb2ZpbGUgZ2V0Q29ubmVjdGlvblByb2ZpbGUoKSB7Ci0JCWlmICh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlID09IG51bGwpIHsKLQkJCXRoaXMuY29ubmVjdGlvblByb2ZpbGUgPSB0aGlzLnRhYmxlLmdldEpwYVByb2plY3QoKS5jb25uZWN0aW9uUHJvZmlsZSgpOwotCQl9Ci0JCXJldHVybiB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlOwotCX0KLQotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZVNoZW1hQ29tYm8oKSB7Ci0JCWlmICh0aGlzLnRhYmxlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQl0aGlzLnBvcHVsYXRlRGVmYXVsdFNjaGVtYU5hbWUoKTsKLQkJaWYgKHRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKS5pc0Nvbm5lY3RlZCgpKSB7Ci0JCQl0aGlzLmNvbWJvLnJlbW92ZSgxLCB0aGlzLmNvbWJvLmdldEl0ZW1Db3VudCgpIC0gMSk7Ci0JCQlEYXRhYmFzZSBkYXRhYmFzZSA9IHRoaXMuZ2V0RGF0YWJhc2UoKTsKLQkJCWlmIChkYXRhYmFzZSAhPSBudWxsKSB7Ci0JCQkJSXRlcmF0b3I8U3RyaW5nPiBzY2hlbWF0YSA9IGRhdGFiYXNlLnNjaGVtYU5hbWVzKCk7Ci0JCQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IENvbGxlY3Rpb25Ub29scy5zb3J0KHNjaGVtYXRhKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCQkJdGhpcy5jb21iby5hZGQoc3RyZWFtLm5leHQoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5jb21iby5yZW1vdmUoMSwgdGhpcy5jb21iby5nZXRJdGVtQ291bnQoKSAtIDEpOwotCQl9Ci0JCXRoaXMucG9wdWxhdGVTY2hlbWFOYW1lKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVEZWZhdWx0U2NoZW1hTmFtZSgpIHsKLQkJU3RyaW5nIGRlZmF1bHRTY2hlbWFOYW1lID0gdGhpcy50YWJsZS5nZXREZWZhdWx0U2NoZW1hKCk7Ci0JCWludCBzZWxlY3Rpb25JbmRleCA9IGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCWNvbWJvLnNldEl0ZW0oMCwgTkxTLmJpbmQoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlRhYmxlQ29tcG9zaXRlX2RlZmF1bHRXaXRoT25lUGFyYW0sIGRlZmF1bHRTY2hlbWFOYW1lKSk7Ci0JCWlmIChzZWxlY3Rpb25JbmRleCA9PSAwKSB7Ci0JCQljb21iby5jbGVhclNlbGVjdGlvbigpOwotCQkJY29tYm8uc2VsZWN0KDApOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVTY2hlbWFOYW1lKCkgewotCQlpZiAodGhpcy50YWJsZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU3RyaW5nIHNjaGVtYU5hbWUgPSB0aGlzLnRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpOwotCQlTdHJpbmcgZGVmYXVsdFNjaGVtYU5hbWUgPSB0aGlzLnRhYmxlLmdldERlZmF1bHRTY2hlbWEoKTsKLQkJaWYgKCFTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHNjaGVtYU5hbWUpKSB7Ci0JCQlpZiAoIXRoaXMuY29tYm8uZ2V0VGV4dCgpLmVxdWFscyhzY2hlbWFOYW1lKSkgewotCQkJCXRoaXMuY29tYm8uc2V0VGV4dChzY2hlbWFOYW1lKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWlmICghdGhpcy5jb21iby5nZXRUZXh0KCkuZXF1YWxzKE5MUy5iaW5kKEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5UYWJsZUNvbXBvc2l0ZV9kZWZhdWx0V2l0aE9uZVBhcmFtLCBkZWZhdWx0U2NoZW1hTmFtZSkpKSB7Ci0JCQkJdGhpcy5jb21iby5zZWxlY3QoMCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgQ0NvbWJvIGdldENvbWJvKCkgewotCQlyZXR1cm4gdGhpcy5jb21ibzsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCkgewotCQlyZXR1cm4gZ2V0Q29tYm8oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU2NoZW1hIGdldFRhYmxlU2NoZW1hKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZSgpLmdldERhdGFiYXNlKCkuc2NoZW1hTmFtZWQodGFibGUuZ2V0U2NoZW1hKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZUxpc3RlbmVycygpIHsKLQkJaWYgKHRoaXMudGFibGUgIT0gbnVsbCkgewotCQkJdGhpcy5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJCXRoaXMudGFibGUuZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMubGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTGlzdGVuZXJzKCkgewotCQlpZiAodGhpcy50YWJsZSAhPSBudWxsKSB7Ci0JCQl0aGlzLnRhYmxlLmVBZGFwdGVycygpLmFkZCh0aGlzLmxpc3RlbmVyKTsKLQkJCXRoaXMuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkQ29ubmVjdGlvbkxpc3RlbmVyKCkgewotCQl0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlKCkuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKHRoaXMuY29ubmVjdGlvbkxpc3RlbmVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKCkgewotCQl0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlKCkucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKHRoaXMuY29ubmVjdGlvbkxpc3RlbmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1NlY29uZGFyeVRhYmxlRGlhbG9nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1NlY29uZGFyeVRhYmxlRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0YmUwN2IuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9TZWNvbmRhcnlUYWJsZURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovICAgICAgICAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSUpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JU2Vjb25kYXJ5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLkNvbm5lY3Rpb25Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC5EYXRhYmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwuU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotcHVibGljIGNsYXNzIFNlY29uZGFyeVRhYmxlRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLQotCS8vaWYgY3JlYXRpbmcgYSBuZXcgSm9pbkNvbHVtbiwgdGhpcyB3aWxsIGJlIG51bGwsIAotCS8vc3BlY2lmeSB0aGUgSm9pbkNvbHVtbk93bmVyIGluc3RlYWQgaW4gdGhlIGFwcHJvcHJpYXRlIGNvbnN0cnV0b3IKLQlwcml2YXRlIElTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZTsKLQlwcml2YXRlIElFbnRpdHkgZW50aXR5OwotCQotCXByb3RlY3RlZCBDb21ibyBuYW1lQ29tYm87Ci0JcHJvdGVjdGVkIENvbWJvIGNhdGFsb2dDb21ibzsKLQlwcm90ZWN0ZWQgQ29tYm8gc2NoZW1hQ29tYm87Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgc2VsZWN0ZWROYW1lOwotCXByaXZhdGUgU3RyaW5nIHNlbGVjdGVkU2NoZW1hOwotCXByaXZhdGUgU3RyaW5nIHNlbGVjdGVkQ2F0YWxvZzsKLQkKLQlwcml2YXRlIGJvb2xlYW4gZGVmYXVsdFNjaGVtYVNlbGVjdGVkOwotCXByaXZhdGUgYm9vbGVhbiBkZWZhdWx0Q2F0YWxvZ1NlbGVjdGVkOwotCQotCVNlY29uZGFyeVRhYmxlRGlhbG9nKFNoZWxsIHBhcmVudCwgSUVudGl0eSBlbnRpdHkpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5lbnRpdHkgPSBlbnRpdHk7Ci0JfQotCi0JU2Vjb25kYXJ5VGFibGVEaWFsb2coU2hlbGwgcGFyZW50LCBJU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUsIElFbnRpdHkgZW50aXR5KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuc2Vjb25kYXJ5VGFibGUgPSBzZWNvbmRhcnlUYWJsZTsKLQkJdGhpcy5lbnRpdHkgPSBlbnRpdHk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIHNoZWxsKSB7Ci0JCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKHNoZWxsKTsKLQkJc2hlbGwuc2V0VGV4dChnZXRUaXRsZSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUaXRsZSgpIHsKLQkJcmV0dXJuIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5TZWNvbmRhcnlUYWJsZURpYWxvZ19lZGl0U2Vjb25kYXJ5VGFibGU7Ci0JfQotCQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSAoR3JpZExheW91dCkgY29tcG9zaXRlLmdldExheW91dCgpOwotCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQkKLQkJTGFiZWwgbmFtZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULkxFRlQpOwotCQluYW1lTGFiZWwuc2V0VGV4dChKcHRVaU1hcHBpbmdzTWVzc2FnZXMuU2Vjb25kYXJ5VGFibGVEaWFsb2dfbmFtZSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCW5hbWVMYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCi0JCXRoaXMubmFtZUNvbWJvID0gbmV3IENvbWJvKGNvbXBvc2l0ZSwgU1dULkxFRlQpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQl0aGlzLm5hbWVDb21iby5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJcG9wdWxhdGVOYW1lQ29tYm8oKTsKLQkKLQkJTGFiZWwgY2F0YWxvZ0xhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULkxFRlQpOwotCQljYXRhbG9nTGFiZWwuc2V0VGV4dChKcHRVaU1hcHBpbmdzTWVzc2FnZXMuU2Vjb25kYXJ5VGFibGVEaWFsb2dfY2F0YWxvZyk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWNhdGFsb2dMYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCi0JCXRoaXMuY2F0YWxvZ0NvbWJvID0gbmV3IENvbWJvKGNvbXBvc2l0ZSwgU1dULkxFRlQpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQl0aGlzLmNhdGFsb2dDb21iby5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJcG9wdWxhdGVDYXRhbG9nQ29tYm8oKTsKLQotCQlMYWJlbCBzY2hlbWFMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5MRUZUKTsKLQkJc2NoZW1hTGFiZWwuc2V0VGV4dChKcHRVaU1hcHBpbmdzTWVzc2FnZXMuU2Vjb25kYXJ5VGFibGVEaWFsb2dfc2NoZW1hKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJc2NoZW1hTGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQotCQl0aGlzLnNjaGVtYUNvbWJvID0gbmV3IENvbWJvKGNvbXBvc2l0ZSwgU1dULkxFRlQpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQl0aGlzLnNjaGVtYUNvbWJvLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlwb3B1bGF0ZVNjaGVtYUNvbWJvKCk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIERhdGFiYXNlIGdldERhdGFiYXNlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZSgpLmdldERhdGFiYXNlKCk7Ci0JfQotCQotCXByaXZhdGUgQ29ubmVjdGlvblByb2ZpbGUgZ2V0Q29ubmVjdGlvblByb2ZpbGUoKSB7Ci0JCUlKcGFQcm9qZWN0IHByb2plY3QgPSAodGhpcy5zZWNvbmRhcnlUYWJsZSA9PSBudWxsKSA/IHRoaXMuZW50aXR5LmdldEpwYVByb2plY3QoKSA6IHRoaXMuc2Vjb25kYXJ5VGFibGUuZ2V0SnBhUHJvamVjdCgpOwotCQlyZXR1cm4gcHJvamVjdC5jb25uZWN0aW9uUHJvZmlsZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU2NoZW1hIGdldFRhYmxlU2NoZW1hKCkgewotCQlEYXRhYmFzZSBkYXRhYmFzZSA9IHRoaXMuZ2V0RGF0YWJhc2UoKTsKLQkJaWYgKGRhdGFiYXNlICE9IG51bGwpIHsKLQkJCWlmICh0aGlzLnNlY29uZGFyeVRhYmxlICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gZGF0YWJhc2Uuc2NoZW1hTmFtZWQodGhpcy5zZWNvbmRhcnlUYWJsZS5nZXRTY2hlbWEoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZGF0YWJhc2Uuc2NoZW1hTmFtZWQodGhpcy5lbnRpdHkuZ2V0VGFibGUoKS5nZXRTY2hlbWEoKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlTmFtZUNvbWJvKCkgewotCQlTY2hlbWEgc2NoZW1hID0gdGhpcy5nZXRUYWJsZVNjaGVtYSgpOwotCQlpZiAoc2NoZW1hICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yPFN0cmluZz4gdGFibGVzID0gc2NoZW1hLnRhYmxlTmFtZXMoKTsKLQkJCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSBDb2xsZWN0aW9uVG9vbHMuc29ydCggdGFibGVzKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQkJdGhpcy5uYW1lQ29tYm8uYWRkKHN0cmVhbS5uZXh0KCkpOwotCQkJfQotCQl9Ci0KLQkJaWYgKGdldFNlY29uZGFyeVRhYmxlKCkgIT0gbnVsbCkgewotCQkJaWYgKGdldFNlY29uZGFyeVRhYmxlKCkuZ2V0U3BlY2lmaWVkTmFtZSgpICE9IG51bGwpIHsKLQkJCQl0aGlzLm5hbWVDb21iby5zZXRUZXh0KGdldFNlY29uZGFyeVRhYmxlKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlU2NoZW1hQ29tYm8oKSB7Ci0JCWlmIChnZXRTZWNvbmRhcnlUYWJsZSgpICE9IG51bGwpIHsKLQkJCXRoaXMuc2NoZW1hQ29tYm8uYWRkKE5MUy5iaW5kKEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5TZWNvbmRhcnlUYWJsZURpYWxvZ19kZWZhdWx0U2NoZW1hLCBnZXRTZWNvbmRhcnlUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSkpOwotCQl9Ci0JCQotCQlEYXRhYmFzZSBkYXRhYmFzZSA9IHRoaXMuZ2V0RGF0YWJhc2UoKTsKLQkJCi0JCWlmIChkYXRhYmFzZSAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvcjxTdHJpbmc+IHNjaGVtYXRhID0gZGF0YWJhc2Uuc2NoZW1hTmFtZXMoKTsKLQkJCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSBDb2xsZWN0aW9uVG9vbHMuc29ydChzY2hlbWF0YSk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJCXRoaXMuc2NoZW1hQ29tYm8uYWRkKHN0cmVhbS5uZXh0KCkpOwotCQkJfQotCQl9Ci0KLQkJaWYgKGdldFNlY29uZGFyeVRhYmxlKCkgIT0gbnVsbCkgewotCQkJaWYgKGdldFNlY29uZGFyeVRhYmxlKCkuZ2V0U3BlY2lmaWVkU2NoZW1hKCkgIT0gbnVsbCkgewotCQkJCXRoaXMuc2NoZW1hQ29tYm8uc2V0VGV4dChnZXRTZWNvbmRhcnlUYWJsZSgpLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXRoaXMuc2NoZW1hQ29tYm8uc2VsZWN0KDApOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlQ2F0YWxvZ0NvbWJvKCkgewotCQlpZiAoZ2V0U2Vjb25kYXJ5VGFibGUoKSAhPSBudWxsKSB7Ci0JCQl0aGlzLmNhdGFsb2dDb21iby5hZGQoTkxTLmJpbmQoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlNlY29uZGFyeVRhYmxlRGlhbG9nX2RlZmF1bHRDYXRhbG9nLCBnZXRTZWNvbmRhcnlUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpKTsKLQkJfQotCQlEYXRhYmFzZSBkYXRhYmFzZSA9IHRoaXMuZ2V0RGF0YWJhc2UoKTsKLQkJCi0JCWlmIChkYXRhYmFzZSAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvcjxTdHJpbmc+IGNhdGFsb2dzID0gZGF0YWJhc2UuY2F0YWxvZ05hbWVzKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gQ29sbGVjdGlvblRvb2xzLnNvcnQoY2F0YWxvZ3MpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCQl0aGlzLmNhdGFsb2dDb21iby5hZGQoc3RyZWFtLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZ2V0U2Vjb25kYXJ5VGFibGUoKSAhPSBudWxsKSB7Ci0JCQlpZiAoZ2V0U2Vjb25kYXJ5VGFibGUoKS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkgIT0gbnVsbCkgewotCQkJCXRoaXMuY2F0YWxvZ0NvbWJvLnNldFRleHQoZ2V0U2Vjb25kYXJ5VGFibGUoKS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGhpcy5jYXRhbG9nQ29tYm8uc2VsZWN0KDApOwotCQkJfQotCQl9Ci0JfQkKLQkKLQlwcm90ZWN0ZWQgQ29tYm8gZ2V0TmFtZUNvbWJvKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lQ29tYm87Ci0JfQotCQotCXByb3RlY3RlZCBDb21ibyBnZXRTY2hlbWFDb21ibygpIHsKLQkJcmV0dXJuIHRoaXMuc2NoZW1hQ29tYm87Ci0JfQotCQotCXByb3RlY3RlZCBDb21ibyBnZXRDYXRhbG9nQ29tYm8oKSB7Ci0JCXJldHVybiB0aGlzLmNhdGFsb2dDb21ibzsKLQl9Ci0JCi0JcHJvdGVjdGVkIElTZWNvbmRhcnlUYWJsZSBnZXRTZWNvbmRhcnlUYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuc2Vjb25kYXJ5VGFibGU7Ci0JfQotCQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5zZWxlY3RlZE5hbWU7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRDYXRhbG9nKCkgewotCQlyZXR1cm4gdGhpcy5zZWxlY3RlZENhdGFsb2c7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRTY2hlbWEoKSB7Ci0JCXJldHVybiB0aGlzLnNlbGVjdGVkU2NoZW1hOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0RlZmF1bHRTY2hlbWFTZWxlY3RlZCgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFNjaGVtYVNlbGVjdGVkOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0RlZmF1bHRDYXRhbG9nU2VsZWN0ZWQoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRDYXRhbG9nU2VsZWN0ZWQ7Ci0JfQotCQkKLQlwdWJsaWMgYm9vbGVhbiBjbG9zZSgpIHsKLQkJdGhpcy5zZWxlY3RlZE5hbWUgPSB0aGlzLm5hbWVDb21iby5nZXRUZXh0KCk7Ci0JCXRoaXMuc2VsZWN0ZWRTY2hlbWEgPSB0aGlzLnNjaGVtYUNvbWJvLmdldFRleHQoKTsKLQkJaWYgKHRoaXMuc2VsZWN0ZWRTY2hlbWEuZXF1YWxzKCIiKSkgewotCQkJdGhpcy5zZWxlY3RlZFNjaGVtYSA9IG51bGw7Ci0JCX0KLQkJdGhpcy5zZWxlY3RlZENhdGFsb2cgPSB0aGlzLmNhdGFsb2dDb21iby5nZXRUZXh0KCk7Ci0JCWlmICh0aGlzLnNlbGVjdGVkQ2F0YWxvZy5lcXVhbHMoIiIpKSB7Ci0JCQl0aGlzLnNlbGVjdGVkQ2F0YWxvZyA9IG51bGw7Ci0JCX0KLQkJdGhpcy5kZWZhdWx0U2NoZW1hU2VsZWN0ZWQgPSB0aGlzLnNjaGVtYUNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkgPT0gMDsKLQkJdGhpcy5kZWZhdWx0Q2F0YWxvZ1NlbGVjdGVkID0gdGhpcy5jYXRhbG9nQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSA9PSAwOwotCQlyZXR1cm4gc3VwZXIuY2xvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1NlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9TZWNvbmRhcnlUYWJsZXNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZmMTQ5ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1NlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MaXN0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSVNlY29uZGFyeVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5KcGFDb3JlTWFwcGluZ3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkJhc2VKcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci0KLS8vVE9ETyBoYW5kbGUgeG1sLCBob3cgdG8gaGFuZGxlIHZpcnR1YWwgc2Vjb25kYXJ5VGFibGVzLCBhZGRpbmcgdGhlbSB0byB4bWwsIGFyZSB0aGV5IG92ZXJyaWRlbiwgZXRjPz8KLXB1YmxpYyBjbGFzcyBTZWNvbmRhcnlUYWJsZXNDb21wb3NpdGUgZXh0ZW5kcyBCYXNlSnBhQ29tcG9zaXRlIAotewotCXByaXZhdGUgSUVudGl0eSBlbnRpdHk7Ci0JcHJpdmF0ZSBmaW5hbCBBZGFwdGVyIGVudGl0eUxpc3RlbmVyOwotCXByaXZhdGUgZmluYWwgQWRhcHRlciBzZWNvbmRhcnlUYWJsZUxpc3RlbmVyOwotCQotCUxpc3RWaWV3ZXIgc2Vjb25kYXJ5VGFibGVzTGlzdFZpZXdlcjsKLQotCXByaXZhdGUgQnV0dG9uIGFkZEJ1dHRvbjsKLQlwcml2YXRlIEJ1dHRvbiBlZGl0QnV0dG9uOwotCXByaXZhdGUgQnV0dG9uIHJlbW92ZUJ1dHRvbjsKLQkKLQlwcml2YXRlIFByaW1hcnlLZXlKb2luQ29sdW1uc0luU2Vjb25kYXJ5VGFibGVDb21wb3NpdGUgcGtKb2luQ29sdW1uc0NvbXBvc2l0ZTsKLQkKLQlwdWJsaWMgU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIENvbW1hbmRTdGFjayBjb21tYW5kU3RhY2ssIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJc3VwZXIocGFyZW50LCBTV1QuTlVMTCwgY29tbWFuZFN0YWNrLCB3aWRnZXRGYWN0b3J5KTsKLQkJdGhpcy5lbnRpdHlMaXN0ZW5lciA9IGJ1aWxkRW50aXR5TGlzdGVuZXIoKTsKLQkJdGhpcy5zZWNvbmRhcnlUYWJsZUxpc3RlbmVyID0gYnVpbGRTZWNvbmRhcnlUYWJsZUxpc3RlbmVyKCk7Ci0JfQotCQotCXByaXZhdGUgQWRhcHRlciBidWlsZEVudGl0eUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IEFkYXB0ZXJJbXBsKCkgewotCQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCQkJZW50aXR5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIEFkYXB0ZXIgYnVpbGRTZWNvbmRhcnlUYWJsZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IEFkYXB0ZXJJbXBsKCkgewotCQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCQkJc2VvbmNhcnlUYWJsZUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQotCQlHcmlkRGF0YSBncmlkRGF0YSA9ICBuZXcgR3JpZERhdGEoKTsKLQkJCi0JCUNvbXBvc2l0ZSBzZWNvbmRhcnlUYWJsZXNDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgzLCBmYWxzZSk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCXNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJZ3JpZERhdGEgPSAgbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCXNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkKLQkJdGhpcy5zZWNvbmRhcnlUYWJsZXNMaXN0Vmlld2VyID0gYnVpbGRTZWNvbmRhcnlUYWJsZXNMaXN0Vmlld2VyKHNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZSk7Ci0JCWdyaWREYXRhID0gIG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCXRoaXMuc2Vjb25kYXJ5VGFibGVzTGlzdFZpZXdlci5nZXRMaXN0KCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCS8vUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0aGlzLnNlY29uZGFyeVRhYmxlc0xpc3RWaWV3ZXIuZ2V0TGlzdCgpLCBJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19KT0lOX1RBQkxFX0NPTFVNTlMpOwotCQkKLQkJQ29tcG9zaXRlIGJ1dHRvbnNDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgzLCBmYWxzZSk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWJ1dHRvbnNDb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWdyaWREYXRhID0gIG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkVORDsKLQkJYnV0dG9uc0NvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCi0JCXRoaXMuYWRkQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25zQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXRoaXMuYWRkQnV0dG9uLnNldFRleHQoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZV9hZGQpOwotCQlncmlkRGF0YSA9ICBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCXRoaXMuYWRkQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl0aGlzLmFkZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCS8vIGRvIG5vdGhpbmcKLQkJCX0KLQkJCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJYWRkU2Vjb25kYXJ5VGFibGUoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQl0aGlzLmVkaXRCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbnNDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJdGhpcy5lZGl0QnV0dG9uLnNldFRleHQoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZV9lZGl0KTsKLQkJZ3JpZERhdGEgPSAgbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQl0aGlzLmVkaXRCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXRoaXMuZWRpdEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCS8vIGRvIG5vdGhpbmcKLQkJCX0KLQkJCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZWRpdFNlY29uZGFyeVRhYmxlKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCXRoaXMucmVtb3ZlQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25zQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXRoaXMucmVtb3ZlQnV0dG9uLnNldFRleHQoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZV9yZW1vdmUpOwotCQlncmlkRGF0YSA9ICBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuQkVHSU5OSU5HOwotCQl0aGlzLnJlbW92ZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJdGhpcy5yZW1vdmVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkvLyBkbyBub3RoaW5nCi0JCQl9Ci0JCQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXJlbW92ZVNlY29uZGFyeVRhYmxlKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJdGhpcy5wa0pvaW5Db2x1bW5zQ29tcG9zaXRlID0gbmV3IFByaW1hcnlLZXlKb2luQ29sdW1uc0luU2Vjb25kYXJ5VGFibGVDb21wb3NpdGUoY29tcG9zaXRlLCB0aGlzLmNvbW1hbmRTdGFjaywgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQkJZ3JpZERhdGEgPSAgbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCXRoaXMucGtKb2luQ29sdW1uc0NvbXBvc2l0ZS5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JfQotCQotCXByaXZhdGUgTGlzdFZpZXdlciBidWlsZFNlY29uZGFyeVRhYmxlc0xpc3RWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlMaXN0Vmlld2VyIGxpc3RWaWV3ZXIgPSBuZXcgTGlzdFZpZXdlcihwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJbGlzdFZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGJ1aWxkU2Vjb25kYXJ5VGFibGVzTGlzdExhYmVsUHJvdmlkZXIoKSk7Ci0JCWxpc3RWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGJ1aWxkU2Vjb25kYXJ5VGFibGVzTGlzdENvbnRlbnRQcm92aWRlcigpKTsKLQkJCi0JCWxpc3RWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQl1cGRhdGVFbmFibGVtZW50KCk7Ci0JCQkJc2Vjb25kYXJ5VGFibGVzTGlzdFNlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQl9KTsKLQotCQlyZXR1cm4gbGlzdFZpZXdlcjsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2Vjb25kYXJ5VGFibGVzTGlzdFNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCWlmICgoKFN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpKS5pc0VtcHR5KCkpIHsKLQkJCXRoaXMucGtKb2luQ29sdW1uc0NvbXBvc2l0ZS5wb3B1bGF0ZShudWxsKTsKLQkJCXRoaXMucGtKb2luQ29sdW1uc0NvbXBvc2l0ZS5lbmFibGVXaWRnZXRzKGZhbHNlKTsKLQkJfQotCQllbHNlIHsKLQkJCUlTZWNvbmRhcnlUYWJsZSBzZWxlY3RlZFNlY29uZGFyeVRhYmxlID0gZ2V0U2VsZWN0ZWRTZWNvbmRhcnlUYWJsZSgpOwotCQkJdGhpcy5wa0pvaW5Db2x1bW5zQ29tcG9zaXRlLnBvcHVsYXRlKHNlbGVjdGVkU2Vjb25kYXJ5VGFibGUpOwotCQkJdGhpcy5wa0pvaW5Db2x1bW5zQ29tcG9zaXRlLmVuYWJsZVdpZGdldHModHJ1ZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIElDb250ZW50UHJvdmlkZXIgYnVpbGRTZWNvbmRhcnlUYWJsZXNMaXN0Q29udGVudFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyKCl7Ci0JCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJCQkvLyBkbyBub3RoaW5nCi0JCQl9Ci0JCQotCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCQkvLyBkbyBub3RoaW5nCi0JCQl9Ci0JCQotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gKChJRW50aXR5KSBpbnB1dEVsZW1lbnQpLmdldFNlY29uZGFyeVRhYmxlcygpLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBidWlsZFNlY29uZGFyeVRhYmxlc0xpc3RMYWJlbFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQkvL1RPRE8gZGlzcGxheSBhIHF1YWxpZmllZCBuYW1lIGluc3RlYWQKLQkJCQlJU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUgPSAoSVNlY29uZGFyeVRhYmxlKSBlbGVtZW50OwotCQkJCXJldHVybiBzZWNvbmRhcnlUYWJsZS5nZXROYW1lKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXZvaWQgYWRkU2Vjb25kYXJ5VGFibGUoKSB7Ci0JCVNlY29uZGFyeVRhYmxlRGlhbG9nIGRpYWxvZyA9IG5ldyBTZWNvbmRhcnlUYWJsZURpYWxvZyh0aGlzLmdldENvbnRyb2woKS5nZXRTaGVsbCgpLCB0aGlzLmVudGl0eSk7Ci0JCWFkZFNlY29uZGFyeVRhYmxlRnJvbURpYWxvZyhkaWFsb2cpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkU2Vjb25kYXJ5VGFibGVGcm9tRGlhbG9nKFNlY29uZGFyeVRhYmxlRGlhbG9nIGRpYWxvZykgewotCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCWludCBpbmRleCA9IHRoaXMuZW50aXR5LmdldFNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLnNpemUoKTsKLQkJCVN0cmluZyBuYW1lID0gZGlhbG9nLmdldFNlbGVjdGVkTmFtZSgpOwotCQkJU3RyaW5nIGNhdGFsb2cgPSBkaWFsb2cuZ2V0U2VsZWN0ZWRDYXRhbG9nKCk7Ci0JCQlTdHJpbmcgc2NoZW1hID0gZGlhbG9nLmdldFNlbGVjdGVkU2NoZW1hKCk7Ci0JCQlJU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUgPSB0aGlzLmVudGl0eS5jcmVhdGVTZWNvbmRhcnlUYWJsZShpbmRleCk7Ci0JCQl0aGlzLmVudGl0eS5nZXRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKS5hZGQoc2Vjb25kYXJ5VGFibGUpOwotCQkJc2Vjb25kYXJ5VGFibGUuc2V0U3BlY2lmaWVkTmFtZShuYW1lKTsKLQkJCXNlY29uZGFyeVRhYmxlLnNldFNwZWNpZmllZENhdGFsb2coY2F0YWxvZyk7Ci0JCQlzZWNvbmRhcnlUYWJsZS5zZXRTcGVjaWZpZWRTY2hlbWEoc2NoZW1hKTsKLQkJCQotCQkJdGhpcy5zZWNvbmRhcnlUYWJsZXNMaXN0Vmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzZWNvbmRhcnlUYWJsZSkpOwotCQl9Ci0JfQotCQotCXZvaWQgZWRpdFNlY29uZGFyeVRhYmxlKCkgewotCQlJU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUgPSBnZXRTZWxlY3RlZFNlY29uZGFyeVRhYmxlKCk7Ci0JCVNlY29uZGFyeVRhYmxlRGlhbG9nIGRpYWxvZyA9IG5ldyBTZWNvbmRhcnlUYWJsZURpYWxvZyh0aGlzLmdldENvbnRyb2woKS5nZXRTaGVsbCgpLCBzZWNvbmRhcnlUYWJsZSwgdGhpcy5lbnRpdHkpOwotCQllZGl0U2Vjb25kYXJ5VGFibGVGcm9tRGlhbG9nKGRpYWxvZywgc2Vjb25kYXJ5VGFibGUpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgZWRpdFNlY29uZGFyeVRhYmxlRnJvbURpYWxvZyhTZWNvbmRhcnlUYWJsZURpYWxvZyBkaWFsb2csIElTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSkgewotCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCWVkaXRTZWNvbmRhcnlUYWJsZURpYWxvZ09rZChkaWFsb2csIHNlY29uZGFyeVRhYmxlKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgZWRpdFNlY29uZGFyeVRhYmxlRGlhbG9nT2tkKFNlY29uZGFyeVRhYmxlRGlhbG9nIGRpYWxvZywgSVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlKSB7Ci0JCVN0cmluZyBuYW1lID0gZGlhbG9nLmdldFNlbGVjdGVkTmFtZSgpOwotCQlTdHJpbmcgY2F0YWxvZyA9IGRpYWxvZy5nZXRTZWxlY3RlZENhdGFsb2coKTsKLQkJU3RyaW5nIHNjaGVtYSA9IGRpYWxvZy5nZXRTZWxlY3RlZFNjaGVtYSgpOwotCi0JCWlmIChzZWNvbmRhcnlUYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkgPT0gbnVsbCB8fCAhc2Vjb25kYXJ5VGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpLmVxdWFscyhuYW1lKSl7Ci0JCQlzZWNvbmRhcnlUYWJsZS5zZXRTcGVjaWZpZWROYW1lKG5hbWUpOwotCQl9Ci0JCQotCQlpZiAoZGlhbG9nLmlzRGVmYXVsdENhdGFsb2dTZWxlY3RlZCgpKSB7Ci0JCQlpZiAoc2Vjb25kYXJ5VGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpICE9IG51bGwpIHsKLQkJCQlzZWNvbmRhcnlUYWJsZS5zZXRTcGVjaWZpZWRDYXRhbG9nKG51bGwpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHNlY29uZGFyeVRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSA9PSBudWxsIHx8ICFzZWNvbmRhcnlUYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkuZXF1YWxzKGNhdGFsb2cpKXsKLQkJCXNlY29uZGFyeVRhYmxlLnNldFNwZWNpZmllZENhdGFsb2coY2F0YWxvZyk7Ci0JCX0KLQkJCi0JCWlmIChkaWFsb2cuaXNEZWZhdWx0U2NoZW1hU2VsZWN0ZWQoKSkgewotCQkJaWYgKHNlY29uZGFyeVRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpICE9IG51bGwpIHsKLQkJCQlzZWNvbmRhcnlUYWJsZS5zZXRTcGVjaWZpZWRTY2hlbWEobnVsbCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoc2Vjb25kYXJ5VGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkgPT0gbnVsbCB8fCAhc2Vjb25kYXJ5VGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkuZXF1YWxzKHNjaGVtYSkpewotCQkJc2Vjb25kYXJ5VGFibGUuc2V0U3BlY2lmaWVkU2NoZW1hKHNjaGVtYSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIElTZWNvbmRhcnlUYWJsZSBnZXRTZWxlY3RlZFNlY29uZGFyeVRhYmxlKCkgewotCQlyZXR1cm4gKElTZWNvbmRhcnlUYWJsZSkgKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0aGlzLnNlY29uZGFyeVRhYmxlc0xpc3RWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCX0KLQotCQotCXZvaWQgcmVtb3ZlU2Vjb25kYXJ5VGFibGUoKSB7Ci0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gdGhpcy5zZWNvbmRhcnlUYWJsZXNMaXN0Vmlld2VyLmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJZm9yIChJdGVyYXRvcjxJU2Vjb25kYXJ5VGFibGU+IGkgPSAoKFN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgewotCQkJCXRoaXMuZW50aXR5LmdldFNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLnJlbW92ZShpLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0Jdm9pZCB1cGRhdGVFbmFibGVtZW50KCkgewotCQl0aGlzLmVkaXRCdXR0b24uc2V0RW5hYmxlZCghKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0aGlzLnNlY29uZGFyeVRhYmxlc0xpc3RWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmlzRW1wdHkoKSk7Ci0JCXRoaXMucmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQoISgoU3RydWN0dXJlZFNlbGVjdGlvbikgdGhpcy5zZWNvbmRhcnlUYWJsZXNMaXN0Vmlld2VyLmdldFNlbGVjdGlvbigpKS5pc0VtcHR5KCkpOwotCX0JCi0JCi0JcHVibGljIHZvaWQgZG9Qb3B1bGF0ZShFT2JqZWN0IG9iaikgewotCQl0aGlzLmVudGl0eSA9IChJRW50aXR5KSBvYmo7Ci0JCWlmICh0aGlzLmVudGl0eSA9PSBudWxsKSB7Ci0JCQl0aGlzLnNlY29uZGFyeVRhYmxlc0xpc3RWaWV3ZXIuc2V0SW5wdXQobnVsbCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXRoaXMuc2Vjb25kYXJ5VGFibGVzTGlzdFZpZXdlci5zZXRJbnB1dCh0aGlzLmVudGl0eSk7Ci0JCWlmICghdGhpcy5lbnRpdHkuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuaXNFbXB0eSgpKSB7Ci0JCQl0aGlzLnNlY29uZGFyeVRhYmxlc0xpc3RWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHRoaXMuZW50aXR5LmdldFNlY29uZGFyeVRhYmxlcygpLmdldCgwKSkpOwotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5zZWNvbmRhcnlUYWJsZXNMaXN0Vmlld2VyLnNldFNlbGVjdGlvbihudWxsKTsJCQkKLQkJfQotCQl1cGRhdGVFbmFibGVtZW50KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9Qb3B1bGF0ZSgpIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VMaXN0ZW5lcnMoKSB7Ci0JCWlmICh0aGlzLmVudGl0eSAhPSBudWxsKSB7Ci0JCQl0aGlzLmVudGl0eS5lQWRhcHRlcnMoKS5hZGQodGhpcy5lbnRpdHlMaXN0ZW5lcik7Ci0JCQlmb3IgKElTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA6IHRoaXMuZW50aXR5LmdldFNlY29uZGFyeVRhYmxlcygpKSB7Ci0JCQkJc2Vjb25kYXJ5VGFibGUuZUFkYXB0ZXJzKCkuYWRkKHRoaXMuc2Vjb25kYXJ5VGFibGVMaXN0ZW5lcik7Ci0JCQl9CQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZUxpc3RlbmVycygpIHsKLQkJaWYgKHRoaXMuZW50aXR5ICE9IG51bGwpIHsKLQkJCWZvciAoSVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlIDogdGhpcy5lbnRpdHkuZ2V0U2Vjb25kYXJ5VGFibGVzKCkpIHsKLQkJCQlzZWNvbmRhcnlUYWJsZS5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcy5zZWNvbmRhcnlUYWJsZUxpc3RlbmVyKTsKLQkJCX0KLQkJCXRoaXMuZW50aXR5LmVBZGFwdGVycygpLnJlbW92ZSh0aGlzLmVudGl0eUxpc3RlbmVyKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBlbnRpdHlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJaWYgKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSUVudGl0eS5jbGFzcykgPT0gSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JRU5USVRZX19TUEVDSUZJRURfU0VDT05EQVJZX1RBQkxFUykgewotCQkJaWYgKG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uQUREKSB7Ci0JCQkJKChJU2Vjb25kYXJ5VGFibGUpIG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpKS5lQWRhcHRlcnMoKS5hZGQodGhpcy5zZWNvbmRhcnlUYWJsZUxpc3RlbmVyKTsKLQkJCX0KLQkJCWVsc2UgaWYgKG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uUkVNT1ZFKSB7Ci0JCQkJKChJU2Vjb25kYXJ5VGFibGUpIG5vdGlmaWNhdGlvbi5nZXRPbGRWYWx1ZSgpKS5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcy5zZWNvbmRhcnlUYWJsZUxpc3RlbmVyKTsJCQkJCi0JCQl9Ci0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlzZWNvbmRhcnlUYWJsZXNMaXN0Vmlld2VyLnJlZnJlc2goKTsKLQkJCQkJdXBkYXRlRW5hYmxlbWVudCgpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2VvbmNhcnlUYWJsZUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlpZiAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChJVGFibGUuY2xhc3MpID09IEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSVRBQkxFX19TUEVDSUZJRURfTkFNRQotCQkJfHwgbm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChJVGFibGUuY2xhc3MpID09IEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSVRBQkxFX19TUEVDSUZJRURfQ0FUQUxPRwotCQkJfHwgbm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChJVGFibGUuY2xhc3MpID09IEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSVRBQkxFX19TUEVDSUZJRURfU0NIRU1BCi0JCQl8fCBub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKElUYWJsZS5jbGFzcykgPT0gSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JVEFCTEVfX0RFRkFVTFRfQ0FUQUxPRwotCQkJfHwgbm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChJVGFibGUuY2xhc3MpID09IEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSVRBQkxFX19ERUZBVUxUX1NDSEVNQSkgewotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChnZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJc2Vjb25kYXJ5VGFibGVzTGlzdFZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1NlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1NlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliZTU0YzMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9TZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JSWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSVNlcXVlbmNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLkpwYUNvcmVNYXBwaW5nc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLkNvbm5lY3Rpb25Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5JSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSVdvcmtiZW5jaEhlbHBTeXN0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci0KLS8qKgotICogU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIFNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlIGV4dGVuZHMgR2VuZXJhdG9yQ29tcG9zaXRlPElTZXF1ZW5jZUdlbmVyYXRvcj4KLXsKLQlwcml2YXRlIENDb21ibyBzZXF1ZW5jZU5hbWVDb21ibzsKLQotCXByaXZhdGUgTW9kaWZ5TGlzdGVuZXIgc2VxdWVuY2VOYW1lQ29tYm9MaXN0ZW5lcjsKLQotCXByaXZhdGUgQ29ubmVjdGlvblByb2ZpbGUgY29ubmVjdGlvblByb2ZpbGU7Ci0KLQlwdWJsaWMgU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjaywgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlzdXBlcihwYXJlbnQsIGNvbW1hbmRTdGFjaywgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JcHJvdGVjdGVkIElTZXF1ZW5jZUdlbmVyYXRvciBjcmVhdGVHZW5lcmF0b3IoKSB7Ci0JCUlTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvciA9IGlkTWFwcGluZygpLmNyZWF0ZVNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCWlkTWFwcGluZygpLnNldFNlcXVlbmNlR2VuZXJhdG9yKHNlcXVlbmNlR2VuZXJhdG9yKTsKLQkJcmV0dXJuIHNlcXVlbmNlR2VuZXJhdG9yOwotCX0KLQkKLQlwcm90ZWN0ZWQgSVNlcXVlbmNlR2VuZXJhdG9yIGdlbmVyYXRvcihJSWQgaWRNYXBwaW5nKSB7Ci0JCXJldHVybiBpZE1hcHBpbmcuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJSVdvcmtiZW5jaEhlbHBTeXN0ZW0gaGVscFN5c3RlbSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpOwotCQkKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlX25hbWUpOwotCQkKLQkJdGhpcy5uYW1lVGV4dFdpZGdldCA9IGJ1aWxkTmFtZVRleHQoY29tcG9zaXRlKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQl0aGlzLm5hbWVUZXh0V2lkZ2V0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQloZWxwU3lzdGVtLnNldEhlbHAodGhpcy5uYW1lVGV4dFdpZGdldCwgSUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfU0VRVUVOQ0VfR0VORVJBVE9SX05BTUUpOwotCQkKLQkJZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlX3NlcXVlbmNlKTsKLQkJCi0JCXRoaXMuc2VxdWVuY2VOYW1lQ29tYm8gPSBidWlsZFNlcXVlbmNlTmFtZUNvbWJvKGNvbXBvc2l0ZSk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJdGhpcy5zZXF1ZW5jZU5hbWVDb21iby5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJaGVscFN5c3RlbS5zZXRIZWxwKHNlcXVlbmNlTmFtZUNvbWJvLCBJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19TRVFVRU5DRV9HRU5FUkFUT1JfU0VRVUVOQ0UpOwotCX0KLQotCXByaXZhdGUgQ0NvbWJvIGJ1aWxkU2VxdWVuY2VOYW1lQ29tYm8oQ29tcG9zaXRlIHBhcmVudCkgewotCQlDQ29tYm8gY29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKHBhcmVudCwgU1dULkZMQVQpOwotCQljb21iby5hZGQoIiIpOyAvLyROT04tTkxTLTEkCi0JCWNvbWJvLnNlbGVjdCgwKTsKLQkJY29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIoZ2V0U2VxdWVuY2VOYW1lTGlzdGVuZXIoKSk7Ci0JCXJldHVybiBjb21ibzsKLQl9Ci0KLQlwcml2YXRlIE1vZGlmeUxpc3RlbmVyIGdldFNlcXVlbmNlTmFtZUxpc3RlbmVyKCkgewotCQlpZiAodGhpcy5zZXF1ZW5jZU5hbWVDb21ib0xpc3RlbmVyID09IG51bGwpIHsKLQkJCXRoaXMuc2VxdWVuY2VOYW1lQ29tYm9MaXN0ZW5lciA9IG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQkJaWYgKGlzUG9wdWxhdGluZygpKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJU3RyaW5nIHRleHQgPSAoKENDb21ibykgZS5nZXRTb3VyY2UoKSkuZ2V0VGV4dCgpOwotCQkJCQlpZiAodGV4dCAhPSBudWxsICYmIHNlcXVlbmNlTmFtZUNvbWJvLmdldEl0ZW1Db3VudCgpID4gMCAmJiB0ZXh0LmVxdWFscyhzZXF1ZW5jZU5hbWVDb21iby5nZXRJdGVtKDApKSkgewotCQkJCQkJdGV4dCA9IG51bGw7Ci0JCQkJCX0KLQkJCQkJSVNlcXVlbmNlR2VuZXJhdG9yIGdlbmVyYXRvciA9IGdldEdlbmVyYXRvcigpOwotCQkJCQlpZiAoZ2VuZXJhdG9yID09IG51bGwpIHsKLQkJCQkJCWdlbmVyYXRvciA9IGNyZWF0ZUdlbmVyYXRvcigpOwotCQkJCQl9Ci0JCQkJCWdlbmVyYXRvci5zZXRTcGVjaWZpZWRTZXF1ZW5jZU5hbWUodGV4dCk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlyZXR1cm4gdGhpcy5zZXF1ZW5jZU5hbWVDb21ib0xpc3RlbmVyOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGdlbmVyYXRvckNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzdXBlci5nZW5lcmF0b3JDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCWlmIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKElTZXF1ZW5jZUdlbmVyYXRvci5jbGFzcykgPT0gSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JU0VRVUVOQ0VfR0VORVJBVE9SX19TUEVDSUZJRURfU0VRVUVOQ0VfTkFNRSkgewotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChnZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJU3RyaW5nIHNlcXVlbmNlTmFtZSA9IGdldEdlbmVyYXRvcigpLmdldFNwZWNpZmllZFNlcXVlbmNlTmFtZSgpOwotCQkJCQlpZiAoc2VxdWVuY2VOYW1lID09IG51bGwpIHsKLQkJCQkJCXNlcXVlbmNlTmFtZUNvbWJvLnNlbGVjdCgwKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmICghc2VxdWVuY2VOYW1lQ29tYm8uZ2V0VGV4dCgpLmVxdWFscyhzZXF1ZW5jZU5hbWUpKSB7Ci0JCQkJCQlzZXF1ZW5jZU5hbWVDb21iby5zZXRUZXh0KHNlcXVlbmNlTmFtZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvUG9wdWxhdGUoRU9iamVjdCBvYmopIHsKLQkJc3VwZXIuZG9Qb3B1bGF0ZShvYmopOwotCQlpZiAob2JqID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlwb3B1bGF0ZVNlcXVlbmNlTmFtZUNvbWJvKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9Qb3B1bGF0ZSgpIHsKLQkJcG9wdWxhdGVTZXF1ZW5jZU5hbWVDb21ibygpOwotCX0KLQkKLQlwcml2YXRlIENvbm5lY3Rpb25Qcm9maWxlIGdldENvbm5lY3Rpb25Qcm9maWxlKCkgewotCQlpZih0aGlzLmNvbm5lY3Rpb25Qcm9maWxlID09IG51bGwpIHsKLQkJCUlKcGFQcm9qZWN0IGpwYVByb2plY3QgPSBnZXRHZW5lcmF0b3IoKS5nZXRKcGFQcm9qZWN0KCk7Ci0JCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlID0ganBhUHJvamVjdC5jb25uZWN0aW9uUHJvZmlsZSgpOwotCQl9Ci0JCXJldHVybiB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlOwotCX0KLQotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZVNlcXVlbmNlTmFtZUNvbWJvKCkgewotCQlpZiAodGhpcy5nZXRHZW5lcmF0b3IoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdGhpcy5zZXF1ZW5jZU5hbWVDb21iby5zZXRJdGVtKDAsIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5TZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZV9kZWZhdWx0KTsKLQkJaWYgKHRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKS5pc0Nvbm5lY3RlZCgpKSB7Ci0vLwkJCXRoaXMuc2VxdWVuY2VOYW1lQ29tYm8ucmVtb3ZlKDEsIHRoaXMuc2VxdWVuY2VOYW1lQ29tYm8uZ2V0SXRlbUNvdW50KCkgLSAxKTsKLS8vCQkJU2NoZW1hIHNjaGVtYSA9IGdldENvbm5lY3Rpb25Qcm9maWxlKCkuZ2V0RGF0YWJhc2UoKS5zY2hlbWFOYW1lZChnZXRHZW5lcmF0b3IoKS5nZXRKcGFQcm9qZWN0KCkuZ2V0U2NoZW1hTmFtZSgpKTsKLS8vCQkJaWYgKHNjaGVtYSAhPSBudWxsKSB7Ci0vLwkJCQlmb3IgKEl0ZXJhdG9yIHN0cmVhbSA9IENvbGxlY3Rpb25Ub29scy5zb3J0KHNjaGVtYS5zZXF1ZW5jZU5hbWVzKCkpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotLy8JCQkJCXRoaXMuc2VxdWVuY2VOYW1lQ29tYm8uYWRkKChTdHJpbmcpIHN0cmVhbS5uZXh0KCkpOwotLy8JCQkJfQotLy8JCQl9Ci0JCX0KLQkJU3RyaW5nIHNlcXVlbmNlTmFtZSA9IHRoaXMuZ2V0R2VuZXJhdG9yKCkuZ2V0U3BlY2lmaWVkU2VxdWVuY2VOYW1lKCk7Ci0JCWlmIChzZXF1ZW5jZU5hbWUgIT0gbnVsbCkgewotCQkJaWYgKCF0aGlzLnNlcXVlbmNlTmFtZUNvbWJvLmdldFRleHQoKS5lcXVhbHMoc2VxdWVuY2VOYW1lKSkgewotCQkJCXRoaXMuc2VxdWVuY2VOYW1lQ29tYm8uc2V0VGV4dChzZXF1ZW5jZU5hbWUpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5zZXF1ZW5jZU5hbWVDb21iby5zZWxlY3QoMCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjbGVhcigpIHsKLQkJc3VwZXIuY2xlYXIoKTsKLQkJdGhpcy5zZXF1ZW5jZU5hbWVDb21iby5zZWxlY3QoMCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvU3RyaW5nV2l0aERlZmF1bHRDaG9vc2VyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1N0cmluZ1dpdGhEZWZhdWx0Q2hvb3Nlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2M3NjI0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvU3RyaW5nV2l0aERlZmF1bHRDaG9vc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkJhc2VKcGFDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkNDb21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgU3RyaW5nV2l0aERlZmF1bHRDaG9vc2VyIGV4dGVuZHMgQmFzZUpwYUNvbnRyb2xsZXIKLXsKLQlwcml2YXRlIFN0cmluZ0hvbGRlciBzdHJpbmdIb2xkZXI7Ci0JcHJpdmF0ZSBBZGFwdGVyIHN0cmluZ0hvbGRlckxpc3RlbmVyOwotCQotCXByaXZhdGUgQ0NvbWJvVmlld2VyIGNvbWJvVmlld2VyOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFQgPSAiZGVmYXVsdCI7Ci0JCi0JCi0JcHVibGljIFN0cmluZ1dpdGhEZWZhdWx0Q2hvb3NlcihDb21wb3NpdGUgcGFyZW50LCBDb21tYW5kU3RhY2sgdGhlQ29tbWFuZFN0YWNrLCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXN1cGVyKHBhcmVudCwgdGhlQ29tbWFuZFN0YWNrLCB3aWRnZXRGYWN0b3J5KTsKLQkJYnVpbGRTdHJpbmdIb2xkZXJMaXN0ZW5lcigpOwotCX0KLQkKLQkKLQlwcml2YXRlIHZvaWQgYnVpbGRTdHJpbmdIb2xkZXJMaXN0ZW5lcigpIHsKLQkJdGhpcy5zdHJpbmdIb2xkZXJMaXN0ZW5lciA9IG5ldyBBZGFwdGVySW1wbCgpIHsKLQkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkJCXN0cmluZ0hvbGRlckNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYnVpbGRXaWRnZXQoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDQ29tYm8gY29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKHBhcmVudCwgU1dULkZMQVQpOwotCQl0aGlzLmNvbWJvVmlld2VyID0gbmV3IENDb21ib1ZpZXdlcihjb21ibyk7Ci0JCXRoaXMuY29tYm9WaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGJ1aWxkQ29udGVudFByb3ZpZGVyKCkpOwotCQl0aGlzLmNvbWJvVmlld2VyLnNldExhYmVsUHJvdmlkZXIoYnVpbGRMYWJlbFByb3ZpZGVyKCkpOwotCQkKLQkJdGhpcy5jb21ib1ZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCVN0cmluZ1dpdGhEZWZhdWx0Q2hvb3Nlci50aGlzLnNlbGVjdGlvbkNoYW5nZWQoZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOwotCQkJfQotCQl9KTsKLQkJCi0JCWNvbWJvLmFkZE1vZGlmeUxpc3RlbmVyKAotCQkJbmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCQljb21ib01vZGlmaWVkKGUpOwotCQkJCX0KLQkJCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb250ZW50UHJvdmlkZXIgYnVpbGRDb250ZW50UHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIoKXsKLQkJCi0JCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJCX0KLQkJCi0JCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJfQotCQkKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7REVGQVVMVH07Ci0JCQl9Ci0JCX07Ci0JfQotCQotCQotCXByaXZhdGUgSUJhc2VMYWJlbFByb3ZpZGVyIGJ1aWxkTGFiZWxQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlpZiAoZWxlbWVudCA9PSBERUZBVUxUICYmIHN0cmluZ0hvbGRlci53cmFwcGVkT2JqZWN0KCkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gc3RyaW5nSG9sZGVyLmRlZmF1bHRJdGVtKCk7Ci0JCQkJfQotCQkJCXJldHVybiBzdXBlci5nZXRUZXh0KGVsZW1lbnQpOwotCQkJfQotCQl9OwotCX0KLQl2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSVNlbGVjdGlvbiBzZWwpIHsKLQkJaWYgKGlzUG9wdWxhdGluZygpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmIChzZWwgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJU3RyaW5nIHNlbGVjdGlvbiA9IChTdHJpbmcpICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbCkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQlpZiAodGhpcy5jb21ib1ZpZXdlci5nZXRDb21ibygpLmdldFNlbGVjdGlvbkluZGV4KCkgPT0gMCkgewotCQkJCXNlbGVjdGlvbiA9IG51bGw7Ci0JCQl9Ci0JCQlpZiAodGhpcy5zdHJpbmdIb2xkZXIuZ2V0U3RyaW5nKCkgPT0gbnVsbCkgewotCQkJCWlmIChzZWxlY3Rpb24gIT0gbnVsbCkgewotCQkJCQl0aGlzLnN0cmluZ0hvbGRlci5zZXRTdHJpbmcoc2VsZWN0aW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmICghdGhpcy5zdHJpbmdIb2xkZXIuZ2V0U3RyaW5nKCkuZXF1YWxzKHNlbGVjdGlvbikpIHsKLQkJCQl0aGlzLnN0cmluZ0hvbGRlci5zZXRTdHJpbmcoc2VsZWN0aW9uKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY29tYm9Nb2RpZmllZChNb2RpZnlFdmVudCBlKSB7Ci0JCWlmIChpc1BvcHVsYXRpbmcoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUNDb21ibyBjb21ibyA9IChDQ29tYm8pIGUuZ2V0U291cmNlKCk7Ci0JCWNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCVN0cmluZyB0ZXh0ID0gY29tYm8uZ2V0VGV4dCgpOwotCQkKLQkJaWYgKHRleHQgIT0gbnVsbCAmJiBjb21iby5nZXRJdGVtQ291bnQoKSA+IDAgJiYgdGV4dC5lcXVhbHMoY29tYm8uZ2V0SXRlbSgwKSkpIHsKLQkJCXRleHQgPSBudWxsOwotCQl9Ci0JCWlmICh0aGlzLnN0cmluZ0hvbGRlci5nZXRTdHJpbmcoKSAhPSB0ZXh0KSB7Ci0JCQl0aGlzLnN0cmluZ0hvbGRlci5zZXRTdHJpbmcodGV4dCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHN0cmluZ0hvbGRlckNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlpZiAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRCh0aGlzLnN0cmluZ0hvbGRlci5mZWF0dXJlQ2xhc3MoKSkgPT0gCi0JCQkJdGhpcy5zdHJpbmdIb2xkZXIuZmVhdHVyZUlkKCkpIHsKLQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYygKLQkJCQluZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWlmIChnZXRDb21ibygpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJCXBvcHVsYXRlKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJfQotCQllbHNlIGlmICh0aGlzLnN0cmluZ0hvbGRlci5zdXBwb3J0c0RlZmF1bHQoKSkgewotCQkJaWYgKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQodGhpcy5zdHJpbmdIb2xkZXIuZmVhdHVyZUNsYXNzKCkpID09IAotCQkJCXRoaXMuc3RyaW5nSG9sZGVyLmRlZmF1bHRGZWF0dXJlSWQoKSkgewotCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYygKLQkJCQkJbmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCWlmIChnZXRDb21ibygpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJfQotCQkJCQkJCXBvcHVsYXRlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCQotCQkJfQotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUxpc3RlbmVycygpIHsKLQkJaWYgKHRoaXMuc3RyaW5nSG9sZGVyICE9IG51bGwgJiYgdGhpcy5zdHJpbmdIb2xkZXIud3JhcHBlZE9iamVjdCgpICE9IG51bGwpIHsKLQkJCXRoaXMuc3RyaW5nSG9sZGVyLndyYXBwZWRPYmplY3QoKS5lQWRhcHRlcnMoKS5hZGQodGhpcy5zdHJpbmdIb2xkZXJMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTGlzdGVuZXJzKCkgewotCQlpZiAodGhpcy5zdHJpbmdIb2xkZXIgIT0gbnVsbCAmJiB0aGlzLnN0cmluZ0hvbGRlci53cmFwcGVkT2JqZWN0KCkgIT0gbnVsbCkgewotCQkJdGhpcy5zdHJpbmdIb2xkZXIud3JhcHBlZE9iamVjdCgpLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzLnN0cmluZ0hvbGRlckxpc3RlbmVyKTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkb1BvcHVsYXRlKEVPYmplY3Qgb2JqKSB7Ci0JCXRoaXMuc3RyaW5nSG9sZGVyID0gKFN0cmluZ0hvbGRlcikgb2JqOwotCQl0aGlzLmNvbWJvVmlld2VyLnNldElucHV0KHRoaXMuc3RyaW5nSG9sZGVyKTsKLQkJcG9wdWxhdGVDb21ibygpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb1BvcHVsYXRlKCkgewotCQlwb3B1bGF0ZUNvbWJvKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZUNvbWJvKCkgewotCQlpZiAodGhpcy5zdHJpbmdIb2xkZXIud3JhcHBlZE9iamVjdCgpID09IG51bGwpIHsKLQkJCXRoaXMuY29tYm9WaWV3ZXIuc2V0U2VsZWN0aW9uKFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXRoaXMuY29tYm9WaWV3ZXIudXBkYXRlKHRoaXMuY29tYm9WaWV3ZXIuZ2V0RWxlbWVudEF0KDApLCBudWxsKTsKLQotCQlTdHJpbmcgc3RyaW5nID0gdGhpcy5zdHJpbmdIb2xkZXIuZ2V0U3RyaW5nKCk7Ci0JCWlmIChzdHJpbmcgPT0gbnVsbCkgewotCQkJaWYgKCgoU3RydWN0dXJlZFNlbGVjdGlvbikgdGhpcy5jb21ib1ZpZXdlci5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCkgPT0gREVGQVVMVCkgewotCQkJCXRoaXMuY29tYm9WaWV3ZXIucmVmcmVzaCgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGhpcy5jb21ib1ZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oREVGQVVMVCkpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKCF0aGlzLmNvbWJvVmlld2VyLmdldENvbWJvKCkuZ2V0VGV4dCgpLmVxdWFscyhzdHJpbmcpKSB7Ci0JCQkJdGhpcy5jb21ib1ZpZXdlci5nZXRDb21ibygpLnNldFRleHQoc3RyaW5nKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgQ0NvbWJvIGdldENvbWJvKCkgewotCQlyZXR1cm4gdGhpcy5jb21ib1ZpZXdlci5nZXRDb21ibygpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCkgewotCQlyZXR1cm4gZ2V0Q29tYm8oKTsKLQl9Ci0JLyoqCi0JICogQW4gaW50ZXJmYWNlIHRvIHdyYXAgYW4gb2JqZWN0IHRoYXQgc3VwcG9ydHMgYSBzdHJpbmcgd2l0aCBhIGRlZmF1bHQgc2V0dGluZwotCSAqIEFuIG9iamVjdCBvZiB0aGlzIHR5cGUgbXVzdCBiZSBwYXNzZWQgaW4gdG8gcG9wdWxhdGUoRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludGVyZmFjZSBTdHJpbmdIb2xkZXIgZXh0ZW5kcyBFT2JqZWN0IHsKLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgc3RyaW5nIHNldHRpbmcgZnJvbSB0aGUgd3JhcHBlZCBvYmplY3QKLQkJICogQHJldHVybgotCQkgKi8KLQkJU3RyaW5nIGdldFN0cmluZygpOwotCQkKLQkJLyoqCi0JCSAqIFNldCB0aGUgc3RyaW5nIHNldHRpbmcgb24gdGhlIHdyYXBwZWQgb2JqZWN0Ci0JCSAqIEBwYXJhbSBzdHJpbmcKLQkJICovCi0JCXZvaWQgc2V0U3RyaW5nKFN0cmluZyBzdHJpbmcpOwotCQkKLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgQ2xhc3Mgb2YgdGhlIHdyYXBwZWQgb2JqZWN0Ci0JCSAqIEByZXR1cm4KLQkJICovCi0JCUNsYXNzIGZlYXR1cmVDbGFzcygpOwotCQkKLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgZmVhdHVyZSBpZCBvZiBzdHJpbmcgc2V0dGluZyBvbiB0aGUgd3JhcHBlZCBvYmplY3QKLQkJICogQHJldHVybgotCQkgKi8KLQkJaW50IGZlYXR1cmVJZCgpOwotCQkKLQkJYm9vbGVhbiBzdXBwb3J0c0RlZmF1bHQoKTsKLQkJCi0JCWludCBkZWZhdWx0RmVhdHVyZUlkKCk7Ci0JCQotCQkvKioKLQkJICogVGhlIHdyYXBwZWQgRU9iamVjdCB0aGF0IHRoZSBlbnVtIHNldHRpbmcgaXMgc3RvcmVkIG9uCi0JCSAqIEByZXR1cm4KLQkJICovCi0JCUVPYmplY3Qgd3JhcHBlZE9iamVjdCgpOwotCQkKLQkJU3RyaW5nIGRlZmF1bHRJdGVtKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9UYWJsZUNvbWJvLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1RhYmxlQ29tYm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzMwNDc0My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1RhYmxlQ29tYm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLkpwYUNvcmVNYXBwaW5nc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLkNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLkNvbm5lY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwuQ29ubmVjdGlvblByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLkRhdGFiYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkJhc2VKcGFDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLQotcHVibGljIGNsYXNzIFRhYmxlQ29tYm8gZXh0ZW5kcyBCYXNlSnBhQ29udHJvbGxlcgotewotCXByaXZhdGUgSVRhYmxlIHRhYmxlOwotCi0JcHJpdmF0ZSBBZGFwdGVyIGxpc3RlbmVyOwotCi0JLyoqCi0JICogQ2FjaGluZyB0aGUgY29ubmVjdGlvblByb2ZpbGUgc28gd2UgY2FuIHJlbW92ZSB0aGUgbGlzdGVuZXIuIElmIHRoZQotCSAqIGNhY2hlZCB0YWJsZSBvYmplY3QgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBtb2RlbCB0aGVuIHdlIG5vIGxvbmdlcgotCSAqIGhhdmUgYWNjZXNzIHRvIHBhcmVudCBhbmQgY2Fubm90IGZpbmQgdGhlIGNvbm5lY3Rpb25Qcm9maWxlCi0JICovCi0JcHJpdmF0ZSBDb25uZWN0aW9uUHJvZmlsZSBjb25uZWN0aW9uUHJvZmlsZTsKLQotCXByaXZhdGUgQ29ubmVjdGlvbkxpc3RlbmVyIGNvbm5lY3Rpb25MaXN0ZW5lcjsKLQotCXByaXZhdGUgQ0NvbWJvIGNvbWJvOwotCi0JcHVibGljIFRhYmxlQ29tYm8oQ29tcG9zaXRlIHBhcmVudCwgQ29tbWFuZFN0YWNrIHRoZUNvbW1hbmRTdGFjaywgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlzdXBlcihwYXJlbnQsIHRoZUNvbW1hbmRTdGFjaywgd2lkZ2V0RmFjdG9yeSk7Ci0JCXRoaXMubGlzdGVuZXIgPSBidWlsZFRhYmxlTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uTGlzdGVuZXIgPSBidWlsZENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCX0KLQotCXByaXZhdGUgQWRhcHRlciBidWlsZFRhYmxlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJCQl0YWJsZUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbm5lY3Rpb25MaXN0ZW5lciBidWlsZENvbm5lY3Rpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDb25uZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhYm91dFRvQ2xvc2UoQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7Ci0JCQkvLyBub3QgaW50ZXJlc3RlZCB0byB0aGlzIGV2ZW50LgotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBjbG9zZWQoQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7Ci0JCQkJZ2V0Q29tYm8oKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJaWYgKGdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQlUYWJsZUNvbWJvLnRoaXMucG9wdWxhdGVUYWJsZUNvbWJvKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbW9kaWZpZWQoQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7Ci0JCQkJZ2V0Q29tYm8oKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJaWYgKGdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQlUYWJsZUNvbWJvLnRoaXMucG9wdWxhdGVUYWJsZUNvbWJvKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gb2tUb0Nsb3NlKENvbm5lY3Rpb24gY29ubmVjdGlvbikgewotCQkJCS8vIG5vdCBpbnRlcmVzdGVkIHRvIHRoaXMgZXZlbnQuCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIG9wZW5lZChDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKLQkJCQlnZXRDb21ibygpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlpZiAoZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJCVRhYmxlQ29tYm8udGhpcy5wb3B1bGF0ZVRhYmxlQ29tYm8oKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBkYXRhYmFzZUNoYW5nZWQoQ29ubmVjdGlvbiBjb25uZWN0aW9uLCBmaW5hbCBEYXRhYmFzZSBkYXRhYmFzZSkgewotCQkJCWdldENvbnRyb2woKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJaWYgKGRhdGFiYXNlID09IFRhYmxlQ29tYm8udGhpcy5nZXREYXRhYmFzZSgpKSB7Ci0JCQkJCQkJaWYgKCFnZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQkJCVRhYmxlQ29tYm8udGhpcy5wb3B1bGF0ZVRhYmxlQ29tYm8oKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgc2NoZW1hQ2hhbmdlZChDb25uZWN0aW9uIGNvbm5lY3Rpb24sIGZpbmFsIFNjaGVtYSBzY2hlbWEpIHsKLQkJCQlnZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWlmIChzY2hlbWEgPT0gVGFibGVDb21iby50aGlzLmdldFRhYmxlU2NoZW1hKCkpIHsKLQkJCQkJCQlpZiAoIWdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCQkJVGFibGVDb21iby50aGlzLnBvcHVsYXRlVGFibGVDb21ibygpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB0YWJsZUNoYW5nZWQoQ29ubmVjdGlvbiBjb25uZWN0aW9uLCBmaW5hbCBUYWJsZSB0YWJsZSkgewotCQkJLy8gbm90IGludGVyZXN0ZWQgdG8gdGhpcyBldmVudC4KLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBidWlsZFdpZGdldChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMuY29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKHBhcmVudCwgU1dULkZMQVQpOwotCQl0aGlzLmNvbWJvLmFkZChKcHRVaU1hcHBpbmdzTWVzc2FnZXMuVGFibGVDb21wb3NpdGVfZGVmYXVsdEVtcHR5KTsKLQkJdGhpcy5jb21iby5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlpZiAoaXNQb3B1bGF0aW5nKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgdGFibGVUZXh0ID0gKChDQ29tYm8pIGUuZ2V0U291cmNlKCkpLmdldFRleHQoKTsKLQkJCQlpZiAodGFibGVUZXh0LmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQl0YWJsZVRleHQgPSBudWxsOwotCQkJCQlpZiAodGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpID09IG51bGwgfHwgdGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmICh0YWJsZVRleHQgIT0gbnVsbCAmJiBjb21iby5nZXRJdGVtQ291bnQoKSA+IDAgJiYgdGFibGVUZXh0LmVxdWFscyhjb21iby5nZXRJdGVtKDApKSkgewotCQkJCQl0YWJsZVRleHQgPSBudWxsOwotCQkJCX0KLQkJCQlpZiAodGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpID09IG51bGwgJiYgdGFibGVUZXh0ICE9IG51bGwpIHsKLQkJCQkJdGFibGUuc2V0U3BlY2lmaWVkTmFtZSh0YWJsZVRleHQpOwotCQkJCX0KLQkJCQlpZiAodGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpICE9IG51bGwgJiYgIXRhYmxlLmdldFNwZWNpZmllZE5hbWUoKS5lcXVhbHModGFibGVUZXh0KSkgewotCQkJCQl0YWJsZS5zZXRTcGVjaWZpZWROYW1lKHRhYmxlVGV4dCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB0YWJsZUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlpZiAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChJVGFibGUuY2xhc3MpID09IEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSVRBQkxFX19TUEVDSUZJRURfTkFNRSkgewotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChnZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJcG9wdWxhdGVUYWJsZU5hbWUoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQllbHNlIGlmIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKElUYWJsZS5jbGFzcykgPT0gSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JVEFCTEVfX0RFRkFVTFRfTkFNRSkgewotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChnZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJcG9wdWxhdGVEZWZhdWx0VGFibGVOYW1lKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJZWxzZSBpZiAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChJVGFibGUuY2xhc3MpID09IEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSVRBQkxFX19ERUZBVUxUX1NDSEVNQSkgewotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChnZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJcG9wdWxhdGVUYWJsZUNvbWJvKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJZWxzZSBpZiAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChJVGFibGUuY2xhc3MpID09IEpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSVRBQkxFX19TUEVDSUZJRURfU0NIRU1BKSB7Ci0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlwb3B1bGF0ZVRhYmxlQ29tYm8oKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGRvUG9wdWxhdGUoRU9iamVjdCBvYmopIHsKLQkJdGhpcy50YWJsZSA9IChJVGFibGUpIG9iajsKLQkJaWYgKHRoaXMudGFibGUgIT0gbnVsbCkgewotCQkJcG9wdWxhdGVUYWJsZUNvbWJvKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlID0gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGRvUG9wdWxhdGUoKSB7Ci0JCWlmICh0aGlzLnRhYmxlICE9IG51bGwpIHsKLQkJCXBvcHVsYXRlVGFibGVDb21ibygpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIERhdGFiYXNlIGdldERhdGFiYXNlKCkgewotCQlyZXR1cm4gZ2V0Q29ubmVjdGlvblByb2ZpbGUoKS5nZXREYXRhYmFzZSgpOwotCX0KLQotCXByb3RlY3RlZCBTY2hlbWEgZ2V0VGFibGVTY2hlbWEoKSB7Ci0JCXJldHVybiBnZXRDb25uZWN0aW9uUHJvZmlsZSgpLmdldERhdGFiYXNlKCkuc2NoZW1hTmFtZWQodGFibGUuZ2V0U2NoZW1hKCkpOwotCX0KLQotCXByaXZhdGUgQ29ubmVjdGlvblByb2ZpbGUgZ2V0Q29ubmVjdGlvblByb2ZpbGUoKSB7Ci0JCWlmICh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlID09IG51bGwpIHsKLQkJCXRoaXMuY29ubmVjdGlvblByb2ZpbGUgPSB0aGlzLnRhYmxlLmdldEpwYVByb2plY3QoKS5jb25uZWN0aW9uUHJvZmlsZSgpOwotCQl9Ci0JCXJldHVybiB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlOwotCX0KLQotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZVRhYmxlQ29tYm8oKSB7Ci0JCWlmICh0aGlzLnRhYmxlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkvLyBUT0RPIGRvbid0IGRvIGluc3RhbmNlb2YgY2hlY2sgaGVyZSAtIGNoZWNrIG9uIFRhYmxlLCBvciBpc1Jvb3QgY2hlY2sKLQkJLy8gb24gRW50aXR5Ci0JCS8vIHRoaXMudGFibGVDb21iby5zZXRFbmFibGVkKCEodGhpcy50YWJsZSBpbnN0YW5jZW9mCi0JCS8vIFNpbmdsZVRhYmxlSW5oZXJpdGFuY2VDaGlsZFRhYmxlSW1wbCkpOwotCQlwb3B1bGF0ZURlZmF1bHRUYWJsZU5hbWUoKTsKLQkJaWYgKGdldENvbm5lY3Rpb25Qcm9maWxlKCkuaXNDb25uZWN0ZWQoKSkgewotCQkJdGhpcy5jb21iby5yZW1vdmUoMSwgdGhpcy5jb21iby5nZXRJdGVtQ291bnQoKSAtIDEpOwotCQkJU2NoZW1hIHNjaGVtYSA9IHRoaXMuZ2V0VGFibGVTY2hlbWEoKTsKLQkJCWlmIChzY2hlbWEgIT0gbnVsbCkgewotCQkJCUl0ZXJhdG9yPFN0cmluZz4gdGFibGVzID0gc2NoZW1hLnRhYmxlTmFtZXMoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gQ29sbGVjdGlvblRvb2xzLnNvcnQodGFibGVzKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCQkJdGhpcy5jb21iby5hZGQoc3RyZWFtLm5leHQoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5jb21iby5yZW1vdmUoMSwgdGhpcy5jb21iby5nZXRJdGVtQ291bnQoKSAtIDEpOwotCQl9Ci0JCXBvcHVsYXRlVGFibGVOYW1lKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVEZWZhdWx0VGFibGVOYW1lKCkgewotCQlpZiAodGhpcy50YWJsZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU3RyaW5nIGRlZmF1bHRUYWJsZU5hbWUgPSB0YWJsZS5nZXREZWZhdWx0TmFtZSgpOwotCQlpbnQgc2VsZWN0aW9uSW5kZXggPSBjb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQljb21iby5zZXRJdGVtKDAsIE5MUy5iaW5kKEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5UYWJsZUNvbXBvc2l0ZV9kZWZhdWx0V2l0aE9uZVBhcmFtLCBkZWZhdWx0VGFibGVOYW1lKSk7Ci0JCWlmIChzZWxlY3Rpb25JbmRleCA9PSAwKSB7Ci0JCQkvLyBjb21ibyB0ZXh0IGRvZXMgbm90IHVwZGF0ZSB3aGVuIHN3aXRjaGluZyBiZXR3ZWVuIDIgbWFwcGluZ3Mgb2YKLQkJCS8vIHRoZSBzYW1lIHR5cGUKLQkJCS8vIHRoYXQgYm90aCBoYXZlIGEgZGVmYXVsdCBjb2x1bW4gbmFtZS4gY2xlYXIgdGhlIHNlbGVjdGlvbiBhbmQKLQkJCS8vIHRoZW4gc2V0IGl0IGFnYWluCi0JCQljb21iby5jbGVhclNlbGVjdGlvbigpOwotCQkJY29tYm8uc2VsZWN0KDApOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVUYWJsZU5hbWUoKSB7Ci0JCWlmICh0aGlzLnRhYmxlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlTdHJpbmcgdGFibGVOYW1lID0gdGhpcy50YWJsZS5nZXRTcGVjaWZpZWROYW1lKCk7Ci0JCVN0cmluZyBkZWZhdWx0VGFibGVOYW1lID0gdGhpcy50YWJsZS5nZXREZWZhdWx0TmFtZSgpOwotCQlpZiAodGFibGVOYW1lICE9IG51bGwpIHsKLQkJCWlmICghdGhpcy5jb21iby5nZXRUZXh0KCkuZXF1YWxzKHRhYmxlTmFtZSkpIHsKLQkJCQl0aGlzLmNvbWJvLnNldFRleHQodGFibGVOYW1lKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWlmICghdGhpcy5jb21iby5nZXRUZXh0KCkuZXF1YWxzKE5MUy5iaW5kKEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5UYWJsZUNvbXBvc2l0ZV9kZWZhdWx0V2l0aE9uZVBhcmFtLCBkZWZhdWx0VGFibGVOYW1lKSkpIHsKLQkJCQl0aGlzLmNvbWJvLnNlbGVjdCgwKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBDQ29tYm8gZ2V0Q29tYm8oKSB7Ci0JCXJldHVybiB0aGlzLmNvbWJvOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKSB7Ci0JCXJldHVybiBnZXRDb21ibygpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZUxpc3RlbmVycygpIHsKLQkJaWYgKHRoaXMudGFibGUgIT0gbnVsbCkgewotCQkJdGhpcy5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJCXRoaXMudGFibGUuZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMubGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTGlzdGVuZXJzKCkgewotCQlpZiAodGhpcy50YWJsZSAhPSBudWxsKSB7Ci0JCQl0aGlzLnRhYmxlLmVBZGFwdGVycygpLmFkZCh0aGlzLmxpc3RlbmVyKTsKLQkJCXRoaXMuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkQ29ubmVjdGlvbkxpc3RlbmVyKCkgewotCQl0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlKCkuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKHRoaXMuY29ubmVjdGlvbkxpc3RlbmVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKCkgewotCQl0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlKCkucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKHRoaXMuY29ubmVjdGlvbkxpc3RlbmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1RhYmxlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1RhYmxlQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjNmY5OWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9UYWJsZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLklKcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5CYXNlSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLklXb3JrYmVuY2hIZWxwU3lzdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotCi0vL1RPRE8gcmVwb3B1bGF0ZSB0aGlzIHBhbmVsIGJhc2VkIG9uIHRoZSBFbnRpdHkgdGFibGUgY2hhbmdpbmcKLXB1YmxpYyBjbGFzcyBUYWJsZUNvbXBvc2l0ZSBleHRlbmRzIEJhc2VKcGFDb21wb3NpdGUKLXsKLQlwcml2YXRlIElUYWJsZSB0YWJsZTsKLQkKLQlwcm90ZWN0ZWQgVGFibGVDb21ibyB0YWJsZUNvbWJvOwotCQotCXByb3RlY3RlZCBDYXRhbG9nQ29tYm8gY2F0YWxvZ0NvbWJvOwotCXByb3RlY3RlZCBTY2hlbWFDb21ibyBzY2hlbWFDb21ibzsKLQkKLQlwdWJsaWMgVGFibGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjaywgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlzdXBlcihwYXJlbnQsIFNXVC5OVUxMLCBjb21tYW5kU3RhY2ssIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlJV29ya2JlbmNoSGVscFN5c3RlbSBoZWxwU3lzdGVtID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsJCQotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7CQotCQkKLQkJR3JvdXAgY29sdW1uR3JvdXAgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlR3JvdXAoY29tcG9zaXRlLCBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuVGFibGVDb21wb3NpdGVfdGFibGVTZWN0aW9uKTsKLQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7CQkJCQotCQljb2x1bW5Hcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2U9IHRydWU7Ci0JCWNvbHVtbkdyb3VwLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCS8vY3JlYXRlZCB0aGlzIGNvbXBvc2l0ZSBiZWNhdXNlIGNvbWJvcyBhcyBkaXJlY3QgY2hpbGRyZW4gb2YgYSBHcm91cCBkbyBub3QgaGF2ZSBhIGJvcmRlciwgbm8gY2x1ZSB3aHkKLQkJQ29tcG9zaXRlIGludGVybWVkaWFyeUNvbXBvc2l0ZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDb21wb3NpdGUoY29sdW1uR3JvdXApOwotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7CQkKLQkJaW50ZXJtZWRpYXJ5Q29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQkKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2U9IHRydWU7Ci0JCWludGVybWVkaWFyeUNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCi0JCUNvbW1vbldpZGdldHMuYnVpbGRUYWJsZUxhYmVsKGludGVybWVkaWFyeUNvbXBvc2l0ZSwgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQkJCi0JCXRoaXMudGFibGVDb21ibyA9IG5ldyBUYWJsZUNvbWJvKGludGVybWVkaWFyeUNvbXBvc2l0ZSwgdGhpcy5jb21tYW5kU3RhY2ssIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuQkVHSU5OSU5HOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJdGhpcy50YWJsZUNvbWJvLmdldENvbWJvKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWhlbHBTeXN0ZW0uc2V0SGVscCh0YWJsZUNvbWJvLmdldENvbWJvKCksIElKcGFIZWxwQ29udGV4dElkcy5FTlRJVFlfVEFCTEUpOwotCi0JCUNvbW1vbldpZGdldHMuYnVpbGRDYXRhbG9nTGFiZWwoaW50ZXJtZWRpYXJ5Q29tcG9zaXRlLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCQl0aGlzLmNhdGFsb2dDb21ibyA9IG5ldyBDYXRhbG9nQ29tYm8oaW50ZXJtZWRpYXJ5Q29tcG9zaXRlLCB0aGlzLmNvbW1hbmRTdGFjaywgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5CRUdJTk5JTkc7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQl0aGlzLmNhdGFsb2dDb21iby5nZXRDb21ibygpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQloZWxwU3lzdGVtLnNldEhlbHAoY2F0YWxvZ0NvbWJvLmdldENvbWJvKCksIElKcGFIZWxwQ29udGV4dElkcy5FTlRJVFlfQ0FUQUxPRyk7Ci0JCi0JCUNvbW1vbldpZGdldHMuYnVpbGRTY2hlbWFMYWJlbChpbnRlcm1lZGlhcnlDb21wb3NpdGUsIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCXRoaXMuc2NoZW1hQ29tYm8gPSBuZXcgU2NoZW1hQ29tYm8oaW50ZXJtZWRpYXJ5Q29tcG9zaXRlLCB0aGlzLmNvbW1hbmRTdGFjaywgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5CRUdJTk5JTkc7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQl0aGlzLnNjaGVtYUNvbWJvLmdldENvbWJvKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWhlbHBTeXN0ZW0uc2V0SGVscChzY2hlbWFDb21iby5nZXRDb21ibygpLCBJSnBhSGVscENvbnRleHRJZHMuRU5USVRZX1NDSEVNQSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUxpc3RlbmVycygpIHsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VMaXN0ZW5lcnMoKSB7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRvUG9wdWxhdGUoRU9iamVjdCBvYmopIHsKLQkJdGhpcy50YWJsZSA9IChJVGFibGUpIG9iajsKLQkJdGhpcy50YWJsZUNvbWJvLnBvcHVsYXRlKHRoaXMudGFibGUpOwotCQl0aGlzLmNhdGFsb2dDb21iby5wb3B1bGF0ZSh0aGlzLnRhYmxlKTsKLQkJdGhpcy5zY2hlbWFDb21iby5wb3B1bGF0ZSh0aGlzLnRhYmxlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZG9Qb3B1bGF0ZSgpIHsKLQkJdGhpcy50YWJsZUNvbWJvLnBvcHVsYXRlKCk7Ci0JCXRoaXMuY2F0YWxvZ0NvbWJvLnBvcHVsYXRlKCk7Ci0JCXRoaXMuc2NoZW1hQ29tYm8ucG9wdWxhdGUoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJdGhpcy5jYXRhbG9nQ29tYm8uZGlzcG9zZSgpOwotCQl0aGlzLnNjaGVtYUNvbWJvLmRpc3Bvc2UoKTsKLQkJdGhpcy50YWJsZUNvbWJvLmRpc3Bvc2UoKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9UYWJsZUdlbmVyYXRvckNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9UYWJsZUdlbmVyYXRvckNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzJmOTM3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvVGFibGVHZW5lcmF0b3JDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklKcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklJZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JVGFibGVHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSnBhQ29yZU1hcHBpbmdzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwuQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwuQ29ubmVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC5Db25uZWN0aW9uUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwuRGF0YWJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLlNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLklKcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSVdvcmtiZW5jaEhlbHBTeXN0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZSBleHRlbmRzIEdlbmVyYXRvckNvbXBvc2l0ZTxJVGFibGVHZW5lcmF0b3I+Ci17Ci0JcHJpdmF0ZSBDQ29tYm8gdGFibGVOYW1lQ29tYm87Ci0JcHJpdmF0ZSBDQ29tYm8gcGtDb2x1bW5OYW1lQ29tYm87Ci0JcHJpdmF0ZSBDQ29tYm8gdmFsdWVDb2x1bW5OYW1lQ29tYm87Ci0JcHJpdmF0ZSBDQ29tYm8gcGtDb2x1bW5WYWx1ZUNvbWJvOwotCi0JcHJpdmF0ZSBDb25uZWN0aW9uTGlzdGVuZXIgY29ubmVjdGlvbkxpc3RlbmVyOwotCi0JcHJpdmF0ZSBDb25uZWN0aW9uUHJvZmlsZSBjb25uZWN0aW9uUHJvZmlsZTsKLQotCXB1YmxpYyBUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrLCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXN1cGVyKHBhcmVudCwgY29tbWFuZFN0YWNrLCB3aWRnZXRGYWN0b3J5KTsKLQkJdGhpcy5jb25uZWN0aW9uTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQ29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JfQotCQotCXByb3RlY3RlZCBJVGFibGVHZW5lcmF0b3IgY3JlYXRlR2VuZXJhdG9yKCkgewotCQlJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSBpZE1hcHBpbmcoKS5jcmVhdGVUYWJsZUdlbmVyYXRvcigpOwotCQlpZE1hcHBpbmcoKS5zZXRUYWJsZUdlbmVyYXRvcih0YWJsZUdlbmVyYXRvcik7Ci0JCXJldHVybiB0YWJsZUdlbmVyYXRvcjsKLQl9Ci0JCi0JcHJvdGVjdGVkIElUYWJsZUdlbmVyYXRvciBnZW5lcmF0b3IoSUlkIGlkTWFwcGluZykgewotCQlyZXR1cm4gaWRNYXBwaW5nLmdldFRhYmxlR2VuZXJhdG9yKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQotCQlJV29ya2JlbmNoSGVscFN5c3RlbSBoZWxwU3lzdGVtID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCk7Ci0JCQotCQlnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlTGFiZWwoY29tcG9zaXRlLCBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuVGFibGVHZW5lcmF0b3JDb21wb3NpdGVfbmFtZSk7Ci0JCQotCQl0aGlzLm5hbWVUZXh0V2lkZ2V0ID0gYnVpbGROYW1lVGV4dChjb21wb3NpdGUpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXRoaXMubmFtZVRleHRXaWRnZXQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWhlbHBTeXN0ZW0uc2V0SGVscCh0aGlzLm5hbWVUZXh0V2lkZ2V0LCBJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19UQUJMRV9HRU5FUkFUT1JfTkFNRSk7Ci0JCQotCQlnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlTGFiZWwoY29tcG9zaXRlLCBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuVGFibGVHZW5lcmF0b3JDb21wb3NpdGVfdGFibGUpOwotCQkKLQkJdGhpcy50YWJsZU5hbWVDb21ibyA9IGJ1aWxkVGFibGVOYW1lQ29tYm8oY29tcG9zaXRlKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQl0aGlzLnRhYmxlTmFtZUNvbWJvLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQloZWxwU3lzdGVtLnNldEhlbHAodGhpcy50YWJsZU5hbWVDb21ibywgSUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfVEFCTEVfR0VORVJBVE9SX1RBQkxFKTsKLQkJCi0JCWdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVMYWJlbChjb21wb3NpdGUsIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5UYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV9wa0NvbHVtbik7Ci0JCQotCQl0aGlzLnBrQ29sdW1uTmFtZUNvbWJvID0gYnVpbGRQa0NvbHVtbk5hbWVDb21ibyhjb21wb3NpdGUpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXRoaXMucGtDb2x1bW5OYW1lQ29tYm8uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWhlbHBTeXN0ZW0uc2V0SGVscCh0aGlzLnBrQ29sdW1uTmFtZUNvbWJvLCBJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19UQUJMRV9HRU5FUkFUT1JfUFJJTUFSWV9LRVlfQ09MVU1OKTsKLQkJCi0JCWdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVMYWJlbChjb21wb3NpdGUsIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5UYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV92YWx1ZUNvbHVtbik7Ci0JCQotCQl0aGlzLnZhbHVlQ29sdW1uTmFtZUNvbWJvID0gYnVpbGRWYWx1ZUNvbHVtbk5hbWVDb21ibyhjb21wb3NpdGUpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXRoaXMudmFsdWVDb2x1bW5OYW1lQ29tYm8uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWhlbHBTeXN0ZW0uc2V0SGVscCh0aGlzLnZhbHVlQ29sdW1uTmFtZUNvbWJvLCBJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19UQUJMRV9HRU5FUkFUT1JfVkFMVUVfQ09MVU1OKTsKLQkJCi0JCWdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVMYWJlbChjb21wb3NpdGUsIEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5UYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV9wa0NvbHVtblZhbHVlKTsKLQkJCi0JCXRoaXMucGtDb2x1bW5WYWx1ZUNvbWJvID0gYnVpbGRQa0NvbHVtblZhbHVlQ29tYm8oY29tcG9zaXRlKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQl0aGlzLnBrQ29sdW1uVmFsdWVDb21iby5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJaGVscFN5c3RlbS5zZXRIZWxwKHRoaXMucGtDb2x1bW5WYWx1ZUNvbWJvLCBJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19UQUJMRV9HRU5FUkFUT1JfUFJJTUFSWV9LRVlfQ09MVU1OX1ZBTFVFKTsKLQl9Ci0KLQlwcml2YXRlIENDb21ibyBidWlsZFRhYmxlTmFtZUNvbWJvKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ0NvbWJvIGNvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhwYXJlbnQsIFNXVC5GTEFUKTsKLQkJY29tYm8uYWRkKEpwdFVpTWFwcGluZ3NNZXNzYWdlcy5UYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV9kZWZhdWx0KTsKLQkJY29tYm8uc2VsZWN0KDApOwotCQljb21iby5hZGRNb2RpZnlMaXN0ZW5lcihidWlsZFRhYmxlTmFtZUxpc3RlbmVyKCkpOwotCQlyZXR1cm4gY29tYm87Ci0JfQotCi0JcHJpdmF0ZSBDQ29tYm8gYnVpbGRQa0NvbHVtbk5hbWVDb21ibyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNDb21ibyBjb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8ocGFyZW50LCBTV1QuRkxBVCk7Ci0JCWNvbWJvLmFkZChKcHRVaU1hcHBpbmdzTWVzc2FnZXMuVGFibGVHZW5lcmF0b3JDb21wb3NpdGVfZGVmYXVsdCk7Ci0JCWNvbWJvLnNlbGVjdCgwKTsKLQkJY29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIoYnVpbGRQa0NvbHVtbk5hbWVMaXN0ZW5lcigpKTsKLQkJcmV0dXJuIGNvbWJvOwotCX0KLQotCXByaXZhdGUgQ0NvbWJvIGJ1aWxkVmFsdWVDb2x1bW5OYW1lQ29tYm8oQ29tcG9zaXRlIHBhcmVudCkgewotCQlDQ29tYm8gY29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKHBhcmVudCwgU1dULkZMQVQpOwotCQljb21iby5hZGQoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX2RlZmF1bHQpOwotCQljb21iby5zZWxlY3QoMCk7Ci0JCWNvbWJvLmFkZE1vZGlmeUxpc3RlbmVyKGJ1aWxkVmFsdWVDb2x1bW5OYW1lTGlzdGVuZXIoKSk7Ci0JCXJldHVybiBjb21ibzsKLQl9Ci0KLQlwcml2YXRlIENDb21ibyBidWlsZFBrQ29sdW1uVmFsdWVDb21ibyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNDb21ibyBjb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8ocGFyZW50LCBTV1QuRkxBVCk7Ci0JCWNvbWJvLmFkZChKcHRVaU1hcHBpbmdzTWVzc2FnZXMuVGFibGVHZW5lcmF0b3JDb21wb3NpdGVfZGVmYXVsdCk7Ci0JCWNvbWJvLnNlbGVjdCgwKTsKLQkJY29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIoYnVpbGRQa0NvbHVtblZhbHVlTGlzdGVuZXIoKSk7Ci0JCXJldHVybiBjb21ibzsKLQl9Ci0KLQlwcml2YXRlIE1vZGlmeUxpc3RlbmVyIGJ1aWxkVGFibGVOYW1lTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlpZiAoaXNQb3B1bGF0aW5nKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgdGV4dCA9ICgoQ0NvbWJvKSBlLmdldFNvdXJjZSgpKS5nZXRUZXh0KCk7Ci0JCQkJaWYgKHRleHQgIT0gbnVsbCAmJiB0YWJsZU5hbWVDb21iby5nZXRJdGVtQ291bnQoKSA+IDAgJiYgdGV4dC5lcXVhbHModGFibGVOYW1lQ29tYm8uZ2V0SXRlbSgwKSkpIHsKLQkJCQkJdGV4dCA9IG51bGw7Ci0JCQkJfQotCQkJCUlUYWJsZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBnZXRHZW5lcmF0b3IoKTsKLQkJCQlpZiAoZ2VuZXJhdG9yID09IG51bGwpIHsKLQkJCQkJZ2VuZXJhdG9yID0gY3JlYXRlR2VuZXJhdG9yKCk7Ci0JCQkJfQotCQkJCWdlbmVyYXRvci5zZXRTcGVjaWZpZWRUYWJsZSh0ZXh0KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIE1vZGlmeUxpc3RlbmVyIGJ1aWxkUGtDb2x1bW5OYW1lTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlpZiAoaXNQb3B1bGF0aW5nKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgdGV4dCA9ICgoQ0NvbWJvKSBlLmdldFNvdXJjZSgpKS5nZXRUZXh0KCk7Ci0JCQkJaWYgKHRleHQgIT0gbnVsbCAmJiBwa0NvbHVtbk5hbWVDb21iby5nZXRJdGVtQ291bnQoKSA+IDAgJiYgdGV4dC5lcXVhbHMocGtDb2x1bW5OYW1lQ29tYm8uZ2V0SXRlbSgwKSkpIHsKLQkJCQkJdGV4dCA9IG51bGw7Ci0JCQkJfQotCQkJCUlUYWJsZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBnZXRHZW5lcmF0b3IoKTsKLQkJCQlpZiAoZ2VuZXJhdG9yID09IG51bGwpIHsKLQkJCQkJZ2VuZXJhdG9yID0gY3JlYXRlR2VuZXJhdG9yKCk7Ci0JCQkJfQotCQkJCWdlbmVyYXRvci5zZXRTcGVjaWZpZWRQa0NvbHVtbk5hbWUodGV4dCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBNb2RpZnlMaXN0ZW5lciBidWlsZFZhbHVlQ29sdW1uTmFtZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJaWYgKGlzUG9wdWxhdGluZygpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIHRleHQgPSAoKENDb21ibykgZS5nZXRTb3VyY2UoKSkuZ2V0VGV4dCgpOwotCQkJCWlmICh0ZXh0ICE9IG51bGwgJiYgdmFsdWVDb2x1bW5OYW1lQ29tYm8uZ2V0SXRlbUNvdW50KCkgPiAwICYmIHRleHQuZXF1YWxzKHZhbHVlQ29sdW1uTmFtZUNvbWJvLmdldEl0ZW0oMCkpKSB7Ci0JCQkJCXRleHQgPSBudWxsOwotCQkJCX0KLQkJCQlJVGFibGVHZW5lcmF0b3IgZ2VuZXJhdG9yID0gZ2V0R2VuZXJhdG9yKCk7Ci0JCQkJaWYgKGdlbmVyYXRvciA9PSBudWxsKSB7Ci0JCQkJCWdlbmVyYXRvciA9IGNyZWF0ZUdlbmVyYXRvcigpOwotCQkJCX0KLQkJCQlnZW5lcmF0b3Iuc2V0U3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lKHRleHQpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTW9kaWZ5TGlzdGVuZXIgYnVpbGRQa0NvbHVtblZhbHVlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlpZiAoaXNQb3B1bGF0aW5nKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgdGV4dCA9ICgoQ0NvbWJvKSBlLmdldFNvdXJjZSgpKS5nZXRUZXh0KCk7Ci0JCQkJaWYgKHRleHQgIT0gbnVsbCAmJiBwa0NvbHVtblZhbHVlQ29tYm8uZ2V0SXRlbUNvdW50KCkgPiAwICYmIHRleHQuZXF1YWxzKHBrQ29sdW1uVmFsdWVDb21iby5nZXRJdGVtKDApKSkgewotCQkJCQl0ZXh0ID0gbnVsbDsKLQkJCQl9Ci0JCQkJSVRhYmxlR2VuZXJhdG9yIGdlbmVyYXRvciA9IGdldEdlbmVyYXRvcigpOwotCQkJCWlmIChnZW5lcmF0b3IgPT0gbnVsbCkgewotCQkJCQlnZW5lcmF0b3IgPSBjcmVhdGVHZW5lcmF0b3IoKTsKLQkJCQl9Ci0JCQkJZ2VuZXJhdG9yLnNldFNwZWNpZmllZFBrQ29sdW1uVmFsdWUodGV4dCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdG9yQ2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN1cGVyLmdlbmVyYXRvckNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJaWYgKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSVRhYmxlR2VuZXJhdG9yLmNsYXNzKSA9PSBKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLklUQUJMRV9HRU5FUkFUT1JfX1NQRUNJRklFRF9UQUJMRSkgewotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChnZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJU3RyaW5nIHRhYmxlTmFtZSA9IGdldEdlbmVyYXRvcigpLmdldFNwZWNpZmllZFRhYmxlKCk7Ci0JCQkJCWlmICh0YWJsZU5hbWUgPT0gbnVsbCkgewotCQkJCQkJdGFibGVOYW1lQ29tYm8uc2VsZWN0KDApOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKCF0YWJsZU5hbWVDb21iby5nZXRUZXh0KCkuZXF1YWxzKHRhYmxlTmFtZSkpIHsKLQkJCQkJCXRhYmxlTmFtZUNvbWJvLnNldFRleHQodGFibGVOYW1lKTsKLQkJCQkJfQotCQkJCQlwb3B1bGF0ZVBrQ29sdW1uTmFtZUNvbWJvKCk7Ci0JCQkJCXBvcHVsYXRlVmFsdWVDb2x1bW5OYW1lQ29tYm8oKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQllbHNlIGlmIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKElUYWJsZUdlbmVyYXRvci5jbGFzcykgPT0gSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JVEFCTEVfR0VORVJBVE9SX19TUEVDSUZJRURfUEtfQ09MVU1OX05BTUUpIHsKLQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCXBvcHVsYXRlUGtDb2x1bW5OYW1lKCk7Ci0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQllbHNlIGlmIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKElUYWJsZUdlbmVyYXRvci5jbGFzcykgPT0gSnBhQ29yZU1hcHBpbmdzUGFja2FnZS5JVEFCTEVfR0VORVJBVE9SX19TUEVDSUZJRURfVkFMVUVfQ09MVU1OX05BTUUpIHsKLQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCVN0cmluZyBjb2x1bW5OYW1lID0gZ2V0R2VuZXJhdG9yKCkuZ2V0U3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lKCk7Ci0JCQkJCWlmIChjb2x1bW5OYW1lID09IG51bGwpIHsKLQkJCQkJCXZhbHVlQ29sdW1uTmFtZUNvbWJvLnNlbGVjdCgwKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmICghdmFsdWVDb2x1bW5OYW1lQ29tYm8uZ2V0VGV4dCgpLmVxdWFscyhjb2x1bW5OYW1lKSkgewotCQkJCQkJdmFsdWVDb2x1bW5OYW1lQ29tYm8uc2V0VGV4dChjb2x1bW5OYW1lKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCWVsc2UgaWYgKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSVRhYmxlR2VuZXJhdG9yLmNsYXNzKSA9PSBKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLklUQUJMRV9HRU5FUkFUT1JfX1NQRUNJRklFRF9QS19DT0xVTU5fVkFMVUUpIHsKLQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCVN0cmluZyBjb2x1bW5WYWx1ZSA9IGdldEdlbmVyYXRvcigpLmdldFNwZWNpZmllZFBrQ29sdW1uVmFsdWUoKTsKLQkJCQkJaWYgKGNvbHVtblZhbHVlID09IG51bGwpIHsKLQkJCQkJCXBrQ29sdW1uVmFsdWVDb21iby5zZWxlY3QoMCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoIXBrQ29sdW1uVmFsdWVDb21iby5nZXRUZXh0KCkuZXF1YWxzKGNvbHVtblZhbHVlKSkgewotCQkJCQkJcGtDb2x1bW5WYWx1ZUNvbWJvLnNldFRleHQoY29sdW1uVmFsdWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb1BvcHVsYXRlKEVPYmplY3Qgb2JqKSB7Ci0JCXN1cGVyLmRvUG9wdWxhdGUob2JqKTsKLQkJaWYgKG9iaiA9PSBudWxsKSB7Ci0JCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlID0gbnVsbDsKLQkJCXJldHVybjsKLQkJfQotCQlwb3B1bGF0ZVRhYmxlTmFtZUNvbWJvKCk7Ci0JCXBvcHVsYXRlUGtDb2x1bW5OYW1lQ29tYm8oKTsKLQkJcG9wdWxhdGVWYWx1ZUNvbHVtbk5hbWVDb21ibygpOwotCQlwb3B1bGF0ZVBrQ29sdW1uVmFsdWVDb21ibygpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvUG9wdWxhdGUoKSB7Ci0JCXN1cGVyLmRvUG9wdWxhdGUoKTsKLQkJcG9wdWxhdGVUYWJsZU5hbWVDb21ibygpOwotCQlwb3B1bGF0ZVBrQ29sdW1uTmFtZUNvbWJvKCk7Ci0JCXBvcHVsYXRlVmFsdWVDb2x1bW5OYW1lQ29tYm8oKTsKLQkJcG9wdWxhdGVQa0NvbHVtblZhbHVlQ29tYm8oKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTGlzdGVuZXJzKCkgewotCQlzdXBlci5lbmdhZ2VMaXN0ZW5lcnMoKTsKLQkJaWYgKGdldEdlbmVyYXRvcigpICE9IG51bGwpIHsKLQkJCWFkZENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTGlzdGVuZXJzKCkgewotCQlpZiAoZ2V0R2VuZXJhdG9yKCkgIT0gbnVsbCkgewotCQkJcmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCX0KLQkJc3VwZXIuZGlzZW5nYWdlTGlzdGVuZXJzKCk7Ci0JfQotCQotCXByaXZhdGUgQ29ubmVjdGlvblByb2ZpbGUgZ2V0Q29ubmVjdGlvblByb2ZpbGUoKSB7Ci0JCWlmKHRoaXMuY29ubmVjdGlvblByb2ZpbGUgPT0gbnVsbCkgewotCQkJSUpwYVByb2plY3QganBhUHJvamVjdCA9IGlkTWFwcGluZygpLmdldEpwYVByb2plY3QoKTsKLQkJCXRoaXMuY29ubmVjdGlvblByb2ZpbGUgPSBqcGFQcm9qZWN0LmNvbm5lY3Rpb25Qcm9maWxlKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuY29ubmVjdGlvblByb2ZpbGU7Ci0JfQotCQotCi0JcHJpdmF0ZSB2b2lkIGFkZENvbm5lY3Rpb25MaXN0ZW5lcigpIHsKLQkJdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZSgpLmFkZENvbm5lY3Rpb25MaXN0ZW5lcih0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCByZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIodGhpcy5jb25uZWN0aW9uTGlzdGVuZXIpOwotCX0KLQotCXByb3RlY3RlZCBTY2hlbWEgZ2V0U2NoZW1hKCkgewotCQlpZiAoZ2V0R2VuZXJhdG9yKCkgIT0gbnVsbCkgewotCQkJcmV0dXJuIHRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKS5nZXREYXRhYmFzZSgpLnNjaGVtYU5hbWVkKGdldEdlbmVyYXRvcigpLmdldFNjaGVtYSgpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlVGFibGVOYW1lQ29tYm8oKSB7Ci0JCWlmICh0aGlzLmdldEdlbmVyYXRvcigpID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAodGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZSgpLmlzQ29ubmVjdGVkKCkpIHsKLQkJCXRoaXMudGFibGVOYW1lQ29tYm8ucmVtb3ZlKDEsIHRoaXMudGFibGVOYW1lQ29tYm8uZ2V0SXRlbUNvdW50KCktMSk7Ci0JCQlTY2hlbWEgc2NoZW1hID0gdGhpcy5nZXRTY2hlbWEoKTsKLQkJCWlmIChzY2hlbWEgIT0gbnVsbCkgewotCQkJCUl0ZXJhdG9yPFN0cmluZz4gdGFibGVzID0gc2NoZW1hLnRhYmxlTmFtZXMoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gQ29sbGVjdGlvblRvb2xzLnNvcnQodGFibGVzKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQkJCXRoaXMudGFibGVOYW1lQ29tYm8uYWRkKHN0cmVhbS5uZXh0KCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlTdHJpbmcgdGFibGVOYW1lID0gdGhpcy5nZXRHZW5lcmF0b3IoKS5nZXRTcGVjaWZpZWRUYWJsZSgpOwotCQlpZiAodGFibGVOYW1lICE9IG51bGwpIHsKLQkJCWlmICghdGhpcy50YWJsZU5hbWVDb21iby5nZXRUZXh0KCkuZXF1YWxzKHRhYmxlTmFtZSkpIHsKLQkJCQl0aGlzLnRhYmxlTmFtZUNvbWJvLnNldFRleHQodGFibGVOYW1lKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXRoaXMudGFibGVOYW1lQ29tYm8uc2VsZWN0KDApOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlUGtDb2x1bW5OYW1lQ29tYm8oKSB7Ci0JCWlmICh0aGlzLmdldEdlbmVyYXRvcigpID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlwb3B1bGF0ZVBrQ29sdW1uQ2hvaWNlcygpOwotCQlwb3B1bGF0ZVBrQ29sdW1uTmFtZSgpOwotCX0KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVQa0NvbHVtbkNob2ljZXMoKSB7Ci0JCXRoaXMucGtDb2x1bW5OYW1lQ29tYm8ucmVtb3ZlKDEsIHRoaXMucGtDb2x1bW5OYW1lQ29tYm8uZ2V0SXRlbUNvdW50KCkgLSAxKTsKLQkJCi0JCWlmICh0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlKCkuaXNDb25uZWN0ZWQoKSkgewotCQkJaWYgKCF0aGlzLnRhYmxlTmFtZUNvbWJvLmdldFRleHQoKS5lcXVhbHMoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX2RlZmF1bHQpKSB7IC8vIGhtbSwKLQkJCQkvLyBpZgotCQkJCS8vIHRoZXkKLQkJCQkvLyBhY3R1YWxseQotCQkJCS8vIHNldAotCQkJCS8vIHRoZQotCQkJCS8vIHRhYmxlCi0JCQkJLy8gdG8KLQkJCQkvLyBEZWZhdWx0Pz8KLQkJCQlTdHJpbmcgdGFibGVOYW1lID0gdGhpcy50YWJsZU5hbWVDb21iby5nZXRUZXh0KCk7Ci0JCQkJU2NoZW1hIHNjaGVtYSA9IGdldFNjaGVtYSgpOwotCQkJCWlmIChzY2hlbWEgIT0gbnVsbCkgewotCQkJCQlUYWJsZSB0YWJsZSA9IHNjaGVtYS50YWJsZU5hbWVkKHRhYmxlTmFtZSk7Ci0JCQkJCWlmICh0YWJsZSAhPSBudWxsKSB7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gQ29sbGVjdGlvblRvb2xzLnNvcnQodGFibGUuY29sdW1uTmFtZXMoKSk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJdGhpcy5wa0NvbHVtbk5hbWVDb21iby5hZGQoc3RyZWFtLm5leHQoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlUGtDb2x1bW5OYW1lKCkgewotCQlTdHJpbmcgcGtDb2x1bW5OYW1lID0gdGhpcy5nZXRHZW5lcmF0b3IoKS5nZXRTcGVjaWZpZWRQa0NvbHVtbk5hbWUoKTsKLQkJaWYgKHBrQ29sdW1uTmFtZSAhPSBudWxsKSB7Ci0JCQlpZiAoIXRoaXMucGtDb2x1bW5OYW1lQ29tYm8uZ2V0VGV4dCgpLmVxdWFscyhwa0NvbHVtbk5hbWUpKSB7Ci0JCQkJdGhpcy5wa0NvbHVtbk5hbWVDb21iby5zZXRUZXh0KHBrQ29sdW1uTmFtZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLnBrQ29sdW1uTmFtZUNvbWJvLnNlbGVjdCgwKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZVZhbHVlQ29sdW1uTmFtZUNvbWJvKCkgewotCQlpZiAodGhpcy5nZXRHZW5lcmF0b3IoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKHRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKS5pc0Nvbm5lY3RlZCgpKSB7Ci0JCQl0aGlzLnZhbHVlQ29sdW1uTmFtZUNvbWJvLnJlbW92ZSgxLCB0aGlzLnZhbHVlQ29sdW1uTmFtZUNvbWJvLmdldEl0ZW1Db3VudCgpIC0gMSk7Ci0JCQlpZiAoIXRoaXMudGFibGVOYW1lQ29tYm8uZ2V0VGV4dCgpLmVxdWFscyhKcHRVaU1hcHBpbmdzTWVzc2FnZXMuVGFibGVHZW5lcmF0b3JDb21wb3NpdGVfZGVmYXVsdCkpIHsgLy8gaG1tLAotCQkJCS8vIGlmCi0JCQkJLy8gdGhleQotCQkJCS8vIGFjdHVhbGx5Ci0JCQkJLy8gc2V0Ci0JCQkJLy8gdGhlCi0JCQkJLy8gdGFibGUKLQkJCQkvLyB0bwotCQkJCS8vIERlZmF1bHQ/PwotCQkJCVN0cmluZyB0YWJsZU5hbWUgPSB0aGlzLnRhYmxlTmFtZUNvbWJvLmdldFRleHQoKTsKLQkJCQlTY2hlbWEgc2NoZW1hID0gZ2V0U2NoZW1hKCk7Ci0JCQkJaWYgKHNjaGVtYSAhPSBudWxsKSB7Ci0JCQkJCVRhYmxlIHRhYmxlID0gc2NoZW1hLnRhYmxlTmFtZWQodGFibGVOYW1lKTsKLQkJCQkJaWYgKHRhYmxlICE9IG51bGwpIHsKLQkJCQkJCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSBDb2xsZWN0aW9uVG9vbHMuc29ydCh0YWJsZS5jb2x1bW5OYW1lcygpKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCQkJCQl0aGlzLnZhbHVlQ29sdW1uTmFtZUNvbWJvLmFkZChzdHJlYW0ubmV4dCgpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlTdHJpbmcgdmFsdWVDb2x1bW5OYW1lID0gdGhpcy5nZXRHZW5lcmF0b3IoKS5nZXRTcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWUoKTsKLQkJaWYgKHZhbHVlQ29sdW1uTmFtZSAhPSBudWxsKSB7Ci0JCQlpZiAoIXRoaXMudmFsdWVDb2x1bW5OYW1lQ29tYm8uZ2V0VGV4dCgpLmVxdWFscyh2YWx1ZUNvbHVtbk5hbWUpKSB7Ci0JCQkJdGhpcy52YWx1ZUNvbHVtbk5hbWVDb21iby5zZXRUZXh0KHZhbHVlQ29sdW1uTmFtZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLnZhbHVlQ29sdW1uTmFtZUNvbWJvLnNlbGVjdCgwKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZVBrQ29sdW1uVmFsdWVDb21ibygpIHsKLQkJaWYgKHRoaXMuZ2V0R2VuZXJhdG9yKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCVN0cmluZyBwa0NvbHVtblZhbHVlID0gdGhpcy5nZXRHZW5lcmF0b3IoKS5nZXRTcGVjaWZpZWRQa0NvbHVtblZhbHVlKCk7Ci0JCWlmIChwa0NvbHVtblZhbHVlICE9IG51bGwpIHsKLQkJCWlmICghdGhpcy5wa0NvbHVtblZhbHVlQ29tYm8uZ2V0VGV4dCgpLmVxdWFscyhwa0NvbHVtblZhbHVlKSkgewotCQkJCXRoaXMucGtDb2x1bW5WYWx1ZUNvbWJvLnNldFRleHQocGtDb2x1bW5WYWx1ZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLnBrQ29sdW1uVmFsdWVDb21iby5zZWxlY3QoMCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjbGVhcigpIHsKLQkJc3VwZXIuY2xlYXIoKTsKLQkJdGhpcy50YWJsZU5hbWVDb21iby5zZWxlY3QoMCk7Ci0JCXRoaXMucGtDb2x1bW5OYW1lQ29tYm8uc2VsZWN0KDApOwotCQl0aGlzLnBrQ29sdW1uVmFsdWVDb21iby5zZWxlY3QoMCk7Ci0JCXRoaXMudmFsdWVDb2x1bW5OYW1lQ29tYm8uc2VsZWN0KDApOwotCX0KLQkKLQlwcml2YXRlIENvbm5lY3Rpb25MaXN0ZW5lciBidWlsZENvbm5lY3Rpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDb25uZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjbG9zZWQoQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7Ci0JCQkJcG9wdWxhdGUoKTsKLQkJCX0KLQkJCQotCQkJcHVibGljIHZvaWQgbW9kaWZpZWQoQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7Ci0JCQkJcG9wdWxhdGUoKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgb3BlbmVkKENvbm5lY3Rpb24gY29ubmVjdGlvbikgewotCQkJCXBvcHVsYXRlKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGRhdGFiYXNlQ2hhbmdlZChDb25uZWN0aW9uIGNvbm5lY3Rpb24sIGZpbmFsIERhdGFiYXNlIGRhdGFiYXNlKSB7Ci0JCQkJcG9wdWxhdGUoKTsKLQkJCX0KLQkJCQotCQkJcHVibGljIHZvaWQgc2NoZW1hQ2hhbmdlZChDb25uZWN0aW9uIGNvbm5lY3Rpb24sIGZpbmFsIFNjaGVtYSBzY2hlbWEpIHsKLQkJCQlwb3B1bGF0ZSgpOwotCQkJfQotCi0JCQlwcml2YXRlIHZvaWQgcG9wdWxhdGUoKSB7Ci0JCQkJZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMoIG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJaWYgKGdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQlwb3B1bGF0ZVRhYmxlTmFtZUNvbWJvKCk7Ci0JCQkJCQlwb3B1bGF0ZVBrQ29sdW1uQ2hvaWNlcygpOwotCQkJCQkJcG9wdWxhdGVWYWx1ZUNvbHVtbk5hbWVDb21ibygpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyB2b2lkIGFib3V0VG9DbG9zZShDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKLQkJCQkvLyBub3QgaW50ZXJlc3RlZCB0byB0aGlzIGV2ZW50LgotCQkJfQotCQkJCi0JCQlwdWJsaWMgYm9vbGVhbiBva1RvQ2xvc2UoQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7Ci0JCQkJLy8gbm90IGludGVyZXN0ZWQgdG8gdGhpcyBldmVudC4KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCQotCQkJcHVibGljIHZvaWQgdGFibGVDaGFuZ2VkKENvbm5lY3Rpb24gY29ubmVjdGlvbiwgZmluYWwgVGFibGUgdGFibGUpIHsKLQkJCQkvLyBub3QgaW50ZXJlc3RlZCB0byB0aGlzIGV2ZW50LgotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvVGFyZ2V0RW50aXR5Q2hvb3Nlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9UYXJnZXRFbnRpdHlDaG9vc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkNWU3NmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9UYXJnZXRFbnRpdHlDaG9vc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoRW5naW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5JSmF2YUVsZW1lbnRTZWFyY2hDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklSZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLkpwYUNvcmVNYXBwaW5nc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLklKcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5CYXNlSnBhQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5TZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBUYXJnZXRFbnRpdHlDaG9vc2VyIGV4dGVuZHMgQmFzZUpwYUNvbnRyb2xsZXIKLXsKLQlwcml2YXRlIElSZWxhdGlvbnNoaXBNYXBwaW5nIHJlbGF0aW9uc2hpcE1hcHBpbmc7Ci0JcHJpdmF0ZSBBZGFwdGVyIHJlbGF0aW9uc2hpcE1hcHBpbmdMaXN0ZW5lcjsKLQkKLQlwcm90ZWN0ZWQgQ0NvbWJvIHRhcmdldEVudGl0eUNvbWJvOwotCi0JCi0JcHJpdmF0ZSBDb21wb3NpdGUgY29tcG9zaXRlOwotCQotCXB1YmxpYyBUYXJnZXRFbnRpdHlDaG9vc2VyKENvbXBvc2l0ZSBwYXJlbnQsIENvbW1hbmRTdGFjayB0aGVDb21tYW5kU3RhY2ssIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJc3VwZXIocGFyZW50LCB0aGVDb21tYW5kU3RhY2ssIHdpZGdldEZhY3RvcnkpOwotCQlidWlsZFJlbGF0aW9uc2hpcE1hcHBpbmdMaXN0ZW5lcigpOwotCX0KLQkKLQkKLQlwcml2YXRlIHZvaWQgYnVpbGRSZWxhdGlvbnNoaXBNYXBwaW5nTGlzdGVuZXIoKSB7Ci0JCXJlbGF0aW9uc2hpcE1hcHBpbmdMaXN0ZW5lciA9IG5ldyBBZGFwdGVySW1wbCgpIHsKLQkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkJCXJlbGF0aW9uc2hpcE1hcHBpbmdDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGJ1aWxkV2lkZ2V0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5jb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ29tcG9zaXRlKHBhcmVudCk7Ci0JICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JICAgIGdyaWRMYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkgICAgZ3JpZExheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JICAgIGdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JICAgIHRoaXMuY29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLQkJCi0JCUNvbW1vbldpZGdldHMuYnVpbGRUYXJnZXRFbnRpdHlMYWJlbCh0aGlzLmNvbXBvc2l0ZSwgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQkJCi0JCXRoaXMudGFyZ2V0RW50aXR5Q29tYm8gPSBidWlsZFRhcmdldEVudGl0eUNvbWJvKHRoaXMuY29tcG9zaXRlKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQl0aGlzLnRhcmdldEVudGl0eUNvbWJvLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCWJ1aWxkVGFyZ2V0RW50aXR5U2VsZWN0aW9uQnV0dG9uKHRoaXMuY29tcG9zaXRlKTsKLQotCX0KLQkKLQlwcm90ZWN0ZWQgQ0NvbWJvIGJ1aWxkVGFyZ2V0RW50aXR5Q29tYm8oQ29tcG9zaXRlIHBhcmVudCkgewotCQlmaW5hbCBDQ29tYm8gY29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKHBhcmVudCwgU1dULkZMQVQpOwotCQljb21iby5hZGQoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlRhcmdldEVudGl0eUNob29zZXJfZGVmYXVsdEVtcHR5KTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb21ibywgSUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfVEFSR0VUX0VOVElUWSk7Ci0JCWNvbWJvLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCWlmIChpc1BvcHVsYXRpbmcoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyB0YXJnZXRFbnRpdHlOYW1lID0gKChDQ29tYm8pIGUuZ2V0U291cmNlKCkpLmdldFRleHQoKTsKLQkJCQlpZiAodGFyZ2V0RW50aXR5TmFtZS5lcXVhbHMoY29tYm8uZ2V0SXRlbSgwKSkgfHwgdGFyZ2V0RW50aXR5TmFtZS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJdGFyZ2V0RW50aXR5TmFtZSA9IG51bGw7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKCFyZWxhdGlvbnNoaXBNYXBwaW5nLnRhcmdldEVudGl0eUlzVmFsaWQodGFyZ2V0RW50aXR5TmFtZSkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlyZWxhdGlvbnNoaXBNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSh0YXJnZXRFbnRpdHlOYW1lKTsKLQkJCX0KLQkJfSk7Ci0JCXJldHVybiBjb21ibzsKLQl9Ci0KLQotCXByaXZhdGUgdm9pZCByZWxhdGlvbnNoaXBNYXBwaW5nQ2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCWlmIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKElSZWxhdGlvbnNoaXBNYXBwaW5nLmNsYXNzKSA9PSAKLQkJCQlKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLklSRUxBVElPTlNISVBfTUFQUElOR19fU1BFQ0lGSUVEX1RBUkdFVF9FTlRJVFkpIHsKLQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYygKLQkJCQluZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCXBvcHVsYXRlKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJfQotCQllbHNlIGlmIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKElSZWxhdGlvbnNoaXBNYXBwaW5nLmNsYXNzKSA9PSAKLQkJCUpwYUNvcmVNYXBwaW5nc1BhY2thZ2UuSVJFTEFUSU9OU0hJUF9NQVBQSU5HX19ERUZBVUxUX1RBUkdFVF9FTlRJVFkpIHsKLQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKAotCQkJbmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJcG9wdWxhdGUoKTsKLQkJCQl9Ci0JCQl9KTsKLQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUxpc3RlbmVycygpIHsKLQkJaWYgKHJlbGF0aW9uc2hpcE1hcHBpbmcgIT0gbnVsbCkgewotCQkJcmVsYXRpb25zaGlwTWFwcGluZy5lQWRhcHRlcnMoKS5hZGQocmVsYXRpb25zaGlwTWFwcGluZ0xpc3RlbmVyKTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VMaXN0ZW5lcnMoKSB7Ci0JCWlmICh0aGlzLnJlbGF0aW9uc2hpcE1hcHBpbmcgIT0gbnVsbCkgewotCQkJdGhpcy5yZWxhdGlvbnNoaXBNYXBwaW5nLmVBZGFwdGVycygpLnJlbW92ZShyZWxhdGlvbnNoaXBNYXBwaW5nTGlzdGVuZXIpOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRvUG9wdWxhdGUoRU9iamVjdCBvYmopIHsKLQkJdGhpcy5yZWxhdGlvbnNoaXBNYXBwaW5nID0gKElSZWxhdGlvbnNoaXBNYXBwaW5nKSBvYmo7Ci0JCXBvcHVsYXRlQ29tYm8oKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9Qb3B1bGF0ZSgpIHsKLQkJcG9wdWxhdGVDb21ibygpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVDb21ibygpIHsKLQkJaWYgKHJlbGF0aW9uc2hpcE1hcHBpbmcgPT0gbnVsbCkgewotCQkJdGFyZ2V0RW50aXR5Q29tYm8uY2xlYXJTZWxlY3Rpb24oKTsKLQkJCXJldHVybjsKLQkJfQotCQlTdHJpbmcgdGFyZ2V0RW50aXR5ID0gdGhpcy5yZWxhdGlvbnNoaXBNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpOwotCQl0aGlzLnRhcmdldEVudGl0eUNvbWJvLnNldEl0ZW0oMCwgTkxTLmJpbmQoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlRhcmdldEVudGl0eUNob29zZXJfZGVmYXVsdFdpdGhPbmVQYXJhbSwgdGhpcy5yZWxhdGlvbnNoaXBNYXBwaW5nLmdldERlZmF1bHRUYXJnZXRFbnRpdHkoKSkpOwotCQlpZiAodGFyZ2V0RW50aXR5ICE9IG51bGwpIHsKLQkJCWlmICghdGhpcy50YXJnZXRFbnRpdHlDb21iby5nZXRUZXh0KCkuZXF1YWxzKHRhcmdldEVudGl0eSkpIHsKLQkJCQl0aGlzLnRhcmdldEVudGl0eUNvbWJvLnNldFRleHQodGFyZ2V0RW50aXR5KTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWlmICh0aGlzLnRhcmdldEVudGl0eUNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkgIT0gMCkgewotCQkJCXRoaXMudGFyZ2V0RW50aXR5Q29tYm8uc2VsZWN0KDApOwotCQkJfQotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKSB7Ci0JCXJldHVybiB0aGlzLmNvbXBvc2l0ZTsKLQl9CQotCQotCS8vc2VlICBvcmcuZWNsaXBzZS5wZGUuaW50ZXJuYWwudWkuZWRpdG9yLnBsdWdpbi5yb3dzLkNsYXNzQXR0cmlidXRlUm93Ci0JLy9mb3IgZXhhbXBsZSBvZiB0aGUgaHlwZXJsaW5rIG9wZW5pbmcgYSByZXNvdXJjZQotCXByb3RlY3RlZCBCdXR0b24gYnVpbGRUYXJnZXRFbnRpdHlTZWxlY3Rpb25CdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5QVVNIKTsKLQkJYnV0dG9uLnNldFRleHQoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLlRhcmdldEVudGl0eUNob29zZXJfYnJvd3NlKTsKLQkJYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWJyb3dzZSgpOwotCQkJfQotCQl9KTsKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYnJvd3NlKCkgewotCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZSh0aGlzLnRhcmdldEVudGl0eUNvbWJvLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWRvT3BlblNlbGVjdGlvbkRpYWxvZygpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZG9PcGVuU2VsZWN0aW9uRGlhbG9nKCkgewotCQlTZWxlY3Rpb25EaWFsb2cgZGlhbG9nOwotCQl0cnkgewotCQkJZGlhbG9nID0gSmF2YVVJLmNyZWF0ZVR5cGVEaWFsb2coZ2V0Q29udHJvbCgpLmdldFNoZWxsKCksCi0JCQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCksCi0JCQkJCVNlYXJjaEVuZ2luZS5jcmVhdGVXb3Jrc3BhY2VTY29wZSgpLAotCQkJCQlJSmF2YUVsZW1lbnRTZWFyY2hDb25zdGFudHMuQ09OU0lERVJfQUxMX1RZUEVTLCAKLQkJCSAgICAgICAgZmFsc2UsCi0JCQkJCSIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0JCX0gCi0JCWRpYWxvZy5zZXRUaXRsZSgiU2VsZWN0IFR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCUlUeXBlIHR5cGUgPSAoSVR5cGUpIGRpYWxvZy5nZXRSZXN1bHQoKVswXTsKLQkJCXRoaXMudGFyZ2V0RW50aXR5Q29tYm8uc2V0VGV4dCh0eXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgnJCcpKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvVHJhbnNpZW50Q29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9tYXBwaW5ncy9kZXRhaWxzL1RyYW5zaWVudENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODcxZThhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvVHJhbnNpZW50Q29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5CYXNlSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgVHJhbnNpZW50Q29tcG9zaXRlIGV4dGVuZHMgQmFzZUpwYUNvbXBvc2l0ZSAKLXsKLQlwdWJsaWMgVHJhbnNpZW50Q29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIENvbW1hbmRTdGFjayBjb21tYW5kU3RhY2ssIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJc3VwZXIocGFyZW50LCBTV1QuTlVMTCwgY29tbWFuZFN0YWNrLCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0KLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgZG9Qb3B1bGF0ZShFT2JqZWN0IG9iaikgewotCX0KLQkKLQlwdWJsaWMgdm9pZCBkb1BvcHVsYXRlKCkgewotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VMaXN0ZW5lcnMoKSB7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZUxpc3RlbmVycygpIHsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL21hcHBpbmdzL2RldGFpbHMvVmVyc2lvbkNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9WZXJzaW9uQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlN2ZiNjUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvbWFwcGluZ3MvZGV0YWlscy9WZXJzaW9uQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSUJhc2ljOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLkpwYUNvcmVNYXBwaW5nc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuVGVtcG9yYWxUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkJhc2VKcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHMuRW51bUNvbWJvVmlld2VyLkVudW1Ib2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLQotcHVibGljIGNsYXNzIFZlcnNpb25Db21wb3NpdGUgZXh0ZW5kcyBCYXNlSnBhQ29tcG9zaXRlIAotewotCXByaXZhdGUgSVZlcnNpb24gdmVyc2lvbjsKLQkKLQlwcml2YXRlIENvbHVtbkNvbXBvc2l0ZSBjb2x1bW5Db21wb3NpdGU7Ci0KLQlwcml2YXRlIEVudW1Db21ib1ZpZXdlciB0ZW1wb3JhbFR5cGVWaWV3ZXI7Ci0JCi0KLQlwdWJsaWMgVmVyc2lvbkNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrLCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULk5VTEwsIGNvbW1hbmRTdGFjaywgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQotCQlDb250cm9sIGdlbmVyYWxDb250cm9sID0gYnVpbGRHZW5lcmFsQ29tcG9zaXRlKGNvbXBvc2l0ZSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ2VuZXJhbENvbnRyb2wuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQl9Ci0JCi0JcHJpdmF0ZSBDb250cm9sIGJ1aWxkR2VuZXJhbENvbXBvc2l0ZShDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0vLwkJSVdvcmtiZW5jaEhlbHBTeXN0ZW0gaGVscFN5c3RlbSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpOwotCQkKLQkJQ29tcG9zaXRlIGdlbmVyYWxDb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ29tcG9zaXRlKGNvbXBvc2l0ZSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlnZW5lcmFsQ29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwkKLQotCQl0aGlzLmNvbHVtbkNvbXBvc2l0ZSA9IG5ldyBDb2x1bW5Db21wb3NpdGUoZ2VuZXJhbENvbXBvc2l0ZSwgdGhpcy5jb21tYW5kU3RhY2ssIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQl0aGlzLmNvbHVtbkNvbXBvc2l0ZS5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7CQkKLQkJCi0JCUNvbW1vbldpZGdldHMuYnVpbGRUZW1wb3JhbExhYmVsKGdlbmVyYWxDb21wb3NpdGUsIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCXRoaXMudGVtcG9yYWxUeXBlVmlld2VyID0gQ29tbW9uV2lkZ2V0cy5idWlsZEVudW1Db21ib1ZpZXdlcihnZW5lcmFsQ29tcG9zaXRlLCB0aGlzLmNvbW1hbmRTdGFjaywgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5CRUdJTk5JTkc7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQl0aGlzLnRlbXBvcmFsVHlwZVZpZXdlci5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJcmV0dXJuIGdlbmVyYWxDb21wb3NpdGU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRvUG9wdWxhdGUoRU9iamVjdCBvYmopIHsKLQkJdGhpcy52ZXJzaW9uID0gKElWZXJzaW9uKSBvYmo7Ci0JCWlmICh0aGlzLnZlcnNpb24gIT0gbnVsbCkgewotCQkJdGhpcy5jb2x1bW5Db21wb3NpdGUucG9wdWxhdGUodGhpcy52ZXJzaW9uLmdldENvbHVtbigpKTsKLQkJfQotCQllbHNlIHsKLQkJCXRoaXMuY29sdW1uQ29tcG9zaXRlLnBvcHVsYXRlKG51bGwpOwotCQl9Ci0JCXRoaXMudGVtcG9yYWxUeXBlVmlld2VyLnBvcHVsYXRlKG5ldyBUZW1wb3JhbFR5cGVIb2xkZXIodGhpcy52ZXJzaW9uKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRvUG9wdWxhdGUoKSB7Ci0JCXRoaXMuY29sdW1uQ29tcG9zaXRlLnBvcHVsYXRlKCk7Ci0JCXRoaXMudGVtcG9yYWxUeXBlVmlld2VyLnBvcHVsYXRlKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUxpc3RlbmVycygpIHsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTGlzdGVuZXJzKCkgewotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl0aGlzLmNvbHVtbkNvbXBvc2l0ZS5kaXNwb3NlKCk7Ci0JCXRoaXMudGVtcG9yYWxUeXBlVmlld2VyLmRpc3Bvc2UoKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSVZlcnNpb24gZ2V0VmVyc2lvbigpIHsKLQkJcmV0dXJuIHRoaXMudmVyc2lvbjsKLQl9Ci0JCi0KLQotCQotCXByaXZhdGUgY2xhc3MgVGVtcG9yYWxUeXBlSG9sZGVyIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBFbnVtSG9sZGVyIHsKLQkJCi0JCXByaXZhdGUgSVZlcnNpb24gdmVyc2lvbjsKLQkJCi0JCVRlbXBvcmFsVHlwZUhvbGRlcihJVmVyc2lvbiB2ZXJzaW9uKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKLQkJfQotCQkKLQkJcHVibGljIE9iamVjdCBnZXQoKSB7Ci0JCQlyZXR1cm4gdGhpcy52ZXJzaW9uLmdldFRlbXBvcmFsKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNldChPYmplY3QgZW51bVNldHRpbmcpIHsKLQkJCXRoaXMudmVyc2lvbi5zZXRUZW1wb3JhbCgoVGVtcG9yYWxUeXBlKSBlbnVtU2V0dGluZyk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBDbGFzcyBmZWF0dXJlQ2xhc3MoKSB7Ci0JCQlyZXR1cm4gSUJhc2ljLmNsYXNzOwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGZlYXR1cmVJZCgpIHsKLQkJCXJldHVybiBKcGFDb3JlTWFwcGluZ3NQYWNrYWdlLklWRVJTSU9OX19URU1QT1JBTDsKLQkJfQotCQkKLQkJcHVibGljIEVPYmplY3Qgd3JhcHBlZE9iamVjdCgpIHsKLQkJCXJldHVybiB0aGlzLnZlcnNpb247Ci0JCX0KLQkJCi0JCXB1YmxpYyBPYmplY3RbXSBlbnVtVmFsdWVzKCkgewotCQkJcmV0dXJuIFRlbXBvcmFsVHlwZS5WQUxVRVMudG9BcnJheSgpOwotCQl9Ci0JCQotCQkvKioKLQkJICogVGVtcG9yYWxUeXBlIGhhcyBubyBEZWZhdWx0LCByZXR1cm4gbnVsbAotCQkgKi8KLQkJcHVibGljIE9iamVjdCBkZWZhdWx0VmFsdWUoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIFRlbXBvcmFsVHlwZSBoYXMgbm8gRGVmYXVsdCwgcmV0dXJuIG51bGwKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZGVmYXVsdFN0cmluZygpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wZXJzcGVjdGl2ZS9KcGFQZXJzcGVjdGl2ZUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BlcnNwZWN0aXZlL0pwYVBlcnNwZWN0aXZlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTQxY2NmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3BlcnNwZWN0aXZlL0pwYVBlcnNwZWN0aXZlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gICAgICAgIAotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGb2xkZXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhZ2VMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcm9ncmVzcy5JUHJvZ3Jlc3NDb25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBKcGFQZXJzcGVjdGl2ZUZhY3RvcnkgaW1wbGVtZW50cyBJUGVyc3BlY3RpdmVGYWN0b3J5IHsKLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUluaXRpYWxMYXlvdXQoSVBhZ2VMYXlvdXQgbGF5b3V0KSB7Ci0JCVN0cmluZyBlZGl0b3JBcmVhID0gbGF5b3V0LmdldEVkaXRvckFyZWEoKTsKLQotCQkvL1BhY2thZ2UgYXJlYQotCQlJRm9sZGVyTGF5b3V0IGZvbGRlciA9IGxheW91dC5jcmVhdGVGb2xkZXIoCi0JCQkJImxlZnQiLCBJUGFnZUxheW91dC5MRUZULCAoZmxvYXQpIDAuMjUsIGVkaXRvckFyZWEpOyAvLyROT04tTkxTLTEkCi0JCWZvbGRlci5hZGRWaWV3KEphdmFVSS5JRF9QQUNLQUdFUyk7Ci0JCWZvbGRlci5hZGRQbGFjZWhvbGRlcihKYXZhVUkuSURfVFlQRV9ISUVSQVJDSFkpOwotCQlmb2xkZXIuYWRkUGxhY2Vob2xkZXIoSVBhZ2VMYXlvdXQuSURfUkVTX05BVik7Ci0KLQkJLy9EYXRhYmFzZSBFeHBsb3JlciBhcmVhCi0JCWxheW91dC5hZGRWaWV3KCJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LkRhdGFTb3VyY2VFeHBsb3Jlck5hdmlnYXRvciIsIC8vJE5PTi1OTFMtMSQKLQkJCUlQYWdlTGF5b3V0LkJPVFRPTSwgKGZsb2F0KSAwLjYwLCBKYXZhVUkuSURfUEFDS0FHRVMpOwotCi0JCS8vUHJvYmxlbXMvQ29uc29sZSBhcmVhCi0JCUlGb2xkZXJMYXlvdXQgb3V0cHV0Rm9sZGVyID0gbGF5b3V0LmNyZWF0ZUZvbGRlcigKLQkJCQkiYm90dG9tIiwgSVBhZ2VMYXlvdXQuQk9UVE9NLCAoZmxvYXQpIDAuNjAsIGVkaXRvckFyZWEpOyAvLyROT04tTkxTLTEkCi0JCW91dHB1dEZvbGRlci5hZGRWaWV3KElQYWdlTGF5b3V0LklEX1BST0JMRU1fVklFVyk7Ci0JCW91dHB1dEZvbGRlci5hZGRQbGFjZWhvbGRlcihJUGFnZUxheW91dC5JRF9CT09LTUFSS1MpOwotCQlvdXRwdXRGb2xkZXIuYWRkUGxhY2Vob2xkZXIoSVByb2dyZXNzQ29uc3RhbnRzLlBST0dSRVNTX1ZJRVdfSUQpOwotCi0JCS8vSlBBIERldGFpbHMgKFNwbGl0IHdpdGggUHJvYmxlbXMvQ29uc29sZSBhcmVhKQotCQlsYXlvdXQuYWRkVmlldygib3JnLmVjbGlwc2UuanB0LnVpLmpwYURldGFpbHNWaWV3IiwKLQkJCQlJUGFnZUxheW91dC5SSUdIVCwgKGZsb2F0KSAuNjAsICJib3R0b20iKTsKLQkJCi0JCS8vSlBBIFN0cnVjdHVyZSBhcmVhCi0JCUlGb2xkZXJMYXlvdXQgb3V0bGluZUZvbGRlciA9IGxheW91dC5jcmVhdGVGb2xkZXIoCi0JCQkJInJpZ2h0IiwgSVBhZ2VMYXlvdXQuUklHSFQsIChmbG9hdCkgMC43NSwgZWRpdG9yQXJlYSk7IC8vJE5PTi1OTFMtMSQKLQkJb3V0bGluZUZvbGRlci5hZGRWaWV3KCJvcmcuZWNsaXBzZS5qcHQudWkuanBhU3RydWN0dXJlVmlldyIpOwotCQlvdXRsaW5lRm9sZGVyLmFkZFZpZXcoSVBhZ2VMYXlvdXQuSURfT1VUTElORSk7Ci0KLQkJbGF5b3V0LmFkZEFjdGlvblNldChKYXZhVUkuSURfQUNUSU9OX1NFVCk7Ci0JCWxheW91dC5hZGRBY3Rpb25TZXQoSmF2YVVJLklEX0VMRU1FTlRfQ1JFQVRJT05fQUNUSU9OX1NFVCk7Ci0JCWxheW91dC5hZGRBY3Rpb25TZXQoSVBhZ2VMYXlvdXQuSURfTkFWSUdBVEVfQUNUSU9OX1NFVCk7Ci0KLQkJLy8gdmlld3MgLSBqYXZhCi0JCWxheW91dC5hZGRTaG93Vmlld1Nob3J0Y3V0KEphdmFVSS5JRF9QQUNLQUdFUyk7Ci0JCWxheW91dC5hZGRTaG93Vmlld1Nob3J0Y3V0KEphdmFVSS5JRF9UWVBFX0hJRVJBUkNIWSk7Ci0JCWxheW91dC5hZGRTaG93Vmlld1Nob3J0Y3V0KEphdmFVSS5JRF9TT1VSQ0VfVklFVyk7Ci0JCWxheW91dC5hZGRTaG93Vmlld1Nob3J0Y3V0KEphdmFVSS5JRF9KQVZBRE9DX1ZJRVcpOwotCi0JCS8vIHZpZXdzIC0gc3RhbmRhcmQgd29ya2JlbmNoCi0JCWxheW91dC5hZGRTaG93Vmlld1Nob3J0Y3V0KElQYWdlTGF5b3V0LklEX09VVExJTkUpOwotCQlsYXlvdXQuYWRkU2hvd1ZpZXdTaG9ydGN1dChJUGFnZUxheW91dC5JRF9QUk9CTEVNX1ZJRVcpOwotCQlsYXlvdXQuYWRkU2hvd1ZpZXdTaG9ydGN1dChJUGFnZUxheW91dC5JRF9SRVNfTkFWKTsKLQotCQkvLyBuZXcgYWN0aW9ucyAtIEphdmEgcHJvamVjdCBjcmVhdGlvbiB3aXphcmQKLQkJbGF5b3V0LmFkZE5ld1dpemFyZFNob3J0Y3V0KCJvcmcuZWNsaXBzZS5qZHQudWkud2l6YXJkcy5OZXdQYWNrYWdlQ3JlYXRpb25XaXphcmQiKTsgLy8kTk9OLU5MUy0xJAotCQlsYXlvdXQuYWRkTmV3V2l6YXJkU2hvcnRjdXQoIm9yZy5lY2xpcHNlLmpkdC51aS53aXphcmRzLk5ld0NsYXNzQ3JlYXRpb25XaXphcmQiKTsgLy8kTk9OLU5MUy0xJAotCQlsYXlvdXQuYWRkTmV3V2l6YXJkU2hvcnRjdXQoIm9yZy5lY2xpcHNlLmpkdC51aS53aXphcmRzLk5ld0ludGVyZmFjZUNyZWF0aW9uV2l6YXJkIik7IC8vJE5PTi1OTFMtMSQKLQkJbGF5b3V0LmFkZE5ld1dpemFyZFNob3J0Y3V0KCJvcmcuZWNsaXBzZS5qZHQudWkud2l6YXJkcy5OZXdFbnVtQ3JlYXRpb25XaXphcmQiKTsgLy8kTk9OLU5MUy0xJAotCQlsYXlvdXQuYWRkTmV3V2l6YXJkU2hvcnRjdXQoIm9yZy5lY2xpcHNlLmpkdC51aS53aXphcmRzLk5ld0Fubm90YXRpb25DcmVhdGlvbldpemFyZCIpOyAvLyROT04tTkxTLTEkCi0JCWxheW91dC5hZGROZXdXaXphcmRTaG9ydGN1dCgib3JnLmVjbGlwc2UuamR0LnVpLndpemFyZHMuTmV3U291cmNlRm9sZGVyQ3JlYXRpb25XaXphcmQiKTsgLy8kTk9OLU5MUy0xJAotCQlsYXlvdXQuYWRkTmV3V2l6YXJkU2hvcnRjdXQoIm9yZy5lY2xpcHNlLmpkdC51aS53aXphcmRzLk5ld1NuaXBwZXRGaWxlQ3JlYXRpb25XaXphcmQiKTsgLy8kTk9OLU5MUy0xJAotCQlsYXlvdXQuYWRkTmV3V2l6YXJkU2hvcnRjdXQoIm9yZy5lY2xpcHNlLnVpLndpemFyZHMubmV3LmZvbGRlciIpOy8vJE5PTi1OTFMtMSQKLQkJbGF5b3V0LmFkZE5ld1dpemFyZFNob3J0Y3V0KCJvcmcuZWNsaXBzZS51aS53aXphcmRzLm5ldy5maWxlIik7Ly8kTk9OLU5MUy0xJAotCQlsYXlvdXQuYWRkTmV3V2l6YXJkU2hvcnRjdXQoIm9yZy5lY2xpcHNlLnVpLmVkaXRvcnMud2l6YXJkcy5VbnRpdGxlZFRleHRGaWxlV2l6YXJkIik7Ly8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3ByZWZzL0pwYVByZWZlcmVuY2VQYWdlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wcmVmcy9KcGFQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2ZhMTBjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3ByZWZzL0pwYVByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wcmVmczsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkluc3RhbmNlU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnByZWZlcmVuY2VzLlVzZXJMaWJyYXJ5UHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUGVyc2lzdGVudFByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5KcHRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLnByZWZzLkpwYVByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlcy5JV29ya2JlbmNoUHJlZmVyZW5jZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlcy5TY29wZWRQcmVmZXJlbmNlU3RvcmU7Ci0KLXB1YmxpYyBjbGFzcyBKcGFQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlIAotCWltcGxlbWVudHMgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlCi17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2UuanB0LnVpLmpwYVByZWZlcmVuY2VQYWdlIjsKLQkKLQkKLQlwcml2YXRlIElQZXJzaXN0ZW50UHJlZmVyZW5jZVN0b3JlIHByZWZlcmVuY2VzOwotCQotCXByaXZhdGUgSVByZWZlcmVuY2VTdG9yZSB1c2VyTGliUHJlZmVyZW5jZXM7Ci0JCi0JcHJpdmF0ZSBMYWJlbCBqcGFMaWJMYWJlbDsKLQkJCi0JcHJpdmF0ZSBDb21ibyBqcGFMaWJDb21ibzsKLQkKLQlwcml2YXRlIExpbmsgdXNlckxpYnNMaW5rOwotCQkKLQkKLQlwdWJsaWMgSnBhUHJlZmVyZW5jZVBhZ2UoKSB7Ci0JCXN1cGVyKCk7Ci0JCXByZWZlcmVuY2VzID0gCi0JCQluZXcgU2NvcGVkUHJlZmVyZW5jZVN0b3JlKAotCQkJCW5ldyBJbnN0YW5jZVNjb3BlKCksCi0JCQkJSnB0Q29yZVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSk7Ci0JCXVzZXJMaWJQcmVmZXJlbmNlcyA9Ci0JCQluZXcgU2NvcGVkUHJlZmVyZW5jZVN0b3JlKAotCQkJCW5ldyBJbnN0YW5jZVNjb3BlKCksCi0JCQkJSmF2YUNvcmUuZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7fQotCQotCXB1YmxpYyBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJY29udGFpbmVyLnNldExheW91dChsYXlvdXQpOwotCQkKLQkJanBhTGliTGFiZWwgPSBjcmVhdGVMYWJlbChjb250YWluZXIsIDEsIEpwdFVpTWVzc2FnZXMuSnBhUHJlZmVyZW5jZVBhZ2VfZGVmYXVsdEpwYUxpYik7Ci0JCQkKLQkJanBhTGliQ29tYm8gPSBjcmVhdGVDb21ibyhjb250YWluZXIsIHRydWUpOwotCQkKLQkJdXNlckxpYnNMaW5rID0gIG5ldyBMaW5rKGNvbnRhaW5lciwgU1dULk5PTkUpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkVORCwgR3JpZERhdGEuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJdXNlckxpYnNMaW5rLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXVzZXJMaWJzTGluay5zZXRUZXh0KEpwdFVpTWVzc2FnZXMuSnBhUHJlZmVyZW5jZVBhZ2VfdXNlckxpYnNMaW5rKTsKLQkJdXNlckxpYnNMaW5rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKAotCQkJbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkoKElXb3JrYmVuY2hQcmVmZXJlbmNlQ29udGFpbmVyKSBnZXRDb250YWluZXIoKSkKLQkJCQkJCS5vcGVuUGFnZShVc2VyTGlicmFyeVByZWZlcmVuY2VQYWdlLklELCBudWxsKTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JCQkKLQkJcGVyZm9ybURlZmF1bHRzKCk7Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCQotCXByaXZhdGUgTGFiZWwgY3JlYXRlTGFiZWwoQ29tcG9zaXRlIGNvbnRhaW5lciwgaW50IHNwYW4sIFN0cmluZyB0ZXh0KSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbnRhaW5lciwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KHRleHQpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IHNwYW47Ci0JCWxhYmVsLnNldExheW91dERhdGEoZ2QpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCQotCXByaXZhdGUgQ29tYm8gY3JlYXRlQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lciwgYm9vbGVhbiBmaWxsSG9yaXpvbnRhbCkgewotCQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyhjb250YWluZXIsIFNXVC5CT1JERVIgfCBTV1QuU0lOR0xFIHwgU1dULlJFQURfT05MWSk7Ci0JCWlmIChmaWxsSG9yaXpvbnRhbCkgewotCQkJY29tYm8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQljb21iby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQkJfQotCQlyZXR1cm4gY29tYm87Ci0JfQotCQotCXByaXZhdGUgdm9pZCBmaWxsSnBhTGlicygpIHsKLQkJaW50IGluZGV4ID0ganBhTGliQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJU3RyaW5nIHNlbGVjdGVkSnBhTGliID0gbnVsbDsKLQkJaWYgKGluZGV4ID49IDApIHsKLQkJCXNlbGVjdGVkSnBhTGliID0ganBhTGliQ29tYm8uZ2V0SXRlbShqcGFMaWJDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQkJfQotCQkKLQkJanBhTGliQ29tYm8uY2xlYXJTZWxlY3Rpb24oKTsKLQkJanBhTGliQ29tYm8uc2V0SXRlbXMoSmF2YUNvcmUuZ2V0VXNlckxpYnJhcnlOYW1lcygpKTsKLQkJCi0JCWlmIChzZWxlY3RlZEpwYUxpYiAhPSBudWxsKSB7Ci0JCQlpbnQgbmV3SW5kZXggPSBDb2xsZWN0aW9uVG9vbHMuaW5kZXhPZihqcGFMaWJDb21iby5nZXRJdGVtcygpLCBzZWxlY3RlZEpwYUxpYik7Ci0JCQlpZiAobmV3SW5kZXggPj0gMCkgewotCQkJCWpwYUxpYkNvbWJvLnNlbGVjdChuZXdJbmRleCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLQkJc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLQkJaWYgKHZpc2libGUpIHsKLQkJCWZpbGxKcGFMaWJzKCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlmaWxsSnBhTGlicygpOwotCQlTdHJpbmcgZGVmYXVsdExpYiA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhKcGFQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfREVGQVVMVF9KUEFfTElCKTsKLQkJaW50IGluZGV4ID0gLTE7Ci0JCWlmICghIFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoZGVmYXVsdExpYikpIHsKLQkJCWluZGV4ID0gQ29sbGVjdGlvblRvb2xzLmluZGV4T2YoanBhTGliQ29tYm8uZ2V0SXRlbXMoKSwgZGVmYXVsdExpYik7Ci0JCX0KLQkJaWYgKGluZGV4ID49IDApIHsKLQkJCWpwYUxpYkNvbWJvLnNlbGVjdChpbmRleCk7Ci0JCX0KLQkJCi0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJaW50IGluZGV4ID0ganBhTGliQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJU3RyaW5nIGRlZmF1bHRMaWIgPSAoaW5kZXggPj0gMCkgPyBqcGFMaWJDb21iby5nZXRJdGVtKGluZGV4KSA6IG51bGw7Ci0JCWlmICghIFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoZGVmYXVsdExpYikpIHsKLQkJCXByZWZlcmVuY2VzLnNldFZhbHVlKEpwYVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9ERUZBVUxUX0pQQV9MSUIsIGRlZmF1bHRMaWIpOwotCQl9Ci0JCXRyeSB7Ci0JCQlwcmVmZXJlbmNlcy5zYXZlKCk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJSnB0Q29yZVBsdWdpbi5sb2coaW9lKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gbnVsbCBwb2ludGVyIGNoZWNrIC0gYnVnIDE2ODMzNwotCQlpZiAoanBhTGliTGFiZWwgIT0gbnVsbCkganBhTGliTGFiZWwuZGlzcG9zZSgpOwotCQlpZiAoanBhTGliQ29tYm8gIT0gbnVsbCkganBhTGliQ29tYm8uZGlzcG9zZSgpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCQotCQotCQkKLS8vCQlwcml2YXRlIGJvb2xlYW4gbGliQ29udGFpbnNKcGFDbGFzc2VzKCkgewotLy8JCQlyZXR1cm4gdHJ1ZTsKLS8vCQkJU3RyaW5nIGphckxvY2F0aW9uID0gZ2V0U3RyaW5nVmFsdWUoKTsKLS8vCQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IEpwdFVpTWVzc2FnZXMuSnBhUHJlZmVyZW5jZVBhZ2VfaW52YWxpZEpwYUxpYjsKLS8vCQkJYm9vbGVhbiBoYXNFcnJvciA9IGZhbHNlOwotLy8JCQkKLS8vCQkJdHJ5IHsKLS8vCQkJCUphckZpbGUgamFyRmlsZSA9IG5ldyBKYXJGaWxlKGphckxvY2F0aW9uKTsKLS8vCQkJCWhhc0Vycm9yID0gamFyRmlsZS5nZXRFbnRyeSgiamF2YXgvcGVyc2lzdGVuY2UvRW50aXR5TWFuYWdlci5jbGFzcyIpID09IG51bGw7Ci0vLwkJCX0KLS8vCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotLy8JCQkJaGFzRXJyb3IgPSB0cnVlOwotLy8JCQl9Ci0vLwkJCQotLy8JCQlpZiAoaGFzRXJyb3IpIHsKLS8vCQkJCXNob3dFcnJvck1lc3NhZ2UoZXJyb3JNZXNzYWdlKTsKLS8vCQkJfQotLy8JCQllbHNlIHsKLS8vCQkJCWNsZWFyRXJyb3JNZXNzYWdlKCk7Ci0vLwkJCX0KLS8vCQkJCi0vLwkJCXJldHVybiAhIGhhc0Vycm9yOwotLy8JCX0KLS8vCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3Byb3BlcnRpZXMvRGF0YU1vZGVsUHJvcGVydHlQYWdlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL0RhdGFNb2RlbFByb3BlcnR5UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzBiNjRkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3Byb3BlcnRpZXMvRGF0YU1vZGVsUHJvcGVydHlQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCi0gKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSU1lc3NhZ2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJvcGVydHlQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuRGF0YU1vZGVsU3luY2hIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLlZhbGlkYXRpb25TdGF0dXM7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEYXRhTW9kZWxQcm9wZXJ0eVBhZ2UgCi0JZXh0ZW5kcyBQcm9wZXJ0eVBhZ2UKLQlpbXBsZW1lbnRzIExpc3RlbmVyLCBJRGF0YU1vZGVsTGlzdGVuZXIKLXsKLQlwcm90ZWN0ZWQgSURhdGFNb2RlbCBtb2RlbDsKLQkKLQlwcml2YXRlIFZhbGlkYXRpb25TdGF0dXMgc3RhdHVzID0gbmV3IFZhbGlkYXRpb25TdGF0dXMoKTsKLQlwcml2YXRlIE1hcCB2YWxpZGF0aW9uTWFwOwotCXByaXZhdGUgU3RyaW5nW10gdmFsaWRhdGlvblByb3BlcnR5TmFtZXM7Ci0JcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRhdGluZyA9IGZhbHNlOwotCQotCXByb3RlY3RlZCBEYXRhTW9kZWxTeW5jaEhlbHBlciBzeW5jaEhlbHBlcjsKLQkKLQlwcml2YXRlIFN0cmluZyBpbmZvcG9wSUQ7Ci0JCi0JCi0JcHJvdGVjdGVkIERhdGFNb2RlbFByb3BlcnR5UGFnZShJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMubW9kZWwgPSBtb2RlbDsKLQkJbW9kZWwuYWRkTGlzdGVuZXIodGhpcyk7Ci0JCXN5bmNoSGVscGVyID0gaW5pdGlhbGl6ZVN5bmNoSGVscGVyKG1vZGVsKTsKLQl9Ci0JCi0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIERhdGFNb2RlbFN5bmNoSGVscGVyIGluaXRpYWxpemVTeW5jaEhlbHBlcihJRGF0YU1vZGVsIGRtKSB7Ci0JCXJldHVybiBuZXcgRGF0YU1vZGVsU3luY2hIZWxwZXIoZG0pOwotCX0KLQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHRvcCA9IGNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKHBhcmVudCk7Ci0JCXNldHVwSW5mb3BvcCh0b3ApOwotCQlzZXREZWZhdWx0cygpOwotCQlhZGRMaXN0ZW5lcnMoKTsKLQkJaW5pdGlhbGl6ZVZhbGlkYXRpb25Qcm9wZXJ0aWVzKCk7Ci0JCXJldHVybiB0b3A7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplVmFsaWRhdGlvblByb3BlcnRpZXMoKSB7Ci0JCXZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzID0gZ2V0VmFsaWRhdGlvblByb3BlcnR5TmFtZXMoKTsKLQkJaWYgKHZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzID09IG51bGwgfHwgdmFsaWRhdGlvblByb3BlcnR5TmFtZXMubGVuZ3RoID09IDApCi0JCQl2YWxpZGF0aW9uTWFwID0gQ29sbGVjdGlvbnMuRU1QVFlfTUFQOwotCQllbHNlIHsKLQkJCXZhbGlkYXRpb25NYXAgPSBuZXcgSGFzaE1hcCh2YWxpZGF0aW9uUHJvcGVydHlOYW1lcy5sZW5ndGgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWxpZGF0aW9uUHJvcGVydHlOYW1lcy5sZW5ndGg7IGkrKykKLQkJCQl2YWxpZGF0aW9uTWFwLnB1dCh2YWxpZGF0aW9uUHJvcGVydHlOYW1lc1tpXSwgbmV3IEludGVnZXIoaSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3ViY2xhc3Mgc2hvdWxkIHJldHVybiB0aGUgbW9kZWwgcHJvcGVydHkgbmFtZXMgdGhhdCBuZWVkIHRvIGJlIHZhbGlkYXRlZCBvbiB0aGlzIHBhZ2UgaW4gdGhlCi0JICogb3JkZXIgdGhhdCB0aGV5IHNob3VsZCBwcmVzZW50IHRoZWlyIG1lc3NhZ2VzLgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblByb3BlcnR5TmFtZXMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgdG9wIGxldmVsIENvbXBvc2l0ZSBmb3IgdGhpcyBwYWdlLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBDb21wb3NpdGUgY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCk7Ci0KLQkvKioKLQkgKiBTZXQgdXAgaW5mbyBwb3AgaG9va3MgaWYgc2V0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldHVwSW5mb3BvcChDb250cm9sIHBhcmVudCkgewotCQlpZiAoZ2V0SW5mb3BvcElEKCkgIT0gbnVsbCkKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFyZW50LCBnZXRJbmZvcG9wSUQoKSk7Ci0JfQotCi0JLyoqCi0JICogU2V0dXAgdGhlIGRlZmF1bHQgdmFsdWVzIGZvciB0aGlzIHBhZ2UuIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRvIHByb3ZpZGUgYXBwcm9wcmlhdGUKLQkgKiBkZWZhdWx0cy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0cygpIHsKLQkJcmVzdG9yZURlZmF1bHRTZXR0aW5ncygpOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgc2hvdWxkIGltcGxlbWVudCB0aGlzIG1ldGhvZCBpZiB0aGV5IGhhdmUgZGVmYXVsdCBzZXR0aW5ncyB0aGF0IGhhdmUgYmVlbiBzdG9yZWQKLQkgKiBhbmQgbmVlZCB0byBiZSByZXN0b3JlZC4KLQkgKiAKLQkgKiBAc2VlIHN0b3JlRGVmYXVsdFNldHRpbmdzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZXN0b3JlRGVmYXVsdFNldHRpbmdzKCkgewotCX0KLQotCS8qKgotCSAqIEFkZCBMaXN0ZW5lcnMgdG8gY29udHJvbHMgYXQgdGhpcyBwb2ludCB0byBhdm9pZCB1bm5lY2Vzc2FyeSBldmVudHMuIFN1YmNsYXNzZXMgc2hvdWxkCi0JICogb3ZlcnJpZGUgdG8gYWRkIGxpc3RlbmVycyB0byBpdHMgY29udHJvbHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCX0KLQotCS8qKgotCSAqIEV4aXRpbmcgdGhlIHBhZ2UuIFN1YmNsYXNzZXMgbWF5IGV4dGVuZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBleGl0KCkgewotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGdldFN0YXR1cyhJbnRlZ2VyIGtleSkgewotCQlyZXR1cm4gc3RhdHVzLmhhc0Vycm9yKGtleSk7Ci0JfQotCi0JLyoqCi0JICogU2VudCB3aGVuIGFuIGV2ZW50IHRoYXQgdGhlIHJlY2VpdmVyIGhhcyByZWdpc3RlcmVkIGZvciBvY2N1cnMuIElmIGEgc3ViY2xhc3Mgb3ZlcnJpZGVzIHRoaXMKLQkgKiBtZXRob2QsIGl0IG11c3QgY2FsbCBzdXBlci4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKiAgICAgICAgICAgIHRoZSBldmVudCB3aGljaCBvY2N1cnJlZAotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50IGV2ZW50KSB7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBlcnJvciBtZXNzYWdlIGZvciB0aGlzIHBhZ2UgYmFzZWQgb24gdGhlIGxhc3QgZXJyb3IgaW4gdGhlIFZhbGlkYXRpb25TdGF0dXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0RXJyb3JNZXNzYWdlKCkgewotCQlTdHJpbmcgZXJyb3IgPSBzdGF0dXMuZ2V0TGFzdEVyck1zZygpOwotCQlpZiAoZXJyb3IgPT0gbnVsbCkgewotCQkJaWYgKGdldEVycm9yTWVzc2FnZSgpICE9IG51bGwpCi0JCQkJc2V0RXJyb3JNZXNzYWdlKChTdHJpbmcpIG51bGwpOwotCQkJU3RyaW5nIHdhcm5pbmcgPSBzdGF0dXMuZ2V0TGFzdFdhcm5pbmdNc2coKTsKLQkJCWlmICh3YXJuaW5nID09IG51bGwpIHsKLQkJCQlpZiAoZ2V0TWVzc2FnZSgpICE9IG51bGwgJiYgZ2V0TWVzc2FnZVR5cGUoKSA9PSBJTWVzc2FnZVByb3ZpZGVyLldBUk5JTkcpCi0JCQkJCXNldE1lc3NhZ2UobnVsbCwgSU1lc3NhZ2VQcm92aWRlci5XQVJOSU5HKTsKLQkJCQllbHNlIHsKLQkJCQkJU3RyaW5nIGluZm8gPSBzdGF0dXMuZ2V0TGFzdEluZm9Nc2coKTsKLQkJCQkJaWYgKGluZm8gPT0gbnVsbCkgewotCQkJCQkJaWYgKGdldE1lc3NhZ2UoKSAhPSBudWxsICYmIGdldE1lc3NhZ2VUeXBlKCkgPT0gSU1lc3NhZ2VQcm92aWRlci5JTkZPUk1BVElPTikKLQkJCQkJCQlzZXRNZXNzYWdlKG51bGwsIElNZXNzYWdlUHJvdmlkZXIuSU5GT1JNQVRJT04pOwotCQkJCQl9IGVsc2UgaWYgKCFpbmZvLmVxdWFscyhnZXRNZXNzYWdlKCkpKSB7Ci0JCQkJCQlzZXRNZXNzYWdlKGluZm8sIElNZXNzYWdlUHJvdmlkZXIuSU5GT1JNQVRJT04pOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIGlmICghd2FybmluZy5lcXVhbHMoZ2V0TWVzc2FnZSgpKSkKLQkJCQlzZXRNZXNzYWdlKHdhcm5pbmcsIElNZXNzYWdlUHJvdmlkZXIuV0FSTklORyk7Ci0JCX0gZWxzZSBpZiAoIWVycm9yLmVxdWFscyhnZXRFcnJvck1lc3NhZ2UoKSkpCi0JCQkJCQkJc2V0RXJyb3JNZXNzYWdlKGVycm9yKTsKLQkJCQkJCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEVycm9yU3RhdHVzKEludGVnZXIga2V5LCBTdHJpbmcgZXJyb3JNZXNzYWdlKSB7Ci0JCXN0YXR1cy5zZXRFcnJvclN0YXR1cyhrZXksIGVycm9yTWVzc2FnZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0V2FybmluZ1N0YXR1cyhJbnRlZ2VyIGtleSwgU3RyaW5nIHdhcm5pbmdNZXNzYWdlKSB7Ci0JCXN0YXR1cy5zZXRXYXJuaW5nU3RhdHVzKGtleSwgd2FybmluZ01lc3NhZ2UpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRJbmZvU3RhdHVzKEludGVnZXIga2V5LCBTdHJpbmcgaW5mb01lc3NhZ2UpIHsKLQkJc3RhdHVzLnNldEluZm9TdGF0dXMoa2V5LCBpbmZvTWVzc2FnZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0T0tTdGF0dXMoSW50ZWdlciBrZXkpIHsKLQkJc3RhdHVzLnNldE9LU3RhdHVzKGtleSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzaG91bGQgYmUgY2FsbGVkIGJ5IHRoZSBXaXphcmQganVzdCBwcmlvciB0byBydW5uaW5nIHRoZSBwZXJmb3JtRmluaXNoIG9wZXJhdGlvbi4KLQkgKiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0byBzdG9yZSB0aGVpciBkZWZhdWx0IHNldHRpbmdzLgotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3JlRGVmYXVsdFNldHRpbmdzKCkgewotCX0KLQotCS8qKgotCSAqIFRoZSBwYWdlIGlzIG5vdyBiZWluZyB2YWxpZGF0ZWQuIEF0IHRoaXMgdGltZSwgZWFjaCBjb250cm9sIGlzIHZhbGlkYXRlZCBhbmQgdGhlbiB0aGUKLQkgKiBjb250cm9scyBhcmUgdXBkYXRlZCBiYXNlZCBvbiB0aGUgcmVzdWx0cyBpbiB0aGUgVmFsaWRhdGlvblN0YXR1cyB3aGljaCB3YXMgdXBkYXRlZCBkdXJpbmcKLQkgKiA8Y29kZT52YWxpZGF0ZUNvbnRyb2xzKCk8L2NvZGU+LiBGaW5hbGx5LCBpdCB3aWxsIGRpc3BsYXkgdGhlIGxhc3QgZXJyb3IgbWVzc2FnZSBhbmQgaXQKLQkgKiB3aWxsIHNldCB0aGUgcGFnZSBjb21wbGV0ZS4gU3ViY2xhc3NlcyB3aWxsIG5vdCB0eXBpY2FsbHkgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVQYWdlKCkgewotCQlpZiAoIWlzVmFsaWRhdGluZykgewotCQkJaXNWYWxpZGF0aW5nID0gdHJ1ZTsKLQkJCXRyeSB7Ci0JCQkJdmFsaWRhdGVDb250cm9sc0Jhc2UoKTsKLQkJCQl1cGRhdGVDb250cm9scygpOwotCQkJCXNldEVycm9yTWVzc2FnZSgpOwotCQkJCXNldFZhbGlkKHN0YXR1cy5nZXRMYXN0RXJyTXNnKCkgPT0gbnVsbCk7Ci0JCQl9IAotCQkJZmluYWxseSB7Ci0JCQkJaXNWYWxpZGF0aW5nID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZSBpbmRpdmlkdWFsIGNvbnRyb2xzLiBVc2UgdmFsaWRhdGlvbiBrZXlzIHRvIGtlZXAgdHJhY2sgb2YgZXJyb3JzLgotCSAqIAotCSAqIEBzZWUgc2V0T0tTdGF0dXMoSW50ZWdlcikgYW5kIHNldEVycm9yTWVzc2FnZShJbnRlZ2VyLCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyB2YWxpZGF0ZUNvbnRyb2xzQmFzZSgpIHsKLQkJaWYgKCF2YWxpZGF0aW9uTWFwLmlzRW1wdHkoKSkgewotCQkJU3RyaW5nIHByb3BOYW1lOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWxpZGF0aW9uUHJvcGVydHlOYW1lcy5sZW5ndGg7IGkrKykgewotCQkJCXByb3BOYW1lID0gdmFsaWRhdGlvblByb3BlcnR5TmFtZXNbaV07Ci0JCQkJSW50ZWdlciB2YWxLZXkgPSAoSW50ZWdlcikgdmFsaWRhdGlvbk1hcC5nZXQocHJvcE5hbWUpOwotCQkJCWlmICh2YWxLZXkgIT0gbnVsbCkKLQkJCQkJdmFsaWRhdGVQcm9wZXJ0eShwcm9wTmFtZSwgdmFsS2V5KTsKLQkJCQlpZiAoIWdldFN0YXR1cyh2YWxLZXkpKQotCQkJCQlyZXR1cm4gcHJvcE5hbWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqIEBwYXJhbSB2YWxpZGF0aW9ua2V5Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgSW50ZWdlciB2YWxpZGF0aW9uS2V5KSB7Ci0JCXNldE9LU3RhdHVzKHZhbGlkYXRpb25LZXkpOwotCQlJU3RhdHVzIHN0YXR1czEgPSBtb2RlbC52YWxpZGF0ZVByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JCWlmICghc3RhdHVzMS5pc09LKCkpIHsKLQkJCVN0cmluZyBtZXNzYWdlID0gc3RhdHVzMS5pc011bHRpU3RhdHVzKCkgPyBzdGF0dXMxLmdldENoaWxkcmVuKClbMF0uZ2V0TWVzc2FnZSgpIDogc3RhdHVzMS5nZXRNZXNzYWdlKCk7Ci0JCQlzd2l0Y2ggKHN0YXR1czEuZ2V0U2V2ZXJpdHkoKSkgewotCQkJCWNhc2UgSVN0YXR1cy5FUlJPUiA6Ci0JCQkJCXNldEVycm9yU3RhdHVzKHZhbGlkYXRpb25LZXksIG1lc3NhZ2UpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElTdGF0dXMuV0FSTklORyA6Ci0JCQkJCXNldFdhcm5pbmdTdGF0dXModmFsaWRhdGlvbktleSwgbWVzc2FnZSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSVN0YXR1cy5JTkZPIDoKLQkJCQkJc2V0SW5mb1N0YXR1cyh2YWxpZGF0aW9uS2V5LCBtZXNzYWdlKTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgdGhlIGVuYWJsZW1lbnQgb2YgY29udHJvbHMgYWZ0ZXIgdmFsaWRhdGlvbi4gU3VibGNhc3NlcyBzaG91bGQgY2hlY2sgdGhlIHN0YXR1cyBvZgotCSAqIHZhbGlkYXRpb24ga2V5cyB0byBkZXRlcm1pbmUgZW5hYmxlbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDb250cm9scygpIHsKLQl9Ci0JCi0JCi0JLyoKLQkgKiBJZiBhIHByb3BlcnR5IGNoYW5nZXMgdGhhdCB3ZSB3YW50IHRvIHZhbGlkYXRlLCBmb3JjZSB2YWxpZGF0aW9uIG9uIHRoaXMgcGFnZS4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb24uV1RQT3BlcmF0aW9uRGF0YU1vZGVsTGlzdGVuZXIjcHJvcGVydHlDaGFuZ2VkKGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChEYXRhTW9kZWxFdmVudCBldmVudCkgewotCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCk7Ci0JCWlmICh2YWxpZGF0aW9uUHJvcGVydHlOYW1lcyAhPSBudWxsICYmIChldmVudC5nZXRGbGFnKCkgPT0gRGF0YU1vZGVsRXZlbnQuVkFMVUVfQ0hHIHx8ICghaXNWYWxpZCgpICYmIGV2ZW50LmdldEZsYWcoKSA9PSBEYXRhTW9kZWxFdmVudC5WQUxJRF9WQUxVRVNfQ0hHKSkpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsaWRhdGlvblByb3BlcnR5TmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAodmFsaWRhdGlvblByb3BlcnR5TmFtZXNbaV0uZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCQkJdmFsaWRhdGVQYWdlKCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgbW9kZWwuCi0JICovCi0JcHJvdGVjdGVkIElEYXRhTW9kZWwgZ2V0RGF0YU1vZGVsKCkgewotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQlpZiAoc3luY2hIZWxwZXIgIT0gbnVsbCkgewotCQkJc3luY2hIZWxwZXIuZGlzcG9zZSgpOwotCQkJc3luY2hIZWxwZXIgPSBudWxsOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRJbmZvcG9wSUQoKSB7Ci0JCXJldHVybiBpbmZvcG9wSUQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW5mb3BvcElEKFN0cmluZyBpbmZvcG9wSUQpIHsKLQkJdGhpcy5pbmZvcG9wSUQgPSBpbmZvcG9wSUQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9KcGFQcm9qZWN0UHJvcGVydGllc1BhZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3Byb3BlcnRpZXMvSnBhUHJvamVjdFByb3BlcnRpZXNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwODlhZGYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9KcGFQcm9qZWN0UHJvcGVydGllc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKLSAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklKcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkpwYVBsYXRmb3JtUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5mYWNldC5JSnBhRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmZhY2V0LkpwYUZhY2V0RGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuZmFjZXQuSnBhRmFjZXRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwuQ29ubmVjdGlvblByb2ZpbGVSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi51aS5pbnRlcm5hbC5EVFBVaVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5JSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lOwotCi1wdWJsaWMgY2xhc3MgSnBhUHJvamVjdFByb3BlcnRpZXNQYWdlIAotCWV4dGVuZHMgRGF0YU1vZGVsUHJvcGVydHlQYWdlCi0JaW1wbGVtZW50cyBJSnBhRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzCi17Ci0JcHJpdmF0ZSBQbGF0Zm9ybUdyb3VwIHBsYXRmb3JtR3JvdXA7Ci0JCi0JcHJpdmF0ZSBDb25uZWN0aW9uR3JvdXAgY29ubmVjdGlvbkdyb3VwOwotCQotCXByaXZhdGUgUGVyc2lzdGVudENsYXNzTWFuYWdlbWVudEdyb3VwIHBlcnNpc3RlbnRDbGFzc01hbmFnZW1lbnRHcm91cDsKLQkKLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgU2FtcGxlUHJvcGVydHlQYWdlLgotCSAqLwotCXB1YmxpYyBKcGFQcm9qZWN0UHJvcGVydGllc1BhZ2UoKSB7Ci0JCXN1cGVyKERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBKcGFGYWNldERhdGFNb2RlbFByb3ZpZGVyKCkpKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCi0JCXBsYXRmb3JtR3JvdXAgPSBuZXcgUGxhdGZvcm1Hcm91cChjb21wb3NpdGUpOwotCQljb25uZWN0aW9uR3JvdXAgPSBuZXcgQ29ubmVjdGlvbkdyb3VwKGNvbXBvc2l0ZSk7Ci0JCXBlcnNpc3RlbnRDbGFzc01hbmFnZW1lbnRHcm91cCA9IG5ldyBQZXJzaXN0ZW50Q2xhc3NNYW5hZ2VtZW50R3JvdXAoY29tcG9zaXRlKTsKLQkJCi0JCXNldFJ1bnRpbWUoKTsKLQkJCi0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb21wb3NpdGUsIElKcGFIZWxwQ29udGV4dElkcy5QUk9QRVJUSUVTX0pBVkFfUEVSU0lTVEVOQ0UpOwotCQkKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldFJ1bnRpbWUoKSB7Ci0JCUlGYWNldGVkUHJvamVjdCBmYWNldGVkUHJvamVjdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlmYWNldGVkUHJvamVjdCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShnZXRKcGFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpKTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJSnB0VWlQbHVnaW4ubG9nKGNlKTsKLQkJCXJldHVybjsKLQkJfQotCQlJUnVudGltZSBydW50aW1lID0gZmFjZXRlZFByb2plY3QuZ2V0UHJpbWFyeVJ1bnRpbWUoKTsKLQkJbW9kZWwuc2V0UHJvcGVydHkoSUpwYUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5SVU5USU1FLCBydW50aW1lKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsKLQkJCUlKcGFGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuUExBVEZPUk1fSUQsCi0JCQlJSnBhRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTk5FQ1RJT04sCi0JCQlJSnBhRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLkRJU0NPVkVSX0FOTk9UQVRFRF9DTEFTU0VTCi0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBKcGFQcm9qZWN0IGdldEpwYVByb2plY3QoKSB7Ci0JCXJldHVybiAoSnBhUHJvamVjdCkgZ2V0RWxlbWVudCgpLmdldEFkYXB0ZXIoSUpwYVByb2plY3QuY2xhc3MpOwotCX0KLQkKLQlwcml2YXRlIENvbWJvIGNyZWF0ZUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIsIGJvb2xlYW4gZmlsbEhvcml6b250YWwpIHsKLQkJQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8oY29udGFpbmVyLCBTV1QuQk9SREVSIHwgU1dULlNJTkdMRSB8IFNXVC5SRUFEX09OTFkpOwotCQlpZiAoZmlsbEhvcml6b250YWwpIHsKLQkJCWNvbWJvLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQl9Ci0JCWVsc2UgewotCQkJY29tYm8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0JCX0KLQkJcmV0dXJuIGNvbWJvOwotCX0KLQkKLQlwcml2YXRlIEJ1dHRvbiBjcmVhdGVCdXR0b24oQ29tcG9zaXRlIGNvbnRhaW5lciwgaW50IHNwYW4sIFN0cmluZyB0ZXh0LCBpbnQgc3R5bGUpIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oY29udGFpbmVyLCBTV1QuTk9ORSB8IHN0eWxlKTsKLQkJYnV0dG9uLnNldFRleHQodGV4dCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gc3BhbjsKLQkJYnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQlyZXR1cm4gYnV0dG9uOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCXBsYXRmb3JtR3JvdXAucGVyZm9ybURlZmF1bHRzKCk7Ci0JCWNvbm5lY3Rpb25Hcm91cC5wZXJmb3JtRGVmYXVsdHMoKTsKLQkJcGVyc2lzdGVudENsYXNzTWFuYWdlbWVudEdyb3VwLnBlcmZvcm1EZWZhdWx0cygpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCUpwYVByb2plY3QganBhUHJvamVjdCA9IGdldEpwYVByb2plY3QoKTsKLQkJCi0JCS8vIHRoZSBmYWNldCBoYXMgYmVlbiB1bmluc3RhbGxlZCBkdXJpbmcgb3VyIHRyaXAgdG8gdGhlIHByb3BlcnRpZXMgLi4uCi0JCWlmIChqcGFQcm9qZWN0ID09IG51bGwpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQl0cnkgewotCQkJSnBhRmFjZXRVdGlscy5zZXRQbGF0Zm9ybShqcGFQcm9qZWN0LmdldFByb2plY3QoKSwgbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSUpwYUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5QTEFURk9STV9JRCkpOwotCQkJSnBhRmFjZXRVdGlscy5zZXRDb25uZWN0aW9uTmFtZShqcGFQcm9qZWN0LmdldFByb2plY3QoKSwgbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSUpwYUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5DT05ORUNUSU9OKSk7Ci0JCQlKcGFGYWNldFV0aWxzLnNldERpc2NvdmVyQW5ub3RhdGVkQ2xhc3NlcyhqcGFQcm9qZWN0LmdldFByb2plY3QoKSwgbW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KElKcGFGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuRElTQ09WRVJfQU5OT1RBVEVEX0NMQVNTRVMpKTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlidWlsZFByb2plY3QoKTsKLQkJCi0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYnVpbGRQcm9qZWN0KCkgewotCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgcj0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCQkJdHJ5IHsKLQkJCQkJZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKS5idWlsZChJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLkZVTExfQlVJTEQsIHBtKTsKLQkJCQl9IAotCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJCUpwdFVpUGx1Z2luLmxvZyhjZSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQl0cnkgewotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcm9ncmVzc1NlcnZpY2UoKS5ydW4odHJ1ZSwgZmFsc2UsIHIpOwotCQl9Ci0JCWNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgeyAvKiBub3RoaW5nIHRvIGRvICovIH0KLQkJY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaWUpIHsgLyogbm90aGluZyB0byBkbyAqLyB9Ci0JfQotCQotCQotCXByaXZhdGUgZmluYWwgY2xhc3MgUGxhdGZvcm1Hcm91cAotCXsKLQkJcHJpdmF0ZSBmaW5hbCBDb21ib1ZpZXdlciBwbGF0Zm9ybUNvbWJvOwotCQkKLQkJCi0JCXB1YmxpYyBQbGF0Zm9ybUdyb3VwKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJZ3JvdXAuc2V0VGV4dChKcHRVaU1lc3NhZ2VzLkpwYUZhY2V0V2l6YXJkUGFnZV9wbGF0Zm9ybUxhYmVsKTsKLQkJCWdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJCWdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJLy8gVE9ETwotCQkJLy8gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChncm91cCwgSURhbGlIZWxwQ29udGV4dElkcy5ORVdfSlBBX1BST0pFQ1RfQ09OVEVOVF9QQUdFX0RBVEFCQVNFKTsKLQkJCQotCQkJcGxhdGZvcm1Db21ibyA9IG5ldyBDb21ib1ZpZXdlcihjcmVhdGVDb21ibyhncm91cCwgdHJ1ZSkpOwotCQkJcGxhdGZvcm1Db21iby5zZXRDb250ZW50UHJvdmlkZXIoCi0JCQkJCW5ldyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcigpIHsKLQkJCQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQkJCQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5hcnJheShKcGFQbGF0Zm9ybVJlZ2lzdHJ5LklOU1RBTkNFLmFsbEpwYVBsYXRmb3JtSWRzKCkpOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkge30KLQkJCQkJCQotCQkJCQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7fQotCQkJCQl9Ci0JCQkJKTsKLQkJCXBsYXRmb3JtQ29tYm8uc2V0TGFiZWxQcm92aWRlcigKLQkJCQkJbmV3IElMYWJlbFByb3ZpZGVyKCkgewotCQkJCQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCQkJCXJldHVybiBKcGFQbGF0Zm9ybVJlZ2lzdHJ5LklOU1RBTkNFLmdldEpwYVBsYXRmb3JtTGFiZWwoKFN0cmluZykgZWxlbWVudCk7Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHt9Ci0JCQkJCQkKLQkJCQkJCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHt9Ci0JCQkJCQkKLQkJCQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7fQotCQkJCQkJCi0JCQkJCQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJKTsKLQkJCXBsYXRmb3JtQ29tYm8uYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKAotCQkJCQluZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCQkJbW9kZWwuc2V0UHJvcGVydHkoUExBVEZPUk1fSUQsICgoU3RydWN0dXJlZFNlbGVjdGlvbikgcGxhdGZvcm1Db21iby5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJKTsKLQkJCS8vIHdlIG5lZWQgc29tZSBpbnB1dCBoZXJlLCBldmVuIGlmIGl0IG1lYW5zIGFic29sdXRlbHkgbm90aGluZwotCQkJcGxhdGZvcm1Db21iby5zZXRJbnB1dCgibnVsbCBpbnB1dCIpOwotCQkJcGVyZm9ybURlZmF1bHRzKCk7Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCQlTdHJpbmcgcGxhdGZvcm1JZCA9IGdldEpwYVByb2plY3QoKS5nZXRQbGF0Zm9ybSgpLmdldElkKCk7Ci0JCQltb2RlbC5zZXRQcm9wZXJ0eShQTEFURk9STV9JRCwgcGxhdGZvcm1JZCk7Ci0JCQlwbGF0Zm9ybUNvbWJvLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihwbGF0Zm9ybUlkKSk7Ci0JCX0KLQl9Ci0JCi0JCi0JcHJpdmF0ZSBmaW5hbCBjbGFzcyBDb25uZWN0aW9uR3JvdXAKLQl7Ci0JCXByaXZhdGUgZmluYWwgQ29tYm8gY29ubmVjdGlvbkNvbWJvOwotCQkKLQkJcHJpdmF0ZSBMaW5rIGNvbm5lY3Rpb25MaW5rOwotCQkKLQkJCi0JCXB1YmxpYyBDb25uZWN0aW9uR3JvdXAoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQlncm91cC5zZXRUZXh0KEpwdFVpTWVzc2FnZXMuSnBhRmFjZXRXaXphcmRQYWdlX2Nvbm5lY3Rpb25MYWJlbCk7Ci0JCQlncm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCQlncm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCQotCQkJY29ubmVjdGlvbkNvbWJvID0gY3JlYXRlQ29tYm8oZ3JvdXAsIHRydWUpOwotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChncm91cCwgSUpwYUhlbHBDb250ZXh0SWRzLlBST1BFUlRJRVNfSkFWQV9QRVJTSVNURU5DRV9DT05ORUNUSU9OKTsKLQkJCWNvbm5lY3Rpb25Db21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcigKLQkJCQkJbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCQl3aWRnZXRTZWxlY3RlZChlKTsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJCW1vZGVsLnNldFByb3BlcnR5KENPTk5FQ1RJT04sIGNvbm5lY3Rpb25Db21iby5nZXRJdGVtKGNvbm5lY3Rpb25Db21iby5nZXRTZWxlY3Rpb25JbmRleCgpKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkpOwotCQkJZmlsbENvbm5lY3Rpb25zKCk7Ci0JCQkKLQkJCWNvbm5lY3Rpb25MaW5rID0gbmV3IExpbmsoZ3JvdXAsIFNXVC5OT05FKTsKLQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRU5ELCBHcmlkRGF0YS5DRU5URVIsIGZhbHNlLCBmYWxzZSk7Ci0JCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJCWNvbm5lY3Rpb25MaW5rLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQljb25uZWN0aW9uTGluay5zZXRUZXh0KEpwdFVpTWVzc2FnZXMuSnBhRmFjZXRXaXphcmRQYWdlX2Nvbm5lY3Rpb25MaW5rKTsKLQkJCWNvbm5lY3Rpb25MaW5rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKAotCQkJCW5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlvcGVuTmV3Q29ubmVjdGlvbldpemFyZCgpOwkJCQkKLQkJCQkJfQotCQkJCX0KLQkJCSk7Ci0JCQlwZXJmb3JtRGVmYXVsdHMoKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBmaWxsQ29ubmVjdGlvbnMoKSB7Ci0JCQkvL2NsZWFyIG91dCBjb25uZWN0aW9uIGVudHJpZXMgZnJvbSBwcmV2aW91cyBsb2dpbi4KLQkJCWNvbm5lY3Rpb25Db21iby5yZW1vdmVBbGwoKTsKLQkJCQotCQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IENvbm5lY3Rpb25Qcm9maWxlUmVwb3NpdG9yeS5pbnN0YW5jZSgpLnByb2ZpbGVOYW1lcygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCQljb25uZWN0aW9uQ29tYm8uYWRkKHN0cmVhbS5uZXh0KCkpOwotCQkJfQotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQkJU3RyaW5nIGNvbm5lY3Rpb25OYW1lID0gZ2V0SnBhUHJvamVjdCgpLmdldERhdGFTb3VyY2UoKS5nZXRDb25uZWN0aW9uUHJvZmlsZU5hbWUoKTsKLQkJCW1vZGVsLnNldFByb3BlcnR5KENPTk5FQ1RJT04sIGNvbm5lY3Rpb25OYW1lKTsKLQkJCWlmIChjb25uZWN0aW9uTmFtZSA9PSBudWxsKSB7Ci0JCQkJY29ubmVjdGlvbkNvbWJvLmNsZWFyU2VsZWN0aW9uKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQljb25uZWN0aW9uQ29tYm8uc2V0VGV4dChjb25uZWN0aW9uTmFtZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCBvcGVuTmV3Q29ubmVjdGlvbldpemFyZCgpIHsKLQkJCVN0cmluZyBjb25uZWN0aW9uTmFtZSA9IERUUFVpVG9vbHMuY3JlYXRlTmV3UHJvZmlsZSgpOwotCQkJaWYgKGNvbm5lY3Rpb25OYW1lICE9IG51bGwpIHsKLQkJCQlmaWxsQ29ubmVjdGlvbnMoKTsKLQkJCQltb2RlbC5zZXRQcm9wZXJ0eShDT05ORUNUSU9OLCBjb25uZWN0aW9uTmFtZSk7Ci0JCQkJY29ubmVjdGlvbkNvbWJvLnNlbGVjdChjb25uZWN0aW9uQ29tYm8uaW5kZXhPZihjb25uZWN0aW9uTmFtZSkpOwotCQkJfQotCQl9Ci0JfQotCQotCQotCXByaXZhdGUgZmluYWwgY2xhc3MgUGVyc2lzdGVudENsYXNzTWFuYWdlbWVudEdyb3VwCi0JewotCQlwcml2YXRlIGZpbmFsIEJ1dHRvbiBkaXNjb3ZlckNsYXNzZXNCdXR0b247Ci0JCQotCQlwcml2YXRlIGZpbmFsIEJ1dHRvbiBsaXN0Q2xhc3Nlc0J1dHRvbjsKLQkJCi0JCQotCQlwdWJsaWMgUGVyc2lzdGVudENsYXNzTWFuYWdlbWVudEdyb3VwKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJZ3JvdXAuc2V0VGV4dChKcHRVaU1lc3NhZ2VzLkpwYUZhY2V0V2l6YXJkUGFnZV9wZXJzaXN0ZW50Q2xhc3NNYW5hZ2VtZW50TGFiZWwpOwotCQkJZ3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQkJZ3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGdyb3VwLCBJSnBhSGVscENvbnRleHRJZHMuTkVXX0pQQV9QUk9KRUNUX0NPTlRFTlRfUEFHRV9DTEFTU1BBVEgpOwotCQkJCi0JCQlkaXNjb3ZlckNsYXNzZXNCdXR0b24gPSBjcmVhdGVCdXR0b24oZ3JvdXAsIDEsIEpwdFVpTWVzc2FnZXMuSnBhRmFjZXRXaXphcmRQYWdlX2Rpc2NvdmVyQ2xhc3Nlc0J1dHRvbiwgU1dULlJBRElPKTsKLQkJCWRpc2NvdmVyQ2xhc3Nlc0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcigKLQkJCQluZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJCXdpZGdldFNlbGVjdGVkKGUpOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQkJbW9kZWwuc2V0Qm9vbGVhblByb3BlcnR5KERJU0NPVkVSX0FOTk9UQVRFRF9DTEFTU0VTLCB0cnVlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCSk7Ci0JCQkKLQkJCWxpc3RDbGFzc2VzQnV0dG9uID0gY3JlYXRlQnV0dG9uKGdyb3VwLCAxLCBKcHRVaU1lc3NhZ2VzLkpwYUZhY2V0V2l6YXJkUGFnZV9saXN0Q2xhc3Nlc0J1dHRvbiwgU1dULlJBRElPKTsKLQkJCWxpc3RDbGFzc2VzQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKAotCQkJCW5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQkJd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCQltb2RlbC5zZXRCb29sZWFuUHJvcGVydHkoRElTQ09WRVJfQU5OT1RBVEVEX0NMQVNTRVMsIGZhbHNlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCSk7Ci0JCQkKLQkJCW1vZGVsLmFkZExpc3RlbmVyKAotCQkJCQluZXcgSURhdGFNb2RlbExpc3RlbmVyKCkgewotCQkJCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKERhdGFNb2RlbEV2ZW50IGV2ZW50KSB7Ci0JCQkJCQkJaWYgKERJU0NPVkVSX0FOTk9UQVRFRF9DTEFTU0VTLmVxdWFscyhldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSkpIHsKLQkJCQkJCQkJYm9vbGVhbiBkaXNjb3ZlckNsYXNzZXMgPSAoQm9vbGVhbikgZXZlbnQuZ2V0UHJvcGVydHkoKTsKLQkJCQkJCQkJZGlzY292ZXJDbGFzc2VzQnV0dG9uLnNldFNlbGVjdGlvbihkaXNjb3ZlckNsYXNzZXMpOwotCQkJCQkJCQlsaXN0Q2xhc3Nlc0J1dHRvbi5zZXRTZWxlY3Rpb24oISBkaXNjb3ZlckNsYXNzZXMpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCSk7Ci0JCQkKLQkJCXBlcmZvcm1EZWZhdWx0cygpOwotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQkJYm9vbGVhbiBkaXNjb3ZlckNsYXNzZXMgPSBnZXRKcGFQcm9qZWN0KCkuaXNEaXNjb3ZlckFubm90YXRlZENsYXNzZXMoKTsKLQkJCW1vZGVsLnNldFByb3BlcnR5KERJU0NPVkVSX0FOTk9UQVRFRF9DTEFTU0VTLCBkaXNjb3ZlckNsYXNzZXMpOwotCQkJZGlzY292ZXJDbGFzc2VzQnV0dG9uLnNldFNlbGVjdGlvbihkaXNjb3ZlckNsYXNzZXMpOwotCQkJbGlzdENsYXNzZXNCdXR0b24uc2V0U2VsZWN0aW9uKCEgZGlzY292ZXJDbGFzc2VzKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zZWxlY3Rpb24vQWJzdHJhY3RTZWxlY3Rpb25QYXJ0aWNpcGFudC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL0Fic3RyYWN0U2VsZWN0aW9uUGFydGljaXBhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI0MDhlZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zZWxlY3Rpb24vQWJzdHJhY3RTZWxlY3Rpb25QYXJ0aWNpcGFudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zZWxlY3Rpb247Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFNlbGVjdGlvblBhcnRpY2lwYW50IAotCWltcGxlbWVudHMgSVNlbGVjdGlvblBhcnRpY2lwYW50IAotewotCXByb3RlY3RlZCBJU2VsZWN0aW9uTWFuYWdlciBzZWxlY3Rpb25NYW5hZ2VyOwotCQotCQotCXByb3RlY3RlZCBBYnN0cmFjdFNlbGVjdGlvblBhcnRpY2lwYW50KElTZWxlY3Rpb25NYW5hZ2VyIHRoZVNlbGVjdGlvbk1hbmFnZXIpIHsKLQkJc2VsZWN0aW9uTWFuYWdlciA9IHRoZVNlbGVjdGlvbk1hbmFnZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL0lTZWxlY3Rpb25NYW5hZ2VyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zZWxlY3Rpb24vSVNlbGVjdGlvbk1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY3ZmQ2My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zZWxlY3Rpb24vSVNlbGVjdGlvbk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc2VsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVNlbGVjdGlvbk1hbmFnZXIgCi17CQotCS8qKgotCSAqIFJldHVybiB0aGUgY3VycmVudCBzZWxlY3Rpb24uICAKLQkgKiBUaGlzIHdpbGwgbmV2ZXIgYmUgbnVsbCwgYnV0IGl0IG1heSBiZSA8Y29kZT5TZWxlY3Rpb24uTlVMTF9TRUxFQ1RJT048L2NvZGU+LgotCSAqLwotCXB1YmxpYyBTZWxlY3Rpb24gZ2V0Q3VycmVudFNlbGVjdGlvbigpOwotCQotCS8qKgotCSAqIE5vdCB0byBiZSBjYWxsZWQgbGlnaHRseSwgdGhpcyB3aWxsIGFmZmVjdCB0aGUgc2VsZWN0aW9uIGZvciBhbGwgaW50ZXJlc3RlZAotCSAqIG9iamVjdHMgaW4gYSB3aW5kb3cuCi0JICogVGhlIG5ld1NlbGVjdGlvbiB3aWxsIGJlIHNlbGVjdGVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdChTZWxlY3Rpb24gbmV3U2VsZWN0aW9uKTsKLQkKLQkvKioKLQkgKiBOb3QgdG8gYmUgY2FsbGVkIGxpZ2h0bHksIHRoaXMgd2lsbCBhZmZlY3QgdGhlIHNlbGVjdGlvbiBmb3IgYWxsIGludGVyZXN0ZWQKLQkgKiBvYmplY3RzIGluIGEgd2luZG93LgotCSAqIFRoZSBvbGRTZWxlY3Rpb24gd2lsbCBiZSBkZXNlbGVjdGVkLCBpZmYgaXQgbWF0Y2hlcyB0aGUgY3VycmVudCBzZWxlY3Rpb24uCi0JICovCi0JcHVibGljIHZvaWQgZGVzZWxlY3QoU2VsZWN0aW9uIG9sZFNlbGVjdGlvbik7Ci0JCi0JLyoqCi0JICogVGhpcyBtYXkgYmUgdXNlZCB0byByZWdpc3RlciBhIHBhcnQgd2l0aCB0aGUgc2VsZWN0aW9uIG1hbmFnZXIgaWYgdGhlIHBhcnQKLQkgKiBpcyBrbm93biB0byBuZWVkIGFjY2VzcyB0byB0aGUgc2VsZWN0aW9uIG1hbmFnZXIgYmVmb3JlIGl0IGlzIGV2ZXIgYWN0aXZhdGVkCi0JICogb3IgaW4gdGhlIGNhc2UgaXQgbWF5IGJlIGFjdGl2YXRlZCBwcmlvciB0byB0aGUgc2VsZWN0aW9uIG1hbmFnZXIgYmVpbmcgCi0JICogY3JlYXRlZC4KLQkgKiAKLQkgKiBJdCBzaG91bGQgbm90IGJlIG5lY2Vzc2FyeSB0byBkZXJlZ2lzdGVyIGEgcGFydCwgYXMgdGhhdCBoYXBwZW5zIHdoZW4gdGhlIAotCSAqIHBhcnQgaXMgY2xvc2VkLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyKElXb3JrYmVuY2hQYXJ0IHBhcnQpOwkKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3NlbGVjdGlvbi9JU2VsZWN0aW9uUGFydGljaXBhbnQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3NlbGVjdGlvbi9JU2VsZWN0aW9uUGFydGljaXBhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY1N2QwMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zZWxlY3Rpb24vSVNlbGVjdGlvblBhcnRpY2lwYW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqICBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiAgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiAgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnNlbGVjdGlvbjsKLQotcHVibGljIGludGVyZmFjZSBJU2VsZWN0aW9uUGFydGljaXBhbnQgCi17Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBvZiB0aGUgcGFydGljaXBhbnQKLQkgKi8KLQlTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCk7Ci0JCi0JLyoqCi0JICogVGhlIHNlbGVjdGlvbiBoYXMgY2hhbmdlZCBpbiB0aGUgY2VudHJhbCBzZWxlY3Rpb24gbWFuYWdlci4KLQkgKiBVcGRhdGUgdGhpcyBwYXJ0aWNpcGFudCBhY2NvcmRpbmdseS4KLQkgKi8KLQl2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uRXZlbnQgZXZ0KTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGlzIHNlbGVjdGlvbiBwYXJ0aWNpcGFudCBzaG91bGQgZGlzY29ubmVjdCBpdHNlbGYgZnJvbQotCSAqIGl0cyBwYXJ0IHdoZW4gaXRzIHBhcnQgaXMgaGlkZGVuIGZyb20gdmlldy4KLQkgKiA8Yj5UeXBpY2FsbHk8L2I+IGVkaXRvciBwYXJ0aWNpcGFudHMgd2lsbCByZXR1cm4gdHJ1ZSBhbmQgdmlldyBwYXJ0aWNpcGFudHMgd2lsbAotCSAqIHJldHVybiBmYWxzZS4KLQkgKi8KLQlib29sZWFuIGRpc3Bvc2VPbkhpZGUoKTsKLQkKLQkvKioKLQkgKiBUaGlzIHBhcnRpY2lwYW50IGlzIG5vIGxvbmdlciBuZWVkZWQgKG1vc3QgbGlrZWx5IGJlY2F1c2UgaXRzIHBhcnQgaGFzIAotCSAqIGNsb3NlZCkuICBEaXNwb3NlIG9mIGl0LgotCSAqLwotCXZvaWQgZGlzcG9zZSgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL0pwYURldGFpbHNTZWxlY3Rpb25QYXJ0aWNpcGFudC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL0pwYURldGFpbHNTZWxlY3Rpb25QYXJ0aWNpcGFudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTg0YWI0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3NlbGVjdGlvbi9KcGFEZXRhaWxzU2VsZWN0aW9uUGFydGljaXBhbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc2VsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnZpZXdzLkpwYURldGFpbHNWaWV3OwotCi0KLXB1YmxpYyBjbGFzcyBKcGFEZXRhaWxzU2VsZWN0aW9uUGFydGljaXBhbnQgZXh0ZW5kcyBBYnN0cmFjdFNlbGVjdGlvblBhcnRpY2lwYW50IAotewotCXByaXZhdGUgSnBhRGV0YWlsc1ZpZXcgZGV0YWlsc1ZpZXc7Ci0JCi0JCi0JcHVibGljIEpwYURldGFpbHNTZWxlY3Rpb25QYXJ0aWNpcGFudCgKLQkJCQlJU2VsZWN0aW9uTWFuYWdlciB0aGVTZWxlY3Rpb25NYW5hZ2VyLCBKcGFEZXRhaWxzVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHRoZVNlbGVjdGlvbk1hbmFnZXIpOwotCQlkZXRhaWxzVmlldyA9IHZpZXc7Ci0JfQotCQotCQotCXB1YmxpYyBTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gZGV0YWlsc1ZpZXcuZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25FdmVudCBldnQpIHsKLQkJZGV0YWlsc1ZpZXcuc2VsZWN0KGV2dC5nZXRTZWxlY3Rpb24oKSk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGRpc3Bvc2VPbkhpZGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gbm8gb3AKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zZWxlY3Rpb24vSnBhU3RydWN0dXJlU2VsZWN0aW9uUGFydGljaXBhbnQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3NlbGVjdGlvbi9KcGFTdHJ1Y3R1cmVTZWxlY3Rpb25QYXJ0aWNpcGFudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmE5NDk5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3NlbGVjdGlvbi9KcGFTdHJ1Y3R1cmVTZWxlY3Rpb25QYXJ0aWNpcGFudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zZWxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnZpZXdzLkpwYVN0cnVjdHVyZVZpZXc7Ci0KLXB1YmxpYyBjbGFzcyBKcGFTdHJ1Y3R1cmVTZWxlY3Rpb25QYXJ0aWNpcGFudCAKLQlleHRlbmRzIEFic3RyYWN0U2VsZWN0aW9uUGFydGljaXBhbnQgCi17Ci0JcHJpdmF0ZSBKcGFTdHJ1Y3R1cmVWaWV3IHN0cnVjdHVyZVZpZXc7Ci0JCi0JcHJpdmF0ZSBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHN0cnVjdHVyZVZpZXdMaXN0ZW5lcjsKLQkKLQkKLQlwdWJsaWMgSnBhU3RydWN0dXJlU2VsZWN0aW9uUGFydGljaXBhbnQoCi0JCQkJSVNlbGVjdGlvbk1hbmFnZXIgdGhlU2VsZWN0aW9uTWFuYWdlciwgSnBhU3RydWN0dXJlVmlldyB0aGVPdXRsaW5lVmlldykgewotCQlzdXBlcih0aGVTZWxlY3Rpb25NYW5hZ2VyKTsKLQkJc3RydWN0dXJlVmlldyA9IHRoZU91dGxpbmVWaWV3OwotCQlzdHJ1Y3R1cmVWaWV3TGlzdGVuZXIgPSBuZXcgU3RydWN0dXJlVmlld1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JCXN0cnVjdHVyZVZpZXcuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHN0cnVjdHVyZVZpZXdMaXN0ZW5lcik7Ci0JfQotCQotCQotCXB1YmxpYyBTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gc3RydWN0dXJlVmlldy5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25FdmVudCBldnQpIHsKLQkJc3RydWN0dXJlVmlldy5zZWxlY3QoZXZ0LmdldFNlbGVjdGlvbigpKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZGlzcG9zZU9uSGlkZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBubyBvcAotCX0KLQkKLQkKLQlwcml2YXRlIGNsYXNzIFN0cnVjdHVyZVZpZXdTZWxlY3Rpb25MaXN0ZW5lciAKLQkJaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyCi0JewotCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJc2VsZWN0aW9uTWFuYWdlci5zZWxlY3Qoc3RydWN0dXJlVmlldy5nZXRTZWxlY3Rpb24oKSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zZWxlY3Rpb24vU2VsZWN0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zZWxlY3Rpb24vU2VsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwMmQ2ODQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL1NlbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zZWxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JSnBhQ29udGVudE5vZGU7Ci0KLQotcHVibGljIGNsYXNzIFNlbGVjdGlvbiAKLXsKLQlwdWJsaWMgc3RhdGljIFNlbGVjdGlvbiBOVUxMX1NFTEVDVElPTiA9IG5ldyBTZWxlY3Rpb24oKTsKLQkKLQlwcml2YXRlIElKcGFDb250ZW50Tm9kZSBzZWxlY3RlZE5vZGU7Ci0JCi0JCi0JLyogVXNlZCBpbnRlcm5hbGx5IC0gb25seSBmb3IgTlVMTF9TRUxFQ1RJT04gKi8KLQlwcml2YXRlIFNlbGVjdGlvbigpIHt9Ci0JCi0JcHVibGljIFNlbGVjdGlvbihJSnBhQ29udGVudE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJNdXN0IGhhdmUgbm9uLW51bGwgbm9kZS4gIFVzZSBOVUxMX1NFTEVDVElPTiBvdGhlcndpc2UuIik7Ci0JCX0KLQkJCi0JCXNlbGVjdGVkTm9kZSA9IG5vZGU7Ci0JfQotCQotCXB1YmxpYyBJSnBhQ29udGVudE5vZGUgZ2V0U2VsZWN0ZWROb2RlKCkgewotCQlyZXR1cm4gc2VsZWN0ZWROb2RlOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAoISAob2JqIGluc3RhbmNlb2YgU2VsZWN0aW9uKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpZiAodGhpcyA9PSBOVUxMX1NFTEVDVElPTiAmJiBvYmogPT0gTlVMTF9TRUxFQ1RJT04pIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlpZiAodGhpcyA9PSBOVUxMX1NFTEVDVElPTiB8fCBvYmogPT0gTlVMTF9TRUxFQ1RJT04pIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJcmV0dXJuIHRoaXMuc2VsZWN0ZWROb2RlLmVxdWFscygoKFNlbGVjdGlvbikgb2JqKS5zZWxlY3RlZE5vZGUpOwotCX0KLQkKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlpZiAodGhpcyA9PSBOVUxMX1NFTEVDVElPTikgewotCQkJcmV0dXJuIHN1cGVyLmhhc2hDb2RlKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gdGhpcy5zZWxlY3RlZE5vZGUuaGFzaENvZGUoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAodGhpcyA9PSBOVUxMX1NFTEVDVElPTikgewotCQkJcmV0dXJuICJOVUxMX1NFTEVDVElPTiI7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gc2VsZWN0ZWROb2RlLnRvU3RyaW5nKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zZWxlY3Rpb24vU2VsZWN0aW9uRXZlbnQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3NlbGVjdGlvbi9TZWxlY3Rpb25FdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDIwZWYzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3NlbGVjdGlvbi9TZWxlY3Rpb25FdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zZWxlY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7Ci0KLXB1YmxpYyBjbGFzcyBTZWxlY3Rpb25FdmVudCBleHRlbmRzIEV2ZW50T2JqZWN0IAotewotCS8qKgotCSAqIFNlcmlhbGl6YWJsZSB1aWQKLQkgKiBAc2luY2UgMC41Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0gICAgCi0JCi0JLyoqCi0JICogSW5kaWNhdGVzIHRoYXQgdGhlIHNlbGVjdGlvbiBvYmplY3QgaXMgbm93IHNlbGVjdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgU0VMRUNUSU9OID0gMTsKLQkKLQkvKioKLQkgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgc2VsZWN0aW9uIG9iamVjdCBoYXMgbm93IGJlZW4gZGVzZWxlY3RlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IERFU0VMRUNUSU9OID0gMjsKLQkKLQkKLQkvKioKLQkgKiBUaGUgc2VsZWN0aW9uIG9iamVjdCB3aG9zZSBzZWxlY3Rpb24gc3RhdHVzIGhhcyBjaGFuZ2VkCi0JICovCi0JcHJpdmF0ZSBTZWxlY3Rpb24gc2VsZWN0aW9uOwotCQotCS8qKgotCSAqIFRoZSB0eXBlIG9mIHRoZSBzZWxlY3Rpb24gZXZlbnQsIGVpdGhlciBhIFNFTEVDVElPTiBvciBhIERFU0VMRUNUSU9OCi0JICovCi0JcHJpdmF0ZSBpbnQgdHlwZTsKLQkKLQkKLQlwdWJsaWMgU2VsZWN0aW9uRXZlbnQoU2VsZWN0aW9uIHRoZVNlbGVjdGlvbiwgaW50IHRoZVR5cGUsIE9iamVjdCBzb3VyY2UpIHsKLQkJc3VwZXIoc291cmNlKTsKLQkJc2VsZWN0aW9uID0gdGhlU2VsZWN0aW9uOwotCQl0eXBlID0gdGhlVHlwZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzZWxlY3Rpb24gb2JqZWN0IHdob3NlIHNlbGVjdGlvbiBzdGF0dXMgaGFzIGNoYW5nZWQKLQkgKi8KLQlwdWJsaWMgU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIHNlbGVjdGlvbjsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0eXBlIG9mIHNlbGVjdGlvbiBldmVudCwgZWl0aGVyIGEgU0VMRUNUSU9OIG9yIGEgREVTRUxFQ1RJT04KLQkgKi8KLQlwdWJsaWMgaW50IGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3NlbGVjdGlvbi9TZWxlY3Rpb25NYW5hZ2VyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zZWxlY3Rpb24vU2VsZWN0aW9uTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWFmMDhkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3NlbGVjdGlvbi9TZWxlY3Rpb25NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zZWxlY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFnZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYXJ0TGlzdGVuZXIyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci0KLS8qKgotICogQSA8Y29kZT5TZWxlY3Rpb25NYW5hZ2VyPC9jb2RlPiBzdG9yZXMgdGhlIGN1cnJlbnQgPGNvZGU+U2VsZWN0aW9uPC9jb2RlPiBhbmQgCi0gKiBub3RpZmllcyA8Y29kZT5JU2VsZWN0aW9uTGlzdGVuZXI8L2NvZGU+cyB3aGVuIHRoZSBzZWxlY3Rpb24gY2hhbmdlcy4KLSAqLwotcHVibGljIGNsYXNzIFNlbGVjdGlvbk1hbmFnZXIKLQlpbXBsZW1lbnRzIElTZWxlY3Rpb25NYW5hZ2VyCi17Ci0JLyogVGhlIHNldCBvZiBwYWdlcyBmb3Igd2hpY2ggdGhpcyBvYmplY3QgaXMgbWFuYWdpbmcgc2VsZWN0aW9ucyAqLwotCXByaXZhdGUgU2V0IHBhZ2VzOwotCQotCS8qIFRoZSBtYXAgb2YgPGNvZGU+SVNlbGVjdGlvblBhcnRpY2lwYW50PC9jb2RlPnMgKGtleWVkIGJ5IHBhcnQpIHRoaXMgb2JqZWN0Ci0JICAgaXMgdXNpbmcgdG8gbWFuYWdlIHNlbGVjdGlvbnMgKi8KLQlwcml2YXRlIE1hcCBzZWxlY3Rpb25QYXJ0aWNpcGFudHM7Ci0JCi0JcHJpdmF0ZSBJUGFnZUxpc3RlbmVyIHBhZ2VMaXN0ZW5lcjsKLQkKLQlwcml2YXRlIElQYXJ0TGlzdGVuZXIyIHBhcnRMaXN0ZW5lcjsKLQkKLQkvKiBUaGUgd2luZG93IGZvciB3aGljaCB0aGlzIG9iamVjdCBtYW5hZ2VzIHNlbGVjdGlvbnMgKi8KLQlwcml2YXRlIElXb3JrYmVuY2hXaW5kb3cgd2luZG93OwotCQotCXByaXZhdGUgU2VsZWN0aW9uIGN1cnJlbnRTZWxlY3Rpb247Ci0JCi0JCi0JcHVibGljIFNlbGVjdGlvbk1hbmFnZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCXBhZ2VzID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkU2V0KG5ldyBIYXNoU2V0KCkpOwotCQlzZWxlY3Rpb25QYXJ0aWNpcGFudHMgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRNYXAobmV3IEhhc2hNYXAoKSk7Ci0JCXBhZ2VMaXN0ZW5lciA9IG5ldyBQYWdlTGlzdGVuZXIoKTsKLQkJcGFydExpc3RlbmVyID0gbmV3IFBhcnRMaXN0ZW5lcigpOwotCQljdXJyZW50U2VsZWN0aW9uID0gU2VsZWN0aW9uLk5VTExfU0VMRUNUSU9OOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2hXaW5kb3cgYVdpbmRvdykgewotCQl3aW5kb3cgPSBhV2luZG93OwotCQlhV2luZG93LmFkZFBhZ2VMaXN0ZW5lcihwYWdlTGlzdGVuZXIpOwotCQlpbml0UGFnZShhV2luZG93LmdldEFjdGl2ZVBhZ2UoKSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBpbml0UGFnZShJV29ya2JlbmNoUGFnZSBwYWdlKSB7Ci0JCWlmICgocGFnZSAhPSBudWxsKSAmJiAoISBwYWdlcy5jb250YWlucyhwYWdlKSkpIHsKLQkJCXBhZ2UuYWRkUGFydExpc3RlbmVyKHBhcnRMaXN0ZW5lcik7Ci0JCQlwYWdlcy5hZGQocGFnZSk7Ci0JCQlJRWRpdG9yUGFydCBhY3RpdmVFZGl0b3IgPSBwYWdlLmdldEFjdGl2ZUVkaXRvcigpOwotCQkJaW5pdFBhcnQoYWN0aXZlRWRpdG9yKTsKLQkJCXNlbGVjdFBhcnQoYWN0aXZlRWRpdG9yKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgZGlzcG9zZVBhZ2UoSVdvcmtiZW5jaFBhZ2UgcGFnZSkgewotCQlpZiAoKHBhZ2UgIT0gbnVsbCkgJiYgKHBhZ2VzLmNvbnRhaW5zKHBhZ2UpKSkgewotCQkJcGFnZS5yZW1vdmVQYXJ0TGlzdGVuZXIocGFydExpc3RlbmVyKTsKLQkJCXBhZ2VzLnJlbW92ZShwYWdlKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgaW5pdFBhcnQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQlpZiAocGFydCAhPSBudWxsKSB7Ci0JCQlpZiAoc2VsZWN0aW9uUGFydGljaXBhbnRzLmdldChwYXJ0KSA9PSBudWxsKSB7Ci0JCQkJSVNlbGVjdGlvblBhcnRpY2lwYW50IHNlbGVjdGlvblBhcnRpY2lwYW50ID0gCi0JCQkJCShJU2VsZWN0aW9uUGFydGljaXBhbnQpIHBhcnQuZ2V0QWRhcHRlcihJU2VsZWN0aW9uUGFydGljaXBhbnQuY2xhc3MpOwotCQkJCWlmIChzZWxlY3Rpb25QYXJ0aWNpcGFudCAhPSBudWxsKSB7Ci0JCQkJCXNlbGVjdGlvblBhcnRpY2lwYW50cy5wdXQocGFydCwgc2VsZWN0aW9uUGFydGljaXBhbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2VsZWN0UGFydChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCUlTZWxlY3Rpb25QYXJ0aWNpcGFudCBzZWxlY3Rpb25QYXJ0aWNpcGFudCA9IGdldFNlbGVjdGlvblBhcnRpY2lwYW50KHBhcnQpOwotCQlpZiAoc2VsZWN0aW9uUGFydGljaXBhbnQgIT0gbnVsbCkgewotCQkJc2VsZWN0KHNlbGVjdGlvblBhcnRpY2lwYW50LmdldFNlbGVjdGlvbigpKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgaGlkZVBhcnQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQlJU2VsZWN0aW9uUGFydGljaXBhbnQgc2VsZWN0aW9uUGFydGljaXBhbnQgPSBnZXRTZWxlY3Rpb25QYXJ0aWNpcGFudChwYXJ0KTsKLQkJaWYgKChzZWxlY3Rpb25QYXJ0aWNpcGFudCAhPSBudWxsKSAmJiAoc2VsZWN0aW9uUGFydGljaXBhbnQuZGlzcG9zZU9uSGlkZSgpKSkgewotCQkJY2xvc2VQYXJ0KHBhcnQpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjbG9zZVBhcnQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQlJU2VsZWN0aW9uUGFydGljaXBhbnQgc2VsZWN0aW9uUGFydGljaXBhbnQgPSBnZXRTZWxlY3Rpb25QYXJ0aWNpcGFudChwYXJ0KTsKLQkJaWYgKHNlbGVjdGlvblBhcnRpY2lwYW50ICE9IG51bGwpIHsKLQkJCWRpc3Bvc2VQYXJ0KHBhcnQpOwotCQkJY2hlY2tGb3JOb0VkaXRvcnMoKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgZGlzcG9zZVBhcnQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQlpZiAoKHBhcnQgIT0gbnVsbCkgJiYgKHNlbGVjdGlvblBhcnRpY2lwYW50cy5jb250YWluc0tleShwYXJ0KSkpIHsKLQkJCUlTZWxlY3Rpb25QYXJ0aWNpcGFudCBzZWxlY3Rpb25QYXJ0aWNpcGFudCA9IAotCQkJCShJU2VsZWN0aW9uUGFydGljaXBhbnQpIHNlbGVjdGlvblBhcnRpY2lwYW50cy5yZW1vdmUocGFydCk7Ci0JCQlzZWxlY3Rpb25QYXJ0aWNpcGFudC5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNoZWNrRm9yTm9FZGl0b3JzKCkgewotCQlJV29ya2JlbmNoUGFnZSBhY3RpdmVQYWdlID0gd2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLQkJaWYgKChhY3RpdmVQYWdlID09IG51bGwpCi0JCQkJfHwgKGFjdGl2ZVBhZ2UuZ2V0QWN0aXZlRWRpdG9yKCkgPT0gbnVsbCkpIHsKLQkJCXNlbGVjdChTZWxlY3Rpb24uTlVMTF9TRUxFQ1RJT04pOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgbWF5IGJlIHVzZWQgdG8gcmVnaXN0ZXIgYSBwYXJ0IHdpdGggdGhlIHNlbGVjdGlvbiBtYW5hZ2VyIGlmIHRoZSBwYXJ0Ci0JICogaXMga25vd24gdG8gbmVlZCBhY2Nlc3MgdG8gdGhlIHNlbGVjdGlvbiBtYW5hZ2VyIGJlZm9yZSBpdCBpcyBldmVyIGFjdGl2YXRlZAotCSAqIG9yIGluIHRoZSBjYXNlIGl0IG1heSBiZSBhY3RpdmF0ZWQgcHJpb3IgdG8gdGhlIHNlbGVjdGlvbiBtYW5hZ2VyIGJlaW5nIAotCSAqIGNyZWF0ZWQuCi0JICogCi0JICogSXQgc2hvdWxkIG5vdCBiZSBuZWNlc3NhcnkgdG8gZGVyZWdpc3RlciBhIHBhcnQsIGFzIHRoYXQgaGFwcGVucyB3aGVuIHRoZSAKLQkgKiBwYXJ0IGlzIGNsb3NlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWdpc3RlcihJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCWluaXRQYXJ0KHBhcnQpOwotCX0KLQkKLQkvKioKLQkgKiBOb3QgdG8gYmUgY2FsbGVkIGxpZ2h0bHksIHRoaXMgd2lsbCBhZmZlY3QgdGhlIHNlbGVjdGlvbiBmb3IgYWxsIGludGVyZXN0ZWQKLQkgKiBvYmplY3RzIGluIGEgd2luZG93LgotCSAqIFRoZSBuZXdTZWxlY3Rpb24gd2lsbCBiZSBzZWxlY3RlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3QoU2VsZWN0aW9uIG5ld1NlbGVjdGlvbikgewotCQlpZiAoY3VycmVudFNlbGVjdGlvbi5lcXVhbHMobmV3U2VsZWN0aW9uKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQljdXJyZW50U2VsZWN0aW9uID0gbmV3U2VsZWN0aW9uOwotCQlmaXJlU2VsZWN0aW9uQ2hhbmdlKAotCQkJbmV3IFNlbGVjdGlvbkV2ZW50KG5ld1NlbGVjdGlvbiwgU2VsZWN0aW9uRXZlbnQuU0VMRUNUSU9OLCB0aGlzKQotCQkpOwotCX0KLQkKLQkvKioKLQkgKiBOb3QgdG8gYmUgY2FsbGVkIGxpZ2h0bHksIHRoaXMgd2lsbCBhZmZlY3QgdGhlIHNlbGVjdGlvbiBmb3IgYWxsIGludGVyZXN0ZWQKLQkgKiBvYmplY3RzIGluIGEgd2luZG93LgotCSAqIFRoZSBvbGRTZWxlY3Rpb24gd2lsbCBiZSBkZXNlbGVjdGVkLCBpZmYgaXQgbWF0Y2hlcyB0aGUgY3VycmVudCBzZWxlY3Rpb24uCi0JICovCi0JcHVibGljIHZvaWQgZGVzZWxlY3QoU2VsZWN0aW9uIG9sZFNlbGVjdGlvbikgewotCQlpZiAoY3VycmVudFNlbGVjdGlvbi5lcXVhbHMob2xkU2VsZWN0aW9uKSkgewotCQkJY3VycmVudFNlbGVjdGlvbiA9IFNlbGVjdGlvbi5OVUxMX1NFTEVDVElPTjsKLQkJCWZpcmVTZWxlY3Rpb25DaGFuZ2UoCi0JCQkJbmV3IFNlbGVjdGlvbkV2ZW50KG9sZFNlbGVjdGlvbiwgU2VsZWN0aW9uRXZlbnQuREVTRUxFQ1RJT04sIHRoaXMpCi0JCQkpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBmaXJlU2VsZWN0aW9uQ2hhbmdlKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCWZvciAoSXRlcmF0b3Igc3RyZWFtID0gc2VsZWN0aW9uUGFydGljaXBhbnRzLnZhbHVlcygpLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJKChJU2VsZWN0aW9uUGFydGljaXBhbnQpIHN0cmVhbS5uZXh0KCkpLnNlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgSVNlbGVjdGlvblBhcnRpY2lwYW50IGdldFNlbGVjdGlvblBhcnRpY2lwYW50KElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJcmV0dXJuIChJU2VsZWN0aW9uUGFydGljaXBhbnQpIHNlbGVjdGlvblBhcnRpY2lwYW50cy5nZXQocGFydCk7Ci0JfQotCQkKLQlwdWJsaWMgU2VsZWN0aW9uIGdldEN1cnJlbnRTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBjdXJyZW50U2VsZWN0aW9uOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl3aW5kb3cucmVtb3ZlUGFnZUxpc3RlbmVyKHBhZ2VMaXN0ZW5lcik7Ci0JCXNlbGVjdGlvblBhcnRpY2lwYW50cy5jbGVhcigpOwotCQkKLQkJZm9yIChJdGVyYXRvciBzdHJlYW0gPSBuZXcgQ2xvbmVJdGVyYXRvcihwYWdlcyk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJZGlzcG9zZVBhZ2UoKElXb3JrYmVuY2hQYWdlKSBzdHJlYW0ubmV4dCgpKTsKLQkJfQotCQkKLQkJZm9yIChJdGVyYXRvciBzdHJlYW0gPSBuZXcgQ2xvbmVJdGVyYXRvcihzZWxlY3Rpb25QYXJ0aWNpcGFudHMua2V5U2V0KCkpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCWRpc3Bvc2VQYXJ0KChJV29ya2JlbmNoUGFydCkgc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQl9Ci0JCi0JCi0JcHJpdmF0ZSBjbGFzcyBQYWdlTGlzdGVuZXIgaW1wbGVtZW50cyBJUGFnZUxpc3RlbmVyCi0JewotCQlwdWJsaWMgdm9pZCBwYWdlQWN0aXZhdGVkKElXb3JrYmVuY2hQYWdlIHBhZ2UpIHt9Ci0JCQotCQlwdWJsaWMgdm9pZCBwYWdlQ2xvc2VkKElXb3JrYmVuY2hQYWdlIHBhZ2UpIHsKLQkJCWRpc3Bvc2VQYWdlKHBhZ2UpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBwYWdlT3BlbmVkKElXb3JrYmVuY2hQYWdlIHBhZ2UpIHsKLQkJCWluaXRQYWdlKHBhZ2UpOwotCQl9Ci0JfQotCQotCQotCXByaXZhdGUgY2xhc3MgUGFydExpc3RlbmVyIGltcGxlbWVudHMgSVBhcnRMaXN0ZW5lcjIKLQl7Ci0JCXB1YmxpYyB2b2lkIHBhcnRBY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnRSZWZlcmVuY2UgcGFydFJlZikgewotCQkJSVdvcmtiZW5jaFBhcnQgcGFydCA9IHBhcnRSZWYuZ2V0UGFydChmYWxzZSk7Ci0JCQlpZiAocGFydCAhPSBudWxsKSB7Ci0JCQkJaW5pdFBhcnQocGFydCk7Ci0JCQkJc2VsZWN0UGFydChwYXJ0KTsKLQkJCX0KLQkJfQotCQkKLQkJcHVibGljIHZvaWQgcGFydEJyb3VnaHRUb1RvcChJV29ya2JlbmNoUGFydFJlZmVyZW5jZSBwYXJ0UmVmKSB7fQotCQkKLQkJcHVibGljIHZvaWQgcGFydENsb3NlZChJV29ya2JlbmNoUGFydFJlZmVyZW5jZSBwYXJ0UmVmKSB7Ci0JCQlJV29ya2JlbmNoUGFydCBwYXJ0ID0gcGFydFJlZi5nZXRQYXJ0KGZhbHNlKTsKLQkJCWlmIChwYXJ0ICE9IG51bGwpIHsKLQkJCQljbG9zZVBhcnQocGFydCk7Ci0JCQkJZGlzcG9zZVBhcnQocGFydCk7Ci0JCQkJY2hlY2tGb3JOb0VkaXRvcnMoKTsKLQkJCX0KLQkJfQotCQkKLQkJcHVibGljIHZvaWQgcGFydERlYWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlIHBhcnRSZWYpIHt9Ci0JCQotCQlwdWJsaWMgdm9pZCBwYXJ0SGlkZGVuKElXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlIHBhcnRSZWYpIHsKLQkJCUlXb3JrYmVuY2hQYXJ0IHBhcnQgPSBwYXJ0UmVmLmdldFBhcnQoZmFsc2UpOwotCQkJaWYgKHBhcnQgIT0gbnVsbCkgewotCQkJCWhpZGVQYXJ0KHBhcnQpOwotCQkJfQotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBwYXJ0SW5wdXRDaGFuZ2VkKElXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlIHBhcnRSZWYpIHt9Ci0JCQotCQlwdWJsaWMgdm9pZCBwYXJ0T3BlbmVkKElXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlIHBhcnRSZWYpIHsKLQkJCUlXb3JrYmVuY2hQYXJ0IHBhcnQgPSBwYXJ0UmVmLmdldFBhcnQoZmFsc2UpOwotCQkJaWYgKHBhcnQgIT0gbnVsbCkgewotCQkJCWluaXRQYXJ0KHBhcnQpOwotCQkJfQotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBwYXJ0VmlzaWJsZShJV29ya2JlbmNoUGFydFJlZmVyZW5jZSBwYXJ0UmVmKSB7Ci0JCQlJV29ya2JlbmNoUGFydCBwYXJ0ID0gcGFydFJlZi5nZXRQYXJ0KGZhbHNlKTsKLQkJCWlmIChwYXJ0ICE9IG51bGwpIHsKLQkJCQlpbml0UGFydChwYXJ0KTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3NlbGVjdGlvbi9TZWxlY3Rpb25NYW5hZ2VyRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL1NlbGVjdGlvbk1hbmFnZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjZmU2ZTYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL1NlbGVjdGlvbk1hbmFnZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zZWxlY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXaW5kb3dMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotcHVibGljIGNsYXNzIFNlbGVjdGlvbk1hbmFnZXJGYWN0b3J5IAotewotCXByaXZhdGUgc3RhdGljIFNlbGVjdGlvbk1hbmFnZXJGYWN0b3J5IElOU1RBTkNFOwotCQotCXByaXZhdGUgc3RhdGljIE9iamVjdCBNVVRFWCA9IG5ldyBPYmplY3QoKTsKLQkKLQkKLQkvKioKLQkgKiBFYWNoIDxjb2RlPklXb3JrYmVuY2hXaW5kb3c8L2NvZGU+IGhhcyBpdHMgb3duIDxjb2RlPlNlbGVjdGlvbk1hbmFnZXI8L2NvZGU+IAotCSAqIHRvIHRyYWNrIHRoZSBzZWxlY3Rpb24gZXZlbnRzIGluIHRoZSA8Y29kZT5JV29ya2JlbmNoV2luZG93PC9jb2RlPi4gQWxsIAotCSAqIDxjb2RlPklTZWxlY3Rpb25MaXN0ZW5lcjwvY29kZT5zIGluIHRoZSBzYW1lIDxjb2RlPklXb3JrYmVuY2hXaW5kb3c8L2NvZGU+IAotCSAqIHNoYXJlIHRoZSBzYW1lIDxjb2RlPlNlbGVjdGlvbk1hbmFnZXI8L2NvZGU+LgotCSAqIAotCSAqIEByZXR1cm4gVGhlIDxjb2RlPlNlbGVjdGlvbk1hbmFnZXI8L2NvZGU+IGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCAKLQkgKiA8Y29kZT5JV29ya2JlbmNoV2luZG93PC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVNlbGVjdGlvbk1hbmFnZXIgZ2V0U2VsZWN0aW9uTWFuYWdlcihJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQlpZiAoSU5TVEFOQ0UgPT0gbnVsbCkgewotCQkJLy8gdGhpcyBpcyB0aHJlYWQgc2FmZSBmb3Igbm93LiB5b3UgbmV2ZXIga25vdyB3aGF0cyBjb21taW5nCi0JCQlzeW5jaHJvbml6ZWQgKE1VVEVYKSB7Ci0JCQkJaWYoSU5TVEFOQ0UgPT0gbnVsbCkgewotCQkJCQlJTlNUQU5DRSA9IG5ldyBTZWxlY3Rpb25NYW5hZ2VyRmFjdG9yeSgpOwotCQkJCQkvLyBpZiB3ZSBkbyB0aGUgaW5pdCBpbnNpZGUgdGhlIGNvbnN0cnVjdG9yIHdlIGVuZCB1cCBpbiBhIGxvb3AKLQkJCQkJLy8gYmVjYXVzZSB0aGUgYWRkV2luZG93TGlzdGVuZXIodGhpcykgZG9lcyBhIGNhbGxiYWNrIHRvIHVzCi0JCQkJCUlOU1RBTkNFLmluaXQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIElOU1RBTkNFLmludGVybmFsR2V0U2VsZWN0aW9uTWFuYWdlcih3aW5kb3cpOwotCX0KLQkKLQkKLQlwcml2YXRlIE1hcCBtYW5hZ2VyczsKLQkKLQlwcml2YXRlIFdpbmRvd0xpc3RlbmVyIHdpbmRvd0xpc3RlbmVyOwotCQotCQotCXByaXZhdGUgU2VsZWN0aW9uTWFuYWdlckZhY3RvcnkoKSB7Ci0JCW1hbmFnZXJzID0gbmV3IEhhc2hNYXAoKTsKLQkJd2luZG93TGlzdGVuZXIgPSBuZXcgV2luZG93TGlzdGVuZXIoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGluaXQoKSB7Ci0JCUlXb3JrYmVuY2ggd29ya2JlbmNoID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsKLQkJd29ya2JlbmNoLmFkZFdpbmRvd0xpc3RlbmVyKHdpbmRvd0xpc3RlbmVyKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgU2VsZWN0aW9uTWFuYWdlciBmb3IgdGhlIElXb3JrYmVuY2hXaW5kb3cuCi0JICogQ3JlYXRlcyBhIG5ldyBvbmUgaWYgbm9uZSBleGlzdHMgeWV0LgotCSAqLwotCXByaXZhdGUgU2VsZWN0aW9uTWFuYWdlciBpbnRlcm5hbEdldFNlbGVjdGlvbk1hbmFnZXIoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLQkJaWYgKHdpbmRvdyA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHdpbmRvdy50b1N0cmluZygpKTsKLQkJfQotCQkKLQkJaWYgKCEgbWFuYWdlcnMuY29udGFpbnNLZXkod2luZG93KSkgewotCQkJU2VsZWN0aW9uTWFuYWdlciBtYW5hZ2VyID0gbmV3IFNlbGVjdGlvbk1hbmFnZXIoKTsKLQkJCXRoaXMubWFuYWdlcnMucHV0KHdpbmRvdywgbWFuYWdlcik7Ci0JCQltYW5hZ2VyLmluaXQod2luZG93KTsKLQkJfQotCQkKLQkJcmV0dXJuIChTZWxlY3Rpb25NYW5hZ2VyKSBtYW5hZ2Vycy5nZXQod2luZG93KTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBjbGFzcyBXaW5kb3dMaXN0ZW5lciBpbXBsZW1lbnRzIElXaW5kb3dMaXN0ZW5lcgotCXsKLQkJLyogQHNlZSBJV2luZG93TGlzdGVuZXIjd2luZG93T3BlbmVkKElXb3JrYmVuY2hXaW5kb3cpICovCi0JCXB1YmxpYyB2b2lkIHdpbmRvd09wZW5lZChJV29ya2JlbmNoV2luZG93IGFXaW5kb3cpIHt9Ci0JCQotCQkvKiBAc2VlIElXaW5kb3dMaXN0ZW5lciN3aW5kb3dDbG9zZWQoSVdvcmtiZW5jaFdpbmRvdykgKi8KLQkJcHVibGljIHZvaWQgd2luZG93Q2xvc2VkKElXb3JrYmVuY2hXaW5kb3cgYVdpbmRvdykgewotCQkJU2VsZWN0aW9uTWFuYWdlciBtYW5hZ2VyID0gaW50ZXJuYWxHZXRTZWxlY3Rpb25NYW5hZ2VyKGFXaW5kb3cpOwotCQkJbWFuYWdlci5kaXNwb3NlKCk7Ci0JCQltYW5hZ2Vycy5yZW1vdmUoYVdpbmRvdyk7Ci0JCX0KLQkJCi0JCS8qIEBzZWUgSVdpbmRvd0xpc3RlbmVyI3dpbmRvd0FjdGl2YXRlZChJV29ya2JlbmNoV2luZG93KSAqLwotCQlwdWJsaWMgdm9pZCB3aW5kb3dBY3RpdmF0ZWQoSVdvcmtiZW5jaFdpbmRvdyBhV2luZG93KSB7fQotCQkKLQkJLyogQHNlZSBJV2luZG93TGlzdGVuZXIjd2luZG93RGVhY3RpdmF0ZWQoSVdvcmtiZW5jaFdpbmRvdykgKi8KLQkJcHVibGljIHZvaWQgd2luZG93RGVhY3RpdmF0ZWQoSVdvcmtiZW5jaFdpbmRvdyBhV2luZG93KSB7fQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3NlbGVjdGlvbi9TZWxlY3Rpb25QYXJ0aWNpcGFudEZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3NlbGVjdGlvbi9TZWxlY3Rpb25QYXJ0aWNpcGFudEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM5MDczOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zZWxlY3Rpb24vU2VsZWN0aW9uUGFydGljaXBhbnRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnNlbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnZpZXdzLkpwYURldGFpbHNWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC52aWV3cy5KcGFTdHJ1Y3R1cmVWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci0KLXB1YmxpYyBjbGFzcyBTZWxlY3Rpb25QYXJ0aWNpcGFudEZhY3RvcnkgCi0JaW1wbGVtZW50cyBJQWRhcHRlckZhY3RvcnkKLXsKLQkvKiBAc2VlIElBZGFwdGVyRmFjdG9yeSNnZXRBZGFwdGVyKE9iamVjdCwgQ2xhc3MpICovCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKE9iamVjdCBhZGFwdGFibGVPYmplY3QsIENsYXNzIGFkYXB0ZXJUeXBlKSB7Ci0JCWlmICghIChhZGFwdGFibGVPYmplY3QgaW5zdGFuY2VvZiBJV29ya2JlbmNoUGFydCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlJU2VsZWN0aW9uTWFuYWdlciBzZWxlY3Rpb25NYW5hZ2VyID0gCi0JCQlTZWxlY3Rpb25NYW5hZ2VyRmFjdG9yeS5nZXRTZWxlY3Rpb25NYW5hZ2VyKCgoSVdvcmtiZW5jaFBhcnQpIGFkYXB0YWJsZU9iamVjdCkuZ2V0U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpKTsKLQkJLy8gVE9ETyAtIHR1cm4gdGhpcyBpbnRvIGV4dGVuc2lvbiBwb2ludAotCQlpZiAoYWRhcHRhYmxlT2JqZWN0IGluc3RhbmNlb2YgSVRleHRFZGl0b3IpIHsKLQkJCXJldHVybiBuZXcgVGV4dEVkaXRvclNlbGVjdGlvblBhcnRpY2lwYW50KAotCQkJCQkJCXNlbGVjdGlvbk1hbmFnZXIsIChJVGV4dEVkaXRvcikgYWRhcHRhYmxlT2JqZWN0KTsKLQkJfQotCQllbHNlIGlmIChhZGFwdGFibGVPYmplY3QgaW5zdGFuY2VvZiBKcGFTdHJ1Y3R1cmVWaWV3KSB7Ci0JCQlyZXR1cm4gbmV3IEpwYVN0cnVjdHVyZVNlbGVjdGlvblBhcnRpY2lwYW50KAotCQkJCQkJCXNlbGVjdGlvbk1hbmFnZXIsIChKcGFTdHJ1Y3R1cmVWaWV3KSBhZGFwdGFibGVPYmplY3QpOwotCQl9Ci0JCWVsc2UgaWYgKGFkYXB0YWJsZU9iamVjdCBpbnN0YW5jZW9mIEpwYURldGFpbHNWaWV3KSB7Ci0JCQlyZXR1cm4gbmV3IEpwYURldGFpbHNTZWxlY3Rpb25QYXJ0aWNpcGFudCgKLQkJCQkJCQlzZWxlY3Rpb25NYW5hZ2VyLCAoSnBhRGV0YWlsc1ZpZXcpIGFkYXB0YWJsZU9iamVjdCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkKLQkvKiBAc2VlIElBZGFwdGVyRmFjdG9yeSNnZXRBZGFwdGVyTGlzdCgpICovCi0JcHVibGljIENsYXNzW10gZ2V0QWRhcHRlckxpc3QoKSB7Ci0JCXJldHVybiBuZXcgQ2xhc3NbXSB7IElTZWxlY3Rpb25QYXJ0aWNpcGFudC5jbGFzcyB9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3NlbGVjdGlvbi9UZXh0RWRpdG9yU2VsZWN0aW9uUGFydGljaXBhbnQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3NlbGVjdGlvbi9UZXh0RWRpdG9yU2VsZWN0aW9uUGFydGljaXBhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMxMzc3Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC9zZWxlY3Rpb24vVGV4dEVkaXRvclNlbGVjdGlvblBhcnRpY2lwYW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zZWxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVBvc3RTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklKcGFDb250ZW50Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JSnBhRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLkpwdENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnZpZXdzLkFic3RyYWN0SnBhVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUHJvcGVydHlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotCi1wdWJsaWMgY2xhc3MgVGV4dEVkaXRvclNlbGVjdGlvblBhcnRpY2lwYW50IAotCWV4dGVuZHMgQWJzdHJhY3RTZWxlY3Rpb25QYXJ0aWNpcGFudCAKLXsKLQlwcml2YXRlIElUZXh0RWRpdG9yIGVkaXRvcjsKLQkKLQlwcml2YXRlIElQcm9wZXJ0eUxpc3RlbmVyIGVkaXRvcklucHV0TGlzdGVuZXI7Ci0JCi0JcHJpdmF0ZSBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGVkaXRvclNlbGVjdGlvbkxpc3RlbmVyOwotCQotCXByaXZhdGUgU2VsZWN0aW9uIGN1cnJlbnRTZWxlY3Rpb247Ci0JCi0JcHJpdmF0ZSBib29sZWFuIHN1cHByZXNzTm90aWZpY2F0aW9uID0gZmFsc2U7Ci0JCi0JCi0JcHVibGljIFRleHRFZGl0b3JTZWxlY3Rpb25QYXJ0aWNpcGFudChJU2VsZWN0aW9uTWFuYWdlciB0aGVTZWxlY3Rpb25NYW5hZ2VyLCBJVGV4dEVkaXRvciB0aGVFZGl0b3IpIHsKLQkJc3VwZXIodGhlU2VsZWN0aW9uTWFuYWdlcik7Ci0JCWVkaXRvciA9IHRoZUVkaXRvcjsKLQkJZWRpdG9ySW5wdXRMaXN0ZW5lciA9IG5ldyBFZGl0b3JJbnB1dExpc3RlbmVyKCk7Ci0JCWVkaXRvci5hZGRQcm9wZXJ0eUxpc3RlbmVyKGVkaXRvcklucHV0TGlzdGVuZXIpOwotCQllZGl0b3JTZWxlY3Rpb25MaXN0ZW5lciA9IG5ldyBFZGl0b3JTZWxlY3Rpb25MaXN0ZW5lcigpOwotCQkoKElQb3N0U2VsZWN0aW9uUHJvdmlkZXIpIGVkaXRvci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpKS5hZGRQb3N0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGVkaXRvclNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJY3VycmVudFNlbGVjdGlvbiA9IGNhbGN1bGF0ZVNlbGVjdGlvbigpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgZWRpdG9ySW5wdXRDaGFuZ2VkKCkgewotCQlTZWxlY3Rpb24gbmV3U2VsZWN0aW9uID0gY2FsY3VsYXRlU2VsZWN0aW9uKCk7Ci0JCQotCQlpZiAoISBuZXdTZWxlY3Rpb24uZXF1YWxzKGN1cnJlbnRTZWxlY3Rpb24pKSB7Ci0JCQljdXJyZW50U2VsZWN0aW9uID0gbmV3U2VsZWN0aW9uOwotCQkJCi0JCQlpZiAoISBzdXBwcmVzc05vdGlmaWNhdGlvbikgewotCQkJCXNlbGVjdGlvbk1hbmFnZXIuc2VsZWN0KG5ld1NlbGVjdGlvbik7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGVkaXRvclNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCVNlbGVjdGlvbiBuZXdTZWxlY3Rpb24gPSBjYWxjdWxhdGVTZWxlY3Rpb24oKTsKLQkJCi0JCWlmICghIG5ld1NlbGVjdGlvbi5lcXVhbHMoY3VycmVudFNlbGVjdGlvbikpIHsKLQkJCWN1cnJlbnRTZWxlY3Rpb24gPSBuZXdTZWxlY3Rpb247Ci0JCQkKLQkJCS8vIGJ1ZyAxODgzNDQgLSB3b24ndCBhY3RpdmVseSBjaGFuZ2Ugc2VsZWN0aW9uIG1hbmFnZXIgc2VsZWN0aW9uIGlmIAotCQkJLy8gYSAiSlBBIiB2aWV3IGlzIHRoZSBhY3RpdmUgKGFuZCBwcmVzdW1hYmx5IHNlbGVjdGluZykgdmlldwotCQkJaWYgKGVkaXRvci5nZXRFZGl0b3JTaXRlKCkuZ2V0UGFnZSgpLmdldEFjdGl2ZVBhcnQoKSBpbnN0YW5jZW9mIEFic3RyYWN0SnBhVmlldykgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCQotCQkJaWYgKCEgc3VwcHJlc3NOb3RpZmljYXRpb24pIHsKLQkJCQlzZWxlY3Rpb25NYW5hZ2VyLnNlbGVjdChuZXdTZWxlY3Rpb24pOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgU2VsZWN0aW9uIGNhbGN1bGF0ZVNlbGVjdGlvbigpIHsKLQkJaWYgKGVkaXRvciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gU2VsZWN0aW9uLk5VTExfU0VMRUNUSU9OOwotCQl9Ci0JCQotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGVkaXRvci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotCQlJSnBhRmlsZSBwZXJzaXN0ZW5jZUZpbGUgPSBwZXJzaXN0ZW5jZUZpbGVGb3IoZWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotCQkKLQkJaWYgKChwZXJzaXN0ZW5jZUZpbGUgPT0gbnVsbCkKLQkJCXx8ICghIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJVGV4dFNlbGVjdGlvbikpKSB7Ci0JCQlyZXR1cm4gU2VsZWN0aW9uLk5VTExfU0VMRUNUSU9OOwotCQl9Ci0JCQotCQlJSnBhQ29udGVudE5vZGUgc2VsZWN0ZWROb2RlID0gcGVyc2lzdGVuY2VGaWxlLmdldENvbnRlbnROb2RlKCgoSVRleHRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0T2Zmc2V0KCkpOwotCQlpZiAoc2VsZWN0ZWROb2RlID09IG51bGwpIHsKLQkJCXJldHVybiBTZWxlY3Rpb24uTlVMTF9TRUxFQ1RJT047Ci0JCX0KLQkJcmV0dXJuIG5ldyBTZWxlY3Rpb24oc2VsZWN0ZWROb2RlKTsKLQl9Ci0JCi0JcHVibGljIFNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBjdXJyZW50U2VsZWN0aW9uOwotCX0KLQkKLQlwdWJsaWMgSUpwYUZpbGUgcGVyc2lzdGVuY2VGaWxlRm9yKElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlJRmlsZSBmaWxlID0gbnVsbDsKLQkJaWYgKGlucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCkgewotCQkJSUZpbGVFZGl0b3JJbnB1dCBmaWxlSW5wdXQgPSAoSUZpbGVFZGl0b3JJbnB1dCkgaW5wdXQ7Ci0JCQlmaWxlID0gZmlsZUlucHV0LmdldEZpbGUoKTsKLQkJfQotCQlpZiAoZmlsZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gSnB0Q29yZVBsdWdpbi5nZXRKcGFGaWxlKGZpbGUpOwotCX0KLQkJCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25FdmVudCBldnQpIHsKLQkJU2VsZWN0aW9uIG5ld1NlbGVjdGlvbiA9IGV2dC5nZXRTZWxlY3Rpb24oKTsKLQkJCi0JCWlmICgoZ2V0U2VsZWN0aW9uKCkuZXF1YWxzKG5ld1NlbGVjdGlvbikpCi0JCQl8fCAobmV3U2VsZWN0aW9uID09IFNlbGVjdGlvbi5OVUxMX1NFTEVDVElPTikpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJc3VwcHJlc3NOb3RpZmljYXRpb24gPSB0cnVlOwotCQlJSnBhQ29udGVudE5vZGUgc2VsZWN0ZWROb2RlID0gbmV3U2VsZWN0aW9uLmdldFNlbGVjdGVkTm9kZSgpOwotCQkKLQkJSVRleHRSYW5nZSB0ZXh0UmFuZ2UgPSBzZWxlY3RlZE5vZGUuc2VsZWN0aW9uVGV4dFJhbmdlKCk7Ci0JCWlmICh0ZXh0UmFuZ2UgIT0gbnVsbCkgewotCQkJdGhpcy5lZGl0b3Iuc2VsZWN0QW5kUmV2ZWFsKHRleHRSYW5nZS5nZXRPZmZzZXQoKSwgdGV4dFJhbmdlLmdldExlbmd0aCgpKTsKLQkJfQotCQlzdXBwcmVzc05vdGlmaWNhdGlvbiA9IGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBkaXNwb3NlT25IaWRlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJdGhpcy5lZGl0b3IucmVtb3ZlUHJvcGVydHlMaXN0ZW5lcih0aGlzLmVkaXRvcklucHV0TGlzdGVuZXIpOwotCQkoKElQb3N0U2VsZWN0aW9uUHJvdmlkZXIpIHRoaXMuZWRpdG9yLmdldFNlbGVjdGlvblByb3ZpZGVyKCkpLnJlbW92ZVBvc3RTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoZWRpdG9yU2VsZWN0aW9uTGlzdGVuZXIpOwotCX0KLQkKLQkKLQlwcml2YXRlIGNsYXNzIEVkaXRvcklucHV0TGlzdGVuZXIKLQkJaW1wbGVtZW50cyBJUHJvcGVydHlMaXN0ZW5lcgotCXsKLQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKE9iamVjdCBzb3VyY2UsIGludCBwcm9wSWQpIHsKLQkJCWlmICgoZWRpdG9yID09IHNvdXJjZSkgJiYgKHByb3BJZCA9PSBJRWRpdG9yUGFydC5QUk9QX0lOUFVUKSkgewotCQkJCWVkaXRvcklucHV0Q2hhbmdlZCgpOwotCQkJfQotCQl9Ci0JfQotCQotCQotCXByaXZhdGUgY2xhc3MgRWRpdG9yU2VsZWN0aW9uTGlzdGVuZXIKLQkJaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIAotCXsKLQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCWVkaXRvclNlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3RydWN0dXJlL0lKcGFTdHJ1Y3R1cmVQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvc3RydWN0dXJlL0lKcGFTdHJ1Y3R1cmVQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDg5OWNhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3N0cnVjdHVyZS9JSnBhU3RydWN0dXJlUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqICB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqICBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3RydWN0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotCi1wdWJsaWMgaW50ZXJmYWNlIElKcGFTdHJ1Y3R1cmVQcm92aWRlciAKLXsKLQotCVN0cmluZyBmaWxlQ29udGVudFR5cGUoKTsKLQkKLQkvKioKLQkgKiBCdWlsZCBhbiBvdXRsaW5lIGNvbnRlbnQgcHJvdmlkZXIuCi0JICovCi0JSVRyZWVDb250ZW50UHJvdmlkZXIgYnVpbGRDb250ZW50UHJvdmlkZXIoKTsKLQkKLQkvKioKLQkgKiBCdWlsZCBhbiBvdXRsaW5lIGxhYmVsIHByb3ZpZGVyLgotCSAqLwotCUlMYWJlbFByb3ZpZGVyIGJ1aWxkTGFiZWxQcm92aWRlcigpOwotCQotCXZvaWQgZGlzcG9zZSgpOwotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvdXRpbC9TV1RVdGlsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC91dGlsL1NXVFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWYxNDAwMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC91dGlsL1NXVFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci0KLS8vY29waWVkIGZyb20gamR0LmludGVybmFsLnVpLnV0aWwKLXB1YmxpYyBjbGFzcyBTV1RVdGlsIHsKLQotCXB1YmxpYyBzdGF0aWMgaW50IGdldFRhYmxlSGVpZ2h0SGludChUYWJsZSB0YWJsZSwgaW50IHJvd3MpIHsKLQkJaWYgKHRhYmxlLmdldEZvbnQoKS5lcXVhbHMoSkZhY2VSZXNvdXJjZXMuZ2V0RGVmYXVsdEZvbnQoKSkpCi0JCQl0YWJsZS5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldERpYWxvZ0ZvbnQoKSk7Ci0JCWludCByZXN1bHQ9IHRhYmxlLmdldEl0ZW1IZWlnaHQoKSAqIHJvd3MgKyB0YWJsZS5nZXRIZWFkZXJIZWlnaHQoKTsKLQkJaWYgKHRhYmxlLmdldExpbmVzVmlzaWJsZSgpKQotCQkJcmVzdWx0Kz0gdGFibGUuZ2V0R3JpZExpbmVXaWR0aCgpICogKHJvd3MgLSAxKTsKLQkJcmV0dXJuIHJlc3VsdDsJCQotCX0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC91dGlsL1RhYmxlTGF5b3V0Q29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC91dGlsL1RhYmxlTGF5b3V0Q29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkNTEzNDkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvdXRpbC9UYWJsZUxheW91dENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5MYXlvdXREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uUGl4ZWxEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uV2VpZ2h0RGF0YTsKLQotLyoqCi0gKiBBIHNwZWNpYWwgY29tcG9zaXRlIHRvIGxheW91dCBjb2x1bW5zIGluc2lkZSBhIHRhYmxlLiBUaGUgY29tcG9zaXRlIGlzIG5lZWRlZCBzaW5jZSB3ZSBoYXZlCi0gKiB0byBsYXlvdXQgdGhlIGNvbHVtbnMgImJlZm9yZSIgdGhlIGFjdHVhbCB0YWJsZSBnZXRzIGxheW91dGVkLiBIZW5jZSB3ZSBjYW4ndCB1c2UgYSBub3JtYWwKLSAqIGxheW91dCBtYW5hZ2VyLgotICogCi0gKiBjb3BpZWQgZnJvbSBqZHQuaW50ZXJuYWwudWkudXRpbAotICovCi1wdWJsaWMgY2xhc3MgVGFibGVMYXlvdXRDb21wb3NpdGUgZXh0ZW5kcyBDb21wb3NpdGUgewotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBleHRyYSBwaXhlbHMgdGFrZW4gYXMgaG9yaXpvbnRhbCB0cmltIGJ5IHRoZSB0YWJsZSBjb2x1bW4uIAotCSAqIFRvIGVuc3VyZSB0aGVyZSBhcmUgTiBwaXhlbHMgYXZhaWxhYmxlIGZvciB0aGUgY29udGVudCBvZiB0aGUgY29sdW1uLAotCSAqIGFzc2lnbiBOK0NPTFVNTl9UUklNIGZvciB0aGUgY29sdW1uIHdpZHRoLgotCSAqIAotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgQ09MVU1OX1RSSU0gPSAiY2FyYm9uIi5lcXVhbHMoU1dULmdldFBsYXRmb3JtKCkpID8gMjQgOiAzOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBMaXN0IGNvbHVtbnM9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VGFibGVMYXlvdXRDb21wb3NpdGU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBUYWJsZUxheW91dENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJc3VwZXIocGFyZW50LCBzdHlsZSk7Ci0gICAgICAgIGFkZENvbnRyb2xMaXN0ZW5lcihuZXcgQ29udHJvbEFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIFJlY3RhbmdsZSBhcmVhPSBnZXRDbGllbnRBcmVhKCk7Ci0gICAgICAgICAgICAgICAgVGFibGUgdGFibGU9IChUYWJsZSlnZXRDaGlsZHJlbigpWzBdOwotICAgICAgICAgICAgICAgIFBvaW50IHByZWZlcnJlZFNpemU9IGNvbXB1dGVUYWJsZVNpemUodGFibGUpOwotICAgICAgICAgICAgICAgIGludCB3aWR0aD0gYXJlYS53aWR0aCAtIDIgKiB0YWJsZS5nZXRCb3JkZXJXaWR0aCgpOwotICAgICAgICAgICAgICAgIGlmIChwcmVmZXJyZWRTaXplLnkgPiBhcmVhLmhlaWdodCkgewotICAgICAgICAgICAgICAgICAgICAvLyBTdWJ0cmFjdCB0aGUgc2Nyb2xsYmFyIHdpZHRoIGZyb20gdGhlIHRvdGFsIGNvbHVtbiB3aWR0aAotICAgICAgICAgICAgICAgICAgICAvLyBpZiBhIHZlcnRpY2FsIHNjcm9sbGJhciB3aWxsIGJlIHJlcXVpcmVkCi0gICAgICAgICAgICAgICAgICAgIFBvaW50IHZCYXJTaXplID0gdGFibGUuZ2V0VmVydGljYWxCYXIoKS5nZXRTaXplKCk7Ci0gICAgICAgICAgICAgICAgICAgIHdpZHRoIC09IHZCYXJTaXplLng7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxheW91dFRhYmxlKHRhYmxlLCB3aWR0aCwgYXJlYSwgdGFibGUuZ2V0U2l6ZSgpLnggPCBhcmVhLndpZHRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0JfQotCQotCS8qKgotCSAqIEFkZHMgYSBuZXcgY29sdW1uIG9mIGRhdGEgdG8gdGhpcyB0YWJsZSBsYXlvdXQuCi0JICoKLQkgKiBAcGFyYW0gZGF0YSB0aGUgY29sdW1uIGxheW91dCBkYXRhCi0JICovCi0JcHVibGljIHZvaWQgYWRkQ29sdW1uRGF0YShDb2x1bW5MYXlvdXREYXRhIGRhdGEpIHsKLQkJY29sdW1ucy5hZGQoZGF0YSk7Ci0JfQotCQotCS8vLS0tLSBIZWxwZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkKLQlwcml2YXRlIFBvaW50IGNvbXB1dGVUYWJsZVNpemUoVGFibGUgdGFibGUpIHsKLQkJUG9pbnQgcmVzdWx0PSB0YWJsZS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQkKLQkJaW50IHdpZHRoPSAwOwotCQlpbnQgc2l6ZT0gY29sdW1ucy5zaXplKCk7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBzaXplOyArK2kpIHsKLQkJCUNvbHVtbkxheW91dERhdGEgbGF5b3V0RGF0YT0gKENvbHVtbkxheW91dERhdGEpIGNvbHVtbnMuZ2V0KGkpOwotCQkJaWYgKGxheW91dERhdGEgaW5zdGFuY2VvZiBDb2x1bW5QaXhlbERhdGEpIHsKLQkJCQlDb2x1bW5QaXhlbERhdGEgY29sPSAoQ29sdW1uUGl4ZWxEYXRhKSBsYXlvdXREYXRhOwotCQkJCXdpZHRoICs9IGNvbC53aWR0aDsKLQkJCQlpZiAoY29sLmFkZFRyaW0pIHsKLQkJCQkJd2lkdGggKz0gQ09MVU1OX1RSSU07Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChsYXlvdXREYXRhIGluc3RhbmNlb2YgQ29sdW1uV2VpZ2h0RGF0YSkgewotCQkJCUNvbHVtbldlaWdodERhdGEgY29sPSAoQ29sdW1uV2VpZ2h0RGF0YSkgbGF5b3V0RGF0YTsKLQkJCQl3aWR0aCArPSBjb2wubWluaW11bVdpZHRoOwotCQkJfSBlbHNlIHsKLQkJCQlBc3NlcnQuaXNUcnVlKGZhbHNlLCAiVW5rbm93biBjb2x1bW4gbGF5b3V0IGRhdGEiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCWlmICh3aWR0aCA+IHJlc3VsdC54KQotCQkJcmVzdWx0Lng9IHdpZHRoOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwcml2YXRlIHZvaWQgbGF5b3V0VGFibGUoVGFibGUgdGFibGUsIGludCB3aWR0aCwgUmVjdGFuZ2xlIGFyZWEsIGJvb2xlYW4gaW5jcmVhc2UpIHsKLQkJLy8gWFhYOiBMYXlvdXQgaXMgYmVpbmcgY2FsbGVkIHdpdGggYW4gaW52YWxpZCB2YWx1ZSB0aGUgZmlyc3QgdGltZQotCQkvLyBpdCBpcyBiZWluZyBjYWxsZWQgb24gTGludXguIFRoaXMgbWV0aG9kIHJlc2V0cyB0aGUKLQkJLy8gTGF5b3V0IHRvIG51bGwgc28gd2UgbWFrZSBzdXJlIHdlIHJ1biBpdCBvbmx5IHdoZW4KLQkJLy8gdGhlIHZhbHVlIGlzIE9LLgotCQlpZiAod2lkdGggPD0gMSkKLQkJCXJldHVybjsKLQotCQlUYWJsZUNvbHVtbltdIHRhYmxlQ29sdW1ucz0gdGFibGUuZ2V0Q29sdW1ucygpOwotCQlpbnQgc2l6ZT0gTWF0aC5taW4oY29sdW1ucy5zaXplKCksIHRhYmxlQ29sdW1ucy5sZW5ndGgpOwotCQlpbnRbXSB3aWR0aHM9IG5ldyBpbnRbc2l6ZV07Ci0JCWludCBmaXhlZFdpZHRoPSAwOwotCQlpbnQgbnVtYmVyT2ZXZWlnaHRDb2x1bW5zPSAwOwotCQlpbnQgdG90YWxXZWlnaHQ9IDA7Ci0KLQkJLy8gRmlyc3QgY2FsYyBzcGFjZSBvY2N1cGllZCBieSBmaXhlZCBjb2x1bW5zCi0JCWZvciAoaW50IGk9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUNvbHVtbkxheW91dERhdGEgY29sPSAoQ29sdW1uTGF5b3V0RGF0YSkgY29sdW1ucy5nZXQoaSk7Ci0JCQlpZiAoY29sIGluc3RhbmNlb2YgQ29sdW1uUGl4ZWxEYXRhKSB7Ci0JCQkJQ29sdW1uUGl4ZWxEYXRhIGNwZD0gKENvbHVtblBpeGVsRGF0YSkgY29sOwotCQkJCWludCBwaXhlbHM9IGNwZC53aWR0aDsKLQkJCQlpZiAoY3BkLmFkZFRyaW0pIHsKLQkJCQkJcGl4ZWxzICs9IENPTFVNTl9UUklNOwotCQkJCX0KLQkJCQl3aWR0aHNbaV09IHBpeGVsczsKLQkJCQlmaXhlZFdpZHRoICs9IHBpeGVsczsKLQkJCX0gZWxzZSBpZiAoY29sIGluc3RhbmNlb2YgQ29sdW1uV2VpZ2h0RGF0YSkgewotCQkJCUNvbHVtbldlaWdodERhdGEgY3c9IChDb2x1bW5XZWlnaHREYXRhKSBjb2w7Ci0JCQkJbnVtYmVyT2ZXZWlnaHRDb2x1bW5zKys7Ci0JCQkJLy8gZmlyc3QgdGltZSwgdXNlIHRoZSB3ZWlnaHQgc3BlY2lmaWVkIGJ5IHRoZSBjb2x1bW4gZGF0YSwgb3RoZXJ3aXNlIHVzZSB0aGUgYWN0dWFsIHdpZHRoIGFzIHRoZSB3ZWlnaHQKLQkJCQkvLyBpbnQgd2VpZ2h0ID0gZmlyc3RUaW1lID8gY3cud2VpZ2h0IDogdGFibGVDb2x1bW5zW2ldLmdldFdpZHRoKCk7Ci0JCQkJaW50IHdlaWdodD0gY3cud2VpZ2h0OwotCQkJCXRvdGFsV2VpZ2h0ICs9IHdlaWdodDsKLQkJCX0gZWxzZSB7Ci0JCQkJQXNzZXJ0LmlzVHJ1ZShmYWxzZSwgIlVua25vd24gY29sdW1uIGxheW91dCBkYXRhIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCS8vIERvIHdlIGhhdmUgY29sdW1ucyB0aGF0IGhhdmUgYSB3ZWlnaHQKLQkJaWYgKG51bWJlck9mV2VpZ2h0Q29sdW1ucyA+IDApIHsKLQkJCS8vIE5vdyBkaXN0cmlidXRlIHRoZSByZXN0IHRvIHRoZSBjb2x1bW5zIHdpdGggd2VpZ2h0LgotCQkJaW50IHJlc3Q9IHdpZHRoIC0gZml4ZWRXaWR0aDsKLQkJCWludCB0b3RhbERpc3RyaWJ1dGVkPSAwOwotCQkJZm9yIChpbnQgaT0gMDsgaSA8IHNpemU7ICsraSkgewotCQkJCUNvbHVtbkxheW91dERhdGEgY29sPSAoQ29sdW1uTGF5b3V0RGF0YSkgY29sdW1ucy5nZXQoaSk7Ci0JCQkJaWYgKGNvbCBpbnN0YW5jZW9mIENvbHVtbldlaWdodERhdGEpIHsKLQkJCQkJQ29sdW1uV2VpZ2h0RGF0YSBjdz0gKENvbHVtbldlaWdodERhdGEpIGNvbDsKLQkJCQkJLy8gY2FsY3VsYXRlIHdlaWdodCBhcyBhYm92ZQotCQkJCQkvLyBpbnQgd2VpZ2h0ID0gZmlyc3RUaW1lID8gY3cud2VpZ2h0IDogdGFibGVDb2x1bW5zW2ldLmdldFdpZHRoKCk7Ci0JCQkJCWludCB3ZWlnaHQ9IGN3LndlaWdodDsKLQkJCQkJaW50IHBpeGVscz0gdG90YWxXZWlnaHQgPT0gMCA/IDAgOiB3ZWlnaHQgKiByZXN0IC8gdG90YWxXZWlnaHQ7Ci0JCQkJCWlmIChwaXhlbHMgPCBjdy5taW5pbXVtV2lkdGgpCi0JCQkJCQlwaXhlbHM9IGN3Lm1pbmltdW1XaWR0aDsKLQkJCQkJdG90YWxEaXN0cmlidXRlZCArPSBwaXhlbHM7Ci0JCQkJCXdpZHRoc1tpXT0gcGl4ZWxzOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gRGlzdHJpYnV0ZSBhbnkgcmVtYWluaW5nIHBpeGVscyB0byBjb2x1bW5zIHdpdGggd2VpZ2h0LgotCQkJaW50IGRpZmY9IHJlc3QgLSB0b3RhbERpc3RyaWJ1dGVkOwotCQkJZm9yIChpbnQgaT0gMDsgZGlmZiA+IDA7ICsraSkgewotCQkJCWlmIChpID09IHNpemUpCi0JCQkJCWk9IDA7Ci0JCQkJQ29sdW1uTGF5b3V0RGF0YSBjb2w9IChDb2x1bW5MYXlvdXREYXRhKSBjb2x1bW5zLmdldChpKTsKLQkJCQlpZiAoY29sIGluc3RhbmNlb2YgQ29sdW1uV2VpZ2h0RGF0YSkgewotCQkJCQkrK3dpZHRoc1tpXTsKLQkJCQkJLS1kaWZmOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJaWYgKGluY3JlYXNlKSB7Ci0JCQl0YWJsZS5zZXRTaXplKGFyZWEud2lkdGgsIGFyZWEuaGVpZ2h0KTsKLQkJfQotCQlmb3IgKGludCBpPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQl0YWJsZUNvbHVtbnNbaV0uc2V0V2lkdGgod2lkdGhzW2ldKTsKLQkJfQotCQlpZiAoIWluY3JlYXNlKSB7Ci0JCQl0YWJsZS5zZXRTaXplKGFyZWEud2lkdGgsIGFyZWEuaGVpZ2h0KTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3ZpZXdzL0Fic3RyYWN0SnBhVmlldy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvdmlld3MvQWJzdHJhY3RKcGFWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1ZDdjZmMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvdmlld3MvQWJzdHJhY3RKcGFWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBWZXJzYW50LiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IFZlcnNhbnQgYW5kIE90aGVycy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnZpZXdzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnNlbGVjdGlvbi5JU2VsZWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc2VsZWN0aW9uLlNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc2VsZWN0aW9uLlNlbGVjdGlvbk1hbmFnZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBhZ2VCb29rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEpwYVZpZXcgZXh0ZW5kcyBWaWV3UGFydCAKLXsJCi0JcHJvdGVjdGVkIFBhZ2VCb29rIHBhZ2VCb29rOwotCQotCXByb3RlY3RlZCBDb21wb3NpdGUgZGVmYXVsdENvbXBvc2l0ZTsKLQkKLQkKLQkvKioKLQkgKiBUaGUgc3RyaW5nIHRvIGRpc3BsYXkgd2hlbiB0aGVyZSBpcyBubyB2aWV3IGNvbnRlbnQKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBkZWZhdWx0TGFiZWw7Ci0JCi0JcHJpdmF0ZSBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5OwotCQotCQotCXB1YmxpYyBBYnN0cmFjdEpwYVZpZXcoU3RyaW5nIGFEZWZhdWx0TGFiZWwpIHsKLQkJc3VwZXIoKTsKLQkJZGVmYXVsdExhYmVsID0gYURlZmF1bHRMYWJlbDsKLQkJdGhpcy53aWRnZXRGYWN0b3J5ID0gbmV3IFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5KCk7Ci0JfQotCQotCS8qIEBzZWUgSVdvcmtiZW5jaFBhcnQjY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlKSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcGFnZUJvb2sgPSBuZXcgUGFnZUJvb2socGFyZW50LCBTV1QuTk9ORSk7Ci0JCWRlZmF1bHRDb21wb3NpdGUgPSBidWlsZERlZmF1bHRDb21wb3NpdGUoKTsKLQkJcGFnZUJvb2suc2hvd1BhZ2UoZGVmYXVsdENvbXBvc2l0ZSk7Ci0JCQotCQlzdWJjcmVhdGVQYXJ0Q29udHJvbChwYXJlbnQpOwotCQkKLQkJSVNlbGVjdGlvbk1hbmFnZXIgc2VsZWN0aW9uTWFuYWdlciA9IAotCQkJU2VsZWN0aW9uTWFuYWdlckZhY3RvcnkuZ2V0U2VsZWN0aW9uTWFuYWdlcihnZXRWaWV3U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpKTsKLQkJc2VsZWN0aW9uTWFuYWdlci5yZWdpc3Rlcih0aGlzKTsKLQkJc2VsZWN0KHNlbGVjdGlvbk1hbmFnZXIuZ2V0Q3VycmVudFNlbGVjdGlvbigpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc3ViY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBubyBvcCAtIGZvciBzdWJjbGFzc2VzIHRvIG92ZXJyaWRlIGlmIHdpc2hlZAotCX0KLQkKLQlwcml2YXRlIENvbXBvc2l0ZSBidWlsZERlZmF1bHRDb21wb3NpdGUoKSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ29tcG9zaXRlKHBhZ2VCb29rLCBTV1QuTk9ORSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoU1dULlZFUlRJQ0FMKSk7Ci0JCUxhYmVsIGxhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgZGVmYXVsdExhYmVsKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0JCi0JcHVibGljIGFic3RyYWN0IHZvaWQgc2VsZWN0KFNlbGVjdGlvbiBhU2VsZWN0aW9uKTsKLQkKLQlwcm90ZWN0ZWQgdm9pZCBzaG93RGVmYXVsdFBhZ2UoKSB7Ci0JCXBhZ2VCb29rLnNob3dQYWdlKGRlZmF1bHRDb21wb3NpdGUpOwotCX0KLQkKLQkvKiBAc2VlIElXb3JrYmVuY2hQYXJ0I3NldEZvY3VzKCkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQkJcGFnZUJvb2suc2V0Rm9jdXMoKTsKLQl9Ci0JCi0JcHVibGljIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGdldFdpZGdldEZhY3RvcnkoKSB7Ci0JCXJldHVybiB0aGlzLndpZGdldEZhY3Rvcnk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvdmlld3MvSnBhRGV0YWlsc1ZpZXcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3ZpZXdzL0pwYURldGFpbHNWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NjU0ZjAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvdmlld3MvSnBhRGV0YWlsc1ZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnZpZXdzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSUpwYUNvbnRlbnROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5JSnBhUGxhdGZvcm1VaTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnB0VWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuUGxhdGZvcm1SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5JSnBhRGV0YWlsc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuSUpwYURldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc2VsZWN0aW9uLlNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRmlsbExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBKcGFEZXRhaWxzVmlldyBleHRlbmRzIEFic3RyYWN0SnBhVmlldyAKLXsJCi0JcHJpdmF0ZSBTZWxlY3Rpb24gY3VycmVudFNlbGVjdGlvbjsKLQkKLQlwcml2YXRlIElKcGFEZXRhaWxzUGFnZSBjdXJyZW50UGFnZTsKLQkKLQkvKiBrZXk6IFN0cmluZyBmaWxlIGNvbnRlbnQgaWQsICB2YWx1ZTogSUpwYURldGFpbHNQcm92aWRlciAqLwotCXByaXZhdGUgTWFwPFN0cmluZywgSUpwYURldGFpbHNQcm92aWRlcj4gZGV0YWlsc1Byb3ZpZGVyczsKLQkKLQkvKiBrZXk6IE9iamVjdCBjb250ZW50IG5vZGUgaWQsICB2YWx1ZTogQ29tcG9zaXRlIHBhZ2UgKi8KLQlwcml2YXRlIE1hcDxPYmplY3QsIElKcGFEZXRhaWxzUGFnZT4gZGV0YWlsc1BhZ2VzOwotCQotCXB1YmxpYyBKcGFEZXRhaWxzVmlldygpIHsKLQkJc3VwZXIoSnB0VWlNZXNzYWdlcy5KcGFEZXRhaWxzVmlld192aWV3Tm90QXZhaWxhYmxlKTsKLQkJdGhpcy5jdXJyZW50U2VsZWN0aW9uID0gU2VsZWN0aW9uLk5VTExfU0VMRUNUSU9OOwotCQl0aGlzLmRldGFpbHNQcm92aWRlcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIElKcGFEZXRhaWxzUHJvdmlkZXI+KCk7Ci0JCXRoaXMuZGV0YWlsc1BhZ2VzID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBJSnBhRGV0YWlsc1BhZ2U+KCk7Ci0JfQotCQotCQotCXB1YmxpYyBTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gY3VycmVudFNlbGVjdGlvbjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2VsZWN0KFNlbGVjdGlvbiBuZXdTZWxlY3Rpb24pIHsKLQkJaWYgKG5ld1NlbGVjdGlvbi5lcXVhbHMoY3VycmVudFNlbGVjdGlvbikpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJY3VycmVudFNlbGVjdGlvbiA9IG5ld1NlbGVjdGlvbjsKLQkJCi0JCWlmIChuZXdTZWxlY3Rpb24gIT0gU2VsZWN0aW9uLk5VTExfU0VMRUNUSU9OKSB7Ci0JCQlJSnBhQ29udGVudE5vZGUgbmV3Tm9kZSA9IG5ld1NlbGVjdGlvbi5nZXRTZWxlY3RlZE5vZGUoKTsKLQkJCUlKcGFEZXRhaWxzUGFnZSBuZXdQYWdlID0gZ2V0RGV0YWlsc1BhZ2UobmV3Tm9kZSk7Ci0JCQlzZXRDdXJyZW50UGFnZShuZXdQYWdlKTsKLQkJfQotCQllbHNlIGlmIChjdXJyZW50U2VsZWN0aW9uICE9IFNlbGVjdGlvbi5OVUxMX1NFTEVDVElPTikgewotCQkJc2V0Q3VycmVudFBhZ2UobnVsbCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBJSnBhRGV0YWlsc1BhZ2UgZ2V0RGV0YWlsc1BhZ2UoSUpwYUNvbnRlbnROb2RlIGNvbnRlbnROb2RlKSB7Ci0JCWlmIChkZXRhaWxzUGFnZXMuY29udGFpbnNLZXkoY29udGVudE5vZGUuZ2V0SWQoKSkpIHsKLQkJCUlKcGFEZXRhaWxzUGFnZSBwYWdlID0gIGRldGFpbHNQYWdlcy5nZXQoY29udGVudE5vZGUuZ2V0SWQoKSk7Ci0JCQkKLQkJCWlmICgocGFnZSAhPSBudWxsKSAmJgotCQkJCQkocGFnZS5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSkgewotCQkJCWRldGFpbHNQYWdlcy5yZW1vdmUoY29udGVudE5vZGUuZ2V0SWQoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXR1cm4gcGFnZTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIGJ1aWxkRGV0YWlsc1BhZ2UoY29udGVudE5vZGUpOwotCX0KLQkKLQlwcml2YXRlIElKcGFEZXRhaWxzUGFnZSBidWlsZERldGFpbHNQYWdlKElKcGFDb250ZW50Tm9kZSBjb250ZW50Tm9kZSkgewotCQlJSnBhRGV0YWlsc1Byb3ZpZGVyIGRldGFpbHNQcm92aWRlciA9Ci0JCQkJCWdldERldGFpbHNQcm92aWRlcihjb250ZW50Tm9kZSk7Ci0JCQkKLQkJaWYgKGRldGFpbHNQcm92aWRlciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlDb21wb3NpdGUgcGFyZW50Q29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNvbXBvc2l0ZShwYWdlQm9vaywgU1dULk5PTkUpOwotCQlwYXJlbnRDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KFNXVC5WRVJUSUNBTCkpOwotCQlJSnBhRGV0YWlsc1BhZ2UgcGFnZSA9IAotCQkJZGV0YWlsc1Byb3ZpZGVyLmJ1aWxkRGV0YWlsc1BhZ2UocGFyZW50Q29tcG9zaXRlLCBjb250ZW50Tm9kZS5nZXRJZCgpLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCQkKLQkJaWYgKHBhZ2UgIT0gbnVsbCkgewotCQkJZGV0YWlsc1BhZ2VzLnB1dChjb250ZW50Tm9kZS5nZXRJZCgpLCBwYWdlKTsKLQkJfQotCQkKLQkJcmV0dXJuIHBhZ2U7Ci0JfQotCQotCXByaXZhdGUgSUpwYURldGFpbHNQcm92aWRlciBnZXREZXRhaWxzUHJvdmlkZXIoSUpwYUNvbnRlbnROb2RlIGNvbnRlbnROb2RlKSB7Ci0JCVN0cmluZyBjb250ZW50SWQgPSBjb250ZW50Tm9kZS5nZXRKcGFGaWxlKCkuZ2V0Q29udGVudElkKCk7Ci0JCUlKcGFEZXRhaWxzUHJvdmlkZXIgcHJvdmlkZXIgPSBkZXRhaWxzUHJvdmlkZXJzLmdldChjb250ZW50SWQpOwotCQkKLQkJaWYgKHByb3ZpZGVyID09IG51bGwpIHsKLQkJCVN0cmluZyBwbGF0Zm9ybUlkID0gY29udGVudE5vZGUuZ2V0SnBhUHJvamVjdCgpLmdldFBsYXRmb3JtKCkuZ2V0SWQoKTsKLQkJCUlKcGFQbGF0Zm9ybVVpIGpwYVBsYXRmb3JtVUkgPSBQbGF0Zm9ybVJlZ2lzdHJ5LklOU1RBTkNFLmdldEpwYVBsYXRmb3JtKHBsYXRmb3JtSWQpOwotCQkJZm9yIChJSnBhRGV0YWlsc1Byb3ZpZGVyIHAgOiBqcGFQbGF0Zm9ybVVJLmRldGFpbHNQcm92aWRlcnMoKSkgewotCQkJCWlmIChwLmZpbGVDb250ZW50VHlwZSgpLmVxdWFscyhjb250ZW50SWQpKSB7Ci0JCQkJCXByb3ZpZGVyID0gcDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQkvL1RPRE8gdGhpcyB2aWV3IGFuZCB0aGUgZGV0YWlsc1Byb3ZpZGVycyBNYXAgaXMgbm90IGNyZWF0ZWQgb24gYSBwZXIgcHJvamVjdCBiYXNpcy4KLQkJCS8vdGhlIGRldGFpbHNQcm92aWRlcnMgYW5kIHRoZWlyIGZpbGVDb250ZW50VHlwZXMgY291bGQgb3ZlcmxhcCBhY3Jvc3MgcHJvamVjdCwgdGhpcyB3b3VsZCBjYXVzZSBwcm9ibGVtcyB3aXRoIHN0b3JpbmcgdGhpcyBtYXAuCi0JCQkKLQkJCWlmIChwcm92aWRlciAhPSBudWxsKSB7Ci0JCQkJZGV0YWlsc1Byb3ZpZGVycy5wdXQoY29udGVudElkLCBwcm92aWRlcik7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBwcm92aWRlcjsJCi0JfQotCQotCXByaXZhdGUgdm9pZCBzZXRDdXJyZW50UGFnZShJSnBhRGV0YWlsc1BhZ2UgbmV3UGFnZSkgewotCQkvLyBkZXBvcHVsYXRlIG9sZCBwYWdlCi0JCWlmICgoY3VycmVudFBhZ2UgIT0gbnVsbCkgJiYgKGN1cnJlbnRQYWdlICE9IG5ld1BhZ2UpKSB7Ci0JCQljdXJyZW50UGFnZS5wb3B1bGF0ZShudWxsKTsKLQkJfQotCQkKLQkJLy8gcG9wdWxhdGUgbmV3IHBhZ2UKLQkJaWYgKG5ld1BhZ2UgIT0gbnVsbCkgewotCQkJbmV3UGFnZS5wb3B1bGF0ZShjdXJyZW50U2VsZWN0aW9uLmdldFNlbGVjdGVkTm9kZSgpKTsKLQkJfQotCQkKLQkJY3VycmVudFBhZ2UgPSBuZXdQYWdlOwotCQkKLQkJLy8gc2hvdyBuZXcgcGFnZQotCQlpZiAobmV3UGFnZSA9PSBudWxsKSB7Ci0JCQlzaG93RGVmYXVsdFBhZ2UoKTsKLQkJfQotCQllbHNlIHsKLQkJCXBhZ2VCb29rLnNob3dQYWdlKG5ld1BhZ2UuZ2V0Q29udHJvbCgpLmdldFBhcmVudCgpKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gbmV3IENsb25lSXRlcmF0b3I8U3RyaW5nPihkZXRhaWxzUHJvdmlkZXJzLmtleVNldCgpKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlTdHJpbmcga2V5ID0gc3RyZWFtLm5leHQoKTsKLQkJCUlKcGFEZXRhaWxzUHJvdmlkZXIgcHJvdmlkZXIgPSBkZXRhaWxzUHJvdmlkZXJzLnJlbW92ZShrZXkpOwotCQkJcHJvdmlkZXIuZGlzcG9zZSgpOwotCQl9Ci0JCQotCQlmb3IgKEl0ZXJhdG9yPE9iamVjdD4gc3RyZWFtID0gbmV3IENsb25lSXRlcmF0b3I8T2JqZWN0PihkZXRhaWxzUGFnZXMua2V5U2V0KCkpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCU9iamVjdCBrZXkgPSBzdHJlYW0ubmV4dCgpOwotCQkJSUpwYURldGFpbHNQYWdlIGRldGFpbHNQYWdlID0gZGV0YWlsc1BhZ2VzLnJlbW92ZShrZXkpOwotCQkJZGV0YWlsc1BhZ2UuZGlzcG9zZSgpOwotCQl9Ci0JCQotCQljdXJyZW50U2VsZWN0aW9uID0gU2VsZWN0aW9uLk5VTExfU0VMRUNUSU9OOwotCQljdXJyZW50UGFnZSA9IG51bGw7Ci0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3ZpZXdzL0pwYVN0cnVjdHVyZVZpZXcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3ZpZXdzL0pwYVN0cnVjdHVyZVZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU0YWRhMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC92aWV3cy9KcGFTdHJ1Y3R1cmVWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC52aWV3czsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklKcGFDb250ZW50Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JSnBhRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSUpwYVBsYXRmb3JtVWk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLlBsYXRmb3JtUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmpmYWNlLk51bGxMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qZmFjZS5OdWxsVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc2VsZWN0aW9uLlNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuc3RydWN0dXJlLklKcGFTdHJ1Y3R1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRmlsbExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgSnBhU3RydWN0dXJlVmlldyBleHRlbmRzIEFic3RyYWN0SnBhVmlldyAKLXsKLQlwcml2YXRlIFN0cnVjdHVyZUNvbXBvc2l0ZSBzdHJ1Y3R1cmVDb21wb3NpdGU7Ci0JCi0JCi0JcHVibGljIEpwYVN0cnVjdHVyZVZpZXcoKSB7Ci0JCXN1cGVyKEpwdFVpTWVzc2FnZXMuSnBhU3RydWN0dXJlVmlld192aWV3Tm90QXZhaWxhYmxlKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3ViY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdHJ1Y3R1cmVDb21wb3NpdGUgPSAKLQkJCW5ldyBTdHJ1Y3R1cmVDb21wb3NpdGUocGFnZUJvb2ssIFNXVC5OVUxMKTsKLQl9Ci0JCQotCXB1YmxpYyBTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgewotCQlpZiAoc3RydWN0dXJlQ29tcG9zaXRlLmlzVmlzaWJsZSgpKSB7Ci0JCQlyZXR1cm4gc3RydWN0dXJlQ29tcG9zaXRlLmdldFNlbGVjdGlvbigpOyAKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBTZWxlY3Rpb24uTlVMTF9TRUxFQ1RJT047Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2VsZWN0KFNlbGVjdGlvbiBuZXdTZWxlY3Rpb24pIHsKLQkJU2VsZWN0aW9uIGN1cnJlbnRTZWxlY3Rpb24gPSBnZXRTZWxlY3Rpb24oKTsKLQkJCi0JCWlmIChuZXdTZWxlY3Rpb24uZXF1YWxzKGN1cnJlbnRTZWxlY3Rpb24pKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmIChuZXdTZWxlY3Rpb24gPT0gU2VsZWN0aW9uLk5VTExfU0VMRUNUSU9OKSB7Ci0JCQlzaG93RGVmYXVsdFBhZ2UoKTsKLQkJfQotCQllbHNlIHsKLQkJCXBhZ2VCb29rLnNob3dQYWdlKHN0cnVjdHVyZUNvbXBvc2l0ZSk7Ci0JCX0KLQkJCi0JCXN0cnVjdHVyZUNvbXBvc2l0ZS5zZWxlY3QobmV3U2VsZWN0aW9uKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3RydWN0dXJlQ29tcG9zaXRlLnZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdHJ1Y3R1cmVDb21wb3NpdGUudmlld2VyLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCQotCQotCXByaXZhdGUgY2xhc3MgU3RydWN0dXJlQ29tcG9zaXRlIGV4dGVuZHMgQ29tcG9zaXRlIAotCXsKLQkJLyoga2V5OiBTdHJpbmcgZmlsZSBjb250ZW50IGlkLCAgdmFsdWU6IElKcGFTdHJ1Y3R1cmVQcm92aWRlciAqLwotCQlwcml2YXRlIE1hcCBzdHJ1Y3R1cmVQcm92aWRlcnM7Ci0JCQotCQlwcml2YXRlIFRyZWVWaWV3ZXIgdmlld2VyOwotCQkKLQkJcHJpdmF0ZSBTdHJ1Y3R1cmVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKLQkJCQotCQkJc3RydWN0dXJlUHJvdmlkZXJzID0gbmV3IEhhc2hNYXAoKTsKLQkJCQotCQkJdGhpcy5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCQkKLQkJCXZpZXdlciA9IG5ldyBUcmVlVmlld2VyKHRoaXMsIFNXVC5NVUxUSSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JCQl2aWV3ZXIuc2V0QXV0b0V4cGFuZExldmVsKDIpOwotCQkJaW5pdENvbnRleHRNZW51KCk7Ci0JCX0KLQkJCi0JICAgIHByb3RlY3RlZCB2b2lkIGluaXRDb250ZXh0TWVudSgpIHsKLQkgICAgICAgIC8vIENyZWF0ZSBkeW5hbWljIG1lbnUgbWdyLiAgRHluYW1pYyBpcyBjdXJyZW50bHkgcmVxdWlyZWQgdG8KLQkgICAgICAgIC8vIHN1cHBvcnQgYWN0aW9uIGNvbnRyaWJ1dGlvbnMuCi0JICAgICAgICBNZW51TWFuYWdlciBtZ3IgPSBuZXcgTWVudU1hbmFnZXIoKTsKLQkgICAgICAgIG1nci5zZXRSZW1vdmVBbGxXaGVuU2hvd24odHJ1ZSk7Ci0JICAgICAgICBtZ3IuYWRkTWVudUxpc3RlbmVyKG5ldyBJTWVudUxpc3RlbmVyKCkgewotCSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWdyKSB7Ci0JICAgICAgICAgICAgICAgIGZpbGxDb250ZXh0TWVudShtZ3IpOwotCSAgICAgICAgICAgIH0KLQkgICAgICAgIH0pOwotCSAgICAgICAgTWVudSBtZW51ID0gbWdyLmNyZWF0ZUNvbnRleHRNZW51KHZpZXdlci5nZXRDb250cm9sKCkpOwotCSAgICAgICAgdmlld2VyLmdldENvbnRyb2woKS5zZXRNZW51KG1lbnUpOwotCSAgICAgICAgZ2V0U2l0ZSgpLnJlZ2lzdGVyQ29udGV4dE1lbnUobWdyLCB2aWV3ZXIpOwotCSAgICAgICAJICAgICAgICAKLQkgICAgfQkKLQkgICAgCi0JICAgIC8qKgotCSAgICAgKiBDYWxsZWQgd2hlbiB0aGUgY29udGV4dCBtZW51IGlzIGFib3V0IHRvIG9wZW4uCi0JICAgICAqIERlbGVnYXRlcyB0byB0aGUgYWN0aW9uIGdyb3VwIHVzaW5nIHRoZSB2aWV3ZXIncyBzZWxlY3Rpb24gYXMgdGhlIGFjdGlvbiBjb250ZXh0LgotCSAgICAgKiBAc2luY2UgMi4wCi0JICAgICAqLwotCSAgICBwcm90ZWN0ZWQgdm9pZCBmaWxsQ29udGV4dE1lbnUoSU1lbnVNYW5hZ2VyIG1hbmFnZXIpIHsKLQkgICAgICAgIG1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKLQkgICAgfQotCSAgICAKLQkJcHJpdmF0ZSBTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgewotCQkJSVRyZWVTZWxlY3Rpb24gdmlld2VyU2VsZWN0aW9uID0gKElUcmVlU2VsZWN0aW9uKSB2aWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkKLQkJCWlmICh2aWV3ZXJTZWxlY3Rpb24uaXNFbXB0eSgpIHx8IHZpZXdlclNlbGVjdGlvbi5zaXplKCkgPiAxKSB7Ci0JCQkJaWYgKHZpZXdlci5nZXRJbnB1dCgpID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIFNlbGVjdGlvbi5OVUxMX1NFTEVDVElPTjsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJldHVybiBuZXcgU2VsZWN0aW9uKChJSnBhQ29udGVudE5vZGUpIHZpZXdlci5nZXRJbnB1dCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWVsc2UgewotCQkJCXJldHVybiBuZXcgU2VsZWN0aW9uKChJSnBhQ29udGVudE5vZGUpIHZpZXdlclNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSk7Ci0JCQl9Ci0JCQkKLQkJfQotCQkKLQkJcHJpdmF0ZSB2b2lkIHNlbGVjdChTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCQkvLyBub3RlOiBjaGVja3MgZm9yIG51bGwgYW5kIGVxdWFscygpIHNlbGVjdGlvbiBoYXZlIGFscmVhZHkgYmVlbiBwZXJmb3JtZWQKLQkJCQotCQkJaWYgKHNlbGVjdGlvbi5lcXVhbHMoU2VsZWN0aW9uLk5VTExfU0VMRUNUSU9OKSkgewotCQkJCWNsZWFyVmlld2VyKCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCQlTZWxlY3Rpb24gY3VycmVudFNlbGVjdGlvbiA9IGdldFNlbGVjdGlvbigpOwotCQkJSUpwYUNvbnRlbnROb2RlIG5ld05vZGUgPSBzZWxlY3Rpb24uZ2V0U2VsZWN0ZWROb2RlKCk7Ci0JCQlJSnBhRmlsZSBuZXdGaWxlID0gbmV3Tm9kZS5nZXRKcGFGaWxlKCk7Ci0JCQlJSnBhQ29udGVudE5vZGUgY3VycmVudE5vZGUgPSAKLQkJCQkoY3VycmVudFNlbGVjdGlvbiA9PSBTZWxlY3Rpb24uTlVMTF9TRUxFQ1RJT04pID8KLQkJCQkJCW51bGwgOiBnZXRTZWxlY3Rpb24oKS5nZXRTZWxlY3RlZE5vZGUoKTsKLQkJCUlKcGFGaWxlIGN1cnJlbnRGaWxlID0gCi0JCQkJKGN1cnJlbnROb2RlID09IG51bGwpID8gCi0JCQkJCQludWxsIDogY3VycmVudE5vZGUuZ2V0SnBhRmlsZSgpOwotCQkJCi0JCQlpZiAobmV3RmlsZS5lcXVhbHMoY3VycmVudEZpbGUpKSB7Ci0JCQkJdmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihuZXdOb2RlKSwgdHJ1ZSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChjdXJyZW50RmlsZSAhPSBudWxsICYmICBuZXdGaWxlLmdldENvbnRlbnRJZCgpLmVxdWFscyhjdXJyZW50RmlsZS5nZXRDb250ZW50SWQoKSkpIHsKLQkJCQl2aWV3ZXIuc2V0SW5wdXQobmV3RmlsZS5nZXRDb250ZW50KCkpOwotCQkJCXZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obmV3Tm9kZSksIHRydWUpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gbmV3IGNvbnRlbnQgdHlwZQotCQkJCS8vIHJlcGxhY2UgY29tcG9zaXRlIGFuZCBzZXQgc2VsZWN0aW9uIG9mIHRyZWUKLQkJCQlJSnBhU3RydWN0dXJlUHJvdmlkZXIgcHJvdmlkZXIgPSBnZXRTdHJ1Y3R1cmVQcm92aWRlcihuZXdOb2RlKTsKLQkJCQkKLQkJCQlpZiAocHJvdmlkZXIgPT0gbnVsbCkgewotCQkJCQljbGVhclZpZXdlcigpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJdmlld2VyLnNldENvbnRlbnRQcm92aWRlcihwcm92aWRlci5idWlsZENvbnRlbnRQcm92aWRlcigpKTsKLQkJCQkJdmlld2VyLnNldExhYmVsUHJvdmlkZXIocHJvdmlkZXIuYnVpbGRMYWJlbFByb3ZpZGVyKCkpOwotCQkJCQl2aWV3ZXIuc2V0SW5wdXQobmV3RmlsZS5nZXRDb250ZW50KCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJcHJpdmF0ZSB2b2lkIGNsZWFyVmlld2VyKCkgewotCQkJdmlld2VyLnNldENvbnRlbnRQcm92aWRlcihOdWxsVHJlZUNvbnRlbnRQcm92aWRlci5JTlNUQU5DRSk7Ci0JCQl2aWV3ZXIuc2V0TGFiZWxQcm92aWRlcihOdWxsTGFiZWxQcm92aWRlci5JTlNUQU5DRSk7Ci0JCQl2aWV3ZXIuc2V0SW5wdXQobnVsbCk7Ci0JCX0KLQkJCi0JCXByaXZhdGUgSUpwYVN0cnVjdHVyZVByb3ZpZGVyIGdldFN0cnVjdHVyZVByb3ZpZGVyKElKcGFDb250ZW50Tm9kZSBjb250ZW50Tm9kZSkgewotCQkJU3RyaW5nIGNvbnRlbnRJZCA9IGNvbnRlbnROb2RlLmdldEpwYUZpbGUoKS5nZXRDb250ZW50SWQoKTsKLQkJCUlKcGFTdHJ1Y3R1cmVQcm92aWRlciBwcm92aWRlciA9IAotCQkJCShJSnBhU3RydWN0dXJlUHJvdmlkZXIpIHN0cnVjdHVyZVByb3ZpZGVycy5nZXQoY29udGVudElkKTsKLQkJCQotCQkJaWYgKHByb3ZpZGVyID09IG51bGwpIHsKLQkJCQlTdHJpbmcgdmVuZG9ySWQgPSBjb250ZW50Tm9kZS5nZXRKcGFQcm9qZWN0KCkuZ2V0UGxhdGZvcm0oKS5nZXRJZCgpOwotCQkJCUlKcGFQbGF0Zm9ybVVpIGpwYVBsYXRmb3JtVUkgPSBQbGF0Zm9ybVJlZ2lzdHJ5LklOU1RBTkNFLmdldEpwYVBsYXRmb3JtKHZlbmRvcklkKTsKLQkJCQlmb3IgKElKcGFTdHJ1Y3R1cmVQcm92aWRlciBwIDoganBhUGxhdGZvcm1VSS5zdHJ1Y3R1cmVQcm92aWRlcnMoKSkgewotCQkJCQlpZiAocC5maWxlQ29udGVudFR5cGUoKS5lcXVhbHMoY29udGVudElkKSkgewotCQkJCQkJcHJvdmlkZXIgPSBwOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJLy9UT0RPIHRoaXMgdmlldyBhbmQgdGhlIGRldGFpbHNQcm92aWRlcnMgTWFwIGlzIG5vdCBjcmVhdGVkIG9uIGEgcGVyIHByb2plY3QgYmFzaXMuCi0JCQkJLy90aGUgZGV0YWlsc1Byb3ZpZGVycyBhbmQgdGhlaXIgZmlsZUNvbnRlbnRUeXBlcyBjb3VsZCBvdmVybGFwIGFjcm9zcyBwcm9qZWN0LCB0aGlzIHdvdWxkIGNhdXNlIHByb2JsZW1zIHdpdGggc3RvcmluZyB0aGlzIG1hcC4JCQkJCi0JCQkJaWYgKHByb3ZpZGVyICE9IG51bGwpIHsKLQkJCQkJc3RydWN0dXJlUHJvdmlkZXJzLnB1dChjb250ZW50SWQsIHByb3ZpZGVyKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCXJldHVybiBwcm92aWRlcjsJCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL0NDb21ib1ZpZXdlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9DQ29tYm9WaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRkYWRkMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aWRnZXRzL0NDb21ib1ZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqICB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqICBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkFic3RyYWN0TGlzdFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotCi0vL2J1ZyAjNjkyNTQgaXMgd2h5IGkgY3JlYXRlZCB0aGlzIGNsYXNzLCBpdCBpcyBhIGNvcHkgb2YgQ29tYm9WaXdlciBidXQgdXNpbmcgYSBDQ29tYm8KLQotLyoqCi0gKiBBIGNvbmNyZXRlIHZpZXdlciBiYXNlZCBvbiBhbiBTV1QgPGNvZGU+Q29tYm88L2NvZGU+IGNvbnRyb2wuIFRoaXMgY2xhc3MgaXMgaW50ZW5kZWQKLSAqIGFzIGFuIGFsdGVybmF0aXZlIHRvIHRoZSBKRmFjZSA8Y29kZT5MaXN0Vmlld2VyPC9jb2RlPiwgd2hpY2ggZGlzcGxheXMgaXRzIGNvbnRlbnQKLSAqIGluIGEgY29tYm8gYm94IHJhdGhlciB0aGFuIGEgbGlzdC4gV2hlcmV2ZXIgcG9zc2libGUsIHRoaXMgY2xhc3MgYXR0ZW1wdHMgdG8gYmVoYXZlCi0gKiBsaWtlIExpc3RWaWV3ZXIuIDxwPgotICogCi0gKiBUaGlzIGNsYXNzIGlzIGRlc2lnbmVkIHRvIGJlIGluc3RhbnRpYXRlZCB3aXRoIGEgcHJlLWV4aXN0aW5nIFNXVCBjb21ibyBjb250cm9sIAotICogYW5kIGNvbmZpZ3VyZWQgd2l0aCBhIGRvbWFpbi1zcGVjaWZpYyBjb250ZW50IHByb3ZpZGVyLCBsYWJlbCBwcm92aWRlciwgZWxlbWVudAotICogZmlsdGVyIChvcHRpb25hbCksIGFuZCBlbGVtZW50IHNvcnRlciAob3B0aW9uYWwpLgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGlzdFZpZXdlcgotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ0NvbWJvVmlld2VyIGV4dGVuZHMgQWJzdHJhY3RMaXN0Vmlld2VyIHsKLQotICAgIC8qKgotICAgICAqIFRoaXMgdmlld2VyJ3MgbGlzdCBjb250cm9sLgotICAgICAqLwotICAgIHByaXZhdGUgQ0NvbWJvIGNvbWJvOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIGNvbWJvIHZpZXdlciBvbiBhIG5ld2x5LWNyZWF0ZWQgY29tYm8gY29udHJvbCB1bmRlciB0aGUgZ2l2ZW4gcGFyZW50LgotICAgICAqIFRoZSB2aWV3ZXIgaGFzIG5vIGlucHV0LCBubyBjb250ZW50IHByb3ZpZGVyLCBhIGRlZmF1bHQgbGFiZWwgcHJvdmlkZXIsIAotICAgICAqIG5vIHNvcnRlciwgYW5kIG5vIGZpbHRlcnMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgY29udHJvbAotICAgICAqLwotICAgIHB1YmxpYyBDQ29tYm9WaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICB0aGlzKHBhcmVudCwgU1dULlJFQURfT05MWSB8IFNXVC5CT1JERVIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBjb21ibyB2aWV3ZXIgb24gYSBuZXdseS1jcmVhdGVkIGNvbWJvIGNvbnRyb2wgdW5kZXIgdGhlIGdpdmVuIHBhcmVudC4KLSAgICAgKiBUaGUgY29tYm8gY29udHJvbCBpcyBjcmVhdGVkIHVzaW5nIHRoZSBnaXZlbiBTV1Qgc3R5bGUgYml0cy4KLSAgICAgKiBUaGUgdmlld2VyIGhhcyBubyBpbnB1dCwgbm8gY29udGVudCBwcm92aWRlciwgYSBkZWZhdWx0IGxhYmVsIHByb3ZpZGVyLCAKLSAgICAgKiBubyBzb3J0ZXIsIGFuZCBubyBmaWx0ZXJzLgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbnRyb2wKLSAgICAgKiBAcGFyYW0gc3R5bGUgdGhlIFNXVCBzdHlsZSBiaXRzCi0gICAgICovCi0gICAgcHVibGljIENDb21ib1ZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLSAgICAgICAgdGhpcyhuZXcgQ0NvbWJvKHBhcmVudCwgc3R5bGUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgY29tYm8gdmlld2VyIG9uIHRoZSBnaXZlbiBjb21ibyBjb250cm9sLgotICAgICAqIFRoZSB2aWV3ZXIgaGFzIG5vIGlucHV0LCBubyBjb250ZW50IHByb3ZpZGVyLCBhIGRlZmF1bHQgbGFiZWwgcHJvdmlkZXIsIAotICAgICAqIG5vIHNvcnRlciwgYW5kIG5vIGZpbHRlcnMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbGlzdCB0aGUgY29tYm8gY29udHJvbAotICAgICAqLwotICAgIHB1YmxpYyBDQ29tYm9WaWV3ZXIoQ0NvbWJvIGxpc3QpIHsKLSAgICAgICAgdGhpcy5jb21ibyA9IGxpc3Q7Ci0gICAgICAgIGhvb2tDb250cm9sKGxpc3QpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGxpc3RBZGQoU3RyaW5nIHN0cmluZywgaW50IGluZGV4KSB7Ci0gICAgICAgIGNvbWJvLmFkZChzdHJpbmcsIGluZGV4KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBsaXN0U2V0SXRlbShpbnQgaW5kZXgsIFN0cmluZyBzdHJpbmcpIHsKLSAgICAgICAgY29tYm8uc2V0SXRlbShpbmRleCwgc3RyaW5nKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgaW50W10gbGlzdEdldFNlbGVjdGlvbkluZGljZXMoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgaW50W10geyBjb21iby5nZXRTZWxlY3Rpb25JbmRleCgpIH07Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGludCBsaXN0R2V0SXRlbUNvdW50KCkgewotICAgICAgICByZXR1cm4gY29tYm8uZ2V0SXRlbUNvdW50KCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgbGlzdFNldEl0ZW1zKFN0cmluZ1tdIGxhYmVscykgewotICAgICAgICBjb21iby5zZXRJdGVtcyhsYWJlbHMpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGxpc3RSZW1vdmVBbGwoKSB7Ci0gICAgICAgIGNvbWJvLnJlbW92ZUFsbCgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGxpc3RSZW1vdmUoaW50IGluZGV4KSB7Ci0gICAgICAgIGNvbWJvLnJlbW92ZShpbmRleCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBWaWV3ZXIuCi0gICAgICovCi0gICAgcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpIHsKLSAgICAgICAgcmV0dXJuIGNvbWJvOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhpcyBsaXN0IHZpZXdlcidzIGxpc3QgY29udHJvbC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGxpc3QgY29udHJvbAotICAgICAqLwotICAgIHB1YmxpYyBDQ29tYm8gZ2V0Q29tYm8oKSB7Ci0gICAgICAgIHJldHVybiBjb21ibzsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIERvIG5vdGhpbmcgLS0gY29tYm9zIG9ubHkgZGlzcGxheSB0aGUgc2VsZWN0ZWQgZWxlbWVudCwgc28gdGhlcmUgaXMgbm8gd2F5Ci0gICAgICogd2UgY2FuIGVuc3VyZSB0aGF0IHRoZSBnaXZlbiBlbGVtZW50IGlzIHZpc2libGUgd2l0aG91dCBjaGFuZ2luZyB0aGUgc2VsZWN0aW9uLgotICAgICAqIE1ldGhvZCBkZWZpbmVkIG9uIFN0cnVjdHVyZWRWaWV3ZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmV2ZWFsKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkFic3RyYWN0TGlzdFZpZXdlciNsaXN0U2VsZWN0QW5kU2hvdyhpbnRbXSkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBsaXN0U2V0U2VsZWN0aW9uKGludFtdIGl4cykgewotICAgICAgICBmb3IgKGludCBpZHggPSAwOyBpZHggPCBpeHMubGVuZ3RoOyBpZHgrKykgewotICAgICAgICAgICAgY29tYm8uc2VsZWN0KGl4c1tpZHhdKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQWJzdHJhY3RMaXN0Vmlld2VyI2xpc3REZXNlbGVjdEFsbCgpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgbGlzdERlc2VsZWN0QWxsKCkgewotICAgICAgICBjb21iby5kZXNlbGVjdEFsbCgpOwotICAgICAgICBjb21iby5jbGVhclNlbGVjdGlvbigpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQWJzdHJhY3RMaXN0Vmlld2VyI2xpc3RTaG93U2VsZWN0aW9uKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBsaXN0U2hvd1NlbGVjdGlvbigpIHsKLQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpZGdldHMvU2Nyb2xsZWRQYWdlQ29udGVudC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9TY3JvbGxlZFBhZ2VDb250ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNmQyNWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2lkZ2V0cy9TY3JvbGxlZFBhZ2VDb250ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAgICAgICAgCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5Gb3JtQ29sb3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TaGFyZWRTY3JvbGxlZENvbXBvc2l0ZTsKLQotLy9jb3BpZWQgZnJvbSBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5wcmVmZXJlbmNlczsKLXB1YmxpYyBjbGFzcyBTY3JvbGxlZFBhZ2VDb250ZW50IGV4dGVuZHMgU2hhcmVkU2Nyb2xsZWRDb21wb3NpdGUgewotCi0JcHJpdmF0ZSBGb3JtVG9vbGtpdCBmVG9vbGtpdDsKLQkKLQlwdWJsaWMgU2Nyb2xsZWRQYWdlQ29udGVudChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMocGFyZW50LCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCX0KLQkKLQlwdWJsaWMgU2Nyb2xsZWRQYWdlQ29udGVudChDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJc3VwZXIocGFyZW50LCBzdHlsZSk7Ci0JCQotCQlzZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCQkKLQkJRm9ybUNvbG9ycyBjb2xvcnM9IG5ldyBGb3JtQ29sb3JzKHBhcmVudC5nZXREaXNwbGF5KCkpOwotCQljb2xvcnMuc2V0QmFja2dyb3VuZChudWxsKTsKLQkJY29sb3JzLnNldEZvcmVncm91bmQobnVsbCk7Ci0JCQotCQlmVG9vbGtpdD0gbmV3IEZvcm1Ub29sa2l0KGNvbG9ycyk7Ci0JCQotCQlzZXRFeHBhbmRIb3Jpem9udGFsKHRydWUpOwotCQlzZXRFeHBhbmRWZXJ0aWNhbCh0cnVlKTsKLQkJCi0JCUNvbXBvc2l0ZSBib2R5PSBuZXcgQ29tcG9zaXRlKHRoaXMsIFNXVC5OT05FKTsKLQkJYm9keS5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCQlzZXRDb250ZW50KGJvZHkpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJZlRvb2xraXQuZGlzcG9zZSgpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkYXB0Q2hpbGQoQ29udHJvbCBjaGlsZENvbnRyb2wpIHsKLQkJZlRvb2xraXQuYWRhcHQoY2hpbGRDb250cm9sLCB0cnVlLCB0cnVlKTsKLQl9Ci0JCi0JcHVibGljIENvbXBvc2l0ZSBnZXRCb2R5KCkgewotCQlyZXR1cm4gKENvbXBvc2l0ZSkgZ2V0Q29udGVudCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9EYXRhYmFzZVJlY29ubmVjdFdpemFyZFBhZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvRGF0YWJhc2VSZWNvbm5lY3RXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzN2ZlMGMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9EYXRhYmFzZVJlY29ubmVjdFdpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24gYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwuQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwuQ29ubmVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC5Db25uZWN0aW9uUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwuQ29ubmVjdGlvblByb2ZpbGVSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC5EYXRhYmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwuSnB0RGJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLlNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLnVpLmludGVybmFsLkRUUFVpVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLklKcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnB0VWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi1wdWJsaWMgY2xhc3MgRGF0YWJhc2VSZWNvbm5lY3RXaXphcmRQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSB7Ci0JcHJpdmF0ZSBJSnBhUHJvamVjdCBqcGFQcm9qZWN0OwotCi0JcHJpdmF0ZSBDb25uZWN0aW9uIGNvbm5lY3Rpb247Ci0JcHJpdmF0ZSBDb25uZWN0aW9uTGlzdGVuZXIgY29ubmVjdGlvbkxpc3RlbmVyOwotCXByaXZhdGUgRGF0YWJhc2VHcm91cCBkYXRhYmFzZUdyb3VwOwotCi0JcHVibGljIERhdGFiYXNlUmVjb25uZWN0V2l6YXJkUGFnZSggSUpwYVByb2plY3QganBhUHJvamVjdCkgewotCQlzdXBlciggIkRhdGFiYXNlIFNldHRpbmdzIik7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5qcGFQcm9qZWN0ID0ganBhUHJvamVjdDsKLQkJc2V0VGl0bGUoIEpwdFVpTWVzc2FnZXMuRGF0YWJhc2VSZWNvbm5lY3RXaXphcmRQYWdlX2RhdGFiYXNlQ29ubmVjdGlvbik7Ci0JCXNldE1lc3NhZ2UoIEpwdFVpTWVzc2FnZXMuRGF0YWJhc2VSZWNvbm5lY3RXaXphcmRQYWdlX3JlY29ubmVjdFRvRGF0YWJhc2UpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5zZXRQYWdlQ29tcGxldGUoIGZhbHNlKTsKLQkJQ29tcG9zaXRlIHRvcCA9IHRoaXMuY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUoIHBhcmVudCk7Ci0JCXRoaXMuc2V0Q29udHJvbCggdG9wKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKCBDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKCBwYXJlbnQsIFNXVC5OVUxMKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KCBsYXlvdXQpOwotCQl0aGlzLmRhdGFiYXNlR3JvdXAgPSBuZXcgRGF0YWJhc2VHcm91cCggY29tcG9zaXRlKTsKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udCggcGFyZW50KTsKLQkJLy8gVE9ETyBBZGQgSGVscCAtIHRlc3RpbmcKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb21wb3NpdGUsIElKcGFIZWxwQ29udGV4dElkcy5QUk9QRVJUSUVTX0pBVkFfUEVSU0lTVEVOQ0VfQ09OTkVDVElPTik7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHJpdmF0ZSBMYWJlbCBjcmVhdGVMYWJlbCggQ29tcG9zaXRlIGNvbnRhaW5lciwgaW50IHNwYW4sIFN0cmluZyB0ZXh0KSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKCBjb250YWluZXIsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dCggdGV4dCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxJbmRlbnQgPSAzMDsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSBzcGFuOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKCBnZCk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQlwcml2YXRlIENvbWJvIGNyZWF0ZUNvbWJvKCBDb21wb3NpdGUgY29udGFpbmVyLCBib29sZWFuIGZpbGxIb3Jpem9udGFsKSB7Ci0JCUNvbWJvIGNvbWJvID0gbmV3IENvbWJvKCBjb250YWluZXIsIFNXVC5CT1JERVIgfCBTV1QuU0lOR0xFKTsKLQkJaWYgKCBmaWxsSG9yaXpvbnRhbCkgewotCQkJY29tYm8uc2V0TGF5b3V0RGF0YSggbmV3IEdyaWREYXRhKCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJfQotCQllbHNlIHsKLQkJCWNvbWJvLnNldExheW91dERhdGEoIG5ldyBHcmlkRGF0YSgpKTsKLQkJfQotCQlyZXR1cm4gY29tYm87Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSBhIGdyaWQgbGF5b3V0IHdpdGggdGhlIGRlZmF1bHQgRGlhbG9nIHNldHRpbmdzLgotCSAqLwotCXByb3RlY3RlZCBHcmlkTGF5b3V0IGluaXRHcmlkTGF5b3V0KCBHcmlkTGF5b3V0IGxheW91dCwgYm9vbGVhbiBtYXJnaW5zKSB7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IHRoaXMuY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoIElEaWFsb2dDb25zdGFudHMuSE9SSVpPTlRBTF9TUEFDSU5HKTsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IHRoaXMuY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKCBJRGlhbG9nQ29uc3RhbnRzLlZFUlRJQ0FMX1NQQUNJTkcpOwotCQlpZiAoIG1hcmdpbnMpIHsKLQkJCWxheW91dC5tYXJnaW5XaWR0aCA9IHRoaXMuY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoIElEaWFsb2dDb25zdGFudHMuSE9SSVpPTlRBTF9NQVJHSU4pOwotCQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IHRoaXMuY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKCBJRGlhbG9nQ29uc3RhbnRzLlZFUlRJQ0FMX01BUkdJTik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCX0KLQkJcmV0dXJuIGxheW91dDsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbjxUYWJsZT4gZ2V0VGFibGVzKCkgewotCQlTY2hlbWEgc2NoZW1hID0gdGhpcy5nZXRQcm9qZWN0VXNlclNjaGVtYSgpOwotCQlpZiAoIHNjaGVtYSAhPSBudWxsICYmIHNjaGVtYS5nZXROYW1lKCkgIT0gbnVsbCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKCBzY2hlbWEudGFibGVzKCkpOwotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9ucy48VGFibGU+ZW1wdHlMaXN0KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUdlbmVyYXRlRW50aXRpZXNQYWdlKCBTY2hlbWEgc2NoZW1hKSB7Ci0JCUdlbmVyYXRlRW50aXRpZXNXaXphcmQgZ2VuZXJhdGVFbnRpdGllc1dpemFyZCA9ICgoIEdlbmVyYXRlRW50aXRpZXNXaXphcmQpIHRoaXMuZ2V0V2l6YXJkKCkpOwotCQlnZW5lcmF0ZUVudGl0aWVzV2l6YXJkLnVwZGF0ZVBvc3NpYmxlVGFibGVzKCBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbiggc2NoZW1hLnRhYmxlcygpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJdGhpcy5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCWlmICggdGhpcy5jb25uZWN0aW9uTGlzdGVuZXIgIT0gbnVsbCkgewotCQkJaWYgKCB0aGlzLmNvbm5lY3Rpb24gIT0gbnVsbCkgewotCQkJCXRoaXMuY29ubmVjdGlvbi5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIoIHRoaXMuY29ubmVjdGlvbkxpc3RlbmVyKTsKLQkJCX0KLQkJCXRoaXMuY29ubmVjdGlvbkxpc3RlbmVyID0gbnVsbDsKLQkJfQotCX0KLQkKLQotCUNvbm5lY3Rpb25Qcm9maWxlIGdldFByb2plY3RDb25uZWN0aW9uUHJvZmlsZSgpIHsKLQkJU3RyaW5nIHByb2ZpbGVOYW1lID0gdGhpcy5qcGFQcm9qZWN0LmdldERhdGFTb3VyY2UoKS5nZXRDb25uZWN0aW9uUHJvZmlsZU5hbWUoKTsKLQkJcmV0dXJuIEpwdERiUGx1Z2luLmdldERlZmF1bHQoKS5nZXRDb25uZWN0aW9uUHJvZmlsZVJlcG9zaXRvcnkoKS5wcm9maWxlTmFtZWQoIHByb2ZpbGVOYW1lKTsKLQl9Ci0JCi0JU2NoZW1hIGdldFByb2plY3RVc2VyU2NoZW1hKCkgewotCQlDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlID0gdGhpcy5nZXRQcm9qZWN0Q29ubmVjdGlvblByb2ZpbGUoKTsKLQkJcmV0dXJuIHByb2ZpbGUuZ2V0RGF0YWJhc2UoKS5zY2hlbWFOYW1lZCggcHJvZmlsZS5nZXRVc2VyTmFtZSgpKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIG1lbWJlciBjbGFzc2VzICoqKioqKioqKioKLQotCXByaXZhdGUgZmluYWwgY2xhc3MgRGF0YWJhc2VHcm91cCB7Ci0JCXByaXZhdGUgZmluYWwgR3JvdXAgZ3JvdXA7Ci0JCXByaXZhdGUgZmluYWwgTGFiZWwgY29ubmVjdGlvbkxhYmVsOwotCQlwcml2YXRlIGZpbmFsIENvbWJvIGNvbm5lY3Rpb25Db21ibzsKLQkJcHJpdmF0ZSBmaW5hbCBMYWJlbCBzY2hlbWFMYWJlbDsKLQkJcHJpdmF0ZSBmaW5hbCBDb21ibyBzY2hlbWFDb21ibzsKLQkJcHJpdmF0ZSBmaW5hbCBMYWJlbCBzY2hlbWFJbmZvTGFiZWw7Ci0JCQotCQlwcml2YXRlIExpbmsgYWRkQ29ubmVjdGlvbkxpbms7Ci0JCXByaXZhdGUgTGluayByZWNvbm5lY3RMaW5rOwotCi0JCXB1YmxpYyBEYXRhYmFzZUdyb3VwKCBDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCQl0aGlzLmdyb3VwID0gbmV3IEdyb3VwKCBjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJCXRoaXMuZ3JvdXAuc2V0TGF5b3V0KCBsYXlvdXQpOwotCQkJdGhpcy5ncm91cC5zZXRMYXlvdXREYXRhKCBuZXcgR3JpZERhdGEoIEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJdGhpcy5ncm91cC5zZXRUZXh0KCBKcHRVaU1lc3NhZ2VzLkRhdGFiYXNlUmVjb25uZWN0V2l6YXJkUGFnZV9kYXRhYmFzZSk7Ci0JCQkvL1RPRE8gQWRkIEhlbHAKLS8vCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCggdGhpcy5ncm91cCwgSURhbGlIZWxwQ29udGV4dElkcy5YWFgpOwotCQkJdGhpcy5jb25uZWN0aW9uTGFiZWwgPSBjcmVhdGVMYWJlbCggdGhpcy5ncm91cCwgMSwgSnB0VWlNZXNzYWdlcy5EYXRhYmFzZVJlY29ubmVjdFdpemFyZFBhZ2VfY29ubmVjdGlvbik7Ci0JCQl0aGlzLmNvbm5lY3Rpb25Db21ibyA9IGNyZWF0ZUNvbWJvKCB0aGlzLmdyb3VwLCB0cnVlKTsKLQkJCXRoaXMuY29ubmVjdGlvbkNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKCBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoIFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJd2lkZ2V0U2VsZWN0ZWQoIGUpOwotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKCBTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCWhhbmRsZUNvbm5lY3Rpb25DaGFuZ2UoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCXRoaXMuc2NoZW1hTGFiZWwgPSBjcmVhdGVMYWJlbCggdGhpcy5ncm91cCwgMSwgSnB0VWlNZXNzYWdlcy5EYXRhYmFzZVJlY29ubmVjdFdpemFyZFBhZ2Vfc2NoZW1hKTsKLQkJCXRoaXMuc2NoZW1hQ29tYm8gPSBjcmVhdGVDb21ibyggdGhpcy5ncm91cCwgdHJ1ZSk7Ci0JCQl0aGlzLnNjaGVtYUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKCBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoIFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJd2lkZ2V0U2VsZWN0ZWQoIGUpOwotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKCBTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCWhhbmRsZVNjaGVtYUNoYW5nZSgpOwotCQkJCX0KLQkJCX0pOwotCQkJc2NoZW1hSW5mb0xhYmVsID0gY3JlYXRlTGFiZWwoIHRoaXMuZ3JvdXAsIDIsIEpwdFVpTWVzc2FnZXMuRGF0YWJhc2VSZWNvbm5lY3RXaXphcmRQYWdlX3NjaGVtYUluZm8pOwotCQkJdGhpcy5hZGRDb25uZWN0aW9uTGluayA9IG5ldyBMaW5rKCB0aGlzLmdyb3VwLCBTV1QuTk9ORSk7Ci0JCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCBHcmlkRGF0YS5FTkQsIEdyaWREYXRhLkNFTlRFUiwgZmFsc2UsIGZhbHNlKTsKLQkJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJdGhpcy5hZGRDb25uZWN0aW9uTGluay5zZXRMYXlvdXREYXRhKCBkYXRhKTsKLQkJCXRoaXMuYWRkQ29ubmVjdGlvbkxpbmsuc2V0VGV4dCggSnB0VWlNZXNzYWdlcy5EYXRhYmFzZVJlY29ubmVjdFdpemFyZFBhZ2VfYWRkQ29ubmVjdGlvbkxpbmspOwotCQkJdGhpcy5hZGRDb25uZWN0aW9uTGluay5hZGRTZWxlY3Rpb25MaXN0ZW5lciggbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoIFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJb3Blbk5ld0Nvbm5lY3Rpb25XaXphcmQoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCXRoaXMucmVjb25uZWN0TGluayA9IG5ldyBMaW5rKCB0aGlzLmdyb3VwLCBTV1QuTk9ORSk7Ci0JCQlkYXRhID0gbmV3IEdyaWREYXRhKCBHcmlkRGF0YS5FTkQsIEdyaWREYXRhLkNFTlRFUiwgZmFsc2UsIGZhbHNlKTsKLQkJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJdGhpcy5yZWNvbm5lY3RMaW5rLnNldExheW91dERhdGEoIGRhdGEpOwotCQkJdGhpcy5yZWNvbm5lY3RMaW5rLnNldFRleHQoIEpwdFVpTWVzc2FnZXMuRGF0YWJhc2VSZWNvbm5lY3RXaXphcmRQYWdlX3JlY29ubmVjdExpbmspOwotCQkJdGhpcy5yZWNvbm5lY3RMaW5rLnNldEVuYWJsZWQoIGZhbHNlKTsKLQkJCXRoaXMucmVjb25uZWN0TGluay5hZGRTZWxlY3Rpb25MaXN0ZW5lciggbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoIFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJb3BlbkNvbm5lY3Rpb25Qcm9maWxlTmFtZWQoIGNvbm5lY3Rpb25Db21iby5nZXRUZXh0KCkpOwotCQkJCX0KLQkJCX0pOwotCQkJdGhpcy5wb3B1bGF0ZUNvbm5lY3Rpb25Db21ibygpOwotCQkJdGhpcy5wb3B1bGF0ZVNjaGVtYUNvbWJvKCk7Ci0JCX0KLQotCQlwcml2YXRlIENvbm5lY3Rpb25Qcm9maWxlIGdldENvbm5lY3Rpb25Qcm9maWxlTmFtZWQoIFN0cmluZyBwcm9maWxlTmFtZSkgewotCQkJcmV0dXJuIEpwdERiUGx1Z2luLmdldERlZmF1bHQoKS5nZXRDb25uZWN0aW9uUHJvZmlsZVJlcG9zaXRvcnkoKS5wcm9maWxlTmFtZWQoIHByb2ZpbGVOYW1lKTsKLQkJfQotCQkKLQkJcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGR0cENvbm5lY3Rpb25Qcm9maWxlTmFtZXMoKSB7Ci0JCQlyZXR1cm4gSnB0RGJQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldENvbm5lY3Rpb25Qcm9maWxlUmVwb3NpdG9yeSgpLnByb2ZpbGVOYW1lcygpOwotCQl9Ci0KLQkJcHJpdmF0ZSBTdHJpbmcgZ2V0UHJvamVjdENvbm5lY3Rpb25Qcm9maWxlTmFtZSgpIHsKLQkJCXJldHVybiBqcGFQcm9qZWN0LmdldERhdGFTb3VyY2UoKS5nZXRDb25uZWN0aW9uUHJvZmlsZU5hbWUoKTsKLQkJfQotCQkKLQkJU2NoZW1hIGdldFByb2plY3RVc2VyU2NoZW1hKCkgewotCQkJQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSA9IGdldFByb2plY3RDb25uZWN0aW9uUHJvZmlsZSgpOwotCQkJcmV0dXJuIHByb2ZpbGUuZ2V0RGF0YWJhc2UoKS5zY2hlbWFOYW1lZCggcHJvZmlsZS5nZXRVc2VyTmFtZSgpKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBvcGVuQ29ubmVjdGlvblByb2ZpbGVOYW1lZCggU3RyaW5nIGNvbm5lY3Rpb25Qcm9maWxlTmFtZSkgewotCQkJaWYoIERhdGFiYXNlUmVjb25uZWN0V2l6YXJkUGFnZS50aGlzLmNvbm5lY3Rpb24gIT0gbnVsbCkgewotCQkJCURhdGFiYXNlUmVjb25uZWN0V2l6YXJkUGFnZS50aGlzLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQkJfQotCQkJQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSA9IEpwdERiUGx1Z2luLmdldERlZmF1bHQoKS5nZXRDb25uZWN0aW9uUHJvZmlsZVJlcG9zaXRvcnkoKS5wcm9maWxlTmFtZWQoIGNvbm5lY3Rpb25Qcm9maWxlTmFtZSk7Ci0JCQlwcm9maWxlLmNvbm5lY3QoKTsKLQkJCURhdGFiYXNlUmVjb25uZWN0V2l6YXJkUGFnZS50aGlzLmNvbm5lY3Rpb24gPSBwcm9maWxlLmdldENvbm5lY3Rpb24oKTsKLQkJCWlmKCBEYXRhYmFzZVJlY29ubmVjdFdpemFyZFBhZ2UudGhpcy5jb25uZWN0aW9uICE9IG51bGwpIHsKLQkJCQl0aGlzLnBvcHVsYXRlU2NoZW1hQ29tYm8oKTsKLQkJCQlEYXRhYmFzZVJlY29ubmVjdFdpemFyZFBhZ2UudGhpcy5jb25uZWN0aW9uTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQ29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCQkJRGF0YWJhc2VSZWNvbm5lY3RXaXphcmRQYWdlLnRoaXMuY29ubmVjdGlvbi5hZGRDb25uZWN0aW9uTGlzdGVuZXIoIERhdGFiYXNlUmVjb25uZWN0V2l6YXJkUGFnZS50aGlzLmNvbm5lY3Rpb25MaXN0ZW5lcik7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCBwb3B1bGF0ZUNvbm5lY3Rpb25Db21ibygpIHsKLQkJCS8vIGNsZWFyIG91dCBjb25uZWN0aW9uIGVudHJpZXMgZnJvbSBwcmV2aW91cyBsb2dpbi4KLQkJCXRoaXMuY29ubmVjdGlvbkNvbWJvLnJlbW92ZUFsbCgpOwotCQkJZm9yICggSXRlcmF0b3I8U3RyaW5nPiBpID0gQ29sbGVjdGlvblRvb2xzLnNvcnQoIHRoaXMuZHRwQ29ubmVjdGlvblByb2ZpbGVOYW1lcygpKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJdGhpcy5jb25uZWN0aW9uQ29tYm8uYWRkKCAoIFN0cmluZykgaS5uZXh0KCkpOwotCQkJfQotCi0JCQlTdHJpbmcgY29ubmVjdGlvbk5hbWUgPSBnZXRQcm9qZWN0Q29ubmVjdGlvblByb2ZpbGVOYW1lKCk7Ci0JCQlpZiAoICFTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KCBjb25uZWN0aW9uTmFtZSkpIHsKLQkJCQl0aGlzLmNvbm5lY3Rpb25Db21iby5zZWxlY3QoIGNvbm5lY3Rpb25Db21iby5pbmRleE9mKCBjb25uZWN0aW9uTmFtZSkpOwotCQkJCXRoaXMucmVjb25uZWN0TGluay5zZXRFbmFibGVkKCB0cnVlKTsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgdm9pZCBoYW5kbGVDb25uZWN0aW9uQ2hhbmdlKCkgewotCQkJdGhpcy5yZWNvbm5lY3RMaW5rLnNldEVuYWJsZWQoIHRydWUpOwotCQkJdGhpcy5wb3B1bGF0ZVNjaGVtYUNvbWJvKCk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgaGFuZGxlU2NoZW1hQ2hhbmdlKCkgewotCQkJQ29ubmVjdGlvblByb2ZpbGUgY29ubmVjdGlvblByb2ZpbGUgPSB0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlTmFtZWQoIGdldENvbm5lY3Rpb25Qcm9maWxlTmFtZSgpKTsKLQkJCVNjaGVtYSBzY2hlbWEgPSAgY29ubmVjdGlvblByb2ZpbGUuZ2V0RGF0YWJhc2UoKS5zY2hlbWFOYW1lZCggdGhpcy5nZXRTY2hlbWFOYW1lKCkpOwotCQkJRGF0YWJhc2VSZWNvbm5lY3RXaXphcmRQYWdlLnRoaXMudXBkYXRlR2VuZXJhdGVFbnRpdGllc1BhZ2UoIHNjaGVtYSk7Ci0JCQlEYXRhYmFzZVJlY29ubmVjdFdpemFyZFBhZ2UudGhpcy5zZXRQYWdlQ29tcGxldGUoIHRydWUpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHBvcHVsYXRlU2NoZW1hQ29tYm8oKSB7Ci0JCQkvLyBjbGVhciBvdXQgc2NoZW1hIGVudHJpZXMgZnJvbSBwcmV2aW91cyBjb25uZWN0aW9uIHNlbGVjdGlvbgotCQkJdGhpcy5zY2hlbWFDb21iby5yZW1vdmVBbGwoKTsKLQkJCUNvbm5lY3Rpb25Qcm9maWxlIGNvbm5lY3Rpb25Qcm9maWxlID0gdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZU5hbWVkKCBnZXRDb25uZWN0aW9uUHJvZmlsZU5hbWUoKSk7Ci0JCQlmb3IgKCBJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IENvbGxlY3Rpb25Ub29scy5zb3J0KCBjb25uZWN0aW9uUHJvZmlsZS5nZXREYXRhYmFzZSgpLnNjaGVtYU5hbWVzKCkpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJCXRoaXMuc2NoZW1hQ29tYm8uYWRkKCAoIFN0cmluZykgc3RyZWFtLm5leHQoKSk7Ci0JCQl9Ci0JCQkvLyBzZXQgbG9naW4gdXNlciBuYW1lIGFzIGRlZmF1bHQgc2NoZW1hCi0JCQlTY2hlbWEgc2NoZW1hID0gdGhpcy5nZXRQcm9qZWN0VXNlclNjaGVtYSgpOwotCQkJaWYgKCBzY2hlbWEgIT0gbnVsbCAmJiBzY2hlbWEuZ2V0TmFtZSgpICE9IG51bGwpIHsKLQkJCQlzY2hlbWEgPSAgY29ubmVjdGlvblByb2ZpbGUuZ2V0RGF0YWJhc2UoKS5zY2hlbWFOYW1lZCggc2NoZW1hLmdldE5hbWUoKSk7IC8vIHZlcmlmeSBzY2hlbWEgZXhpc3QKLQkJCQlpZiAoIHNjaGVtYSAhPSBudWxsKSB7Ci0JCQkJCXRoaXMuc2NoZW1hQ29tYm8uc2VsZWN0KCB0aGlzLnNjaGVtYUNvbWJvLmluZGV4T2YoIHNjaGVtYS5nZXROYW1lKCkpKTsKLQkJCQkJdXBkYXRlR2VuZXJhdGVFbnRpdGllc1BhZ2UoIHNjaGVtYSk7Ci0JCQkJCXNldFBhZ2VDb21wbGV0ZSggdHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSBTdHJpbmcgZ2V0Q29ubmVjdGlvblByb2ZpbGVOYW1lKCkgewotCQkJcmV0dXJuIHRoaXMuY29ubmVjdGlvbkNvbWJvLmdldFRleHQoKTsKLQkJfQotCi0JCXByaXZhdGUgU3RyaW5nIGdldFNjaGVtYU5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5zY2hlbWFDb21iby5nZXRUZXh0KCk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgb3Blbk5ld0Nvbm5lY3Rpb25XaXphcmQoKSB7Ci0JCQlTdHJpbmcgYWRkZWRQcm9maWxlTmFtZSA9IERUUFVpVG9vbHMuY3JlYXRlTmV3UHJvZmlsZSgpOwotCQkJICAKLQkJCUNvbm5lY3Rpb25Qcm9maWxlIGFkZGVkUHJvZmlsZSA9IENvbm5lY3Rpb25Qcm9maWxlUmVwb3NpdG9yeS5pbnN0YW5jZSgpLnByb2ZpbGVOYW1lZCggYWRkZWRQcm9maWxlTmFtZSk7Ci0JCQotCQkJaWYoICFhZGRlZFByb2ZpbGUuaXNOdWxsKCkpIHsKLQkJCQl0aGlzLnBvcHVsYXRlQ29ubmVjdGlvbkNvbWJvKCk7Ci0JCQkJdGhpcy5jb25uZWN0aW9uQ29tYm8uc2VsZWN0KCBjb25uZWN0aW9uQ29tYm8uaW5kZXhPZiggYWRkZWRQcm9maWxlLmdldE5hbWUoKSkpOwotCQkJCXRoaXMuaGFuZGxlQ29ubmVjdGlvbkNoYW5nZSgpOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSBDb25uZWN0aW9uTGlzdGVuZXIgYnVpbGRDb25uZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlyZXR1cm4gbmV3IENvbm5lY3Rpb25MaXN0ZW5lcigpIHsKLQotCQkJCXB1YmxpYyB2b2lkIG1vZGlmaWVkKCBDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKLQkJCQkvLyBub3QgaW50ZXJlc3RlZCB0byB0aGlzIGV2ZW50LgotCQkJCX0KLQotCQkJCXB1YmxpYyBib29sZWFuIG9rVG9DbG9zZSggQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7Ci0JCQkJLy8gbm90IGludGVyZXN0ZWQgdG8gdGhpcyBldmVudC4KLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgb3BlbmVkKCBDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKLQkJCQkJaWYoIERhdGFiYXNlUmVjb25uZWN0V2l6YXJkUGFnZS50aGlzLmNvbm5lY3Rpb24uZXF1YWxzKCBjb25uZWN0aW9uKSkgewotCQkJCQkJRGF0YWJhc2VHcm91cC50aGlzLnBvcHVsYXRlU2NoZW1hQ29tYm8oKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIGFib3V0VG9DbG9zZSggQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7Ci0JCQkJCWlmKCBEYXRhYmFzZVJlY29ubmVjdFdpemFyZFBhZ2UudGhpcy5jb25uZWN0aW9uLmVxdWFscyggY29ubmVjdGlvbikpIHsKLQkJCQkJCURhdGFiYXNlUmVjb25uZWN0V2l6YXJkUGFnZS50aGlzLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgY2xvc2VkKCBDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKLQkJCQkvLyBub3QgaW50ZXJlc3RlZCB0byB0aGlzIGV2ZW50LgotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIGRhdGFiYXNlQ2hhbmdlZChDb25uZWN0aW9uIGNvbm5lY3Rpb24sIGZpbmFsIERhdGFiYXNlIGRhdGFiYXNlKSB7Ci0JCQkJLy8gbm90IGludGVyZXN0ZWQgdG8gdGhpcyBldmVudC4KLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBzY2hlbWFDaGFuZ2VkKENvbm5lY3Rpb24gY29ubmVjdGlvbiwgZmluYWwgU2NoZW1hIHNjaGVtYSkgewotCQkJCS8vIG5vdCBpbnRlcmVzdGVkIHRvIHRoaXMgZXZlbnQuCi0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgdGFibGVDaGFuZ2VkKENvbm5lY3Rpb24gY29ubmVjdGlvbiwgZmluYWwgVGFibGUgdGFibGUpIHsKLQkJCQkvLyBub3QgaW50ZXJlc3RlZCB0byB0aGlzIGV2ZW50LgotCQkJCX0KLQkJCX07Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL0dlbmVyYXRlRW50aXRpZXNXaXphcmQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvR2VuZXJhdGVFbnRpdGllc1dpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWM3MTc3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvR2VuZXJhdGVFbnRpdGllc1dpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklKcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC5Db25uZWN0aW9uUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwuU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsLkVudGl0eUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsLlBhY2thZ2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJhdGVFbnRpdGllc1dpemFyZCBleHRlbmRzIFdpemFyZCB7CQotCi0JcHJpdmF0ZSBJSnBhUHJvamVjdCBqcGFQcm9qZWN0OwotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb247Ci0KLQkvKiogdGhpcyBwYWdlIGlzIG9ubHkgYnVpbHQgd2hlbiB0aGUgcHJvamVjdCBpcyBub3QgY29ubmVjdGVkIHRvIHRoZSBkYiAqLwotCXByaXZhdGUgRGF0YWJhc2VSZWNvbm5lY3RXaXphcmRQYWdlIGRiU2V0dGluZ3NQYWdlOwotCi0JcHJpdmF0ZSBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkUGFnZSBnZW5lcmF0ZUVudGl0aWVzUGFnZTsKLQotCXByaXZhdGUgUGFja2FnZUdlbmVyYXRvci5Db25maWcgcGFja2FnZUdlbmVyYXRvckNvbmZpZzsKLQotCXByaXZhdGUgRW50aXR5R2VuZXJhdG9yLkNvbmZpZyBlbnRpdHlHZW5lcmF0b3JDb25maWc7Ci0KLQlwcml2YXRlIGJvb2xlYW4gc3luY2hyb25pemVQZXJzaXN0ZW5jZVhtbDsKLQkKLQlwcml2YXRlIENvbGxlY3Rpb248VGFibGU+IHNlbGVjdGVkVGFibGVzOwotCi0JcHVibGljIEdlbmVyYXRlRW50aXRpZXNXaXphcmQoIElKcGFQcm9qZWN0IGpwYVByb2plY3QsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzdXBlcigpOwotCQl0aGlzLmpwYVByb2plY3QgPSBqcGFQcm9qZWN0OwotCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQkJdGhpcy5wYWNrYWdlR2VuZXJhdG9yQ29uZmlnID0gbmV3IFBhY2thZ2VHZW5lcmF0b3IuQ29uZmlnKCk7Ci0JCXRoaXMuZW50aXR5R2VuZXJhdG9yQ29uZmlnID0gbmV3IEVudGl0eUdlbmVyYXRvci5Db25maWcoKTsKLQkJdGhpcy5zZXRXaW5kb3dUaXRsZSggSnB0VWlNZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2dlbmVyYXRlRW50aXRpZXMpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJc3VwZXIuYWRkUGFnZXMoKTsKLQkJaWYgKCAhIHRoaXMuanBhUHJvamVjdElzQ29ubmVjdGVkKCkgfHwgICEgdGhpcy5wcm9qZWN0VXNlclNjaGVtYUV4aXN0cygpKSB7Ci0JCQl0aGlzLmRiU2V0dGluZ3NQYWdlID0gbmV3IERhdGFiYXNlUmVjb25uZWN0V2l6YXJkUGFnZSggdGhpcy5qcGFQcm9qZWN0KTsKLQkJCXRoaXMuYWRkUGFnZSh0aGlzLmRiU2V0dGluZ3NQYWdlKTsKLQkJfQotCQl0aGlzLmdlbmVyYXRlRW50aXRpZXNQYWdlID0gbmV3IEdlbmVyYXRlRW50aXRpZXNXaXphcmRQYWdlKCk7Ci0JCXRoaXMuYWRkUGFnZSggdGhpcy5nZW5lcmF0ZUVudGl0aWVzUGFnZSk7Ci0JCXRoaXMuZ2VuZXJhdGVFbnRpdGllc1BhZ2UuaW5pdCggdGhpcy5zZWxlY3Rpb24pOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQl0aGlzLnBhY2thZ2VHZW5lcmF0b3JDb25maWcuc2V0UGFja2FnZUZyYWdtZW50KCB0aGlzLmJ1aWxkUGFja2FnZUZyYWdtZW50KCkpOwotCi0JCXRoaXMuZW50aXR5R2VuZXJhdG9yQ29uZmlnLnNldENvbnZlcnRUb0NhbWVsQ2FzZSggdGhpcy5nZW5lcmF0ZUVudGl0aWVzUGFnZS5jb252ZXJ0VG9DYW1lbENhc2UoKSk7Ci0JCXRoaXMuZW50aXR5R2VuZXJhdG9yQ29uZmlnLnNldEZpZWxkQWNjZXNzVHlwZSggdGhpcy5nZW5lcmF0ZUVudGl0aWVzUGFnZS5maWVsZEFjY2Vzc1R5cGUoKSk7Ci0JCXRoaXMuZW50aXR5R2VuZXJhdG9yQ29uZmlnLnNldENvbGxlY3Rpb25UeXBlTmFtZSggdGhpcy5nZW5lcmF0ZUVudGl0aWVzUGFnZS5nZXRDb2xsZWN0aW9uVHlwZU5hbWUoKSk7Ci0JCXRoaXMuZW50aXR5R2VuZXJhdG9yQ29uZmlnLnNldEZpZWxkVmlzaWJpbGl0eSggdGhpcy5nZW5lcmF0ZUVudGl0aWVzUGFnZS5nZXRGaWVsZFZpc2liaWxpdHkoKSk7Ci0JCXRoaXMuZW50aXR5R2VuZXJhdG9yQ29uZmlnLnNldE1ldGhvZFZpc2liaWxpdHkoIHRoaXMuZ2VuZXJhdGVFbnRpdGllc1BhZ2UuZ2V0TWV0aG9kVmlzaWJpbGl0eSgpKTsKLQkJdGhpcy5lbnRpdHlHZW5lcmF0b3JDb25maWcuc2V0R2VuZXJhdGVHZXR0ZXJzQW5kU2V0dGVycyggdGhpcy5nZW5lcmF0ZUVudGl0aWVzUGFnZS5nZW5lcmF0ZUdldHRlcnNBbmRTZXR0ZXJzKCkpOwotCQl0aGlzLmVudGl0eUdlbmVyYXRvckNvbmZpZy5zZXRHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciggdGhpcy5nZW5lcmF0ZUVudGl0aWVzUGFnZS5nZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvcigpKTsKLQkJdGhpcy5lbnRpdHlHZW5lcmF0b3JDb25maWcuc2V0U2VyaWFsaXphYmxlKCB0aGlzLmdlbmVyYXRlRW50aXRpZXNQYWdlLnNlcmlhbGl6YWJsZSgpKTsKLQkJdGhpcy5lbnRpdHlHZW5lcmF0b3JDb25maWcuc2V0R2VuZXJhdGVTZXJpYWxWZXJzaW9uVUlEKCB0aGlzLmdlbmVyYXRlRW50aXRpZXNQYWdlLmdlbmVyYXRlU2VyaWFsVmVyc2lvblVJRCgpKTsKLQkJdGhpcy5lbnRpdHlHZW5lcmF0b3JDb25maWcuc2V0R2VuZXJhdGVFbWJlZGRlZElkRm9yQ29tcG91bmRQSyggdGhpcy5nZW5lcmF0ZUVudGl0aWVzUGFnZS5nZW5lcmF0ZUVtYmVkZGVkSWRGb3JDb21wb3VuZFBLKCkpOwotCQl0aGlzLmVudGl0eUdlbmVyYXRvckNvbmZpZy5zZXRPdmVycmlkZUVudGl0eU5hbWVzKCB0aGlzLmdlbmVyYXRlRW50aXRpZXNQYWdlLmdldE92ZXJyaWRlRW50aXR5TmFtZXMoKSk7Ci0KLQkJdGhpcy5zeW5jaHJvbml6ZVBlcnNpc3RlbmNlWG1sID0gdGhpcy5nZW5lcmF0ZUVudGl0aWVzUGFnZS5zeW5jaHJvbml6ZVBlcnNpc3RlbmNlWG1sKCk7Ci0JCQotCQl0aGlzLnNlbGVjdGVkVGFibGVzID0gdGhpcy5nZW5lcmF0ZUVudGl0aWVzUGFnZS5nZXRTZWxlY3RlZFRhYmxlcygpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHJpdmF0ZSBJUGFja2FnZUZyYWdtZW50IGJ1aWxkUGFja2FnZUZyYWdtZW50KCkgewotCQlJUGFja2FnZUZyYWdtZW50Um9vdCBwYWNrYWdlRnJhZ21lbnRSb290ID0gdGhpcy5nZW5lcmF0ZUVudGl0aWVzUGFnZS5nZXRQYWNrYWdlRnJhZ21lbnRSb290KCk7Ci0JCUlQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50ID0gdGhpcy5nZW5lcmF0ZUVudGl0aWVzUGFnZS5nZXRQYWNrYWdlRnJhZ21lbnQoKTsKLQkJCi0JCWlmICggcGFja2FnZUZyYWdtZW50ID09IG51bGwpIHsKLQkJCXBhY2thZ2VGcmFnbWVudD0gcGFja2FnZUZyYWdtZW50Um9vdC5nZXRQYWNrYWdlRnJhZ21lbnQoICIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCQlpZiAoIHBhY2thZ2VGcmFnbWVudC5leGlzdHMoKSkgewotCQkJcmV0dXJuIHBhY2thZ2VGcmFnbWVudDsKLQkJfQotCi0JCXRyeSB7Ci0JCQlyZXR1cm4gcGFja2FnZUZyYWdtZW50Um9vdC5jcmVhdGVQYWNrYWdlRnJhZ21lbnQoIHBhY2thZ2VGcmFnbWVudC5nZXRFbGVtZW50TmFtZSgpLCB0cnVlLCBudWxsKTsKLQkJfSAKLQkJY2F0Y2ggKCBKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCBleCk7Ci0JCX0KLQl9Ci0JCi0JQ29sbGVjdGlvbjxUYWJsZT4gZ2V0UG9zc2libGVUYWJsZXMoKSB7Ci0JCWlmICggdGhpcy5kYlNldHRpbmdzUGFnZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gdGhpcy5kYlNldHRpbmdzUGFnZS5nZXRUYWJsZXMoKTsKLQkJfQotCQlyZXR1cm4gKCB0aGlzLnByb2plY3RVc2VyU2NoZW1hRXhpc3RzKCkpID8gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oIHRoaXMuZ2V0UHJvamVjdFVzZXJTY2hlbWEoKS50YWJsZXMoKSkgOiBDb2xsZWN0aW9ucy48VGFibGU+ZW1wdHlMaXN0KCk7Ci0JfQotCQotCUNvbm5lY3Rpb25Qcm9maWxlIGdldFByb2plY3RDb25uZWN0aW9uUHJvZmlsZSgpIHsKLQkJcmV0dXJuIHRoaXMuanBhUHJvamVjdC5jb25uZWN0aW9uUHJvZmlsZSgpOwotCX0KLQkKLQlJSnBhUHJvamVjdCBnZXRKcGFQcm9qZWN0KCl7Ci0JCXJldHVybiB0aGlzLmpwYVByb2plY3Q7Ci0JfQotCQotCVNjaGVtYSBnZXRQcm9qZWN0VXNlclNjaGVtYSgpIHsKLQkJQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSA9IHRoaXMuZ2V0UHJvamVjdENvbm5lY3Rpb25Qcm9maWxlKCk7Ci0JCXJldHVybiBwcm9maWxlLmdldERhdGFiYXNlKCkuc2NoZW1hTmFtZWQoIHByb2ZpbGUuZ2V0VXNlck5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyBQYWNrYWdlR2VuZXJhdG9yLkNvbmZpZyBnZXRQYWNrYWdlR2VuZXJhdG9yQ29uZmlnKCkgewotCQlyZXR1cm4gdGhpcy5wYWNrYWdlR2VuZXJhdG9yQ29uZmlnOwotCX0KLQotCXB1YmxpYyBFbnRpdHlHZW5lcmF0b3IuQ29uZmlnIGdldEVudGl0eUdlbmVyYXRvckNvbmZpZygpIHsKLQkJcmV0dXJuIHRoaXMuZW50aXR5R2VuZXJhdG9yQ29uZmlnOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uPFRhYmxlPiBnZXRTZWxlY3RlZFRhYmxlcygpIHsKLQkJcmV0dXJuIHRoaXMuc2VsZWN0ZWRUYWJsZXM7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHN5bmNocm9uaXplUGVyc2lzdGVuY2VYbWwoKXsKLQkJcmV0dXJuIHRoaXMuc3luY2hyb25pemVQZXJzaXN0ZW5jZVhtbDsKLQl9Ci0JCi0gICAgcHVibGljIGJvb2xlYW4gY2FuRmluaXNoKCkgewotICAgICAgICBib29sZWFuIGNhbkZpbmlzaCA9IHRydWU7Ci0gICAgICAgIGlmICggISB0aGlzLmdlbmVyYXRlRW50aXRpZXNQYWdlLmlzUGFnZUNvbXBsZXRlKCkpIHsKLSAgICAgICAgCWNhbkZpbmlzaCA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjYW5GaW5pc2g7Ci0gICAgfQotICAgIAotCXByaXZhdGUgYm9vbGVhbiBqcGFQcm9qZWN0SXNDb25uZWN0ZWQoKSB7Ci0JCXJldHVybiB0aGlzLmdldFByb2plY3RDb25uZWN0aW9uUHJvZmlsZSgpLmlzQ29ubmVjdGVkKCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHByb2plY3RVc2VyU2NoZW1hRXhpc3RzKCkgewotCQlyZXR1cm4gKCB0aGlzLmdldFByb2plY3RVc2VyU2NoZW1hKCkgIT0gbnVsbCk7Ci0JfQotCQotCS8qKgotCSAqIHVwZGF0ZVBvc3NpYmxlVGFibGVzIGlzIGNhbGxlZCB3aGVuIHNjaGVtYZJzIFBvc3NpYmxlVGFibGVzIGNoYW5nZWQuCi0JICogVGhlIGRiU2V0dGluZ3NQYWdlIGlzIG1haW5seSB0aGUgc291cmNlIG9mIGNoYW5nZXMsIAotCSAqIGFuZCB0aGUgZ2VuZXJhdGVFbnRpdGllc1BhZ2UgbmVlZHMgdG8gYmUga2VwdCBpbiBzeW5jLgotCSAqLwotCXZvaWQgdXBkYXRlUG9zc2libGVUYWJsZXMoIENvbGxlY3Rpb248VGFibGU+IHBvc3NpYmxlVGFibGVzKSB7Ci0JCXRoaXMuZ2VuZXJhdGVFbnRpdGllc1BhZ2UudXBkYXRlVGFibGVzTGlzdFZpZXdlciggcG9zc2libGVUYWJsZXMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9HZW5lcmF0ZUVudGl0aWVzV2l6YXJkUGFnZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9HZW5lcmF0ZUVudGl0aWVzV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTAwZDVjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvR2VuZXJhdGVFbnRpdGllc1dpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24gYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovICAgCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwudXRpbC5UYWJsZUxheW91dENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkud2l6YXJkcy5OZXdUeXBlV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxNb2RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGV4dENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWwuRW50aXR5R2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5JSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8vIFRPRE8gZGV0ZXJtaW5lIG5hbWUgY29sbGlzaW9ucwotY2xhc3MgR2VuZXJhdGVFbnRpdGllc1dpemFyZFBhZ2UgZXh0ZW5kcyBOZXdUeXBlV2l6YXJkUGFnZSB7Ci0KLQlDaGVja2JveFRhYmxlVmlld2VyIHRhYmxlVGFibGU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gY29udmVydFRvQ2FtZWxDYXNlID0gdHJ1ZTsKLQlwcml2YXRlIGJvb2xlYW4gZmllbGRBY2Nlc3NUeXBlID0gdHJ1ZTsKLQlwcml2YXRlIFN0cmluZyBjb2xsZWN0aW9uVHlwZU5hbWUgPSBTZXQuY2xhc3MuZ2V0TmFtZSgpOwotCXByaXZhdGUgaW50IGZpZWxkVmlzaWJpbGl0eSA9IEVudGl0eUdlbmVyYXRvci5Db25maWcuUFJJVkFURTsKLQlwcml2YXRlIGludCBtZXRob2RWaXNpYmlsaXR5ID0gRW50aXR5R2VuZXJhdG9yLkNvbmZpZy5QVUJMSUM7Ci0JcHJpdmF0ZSBib29sZWFuIGdlbmVyYXRlR2V0dGVyc0FuZFNldHRlcnMgPSB0cnVlOwotCXByaXZhdGUgYm9vbGVhbiBnZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciA9IHRydWU7Ci0JcHJpdmF0ZSBib29sZWFuIHNlcmlhbGl6YWJsZSA9IHRydWU7Ci0JcHJpdmF0ZSBib29sZWFuIGdlbmVyYXRlU2VyaWFsVmVyc2lvblVJRCA9IHRydWU7Ci0JcHJpdmF0ZSBib29sZWFuIGdlbmVyYXRlRW1iZWRkZWRJZEZvckNvbXBvdW5kUEsgPSB0cnVlOwotCXByaXZhdGUgYm9vbGVhbiBzeW5jaHJvbml6ZVBlcnNpc3RlbmNlWG1sID0gZmFsc2U7Ci0JcHJpdmF0ZSBNYXA8VGFibGUsIFN0cmluZz4gb3ZlcnJpZGVFbnRpdHlOYW1lczsKLQkKLQlzdGF0aWMgZmluYWwgU3RyaW5nW10gVEFCTEVfVEFCTEVfQ09MVU1OX1BST1BFUlRJRVMgPSB7ICJ0YWJsZSIsICJlbnRpdHlOYW1lIiB9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUQUJMRV9DT0xVTU5fSU5ERVggPSAwOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTlRJVFlfTkFNRV9DT0xVTU5fSU5ERVggPSAxOwotCQotCi0JR2VuZXJhdGVFbnRpdGllc1dpemFyZFBhZ2UoKSB7Ci0JCXN1cGVyKHRydWUsICJHZW5lcmF0ZSBFbnRpdGllcyIpOyAvLyROT04tTkxTLTEkCi0JCXNldFRpdGxlKEpwdFVpTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZFBhZ2VfZ2VuZXJhdGVFbnRpdGllcyk7Ci0JCXNldE1lc3NhZ2UoSnB0VWlNZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkUGFnZV9jaG9vc2VFbnRpdHlUYWJsZSk7Ci0JfQotCQotCS8vIC0tLS0tLS0tIEluaXRpYWxpemF0aW9uIC0tLS0tLS0tLQotCS8qKgotCSAqIFRoZSB3aXphcmQgb3duaW5nIHRoaXMgcGFnZSBpcyByZXNwb25zaWJsZSBmb3IgY2FsbGluZyB0aGlzIG1ldGhvZCB3aXRoIHRoZQotCSAqIGN1cnJlbnQgc2VsZWN0aW9uLiBUaGUgc2VsZWN0aW9uIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgZmllbGRzIG9mIHRoZSB3aXphcmQgCi0JICogcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gc2VsZWN0aW9uIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgZmllbGRzCi0JICovCi0Jdm9pZCBpbml0KElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlJSmF2YUVsZW1lbnQgamVsZW09IGdldEluaXRpYWxKYXZhRWxlbWVudChzZWxlY3Rpb24pOwotCQlpbml0Q29udGFpbmVyUGFnZShqZWxlbSk7Ci0JCWluaXRUeXBlUGFnZShqZWxlbSk7Ci0JCWRvU3RhdHVzVXBkYXRlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQlpbnQgbkNvbHVtbnM9IDQ7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSBuQ29sdW1uczsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbXBvc2l0ZSwgSUpwYUhlbHBDb250ZXh0SWRzLkRJQUxPR19HRU5FUkFURV9FTlRJVElFUyk7Ci0JCQotCQljcmVhdGVDb250YWluZXJDb250cm9scyhjb21wb3NpdGUsIG5Db2x1bW5zKTsJCi0JCWNyZWF0ZVBhY2thZ2VDb250cm9scyhjb21wb3NpdGUsIG5Db2x1bW5zKTsJCi0JCQotCQlmaW5hbCBCdXR0b24gc3luY2hyb25pemVDbGFzc2VzQ2hlY2tCb3ggPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJc3luY2hyb25pemVDbGFzc2VzQ2hlY2tCb3guc2V0VGV4dChKcHRVaU1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRQYWdlX3N5bmNocm9uaXplQ2xhc3Nlcyk7Ci0JCXN5bmNocm9uaXplQ2xhc3Nlc0NoZWNrQm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJLy8gZG8gbm90aGluZwotCQkJfQotCQkKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzZXRTeW5jaHJvbml6ZVBlcnNpc3RlbmNlWG1sKHN5bmNocm9uaXplQ2xhc3Nlc0NoZWNrQm94LmdldFNlbGVjdGlvbigpKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlHcm91cCB0YWJsZXNHcm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5TSEFET1dfRVRDSEVEX0lOKTsKLQkJdGFibGVzR3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCXRhYmxlc0dyb3VwLnNldFRleHQoSnB0VWlNZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkUGFnZV90YWJsZXMpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSA0OwotCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlkYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJdGFibGVzR3JvdXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JCWNyZWF0ZVRhYmxlc1NlbGVjdGlvbkNvbnRyb2wodGFibGVzR3JvdXApOwotCQljcmVhdGVCdXR0b25Db21wb3NpdGUodGFibGVzR3JvdXApOwotCQkKLQkJR2VuZXJhdGVFbnRpdGllc1dpemFyZCBnZW5lcmF0ZUVudGl0aWVzV2l6YXJkID0gKChHZW5lcmF0ZUVudGl0aWVzV2l6YXJkKXRoaXMuZ2V0V2l6YXJkKCkpOwotCQlDb2xsZWN0aW9uPFRhYmxlPiBwb3NzaWJsZVRhYmxlcyA9IGdlbmVyYXRlRW50aXRpZXNXaXphcmQuZ2V0UG9zc2libGVUYWJsZXMoKTsKLQkJaW5pdFRhYmxlc1NlbGVjdGlvbkNvbnRyb2wocG9zc2libGVUYWJsZXMpOwotCQkKLQkJLy9zZXQgaW5pdGlhbCBzZWxlY3Rpb24gc3RhdGUgb2YgdGhlIHN5bmNocm9uaXplIGNsYXNzZXMgY2hlY2tib3gKLQkJc3luY2hyb25pemVDbGFzc2VzQ2hlY2tCb3guc2V0U2VsZWN0aW9uKCFnZW5lcmF0ZUVudGl0aWVzV2l6YXJkLmdldEpwYVByb2plY3QoKS5pc0Rpc2NvdmVyQW5ub3RhdGVkQ2xhc3NlcygpKTsKLQkJc2V0U3luY2hyb25pemVQZXJzaXN0ZW5jZVhtbChzeW5jaHJvbml6ZUNsYXNzZXNDaGVja0JveC5nZXRTZWxlY3Rpb24oKSk7Ci0JCQotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRoaXMudGFibGVUYWJsZS5nZXRDb250cm9sKCksIElKcGFIZWxwQ29udGV4dElkcy5ESUFMT0dfR0VORVJBVEVfRU5USVRJRVNfVEFCTEVTKTsKLQkJCi0JCXNldENvbnRyb2woY29tcG9zaXRlKTsKLQkJdGhpcy5zZXRQYWdlQ29tcGxldGUoIGZhbHNlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2VsZWN0QWxsVGFibGVzKCl7Ci0JCXRoaXMudGFibGVUYWJsZS5zZXRBbGxDaGVja2VkKHRydWUpOwotCQlkb1N0YXR1c1VwZGF0ZSgpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgZGVzZWxlY3RBbGxUYWJsZXMoKXsKLQkJdGhpcy50YWJsZVRhYmxlLnNldEFsbENoZWNrZWQoZmFsc2UpOwotCQlkb1N0YXR1c1VwZGF0ZSgpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgaW5pdFRhYmxlc1NlbGVjdGlvbkNvbnRyb2woQ29sbGVjdGlvbjxUYWJsZT4gcG9zc2libGVUYWJsZXMpIHsKLQkJdGhpcy5vdmVycmlkZUVudGl0eU5hbWVzID0gbmV3IEhhc2hNYXA8VGFibGUsIFN0cmluZz4ocG9zc2libGVUYWJsZXMuc2l6ZSgpKTsKLQkJdGhpcy50YWJsZVRhYmxlLnNldElucHV0KHBvc3NpYmxlVGFibGVzKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGFibGVzU2VsZWN0aW9uQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVRhYmxlTGF5b3V0Q29tcG9zaXRlIGxheW91dD0gbmV3IFRhYmxlTGF5b3V0Q29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlhZGRDb2x1bW5MYXlvdXREYXRhKGxheW91dCk7Ci0JCQotCQlmaW5hbCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZSB0YWJsZSA9IG5ldyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZShsYXlvdXQsIFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5TSU5HTEUgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuQk9SREVSIHwgU1dULkNIRUNLKTsKLQkJdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCQkKLQkJVGFibGVDb2x1bW4gdGFibGVOYW1lQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSwgVEFCTEVfQ09MVU1OX0lOREVYKTsKLQkJdGFibGVOYW1lQ29sdW1uLnNldFRleHQoSnB0VWlNZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkUGFnZV90YWJsZUNvbHVtbik7Ci0JCXRhYmxlTmFtZUNvbHVtbi5zZXRSZXNpemFibGUodHJ1ZSk7Ci0KLQkJVGFibGVDb2x1bW4gZW50aXR5TmFtZUNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUsIEVOVElUWV9OQU1FX0NPTFVNTl9JTkRFWCk7Ci0JCWVudGl0eU5hbWVDb2x1bW4uc2V0VGV4dChKcHRVaU1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRQYWdlX2VudGl0eU5hbWVDb2x1bW4pOwotCQllbnRpdHlOYW1lQ29sdW1uLnNldFJlc2l6YWJsZSh0cnVlKTsKLQkJCi0JCUdyaWREYXRhIGdkPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZ2QuaGVpZ2h0SGludD0gU1dUVXRpbC5nZXRUYWJsZUhlaWdodEhpbnQodGFibGUsIDIwKTsKLQkJZ2Qud2lkdGhIaW50ID0gNjAwOwotCQlsYXlvdXQuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJdGhpcy50YWJsZVRhYmxlID0gbmV3IENoZWNrYm94VGFibGVWaWV3ZXIodGFibGUpOwotCQl0aGlzLnRhYmxlVGFibGUuc2V0VXNlSGFzaGxvb2t1cCh0cnVlKTsKLQkJdGhpcy50YWJsZVRhYmxlLnNldExhYmVsUHJvdmlkZXIodGhpcy5idWlsZFRhYmxlVGFibGVMYWJlbFByb3ZpZGVyKCkpOwotCQl0aGlzLnRhYmxlVGFibGUuc2V0Q29udGVudFByb3ZpZGVyKHRoaXMuYnVpbGRUYWJsZVRhYmxlQ29udGVudFByb3ZpZGVyKCkpOwotCQl0aGlzLnRhYmxlVGFibGUuc2V0U29ydGVyKG5ldyBWaWV3ZXJTb3J0ZXIoKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IGUxLCBPYmplY3QgZTIpIHsKLQkJCQlyZXR1cm4gKChUYWJsZSkgZTEpLmdldE5hbWUoKS5jb21wYXJlVG8oKChUYWJsZSkgZTIpLmdldE5hbWUoKSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJdGhpcy50YWJsZVRhYmxlLmFkZFBvc3RTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCWhhbmRsZVRhYmxlc0xpc3RTZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJfSk7Ci0JCQotCQl0YWJsZS5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5QWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZSkgewotCQkJCWlmIChlLmtleUNvZGUgPT0gU1dULkYyICYmIGUuc3RhdGVNYXNrID09IFNXVC5OT05FKSB7Ci0JCQkJCWVkaXRFbnRpdHlOYW1lSWZQb3NzaWJsZSgpOwotCQkJCQllLmRvaXQ9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCQl0aGlzLmFkZENlbGxFZGl0b3JzKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVCdXR0b25Db21wb3NpdGUoR3JvdXAgdGFibGVzR3JvdXApewotCQkKLQkJQ29tcG9zaXRlIGJ1dHRvbkNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUodGFibGVzR3JvdXAsIFNXVC5OVUxMKTsKLQkJR3JpZExheW91dCBidXR0b25MYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCBmYWxzZSk7Ci0JCWJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXQoYnV0dG9uTGF5b3V0KTsKLQkJR3JpZERhdGEgZGF0YSA9ICBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkJFR0lOTklORzsKLQkJYnV0dG9uQ29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQlCdXR0b24gc2VsZWN0QWxsQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db21wb3NpdGUsIFNXVC5QVVNIKTsKLQkJc2VsZWN0QWxsQnV0dG9uLnNldFRleHQoSnB0VWlNZXNzYWdlcy5HZW5lcmFsX3NlbGVjdEFsbCk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gIG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJc2VsZWN0QWxsQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlzZWxlY3RBbGxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkvLyBkbyBub3RoaW5nCi0JCQl9Ci0JCQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXNlbGVjdEFsbFRhYmxlcygpOwotCQkJCQotCQkJfQotCQl9KTsKLQkJCi0JCUJ1dHRvbiBkZXNlbGVjdEFsbEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JCWRlc2VsZWN0QWxsQnV0dG9uLnNldFRleHQoSnB0VWlNZXNzYWdlcy5HZW5lcmFsX2Rlc2VsZWN0QWxsKTsKLQkJZ3JpZERhdGEgPSAgbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlkZXNlbGVjdEFsbEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJZGVzZWxlY3RBbGxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkvLyBkbyBub3RoaW5nCi0JCQl9Ci0JCQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWRlc2VsZWN0QWxsVGFibGVzKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkKLQlwcml2YXRlIHZvaWQgYWRkQ29sdW1uTGF5b3V0RGF0YShUYWJsZUxheW91dENvbXBvc2l0ZSBsYXlvdXQpIHsKLQkJbGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoNTAsIHRydWUpKTsKLQkJbGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoNTAsIHRydWUpKTsKLQl9Ci0KLQl2b2lkIGVkaXRFbnRpdHlOYW1lSWZQb3NzaWJsZSgpewotCQlPYmplY3RbXSBzZWxlY3RlZCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRoaXMudGFibGVUYWJsZS5nZXRTZWxlY3Rpb24oKSkudG9BcnJheSgpOwotCQlpZiAoc2VsZWN0ZWQubGVuZ3RoICE9IDEpIHsKLQkJCXJldHVybjsKLQkJfQotCQl0aGlzLnRhYmxlVGFibGUuZWRpdEVsZW1lbnQoc2VsZWN0ZWRbMF0sIEVOVElUWV9OQU1FX0NPTFVNTl9JTkRFWCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRDZWxsRWRpdG9ycygpIHsKLQkJdGhpcy50YWJsZVRhYmxlLnNldENvbHVtblByb3BlcnRpZXMoVEFCTEVfVEFCTEVfQ09MVU1OX1BST1BFUlRJRVMpOwotCQkKLQkJVGV4dENlbGxFZGl0b3JbXSBlZGl0b3JzID0gbmV3IFRleHRDZWxsRWRpdG9yW1RBQkxFX1RBQkxFX0NPTFVNTl9QUk9QRVJUSUVTLmxlbmd0aF07Ci0JCWVkaXRvcnNbRU5USVRZX05BTUVfQ09MVU1OX0lOREVYXT0gbmV3IFRleHRDZWxsRWRpdG9yKHRoaXMudGFibGVUYWJsZS5nZXRUYWJsZSgpLCBTV1QuU0lOR0xFKTsKLQkJCi0JCXRoaXMudGFibGVUYWJsZS5zZXRDZWxsRWRpdG9ycyhlZGl0b3JzKTsKLQkJdGhpcy50YWJsZVRhYmxlLnNldENlbGxNb2RpZmllcih0aGlzLmJ1aWxkVGFibGVUYWJsZUNlbGxNb2RpZmllcigpKTsKLQl9Ci0KLQl2b2lkIGhhbmRsZVRhYmxlc0xpc3RTZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQl0aGlzLnNldFBhZ2VDb21wbGV0ZSh0cnVlKTsKLQkJaWYgKCAhIHRoaXMuaGFzVGFibGVzU2VsZWN0ZWQoKSkgewotCQkJdGhpcy5zZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgSUJhc2VMYWJlbFByb3ZpZGVyIGJ1aWxkVGFibGVUYWJsZUxhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgVGFibGVUYWJsZUxhYmVsUHJvdmlkZXIoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29udGVudFByb3ZpZGVyIGJ1aWxkVGFibGVUYWJsZUNvbnRlbnRQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBUYWJsZVRhYmxlQ29udGVudFByb3ZpZGVyKCk7Ci0JfQotCQotCXByaXZhdGUgSUNlbGxNb2RpZmllciBidWlsZFRhYmxlVGFibGVDZWxsTW9kaWZpZXIoKSB7Ci0JCXJldHVybiBuZXcgVGFibGVUYWJsZUNlbGxNb2RpZmllcigpOwotCX0KLQkKLQlDb2xsZWN0aW9uPFRhYmxlPiBnZXRTZWxlY3RlZFRhYmxlcygpIHsKLQkJQXJyYXlMaXN0PFRhYmxlPiBzZWxlY3RlZFRhYmxlcyA9IG5ldyBBcnJheUxpc3Q8VGFibGU+KCk7Ci0JCWZvciAoT2JqZWN0IHNlbGVjdGVkVGFibGUgOiB0aGlzLnRhYmxlVGFibGUuZ2V0Q2hlY2tlZEVsZW1lbnRzKCkpCi0JCQlzZWxlY3RlZFRhYmxlcy5hZGQoKFRhYmxlKSBzZWxlY3RlZFRhYmxlKTsKLQkJcmV0dXJuIHNlbGVjdGVkVGFibGVzOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaGFzVGFibGVzU2VsZWN0ZWQoKSB7Ci0JCXJldHVybiAodGhpcy50YWJsZVRhYmxlICE9IG51bGwpID8gKHRoaXMuZ2V0U2VsZWN0ZWRUYWJsZXMoKS5zaXplKCkgPiAwKSA6IGZhbHNlOwotCX0KLQkKLQl2b2lkIHVwZGF0ZVRhYmxlc0xpc3RWaWV3ZXIoQ29sbGVjdGlvbjxUYWJsZT4gcG9zc2libGVUYWJsZXMpIHsKLQkJaWYgKHRoaXMudGFibGVUYWJsZSAhPSBudWxsKSB7Ci0JCQl0aGlzLmluaXRUYWJsZXNTZWxlY3Rpb25Db250cm9sKHBvc3NpYmxlVGFibGVzKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBkb1N0YXR1c1VwZGF0ZSgpIHsKLQkJLy8gc3RhdHVzIG9mIGFsbCB1c2VkIGNvbXBvbmVudHMKLQkJSVN0YXR1c1tdIHN0YXR1cz0gbmV3IElTdGF0dXNbXSB7Ci0JCQlmQ29udGFpbmVyU3RhdHVzLAotCQkJZlBhY2thZ2VTdGF0dXMKLQkJfTsKLQkJLy8gdGhlIG1vZGUgc2V2ZXJlIHN0YXR1cyB3aWxsIGJlIGRpc3BsYXllZCBhbmQgdGhlIE9LIGJ1dHRvbiBlbmFibGVkL2Rpc2FibGVkLgotCQl0aGlzLnVwZGF0ZVN0YXR1cyhzdGF0dXMpOwotCX0KLQkKLQkvKioKLQkgKiBVcGRhdGUgdGhlIHN0YXR1cyBsaW5lIGFuZCB0aGUgT0sgYnV0dG9uIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gc3RhdHVzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlU3RhdHVzKElTdGF0dXMgc3RhdHVzKSB7Ci0JCXN1cGVyLnVwZGF0ZVN0YXR1cyhzdGF0dXMpOwotCQlpZiAodGhpcy5pc1BhZ2VDb21wbGV0ZSgpICYmICEgdGhpcy5oYXNUYWJsZXNTZWxlY3RlZCgpKSB7Ci0JCQl0aGlzLnNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0JCX0KLQl9Ci0KLQlTdHJpbmcgZW50aXR5TmFtZShUYWJsZSB0YWJsZSkgewotCQlTdHJpbmcgb3ZlcnJpZGVFbnRpdHlOYW1lID0gKFN0cmluZykgdGhpcy5vdmVycmlkZUVudGl0eU5hbWVzLmdldCh0YWJsZSk7Ci0JCXJldHVybiAob3ZlcnJpZGVFbnRpdHlOYW1lICE9IG51bGwpID8gb3ZlcnJpZGVFbnRpdHlOYW1lIDogdGhpcy5kZWZhdWx0RW50aXR5TmFtZSh0YWJsZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdEVudGl0eU5hbWUoVGFibGUgdGFibGUpIHsKLQkJU3RyaW5nIGVudGl0eU5hbWUgPSB0YWJsZS5zaG9ydEphdmFDbGFzc05hbWUoKTsKLQkJaWYgKHRoaXMuY29udmVydFRvQ2FtZWxDYXNlKSB7Ci0JCQllbnRpdHlOYW1lID0gU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoZW50aXR5TmFtZSk7Ci0JCX0KLQkJcmV0dXJuIGVudGl0eU5hbWU7Ci0JfQotCi0Jdm9pZCBzZXRPdmVycmlkZUVudGl0eU5hbWUoVGFibGUgdGFibGUsIFN0cmluZyBuYW1lKSB7Ci0JCWlmICh0YWJsZS5zaG9ydEphdmFDbGFzc05hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCXRoaXMub3ZlcnJpZGVFbnRpdHlOYW1lcy5yZW1vdmUodGFibGUpOwotCQl9IGVsc2UgewotCQkJdGhpcy5vdmVycmlkZUVudGl0eU5hbWVzLnB1dCh0YWJsZSwgbmFtZSk7Ci0JCX0KLQl9Ci0KLQlib29sZWFuIGNvbnZlcnRUb0NhbWVsQ2FzZSgpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVydFRvQ2FtZWxDYXNlOwotCX0KLQlwcml2YXRlIHZvaWQgc2V0Q29udmVydFRvQ2FtZWxDYXNlKGJvb2xlYW4gY29udmVydFRvQ2FtZWxDYXNlKSB7Ci0JCS8vIFRPRE8gcmUtY2FsY3VsYXRlIHRoZSBkZWZhdWx0IGVudGl0eSBuYW1lcyBpZiB0aGlzIGNoYW5nZXMKLQkJdGhpcy5jb252ZXJ0VG9DYW1lbENhc2UgPSBjb252ZXJ0VG9DYW1lbENhc2U7Ci0JfQotCi0JYm9vbGVhbiBmaWVsZEFjY2Vzc1R5cGUoKSB7Ci0JCXJldHVybiB0aGlzLmZpZWxkQWNjZXNzVHlwZTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIHNldEZpZWxkQWNjZXNzVHlwZShib29sZWFuIGZpZWxkQWNjZXNzVHlwZSkgewotCQl0aGlzLmZpZWxkQWNjZXNzVHlwZSA9IGZpZWxkQWNjZXNzVHlwZTsKLQl9Ci0KLQlTdHJpbmcgZ2V0Q29sbGVjdGlvblR5cGVOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5jb2xsZWN0aW9uVHlwZU5hbWU7Ci0JfQotCXByaXZhdGUgdm9pZCBzZXRDb2xsZWN0aW9uVHlwZU5hbWUoU3RyaW5nIGNvbGxlY3Rpb25UeXBlTmFtZSkgewotCQl0aGlzLmNvbGxlY3Rpb25UeXBlTmFtZSA9IGNvbGxlY3Rpb25UeXBlTmFtZTsKLQl9Ci0KLQlpbnQgZ2V0RmllbGRWaXNpYmlsaXR5KCkgewotCQlyZXR1cm4gdGhpcy5maWVsZFZpc2liaWxpdHk7Ci0JfQotCXByaXZhdGUgdm9pZCBzZXRGaWVsZFZpc2liaWxpdHkoaW50IGZpZWxkVmlzaWJpbGl0eSkgewotCQl0aGlzLmZpZWxkVmlzaWJpbGl0eSA9IGZpZWxkVmlzaWJpbGl0eTsKLQl9Ci0KLQlpbnQgZ2V0TWV0aG9kVmlzaWJpbGl0eSgpIHsKLQkJcmV0dXJuIHRoaXMubWV0aG9kVmlzaWJpbGl0eTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIHNldE1ldGhvZFZpc2liaWxpdHkoaW50IG1ldGhvZFZpc2liaWxpdHkpIHsKLQkJdGhpcy5tZXRob2RWaXNpYmlsaXR5ID0gbWV0aG9kVmlzaWJpbGl0eTsKLQl9Ci0KLQlib29sZWFuIGdlbmVyYXRlR2V0dGVyc0FuZFNldHRlcnMoKSB7Ci0JCXJldHVybiB0aGlzLmdlbmVyYXRlR2V0dGVyc0FuZFNldHRlcnM7Ci0JfQotCXByaXZhdGUgdm9pZCBzZXRHZW5lcmF0ZUdldHRlcnNBbmRTZXR0ZXJzKGJvb2xlYW4gZ2VuZXJhdGVHZXR0ZXJzQW5kU2V0dGVycykgewotCQl0aGlzLmdlbmVyYXRlR2V0dGVyc0FuZFNldHRlcnMgPSBnZW5lcmF0ZUdldHRlcnNBbmRTZXR0ZXJzOwotCX0KLQotCWJvb2xlYW4gZ2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yOwotCX0KLQlwcml2YXRlIHZvaWQgc2V0R2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IoYm9vbGVhbiBnZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvcikgewotCQl0aGlzLmdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yID0gZ2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3I7Ci0JfQotCi0JYm9vbGVhbiBzZXJpYWxpemFibGUoKSB7Ci0JCXJldHVybiB0aGlzLnNlcmlhbGl6YWJsZTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIHNldFNlcmlhbGl6YWJsZShib29sZWFuIHNlcmlhbGl6YWJsZSkgewotCQl0aGlzLnNlcmlhbGl6YWJsZSA9IHNlcmlhbGl6YWJsZTsKLQl9Ci0KLQlib29sZWFuIGdlbmVyYXRlU2VyaWFsVmVyc2lvblVJRCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2VuZXJhdGVTZXJpYWxWZXJzaW9uVUlEOwotCX0KLQlwcml2YXRlIHZvaWQgc2V0R2VuZXJhdGVTZXJpYWxWZXJzaW9uVUlEKGJvb2xlYW4gZ2VuZXJhdGVTZXJpYWxWZXJzaW9uVUlEKSB7Ci0JCXRoaXMuZ2VuZXJhdGVTZXJpYWxWZXJzaW9uVUlEID0gZ2VuZXJhdGVTZXJpYWxWZXJzaW9uVUlEOwotCX0KLQotCWJvb2xlYW4gZ2VuZXJhdGVFbWJlZGRlZElkRm9yQ29tcG91bmRQSygpIHsKLQkJcmV0dXJuIHRoaXMuZ2VuZXJhdGVFbWJlZGRlZElkRm9yQ29tcG91bmRQSzsKLQl9Ci0JcHJpdmF0ZSB2b2lkIHNldEdlbmVyYXRlRW1iZWRkZWRJZEZvckNvbXBvdW5kUEsoYm9vbGVhbiBnZW5lcmF0ZUVtYmVkZGVkSWRGb3JDb21wb3VuZFBLKSB7Ci0JCXRoaXMuZ2VuZXJhdGVFbWJlZGRlZElkRm9yQ29tcG91bmRQSyA9IGdlbmVyYXRlRW1iZWRkZWRJZEZvckNvbXBvdW5kUEs7Ci0JfQotCi0JYm9vbGVhbiBzeW5jaHJvbml6ZVBlcnNpc3RlbmNlWG1sKCkgewotCQlyZXR1cm4gdGhpcy5zeW5jaHJvbml6ZVBlcnNpc3RlbmNlWG1sOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0U3luY2hyb25pemVQZXJzaXN0ZW5jZVhtbChib29sZWFuIHN5bmNocm9uaXplUGVyc2lzdGVuY2VYbWwpewotCQl0aGlzLnN5bmNocm9uaXplUGVyc2lzdGVuY2VYbWwgPSBzeW5jaHJvbml6ZVBlcnNpc3RlbmNlWG1sOwotCX0KLQkKLQkvKioKLQkgKiBrZXkgPSB0YWJsZQotCSAqIHZhbHVlID0gb3ZlcnJpZGUgZW50aXR5IG5hbWUKLQkgKi8KLQlNYXA8VGFibGUsIFN0cmluZz4gZ2V0T3ZlcnJpZGVFbnRpdHlOYW1lcygpIHsKLQkJcmV0dXJuIHRoaXMub3ZlcnJpZGVFbnRpdHlOYW1lczsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5uZXIgY2xhc3NlcyAqKioqKioqKioqCi0KLQlwcml2YXRlIGNsYXNzIFRhYmxlVGFibGVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCi0JCVRhYmxlVGFibGVMYWJlbFByb3ZpZGVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJcmV0dXJuICgoVGFibGUpIGVsZW1lbnQpLmdldE5hbWUoKTsKLQkJfQotCi0JCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlzd2l0Y2ggKGNvbHVtbkluZGV4KSB7Ci0JCQkJY2FzZSBUQUJMRV9DT0xVTU5fSU5ERVg6Ci0JCQkJCXJldHVybiAoKFRhYmxlKSBlbGVtZW50KS5nZXROYW1lKCk7Ci0KLQkJCQljYXNlIEVOVElUWV9OQU1FX0NPTFVNTl9JTkRFWDoKLQkJCQkJcmV0dXJuIEdlbmVyYXRlRW50aXRpZXNXaXphcmRQYWdlLnRoaXMuZW50aXR5TmFtZSgoVGFibGUpIGVsZW1lbnQpOwotCQkJfQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBjb2x1bW4gaW5kZXg6ICIgKyBjb2x1bW5JbmRleCk7Ci0JCX0KLQotCX0KLQotCi0JcHJpdmF0ZSBjbGFzcyBUYWJsZVRhYmxlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewotCi0JCVRhYmxlVGFibGVDb250ZW50UHJvdmlkZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQkKLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCQotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQkJcmV0dXJuICgoQ29sbGVjdGlvbikgaW5wdXRFbGVtZW50KS50b0FycmF5KCk7Ci0JCX0KLQotCX0KLQotCi0JcHJpdmF0ZSBjbGFzcyBUYWJsZVRhYmxlQ2VsbE1vZGlmaWVyIGltcGxlbWVudHMgSUNlbGxNb2RpZmllciB7Ci0KLQkJVGFibGVUYWJsZUNlbGxNb2RpZmllcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBjYW5Nb2RpZnkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQkJcmV0dXJuIHByb3BlcnR5LmVxdWFscyhUQUJMRV9UQUJMRV9DT0xVTU5fUFJPUEVSVElFU1tFTlRJVFlfTkFNRV9DT0xVTU5fSU5ERVhdKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQkJaWYgKHByb3BlcnR5LmVxdWFscyhUQUJMRV9UQUJMRV9DT0xVTU5fUFJPUEVSVElFU1tFTlRJVFlfTkFNRV9DT0xVTU5fSU5ERVhdKSkgewotCQkJCXJldHVybiBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkUGFnZS50aGlzLmVudGl0eU5hbWUoKFRhYmxlKSBlbGVtZW50KTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgbW9kaWZ5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHksIE9iamVjdCB2YWx1ZSkgewotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBUYWJsZUl0ZW0pIHsKLQkJCQllbGVtZW50PSAoKFRhYmxlSXRlbSkgZWxlbWVudCkuZ2V0RGF0YSgpOwotCQkJfQotCQkJaWYgKCAhIChlbGVtZW50IGluc3RhbmNlb2YgVGFibGUpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlib29sZWFuIHVuY2hhbmdlZCA9IGZhbHNlOwotCQkJVGFibGUgdGFibGUgPSAoVGFibGUpIGVsZW1lbnQ7Ci0JCQlpZiAocHJvcGVydHkuZXF1YWxzKFRBQkxFX1RBQkxFX0NPTFVNTl9QUk9QRVJUSUVTW0VOVElUWV9OQU1FX0NPTFVNTl9JTkRFWF0pKSB7Ci0JCQkJdW5jaGFuZ2VkID0gR2VuZXJhdGVFbnRpdGllc1dpemFyZFBhZ2UudGhpcy5lbnRpdHlOYW1lKHRhYmxlKS5lcXVhbHModmFsdWUpOwotCQkJCUdlbmVyYXRlRW50aXRpZXNXaXphcmRQYWdlLnRoaXMuc2V0T3ZlcnJpZGVFbnRpdHlOYW1lKHRhYmxlLCAoU3RyaW5nKSB2YWx1ZSk7Ci0JCQl9Ci0JCQlpZiAoISB1bmNoYW5nZWQpIHsKLQkJCQlHZW5lcmF0ZUVudGl0aWVzV2l6YXJkUGFnZS50aGlzLnRhYmxlVGFibGUudXBkYXRlKHRhYmxlLCBuZXcgU3RyaW5nW10geyBwcm9wZXJ0eSB9KTsKLQkJCX0KLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL0pwYUZhY2V0V2l6YXJkUGFnZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9KcGFGYWNldFdpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI1YzY5ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC93aXphcmRzL0pwYUZhY2V0V2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAotICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnByZWZlcmVuY2VzLlVzZXJMaWJyYXJ5UHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5KcGFQbGF0Zm9ybVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmZhY2V0LklKcGFGYWNldERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLkNvbm5lY3Rpb25Qcm9maWxlUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIudWkuaW50ZXJuYWwuRFRQVWlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSUpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaUljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwucHJlZnMuSnBhUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5QcmVmZXJlbmNlc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLmludGVybmFsLkFic3RyYWN0RGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5pbnRlcm5hbC5DaGFuZ2VUYXJnZXRlZFJ1bnRpbWVzRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5pbnRlcm5hbC5GYWNldHNTZWxlY3Rpb25QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53ZWIudWkuaW50ZXJuYWwud2l6YXJkcy5EYXRhTW9kZWxGYWNldEluc3RhbGxQYWdlOwotCi1wdWJsaWMgY2xhc3MgSnBhRmFjZXRXaXphcmRQYWdlIAotCWV4dGVuZHMgRGF0YU1vZGVsRmFjZXRJbnN0YWxsUGFnZQotCWltcGxlbWVudHMgSUpwYUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcwotewotCXByaXZhdGUgUGxhdGZvcm1Hcm91cCBwbGF0Zm9ybUdyb3VwOwotCQotCXByaXZhdGUgQ29ubmVjdGlvbkdyb3VwIGNvbm5lY3Rpb25Hcm91cDsKLQkKLQlwcml2YXRlIENsYXNzcGF0aENvbmZpZ0dyb3VwIGNsYXNzcGF0aENvbmZpZ0dyb3VwOwotCQotCXByaXZhdGUgUGVyc2lzdGVudENsYXNzTWFuYWdlbWVudEdyb3VwIHBlcnNpc3RlbnRDbGFzc01hbmFnZW1lbnRHcm91cDsKLQkKLQlwcml2YXRlIE9ybVhtbEdyb3VwIG9ybVhtbEdyb3VwOwotCQotCQotCXB1YmxpYyBKcGFGYWNldFdpemFyZFBhZ2UoKSB7Ci0JCXN1cGVyKCJqcHQuanBhLmZhY2V0Lmluc3RhbGwucGFnZSIpOyAvLyROT04tTkxTLTEkCi0JCXNldFRpdGxlKEpwdFVpTWVzc2FnZXMuSnBhRmFjZXRXaXphcmRQYWdlX3RpdGxlKTsKLQkJc2V0RGVzY3JpcHRpb24oSnB0VWlNZXNzYWdlcy5KcGFGYWNldFdpemFyZFBhZ2VfZGVzY3JpcHRpb24pOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoSnB0VWlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEpwdFVpSWNvbnMuSlBBX1dJWl9CQU5ORVIpKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCi0JCXBsYXRmb3JtR3JvdXAgPSBuZXcgUGxhdGZvcm1Hcm91cChjb21wb3NpdGUpOwotCQljb25uZWN0aW9uR3JvdXAgPSBuZXcgQ29ubmVjdGlvbkdyb3VwKGNvbXBvc2l0ZSk7Ci0JCWNsYXNzcGF0aENvbmZpZ0dyb3VwID0gbmV3IENsYXNzcGF0aENvbmZpZ0dyb3VwKGNvbXBvc2l0ZSk7Ci0JCXBlcnNpc3RlbnRDbGFzc01hbmFnZW1lbnRHcm91cCA9IG5ldyBQZXJzaXN0ZW50Q2xhc3NNYW5hZ2VtZW50R3JvdXAoY29tcG9zaXRlKTsKLQkJb3JtWG1sR3JvdXAgPSBuZXcgT3JtWG1sR3JvdXAoY29tcG9zaXRlKTsKLQkJCi0JCXNldFVwUnVudGltZUxpc3RlbmVyKCk7Ci0JCQotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KHBhcmVudCk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFyZW50LCBJSnBhSGVscENvbnRleHRJZHMuRElBTE9HX0pQQV9GQUNFVCk7Ci0JCQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0VXBSdW50aW1lTGlzdGVuZXIoKSB7Ci0JCWZpbmFsIENoYW5nZVRhcmdldGVkUnVudGltZXNEYXRhTW9kZWwgcnVudGltZURhdGFNb2RlbCA9IGdldFJ1bnRpbWVEYXRhTW9kZWwoKTsKLQkJLy8gbXVzdCBkbyBpdCBtYW51YWxseSB0aGUgZmlyc3QgdGltZQotCQltb2RlbC5zZXRQcm9wZXJ0eShSVU5USU1FLCBydW50aW1lRGF0YU1vZGVsLmdldFByaW1hcnlSdW50aW1lKCkpOwotCQlydW50aW1lRGF0YU1vZGVsLmFkZExpc3RlbmVyKAotCQkJQ2hhbmdlVGFyZ2V0ZWRSdW50aW1lc0RhdGFNb2RlbC5FVkVOVF9QUklNQVJZX1JVTlRJTUVfQ0hBTkdFRCwKLQkJCW5ldyBBYnN0cmFjdERhdGFNb2RlbC5JRGF0YU1vZGVsTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoKSB7Ci0JCQkJCW1vZGVsLnNldFByb3BlcnR5KFJVTlRJTUUsIHJ1bnRpbWVEYXRhTW9kZWwuZ2V0UHJpbWFyeVJ1bnRpbWUoKSk7Ci0JCQkJfQotCQkJfQotCQkpOwotCX0KLQkKLQlwcml2YXRlIENoYW5nZVRhcmdldGVkUnVudGltZXNEYXRhTW9kZWwgZ2V0UnVudGltZURhdGFNb2RlbCgpIHsKLQkJLy8gVGhpcyBpcyBoYWNreSwgYnV0IHVuZm9ydHVuYXRlbHkgdGhlIG9ubHkgY3VycmVudCB3YXkgdG8gZG8gdGhpcwotCQkvLyBzZWUgYnVnIDEzODA3NAotCQlGYWNldHNTZWxlY3Rpb25QYWdlIGZhY2V0UGFnZSA9IG51bGw7Ci0JCWZvciAoSVdpemFyZFBhZ2UgcGFnZSA6IGdldFdpemFyZCgpLmdldFBhZ2VzKCkpIHsKLQkJCWlmIChwYWdlIGluc3RhbmNlb2YgRmFjZXRzU2VsZWN0aW9uUGFnZSkgewotCQkJCWZhY2V0UGFnZSA9IChGYWNldHNTZWxlY3Rpb25QYWdlKSBwYWdlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiAoZmFjZXRQYWdlID09IG51bGwpID8KLQkJCW51bGwgOgotCQkJZmFjZXRQYWdlLnBhbmVsLmdldERhdGFNb2RlbCgpLmdldFRhcmdldGVkUnVudGltZXNEYXRhTW9kZWwoKTsKLQl9Ci0JCi0JCi0JCi0JcHJpdmF0ZSBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgY29udGFpbmVyLCBpbnQgc3BhbiwgU3RyaW5nIHRleHQpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29udGFpbmVyLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQodGV4dCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gc3BhbjsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0JCi0JcHJpdmF0ZSBCdXR0b24gY3JlYXRlQnV0dG9uKENvbXBvc2l0ZSBjb250YWluZXIsIGludCBzcGFuLCBTdHJpbmcgdGV4dCwgaW50IHN0eWxlKSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKGNvbnRhaW5lciwgU1dULk5PTkUgfCBzdHlsZSk7Ci0JCWJ1dHRvbi5zZXRUZXh0KHRleHQpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IHNwYW47Ci0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0JCi0JcHJpdmF0ZSBDb21ibyBjcmVhdGVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyLCBpbnQgc3BhbiwgYm9vbGVhbiBmaWxsSG9yaXpvbnRhbCkgewotCQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyhjb250YWluZXIsIFNXVC5CT1JERVIgfCBTV1QuU0lOR0xFIHwgU1dULlJFQURfT05MWSk7Ci0JCUdyaWREYXRhIGdkOwotCQlpZiAoZmlsbEhvcml6b250YWwpIHsKLQkJCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQl9Ci0JCWdkLmhvcml6b250YWxTcGFuID0gc3BhbjsKLQkJY29tYm8uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXJldHVybiBjb21ibzsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsKLQkJCVBMQVRGT1JNX0lELAotCQkJQ09OTkVDVElPTiwKLQkJCVVTRV9TRVJWRVJfSlBBX0lNUExFTUVOVEFUSU9OLAotCQkJSlBBX0xJQlJBUlksCi0JCQlESVNDT1ZFUl9BTk5PVEFURURfQ0xBU1NFUwotCQl9OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJaWYgKCEgc3VwZXIuaXNQYWdlQ29tcGxldGUoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIChtb2RlbC52YWxpZGF0ZSgpLmdldFNldmVyaXR5KCkgIT0gSVN0YXR1cy5FUlJPUik7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLQkJc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLQkJaWYgKHZpc2libGUpIHsKLQkJCXNldEVycm9yTWVzc2FnZSgpOwotCQl9Ci0JfQotCQotCQotCXByaXZhdGUgZmluYWwgY2xhc3MgUGxhdGZvcm1Hcm91cAotCXsKLQkJcHJpdmF0ZSBmaW5hbCBDb21ib1ZpZXdlciBwbGF0Zm9ybUNvbWJvOwotCQkKLQkJCi0JCXB1YmxpYyBQbGF0Zm9ybUdyb3VwKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJZ3JvdXAuc2V0VGV4dChKcHRVaU1lc3NhZ2VzLkpwYUZhY2V0V2l6YXJkUGFnZV9wbGF0Zm9ybUxhYmVsKTsKLQkJCWdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJCWdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChncm91cCwgSUpwYUhlbHBDb250ZXh0SWRzLkRJQUxPR19KUEFfUExBVEZPUk0pOwotCQkJCi0JCQlwbGF0Zm9ybUNvbWJvID0gbmV3IENvbWJvVmlld2VyKGNyZWF0ZUNvbWJvKGdyb3VwLCAxLCB0cnVlKSk7Ci0JCQlwbGF0Zm9ybUNvbWJvLnNldENvbnRlbnRQcm92aWRlcigKLQkJCQkJbmV3IElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyKCkgewotCQkJCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCQkJCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmFycmF5KEpwYVBsYXRmb3JtUmVnaXN0cnkuSU5TVEFOQ0UuYWxsSnBhUGxhdGZvcm1JZHMoKSk7Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7fQotCQkJCQkJCi0JCQkJCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHt9Ci0JCQkJCX0KLQkJCQkpOwotCQkJcGxhdGZvcm1Db21iby5zZXRMYWJlbFByb3ZpZGVyKAotCQkJCQluZXcgSUxhYmVsUHJvdmlkZXIoKSB7Ci0JCQkJCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJCQkJcmV0dXJuIEpwYVBsYXRmb3JtUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0SnBhUGxhdGZvcm1MYWJlbCgoU3RyaW5nKSBlbGVtZW50KTsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikge30KLQkJCQkJCQotCQkJCQkJcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikge30KLQkJCQkJCQotCQkJCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHt9Ci0JCQkJCQkKLQkJCQkJCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkpOwotCQkJcGxhdGZvcm1Db21iby5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoCi0JCQkJCW5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJCQltb2RlbC5zZXRQcm9wZXJ0eShQTEFURk9STV9JRCwgKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJKTsKLQkJCS8vIHdlIG5lZWQgc29tZSBpbnB1dCBoZXJlLCBldmVuIGlmIGl0IG1lYW5zIGFic29sdXRlbHkgbm90aGluZwotCQkJcGxhdGZvcm1Db21iby5zZXRJbnB1dCgibnVsbCBpbnB1dCIpOwotCQkJaWYgKHBsYXRmb3JtQ29tYm8uZ2V0RWxlbWVudEF0KDApICE9IG51bGwpIHsKLQkJCQlwbGF0Zm9ybUNvbWJvLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihwbGF0Zm9ybUNvbWJvLmdldEVsZW1lbnRBdCgwKSkpOwotCQkJfQotCQl9Ci0JfQotCQotCQotCXByaXZhdGUgZmluYWwgY2xhc3MgQ29ubmVjdGlvbkdyb3VwCi0JewotCQlwcml2YXRlIGZpbmFsIENvbWJvIGNvbm5lY3Rpb25Db21ibzsKLQkJCi0JCXByaXZhdGUgTGluayBjb25uZWN0aW9uTGluazsKLQkJCi0JCQotCQlwdWJsaWMgQ29ubmVjdGlvbkdyb3VwKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJZ3JvdXAuc2V0VGV4dChKcHRVaU1lc3NhZ2VzLkpwYUZhY2V0V2l6YXJkUGFnZV9jb25uZWN0aW9uTGFiZWwpOwotCQkJZ3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQkJZ3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGdyb3VwLCBJSnBhSGVscENvbnRleHRJZHMuTkVXX0pQQV9QUk9KRUNUX0NPTlRFTlRfUEFHRV9EQVRBQkFTRSk7Ci0JCQkKLQkJCWNvbm5lY3Rpb25Db21ibyA9IGNyZWF0ZUNvbWJvKGdyb3VwLCAxLCB0cnVlKTsKLQkJCWNvbm5lY3Rpb25Db21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcigKLQkJCQkJbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJCW1vZGVsLnNldFByb3BlcnR5KENPTk5FQ1RJT04sIGNvbm5lY3Rpb25Db21iby5nZXRJdGVtKGNvbm5lY3Rpb25Db21iby5nZXRTZWxlY3Rpb25JbmRleCgpKSk7Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQkJd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkpOwotCQkJZmlsbENvbm5lY3Rpb25zKCk7Ci0JCQlpZiAoY29ubmVjdGlvbkNvbWJvLmdldEl0ZW1Db3VudCgpID4gMCkgewotCQkJCWNvbm5lY3Rpb25Db21iby5zZWxlY3QoMCk7Ci0JCQkJbW9kZWwuc2V0UHJvcGVydHkoQ09OTkVDVElPTiwgY29ubmVjdGlvbkNvbWJvLmdldEl0ZW0oMCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJY29ubmVjdGlvbkNvbWJvLmNsZWFyU2VsZWN0aW9uKCk7Ci0JCQkJbW9kZWwuc2V0UHJvcGVydHkoQ09OTkVDVElPTiwgbnVsbCk7Ci0JCQl9Ci0JCQkKLQkJCWNvbm5lY3Rpb25MaW5rID0gbmV3IExpbmsoZ3JvdXAsIFNXVC5OT05FKTsKLQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRU5ELCBHcmlkRGF0YS5DRU5URVIsIGZhbHNlLCBmYWxzZSk7Ci0JCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJCWNvbm5lY3Rpb25MaW5rLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQljb25uZWN0aW9uTGluay5zZXRUZXh0KEpwdFVpTWVzc2FnZXMuSnBhRmFjZXRXaXphcmRQYWdlX2Nvbm5lY3Rpb25MaW5rKTsKLQkJCWNvbm5lY3Rpb25MaW5rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKAotCQkJCW5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlvcGVuTmV3Q29ubmVjdGlvbldpemFyZCgpOwkJCQkKLQkJCQkJfQotCQkJCX0KLQkJCSk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgZmlsbENvbm5lY3Rpb25zKCkgewotCQkJLy9jbGVhciBvdXQgY29ubmVjdGlvbiBlbnRyaWVzIGZyb20gcHJldmlvdXMgbG9naW4uCi0JCQljb25uZWN0aW9uQ29tYm8ucmVtb3ZlQWxsKCk7Ci0JCQkKLQkJCWZvciAoSXRlcmF0b3Igc3RyZWFtID0gQ29ubmVjdGlvblByb2ZpbGVSZXBvc2l0b3J5Lmluc3RhbmNlKCkucHJvZmlsZU5hbWVzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJCWNvbm5lY3Rpb25Db21iby5hZGQoKFN0cmluZykgc3RyZWFtLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXByaXZhdGUgU3RyaW5nIGdldENvbm5lY3Rpb25OYW1lKCkgewotCQkJcmV0dXJuIGNvbm5lY3Rpb25Db21iby5nZXRUZXh0KCk7Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCBvcGVuTmV3Q29ubmVjdGlvbldpemFyZCgpIHsKLQkJCVN0cmluZyBjb25uZWN0aW9uTmFtZSA9IERUUFVpVG9vbHMuY3JlYXRlTmV3UHJvZmlsZSgpOwotCQkJaWYgKGNvbm5lY3Rpb25OYW1lICE9IG51bGwpIHsKLQkJCQlmaWxsQ29ubmVjdGlvbnMoKTsKLQkJCQltb2RlbC5zZXRQcm9wZXJ0eShDT05ORUNUSU9OLCBjb25uZWN0aW9uTmFtZSk7Ci0JCQkJY29ubmVjdGlvbkNvbWJvLnNlbGVjdChjb25uZWN0aW9uQ29tYm8uaW5kZXhPZihjb25uZWN0aW9uTmFtZSkpOwotCQkJfQotCQl9Ci0JfQotCQotCQotCXByaXZhdGUgZmluYWwgY2xhc3MgQ2xhc3NwYXRoQ29uZmlnR3JvdXAKLQl7Ci0JCXByaXZhdGUgZmluYWwgQnV0dG9uIHVzZVNlcnZlckxpYkJ1dHRvbjsKLQkJCi0JCXByaXZhdGUgZmluYWwgQnV0dG9uIHNwZWNpZnlMaWJCdXR0b247Ci0JCQotCQlwcml2YXRlIGZpbmFsIENvbWJvIGpwYUxpYkNvbWJvOwotCQkKLQkJcHJpdmF0ZSBmaW5hbCBMaW5rIGpwYVByZWZzTGluazsKLQkJCi0JCXByaXZhdGUgZmluYWwgTGluayB1c2VyTGlic0xpbms7Ci0JCQotCQkKLQkJCi0JCXB1YmxpYyBDbGFzc3BhdGhDb25maWdHcm91cChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCQlHcm91cCBncm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCWdyb3VwLnNldFRleHQoSnB0VWlNZXNzYWdlcy5KcGFGYWNldFdpemFyZFBhZ2VfanBhSW1wbGVtZW50YXRpb25MYWJlbCk7Ci0JCQlncm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJCWdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChncm91cCwgSUpwYUhlbHBDb250ZXh0SWRzLk5FV19KUEFfUFJPSkVDVF9DT05URU5UX1BBR0VfQ0xBU1NQQVRIKTsKLQkJCQotCQkJdXNlU2VydmVyTGliQnV0dG9uID0gY3JlYXRlQnV0dG9uKGdyb3VwLCAyLCBKcHRVaU1lc3NhZ2VzLkpwYUZhY2V0V2l6YXJkUGFnZV91c2VyU2VydmVyTGliTGFiZWwsIFNXVC5SQURJTyk7Ci0JCQl1c2VTZXJ2ZXJMaWJCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoCi0JCQkJCW5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQkJd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCQltb2RlbC5zZXRCb29sZWFuUHJvcGVydHkoVVNFX1NFUlZFUl9KUEFfSU1QTEVNRU5UQVRJT04sIHRydWUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJKTsKLQkJCQotCQkJc3BlY2lmeUxpYkJ1dHRvbiA9IGNyZWF0ZUJ1dHRvbihncm91cCwgMSwgSnB0VWlNZXNzYWdlcy5KcGFGYWNldFdpemFyZFBhZ2Vfc3BlY2lmeUxpYkxhYmVsLCBTV1QuUkFESU8pOwotCQkJc3BlY2lmeUxpYkJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcigKLQkJCQkJbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCQl3aWRnZXRTZWxlY3RlZChlKTsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJCW1vZGVsLnNldEJvb2xlYW5Qcm9wZXJ0eShVU0VfU0VSVkVSX0pQQV9JTVBMRU1FTlRBVElPTiwgZmFsc2UpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJKTsKLQkJCQotCQkJanBhTGliQ29tYm8gPSBjcmVhdGVDb21ibyhncm91cCwgMSwgdHJ1ZSk7Ci0JCQlzeW5jaEhlbHBlci5zeW5jaENvbWJvKGpwYUxpYkNvbWJvLCBKUEFfTElCUkFSWSwgbnVsbCk7Ci0JCQkKLQkJCW1vZGVsLmFkZExpc3RlbmVyKAotCQkJCQluZXcgSURhdGFNb2RlbExpc3RlbmVyKCkgewotCQkJCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKERhdGFNb2RlbEV2ZW50IGV2ZW50KSB7Ci0JCQkJCQkJaWYgKFVTRV9TRVJWRVJfSlBBX0lNUExFTUVOVEFUSU9OLmVxdWFscyhldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSkpIHsKLQkJCQkJCQkJYm9vbGVhbiB1c2VTZXJ2ZXJMaWIgPSAoQm9vbGVhbikgZXZlbnQuZ2V0UHJvcGVydHkoKTsKLQkJCQkJCQkJdXNlU2VydmVyTGliQnV0dG9uLnNldFNlbGVjdGlvbih1c2VTZXJ2ZXJMaWIpOwotCQkJCQkJCQlzcGVjaWZ5TGliQnV0dG9uLnNldFNlbGVjdGlvbighIHVzZVNlcnZlckxpYik7Ci0JCQkJCQkJCWpwYUxpYkNvbWJvLnNldEVuYWJsZWQoISB1c2VTZXJ2ZXJMaWIpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCSk7Ci0JCQkKLQkJCWpwYVByZWZzTGluayA9IG5ldyBMaW5rKGdyb3VwLCBTV1QuTk9ORSk7Ci0JCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkVORCwgR3JpZERhdGEuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpOwotCQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQlqcGFQcmVmc0xpbmsuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCWpwYVByZWZzTGluay5zZXRUZXh0KEpwdFVpTWVzc2FnZXMuSnBhRmFjZXRXaXphcmRQYWdlX2pwYVByZWZzTGluayk7Ci0JCQlqcGFQcmVmc0xpbmsuYWRkU2VsZWN0aW9uTGlzdGVuZXIoCi0JCQkJbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCXByb21wdFRvQ29uZmlnSnBhUHJlZnMoKTsJCQkJCi0JCQkJCX0KLQkJCQl9Ci0JCQkpOwotCQkJCi0JCQl1c2VyTGlic0xpbmsgPSBuZXcgTGluayhncm91cCwgU1dULk5PTkUpOwotCQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5FTkQsIEdyaWREYXRhLkNFTlRFUiwgZmFsc2UsIGZhbHNlKTsKLQkJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJdXNlckxpYnNMaW5rLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQl1c2VyTGlic0xpbmsuc2V0VGV4dChKcHRVaU1lc3NhZ2VzLkpwYUZhY2V0V2l6YXJkUGFnZV91c2VyTGlic0xpbmspOwotCQkJdXNlckxpYnNMaW5rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKAotCQkJCW5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlwcm9tcHRUb0NvbmZpZ1VzZXJMaWJyYXJpZXMoKTsJCQkJCi0JCQkJCX0KLQkJCQl9Ci0JCQkpOwotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgcHJvbXB0VG9Db25maWdKcGFQcmVmcygpIHsKLQkJCVByZWZlcmVuY2VEaWFsb2cgZGxnID0gCi0JCQkJUHJlZmVyZW5jZXNVdGlsLmNyZWF0ZVByZWZlcmVuY2VEaWFsb2dPbigKLQkJCQkJZ2V0U2hlbGwoKSwgCi0JCQkJCUpwYVByZWZlcmVuY2VQYWdlLklELAotCQkJCQluZXcgU3RyaW5nW10ge0pwYVByZWZlcmVuY2VQYWdlLklEfSwKLQkJCQkJbnVsbCk7Ci0JCQlkbGcub3BlbigpOwotCQkJbW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoSlBBX0xJQlJBUlksIElEYXRhTW9kZWwuVkFMSURfVkFMVUVTX0NIRyk7Ci0JCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShKUEFfTElCUkFSWSwgSURhdGFNb2RlbC5ERUZBVUxUX0NIRyk7Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCBwcm9tcHRUb0NvbmZpZ1VzZXJMaWJyYXJpZXMoKSB7Ci0JCQlQcmVmZXJlbmNlRGlhbG9nIGRsZyA9IAotCQkJCVByZWZlcmVuY2VzVXRpbC5jcmVhdGVQcmVmZXJlbmNlRGlhbG9nT24oCi0JCQkJCWdldFNoZWxsKCksIAotCQkJCQlVc2VyTGlicmFyeVByZWZlcmVuY2VQYWdlLklELAotCQkJCQluZXcgU3RyaW5nW10ge1VzZXJMaWJyYXJ5UHJlZmVyZW5jZVBhZ2UuSUR9LAotCQkJCQludWxsKTsKLQkJCWRsZy5vcGVuKCk7Ci0JCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShKUEFfTElCUkFSWSwgSURhdGFNb2RlbC5WQUxJRF9WQUxVRVNfQ0hHKTsKLQkJfQotCX0KLQkKLQkKLQlwcml2YXRlIGZpbmFsIGNsYXNzIFBlcnNpc3RlbnRDbGFzc01hbmFnZW1lbnRHcm91cAotCXsKLQkJcHJpdmF0ZSBmaW5hbCBCdXR0b24gZGlzY292ZXJDbGFzc2VzQnV0dG9uOwotCQkKLQkJcHJpdmF0ZSBmaW5hbCBCdXR0b24gbGlzdENsYXNzZXNCdXR0b247Ci0JCQotCQkKLQkJcHVibGljIFBlcnNpc3RlbnRDbGFzc01hbmFnZW1lbnRHcm91cChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCQlHcm91cCBncm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCWdyb3VwLnNldFRleHQoSnB0VWlNZXNzYWdlcy5KcGFGYWNldFdpemFyZFBhZ2VfcGVyc2lzdGVudENsYXNzTWFuYWdlbWVudExhYmVsKTsKLQkJCWdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJCWdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChncm91cCwgSUpwYUhlbHBDb250ZXh0SWRzLk5FV19KUEFfUFJPSkVDVF9DT05URU5UX1BBR0VfQ0xBU1NQQVRIKTsKLQkJCQotCQkJZGlzY292ZXJDbGFzc2VzQnV0dG9uID0gY3JlYXRlQnV0dG9uKGdyb3VwLCAxLCBKcHRVaU1lc3NhZ2VzLkpwYUZhY2V0V2l6YXJkUGFnZV9kaXNjb3ZlckNsYXNzZXNCdXR0b24sIFNXVC5SQURJTyk7Ci0JCQlkaXNjb3ZlckNsYXNzZXNCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoCi0JCQkJbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCQl3aWRnZXRTZWxlY3RlZChlKTsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJCW1vZGVsLnNldEJvb2xlYW5Qcm9wZXJ0eShESVNDT1ZFUl9BTk5PVEFURURfQ0xBU1NFUywgdHJ1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkpOwotCQkJCi0JCQlsaXN0Q2xhc3Nlc0J1dHRvbiA9IGNyZWF0ZUJ1dHRvbihncm91cCwgMSwgSnB0VWlNZXNzYWdlcy5KcGFGYWNldFdpemFyZFBhZ2VfbGlzdENsYXNzZXNCdXR0b24sIFNXVC5SQURJTyk7Ci0JCQlsaXN0Q2xhc3Nlc0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcigKLQkJCQluZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJCXdpZGdldFNlbGVjdGVkKGUpOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQkJbW9kZWwuc2V0Qm9vbGVhblByb3BlcnR5KERJU0NPVkVSX0FOTk9UQVRFRF9DTEFTU0VTLCBmYWxzZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkpOwotCQkJCi0JCQltb2RlbC5hZGRMaXN0ZW5lcigKLQkJCQkJbmV3IElEYXRhTW9kZWxMaXN0ZW5lcigpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChEYXRhTW9kZWxFdmVudCBldmVudCkgewotCQkJCQkJCWlmIChESVNDT1ZFUl9BTk5PVEFURURfQ0xBU1NFUy5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpKSB7Ci0JCQkJCQkJCWJvb2xlYW4gZGlzY292ZXJDbGFzc2VzID0gKEJvb2xlYW4pIGV2ZW50LmdldFByb3BlcnR5KCk7Ci0JCQkJCQkJCWRpc2NvdmVyQ2xhc3Nlc0J1dHRvbi5zZXRTZWxlY3Rpb24oZGlzY292ZXJDbGFzc2VzKTsKLQkJCQkJCQkJbGlzdENsYXNzZXNCdXR0b24uc2V0U2VsZWN0aW9uKCEgZGlzY292ZXJDbGFzc2VzKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkpOwotCQl9Ci0JfQotCQotCQotCXByaXZhdGUgZmluYWwgY2xhc3MgT3JtWG1sR3JvdXAKLQl7Ci0JCXByaXZhdGUgZmluYWwgQnV0dG9uIGNyZWF0ZU9ybVhtbEJ1dHRvbjsKLQkJCi0JCQotCQlwdWJsaWMgT3JtWG1sR3JvdXAoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQkJQ29tcG9zaXRlIGdyb3VwID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCWdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJCWdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChncm91cCwgSUpwYUhlbHBDb250ZXh0SWRzLkRJQUxPR19DUkVBVEVfT1JNKTsKLQkJCQotCQkJY3JlYXRlT3JtWG1sQnV0dG9uID0gbmV3IEJ1dHRvbihncm91cCwgU1dULkNIRUNLKTsKLQkJCWNyZWF0ZU9ybVhtbEJ1dHRvbi5zZXRUZXh0KEpwdFVpTWVzc2FnZXMuSnBhRmFjZXRXaXphcmRQYWdlX2NyZWF0ZU9ybVhtbEJ1dHRvbik7Ci0JCQljcmVhdGVPcm1YbWxCdXR0b24uc2V0U2VsZWN0aW9uKG1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShDUkVBVEVfT1JNX1hNTCkpOwotCQkJY3JlYXRlT3JtWG1sQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKAotCQkJCQluZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJCXdpZGdldFNlbGVjdGVkKGUpOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQkJbW9kZWwuc2V0Qm9vbGVhblByb3BlcnR5KENSRUFURV9PUk1fWE1MLCBjcmVhdGVPcm1YbWxCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvTmV3SnBhUHJvamVjdEZpcnN0UGFnZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9OZXdKcGFQcm9qZWN0Rmlyc3RQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5OWQyZWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9OZXdKcGFQcm9qZWN0Rmlyc3RQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqICBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiAgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiAgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSUpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLnByb2plY3QuZmFjZXQuVXRpbGl0eVByb2plY3RGaXJzdFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi1wdWJsaWMgY2xhc3MgTmV3SnBhUHJvamVjdEZpcnN0UGFnZSBleHRlbmRzIFV0aWxpdHlQcm9qZWN0Rmlyc3RQYWdlIAotewotCXB1YmxpYyBOZXdKcGFQcm9qZWN0Rmlyc3RQYWdlKElEYXRhTW9kZWwgZGF0YU1vZGVsLCBTdHJpbmcgcGFnZU5hbWUpIHsKLQkJc3VwZXIoZGF0YU1vZGVsLCBwYWdlTmFtZSk7Ci0JCXNldFRpdGxlKEpwdFVpTWVzc2FnZXMuTmV3SnBhUHJvamVjdFdpemFyZF9maXJzdFBhZ2VfdGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihKcHRVaU1lc3NhZ2VzLk5ld0pwYVByb2plY3RXaXphcmRfZmlyc3RQYWdlX2Rlc2NyaXB0aW9uKTsKLQkJc2V0SW5mb3BvcElEKElKcGFIZWxwQ29udGV4dElkcy5ORVdfSlBBX1BST0pFQ1QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3dpemFyZHMvTmV3SnBhUHJvamVjdFdpemFyZC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9OZXdKcGFQcm9qZWN0V2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1ZjgzYTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwvd2l6YXJkcy9OZXdKcGFQcm9qZWN0V2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqICBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiAgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiAgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaUljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS51aS5wcm9qZWN0LmZhY2V0LlV0aWxpdHlQcm9qZWN0V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3RUZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLQotcHVibGljIGNsYXNzIE5ld0pwYVByb2plY3RXaXphcmQgZXh0ZW5kcyBVdGlsaXR5UHJvamVjdFdpemFyZCB7Ci0KLQlwdWJsaWMgTmV3SnBhUHJvamVjdFdpemFyZCgpIHsKLQkJc3VwZXIoKTsKLQkJc2V0V2luZG93VGl0bGUoSnB0VWlNZXNzYWdlcy5OZXdKcGFQcm9qZWN0V2l6YXJkX3RpdGxlKTsKLQl9Ci0KLQlwdWJsaWMgTmV3SnBhUHJvamVjdFdpemFyZChJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQkJc2V0V2luZG93VGl0bGUoSnB0VWlNZXNzYWdlcy5OZXdKcGFQcm9qZWN0V2l6YXJkX3RpdGxlKTsKLQl9Ci0JCi0JLy8gVE9ETyAtIHdoZW4gd2UgaGF2ZSBhIGRhdGEgbW9kZWwgdG8gYWRkCi0vLwlwcm90ZWN0ZWQgSURhdGFNb2RlbCBjcmVhdGVEYXRhTW9kZWwoKSB7Ci0vLwkJcmV0dXJuIERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBVdGlsaXR5UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0vLwl9Ci0JCi0JcHJvdGVjdGVkIEltYWdlRGVzY3JpcHRvciBnZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIEpwdFVpUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlRGVzY3JpcHRvcihKcHRVaUljb25zLkpQQV9XSVpfQkFOTkVSKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElGYWNldGVkUHJvamVjdFRlbXBsYXRlIGdldFRlbXBsYXRlKCkgewotCQlyZXR1cm4gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0VGVtcGxhdGUoImpwdC5qcGEudGVtcGxhdGUiKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElXaXphcmRQYWdlIGNyZWF0ZUZpcnN0UGFnZSgpIHsKLQkJcmV0dXJuIG5ldyBOZXdKcGFQcm9qZWN0Rmlyc3RQYWdlKG1vZGVsLCAiZmlyc3QucGFnZSIpOyAvLyROT04tTkxTLTEkIAotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEZpbmFsUGVyc3BlY3RpdmVJRCgpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS5qcHQudWkuanBhUGVyc3BlY3RpdmUiOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3htbC9KcHRVaVhtbE1lc3NhZ2VzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC94bWwvSnB0VWlYbWxNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjgwNGRkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3htbC9KcHRVaVhtbE1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqICBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiAgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiAgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnhtbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBKcHRVaVhtbE1lc3NhZ2VzIAotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJqcHRfdWlfeG1sIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbnRUeXBlUGFnZV9qYXZhQ2xhc3NMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW50VHlwZVBhZ2VfTWV0YWRhdGFDb21wbGV0ZUxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbnRUeXBlUGFnZV9BY2Nlc3NMYWJlbDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YVNlY3Rpb25fU2NoZW1hRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YVNlY3Rpb25fQ2F0YWxvZ0RlZmF1bHQ7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVudEF0dHJpYnV0ZVBhZ2VfamF2YUF0dHJpYnV0ZUxhYmVsOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTEVudGl0eU1hcHBpbmdzUGFnZV9YbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZUNoZWNrQm94OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTEVudGl0eU1hcHBpbmdzUGFnZV9DYXNjYWRlUGVyc2lzdENoZWNrQm94OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTEVudGl0eU1hcHBpbmdzUGFnZV9QZXJzaXN0ZW5jZVVuaXRTZWN0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTEVudGl0eU1hcHBpbmdzUGFnZV9TY2hlbWFEZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTEVudGl0eU1hcHBpbmdzUGFnZV9TY2hlbWFOb0RlZmF1bHRTcGVjaWZpZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MRW50aXR5TWFwcGluZ3NQYWdlX0NhdGFsb2dEZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTEVudGl0eU1hcHBpbmdzUGFnZV9DYXRhbG9nTm9EZWZhdWx0U3BlY2lmaWVkOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhtbFNjaGVtYUNob29zZXJfU2NoZW1hQ2hvb3NlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYbWxDYXRhbG9nQ2hvb3Nlcl9DYXRhbG9nQ2hvb3NlcjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhtbEphdmFDbGFzc0Nob29zZXJfWG1sSmF2YUNsYXNzRGlhbG9nX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhtbEphdmFDbGFzc0Nob29zZXJfWG1sSmF2YUNsYXNzRGlhbG9nX21lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWG1sUGFja2FnZUNob29zZXJfUGFja2FnZURpYWxvZ190aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYbWxQYWNrYWdlQ2hvb3Nlcl9QYWNrYWdlRGlhbG9nX21lc3NhZ2U7IAotCQotCQotCXN0YXRpYyB7Ci0JCS8vIGluaXRpYWxpemUgcmVzb3VyY2UgYnVuZGxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEpwdFVpWG1sTWVzc2FnZXMuY2xhc3MpOwotCX0KLQkKLQlwcml2YXRlIEpwdFVpWG1sTWVzc2FnZXMoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3htbC9kZXRhaWxzL0FjY2Vzc1R5cGVDb21ib1ZpZXdlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwveG1sL2RldGFpbHMvQWNjZXNzVHlwZUNvbWJvVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1YWZiYTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwveG1sL2RldGFpbHMvQWNjZXNzVHlwZUNvbWJvVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC54bWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5BY2Nlc3NUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLkluaGVyaXRhbmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5CYXNlSnBhQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkNDb21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBBY2Nlc3NUeXBlQ29tYm9WaWV3ZXIgZXh0ZW5kcyBCYXNlSnBhQ29udHJvbGxlcgotewotCXByaXZhdGUgQWNjZXNzSG9sZGVyIGFjY2Vzc0hvbGRlcjsKLQlwcml2YXRlIEFkYXB0ZXIgYWNjZXNzSG9sZGVyTGlzdGVuZXI7Ci0JCi0JcHJpdmF0ZSBDQ29tYm9WaWV3ZXIgY29tYm9WaWV3ZXI7Ci0KLQotCXB1YmxpYyBBY2Nlc3NUeXBlQ29tYm9WaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgQ29tbWFuZFN0YWNrIHRoZUNvbW1hbmRTdGFjaywgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlzdXBlcihwYXJlbnQsIHRoZUNvbW1hbmRTdGFjaywgd2lkZ2V0RmFjdG9yeSk7Ci0JCWJ1aWxkQWNjZXNzSG9sZGVyTGlzdGVuZXIoKTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQWNjZXNzSG9sZGVyTGlzdGVuZXIoKSB7Ci0JCXRoaXMuYWNjZXNzSG9sZGVyTGlzdGVuZXIgPSBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJCQlhY2Nlc3NIb2xkZXJDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGJ1aWxkV2lkZ2V0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ0NvbWJvIGNvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhwYXJlbnQpOwotCQl0aGlzLmNvbWJvVmlld2VyID0gbmV3IENDb21ib1ZpZXdlcihjb21ibyk7Ci0JCXRoaXMuY29tYm9WaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihidWlsZEFjY2Vzc1R5cGVMYWJlbFByb3ZpZGVyKCkpOwotCQl0aGlzLmNvbWJvVmlld2VyLmFkZChBY2Nlc3NUeXBlLlZBTFVFUy50b0FycmF5KCkpOwotCQkKLQkJdGhpcy5jb21ib1ZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCUFjY2Vzc1R5cGVDb21ib1ZpZXdlci50aGlzLmFjY2Vzc1R5cGVTZWxlY3Rpb25DaGFuZ2VkKGV2ZW50LmdldFNlbGVjdGlvbigpKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUJhc2VMYWJlbFByb3ZpZGVyIGJ1aWxkQWNjZXNzVHlwZUxhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJaWYgKGVsZW1lbnQgPT0gQWNjZXNzVHlwZS5ERUZBVUxUKSB7Ci0JCQkJCXJldHVybiBKcHRVaU1hcHBpbmdzTWVzc2FnZXMuQWNjZXNzVHlwZUNvbWJvX2RlZmF1bHQ7Ci0JCQkJfQotCQkJCXJldHVybiBzdXBlci5nZXRUZXh0KGVsZW1lbnQpOwotCQkJfQotCQl9OwotCX0KLQkKLQl2b2lkIGFjY2Vzc1R5cGVTZWxlY3Rpb25DaGFuZ2VkKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJQWNjZXNzVHlwZSBhY2Nlc3MgPSAoQWNjZXNzVHlwZSkgKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCWlmICggISB0aGlzLmFjY2Vzc0hvbGRlci5nZXRBY2Nlc3MoKS5lcXVhbHMoYWNjZXNzKSkgewotCQkJCXRoaXMuYWNjZXNzSG9sZGVyLnNldEFjY2VzcyhhY2Nlc3MpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFjY2Vzc0hvbGRlckNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlpZiAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChhY2Nlc3NIb2xkZXIuZmVhdHVyZUNsYXNzKCkpID09IAotCQkJCXRoaXMuYWNjZXNzSG9sZGVyLmZlYXR1cmVJZCgpKSB7Ci0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMoCi0JCQkJbmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlwb3B1bGF0ZSgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTGlzdGVuZXJzKCkgewotCQlpZiAodGhpcy5hY2Nlc3NIb2xkZXIgIT0gbnVsbCAmJiB0aGlzLmFjY2Vzc0hvbGRlci53cmFwcGVkT2JqZWN0KCkgIT0gbnVsbCkgewotCQkJdGhpcy5hY2Nlc3NIb2xkZXIud3JhcHBlZE9iamVjdCgpLmVBZGFwdGVycygpLmFkZCh0aGlzLmFjY2Vzc0hvbGRlckxpc3RlbmVyKTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VMaXN0ZW5lcnMoKSB7Ci0JCWlmICh0aGlzLmFjY2Vzc0hvbGRlciAhPSBudWxsICYmIHRoaXMuYWNjZXNzSG9sZGVyLndyYXBwZWRPYmplY3QoKSAhPSBudWxsKSB7Ci0JCQl0aGlzLmFjY2Vzc0hvbGRlci53cmFwcGVkT2JqZWN0KCkuZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMuYWNjZXNzSG9sZGVyTGlzdGVuZXIpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBmaW5hbCB2b2lkIHBvcHVsYXRlKEFjY2Vzc0hvbGRlciBhY2Nlc3NIb2xkZXIpIHsKLQkJc3VwZXIucG9wdWxhdGUoYWNjZXNzSG9sZGVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkb1BvcHVsYXRlKEVPYmplY3Qgb2JqKSB7Ci0JCXRoaXMuYWNjZXNzSG9sZGVyID0gKEFjY2Vzc0hvbGRlcikgb2JqOwotCQlwb3B1bGF0ZUNvbWJvKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvUG9wdWxhdGUoKSB7Ci0JCXBvcHVsYXRlQ29tYm8oKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlQ29tYm8oKSB7Ci0JCWlmICh0aGlzLmFjY2Vzc0hvbGRlci53cmFwcGVkT2JqZWN0KCkgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlBY2Nlc3NUeXBlIGFjY2VzcyA9IHRoaXMuYWNjZXNzSG9sZGVyLmdldEFjY2VzcygpOwotCQkKLQkJaWYgKCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRoaXMuY29tYm9WaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpICE9IGFjY2VzcykgewotCQkJdGhpcy5jb21ib1ZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oYWNjZXNzKSk7Ci0JCX0KLQl9Ci0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCkgewotCQlyZXR1cm4gdGhpcy5jb21ib1ZpZXdlci5nZXRDb21ibygpOwotCX0KLQkKLQkvKioKLQkgKiBBbiBpbnRlcmZhY2UgdG8gd3JhcCBhbiBvYmplY3QgdGhhdCBzdXBwb3J0cyBhY2Nlc3NUeXBlCi0JICogQW4gb2JqZWN0IG9mIHRoaXMgdHlwZSBtdXN0IGJlIHBhc3NlZCBpbiB0byBwb3B1bGF0ZShFT2JqZWN0KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIEFjY2Vzc0hvbGRlciBleHRlbmRzIEVPYmplY3QgewotCQkvKioKLQkJICogUmV0dXJuIHRoZSBBY2Nlc3NUeXBlIGZyb20gdGhlIHdyYXBwZWQgb2JqZWN0Ci0JCSAqIEByZXR1cm4KLQkJICovCi0JCUFjY2Vzc1R5cGUgZ2V0QWNjZXNzKCk7Ci0JCQotCQkvKioKLQkJICogU2V0IHRoZSBBY2Nlc3NUeXBlIG9uIHRoZSB3cmFwcGVkIG9iamVjdAotCQkgKiBAcGFyYW0gYWNjZXNzVHlwZQotCQkgKi8KLQkJdm9pZCBzZXRBY2Nlc3MoQWNjZXNzVHlwZSBhY2Nlc3NUeXBlKTsKLQkJCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIENsYXNzIG9mIHRoZSB3cmFwcGVkIG9iamVjdAotCQkgKiBAcmV0dXJuCi0JCSAqLwotCQlDbGFzcyBmZWF0dXJlQ2xhc3MoKTsKLQkJCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIGZlYXR1cmUgaWQgb2YgYWNjZXNzVHlwZSBvbiB0aGUgd3JhcHBlZCBvYmplY3QKLQkJICogQHJldHVybgotCQkgKi8KLQkJaW50IGZlYXR1cmVJZCgpOwotCQkKLQkJLyoqCi0JCSAqIFRoZSB3cmFwcGVkIEVPYmplY3QgdGhhdCB0aGUgYWNjZXNzVHlwZSBpcyBzdG9yZWQgb24KLQkJICogQHJldHVybgotCQkgKi8KLQkJRU9iamVjdCB3cmFwcGVkT2JqZWN0KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwveG1sL2RldGFpbHMvQ2FzY2FkZVBlcnNpc3RDaGVja0JveC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwveG1sL2RldGFpbHMvQ2FzY2FkZVBlcnNpc3RDaGVja0JveC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzIwNzlhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3htbC9kZXRhaWxzL0Nhc2NhZGVQZXJzaXN0Q2hlY2tCb3guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqICBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiAgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiAgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnhtbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQub3JtLk9ybVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5vcm0uUGVyc2lzdGVuY2VVbml0RGVmYXVsdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQmFzZUpwYUNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnhtbC5KcHRVaVhtbE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgQ2FzY2FkZVBlcnNpc3RDaGVja0JveCBleHRlbmRzIEJhc2VKcGFDb250cm9sbGVyCi17Ci0JcHJpdmF0ZSBQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0czsKLQlwcml2YXRlIEFkYXB0ZXIgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHNMaXN0ZW5lcjsKLQkKLQlwcml2YXRlIEJ1dHRvbiBidXR0b247Ci0KLQotCXB1YmxpYyBDYXNjYWRlUGVyc2lzdENoZWNrQm94KENvbXBvc2l0ZSBwYXJlbnQsIENvbW1hbmRTdGFjayB0aGVDb21tYW5kU3RhY2ssIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJc3VwZXIocGFyZW50LCB0aGVDb21tYW5kU3RhY2ssIHdpZGdldEZhY3RvcnkpOwotCQlidWlsZFBlcmlzdGVuY2VVbml0RGVmYXVsdHNMaXN0ZW5lcigpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYnVpbGRQZXJpc3RlbmNlVW5pdERlZmF1bHRzTGlzdGVuZXIoKSB7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0RGVmYXVsdHNMaXN0ZW5lciA9IG5ldyBBZGFwdGVySW1wbCgpIHsKLQkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkJCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzQ2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJfQotCQl9OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBidWlsZFdpZGdldChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMuYnV0dG9uID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1dHRvbigKLQkJCQkJCXBhcmVudCwgCi0JCQkJCQlKcHRVaVhtbE1lc3NhZ2VzLlhNTEVudGl0eU1hcHBpbmdzUGFnZV9DYXNjYWRlUGVyc2lzdENoZWNrQm94LAotCQkJCQkJU1dULkNIRUNLKTsKLQkJCi0JCXRoaXMuYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJQ2FzY2FkZVBlcnNpc3RDaGVja0JveC50aGlzLmNhc2NhZGVQZXJzaXN0U2VsZWN0aW9uQ2hhbmdlZCgpOwotCQkJfQotCQkKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJQ2FzY2FkZVBlcnNpc3RDaGVja0JveC50aGlzLmNhc2NhZGVQZXJzaXN0U2VsZWN0aW9uQ2hhbmdlZCgpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0Jdm9pZCBjYXNjYWRlUGVyc2lzdFNlbGVjdGlvbkNoYW5nZWQoKSB7Ci0JCWJvb2xlYW4gY2FzY2FkZVBlcnNpc3QgPSB0aGlzLmJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHRoaXMucGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuaXNDYXNjYWRlUGVyc2lzdCgpICE9IGNhc2NhZGVQZXJzaXN0KSB7Ci0JCQl0aGlzLnBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldENhc2NhZGVQZXJzaXN0KGNhc2NhZGVQZXJzaXN0KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c0NoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlpZiAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5jbGFzcykgPT0gCi0JCQkJT3JtUGFja2FnZS5QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19DQVNDQURFX1BFUlNJU1QpIHsKLQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYygKLQkJCQluZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCXBvcHVsYXRlKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VMaXN0ZW5lcnMoKSB7Ci0JCWlmICh0aGlzLnBlcnNpc3RlbmNlVW5pdERlZmF1bHRzICE9IG51bGwpIHsKLQkJCXRoaXMucGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZUFkYXB0ZXJzKCkuYWRkKHRoaXMucGVyc2lzdGVuY2VVbml0RGVmYXVsdHNMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTGlzdGVuZXJzKCkgewotCQlpZiAodGhpcy5wZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyAhPSBudWxsKSB7Ci0JCQl0aGlzLnBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzLnBlcnNpc3RlbmNlVW5pdERlZmF1bHRzTGlzdGVuZXIpOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRvUG9wdWxhdGUoRU9iamVjdCBvYmopIHsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IChQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cykgb2JqOwotCQlwb3B1bGF0ZUJ1dHRvbigpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb1BvcHVsYXRlKCkgewotCQlwb3B1bGF0ZUJ1dHRvbigpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVCdXR0b24oKSB7Ci0JCWJvb2xlYW4gY2FzY2FkZVBlcnNpc3QgPSBmYWxzZTsKLQkJaWYgKHRoaXMucGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgIT0gbnVsbCkgewotCQkJY2FzY2FkZVBlcnNpc3QgID0gdGhpcy5wZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5pc0Nhc2NhZGVQZXJzaXN0KCk7Ci0JCX0KLQkJCi0JCWlmICh0aGlzLmJ1dHRvbi5nZXRTZWxlY3Rpb24oKSAhPSBjYXNjYWRlUGVyc2lzdCkgewotCQkJdGhpcy5idXR0b24uc2V0U2VsZWN0aW9uKGNhc2NhZGVQZXJzaXN0KTsKLQkJfQotCX0KLQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKSB7Ci0JCXJldHVybiB0aGlzLmJ1dHRvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC94bWwvZGV0YWlscy9Db21tb25XaWRnZXRzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC94bWwvZGV0YWlscy9Db21tb25XaWRnZXRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZTVjMjEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwveG1sL2RldGFpbHMvQ29tbW9uV2lkZ2V0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC54bWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHMuU3RyaW5nV2l0aERlZmF1bHRDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC54bWwuSnB0VWlYbWxNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBDb21tb25XaWRnZXRzIAotewotCXB1YmxpYyBzdGF0aWMgTGFiZWwgYnVpbGRKYXZhQ2xhc3NMYWJlbChDb21wb3NpdGUgcGFyZW50LCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCUxhYmVsIGxhYmVsID0gd2lkZ2V0RmFjdG9yeS5jcmVhdGVMYWJlbChwYXJlbnQsIEpwdFVpWG1sTWVzc2FnZXMuUGVyc2lzdGVudFR5cGVQYWdlX2phdmFDbGFzc0xhYmVsKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFhtbEphdmFDbGFzc0Nob29zZXIgYnVpbGRKYXZhQ2xhc3NDaG9vc2VyKAotCQkJQ29tcG9zaXRlIHBhcmVudCwgQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjaywgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IFhtbEphdmFDbGFzc0Nob29zZXIocGFyZW50LCBjb21tYW5kU3RhY2ssIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIExhYmVsIGJ1aWxkSmF2YUF0dHJpYnV0ZU5hbWVMYWJlbChDb21wb3NpdGUgcGFyZW50LCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCUxhYmVsIGxhYmVsID0gd2lkZ2V0RmFjdG9yeS5jcmVhdGVMYWJlbChwYXJlbnQsIEpwdFVpWG1sTWVzc2FnZXMuUGVyc2lzdGVudEF0dHJpYnV0ZVBhZ2VfamF2YUF0dHJpYnV0ZUxhYmVsKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFhtbEphdmFBdHRyaWJ1dGVDaG9vc2VyIGJ1aWxkSmF2YUF0dHJpYnV0ZUNob29zZXIoCi0JCQlDb21wb3NpdGUgcGFyZW50LCBDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrLCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgWG1sSmF2YUF0dHJpYnV0ZUNob29zZXIocGFyZW50LCBjb21tYW5kU3RhY2ssIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQkKLQlwdWJsaWMgc3RhdGljIExhYmVsIGJ1aWxkQWNjZXNzTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gd2lkZ2V0RmFjdG9yeS5jcmVhdGVMYWJlbChwYXJlbnQsIEpwdFVpWG1sTWVzc2FnZXMuUGVyc2lzdGVudFR5cGVQYWdlX0FjY2Vzc0xhYmVsKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBBY2Nlc3NUeXBlQ29tYm9WaWV3ZXIgYnVpbGRBY2Nlc3NUeXBlQ29tYm9WaWV3ZXIoCi0JCQlDb21wb3NpdGUgcGFyZW50LCBDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrLCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgQWNjZXNzVHlwZUNvbWJvVmlld2VyKHBhcmVudCwgY29tbWFuZFN0YWNrLCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQkKLQlwdWJsaWMgc3RhdGljIExhYmVsIGJ1aWxkQ2F0YWxvZ0xhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIHdpZGdldEZhY3RvcnkuY3JlYXRlTGFiZWwocGFyZW50LCBKcHRVaVhtbE1lc3NhZ2VzLlhtbENhdGFsb2dDaG9vc2VyX0NhdGFsb2dDaG9vc2VyKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmdXaXRoRGVmYXVsdENob29zZXIgYnVpbGRDYXRhbG9nQ2hvb3NlcigKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIENvbW1hbmRTdGFjayBjb21tYW5kU3RhY2ssIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdXaXRoRGVmYXVsdENob29zZXIocGFyZW50LCBjb21tYW5kU3RhY2ssIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCQotCXB1YmxpYyBzdGF0aWMgTGFiZWwgYnVpbGRTY2hlbWFMYWJlbChDb21wb3NpdGUgcGFyZW50LCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiB3aWRnZXRGYWN0b3J5LmNyZWF0ZUxhYmVsKHBhcmVudCwgSnB0VWlYbWxNZXNzYWdlcy5YbWxTY2hlbWFDaG9vc2VyX1NjaGVtYUNob29zZXIpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZ1dpdGhEZWZhdWx0Q2hvb3NlciBidWlsZFNjaGVtYUNob29zZXIoCi0JCQlDb21wb3NpdGUgcGFyZW50LCBDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrLCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nV2l0aERlZmF1bHRDaG9vc2VyKHBhcmVudCwgY29tbWFuZFN0YWNrLCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQkKLQlwdWJsaWMgc3RhdGljIExhYmVsIGJ1aWxkUGFja2FnZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIHdpZGdldEZhY3RvcnkuY3JlYXRlTGFiZWwocGFyZW50LCAiUGFja2FnZToiKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBYbWxQYWNrYWdlQ2hvb3NlciBidWlsZFhtbFBhY2thZ2VDaG9vc2VyKAotCQkJQ29tcG9zaXRlIHBhcmVudCwgQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjaywgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IFhtbFBhY2thZ2VDaG9vc2VyKHBhcmVudCwgY29tbWFuZFN0YWNrLCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3htbC9kZXRhaWxzL01ldGFEYXRhQ29tcGxldGVDb21ib1ZpZXdlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwveG1sL2RldGFpbHMvTWV0YURhdGFDb21wbGV0ZUNvbWJvVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkOTg3MTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwveG1sL2RldGFpbHMvTWV0YURhdGFDb21wbGV0ZUNvbWJvVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC54bWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50Lm9ybS5Pcm1QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQub3JtLlhtbFR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLkRlZmF1bHRGYWxzZUJvb2xlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSW5oZXJpdGFuY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkJhc2VKcGFDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLndpZGdldHMuQ0NvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLQotcHVibGljIGNsYXNzIE1ldGFEYXRhQ29tcGxldGVDb21ib1ZpZXdlciBleHRlbmRzIEJhc2VKcGFDb250cm9sbGVyCi17Ci0JcHJpdmF0ZSBYbWxUeXBlTWFwcGluZyBtYXBwaW5nOwotCXByaXZhdGUgQWRhcHRlciB0eXBlTWFwcGluZ0xpc3RlbmVyOwotCQotCXByaXZhdGUgQ0NvbWJvVmlld2VyIGNvbWJvVmlld2VyOwotCi0KLQlwdWJsaWMgTWV0YURhdGFDb21wbGV0ZUNvbWJvVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIENvbW1hbmRTdGFjayB0aGVDb21tYW5kU3RhY2ssIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJc3VwZXIocGFyZW50LCB0aGVDb21tYW5kU3RhY2ssIHdpZGdldEZhY3RvcnkpOwotCQlidWlsZFR5cGVNYXBwaW5nTGlzdGVuZXIoKTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkVHlwZU1hcHBpbmdMaXN0ZW5lcigpIHsKLQkJdGhpcy50eXBlTWFwcGluZ0xpc3RlbmVyID0gbmV3IEFkYXB0ZXJJbXBsKCkgewotCQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCQkJdHlwZU1hcHBpbmdDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGJ1aWxkV2lkZ2V0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ0NvbWJvIGNvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhwYXJlbnQpOwotCQl0aGlzLmNvbWJvVmlld2VyID0gbmV3IENDb21ib1ZpZXdlcihjb21ibyk7Ci0JCXRoaXMuY29tYm9WaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihidWlsZExhYmVsUHJvdmlkZXIoKSk7Ci0JCXRoaXMuY29tYm9WaWV3ZXIuYWRkKERlZmF1bHRGYWxzZUJvb2xlYW4uVkFMVUVTLnRvQXJyYXkoKSk7Ci0JCXRoaXMuY29tYm9WaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlNZXRhRGF0YUNvbXBsZXRlQ29tYm9WaWV3ZXIudGhpcy5tZXRhZGF0YUNvbXBsZXRlU2VsZWN0aW9uQ2hhbmdlZChldmVudC5nZXRTZWxlY3Rpb24oKSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQlwcml2YXRlIElCYXNlTGFiZWxQcm92aWRlciBidWlsZExhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJaWYgKGVsZW1lbnQgPT0gRGVmYXVsdEZhbHNlQm9vbGVhbi5ERUZBVUxUKSB7Ci0JCQkJCS8vVE9ETyBuZWVkIHRvIG1vdmUgdGhpcyB0byB0aGUgbW9kZWwsIGRvbid0IHdhbnQgaGFyZGNvZGVkIFN0cmluZwotCQkJCQlyZXR1cm4gTkxTLmJpbmQoSnB0VWlNYXBwaW5nc01lc3NhZ2VzLk1ldGFEYXRhQ29tcGxldGVDb21ib19EZWZhdWx0LCAiRmFsc2UiKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHN1cGVyLmdldFRleHQoZWxlbWVudCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0Jdm9pZCBtZXRhZGF0YUNvbXBsZXRlU2VsZWN0aW9uQ2hhbmdlZChJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCURlZmF1bHRGYWxzZUJvb2xlYW4gbWV0YWRhdGFDb21wbGV0ZSA9IChEZWZhdWx0RmFsc2VCb29sZWFuKSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOwotCQkJaWYgKCAhIHRoaXMubWFwcGluZy5nZXRNZXRhZGF0YUNvbXBsZXRlKCkuZXF1YWxzKG1ldGFkYXRhQ29tcGxldGUpKSB7Ci0JCQkJdGhpcy5tYXBwaW5nLnNldE1ldGFkYXRhQ29tcGxldGUobWV0YWRhdGFDb21wbGV0ZSk7Ci0vLwkJCQl0aGlzLmVkaXRpbmdEb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZSgKLS8vCQkJCQlTZXRDb21tYW5kLmNyZWF0ZSgKLS8vCQkJCQkJdGhpcy5lZGl0aW5nRG9tYWluLAotLy8JCQkJCQl0aGlzLmJhc2ljTWFwcGluZywKLS8vCQkJCQkJT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QmFzaWNNYXBwaW5nX09wdGlvbmFsKCksCi0vLwkJCQkJCW9wdGlvbmFsCi0vLwkJCQkJKQotLy8JCQkJKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB0eXBlTWFwcGluZ0NoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlpZiAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChYbWxUeXBlTWFwcGluZy5jbGFzcykgPT0gCi0JCQkJT3JtUGFja2FnZS5YTUxfVFlQRV9NQVBQSU5HX19NRVRBREFUQV9DT01QTEVURSkgewotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKAotCQkJCW5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJcG9wdWxhdGUoKTsKLQkJCQkJfQotCQkJCX0pOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUxpc3RlbmVycygpIHsKLQkJaWYgKHRoaXMubWFwcGluZyAhPSBudWxsKSB7Ci0JCQl0aGlzLm1hcHBpbmcuZUFkYXB0ZXJzKCkuYWRkKHRoaXMudHlwZU1hcHBpbmdMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTGlzdGVuZXJzKCkgewotCQlpZiAodGhpcy5tYXBwaW5nICE9IG51bGwpIHsKLQkJCXRoaXMubWFwcGluZy5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcy50eXBlTWFwcGluZ0xpc3RlbmVyKTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkb1BvcHVsYXRlKEVPYmplY3Qgb2JqKSB7Ci0JCXRoaXMubWFwcGluZyA9IChYbWxUeXBlTWFwcGluZykgb2JqOwotCQlwb3B1bGF0ZUNvbWJvKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvUG9wdWxhdGUoKSB7Ci0JCXBvcHVsYXRlQ29tYm8oKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlQ29tYm8oKSB7Ci0JCWlmICh0aGlzLm1hcHBpbmcgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlEZWZhdWx0RmFsc2VCb29sZWFuIG1ldGFkYXRhQ29tcGxldGUgPSBtYXBwaW5nLmdldE1ldGFkYXRhQ29tcGxldGUoKTsKLQkJCi0JCWlmICgoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0aGlzLmNvbWJvVmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKSAhPSBtZXRhZGF0YUNvbXBsZXRlKSB7Ci0JCQl0aGlzLmNvbWJvVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihtZXRhZGF0YUNvbXBsZXRlKSk7Ci0JCX0KLQl9Ci0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCkgewotCQlyZXR1cm4gdGhpcy5jb21ib1ZpZXdlci5nZXRDb21ibygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3htbC9kZXRhaWxzL1BlcnNpc3RlbmNlVW5pdE1ldGFkYXRhU2VjdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwveG1sL2RldGFpbHMvUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1M2Q5YzkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwveG1sL2RldGFpbHMvUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC54bWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5YbWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQub3JtLk9ybVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5vcm0uUGVyc2lzdGVuY2VVbml0RGVmYXVsdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5vcm0uUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNJbnRlcm5hbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50Lm9ybS5QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSUpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLkJhc2VKcGFDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzLlN0cmluZ1dpdGhEZWZhdWx0Q2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuZGV0YWlscy5TdHJpbmdXaXRoRGVmYXVsdENob29zZXIuU3RyaW5nSG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC54bWwuSnB0VWlYbWxNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwueG1sLmRldGFpbHMuQWNjZXNzVHlwZUNvbWJvVmlld2VyLkFjY2Vzc0hvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5FeHBhbmRhYmxlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLklXb3JrYmVuY2hIZWxwU3lzdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFTZWN0aW9uIGV4dGVuZHMgQmFzZUpwYUNvbnRyb2xsZXIKLXsKLQkKLQlwcml2YXRlIFNlY3Rpb24gc2VjdGlvbjsKLQlwcml2YXRlIFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlQ2hlY2tCb3ggeG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGVDaGVja0JveDsKLQlwcml2YXRlIFN0cmluZ1dpdGhEZWZhdWx0Q2hvb3NlciB4bWxTY2hlbWFDaG9vc2VyOwotCXByaXZhdGUgU3RyaW5nV2l0aERlZmF1bHRDaG9vc2VyIHhtbENhdGFsb2dDaG9vc2VyOwotCXByaXZhdGUgQWNjZXNzVHlwZUNvbWJvVmlld2VyIGFjY2Vzc0NvbWJvVmlld2VyOwotCXByaXZhdGUgQ2FzY2FkZVBlcnNpc3RDaGVja0JveCBjYXNjYWRlUGVyc2lzdENoZWNrQm94OwotCQotCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YVNlY3Rpb24oQ29tcG9zaXRlIHBhcmVudCwgQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjaywgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlzdXBlcihwYXJlbnQsIGNvbW1hbmRTdGFjaywgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGJ1aWxkV2lkZ2V0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJSVdvcmtiZW5jaEhlbHBTeXN0ZW0gaGVscFN5c3RlbSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpOwotCSAgICB0aGlzLnNlY3Rpb24gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlU2VjdGlvbihwYXJlbnQsIFNXVC5GTEFUIHwgRXhwYW5kYWJsZUNvbXBvc2l0ZS5UV0lTVElFIHwgRXhwYW5kYWJsZUNvbXBvc2l0ZS5USVRMRV9CQVIpOwotCSAgICB0aGlzLnNlY3Rpb24uc2V0VGV4dChKcHRVaVhtbE1lc3NhZ2VzLlhNTEVudGl0eU1hcHBpbmdzUGFnZV9QZXJzaXN0ZW5jZVVuaXRTZWN0aW9uKTsKLQotCQlDb21wb3NpdGUgcGVyc2lzdGVuY2VVbml0Q29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNvbXBvc2l0ZSh0aGlzLnNlY3Rpb24pOwotCQl0aGlzLnNlY3Rpb24uc2V0Q2xpZW50KHBlcnNpc3RlbmNlVW5pdENvbXBvc2l0ZSk7Ci0JCQotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMTsKLQkJcGVyc2lzdGVuY2VVbml0Q29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JICAgIAotCSAgICB0aGlzLnhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlQ2hlY2tCb3ggPSBidWlsZFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlQ2hlY2tCb3gocGVyc2lzdGVuY2VVbml0Q29tcG9zaXRlKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5CRUdJTk5JTkc7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXRoaXMueG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGVDaGVja0JveC5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWhlbHBTeXN0ZW0uc2V0SGVscCh4bWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZUNoZWNrQm94LmdldENvbnRyb2woKSwgSUpwYUhlbHBDb250ZXh0SWRzLkVOVElUWV9PUk1fWE1MKTsKLQkJCi0JCUNvbW1vbldpZGdldHMuYnVpbGRTY2hlbWFMYWJlbChwZXJzaXN0ZW5jZVVuaXRDb21wb3NpdGUsIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCQotCQl0aGlzLnhtbFNjaGVtYUNob29zZXIgPSBDb21tb25XaWRnZXRzLmJ1aWxkU2NoZW1hQ2hvb3NlcihwZXJzaXN0ZW5jZVVuaXRDb21wb3NpdGUsIHRoaXMuY29tbWFuZFN0YWNrLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkJFR0lOTklORzsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXRoaXMueG1sU2NoZW1hQ2hvb3Nlci5nZXRDb21ibygpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQloZWxwU3lzdGVtLnNldEhlbHAoeG1sU2NoZW1hQ2hvb3Nlci5nZXRDb250cm9sKCksIElKcGFIZWxwQ29udGV4dElkcy5FTlRJVFlfT1JNX1NDSEVNQSk7Ci0KLQkJQ29tbW9uV2lkZ2V0cy5idWlsZENhdGFsb2dMYWJlbChwZXJzaXN0ZW5jZVVuaXRDb21wb3NpdGUsIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCQotCQl0aGlzLnhtbENhdGFsb2dDaG9vc2VyID0gQ29tbW9uV2lkZ2V0cy5idWlsZENhdGFsb2dDaG9vc2VyKHBlcnNpc3RlbmNlVW5pdENvbXBvc2l0ZSwgdGhpcy5jb21tYW5kU3RhY2ssIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuQkVHSU5OSU5HOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJdGhpcy54bWxDYXRhbG9nQ2hvb3Nlci5nZXRDb21ibygpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQloZWxwU3lzdGVtLnNldEhlbHAoeG1sQ2F0YWxvZ0Nob29zZXIuZ2V0Q29udHJvbCgpLCBJSnBhSGVscENvbnRleHRJZHMuRU5USVRZX09STV9DQVRBTE9HKTsKLQkJCi0JCUNvbW1vbldpZGdldHMuYnVpbGRBY2Nlc3NMYWJlbChwZXJzaXN0ZW5jZVVuaXRDb21wb3NpdGUsIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCQotCQl0aGlzLmFjY2Vzc0NvbWJvVmlld2VyID0gQ29tbW9uV2lkZ2V0cy5idWlsZEFjY2Vzc1R5cGVDb21ib1ZpZXdlcihwZXJzaXN0ZW5jZVVuaXRDb21wb3NpdGUsIHRoaXMuY29tbWFuZFN0YWNrLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkJFR0lOTklORzsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXRoaXMuYWNjZXNzQ29tYm9WaWV3ZXIuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQloZWxwU3lzdGVtLnNldEhlbHAoYWNjZXNzQ29tYm9WaWV3ZXIuZ2V0Q29udHJvbCgpLCBJSnBhSGVscENvbnRleHRJZHMuRU5USVRZX09STV9BQ0NFU1MpOwotCi0JCi0JICAgIHRoaXMuY2FzY2FkZVBlcnNpc3RDaGVja0JveCA9IGJ1aWxkQ2FzY2FkZVBlcnNpc3RDaGVja0JveChwZXJzaXN0ZW5jZVVuaXRDb21wb3NpdGUpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkJFR0lOTklORzsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJdGhpcy5jYXNjYWRlUGVyc2lzdENoZWNrQm94LmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJaGVscFN5c3RlbS5zZXRIZWxwKGNhc2NhZGVQZXJzaXN0Q2hlY2tCb3guZ2V0Q29udHJvbCgpLCBJSnBhSGVscENvbnRleHRJZHMuRU5USVRZX09STV9DQVNDQURFKTsKLQotCX0KLQkKLQlwcml2YXRlIFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlQ2hlY2tCb3ggYnVpbGRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZUNoZWNrQm94KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZUNoZWNrQm94KHBhcmVudCwgdGhpcy5jb21tYW5kU3RhY2ssIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JfQotCQotCXByaXZhdGUgQ2FzY2FkZVBlcnNpc3RDaGVja0JveCBidWlsZENhc2NhZGVQZXJzaXN0Q2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IENhc2NhZGVQZXJzaXN0Q2hlY2tCb3gocGFyZW50LCB0aGlzLmNvbW1hbmRTdGFjaywgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VMaXN0ZW5lcnMoKSB7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZUxpc3RlbmVycygpIHsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZG9Qb3B1bGF0ZShFT2JqZWN0IG9iaikgewotCQlQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSA9IChQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSkgb2JqOwotCQl0aGlzLnhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlQ2hlY2tCb3gucG9wdWxhdGUocGVyc2lzdGVuY2VVbml0TWV0YWRhdGEpOwotCQlpZiAocGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgIT0gbnVsbCkgewotCQkJdGhpcy5hY2Nlc3NDb21ib1ZpZXdlci5wb3B1bGF0ZShuZXcgTXlBY2Nlc3NIb2xkZXIocGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSkpOwotCQkJdGhpcy54bWxTY2hlbWFDaG9vc2VyLnBvcHVsYXRlKG5ldyBTY2hlbWFIb2xkZXIocGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSkpOwotCQkJdGhpcy54bWxDYXRhbG9nQ2hvb3Nlci5wb3B1bGF0ZShuZXcgQ2F0YWxvZ0hvbGRlcihwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpKSk7Ci0JCQl0aGlzLmNhc2NhZGVQZXJzaXN0Q2hlY2tCb3gucG9wdWxhdGUocGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLmFjY2Vzc0NvbWJvVmlld2VyLnBvcHVsYXRlKG5ldyBNeUFjY2Vzc0hvbGRlcihudWxsKSk7CQkJCi0JCQl0aGlzLnhtbFNjaGVtYUNob29zZXIucG9wdWxhdGUobmV3IFNjaGVtYUhvbGRlcihudWxsKSk7CQkJCi0JCQl0aGlzLnhtbENhdGFsb2dDaG9vc2VyLnBvcHVsYXRlKG5ldyBDYXRhbG9nSG9sZGVyKG51bGwpKTsJCQkKLQkJCXRoaXMuY2FzY2FkZVBlcnNpc3RDaGVja0JveC5wb3B1bGF0ZShudWxsKTsJCQkKLQkJfQotCX0KLQlwcml2YXRlIGNsYXNzIE15QWNjZXNzSG9sZGVyIGV4dGVuZHMgWG1sRU9iamVjdCBpbXBsZW1lbnRzIEFjY2Vzc0hvbGRlcnsKLQkJCi0JCXByaXZhdGUgUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNJbnRlcm5hbCBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0czsKLQkJTXlBY2Nlc3NIb2xkZXIoUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHNJbnRlcm5hbCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMucGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSAoUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNJbnRlcm5hbCkgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHNJbnRlcm5hbDsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRBY2Nlc3MoQWNjZXNzVHlwZSBhY2Nlc3NUeXBlKSB7Ci0JCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRBY2Nlc3MoYWNjZXNzVHlwZSk7Ci0JCX0KLQkKLQkJcHVibGljIEFjY2Vzc1R5cGUgZ2V0QWNjZXNzKCkgewotCQkJcmV0dXJuIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldEFjY2VzcygpOwotCQl9Ci0JCQotCQlwdWJsaWMgQ2xhc3MgZmVhdHVyZUNsYXNzKCkgewotCQkJcmV0dXJuIFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmNsYXNzOwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGZlYXR1cmVJZCgpIHsKLQkJCXJldHVybiBPcm1QYWNrYWdlLlBFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0FDQ0VTUzsKLQkJfQotCQkKLQkJcHVibGljIEVPYmplY3Qgd3JhcHBlZE9iamVjdCgpIHsKLQkJCXJldHVybiB0aGlzLnBlcnNpc3RlbmNlVW5pdERlZmF1bHRzOwotCQl9Ci0JfQotCQotCXByaXZhdGUgY2xhc3MgU2NoZW1hSG9sZGVyIGV4dGVuZHMgWG1sRU9iamVjdCBpbXBsZW1lbnRzIFN0cmluZ0hvbGRlciB7Ci0JCXByaXZhdGUgUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHM7Ci0JCVNjaGVtYUhvbGRlcihQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cykgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMucGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0czsKLQkJfQotCQkKLQkJcHVibGljIENsYXNzIGZlYXR1cmVDbGFzcygpIHsKLQkJCXJldHVybiBQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5jbGFzczsKLQkJfQotCQkKLQkJcHVibGljIGludCBmZWF0dXJlSWQoKSB7Ci0JCQlyZXR1cm4gT3JtUGFja2FnZS5QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19TQ0hFTUE7Ci0JCX0KLQkJCi0JCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzRGVmYXVsdCgpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJcHVibGljIGludCBkZWZhdWx0RmVhdHVyZUlkKCkgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZGVmYXVsdEl0ZW0oKSB7Ci0JCQlyZXR1cm4gSnB0VWlYbWxNZXNzYWdlcy5QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YVNlY3Rpb25fU2NoZW1hRGVmYXVsdDsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXRTdHJpbmcoKSB7Ci0JCQlyZXR1cm4gdGhpcy5wZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTY2hlbWEoKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgc2V0U3RyaW5nKFN0cmluZyBuZXdTY2hlbWEpIHsKLQkJCXRoaXMucGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0U2NoZW1hKG5ld1NjaGVtYSk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBFT2JqZWN0IHdyYXBwZWRPYmplY3QoKSB7Ci0JCQlyZXR1cm4gdGhpcy5wZXJzaXN0ZW5jZVVuaXREZWZhdWx0czsKLQkJfQotCX0KLQkKLQlwcml2YXRlIGNsYXNzIENhdGFsb2dIb2xkZXIgZXh0ZW5kcyBYbWxFT2JqZWN0IGltcGxlbWVudHMgU3RyaW5nSG9sZGVyIHsKLQkJcHJpdmF0ZSBQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0czsKLQkJQ2F0YWxvZ0hvbGRlcihQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cykgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMucGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0czsKLQkJfQotCQkKLQkJcHVibGljIENsYXNzIGZlYXR1cmVDbGFzcygpIHsKLQkJCXJldHVybiBQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5jbGFzczsKLQkJfQotCQkKLQkJcHVibGljIGludCBmZWF0dXJlSWQoKSB7Ci0JCQlyZXR1cm4gT3JtUGFja2FnZS5QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19DQVRBTE9HOwotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0RlZmF1bHQoKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgZGVmYXVsdEZlYXR1cmVJZCgpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGRlZmF1bHRJdGVtKCkgewotCQkJcmV0dXJuIEpwdFVpWG1sTWVzc2FnZXMuUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFTZWN0aW9uX0NhdGFsb2dEZWZhdWx0OwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZygpIHsKLQkJCXJldHVybiB0aGlzLnBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldENhdGFsb2coKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgc2V0U3RyaW5nKFN0cmluZyBzdHJpbmcpIHsKLQkJCXRoaXMucGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0Q2F0YWxvZyhzdHJpbmcpOwotCQl9Ci0JCQotCQlwdWJsaWMgRU9iamVjdCB3cmFwcGVkT2JqZWN0KCkgewotCQkJcmV0dXJuIHRoaXMucGVyc2lzdGVuY2VVbml0RGVmYXVsdHM7Ci0JCX0KLQkJCi0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9Qb3B1bGF0ZSgpIHsKLQkJdGhpcy54bWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZUNoZWNrQm94LnBvcHVsYXRlKCk7Ci0JCXRoaXMueG1sU2NoZW1hQ2hvb3Nlci5wb3B1bGF0ZSgpOwotCQl0aGlzLnhtbENhdGFsb2dDaG9vc2VyLnBvcHVsYXRlKCk7Ci0JCXRoaXMuYWNjZXNzQ29tYm9WaWV3ZXIucG9wdWxhdGUoKTsKLQkJdGhpcy5jYXNjYWRlUGVyc2lzdENoZWNrQm94LnBvcHVsYXRlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXRoaXMueG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGVDaGVja0JveC5kaXNwb3NlKCk7Ci0JCXRoaXMueG1sU2NoZW1hQ2hvb3Nlci5kaXNwb3NlKCk7Ci0JCXRoaXMueG1sQ2F0YWxvZ0Nob29zZXIuZGlzcG9zZSgpOwotCQl0aGlzLmFjY2Vzc0NvbWJvVmlld2VyLmRpc3Bvc2UoKTsKLQkJdGhpcy5jYXNjYWRlUGVyc2lzdENoZWNrQm94LmRpc3Bvc2UoKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0JCi0JCi0JcHVibGljIFNlY3Rpb24gZ2V0U2VjdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuc2VjdGlvbjsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpIHsKLQkJcmV0dXJuIGdldFNlY3Rpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3htbC9kZXRhaWxzL1htbERldGFpbHNQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwveG1sL2RldGFpbHMvWG1sRGV0YWlsc1Byb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiY2Q3MGQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwveG1sL2RldGFpbHMvWG1sRGV0YWlsc1Byb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqICBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiAgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiAgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnhtbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSnB0Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50Lm9ybS5JWG1sQ29udGVudE5vZGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5kZXRhaWxzLklKcGFEZXRhaWxzUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5JSnBhRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLQotcHVibGljIGNsYXNzIFhtbERldGFpbHNQcm92aWRlciAKLQlpbXBsZW1lbnRzIElKcGFEZXRhaWxzUHJvdmlkZXIgCi17Ci0JcHVibGljIFhtbERldGFpbHNQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBmaWxlQ29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBKcHRDb3JlUGx1Z2luLk9STV9YTUxfQ09OVEVOVF9UWVBFOwotCX0KLQkKLQlwdWJsaWMgSUpwYURldGFpbHNQYWdlIGJ1aWxkRGV0YWlsc1BhZ2UoCi0JCQlDb21wb3NpdGUgcGFyZW50Q29tcG9zaXRlLCBPYmplY3QgY29udGVudE5vZGVJZCwgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlpZiAoY29udGVudE5vZGVJZC5lcXVhbHMoSVhtbENvbnRlbnROb2Rlcy5FTlRJVFlfTUFQUElOR1NfSUQpKSB7Ci0JCQlyZXR1cm4gbmV3IFhtbEVudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2UocGFyZW50Q29tcG9zaXRlLCB3aWRnZXRGYWN0b3J5KTsKLQkJfQotCQllbHNlIGlmIChjb250ZW50Tm9kZUlkLmVxdWFscyhJWG1sQ29udGVudE5vZGVzLlBFUlNJU1RFTlRfVFlQRV9JRCkpIHsKLQkJCXJldHVybiBuZXcgWG1sUGVyc2lzdGVudFR5cGVEZXRhaWxzUGFnZShwYXJlbnRDb21wb3NpdGUsIHdpZGdldEZhY3RvcnkpOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnROb2RlSWQuZXF1YWxzKElYbWxDb250ZW50Tm9kZXMuUEVSU0lTVEVOVF9BVFRSSUJVVEVfSUQpKSB7Ci0JCQlyZXR1cm4gbmV3IFhtbFBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUGFnZShwYXJlbnRDb21wb3NpdGUsIHdpZGdldEZhY3RvcnkpOwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gbm8gb3AgLi4uIGZvciBub3cKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC94bWwvZGV0YWlscy9YbWxFbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC94bWwvZGV0YWlscy9YbWxFbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3MGJkZTguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwveG1sL2RldGFpbHMvWG1sRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwueG1sLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQmFzaWNDb21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JSnBhQ29udGVudE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuWG1sRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50Lm9ybS5FbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50Lm9ybS5FbnRpdHlNYXBwaW5nc0ludGVybmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQub3JtLk9ybVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLklKcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5CYXNlSnBhRGV0YWlsc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLmRldGFpbHMuU3RyaW5nV2l0aERlZmF1bHRDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5kZXRhaWxzLlN0cmluZ1dpdGhEZWZhdWx0Q2hvb3Nlci5TdHJpbmdIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnhtbC5KcHRVaVhtbE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC54bWwuZGV0YWlscy5BY2Nlc3NUeXBlQ29tYm9WaWV3ZXIuQWNjZXNzSG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLklXb3JrYmVuY2hIZWxwU3lzdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgWG1sRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZSBleHRlbmRzIEJhc2VKcGFEZXRhaWxzUGFnZQotewotCXByaXZhdGUgRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3M7Ci0KLQlwcml2YXRlIFhtbFBhY2thZ2VDaG9vc2VyIHhtbFBhY2thZ2VDaG9vc2VyOwotCQotCXByaXZhdGUgU3RyaW5nV2l0aERlZmF1bHRDaG9vc2VyIHhtbFNjaGVtYUNob29zZXI7Ci0JCi0JcHJpdmF0ZSBTdHJpbmdXaXRoRGVmYXVsdENob29zZXIgeG1sQ2F0YWxvZ0Nob29zZXI7Ci0JCi0JcHJpdmF0ZSBBY2Nlc3NUeXBlQ29tYm9WaWV3ZXIgYWNjZXNzQ29tYm9WaWV3ZXI7Ci0JCi0JcHJpdmF0ZSBQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YVNlY3Rpb24gcGVyc2lzdGVuY2VVbml0TWV0YWRhdGFTZWN0aW9uOwotCQotCXB1YmxpYyBYbWxFbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJc3VwZXIocGFyZW50LCBuZXcgQmFzaWNDb21tYW5kU3RhY2soKSwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUlXb3JrYmVuY2hIZWxwU3lzdGVtIGhlbHBTeXN0ZW0gPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDY7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCi0JCUdyaWREYXRhIGdyaWREYXRhOwotCi0JCUNvbW1vbldpZGdldHMuYnVpbGRQYWNrYWdlTGFiZWwoY29tcG9zaXRlLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCQkKLQkJdGhpcy54bWxQYWNrYWdlQ2hvb3NlciA9IENvbW1vbldpZGdldHMuYnVpbGRYbWxQYWNrYWdlQ2hvb3Nlcihjb21wb3NpdGUsIHRoaXMuY29tbWFuZFN0YWNrLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkJFR0lOTklORzsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXRoaXMueG1sUGFja2FnZUNob29zZXIuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQloZWxwU3lzdGVtLnNldEhlbHAoeG1sUGFja2FnZUNob29zZXIuZ2V0Q29udHJvbCgpLCBJSnBhSGVscENvbnRleHRJZHMuRU5USVRZX09STV9QQUNLQUdFKTsKLQotCQkKLQkJQ29tbW9uV2lkZ2V0cy5idWlsZFNjaGVtYUxhYmVsKGNvbXBvc2l0ZSwgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQkJCi0JCXRoaXMueG1sU2NoZW1hQ2hvb3NlciA9IENvbW1vbldpZGdldHMuYnVpbGRTY2hlbWFDaG9vc2VyKGNvbXBvc2l0ZSwgdGhpcy5jb21tYW5kU3RhY2ssIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuQkVHSU5OSU5HOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJdGhpcy54bWxTY2hlbWFDaG9vc2VyLmdldENvbWJvKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWhlbHBTeXN0ZW0uc2V0SGVscCh4bWxTY2hlbWFDaG9vc2VyLmdldENvbnRyb2woKSwgSUpwYUhlbHBDb250ZXh0SWRzLkVOVElUWV9PUk1fU0NIRU1BKTsKLQotCQkKLQkJQ29tbW9uV2lkZ2V0cy5idWlsZENhdGFsb2dMYWJlbChjb21wb3NpdGUsIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCQotCQl0aGlzLnhtbENhdGFsb2dDaG9vc2VyID0gQ29tbW9uV2lkZ2V0cy5idWlsZENhdGFsb2dDaG9vc2VyKGNvbXBvc2l0ZSwgdGhpcy5jb21tYW5kU3RhY2ssIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuQkVHSU5OSU5HOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJdGhpcy54bWxDYXRhbG9nQ2hvb3Nlci5nZXRDb21ibygpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQloZWxwU3lzdGVtLnNldEhlbHAoeG1sQ2F0YWxvZ0Nob29zZXIuZ2V0Q29udHJvbCgpLCBJSnBhSGVscENvbnRleHRJZHMuRU5USVRZX09STV9DQVRBTE9HKTsKLQkJCi0JCQotCQlDb21tb25XaWRnZXRzLmJ1aWxkQWNjZXNzTGFiZWwoY29tcG9zaXRlLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCQkKLQkJdGhpcy5hY2Nlc3NDb21ib1ZpZXdlciA9IENvbW1vbldpZGdldHMuYnVpbGRBY2Nlc3NUeXBlQ29tYm9WaWV3ZXIoY29tcG9zaXRlLCB0aGlzLmNvbW1hbmRTdGFjaywgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5CRUdJTk5JTkc7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQl0aGlzLmFjY2Vzc0NvbWJvVmlld2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJaGVscFN5c3RlbS5zZXRIZWxwKGFjY2Vzc0NvbWJvVmlld2VyLmdldENvbnRyb2woKSwgSUpwYUhlbHBDb250ZXh0SWRzLkVOVElUWV9PUk1fQUNDRVNTKTsKLQkJCi0JCXRoaXMucGVyc2lzdGVuY2VVbml0TWV0YWRhdGFTZWN0aW9uID0gbmV3IFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhU2VjdGlvbihjb21wb3NpdGUsIHRoaXMuY29tbWFuZFN0YWNrLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCQkKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5CRUdJTk5JTkc7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0TWV0YWRhdGFTZWN0aW9uLmdldFNlY3Rpb24oKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQl9Ci0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb1BvcHVsYXRlKElKcGFDb250ZW50Tm9kZSBjb250ZW50Tm9kZSkgewotCQl0aGlzLmVudGl0eU1hcHBpbmdzID0gKEVudGl0eU1hcHBpbmdzKSBjb250ZW50Tm9kZTsKLQkJdGhpcy54bWxQYWNrYWdlQ2hvb3Nlci5wb3B1bGF0ZSh0aGlzLmVudGl0eU1hcHBpbmdzKTsKLQkJdGhpcy54bWxTY2hlbWFDaG9vc2VyLnBvcHVsYXRlKG5ldyBTY2hlbWFIb2xkZXIodGhpcy5lbnRpdHlNYXBwaW5ncykpOwotCQl0aGlzLnhtbENhdGFsb2dDaG9vc2VyLnBvcHVsYXRlKG5ldyBDYXRhbG9nSG9sZGVyKHRoaXMuZW50aXR5TWFwcGluZ3MpKTsKLQkJdGhpcy5hY2Nlc3NDb21ib1ZpZXdlci5wb3B1bGF0ZShuZXcgTXlBY2Nlc3NIb2xkZXIodGhpcy5lbnRpdHlNYXBwaW5ncykpOwkKLQkJaWYgKHRoaXMuZW50aXR5TWFwcGluZ3MgIT0gbnVsbCkgewotCQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YVNlY3Rpb24ucG9wdWxhdGUodGhpcy5lbnRpdHlNYXBwaW5ncy5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJfQotCQllbHNlIHsKLQkJCXRoaXMucGVyc2lzdGVuY2VVbml0TWV0YWRhdGFTZWN0aW9uLnBvcHVsYXRlKG51bGwpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9Qb3B1bGF0ZSgpIHsKLQkJdGhpcy54bWxQYWNrYWdlQ2hvb3Nlci5wb3B1bGF0ZSgpOwotCQl0aGlzLnhtbFNjaGVtYUNob29zZXIucG9wdWxhdGUoKTsKLQkJdGhpcy54bWxDYXRhbG9nQ2hvb3Nlci5wb3B1bGF0ZSgpOwotCQl0aGlzLmFjY2Vzc0NvbWJvVmlld2VyLnBvcHVsYXRlKCk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0TWV0YWRhdGFTZWN0aW9uLnBvcHVsYXRlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXRoaXMueG1sUGFja2FnZUNob29zZXIuZGlzcG9zZSgpOwotCQl0aGlzLnhtbFNjaGVtYUNob29zZXIuZGlzcG9zZSgpOwotCQl0aGlzLnhtbENhdGFsb2dDaG9vc2VyLmRpc3Bvc2UoKTsKLQkJdGhpcy5hY2Nlc3NDb21ib1ZpZXdlci5kaXNwb3NlKCk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0TWV0YWRhdGFTZWN0aW9uLmRpc3Bvc2UoKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VMaXN0ZW5lcnMoKSB7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZUxpc3RlbmVycygpIHsKLQl9Ci0KLQkKLQlwcml2YXRlIGNsYXNzIE15QWNjZXNzSG9sZGVyIGV4dGVuZHMgWG1sRU9iamVjdCBpbXBsZW1lbnRzIEFjY2Vzc0hvbGRlcnsKLQkJCi0JCXByaXZhdGUgRW50aXR5TWFwcGluZ3NJbnRlcm5hbCBlbnRpdHlNYXBwaW5nczsKLQkJTXlBY2Nlc3NIb2xkZXIoRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmVudGl0eU1hcHBpbmdzID0gKEVudGl0eU1hcHBpbmdzSW50ZXJuYWwpIGVudGl0eU1hcHBpbmdzOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldEFjY2VzcyhBY2Nlc3NUeXBlIGFjY2Vzc1R5cGUpIHsKLQkJCWVudGl0eU1hcHBpbmdzLnNldFNwZWNpZmllZEFjY2VzcyhhY2Nlc3NUeXBlKTsKLQkJfQotCQotCQlwdWJsaWMgQWNjZXNzVHlwZSBnZXRBY2Nlc3MoKSB7Ci0JCQlyZXR1cm4gZW50aXR5TWFwcGluZ3MuZ2V0U3BlY2lmaWVkQWNjZXNzKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBDbGFzcyBmZWF0dXJlQ2xhc3MoKSB7Ci0JCQlyZXR1cm4gRW50aXR5TWFwcGluZ3NJbnRlcm5hbC5jbGFzczsKLQkJfQotCQkKLQkJcHVibGljIGludCBmZWF0dXJlSWQoKSB7Ci0JCQlyZXR1cm4gT3JtUGFja2FnZS5FTlRJVFlfTUFQUElOR1NfSU5URVJOQUxfX1NQRUNJRklFRF9BQ0NFU1M7Ci0JCX0KLQkJCi0JCXB1YmxpYyBFT2JqZWN0IHdyYXBwZWRPYmplY3QoKSB7Ci0JCQlyZXR1cm4gdGhpcy5lbnRpdHlNYXBwaW5nczsKLQkJfQotCQkKLQl9Ci0JCi0JcHJpdmF0ZSBjbGFzcyBTY2hlbWFIb2xkZXIgZXh0ZW5kcyBYbWxFT2JqZWN0IGltcGxlbWVudHMgU3RyaW5nSG9sZGVyIHsKLQkJcHJpdmF0ZSBFbnRpdHlNYXBwaW5nc0ludGVybmFsIGVudGl0eU1hcHBpbmdzOwotCQlTY2hlbWFIb2xkZXIoRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmVudGl0eU1hcHBpbmdzID0gKEVudGl0eU1hcHBpbmdzSW50ZXJuYWwpIGVudGl0eU1hcHBpbmdzOwotCQl9Ci0JCQotCQlwdWJsaWMgQ2xhc3MgZmVhdHVyZUNsYXNzKCkgewotCQkJcmV0dXJuIEVudGl0eU1hcHBpbmdzSW50ZXJuYWwuY2xhc3M7Ci0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgZmVhdHVyZUlkKCkgewotCQkJcmV0dXJuIE9ybVBhY2thZ2UuRU5USVRZX01BUFBJTkdTX0lOVEVSTkFMX19TUEVDSUZJRURfU0NIRU1BOwotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0RlZmF1bHQoKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJcHVibGljIGludCBkZWZhdWx0RmVhdHVyZUlkKCkgewotCQkJcmV0dXJuIE9ybVBhY2thZ2UuRU5USVRZX01BUFBJTkdTX0lOVEVSTkFMX19ERUZBVUxUX1NDSEVNQTsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBkZWZhdWx0SXRlbSgpIHsKLQkJCVN0cmluZyBkZWZhdWx0U2NoZW1hID0gdGhpcy5lbnRpdHlNYXBwaW5ncy5nZXREZWZhdWx0U2NoZW1hKCk7Ci0JCQlpZiAoZGVmYXVsdFNjaGVtYSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIE5MUy5iaW5kKEpwdFVpWG1sTWVzc2FnZXMuWE1MRW50aXR5TWFwcGluZ3NQYWdlX1NjaGVtYURlZmF1bHQsIGRlZmF1bHRTY2hlbWEpOwotCQkJfQotCQkJcmV0dXJuIEpwdFVpWG1sTWVzc2FnZXMuWE1MRW50aXR5TWFwcGluZ3NQYWdlX1NjaGVtYU5vRGVmYXVsdFNwZWNpZmllZDsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXRTdHJpbmcoKSB7Ci0JCQlyZXR1cm4gdGhpcy5lbnRpdHlNYXBwaW5ncy5nZXRTcGVjaWZpZWRTY2hlbWEoKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgc2V0U3RyaW5nKFN0cmluZyBuZXdTY2hlbWEpIHsKLQkJCXRoaXMuZW50aXR5TWFwcGluZ3Muc2V0U3BlY2lmaWVkU2NoZW1hKG5ld1NjaGVtYSk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBFT2JqZWN0IHdyYXBwZWRPYmplY3QoKSB7Ci0JCQlyZXR1cm4gdGhpcy5lbnRpdHlNYXBwaW5nczsKLQkJfQotCX0KLQkKLQlwcml2YXRlIGNsYXNzIENhdGFsb2dIb2xkZXIgZXh0ZW5kcyBYbWxFT2JqZWN0IGltcGxlbWVudHMgU3RyaW5nSG9sZGVyIHsKLQkJcHJpdmF0ZSBFbnRpdHlNYXBwaW5nc0ludGVybmFsIGVudGl0eU1hcHBpbmdzOwotCQlDYXRhbG9nSG9sZGVyKEVudGl0eU1hcHBpbmdzIGVudGl0eU1hcHBpbmdzKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5lbnRpdHlNYXBwaW5ncyA9IChFbnRpdHlNYXBwaW5nc0ludGVybmFsKSBlbnRpdHlNYXBwaW5nczsKLQkJfQotCQkKLQkJcHVibGljIENsYXNzIGZlYXR1cmVDbGFzcygpIHsKLQkJCXJldHVybiBFbnRpdHlNYXBwaW5nc0ludGVybmFsLmNsYXNzOwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGZlYXR1cmVJZCgpIHsKLQkJCXJldHVybiBPcm1QYWNrYWdlLkVOVElUWV9NQVBQSU5HU19JTlRFUk5BTF9fU1BFQ0lGSUVEX0NBVEFMT0c7Ci0JCX0KLQkJCi0JCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzRGVmYXVsdCgpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGRlZmF1bHRGZWF0dXJlSWQoKSB7Ci0JCQlyZXR1cm4gT3JtUGFja2FnZS5FTlRJVFlfTUFQUElOR1NfSU5URVJOQUxfX0RFRkFVTFRfQ0FUQUxPRzsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBkZWZhdWx0SXRlbSgpIHsKLQkJCVN0cmluZyBkZWZhdWx0Q2F0YWxvZyA9IHRoaXMuZW50aXR5TWFwcGluZ3MuZ2V0RGVmYXVsdENhdGFsb2coKTsKLQkJCWlmIChkZWZhdWx0Q2F0YWxvZyAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIE5MUy5iaW5kKEpwdFVpWG1sTWVzc2FnZXMuWE1MRW50aXR5TWFwcGluZ3NQYWdlX0NhdGFsb2dEZWZhdWx0LCBkZWZhdWx0Q2F0YWxvZyk7Ci0JCQl9Ci0JCQlyZXR1cm4gSnB0VWlYbWxNZXNzYWdlcy5YTUxFbnRpdHlNYXBwaW5nc1BhZ2VfQ2F0YWxvZ05vRGVmYXVsdFNwZWNpZmllZDsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXRTdHJpbmcoKSB7Ci0JCQlyZXR1cm4gdGhpcy5lbnRpdHlNYXBwaW5ncy5nZXRTcGVjaWZpZWRDYXRhbG9nKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNldFN0cmluZyhTdHJpbmcgbmV3Q2F0YWxvZykgewotCQkJdGhpcy5lbnRpdHlNYXBwaW5ncy5zZXRTcGVjaWZpZWRDYXRhbG9nKG5ld0NhdGFsb2cpOwotCQl9Ci0JCQotCQlwdWJsaWMgRU9iamVjdCB3cmFwcGVkT2JqZWN0KCkgewotCQkJcmV0dXJuIHRoaXMuZW50aXR5TWFwcGluZ3M7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC94bWwvZGV0YWlscy9YbWxKYXZhQXR0cmlidXRlQ2hvb3Nlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwveG1sL2RldGFpbHMvWG1sSmF2YUF0dHJpYnV0ZUNob29zZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY1OGJlNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC94bWwvZGV0YWlscy9YbWxKYXZhQXR0cmlidXRlQ2hvb3Nlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqICB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqICBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwueG1sLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5vcm0uT3JtUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50Lm9ybS5YbWxBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQub3JtLlhtbFBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQmFzZUpwYUNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLQotcHVibGljIGNsYXNzIFhtbEphdmFBdHRyaWJ1dGVDaG9vc2VyIGV4dGVuZHMgQmFzZUpwYUNvbnRyb2xsZXIKLXsKLQlwcml2YXRlIFhtbFBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlOwotCXByaXZhdGUgQWRhcHRlciBwZXJzaXN0ZW50QXR0cmlidXRlTGlzdGVuZXI7Ci0JCi0JcHJpdmF0ZSBUZXh0IHRleHQ7Ci0JCi0JCi0JcHVibGljIFhtbEphdmFBdHRyaWJ1dGVDaG9vc2VyKENvbXBvc2l0ZSBwYXJlbnQsIENvbW1hbmRTdGFjayB0aGVDb21tYW5kU3RhY2ssIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJc3VwZXIocGFyZW50LCB0aGVDb21tYW5kU3RhY2ssIHdpZGdldEZhY3RvcnkpOwotCQlidWlsZFBlcnNpc3RlbnRBdHRyaWJ1dGVMaXN0ZW5lcigpOwotCX0KLQkKLQkKLQlwcml2YXRlIHZvaWQgYnVpbGRQZXJzaXN0ZW50QXR0cmlidXRlTGlzdGVuZXIoKSB7Ci0JCXRoaXMucGVyc2lzdGVudEF0dHJpYnV0ZUxpc3RlbmVyID0gbmV3IEFkYXB0ZXJJbXBsKCkgewotCQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCQkJcGVyc2lzdGVudEF0dHJpYnV0ZUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYnVpbGRXaWRnZXQoQ29tcG9zaXRlIHBhcmVudCkgewotCQl0ZXh0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRleHQocGFyZW50LCAiIik7Ci0JCXRleHQuYWRkTW9kaWZ5TGlzdGVuZXIoCi0JCQluZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJCXRleHRNb2RpZmllZChlKTsKLQkJCQl9Ci0JCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHRleHRNb2RpZmllZChNb2RpZnlFdmVudCBlKSB7Ci0JCWlmIChpc1BvcHVsYXRpbmcoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlTdHJpbmcgdGV4dCA9ICgoVGV4dCkgZS5nZXRTb3VyY2UoKSkuZ2V0VGV4dCgpOwotCQlhdHRyaWJ1dGUuc2V0TmFtZSh0ZXh0KTsKLQkJCi0JCS8vIFRPRE8gRG9lcyB0aGlzIG5lZWQgdG8gYmUgZG9uZT8KLQkJLy90aGlzLmVkaXRpbmdEb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShTZXRDb21tYW5kLmNyZWF0ZSh0aGlzLmVkaXRpbmdEb21haW4sIHRoaXMuZW50aXR5LCBNYXBwaW5nc1BhY2thZ2UuZUlOU1RBTkNFLmdldEVudGl0eV9TcGVjaWZpZWROYW1lKCksIHRleHQpKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHBlcnNpc3RlbnRBdHRyaWJ1dGVDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJaWYgKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoWG1sQXR0cmlidXRlTWFwcGluZy5jbGFzcykgPT0gCi0JCQkJT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOVF9BVFRSSUJVVEVfX05BTUUpIHsKLQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYygKLQkJCQluZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCXBvcHVsYXRlKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VMaXN0ZW5lcnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGUgIT0gbnVsbCkgewotCQkJYXR0cmlidXRlLmVBZGFwdGVycygpLmFkZChwZXJzaXN0ZW50QXR0cmlidXRlTGlzdGVuZXIpOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZUxpc3RlbmVycygpIHsKLQkJaWYgKGF0dHJpYnV0ZSAhPSBudWxsKSB7Ci0JCQlhdHRyaWJ1dGUuZUFkYXB0ZXJzKCkucmVtb3ZlKHBlcnNpc3RlbnRBdHRyaWJ1dGVMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZG9Qb3B1bGF0ZShFT2JqZWN0IG9iaikgewotCQlhdHRyaWJ1dGUgPSAob2JqID09IG51bGwpID8gbnVsbCA6ICgoWG1sQXR0cmlidXRlTWFwcGluZykgb2JqKS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JCXBvcHVsYXRlVGV4dCgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb1BvcHVsYXRlKCkgewotCQlwb3B1bGF0ZVRleHQoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlVGV4dCgpIHsKLQkJaWYgKGF0dHJpYnV0ZSA9PSBudWxsKSB7Ci0JCQl0ZXh0LmNsZWFyU2VsZWN0aW9uKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCVN0cmluZyBuYW1lID0gYXR0cmlidXRlLmdldE5hbWUoKTsKLQkJCi0JCWlmIChuYW1lID09IG51bGwpIHsKLQkJCW5hbWUgPSAiIjsKLQkJfQotCQlzZXRUZXh0RGF0YShuYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldFRleHREYXRhKFN0cmluZyB0ZXh0RGF0YSkgewotCQlpZiAoISB0ZXh0RGF0YS5lcXVhbHModGV4dC5nZXRUZXh0KCkpKSB7Ci0JCQl0ZXh0LnNldFRleHQodGV4dERhdGEpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKSB7Ci0JCXJldHVybiB0ZXh0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3htbC9kZXRhaWxzL1htbEphdmFDbGFzc0Nob29zZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3htbC9kZXRhaWxzL1htbEphdmFDbGFzc0Nob29zZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNmZWFkMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC94bWwvZGV0YWlscy9YbWxKYXZhQ2xhc3NDaG9vc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC54bWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoRW5naW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5yZWZhY3RvcmluZy5jb250ZW50YXNzaXN0LkNvbnRyb2xDb250ZW50QXNzaXN0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5yZWZhY3RvcmluZy5jb250ZW50YXNzaXN0LkphdmFUeXBlQ29tcGxldGlvblByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSUphdmFFbGVtZW50U2VhcmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5KYXZhVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50Lm9ybS5Pcm1QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQub3JtLlhtbFBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQub3JtLlhtbFR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5KcHRVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5CYXNlSnBhQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwueG1sLkpwdFVpWG1sTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcm9ncmVzcy5JUHJvZ3Jlc3NTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotCi0vL1RPRE8gcG9zc2libHkgaGVscCB0aGUgdXNlciBhbmQgaWYgdGhleSBoYXZlIGNob3NlbiBhIHBhY2thZ2UgYXQgdGhlIGVudGl0eS1tYXBwaW5ncyBsZXZlbAotLy9vbmx5IGluc2VydCB0aGUgY2xhc3MgbmFtZSBpbiB0aGUgeG1sIGZpbGUgaWYgdGhleSBjaG9vc2UgYSBjbGFzcyBmcm9tIHRoZSBwYWNrYWdlLiAgCi0vL05vdCBzdXJlIGlmIHRoaXMgc2hvdWxkIGJlIGRyaXZlbiBieSB0aGUgVUkgb3IgYnkgdWkgYXBpIGluIHRoZSBtb2RlbAotcHVibGljIGNsYXNzIFhtbEphdmFDbGFzc0Nob29zZXIgZXh0ZW5kcyBCYXNlSnBhQ29udHJvbGxlcgotewotCXByaXZhdGUgWG1sUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGU7Ci0JcHJpdmF0ZSBBZGFwdGVyIHBlcnNpc3RlbnRUeXBlTGlzdGVuZXI7Ci0JCi0JcHJpdmF0ZSBDb21wb3NpdGUgY29tcG9zaXRlOwotCXByaXZhdGUgVGV4dCB0ZXh0OwotCXByaXZhdGUgSmF2YVR5cGVDb21wbGV0aW9uUHJvY2Vzc29yIGphdmFUeXBlQ29tcGxldGlvblByb2Nlc3NvcjsKLQkKLQlwdWJsaWMgWG1sSmF2YUNsYXNzQ2hvb3NlcihDb21wb3NpdGUgcGFyZW50LCBDb21tYW5kU3RhY2sgdGhlQ29tbWFuZFN0YWNrLCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXN1cGVyKHBhcmVudCwgdGhlQ29tbWFuZFN0YWNrLCB3aWRnZXRGYWN0b3J5KTsKLQkJYnVpbGRQZXJzaXN0ZW50VHlwZUxpc3RlbmVyKCk7Ci0JfQotCQotCQotCXByaXZhdGUgdm9pZCBidWlsZFBlcnNpc3RlbnRUeXBlTGlzdGVuZXIoKSB7Ci0JCXBlcnNpc3RlbnRUeXBlTGlzdGVuZXIgPSBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJCQlwZXJzaXN0ZW50VHlwZUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYnVpbGRXaWRnZXQoQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmNvbXBvc2l0ZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDb21wb3NpdGUocGFyZW50KTsKLQkgICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkgICAgZ3JpZExheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCSAgICBncmlkTGF5b3V0Lm1hcmdpbldpZHRoID0gMTsKLQkgICAgZ3JpZExheW91dC5udW1Db2x1bW5zID0gMjsKLQkgICAgdGhpcy5jb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCSAgICAKLQkJdGV4dCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVUZXh0KHRoaXMuY29tcG9zaXRlLCAiIik7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkgICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkgICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkgICAgdGhpcy50ZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0JCXRleHQuYWRkTW9kaWZ5TGlzdGVuZXIoCi0JCQluZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJCXRleHRNb2RpZmllZChlKTsKLQkJCQl9Ci0JCQl9KTsKLQotCQkvL1RPRE8gYnVnIDE1NjE4NSAtIHdoZW4gdGhpcyBpcyBmaXhlZCB0aGVyZSBzaG91bGQgYmUgYXBpIGZvciB0aGlzCi0JCXRoaXMuamF2YVR5cGVDb21wbGV0aW9uUHJvY2Vzc29yID0gbmV3IEphdmFUeXBlQ29tcGxldGlvblByb2Nlc3NvcihmYWxzZSwgZmFsc2UpOwotCQlDb250cm9sQ29udGVudEFzc2lzdEhlbHBlci5jcmVhdGVUZXh0Q29udGVudEFzc2lzdGFudCh0aGlzLnRleHQsICB0aGlzLmphdmFUeXBlQ29tcGxldGlvblByb2Nlc3Nvcik7Ci0KLQkJCi0JCUJ1dHRvbiBicm93c2VCdXR0b24gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQnV0dG9uKHRoaXMuY29tcG9zaXRlLCAiQnJvd3NlLi4uIiwgU1dULkZMQVQpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWJyb3dzZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlicm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUlUeXBlIHR5cGUgPSBjaG9vc2VUeXBlKCk7Ci0JCQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJCQl0ZXh0LnNldFRleHQodHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7Ci0JCQkJfQotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJVHlwZSB0eXBlID0gY2hvb3NlVHlwZSgpOwotCQkJCWlmICh0eXBlICE9IG51bGwpIHsKLQkJCQkJdGV4dC5zZXRUZXh0KHR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdGV4dE1vZGlmaWVkKE1vZGlmeUV2ZW50IGUpIHsKLQkJaWYgKGlzUG9wdWxhdGluZygpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCVN0cmluZyB0ZXh0ID0gKChUZXh0KSBlLmdldFNvdXJjZSgpKS5nZXRUZXh0KCk7Ci0JCXBlcnNpc3RlbnRUeXBlLnNldENsYXNzKHRleHQpOwotCQkKLQkJLy8gVE9ETyBEb2VzIHRoaXMgbmVlZCB0byBiZSBkb25lPwotCQkvL3RoaXMuZWRpdGluZ0RvbWFpbi5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKFNldENvbW1hbmQuY3JlYXRlKHRoaXMuZWRpdGluZ0RvbWFpbiwgdGhpcy5lbnRpdHksIE1hcHBpbmdzUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RW50aXR5X1NwZWNpZmllZE5hbWUoKSwgdGV4dCkpOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgSVR5cGUgY2hvb3NlVHlwZSgpIHsKLQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdD0gZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgpOwotCQlpZiAocm9vdCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQkKLQkJCi0JCUlKYXZhRWxlbWVudFtdIGVsZW1lbnRzPSBuZXcgSUphdmFFbGVtZW50W10geyByb290LmdldEphdmFQcm9qZWN0KCkgfTsKLQkJSUphdmFTZWFyY2hTY29wZSBzY29wZT0gU2VhcmNoRW5naW5lLmNyZWF0ZUphdmFTZWFyY2hTY29wZShlbGVtZW50cyk7Ci0JCUlQcm9ncmVzc1NlcnZpY2Ugc2VydmljZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCk7Ci0JCQotCQlTZWxlY3Rpb25EaWFsb2cgdHlwZVNlbGVjdGlvbkRpYWxvZzsKLQkJdHJ5IHsKLQkJCXR5cGVTZWxlY3Rpb25EaWFsb2cgPSBKYXZhVUkuY3JlYXRlVHlwZURpYWxvZyh0aGlzLnRleHQuZ2V0U2hlbGwoKSwgc2VydmljZSwgc2NvcGUsIElKYXZhRWxlbWVudFNlYXJjaENvbnN0YW50cy5DT05TSURFUl9DTEFTU0VTLCBmYWxzZSwgZ2V0VHlwZSgpKTsKLQkJfQotCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCUpwdFVpUGx1Z2luLmxvZyhlKTsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotCQl9Ci0JCXR5cGVTZWxlY3Rpb25EaWFsb2cuc2V0VGl0bGUoSnB0VWlYbWxNZXNzYWdlcy5YbWxKYXZhQ2xhc3NDaG9vc2VyX1htbEphdmFDbGFzc0RpYWxvZ190aXRsZSk7IAotCQl0eXBlU2VsZWN0aW9uRGlhbG9nLnNldE1lc3NhZ2UoSnB0VWlYbWxNZXNzYWdlcy5YbWxKYXZhQ2xhc3NDaG9vc2VyX1htbEphdmFDbGFzc0RpYWxvZ19tZXNzYWdlKTsgCi0KLQkJaWYgKHR5cGVTZWxlY3Rpb25EaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJcmV0dXJuIChJVHlwZSkgdHlwZVNlbGVjdGlvbkRpYWxvZy5nZXRSZXN1bHQoKVswXTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMudGV4dC5nZXRUZXh0KCk7Ci0JfQotCQotCXByaXZhdGUgSVBhY2thZ2VGcmFnbWVudFJvb3QgZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IHRoaXMucGVyc2lzdGVudFR5cGUuZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKTsKLQkJSUphdmFQcm9qZWN0IHJvb3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gcm9vdC5nZXRBbGxQYWNrYWdlRnJhZ21lbnRSb290cygpWzBdOwotCQl9Ci0JCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJSnB0VWlQbHVnaW4ubG9nKGUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCBwZXJzaXN0ZW50VHlwZUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlpZiAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChYbWxQZXJzaXN0ZW50VHlwZS5jbGFzcykgPT0gCi0JCQkJT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOVF9UWVBFX19DTEFTUykgewotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKAotCQkJCW5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJcG9wdWxhdGUoKTsKLQkJCQkJfQotCQkJCX0pOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUxpc3RlbmVycygpIHsKLQkJaWYgKHBlcnNpc3RlbnRUeXBlICE9IG51bGwpIHsKLQkJCXBlcnNpc3RlbnRUeXBlLmVBZGFwdGVycygpLmFkZChwZXJzaXN0ZW50VHlwZUxpc3RlbmVyKTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VMaXN0ZW5lcnMoKSB7Ci0JCWlmIChwZXJzaXN0ZW50VHlwZSAhPSBudWxsKSB7Ci0JCQlwZXJzaXN0ZW50VHlwZS5lQWRhcHRlcnMoKS5yZW1vdmUocGVyc2lzdGVudFR5cGVMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZG9Qb3B1bGF0ZShFT2JqZWN0IG9iaikgewotCQlwZXJzaXN0ZW50VHlwZSA9IChvYmogPT0gbnVsbCkgPyBudWxsIDogKChYbWxUeXBlTWFwcGluZykgb2JqKS5nZXRQZXJzaXN0ZW50VHlwZSgpOwotCQlwb3B1bGF0ZVRleHQoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9Qb3B1bGF0ZSgpIHsKLQkJcG9wdWxhdGVUZXh0KCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZVRleHQoKSB7Ci0JCWlmIChwZXJzaXN0ZW50VHlwZSA9PSBudWxsKSB7Ci0JCQl0ZXh0LmNsZWFyU2VsZWN0aW9uKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSBnZXRQYWNrYWdlRnJhZ21lbnRSb290KCk7Ci0JCWlmIChyb290ICE9IG51bGwpIHsKLQkJCSB0aGlzLmphdmFUeXBlQ29tcGxldGlvblByb2Nlc3Nvci5zZXRQYWNrYWdlRnJhZ21lbnQocm9vdC5nZXRQYWNrYWdlRnJhZ21lbnQoIiIpKTsKLQkJfQotCQkKLQotCQlTdHJpbmcgamF2YUNsYXNzID0gcGVyc2lzdGVudFR5cGUuZ2V0Q2xhc3NfKCk7Ci0JCQotCQlpZiAoamF2YUNsYXNzID09IG51bGwpIHsKLQkJCXNldFRleHREYXRhKCIiKTsKLQkJfQotCQllbHNlIHsKLQkJCXNldFRleHREYXRhKGphdmFDbGFzcyk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldFRleHREYXRhKFN0cmluZyB0ZXh0RGF0YSkgewotCQlpZiAoISB0ZXh0RGF0YS5lcXVhbHModGV4dC5nZXRUZXh0KCkpKSB7Ci0JCQl0ZXh0LnNldFRleHQodGV4dERhdGEpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKSB7Ci0JCXJldHVybiB0aGlzLmNvbXBvc2l0ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC94bWwvZGV0YWlscy9YbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZUNoZWNrQm94LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC94bWwvZGV0YWlscy9YbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZUNoZWNrQm94LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjZGQwMzguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwveG1sL2RldGFpbHMvWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGVDaGVja0JveC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqICB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqICBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwueG1sLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5vcm0uT3JtUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50Lm9ybS5QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuZGV0YWlscy5CYXNlSnBhQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwueG1sLkpwdFVpWG1sTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZUNoZWNrQm94IGV4dGVuZHMgQmFzZUpwYUNvbnRyb2xsZXIKLXsKLQlwcml2YXRlIFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhOwotCXByaXZhdGUgQWRhcHRlciBwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUxpc3RlbmVyOwotCQotCXByaXZhdGUgQnV0dG9uIGJ1dHRvbjsKLQotCi0JcHVibGljIFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlQ2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCwgQ29tbWFuZFN0YWNrIHRoZUNvbW1hbmRTdGFjaywgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlzdXBlcihwYXJlbnQsIHRoZUNvbW1hbmRTdGFjaywgd2lkZ2V0RmFjdG9yeSk7Ci0JCWJ1aWxkUGVyaXN0ZW5jZVVuaXRNZXRhZGF0YUxpc3RlbmVyKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBidWlsZFBlcmlzdGVuY2VVbml0TWV0YWRhdGFMaXN0ZW5lcigpIHsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUxpc3RlbmVyID0gbmV3IEFkYXB0ZXJJbXBsKCkgewotCQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCQkJcGVyc2lzdGVuY2VVbml0TWV0YWRhdGFDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGJ1aWxkV2lkZ2V0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5idXR0b24gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQnV0dG9uKAotCQkJCQkJcGFyZW50LCAKLQkJCQkJCUpwdFVpWG1sTWVzc2FnZXMuWE1MRW50aXR5TWFwcGluZ3NQYWdlX1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlQ2hlY2tCb3gsCi0JCQkJCQlTV1QuQ0hFQ0spOwotCQkKLQkJdGhpcy5idXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZUNoZWNrQm94LnRoaXMueG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGVTZWxlY3Rpb25DaGFuZ2VkKCk7Ci0JCQl9Ci0JCQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZUNoZWNrQm94LnRoaXMueG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGVTZWxlY3Rpb25DaGFuZ2VkKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQl2b2lkIHhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlU2VsZWN0aW9uQ2hhbmdlZCgpIHsKLQkJYm9vbGVhbiB4bWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSA9IHRoaXMuYnV0dG9uLmdldFNlbGVjdGlvbigpOwotCQlpZiAodGhpcy5wZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5pc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkgIT0geG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUpIHsKLQkJCXRoaXMucGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoeG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCWlmIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmNsYXNzKSA9PSAKLQkJCQlPcm1QYWNrYWdlLlBFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEFfX1hNTF9NQVBQSU5HX01FVEFEQVRBX0NPTVBMRVRFKSB7Ci0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMoCi0JCQkJbmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlwb3B1bGF0ZSgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTGlzdGVuZXJzKCkgewotCQlpZiAodGhpcy5wZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSAhPSBudWxsKSB7Ci0JCQl0aGlzLnBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmVBZGFwdGVycygpLmFkZCh0aGlzLnBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhTGlzdGVuZXIpOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZUxpc3RlbmVycygpIHsKLQkJaWYgKHRoaXMucGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgIT0gbnVsbCkgewotCQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcy5wZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUxpc3RlbmVyKTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkb1BvcHVsYXRlKEVPYmplY3Qgb2JqKSB7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgPSAoUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEpIG9iajsKLQkJcG9wdWxhdGVCdXR0b24oKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9Qb3B1bGF0ZSgpIHsKLQkJcG9wdWxhdGVCdXR0b24oKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlQnV0dG9uKCkgewotCQlib29sZWFuIHhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlID0gZmFsc2U7Ci0JCWlmICh0aGlzLnBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhICE9IG51bGwpIHsKLQkJCXhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlICA9IHRoaXMucGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuaXNYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSgpOwotCQl9Ci0JCQotCQlpZiAodGhpcy5idXR0b24uZ2V0U2VsZWN0aW9uKCkgIT0geG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUpIHsKLQkJCXRoaXMuYnV0dG9uLnNldFNlbGVjdGlvbih4bWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSk7Ci0JCX0KLQl9Ci0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCkgewotCQlyZXR1cm4gdGhpcy5idXR0b247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwveG1sL2RldGFpbHMvWG1sUGFja2FnZUNob29zZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3htbC9kZXRhaWxzL1htbFBhY2thZ2VDaG9vc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiYWY0NTEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwveG1sL2RldGFpbHMvWG1sUGFja2FnZUNob29zZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NSArMCwwIEBACi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC54bWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnJlZmFjdG9yaW5nLmNvbnRlbnRhc3Npc3QuQ29udHJvbENvbnRlbnRBc3Npc3RIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnJlZmFjdG9yaW5nLmNvbnRlbnRhc3Npc3QuSmF2YVBhY2thZ2VDb21wbGV0aW9uUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5KYXZhRWxlbWVudExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5YbWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQub3JtLkVudGl0eU1hcHBpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQub3JtLkVudGl0eU1hcHBpbmdzSW50ZXJuYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5vcm0uT3JtUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnB0VWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuQmFzZUpwYUNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnhtbC5KcHRVaVhtbE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuU2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgWG1sUGFja2FnZUNob29zZXIgZXh0ZW5kcyBCYXNlSnBhQ29udHJvbGxlcgotewotCXByaXZhdGUgRW50aXR5TWFwcGluZ3NJbnRlcm5hbCBlbnRpdHlNYXBwaW5nczsKLQlwcml2YXRlIEFkYXB0ZXIgZW50aXR5TWFwcGluZ3NMaXN0ZW5lcjsKLSAgICBwcml2YXRlIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci0JCi0gICAgcHJpdmF0ZSBDb21wb3NpdGUgY29tcG9zaXRlOwotCXByaXZhdGUgVGV4dCB0ZXh0OwotCQotCQotCXB1YmxpYyBYbWxQYWNrYWdlQ2hvb3NlcihDb21wb3NpdGUgcGFyZW50LCBDb21tYW5kU3RhY2sgdGhlQ29tbWFuZFN0YWNrLCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXN1cGVyKHBhcmVudCwgdGhlQ29tbWFuZFN0YWNrLCB3aWRnZXRGYWN0b3J5KTsKLQkJYnVpbGRTY2hlbWFIb2xkZXJMaXN0ZW5lcigpOwotCX0KLQkKLQkKLQlwcml2YXRlIHZvaWQgYnVpbGRTY2hlbWFIb2xkZXJMaXN0ZW5lcigpIHsKLQkJdGhpcy5lbnRpdHlNYXBwaW5nc0xpc3RlbmVyID0gbmV3IEFkYXB0ZXJJbXBsKCkgewotCQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCQkJZW50aXR5TWFwcGluZ3NDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGJ1aWxkV2lkZ2V0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5jb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ29tcG9zaXRlKHBhcmVudCk7Ci0JICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JICAgIGdyaWRMYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkgICAgZ3JpZExheW91dC5tYXJnaW5XaWR0aCA9IDE7Ci0JICAgIGdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JICAgIHRoaXMuY29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLQkJdGhpcy50ZXh0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRleHQodGhpcy5jb21wb3NpdGUsICIiKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCSAgICB0aGlzLnRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJdGhpcy5jb250ZW50QXNzaXN0UHJvY2Vzc29yID0gbmV3IEphdmFQYWNrYWdlQ29tcGxldGlvblByb2Nlc3NvcihuZXcgSmF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyKEphdmFFbGVtZW50TGFiZWxQcm92aWRlci5TSE9XX1JPT1QpKTsKLQkJQ29udHJvbENvbnRlbnRBc3Npc3RIZWxwZXIuY3JlYXRlVGV4dENvbnRlbnRBc3Npc3RhbnQodGhpcy50ZXh0LCB0aGlzLmNvbnRlbnRBc3Npc3RQcm9jZXNzb3IpOwotCi0JICAgIHRoaXMudGV4dC5hZGRNb2RpZnlMaXN0ZW5lcigKLQkJCW5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQkJdGV4dE1vZGlmaWVkKGUpOwotCQkJCX0KLQkJCX0pOwotCSAgICAKLQkJQnV0dG9uIGJyb3dzZUJ1dHRvbiA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVCdXR0b24odGhpcy5jb21wb3NpdGUsICJCcm93c2UuLi4iLCBTV1QuRkxBVCk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJYnJvd3NlQnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJSVBhY2thZ2VGcmFnbWVudCBwYWNrYWdlRnJhZ21lbnQgPSBjaG9vc2VQYWNrYWdlKCk7Ci0JCQkJaWYgKHBhY2thZ2VGcmFnbWVudCAhPSBudWxsKSB7Ci0JCQkJCXRleHQuc2V0VGV4dChwYWNrYWdlRnJhZ21lbnQuZ2V0RWxlbWVudE5hbWUoKSk7Ci0JCQkJfQotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnbWVudCA9IGNob29zZVBhY2thZ2UoKTsKLQkJCQlpZiAocGFja2FnZUZyYWdtZW50ICE9IG51bGwpIHsKLQkJCQkJdGV4dC5zZXRUZXh0KHBhY2thZ2VGcmFnbWVudC5nZXRFbGVtZW50TmFtZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgdGV4dE1vZGlmaWVkKE1vZGlmeUV2ZW50IGUpIHsKLQkJaWYgKGlzUG9wdWxhdGluZygpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCVN0cmluZyB0ZXh0ID0gKChUZXh0KSBlLmdldFNvdXJjZSgpKS5nZXRUZXh0KCk7Ci0JCXRoaXMuZW50aXR5TWFwcGluZ3Muc2V0UGFja2FnZSh0ZXh0KTsKLQkJLy9UT0RPIHNldCBhIEpFTSBQYWNrYWdlPz8KLQkJLy8uc2V0SmF2YUNsYXNzKEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDbGFzc1JlZih0ZXh0KSk7Ci0JCQotCQkvLyBUT0RPIERvZXMgdGhpcyBuZWVkIHRvIGJlIGRvbmU/Ci0JCS8vdGhpcy5lZGl0aW5nRG9tYWluLmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoU2V0Q29tbWFuZC5jcmVhdGUodGhpcy5lZGl0aW5nRG9tYWluLCB0aGlzLmVudGl0eSwgTWFwcGluZ3NQYWNrYWdlLmVJTlNUQU5DRS5nZXRFbnRpdHlfU3BlY2lmaWVkTmFtZSgpLCB0ZXh0KSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBlbnRpdHlNYXBwaW5nc0NoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlpZiAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChFbnRpdHlNYXBwaW5ncy5jbGFzcykgPT0gCi0JCQkJT3JtUGFja2FnZS5FTlRJVFlfTUFQUElOR1NfX1BBQ0tBR0UpIHsKLQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYygKLQkJCQluZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCXBvcHVsYXRlKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VMaXN0ZW5lcnMoKSB7Ci0JCWlmICh0aGlzLmVudGl0eU1hcHBpbmdzICE9IG51bGwpIHsKLQkJCWVudGl0eU1hcHBpbmdzLmVBZGFwdGVycygpLmFkZCh0aGlzLmVudGl0eU1hcHBpbmdzTGlzdGVuZXIpOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZUxpc3RlbmVycygpIHsKLQkJaWYgKHRoaXMuZW50aXR5TWFwcGluZ3MgIT0gbnVsbCkgewotCQkJdGhpcy5lbnRpdHlNYXBwaW5ncy5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcy5lbnRpdHlNYXBwaW5nc0xpc3RlbmVyKTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkb1BvcHVsYXRlKEVPYmplY3Qgb2JqKSB7Ci0JCXRoaXMuZW50aXR5TWFwcGluZ3MgPSAoRW50aXR5TWFwcGluZ3NJbnRlcm5hbCkgb2JqOwotCQlwb3B1bGF0ZVRleHQoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9Qb3B1bGF0ZSgpIHsKLQkJcG9wdWxhdGVUZXh0KCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZVRleHQoKSB7Ci0JCWlmIChlbnRpdHlNYXBwaW5ncyA9PSBudWxsKSB7Ci0JCQl0ZXh0LmNsZWFyU2VsZWN0aW9uKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgpOwotCQlpZiAocm9vdCAhPSBudWxsKSB7Ci0JCQkoKEphdmFQYWNrYWdlQ29tcGxldGlvblByb2Nlc3Nvcil0aGlzLmNvbnRlbnRBc3Npc3RQcm9jZXNzb3IpLnNldFBhY2thZ2VGcmFnbWVudFJvb3Qocm9vdCk7Ci0JCX0KLQkJCi0JCVN0cmluZyBwYWNrYWdlXyA9IHRoaXMuZW50aXR5TWFwcGluZ3MuZ2V0UGFja2FnZSgpOwotCQkKLQkJaWYgKHBhY2thZ2VfID09IG51bGwpIHsKLQkJCXNldFRleHREYXRhKCIiKTsKLQkJfQotCQllbHNlIHsKLQkJCXNldFRleHREYXRhKHBhY2thZ2VfKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIElQYWNrYWdlRnJhZ21lbnRSb290IGdldFBhY2thZ2VGcmFnbWVudFJvb3QoKSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSAoKFhtbEVPYmplY3QpIHRoaXMuZW50aXR5TWFwcGluZ3MpLmdldEpwYVByb2plY3QoKS5nZXRQcm9qZWN0KCk7Ci0JCUlKYXZhUHJvamVjdCByb290ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotCQl0cnkgewotCQkJcmV0dXJuIHJvb3QuZ2V0QWxsUGFja2FnZUZyYWdtZW50Um9vdHMoKVswXTsKLQkJfQotCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCUpwdFVpUGx1Z2luLmxvZyhlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldFRleHREYXRhKFN0cmluZyB0ZXh0RGF0YSkgewotCQlpZiAoISB0ZXh0RGF0YS5lcXVhbHModGV4dC5nZXRUZXh0KCkpKSB7Ci0JCQl0ZXh0LnNldFRleHQodGV4dERhdGEpOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKSB7Ci0JCXJldHVybiB0aGlzLmNvbXBvc2l0ZTsKLQl9Ci0JCi0JLyoqCi0JICogT3BlbnMgYSBzZWxlY3Rpb24gZGlhbG9nIHRoYXQgYWxsb3dzIHRvIHNlbGVjdCBhIHBhY2thZ2UuIAotCSAqIAotCSAqIEByZXR1cm4gcmV0dXJucyB0aGUgc2VsZWN0ZWQgcGFja2FnZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgZGlhbG9nIGhhcyBiZWVuIGNhbmNlbGVkLgotCSAqIFRoZSBjYWxsZXIgdHlwaWNhbGx5IHNldHMgdGhlIHJlc3VsdCB0byB0aGUgcGFja2FnZSBpbnB1dCBmaWVsZC4KLQkgKiA8cD4KLQkgKiBDbGllbnRzIGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZCBpZiB0aGV5IHdhbnQgdG8gb2ZmZXIgYSBkaWZmZXJlbnQgZGlhbG9nLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2luY2UgMy4yCi0JICovCi0JcHJvdGVjdGVkIElQYWNrYWdlRnJhZ21lbnQgY2hvb3NlUGFja2FnZSgpIHsJCQotCQlTZWxlY3Rpb25EaWFsb2cgc2VsZWN0aW9uRGlhbG9nOwotCQl0cnkgewotCQkJc2VsZWN0aW9uRGlhbG9nID0gSmF2YVVJLmNyZWF0ZVBhY2thZ2VEaWFsb2codGV4dC5nZXRTaGVsbCgpLCBnZXRQYWNrYWdlRnJhZ21lbnRSb290KCkpOwotCQl9Ci0JCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJSnB0VWlQbHVnaW4ubG9nKGUpOwotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0JCX0KLQkJc2VsZWN0aW9uRGlhbG9nLnNldFRpdGxlKEpwdFVpWG1sTWVzc2FnZXMuWG1sUGFja2FnZUNob29zZXJfUGFja2FnZURpYWxvZ190aXRsZSk7IAotCQlzZWxlY3Rpb25EaWFsb2cuc2V0TWVzc2FnZShKcHRVaVhtbE1lc3NhZ2VzLlhtbFBhY2thZ2VDaG9vc2VyX1BhY2thZ2VEaWFsb2dfbWVzc2FnZSk7IAotCQlzZWxlY3Rpb25EaWFsb2cuc2V0SGVscEF2YWlsYWJsZShmYWxzZSk7Ci0JCUlQYWNrYWdlRnJhZ21lbnQgcGFjaz0gZ2V0UGFja2FnZUZyYWdtZW50KCk7Ci0JCWlmIChwYWNrICE9IG51bGwpIHsKLQkJCXNlbGVjdGlvbkRpYWxvZy5zZXRJbml0aWFsU2VsZWN0aW9ucyhuZXcgT2JqZWN0W10geyBwYWNrIH0pOwotCQl9Ci0KLQkJaWYgKHNlbGVjdGlvbkRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQlyZXR1cm4gKElQYWNrYWdlRnJhZ21lbnQpIHNlbGVjdGlvbkRpYWxvZy5nZXRSZXN1bHQoKVswXTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIGZyYWdtZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGN1cnJlbnQgaW5wdXQuCi0JICogCi0JICogQHJldHVybiBhIHBhY2thZ2UgZnJhZ21lbnQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGlucHV0IAotCSAqIGNvdWxkIG5vdCBiZSByZXNvbHZlZC4KLQkgKi8KLQlwdWJsaWMgSVBhY2thZ2VGcmFnbWVudCBnZXRQYWNrYWdlRnJhZ21lbnQoKSB7Ci0JCVN0cmluZyBwYWNrYWdlU3RyaW5nID0gdGhpcy50ZXh0LmdldFRleHQoKTsKLQkJcmV0dXJuIGdldFBhY2thZ2VGcmFnbWVudFJvb3QoKS5nZXRQYWNrYWdlRnJhZ21lbnQocGFja2FnZVN0cmluZyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwveG1sL2RldGFpbHMvWG1sUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQYWdlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC94bWwvZGV0YWlscy9YbWxQZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk0MGY1NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC94bWwvZGV0YWlscy9YbWxQZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC54bWwuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklKcGFDb250ZW50Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5JUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5vcm0uT3JtUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50Lm9ybS5YbWxBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQub3JtLlhtbFBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5vcm0uWG1sUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5qYXZhLmRldGFpbHMuSUF0dHJpYnV0ZU1hcHBpbmdVaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aWRnZXRzLkNDb21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5QYWdlQm9vazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLQotcHVibGljIGNsYXNzIFhtbFBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUGFnZQotCWV4dGVuZHMgUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQYWdlIAotewotCXByaXZhdGUgWG1sSmF2YUF0dHJpYnV0ZUNob29zZXIgamF2YUF0dHJpYnV0ZUNob29zZXI7Ci0JCi0JcHJpdmF0ZSBBZGFwdGVyIHBlcnNpc3RlbnRUeXBlTGlzdGVuZXI7Ci0JCi0JcHJpdmF0ZSBJUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGU7Ci0JCi0JcHVibGljIFhtbFBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUGFnZShDb21wb3NpdGUgcGFyZW50LCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXN1cGVyKHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JCWJ1aWxkUGVyc2lzdGVudFR5cGVMaXN0ZW5lcigpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYnVpbGRQZXJzaXN0ZW50VHlwZUxpc3RlbmVyKCkgewotCQl0aGlzLnBlcnNpc3RlbnRUeXBlTGlzdGVuZXIgPSBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkJCXBlcnNpc3RlbnRUeXBlQ2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJfQotCQl9OwotCX0KLQkKLQl2b2lkIHBlcnNpc3RlbnRUeXBlQ2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCWlmIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFhtbFBlcnNpc3RlbnRUeXBlLmNsYXNzKSA9PSAKLQkJCU9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTlRfVFlQRV9fU1BFQ0lGSUVEX0FUVFJJQlVURV9NQVBQSU5HUykgewotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKAotCQkJCW5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJdXBkYXRlRW5iYWJsZWRTdGF0ZSgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJCi0JCUdyaWREYXRhIGdyaWREYXRhOwotCQkKLQkJQ29tbW9uV2lkZ2V0cy5idWlsZEphdmFBdHRyaWJ1dGVOYW1lTGFiZWwoY29tcG9zaXRlLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCQkKLQkJdGhpcy5qYXZhQXR0cmlidXRlQ2hvb3NlciA9IENvbW1vbldpZGdldHMuYnVpbGRKYXZhQXR0cmlidXRlQ2hvb3Nlcihjb21wb3NpdGUsIHRoaXMuY29tbWFuZFN0YWNrLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkJFR0lOTklORzsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXRoaXMuamF2YUF0dHJpYnV0ZUNob29zZXIuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCQotCQlidWlsZE1hcHBpbmdMYWJlbChjb21wb3NpdGUpOwotCQkKLQkJQ0NvbWJvVmlld2VyIG1hcHBpbmdDb21ibyA9IGJ1aWxkTWFwcGluZ0NvbWJvKGNvbXBvc2l0ZSk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuQkVHSU5OSU5HOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJbWFwcGluZ0NvbWJvLmdldENvbWJvKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQotCQlQYWdlQm9vayBib29rID0gYnVpbGRNYXBwaW5nUGFnZUJvb2soY29tcG9zaXRlKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWJvb2suc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUxpc3RlbmVycygpIHsKLQkJc3VwZXIuZW5nYWdlTGlzdGVuZXJzKCk7Ci0JCWlmIChnZXRBdHRyaWJ1dGUoKSAhPSBudWxsKSB7Ci0JCQl0aGlzLnBlcnNpc3RlbnRUeXBlID0gZ2V0QXR0cmlidXRlKCkudHlwZU1hcHBpbmcoKS5nZXRQZXJzaXN0ZW50VHlwZSgpOwotCQkJdGhpcy5wZXJzaXN0ZW50VHlwZS5lQWRhcHRlcnMoKS5hZGQodGhpcy5wZXJzaXN0ZW50VHlwZUxpc3RlbmVyKTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VMaXN0ZW5lcnMoKSB7Ci0JCWlmICh0aGlzLnBlcnNpc3RlbnRUeXBlICE9IG51bGwpIHsKLQkJCXRoaXMucGVyc2lzdGVudFR5cGUuZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMucGVyc2lzdGVudFR5cGVMaXN0ZW5lcik7Ci0JCQl0aGlzLnBlcnNpc3RlbnRUeXBlID0gbnVsbDsKLQkJfQotCQlzdXBlci5kaXNlbmdhZ2VMaXN0ZW5lcnMoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9Qb3B1bGF0ZShJSnBhQ29udGVudE5vZGUgcGVyc2lzdGVudEF0dHJpYnV0ZU5vZGUpIHsKLQkJc3VwZXIuZG9Qb3B1bGF0ZShwZXJzaXN0ZW50QXR0cmlidXRlTm9kZSk7Ci0JCWlmIChwZXJzaXN0ZW50QXR0cmlidXRlTm9kZSA9PSBudWxsKSB7Ci0JCQl0aGlzLmphdmFBdHRyaWJ1dGVDaG9vc2VyLnBvcHVsYXRlKG51bGwpOwotCQl9Ci0JCWVsc2UgewotCQkJWG1sQXR0cmlidXRlTWFwcGluZyBtYXBwaW5nID0gKChYbWxQZXJzaXN0ZW50QXR0cmlidXRlKSBwZXJzaXN0ZW50QXR0cmlidXRlTm9kZSkuZ2V0TWFwcGluZygpOwotCQkJdGhpcy5qYXZhQXR0cmlidXRlQ2hvb3Nlci5wb3B1bGF0ZShtYXBwaW5nKTsKLQkJCXVwZGF0ZUVuYmFibGVkU3RhdGUoKTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb1BvcHVsYXRlKCkgewotCQlzdXBlci5kb1BvcHVsYXRlKCk7Ci0JCXRoaXMuamF2YUF0dHJpYnV0ZUNob29zZXIucG9wdWxhdGUoKTsKLQkJdXBkYXRlRW5iYWJsZWRTdGF0ZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl0aGlzLmphdmFBdHRyaWJ1dGVDaG9vc2VyLmRpc3Bvc2UoKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB1cGRhdGVFbmJhYmxlZFN0YXRlKCkgewotCQlpZiAoZ2V0QXR0cmlidXRlKCkgPT0gbnVsbCB8fCBnZXRBdHRyaWJ1dGUoKS5lQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWJvb2xlYW4gZW5hYmxlZCA9ICEoKFhtbFBlcnNpc3RlbnRBdHRyaWJ1dGUpIGdldEF0dHJpYnV0ZSgpKS5pc1ZpcnR1YWwoKTsKLQkJdXBkYXRlRW5hYmxlZFN0YXRlKGVuYWJsZWQsIGdldENvbnRyb2woKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHVwZGF0ZUVuYWJsZWRTdGF0ZShib29sZWFuIGVuYWJsZWQsIENvbnRyb2wgY29udHJvbCkgewotCQljb250cm9sLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCWlmIChjb250cm9sIGluc3RhbmNlb2YgQ29tcG9zaXRlKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yPENvbnRyb2w+IGkgPSBuZXcgQXJyYXlJdGVyYXRvcjxDb250cm9sPigoKENvbXBvc2l0ZSkgY29udHJvbCkuZ2V0Q2hpbGRyZW4oKSk7IGkuaGFzTmV4dCgpOyApIHsKLQkJCQl1cGRhdGVFbmFibGVkU3RhdGUoZW5hYmxlZCwgaS5uZXh0KCkpOwotCQkJfQotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCS8vVE9ETyBOb3QgcmVhbGx5IGhvdyBJIHdvdWxkIHdhbnQgdG8gaW1wbGVtZW50IHRoaXMsIGJ1dCBpdCBpcyBsb3cgcmlzayBmaXggZm9yIGJ1ZyAxOTIwMzUgZm9yIDEuMFJDMwotCXByb3RlY3RlZCBJQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJbXSB1aVByb3ZpZGVyc0ZvcihJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCXJldHVybiBhdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcnMoKS50b0FycmF5KG5ldyBJQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJbYXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJzKCkuc2l6ZSgpXSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwveG1sL2RldGFpbHMvWG1sUGVyc2lzdGVudFR5cGVEZXRhaWxzUGFnZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwveG1sL2RldGFpbHMvWG1sUGVyc2lzdGVudFR5cGVEZXRhaWxzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzYxNTQ3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3htbC9kZXRhaWxzL1htbFBlcnNpc3RlbnRUeXBlRGV0YWlsc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnhtbC5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5BY2Nlc3NUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklKcGFDb250ZW50Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5YbWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQub3JtLk9ybVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5vcm0uWG1sUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5vcm0uWG1sVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmRldGFpbHMuUGVyc2lzdGVudFR5cGVEZXRhaWxzUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamF2YS5kZXRhaWxzLklUeXBlTWFwcGluZ1VpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEubWFwcGluZ3MucHJvcGVydGllcy5FbWJlZGRhYmxlVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuamF2YS5tYXBwaW5ncy5wcm9wZXJ0aWVzLkVudGl0eVVpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLmphdmEubWFwcGluZ3MucHJvcGVydGllcy5NYXBwZWRTdXBlcmNsYXNzVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2lkZ2V0cy5DQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnhtbC5KcHRVaVhtbE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC54bWwuZGV0YWlscy5BY2Nlc3NUeXBlQ29tYm9WaWV3ZXIuQWNjZXNzSG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUGFnZUJvb2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBYbWxQZXJzaXN0ZW50VHlwZURldGFpbHNQYWdlIGV4dGVuZHMgUGVyc2lzdGVudFR5cGVEZXRhaWxzUGFnZSAKLXsKLQlwcml2YXRlIFhtbEphdmFDbGFzc0Nob29zZXIgamF2YUNsYXNzQ2hvb3NlcjsKLQkKLQlwcml2YXRlIE1ldGFEYXRhQ29tcGxldGVDb21ib1ZpZXdlciBtZXRhZGF0YUNvbXBsZXRlQ29tYm9WaWV3ZXI7Ci0JCi0JcHJpdmF0ZSBBY2Nlc3NUeXBlQ29tYm9WaWV3ZXIgYWNjZXNzQ29tYm9WaWV3ZXI7Ci0JCi0JcHVibGljIFhtbFBlcnNpc3RlbnRUeXBlRGV0YWlsc1BhZ2UoQ29tcG9zaXRlIHBhcmVudCwgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlzdXBlcihwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxJVHlwZU1hcHBpbmdVaVByb3ZpZGVyPiBidWlsZFR5cGVNYXBwaW5nVWlQcm92aWRlcnMoKSB7Ci0JCUNvbGxlY3Rpb248SVR5cGVNYXBwaW5nVWlQcm92aWRlcj4gdHlwZU1hcHBpbmdVaVByb3ZpZGVycyA9IG5ldyBBcnJheUxpc3Q8SVR5cGVNYXBwaW5nVWlQcm92aWRlcj4oKTsKLQkJdHlwZU1hcHBpbmdVaVByb3ZpZGVycy5hZGQobmV3IEVudGl0eVVpUHJvdmlkZXIoKSk7Ci0JCXR5cGVNYXBwaW5nVWlQcm92aWRlcnMuYWRkKG5ldyBNYXBwZWRTdXBlcmNsYXNzVWlQcm92aWRlcigpKTsJCQkKLQkJdHlwZU1hcHBpbmdVaVByb3ZpZGVycy5hZGQobmV3IEVtYmVkZGFibGVVaVByb3ZpZGVyKCkpOwkJCQotCQlyZXR1cm4gdHlwZU1hcHBpbmdVaVByb3ZpZGVyczsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJCi0JCUdyaWREYXRhIGdyaWREYXRhOwotCQkKLQkJQ29tbW9uV2lkZ2V0cy5idWlsZEphdmFDbGFzc0xhYmVsKGNvbXBvc2l0ZSwgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQkJCi0JCXRoaXMuamF2YUNsYXNzQ2hvb3NlciA9IENvbW1vbldpZGdldHMuYnVpbGRKYXZhQ2xhc3NDaG9vc2VyKGNvbXBvc2l0ZSwgdGhpcy5jb21tYW5kU3RhY2ssIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuQkVHSU5OSU5HOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJdGhpcy5qYXZhQ2xhc3NDaG9vc2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCi0JCWJ1aWxkVHlwZU1hcHBpbmdMYWJlbChjb21wb3NpdGUpOwotCQkKLQkJQ0NvbWJvVmlld2VyIHR5cGVNYXBwaW5nQ29tYm8gPSBidWlsZFR5cGVNYXBwaW5nQ29tYm8oY29tcG9zaXRlKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5CRUdJTk5JTkc7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQl0eXBlTWFwcGluZ0NvbWJvLmdldENvbWJvKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQotCQlidWlsZE1ldGFkYXRhQ29tcGxldGVMYWJlbChjb21wb3NpdGUpOwotCQl0aGlzLm1ldGFkYXRhQ29tcGxldGVDb21ib1ZpZXdlciA9IG5ldyBNZXRhRGF0YUNvbXBsZXRlQ29tYm9WaWV3ZXIoY29tcG9zaXRlLCB0aGlzLmNvbW1hbmRTdGFjaywgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5CRUdJTk5JTkc7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQl0aGlzLm1ldGFkYXRhQ29tcGxldGVDb21ib1ZpZXdlci5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQotCQlDb21tb25XaWRnZXRzLmJ1aWxkQWNjZXNzTGFiZWwoY29tcG9zaXRlLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCQl0aGlzLmFjY2Vzc0NvbWJvVmlld2VyID0gQ29tbW9uV2lkZ2V0cy5idWlsZEFjY2Vzc1R5cGVDb21ib1ZpZXdlcihjb21wb3NpdGUsIHRoaXMuY29tbWFuZFN0YWNrLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkJFR0lOTklORzsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXRoaXMuYWNjZXNzQ29tYm9WaWV3ZXIuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCVBhZ2VCb29rIHR5cGVNYXBwaW5nUGFnZUJvb2sgPSBidWlsZFR5cGVNYXBwaW5nUGFnZUJvb2soY29tcG9zaXRlKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXR5cGVNYXBwaW5nUGFnZUJvb2suc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JfQotCQkKLQlwcml2YXRlIExhYmVsIGJ1aWxkTWV0YWRhdGFDb21wbGV0ZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQgKSB7Ci0JCXJldHVybiBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlTGFiZWwocGFyZW50LCBKcHRVaVhtbE1lc3NhZ2VzLlBlcnNpc3RlbnRUeXBlUGFnZV9NZXRhZGF0YUNvbXBsZXRlTGFiZWwpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb1BvcHVsYXRlKElKcGFDb250ZW50Tm9kZSBwZXJzaXN0ZW50VHlwZU5vZGUpIHsKLQkJc3VwZXIuZG9Qb3B1bGF0ZShwZXJzaXN0ZW50VHlwZU5vZGUpOwotCQlpZiAocGVyc2lzdGVudFR5cGVOb2RlID09IG51bGwpIHsKLQkJCXRoaXMuamF2YUNsYXNzQ2hvb3Nlci5wb3B1bGF0ZShudWxsKTsKLQkJCXRoaXMubWV0YWRhdGFDb21wbGV0ZUNvbWJvVmlld2VyLnBvcHVsYXRlKG51bGwpOwotCQkJdGhpcy5hY2Nlc3NDb21ib1ZpZXdlci5wb3B1bGF0ZShuZXcgTXlBY2Nlc3NIb2xkZXIobnVsbCkpOwotCQl9Ci0JCWVsc2UgewotCQkJWG1sVHlwZU1hcHBpbmcgbWFwcGluZyA9ICgoWG1sUGVyc2lzdGVudFR5cGUpIHBlcnNpc3RlbnRUeXBlTm9kZSkuZ2V0TWFwcGluZygpOwotCQkJdGhpcy5qYXZhQ2xhc3NDaG9vc2VyLnBvcHVsYXRlKG1hcHBpbmcpOwotCQkJdGhpcy5tZXRhZGF0YUNvbXBsZXRlQ29tYm9WaWV3ZXIucG9wdWxhdGUobWFwcGluZyk7Ci0JCQl0aGlzLmFjY2Vzc0NvbWJvVmlld2VyLnBvcHVsYXRlKG5ldyBNeUFjY2Vzc0hvbGRlcihtYXBwaW5nKSk7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9Qb3B1bGF0ZSgpIHsKLQkJc3VwZXIuZG9Qb3B1bGF0ZSgpOwotCQl0aGlzLmphdmFDbGFzc0Nob29zZXIucG9wdWxhdGUoKTsKLQkJdGhpcy5tZXRhZGF0YUNvbXBsZXRlQ29tYm9WaWV3ZXIucG9wdWxhdGUoKTsKLQkJdGhpcy5hY2Nlc3NDb21ib1ZpZXdlci5wb3B1bGF0ZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXRoaXMuamF2YUNsYXNzQ2hvb3Nlci5kaXNwb3NlKCk7Ci0JCXRoaXMubWV0YWRhdGFDb21wbGV0ZUNvbWJvVmlld2VyLmRpc3Bvc2UoKTsKLQkJdGhpcy5hY2Nlc3NDb21ib1ZpZXdlci5kaXNwb3NlKCk7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0JCi0JCQotCXByaXZhdGUgY2xhc3MgTXlBY2Nlc3NIb2xkZXIgZXh0ZW5kcyBYbWxFT2JqZWN0IGltcGxlbWVudHMgQWNjZXNzSG9sZGVyewotCQkKLQkJcHJpdmF0ZSBYbWxUeXBlTWFwcGluZyB4bWxUeXBlTWFwcGluZzsKLQkJTXlBY2Nlc3NIb2xkZXIoWG1sVHlwZU1hcHBpbmcgeG1sVHlwZU1hcHBpbmcpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnhtbFR5cGVNYXBwaW5nID0geG1sVHlwZU1hcHBpbmc7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0QWNjZXNzKEFjY2Vzc1R5cGUgYWNjZXNzVHlwZSkgewotCQkJeG1sVHlwZU1hcHBpbmcuc2V0U3BlY2lmaWVkQWNjZXNzKGFjY2Vzc1R5cGUpOwotCQl9Ci0JCi0JCXB1YmxpYyBBY2Nlc3NUeXBlIGdldEFjY2VzcygpIHsKLQkJCXJldHVybiB4bWxUeXBlTWFwcGluZy5nZXRTcGVjaWZpZWRBY2Nlc3MoKTsKLQkJfQotCQkKLQkJcHVibGljIENsYXNzIGZlYXR1cmVDbGFzcygpIHsKLQkJCXJldHVybiBYbWxUeXBlTWFwcGluZy5jbGFzczsKLQkJfQotCQkKLQkJcHVibGljIGludCBmZWF0dXJlSWQoKSB7Ci0JCQlyZXR1cm4gT3JtUGFja2FnZS5YTUxfVFlQRV9NQVBQSU5HX19TUEVDSUZJRURfQUNDRVNTOwotCQl9Ci0JCQotCQlwdWJsaWMgRU9iamVjdCB3cmFwcGVkT2JqZWN0KCkgewotCQkJcmV0dXJuIHRoaXMueG1sVHlwZU1hcHBpbmc7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3htbC9zdHJ1Y3R1cmUvRW50aXR5TWFwcGluZ3NJdGVtUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3htbC9zdHJ1Y3R1cmUvRW50aXR5TWFwcGluZ3NJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTcxNjY0Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC94bWwvc3RydWN0dXJlL0VudGl0eU1hcHBpbmdzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqICBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiAgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiAgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnhtbC5zdHJ1Y3R1cmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5vcm0uRW50aXR5TWFwcGluZ3NJbnRlcm5hbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50Lm9ybS5Pcm1QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5tYXBwaW5ncy5KcHRVaU1hcHBpbmdzSW1hZ2VzOwotCi1wdWJsaWMgY2xhc3MgRW50aXR5TWFwcGluZ3NJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyCi0JaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgCi0JCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIAotCQkJSUl0ZW1MYWJlbFByb3ZpZGVyCi17Ci0JcHVibGljIEVudGl0eU1hcHBpbmdzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoT3JtUGFja2FnZS5MaXRlcmFscy5FTlRJVFlfTUFQUElOR1NfSU5URVJOQUxfX1BFUlNJU1RFTlRfVFlQRVMpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIEpwdFVpTWFwcGluZ3NJbWFnZXMuZ2V0SW1hZ2UoSnB0VWlNYXBwaW5nc0ltYWdlcy5FTlRJVFlfTUFQUElOR1MpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQkvLyBUT0RPCi0JCXJldHVybiAiRW50aXR5TWFwcGluZ3MiOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoRW50aXR5TWFwcGluZ3NJbnRlcm5hbC5jbGFzcykpIHsKLQkJCWNhc2UgT3JtUGFja2FnZS5FTlRJVFlfTUFQUElOR1NfSU5URVJOQUxfX1BFUlNJU1RFTlRfVFlQRVM6Ci0JCQljYXNlIE9ybVBhY2thZ2UuRU5USVRZX01BUFBJTkdTX0lOVEVSTkFMX19UWVBFX01BUFBJTkdTOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQoCi0JCQkJbmV3IFZpZXdlck5vdGlmaWNhdGlvbigKLQkJCQkJbm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwveG1sL3N0cnVjdHVyZS9KcGFDb3JlWG1sSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3htbC9zdHJ1Y3R1cmUvSnBhQ29yZVhtbEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3OWMwZmYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwveG1sL3N0cnVjdHVyZS9KcGFDb3JlWG1sSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqICBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiAgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiAgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnhtbC5zdHJ1Y3R1cmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNoYW5nZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklOb3RpZnlDaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50Lm9ybS51dGlsLk9ybUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnNlcnZpY2VzLklEaXNwb3NhYmxlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGZhY3RvcnkgdGhhdCBpcyB1c2VkIHRvIHByb3ZpZGUgdGhlIGludGVyZmFjZXMgbmVlZGVkIHRvIHN1cHBvcnQgVmlld2Vycy4KLSAqIFRoZSBhZGFwdGVycyBnZW5lcmF0ZWQgYnkgdGhpcyBmYWN0b3J5IGNvbnZlcnQgRU1GIGFkYXB0ZXIgbm90aWZpY2F0aW9ucyBpbnRvIGNhbGxzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LgotICogVGhlIGFkYXB0ZXJzIGFsc28gc3VwcG9ydCBFY2xpcHNlIHByb3BlcnR5IHNoZWV0cy4KLSAqIE5vdGUgdGhhdCBtb3N0IG9mIHRoZSBhZGFwdGVycyBhcmUgc2hhcmVkIGFtb25nIG11bHRpcGxlIGluc3RhbmNlcy4KLSAqLwotcHVibGljIGNsYXNzIEpwYUNvcmVYbWxJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSAKLQlleHRlbmRzIE9ybUFkYXB0ZXJGYWN0b3J5IAotCWltcGxlbWVudHMgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSwKLQkJSUNoYW5nZU5vdGlmaWVyLCAKLQkJSURpc3Bvc2FibGUgCi17Ci0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgcm9vdCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBkZWxlZ2F0ZXMgdG8gdGhpcyBhZGFwdGVyIGZhY3RvcnkuCi0JICovCi0JcHJvdGVjdGVkIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgcGFyZW50QWRhcHRlckZhY3Rvcnk7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHVzZWQgdG8gaW1wbGVtZW50IHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXJ9LgotCSAqLwotCXByb3RlY3RlZCBJQ2hhbmdlTm90aWZpZXIgY2hhbmdlTm90aWZpZXIgPSBuZXcgQ2hhbmdlTm90aWZpZXIoKTsKLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgYWxsIHRoZSBzdXBwb3J0ZWQgdHlwZXMgY2hlY2tlZCBieSB7QGxpbmsgI2lzRmFjdG9yeUZvclR5cGUgaXNGYWN0b3J5Rm9yVHlwZX0uCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gc3VwcG9ydGVkVHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwdWJsaWMgSnBhQ29yZVhtbEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIuY2xhc3MpOwotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJSXRlbUxhYmVsUHJvdmlkZXIuY2xhc3MpOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgWG1sUm9vdENvbnRlbnROb2RlSXRlbVByb3ZpZGVyIHhtbFJvb3RDb250ZW50Tm9kZUl0ZW1Qcm92aWRlcjsKLQkKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVYbWxSb290Q29udGVudE5vZGVBZGFwdGVyKCkgewotCQlpZiAoeG1sUm9vdENvbnRlbnROb2RlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXhtbFJvb3RDb250ZW50Tm9kZUl0ZW1Qcm92aWRlciA9IG5ldyBYbWxSb290Q29udGVudE5vZGVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4geG1sUm9vdENvbnRlbnROb2RlSXRlbVByb3ZpZGVyOwotCX0KLQkKLQlwcm90ZWN0ZWQgRW50aXR5TWFwcGluZ3NJdGVtUHJvdmlkZXIgZW50aXR5TWFwcGluZ3NJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5vcm0uRW50aXR5TWFwcGluZ3NJbXBsfS4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFbnRpdHlNYXBwaW5nc0FkYXB0ZXIoKSB7Ci0JCWlmIChlbnRpdHlNYXBwaW5nc0l0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQllbnRpdHlNYXBwaW5nc0l0ZW1Qcm92aWRlciA9IG5ldyBFbnRpdHlNYXBwaW5nc0l0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBlbnRpdHlNYXBwaW5nc0l0ZW1Qcm92aWRlcjsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50Lm9ybS5YbWxQZXJzaXN0ZW50VHlwZX0gaW5zdGFuY2VzLgotCSAqLwotCXByb3RlY3RlZCBYbWxQZXJzaXN0ZW50VHlwZUl0ZW1Qcm92aWRlciB4bWxQZXJzaXN0ZW50VHlwZUl0ZW1Qcm92aWRlcjsKLQkKLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5vcm0uWG1sUGVyc2lzdGVudFR5cGV9LgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVhtbFBlcnNpc3RlbnRUeXBlQWRhcHRlcigpIHsKLQkJaWYgKHhtbFBlcnNpc3RlbnRUeXBlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXhtbFBlcnNpc3RlbnRUeXBlSXRlbVByb3ZpZGVyID0gbmV3IFhtbFBlcnNpc3RlbnRUeXBlSXRlbVByb3ZpZGVyKAotCQkJCQl0aGlzKTsKLQkJfQotCQkKLQkJcmV0dXJuIHhtbFBlcnNpc3RlbnRUeXBlSXRlbVByb3ZpZGVyOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQub3JtLlhtbFBlcnNpc3RlbnRBdHRyaWJ1dGV9IGluc3RhbmNlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgWG1sUGVyc2lzdGVudEF0dHJpYnV0ZUl0ZW1Qcm92aWRlciB4bWxQZXJzaXN0ZW50QXR0cmlidXRlSXRlbVByb3ZpZGVyOwotCQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50Lm9ybS5YbWxQZXJzaXN0ZW50QXR0cmlidXRlfS4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVYbWxQZXJzaXN0ZW50QXR0cmlidXRlQWRhcHRlcigpIHsKLQkJaWYgKHhtbFBlcnNpc3RlbnRBdHRyaWJ1dGVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJeG1sUGVyc2lzdGVudEF0dHJpYnV0ZUl0ZW1Qcm92aWRlciA9IG5ldyBYbWxQZXJzaXN0ZW50QXR0cmlidXRlSXRlbVByb3ZpZGVyKAotCQkJCQl0aGlzKTsKLQkJfQotCQkKLQkJcmV0dXJuIHhtbFBlcnNpc3RlbnRBdHRyaWJ1dGVJdGVtUHJvdmlkZXI7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcm9vdCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBjb250YWlucyB0aGlzIGZhY3RvcnkuCi0JICovCi0JcHVibGljIENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkgZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gcGFyZW50QWRhcHRlckZhY3RvcnkgPT0gbnVsbCA/IHRoaXMgOiBwYXJlbnRBZGFwdGVyRmFjdG9yeQotCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKTsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBzZXRzIHRoZSBjb21wb3NlZCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBjb250YWlucyB0aGlzIGZhY3RvcnkuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50QWRhcHRlckZhY3RvcnkoCi0JCQlDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHBhcmVudEFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXRoaXMucGFyZW50QWRhcHRlckZhY3RvcnkgPSBwYXJlbnRBZGFwdGVyRmFjdG9yeTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gc3VwcG9ydGVkVHlwZXMuY29udGFpbnModHlwZSkgfHwgc3VwZXIuaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKTsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzdWJzdGl0dXRlcyB0aGUgZmFjdG9yeSBpdHNlbGYgYXMgdGhlIGtleSBmb3IgdGhlIGFkYXB0ZXIuCi0JICovCi0JcHVibGljIEFkYXB0ZXIgYWRhcHQoTm90aWZpZXIgbm90aWZpZXIsIE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiBzdXBlci5hZGFwdChub3RpZmllciwgdGhpcyk7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgYWRhcHQoT2JqZWN0IG9iamVjdCwgT2JqZWN0IHR5cGUpIHsKLQkJaWYgKGlzRmFjdG9yeUZvclR5cGUodHlwZSkpIHsKLQkJCU9iamVjdCBhZGFwdGVyID0gc3VwZXIuYWRhcHQob2JqZWN0LCB0eXBlKTsKLQkJCWlmICghKHR5cGUgaW5zdGFuY2VvZiBDbGFzcykKLQkJCQkJfHwgKCgoQ2xhc3MpIHR5cGUpLmlzSW5zdGFuY2UoYWRhcHRlcikpKSB7Ci0JCQkJcmV0dXJuIGFkYXB0ZXI7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBsaXN0ZW5lci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgewotCQljaGFuZ2VOb3RpZmllci5hZGRMaXN0ZW5lcihub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIHJlbW92ZXMgYSBsaXN0ZW5lci4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgewotCQljaGFuZ2VOb3RpZmllci5yZW1vdmVMaXN0ZW5lcihub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIGRlbGVnYXRlcyB0byB7QGxpbmsgI2NoYW5nZU5vdGlmaWVyfSBhbmQgdG8ge0BsaW5rICNwYXJlbnRBZGFwdGVyRmFjdG9yeX0uCi0JICovCi0JcHVibGljIHZvaWQgZmlyZU5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQljaGFuZ2VOb3RpZmllci5maXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkKLQkJaWYgKHBhcmVudEFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCXBhcmVudEFkYXB0ZXJGYWN0b3J5LmZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBkaXNwb3NlcyBhbGwgb2YgdGhlIGl0ZW0gcHJvdmlkZXJzIGNyZWF0ZWQgYnkgdGhpcyBmYWN0b3J5LiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoeG1sUm9vdENvbnRlbnROb2RlSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQl4bWxSb290Q29udGVudE5vZGVJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoZW50aXR5TWFwcGluZ3NJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCWVudGl0eU1hcHBpbmdzSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHhtbFBlcnNpc3RlbnRUeXBlSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQl4bWxQZXJzaXN0ZW50VHlwZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmICh4bWxQZXJzaXN0ZW50QXR0cmlidXRlSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQl4bWxQZXJzaXN0ZW50QXR0cmlidXRlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC94bWwvc3RydWN0dXJlL1htbFBlcnNpc3RlbnRBdHRyaWJ1dGVJdGVtUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3htbC9zdHJ1Y3R1cmUvWG1sUGVyc2lzdGVudEF0dHJpYnV0ZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWY0MjYwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3htbC9zdHJ1Y3R1cmUvWG1sUGVyc2lzdGVudEF0dHJpYnV0ZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnhtbC5zdHJ1Y3R1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSW1hZ2VVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQub3JtLk9ybVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuY29udGVudC5vcm0uWG1sQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50Lm9ybS5YbWxQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklCYXNpYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JRW1iZWRkZWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSUVtYmVkZGVkSWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSUlkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklNYW55VG9NYW55OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklNYW55VG9PbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSU9uZVRvTWFueTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JT25lVG9PbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSVRyYW5zaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5tYXBwaW5ncy5JVmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwubWFwcGluZ3MuSnB0VWlNYXBwaW5nc0ltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZURhdGE7Ci0KLXB1YmxpYyBjbGFzcyBYbWxQZXJzaXN0ZW50QXR0cmlidXRlSXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlcgotCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIAotCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgCi0JCUlJdGVtTGFiZWxQcm92aWRlcgotewotCXB1YmxpYyBYbWxQZXJzaXN0ZW50QXR0cmlidXRlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCVhtbEF0dHJpYnV0ZU1hcHBpbmcgbWFwcGluZyA9ICgoWG1sUGVyc2lzdGVudEF0dHJpYnV0ZSkgb2JqZWN0KS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlJbWFnZSBpbWFnZTsKLQkJaWYgKG1hcHBpbmcgaW5zdGFuY2VvZiBJQmFzaWMpIHsKLQkJCWltYWdlID0gSnB0VWlNYXBwaW5nc0ltYWdlcy5nZXRJbWFnZShKcHRVaU1hcHBpbmdzSW1hZ2VzLkJBU0lDKTsKLQkJfQotCQllbHNlIGlmIChtYXBwaW5nIGluc3RhbmNlb2YgSUlkKSB7Ci0JCQlpbWFnZSA9IEpwdFVpTWFwcGluZ3NJbWFnZXMuZ2V0SW1hZ2UoSnB0VWlNYXBwaW5nc0ltYWdlcy5JRCk7Ci0JCX0KLQkJZWxzZSBpZiAobWFwcGluZyBpbnN0YW5jZW9mIElWZXJzaW9uKSB7Ci0JCQlpbWFnZSA9IEpwdFVpTWFwcGluZ3NJbWFnZXMuZ2V0SW1hZ2UoSnB0VWlNYXBwaW5nc0ltYWdlcy5WRVJTSU9OKTsKLQkJfQotCQllbHNlIGlmIChtYXBwaW5nIGluc3RhbmNlb2YgSUVtYmVkZGVkKSB7Ci0JCQlpbWFnZSA9IEpwdFVpTWFwcGluZ3NJbWFnZXMuZ2V0SW1hZ2UoSnB0VWlNYXBwaW5nc0ltYWdlcy5FTUJFRERFRCk7Ci0JCX0KLQkJZWxzZSBpZiAobWFwcGluZyBpbnN0YW5jZW9mIElFbWJlZGRlZElkKSB7Ci0JCQlpbWFnZSA9IEpwdFVpTWFwcGluZ3NJbWFnZXMuZ2V0SW1hZ2UoSnB0VWlNYXBwaW5nc0ltYWdlcy5FTUJFRERFRF9JRCk7Ci0JCX0KLQkJZWxzZSBpZiAobWFwcGluZyBpbnN0YW5jZW9mIElPbmVUb09uZSkgewotCQkJaW1hZ2UgPSBKcHRVaU1hcHBpbmdzSW1hZ2VzLmdldEltYWdlKEpwdFVpTWFwcGluZ3NJbWFnZXMuT05FX1RPX09ORSk7Ci0JCX0KLQkJZWxzZSBpZiAobWFwcGluZyBpbnN0YW5jZW9mIElPbmVUb01hbnkpIHsKLQkJCWltYWdlID0gSnB0VWlNYXBwaW5nc0ltYWdlcy5nZXRJbWFnZShKcHRVaU1hcHBpbmdzSW1hZ2VzLk9ORV9UT19NQU5ZKTsKLQkJfQotCQllbHNlIGlmIChtYXBwaW5nIGluc3RhbmNlb2YgSU1hbnlUb09uZSkgewotCQkJaW1hZ2UgPSBKcHRVaU1hcHBpbmdzSW1hZ2VzLmdldEltYWdlKEpwdFVpTWFwcGluZ3NJbWFnZXMuTUFOWV9UT19PTkUpOwotCQl9Ci0JCWVsc2UgaWYgKG1hcHBpbmcgaW5zdGFuY2VvZiBJTWFueVRvTWFueSkgewotCQkJaW1hZ2UgPSBKcHRVaU1hcHBpbmdzSW1hZ2VzLmdldEltYWdlKEpwdFVpTWFwcGluZ3NJbWFnZXMuTUFOWV9UT19NQU5ZKTsKLQkJfQotCQllbHNlIGlmIChtYXBwaW5nIGluc3RhbmNlb2YgSVRyYW5zaWVudCkgewotCQkJaW1hZ2UgPSBKcHRVaU1hcHBpbmdzSW1hZ2VzLmdldEltYWdlKEpwdFVpTWFwcGluZ3NJbWFnZXMuVFJBTlNJRU5UKTsKLQkJfQotCQllbHNlIHsKLQkJCWltYWdlID0gSnB0VWlNYXBwaW5nc0ltYWdlcy5nZXRJbWFnZShKcHRVaU1hcHBpbmdzSW1hZ2VzLk5VTExfQVRUUklCVVRFX01BUFBJTkcpOwotCQl9Ci0JCQotCQkvLyBhcHBseSAiZ2hvc3RpbmciCi0JCWlmIChtYXBwaW5nLmlzVmlydHVhbCgpKSB7Ci0JCQlDb2xvciBvZmZ3aGl0ZSA9IG5ldyBDb2xvcihpbWFnZS5nZXREZXZpY2UoKSwgMjUwLCAyNTAsIDI1MCk7Ci0JCQlJbWFnZURhdGEgaW1hZ2VEYXRhID0gSW1hZ2VVdGlsaXRpZXMuY3JlYXRlU2hhZGVkSW1hZ2UoaW1hZ2UsIG9mZndoaXRlKTsKLQkJCWltYWdlID0gbmV3IEltYWdlKGltYWdlLmdldERldmljZSgpLCBpbWFnZURhdGEpOwotCQl9Ci0JCQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiAoKFhtbFBlcnNpc3RlbnRBdHRyaWJ1dGUpIG9iamVjdCkuZ2V0TmFtZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoWG1sUGVyc2lzdGVudEF0dHJpYnV0ZS5jbGFzcykpIHsKLQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5UX0FUVFJJQlVURV9fTUFQUElORzoKLQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5UX0FUVFJJQlVURV9fTkFNRToKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3htbC9zdHJ1Y3R1cmUvWG1sUGVyc2lzdGVudFR5cGVJdGVtUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS9zcmMvb3JnL2VjbGlwc2UvanB0L3VpL2ludGVybmFsL3htbC9zdHJ1Y3R1cmUvWG1sUGVyc2lzdGVudFR5cGVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg3NzUwYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC94bWwvc3RydWN0dXJlL1htbFBlcnNpc3RlbnRUeXBlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqICBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiAgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiAgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLnhtbC5zdHJ1Y3R1cmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5KcGFDb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5jb250ZW50Lm9ybS5Pcm1QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQub3JtLlhtbFBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklFbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLm1hcHBpbmdzLklFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubWFwcGluZ3MuSU1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLm1hcHBpbmdzLkpwdFVpTWFwcGluZ3NJbWFnZXM7Ci0KLXB1YmxpYyBjbGFzcyBYbWxQZXJzaXN0ZW50VHlwZUl0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIKLQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCAKLQkJCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgCi0JCQlJSXRlbUxhYmVsUHJvdmlkZXIKLXsKLQlwdWJsaWMgWG1sUGVyc2lzdGVudFR5cGVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfUEVSU0lTVEVOVF9UWVBFX19TUEVDSUZJRURfUEVSU0lTVEVOVF9BVFRSSUJVVEVTKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKE9ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX1BFUlNJU1RFTlRfVFlQRV9fVklSVFVBTF9QRVJTSVNURU5UX0FUVFJJQlVURVMpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJSVR5cGVNYXBwaW5nIG1hcHBpbmcgPSAoKElQZXJzaXN0ZW50VHlwZSkgb2JqZWN0KS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlpZiAobWFwcGluZyBpbnN0YW5jZW9mIElFbnRpdHkpIHsKLQkJCXJldHVybiBKcHRVaU1hcHBpbmdzSW1hZ2VzLmdldEltYWdlKEpwdFVpTWFwcGluZ3NJbWFnZXMuRU5USVRZKTsKLQkJfQotCQllbHNlIGlmIChtYXBwaW5nIGluc3RhbmNlb2YgSUVtYmVkZGFibGUpIHsKLQkJCXJldHVybiBKcHRVaU1hcHBpbmdzSW1hZ2VzLmdldEltYWdlKEpwdFVpTWFwcGluZ3NJbWFnZXMuRU1CRUREQUJMRSk7Ci0JCX0KLQkJZWxzZSBpZiAobWFwcGluZyBpbnN0YW5jZW9mIElNYXBwZWRTdXBlcmNsYXNzKSB7Ci0JCQlyZXR1cm4gSnB0VWlNYXBwaW5nc0ltYWdlcy5nZXRJbWFnZShKcHRVaU1hcHBpbmdzSW1hZ2VzLk1BUFBFRF9TVVBFUkNMQVNTKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiAoKFhtbFBlcnNpc3RlbnRUeXBlKSBvYmplY3QpLmdldENsYXNzXygpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoWG1sUGVyc2lzdGVudFR5cGUuY2xhc3MpKSB7Ci0JCQljYXNlIEpwYUNvcmVQYWNrYWdlLklQRVJTSVNURU5UX1RZUEVfX01BUFBJTkdfS0VZOgotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5UX1RZUEVfX0NMQVNTOgotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKAotCQkJCQluZXcgVmlld2VyTm90aWZpY2F0aW9uKAotCQkJCQkJbm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCQlyZXR1cm47Ci0JCQkKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOVF9UWVBFX19TUEVDSUZJRURfUEVSU0lTVEVOVF9BVFRSSUJVVEVTOgotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5UX1RZUEVfX1ZJUlRVQUxfUEVSU0lTVEVOVF9BVFRSSUJVVEVTOgotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKAotCQkJCQluZXcgVmlld2VyTm90aWZpY2F0aW9uKAotCQkJCQkJbm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC94bWwvc3RydWN0dXJlL1htbFJvb3RDb250ZW50Tm9kZUl0ZW1Qcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwveG1sL3N0cnVjdHVyZS9YbWxSb290Q29udGVudE5vZGVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY5YzdjOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC94bWwvc3RydWN0dXJlL1htbFJvb3RDb250ZW50Tm9kZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC54bWwuc3RydWN0dXJlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQub3JtLkVudGl0eU1hcHBpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmNvbnRlbnQub3JtLk9ybVBhY2thZ2U7Ci0KLXB1YmxpYyBjbGFzcyBYbWxSb290Q29udGVudE5vZGVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyCi0JaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgCi0JCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIAotCQkJSUl0ZW1MYWJlbFByb3ZpZGVyCi17Ci0JcHVibGljIFhtbFJvb3RDb250ZW50Tm9kZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9ST09UX0NPTlRFTlRfTk9ERV9fRU5USVRZX01BUFBJTkdTKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEVudGl0eU1hcHBpbmdzLmNsYXNzKSkgewotCQljYXNlIE9ybVBhY2thZ2UuWE1MX1JPT1RfQ09OVEVOVF9OT0RFX19FTlRJVFlfTUFQUElOR1M6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZCgKLQkJCQluZXcgVmlld2VyTm90aWZpY2F0aW9uKAotCQkJCQlub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC94bWwvc3RydWN0dXJlL1htbFN0cnVjdHVyZVByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvc3JjL29yZy9lY2xpcHNlL2pwdC91aS9pbnRlcm5hbC94bWwvc3RydWN0dXJlL1htbFN0cnVjdHVyZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhN2RkZGMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvdWkvaW50ZXJuYWwveG1sL3N0cnVjdHVyZS9YbWxTdHJ1Y3R1cmVQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC54bWwuc3RydWN0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5KcHRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC5zdHJ1Y3R1cmUuSUpwYVN0cnVjdHVyZVByb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgWG1sU3RydWN0dXJlUHJvdmlkZXIgaW1wbGVtZW50cyBJSnBhU3RydWN0dXJlUHJvdmlkZXIgewotCi0JcHVibGljIFN0cmluZyBmaWxlQ29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBKcHRDb3JlUGx1Z2luLk9STV9YTUxfQ09OVEVOVF9UWVBFOwotCX0KLQkKLQlwdWJsaWMgSVRyZWVDb250ZW50UHJvdmlkZXIgYnVpbGRDb250ZW50UHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIobmV3IEpwYUNvcmVYbWxJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKLQl9Ci0JCi0JcHVibGljIElMYWJlbFByb3ZpZGVyIGJ1aWxkTGFiZWxQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIobmV3IEpwYUNvcmVYbWxJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS8uY2xhc3NwYXRoIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQwY2YwZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyI+Ci0JCTxhY2Nlc3NydWxlcz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC8qKiIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2UvanN0LyoqIi8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvLmN2c2lnbm9yZSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5Ly5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyMTkxYjQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotYmluCi1AZG90Ci1idWlsZC54bWwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS8ucHJvamVjdCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5Ly5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWIzODliLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5Ly5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LnV0aWxpdHk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjE5MThkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1N1biBNYXkgMjcgMTU6MTE6MzUgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDM4MjYwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI1N1biBNYXkgMjcgMTQ6NTU6MzcgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBhZWYwNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eQotQnVuZGxlLVZlcnNpb246IDEuMC4wLnF1YWxpZmllcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwsCi0gb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L2Fib3V0Lmh0bWwgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTczYmRhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lIDA2LCAyMDA3PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L2J1aWxkLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWFiOGQ0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWphdmFjU291cmNlPTEuNQotamF2YWNUYXJnZXQ9MS41Ci1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvY29tcG9uZW50LnhtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMTBiMjguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvY29tcG9uZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PGNvbXBvbmVudCAgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIgbmFtZT0ib3JnLmVjbGlwc2UuanB0LnV0aWxpdHkiPjxkZXNjcmlwdGlvbiB1cmw9IiI+PC9kZXNjcmlwdGlvbj48Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj48L2NvbXBvbmVudC1kZXBlbmRzPjxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC51dGlsaXR5IiBmcmFnbWVudD0iZmFsc2UiLz48L2NvbXBvbmVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9wbHVnaW4ucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWMwMjlkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRvIGNvZGUgZGV2ZWxvcGVyOgotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLXBsdWdpbk5hbWUgPSBKYXZhIFBlcnNpc3RlbmNlIEFQSSBUb29scyAtIFV0aWxpdHkKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCi0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9CYWcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9CYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM2ODUzNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvQmFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi0vKioKLSAqIEEgY29sbGVjdGlvbiB0aGF0IGFsbG93cyBkdXBsaWNhdGUgZWxlbWVudHMuCi0gKiA8cD4KLSAqIFRoZSA8Y29kZT5CYWc8L2NvZGU+IGludGVyZmFjZSBwbGFjZXMgYWRkaXRpb25hbCBzdGlwdWxhdGlvbnMsCi0gKiBiZXlvbmQgdGhvc2UgaW5oZXJpdGVkIGZyb20gdGhlIDxjb2RlPmphdmEudXRpbC5Db2xsZWN0aW9uPC9jb2RlPiBpbnRlcmZhY2UsCi0gKiBvbiB0aGUgY29udHJhY3RzIG9mIHRoZSA8Y29kZT5lcXVhbHM8L2NvZGU+IGFuZCA8Y29kZT5oYXNoQ29kZTwvY29kZT4gbWV0aG9kcy4KLSAqIAotICogQHZlcnNpb24gMS4wMCBKYW4tMjAwMgotICogQHNlZSBqYXZhLnV0aWwuQ29sbGVjdGlvbgotICogQHNlZSBIYXNoQmFnCi0gKi8KLQotcHVibGljIGludGVyZmFjZSBCYWc8RT4gZXh0ZW5kcyBqYXZhLnV0aWwuQ29sbGVjdGlvbjxFPiB7Ci0JCi0JLyoqCi0JICogQ29tcGFyZXMgdGhlIHNwZWNpZmllZCBvYmplY3Qgd2l0aCB0aGlzIGJhZyBmb3IgZXF1YWxpdHkuIFJldHVybnMKLQkgKiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyBhbHNvIGEgYmFnLCB0aGUgdHdvIGJhZ3MKLQkgKiBoYXZlIHRoZSBzYW1lIHNpemUsIGFuZCBldmVyeSBtZW1iZXIgb2YgdGhlIHNwZWNpZmllZCBiYWcgaXMKLQkgKiBjb250YWluZWQgaW4gdGhpcyBiYWcgd2l0aCB0aGUgc2FtZSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgKG9yIGVxdWl2YWxlbnRseSwKLQkgKiBldmVyeSBtZW1iZXIgb2YgdGhpcyBiYWcgaXMgY29udGFpbmVkIGluIHRoZSBzcGVjaWZpZWQgYmFnIHdpdGggdGhlIHNhbWUKLQkgKiBudW1iZXIgb2Ygb2NjdXJyZW5jZXMpLiBUaGlzIGRlZmluaXRpb24gZW5zdXJlcyB0aGF0IHRoZQotCSAqIGVxdWFscyBtZXRob2Qgd29ya3MgcHJvcGVybHkgYWNyb3NzIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlCi0JICogYmFnIGludGVyZmFjZS4KLQkgKi8KLQlib29sZWFuIGVxdWFscyhPYmplY3Qgbyk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaGFzaCBjb2RlIHZhbHVlIGZvciB0aGlzIGJhZy4gVGhlIGhhc2ggY29kZSBvZiBhIGJhZyBpcwotCSAqIGRlZmluZWQgdG8gYmUgdGhlIHN1bSBvZiB0aGUgaGFzaCBjb2RlcyBvZiB0aGUgZWxlbWVudHMgaW4gdGhlIGJhZywKLQkgKiB3aGVyZSB0aGUgaGFzaGNvZGUgb2YgYSA8Y29kZT5udWxsPC9jb2RlPiBlbGVtZW50IGlzIGRlZmluZWQgdG8gYmUgemVyby4KLQkgKiBUaGlzIGVuc3VyZXMgdGhhdCA8Y29kZT5iMS5lcXVhbHMoYjIpPC9jb2RlPiBpbXBsaWVzIHRoYXQKLQkgKiA8Y29kZT5iMS5oYXNoQ29kZSgpID09IGIyLmhhc2hDb2RlKCk8L2NvZGU+IGZvciBhbnkgdHdvIGJhZ3MKLQkgKiA8Y29kZT5iMTwvY29kZT4gYW5kIDxjb2RlPmIyPC9jb2RlPiwgYXMgcmVxdWlyZWQgYnkgdGhlIGdlbmVyYWwKLQkgKiBjb250cmFjdCBvZiB0aGUgPGNvZGU+T2JqZWN0Lmhhc2hDb2RlPC9jb2RlPiBtZXRob2QuCi0JICovCi0JaW50IGhhc2hDb2RlKCk7Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvQml0VG9vbHMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9CaXRUb29scy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzEyMjFhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9CaXRUb29scy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbDsKLQotLyoqCi0gKiBBc3NvcnRlZCBiaXQgdG9vbHMKLSAqLwotcHVibGljIGNsYXNzIEJpdFRvb2xzIHsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgJ2ZsYWdzJyBoYXMgYWxsIHRoZSBzcGVjaWZpZWQKLQkgKiAnZmxhZ3NUb0NoZWNrJyBzZXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGFsbEZsYWdzQXJlU2V0KGludCBmbGFncywgaW50IGZsYWdzVG9DaGVjaykgewotCQlyZXR1cm4gKGZsYWdzICYgZmxhZ3NUb0NoZWNrKSA9PSBmbGFnc1RvQ2hlY2s7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCAnZmxhZ3MnIGhhcyBhbnkgb25lIG9mIHRoZSBzcGVjaWZpZWQKLQkgKiAnZmxhZ3NUb0NoZWNrJyBzZXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGFueUZsYWdzQXJlU2V0KGludCBmbGFncywgaW50IGZsYWdzVG9DaGVjaykgewotCQlyZXR1cm4gKGZsYWdzICYgZmxhZ3NUb0NoZWNrKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgJ2ZsYWdzJyBoYXMgYWxsIHRoZSBzcGVjaWZpZWQKLQkgKiAnZmxhZ3NUb0NoZWNrJyBzZXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGFsbEZsYWdzQXJlU2V0KGludCBmbGFncywgaW50W10gZmxhZ3NUb0NoZWNrKSB7Ci0JCWZvciAoaW50IGkgPSBmbGFnc1RvQ2hlY2subGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmICggISBhbGxGbGFnc0FyZVNldChmbGFncywgZmxhZ3NUb0NoZWNrW2ldKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkICdmbGFncycgaGFzIGFueSBvbmUgb2YgdGhlIHNwZWNpZmllZAotCSAqICdmbGFnc1RvQ2hlY2snIHNldC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYW55RmxhZ3NBcmVTZXQoaW50IGZsYWdzLCBpbnRbXSBmbGFnc1RvQ2hlY2spIHsKLQkJZm9yIChpbnQgaSA9IGZsYWdzVG9DaGVjay5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaWYgKGFueUZsYWdzQXJlU2V0KGZsYWdzLCBmbGFnc1RvQ2hlY2tbaV0pKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdXBwcmVzcyBkZWZhdWx0IGNvbnN0cnVjdG9yLCBlbnN1cmluZyBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgQml0VG9vbHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0NsYXNzVG9vbHMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9DbGFzc1Rvb2xzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmOGUyMDIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0NsYXNzVG9vbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLS8qKgotICogQ29udmVuaWVuY2UgbWV0aG9kcyByZWxhdGVkIHRvIHRoZSBqYXZhLmxhbmcucmVmbGVjdCBwYWNrYWdlLgotICogVGhlc2UgbWV0aG9kcyBwcm92aWRlIHNob3J0Y3V0cyBmb3IgbWFuaXB1bGF0aW5nIG9iamVjdHMgdmlhCi0gKiByZWZsZWN0aW9uOyBwYXJ0aWN1bGFybHkgd2hlbiBkZWFsaW5nIHdpdGggZmllbGRzIGFuZC9vciBtZXRob2RzIHRoYXQKLSAqIGFyZSBub3QgcHVibGljbHkgYWNjZXNzaWJsZSBvciBhcmUgaW5oZXJpdGVkLgotICogCi0gKiBJbiBtb3N0IGNhc2VzLCBhbGwgdGhlIGV4Y2VwdGlvbnMgYXJlIGhhbmRsZWQgYW5kCi0gKiB3cmFwcGVkIGluIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uczsgc28gdGhlc2UgbWV0aG9kcyBzaG91bGQKLSAqIGJlIHVzZWQgd2hlbiB5b3UgYXJlIGNvbmZpZGVudCB0aGF0IHlvdSB3aWxsIG5vdCBoYXZpbmcgYW55IHByb2JsZW1zCi0gKiB1c2luZyByZWZsZWN0aW9uLgotICogCi0gKiBUaGVyZSBhcmUgYWxzbyBhIG51bWJlciBvZiBtZXRob2RzIHdob3NlIG5hbWVzCi0gKiBiZWdpbiB3aXRoICJhdHRlbXB0Ii4gVGhlc2UgbWV0aG9kcyB3aWxsIHRocm93IGEgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0gKiBvciBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB3aGVuIGFwcHJvcHJpYXRlLCBhbGxvd2luZyB5b3UgdG8gcHJvYmUKLSAqIGZvciBtZXRob2RzIHRoYXQgc2hvdWxkIGJlIHByZXNlbnQgYnV0IG1pZ2h0IG5vdC4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENsYXNzVG9vbHMgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDbGFzczw/PltdIFpFUk9fUEFSQU1FVEVSX1RZUEVTID0gbmV3IENsYXNzWzBdOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0W10gWkVST19QQVJBTUVURVJTID0gbmV3IE9iamVjdFswXTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1IgPSBTdHJpbmdUb29scy5DUjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBORVNURURfQ0xBU1NfTkFNRV9TRVBBUkFUT1IgPSAnJCc7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQVJSQVlfSU5ESUNBVE9SID0gJ1snOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIFJFRkVSRU5DRV9DTEFTU19DT0RFID0gJ0wnOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBSRUZFUkVOQ0VfQ0xBU1NfTkFNRV9ERUxJTUlURVIgPSAnOyc7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgUHJpbWl0aXZlQ2xhc3NDb2RlW10gUFJJTUlUSVZFX0NMQVNTX0NPREVTOyAgLy8gcHNldWRvICdmaW5hbCcgLSBsYXp5LWluaXRpYWxpemVkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIEJZVEVfQ09ERSA9ICdCJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQ0hBUl9DT0RFID0gJ0MnOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBET1VCTEVfQ09ERSA9ICdEJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgRkxPQVRfQ09ERSA9ICdGJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgSU5UX0NPREUgPSAnSSc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIExPTkdfQ09ERSA9ICdKJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgU0hPUlRfQ09ERSA9ICdTJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQk9PTEVBTl9DT0RFID0gJ1onOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBWT0lEX0NPREUgPSAnVic7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgaW50IE1BWF9QUklNSVRJVkVfQ0xBU1NfTkFNRV9MRU5HVEggPSAtMTsgIC8vIHBzZXVkbyAnZmluYWwnIC0gbGF6eS1pbml0aWFsaXplZAotCi0KLQkvKioKLQkgKiBSZXR1cm4gYWxsIHRoZSBmaWVsZHMgZm9yIHRoZQotCSAqIHNwZWNpZmllZCBjbGFzcywgaW5jbHVkaW5nIGluaGVyaXRlZCBmaWVsZHMuCi0JICogQ2xhc3MjYWxsRmllbGRzKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpZWxkW10gYWxsRmllbGRzKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlTdGFjazxGaWVsZD4gc3RhY2sgPSBuZXcgU3RhY2s8RmllbGQ+KCk7Ci0JCWZvciAoQ2xhc3M8Pz4gdGVtcENsYXNzID0gamF2YUNsYXNzOyB0ZW1wQ2xhc3MgIT0gbnVsbDsgdGVtcENsYXNzID0gdGVtcENsYXNzLmdldFN1cGVyY2xhc3MoKSkgewotCQkJcHVzaERlY2xhcmVkRmllbGRzKHRlbXBDbGFzcywgc3RhY2spOwotCQl9Ci0JCUNvbGxlY3Rpb25zLnJldmVyc2Uoc3RhY2spOwotCQlyZXR1cm4gc3RhY2sudG9BcnJheShuZXcgRmllbGRbc3RhY2suc2l6ZSgpXSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhbGwgdGhlIG1ldGhvZHMgZm9yIHRoZQotCSAqIHNwZWNpZmllZCBjbGFzcywgaW5jbHVkaW5nIGluaGVyaXRlZCBtZXRob2RzLgotCSAqIENsYXNzI2FsbE1ldGhvZHMoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kW10gYWxsTWV0aG9kcyhDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJU3RhY2s8TWV0aG9kPiBzdGFjayA9IG5ldyBTdGFjazxNZXRob2Q+KCk7Ci0JCWZvciAoQ2xhc3M8Pz4gdGVtcENsYXNzID0gamF2YUNsYXNzOyB0ZW1wQ2xhc3MgIT0gbnVsbDsgdGVtcENsYXNzID0gdGVtcENsYXNzLmdldFN1cGVyY2xhc3MoKSkgewotCQkJcHVzaERlY2xhcmVkTWV0aG9kcyh0ZW1wQ2xhc3MsIHN0YWNrKTsKLQkJfQotCQlDb2xsZWN0aW9ucy5yZXZlcnNlKHN0YWNrKTsKLQkJcmV0dXJuIHN0YWNrLnRvQXJyYXkobmV3IE1ldGhvZFtzdGFjay5zaXplKCldKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLAotCSAqIHVzaW5nIHRoZSBjbGFzcydzIGRlZmF1bHQgKHplcm8tYXJndW1lbnQpIGNvbnN0cnVjdG9yLgotCSAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBpcyBub3QgZGVmaW5lZC4KLQkgKiBDbGFzcyNuZXdJbnN0YW5jZSgpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxUPiBUIGF0dGVtcHROZXdJbnN0YW5jZShDbGFzczxUPiBqYXZhQ2xhc3MpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlyZXR1cm4gYXR0ZW1wdE5ld0luc3RhbmNlKGphdmFDbGFzcywgWkVST19QQVJBTUVURVJfVFlQRVMsIFpFUk9fUEFSQU1FVEVSUyk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLAotCSAqIGdpdmVuIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgdHlwZXMgYW5kIHBhcmFtZXRlcnMuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBjb25zdHJ1Y3RvciBpcyBub3QgZGVmaW5lZC4KLQkgKiBDbGFzcyNuZXdJbnN0YW5jZShDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gVCBhdHRlbXB0TmV3SW5zdGFuY2UoQ2xhc3M8VD4gamF2YUNsYXNzLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBjb25zdHJ1Y3RvcihqYXZhQ2xhc3MsIHBhcmFtZXRlclR5cGVzKS5uZXdJbnN0YW5jZShwYXJhbWV0ZXJzKTsKLQkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBpZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oaWUgKyBDUiArIGZ1bGx5UXVhbGlmaWVkQ29uc3RydWN0b3JTaWduYXR1cmUoamF2YUNsYXNzLCBwYXJhbWV0ZXJUeXBlcyksIGllKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBpYWUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGlhZSArIENSICsgZnVsbHlRdWFsaWZpZWRDb25zdHJ1Y3RvclNpZ25hdHVyZShqYXZhQ2xhc3MsIHBhcmFtZXRlclR5cGVzKSwgaWFlKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBpdGUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGZ1bGx5UXVhbGlmaWVkQ29uc3RydWN0b3JTaWduYXR1cmUoamF2YUNsYXNzLCBwYXJhbWV0ZXJUeXBlcykgKyBDUiArIGl0ZS5nZXRUYXJnZXRFeGNlcHRpb24oKSwgaXRlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MsCi0JICogZ2l2ZW4gdGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlciB0eXBlIGFuZCBwYXJhbWV0ZXIuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBjb25zdHJ1Y3RvciBpcyBub3QgZGVmaW5lZC4KLQkgKiBDbGFzcyNuZXdJbnN0YW5jZShDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgcGFyYW1ldGVyKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gVCBhdHRlbXB0TmV3SW5zdGFuY2UoQ2xhc3M8VD4gamF2YUNsYXNzLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgcGFyYW1ldGVyKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGF0dGVtcHROZXdJbnN0YW5jZShqYXZhQ2xhc3MsIG5ldyBDbGFzc1tdIHtwYXJhbWV0ZXJUeXBlfSwgbmV3IE9iamVjdFtdIHtwYXJhbWV0ZXJ9KTsKLQl9Ci0JCi0JLyoqCi0JICogQXR0ZW1wdCB0byBnZXQgYSBmaWVsZCB2YWx1ZSwgZ2l2ZW4gdGhlIGNvbnRhaW5pbmcgb2JqZWN0IGFuZCBmaWVsZCBuYW1lLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFVzZWZ1bCBmb3IgYWNjZXNzaW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBmaWVsZHMuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBmaWVsZCBpcyBub3QgZGVmaW5lZC4KLQkgKiBPYmplY3QjZ2V0RmllbGRWYWx1ZShTdHJpbmcgZmllbGROYW1lKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBhdHRlbXB0VG9HZXRGaWVsZFZhbHVlKE9iamVjdCBvYmplY3QsIFN0cmluZyBmaWVsZE5hbWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZmllbGQob2JqZWN0LCBmaWVsZE5hbWUpLmdldChvYmplY3QpOwotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGlhZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oaWFlICsgQ1IgKyBmdWxseVF1YWxpZmllZEZpZWxkTmFtZShvYmplY3QsIGZpZWxkTmFtZSksIGlhZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQXR0ZW1wdCB0byBnZXQgYSBzdGF0aWMgZmllbGQgdmFsdWUsIGdpdmVuIHRoZSBjb250YWluaW5nIG9iamVjdCBhbmQgZmllbGQgbmFtZS4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBVc2VmdWwgZm9yIGFjY2Vzc2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgZmllbGRzLgotCSAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgZmllbGQgaXMgbm90IGRlZmluZWQuCi0JICogQ2xhc3MjZ2V0U3RhdGljRmllbGRWYWx1ZShTdHJpbmcgZmllbGROYW1lKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBhdHRlbXB0VG9HZXRTdGF0aWNGaWVsZFZhbHVlKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIGZpZWxkTmFtZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBmaWVsZChqYXZhQ2xhc3MsIGZpZWxkTmFtZSkuZ2V0KG51bGwpOwotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGlhZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oaWFlICsgQ1IgKyBmdWxseVF1YWxpZmllZEZpZWxkTmFtZShqYXZhQ2xhc3MsIGZpZWxkTmFtZSksIGlhZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIEF0dGVtcHQgdG8gZXhlY3V0ZSBhIHplcm8tYXJndW1lbnQgbWV0aG9kLAotCSAqIGdpdmVuIHRoZSByZWNlaXZlciBhbmQgbWV0aG9kIG5hbWUuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBtZXRob2QgaXMgbm90IGZvdW5kLgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogT2JqZWN0I2V4ZWN1dGUoU3RyaW5nIG1ldGhvZE5hbWUpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBhdHRlbXB0VG9FeGVjdXRlTWV0aG9kKE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1ldGhvZE5hbWUpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlyZXR1cm4gYXR0ZW1wdFRvRXhlY3V0ZU1ldGhvZChyZWNlaXZlciwgbWV0aG9kTmFtZSwgWkVST19QQVJBTUVURVJfVFlQRVMsIFpFUk9fUEFSQU1FVEVSUyk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBBdHRlbXB0IHRvIGV4ZWN1dGUgYSBtZXRob2QsIGdpdmVuIHRoZSByZWNlaXZlciwKLQkgKiBtZXRob2QgbmFtZSwgcGFyYW1ldGVyIHR5cGUsIGFuZCBwYXJhbWV0ZXIuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBtZXRob2QgaXMgbm90IGZvdW5kLgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogT2JqZWN0I2V4ZWN1dGUoU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBwYXJhbWV0ZXIpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBhdHRlbXB0VG9FeGVjdXRlTWV0aG9kKE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBwYXJhbWV0ZXIpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlyZXR1cm4gYXR0ZW1wdFRvRXhlY3V0ZU1ldGhvZChyZWNlaXZlciwgbWV0aG9kTmFtZSwgbmV3IENsYXNzW10ge3BhcmFtZXRlclR5cGV9LCBuZXcgT2JqZWN0W10ge3BhcmFtZXRlcn0pOwotCX0KLQkKLQkvKioKLQkgKiBBdHRlbXB0IHRvIGV4ZWN1dGUgYSBtZXRob2QsIGdpdmVuIHRoZSByZWNlaXZlciwKLQkgKiBtZXRob2QgbmFtZSwgcGFyYW1ldGVyIHR5cGVzLCBhbmQgcGFyYW1ldGVycy4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIG1ldGhvZCBpcyBub3QgZm91bmQuCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiBPYmplY3QjZXhlY3V0ZShTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGF0dGVtcHRUb0V4ZWN1dGVNZXRob2QoT2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBleGVjdXRlTWV0aG9kKG1ldGhvZChyZWNlaXZlciwgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpLCByZWNlaXZlciwgcGFyYW1ldGVycyk7Ci0JfQotCQotCS8qKgotCSAqIEF0dGVtcHQgdG8gZXhlY3V0ZSBhIG1ldGhvZCwgZ2l2ZW4gdGhlIHJlY2VpdmVyLAotCSAqIG1ldGhvZCBuYW1lLCBwYXJhbWV0ZXIgdHlwZXMsIGFuZCBwYXJhbWV0ZXJzLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgbWV0aG9kIGlzIG5vdCBmb3VuZC4KLQkgKiBJZiB0aGUgZXhlY3V0ZWQgbWV0aG9kIHRocm93cyBhbiBleGNlcHRpb24sIHJldGhyb3cgdGhhdCBleGNlcHRpb24uCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiBPYmplY3QjZXhlY3V0ZShTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGF0dGVtcHRUb0V4ZWN1dGVNZXRob2RXaXRoRXhjZXB0aW9uKE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIHBhcmFtZXRlcnMpIAotCQl0aHJvd3MgVGhyb3dhYmxlLCBOb1N1Y2hNZXRob2RFeGNlcHRpb24gCi0JewotCQlyZXR1cm4gZXhlY3V0ZU1ldGhvZFdpdGhFeGNlcHRpb24obWV0aG9kKHJlY2VpdmVyLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyksIHJlY2VpdmVyLCBwYXJhbWV0ZXJzKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIEF0dGVtcHQgdG8gZXhlY3V0ZSBhIHplcm8tYXJndW1lbnQgc3RhdGljIG1ldGhvZCwKLQkgKiBnaXZlbiB0aGUgY2xhc3MgYW5kIG1ldGhvZCBuYW1lLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgbWV0aG9kIGlzIG5vdCBmb3VuZC4KLQkgKiBVc2VmdWwgZm9yIGludm9raW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBtZXRob2RzLgotCSAqIENsYXNzI2V4ZWN1dGVTdGF0aWNNZXRob2QoU3RyaW5nIG1ldGhvZE5hbWUpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBhdHRlbXB0VG9FeGVjdXRlU3RhdGljTWV0aG9kKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlyZXR1cm4gYXR0ZW1wdFRvRXhlY3V0ZVN0YXRpY01ldGhvZChqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIFpFUk9fUEFSQU1FVEVSX1RZUEVTLCBaRVJPX1BBUkFNRVRFUlMpOwotCX0KLQkKLQkvKioKLQkgKiBBdHRlbXB0IHRvIGV4ZWN1dGUgYSBzdGF0aWMgbWV0aG9kLCBnaXZlbiB0aGUgY2xhc3MsCi0JICogbWV0aG9kIG5hbWUsIHBhcmFtZXRlciB0eXBlcywgYW5kIHBhcmFtZXRlcnMuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBtZXRob2QgaXMgbm90IGZvdW5kLgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogQ2xhc3MjZXhlY3V0ZVN0YXRpY01ldGhvZChTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGF0dGVtcHRUb0V4ZWN1dGVTdGF0aWNNZXRob2QoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBleGVjdXRlU3RhdGljTWV0aG9kKHN0YXRpY01ldGhvZChqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKSwgcGFyYW1ldGVycyk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBBdHRlbXB0IHRvIGV4ZWN1dGUgYSBzdGF0aWMgbWV0aG9kLCBnaXZlbiB0aGUgY2xhc3MsCi0JICogbWV0aG9kIG5hbWUsIHBhcmFtZXRlciB0eXBlLCBhbmQgcGFyYW1ldGVyLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgbWV0aG9kIGlzIG5vdCBmb3VuZC4KLQkgKiBVc2VmdWwgZm9yIGludm9raW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBtZXRob2RzLgotCSAqIENsYXNzI2V4ZWN1dGVTdGF0aWNNZXRob2QoU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBwYXJhbWV0ZXIpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBhdHRlbXB0VG9FeGVjdXRlU3RhdGljTWV0aG9kKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBwYXJhbWV0ZXIpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlyZXR1cm4gYXR0ZW1wdFRvRXhlY3V0ZVN0YXRpY01ldGhvZChqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIG5ldyBDbGFzc1tdIHtwYXJhbWV0ZXJUeXBlfSwgbmV3IE9iamVjdFtdIHtwYXJhbWV0ZXJ9KTsKLQl9Ci0JCi0JLyoqCi0JICogQXR0ZW1wdCB0byBzZXQgYSBmaWVsZCB2YWx1ZSwgZ2l2ZW4gdGhlCi0JICogY29udGFpbmluZyBvYmplY3QsIGZpZWxkIG5hbWUsIGFuZCBuZXcgZmllbGQgdmFsdWUuCi0JICogVXNlZnVsIGZvciBhY2Nlc3NpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIGZpZWxkcy4KLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIGZpZWxkIGlzIG5vdCBkZWZpbmVkLgotCSAqIE9iamVjdCNzZXRGaWVsZFZhbHVlKFN0cmluZyBmaWVsZE5hbWUsIE9iamVjdCBmaWVsZFZhbHVlKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYXR0ZW1wdFRvU2V0RmllbGRWYWx1ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgZmllbGROYW1lLCBPYmplY3QgZmllbGRWYWx1ZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWZpZWxkKG9iamVjdCwgZmllbGROYW1lKS5zZXQob2JqZWN0LCBmaWVsZFZhbHVlKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBpYWUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGlhZSArIENSICsgZnVsbHlRdWFsaWZpZWRGaWVsZE5hbWUob2JqZWN0LCBmaWVsZE5hbWUpLCBpYWUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEF0dGVtcHQgdG8gc2V0IGEgc3RhdGljIGZpZWxkIHZhbHVlLCBnaXZlbiB0aGUKLQkgKiBjb250YWluaW5nIGNsYXNzLCBmaWVsZCBuYW1lLCBhbmQgbmV3IGZpZWxkIHZhbHVlLgotCSAqIFVzZWZ1bCBmb3IgYWNjZXNzaW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBmaWVsZHMuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBmaWVsZCBpcyBub3QgZGVmaW5lZC4KLQkgKiBDbGFzcyNzZXRTdGF0aWNGaWVsZFZhbHVlKFN0cmluZyBmaWVsZE5hbWUsIE9iamVjdCBmaWVsZFZhbHVlKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYXR0ZW1wdFRvU2V0U3RhdGljRmllbGRWYWx1ZShDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBmaWVsZE5hbWUsIE9iamVjdCBmaWVsZFZhbHVlKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gewotCQl0cnkgewotCQkJZmllbGQoamF2YUNsYXNzLCBmaWVsZE5hbWUpLnNldChudWxsLCBmaWVsZFZhbHVlKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBpYWUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGlhZSArIENSICsgZnVsbHlRdWFsaWZpZWRGaWVsZE5hbWUoamF2YUNsYXNzLCBmaWVsZE5hbWUpLCBpYWUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgKHplcm8tYXJndW1lbnQpIGNvbnN0cnVjdG9yCi0JICogZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICogU2V0IGFjY2Vzc2libGUgdG8gdHJ1ZSwgc28gd2UgY2FuIGFjY2VzcwotCSAqIHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgY29uc3RydWN0b3JzLgotCSAqIENsYXNzI2NvbnN0cnVjdG9yKCkgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPFQ+IENvbnN0cnVjdG9yPFQ+IGNvbnN0cnVjdG9yKENsYXNzPFQ+IGphdmFDbGFzcykgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjb25zdHJ1Y3RvcihqYXZhQ2xhc3MsIFpFUk9fUEFSQU1FVEVSX1RZUEVTKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjb25zdHJ1Y3RvciBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcwotCSAqIGFuZCBmb3JtYWwgcGFyYW1ldGVyIHR5cGVzLgotCSAqIFNldCBhY2Nlc3NpYmxlIHRvIHRydWUsIHNvIHdlIGNhbiBhY2Nlc3MKLQkgKiBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIGNvbnN0cnVjdG9ycy4KLQkgKiBDbGFzcyNjb25zdHJ1Y3RvcihDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gQ29uc3RydWN0b3I8VD4gY29uc3RydWN0b3IoQ2xhc3M8VD4gamF2YUNsYXNzLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJQ29uc3RydWN0b3I8VD4gY29uc3RydWN0b3IgPSBqYXZhQ2xhc3MuZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcihwYXJhbWV0ZXJUeXBlcyk7Ci0JCWNvbnN0cnVjdG9yLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0JCXJldHVybiBjb25zdHJ1Y3RvcjsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiB0aGUgY29uc3RydWN0b3IgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MKLQkgKiBhbmQgZm9ybWFsIHBhcmFtZXRlciB0eXBlLgotCSAqIFNldCBhY2Nlc3NpYmxlIHRvIHRydWUsIHNvIHdlIGNhbiBhY2Nlc3MKLQkgKiBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIGNvbnN0cnVjdG9ycy4KLQkgKiBDbGFzcyNjb25zdHJ1Y3RvcihDbGFzczw/PiBwYXJhbWV0ZXJUeXBlKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gQ29uc3RydWN0b3I8VD4gY29uc3RydWN0b3IoQ2xhc3M8VD4gamF2YUNsYXNzLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNvbnN0cnVjdG9yKGphdmFDbGFzcywgbmV3IENsYXNzW10ge3BhcmFtZXRlclR5cGV9KTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkZWNsYXJlZCBmaWVsZHMgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICogU2V0IGFjY2Vzc2libGUgdG8gdHJ1ZSwgc28gd2UgY2FuIGFjY2VzcwotCSAqIHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgZmllbGRzLgotCSAqIENsYXNzI2FjY2Vzc2libGVEZWNsYXJlZEZpZWxkcygpCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWVsZFtdIGRlY2xhcmVkRmllbGRzKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlGaWVsZFtdIGZpZWxkcyA9IGphdmFDbGFzcy5nZXREZWNsYXJlZEZpZWxkcygpOwotCQlmb3IgKEZpZWxkIGZpZWxkIDogZmllbGRzKSB7Ci0JCQlmaWVsZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotCQl9Ci0JCXJldHVybiBmaWVsZHM7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVjbGFyZWQgbWV0aG9kcyBmb3IgdGhlCi0JICogc3BlY2lmaWVkIGNsYXNzLgotCSAqIFNldCBhY2Nlc3NpYmxlIHRvIHRydWUsIHNvIHdlIGNhbiBhY2Nlc3MKLQkgKiBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogQ2xhc3MjYWNjZXNzaWJsZURlY2xhcmVkTWV0aG9kcygpCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2RbXSBkZWNsYXJlZE1ldGhvZHMoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCU1ldGhvZFtdIG1ldGhvZHMgPSBqYXZhQ2xhc3MuZ2V0RGVjbGFyZWRNZXRob2RzKCk7Ci0JCWZvciAoTWV0aG9kIG1ldGhvZCA6IG1ldGhvZHMpIHsKLQkJCW1ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotCQl9Ci0JCXJldHVybiBtZXRob2RzOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgKHplcm8tYXJndW1lbnQpIGNvbnN0cnVjdG9yCi0JICogZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICogU2V0IGFjY2Vzc2libGUgdG8gdHJ1ZSwgc28gd2UgY2FuIGFjY2VzcwotCSAqIHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgY29uc3RydWN0b3JzLgotCSAqIENsYXNzI2RlZmF1bHRDb25zdHJ1Y3RvcigpCi0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gQ29uc3RydWN0b3I8VD4gZGVmYXVsdENvbnN0cnVjdG9yKENsYXNzPFQ+IGphdmFDbGFzcykgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjb25zdHJ1Y3RvcihqYXZhQ2xhc3MpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBmaWVsZCBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcyBhbmQgZmllbGQgbmFtZS4KLQkgKiBJZiB0aGUgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBkZWZpbmUgdGhlIGZpZWxkLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogU2V0IGFjY2Vzc2libGUgdG8gdHJ1ZSwgc28gd2UgY2FuIGFjY2VzcwotCSAqIHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgZmllbGRzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmllbGQgZmllbGQoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgZmllbGROYW1lKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gewotCQlGaWVsZCBmaWVsZCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlmaWVsZCA9IGphdmFDbGFzcy5nZXREZWNsYXJlZEZpZWxkKGZpZWxkTmFtZSk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIGV4KSB7Ci0JCQlDbGFzczw/PiBzdXBlcmNsYXNzID0gamF2YUNsYXNzLmdldFN1cGVyY2xhc3MoKTsKLQkJCWlmIChzdXBlcmNsYXNzID09IG51bGwpIHsKLQkJCQl0aHJvdyBleDsKLQkJCX0KLQkJCS8vIHJlY3Vyc2UKLQkJCXJldHVybiBmaWVsZChzdXBlcmNsYXNzLCBmaWVsZE5hbWUpOwotCQl9Ci0JCWZpZWxkLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0JCXJldHVybiBmaWVsZDsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIGZpZWxkIGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdCBhbmQgZmllbGQgbmFtZS4KLQkgKiBJZiB0aGUgb2JqZWN0J3MgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBkZWZpbmUgdGhlIGZpZWxkLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogU2V0IGFjY2Vzc2libGUgdG8gdHJ1ZSwgc28gd2UgY2FuIGFjY2VzcwotCSAqIHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgZmllbGRzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmllbGQgZmllbGQoT2JqZWN0IG9iamVjdCwgU3RyaW5nIGZpZWxkTmFtZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGZpZWxkKG9iamVjdC5nZXRDbGFzcygpLCBmaWVsZE5hbWUpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZnVsbHlRdWFsaWZpZWRDb25zdHJ1Y3RvclNpZ25hdHVyZShDbGFzczw/PiBqYXZhQ2xhc3MsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMpIHsKLQkJcmV0dXJuIGZ1bGx5UXVhbGlmaWVkTWV0aG9kU2lnbmF0dXJlKGphdmFDbGFzcywgbnVsbCwgcGFyYW1ldGVyVHlwZXMpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBmaWVsZC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZnVsbHlRdWFsaWZpZWRGaWVsZE5hbWUoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgZmllbGROYW1lKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoMjAwKTsKLQkJc2IuYXBwZW5kKGphdmFDbGFzcy5nZXROYW1lKCkpOwotCQlzYi5hcHBlbmQoJy4nKTsKLQkJc2IuYXBwZW5kKGZpZWxkTmFtZSk7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBmaWVsZC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZnVsbHlRdWFsaWZpZWRGaWVsZE5hbWUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIGZpZWxkTmFtZSkgewotCQlyZXR1cm4gZnVsbHlRdWFsaWZpZWRGaWVsZE5hbWUob2JqZWN0LmdldENsYXNzKCksIGZpZWxkTmFtZSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIG1ldGhvZC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZnVsbHlRdWFsaWZpZWRNZXRob2RTaWduYXR1cmUoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcykgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKDIwMCk7Ci0JCXNiLmFwcGVuZChqYXZhQ2xhc3MuZ2V0TmFtZSgpKTsKLQkJLy8gdGhpcyBjaGVjayBhbGxvd3MgdXMgdG8gdXNlIHRoaXMgY29kZSBmb3IgY29uc3RydWN0b3JzLCB3aGVyZSB0aGUgbWV0aG9kTmFtZSBpcyBudWxsCi0JCWlmIChtZXRob2ROYW1lICE9IG51bGwpIHsKLQkJCXNiLmFwcGVuZCgnLicpOwotCQkJc2IuYXBwZW5kKG1ldGhvZE5hbWUpOwotCQl9Ci0JCXNiLmFwcGVuZCgnKCcpOwotCQlpbnQgbWF4ID0gcGFyYW1ldGVyVHlwZXMubGVuZ3RoIC0gMTsKLQkJaWYgKG1heCAhPSAtMSkgewotCQkJLy8gc3RvcCBvbmUgc2hvcnQgb2YgdGhlIGVuZCBvZiB0aGUgYXJyYXkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKLQkJCQlzYi5hcHBlbmQocGFyYW1ldGVyVHlwZXNbaV0uZ2V0TmFtZSgpKTsKLQkJCQlzYi5hcHBlbmQoIiwgIik7Ci0JCQl9Ci0JCQlzYi5hcHBlbmQocGFyYW1ldGVyVHlwZXNbbWF4XS5nZXROYW1lKCkpOwotCQl9Ci0JCXNiLmFwcGVuZCgnKScpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgbWV0aG9kLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBmdWxseVF1YWxpZmllZE1ldGhvZFNpZ25hdHVyZShPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzKSB7Ci0JCXJldHVybiBmdWxseVF1YWxpZmllZE1ldGhvZFNpZ25hdHVyZShyZWNlaXZlci5nZXRDbGFzcygpLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0JfQotCQotCS8qKgotCSAqIEdldCBhIGZpZWxkIHZhbHVlLCBnaXZlbiB0aGUgY29udGFpbmluZyBvYmplY3QgYW5kIGZpZWxkIG5hbWUuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVXNlZnVsIGZvciBhY2Nlc3NpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIGZpZWxkcy4KLQkgKiBPYmplY3QjZ2V0RmllbGRWYWx1ZShTdHJpbmcgZmllbGROYW1lKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldEZpZWxkVmFsdWUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIGZpZWxkTmFtZSkgewotCQl0cnkgewotCQkJcmV0dXJuIGF0dGVtcHRUb0dldEZpZWxkVmFsdWUob2JqZWN0LCBmaWVsZE5hbWUpOwotCQl9IGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBuc2ZlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihuc2ZlICsgQ1IgKyBmdWxseVF1YWxpZmllZEZpZWxkTmFtZShvYmplY3QsIGZpZWxkTmFtZSksIG5zZmUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEdldCBhIHN0YXRpYyBmaWVsZCB2YWx1ZSwgZ2l2ZW4gdGhlIGNvbnRhaW5pbmcgY2xhc3MgYW5kIGZpZWxkIG5hbWUuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVXNlZnVsIGZvciBhY2Nlc3NpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIGZpZWxkcy4KLQkgKiBDbGFzcyNnZXRTdGF0aWNGaWVsZFZhbHVlKFN0cmluZyBmaWVsZE5hbWUpCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0U3RhdGljRmllbGRWYWx1ZShDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBmaWVsZE5hbWUpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBhdHRlbXB0VG9HZXRTdGF0aWNGaWVsZFZhbHVlKGphdmFDbGFzcywgZmllbGROYW1lKTsKLQkJfSBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gbnNmZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obnNmZSArIENSICsgZnVsbHlRdWFsaWZpZWRGaWVsZE5hbWUoamF2YUNsYXNzLCBmaWVsZE5hbWUpLCBuc2ZlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogRXhlY3V0ZSBhIHplcm8tYXJndW1lbnQgbWV0aG9kLCBnaXZlbiB0aGUgcmVjZWl2ZXIgYW5kIG1ldGhvZCBuYW1lLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogT2JqZWN0I2V4ZWN1dGUoU3RyaW5nIG1ldGhvZE5hbWUpCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZXhlY3V0ZU1ldGhvZChPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXRob2ROYW1lKSB7Ci0JCXJldHVybiBleGVjdXRlTWV0aG9kKHJlY2VpdmVyLCBtZXRob2ROYW1lLCBaRVJPX1BBUkFNRVRFUl9UWVBFUywgWkVST19QQVJBTUVURVJTKTsKLQl9Ci0JCi0JLyoqCi0JICogRXhlY3V0ZSBhIG1ldGhvZCwgZ2l2ZW4gdGhlIHJlY2VpdmVyLAotCSAqIG1ldGhvZCBuYW1lLCBwYXJhbWV0ZXIgdHlwZXMsIGFuZCBwYXJhbWV0ZXJzLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogT2JqZWN0I2V4ZWN1dGUoU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIHBhcmFtZXRlcnMpCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZXhlY3V0ZU1ldGhvZChPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gYXR0ZW1wdFRvRXhlY3V0ZU1ldGhvZChyZWNlaXZlciwgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMsIHBhcmFtZXRlcnMpOwotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gbnNtZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obnNtZSArIENSICsgZnVsbHlRdWFsaWZpZWRNZXRob2RTaWduYXR1cmUocmVjZWl2ZXIsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKSwgbnNtZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIEV4ZWN1dGUgYSBvbmUtYXJndW1lbnQgbWV0aG9kLCBnaXZlbiB0aGUgcmVjZWl2ZXIsCi0JICogbWV0aG9kIG5hbWUsIHBhcmFtZXRlciB0eXBlLCBhbmQgcGFyYW1ldGVyLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogT2JqZWN0I2V4ZWN1dGUoU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBwYXJhbWV0ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZXhlY3V0ZU1ldGhvZChPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgcGFyYW1ldGVyKSB7Ci0JCXJldHVybiBleGVjdXRlTWV0aG9kKHJlY2VpdmVyLCBtZXRob2ROYW1lLCBuZXcgQ2xhc3NbXSB7cGFyYW1ldGVyVHlwZX0sIG5ldyBPYmplY3RbXSB7cGFyYW1ldGVyfSk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBFeGVjdXRlIGEgemVyby1hcmd1bWVudCBtZXRob2QsIGdpdmVuIHRoZSByZWNlaXZlciBhbmQgbWV0aG9kIG5hbWUuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogSWYgdGhlIG1ldGhvZCB0aHJvd3MgYW4gZXhjZXB0aW9uLCByZXRocm93IHRoYXQgZXhjZXB0aW9uLgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogT2JqZWN0I2V4ZWN1dGUoU3RyaW5nIG1ldGhvZE5hbWUpCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZXhlY3V0ZU1ldGhvZFdpdGhFeGNlcHRpb24oT2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgbWV0aG9kTmFtZSkgCi0JCXRocm93cyBUaHJvd2FibGUKLQl7Ci0JCXJldHVybiBleGVjdXRlTWV0aG9kV2l0aEV4Y2VwdGlvbihyZWNlaXZlciwgbWV0aG9kTmFtZSwgWkVST19QQVJBTUVURVJfVFlQRVMsIFpFUk9fUEFSQU1FVEVSUyk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBFeGVjdXRlIGEgb25lLWFyZ3VtZW50IG1ldGhvZCwgZ2l2ZW4gdGhlIHJlY2VpdmVyLAotCSAqIG1ldGhvZCBuYW1lLCBwYXJhbWV0ZXIgdHlwZSwgYW5kIHBhcmFtZXRlci4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBJZiB0aGUgbWV0aG9kIHRocm93cyBhbiBleGNlcHRpb24sIHJldGhyb3cgdGhhdCBleGNlcHRpb24uCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiBPYmplY3QjZXhlY3V0ZShTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IHBhcmFtZXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBleGVjdXRlTWV0aG9kV2l0aEV4Y2VwdGlvbihPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgcGFyYW1ldGVyKSAKLQkJdGhyb3dzIFRocm93YWJsZQotCXsKLQkJcmV0dXJuIGV4ZWN1dGVNZXRob2RXaXRoRXhjZXB0aW9uKHJlY2VpdmVyLCBtZXRob2ROYW1lLCBuZXcgQ2xhc3NbXSB7cGFyYW1ldGVyVHlwZX0sIG5ldyBPYmplY3RbXSB7cGFyYW1ldGVyfSk7Ci0JfQotCQotCS8qKgotCSAqIEV4ZWN1dGUgYSBtZXRob2QsIGdpdmVuIHRoZSByZWNlaXZlciwKLQkgKiBtZXRob2QgbmFtZSwgcGFyYW1ldGVyIHR5cGVzLCBhbmQgcGFyYW1ldGVycy4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBJZiB0aGUgbWV0aG9kIHRocm93cyBhbiBleGNlcHRpb24sIHJldGhyb3cgdGhhdCBleGNlcHRpb24uCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiBPYmplY3QjZXhlY3V0ZShTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBleGVjdXRlTWV0aG9kV2l0aEV4Y2VwdGlvbihPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKSAKLQkJdGhyb3dzIFRocm93YWJsZQotCXsKLQkJdHJ5IHsKLQkJCXJldHVybiBhdHRlbXB0VG9FeGVjdXRlTWV0aG9kV2l0aEV4Y2VwdGlvbihyZWNlaXZlciwgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMsIHBhcmFtZXRlcnMpOwotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gbnNtZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obnNtZSArIENSICsgZnVsbHlRdWFsaWZpZWRNZXRob2RTaWduYXR1cmUocmVjZWl2ZXIsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKSwgbnNtZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogRXhlY3V0ZSB0aGUgc3BlY2lmaWVkIG1ldGhvZCB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycy4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBDb252ZXJ0IGV4Y2VwdGlvbnMgdG8gUnVudGltZUV4Y2VwdGlvbnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZXhlY3V0ZU1ldGhvZChNZXRob2QgbWV0aG9kLCBPYmplY3QgcmVjZWl2ZXIsIE9iamVjdFtdIHBhcmFtZXRlcnMpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBtZXRob2QuaW52b2tlKHJlY2VpdmVyLCBwYXJhbWV0ZXJzKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBpYWUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGlhZSArIENSICsgbWV0aG9kLCBpYWUpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGl0ZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obWV0aG9kICsgQ1IgKyBpdGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCksIGl0ZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogRXhlY3V0ZSB0aGUgc3BlY2lmaWVkIG1ldGhvZCB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycy4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBJZiB0aGUgbWV0aG9kIHRocm93cyBhbiBleGNlcHRpb24sIHJldGhyb3cgdGhhdCBleGNlcHRpb24uCi0JICogQ29udmVydCBhbGwgb3RoZXIgZXhjZXB0aW9ucyB0byBSdW50aW1lRXhjZXB0aW9ucy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBleGVjdXRlTWV0aG9kV2l0aEV4Y2VwdGlvbihNZXRob2QgbWV0aG9kLCBPYmplY3QgcmVjZWl2ZXIsIE9iamVjdFtdIHBhcmFtZXRlcnMpCi0JCXRocm93cyBUaHJvd2FibGUKLQl7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gbWV0aG9kLmludm9rZShyZWNlaXZlciwgcGFyYW1ldGVycyk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gaWFlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihpYWUgKyBDUiArIG1ldGhvZCwgaWFlKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBpdGUpIHsKLQkJCVRocm93YWJsZSBjYXVzZSA9IGl0ZS5nZXRDYXVzZSgpOwotCQkJaWYgKGNhdXNlID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihtZXRob2QudG9TdHJpbmcoKSwgaXRlKTsKLQkJCX0KLQkJCXRocm93IGNhdXNlOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBFeGVjdXRlIGEgemVyby1hcmd1bWVudCBzdGF0aWMgbWV0aG9kLAotCSAqIGdpdmVuIHRoZSBjbGFzcyBhbmQgbWV0aG9kIG5hbWUuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiBDbGFzcyNleGVjdXRlU3RhdGljTWV0aG9kKFN0cmluZyBtZXRob2ROYW1lKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGV4ZWN1dGVTdGF0aWNNZXRob2QoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSkgewotCQlyZXR1cm4gZXhlY3V0ZVN0YXRpY01ldGhvZChqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIFpFUk9fUEFSQU1FVEVSX1RZUEVTLCBaRVJPX1BBUkFNRVRFUlMpOwotCX0KLQkKLQkvKioKLQkgKiBFeGVjdXRlIGEgc3RhdGljIG1ldGhvZCwgZ2l2ZW4gdGhlIGNsYXNzLAotCSAqIG1ldGhvZCBuYW1lLCBwYXJhbWV0ZXIgdHlwZXMsIGFuZCBwYXJhbWV0ZXJzLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogQ2xhc3MjZXhlY3V0ZVN0YXRpY01ldGhvZChTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBleGVjdXRlU3RhdGljTWV0aG9kKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIHBhcmFtZXRlcnMpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBhdHRlbXB0VG9FeGVjdXRlU3RhdGljTWV0aG9kKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMsIHBhcmFtZXRlcnMpOwotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gbnNtZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obnNtZSArIENSICsgZnVsbHlRdWFsaWZpZWRNZXRob2RTaWduYXR1cmUoamF2YUNsYXNzLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyksIG5zbWUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBFeGVjdXRlIGEgc3RhdGljIG1ldGhvZCwgZ2l2ZW4gdGhlIGNsYXNzLAotCSAqIG1ldGhvZCBuYW1lLCBwYXJhbWV0ZXIgdHlwZSwgYW5kIHBhcmFtZXRlci4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBVc2VmdWwgZm9yIGludm9raW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBtZXRob2RzLgotCSAqIENsYXNzI2V4ZWN1dGVTdGF0aWNNZXRob2QoU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBwYXJhbWV0ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZXhlY3V0ZVN0YXRpY01ldGhvZChDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgcGFyYW1ldGVyKSB7Ci0JCXJldHVybiBleGVjdXRlU3RhdGljTWV0aG9kKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgbmV3IENsYXNzW10ge3BhcmFtZXRlclR5cGV9LCBuZXcgT2JqZWN0W10ge3BhcmFtZXRlcn0pOwotCX0KLQkKLQkvKioKLQkgKiBFeGVjdXRlIHRoZSBzcGVjaWZpZWQgc3RhdGljIG1ldGhvZCB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycy4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBDb252ZXJ0IGV4Y2VwdGlvbnMgdG8gUnVudGltZUV4Y2VwdGlvbnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZXhlY3V0ZVN0YXRpY01ldGhvZChNZXRob2QgbWV0aG9kLCBPYmplY3RbXSBwYXJhbWV0ZXJzKSB7Ci0JCXJldHVybiBleGVjdXRlTWV0aG9kKG1ldGhvZCwgbnVsbCwgcGFyYW1ldGVycyk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSB6ZXJvLWFyZ3VtZW50IG1ldGhvZCBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcwotCSAqIGFuZCBtZXRob2QgbmFtZS4gSWYgdGhlIGNsYXNzIGRvZXMgbm90IGRpcmVjdGx5Ci0JICogaW1wbGVtZW50IHRoZSBtZXRob2QsIGxvb2sgZm9yIGl0IGluIHRoZSBjbGFzcydzIHN1cGVyY2xhc3Nlcy4KLQkgKiBTZXQgYWNjZXNzaWJsZSB0byB0cnVlLCBzbyB3ZSBjYW4gYWNjZXNzCi0JICogcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBtZXRob2RzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kIG1ldGhvZChDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG1ldGhvZChqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIFpFUk9fUEFSQU1FVEVSX1RZUEVTKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgbWV0aG9kIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzLCBtZXRob2QgbmFtZSwKLQkgKiBhbmQgZm9ybWFsIHBhcmFtZXRlciB0eXBlcy4gSWYgdGhlIGNsYXNzIGRvZXMgbm90IGRpcmVjdGx5Ci0JICogaW1wbGVtZW50IHRoZSBtZXRob2QsIGxvb2sgZm9yIGl0IGluIHRoZSBjbGFzcydzIHN1cGVyY2xhc3Nlcy4KLQkgKiBTZXQgYWNjZXNzaWJsZSB0byB0cnVlLCBzbyB3ZSBjYW4gYWNjZXNzCi0JICogcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBtZXRob2RzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kIG1ldGhvZChDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJTWV0aG9kIG1ldGhvZCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltZXRob2QgPSBqYXZhQ2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QobWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZXgpIHsKLQkJCUNsYXNzPD8+IHN1cGVyY2xhc3MgPSBqYXZhQ2xhc3MuZ2V0U3VwZXJjbGFzcygpOwotCQkJaWYgKHN1cGVyY2xhc3MgPT0gbnVsbCkgewotCQkJCXRocm93IGV4OwotCQkJfQotCQkJLy8gcmVjdXJzZQotCQkJcmV0dXJuIG1ldGhvZChzdXBlcmNsYXNzLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0JCX0KLQkJbWV0aG9kLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0JCXJldHVybiBtZXRob2Q7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSBtZXRob2QgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MsIG1ldGhvZCBuYW1lLAotCSAqIGFuZCBmb3JtYWwgcGFyYW1ldGVyIHR5cGUuIElmIHRoZSBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGltcGxlbWVudCB0aGUgbWV0aG9kLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogU2V0IGFjY2Vzc2libGUgdG8gdHJ1ZSwgc28gd2UgY2FuIGFjY2VzcwotCSAqIHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBtZXRob2QoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSkgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBtZXRob2QoamF2YUNsYXNzLCBtZXRob2ROYW1lLCBuZXcgQ2xhc3NbXSB7cGFyYW1ldGVyVHlwZX0pOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgemVyby1hcmd1bWVudCBtZXRob2QgZm9yIHRoZSBzcGVjaWZpZWQgb2JqZWN0Ci0JICogYW5kIG1ldGhvZCBuYW1lLiBJZiB0aGUgb2JqZWN0J3MgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBpbXBsZW1lbnQgdGhlIG1ldGhvZCwgbG9vayBmb3IgaXQgaW4gdGhlIGNsYXNzJ3Mgc3VwZXJjbGFzc2VzLgotCSAqIFNldCBhY2Nlc3NpYmxlIHRvIHRydWUsIHNvIHdlIGNhbiBhY2Nlc3MKLQkgKiBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIG1ldGhvZHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2QgbWV0aG9kKE9iamVjdCBvYmplY3QsIFN0cmluZyBtZXRob2ROYW1lKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG1ldGhvZChvYmplY3QuZ2V0Q2xhc3MoKSwgbWV0aG9kTmFtZSk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSBtZXRob2QgZm9yIHRoZSBzcGVjaWZpZWQgb2JqZWN0LCBtZXRob2QgbmFtZSwKLQkgKiBhbmQgZm9ybWFsIHBhcmFtZXRlciB0eXBlcy4gSWYgdGhlIG9iamVjdCdzIGNsYXNzIGRvZXMgbm90IGRpcmVjdGx5Ci0JICogaW1wbGVtZW50IHRoZSBtZXRob2QsIGxvb2sgZm9yIGl0IGluIHRoZSBjbGFzcydzIHN1cGVyY2xhc3Nlcy4KLQkgKiBTZXQgYWNjZXNzaWJsZSB0byB0cnVlLCBzbyB3ZSBjYW4gYWNjZXNzCi0JICogcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBtZXRob2RzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kIG1ldGhvZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcykgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBtZXRob2Qob2JqZWN0LmdldENsYXNzKCksIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIG1ldGhvZCBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3QsIG1ldGhvZCBuYW1lLAotCSAqIGFuZCBmb3JtYWwgcGFyYW1ldGVyIHR5cGUuIElmIHRoZSBvYmplY3QncyBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGltcGxlbWVudCB0aGUgbWV0aG9kLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogU2V0IGFjY2Vzc2libGUgdG8gdHJ1ZSwgc28gd2UgY2FuIGFjY2VzcwotCSAqIHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBtZXRob2QoT2JqZWN0IG9iamVjdCwgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlyZXR1cm4gbWV0aG9kKG9iamVjdC5nZXRDbGFzcygpLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIGNsYXNzLC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzPD8+IGNsYXNzRm9yTmFtZShTdHJpbmcgamF2YUNsYXNzTmFtZSkgewotCQl0cnkgewotCQkJcmV0dXJuIENsYXNzLmZvck5hbWUoamF2YUNsYXNzTmFtZSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGphdmFDbGFzc05hbWUsIGV4KTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MsCi0JICogdXNpbmcgdGhlIGNsYXNzJ3MgZGVmYXVsdCAoemVyby1hcmd1bWVudCkgY29uc3RydWN0b3IuCi0JICogQ2xhc3MjbmV3SW5zdGFuY2UoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPFQ+IFQgbmV3SW5zdGFuY2UoQ2xhc3M8VD4gamF2YUNsYXNzKSB7Ci0JCXJldHVybiBuZXdJbnN0YW5jZShqYXZhQ2xhc3MsIFpFUk9fUEFSQU1FVEVSX1RZUEVTLCBaRVJPX1BBUkFNRVRFUlMpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MsCi0JICogdXNpbmcgdGhlIGNsYXNzJ3MgZGVmYXVsdCAoemVyby1hcmd1bWVudCkgY29uc3RydWN0b3IuCi0JICogQ2xhc3MjbmV3SW5zdGFuY2UoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IG5ld0luc3RhbmNlKFN0cmluZyBqYXZhQ2xhc3NOYW1lKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXdJbnN0YW5jZShqYXZhQ2xhc3NOYW1lLCBDbGFzc1Rvb2xzLmNsYXNzLmdldENsYXNzTG9hZGVyKCkpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MsCi0JICogdXNpbmcgdGhlIGNsYXNzJ3MgZGVmYXVsdCAoemVyby1hcmd1bWVudCkgY29uc3RydWN0b3IuCi0JICogQ2xhc3MjbmV3SW5zdGFuY2UoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IG5ld0luc3RhbmNlKFN0cmluZyBqYXZhQ2xhc3NOYW1lLCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3SW5zdGFuY2UoY2xhc3NMb2FkZXIubG9hZENsYXNzKGphdmFDbGFzc05hbWUpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MsCi0JICogZ2l2ZW4gdGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlciB0eXBlcyBhbmQgcGFyYW1ldGVycy4KLQkgKiBDbGFzcyNuZXdJbnN0YW5jZShDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPFQ+IFQgbmV3SW5zdGFuY2UoQ2xhc3M8VD4gamF2YUNsYXNzLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gYXR0ZW1wdE5ld0luc3RhbmNlKGphdmFDbGFzcywgcGFyYW1ldGVyVHlwZXMsIHBhcmFtZXRlcnMpOwotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gbnNtZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obnNtZSArIENSICsgZnVsbHlRdWFsaWZpZWRDb25zdHJ1Y3RvclNpZ25hdHVyZShqYXZhQ2xhc3MsIHBhcmFtZXRlclR5cGVzKSwgbnNtZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MsCi0JICogZ2l2ZW4gdGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlciB0eXBlcyBhbmQgcGFyYW1ldGVycy4KLQkgKiBDbGFzcyNuZXdJbnN0YW5jZShDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IG5ld0luc3RhbmNlKFN0cmluZyBqYXZhQ2xhc3NOYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXdJbnN0YW5jZShqYXZhQ2xhc3NOYW1lLCBwYXJhbWV0ZXJUeXBlcywgcGFyYW1ldGVycywgQ2xhc3NUb29scy5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MsCi0JICogZ2l2ZW4gdGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlciB0eXBlcyBhbmQgcGFyYW1ldGVycy4KLQkgKiBDbGFzcyNuZXdJbnN0YW5jZShDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IG5ld0luc3RhbmNlKFN0cmluZyBqYXZhQ2xhc3NOYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzLCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3SW5zdGFuY2UoY2xhc3NMb2FkZXIubG9hZENsYXNzKGphdmFDbGFzc05hbWUpLCBwYXJhbWV0ZXJUeXBlcywgcGFyYW1ldGVycyk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBjbGFzcywKLQkgKiBnaXZlbiB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVyIHR5cGUgYW5kIHBhcmFtZXRlci4KLQkgKiBDbGFzcyNuZXdJbnN0YW5jZShDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgcGFyYW1ldGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPFQ+IFQgbmV3SW5zdGFuY2UoQ2xhc3M8VD4gamF2YUNsYXNzLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgcGFyYW1ldGVyKSB7Ci0JCXJldHVybiBuZXdJbnN0YW5jZShqYXZhQ2xhc3MsIG5ldyBDbGFzc1tdIHtwYXJhbWV0ZXJUeXBlfSwgbmV3IE9iamVjdFtdIHtwYXJhbWV0ZXJ9KTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MsCi0JICogZ2l2ZW4gdGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlciB0eXBlIGFuZCBwYXJhbWV0ZXIuCi0JICogQ2xhc3MjbmV3SW5zdGFuY2UoQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IHBhcmFtZXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBuZXdJbnN0YW5jZShTdHJpbmcgamF2YUNsYXNzTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IHBhcmFtZXRlcikgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3SW5zdGFuY2UoamF2YUNsYXNzTmFtZSwgcGFyYW1ldGVyVHlwZSwgcGFyYW1ldGVyLCBDbGFzc1Rvb2xzLmNsYXNzLmdldENsYXNzTG9hZGVyKCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBjbGFzcywKLQkgKiBnaXZlbiB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVyIHR5cGUgYW5kIHBhcmFtZXRlci4KLQkgKiBDbGFzcyNuZXdJbnN0YW5jZShDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgcGFyYW1ldGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IG5ld0luc3RhbmNlKFN0cmluZyBqYXZhQ2xhc3NOYW1lLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgcGFyYW1ldGVyLCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3SW5zdGFuY2UoY2xhc3NMb2FkZXIubG9hZENsYXNzKGphdmFDbGFzc05hbWUpLCBwYXJhbWV0ZXJUeXBlLCBwYXJhbWV0ZXIpOwotCX0KLQkKLQkvKioKLQkgKiBQdXNoIHRoZSBkZWNsYXJlZCBmaWVsZHMgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MKLQkgKiBvbnRvIHRoZSB0b3Agb2YgdGhlIHN0YWNrLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgcHVzaERlY2xhcmVkRmllbGRzKENsYXNzPD8+IGphdmFDbGFzcywgU3RhY2s8RmllbGQ+IHN0YWNrKSB7Ci0JCUZpZWxkW10gZmllbGRzID0gZGVjbGFyZWRGaWVsZHMoamF2YUNsYXNzKTsKLQkJZm9yIChpbnQgaSA9IGZpZWxkcy5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJc3RhY2sucHVzaChmaWVsZHNbaV0pOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFB1c2ggdGhlIGRlY2xhcmVkIG1ldGhvZHMgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MKLQkgKiBvbnRvIHRoZSB0b3Agb2YgdGhlIHN0YWNrLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgcHVzaERlY2xhcmVkTWV0aG9kcyhDbGFzczw/PiBqYXZhQ2xhc3MsIFN0YWNrPE1ldGhvZD4gc3RhY2spIHsKLQkJTWV0aG9kW10gbWV0aG9kcyA9IGRlY2xhcmVkTWV0aG9kcyhqYXZhQ2xhc3MpOwotCQlmb3IgKGludCBpID0gbWV0aG9kcy5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJc3RhY2sucHVzaChtZXRob2RzW2ldKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBTZXQgYSBmaWVsZCB2YWx1ZSwgZ2l2ZW4gdGhlIGNvbnRhaW5pbmcgb2JqZWN0LCBmaWVsZCBuYW1lLCBhbmQgbmV3IGZpZWxkIHZhbHVlLgotCSAqIFVzZWZ1bCBmb3IgYWNjZXNzaW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBmaWVsZHMuCi0JICogT2JqZWN0I3NldEZpZWxkVmFsdWUoU3RyaW5nIGZpZWxkTmFtZSwgT2JqZWN0IGZpZWxkVmFsdWUpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEZpZWxkVmFsdWUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIGZpZWxkTmFtZSwgT2JqZWN0IGZpZWxkVmFsdWUpIHsKLQkJdHJ5IHsKLQkJCWF0dGVtcHRUb1NldEZpZWxkVmFsdWUob2JqZWN0LCBmaWVsZE5hbWUsIGZpZWxkVmFsdWUpOwotCQl9IGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBuc2ZlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihuc2ZlICsgQ1IgKyBmdWxseVF1YWxpZmllZEZpZWxkTmFtZShvYmplY3QsIGZpZWxkTmFtZSksIG5zZmUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFNldCBhIHN0YXRpYyBmaWVsZCB2YWx1ZSwgZ2l2ZW4gdGhlIGNvbnRhaW5pbmcgY2xhc3MsIGZpZWxkIG5hbWUsIGFuZCBuZXcgZmllbGQgdmFsdWUuCi0JICogVXNlZnVsIGZvciBhY2Nlc3NpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIGZpZWxkcy4KLQkgKiBDbGFzcyNzZXRTdGF0aWNGaWVsZFZhbHVlKFN0cmluZyBmaWVsZE5hbWUsIE9iamVjdCBmaWVsZFZhbHVlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTdGF0aWNGaWVsZFZhbHVlKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIGZpZWxkTmFtZSwgT2JqZWN0IGZpZWxkVmFsdWUpIHsKLQkJdHJ5IHsKLQkJCWF0dGVtcHRUb1NldFN0YXRpY0ZpZWxkVmFsdWUoamF2YUNsYXNzLCBmaWVsZE5hbWUsIGZpZWxkVmFsdWUpOwotCQl9IGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBuc2ZlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihuc2ZlICsgQ1IgKyBmdWxseVF1YWxpZmllZEZpZWxkTmFtZShqYXZhQ2xhc3MsIGZpZWxkTmFtZSksIG5zZmUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2hvcnQgbmFtZSBvZiB0aGUgb2JqZWN0J3MgY2xhc3MuCi0JICogQ2xhc3MjZ2V0U2hvcnROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzaG9ydENsYXNzTmFtZUZvck9iamVjdChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBzaG9ydE5hbWVGb3Iob2JqZWN0LmdldENsYXNzKCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNob3J0IG5hbWUgb2YgdGhlIGNsYXNzIChlLmcuICJPYmplY3QiKS4KLQkgKiBDbGFzcyNnZXRTaG9ydE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNob3J0TmFtZUZvckNsYXNzTmFtZWQoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gY2xhc3NOYW1lLnN1YnN0cmluZyhjbGFzc05hbWUubGFzdEluZGV4T2YoJy4nKSArIDEpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNob3J0IG5hbWUgb2YgdGhlIGNsYXNzIChlLmcuICJPYmplY3QiKS4KLQkgKiBDbGFzcyNnZXRTaG9ydE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNob3J0TmFtZUZvcihDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJcmV0dXJuIHNob3J0TmFtZUZvckNsYXNzTmFtZWQoamF2YUNsYXNzLmdldE5hbWUoKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbmVzdGVkIG5hbWUgb2YgdGhlIG9iamVjdCdzIGNsYXNzLgotCSAqIENsYXNzI2dldE5lc3RlZE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5lc3RlZENsYXNzTmFtZUZvck9iamVjdChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBuZXN0ZWROYW1lRm9yKG9iamVjdC5nZXRDbGFzcygpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuZXN0ZWQgbmFtZSBvZiB0aGUgY2xhc3MgKGUuZy4gIkVudHJ5IikuCi0JICogQ2xhc3MjZ2V0TmVzdGVkTmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmVzdGVkTmFtZUZvckNsYXNzTmFtZWQoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gY2xhc3NOYW1lLnN1YnN0cmluZyhjbGFzc05hbWUubGFzdEluZGV4T2YoTkVTVEVEX0NMQVNTX05BTUVfU0VQQVJBVE9SKSArIDEpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5lc3RlZCBuYW1lIG9mIHRoZSBjbGFzcyAoZS5nLiAiRW50cnkiKS4KLQkgKiBDbGFzcyNnZXROZXN0ZWROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBuZXN0ZWROYW1lRm9yKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlyZXR1cm4gbmVzdGVkTmFtZUZvckNsYXNzTmFtZWQoamF2YUNsYXNzLmdldE5hbWUoKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgInRvU3RyaW5nKCkiIG5hbWUgb2YgdGhlIG9iamVjdCdzIGNsYXNzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvU3RyaW5nQ2xhc3NOYW1lRm9yT2JqZWN0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHRvU3RyaW5nTmFtZUZvcihvYmplY3QuZ2V0Q2xhc3MoKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgInRvU3RyaW5nKCkiIG5hbWUgb2YgdGhlIGNsYXNzLgotCSAqICJNZW1iZXIiIGNsYXNzZXMgd2lsbCByZXR1cm4gb25seSB0aGUgZmluYWwgbmFtZToKLQkgKiAgICAgImNvbS5mb28uYmFyLlRvcExldmVsQ2xhc3MkTWVtYmVyQ2xhc3MkTmVzdGVkTWVtYmVyQ2xhc3MiCi0JICogICAgICAgICA9PiAiTmVzdGVkTWVtYmVyQ2xhc3MiCi0JICogIkxvY2FsIiBhbmQgImFub255bW91cyIgY2xhc3NlcyB3aWxsIHN0aWxsIHJldHVybiB0aGUgZW1iZWRkZWQgJyQnczoKLQkgKiAgICAgImNvbS5mb28uYmFyLlRvcExldmVsQ2xhc3MkMUxvY2FsQ2xhc3MiCi0JICogICAgICAgICA9PiAiVG9wTGV2ZWxDbGFzcyQxTG9jYWxDbGFzcyIKLQkgKiAgICAgImNvbS5mb28uYmFyLlRvcExldmVsQ2xhc3MkMSIKLQkgKiAgICAgICAgID0+ICJUb3BMZXZlbENsYXNzJDEiCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmdOYW1lRm9yQ2xhc3NOYW1lZChTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiBjbGFzc05hbWVkSXNNZW1iZXIoY2xhc3NOYW1lKSA/Ci0JCQljbGFzc05hbWUuc3Vic3RyaW5nKGNsYXNzTmFtZS5sYXN0SW5kZXhPZihORVNURURfQ0xBU1NfTkFNRV9TRVBBUkFUT1IpICsgMSkKLQkJOgotCQkJY2xhc3NOYW1lLnN1YnN0cmluZyhjbGFzc05hbWUubGFzdEluZGV4T2YoJy4nKSArIDEpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlICJ0b1N0cmluZygpIiBuYW1lIG9mIHRoZSBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b1N0cmluZ05hbWVGb3IoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCXJldHVybiB0b1N0cmluZ05hbWVGb3JDbGFzc05hbWVkKGphdmFDbGFzcy5nZXROYW1lKCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHBhY2thZ2UgbmFtZSBvZiB0aGUgY2xhc3MgKGUuZy4gImphdmEubGFuZyIpLgotCSAqIENsYXNzI2dldFBhY2thZ2VOYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwYWNrYWdlTmFtZUZvcihDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJcmV0dXJuIHBhY2thZ2VOYW1lRm9yQ2xhc3NOYW1lZChqYXZhQ2xhc3MuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwYWNrYWdlIG5hbWUgb2YgdGhlIGNsYXNzIChlLmcuICJqYXZhLmxhbmciKS4KLQkgKiBDbGFzcyNnZXRQYWNrYWdlTmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGFja2FnZU5hbWVGb3JDbGFzc05hbWVkKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJaW50IGxhc3RQZXJpb2QgPSBjbGFzc05hbWUubGFzdEluZGV4T2YoJy4nKTsKLQkJaWYgKGxhc3RQZXJpb2QgPT0gLTEpIHsKLQkJCXJldHVybiAiIjsKLQkJfQotCQlyZXR1cm4gY2xhc3NOYW1lLnN1YnN0cmluZygwLCBsYXN0UGVyaW9kKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaG9ydCBuYW1lIG9mIHRoZSBjbGFzcywKLQkgKiBmb2xsb3dlZCBieSBpdHMgcGFja2FnZSBuYW1lIChlLmcuICJPYmplY3QgKGphdmEubGFuZykiKS4KLQkgKiBDbGFzcyNnZXRTaG9ydE5hbWVXaXRoUGFja2FnZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2hvcnROYW1lV2l0aFBhY2thZ2UoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoMjAwKTsKLQkJc2IuYXBwZW5kKHNob3J0TmFtZUZvcihqYXZhQ2xhc3MpKTsKLQkJaWYgKCAhIGphdmFDbGFzcy5pc1ByaW1pdGl2ZSgpKSB7Ci0JCQlzYi5hcHBlbmQoIiAoIik7Ci0JCQlzYi5hcHBlbmQocGFja2FnZU5hbWVGb3IoamF2YUNsYXNzKSk7Ci0JCQlzYi5hcHBlbmQoJyknKTsKLQkJfQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIHplcm8tYXJndW1lbnQsIHN0YXRpYyBtZXRob2QgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MKLQkgKiBhbmQgbWV0aG9kIG5hbWUuIElmIHRoZSBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGltcGxlbWVudCB0aGUgbWV0aG9kLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogU2V0IGFjY2Vzc2libGUgdG8gdHJ1ZSwgc28gd2UgY2FuIGFjY2VzcwotCSAqIHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBzdGF0aWNNZXRob2QoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSkgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBzdGF0aWNNZXRob2QoamF2YUNsYXNzLCBtZXRob2ROYW1lLCBaRVJPX1BBUkFNRVRFUl9UWVBFUyk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIHN0YXRpYyBtZXRob2QgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MsIG1ldGhvZCBuYW1lLAotCSAqIGFuZCBmb3JtYWwgcGFyYW1ldGVyIHR5cGVzLiBJZiB0aGUgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBpbXBsZW1lbnQgdGhlIG1ldGhvZCwgbG9vayBmb3IgaXQgaW4gdGhlIGNsYXNzJ3Mgc3VwZXJjbGFzc2VzLgotCSAqIFNldCBhY2Nlc3NpYmxlIHRvIHRydWUsIHNvIHdlIGNhbiBhY2Nlc3MKLQkgKiBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIG1ldGhvZHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2Qgc3RhdGljTWV0aG9kKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlNZXRob2QgbWV0aG9kID0gbWV0aG9kKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotCQlpZiAoTW9kaWZpZXIuaXNTdGF0aWMobWV0aG9kLmdldE1vZGlmaWVycygpKSkgewotCQkJcmV0dXJuIG1ldGhvZDsKLQkJfQotCQl0aHJvdyBuZXcgTm9TdWNoTWV0aG9kRXhjZXB0aW9uKGZ1bGx5UXVhbGlmaWVkTWV0aG9kU2lnbmF0dXJlKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIHN0YXRpYyBtZXRob2QgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MsIG1ldGhvZCBuYW1lLAotCSAqIGFuZCBmb3JtYWwgcGFyYW1ldGVyIHR5cGUuIElmIHRoZSBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGltcGxlbWVudCB0aGUgbWV0aG9kLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogU2V0IGFjY2Vzc2libGUgdG8gdHJ1ZSwgc28gd2UgY2FuIGFjY2VzcwotCSAqIHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBzdGF0aWNNZXRob2QoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZXMpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlyZXR1cm4gc3RhdGljTWV0aG9kKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgbmV3IENsYXNzW10ge3BhcmFtZXRlclR5cGVzfSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjbGFzcyBjYW4gYmUgImRlY2xhcmVkIiBpbiBjb2RlOwotCSAqIGkuZS4gaXQgaXMgZWl0aGVyIGEgInRvcC1sZXZlbCIgY2xhc3Mgb3IgYSAibWVtYmVyIiBjbGFzcywgYnV0IGl0Ci0JICogaXMgbm90IGFuICJhcnJheSIgY2xhc3MuIFRoaXMgbWV0aG9kIHJvbGxzIHRvZ2V0aGVyIGFsbCB0aGUgY2hlY2tzCi0JICogZnJvbSB0aGUgb3RoZXIgbWV0aG9kcyBmb3IgYSBiaXQgb2YgYSBwZXJmb3JtYW5jZSB0d2Vhay4KLQkgKiBDbGFzcyNpc0RlY2xhcmFibGUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjbGFzc05hbWVkSXNEZWNsYXJhYmxlKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJaWYgKGNsYXNzTmFtZS5jaGFyQXQoMCkgPT0gQVJSQVlfSU5ESUNBVE9SKSB7Ci0JCQlyZXR1cm4gZmFsc2U7CQkvLyBpdCBpcyBhbiAiYXJyYXkiIGNsYXNzCi0JCX0KLQkJaW50IGluZGV4ID0gY2xhc3NOYW1lLmluZGV4T2YoTkVTVEVEX0NMQVNTX05BTUVfU0VQQVJBVE9SKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsJCS8vIGl0IGlzIGEgInRvcC1sZXZlbCIgY2xhc3MKLQkJfQotCQlkbyB7Ci0JCQkvLyB0aGUgY2hhcmFjdGVyIGltbWVkaWF0ZWx5IGFmdGVyIGVhY2ggZG9sbGFyIHNpZ24gY2Fubm90IGJlIGEgZGlnaXQKLQkJCWluZGV4Kys7Ci0JCQlpZiAoQ2hhcmFjdGVyLmlzRGlnaXQoY2xhc3NOYW1lLmNoYXJBdChpbmRleCkpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJaW5kZXggPSBjbGFzc05hbWUuaW5kZXhPZihORVNURURfQ0xBU1NfTkFNRV9TRVBBUkFUT1IsIGluZGV4KTsKLQkJfSB3aGlsZSAoaW5kZXggIT0gLTEpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBhICJ0b3AtbGV2ZWwiIGNsYXNzLAotCSAqIGFzIG9wcG9zZWQgdG8gYSAibWVtYmVyIiwgImxvY2FsIiwgb3IgImFub255bW91cyIgY2xhc3MsCi0JICogdXNpbmcgdGhlIHN0YW5kYXJkIGpkayBuYW1pbmcgY29udmVudGlvbnMgKGkuZS4gdGhlIGNsYXNzCi0JICogbmFtZSBkb2VzIE5PVCBjb250YWluIGEgJyQnOiAiVG9wTGV2ZWxDbGFzcyIpLgotCSAqIENsYXNzI2lzVG9wTGV2ZWwoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjbGFzc05hbWVkSXNUb3BMZXZlbChTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWlmIChjbGFzc05hbWVkSXNBcnJheShjbGFzc05hbWUpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIGNsYXNzTmFtZS5pbmRleE9mKE5FU1RFRF9DTEFTU19OQU1FX1NFUEFSQVRPUikgPT0gLTE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBhICJtZW1iZXIiIGNsYXNzLAotCSAqIGFzIG9wcG9zZWQgdG8gYSAidG9wLWxldmVsIiwgImxvY2FsIiwgb3IgImFub255bW91cyIgY2xhc3MsCi0JICogdXNpbmcgdGhlIHN0YW5kYXJkIGpkayBuYW1pbmcgY29udmVudGlvbnMgKGkuZS4gdGhlIGNsYXNzCi0JICogbmFtZSBjb250YWlucyBhdCBsZWFzdCBvbmUgJyQnIGFuZCBhbGwgdGhlIG5hbWVzIGJldHdlZW4KLQkgKiBlYWNoICckJyBhcmUgbGVnYWwgY2xhc3MgbmFtZXM6Ci0JICogIlRvcExldmVsQ2xhc3MkTWVtYmVyQ2xhc3MkTmVzdGVkTWVtYmVyQ2xhc3MiKS4KLQkgKiBDbGFzcyNpc01lbWJlcigpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNsYXNzTmFtZWRJc01lbWJlcihTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWlmIChjbGFzc05hbWVkSXNBcnJheShjbGFzc05hbWUpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaW50IGluZGV4ID0gY2xhc3NOYW1lLmluZGV4T2YoTkVTVEVEX0NMQVNTX05BTUVfU0VQQVJBVE9SKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQlyZXR1cm4gZmFsc2U7CS8vIGl0IGlzIGEgInRvcC1sZXZlbCIgY2xhc3MKLQkJfQotCQlkbyB7Ci0JCQkvLyB0aGUgY2hhcmFjdGVyIGltbWVkaWF0ZWx5IGFmdGVyIGVhY2ggZG9sbGFyIHNpZ24gY2Fubm90IGJlIGEgZGlnaXQKLQkJCWluZGV4Kys7Ci0JCQlpZiAoQ2hhcmFjdGVyLmlzRGlnaXQoY2xhc3NOYW1lLmNoYXJBdChpbmRleCkpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJaW5kZXggPSBjbGFzc05hbWUuaW5kZXhPZihORVNURURfQ0xBU1NfTkFNRV9TRVBBUkFUT1IsIGluZGV4KTsKLQkJfSB3aGlsZSAoaW5kZXggIT0gLTEpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIGEgImxvY2FsIiBjbGFzcywKLQkgKiBhcyBvcHBvc2VkIHRvIGEgInRvcC1sZXZlbCIsICJtZW1iZXIiLCBvciAiYW5vbnltb3VzIiBjbGFzcywKLQkgKiB1c2luZyB0aGUgc3RhbmRhcmQgamRrIChvciBFY2xpcHNlKSBuYW1pbmcgY29udmVudGlvbnMuCi0JICogSW4gdGhlIGpkaywgdGhlIGNsYXNzIG5hbWUgZW5kcyB3aXRoICckbm5uWFhYJyB3aGVyZSB0aGUgJyQnIGlzCi0JICogZm9sbG93ZWQgYnkgYSBzZXJpZXMgb2YgbnVtZXJpYyBkaWdpdHMgd2hpY2ggYXJlIGZvbGxvd2VkIGJ5IHRoZQotCSAqIGxvY2FsIGNsYXNzIG5hbWU6ICJUb3BMZXZlbENsYXNzJDFMb2NhbENsYXNzIi4KLQkgKiBJbiBFY2xpcHNlLCB0aGUgY2xhc3MgbmFtZSBlbmRzIHdpdGggJyRubm4kWFhYJyB3aGVyZSB0aGUgJyQnIGlzCi0JICogZm9sbG93ZWQgYnkgYSBzZXJpZXMgb2YgbnVtZXJpYyBkaWdpdHMgd2hpY2ggYXJlIHNlcGFyYXRlZCBmcm9tCi0JICogdGhlIGxvY2FsIGNsYXNzIG5hbWUgYnkgYW5vdGhlciAnJCc6ICJUb3BMZXZlbENsYXNzJDEkTG9jYWxDbGFzcyIuCi0JICogQ2xhc3MjaXNMb2NhbCgpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNsYXNzTmFtZWRJc0xvY2FsKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJaWYgKGNsYXNzTmFtZWRJc0FycmF5KGNsYXNzTmFtZSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpbnQgZG9sbGFyID0gY2xhc3NOYW1lLmluZGV4T2YoTkVTVEVEX0NMQVNTX05BTUVfU0VQQVJBVE9SKTsKLQkJaWYgKGRvbGxhciA9PSAtMSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmICggISBDaGFyYWN0ZXIuaXNEaWdpdChjbGFzc05hbWUuY2hhckF0KGRvbGxhciArIDEpKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWludCBsZW4gPSBjbGFzc05hbWUubGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSBkb2xsYXIgKyAyOyBpIDwgbGVuOyBpKyspIHsKLQkJCWlmIChDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclN0YXJ0KGNsYXNzTmFtZS5jaGFyQXQoaSkpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJLy8gYWxsIHRoZSBjaGFyYWN0ZXJzIHBhc3QgdGhlICQgYXJlIGRpZ2l0cyAoYW5vbnltb3VzKQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBhbiAiYW5vbnltb3VzIiBjbGFzcywKLQkgKiBhcyBvcHBvc2VkIHRvIGEgInRvcC1sZXZlbCIsICJtZW1iZXIiLCBvciAibG9jYWwiIGNsYXNzLAotCSAqIHVzaW5nIHRoZSBzdGFuZGFyZCBqZGsgbmFtaW5nIGNvbnZlbnRpb25zIChpLmUuIHRoZSBjbGFzcwotCSAqIG5hbWUgZW5kcyB3aXRoICckbm5uJyB3aGVyZSBhbGwgdGhlIGNoYXJhY3RlcnMgcGFzdCB0aGUKLQkgKiBsYXN0ICckJyBhcmUgbnVtZXJpYyBkaWdpdHM6ICJUb3BMZXZlbENsYXNzJDEiKS4KLQkgKiBDbGFzcyNpc0Fub255bW91cygpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNsYXNzTmFtZWRJc0Fub255bW91cyhTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWlmIChjbGFzc05hbWVkSXNBcnJheShjbGFzc05hbWUpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaW50IGRvbGxhciA9IGNsYXNzTmFtZS5pbmRleE9mKE5FU1RFRF9DTEFTU19OQU1FX1NFUEFSQVRPUik7Ci0JCWlmIChkb2xsYXIgPT0gLTEpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpbnQgc3RhcnQgPSBkb2xsYXIgKyAxOwotCQlmb3IgKGludCBpID0gY2xhc3NOYW1lLmxlbmd0aCgpOyBpLS0gPiBzdGFydDsgKSB7Ci0JCQlpZiAoICEgQ2hhcmFjdGVyLmlzRGlnaXQoY2xhc3NOYW1lLmNoYXJBdChpKSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJLy8gYWxsIHRoZSBjaGFyYWN0ZXJzIHBhc3QgdGhlICQgYXJlIGRpZ2l0cwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlICJhcnJheSBkZXB0aCIgb2YgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBUaGUgZGVwdGggaXMgdGhlIG51bWJlciBvZiBkaW1lbnNpb25zIGZvciBhbiBhcnJheSB0eXBlLgotCSAqIE5vbi1hcnJheSB0eXBlcyBoYXZlIGEgZGVwdGggb2YgemVyby4KLQkgKiBDbGFzcyNnZXRBcnJheURlcHRoKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBhcnJheURlcHRoRm9yKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlpbnQgZGVwdGggPSAwOwotCQl3aGlsZSAoamF2YUNsYXNzLmlzQXJyYXkoKSkgewotCQkJZGVwdGgrKzsKLQkJCWphdmFDbGFzcyA9IGphdmFDbGFzcy5nZXRDb21wb25lbnRUeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIGRlcHRoOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlICJhcnJheSBkZXB0aCIgb2YgdGhlIHNwZWNpZmllZCBvYmplY3QuCi0JICogVGhlIGRlcHRoIGlzIHRoZSBudW1iZXIgb2YgZGltZW5zaW9ucyBmb3IgYW4gYXJyYXkuCi0JICogTm9uLWFycmF5cyBoYXZlIGEgZGVwdGggb2YgemVyby4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBhcnJheURlcHRoRm9yT2JqZWN0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGFycmF5RGVwdGhGb3Iob2JqZWN0LmdldENsYXNzKCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlICJhcnJheSBkZXB0aCIgb2YgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBUaGUgZGVwdGggaXMgdGhlIG51bWJlciBvZiBkaW1lbnNpb25zIGZvciBhbiBhcnJheSB0eXBlLgotCSAqIE5vbi1hcnJheSB0eXBlcyBoYXZlIGEgZGVwdGggb2YgemVyby4KLQkgKiBAc2VlIGphdmEubGFuZy5DbGFzcyNnZXROYW1lKCkKLQkgKiBDbGFzcyNnZXRBcnJheURlcHRoKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBhcnJheURlcHRoRm9yQ2xhc3NOYW1lZChTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWludCBkZXB0aCA9IDA7Ci0JCXdoaWxlIChjbGFzc05hbWUuY2hhckF0KGRlcHRoKSA9PSBBUlJBWV9JTkRJQ0FUT1IpIHsKLQkJCWRlcHRoKys7Ci0JCX0KLQkJcmV0dXJuIGRlcHRoOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgYW4gYXJyYXkgdHlwZS4KLQkgKiBAc2VlIGphdmEubGFuZy5DbGFzcyNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2xhc3NOYW1lZElzQXJyYXkoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gY2xhc3NOYW1lLmNoYXJBdCgwKSA9PSBBUlJBWV9JTkRJQ0FUT1I7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSAiZWxlbWVudCB0eXBlIiBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLgotCSAqIFRoZSBlbGVtZW50IHR5cGUgaXMgdGhlIGJhc2UgdHlwZSBoZWxkIGJ5IGFuIGFycmF5IHR5cGUuCi0JICogQSBub24tYXJyYXkgdHlwZSBzaW1wbHkgcmV0dXJucyBpdHNlbGYuCi0JICogQ2xhc3MjZ2V0RWxlbWVudFR5cGUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3M8Pz4gZWxlbWVudFR5cGVGb3IoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCXdoaWxlIChqYXZhQ2xhc3MuaXNBcnJheSgpKSB7Ci0JCQlqYXZhQ2xhc3MgPSBqYXZhQ2xhc3MuZ2V0Q29tcG9uZW50VHlwZSgpOwotCQl9Ci0JCXJldHVybiBqYXZhQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSAiZWxlbWVudCB0eXBlIiBvZiB0aGUgc3BlY2lmaWVkIG9iamVjdC4KLQkgKiBUaGUgZWxlbWVudCB0eXBlIGlzIHRoZSBiYXNlIHR5cGUgaGVsZCBieSBhbiBhcnJheS4KLQkgKiBBIG5vbi1hcnJheSBzaW1wbHkgcmV0dXJucyBpdHMgY2xhc3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzczw/PiBlbGVtZW50VHlwZUZvck9iamVjdChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBlbGVtZW50VHlwZUZvcihvYmplY3QuZ2V0Q2xhc3MoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSAiZWxlbWVudCB0eXBlIiBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLgotCSAqIFRoZSBlbGVtZW50IHR5cGUgaXMgdGhlIGJhc2UgdHlwZSBoZWxkIGJ5IGFuIGFycmF5IHR5cGUuCi0JICogTm9uLWFycmF5IHR5cGVzIHNpbXBseSByZXR1cm4gdGhlbXNlbHZlcy4KLQkgKiBDbGFzcyNnZXRFbGVtZW50VHlwZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWxlbWVudFR5cGVOYW1lRm9yKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlyZXR1cm4gZWxlbWVudFR5cGVGb3IoamF2YUNsYXNzKS5nZXROYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSAiZWxlbWVudCB0eXBlIiBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLgotCSAqIFRoZSBlbGVtZW50IHR5cGUgaXMgdGhlIGJhc2UgdHlwZSBoZWxkIGJ5IGFuIGFycmF5IHR5cGUuCi0JICogTm9uLWFycmF5IHR5cGVzIHNpbXBseSByZXR1cm4gdGhlbXNlbHZlcy4KLQkgKiBAc2VlIGphdmEubGFuZy5DbGFzcyNnZXROYW1lKCkKLQkgKiBDbGFzcyNnZXRFbGVtZW50VHlwZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWxlbWVudFR5cGVOYW1lRm9yQ2xhc3NOYW1lZChTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWludCBkZXB0aCA9IGFycmF5RGVwdGhGb3JDbGFzc05hbWVkKGNsYXNzTmFtZSk7Ci0JCWlmIChkZXB0aCA9PSAwKSB7Ci0JCQkvLyB0aGUgbmFtZSBpcyBpbiB0aGUgZm9ybTogImphdmEubGFuZy5PYmplY3QiIG9yICJpbnQiCi0JCQlyZXR1cm4gY2xhc3NOYW1lOwotCQl9Ci0JCWludCBsYXN0ID0gY2xhc3NOYW1lLmxlbmd0aCgpIC0gMTsKLQkJaWYgKGNsYXNzTmFtZS5jaGFyQXQoZGVwdGgpID09IFJFRkVSRU5DRV9DTEFTU19DT0RFKSB7Ci0JCQkvLyB0aGUgbmFtZSBpcyBpbiB0aGUgZm9ybTogIltbW0xqYXZhLmxhbmcuT2JqZWN0OyIKLQkJCXJldHVybiBjbGFzc05hbWUuc3Vic3RyaW5nKGRlcHRoICsgMSwgbGFzdCk7CS8vIGRyb3AgdGhlIHRyYWlsaW5nICc7JwotCQl9Ci0JCS8vIHRoZSBuYW1lIGlzIGluIHRoZSBmb3JtOiAiW1tbSSIKLQkJcmV0dXJuIGNsYXNzTmFtZUZvckNvZGUoY2xhc3NOYW1lLmNoYXJBdChsYXN0KSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgYSAicmVmZXJlbmNlIgotCSAqIGNsYXNzIChpLmUuIG5vdCB2b2lkIG9yIG9uZSBvZiB0aGUgcHJpbWl0aXZlcykuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNsYXNzTmFtZWRJc1JlZmVyZW5jZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiAhIGNsYXNzTmFtZWRJc05vblJlZmVyZW5jZShjbGFzc05hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgYSAibm9uLXJlZmVyZW5jZSIKLQkgKiBjbGFzcyAoaS5lLiB2b2lkIG9yIG9uZSBvZiB0aGUgcHJpbWl0aXZlcykuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNsYXNzTmFtZWRJc05vblJlZmVyZW5jZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWlmIChjbGFzc05hbWVkSXNBcnJheShjbGFzc05hbWUpIHx8IChjbGFzc05hbWUubGVuZ3RoKCkgPiBtYXhQcmltaXRpdmVDbGFzc05hbWVMZW5ndGgoKSkpIHsKLQkJCXJldHVybiBmYWxzZTsgIC8vIHBlcmZvcm1hbmNlIHR3ZWFrCi0JCX0KLQkJUHJpbWl0aXZlQ2xhc3NDb2RlW10gY29kZXMgPSBwcmltaXRpdmVDbGFzc0NvZGVzKCk7Ci0JCWZvciAoaW50IGkgPSBjb2Rlcy5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaWYgKGNvZGVzW2ldLmphdmFDbGFzcy5nZXROYW1lKCkuZXF1YWxzKGNsYXNzTmFtZSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjbGFzcyBuYW1lIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzIGNvZGUuCi0JICogQHNlZSBqYXZhLmxhbmcuQ2xhc3MjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2xhc3NOYW1lRm9yQ29kZShjaGFyIGNsYXNzQ29kZSkgewotCQlyZXR1cm4gY2xhc3NGb3JDb2RlKGNsYXNzQ29kZSkuZ2V0TmFtZSgpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIG5hbWUgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MgY29kZS4KLQkgKiBAc2VlIGphdmEubGFuZy5DbGFzcyNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjbGFzc05hbWVGb3JDb2RlKGludCBjbGFzc0NvZGUpIHsKLQkJcmV0dXJuIGNsYXNzTmFtZUZvckNvZGUoKGNoYXIpIGNsYXNzQ29kZSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MgY29kZS4KLQkgKiBAc2VlIGphdmEubGFuZy5DbGFzcyNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzPD8+IGNsYXNzRm9yQ29kZShjaGFyIGNsYXNzQ29kZSkgewotCQlQcmltaXRpdmVDbGFzc0NvZGVbXSBjb2RlcyA9IHByaW1pdGl2ZUNsYXNzQ29kZXMoKTsKLQkJZm9yIChpbnQgaSA9IGNvZGVzLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlpZiAoY29kZXNbaV0uY29kZSA9PSBjbGFzc0NvZGUpIHsKLQkJCQlyZXR1cm4gY29kZXNbaV0uamF2YUNsYXNzOwotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oU3RyaW5nLnZhbHVlT2YoY2xhc3NDb2RlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjbGFzcyBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcyBjb2RlLgotCSAqIEBzZWUgamF2YS5sYW5nLkNsYXNzI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3M8Pz4gY2xhc3NGb3JDb2RlKGludCBjbGFzc0NvZGUpIHsKLQkJcmV0dXJuIGNsYXNzRm9yQ29kZSgoY2hhcikgY2xhc3NDb2RlKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjbGFzcyBjb2RlIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzLgotCSAqIEBzZWUgamF2YS5sYW5nLkNsYXNzLmdldE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhciBjb2RlRm9yQ2xhc3MoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCWlmICgoICEgamF2YUNsYXNzLmlzQXJyYXkoKSkgJiYgKGphdmFDbGFzcy5nZXROYW1lKCkubGVuZ3RoKCkgPD0gbWF4UHJpbWl0aXZlQ2xhc3NOYW1lTGVuZ3RoKCkpKSB7Ci0JCQlQcmltaXRpdmVDbGFzc0NvZGVbXSBjb2RlcyA9IHByaW1pdGl2ZUNsYXNzQ29kZXMoKTsKLQkJCWZvciAoaW50IGkgPSBjb2Rlcy5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJCWlmIChjb2Rlc1tpXS5qYXZhQ2xhc3MgPT0gamF2YUNsYXNzKSB7Ci0JCQkJCXJldHVybiBjb2Rlc1tpXS5jb2RlOwotCQkJCX0KLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGphdmFDbGFzcy5nZXROYW1lKCkpOwkJCi0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgY29kZSBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBAc2VlIGphdmEubGFuZy5DbGFzcy5nZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXIgY29kZUZvckNsYXNzTmFtZWQoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlpZiAoKCAhIGNsYXNzTmFtZWRJc0FycmF5KGNsYXNzTmFtZSkpICYmIChjbGFzc05hbWUubGVuZ3RoKCkgPD0gbWF4UHJpbWl0aXZlQ2xhc3NOYW1lTGVuZ3RoKCkpKSB7Ci0JCQlQcmltaXRpdmVDbGFzc0NvZGVbXSBjb2RlcyA9IHByaW1pdGl2ZUNsYXNzQ29kZXMoKTsKLQkJCWZvciAoaW50IGkgPSBjb2Rlcy5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJCWlmIChjb2Rlc1tpXS5qYXZhQ2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhjbGFzc05hbWUpKSB7Ci0JCQkJCXJldHVybiBjb2Rlc1tpXS5jb2RlOwotCQkJCX0KLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGNsYXNzTmFtZSk7CQkKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIGZvciBzcGVjaWZpZWQgInR5cGUgZGVjbGFyYXRpb24iLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3M8Pz4gY2xhc3NGb3JUeXBlRGVjbGFyYXRpb24oU3RyaW5nIGVsZW1lbnRUeXBlTmFtZSwgaW50IGFycmF5RGVwdGgpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNsYXNzRm9yVHlwZURlY2xhcmF0aW9uKGVsZW1lbnRUeXBlTmFtZSwgYXJyYXlEZXB0aCwgQ2xhc3NUb29scy5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjbGFzcyBmb3Igc3BlY2lmaWVkICJ0eXBlIGRlY2xhcmF0aW9uIiwKLQkgKiB1c2luZyB0aGUgc3BlY2lmaWVkIGNsYXNzIGxvYWRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzPD8+IGNsYXNzRm9yVHlwZURlY2xhcmF0aW9uKFN0cmluZyBlbGVtZW50VHlwZU5hbWUsIGludCBhcnJheURlcHRoLCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQkvLyBwcmltaXRpdmVzIGNhbm5vdCBiZSBsb2FkZWQgdmlhIENsYXNzI2Zvck5hbWUoKSwKLQkJLy8gc28gY2hlY2sgZm9yIGEgcHJpbWl0aXZlIGNsYXNzIG5hbWUgZmlyc3QKLQkJUHJpbWl0aXZlQ2xhc3NDb2RlIHBjYyA9IG51bGw7Ci0JCWlmIChlbGVtZW50VHlwZU5hbWUubGVuZ3RoKCkgPD0gbWF4UHJpbWl0aXZlQ2xhc3NOYW1lTGVuZ3RoKCkpIHsgIC8vIHBlcmZvcm1hbmNlIHR3ZWFrCi0JCQlQcmltaXRpdmVDbGFzc0NvZGVbXSBjb2RlcyA9IHByaW1pdGl2ZUNsYXNzQ29kZXMoKTsKLQkJCWZvciAoaW50IGkgPSBjb2Rlcy5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJCWlmIChjb2Rlc1tpXS5qYXZhQ2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhlbGVtZW50VHlwZU5hbWUpKSB7Ci0JCQkJCXBjYyA9IGNvZGVzW2ldOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBub24tYXJyYXkKLQkJaWYgKGFycmF5RGVwdGggPT0gMCkgewotCQkJcmV0dXJuIChwY2MgPT0gbnVsbCkgPyBjbGFzc0xvYWRlci5sb2FkQ2xhc3MoZWxlbWVudFR5cGVOYW1lKSA6IHBjYy5qYXZhQ2xhc3M7Ci0JCX0KLQotCQkvLyBhcnJheQotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKDEwMCk7Ci0JCWZvciAoaW50IGkgPSBhcnJheURlcHRoOyBpLS0gPiAwOyApIHsKLQkJCXNiLmFwcGVuZChBUlJBWV9JTkRJQ0FUT1IpOwotCQl9Ci0JCWlmIChwY2MgPT0gbnVsbCkgewotCQkJc2IuYXBwZW5kKFJFRkVSRU5DRV9DTEFTU19DT0RFKTsKLQkJCXNiLmFwcGVuZChlbGVtZW50VHlwZU5hbWUpOwotCQkJc2IuYXBwZW5kKFJFRkVSRU5DRV9DTEFTU19OQU1FX0RFTElNSVRFUik7Ci0JCX0gZWxzZSB7Ci0JCQlzYi5hcHBlbmQocGNjLmNvZGUpOwotCQl9Ci0JCXJldHVybiBjbGFzc0xvYWRlci5sb2FkQ2xhc3Moc2IudG9TdHJpbmcoKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgbmFtZSBmb3Igc3BlY2lmaWVkICJ0eXBlIGRlY2xhcmF0aW9uIi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjbGFzc05hbWVGb3JUeXBlRGVjbGFyYXRpb24oU3RyaW5nIGVsZW1lbnRUeXBlTmFtZSwgaW50IGFycmF5RGVwdGgpIHsKLQkJLy8gbm9uLWFycmF5Ci0JCWlmIChhcnJheURlcHRoID09IDApIHsKLQkJCXJldHVybiBlbGVtZW50VHlwZU5hbWU7Ci0JCX0KLQotCQlpZiAoZWxlbWVudFR5cGVOYW1lLmVxdWFscyh2b2lkLmNsYXNzLmdldE5hbWUoKSkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIid2b2lkJyBtdXN0IGhhdmUgYW4gYXJyYXkgZGVwdGggb2YgemVybzogIiArIGFycmF5RGVwdGggKyAnLicpOwotCQl9Ci0JCS8vIGFycmF5Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoMTAwKTsKLQkJZm9yIChpbnQgaSA9IGFycmF5RGVwdGg7IGktLSA+IDA7ICkgewotCQkJc2IuYXBwZW5kKEFSUkFZX0lORElDQVRPUik7Ci0JCX0KLQotCQkvLyBsb29rIGZvciBhIHByaW1pdGl2ZSBmaXJzdAotCQlQcmltaXRpdmVDbGFzc0NvZGUgcGNjID0gbnVsbDsKLQkJaWYgKGVsZW1lbnRUeXBlTmFtZS5sZW5ndGgoKSA8PSBtYXhQcmltaXRpdmVDbGFzc05hbWVMZW5ndGgoKSkgeyAgLy8gcGVyZm9ybWFuY2UgdHdlYWsKLQkJCVByaW1pdGl2ZUNsYXNzQ29kZVtdIGNvZGVzID0gcHJpbWl0aXZlQ2xhc3NDb2RlcygpOwotCQkJZm9yIChpbnQgaSA9IGNvZGVzLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQkJaWYgKGNvZGVzW2ldLmphdmFDbGFzcy5nZXROYW1lKCkuZXF1YWxzKGVsZW1lbnRUeXBlTmFtZSkpIHsKLQkJCQkJcGNjID0gY29kZXNbaV07Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChwY2MgPT0gbnVsbCkgewotCQkJc2IuYXBwZW5kKFJFRkVSRU5DRV9DTEFTU19DT0RFKTsKLQkJCXNiLmFwcGVuZChlbGVtZW50VHlwZU5hbWUpOwotCQkJc2IuYXBwZW5kKFJFRkVSRU5DRV9DTEFTU19OQU1FX0RFTElNSVRFUik7Ci0JCX0gZWxzZSB7Ci0JCQlzYi5hcHBlbmQocGNjLmNvZGUpOwotCQl9Ci0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IG1heFByaW1pdGl2ZUNsYXNzTmFtZUxlbmd0aCgpIHsKLQkJaWYgKE1BWF9QUklNSVRJVkVfQ0xBU1NfTkFNRV9MRU5HVEggPT0gLTEpIHsKLQkJCU1BWF9QUklNSVRJVkVfQ0xBU1NfTkFNRV9MRU5HVEggPSBjYWxjdWxhdGVNYXhQcmltaXRpdmVDbGFzc05hbWVMZW5ndGgoKTsKLQkJfQotCQlyZXR1cm4gTUFYX1BSSU1JVElWRV9DTEFTU19OQU1FX0xFTkdUSDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgY2FsY3VsYXRlTWF4UHJpbWl0aXZlQ2xhc3NOYW1lTGVuZ3RoKCkgewotCQlpbnQgbWF4ID0gLTE7Ci0JCVByaW1pdGl2ZUNsYXNzQ29kZVtdIGNvZGVzID0gcHJpbWl0aXZlQ2xhc3NDb2RlcygpOwotCQlmb3IgKGludCBpID0gY29kZXMubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWludCBsZW4gPSBjb2Rlc1tpXS5qYXZhQ2xhc3MuZ2V0TmFtZSgpLmxlbmd0aCgpOwotCQkJaWYgKGxlbiA+IG1heCkgewotCQkJCW1heCA9IGxlbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbWF4OwotCX0KLQotCXByaXZhdGUgc3RhdGljIFByaW1pdGl2ZUNsYXNzQ29kZVtdIHByaW1pdGl2ZUNsYXNzQ29kZXMoKSB7Ci0JCWlmIChQUklNSVRJVkVfQ0xBU1NfQ09ERVMgPT0gbnVsbCkgewotCQkJUFJJTUlUSVZFX0NMQVNTX0NPREVTID0gYnVpbGRQcmltaXRpdmVDbGFzc0NvZGVzKCk7Ci0JCX0KLQkJcmV0dXJuIFBSSU1JVElWRV9DTEFTU19DT0RFUzsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgUHJpbWl0aXZlQ2xhc3NDb2RlW10gYnVpbGRQcmltaXRpdmVDbGFzc0NvZGVzKCkgewotCQlQcmltaXRpdmVDbGFzc0NvZGVbXSByZXN1bHQgPSBuZXcgUHJpbWl0aXZlQ2xhc3NDb2RlWzldOwotCQlyZXN1bHRbMF0gPSBuZXcgUHJpbWl0aXZlQ2xhc3NDb2RlKEJZVEVfQ09ERSwgYnl0ZS5jbGFzcyk7Ci0JCXJlc3VsdFsxXSA9IG5ldyBQcmltaXRpdmVDbGFzc0NvZGUoQ0hBUl9DT0RFLCBjaGFyLmNsYXNzKTsKLQkJcmVzdWx0WzJdID0gbmV3IFByaW1pdGl2ZUNsYXNzQ29kZShET1VCTEVfQ09ERSwgZG91YmxlLmNsYXNzKTsKLQkJcmVzdWx0WzNdID0gbmV3IFByaW1pdGl2ZUNsYXNzQ29kZShGTE9BVF9DT0RFLCBmbG9hdC5jbGFzcyk7Ci0JCXJlc3VsdFs0XSA9IG5ldyBQcmltaXRpdmVDbGFzc0NvZGUoSU5UX0NPREUsIGludC5jbGFzcyk7Ci0JCXJlc3VsdFs1XSA9IG5ldyBQcmltaXRpdmVDbGFzc0NvZGUoTE9OR19DT0RFLCBsb25nLmNsYXNzKTsKLQkJcmVzdWx0WzZdID0gbmV3IFByaW1pdGl2ZUNsYXNzQ29kZShTSE9SVF9DT0RFLCBzaG9ydC5jbGFzcyk7Ci0JCXJlc3VsdFs3XSA9IG5ldyBQcmltaXRpdmVDbGFzc0NvZGUoQk9PTEVBTl9DT0RFLCBib29sZWFuLmNsYXNzKTsKLQkJcmVzdWx0WzhdID0gbmV3IFByaW1pdGl2ZUNsYXNzQ29kZShWT0lEX0NPREUsIHZvaWQuY2xhc3MpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFN1cHByZXNzIGRlZmF1bHQgY29uc3RydWN0b3IsIGVuc3VyaW5nIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBDbGFzc1Rvb2xzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWVtYmVyIGNsYXNzICoqKioqKioqKioKLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFByaW1pdGl2ZUNsYXNzQ29kZSB7Ci0JCWNoYXIgY29kZTsKLQkJQ2xhc3M8Pz4gamF2YUNsYXNzOwotCQlQcmltaXRpdmVDbGFzc0NvZGUoY2hhciBjb2RlLCBDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJCXRoaXMuY29kZSA9IGNvZGU7Ci0JCQl0aGlzLmphdmFDbGFzcyA9IGphdmFDbGFzczsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0NsYXNzcGF0aC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0NsYXNzcGF0aC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWFjNTMzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9DbGFzc3BhdGguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUZpbHRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5Db21wb3NpdGVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRmlsdGVyaW5nSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7Ci0KLS8qKgotICogVE9ETwotICovCi1wdWJsaWMgY2xhc3MgQ2xhc3NwYXRoCi0JaW1wbGVtZW50cyBTZXJpYWxpemFibGUKLXsKLQkvKiogVGhlIGVudHJpZXMgaW4gdGhlIGNsYXNzcGF0aCAqLwotCXByaXZhdGUgZmluYWwgRW50cnlbXSBlbnRyaWVzOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JLy8gKioqKiogZmFjdG9yeSBtZXRob2RzIGZvciAic3RhbmRhcmQiIGNsYXNzcGF0aHMgKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgSmF2YSAiYm9vdCIgY2xhc3NwYXRoLiBUaGlzIGluY2x1ZGVzIHJ0Lmphci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzcGF0aCBib290Q2xhc3NwYXRoKCkgewotCQlyZXR1cm4gbmV3IENsYXNzcGF0aChTeXN0ZW0uZ2V0UHJvcGVydHkoInN1bi5ib290LmNsYXNzLnBhdGgiKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhICJ2aXJ0dWFsIGNsYXNzcGF0aCIgdGhhdCBjb250YWlucyBhbGwgdGhlIGphcnMKLQkgKiB0aGF0IHdvdWxkIGJlIHVzZWQgYnkgdGhlIEphdmEgRXh0ZW5zaW9uIE1lY2hhbmlzbS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzcGF0aCBqYXZhRXh0ZW5zaW9uQ2xhc3NwYXRoKCkgewotCQlGaWxlW10gZGlycyA9IGphdmFFeHRlbnNpb25EaXJlY3RvcmllcygpOwotCQlMaXN0PFN0cmluZz4gamFyRmlsZU5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWZvciAoRmlsZSBkaXIgOiBkaXJzKSB7Ci0JCQlpZiAoZGlyLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQlhZGRKYXJGaWxlTmFtZXNUbyhkaXIsIGphckZpbGVOYW1lcyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5ldyBDbGFzc3BhdGgoamFyRmlsZU5hbWVzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIEphdmEgInN5c3RlbSIgY2xhc3NwYXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3NwYXRoIGphdmFDbGFzc3BhdGgoKSB7Ci0JCXJldHVybiBuZXcgQ2xhc3NwYXRoKFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5jbGFzcy5wYXRoIikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgdW5yZXRvdWNoZWQgImNvbXBsZXRlIiBjbGFzc3BhdGguCi0JICogVGhpcyBpbmNsdWRlcyB0aGUgYm9vdCBjbGFzc3BhdGgsIHRoZSBKYXZhIEV4dGVuc2lvbgotCSAqIE1lY2hhbmlzbSBjbGFzc3BhdGgsIGFuZCB0aGUgbm9ybWFsICJzeXN0ZW0iIGNsYXNzcGF0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzcGF0aCBjb21wbGV0ZUNsYXNzcGF0aCgpIHsKLQkJcmV0dXJuIG5ldyBDbGFzc3BhdGgobmV3IENsYXNzcGF0aFtdIHsKLQkJCQlib290Q2xhc3NwYXRoKCksCi0JCQkJamF2YUV4dGVuc2lvbkNsYXNzcGF0aCgpLAotCQkJCWphdmFDbGFzc3BhdGgoKQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBjbGFzc3BhdGggdGhhdCBjb250YWlucyB0aGUgbG9jYXRpb24gb2YgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzcGF0aCBjbGFzc3BhdGhGb3IoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCXJldHVybiBuZXcgQ2xhc3NwYXRoKGxvY2F0aW9uRm9yKGphdmFDbGFzcykpOwotCX0KLQotCi0JLy8gKioqKiogZmlsZSA9PiBjbGFzcyAqKioqKgotCi0JLyoqCi0JICogQ29udmVydCBhIHJlbGF0aXZlIGZpbGUgbmFtZSB0byBhIGNsYXNzIG5hbWU7IHRoaXMgd2lsbCB3b3JrIGZvcgotCSAqIGFueSBmaWxlIHRoYXQgaGFzIGEgc2luZ2xlIGV4dGVuc2lvbiBiZXlvbmQgdGhlIGJhc2UKLQkgKiBjbGFzcyBuYW1lLgotCSAqIGUuZy4gImphdmEvbGFuZy9TdHJpbmcuY2xhc3MiIGlzIGNvbnZlcnRlZCB0byAiamF2YS5sYW5nLlN0cmluZyIKLQkgKiBlLmcuICJqYXZhL2xhbmcvU3RyaW5nLmphdmEiIGlzIGNvbnZlcnRlZCB0byAiamF2YS5sYW5nLlN0cmluZyIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9DbGFzc05hbWUoU3RyaW5nIGNsYXNzRmlsZU5hbWUpIHsKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IEZpbGVUb29scy5zdHJpcEV4dGVuc2lvbihjbGFzc0ZpbGVOYW1lKTsKLQkJLy8gZG8gdGhpcyBmb3IgYXJjaGl2ZSBlbnRyeSBuYW1lcwotCQljbGFzc05hbWUgPSBjbGFzc05hbWUucmVwbGFjZSgnLycsICcuJyk7Ci0JCS8vIGRvIHRoaXMgZm9yIE8vUy1zcGVjaWZpYyBmaWxlIG5hbWVzCi0JCWlmIChGaWxlLnNlcGFyYXRvckNoYXIgIT0gJy8nKSB7Ci0JCQljbGFzc05hbWUgPSBjbGFzc05hbWUucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcuJyk7Ci0JCX0KLQkJcmV0dXJuIGNsYXNzTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IGEgZmlsZSB0byBhIGNsYXNzIG5hbWU7Ci0JICogZS5nLiBGaWxlKGphdmEvbGFuZy9TdHJpbmcuY2xhc3MpIGlzIGNvbnZlcnRlZCB0byAiamF2YS5sYW5nLlN0cmluZyIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9DbGFzc05hbWUoRmlsZSBjbGFzc0ZpbGUpIHsKLQkJcmV0dXJuIGNvbnZlcnRUb0NsYXNzTmFtZShjbGFzc0ZpbGUuZ2V0UGF0aCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IGEgcmVsYXRpdmUgZmlsZSBuYW1lIHRvIGEgY2xhc3M7Ci0JICogZS5nLiAiamF2YS9sYW5nL1N0cmluZy5jbGFzcyIgaXMgY29udmVydGVkIHRvIGphdmEubGFuZy5TdHJpbmcuY2xhc3MKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzPD8+IGNvbnZlcnRUb0NsYXNzKFN0cmluZyBjbGFzc0ZpbGVOYW1lKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBDbGFzcy5mb3JOYW1lKGNvbnZlcnRUb0NsYXNzTmFtZShjbGFzc0ZpbGVOYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCBhIHJlbGF0aXZlIGZpbGUgdG8gYSBjbGFzczsKLQkgKiBlLmcuIEZpbGUoamF2YS9sYW5nL1N0cmluZy5jbGFzcykgaXMgY29udmVydGVkIHRvIGphdmEubGFuZy5TdHJpbmcuY2xhc3MKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzPD8+IGNvbnZlcnRUb0NsYXNzKEZpbGUgY2xhc3NGaWxlKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjb252ZXJ0VG9DbGFzcyhjbGFzc0ZpbGUuZ2V0UGF0aCgpKTsKLQl9Ci0KLQotCS8vICoqKioqIGNsYXNzID0+IEpBUiBlbnRyeSAqKioqKgotCi0JLyoqCi0JICogQ29udmVydCBhIGNsYXNzIG5hbWUgdG8gYW4gYXJjaGl2ZSBlbnRyeSBuYW1lIGJhc2U7Ci0JICogZS5nLiAiamF2YS5sYW5nLlN0cmluZyIgaXMgY29udmVydGVkIHRvICJqYXZhL2xhbmcvU3RyaW5nIgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb0FyY2hpdmVFbnRyeU5hbWVCYXNlKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuIGNsYXNzTmFtZS5yZXBsYWNlKCcuJywgJy8nKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVydCBhIGNsYXNzIHRvIGFuIGFyY2hpdmUgZW50cnkgbmFtZSBiYXNlOwotCSAqIGUuZy4gamF2YS5sYW5nLlN0cmluZy5jbGFzcyBpcyBjb252ZXJ0ZWQgdG8gImphdmEvbGFuZy9TdHJpbmciCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvQXJjaGl2ZUVudHJ5TmFtZUJhc2UoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCXJldHVybiBjb252ZXJ0VG9BcmNoaXZlRW50cnlOYW1lQmFzZShqYXZhQ2xhc3MuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVydCBhIGNsYXNzIG5hbWUgdG8gYW4gYXJjaGl2ZSBjbGFzcyBmaWxlIGVudHJ5IG5hbWU7Ci0JICogZS5nLiAiamF2YS5sYW5nLlN0cmluZyIgaXMgY29udmVydGVkIHRvICJqYXZhL2xhbmcvU3RyaW5nLmNsYXNzIgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb0FyY2hpdmVDbGFzc0ZpbGVFbnRyeU5hbWUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gY29udmVydFRvQXJjaGl2ZUVudHJ5TmFtZUJhc2UoY2xhc3NOYW1lKSArICIuY2xhc3MiOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZXJ0IGEgY2xhc3MgdG8gYW4gYXJjaGl2ZSBjbGFzcyBmaWxlIGVudHJ5IG5hbWU7Ci0JICogZS5nLiBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzIGlzIGNvbnZlcnRlZCB0byAiamF2YS9sYW5nL1N0cmluZy5jbGFzcyIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9BcmNoaXZlQ2xhc3NGaWxlRW50cnlOYW1lKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlyZXR1cm4gY29udmVydFRvQXJjaGl2ZUNsYXNzRmlsZUVudHJ5TmFtZShqYXZhQ2xhc3MuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0KLQkvLyAqKioqKiBjbGFzcyA9PiBmaWxlICguY2xhc3Mgb3IgLmphdmEpICoqKioqCi0KLQkvKioKLQkgKiBDb252ZXJ0IGEgY2xhc3MgbmFtZSB0byBhIGZpbGUgbmFtZSBiYXNlIGZvciB0aGUgY3VycmVudCBPL1M7Ci0JICogZS5nLiAiamF2YS5sYW5nLlN0cmluZyIgaXMgY29udmVydGVkIHRvICJqYXZhL2xhbmcvU3RyaW5nIiBvbiBVbml4Ci0JICogYW5kICJqYXZhXFxsYW5nXFxTdHJpbmciIG9uIFdpbmRvd3MKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9GaWxlTmFtZUJhc2UoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gY2xhc3NOYW1lLnJlcGxhY2UoJy4nLCBGaWxlLnNlcGFyYXRvckNoYXIpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZXJ0IGEgY2xhc3MgdG8gYSBmaWxlIG5hbWUgYmFzZSBmb3IgdGhlIGN1cnJlbnQgTy9TOwotCSAqIGUuZy4gamF2YS5sYW5nLlN0cmluZy5jbGFzcyBpcyBjb252ZXJ0ZWQgdG8gImphdmEvbGFuZy9TdHJpbmciIG9uIFVuaXgKLQkgKiBhbmQgImphdmFcXGxhbmdcXFN0cmluZyIgb24gV2luZG93cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb0ZpbGVOYW1lQmFzZShDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJcmV0dXJuIGNvbnZlcnRUb0ZpbGVOYW1lQmFzZShqYXZhQ2xhc3MuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVydCBhIGNsYXNzIG5hbWUgdG8gYSBjbGFzcyBmaWxlIG5hbWUgZm9yIHRoZSBjdXJyZW50IE8vUzsKLQkgKiBlLmcuICJqYXZhLmxhbmcuU3RyaW5nIiBpcyBjb252ZXJ0ZWQgdG8gImphdmEvbGFuZy9TdHJpbmcuY2xhc3MiIG9uIFVuaXgKLQkgKiBhbmQgImphdmFcXGxhbmdcXFN0cmluZy5jbGFzcyIgb24gV2luZG93cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb0NsYXNzRmlsZU5hbWUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gY29udmVydFRvRmlsZU5hbWVCYXNlKGNsYXNzTmFtZSkgKyAiLmNsYXNzIjsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVydCBhIGNsYXNzIHRvIGEgY2xhc3MgZmlsZSBuYW1lIGZvciB0aGUgY3VycmVudCBPL1M7Ci0JICogZS5nLiBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzIGlzIGNvbnZlcnRlZCB0byAiamF2YS9sYW5nL1N0cmluZy5jbGFzcyIgb24gVW5peAotCSAqIGFuZCAiamF2YVxcbGFuZ1xcU3RyaW5nLmNsYXNzIiBvbiBXaW5kb3dzCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvQ2xhc3NGaWxlTmFtZShDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJcmV0dXJuIGNvbnZlcnRUb0NsYXNzRmlsZU5hbWUoamF2YUNsYXNzLmdldE5hbWUoKSk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlcnQgYSBjbGFzcyBuYW1lIHRvIGEgY2xhc3MgZmlsZSBmb3IgdGhlIGN1cnJlbnQgTy9TOwotCSAqIGUuZy4gImphdmEubGFuZy5TdHJpbmciIGlzIGNvbnZlcnRlZCB0byBGaWxlKGphdmEvbGFuZy9TdHJpbmcuY2xhc3MpCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIGNvbnZlcnRUb0NsYXNzRmlsZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiBuZXcgRmlsZShjb252ZXJ0VG9DbGFzc0ZpbGVOYW1lKGNsYXNzTmFtZSkpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZXJ0IGEgY2xhc3MgdG8gYSBjbGFzcyBmaWxlIGZvciB0aGUgY3VycmVudCBPL1M7Ci0JICogZS5nLiBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzIGlzIGNvbnZlcnRlZCB0byBGaWxlKGphdmEvbGFuZy9TdHJpbmcuY2xhc3MpCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIGNvbnZlcnRUb0NsYXNzRmlsZShDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJcmV0dXJuIGNvbnZlcnRUb0NsYXNzRmlsZShqYXZhQ2xhc3MuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVydCBhIGNsYXNzIG5hbWUgdG8gYSBqYXZhIGZpbGUgbmFtZSBmb3IgdGhlIGN1cnJlbnQgTy9TOwotCSAqIGUuZy4gImphdmEubGFuZy5TdHJpbmciIGlzIGNvbnZlcnRlZCB0byAiamF2YS9sYW5nL1N0cmluZy5qYXZhIiBvbiBVbml4Ci0JICogYW5kICJqYXZhXFxsYW5nXFxTdHJpbmcuamF2YSIgb24gV2luZG93cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb0phdmFGaWxlTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiBjb252ZXJ0VG9GaWxlTmFtZUJhc2UoY2xhc3NOYW1lKSArICIuamF2YSI7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCBhIGNsYXNzIHRvIGEgamF2YSBmaWxlIG5hbWUgZm9yIHRoZSBjdXJyZW50IE8vUzsKLQkgKiBlLmcuIGphdmEubGFuZy5TdHJpbmcuY2xhc3MgaXMgY29udmVydGVkIHRvICJqYXZhL2xhbmcvU3RyaW5nLmphdmEiIG9uIFVuaXgKLQkgKiBhbmQgImphdmFcXGxhbmdcXFN0cmluZy5qYXZhIiBvbiBXaW5kb3dzCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvSmF2YUZpbGVOYW1lKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlyZXR1cm4gY29udmVydFRvSmF2YUZpbGVOYW1lKGphdmFDbGFzcy5nZXROYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgYSBjbGFzcyBuYW1lIHRvIGEgamF2YSBmaWxlIGZvciB0aGUgY3VycmVudCBPL1M7Ci0JICogZS5nLiAiamF2YS5sYW5nLlN0cmluZyIgaXMgY29udmVydGVkIHRvIEZpbGUoamF2YS9sYW5nL1N0cmluZy5qYXZhKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSBjb252ZXJ0VG9KYXZhRmlsZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiBuZXcgRmlsZShjb252ZXJ0VG9KYXZhRmlsZU5hbWUoY2xhc3NOYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCBhIGNsYXNzIHRvIGEgamF2YSBmaWxlIGZvciB0aGUgY3VycmVudCBPL1M7Ci0JICogZS5nLiBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzIGlzIGNvbnZlcnRlZCB0byBGaWxlKGphdmEvbGFuZy9TdHJpbmcuamF2YSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgY29udmVydFRvSmF2YUZpbGUoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCXJldHVybiBjb252ZXJ0VG9KYXZhRmlsZShqYXZhQ2xhc3MuZ2V0TmFtZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqIGNsYXNzID0+IHJlc291cmNlICoqKioqCi0KLQkvKioKLQkgKiBDb252ZXJ0IGEgY2xhc3MgdG8gYSByZXNvdXJjZSBuYW1lOwotCSAqIGUuZy4gamF2YS5sYW5nLlN0cmluZy5jbGFzcyBpcyBjb252ZXJ0ZWQgdG8gIi9qYXZhL2xhbmcvU3RyaW5nLmNsYXNzIi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9SZXNvdXJjZU5hbWUoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCXJldHVybiAnLycgKyBjb252ZXJ0VG9BcmNoaXZlQ2xhc3NGaWxlRW50cnlOYW1lKGphdmFDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCBhIGNsYXNzIHRvIGEgcmVzb3VyY2U7Ci0JICogZS5nLiBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzIGlzIGNvbnZlcnRlZCB0bwotCSAqIFVSTChqYXI6ZmlsZTovQzovamRrLzEuNC4yXzA0L2pyZS9saWIvcnQuamFyIS9qYXZhL2xhbmcvU3RyaW5nLmNsYXNzKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFVSTCBjb252ZXJ0VG9SZXNvdXJjZShDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJcmV0dXJuIGphdmFDbGFzcy5nZXRSZXNvdXJjZShjb252ZXJ0VG9SZXNvdXJjZU5hbWUoamF2YUNsYXNzKSk7Ci0JfQotCi0KLQkvLyAqKioqKiB1dGlsaXRpZXMgKioqKioKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgZmlsZSBpcyBhbiBhcmNoaXZlIGZpbGU7Ci0JICogaS5lLiBpdHMgbmFtZSBlbmRzIHdpdGggIi56aXAiIG9yICIuamFyIgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBmaWxlTmFtZUlzQXJjaGl2ZShTdHJpbmcgZmlsZU5hbWUpIHsKLQkJU3RyaW5nIGV4dCA9IEZpbGVUb29scy5leHRlbnNpb24oZmlsZU5hbWUpLnRvTG93ZXJDYXNlKCk7Ci0JCXJldHVybiBleHQuZXF1YWxzKCIuamFyIikgfHwgZXh0LmVxdWFscygiLnppcCIpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGZpbGUgaXMgYW4gYXJjaGl2ZSBmaWxlOwotCSAqIGkuZS4gaXRzIG5hbWUgZW5kcyB3aXRoICIuemlwIiBvciAiLmphciIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZmlsZUlzQXJjaGl2ZShGaWxlIGZpbGUpIHsKLQkJcmV0dXJuIGZpbGVOYW1lSXNBcmNoaXZlKGZpbGUuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoYXQgc2hvdWxkIGJlIHRoZSBmdWxseS1xdWFsaWZpZWQgZmlsZSBuYW1lCi0JICogZm9yIHRoZSBKUkUgcnVudGltZSBKQVI7Ci0JICogZS5nLiAiQzpcamRrMS40LjJfMDRcanJlXGxpYlxydC5qYXIiLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJ0SmFyTmFtZSgpIHsKLQkJcmV0dXJuIGxvY2F0aW9uRm9yKGphdmEubGFuZy5PYmplY3QuY2xhc3MpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxvY2F0aW9uIGZyb20gd2hlcmUgdGhlIHNwZWNpZmllZCBjbGFzcyB3YXMgbG9hZGVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxvY2F0aW9uRm9yKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlVUkwgdXJsID0gY29udmVydFRvUmVzb3VyY2UoamF2YUNsYXNzKTsKLQkJU3RyaW5nIHBhdGg7Ci0JCXRyeSB7Ci0JCQlwYXRoID0gRmlsZVRvb2xzLmJ1aWxkRmlsZSh1cmwpLmdldFBhdGgoKTsKLQkJfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0JCX0KLQkJU3RyaW5nIHByb3RvY29sID0gdXJsLmdldFByb3RvY29sKCkudG9Mb3dlckNhc2UoKTsKLQkJaWYgKHByb3RvY29sLmVxdWFscygiamFyIikpIHsKLQkJCS8vIGlmIHRoZSBjbGFzcyBpcyBpbiBhIEpBUiwgdGhlIFVSTCB3aWxsIGxvb2sgc29tZXRoaW5nIGxpa2UgdGhpczoKLQkJCS8vICAgICBqYXI6ZmlsZTovQzovamRrLzEuNC4yXzA0L2pyZS9saWIvcnQuamFyIS9qYXZhL2xhbmcvU3RyaW5nLmNsYXNzCi0JCQlyZXR1cm4gcGF0aC5zdWJzdHJpbmcoMCwgcGF0aC5pbmRleE9mKCchJykpOwotCQl9IGVsc2UgaWYgKHByb3RvY29sLmVxdWFscygiZmlsZSIpKSB7Ci0JCQkvLyBpZiB0aGUgY2xhc3MgaXMgaW4gYSBkaXJlY3RvcnksIHRoZSBVUkwgd2lsbCBsb29rIHNvbWV0aGluZyBsaWtlIHRoaXM6Ci0JCQkvLyAgICAgZmlsZTovQzovZGV2L21haW4vbXdkZXYvY2xhc3Mvb3JnL2VjbGlwc2UvZGFsaS91dGlsaXR5L0NsYXNzcGF0aC5jbGFzcwotCQkJcmV0dXJuIHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGVuZ3RoKCkgLSBjb252ZXJ0VG9DbGFzc0ZpbGVOYW1lKGphdmFDbGFzcykubGVuZ3RoKCkgLSAxKTsKLQkJfSBlbHNlIGlmIChwcm90b2NvbC5lcXVhbHMoImJ1bmRsZXJlc291cmNlIikpIHsKLQkJCS8vIGlmIHRoZSBjbGFzcyBpcyBpbiBhIGJ1bmRsZSByZXNvdXJjZSAoRWNsaXBzZT8pLCB0aGUgVVJMIHdpbGwgbG9vayBzb21ldGhpbmcgbGlrZSB0aGlzOgotCQkJLy8gICAgIGJ1bmRsZXJlc291cmNlOi8vNDMvb3JnL2VjbGlwc2UvZGFsaS91dGlsaXR5L0NsYXNzcGF0aC5jbGFzcwotCQkJcmV0dXJuIHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGVuZ3RoKCkgLSBjb252ZXJ0VG9DbGFzc0ZpbGVOYW1lKGphdmFDbGFzcykubGVuZ3RoKCkgLSAxKTsKLQkJfQotCi0JCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24odXJsLnRvU3RyaW5nKCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRpcmVjdG9yaWVzIHVzZWQgYnkgdGhlIEphdmEgRXh0ZW5zaW9uIE1lY2hhbmlzbS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGVbXSBqYXZhRXh0ZW5zaW9uRGlyZWN0b3JpZXMoKSB7Ci0JCXJldHVybiBjb252ZXJ0VG9GaWxlcyhqYXZhRXh0ZW5zaW9uRGlyZWN0b3J5TmFtZXMoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkaXJlY3RvcnkgbmFtZXMgdXNlZCBieSB0aGUgSmF2YSBFeHRlbnNpb24gTWVjaGFuaXNtLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gamF2YUV4dGVuc2lvbkRpcmVjdG9yeU5hbWVzKCkgewotCQlyZXR1cm4gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmV4dC5kaXJzIikuc3BsaXQoRmlsZS5wYXRoU2VwYXJhdG9yKTsKLQl9Ci0KLQotCS8vICoqKioqIGludGVybmFsICoqKioqCi0KLQlwcml2YXRlIHN0YXRpYyBGaWxlW10gY29udmVydFRvRmlsZXMoU3RyaW5nW10gZmlsZU5hbWVzKSB7Ci0JCUZpbGVbXSBmaWxlcyA9IG5ldyBGaWxlW2ZpbGVOYW1lcy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gZmlsZU5hbWVzLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlmaWxlc1tpXSA9IG5ldyBGaWxlKGZpbGVOYW1lc1tpXSk7Ci0JCX0KLQkJcmV0dXJuIGZpbGVzOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkSmFyRmlsZU5hbWVzVG8oRmlsZSBkaXIsIExpc3Q8U3RyaW5nPiBqYXJGaWxlTmFtZXMpIHsKLQkJRmlsZVtdIGphckZpbGVzID0gamFyRmlsZXNJbihkaXIpOwotCQlmb3IgKEZpbGUgamFyRmlsZSA6IGphckZpbGVzKSB7Ci0JCQlqYXJGaWxlTmFtZXMuYWRkKEZpbGVUb29scy5jYW5vbmljYWxGaWxlKGphckZpbGUpLmdldFBhdGgoKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBGaWxlW10gamFyRmlsZXNJbihGaWxlIGRpcmVjdG9yeSkgewotCQlyZXR1cm4gZGlyZWN0b3J5Lmxpc3RGaWxlcyhqYXJGaWxlRmlsdGVyKCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIEZpbGVGaWx0ZXIgamFyRmlsZUZpbHRlcigpIHsKLQkJcmV0dXJuIG5ldyBGaWxlRmlsdGVyKCkgewotCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZmlsZSkgewotCQkJCXJldHVybiBGaWxlVG9vbHMuZXh0ZW5zaW9uKGZpbGUuZ2V0TmFtZSgpKS50b0xvd2VyQ2FzZSgpLmVxdWFscygiLmphciIpOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY2xhc3NwYXRoIHdpdGggdGhlIHNwZWNpZmllZCBlbnRyaWVzLgotCSAqLwotCXByaXZhdGUgQ2xhc3NwYXRoKEVudHJ5W10gZW50cmllcykgewotCQlzdXBlcigpOwotCQl0aGlzLmVudHJpZXMgPSBlbnRyaWVzOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNsYXNzcGF0aCB3aXRoIHRoZSBzcGVjaWZpZWQgZW50cmllcy4KLQkgKi8KLQlwdWJsaWMgQ2xhc3NwYXRoKFN0cmluZ1tdIGZpbGVOYW1lcykgewotCQl0aGlzKGJ1aWxkRW50cmllcyhmaWxlTmFtZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiBTa2lwIGVtcHR5IGZpbGUgbmFtZXMgYmVjYXVzZSB0aGV5IHdpbGwgZW5kIHVwIGV4cGFuZGluZyB0byB0aGUgY3VycmVudAotCSAqIHdvcmtpbmcgZGlyZWN0b3J5LCB3aGljaCBpcyBub3Qgd2hhdCB3ZSB3YW50LiBFbXB0eSBmaWxlIG5hbWVzIGFjdHVhbGx5Ci0JICogb2NjdXIgd2l0aCBzb21lIGZyZXF1ZW5jeTsgc3VjaCBhcyB3aGVuIHRoZSBjbGFzc3BhdGggaGFzIGJlZW4gYnVpbHQgdXAKLQkgKiBkeW5hbWljYWxseSB3aXRoIHRvbyBtYW55IHNlcGFyYXRvcnMuIEZvciBleGFtcGxlOgotCSAqICAgICAiQzpcZGV2XGZvby5qYXI7O0M6XGRldlxiYXIuamFyIgotCSAqIHdpbGwgYmUgcGFyc2VkIGludG8gdGhyZWUgZmlsZSBuYW1lczoKLQkgKiAgICAgeyAiQzpcZGV2XGZvby5qYXIiLCAiIiwgIkM6XGRldlxiYXIuamFyIiB9Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgRW50cnlbXSBidWlsZEVudHJpZXMoU3RyaW5nW10gZmlsZU5hbWVzKSB7Ci0JCUxpc3Q8RW50cnk+IGVudHJpZXMgPSBuZXcgQXJyYXlMaXN0PEVudHJ5PigpOwotCQlmb3IgKFN0cmluZyBmaWxlTmFtZSA6IGZpbGVOYW1lcykgewotCQkJaWYgKChmaWxlTmFtZSAhPSBudWxsKSAmJiAoZmlsZU5hbWUubGVuZ3RoKCkgIT0gMCkpIHsKLQkJCQllbnRyaWVzLmFkZChuZXcgRW50cnkoZmlsZU5hbWUpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZW50cmllcy50b0FycmF5KG5ldyBFbnRyeVtlbnRyaWVzLnNpemUoKV0pOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNsYXNzcGF0aCB3aXRoIHRoZSBzcGVjaWZpZWQgcGF0aC4KLQkgKi8KLQlwdWJsaWMgQ2xhc3NwYXRoKFN0cmluZyBwYXRoKSB7Ci0JCXRoaXMocGF0aC5zcGxpdChGaWxlLnBhdGhTZXBhcmF0b3IpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjbGFzc3BhdGggd2l0aCB0aGUgc3BlY2lmaWVkIGVudHJpZXMuCi0JICovCi0JcHVibGljIENsYXNzcGF0aChMaXN0PFN0cmluZz4gZmlsZU5hbWVzKSB7Ci0JCXRoaXMoZmlsZU5hbWVzLnRvQXJyYXkobmV3IFN0cmluZ1tmaWxlTmFtZXMuc2l6ZSgpXSkpOwotCX0KLQotCS8qKgotCSAqIENvbnNvbGlkYXRlIHRoZSBzcGVjaWZpZWQgY2xhc3NwYXRocyBpbnRvIGEgc2luZ2xlIGNsYXNzcGF0aC4KLQkgKi8KLQlwdWJsaWMgQ2xhc3NwYXRoKENsYXNzcGF0aFtdIGNsYXNzcGF0aHMpIHsKLQkJdGhpcyhjb25zb2xpZGF0ZUVudHJpZXMoY2xhc3NwYXRocykpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIEVudHJ5W10gY29uc29saWRhdGVFbnRyaWVzKENsYXNzcGF0aFtdIGNsYXNzcGF0aHMpIHsKLQkJTGlzdDxFbnRyeT4gZW50cmllcyA9IG5ldyBBcnJheUxpc3Q8RW50cnk+KCk7Ci0JCWZvciAoQ2xhc3NwYXRoIGNsYXNzcGF0aCA6IGNsYXNzcGF0aHMpIHsKLQkJCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoZW50cmllcywgY2xhc3NwYXRoLmdldEVudHJpZXMoKSk7Ci0JCX0KLQkJcmV0dXJuIGVudHJpZXMudG9BcnJheShuZXcgRW50cnlbZW50cmllcy5zaXplKCldKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcHVibGljIEFQSSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzcGF0aCdzIGVudHJpZXMuCi0JICovCi0JcHVibGljIEVudHJ5W10gZ2V0RW50cmllcygpIHsKLQkJcmV0dXJuIHRoaXMuZW50cmllczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzcGF0aCdzIHBhdGguCi0JICovCi0JcHVibGljIFN0cmluZyBwYXRoKCkgewotCQlFbnRyeVtdIGxvY2FsRW50cmllcyA9IHRoaXMuZW50cmllczsKLQkJaW50IG1heCA9IGxvY2FsRW50cmllcy5sZW5ndGggLSAxOwotCQlpZiAobWF4ID09IC0xKSB7Ci0JCQlyZXR1cm4gIiI7Ci0JCX0KLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigyMDAwKTsKLQkJLy8gc3RvcCBvbmUgc2hvcnQgb2YgdGhlIGVuZCBvZiB0aGUgYXJyYXkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXg7IGkrKykgewotCQkJc2IuYXBwZW5kKGxvY2FsRW50cmllc1tpXS5maWxlTmFtZSgpKTsKLQkJCXNiLmFwcGVuZChGaWxlLnBhdGhTZXBhcmF0b3JDaGFyKTsKLQkJfQotCQlzYi5hcHBlbmQobG9jYWxFbnRyaWVzW21heF0uZmlsZU5hbWUoKSk7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFNlYXJjaCB0aGUgY2xhc3NwYXRoIGZvciB0aGUgc3BlY2lmaWVkICh1bnF1YWxpZmllZCkgZmlsZQotCSAqIGFuZCByZXR1cm4gaXRzIGVudHJ5LiBSZXR1cm4gbnVsbCBpZiBhbiBlbnRyeSBpcyBub3QgZm91bmQuCi0JICogRm9yIGV4YW1wbGUsIHlvdSBjb3VsZCB1c2UgdGhpcyBtZXRob2QgdG8gZmluZCB0aGUgZW50cnkKLQkgKiBmb3IgInJ0LmphciIgb3IgInRvcGxpbmsuamFyIi4KLQkgKi8KLQlwdWJsaWMgRW50cnkgZW50cnlGb3JGaWxlTmFtZWQoU3RyaW5nIHNob3J0RmlsZU5hbWUpIHsKLQkJRW50cnlbXSBsb2NhbEVudHJpZXMgPSB0aGlzLmVudHJpZXM7Ci0JCWZvciAoRW50cnkgZW50cnkgOiBsb2NhbEVudHJpZXMpIHsKLQkJCWlmIChlbnRyeS5maWxlKCkuZ2V0TmFtZSgpLmVxdWFscyhzaG9ydEZpbGVOYW1lKSkgewotCQkJCXJldHVybiBlbnRyeTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZpcnN0IGVudHJ5IGZpbGUgaW4gdGhlIGNsYXNzcGF0aAotCSAqIHRoYXQgY29udGFpbnMgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBSZXR1cm4gbnVsbCBpZiBhbiBlbnRyeSBpcyBub3QgZm91bmQuCi0JICovCi0JcHVibGljIEVudHJ5IGVudHJ5Rm9yQ2xhc3NOYW1lZChTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCVN0cmluZyByZWxhdGl2ZUNsYXNzRmlsZU5hbWUgPSBjb252ZXJ0VG9DbGFzc0ZpbGVOYW1lKGNsYXNzTmFtZSk7Ci0JCVN0cmluZyBhcmNoaXZlRW50cnlOYW1lID0gY29udmVydFRvQXJjaGl2ZUNsYXNzRmlsZUVudHJ5TmFtZShjbGFzc05hbWUpOwotCQlFbnRyeVtdIGxvY2FsRW50cmllcyA9IHRoaXMuZW50cmllczsKLQkJZm9yIChFbnRyeSBlbnRyeSA6IGxvY2FsRW50cmllcykgewotCQkJaWYgKGVudHJ5LmNvbnRhaW5zKHJlbGF0aXZlQ2xhc3NGaWxlTmFtZSwgYXJjaGl2ZUVudHJ5TmFtZSkpIHsKLQkJCQlyZXR1cm4gZW50cnk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lcyBvZiBhbGwgdGhlIGNsYXNzZXMgZGlzY292ZXJlZCBvbiB0aGUgY2xhc3NwYXRoLAotCSAqIHdpdGggZHVwbGljYXRlcyByZW1vdmVkLgotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBjbGFzc05hbWVzKCkgewotCQlyZXR1cm4gdGhpcy5jbGFzc05hbWVzKEZpbHRlci5OdWxsLjxTdHJpbmc+aW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lcyBvZiBhbGwgdGhlIGNsYXNzZXMgZGlzY292ZXJlZCBvbiB0aGUgY2xhc3NwYXRoCi0JICogYW5kIGFjY2VwdGVkIGJ5IHRoZSBzcGVjaWZpZWQgZmlsdGVyLCB3aXRoIGR1cGxpY2F0ZXMgcmVtb3ZlZC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gY2xhc3NOYW1lcyhGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGNsYXNzTmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KDEwMDAwKTsKLQkJdGhpcy5hZGRDbGFzc05hbWVzVG8oY2xhc3NOYW1lcywgZmlsdGVyKTsKLQkJcmV0dXJuIGNsYXNzTmFtZXMudG9BcnJheShuZXcgU3RyaW5nW2NsYXNzTmFtZXMuc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBuYW1lcyBvZiBhbGwgdGhlIGNsYXNzZXMgZGlzY292ZXJlZCBvbiB0aGUgY2xhc3NwYXRoCi0JICogdG8gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENsYXNzTmFtZXNUbyhDb2xsZWN0aW9uPFN0cmluZz4gY2xhc3NOYW1lcykgewotCQl0aGlzLmFkZENsYXNzTmFtZXNUbyhjbGFzc05hbWVzLCBGaWx0ZXIuTnVsbC48U3RyaW5nPmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgbmFtZXMgb2YgYWxsIHRoZSBjbGFzc2VzIGRpc2NvdmVyZWQgb24gdGhlIGNsYXNzcGF0aAotCSAqIGFuZCBhY2NlcHRlZCBieSB0aGUgc3BlY2lmaWVkIGZpbHRlciB0byB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICovCi0JcHVibGljIHZvaWQgYWRkQ2xhc3NOYW1lc1RvKENvbGxlY3Rpb248U3RyaW5nPiBjbGFzc05hbWVzLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJRW50cnlbXSBsb2NhbEVudHJpZXMgPSB0aGlzLmVudHJpZXM7Ci0JCWZvciAoRW50cnkgZW50cnkgOiBsb2NhbEVudHJpZXMpIHsKLQkJCWVudHJ5LmFkZENsYXNzTmFtZXNUbyhjbGFzc05hbWVzLCBmaWx0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lcyBvZiBhbGwgdGhlIGNsYXNzZXMgZGlzY292ZXJlZCBvbiB0aGUgY2xhc3NwYXRoLgotCSAqIEp1c3QgYSBiaXQgbW9yZSBwZXJmb3JtYW50IHRoYW4gI2NsYXNzTmFtZXMoKS4KLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBjbGFzc05hbWVzU3RyZWFtKCkgewotCQlyZXR1cm4gdGhpcy5jbGFzc05hbWVzU3RyZWFtKEZpbHRlci5OdWxsLjxTdHJpbmc+aW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lcyBvZiBhbGwgdGhlIGNsYXNzZXMgZGlzY292ZXJlZCBvbiB0aGUgY2xhc3NwYXRoCi0JICogdGhhdCBhcmUgYWNjZXB0ZWQgYnkgdGhlIHNwZWNpZmllZCBmaWx0ZXIuCi0JICogSnVzdCBhIGJpdCBtb3JlIHBlcmZvcm1hbnQgdGhhbiAjY2xhc3NOYW1lcyhGaWx0ZXIpLgotCSAqLwotCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGNsYXNzTmFtZXNTdHJlYW0oRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmF0b3I8U3RyaW5nPih0aGlzLmVudHJ5Q2xhc3NOYW1lc1N0cmVhbXMoZmlsdGVyKSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxJdGVyYXRvcjxTdHJpbmc+PiBlbnRyeUNsYXNzTmFtZXNTdHJlYW1zKGZpbmFsIEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8RW50cnksIEl0ZXJhdG9yPFN0cmluZz4+KG5ldyBBcnJheUl0ZXJhdG9yPEVudHJ5Pih0aGlzLmVudHJpZXMpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJdGVyYXRvcjxTdHJpbmc+IHRyYW5zZm9ybShFbnRyeSBlbnRyeSkgewotCQkJCXJldHVybiBlbnRyeS5jbGFzc05hbWVzU3RyZWFtKGZpbHRlcik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgImNvbXByZXNzZWQiIHZlcnNpb24gb2YgdGhlIGNsYXNzcGF0aCB3aXRoIGl0cwotCSAqIGR1cGxpY2F0ZSBlbnRyaWVzIGVsaW1pbmF0ZWQuCi0JICovCi0JcHVibGljIENsYXNzcGF0aCBjb21wcmVzc2VkKCkgewotCQlyZXR1cm4gbmV3IENsYXNzcGF0aCgoRW50cnlbXSkgQ29sbGVjdGlvblRvb2xzLnJlbW92ZUR1cGxpY2F0ZUVsZW1lbnRzKHRoaXMuZW50cmllcykpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIGNsYXNzcGF0aCB0byBhbiBhcnJheSBvZiBVUkxzCi0JICogKHRoYXQgY2FuIGJlIHVzZWQgdG8gaW5zdGFudGlhdGUgYSBVUkxDbGFzc0xvYWRlcikuCi0JICovCi0JcHVibGljIFVSTFtdIHVybHMoKSB7Ci0JCUVudHJ5W10gbG9jYWxFbnRyaWVzID0gdGhpcy5lbnRyaWVzOwotCQlpbnQgbGVuID0gbG9jYWxFbnRyaWVzLmxlbmd0aDsKLQkJVVJMW10gdXJscyA9IG5ldyBVUkxbbGVuXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJdXJsc1tpXSA9IGxvY2FsRW50cmllc1tpXS51cmwoKTsKLQkJfQotCQlyZXR1cm4gdXJsczsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLnBhdGgoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGlubmVyIGNsYXNzICoqKioqKioqKioKLQotCS8qKgotCSAqIFRPRE8KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIEVudHJ5IGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKLQkJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZmlsZU5hbWU7Ci0JCXByaXZhdGUgZmluYWwgRmlsZSBmaWxlOwotCQlwcml2YXRlIGZpbmFsIEZpbGUgY2Fub25pY2FsRmlsZTsKLQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQlFbnRyeShTdHJpbmcgZmlsZU5hbWUpIHsKLQkJCXN1cGVyKCk7Ci0JCQlpZiAoKGZpbGVOYW1lID09IG51bGwpIHx8IChmaWxlTmFtZS5sZW5ndGgoKSA9PSAwKSkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIidmaWxlTmFtZScgbXVzdCBiZSBub24tZW1wdHkiKTsKLQkJCX0KLQkJCXRoaXMuZmlsZU5hbWUgPSBmaWxlTmFtZTsKLQkJCXRoaXMuZmlsZSA9IG5ldyBGaWxlKGZpbGVOYW1lKTsKLQkJCXRoaXMuY2Fub25pY2FsRmlsZSA9IEZpbGVUb29scy5jYW5vbmljYWxGaWxlKHRoaXMuZmlsZSk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGZpbGVOYW1lKCkgewotCQkJcmV0dXJuIHRoaXMuZmlsZU5hbWU7Ci0JCX0KLQotCQlwdWJsaWMgRmlsZSBmaWxlKCkgewotCQkJcmV0dXJuIHRoaXMuZmlsZTsKLQkJfQotCi0JCXB1YmxpYyBGaWxlIGNhbm9uaWNhbEZpbGUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5jYW5vbmljYWxGaWxlOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBjYW5vbmljYWxGaWxlTmFtZSgpIHsKLQkJCXJldHVybiB0aGlzLmNhbm9uaWNhbEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCQlpZiAoICEgKG8gaW5zdGFuY2VvZiBFbnRyeSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXR1cm4gKChFbnRyeSkgbykuY2Fub25pY2FsRmlsZS5lcXVhbHModGhpcy5jYW5vbmljYWxGaWxlKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQkJcmV0dXJuIHRoaXMuY2Fub25pY2FsRmlsZS5oYXNoQ29kZSgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgZW50cnkncyAiY2Fub25pY2FsIiBVUkwuCi0JCSAqLwotCQlwdWJsaWMgVVJMIHVybCgpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIHRoaXMuY2Fub25pY2FsRmlsZS50b1VSTCgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIHdoZXRoZXIgdGhlIGVudHJ5IGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJCXJldHVybiB0aGlzLmNvbnRhaW5zKGphdmFDbGFzcy5nZXROYW1lKCkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB3aGV0aGVyIHRoZSBlbnRyeSBjb250YWlucyB0aGUgc3BlY2lmaWVkIGNsYXNzLgotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gY29udGFpbnMoU3RyaW5nIGNsYXNzTmFtZSkgewotCQkJcmV0dXJuIHRoaXMuY29udGFpbnMoY29udmVydFRvQ2xhc3NGaWxlTmFtZShjbGFzc05hbWUpLCBjb252ZXJ0VG9BcmNoaXZlQ2xhc3NGaWxlRW50cnlOYW1lKGNsYXNzTmFtZSkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB3aGV0aGVyIHRoZSBlbnRyeSBjb250YWlucyBlaXRoZXIgdGhlIHNwZWNpZmllZCByZWxhdGl2ZQotCQkgKiBjbGFzcyBmaWxlIG9yIHRoZSBzcGVjaWZpZWQgYXJjaGl2ZSBlbnRyeS4KLQkJICogTm90IHRoZSBwcmV0dGllc3Qgc2lnbmF0dXJlLCBidXQgaXQncyBpbnRlcm5hbC4uLi4KLQkJICovCi0JCWJvb2xlYW4gY29udGFpbnMoU3RyaW5nIHJlbGF0aXZlQ2xhc3NGaWxlTmFtZSwgU3RyaW5nIGFyY2hpdmVFbnRyeU5hbWUpIHsKLQkJCWlmICggISB0aGlzLmNhbm9uaWNhbEZpbGUuZXhpc3RzKCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlpZiAodGhpcy5jYW5vbmljYWxGaWxlLmlzRGlyZWN0b3J5KCkgJiYgKG5ldyBGaWxlKHRoaXMuY2Fub25pY2FsRmlsZSwgcmVsYXRpdmVDbGFzc0ZpbGVOYW1lKSkuZXhpc3RzKCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCXJldHVybiAoZmlsZUlzQXJjaGl2ZSh0aGlzLmNhbm9uaWNhbEZpbGUpICYmIHRoaXMuYXJjaGl2ZUNvbnRhaW5zRW50cnkoYXJjaGl2ZUVudHJ5TmFtZSkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB3aGV0aGVyIHRoZSBlbnRyeSdzIGFyY2hpdmUgY29udGFpbnMgdGhlIHNwZWNpZmllZCBlbnRyeS4KLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBhcmNoaXZlQ29udGFpbnNFbnRyeShTdHJpbmcgemlwRW50cnlOYW1lKSB7Ci0JCQlaaXBGaWxlIHppcEZpbGUgPSBudWxsOwotCQkJWmlwRW50cnkgemlwRW50cnkgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQl6aXBGaWxlID0gbmV3IFppcEZpbGUodGhpcy5jYW5vbmljYWxGaWxlKTsKLQkJCQl6aXBFbnRyeSA9IHppcEZpbGUuZ2V0RW50cnkoemlwRW50cnlOYW1lKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQkJemlwRW50cnkgPSBudWxsOwkvLyBzb21ldGhpbmcgaXMgd3JvbmcsIGNsZWFyIG91dCB0aGUgZW50cnkKLQkJCX0gZmluYWxseSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKHppcEZpbGUgIT0gbnVsbCkgewotCQkJCQkJemlwRmlsZS5jbG9zZSgpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCQkJemlwRW50cnkgPSBudWxsOwkvLyBzb21ldGhpbmcgaXMgd3JvbmcsIGNsZWFyIG91dCB0aGUgZW50cnkKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gemlwRW50cnkgIT0gbnVsbDsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIG5hbWVzIG9mIGFsbCB0aGUgY2xhc3NlcyBkaXNjb3ZlcmVkIGluIHRoZSBlbnRyeS4KLQkJICovCi0JCXB1YmxpYyBTdHJpbmdbXSBjbGFzc05hbWVzKCkgewotCQkJcmV0dXJuIHRoaXMuY2xhc3NOYW1lcyhGaWx0ZXIuTnVsbC48U3RyaW5nPmluc3RhbmNlKCkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgbmFtZXMgb2YgYWxsIHRoZSBjbGFzc2VzIGRpc2NvdmVyZWQgaW4gdGhlIGVudHJ5Ci0JCSAqIGFuZCBhY2NlcHRlZCBieSB0aGUgc3BlY2lmaWVkIGZpbHRlci4KLQkJICovCi0JCXB1YmxpYyBTdHJpbmdbXSBjbGFzc05hbWVzKEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgewotCQkJQ29sbGVjdGlvbjxTdHJpbmc+IGNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oMjAwMCk7Ci0JCQl0aGlzLmFkZENsYXNzTmFtZXNUbyhjbGFzc05hbWVzLCBmaWx0ZXIpOwotCQkJcmV0dXJuIGNsYXNzTmFtZXMudG9BcnJheShuZXcgU3RyaW5nW2NsYXNzTmFtZXMuc2l6ZSgpXSk7Ci0JCX0KLQotCQkvKioKLQkJICogQWRkIHRoZSBuYW1lcyBvZiBhbGwgdGhlIGNsYXNzZXMgZGlzY292ZXJlZCBpbiB0aGUgZW50cnkKLQkJICogdG8gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCQkgKi8KLQkJcHVibGljIHZvaWQgYWRkQ2xhc3NOYW1lc1RvKENvbGxlY3Rpb248U3RyaW5nPiBjbGFzc05hbWVzKSB7Ci0JCQl0aGlzLmFkZENsYXNzTmFtZXNUbyhjbGFzc05hbWVzLCBGaWx0ZXIuTnVsbC48U3RyaW5nPmluc3RhbmNlKCkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEFkZCB0aGUgbmFtZXMgb2YgYWxsIHRoZSBjbGFzc2VzIGRpc2NvdmVyZWQgaW4gdGhlIGVudHJ5Ci0JCSAqIGFuZCBhY2NlcHRlZCBieSB0aGUgc3BlY2lmaWVkIGZpbHRlciB0byB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBhZGRDbGFzc05hbWVzVG8oQ29sbGVjdGlvbjxTdHJpbmc+IGNsYXNzTmFtZXMsIEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgewotCQkJaWYgKHRoaXMuY2Fub25pY2FsRmlsZS5leGlzdHMoKSkgewotCQkJCWlmICh0aGlzLmNhbm9uaWNhbEZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJCQl0aGlzLmFkZENsYXNzTmFtZXNGb3JEaXJlY3RvcnlUbyhjbGFzc05hbWVzLCBmaWx0ZXIpOwotCQkJCX0gZWxzZSBpZiAoZmlsZUlzQXJjaGl2ZSh0aGlzLmNhbm9uaWNhbEZpbGUpKSB7Ci0JCQkJCXRoaXMuYWRkQ2xhc3NOYW1lc0ZvckFyY2hpdmVUbyhjbGFzc05hbWVzLCBmaWx0ZXIpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBBZGQgdGhlIG5hbWVzIG9mIGFsbCB0aGUgY2xhc3NlcyBkaXNjb3ZlcmVkCi0JCSAqIHVuZGVyIHRoZSBlbnRyeSdzIGRpcmVjdG9yeSBhbmQgYWNjZXB0ZWQgYnkKLQkJICogdGhlIHNwZWNpZmllZCBmaWx0ZXIgdG8gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGFkZENsYXNzTmFtZXNGb3JEaXJlY3RvcnlUbyhDb2xsZWN0aW9uPFN0cmluZz4gY2xhc3NOYW1lcywgRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCQlpbnQgc3RhcnQgPSB0aGlzLmNhbm9uaWNhbEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkubGVuZ3RoKCkgKyAxOwotCQkJZm9yIChJdGVyYXRvcjxGaWxlPiBzdHJlYW0gPSB0aGlzLmNsYXNzRmlsZXNGb3JEaXJlY3RvcnkoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGNvbnZlcnRUb0NsYXNzTmFtZShzdHJlYW0ubmV4dCgpLmdldEFic29sdXRlUGF0aCgpLnN1YnN0cmluZyhzdGFydCkpOwotCQkJCWlmIChmaWx0ZXIuYWNjZXB0KGNsYXNzTmFtZSkpIHsKLQkJCQkJY2xhc3NOYW1lcy5hZGQoY2xhc3NOYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIGFuIGl0ZXJhdG9yIG9uIGFsbCB0aGUgY2xhc3MgZmlsZXMgZGlzY292ZXJlZAotCQkgKiB1bmRlciB0aGUgZW50cnkncyBkaXJlY3RvcnkuCi0JCSAqLwotCQlwcml2YXRlIEl0ZXJhdG9yPEZpbGU+IGNsYXNzRmlsZXNGb3JEaXJlY3RvcnkoKSB7Ci0JCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPEZpbGU+KEZpbGVUb29scy5maWxlc0luVHJlZSh0aGlzLmNhbm9uaWNhbEZpbGUpKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBuZXh0KSB7Ci0JCQkJCXJldHVybiBFbnRyeS50aGlzLmZpbGVOYW1lTWlnaHRCZUZvckNsYXNzRmlsZSgoKEZpbGUpIG5leHQpLmdldE5hbWUoKSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCS8qKgotCQkgKiBBZGQgdGhlIG5hbWVzIG9mIGFsbCB0aGUgY2xhc3NlcyBkaXNjb3ZlcmVkCi0JCSAqIGluIHRoZSBlbnRyeSdzIGFyY2hpdmUgZmlsZSBhbmQgYWNjZXB0ZWQgYnkgdGhlCi0JCSAqIHNwZWNpZmllZCBmaWx0ZXIgdG8gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGFkZENsYXNzTmFtZXNGb3JBcmNoaXZlVG8oQ29sbGVjdGlvbjxTdHJpbmc+IGNsYXNzTmFtZXMsIEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgewotCQkJWmlwRmlsZSB6aXBGaWxlID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJemlwRmlsZSA9IG5ldyBaaXBGaWxlKHRoaXMuY2Fub25pY2FsRmlsZSk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCWZvciAoRW51bWVyYXRpb248PyBleHRlbmRzIFppcEVudHJ5PiBzdHJlYW0gPSB6aXBGaWxlLmVudHJpZXMoKTsgc3RyZWFtLmhhc01vcmVFbGVtZW50cygpOyApIHsKLQkJCQlaaXBFbnRyeSB6aXBFbnRyeSA9IHN0cmVhbS5uZXh0RWxlbWVudCgpOwotCQkJCVN0cmluZyB6aXBFbnRyeU5hbWUgPSB6aXBFbnRyeS5nZXROYW1lKCk7Ci0JCQkJaWYgKHRoaXMuZmlsZU5hbWVNaWdodEJlRm9yQ2xhc3NGaWxlKHppcEVudHJ5TmFtZSkpIHsKLQkJCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGNvbnZlcnRUb0NsYXNzTmFtZSh6aXBFbnRyeU5hbWUpOwotCQkJCQlpZiAoZmlsdGVyLmFjY2VwdChjbGFzc05hbWUpKSB7Ci0JCQkJCQljbGFzc05hbWVzLmFkZChjbGFzc05hbWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJdHJ5IHsKLQkJCQl6aXBGaWxlLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGZpbGUgbWlnaHQgYmUgYSBKYXZhIGNsYXNzIGZpbGUuCi0JCSAqIFRoZSBmaWxlIG5hbWUgbXVzdCBhdCBsZWFzdCBlbmQgd2l0aCAiLmNsYXNzIiBhbmQgY29udGFpbiBubyBzcGFjZXMuCi0JCSAqIChOZWl0aGVyIGNsYXNzIG5hbWVzIG5vciBwYWNrYWdlIG5hbWVzIG1heSBjb250YWluIHNwYWNlcy4pCi0JCSAqIFdoZXRoZXIgaXQgYWN0dWFsbHkgaXMgYSBjbGFzcyBmaWxlIHdpbGwgbmVlZCB0byBiZSBkZXRlcm1pbmVkIGJ5Ci0JCSAqIGEgY2xhc3MgbG9hZGVyLgotCQkgKi8KLQkJYm9vbGVhbiBmaWxlTmFtZU1pZ2h0QmVGb3JDbGFzc0ZpbGUoU3RyaW5nIG5hbWUpIHsKLQkJCXJldHVybiBGaWxlVG9vbHMuZXh0ZW5zaW9uKG5hbWUpLnRvTG93ZXJDYXNlKCkuZXF1YWxzKCIuY2xhc3MiKQotCQkJCQkmJiAobmFtZS5pbmRleE9mKCcgJykgPT0gLTEpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgbmFtZXMgb2YgYWxsIHRoZSBjbGFzc2VzIGRpc2NvdmVyZWQgb24gdGhlIGNsYXNzcGF0aC4KLQkJICogSnVzdCBhIGJpdCBtb3JlIHBlcmZvcm1hbnQgdGhhbiAjY2xhc3NOYW1lcygpLgotCQkgKi8KLQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gY2xhc3NOYW1lc1N0cmVhbSgpIHsKLQkJCXJldHVybiB0aGlzLmNsYXNzTmFtZXNTdHJlYW0oRmlsdGVyLk51bGwuPFN0cmluZz5pbnN0YW5jZSgpKTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIG5hbWVzIG9mIGFsbCB0aGUgY2xhc3NlcyBkaXNjb3ZlcmVkIG9uIHRoZSBjbGFzc3BhdGgKLQkJICogdGhhdCBhcmUgYWNjZXB0ZWQgYnkgdGhlIHNwZWNpZmllZCBmaWx0ZXIuCi0JCSAqIEp1c3QgYSBiaXQgbW9yZSBwZXJmb3JtYW50IHRoYW4gI2NsYXNzTmFtZXMoRmlsdGVyKS4KLQkJICovCi0JCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGNsYXNzTmFtZXNTdHJlYW0oRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCQlpZiAodGhpcy5jYW5vbmljYWxGaWxlLmV4aXN0cygpKSB7Ci0JCQkJaWYgKHRoaXMuY2Fub25pY2FsRmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJCXJldHVybiB0aGlzLmNsYXNzTmFtZXNGb3JEaXJlY3RvcnkoZmlsdGVyKTsKLQkJCQl9Ci0JCQkJaWYgKGZpbGVJc0FyY2hpdmUodGhpcy5jYW5vbmljYWxGaWxlKSkgewotCQkJCQlyZXR1cm4gdGhpcy5jbGFzc05hbWVzRm9yQXJjaGl2ZShmaWx0ZXIpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBuYW1lcyBvZiBhbGwgdGhlIGNsYXNzZXMgZGlzY292ZXJlZAotCQkgKiB1bmRlciB0aGUgZW50cnkncyBkaXJlY3RvcnkgYW5kIGFjY2VwdGVkIGJ5Ci0JCSAqIHRoZSBzcGVjaWZpZWQgZmlsdGVyLgotCQkgKi8KLQkJcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGNsYXNzTmFtZXNGb3JEaXJlY3RvcnkoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPFN0cmluZz4odGhpcy5jbGFzc05hbWVzRm9yRGlyZWN0b3J5KCksIGZpbHRlcik7Ci0JCX0KLQotCQkvKioKLQkJICogVHJhbnNmb3JtIHRoZSBjbGFzcyBmaWxlcyB0byBjbGFzcyBuYW1lcy4KLQkJICovCi0JCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBjbGFzc05hbWVzRm9yRGlyZWN0b3J5KCkgewotCQkJZmluYWwgaW50IHN0YXJ0ID0gdGhpcy5jYW5vbmljYWxGaWxlLmdldEFic29sdXRlUGF0aCgpLmxlbmd0aCgpICsgMTsKLQkJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxGaWxlLCBTdHJpbmc+KHRoaXMuY2xhc3NGaWxlc0ZvckRpcmVjdG9yeSgpKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oRmlsZSBmKSB7Ci0JCQkJCXJldHVybiBjb252ZXJ0VG9DbGFzc05hbWUoZi5nZXRBYnNvbHV0ZVBhdGgoKS5zdWJzdHJpbmcoc3RhcnQpKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgbmFtZXMgb2YgYWxsIHRoZSBjbGFzc2VzIGRpc2NvdmVyZWQKLQkJICogaW4gdGhlIGVudHJ5J3MgYXJjaGl2ZSBmaWxlIGFuZCBhY2NlcHRlZCBieSB0aGUKLQkJICogc3BlY2lmaWVkIGZpbHRlci4KLQkJICovCi0JCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBjbGFzc05hbWVzRm9yQXJjaGl2ZShGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJCS8vIHdlIGNhbid0IHNpbXBseSB3cmFwIGl0ZXJhdG9ycyBoZXJlIGJlY2F1c2Ugd2UgbmVlZCB0byBjbG9zZSB0aGUgYXJjaGl2ZSBmaWxlLi4uCi0JCQlaaXBGaWxlIHppcEZpbGUgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQl6aXBGaWxlID0gbmV3IFppcEZpbGUodGhpcy5jYW5vbmljYWxGaWxlKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQkJCX0KLQkJCUNvbGxlY3Rpb248U3RyaW5nPiBjbGFzc05hbWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPih6aXBGaWxlLnNpemUoKSk7Ci0JCQlmb3IgKEVudW1lcmF0aW9uPD8gZXh0ZW5kcyBaaXBFbnRyeT4gc3RyZWFtID0gemlwRmlsZS5lbnRyaWVzKCk7IHN0cmVhbS5oYXNNb3JlRWxlbWVudHMoKTsgKSB7Ci0JCQkJWmlwRW50cnkgemlwRW50cnkgPSBzdHJlYW0ubmV4dEVsZW1lbnQoKTsKLQkJCQlTdHJpbmcgemlwRW50cnlOYW1lID0gemlwRW50cnkuZ2V0TmFtZSgpOwotCQkJCWlmICh0aGlzLmZpbGVOYW1lTWlnaHRCZUZvckNsYXNzRmlsZSh6aXBFbnRyeU5hbWUpKSB7Ci0JCQkJCVN0cmluZyBjbGFzc05hbWUgPSBjb252ZXJ0VG9DbGFzc05hbWUoemlwRW50cnlOYW1lKTsKLQkJCQkJaWYgKGZpbHRlci5hY2NlcHQoY2xhc3NOYW1lKSkgewotCQkJCQkJY2xhc3NOYW1lcy5hZGQoY2xhc3NOYW1lKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXRyeSB7Ci0JCQkJemlwRmlsZS5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCQlyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCQkJfQotCQkJcmV0dXJuIGNsYXNzTmFtZXMuaXRlcmF0b3IoKTsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvQ29sbGVjdGlvblRvb2xzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvQ29sbGVjdGlvblRvb2xzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0ZGY0M2IuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0NvbGxlY3Rpb25Ub29scy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuU2luZ2xlRWxlbWVudEl0ZXJhdG9yOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29sbGVjdGlvblRvb2xzIHsKLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgZm9sbG93ZWQgYnkgdGhlIHNwZWNpZmllZCBvYmplY3QgdG8gYmUgYWRkZWQuCi0JICogamF2YS51dGlsLkFycmF5cyNhZGQoT2JqZWN0W10gYXJyYXksIE9iamVjdCBvKQotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBhZGQoRVtdIGFycmF5LCBFIHZhbHVlKSB7Ci0JCWludCBsZW4gPSBhcnJheS5sZW5ndGg7Ci0JCUVbXSByZXN1bHQgPSAoRVtdKSBBcnJheS5uZXdJbnN0YW5jZShhcnJheS5nZXRDbGFzcygpLmdldENvbXBvbmVudFR5cGUoKSwgbGVuICsgMSk7Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIDAsIHJlc3VsdCwgMCwgbGVuKTsKLQkJcmVzdWx0W2xlbl0gPSB2YWx1ZTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIHNwZWNpZmllZCBvYmplY3QgYWRkZWQgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI2FkZChPYmplY3RbXSBhcnJheSwgaW50IGluZGV4LCBPYmplY3QgbykKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gYWRkKEVbXSBhcnJheSwgaW50IGluZGV4LCBFIHZhbHVlKSB7Ci0JCWludCBsZW4gPSBhcnJheS5sZW5ndGg7Ci0JCUVbXSByZXN1bHQgPSAoRVtdKSBBcnJheS5uZXdJbnN0YW5jZShhcnJheS5nZXRDbGFzcygpLmdldENvbXBvbmVudFR5cGUoKSwgbGVuICsgMSk7Ci0JCWlmIChpbmRleCA+IDApIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIDAsIHJlc3VsdCwgMCwgaW5kZXgpOwotCQl9Ci0JCXJlc3VsdFtpbmRleF0gPSB2YWx1ZTsKLQkJaWYgKGxlbiA+IGluZGV4KSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCBpbmRleCwgcmVzdWx0LCBpbmRleCArIDEsIGxlbiAtIGluZGV4KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgZm9sbG93ZWQgYnkgdGhlIHNwZWNpZmllZCB2YWx1ZSB0byBiZSBhZGRlZC4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI2FkZChjaGFyW10gYXJyYXksIGNoYXIgdmFsdWUpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gYWRkKGNoYXJbXSBhcnJheSwgY2hhciB2YWx1ZSkgewotCQlpbnQgbGVuID0gYXJyYXkubGVuZ3RoOwotCQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbbGVuICsgMV07Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIDAsIHJlc3VsdCwgMCwgbGVuKTsKLQkJcmVzdWx0W2xlbl0gPSB2YWx1ZTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZSBhZGRlZCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotCSAqIGphdmEudXRpbC5BcnJheXMjYWRkKGNoYXJbXSBhcnJheSwgaW50IGluZGV4LCBjaGFyIHZhbHVlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIGFkZChjaGFyW10gYXJyYXksIGludCBpbmRleCwgY2hhciB2YWx1ZSkgewotCQlpbnQgbGVuID0gYXJyYXkubGVuZ3RoOwotCQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbbGVuICsgMV07Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIDAsIHJlc3VsdCwgMCwgaW5kZXgpOwotCQlyZXN1bHRbaW5kZXhdID0gdmFsdWU7Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIGluZGV4LCByZXN1bHQsIGluZGV4ICsgMSwgbGVuIC0gaW5kZXgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgZm9sbG93ZWQgYnkgdGhlIHNwZWNpZmllZCB2YWx1ZSB0byBiZSBhZGRlZC4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI2FkZChpbnRbXSBhcnJheSwgaW50IHZhbHVlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50W10gYWRkKGludFtdIGFycmF5LCBpbnQgdmFsdWUpIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJaW50W10gcmVzdWx0ID0gbmV3IGludFtsZW4gKyAxXTsKLQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgMCwgcmVzdWx0LCAwLCBsZW4pOwotCQlyZXN1bHRbbGVuXSA9IHZhbHVlOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlIGFkZGVkIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCi0JICogamF2YS51dGlsLkFycmF5cyNhZGQoaW50W10gYXJyYXksIGludCBpbmRleCwgaW50IHZhbHVlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50W10gYWRkKGludFtdIGFycmF5LCBpbnQgaW5kZXgsIGludCB2YWx1ZSkgewotCQlpbnQgbGVuID0gYXJyYXkubGVuZ3RoOwotCQlpbnRbXSByZXN1bHQgPSBuZXcgaW50W2xlbiArIDFdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCAwLCByZXN1bHQsIDAsIGluZGV4KTsKLQkJcmVzdWx0W2luZGV4XSA9IHZhbHVlOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCBpbmRleCwgcmVzdWx0LCBpbmRleCArIDEsIGxlbiAtIGluZGV4KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgYWxsIHRoZSBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yCi0JICogdG8gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQgYXMgYSByZXN1bHQuCi0JICogamF2YS51dGlsLkNvbGxlY3Rpb24jYWRkQWxsKGphdmEudXRpbC5JdGVyYXRvciBpdGVyYXRvcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBib29sZWFuIGFkZEFsbChDb2xsZWN0aW9uPD8gc3VwZXIgRT4gY29sbGVjdGlvbiwgSXRlcmF0b3I8RT4gaXRlcmF0b3IpIHsKLQkJYm9vbGVhbiBtb2RpZmllZCA9IGZhbHNlOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQltb2RpZmllZCB8PSBjb2xsZWN0aW9uLmFkZChpdGVyYXRvci5uZXh0KCkpOwotCQl9Ci0JCXJldHVybiBtb2RpZmllZDsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgYWxsIHRoZSBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGFycmF5Ci0JICogdG8gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQgYXMgYSByZXN1bHQuCi0JICogamF2YS51dGlsLkNvbGxlY3Rpb24jYWRkQWxsKE9iamVjdFtdIGFycmF5KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb248PyBzdXBlciBFPiBjb2xsZWN0aW9uLCBFW10gYXJyYXkpIHsKLQkJYm9vbGVhbiBtb2RpZmllZCA9IGZhbHNlOwotCQlmb3IgKEUgaXRlbSA6IGFycmF5KSB7Ci0JCQltb2RpZmllZCB8PSBjb2xsZWN0aW9uLmFkZChpdGVtKTsKLQkJfQotCQlyZXR1cm4gbW9kaWZpZWQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSBmb2xsb3dlZCBieSB0aGUgZWxlbWVudHMKLQkgKiBpbiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICogamF2YS51dGlsLkFycmF5cyNhZGRBbGwoT2JqZWN0W10gYXJyYXksIGphdmEudXRpbC5Db2xsZWN0aW9uIGMpCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIGFkZEFsbChFW10gYXJyYXksIENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGNvbGxlY3Rpb24pIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJRVtdIHJlc3VsdCA9IChFW10pIEFycmF5Lm5ld0luc3RhbmNlKGFycmF5LmdldENsYXNzKCkuZ2V0Q29tcG9uZW50VHlwZSgpLCBhcnJheS5sZW5ndGggKyBjb2xsZWN0aW9uLnNpemUoKSk7Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIDAsIHJlc3VsdCwgMCwgbGVuKTsKLQkJaW50IGkgPSBsZW47Ci0JCWZvciAoRSBpdGVtIDogY29sbGVjdGlvbikgewotCQkJcmVzdWx0W2krK10gPSBpdGVtOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSBmb2xsb3dlZCBieSB0aGUgZWxlbWVudHMKLQkgKiBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqIGphdmEudXRpbC5BcnJheXMjYWRkQWxsKE9iamVjdFtdIGFycmF5LCBqYXZhLnV0aWwuSXRlcmF0b3IgaXRlcmF0b3IpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIGFkZEFsbChFW10gYXJyYXksIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvcikgewotCQlyZXR1cm4gYWRkQWxsKGFycmF5LCBsaXN0KGl0ZXJhdG9yKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSAxIGZvbGxvd2VkIGJ5IHRoZSBlbGVtZW50cwotCSAqIGluIHRoZSBzcGVjaWZpZWQgYXJyYXkgMi4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI2FkZEFsbChPYmplY3RbXSBhcnJheTEsIE9iamVjdFtdIGFycmF5MikKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gYWRkQWxsKEVbXSBhcnJheTEsIEVbXSBhcnJheTIpIHsKLQkJaW50IGxlbjEgPSBhcnJheTEubGVuZ3RoOwotCQlpbnQgbGVuMiA9IGFycmF5Mi5sZW5ndGg7Ci0JCUVbXSByZXN1bHQgPSAoRVtdKSBBcnJheS5uZXdJbnN0YW5jZShhcnJheTEuZ2V0Q2xhc3MoKS5nZXRDb21wb25lbnRUeXBlKCksIGxlbjEgKyBsZW4yKTsKLQkJU3lzdGVtLmFycmF5Y29weShhcnJheTEsIDAsIHJlc3VsdCwgMCwgbGVuMSk7Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXkyLCAwLCByZXN1bHQsIGxlbjEsIGxlbjIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBmaXJzdCBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgb2JqZWN0cyBpbiB0aGUgc2Vjb25kCi0JICogc3BlY2lmaWVkIGFycmF5IGFkZGVkIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCi0JICogamF2YS51dGlsLkFycmF5cyNhZGQoT2JqZWN0W10gYXJyYXkxLCBpbnQgaW5kZXgsIE9iamVjdFtdIGFycmF5MikKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gYWRkQWxsKEVbXSBhcnJheTEsIGludCBpbmRleCwgRVtdIGFycmF5MikgewotCQlpbnQgbGVuMSA9IGFycmF5MS5sZW5ndGg7Ci0JCWludCBsZW4yID0gYXJyYXkyLmxlbmd0aDsKLQkJRVtdIHJlc3VsdCA9IChFW10pIEFycmF5Lm5ld0luc3RhbmNlKGFycmF5MS5nZXRDbGFzcygpLmdldENvbXBvbmVudFR5cGUoKSwgbGVuMSArIGxlbjIpOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5MSwgMCwgcmVzdWx0LCAwLCBpbmRleCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXkyLCAwLCByZXN1bHQsIGluZGV4LCBsZW4yKTsKLQkJU3lzdGVtLmFycmF5Y29weShhcnJheTEsIGluZGV4LCByZXN1bHQsIGluZGV4ICsgbGVuMiwgbGVuMSAtIGluZGV4KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IDEgZm9sbG93ZWQgYnkgdGhlIGVsZW1lbnRzCi0JICogaW4gdGhlIHNwZWNpZmllZCBhcnJheSAyLgotCSAqIGphdmEudXRpbC5BcnJheXMjYWRkQWxsKGNoYXJbXSBhcnJheTEsIGNoYXJbXSBhcnJheTIpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gYWRkQWxsKGNoYXJbXSBhcnJheTEsIGNoYXJbXSBhcnJheTIpIHsKLQkJaW50IGxlbjEgPSBhcnJheTEubGVuZ3RoOwotCQlpbnQgbGVuMiA9IGFycmF5Mi5sZW5ndGg7Ci0JCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltsZW4xICsgbGVuMl07Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXkxLCAwLCByZXN1bHQsIDAsIGxlbjEpOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5MiwgMCwgcmVzdWx0LCBsZW4xLCBsZW4yKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogZmlyc3Qgc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIG9iamVjdHMgaW4gdGhlIHNlY29uZAotCSAqIHNwZWNpZmllZCBhcnJheSBhZGRlZCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotCSAqIGphdmEudXRpbC5BcnJheXMjYWRkKGNoYXJbXSBhcnJheTEsIGludCBpbmRleCwgY2hhcltdIGFycmF5MikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBhZGRBbGwoY2hhcltdIGFycmF5MSwgaW50IGluZGV4LCBjaGFyW10gYXJyYXkyKSB7Ci0JCWludCBsZW4xID0gYXJyYXkxLmxlbmd0aDsKLQkJaW50IGxlbjIgPSBhcnJheTIubGVuZ3RoOwotCQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbbGVuMSArIGxlbjJdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5MSwgMCwgcmVzdWx0LCAwLCBpbmRleCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXkyLCAwLCByZXN1bHQsIGluZGV4LCBsZW4yKTsKLQkJU3lzdGVtLmFycmF5Y29weShhcnJheTEsIGluZGV4LCByZXN1bHQsIGluZGV4ICsgbGVuMiwgbGVuMSAtIGluZGV4KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IDEgZm9sbG93ZWQgYnkgdGhlIGVsZW1lbnRzCi0JICogaW4gdGhlIHNwZWNpZmllZCBhcnJheSAyLgotCSAqIGphdmEudXRpbC5BcnJheXMjYWRkQWxsKGludFtdIGFycmF5MSwgaW50W10gYXJyYXkyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50W10gYWRkQWxsKGludFtdIGFycmF5MSwgaW50W10gYXJyYXkyKSB7Ci0JCWludCBsZW4xID0gYXJyYXkxLmxlbmd0aDsKLQkJaW50IGxlbjIgPSBhcnJheTIubGVuZ3RoOwotCQlpbnRbXSByZXN1bHQgPSBuZXcgaW50W2xlbjEgKyBsZW4yXTsKLQkJU3lzdGVtLmFycmF5Y29weShhcnJheTEsIDAsIHJlc3VsdCwgMCwgbGVuMSk7Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXkyLCAwLCByZXN1bHQsIGxlbjEsIGxlbjIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBmaXJzdCBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgb2JqZWN0cyBpbiB0aGUgc2Vjb25kCi0JICogc3BlY2lmaWVkIGFycmF5IGFkZGVkIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCi0JICogamF2YS51dGlsLkFycmF5cyNhZGQoaW50W10gYXJyYXkxLCBpbnQgaW5kZXgsIGludFtdIGFycmF5MikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludFtdIGFkZEFsbChpbnRbXSBhcnJheTEsIGludCBpbmRleCwgaW50W10gYXJyYXkyKSB7Ci0JCWludCBsZW4xID0gYXJyYXkxLmxlbmd0aDsKLQkJaW50IGxlbjIgPSBhcnJheTIubGVuZ3RoOwotCQlpbnRbXSByZXN1bHQgPSBuZXcgaW50W2xlbjEgKyBsZW4yXTsKLQkJU3lzdGVtLmFycmF5Y29weShhcnJheTEsIDAsIHJlc3VsdCwgMCwgaW5kZXgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5MiwgMCwgcmVzdWx0LCBpbmRleCwgbGVuMik7Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXkxLCBpbmRleCwgcmVzdWx0LCBpbmRleCArIGxlbjIsIGxlbjEgLSBpbmRleCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKiBAc2VlIGphdmEudXRpbC5Db2xsZWN0aW9uI3RvQXJyYXkoKQotCSAqIGphdmEudXRpbC5JdGVyYXRvciN0b0FycmF5KCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdFtdIGFycmF5KEl0ZXJhdG9yPD8+IGl0ZXJhdG9yKSB7Ci0JCXJldHVybiBsaXN0KGl0ZXJhdG9yKS50b0FycmF5KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYXRvcjsKLQkgKiB0aGUgcnVudGltZSB0eXBlIG9mIHRoZSByZXR1cm5lZCBhcnJheSBpcyB0aGF0IG9mIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0JICogSWYgdGhlIGNvbGxlY3Rpb24gZml0cyBpbiB0aGUgc3BlY2lmaWVkIGFycmF5LCBpdCBpcyByZXR1cm5lZCB0aGVyZWluLgotCSAqIE90aGVyd2lzZSwgYSBuZXcgYXJyYXkgaXMgYWxsb2NhdGVkIHdpdGggdGhlIHJ1bnRpbWUgdHlwZSBvZiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgYW5kIHRoZSBzaXplIG9mIHRoaXMgY29sbGVjdGlvbi4KLQkgKiBAc2VlIGphdmEudXRpbC5Db2xsZWN0aW9uI3RvQXJyYXkoamF2YS5sYW5nLk9iamVjdFtdKQotCSAqIGphdmEudXRpbC5JdGVyYXRvciN0b0FycmF5KE9iamVjdFtdKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBhcnJheShJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IsIEVbXSBhcnJheSkgewotCQlyZXR1cm4gbGlzdChpdGVyYXRvcikudG9BcnJheShhcnJheSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgYmFnIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBlbnVtZXJhdGlvbi4KLQkgKiBIYXNoQmFnKGphdmEudXRpbC5FbnVtZXJhdGlvbiBlbnVtZXJhdGlvbikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBCYWc8RT4gYmFnKEVudW1lcmF0aW9uPD8gZXh0ZW5kcyBFPiBlbnVtZXJhdGlvbikgewotCQlCYWc8RT4gYmFnID0gbmV3IEhhc2hCYWc8RT4oKTsKLQkJd2hpbGUgKGVudW1lcmF0aW9uLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQliYWcuYWRkKGVudW1lcmF0aW9uLm5leHRFbGVtZW50KCkpOwotCQl9Ci0JCXJldHVybiBiYWc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgYmFnIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKiBIYXNoQmFnKGphdmEudXRpbC5JdGVyYXRvciBpdGVyYXRvcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBCYWc8RT4gYmFnKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvcikgewotCQlCYWc8RT4gYmFnID0gbmV3IEhhc2hCYWc8RT4oKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJYmFnLmFkZChpdGVyYXRvci5uZXh0KCkpOwotCQl9Ci0JCXJldHVybiBiYWc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgYmFnIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKiBIYXNoQmFnKE9iamVjdFtdIGFycmF5KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEJhZzxFPiBiYWcoRS4uLiBhcnJheSkgewotCQlCYWc8RT4gYmFnID0gbmV3IEhhc2hCYWc8RT4oYXJyYXkubGVuZ3RoKTsKLQkJZm9yIChFIGl0ZW0gOiBhcnJheSkgewotCQkJYmFnLmFkZChpdGVtKTsKLQkJfQotCQlyZXR1cm4gYmFnOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNvbGxlY3Rpb24gY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGVudW1lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IENvbGxlY3Rpb248RT4gY29sbGVjdGlvbihFbnVtZXJhdGlvbjw/IGV4dGVuZHMgRT4gZW51bWVyYXRpb24pIHsKLQkJcmV0dXJuIGJhZyhlbnVtZXJhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgY29sbGVjdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gQ29sbGVjdGlvbjxFPiBjb2xsZWN0aW9uKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvcikgewotCQlyZXR1cm4gYmFnKGl0ZXJhdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb2xsZWN0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBDb2xsZWN0aW9uPEU+IGNvbGxlY3Rpb24oRS4uLiBhcnJheSkgewotCQlyZXR1cm4gYmFnKGFycmF5KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGVudW1lcmF0aW9uIGNvbnRhaW5zIHRoZQotCSAqIHNwZWNpZmllZCBlbGVtZW50LgotCSAqIGphdmEudXRpbC5FbnVtZXJhdGlvbiNjb250YWlucyhPYmplY3QgbykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnMoRW51bWVyYXRpb248Pz4gZW51bWVyYXRpb24sIE9iamVjdCB2YWx1ZSkgewotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJd2hpbGUgKGVudW1lcmF0aW9uLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJaWYgKGVudW1lcmF0aW9uLm5leHRFbGVtZW50KCkgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQl3aGlsZSAoZW51bWVyYXRpb24uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQlpZiAodmFsdWUuZXF1YWxzKGVudW1lcmF0aW9uLm5leHRFbGVtZW50KCkpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBpdGVyYXRvciBjb250YWlucyB0aGUKLQkgKiBzcGVjaWZpZWQgZWxlbWVudC4KLQkgKiBqYXZhLnV0aWwuSXRlcmF0b3IjY29udGFpbnMoT2JqZWN0IG8pCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zKEl0ZXJhdG9yPD8+IGl0ZXJhdG9yLCBPYmplY3QgdmFsdWUpIHsKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlpZiAoaXRlcmF0b3IubmV4dCgpID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCWlmICh2YWx1ZS5lcXVhbHMoaXRlcmF0b3IubmV4dCgpKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgYXJyYXkgY29udGFpbnMgdGhlCi0JICogc3BlY2lmaWVkIGVsZW1lbnQuCi0JICogamF2YS51dGlsLkFycmF5cyNjb250YWlucyhPYmplY3RbXSBhcnJheSwgT2JqZWN0IG8pCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdFtdIGFycmF5LCBPYmplY3QgdmFsdWUpIHsKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSBhcnJheS5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJCWlmIChhcnJheVtpXSA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWZvciAoaW50IGkgPSBhcnJheS5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJCWlmICh2YWx1ZS5lcXVhbHMoYXJyYXlbaV0pKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBhcnJheSBjb250YWlucyB0aGUKLQkgKiBzcGVjaWZpZWQgZWxlbWVudC4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI2NvbnRhaW5zKGNoYXJbXSBhcnJheSwgY2hhciB2YWx1ZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnMoY2hhcltdIGFycmF5LCBjaGFyIHZhbHVlKSB7Ci0JCWZvciAoaW50IGkgPSBhcnJheS5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaWYgKGFycmF5W2ldID09IHZhbHVlKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgYXJyYXkgY29udGFpbnMgdGhlCi0JICogc3BlY2lmaWVkIGVsZW1lbnQuCi0JICogamF2YS51dGlsLkFycmF5cyNjb250YWlucyhpbnRbXSBhcnJheSwgaW50IHZhbHVlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWlucyhpbnRbXSBhcnJheSwgaW50IHZhbHVlKSB7Ci0JCWZvciAoaW50IGkgPSBhcnJheS5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaWYgKGFycmF5W2ldID09IHZhbHVlKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiBjb250YWlucyBhbGwgb2YgdGhlCi0JICogZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKiBqYXZhLnV0aWwuQ29sbGVjdGlvbiNjb250YWluc0FsbChqYXZhLnV0aWwuSXRlcmF0b3IgaXRlcmF0b3IpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zQWxsKENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgSXRlcmF0b3I8Pz4gaXRlcmF0b3IpIHsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJaWYgKCAhIGNvbGxlY3Rpb24uY29udGFpbnMoaXRlcmF0b3IubmV4dCgpKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gY29udGFpbnMgYWxsIG9mIHRoZQotCSAqIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0JICogamF2YS51dGlsLkNvbGxlY3Rpb24jY29udGFpbnNBbGwoT2JqZWN0W10gYXJyYXkpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zQWxsKENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgT2JqZWN0W10gYXJyYXkpIHsKLQkJZm9yIChpbnQgaSA9IGFycmF5Lmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlpZiAoICEgY29sbGVjdGlvbi5jb250YWlucyhhcnJheVtpXSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBpdGVyYXRvciBjb250YWlucyBhbGwgb2YgdGhlCi0JICogZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIGphdmEudXRpbC5JdGVyYXRvciNjb250YWluc0FsbChqYXZhLnV0aWwuQ29sbGVjdGlvbiBjb2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc0FsbChJdGVyYXRvcjw/PiBpdGVyYXRvciwgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uKSB7Ci0JCXJldHVybiBjb2xsZWN0aW9uKGl0ZXJhdG9yKS5jb250YWluc0FsbChjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yIDEgY29udGFpbnMgYWxsIG9mIHRoZQotCSAqIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IgMi4KLQkgKiBqYXZhLnV0aWwuSXRlcmF0b3IjY29udGFpbnNBbGwoamF2YS51dGlsLkl0ZXJhdG9yIGl0ZXJhdG9yKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc0FsbChJdGVyYXRvcjw/PiBpdGVyYXRvcjEsIEl0ZXJhdG9yPD8+IGl0ZXJhdG9yMikgewotCQlyZXR1cm4gY29udGFpbnNBbGwoY29sbGVjdGlvbihpdGVyYXRvcjEpLCBpdGVyYXRvcjIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IgY29udGFpbnMgYWxsIG9mIHRoZQotCSAqIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0JICogamF2YS51dGlsLkl0ZXJhdG9yI2NvbnRhaW5zQWxsKE9iamVjdFtdIGFycmF5KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc0FsbChJdGVyYXRvcjw/PiBpdGVyYXRvciwgT2JqZWN0W10gYXJyYXkpIHsKLQkJcmV0dXJuIGNvbnRhaW5zQWxsKGNvbGxlY3Rpb24oaXRlcmF0b3IpLCBhcnJheSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBhcnJheSBjb250YWlucyBhbGwgb2YgdGhlCi0JICogZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIGphdmEudXRpbC5BcnJheXMjY29udGFpbnNBbGwoT2JqZWN0W10gYXJyYXksIGphdmEudXRpbC5Db2xsZWN0aW9uIGNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zQWxsKE9iamVjdFtdIGFycmF5LCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24pIHsKLQkJcmV0dXJuIGNvbnRhaW5zQWxsKGFycmF5LCBjb2xsZWN0aW9uLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgYXJyYXkgY29udGFpbnMgYWxsIG9mIHRoZQotCSAqIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICogamF2YS51dGlsLkFycmF5cyNjb250YWluc0FsbChPYmplY3RbXSBhcnJheSwgamF2YS51dGlsLkl0ZXJhdG9yIGl0ZXJhdG9yKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc0FsbChPYmplY3RbXSBhcnJheSwgSXRlcmF0b3I8Pz4gaXRlcmF0b3IpIHsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJaWYgKCAhIGNvbnRhaW5zKGFycmF5LCBpdGVyYXRvci5uZXh0KCkpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgYXJyYXkgMSBjb250YWlucyBhbGwgb2YgdGhlCi0JICogZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBhcnJheSAyLgotCSAqIGphdmEudXRpbC5BcnJheXMjY29udGFpbnNBbGwoT2JqZWN0W10gYXJyYXkxLCBPYmplY3RbXSBhcnJheTIpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zQWxsKE9iamVjdFtdIGFycmF5MSwgT2JqZWN0W10gYXJyYXkyKSB7Ci0JCWZvciAoaW50IGkgPSBhcnJheTIubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmICggISBjb250YWlucyhhcnJheTEsIGFycmF5MltpXSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBhcnJheSAxIGNvbnRhaW5zIGFsbCBvZiB0aGUKLQkgKiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGFycmF5IDIuCi0JICogamF2YS51dGlsLkFycmF5cyNjb250YWluc0FsbChjaGFyW10gYXJyYXkxLCBjaGFyW10gYXJyYXkyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc0FsbChjaGFyW10gYXJyYXkxLCBjaGFyW10gYXJyYXkyKSB7Ci0JCWZvciAoaW50IGkgPSBhcnJheTIubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmICggISBjb250YWlucyhhcnJheTEsIGFycmF5MltpXSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBhcnJheSAxIGNvbnRhaW5zIGFsbCBvZiB0aGUKLQkgKiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGFycmF5IDIuCi0JICogamF2YS51dGlsLkFycmF5cyNjb250YWluc0FsbChpbnRbXSBhcnJheTEsIGludFtdIGFycmF5MikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoaW50W10gYXJyYXkxLCBpbnRbXSBhcnJheTIpIHsKLQkJZm9yIChpbnQgaSA9IGFycmF5Mi5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaWYgKCAhIGNvbnRhaW5zKGFycmF5MSwgYXJyYXkyW2ldKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkCi0JICogYXJyYXlzIHRoYXQgYXJlIGRpZmZlcmVudCwgYmVnaW5uaW5nIGF0IHRoZSBlbmQuCi0JICogSWYgdGhlIGFycmF5cyBhcmUgaWRlbnRpY2FsLCByZXR1cm4gLTEuCi0JICogSWYgdGhlIGFycmF5cyBhcmUgZGlmZmVyZW50IHNpemVzLCByZXR1cm4gdGhlIGluZGV4IG9mIHRoZQotCSAqIGxhc3QgZWxlbWVudCBpbiB0aGUgbG9uZ2VyIGFycmF5LgotCSAqIFVzZSB0aGUgZWxlbWVudHMnICNlcXVhbHMoKSBtZXRob2QgdG8gY29tcGFyZSB0aGUKLQkgKiBlbGVtZW50cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBkaWZmRW5kKE9iamVjdFtdIGFycmF5MSwgT2JqZWN0W10gYXJyYXkyKSB7Ci0JCXJldHVybiBkaWZmRW5kKEFycmF5cy5hc0xpc3QoYXJyYXkxKSwgQXJyYXlzLmFzTGlzdChhcnJheTIpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkCi0JICogbGlzdHMgdGhhdCBhcmUgZGlmZmVyZW50LCBiZWdpbm5pbmcgYXQgdGhlIGVuZC4KLQkgKiBJZiB0aGUgbGlzdHMgYXJlIGlkZW50aWNhbCwgcmV0dXJuIC0xLgotCSAqIElmIHRoZSBsaXN0cyBhcmUgZGlmZmVyZW50IHNpemVzLCByZXR1cm4gdGhlIGluZGV4IG9mIHRoZQotCSAqIGxhc3QgZWxlbWVudCBpbiB0aGUgbG9uZ2VyIGxpc3QuCi0JICogVXNlIHRoZSBlbGVtZW50cycgI2VxdWFscygpIG1ldGhvZCB0byBjb21wYXJlIHRoZQotCSAqIGVsZW1lbnRzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGRpZmZFbmQoTGlzdDw/PiBsaXN0MSwgTGlzdDw/PiBsaXN0MikgewotCQlpbnQgc2l6ZTEgPSBsaXN0MS5zaXplKCk7Ci0JCWludCBzaXplMiA9IGxpc3QyLnNpemUoKTsKLQkJaWYgKHNpemUxICE9IHNpemUyKSB7Ci0JCQlyZXR1cm4gTWF0aC5tYXgoc2l6ZTEsIHNpemUyKSAtIDE7Ci0JCX0KLQkJaW50IGVuZCA9IHNpemUxIC0gMTsKLQkJd2hpbGUgKGVuZCA+IC0xKSB7Ci0JCQlPYmplY3QgbyA9IGxpc3QxLmdldChlbmQpOwotCQkJaWYgKG8gPT0gbnVsbCkgewotCQkJCWlmIChsaXN0Mi5nZXQoZW5kKSA9PSBudWxsKSB7Ci0JCQkJCWVuZC0tOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybiBlbmQ7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAoby5lcXVhbHMobGlzdDIuZ2V0KGVuZCkpKSB7Ci0JCQkJCWVuZC0tOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybiBlbmQ7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBlbmQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByYW5nZSBvZiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkCi0JICogYXJyYXlzIHRoYXQgYXJlIGRpZmZlcmVudC4KLQkgKiBJZiB0aGUgYXJyYXlzIGFyZSBpZGVudGljYWwsIHJldHVybiBbc2l6ZSwgLTFdLgotCSAqIFVzZSB0aGUgZWxlbWVudHMnICNlcXVhbHMoKSBtZXRob2QgdG8gY29tcGFyZSB0aGUKLQkgKiBlbGVtZW50cy4KLQkgKiBAc2VlICNkaWZmU3RhcnQoT2JqZWN0W10sIE9iamVjdFtdKQotCSAqIEBzZWUgI2RpZmZFbmQoT2JqZWN0W10sIE9iamVjdFtdKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmFuZ2UgZGlmZlJhbmdlKE9iamVjdFtdIGFycmF5MSwgT2JqZWN0W10gYXJyYXkyKSB7Ci0JCXJldHVybiBkaWZmUmFuZ2UoQXJyYXlzLmFzTGlzdChhcnJheTEpLCBBcnJheXMuYXNMaXN0KGFycmF5MikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmFuZ2Ugb2YgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZAotCSAqIGFycmF5cyB0aGF0IGFyZSBkaWZmZXJlbnQuCi0JICogSWYgdGhlIGFycmF5cyBhcmUgaWRlbnRpY2FsLCByZXR1cm4gW3NpemUsIC0xXS4KLQkgKiBVc2UgdGhlIGVsZW1lbnRzJyAjZXF1YWxzKCkgbWV0aG9kIHRvIGNvbXBhcmUgdGhlCi0JICogZWxlbWVudHMuCi0JICogQHNlZSAjZGlmZlN0YXJ0KGphdmEudXRpbC5MaXN0LCBqYXZhLnV0aWwuTGlzdCkKLQkgKiBAc2VlICNkaWZmRW5kKGphdmEudXRpbC5MaXN0LCBqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJhbmdlIGRpZmZSYW5nZShMaXN0PD8+IGxpc3QxLCBMaXN0PD8+IGxpc3QyKSB7Ci0JCWludCBlbmQgPSBkaWZmRW5kKGxpc3QxLCBsaXN0Mik7Ci0JCWlmIChlbmQgPT0gLTEpIHsKLQkJCS8vIHRoZSBsaXN0cyBhcmUgaWRlbnRpY2FsLCB0aGUgc3RhcnQgaXMgdGhlIHNpemUgb2YgdGhlIHR3byBsaXN0cwotCQkJcmV0dXJuIG5ldyBSYW5nZShsaXN0MS5zaXplKCksIGVuZCk7Ci0JCX0KLQkJLy8gdGhlIGxpc3RzIGFyZSBkaWZmZXJlbnQsIGNhbGN1bGF0ZSB0aGUgc3RhcnQgb2YgdGhlIHJhbmdlCi0JCXJldHVybiBuZXcgUmFuZ2UoZGlmZlN0YXJ0KGxpc3QxLCBsaXN0MiksIGVuZCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZAotCSAqIGFycmF5cyB0aGF0IGFyZSBkaWZmZXJlbnQuIElmIHRoZSBhcnJheXMgYXJlIGlkZW50aWNhbCwgcmV0dXJuCi0JICogdGhlIHNpemUgb2YgdGhlIHR3byBhcnJheXMgKGkuZS4gb25lIHBhc3QgdGhlIGxhc3QgaW5kZXgpLgotCSAqIElmIHRoZSBhcnJheXMgYXJlIGRpZmZlcmVudCBzaXplcyBhbmQgYWxsIHRoZSBlbGVtZW50cyBpbgotCSAqIHRoZSBzaG9ydGVyIGFycmF5IG1hdGNoIHRoZWlyIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgaW4KLQkgKiB0aGUgbG9uZ2VyIGFycmF5LCByZXR1cm4gdGhlIHNpemUgb2YgdGhlIHNob3J0ZXIgYXJyYXkKLQkgKiAoaS5lLiBvbmUgcGFzdCB0aGUgbGFzdCBpbmRleCBvZiB0aGUgc2hvcnRlciBhcnJheSkuCi0JICogVXNlIHRoZSBlbGVtZW50cycgI2VxdWFscygpIG1ldGhvZCB0byBjb21wYXJlIHRoZQotCSAqIGVsZW1lbnRzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGRpZmZTdGFydChPYmplY3RbXSBhcnJheTEsIE9iamVjdFtdIGFycmF5MikgewotCQlyZXR1cm4gZGlmZlN0YXJ0KEFycmF5cy5hc0xpc3QoYXJyYXkxKSwgQXJyYXlzLmFzTGlzdChhcnJheTIpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkCi0JICogbGlzdHMgdGhhdCBhcmUgZGlmZmVyZW50LiBJZiB0aGUgbGlzdHMgYXJlIGlkZW50aWNhbCwgcmV0dXJuCi0JICogdGhlIHNpemUgb2YgdGhlIHR3byBsaXN0cyAoaS5lLiBvbmUgcGFzdCB0aGUgbGFzdCBpbmRleCkuCi0JICogSWYgdGhlIGxpc3RzIGFyZSBkaWZmZXJlbnQgc2l6ZXMgYW5kIGFsbCB0aGUgZWxlbWVudHMgaW4KLQkgKiB0aGUgc2hvcnRlciBsaXN0IG1hdGNoIHRoZWlyIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgaW4KLQkgKiB0aGUgbG9uZ2VyIGxpc3QsIHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgc2hvcnRlciBsaXN0Ci0JICogKGkuZS4gb25lIHBhc3QgdGhlIGxhc3QgaW5kZXggb2YgdGhlIHNob3J0ZXIgbGlzdCkuCi0JICogVXNlIHRoZSBlbGVtZW50cycgI2VxdWFscygpIG1ldGhvZCB0byBjb21wYXJlIHRoZQotCSAqIGVsZW1lbnRzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGRpZmZTdGFydChMaXN0PD8+IGxpc3QxLCBMaXN0PD8+IGxpc3QyKSB7Ci0JCWludCBlbmQgPSBNYXRoLm1pbihsaXN0MS5zaXplKCksIGxpc3QyLnNpemUoKSk7Ci0JCWludCBzdGFydCA9IDA7Ci0JCXdoaWxlIChzdGFydCA8IGVuZCkgewotCQkJT2JqZWN0IG8gPSBsaXN0MS5nZXQoc3RhcnQpOwotCQkJaWYgKG8gPT0gbnVsbCkgewotCQkJCWlmIChsaXN0Mi5nZXQoc3RhcnQpID09IG51bGwpIHsKLQkJCQkJc3RhcnQrKzsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gc3RhcnQ7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAoby5lcXVhbHMobGlzdDIuZ2V0KHN0YXJ0KSkpIHsKLQkJCQkJc3RhcnQrKzsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gc3RhcnQ7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBzdGFydDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9ycyByZXR1cm4gZXF1YWwgZWxlbWVudHMuCi0JICogamF2YS51dGlsLkxpc3RJdGVyYXRvciNlcXVhbHMoamF2YS51dGlsLkxpc3RJdGVyYXRvciBpdGVyYXRvcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZXF1YWxzKExpc3RJdGVyYXRvcjw/PiBpdGVyYXRvcjEsIExpc3RJdGVyYXRvcjw/PiBpdGVyYXRvcjIpIHsKLQkJd2hpbGUgKGl0ZXJhdG9yMS5oYXNOZXh0KCkgJiYgaXRlcmF0b3IyLmhhc05leHQoKSkgewotCQkJT2JqZWN0IG8xID0gaXRlcmF0b3IxLm5leHQoKTsKLQkJCU9iamVjdCBvMiA9IGl0ZXJhdG9yMi5uZXh0KCk7Ci0JCQlpZiAoICEgKG8xID09IG51bGwgPyBvMiA9PSBudWxsIDogbzEuZXF1YWxzKG8yKSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuICEgKGl0ZXJhdG9yMS5oYXNOZXh0KCkgfHwgaXRlcmF0b3IyLmhhc05leHQoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBlbGVtZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpbmRleAotCSAqIGluIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICogamF2YS51dGlsLkxpc3RJdGVyYXRvciNnZXQoaW50IGluZGV4KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEUgZ2V0KExpc3RJdGVyYXRvcjxFPiBpdGVyYXRvciwgaW50IGluZGV4KSB7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUUgbmV4dCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChpdGVyYXRvci5wcmV2aW91c0luZGV4KCkgPT0gaW5kZXgpIHsKLQkJCQlyZXR1cm4gbmV4dDsKLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihTdHJpbmcudmFsdWVPZihpbmRleCkgKyAnOicgKyBTdHJpbmcudmFsdWVPZihpdGVyYXRvci5wcmV2aW91c0luZGV4KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGFycmF5cyBjb250YWluIHRoZSBzYW1lIGVsZW1lbnRzLgotCSAqIGphdmEudXRpbC5BcnJheXMjaWRlbnRpY2FsKE9iamVjdFtdIGFycmF5MSwgT2JqZWN0W10gYXJyYXkyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpZGVudGljYWwoT2JqZWN0W10gYXJyYXkxLCBPYmplY3RbXSBhcnJheTIpIHsKLQkJaWYgKGFycmF5MSA9PSBhcnJheTIpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChhcnJheTEgPT0gbnVsbCB8fCBhcnJheTIgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWludCBsZW5ndGggPSBhcnJheTEubGVuZ3RoOwotCQlpZiAoYXJyYXkyLmxlbmd0aCAhPSBsZW5ndGgpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlmb3IgKGludCBpID0gbGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmIChhcnJheTFbaV0gIT0gYXJyYXkyW2ldKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3JzIHJldHVybiB0aGUgc2FtZSBlbGVtZW50cy4KLQkgKiBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yI2lkZW50aWNhbChqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yIGl0ZXJhdG9yKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpZGVudGljYWwoTGlzdEl0ZXJhdG9yPD8+IGl0ZXJhdG9yMSwgTGlzdEl0ZXJhdG9yPD8+IGl0ZXJhdG9yMikgewotCQl3aGlsZSAoaXRlcmF0b3IxLmhhc05leHQoKSAmJiBpdGVyYXRvcjIuaGFzTmV4dCgpKSB7Ci0JCQlpZiAoaXRlcmF0b3IxLm5leHQoKSAhPSBpdGVyYXRvcjIubmV4dCgpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiAhIChpdGVyYXRvcjEuaGFzTmV4dCgpIHx8IGl0ZXJhdG9yMi5oYXNOZXh0KCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQKLQkgKiBhcnJheXMgdGhhdCBhcmUgZGlmZmVyZW50LCBiZWdpbm5pbmcgYXQgdGhlIGVuZC4KLQkgKiBJZiB0aGUgYXJyYXlzIGFyZSBpZGVudGljYWwsIHJldHVybiAtMS4KLQkgKiBJZiB0aGUgYXJyYXlzIGFyZSBkaWZmZXJlbnQgc2l6ZXMsIHJldHVybiB0aGUgaW5kZXggb2YgdGhlCi0JICogbGFzdCBlbGVtZW50IGluIHRoZSBsb25nZXIgYXJyYXkuCi0JICogVXNlIG9iamVjdCBpZGVudGl0eSB0byBjb21wYXJlIHRoZSBlbGVtZW50cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBpZGVudGl0eURpZmZFbmQoT2JqZWN0W10gYXJyYXkxLCBPYmplY3RbXSBhcnJheTIpIHsKLQkJcmV0dXJuIGlkZW50aXR5RGlmZkVuZChBcnJheXMuYXNMaXN0KGFycmF5MSksIEFycmF5cy5hc0xpc3QoYXJyYXkyKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZAotCSAqIGxpc3RzIHRoYXQgYXJlIGRpZmZlcmVudCwgYmVnaW5uaW5nIGF0IHRoZSBlbmQuCi0JICogSWYgdGhlIGxpc3RzIGFyZSBpZGVudGljYWwsIHJldHVybiAtMS4KLQkgKiBJZiB0aGUgbGlzdHMgYXJlIGRpZmZlcmVudCBzaXplcywgcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUKLQkgKiBsYXN0IGVsZW1lbnQgaW4gdGhlIGxvbmdlciBsaXN0LgotCSAqIFVzZSBvYmplY3QgaWRlbnRpdHkgdG8gY29tcGFyZSB0aGUgZWxlbWVudHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgaWRlbnRpdHlEaWZmRW5kKExpc3Q8Pz4gbGlzdDEsIExpc3Q8Pz4gbGlzdDIpIHsKLQkJaW50IHNpemUxID0gbGlzdDEuc2l6ZSgpOwotCQlpbnQgc2l6ZTIgPSBsaXN0Mi5zaXplKCk7Ci0JCWlmIChzaXplMSAhPSBzaXplMikgewotCQkJcmV0dXJuIE1hdGgubWF4KHNpemUxLCBzaXplMikgLSAxOwotCQl9Ci0JCWludCBlbmQgPSBzaXplMSAtIDE7Ci0JCXdoaWxlIChlbmQgPiAtMSkgewotCQkJaWYgKGxpc3QxLmdldChlbmQpID09IGxpc3QyLmdldChlbmQpKSB7Ci0JCQkJZW5kLS07Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBlbmQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVuZDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJhbmdlIG9mIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQKLQkgKiBhcnJheXMgdGhhdCBhcmUgZGlmZmVyZW50LgotCSAqIElmIHRoZSBhcnJheXMgYXJlIGlkZW50aWNhbCwgcmV0dXJuIFtzaXplLCAtMV0uCi0JICogVXNlIG9iamVjdCBpZGVudGl0eSB0byBjb21wYXJlIHRoZSBlbGVtZW50cy4KLQkgKiBAc2VlICNpZGVudGl0eURpZmZTdGFydChPYmplY3RbXSwgT2JqZWN0W10pCi0JICogQHNlZSAjaWRlbnRpdHlEaWZmRW5kKE9iamVjdFtdLCBPYmplY3RbXSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJhbmdlIGlkZW50aXR5RGlmZlJhbmdlKE9iamVjdFtdIGFycmF5MSwgT2JqZWN0W10gYXJyYXkyKSB7Ci0JCXJldHVybiBpZGVudGl0eURpZmZSYW5nZShBcnJheXMuYXNMaXN0KGFycmF5MSksIEFycmF5cy5hc0xpc3QoYXJyYXkyKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByYW5nZSBvZiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkCi0JICogYXJyYXlzIHRoYXQgYXJlIGRpZmZlcmVudC4KLQkgKiBJZiB0aGUgYXJyYXlzIGFyZSBpZGVudGljYWwsIHJldHVybiBbc2l6ZSwgLTFdLgotCSAqIFVzZSBvYmplY3QgaWRlbnRpdHkgdG8gY29tcGFyZSB0aGUgZWxlbWVudHMuCi0JICogQHNlZSAjaWRlbnRpdHlEaWZmU3RhcnQoamF2YS51dGlsLkxpc3QsIGphdmEudXRpbC5MaXN0KQotCSAqIEBzZWUgI2lkZW50aXR5RGlmZkVuZChqYXZhLnV0aWwuTGlzdCwgamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHVibGljIHN0YXRpYyBSYW5nZSBpZGVudGl0eURpZmZSYW5nZShMaXN0PD8+IGxpc3QxLCBMaXN0PD8+IGxpc3QyKSB7Ci0JCWludCBlbmQgPSBpZGVudGl0eURpZmZFbmQobGlzdDEsIGxpc3QyKTsKLQkJaWYgKGVuZCA9PSAtMSkgewotCQkJLy8gdGhlIGxpc3RzIGFyZSBpZGVudGljYWwsIHRoZSBzdGFydCBpcyB0aGUgc2l6ZSBvZiB0aGUgdHdvIGxpc3RzCi0JCQlyZXR1cm4gbmV3IFJhbmdlKGxpc3QxLnNpemUoKSwgZW5kKTsKLQkJfQotCQkvLyB0aGUgbGlzdHMgYXJlIGRpZmZlcmVudCwgY2FsY3VsYXRlIHRoZSBzdGFydCBvZiB0aGUgcmFuZ2UKLQkJcmV0dXJuIG5ldyBSYW5nZShpZGVudGl0eURpZmZTdGFydChsaXN0MSwgbGlzdDIpLCBlbmQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQKLQkgKiBhcnJheXMgdGhhdCBhcmUgZGlmZmVyZW50LiBJZiB0aGUgYXJyYXlzIGFyZSBpZGVudGljYWwsIHJldHVybgotCSAqIHRoZSBzaXplIG9mIHRoZSB0d28gYXJyYXlzIChpLmUuIG9uZSBwYXN0IHRoZSBsYXN0IGluZGV4KS4KLQkgKiBJZiB0aGUgYXJyYXlzIGFyZSBkaWZmZXJlbnQgc2l6ZXMgYW5kIGFsbCB0aGUgZWxlbWVudHMgaW4KLQkgKiB0aGUgc2hvcnRlciBhcnJheSBtYXRjaCB0aGVpciBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIGluCi0JICogdGhlIGxvbmdlciBhcnJheSwgcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBzaG9ydGVyIGFycmF5Ci0JICogKGkuZS4gb25lIHBhc3QgdGhlIGxhc3QgaW5kZXggb2YgdGhlIHNob3J0ZXIgYXJyYXkpLgotCSAqIFVzZSBvYmplY3QgaWRlbnRpdHkgdG8gY29tcGFyZSB0aGUgZWxlbWVudHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgaWRlbnRpdHlEaWZmU3RhcnQoT2JqZWN0W10gYXJyYXkxLCBPYmplY3RbXSBhcnJheTIpIHsKLQkJcmV0dXJuIGlkZW50aXR5RGlmZlN0YXJ0KEFycmF5cy5hc0xpc3QoYXJyYXkxKSwgQXJyYXlzLmFzTGlzdChhcnJheTIpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkCi0JICogbGlzdHMgdGhhdCBhcmUgZGlmZmVyZW50LiBJZiB0aGUgbGlzdHMgYXJlIGlkZW50aWNhbCwgcmV0dXJuCi0JICogdGhlIHNpemUgb2YgdGhlIHR3byBsaXN0cyAoaS5lLiBvbmUgcGFzdCB0aGUgbGFzdCBpbmRleCkuCi0JICogSWYgdGhlIGxpc3RzIGFyZSBkaWZmZXJlbnQgc2l6ZXMgYW5kIGFsbCB0aGUgZWxlbWVudHMgaW4KLQkgKiB0aGUgc2hvcnRlciBsaXN0IG1hdGNoIHRoZWlyIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgaW4KLQkgKiB0aGUgbG9uZ2VyIGxpc3QsIHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgc2hvcnRlciBsaXN0Ci0JICogKGkuZS4gb25lIHBhc3QgdGhlIGxhc3QgaW5kZXggb2YgdGhlIHNob3J0ZXIgbGlzdCkuCi0JICogVXNlIG9iamVjdCBpZGVudGl0eSB0byBjb21wYXJlIHRoZSBlbGVtZW50cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBpZGVudGl0eURpZmZTdGFydChMaXN0PD8+IGxpc3QxLCBMaXN0PD8+IGxpc3QyKSB7Ci0JCWludCBlbmQgPSBNYXRoLm1pbihsaXN0MS5zaXplKCksIGxpc3QyLnNpemUoKSk7Ci0JCWludCBzdGFydCA9IDA7Ci0JCXdoaWxlIChzdGFydCA8IGVuZCkgewotCQkJaWYgKGxpc3QxLmdldChzdGFydCkgPT0gbGlzdDIuZ2V0KHN0YXJ0KSkgewotCQkJCXN0YXJ0Kys7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBzdGFydDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3RhcnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUKLQkgKiBzcGVjaWZpZWQgZWxlbWVudCBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLAotCSAqIG9yIHJldHVybiAtMSBpZiB0aGVyZSBpcyBubyBzdWNoIGluZGV4LgotCSAqIGphdmEudXRpbC5MaXN0SXRlcmF0b3IjaW5kZXhPZihPYmplY3QgbykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBpbmRleE9mKExpc3RJdGVyYXRvcjw/PiBpdGVyYXRvciwgT2JqZWN0IHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaXRlcmF0b3IuaGFzTmV4dCgpOyBpKyspIHsKLQkJCQlpZiAoaXRlcmF0b3IubmV4dCgpID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIGk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJZm9yIChpbnQgaSA9IDA7IGl0ZXJhdG9yLmhhc05leHQoKTsgaSsrKSB7Ci0JCQkJaWYgKHZhbHVlLmVxdWFscyhpdGVyYXRvci5uZXh0KCkpKSB7Ci0JCQkJCXJldHVybiBpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUKLQkgKiBzcGVjaWZpZWQgZWxlbWVudCBpbiB0aGUgc3BlY2lmaWVkIGFycmF5LAotCSAqIG9yIHJldHVybiAtMSBpZiB0aGVyZSBpcyBubyBzdWNoIGluZGV4LgotCSAqIGphdmEudXRpbC5BcnJheXMjaW5kZXhPZihPYmplY3RbXSBhcnJheSwgT2JqZWN0IG8pCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgaW5kZXhPZihPYmplY3RbXSBhcnJheSwgT2JqZWN0IHZhbHVlKSB7Ci0JCWludCBsZW4gPSBhcnJheS5sZW5ndGg7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQkJaWYgKGFycmF5W2ldID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIGk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJCWlmICh2YWx1ZS5lcXVhbHMoYXJyYXlbaV0pKSB7Ci0JCQkJCXJldHVybiBpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUKLQkgKiBzcGVjaWZpZWQgZWxlbWVudCBpbiB0aGUgc3BlY2lmaWVkIGFycmF5LAotCSAqIG9yIHJldHVybiAtMSBpZiB0aGVyZSBpcyBubyBzdWNoIGluZGV4LgotCSAqIGphdmEudXRpbC5BcnJheXMjaW5kZXhPZihjaGFyW10gYXJyYXksIGNoYXIgdmFsdWUpCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgaW5kZXhPZihjaGFyW10gYXJyYXksIGNoYXIgdmFsdWUpIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJaWYgKGFycmF5W2ldID09IHZhbHVlKSB7Ci0JCQkJcmV0dXJuIGk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlCi0JICogc3BlY2lmaWVkIGVsZW1lbnQgaW4gdGhlIHNwZWNpZmllZCBhcnJheSwKLQkgKiBvciByZXR1cm4gLTEgaWYgdGhlcmUgaXMgbm8gc3VjaCBpbmRleC4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI2luZGV4T2YoaW50W10gYXJyYXksIGludCB2YWx1ZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBpbmRleE9mKGludFtdIGFycmF5LCBpbnQgdmFsdWUpIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJaWYgKGFycmF5W2ldID09IHZhbHVlKSB7Ci0JCQkJcmV0dXJuIGk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbWF4aW11bSBpbmRleCBvZiB3aGVyZSB0aGUgc3BlY2lmaWVkIGNvbXBhcmFibGUgb2JqZWN0Ci0JICogc2hvdWxkIGJlIGluc2VydGVkIGludG8gdGhlIHNwZWNpZmllZCBzb3J0ZWQgbGlzdCBhbmQgc3RpbGwga2VlcAotCSAqIHRoZSBsaXN0IHNvcnRlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFIGV4dGVuZHMgQ29tcGFyYWJsZTw/IHN1cGVyIEU+PiBpbnQgaW5zZXJ0aW9uSW5kZXhPZihMaXN0PEU+IHNvcnRlZExpc3QsIENvbXBhcmFibGU8RT4gdmFsdWUpIHsKLQkJaW50IGxlbiA9IHNvcnRlZExpc3Quc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlpZiAodmFsdWUuY29tcGFyZVRvKHNvcnRlZExpc3QuZ2V0KGkpKSA8IDApIHsKLQkJCQlyZXR1cm4gaTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbGVuOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbWF4aW11bSBpbmRleCBvZiB3aGVyZSB0aGUgc3BlY2lmaWVkIG9iamVjdAotCSAqIHNob3VsZCBiZSBpbnNlcnRlZCBpbnRvIHRoZSBzcGVjaWZpZWQgc29ydGVkIGxpc3QgYW5kIHN0aWxsIGtlZXAKLQkgKiB0aGUgbGlzdCBzb3J0ZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gaW50IGluc2VydGlvbkluZGV4T2YoTGlzdDxFPiBzb3J0ZWRMaXN0LCBFIHZhbHVlLCBDb21wYXJhdG9yPD8gc3VwZXIgRT4gY29tcGFyYXRvcikgewotCQlpbnQgbGVuID0gc29ydGVkTGlzdC5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCWlmIChjb21wYXJhdG9yLmNvbXBhcmUodmFsdWUsIHNvcnRlZExpc3QuZ2V0KGkpKSA8IDApIHsKLQkJCQlyZXR1cm4gaTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbGVuOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbWF4aW11bSBpbmRleCBvZiB3aGVyZSB0aGUgc3BlY2lmaWVkIGNvbXBhcmFibGUgb2JqZWN0Ci0JICogc2hvdWxkIGJlIGluc2VydGVkIGludG8gdGhlIHNwZWNpZmllZCBzb3J0ZWQgYXJyYXkgYW5kIHN0aWxsIGtlZXAKLQkgKiB0aGUgYXJyYXkgc29ydGVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEUgZXh0ZW5kcyBDb21wYXJhYmxlPD8gc3VwZXIgRT4+IGludCBpbnNlcnRpb25JbmRleE9mKEVbXSBzb3J0ZWRBcnJheSwgQ29tcGFyYWJsZTxFPiB2YWx1ZSkgewotCQlpbnQgbGVuID0gc29ydGVkQXJyYXkubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlpZiAodmFsdWUuY29tcGFyZVRvKHNvcnRlZEFycmF5W2ldKSA8IDApIHsKLQkJCQlyZXR1cm4gaTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbGVuOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbWF4aW11bSBpbmRleCBvZiB3aGVyZSB0aGUgc3BlY2lmaWVkIGNvbXBhcmFibGUgb2JqZWN0Ci0JICogc2hvdWxkIGJlIGluc2VydGVkIGludG8gdGhlIHNwZWNpZmllZCBzb3J0ZWQgYXJyYXkgYW5kIHN0aWxsIGtlZXAKLQkgKiB0aGUgYXJyYXkgc29ydGVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IGludCBpbnNlcnRpb25JbmRleE9mKEVbXSBzb3J0ZWRBcnJheSwgRSB2YWx1ZSwgQ29tcGFyYXRvcjw/IHN1cGVyIEU+IGNvbXBhcmF0b3IpIHsKLQkJaW50IGxlbiA9IHNvcnRlZEFycmF5Lmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJaWYgKGNvbXBhcmF0b3IuY29tcGFyZSh2YWx1ZSwgc29ydGVkQXJyYXlbaV0pIDwgMCkgewotCQkJCXJldHVybiBpOwotCQkJfQotCQl9Ci0JCXJldHVybiBsZW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGl0ZXJhdG9yIG9uIHRoZSBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGFycmF5LgotCSAqIGphdmEudXRpbC5BcnJheXMjaXRlcmF0b3IoT2JqZWN0W10gYXJyYXkpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gSXRlcmF0b3I8RT4gaXRlcmF0b3IoRS4uLiBhcnJheSkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8RT4oYXJyYXkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiB0aGUKLQkgKiBzcGVjaWZpZWQgZWxlbWVudCBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLAotCSAqIG9yIHJldHVybiAtMSBpZiB0aGVyZSBpcyBubyBzdWNoIGluZGV4LgotCSAqIGphdmEudXRpbC5MaXN0SXRlcmF0b3IjbGFzdEluZGV4T2YoT2JqZWN0IG8pCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgbGFzdEluZGV4T2YoTGlzdEl0ZXJhdG9yPD8+IGl0ZXJhdG9yLCBPYmplY3QgdmFsdWUpIHsKLQkJcmV0dXJuIGxpc3QoaXRlcmF0b3IpLmxhc3RJbmRleE9mKHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgdGhlCi0JICogc3BlY2lmaWVkIGVsZW1lbnQgaW4gdGhlIHNwZWNpZmllZCBhcnJheSwKLQkgKiBvciByZXR1cm4gLTEgaWYgdGhlcmUgaXMgbm8gc3VjaCBpbmRleC4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI2xhc3RJbmRleE9mKE9iamVjdFtdIGFycmF5LCBPYmplY3QgbykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBsYXN0SW5kZXhPZihPYmplY3RbXSBhcnJheSwgT2JqZWN0IHZhbHVlKSB7Ci0JCWludCBsZW4gPSBhcnJheS5sZW5ndGg7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gbGVuOyBpLS0gPiAwOyApIHsKLQkJCQlpZiAoYXJyYXlbaV0gPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gaTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlmb3IgKGludCBpID0gbGVuOyBpLS0gPiAwOyApIHsKLQkJCQlpZiAodmFsdWUuZXF1YWxzKGFycmF5W2ldKSkgewotCQkJCQlyZXR1cm4gaTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiB0aGUKLQkgKiBzcGVjaWZpZWQgZWxlbWVudCBpbiB0aGUgc3BlY2lmaWVkIGFycmF5LAotCSAqIG9yIHJldHVybiAtMSBpZiB0aGVyZSBpcyBubyBzdWNoIGluZGV4LgotCSAqIGphdmEudXRpbC5BcnJheXMjbGFzdEluZGV4T2YoY2hhcltdIGFycmF5LCBjaGFyIHZhbHVlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGxhc3RJbmRleE9mKGNoYXJbXSBhcnJheSwgY2hhciB2YWx1ZSkgewotCQlmb3IgKGludCBpID0gYXJyYXkubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmIChhcnJheVtpXSA9PSB2YWx1ZSkgewotCQkJCXJldHVybiBpOwotCQkJfQotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgdGhlCi0JICogc3BlY2lmaWVkIGVsZW1lbnQgaW4gdGhlIHNwZWNpZmllZCBhcnJheSwKLQkgKiBvciByZXR1cm4gLTEgaWYgdGhlcmUgaXMgbm8gc3VjaCBpbmRleC4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI2xhc3RJbmRleE9mKGludFtdIGFycmF5LCBpbnQgdmFsdWUpCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgbGFzdEluZGV4T2YoaW50W10gYXJyYXksIGludCB2YWx1ZSkgewotCQlmb3IgKGludCBpID0gYXJyYXkubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmIChhcnJheVtpXSA9PSB2YWx1ZSkgewotCQkJCXJldHVybiBpOwotCQkJfQotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKiBqYXZhLnV0aWwuSXRlcmF0b3IjdG9MaXN0KCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBMaXN0PEU+IGxpc3QoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yKSB7Ci0JCUxpc3Q8RT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8RT4oKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJbGlzdC5hZGQoaXRlcmF0b3IubmV4dCgpKTsKLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKiBVbmxpa2UgamF2YS51dGlsLkFycmF5cy5hc0xpc3QoT2JqZWN0W10pLCB0aGUgbGlzdAotCSAqIGlzIG1vZGlmaWFibGUgYW5kIGlzIG5vdCBiYWNrZWQgYnkgdGhlIGFycmF5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IExpc3Q8RT4gbGlzdChFLi4uIGFycmF5KSB7Ci0JCUxpc3Q8RT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8RT4oYXJyYXkubGVuZ3RoKTsKLQkJZm9yIChFIGl0ZW0gOiBhcnJheSkgewotCQkJbGlzdC5hZGQoaXRlbSk7Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBpdGVyYXRvciBmb3IgdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI2xpc3RJdGVyYXRvcihPYmplY3RbXSBhcnJheSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBMaXN0SXRlcmF0b3I8RT4gbGlzdEl0ZXJhdG9yKEUuLi4gYXJyYXkpIHsKLQkJcmV0dXJuIGxpc3RJdGVyYXRvcihhcnJheSwgMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBpdGVyYXRvciBmb3IgdGhlIHNwZWNpZmllZCBhcnJheQotCSAqIHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24gaW4gdGhlIGFycmF5LgotCSAqIGphdmEudXRpbC5BcnJheXMjbGlzdEl0ZXJhdG9yKE9iamVjdFtdIGFycmF5LCBpbnQgaW5kZXgpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gTGlzdEl0ZXJhdG9yPEU+IGxpc3RJdGVyYXRvcihFW10gYXJyYXksIGludCBpbmRleCkgewotCQlyZXR1cm4gQXJyYXlzLmFzTGlzdChhcnJheSkubGlzdEl0ZXJhdG9yKGluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNoYXJhY3RlciBmcm9tIHRoZSBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgbWF4aW11bSB2YWx1ZS4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI21heChjaGFyW10gYXJyYXkpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyIG1heChjaGFyLi4uIGFycmF5KSB7Ci0JCWludCBsZW4gPSBhcnJheS5sZW5ndGg7Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKLQkJfQotCQljaGFyIG1heCA9IGFycmF5WzBdOwotCQkvLyBzdGFydCBhdCAxCi0JCWZvciAoaW50IGkgPSAxOyBpIDwgbGVuOyBpKyspIHsKLQkJCWNoYXIgbmV4dCA9IGFycmF5W2ldOwotCQkJaWYgKG5leHQgPiBtYXgpIHsKLQkJCQltYXggPSBuZXh0OwotCQkJfQotCQl9Ci0JCXJldHVybiBtYXg7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbnRlZ2VyIGZyb20gdGhlIHNwZWNpZmllZCBhcnJheSB3aXRoIHRoZSBtYXhpbXVtIHZhbHVlLgotCSAqIGphdmEudXRpbC5BcnJheXMjbWF4KGludFtdIGFycmF5KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IG1heChpbnQuLi4gYXJyYXkpIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQl0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwotCQl9Ci0JCWludCBtYXggPSBhcnJheVswXTsKLQkJLy8gc3RhcnQgYXQgMQotCQlmb3IgKGludCBpID0gMTsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlpbnQgbmV4dCA9IGFycmF5W2ldOwotCQkJaWYgKG5leHQgPiBtYXgpIHsKLQkJCQltYXggPSBuZXh0OwotCQkJfQotCQl9Ci0JCXJldHVybiBtYXg7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjaGFyYWN0ZXIgZnJvbSB0aGUgc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIG1pbmltdW0gdmFsdWUuCi0JICogamF2YS51dGlsLkFycmF5cyNtaW4oY2hhcltdIGFycmF5KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhciBtaW4oY2hhci4uLiBhcnJheSkgewotCQlpbnQgbGVuID0gYXJyYXkubGVuZ3RoOwotCQlpZiAobGVuID09IDApIHsKLQkJCXRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7Ci0JCX0KLQkJY2hhciBtaW4gPSBhcnJheVswXTsKLQkJLy8gc3RhcnQgYXQgMQotCQlmb3IgKGludCBpID0gMTsgaSA8IGxlbjsgaSsrKSB7Ci0JCQljaGFyIG5leHQgPSBhcnJheVtpXTsKLQkJCWlmIChuZXh0IDwgbWluKSB7Ci0JCQkJbWluID0gbmV4dDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbWluOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW50ZWdlciBmcm9tIHRoZSBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgbWluaW11bSB2YWx1ZS4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI21pbihpbnRbXSBhcnJheSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBtaW4oaW50Li4uIGFycmF5KSB7Ci0JCWludCBsZW4gPSBhcnJheS5sZW5ndGg7Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKLQkJfQotCQlpbnQgbWluID0gYXJyYXlbMF07Ci0JCS8vIHN0YXJ0IGF0IDEKLQkJZm9yIChpbnQgaSA9IDE7IGkgPCBsZW47IGkrKykgewotCQkJaW50IG5leHQgPSBhcnJheVtpXTsKLQkJCWlmIChuZXh0IDwgbWluKSB7Ci0JCQkJbWluID0gbmV4dDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbWluOwotCX0KLQotCS8qKgotCSAqIFJlcGxhY2UgYWxsIG9jY3VycmVuY2VzIG9mIHRoZSBzcGVjaWZpZWQgb2xkIHZhbHVlIHdpdGgKLQkgKiB0aGUgc3BlY2lmaWVkIG5ldyB2YWx1ZS4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI3JlcGxhY2VBbGwoT2JqZWN0W10gYXJyYXksIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSByZXBsYWNlQWxsKEVbXSBhcnJheSwgT2JqZWN0IG9sZFZhbHVlLCBFIG5ld1ZhbHVlKSB7Ci0JCWlmIChvbGRWYWx1ZSA9PSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gYXJyYXkubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCQlpZiAoYXJyYXlbaV0gPT0gbnVsbCkgewotCQkJCQlhcnJheVtpXSA9IG5ld1ZhbHVlOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWZvciAoaW50IGkgPSBhcnJheS5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJCWlmIChvbGRWYWx1ZS5lcXVhbHMoYXJyYXlbaV0pKSB7Ci0JCQkJCWFycmF5W2ldID0gbmV3VmFsdWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBsYWNlIGFsbCBvY2N1cnJlbmNlcyBvZiB0aGUgc3BlY2lmaWVkIG9sZCB2YWx1ZSB3aXRoCi0JICogdGhlIHNwZWNpZmllZCBuZXcgdmFsdWUuCi0JICogamF2YS51dGlsLkFycmF5cyNyZXBsYWNlQWxsKGludFtdIGFycmF5LCBpbnQgb2xkVmFsdWUsIGludCBuZXdWYWx1ZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludFtdIHJlcGxhY2VBbGwoaW50W10gYXJyYXksIGludCBvbGRWYWx1ZSwgaW50IG5ld1ZhbHVlKSB7Ci0JCWZvciAoaW50IGkgPSBhcnJheS5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaWYgKGFycmF5W2ldID09IG9sZFZhbHVlKSB7Ci0JCQkJYXJyYXlbaV0gPSBuZXdWYWx1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmVwbGFjZSBhbGwgb2NjdXJyZW5jZXMgb2YgdGhlIHNwZWNpZmllZCBvbGQgdmFsdWUgd2l0aAotCSAqIHRoZSBzcGVjaWZpZWQgbmV3IHZhbHVlLgotCSAqIGphdmEudXRpbC5BcnJheXMjcmVwbGFjZUFsbChjaGFyW10gYXJyYXksIGNoYXIgb2xkVmFsdWUsIGNoYXIgbmV3VmFsdWUpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gcmVwbGFjZUFsbChjaGFyW10gYXJyYXksIGNoYXIgb2xkVmFsdWUsIGNoYXIgbmV3VmFsdWUpIHsKLQkJZm9yIChpbnQgaSA9IGFycmF5Lmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlpZiAoYXJyYXlbaV0gPT0gb2xkVmFsdWUpIHsKLQkJCQlhcnJheVtpXSA9IG5ld1ZhbHVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIHNwZWNpZmllZCBlbGVtZW50IHJlbW92ZWQuCi0JICogamF2YS51dGlsLkFycmF5cyNyZW1vdmUoT2JqZWN0W10gYXJyYXksIE9iamVjdCB2YWx1ZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gcmVtb3ZlKEVbXSBhcnJheSwgT2JqZWN0IHZhbHVlKSB7Ci0JCXJldHVybiByZW1vdmVFbGVtZW50QXRJbmRleChhcnJheSwgaW5kZXhPZihhcnJheSwgdmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIHNwZWNpZmllZCBlbGVtZW50IHJlbW92ZWQuCi0JICogamF2YS51dGlsLkFycmF5cyNyZW1vdmUoY2hhcltdIGFycmF5LCBjaGFyIHZhbHVlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHJlbW92ZShjaGFyW10gYXJyYXksIGNoYXIgdmFsdWUpIHsKLQkJcmV0dXJuIHJlbW92ZUVsZW1lbnRBdEluZGV4KGFycmF5LCBpbmRleE9mKGFycmF5LCB2YWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgcmVtb3ZlZC4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI3JlbW92ZShpbnRbXSBhcnJheSwgaW50IHZhbHVlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50W10gcmVtb3ZlKGludFtdIGFycmF5LCBpbnQgdmFsdWUpIHsKLQkJcmV0dXJuIHJlbW92ZUVsZW1lbnRBdEluZGV4KGFycmF5LCBpbmRleE9mKGFycmF5LCB2YWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgdGhlIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sbGVjdGlvbiBjaGFuZ2VkIGFzIGEgcmVzdWx0LgotCSAqIGphdmEudXRpbC5Db2xsZWN0aW9uI3JlbW92ZUFsbChqYXZhLnV0aWwuSXRlcmF0b3IgaXRlcmF0b3IpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIEl0ZXJhdG9yPD8+IGl0ZXJhdG9yKSB7Ci0JCWJvb2xlYW4gbW9kaWZpZWQgPSBmYWxzZTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJbW9kaWZpZWQgfD0gcmVtb3ZlQWxsT2NjdXJyZW5jZXMoY29sbGVjdGlvbiwgaXRlcmF0b3IubmV4dCgpKTsKLQkJfQotCQlyZXR1cm4gbW9kaWZpZWQ7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCB0aGUgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBhcnJheQotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQgYXMgYSByZXN1bHQuCi0JICogamF2YS51dGlsLkNvbGxlY3Rpb24jcmVtb3ZlQWxsKE9iamVjdFtdIGFycmF5KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZW1vdmVBbGwoQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBPYmplY3RbXSBhcnJheSkgewotCQlib29sZWFuIG1vZGlmaWVkID0gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSBhcnJheS5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJbW9kaWZpZWQgfD0gcmVtb3ZlQWxsT2NjdXJyZW5jZXMoY29sbGVjdGlvbiwgYXJyYXlbaV0pOwotCQl9Ci0JCXJldHVybiBtb2RpZmllZDsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgZnJvbSB0aGUgc3BlY2lmaWVkIGFycmF5IGFsbCB0aGUgZWxlbWVudHMgaW4KLQkgKiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIGphdmEudXRpbC5BcnJheXMjcmVtb3ZlQWxsKE9iamVjdFtdIGFycmF5LCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHJlbW92ZUFsbChFW10gYXJyYXksIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbikgewotCQlFW10gcmVzdWx0ID0gYXJyYXk7Ci0JCS8vIGdvIGJhY2t3YXJkcyBzaW5jZSB3ZSB3aWxsIGJlIHB1bGxpbmcgZWxlbWVudHMKLQkJLy8gb3V0IG9mICdyZXN1bHQnIGFuZCBpdCB3aWxsIGdldCBzaG9ydGVyIGFzIHdlIGdvCi0JCWZvciAoaW50IGkgPSBhcnJheS5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJRSBpdGVtID0gYXJyYXlbaV07Ci0JCQlpZiAoY29sbGVjdGlvbi5jb250YWlucyhpdGVtKSkgewotCQkJCXJlc3VsdCA9IHJlbW92ZUVsZW1lbnRBdEluZGV4KHJlc3VsdCwgaSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgZnJvbSB0aGUgZmlyc3Qgc3BlY2lmaWVkIGFycmF5IGFsbCB0aGUgZWxlbWVudHMgaW4KLQkgKiB0aGUgc2Vjb25kIHNwZWNpZmllZCBhcnJheSBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogamF2YS51dGlsLkFycmF5cyNyZW1vdmVBbGwoT2JqZWN0W10gYXJyYXkxLCBPYmplY3RbXSBhcnJheTIpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHJlbW92ZUFsbChFW10gYXJyYXkxLCBPYmplY3RbXSBhcnJheTIpIHsKLQkJLy8gY29udmVydCB0byBhIGJhZyB0byB0YWtlIGFkdmFudGFnZSBvZiBoYXNoZWQgbG9vay11cAotCQlyZXR1cm4gcmVtb3ZlQWxsKGFycmF5MSwgYmFnKGFycmF5MikpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBmcm9tIHRoZSBmaXJzdCBzcGVjaWZpZWQgYXJyYXkgYWxsIHRoZSBlbGVtZW50cyBpbgotCSAqIHRoZSBzZWNvbmQgc3BlY2lmaWVkIGFycmF5IGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI3JlbW92ZUFsbChjaGFyW10gYXJyYXkxLCBjaGFyW10gYXJyYXkyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHJlbW92ZUFsbChjaGFyW10gYXJyYXkxLCBjaGFyW10gYXJyYXkyKSB7Ci0JCWNoYXJbXSByZXN1bHQxID0gYXJyYXkxOwotCQkvLyBnbyBiYWNrd2FyZHMgc2luY2Ugd2Ugd2lsbCBiZSBwdWxsaW5nIGVsZW1lbnRzCi0JCS8vIG91dCBvZiAncmVzdWx0MScgYW5kIGl0IHdpbGwgZ2V0IHNob3J0ZXIgYXMgd2UgZ28KLQkJZm9yIChpbnQgaSA9IGFycmF5MS5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJY2hhciBpdGVtID0gYXJyYXkxW2ldOwotCQkJaWYgKGNvbnRhaW5zKGFycmF5MiwgaXRlbSkpIHsKLQkJCQlyZXN1bHQxID0gcmVtb3ZlRWxlbWVudEF0SW5kZXgocmVzdWx0MSwgaSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDE7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGZyb20gdGhlIGZpcnN0IHNwZWNpZmllZCBhcnJheSBhbGwgdGhlIGVsZW1lbnRzIGluCi0JICogdGhlIHNlY29uZCBzcGVjaWZpZWQgYXJyYXkgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIGphdmEudXRpbC5BcnJheXMjcmVtb3ZlQWxsKGludFtdIGFycmF5MSwgaW50W10gYXJyYXkyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50W10gcmVtb3ZlQWxsKGludFtdIGFycmF5MSwgaW50W10gYXJyYXkyKSB7Ci0JCWludFtdIHJlc3VsdDEgPSBhcnJheTE7Ci0JCS8vIGdvIGJhY2t3YXJkcyBzaW5jZSB3ZSB3aWxsIGJlIHB1bGxpbmcgZWxlbWVudHMKLQkJLy8gb3V0IG9mICdyZXN1bHQxJyBhbmQgaXQgd2lsbCBnZXQgc2hvcnRlciBhcyB3ZSBnbwotCQlmb3IgKGludCBpID0gYXJyYXkxLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlpbnQgaXRlbSA9IGFycmF5MVtpXTsKLQkJCWlmIChjb250YWlucyhhcnJheTIsIGl0ZW0pKSB7Ci0JCQkJcmVzdWx0MSA9IHJlbW92ZUVsZW1lbnRBdEluZGV4KHJlc3VsdDEsIGkpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQxOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgb2NjdXJyZW5jZXMgb2YgdGhlIHNwZWNpZmllZCBlbGVtZW50Ci0JICogZnJvbSB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZCBhcyBhIHJlc3VsdC4KLQkgKiBqYXZhLnV0aWwuQ29sbGVjdGlvbiNyZW1vdmVBbGxPY2N1cnJlbmNlcyhPYmplY3QgdmFsdWUpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHJlbW92ZUFsbE9jY3VycmVuY2VzKENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgT2JqZWN0IHZhbHVlKSB7Ci0JCWJvb2xlYW4gbW9kaWZpZWQgPSBmYWxzZTsKLQkJSXRlcmF0b3I8Pz4gc3RyZWFtID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOwotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCQlpZiAoc3RyZWFtLm5leHQoKSA9PSBudWxsKSB7Ci0JCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCQkJbW9kaWZpZWQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQkJaWYgKHZhbHVlLmVxdWFscyhzdHJlYW0ubmV4dCgpKSkgewotCQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQkJCW1vZGlmaWVkID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVkOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBmcm9tIHRoZSBzcGVjaWZpZWQgYXJyYXkgYWxsIG9jY3VycmVuY2VzIG9mCi0JICogdGhlIHNwZWNpZmllZCBlbGVtZW50IGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI3JlbW92ZUFsbE9jY3VycmVuY2VzKE9iamVjdFtdIGFycmF5LCBPYmplY3QgdmFsdWUpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHJlbW92ZUFsbE9jY3VycmVuY2VzKEVbXSBhcnJheSwgT2JqZWN0IHZhbHVlKSB7Ci0JCUVbXSByZXN1bHQgPSBhcnJheTsKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCS8vIGdvIGJhY2t3YXJkcyBzaW5jZSB3ZSB3aWxsIGJlIHB1bGxpbmcgZWxlbWVudHMKLQkJCS8vIG91dCBvZiAncmVzdWx0JyBhbmQgaXQgd2lsbCBnZXQgc2hvcnRlciBhcyB3ZSBnbwotCQkJZm9yIChpbnQgaSA9IGFycmF5Lmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQkJaWYgKGFycmF5W2ldID09IG51bGwpIHsKLQkJCQkJcmVzdWx0ID0gcmVtb3ZlRWxlbWVudEF0SW5kZXgocmVzdWx0LCBpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvLyBnbyBiYWNrd2FyZHMgc2luY2Ugd2Ugd2lsbCBiZSBwdWxsaW5nIGVsZW1lbnRzCi0JCQkvLyBvdXQgb2YgJ3Jlc3VsdCcgYW5kIGl0IHdpbGwgZ2V0IHNob3J0ZXIgYXMgd2UgZ28KLQkJCWZvciAoaW50IGkgPSBhcnJheS5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJCWlmICh2YWx1ZS5lcXVhbHMoYXJyYXlbaV0pKSB7Ci0JCQkJCXJlc3VsdCA9IHJlbW92ZUVsZW1lbnRBdEluZGV4KHJlc3VsdCwgaSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGZyb20gdGhlIHNwZWNpZmllZCBhcnJheSBhbGwgb2NjdXJyZW5jZXMgb2YKLQkgKiB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIGphdmEudXRpbC5BcnJheXMjcmVtb3ZlQWxsT2NjdXJyZW5jZXMoY2hhcltdIGFycmF5LCBjaGFyIHZhbHVlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHJlbW92ZUFsbE9jY3VycmVuY2VzKGNoYXJbXSBhcnJheSwgY2hhciB2YWx1ZSkgewotCQljaGFyW10gcmVzdWx0ID0gYXJyYXk7Ci0JCS8vIGdvIGJhY2t3YXJkcyBzaW5jZSB3ZSB3aWxsIGJlIHB1bGxpbmcgZWxlbWVudHMKLQkJLy8gb3V0IG9mICdyZXN1bHQnIGFuZCBpdCB3aWxsIGdldCBzaG9ydGVyIGFzIHdlIGdvCi0JCWZvciAoaW50IGkgPSBhcnJheS5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaWYgKGFycmF5W2ldID09IHZhbHVlKSB7Ci0JCQkJcmVzdWx0ID0gcmVtb3ZlRWxlbWVudEF0SW5kZXgocmVzdWx0LCBpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBmcm9tIHRoZSBzcGVjaWZpZWQgYXJyYXkgYWxsIG9jY3VycmVuY2VzIG9mCi0JICogdGhlIHNwZWNpZmllZCBlbGVtZW50IGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI3JlbW92ZUFsbE9jY3VycmVuY2VzKGludFtdIGFycmF5LCBpbnQgdmFsdWUpCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnRbXSByZW1vdmVBbGxPY2N1cnJlbmNlcyhpbnRbXSBhcnJheSwgaW50IHZhbHVlKSB7Ci0JCWludFtdIHJlc3VsdCA9IGFycmF5OwotCQkvLyBnbyBiYWNrd2FyZHMgc2luY2Ugd2Ugd2lsbCBiZSBwdWxsaW5nIGVsZW1lbnRzCi0JCS8vIG91dCBvZiAncmVzdWx0JyBhbmQgaXQgd2lsbCBnZXQgc2hvcnRlciBhcyB3ZSBnbwotCQlmb3IgKGludCBpID0gYXJyYXkubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmIChhcnJheVtpXSA9PSB2YWx1ZSkgewotCQkJCXJlc3VsdCA9IHJlbW92ZUVsZW1lbnRBdEluZGV4KHJlc3VsdCwgaSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIHNwZWNpZmllZCBlbGVtZW50IHJlbW92ZWQuCi0JICogamF2YS51dGlsLkFycmF5cyNyZW1vdmVFbGVtZW50QXRJbmRleChPYmplY3RbXSBhcnJheSwgaW50IGluZGV4KQotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSByZW1vdmVFbGVtZW50QXRJbmRleChFW10gYXJyYXksIGludCBpbmRleCkgewotCQlpbnQgbGVuID0gYXJyYXkubGVuZ3RoOwotCQlFW10gcmVzdWx0ID0gKEVbXSkgQXJyYXkubmV3SW5zdGFuY2UoYXJyYXkuZ2V0Q2xhc3MoKS5nZXRDb21wb25lbnRUeXBlKCksIGxlbiAtIDEpOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCAwLCByZXN1bHQsIDAsIGluZGV4KTsKLQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgaW5kZXggKyAxLCByZXN1bHQsIGluZGV4LCBsZW4gLSBpbmRleCAtIDEpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgcmVtb3ZlZC4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI3JlbW92ZUVsZW1lbnRBdEluZGV4KGNoYXJbXSBhcnJheSwgaW50IGluZGV4KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHJlbW92ZUVsZW1lbnRBdEluZGV4KGNoYXJbXSBhcnJheSwgaW50IGluZGV4KSB7Ci0JCWludCBsZW4gPSBhcnJheS5sZW5ndGg7Ci0JCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltsZW4gLSAxXTsKLQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgMCwgcmVzdWx0LCAwLCBpbmRleCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIGluZGV4ICsgMSwgcmVzdWx0LCBpbmRleCwgbGVuIC0gaW5kZXggLSAxKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIHNwZWNpZmllZCBlbGVtZW50IHJlbW92ZWQuCi0JICogamF2YS51dGlsLkFycmF5cyNyZW1vdmVFbGVtZW50QXRJbmRleChpbnRbXSBhcnJheSwgaW50IGluZGV4KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50W10gcmVtb3ZlRWxlbWVudEF0SW5kZXgoaW50W10gYXJyYXksIGludCBpbmRleCkgewotCQlpbnQgbGVuID0gYXJyYXkubGVuZ3RoOwotCQlpbnRbXSByZXN1bHQgPSBuZXcgaW50W2xlbiAtIDFdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCAwLCByZXN1bHQsIDAsIGluZGV4KTsKLQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgaW5kZXggKyAxLCByZXN1bHQsIGluZGV4LCBsZW4gLSBpbmRleCAtIDEpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbnkgZHVwbGljYXRlIGVsZW1lbnRzIGZyb20gdGhlIHNwZWNpZmllZCBhcnJheSwKLQkgKiB3aGlsZSBtYWludGFpbmluZyB0aGUgb3JkZXIuCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHJlbW92ZUR1cGxpY2F0ZUVsZW1lbnRzKEUuLi4gYXJyYXkpIHsKLQkJTGlzdDxFPiBsaXN0ID0gcmVtb3ZlRHVwbGljYXRlRWxlbWVudHMoQXJyYXlzLmFzTGlzdChhcnJheSkpOwotCQlyZXR1cm4gbGlzdC50b0FycmF5KChFW10pIEFycmF5Lm5ld0luc3RhbmNlKGFycmF5LmdldENsYXNzKCkuZ2V0Q29tcG9uZW50VHlwZSgpLCBsaXN0LnNpemUoKSkpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbnkgZHVwbGljYXRlIGVsZW1lbnRzIGZyb20gdGhlIHNwZWNpZmllZCBsaXN0LAotCSAqIHdoaWxlIG1haW50YWluaW5nIHRoZSBvcmRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBMaXN0PEU+IHJlbW92ZUR1cGxpY2F0ZUVsZW1lbnRzKExpc3Q8RT4gbGlzdCkgewotCQlMaXN0PEU+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8RT4obGlzdC5zaXplKCkpOwotCQlTZXQ8RT4gc2V0ID0gbmV3IEhhc2hTZXQ8RT4obGlzdC5zaXplKCkpOwkJLy8gdGFrZSBhZHZhbnRhZ2Ugb2YgaGFzaGVkIGxvb2stdXAKLQkJZm9yIChFIGl0ZW0gOiBsaXN0KSB7Ci0JCQlpZiAoc2V0LmFkZChpdGVtKSkgewotCQkJCXJlc3VsdC5hZGQoaXRlbSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXRhaW4gb25seSB0aGUgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBpdGVyYXRvcgotCSAqIGluIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sbGVjdGlvbiBjaGFuZ2VkIGFzIGEgcmVzdWx0LgotCSAqIGphdmEudXRpbC5Db2xsZWN0aW9uI3JldGFpbkFsbChqYXZhLnV0aWwuSXRlcmF0b3IgaXRlcmF0b3IpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHJldGFpbkFsbChDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIEl0ZXJhdG9yPD8+IGl0ZXJhdG9yKSB7Ci0JCXJldHVybiBjb2xsZWN0aW9uLnJldGFpbkFsbChjb2xsZWN0aW9uKGl0ZXJhdG9yKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0YWluIG9ubHkgdGhlIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgYXJyYXkKLQkgKiBpbiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZCBhcyBhIHJlc3VsdC4KLQkgKiBqYXZhLnV0aWwuQ29sbGVjdGlvbiNyZXRhaW5BbGwoT2JqZWN0W10gYXJyYXkpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHJldGFpbkFsbChDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIE9iamVjdFtdIGFycmF5KSB7Ci0JCXJldHVybiBjb2xsZWN0aW9uLnJldGFpbkFsbChzZXQoYXJyYXkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRhaW4gaW4gdGhlIHNwZWNpZmllZCBhcnJheSBhbGwgdGhlIGVsZW1lbnRzIGluCi0JICogdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI3JldGFpbkFsbChPYmplY3RbXSBhcnJheSwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSByZXRhaW5BbGwoRVtdIGFycmF5LCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24pIHsKLQkJRVtdIHJlc3VsdCA9IGFycmF5OwotCQkvLyBnbyBiYWNrd2FyZHMgc2luY2Ugd2Ugd2lsbCBiZSBwdWxsaW5nIGVsZW1lbnRzCi0JCS8vIG91dCBvZiAncmVzdWx0JyBhbmQgaXQgd2lsbCBnZXQgc2hvcnRlciBhcyB3ZSBnbwotCQlmb3IgKGludCBpID0gYXJyYXkubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmICggISBjb2xsZWN0aW9uLmNvbnRhaW5zKGFycmF5W2ldKSkgewotCQkJCXJlc3VsdCA9IHJlbW92ZUVsZW1lbnRBdEluZGV4KHJlc3VsdCwgaSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgZnJvbSB0aGUgZmlyc3Qgc3BlY2lmaWVkIGFycmF5IGFsbCB0aGUgZWxlbWVudHMgaW4KLQkgKiB0aGUgc2Vjb25kIHNwZWNpZmllZCBhcnJheSBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogamF2YS51dGlsLkFycmF5cyNyZXRhaW5BbGwoT2JqZWN0W10gYXJyYXkxLCBPYmplY3RbXSBhcnJheTIpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHJldGFpbkFsbChFW10gYXJyYXkxLCBPYmplY3RbXSBhcnJheTIpIHsKLQkJLy8gY29udmVydCB0byBhIGJhZyB0byB0YWtlIGFkdmFudGFnZSBvZiBoYXNoZWQgbG9vay11cAotCQlyZXR1cm4gcmV0YWluQWxsKGFycmF5MSwgYmFnKGFycmF5MikpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBmcm9tIHRoZSBmaXJzdCBzcGVjaWZpZWQgYXJyYXkgYWxsIHRoZSBlbGVtZW50cyBpbgotCSAqIHRoZSBzZWNvbmQgc3BlY2lmaWVkIGFycmF5IGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI3JldGFpbkFsbChjaGFyW10gYXJyYXkxLCBjaGFyW10gYXJyYXkyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHJldGFpbkFsbChjaGFyW10gYXJyYXkxLCBjaGFyW10gYXJyYXkyKSB7Ci0JCWNoYXJbXSByZXN1bHQxID0gYXJyYXkxOwotCQkvLyBnbyBiYWNrd2FyZHMgc2luY2Ugd2Ugd2lsbCBiZSBwdWxsaW5nIGVsZW1lbnRzCi0JCS8vIG91dCBvZiAncmVzdWx0MScgYW5kIGl0IHdpbGwgZ2V0IHNob3J0ZXIgYXMgd2UgZ28KLQkJZm9yIChpbnQgaSA9IGFycmF5MS5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJY2hhciBpdGVtID0gYXJyYXkxW2ldOwotCQkJaWYgKCAhIGNvbnRhaW5zKGFycmF5MiwgaXRlbSkpIHsKLQkJCQlyZXN1bHQxID0gcmVtb3ZlRWxlbWVudEF0SW5kZXgocmVzdWx0MSwgaSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDE7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGZyb20gdGhlIGZpcnN0IHNwZWNpZmllZCBhcnJheSBhbGwgdGhlIGVsZW1lbnRzIGluCi0JICogdGhlIHNlY29uZCBzcGVjaWZpZWQgYXJyYXkgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIGphdmEudXRpbC5BcnJheXMjcmVtb3ZlQWxsKGludFtdIGFycmF5MSwgaW50W10gYXJyYXkyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50W10gcmV0YWluQWxsKGludFtdIGFycmF5MSwgaW50W10gYXJyYXkyKSB7Ci0JCWludFtdIHJlc3VsdDEgPSBhcnJheTE7Ci0JCS8vIGdvIGJhY2t3YXJkcyBzaW5jZSB3ZSB3aWxsIGJlIHB1bGxpbmcgZWxlbWVudHMKLQkJLy8gb3V0IG9mICdyZXN1bHQxJyBhbmQgaXQgd2lsbCBnZXQgc2hvcnRlciBhcyB3ZSBnbwotCQlmb3IgKGludCBpID0gYXJyYXkxLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlpbnQgaXRlbSA9IGFycmF5MVtpXTsKLQkJCWlmICggISBjb250YWlucyhhcnJheTIsIGl0ZW0pKSB7Ci0JCQkJcmVzdWx0MSA9IHJlbW92ZUVsZW1lbnRBdEluZGV4KHJlc3VsdDEsIGkpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQxOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgcmV2ZXJzZWQuCi0JICogamF2YS51dGlsLkFycmF5cy5yZXZlcnNlKE9iamVjdFtdIGFycmF5KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSByZXZlcnNlKEUuLi4gYXJyYXkpIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDAsIG1pZCA9IGxlbiA+PiAxLCBqID0gbGVuIC0gMTsgaSA8IG1pZDsgaSsrLCBqLS0pIHsKLQkJCXN3YXAoYXJyYXksIGksIGopOwotCQl9Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IHJldmVyc2VkLgotCSAqIGphdmEudXRpbC5BcnJheXMucmV2ZXJzZShjaGFyW10gYXJyYXkpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gcmV2ZXJzZShjaGFyLi4uIGFycmF5KSB7Ci0JCWludCBsZW4gPSBhcnJheS5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwLCBtaWQgPSBsZW4gPj4gMSwgaiA9IGxlbiAtIDE7IGkgPCBtaWQ7IGkrKywgai0tKSB7Ci0JCQlzd2FwKGFycmF5LCBpLCBqKTsKLQkJfQotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSByZXZlcnNlZC4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzLnJldmVyc2UoaW50W10gYXJyYXkpCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnRbXSByZXZlcnNlKGludC4uLiBhcnJheSkgewotCQlpbnQgbGVuID0gYXJyYXkubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMCwgbWlkID0gbGVuID4+IDEsIGogPSBsZW4gLSAxOyBpIDwgbWlkOyBpKyssIGotLSkgewotCQkJc3dhcChhcnJheSwgaSwgaik7Ci0JCX0KLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3Qgd2l0aCBlbnRyaWVzIGluIHJldmVyc2Ugb3JkZXIgZnJvbSB0aG9zZQotCSAqIHJldHVybmVkIGJ5IHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gTGlzdDxFPiByZXZlcnNlTGlzdChJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IpIHsKLQkJcmV0dXJuIHJldmVyc2UobGlzdChpdGVyYXRvcikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcm90YXRlZCBhcnJheSBhZnRlciByb3RhdGluZyBpdCBvbmUgcG9zaXRpb24uCi0JICogamF2YS51dGlsLkFycmF5cy5yb3RhdGUoT2JqZWN0W10gYXJyYXkpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHJvdGF0ZShFLi4uIGFycmF5KSB7Ci0JCXJldHVybiByb3RhdGUoYXJyYXksIDEpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcm90YXRlZCBhcnJheSBhZnRlciByb3RhdGluZyBpdCB0aGUgc3BlY2lmaWVkIGRpc3RhbmNlLgotCSAqIGphdmEudXRpbC5BcnJheXMucm90YXRlKE9iamVjdFtdIGFycmF5LCBpbnQgZGlzdGFuY2UpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHJvdGF0ZShFW10gYXJyYXksIGludCBkaXN0YW5jZSkgewotCQlpbnQgbGVuID0gYXJyYXkubGVuZ3RoOwotCQlpZiAobGVuID09IDApIHsKLQkJCXJldHVybiBhcnJheTsKLQkJfQotCQlkaXN0YW5jZSA9IGRpc3RhbmNlICUgbGVuOwotCQlpZiAoZGlzdGFuY2UgPCAwKSB7Ci0JCQlkaXN0YW5jZSArPSBsZW47Ci0JCX0KLQkJaWYgKGRpc3RhbmNlID09IDApIHsKLQkJCXJldHVybiBhcnJheTsKLQkJfQotCQlmb3IgKGludCBjeWNsZVN0YXJ0ID0gMCwgbk1vdmVkID0gMDsgbk1vdmVkICE9IGxlbjsgY3ljbGVTdGFydCsrKSB7Ci0JCQlFIGRpc3BsYWNlZCA9IGFycmF5W2N5Y2xlU3RhcnRdOwotCQkJaW50IGkgPSBjeWNsZVN0YXJ0OwotCQkJZG8gewotCQkJCWkgKz0gZGlzdGFuY2U7Ci0JCQkJaWYgKGkgPj0gbGVuKSB7Ci0JCQkJCWkgLT0gbGVuOwotCQkJCX0KLQkJCQlFIHRlbXAgPSBhcnJheVtpXTsKLQkJCQlhcnJheVtpXSA9IGRpc3BsYWNlZDsKLQkJCQlkaXNwbGFjZWQgPSB0ZW1wOwotCQkJCW5Nb3ZlZCArKzsKLQkJCX0gd2hpbGUgKGkgIT0gY3ljbGVTdGFydCk7Ci0JCX0KLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcm90YXRlZCBhcnJheSBhZnRlciByb3RhdGluZyBpdCBvbmUgcG9zaXRpb24uCi0JICogamF2YS51dGlsLkFycmF5cy5yb3RhdGUoY2hhcltdIGFycmF5KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHJvdGF0ZShjaGFyLi4uIGFycmF5KSB7Ci0JCXJldHVybiByb3RhdGUoYXJyYXksIDEpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcm90YXRlZCBhcnJheSBhZnRlciByb3RhdGluZyBpdCB0aGUgc3BlY2lmaWVkIGRpc3RhbmNlLgotCSAqIGphdmEudXRpbC5BcnJheXMucm90YXRlKGNoYXJbXSBhcnJheSwgaW50IGRpc3RhbmNlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHJvdGF0ZShjaGFyW10gYXJyYXksIGludCBkaXN0YW5jZSkgewotCQlpbnQgbGVuID0gYXJyYXkubGVuZ3RoOwotCQlpZiAobGVuID09IDApIHsKLQkJCXJldHVybiBhcnJheTsKLQkJfQotCQlkaXN0YW5jZSA9IGRpc3RhbmNlICUgbGVuOwotCQlpZiAoZGlzdGFuY2UgPCAwKSB7Ci0JCQlkaXN0YW5jZSArPSBsZW47Ci0JCX0KLQkJaWYgKGRpc3RhbmNlID09IDApIHsKLQkJCXJldHVybiBhcnJheTsKLQkJfQotCQlmb3IgKGludCBjeWNsZVN0YXJ0ID0gMCwgbk1vdmVkID0gMDsgbk1vdmVkICE9IGxlbjsgY3ljbGVTdGFydCsrKSB7Ci0JCQljaGFyIGRpc3BsYWNlZCA9IGFycmF5W2N5Y2xlU3RhcnRdOwotCQkJaW50IGkgPSBjeWNsZVN0YXJ0OwotCQkJZG8gewotCQkJCWkgKz0gZGlzdGFuY2U7Ci0JCQkJaWYgKGkgPj0gbGVuKSB7Ci0JCQkJCWkgLT0gbGVuOwotCQkJCX0KLQkJCQljaGFyIHRlbXAgPSBhcnJheVtpXTsKLQkJCQlhcnJheVtpXSA9IGRpc3BsYWNlZDsKLQkJCQlkaXNwbGFjZWQgPSB0ZW1wOwotCQkJCW5Nb3ZlZCArKzsKLQkJCX0gd2hpbGUgKGkgIT0gY3ljbGVTdGFydCk7Ci0JCX0KLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcm90YXRlZCBhcnJheSBhZnRlciByb3RhdGluZyBpdCBvbmUgcG9zaXRpb24uCi0JICogamF2YS51dGlsLkFycmF5cy5yb3RhdGUoaW50W10gYXJyYXkpCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnRbXSByb3RhdGUoaW50Li4uIGFycmF5KSB7Ci0JCXJldHVybiByb3RhdGUoYXJyYXksIDEpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcm90YXRlZCBhcnJheSBhZnRlciByb3RhdGluZyBpdCB0aGUgc3BlY2lmaWVkIGRpc3RhbmNlLgotCSAqIGphdmEudXRpbC5BcnJheXMucm90YXRlKGludFtdIGFycmF5LCBpbnQgZGlzdGFuY2UpCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnRbXSByb3RhdGUoaW50W10gYXJyYXksIGludCBkaXN0YW5jZSkgewotCQlpbnQgbGVuID0gYXJyYXkubGVuZ3RoOwotCQlpZiAobGVuID09IDApIHsKLQkJCXJldHVybiBhcnJheTsKLQkJfQotCQlkaXN0YW5jZSA9IGRpc3RhbmNlICUgbGVuOwotCQlpZiAoZGlzdGFuY2UgPCAwKSB7Ci0JCQlkaXN0YW5jZSArPSBsZW47Ci0JCX0KLQkJaWYgKGRpc3RhbmNlID09IDApIHsKLQkJCXJldHVybiBhcnJheTsKLQkJfQotCQlmb3IgKGludCBjeWNsZVN0YXJ0ID0gMCwgbk1vdmVkID0gMDsgbk1vdmVkICE9IGxlbjsgY3ljbGVTdGFydCsrKSB7Ci0JCQlpbnQgZGlzcGxhY2VkID0gYXJyYXlbY3ljbGVTdGFydF07Ci0JCQlpbnQgaSA9IGN5Y2xlU3RhcnQ7Ci0JCQlkbyB7Ci0JCQkJaSArPSBkaXN0YW5jZTsKLQkJCQlpZiAoaSA+PSBsZW4pIHsKLQkJCQkJaSAtPSBsZW47Ci0JCQkJfQotCQkJCWludCB0ZW1wID0gYXJyYXlbaV07Ci0JCQkJYXJyYXlbaV0gPSBkaXNwbGFjZWQ7Ci0JCQkJZGlzcGxhY2VkID0gdGVtcDsKLQkJCQluTW92ZWQgKys7Ci0JCQl9IHdoaWxlIChpICE9IGN5Y2xlU3RhcnQpOwotCQl9Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzZXQgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqIGphdmEudXRpbC5IYXNoU2V0KGphdmEudXRpbC5JdGVyYXRvciBpdGVyYXRvcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBTZXQ8RT4gc2V0KEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvcikgewotCQlTZXQ8RT4gc2V0ID0gbmV3IEhhc2hTZXQ8RT4oKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJc2V0LmFkZChpdGVyYXRvci5uZXh0KCkpOwotCQl9Ci0JCXJldHVybiBzZXQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc2V0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKiBqYXZhLnV0aWwuSGFzaFNldChPYmplY3RbXSBhcnJheSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBTZXQ8RT4gc2V0KEUuLi4gYXJyYXkpIHsKLQkJU2V0PEU+IHNldCA9IG5ldyBIYXNoU2V0PEU+KDIgKiBhcnJheS5sZW5ndGgpOwotCQlmb3IgKEUgaXRlbSA6IGFycmF5KSB7Ci0JCQlzZXQuYWRkKGl0ZW0pOwotCQl9Ci0JCXJldHVybiBzZXQ7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmFuZG9tIFJBTkRPTSA9IG5ldyBSYW5kb20oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgInNodWZmbGluZyIgaXQuCi0JICogamF2YS51dGlsLkFycmF5cyNzaHVmZmxlKE9iamVjdFtdIGFycmF5KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBzaHVmZmxlKEUuLi4gYXJyYXkpIHsKLQkJcmV0dXJuIHNodWZmbGUoYXJyYXksIFJBTkRPTSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciAic2h1ZmZsaW5nIiBpdC4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI3NodWZmbGUoT2JqZWN0W10gYXJyYXksIFJhbmRvbSByKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBzaHVmZmxlKEVbXSBhcnJheSwgUmFuZG9tIHJhbmRvbSkgewotCQlpbnQgbGVuID0gYXJyYXkubGVuZ3RoOwotCQlmb3IgKGludCBpID0gbGVuOyBpLS0gPiAwOyApIHsKLQkJCXN3YXAoYXJyYXksIGksIHJhbmRvbS5uZXh0SW50KGxlbikpOwotCQl9Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyICJzaHVmZmxpbmciIGl0LgotCSAqIGphdmEudXRpbC5BcnJheXMjc2h1ZmZsZShjaGFyW10gYXJyYXkpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gc2h1ZmZsZShjaGFyLi4uIGFycmF5KSB7Ci0JCXJldHVybiBzaHVmZmxlKGFycmF5LCBSQU5ET00pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgInNodWZmbGluZyIgaXQuCi0JICogamF2YS51dGlsLkFycmF5cyNzaHVmZmxlKGNoYXJbXSBhcnJheSwgUmFuZG9tIHIpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gc2h1ZmZsZShjaGFyW10gYXJyYXksIFJhbmRvbSByYW5kb20pIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IGxlbjsgaS0tID4gMDsgKSB7Ci0JCQlzd2FwKGFycmF5LCBpLCByYW5kb20ubmV4dEludChsZW4pKTsKLQkJfQotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciAic2h1ZmZsaW5nIiBpdC4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI3NodWZmbGUoaW50W10gYXJyYXkpCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnRbXSBzaHVmZmxlKGludC4uLiBhcnJheSkgewotCQlyZXR1cm4gc2h1ZmZsZShhcnJheSwgUkFORE9NKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyICJzaHVmZmxpbmciIGl0LgotCSAqIGphdmEudXRpbC5BcnJheXMjc2h1ZmZsZShpbnRbXSBhcnJheSwgUmFuZG9tIHIpCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnRbXSBzaHVmZmxlKGludFtdIGFycmF5LCBSYW5kb20gcmFuZG9tKSB7Ci0JCWludCBsZW4gPSBhcnJheS5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSBsZW47IGktLSA+IDA7ICkgewotCQkJc3dhcChhcnJheSwgaSwgcmFuZG9tLm5leHRJbnQobGVuKSk7Ci0JCX0KLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBpdGVyYXRvciB0aGF0IHJldHVybnMgb25seSB0aGUgc2luZ2xlLAotCSAqIHNwZWNpZmllZCBvYmplY3QuCi0JICogT2JqZWN0I3RvSXRlcmF0b3IoKSA/IQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEl0ZXJhdG9yPEU+IHNpbmdsZXRvbkl0ZXJhdG9yKEUgdmFsdWUpIHsKLQkJcmV0dXJuIG5ldyBTaW5nbGVFbGVtZW50SXRlcmF0b3I8RT4odmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICogamF2YS51dGlsLkl0ZXJhdG9yI3NpemUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IHNpemUoSXRlcmF0b3I8Pz4gaXRlcmF0b3IpIHsKLQkJaW50IHNpemUgPSAwOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlpdGVyYXRvci5uZXh0KCk7Ci0JCQlzaXplKys7Ci0JCX0KLQkJcmV0dXJuIHNpemU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc29ydGVkIHNldCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICogamF2YS51dGlsLlRyZWVTZXQoamF2YS51dGlsLkl0ZXJhdG9yIGl0ZXJhdG9yKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEUgZXh0ZW5kcyBDb21wYXJhYmxlPD8gc3VwZXIgRT4+IFNvcnRlZFNldDxFPiBzb3J0ZWRTZXQoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yKSB7Ci0JCXJldHVybiBzb3J0ZWRTZXQoaXRlcmF0b3IsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHNvcnRlZCBzZXQgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yCi0JICogYW5kIGNvbXBhcmF0b3IuCi0JICogamF2YS51dGlsLlRyZWVTZXQoamF2YS51dGlsLkl0ZXJhdG9yIGl0ZXJhdG9yLCBqYXZhLnV0aWwuQ29tcGFyYXRvciBjKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IFNvcnRlZFNldDxFPiBzb3J0ZWRTZXQoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yLCBDb21wYXJhdG9yPD8gc3VwZXIgRT4gY29tcGFyYXRvcikgewotCQlTb3J0ZWRTZXQ8RT4gc29ydGVkU2V0ID0gbmV3IFRyZWVTZXQ8RT4oY29tcGFyYXRvcik7Ci0JCXNvcnRlZFNldC5hZGRBbGwobGlzdChpdGVyYXRvcikpOwotCQlyZXR1cm4gc29ydGVkU2V0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHNvcnRlZCBzZXQgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGFycmF5LgotCSAqIGphdmEudXRpbC5UcmVlU2V0KE9iamVjdFtdIGFycmF5KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEUgZXh0ZW5kcyBDb21wYXJhYmxlPD8gc3VwZXIgRT4+IFNvcnRlZFNldDxFPiBzb3J0ZWRTZXQoRS4uLiBhcnJheSkgewotCQlyZXR1cm4gc29ydGVkU2V0KGFycmF5LCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzb3J0ZWQgc2V0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBhcnJheQotCSAqIGFuZCBjb21wYXJhdG9yLgotCSAqIGphdmEudXRpbC5UcmVlU2V0KE9iamVjdFtdIGFycmF5LCBqYXZhLnV0aWwuQ29tcGFyYXRvciBjKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IFNvcnRlZFNldDxFPiBzb3J0ZWRTZXQoRVtdIGFycmF5LCBDb21wYXJhdG9yPD8gc3VwZXIgRT4gY29tcGFyYXRvcikgewotCQlTb3J0ZWRTZXQ8RT4gc29ydGVkU2V0ID0gbmV3IFRyZWVTZXQ8RT4oY29tcGFyYXRvcik7Ci0JCXNvcnRlZFNldC5hZGRBbGwoQXJyYXlzLmFzTGlzdChhcnJheSkpOwotCQlyZXR1cm4gc29ydGVkU2V0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgdGhlIHNwZWNpZmllZCBlbGVtZW50cyBoYXZlIGJlZW4gInN3YXBwZWQiLgotCSAqIGphdmEudXRpbC5BcnJheXMjc3dhcChPYmplY3RbXSBhcnJheSwgaW50IGksIGludCBqKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBzd2FwKEVbXSBhcnJheSwgaW50IGksIGludCBqKSB7Ci0JCUUgdGVtcCA9IGFycmF5W2ldOwotCQlhcnJheVtpXSA9IGFycmF5W2pdOwotCQlhcnJheVtqXSA9IHRlbXA7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIHRoZSBzcGVjaWZpZWQgZWxlbWVudHMgaGF2ZSBiZWVuICJzd2FwcGVkIi4KLQkgKiBqYXZhLnV0aWwuQXJyYXlzI3N3YXAoY2hhcltdIGFycmF5LCBpbnQgaSwgaW50IGopCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gc3dhcChjaGFyW10gYXJyYXksIGludCBpLCBpbnQgaikgewotCQljaGFyIHRlbXAgPSBhcnJheVtpXTsKLQkJYXJyYXlbaV0gPSBhcnJheVtqXTsKLQkJYXJyYXlbal0gPSB0ZW1wOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciB0aGUgc3BlY2lmaWVkIGVsZW1lbnRzIGhhdmUgYmVlbiAic3dhcHBlZCIuCi0JICogamF2YS51dGlsLkFycmF5cyNzd2FwKGludFtdIGFycmF5LCBpbnQgaSwgaW50IGopCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnRbXSBzd2FwKGludFtdIGFycmF5LCBpbnQgaSwgaW50IGopIHsKLQkJaW50IHRlbXAgPSBhcnJheVtpXTsKLQkJYXJyYXlbaV0gPSBhcnJheVtqXTsKLQkJYXJyYXlbal0gPSB0ZW1wOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgdmVjdG9yIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgbGVnYWN5IGNvZGUgdGhhdCByZXF1aXJlcyBhIGphdmEudXRpbC5WZWN0b3IuCi0JICogamF2YS51dGlsLlZlY3RvcihqYXZhLnV0aWwuSXRlcmF0b3IgaXRlcmF0b3IpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gVmVjdG9yPEU+IHZlY3RvcihJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IpIHsKLQkJVmVjdG9yPEU+IHYgPSBuZXcgVmVjdG9yPEU+KCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCXYuYWRkRWxlbWVudChpdGVyYXRvci5uZXh0KCkpOwotCQl9Ci0JCXJldHVybiB2OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHZlY3RvciBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0JICogVGhpcyBpcyB1c2VmdWwgZm9yIGxlZ2FjeSBjb2RlIHRoYXQgcmVxdWlyZXMgYSBqYXZhLnV0aWwuVmVjdG9yLgotCSAqIGphdmEudXRpbC5WZWN0b3IoT2JqZWN0W10gYXJyYXkpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gVmVjdG9yPEU+IHZlY3RvcihFLi4uIGFycmF5KSB7Ci0JCWludCBsZW4gPSBhcnJheS5sZW5ndGg7Ci0JCVZlY3RvcjxFPiB2ID0gbmV3IFZlY3RvcjxFPihsZW4pOwotCQlmb3IgKEUgaXRlbSA6IGFycmF5KSB7Ci0JCQl2LmFkZEVsZW1lbnQoaXRlbSk7Ci0JCX0KLQkJcmV0dXJuIHY7Ci0JfQotCi0KLQkvLyoqKioqKioqKiogamF2YS51dGlsLkNvbGxlY3Rpb25zIGVuaGFuY2VtZW50cyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlc3RpbmF0aW9uIGxpc3QgYWZ0ZXIgdGhlIHNvdXJjZSBsaXN0IGhhcyBiZWVuIGNvcGllZCBpbnRvIGl0LgotCSAqIEBzZWUgamF2YS51dGlsLkNvbGxlY3Rpb25zI2NvcHkoamF2YS51dGlsLkxpc3QsIGphdmEudXRpbC5MaXN0KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IExpc3Q8PyBzdXBlciBFPiBjb3B5KExpc3Q8PyBzdXBlciBFPiBkZXN0LCBMaXN0PD8gZXh0ZW5kcyBFPiBzcmMpIHsKLQkJQ29sbGVjdGlvbnMuY29weShkZXN0LCBzcmMpOwotCQlyZXR1cm4gZGVzdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxpc3QgYWZ0ZXIgaXQgaGFzIGJlZW4gImZpbGxlZCIuCi0JICogQHNlZSBqYXZhLnV0aWwuQ29sbGVjdGlvbnMjZmlsbChqYXZhLnV0aWwuTGlzdCwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBMaXN0PD8gc3VwZXIgRT4gZmlsbChMaXN0PD8gc3VwZXIgRT4gbGlzdCwgRSB2YWx1ZSkgewotCQlDb2xsZWN0aW9ucy5maWxsKGxpc3QsIHZhbHVlKTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBsaXN0IGFmdGVyIGl0IGhhcyBiZWVuICJyZXZlcnNlZCIuCi0JICogQHNlZSBqYXZhLnV0aWwuQ29sbGVjdGlvbnMjcmV2ZXJzZShqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBMaXN0PEU+IHJldmVyc2UoTGlzdDxFPiBsaXN0KSB7Ci0JCUNvbGxlY3Rpb25zLnJldmVyc2UobGlzdCk7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbGlzdCBhZnRlciBpdCBoYXMgYmVlbiAicm90YXRlZCIgYnkgb25lIHBvc2l0aW9uLgotCSAqIEBzZWUgamF2YS51dGlsLkNvbGxlY3Rpb25zI3JvdGF0ZShqYXZhLnV0aWwuTGlzdCwgaW50KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IExpc3Q8RT4gcm90YXRlKExpc3Q8RT4gbGlzdCkgewotCQlyZXR1cm4gcm90YXRlKGxpc3QsIDEpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbGlzdCBhZnRlciBpdCBoYXMgYmVlbiAicm90YXRlZCIuCi0JICogQHNlZSBqYXZhLnV0aWwuQ29sbGVjdGlvbnMjcm90YXRlKGphdmEudXRpbC5MaXN0LCBpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gTGlzdDxFPiByb3RhdGUoTGlzdDxFPiBsaXN0LCBpbnQgZGlzdGFuY2UpIHsKLQkJQ29sbGVjdGlvbnMucm90YXRlKGxpc3QsIGRpc3RhbmNlKTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBsaXN0IGFmdGVyIGl0IGhhcyBiZWVuICJzaHVmZmxlZCIuCi0JICogQHNlZSBqYXZhLnV0aWwuQ29sbGVjdGlvbnMjc2h1ZmZsZShqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBMaXN0PEU+IHNodWZmbGUoTGlzdDxFPiBsaXN0KSB7Ci0JCUNvbGxlY3Rpb25zLnNodWZmbGUobGlzdCk7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbGlzdCBhZnRlciBpdCBoYXMgYmVlbiAic2h1ZmZsZWQiLgotCSAqIEBzZWUgamF2YS51dGlsLkNvbGxlY3Rpb25zI3NodWZmbGUoamF2YS51dGlsLkxpc3QsIGphdmEudXRpbC5SYW5kb20pCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gTGlzdDxFPiBzaHVmZmxlKExpc3Q8RT4gbGlzdCwgUmFuZG9tIHJhbmRvbSkgewotCQlDb2xsZWN0aW9ucy5zaHVmZmxlKGxpc3QsIHJhbmRvbSk7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbGlzdCBhZnRlciBpdCBoYXMgYmVlbiAic29ydGVkIi4KLQkgKiBAc2VlIGphdmEudXRpbC5Db2xsZWN0aW9ucyNzb3J0KGphdmEudXRpbC5MaXN0KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEUgZXh0ZW5kcyBDb21wYXJhYmxlPD8gc3VwZXIgRT4+IExpc3Q8RT4gc29ydChMaXN0PEU+IGxpc3QpIHsKLQkJQ29sbGVjdGlvbnMuc29ydChsaXN0KTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBsaXN0IGFmdGVyIGl0IGhhcyBiZWVuICJzb3J0ZWQiLgotCSAqIEBzZWUgamF2YS51dGlsLkNvbGxlY3Rpb25zI3NvcnQoamF2YS51dGlsLkxpc3QsIGphdmEudXRpbC5Db21wYXJhdG9yKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IExpc3Q8RT4gc29ydChMaXN0PEU+IGxpc3QsIENvbXBhcmF0b3I8PyBzdXBlciBFPiBjb21wYXJhdG9yKSB7Ci0JCUNvbGxlY3Rpb25zLnNvcnQobGlzdCwgY29tcGFyYXRvcik7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaXRlcmF0b3IgYWZ0ZXIgaXQgaGFzIGJlZW4gInNvcnRlZCIuCi0JICovCi0JcHVibGljIHN0YXRpYyA8RSBleHRlbmRzIENvbXBhcmFibGU8PyBzdXBlciBFPj4gSXRlcmF0b3I8RT4gc29ydChJdGVyYXRvcjxFPiBpdGVyYXRvcikgewotCQlyZXR1cm4gc29ydChpdGVyYXRvciwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBsaXN0IGFmdGVyIGl0IGhhcyBiZWVuICJzb3J0ZWQiLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEl0ZXJhdG9yPEU+IHNvcnQoSXRlcmF0b3I8RT4gaXRlcmF0b3IsIENvbXBhcmF0b3I8PyBzdXBlciBFPiBjb21wYXJhdG9yKSB7Ci0JCXJldHVybiBzb3J0KGxpc3QoaXRlcmF0b3IpLCBjb21wYXJhdG9yKS5pdGVyYXRvcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbGlzdCBhZnRlciB0aGUgc3BlY2lmaWVkIGVsZW1lbnRzIGhhdmUgYmVlbiAic3dhcHBlZCIuCi0JICogQHNlZSBqYXZhLnV0aWwuQ29sbGVjdGlvbnMjc3dhcChqYXZhLnV0aWwuTGlzdCwgaW50LCBpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gTGlzdDxFPiBzd2FwKExpc3Q8RT4gbGlzdCwgaW50IGksIGludCBqKSB7Ci0JCUNvbGxlY3Rpb25zLnN3YXAobGlzdCwgaSwgaik7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCi0JLy8qKioqKioqKioqIGphdmEudXRpbC5BcnJheXMgZW5oYW5jZW1lbnRzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gImZpbGxlZCIuCi0JICogQHNlZSBqYXZhLnV0aWwuQXJyYXlzI2ZpbGwoYm9vbGVhbltdLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbltdIGZpbGwoYm9vbGVhbltdIGFycmF5LCBib29sZWFuIHZhbHVlKSB7Ci0JCUFycmF5cy5maWxsKGFycmF5LCB2YWx1ZSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJmaWxsZWQiLgotCSAqIEBzZWUgamF2YS51dGlsLkFycmF5cyNmaWxsKGJvb2xlYW5bXSwgaW50LCBpbnQsIGJvb2xlYW4pCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuW10gZmlsbChib29sZWFuW10gYXJyYXksIGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4LCBib29sZWFuIHZhbHVlKSB7Ci0JCUFycmF5cy5maWxsKGFycmF5LCBmcm9tSW5kZXgsIHRvSW5kZXgsIHZhbHVlKTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gImZpbGxlZCIuCi0JICogQHNlZSBqYXZhLnV0aWwuQXJyYXlzI2ZpbGwoYnl0ZVtdLCBieXRlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYnl0ZVtdIGZpbGwoYnl0ZVtdIGFycmF5LCBieXRlIHZhbHVlKSB7Ci0JCUFycmF5cy5maWxsKGFycmF5LCB2YWx1ZSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJmaWxsZWQiLgotCSAqIEBzZWUgamF2YS51dGlsLkFycmF5cyNmaWxsKGJ5dGVbXSwgaW50LCBpbnQsIGJ5dGUpCi0JICovCi0JcHVibGljIHN0YXRpYyBieXRlW10gZmlsbChieXRlW10gYXJyYXksIGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4LCBieXRlIHZhbHVlKSB7Ci0JCUFycmF5cy5maWxsKGFycmF5LCBmcm9tSW5kZXgsIHRvSW5kZXgsIHZhbHVlKTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gImZpbGxlZCIuCi0JICogQHNlZSBqYXZhLnV0aWwuQXJyYXlzI2ZpbGwoY2hhcltdLCBjaGFyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIGZpbGwoY2hhcltdIGFycmF5LCBjaGFyIHZhbHVlKSB7Ci0JCUFycmF5cy5maWxsKGFycmF5LCB2YWx1ZSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJmaWxsZWQiLgotCSAqIEBzZWUgamF2YS51dGlsLkFycmF5cyNmaWxsKGNoYXJbXSwgaW50LCBpbnQsIGNoYXIpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gZmlsbChjaGFyW10gYXJyYXksIGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4LCBjaGFyIHZhbHVlKSB7Ci0JCUFycmF5cy5maWxsKGFycmF5LCBmcm9tSW5kZXgsIHRvSW5kZXgsIHZhbHVlKTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gImZpbGxlZCIuCi0JICogQHNlZSBqYXZhLnV0aWwuQXJyYXlzI2ZpbGwoZG91YmxlW10sIGRvdWJsZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGRvdWJsZVtdIGZpbGwoZG91YmxlW10gYXJyYXksIGRvdWJsZSB2YWx1ZSkgewotCQlBcnJheXMuZmlsbChhcnJheSwgdmFsdWUpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAiZmlsbGVkIi4KLQkgKiBAc2VlIGphdmEudXRpbC5BcnJheXMjZmlsbChkb3VibGVbXSwgaW50LCBpbnQsIGRvdWJsZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGRvdWJsZVtdIGZpbGwoZG91YmxlW10gYXJyYXksIGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4LCBkb3VibGUgdmFsdWUpIHsKLQkJQXJyYXlzLmZpbGwoYXJyYXksIGZyb21JbmRleCwgdG9JbmRleCwgdmFsdWUpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAiZmlsbGVkIi4KLQkgKiBAc2VlIGphdmEudXRpbC5BcnJheXMjZmlsbChmbG9hdFtdLCBmbG9hdCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZsb2F0W10gZmlsbChmbG9hdFtdIGFycmF5LCBmbG9hdCB2YWx1ZSkgewotCQlBcnJheXMuZmlsbChhcnJheSwgdmFsdWUpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAiZmlsbGVkIi4KLQkgKiBAc2VlIGphdmEudXRpbC5BcnJheXMjZmlsbChmbG9hdFtdLCBpbnQsIGludCwgZmxvYXQpCi0JICovCi0JcHVibGljIHN0YXRpYyBmbG9hdFtdIGZpbGwoZmxvYXRbXSBhcnJheSwgaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgsIGZsb2F0IHZhbHVlKSB7Ci0JCUFycmF5cy5maWxsKGFycmF5LCBmcm9tSW5kZXgsIHRvSW5kZXgsIHZhbHVlKTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gImZpbGxlZCIuCi0JICogQHNlZSBqYXZhLnV0aWwuQXJyYXlzI2ZpbGwoaW50W10sIGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludFtdIGZpbGwoaW50W10gYXJyYXksIGludCB2YWx1ZSkgewotCQlBcnJheXMuZmlsbChhcnJheSwgdmFsdWUpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAiZmlsbGVkIi4KLQkgKiBAc2VlIGphdmEudXRpbC5BcnJheXMjZmlsbChpbnRbXSwgaW50LCBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludFtdIGZpbGwoaW50W10gYXJyYXksIGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4LCBpbnQgdmFsdWUpIHsKLQkJQXJyYXlzLmZpbGwoYXJyYXksIGZyb21JbmRleCwgdG9JbmRleCwgdmFsdWUpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAiZmlsbGVkIi4KLQkgKiBAc2VlIGphdmEudXRpbC5BcnJheXMjZmlsbChPYmplY3RbXSwgT2JqZWN0KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBmaWxsKEVbXSBhcnJheSwgRSB2YWx1ZSkgewotCQlBcnJheXMuZmlsbChhcnJheSwgdmFsdWUpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAiZmlsbGVkIi4KLQkgKiBAc2VlIGphdmEudXRpbC5BcnJheXMjZmlsbChPYmplY3RbXSwgaW50LCBpbnQsIE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gZmlsbChFW10gYXJyYXksIGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4LCBFIHZhbHVlKSB7Ci0JCUFycmF5cy5maWxsKGFycmF5LCBmcm9tSW5kZXgsIHRvSW5kZXgsIHZhbHVlKTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gImZpbGxlZCIuCi0JICogQHNlZSBqYXZhLnV0aWwuQXJyYXlzI2ZpbGwobG9uZ1tdLCBsb25nKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgbG9uZ1tdIGZpbGwobG9uZ1tdIGFycmF5LCBsb25nIHZhbHVlKSB7Ci0JCUFycmF5cy5maWxsKGFycmF5LCB2YWx1ZSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJmaWxsZWQiLgotCSAqIEBzZWUgamF2YS51dGlsLkFycmF5cyNmaWxsKGxvbmdbXSwgaW50LCBpbnQsIGxvbmcpCi0JICovCi0JcHVibGljIHN0YXRpYyBsb25nW10gZmlsbChsb25nW10gYXJyYXksIGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4LCBsb25nIHZhbHVlKSB7Ci0JCUFycmF5cy5maWxsKGFycmF5LCBmcm9tSW5kZXgsIHRvSW5kZXgsIHZhbHVlKTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gImZpbGxlZCIuCi0JICogQHNlZSBqYXZhLnV0aWwuQXJyYXlzI2ZpbGwoc2hvcnRbXSwgc2hvcnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBzaG9ydFtdIGZpbGwoc2hvcnRbXSBhcnJheSwgc2hvcnQgdmFsdWUpIHsKLQkJQXJyYXlzLmZpbGwoYXJyYXksIHZhbHVlKTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gImZpbGxlZCIuCi0JICogQHNlZSBqYXZhLnV0aWwuQXJyYXlzI2ZpbGwoc2hvcnRbXSwgaW50LCBpbnQsIHNob3J0KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgc2hvcnRbXSBmaWxsKHNob3J0W10gYXJyYXksIGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4LCBzaG9ydCB2YWx1ZSkgewotCQlBcnJheXMuZmlsbChhcnJheSwgZnJvbUluZGV4LCB0b0luZGV4LCB2YWx1ZSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJzb3J0ZWQiLgotCSAqIEBzZWUgamF2YS51dGlsLkFycmF5cyNzb3J0KGJ5dGVbXSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJ5dGVbXSBzb3J0KGJ5dGUuLi4gYXJyYXkpIHsKLQkJQXJyYXlzLnNvcnQoYXJyYXkpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAic29ydGVkIi4KLQkgKiBAc2VlIGphdmEudXRpbC5BcnJheXMjc29ydChieXRlW10sIGludCwgaW50KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYnl0ZVtdIHNvcnQoYnl0ZVtdIGFycmF5LCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCkgewotCQlBcnJheXMuc29ydChhcnJheSwgZnJvbUluZGV4LCB0b0luZGV4KTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gInNvcnRlZCIuCi0JICogQHNlZSBqYXZhLnV0aWwuQXJyYXlzI3NvcnQoY2hhcltdKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHNvcnQoY2hhci4uLiBhcnJheSkgewotCQlBcnJheXMuc29ydChhcnJheSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJzb3J0ZWQiLgotCSAqIEBzZWUgamF2YS51dGlsLkFycmF5cyNzb3J0KGNoYXJbXSwgaW50LCBpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gc29ydChjaGFyW10gYXJyYXksIGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4KSB7Ci0JCUFycmF5cy5zb3J0KGFycmF5LCBmcm9tSW5kZXgsIHRvSW5kZXgpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAic29ydGVkIi4KLQkgKiBAc2VlIGphdmEudXRpbC5BcnJheXMjc29ydChkb3VibGVbXSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGRvdWJsZVtdIHNvcnQoZG91YmxlLi4uIGFycmF5KSB7Ci0JCUFycmF5cy5zb3J0KGFycmF5KTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gInNvcnRlZCIuCi0JICogQHNlZSBqYXZhLnV0aWwuQXJyYXlzI3NvcnQoZG91YmxlW10sIGludCwgaW50KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZG91YmxlW10gc29ydChkb3VibGVbXSBhcnJheSwgaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgpIHsKLQkJQXJyYXlzLnNvcnQoYXJyYXksIGZyb21JbmRleCwgdG9JbmRleCk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJzb3J0ZWQiLgotCSAqIEBzZWUgamF2YS51dGlsLkFycmF5cyNzb3J0KGZsb2F0W10pCi0JICovCi0JcHVibGljIHN0YXRpYyBmbG9hdFtdIHNvcnQoZmxvYXQuLi4gYXJyYXkpIHsKLQkJQXJyYXlzLnNvcnQoYXJyYXkpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAic29ydGVkIi4KLQkgKiBAc2VlIGphdmEudXRpbC5BcnJheXMjc29ydChmbG9hdFtdLCBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZsb2F0W10gc29ydChmbG9hdFtdIGFycmF5LCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCkgewotCQlBcnJheXMuc29ydChhcnJheSwgZnJvbUluZGV4LCB0b0luZGV4KTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gInNvcnRlZCIuCi0JICogQHNlZSBqYXZhLnV0aWwuQXJyYXlzI3NvcnQoaW50W10pCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnRbXSBzb3J0KGludC4uLiBhcnJheSkgewotCQlBcnJheXMuc29ydChhcnJheSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJzb3J0ZWQiLgotCSAqIEBzZWUgamF2YS51dGlsLkFycmF5cyNzb3J0KGludFtdLCBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludFtdIHNvcnQoaW50W10gYXJyYXksIGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4KSB7Ci0JCUFycmF5cy5zb3J0KGFycmF5LCBmcm9tSW5kZXgsIHRvSW5kZXgpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAic29ydGVkIi4KLQkgKiBAc2VlIGphdmEudXRpbC5BcnJheXMjc29ydChPYmplY3RbXSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gc29ydChFLi4uIGFycmF5KSB7Ci0JCUFycmF5cy5zb3J0KGFycmF5KTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gInNvcnRlZCIuCi0JICogQHNlZSBqYXZhLnV0aWwuQXJyYXlzI3NvcnQoT2JqZWN0W10sIGphdmEudXRpbC5Db21wYXJhdG9yKQotCSAqLwotICAgIHB1YmxpYyBzdGF0aWMgPEU+IEVbXSBzb3J0KEVbXSBhcnJheSwgQ29tcGFyYXRvcjw/IHN1cGVyIEU+IGNvbXBhcmF0b3IpIHsKLQkJQXJyYXlzLnNvcnQoYXJyYXksIGNvbXBhcmF0b3IpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAic29ydGVkIi4KLQkgKiBAc2VlIGphdmEudXRpbC5BcnJheXMjc29ydChPYmplY3RbXSwgaW50LCBpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHNvcnQoRVtdIGFycmF5LCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCkgewotCQlBcnJheXMuc29ydChhcnJheSwgZnJvbUluZGV4LCB0b0luZGV4KTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gInNvcnRlZCIuCi0JICogQHNlZSBqYXZhLnV0aWwuQXJyYXlzI3NvcnQoT2JqZWN0W10sIGludCwgaW50LCBqYXZhLnV0aWwuQ29tcGFyYXRvcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gc29ydChFW10gYXJyYXksIGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4LCBDb21wYXJhdG9yPD8gc3VwZXIgRT4gY29tcGFyYXRvcikgewotCQlBcnJheXMuc29ydChhcnJheSwgZnJvbUluZGV4LCB0b0luZGV4LCBjb21wYXJhdG9yKTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gInNvcnRlZCIuCi0JICogQHNlZSBqYXZhLnV0aWwuQXJyYXlzI3NvcnQobG9uZ1tdKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgbG9uZ1tdIHNvcnQobG9uZy4uLiBhcnJheSkgewotCQlBcnJheXMuc29ydChhcnJheSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJzb3J0ZWQiLgotCSAqIEBzZWUgamF2YS51dGlsLkFycmF5cyNzb3J0KGxvbmdbXSwgaW50LCBpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBsb25nW10gc29ydChsb25nW10gYXJyYXksIGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4KSB7Ci0JCUFycmF5cy5zb3J0KGFycmF5LCBmcm9tSW5kZXgsIHRvSW5kZXgpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAic29ydGVkIi4KLQkgKiBAc2VlIGphdmEudXRpbC5BcnJheXMjc29ydChzaG9ydFtdKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgc2hvcnRbXSBzb3J0KHNob3J0Li4uIGFycmF5KSB7Ci0JCUFycmF5cy5zb3J0KGFycmF5KTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gInNvcnRlZCIuCi0JICogQHNlZSBqYXZhLnV0aWwuQXJyYXlzI3NvcnQoc2hvcnRbXSwgaW50LCBpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBzaG9ydFtdIHNvcnQoc2hvcnRbXSBhcnJheSwgaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgpIHsKLQkJQXJyYXlzLnNvcnQoYXJyYXksIGZyb21JbmRleCwgdG9JbmRleCk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQotCS8vKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdXBwcmVzcyBkZWZhdWx0IGNvbnN0cnVjdG9yLCBlbnN1cmluZyBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgQ29sbGVjdGlvblRvb2xzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9GaWxlVG9vbHMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9GaWxlVG9vbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzljM2VmZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvRmlsZVRvb2xzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlRmlsdGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5Db21wb3NpdGVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRmlsdGVyaW5nSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7Ci0KLS8qKgotICogQXNzb3J0ZWQgZmlsZSB0b29sczoKLSAqIC0gZGVsZXRlIGVudGlyZSB0cmVlcyBvZiBkaXJlY3RvcmllcyBhbmQgZmlsZXMKLSAqIC0gYnVpbGQgaXRlcmF0b3JzIG9uIGVudGlyZSB0cmVlcyBvZiBkaXJlY3RvcmllcyBhbmQgZmlsZXMKLSAqIC0gYnVpbGQgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5Ci0gKiAtICJjYW5vbml6ZSIgZmlsZXMKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEZpbGVUb29scyB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX0hPTUVfRElSRUNUT1JZX05BTUUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuaG9tZSIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJfVEVNUE9SQVJZX0RJUkVDVE9SWV9OQU1FID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmlvLnRtcGRpciIpOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERFRkFVTFRfVEVNUE9SQVJZX0RJUkVDVE9SWV9OQU1FID0gInRtcGRpciI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VSUkVOVF9XT1JLSU5HX0RJUkVDVE9SWV9OQU1FID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpOwotCi0gICAgLyoqIEEgbGlzdCBvZiBzb21lIGludmFsaWQgZmlsZSBuYW1lIGNoYXJhY3RlcnMuCi0JCQkJOiBpcyB0aGUgZmlsZW5hbWUgc2VwYXJhdG9yIGluIE1hY09TIGFuZCB0aGUgZHJpdmUgaW5kaWNhdG9yIGluIERPUwotCQkJCSogaXMgYSBET1Mgd2lsZGNhcmQgY2hhcmFjdGVyCi0JCQkJfCBpcyBhIERPUyByZWRpcmVjdGlvbiBjaGFyYWN0ZXIKLQkJCQkmIGlzIG91ciBvd24gZXNjYXBlIGNoYXJhY3RlcgotCQkJCS8gaXMgdGhlIGZpbGVuYW1lIHNlcGFyYXRvciBpbiBVbml4IGFuZCB0aGUgY29tbWFuZCBvcHRpb24gdGFnIGluIERPUwotCQkJCVwgaXMgdGhlIGZpbGVuYW1lIHNlcGFyYXRvciBpbiBET1MvV2luZG93cyBhbmQgdGhlIGVzY2FwZSBjaGFyYWN0ZXIgaW4gVW5peAotCQkJCTsgaXMgPz8/Ci0JCQkJPyBpcyBhIERPUyB3aWxkY2FyZCBjaGFyYWN0ZXIKLQkJCQlbIGlzID8/PwotCQkJCV0gaXMgPz8/Ci0JCQkJPSBpcyA/Pz8KLQkJCQkrIGlzID8/PwotCQkJCTwgaXMgYSBET1MgcmVkaXJlY3Rpb24gY2hhcmFjdGVyCi0JCQkJPiBpcyBhIERPUyByZWRpcmVjdGlvbiBjaGFyYWN0ZXIKLQkJCQkiIGlzIHVzZWQgYnkgRE9TIHRvIGRlbGltaXQgZmlsZSBuYW1lcyB3aXRoIHNwYWNlcwotCQkJCSwgaXMgPz8/Ci0gICAgICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gSU5WQUxJRF9GSUxFTkFNRV9DSEFSQUNURVJTID0geyAnOicsICcqJywgJ3wnLCAnJicsICcvJywgJ1xcJywgJzsnLCAnPycsICdbJywgJ10nLCAnPScsICcrJywgJzwnLCAnPicsICciJywgJywnIH07Ci0KLQkvKiogVGhpcyBlbmNvZGVyIHdpbGwgY29udmVydCBzdHJpbmdzIGludG8gdmFsaWQgZmlsZSBuYW1lcy4gKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFhNTFN0cmluZ0VuY29kZXIgRklMRV9OQU1FX0VOQ09ERVIgPSBuZXcgWE1MU3RyaW5nRW5jb2RlcihJTlZBTElEX0ZJTEVOQU1FX0NIQVJBQ1RFUlMpOwotCi0JLyoqIFdpbmRvd3MgZmlsZXMgdGhhdCBhcmUgcmVkaXJlY3RlZCB0byBkZXZpY2VzIGV0Yy4gKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBXSU5ET1dTX1JFU0VSVkVEX0ZJTEVfTkFNRVMgPSB7Ci0JCSJjb24iLAotCQkiYXV4IiwKLQkJImNvbTEiLCAiY29tMiIsICJjb20zIiwgImNvbTQiLCAiY29tNSIsICJjb202IiwgImNvbTciLCAiY29tOCIsICJjb205IiwKLQkJImxwdDEiLCAibHB0MiIsICJscHQzIiwgImxwdDQiLCAibHB0NSIsICJscHQ2IiwgImxwdDciLCAibHB0OCIsICJscHQ5IiwKLQkJInBybiIsCi0JCSJudWwiCi0JfTsKLQotCS8qKiBUaGUgZGVmYXVsdCBsZW5ndGggb2YgYSBzaG9ydGVuZWQgZmlsZSBuYW1lLiAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWElNVU1fU0hPUlRFTkVEX0ZJTEVfTkFNRV9MRU5HVEggPSA2MDsKLQotCi0JLy8gKioqKioqKioqKiBkZWxldGluZyBkaXJlY3RvcmllcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBEZWxldGUgdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkgYW5kIGFsbCBvZiBpdHMgY29udGVudHMuCi0JICogPGVtPlVTRSBXSVRIIENBUkUuPC9lbT4KLQkgKiBGaWxlI2RlbGV0ZUFsbCgpPwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGVEaXJlY3RvcnkoU3RyaW5nIGRpcmVjdG9yeU5hbWUpIHsKLQkJZGVsZXRlRGlyZWN0b3J5KG5ldyBGaWxlKGRpcmVjdG9yeU5hbWUpKTsKLQl9Ci0JCi0JLyoqCi0JICogRGVsZXRlIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5IGFuZCBhbGwgb2YgaXRzIGNvbnRlbnRzLgotCSAqIDxlbT5VU0UgV0lUSCBDQVJFLjwvZW0+Ci0JICogRmlsZSNkZWxldGVBbGwoKT8KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRlRGlyZWN0b3J5KEZpbGUgZGlyZWN0b3J5KSB7Ci0JCWRlbGV0ZURpcmVjdG9yeUNvbnRlbnRzKGRpcmVjdG9yeSk7Ci0JCWlmICggISBkaXJlY3RvcnkuZGVsZXRlKCkpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJ1bmFibGUgdG8gZGVsZXRlIGRpcmVjdG9yeTogIiArIGRpcmVjdG9yeS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogRGVsZXRlIHRoZSBjb250ZW50cyBvZiB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeQotCSAqIChidXQgbm90IHRoZSBkaXJlY3RvcnkgaXRzZWxmKS4KLQkgKiA8ZW0+VVNFIFdJVEggQ0FSRS48L2VtPgotCSAqIEZpbGUjZGVsZXRlRmlsZXMoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGVEaXJlY3RvcnlDb250ZW50cyhTdHJpbmcgZGlyZWN0b3J5TmFtZSkgewotCQlkZWxldGVEaXJlY3RvcnlDb250ZW50cyhuZXcgRmlsZShkaXJlY3RvcnlOYW1lKSk7Ci0JfQotCQotCS8qKgotCSAqIERlbGV0ZSB0aGUgY29udGVudHMgb2YgdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkKLQkgKiAoYnV0IG5vdCB0aGUgZGlyZWN0b3J5IGl0c2VsZikuCi0JICogPGVtPlVTRSBXSVRIIENBUkUuPC9lbT4KLQkgKiBGaWxlI2RlbGV0ZUZpbGVzKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRlRGlyZWN0b3J5Q29udGVudHMoRmlsZSBkaXJlY3RvcnkpIHsKLQkJZm9yIChGaWxlIGZpbGUgOiBkaXJlY3RvcnkubGlzdEZpbGVzKCkpIHsKLQkJCWlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQlkZWxldGVEaXJlY3RvcnkoZmlsZSk7CS8vIHJlY3Vyc2UgdGhyb3VnaCBzdWJkaXJlY3RvcmllcwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoICEgZmlsZS5kZWxldGUoKSkgewotCQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigidW5hYmxlIHRvIGRlbGV0ZSBmaWxlOiAiICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiBjb3B5aW5nIGZpbGVzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvcGllcyB0aGUgY29udGVudCBvZiB0aGUgc291cmNlIGZpbGUgdG8gdGhlIGRlc3RpbmF0aW9uIGZpbGUuCi0JICogRmlsZSNjb3B5KEZpbGUgZGVzdGluYXRpb25GaWxlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb3B5VG9GaWxlKEZpbGUgc291cmNlRmlsZSwgRmlsZSBkZXN0aW5hdGlvbkZpbGUpCi0JCXRocm93cyBJT0V4Y2VwdGlvbgotCXsKLQkJRmlsZUNoYW5uZWwgc291cmNlQ2hhbm5lbCA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oc291cmNlRmlsZSkuZ2V0Q2hhbm5lbCgpOwotCQlGaWxlQ2hhbm5lbCBkZXN0aW5hdGlvbkNoYW5uZWwgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShkZXN0aW5hdGlvbkZpbGUpLmdldENoYW5uZWwoKTsKLQkJdHJ5IHsKLQkJCWRlc3RpbmF0aW9uQ2hhbm5lbC50cmFuc2ZlckZyb20oc291cmNlQ2hhbm5lbCwgMCwgc291cmNlQ2hhbm5lbC5zaXplKCkpOwotCQl9IGZpbmFsbHkgewotCQkJc291cmNlQ2hhbm5lbC5jbG9zZSgpOwotCQkJZGVzdGluYXRpb25DaGFubmVsLmNsb3NlKCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ29waWVzIHRoZSBjb250ZW50IG9mIHRoZSBzb3VyY2UgZmlsZSB0byBhIGZpbGUgYnkKLQkgKiB0aGUgc2FtZSBuYW1lIGluIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkuCi0JICogRmlsZSNjb3B5VG9EaXJlY3RvcnkoRmlsZSBkZXN0aW5hdGlvbkRpcmVjdG9yeSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29weVRvRGlyZWN0b3J5KEZpbGUgc291cmNlRmlsZSwgRmlsZSBkZXN0aW5hdGlvbkRpcmVjdG9yeSkKLQkJdGhyb3dzIElPRXhjZXB0aW9uCi0JewotCQlGaWxlIGRlc3RpbmF0aW9uRmlsZSA9IG5ldyBGaWxlKGRlc3RpbmF0aW9uRGlyZWN0b3J5LCBzb3VyY2VGaWxlLmdldE5hbWUoKSk7Ci0JCWRlc3RpbmF0aW9uRmlsZS5jcmVhdGVOZXdGaWxlKCk7Ci0JCWNvcHlUb0ZpbGUoc291cmNlRmlsZSwgZGVzdGluYXRpb25GaWxlKTsKLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqIGl0ZXJhdG9yaW5nIG92ZXIgZmlsZXMgYW5kIGRpcmVjdG9yaWVzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhbiBpdGVyYXRvciBvbiBhbGwgdGhlIGZpbGVzIGluIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5LgotCSAqIFRoZSBpdGVyYXRvciB3aWxsIHNraXAgb3ZlciBzdWJkaXJlY3Rvcmllcy4KLQkgKiBGaWxlI2ZpbGVzKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPEZpbGU+IGZpbGVzSW4oU3RyaW5nIGRpcmVjdG9yeU5hbWUpIHsKLQkJcmV0dXJuIGZpbGVzSW4obmV3IEZpbGUoZGlyZWN0b3J5TmFtZSkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYW4gaXRlcmF0b3Igb24gYWxsIHRoZSBmaWxlcyBpbiB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeS4KLQkgKiBUaGUgaXRlcmF0b3Igd2lsbCBza2lwIG92ZXIgc3ViZGlyZWN0b3JpZXMuCi0JICogRmlsZSNmaWxlcygpCi0JICovCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvcjxGaWxlPiBmaWxlc0luKEZpbGUgZGlyZWN0b3J5KSB7Ci0JCXJldHVybiBmaWxlc0luKGRpcmVjdG9yeS5saXN0RmlsZXMoKSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIEl0ZXJhdG9yPEZpbGU+IGZpbGVzSW4oRmlsZVtdIGZpbGVzKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8RmlsZT4obmV3IEFycmF5SXRlcmF0b3I8RmlsZT4oZmlsZXMpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChPYmplY3QgbmV4dCkgewotCQkJCXJldHVybiAoKEZpbGUpIG5leHQpLmlzRmlsZSgpOwotCQkJfQotCQl9OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYW4gaXRlcmF0b3Igb24gYWxsIHRoZSBzdWJkaXJlY3RvcmllcwotCSAqIGluIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5LgotCSAqIEZpbGUjc3ViRGlyZWN0b3JpZXMoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8RmlsZT4gZGlyZWN0b3JpZXNJbihTdHJpbmcgZGlyZWN0b3J5TmFtZSkgewotCQlyZXR1cm4gZGlyZWN0b3JpZXNJbihuZXcgRmlsZShkaXJlY3RvcnlOYW1lKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhbiBpdGVyYXRvciBvbiBhbGwgdGhlIHN1YmRpcmVjdG9yaWVzCi0JICogaW4gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkuCi0JICogRmlsZSNzdWJEaXJlY3RvcmllcygpCi0JICovCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvcjxGaWxlPiBkaXJlY3Rvcmllc0luKEZpbGUgZGlyZWN0b3J5KSB7Ci0JCXJldHVybiBkaXJlY3Rvcmllc0luKGRpcmVjdG9yeS5saXN0RmlsZXMoKSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIEl0ZXJhdG9yPEZpbGU+IGRpcmVjdG9yaWVzSW4oRmlsZVtdIGZpbGVzKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8RmlsZT4obmV3IEFycmF5SXRlcmF0b3I8RmlsZT4oZmlsZXMpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChPYmplY3QgbmV4dCkgewotCQkJCXJldHVybiAoKEZpbGUpIG5leHQpLmlzRGlyZWN0b3J5KCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhbiBpdGVyYXRvciBvbiBhbGwgdGhlIGZpbGVzIHVuZGVyIHRoZSBzcGVjaWZpZWQKLQkgKiBkaXJlY3RvcnksIHJlY3Vyc2luZyBpbnRvIHN1YmRpcmVjdG9yaWVzLgotCSAqIFRoZSBpdGVyYXRvciB3aWxsIHNraXAgb3ZlciB0aGUgc3ViZGlyZWN0b3JpZXMgdGhlbXNlbHZlcy4KLQkgKiBGaWxlI2ZpbGVzUmVjdXJzZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvcjxGaWxlPiBmaWxlc0luVHJlZShTdHJpbmcgZGlyZWN0b3J5TmFtZSkgewotCQlyZXR1cm4gZmlsZXNJblRyZWUobmV3IEZpbGUoZGlyZWN0b3J5TmFtZSkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYW4gaXRlcmF0b3Igb24gYWxsIHRoZSBmaWxlcyB1bmRlciB0aGUgc3BlY2lmaWVkCi0JICogZGlyZWN0b3J5LCByZWN1cnNpbmcgaW50byBzdWJkaXJlY3Rvcmllcy4KLQkgKiBUaGUgaXRlcmF0b3Igd2lsbCBza2lwIG92ZXIgdGhlIHN1YmRpcmVjdG9yaWVzIHRoZW1zZWx2ZXMuCi0JICogRmlsZSNmaWxlc1JlY3Vyc2UoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8RmlsZT4gZmlsZXNJblRyZWUoRmlsZSBkaXJlY3RvcnkpIHsKLQkJcmV0dXJuIGZpbGVzSW5UcmVlQXNTZXQoZGlyZWN0b3J5KS5pdGVyYXRvcigpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFNldDxGaWxlPiBmaWxlc0luVHJlZUFzU2V0KEZpbGUgZGlyZWN0b3J5KSB7Ci0JCVNldDxGaWxlPiBmaWxlcyA9IG5ldyBIYXNoU2V0PEZpbGU+KDEwMDAwKTsKLQkJYWRkRmlsZXNJblRyZWVUbyhkaXJlY3RvcnksIGZpbGVzKTsKLQkJcmV0dXJuIGZpbGVzOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkRmlsZXNJblRyZWVUbyhGaWxlIGRpcmVjdG9yeSwgQ29sbGVjdGlvbjxGaWxlPiBhbGxGaWxlcykgewotCQlmb3IgKEZpbGUgZmlsZSA6IGRpcmVjdG9yeS5saXN0RmlsZXMoKSkgewotCQkJaWYgKGZpbGUuaXNGaWxlKCkpIHsKLQkJCQlhbGxGaWxlcy5hZGQoZmlsZSk7Ci0JCQl9IGVsc2UgaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJCWFkZEZpbGVzSW5UcmVlVG8oZmlsZSwgYWxsRmlsZXMpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGl0ZXJhdG9yIG9uIGFsbCB0aGUgZGlyZWN0b3JpZXMgdW5kZXIgdGhlIHNwZWNpZmllZAotCSAqIGRpcmVjdG9yeSwgcmVjdXJzaW5nIGludG8gc3ViZGlyZWN0b3JpZXMuCi0JICogRmlsZSNzdWJEaXJlY3Rvcmllc1JlY3Vyc2UoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8RmlsZT4gZGlyZWN0b3JpZXNJblRyZWUoU3RyaW5nIGRpcmVjdG9yeU5hbWUpIHsKLQkJcmV0dXJuIGRpcmVjdG9yaWVzSW5UcmVlKG5ldyBGaWxlKGRpcmVjdG9yeU5hbWUpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGFuIGl0ZXJhdG9yIG9uIGFsbCB0aGUgZGlyZWN0b3JpZXMgdW5kZXIgdGhlIHNwZWNpZmllZAotCSAqIGRpcmVjdG9yeSwgcmVjdXJzaW5nIGludG8gc3ViZGlyZWN0b3JpZXMuCi0JICogRmlsZSNzdWJEaXJlY3Rvcmllc1JlY3Vyc2UoKQotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8RmlsZT4gZGlyZWN0b3JpZXNJblRyZWUoRmlsZSBkaXJlY3RvcnkpIHsKLQkJRmlsZVtdIGZpbGVzID0gZGlyZWN0b3J5Lmxpc3RGaWxlcygpOwotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhdG9yPEZpbGU+KGRpcmVjdG9yaWVzSW4oZmlsZXMpLCBkaXJlY3Rvcmllc0luVHJlZXMoZGlyZWN0b3JpZXNJbihmaWxlcykpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSXRlcmF0b3I8RmlsZT4gZGlyZWN0b3JpZXNJblRyZWVzKEl0ZXJhdG9yPEZpbGU+IGRpcmVjdG9yaWVzKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmF0b3I8RmlsZT4oCi0JCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxGaWxlLCBJdGVyYXRvcjxGaWxlPj4oZGlyZWN0b3JpZXMpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgSXRlcmF0b3I8RmlsZT4gdHJhbnNmb3JtKEZpbGUgbmV4dCkgewotCQkJCQlyZXR1cm4gRmlsZVRvb2xzLmRpcmVjdG9yaWVzSW5UcmVlKG5leHQpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqIHNob3J0IGZpbGUgbmFtZSBtYW5pcHVsYXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogU3RyaXAgdGhlIGV4dGVuc2lvbiBmcm9tIHRoZSBzcGVjaWZpZWQgZmlsZSBuYW1lCi0JICogYW5kIHJldHVybiB0aGUgcmVzdWx0LiBJZiB0aGUgZmlsZSBuYW1lIGhhcyBubwotCSAqIGV4dGVuc2lvbiwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkCi0JICogRmlsZSNiYXNlUGF0aCgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RyaXBFeHRlbnNpb24oU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCWludCBpbmRleCA9IGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJcmV0dXJuIGZpbGVOYW1lOwotCQl9Ci0JCXJldHVybiBmaWxlTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCX0KLQkKLQkvKioKLQkgKiBTdHJpcCB0aGUgZXh0ZW5zaW9uIGZyb20gdGhlIHNwZWNpZmllZCBmaWxlJ3MgbmFtZQotCSAqIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4gSWYgdGhlIGZpbGUncyBuYW1lIGhhcyBubwotCSAqIGV4dGVuc2lvbiwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkCi0JICogRmlsZSNiYXNlUGF0aCgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RyaXBFeHRlbnNpb24oRmlsZSBmaWxlKSB7Ci0JCXJldHVybiBzdHJpcEV4dGVuc2lvbihmaWxlLmdldFBhdGgoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBleHRlbnNpb24sIGluY2x1ZGluZyB0aGUgZG90LCBvZiB0aGUgc3BlY2lmaWVkIGZpbGUgbmFtZS4KLQkgKiBJZiB0aGUgZmlsZSBuYW1lIGhhcyBubyBleHRlbnNpb24sIHJldHVybiBhbiBlbXB0eSBzdHJpbmcuCi0JICogRmlsZSNleHRlbnNpb24oKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4dGVuc2lvbihTdHJpbmcgZmlsZU5hbWUpIHsKLQkJaW50IGluZGV4ID0gZmlsZU5hbWUubGFzdEluZGV4T2YoJy4nKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQlyZXR1cm4gIiI7Ci0JCX0KLQkJcmV0dXJuIGZpbGVOYW1lLnN1YnN0cmluZyhpbmRleCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgZXh0ZW5zaW9uLCBpbmNsdWRpbmcgdGhlIGRvdCwgb2YgdGhlIHNwZWNpZmllZCBmaWxlJ3MgbmFtZS4KLQkgKiBJZiB0aGUgZmlsZSdzIG5hbWUgaGFzIG5vIGV4dGVuc2lvbiwgcmV0dXJuIGFuIGVtcHR5IHN0cmluZy4KLQkgKiBGaWxlI2V4dGVuc2lvbigpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXh0ZW5zaW9uKEZpbGUgZmlsZSkgewotCQlyZXR1cm4gZXh0ZW5zaW9uKGZpbGUuZ2V0UGF0aCgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdGVtcG9yYXJ5IGRpcmVjdG9yaWVzICoqKioqKioqKioKLQotCS8qKgotCSAqIEJ1aWxkIGFuZCByZXR1cm4gYW4gZW1wdHkgdGVtcG9yYXJ5IGRpcmVjdG9yeSB3aXRoIHRoZSBzcGVjaWZpZWQKLQkgKiBuYW1lLiBJZiB0aGUgZGlyZWN0b3J5IGFscmVhZHkgZXhpc3RzLCBpdCB3aWxsIGJlIGNsZWFyZWQgb3V0LgotCSAqIFRoaXMgZGlyZWN0b3J5IHdpbGwgYmUgYSBzdWJkaXJlY3Rvcnkgb2YgdGhlIEphdmEgdGVtcG9yYXJ5IGRpcmVjdG9yeSwKLQkgKiBhcyBpbmRpY2F0ZWQgYnkgdGhlIFN5c3RlbSBwcm9wZXJ0eSAiamF2YS5pby50bXBkaXIiLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSBlbXB0eVRlbXBvcmFyeURpcmVjdG9yeShTdHJpbmcgbmFtZSkgewotCQlGaWxlIGRpciA9IG5ldyBGaWxlKHVzZXJUZW1wb3JhcnlEaXJlY3RvcnkoKSwgbmFtZSk7Ci0JCWlmIChkaXIuZXhpc3RzKCkpIHsKLQkJCWRlbGV0ZURpcmVjdG9yeUNvbnRlbnRzKGRpcik7Ci0JCX0gZWxzZSB7Ci0JCQlkaXIubWtkaXJzKCk7Ci0JCX0KLQkJcmV0dXJuIGRpcjsKLQl9Ci0JCi0JLyoqCi0JICogQnVpbGQgYW5kIHJldHVybiBhbiBlbXB0eSB0ZW1wb3JhcnkgZGlyZWN0b3J5IHdpdGggYQotCSAqIG5hbWUgb2YgInRtcGRpciIuIElmIHRoZSBkaXJlY3RvcnkgYWxyZWFkeSBleGlzdHMsIGl0IHdpbGwgYmUgY2xlYXJlZCBvdXQuCi0JICogVGhpcyBkaXJlY3Rvcnkgd2lsbCBiZSBhIHN1YmRpcmVjdG9yeSBvZiB0aGUgSmF2YSB0ZW1wb3JhcnkgZGlyZWN0b3J5LAotCSAqIGFzIGluZGljYXRlZCBieSB0aGUgU3lzdGVtIHByb3BlcnR5ICJqYXZhLmlvLnRtcGRpciIuCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIGVtcHR5VGVtcG9yYXJ5RGlyZWN0b3J5KCkgewotCQlyZXR1cm4gZW1wdHlUZW1wb3JhcnlEaXJlY3RvcnkoREVGQVVMVF9URU1QT1JBUllfRElSRUNUT1JZX05BTUUpOwotCX0KLQkKLQkvKioKLQkgKiBCdWlsZCBhbmQgcmV0dXJuIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSB3aXRoIHRoZSBzcGVjaWZpZWQKLQkgKiBuYW1lLiBJZiB0aGUgZGlyZWN0b3J5IGFscmVhZHkgZXhpc3RzLCBpdCB3aWxsIGJlIGxlZnQgdW5jaGFuZ2VkOwotCSAqIGlmIGl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3QsIGl0IHdpbGwgYmUgY3JlYXRlZC4KLQkgKiBUaGlzIGRpcmVjdG9yeSB3aWxsIGJlIGEgc3ViZGlyZWN0b3J5IG9mIHRoZSBKYXZhIHRlbXBvcmFyeSBkaXJlY3RvcnksCi0JICogYXMgaW5kaWNhdGVkIGJ5IHRoZSBTeXN0ZW0gcHJvcGVydHkgImphdmEuaW8udG1wZGlyIi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgdGVtcG9yYXJ5RGlyZWN0b3J5KFN0cmluZyBuYW1lKSB7Ci0JCUZpbGUgZGlyID0gbmV3IEZpbGUodXNlclRlbXBvcmFyeURpcmVjdG9yeSgpLCBuYW1lKTsKLQkJaWYgKCAhIGRpci5leGlzdHMoKSkgewotCQkJZGlyLm1rZGlycygpOwotCQl9Ci0JCXJldHVybiBkaXI7Ci0JfQotCQotCS8qKgotCSAqIEJ1aWxkIGFuZCByZXR1cm4gYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IHdpdGggYSBuYW1lIG9mCi0JICogInRtcGRpciIuIElmIHRoZSBkaXJlY3RvcnkgYWxyZWFkeSBleGlzdHMsIGl0IHdpbGwgYmUgbGVmdCB1bmNoYW5nZWQ7Ci0JICogaWYgaXQgZG9lcyBub3QgYWxyZWFkeSBleGlzdCwgaXQgd2lsbCBiZSBjcmVhdGVkLgotCSAqIFRoaXMgZGlyZWN0b3J5IHdpbGwgYmUgYSBzdWJkaXJlY3Rvcnkgb2YgdGhlIEphdmEgdGVtcG9yYXJ5IGRpcmVjdG9yeSwKLQkgKiBhcyBpbmRpY2F0ZWQgYnkgdGhlIFN5c3RlbSBwcm9wZXJ0eSAiamF2YS5pby50bXBkaXIiLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSB0ZW1wb3JhcnlEaXJlY3RvcnkoKSB7Ci0JCXJldHVybiB0ZW1wb3JhcnlEaXJlY3RvcnkoREVGQVVMVF9URU1QT1JBUllfRElSRUNUT1JZX05BTUUpOwotCX0KLQkKLQkvKioKLQkgKiBCdWlsZCBhbmQgcmV0dXJuIGEgKm5ldyogdGVtcG9yYXJ5IGRpcmVjdG9yeSB3aXRoIHRoZSBzcGVjaWZpZWQKLQkgKiBwcmVmaXguIFRoZSBwcmVmaXggd2lsbCBiZSBhcHBlbmRlZCB3aXRoIGEgbnVtYmVyIHRoYXQKLQkgKiBpcyBpbmNyZW1lbnRlZCwgc3RhcnRpbmcgd2l0aCAxLCB1bnRpbCBhIG5vbi1wcmUtZXhpc3RpbmcgZGlyZWN0b3J5Ci0JICogaXMgZm91bmQgYW5kIHN1Y2Nlc3NmdWxseSBjcmVhdGVkLiBUaGlzIGRpcmVjdG9yeSB3aWxsIGJlIGEKLQkgKiBzdWJkaXJlY3Rvcnkgb2YgdGhlIEphdmEgdGVtcG9yYXJ5IGRpcmVjdG9yeSwgYXMgaW5kaWNhdGVkIGJ5Ci0JICogdGhlIFN5c3RlbSBwcm9wZXJ0eSAiamF2YS5pby50bXBkaXIiLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSBuZXdUZW1wb3JhcnlEaXJlY3RvcnkoU3RyaW5nIHByZWZpeCkgewotCQlpZiAoICEgcHJlZml4LmVuZHNXaXRoKCIuIikpIHsKLQkJCXByZWZpeCA9IHByZWZpeCArICIuIjsKLQkJfQotCQlGaWxlIGRpcjsKLQkJaW50IGkgPSAwOwotCQlkbyB7Ci0JCQlpKys7Ci0JCQlkaXIgPSBuZXcgRmlsZSh1c2VyVGVtcG9yYXJ5RGlyZWN0b3J5KCksIHByZWZpeCArIGkpOwotCQl9IHdoaWxlICggISBkaXIubWtkaXJzKCkpOwotCQlyZXR1cm4gZGlyOwotCX0KLQkKLQkvKioKLQkgKiBCdWlsZCBhbmQgcmV0dXJuIGEgKm5ldyogdGVtcG9yYXJ5IGRpcmVjdG9yeSB3aXRoIGEKLQkgKiBwcmVmaXggb2YgInRtcGRpciIuIFRoaXMgcHJlZml4IHdpbGwgYmUgYXBwZW5kZWQgd2l0aCBhIG51bWJlciB0aGF0Ci0JICogaXMgaW5jcmVtZW50ZWQsIHN0YXJ0aW5nIHdpdGggMSwgdW50aWwgYSBub24tcHJlLWV4aXN0aW5nIGRpcmVjdG9yeQotCSAqIGlzIGZvdW5kIGFuZCBzdWNjZXNzZnVsbHkgY3JlYXRlZC4gVGhpcyBkaXJlY3Rvcnkgd2lsbCBiZSBhCi0JICogc3ViZGlyZWN0b3J5IG9mIHRoZSBKYXZhIHRlbXBvcmFyeSBkaXJlY3RvcnksIGFzIGluZGljYXRlZCBieQotCSAqIHRoZSBTeXN0ZW0gcHJvcGVydHkgImphdmEuaW8udG1wZGlyIi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgbmV3VGVtcG9yYXJ5RGlyZWN0b3J5KCkgewotCQlyZXR1cm4gbmV3VGVtcG9yYXJ5RGlyZWN0b3J5KERFRkFVTFRfVEVNUE9SQVJZX0RJUkVDVE9SWV9OQU1FKTsKLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqIHJlc291cmNlIGZpbGVzICoqKioqKioqKioKLQotCS8qKgotCSAqIEJ1aWxkIGFuZCByZXR1cm4gYSBmaWxlIGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlLgotCSAqIFRoZSByZXNvdXJjZSBuYW1lIG11c3QgYmUgZnVsbHktcXVhbGlmaWVkLCBpLmUuIGl0IGNhbm5vdCBiZSByZWxhdGl2ZQotCSAqIHRvIHRoZSBwYWNrYWdlIG5hbWUvZGlyZWN0b3J5LgotCSAqIE5COiBUaGVyZSBpcyBhIGJ1ZyBpbiBqZGsxLjQueCB0aGUgcHJldmVudHMgdXMgZnJvbSBnZXR0aW5nCi0JICogYSByZXNvdXJjZSB0aGF0IGhhcyBzcGFjZXMgKG9yIG90aGVyIHNwZWNpYWwgY2hhcmFjdGVycykgaW4KLQkgKiBpdHMgbmFtZS4uLi4gKHNlZSBTdW4ncyBKYXZhIGJ1ZyA0NDY2NDg1KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSByZXNvdXJjZUZpbGUoU3RyaW5nIHJlc291cmNlTmFtZSkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7Ci0JCWlmICggISByZXNvdXJjZU5hbWUuc3RhcnRzV2l0aCgiLyIpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHJlc291cmNlTmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlRmlsZShyZXNvdXJjZU5hbWUsIEZpbGVUb29scy5jbGFzcyk7Ci0JfQotCQotCS8qKgotCSAqIEJ1aWxkIGFuZCByZXR1cm4gYSBmaWxlIGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlLgotCSAqIE5COiBUaGVyZSBpcyBhIGJ1ZyBpbiBqZGsxLjQueCB0aGUgcHJldmVudHMgdXMgZnJvbSBnZXR0aW5nCi0JICogYSByZXNvdXJjZSB0aGF0IGhhcyBzcGFjZXMgKG9yIG90aGVyIHNwZWNpYWwgY2hhcmFjdGVycykgaW4KLQkgKiBpdHMgbmFtZS4uLi4gKHNlZSBTdW4ncyBKYXZhIGJ1ZyA0NDY2NDg1KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSByZXNvdXJjZUZpbGUoU3RyaW5nIHJlc291cmNlTmFtZSwgQ2xhc3M8Pz4gamF2YUNsYXNzKSB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uIHsKLQkJVVJMIHVybCA9IGphdmFDbGFzcy5nZXRSZXNvdXJjZShyZXNvdXJjZU5hbWUpOwotCQlyZXR1cm4gYnVpbGRGaWxlKHVybCk7Ci0JfQotCQotCS8qKgotCSAqIEJ1aWxkIGFuZCByZXR1cm4gYSBmaWxlIGZvciB0aGUgc3BlY2lmaWVkIFVSTC4KLQkgKiBOQjogVGhlcmUgaXMgYSBidWcgaW4gamRrMS40LnggdGhlIHByZXZlbnRzIHVzIGZyb20gZ2V0dGluZwotCSAqIGEgcmVzb3VyY2UgdGhhdCBoYXMgc3BhY2VzIChvciBvdGhlciBzcGVjaWFsIGNoYXJhY3RlcnMpIGluCi0JICogaXRzIG5hbWUuLi4uIChzZWUgU3VuJ3MgSmF2YSBidWcgNDQ2NjQ4NSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgYnVpbGRGaWxlKFVSTCB1cmwpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24gewotCQlyZXR1cm4gYnVpbGRGaWxlKHVybC5nZXRGaWxlKCkpOwotCX0KLQkKLQkvKioKLQkgKiBCdWlsZCBhbmQgcmV0dXJuIGEgZmlsZSBmb3IgdGhlIHNwZWNpZmllZCBmaWxlIG5hbWUuCi0JICogTkI6IFRoZXJlIGlzIGEgYnVnIGluIGpkazEuNC54IHRoZSBwcmV2ZW50cyB1cyBmcm9tIGdldHRpbmcKLQkgKiBhIHJlc291cmNlIHRoYXQgaGFzIHNwYWNlcyAob3Igb3RoZXIgc3BlY2lhbCBjaGFyYWN0ZXJzKSBpbgotCSAqIGl0cyBuYW1lLi4uLiAoc2VlIFN1bidzIEphdmEgYnVnIDQ0NjY0ODUpCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIGJ1aWxkRmlsZShTdHJpbmcgZmlsZU5hbWUpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24gewotCQlVUkkgdXJpID0gbmV3IFVSSShmaWxlTmFtZSk7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHVyaS5nZXRQYXRoKCkpOwotCQlyZXR1cm4gZmlsZTsKLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqICJjYW5vbmljYWwiIGZpbGVzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCBmaWxlIGludG8gYSAiY2Fub25pY2FsIiBmaWxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSBjYW5vbmljYWxGaWxlKEZpbGUgZmlsZSkgewotCQl0cnkgewotCQkJcmV0dXJuIGZpbGUuZ2V0Q2Fub25pY2FsRmlsZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2V4Y2VwdGlvbikgewotCQkJLy8gc2V0dGxlIGZvciB0aGUgYWJzb2x1dGUgZmlsZQotCQkJcmV0dXJuIGZpbGUuZ2V0QWJzb2x1dGVGaWxlKCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQnVpbGQgYW4gaXRlcmF0b3IgdGhhdCB3aWxsIGNvbnZlcnQgdGhlIHNwZWNpZmllZCBmaWxlcwotCSAqIGludG8gImNhbm9uaWNhbCIgZmlsZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvcjxGaWxlPiBjYW5vbmljYWxGaWxlcyhJdGVyYXRvcjxGaWxlPiBmaWxlcykgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8RmlsZSwgRmlsZT4oZmlsZXMpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEZpbGUgdHJhbnNmb3JtKEZpbGUgbmV4dCkgewotCQkJCXJldHVybiBjYW5vbmljYWxGaWxlKG5leHQpOwotCQkJfQotCQl9OwotCX0KLQkKLQkvKioKLQkgKiBCdWlsZCBhbiBpdGVyYXRvciB0aGF0IHdpbGwgY29udmVydCB0aGUgc3BlY2lmaWVkIGZpbGVzCi0JICogaW50byAiY2Fub25pY2FsIiBmaWxlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPEZpbGU+IGNhbm9uaWNhbEZpbGVzKENvbGxlY3Rpb248RmlsZT4gZmlsZXMpIHsKLQkJcmV0dXJuIGNhbm9uaWNhbEZpbGVzKGZpbGVzLml0ZXJhdG9yKCkpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgZmlsZSBuYW1lIGludG8gYSAiY2Fub25pY2FsIiBmaWxlIG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2Fub25pY2FsRmlsZU5hbWUoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCXJldHVybiBjYW5vbmljYWxGaWxlKG5ldyBGaWxlKGZpbGVOYW1lKSkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JfQotCQotCS8qKgotCSAqIEJ1aWxkIGFuIGl0ZXJhdG9yIHRoYXQgd2lsbCBjb252ZXJ0IHRoZSBzcGVjaWZpZWQgZmlsZSBuYW1lcwotCSAqIGludG8gImNhbm9uaWNhbCIgZmlsZSBuYW1lcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPFN0cmluZz4gY2Fub25pY2FsRmlsZU5hbWVzKEl0ZXJhdG9yPFN0cmluZz4gZmlsZU5hbWVzKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxTdHJpbmcsIFN0cmluZz4oZmlsZU5hbWVzKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKFN0cmluZyBuZXh0KSB7Ci0JCQkJcmV0dXJuIGNhbm9uaWNhbEZpbGVOYW1lKG5leHQpOwotCQkJfQotCQl9OwotCX0KLQkKLQkvKioKLQkgKiBCdWlsZCBhbiBpdGVyYXRvciB0aGF0IHdpbGwgY29udmVydCB0aGUgc3BlY2lmaWVkIGZpbGUgbmFtZXMKLQkgKiBpbnRvICJjYW5vbmljYWwiIGZpbGUgbmFtZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvcjxTdHJpbmc+IGNhbm9uaWNhbEZpbGVOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gZmlsZU5hbWVzKSB7Ci0JCXJldHVybiBjYW5vbmljYWxGaWxlTmFtZXMoZmlsZU5hbWVzLml0ZXJhdG9yKCkpOwotCX0KLQkKLQotCS8vICoqKioqKioqKiogZmlsZSBuYW1lIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBmaWxlIG5hbWUgaXMgaW52YWxpZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZmlsZU5hbWVJc0ludmFsaWQoU3RyaW5nIGZpbGVuYW1lKSB7Ci0JCXJldHVybiAhIGZpbGVOYW1lSXNWYWxpZChmaWxlbmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBmaWxlIG5hbWUgaXMgdmFsaWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGZpbGVOYW1lSXNWYWxpZChTdHJpbmcgZmlsZW5hbWUpIHsKLQkJaW50IGxlbiA9IGZpbGVuYW1lLmxlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQljaGFyIGZpbGVuYW1lQ2hhciA9IGZpbGVuYW1lLmNoYXJBdChpKTsKLQkJCWlmIChDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoSU5WQUxJRF9GSUxFTkFNRV9DSEFSQUNURVJTLCBmaWxlbmFtZUNoYXIpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIGlsbGVnYWwgY2hhcmFjdGVycyBpbiB0aGUgc3BlY2lmaWVkIGZpbGUgbmFtZSB0bwotCSAqIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9WYWxpZEZpbGVOYW1lKFN0cmluZyBmaWxlbmFtZSwgY2hhciByZXBsYWNlbWVudENoYXIpIHsKLQkJaW50IGxlbiA9IGZpbGVuYW1lLmxlbmd0aCgpOwotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKGxlbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCWNoYXIgZmlsZW5hbWVDaGFyID0gZmlsZW5hbWUuY2hhckF0KGkpOwotCQkJaWYgKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhJTlZBTElEX0ZJTEVOQU1FX0NIQVJBQ1RFUlMsIGZpbGVuYW1lQ2hhcikpIHsKLQkJCQlzYi5hcHBlbmQocmVwbGFjZW1lbnRDaGFyKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2IuYXBwZW5kKGZpbGVuYW1lQ2hhcik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgaWxsZWdhbCBjaGFyYWN0ZXJzIGluIHRoZSBzcGVjaWZpZWQgZmlsZSBuYW1lIHRvCi0JICogcGVyaW9kcyAoJy4nKSBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvVmFsaWRGaWxlTmFtZShTdHJpbmcgZmlsZW5hbWUpIHsKLQkJcmV0dXJuIGNvbnZlcnRUb1ZhbGlkRmlsZU5hbWUoZmlsZW5hbWUsICcuJyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBmaWxlIG5hbWUgaXMgInJlc2VydmVkIgotCSAqIChpLmUuIGl0IGNhbm5vdCBiZSB1c2VkIGZvciAidXNlciIgZmlsZXMpLiBXaW5kb3dzIHJlc2VydmVzCi0JICogYSBudW1iZXIgb2YgZmlsZSBuYW1lcyAoZS5nLiBDT04sIEFVWCwgUFJOKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZmlsZU5hbWVJc1Jlc2VydmVkKFN0cmluZyBmaWxlTmFtZSkgewotCQlpZiAoZXhlY3V0aW5nT25XaW5kb3dzKCkpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoV0lORE9XU19SRVNFUlZFRF9GSUxFX05BTUVTLCBmaWxlTmFtZS50b0xvd2VyQ2FzZSgpKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7CS8vIFVuaXggZG9lcyBub3QgaGF2ZSBhbnkgInJlc2VydmVkIiBmaWxlIG5hbWVzIChJIHRoaW5rLi4uKQotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgZmlsZSBjb250YWlucyBhbnkgInJlc2VydmVkIgotCSAqIGNvbXBvbmVudHMuCi0JICogV2luZG93cyByZXNlcnZlcyBhIG51bWJlciBvZiBmaWxlIG5hbWVzIChlLmcuIENPTiwgQVVYLCBQUk4pOwotCSAqIGFuZCB0aGVzZSBmaWxlIG5hbWVzIGNhbm5vdCBiZSB1c2VkIGZvciBlaXRoZXIgdGhlIG5hbWVzIG9mCi0JICogZmlsZXMgb3IgZGlyZWN0b3JpZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGZpbGVIYXNBbnlSZXNlcnZlZENvbXBvbmVudHMoRmlsZSBmaWxlKSB7Ci0JCUZpbGUgdGVtcCA9IGZpbGU7Ci0JCXdoaWxlICh0ZW1wICE9IG51bGwpIHsKLQkJCWlmIChmaWxlTmFtZUlzUmVzZXJ2ZWQodGVtcC5nZXROYW1lKCkpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQl0ZW1wID0gdGVtcC5nZXRQYXJlbnRGaWxlKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzaG9ydGVuZWQgZmlsZSBuYW1lcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBzaG9ydGVyIHZlcnNpb24gb2YgdGhlIGFic29sdXRlIGZpbGUgbmFtZSBmb3IgdGhlIHNwZWNpZmllZCBmaWxlLgotCSAqIFRoZSBzaG9ydGVyIHZlcnNpb24gd2lsbCBub3QgYmUgbG9uZ2VyIHRoYW4gdGhlIG1heGltdW0gbGVuZ3RoLgotCSAqIFRoZSBmaXJzdCBkaXJlY3RvcnkgKHVzdWFsbHkgdGhlIGRyaXZlIGxldHRlcikgYW5kIHRoZSBmaWxlIG5hbWUgb3IgdGhlCi0JICogbGFzdCBkaXJlY3Rvcnkgd2lsbCBhbHdheXMgYmUgYWRkZWQgdG8gdGhlIGdlbmVyYXRlZCBzdHJpbmcgcmVnYXJkbGVzcyBvZgotCSAqIHRoZSBtYXhpbXVtIGxlbmd0aCBhbGxvd2VkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNob3J0ZW5GaWxlTmFtZShVUkwgdXJsKSB7Ci0JCXJldHVybiBzaG9ydGVuRmlsZU5hbWUodXJsLCBNQVhJTVVNX1NIT1JURU5FRF9GSUxFX05BTUVfTEVOR1RIKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzaG9ydGVyIHZlcnNpb24gb2YgdGhlIGFic29sdXRlIGZpbGUgbmFtZSBmb3IgdGhlIHNwZWNpZmllZCBmaWxlLgotCSAqIFRoZSBzaG9ydGVyIHZlcnNpb24gd2lsbCBub3QgYmUgbG9uZ2VyIHRoYW4gdGhlIG1heGltdW0gbGVuZ3RoLgotCSAqIFRoZSBmaXJzdCBkaXJlY3RvcnkgKHVzdWFsbHkgdGhlIGRyaXZlIGxldHRlcikgYW5kIHRoZSBmaWxlIG5hbWUgb3IgdGhlCi0JICogbGFzdCBkaXJlY3Rvcnkgd2lsbCBhbHdheXMgYmUgYWRkZWQgdG8gdGhlIGdlbmVyYXRlZCBzdHJpbmcgcmVnYXJkbGVzcyBvZgotCSAqIHRoZSBtYXhpbXVtIGxlbmd0aCBhbGxvd2VkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNob3J0ZW5GaWxlTmFtZShVUkwgdXJsLCBpbnQgbWF4TGVuZ3RoKSB7Ci0JCUZpbGUgZmlsZTsKLQkJdHJ5IHsKLQkJCWZpbGUgPSBidWlsZEZpbGUodXJsKTsKLQkJfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpIHsKLQkJCWZpbGUgPSBuZXcgRmlsZSh1cmwuZ2V0RmlsZSgpKTsKLQkJfQotCQlyZXR1cm4gc2hvcnRlbkZpbGVOYW1lKGZpbGUsIG1heExlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc2hvcnRlciB2ZXJzaW9uIG9mIHRoZSBhYnNvbHV0ZSBmaWxlIG5hbWUgZm9yIHRoZSBzcGVjaWZpZWQgZmlsZS4KLQkgKiBUaGUgc2hvcnRlciB2ZXJzaW9uIHdpbGwgbm90IGJlIGxvbmdlciB0aGFuIHRoZSBtYXhpbXVtIGxlbmd0aC4KLQkgKiBUaGUgZmlyc3QgZGlyZWN0b3J5ICh1c3VhbGx5IHRoZSBkcml2ZSBsZXR0ZXIpIGFuZCB0aGUgZmlsZSBuYW1lIG9yIHRoZQotCSAqIGxhc3QgZGlyZWN0b3J5IHdpbGwgYWx3YXlzIGJlIGFkZGVkIHRvIHRoZSBnZW5lcmF0ZWQgc3RyaW5nIHJlZ2FyZGxlc3Mgb2YKLQkgKiB0aGUgbWF4aW11bSBsZW5ndGggYWxsb3dlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzaG9ydGVuRmlsZU5hbWUoRmlsZSBmaWxlKSB7Ci0JCXJldHVybiBzaG9ydGVuRmlsZU5hbWUoZmlsZSwgTUFYSU1VTV9TSE9SVEVORURfRklMRV9OQU1FX0xFTkdUSCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc2hvcnRlciB2ZXJzaW9uIG9mIHRoZSBhYnNvbHV0ZSBmaWxlIG5hbWUgZm9yIHRoZSBzcGVjaWZpZWQgZmlsZS4KLQkgKiBUaGUgc2hvcnRlciB2ZXJzaW9uIHdpbGwgbm90IGJlIGxvbmdlciB0aGFuIHRoZSBtYXhpbXVtIGxlbmd0aC4KLQkgKiBUaGUgZmlyc3QgZGlyZWN0b3J5ICh1c3VhbGx5IHRoZSBkcml2ZSBsZXR0ZXIpIGFuZCB0aGUgZmlsZSBuYW1lIG9yIHRoZQotCSAqIGxhc3QgZGlyZWN0b3J5IHdpbGwgYWx3YXlzIGJlIGFkZGVkIHRvIHRoZSBnZW5lcmF0ZWQgc3RyaW5nIHJlZ2FyZGxlc3Mgb2YKLQkgKiB0aGUgbWF4aW11bSBsZW5ndGggYWxsb3dlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzaG9ydGVuRmlsZU5hbWUoRmlsZSBmaWxlLCBpbnQgbWF4TGVuZ3RoKSB7Ci0JCVN0cmluZyBhYnNvbHV0ZUZpbGVOYW1lID0gY2Fub25pY2FsRmlsZShmaWxlKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJaWYgKGFic29sdXRlRmlsZU5hbWUubGVuZ3RoKCkgPD0gbWF4TGVuZ3RoKSB7Ci0JCQkvLyBubyBuZWVkIHRvIHNob3J0ZW4KLQkJCXJldHVybiBhYnNvbHV0ZUZpbGVOYW1lOwotCQl9Ci0KLQkJLy8gYnJlYWsgZG93biB0aGUgcGF0aCBpbnRvIGl0cyBjb21wb25lbnRzCi0JCVN0cmluZyBmcyA9IEZpbGUuc2VwYXJhdG9yOwotCQlTdHJpbmdbXSBwYXRocyA9IGFic29sdXRlRmlsZU5hbWUuc3BsaXQoIlxcIiArIGZzKTsKLQotCQlpZiAocGF0aHMubGVuZ3RoIDw9IDEpIHsKLQkJCS8vIGUuZy4gIkM6XCIKLQkJCXJldHVybiBwYXRoc1swXTsKLQkJfQotCi0JCWlmIChwYXRocy5sZW5ndGggPT0gMikgewotCQkJLy8gZS5nLiAiQzpcTXlSZWFsbHlMb25nRmlsZU5hbWUuZXh0IiBvciAiQzpcTXlSZWFsbHlMb25nRGlyZWN0b3J5TmFtZSIKLQkJCS8vIHJldHVybiB0aGUgY29tcGxldGUgZmlsZSBuYW1lIHNpbmNlIHRoaXMgaXMgYSBtaW5pbXVtIHJlcXVpcmVtZW50LAotCQkJLy8gcmVnYXJkbGVzcyBvZiB0aGUgbWF4aW11bSBsZW5ndGggYWxsb3dlZAotCQkJcmV0dXJuIGFic29sdXRlRmlsZU5hbWU7Ci0JCX0KLQotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXNiLmFwcGVuZChwYXRoc1swXSk7CQkvLyBhbHdheXMgYWRkIHRoZSBmaXJzdCBkaXJlY3RvcnksIHdoaWNoIGlzIHVzdWFsbHkgdGhlIGRyaXZlIGxldHRlcgotCi0JCS8vIEtlZXAgdGhlIGluZGV4IG9mIGluc2VydGlvbiBpbnRvIHRoZSBzdHJpbmcgYnVmZmVyCi0JCWludCBpbnNlcnRJbmRleCA9IHNiLmxlbmd0aCgpOwotCi0JCXNiLmFwcGVuZChmcyk7Ci0JCXNiLmFwcGVuZChwYXRoc1twYXRocy5sZW5ndGggLSAxXSk7CQkvLyBhcHBlbmQgdGhlIGZpbGUgbmFtZSBvciB0aGUgbGFzdCBkaXJlY3RvcnkKLQotCQltYXhMZW5ndGggLT0gNDsgICAgICAgICAgICAgICAgICAgICAgLy8gLTQgZm9yICIvLi4uIgotCi0JCWludCBjdXJyZW50TGVuZ3RoID0gc2IubGVuZ3RoKCkgLSA0OyAvLyAtNCBmb3IgIi8uLi4iCi0JCWludCBsZWZ0SW5kZXggPSAxOyAgICAgICAgICAgICAgICAgICAvLyAgMSB0byBza2lwIHRoZSByb290IGRpcmVjdG9yeQotCQlpbnQgcmlnaHRJbmRleCA9IHBhdGhzLmxlbmd0aCAtIDI7ICAgLy8gLTEgZm9yIHRoZSBmaWxlIG5hbWUgb3IgdGhlIGxhc3QgZGlyZWN0b3J5Ci0KLQkJYm9vbGVhbiBjYW5BZGRGcm9tTGVmdCA9IHRydWU7Ci0JCWJvb2xlYW4gY2FuQWRkRnJvbVJpZ2h0ID0gdHJ1ZTsKLQotCQkvLyBBZGQgZWFjaCBkaXJlY3RvcnksIHRoZSBpbnNlcnRpb24gaXMgZ29pbmcgaW4gYm90aCBkaXJlY3Rpb246IGxlZnQgYW5kCi0JCS8vIHJpZ2h0LCBvbmNlIGEgc2lkZSBjYW4ndCBiZSBhZGRlZCwgdGhlIG90aGVyIHNpZGUgaXMgc3RpbGwgY29udGludWluZwotCQkvLyB1bnRpbCBib3RoIGNhbid0IGFkZCBhbnltb3JlCi0JCXdoaWxlICh0cnVlKSB7Ci0JCQlpZiAoIWNhbkFkZEZyb21MZWZ0ICYmICFjYW5BZGRGcm9tUmlnaHQpCi0JCQkJYnJlYWs7Ci0KLQkJCWlmIChjYW5BZGRGcm9tUmlnaHQpIHsKLQkJCQlTdHJpbmcgcmlnaHREaXJlY3RvcnkgPSBwYXRoc1tyaWdodEluZGV4XTsKLQkJCQlpbnQgcmlnaHRMZW5ndGggPSByaWdodERpcmVjdG9yeS5sZW5ndGgoKTsKLQotCQkJCS8vIEFkZCB0aGUgZGlyZWN0b3J5IG9uIHRoZSByaWdodCBzaWRlIG9mIHRoZSBsb29wCi0JCQkJaWYgKGN1cnJlbnRMZW5ndGggKyByaWdodExlbmd0aCArIDEgPD0gbWF4TGVuZ3RoKSB7Ci0JCQkJCXNiLmluc2VydChpbnNlcnRJbmRleCwgICAgIGZzKTsKLQkJCQkJc2IuaW5zZXJ0KGluc2VydEluZGV4ICsgMSwgcmlnaHREaXJlY3RvcnkpOwotCi0JCQkJCWN1cnJlbnRMZW5ndGggKz0gcmlnaHRMZW5ndGggKyAxOwotCQkJCQlyaWdodEluZGV4LS07Ci0KLQkJCQkJLy8gVGhlIHJpZ2h0IHNpZGUgaXMgbm93IG92ZXJsYXBwaW5nIHRoZSBsZWZ0IHNpZGUsIHRoYXQgbWVhbnMKLQkJCQkJLy8gd2UgY2FuJ3QgYWRkIGZyb20gdGhlIHJpZ2h0IHNpZGUgYW55bW9yZQotCQkJCQlpZiAobGVmdEluZGV4ID49IHJpZ2h0SW5kZXgpIHsKLQkJCQkJCWNhbkFkZEZyb21SaWdodCA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY2FuQWRkRnJvbVJpZ2h0ID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoY2FuQWRkRnJvbUxlZnQpIHsKLQkJCQlTdHJpbmcgbGVmdERpcmVjdG9yeSA9IHBhdGhzW2xlZnRJbmRleF07Ci0JCQkJaW50IGxlZnRMZW5ndGggPSBsZWZ0RGlyZWN0b3J5Lmxlbmd0aCgpOwotCi0JCQkJLy8gQWRkIHRoZSBkaXJlY3Rvcnkgb24gdGhlIGxlZnQgc2lkZSBvZiB0aGUgbG9vcAotCQkJCWlmIChjdXJyZW50TGVuZ3RoICsgbGVmdExlbmd0aCArIDEgPD0gbWF4TGVuZ3RoKSB7Ci0JCQkJCXNiLmluc2VydChpbnNlcnRJbmRleCwgICAgIGZzKTsKLQkJCQkJc2IuaW5zZXJ0KGluc2VydEluZGV4ICsgMSwgbGVmdERpcmVjdG9yeSk7Ci0KLQkJCQkJaW5zZXJ0SW5kZXggKz0gbGVmdExlbmd0aCArIDE7Ci0JCQkJCWN1cnJlbnRMZW5ndGggKz0gbGVmdExlbmd0aCArIDE7Ci0JCQkJCWxlZnRJbmRleCsrOwotCi0JCQkJCS8vIFRoZSBsZWZ0IHNpZGUgaXMgbm93IG92ZXJsYXBwaW5nIHRoZSByaWdodCBzaWRlLCB0aGF0IG1lYW5zCi0JCQkJCS8vIHdlIGNhbid0IGFkZCBmcm9tIHRoZSBsZWZ0IHNpZGUgYW55bW9yZQotCQkJCQlpZiAobGVmdEluZGV4ID49IHJpZ2h0SW5kZXgpIHsKLQkJCQkJCWNhbkFkZEZyb21MZWZ0ID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQljYW5BZGRGcm9tTGVmdCA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChsZWZ0SW5kZXggPD0gcmlnaHRJbmRleCkgewotCQkJc2IuaW5zZXJ0KGluc2VydEluZGV4LCBmcyk7Ci0JCQlzYi5pbnNlcnQoaW5zZXJ0SW5kZXggKyAxLCAiLi4uIik7Ci0JCX0KLQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3lzdGVtIHByb3BlcnRpZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGEgZmlsZSByZXByZXNlbnRpbmcgdGhlIHVzZXIncyBob21lIGRpcmVjdG9yeS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgdXNlckhvbWVEaXJlY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgRmlsZShVU0VSX0hPTUVfRElSRUNUT1JZX05BTUUpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBmaWxlIHJlcHJlc2VudGluZyB0aGUgdXNlcidzIHRlbXBvcmFyeSBkaXJlY3RvcnkuCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIHVzZXJUZW1wb3JhcnlEaXJlY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgRmlsZShVU0VSX1RFTVBPUkFSWV9ESVJFQ1RPUllfTkFNRSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIGZpbGUgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSBjdXJyZW50V29ya2luZ0RpcmVjdG9yeSgpIHsKLQkJcmV0dXJuIG5ldyBGaWxlKENVUlJFTlRfV09SS0lOR19ESVJFQ1RPUllfTkFNRSk7Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiBtaXNjZWxsYW5lb3VzICoqKioqKioqKioKLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZXhlY3V0aW5nT25XaW5kb3dzKCkgewotCQlyZXR1cm4gZXhlY3V0aW5nT24oIldpbmRvd3MiKTsKLQl9Ci0KLS8vCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZXhlY3V0aW5nT25MaW51eCgpIHsKLS8vCQlyZXR1cm4gZXhlY3V0aW5nT24oIkxpbnV4Iik7Ci0vLwl9Ci0vLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZXhlY3V0aW5nT24oU3RyaW5nIG9zTmFtZSkgewotCQlyZXR1cm4gU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIikuaW5kZXhPZihvc05hbWUpICE9IC0xOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBvbmx5IHRoZSBmaWxlcyB0aGF0IGZpdCB0aGUgZmlsdGVyLgotCSAqIEZpbGUjZmlsZXMoRmlsZUZpbHRlciBmaWxlRmlsdGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8RmlsZT4gZmlsdGVyKEl0ZXJhdG9yPEZpbGU+IGZpbGVzLCBmaW5hbCBGaWxlRmlsdGVyIGZpbGVGaWx0ZXIpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxGaWxlPihmaWxlcykgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG5leHQpIHsKLQkJCQlyZXR1cm4gZmlsZUZpbHRlci5hY2NlcHQoKEZpbGUpIG5leHQpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGZpbGUgdGhhdCBpcyBhIHJlLXNwZWNpZmljYXRpb24gb2YgdGhlIHNwZWNpZmllZAotCSAqIGZpbGUsIHJlbGF0aXZlIHRvIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5LgotCSAqICAgICBMaW51eC9Vbml4L01hYzoKLQkgKiAgICAgICAgIGNvbnZlcnRUb1JlbGF0aXZlRmlsZSgvZm9vL2Jhci9iYXouamF2YSwgL2ZvbykKLQkgKiAgICAgICAgICAgICA9PiBiYXIvYmF6LmphdmEKLQkgKiAgICAgV2luZG93czoKLQkgKiAgICAgICAgIGNvbnZlcnRUb1JlbGF0aXZlRmlsZShDOlxmb29cYmFyXGJhei5qYXZhLCBDOlxmb28pCi0JICogICAgICAgICAgICAgPT4gYmFyL2Jhei5qYXZhCi0JICogVGhlIGZpbGUgY2FuIGJlIGVpdGhlciBhIGZpbGUgb3IgYSBkaXJlY3Rvcnk7IHRoZSBkaXJlY3RvcnkKLQkgKiAqc2hvdWxkKiBiZSBhIGRpcmVjdG9yeS4KLQkgKiBJZiB0aGUgZmlsZSBpcyBhbHJlYWR5IHJlbGF0aXZlIG9yIGl0IGNhbm5vdCBiZSBtYWRlIHJlbGF0aXZlCi0JICogdG8gdGhlIGRpcmVjdG9yeSwgaXQgd2lsbCBiZSByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogCi0JICogTkI6IFRoaXMgbWV0aG9kIGhhcyBiZWVuIHRlc3RlZCBvbiBXaW5kb3dzIGFuZCBMaW51eCwKLQkgKiBidXQgbm90IE1hYyAoYnV0IHRoZSBNYWMgaXMgVW5peC1iYXNlZCB0aGVzZSBkYXlzLCBzbwotCSAqIGl0IHNob3VsZG4ndCBiZSBhIHByb2JsZW0uLi4pLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSBjb252ZXJ0VG9SZWxhdGl2ZUZpbGUoZmluYWwgRmlsZSBmaWxlLCBmaW5hbCBGaWxlIGRpcikgewotCQkvLyBjaGVjayB3aGV0aGVyIHRoZSBmaWxlIGlzIGFscmVhZHkgcmVsYXRpdmUKLQkJaWYgKCAhIGZpbGUuaXNBYnNvbHV0ZSgpKSB7Ci0JCQlyZXR1cm4gZmlsZTsJCS8vIHJldHVybiB1bmNoYW5nZWQKLQkJfQotCi0JCUZpbGUgY0ZpbGUgPSBjYW5vbmljYWxGaWxlKGZpbGUpOwotCQlGaWxlIGNEaXIgPSBjYW5vbmljYWxGaWxlKGRpcik7Ci0KLQkJLy8gdGhlIHR3byBhcmUgdGhlIHNhbWUgZGlyZWN0b3J5Ci0JCWlmIChjRmlsZS5lcXVhbHMoY0RpcikpIHsKLQkJCXJldHVybiBuZXcgRmlsZSgiLiIpOwotCQl9Ci0KLQkJRmlsZVtdIGZpbGVQYXRoRmlsZXMgPSBwYXRoRmlsZXMoY0ZpbGUpOwotCQlGaWxlW10gZGlyUGF0aEZpbGVzID0gcGF0aEZpbGVzKGNEaXIpOwotCi0JCS8vIFdpbmRvd3Mgb25seSAoPyk6IHRoZSByb290cyBhcmUgZGlmZmVyZW50IC0gZS5nLiBEOlwgdnMuIEM6XAotCQlpZiAoICEgZGlyUGF0aEZpbGVzWzBdLmVxdWFscyhmaWxlUGF0aEZpbGVzWzBdKSkgewotCQkJcmV0dXJuIGZpbGU7CQkvLyByZXR1cm4gdW5jaGFuZ2VkCi0JCX0KLQotCQkvLyBhdCB0aGlzIHBvaW50IHdlIGtub3cgdGhlIHJvb3QgaXMgdGhlIHNhbWUsIG5vdyBmaW5kIGhvdyBtdWNoIGlzIGluIGNvbW1vbgotCQlpbnQgaSA9IDA7CQkvLyB0aGlzIHdpbGwgcG9pbnQgYXQgdGhlIGZpcnN0IG1pc2NvbXBhcmUKLQkJd2hpbGUgKChpIDwgZGlyUGF0aEZpbGVzLmxlbmd0aCkgJiYgKGkgPCBmaWxlUGF0aEZpbGVzLmxlbmd0aCkpIHsKLQkJCWlmIChkaXJQYXRoRmlsZXNbaV0uZXF1YWxzKGZpbGVQYXRoRmlsZXNbaV0pKSB7Ci0JCQkJaSsrOwotCQkJfSBlbHNlIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQkvLyBzYXZlIG91ciBjdXJyZW50IHBvc2l0aW9uCi0JCWludCBmaXJzdE1pc21hdGNoID0gaTsKLQotCQkvLyBjaGVjayB3aGV0aGVyIHRoZSBmaWxlIGlzIEFCT1ZFIHRoZSBkaXJlY3Rvcnk6IC4uLy4uCi0JCWlmIChmaXJzdE1pc21hdGNoID09IGZpbGVQYXRoRmlsZXMubGVuZ3RoKSB7Ci0JCQlyZXR1cm4gcmVsYXRpdmVQYXJlbnRGaWxlKGRpclBhdGhGaWxlcy5sZW5ndGggLSBmaXJzdE1pc21hdGNoKTsKLQkJfQotCi0JCS8vIGJ1aWxkIGEgbmV3IGZpbGUgZnJvbSB0aGUgcGF0aCBiZXlvbmQgdGhlIG1hdGNoaW5nIHBvcnRpb25zCi0JCUZpbGUgZGlmZiA9IG5ldyBGaWxlKGZpbGVQYXRoRmlsZXNbaV0uZ2V0TmFtZSgpKTsKLQkJd2hpbGUgKCsraSA8IGZpbGVQYXRoRmlsZXMubGVuZ3RoKSB7Ci0JCQlkaWZmID0gbmV3IEZpbGUoZGlmZiwgZmlsZVBhdGhGaWxlc1tpXS5nZXROYW1lKCkpOwotCQl9Ci0KLQkJLy8gY2hlY2sgd2hldGhlciB0aGUgZmlsZSBpcyBCRUxPVyB0aGUgZGlyZWN0b3J5OiBzdWJkaXIxL3N1YmRpcjIvZmlsZS5leHQKLQkJaWYgKGZpcnN0TWlzbWF0Y2ggPT0gZGlyUGF0aEZpbGVzLmxlbmd0aCkgewotCQkJcmV0dXJuIGRpZmY7Ci0JCX0KLQotCQkvLyB0aGUgZmlsZSBtdXN0IGJlIGEgUEVFUiBvZiB0aGUgZGlyZWN0b3J5OiAuLi8uLi9zdWJkaXIxL3N1YmRpcjIvZmlsZS5leHQKLQkJcmV0dXJuIG5ldyBGaWxlKHJlbGF0aXZlUGFyZW50RmlsZShkaXJQYXRoRmlsZXMubGVuZ3RoIC0gZmlyc3RNaXNtYXRjaCksIGRpZmYuZ2V0UGF0aCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBmaWxlIHRoYXQgaXMgYSByZS1zcGVjaWZpY2F0aW9uIG9mIHRoZSBzcGVjaWZpZWQKLQkgKiBmaWxlLCByZWxhdGl2ZSB0byB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4KLQkgKiAgICAgTGludXgvVW5peC9NYWMgKENXRCA9IC9mb28pOgotCSAqICAgICAgICAgY29udmVydFRvUmVsYXRpdmVGaWxlKC9mb28vYmFyL2Jhei5qYXZhKQotCSAqICAgICAgICAgICAgID0+IGJhci9iYXouamF2YQotCSAqICAgICBXaW5kb3dzIChDV0QgPSBDOlxmb28pOgotCSAqICAgICAgICAgY29udmVydFRvUmVsYXRpdmVGaWxlKEM6XGZvb1xiYXJcYmF6LmphdmEpCi0JICogICAgICAgICAgICAgPT4gYmFyL2Jhei5qYXZhCi0JICogVGhlIGZpbGUgY2FuIGJlIGVpdGhlciBhIGZpbGUgb3IgYSBkaXJlY3RvcnkuCi0JICogSWYgdGhlIGZpbGUgaXMgYWxyZWFkeSByZWxhdGl2ZSBvciBpdCBjYW5ub3QgYmUgbWFkZSByZWxhdGl2ZQotCSAqIHRvIHRoZSBkaXJlY3RvcnksIGl0IHdpbGwgYmUgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIAotCSAqIE5COiBUaGlzIG1ldGhvZCBoYXMgYmVlbiB0ZXN0ZWQgb24gV2luZG93cyBhbmQgTGludXgsCi0JICogYnV0IG5vdCBNYWMgKGJ1dCB0aGUgTWFjIGlzIFVuaXgtYmFzZWQgdGhlc2UgZGF5cywgc28KLQkgKiBpdCBzaG91bGRuJ3QgYmUgYSBwcm9ibGVtLi4uKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgY29udmVydFRvUmVsYXRpdmVGaWxlKGZpbmFsIEZpbGUgZmlsZSkgewotCQlyZXR1cm4gY29udmVydFRvUmVsYXRpdmVGaWxlKGZpbGUsIGN1cnJlbnRXb3JraW5nRGlyZWN0b3J5KCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBvZiBmaWxlcyByZXByZXNlbnRpbmcgdGhlIHBhdGggdG8gdGhlIHNwZWNpZmllZAotCSAqIGZpbGUuIEZvciBleGFtcGxlOgotCSAqICAgICBDOi9mb28vYmFyL2Jhei50eHQgPT4KLQkgKiAgICAgeyBDOi8sIEM6L2ZvbywgQzovZm9vL2JhciwgQzovZm9vL2Jhci9iYXoudHh0IH0KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBGaWxlW10gcGF0aEZpbGVzKEZpbGUgZmlsZSkgewotCQlMaXN0PEZpbGU+IHBhdGggPSBuZXcgQXJyYXlMaXN0PEZpbGU+KCk7Ci0JCWZvciAoRmlsZSBmID0gZmlsZTsgZiAhPSBudWxsOyBmID0gZi5nZXRQYXJlbnRGaWxlKCkpIHsKLQkJCXBhdGguYWRkKGYpOwotCQl9Ci0JCUNvbGxlY3Rpb25zLnJldmVyc2UocGF0aCk7Ci0JCXJldHVybiBwYXRoLnRvQXJyYXkobmV3IEZpbGVbcGF0aC5zaXplKCldKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBmaWxlIHdpdGggdGhlIHNwZWNpZmllZCAobm9uLXplcm8pIG51bWJlciBvZiByZWxhdGl2ZQotCSAqIGZpbGUgbmFtZXMsIGUuZy4geHh4KDMpID0+IC4uLy4uLy4uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgRmlsZSByZWxhdGl2ZVBhcmVudEZpbGUoaW50IGxlbikgewotCQlpZiAobGVuIDw9IDApIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImxlbmd0aCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvOiAiICsgbGVuKTsKLQkJfQotCQlGaWxlIHJlc3VsdCA9IG5ldyBGaWxlKCIuLiIpOwotCQlmb3IgKGludCBpID0gbGVuIC0gMTsgaS0tID4gMDsgKSB7Ci0JCQlyZXN1bHQgPSBuZXcgRmlsZShyZXN1bHQsICIuLiIpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgZmlsZSB0aGF0IGlzIGEgcmUtc3BlY2lmaWNhdGlvbiBvZiB0aGUgc3BlY2lmaWVkCi0JICogZmlsZSwgYWJzb2x1dGUgdG8gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkuCi0JICogICAgIExpbnV4L1VuaXgvTWFjOgotCSAqICAgICAgICAgY29udmVydFRvQWJzb2x1dGVGaWxlKGJhci9iYXouamF2YSwgL2ZvbykKLQkgKiAgICAgICAgICAgICA9PiAvZm9vL2Jhci9iYXouamF2YQotCSAqICAgICBXaW5kb3dzOgotCSAqICAgICAgICAgY29udmVydFRvQWJzb2x1dGVGaWxlKGJhci9iYXouamF2YSwgQzpcZm9vKQotCSAqICAgICAgICAgICAgID0+IEM6XGZvb1xiYXJcYmF6LmphdmEKLQkgKiBUaGUgZmlsZSBjYW4gYmUgZWl0aGVyIGEgZmlsZSBvciBhIGRpcmVjdG9yeTsgdGhlIGRpcmVjdG9yeQotCSAqICpzaG91bGQqIGJlIGEgZGlyZWN0b3J5LgotCSAqIElmIHRoZSBmaWxlIGlzIGFscmVhZHkgYWJzb2x1dGUsIGl0IHdpbGwgYmUgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIAotCSAqIE5COiBUaGlzIG1ldGhvZCBoYXMgYmVlbiB0ZXN0ZWQgb24gV2luZG93cyBhbmQgTGludXgsCi0JICogYnV0IG5vdCBNYWMgKGJ1dCB0aGUgTWFjIGlzIFVuaXgtYmFzZWQgdGhlc2UgZGF5cywgc28KLQkgKiBpdCBzaG91bGRuJ3QgYmUgYSBwcm9ibGVtLi4uKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgY29udmVydFRvQWJzb2x1dGVGaWxlKGZpbmFsIEZpbGUgZmlsZSwgZmluYWwgRmlsZSBkaXIpIHsKLQkJLy8gY2hlY2sgd2hldGhlciB0aGUgZmlsZSBpcyBhbHJlYWR5IGFic29sdXRlCi0JCWlmIChmaWxlLmlzQWJzb2x1dGUoKSkgewotCQkJcmV0dXJuIGZpbGU7CQkvLyByZXR1cm4gdW5jaGFuZ2VkCi0JCX0KLQkJcmV0dXJuIGNhbm9uaWNhbEZpbGUobmV3IEZpbGUoZGlyLCBmaWxlLmdldFBhdGgoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGZpbGUgdGhhdCBpcyBhIHJlLXNwZWNpZmljYXRpb24gb2YgdGhlIHNwZWNpZmllZAotCSAqIGZpbGUsIGFic29sdXRlIHRvIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LgotCSAqICAgICBMaW51eC9Vbml4L01hYyAoQ1dEID0gL2Zvbyk6Ci0JICogICAgICAgICBjb252ZXJ0VG9BYnNvbHV0ZUZpbGUoYmFyL2Jhei5qYXZhKQotCSAqICAgICAgICAgICAgID0+IC9mb28vYmFyL2Jhei5qYXZhCi0JICogICAgIFdpbmRvd3MgKENXRCA9IEM6XGZvbyk6Ci0JICogICAgICAgICBjb252ZXJ0VG9BYnNvbHV0ZUZpbGUoYmFyL2Jhei5qYXZhKQotCSAqICAgICAgICAgICAgID0+IEM6XGZvb1xiYXJcYmF6LmphdmEKLQkgKiBUaGUgZmlsZSBjYW4gYmUgZWl0aGVyIGEgZmlsZSBvciBhIGRpcmVjdG9yeS4KLQkgKiBJZiB0aGUgZmlsZSBpcyBhbHJlYWR5IGFic29sdXRlLCBpdCB3aWxsIGJlIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiAKLQkgKiBOQjogVGhpcyBtZXRob2QgaGFzIGJlZW4gdGVzdGVkIG9uIFdpbmRvd3MgYW5kIExpbnV4LAotCSAqIGJ1dCBub3QgTWFjIChidXQgdGhlIE1hYyBpcyBVbml4LWJhc2VkIHRoZXNlIGRheXMsIHNvCi0JICogaXQgc2hvdWxkbid0IGJlIGEgcHJvYmxlbS4uLikuCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIGNvbnZlcnRUb0Fic29sdXRlRmlsZShmaW5hbCBGaWxlIGZpbGUpIHsKLQkJcmV0dXJuIGNvbnZlcnRUb0Fic29sdXRlRmlsZShmaWxlLCBjdXJyZW50V29ya2luZ0RpcmVjdG9yeSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JLyoqCi0JICogU3VwcHJlc3MgZGVmYXVsdCBjb25zdHJ1Y3RvciwgZW5zdXJpbmcgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkgKi8KLQlwcml2YXRlIEZpbGVUb29scygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvRmlsdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwZjk1ZTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0ZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbDsKLQotLyoqCi0gKiBVc2VkIGJ5IHZhcmlvdXMgInBsdWdnYWJsZSIgY2xhc3NlcyB0byBmaWx0ZXIgb2JqZWN0cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBGaWx0ZXI8VD4gewotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBvYmplY3QgaXMgImFjY2VwdGVkIiBieSB0aGUKLQkgKiBmaWx0ZXIuIFRoZSBzZW1hbnRpY3Mgb2YgImFjY2VwdCIgaXMgZGV0ZXJtaW5lZCBieSB0aGUKLQkgKiBjb250cmFjdCBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIHRoZSBzZXJ2ZXIuCi0JICovCi0JYm9vbGVhbiBhY2NlcHQoVCBvKTsKLQotCi0JZmluYWwgY2xhc3MgTnVsbDxTPiBpbXBsZW1lbnRzIEZpbHRlcjxTPiB7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEZpbHRlciBJTlNUQU5DRSA9IG5ldyBOdWxsKCk7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgc3RhdGljIDxSPiBGaWx0ZXI8Uj4gaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIE51bGwoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCS8vIG5vdGhpbmcgaXMgZmlsdGVyZWQgLSBldmVyeXRoaW5nIGlzIGFjY2VwdGVkCi0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChTIG5leHQpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJGaWx0ZXIuTnVsbCI7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9IYXNoQmFnLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvSGFzaEJhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDE3Y2Y5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9IYXNoQmFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdENvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIDxjb2RlPkJhZzwvY29kZT4gaW50ZXJmYWNlLCBiYWNrZWQgYnkgYQotICogaGFzaCB0YWJsZS4gSXQgbWFrZXMgbm8gZ3VhcmFudGVlcyBhcyB0byB0aGUgaXRlcmF0aW9uIG9yZGVyIG9mCi0gKiB0aGUgYmFnJ3MgZWxlbWVudHM7IGluIHBhcnRpY3VsYXIsIGl0IGRvZXMgbm90IGd1YXJhbnRlZSB0aGF0IHRoZSBvcmRlcgotICogd2lsbCByZW1haW4gY29uc3RhbnQgb3ZlciB0aW1lLiBUaGlzIGNsYXNzIHBlcm1pdHMgdGhlIDxjb2RlPm51bGw8L2NvZGU+Ci0gKiBlbGVtZW50LgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIG9mZmVycyBjb25zdGFudCB0aW1lIHBlcmZvcm1hbmNlIGZvciB0aGUgYmFzaWMgb3BlcmF0aW9ucwotICogKDxjb2RlPmFkZDwvY29kZT4sIDxjb2RlPnJlbW92ZTwvY29kZT4sIDxjb2RlPmNvbnRhaW5zPC9jb2RlPiBhbmQKLSAqIDxjb2RlPnNpemU8L2NvZGU+KSwgYXNzdW1pbmcgdGhlIGhhc2ggZnVuY3Rpb24gZGlzcGVyc2VzIHRoZSBlbGVtZW50cwotICogcHJvcGVybHkgYW1vbmcgdGhlIGJ1Y2tldHMuIEl0ZXJhdGluZyBvdmVyIHRoaXMgYmFnIHJlcXVpcmVzIHRpbWUKLSAqIHByb3BvcnRpb25hbCB0byB0aGUgc3VtIG9mIHRoZSBiYWcncyBzaXplICh0aGUgbnVtYmVyIG9mIGVsZW1lbnRzKSBwbHVzIHRoZQotICogImNhcGFjaXR5IiBvZiB0aGUgYmFja2luZyBoYXNoIHRhYmxlICh0aGUgbnVtYmVyIG9mIGJ1Y2tldHMpLiBUaHVzLCBpdCBpcwotICogaW1wb3J0YW50IG5vdCB0byBzZXQgdGhlIGluaXRpYWwgY2FwYWNpdHkgdG9vIGhpZ2ggKG9yIHRoZSBsb2FkIGZhY3RvciB0b28KLSAqIGxvdykgaWYgaXRlcmF0aW9uIHBlcmZvcm1hbmNlIGlzIGltcG9ydGFudC4KLSAqIDxwPgotICogPGI+Tm90ZSB0aGF0IHRoaXMgaW1wbGVtZW50YXRpb24gaXMgbm90IHN5bmNocm9uaXplZC48L2I+IElmIG11bHRpcGxlCi0gKiB0aHJlYWRzIGFjY2VzcyBhIGJhZyBjb25jdXJyZW50bHksIGFuZCBhdCBsZWFzdCBvbmUgb2YgdGhlIHRocmVhZHMgbW9kaWZpZXMKLSAqIHRoZSBiYWcsIGl0IDxpPm11c3Q8L2k+IGJlIHN5bmNocm9uaXplZCBleHRlcm5hbGx5LiBUaGlzIGlzIHR5cGljYWxseQotICogYWNjb21wbGlzaGVkIGJ5IHN5bmNocm9uaXppbmcgb24gc29tZSBvYmplY3QgdGhhdCBuYXR1cmFsbHkgZW5jYXBzdWxhdGVzCi0gKiB0aGUgYmFnLiBJZiBubyBzdWNoIG9iamVjdCBleGlzdHMsIHRoZSBiYWcgc2hvdWxkIGJlICJ3cmFwcGVkIiB1c2luZyB0aGUKLSAqIDxjb2RlPkNvbGxlY3Rpb25zLnN5bmNocm9uaXplZENvbGxlY3Rpb248L2NvZGU+IG1ldGhvZC4gVGhpcyBpcwotICogYmVzdCBkb25lIGF0IGNyZWF0aW9uIHRpbWUsIHRvIHByZXZlbnQgYWNjaWRlbnRhbCB1bnN5bmNocm9uaXplZCBhY2Nlc3MKLSAqIHRvIHRoZSBiYWc6Ci0gKiA8cHJlPgotICogQ29sbGVjdGlvbiBjID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkQ29sbGVjdGlvbihuZXcgSGFzaEJhZyguLi4pKTsKLSAqIDwvcHJlPgotICogPHA+Ci0gKiBUaGUgaXRlcmF0b3JzIHJldHVybmVkIGJ5IHRoaXMgY2xhc3MncyA8Y29kZT5pdGVyYXRvcjwvY29kZT4gbWV0aG9kIGFyZQotICogPGk+ZmFpbC1mYXN0PC9pPjogaWYgdGhlIGJhZyBpcyBtb2RpZmllZCBhdCBhbnkgdGltZSBhZnRlciB0aGUgaXRlcmF0b3IgaXMKLSAqIGNyZWF0ZWQsIGluIGFueSB3YXkgZXhjZXB0IHRocm91Z2ggdGhlIGl0ZXJhdG9yJ3Mgb3duIDxjb2RlPnJlbW92ZTwvY29kZT4KLSAqIG1ldGhvZCwgdGhlIGl0ZXJhdG9yIHRocm93cyBhIDxjb2RlPkNvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb248L2NvZGU+LgotICogVGh1cywgaW4gdGhlIGZhY2Ugb2YgY29uY3VycmVudCBtb2RpZmljYXRpb24sIHRoZSBpdGVyYXRvciBmYWlscyBxdWlja2x5Ci0gKiBhbmQgY2xlYW5seSwgcmF0aGVyIHRoYW4gcmlza2luZyBhcmJpdHJhcnksIG5vbi1kZXRlcm1pbmlzdGljIGJlaGF2aW9yIGF0Ci0gKiBhbiB1bmRldGVybWluZWQgdGltZSBpbiB0aGUgZnV0dXJlLgotICogCi0gKiBAc2VlCUNvbGxlY3Rpb25zI3N5bmNocm9uaXplZENvbGxlY3Rpb24oQ29sbGVjdGlvbikKLSAqLwotCi1wdWJsaWMgY2xhc3MgSGFzaEJhZzxFPiBleHRlbmRzIEFic3RyYWN0Q29sbGVjdGlvbjxFPgotCQkJaW1wbGVtZW50cyBCYWc8RT4sIENsb25lYWJsZSwgU2VyaWFsaXphYmxlIHsKLQotCS8qKiBUaGUgaGFzaCB0YWJsZS4gKi8KLQl0cmFuc2llbnQgRW50cnk8RT5bXSB0YWJsZTsKLQkKLQkvKiogVGhlIHRvdGFsIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBiYWcuICovCi0JdHJhbnNpZW50IGludCBjb3VudCA9IDA7Ci0KLQkvKiogVGhlIG51bWJlciBvZiB1bmlxdWUgZW50cmllcyBpbiB0aGUgYmFnLiAqLwotCXRyYW5zaWVudCBpbnQgdW5pcXVlQ291bnQgPSAwOwotCi0JLyoqCi0JICogVGhlIGhhc2ggdGFibGUgaXMgcmVoYXNoZWQgd2hlbiBpdHMgc2l6ZSBleGNlZWRzIHRoaXMgdGhyZXNob2xkLiAoVGhlCi0JICogdmFsdWUgb2YgdGhpcyBmaWVsZCBpcyAoaW50KShjYXBhY2l0eSAqIGxvYWRGYWN0b3IpLikKLQkgKgotCSAqIEBzZXJpYWwKLQkgKi8KLQlwcml2YXRlIGludCB0aHJlc2hvbGQ7Ci0JCi0JLyoqCi0JICogVGhlIGxvYWQgZmFjdG9yIGZvciB0aGUgaGFzaCB0YWJsZS4KLQkgKgotCSAqIEBzZXJpYWwKLQkgKi8KLQlwcml2YXRlIGZsb2F0IGxvYWRGYWN0b3I7Ci0JCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiB0aW1lcyB0aGlzIGJhZyBoYXMgYmVlbiBzdHJ1Y3R1cmFsbHkgbW9kaWZpZWQuCi0JICogU3RydWN0dXJhbCBtb2RpZmljYXRpb25zIGFyZSB0aG9zZSB0aGF0IGNoYW5nZSB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4KLQkgKiB0aGUgYmFnIG9yIG90aGVyd2lzZSBtb2RpZnkgaXRzIGludGVybmFsIHN0cnVjdHVyZSAoZS5nLiByZWhhc2gpLgotCSAqIFRoaXMgZmllbGQgaXMgdXNlZCB0byBtYWtlIGl0ZXJhdG9ycyBvbiB0aGlzIGJhZyBmYWlsLWZhc3QuCi0JICoKLQkgKiBAc2VlIGphdmEudXRpbC5Db25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uCi0JICovCi0JdHJhbnNpZW50IGludCBtb2RDb3VudCA9IDA7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3LCBlbXB0eSBiYWcgd2l0aCB0aGUKLQkgKiBkZWZhdWx0IGNhcGFjaXR5LCB3aGljaCBpcyAxMSwgYW5kIGxvYWQgZmFjdG9yLCB3aGljaCBpcyAwLjc1LgotCSAqLwotCXB1YmxpYyBIYXNoQmFnKCkgewotCQl0aGlzKDExLCAwLjc1Zik7Ci0JfQotCQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcsIGVtcHR5IGJhZyB3aXRoIHRoZSBzcGVjaWZpZWQgaW5pdGlhbCBjYXBhY2l0eQotCSAqIGFuZCBkZWZhdWx0IGxvYWQgZmFjdG9yLCB3aGljaCBpcyAwLjc1LgotCSAqCi0JICogQHBhcmFtIGluaXRpYWxDYXBhY2l0eSB0aGUgaW5pdGlhbCBjYXBhY2l0eSBvZiB0aGUgYmFja2luZyBtYXAuCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGluaXRpYWwgY2FwYWNpdHkgaXMgbGVzcwotCSAqICAgICB0aGFuIHplcm8uCi0JICovCi0JcHVibGljIEhhc2hCYWcoaW50IGluaXRpYWxDYXBhY2l0eSkgewotCQl0aGlzKGluaXRpYWxDYXBhY2l0eSwgMC43NWYpOwotCX0KLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3LCBlbXB0eSBiYWcgd2l0aAotCSAqIHRoZSBzcGVjaWZpZWQgaW5pdGlhbCBjYXBhY2l0eSBhbmQgdGhlIHNwZWNpZmllZCBsb2FkIGZhY3Rvci4KLQkgKgotCSAqIEBwYXJhbSBpbml0aWFsQ2FwYWNpdHkgdGhlIGluaXRpYWwgY2FwYWNpdHkgb2YgdGhlIGJhY2tpbmcgbWFwLgotCSAqIEBwYXJhbSBsb2FkRmFjdG9yIHRoZSBsb2FkIGZhY3RvciBvZiB0aGUgYmFja2luZyBtYXAuCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGluaXRpYWwgY2FwYWNpdHkgaXMgbGVzcwotCSAqICAgICB0aGFuIHplcm8sIG9yIGlmIHRoZSBsb2FkIGZhY3RvciBpcyBub25wb3NpdGl2ZS4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgSGFzaEJhZyhpbnQgaW5pdGlhbENhcGFjaXR5LCBmbG9hdCBsb2FkRmFjdG9yKSB7Ci0JCWlmIChpbml0aWFsQ2FwYWNpdHkgPCAwKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbGxlZ2FsIEluaXRpYWwgQ2FwYWNpdHk6ICIgKyBpbml0aWFsQ2FwYWNpdHkpOwotCQl9Ci0JCWlmIChsb2FkRmFjdG9yIDw9IDAgfHwgRmxvYXQuaXNOYU4obG9hZEZhY3RvcikpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIklsbGVnYWwgTG9hZCBmYWN0b3I6ICIgKyBsb2FkRmFjdG9yKTsKLQkJfQotCQlpZiAoaW5pdGlhbENhcGFjaXR5ID09IDApIHsKLQkJCWluaXRpYWxDYXBhY2l0eSA9IDE7Ci0JCX0KLQkJdGhpcy5sb2FkRmFjdG9yID0gbG9hZEZhY3RvcjsKLQkJdGhpcy50YWJsZSA9IG5ldyBFbnRyeVtpbml0aWFsQ2FwYWNpdHldOwotCQl0aGlzLnRocmVzaG9sZCA9IChpbnQpIChpbml0aWFsQ2FwYWNpdHkgKiBsb2FkRmFjdG9yKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBiYWcgY29udGFpbmluZyB0aGUgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZAotCSAqIGNvbGxlY3Rpb24uIFRoZSBjYXBhY2l0eSBvZiB0aGUgYmFnIGlzCi0JICogdHdpY2UgdGhlIHNpemUgb2YgdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIG9yIDExICh3aGljaGV2ZXIgaXMKLQkgKiBncmVhdGVyKSwgYW5kIHRoZSBkZWZhdWx0IGxvYWQgZmFjdG9yLCB3aGljaCBpcyAwLjc1LCBpcyB1c2VkLgotCSAqCi0JICogQHBhcmFtIGMgdGhlIGNvbGxlY3Rpb24gd2hvc2UgZWxlbWVudHMgYXJlIHRvIGJlIHBsYWNlZCBpbnRvIHRoaXMgYmFnLgotCSAqLwotCXB1YmxpYyBIYXNoQmFnKENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGMpIHsKLQkJdGhpcyhNYXRoLm1heCgyKmMuc2l6ZSgpLCAxMSkpOwotCQl0aGlzLmFkZEFsbChjKTsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzaW1wbHkgcmV0dXJucyB0aGUgbWFpbnRhaW5lZCBjb3VudC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCXJldHVybiB0aGlzLmNvdW50OwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHNpbXBseSBjb21wYXJlcyB0aGUgbWFpbnRhaW5lZCBjb3VudCB0byB6ZXJvLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCXJldHVybiB0aGlzLmNvdW50ID09IDA7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gc2VhcmNoZXMgZm9yIHRoZSBvYmplY3QgaW4gdGhlIGhhc2ggdGFibGUgYnkgY2FsY3VsYXRpbmcKLQkgKiB0aGUgb2JqZWN0J3MgaGFzaCBjb2RlIGFuZCBleGFtaW5pbmcgdGhlIGVudHJpZXMgaW4gdGhlIGNvcnJlc3BvbmRpbmcgaGFzaAotCSAqIHRhYmxlIGJ1Y2tldC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3QgbykgewotCQlFbnRyeTxFPltdIHRhYiA9IHRoaXMudGFibGU7Ci0JCWlmIChvID09IG51bGwpIHsKLQkJCWZvciAoRW50cnk8RT4gZSA9IHRhYlswXTsgZSAhPSBudWxsOyBlID0gZS5uZXh0KSB7Ci0JCQkJaWYgKGUub2JqZWN0ID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJaW50IGhhc2ggPSBvLmhhc2hDb2RlKCk7Ci0JCQlpbnQgaW5kZXggPSAoaGFzaCAmIDB4N0ZGRkZGRkYpICUgdGFiLmxlbmd0aDsKLQkJCWZvciAoRW50cnk8RT4gZSA9IHRhYltpbmRleF07IGUgIT0gbnVsbDsgZSA9IGUubmV4dCkgewotCQkJCWlmICgoZS5oYXNoID09IGhhc2gpICYmIG8uZXF1YWxzKGUub2JqZWN0KSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgc3BlY2lmaWVkIG9iamVjdCBvY2N1cnMgaW4gdGhlIGJhZy4KLQkgKi8JCi0JcHVibGljIGludCBjb3VudChPYmplY3QgbykgewotCQlFbnRyeTxFPltdIHRhYiA9IHRoaXMudGFibGU7Ci0JCWlmIChvID09IG51bGwpIHsKLQkJCWZvciAoRW50cnk8RT4gZSA9IHRhYlswXTsgZSAhPSBudWxsOyBlID0gZS5uZXh0KSB7Ci0JCQkJaWYgKGUub2JqZWN0ID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIGUuY291bnQ7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJaW50IGhhc2ggPSBvLmhhc2hDb2RlKCk7Ci0JCQlpbnQgaW5kZXggPSAoaGFzaCAmIDB4N0ZGRkZGRkYpICUgdGFiLmxlbmd0aDsKLQkJCWZvciAoRW50cnk8RT4gZSA9IHRhYltpbmRleF07IGUgIT0gbnVsbDsgZSA9IGUubmV4dCkgewotCQkJCWlmICgoZS5oYXNoID09IGhhc2gpICYmIG8uZXF1YWxzKGUub2JqZWN0KSkgewotCQkJCQlyZXR1cm4gZS5jb3VudDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCQotCS8qKgotCSAqIFJlaGFzaGVzIHRoZSBjb250ZW50cyBvZiB0aGlzIGJhZyBpbnRvIGEgbmV3IGhhc2ggdGFibGUKLQkgKiB3aXRoIGEgbGFyZ2VyIGNhcGFjaXR5LiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUKLQkgKiBudW1iZXIgb2YgZGlmZmVyZW50IGVsZW1lbnRzIGluIHRoaXMgbWFwIGV4Y2VlZHMgaXRzCi0JICogY2FwYWNpdHkgYW5kIGxvYWQgZmFjdG9yLgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgdm9pZCByZWhhc2goKSB7Ci0JCUVudHJ5PEU+W10gb2xkTWFwID0gdGhpcy50YWJsZTsKLQkJaW50IG9sZENhcGFjaXR5ID0gb2xkTWFwLmxlbmd0aDsKLQkKLQkJaW50IG5ld0NhcGFjaXR5ID0gb2xkQ2FwYWNpdHkgKiAyICsgMTsKLQkJRW50cnk8RT5bXSBuZXdNYXAgPSBuZXcgRW50cnlbbmV3Q2FwYWNpdHldOwotCQotCQl0aGlzLm1vZENvdW50Kys7Ci0JCXRoaXMudGhyZXNob2xkID0gKGludCkgKG5ld0NhcGFjaXR5ICogdGhpcy5sb2FkRmFjdG9yKTsKLQkJdGhpcy50YWJsZSA9IG5ld01hcDsKLQkKLQkJZm9yIChpbnQgaSA9IG9sZENhcGFjaXR5OyBpLS0gPiAwOyApIHsKLQkJCWZvciAoRW50cnk8RT4gb2xkID0gb2xkTWFwW2ldOyBvbGQgIT0gbnVsbDsgKSB7Ci0JCQkJRW50cnk8RT4gZSA9IG9sZDsKLQkJCQlvbGQgPSBvbGQubmV4dDsKLQkKLQkJCQlpbnQgaW5kZXggPSAoZS5oYXNoICYgMHg3RkZGRkZGRikgJSBuZXdDYXBhY2l0eTsKLQkJCQllLm5leHQgPSBuZXdNYXBbaW5kZXhdOwotCQkJCW5ld01hcFtpbmRleF0gPSBlOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gc2VhcmNoZXMgZm9yIHRoZSBvYmplY3QgaW4gdGhlIGhhc2ggdGFibGUgYnkgY2FsY3VsYXRpbmcKLQkgKiB0aGUgb2JqZWN0J3MgaGFzaCBjb2RlIGFuZCBleGFtaW5pbmcgdGhlIGVudHJpZXMgaW4gdGhlIGNvcnJlc3BvbmRpbmcgaGFzaAotCSAqIHRhYmxlIGJ1Y2tldC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgYm9vbGVhbiBhZGQoRSBvKSB7Ci0JCXRoaXMubW9kQ291bnQrKzsKLQkJRW50cnk8RT5bXSB0YWIgPSB0aGlzLnRhYmxlOwotCQlpbnQgaGFzaCA9IDA7Ci0JCWludCBpbmRleCA9IDA7Ci0JCi0JCS8vIGlmIHRoZSBvYmplY3QgaXMgYWxyZWFkeSBpbiB0aGUgYmFnLCBzaW1wbHkgYnVtcCBpdHMgY291bnQKLQkJaWYgKG8gPT0gbnVsbCkgewotCQkJZm9yIChFbnRyeTxFPiBlID0gdGFiWzBdOyBlICE9IG51bGw7IGUgPSBlLm5leHQpIHsKLQkJCQlpZiAoZS5vYmplY3QgPT0gbnVsbCkgewotCQkJCQllLmNvdW50Kys7Ci0JCQkJCXRoaXMuY291bnQrKzsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJaGFzaCA9IG8uaGFzaENvZGUoKTsKLQkJCWluZGV4ID0gKGhhc2ggJiAweDdGRkZGRkZGKSAlIHRhYi5sZW5ndGg7Ci0JCQlmb3IgKEVudHJ5PEU+IGUgPSB0YWJbaW5kZXhdOyBlICE9IG51bGw7IGUgPSBlLm5leHQpIHsKLQkJCQlpZiAoKGUuaGFzaCA9PSBoYXNoKSAmJiBvLmVxdWFscyhlLm9iamVjdCkpIHsKLQkJCQkJZS5jb3VudCsrOwotCQkJCQl0aGlzLmNvdW50Kys7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQotCQkvLyByZWhhc2ggdGhlIHRhYmxlIGlmIHRoZSB0aHJlc2hvbGQgaXMgZXhjZWVkZWQKLQkJaWYgKHRoaXMudW5pcXVlQ291bnQgPj0gdGhpcy50aHJlc2hvbGQpIHsKLQkJCXRoaXMucmVoYXNoKCk7Ci0JCQl0YWIgPSB0aGlzLnRhYmxlOwotCQkJaW5kZXggPSAoaGFzaCAmIDB4N0ZGRkZGRkYpICUgdGFiLmxlbmd0aDsKLQkJfQotCQotCQkvLyBjcmVhdGUgdGhlIG5ldyBlbnRyeSBhbmQgcHV0IGl0IGluIHRoZSB0YWJsZQotCQlFbnRyeTxFPiBlID0gbmV3IEVudHJ5KGhhc2gsIG8sIHRhYltpbmRleF0pOwotCQl0YWJbaW5kZXhdID0gZTsKLQkJdGhpcy5jb3VudCsrOwotCQl0aGlzLnVuaXF1ZUNvdW50Kys7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHNlYXJjaGVzIGZvciB0aGUgb2JqZWN0IGluIHRoZSBoYXNoIHRhYmxlIGJ5IGNhbGN1bGF0aW5nCi0JICogdGhlIG9iamVjdCdzIGhhc2ggY29kZSBhbmQgZXhhbWluaW5nIHRoZSBlbnRyaWVzIGluIHRoZSBjb3JyZXNwb25kaW5nIGhhc2gKLQkgKiB0YWJsZSBidWNrZXQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvKSB7Ci0JCUVudHJ5PEU+W10gdGFiID0gdGhpcy50YWJsZTsKLQkJaWYgKG8gPT0gbnVsbCkgewotCQkJZm9yIChFbnRyeTxFPiBlID0gdGFiWzBdLCBwcmV2ID0gbnVsbDsgZSAhPSBudWxsOyBwcmV2ID0gZSwgZSA9IGUubmV4dCkgewotCQkJCWlmIChlLm9iamVjdCA9PSBudWxsKSB7Ci0JCQkJCXRoaXMubW9kQ291bnQrKzsKLQkJCQkJZS5jb3VudC0tOwotCQkJCQkvLyBpZiB3ZSBhcmUgcmVtb3ZpbmcgdGhlIGxhc3Qgb25lLCByZW1vdmUgdGhlIGVudHJ5IGZyb20gdGhlIHRhYmxlCi0JCQkJCWlmIChlLmNvdW50ID09IDApIHsKLQkJCQkJCWlmIChwcmV2ID09IG51bGwpIHsKLQkJCQkJCQl0YWJbMF0gPSBlLm5leHQ7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXByZXYubmV4dCA9IGUubmV4dDsKLQkJCQkJCX0KLQkJCQkJCXRoaXMudW5pcXVlQ291bnQtLTsKLQkJCQkJfQotCQkJCQl0aGlzLmNvdW50LS07Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWludCBoYXNoID0gby5oYXNoQ29kZSgpOwotCQkJaW50IGluZGV4ID0gKGhhc2ggJiAweDdGRkZGRkZGKSAlIHRhYi5sZW5ndGg7Ci0JCQlmb3IgKEVudHJ5PEU+IGUgPSB0YWJbaW5kZXhdLCBwcmV2ID0gbnVsbDsgZSAhPSBudWxsOyBwcmV2ID0gZSwgZSA9IGUubmV4dCkgewotCQkJCWlmICgoZS5oYXNoID09IGhhc2gpICYmIG8uZXF1YWxzKGUub2JqZWN0KSkgewotCQkJCQl0aGlzLm1vZENvdW50Kys7Ci0JCQkJCWUuY291bnQtLTsKLQkJCQkJLy8gaWYgd2UgYXJlIHJlbW92aW5nIHRoZSBsYXN0IG9uZSwgcmVtb3ZlIHRoZSBlbnRyeSBmcm9tIHRoZSB0YWJsZQotCQkJCQlpZiAoZS5jb3VudCA9PSAwKSB7Ci0JCQkJCQlpZiAocHJldiA9PSBudWxsKSB7Ci0JCQkJCQkJdGFiW2luZGV4XSA9IGUubmV4dDsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJcHJldi5uZXh0ID0gZS5uZXh0OwotCQkJCQkJfQotCQkJCQkJdGhpcy51bmlxdWVDb3VudC0tOwotCQkJCQl9Ci0JCQkJCXRoaXMuY291bnQtLTsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzaW1wbHkgY2xlYXJzIG91dCBhbGwgb2YgdGhlIGhhc2ggdGFibGUgYnVja2V0cy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJRW50cnk8RT5bXSB0YWIgPSB0aGlzLnRhYmxlOwotCQl0aGlzLm1vZENvdW50Kys7Ci0JCWZvciAoaW50IGkgPSB0YWIubGVuZ3RoOyAtLWkgPj0gMDsgKSB7Ci0JCQl0YWJbaV0gPSBudWxsOwotCQl9Ci0JCXRoaXMuY291bnQgPSAwOwotCQl0aGlzLnVuaXF1ZUNvdW50ID0gMDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIHNoYWxsb3cgY29weSBvZiB0aGlzIGJhZzogdGhlIGVsZW1lbnRzCi0JICogdGhlbXNlbHZlcyBhcmUgbm90IGNsb25lZC4KLQkgKgotCSAqIEByZXR1cm4gYSBzaGFsbG93IGNvcHkgb2YgdGhpcyBiYWcuCi0JICovCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIEhhc2hCYWc8RT4gY2xvbmUoKSB7Ci0JCXRyeSB7Ci0JCQlIYXNoQmFnPEU+IGNsb25lID0gKEhhc2hCYWc8RT4pIHN1cGVyLmNsb25lKCk7Ci0JCQljbG9uZS50YWJsZSA9IG5ldyBFbnRyeVt0aGlzLnRhYmxlLmxlbmd0aF07Ci0JCQlmb3IgKGludCBpID0gdGhpcy50YWJsZS5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJCWNsb25lLnRhYmxlW2ldID0gKHRoaXMudGFibGVbaV0gPT0gbnVsbCkgCi0JCQkJCQk/IG51bGwgOiAoRW50cnkpIHRoaXMudGFibGVbaV0uY2xvbmUoKTsKLQkJCX0KLQkJCWNsb25lLm1vZENvdW50ID0gMDsKLQkJCXJldHVybiBjbG9uZTsKLQkJfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IEludGVybmFsRXJyb3IoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBIYXNoIHRhYmxlIGNvbGxpc2lvbiBsaXN0IGVudHJ5LgotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIEVudHJ5PEU+IHsKLQkJaW50IGhhc2g7Ci0JCUUgb2JqZWN0OwotCQlpbnQgY291bnQ7Ci0JCUVudHJ5PEU+IG5leHQ7Ci0JCi0JCUVudHJ5KGludCBoYXNoLCBFIG9iamVjdCwgRW50cnk8RT4gbmV4dCkgewotCQkJdGhpcyhoYXNoLCBvYmplY3QsIDEsIG5leHQpOwotCQl9Ci0JCi0JCXByaXZhdGUgRW50cnkoaW50IGhhc2gsIEUgb2JqZWN0LCBpbnQgY291bnQsIEVudHJ5PEU+IG5leHQpIHsKLQkJCXRoaXMuaGFzaCA9IGhhc2g7Ci0JCQl0aGlzLm9iamVjdCA9IG9iamVjdDsKLQkJCXRoaXMuY291bnQgPSBjb3VudDsKLQkJCXRoaXMubmV4dCA9IG5leHQ7Ci0JCX0KLQkKLQkJQE92ZXJyaWRlCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwcm90ZWN0ZWQgRW50cnk8RT4gY2xvbmUoKSB7Ci0JCQlyZXR1cm4gbmV3IEVudHJ5KHRoaXMuaGFzaCwgdGhpcy5vYmplY3QsIHRoaXMuY291bnQsCi0JCQkJCSh0aGlzLm5leHQgPT0gbnVsbCA/IG51bGwgOiB0aGlzLm5leHQuY2xvbmUoKSkpOwotCQl9Ci0JCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIHRoaXMub2JqZWN0ICsgIj0+IiArIHRoaXMuY291bnQ7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlpZiAodGhpcy5jb3VudCA9PSAwKSB7Ci0JCQlyZXR1cm4gRU1QVFlfSVRFUkFUT1I7Ci0JCX0KLQkJcmV0dXJuIG5ldyBIYXNoSXRlcmF0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gaXRlcmF0b3IgdGhhdCByZXR1cm5zIGVhY2ggaXRlbSBpbiB0aGUgYmFnCi0JICogb25jZSBhbmQgb25seSBvbmNlLCBpcnJlc3BlY3RpdmUgb2YgaG93IG1hbnkgdGltZXMKLQkgKiB0aGUgaXRlbSB3YXMgYWRkZWQgdG8gdGhlIGJhZy4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgSXRlcmF0b3I8RT4gdW5pcXVlSXRlcmF0b3IoKSB7Ci0JCWlmICh0aGlzLmNvdW50ID09IDApIHsKLQkJCXJldHVybiBFTVBUWV9JVEVSQVRPUjsKLQkJfQotCQlyZXR1cm4gbmV3IFVuaXF1ZUl0ZXJhdG9yKCk7Ci0JfQotCQotCS8qKgotCSAqIEVtcHR5IGl0ZXJhdG9yIHRoYXQgZG9lcyBqdXN0IGFib3V0IG5vdGhpbmcuCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSXRlcmF0b3IgRU1QVFlfSVRFUkFUT1IgPSBuZXcgRW1wdHlJdGVyYXRvcigpOwotCQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgc3RhdGljIGNsYXNzIEVtcHR5SXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvciB7Ci0KLQkJRW1wdHlJdGVyYXRvcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCi0JCXB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLQkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQkKLQkJcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgY2xhc3MgSGFzaEl0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3I8RT4gewotCQlFbnRyeTxFPltdIGxvY2FsVGFibGUgPSBIYXNoQmFnLnRoaXMudGFibGU7Ci0JCWludCBpbmRleCA9IHRoaXMubG9jYWxUYWJsZS5sZW5ndGg7CS8vIHN0YXJ0IGF0IHRoZSBlbmQgb2YgdGhlIHRhYmxlCi0JCUVudHJ5PEU+IG5leHRFbnRyeSA9IG51bGw7Ci0JCWludCBuZXh0RW50cnlDb3VudCA9IDA7Ci0JCUVudHJ5PEU+IGxhc3RSZXR1cm5lZEVudHJ5ID0gbnVsbDsKLQotCQkvKioKLQkJICogVGhlIG1vZENvdW50IHZhbHVlIHRoYXQgdGhlIGl0ZXJhdG9yIGJlbGlldmVzIHRoYXQgdGhlIGJhY2tpbmcKLQkJICogQmFnIHNob3VsZCBoYXZlLiBJZiB0aGlzIGV4cGVjdGF0aW9uIGlzIHZpb2xhdGVkLCB0aGUgaXRlcmF0b3IKLQkJICogaGFzIGRldGVjdGVkIGEgY29uY3VycmVudCBtb2RpZmljYXRpb24uCi0JCSAqLwotCQlwcml2YXRlIGludCBleHBlY3RlZE1vZENvdW50ID0gSGFzaEJhZy50aGlzLm1vZENvdW50OwotCi0JCUhhc2hJdGVyYXRvcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkJRW50cnk8RT4gZSA9IHRoaXMubmV4dEVudHJ5OwotCQkJaW50IGkgPSB0aGlzLmluZGV4OwotCQkJRW50cnk8RT5bXSB0YWIgPSB0aGlzLmxvY2FsVGFibGU7Ci0JCQkvLyBVc2UgbG9jYWxzIGZvciBmYXN0ZXIgbG9vcCBpdGVyYXRpb24KLQkJCXdoaWxlICgoZSA9PSBudWxsKSAmJiAoaSA+IDApKSB7Ci0JCQkJZSA9IHRhYlstLWldOwkJLy8gbW92ZSBiYWNrd2FyZHMgdGhyb3VnaCB0aGUgdGFibGUKLQkJCX0KLQkJCXRoaXMubmV4dEVudHJ5ID0gZTsKLQkJCXRoaXMuaW5kZXggPSBpOwotCQkJcmV0dXJuIGUgIT0gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBFIG5leHQoKSB7Ci0JCQlpZiAoSGFzaEJhZy50aGlzLm1vZENvdW50ICE9IHRoaXMuZXhwZWN0ZWRNb2RDb3VudCkgewotCQkJCXRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlFbnRyeTxFPiBldCA9IHRoaXMubmV4dEVudHJ5OwotCQkJaW50IGkgPSB0aGlzLmluZGV4OwotCQkJRW50cnk8RT5bXSB0YWIgPSB0aGlzLmxvY2FsVGFibGU7Ci0JCQkvLyBVc2UgbG9jYWxzIGZvciBmYXN0ZXIgbG9vcCBpdGVyYXRpb24KLQkJCXdoaWxlICgoZXQgPT0gbnVsbCkgJiYgKGkgPiAwKSkgewotCQkJCWV0ID0gdGFiWy0taV07CQkvLyBtb3ZlIGJhY2t3YXJkcyB0aHJvdWdoIHRoZSB0YWJsZQotCQkJfQotCQkJdGhpcy5uZXh0RW50cnkgPSBldDsKLQkJCXRoaXMuaW5kZXggPSBpOwotCQkJaWYgKGV0ID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCQkJfQotCQkJRW50cnk8RT4gZSA9IHRoaXMubGFzdFJldHVybmVkRW50cnkgPSB0aGlzLm5leHRFbnRyeTsKLQkJCXRoaXMubmV4dEVudHJ5Q291bnQrKzsKLQkJCWlmICh0aGlzLm5leHRFbnRyeUNvdW50ID09IGUuY291bnQpIHsKLQkJCQl0aGlzLm5leHRFbnRyeSA9IGUubmV4dDsKLQkJCQl0aGlzLm5leHRFbnRyeUNvdW50ID0gMDsKLQkJCX0KLQkJCXJldHVybiBlLm9iamVjdDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJCWlmICh0aGlzLmxhc3RSZXR1cm5lZEVudHJ5ID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlpZiAoSGFzaEJhZy50aGlzLm1vZENvdW50ICE9IHRoaXMuZXhwZWN0ZWRNb2RDb3VudCkgewotCQkJCXRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlFbnRyeTxFPltdIHRhYiA9IHRoaXMubG9jYWxUYWJsZTsKLQkJCWludCBzbG90ID0gKHRoaXMubGFzdFJldHVybmVkRW50cnkuaGFzaCAmIDB4N0ZGRkZGRkYpICUgdGFiLmxlbmd0aDsKLQkJCWZvciAoRW50cnk8RT4gZSA9IHRhYltzbG90XSwgcHJldiA9IG51bGw7IGUgIT0gbnVsbDsgcHJldiA9IGUsIGUgPSBlLm5leHQpIHsKLQkJCQlpZiAoZSA9PSB0aGlzLmxhc3RSZXR1cm5lZEVudHJ5KSB7Ci0JCQkJCUhhc2hCYWcudGhpcy5tb2RDb3VudCsrOwotCQkJCQl0aGlzLmV4cGVjdGVkTW9kQ291bnQrKzsKLQkJCQkJZS5jb3VudC0tOwotCQkJCQlpZiAoZS5jb3VudCA9PSAwKSB7Ci0JCQkJCQkvLyBpZiB3ZSBhcmUgcmVtb3ZpbmcgdGhlIGxhc3Qgb25lLCByZW1vdmUgdGhlIGVudHJ5IGZyb20gdGhlIHRhYmxlCi0JCQkJCQlpZiAocHJldiA9PSBudWxsKSB7Ci0JCQkJCQkJdGFiW3Nsb3RdID0gZS5uZXh0OwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlwcmV2Lm5leHQgPSBlLm5leHQ7Ci0JCQkJCQl9Ci0JCQkJCQlIYXNoQmFnLnRoaXMudW5pcXVlQ291bnQtLTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIHNsaWRlIGJhY2sgdGhlIGNvdW50IHRvIGFjY291bnQgZm9yIHRoZSBqdXN0LXJlbW92ZWQgZWxlbWVudAotCQkJCQkJdGhpcy5uZXh0RW50cnlDb3VudC0tOwotCQkJCQl9Ci0JCQkJCUhhc2hCYWcudGhpcy5jb3VudC0tOwotCQkJCQl0aGlzLmxhc3RSZXR1cm5lZEVudHJ5ID0gbnVsbDsJLy8gaXQgY2Fubm90IGJlIHJlbW92ZWQgYWdhaW4KLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCXRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQotCX0KLQkKLQkKLQlwcml2YXRlIGNsYXNzIFVuaXF1ZUl0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3I8RT4gewotCQlFbnRyeTxFPltdIGxvY2FsVGFibGUgPSBIYXNoQmFnLnRoaXMudGFibGU7Ci0JCWludCBpbmRleCA9IHRoaXMubG9jYWxUYWJsZS5sZW5ndGg7CS8vIHN0YXJ0IGF0IHRoZSBlbmQgb2YgdGhlIHRhYmxlCi0JCUVudHJ5PEU+IG5leHRFbnRyeSA9IG51bGw7Ci0JCUVudHJ5PEU+IGxhc3RSZXR1cm5lZEVudHJ5ID0gbnVsbDsKLQotCQkvKioKLQkJICogVGhlIG1vZENvdW50IHZhbHVlIHRoYXQgdGhlIGl0ZXJhdG9yIGJlbGlldmVzIHRoYXQgdGhlIGJhY2tpbmcKLQkJICogQmFnIHNob3VsZCBoYXZlLiBJZiB0aGlzIGV4cGVjdGF0aW9uIGlzIHZpb2xhdGVkLCB0aGUgaXRlcmF0b3IKLQkJICogaGFzIGRldGVjdGVkIGEgY29uY3VycmVudCBtb2RpZmljYXRpb24uCi0JCSAqLwotCQlwcml2YXRlIGludCBleHBlY3RlZE1vZENvdW50ID0gSGFzaEJhZy50aGlzLm1vZENvdW50OwotCi0JCVVuaXF1ZUl0ZXJhdG9yKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCQlFbnRyeTxFPiBlID0gdGhpcy5uZXh0RW50cnk7Ci0JCQlpbnQgaSA9IHRoaXMuaW5kZXg7Ci0JCQlFbnRyeTxFPltdIHRhYiA9IHRoaXMubG9jYWxUYWJsZTsKLQkJCS8vIFVzZSBsb2NhbHMgZm9yIGZhc3RlciBsb29wIGl0ZXJhdGlvbgotCQkJd2hpbGUgKChlID09IG51bGwpICYmIChpID4gMCkpIHsKLQkJCQllID0gdGFiWy0taV07CQkvLyBtb3ZlIGJhY2t3YXJkcyB0aHJvdWdoIHRoZSB0YWJsZQotCQkJfQotCQkJdGhpcy5uZXh0RW50cnkgPSBlOwotCQkJdGhpcy5pbmRleCA9IGk7Ci0JCQlyZXR1cm4gZSAhPSBudWxsOwotCQl9Ci0KLQkJcHVibGljIEUgbmV4dCgpIHsKLQkJCWlmIChIYXNoQmFnLnRoaXMubW9kQ291bnQgIT0gdGhpcy5leHBlY3RlZE1vZENvdW50KSB7Ci0JCQkJdGhyb3cgbmV3IENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24oKTsKLQkJCX0KLQkJCUVudHJ5PEU+IGV0ID0gdGhpcy5uZXh0RW50cnk7Ci0JCQlpbnQgaSA9IHRoaXMuaW5kZXg7Ci0JCQlFbnRyeTxFPltdIHRhYiA9IHRoaXMubG9jYWxUYWJsZTsKLQkJCS8vIFVzZSBsb2NhbHMgZm9yIGZhc3RlciBsb29wIGl0ZXJhdGlvbgotCQkJd2hpbGUgKChldCA9PSBudWxsKSAmJiAoaSA+IDApKSB7Ci0JCQkJZXQgPSB0YWJbLS1pXTsJCS8vIG1vdmUgYmFja3dhcmRzIHRocm91Z2ggdGhlIHRhYmxlCi0JCQl9Ci0JCQl0aGlzLm5leHRFbnRyeSA9IGV0OwotCQkJdGhpcy5pbmRleCA9IGk7Ci0JCQlpZiAoZXQgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlFbnRyeTxFPiBlID0gdGhpcy5sYXN0UmV0dXJuZWRFbnRyeSA9IHRoaXMubmV4dEVudHJ5OwotCQkJdGhpcy5uZXh0RW50cnkgPSBlLm5leHQ7Ci0JCQlyZXR1cm4gZS5vYmplY3Q7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCQlpZiAodGhpcy5sYXN0UmV0dXJuZWRFbnRyeSA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQkJfQotCQkJaWYgKEhhc2hCYWcudGhpcy5tb2RDb3VudCAhPSB0aGlzLmV4cGVjdGVkTW9kQ291bnQpIHsKLQkJCQl0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbigpOwotCQkJfQotCQkJRW50cnk8RT5bXSB0YWIgPSB0aGlzLmxvY2FsVGFibGU7Ci0JCQlpbnQgc2xvdCA9ICh0aGlzLmxhc3RSZXR1cm5lZEVudHJ5Lmhhc2ggJiAweDdGRkZGRkZGKSAlIHRhYi5sZW5ndGg7Ci0JCQlmb3IgKEVudHJ5PEU+IGUgPSB0YWJbc2xvdF0sIHByZXYgPSBudWxsOyBlICE9IG51bGw7IHByZXYgPSBlLCBlID0gZS5uZXh0KSB7Ci0JCQkJaWYgKGUgPT0gdGhpcy5sYXN0UmV0dXJuZWRFbnRyeSkgewotCQkJCQlIYXNoQmFnLnRoaXMubW9kQ291bnQrKzsKLQkJCQkJdGhpcy5leHBlY3RlZE1vZENvdW50Kys7Ci0JCQkJCS8vIHJlbW92ZSB0aGUgZW50cnkgZnJvbSB0aGUgdGFibGUKLQkJCQkJaWYgKHByZXYgPT0gbnVsbCkgewotCQkJCQkJdGFiW3Nsb3RdID0gZS5uZXh0OwotCQkJCQl9IGVsc2UgewotCQkJCQkJcHJldi5uZXh0ID0gZS5uZXh0OwotCQkJCQl9Ci0JCQkJCUhhc2hCYWcudGhpcy51bmlxdWVDb3VudC0tOwotCQkJCQlIYXNoQmFnLnRoaXMuY291bnQgLT0gdGhpcy5sYXN0UmV0dXJuZWRFbnRyeS5jb3VudDsKLQkJCQkJdGhpcy5sYXN0UmV0dXJuZWRFbnRyeSA9IG51bGw7CS8vIGl0IGNhbm5vdCBiZSByZW1vdmVkIGFnYWluCi0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQl0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0KLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCWlmIChvID09IHRoaXMpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmICggISAobyBpbnN0YW5jZW9mIEJhZykpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlCYWc8RT4gYiA9IChCYWc8RT4pIG87Ci0JCWlmIChiLnNpemUoKSAhPSB0aGlzLnNpemUoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCUJhZzxFPiBjbG9uZSA9IHRoaXMuY2xvbmUoKTsKLQkJZm9yIChFIGUgOiBiKSB7Ci0JCQlpZiAoICEgY2xvbmUucmVtb3ZlKGUpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiBjbG9uZS5pc0VtcHR5KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCWludCBoID0gMDsKLQkJZm9yIChJdGVyYXRvcjxFPiBzdHJlYW0gPSB0aGlzLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJT2JqZWN0IG5leHQgPSBzdHJlYW0ubmV4dCgpOwotCQkJaWYgKG5leHQgIT0gbnVsbCkgewotCQkJCWggKz0gbmV4dC5oYXNoQ29kZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBoOwotCX0KLQkKLQkvKioKLQkgKiBTYXZlIHRoZSBzdGF0ZSBvZiB0aGlzIGJhZyB0byBhIHN0cmVhbSAoaS5lLiBzZXJpYWxpemUgaXQpLgotCSAqCi0JICogQHNlcmlhbERhdGEgRW1pdCB0aGUgY2FwYWNpdHkgb2YgdGhlIGJhZyAoaW50KSwKLQkgKiAgICAgZm9sbG93ZWQgYnkgdGhlIG51bWJlciBvZiB1bmlxdWUgZWxlbWVudHMgaW4gdGhlIGJhZyAoaW50KSwKLQkgKiAgICAgZm9sbG93ZWQgYnkgYWxsIG9mIHRoZSBiYWcncyBlbGVtZW50cyAoZWFjaCBhbiBPYmplY3QpIGFuZAotCSAqICAgICB0aGVpciBjb3VudHMgKGVhY2ggYW4gaW50KSwgaW4gbm8gcGFydGljdWxhciBvcmRlci4KLQkgKi8KLQlwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHdyaXRlT2JqZWN0KGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtIHMpCi0JCQkJdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCQkvLyB3cml0ZSBvdXQgdGhlIHRocmVzaG9sZCwgbG9hZCBmYWN0b3IsIGFuZCBhbnkgaGlkZGVuIHN0dWZmCi0JCXMuZGVmYXVsdFdyaXRlT2JqZWN0KCk7Ci0JCi0JCS8vIHdyaXRlIG91dCBudW1iZXIgb2YgYnVja2V0cwotCQlzLndyaXRlSW50KHRoaXMudGFibGUubGVuZ3RoKTsKLQkKLQkJLy8gd3JpdGUgb3V0IG51bWJlciBvZiB1bmlxdWUgZWxlbWVudHMKLQkJcy53cml0ZUludCh0aGlzLnVuaXF1ZUNvdW50KTsKLQotCQlFbnRyeTxFPltdIHRhYiA9IHRoaXMudGFibGU7Ci0JCS8vIHdyaXRlIG91dCBlbGVtZW50cyBhbmQgY291bnRzIChhbHRlcm5hdGluZykKLQkJZm9yIChFbnRyeTxFPiBlbnRyeSA6IHRhYikgewotCQkJd2hpbGUgKGVudHJ5ICE9IG51bGwpIHsKLQkJCQlzLndyaXRlT2JqZWN0KGVudHJ5Lm9iamVjdCk7Ci0JCQkJcy53cml0ZUludChlbnRyeS5jb3VudCk7Ci0JCQkJZW50cnkgPSBlbnRyeS5uZXh0OwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQotCS8qKgotCSAqIFJlY29uc3RpdHV0ZSB0aGUgYmFnIGZyb20gYSBzdHJlYW0gKGkuZS4gZGVzZXJpYWxpemUgaXQpLgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgcmVhZE9iamVjdChqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtIHMpCi0JCQkJdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQkvLyByZWFkIGluIHRoZSB0aHJlc2hvbGQsIGxvYWRmYWN0b3IsIGFuZCBhbnkgaGlkZGVuIHN0dWZmCi0JCXMuZGVmYXVsdFJlYWRPYmplY3QoKTsKLQkKLQkJLy8gcmVhZCBpbiBudW1iZXIgb2YgYnVja2V0cyBhbmQgYWxsb2NhdGUgdGhlIGJ1Y2tldCBhcnJheQotCQl0aGlzLnRhYmxlID0gbmV3IEVudHJ5W3MucmVhZEludCgpXTsKLQkKLQkJLy8gcmVhZCBpbiBudW1iZXIgb2YgdW5pcXVlIGVsZW1lbnRzCi0JCWludCB1bmlxdWUgPSBzLnJlYWRJbnQoKTsKLQkKLQkJLy8gcmVhZCB0aGUgZWxlbWVudHMgYW5kIGNvdW50cywgYW5kIHB1dCB0aGUgZWxlbWVudHMgaW4gdGhlIGJhZwotCQlmb3IgKGludCBpID0gMDsgaSA8IHVuaXF1ZTsgaSsrKSB7Ci0JCQlFIGVsZW1lbnQgPSAoRSkgcy5yZWFkT2JqZWN0KCk7Ci0JCQlpbnQgZWxlbWVudENvdW50ID0gcy5yZWFkSW50KCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGVsZW1lbnRDb3VudDsgaisrKSB7Ci0JCQkJdGhpcy5hZGQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9JbmRlbnRpbmdQcmludFdyaXRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0luZGVudGluZ1ByaW50V3JpdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1MTBjODYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0luZGVudGluZ1ByaW50V3JpdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci0KLS8qKgotICogRXh0ZW5kIFByaW50V3JpdGVyIHRvIGF1dG9tYXRpY2FsbHkgaW5kZW50IG5ldyBsaW5lcy4KLSAqLwotcHVibGljIGNsYXNzIEluZGVudGluZ1ByaW50V3JpdGVyIGV4dGVuZHMgUHJpbnRXcml0ZXIgewotCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgaW5kZW50OwotCXByaXZhdGUgaW50IGluZGVudExldmVsOwotCXByaXZhdGUgYm9vbGVhbiBuZWVkc0luZGVudDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERFRkFVTFRfSU5ERU5UID0gIlx0IjsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgd3JpdGVyIHRoYXQgaW5kZW50cyB3aXRoIHRhYnMuCi0JICovCi0JcHVibGljIEluZGVudGluZ1ByaW50V3JpdGVyKFdyaXRlciBvdXQpIHsKLQkJdGhpcyhvdXQsIERFRkFVTFRfSU5ERU5UKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0IGEgd3JpdGVyIHRoYXQgaW5kZW50cyB3aXRoIHRoZSBzcGVjaWZpZWQgc3RyaW5nLgotCSAqLwotCXB1YmxpYyBJbmRlbnRpbmdQcmludFdyaXRlcihXcml0ZXIgb3V0LCBTdHJpbmcgaW5kZW50KSB7Ci0JCXN1cGVyKG91dCk7Ci0JCXRoaXMuaW5kZW50ID0gaW5kZW50OwotCQl0aGlzLmluZGVudExldmVsID0gMDsKLQkJdGhpcy5uZWVkc0luZGVudCA9IHRydWU7Ci0JfQotCQotCS8qKgotCSAqIFNldCBmbGFnIHNvIGZvbGxvd2luZyBsaW5lIGlzIGluZGVudGVkLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHByaW50bG4oKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5sb2NrKSB7Ci0JCQlzdXBlci5wcmludGxuKCk7Ci0JCQl0aGlzLm5lZWRzSW5kZW50ID0gdHJ1ZTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBQcmludCB0aGUgYXBwcm9wcmlhdGUgaW5kZW50LgotCSAqLwotCXByaXZhdGUgdm9pZCBwcmludEluZGVudCgpIHsKLQkJaWYgKHRoaXMubmVlZHNJbmRlbnQpIHsKLQkJCXRoaXMubmVlZHNJbmRlbnQgPSBmYWxzZTsKLQkJCWZvciAoaW50IGkgPSB0aGlzLmluZGVudExldmVsOyBpLS0gPiAwOyApIHsKLQkJCQl0aGlzLnByaW50KHRoaXMuaW5kZW50KTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBXcml0ZSBhIHBvcnRpb24gb2YgYW4gYXJyYXkgb2YgY2hhcmFjdGVycy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB3cml0ZShjaGFyIGJ1ZltdLCBpbnQgb2ZmLCBpbnQgbGVuKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5sb2NrKSB7Ci0JCQl0aGlzLnByaW50SW5kZW50KCk7Ci0JCQlzdXBlci53cml0ZShidWYsIG9mZiwgbGVuKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBXcml0ZSBhIHNpbmdsZSBjaGFyYWN0ZXIuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgd3JpdGUoaW50IGMpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLmxvY2spIHsKLQkJCXRoaXMucHJpbnRJbmRlbnQoKTsKLQkJCXN1cGVyLndyaXRlKGMpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFdyaXRlIGEgcG9ydGlvbiBvZiBhIHN0cmluZy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB3cml0ZShTdHJpbmcgcywgaW50IG9mZiwgaW50IGxlbikgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubG9jaykgewotCQkJdGhpcy5wcmludEluZGVudCgpOwotCQkJc3VwZXIud3JpdGUocywgb2ZmLCBsZW4pOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEJ1bXAgdGhlIGluZGVudCBsZXZlbC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBpbmRlbnQoKSB7Ci0JCXRoaXMuaW5jcmVtZW50SW5kZW50TGV2ZWwoKTsKLQl9Ci0JCi0JLyoqCi0JICogRGVjcmVtZW50IHRoZSBpbmRlbnQgbGV2ZWwuCi0JICovCi0JcHVibGljIHZvaWQgdW5kZW50KCkgewotCQl0aGlzLmRlY3JlbWVudEluZGVudExldmVsKCk7Ci0JfQotCQotCS8qKgotCSAqIEJ1bXAgdGhlIGluZGVudCBsZXZlbC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBpbmNyZW1lbnRJbmRlbnRMZXZlbCgpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLmxvY2spIHsKLQkJCXRoaXMuaW5kZW50TGV2ZWwrKzsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBEZWNyZW1lbnQgdGhlIGluZGVudCBsZXZlbC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWNyZW1lbnRJbmRlbnRMZXZlbCgpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLmxvY2spIHsKLQkJCXRoaXMuaW5kZW50TGV2ZWwtLTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGN1cnJlbnQgaW5kZW50IGxldmVsLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SW5kZW50TGV2ZWwoKSB7Ci0JCXJldHVybiB0aGlzLmluZGVudExldmVsOwotCX0KLQkKLQkvKioKLQkgKiBBbGxvdyB0aGUgaW5kZW50IGxldmVsIHRvIGJlIHNldCBkaXJlY3RseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbmRlbnRMZXZlbChpbnQgaW5kZW50TGV2ZWwpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLmxvY2spIHsKLQkJCXRoaXMuaW5kZW50TGV2ZWwgPSBpbmRlbnRMZXZlbDsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0pEQkNUb29scy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0pEQkNUb29scy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2M0ZjZkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9KREJDVG9vbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5zcWwuVHlwZXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLS8qKgotICogSGVscGVyIG1ldGhvZHMgZm9yIGRlYWxpbmcgd2l0aCB0aGUgSkRCQyBBUEkuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBKREJDVG9vbHN7Ci0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgSkRCQyB0eXBlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBAc2VlIGphdmEuc3FsLlR5cGVzCi0JICovCi0JcHVibGljIHN0YXRpYyBKREJDVHlwZSBqZGJjVHlwZUZvckNsYXNzTmFtZWQoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlKYXZhVG9KREJDVHlwZU1hcHBpbmcgbWFwcGluZyA9IGphdmFUb0pEQkNUeXBlTWFwcGluZyhjbGFzc05hbWUpOwotCQlyZXR1cm4gKG1hcHBpbmcgPT0gbnVsbCkgPyBERUZBVUxUX0pEQkNfVFlQRSA6IG1hcHBpbmcuZ2V0SkRCQ1R5cGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIEpEQkMgdHlwZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICogQHNlZSBqYXZhLnNxbC5UeXBlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSkRCQ1R5cGUgamRiY1R5cGVGb3IoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCXJldHVybiBqZGJjVHlwZUZvckNsYXNzTmFtZWQoamF2YUNsYXNzLmdldE5hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBKREJDIHR5cGUgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGNsYXNzLgotCSAqIEBzZWUgamF2YS5zcWwuVHlwZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpEQkNUeXBlIGpkYmNUeXBlRm9yKEphdmFUeXBlIGphdmFUeXBlKSB7Ci0JCXJldHVybiBqZGJjVHlwZUZvckNsYXNzTmFtZWQoamF2YVR5cGUuamF2YUNsYXNzTmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIEphdmEgdHlwZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgSkRCQyB0eXBlLgotCSAqIEBzZWUgamF2YS5zcWwuVHlwZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFUeXBlIGphdmFUeXBlRm9ySkRCQ1R5cGVOYW1lZChTdHJpbmcgamRiY1R5cGVOYW1lKSB7Ci0JCUpEQkNUb0phdmFUeXBlTWFwcGluZyBtYXBwaW5nID0gamRiY1RvSmF2YVR5cGVNYXBwaW5nKGpkYmNUeXBlTmFtZSk7Ci0JCXJldHVybiAobWFwcGluZyA9PSBudWxsKSA/IERFRkFVTFRfSkFWQV9UWVBFIDogbWFwcGluZy5nZXRKYXZhVHlwZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgSmF2YSB0eXBlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBKREJDIHR5cGUuCi0JICogQHNlZSBqYXZhLnNxbC5UeXBlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YVR5cGUgamF2YVR5cGVGb3IoSkRCQ1R5cGUgamRiY1R5cGUpIHsKLQkJcmV0dXJuIGphdmFUeXBlRm9ySkRCQ1R5cGVOYW1lZChqZGJjVHlwZS5nZXROYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgSmF2YSB0eXBlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBKREJDIHR5cGUuCi0JICogQHNlZSBqYXZhLnNxbC5UeXBlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YVR5cGUgamF2YVR5cGVGb3JKREJDVHlwZUNvZGUoaW50IGpkYmNUeXBlQ29kZSkgewotCQlyZXR1cm4gamF2YVR5cGVGb3IoSkRCQ1R5cGUudHlwZShqZGJjVHlwZUNvZGUpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgc3R1ZmYgKioqKioqKioqKgotCi0KLQkvLyAqKioqKioqKioqIEpEQkMgPT4gSmF2YSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBKREJDID0+IEphdmEgdHlwZSBtYXBwaW5ncywga2V5ZWQgYnkgSkRCQyB0eXBlIG5hbWUgKGUuZy4gIlZBUkNIQVIiKQotCSAqLwotCXByaXZhdGUgc3RhdGljIEhhc2hNYXA8U3RyaW5nLCBKREJDVG9KYXZhVHlwZU1hcHBpbmc+IEpEQkNfVE9fSkFWQV9UWVBFX01BUFBJTkdTOyAgLy8gcHNldWRvICdmaW5hbCcgLSBsYXp5LWluaXRpYWxpemVkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YVR5cGUgREVGQVVMVF9KQVZBX1RZUEUgPSBuZXcgSmF2YVR5cGUoamF2YS5sYW5nLk9iamVjdC5jbGFzcyk7ICAvLyBUT0RPIE9iamVjdCBpcyB0aGUgZGVmYXVsdD8KLQotCi0JcHJpdmF0ZSBzdGF0aWMgSkRCQ1RvSmF2YVR5cGVNYXBwaW5nIGpkYmNUb0phdmFUeXBlTWFwcGluZyhTdHJpbmcgamRiY1R5cGVOYW1lKSB7Ci0JCXJldHVybiBqZGJjVG9KYXZhVHlwZU1hcHBpbmdzKCkuZ2V0KGpkYmNUeXBlTmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIEhhc2hNYXA8U3RyaW5nLCBKREJDVG9KYXZhVHlwZU1hcHBpbmc+IGpkYmNUb0phdmFUeXBlTWFwcGluZ3MoKSB7Ci0JCWlmIChKREJDX1RPX0pBVkFfVFlQRV9NQVBQSU5HUyA9PSBudWxsKSB7Ci0JCQlKREJDX1RPX0pBVkFfVFlQRV9NQVBQSU5HUyA9IGJ1aWxkSkRCQ1RvSmF2YVR5cGVNYXBwaW5ncygpOwotCQl9Ci0JCXJldHVybiBKREJDX1RPX0pBVkFfVFlQRV9NQVBQSU5HUzsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBIYXNoTWFwPFN0cmluZywgSkRCQ1RvSmF2YVR5cGVNYXBwaW5nPiBidWlsZEpEQkNUb0phdmFUeXBlTWFwcGluZ3MoKSB7Ci0JCUhhc2hNYXA8U3RyaW5nLCBKREJDVG9KYXZhVHlwZU1hcHBpbmc+IG1hcHBpbmdzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBKREJDVG9KYXZhVHlwZU1hcHBpbmc+KCk7Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ3NUbyhtYXBwaW5ncyk7Ci0JCXJldHVybiBtYXBwaW5nczsKLQl9Ci0KLQkvKioKLQkgKiBoYXJkIGNvZGUgdGhlIGRlZmF1bHQgbWFwcGluZ3MgZnJvbSB0aGUgSkRCQyB0eXBlcyB0byB0aGUKLQkgKiBhcHByb3ByaWF0ZSBKYXZhIHR5cGVzCi0JICogQHNlZSBqYXZhLnNxbC5UeXBlcwotCSAqIHNlZSAiSkRCQyAzLjAgU3BlY2lmaWNhdGlvbiIgQXBwZW5kaXggQgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nc1RvKEhhc2hNYXA8U3RyaW5nLCBKREJDVG9KYXZhVHlwZU1hcHBpbmc+IG1hcHBpbmdzKSB7Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLkFSUkFZLCBqYXZhLnNxbC5BcnJheS5jbGFzcywgbWFwcGluZ3MpOwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5CSUdJTlQsIGxvbmcuY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuQklOQVJZLCBieXRlW10uY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuQklULCBib29sZWFuLmNsYXNzLCBtYXBwaW5ncyk7Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLkJMT0IsIGphdmEuc3FsLkJsb2IuY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuQk9PTEVBTiwgYm9vbGVhbi5jbGFzcywgbWFwcGluZ3MpOwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5DSEFSLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBtYXBwaW5ncyk7Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLkNMT0IsIGphdmEuc3FsLkNsb2IuY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuREFUQUxJTkssIGphdmEubmV0LlVSTC5jbGFzcywgbWFwcGluZ3MpOwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5EQVRFLCBqYXZhLnNxbC5EYXRlLmNsYXNzLCBtYXBwaW5ncyk7Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLkRFQ0lNQUwsIGphdmEubWF0aC5CaWdEZWNpbWFsLmNsYXNzLCBtYXBwaW5ncyk7Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLkRJU1RJTkNULCBqYXZhLmxhbmcuT2JqZWN0LmNsYXNzLCBtYXBwaW5ncyk7ICAvLyA/Pz8KLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuRE9VQkxFLCBkb3VibGUuY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuRkxPQVQsIGRvdWJsZS5jbGFzcywgbWFwcGluZ3MpOwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5JTlRFR0VSLCBpbnQuY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuSkFWQV9PQkpFQ1QsIGphdmEubGFuZy5PYmplY3QuY2xhc3MsIG1hcHBpbmdzKTsgIC8vID8/PwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5MT05HVkFSQklOQVJZLCBieXRlW10uY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuTE9OR1ZBUkNIQVIsIGphdmEubGFuZy5TdHJpbmcuY2xhc3MsIG1hcHBpbmdzKTsKLQkJLy8gbm90IHN1cmUgd2h5IHRoaXMgaXMgZGVmaW5lZCBpbiBqYXZhLnNxbC5UeXBlcwotLy8JCWFkZEpEQkNNYXBwaW5nVG8oVHlwZXMuTlVMTCwgamF2YS5sYW5nLk9iamVjdC5jbGFzcywgbWFwcGluZ3MpOwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5OVU1FUklDLCBqYXZhLm1hdGguQmlnRGVjaW1hbC5jbGFzcywgbWFwcGluZ3MpOwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5PVEhFUiwgamF2YS5sYW5nLk9iamVjdC5jbGFzcywgbWFwcGluZ3MpOwkvLyA/Pz8KLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuUkVBTCwgZmxvYXQuY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuUkVGLCBqYXZhLnNxbC5SZWYuY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuU01BTExJTlQsIHNob3J0LmNsYXNzLCBtYXBwaW5ncyk7Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLlNUUlVDVCwgamF2YS5zcWwuU3RydWN0LmNsYXNzLCBtYXBwaW5ncyk7Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLlRJTUUsIGphdmEuc3FsLlRpbWUuY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuVElNRVNUQU1QLCBqYXZhLnNxbC5UaW1lc3RhbXAuY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuVElOWUlOVCwgYnl0ZS5jbGFzcywgbWFwcGluZ3MpOwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5WQVJCSU5BUlksIGJ5dGVbXS5jbGFzcywgbWFwcGluZ3MpOwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5WQVJDSEFSLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBtYXBwaW5ncyk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhpbnQgamRiY1R5cGVDb2RlLCBDbGFzczw/PiBqYXZhQ2xhc3MsIEhhc2hNYXA8U3RyaW5nLCBKREJDVG9KYXZhVHlwZU1hcHBpbmc+IG1hcHBpbmdzKSB7Ci0JCS8vIGNoZWNrIGZvciBkdXBsaWNhdGVzCi0JCUpEQkNUeXBlIGpkYmNUeXBlID0gSkRCQ1R5cGUudHlwZShqZGJjVHlwZUNvZGUpOwotCQlPYmplY3QgcHJldiA9IG1hcHBpbmdzLnB1dChqZGJjVHlwZS5nZXROYW1lKCksIGJ1aWxkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nKGpkYmNUeXBlLCBqYXZhQ2xhc3MpKTsKLQkJaWYgKHByZXYgIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZHVwbGljYXRlIEpEQkMgdHlwZTogIiArIGpkYmNUeXBlLmdldE5hbWUoKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBKREJDVG9KYXZhVHlwZU1hcHBpbmcgYnVpbGRKREJDVG9KYXZhVHlwZU1hcHBpbmcoSkRCQ1R5cGUgamRiY1R5cGUsIENsYXNzPD8+IGphdmFDbGFzcykgewotCQlyZXR1cm4gbmV3IEpEQkNUb0phdmFUeXBlTWFwcGluZyhqZGJjVHlwZSwgbmV3IEphdmFUeXBlKGphdmFDbGFzcykpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKYXZhID0+IEpEQkMgKioqKioqKioqKgotCi0JLyoqCi0JICogSmF2YSA9PiBKREJDIHR5cGUgbWFwcGluZ3MsIGtleWVkIGJ5IEphdmEgY2xhc3MgbmFtZSAoZS5nLiAiamF2YS5sYW5nLk9iamVjdCIpCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIEphdmFUb0pEQkNUeXBlTWFwcGluZz4gSkFWQV9UT19KREJDX1RZUEVfTUFQUElOR1M7ICAvLyBwc2V1ZG8gJ2ZpbmFsJyAtIGxhenktaW5pdGlhbGl6ZWQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKREJDVHlwZSBERUZBVUxUX0pEQkNfVFlQRSA9IEpEQkNUeXBlLnR5cGUoVHlwZXMuVkFSQ0hBUik7ICAvLyBUT0RPIFZBUkNIQVIgaXMgdGhlIGRlZmF1bHQ/Ci0KLQotCXByaXZhdGUgc3RhdGljIEphdmFUb0pEQkNUeXBlTWFwcGluZyBqYXZhVG9KREJDVHlwZU1hcHBpbmcoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gamF2YVRvSkRCQ1R5cGVNYXBwaW5ncygpLmdldChjbGFzc05hbWUpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCBIYXNoTWFwPFN0cmluZywgSmF2YVRvSkRCQ1R5cGVNYXBwaW5nPiBqYXZhVG9KREJDVHlwZU1hcHBpbmdzKCkgewotCQlpZiAoSkFWQV9UT19KREJDX1RZUEVfTUFQUElOR1MgPT0gbnVsbCkgewotCQkJSkFWQV9UT19KREJDX1RZUEVfTUFQUElOR1MgPSBidWlsZEphdmFUb0pEQkNUeXBlTWFwcGluZ3MoKTsKLQkJfQotCQlyZXR1cm4gSkFWQV9UT19KREJDX1RZUEVfTUFQUElOR1M7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIEphdmFUb0pEQkNUeXBlTWFwcGluZz4gYnVpbGRKYXZhVG9KREJDVHlwZU1hcHBpbmdzKCkgewotCQlIYXNoTWFwPFN0cmluZywgSmF2YVRvSkRCQ1R5cGVNYXBwaW5nPiBtYXBwaW5ncyA9IG5ldyBIYXNoTWFwPFN0cmluZywgSmF2YVRvSkRCQ1R5cGVNYXBwaW5nPigpOwotCQlhZGRKYXZhVG9KREJDVHlwZU1hcHBpbmdzVG8obWFwcGluZ3MpOwotCQlyZXR1cm4gbWFwcGluZ3M7Ci0JfQotCi0JLyoqCi0JICogaGFyZCBjb2RlIHRoZSBkZWZhdWx0IG1hcHBpbmdzIGZyb20gdGhlIEphdmEgdHlwZXMgdG8gdGhlCi0JICogYXBwcm9wcmlhdGUgSkRCQyB0eXBlcwotCSAqIEBzZWUgamF2YS5zcWwuVHlwZXMKLQkgKiBzZWUgIkpEQkMgMy4wIFNwZWNpZmljYXRpb24iIEFwcGVuZGl4IEIKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ3NUbyhIYXNoTWFwPFN0cmluZywgSmF2YVRvSkRCQ1R5cGVNYXBwaW5nPiBtYXBwaW5ncykgewotCQkvLyBwcmltaXRpdmVzCi0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGJvb2xlYW4uY2xhc3MsIFR5cGVzLkJJVCwgbWFwcGluZ3MpOwotCQlhZGRKYXZhVG9KREJDVHlwZU1hcHBpbmdUbyhieXRlLmNsYXNzLCBUeXBlcy5USU5ZSU5ULCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGRvdWJsZS5jbGFzcywgVHlwZXMuRE9VQkxFLCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGZsb2F0LmNsYXNzLCBUeXBlcy5SRUFMLCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGludC5jbGFzcywgVHlwZXMuSU5URUdFUiwgbWFwcGluZ3MpOwotCQlhZGRKYXZhVG9KREJDVHlwZU1hcHBpbmdUbyhsb25nLmNsYXNzLCBUeXBlcy5CSUdJTlQsIG1hcHBpbmdzKTsKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oc2hvcnQuY2xhc3MsIFR5cGVzLlNNQUxMSU5ULCBtYXBwaW5ncyk7Ci0KLQkJLy8gcmVmZXJlbmNlIGNsYXNzZXMKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oamF2YS5sYW5nLkJvb2xlYW4uY2xhc3MsIFR5cGVzLkJJVCwgbWFwcGluZ3MpOwotCQlhZGRKYXZhVG9KREJDVHlwZU1hcHBpbmdUbyhqYXZhLmxhbmcuQnl0ZS5jbGFzcywgVHlwZXMuVElOWUlOVCwgbWFwcGluZ3MpOwotCQlhZGRKYXZhVG9KREJDVHlwZU1hcHBpbmdUbyhqYXZhLmxhbmcuRG91YmxlLmNsYXNzLCBUeXBlcy5ET1VCTEUsIG1hcHBpbmdzKTsKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oamF2YS5sYW5nLkZsb2F0LmNsYXNzLCBUeXBlcy5SRUFMLCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGphdmEubGFuZy5JbnRlZ2VyLmNsYXNzLCBUeXBlcy5JTlRFR0VSLCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGphdmEubGFuZy5Mb25nLmNsYXNzLCBUeXBlcy5CSUdJTlQsIG1hcHBpbmdzKTsKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oamF2YS5sYW5nLlNob3J0LmNsYXNzLCBUeXBlcy5TTUFMTElOVCwgbWFwcGluZ3MpOwotCQlhZGRKYXZhVG9KREJDVHlwZU1hcHBpbmdUbyhqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBUeXBlcy5WQVJDSEFSLCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGphdmEubWF0aC5CaWdEZWNpbWFsLmNsYXNzLCBUeXBlcy5OVU1FUklDLCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGphdmEubmV0LlVSTC5jbGFzcywgVHlwZXMuREFUQUxJTkssIG1hcHBpbmdzKTsKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oamF2YS5zcWwuQXJyYXkuY2xhc3MsIFR5cGVzLkFSUkFZLCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGphdmEuc3FsLkJsb2IuY2xhc3MsIFR5cGVzLkJMT0IsIG1hcHBpbmdzKTsKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oamF2YS5zcWwuQ2xvYi5jbGFzcywgVHlwZXMuQ0xPQiwgbWFwcGluZ3MpOwotCQlhZGRKYXZhVG9KREJDVHlwZU1hcHBpbmdUbyhqYXZhLnNxbC5EYXRlLmNsYXNzLCBUeXBlcy5EQVRFLCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGphdmEuc3FsLlJlZi5jbGFzcywgVHlwZXMuUkVGLCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGphdmEuc3FsLlN0cnVjdC5jbGFzcywgVHlwZXMuU1RSVUNULCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGphdmEuc3FsLlRpbWUuY2xhc3MsIFR5cGVzLlRJTUUsIG1hcHBpbmdzKTsKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oamF2YS5zcWwuVGltZXN0YW1wLmNsYXNzLCBUeXBlcy5USU1FU1RBTVAsIG1hcHBpbmdzKTsKLQotCQkvLyBhcnJheXMKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oYnl0ZVtdLmNsYXNzLCBUeXBlcy5WQVJCSU5BUlksIG1hcHBpbmdzKTsKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oamF2YS5sYW5nLkJ5dGVbXS5jbGFzcywgVHlwZXMuVkFSQklOQVJZLCBtYXBwaW5ncyk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRKYXZhVG9KREJDVHlwZU1hcHBpbmdUbyhDbGFzczw/PiBqYXZhQ2xhc3MsIGludCBqZGJjVHlwZUNvZGUsIEhhc2hNYXA8U3RyaW5nLCBKYXZhVG9KREJDVHlwZU1hcHBpbmc+IG1hcHBpbmdzKSB7Ci0JCS8vIGNoZWNrIGZvciBkdXBsaWNhdGVzCi0JCU9iamVjdCBwcmV2ID0gbWFwcGluZ3MucHV0KGphdmFDbGFzcy5nZXROYW1lKCksIGJ1aWxkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nKGphdmFDbGFzcywgamRiY1R5cGVDb2RlKSk7Ci0JCWlmIChwcmV2ICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImR1cGxpY2F0ZSBKYXZhIGNsYXNzOiAiICsgKChKYXZhVG9KREJDVHlwZU1hcHBpbmcpIHByZXYpLmdldEphdmFUeXBlKCkuZGVjbGFyYXRpb24oKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBKYXZhVG9KREJDVHlwZU1hcHBpbmcgYnVpbGRKYXZhVG9KREJDVHlwZU1hcHBpbmcoQ2xhc3M8Pz4gamF2YUNsYXNzLCBpbnQgamRiY1R5cGVDb2RlKSB7Ci0JCXJldHVybiBuZXcgSmF2YVRvSkRCQ1R5cGVNYXBwaW5nKG5ldyBKYXZhVHlwZShqYXZhQ2xhc3MpLCBKREJDVHlwZS50eXBlKGpkYmNUeXBlQ29kZSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdXBwcmVzcyBkZWZhdWx0IGNvbnN0cnVjdG9yLCBlbnN1cmluZyBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgSkRCQ1Rvb2xzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWVtYmVyIGNsYXNzZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogSkRCQyA9PiBKYXZhCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSkRCQ1RvSmF2YVR5cGVNYXBwaW5nIHsKLQkJcHJpdmF0ZSBmaW5hbCBKREJDVHlwZSBqZGJjVHlwZTsKLQkJcHJpdmF0ZSBmaW5hbCBKYXZhVHlwZSBqYXZhVHlwZTsKLQotCQlKREJDVG9KYXZhVHlwZU1hcHBpbmcoSkRCQ1R5cGUgamRiY1R5cGUsIEphdmFUeXBlIGphdmFUeXBlKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5qZGJjVHlwZSA9IGpkYmNUeXBlOwotCQkJdGhpcy5qYXZhVHlwZSA9IGphdmFUeXBlOwotCQl9Ci0KLQkJcHVibGljIEpEQkNUeXBlIGdldEpEQkNUeXBlKCkgewotCQkJcmV0dXJuIHRoaXMuamRiY1R5cGU7Ci0JCX0KLQotCQlwdWJsaWMgSmF2YVR5cGUgZ2V0SmF2YVR5cGUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5qYXZhVHlwZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIG1hcHMoaW50IGpkYmNUeXBlQ29kZSkgewotCQkJcmV0dXJuIHRoaXMuamRiY1R5cGUuZ2V0Q29kZSgpID09IGpkYmNUeXBlQ29kZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIG1hcHMoU3RyaW5nIGpkYmNUeXBlTmFtZSkgewotCQkJcmV0dXJuIHRoaXMuamRiY1R5cGUuZ2V0TmFtZSgpLmVxdWFscyhqZGJjVHlwZU5hbWUpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gbWFwcyhKREJDVHlwZSB0eXBlKSB7Ci0JCQlyZXR1cm4gdGhpcy5qZGJjVHlwZSA9PSB0eXBlOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQl0aGlzLmFwcGVuZFRvKHNiKTsKLQkJCXJldHVybiBzYi50b1N0cmluZygpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgYXBwZW5kVG8oU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCQl0aGlzLmpkYmNUeXBlLmFwcGVuZFRvKHNiKTsKLQkJCXNiLmFwcGVuZCgiID0+ICIpOwotCQkJdGhpcy5qYXZhVHlwZS5hcHBlbmREZWNsYXJhdGlvblRvKHNiKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogSmF2YSA9PiBKREJDCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSmF2YVRvSkRCQ1R5cGVNYXBwaW5nIHsKLQkJcHJpdmF0ZSBmaW5hbCBKYXZhVHlwZSBqYXZhVHlwZTsKLQkJcHJpdmF0ZSBmaW5hbCBKREJDVHlwZSBqZGJjVHlwZTsKLQotCQlKYXZhVG9KREJDVHlwZU1hcHBpbmcoSmF2YVR5cGUgamF2YVR5cGUsIEpEQkNUeXBlIGpkYmNUeXBlKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5qYXZhVHlwZSA9IGphdmFUeXBlOwotCQkJdGhpcy5qZGJjVHlwZSA9IGpkYmNUeXBlOwotCQl9Ci0KLQkJcHVibGljIEphdmFUeXBlIGdldEphdmFUeXBlKCkgewotCQkJcmV0dXJuIHRoaXMuamF2YVR5cGU7Ci0JCX0KLQotCQlwdWJsaWMgSkRCQ1R5cGUgZ2V0SkRCQ1R5cGUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5qZGJjVHlwZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIG1hcHMoSmF2YVR5cGUganQpIHsKLQkJCXJldHVybiB0aGlzLmphdmFUeXBlLmVxdWFscyhqdCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBtYXBzKFN0cmluZyBlbGVtZW50VHlwZU5hbWUsIGludCBhcnJheURlcHRoKSB7Ci0JCQlyZXR1cm4gdGhpcy5qYXZhVHlwZS5lcXVhbHMoZWxlbWVudFR5cGVOYW1lLCBhcnJheURlcHRoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIG1hcHMoU3RyaW5nIGphdmFDbGFzc05hbWUpIHsKLQkJCXJldHVybiB0aGlzLmphdmFUeXBlLmRlc2NyaWJlcyhqYXZhQ2xhc3NOYW1lKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIG1hcHMoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCQlyZXR1cm4gdGhpcy5qYXZhVHlwZS5kZXNjcmliZXMoamF2YUNsYXNzKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJdGhpcy5hcHBlbmRUbyhzYik7Ci0JCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFwcGVuZFRvKFN0cmluZ0J1ZmZlciBzYikgewotCQkJdGhpcy5qYXZhVHlwZS5hcHBlbmREZWNsYXJhdGlvblRvKHNiKTsKLQkJCXNiLmFwcGVuZCgiID0+ICIpOwotCQkJdGhpcy5qZGJjVHlwZS5hcHBlbmRUbyhzYik7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0pEQkNUeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvSkRCQ1R5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNjZWExMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvSkRCQ1R5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci1pbXBvcnQgamF2YS5zcWwuVHlwZXM7Ci1pbXBvcnQgamF2YS50ZXh0LkNvbGxhdG9yOwotCi0vKioKLSAqIEFzc29jaWF0ZSB0aGUgSmF2YSBjb25zdGFudCBhbmQgdGhlIEpEQkMgdHlwZSBuYW1lLgotICogVGhlc2UgYXJlIGRlcml2ZWQgZnJvbSBqYXZhLnNxbC5UeXBlcy4KLSAqIAotICogQHNlZSBqYXZhLnNxbC5UeXBlcwotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgSkRCQ1R5cGUKLQlpbXBsZW1lbnRzIENvbXBhcmFibGU8SkRCQ1R5cGU+LCBDbG9uZWFibGUsIFNlcmlhbGl6YWJsZQotewotCi0JLyoqCi0JICogdGhlIGNvbnN0YW50IG5hbWUgKGUuZy4gVkFSQ0hBUikKLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwotCi0JLyoqCi0JICogdGhlIEpEQkMgY29kZSB1c2VkIGJ5IEpEQkMgZHJpdmVycwotCSAqLwotCXByaXZhdGUgZmluYWwgaW50IGNvZGU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgSkRCQyB0eXBlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGFuZCB0eXBlIGNvZGUuCi0JICogVGhpcyBpcyBwcml2YXRlIGJlY2F1c2UgYWxsIHRoZSBwb3NzaWJsZSBKREJDIHR5cGVzIGFyZSBidWlsdCBhbmQKLQkgKiBzdG9yZWQgaW4gdGhlIHN0YXRpYyBhcnJheSBUWVBFUy4KLQkgKiBAc2VlICN0eXBlcygpCi0JICovCi0JcHJpdmF0ZSBKREJDVHlwZShTdHJpbmcgbmFtZSwgaW50IGNvZGUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5jb2RlID0gY29kZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWNjZXNzb3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgdHlwZSwgYXMgZGVmaW5lZCBpbiBqYXZhLnNxbC5UeXBlcy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWU7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHR5cGUgY29kZSwgYXMgZGVmaW5lZCBpbiBqYXZhLnNxbC5UeXBlcy4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvZGUoKSB7Ci0JCXJldHVybiB0aGlzLmNvZGU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHByaW50aW5nIGFuZCBkaXNwbGF5aW5nICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIGFwcGVuZFRvKFN0cmluZ0J1ZmZlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5uYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXNiLmFwcGVuZChDbGFzc1Rvb2xzLnNob3J0Q2xhc3NOYW1lRm9yT2JqZWN0KHRoaXMpKTsKLQkJc2IuYXBwZW5kKCcoJyk7Ci0JCXRoaXMuYXBwZW5kVG8oc2IpOwotCQlzYi5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEpEQkNUeXBlIGNsb25lKCkgewotCQl0cnkgewotCQkJcmV0dXJuIChKREJDVHlwZSkgc3VwZXIuY2xvbmUoKTsKLQkJfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBJbnRlcm5hbEVycm9yKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgaW50IGNvbXBhcmVUbyhKREJDVHlwZSB0eXBlKSB7Ci0JCXJldHVybiBDb2xsYXRvci5nZXRJbnN0YW5jZSgpLmNvbXBhcmUodGhpcy5uYW1lLCB0eXBlLm5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgc3R1ZmYgKioqKioqKioqKgotCi0JLyoqCi0JICogYWxsIHRoZSBKREJDIHR5cGUgZGVmaW5lZCBpbiBqYXZhLnNxbC5UeXBlcwotCSAqLwotCXByaXZhdGUgc3RhdGljIEpEQkNUeXBlW10gVFlQRVM7CQkvLyBwc2V1ZG8gJ2ZpbmFsJyAtIGxhenktaW5pdGlhbGl6ZWQKLQotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgSkRCQ1R5cGVbXSB0eXBlcygpIHsKLQkJaWYgKFRZUEVTID09IG51bGwpIHsKLQkJCVRZUEVTID0gYnVpbGRUeXBlcygpOwotCQl9Ci0JCXJldHVybiBUWVBFUzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIEpEQkMgdHlwZSBmb3IgdGhlIHNwZWNpZmllZCB0eXBlIGNvZGUgKGUuZy4gVHlwZXMuVkFSQ0hBUikuCi0JICogQHNlZSBqYXZhLnNxbC5UeXBlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSkRCQ1R5cGUgdHlwZShpbnQgY29kZSkgewotCQlKREJDVHlwZVtdIHR5cGVzID0gdHlwZXMoKTsKLQkJZm9yIChpbnQgaSA9IHR5cGVzLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlpZiAodHlwZXNbaV0uZ2V0Q29kZSgpID09IGNvZGUpIHsKLQkJCQlyZXR1cm4gdHlwZXNbaV07Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBKREJDIHR5cGUgY29kZTogIiArIGNvZGUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgSkRCQyB0eXBlIGZvciB0aGUgc3BlY2lmaWVkIHR5cGUgbmFtZSAoZS5nLiAiVkFSQ0hBUiIpLgotCSAqIEBzZWUgamF2YS5zcWwuVHlwZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpEQkNUeXBlIHR5cGUoU3RyaW5nIG5hbWUpIHsKLQkJSkRCQ1R5cGVbXSB0eXBlcyA9IHR5cGVzKCk7Ci0JCWZvciAoaW50IGkgPSB0eXBlcy5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaWYgKHR5cGVzW2ldLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gdHlwZXNbaV07Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBKREJDIHR5cGUgbmFtZTogIiArIG5hbWUpOwotCX0KLQotCS8qKgotCSAqIGJ1aWxkIHVwIHRoZSBKREJDIHR5cGVzIHZpYSByZWZsZWN0aW9uCi0JICogQHNlZSBqYXZhLnNxbC5UeXBlcwotCSAqLwotCXByaXZhdGUgc3RhdGljIEpEQkNUeXBlW10gYnVpbGRUeXBlcygpIHsKLQkJRmllbGRbXSBmaWVsZHMgPSBUeXBlcy5jbGFzcy5nZXREZWNsYXJlZEZpZWxkcygpOwotCQlpbnQgbGVuID0gZmllbGRzLmxlbmd0aDsKLQkJSkRCQ1R5cGVbXSB0eXBlcyA9IG5ldyBKREJDVHlwZVtsZW5dOwotCQlmb3IgKGludCBpID0gbGVuOyBpLS0gPiAwOyApIHsKLQkJCVN0cmluZyBuYW1lID0gZmllbGRzW2ldLmdldE5hbWUoKTsKLQkJCWludCBjb2RlOwotCQkJdHJ5IHsKLQkJCQljb2RlID0gKChJbnRlZ2VyKSBmaWVsZHNbaV0uZ2V0KG51bGwpKS5pbnRWYWx1ZSgpOwotCQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBleCkgewotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsJLy8gc2hvdWxkbid0IGhhcHBlbi4uLgotCQkJfQotCQkJdHlwZXNbaV0gPSBuZXcgSkRCQ1R5cGUobmFtZSwgY29kZSk7Ci0JCX0KLQkJcmV0dXJuIHR5cGVzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL0phdmFUeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvSmF2YVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgyY2RhNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvSmF2YVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnRleHQuQ29sbGF0b3I7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBkZXNjcmliZXMgYSBKYXZhIHR5cGU7IGkuZS4gaXRzICJlbGVtZW50IHR5cGUiCi0gKiBhbmQgaXRzICJhcnJheSBkZXB0aCIuIFRoZSBlbGVtZW50IHR5cGUgaXMgcmVmZXJlbmNlZCBieSBuYW1lLAotICogYWxsb3dpbmcgdXMgdG8gcmVmZXJlbmNlIGNsYXNzZXMgdGhhdCBhcmUgbm90IChvciBjYW5ub3QgYmUpIGxvYWRlZC4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEphdmFUeXBlCi0JaW1wbGVtZW50cyBDb21wYXJhYmxlPEphdmFUeXBlPiwgQ2xvbmVhYmxlLCBTZXJpYWxpemFibGUKLXsKLQotCS8qKgotCSAqIHN0b3JlIHRoZSB0eXBlIGFzIGEgbmFtZSwgc28gd2UgY2FuIHJlZmVyZW5jZSBjbGFzc2VzCi0JICogdGhhdCBhcmUgbm90IGxvYWRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIGVsZW1lbnRUeXBlTmFtZTsKLQotCS8qKgotCSAqIG5vbi1hcnJheSB0eXBlcyBoYXZlIGFuIGFycmF5IGRlcHRoIG9mIHplcm8KLQkgKi8KLQlwcml2YXRlIGZpbmFsIGludCBhcnJheURlcHRoOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIEphdmEgdHlwZSB3aXRoIHRoZSBzcGVjaWZpZWQgZWxlbWVudCB0eXBlIGFuZCBhcnJheSBkZXB0aC4KLQkgKi8KLQlwdWJsaWMgSmF2YVR5cGUoU3RyaW5nIGVsZW1lbnRUeXBlTmFtZSwgaW50IGFycmF5RGVwdGgpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKChlbGVtZW50VHlwZU5hbWUgPT0gbnVsbCkgfHwgKGVsZW1lbnRUeXBlTmFtZS5sZW5ndGgoKSA9PSAwKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGVsZW1lbnQgdHlwZSBuYW1lIGlzIHJlcXVpcmVkLiIpOwotCQl9Ci0JCWlmIChDbGFzc1Rvb2xzLmFycmF5RGVwdGhGb3JDbGFzc05hbWVkKGVsZW1lbnRUeXBlTmFtZSkgIT0gMCkgewkJLy8gZS5nLiAiW0xqYXZhLmxhbmcuT2JqZWN0OyIKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBlbGVtZW50IHR5cGUgbXVzdCBub3QgYmUgYW4gYXJyYXk6ICIgKyBlbGVtZW50VHlwZU5hbWUgKyAnLicpOwotCQl9Ci0JCWlmIChhcnJheURlcHRoIDwgMCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGFycmF5IGRlcHRoIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHplcm86ICIgKyBhcnJheURlcHRoICsgJy4nKTsKLQkJfQotCQlpZiAoZWxlbWVudFR5cGVOYW1lLmVxdWFscyh2b2lkLmNsYXNzLmdldE5hbWUoKSkgJiYgKGFycmF5RGVwdGggIT0gMCkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIid2b2lkJyBtdXN0IGhhdmUgYW4gYXJyYXkgZGVwdGggb2YgemVybzogIiArIGFycmF5RGVwdGggKyAnLicpOwotCQl9Ci0JCXRoaXMuZWxlbWVudFR5cGVOYW1lID0gZWxlbWVudFR5cGVOYW1lOwotCQl0aGlzLmFycmF5RGVwdGggPSBhcnJheURlcHRoOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIEphdmEgdHlwZSBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBUaGUgY2xhc3MgbmFtZSBjYW4gYmUgaW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgZm9ybXM6Ci0JICogICAgIGphdmEubGFuZy5PYmplY3QKLQkgKiAgICAgaW50Ci0JICogICAgIGphdmEudXRpbC5NYXAkRW50cnkKLQkgKiAgICAgW0xqYXZhLmxhbmcuT2JqZWN0OwotCSAqICAgICBbSQotCSAqICAgICBbTGphdmEudXRpbC5NYXAkRW50cnk7Ci0JICovCi0JcHVibGljIEphdmFUeXBlKFN0cmluZyBqYXZhQ2xhc3NOYW1lKSB7Ci0JCXRoaXMoQ2xhc3NUb29scy5lbGVtZW50VHlwZU5hbWVGb3JDbGFzc05hbWVkKGphdmFDbGFzc05hbWUpLCBDbGFzc1Rvb2xzLmFycmF5RGVwdGhGb3JDbGFzc05hbWVkKGphdmFDbGFzc05hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBKYXZhIHR5cGUgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICovCi0JcHVibGljIEphdmFUeXBlKENsYXNzPD8+IGphdmFDbGFzcykgewotCQl0aGlzKGphdmFDbGFzcy5nZXROYW1lKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhY2Nlc3NvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSB0eXBlJ3MgImVsZW1lbnQgdHlwZSIuCi0JICogQSBtZW1iZXIgdHlwZSB3aWxsIGhhdmUgb25lIG9yIG1vcmUgJyQnIGNoYXJhY3RlcnMgaW4gaXRzIG5hbWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFbGVtZW50VHlwZU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmVsZW1lbnRUeXBlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHR5cGUncyAiYXJyYXkgZGVwdGgiLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0QXJyYXlEZXB0aCgpIHsKLQkJcmV0dXJuIHRoaXMuYXJyYXlEZXB0aDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBpc0FycmF5KCkgewotCQlyZXR1cm4gdGhpcy5hcnJheURlcHRoID4gMDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1ByaW1pdGl2ZSgpIHsKLQkJcmV0dXJuICh0aGlzLmFycmF5RGVwdGggPT0gMCkgJiYgQ2xhc3NUb29scy5jbGFzc05hbWVkSXNOb25SZWZlcmVuY2UodGhpcy5lbGVtZW50VHlwZU5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgY29ycmVzcG9uZGluZyB0byB0aGUgdHlwZSdzIGVsZW1lbnQgdHlwZSBhbmQgYXJyYXkgZGVwdGguCi0JICovCi0JcHVibGljIENsYXNzPD8+IGphdmFDbGFzcygpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIENsYXNzVG9vbHMuY2xhc3NGb3JUeXBlRGVjbGFyYXRpb24odGhpcy5lbGVtZW50VHlwZU5hbWUsIHRoaXMuYXJyYXlEZXB0aCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB2ZXJzaW9uIG9mIHRoZSB0eXBlJ3MgbmFtZSB0aGF0IG1hdGNoZXMgdGhhdAotCSAqIHJldHVybmVkIGJ5IGphdmEubGFuZy5DbGFzcyNnZXROYW1lKCkKLQkgKiAoZS5nLiAiW1tKIiwgIltMamF2YS5sYW5nLk9iamVjdDsiLCAiamF2YS51dGlsLk1hcCRFbnRyeSIpLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgamF2YUNsYXNzTmFtZSgpIHsKLQkJcmV0dXJuIENsYXNzVG9vbHMuY2xhc3NOYW1lRm9yVHlwZURlY2xhcmF0aW9uKHRoaXMuZWxlbWVudFR5cGVOYW1lLCB0aGlzLmFycmF5RGVwdGgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb21wYXJpc29uICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhTdHJpbmcgb3RoZXJFbGVtZW50VHlwZU5hbWUsIGludCBvdGhlckFycmF5RGVwdGgpIHsKLQkJcmV0dXJuICh0aGlzLmFycmF5RGVwdGggPT0gb3RoZXJBcnJheURlcHRoKQotCQkJJiYgdGhpcy5lbGVtZW50VHlwZU5hbWUuZXF1YWxzKG90aGVyRWxlbWVudFR5cGVOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBkZXNjcmliZXMoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gdGhpcy5lcXVhbHMoQ2xhc3NUb29scy5lbGVtZW50VHlwZU5hbWVGb3JDbGFzc05hbWVkKGNsYXNzTmFtZSksIENsYXNzVG9vbHMuYXJyYXlEZXB0aEZvckNsYXNzTmFtZWQoY2xhc3NOYW1lKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZGVzY3JpYmVzKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlyZXR1cm4gdGhpcy5kZXNjcmliZXMoamF2YUNsYXNzLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKEphdmFUeXBlIG90aGVyKSB7Ci0JCXJldHVybiB0aGlzLmVxdWFscyhvdGhlci5lbGVtZW50VHlwZU5hbWUsIG90aGVyLmFycmF5RGVwdGgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQlyZXR1cm4gKG8gaW5zdGFuY2VvZiBKYXZhVHlwZSkgPyB0aGlzLmVxdWFscygoSmF2YVR5cGUpIG8pIDogZmFsc2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIHRoaXMuZWxlbWVudFR5cGVOYW1lLmhhc2hDb2RlKCkgXiB0aGlzLmFycmF5RGVwdGg7Ci0JfQotCi0JcHVibGljIGludCBjb21wYXJlVG8oSmF2YVR5cGUganQpIHsKLQkJaW50IHggPSBDb2xsYXRvci5nZXRJbnN0YW5jZSgpLmNvbXBhcmUodGhpcy5lbGVtZW50VHlwZU5hbWUsIGp0LmVsZW1lbnRUeXBlTmFtZSk7Ci0JCXJldHVybiAoeCAhPSAwKSA/IHggOiAodGhpcy5hcnJheURlcHRoIC0ganQuYXJyYXlEZXB0aCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHByaW50aW5nIGFuZCBkaXNwbGF5aW5nICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgdmVyc2lvbiBvZiB0aGUgdHlwZSdzIG5hbWUgdGhhdCBjYW4gYmUgdXNlZCBpbiBzb3VyY2UgY29kZToKLQkgKiAgICAgIltbSiIgPT4gImxvbmdbXVtdIgotCSAqICAgICAiamF2YS51dGlsLk1hcCRFbnRyeSIgPT4gImphdmEudXRpbC5NYXAuRW50cnkiCi0JICovCi0JcHVibGljIFN0cmluZyBkZWNsYXJhdGlvbigpIHsKLQkJaWYgKHRoaXMuYXJyYXlEZXB0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gdGhpcy5lbGVtZW50VHlwZU5hbWVEZWNsYXJhdGlvbigpOwotCQl9Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIodGhpcy5lbGVtZW50VHlwZU5hbWUubGVuZ3RoKCkgKyAoMiAqIHRoaXMuYXJyYXlEZXB0aCkpOwotCQl0aGlzLmFwcGVuZERlY2xhcmF0aW9uVG8oc2IpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBBcHBlbmQgdGhlIHZlcnNpb24gb2YgdGhlIHR5cGUncyBuYW1lIHRoYXQgY2FuIGJlIHVzZWQgaW4gc291cmNlIGNvZGU6Ci0JICogICAgICJbW0oiID0+ICJsb25nW11bXSIKLQkgKiAgICAgImphdmEudXRpbC5NYXAkRW50cnkiID0+ICJqYXZhLnV0aWwuTWFwLkVudHJ5IgotCSAqLwotCXB1YmxpYyB2b2lkIGFwcGVuZERlY2xhcmF0aW9uVG8oU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLmVsZW1lbnRUeXBlTmFtZURlY2xhcmF0aW9uKCkpOwotCQlmb3IgKGludCBpID0gdGhpcy5hcnJheURlcHRoOyBpLS0gPiAwOyApIHsKLQkJCXNiLmFwcGVuZCgiW10iKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByaW50IHRoZSB2ZXJzaW9uIG9mIHRoZSB0eXBlJ3MgbmFtZSB0aGF0IGNhbiBiZSB1c2VkIGluIHNvdXJjZSBjb2RlOgotCSAqICAgICAiW1tKIiA9PiAibG9uZ1tdW10iCi0JICogICAgICJqYXZhLnV0aWwuTWFwJEVudHJ5IiA9PiAiamF2YS51dGlsLk1hcC5FbnRyeSIKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmludERlY2xhcmF0aW9uT24oUHJpbnRXcml0ZXIgcHcpIHsKLQkJcHcucHJpbnQodGhpcy5lbGVtZW50VHlwZU5hbWVEZWNsYXJhdGlvbigpKTsKLQkJZm9yIChpbnQgaSA9IHRoaXMuYXJyYXlEZXB0aDsgaS0tID4gMDsgKSB7Ci0JCQlwdy5wcmludCgiW10iKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSAnJCcgdmVyc2lvbiBvZiB0aGUgbmFtZSBpcyB1c2VkIGluIENsYXNzLmZvck5hbWUoU3RyaW5nKSwKLQkgKiBidXQgdGhlICcuJyB2ZXJpb25zIG9mIHRoZSBuYW1lIGlzIHVzZWQgaW4gc291cmNlIGNvZGUuCi0JICogVmVyeSBpcnJpdGF0aW5nLi4uLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGVsZW1lbnRUeXBlTmFtZURlY2xhcmF0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5lbGVtZW50VHlwZU5hbWUucmVwbGFjZSgnJCcsICcuJyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlzYi5hcHBlbmQoQ2xhc3NUb29scy5zaG9ydENsYXNzTmFtZUZvck9iamVjdCh0aGlzKSk7Ci0JCXNiLmFwcGVuZCgnKCcpOwotCQl0aGlzLmFwcGVuZERlY2xhcmF0aW9uVG8oc2IpOwotCQlzYi5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBjbG9uZSgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBzdXBlci5jbG9uZSgpOwotCQl9IGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IEludGVybmFsRXJyb3IoKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL05hbWVUb29scy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL05hbWVUb29scy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTEzYzcwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9OYW1lVG9vbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLQotLyoqCi0gKiBWYXJpb3VzIGhlbHBlciBtZXRob2RzIGZvciBnZW5lcmF0aW5nIG5hbWVzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTmFtZVRvb2xzIHsKLQotCS8qKgotCSAqIEdpdmVuIGEgInJvb3QiIG5hbWUgYW5kIGEgc2V0IG9mIGV4aXN0aW5nIG5hbWVzLCBnZW5lcmF0ZSBhIHVuaXF1ZSwKLQkgKiBKYXZhLWxlZ2FsIG5hbWUgdGhhdCBpcyBlaXRoZXIgdGhlICJyb290IiBuYW1lIG9yIHNvbWUgdmFyaWF0aW9uIG9uCi0JICogdGhlICJyb290IiBuYW1lIChlLmcuICJyb290MiIsICJyb290MyIsLi4uKS4KLQkgKiBUaGUgbmFtZXMgYXJlIGNhc2Utc2Vuc2l0aXZlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVuaXF1ZUphdmFOYW1lRm9yKFN0cmluZyByb290TmFtZSwgSXRlcmF0b3I8U3RyaW5nPiBleGlzdGluZ05hbWVzKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBleGlzdGluZ05hbWVzMiA9IENvbGxlY3Rpb25Ub29scy5zZXQoZXhpc3RpbmdOYW1lcyk7Ci0JCWV4aXN0aW5nTmFtZXMyLmFkZEFsbChKQVZBX1JFU0VSVkVEX1dPUkRTX1NFVCk7Ci0JCXJldHVybiB1bmlxdWVOYW1lRm9yKHJvb3ROYW1lLCBleGlzdGluZ05hbWVzMiwgcm9vdE5hbWUpOwotCX0KLQkKLQkvKioKLQkgKiBHaXZlbiBhICJyb290IiBuYW1lIGFuZCBhIHNldCBvZiBleGlzdGluZyBuYW1lcywgZ2VuZXJhdGUgYSB1bmlxdWUsCi0JICogSmF2YS1sZWdhbCBuYW1lIHRoYXQgaXMgZWl0aGVyIHRoZSAicm9vdCIgbmFtZSBvciBzb21lIHZhcmlhdGlvbiBvbgotCSAqIHRoZSAicm9vdCIgbmFtZSAoZS5nLiAicm9vdDIiLCAicm9vdDMiLC4uLikuCi0JICogVGhlIG5hbWVzIGFyZSBjYXNlLXNlbnNpdGl2ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1bmlxdWVKYXZhTmFtZUZvcihTdHJpbmcgcm9vdE5hbWUsIENvbGxlY3Rpb248U3RyaW5nPiBleGlzdGluZ05hbWVzKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBleGlzdGluZ05hbWVzMiA9IG5ldyBIYXNoU2V0PFN0cmluZz4oZXhpc3RpbmdOYW1lcyk7Ci0JCWV4aXN0aW5nTmFtZXMyLmFkZEFsbChKQVZBX1JFU0VSVkVEX1dPUkRTX1NFVCk7Ci0JCXJldHVybiB1bmlxdWVOYW1lRm9yKHJvb3ROYW1lLCBleGlzdGluZ05hbWVzMiwgcm9vdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIEdpdmVuIGEgInJvb3QiIG5hbWUgYW5kIGEgc2V0IG9mIGV4aXN0aW5nIG5hbWVzLCBnZW5lcmF0ZSBhIHVuaXF1ZQotCSAqIG5hbWUgdGhhdCBpcyBlaXRoZXIgdGhlICJyb290IiBuYW1lIG9yIHNvbWUgdmFyaWF0aW9uIG9uIHRoZSAicm9vdCIKLQkgKiBuYW1lIChlLmcuICJyb290MiIsICJyb290MyIsLi4uKS4gVGhlIG5hbWVzIGFyZSBjYXNlLXNlbnNpdGl2ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1bmlxdWVOYW1lRm9yKFN0cmluZyByb290TmFtZSwgSXRlcmF0b3I8U3RyaW5nPiBleGlzdGluZ05hbWVzKSB7Ci0JCXJldHVybiB1bmlxdWVOYW1lRm9yKHJvb3ROYW1lLCBDb2xsZWN0aW9uVG9vbHMuc2V0KGV4aXN0aW5nTmFtZXMpKTsKLQl9Ci0JCi0JLyoqCi0JICogR2l2ZW4gYSAicm9vdCIgbmFtZSBhbmQgYSBzZXQgb2YgZXhpc3RpbmcgbmFtZXMsIGdlbmVyYXRlIGEgdW5pcXVlCi0JICogbmFtZSB0aGF0IGlzIGVpdGhlciB0aGUgInJvb3QiIG5hbWUgb3Igc29tZSB2YXJpYXRpb24gb24gdGhlICJyb290IgotCSAqIG5hbWUgKGUuZy4gInJvb3QyIiwgInJvb3QzIiwuLi4pLiBUaGUgbmFtZXMgYXJlIGNhc2Utc2Vuc2l0aXZlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVuaXF1ZU5hbWVGb3IoU3RyaW5nIHJvb3ROYW1lLCBDb2xsZWN0aW9uPFN0cmluZz4gZXhpc3RpbmdOYW1lcykgewotCQlyZXR1cm4gdW5pcXVlTmFtZUZvcihyb290TmFtZSwgZXhpc3RpbmdOYW1lcywgcm9vdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIEdpdmVuIGEgInJvb3QiIG5hbWUgYW5kIGEgc2V0IG9mIGV4aXN0aW5nIG5hbWVzLCBnZW5lcmF0ZSBhIHVuaXF1ZQotCSAqIG5hbWUgdGhhdCBpcyBlaXRoZXIgdGhlICJyb290IiBuYW1lIG9yIHNvbWUgdmFyaWF0aW9uIG9uIHRoZSAicm9vdCIKLQkgKiBuYW1lIChlLmcuICJyb290MiIsICJyb290MyIsLi4uKS4gVGhlIG5hbWVzIGFyZSBOT1QgY2FzZS1zZW5zaXRpdmUuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdW5pcXVlTmFtZUZvcklnbm9yZUNhc2UoU3RyaW5nIHJvb3ROYW1lLCBJdGVyYXRvcjxTdHJpbmc+IGV4aXN0aW5nTmFtZXMpIHsKLQkJcmV0dXJuIHVuaXF1ZU5hbWVGb3JJZ25vcmVDYXNlKHJvb3ROYW1lLCBDb2xsZWN0aW9uVG9vbHMuc2V0KGV4aXN0aW5nTmFtZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiBHaXZlbiBhICJyb290IiBuYW1lIGFuZCBhIHNldCBvZiBleGlzdGluZyBuYW1lcywgZ2VuZXJhdGUgYSB1bmlxdWUKLQkgKiBuYW1lIHRoYXQgaXMgZWl0aGVyIHRoZSAicm9vdCIgbmFtZSBvciBzb21lIHZhcmlhdGlvbiBvbiB0aGUgInJvb3QiCi0JICogbmFtZSAoZS5nLiAicm9vdDIiLCAicm9vdDMiLC4uLikuIFRoZSBuYW1lcyBhcmUgTk9UIGNhc2Utc2Vuc2l0aXZlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVuaXF1ZU5hbWVGb3JJZ25vcmVDYXNlKFN0cmluZyByb290TmFtZSwgQ29sbGVjdGlvbjxTdHJpbmc+IGV4aXN0aW5nTmFtZXMpIHsKLQkJcmV0dXJuIHVuaXF1ZU5hbWVGb3Iocm9vdE5hbWUsIGNvbnZlcnRUb0xvd2VyQ2FzZShleGlzdGluZ05hbWVzKSwgcm9vdE5hbWUudG9Mb3dlckNhc2UoKSk7Ci0JfQotCi0JLyoqCi0JICogdXNlIHRoZSBzdWZmaXhlZCAidGVtcGxhdGUiIG5hbWUgdG8gcGVyZm9ybSB0aGUgY29tcGFyaXNvbnMsIGJ1dCBSRVRVUk4KLQkgKiB0aGUgc3VmZml4ZWQgInJvb3QiIG5hbWU7IHRoaXMgYWxsb3dzIGNhc2UtaW5zZW5zaXRpdmUgY29tcGFyaXNvbnMKLQkgKiAoaS5lLiB0aGUgInRlbXBsYXRlIiBuYW1lIGhhcyBiZWVuIG1vcnBoZWQgdG8gdGhlIHNhbWUgY2FzZSBhcwotCSAqIHRoZSAiZXhpc3RpbmciIG5hbWVzLCB3aGlsZSB0aGUgInJvb3QiIG5hbWUgaGFzIG5vdCwgYnV0IHRoZSAicm9vdCIgbmFtZQotCSAqIGlzIHdoYXQgdGhlIGNsaWVudCB3YW50cyBtb3JwaGVkIHRvIGJlIHVuaXF1ZSkKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgdW5pcXVlTmFtZUZvcihTdHJpbmcgcm9vdE5hbWUsIENvbGxlY3Rpb248U3RyaW5nPiBleGlzdGluZ05hbWVzLCBTdHJpbmcgdGVtcGxhdGVOYW1lKSB7Ci0JCWlmICggISBleGlzdGluZ05hbWVzLmNvbnRhaW5zKHRlbXBsYXRlTmFtZSkpIHsKLQkJCXJldHVybiByb290TmFtZTsKLQkJfQotCQlTdHJpbmcgdW5pcXVlTmFtZSA9IHRlbXBsYXRlTmFtZTsKLQkJZm9yIChpbnQgc3VmZml4ID0gMjsgdHJ1ZTsgc3VmZml4KyspIHsKLQkJCWlmICggISBleGlzdGluZ05hbWVzLmNvbnRhaW5zKHVuaXF1ZU5hbWUgKyBzdWZmaXgpKSB7Ci0JCQkJcmV0dXJuIHJvb3ROYW1lLmNvbmNhdChTdHJpbmcudmFsdWVPZihzdWZmaXgpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIG9mIHN0cmluZ3MgdG8gYSBjb2xsZWN0aW9uIG9mIHRoZSBzYW1lCi0JICogc3RyaW5ncyBjb252ZXJ0ZWQgdG8gbG93ZXIgY2FzZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBDb2xsZWN0aW9uPFN0cmluZz4gY29udmVydFRvTG93ZXJDYXNlKENvbGxlY3Rpb248U3RyaW5nPiBzdHJpbmdzKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiByZXN1bHQgPSBuZXcgSGFzaEJhZzxTdHJpbmc+KHN0cmluZ3Muc2l6ZSgpKTsKLQkJZm9yIChTdHJpbmcgc3RyaW5nIDogc3RyaW5ncykgewotCQkJcmVzdWx0LmFkZChzdHJpbmcudG9Mb3dlckNhc2UoKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBCdWlsZCBhIGZ1bGx5LXF1YWxpZmllZCBuYW1lIGZvciB0aGUgc3BlY2lmaWVkIGRhdGFiYXNlIG9iamVjdC4KLQkgKiBWYXJpYXRpb25zOgotCSAqICAgICBjYXRhbG9nLnNjaGVtYS5uYW1lCi0JICogICAgIGNhdGFsb2cuLm5hbWUKLQkgKiAgICAgc2NoZW1hLm5hbWUKLQkgKiAgICAgbmFtZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJ1aWxkUXVhbGlmaWVkRGF0YWJhc2VPYmplY3ROYW1lKFN0cmluZyBjYXRhbG9nLCBTdHJpbmcgc2NoZW1hLCBTdHJpbmcgbmFtZSkgewotCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQkJaWYgKChjYXRhbG9nID09IG51bGwpICYmIChzY2hlbWEgPT0gbnVsbCkpIHsKLQkJCXJldHVybiBuYW1lOwotCQl9Ci0KLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigxMDApOwotCQlpZiAoY2F0YWxvZyAhPSBudWxsKSB7Ci0JCQlzYi5hcHBlbmQoY2F0YWxvZyk7Ci0JCQlzYi5hcHBlbmQoJy4nKTsKLQkJfQotCQlpZiAoc2NoZW1hICE9IG51bGwpIHsKLQkJCXNiLmFwcGVuZChzY2hlbWEpOwotCQl9Ci0JCXNiLmFwcGVuZCgnLicpOwotCQlzYi5hcHBlbmQobmFtZSk7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFRoZSBzZXQgb2YgcmVzZXJ2ZWQgd29yZHMgaW4gdGhlIEphdmEgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuCi0JICogVGhlc2Ugd29yZHMgY2Fubm90IGJlIHVzZWQgYXMgaWRlbnRpZmllcnMgKGkuZS4gbmFtZXMpLgotCSAqIGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy90dXRvcmlhbC9qYXZhL251dHNhbmRib2x0cy9fa2V5d29yZHMuaHRtbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gSkFWQV9SRVNFUlZFRF9XT1JEUyA9IG5ldyBTdHJpbmdbXSB7Ci0JCQkJImFic3RyYWN0IiwKLQkJCQkiYXNzZXJ0IiwgIC8vIGpkayAxLjQKLQkJCQkiYm9vbGVhbiIsCi0JCQkJImJyZWFrIiwKLQkJCQkiYnl0ZSIsCi0JCQkJImNhc2UiLAotCQkJCSJjYXRjaCIsCi0JCQkJImNoYXIiLAotCQkJCSJjbGFzcyIsCi0JCQkJImNvbnN0IiwgIC8vIHVudXNlZAotCQkJCSJjb250aW51ZSIsCi0JCQkJImRlZmF1bHQiLAotCQkJCSJkbyIsCi0JCQkJImRvdWJsZSIsCi0JCQkJImVsc2UiLAotCQkJCSJlbnVtIiwgIC8vIGpkayA1LjAKLQkJCQkiZXh0ZW5kcyIsCi0JCQkJImZhbHNlIiwKLQkJCQkiZmluYWwiLAotCQkJCSJmaW5hbGx5IiwKLQkJCQkiZmxvYXQiLAotCQkJCSJmb3IiLAotCQkJCSJnb3RvIiwgIC8vIHVudXNlZAotCQkJCSJpZiIsCi0JCQkJImltcGxlbWVudHMiLAotCQkJCSJpbXBvcnQiLAotCQkJCSJpbnN0YW5jZW9mIiwKLQkJCQkiaW50IiwKLQkJCQkiaW50ZXJmYWNlIiwKLQkJCQkibG9uZyIsCi0JCQkJIm5hdGl2ZSIsCi0JCQkJIm5ldyIsCi0JCQkJIm51bGwiLAotCQkJCSJwYWNrYWdlIiwKLQkJCQkicHJpdmF0ZSIsCi0JCQkJInByb3RlY3RlZCIsCi0JCQkJInB1YmxpYyIsCi0JCQkJInJldHVybiIsCi0JCQkJInNob3J0IiwKLQkJCQkic3RhdGljIiwKLQkJCQkic3RyaWN0ZnAiLCAgLy8gamRrIDEuMgotCQkJCSJzdXBlciIsCi0JCQkJInN3aXRjaCIsCi0JCQkJInN5bmNocm9uaXplZCIsCi0JCQkJInRoaXMiLAotCQkJCSJ0aHJvdyIsCi0JCQkJInRocm93cyIsCi0JCQkJInRyYW5zaWVudCIsCi0JCQkJInRydWUiLAotCQkJCSJ0cnkiLAotCQkJCSJ2b2lkIiwKLQkJCQkidm9sYXRpbGUiLAotCQkJCSJ3aGlsZSIKLQkJCX07Ci0KLQkvKioKLQkgKiBUaGUgc2V0IG9mIHJlc2VydmVkIHdvcmRzIGluIHRoZSBKYXZhIHByb2dyYW1taW5nIGxhbmd1YWdlLgotCSAqIFRoZXNlIHdvcmRzIGNhbm5vdCBiZSB1c2VkIGFzIGlkZW50aWZpZXJzIChpLmUuIG5hbWVzKS4KLQkgKiBodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvdHV0b3JpYWwvamF2YS9udXRzYW5kYm9sdHMvX2tleXdvcmRzLmh0bWwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFNldDxTdHJpbmc+IEpBVkFfUkVTRVJWRURfV09SRFNfU0VUID0gQ29sbGVjdGlvblRvb2xzLnNldChKQVZBX1JFU0VSVkVEX1dPUkRTKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2V0IG9mIEphdmEgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgcmVzZXJ2ZWQgd29yZHMuCi0JICogVGhlc2Ugd29yZHMgY2Fubm90IGJlIHVzZWQgYXMgaWRlbnRpZmllcnMgKGkuZS4gbmFtZXMpLgotCSAqIGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy90dXRvcmlhbC9qYXZhL251dHNhbmRib2x0cy9fa2V5d29yZHMuaHRtbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8U3RyaW5nPiBqYXZhUmVzZXJ2ZWRXb3JkcygpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFWQV9SRVNFUlZFRF9XT1JEUyk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byBhIHZhbGlkIEphdmEgaWRlbnRpZmllcgotCSAqIGJ5IHN1YnN0aXR1dGluZyBhbiB1bmRlcnNjb3JlICdfJyBmb3IgYW55IGludmFsaWQgY2hhcmFjdGVycwotCSAqIGluIHRoZSBzdHJpbmcgYW5kIGNhcGl0YWxpemluZyB0aGUgc3RyaW5nIGlmIGl0IGlzIGEgSmF2YQotCSAqIHJlc2VydmVkIHdvcmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvSmF2YUlkZW50aWZpZXIoU3RyaW5nIHN0cmluZykgewotCQlyZXR1cm4gY29udmVydFRvSmF2YUlkZW50aWZpZXIoc3RyaW5nLCAnXycpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gYSB2YWxpZCBKYXZhIGlkZW50aWZpZXIKLQkgKiBieSBzdWJzdGl0dXRpbmcgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgZm9yIGFueSBpbnZhbGlkIGNoYXJhY3RlcnMKLQkgKiBpbiB0aGUgc3RyaW5nIGFuZCBjYXBpdGFsaXppbmcgdGhlIHN0cmluZyBpZiBpdCBpcyBhIEphdmEKLQkgKiByZXNlcnZlZCB3b3JkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb0phdmFJZGVudGlmaWVyKFN0cmluZyBzdHJpbmcsIGNoYXIgYykgewotCQlpZiAoc3RyaW5nLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiBzdHJpbmc7Ci0JCX0KLQkJaWYgKEpBVkFfUkVTRVJWRURfV09SRFNfU0VULmNvbnRhaW5zKHN0cmluZykpIHsKLQkJCS8vIGEgcmVzZXJ2ZWQgd29yZHMgaXMgYSB2YWxpZCBpZGVudGlmaWVyLCB3ZSBqdXN0IG5lZWQgdG8gdHdlYWsgaXQgYSBiaXQKLQkJCXJldHVybiBTdHJpbmdUb29scy5jYXBpdGFsaXplKHN0cmluZyk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBTdHJpbmcoY29udmVydFRvSmF2YUlkZW50aWZpZXJJbnRlcm5hbChzdHJpbmcudG9DaGFyQXJyYXkoKSwgYykpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gYSB2YWxpZCBKYXZhIGlkZW50aWZpZXIKLQkgKiBieSBzdWJzdGl0dXRpbmcgYW4gdW5kZXJzY29yZSAnXycgZm9yIGFueSBpbnZhbGlkIGNoYXJhY3RlcnMKLQkgKiBpbiB0aGUgc3RyaW5nIGFuZCBjYXBpdGFsaXppbmcgdGhlIHN0cmluZyBpZiBpdCBpcyBhIEphdmEKLQkgKiByZXNlcnZlZCB3b3JkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIGNvbnZlcnRUb0phdmFJZGVudGlmaWVyKGNoYXJbXSBzdHJpbmcpIHsKLQkJcmV0dXJuIGNvbnZlcnRUb0phdmFJZGVudGlmaWVyKHN0cmluZywgJ18nKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIGEgdmFsaWQgSmF2YSBpZGVudGlmaWVyCi0JICogYnkgc3Vic3RpdHV0aW5nIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGZvciBhbnkgaW52YWxpZCBjaGFyYWN0ZXJzCi0JICogaW4gdGhlIHN0cmluZyBhbmQgY2FwaXRhbGl6aW5nIHRoZSBzdHJpbmcgaWYgaXQgaXMgYSBKYXZhCi0JICogcmVzZXJ2ZWQgd29yZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBjb252ZXJ0VG9KYXZhSWRlbnRpZmllcihjaGFyW10gc3RyaW5nLCBjaGFyIGMpIHsKLQkJaW50IGxlbmd0aCA9IHN0cmluZy5sZW5ndGg7Ci0JCWlmIChsZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIHN0cmluZzsKLQkJfQotCQlpZiAoSkFWQV9SRVNFUlZFRF9XT1JEU19TRVQuY29udGFpbnMobmV3IFN0cmluZyhzdHJpbmcpKSkgewotCQkJLy8gYSByZXNlcnZlZCB3b3JkcyBpcyBhIHZhbGlkIGlkZW50aWZpZXIsIHdlIGp1c3QgbmVlZCB0byB0d2VhayBpdCBhIGJpdAotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmNhcGl0YWxpemUoc3RyaW5nKTsKLQkJfQotCQlyZXR1cm4gY29udmVydFRvSmF2YUlkZW50aWZpZXJJbnRlcm5hbChzdHJpbmcsIGMpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGNoYXJbXSBjb252ZXJ0VG9KYXZhSWRlbnRpZmllckludGVybmFsKGNoYXJbXSBzdHJpbmcsIGNoYXIgYykgewotCQlpZiAoICEgQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJTdGFydChzdHJpbmdbMF0pKSB7Ci0JCQlpZiAoICEgQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJTdGFydChjKSkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgSmF2YSBpZGVudGlmaWVyIHN0YXJ0IGNoYXI6ICciICsgYyArICInIik7Ci0JCQl9Ci0JCQlzdHJpbmdbMF0gPSBjOwotCQl9Ci0JCWlmICggISBDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQoYykpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgSmF2YSBpZGVudGlmaWVyIHBhcnQgY2hhcjogJyIgKyBjICsgIiciKTsKLQkJfQotCQlmb3IgKGludCBpID0gc3RyaW5nLmxlbmd0aDsgaS0tID4gMTsgKSB7ICAvLyBOQjogZW5kIHdpdGggMQotCQkJaWYgKCAhIENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyUGFydChzdHJpbmdbaV0pKSB7Ci0JCQkJc3RyaW5nW2ldID0gYzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3RyaW5nOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdXBwcmVzcyBkZWZhdWx0IGNvbnN0cnVjdG9yLCBlbnN1cmluZyBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgTmFtZVRvb2xzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9SYW5nZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1JhbmdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkYmU0ODYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1JhbmdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLS8qKgotICogVGhpcyBzaW1wbGUgY29udGFpbmVyIGNsYXNzIHNpbXBseSBwdXRzIGEgYml0IG9mIHNlbWFudGljcwotICogYXJvdW5kIGEgcGFpciBvZiBudW1iZXJzLgotICovCi1wdWJsaWMgY2xhc3MgUmFuZ2UKLQlpbXBsZW1lbnRzIENsb25lYWJsZSwgU2VyaWFsaXphYmxlCi17Ci0JLyoqIFRoZSBzdGFydGluZyBpbmRleCBvZiB0aGUgcmFuZ2UuICovCi0JcHVibGljIGZpbmFsIGludCBzdGFydDsKLQotCS8qKiBUaGUgZW5kaW5nIGluZGV4IG9mIHRoZSByYW5nZS4gKi8KLQlwdWJsaWMgZmluYWwgaW50IGVuZDsKLQotCS8qKgotCSAqIFRoZSBzaXplIGNhbiBiZSBuZWdhdGl2ZSBpZiB0aGUgZW5kaW5nIGluZGV4Ci0JICogaXMgbGVzcyB0aGFuIHRoZSBzdGFydGluZyBpbmRleC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgaW50IHNpemU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IHdpdGggdGhlIHNwZWNpZmllZCBzdGFydCBhbmQgZW5kLAotCSAqIGJvdGggb2Ygd2hpY2ggYXJlIGltbXV0YWJsZS4KLQkgKi8KLQlwdWJsaWMgUmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuc3RhcnQgPSBzdGFydDsKLQkJdGhpcy5lbmQgPSBlbmQ7Ci0JCXRoaXMuc2l6ZSA9IGVuZCAtIHN0YXJ0ICsgMTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgcmFuZ2UgaW5jbHVkZXMgdGhlIHNwZWNpZmllZAotCSAqIGluZGV4LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGluY2x1ZGVzKGludCBpbmRleCkgewotCQlyZXR1cm4gKHRoaXMuc3RhcnQgPD0gaW5kZXgpICYmIChpbmRleCA8PSB0aGlzLmVuZCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCWlmICh0aGlzID09IG8pIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmICggISAobyBpbnN0YW5jZW9mIFJhbmdlKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVJhbmdlIG90aGVyUmFuZ2UgPSAoUmFuZ2UpIG87Ci0JCXJldHVybiAodGhpcy5zdGFydCA9PSBvdGhlclJhbmdlLnN0YXJ0KQotCQkJJiYgKHRoaXMuZW5kID09IG90aGVyUmFuZ2UuZW5kKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gdGhpcy5zdGFydCBeIHRoaXMuZW5kOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBSYW5nZSBjbG9uZSgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiAoUmFuZ2UpIHN1cGVyLmNsb25lKCk7Ci0JCX0gY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJbIiArIHRoaXMuc3RhcnQgKyAiLCAiICsgdGhpcy5lbmQgKyAnXSc7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvUmV2ZXJzZUNvbXBhcmF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9SZXZlcnNlQ29tcGFyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmZmNDU4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9SZXZlcnNlQ29tcGFyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotCi0vKioKLSAqIFRoaXMgY29tcGFyYXRvciB3aWxsIHJldmVyc2UgdGhlIG9yZGVyIG9mIHRoZSBzcGVjaWZpZWQgY29tcGFyYXRvci4KLSAqIElmIHRoZSBjb21wYXJhdG9yIGlzIG51bGwsIHRoZSBuYXR1cmFsIG9yZGVyaW5nIG9mIHRoZSBvYmplY3RzIHdpbGwgYmUgdXNlZC4KLSAqLwotcHVibGljIGNsYXNzIFJldmVyc2VDb21wYXJhdG9yPEUgZXh0ZW5kcyBDb21wYXJhYmxlPD8gc3VwZXIgRT4+Ci0JaW1wbGVtZW50cyBDb21wYXJhdG9yPEU+LCBTZXJpYWxpemFibGUKLXsKLQlwcml2YXRlIGZpbmFsIENvbXBhcmF0b3I8RT4gY29tcGFyYXRvcjsKLQotCXB1YmxpYyBSZXZlcnNlQ29tcGFyYXRvcigpIHsKLQkJdGhpcyhudWxsKTsKLQl9Ci0KLQlwdWJsaWMgUmV2ZXJzZUNvbXBhcmF0b3IoQ29tcGFyYXRvcjxFPiBjb21wYXJhdG9yKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuY29tcGFyYXRvciA9IGNvbXBhcmF0b3I7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIGludCBjb21wYXJlKEUgZTEsIEUgZTIpIHsKLQkJcmV0dXJuICh0aGlzLmNvbXBhcmF0b3IgPT0gbnVsbCkgPwotCQkJZTIuY29tcGFyZVRvKGUxKQotCQk6Ci0JCQl0aGlzLmNvbXBhcmF0b3IuY29tcGFyZShlMiwgZTEpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1NpbXBsZUZpbHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1NpbXBsZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDI2NzRlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9TaW1wbGVGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLS8qKgotICogU2ltcGxlLCBhYnN0cmFjdCBpbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5GaWx0ZXI8L2NvZGU+Ci0gKiB0aGF0IGhvbGRzIG9uIHRvIGEgY3JpdGVyaW9uIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIGluIHRoZQotICogPGNvZGU+YWNjZXB0KE9iamVjdCk8L2NvZGU+IG9yIDxjb2RlPnJlamVjdChPYmplY3QpPC9jb2RlPgotICogbWV0aG9kcy4gU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgZWl0aGVyIG9mIHRoZXNlIG1ldGhvZHMsCi0gKiBkZXBlbmRpbmcgb24gd2hpY2ggaXMgZWFzaWVyIHRvIGltcGxlbWVudC4gTm90ZSB0aGF0IGF0IGxlYXN0Ci0gKiBvbmUgb2YgdGhlc2UgbWV0aG9kcyA8ZW0+bXVzdDwvZW0+IGJlIG92ZXJyaWRkZW4gb3IKLSAqIGFuIGluZmluaXRlIGxvb3Agd2lsbCBvY2N1ci4gSWYgYm90aCBvZiB0aGVtIGFyZSBvdmVycmlkZGVuLAotICogb25seSB0aGUgPGNvZGU+YWNjZXB0KE9iamVjdCk8L2NvZGU+IG1ldGhvZCB3aWxsIGJlIHVzZWQuCi0gKiA8cD4KLSAqIFNpbXBsaWZpZXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIHN0cmFpZ2h0Zm9yd2FyZCBpbm5lciBjbGFzc2VzLgotICogSGVyZSBpcyBhbiBleGFtcGxlIG9mIGEgZmlsdGVyIHRoYXQgY2FuIGJlIHVzZWQgYnkgYQotICogPGNvZGU+RmlsdGVyaW5nSXRlcmF0b3I8L2NvZGU+IHRvIHJldHVybiBvbmx5IHRob3NlIHN0cmluZ3MKLSAqIGluIHRoZSBuZXN0ZWQgaXRlcmF0b3Igc3RhcnQgd2l0aCAicHJlZml4IjoKLSAqIDxwcmU+Ci0gKglGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIgPSBuZXcgU2ltcGxlRmlsdGVyPFN0cmluZz4oInByZWZpeCIpIHsKLSAqCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoU3RyaW5nIG8pIHsKLSAqCQkJcmV0dXJuIG8uc3RhcnRzV2l0aCgoU3RyaW5nKSBjcml0ZXJpb24pOwotICoJCX0KLSAqCX07Ci0gKiA8L3ByZT4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFNpbXBsZUZpbHRlcjxULCBTPgotCWltcGxlbWVudHMgRmlsdGVyPFQ+LCBDbG9uZWFibGUsIFNlcmlhbGl6YWJsZQotewotCXByb3RlY3RlZCBmaW5hbCBTIGNyaXRlcmlvbjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvKioKLQkgKiBNb3JlIHVzZWZ1bCBjb25zdHJ1Y3Rvci4gVGhlIHNwZWNpZmllZCBjcml0ZXJpb24gY2FuCi0JICogYmUgdXNlZCBieSBhIHN1YmNsYXNzIHRvICJhY2NlcHQiIG9yICJyZWplY3QiIG9iamVjdHMuCi0JICovCi0JcHJvdGVjdGVkIFNpbXBsZUZpbHRlcihTIGNyaXRlcmlvbikgewotCQlzdXBlcigpOwotCQl0aGlzLmNyaXRlcmlvbiA9IGNyaXRlcmlvbjsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBzaW1wbGUgZmlsdGVyIHdpdGggYSBudWxsIGNyaXRlcmlvbgotCSAqLwotCXByb3RlY3RlZCBTaW1wbGVGaWx0ZXIoKSB7Ci0JCXRoaXMobnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHNob3VsZCBiZSAicmVqZWN0ZWQiLgotCSAqIFRoZSBzZW1hbnRpY3Mgb2YgInJlamVjdGVkIiBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBjbGllbnQuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVqZWN0KFQgbykgewotCQlyZXR1cm4gISB0aGlzLmFjY2VwdChvKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgdGhlIHNwZWNpZmllZCBvYmplY3Qgc2hvdWxkIGJlICJhY2NlcHRlZCIuCi0JICogVGhlIHNlbWFudGljcyBvZiAiYWNjZXB0ZWQiIGlzIGRldGVybWluZWQgYnkgdGhlIGNsaWVudC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoVCBvKSB7Ci0JCXJldHVybiAhIHRoaXMucmVqZWN0KG8pOwotCX0KLQotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBTaW1wbGVGaWx0ZXI8VCwgUz4gY2xvbmUoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKFNpbXBsZUZpbHRlcjxULCBTPikgc3VwZXIuY2xvbmUoKTsKLQkJfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBJbnRlcm5hbEVycm9yKCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJaWYgKCAhIChvIGluc3RhbmNlb2YgU2ltcGxlRmlsdGVyKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVNpbXBsZUZpbHRlcjw/LCA/PiBvdGhlciA9IChTaW1wbGVGaWx0ZXI8PywgPz4pIG87Ci0JCXJldHVybiAodGhpcy5jcml0ZXJpb24gPT0gbnVsbCkgPwotCQkJKG90aGVyLmNyaXRlcmlvbiA9PSBudWxsKSA6IHRoaXMuY3JpdGVyaW9uLmVxdWFscyhvdGhlci5jcml0ZXJpb24pOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiAodGhpcy5jcml0ZXJpb24gPT0gbnVsbCkgPyAwIDogdGhpcy5jcml0ZXJpb24uaGFzaENvZGUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmNyaXRlcmlvbik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvU3RyaW5nVG9vbHMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9TdHJpbmdUb29scy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDE3YjY5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9TdHJpbmdUb29scy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOwotCi0vKioKLSAqIENvbnZlbmllbmNlIG1ldGhvZHMgcmVsYXRlZCB0byB0aGUgamF2YS5sYW5nLlN0cmluZyBjbGFzcy4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFN0cmluZ1Rvb2xzIHsKLQotCS8qKiBjYXJyaWFnZSByZXR1cm4gKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDUiA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKLQotCS8qKiBkb3VibGUgcXVvdGUgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgUVVPVEUgPSAnIic7Ci0KLQotCi0JLy8gKioqKioqKioqKiBwYWRkaW5nL3RydW5jYXRpbmcgKioqKioqKioqKgotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggc3BhY2VzIGF0IHRoZSBlbmQuCi0JICogU3RyaW5nI3BhZChpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGFkKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgpIHsKLQkJcmV0dXJuIHBhZChzdHJpbmcsIGxlbmd0aCwgJyAnKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCBzcGFjZXMgYXQgdGhlIGVuZC4KLQkgKiBTdHJpbmcjcGFkT24oaW50LCBXcml0ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBhZE9uKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIFdyaXRlciB3cml0ZXIpIHsKLQkJcGFkT24oc3RyaW5nLCBsZW5ndGgsICcgJywgd3JpdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCBzcGFjZXMgYXQgdGhlIGVuZC4KLQkgKiBTdHJpbmcjcGFkT24oaW50LCBTdHJpbmdCdWZmZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBhZE9uKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIFN0cmluZ0J1ZmZlciBzYikgewotCQlwYWRPbihzdHJpbmcsIGxlbmd0aCwgJyAnLCBzYik7Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZW5kLgotCSAqIFN0cmluZyNwYWQoaW50LCBjaGFyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhZChTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU3RyaW5nIGlzIHRvbyBsb25nOiAiICsgc3RyaW5nTGVuZ3RoICsgIiA+ICIgKyBsZW5ndGgpOwotCQl9Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQlyZXR1cm4gc3RyaW5nOwotCQl9Ci0JCXJldHVybiBwYWRJbnRlcm5hbChzdHJpbmcsIGxlbmd0aCwgYyk7Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZW5kLgotCSAqIFN0cmluZyNwYWRPbihpbnQsIGNoYXIsIFdyaXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGFkT24oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCXBhZE9uKHN0cmluZy50b0NoYXJBcnJheSgpLCBsZW5ndGgsIGMsIHdyaXRlcik7Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZW5kLgotCSAqIFN0cmluZyNwYWRPbihpbnQsIGNoYXIsIFN0cmluZ0J1ZmZlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGFkT24oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJcGFkT24oc3RyaW5nLnRvQ2hhckFycmF5KCksIGxlbmd0aCwgYywgc2IpOwotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHNwYWNlcyBhdCB0aGUgZW5kLgotCSAqIFN0cmluZyNwYWQoaW50KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHBhZChjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoKSB7Ci0JCXJldHVybiBwYWQoc3RyaW5nLCBsZW5ndGgsICcgJyk7Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggc3BhY2VzIGF0IHRoZSBlbmQuCi0JICogU3RyaW5nI3BhZE9uKGludCwgd3JpdGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwYWRPbihjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCXBhZE9uKHN0cmluZywgbGVuZ3RoLCAnICcsIHdyaXRlcik7Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggc3BhY2VzIGF0IHRoZSBlbmQuCi0JICogU3RyaW5nI3BhZE9uKGludCwgU3RyaW5nQnVmZmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwYWRPbihjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJcGFkT24oc3RyaW5nLCBsZW5ndGgsICcgJywgc2IpOwotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGVuZC4KLQkgKiBTdHJpbmcjcGFkKGludCwgY2hhcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBwYWQoY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoOwotCQlpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTdHJpbmcgaXMgdG9vIGxvbmc6ICIgKyBzdHJpbmdMZW5ndGggKyAiID4gIiArIGxlbmd0aCk7Ci0JCX0KLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXJldHVybiBzdHJpbmc7Ci0JCX0KLQkJcmV0dXJuIHBhZEludGVybmFsKHN0cmluZywgbGVuZ3RoLCBjKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBlbmQuCi0JICogU3RyaW5nI3BhZE9uKGludCwgY2hhciwgV3JpdGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwYWRPbihjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFdyaXRlciB3cml0ZXIpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGg7Ci0JCWlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlN0cmluZyBpcyB0b28gbG9uZzogIiArIHN0cmluZ0xlbmd0aCArICIgPiAiICsgbGVuZ3RoKTsKLQkJfQotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIHdyaXRlcik7Ci0JCX0gZWxzZSB7Ci0JCQlwYWRPbkludGVybmFsKHN0cmluZywgbGVuZ3RoLCBjLCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZW5kLgotCSAqIFN0cmluZyNwYWRPbihpbnQsIGNoYXIsIFN0cmluZ0J1ZmZlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGFkT24oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGg7Ci0JCWlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlN0cmluZyBpcyB0b28gbG9uZzogIiArIHN0cmluZ0xlbmd0aCArICIgPiAiICsgbGVuZ3RoKTsKLQkJfQotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQlwYWRPbkludGVybmFsKHN0cmluZywgbGVuZ3RoLCBjLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHRydW5jYXRlZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHNwYWNlcyBhdCB0aGUgZW5kLgotCSAqIFN0cmluZyNwYWRPclRydW5jYXRlKGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwYWRPclRydW5jYXRlKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgpIHsKLQkJcmV0dXJuIHBhZE9yVHJ1bmNhdGUoc3RyaW5nLCBsZW5ndGgsICcgJyk7Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyB0cnVuY2F0ZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCBzcGFjZXMgYXQgdGhlIGVuZC4KLQkgKiBTdHJpbmcjcGFkT3JUcnVuY2F0ZU9uKGludCwgV3JpdGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwYWRPclRydW5jYXRlT24oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgV3JpdGVyIHdyaXRlcikgewotCQlwYWRPclRydW5jYXRlT24oc3RyaW5nLCBsZW5ndGgsICcgJywgd3JpdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHRydW5jYXRlZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHNwYWNlcyBhdCB0aGUgZW5kLgotCSAqIFN0cmluZyNwYWRPclRydW5jYXRlT24oaW50LCBTdHJpbmdCdWZmZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBhZE9yVHJ1bmNhdGVPbihTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJcGFkT3JUcnVuY2F0ZU9uKHN0cmluZywgbGVuZ3RoLCAnICcsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHRydW5jYXRlZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGVuZC4KLQkgKiBTdHJpbmcjcGFkT3JUcnVuY2F0ZShpbnQsIGNoYXIpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGFkT3JUcnVuY2F0ZShTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXJldHVybiBzdHJpbmc7Ci0JCX0KLQkJaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJcmV0dXJuIHN0cmluZy5zdWJzdHJpbmcoMCwgbGVuZ3RoKTsKLQkJfQotCQlyZXR1cm4gcGFkSW50ZXJuYWwoc3RyaW5nLCBsZW5ndGgsIGMpOwotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgdHJ1bmNhdGVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZW5kLgotCSAqIFN0cmluZyNwYWRPclRydW5jYXRlT24oaW50LCBjaGFyLCBXcml0ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBhZE9yVHJ1bmNhdGVPbihTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFdyaXRlciB3cml0ZXIpIHsKLQkJcGFkT3JUcnVuY2F0ZU9uKHN0cmluZy50b0NoYXJBcnJheSgpLCBsZW5ndGgsIGMsIHdyaXRlcik7Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyB0cnVuY2F0ZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBlbmQuCi0JICogU3RyaW5nI3BhZE9yVHJ1bmNhdGVPbihpbnQsIGNoYXIsIFN0cmluZ0J1ZmZlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGFkT3JUcnVuY2F0ZU9uKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCXBhZE9yVHJ1bmNhdGVPbihzdHJpbmcudG9DaGFyQXJyYXkoKSwgbGVuZ3RoLCBjLCBzYik7Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyB0cnVuY2F0ZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCBzcGFjZXMgYXQgdGhlIGVuZC4KLQkgKiBTdHJpbmcjcGFkT3JUcnVuY2F0ZShpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gcGFkT3JUcnVuY2F0ZShjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoKSB7Ci0JCXJldHVybiBwYWRPclRydW5jYXRlKHN0cmluZywgbGVuZ3RoLCAnICcpOwotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgdHJ1bmNhdGVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggc3BhY2VzIGF0IHRoZSBlbmQuCi0JICogU3RyaW5nI3BhZE9yVHJ1bmNhdGVPbihpbnQsIFdyaXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGFkT3JUcnVuY2F0ZU9uKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIFdyaXRlciB3cml0ZXIpIHsKLQkJcGFkT3JUcnVuY2F0ZU9uKHN0cmluZywgbGVuZ3RoLCAnICcsIHdyaXRlcik7Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyB0cnVuY2F0ZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCBzcGFjZXMgYXQgdGhlIGVuZC4KLQkgKiBTdHJpbmcjcGFkT3JUcnVuY2F0ZU9uKGludCwgU3RyaW5nQnVmZmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwYWRPclRydW5jYXRlKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIFN0cmluZ0J1ZmZlciBzYikgewotCQlwYWRPclRydW5jYXRlT24oc3RyaW5nLCBsZW5ndGgsICcgJywgc2IpOwotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgdHJ1bmNhdGVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZW5kLgotCSAqIFN0cmluZyNwYWRPclRydW5jYXRlKGludCwgY2hhcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBwYWRPclRydW5jYXRlKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYykgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aDsKLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXJldHVybiBzdHJpbmc7Ci0JCX0KLQkJaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW2xlbmd0aF07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHN0cmluZywgMCwgcmVzdWx0LCAwLCBsZW5ndGgpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlyZXR1cm4gcGFkSW50ZXJuYWwoc3RyaW5nLCBsZW5ndGgsIGMpOwotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgdHJ1bmNhdGVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZW5kLgotCSAqIFN0cmluZyNwYWRPclRydW5jYXRlT24oaW50LCBjaGFyLCBXcml0ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBhZE9yVHJ1bmNhdGVPbihjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFdyaXRlciB3cml0ZXIpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGg7Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQl3cml0ZVN0cmluZ09uKHN0cmluZywgd3JpdGVyKTsKLQkJfSBlbHNlIGlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXdyaXRlU3RyaW5nT24oc3RyaW5nLCAwLCBsZW5ndGgsIHdyaXRlcik7Ci0JCX0gZWxzZSB7Ci0JCQlwYWRPbkludGVybmFsKHN0cmluZywgbGVuZ3RoLCBjLCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyB0cnVuY2F0ZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBlbmQuCi0JICogU3RyaW5nI3BhZE9yVHJ1bmNhdGVPbihpbnQsIGNoYXIsIFN0cmluZ0J1ZmZlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGFkT3JUcnVuY2F0ZU9uKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoOwotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSBpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nLCAwLCBsZW5ndGgpOwotCQl9IGVsc2UgewotCQkJcGFkT25JbnRlcm5hbChzdHJpbmcsIGxlbmd0aCwgYywgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGhvdXQgdmFsaWRhdGluZyB0aGUgcGFybXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHBhZEludGVybmFsKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYykgewotCQlyZXR1cm4gbmV3IFN0cmluZyhwYWRJbnRlcm5hbChzdHJpbmcudG9DaGFyQXJyYXkoKSwgbGVuZ3RoLCBjKSk7Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGhvdXQgdmFsaWRhdGluZyB0aGUgcGFybXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2hhcltdIHBhZEludGVybmFsKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYykgewotCQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbbGVuZ3RoXTsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGg7Ci0JCVN5c3RlbS5hcnJheWNvcHkoc3RyaW5nLCAwLCByZXN1bHQsIDAsIHN0cmluZ0xlbmd0aCk7Ci0JCUFycmF5cy5maWxsKHJlc3VsdCwgc3RyaW5nTGVuZ3RoLCBsZW5ndGgsIGMpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRob3V0IHZhbGlkYXRpbmcgdGhlIHBhcm1zLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgcGFkT25JbnRlcm5hbChjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFdyaXRlciB3cml0ZXIpIHsKLQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIHdyaXRlcik7Ci0JCXdyaXRlU3RyaW5nT24oQ29sbGVjdGlvblRvb2xzLmZpbGwobmV3IGNoYXJbbGVuZ3RoIC0gc3RyaW5nLmxlbmd0aF0sIGMpLCB3cml0ZXIpOwotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRob3V0IHZhbGlkYXRpbmcgdGhlIHBhcm1zLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgcGFkT25JbnRlcm5hbChjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1ZmZlciBzYikgewotCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJc2IuYXBwZW5kKENvbGxlY3Rpb25Ub29scy5maWxsKG5ldyBjaGFyW2xlbmd0aCAtIHN0cmluZy5sZW5ndGhdLCBjKSk7Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggemVyb3MgYXQgdGhlIGZyb250LgotCSAqIFN0cmluZyN6ZXJvUGFkKGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB6ZXJvUGFkKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgpIHsKLQkJcmV0dXJuIGZyb250UGFkKHN0cmluZywgbGVuZ3RoLCAnMCcpOwotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHplcm9zIGF0IHRoZSBmcm9udC4KLQkgKiBTdHJpbmcjemVyb1BhZE9uKGludCwgV3JpdGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB6ZXJvUGFkT24oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgV3JpdGVyIHdyaXRlcikgewotCQlmcm9udFBhZE9uKHN0cmluZywgbGVuZ3RoLCAnMCcsIHdyaXRlcik7Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggemVyb3MgYXQgdGhlIGZyb250LgotCSAqIFN0cmluZyN6ZXJvUGFkT24oaW50LCBTdHJpbmdCdWZmZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHplcm9QYWRPbihTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJZnJvbnRQYWRPbihzdHJpbmcsIGxlbmd0aCwgJzAnLCBzYik7Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZnJvbnQuCi0JICogU3RyaW5nI2Zyb250UGFkKGludCwgY2hhcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmcm9udFBhZChTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU3RyaW5nIGlzIHRvbyBsb25nOiAiICsgc3RyaW5nTGVuZ3RoICsgIiA+ICIgKyBsZW5ndGgpOwotCQl9Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQlyZXR1cm4gc3RyaW5nOwotCQl9Ci0JCXJldHVybiBmcm9udFBhZEludGVybmFsKHN0cmluZywgbGVuZ3RoLCBjKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBmcm9udC4KLQkgKiBTdHJpbmcjZnJvbnRQYWRPbihpbnQsIGNoYXIsIFdyaXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZnJvbnRQYWRPbihTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFdyaXRlciB3cml0ZXIpIHsKLQkJZnJvbnRQYWRPbihzdHJpbmcudG9DaGFyQXJyYXkoKSwgbGVuZ3RoLCBjLCB3cml0ZXIpOwotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGZyb250LgotCSAqIFN0cmluZyNmcm9udFBhZE9uKGludCwgY2hhciwgU3RyaW5nQnVmZmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBmcm9udFBhZE9uKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWZyb250UGFkT24oc3RyaW5nLnRvQ2hhckFycmF5KCksIGxlbmd0aCwgYywgc2IpOwotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHplcm9zIGF0IHRoZSBmcm9udC4KLQkgKiBTdHJpbmcjemVyb1BhZChpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gemVyb1BhZChjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoKSB7Ci0JCXJldHVybiBmcm9udFBhZChzdHJpbmcsIGxlbmd0aCwgJzAnKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB6ZXJvcyBhdCB0aGUgZnJvbnQuCi0JICogU3RyaW5nI3plcm9QYWRPbihpbnQsIFdyaXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgemVyb1BhZE9uKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIFdyaXRlciB3cml0ZXIpIHsKLQkJZnJvbnRQYWRPbihzdHJpbmcsIGxlbmd0aCwgJzAnLCB3cml0ZXIpOwotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHplcm9zIGF0IHRoZSBmcm9udC4KLQkgKiBTdHJpbmcjemVyb1BhZE9uKGludCwgU3RyaW5nQnVmZmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB6ZXJvUGFkT24oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWZyb250UGFkT24oc3RyaW5nLCBsZW5ndGgsICcwJywgc2IpOwotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGZyb250LgotCSAqIFN0cmluZyNmcm9udFBhZChpbnQsIGNoYXIpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gZnJvbnRQYWQoY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoOwotCQlpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTdHJpbmcgaXMgdG9vIGxvbmc6ICIgKyBzdHJpbmdMZW5ndGggKyAiID4gIiArIGxlbmd0aCk7Ci0JCX0KLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXJldHVybiBzdHJpbmc7Ci0JCX0KLQkJcmV0dXJuIGZyb250UGFkSW50ZXJuYWwoc3RyaW5nLCBsZW5ndGgsIGMpOwotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGZyb250LgotCSAqIFN0cmluZyNmcm9udFBhZE9uKGludCwgY2hhciwgV3JpdGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBmcm9udFBhZE9uKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgV3JpdGVyIHdyaXRlcikgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aDsKLQkJaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU3RyaW5nIGlzIHRvbyBsb25nOiAiICsgc3RyaW5nTGVuZ3RoICsgIiA+ICIgKyBsZW5ndGgpOwotCQl9Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQl3cml0ZVN0cmluZ09uKHN0cmluZywgd3JpdGVyKTsKLQkJfSBlbHNlIHsKLQkJCWZyb250UGFkT25JbnRlcm5hbChzdHJpbmcsIGxlbmd0aCwgYywgd3JpdGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGZyb250LgotCSAqIFN0cmluZyNmcm9udFBhZE9uKGludCwgY2hhciwgU3RyaW5nQnVmZmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBmcm9udFBhZE9uKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoOwotCQlpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTdHJpbmcgaXMgdG9vIGxvbmc6ICIgKyBzdHJpbmdMZW5ndGggKyAiID4gIiArIGxlbmd0aCk7Ci0JCX0KLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJZnJvbnRQYWRPbkludGVybmFsKHN0cmluZywgbGVuZ3RoLCBjLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIG9ubHkgdGhlIGxhc3QgcGFydCBvZiB0aGUgc3RyaW5nIGlzIHJldHVybmVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggemVyb3MgYXQgdGhlIGZyb250LgotCSAqIFN0cmluZyN6ZXJvUGFkT3JUcnVuY2F0ZShpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgemVyb1BhZE9yVHJ1bmNhdGUoU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCkgewotCQlyZXR1cm4gZnJvbnRQYWRPclRydW5jYXRlKHN0cmluZywgbGVuZ3RoLCAnMCcpOwotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgb25seSB0aGUgbGFzdCBwYXJ0IG9mIHRoZSBzdHJpbmcgaXMgcmV0dXJuZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB6ZXJvcyBhdCB0aGUgZnJvbnQuCi0JICogU3RyaW5nI3plcm9QYWRPclRydW5jYXRlT24oaW50LCBXcml0ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHplcm9QYWRPclRydW5jYXRlT24oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgV3JpdGVyIHdyaXRlcikgewotCQlmcm9udFBhZE9yVHJ1bmNhdGVPbihzdHJpbmcsIGxlbmd0aCwgJzAnLCB3cml0ZXIpOwotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgb25seSB0aGUgbGFzdCBwYXJ0IG9mIHRoZSBzdHJpbmcgaXMgcmV0dXJuZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB6ZXJvcyBhdCB0aGUgZnJvbnQuCi0JICogU3RyaW5nI3plcm9QYWRPclRydW5jYXRlT24oaW50LCBTdHJpbmdCdWZmZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHplcm9QYWRPclRydW5jYXRlT24oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWZyb250UGFkT3JUcnVuY2F0ZU9uKHN0cmluZywgbGVuZ3RoLCAnMCcsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIG9ubHkgdGhlIGxhc3QgcGFydCBvZiB0aGUgc3RyaW5nIGlzIHJldHVybmVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZnJvbnQuCi0JICogU3RyaW5nI2Zyb250UGFkT3JUcnVuY2F0ZShpbnQsIGNoYXIpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZnJvbnRQYWRPclRydW5jYXRlKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYykgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aCgpOwotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJcmV0dXJuIHN0cmluZzsKLQkJfQotCQlpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQlyZXR1cm4gc3RyaW5nLnN1YnN0cmluZyhzdHJpbmdMZW5ndGggLSBsZW5ndGgpOwotCQl9Ci0JCXJldHVybiBmcm9udFBhZEludGVybmFsKHN0cmluZywgbGVuZ3RoLCBjKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIG9ubHkgdGhlIGxhc3QgcGFydCBvZiB0aGUgc3RyaW5nIGlzIHJldHVybmVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZnJvbnQuCi0JICogU3RyaW5nI2Zyb250UGFkT3JUcnVuY2F0ZU9uKGludCwgY2hhciwgV3JpdGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBmcm9udFBhZE9yVHJ1bmNhdGVPbihTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFdyaXRlciB3cml0ZXIpIHsKLQkJZnJvbnRQYWRPclRydW5jYXRlT24oc3RyaW5nLnRvQ2hhckFycmF5KCksIGxlbmd0aCwgYywgd3JpdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIG9ubHkgdGhlIGxhc3QgcGFydCBvZiB0aGUgc3RyaW5nIGlzIHJldHVybmVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZnJvbnQuCi0JICogU3RyaW5nI2Zyb250UGFkT3JUcnVuY2F0ZU9uKGludCwgY2hhciwgU3RyaW5nQnVmZmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBmcm9udFBhZE9yVHJ1bmNhdGVPbihTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1ZmZlciBzYikgewotCQlmcm9udFBhZE9yVHJ1bmNhdGVPbihzdHJpbmcudG9DaGFyQXJyYXkoKSwgbGVuZ3RoLCBjLCBzYik7Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBvbmx5IHRoZSBsYXN0IHBhcnQgb2YgdGhlIHN0cmluZyBpcyByZXR1cm5lZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHplcm9zIGF0IHRoZSBmcm9udC4KLQkgKiBTdHJpbmcjemVyb1BhZE9yVHJ1bmNhdGUoaW50KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHplcm9QYWRPclRydW5jYXRlKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgpIHsKLQkJcmV0dXJuIGZyb250UGFkT3JUcnVuY2F0ZShzdHJpbmcsIGxlbmd0aCwgJzAnKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIG9ubHkgdGhlIGxhc3QgcGFydCBvZiB0aGUgc3RyaW5nIGlzIHJldHVybmVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggemVyb3MgYXQgdGhlIGZyb250LgotCSAqIFN0cmluZyN6ZXJvUGFkT3JUcnVuY2F0ZU9uKGludCwgV3JpdGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB6ZXJvUGFkT3JUcnVuY2F0ZU9uKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIFdyaXRlciB3cml0ZXIpIHsKLQkJZnJvbnRQYWRPclRydW5jYXRlT24oc3RyaW5nLCBsZW5ndGgsICcwJywgd3JpdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIG9ubHkgdGhlIGxhc3QgcGFydCBvZiB0aGUgc3RyaW5nIGlzIHJldHVybmVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggemVyb3MgYXQgdGhlIGZyb250LgotCSAqIFN0cmluZyN6ZXJvUGFkT3JUcnVuY2F0ZU9uKGludCwgU3RyaW5nQnVmZmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB6ZXJvUGFkT3JUcnVuY2F0ZU9uKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIFN0cmluZ0J1ZmZlciBzYikgewotCQlmcm9udFBhZE9yVHJ1bmNhdGVPbihzdHJpbmcsIGxlbmd0aCwgJzAnLCBzYik7Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBvbmx5IHRoZSBsYXN0IHBhcnQgb2YgdGhlIHN0cmluZyBpcyByZXR1cm5lZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZSAKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBmcm9udC4KLQkgKiBTdHJpbmcjZnJvbnRQYWRPclRydW5jYXRlKGludCwgY2hhcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBmcm9udFBhZE9yVHJ1bmNhdGUoY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoOwotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJcmV0dXJuIHN0cmluZzsKLQkJfQotCQlpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbbGVuZ3RoXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoc3RyaW5nLCBzdHJpbmdMZW5ndGggLSBsZW5ndGgsIHJlc3VsdCwgMCwgbGVuZ3RoKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJcmV0dXJuIGZyb250UGFkSW50ZXJuYWwoc3RyaW5nLCBsZW5ndGgsIGMpOwotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgb25seSB0aGUgbGFzdCBwYXJ0IG9mIHRoZSBzdHJpbmcgaXMgcmV0dXJuZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUgCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZnJvbnQuCi0JICogU3RyaW5nI2Zyb250UGFkT3JUcnVuY2F0ZU9uKGludCwgY2hhciwgV3JpdGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBmcm9udFBhZE9yVHJ1bmNhdGVPbihjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFdyaXRlciB3cml0ZXIpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGg7Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQl3cml0ZVN0cmluZ09uKHN0cmluZywgd3JpdGVyKTsKLQkJfSBlbHNlIGlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXdyaXRlU3RyaW5nT24oc3RyaW5nLCBzdHJpbmdMZW5ndGggLSBsZW5ndGgsIGxlbmd0aCwgd3JpdGVyKTsKLQkJfSBlbHNlIHsKLQkJCWZyb250UGFkT25JbnRlcm5hbChzdHJpbmcsIGxlbmd0aCwgYywgd3JpdGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgb25seSB0aGUgbGFzdCBwYXJ0IG9mIHRoZSBzdHJpbmcgaXMgcmV0dXJuZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUgCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZnJvbnQuCi0JICogU3RyaW5nI2Zyb250UGFkT3JUcnVuY2F0ZU9uKGludCwgY2hhciwgU3RyaW5nQnVmZmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBmcm9udFBhZE9yVHJ1bmNhdGVPbihjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aDsKLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJc2IuYXBwZW5kKHN0cmluZywgc3RyaW5nTGVuZ3RoIC0gbGVuZ3RoLCBsZW5ndGgpOwotCQl9IGVsc2UgewotCQkJZnJvbnRQYWRPbkludGVybmFsKHN0cmluZywgbGVuZ3RoLCBjLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBGcm9udC1wYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aG91dCB2YWxpZGF0aW5nIHRoZSBwYXJtcy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZnJvbnRQYWRJbnRlcm5hbChTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmcoZnJvbnRQYWRJbnRlcm5hbChzdHJpbmcudG9DaGFyQXJyYXkoKSwgbGVuZ3RoLCBjKSk7Ci0JfQotCi0JLyoqCi0JICogWmVyby1wYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aG91dCB2YWxpZGF0aW5nIHRoZSBwYXJtcy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjaGFyW10gZnJvbnRQYWRJbnRlcm5hbChjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMpIHsKLQkJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW2xlbmd0aF07Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoOwotCQlpbnQgcGFkTGVuZ3RoID0gbGVuZ3RoIC0gc3RyaW5nTGVuZ3RoOwotCQlTeXN0ZW0uYXJyYXljb3B5KHN0cmluZywgMCwgcmVzdWx0LCBwYWRMZW5ndGgsIHN0cmluZ0xlbmd0aCk7Ci0JCUFycmF5cy5maWxsKHJlc3VsdCwgMCwgcGFkTGVuZ3RoLCBjKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aG91dCB2YWxpZGF0aW5nIHRoZSBwYXJtcy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGZyb250UGFkT25JbnRlcm5hbChjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFdyaXRlciB3cml0ZXIpIHsKLQkJd3JpdGVTdHJpbmdPbihDb2xsZWN0aW9uVG9vbHMuZmlsbChuZXcgY2hhcltsZW5ndGggLSBzdHJpbmcubGVuZ3RoXSwgYyksIHdyaXRlcik7Ci0JCXdyaXRlU3RyaW5nT24oc3RyaW5nLCB3cml0ZXIpOwotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRob3V0IHZhbGlkYXRpbmcgdGhlIHBhcm1zLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZnJvbnRQYWRPbkludGVybmFsKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCXNiLmFwcGVuZChDb2xsZWN0aW9uVG9vbHMuZmlsbChuZXcgY2hhcltsZW5ndGggLSBzdHJpbmcubGVuZ3RoXSwgYykpOwotCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogd3JhcHBpbmcvcXVvdGluZyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBXcmFwIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggZG91YmxlIHF1b3Rlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBxdW90ZShTdHJpbmcgc3RyaW5nKSB7Ci0JCXJldHVybiB3cmFwKHN0cmluZywgUVVPVEUpOwotCX0KLQotCS8qKgotCSAqIFdyYXAgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCBkb3VibGUgcXVvdGVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBxdW90ZU9uKFN0cmluZyBzdHJpbmcsIFdyaXRlciB3cml0ZXIpIHsKLQkJd3JhcE9uKHN0cmluZywgUVVPVEUsIHdyaXRlcik7Ci0JfQotCi0JLyoqCi0JICogV3JhcCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIGRvdWJsZSBxdW90ZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHF1b3RlT24oU3RyaW5nIHN0cmluZywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCXdyYXBPbihzdHJpbmcsIFFVT1RFLCBzYik7Ci0JfQotCi0JLyoqCi0JICogV3JhcCBlYWNoIG9mIHRoZSBzcGVjaWZpZWQgc3RyaW5ncyB3aXRoIGRvdWJsZSBxdW90ZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvcjxTdHJpbmc+IHF1b3RlKEl0ZXJhdG9yPFN0cmluZz4gc3RyaW5ncykgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8U3RyaW5nLCBTdHJpbmc+KHN0cmluZ3MpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oU3RyaW5nIHN0cmluZykgewotCQkJCXJldHVybiBTdHJpbmdUb29scy5xdW90ZShzdHJpbmcpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIFdyYXAgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXA7IGkuZS4gcHV0IGEgY29weSBvZgotCSAqIHRoZSB3cmFwIGF0IHRoZSBmcm9udCBhbmQgYmFjayBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3cmFwKFN0cmluZyBzdHJpbmcsIGNoYXIgd3JhcCkgewotCQlyZXR1cm4gbmV3IFN0cmluZyh3cmFwKHN0cmluZy50b0NoYXJBcnJheSgpLCB3cmFwKSk7Ci0JfQotCi0JLyoqCi0JICogV3JhcCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIHRoZSBzcGVjaWZpZWQgd3JhcDsgaS5lLiBwdXQgYSBjb3B5IG9mCi0JICogdGhlIHdyYXAgYXQgdGhlIGZyb250IGFuZCBiYWNrIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB3cmFwT24oU3RyaW5nIHN0cmluZywgY2hhciB3cmFwLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCXdyYXBPbihzdHJpbmcudG9DaGFyQXJyYXkoKSwgd3JhcCwgd3JpdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBXcmFwIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggdGhlIHNwZWNpZmllZCB3cmFwOyBpLmUuIHB1dCBhIGNvcHkgb2YKLQkgKiB0aGUgd3JhcCBhdCB0aGUgZnJvbnQgYW5kIGJhY2sgb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHdyYXBPbihTdHJpbmcgc3RyaW5nLCBjaGFyIHdyYXAsIFN0cmluZ0J1ZmZlciBzYikgewotCQl3cmFwT24oc3RyaW5nLnRvQ2hhckFycmF5KCksIHdyYXAsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBXcmFwIGVhY2ggb2YgdGhlIHNwZWNpZmllZCBzdHJpbmdzIHdpdGggdGhlIHNwZWNpZmllZCB3cmFwOyBpLmUuIHB1dCBhCi0JICogY29weSBvZiB0aGUgd3JhcCBhdCB0aGUgZnJvbnQgYW5kIGJhY2sgb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvcjxTdHJpbmc+IHdyYXAoSXRlcmF0b3I8U3RyaW5nPiBzdHJpbmdzLCBmaW5hbCBjaGFyIHdyYXApIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPFN0cmluZywgU3RyaW5nPihzdHJpbmdzKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKFN0cmluZyBzdHJpbmcpIHsKLQkJCQlyZXR1cm4gU3RyaW5nVG9vbHMud3JhcChzdHJpbmcsIHdyYXApOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIFdyYXAgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXA7IGkuZS4gcHV0IGEgY29weSBvZgotCSAqIHRoZSB3cmFwIGF0IHRoZSBmcm9udCBhbmQgYmFjayBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3cmFwKFN0cmluZyBzdHJpbmcsIFN0cmluZyB3cmFwKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nKHdyYXAoc3RyaW5nLnRvQ2hhckFycmF5KCksIHdyYXAudG9DaGFyQXJyYXkoKSkpOwotCX0KLQotCS8qKgotCSAqIFdyYXAgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXA7IGkuZS4gcHV0IGEgY29weSBvZgotCSAqIHRoZSB3cmFwIGF0IHRoZSBmcm9udCBhbmQgYmFjayBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgd3JhcE9uKFN0cmluZyBzdHJpbmcsIFN0cmluZyB3cmFwLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCXdyYXBPbihzdHJpbmcudG9DaGFyQXJyYXkoKSwgd3JhcC50b0NoYXJBcnJheSgpLCB3cml0ZXIpOwotCX0KLQotCS8qKgotCSAqIFdyYXAgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXA7IGkuZS4gcHV0IGEgY29weSBvZgotCSAqIHRoZSB3cmFwIGF0IHRoZSBmcm9udCBhbmQgYmFjayBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgd3JhcE9uKFN0cmluZyBzdHJpbmcsIFN0cmluZyB3cmFwLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJd3JhcE9uKHN0cmluZy50b0NoYXJBcnJheSgpLCB3cmFwLnRvQ2hhckFycmF5KCksIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBXcmFwIGVhY2ggb2YgdGhlIHNwZWNpZmllZCBzdHJpbmdzIHdpdGggdGhlIHNwZWNpZmllZCB3cmFwOyBpLmUuIHB1dCBhCi0JICogY29weSBvZiB0aGUgd3JhcCBhdCB0aGUgZnJvbnQgYW5kIGJhY2sgb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvcjxTdHJpbmc+IHdyYXAoSXRlcmF0b3I8U3RyaW5nPiBzdHJpbmdzLCBmaW5hbCBTdHJpbmcgd3JhcCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8U3RyaW5nLCBTdHJpbmc+KHN0cmluZ3MpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oU3RyaW5nIHN0cmluZykgewotCQkJCXJldHVybiBTdHJpbmdUb29scy53cmFwKHN0cmluZywgd3JhcCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogV3JhcCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIGRvdWJsZSBxdW90ZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gcXVvdGUoY2hhcltdIHN0cmluZykgewotCQlyZXR1cm4gd3JhcChzdHJpbmcsIFFVT1RFKTsKLQl9Ci0KLQkvKioKLQkgKiBXcmFwIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggZG91YmxlIHF1b3Rlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcXVvdGVPbihjaGFyW10gc3RyaW5nLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCXdyYXBPbihzdHJpbmcsIFFVT1RFLCB3cml0ZXIpOwotCX0KLQotCS8qKgotCSAqIFdyYXAgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCBkb3VibGUgcXVvdGVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBxdW90ZU9uKGNoYXJbXSBzdHJpbmcsIFN0cmluZ0J1ZmZlciBzYikgewotCQl3cmFwT24oc3RyaW5nLCBRVU9URSwgc2IpOwotCX0KLQotCS8qKgotCSAqIFdyYXAgZWFjaCBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZ3Mgd2l0aCBkb3VibGUgcXVvdGVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8Y2hhcltdPiBxdW90ZUNoYXJBcnJheXMoSXRlcmF0b3I8Y2hhcltdPiBzdHJpbmdzKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxjaGFyW10sIGNoYXJbXT4oc3RyaW5ncykgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgY2hhcltdIHRyYW5zZm9ybShjaGFyW10gc3RyaW5nKSB7Ci0JCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLnF1b3RlKHN0cmluZyk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogV3JhcCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIHRoZSBzcGVjaWZpZWQgd3JhcDsgaS5lLiBwdXQgYSBjb3B5IG9mCi0JICogdGhlIHdyYXAgYXQgdGhlIGZyb250IGFuZCBiYWNrIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHdyYXAoY2hhcltdIHN0cmluZywgY2hhciB3cmFwKSB7Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoOwotCQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbbGVuKzJdOwotCQlyZXN1bHRbMF0gPSB3cmFwOwotCQlTeXN0ZW0uYXJyYXljb3B5KHN0cmluZywgMCwgcmVzdWx0LCAxLCBsZW4pOwotCQlyZXN1bHRbbGVuKzFdID0gd3JhcDsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBXcmFwIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggdGhlIHNwZWNpZmllZCB3cmFwOyBpLmUuIHB1dCBhIGNvcHkgb2YKLQkgKiB0aGUgd3JhcCBhdCB0aGUgZnJvbnQgYW5kIGJhY2sgb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHdyYXBPbihjaGFyW10gc3RyaW5nLCBjaGFyIHdyYXAsIFdyaXRlciB3cml0ZXIpIHsKLQkJd3JpdGVDaGFyT24od3JhcCwgd3JpdGVyKTsKLQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIHdyaXRlcik7Ci0JCXdyaXRlQ2hhck9uKHdyYXAsIHdyaXRlcik7Ci0JfQotCi0JLyoqCi0JICogV3JhcCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIHRoZSBzcGVjaWZpZWQgd3JhcDsgaS5lLiBwdXQgYSBjb3B5IG9mCi0JICogdGhlIHdyYXAgYXQgdGhlIGZyb250IGFuZCBiYWNrIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB3cmFwT24oY2hhcltdIHN0cmluZywgY2hhciB3cmFwLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHdyYXApOwotCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJc2IuYXBwZW5kKHdyYXApOwotCX0KLQotCS8qKgotCSAqIFdyYXAgZWFjaCBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZ3Mgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXA7IGkuZS4gcHV0IGEKLQkgKiBjb3B5IG9mIHRoZSB3cmFwIGF0IHRoZSBmcm9udCBhbmQgYmFjayBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPGNoYXJbXT4gd3JhcENoYXJBcnJheXMoSXRlcmF0b3I8Y2hhcltdPiBzdHJpbmdzLCBmaW5hbCBjaGFyIHdyYXApIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPGNoYXJbXSwgY2hhcltdPihzdHJpbmdzKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBjaGFyW10gdHJhbnNmb3JtKGNoYXJbXSBzdHJpbmcpIHsKLQkJCQlyZXR1cm4gU3RyaW5nVG9vbHMud3JhcChzdHJpbmcsIHdyYXApOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIFdyYXAgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXA7IGkuZS4gcHV0IGEgY29weSBvZgotCSAqIHRoZSB3cmFwIGF0IHRoZSBmcm9udCBhbmQgYmFjayBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSB3cmFwKGNoYXJbXSBzdHJpbmcsIGNoYXJbXSB3cmFwKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoOwotCQlpbnQgd3JhcExlbmd0aCA9IHdyYXAubGVuZ3RoOwotCQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbc3RyaW5nTGVuZ3RoKygyKndyYXBMZW5ndGgpXTsKLQkJU3lzdGVtLmFycmF5Y29weSh3cmFwLCAwLCByZXN1bHQsIDAsIHdyYXBMZW5ndGgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KHN0cmluZywgMCwgcmVzdWx0LCB3cmFwTGVuZ3RoLCBzdHJpbmdMZW5ndGgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KHdyYXAsIDAsIHJlc3VsdCwgc3RyaW5nTGVuZ3RoK3dyYXBMZW5ndGgsIHdyYXBMZW5ndGgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFdyYXAgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXA7IGkuZS4gcHV0IGEgY29weSBvZgotCSAqIHRoZSB3cmFwIGF0IHRoZSBmcm9udCBhbmQgYmFjayBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgd3JhcE9uKGNoYXJbXSBzdHJpbmcsIGNoYXJbXSB3cmFwLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCXdyaXRlU3RyaW5nT24od3JhcCwgd3JpdGVyKTsKLQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIHdyaXRlcik7Ci0JCXdyaXRlU3RyaW5nT24od3JhcCwgd3JpdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBXcmFwIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggdGhlIHNwZWNpZmllZCB3cmFwOyBpLmUuIHB1dCBhIGNvcHkgb2YKLQkgKiB0aGUgd3JhcCBhdCB0aGUgZnJvbnQgYW5kIGJhY2sgb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHdyYXBPbihjaGFyW10gc3RyaW5nLCBjaGFyW10gd3JhcCwgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh3cmFwKTsKLQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCXNiLmFwcGVuZCh3cmFwKTsKLQl9Ci0KLQkvKioKLQkgKiBXcmFwIGVhY2ggb2YgdGhlIHNwZWNpZmllZCBzdHJpbmdzIHdpdGggdGhlIHNwZWNpZmllZCB3cmFwOyBpLmUuIHB1dCBhCi0JICogY29weSBvZiB0aGUgd3JhcCBhdCB0aGUgZnJvbnQgYW5kIGJhY2sgb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvcjxjaGFyW10+IHdyYXBDaGFyQXJyYXlzKEl0ZXJhdG9yPGNoYXJbXT4gc3RyaW5ncywgZmluYWwgY2hhcltdIHdyYXApIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPGNoYXJbXSwgY2hhcltdPihzdHJpbmdzKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBjaGFyW10gdHJhbnNmb3JtKGNoYXJbXSBzdHJpbmcpIHsKLQkJCQlyZXR1cm4gU3RyaW5nVG9vbHMud3JhcChzdHJpbmcsIHdyYXApOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZW1vdmluZyBjaGFyYWN0ZXJzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlcgotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIFN0cmluZyNyZW1vdmVGaXJzdE9jY3VycmVuY2UoY2hhcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZW1vdmVGaXJzdE9jY3VycmVuY2UoU3RyaW5nIHN0cmluZywgY2hhciBjKSB7Ci0JCWludCBpbmRleCA9IHN0cmluZy5pbmRleE9mKGMpOwotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCS8vIGNoYXJhY3RlciBub3QgZm91bmQKLQkJCXJldHVybiBzdHJpbmc7Ci0JCX0KLQkJaWYgKGluZGV4ID09IDApIHsKLQkJCS8vIGNoYXJhY3RlciBmb3VuZCBhdCB0aGUgZnJvbnQgb2Ygc3RyaW5nCi0JCQlyZXR1cm4gc3RyaW5nLnN1YnN0cmluZygxKTsKLQkJfQotCQlpbnQgbGFzdCA9IHN0cmluZy5sZW5ndGgoKSAtIDE7Ci0JCWlmIChpbmRleCA9PSBsYXN0KSB7Ci0JCQkvLyBjaGFyYWN0ZXIgZm91bmQgYXQgdGhlIGVuZCBvZiBzdHJpbmcKLQkJCXJldHVybiBzdHJpbmcuc3Vic3RyaW5nKDAsIGxhc3QpOwotCQl9Ci0JCS8vIGNoYXJhY3RlciBmb3VuZCBzb21ld2hlcmUgaW4gdGhlIG1pZGRsZSBvZiB0aGUgc3RyaW5nCi0JCXJldHVybiBzdHJpbmcuc3Vic3RyaW5nKDAsIGluZGV4KS5jb25jYXQoc3RyaW5nLnN1YnN0cmluZyhpbmRleCArIDEpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBwcmludCB0aGUgcmVzdWx0IG9uIHRoZSBzcGVjaWZpZWQgc3RyZWFtLgotCSAqIFN0cmluZyNyZW1vdmVGaXJzdE9jY3VycmVuY2VPbihjaGFyLCBXcml0ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uKFN0cmluZyBzdHJpbmcsIGNoYXIgYywgV3JpdGVyIHdyaXRlcikgewotCQlyZW1vdmVGaXJzdE9jY3VycmVuY2VPbihzdHJpbmcudG9DaGFyQXJyYXkoKSwgYywgd3JpdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBwcmludCB0aGUgcmVzdWx0IG9uIHRoZSBzcGVjaWZpZWQgc3RyZWFtLgotCSAqIFN0cmluZyNyZW1vdmVGaXJzdE9jY3VycmVuY2VPbihjaGFyLCBTdHJpbmdCdWZmZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uKFN0cmluZyBzdHJpbmcsIGNoYXIgYywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCXJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uKHN0cmluZy50b0NoYXJBcnJheSgpLCBjLCBzYik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogU3RyaW5nI3JlbW92ZUZpcnN0T2NjdXJyZW5jZShjaGFyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHJlbW92ZUZpcnN0T2NjdXJyZW5jZShjaGFyW10gc3RyaW5nLCBjaGFyIGMpIHsKLQkJaW50IGluZGV4ID0gQ29sbGVjdGlvblRvb2xzLmluZGV4T2Yoc3RyaW5nLCBjKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQkvLyBjaGFyYWN0ZXIgbm90IGZvdW5kCi0JCQlyZXR1cm4gc3RyaW5nOwotCQl9Ci0KLQkJaW50IGxlbiA9IHN0cmluZy5sZW5ndGggLSAxOwotCQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbbGVuXTsKLQkJaWYgKGluZGV4ID09IDApIHsKLQkJCS8vIGNoYXJhY3RlciBmb3VuZCBhdCB0aGUgZnJvbnQgb2Ygc3RyaW5nCi0JCQlTeXN0ZW0uYXJyYXljb3B5KHN0cmluZywgMSwgcmVzdWx0LCAwLCBsZW4pOwotCQl9IGVsc2UgaWYgKGluZGV4ID09IGxlbikgewotCQkJLy8gY2hhcmFjdGVyIGZvdW5kIGF0IHRoZSBlbmQgb2Ygc3RyaW5nCi0JCQlTeXN0ZW0uYXJyYXljb3B5KHN0cmluZywgMCwgcmVzdWx0LCAwLCBsZW4pOwotCQl9IGVsc2UgewotCQkJLy8gY2hhcmFjdGVyIGZvdW5kIHNvbWV3aGVyZSBpbiB0aGUgbWlkZGxlIG9mIHRoZSBzdHJpbmcKLQkJCVN5c3RlbS5hcnJheWNvcHkoc3RyaW5nLCAwLCByZXN1bHQsIDAsIGluZGV4KTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoc3RyaW5nLCBpbmRleCArIDEsIHJlc3VsdCwgaW5kZXgsIGxlbiAtIGluZGV4KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlcgotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIHByaW50IHRoZSByZXN1bHQgb24gdGhlIHNwZWNpZmllZCBzdHJlYW0uCi0JICogU3RyaW5nI3JlbW92ZUZpcnN0T2NjdXJyZW5jZU9uKGNoYXIsIFdyaXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlRmlyc3RPY2N1cnJlbmNlT24oY2hhcltdIHN0cmluZywgY2hhciBjLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWludCBpbmRleCA9IENvbGxlY3Rpb25Ub29scy5pbmRleE9mKHN0cmluZywgYyk7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJLy8gY2hhcmFjdGVyIG5vdCBmb3VuZAotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIHdyaXRlcik7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aCAtIDE7Ci0JCWlmIChpbmRleCA9PSAwKSB7Ci0JCQkvLyBjaGFyYWN0ZXIgZm91bmQgYXQgdGhlIGZyb250IG9mIHN0cmluZwotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIDEsIGxlbiwgd3JpdGVyKTsKLQkJfSBlbHNlIGlmIChpbmRleCA9PSBsZW4pIHsKLQkJCS8vIGNoYXJhY3RlciBmb3VuZCBhdCB0aGUgZW5kIG9mIHN0cmluZwotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIDAsIGxlbiwgd3JpdGVyKTsKLQkJfSBlbHNlIHsKLQkJCS8vIGNoYXJhY3RlciBmb3VuZCBzb21ld2hlcmUgaW4gdGhlIG1pZGRsZSBvZiB0aGUgc3RyaW5nCi0JCQl3cml0ZVN0cmluZ09uKHN0cmluZywgMCwgaW5kZXgsIHdyaXRlcik7Ci0JCQl3cml0ZVN0cmluZ09uKHN0cmluZywgaW5kZXggKyAxLCBsZW4gLSBpbmRleCwgd3JpdGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlcgotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIHByaW50IHRoZSByZXN1bHQgb24gdGhlIHNwZWNpZmllZCBzdHJlYW0uCi0JICogU3RyaW5nI3JlbW92ZUZpcnN0T2NjdXJyZW5jZU9uKGNoYXIsIFN0cmluZ0J1ZmZlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlRmlyc3RPY2N1cnJlbmNlT24oY2hhcltdIHN0cmluZywgY2hhciBjLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaW50IGluZGV4ID0gQ29sbGVjdGlvblRvb2xzLmluZGV4T2Yoc3RyaW5nLCBjKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQkvLyBjaGFyYWN0ZXIgbm90IGZvdW5kCi0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoIC0gMTsKLQkJaWYgKGluZGV4ID09IDApIHsKLQkJCS8vIGNoYXJhY3RlciBmb3VuZCBhdCB0aGUgZnJvbnQgb2Ygc3RyaW5nCi0JCQlzYi5hcHBlbmQoc3RyaW5nLCAxLCBsZW4pOwotCQl9IGVsc2UgaWYgKGluZGV4ID09IGxlbikgewotCQkJLy8gY2hhcmFjdGVyIGZvdW5kIGF0IHRoZSBlbmQgb2Ygc3RyaW5nCi0JCQlzYi5hcHBlbmQoc3RyaW5nLCAwLCBsZW4pOwotCQl9IGVsc2UgewotCQkJLy8gY2hhcmFjdGVyIGZvdW5kIHNvbWV3aGVyZSBpbiB0aGUgbWlkZGxlIG9mIHRoZSBzdHJpbmcKLQkJCXNiLmFwcGVuZChzdHJpbmcsIDAsIGluZGV4KTsKLQkJCXNiLmFwcGVuZChzdHJpbmcsIGluZGV4ICsgMSwgbGVuIC0gaW5kZXgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCBvY2N1cnJlbmNlcyBvZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlcgotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIFN0cmluZyNyZW1vdmVBbGxPY2N1cnJlbmNlcyhjaGFyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZUFsbE9jY3VycmVuY2VzKFN0cmluZyBzdHJpbmcsIGNoYXIgYykgewotCQlyZXR1cm4gbmV3IFN0cmluZyhyZW1vdmVBbGxPY2N1cnJlbmNlcyhzdHJpbmcudG9DaGFyQXJyYXkoKSwgYykpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgb2NjdXJyZW5jZXMgb2YgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCB3cml0ZSB0aGUgcmVzdWx0IHRvIHRoZSBzcGVjaWZpZWQgc3RyZWFtLgotCSAqIFN0cmluZyNyZW1vdmVBbGxPY2N1cnJlbmNlc09uKGNoYXIsIFdyaXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQWxsT2NjdXJyZW5jZXNPbihTdHJpbmcgc3RyaW5nLCBjaGFyIGMsIFdyaXRlciB3cml0ZXIpIHsKLQkJcmVtb3ZlQWxsT2NjdXJyZW5jZXNPbihzdHJpbmcudG9DaGFyQXJyYXkoKSwgYywgd3JpdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIG9jY3VycmVuY2VzIG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgd3JpdGUgdGhlIHJlc3VsdCB0byB0aGUgc3BlY2lmaWVkIHN0cmVhbS4KLQkgKiBTdHJpbmcjcmVtb3ZlQWxsT2NjdXJyZW5jZXNPbihjaGFyLCBTdHJpbmdCdWZmZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUFsbE9jY3VycmVuY2VzT24oU3RyaW5nIHN0cmluZywgY2hhciBjLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJcmVtb3ZlQWxsT2NjdXJyZW5jZXNPbihzdHJpbmcudG9DaGFyQXJyYXkoKSwgYywgc2IpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgb2NjdXJyZW5jZXMgb2YgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiBTdHJpbmcjcmVtb3ZlQWxsT2NjdXJyZW5jZXMoY2hhcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSByZW1vdmVBbGxPY2N1cnJlbmNlcyhjaGFyW10gc3RyaW5nLCBjaGFyIGMpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihzdHJpbmcubGVuZ3RoKTsKLQkJcmVtb3ZlQWxsT2NjdXJyZW5jZXNPbihzdHJpbmcsIGMsIHNiKTsKLQkJaW50IGxlbiA9IHNiLmxlbmd0aCgpOwotCQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbbGVuXTsKLQkJc2IuZ2V0Q2hhcnMoMCwgbGVuLCByZXN1bHQsIDApOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgb2NjdXJyZW5jZXMgb2YgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCB3cml0ZSB0aGUgcmVzdWx0IHRvIHRoZQotCSAqIHNwZWNpZmllZCB3cml0ZXIuCi0JICogU3RyaW5nI3JlbW92ZUFsbE9jY3VycmVuY2VzT24oY2hhciwgV3JpdGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbGxPY2N1cnJlbmNlc09uKGNoYXJbXSBzdHJpbmcsIGNoYXIgYywgV3JpdGVyIHdyaXRlcikgewotCQlyZW1vdmVBbGxPY2N1cnJlbmNlc09uSW50ZXJuYWwoc3RyaW5nLCBjLCB3cml0ZXIpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgcmVtb3ZlQWxsT2NjdXJyZW5jZXNPbkludGVybmFsKGNoYXJbXSBzdHJpbmcsIGNoYXIgYywgV3JpdGVyIHdyaXRlcikgewotCQlmb3IgKGNoYXIgZCA6IHN0cmluZykgewotCQkJaWYgKGQgIT0gYykgewotCQkJCXdyaXRlQ2hhck9uKGQsIHdyaXRlcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIG9jY3VycmVuY2VzIG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgYXBwZW5kIHRoZSByZXN1bHQgdG8gdGhlCi0JICogc3BlY2lmaWVkIHN0cmluZyBidWZmZXIuCi0JICogU3RyaW5nI3JlbW92ZUFsbE9jY3VycmVuY2VzT24oY2hhciwgU3RyaW5nQnVmZmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbGxPY2N1cnJlbmNlc09uKGNoYXJbXSBzdHJpbmcsIGNoYXIgYywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWZvciAoY2hhciBkIDogc3RyaW5nKSB7Ci0JCQlpZiAoZCAhPSBjKSB7Ci0JCQkJc2IuYXBwZW5kKGQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCB0aGUgc3BhY2VzIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIFN0cmluZyNyZW1vdmVBbGxTcGFjZXMoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZUFsbFNwYWNlcyhTdHJpbmcgc3RyaW5nKSB7Ci0JCXJldHVybiByZW1vdmVBbGxPY2N1cnJlbmNlcyhzdHJpbmcsICcgJyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbW1vbiBwcmVmaXggKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGNvbW1vbiBwcmVmaXggc2hhcmVkIGJ5IHRoZSBzcGVjaWZpZWQgc3RyaW5ncy4KLQkgKiBTdHJpbmcjY29tbW9uUHJlZml4TGVuZ3RoKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBjb21tb25QcmVmaXhMZW5ndGgoU3RyaW5nIHMxLCBTdHJpbmcgczIpIHsKLQkJcmV0dXJuIGNvbW1vblByZWZpeExlbmd0aChzMS50b0NoYXJBcnJheSgpLCBzMi50b0NoYXJBcnJheSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgY29tbW9uIHByZWZpeCBzaGFyZWQgYnkgdGhlIHNwZWNpZmllZCBzdHJpbmdzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGNvbW1vblByZWZpeExlbmd0aChjaGFyW10gczEsIGNoYXJbXSBzMikgewotCQlyZXR1cm4gY29tbW9uUHJlZml4TGVuZ3RoSW50ZXJuYWwoczEsIHMyLCBNYXRoLm1pbihzMS5sZW5ndGgsIHMyLmxlbmd0aCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBjb21tb24gcHJlZml4IHNoYXJlZCBieSB0aGUgc3BlY2lmaWVkIHN0cmluZ3M7Ci0JICogYnV0IGxpbWl0IHRoZSBsZW5ndGggdG8gdGhlIHNwZWNpZmllZCBtYXhpbXVtLgotCSAqIFN0cmluZyNjb21tb25QcmVmaXhMZW5ndGgoU3RyaW5nLCBpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgY29tbW9uUHJlZml4TGVuZ3RoKFN0cmluZyBzMSwgU3RyaW5nIHMyLCBpbnQgbWF4KSB7Ci0JCXJldHVybiBjb21tb25QcmVmaXhMZW5ndGgoczEudG9DaGFyQXJyYXkoKSwgczIudG9DaGFyQXJyYXkoKSwgbWF4KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgY29tbW9uIHByZWZpeCBzaGFyZWQgYnkgdGhlIHNwZWNpZmllZCBzdHJpbmdzOwotCSAqIGJ1dCBsaW1pdCB0aGUgbGVuZ3RoIHRvIHRoZSBzcGVjaWZpZWQgbWF4aW11bS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBjb21tb25QcmVmaXhMZW5ndGgoY2hhcltdIHMxLCBjaGFyW10gczIsIGludCBtYXgpIHsKLQkJcmV0dXJuIGNvbW1vblByZWZpeExlbmd0aEludGVybmFsKHMxLCBzMiwgTWF0aC5taW4obWF4LCBNYXRoLm1pbihzMS5sZW5ndGgsIHMyLmxlbmd0aCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgY29tbW9uIHByZWZpeCBzaGFyZWQgYnkgdGhlIHNwZWNpZmllZCBzdHJpbmdzOwotCSAqIGJ1dCBsaW1pdCB0aGUgbGVuZ3RoIHRvIHRoZSBzcGVjaWZpZWQgbWF4aW11bS4gQXNzdW1lIHRoZSBzcGVjaWZpZWQKLQkgKiBtYXhpbXVtIGlzIGxlc3MgdGhhbiB0aGUgbGVuZ3RocyBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZ3MuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGNvbW1vblByZWZpeExlbmd0aEludGVybmFsKGNoYXJbXSBzMSwgY2hhcltdIHMyLCBpbnQgbWF4KSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKLQkJCWlmIChzMVtpXSAhPSBzMltpXSkgewotCQkJCXJldHVybiBpOwotCQkJfQotCQl9Ci0JCXJldHVybiBtYXg7CS8vIGFsbCB0aGUgY2hhcmFjdGVycyB1cCB0byAnbWF4JyBhcmUgdGhlIHNhbWUKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2FwaXRhbGl6YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogbm8gemVyby1sZW5ndGggY2hlY2sgb3IgbG93ZXIgY2FzZSBjaGVjawotCSAqLwotCXByaXZhdGUgc3RhdGljIGNoYXJbXSBjYXBpdGFsaXplSW50ZXJuYWwoY2hhcltdIHN0cmluZykgewotCQlzdHJpbmdbMF0gPSBDaGFyYWN0ZXIudG9VcHBlckNhc2Uoc3RyaW5nWzBdKTsKLQkJcmV0dXJuIHN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiBNb2RpZnkgYW5kIHJldHVybiB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoCi0JICogaXRzIGZpcnN0IGxldHRlciBjYXBpdGFsaXplZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBjYXBpdGFsaXplKGNoYXJbXSBzdHJpbmcpIHsKLQkJaWYgKChzdHJpbmcubGVuZ3RoID09IDApIHx8IENoYXJhY3Rlci5pc1VwcGVyQ2FzZShzdHJpbmdbMF0pKSB7Ci0JCQlyZXR1cm4gc3RyaW5nOwotCQl9Ci0JCXJldHVybiBjYXBpdGFsaXplSW50ZXJuYWwoc3RyaW5nKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCBpdHMgZmlyc3QgbGV0dGVyIGNhcGl0YWxpemVkLgotCSAqIFN0cmluZyNjYXBpdGFsaXplKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjYXBpdGFsaXplKFN0cmluZyBzdHJpbmcpIHsKLQkJaWYgKChzdHJpbmcubGVuZ3RoKCkgPT0gMCkgfHwgQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKHN0cmluZy5jaGFyQXQoMCkpKSB7Ci0JCQlyZXR1cm4gc3RyaW5nOwotCQl9Ci0JCXJldHVybiBuZXcgU3RyaW5nKGNhcGl0YWxpemVJbnRlcm5hbChzdHJpbmcudG9DaGFyQXJyYXkoKSkpOwotCX0KLQotCS8qKgotCSAqIG5vIHplcm8tbGVuZ3RoIGNoZWNrIG9yIHVwcGVyIGNhc2UgY2hlY2sKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNhcGl0YWxpemVPbkludGVybmFsKGNoYXJbXSBzdHJpbmcsIFN0cmluZ0J1ZmZlciBzYikgewotCQlzYi5hcHBlbmQoQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKHN0cmluZ1swXSkpOwotCQlzYi5hcHBlbmQoc3RyaW5nLCAxLCBzdHJpbmcubGVuZ3RoIC0gMSk7Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGJ1ZmZlcgotCSAqIHdpdGggaXRzIGZpcnN0IGxldHRlciBjYXBpdGFsaXplZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2FwaXRhbGl6ZU9uKGNoYXJbXSBzdHJpbmcsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpZiAoc3RyaW5nLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKENoYXJhY3Rlci5pc1VwcGVyQ2FzZShzdHJpbmdbMF0pKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCWNhcGl0YWxpemVPbkludGVybmFsKHN0cmluZywgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGJ1ZmZlcgotCSAqIHdpdGggaXRzIGZpcnN0IGxldHRlciBjYXBpdGFsaXplZC4KLQkgKiBTdHJpbmcjY2FwaXRhbGl6ZU9uKFN0cmluZ0J1ZmZlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2FwaXRhbGl6ZU9uKFN0cmluZyBzdHJpbmcsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpZiAoc3RyaW5nLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKHN0cmluZy5jaGFyQXQoMCkpKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCWNhcGl0YWxpemVPbkludGVybmFsKHN0cmluZy50b0NoYXJBcnJheSgpLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBubyB6ZXJvLWxlbmd0aCBjaGVjayBvciB1cHBlciBjYXNlIGNoZWNrCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjYXBpdGFsaXplT25JbnRlcm5hbChjaGFyW10gc3RyaW5nLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCXdyaXRlQ2hhck9uKENoYXJhY3Rlci50b1VwcGVyQ2FzZShzdHJpbmdbMF0pLCB3cml0ZXIpOwotCQl3cml0ZVN0cmluZ09uKHN0cmluZywgMSwgc3RyaW5nLmxlbmd0aCAtIDEsIHdyaXRlcik7Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGJ1ZmZlcgotCSAqIHdpdGggaXRzIGZpcnN0IGxldHRlciBjYXBpdGFsaXplZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2FwaXRhbGl6ZU9uKGNoYXJbXSBzdHJpbmcsIFdyaXRlciB3cml0ZXIpIHsKLQkJaWYgKHN0cmluZy5sZW5ndGggPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChDaGFyYWN0ZXIuaXNVcHBlckNhc2Uoc3RyaW5nWzBdKSkgewotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIHdyaXRlcik7Ci0JCX0gZWxzZSB7Ci0JCQljYXBpdGFsaXplT25JbnRlcm5hbChzdHJpbmcsIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBcHBlbmQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBzdHJpbmcgYnVmZmVyCi0JICogd2l0aCBpdHMgZmlyc3QgbGV0dGVyIGNhcGl0YWxpemVkLgotCSAqIFN0cmluZyNjYXBpdGFsaXplT24oV3JpdGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjYXBpdGFsaXplT24oU3RyaW5nIHN0cmluZywgV3JpdGVyIHdyaXRlcikgewotCQlpZiAoc3RyaW5nLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKHN0cmluZy5jaGFyQXQoMCkpKSB7Ci0JCQl3cml0ZVN0cmluZ09uKHN0cmluZywgd3JpdGVyKTsKLQkJfSBlbHNlIHsKLQkJCWNhcGl0YWxpemVPbkludGVybmFsKHN0cmluZy50b0NoYXJBcnJheSgpLCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogbm8gemVyby1sZW5ndGggY2hlY2sgb3IgbG93ZXIgY2FzZSBjaGVjawotCSAqLwotCXByaXZhdGUgc3RhdGljIGNoYXJbXSB1bmNhcGl0YWxpemVJbnRlcm5hbChjaGFyW10gc3RyaW5nKSB7Ci0JCXN0cmluZ1swXSA9IENoYXJhY3Rlci50b0xvd2VyQ2FzZShzdHJpbmdbMF0pOwotCQlyZXR1cm4gc3RyaW5nOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gc3RyaW5nTmVlZE5vdEJlVW5jYXBpdGFsaXplZChjaGFyW10gc3RyaW5nKSB7Ci0JCWlmIChzdHJpbmcubGVuZ3RoID09IDApIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChDaGFyYWN0ZXIuaXNMb3dlckNhc2Uoc3RyaW5nWzBdKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJLy8gaWYgYm90aCB0aGUgZmlyc3QgYW5kIHNlY29uZCBjaGFyYWN0ZXJzIGFyZSBjYXBpdGFsaXplZCwKLQkJLy8gcmV0dXJuIHRoZSBzdHJpbmcgdW5jaGFuZ2VkCi0JCWlmICgoc3RyaW5nLmxlbmd0aCA+IDEpCi0JCQkJJiYgQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKHN0cmluZ1sxXSkKLQkJCQkmJiBDaGFyYWN0ZXIuaXNVcHBlckNhc2Uoc3RyaW5nWzBdKSl7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogTW9kaWZ5IGFuZCByZXR1cm4gdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCBpdHMKLQkgKiBmaXJzdCBsZXR0ZXIgY29udmVydGVkIHRvIGxvd2VyIGNhc2UuCi0JICogKFVubGVzcyBib3RoIHRoZSBmaXJzdCBhbmQgc2Vjb25kIGxldHRlcnMgYXJlIHVwcGVyIGNhc2UsCi0JICogaW4gd2hpY2ggY2FzZSB0aGUgc3RyaW5nIGlzIHJldHVybmVkIHVuY2hhbmdlZC4pCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gdW5jYXBpdGFsaXplKGNoYXJbXSBzdHJpbmcpIHsKLQkJaWYgKHN0cmluZ05lZWROb3RCZVVuY2FwaXRhbGl6ZWQoc3RyaW5nKSkgewotCQkJcmV0dXJuIHN0cmluZzsKLQkJfQotCQlyZXR1cm4gdW5jYXBpdGFsaXplSW50ZXJuYWwoc3RyaW5nKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHN0cmluZ05lZWROb3RCZVVuY2FwaXRhbGl6ZWQoU3RyaW5nIHN0cmluZykgewotCQlpZiAoc3RyaW5nLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChDaGFyYWN0ZXIuaXNMb3dlckNhc2Uoc3RyaW5nLmNoYXJBdCgwKSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCS8vIGlmIGJvdGggdGhlIGZpcnN0IGFuZCBzZWNvbmQgY2hhcmFjdGVycyBhcmUgY2FwaXRhbGl6ZWQsCi0JCS8vIHJldHVybiB0aGUgc3RyaW5nIHVuY2hhbmdlZAotCQlpZiAoKHN0cmluZy5sZW5ndGgoKSA+IDEpCi0JCQkJJiYgQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKHN0cmluZy5jaGFyQXQoMSkpCi0JCQkJJiYgQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKHN0cmluZy5jaGFyQXQoMCkpKXsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCBpdHMgZmlyc3QgbGV0dGVyIGNvbnZlcnRlZCB0byBsb3dlciBjYXNlLgotCSAqIChVbmxlc3MgYm90aCB0aGUgZmlyc3QgYW5kIHNlY29uZCBsZXR0ZXJzIGFyZSB1cHBlciBjYXNlLAotCSAqIGluIHdoaWNoIGNhc2UgdGhlIHN0cmluZyBpcyByZXR1cm5lZCB1bmNoYW5nZWQuKQotCSAqIFN0cmluZyN1bmNhcGl0YWxpemUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVuY2FwaXRhbGl6ZShTdHJpbmcgc3RyaW5nKSB7Ci0JCWlmIChzdHJpbmdOZWVkTm90QmVVbmNhcGl0YWxpemVkKHN0cmluZykpIHsKLQkJCXJldHVybiBzdHJpbmc7Ci0JCX0KLQkJcmV0dXJuIG5ldyBTdHJpbmcodW5jYXBpdGFsaXplSW50ZXJuYWwoc3RyaW5nLnRvQ2hhckFycmF5KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBubyB6ZXJvLWxlbmd0aCBjaGVjayBvciBsb3dlciBjYXNlIGNoZWNrCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB1bmNhcGl0YWxpemVPbkludGVybmFsKGNoYXJbXSBzdHJpbmcsIFN0cmluZ0J1ZmZlciBzYikgewotCQlzYi5hcHBlbmQoQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHN0cmluZ1swXSkpOwotCQlzYi5hcHBlbmQoc3RyaW5nLCAxLCBzdHJpbmcubGVuZ3RoIC0gMSk7Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGJ1ZmZlcgotCSAqIHdpdGggaXRzIGZpcnN0IGxldHRlciBjb252ZXJ0ZWQgdG8gbG93ZXIgY2FzZS4KLQkgKiAoVW5sZXNzIGJvdGggdGhlIGZpcnN0IGFuZCBzZWNvbmQgbGV0dGVycyBhcmUgdXBwZXIgY2FzZSwKLQkgKiBpbiB3aGljaCBjYXNlIHRoZSBzdHJpbmcgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdW5jYXBpdGFsaXplT24oY2hhcltdIHN0cmluZywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWlmIChzdHJpbmdOZWVkTm90QmVVbmNhcGl0YWxpemVkKHN0cmluZykpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJdW5jYXBpdGFsaXplT25JbnRlcm5hbChzdHJpbmcsIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFwcGVuZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIHN0cmluZyBidWZmZXIKLQkgKiB3aXRoIGl0cyBmaXJzdCBsZXR0ZXIgY29udmVydGVkIHRvIGxvd2VyIGNhc2UuCi0JICogKFVubGVzcyBib3RoIHRoZSBmaXJzdCBhbmQgc2Vjb25kIGxldHRlcnMgYXJlIHVwcGVyIGNhc2UsCi0JICogaW4gd2hpY2ggY2FzZSB0aGUgc3RyaW5nIGlzIHJldHVybmVkIHVuY2hhbmdlZC4pCi0JICogU3RyaW5nI3VuY2FwaXRhbGl6ZU9uKFN0cmluZ0J1ZmZlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdW5jYXBpdGFsaXplT24oU3RyaW5nIHN0cmluZywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWlmIChzdHJpbmdOZWVkTm90QmVVbmNhcGl0YWxpemVkKHN0cmluZykpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJdW5jYXBpdGFsaXplT25JbnRlcm5hbChzdHJpbmcudG9DaGFyQXJyYXkoKSwgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogbm8gemVyby1sZW5ndGggY2hlY2sgb3IgdXBwZXIgY2FzZSBjaGVjawotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgdW5jYXBpdGFsaXplT25JbnRlcm5hbChjaGFyW10gc3RyaW5nLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCXdyaXRlQ2hhck9uKENoYXJhY3Rlci50b0xvd2VyQ2FzZShzdHJpbmdbMF0pLCB3cml0ZXIpOwotCQl3cml0ZVN0cmluZ09uKHN0cmluZywgMSwgc3RyaW5nLmxlbmd0aCAtIDEsIHdyaXRlcik7Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGJ1ZmZlcgotCSAqIHdpdGggaXRzIGZpcnN0IGxldHRlciBjb252ZXJ0ZWQgdG8gbG93ZXIgY2FzZS4KLQkgKiAoVW5sZXNzIGJvdGggdGhlIGZpcnN0IGFuZCBzZWNvbmQgbGV0dGVycyBhcmUgdXBwZXIgY2FzZSwKLQkgKiBpbiB3aGljaCBjYXNlIHRoZSBzdHJpbmcgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdW5jYXBpdGFsaXplT24oY2hhcltdIHN0cmluZywgV3JpdGVyIHdyaXRlcikgewotCQlpZiAoc3RyaW5nTmVlZE5vdEJlVW5jYXBpdGFsaXplZChzdHJpbmcpKSB7Ci0JCQl3cml0ZVN0cmluZ09uKHN0cmluZywgd3JpdGVyKTsKLQkJfSBlbHNlIHsKLQkJCXVuY2FwaXRhbGl6ZU9uSW50ZXJuYWwoc3RyaW5nLCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGJ1ZmZlcgotCSAqIHdpdGggaXRzIGZpcnN0IGxldHRlciBjb252ZXJ0ZWQgdG8gbG93ZXIgY2FzZS4KLQkgKiAoVW5sZXNzIGJvdGggdGhlIGZpcnN0IGFuZCBzZWNvbmQgbGV0dGVycyBhcmUgdXBwZXIgY2FzZSwKLQkgKiBpbiB3aGljaCBjYXNlIHRoZSBzdHJpbmcgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLikKLQkgKiBTdHJpbmcjdW5jYXBpdGFsaXplT24oV3JpdGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB1bmNhcGl0YWxpemVPbihTdHJpbmcgc3RyaW5nLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWlmIChzdHJpbmdOZWVkTm90QmVVbmNhcGl0YWxpemVkKHN0cmluZykpIHsKLQkJCXdyaXRlU3RyaW5nT24oc3RyaW5nLCB3cml0ZXIpOwotCQl9IGVsc2UgewotCQkJdW5jYXBpdGFsaXplT25JbnRlcm5hbChzdHJpbmcudG9DaGFyQXJyYXkoKSwgd3JpdGVyKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiAjdG9TdHJpbmcoKSBoZWxwZXIgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBCdWlsZCBhICJzdGFuZGFyZCIgI3RvU3RyaW5nKCkgcmVzdWx0IGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdAotCSAqIGFuZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uOgotCSAqIAlDbGFzc05hbWVbMDBGM0VFNDJdIChhZGQnbCBpbmZvKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJ1aWxkVG9TdHJpbmdGb3IoT2JqZWN0IG8sIE9iamVjdCBhZGRpdGlvbmFsSW5mbykgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1aWxkU2ltcGxlVG9TdHJpbmdPbihvLCBzYik7Ci0JCXNiLmFwcGVuZCgiICgiKTsKLQkJc2IuYXBwZW5kKGFkZGl0aW9uYWxJbmZvKTsKLQkJc2IuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEJ1aWxkIGEgInN0YW5kYXJkIiBzaW1wbGUgI3RvU3RyaW5nKCkgcmVzdWx0IGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdDoKLQkgKiAJQ2xhc3NOYW1lWzAwRjNFRTQyXQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJ1aWxkVG9TdHJpbmdGb3IoT2JqZWN0IG8pIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWlsZFNpbXBsZVRvU3RyaW5nT24obywgc2IpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBBcHBlbmQgYSAic3RhbmRhcmQiIHNpbXBsZSAjdG9TdHJpbmcoKSBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3QgdG8KLQkgKiB0aGUgc3BlY2lmaWVkIHN0cmluZyBidWZmZXI6Ci0JICogCUNsYXNzTmFtZVswMEYzRUU0Ml0KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYnVpbGRTaW1wbGVUb1N0cmluZ09uKE9iamVjdCBvLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJc2IuYXBwZW5kKENsYXNzVG9vbHMudG9TdHJpbmdDbGFzc05hbWVGb3JPYmplY3QobykpOwotCQlzYi5hcHBlbmQoJ1snKTsKLQkJLy8gdXNlIFN5c3RlbSNpZGVudGl0eUhhc2hDb2RlKE9iamVjdCksIHNpbmNlIE9iamVjdCNoYXNoQ29kZSgpIG1heSBiZSBvdmVycmlkZGVuCi0JCXNiLmFwcGVuZCh6ZXJvUGFkKEludGVnZXIudG9IZXhTdHJpbmcoU3lzdGVtLmlkZW50aXR5SGFzaENvZGUobykpLnRvVXBwZXJDYXNlKCksIDgpKTsKLQkJc2IuYXBwZW5kKCddJyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgaXMgbnVsbCwgZW1wdHksIG9yIGNvbnRhaW5zCi0JICogb25seSB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ0lzRW1wdHkoU3RyaW5nIHN0cmluZykgewotCQlpZiAoKHN0cmluZyA9PSBudWxsKSB8fCAoc3RyaW5nLmxlbmd0aCgpID09IDApKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gc3RyaW5nSXNFbXB0eUludGVybmFsKHN0cmluZy50b0NoYXJBcnJheSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBpcyBudWxsLCBlbXB0eSwgb3IgY29udGFpbnMKLQkgKiBvbmx5IHdoaXRlc3BhY2UgY2hhcmFjdGVycy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nSXNFbXB0eShjaGFyW10gc3RyaW5nKSB7Ci0JCWlmICgoc3RyaW5nID09IG51bGwpIHx8IChzdHJpbmcubGVuZ3RoID09IDApKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gc3RyaW5nSXNFbXB0eUludGVybmFsKHN0cmluZyk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzdHJpbmdJc0VtcHR5SW50ZXJuYWwoY2hhcltdIHMpIHsKLQkJZm9yIChpbnQgaSA9IHMubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmICggISBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKHNbaV0pKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5ncyBhcmUgZXF1YWwsIGlnbm9yaW5nIGNhc2UuCi0JICogQ2hlY2sgZm9yIG51bGxzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdzQXJlRXF1YWxJZ25vcmVDYXNlKFN0cmluZyBzMSwgU3RyaW5nIHMyKSB7Ci0JCWlmICgoczEgPT0gbnVsbCkgJiYgKHMyID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsgIC8vIGJvdGggYXJlIG51bGwKLQkJfQotCQlpZiAoKHMxID09IG51bGwpIHx8IChzMiA9PSBudWxsKSkgewotCQkJcmV0dXJuIGZhbHNlOyAgLy8gb25lIGlzIG51bGwgYnV0IHRoZSBvdGhlciBpcyBub3QKLQkJfQotCQlyZXR1cm4gczEuZXF1YWxzSWdub3JlQ2FzZShzMik7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5ncyBhcmUgZXF1YWwsIGlnbm9yaW5nIGNhc2UuCi0JICogQ2hlY2sgZm9yIG51bGxzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdzQXJlRXF1YWxJZ25vcmVDYXNlKGNoYXJbXSBzMSwgY2hhcltdIHMyKSB7Ci0JCWlmICgoczEgPT0gbnVsbCkgJiYgKHMyID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsgIC8vIGJvdGggYXJlIG51bGwKLQkJfQotCQlpZiAoKHMxID09IG51bGwpIHx8IChzMiA9PSBudWxsKSkgewotCQkJcmV0dXJuIGZhbHNlOyAgLy8gb25lIGlzIG51bGwgYnV0IHRoZSBvdGhlciBpcyBub3QKLQkJfQotCQlpZiAoczEubGVuZ3RoICE9IHMyLmxlbmd0aCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWZvciAoaW50IGkgPSBzMS5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaWYgKCAhIGNoYXJhY3RlcnNBcmVFcXVhbElnbm9yZUNhc2UoczFbaV0sIHMyW2ldKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBzdGFydHMgd2l0aCB0aGUgc3BlY2lmaWVkIHByZWZpeCwKLQkgKiBpZ25vcmluZyBjYXNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdTdGFydHNXaXRoSWdub3JlQ2FzZShjaGFyW10gc3RyaW5nLCBjaGFyW10gcHJlZml4KSB7Ci0JCWlmIChzdHJpbmcubGVuZ3RoIDwgcHJlZml4Lmxlbmd0aCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWZvciAoaW50IGkgPSBwcmVmaXgubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmICggISBjaGFyYWN0ZXJzQXJlRXF1YWxJZ25vcmVDYXNlKHN0cmluZ1tpXSwgcHJlZml4W2ldKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgc3RhcnRzIHdpdGggdGhlIHNwZWNpZmllZCBwcmVmaXgsCi0JICogaWdub3JpbmcgY2FzZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nU3RhcnRzV2l0aElnbm9yZUNhc2UoU3RyaW5nIHN0cmluZywgU3RyaW5nIHByZWZpeCkgewotCQlyZXR1cm4gc3RyaW5nLnJlZ2lvbk1hdGNoZXModHJ1ZSwgMCwgcHJlZml4LCAwLCBwcmVmaXgubGVuZ3RoKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVycyBhcmUgYXJlIGVxdWFsLCBpZ25vcmluZyBjYXNlLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZyNyZWdpb25NYXRjaGVzKGJvb2xlYW4sIGludCwgU3RyaW5nLCBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2hhcmFjdGVyc0FyZUVxdWFsSWdub3JlQ2FzZShjaGFyIGMxLCBjaGFyIGMyKSB7Ci0JCS8vICBzb21ldGhpbmcgYWJvdXQgdGhlIEdlb3JnaWFuIGFscGhhYmV0IHJlcXVpcmVzIHVzIHRvIGNoZWNrIGxvd2VyIGNhc2UgYWxzbwotCQlyZXR1cm4gKGMxID09IGMyKQotCQkJCXx8IChDaGFyYWN0ZXIudG9VcHBlckNhc2UoYzEpID09IENoYXJhY3Rlci50b1VwcGVyQ2FzZShjMikpCi0JCQkJfHwgKENoYXJhY3Rlci50b0xvd2VyQ2FzZShjMSkgPT0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKGMyKSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBjb252ZXJzaW9ucyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgImNhbWVsIGNhc2UiIHN0cmluZyB0byBhbiAiYWxsIGNhcHMiIHN0cmluZzoKLQkgKiAibGFyZ2VQcm9qZWN0IiAtPiAiTEFSR0VfUFJPSkVDVCIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKFN0cmluZyBjYW1lbENhc2VTdHJpbmcpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmcoY29udmVydENhbWVsQ2FzZVRvQWxsQ2FwcyhjYW1lbENhc2VTdHJpbmcudG9DaGFyQXJyYXkoKSkpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAiY2FtZWwgY2FzZSIgc3RyaW5nIHRvIGFuICJhbGwgY2FwcyIgc3RyaW5nOgotCSAqICJsYXJnZVByb2plY3QiIC0+ICJMQVJHRV9QUk9KRUNUIgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIGNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoY2hhcltdIGNhbWVsQ2FzZVN0cmluZykgewotCQlpbnQgbGVuID0gY2FtZWxDYXNlU3RyaW5nLmxlbmd0aDsKLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlyZXR1cm4gY2FtZWxDYXNlU3RyaW5nOwotCQl9Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIobGVuICogMik7Ci0JCWNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbkludGVybmFsKGNhbWVsQ2FzZVN0cmluZywgbGVuLCBzYik7Ci0JCXJldHVybiBjb252ZXJ0VG9DaGFyQXJyYXkoc2IpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAiY2FtZWwgY2FzZSIgc3RyaW5nIHRvIGFuICJhbGwgY2FwcyIgc3RyaW5nOgotCSAqICJsYXJnZVByb2plY3QiIC0+ICJMQVJHRV9QUk9KRUNUIgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT24oU3RyaW5nIGNhbWVsQ2FzZVN0cmluZywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbihjYW1lbENhc2VTdHJpbmcudG9DaGFyQXJyYXkoKSwgc2IpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAiY2FtZWwgY2FzZSIgc3RyaW5nIHRvIGFuICJhbGwgY2FwcyIgc3RyaW5nOgotCSAqICJsYXJnZVByb2plY3QiIC0+ICJMQVJHRV9QUk9KRUNUIgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT24oY2hhcltdIGNhbWVsQ2FzZVN0cmluZywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWludCBsZW4gPSBjYW1lbENhc2VTdHJpbmcubGVuZ3RoOwotCQlpZiAobGVuICE9IDApIHsKLQkJCWNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbkludGVybmFsKGNhbWVsQ2FzZVN0cmluZywgbGVuLCBzYik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbkludGVybmFsKGNoYXJbXSBjYW1lbENhc2VTdHJpbmcsIGludCBsZW4sIFN0cmluZ0J1ZmZlciBzYikgewotCQljaGFyIHByZXYgPSAwOwkvLyBhc3N1bWUgMCBpcyBub3QgYSB2YWxpZCBjaGFyCi0JCWNoYXIgYyA9IDA7Ci0JCWNoYXIgbmV4dCA9IGNhbWVsQ2FzZVN0cmluZ1swXTsKLQkJZm9yIChpbnQgaSA9IDE7IGkgPD0gbGVuOyBpKyspIHsJLy8gTkI6IHN0YXJ0IGF0IDEgYW5kIGVuZCBhdCBsZW4hCi0JCQljID0gbmV4dDsKLQkJCW5leHQgPSAoKGkgPT0gbGVuKSA/IDAgOiBjYW1lbENhc2VTdHJpbmdbaV0pOwotCQkJaWYgKGNhbWVsQ2FzZVdvcmRCcmVhayhwcmV2LCBjLCBuZXh0KSkgewotCQkJCXNiLmFwcGVuZCgnXycpOwotCQkJfQotCQkJc2IuYXBwZW5kKENoYXJhY3Rlci50b1VwcGVyQ2FzZShjKSk7Ci0JCQlwcmV2ID0gYzsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAiY2FtZWwgY2FzZSIgc3RyaW5nIHRvIGFuICJhbGwgY2FwcyIgc3RyaW5nOgotCSAqICJsYXJnZVByb2plY3QiIC0+ICJMQVJHRV9QUk9KRUNUIgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT24oU3RyaW5nIGNhbWVsQ2FzZVN0cmluZywgV3JpdGVyIHdyaXRlcikgewotCQljb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT24oY2FtZWxDYXNlU3RyaW5nLnRvQ2hhckFycmF5KCksIHdyaXRlcik7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJjYW1lbCBjYXNlIiBzdHJpbmcgdG8gYW4gImFsbCBjYXBzIiBzdHJpbmc6Ci0JICogImxhcmdlUHJvamVjdCIgLT4gIkxBUkdFX1BST0pFQ1QiCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbihjaGFyW10gY2FtZWxDYXNlU3RyaW5nLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWludCBsZW4gPSBjYW1lbENhc2VTdHJpbmcubGVuZ3RoOwotCQlpZiAobGVuICE9IDApIHsKLQkJCWNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbkludGVybmFsKGNhbWVsQ2FzZVN0cmluZywgbGVuLCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25JbnRlcm5hbChjaGFyW10gY2FtZWxDYXNlU3RyaW5nLCBpbnQgbGVuLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWNoYXIgcHJldiA9IDA7CS8vIGFzc3VtZSAwIGlzIG5vdCBhIHZhbGlkIGNoYXIKLQkJY2hhciBjID0gMDsKLQkJY2hhciBuZXh0ID0gY2FtZWxDYXNlU3RyaW5nWzBdOwotCQlmb3IgKGludCBpID0gMTsgaSA8PSBsZW47IGkrKykgewkvLyBOQjogc3RhcnQgYXQgMSBhbmQgZW5kIGF0IGxlbiEKLQkJCWMgPSBuZXh0OwotCQkJbmV4dCA9ICgoaSA9PSBsZW4pID8gMCA6IGNhbWVsQ2FzZVN0cmluZ1tpXSk7Ci0JCQlpZiAoY2FtZWxDYXNlV29yZEJyZWFrKHByZXYsIGMsIG5leHQpKSB7Ci0JCQkJd3JpdGVDaGFyT24oJ18nLCB3cml0ZXIpOwotCQkJfQotCQkJd3JpdGVDaGFyT24oQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGMpLCB3cml0ZXIpOwotCQkJcHJldiA9IGM7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgImNhbWVsIGNhc2UiIHN0cmluZyB0byBhbiAiYWxsIGNhcHMiIHN0cmluZzoKLQkgKiAibGFyZ2VQcm9qZWN0IiAtPiAiTEFSR0VfUFJPSkVDVCIKLQkgKiBMaW1pdCB0aGUgcmVzdWx0aW5nIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIG1heGltdW0gbGVuZ3RoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoU3RyaW5nIGNhbWVsQ2FzZVN0cmluZywgaW50IG1heExlbmd0aCkgewotCQlyZXR1cm4gbmV3IFN0cmluZyhjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKGNhbWVsQ2FzZVN0cmluZy50b0NoYXJBcnJheSgpLCBtYXhMZW5ndGgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgImNhbWVsIGNhc2UiIHN0cmluZyB0byBhbiAiYWxsIGNhcHMiIHN0cmluZzoKLQkgKiAibGFyZ2VQcm9qZWN0IiAtPiAiTEFSR0VfUFJPSkVDVCIKLQkgKiBMaW1pdCB0aGUgcmVzdWx0aW5nIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIG1heGltdW0gbGVuZ3RoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIGNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoY2hhcltdIGNhbWVsQ2FzZVN0cmluZywgaW50IG1heExlbmd0aCkgewotCQlpbnQgbGVuID0gY2FtZWxDYXNlU3RyaW5nLmxlbmd0aDsKLQkJaWYgKChsZW4gPT0gMCkgfHwgKG1heExlbmd0aCA9PSAwKSkgewotCQkJcmV0dXJuIGNhbWVsQ2FzZVN0cmluZzsKLQkJfQotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKG1heExlbmd0aCk7Ci0JCWNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbkludGVybmFsKGNhbWVsQ2FzZVN0cmluZywgbWF4TGVuZ3RoLCBsZW4sIHNiKTsKLQkJcmV0dXJuIGNvbnZlcnRUb0NoYXJBcnJheShzYik7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJjYW1lbCBjYXNlIiBzdHJpbmcgdG8gYW4gImFsbCBjYXBzIiBzdHJpbmc6Ci0JICogImxhcmdlUHJvamVjdCIgLT4gIkxBUkdFX1BST0pFQ1QiCi0JICogTGltaXQgdGhlIHJlc3VsdGluZyBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBtYXhpbXVtIGxlbmd0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uKFN0cmluZyBjYW1lbENhc2VTdHJpbmcsIGludCBtYXhMZW5ndGgsIFN0cmluZ0J1ZmZlciBzYikgewotCQljb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT24oY2FtZWxDYXNlU3RyaW5nLnRvQ2hhckFycmF5KCksIG1heExlbmd0aCwgc2IpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAiY2FtZWwgY2FzZSIgc3RyaW5nIHRvIGFuICJhbGwgY2FwcyIgc3RyaW5nOgotCSAqICJsYXJnZVByb2plY3QiIC0+ICJMQVJHRV9QUk9KRUNUIgotCSAqIExpbWl0IHRoZSByZXN1bHRpbmcgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbWF4aW11bSBsZW5ndGguCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbihjaGFyW10gY2FtZWxDYXNlU3RyaW5nLCBpbnQgbWF4TGVuZ3RoLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaW50IGxlbiA9IGNhbWVsQ2FzZVN0cmluZy5sZW5ndGg7Ci0JCWlmICgobGVuICE9IDApICYmIChtYXhMZW5ndGggIT0gMCkpIHsKLQkJCWNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbkludGVybmFsKGNhbWVsQ2FzZVN0cmluZywgbWF4TGVuZ3RoLCBsZW4sIHNiKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uSW50ZXJuYWwoY2hhcltdIGNhbWVsQ2FzZVN0cmluZywgaW50IG1heExlbmd0aCwgaW50IGxlbiwgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWNoYXIgcHJldiA9IDA7CS8vIGFzc3VtZSAwIGlzIG5vdCBhIHZhbGlkIGNoYXIKLQkJY2hhciBjID0gMDsKLQkJY2hhciBuZXh0ID0gY2FtZWxDYXNlU3RyaW5nWzBdOwotCQlmb3IgKGludCBpID0gMTsgaSA8PSBsZW47IGkrKykgewkvLyBOQjogc3RhcnQgYXQgMSBhbmQgZW5kIGF0IGxlbiEKLQkJCWMgPSBuZXh0OwotCQkJbmV4dCA9ICgoaSA9PSBsZW4pID8gMCA6IGNhbWVsQ2FzZVN0cmluZ1tpXSk7Ci0JCQlpZiAoY2FtZWxDYXNlV29yZEJyZWFrKHByZXYsIGMsIG5leHQpKSB7Ci0JCQkJc2IuYXBwZW5kKCdfJyk7Ci0JCQkJaWYgKHNiLmxlbmd0aCgpID09IG1heExlbmd0aCkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJc2IuYXBwZW5kKENoYXJhY3Rlci50b1VwcGVyQ2FzZShjKSk7Ci0JCQlpZiAoc2IubGVuZ3RoKCkgPT0gbWF4TGVuZ3RoKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJcHJldiA9IGM7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgImNhbWVsIGNhc2UiIHN0cmluZyB0byBhbiAiYWxsIGNhcHMiIHN0cmluZzoKLQkgKiAibGFyZ2VQcm9qZWN0IiAtPiAiTEFSR0VfUFJPSkVDVCIKLQkgKiBMaW1pdCB0aGUgcmVzdWx0aW5nIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIG1heGltdW0gbGVuZ3RoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT24oU3RyaW5nIGNhbWVsQ2FzZVN0cmluZywgaW50IG1heExlbmd0aCwgV3JpdGVyIHdyaXRlcikgewotCQljb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT24oY2FtZWxDYXNlU3RyaW5nLnRvQ2hhckFycmF5KCksIG1heExlbmd0aCwgd3JpdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgImNhbWVsIGNhc2UiIHN0cmluZyB0byBhbiAiYWxsIGNhcHMiIHN0cmluZzoKLQkgKiAibGFyZ2VQcm9qZWN0IiAtPiAiTEFSR0VfUFJPSkVDVCIKLQkgKiBMaW1pdCB0aGUgcmVzdWx0aW5nIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIG1heGltdW0gbGVuZ3RoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT24oY2hhcltdIGNhbWVsQ2FzZVN0cmluZywgaW50IG1heExlbmd0aCwgV3JpdGVyIHdyaXRlcikgewotCQlpbnQgbGVuID0gY2FtZWxDYXNlU3RyaW5nLmxlbmd0aDsKLQkJaWYgKChsZW4gIT0gMCkgJiYgKG1heExlbmd0aCAhPSAwKSkgewotCQkJY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uSW50ZXJuYWwoY2FtZWxDYXNlU3RyaW5nLCBtYXhMZW5ndGgsIGxlbiwgd3JpdGVyKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uSW50ZXJuYWwoY2hhcltdIGNhbWVsQ2FzZVN0cmluZywgaW50IG1heExlbmd0aCwgaW50IGxlbiwgV3JpdGVyIHdyaXRlcikgewotCQljaGFyIHByZXYgPSAwOwkvLyBhc3N1bWUgMCBpcyBub3QgYSB2YWxpZCBjaGFyCi0JCWNoYXIgYyA9IDA7Ci0JCWNoYXIgbmV4dCA9IGNhbWVsQ2FzZVN0cmluZ1swXTsKLQkJaW50IHdyaXRlckxlbmd0aCA9IDA7Ci0JCWZvciAoaW50IGkgPSAxOyBpIDw9IGxlbjsgaSsrKSB7CS8vIE5COiBzdGFydCBhdCAxIGFuZCBlbmQgYXQgbGVuIQotCQkJYyA9IG5leHQ7Ci0JCQluZXh0ID0gKChpID09IGxlbikgPyAwIDogY2FtZWxDYXNlU3RyaW5nW2ldKTsKLQkJCWlmIChjYW1lbENhc2VXb3JkQnJlYWsocHJldiwgYywgbmV4dCkpIHsKLQkJCQl3cml0ZUNoYXJPbignXycsIHdyaXRlcik7Ci0JCQkJaWYgKCsrd3JpdGVyTGVuZ3RoID09IG1heExlbmd0aCkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJd3JpdGVDaGFyT24oQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGMpLCB3cml0ZXIpOwotCQkJaWYgKCsrd3JpdGVyTGVuZ3RoID09IG1heExlbmd0aCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCXByZXYgPSBjOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzZXJpZXMgb2YgY2hhcmFjdGVycyBvY2N1ciBhdAotCSAqIGEgImNhbWVsIGNhc2UiIHdvcmsgYnJlYWs6Ci0JICogICAgICIqYWEiIC0+IGZhbHNlCi0JICogICAgICIqQUEiIC0+IGZhbHNlCi0JICogICAgICIqQWEiIC0+IGZhbHNlCi0JICogICAgICJBYUEiIC0+IGZhbHNlCi0JICogICAgICJBQUEiIC0+IGZhbHNlCi0JICogICAgICJhYSoiIC0+IGZhbHNlCi0JICogICAgICJBYUEiIC0+IGZhbHNlCi0JICogICAgICJhQWEiIC0+IHRydWUKLQkgKiAgICAgIkFBKiIgLT4gZmFsc2UKLQkgKiAgICAgIkFBYSIgLT4gdHJ1ZQotCSAqIHdoZXJlICcqJyA9PSBhbnkgY2hhcgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gY2FtZWxDYXNlV29yZEJyZWFrKGNoYXIgcHJldiwgY2hhciBjLCBjaGFyIG5leHQpIHsKLQkJaWYgKHByZXYgPT0gMCkgewkvLyBzdGFydCBvZiBzdHJpbmcKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoQ2hhcmFjdGVyLmlzTG93ZXJDYXNlKGMpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKENoYXJhY3Rlci5pc0xvd2VyQ2FzZShwcmV2KSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKG5leHQgPT0gMCkgewkvLyBlbmQgb2Ygc3RyaW5nCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIENoYXJhY3Rlci5pc0xvd2VyQ2FzZShuZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgInVuZGVyc2NvcmUiIHN0cmluZyB0byBhICJjYW1lbCBjYXNlIiBzdHJpbmc6Ci0JICogIkxBUkdFX1BST0pFQ1QiIC0+ICJMYXJnZVByb2plY3QiCi0JICogQ2FwaXRhbGl6ZSB0aGUgZmlyc3QgbGV0dGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKFN0cmluZyB1bmRlcnNjb3JlU3RyaW5nKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nKGNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKHVuZGVyc2NvcmVTdHJpbmcudG9DaGFyQXJyYXkoKSkpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAidW5kZXJzY29yZSIgc3RyaW5nIHRvIGEgImNhbWVsIGNhc2UiIHN0cmluZzoKLQkgKiAiTEFSR0VfUFJPSkVDVCIgLT4gIkxhcmdlUHJvamVjdCIKLQkgKiBDYXBpdGFsaXplIHRoZSBmaXJzdCBsZXR0ZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoY2hhcltdIHVuZGVyc2NvcmVTdHJpbmcpIHsKLQkJcmV0dXJuIGNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKHVuZGVyc2NvcmVTdHJpbmcsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAidW5kZXJzY29yZSIgc3RyaW5nIHRvIGEgImNhbWVsIGNhc2UiIHN0cmluZzoKLQkgKiAiTEFSR0VfUFJPSkVDVCIgLT4gImxhcmdlUHJvamVjdCIKLQkgKiBPcHRpb25hbGx5IGNhcGl0YWxpemUgdGhlIGZpcnN0IGxldHRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZShTdHJpbmcgdW5kZXJzY29yZVN0cmluZywgYm9vbGVhbiBjYXBpdGFsaXplRmlyc3RMZXR0ZXIpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmcoY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UodW5kZXJzY29yZVN0cmluZy50b0NoYXJBcnJheSgpLCBjYXBpdGFsaXplRmlyc3RMZXR0ZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgInVuZGVyc2NvcmUiIHN0cmluZyB0byBhICJjYW1lbCBjYXNlIiBzdHJpbmc6Ci0JICogIkxBUkdFX1BST0pFQ1QiIC0+ICJsYXJnZVByb2plY3QiCi0JICogT3B0aW9uYWxseSBjYXBpdGFsaXplIHRoZSBmaXJzdCBsZXR0ZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoY2hhcltdIHVuZGVyc2NvcmVTdHJpbmcsIGJvb2xlYW4gY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKSB7Ci0JCWludCBsZW4gPSB1bmRlcnNjb3JlU3RyaW5nLmxlbmd0aDsKLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlyZXR1cm4gdW5kZXJzY29yZVN0cmluZzsKLQkJfQotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKGxlbik7Ci0JCWNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25JbnRlcm5hbCh1bmRlcnNjb3JlU3RyaW5nLCBjYXBpdGFsaXplRmlyc3RMZXR0ZXIsIGxlbiwgc2IpOwotCQlyZXR1cm4gY29udmVydFRvQ2hhckFycmF5KHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgInVuZGVyc2NvcmUiIHN0cmluZyB0byBhICJjYW1lbCBjYXNlIiBzdHJpbmc6Ci0JICogIkxBUkdFX1BST0pFQ1QiIC0+ICJsYXJnZVByb2plY3QiCi0JICogT3B0aW9uYWxseSBjYXBpdGFsaXplIHRoZSBmaXJzdCBsZXR0ZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT24oU3RyaW5nIHVuZGVyc2NvcmVTdHJpbmcsIGJvb2xlYW4gY2FwaXRhbGl6ZUZpcnN0TGV0dGVyLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbih1bmRlcnNjb3JlU3RyaW5nLnRvQ2hhckFycmF5KCksIGNhcGl0YWxpemVGaXJzdExldHRlciwgc2IpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAidW5kZXJzY29yZSIgc3RyaW5nIHRvIGEgImNhbWVsIGNhc2UiIHN0cmluZzoKLQkgKiAiTEFSR0VfUFJPSkVDVCIgLT4gImxhcmdlUHJvamVjdCIKLQkgKiBPcHRpb25hbGx5IGNhcGl0YWxpemUgdGhlIGZpcnN0IGxldHRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbihjaGFyW10gdW5kZXJzY29yZVN0cmluZywgYm9vbGVhbiBjYXBpdGFsaXplRmlyc3RMZXR0ZXIsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpbnQgbGVuID0gdW5kZXJzY29yZVN0cmluZy5sZW5ndGg7Ci0JCWlmIChsZW4gIT0gMCkgewotCQkJY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbkludGVybmFsKHVuZGVyc2NvcmVTdHJpbmcsIGNhcGl0YWxpemVGaXJzdExldHRlciwgbGVuLCBzYik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25JbnRlcm5hbChjaGFyW10gdW5kZXJzY29yZVN0cmluZywgYm9vbGVhbiBjYXBpdGFsaXplRmlyc3RMZXR0ZXIsIGludCBsZW4sIFN0cmluZ0J1ZmZlciBzYikgewotCQljaGFyIHByZXYgPSAwOwotCQljaGFyIGMgPSAwOwotCQlib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJcHJldiA9IGM7Ci0JCQljID0gdW5kZXJzY29yZVN0cmluZ1tpXTsKLQkJCWlmIChjID09ICdfJykgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKGZpcnN0KSB7Ci0JCQkJZmlyc3QgPSBmYWxzZTsKLQkJCQlpZiAoY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKSB7Ci0JCQkJCXNiLmFwcGVuZChDaGFyYWN0ZXIudG9VcHBlckNhc2UoYykpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXNiLmFwcGVuZChDaGFyYWN0ZXIudG9Mb3dlckNhc2UoYykpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHByZXYgPT0gJ18nKSB7Ci0JCQkJCXNiLmFwcGVuZChDaGFyYWN0ZXIudG9VcHBlckNhc2UoYykpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXNiLmFwcGVuZChDaGFyYWN0ZXIudG9Mb3dlckNhc2UoYykpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAidW5kZXJzY29yZSIgc3RyaW5nIHRvIGEgImNhbWVsIGNhc2UiIHN0cmluZzoKLQkgKiAiTEFSR0VfUFJPSkVDVCIgLT4gImxhcmdlUHJvamVjdCIKLQkgKiBPcHRpb25hbGx5IGNhcGl0YWxpemUgdGhlIGZpcnN0IGxldHRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbihTdHJpbmcgdW5kZXJzY29yZVN0cmluZywgYm9vbGVhbiBjYXBpdGFsaXplRmlyc3RMZXR0ZXIsIFdyaXRlciB3cml0ZXIpIHsKLQkJY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbih1bmRlcnNjb3JlU3RyaW5nLnRvQ2hhckFycmF5KCksIGNhcGl0YWxpemVGaXJzdExldHRlciwgd3JpdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgInVuZGVyc2NvcmUiIHN0cmluZyB0byBhICJjYW1lbCBjYXNlIiBzdHJpbmc6Ci0JICogIkxBUkdFX1BST0pFQ1QiIC0+ICJsYXJnZVByb2plY3QiCi0JICogT3B0aW9uYWxseSBjYXBpdGFsaXplIHRoZSBmaXJzdCBsZXR0ZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT24oY2hhcltdIHVuZGVyc2NvcmVTdHJpbmcsIGJvb2xlYW4gY2FwaXRhbGl6ZUZpcnN0TGV0dGVyLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWludCBsZW4gPSB1bmRlcnNjb3JlU3RyaW5nLmxlbmd0aDsKLQkJaWYgKGxlbiAhPSAwKSB7Ci0JCQljb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uSW50ZXJuYWwodW5kZXJzY29yZVN0cmluZywgY2FwaXRhbGl6ZUZpcnN0TGV0dGVyLCBsZW4sIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25JbnRlcm5hbChjaGFyW10gdW5kZXJzY29yZVN0cmluZywgYm9vbGVhbiBjYXBpdGFsaXplRmlyc3RMZXR0ZXIsIGludCBsZW4sIFdyaXRlciB3cml0ZXIpIHsKLQkJY2hhciBwcmV2ID0gMDsKLQkJY2hhciBjID0gMDsKLQkJYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCXByZXYgPSBjOwotCQkJYyA9IHVuZGVyc2NvcmVTdHJpbmdbaV07Ci0JCQlpZiAoYyA9PSAnXycpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChmaXJzdCkgewotCQkJCWZpcnN0ID0gZmFsc2U7Ci0JCQkJaWYgKGNhcGl0YWxpemVGaXJzdExldHRlcikgewotCQkJCQl3cml0ZUNoYXJPbihDaGFyYWN0ZXIudG9VcHBlckNhc2UoYyksIHdyaXRlcik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJd3JpdGVDaGFyT24oQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKGMpLCB3cml0ZXIpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHByZXYgPT0gJ18nKSB7Ci0JCQkJCXdyaXRlQ2hhck9uKENoYXJhY3Rlci50b1VwcGVyQ2FzZShjKSwgd3JpdGVyKTsKLQkJCQl9IGVsc2UgewotCQkJCQl3cml0ZUNoYXJPbihDaGFyYWN0ZXIudG9Mb3dlckNhc2UoYyksIHdyaXRlcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnZlbmllbmNlICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgY2hhcltdIGNvbnZlcnRUb0NoYXJBcnJheShTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaW50IGxlbiA9IHNiLmxlbmd0aCgpOwotCQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbbGVuXTsKLQkJc2IuZ2V0Q2hhcnMoMCwgbGVuLCByZXN1bHQsIDApOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIGNoZWNrZWQgZXhjZXB0aW9ucyBzdWNrCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZVN0cmluZ09uKGNoYXJbXSBzdHJpbmcsIFdyaXRlciB3cml0ZXIpIHsKLQkJdHJ5IHsKLQkJCXdyaXRlci53cml0ZShzdHJpbmcpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogY2hlY2tlZCBleGNlcHRpb25zIHN1Y2sKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlU3RyaW5nT24oY2hhcltdIHN0cmluZywgaW50IG9mZiwgaW50IGxlbiwgV3JpdGVyIHdyaXRlcikgewotCQl0cnkgewotCQkJd3JpdGVyLndyaXRlKHN0cmluZywgb2ZmLCBsZW4pOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogY2hlY2tlZCBleGNlcHRpb25zIHN1Y2sKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlU3RyaW5nT24oU3RyaW5nIHN0cmluZywgV3JpdGVyIHdyaXRlcikgewotCQl0cnkgewotCQkJd3JpdGVyLndyaXRlKHN0cmluZyk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBjaGVja2VkIGV4Y2VwdGlvbnMgc3VjawotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVDaGFyT24oY2hhciBjLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCXRyeSB7Ci0JCQl3cml0ZXIud3JpdGUoYyk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JLyoqCi0JICogU3VwcHJlc3MgZGVmYXVsdCBjb25zdHJ1Y3RvciwgZW5zdXJpbmcgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkgKi8KLQlwcml2YXRlIFN0cmluZ1Rvb2xzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9UcmFuc2Zvcm1lci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1RyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyYzAwMjQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1RyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsOwotCi0vKioKLSAqIFVzZWQgYnkgdmFyaW91cyAicGx1Z2dhYmxlIiBjbGFzc2VzIHRvIHRyYW5zZm9ybSBvYmplY3RzLgotICogVHJhbnNmb3JtIGFuIG9iamVjdCBvZiB0eXBlIFQxIHRvIGFuIG9iamVjdCBvZiB0eXBlIFQyLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRyYW5zZm9ybWVyPFQxLCBUMj4gewotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0cmFuc2Zvcm1lZCBvYmplY3QuCi0JICogVGhlIHNlbWFudGljcyBvZiAidHJhbnNmb3JtIiBpcyBkZXRlcm1pbmVkIGJ5IHRoZQotCSAqIGNvbnRyYWN0IGJldHdlZW4gdGhlIGNsaWVudCBhbmQgdGhlIHNlcnZlci4KLQkgKi8KLQlUMiB0cmFuc2Zvcm0oVDEgbyk7Ci0KLQotCWZpbmFsIGNsYXNzIE51bGw8UzEsIFMyPiBpbXBsZW1lbnRzIFRyYW5zZm9ybWVyPFMxLCBTMj4gewotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc2Zvcm1lciBJTlNUQU5DRSA9IG5ldyBOdWxsKCk7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgc3RhdGljIDxSMSwgUjI+IFRyYW5zZm9ybWVyPFIxLCBSMj4gaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIE51bGwoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCS8vIHNpbXBseSByZXR1cm4gdGhlIG9iamVjdCwgdW5jaGFuZ2VkCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgUzIgdHJhbnNmb3JtKFMxIG8pIHsKLQkJCXJldHVybiAoUzIpIG87Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIlRyYW5zZm9ybWVyLk51bGwiOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvWE1MU3RyaW5nRW5jb2Rlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL1hNTFN0cmluZ0VuY29kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ2MzdlYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvWE1MU3RyaW5nRW5jb2Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotCi0vKioKLSAqIFRoaXMgZW5jb2RlciB3aWxsIHJlcGxhY2UgYW55IG9mIGEgc3BlY2lmaWVkIHNldCBvZiBjaGFyYWN0ZXJzIHdpdGggYW4gWE1MCi0gKiAiY2hhcmFjdGVyIHJlZmVyZW5jZSI6ICcvJyA9PiAiJiN4MmY7IgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgWE1MU3RyaW5nRW5jb2RlciB7Ci0KLQkvKiogVGhlIHNldCBvZiBjaGFyYWN0ZXJzIHRvIGJlIGNvbnZlcnRlZCBpbnRvIFhNTCBjaGFyYWN0ZXIgcmVmZXJlbmNlcy4gKi8KLQlwcml2YXRlIGZpbmFsIGNoYXJbXSBjaGFyczsKLQotCS8qKiBDYWNoZSB0aGUgdmFsdWUgb2YgdGhlIGhpZ2hlc3QgY2hhcmFjdGVyIGluIHRoZSBzZXQgYWJvdmUuICovCi0JcHJpdmF0ZSBmaW5hbCBjaGFyIG1heENoYXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBlbmNvZGVyIHRoYXQgY29udmVydHMgdGhlIHNwZWNpZmllZCBzZXQgb2YgY2hhcmFjdGVycwotCSAqIGludG8gWE1MIGNoYXJhY3RlciByZWZlcmVuY2VzLgotCSAqLwotCXB1YmxpYyBYTUxTdHJpbmdFbmNvZGVyKGNoYXJbXSBjaGFycykgewotCQlzdXBlcigpOwotCQlpZiAoY2hhcnMgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJLy8gdGhlIGFtcGVyc2FuZCBtdXN0IGJlIGluY2x1ZGVkIHNpbmNlIGl0IGlzIHRoZSBlc2NhcGUgY2hhcmFjdGVyCi0JCWlmIChDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoY2hhcnMsICcmJykpIHsKLQkJCXRoaXMuY2hhcnMgPSBjaGFyczsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuY2hhcnMgPSBDb2xsZWN0aW9uVG9vbHMuYWRkKGNoYXJzLCAnJicpOwotCQl9Ci0JCXRoaXMubWF4Q2hhciA9IHRoaXMuY2FsY3VsYXRlTWF4SW52YWxpZEZpbGVOYW1lQ2hhcigpOwotCX0KLQotCS8qKgotCSAqIENhbGN1bGF0ZSB0aGUgbWF4aW11bSB2YWx1ZSBvZiB0aGUgc2V0IG9mIGNoYXJhY3RlcnMgdG8gYmUgY29udmVydGVkCi0JICogaW50byBYTUwgY2hhcmFjdGVyIHJlZmVyZW5jZXMuIFRoaXMgd2lsbCBiZSB1c2VkIHRvIHNob3J0LWNpcmN1aXQgdGhlCi0JICogc2VhcmNoIGZvciBhIGNoYXJhY3RlciBpbiB0aGUgc2V0LgotCSAqIEBzZWUgI2NoYXJJc1RvQmVFbmNvZGVkKGNoYXIpCi0JICovCi0JcHJpdmF0ZSBjaGFyIGNhbGN1bGF0ZU1heEludmFsaWRGaWxlTmFtZUNoYXIoKSB7Ci0JCWNoYXJbXSBsb2NhbENoYXJzID0gdGhpcy5jaGFyczsKLQkJY2hhciBtYXggPSAwOwotCQlmb3IgKGludCBpID0gbG9jYWxDaGFycy5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJY2hhciBjID0gbG9jYWxDaGFyc1tpXTsKLQkJCWlmIChtYXggPCBjKSB7Ci0JCQkJbWF4ID0gYzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbWF4OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBBUEkgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggYW55IGNoYXJhY3RlcnMgaW4gdGhlIHNldAotCSAqIHJlcGxhY2VkIHdpdGggWE1MIGNoYXJhY3RlciByZWZlcmVuY2VzLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZW5jb2RlKFN0cmluZyBzKSB7Ci0JCWludCBsZW4gPSBzLmxlbmd0aCgpOwotCQkvLyBhbGxvdyBmb3IgYSBmZXcgZW5jb2RlZCBjaGFyYWN0ZXJzCi0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIobGVuICsgMjApOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQl0aGlzLmFwcGVuZENoYXJhY3RlclRvKHMuY2hhckF0KGkpLCBzYik7Ci0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggYW55IFhNTCBjaGFyYWN0ZXIgcmVmZXJlbmNlcwotCSAqIHJlcGxhY2VkIGJ5IHRoZSBjaGFyYWN0ZXJzIHRoZW1zZWx2ZXMuCi0JICovCi0JcHVibGljIFN0cmluZyBkZWNvZGUoU3RyaW5nIHMpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihzLmxlbmd0aCgpKTsKLQkJU3RyaW5nQnVmZmVyIHRlbXAgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CS8vIHBlcmZvcm1hbmNlIHR3ZWFrCi0JCXRoaXMuZGVjb2RlVG8obmV3IFN0cmluZ1JlYWRlcihzKSwgc2IsIHRlbXApOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBBcHBlbmQgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgdG8gdGhlIHN0cmluZyBidWZmZXIsCi0JICogY29udmVydGluZyBpdCB0byBhbiBYTUwgY2hhcmFjdGVyIHJlZmVyZW5jZSBpZiBuZWNlc3NhcnkuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFwcGVuZENoYXJhY3RlclRvKGNoYXIgYywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWlmICh0aGlzLmNoYXJJc1RvQmVFbmNvZGVkKGMpKSB7Ci0JCQl0aGlzLmFwcGVuZENoYXJhY3RlclJlZmVyZW5jZVRvKGMsIHNiKTsKLQkJfSBlbHNlIHsKLQkJCXNiLmFwcGVuZChjKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGlzIG9uZSBvZiB0aGUgY2hhcmFjdGVycwotCSAqIHRvIGJlIGNvbnZlcnRlZCB0byBYTUwgY2hhcmFjdGVyIHJlZmVyZW5jZXMuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGNoYXJJc1RvQmVFbmNvZGVkKGNoYXIgYykgewotCQlyZXR1cm4gKGMgPD0gdGhpcy5tYXhDaGFyKSAmJiBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5jaGFycywgYyk7Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyJ3MgWE1MIGNoYXJhY3RlciByZWZlcmVuY2UgdG8gdGhlCi0JICogc3BlY2lmaWVkIHN0cmluZyBidWZmZXIgKGUuZy4gJy8nID0+ICImI3gyZjsiKS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYXBwZW5kQ2hhcmFjdGVyUmVmZXJlbmNlVG8oY2hhciBjLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJc2IuYXBwZW5kKCImI3giKTsKLQkJc2IuYXBwZW5kKEludGVnZXIudG9TdHJpbmcoYywgMTYpKTsKLQkJc2IuYXBwZW5kKCc7Jyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRlY29kZVRvKFJlYWRlciByZWFkZXIsIFN0cmluZ0J1ZmZlciBzYiwgU3RyaW5nQnVmZmVyIHRlbXApIHsKLQkJdHJ5IHsKLQkJCXRoaXMuZGVjb2RlVG9fKHJlYWRlciwgc2IsIHRlbXApOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRlY29kZVRvXyhSZWFkZXIgcmVhZGVyLCBTdHJpbmdCdWZmZXIgc2IsIFN0cmluZ0J1ZmZlciB0ZW1wKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgYyA9IHJlYWRlci5yZWFkKCk7Ci0JCXdoaWxlIChjICE9IC0xKSB7Ci0JCQlpZiAoYyA9PSAnJicpIHsKLQkJCQl0aGlzLmRlY29kZUNoYXJhY3RlclJlZmVyZW5jZVRvKHJlYWRlciwgc2IsIHRlbXApOwotCQkJfSBlbHNlIHsKLQkJCQlzYi5hcHBlbmQoKGNoYXIpIGMpOwotCQkJfQotCQkJYyA9IHJlYWRlci5yZWFkKCk7Ci0JCX0KLQkJcmVhZGVyLmNsb3NlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRlY29kZUNoYXJhY3RlclJlZmVyZW5jZVRvKFJlYWRlciByZWFkZXIsIFN0cmluZ0J1ZmZlciBzYiwgU3RyaW5nQnVmZmVyIHRlbXApIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCBjID0gcmVhZGVyLnJlYWQoKTsKLQkJdGhpcy5jaGVja0NoYXIoYywgJyMnKTsKLQkJYyA9IHJlYWRlci5yZWFkKCk7Ci0JCXRoaXMuY2hlY2tDaGFyKGMsICd4Jyk7Ci0KLQkJdGVtcC5zZXRMZW5ndGgoMCk7Ci0JCWMgPSByZWFkZXIucmVhZCgpOwotCQl3aGlsZSAoYyAhPSAnOycpIHsKLQkJCXRoaXMuY2hlY2tFbmRPZlN0cmVhbShjKTsKLQkJCXRlbXAuYXBwZW5kKChjaGFyKSBjKTsKLQkJCWMgPSByZWFkZXIucmVhZCgpOwotCQl9Ci0JCVN0cmluZyBjaGFyVmFsdWUgPSB0ZW1wLnRvU3RyaW5nKCk7Ci0JCWlmIChjaGFyVmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibWlzc2luZyBudW1lcmljIHN0cmluZyIpOwotCQl9Ci0JCXNiLmFwcGVuZCgoY2hhcikgSW50ZWdlci5wYXJzZUludChjaGFyVmFsdWUsIDE2KSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrQ2hhcihpbnQgYywgaW50IGV4cGVjdGVkKSB7Ci0JCXRoaXMuY2hlY2tFbmRPZlN0cmVhbShjKTsKLQkJaWYgKGMgIT0gZXhwZWN0ZWQpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImV4cGVjdGVkICciICsgKGNoYXIpIGV4cGVjdGVkICsgIicsIGJ1dCBlbmNvdW50ZXJlZCAnIiArIChjaGFyKSBjICsgIiciKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja0VuZE9mU3RyZWFtKGludCBjKSB7Ci0JCWlmIChjID09IC0xKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ1bmV4cGVjdGVkIGVuZCBvZiBzdHJpbmciKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9BcnJheUl0ZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0FycmF5SXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg3NGFmNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0FycmF5SXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBBbiA8Y29kZT5BcnJheUl0ZXJhdG9yPC9jb2RlPiBwcm92aWRlcyBhbiA8Y29kZT5JdGVyYXRvcjwvY29kZT4KLSAqIGZvciBhbiBhcnJheSBvZiBvYmplY3RzIG9mIHR5cGUgRS4KLSAqLwotcHVibGljIGNsYXNzIEFycmF5SXRlcmF0b3I8RT4KLQlpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+Ci17Ci0JZmluYWwgRVtdIGFycmF5OwkvLyBwcml2YXRlLXByb3RlY3RlZAotCWludCBuZXh0SW5kZXg7CQkvLyBwcml2YXRlLXByb3RlY3RlZAotCXByaXZhdGUgZmluYWwgaW50IG1heEluZGV4OwotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIGZvciB0aGUgc3BlY2lmaWVkIGFycmF5LgotCSAqLwotCXB1YmxpYyBBcnJheUl0ZXJhdG9yKEUuLi4gYXJyYXkpIHsKLQkJdGhpcyhhcnJheSwgMCwgYXJyYXkubGVuZ3RoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIGZvciB0aGUgc3BlY2lmaWVkIGFycmF5LAotCSAqIHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQgc3RhcnQgaW5kZXggYW5kIGNvbnRpbnVpbmcgZm9yCi0JICogdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICovCi0JcHVibGljIEFycmF5SXRlcmF0b3IoRVtdIGFycmF5LCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJaWYgKChzdGFydCA8IDApIHx8IChzdGFydCA+IGFycmF5Lmxlbmd0aCkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInN0YXJ0OiAiICsgc3RhcnQpOwotCQl9Ci0JCWlmICgobGVuZ3RoIDwgMCkgfHwgKGxlbmd0aCA+IGFycmF5Lmxlbmd0aCAtIHN0YXJ0KSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibGVuZ3RoOiAiICsgbGVuZ3RoKTsKLQkJfQotCQl0aGlzLmFycmF5ID0gYXJyYXk7Ci0JCXRoaXMubmV4dEluZGV4ID0gc3RhcnQ7Ci0JCXRoaXMubWF4SW5kZXggPSBzdGFydCArIGxlbmd0aDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJcmV0dXJuIHRoaXMubmV4dEluZGV4IDwgdGhpcy5tYXhJbmRleDsKLQl9Ci0JCi0JcHVibGljIEUgbmV4dCgpIHsKLQkJaWYgKHRoaXMuaGFzTmV4dCgpKSB7Ci0JCQlyZXR1cm4gdGhpcy5hcnJheVt0aGlzLm5leHRJbmRleCsrXTsKLQkJfQotCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmFycmF5KSk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9BcnJheUxpc3RJdGVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9BcnJheUxpc3RJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjcwZWQ0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvQXJyYXlMaXN0SXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBBbiA8Y29kZT5BcnJheUxpc3RJdGVyYXRvcjwvY29kZT4gcHJvdmlkZXMgYSA8Y29kZT5MaXN0SXRlcmF0b3I8L2NvZGU+Ci0gKiBmb3IgYW4gYXJyYXkgb2Ygb2JqZWN0cy4KLSAqIAotICogVGhlIG5hbWUgbWlnaHQgYmUgYSBiaXQgY29uZnVzaW5nOgotICogVGhpcyBpcyBhIDxjb2RlPkxpc3RJdGVyYXRvcjwvY29kZT4gZm9yIGFuIDxjb2RlPkFycmF5PC9jb2RlPjsKLSAqIDxlbT5ub3Q8L2VtPiBhbiA8Y29kZT5JdGVyYXRvcjwvY29kZT4gZm9yIGFuIDxjb2RlPkFycmF5TGlzdDwvY29kZT4uCi0gKi8KLXB1YmxpYyBjbGFzcyBBcnJheUxpc3RJdGVyYXRvcjxFPgotCWV4dGVuZHMgQXJyYXlJdGVyYXRvcjxFPgotCWltcGxlbWVudHMgTGlzdEl0ZXJhdG9yPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBpbnQgbWluSW5kZXg7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhdG9yIGZvciB0aGUgc3BlY2lmaWVkIGFycmF5LgotCSAqLwotCXB1YmxpYyBBcnJheUxpc3RJdGVyYXRvcihFLi4uIGFycmF5KSB7Ci0JCXRoaXMoYXJyYXksIDAsIGFycmF5Lmxlbmd0aCk7Ci0JfQotCQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgaXRlcmF0b3IgZm9yIHRoZSBzcGVjaWZpZWQgYXJyYXksCi0JICogc3RhcnRpbmcgYXQgdGhlIHNwZWNpZmllZCBzdGFydCBpbmRleCBhbmQgY29udGludWluZyBmb3IKLQkgKiB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKi8KLQlwdWJsaWMgQXJyYXlMaXN0SXRlcmF0b3IoRVtdIGFycmF5LCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJc3VwZXIoYXJyYXksIHN0YXJ0LCBsZW5ndGgpOwotCQl0aGlzLm1pbkluZGV4ID0gc3RhcnQ7Ci0JfQotCQotCXB1YmxpYyBpbnQgbmV4dEluZGV4KCkgewotCQlyZXR1cm4gdGhpcy5uZXh0SW5kZXg7Ci0JfQotCQotCXB1YmxpYyBpbnQgcHJldmlvdXNJbmRleCgpIHsKLQkJcmV0dXJuIHRoaXMubmV4dEluZGV4IC0gMTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaGFzUHJldmlvdXMoKSB7Ci0JCXJldHVybiB0aGlzLm5leHRJbmRleCA+IHRoaXMubWluSW5kZXg7Ci0JfQotCQotCXB1YmxpYyBFIHByZXZpb3VzKCkgewotCQlpZiAodGhpcy5oYXNQcmV2aW91cygpKSB7Ci0JCQlyZXR1cm4gdGhpcy5hcnJheVstLXRoaXMubmV4dEluZGV4XTsKLQkJfQotCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGQoRSBlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXQoRSBlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0NoYWluSXRlcmF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvQ2hhaW5JdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjc1OTRmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvQ2hhaW5JdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIEEgPGNvZGU+Q2hhaW5JdGVyYXRvcjwvY29kZT4gcHJvdmlkZXMgYSBwbHVnZ2FibGUgPGNvZGU+SXRlcmF0b3I8L2NvZGU+Ci0gKiB0aGF0IGxvb3BzIG92ZXIgYSBjaGFpbiBvZiBhcmJpdHJhcmlseSBsaW5rZWQgb2JqZWN0cy4gVGhlIGNoYWluCi0gKiBzaG91bGQgYmUgbnVsbC10ZXJtaW5hdGVkIChpLmUuIGEgY2FsbCB0byB0aGUgPGNvZGU+bmV4dExpbmsoT2JqZWN0KTwvY29kZT4KLSAqIG1ldGhvZCBzaG91bGQgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IHdoZW4gaXQgaXMgcGFzc2VkIHRoZSBsYXN0Ci0gKiBsaW5rIG9mIHRoZSBjaGFpbikuCi0gKiBUbyB1c2UsIHN1cHBseSBhIHN0YXJ0aW5nIGxpbmsgYW5kIHN1cHBseSBhIDxjb2RlPkxpbmtlcjwvY29kZT4gb3IgCi0gKiBzdWJjbGFzcyA8Y29kZT5DaGFpbkl0ZXJhdG9yPC9jb2RlPiBhbmQgb3ZlcnJpZGUgdGhlCi0gKiA8Y29kZT5uZXh0TGluayhPYmplY3QpPC9jb2RlPiBtZXRob2QuCi0gKiBUaGUgc3RhcnRpbmcgbGluayB3aWxsIGJlIHRoZSBmaXJzdCBvYmplY3QgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yLgotICogSWYgdGhlIHN0YXJ0aW5nIGxpbmsgaXMgPGNvZGU+bnVsbDwvY29kZT4sIHRoZSBpdGVyYXRvciB3aWxsIGJlIGVtcHR5LgotICogTm90ZSB0aGF0IHRoZSBpdGVyYXRvciBkb2VzIG5vdCBzdXBwb3J0IDxjb2RlPm51bGw8L2NvZGU+IGVsZW1lbnRzLgotICovCi1wdWJsaWMgY2xhc3MgQ2hhaW5JdGVyYXRvcjxFPgotCWltcGxlbWVudHMgSXRlcmF0b3I8RT4KLXsKLQlwcml2YXRlIEUgbmV4dExpbms7Ci0JcHJpdmF0ZSBmaW5hbCBMaW5rZXI8RT4gbGlua2VyOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIHN0YXJ0aW5nIGxpbmsKLQkgKiBhbmQgYSBsaW5rZXIgdGhhdCBzaW1wbHkgcmV0dXJucyBudWxsLCBpbmRpY2F0aW5nIHRoZSBlbmQgb2YgdGhlIGNoYWluLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZQotCSAqIDxjb2RlPm5leHRMaW5rKE9iamVjdCk8L2NvZGU+IG1ldGhvZCBpbnN0ZWFkIG9mIGJ1aWxkaW5nCi0JICogYSA8Y29kZT5MaW5rZXI8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBDaGFpbkl0ZXJhdG9yKEUgc3RhcnRMaW5rKSB7Ci0JCXRoaXMoc3RhcnRMaW5rLCBMaW5rZXIuTnVsbC48RT5pbnN0YW5jZSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBzdGFydGluZyBsaW5rCi0JICogYW5kIGxpbmtlci4KLQkgKi8KLQlwdWJsaWMgQ2hhaW5JdGVyYXRvcihFIHN0YXJ0TGluaywgTGlua2VyPEU+IGxpbmtlcikgewotCQlzdXBlcigpOwotCQl0aGlzLm5leHRMaW5rID0gc3RhcnRMaW5rOwotCQl0aGlzLmxpbmtlciA9IGxpbmtlcjsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJcmV0dXJuIHRoaXMubmV4dExpbmsgIT0gbnVsbDsKLQl9Ci0JCi0JcHVibGljIEUgbmV4dCgpIHsKLQkJaWYgKHRoaXMubmV4dExpbmsgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCQlFIHJlc3VsdCA9IHRoaXMubmV4dExpbms7Ci0JCXRoaXMubmV4dExpbmsgPSB0aGlzLm5leHRMaW5rKHRoaXMubmV4dExpbmspOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5leHQgbGluayBpbiB0aGUgY2hhaW4uCi0JICovCi0JcHJvdGVjdGVkIEUgbmV4dExpbmsoRSBjdXJyZW50TGluaykgewotCQlyZXR1cm4gdGhpcy5saW5rZXIubmV4dExpbmsoY3VycmVudExpbmspOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLm5leHRMaW5rKTsKLQl9Ci0JCi0KLQkvLyoqKioqKioqKiogaW5uZXIgY2xhc3NlcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBVc2VkIGJ5IDxjb2RlPkNoYWluSXRlcmF0b3I8L2NvZGU+IHRvIGxpbmsKLQkgKiB0aGUgZWxlbWVudHMgaW4gdGhlIGNoYWluLgotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgTGlua2VyPFQ+IHsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBuZXh0IGxpbmsgaW4gdGhlIGNoYWluLgotCQkgKi8KLQkJVCBuZXh0TGluayhUIGN1cnJlbnRMaW5rKTsKLQotCi0JCWZpbmFsIGNsYXNzIE51bGw8Uz4gaW1wbGVtZW50cyBMaW5rZXI8Uz4gewotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIExpbmtlciBJTlNUQU5DRSA9IG5ldyBOdWxsKCk7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCXB1YmxpYyBzdGF0aWMgPFI+IExpbmtlcjxSPiBpbnN0YW5jZSgpIHsKLQkJCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCQl9Ci0JCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCQlwcml2YXRlIE51bGwoKSB7Ci0JCQkJc3VwZXIoKTsKLQkJCX0KLQkJCS8vIHNpbXBseSByZXR1cm4gbnVsbCwgaW5kaWNhdGluZyB0aGUgY2hhaW4gaXMgZW5kZWQKLQkJCXB1YmxpYyBTIG5leHRMaW5rKFMgY3VycmVudExpbmspIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIkNoYWluSXRlcmF0b3IuTGlua2VyLk51bGwiOwotCQkJfQotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvQ2xvbmVJdGVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9DbG9uZUl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3ZGY1YzkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9DbG9uZUl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogQSA8Y29kZT5DbG9uZUl0ZXJhdG9yPC9jb2RlPiBpdGVyYXRlcyBvdmVyIGEgY29weSBvZiBhIGNvbGxlY3Rpb24sCi0gKiBhbGxvd2luZyBmb3IgY29uY3VycmVudCBhY2Nlc3MgdG8gdGhlIG9yaWdpbmFsIGNvbGxlY3Rpb24uCi0gKiA8cD4KLSAqIFRoZSBvcmlnaW5hbCBjb2xsZWN0aW9uIHBhc3NlZCB0byB0aGUgPGNvZGU+Q2xvbmVJdGVyYXRvcjwvY29kZT4ncwotICogY29uc3RydWN0b3Igc2hvdWxkIGJlIHN5bmNocm9uaXplZDsgb3RoZXJ3aXNlIHlvdSBydW4gdGhlIHJpc2sgb2YKLSAqIGEgY29ycnVwdGVkIGNvbGxlY3Rpb24uCi0gKiA8cD4KLSAqIEJ5IGRlZmF1bHQsIGEgPGNvZGU+Q2xvbmVJdGVyYXRvcjwvY29kZT4gZG9lcyBub3Qgc3VwcG9ydCB0aGUKLSAqIDxjb2RlPiNyZW1vdmUoKTwvY29kZT4gb3BlcmF0aW9uOyB0aGlzIGlzIGJlY2F1c2UgaXQgZG9lcyBub3QgaGF2ZQotICogYWNjZXNzIHRvIHRoZSBvcmlnaW5hbCBjb2xsZWN0aW9uLiBCdXQgaWYgdGhlIDxjb2RlPkNsb25lSXRlcmF0b3I8L2NvZGU+Ci0gKiBpcyBzdXBwbGllZCB3aXRoIGFuIDxjb2RlPk11dGF0b3I8L2NvZGU+IGl0IHdpbGwgZGVsZWdhdGUgdGhlCi0gKiA8Y29kZT4jcmVtb3ZlKCk8L2NvZGU+IG9wZXJhdGlvbiB0byB0aGUgPGNvZGU+TXV0YXRvcjwvY29kZT4uCi0gKiBBbHRlcm5hdGl2ZWx5LCBhIHN1YmNsYXNzIGNhbiBvdmVycmlkZSB0aGUgPGNvZGU+I3JlbW92ZShPYmplY3QpPC9jb2RlPgotICogbWV0aG9kLgotICovCi1wdWJsaWMgY2xhc3MgQ2xvbmVJdGVyYXRvcjxFPgotCWltcGxlbWVudHMgSXRlcmF0b3I8RT4KLXsKLQlwcml2YXRlIGZpbmFsIEl0ZXJhdG9yPEU+IG5lc3RlZEl0ZXJhdG9yOwotCXByaXZhdGUgRSBjdXJyZW50OwotCXByaXZhdGUgZmluYWwgTXV0YXRvcjxFPiBtdXRhdG9yOwotCXByaXZhdGUgYm9vbGVhbiByZW1vdmVBbGxvd2VkOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igb24gYSBjb3B5IG9mIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKiBUaGUgPGNvZGU+I3JlbW92ZSgpPC9jb2RlPiBtZXRob2Qgd2lsbCBub3QgYmUgc3VwcG9ydGVkLAotCSAqIHVubGVzcyBhIHN1YmNsYXNzIG92ZXJyaWRlcyB0aGUgPGNvZGU+I3JlbW92ZShPYmplY3QpPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgQ2xvbmVJdGVyYXRvcihDb2xsZWN0aW9uPEU+IGMpIHsKLQkJdGhpcyhjLCBNdXRhdG9yLlJlYWRPbmx5LjxFPmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciBvbiBhIGNvcHkgb2YgdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIFVzZSB0aGUgc3BlY2lmaWVkIG11dGF0b3IgdG8gcmVtb3ZlIG9iamVjdHMgZnJvbSB0aGUKLQkgKiBvcmlnaW5hbCBjb2xsZWN0aW9uLgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBDbG9uZUl0ZXJhdG9yKENvbGxlY3Rpb248RT4gYywgTXV0YXRvcjxFPiBtdXRhdG9yKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMubmVzdGVkSXRlcmF0b3IgPSBuZXcgQXJyYXlJdGVyYXRvcjxFPigoRVtdKSBjLnRvQXJyYXkoKSk7Ci0JCXRoaXMuY3VycmVudCA9IG51bGw7Ci0JCXRoaXMubXV0YXRvciA9IG11dGF0b3I7Ci0JCXRoaXMucmVtb3ZlQWxsb3dlZCA9IGZhbHNlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBJdGVyYXRvciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQlyZXR1cm4gdGhpcy5uZXN0ZWRJdGVyYXRvci5oYXNOZXh0KCk7Ci0JfQotCi0JcHVibGljIEUgbmV4dCgpIHsKLQkJdGhpcy5jdXJyZW50ID0gdGhpcy5uZXN0ZWRJdGVyYXRvci5uZXh0KCk7Ci0JCXRoaXMucmVtb3ZlQWxsb3dlZCA9IHRydWU7Ci0JCXJldHVybiB0aGlzLmN1cnJlbnQ7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQlpZiAoICEgdGhpcy5yZW1vdmVBbGxvd2VkKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5yZW1vdmUodGhpcy5jdXJyZW50KTsKLQkJdGhpcy5yZW1vdmVBbGxvd2VkID0gZmFsc2U7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBmcm9tIHRoZSBvcmlnaW5hbCBjb2xsZWN0aW9uLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGEgc3ViY2xhc3MgYXMgYW4KLQkgKiBhbHRlcm5hdGl2ZSB0byBidWlsZGluZyBhbiA8Y29kZT5NdXRhdG9yPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmUoRSBlKSB7Ci0JCXRoaXMubXV0YXRvci5yZW1vdmUoZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcyk7Ci0JfQotCi0KLQkvLyoqKioqKioqKiogbWVtYmVyIGludGVyZmFjZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBVc2VkIGJ5IDxjb2RlPkNsb25lSXRlcmF0b3I8L2NvZGU+IHRvIHJlbW92ZQotCSAqIGVsZW1lbnRzIGZyb20gdGhlIG9yaWdpbmFsIGNvbGxlY3Rpb247IHNpbmNlIHRoZSBpdGVyYXRvcgotCSAqIGRvZXMgbm90IGhhdmUgZGlyZWN0IGFjY2VzcyB0byB0aGUgb3JpZ2luYWwgY29sbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgaW50ZXJmYWNlIE11dGF0b3I8VD4gewotCi0JCS8qKgotCQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBvYmplY3QgZnJvbSB0aGUgb3JpZ2luYWwgY29sbGVjdGlvbi4KLQkJICovCi0JCXZvaWQgcmVtb3ZlKFQgY3VycmVudCk7Ci0KLQotCQlmaW5hbCBjbGFzcyBSZWFkT25seTxTPiBpbXBsZW1lbnRzIE11dGF0b3I8Uz4gewotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIE11dGF0b3IgSU5TVEFOQ0UgPSBuZXcgUmVhZE9ubHkoKTsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJcHVibGljIHN0YXRpYyA8Uj4gTXV0YXRvcjxSPiBpbnN0YW5jZSgpIHsKLQkJCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCQl9Ci0JCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCQlwcml2YXRlIFJlYWRPbmx5KCkgewotCQkJCXN1cGVyKCk7Ci0JCQl9Ci0JCQkvLyByZW1vdmUgaXMgbm90IHN1cHBvcnRlZAotCQkJcHVibGljIHZvaWQgcmVtb3ZlKE9iamVjdCBjdXJyZW50KSB7Ci0JCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJDbG9uZUl0ZXJhdG9yLk11dGF0b3IuUmVhZE9ubHkiOwotCQkJfQotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvQ2xvbmVMaXN0SXRlcmF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvQ2xvbmVMaXN0SXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJkNzAxYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0Nsb25lTGlzdEl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBBIDxjb2RlPkNsb25lTGlzdEl0ZXJhdG9yPC9jb2RlPiBpdGVyYXRlcyBvdmVyIGEgY29weSBvZiBhIGxpc3QsCi0gKiBhbGxvd2luZyBmb3IgY29uY3VycmVudCBhY2Nlc3MgdG8gdGhlIG9yaWdpbmFsIGxpc3QuCi0gKiA8cD4KLSAqIFRoZSBvcmlnaW5hbCBsaXN0IHBhc3NlZCB0byB0aGUgPGNvZGU+Q2xvbmVMaXN0SXRlcmF0b3I8L2NvZGU+J3MKLSAqIGNvbnN0cnVjdG9yIHNob3VsZCBiZSBzeW5jaHJvbml6ZWQ7IG90aGVyd2lzZSB5b3UgcnVuIHRoZSByaXNrIG9mCi0gKiBhIGNvcnJ1cHRlZCBsaXN0LgotICogPHA+Ci0gKiBCeSBkZWZhdWx0LCBhIDxjb2RlPkNsb25lTGlzdEl0ZXJhdG9yPC9jb2RlPiBkb2VzIG5vdCBzdXBwb3J0IHRoZQotICogbW9kaWZpY2F0aW9uIG9wZXJhdGlvbnM7IHRoaXMgaXMgYmVjYXVzZSBpdCBkb2VzIG5vdCBoYXZlCi0gKiBhY2Nlc3MgdG8gdGhlIG9yaWdpbmFsIGxpc3QuIEJ1dCBpZiB0aGUgPGNvZGU+Q2xvbmVMaXN0SXRlcmF0b3I8L2NvZGU+Ci0gKiBpcyBzdXBwbGllZCB3aXRoIGEgPGNvZGU+TXV0YXRvcjwvY29kZT4gaXQgd2lsbCBkZWxlZ2F0ZSB0aGUKLSAqIG1vZGlmaWNhdGlvbiBvcGVyYXRpb25zIHRvIHRoZSA8Y29kZT5NdXRhdG9yPC9jb2RlPi4KLSAqIEFsdGVybmF0aXZlbHksIGEgc3ViY2xhc3MgY2FuIG92ZXJyaWRlIHRoZSBtb2RpZmljYXRpb24gbWV0aG9kcy4KLSAqLwotcHVibGljIGNsYXNzIENsb25lTGlzdEl0ZXJhdG9yPEU+Ci0JaW1wbGVtZW50cyBMaXN0SXRlcmF0b3I8RT4KLXsKLQlwcml2YXRlIGZpbmFsIExpc3RJdGVyYXRvcjxFPiBuZXN0ZWRMaXN0SXRlcmF0b3I7Ci0JcHJpdmF0ZSBpbnQgY3Vyc29yOwotCXByaXZhdGUgU3RyaW5nIHN0YXRlOwotCXByaXZhdGUgZmluYWwgTXV0YXRvcjxFPiBtdXRhdG9yOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVOS05PV04gPSAidW5rbm93biI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRVZJT1VTID0gInByZXZpb3VzIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVYVCA9ICJuZXh0IjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYXRvciBvbiBhIGNvcHkgb2YgdGhlIHNwZWNpZmllZCBsaXN0LgotCSAqIFRoZSBtb2RpZmljYXRpb24gbWV0aG9kcyB3aWxsIG5vdCBiZSBzdXBwb3J0ZWQsCi0JICogdW5sZXNzIGEgc3ViY2xhc3Mgb3ZlcnJpZGVzIHRoZW0uCi0JICovCi0JcHVibGljIENsb25lTGlzdEl0ZXJhdG9yKExpc3Q8RT4gbGlzdCkgewotCQl0aGlzKGxpc3QsIE11dGF0b3IuUmVhZE9ubHkuPEU+aW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYXRvciBvbiBhIGNvcHkgb2YgdGhlIHNwZWNpZmllZCBsaXN0LgotCSAqIFVzZSB0aGUgc3BlY2lmaWVkIGxpc3QgbXV0YXRvciB0byBtb2RpZnkgdGhlIG9yaWdpbmFsIGxpc3QuCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIENsb25lTGlzdEl0ZXJhdG9yKExpc3Q8RT4gbGlzdCwgTXV0YXRvcjxFPiBtdXRhdG9yKSB7Ci0JCXN1cGVyKCk7Ci0JCS8vIGJ1aWxkIGEgY29weSBvZiB0aGUgbGlzdCBhbmQga2VlcCBpdCBpbiBzeW5jaCB3aXRoIG9yaWdpbmFsIChpZiB0aGUgbXV0YXRvciBhbGxvd3MgY2hhbmdlcykKLQkJLy8gdGhhdCB3YXkgdGhlIG5lc3RlZCBsaXN0IGl0ZXJhdG9yIHdpbGwgbWFpbnRhaW4gc29tZSBvZiBvdXIgc3RhdGUKLQkJdGhpcy5uZXN0ZWRMaXN0SXRlcmF0b3IgPSBDb2xsZWN0aW9uVG9vbHMubGlzdCgoRVtdKSBsaXN0LnRvQXJyYXkoKSkubGlzdEl0ZXJhdG9yKCk7Ci0JCXRoaXMubXV0YXRvciA9IG11dGF0b3I7Ci0JCXRoaXMuY3Vyc29yID0gMDsKLQkJdGhpcy5zdGF0ZSA9IFVOS05PV047Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIExpc3RJdGVyYXRvciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQlyZXR1cm4gdGhpcy5uZXN0ZWRMaXN0SXRlcmF0b3IuaGFzTmV4dCgpOwotCX0KLQotCXB1YmxpYyBFIG5leHQoKSB7Ci0JCS8vIGFsbG93IHRoZSBuZXN0ZWQgaXRlcmF0b3IgdG8gdGhyb3cgYW4gZXhjZXB0aW9uIGJlZm9yZSB3ZSBtb2RpZnkgdGhlIGluZGV4Ci0JCUUgbmV4dCA9IHRoaXMubmVzdGVkTGlzdEl0ZXJhdG9yLm5leHQoKTsKLQkJdGhpcy5jdXJzb3IrKzsKLQkJdGhpcy5zdGF0ZSA9IE5FWFQ7Ci0JCXJldHVybiBuZXh0OwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJLy8gYWxsb3cgdGhlIG5lc3RlZCBpdGVyYXRvciB0byB0aHJvdyBhbiBleGNlcHRpb24gYmVmb3JlIHdlIG1vZGlmeSB0aGUgb3JpZ2luYWwgbGlzdAotCQl0aGlzLm5lc3RlZExpc3RJdGVyYXRvci5yZW1vdmUoKTsKLQkJaWYgKHRoaXMuc3RhdGUgPT0gUFJFVklPVVMpIHsKLQkJCXRoaXMucmVtb3ZlKHRoaXMuY3Vyc29yKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuY3Vyc29yLS07Ci0JCQl0aGlzLnJlbW92ZSh0aGlzLmN1cnNvcik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgaW50IG5leHRJbmRleCgpIHsKLQkJcmV0dXJuIHRoaXMubmVzdGVkTGlzdEl0ZXJhdG9yLm5leHRJbmRleCgpOwotCX0KLQotCXB1YmxpYyBpbnQgcHJldmlvdXNJbmRleCgpIHsKLQkJcmV0dXJuIHRoaXMubmVzdGVkTGlzdEl0ZXJhdG9yLnByZXZpb3VzSW5kZXgoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNQcmV2aW91cygpIHsKLQkJcmV0dXJuIHRoaXMubmVzdGVkTGlzdEl0ZXJhdG9yLmhhc1ByZXZpb3VzKCk7Ci0JfQotCi0JcHVibGljIEUgcHJldmlvdXMoKSB7Ci0JCS8vIGFsbG93IHRoZSBuZXN0ZWQgaXRlcmF0b3IgdG8gdGhyb3cgYW4gZXhjZXB0aW9uIGJlZm9yZSB3ZSBtb2RpZnkgdGhlIGluZGV4Ci0JCUUgcHJldmlvdXMgPSB0aGlzLm5lc3RlZExpc3RJdGVyYXRvci5wcmV2aW91cygpOwotCQl0aGlzLmN1cnNvci0tOwotCQl0aGlzLnN0YXRlID0gUFJFVklPVVM7Ci0JCXJldHVybiBwcmV2aW91czsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGQoRSBvKSB7Ci0JCS8vIGFsbG93IHRoZSBuZXN0ZWQgaXRlcmF0b3IgdG8gdGhyb3cgYW4gZXhjZXB0aW9uIGJlZm9yZSB3ZSBtb2RpZnkgdGhlIG9yaWdpbmFsIGxpc3QKLQkJdGhpcy5uZXN0ZWRMaXN0SXRlcmF0b3IuYWRkKG8pOwotCQl0aGlzLmFkZCh0aGlzLmN1cnNvciwgbyk7Ci0JCXRoaXMuY3Vyc29yKys7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0KEUgbykgewotCQkvLyBhbGxvdyB0aGUgbmVzdGVkIGl0ZXJhdG9yIHRvIHRocm93IGFuIGV4Y2VwdGlvbiBiZWZvcmUgd2UgbW9kaWZ5IHRoZSBvcmlnaW5hbCBsaXN0Ci0JCXRoaXMubmVzdGVkTGlzdEl0ZXJhdG9yLnNldChvKTsKLQkJaWYgKHRoaXMuc3RhdGUgPT0gUFJFVklPVVMpIHsKLQkJCXRoaXMuc2V0KHRoaXMuY3Vyc29yLCBvKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuc2V0KHRoaXMuY3Vyc29yIC0gMSwgbyk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBlbGVtZW50IHRvIHRoZSBvcmlnaW5hbCBsaXN0LgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGEgc3ViY2xhc3MgYXMgYW4KLQkgKiBhbHRlcm5hdGl2ZSB0byBidWlsZGluZyBhIDxjb2RlPk11dGF0b3I8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZChpbnQgaW5kZXgsIEUgbykgewotCQl0aGlzLm11dGF0b3IuYWRkKGluZGV4LCBvKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBlbGVtZW50IGZyb20gdGhlIG9yaWdpbmFsIGxpc3QuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gYnkgYSBzdWJjbGFzcyBhcyBhbgotCSAqIGFsdGVybmF0aXZlIHRvIGJ1aWxkaW5nIGEgPGNvZGU+TXV0YXRvcjwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlKGludCBpbmRleCkgewotCQl0aGlzLm11dGF0b3IucmVtb3ZlKGluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHNwZWNpZmllZCBlbGVtZW50IGluIHRoZSBvcmlnaW5hbCBsaXN0LgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGEgc3ViY2xhc3MgYXMgYW4KLQkgKiBhbHRlcm5hdGl2ZSB0byBidWlsZGluZyBhIDxjb2RlPk11dGF0b3I8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldChpbnQgaW5kZXgsIEUgbykgewotCQl0aGlzLm11dGF0b3Iuc2V0KGluZGV4LCBvKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzKTsKLQl9Ci0KLQotCS8vKioqKioqKioqKiBtZW1iZXIgaW50ZXJmYWNlICoqKioqKioqKioKLQotCS8qKgotCSAqIFVzZWQgYnkgPGNvZGU+Q2xvbmVMaXN0SXRlcmF0b3I8L2NvZGU+IHRvIHJlbW92ZQotCSAqIGVsZW1lbnRzIGZyb20gdGhlIG9yaWdpbmFsIGxpc3Q7IHNpbmNlIHRoZSBsaXN0IGl0ZXJhdG9yCi0JICogZG9lcyBub3QgaGF2ZSBkaXJlY3QgYWNjZXNzIHRvIHRoZSBvcmlnaW5hbCBsaXN0LgotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgTXV0YXRvcjxUPiB7Ci0KLQkJLyoqCi0JCSAqIEFkZCB0aGUgc3BlY2lmaWVkIG9iamVjdCB0byB0aGUgb3JpZ2luYWwgbGlzdC4KLQkJICovCi0JCXZvaWQgYWRkKGludCBpbmRleCwgVCBvKTsKLQotCQkvKioKLQkJICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGZyb20gdGhlIG9yaWdpbmFsIGxpc3QuCi0JCSAqLwotCQl2b2lkIHJlbW92ZShpbnQgaW5kZXgpOwotCi0JCS8qKgotCQkgKiBTZXQgdGhlIHNwZWNpZmllZCBvYmplY3QgaW4gdGhlIG9yaWdpbmFsIGxpc3QuCi0JCSAqLwotCQl2b2lkIHNldChpbnQgaW5kZXgsIFQgbyk7Ci0KLQotCQlmaW5hbCBjbGFzcyBSZWFkT25seTxTPiBpbXBsZW1lbnRzIE11dGF0b3I8Uz4gewotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIE11dGF0b3IgSU5TVEFOQ0UgPSBuZXcgUmVhZE9ubHkoKTsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJcHVibGljIHN0YXRpYyA8Uj4gTXV0YXRvcjxSPiBpbnN0YW5jZSgpIHsKLQkJCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCQl9Ci0JCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCQlwcml2YXRlIFJlYWRPbmx5KCkgewotCQkJCXN1cGVyKCk7Ci0JCQl9Ci0JCQkvLyBhZGQgaXMgbm90IHN1cHBvcnRlZAotCQkJcHVibGljIHZvaWQgYWRkKGludCBpbmRleCwgT2JqZWN0IG8pIHsKLQkJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJCX0KLQkJCS8vIHJlbW92ZSBpcyBub3Qgc3VwcG9ydGVkCi0JCQlwdWJsaWMgdm9pZCByZW1vdmUoaW50IGluZGV4KSB7Ci0JCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQkvLyBzZXQgaXMgbm90IHN1cHBvcnRlZAotCQkJcHVibGljIHZvaWQgc2V0KGludCBpbmRleCwgT2JqZWN0IG8pIHsKLQkJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIkNsb25lTGlzdEl0ZXJhdG9yLk11dGF0b3IuUmVhZE9ubHkiOwotCQkJfQotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvQ29tcG9zaXRlSXRlcmF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvQ29tcG9zaXRlSXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBhZTBjYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0NvbXBvc2l0ZUl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogQSA8Y29kZT5Db21wb3NpdGVJdGVyYXRvcjwvY29kZT4gd3JhcHMgYSBjb2xsZWN0aW9uCi0gKiBvZiA8Y29kZT5JdGVyYXRvcjwvY29kZT5zIGFuZCBtYWtlcyB0aGVtIGFwcGVhciB0byBiZSBhIHNpbmdsZQotICogPGNvZGU+SXRlcmF0b3I8L2NvZGU+LgotICovCi1wdWJsaWMgY2xhc3MgQ29tcG9zaXRlSXRlcmF0b3I8RT4KLQlpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBJdGVyYXRvcjw/IGV4dGVuZHMgSXRlcmF0b3I8PyBleHRlbmRzIEU+PiBpdGVyYXRvcnM7Ci0JcHJpdmF0ZSBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gY3VycmVudEl0ZXJhdG9yOwotCXByaXZhdGUgSXRlcmF0b3I8PyBleHRlbmRzIEU+IGxhc3RJdGVyYXRvclRvUmV0dXJuTmV4dDsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIG9mIGl0ZXJhdG9ycy4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlSXRlcmF0b3IoQ29sbGVjdGlvbjw/IGV4dGVuZHMgSXRlcmF0b3I8PyBleHRlbmRzIEU+PiBpdGVyYXRvcnMpIHsKLQkJdGhpcyhpdGVyYXRvcnMuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIG9mIGl0ZXJhdG9ycy4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlSXRlcmF0b3IoSXRlcmF0b3I8PyBleHRlbmRzIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPj4gaXRlcmF0b3JzKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuaXRlcmF0b3JzID0gaXRlcmF0b3JzOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHByZXBlbmRlZAotCSAqIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIENvbXBvc2l0ZUl0ZXJhdG9yKEUgb2JqZWN0LCBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IpIHsKLQkJdGhpcyhuZXcgU2luZ2xlRWxlbWVudEl0ZXJhdG9yPEU+KG9iamVjdCksIGl0ZXJhdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIG9iamVjdCBhcHBlbmRlZAotCSAqIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIENvbXBvc2l0ZUl0ZXJhdG9yKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvciwgRSBvYmplY3QpIHsKLQkJdGhpcyhpdGVyYXRvciwgbmV3IFNpbmdsZUVsZW1lbnRJdGVyYXRvcjxFPihvYmplY3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9ycy4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlSXRlcmF0b3IoSXRlcmF0b3I8PyBleHRlbmRzIEU+Li4uIGl0ZXJhdG9ycykgewotCQl0aGlzKG5ldyBBcnJheUl0ZXJhdG9yPEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPj4oaXRlcmF0b3JzKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJdHJ5IHsKLQkJCXRoaXMubG9hZEN1cnJlbnRJdGVyYXRvcigpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyB0aGlzIG9jY3VycyBpZiB0aGVyZSBhcmUgbm8gaXRlcmF0b3JzIGF0IGFsbAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0aGlzLmN1cnJlbnRJdGVyYXRvci5oYXNOZXh0KCk7Ci0JfQotCi0JcHVibGljIEUgbmV4dCgpIHsKLQkJdGhpcy5sb2FkQ3VycmVudEl0ZXJhdG9yKCk7Ci0JCUUgcmVzdWx0ID0gdGhpcy5jdXJyZW50SXRlcmF0b3IubmV4dCgpOwotCi0JCS8vIHRoZSBzdGF0ZW1lbnQgYWJvdmUgd2lsbCB0aHJvdyBhIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24KLQkJLy8gaWYgdGhlIGN1cnJlbnQgaXRlcmF0b3IgaXMgYXQgdGhlIGVuZCBvZiB0aGUgbGluZTsKLQkJLy8gc28gaWYgd2UgZ2V0IGhlcmUsIHdlIGNhbiBzZXQgJ2xhc3RJdGVyYXRvclRvUmV0dXJuTmV4dCcKLQkJdGhpcy5sYXN0SXRlcmF0b3JUb1JldHVybk5leHQgPSB0aGlzLmN1cnJlbnRJdGVyYXRvcjsKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJaWYgKHRoaXMubGFzdEl0ZXJhdG9yVG9SZXR1cm5OZXh0ID09IG51bGwpIHsKLQkJCS8vIENvbXBvc2l0ZUl0ZXJhdG9yI25leHQoKSBoYXMgbmV2ZXIgYmVlbiBjYWxsZWQKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmxhc3RJdGVyYXRvclRvUmV0dXJuTmV4dC5yZW1vdmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkIGN1cnJlbnRJdGVyYXRvciB3aXRoIHRoZSBmaXJzdCBpdGVyYXRvciB0aGF0IDxjb2RlPmhhc05leHQoKTwvY29kZT4KLQkgKiBvciB0aGUgZmluYWwgaXRlcmF0b3IgaWYgYWxsIHRoZSBlbGVtZW50cyBoYXZlIGFscmVhZHkgYmVlbiByZXRyaWV2ZWQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWRDdXJyZW50SXRlcmF0b3IoKSB7Ci0JCWlmICh0aGlzLmN1cnJlbnRJdGVyYXRvciA9PSBudWxsKSB7Ci0JCQl0aGlzLmN1cnJlbnRJdGVyYXRvciA9IHRoaXMuaXRlcmF0b3JzLm5leHQoKTsKLQkJfQotCQl3aGlsZSAoKCAhIHRoaXMuY3VycmVudEl0ZXJhdG9yLmhhc05leHQoKSkgJiYgdGhpcy5pdGVyYXRvcnMuaGFzTmV4dCgpKSB7Ci0JCQl0aGlzLmN1cnJlbnRJdGVyYXRvciA9IHRoaXMuaXRlcmF0b3JzLm5leHQoKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuaXRlcmF0b3JzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvQ29tcG9zaXRlTGlzdEl0ZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0NvbXBvc2l0ZUxpc3RJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjRkM2MyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvQ29tcG9zaXRlTGlzdEl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIEEgPGNvZGU+Q29tcG9zaXRlTGlzdEl0ZXJhdG9yPC9jb2RlPiB3cmFwcyBhIGxpc3QKLSAqIG9mIDxjb2RlPkxpc3RJdGVyYXRvcjwvY29kZT5zIGFuZCBtYWtlcyB0aGVtIGFwcGVhciB0byBiZSBhIHNpbmdsZQotICogPGNvZGU+TGlzdEl0ZXJhdG9yPC9jb2RlPi4KLSAqLwotcHVibGljIGNsYXNzIENvbXBvc2l0ZUxpc3RJdGVyYXRvcjxFPgotCWltcGxlbWVudHMgTGlzdEl0ZXJhdG9yPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBMaXN0SXRlcmF0b3I8PyBleHRlbmRzIExpc3RJdGVyYXRvcjxFPj4gaXRlcmF0b3JzOwotCXByaXZhdGUgTGlzdEl0ZXJhdG9yPEU+IG5leHRJdGVyYXRvcjsKLQlwcml2YXRlIGludCBuZXh0SW5kZXg7Ci0gCS8qKgotIAkgKiB0cnVlIGlmICJuZXh0IiB3YXMgbGFzdCByZXR1cm5lZDsgZmFsc2UgaWYgInByZXZpb3VzIiB3YXMgbGFzdCByZXR1cm5lZDsKLSAJICogdGhpcyBkZXRlcm1pbmVzIHRoZSBlZmZlY3Qgb2YgcmVtb3ZlKE9iamVjdCkgb24gbmV4dEluZGV4Ci0gCSAqLwotCXByaXZhdGUgYm9vbGVhbiBuZXh0UmV0dXJuZWQ7Ci0JcHJpdmF0ZSBMaXN0SXRlcmF0b3I8RT4gbGFzdEl0ZXJhdG9yVG9SZXR1cm5FbGVtZW50OwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBsaXN0IG9mIGxpc3QgaXRlcmF0b3JzLgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVMaXN0SXRlcmF0b3IoTGlzdDw/IGV4dGVuZHMgTGlzdEl0ZXJhdG9yPEU+PiBpdGVyYXRvcnMpIHsKLQkJdGhpcyhpdGVyYXRvcnMubGlzdEl0ZXJhdG9yKCkpOwotCX0KLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBsaXN0IG9mIGxpc3QgaXRlcmF0b3JzLgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVMaXN0SXRlcmF0b3IoTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBMaXN0SXRlcmF0b3I8RT4+IGl0ZXJhdG9ycykgewotCQlzdXBlcigpOwotCQl0aGlzLml0ZXJhdG9ycyA9IGl0ZXJhdG9yczsKLQkJdGhpcy5uZXh0SW5kZXggPSAwOwotCQl0aGlzLm5leHRSZXR1cm5lZCA9IGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBvYmplY3QgcHJlcGVuZGVkCi0JICogdG8gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgQ29tcG9zaXRlTGlzdEl0ZXJhdG9yKEUgb2JqZWN0LCBMaXN0SXRlcmF0b3I8RT4gaXRlcmF0b3IpIHsKLQkJdGhpcyhuZXcgU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcjxFPihvYmplY3QpLCBpdGVyYXRvcik7Ci0JfQotCQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIG9iamVjdCBhcHBlbmRlZAotCSAqIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIENvbXBvc2l0ZUxpc3RJdGVyYXRvcihMaXN0SXRlcmF0b3I8RT4gaXRlcmF0b3IsIEUgb2JqZWN0KSB7Ci0JCXRoaXMoaXRlcmF0b3IsIG5ldyBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yPEU+KG9iamVjdCkpOwotCX0KLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBsaXN0IGl0ZXJhdG9ycy4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlTGlzdEl0ZXJhdG9yKExpc3RJdGVyYXRvcjxFPi4uLiBpdGVyYXRvcnMpIHsKLQkJdGhpcyhuZXcgQXJyYXlMaXN0SXRlcmF0b3I8TGlzdEl0ZXJhdG9yPEU+PihpdGVyYXRvcnMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGQoRSBvKSB7Ci0JCXRoaXMuY2hlY2tOZXh0SXRlcmF0b3IoKTsKLQkJdGhpcy5uZXh0SXRlcmF0b3IuYWRkKG8pOwotCQl0aGlzLm5leHRJbmRleCsrOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQl0cnkgewotCQkJdGhpcy5sb2FkTmV4dEl0ZXJhdG9yKCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCS8vIHRoaXMgb2NjdXJzIGlmIHRoZXJlIGFyZSBubyBpdGVyYXRvcnMgYXQgYWxsCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRoaXMubmV4dEl0ZXJhdG9yLmhhc05leHQoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaGFzUHJldmlvdXMoKSB7Ci0JCXRyeSB7Ci0JCQl0aGlzLmxvYWRQcmV2aW91c0l0ZXJhdG9yKCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCS8vIHRoaXMgb2NjdXJzIGlmIHRoZXJlIGFyZSBubyBpdGVyYXRvcnMgYXQgYWxsCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRoaXMubmV4dEl0ZXJhdG9yLmhhc1ByZXZpb3VzKCk7Ci0JfQotCQotCXB1YmxpYyBFIG5leHQoKSB7Ci0JCXRoaXMubG9hZE5leHRJdGVyYXRvcigpOwotCQlFIHJlc3VsdCA9IHRoaXMubmV4dEl0ZXJhdG9yLm5leHQoKTsKLQkKLQkJLy8gdGhlIHN0YXRlbWVudCBhYm92ZSB3aWxsIHRocm93IGEgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbgotCQkvLyBpZiB0aGUgY3VycmVudCBpdGVyYXRvciBpcyBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lOwotCQkvLyBzbyBpZiB3ZSBnZXQgaGVyZSwgd2UgY2FuIHNldCB0aGUgbGFzdEl0ZXJhdG9yVG9SZXR1cm5FbGVtZW50Ci0JCXRoaXMubGFzdEl0ZXJhdG9yVG9SZXR1cm5FbGVtZW50ID0gdGhpcy5uZXh0SXRlcmF0b3I7Ci0JCXRoaXMubmV4dEluZGV4Kys7Ci0JCXRoaXMubmV4dFJldHVybmVkID0gdHJ1ZTsKLQkKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIGludCBuZXh0SW5kZXgoKSB7Ci0JCXJldHVybiB0aGlzLm5leHRJbmRleDsKLQl9Ci0JCi0JcHVibGljIEUgcHJldmlvdXMoKSB7Ci0JCXRoaXMubG9hZFByZXZpb3VzSXRlcmF0b3IoKTsKLQkJRSByZXN1bHQgPSB0aGlzLm5leHRJdGVyYXRvci5wcmV2aW91cygpOwotCQotCQkvLyB0aGUgc3RhdGVtZW50IGFib3ZlIHdpbGwgdGhyb3cgYSBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uCi0JCS8vIGlmIHRoZSBjdXJyZW50IGl0ZXJhdG9yIGlzIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmU7Ci0JCS8vIHNvIGlmIHdlIGdldCBoZXJlLCB3ZSBjYW4gc2V0IHRoZSBsYXN0SXRlcmF0b3JUb1JldHVybkVsZW1lbnQKLQkJdGhpcy5sYXN0SXRlcmF0b3JUb1JldHVybkVsZW1lbnQgPSB0aGlzLm5leHRJdGVyYXRvcjsKLQkJdGhpcy5uZXh0SW5kZXgtLTsKLQkJdGhpcy5uZXh0UmV0dXJuZWQgPSBmYWxzZTsKLQkKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIGludCBwcmV2aW91c0luZGV4KCkgewotCQlyZXR1cm4gdGhpcy5uZXh0SW5kZXggIC0gMTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQlpZiAodGhpcy5sYXN0SXRlcmF0b3JUb1JldHVybkVsZW1lbnQgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMubGFzdEl0ZXJhdG9yVG9SZXR1cm5FbGVtZW50LnJlbW92ZSgpOwotCQlpZiAodGhpcy5uZXh0UmV0dXJuZWQpIHsKLQkJCS8vIGRlY3JlbWVudCB0aGUgaW5kZXggYmVjYXVzZSB0aGUgIm5leHQiIGVsZW1lbnQgaGFzIG1vdmVkIGZvcndhcmQgaW4gdGhlIGxpc3QKLQkJCXRoaXMubmV4dEluZGV4LS07Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0KEUgZSkgewotCQlpZiAodGhpcy5sYXN0SXRlcmF0b3JUb1JldHVybkVsZW1lbnQgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMubGFzdEl0ZXJhdG9yVG9SZXR1cm5FbGVtZW50LnNldChlKTsKLQl9Ci0JCi0JLyoqCi0JICogTG9hZCBuZXh0SXRlcmF0b3Igd2l0aCB0aGUgZmlyc3QgaXRlcmF0b3IgdGhhdCA8Y29kZT5oYXNOZXh0KCk8L2NvZGU+Ci0JICogb3IgdGhlIGZpbmFsIGl0ZXJhdG9yIGlmIGFsbCB0aGUgZWxlbWVudHMgaGF2ZSBhbHJlYWR5IGJlZW4gcmV0cmlldmVkLgotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkTmV4dEl0ZXJhdG9yKCkgewotCQl0aGlzLmNoZWNrTmV4dEl0ZXJhdG9yKCk7Ci0JCXdoaWxlICgoICEgdGhpcy5uZXh0SXRlcmF0b3IuaGFzTmV4dCgpKSAmJiB0aGlzLml0ZXJhdG9ycy5oYXNOZXh0KCkpIHsKLQkJCXRoaXMubmV4dEl0ZXJhdG9yID0gdGhpcy5pdGVyYXRvcnMubmV4dCgpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIExvYWQgbmV4dEl0ZXJhdG9yIHdpdGggdGhlIGZpcnN0IGl0ZXJhdG9yIHRoYXQgPGNvZGU+aGFzUHJldmlvdXMoKTwvY29kZT4KLQkgKiBvciB0aGUgZmlyc3QgaXRlcmF0b3IgaWYgYWxsIHRoZSBlbGVtZW50cyBoYXZlIGFscmVhZHkgYmVlbiByZXRyaWV2ZWQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWRQcmV2aW91c0l0ZXJhdG9yKCkgewotCQl0aGlzLmNoZWNrTmV4dEl0ZXJhdG9yKCk7Ci0JCXdoaWxlICgoICEgdGhpcy5uZXh0SXRlcmF0b3IuaGFzUHJldmlvdXMoKSkgJiYgdGhpcy5pdGVyYXRvcnMuaGFzUHJldmlvdXMoKSkgewotCQkJdGhpcy5uZXh0SXRlcmF0b3IgPSB0aGlzLml0ZXJhdG9ycy5wcmV2aW91cygpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIElmIG5leHRJdGVyYXRvciBpcyBudWxsLCBsb2FkIGl0IHdpdGggdGhlIGZpcnN0IGl0ZXJhdG9yLgotCSAqLwotCXByaXZhdGUgdm9pZCBjaGVja05leHRJdGVyYXRvcigpIHsKLQkJaWYgKHRoaXMubmV4dEl0ZXJhdG9yID09IG51bGwpIHsKLQkJCXRoaXMubmV4dEl0ZXJhdG9yID0gdGhpcy5pdGVyYXRvcnMubmV4dCgpOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuaXRlcmF0b3JzKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0VtcHR5RW51bWVyYXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvRW1wdHlFbnVtZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWI5ODlhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvRW1wdHlFbnVtZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogQSA8Y29kZT5OdWxsRW51bWVyYXRpb248L2NvZGU+IGlzIGp1c3QgdGhhdC4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEVtcHR5RW51bWVyYXRpb248RT4KLQlpbXBsZW1lbnRzIEVudW1lcmF0aW9uPEU+Ci17Ci0KLQkvLyBzaW5nbGV0b24KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIHN0YXRpYyBFbXB0eUVudW1lcmF0aW9uIElOU1RBTkNFID0gbmV3IEVtcHR5RW51bWVyYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBzdGF0aWMgPFQ+IEVudW1lcmF0aW9uPFQ+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEVtcHR5RW51bWVyYXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzTW9yZUVsZW1lbnRzKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIEUgbmV4dEVsZW1lbnQoKSB7Ci0JCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0VtcHR5SXRlcmF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvRW1wdHlJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTYwZDQ1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvRW1wdHlJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogQSA8Y29kZT5OdWxsSXRlcmF0b3I8L2NvZGU+IGlzIGp1c3QgdGhhdC4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEVtcHR5SXRlcmF0b3I8RT4KLQlpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+Ci17Ci0KLQkvLyBzaW5nbGV0b24KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIHN0YXRpYyBFbXB0eUl0ZXJhdG9yIElOU1RBTkNFID0gbmV3IEVtcHR5SXRlcmF0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBzdGF0aWMgPFQ+IEl0ZXJhdG9yPFQ+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEVtcHR5SXRlcmF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBFIG5leHQoKSB7Ci0JCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvRW1wdHlMaXN0SXRlcmF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvRW1wdHlMaXN0SXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg2M2IyNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0VtcHR5TGlzdEl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogQSA8Y29kZT5OdWxsTGlzdEl0ZXJhdG9yPC9jb2RlPiBpcyBqdXN0IHRoYXQuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBFbXB0eUxpc3RJdGVyYXRvcjxFPgotCWltcGxlbWVudHMgTGlzdEl0ZXJhdG9yPEU+Ci17Ci0KLQkvLyBzaW5nbGV0b24KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIHN0YXRpYyBFbXB0eUxpc3RJdGVyYXRvciBJTlNUQU5DRSA9IG5ldyBFbXB0eUxpc3RJdGVyYXRvcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIHN0YXRpYyA8VD4gTGlzdEl0ZXJhdG9yPFQ+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEVtcHR5TGlzdEl0ZXJhdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGQoRSBlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNQcmV2aW91cygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBFIG5leHQoKSB7Ci0JCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIGludCBuZXh0SW5kZXgoKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCXB1YmxpYyBFIHByZXZpb3VzKCkgewotCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBpbnQgcHJldmlvdXNJbmRleCgpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0KEUgZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0VudW1lcmF0aW9uSXRlcmF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvRW51bWVyYXRpb25JdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzU3MTBjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvRW51bWVyYXRpb25JdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIEFuIDxjb2RlPkVudW1lcmF0aW9uSXRlcmF0b3I8L2NvZGU+IHdyYXBzIGFuCi0gKiA8Y29kZT5FbnVtZXJhdGlvbjwvY29kZT4gc28gdGhhdCBpdCBjYW4gYmUgdHJlYXRlZCBsaWtlIGFuCi0gKiA8Y29kZT5JdGVyYXRvcjwvY29kZT4uCi0gKi8KLXB1YmxpYyBjbGFzcyBFbnVtZXJhdGlvbkl0ZXJhdG9yPEU+Ci0JaW1wbGVtZW50cyBJdGVyYXRvcjxFPgotewotCXByaXZhdGUgZmluYWwgRW51bWVyYXRpb248PyBleHRlbmRzIEU+IGVudW1lcmF0aW9uOwotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHRoYXQgd3JhcHMgdGhlIHNwZWNpZmllZCBlbnVtZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRW51bWVyYXRpb25JdGVyYXRvcihFbnVtZXJhdGlvbjw/IGV4dGVuZHMgRT4gZW51bWVyYXRpb24pIHsKLQkJdGhpcy5lbnVtZXJhdGlvbiA9IGVudW1lcmF0aW9uOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQlyZXR1cm4gdGhpcy5lbnVtZXJhdGlvbi5oYXNNb3JlRWxlbWVudHMoKTsKLQl9Ci0JCi0JcHVibGljIEUgbmV4dCgpIHsKLQkJcmV0dXJuIHRoaXMuZW51bWVyYXRpb24ubmV4dEVsZW1lbnQoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5lbnVtZXJhdGlvbik7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9GaWx0ZXJpbmdJdGVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9GaWx0ZXJpbmdJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjBjOTcwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvRmlsdGVyaW5nSXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogQSA8Y29kZT5GaWx0ZXJpbmdJdGVyYXRvcjwvY29kZT4gd3JhcHMgYW5vdGhlciA8Y29kZT5JdGVyYXRvcjwvY29kZT4KLSAqIGFuZCB1c2VzIGEgPGNvZGU+RmlsdGVyPC9jb2RlPiB0byBkZXRlcm1pbmUgd2hpY2ggZWxlbWVudHMgaW4gdGhlCi0gKiBuZXN0ZWQgaXRlcmF0b3IgYXJlIHRvIGJlIHJldHVybmVkIGJ5IGNhbGxzIHRvIDxjb2RlPm5leHQoKTwvY29kZT4uCi0gKiA8cD4KLSAqIEFzIGFuIGFsdGVybmF0aXZlIHRvIGJ1aWxkaW5nIGEgPGNvZGU+RmlsdGVyPC9jb2RlPiwgYSBzdWJjbGFzcwotICogb2YgPGNvZGU+RmlsdGVyaW5nSXRlcmF0b3I8L2NvZGU+IGNhbiBvdmVycmlkZSB0aGUKLSAqIDxjb2RlPmFjY2VwdChPYmplY3QpPC9jb2RlPiBtZXRob2QuCi0gKiA8cD4KLSAqIE9uZSwgcG9zc2libHkgdW5kZXNpcmFibGUsIHNpZGUtZWZmZWN0IG9mIHVzaW5nIHRoaXMgaXRlcmF0b3IgaXMgdGhhdAotICogdGhlIG5lc3RlZCBpdGVyYXRvcidzIDxjb2RlPm5leHQoKTwvY29kZT4gbWV0aG9kIHdpbGwgYmUgaW52b2tlZAotICogPGVtPmJlZm9yZTwvZW0+IHRoZSBmaWx0ZXJlZCBpdGVyYXRvcidzIDxjb2RlPm5leHQoKTwvY29kZT4KLSAqIG1ldGhvZCBpcyBpbnZva2VkLiBUaGlzIGlzIGJlY2F1c2UgdGhlICJuZXh0IiBlbGVtZW50IG11c3QgYmUKLSAqIGNoZWNrZWQgZm9yIHdoZXRoZXIgaXQgaXMgdG8gYmUgYWNjZXB0ZWQgYmVmb3JlIHRoZSBmaWx0ZXJlZCBpdGVyYXRvcgotICogY2FuIGRldGVybWluZSB3aGV0aGVyIGl0IGhhcyBhICJuZXh0IiBlbGVtZW50IChpLmUuIHRoYXQgdGhlCi0gKiA8Y29kZT5oYXNOZXh0KCk8L2NvZGU+IG1ldGhvZCBzaG91bGQgcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+KS4KLSAqIFRoaXMgYWxzbyBwcmV2ZW50cyBhIGZpbHRlcmVkIGl0ZXJhdG9yIGZyb20gc3VwcG9ydGluZyB0aGUgb3B0aW9uYWwKLSAqIDxjb2RlPnJlbW92ZSgpPC9jb2RlPiBtZXRob2QuCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWx0ZXJpbmdJdGVyYXRvcjxFPgotCWltcGxlbWVudHMgSXRlcmF0b3I8RT4KLXsKLQlwcml2YXRlIGZpbmFsIEl0ZXJhdG9yPD8+IG5lc3RlZEl0ZXJhdG9yOwotCS8vIHRydXN0IHRoYXQgdGhlIGZpbHRlciBpcyBjb3JyZWN0IC0gaS5lLiBpdCB3aWxsIG9ubHkgYWNjZXB0IGVsZW1lbnRzIG9mIHR5cGUgRQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgZmluYWwgRmlsdGVyIGZpbHRlcjsKLQlwcml2YXRlIEUgbmV4dDsKLQlwcml2YXRlIGJvb2xlYW4gZG9uZTsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBuZXN0ZWQKLQkgKiBpdGVyYXRvciBhbmQgYSBmaWx0ZXIgdGhhdCBzaW1wbHkgYWNjZXB0cyBldmVyeSBvYmplY3QuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlCi0JICogPGNvZGU+YWNjZXB0KE9iamVjdCk8L2NvZGU+IG1ldGhvZCBpbnN0ZWFkIG9mIGJ1aWxkaW5nCi0JICogYSA8Y29kZT5GaWx0ZXI8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBGaWx0ZXJpbmdJdGVyYXRvcihJdGVyYXRvcjw/PiBuZXN0ZWRJdGVyYXRvcikgewotCQl0aGlzKG5lc3RlZEl0ZXJhdG9yLCBGaWx0ZXIuTnVsbC5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIG5lc3RlZAotCSAqIGl0ZXJhdG9yIGFuZCBmaWx0ZXIuCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIEZpbHRlcmluZ0l0ZXJhdG9yKEl0ZXJhdG9yPD8+IG5lc3RlZEl0ZXJhdG9yLCBGaWx0ZXIgZmlsdGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMubmVzdGVkSXRlcmF0b3IgPSBuZXN0ZWRJdGVyYXRvcjsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JCXRoaXMubG9hZE5leHQoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQlyZXR1cm4gISB0aGlzLmRvbmU7Ci0JfQotCi0JcHVibGljIEUgbmV4dCgpIHsKLQkJaWYgKHRoaXMuZG9uZSkgewotCQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCQlFIHJlc3VsdCA9IHRoaXMubmV4dDsKLQkJdGhpcy5sb2FkTmV4dCgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEJlY2F1c2Ugd2UgbmVlZCB0byBwcmUtbG9hZCB0aGUgbmV4dCBlbGVtZW50Ci0JICogdG8gYmUgcmV0dXJuZWQsIHdlIGNhbm5vdCBzdXBwb3J0IHRoZSA8Y29kZT5yZW1vdmUoKTwvY29kZT4KLQkgKiBtZXRob2QuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkIG5leHQgd2l0aCB0aGUgbmV4dCB2YWxpZCBlbnRyeSBmcm9tIHRoZSBuZXN0ZWQKLQkgKiBpdGVyYXRvci4gSWYgdGhlcmUgYXJlIG5vbmUsIG5leHQgaXMgc2V0IHRvIDxjb2RlPkVORDwvY29kZT4uCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSB2b2lkIGxvYWROZXh0KCkgewotCQl0aGlzLmRvbmUgPSB0cnVlOwotCQl3aGlsZSAodGhpcy5uZXN0ZWRJdGVyYXRvci5oYXNOZXh0KCkgJiYgKHRoaXMuZG9uZSkpIHsKLQkJCU9iamVjdCBvID0gdGhpcy5uZXN0ZWRJdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAodGhpcy5hY2NlcHQobykpIHsKLQkJCQkvLyBhc3N1bWUgdGhhdCBpZiB0aGUgb2JqZWN0IHdhcyBhY2NlcHRlZCBpdCBpcyBvZiB0eXBlIEUKLQkJCQl0aGlzLm5leHQgPSAoRSkgbzsKLQkJCQl0aGlzLmRvbmUgPSBmYWxzZTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5uZXh0ID0gbnVsbDsKLQkJCQl0aGlzLmRvbmUgPSB0cnVlOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIDxjb2RlPkZpbHRlcmluZ0l0ZXJhdG9yPC9jb2RlPgotCSAqIHNob3VsZCByZXR1cm4gdGhlIHNwZWNpZmllZCBuZXh0IGVsZW1lbnQgZnJvbSBhIGNhbGwgdG8gdGhlCi0JICogPGNvZGU+bmV4dCgpPC9jb2RlPiBtZXRob2QuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gYnkgYSBzdWJjbGFzcyBhcyBhbgotCSAqIGFsdGVybmF0aXZlIHRvIGJ1aWxkaW5nIGEgPGNvZGU+RmlsdGVyPC9jb2RlPi4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIHRoaXMuZmlsdGVyLmFjY2VwdChvKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLm5lc3RlZEl0ZXJhdG9yKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvR3JhcGhJdGVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9HcmFwaEl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NDJjZjEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9HcmFwaEl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBBIDxjb2RlPkdyYXBoSXRlcmF0b3I8L2NvZGU+IGlzIHNpbWlsYXIgdG8gYSA8Y29kZT5UcmVlSXRlcmF0b3I8L2NvZGU+Ci0gKiBleGNlcHQgdGhhdCBpdCBjYW5ub3QgYmUgYXNzdW1lZCB0aGF0IGFsbCBub2RlcyBhc3N1bWUgYSBzdHJpY3QgdHJlZQotICogc3RydWN0dXJlLiAgRm9yIGluc3RhbmNlLCBpbiBhIHRyZWUsIGEgbm9kZSBjYW5ub3QgYmUgYSBkZXNjZW5kZW50IG9mCi0gKiBpdHNlbGYsIGJ1dCBhIGdyYXBoIG1heSBoYXZlIGEgY3ljbGljYWwgc3RydWN0dXJlLgotICogCi0gKiBBIDxjb2RlPkdyYXBoSXRlcmF0b3I8L2NvZGU+IHNpbXBsaWZpZXMgdGhlIHRyYXZlcnNhbCBvZiBhCi0gKiBncmFwaCBvZiBvYmplY3RzLCB3aGVyZSB0aGUgb2JqZWN0cycgcHJvdG9jb2wocykgcHJvdmlkZXMKLSAqIGEgbWV0aG9kIGZvciBnZXR0aW5nIHRoZSBuZXh0IGNvbGxlY3Rpb24gb2Ygbm9kZXMgaW4gdGhlIGdyYXBoLAotICogKG9yICpuZWlnaGJvcnMqKSwgYnV0IGRvZXMgbm90IHByb3ZpZGUgYSBtZXRob2QgZm9yIGdldHRpbmcgKmFsbCogCi0gKiBvZiB0aGUgbm9kZXMgaW4gdGhlIGdyYXBoLgotICogKGUuZy4gYSBuZWlnaGJvciBjYW4gcmV0dXJuIGhpcyBuZWlnaGJvcnMsIGFuZCB0aG9zZSBuZWlnaGJvcnMKLSAqIGNhbiByZXR1cm4gdGhlaXIgbmVpZ2hib3JzLCB3aGljaCBtaWdodCBhbHNvIGluY2x1ZGUgdGhlIG9yaWdpbmFsCi0gKiBuZWlnaGJvciwgYnV0IHlvdSBvbmx5IHdhbnQgdG8gdmlzaXQgdGhlIG9yaWdpbmFsIG5laWdoYm9yIG9uY2UuKQotICogPHA+Ci0gKiBJZiBhIG5laWdoYm9yIGhhcyBhbHJlYWR5IGJlZW4gdmlzaXRlZCAoZGV0ZXJtaW5lZCBieSB1c2luZyAKLSAqIDxjb2RlPmVxdWFscyhPYmplY3QpPC9jb2RlPiksIHRoYXQgbmVpZ2hib3IgaXMgbm90IHZpc2l0ZWQgYWdhaW4sCi0gKiBub3IgYXJlIHRoZSBuZWlnaGJvcnMgb2YgdGhhdCBvYmplY3QuCi0gKiA8cD4KLSAqIEl0IGlzIHVwIHRvIHRoZSB1c2VyIG9mIHRoaXMgY2xhc3MgdG8gZW5zdXJlIGEgKmNvbXBsZXRlKiBncmFwaC4KLSAqIDxwPgotICogVG8gdXNlLCBzdXBwbHk6PHVsPgotICogPGxpPiBlaXRoZXIgdGhlIGluaXRpYWwgbm9kZSBvZiB0aGUgZ3JhcGggb3IgYW4gSXRlcmF0b3Igb3ZlciBhbgotICogaW5pdGlhbCBjb2xsZWN0aW9uIG9mIGdyYXBoIG5vZGVzCi0gKiA8bGk+IGEgPGNvZGU+TWlzdGVyUm9nZXJzPC9jb2RlPiB0aGF0IHRlbGxzIHdobyB0aGUgbmVpZ2hib3JzIGFyZQotICogb2YgZWFjaCBub2RlCi0gKiAoYWx0ZXJuYXRpdmVseSwgc3ViY2xhc3MgPGNvZGU+R3JhcGhJdGVyYXRvcjwvY29kZT4KLSAqIGFuZCBvdmVycmlkZSB0aGUgPGNvZGU+bmVpZ2hib3JzKE9iamVjdCk8L2NvZGU+IG1ldGhvZCkKLSAqIDwvdWw+Ci0gKiA8cD4KLSAqIDxjb2RlPnJlbW92ZSgpPC9jb2RlPiBpcyBub3Qgc3VwcG9ydGVkLiAgVGhpcyBtZXRob2QsIGlmIAotICogZGVzaXJlZCwgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSB0aGUgdXNlciBvZiB0aGlzIGNsYXNzLgotICovCi1wdWJsaWMgY2xhc3MgR3JhcGhJdGVyYXRvcjxFPgotCWltcGxlbWVudHMgSXRlcmF0b3I8RT4KLXsKLQlwcml2YXRlIGZpbmFsIENvbGxlY3Rpb248SXRlcmF0b3I8PyBleHRlbmRzIEU+PiBpdGVyYXRvcnM7Ci0JcHJpdmF0ZSBmaW5hbCBTZXQ8RT4gdmlzaXRlZE5laWdoYm9yczsKLQlwcml2YXRlIGZpbmFsIE1pc3RlclJvZ2VyczxFPiBtaXN0ZXJSb2dlcnM7Ci0JCi0JcHJpdmF0ZSBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gY3VycmVudEl0ZXJhdG9yOwotCQotCXByaXZhdGUgRSBuZXh0TmVpZ2hib3I7Ci0JcHJpdmF0ZSBib29sZWFuIGRvbmU7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiBvZiByb290cwotCSAqIGFuZCBhIG1pc3RlciByb2dlcnMgdGhhdCBzaW1wbHkgcmV0dXJucyBhbiBlbXB0eSBpdGVyYXRvcgotCSAqIGZvciBlYWNoIG9mIHRoZSByb290cy4KLQkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUKLQkgKiA8Y29kZT5jaGlsZHJlbihPYmplY3QpPC9jb2RlPiBtZXRob2QgaW5zdGVhZCBvZiBidWlsZGluZwotCSAqIGEgPGNvZGU+TWlzdGVyUm9nZXJzPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgR3JhcGhJdGVyYXRvcihFLi4uIHJvb3RzKSB7Ci0JCXRoaXMobmV3IEFycmF5SXRlcmF0b3I8RT4ocm9vdHMpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gb2Ygcm9vdHMKLQkgKiBhbmQgYSBtaXN0ZXIgcm9nZXJzIHRoYXQgc2ltcGx5IHJldHVybnMgYW4gZW1wdHkgaXRlcmF0b3IKLQkgKiBmb3IgZWFjaCBvZiB0aGUgcm9vdHMuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlCi0JICogPGNvZGU+Y2hpbGRyZW4oT2JqZWN0KTwvY29kZT4gbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcKLQkgKiBhIDxjb2RlPk1pc3RlclJvZ2VyczwvY29kZT4uCi0JICovCi0JcHVibGljIEdyYXBoSXRlcmF0b3IoSXRlcmF0b3I8PyBleHRlbmRzIEU+IHJvb3RzKSB7Ci0JCXRoaXMocm9vdHMsIE1pc3RlclJvZ2Vycy5OdWxsLjxFPmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgcm9vdAotCSAqIGFuZCBhIG1pc3RlciByb2dlcnMgdGhhdCBzaW1wbHkgcmV0dXJucyBhbiBlbXB0eSBpdGVyYXRvcgotCSAqIGZvciB0aGUgcm9vdC4KLQkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUKLQkgKiA8Y29kZT5jaGlsZHJlbihPYmplY3QpPC9jb2RlPiBtZXRob2QgaW5zdGVhZCBvZiBidWlsZGluZwotCSAqIGEgPGNvZGU+TWlzdGVyUm9nZXJzPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgR3JhcGhJdGVyYXRvcihFIHJvb3QpIHsKLQkJdGhpcyhyb290LCBNaXN0ZXJSb2dlcnMuTnVsbC48RT5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIHJvb3QKLQkgKiBhbmQgbWlzdGVyIHJvZ2Vycy4KLQkgKi8KLQlwdWJsaWMgR3JhcGhJdGVyYXRvcihFIHJvb3QsIE1pc3RlclJvZ2VyczxFPiBtaXN0ZXJSb2dlcnMpIHsKLQkJdGhpcyhuZXcgU2luZ2xlRWxlbWVudEl0ZXJhdG9yPEU+KHJvb3QpLCBtaXN0ZXJSb2dlcnMpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgcm9vdHMKLQkgKiBhbmQgbWlzdGVyIHJvZ2Vycy4KLQkgKi8KLQlwdWJsaWMgR3JhcGhJdGVyYXRvcihJdGVyYXRvcjw/IGV4dGVuZHMgRT4gcm9vdHMsIE1pc3RlclJvZ2VyczxFPiBtaXN0ZXJSb2dlcnMpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5jdXJyZW50SXRlcmF0b3IgPSByb290czsKLQkJLy8gdXNlIGEgTGlua2VkTGlzdCBzaW5jZSB3ZSB3aWxsIGJlIHB1bGxpbmcgb2ZmIHRoZSBmcm9udCBhbmQgYWRkaW5nIHRvIHRoZSBlbmQKLQkJdGhpcy5pdGVyYXRvcnMgPSBuZXcgTGlua2VkTGlzdDxJdGVyYXRvcjw/IGV4dGVuZHMgRT4+KCk7Ci0JCXRoaXMubWlzdGVyUm9nZXJzID0gbWlzdGVyUm9nZXJzOwotCQl0aGlzLnZpc2l0ZWROZWlnaGJvcnMgPSBuZXcgSGFzaFNldDxFPigpOwotCQl0aGlzLmxvYWROZXh0TmVpZ2hib3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkIG5leHQgbmVpZ2hib3Igd2l0aCB0aGUgbmV4dCBlbnRyeSBmcm9tIHRoZSBjdXJyZW50IGl0ZXJhdG9yLgotCSAqIElmIHRoZSBjdXJyZW50IGl0ZXJhdG9yIGhhcyBub25lLCBsb2FkIHRoZSBuZXh0IGl0ZXJhdG9yLgotCSAqIElmIHRoZXJlIGFyZSBubyBtb3JlLCB0aGUgJ2RvbmUnIGZsYWcgaXMgc2V0LgotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkTmV4dE5laWdoYm9yKCkgewotCQlpZiAodGhpcy5jdXJyZW50SXRlcmF0b3IgPT0gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpKSB7Ci0JCQl0aGlzLmRvbmUgPSB0cnVlOwotCQl9Ci0JCWVsc2UgaWYgKHRoaXMuY3VycmVudEl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJRSBuZXh0UG9zc2libGVOZWlnaGJvciA9IHRoaXMuY3VycmVudEl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmICh0aGlzLnZpc2l0ZWROZWlnaGJvcnMuY29udGFpbnMobmV4dFBvc3NpYmxlTmVpZ2hib3IpKSB7Ci0JCQkJdGhpcy5sb2FkTmV4dE5laWdoYm9yKCk7ICAvLyByZWN1cnNlCi0JCQl9IGVsc2UgewotCQkJCXRoaXMubmV4dE5laWdoYm9yID0gbmV4dFBvc3NpYmxlTmVpZ2hib3I7Ci0JCQkJdGhpcy52aXNpdGVkTmVpZ2hib3JzLmFkZChuZXh0UG9zc2libGVOZWlnaGJvcik7Ci0JCQkJdGhpcy5pdGVyYXRvcnMuYWRkKHRoaXMubmVpZ2hib3JzKG5leHRQb3NzaWJsZU5laWdoYm9yKSk7Ci0JCQl9Ci0JCX0gCi0JCWVsc2UgewotCQkJZm9yIChJdGVyYXRvcjw/IGV4dGVuZHMgSXRlcmF0b3I8PyBleHRlbmRzIEU+PiBzdHJlYW0gPSB0aGlzLml0ZXJhdG9ycy5pdGVyYXRvcigpOyAhIHRoaXMuY3VycmVudEl0ZXJhdG9yLmhhc05leHQoKSAmJiBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCQl0aGlzLmN1cnJlbnRJdGVyYXRvciA9IHN0cmVhbS5uZXh0KCk7Ci0JCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJfQotCQkJaWYgKCAhIHRoaXMuY3VycmVudEl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCXRoaXMuY3VycmVudEl0ZXJhdG9yID0gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCQkJfQotCQkJdGhpcy5sb2FkTmV4dE5laWdoYm9yKCk7ICAvLyByZWN1cnNlCi0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQlyZXR1cm4gISB0aGlzLmRvbmU7Ci0JfQotCi0JcHVibGljIEUgbmV4dCgpIHsKLQkJaWYgKHRoaXMuZG9uZSkgewotCQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCQlFIG5leHQgPSB0aGlzLm5leHROZWlnaGJvcjsKLQkJdGhpcy5sb2FkTmV4dE5laWdoYm9yKCk7Ci0JCXJldHVybiBuZXh0OwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbW1lZGlhdGUgbmVpZ2hib3JzIG9mIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gbmVpZ2hib3JzKEUgbmV4dCkgewotCQlyZXR1cm4gdGhpcy5taXN0ZXJSb2dlcnMubmVpZ2hib3JzKG5leHQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuY3VycmVudEl0ZXJhdG9yKTsKLQl9Ci0JCi0JCi0JLy8qKioqKioqKioqIGlubmVyIGNsYXNzZXMgKioqKioqKioqKgotCQotCS8qKgotCSAqIFVzZWQgYnkgPGNvZGU+R3JhcGhJdGVyYXRvcjwvY29kZT4gdG8gcmV0cmlldmUKLQkgKiB0aGUgaW1tZWRpYXRlIG5laWdoYm9ycyBvZiBhIG5vZGUgaW4gdGhlIGdyYXBoLgotCSAqICJUaGVzZSBhcmUgdGhlIHBlb3BsZSBpbiB5b3VyIG5laWdoYm9yaG9vZC4uLiIKLQkgKi8KLQlwdWJsaWMgaW50ZXJmYWNlIE1pc3RlclJvZ2VyczxUPiB7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgaW1tZWRpYXRlIG5laWdoYm9ycyBvZiB0aGUgc3BlY2lmaWVkIG9iamVjdC4KLQkJICovCi0JCUl0ZXJhdG9yPD8gZXh0ZW5kcyBUPiBuZWlnaGJvcnMoVCBuZXh0KTsKLQkJCi0JCQotCQlmaW5hbCBjbGFzcyBOdWxsPFM+IGltcGxlbWVudHMgTWlzdGVyUm9nZXJzPFM+IHsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBNaXN0ZXJSb2dlcnMgSU5TVEFOQ0UgPSBuZXcgTnVsbCgpOwotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlwdWJsaWMgc3RhdGljIDxSPiBNaXN0ZXJSb2dlcnM8Uj4gaW5zdGFuY2UoKSB7Ci0JCQkJcmV0dXJuIElOU1RBTkNFOwotCQkJfQotCQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQkJcHJpdmF0ZSBOdWxsKCkgewotCQkJCXN1cGVyKCk7Ci0JCQl9Ci0JCQkvLyByZXR1cm4gbm8gbmVpZ2hib3JzCi0JCQlwdWJsaWMgSXRlcmF0b3I8Uz4gbmVpZ2hib3JzKFMgbmV4dCkgewotCQkJCXJldHVybiBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJHcmFwaEl0ZXJhdG9yLk1pc3RlclJvZ2Vycy5OdWxsIjsKLQkJCX0KLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0l0ZXJhdG9yRW51bWVyYXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvSXRlcmF0b3JFbnVtZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWE0ZjA4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvSXRlcmF0b3JFbnVtZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIEFuIDxjb2RlPkl0ZXJhdG9yRW51bWVyYXRpb248L2NvZGU+IHdyYXBzIGFuCi0gKiA8Y29kZT5JdGVyYXRvcjwvY29kZT4gc28gdGhhdCBpdCBjYW4gYmUgdHJlYXRlZCBsaWtlIGFuCi0gKiA8Y29kZT5FbnVtZXJhdGlvbjwvY29kZT4uCi0gKi8KLXB1YmxpYyBjbGFzcyBJdGVyYXRvckVudW1lcmF0aW9uPEU+Ci0JaW1wbGVtZW50cyBFbnVtZXJhdGlvbjxFPgotewotCXByaXZhdGUgZmluYWwgSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yOwotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGVudW1lcmF0aW9uIHRoYXQgd3JhcHMgdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3JFbnVtZXJhdGlvbihJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5pdGVyYXRvciA9IGl0ZXJhdG9yOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc01vcmVFbGVtZW50cygpIHsKLQkJcmV0dXJuIHRoaXMuaXRlcmF0b3IuaGFzTmV4dCgpOwotCX0KLQotCXB1YmxpYyBFIG5leHRFbGVtZW50KCkgewotCQlyZXR1cm4gdGhpcy5pdGVyYXRvci5uZXh0KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5pdGVyYXRvcik7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9QZWVrYWJsZUl0ZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1BlZWthYmxlSXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE2YWVkYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1BlZWthYmxlSXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBBIDxjb2RlPlBlZWthYmxlSXRlcmF0b3I8L2NvZGU+IHdyYXBzIGFub3RoZXIgPGNvZGU+SXRlcmF0b3I8L2NvZGU+Ci0gKiBhbmQgYWxsb3dzIGEgPGNvZGU+cGVlaygpPC9jb2RlPiBhdCB0aGUgbmV4dCBlbGVtZW50IHRvIGJlIAotICogcmV0dXJuZWQgYnkgPGNvZGU+bmV4dCgpPC9jb2RlPi4KLSAqIDxwPgotICogT25lLCBwb3NzaWJseSB1bmRlc2lyYWJsZSwgc2lkZS1lZmZlY3Qgb2YgdXNpbmcgdGhpcyBpdGVyYXRvciBpcyB0aGF0Ci0gKiB0aGUgbmVzdGVkIGl0ZXJhdG9yJ3MgPGNvZGU+bmV4dCgpPC9jb2RlPiBtZXRob2Qgd2lsbCBiZSBpbnZva2VkCi0gKiA8ZW0+YmVmb3JlPC9lbT4gdGhlIHBlZWthYmxlIGl0ZXJhdG9yJ3MgPGNvZGU+bmV4dCgpPC9jb2RlPgotICogbWV0aG9kIGlzIGludm9rZWQuIFRoaXMgaXMgYmVjYXVzZSB0aGUgIm5leHQiIGVsZW1lbnQgbXVzdCBiZQotICogcHJlLWxvYWRlZCBmb3IgdGhlIDxjb2RlPnBlZWsoKTwvY29kZT4gbWV0aG9kLgotICogVGhpcyBhbHNvIHByZXZlbnRzIGEgcGVla2FibGUgaXRlcmF0b3IgZnJvbSBzdXBwb3J0aW5nIHRoZSBvcHRpb25hbAotICogPGNvZGU+cmVtb3ZlKCk8L2NvZGU+IG1ldGhvZC4KLSAqLwotCi1wdWJsaWMgY2xhc3MgUGVla2FibGVJdGVyYXRvcjxFPgotCWltcGxlbWVudHMgSXRlcmF0b3I8RT4KLXsKLQlwcml2YXRlIGZpbmFsIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBuZXN0ZWRJdGVyYXRvcjsKLQlwcml2YXRlIEUgbmV4dDsKLQlwcml2YXRlIGJvb2xlYW4gZG9uZTsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcGVla2FibGUgaXRlcmF0b3IgdGhhdCB3cmFwcyB0aGUgc3BlY2lmaWVkIG5lc3RlZAotCSAqIGl0ZXJhdG9yLgotCSAqLwotCXB1YmxpYyBQZWVrYWJsZUl0ZXJhdG9yKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBuZXN0ZWRJdGVyYXRvcikgewotCQlzdXBlcigpOwotCQl0aGlzLm5lc3RlZEl0ZXJhdG9yID0gbmVzdGVkSXRlcmF0b3I7Ci0JCXRoaXMuZG9uZSA9IGZhbHNlOwotCQl0aGlzLmxvYWROZXh0KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJcmV0dXJuICEgdGhpcy5kb25lOwotCX0KLQotCXB1YmxpYyBFIG5leHQoKSB7Ci0JCWlmICh0aGlzLmRvbmUpIHsKLQkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQkJRSByZXN1bHQgPSB0aGlzLm5leHQ7Ci0JCXRoaXMubG9hZE5leHQoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGVsZW1lbnQgdGhhdCB3aWxsIGJlIHJldHVybmVkIGJ5IHRoZSBuZXh0IGNhbGwgdG8gdGhlCi0JICogPGNvZGU+bmV4dCgpPC9jb2RlPiBtZXRob2QsIHdpdGhvdXQgYWR2YW5jaW5nIHBhc3QgaXQuCi0JICovCi0JcHVibGljIEUgcGVlaygpIHsKLQkJaWYgKHRoaXMuZG9uZSkgewotCQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5uZXh0OwotCX0KLQotCS8qKgotCSAqIEJlY2F1c2Ugd2UgbmVlZCB0byBwcmUtbG9hZCB0aGUgbmV4dCBlbGVtZW50Ci0JICogdG8gYmUgcmV0dXJuZWQsIHdlIGNhbm5vdCBzdXBwb3J0IHRoZSA8Y29kZT5yZW1vdmUoKTwvY29kZT4KLQkgKiBtZXRob2QuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkIG5leHQgd2l0aCB0aGUgbmV4dCBlbnRyeSBmcm9tIHRoZSBuZXN0ZWQKLQkgKiBpdGVyYXRvci4gSWYgdGhlcmUgYXJlIG5vbmUsIG5leHQgaXMgc2V0IHRvIDxjb2RlPkVORDwvY29kZT4uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWROZXh0KCkgewotCQlpZiAodGhpcy5uZXN0ZWRJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCXRoaXMubmV4dCA9IHRoaXMubmVzdGVkSXRlcmF0b3IubmV4dCgpOwotCQl9IGVsc2UgewotCQkJdGhpcy5uZXh0ID0gbnVsbDsKLQkJCXRoaXMuZG9uZSA9IHRydWU7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLm5lc3RlZEl0ZXJhdG9yKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvUmVhZE9ubHlJdGVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9SZWFkT25seUl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmMGE1MTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9SZWFkT25seUl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBBIDxjb2RlPlJlYWRPbmx5SXRlcmF0b3I8L2NvZGU+IHdyYXBzIGFub3RoZXIgPGNvZGU+SXRlcmF0b3I8L2NvZGU+Ci0gKiBhbmQgcmVtb3ZlcyBzdXBwb3J0IGZvciAjcmVtb3ZlKCkuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWFkT25seUl0ZXJhdG9yPEU+Ci0JaW1wbGVtZW50cyBJdGVyYXRvcjxFPgotewotCXByaXZhdGUgZmluYWwgSXRlcmF0b3I8PyBleHRlbmRzIEU+IG5lc3RlZEl0ZXJhdG9yOwotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIG9uIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiB0aGF0Ci0JICogZGlzYWxsb3dzIHJlbW92ZXMuCi0JICovCi0JcHVibGljIFJlYWRPbmx5SXRlcmF0b3IoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gYykgewotCQl0aGlzKGMuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBuZXN0ZWQgaXRlcmF0b3IKLQkgKiBhbmQgZGlzYWxsb3cgcmVtb3Zlcy4KLQkgKi8KLQlwdWJsaWMgUmVhZE9ubHlJdGVyYXRvcihJdGVyYXRvcjw/IGV4dGVuZHMgRT4gbmVzdGVkSXRlcmF0b3IpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5uZXN0ZWRJdGVyYXRvciA9IG5lc3RlZEl0ZXJhdG9yOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCS8vIGRlbGVnYXRlIHRvIHRoZSBuZXN0ZWQgaXRlcmF0b3IKLQkJcmV0dXJuIHRoaXMubmVzdGVkSXRlcmF0b3IuaGFzTmV4dCgpOwotCX0KLQotCXB1YmxpYyBFIG5leHQoKSB7Ci0JCS8vIGRlbGVnYXRlIHRvIHRoZSBuZXN0ZWQgaXRlcmF0b3IKLQkJcmV0dXJuIHRoaXMubmVzdGVkSXRlcmF0b3IubmV4dCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5uZXN0ZWRJdGVyYXRvcik7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9SZWFkT25seUxpc3RJdGVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9SZWFkT25seUxpc3RJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2IyNTkxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvUmVhZE9ubHlMaXN0SXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBBIDxjb2RlPlJlYWRPbmx5TGlzdEl0ZXJhdG9yPC9jb2RlPiB3cmFwcyBhbm90aGVyCi0gKiA8Y29kZT5MaXN0SXRlcmF0b3I8L2NvZGU+IGFuZCByZW1vdmVzIHN1cHBvcnQgZm9yOgotICogCSNyZW1vdmUoKQotICogCSNzZXQoT2JqZWN0KQotICogCSNhZGQoT2JqZWN0KQotICovCi1wdWJsaWMgY2xhc3MgUmVhZE9ubHlMaXN0SXRlcmF0b3I8RT4KLQlpbXBsZW1lbnRzIExpc3RJdGVyYXRvcjxFPgotewotCXByaXZhdGUgZmluYWwgTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBuZXN0ZWRMaXN0SXRlcmF0b3I7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciBvbiB0aGUgc3BlY2lmaWVkIGxpc3QgdGhhdAotCSAqIGRpc2FsbG93cyByZW1vdmVzLCBzZXRzLCBhbmQgYWRkcy4KLQkgKi8KLQlwdWJsaWMgUmVhZE9ubHlMaXN0SXRlcmF0b3IoTGlzdDw/IGV4dGVuZHMgRT4gbGlzdCkgewotCQl0aGlzKGxpc3QubGlzdEl0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciBvbiB0aGUgc3BlY2lmaWVkIGxpc3QgaXRlcmF0b3IgdGhhdAotCSAqIGRpc2FsbG93cyByZW1vdmVzLCBzZXRzLCBhbmQgYWRkcy4KLQkgKi8KLQlwdWJsaWMgUmVhZE9ubHlMaXN0SXRlcmF0b3IoTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBuZXN0ZWRMaXN0SXRlcmF0b3IpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5uZXN0ZWRMaXN0SXRlcmF0b3IgPSBuZXN0ZWRMaXN0SXRlcmF0b3I7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJLy8gZGVsZWdhdGUgdG8gdGhlIG5lc3RlZCBpdGVyYXRvcgotCQlyZXR1cm4gdGhpcy5uZXN0ZWRMaXN0SXRlcmF0b3IuaGFzTmV4dCgpOwotCX0KLQotCXB1YmxpYyBFIG5leHQoKSB7Ci0JCS8vIGRlbGVnYXRlIHRvIHRoZSBuZXN0ZWQgaXRlcmF0b3IKLQkJcmV0dXJuIHRoaXMubmVzdGVkTGlzdEl0ZXJhdG9yLm5leHQoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNQcmV2aW91cygpIHsKLQkJLy8gZGVsZWdhdGUgdG8gdGhlIG5lc3RlZCBpdGVyYXRvcgotCQlyZXR1cm4gdGhpcy5uZXN0ZWRMaXN0SXRlcmF0b3IuaGFzUHJldmlvdXMoKTsKLQl9Ci0KLQlwdWJsaWMgRSBwcmV2aW91cygpIHsKLQkJLy8gZGVsZWdhdGUgdG8gdGhlIG5lc3RlZCBpdGVyYXRvcgotCQlyZXR1cm4gdGhpcy5uZXN0ZWRMaXN0SXRlcmF0b3IucHJldmlvdXMoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IG5leHRJbmRleCgpIHsKLQkJLy8gZGVsZWdhdGUgdG8gdGhlIG5lc3RlZCBpdGVyYXRvcgotCQlyZXR1cm4gdGhpcy5uZXN0ZWRMaXN0SXRlcmF0b3IubmV4dEluZGV4KCk7Ci0JfQotCi0JcHVibGljIGludCBwcmV2aW91c0luZGV4KCkgewotCQkvLyBkZWxlZ2F0ZSB0byB0aGUgbmVzdGVkIGl0ZXJhdG9yCi0JCXJldHVybiB0aGlzLm5lc3RlZExpc3RJdGVyYXRvci5wcmV2aW91c0luZGV4KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXQoRSBvKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZChFIG8pIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5uZXN0ZWRMaXN0SXRlcmF0b3IpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvUmVzdWx0U2V0SXRlcmF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvUmVzdWx0U2V0SXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThkYTg0NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1Jlc3VsdFNldEl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnNxbC5SZXN1bHRTZXQ7Ci1pbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBBIDxjb2RlPlJlc3VsdFNldEl0ZXJhdG9yPC9jb2RlPiB3cmFwcyBhIDxjb2RlPlJlc3VsdFNldDwvY29kZT4KLSAqIGFuZCB0cmFuc2Zvcm1zIGl0cyByb3dzIGZvciBjbGllbnQgY29uc3VtcHRpb24uIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlCi0gKiA8Y29kZT4jYnVpbGROZXh0KFJlc3VsdFNldCk8L2NvZGU+IHRvIGJ1aWxkIHRoZSBleHBlY3RlZCBvYmplY3QgZnJvbQotICogdGhlIGN1cnJlbnQgcm93IG9mIHRoZSByZXN1bHQgc2V0LgotICogPHA+Ci0gKiBUbyB1c2UsIHN1cHBseTo8dWw+Ci0gKiA8bGk+IGEgPGNvZGU+UmVzdWx0U2V0PC9jb2RlPgotICogPGxpPiBhbiA8Y29kZT5BZGFwdGVyPC9jb2RlPiB0aGF0IGNvbnZlcnRzIGEgcm93IGluIHRoZSA8Y29kZT5SZXN1bHRTZXQ8L2NvZGU+Ci0gKiBpbnRvIHRoZSBkZXNpcmVkIG9iamVjdAotICogKGFsdGVybmF0aXZlbHksIHN1YmNsYXNzIDxjb2RlPlJlc3VsdFNldEl0ZXJhdG9yPC9jb2RlPgotICogYW5kIG92ZXJyaWRlIHRoZSA8Y29kZT5idWlsZE5leHQoUmVzdWx0U2V0KTwvY29kZT4gbWV0aG9kKQotICogPC91bD4KLSAqIDxwPgotICovCi1wdWJsaWMgY2xhc3MgUmVzdWx0U2V0SXRlcmF0b3I8RT4KLQlpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBSZXN1bHRTZXQgcmVzdWx0U2V0OwotCXByaXZhdGUgZmluYWwgQWRhcHRlcjxFPiBhZGFwdGVyOwotCXByaXZhdGUgRSBuZXh0OwotCXByaXZhdGUgYm9vbGVhbiBkb25lOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igb24gdGhlIHNwZWNpZmllZCByZXN1bHQgc2V0IHRoYXQgcmV0dXJucwotCSAqIHRoZSBvYmplY3RzIHByb2R1Y2VkIGJ5IHRoZSBzcGVjaWZpZWQgYWRhcHRlci4KLQkgKi8KLQlwdWJsaWMgUmVzdWx0U2V0SXRlcmF0b3IoUmVzdWx0U2V0IHJlc3VsdFNldCwgQWRhcHRlcjxFPiBhZGFwdGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucmVzdWx0U2V0ID0gcmVzdWx0U2V0OwotCQl0aGlzLmFkYXB0ZXIgPSBhZGFwdGVyOwotCQl0aGlzLmRvbmUgPSBmYWxzZTsKLQkJdGhpcy5uZXh0ID0gdGhpcy5idWlsZE5leHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igb24gdGhlIHNwZWNpZmllZCByZXN1bHQgc2V0IHRoYXQgcmV0dXJucwotCSAqIHRoZSBmaXJzdCBvYmplY3QgaW4gZWFjaCByb3cgb2YgdGhlIHJlc3VsdCBzZXQuCi0JICovCi0JcHVibGljIFJlc3VsdFNldEl0ZXJhdG9yKFJlc3VsdFNldCByZXN1bHRTZXQpIHsKLQkJdGhpcyhyZXN1bHRTZXQsIEFkYXB0ZXIuRGVmYXVsdC48RT5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBCdWlsZCB0aGUgbmV4dCBvYmplY3QgZm9yIHRoZSBpdGVyYXRvciB0byByZXR1cm4uCi0JICogQ2xvc2UgdGhlIHJlc3VsdCBzZXQgd2hlbiB3ZSByZWFjaCB0aGUgZW5kLgotCSAqLwotCXByaXZhdGUgRSBidWlsZE5leHQoKSB7Ci0JCXRyeSB7Ci0JCQlpZiAodGhpcy5yZXN1bHRTZXQubmV4dCgpKSB7Ci0JCQkJcmV0dXJuIHRoaXMuYnVpbGROZXh0KHRoaXMucmVzdWx0U2V0KTsKLQkJCX0KLQkJCXRoaXMucmVzdWx0U2V0LmNsb3NlKCk7Ci0JCQl0aGlzLmRvbmUgPSB0cnVlOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQnkgZGVmYXVsdCwgcmV0dXJuIHRoZSBmaXJzdCBvYmplY3QgaW4gdGhlIGN1cnJlbnQgcm93Ci0JICogb2YgdGhlIHJlc3VsdCBzZXQuIEFueSA8Y29kZT5TUUxFeGNlcHRpb248L2NvZGU+cyB3aWxsCi0JICogYmUgY2F1Z2h0IGFuZCB3cmFwcGVkIGluIGEgPGNvZGU+UnVudGltZUV4Y2VwdGlvbjwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIEUgYnVpbGROZXh0KFJlc3VsdFNldCBycykgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmFkYXB0ZXIuYnVpbGROZXh0KHJzKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQlyZXR1cm4gISB0aGlzLmRvbmU7Ci0JfQotCi0JcHVibGljIEUgbmV4dCgpIHsKLQkJaWYgKHRoaXMuZG9uZSkgewotCQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCQlFIHRlbXAgPSB0aGlzLm5leHQ7Ci0JCXRoaXMubmV4dCA9IHRoaXMuYnVpbGROZXh0KCk7Ci0JCXJldHVybiB0ZW1wOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5yZXN1bHRTZXQpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcmZhY2UgKioqKioqKioqKgotCi0JLyoqCi0JICogVXNlZCBieSA8Y29kZT5SZXN1bHRTZXRJdGVyYXRvcjwvY29kZT4gdG8gY29udmVydCBhCi0JICogPGNvZGU+UmVzdWx0U2V0PC9jb2RlPidzIGN1cnJlbnQgcm93IGludG8gdGhlIG5leHQgb2JqZWN0Ci0JICogdG8gYmUgcmV0dXJuZWQgYnkgdGhlIDxjb2RlPkl0ZXJhdG9yPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgaW50ZXJmYWNlIEFkYXB0ZXI8VD4gewotCi0JCS8qKgotCQkgKiBSZXR1cm4gYW4gb2JqZWN0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJlc3VsdCBzZXQncwotCQkgKiAiY3VycmVudCIgcm93LiBBbnkgPGNvZGU+U1FMRXhjZXB0aW9uPC9jb2RlPnMgd2lsbAotCQkgKiBiZSBjYXVnaHQgYW5kIHdyYXBwZWQgaW4gYSA8Y29kZT5SdW50aW1lRXhjZXB0aW9uPC9jb2RlPi4KLQkJICogQHNlZSBqYXZhLnNxbC5SZXN1bHRTZXQKLQkJICovCi0JCVQgYnVpbGROZXh0KFJlc3VsdFNldCBycykgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKLQotCi0JCWZpbmFsIGNsYXNzIERlZmF1bHQ8Uz4gaW1wbGVtZW50cyBBZGFwdGVyPFM+IHsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBBZGFwdGVyIElOU1RBTkNFID0gbmV3IERlZmF1bHQoKTsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJcHVibGljIHN0YXRpYyA8Uj4gQWRhcHRlcjxSPiBpbnN0YW5jZSgpIHsKLQkJCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCQl9Ci0JCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCQlwcml2YXRlIERlZmF1bHQoKSB7Ci0JCQkJc3VwZXIoKTsKLQkJCX0KLQkJCS8vIHJldHVybiB0aGUgZmlyc3Qgb2JqZWN0IGluIHRoZSBjdXJyZW50IHJvdyBvZiB0aGUgcmVzdWx0IHNldAotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlwdWJsaWMgUyBidWlsZE5leHQoUmVzdWx0U2V0IHJzKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLQkJCQkvLyByZXN1bHQgc2V0IGNvbHVtbnMgYXJlIGluZGV4ZWQgc3RhcnRpbmcgd2l0aCAxCi0JCQkJcmV0dXJuIChTKSBycy5nZXRPYmplY3QoMSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJSZXN1bHRTZXRJdGVyYXRvci5BZGFwdGVyLkRlZmF1bHQiOwotCQkJfQotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvU2luZ2xlRWxlbWVudEl0ZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1NpbmdsZUVsZW1lbnRJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWZkOWQ4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvU2luZ2xlRWxlbWVudEl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBBIDxjb2RlPlNpbmdsZUVsZW1lbnRJdGVyYXRvcjwvY29kZT4gaG9sZHMgYSBzaW5nbGUgZWxlbWVudAotICogYW5kIHJldHVybnMgaXQgd2l0aCB0aGUgZmlyc3QgY2FsbCB0byA8Y29kZT5uZXh0KCk8L2NvZGU+LCBhdAotICogd2hpY2ggcG9pbnQgaXQgd2lsbCByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIGFueSBzdWJzZXF1ZW50Ci0gKiBjYWxsIHRvIDxjb2RlPmhhc05leHQoKTwvY29kZT4uCi0gKiA8cD4KLSAqIEEgPGNvZGU+U2luZ2xlRWxlbWVudEl0ZXJhdG9yPC9jb2RlPiBpcyBlcXVpdmFsZW50IHRvIHRoZQotICogPGNvZGU+SXRlcmF0b3I8L2NvZGU+IHJldHVybmVkIGJ5OgotICogCTxjb2RlPmphdmEudXRpbC5Db2xsZWN0aW9ucy5zaW5nbGV0b24oZWxlbWVudCkuaXRlcmF0b3IoKTwvY29kZT4KLSAqLwotcHVibGljIGNsYXNzIFNpbmdsZUVsZW1lbnRJdGVyYXRvcjxFPgotCWltcGxlbWVudHMgSXRlcmF0b3I8RT4KLXsKLQlwcml2YXRlIGZpbmFsIEUgZWxlbWVudDsKLQlwcml2YXRlIGJvb2xlYW4gZG9uZTsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHRoYXQgcmV0dXJucyBvbmx5IHRoZSBzcGVjaWZpZWQgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgU2luZ2xlRWxlbWVudEl0ZXJhdG9yKEUgZWxlbWVudCkgewotCQlzdXBlcigpOwotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCQl0aGlzLmRvbmUgPSBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQlyZXR1cm4gISB0aGlzLmRvbmU7Ci0JfQotCi0JcHVibGljIEUgbmV4dCgpIHsKLQkJaWYgKHRoaXMuZG9uZSkgewotCQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmRvbmUgPSB0cnVlOwotCQlyZXR1cm4gdGhpcy5lbGVtZW50OwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5lbGVtZW50KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9TaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5OWNiNzIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9TaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogQSA8Y29kZT5TaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yPC9jb2RlPiBob2xkcyBhIHNpbmdsZSBlbGVtZW50Ci0gKiBhbmQgcmV0dXJucyBpdCB3aXRoIHRoZSBmaXJzdCBjYWxsIHRvIDxjb2RlPm5leHQoKTwvY29kZT4sIGF0Ci0gKiB3aGljaCBwb2ludCBpdCB3aWxsIHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gdG8gYW55IHN1YnNlcXVlbnQKLSAqIGNhbGwgdG8gPGNvZGU+aGFzTmV4dCgpPC9jb2RlPi4gTGlrZXdpc2UsIGl0IHdpbGwgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPgotICogdG8gYSBjYWxsIHRvIDxjb2RlPmhhc1ByZXZpb3VzKCk8L2NvZGU+IHVudGlsIGEgY2FsbCB0byA8Y29kZT5uZXh0KCk8L2NvZGU+LAotICogYXQgd2hpY2ggcG9pbnQgYSBjYWxsIHRvIDxjb2RlPnByZXZpb3VzKCk8L2NvZGU+IHdpbGwgcmV0dXJuIHRoZQotICogc2luZ2xlIGVsZW1lbnQuCi0gKiA8cD4KLSAqIEEgPGNvZGU+U2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcjwvY29kZT4gaXMgZXF1aXZhbGVudCB0byB0aGUKLSAqIDxjb2RlPkl0ZXJhdG9yPC9jb2RlPiByZXR1cm5lZCBieToKLSAqIAk8Y29kZT5qYXZhLnV0aWwuQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChlbGVtZW50KS5saXN0SXRlcmF0b3IoKTwvY29kZT4KLSAqLwotcHVibGljIGNsYXNzIFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I8RT4KLQlpbXBsZW1lbnRzIExpc3RJdGVyYXRvcjxFPgotewotCXByaXZhdGUgZmluYWwgRSBlbGVtZW50OwotCXByaXZhdGUgYm9vbGVhbiBoYXNOZXh0OwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhdG9yIHRoYXQgcmV0dXJucyBvbmx5IHRoZSBzcGVjaWZpZWQgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcihFIGVsZW1lbnQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQkJdGhpcy5oYXNOZXh0ID0gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQlyZXR1cm4gdGhpcy5oYXNOZXh0OwotCX0KLQotCXB1YmxpYyBFIG5leHQoKSB7Ci0JCWlmICh0aGlzLmhhc05leHQpIHsKLQkJCXRoaXMuaGFzTmV4dCA9IGZhbHNlOwotCQkJcmV0dXJuIHRoaXMuZWxlbWVudDsKLQkJfQotCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBpbnQgbmV4dEluZGV4KCkgewotCQlyZXR1cm4gdGhpcy5oYXNOZXh0ID8gMCA6IDE7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzUHJldmlvdXMoKSB7Ci0JCXJldHVybiAhIHRoaXMuaGFzTmV4dDsKLQl9Ci0KLQlwdWJsaWMgRSBwcmV2aW91cygpIHsKLQkJaWYgKHRoaXMuaGFzTmV4dCkgewotCQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmhhc05leHQgPSB0cnVlOwotCQlyZXR1cm4gdGhpcy5lbGVtZW50OwotCX0KLQotCXB1YmxpYyBpbnQgcHJldmlvdXNJbmRleCgpIHsKLQkJcmV0dXJuIHRoaXMuaGFzTmV4dCA/IC0xIDogMDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGQoRSBlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldChFIGUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmVsZW1lbnQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1RyYW5zZm9ybWF0aW9uSXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZmYjU5YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1RyYW5zZm9ybWF0aW9uSXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlRyYW5zZm9ybWVyOwotCi0KLS8qKgotICogQSA8Y29kZT5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPC9jb2RlPiB3cmFwcyBhbm90aGVyIDxjb2RlPkl0ZXJhdG9yPC9jb2RlPgotICogYW5kIHRyYW5zZm9ybXMgaXRzIHJlc3VsdHMgZm9yIGNsaWVudCBjb25zdW1wdGlvbi4gVG8gdXNlLCBzdXBwbHkgYSAKLSAqIDxjb2RlPlRyYW5zZm9ybWVyPC9jb2RlPiBvciBzdWJjbGFzcyA8Y29kZT5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPC9jb2RlPgotICogYW5kIG92ZXJyaWRlIHRoZSA8Y29kZT50cmFuc2Zvcm0oT2JqZWN0KTwvY29kZT4gbWV0aG9kLgotICogT2JqZWN0cyBvZiB0eXBlIEUxIGFyZSB0cmFuc2Zvcm1lZCBpbnRvIG9iamVjdHMgb2YgdHlwZSBFMjsKLSAqIGkuZS4gdGhlIGl0ZXJhdG9yIHJldHVybnMgb2JqZWN0cyBvZiB0eXBlIEUyLgotICovCi1wdWJsaWMgY2xhc3MgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxFMSwgRTI+Ci0JaW1wbGVtZW50cyBJdGVyYXRvcjxFMj4KLXsKLQlwcml2YXRlIGZpbmFsIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFMT4gbmVzdGVkSXRlcmF0b3I7Ci0JcHJpdmF0ZSBmaW5hbCBUcmFuc2Zvcm1lcjxFMSwgPyBleHRlbmRzIEUyPiB0cmFuc2Zvcm1lcjsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBuZXN0ZWQgaXRlcmF0b3IKLQkgKiBhbmQgYSB0cmFuc2Zvcm1lciB0aGF0IHNpbXBseSByZXR1cm5zIHRoZSBvYmplY3QsIHVuY2hhbmdlZC4KLQkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUKLQkgKiA8Y29kZT50cmFuc2Zvcm0oT2JqZWN0KTwvY29kZT4gbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcKLQkgKiBhIDxjb2RlPlRyYW5zZm9ybWVyPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgVHJhbnNmb3JtYXRpb25JdGVyYXRvcihJdGVyYXRvcjw/IGV4dGVuZHMgRTE+IG5lc3RlZEl0ZXJhdG9yKSB7Ci0JCXRoaXMobmVzdGVkSXRlcmF0b3IsIFRyYW5zZm9ybWVyLk51bGwuPEUxLCBFMj5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIG5lc3RlZCBpdGVyYXRvcgotCSAqIGFuZCB0cmFuc2Zvcm1lci4KLQkgKi8KLQlwdWJsaWMgVHJhbnNmb3JtYXRpb25JdGVyYXRvcihJdGVyYXRvcjw/IGV4dGVuZHMgRTE+IG5lc3RlZEl0ZXJhdG9yLCBUcmFuc2Zvcm1lcjxFMSwgPyBleHRlbmRzIEUyPiB0cmFuc2Zvcm1lcikgewotCQlzdXBlcigpOwotCQl0aGlzLm5lc3RlZEl0ZXJhdG9yID0gbmVzdGVkSXRlcmF0b3I7Ci0JCXRoaXMudHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lcjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkvLyBkZWxlZ2F0ZSB0byB0aGUgbmVzdGVkIGl0ZXJhdG9yCi0JCXJldHVybiB0aGlzLm5lc3RlZEl0ZXJhdG9yLmhhc05leHQoKTsKLQl9Ci0KLQlwdWJsaWMgRTIgbmV4dCgpIHsKLQkJLy8gdHJhbnNmb3JtIHRoZSBvYmplY3QgcmV0dXJuZWQgYnkgdGhlIG5lc3RlZCBpdGVyYXRvciBiZWZvcmUgcmV0dXJuaW5nIGl0Ci0JCXJldHVybiB0aGlzLnRyYW5zZm9ybSh0aGlzLm5lc3RlZEl0ZXJhdG9yLm5leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkvLyBkZWxlZ2F0ZSB0byB0aGUgbmVzdGVkIGl0ZXJhdG9yCi0JCXRoaXMubmVzdGVkSXRlcmF0b3IucmVtb3ZlKCk7Ci0JfQotCi0JLyoqCi0JICogVHJhbnNmb3JtIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKi8KLQlwcm90ZWN0ZWQgRTIgdHJhbnNmb3JtKEUxIG5leHQpIHsKLQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtZXIudHJhbnNmb3JtKG5leHQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMubmVzdGVkSXRlcmF0b3IpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9UcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9UcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjlmM2ZmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuVHJhbnNmb3JtZXI7Ci0KLS8qKgotICogQSA8Y29kZT5UcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcjwvY29kZT4gd3JhcHMgYW5vdGhlciA8Y29kZT5MaXN0SXRlcmF0b3I8L2NvZGU+Ci0gKiBhbmQgdHJhbnNmb3JtcyBpdCByZXN1bHRzIGZvciBjbGllbnQgY29uc3VtcHRpb24uIFRvIHVzZSwgc3VwcGx5IGEgCi0gKiA8Y29kZT5UcmFuc2Zvcm1lcjwvY29kZT4gb3Igc3ViY2xhc3MgPGNvZGU+VHJhbnNmb3JtYXRpb25JdGVyYXRvcjwvY29kZT4KLSAqIGFuZCBvdmVycmlkZSB0aGUgPGNvZGU+dHJhbnNmb3JtKE9iamVjdCk8L2NvZGU+IG1ldGhvZC4KLSAqIAotICogVGhlIG1ldGhvZHMgPGNvZGU+c2V0KE9iamVjdCk8L2NvZGU+IGFuZCA8Y29kZT5hZGQoT2JqZWN0KTwvY29kZT4KLSAqIGFyZSBsZWZ0IHVuc3VwcG9ydGVkIGluIHRoaXMgY2xhc3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcjxFMSwgRTI+Ci0JaW1wbGVtZW50cyBMaXN0SXRlcmF0b3I8RTI+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEUxPiBuZXN0ZWRJdGVyYXRvcjsKLQlwcml2YXRlIGZpbmFsIFRyYW5zZm9ybWVyPEUxLCA/IGV4dGVuZHMgRTI+IHRyYW5zZm9ybWVyOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIG5lc3RlZCBpdGVyYXRvcgotCSAqIGFuZCBhIHRyYW5zZm9ybWVyIHRoYXQgc2ltcGx5IHJldHVybnMgdGhlIG9iamVjdCwgdW5jaGFuZ2VkLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZQotCSAqIDxjb2RlPnRyYW5zZm9ybShPYmplY3QpPC9jb2RlPiBtZXRob2QgaW5zdGVhZCBvZiBidWlsZGluZwotCSAqIGEgPGNvZGU+VHJhbnNmb3JtZXI8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcihMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEUxPiBuZXN0ZWRJdGVyYXRvcikgewotCQl0aGlzKG5lc3RlZEl0ZXJhdG9yLCBUcmFuc2Zvcm1lci5OdWxsLjxFMSwgRTI+aW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBuZXN0ZWQgaXRlcmF0b3IKLQkgKiBhbmQgdHJhbnNmb3JtZXIuCi0JICovCi0JcHVibGljIFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yKExpc3RJdGVyYXRvcjw/IGV4dGVuZHMgRTE+IG5lc3RlZEl0ZXJhdG9yLCBUcmFuc2Zvcm1lcjxFMSwgPyBleHRlbmRzIEUyPiB0cmFuc2Zvcm1lcikgewotCQlzdXBlcigpOwotCQl0aGlzLm5lc3RlZEl0ZXJhdG9yID0gbmVzdGVkSXRlcmF0b3I7Ci0JCXRoaXMudHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lcjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkvLyBkZWxlZ2F0ZSB0byB0aGUgbmVzdGVkIGl0ZXJhdG9yCi0JCXJldHVybiB0aGlzLm5lc3RlZEl0ZXJhdG9yLmhhc05leHQoKTsKLQl9Ci0KLQlwdWJsaWMgRTIgbmV4dCgpIHsKLQkJLy8gdHJhbnNmb3JtIHRoZSBvYmplY3QgcmV0dXJuZWQgYnkgdGhlIG5lc3RlZCBpdGVyYXRvciBiZWZvcmUgcmV0dXJuaW5nIGl0Ci0JCXJldHVybiB0aGlzLnRyYW5zZm9ybSh0aGlzLm5lc3RlZEl0ZXJhdG9yLm5leHQoKSk7Ci0JfQotCi0JcHVibGljIGludCBuZXh0SW5kZXgoKSB7Ci0JCS8vIGRlbGVnYXRlIHRvIHRoZSBuZXN0ZWQgaXRlcmF0b3IKLQkJcmV0dXJuIHRoaXMubmVzdGVkSXRlcmF0b3IubmV4dEluZGV4KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzUHJldmlvdXMoKSB7Ci0JCS8vIGRlbGVnYXRlIHRvIHRoZSBuZXN0ZWQgaXRlcmF0b3IKLQkJcmV0dXJuIHRoaXMubmVzdGVkSXRlcmF0b3IuaGFzUHJldmlvdXMoKTsKLQl9Ci0KLQlwdWJsaWMgRTIgcHJldmlvdXMoKSB7Ci0JCS8vIHRyYW5zZm9ybSB0aGUgb2JqZWN0IHJldHVybmVkIGJ5IHRoZSBuZXN0ZWQgaXRlcmF0b3IgYmVmb3JlIHJldHVybmluZyBpdAotCQlyZXR1cm4gdGhpcy50cmFuc2Zvcm0odGhpcy5uZXN0ZWRJdGVyYXRvci5wcmV2aW91cygpKTsKLQl9Ci0KLQlwdWJsaWMgaW50IHByZXZpb3VzSW5kZXgoKSB7Ci0JCS8vIGRlbGVnYXRlIHRvIHRoZSBuZXN0ZWQgaXRlcmF0b3IKLQkJcmV0dXJuIHRoaXMubmVzdGVkSXRlcmF0b3IucHJldmlvdXNJbmRleCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZChFMiBvKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldChFMiBvKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJLy8gZGVsZWdhdGUgdG8gdGhlIG5lc3RlZCBpdGVyYXRvcgotCQl0aGlzLm5lc3RlZEl0ZXJhdG9yLnJlbW92ZSgpOwotCX0KLQotCS8qKgotCSAqIFRyYW5zZm9ybSB0aGUgc3BlY2lmaWVkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICovCi0JcHJvdGVjdGVkIEUyIHRyYW5zZm9ybShFMSBuZXh0KSB7Ci0JCXJldHVybiB0aGlzLnRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXh0KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLm5lc3RlZEl0ZXJhdG9yKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvVHJlZUl0ZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1RyZWVJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzJjNTRhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvVHJlZUl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogQSA8Y29kZT5UcmVlSXRlcmF0b3I8L2NvZGU+IHNpbXBsaWZpZXMgdGhlIHRyYXZlcnNhbCBvZiBhCi0gKiB0cmVlIG9mIG9iamVjdHMsIHdoZXJlIHRoZSBvYmplY3RzJyBwcm90b2NvbChzKSBwcm92aWRlcwotICogYSBtZXRob2QgZm9yIGdldHRpbmcgdGhlIGltbWVkaWF0ZSBjaGlsZHJlbiBvZiB0aGUgZ2l2ZW4KLSAqIG5vZGUgYnV0IGRvZXMgbm90IHByb3ZpZGUgYSBtZXRob2QgZm9yIGdldHRpbmcgYWxsIHRoZQotICogZGVzY2VuZGFudHMgKGNoaWxkcmVuLCBncmFuZGNoaWxkcmVuLCBldGMuKSBvZiB0aGUgZ2l2ZW4gbm9kZS4KLSAqIDxwPgotICogVG8gdXNlLCBzdXBwbHk6PHVsPgotICogPGxpPiBlaXRoZXIgdGhlIHJvb3QgZWxlbWVudCBvZiB0aGUgdHJlZSBvciwgaWYgdGhlIHRyZWUgaGFzCi0gKiBtdWx0aXBsZSByb290cywgYW4gPGNvZGU+SXRlcmF0b3I8L2NvZGU+IG92ZXIgdGhlIHNldCBvZiByb290cwotICogPGxpPiBhIDxjb2RlPk1pZHdpZmU8L2NvZGU+IHRoYXQgZGVsaXZlcnMgdGhlIGNoaWxkcmVuCi0gKiBvZiBlYWNoIGNoaWxkCi0gKiAoYWx0ZXJuYXRpdmVseSwgc3ViY2xhc3MgPGNvZGU+VHJlZUl0ZXJhdG9yPC9jb2RlPgotICogYW5kIG92ZXJyaWRlIHRoZSA8Y29kZT5jaGlsZHJlbihPYmplY3QpPC9jb2RlPiBtZXRob2QpCi0gKiA8L3VsPgotICogPHA+Ci0gKi8KLXB1YmxpYyBjbGFzcyBUcmVlSXRlcmF0b3I8RT4KLQlpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uPEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPj4gaXRlcmF0b3JzOwotCXByaXZhdGUgZmluYWwgTWlkd2lmZTxFPiBtaWR3aWZlOwotCXByaXZhdGUgSXRlcmF0b3I8PyBleHRlbmRzIEU+IGN1cnJlbnRJdGVyYXRvcjsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIG9mIHJvb3RzCi0JICogYW5kIGEgbWlkd2lmZSB0aGF0IHNpbXBseSByZXR1cm5zIGFuIGVtcHR5IGl0ZXJhdG9yCi0JICogZm9yIGVhY2ggb2YgdGhlIHJvb3RzLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZQotCSAqIDxjb2RlPmNoaWxkcmVuKE9iamVjdCk8L2NvZGU+IG1ldGhvZCBpbnN0ZWFkIG9mIGJ1aWxkaW5nCi0JICogYSA8Y29kZT5NaWR3aWZlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgVHJlZUl0ZXJhdG9yKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiByb290cykgewotCQl0aGlzKHJvb3RzLCBNaWR3aWZlLk51bGwuPEU+aW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCByb290Ci0JICogYW5kIGEgbWlkd2lmZSB0aGF0IHNpbXBseSByZXR1cm5zIGFuIGVtcHR5IGl0ZXJhdG9yCi0JICogZm9yIHRoZSByb290LgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZQotCSAqIDxjb2RlPmNoaWxkcmVuKE9iamVjdCk8L2NvZGU+IG1ldGhvZCBpbnN0ZWFkIG9mIGJ1aWxkaW5nCi0JICogYSA8Y29kZT5NaWR3aWZlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgVHJlZUl0ZXJhdG9yKEUgcm9vdCkgewotCQl0aGlzKHJvb3QsIE1pZHdpZmUuTnVsbC48RT5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIHJvb3QKLQkgKiBhbmQgbWlkd2lmZS4KLQkgKi8KLQlwdWJsaWMgVHJlZUl0ZXJhdG9yKEUgcm9vdCwgTWlkd2lmZTxFPiBtaWR3aWZlKSB7Ci0JCXRoaXMobmV3IFNpbmdsZUVsZW1lbnRJdGVyYXRvcjxFPihyb290KSwgbWlkd2lmZSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCByb290cwotCSAqIGFuZCBtaWR3aWZlLgotCSAqLwotCXB1YmxpYyBUcmVlSXRlcmF0b3IoSXRlcmF0b3I8PyBleHRlbmRzIEU+IHJvb3RzLCBNaWR3aWZlPEU+IG1pZHdpZmUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5jdXJyZW50SXRlcmF0b3IgPSByb290czsKLQkJLy8gdXNlIGEgTGlua2VkTGlzdCBzaW5jZSB3ZSB3aWxsIGJlIHB1bGxpbmcgb2ZmIHRoZSBmcm9udCBhbmQgYWRkaW5nIHRvIHRoZSBlbmQKLQkJdGhpcy5pdGVyYXRvcnMgPSBuZXcgTGlua2VkTGlzdDxJdGVyYXRvcjw/IGV4dGVuZHMgRT4+KCk7Ci0JCXRoaXMubWlkd2lmZSA9IG1pZHdpZmU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJaWYgKHRoaXMuY3VycmVudEl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJZm9yIChJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IgOiB0aGlzLml0ZXJhdG9ycykgewotCQkJaWYgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgRSBuZXh0KCkgewotCQlpZiAodGhpcy5jdXJyZW50SXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlyZXR1cm4gdGhpcy5uZXh0SW50ZXJuYWwoKTsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yPEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPj4gc3RyZWFtID0gdGhpcy5pdGVyYXRvcnMuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQl0aGlzLmN1cnJlbnRJdGVyYXRvciA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlpZiAodGhpcy5jdXJyZW50SXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMubmV4dEludGVybmFsKCk7Ci0JfQotCi0JLyoqCi0JICogRmV0Y2ggdGhlIGNoaWxkcmVuIG9mIHRoZSBuZXh0IG5vZGUgYmVmb3JlIHJldHVybmluZyBpdC4KLQkgKi8KLQlwcml2YXRlIEUgbmV4dEludGVybmFsKCkgewotCQlFIG5leHQgPSB0aGlzLmN1cnJlbnRJdGVyYXRvci5uZXh0KCk7Ci0JCXRoaXMuaXRlcmF0b3JzLmFkZCh0aGlzLmNoaWxkcmVuKG5leHQpKTsKLQkJcmV0dXJuIG5leHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQl0aGlzLmN1cnJlbnRJdGVyYXRvci5yZW1vdmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGltbWVkaWF0ZSBjaGlsZHJlbiBvZiB0aGUgc3BlY2lmaWVkIG9iamVjdC4KLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3I8PyBleHRlbmRzIEU+IGNoaWxkcmVuKEUgbmV4dCkgewotCQlyZXR1cm4gdGhpcy5taWR3aWZlLmNoaWxkcmVuKG5leHQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuY3VycmVudEl0ZXJhdG9yKTsKLQl9Ci0KLQotCS8vKioqKioqKioqKiBpbm5lciBjbGFzc2VzICoqKioqKioqKioKLQotCS8qKgotCSAqIFVzZWQgYnkgPGNvZGU+VHJlZUl0ZXJhdG9yPC9jb2RlPiB0byByZXRyaWV2ZQotCSAqIHRoZSBpbW1lZGlhdGUgY2hpbGRyZW4gb2YgYSBub2RlIGluIHRoZSB0cmVlLgotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgTWlkd2lmZTxUPiB7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgaW1tZWRpYXRlIGNoaWxkcmVuIG9mIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgotCQkgKi8KLQkJSXRlcmF0b3I8PyBleHRlbmRzIFQ+IGNoaWxkcmVuKFQgbyk7Ci0KLQotCQlmaW5hbCBjbGFzcyBOdWxsPFM+IGltcGxlbWVudHMgTWlkd2lmZTxTPiB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgTWlkd2lmZSBJTlNUQU5DRSA9IG5ldyBOdWxsKCk7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCXB1YmxpYyBzdGF0aWMgPFI+IE1pZHdpZmU8Uj4gaW5zdGFuY2UoKSB7Ci0JCQkJcmV0dXJuIElOU1RBTkNFOwotCQkJfQotCQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQkJcHJpdmF0ZSBOdWxsKCkgewotCQkJCXN1cGVyKCk7Ci0JCQl9Ci0JCQkvLyByZXR1cm4gbm8gbmVpZ2hib3JzCi0JCQlwdWJsaWMgSXRlcmF0b3I8Uz4gY2hpbGRyZW4oUyBuZXh0KSB7Ci0JCQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIlRyZWVJdGVyYXRvci5NaWR3aWZlLk51bGwiOwotCQkJfQotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvamR0dXRpbGl0eS9KRFRUb29sc1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2pkdHV0aWxpdHkvSkRUVG9vbHNUZXN0cy5qYXZhCmluZGV4IDUxNzY1OTUuLjFlMjI2MTEgMTAwNjQ0Ci0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvamR0dXRpbGl0eS9KRFRUb29sc1Rlc3RzLmphdmEKKysrIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29yZS90ZXN0cy9pbnRlcm5hbC9qZHR1dGlsaXR5L0pEVFRvb2xzVGVzdHMuamF2YQpAQCAtMTAsNiArMTAsNyBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5pbnRlcm5hbC5qZHR1dGlsaXR5OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuU2lnbmF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5OYW1lOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHkuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHkuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qZHR1dGlsaXR5LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwpAQCAtMTE4LDcgKzExOSw3IEBACiAJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKGRhYSwgImZvbyIpOwogCQlGaWVsZEF0dHJpYnV0ZSBmaWVsZCA9IHRoaXMuaWRGaWVsZCgpOwogCi0JCVN0cmluZyBhY3R1YWwgPSBKRFRUb29scy5yZXNvbHZlRW51bSh0aGlzLmpkdFR5cGUoKS5nZXRDb21waWxhdGlvblVuaXQoKSwgZmllbGQuYW5ub3RhdGlvbkVsZW1lbnRFeHByZXNzaW9uKGRhZWEpKTsKKwkJU3RyaW5nIGFjdHVhbCA9IEpEVFRvb2xzLnJlc29sdmVFbnVtKChOYW1lKSBmaWVsZC5hbm5vdGF0aW9uRWxlbWVudEV4cHJlc3Npb24oZGFlYSkpOwogCQlhc3NlcnRFcXVhbHMoImVudW1zLlRlc3RFbnVtLkJBWiIsIGFjdHVhbCk7CiAJfQogCkBAIC0xMzEsNyArMTMyLDcgQEAKIAkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoZGFhLCAiZm9vIik7CiAJCUZpZWxkQXR0cmlidXRlIGZpZWxkID0gdGhpcy5pZEZpZWxkKCk7CiAKLQkJU3RyaW5nIGFjdHVhbCA9IEpEVFRvb2xzLnJlc29sdmVFbnVtKHRoaXMuamR0VHlwZSgpLmdldENvbXBpbGF0aW9uVW5pdCgpLCBmaWVsZC5hbm5vdGF0aW9uRWxlbWVudEV4cHJlc3Npb24oZGFlYSkpOworCQlTdHJpbmcgYWN0dWFsID0gSkRUVG9vbHMucmVzb2x2ZUVudW0oKE5hbWUpIGZpZWxkLmFubm90YXRpb25FbGVtZW50RXhwcmVzc2lvbihkYWVhKSk7CiAJCWFzc2VydEVxdWFscygiZW51bXMuVGVzdEVudW0uQkFaIiwgYWN0dWFsKTsKIAl9CiAKQEAgLTE0NCw3ICsxNDUsNyBAQAogCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhkYWEsICJmb28iKTsKIAkJRmllbGRBdHRyaWJ1dGUgZmllbGQgPSB0aGlzLmlkRmllbGQoKTsKIAotCQlTdHJpbmcgYWN0dWFsID0gSkRUVG9vbHMucmVzb2x2ZUVudW0odGhpcy5qZHRUeXBlKCkuZ2V0Q29tcGlsYXRpb25Vbml0KCksIGZpZWxkLmFubm90YXRpb25FbGVtZW50RXhwcmVzc2lvbihkYWVhKSk7CisJCVN0cmluZyBhY3R1YWwgPSBKRFRUb29scy5yZXNvbHZlRW51bSgoTmFtZSkgZmllbGQuYW5ub3RhdGlvbkVsZW1lbnRFeHByZXNzaW9uKGRhZWEpKTsKIAkJYXNzZXJ0RXF1YWxzKCJlbnVtcy5UZXN0RW51bS5CQVoiLCBhY3R1YWwpOwogCX0KIApAQCAtMTU3LDcgKzE1OCw3IEBACiAJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKGRhYSwgImZvbyIpOwogCQlGaWVsZEF0dHJpYnV0ZSBmaWVsZCA9IHRoaXMuaWRGaWVsZCgpOwogCi0JCVN0cmluZyBhY3R1YWwgPSBKRFRUb29scy5yZXNvbHZlRW51bSh0aGlzLmpkdFR5cGUoKS5nZXRDb21waWxhdGlvblVuaXQoKSwgZmllbGQuYW5ub3RhdGlvbkVsZW1lbnRFeHByZXNzaW9uKGRhZWEpKTsKKwkJU3RyaW5nIGFjdHVhbCA9IEpEVFRvb2xzLnJlc29sdmVFbnVtKChOYW1lKSBmaWVsZC5hbm5vdGF0aW9uRWxlbWVudEV4cHJlc3Npb24oZGFlYSkpOwogCQlhc3NlcnRFcXVhbHMoImVudW1zLlRlc3RFbnVtLkJBWiIsIGFjdHVhbCk7CiAJfQogCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb3JlL3Rlc3RzL2ludGVybmFsL2pkdHV0aWxpdHkvTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvamR0dXRpbGl0eS9NZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXJUZXN0cy5qYXZhCmluZGV4IGExM2NmMjQuLmIwN2MzMTQgMTAwNjQ0Ci0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvamR0dXRpbGl0eS9NZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXJUZXN0cy5qYXZhCisrKyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvcmUvdGVzdHMvaW50ZXJuYWwvamR0dXRpbGl0eS9NZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXJUZXN0cy5qYXZhCkBAIC0xMCwxNCArMTAsMTEgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuaW50ZXJuYWwuamR0dXRpbGl0eTsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFycmF5SW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkJvb2xlYW5MaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5DaGFyYWN0ZXJMaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5OdW1iZXJMaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UeXBlTGl0ZXJhbDsKKwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLklUZXh0UmFuZ2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuamR0dXRpbGl0eS5BU1ROb2RlVGV4dFJhbmdlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHkuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHkuQW5ub3RhdGlvblN0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qZHR1dGlsaXR5LkJvb2xlYW5TdHJpbmdFeHByZXNzaW9uQ29udmVydGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHkuQ2hhcmFjdGVyU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qZHR1dGlsaXR5LkNvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKQEAgLTI1LDYgKzIyLDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qZHR1dGlsaXR5LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHkuRW51bUFycmF5RGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuamR0dXRpbGl0eS5FbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuamR0dXRpbGl0eS5FeHByZXNzaW9uQ29udmVydGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHkuTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHkuTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5pbnRlcm5hbC5qZHR1dGlsaXR5Lk5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwpAQCAtMzIsNyArMzAsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHkuUHJpbWl0aXZlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuamR0dXRpbGl0eS5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmpkdHV0aWxpdHkuU2ltcGxlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuamR0dXRpbGl0eS5TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuamR0dXRpbGl0eS5TdHJpbmdFeHByZXNzaW9uQ29udmVydGVyOwogCiBwdWJsaWMgY2xhc3MgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyVGVzdHMgZXh0ZW5kcyBBbm5vdGF0aW9uVGVzdENhc2UgewogCkBAIC02MSw3ICs1OSw3IEBACiAJCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJpbnQgYmFyKCk7Iik7CiAJCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPTQ4KSIpOwogCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmcsIE51bWJlckxpdGVyYWw+KGRhYSwgImJhciIsIE51bWJlclN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7CisJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihkYWEsICJiYXIiLCBOdW1iZXJTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwogCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKCksIGRhZWEpOwogCQlhc3NlcnRFcXVhbHMoIjQ4IiwgYWVhLmdldFZhbHVlKCkpOwogCX0KQEAgLTcwLDcgKzY4LDcgQEAKIAkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImNoYXIgYmFyKCk7Iik7CiAJCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPSdjJykiKTsKIAkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nLCBDaGFyYWN0ZXJMaXRlcmFsPihkYWEsICJiYXIiLCBDaGFyYWN0ZXJTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOworCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oZGFhLCAiYmFyIiwgQ2hhcmFjdGVyU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKIAkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZCgpLCBkYWVhKTsKIAkJYXNzZXJ0RXF1YWxzKCJjIiwgYWVhLmdldFZhbHVlKCkpOwogCX0KQEAgLTc5LDcgKzc3LDcgQEAKIAkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImJvb2xlYW4gYmFyKCk7Iik7CiAJCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPWZhbHNlKSIpOwogCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmcsIEJvb2xlYW5MaXRlcmFsPihkYWEsICJiYXIiLCBCb29sZWFuU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKKwkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGRhYSwgImJhciIsIEJvb2xlYW5TdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwogCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKCksIGRhZWEpOwogCQlhc3NlcnRFcXVhbHMoImZhbHNlIiwgYWVhLmdldFZhbHVlKCkpOwogCX0KQEAgLTkyLDcgKzkwLDcgQEAKIAkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWExID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwogCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTIgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWExLCAidmFsdWUiLCAiYW5ub3QuQmFyIik7CiAJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMyA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTIsICJqaW1teSIsICJhbm5vdC5CYXoiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmcsIEJvb2xlYW5MaXRlcmFsPihkYWEzLCAiZnJlZCIsIEJvb2xlYW5TdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOworCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oZGFhMywgImZyZWQiLCBCb29sZWFuU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKIAkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZCgpLCBkYWVhKTsKIAkJYXNzZXJ0RXF1YWxzKCJmYWxzZSIsIGFlYS5nZXRWYWx1ZSgpKTsKIAl9CkBAIC0xMDEsNyArOTksNyBAQAogCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYm9vbGVhbiB2YWx1ZSgpOyIpOwogCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGZhbHNlKSIpOwogCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmcsIEJvb2xlYW5MaXRlcmFsPihkYWEsIEJvb2xlYW5TdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOworCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oZGFhLCBCb29sZWFuU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKIAkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZCgpLCBkYWVhKTsKIAkJYXNzZXJ0RXF1YWxzKCJmYWxzZSIsIGFlYS5nZXRWYWx1ZSgpKTsKIAl9CkBAIC0xMzcsNiArMTM1LDE5NyBAQAogCQlhc3NlcnROdWxsKGFlYS5nZXRWYWx1ZSgpKTsKIAl9CiAKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWVTdHJpbmdDb25jYXRlbmF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmcgYmFyKCk7Iik7CisJCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPVwieHh4XCIgKyBcInl5eVwiICsgXCJ6enpcIikiKTsKKwkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7CisJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKGRhYSwgImJhciIpOworCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKCksIGRhZWEpOworCQlhc3NlcnRFcXVhbHMoInh4eHl5eXp6eiIsIGFlYS5nZXRWYWx1ZSgpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWVTdHJpbmdDb25zdGFudCgpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nIGJhcigpOyIpOworCQkvLyBqdXN0IGEgYml0IGhhY2t5OgorCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9PX0JBUiA9IFwieHh4XCI7IEBhbm5vdC5Gb28oYmFyPUZPT19CQVIgKyBcInl5eVwiICsgXCJ6enpcIikiKTsKKwkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7CisJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKGRhYSwgImJhciIpOworCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKCksIGRhZWEpOworCQlhc3NlcnRFcXVhbHMoInh4eHl5eXp6eiIsIGFlYS5nZXRWYWx1ZSgpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWVOdW1iZXJBcml0aG1ldGljKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJpbnQgYmFyKCk7Iik7CisJCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPTQ3IC0gNyArIDIgKiAxIC8gMSkiKTsKKwkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7CisJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JOdW1iZXJzKGRhYSwgImJhciIpOworCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKCksIGRhZWEpOworCQlhc3NlcnRFcXVhbHMoIjQyIiwgYWVhLmdldFZhbHVlKCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZU51bWJlclNoaWZ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJpbnQgYmFyKCk7Iik7CisJCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPTIgPDwgMikiKTsKKwkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7CisJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JOdW1iZXJzKGRhYSwgImJhciIpOworCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKCksIGRhZWEpOworCQlhc3NlcnRFcXVhbHMoIjgiLCBhZWEuZ2V0VmFsdWUoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEdldFZhbHVlTnVtYmVyQ29uc3RhbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImludCBiYXIoKTsiKTsKKwkJLy8ganVzdCBhIGJpdCBoYWNreToKKwkJdGhpcy5jcmVhdGVUZXN0VHlwZSgicHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZPT19CQVIgPSA3NzsgQGFubm90LkZvbyhiYXI9Rk9PX0JBUikiKTsKKwkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7CisJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JOdW1iZXJzKGRhYSwgImJhciIpOworCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKCksIGRhZWEpOworCQlhc3NlcnRFcXVhbHMoIjc3IiwgYWVhLmdldFZhbHVlKCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZUNoYXJhY3RlckNvbnN0YW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJjaGFyIGJhcigpOyIpOworCQkvLyBqdXN0IGEgYml0IGhhY2t5OgorCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIEZPT19CQVIgPSAnUSc7IEBhbm5vdC5Gb28oYmFyPUZPT19CQVIpIik7CisJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOworCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yQ2hhcmFjdGVycyhkYWEsICJiYXIiKTsKKwkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZCgpLCBkYWVhKTsKKwkJYXNzZXJ0RXF1YWxzKCJRIiwgYWVhLmdldFZhbHVlKCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZUNoYXJhY3RlckNhc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImNoYXIgYmFyKCk7Iik7CisJCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPShjaGFyKSAweDQxKSIpOworCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKKwkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvckNoYXJhY3RlcnMoZGFhLCAiYmFyIik7CisJCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoKSwgZGFlYSk7CisJCWFzc2VydEVxdWFscygiQSIsIGFlYS5nZXRWYWx1ZSgpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWVCb29sZWFuT3BlcmF0b3IxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJib29sZWFuIGJhcigpOyIpOworCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj03ID4gMikiKTsKKwkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7CisJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JCb29sZWFucyhkYWEsICJiYXIiKTsKKwkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZCgpLCBkYWVhKTsKKwkJYXNzZXJ0RXF1YWxzKCJ0cnVlIiwgYWVhLmdldFZhbHVlKCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZUJvb2xlYW5PcGVyYXRvcjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImJvb2xlYW4gYmFyKCk7Iik7CisJCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPTcgPT0gMikiKTsKKwkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7CisJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JCb29sZWFucyhkYWEsICJiYXIiKTsKKwkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZCgpLCBkYWVhKTsKKwkJYXNzZXJ0RXF1YWxzKCJmYWxzZSIsIGFlYS5nZXRWYWx1ZSgpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWVCb29sZWFuT3BlcmF0b3IzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJib29sZWFuIGJhcigpOyIpOworCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj0oNyAhPSAyKSAmJiBmYWxzZSkiKTsKKwkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7CisJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JCb29sZWFucyhkYWEsICJiYXIiKTsKKwkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZCgpLCBkYWVhKTsKKwkJYXNzZXJ0RXF1YWxzKCJmYWxzZSIsIGFlYS5nZXRWYWx1ZSgpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWVCb29sZWFuT3BlcmF0b3I0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJib29sZWFuIGJhcigpOyIpOworCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj0oNyAhPSAyKSA/IGZhbHNlIDogdHJ1ZSkiKTsKKwkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7CisJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JCb29sZWFucyhkYWEsICJiYXIiKTsKKwkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZCgpLCBkYWVhKTsKKwkJYXNzZXJ0RXF1YWxzKCJmYWxzZSIsIGFlYS5nZXRWYWx1ZSgpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWVJbnZhbGlkVmFsdWUxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmcgYmFyKCk7Iik7CisJCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPTc3KSIpOworCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKKwkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoZGFhLCAiYmFyIik7CisJCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoKSwgZGFlYSk7CisJCWFzc2VydE51bGwoYWVhLmdldFZhbHVlKCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZUludmFsaWRWYWx1ZTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZyBiYXIoKTsiKTsKKwkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9YmF6enp6KSIpOworCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKKwkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoZGFhLCAiYmFyIik7CisJCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoKSwgZGFlYSk7CisJCWFzc2VydE51bGwoYWVhLmdldFZhbHVlKCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZUludmFsaWRWYWx1ZTMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImJvb2xlYW4gYmFyKCk7Iik7CisJCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPWJhenp6eikiKTsKKwkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7CisJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JCb29sZWFucyhkYWEsICJiYXIiKTsKKwkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZCgpLCBkYWVhKTsKKwkJYXNzZXJ0TnVsbChhZWEuZ2V0VmFsdWUoKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEdldFZhbHVlSW52YWxpZFZhbHVlNCgpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiY2hhciBiYXIoKTsiKTsKKwkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9XCJiYXp6enpcIikiKTsKKwkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7CisJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JDaGFyYWN0ZXJzKGRhYSwgImJhciIpOworCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKCksIGRhZWEpOworCQlhc3NlcnROdWxsKGFlYS5nZXRWYWx1ZSgpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWVJbnZhbGlkVmFsdWU1KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJDbGFzcyBiYXIoKTsiKTsKKwkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9XCJqYXZhLmxhbmcuT2JqZWN0XCIpIik7CisJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOworCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oZGFhLCAiYmFyIiwgU2ltcGxlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7CisJCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoKSwgZGFlYSk7CisJCWFzc2VydE51bGwoYWVhLmdldFZhbHVlKCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZUludmFsaWRWYWx1ZTYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy5jcmVhdGVFbnVtKCJUZXN0RW51bSIsICJYWFgsIFlZWSwgWlpaIik7CisJCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJlbnVtcy5UZXN0RW51bSBiYXIoKTsiKTsKKwkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9ZW51bXMuVGVzdEVudW0uY2xhc3MpIik7CisJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOworCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBuZXcgRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGRhYSwgImJhciIpOworCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKCksIGRhZWEpOworCQlhc3NlcnROdWxsKGFlYS5nZXRWYWx1ZSgpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWVJbnZhbGlkVmFsdWU3KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJheiIsICJib29sZWFuIGZyZWQoKTsiKTsKKwkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImFubm90LkJheiBqaW1teSgpOyIpOworCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyIHZhbHVlKCk7Iik7CisJCVN0cmluZyB2YWx1ZSA9ICJcImZhbHNlXCIiOworCQlTdHJpbmcgZWxlbWVudCA9ICJmcmVkPSIgKyB2YWx1ZTsKKwkJU3RyaW5nIGFubm90YXRpb24gPSAiQGFubm90LkZvbyhAYW5ub3QuQmFyKGppbW15PUBhbm5vdC5CYXooIiArIGVsZW1lbnQgKyAiKSkpIjsKKwkJdGhpcy5jcmVhdGVUZXN0VHlwZShhbm5vdGF0aW9uKTsKKwkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWExID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOworCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTIgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWExLCAidmFsdWUiLCAiYW5ub3QuQmFyIik7CisJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMyA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTIsICJqaW1teSIsICJhbm5vdC5CYXoiKTsKKwkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGRhYTMsICJmcmVkIiwgQm9vbGVhblN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7CisJCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoKSwgZGFlYSk7CisJCWFzc2VydE51bGwoYWVhLmdldFZhbHVlKCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZUludmFsaWRWYWx1ZTgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZ1tdIGJhcigpOyIpOworCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj17dHJ1ZSwgZmFsc2V9KSIpOworCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKKwkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPihkYWEsICJiYXIiLCBBbm5vdGF0aW9uU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyLmZvclN0cmluZ3MoKSk7CisJCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4odGhpcy5pZEZpZWxkKCksIGRhZWEpOworCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHtudWxsLCBudWxsfSwgYWVhLmdldFZhbHVlKCkpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWVJbnZhbGlkVmFsdWU5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmdbXSBiYXIoKTsiKTsKKwkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9NzcpIik7CisJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOworCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KGRhYSwgImJhciIsIEFubm90YXRpb25TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIuZm9yU3RyaW5ncygpKTsKKwkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPih0aGlzLmlkRmllbGQoKSwgZGFlYSk7CisJCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10ge251bGx9LCBhZWEuZ2V0VmFsdWUoKSkpOworCX0KKwogCXB1YmxpYyB2b2lkIHRlc3RBU1ROb2RlMSgpIHRocm93cyBFeGNlcHRpb24gewogCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nIGJhcigpOyIpOwogCQlTdHJpbmcgdmFsdWUgPSAiXCJ4eHhcIiI7CkBAIC0xNjQsNyArMzUzLDcgQEAKIAkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWExID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwogCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTIgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWExLCAidmFsdWUiLCAiYW5ub3QuQmFyIik7CiAJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMyA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTIsICJqaW1teSIsICJhbm5vdC5CYXoiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmcsIEJvb2xlYW5MaXRlcmFsPihkYWEzLCAiZnJlZCIsIEJvb2xlYW5TdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOworCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oZGFhMywgImZyZWQiLCBCb29sZWFuU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKIAkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZCgpLCBkYWVhKTsKIAkJYXNzZXJ0RXF1YWxzKCJmYWxzZSIsIGFlYS5nZXRWYWx1ZSgpKTsKIAkJSVRleHRSYW5nZSB0ZXh0UmFuZ2UgPSBuZXcgQVNUTm9kZVRleHRSYW5nZShhZWEuYXN0Tm9kZSgpKTsKQEAgLTIzNSw3ICs0MjQsNyBAQAogCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7CiAJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMiA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTEsICJ2YWx1ZSIsICJhbm5vdC5CYXIiKTsKIAkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEzID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMiwgImppbW15IiwgImFubm90LkJheiIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZywgQm9vbGVhbkxpdGVyYWw+KGRhYTMsICJmcmVkIiwgQm9vbGVhblN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7CisJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihkYWEzLCAiZnJlZCIsIEJvb2xlYW5TdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwogCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKCksIGRhZWEpOwogCiAJCWFlYS5zZXRWYWx1ZShudWxsKTsKQEAgLTI1NCw3ICs0NDMsNyBAQAogCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7CiAJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMiA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTEsICJ2YWx1ZSIsICJhbm5vdC5CYXIiLCBmYWxzZSk7CiAJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMyA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTIsICJqaW1teSIsICJhbm5vdC5CYXoiLCBmYWxzZSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nLCBCb29sZWFuTGl0ZXJhbD4oZGFhMywgImZyZWQiLCBCb29sZWFuU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKKwkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGRhYTMsICJmcmVkIiwgQm9vbGVhblN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7CiAJCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoKSwgZGFlYSk7CiAKIAkJYWVhLnNldFZhbHVlKG51bGwpOwpAQCAtMjgzLDcgKzQ3Miw3IEBACiAJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKIAkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEyID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMSwgInZhbHVlIiwgImFubm90LkJhciIpOwogCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTMgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWEyLCAiamltbXkiLCAiYW5ub3QuQmF6Iik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nLCBCb29sZWFuTGl0ZXJhbD4oZGFhMywgImZyZWQiLCBCb29sZWFuU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKKwkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGRhYTMsICJmcmVkIiwgQm9vbGVhblN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7CiAJCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoKSwgZGFlYSk7CiAKIAkJYWVhLnNldFZhbHVlKCJ0cnVlIik7CkBAIC0yOTksNyArNDg4LDcgQEAKIAkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWExID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwogCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTIgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWExLCAidmFsdWUiLCAiYW5ub3QuQmFyIik7CiAJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMyA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTIsICJqaW1teSIsICJhbm5vdC5CYXoiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmcsIEJvb2xlYW5MaXRlcmFsPihkYWEzLCAiZnJlZCIsIEJvb2xlYW5TdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOworCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oZGFhMywgImZyZWQiLCBCb29sZWFuU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKIAkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZCgpLCBkYWVhKTsKIAogCQlhZWEuc2V0VmFsdWUoInRydWUiKTsKQEAgLTM3MSw3ICs1NjAsNyBAQAogCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7CiAJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMiA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTEsICJ2YWx1ZSIsICJhbm5vdC5CYXIiKTsKIAkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEzID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTIsICJqaW1teSIsIDIsICJhbm5vdC5CYXoiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmcsIE51bWJlckxpdGVyYWw+KGRhYTMsICJmcmVkIiwgTnVtYmVyU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKKwkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGRhYTMsICJmcmVkIiwgTnVtYmVyU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKIAkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZCgpLCBkYWVhKTsKIAogCQlhc3NlcnRFcXVhbHMoIjIiLCBhZWEuZ2V0VmFsdWUoKSk7CkBAIC00MTAsNyArNTk5LDcgQEAKIAkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIkNsYXNzIGJhcigpOyIpOwogCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj1qYXZhLmxhbmcuT2JqZWN0LmNsYXNzKSIpOwogCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmcsIFR5cGVMaXRlcmFsPihkYWEsICJiYXIiLCBTaW1wbGVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKKwkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGRhYSwgImJhciIsIFNpbXBsZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwogCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKCksIGRhZWEpOwogCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5PYmplY3QiLCBhZWEuZ2V0VmFsdWUoKSk7CiAJfQpAQCAtNDE5LDcgKzYwOCw3IEBACiAJCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJDbGFzcyBiYXIoKTsiKTsKIAkJdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwogCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmcsIFR5cGVMaXRlcmFsPihkYWEsICJiYXIiLCBTaW1wbGVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKKwkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGRhYSwgImJhciIsIFNpbXBsZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwogCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKCksIGRhZWEpOwogCQlhZWEuc2V0VmFsdWUoImphdmEubGFuZy5PYmplY3QiKTsKIAkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEZvbyhiYXI9amF2YS5sYW5nLk9iamVjdC5jbGFzcykiKTsKQEAgLTQyOSw3ICs2MTgsNyBAQAogCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiQ2xhc3MgYmFyKCk7Iik7CiAJCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPWludC5jbGFzcykiKTsKIAkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nLCBUeXBlTGl0ZXJhbD4oZGFhLCAiYmFyIiwgU2ltcGxlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7CisJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihkYWEsICJiYXIiLCBTaW1wbGVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKIAkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZCgpLCBkYWVhKTsKIAkJYXNzZXJ0TnVsbChhZWEuZ2V0VmFsdWUoKSk7CiAJfQpAQCAtNDM4LDcgKzYyNyw3IEBACiAJCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJDbGFzcyBiYXIoKTsiKTsKIAkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9amF2YS51dGlsLk1hcC5FbnRyeS5jbGFzcykiKTsKIAkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nLCBUeXBlTGl0ZXJhbD4oZGFhLCAiYmFyIiwgU2ltcGxlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7CisJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihkYWEsICJiYXIiLCBTaW1wbGVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKIAkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZCgpLCBkYWVhKTsKIAkJYXNzZXJ0RXF1YWxzKCJqYXZhLnV0aWwuTWFwLkVudHJ5IiwgYWVhLmdldFZhbHVlKCkpOwogCX0KQEAgLTQ0Nyw3ICs2MzYsNyBAQAogCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiQ2xhc3MgYmFyKCk7Iik7CiAJCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPWludC5jbGFzcykiKTsKIAkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nLCBUeXBlTGl0ZXJhbD4oZGFhLCAiYmFyIiwgUHJpbWl0aXZlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7CisJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihkYWEsICJiYXIiLCBQcmltaXRpdmVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKIAkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZCgpLCBkYWVhKTsKIAkJYXNzZXJ0RXF1YWxzKCJpbnQiLCBhZWEuZ2V0VmFsdWUoKSk7CiAJfQpAQCAtNDU2LDcgKzY0NSw3IEBACiAJCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJDbGFzcyBiYXIoKTsiKTsKIAkJdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwogCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmcsIFR5cGVMaXRlcmFsPihkYWEsICJiYXIiLCBQcmltaXRpdmVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKKwkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGRhYSwgImJhciIsIFByaW1pdGl2ZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwogCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKCksIGRhZWEpOwogCQlhZWEuc2V0VmFsdWUoImludCIpOwogCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJARm9vKGJhcj1pbnQuY2xhc3MpIik7CkBAIC00NjYsNyArNjU1LDcgQEAKIAkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIkNsYXNzIGJhcigpOyIpOwogCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj1qYXZhLmxhbmcuT2JqZWN0LmNsYXNzKSIpOwogCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmcsIFR5cGVMaXRlcmFsPihkYWEsICJiYXIiLCBQcmltaXRpdmVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKKwkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGRhYSwgImJhciIsIFByaW1pdGl2ZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwogCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKCksIGRhZWEpOwogCQlhc3NlcnROdWxsKGFlYS5nZXRWYWx1ZSgpKTsKIAl9CkBAIC00NzUsNyArNjY0LDcgQEAKIAkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIkNsYXNzIGJhcigpOyIpOwogCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj12b2lkLmNsYXNzKSIpOwogCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmcsIFR5cGVMaXRlcmFsPihkYWEsICJiYXIiLCBQcmltaXRpdmVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKKwkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGRhYSwgImJhciIsIFByaW1pdGl2ZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwogCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKCksIGRhZWEpOwogCQlhc3NlcnRFcXVhbHMoInZvaWQiLCBhZWEuZ2V0VmFsdWUoKSk7CiAJfQpAQCAtNTUxLDE4ICs3NDAsNDUgQEAKIAkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZ1tdIGJhcigpOyIpOwogCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj17XCJzdHJpbmcwXCIsIFwic3RyaW5nMVwifSkiKTsKIAkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXSwgQXJyYXlJbml0aWFsaXplcj4oZGFhLCAiYmFyIiwgU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyLmZvclN0cmluZ0xpdGVyYWxzKCkpOworCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KGRhYSwgImJhciIsIEFubm90YXRpb25TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIuZm9yU3RyaW5ncygpKTsKIAkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPih0aGlzLmlkRmllbGQoKSwgZGFlYSk7CiAJCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyJzdHJpbmcwIiwgInN0cmluZzEifSwgYWVhLmdldFZhbHVlKCkpKTsKIAl9CiAKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWVTdHJpbmdBcnJheUNvbmNhdGVuYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZ1tdIGJhcigpOyIpOworCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj17XCJzdHJpXCIgKyBcIm5nMFwiLCBcInNcIiArIFwidHJpbmcxXCJ9KSIpOworCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKKwkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPihkYWEsICJiYXIiLCBBbm5vdGF0aW9uU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyLmZvclN0cmluZ3MoKSk7CisJCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4odGhpcy5pZEZpZWxkKCksIGRhZWEpOworCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsic3RyaW5nMCIsICJzdHJpbmcxIn0sIGFlYS5nZXRWYWx1ZSgpKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEdldFZhbHVlU3RyaW5nQXJyYXlFbXB0eSgpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nW10gYmFyKCk7Iik7CisJCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPXt9KSIpOworCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKKwkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPihkYWEsICJiYXIiLCBBbm5vdGF0aW9uU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyLmZvclN0cmluZ3MoKSk7CisJCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4odGhpcy5pZEZpZWxkKCksIGRhZWEpOworCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1swXSwgYWVhLmdldFZhbHVlKCkpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWVTdHJpbmdBcnJheVNpbmdsZUVsZW1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZ1tdIGJhcigpOyIpOworCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj1cInN0cmluZzBcIikiKTsKKwkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7CisJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4oZGFhLCAiYmFyIiwgQW5ub3RhdGlvblN0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlci5mb3JTdHJpbmdzKCkpOworCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGFlYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KHRoaXMuaWRGaWVsZCgpLCBkYWVhKTsKKwkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7InN0cmluZzAifSwgYWVhLmdldFZhbHVlKCkpKTsKKwl9CisKIAlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWVOdWxsU3RyaW5nQXJyYXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZ1tdIGJhcigpOyIpOwogCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKCkiKTsKIAkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXSwgQXJyYXlJbml0aWFsaXplcj4oZGFhLCAiYmFyIiwgU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyLmZvclN0cmluZ0xpdGVyYWxzKCkpOworCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KGRhYSwgImJhciIsIEFubm90YXRpb25TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIuZm9yU3RyaW5ncygpKTsKIAkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPih0aGlzLmlkRmllbGQoKSwgZGFlYSk7Ci0JCWFzc2VydE51bGwoYWVhLmdldFZhbHVlKCkpOworCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1swXSwgYWVhLmdldFZhbHVlKCkpKTsKIAl9CiAKIAlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVTdHJpbmdBcnJheSgpIHRocm93cyBFeGNlcHRpb24gewpAQCAtNTcxLDEyICs3ODcsNDkgQEAKIAkJdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwogCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGFubm90YXRpb24pOwogCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdLCBBcnJheUluaXRpYWxpemVyPihkYWEsICJiYXIiLCBTdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIuZm9yU3RyaW5nTGl0ZXJhbHMoKSk7CisJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4oZGFhLCAiYmFyIiwgQW5ub3RhdGlvblN0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlci5mb3JTdHJpbmdzKCkpOwogCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGFlYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KHRoaXMuaWRGaWVsZCgpLCBkYWVhKTsKIAkJYWVhLnNldFZhbHVlKG5ldyBTdHJpbmdbXSB7InN0cmluZzAiLCAic3RyaW5nMSJ9KTsKIAkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhhbm5vdGF0aW9uKTsKIAl9CiAKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVTdHJpbmdBcnJheUVtcHR5UmVtb3ZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmdbXSBiYXIoKTsiKTsKKwkJU3RyaW5nIGFubm90YXRpb24gPSAiQEZvbyI7CisJCXRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKKwkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihhbm5vdGF0aW9uKTsKKwkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7CisJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4oZGFhLCAiYmFyIiwgQW5ub3RhdGlvblN0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlci5mb3JTdHJpbmdzKCkpOworCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGFlYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KHRoaXMuaWRGaWVsZCgpLCBkYWVhKTsKKwkJYWVhLnNldFZhbHVlKG5ldyBTdHJpbmdbMF0pOworCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGFubm90YXRpb24pOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZVN0cmluZ0FycmF5RW1wdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZ1tdIGJhcigpOyIpOworCQlTdHJpbmcgYW5ub3RhdGlvbiA9ICJARm9vKGJhcj17fSkiOworCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7CisJCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oYW5ub3RhdGlvbik7CisJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOworCQlFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZ1tdPiBleHByZXNzaW9uQ29udmVydGVyID0gbmV3IEFubm90YXRpb25TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIoU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpLCBmYWxzZSk7CisJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4oZGFhLCAiYmFyIiwgZXhwcmVzc2lvbkNvbnZlcnRlcik7CisJCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4odGhpcy5pZEZpZWxkKCksIGRhZWEpOworCQlhZWEuc2V0VmFsdWUobmV3IFN0cmluZ1swXSk7CisJCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoYW5ub3RhdGlvbik7CisJfQorCisJcHVibGljIHZvaWQgdGVzdFNldFZhbHVlU3RyaW5nQXJyYXlTaW5nbGVFbGVtZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmdbXSBiYXIoKTsiKTsKKwkJU3RyaW5nIGFubm90YXRpb24gPSAiQEZvbyhiYXI9XCJzdHJpbmcwXCIpIjsKKwkJdGhpcy5jcmVhdGVUZXN0VHlwZSgpOworCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGFubm90YXRpb24pOworCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKKwkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPihkYWEsICJiYXIiLCBBbm5vdGF0aW9uU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyLmZvclN0cmluZ3MoKSk7CisJCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYWVhID0gbmV3IE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4odGhpcy5pZEZpZWxkKCksIGRhZWEpOworCQlhZWEuc2V0VmFsdWUobmV3IFN0cmluZ1tdIHsic3RyaW5nMCJ9KTsKKwkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhhbm5vdGF0aW9uKTsKKwl9CisKIAlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWVFbnVtQXJyYXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJdGhpcy5jcmVhdGVFbnVtKCJUZXN0RW51bSIsICJYWFgsIFlZWSwgWlpaIik7CiAJCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJlbnVtcy5UZXN0RW51bVtdIGJhcigpOyIpOwpAQCAtNTg3LDYgKzg0MCw0NiBAQAogCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsiZW51bXMuVGVzdEVudW0uWFhYIiwgImVudW1zLlRlc3RFbnVtLllZWSJ9LCBhZWEuZ2V0VmFsdWUoKSkpOwogCX0KIAorCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZUVudW1BcnJheUludmFsaWRFbnRyeSgpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLmNyZWF0ZUVudW0oIlRlc3RFbnVtIiwgIlhYWCwgWVlZLCBaWloiKTsKKwkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImVudW1zLlRlc3RFbnVtW10gYmFyKCk7Iik7CisJCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPXtlbnVtcy5UZXN0RW51bS5YWFgsIDg4fSkiKTsKKwkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7CisJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhID0gbmV3IEVudW1BcnJheURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGRhYSwgImJhciIpOworCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGFlYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KHRoaXMuaWRGaWVsZCgpLCBkYWVhKTsKKwkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ImVudW1zLlRlc3RFbnVtLlhYWCIsIG51bGx9LCBhZWEuZ2V0VmFsdWUoKSkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZUVudW1BcnJheUVtcHR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMuY3JlYXRlRW51bSgiVGVzdEVudW0iLCAiWFhYLCBZWVksIFpaWiIpOworCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiZW51bXMuVGVzdEVudW1bXSBiYXIoKTsiKTsKKwkJdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9e30pIik7CisJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOworCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gZGFlYSA9IG5ldyBFbnVtQXJyYXlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIiKTsKKwkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPih0aGlzLmlkRmllbGQoKSwgZGFlYSk7CisJCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nWzBdLCBhZWEuZ2V0VmFsdWUoKSkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZUVudW1BcnJheVNpbmdsZUVsZW1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdGhpcy5jcmVhdGVFbnVtKCJUZXN0RW51bSIsICJYWFgsIFlZWSwgWlpaIik7CisJCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJlbnVtcy5UZXN0RW51bVtdIGJhcigpOyIpOworCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj1lbnVtcy5UZXN0RW51bS5YWFgpIik7CisJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOworCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gZGFlYSA9IG5ldyBFbnVtQXJyYXlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIiKTsKKwkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPih0aGlzLmlkRmllbGQoKSwgZGFlYSk7CisJCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyJlbnVtcy5UZXN0RW51bS5YWFgifSwgYWVhLmdldFZhbHVlKCkpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWVFbnVtQXJyYXlTaW5nbGVFbGVtZW50SW52YWxpZCgpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLmNyZWF0ZUVudW0oIlRlc3RFbnVtIiwgIlhYWCwgWVlZLCBaWloiKTsKKwkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImVudW1zLlRlc3RFbnVtW10gYmFyKCk7Iik7CisJCXRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPVwiXCIpIik7CisJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOworCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gZGFlYSA9IG5ldyBFbnVtQXJyYXlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIiKTsKKwkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPih0aGlzLmlkRmllbGQoKSwgZGFlYSk7CisJCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10ge251bGx9LCBhZWEuZ2V0VmFsdWUoKSkpOworCX0KKwogCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZU51bGxFbnVtQXJyYXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJdGhpcy5jcmVhdGVFbnVtKCJUZXN0RW51bSIsICJYWFgsIFlZWSwgWlpaIik7CiAJCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJlbnVtcy5UZXN0RW51bVtdIGJhcigpOyIpOwpAQCAtNTk0LDcgKzg4Nyw3IEBACiAJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwogCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gZGFlYSA9IG5ldyBFbnVtQXJyYXlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIiKTsKIAkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPih0aGlzLmlkRmllbGQoKSwgZGFlYSk7Ci0JCWFzc2VydE51bGwoYWVhLmdldFZhbHVlKCkpOworCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1swXSwgYWVhLmdldFZhbHVlKCkpKTsKIAl9CiAKIAlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVFbnVtQXJyYXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTYxMiw0ICs5MDUsNDQgQEAKIAkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhhbm5vdGF0aW9uKTsKIAl9CiAKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVFbnVtQXJyYXlFbXB0eVJlbW92ZSgpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLmNyZWF0ZUVudW0oIlRlc3RFbnVtIiwgIlhYWCwgWVlZLCBaWloiKTsKKwkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImVudW1zLlRlc3RFbnVtW10gYmFyKCk7Iik7CisJCVN0cmluZyBhbm5vdGF0aW9uID0gIkBGb28iOworCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7CisJCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oYW5ub3RhdGlvbik7CisJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOworCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gZGFlYSA9IG5ldyBFbnVtQXJyYXlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIiKTsKKwkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPih0aGlzLmlkRmllbGQoKSwgZGFlYSk7CisJCWFlYS5zZXRWYWx1ZShuZXcgU3RyaW5nWzBdKTsKKwkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihhbm5vdGF0aW9uKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVFbnVtQXJyYXlFbXB0eSgpIHRocm93cyBFeGNlcHRpb24geworCQl0aGlzLmNyZWF0ZUVudW0oIlRlc3RFbnVtIiwgIlhYWCwgWVlZLCBaWloiKTsKKwkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImVudW1zLlRlc3RFbnVtW10gYmFyKCk7Iik7CisJCVN0cmluZyBhbm5vdGF0aW9uID0gIkBGb28oYmFyPXt9KSI7CisJCXRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKKwkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihhbm5vdGF0aW9uKTsKKwkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7CisJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhID0gbmV3IEVudW1BcnJheURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGRhYSwgImJhciIsIHRydWUsIGZhbHNlKTsKKwkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBhZWEgPSBuZXcgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPih0aGlzLmlkRmllbGQoKSwgZGFlYSk7CisJCWFlYS5zZXRWYWx1ZShuZXcgU3RyaW5nWzBdKTsKKwkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhhbm5vdGF0aW9uKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVFbnVtQXJyYXlTaW5nbGVFbGVtZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRoaXMuY3JlYXRlRW51bSgiVGVzdEVudW0iLCAiWFhYLCBZWVksIFpaWiIpOworCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiZW51bXMuVGVzdEVudW1bXSBiYXIoKTsiKTsKKwkJU3RyaW5nIGFubm90YXRpb24gPSAiQEZvbyhiYXI9WFhYKSI7CisJCXRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKKwkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihhbm5vdGF0aW9uKTsKKwkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7CisJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhID0gbmV3IEVudW1BcnJheURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGRhYSwgImJhciIpOworCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGFlYSA9IG5ldyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KHRoaXMuaWRGaWVsZCgpLCBkYWVhKTsKKwkJYWVhLnNldFZhbHVlKG5ldyBTdHJpbmdbXSB7ImVudW1zLlRlc3RFbnVtLlhYWCJ9KTsKKwkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiaW1wb3J0IHN0YXRpYyBlbnVtcy5UZXN0RW51bS5YWFg7Iik7CisJCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoYW5ub3RhdGlvbik7CisJfQorCiB9CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzLy5jbGFzc3BhdGggYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy8uY3ZzaWdub3JlIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTA3N2E0Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy8ucHJvamVjdCBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1YjAxMjcuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5kYi50ZXN0czwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIwMWFjYS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cwotQnVuZGxlLVZlcnNpb246IDEuMC4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzLmludGVybmFsLkpwdERiVGVzdHNQbHVnaW4KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRWNsaXBzZS1MYXp5U3RhcnQ6IGZhbHNlCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5qdW5pdCwKLSBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LAotIG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuZGIuZ2VuZXJpYywKLSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eSwKLSBvcmcuZWNsaXBzZS5qcHQuZGIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMuaW50ZXJuYWwucGxhdGZvcm1zCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkMGQwMTAuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyAgQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gCi0jICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSMgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKLSMgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotIyAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgIAotIyAgQ29udHJpYnV0b3JzOiAKLSMgIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9jb25maWcvZGVyYnkxMDEucHJvcGVydGllcyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvY29uZmlnL2RlcmJ5MTAxLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxMDE0MTMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9jb25maWcvZGVyYnkxMDEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIAotIyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0jICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCi0jICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSMgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jICAKLSMgIENvbnRyaWJ1dG9yczogCi0jICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jICBQbGF0Zm9ybSBQcm9wZXJ0eSBuYW1lcyAmIERlZmF1bHQKLSMKLSMgIHByb2ZpbGVOYW1lICAtIGpwYXRlc3QKLSMgIHByb2ZpbGVEZXNjcmlwdGlvbiAgLSBKREJDIFByb2ZpbGUgZm9yIEpQQSBUZXN0aW5nCi0jICB1c2VyTmFtZSAgLSBqcGF0ZXN0Ci0jICB1c2VyUGFzc3dvcmQgIC0gKGVtcHR5KQotIyAgZGF0YWJhc2Vkcml2ZXJKYXJMaXN0ICAtIChtYW5kYXRvcnkpCi0jICBkYXRhYmFzZU5hbWUgIC0gdGVzdGRiCi0jICBkYXRhYmFzZVVybCAgLSAobWFuZGF0b3J5KQotIyAKLXByb2ZpbGVOYW1lID0gZGVyYnkxMDEKLXByb2ZpbGVEZXNjcmlwdGlvbiA9IERlcmJ5ICBFbWJlZGRlZCBKREJDIFByb2ZpbGUgZm9yIFRlc3RpbmcKLSMgc2V0IHVzZXIgbmFtZQotdXNlck5hbWUgPSBqcGF0ZXN0Ci11c2VyUGFzc3dvcmQgPQotIyBzZXQgcGF0aCB0byBEZXJieSBkcml2ZXIgaGVyZSAoZXhhbXBsZTogZGF0YWJhc2Vkcml2ZXJKYXJMaXN0ID0gYzovZGVyYnlkYi9saWIvZGVyYnkuamFyICkKLWRhdGFiYXNlZHJpdmVySmFyTGlzdCA9IAotZGF0YWJhc2VOYW1lID0gdGVzdGRiCi0jIHNldCBkYXRhYmFzZSBVUkwgaGVyZSAoZXhhbXBsZTogZGF0YWJhc2VVcmwgPSBqZGJjOmRlcmJ5OmM6L2RlcmJ5ZGIvdGVzdGRiO2NyZWF0ZT10cnVlICkgIAotZGF0YWJhc2VVcmwgPQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9jb25maWcvb3JhY2xlMTBnLnByb3BlcnRpZXMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL2NvbmZpZy9vcmFjbGUxMGcucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk4ZmM3ZC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL2NvbmZpZy9vcmFjbGUxMGcucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIAotIyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0jICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCi0jICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSMgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jICAKLSMgIENvbnRyaWJ1dG9yczogCi0jICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jICBQbGF0Zm9ybSBQcm9wZXJ0eSBuYW1lcyAmIERlZmF1bHQKLSMKLSMgIHByb2ZpbGVOYW1lICAtIGpwYXRlc3QKLSMgIHByb2ZpbGVEZXNjcmlwdGlvbiAgLSBKREJDIFByb2ZpbGUgZm9yIEpQQSBUZXN0aW5nCi0jICB1c2VyTmFtZSAgLSBqcGF0ZXN0Ci0jICB1c2VyUGFzc3dvcmQgIC0gKGVtcHR5KQotIyAgZGF0YWJhc2Vkcml2ZXJKYXJMaXN0ICAtIGphciBsaXN0IHNlcGFyYXRlIGJ5IGNvbW1hIChtYW5kYXRvcnkpIAotIyAgZGF0YWJhc2VOYW1lICAtIHRlc3RkYgotIyAgZGF0YWJhc2VVcmwgIC0gKG1hbmRhdG9yeSkKLSMKLXByb2ZpbGVOYW1lID0gb3JhY2xlWEUxMGcKLXByb2ZpbGVEZXNjcmlwdGlvbiA9IFhFIDEwZyBSZWxlYXNlIDIgKDEwLjIpIFRoaW4gSkRCQyBQcm9maWxlIGZvciBUZXN0aW5nCi11c2VyTmFtZSA9IHNjb3R0Ci11c2VyUGFzc3dvcmQgPSB0aWdlcgotIyBzZXQgcGF0aCB0byBPcmFjbGUgZHJpdmVyIGhlcmUgKGV4YW1wbGU6IGRhdGFiYXNlZHJpdmVySmFyTGlzdCA9IGM6L29yYWNsZS9qZGJjL2xpYi9vamRiYzE0LmphciApCi1kYXRhYmFzZWRyaXZlckphckxpc3QgPSAKLWRhdGFiYXNlTmFtZSA9IHRlc3RkYgotIyBzZXQgZGF0YWJhc2UgVVJMIGhlcmUgKGV4YW1wbGU6IGRhdGFiYXNlVXJsID0gamRiYzpvcmFjbGU6dGhpbjpAbG9jYWxob3N0OjE1MjE6dGVzdGRiICkgIAotZGF0YWJhc2VVcmwgPSAKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvY29uZmlnL29yYWNsZTlpLnByb3BlcnRpZXMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL2NvbmZpZy9vcmFjbGU5aS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjA3OTE5Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvY29uZmlnL29yYWNsZTlpLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jICBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiAKLSMgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotIyAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAotIyAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0jICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAgCi0jICBDb250cmlidXRvcnM6IAotIyAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyAgUGxhdGZvcm0gUHJvcGVydHkgbmFtZXMgJiBEZWZhdWx0Ci0jCi0jICBwcm9maWxlTmFtZSAgLSBqcGF0ZXN0Ci0jICBwcm9maWxlRGVzY3JpcHRpb24gIC0gSkRCQyBQcm9maWxlIGZvciBKUEEgVGVzdGluZwotIyAgdXNlck5hbWUgIC0ganBhdGVzdAotIyAgdXNlclBhc3N3b3JkICAtIChlbXB0eSkKLSMgIGRhdGFiYXNlZHJpdmVySmFyTGlzdCAgLSBqYXIgbGlzdCBzZXBhcmF0ZSBieSBjb21tYSAobWFuZGF0b3J5KSAKLSMgIGRhdGFiYXNlTmFtZSAgLSB0ZXN0ZGIKLSMgIGRhdGFiYXNlVXJsICAtIChtYW5kYXRvcnkpCi0jCi1wcm9maWxlTmFtZSA9IG9yYWNsZTlpCi1wcm9maWxlRGVzY3JpcHRpb24gPSBPcmFjbGUgVGhpbiBKREJDIFByb2ZpbGUgZm9yIFRlc3RpbmcKLXVzZXJOYW1lID0gc2NvdHQKLXVzZXJQYXNzd29yZCA9IHRpZ2VyCi0jIHNldCBwYXRoIHRvIE9yYWNsZSBkcml2ZXIgaGVyZSAoZXhhbXBsZTogZGF0YWJhc2Vkcml2ZXJKYXJMaXN0ID0gYzovb3JhY2xlL2pkYmMvbGliL29qZGJjMTQuamFyICkKLWRhdGFiYXNlZHJpdmVySmFyTGlzdCA9Ci1kYXRhYmFzZU5hbWUgPSB0ZXN0ZGIKLSMgc2V0IGRhdGFiYXNlIFVSTCBoZXJlIChleGFtcGxlOiBkYXRhYmFzZVVybCA9IGpkYmM6b3JhY2xlOnRoaW46QHNlcnZlcjoxNTIxOnRlc3RkYiApICAKLWRhdGFiYXNlVXJsID0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvY29uZmlnL3NxbHNlcnZlcjIwMDUucHJvcGVydGllcyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvY29uZmlnL3NxbHNlcnZlcjIwMDUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ1MTM1MS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL2NvbmZpZy9zcWxzZXJ2ZXIyMDA1LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jICBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiAKLSMgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotIyAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAotIyAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0jICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAgCi0jICBDb250cmlidXRvcnM6IAotIyAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyAgUGxhdGZvcm0gUHJvcGVydHkgbmFtZXMgJiBEZWZhdWx0Ci0jCi0jICBwcm9maWxlTmFtZSAgLSBqcGF0ZXN0Ci0jICBwcm9maWxlRGVzY3JpcHRpb24gIC0gSkRCQyBQcm9maWxlIGZvciBKUEEgVGVzdGluZwotIyAgdXNlck5hbWUgIC0ganBhdGVzdAotIyAgdXNlclBhc3N3b3JkICAtIChlbXB0eSkKLSMgIGRhdGFiYXNlZHJpdmVySmFyTGlzdCAgLSAobWFuZGF0b3J5KQotIyAgZGF0YWJhc2VOYW1lICAtIHRlc3RkYgotIyAgZGF0YWJhc2VVcmwgIC0gKG1hbmRhdG9yeSkKLSMgCi1wcm9maWxlTmFtZSA9IHNxbHNlcnZlcjIwMDUKLXByb2ZpbGVEZXNjcmlwdGlvbiA9IE1TIFNRTCBTZXJ2ZXIgMjAwNSBKREJDIFByb2ZpbGUgZm9yIFRlc3RpbmcKLSMgc2V0IHVzZXIgbmFtZQotdXNlck5hbWUgPSAKLXVzZXJQYXNzd29yZCA9IAotIyBzZXQgcGF0aCB0byBEZXJieSBkcml2ZXIgaGVyZSAoZXhhbXBsZTogZGF0YWJhc2Vkcml2ZXJKYXJMaXN0ID0gYzovc3Fsc2VydmVyL2xpYi9zcWxqZGJjLmphciApCi1kYXRhYmFzZWRyaXZlckphckxpc3QgPSAKLWRhdGFiYXNlTmFtZSA9IHRlc3RkYgotIyBzZXQgZGF0YWJhc2UgVVJMIGhlcmUgKGV4YW1wbGU6IGRhdGFiYXNlVXJsID0gamRiYzpzcWxzZXJ2ZXI6Ly9sb2NhbGhvc3Q6MTQzMztkYXRhYmFzZU5hbWU9dGVzdGRiICkgIAotZGF0YWJhc2VVcmwgPSAKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDRmZTI3Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jICBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiAKLSMgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotIyAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAotIyAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0jICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAgCi0jICBDb250cmlidXRvcnM6IAotIyAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUbyBjb2RlIGRldmVsb3BlcjoKLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1wbHVnaW5OYW1lID0gSlBBIERCIFRlc3RzCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwotCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvSnB0RGJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL0pwdERiVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMyNmVhMy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvSnB0RGJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IGp1bml0LnN3aW5ndWkuVGVzdFJ1bm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMuaW50ZXJuYWwucGxhdGZvcm1zLkFsbFBsYXRmb3JtVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ2xhc3NUb29sczsKLQotLyoqCi0gKiAgSnB0RGJUZXN0cwotICovCi1wdWJsaWMgY2xhc3MgSnB0RGJUZXN0cyB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiggU3RyaW5nW10gYXJncykgewotICAgICAgICBUZXN0UnVubmVyLm1haW4oIG5ldyBTdHJpbmdbXSB7ICItYyIsIEpwdERiVGVzdHMuY2xhc3MuZ2V0TmFtZSgpfSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSggQ2xhc3NUb29scy5wYWNrYWdlTmFtZUZvciggSnB0RGJUZXN0cy5jbGFzcykpOwotICAgIAotICAgICAgICBzdWl0ZS5hZGRUZXN0KCBBbGxQbGF0Zm9ybVRlc3RzLnN1aXRlKCkpOwotICAgIAotICAgICAgICByZXR1cm4gc3VpdGU7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgSnB0RGJUZXN0cygpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL0pwdERiVGVzdHNQbHVnaW4uamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9KcHREYlRlc3RzUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmY2VkMzQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL0pwdERiVGVzdHNQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqICBKcHREYlRlc3RzUGx1Z2luCi0gKi8KLXB1YmxpYyBjbGFzcyBKcHREYlRlc3RzUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKLQlwcml2YXRlIHN0YXRpYyBKcHREYlRlc3RzUGx1Z2luIHBsdWdpbjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9JRCA9ICJvcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpwdERiVGVzdHNQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEpwdERiVGVzdHNQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHVwb24gcGx1Zy1pbiBhY3RpdmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHBsdWctaW4gaXMgc3RvcHBlZAotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcGx1Z2luID0gbnVsbDsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL0FsbFBsYXRmb3JtVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvQWxsUGxhdGZvcm1UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjljNDIzLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvQWxsUGxhdGZvcm1UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy5pbnRlcm5hbC5wbGF0Zm9ybXM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IGp1bml0LnN3aW5ndWkuVGVzdFJ1bm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5DbGFzc1Rvb2xzOwotCi0vKioKLSAqICBBbGxQbGF0Zm9ybVRlc3RzCi0gKi8KLXB1YmxpYyBjbGFzcyBBbGxQbGF0Zm9ybVRlc3RzIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIFRlc3RSdW5uZXIubWFpbiggbmV3IFN0cmluZ1tdIHsgIi1jIiwgIEFsbFBsYXRmb3JtVGVzdHMuY2xhc3MuZ2V0TmFtZSgpfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCBDbGFzc1Rvb2xzLnBhY2thZ2VOYW1lRm9yKCBBbGxQbGF0Zm9ybVRlc3RzLmNsYXNzKSk7Ci0KLSAgICAgICAgLy8gVE9ETyAtIFVuY29tbWVudCB0aGUgcGxhdGZvcm0gdG8gdGVzdC4KLS8vICAgICAgICBzdWl0ZS5hZGRUZXN0KCBEZXJieTEwMVRlc3RzLnN1aXRlKCkpOwotLy8gICAgICAgIHN1aXRlLmFkZFRlc3QoIE9yYWNsZTlpVGVzdHMuc3VpdGUoKSk7Ci0vLyAgICAgICAgc3VpdGUuYWRkVGVzdCggT3JhY2xlMTBnVGVzdHMuc3VpdGUoKSk7Ci0vLyAgICAgICAgc3VpdGUuYWRkVGVzdCggU1FMU2VydmVyMjAwNVRlc3RzLnN1aXRlKCkpOwotCi0gICAgICAgIHJldHVybiBzdWl0ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEFsbFBsYXRmb3JtVGVzdHMoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9EVFBQbGF0Zm9ybVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL0RUUFBsYXRmb3JtVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZkZWZmYy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL0RUUFBsYXRmb3JtVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IC0gMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy5pbnRlcm5hbC5wbGF0Zm9ybXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuQ29ubmVjdGlvblByb2ZpbGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5JQ29ubmVjdGlvblByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5Qcm9maWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmRiLmdlbmVyaWMuSURCRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmRyaXZlcnMuSURyaXZlck1nbXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5kcml2ZXJzLklQcm9wZXJ0eVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmRyaXZlcnMuUHJvcGVydHlTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuZHJpdmVycy5YTUxGaWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmludGVybmFsLkNvbm5lY3Rpdml0eVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwuQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwuQ29ubmVjdGlvblByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLkNvbm5lY3Rpb25Qcm9maWxlUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwuRFRQQ29ubmVjdGlvblByb2ZpbGVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC5EYXRhYmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwuU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5pbnRlcm5hbC5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMuaW50ZXJuYWwuSnB0RGJUZXN0c1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogIEJhc2UgY2xhc3MgZm9yIGFsbCBzdXBwb3J0ZWQgRFRQIHBsYXRmb3JtLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRFRQUGxhdGZvcm1UZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHByb3RlY3RlZCBDb25uZWN0aW9uUHJvZmlsZVJlcG9zaXRvcnkgY29ubmVjdGlvblJlcG9zaXRvcnk7Ci0gICAgCi0gICAgcHJpdmF0ZSBQcm9wZXJ0aWVzIHBsYXRmb3JtUHJvcGVydGllczsKLQlwcml2YXRlIFN0cmluZyBjdXJyZW50RGJWZW5kb3I7Ci0JcHJpdmF0ZSBTdHJpbmcgY3VycmVudERiVmVyc2lvbjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTEFURk9STV9DT05GSUdfRElSRUNUT1JZID0gImNvbmZpZyI7CS8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPRklMRV9OQU1FX1BST1BFUlRZID0gInByb2ZpbGVOYW1lIjsJLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9GSUxFX0RFU0NSSVBUSU9OX1BST1BFUlRZID0gInByb2ZpbGVEZXNjcmlwdGlvbiI7CS8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9OQU1FX1BST1BFUlRZID0gInVzZXJOYW1lIjsJLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX1BBU1NXT1JEX1BST1BFUlRZID0gInVzZXJQYXNzd29yZCI7CS8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREJfRFJJVkVSX0pBUl9QUk9QRVJUWSA9ICJkYXRhYmFzZWRyaXZlckphckxpc3QiOwkvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERCX05BTUVfUFJPUEVSVFkgPSAiZGF0YWJhc2VOYW1lIjsJLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEQl9VUkxfUFJPUEVSVFkgPSAiZGF0YWJhc2VVcmwiOwkvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0ZJTEVfTkFNRV9ERUZBVUxUID0gImpwYXRlc3QiOwkvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0ZJTEVfREVTQ1JJUFRJT05fREVGQVVMVCA9ICJKREJDIFByb2ZpbGUgZm9yIEpQQSBUZXN0aW5nIjsJLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX05BTUVfREVGQVVMVCA9ICJ1c2VyTmFtZSI7CS8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9QQVNTV09SRF9ERUZBVUxUID0gIiI7CS8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREJfTkFNRV9ERUZBVUxUID0gInRlc3RkYiI7CS8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlTU0lOR19QUk9QRVJUWV9NRVNTQUdFID0gIkVudGVyIG1pc3NpbmcgcHJvcGVydHkgaW4gcGxhdGZvcm0gY29uZmlnIGZpbGUgKGNvbmZpZy9kYXRhYmFzZS5wcm9wZXJ0aWVzKSI7CQotCi0gICAgcHVibGljIERUUFBsYXRmb3JtVGVzdHMoIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKCBuYW1lKTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMuY29ubmVjdGlvblJlcG9zaXRvcnkgPSBDb25uZWN0aW9uUHJvZmlsZVJlcG9zaXRvcnkuaW5zdGFuY2UoKTsKLSAgICB9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICB0aGlzLmNvbm5lY3Rpb25SZXBvc2l0b3J5LmluaXRpYWxpemVMaXN0ZW5lcnMoKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCB0aGlzLnBsYXRmb3JtSXNOZXcoKSkgewotICAgICAgICAJdGhpcy5sb2FkUGxhdGZvcm1Qcm9wZXJ0aWVzKCk7Ci0gICAgICAgIAkKLSAgICAgICAgCXRoaXMuYnVpbGREcml2ZXJEZWZpbml0aW9uRmlsZSggSURyaXZlck1nbXRDb25zdGFudHMuRFJJVkVSX0ZJTEUpOwotICAgICAgICAJdGhpcy5idWlsZENvbm5lY3Rpb25Qcm9maWxlKCB0aGlzLnByb2ZpbGVOYW1lKCkpOwotICAgICAgICAJdGhpcy5jdXJyZW50RGJWZW5kb3IgPSB0aGlzLmRhdGFiYXNlVmVuZG9yKCk7Ci0gICAgICAgIAl0aGlzLmN1cnJlbnREYlZlcnNpb24gPSB0aGlzLmRhdGFiYXNlVmVyc2lvbigpOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMudmVyaWZ5UHJvZmlsZU5hbWVkKCB0aGlzLnByb2ZpbGVOYW1lKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7Ci0gICAgICAgIAotICAgICAgICB0aGlzLmNvbm5lY3Rpb25SZXBvc2l0b3J5LmRpc3Bvc2VMaXN0ZW5lcnMoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHRlc3RzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RDb25uZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJdGhpcy5jb25uZWN0KCk7Ci0JCQotICAgICAgICB0aGlzLnZlcmlmeURhdGFiYXNlVmVyc2lvbk51bWJlcigpOwotICAgICAgICB0aGlzLnZlcmlmeUNvbm5lY3Rpb24oKTsKLSAgICAgICAgdGhpcy52ZXJpZnlEYXRhYmFzZUNvbnRlbnQoKTsKLQotICAgICAgICB0aGlzLmRpc2Nvbm5lY3QoKTsKLSAgICB9Ci0gICAgCi0JcHVibGljIHZvaWQgdGVzdEdldFByb2ZpbGVzKCkgewotCQkvLyBHZXR0aW5nIHRoZSBwcm9maWxlIGRpcmVjdGx5IGZyb20gRFRQIFByb2ZpbGVNYW5hZ2VyCi0JCUlDb25uZWN0aW9uUHJvZmlsZVtdIHByb2ZpbGVzID0gUHJvZmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRQcm9maWxlcygpOwotCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCggcHJvZmlsZXMpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZSggcHJvZmlsZXMubGVuZ3RoID4gMCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFByb2ZpbGVzQnlQcm92aWRlcigpIHsKLQkJLy8gR2V0IFByb2ZpbGVzIEJ5IFByb3ZpZGVySUQKLQkJSUNvbm5lY3Rpb25Qcm9maWxlW10gcHJvZmlsZXMgPSBQcm9maWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldFByb2ZpbGVCeVByb3ZpZGVySUQoIHRoaXMuZ2V0UHJvZmlsZSgpLmdldFByb3ZpZGVySWQoKSk7Ci0JCUFzc2VydC5hc3NlcnROb3ROdWxsKCBwcm9maWxlcyk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKCBwcm9maWxlcy5sZW5ndGggPiAwKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFByb2ZpbGVCeU5hbWUoKSB7Ci0JCS8vIEdldCBQcm9maWxlIEJ5IE5hbWUKLQkJSUNvbm5lY3Rpb25Qcm9maWxlIGR0cFByb2ZpbGUgPSBQcm9maWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldFByb2ZpbGVCeU5hbWUoIHRoaXMucHJvZmlsZU5hbWUoKSk7Ci0JCUFzc2VydC5hc3NlcnROb3ROdWxsKCBkdHBQcm9maWxlKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoIGR0cFByb2ZpbGUuZ2V0TmFtZSgpLmVxdWFscyggdGhpcy5wcm9maWxlTmFtZSgpKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRQcm9maWxlQnlJbnN0YW5jZUlkKCkgewotCQkvLyBHZXQgUHJvZmlsZSBCeSBJbnN0YW5jZUlECi0JCUlDb25uZWN0aW9uUHJvZmlsZSBkdHBQcm9maWxlID0gUHJvZmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRQcm9maWxlQnlJbnN0YW5jZUlEKCB0aGlzLmdldFByb2ZpbGUoKS5nZXRJbnN0YW5jZUlkKCkpOwotCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCggZHRwUHJvZmlsZSk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKCBkdHBQcm9maWxlLmdldE5hbWUoKS5lcXVhbHMoIHRoaXMucHJvZmlsZU5hbWUoKSkpOwotCX0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgdGVzdHMgKioqKioqKioqKgotCi0gICAgcHJpdmF0ZSB2b2lkIHZlcmlmeURhdGFiYXNlVmVyc2lvbk51bWJlcigpIHsKLSAgICAJRGF0YWJhc2UgZGF0YWJhc2UgPSB0aGlzLmdldFByb2ZpbGUoKS5nZXREYXRhYmFzZSgpOwotICAgIAlBc3NlcnQuYXNzZXJ0Tm90TnVsbCggZGF0YWJhc2UpOwotICAgIAkKLSAgICAgICAgU3RyaW5nIGFjdHVhbFZlcnNpb25OdW1iZXIgPSBkYXRhYmFzZS5nZXRWZXJzaW9uKCk7Ci0gICAgICAgIFN0cmluZyBleHBlY3RlZFZlcnNpb25OdW1iZXIgPSB0aGlzLmRhdGFiYXNlVmVyc2lvbigpOwotICAgICAgICBTdHJpbmcgZXJyb3JNZXNzYWdlID0gIkV4cGVjdGVkIHZlcnNpb24gbnVtYmVyOiAiICsgZXhwZWN0ZWRWZXJzaW9uTnVtYmVyICsgIiBidXQgdGhlIGFjdHVhbCB2ZXJzaW9uIG51bWJlciB3YXM6ICIgKyBhY3R1YWxWZXJzaW9uTnVtYmVyOwotICAgICAgICBhc3NlcnRUcnVlKCBlcnJvck1lc3NhZ2UsIGFjdHVhbFZlcnNpb25OdW1iZXIuaW5kZXhPZiggZXhwZWN0ZWRWZXJzaW9uTnVtYmVyKSAhPSAtMSk7Ci0KLSAgICAgICAgU3RyaW5nIGFjdHVhbFZlbmRvciA9IGRhdGFiYXNlLmdldFZlbmRvcigpOwotICAgICAgICBTdHJpbmcgZXhwZWN0ZWRWZW5kb3IgPSB0aGlzLmRhdGFiYXNlVmVuZG9yKCk7Ci0gICAgICAgIGVycm9yTWVzc2FnZSA9ICJFeHBlY3RlZCB2ZW5kb3I6ICIgKyBleHBlY3RlZFZlbmRvciArICIgYnV0IHRoZSBhY3R1YWwgdmVuZG9yIHdhczogIiArIGFjdHVhbFZlbmRvcjsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBlcnJvck1lc3NhZ2UsIGFjdHVhbFZlbmRvciwgZXhwZWN0ZWRWZW5kb3IpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgdmVyaWZ5Q29ubmVjdGlvbigpIHsKLSAgICAJQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gdGhpcy5nZXRQcm9maWxlKCkuZ2V0Q29ubmVjdGlvbigpOwotICAgIAlBc3NlcnQuYXNzZXJ0Tm90TnVsbCggY29ubmVjdGlvbik7Ci0KLSAgICAgICAgU3RyaW5nIGFjdHVhbEZhY3RvcnkgPSBjb25uZWN0aW9uLmdldEZhY3RvcnlJZCgpOwotICAgICAgICBTdHJpbmcgZXhwZWN0ZWRGYWN0b3J5ID0gRFRQQ29ubmVjdGlvblByb2ZpbGVXcmFwcGVyLkNPTk5FQ1RJT05fVFlQRTsKLSAgICAJU3RyaW5nIGVycm9yTWVzc2FnZSA9ICJFeHBlY3RlZCBmYWN0b3J5OiAiICsgZXhwZWN0ZWRGYWN0b3J5ICsgIiBidXQgdGhlIGFjdHVhbCBmYWN0b3J5IHdhczogIiArIGFjdHVhbEZhY3Rvcnk7Ci0gICAgCWFzc2VydEVxdWFscyggZXJyb3JNZXNzYWdlLCBhY3R1YWxGYWN0b3J5LCBleHBlY3RlZEZhY3RvcnkpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgdmVyaWZ5RGF0YWJhc2VDb250ZW50KCkgewotICAgIAlEYXRhYmFzZSBkYXRhYmFzZSA9IHRoaXMuZ2V0UHJvZmlsZSgpLmdldERhdGFiYXNlKCk7Ci0gICAgCUFzc2VydC5hc3NlcnRUcnVlKCBkYXRhYmFzZS5zY2hlbWF0YVNpemUoKSA+IDApOwotCQkKLSAgICAgICAgU2NoZW1hIHNjaGVtYSA9IGRhdGFiYXNlLnNjaGVtYU5hbWVkKCB0aGlzLmdldFByb2ZpbGUoKS5nZXRVc2VyTmFtZSgpKTsKLQkJaWYoIHNjaGVtYSAhPSBudWxsKSB7Ci0JCQlBc3NlcnQuYXNzZXJ0VHJ1ZSggc2NoZW1hLnNlcXVlbmNlc1NpemUoKSA+PSAwKTsKLQkJCQotCQkJT2JqZWN0W10gdGFibGVOYW1lcyA9IENvbGxlY3Rpb25Ub29scy5hcnJheSggc2NoZW1hLnRhYmxlTmFtZXMoKSk7Ci0JCQlpZiggdGFibGVOYW1lcy5sZW5ndGggPj0gMSkgewotCQkJCVRhYmxlIHRhYmxlID0gc2NoZW1hLnRhYmxlTmFtZWQoKCBTdHJpbmcpdGFibGVOYW1lc1sgMF0pOwotCQkJCUFzc2VydC5hc3NlcnRUcnVlKCB0YWJsZS5jb2x1bW5zU2l6ZSgpID49IDApOwotCQkJCUFzc2VydC5hc3NlcnRUcnVlKCB0YWJsZS5mb3JlaWduS2V5Q29sdW1uc1NpemUoKSA+PSAwKTsKLQkJCQlBc3NlcnQuYXNzZXJ0VHJ1ZSggdGFibGUuZm9yZWlnbktleXNTaXplKCkgPj0gMCk7Ci0JCQkJQXNzZXJ0LmFzc2VydFRydWUoIHRhYmxlLnByaW1hcnlLZXlDb2x1bW5zU2l6ZSgpID49IDApOwotCQkJfQotCQl9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHZlcmlmeVByb2ZpbGVOYW1lZCggU3RyaW5nIHByb2ZpbGVOYW1lKSB7Ci0gICAgCQotICAgIAlDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlID0gdGhpcy5nZXRQcm9maWxlTmFtZWQoIHByb2ZpbGVOYW1lKTsKLSAgICAJQXNzZXJ0LmFzc2VydFRydWUoICJDb25uZWN0aW9uUHJvZmlsZSBub3QgZm91bmQiLCBwcm9maWxlTmFtZS5lcXVhbHMoIHByb2ZpbGUuZ2V0TmFtZSgpKSk7Ci0gICAgfQotCi0JLy8gKioqKiogUGxhdGZvcm0gc3BlY2lmaWMgYmVoYXZpb3IgKioqKioKLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZGF0YWJhc2VWZW5kb3IoKTsKLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGRhdGFiYXNlVmVyc2lvbigpOwotCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBkcml2ZXJOYW1lKCk7Ci0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBkcml2ZXJEZWZpbml0aW9uVHlwZSgpOwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZHJpdmVyRGVmaW5pdGlvbklkKCk7Ci0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBkcml2ZXJDbGFzcygpOwotCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRDb25maWdOYW1lKCk7Ci0KLQkvLyAqKioqKiBCZWhhdmlvciAqKioqKgotCi0gICAgcHJvdGVjdGVkIHZvaWQgY29ubmVjdCgpIHsKLQotICAgICAgICB0aGlzLmdldFByb2ZpbGUoKS5jb25uZWN0KCk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKCAiQ29ubmVjdCBmYWlsZWQuIiwgdGhpcy5nZXRQcm9maWxlKCkuaXNDb25uZWN0ZWQoKSk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGRpc2Nvbm5lY3QoKSB7Ci0gICAgCQotICAgIAl0aGlzLmdldFByb2ZpbGUoKS5kaXNjb25uZWN0KCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZSggIkRpc2Nvbm5lY3QgZmFpbGVkLiIsIHRoaXMuZ2V0UHJvZmlsZSgpLmlzQ29ubmVjdGVkKCkpOwotICAgIH0KLSAgICAKLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0gICAgcHJvdGVjdGVkIFNjaGVtYSBnZXRTY2hlbWFOYW1lZCggU3RyaW5nIHNjaGVtYU5hbWUpIHsgCi0KLQkgICAgcmV0dXJuIHRoaXMuZ2V0UHJvZmlsZSgpLmdldERhdGFiYXNlKCkuc2NoZW1hTmFtZWQoIHNjaGVtYU5hbWUpOwotICAgIH0KLQkKLSAgICBwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZXRUYWJsZXMoKSB7Ci0JCQotICAgICAgICBTY2hlbWEgc2NoZW1hID0gdGhpcy5nZXRTY2hlbWFOYW1lZCggdGhpcy5nZXRQcm9maWxlKCkuZ2V0VXNlck5hbWUoKSk7Ci0JCWlmKCBzY2hlbWEgPT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oIHNjaGVtYS50YWJsZXMoKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFRhYmxlIGdldFRhYmxlTmFtZWQoIFN0cmluZyB0YWJsZU5hbWUpIHsgCi0KLQkgICAgU2NoZW1hIHNjaGVtYSA9ICB0aGlzLmdldFNjaGVtYU5hbWVkKCB0aGlzLmdldFByb2ZpbGUoKS5nZXRVc2VyTmFtZSgpKTsKLQkgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoIHNjaGVtYSk7Ci0JCi0JCXJldHVybiBzY2hlbWEudGFibGVOYW1lZCggdGFibGVOYW1lKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHByb3ZpZGVySWQoKSB7Ci0gICAgICAgIHJldHVybiBEVFBDb25uZWN0aW9uUHJvZmlsZVdyYXBwZXIuQ09OTkVDVElPTl9QUk9GSUxFX1RZUEU7Ci0gICAgfQotICAgICAKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHBhc3N3b3JkSXNTYXZlZCgpIHsKLSAgICAgICAgcmV0dXJuICJ0cnVlIjsKLSAgICB9Ci0JCi0gICAgcHJvdGVjdGVkIFN0cmluZyBwcm9maWxlTmFtZSgpIHsKLSAgICAJcmV0dXJuIHRoaXMucGxhdGZvcm1Qcm9wZXJ0aWVzLmdldFByb3BlcnR5KCBQUk9GSUxFX05BTUVfUFJPUEVSVFksIFBST0ZJTEVfTkFNRV9ERUZBVUxUKTsKLSAgICB9ICAgIAotICAgIAotICAgIHByb3RlY3RlZCBTdHJpbmcgcHJvZmlsZURlc2NyaXB0aW9uKCkgewotICAgIAlyZXR1cm4gdGhpcy5wbGF0Zm9ybVByb3BlcnRpZXMuZ2V0UHJvcGVydHkoIFBST0ZJTEVfREVTQ1JJUFRJT05fUFJPUEVSVFksIFBST0ZJTEVfREVTQ1JJUFRJT05fREVGQVVMVCk7Ci0gICAgfSAgICAKLSAgICAKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHVzZXJOYW1lKCkgewotICAgIAlyZXR1cm4gdGhpcy5wbGF0Zm9ybVByb3BlcnRpZXMuZ2V0UHJvcGVydHkoIFVTRVJfTkFNRV9QUk9QRVJUWSwgVVNFUl9OQU1FX0RFRkFVTFQpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHVzZXJQYXNzd29yZCgpIHsKLSAgICAJcmV0dXJuIHRoaXMucGxhdGZvcm1Qcm9wZXJ0aWVzLmdldFByb3BlcnR5KCBVU0VSX1BBU1NXT1JEX1BST1BFUlRZLCBVU0VSX1BBU1NXT1JEX0RFRkFVTFQpOwotICAgIH0gICAgCi0gICAgCi0gICAgcHJvdGVjdGVkIFN0cmluZyBkYXRhYmFzZU5hbWUoKSB7Ci0gICAgCXJldHVybiB0aGlzLnBsYXRmb3JtUHJvcGVydGllcy5nZXRQcm9wZXJ0eSggREJfTkFNRV9QUk9QRVJUWSwgREJfTkFNRV9ERUZBVUxUKTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIFN0cmluZyBkYXRhYmFzZWRyaXZlckphckxpc3QoKSB7Ci0gICAgCVN0cmluZyBkYkRyaXZlckphckxpc3QgPSB0aGlzLnBsYXRmb3JtUHJvcGVydGllcy5nZXRQcm9wZXJ0eSggREJfRFJJVkVSX0pBUl9QUk9QRVJUWSk7Ci0gICAgCWlmICggU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSggZGJEcml2ZXJKYXJMaXN0KSkgewotICAgIAkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oIE1JU1NJTkdfUFJPUEVSVFlfTUVTU0FHRSk7Ci0gICAgCX0KLSAgICAJcmV0dXJuIGRiRHJpdmVySmFyTGlzdDsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIFN0cmluZyBkYXRhYmFzZVVybCgpIHsKLSAgICAJU3RyaW5nIGRiVXJsID0gdGhpcy5wbGF0Zm9ybVByb3BlcnRpZXMuZ2V0UHJvcGVydHkoIERCX1VSTF9QUk9QRVJUWSk7Ci0gICAgCWlmICggU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSggZGJVcmwpKSB7Ci0gICAgCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiggTUlTU0lOR19QUk9QRVJUWV9NRVNTQUdFKTsKLSAgICAJfQotICAgIAlyZXR1cm4gZGJVcmw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBDb25uZWN0aW9uUHJvZmlsZSBnZXRQcm9maWxlKCkgewotCi0gICAgCXJldHVybiB0aGlzLmdldFByb2ZpbGVOYW1lZCggdGhpcy5wcm9maWxlTmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQ29ubmVjdGlvblByb2ZpbGUgZ2V0UHJvZmlsZU5hbWVkKCBTdHJpbmcgcHJvZmlsZU5hbWUpIHsKLSAgICAJCi0gICAgCXJldHVybiBDb25uZWN0aW9uUHJvZmlsZVJlcG9zaXRvcnkuaW5zdGFuY2UoKS5wcm9maWxlTmFtZWQoIHByb2ZpbGVOYW1lKTsKLSAgICB9Ci0gICAKLSAgICBwcml2YXRlIFN0cmluZyBnZXRUZXN0UGx1Z2luQnVuZGxlSWQoKSB7Ci0JCXJldHVybiBKcHREYlRlc3RzUGx1Z2luLkJVTkRMRV9JRDsKLQl9Ci0KLQlwcml2YXRlIElQYXRoIGdldERyaXZlckRlZmluaXRpb25Mb2NhdGlvbigpIHsKLQkJcmV0dXJuIENvbm5lY3Rpdml0eVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U3RhdGVMb2NhdGlvbigpOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRDb25maWdQYXRoKCkgewotICAgIAlyZXR1cm4gdGhpcy5nZXRDb25maWdEaXIoKSArICIvIiArIHRoaXMuZ2V0Q29uZmlnTmFtZSgpOwotICAgIH0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRDb25maWdEaXIoKSB7Ci0gICAgCXJldHVybiBQTEFURk9STV9DT05GSUdfRElSRUNUT1JZOwotICAgIH0KLQotCXByaXZhdGUgYm9vbGVhbiBwbGF0Zm9ybUlzTmV3KCkgewotCQlyZXR1cm4oICF0aGlzLmRhdGFiYXNlVmVuZG9yKCkuZXF1YWxzKCB0aGlzLmN1cnJlbnREYlZlbmRvcikgfHwgdGhpcy5kYXRhYmFzZVZlcnNpb24oKS5lcXVhbHMoIHRoaXMuY3VycmVudERiVmVyc2lvbikpOwotCX0KLQkKLSAgICBwcml2YXRlIHZvaWQgbG9hZFBsYXRmb3JtUHJvcGVydGllcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQotCQlpZiggdGhpcy5wbGF0Zm9ybVByb3BlcnRpZXMgPT0gbnVsbCkgewotCQkJVVJMIGNvbmZpZ1VybCA9IFBsYXRmb3JtLmdldEJ1bmRsZSggdGhpcy5nZXRUZXN0UGx1Z2luQnVuZGxlSWQoKSkuZ2V0RW50cnkoIHRoaXMuZ2V0Q29uZmlnUGF0aCgpKTsKLQotCQkJdGhpcy5wbGF0Zm9ybVByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOwotCQkJdGhpcy5wbGF0Zm9ybVByb3BlcnRpZXMubG9hZCggY29uZmlnVXJsLm9wZW5TdHJlYW0oKSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0aWVzIGJ1aWxkRHJpdmVyUHJvcGVydGllcygpIHsKLQkJUHJvcGVydGllcyBkcml2ZXJQcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJZHJpdmVyUHJvcGVydGllcy5zZXRQcm9wZXJ0eSggRFRQQ29ubmVjdGlvblByb2ZpbGVXcmFwcGVyLkRSSVZFUl9ERUZJTklUSU9OX1RZUEVfUFJPUF9JRCwgdGhpcy5kcml2ZXJEZWZpbml0aW9uVHlwZSgpKTsKLQkJZHJpdmVyUHJvcGVydGllcy5zZXRQcm9wZXJ0eSggRFRQQ29ubmVjdGlvblByb2ZpbGVXcmFwcGVyLkRSSVZFUl9KQVJfTElTVF9QUk9QX0lELCB0aGlzLmRhdGFiYXNlZHJpdmVySmFyTGlzdCgpKTsKLQkJZHJpdmVyUHJvcGVydGllcy5zZXRQcm9wZXJ0eSggSURCRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50cy5VU0VSTkFNRV9QUk9QX0lELCB0aGlzLnVzZXJOYW1lKCkpOwotCQlkcml2ZXJQcm9wZXJ0aWVzLnNldFByb3BlcnR5KCBJREJEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzLkRSSVZFUl9DTEFTU19QUk9QX0lELCB0aGlzLmRyaXZlckNsYXNzKCkpOwotCQlkcml2ZXJQcm9wZXJ0aWVzLnNldFByb3BlcnR5KCBJREJEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzLkRBVEFCQVNFX05BTUVfUFJPUF9JRCwgdGhpcy5kYXRhYmFzZU5hbWUoKSk7Ci0JCWRyaXZlclByb3BlcnRpZXMuc2V0UHJvcGVydHkoIElEQkRyaXZlckRlZmluaXRpb25Db25zdGFudHMuUEFTU1dPUkRfUFJPUF9JRCwgdGhpcy51c2VyUGFzc3dvcmQoKSk7Ci0JCWRyaXZlclByb3BlcnRpZXMuc2V0UHJvcGVydHkoIElEQkRyaXZlckRlZmluaXRpb25Db25zdGFudHMuVVJMX1BST1BfSUQsIHRoaXMuZGF0YWJhc2VVcmwoKSk7Ci0JCWRyaXZlclByb3BlcnRpZXMuc2V0UHJvcGVydHkoIElEQkRyaXZlckRlZmluaXRpb25Db25zdGFudHMuREFUQUJBU0VfVkVORE9SX1BST1BfSUQsIHRoaXMuZGF0YWJhc2VWZW5kb3IoKSk7Ci0JCWRyaXZlclByb3BlcnRpZXMuc2V0UHJvcGVydHkoIElEQkRyaXZlckRlZmluaXRpb25Db25zdGFudHMuREFUQUJBU0VfVkVSU0lPTl9QUk9QX0lELCB0aGlzLmRhdGFiYXNlVmVyc2lvbigpKTsKLQkJcmV0dXJuIGRyaXZlclByb3BlcnRpZXM7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0aWVzIGJ1aWxkQmFzaWNQcm9wZXJ0aWVzKCkgewotCQlQcm9wZXJ0aWVzIGJhc2ljUHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCWJhc2ljUHJvcGVydGllcy5zZXRQcm9wZXJ0eSggSURCRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50cy5EQVRBQkFTRV9OQU1FX1BST1BfSUQsIHRoaXMuZGF0YWJhc2VOYW1lKCkpOwotCQliYXNpY1Byb3BlcnRpZXMuc2V0UHJvcGVydHkoIElEQkRyaXZlckRlZmluaXRpb25Db25zdGFudHMuVVNFUk5BTUVfUFJPUF9JRCwgdGhpcy51c2VyTmFtZSgpKTsKLQkJYmFzaWNQcm9wZXJ0aWVzLnNldFByb3BlcnR5KCBJREJEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzLlBBU1NXT1JEX1BST1BfSUQsIHRoaXMudXNlclBhc3N3b3JkKCkpOwotCQliYXNpY1Byb3BlcnRpZXMuc2V0UHJvcGVydHkoIERUUENvbm5lY3Rpb25Qcm9maWxlV3JhcHBlci5EUklWRVJfREVGSU5JVElPTl9QUk9QX0lELCB0aGlzLmRyaXZlckRlZmluaXRpb25JZCgpKTsKLQkJCi0JCWJhc2ljUHJvcGVydGllcy5zZXRQcm9wZXJ0eSggSURCRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50cy5EUklWRVJfQ0xBU1NfUFJPUF9JRCwgdGhpcy5kcml2ZXJDbGFzcygpKTsKLQkJYmFzaWNQcm9wZXJ0aWVzLnNldFByb3BlcnR5KCBJREJEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzLlVSTF9QUk9QX0lELCB0aGlzLmRhdGFiYXNlVXJsKCkpOwotCQliYXNpY1Byb3BlcnRpZXMuc2V0UHJvcGVydHkoIElEQkRyaXZlckRlZmluaXRpb25Db25zdGFudHMuREFUQUJBU0VfVkVORE9SX1BST1BfSUQsIHRoaXMuZGF0YWJhc2VWZW5kb3IoKSk7Ci0JCWJhc2ljUHJvcGVydGllcy5zZXRQcm9wZXJ0eSggSURCRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50cy5EQVRBQkFTRV9WRVJTSU9OX1BST1BfSUQsIHRoaXMuZGF0YWJhc2VWZXJzaW9uKCkpOwotCQkKLQkJYmFzaWNQcm9wZXJ0aWVzLnNldFByb3BlcnR5KCBEVFBDb25uZWN0aW9uUHJvZmlsZVdyYXBwZXIuREFUQUJBU0VfU0FWRV9QV0RfUFJPUF9JRCwgdGhpcy5wYXNzd29yZElzU2F2ZWQoKSk7Ci0JCXJldHVybiBiYXNpY1Byb3BlcnRpZXM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQ29ubmVjdGlvblByb2ZpbGUoIFN0cmluZyBwcm9maWxlTmFtZSkgdGhyb3dzIENvbm5lY3Rpb25Qcm9maWxlRXhjZXB0aW9uIHsKLQkJCi0JCVByb2ZpbGVNYW5hZ2VyIHByb2ZpbGVNYW5hZ2VyID0gUHJvZmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKTsKLQkJQXNzZXJ0LmFzc2VydE5vdE51bGwoIHByb2ZpbGVNYW5hZ2VyKTsKLQkJSUNvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUgPSBwcm9maWxlTWFuYWdlci5nZXRQcm9maWxlQnlOYW1lKCBwcm9maWxlTmFtZSk7Ci0JCWlmKCBwcm9maWxlID09IG51bGwpIHsKLQkJCVByb3BlcnRpZXMgYmFzaWNQcm9wZXJ0aWVzID0gYnVpbGRCYXNpY1Byb3BlcnRpZXMoKTsKLQkJCVByb2ZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkuY3JlYXRlUHJvZmlsZSggcHJvZmlsZU5hbWUsIHRoaXMucHJvZmlsZURlc2NyaXB0aW9uKCksIHRoaXMucHJvdmlkZXJJZCgpLCBiYXNpY1Byb3BlcnRpZXMpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkRHJpdmVyRGVmaW5pdGlvbkZpbGUoIFN0cmluZyBkcml2ZXJGaWxlTmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkKLQkJWE1MRmlsZU1hbmFnZXIuc2V0U3RvcmFnZUxvY2F0aW9uKCB0aGlzLmdldERyaXZlckRlZmluaXRpb25Mb2NhdGlvbigpKTsKLQkJWE1MRmlsZU1hbmFnZXIuc2V0RmlsZU5hbWUoIGRyaXZlckZpbGVOYW1lKTsKLQkJSVByb3BlcnR5U2V0W10gcHJvcHNldHMgPSBuZXcgSVByb3BlcnR5U2V0WyAxXTsKLQkJU3RyaW5nIGRyaXZlck5hbWUgPSB0aGlzLmRyaXZlck5hbWUoKTsKLQkJU3RyaW5nIGRyaXZlcklkID0gdGhpcy5kcml2ZXJEZWZpbml0aW9uSWQoKTsKLQkJUHJvcGVydHlTZXRJbXBsIHByb3BlcnR5U2V0ID0gbmV3IFByb3BlcnR5U2V0SW1wbCggZHJpdmVyTmFtZSwgZHJpdmVySWQpOwotCQlwcm9wZXJ0eVNldC5zZXRQcm9wZXJ0aWVzKCBkcml2ZXJJZCwgdGhpcy5idWlsZERyaXZlclByb3BlcnRpZXMoKSk7Ci0JCXByb3BzZXRzWyAwXSA9IHByb3BlcnR5U2V0OwotCi0JCVhNTEZpbGVNYW5hZ2VyLnNhdmVOYW1lZFByb3BlcnR5U2V0KCBwcm9wc2V0cyk7Ci0JCQotCQlGaWxlIGRyaXZlckRlZmluaXRpb25lRmlsZSA9ICB0aGlzLmdldERyaXZlckRlZmluaXRpb25Mb2NhdGlvbigpLmFwcGVuZCggZHJpdmVyRmlsZU5hbWUpLnRvRmlsZSgpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZSggZHJpdmVyRGVmaW5pdGlvbmVGaWxlLmV4aXN0cygpKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL0RlcmJ5MTAxVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvRGVyYnkxMDFUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTUxMGNmLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvRGVyYnkxMDFUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy5pbnRlcm5hbC5wbGF0Zm9ybXM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IGp1bml0LnN3aW5ndWkuVGVzdFJ1bm5lcjsKLQotLyoqCi0gKiAgRGVyYnkgMTAuMSBFbWJlZGRlZCBEcml2ZXIgVGVzdAotICovCi1wdWJsaWMgY2xhc3MgRGVyYnkxMDFUZXN0cyBleHRlbmRzIERUUFBsYXRmb3JtVGVzdHMgewotCQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIFRlc3RSdW5uZXIubWFpbiggbmV3IFN0cmluZ1tdIHsgIi1jIiwgRGVyYnkxMDFUZXN0cy5jbGFzcy5nZXROYW1lKCl9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKCBEZXJieTEwMVRlc3RzLmNsYXNzKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIERlcmJ5MTAxVGVzdHMoIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKCBuYW1lKTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIFN0cmluZyBkYXRhYmFzZVZlbmRvcigpIHsKLSAgICAgICAgcmV0dXJuICJEZXJieSI7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBkYXRhYmFzZVZlcnNpb24oKSB7Ci0gICAgICAgIHJldHVybiAiMTAuMSI7Ci0gICAgfQotCQotICAgIHByb3RlY3RlZCBTdHJpbmcgcHJvdmlkZXJJZCgpIHsKLSAgICAgICAgcmV0dXJuICJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmRiLmRlcmJ5LmVtYmVkZGVkLmNvbm5lY3Rpb25Qcm9maWxlIjsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIFN0cmluZyBkcml2ZXJOYW1lKCkgewotICAgICAgICByZXR1cm4gIkRlcmJ5IEVtYmVkZGVkIEpEQkMgRHJpdmVyIjsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIFN0cmluZyBkcml2ZXJEZWZpbml0aW9uVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuICJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmRiLmRlcmJ5MTAxLmdlbmVyaWNEcml2ZXJUZW1wbGF0ZSI7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBTdHJpbmcgZHJpdmVyRGVmaW5pdGlvbklkKCkgewotICAgICAgICByZXR1cm4gIkRyaXZlckRlZm4uRGVyYnkgRW1iZWRkZWQgSkRCQyBEcml2ZXIiOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGRyaXZlckNsYXNzKCkgewotICAgICAgICByZXR1cm4gIm9yZy5hcGFjaGUuZGVyYnkuamRiYy5FbWJlZGRlZERyaXZlciI7Ci0gICAgfQotCQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q29uZmlnTmFtZSgpIHsKLSAgICAJcmV0dXJuICJkZXJieTEwMS5wcm9wZXJ0aWVzIjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL09yYWNsZTEwZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL09yYWNsZTEwZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwZDNhM2QuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9PcmFjbGUxMGdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy5pbnRlcm5hbC5wbGF0Zm9ybXM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IGp1bml0LnN3aW5ndWkuVGVzdFJ1bm5lcjsKLQotLyoqCi0gKiAgT3JhY2xlIDEwZyBUaGluIERyaXZlciBUZXN0Ci0gKi8KLXB1YmxpYyBjbGFzcyBPcmFjbGUxMGdUZXN0cyBleHRlbmRzIERUUFBsYXRmb3JtVGVzdHMgewotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oIFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgVGVzdFJ1bm5lci5tYWluKCBuZXcgU3RyaW5nW10geyAiLWMiLCBPcmFjbGUxMGdUZXN0cy5jbGFzcy5nZXROYW1lKCl9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKCBPcmFjbGUxMGdUZXN0cy5jbGFzcyk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBPcmFjbGUxMGdUZXN0cyggU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIoIG5hbWUpOwotICAgIH0KLQotCXByb3RlY3RlZCBTdHJpbmcgZGF0YWJhc2VWZW5kb3IoKSB7Ci0JCXJldHVybiAiT3JhY2xlIjsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGRhdGFiYXNlVmVyc2lvbigpIHsKLQkJcmV0dXJuICIxMCI7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBkcml2ZXJDbGFzcygpIHsKLQkJcmV0dXJuICJvcmFjbGUuamRiYy5PcmFjbGVEcml2ZXIiOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZHJpdmVyRGVmaW5pdGlvbklkKCkgewotCQlyZXR1cm4gIkRyaXZlckRlZm4uT3JhY2xlIFRoaW4gRHJpdmVyIjsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGRyaXZlckRlZmluaXRpb25UeXBlKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLmRhdGF0b29scy5lbmFibGVtZW50Lm9yYWNsZS4xMC5kcml2ZXJUZW1wbGF0ZSI7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBkcml2ZXJOYW1lKCkgewotCQlyZXR1cm4gIk9yYWNsZSAxMGcgVGhpbiBEcml2ZXIiOwotCX0KLQkKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENvbmZpZ05hbWUoKSB7Ci0gICAgCXJldHVybiAib3JhY2xlMTBnLnByb3BlcnRpZXMiOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvT3JhY2xlOWlUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9PcmFjbGU5aVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5MjMwODEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9PcmFjbGU5aVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24gYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzLmludGVybmFsLnBsYXRmb3JtczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQuc3dpbmd1aS5UZXN0UnVubmVyOwotCi0vKioKLSAqICBPcmFjbGUgOWkgVGhpbiBEcml2ZXIgVGVzdAotICovCi1wdWJsaWMgY2xhc3MgT3JhY2xlOWlUZXN0cyBleHRlbmRzIERUUFBsYXRmb3JtVGVzdHMgewotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oIFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgVGVzdFJ1bm5lci5tYWluKCBuZXcgU3RyaW5nW10geyAiLWMiLCBPcmFjbGU5aVRlc3RzLmNsYXNzLmdldE5hbWUoKX0pOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoIE9yYWNsZTlpVGVzdHMuY2xhc3MpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgT3JhY2xlOWlUZXN0cyggU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIoIG5hbWUpOwotICAgIH0KLQotCXByb3RlY3RlZCBTdHJpbmcgZGF0YWJhc2VWZW5kb3IoKSB7Ci0JCXJldHVybiAiT3JhY2xlIjsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGRhdGFiYXNlVmVyc2lvbigpIHsKLQkJcmV0dXJuICI5IjsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGRyaXZlckNsYXNzKCkgewotCQlyZXR1cm4gIm9yYWNsZS5qZGJjLk9yYWNsZURyaXZlciI7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBkcml2ZXJEZWZpbml0aW9uSWQoKSB7Ci0JCXJldHVybiAiRHJpdmVyRGVmbi5PcmFjbGUgVGhpbiBEcml2ZXIiOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZHJpdmVyRGVmaW5pdGlvblR5cGUoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2UuZGF0YXRvb2xzLmVuYWJsZW1lbnQub3JhY2xlLjkuZHJpdmVyVGVtcGxhdGUiOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZHJpdmVyTmFtZSgpIHsKLQkJcmV0dXJuICJPcmFjbGUgOWkgVGhpbiBEcml2ZXIiOwotCX0KLQkKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENvbmZpZ05hbWUoKSB7Ci0gICAgCXJldHVybiAib3JhY2xlOWkucHJvcGVydGllcyI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9TUUxTZXJ2ZXIyMDA1VGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvU1FMU2VydmVyMjAwNVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwZjUwMzQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9TUUxTZXJ2ZXIyMDA1VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMuaW50ZXJuYWwucGxhdGZvcm1zOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC5zd2luZ3VpLlRlc3RSdW5uZXI7Ci0KLS8qKgotICogIFNRTCBTZXJ2ZXIgMjAwNSBEcml2ZXIgVGVzdAotICovCi1wdWJsaWMgY2xhc3MgU1FMU2VydmVyMjAwNVRlc3RzIGV4dGVuZHMgRFRQUGxhdGZvcm1UZXN0cyB7Ci0JCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oIFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgVGVzdFJ1bm5lci5tYWluKCBuZXcgU3RyaW5nW10geyAiLWMiLCBTUUxTZXJ2ZXIyMDA1VGVzdHMuY2xhc3MuZ2V0TmFtZSgpfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZSggU1FMU2VydmVyMjAwNVRlc3RzLmNsYXNzKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFNRTFNlcnZlcjIwMDVUZXN0cyggU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIoIG5hbWUpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGRhdGFiYXNlVmVuZG9yKCkgewotICAgICAgICByZXR1cm4gIlNRTFNlcnZlciI7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBkYXRhYmFzZVZlcnNpb24oKSB7Ci0gICAgICAgIHJldHVybiAiMjAwNSI7Ci0gICAgfQotCQotICAgIHByb3RlY3RlZCBTdHJpbmcgcHJvdmlkZXJJZCgpIHsKLSAgICAgICAgcmV0dXJuICJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmRiLmdlbmVyaWMuY29ubmVjdGlvblByb2ZpbGUiOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGRyaXZlck5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiTWljcm9zb2Z0IFNRTCBTZXJ2ZXIgMjAwNSBKREJDIERyaXZlciI7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBTdHJpbmcgZHJpdmVyRGVmaW5pdGlvblR5cGUoKSB7Ci0gICAgICAgIHJldHVybiAib3JnLmVjbGlwc2UuZGF0YXRvb2xzLmVuYWJsZW1lbnQubXNmdC5zcWxzZXJ2ZXIuMjAwNS5kcml2ZXJUZW1wbGF0ZSI7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBTdHJpbmcgZHJpdmVyRGVmaW5pdGlvbklkKCkgewotICAgICAgICByZXR1cm4gIkRyaXZlckRlZm4uTWljcm9zb2Z0IFNRTCBTZXJ2ZXIgMjAwNSBKREJDIERyaXZlciI7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBTdHJpbmcgZHJpdmVyQ2xhc3MoKSB7Ci0gICAgICAgIHJldHVybiAiY29tLm1pY3Jvc29mdC5zcWxzZXJ2ZXIuamRiYy5TUUxTZXJ2ZXJEcml2ZXIiOwotICAgIH0KLQkKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENvbmZpZ05hbWUoKSB7Ci0gICAgCXJldHVybiAic3Fsc2VydmVyMjAwNS5wcm9wZXJ0aWVzIjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvLmNsYXNzcGF0aCBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDRlODYxLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy8uY3ZzaWdub3JlIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy8ucHJvamVjdCBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE1MjcxZS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0czwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc0ZjQxZC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jU3VuIE1heSAyNyAxNToxMTo0NCBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRiNWM0Yy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jU3VuIE1heSAyNyAxNDo1NTo1OCBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NzA2MTMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LAotIG9yZy5qdW5pdDtidW5kbGUtdmVyc2lvbj0iWzMuMC4wLDQuMC4wKSIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmF0b3JzO3gtaW50ZXJuYWw6PXRydWUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9hYm91dC5odG1sIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNzNiZGEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lIDA2LCAyMDA3PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViZTljMDguLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHRlc3QueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5OTU3NjguLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRvIGNvZGUgZGV2ZWxvcGVyOgotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLXBsdWdpbk5hbWUgPSBKYXZhIFBlcnNpc3RlbmNlIEFQSSBVdGlsaXR5IFRlc3RzCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwotCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0JpdFRvb2xzVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvQml0VG9vbHNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDNlNmYyLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvQml0VG9vbHNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5CaXRUb29sczsKLQotcHVibGljIGNsYXNzIEJpdFRvb2xzVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgQml0VG9vbHNUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWxsRmxhZ3NBcmVTZXRJbnRJbnQoKSB7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMuYWxsRmxhZ3NBcmVTZXQoMHgwMDAzLCAweDAwMDEpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5hbGxGbGFnc0FyZVNldCgweDAzMDMsIDB4MDAwMSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLmFsbEZsYWdzQXJlU2V0KDB4MDMwMywgMHgwMTAxKSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMuYWxsRmxhZ3NBcmVTZXQoMHgwMzAzLCAweDAxMDMpKTsKLQotCQlhc3NlcnRGYWxzZShCaXRUb29scy5hbGxGbGFnc0FyZVNldCgweDAzMDMsIDB4MTEwMykpOwotCQlhc3NlcnRGYWxzZShCaXRUb29scy5hbGxGbGFnc0FyZVNldCgweDAwMDAsIDB4MTEwMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbGxGbGFnc0FyZVNldEludEludEFycmF5KCkgewotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLmFsbEZsYWdzQXJlU2V0KDB4MDAwMywgbmV3IGludFtdIHsgMHgwMDAxIH0pKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5hbGxGbGFnc0FyZVNldCgweDAzMDMsIG5ldyBpbnRbXSB7IDB4MDAwMSB9KSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMuYWxsRmxhZ3NBcmVTZXQoMHgwMzAzLCBuZXcgaW50W10geyAweDAxMDAsIDB4MDAwMSB9KSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMuYWxsRmxhZ3NBcmVTZXQoMHgwMzAzLCBuZXcgaW50W10geyAweDAxMDAsIDB4MDAwMiwgMHgwMDAxIH0pKTsKLQotCQlhc3NlcnRGYWxzZShCaXRUb29scy5hbGxGbGFnc0FyZVNldCgweDAzMDMsIG5ldyBpbnRbXSB7IDB4MTAwMCwgMHgwMTAwLCAweDAwMDIsIDB4MDAwMSB9KSk7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmFsbEZsYWdzQXJlU2V0KDB4MDAwMCwgbmV3IGludFtdIHsgMHgxMDAwLCAweDAxMDAsIDB4MDAwMiwgMHgwMDAxIH0pKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QW55RmxhZ3NBcmVTZXRJbnRJbnQoKSB7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMuYW55RmxhZ3NBcmVTZXQoMHgwMDAzLCAweDAwMDEpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5hbnlGbGFnc0FyZVNldCgweEZGRkYsIDB4MDAwMSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLmFueUZsYWdzQXJlU2V0KDB4MDAwMywgMHhGRkZGKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuYW55RmxhZ3NBcmVTZXQoMHgwMzAzLCAweDEwMTApKTsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuYW55RmxhZ3NBcmVTZXQoMHgwMDAwLCAweEZGRkYpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QW55RmxhZ3NBcmVTZXRJbnRJbnRBcnJheSgpIHsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5hbnlGbGFnc0FyZVNldCgweDAwMDMsIG5ldyBpbnRbXSB7IDB4MDAwMSB9KSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMuYW55RmxhZ3NBcmVTZXQoMHhGRkZGLCBuZXcgaW50W10geyAweDAwMDEgfSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLmFueUZsYWdzQXJlU2V0KDB4MDMwMywgbmV3IGludFtdIHsgMHhGMDAwLCAweDBGMDAsIDB4MDBGMCwgMHgwMDBGIH0pKTsKLQotCQlhc3NlcnRGYWxzZShCaXRUb29scy5hbnlGbGFnc0FyZVNldCgweDAzMDMsIG5ldyBpbnRbXSB7IDB4MTAwMCwgMHgwMDEwIH0pKTsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuYW55RmxhZ3NBcmVTZXQoMHgwMDAwLCBuZXcgaW50W10geyAweEYwMDAsIDB4MEYwMCwgMHgwMEYwLCAweDAwMEYgfSkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9DbGFzc1Rvb2xzVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvQ2xhc3NUb29sc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwNGI2MjEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9DbGFzc1Rvb2xzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ2xhc3NUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBDbGFzc1Rvb2xzVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgdGVzdFN0YXRpY0ZpZWxkOwotCi0JcHVibGljIENsYXNzVG9vbHNUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNvbXBpbGVyLWdlbmVyYXRlZCBjbGFzcyBuYW1lLiBUaGUgRWNsaXBzZSBjb21waWxlciBnZW5lcmF0ZXMKLQkgKiAibG9jYWwiIGNsYXNzZXMgd2l0aCBuYW1lcyBpbiB0aGUgZm9ybSAiY29tLmZvby5PdXRlciQxJExvY2FsIjsgd2hpbGUgdGhlCi0JICogSkRLIGNvbXBpbGVyIGdlbmVyYXRlcyAiY29tLmZvby5PdXRlciQxTG9jYWwiLiBUaGVyZSBtaWdodCBiZSBvdGhlcgotCSAqIGRpZmZlcmVuY2VzLi4uLiB+Ymp2Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29tcGlsZXJEZXBlbmRlbnRDbGFzc05hbWVGb3IoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlpbnQgaW5kZXggPSBjbGFzc05hbWUuaW5kZXhPZigiJDEkIik7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJcmV0dXJuIGNsYXNzTmFtZTsKLQkJfQotCQl0cnkgewotCQkJQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGV4KSB7Ci0JCQlyZXR1cm4gY2xhc3NOYW1lLnN1YnN0cmluZygwLCBpbmRleCArIDIpICsgY2xhc3NOYW1lLnN1YnN0cmluZyhpbmRleCArIDMpOwotCQl9Ci0JCXJldHVybiBjbGFzc05hbWU7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG11bmdlKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuIGNvbXBpbGVyRGVwZW5kZW50Q2xhc3NOYW1lRm9yKGNsYXNzTmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFsbEZpZWxkcygpIHsKLQkJaW50IGZpZWxkQ291bnQgPSAwOwotCQlmaWVsZENvdW50ICs9IGphdmEudXRpbC5WZWN0b3IuY2xhc3MuZ2V0RGVjbGFyZWRGaWVsZHMoKS5sZW5ndGg7Ci0JCWZpZWxkQ291bnQgKz0gamF2YS51dGlsLkFic3RyYWN0TGlzdC5jbGFzcy5nZXREZWNsYXJlZEZpZWxkcygpLmxlbmd0aDsKLQkJZmllbGRDb3VudCArPSBqYXZhLnV0aWwuQWJzdHJhY3RDb2xsZWN0aW9uLmNsYXNzLmdldERlY2xhcmVkRmllbGRzKCkubGVuZ3RoOwotCQlmaWVsZENvdW50ICs9IGphdmEubGFuZy5PYmplY3QuY2xhc3MuZ2V0RGVjbGFyZWRGaWVsZHMoKS5sZW5ndGg7Ci0JCUZpZWxkW10gZmllbGRzID0gQ2xhc3NUb29scy5hbGxGaWVsZHMoamF2YS51dGlsLlZlY3Rvci5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscyhmaWVsZENvdW50LCBmaWVsZHMubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5uYW1lcyhmaWVsZHMpLCAibW9kQ291bnQiKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMubmFtZXMoZmllbGRzKSwgInNlcmlhbFZlcnNpb25VSUQiKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMubmFtZXMoZmllbGRzKSwgImNhcGFjaXR5SW5jcmVtZW50IikpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLm5hbWVzKGZpZWxkcyksICJlbGVtZW50Q291bnQiKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMubmFtZXMoZmllbGRzKSwgImVsZW1lbnREYXRhIikpOwotCQlhc3NlcnRUcnVlKGZpZWxkc1swXS5pc0FjY2Vzc2libGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFsbE1ldGhvZHMoKSB7Ci0JCWludCBtZXRob2RDb3VudCA9IDA7Ci0JCW1ldGhvZENvdW50ICs9IGphdmEudXRpbC5WZWN0b3IuY2xhc3MuZ2V0RGVjbGFyZWRNZXRob2RzKCkubGVuZ3RoOwotCQltZXRob2RDb3VudCArPSBqYXZhLnV0aWwuQWJzdHJhY3RMaXN0LmNsYXNzLmdldERlY2xhcmVkTWV0aG9kcygpLmxlbmd0aDsKLQkJbWV0aG9kQ291bnQgKz0gamF2YS51dGlsLkFic3RyYWN0Q29sbGVjdGlvbi5jbGFzcy5nZXREZWNsYXJlZE1ldGhvZHMoKS5sZW5ndGg7Ci0JCW1ldGhvZENvdW50ICs9IGphdmEubGFuZy5PYmplY3QuY2xhc3MuZ2V0RGVjbGFyZWRNZXRob2RzKCkubGVuZ3RoOwotCQlNZXRob2RbXSBtZXRob2RzID0gQ2xhc3NUb29scy5hbGxNZXRob2RzKGphdmEudXRpbC5WZWN0b3IuY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMobWV0aG9kQ291bnQsIG1ldGhvZHMubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5uYW1lcyhtZXRob2RzKSwgIndhaXQiKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMubmFtZXMobWV0aG9kcyksICJhZGRFbGVtZW50IikpOwotCQlhc3NlcnRUcnVlKG1ldGhvZHNbMF0uaXNBY2Nlc3NpYmxlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdJbnN0YW5jZUNsYXNzKCkgewotCQlWZWN0b3I8Pz4gdiA9IENsYXNzVG9vbHMubmV3SW5zdGFuY2UoamF2YS51dGlsLlZlY3Rvci5jbGFzcyk7Ci0JCWFzc2VydE5vdE51bGwodik7Ci0JCWFzc2VydEVxdWFscygwLCB2LnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld0luc3RhbmNlQ2xhc3NDbGFzc09iamVjdCgpIHsKLQkJaW50IGluaXRpYWxDYXBhY2l0eSA9IDIwMDsKLQkJVmVjdG9yPD8+IHYgPSBDbGFzc1Rvb2xzLm5ld0luc3RhbmNlKGphdmEudXRpbC5WZWN0b3IuY2xhc3MsIGludC5jbGFzcywgbmV3IEludGVnZXIoaW5pdGlhbENhcGFjaXR5KSk7Ci0JCWFzc2VydE5vdE51bGwodik7Ci0JCWFzc2VydEVxdWFscygwLCB2LnNpemUoKSk7Ci0JCU9iamVjdFtdIGVsZW1lbnREYXRhID0gKE9iamVjdFtdKSBDbGFzc1Rvb2xzLmdldEZpZWxkVmFsdWUodiwgImVsZW1lbnREYXRhIik7Ci0JCWFzc2VydEVxdWFscyhpbml0aWFsQ2FwYWNpdHksIGVsZW1lbnREYXRhLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld0luc3RhbmNlQ2xhc3NDbGFzc0FycmF5T2JqZWN0QXJyYXkoKSB7Ci0JCWludCBpbml0aWFsQ2FwYWNpdHkgPSAyMDA7Ci0JCUNsYXNzPD8+W10gcGFybVR5cGVzID0gbmV3IENsYXNzWzFdOwotCQlwYXJtVHlwZXNbMF0gPSBpbnQuY2xhc3M7Ci0JCU9iamVjdFtdIHBhcm1zID0gbmV3IE9iamVjdFsxXTsKLQkJcGFybXNbMF0gPSBuZXcgSW50ZWdlcihpbml0aWFsQ2FwYWNpdHkpOwotCQlWZWN0b3I8Pz4gdiA9IENsYXNzVG9vbHMubmV3SW5zdGFuY2UoamF2YS51dGlsLlZlY3Rvci5jbGFzcywgcGFybVR5cGVzLCBwYXJtcyk7Ci0JCWFzc2VydE5vdE51bGwodik7Ci0JCWFzc2VydEVxdWFscygwLCB2LnNpemUoKSk7Ci0JCU9iamVjdFtdIGVsZW1lbnREYXRhID0gKE9iamVjdFtdKSBDbGFzc1Rvb2xzLmdldEZpZWxkVmFsdWUodiwgImVsZW1lbnREYXRhIik7Ci0JCWFzc2VydEVxdWFscyhpbml0aWFsQ2FwYWNpdHksIGVsZW1lbnREYXRhLmxlbmd0aCk7Ci0KLQkJcGFybXNbMF0gPSBuZXcgSW50ZWdlcigtMSk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXYgPSBDbGFzc1Rvb2xzLm5ld0luc3RhbmNlKGphdmEudXRpbC5WZWN0b3IuY2xhc3MsIHBhcm1UeXBlcywgcGFybXMpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiUnVudGltZUV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCi0JCXBhcm1UeXBlc1swXSA9IGphdmEubGFuZy5TdHJpbmcuY2xhc3M7Ci0JCXBhcm1zWzBdID0gImZvbyI7Ci0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl2ID0gQ2xhc3NUb29scy5hdHRlbXB0TmV3SW5zdGFuY2UoamF2YS51dGlsLlZlY3Rvci5jbGFzcywgcGFybVR5cGVzLCBwYXJtcyk7Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRGaWVsZFZhbHVlKCkgewotCQlpbnQgaW5pdGlhbENhcGFjaXR5ID0gMjAwOwotCQlWZWN0b3I8Pz4gdiA9IG5ldyBWZWN0b3I8T2JqZWN0Pihpbml0aWFsQ2FwYWNpdHkpOwotCQlPYmplY3RbXSBlbGVtZW50RGF0YSA9IChPYmplY3RbXSkgQ2xhc3NUb29scy5nZXRGaWVsZFZhbHVlKHYsICJlbGVtZW50RGF0YSIpOwotCQlhc3NlcnRFcXVhbHMoaW5pdGlhbENhcGFjaXR5LCBlbGVtZW50RGF0YS5sZW5ndGgpOwotCi0JCS8vIHRlc3QgaW5oZXJpdGVkIGZpZWxkCi0JCUludGVnZXIgbW9kQ291bnRJbnRlZ2VyID0gKEludGVnZXIpIENsYXNzVG9vbHMuZ2V0RmllbGRWYWx1ZSh2LCAibW9kQ291bnQiKTsKLQkJaW50IG1vZENvdW50ID0gbW9kQ291bnRJbnRlZ2VyLmludFZhbHVlKCk7Ci0JCWFzc2VydEVxdWFscygwLCBtb2RDb3VudCk7Ci0KLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlPYmplY3QgYm9ndXNGaWVsZFZhbHVlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWJvZ3VzRmllbGRWYWx1ZSA9IENsYXNzVG9vbHMuYXR0ZW1wdFRvR2V0RmllbGRWYWx1ZSh2LCAiYm9ndXNGaWVsZCIpOwotCQl9IGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEZpZWxkRXhjZXB0aW9uIG5vdCB0aHJvd246ICIgKyBib2d1c0ZpZWxkVmFsdWUsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXhlY3V0ZU1ldGhvZE9iamVjdFN0cmluZygpIHsKLQkJVmVjdG9yPFN0cmluZz4gdiA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOwotCQlpbnQgc2l6ZSA9ICgoSW50ZWdlcikgQ2xhc3NUb29scy5leGVjdXRlTWV0aG9kKHYsICJzaXplIikpLmludFZhbHVlKCk7Ci0JCWFzc2VydEVxdWFscygwLCBzaXplKTsKLQotCQl2LmFkZEVsZW1lbnQoImZvbyIpOwotCQlzaXplID0gKChJbnRlZ2VyKSBDbGFzc1Rvb2xzLmV4ZWN1dGVNZXRob2QodiwgInNpemUiKSkuaW50VmFsdWUoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHNpemUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFeGVjdXRlTWV0aG9kT2JqZWN0U3RyaW5nQ2xhc3NPYmplY3QoKSB7Ci0JCVZlY3RvcjxTdHJpbmc+IHYgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKLQkJYm9vbGVhbiBib29sZWFuUmVzdWx0ID0gKChCb29sZWFuKSBDbGFzc1Rvb2xzLmV4ZWN1dGVNZXRob2QodiwgImFkZCIsIE9iamVjdC5jbGFzcywgImZvbyIpKS5ib29sZWFuVmFsdWUoKTsKLQkJYXNzZXJ0VHJ1ZShib29sZWFuUmVzdWx0KTsKLQkJYXNzZXJ0VHJ1ZSh2LmNvbnRhaW5zKCJmb28iKSk7Ci0JCU9iamVjdCB2b2lkUmVzdWx0ID0gQ2xhc3NUb29scy5leGVjdXRlTWV0aG9kKHYsICJhZGRFbGVtZW50IiwgT2JqZWN0LmNsYXNzLCAiYmFyIik7Ci0JCWFzc2VydE51bGwodm9pZFJlc3VsdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEV4ZWN1dGVNZXRob2RPYmplY3RTdHJpbmdDbGFzc0FycmF5T2JqZWN0QXJyYXkoKSB7Ci0JCVZlY3RvcjxTdHJpbmc+IHYgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKLQkJQ2xhc3M8Pz5bXSBwYXJtVHlwZXMgPSBuZXcgQ2xhc3NbMV07Ci0JCXBhcm1UeXBlc1swXSA9IGphdmEubGFuZy5PYmplY3QuY2xhc3M7Ci0JCU9iamVjdFtdIHBhcm1zID0gbmV3IE9iamVjdFsxXTsKLQkJcGFybXNbMF0gPSAiZm9vIjsKLQkJYm9vbGVhbiBib29sZWFuUmVzdWx0ID0gKChCb29sZWFuKSBDbGFzc1Rvb2xzLmV4ZWN1dGVNZXRob2QodiwgImFkZCIsIHBhcm1UeXBlcywgcGFybXMpKS5ib29sZWFuVmFsdWUoKTsKLQkJYXNzZXJ0VHJ1ZShib29sZWFuUmVzdWx0KTsKLQkJYXNzZXJ0VHJ1ZSh2LmNvbnRhaW5zKCJmb28iKSk7Ci0KLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlPYmplY3QgYm9ndXNNZXRob2RSZXR1cm5WYWx1ZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlib2d1c01ldGhvZFJldHVyblZhbHVlID0gQ2xhc3NUb29scy5hdHRlbXB0VG9FeGVjdXRlTWV0aG9kKHYsICJib2d1c01ldGhvZCIsIHBhcm1UeXBlcywgcGFybXMpOwotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hNZXRob2RFeGNlcHRpb24gbm90IHRocm93bjogIiArIGJvZ3VzTWV0aG9kUmV0dXJuVmFsdWUsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXhlY3V0ZVN0YXRpY01ldGhvZENsYXNzU3RyaW5nKCkgewotCQlEb3VibGUgcmFuZG9tT2JqZWN0ID0gKERvdWJsZSkgQ2xhc3NUb29scy5leGVjdXRlU3RhdGljTWV0aG9kKGphdmEubGFuZy5NYXRoLmNsYXNzLCAicmFuZG9tIik7Ci0JCWFzc2VydE5vdE51bGwocmFuZG9tT2JqZWN0KTsKLQkJZG91YmxlIHJhbmRvbSA9IHJhbmRvbU9iamVjdC5kb3VibGVWYWx1ZSgpOwotCQlhc3NlcnRUcnVlKHJhbmRvbSA+PSAwKTsKLQkJYXNzZXJ0VHJ1ZShyYW5kb20gPCAxKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXhlY3V0ZVN0YXRpY01ldGhvZENsYXNzU3RyaW5nQ2xhc3NPYmplY3QoKSB7Ci0JCVN0cmluZyBzID0gKFN0cmluZykgQ2xhc3NUb29scy5leGVjdXRlU3RhdGljTWV0aG9kKGphdmEubGFuZy5TdHJpbmcuY2xhc3MsICJ2YWx1ZU9mIiwgYm9vbGVhbi5jbGFzcywgQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0Tm90TnVsbChzKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0cnVlIiwgcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEV4ZWN1dGVTdGF0aWNNZXRob2RDbGFzc1N0cmluZ0NsYXNzQXJyYXlPYmplY3RBcnJheSgpIHsKLQkJQ2xhc3M8Pz5bXSBwYXJtVHlwZXMgPSBuZXcgQ2xhc3NbMV07Ci0JCXBhcm1UeXBlc1swXSA9IGJvb2xlYW4uY2xhc3M7Ci0JCU9iamVjdFtdIHBhcm1zID0gbmV3IE9iamVjdFsxXTsKLQkJcGFybXNbMF0gPSBCb29sZWFuLlRSVUU7Ci0JCVN0cmluZyBzID0gKFN0cmluZykgQ2xhc3NUb29scy5leGVjdXRlU3RhdGljTWV0aG9kKGphdmEubGFuZy5TdHJpbmcuY2xhc3MsICJ2YWx1ZU9mIiwgcGFybVR5cGVzLCBwYXJtcyk7Ci0JCWFzc2VydE5vdE51bGwocyk7Ci0JCWFzc2VydEVxdWFscygidHJ1ZSIsIHMpOwotCi0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJT2JqZWN0IGJvZ3VzU3RhdGljTWV0aG9kUmV0dXJuVmFsdWUgPSBudWxsOwotCQl0cnkgewotCQkJYm9ndXNTdGF0aWNNZXRob2RSZXR1cm5WYWx1ZSA9IENsYXNzVG9vbHMuYXR0ZW1wdFRvRXhlY3V0ZVN0YXRpY01ldGhvZChqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCAiYm9ndXNTdGF0aWNNZXRob2QiLCBwYXJtVHlwZXMsIHBhcm1zKTsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoTWV0aG9kRXhjZXB0aW9uIG5vdCB0aHJvd246ICIgKyBib2d1c1N0YXRpY01ldGhvZFJldHVyblZhbHVlLCBleENhdWdodCk7Ci0KLQkJLy8gdGVzdCBub24tc3RhdGljIG1ldGhvZAotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJYm9ndXNTdGF0aWNNZXRob2RSZXR1cm5WYWx1ZSA9IENsYXNzVG9vbHMuYXR0ZW1wdFRvRXhlY3V0ZVN0YXRpY01ldGhvZChqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCAidG9TdHJpbmciKTsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoTWV0aG9kRXhjZXB0aW9uIG5vdCB0aHJvd246ICIgKyBib2d1c1N0YXRpY01ldGhvZFJldHVyblZhbHVlLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldEZpZWxkVmFsdWUoKSB7Ci0JCVZlY3RvcjxTdHJpbmc+IHYgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKLQkJT2JqZWN0W10gbmV3RWxlbWVudERhdGEgPSBuZXcgT2JqZWN0WzVdOwotCQluZXdFbGVtZW50RGF0YVswXSA9ICJmb28iOwotCQlDbGFzc1Rvb2xzLnNldEZpZWxkVmFsdWUodiwgImVsZW1lbnREYXRhIiwgbmV3RWxlbWVudERhdGEpOwotCQlDbGFzc1Rvb2xzLnNldEZpZWxkVmFsdWUodiwgImVsZW1lbnRDb3VudCIsIG5ldyBJbnRlZ2VyKDEpKTsKLQkJLy8gdGVzdCBpbmhlcml0ZWQgZmllbGQKLQkJQ2xhc3NUb29scy5zZXRGaWVsZFZhbHVlKHYsICJtb2RDb3VudCIsIG5ldyBJbnRlZ2VyKDEpKTsKLQkJYXNzZXJ0VHJ1ZSh2LmNvbnRhaW5zKCJmb28iKSk7Ci0KLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJQ2xhc3NUb29scy5hdHRlbXB0VG9TZXRGaWVsZFZhbHVlKHYsICJib2d1c0ZpZWxkIiwgImZvbyIpOwotCQl9IGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEZpZWxkRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFN0YXRpY0ZpZWxkVmFsdWUoKSB7Ci0JCUNsYXNzVG9vbHMuc2V0U3RhdGljRmllbGRWYWx1ZSh0aGlzLmdldENsYXNzKCksICJ0ZXN0U3RhdGljRmllbGQiLCAibmV3IHZhbHVlIik7Ci0JCWFzc2VydEVxdWFscyh0ZXN0U3RhdGljRmllbGQsICJuZXcgdmFsdWUiKTsKLQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlDbGFzc1Rvb2xzLmF0dGVtcHRUb1NldFN0YXRpY0ZpZWxkVmFsdWUodGhpcy5nZXRDbGFzcygpLCAiYm9ndXNTdGF0aWNGaWVsZCIsICJuZXcgdmFsdWUiKTsKLQkJfSBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaG9ydE5hbWUoKSB7Ci0JCWFzc2VydEVxdWFscygiVmVjdG9yIiwgQ2xhc3NUb29scy5zaG9ydENsYXNzTmFtZUZvck9iamVjdChuZXcgamF2YS51dGlsLlZlY3RvcjxPYmplY3Q+KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJWZWN0b3IiLCBDbGFzc1Rvb2xzLnNob3J0TmFtZUZvcihqYXZhLnV0aWwuVmVjdG9yLmNsYXNzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5lc3RlZE5hbWUoKSB7Ci0JCU1hcDxTdHJpbmcsIFN0cmluZz4gbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0JCW1hcC5wdXQoImZvbyIsICJiYXIiKTsKLQkJRW50cnk8U3RyaW5nLCBTdHJpbmc+IGVudHJ5ID0gbWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRW50cnkiLCBDbGFzc1Rvb2xzLm5lc3RlZENsYXNzTmFtZUZvck9iamVjdChlbnRyeSkpOwotCQlhc3NlcnRFcXVhbHMoIkVudHJ5IiwgQ2xhc3NUb29scy5uZXN0ZWROYW1lRm9yKGphdmEudXRpbC5NYXAuRW50cnkuY2xhc3MpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGFja2FnZU5hbWUoKSB7Ci0JCWFzc2VydEVxdWFscygiamF2YS51dGlsIiwgQ2xhc3NUb29scy5wYWNrYWdlTmFtZUZvcihqYXZhLnV0aWwuVmVjdG9yLmNsYXNzKSk7Ci0JCWFzc2VydEVxdWFscygiamF2YS51dGlsIiwgQ2xhc3NUb29scy5wYWNrYWdlTmFtZUZvcihqYXZhLnV0aWwuTWFwLkVudHJ5LmNsYXNzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFycmF5RGVwdGhGb3IoKSB7Ci0JCWFzc2VydEVxdWFscygwLCBDbGFzc1Rvb2xzLmFycmF5RGVwdGhGb3IoamF2YS51dGlsLlZlY3Rvci5jbGFzcykpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ2xhc3NUb29scy5hcnJheURlcHRoRm9yKGludC5jbGFzcykpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ2xhc3NUb29scy5hcnJheURlcHRoRm9yKHZvaWQuY2xhc3MpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENsYXNzVG9vbHMuYXJyYXlEZXB0aEZvcihqYXZhLnV0aWwuVmVjdG9yW10uY2xhc3MpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENsYXNzVG9vbHMuYXJyYXlEZXB0aEZvcihpbnRbXS5jbGFzcykpOwotCQlhc3NlcnRFcXVhbHMoMywgQ2xhc3NUb29scy5hcnJheURlcHRoRm9yKGphdmEudXRpbC5WZWN0b3JbXVtdW10uY2xhc3MpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIENsYXNzVG9vbHMuYXJyYXlEZXB0aEZvcihpbnRbXVtdW10uY2xhc3MpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlEZXB0aEZvck9iamVjdCgpIHsKLQkJYXNzZXJ0RXF1YWxzKDAsIENsYXNzVG9vbHMuYXJyYXlEZXB0aEZvck9iamVjdChuZXcgamF2YS51dGlsLlZlY3RvcjxPYmplY3Q+KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENsYXNzVG9vbHMuYXJyYXlEZXB0aEZvck9iamVjdChuZXcgamF2YS51dGlsLlZlY3RvclswXSkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ2xhc3NUb29scy5hcnJheURlcHRoRm9yT2JqZWN0KG5ldyBpbnRbMF0pKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIENsYXNzVG9vbHMuYXJyYXlEZXB0aEZvck9iamVjdChuZXcgamF2YS51dGlsLlZlY3RvclswXVswXVswXSkpOwotCQlhc3NlcnRFcXVhbHMoMywgQ2xhc3NUb29scy5hcnJheURlcHRoRm9yT2JqZWN0KG5ldyBpbnRbMF1bMF1bMF0pKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlEZXB0aEZvckNsYXNzTmFtZWQoKSB7Ci0JCWFzc2VydEVxdWFscygwLCBDbGFzc1Rvb2xzLmFycmF5RGVwdGhGb3JDbGFzc05hbWVkKGphdmEudXRpbC5WZWN0b3IuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDbGFzc1Rvb2xzLmFycmF5RGVwdGhGb3JDbGFzc05hbWVkKGludC5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENsYXNzVG9vbHMuYXJyYXlEZXB0aEZvckNsYXNzTmFtZWQodm9pZC5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENsYXNzVG9vbHMuYXJyYXlEZXB0aEZvckNsYXNzTmFtZWQoamF2YS51dGlsLlZlY3RvcltdLmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ2xhc3NUb29scy5hcnJheURlcHRoRm9yQ2xhc3NOYW1lZChpbnRbXS5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIENsYXNzVG9vbHMuYXJyYXlEZXB0aEZvckNsYXNzTmFtZWQoamF2YS51dGlsLlZlY3RvcltdW11bXS5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIENsYXNzVG9vbHMuYXJyYXlEZXB0aEZvckNsYXNzTmFtZWQoaW50W11bXVtdLmNsYXNzLmdldE5hbWUoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbGVtZW50VHlwZUZvcigpIHsKLQkJYXNzZXJ0RXF1YWxzKGphdmEudXRpbC5WZWN0b3IuY2xhc3MsIENsYXNzVG9vbHMuZWxlbWVudFR5cGVGb3IoamF2YS51dGlsLlZlY3Rvci5jbGFzcykpOwotCQlhc3NlcnRFcXVhbHMoaW50LmNsYXNzLCBDbGFzc1Rvb2xzLmVsZW1lbnRUeXBlRm9yKGludC5jbGFzcykpOwotCQlhc3NlcnRFcXVhbHModm9pZC5jbGFzcywgQ2xhc3NUb29scy5lbGVtZW50VHlwZUZvcih2b2lkLmNsYXNzKSk7Ci0JCWFzc2VydEVxdWFscyhqYXZhLnV0aWwuVmVjdG9yLmNsYXNzLCBDbGFzc1Rvb2xzLmVsZW1lbnRUeXBlRm9yKGphdmEudXRpbC5WZWN0b3JbXS5jbGFzcykpOwotCQlhc3NlcnRFcXVhbHMoaW50LmNsYXNzLCBDbGFzc1Rvb2xzLmVsZW1lbnRUeXBlRm9yKGludFtdLmNsYXNzKSk7Ci0JCWFzc2VydEVxdWFscyhqYXZhLnV0aWwuVmVjdG9yLmNsYXNzLCBDbGFzc1Rvb2xzLmVsZW1lbnRUeXBlRm9yKGphdmEudXRpbC5WZWN0b3JbXVtdW10uY2xhc3MpKTsKLQkJYXNzZXJ0RXF1YWxzKGludC5jbGFzcywgQ2xhc3NUb29scy5lbGVtZW50VHlwZUZvcihpbnRbXVtdW10uY2xhc3MpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RWxlbWVudFR5cGVGb3JPYmplY3QoKSB7Ci0JCWFzc2VydEVxdWFscyhqYXZhLnV0aWwuVmVjdG9yLmNsYXNzLCBDbGFzc1Rvb2xzLmVsZW1lbnRUeXBlRm9yT2JqZWN0KG5ldyBqYXZhLnV0aWwuVmVjdG9yPE9iamVjdD4oKSkpOwotCQlhc3NlcnRFcXVhbHMoamF2YS51dGlsLlZlY3Rvci5jbGFzcywgQ2xhc3NUb29scy5lbGVtZW50VHlwZUZvck9iamVjdChuZXcgamF2YS51dGlsLlZlY3RvclswXSkpOwotCQlhc3NlcnRFcXVhbHMoaW50LmNsYXNzLCBDbGFzc1Rvb2xzLmVsZW1lbnRUeXBlRm9yT2JqZWN0KG5ldyBpbnRbMF0pKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmEudXRpbC5WZWN0b3IuY2xhc3MsIENsYXNzVG9vbHMuZWxlbWVudFR5cGVGb3JPYmplY3QobmV3IGphdmEudXRpbC5WZWN0b3JbMF1bMF1bMF0pKTsKLQkJYXNzZXJ0RXF1YWxzKGludC5jbGFzcywgQ2xhc3NUb29scy5lbGVtZW50VHlwZUZvck9iamVjdChuZXcgaW50WzBdWzBdWzBdKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVsZW1lbnRUeXBlTmFtZUZvcigpIHsKLQkJYXNzZXJ0RXF1YWxzKGphdmEudXRpbC5WZWN0b3IuY2xhc3MuZ2V0TmFtZSgpLCBDbGFzc1Rvb2xzLmVsZW1lbnRUeXBlTmFtZUZvcihqYXZhLnV0aWwuVmVjdG9yLmNsYXNzKSk7Ci0JCWFzc2VydEVxdWFscyhpbnQuY2xhc3MuZ2V0TmFtZSgpLCBDbGFzc1Rvb2xzLmVsZW1lbnRUeXBlTmFtZUZvcihpbnQuY2xhc3MpKTsKLQkJYXNzZXJ0RXF1YWxzKHZvaWQuY2xhc3MuZ2V0TmFtZSgpLCBDbGFzc1Rvb2xzLmVsZW1lbnRUeXBlTmFtZUZvcih2b2lkLmNsYXNzKSk7Ci0JCWFzc2VydEVxdWFscyhqYXZhLnV0aWwuVmVjdG9yLmNsYXNzLmdldE5hbWUoKSwgQ2xhc3NUb29scy5lbGVtZW50VHlwZU5hbWVGb3IoamF2YS51dGlsLlZlY3RvcltdLmNsYXNzKSk7Ci0JCWFzc2VydEVxdWFscyhpbnQuY2xhc3MuZ2V0TmFtZSgpLCBDbGFzc1Rvb2xzLmVsZW1lbnRUeXBlTmFtZUZvcihpbnRbXS5jbGFzcykpOwotCQlhc3NlcnRFcXVhbHMoamF2YS51dGlsLlZlY3Rvci5jbGFzcy5nZXROYW1lKCksIENsYXNzVG9vbHMuZWxlbWVudFR5cGVOYW1lRm9yKGphdmEudXRpbC5WZWN0b3JbXVtdW10uY2xhc3MpKTsKLQkJYXNzZXJ0RXF1YWxzKGludC5jbGFzcy5nZXROYW1lKCksIENsYXNzVG9vbHMuZWxlbWVudFR5cGVOYW1lRm9yKGludFtdW11bXS5jbGFzcykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbGVtZW50VHlwZU5hbWVGb3JDbGFzc05hbWVkKCkgewotCQlhc3NlcnRFcXVhbHMoamF2YS51dGlsLlZlY3Rvci5jbGFzcy5nZXROYW1lKCksIENsYXNzVG9vbHMuZWxlbWVudFR5cGVOYW1lRm9yQ2xhc3NOYW1lZChqYXZhLnV0aWwuVmVjdG9yLmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRFcXVhbHMoaW50LmNsYXNzLmdldE5hbWUoKSwgQ2xhc3NUb29scy5lbGVtZW50VHlwZU5hbWVGb3JDbGFzc05hbWVkKGludC5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKHZvaWQuY2xhc3MuZ2V0TmFtZSgpLCBDbGFzc1Rvb2xzLmVsZW1lbnRUeXBlTmFtZUZvckNsYXNzTmFtZWQodm9pZC5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmEudXRpbC5WZWN0b3IuY2xhc3MuZ2V0TmFtZSgpLCBDbGFzc1Rvb2xzLmVsZW1lbnRUeXBlTmFtZUZvckNsYXNzTmFtZWQoamF2YS51dGlsLlZlY3RvcltdLmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRFcXVhbHMoaW50LmNsYXNzLmdldE5hbWUoKSwgQ2xhc3NUb29scy5lbGVtZW50VHlwZU5hbWVGb3JDbGFzc05hbWVkKGludFtdLmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRFcXVhbHMoamF2YS51dGlsLlZlY3Rvci5jbGFzcy5nZXROYW1lKCksIENsYXNzVG9vbHMuZWxlbWVudFR5cGVOYW1lRm9yQ2xhc3NOYW1lZChqYXZhLnV0aWwuVmVjdG9yW11bXVtdLmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRFcXVhbHMoaW50LmNsYXNzLmdldE5hbWUoKSwgQ2xhc3NUb29scy5lbGVtZW50VHlwZU5hbWVGb3JDbGFzc05hbWVkKGludFtdW11bXS5jbGFzcy5nZXROYW1lKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xhc3NDb2RlcygpIHsKLQkJYXNzZXJ0RXF1YWxzKCJieXRlIiwgQ2xhc3NUb29scy5jbGFzc05hbWVGb3JDb2RlKCdCJykpOwotCQlhc3NlcnRFcXVhbHMoImNoYXIiLCBDbGFzc1Rvb2xzLmNsYXNzTmFtZUZvckNvZGUoJ0MnKSk7Ci0JCWFzc2VydEVxdWFscygiZG91YmxlIiwgQ2xhc3NUb29scy5jbGFzc05hbWVGb3JDb2RlKCdEJykpOwotCQlhc3NlcnRFcXVhbHMoImZsb2F0IiwgQ2xhc3NUb29scy5jbGFzc05hbWVGb3JDb2RlKCdGJykpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIENsYXNzVG9vbHMuY2xhc3NOYW1lRm9yQ29kZSgnSScpKTsKLQkJYXNzZXJ0RXF1YWxzKCJsb25nIiwgQ2xhc3NUb29scy5jbGFzc05hbWVGb3JDb2RlKCdKJykpOwotCQlhc3NlcnRFcXVhbHMoInNob3J0IiwgQ2xhc3NUb29scy5jbGFzc05hbWVGb3JDb2RlKCdTJykpOwotCQlhc3NlcnRFcXVhbHMoImJvb2xlYW4iLCBDbGFzc1Rvb2xzLmNsYXNzTmFtZUZvckNvZGUoJ1onKSk7Ci0JCWFzc2VydEVxdWFscygidm9pZCIsIENsYXNzVG9vbHMuY2xhc3NOYW1lRm9yQ29kZSgnVicpKTsKLQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlDbGFzc1Rvb2xzLmNsYXNzTmFtZUZvckNvZGUoJ1gnKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsYXNzTmFtZWRJc1RvcExldmVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydFRydWUoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNUb3BMZXZlbChqYXZhLnV0aWwuTWFwLmNsYXNzLmdldE5hbWUoKSkpOyAvLyB0b3AtbGV2ZWwKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNUb3BMZXZlbChqYXZhLnV0aWwuTWFwLkVudHJ5LmNsYXNzLmdldE5hbWUoKSkpOyAvLyBtZW1iZXIKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNUb3BMZXZlbChDbGFzcy5mb3JOYW1lKG11bmdlKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiJDEkTG9jYWxDbGFzcyIpKS5nZXROYW1lKCkpKTsgLy8gbG9jYWwKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNUb3BMZXZlbChDbGFzcy5mb3JOYW1lKCJqYXZhLnV0aWwuVmVjdG9yJDEiKS5nZXROYW1lKCkpKTsgLy8gYW5vbnltb3VzCi0KLQkJT2JqZWN0W10gYXJyYXkgPSBuZXcgamF2YS51dGlsLk1hcFswXTsgLy8gdG9wLWxldmVsCi0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzVG9wTGV2ZWwoYXJyYXkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKTsKLQkJYXJyYXkgPSBuZXcgamF2YS51dGlsLk1hcC5FbnRyeVswXTsgLy8gbWVtYmVyCi0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzVG9wTGV2ZWwoYXJyYXkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKTsKLQkJQ2xhc3M8Pz4gbG9jYWxDbGFzcyA9IENsYXNzLmZvck5hbWUobXVuZ2UodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSArICIkMSRMb2NhbENsYXNzIikpOyAvLyBsb2NhbAotCQlhcnJheSA9IChPYmplY3RbXSkgQXJyYXkubmV3SW5zdGFuY2UobG9jYWxDbGFzcywgMCk7Ci0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzVG9wTGV2ZWwoYXJyYXkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKTsKLQkJQ2xhc3M8Pz4gYW5vbkNsYXNzID0gQ2xhc3MuZm9yTmFtZSgiamF2YS51dGlsLlZlY3RvciQxIik7IC8vIGxvY2FsCi0JCWFycmF5ID0gKE9iamVjdFtdKSBBcnJheS5uZXdJbnN0YW5jZShhbm9uQ2xhc3MsIDApOwotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc1RvcExldmVsKGFycmF5LmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsYXNzTmFtZWRJc01lbWJlcigpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc01lbWJlcihqYXZhLnV0aWwuTWFwLmNsYXNzLmdldE5hbWUoKSkpOyAvLyB0b3AtbGV2ZWwKLQkJYXNzZXJ0VHJ1ZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc01lbWJlcihqYXZhLnV0aWwuTWFwLkVudHJ5LmNsYXNzLmdldE5hbWUoKSkpOyAvLyBtZW1iZXIKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNNZW1iZXIoQ2xhc3MuZm9yTmFtZShtdW5nZSh0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiQxJExvY2FsQ2xhc3MiKSkuZ2V0TmFtZSgpKSk7IC8vIGxvY2FsCi0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzTWVtYmVyKENsYXNzLmZvck5hbWUoImphdmEudXRpbC5WZWN0b3IkMSIpLmdldE5hbWUoKSkpOyAvLyBhbm9ueW1vdXMKLQotCQlPYmplY3RbXSBhcnJheSA9IG5ldyBqYXZhLnV0aWwuTWFwWzBdOyAvLyB0b3AtbGV2ZWwKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNNZW1iZXIoYXJyYXkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKTsKLQkJYXJyYXkgPSBuZXcgamF2YS51dGlsLk1hcC5FbnRyeVswXTsgLy8gbWVtYmVyCi0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzTWVtYmVyKGFycmF5LmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7Ci0JCUNsYXNzPD8+IGxvY2FsQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKG11bmdlKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiJDEkTG9jYWxDbGFzcyIpKTsgLy8gbG9jYWwKLQkJYXJyYXkgPSAoT2JqZWN0W10pIEFycmF5Lm5ld0luc3RhbmNlKGxvY2FsQ2xhc3MsIDApOwotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc01lbWJlcihhcnJheS5nZXRDbGFzcygpLmdldE5hbWUoKSkpOwotCQlDbGFzczw/PiBhbm9uQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKCJqYXZhLnV0aWwuVmVjdG9yJDEiKTsgLy8gbG9jYWwKLQkJYXJyYXkgPSAoT2JqZWN0W10pIEFycmF5Lm5ld0luc3RhbmNlKGFub25DbGFzcywgMCk7Ci0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzTWVtYmVyKGFycmF5LmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7Ci0KLQkJLy8gdGVzdCBhIGZldyBlZGdlIGNhc2VzCi0JCWFzc2VydFRydWUoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNNZW1iZXIoImphdmEudXRpbC5NYXAkYTEiKSk7Ci0JCWFzc2VydFRydWUoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNNZW1iZXIoImphdmEudXRpbC5NYXAkYTEkYWFhJGJiYiIpKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNNZW1iZXIoImphdmEudXRpbC5NYXAkMWExJGFhYSIpKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNNZW1iZXIoImphdmEudXRpbC5NYXAkMWEiKSk7Ci0JCWFzc2VydFRydWUoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNNZW1iZXIoImphdmEudXRpbC5NYXAkYTEyMzQ1JGIxMjM0NSIpKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNNZW1iZXIoImphdmEudXRpbC5NYXAkMTIzNDVhIikpOwotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc01lbWJlcigiamF2YS51dGlsLk1hcCQzMzMiKSk7Ci0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzTWVtYmVyKCJqYXZhLnV0aWwuTWFwMyQzMzMiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsYXNzTmFtZWRJc0xvY2FsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNsYXNzIExvY2FsQ2xhc3MgewotCQkJdm9pZCBmb28oKSB7Ci0JCQkJU3lzdGVtLmdldFByb3BlcnR5KCJmb28iKTsKLQkJCX0KLQkJfQotCQluZXcgTG9jYWxDbGFzcygpLmZvbygpOwotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc0xvY2FsKGphdmEudXRpbC5NYXAuY2xhc3MuZ2V0TmFtZSgpKSk7IC8vIHRvcC1sZXZlbAotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc0xvY2FsKGphdmEudXRpbC5NYXAuRW50cnkuY2xhc3MuZ2V0TmFtZSgpKSk7IC8vIG1lbWJlcgotCQlhc3NlcnRUcnVlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzTG9jYWwoQ2xhc3MuZm9yTmFtZShtdW5nZSh0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiQxJExvY2FsQ2xhc3MiKSkuZ2V0TmFtZSgpKSk7IC8vIGxvY2FsCi0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzTG9jYWwoQ2xhc3MuZm9yTmFtZSgiamF2YS51dGlsLlZlY3RvciQxIikuZ2V0TmFtZSgpKSk7IC8vIGFub255bW91cwotCi0JCU9iamVjdFtdIGFycmF5ID0gbmV3IGphdmEudXRpbC5NYXBbMF07IC8vIHRvcC1sZXZlbAotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc0xvY2FsKGFycmF5LmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7Ci0JCWFycmF5ID0gbmV3IGphdmEudXRpbC5NYXAuRW50cnlbMF07IC8vIG1lbWJlcgotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc0xvY2FsKGFycmF5LmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7Ci0JCUNsYXNzPD8+IGxvY2FsQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKG11bmdlKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiJDEkTG9jYWxDbGFzcyIpKTsgLy8gbG9jYWwKLQkJYXJyYXkgPSAoT2JqZWN0W10pIEFycmF5Lm5ld0luc3RhbmNlKGxvY2FsQ2xhc3MsIDApOwotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc0xvY2FsKGFycmF5LmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7Ci0JCUNsYXNzPD8+IGFub25DbGFzcyA9IENsYXNzLmZvck5hbWUoImphdmEudXRpbC5WZWN0b3IkMSIpOyAvLyBsb2NhbAotCQlhcnJheSA9IChPYmplY3RbXSkgQXJyYXkubmV3SW5zdGFuY2UoYW5vbkNsYXNzLCAwKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNMb2NhbChhcnJheS5nZXRDbGFzcygpLmdldE5hbWUoKSkpOwotCi0JCS8vIHRlc3QgYSBmZXcgZWRnZSBjYXNlcwotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc0xvY2FsKCJqYXZhLnV0aWwuTWFwJGExIikpOwotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc0xvY2FsKCJqYXZhLnV0aWwuTWFwJGExJGFhYSRiYmIiKSk7Ci0JCWFzc2VydFRydWUoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNMb2NhbCgiamF2YS51dGlsLk1hcCQxMSRhYWEiKSk7Ci0JCWFzc2VydFRydWUoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNMb2NhbCgiamF2YS51dGlsLk1hcCQxJGEiKSk7IC8vIGVjbGlwc2UgbmFtaW5nIGNvbnZlbnRpb24KLQkJYXNzZXJ0VHJ1ZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc0xvY2FsKCJqYXZhLnV0aWwuTWFwJDIkYWJjIikpOyAvLyBlY2xpcHNlIG5hbWluZyBjb252ZW50aW9uCi0JCWFzc2VydFRydWUoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNMb2NhbCgiamF2YS51dGlsLk1hcCQyJGFiYzEiKSk7IC8vIGVjbGlwc2UgbmFtaW5nIGNvbnZlbnRpb24KLQkJYXNzZXJ0VHJ1ZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc0xvY2FsKCJqYXZhLnV0aWwuTWFwJDFhIikpOyAvLyBqZGsgbmFtaW5nIGNvbnZlbnRpb24KLQkJYXNzZXJ0VHJ1ZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc0xvY2FsKCJqYXZhLnV0aWwuTWFwJDJhYmMiKSk7IC8vIGpkayBuYW1pbmcgY29udmVudGlvbgotCQlhc3NlcnRUcnVlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzTG9jYWwoImphdmEudXRpbC5NYXAkMmFiYzEiKSk7IC8vIGpkayBuYW1pbmcgY29udmVudGlvbgotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc0xvY2FsKCJqYXZhLnV0aWwuTWFwJGExMjM0NSRiMTIzNDUiKSk7Ci0JCWFzc2VydFRydWUoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNMb2NhbCgiamF2YS51dGlsLk1hcCQxMjM0NSRhMTIzNCIpKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNMb2NhbCgiamF2YS51dGlsLk1hcCQzMzMiKSk7Ci0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzTG9jYWwoImphdmEudXRpbC5NYXAzJDMzMyIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xhc3NOYW1lZElzQW5vbnltb3VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzQW5vbnltb3VzKGphdmEudXRpbC5NYXAuY2xhc3MuZ2V0TmFtZSgpKSk7IC8vIHRvcC1sZXZlbAotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc0Fub255bW91cyhqYXZhLnV0aWwuTWFwLkVudHJ5LmNsYXNzLmdldE5hbWUoKSkpOyAvLyBtZW1iZXIKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNBbm9ueW1vdXMoQ2xhc3MuZm9yTmFtZShtdW5nZSh0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiQxJExvY2FsQ2xhc3MiKSkuZ2V0TmFtZSgpKSk7IC8vIGxvY2FsCi0JCWFzc2VydFRydWUoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNBbm9ueW1vdXMoQ2xhc3MuZm9yTmFtZSgiamF2YS51dGlsLlZlY3RvciQxIikuZ2V0TmFtZSgpKSk7IC8vIGFub255bW91cwotCi0JCU9iamVjdFtdIGFycmF5ID0gbmV3IGphdmEudXRpbC5NYXBbMF07IC8vIHRvcC1sZXZlbAotCQlhc3NlcnRGYWxzZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc0Fub255bW91cyhhcnJheS5nZXRDbGFzcygpLmdldE5hbWUoKSkpOwotCQlhcnJheSA9IG5ldyBqYXZhLnV0aWwuTWFwLkVudHJ5WzBdOyAvLyBtZW1iZXIKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNBbm9ueW1vdXMoYXJyYXkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKTsKLQkJQ2xhc3M8Pz4gbG9jYWxDbGFzcyA9IENsYXNzLmZvck5hbWUobXVuZ2UodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSArICIkMSRMb2NhbENsYXNzIikpOyAvLyBsb2NhbAotCQlhcnJheSA9IChPYmplY3RbXSkgQXJyYXkubmV3SW5zdGFuY2UobG9jYWxDbGFzcywgMCk7Ci0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzQW5vbnltb3VzKGFycmF5LmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7Ci0JCUNsYXNzPD8+IGFub25DbGFzcyA9IENsYXNzLmZvck5hbWUoImphdmEudXRpbC5WZWN0b3IkMSIpOyAvLyBsb2NhbAotCQlhcnJheSA9IChPYmplY3RbXSkgQXJyYXkubmV3SW5zdGFuY2UoYW5vbkNsYXNzLCAwKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNBbm9ueW1vdXMoYXJyYXkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKTsKLQotCQkvLyB0ZXN0IGEgZmV3IGVkZ2UgY2FzZXMKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNBbm9ueW1vdXMoImphdmEudXRpbC5NYXAkYTEiKSk7Ci0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzQW5vbnltb3VzKCJqYXZhLnV0aWwuTWFwJGExJGFhYSRiYmIiKSk7Ci0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzQW5vbnltb3VzKCJqYXZhLnV0aWwuTWFwJDFhMSRhYWEiKSk7Ci0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzQW5vbnltb3VzKCJqYXZhLnV0aWwuTWFwJDEkYSIpKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NUb29scy5jbGFzc05hbWVkSXNBbm9ueW1vdXMoImphdmEudXRpbC5NYXAkMWEiKSk7Ci0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzQW5vbnltb3VzKCJqYXZhLnV0aWwuTWFwJGExMjM0NSRiMTIzNDUiKSk7Ci0JCWFzc2VydEZhbHNlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzQW5vbnltb3VzKCJqYXZhLnV0aWwuTWFwJDEyMzQ1JGExMjM0IikpOwotCQlhc3NlcnRUcnVlKENsYXNzVG9vbHMuY2xhc3NOYW1lZElzQW5vbnltb3VzKCJqYXZhLnV0aWwuTWFwJDMzMyIpKTsKLQkJYXNzZXJ0VHJ1ZShDbGFzc1Rvb2xzLmNsYXNzTmFtZWRJc0Fub255bW91cygiamF2YS51dGlsLk1hcDMkMzMzIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2RlRm9yQ2xhc3MoKSB7Ci0JCWFzc2VydEVxdWFscygnSScsIENsYXNzVG9vbHMuY29kZUZvckNsYXNzKGludC5jbGFzcykpOwotCQlhc3NlcnRFcXVhbHMoJ0InLCBDbGFzc1Rvb2xzLmNvZGVGb3JDbGFzcyhieXRlLmNsYXNzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvZGVGb3JDbGFzc05hbWVkKCkgewotCQlhc3NlcnRFcXVhbHMoJ0knLCBDbGFzc1Rvb2xzLmNvZGVGb3JDbGFzc05hbWVkKGludC5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCdJJywgQ2xhc3NUb29scy5jb2RlRm9yQ2xhc3NOYW1lZCgiaW50IikpOwotCQlhc3NlcnRFcXVhbHMoJ0InLCBDbGFzc1Rvb2xzLmNvZGVGb3JDbGFzc05hbWVkKGJ5dGUuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEVxdWFscygnQicsIENsYXNzVG9vbHMuY29kZUZvckNsYXNzTmFtZWQoImJ5dGUiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsYXNzRm9yVHlwZURlY2xhcmF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscyhpbnQuY2xhc3MsIENsYXNzVG9vbHMuY2xhc3NGb3JUeXBlRGVjbGFyYXRpb24oImludCIsIDApKTsKLQkJYXNzZXJ0RXF1YWxzKGludFtdLmNsYXNzLCBDbGFzc1Rvb2xzLmNsYXNzRm9yVHlwZURlY2xhcmF0aW9uKCJpbnQiLCAxKSk7Ci0JCWFzc2VydEVxdWFscyhpbnRbXVtdW10uY2xhc3MsIENsYXNzVG9vbHMuY2xhc3NGb3JUeXBlRGVjbGFyYXRpb24oImludCIsIDMpKTsKLQotCQlhc3NlcnRFcXVhbHMoT2JqZWN0LmNsYXNzLCBDbGFzc1Rvb2xzLmNsYXNzRm9yVHlwZURlY2xhcmF0aW9uKCJqYXZhLmxhbmcuT2JqZWN0IiwgMCkpOwotCQlhc3NlcnRFcXVhbHMoT2JqZWN0W11bXVtdLmNsYXNzLCBDbGFzc1Rvb2xzLmNsYXNzRm9yVHlwZURlY2xhcmF0aW9uKCJqYXZhLmxhbmcuT2JqZWN0IiwgMykpOwotCi0JCWFzc2VydEVxdWFscyh2b2lkLmNsYXNzLCBDbGFzc1Rvb2xzLmNsYXNzRm9yVHlwZURlY2xhcmF0aW9uKCJ2b2lkIiwgMCkpOwotCQl0cnkgewotCQkJQ2xhc3NUb29scy5jbGFzc0ZvclR5cGVEZWNsYXJhdGlvbih2b2lkLmNsYXNzLmdldE5hbWUoKSwgMSk7Ci0JCQlmYWlsKCJzaG91bGQgbm90IGdldCBoZXJlLi4uIik7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKLQkJCS8vIGV4cGVjdGVkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xhc3NOYW1lRm9yVHlwZURlY2xhcmF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscyhpbnQuY2xhc3MuZ2V0TmFtZSgpLCBDbGFzc1Rvb2xzLmNsYXNzTmFtZUZvclR5cGVEZWNsYXJhdGlvbigiaW50IiwgMCkpOwotCQlhc3NlcnRFcXVhbHMoaW50W10uY2xhc3MuZ2V0TmFtZSgpLCBDbGFzc1Rvb2xzLmNsYXNzTmFtZUZvclR5cGVEZWNsYXJhdGlvbigiaW50IiwgMSkpOwotCQlhc3NlcnRFcXVhbHMoaW50W11bXVtdLmNsYXNzLmdldE5hbWUoKSwgQ2xhc3NUb29scy5jbGFzc05hbWVGb3JUeXBlRGVjbGFyYXRpb24oImludCIsIDMpKTsKLQotCQlhc3NlcnRFcXVhbHMoT2JqZWN0LmNsYXNzLmdldE5hbWUoKSwgQ2xhc3NUb29scy5jbGFzc05hbWVGb3JUeXBlRGVjbGFyYXRpb24oImphdmEubGFuZy5PYmplY3QiLCAwKSk7Ci0JCWFzc2VydEVxdWFscyhPYmplY3RbXVtdW10uY2xhc3MuZ2V0TmFtZSgpLCBDbGFzc1Rvb2xzLmNsYXNzTmFtZUZvclR5cGVEZWNsYXJhdGlvbigiamF2YS5sYW5nLk9iamVjdCIsIDMpKTsKLQotCQlhc3NlcnRFcXVhbHModm9pZC5jbGFzcy5nZXROYW1lKCksIENsYXNzVG9vbHMuY2xhc3NOYW1lRm9yVHlwZURlY2xhcmF0aW9uKCJ2b2lkIiwgMCkpOwotCQl0cnkgewotCQkJQ2xhc3NUb29scy5jbGFzc05hbWVGb3JUeXBlRGVjbGFyYXRpb24odm9pZC5jbGFzcy5nZXROYW1lKCksIDEpOwotCQkJZmFpbCgic2hvdWxkIG5vdCBnZXQgaGVyZS4uLiIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCS8vIGV4cGVjdGVkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gbmFtZXMoRmllbGRbXSBmaWVsZHMpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPEZpZWxkLCBTdHJpbmc+KENvbGxlY3Rpb25Ub29scy5pdGVyYXRvcihmaWVsZHMpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEZpZWxkIGZpZWxkKSB7Ci0JCQkJcmV0dXJuIGZpZWxkLmdldE5hbWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gbmFtZXMoTWV0aG9kW10gbWV0aG9kcykgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8TWV0aG9kLCBTdHJpbmc+KENvbGxlY3Rpb25Ub29scy5pdGVyYXRvcihtZXRob2RzKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShNZXRob2QgbWV0aG9kKSB7Ci0JCQkJcmV0dXJuIG1ldGhvZC5nZXROYW1lKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0NsYXNzcGF0aFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0NsYXNzcGF0aFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0YmVlYTAuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9DbGFzc3BhdGhUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLmphci5KYXJFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuamFyLkphckZpbGU7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNsYXNzcGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci0KLXB1YmxpYyBjbGFzcyBDbGFzc3BhdGhUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV9IT01FID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmhvbWUiKTsKLQotCXB1YmxpYyBDbGFzc3BhdGhUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29tcHJlc3NlZCgpIHsKLQkJU3RyaW5nIHBhdGggPSAiIjsKLQotCQkvLyBubyBjaGFuZ2VzCi0JCXBhdGggPSBuZXcgQ2xhc3NwYXRoKHRoaXMubW9ycGgoIkM6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXHJ0LmphcjtDOlxcamRrXFxqYXdzLmphciIpKS5jb21wcmVzc2VkKCkucGF0aCgpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaCgiQzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGphd3MuamFyIiksIHBhdGgpOwotCi0JCXBhdGggPSBuZXcgQ2xhc3NwYXRoKHRoaXMubW9ycGgoIkM6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXHJ0LmphcjtDOlxcamRrXFxqYXdzLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcamF3cy5qYXIiKSkuY29tcHJlc3NlZCgpLnBhdGgoKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIkM6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXHJ0LmphcjtDOlxcamRrXFxqYXdzLmphciIpLCBwYXRoKTsKLQotCQlwYXRoID0gbmV3IENsYXNzcGF0aCh0aGlzLm1vcnBoKCJDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xcamF3cy5qYXIiKSkuY29tcHJlc3NlZCgpLnBhdGgoKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIkM6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXHJ0LmphcjtDOlxcamRrXFxqYXdzLmphciIpLCBwYXRoKTsKLQotCQlwYXRoID0gbmV3IENsYXNzcGF0aCh0aGlzLm1vcnBoKCJDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcamF3cy5qYXI7QzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGphd3MuamFyIikpLmNvbXByZXNzZWQoKS5wYXRoKCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcamF3cy5qYXIiKSwgcGF0aCk7Ci0KLQkJcGF0aCA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgiQzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGphd3MuamFyO0M6XFxqZGtcXHJ0LmphcjtDOlxcamRrXFxqYXdzLmphciIpKS5jb21wcmVzc2VkKCkucGF0aCgpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaCgiQzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGphd3MuamFyIiksIHBhdGgpOwotCi0JCXBhdGggPSBuZXcgQ2xhc3NwYXRoKHRoaXMubW9ycGgoIkM6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXHJ0LmphcjtDOlxcamRrXFxqYXdzLmphcjtDOlxcamRrXFxydC5qYXI7Ozs7QzpcXGpka1xcamF3cy5qYXI7QzpcXGpka1xcamF3cy5qYXI7QzpcXGpka1xccnQuamFyOzs7IikpLmNvbXByZXNzZWQoKS5wYXRoKCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcamF3cy5qYXIiKSwgcGF0aCk7Ci0KLQkJLy8gbm8gY2hhbmdlcwotCQlwYXRoID0gbmV3IENsYXNzcGF0aCh0aGlzLm1vcnBoKCJDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcamF3cy5qYXIiKSkuY29tcHJlc3NlZCgpLnBhdGgoKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIkM6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXHJ0LmphcjtDOlxcamRrXFxqYXdzLmphciIpLCBwYXRoKTsKLQotCQlwYXRoID0gbmV3IENsYXNzcGF0aCh0aGlzLm1vcnBoKCJDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcamF3cy5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGphd3MuamFyIikpLmNvbXByZXNzZWQoKS5wYXRoKCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcamF3cy5qYXIiKSwgcGF0aCk7Ci0KLQkJcGF0aCA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgiQzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXC4uXFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXGphd3MuamFyIikpLmNvbXByZXNzZWQoKS5wYXRoKCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcamF3cy5qYXIiKSwgcGF0aCk7Ci0KLQkJcGF0aCA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgiQzpcXGpkazFcXGpkazJcXGpkazNcXGkxOG4uamFyO0M6XFxqZGtcXHJ0LmphcjtDOlxcamRrMVxcamRrMlxcamRrM1xcLi5cXC4uXFwuLlxcamRrMVxcamRrMlxcamRrM1xcaTE4bi5qYXI7QzpcXGpka1xcamF3cy5qYXIiKSkuY29tcHJlc3NlZCgpLnBhdGgoKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIkM6XFxqZGsxXFxqZGsyXFxqZGszXFxpMThuLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcamF3cy5qYXIiKSwgcGF0aCk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFRvQ2xhc3NOYW1lKCkgewotCQlTdHJpbmcgZmlsZU5hbWUgPSAiamF2YS9sYW5nL1N0cmluZy5jbGFzcyI7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGZpbGVOYW1lKTsKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IENsYXNzcGF0aC5jb252ZXJ0VG9DbGFzc05hbWUoZmlsZSk7Ci0JCWFzc2VydEVxdWFscyhqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLmdldE5hbWUoKSwgY2xhc3NOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFRvQ2xhc3MoKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBmaWxlTmFtZSA9ICJqYXZhL2xhbmcvU3RyaW5nLmNsYXNzIjsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZmlsZU5hbWUpOwotCQlDbGFzczw/PiBqYXZhQ2xhc3MgPSBDbGFzc3BhdGguY29udmVydFRvQ2xhc3MoZmlsZSk7Ci0JCWFzc2VydEVxdWFscyhqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBqYXZhQ2xhc3MpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0VG9BcmNoaXZlQ2xhc3NGaWxlRW50cnlOYW1lKCkgewotCQlTdHJpbmcgZmlsZU5hbWUgPSBDbGFzc3BhdGguY29udmVydFRvQXJjaGl2ZUNsYXNzRmlsZUVudHJ5TmFtZShqYXZhLmxhbmcuU3RyaW5nLmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhL2xhbmcvU3RyaW5nLmNsYXNzIiwgZmlsZU5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0VG9DbGFzc0ZpbGVOYW1lKCkgewotCQljaGFyIHNjID0gRmlsZS5zZXBhcmF0b3JDaGFyOwotCQlTdHJpbmcgZmlsZU5hbWUgPSBDbGFzc3BhdGguY29udmVydFRvQ2xhc3NGaWxlTmFtZShqYXZhLmxhbmcuU3RyaW5nLmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhIiArIHNjICsgImxhbmciICsgc2MgKyAiU3RyaW5nLmNsYXNzIiwgZmlsZU5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0VG9KYXZhRmlsZU5hbWUoKSB7Ci0JCWNoYXIgc2MgPSBGaWxlLnNlcGFyYXRvckNoYXI7Ci0JCVN0cmluZyBmaWxlTmFtZSA9IENsYXNzcGF0aC5jb252ZXJ0VG9KYXZhRmlsZU5hbWUoamF2YS5sYW5nLlN0cmluZy5jbGFzcy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImphdmEiICsgc2MgKyAibGFuZyIgKyBzYyArICJTdHJpbmcuamF2YSIsIGZpbGVOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFRvVVJMcygpIHsKLQkJVVJMW10gZW50cmllcyA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgiQzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXGphd3MuamFyO0M6XFxmb29cXGNsYXNzZXM7QzpcXGJhclxcYmFyLmphciIpKS51cmxzKCk7Ci0JCWludCBpID0gMDsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGhVUkwoIi9DOi9qZGsvcnQuamFyIiksIGVudHJpZXNbaSsrXS5nZXRQYXRoKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaFVSTCgiL0M6L2pkay9pMThuLmphciIpLCBlbnRyaWVzW2krK10uZ2V0UGF0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGhVUkwoIi9DOi9qZGsvamF3cy5qYXIiKSwgZW50cmllc1tpKytdLmdldFBhdGgoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoVVJMKCIvQzovZm9vL2NsYXNzZXMiKSwgZW50cmllc1tpKytdLmdldFBhdGgoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoVVJMKCIvQzovYmFyL2Jhci5qYXIiKSwgZW50cmllc1tpKytdLmdldFBhdGgoKSk7Ci0JCWFzc2VydEVxdWFscyhpLCBlbnRyaWVzLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVudHJpZXMoKSB7Ci0JCUNsYXNzcGF0aCBjcCA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgiQzpcXGpka1xccnQuamFyOzsuO0M6XFxqZGtcXGkxOG4uamFyOzs7QzpcXGpka1xcamF3cy5qYXI7O0M6XFxmb29cXGNsYXNzZXM7QzpcXGJhclxcYmFyLmphcjtDOlxcYmFyXFxiYXIuamFyOyIpKTsKLQkJQ2xhc3NwYXRoLkVudHJ5W10gZW50cmllcyA9IGNwLmdldEVudHJpZXMoKTsKLQkJaW50IGkgPSAwOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaCgiQzpcXGpka1xccnQuamFyIiksIGVudHJpZXNbaSsrXS5maWxlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIi4iKSwgZW50cmllc1tpKytdLmZpbGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaCgiQzpcXGpka1xcaTE4bi5qYXIiKSwgZW50cmllc1tpKytdLmZpbGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaCgiQzpcXGpka1xcamF3cy5qYXIiKSwgZW50cmllc1tpKytdLmZpbGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaCgiQzpcXGZvb1xcY2xhc3NlcyIpLCBlbnRyaWVzW2krK10uZmlsZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcYmFyXFxiYXIuamFyIiksIGVudHJpZXNbaSsrXS5maWxlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIkM6XFxiYXJcXGJhci5qYXIiKSwgZW50cmllc1tpKytdLmZpbGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoaSwgZW50cmllcy5sZW5ndGgpOwotCi0JCWNwID0gY3AuY29tcHJlc3NlZCgpOwotCQllbnRyaWVzID0gY3AuZ2V0RW50cmllcygpOwotCQlpID0gMDsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIkM6XFxqZGtcXHJ0LmphciIpLCBlbnRyaWVzW2krK10uZmlsZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCIuIiksIGVudHJpZXNbaSsrXS5maWxlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIkM6XFxqZGtcXGkxOG4uamFyIiksIGVudHJpZXNbaSsrXS5maWxlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIkM6XFxqZGtcXGphd3MuamFyIiksIGVudHJpZXNbaSsrXS5maWxlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIkM6XFxmb29cXGNsYXNzZXMiKSwgZW50cmllc1tpKytdLmZpbGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaCgiQzpcXGJhclxcYmFyLmphciIpLCBlbnRyaWVzW2krK10uZmlsZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhpLCBlbnRyaWVzLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVudHJ5Rm9yRmlsZU5hbWVkKCkgewotCQlDbGFzc3BhdGguRW50cnkgZW50cnkgPSBudWxsOwotCi0JCS8vIGluIHRoZSBtaWRkbGUgLSBxdWFsaWZpZWQKLQkJZW50cnkgPSBuZXcgQ2xhc3NwYXRoKHRoaXMubW9ycGgoIkM6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXHJ0LmphcjtDOlxcamRrXFxqYXdzLmphcjtDOlxcZm9vXFxjbGFzc2VzO0M6XFxiYXJcXGJhci5qYXIiKSkuZW50cnlGb3JGaWxlTmFtZWQoInJ0LmphciIpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaCgiQzpcXGpka1xccnQuamFyIiksIGVudHJ5LmZpbGVOYW1lKCkpOwotCi0JCS8vIGluIHRoZSBtaWRkbGUgLSB1bnF1YWxpZmllZAotCQllbnRyeSA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgiQzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xcamF3cy5qYXI7cnQuamFyO0M6XFxmb29cXGNsYXNzZXM7QzpcXGJhclxcYmFyLmphciIpKS5lbnRyeUZvckZpbGVOYW1lZCgicnQuamFyIik7Ci0JCWFzc2VydEVxdWFscygicnQuamFyIiwgZW50cnkuZmlsZU5hbWUoKSk7Ci0KLQkJLy8gYXQgdGhlIGJlZ2lubmluZyAtIHF1YWxpZmllZAotCQllbnRyeSA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgiQzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXGphd3MuamFyO0M6XFxmb29cXGNsYXNzZXM7QzpcXGJhclxcYmFyLmphciIpKS5lbnRyeUZvckZpbGVOYW1lZCgicnQuamFyIik7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrXFxydC5qYXIiKSwgZW50cnkuZmlsZU5hbWUoKSk7Ci0KLQkJLy8gYXQgdGhlIGJlZ2lubmluZyAtIHVucXVhbGlmaWVkCi0JCWVudHJ5ID0gbmV3IENsYXNzcGF0aCh0aGlzLm1vcnBoKCJydC5qYXI7QzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xcamF3cy5qYXI7QzpcXGZvb1xcY2xhc3NlcztDOlxcYmFyXFxiYXIuamFyIikpLmVudHJ5Rm9yRmlsZU5hbWVkKCJydC5qYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJydC5qYXIiLCBlbnRyeS5maWxlTmFtZSgpKTsKLQotCQkvLyBhdCB0aGUgZW5kIC0gcXVhbGlmaWVkCi0JCWVudHJ5ID0gbmV3IENsYXNzcGF0aCh0aGlzLm1vcnBoKCJDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxqYXdzLmphcjtDOlxcZm9vXFxjbGFzc2VzO0M6XFxiYXJcXGJhci5qYXI7QzpcXGpka1xccnQuamFyIikpLmVudHJ5Rm9yRmlsZU5hbWVkKCJydC5qYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIkM6XFxqZGtcXHJ0LmphciIpLCBlbnRyeS5maWxlTmFtZSgpKTsKLQotCQkvLyBhdCB0aGUgZW5kIC0gdW5xdWFsaWZpZWQKLQkJZW50cnkgPSBuZXcgQ2xhc3NwYXRoKHRoaXMubW9ycGgoIkM6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXGphd3MuamFyO0M6XFxmb29cXGNsYXNzZXM7QzpcXGJhclxcYmFyLmphcjtydC5qYXIiKSkuZW50cnlGb3JGaWxlTmFtZWQoInJ0LmphciIpOwotCQlhc3NlcnRFcXVhbHMoInJ0LmphciIsIGVudHJ5LmZpbGVOYW1lKCkpOwotCi0JCS8vIGFsb25lIC0gcXVhbGlmaWVkCi0JCWVudHJ5ID0gbmV3IENsYXNzcGF0aCh0aGlzLm1vcnBoKCJDOlxcamRrXFxydC5qYXIiKSkuZW50cnlGb3JGaWxlTmFtZWQoInJ0LmphciIpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaCgiQzpcXGpka1xccnQuamFyIiksIGVudHJ5LmZpbGVOYW1lKCkpOwotCi0JCS8vIGFsb25lIC0gdW5xdWFsaWZpZWQKLQkJZW50cnkgPSBuZXcgQ2xhc3NwYXRoKCJydC5qYXIiKS5lbnRyeUZvckZpbGVOYW1lZCgicnQuamFyIik7Ci0JCWFzc2VydEVxdWFscygicnQuamFyIiwgZW50cnkuZmlsZU5hbWUoKSk7Ci0KLQkJLy8gdHJpY2sgZW50cnkgYXQgdGhlIGJlZ2lubmluZwotCQllbnRyeSA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgicnQuamFyLm5ldztDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xcamF3cy5qYXI7QzpcXGZvb1xcY2xhc3NlcztDOlxcYmFyXFxiYXIuamFyIikpLmVudHJ5Rm9yRmlsZU5hbWVkKCJydC5qYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIkM6XFxqZGtcXHJ0LmphciIpLCBlbnRyeS5maWxlTmFtZSgpKTsKLQotCQkvLyB0cmljayBlbnRyeSBpbiB0aGUgbWlkZGxlCi0JCWVudHJ5ID0gbmV3IENsYXNzcGF0aCh0aGlzLm1vcnBoKCJydC5qYXIubmV3O0M6XFxqZGtcXHJ0cnRydC5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXGphd3MuamFyO0M6XFxmb29cXGNsYXNzZXM7QzpcXGJhclxcYmFyLmphciIpKS5lbnRyeUZvckZpbGVOYW1lZCgicnQuamFyIik7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrXFxydC5qYXIiKSwgZW50cnkuZmlsZU5hbWUoKSk7Ci0KLQkJLy8gdHJpY2sgZW50cnkgYXQgdGhlIGVuZAotCQllbnRyeSA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgicnQuamFyLm5ldztDOlxcamRrXFxydHJ0cnQuamFyO0M6XFxqZGtcXHJ0LmphcjtDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxqYXdzLmphcjtDOlxcZm9vXFxjbGFzc2VzO0M6XFxiYXJcXGJhci5qYXI7QzpcXGpka1xccnRydHJ0LmphciIpKS5lbnRyeUZvckZpbGVOYW1lZCgicnQuamFyIik7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrXFxydC5qYXIiKSwgZW50cnkuZmlsZU5hbWUoKSk7Ci0KLQkJLy8gbWlzc2luZwotCQllbnRyeSA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgicnQuamFyLm5ldztDOlxcamRrXFxydHJ0cnQuamFyO0M6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXGphd3MuamFyO0M6XFxmb29cXGNsYXNzZXM7QzpcXGJhclxcYmFyLmphcjtDOlxcamRrXFxydHJ0cnQuamFyIikpLmVudHJ5Rm9yRmlsZU5hbWVkKCJydC5qYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJwYXRoIGVudHJ5IHNob3VsZCBub3QgYmUgZm91bmQiLCBudWxsLCBlbnRyeSk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TG9jYXRpb25Gb3JDbGFzcygpIHsKLQkJQ2xhc3M8Pz4gamF2YUNsYXNzID0gQ2xhc3NwYXRoLmNsYXNzOwotCQlGaWxlIGVudHJ5ID0gbmV3IEZpbGUoQ2xhc3NwYXRoLmxvY2F0aW9uRm9yKGphdmFDbGFzcykpOwotCQlpZiAoZW50cnkuaXNGaWxlKCkgfHwgZW50cnkuaXNEaXJlY3RvcnkoKSkgewotCQkJYXNzZXJ0VHJ1ZShlbnRyeS5leGlzdHMoKSk7Ci0JCX0KLQkJaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHsKLQkJCWFzc2VydFRydWUobmV3IEZpbGUoZW50cnksIENsYXNzcGF0aC5jb252ZXJ0VG9DbGFzc0ZpbGVOYW1lKGphdmFDbGFzcykpLmV4aXN0cygpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSdEphck5hbWUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlGaWxlIHJ0RmlsZSA9IG5ldyBGaWxlKENsYXNzcGF0aC5ydEphck5hbWUoKSk7Ci0JCWFzc2VydFRydWUoInJ0LmphciBkb2VzIG5vdCBleGlzdCIsIHJ0RmlsZS5leGlzdHMoKSk7Ci0KLQkJSmFyRmlsZSBydEphckZpbGUgPSBuZXcgSmFyRmlsZShydEZpbGUpOwotCQlKYXJFbnRyeSBlbnRyeSA9IHJ0SmFyRmlsZS5nZXRKYXJFbnRyeSgiamF2YS9sYW5nL09iamVjdC5jbGFzcyIpOwotCQlydEphckZpbGUuY2xvc2UoKTsKLQkJYXNzZXJ0VHJ1ZSgiYm9ndXMgcnQuamFyIiwgZW50cnkgIT0gbnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEpSRUNsYXNzTmFtZXMoKSB7Ci0JCWFzc2VydFRydWUoIlZlY3RvciBpcyBtaXNzaW5nIGZyb20gSlJFIGNsYXNzIG5hbWVzIiwgQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKENsYXNzcGF0aC5ib290Q2xhc3NwYXRoKCkuY2xhc3NOYW1lcygpLCBqYXZhLnV0aWwuVmVjdG9yLmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRUcnVlKCJGaWxlIGlzIG1pc3NpbmcgZnJvbSBKUkUgY2xhc3MgbmFtZXMiLCBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoQ2xhc3NwYXRoLmJvb3RDbGFzc3BhdGgoKS5jbGFzc05hbWVzKCksIGphdmEuaW8uRmlsZS5jbGFzcy5nZXROYW1lKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SmF2YUV4dGVuc2lvbkRpcmVjdG9yeU5hbWVzKCkgewotCQljaGFyIHNlcCA9IEZpbGUuc2VwYXJhdG9yQ2hhcjsKLQkJU3RyaW5nIHN0ZEV4dERpck5hbWUgPSBKQVZBX0hPTUUgKyBzZXAgKyAibGliIiArIHNlcCArICJleHQiOwotCQlhc3NlcnRUcnVlKCJzdGFuZGFyZCBleHRlbnNpb24gZGlyIG5hbWUgbWlzc2luZzogIiArIHN0ZEV4dERpck5hbWUsIENvbGxlY3Rpb25Ub29scy5jb250YWlucyhDbGFzc3BhdGguamF2YUV4dGVuc2lvbkRpcmVjdG9yeU5hbWVzKCksIHN0ZEV4dERpck5hbWUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SmF2YUV4dGVuc2lvbkRpcmVjdG9yaWVzKCkgewotCQljaGFyIHNlcCA9IEZpbGUuc2VwYXJhdG9yQ2hhcjsKLQkJRmlsZSBzdGRFeHREaXIgPSBuZXcgRmlsZShKQVZBX0hPTUUgKyBzZXAgKyAibGliIiArIHNlcCArICJleHQiKTsKLQkJYXNzZXJ0VHJ1ZSgic3RhbmRhcmQgZXh0ZW5zaW9uIGRpciBtaXNzaW5nOiAiICsgc3RkRXh0RGlyLmdldFBhcmVudCgpLCBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoQ2xhc3NwYXRoLmphdmFFeHRlbnNpb25EaXJlY3RvcmllcygpLCBzdGRFeHREaXIpKTsKLQl9Ci0KLQkvL0NvbW1lbnRlZCBvdXQgZHVlIHRvIGluY29tcGF0aWJpbGl0eSB3aXRoIElCTSBKREsgKHVzZWQgaW4gRWNsaXBzZSBXVFAgQnVpbGQpCi0JLy9UT0RPIFRlc3Qgc2hvdWxkIGJlIHJldmlzZWQgdG8gYmUgY29tcGF0aWJsZSB3aXRoIElCTSBKREsKLQkvLwlwdWJsaWMgdm9pZCB0ZXN0SmF2YUV4dGVuc2lvbkNsYXNzcGF0aEVudHJpZXMoKSB7Ci0JLy8JCWNoYXIgc2VwID0gRmlsZS5zZXBhcmF0b3JDaGFyOwotCS8vCQlTdHJpbmcgamRrID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLnZlcnNpb24iKTsKLQkvLwkJaWYgKGpkay5zdGFydHNXaXRoKCIxLjQiKSB8fCBqZGsuc3RhcnRzV2l0aCgiMS41IikpIHsKLQkvLwkJCUNvbGxlY3Rpb24gamFyTmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JLy8JCQlDbGFzc3BhdGguRW50cnlbXSBlbnRyaWVzID0gQ2xhc3NwYXRoLmphdmFFeHRlbnNpb25DbGFzc3BhdGgoKS5nZXRFbnRyaWVzKCk7Ci0JLy8JCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkvLwkJCQlqYXJOYW1lcy5hZGQoZW50cmllc1tpXS5maWxlTmFtZSgpKTsKLQkvLwkJCX0KLQkvLwkJCVN0cmluZyBzdGRFeHRKYXJOYW1lID0gSkFWQV9IT01FICsgc2VwICsgImxpYiIgKyBzZXAgKyAiZXh0IiArIHNlcCArICJkbnNucy5qYXIiOwotCS8vCQkJYXNzZXJ0VHJ1ZSgiamRrIDEuNC54IHN0YW5kYXJkIGV4dGVuc2lvbiBqYXIgbWlzc2luZzogIiArIHN0ZEV4dEphck5hbWUsIGphck5hbWVzLmNvbnRhaW5zKHN0ZEV4dEphck5hbWUpKTsKLQkvLwkJfSBlbHNlIHsKLQkvLwkJCWZhaWwoIndlIG5lZWQgdG8gdXBkYXRlIHRoaXMgdGVzdCBmb3IgdGhlIGN1cnJlbnQgamRrIik7Ci0JLy8JCX0KLQkvLwl9Ci0KLQkvL0NvbW1lbnRlZCBvdXQgZHVlIHRvIGluY29tcGF0aWJpbGl0eSB3aXRoIElCTSBKREsgKHVzZWQgaW4gRWNsaXBzZSBXVFAgQnVpbGQpCi0JLy9UT0RPIFRlc3Qgc2hvdWxkIGJlIHJldmlzZWQgdG8gYmUgY29tcGF0aWJsZSB3aXRoIElCTSBKREsKLQkvLwlwdWJsaWMgdm9pZCB0ZXN0SmF2YUV4dGVuc2lvbkNsYXNzTmFtZXMoKSB7Ci0JLy8JCVN0cmluZyBqZGsgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEudmVyc2lvbiIpOwotCS8vCQlpZiAoamRrLnN0YXJ0c1dpdGgoIjEuNCIpIHx8IGpkay5zdGFydHNXaXRoKCIxLjUiKSkgewotCS8vCQkJU3RyaW5nIGNsYXNzTmFtZSA9ICJzdW4ubmV0LnNwaS5uYW1lc2VydmljZS5kbnMuRE5TTmFtZVNlcnZpY2UiOwotCS8vCQkJYXNzZXJ0VHJ1ZSgiamRrIDEuNC54IHN0YW5kYXJkIGV4dGVuc2lvbiBjbGFzcyBtaXNzaW5nOiAiICsgY2xhc3NOYW1lLAotCS8vCQkJCQlDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoQ2xhc3NwYXRoLmphdmFFeHRlbnNpb25DbGFzc3BhdGgoKS5jbGFzc05hbWVzKCksIGNsYXNzTmFtZSkpOwotCS8vCQl9IGVsc2UgewotCS8vCQkJZmFpbCgid2UgbmVlZCB0byB1cGRhdGUgdGhpcyB0ZXN0IGZvciB0aGUgY3VycmVudCBqZGsiKTsKLQkvLwkJfQotCS8vCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RKYXZhQ2xhc3NwYXRoQ2xhc3NOYW1lcygpIHsKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JCUNsYXNzTG9hZGVyIGNsID0gdGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCk7Ci0JCS8vIG1ha2Ugc3VyZSB3ZSBhcmUgcnVubmluZyB1bmRlciB0aGUgIm5vcm1hbCIgY2xhc3MgbG9hZGVyOwotCQkvLyB3aGVuIHRoZSB0ZXN0cyBhcmUgZXhlY3V0ZWQgYXMgYW4gQU5UIHRhc2ssIHRoZXkgYXJlIHJ1biB1bmRlcgotCQkvLyBhbiBBTlQgY2xhc3MgbG9hZGVyIGFuZCB0aGUgIkphdmEiIGNsYXNzcGF0aCBkb2VzIG5vdCBpbmNsdWRlIHRoaXMgY2xhc3MKLQkJaWYgKGNsLmdldENsYXNzKCkuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoInN1bi5taXNjIikpIHsKLQkJCWFzc2VydFRydWUoImNsYXNzIG1pc3Npbmc6ICIgKyBjbGFzc05hbWUsIENvbGxlY3Rpb25Ub29scy5jb250YWlucyhDbGFzc3BhdGguamF2YUNsYXNzcGF0aCgpLmNsYXNzTmFtZXMoKSwgY2xhc3NOYW1lKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBtb3JwaCB0aGUgc3BlY2lmaWVkIHBhdGggdG8gYSBwbGF0Zm9ybS1pbmRlcGVuZGVudCBwYXRoCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgbW9ycGgoU3RyaW5nIHBhdGgpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IHBhdGg7Ci0JCXJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKCdcXCcsIEZpbGUuc2VwYXJhdG9yQ2hhcik7Ci0JCXJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKCc7JywgRmlsZS5wYXRoU2VwYXJhdG9yQ2hhcik7Ci0JCWlmICghQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKEZpbGUubGlzdFJvb3RzKCksIG5ldyBGaWxlKCJDOlxcIikpKSB7Ci0JCQlyZXN1bHQgPSByZXN1bHQucmVwbGFjZUFsbCgiQzoiLCAiIik7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBtb3JwaCB0aGUgc3BlY2lmaWVkIFVSTCB0byBhIHBsYXRmb3JtLWluZGVwZW5kZW50IHBhdGgKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBtb3JwaFVSTChTdHJpbmcgdXJsKSB7Ci0JCVN0cmluZyByZXN1bHQgPSB1cmw7Ci0JCWlmICghQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKEZpbGUubGlzdFJvb3RzKCksIG5ldyBGaWxlKCJDOlxcIikpKSB7Ci0JCQlyZXN1bHQgPSByZXN1bHQucmVwbGFjZUFsbCgiL0M6IiwgIiIpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0NvbGxlY3Rpb25Ub29sc1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0NvbGxlY3Rpb25Ub29sc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyNzk4NDAuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9Db2xsZWN0aW9uVG9vbHNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5IYXNoQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlJldmVyc2VDb21wYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgQ29sbGVjdGlvblRvb2xzVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgQ29sbGVjdGlvblRvb2xzVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZE9iamVjdEFycmF5T2JqZWN0MSgpIHsKLQkJT2JqZWN0W10gYSA9IENvbGxlY3Rpb25Ub29scy5hZGQodGhpcy5idWlsZE9iamVjdEFycmF5MSgpLCAidHdlbnR5Iik7Ci0JCWFzc2VydEVxdWFscyg0LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsICJ0d2VudHkiKSk7Ci0JCWFzc2VydEVxdWFscygidHdlbnR5IiwgYVthLmxlbmd0aC0xXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZE9iamVjdEFycmF5T2JqZWN0MigpIHsKLQkJU3RyaW5nW10gYSA9IENvbGxlY3Rpb25Ub29scy5hZGQodGhpcy5idWlsZFN0cmluZ0FycmF5MSgpLCAidHdlbnR5Iik7Ci0JCWFzc2VydEVxdWFscyg0LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsICJ0d2VudHkiKSk7Ci0JCWFzc2VydEVxdWFscygidHdlbnR5IiwgYVthLmxlbmd0aC0xXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZE9iamVjdEFycmF5SW50T2JqZWN0MSgpIHsKLQkJT2JqZWN0W10gYSA9IG5ldyBPYmplY3RbXSB7ICJhIiwgImIiLCAiYyIsICJkIiB9OwotCQlhID0gQ29sbGVjdGlvblRvb2xzLmFkZChhLCAyLCAiWCIpOwotCQlhc3NlcnRFcXVhbHMoNSwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhhLCAiWCIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBPYmplY3RbXSB7ICJhIiwgImIiLCAiWCIsICJjIiwgImQiIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkT2JqZWN0QXJyYXlJbnRPYmplY3QyKCkgewotCQlTdHJpbmdbXSBhID0gbmV3IFN0cmluZ1tdIHsgImEiLCAiYiIsICJjIiwgImQiIH07Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMuYWRkKGEsIDIsICJYIik7Ci0JCWFzc2VydEVxdWFscyg1LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsICJYIikpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgImEiLCAiYiIsICJYIiwgImMiLCAiZCIgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRPYmplY3RBcnJheUludE9iamVjdEV4Y2VwdGlvbigpIHsKLQkJT2JqZWN0W10gYSA9IG5ldyBPYmplY3RbXSB7ICJhIiwgImIiLCAiYyIsICJkIiB9OwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlhID0gQ29sbGVjdGlvblRvb2xzLmFkZChhLCAzMywgIlgiKTsKLQkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRDaGFyQXJyYXlDaGFyKCkgewotCQljaGFyW10gYSA9IENvbGxlY3Rpb25Ub29scy5hZGQodGhpcy5idWlsZENoYXJBcnJheSgpLCAnZCcpOwotCQlhc3NlcnRFcXVhbHMoNCwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhhLCAnZCcpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQ2hhckFycmF5SW50Q2hhcigpIHsKLQkJY2hhcltdIGEgPSBuZXcgY2hhcltdIHsgJ2EnLCAnYicsICdjJywgJ2QnIH07Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMuYWRkKGEsIDIsICdYJyk7Ci0JCWFzc2VydEVxdWFscyg1LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsICdYJykpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGNoYXJbXSB7ICdhJywgJ2InLCAnWCcsICdjJywgJ2QnIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSW50QXJyYXlJbnQoKSB7Ci0JCWludFtdIGEgPSBDb2xsZWN0aW9uVG9vbHMuYWRkKHRoaXMuYnVpbGRJbnRBcnJheSgpLCAzMCk7Ci0JCWFzc2VydEVxdWFscyg0LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsIDMwKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEludEFycmF5SW50SW50KCkgewotCQlpbnRbXSBhID0gbmV3IGludFtdIHsgMSwgMiwgMywgNCB9OwotCQlhID0gQ29sbGVjdGlvblRvb2xzLmFkZChhLCAyLCA5OSk7Ci0JCWFzc2VydEVxdWFscyg1LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsIDk5KSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgaW50W10geyAxLCAyLCA5OSwgMywgNCB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25JdGVyYXRvcjEoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsMSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlMaXN0PFN0cmluZz4gbDIgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKTsKLQkJU2V0PFN0cmluZz4gczEgPSB0aGlzLmJ1aWxkU3RyaW5nU2V0MSgpOwotCQlMaXN0PFN0cmluZz4gbDMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsgLy8gc2FtZSBlbGVtZW50cyBhcyBzMQotCi0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmFkZEFsbChsMSwgbDIuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRFcXVhbHMoNiwgbDEuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShsMS5jb250YWluc0FsbChsMikpOwotCi0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5hZGRBbGwoczEsIGwzLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHMxLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoczEuY29udGFpbnNBbGwobDMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsQ29sbGVjdGlvbkl0ZXJhdG9yMigpIHsKLQkJTGlzdDxPYmplY3Q+IGwxID0gdGhpcy5idWlsZE9iamVjdExpc3QxKCk7Ci0JCUxpc3Q8U3RyaW5nPiBsMiA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlTZXQ8T2JqZWN0PiBzMSA9IHRoaXMuYnVpbGRPYmplY3RTZXQxKCk7Ci0JCUxpc3Q8U3RyaW5nPiBsMyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOyAvLyBzYW1lIGVsZW1lbnRzIGFzIHMxCi0KLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGwxLCBsMi5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscyg2LCBsMS5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGwxLmNvbnRhaW5zQWxsKGwyKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmFkZEFsbChzMSwgbDMuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRFcXVhbHMoMywgczEuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShzMS5jb250YWluc0FsbChsMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxDb2xsZWN0aW9uT2JqZWN0QXJyYXkxKCkgewotCQlMaXN0PFN0cmluZz4gbCA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlTZXQ8U3RyaW5nPiBzID0gdGhpcy5idWlsZFN0cmluZ1NldDEoKTsKLQotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5hZGRBbGwobCwgYSkpOwotCQlhc3NlcnRFcXVhbHMoNiwgbC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGwuY29udGFpbnNBbGwoQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oYSkpKTsKLQotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHMsIGEpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShzLmNvbnRhaW5zQWxsKENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKGEpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25PYmplY3RBcnJheTIoKSB7Ci0JCUxpc3Q8T2JqZWN0PiBsID0gdGhpcy5idWlsZE9iamVjdExpc3QxKCk7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCVNldDxPYmplY3Q+IHMgPSB0aGlzLmJ1aWxkT2JqZWN0U2V0MSgpOwotCi0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmFkZEFsbChsLCBhKSk7Ci0JCWFzc2VydEVxdWFscyg2LCBsLnNpemUoKSk7Ci0JCWFzc2VydFRydWUobC5jb250YWluc0FsbChDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihhKSkpOwotCi0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5hZGRBbGwocywgYSkpOwotCQlhc3NlcnRFcXVhbHMoMywgcy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKHMuY29udGFpbnNBbGwoQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oYSkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlDb2xsZWN0aW9uMSgpIHsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKTsKLQkJU3RyaW5nW10gbmV3QXJyYXkgPSBDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGEsIGMpOwotCi0JCWFzc2VydEVxdWFscyg2LCBuZXdBcnJheS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChuZXdBcnJheSwgYykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUNvbGxlY3Rpb24yKCkgewotCQlPYmplY3RbXSBhID0gdGhpcy5idWlsZE9iamVjdEFycmF5MSgpOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlPYmplY3RbXSBuZXdBcnJheSA9IENvbGxlY3Rpb25Ub29scy5hZGRBbGwoYSwgYyk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDYsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCBjKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SXRlcmF0b3IxKCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlJdGVyYXRvcjxTdHJpbmc+IGkgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpOwotCQlTdHJpbmdbXSBuZXdBcnJheSA9IENvbGxlY3Rpb25Ub29scy5hZGRBbGwoYSwgaSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDYsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUl0ZXJhdG9yMigpIHsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJSXRlcmF0b3I8T2JqZWN0PiBpID0gdGhpcy5idWlsZE9iamVjdExpc3QxKCkuaXRlcmF0b3IoKTsKLQkJT2JqZWN0W10gbmV3QXJyYXkgPSBDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGEsIGkpOwotCi0JCWFzc2VydEVxdWFscyg2LCBuZXdBcnJheS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChuZXdBcnJheSwgdGhpcy5idWlsZE9iamVjdExpc3QxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlPYmplY3RBcnJheTEoKSB7Ci0JCU9iamVjdFtdIGExID0gdGhpcy5idWlsZE9iamVjdEFycmF5MSgpOwotCQlPYmplY3RbXSBhMiA9IHRoaXMuYnVpbGRPYmplY3RBcnJheTIoKTsKLQkJT2JqZWN0W10gbmV3QXJyYXkgPSBDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGExLCBhMik7Ci0KLQkJYXNzZXJ0RXF1YWxzKDYsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCBhMSkpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChuZXdBcnJheSwgYTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlPYmplY3RBcnJheTIoKSB7Ci0JCVN0cmluZ1tdIGExID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlTdHJpbmdbXSBhMiA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTIoKTsKLQkJU3RyaW5nW10gbmV3QXJyYXkgPSBDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGExLCBhMik7Ci0KLQkJYXNzZXJ0RXF1YWxzKDYsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCBhMSkpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChuZXdBcnJheSwgYTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlPYmplY3RBcnJheTMoKSB7Ci0JCU9iamVjdFtdIGExID0gdGhpcy5idWlsZE9iamVjdEFycmF5MSgpOwotCQlTdHJpbmdbXSBhMiA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTIoKTsKLQkJT2JqZWN0W10gbmV3QXJyYXkgPSBDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGExLCBhMik7Ci0KLQkJYXNzZXJ0RXF1YWxzKDYsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCBhMSkpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChuZXdBcnJheSwgYTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJbnRPYmplY3RBcnJheTEoKSB7Ci0JCU9iamVjdFtdIGEgPSBuZXcgT2JqZWN0W10geyAiYSIsICJiIiwgImMiLCAiZCIgfTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5hZGRBbGwoYSwgMiwgbmV3IE9iamVjdFtdIHsgIlgiLCAiWCIsICJYIiB9KTsKLQkJYXNzZXJ0RXF1YWxzKDcsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYSwgIlgiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgT2JqZWN0W10geyAiYSIsICJiIiwgIlgiLCAiWCIsICJYIiwgImMiLCAiZCIgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUludE9iamVjdEFycmF5MigpIHsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbXSB7ICJhIiwgImIiLCAiYyIsICJkIiB9OwotCQlhID0gQ29sbGVjdGlvblRvb2xzLmFkZEFsbChhLCAyLCBuZXcgU3RyaW5nW10geyAiWCIsICJYIiwgIlgiIH0pOwotCQlhc3NlcnRFcXVhbHMoNywgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhhLCAiWCIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJhIiwgImIiLCAiWCIsICJYIiwgIlgiLCAiYyIsICJkIiB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SW50T2JqZWN0QXJyYXkzKCkgewotCQlPYmplY3RbXSBhID0gbmV3IE9iamVjdFtdIHsgImEiLCAiYiIsICJjIiwgImQiIH07Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGEsIDIsIG5ldyBTdHJpbmdbXSB7ICJYIiwgIlgiLCAiWCIgfSk7Ci0JCWFzc2VydEVxdWFscyg3LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsICJYIikpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IE9iamVjdFtdIHsgImEiLCAiYiIsICJYIiwgIlgiLCAiWCIsICJjIiwgImQiIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsQ2hhckFycmF5Q2hhckFycmF5KCkgewotCQljaGFyW10gYSA9IENvbGxlY3Rpb25Ub29scy5hZGRBbGwodGhpcy5idWlsZENoYXJBcnJheSgpLCBuZXcgY2hhcltdIHsgJ2QnLCAnZScgfSk7Ci0JCWFzc2VydEVxdWFscyg1LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsICdkJykpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhhLCAnZScpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsQ2hhckFycmF5SW50Q2hhckFycmF5KCkgewotCQljaGFyW10gYSA9IG5ldyBjaGFyW10geyAnYScsICdiJywgJ2MnLCAnZCcgfTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5hZGRBbGwoYSwgMiwgbmV3IGNoYXJbXSB7ICdYJywgJ1gnLCAnWCcgfSk7Ci0JCWFzc2VydEVxdWFscyg3LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsICdYJykpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGNoYXJbXSB7ICdhJywgJ2InLCAnWCcsICdYJywgJ1gnLCAnYycsICdkJyB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbEludEFycmF5SW50QXJyYXkoKSB7Ci0JCWludFtdIGEgPSBDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHRoaXMuYnVpbGRJbnRBcnJheSgpLCBuZXcgaW50W10geyAzMCwgNDAgfSk7Ci0JCWFzc2VydEVxdWFscyg1LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsIDMwKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsIDQwKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbEludEFycmF5SW50SW50QXJyYXkoKSB7Ci0JCWludFtdIGEgPSBuZXcgaW50W10geyAxLCAyLCAzLCA0IH07Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGEsIDIsIG5ldyBpbnRbXSB7IDk5LCA5OSwgOTkgfSk7Ci0JCWFzc2VydEVxdWFscyg3LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsIDk5KSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgaW50W10geyAxLCAyLCA5OSwgOTksIDk5LCAzLCA0IH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlJdGVyYXRvcigpIHsKLQkJT2JqZWN0W10gYSA9IENvbGxlY3Rpb25Ub29scy5hcnJheSh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwoYSwgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheUl0ZXJhdG9yT2JqZWN0QXJyYXkxKCkgewotCQlTdHJpbmdbXSBhID0gQ29sbGVjdGlvblRvb2xzLmFycmF5KHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCksIG5ldyBTdHJpbmdbMF0pOwotCQlhc3NlcnRFcXVhbHMoMywgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChhLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFycmF5SXRlcmF0b3JPYmplY3RBcnJheTIoKSB7Ci0JCU9iamVjdFtdIGEgPSBDb2xsZWN0aW9uVG9vbHMuYXJyYXkodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgbmV3IE9iamVjdFswXSk7Ci0JCWFzc2VydEVxdWFscygzLCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKGEsIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QmFnRW51bWVyYXRpb24xKCkgewotCQlCYWc8U3RyaW5nPiBiID0gQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLmJ1aWxkU3RyaW5nVmVjdG9yMSgpLmVsZW1lbnRzKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgYi5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGIuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ1ZlY3RvcjEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCYWdFbnVtZXJhdGlvbjIoKSB7Ci0JCUJhZzxPYmplY3Q+IGIgPSBDb2xsZWN0aW9uVG9vbHMuPE9iamVjdD5iYWcodGhpcy5idWlsZFN0cmluZ1ZlY3RvcjEoKS5lbGVtZW50cygpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGIuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShiLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdWZWN0b3IxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QmFnSXRlcmF0b3IxKCkgewotCQlCYWc8U3RyaW5nPiBiID0gQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGIuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShiLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJhZ0l0ZXJhdG9yMigpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYy5hZGQoInplcm8iKTsKLQkJYy5hZGQoIm9uZSIpOwotCQljLmFkZCgidHdvIik7Ci0JCWMuYWRkKCJ0aHJlZSIpOwotCQlCYWc8T2JqZWN0PiBiID0gQ29sbGVjdGlvblRvb2xzLjxPYmplY3Q+YmFnKGMuaXRlcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscyg0LCBiLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoYi5jb250YWluc0FsbChjKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJhZ09iamVjdEFycmF5MSgpIHsKLQkJQmFnPFN0cmluZz4gYiA9IENvbGxlY3Rpb25Ub29scy5iYWcodGhpcy5idWlsZFN0cmluZ0FycmF5MSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGIuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwoYiwgdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJhZ09iamVjdEFycmF5MigpIHsKLQkJQmFnPFN0cmluZz4gYiA9IENvbGxlY3Rpb25Ub29scy5iYWcoImZvbyIsICJiYXIiLCAiYmF6Iik7Ci0JCWFzc2VydEVxdWFscygzLCBiLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKGIsIG5ldyBPYmplY3RbXXsiZm9vIiwgImJhciIsICJiYXoifSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uRW51bWVyYXRpb24xKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMuYnVpbGRTdHJpbmdWZWN0b3IxKCkuZWxlbWVudHMoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBjLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoYy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nVmVjdG9yMSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25FbnVtZXJhdGlvbjIoKSB7Ci0JCUNvbGxlY3Rpb248T2JqZWN0PiBjID0gQ29sbGVjdGlvblRvb2xzLjxPYmplY3Q+Y29sbGVjdGlvbih0aGlzLmJ1aWxkU3RyaW5nVmVjdG9yMSgpLmVsZW1lbnRzKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgYy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ1ZlY3RvcjEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uSXRlcmF0b3IxKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgYy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvbkl0ZXJhdG9yMigpIHsKLQkJQ29sbGVjdGlvbjxPYmplY3Q+IGMgPSBDb2xsZWN0aW9uVG9vbHMuPE9iamVjdD5jb2xsZWN0aW9uKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgYy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvbk9iamVjdEFycmF5KCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBjLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKGMsIHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0VudW1lcmF0aW9uT2JqZWN0MSgpIHsKLQkJVmVjdG9yPFN0cmluZz4gdiA9IHRoaXMuYnVpbGRTdHJpbmdWZWN0b3IxKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHYuZWxlbWVudHMoKSwgIm9uZSIpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHYuZWxlbWVudHMoKSwgbnVsbCkpOwotCQl2LmFkZChudWxsKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModi5lbGVtZW50cygpLCBudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zRW51bWVyYXRpb25PYmplY3QyKCkgewotCQlWZWN0b3I8T2JqZWN0PiBjID0gbmV3IFZlY3RvcjxPYmplY3Q+KCk7Ci0JCWMuYWRkKCJ6ZXJvIik7Ci0JCWMuYWRkKCJvbmUiKTsKLQkJYy5hZGQoInR3byIpOwotCQljLmFkZCgidGhyZWUiKTsKLQkJU3RyaW5nIG9uZSA9ICJvbmUiOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhjLmVsZW1lbnRzKCksIG9uZSkpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYy5lbGVtZW50cygpLCBudWxsKSk7Ci0JCWMuYWRkKG51bGwpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhjLmVsZW1lbnRzKCksIG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNJdGVyYXRvck9iamVjdDEoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGMuaXRlcmF0b3IoKSwgIm9uZSIpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGMuaXRlcmF0b3IoKSwgbnVsbCkpOwotCQljLmFkZChudWxsKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYy5pdGVyYXRvcigpLCBudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zSXRlcmF0b3JPYmplY3QyKCkgewotCQlDb2xsZWN0aW9uPE9iamVjdD4gYyA9IG5ldyBIYXNoQmFnPE9iamVjdD4oKTsKLQkJYy5hZGQoInplcm8iKTsKLQkJYy5hZGQoIm9uZSIpOwotCQljLmFkZCgidHdvIik7Ci0JCWMuYWRkKCJ0aHJlZSIpOwotCQlTdHJpbmcgb25lID0gIm9uZSI7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGMuaXRlcmF0b3IoKSwgb25lKSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhjLml0ZXJhdG9yKCksIG51bGwpKTsKLQkJYy5hZGQobnVsbCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGMuaXRlcmF0b3IoKSwgbnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc09iamVjdEFycmF5T2JqZWN0KCkgewotCQlPYmplY3RbXSBhID0gdGhpcy5idWlsZE9iamVjdEFycmF5MSgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhhLCAib25lIikpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYSwgbnVsbCkpOwotCQlPYmplY3RbXSBhMiA9IENvbGxlY3Rpb25Ub29scy5hZGQoYSwgbnVsbCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEyLCBudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQ2hhckFycmF5Q2hhcigpIHsKLQkJY2hhcltdIGEgPSB0aGlzLmJ1aWxkQ2hhckFycmF5KCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsICdhJykpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYSwgJ3onKSk7Ci0JCWNoYXJbXSBhMiA9IENvbGxlY3Rpb25Ub29scy5hZGQoYSwgJ3onKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYTIsICd6JykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0ludEFycmF5SW50KCkgewotCQlpbnRbXSBhID0gdGhpcy5idWlsZEludEFycmF5KCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsIDEwKSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhhLCA1NSkpOwotCQlpbnRbXSBhMiA9IENvbGxlY3Rpb25Ub29scy5hZGQoYSwgNTUpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhhMiwgNTUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGxDb2xsZWN0aW9uSXRlcmF0b3IxKCkgewotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSwgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbENvbGxlY3Rpb25JdGVyYXRvcjIoKSB7Ci0JCUNvbGxlY3Rpb248T2JqZWN0PiBjMSA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQljMS5hZGQoInplcm8iKTsKLQkJYzEuYWRkKCJvbmUiKTsKLQkJYzEuYWRkKCJ0d28iKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMyLmFkZCgidHdvIik7Ci0JCWMyLmFkZCgiemVybyIpOwotCQljMi5hZGQoIm9uZSIpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChjMSwgYzIuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbENvbGxlY3Rpb25PYmplY3RBcnJheTEoKSB7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLCB0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGxDb2xsZWN0aW9uT2JqZWN0QXJyYXkyKCkgewotCQlPYmplY3RbXSBhID0gbmV3IE9iamVjdFtdIHsgInplcm8iLCAib25lIiwgInR3byIgfTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCksIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGxJdGVyYXRvckNvbGxlY3Rpb24xKCkgewotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbEl0ZXJhdG9yQ29sbGVjdGlvbjIoKSB7Ci0JCUNvbGxlY3Rpb248T2JqZWN0PiBjMSA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQljMS5hZGQoInplcm8iKTsKLQkJYzEuYWRkKCJvbmUiKTsKLQkJYzEuYWRkKCJ0d28iKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMyLmFkZCgiemVybyIpOwotCQljMi5hZGQoIm9uZSIpOwotCQljMi5hZGQoInR3byIpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChjMS5pdGVyYXRvcigpLCBjMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbEl0ZXJhdG9ySXRlcmF0b3IxKCkgewotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsSXRlcmF0b3JJdGVyYXRvcjIoKSB7Ci0JCUNvbGxlY3Rpb248T2JqZWN0PiBjMSA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQljMS5hZGQoInplcm8iKTsKLQkJYzEuYWRkKCJvbmUiKTsKLQkJYzEuYWRkKCJ0d28iKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMyLmFkZCgiemVybyIpOwotCQljMi5hZGQoIm9uZSIpOwotCQljMi5hZGQoInR3byIpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChjMS5pdGVyYXRvcigpLCBjMi5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsSXRlcmF0b3JPYmplY3RBcnJheSgpIHsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgdGhpcy5idWlsZE9iamVjdEFycmF5MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsT2JqZWN0QXJyYXlDb2xsZWN0aW9uKCkgewotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCksIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsT2JqZWN0QXJyYXlJdGVyYXRvcigpIHsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZE9iamVjdEFycmF5MSgpLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsT2JqZWN0QXJyYXlPYmplY3RBcnJheSgpIHsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZE9iamVjdEFycmF5MSgpLCB0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGxDaGFyQXJyYXlDaGFyQXJyYXkoKSB7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRDaGFyQXJyYXkoKSwgdGhpcy5idWlsZENoYXJBcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsSW50QXJyYXlJbnRBcnJheSgpIHsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZEludEFycmF5KCksIHRoaXMuYnVpbGRJbnRBcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpZmZFbmQoKSB7Ci0JCVN0cmluZyBhID0gImEiOwotCQlTdHJpbmcgYiA9ICJiIjsKLQkJU3RyaW5nIGMgPSAiYyI7Ci0JCVN0cmluZyBkID0gImQiOwotCQlTdHJpbmcgZSA9ICJlIjsKLQkJU3RyaW5nIGFfID0gbmV3IFN0cmluZygiYSIpOwotCQlTdHJpbmcgYl8gPSBuZXcgU3RyaW5nKCJiIik7Ci0JCVN0cmluZyBjXyA9IG5ldyBTdHJpbmcoImMiKTsKLQkJU3RyaW5nIGRfID0gbmV3IFN0cmluZygiZCIpOwotCQlTdHJpbmcgZV8gPSBuZXcgU3RyaW5nKCJlIik7Ci0JCWFzc2VydFRydWUoKGEgIT0gYV8pICYmIGEuZXF1YWxzKGFfKSk7Ci0JCWFzc2VydFRydWUoKGIgIT0gYl8pICYmIGIuZXF1YWxzKGJfKSk7Ci0JCWFzc2VydFRydWUoKGMgIT0gY18pICYmIGMuZXF1YWxzKGNfKSk7Ci0JCWFzc2VydFRydWUoKGQgIT0gZF8pICYmIGQuZXF1YWxzKGRfKSk7Ci0JCWFzc2VydFRydWUoKGUgIT0gZV8pICYmIGUuZXF1YWxzKGVfKSk7Ci0JCVN0cmluZ1tdIGFycmF5MTsKLQkJU3RyaW5nW10gYXJyYXkyOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscygtMSwgQ29sbGVjdGlvblRvb2xzLmRpZmZFbmQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfIH07Ci0JCWFzc2VydEVxdWFscygtMSwgQ29sbGVjdGlvblRvb2xzLmRpZmZFbmQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoNCwgQ29sbGVjdGlvblRvb2xzLmRpZmZFbmQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGJfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyg0LCBDb2xsZWN0aW9uVG9vbHMuZGlmZkVuZChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbMF07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoNCwgQ29sbGVjdGlvblRvb2xzLmRpZmZFbmQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbMF07Ci0JCWFzc2VydEVxdWFscyg0LCBDb2xsZWN0aW9uVG9vbHMuZGlmZkVuZChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbMF07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbMF07Ci0JCWFzc2VydEVxdWFscygtMSwgQ29sbGVjdGlvblRvb2xzLmRpZmZFbmQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGJfLCBjXywgYV8sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLmRpZmZFbmQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuZGlmZkVuZChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjXywgZF8gfTsKLQkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5kaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJU3RyaW5nIGNfXyA9IG5ldyBTdHJpbmcoYyk7Ci0JCWFzc2VydFRydWUoKGMgIT0gY19fKSAmJiBjLmVxdWFscyhjXykpOwotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY19fLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCBDb2xsZWN0aW9uVG9vbHMuZGlmZkVuZChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIG51bGwsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuZGlmZkVuZChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIG51bGwsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBudWxsLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCBDb2xsZWN0aW9uVG9vbHMuZGlmZkVuZChhcnJheTEsIGFycmF5MikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaWZmUmFuZ2UoKSB7Ci0JCVN0cmluZyBhID0gImEiOwotCQlTdHJpbmcgYiA9ICJiIjsKLQkJU3RyaW5nIGMgPSAiYyI7Ci0JCVN0cmluZyBkID0gImQiOwotCQlTdHJpbmcgZSA9ICJlIjsKLQkJU3RyaW5nIGFfID0gYTsKLQkJU3RyaW5nIGJfID0gYjsKLQkJU3RyaW5nIGNfID0gYzsKLQkJU3RyaW5nIGRfID0gZDsKLQkJU3RyaW5nIGVfID0gZTsKLQkJYXNzZXJ0VHJ1ZSgoYSA9PSBhXykgJiYgYS5lcXVhbHMoYV8pKTsKLQkJYXNzZXJ0VHJ1ZSgoYiA9PSBiXykgJiYgYi5lcXVhbHMoYl8pKTsKLQkJYXNzZXJ0VHJ1ZSgoYyA9PSBjXykgJiYgYy5lcXVhbHMoY18pKTsKLQkJYXNzZXJ0VHJ1ZSgoZCA9PSBkXykgJiYgZC5lcXVhbHMoZF8pKTsKLQkJYXNzZXJ0VHJ1ZSgoZSA9PSBlXykgJiYgZS5lcXVhbHMoZV8pKTsKLQkJU3RyaW5nW10gYXJyYXkxOwotCQlTdHJpbmdbXSBhcnJheTI7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSYW5nZSg1LCAtMSksIENvbGxlY3Rpb25Ub29scy5kaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfIH07Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoMSwgLTEpLCBDb2xsZWN0aW9uVG9vbHMuZGlmZlJhbmdlKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSYW5nZSgwLCA0KSwgQ29sbGVjdGlvblRvb2xzLmRpZmZSYW5nZShhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSYW5nZSgwLCA0KSwgQ29sbGVjdGlvblRvb2xzLmRpZmZSYW5nZShhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbMF07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDAsIDQpLCBDb2xsZWN0aW9uVG9vbHMuZGlmZlJhbmdlKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nWzBdOwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDAsIDQpLCBDb2xsZWN0aW9uVG9vbHMuZGlmZlJhbmdlKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1swXTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1swXTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSYW5nZSgwLCAtMSksIENvbGxlY3Rpb25Ub29scy5kaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGJfLCBjXywgYV8sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDAsIDIpLCBDb2xsZWN0aW9uVG9vbHMuZGlmZlJhbmdlKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDAsIDApLCBDb2xsZWN0aW9uVG9vbHMuZGlmZlJhbmdlKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXyB9OwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDMsIDMpLCBDb2xsZWN0aW9uVG9vbHMuZGlmZlJhbmdlKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJU3RyaW5nIGNfXyA9IG5ldyBTdHJpbmcoYyk7Ci0JCWFzc2VydFRydWUoKGMgIT0gY19fKSAmJiBjLmVxdWFscyhjXykpOwotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY19fLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSYW5nZSg1LCAtMSksIENvbGxlY3Rpb25Ub29scy5kaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBudWxsLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDIsIDIpLCBDb2xsZWN0aW9uVG9vbHMuZGlmZlJhbmdlKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgbnVsbCwgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIG51bGwsIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDUsIC0xKSwgQ29sbGVjdGlvblRvb2xzLmRpZmZSYW5nZShhcnJheTEsIGFycmF5MikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaWZmU3RhcnQoKSB7Ci0JCVN0cmluZyBhID0gImEiOwotCQlTdHJpbmcgYiA9ICJiIjsKLQkJU3RyaW5nIGMgPSAiYyI7Ci0JCVN0cmluZyBkID0gImQiOwotCQlTdHJpbmcgZSA9ICJlIjsKLQkJU3RyaW5nIGFfID0gbmV3IFN0cmluZygiYSIpOwotCQlTdHJpbmcgYl8gPSBuZXcgU3RyaW5nKCJiIik7Ci0JCVN0cmluZyBjXyA9IG5ldyBTdHJpbmcoImMiKTsKLQkJU3RyaW5nIGRfID0gbmV3IFN0cmluZygiZCIpOwotCQlTdHJpbmcgZV8gPSBuZXcgU3RyaW5nKCJlIik7Ci0JCWFzc2VydFRydWUoKGEgIT0gYV8pICYmIGEuZXF1YWxzKGFfKSk7Ci0JCWFzc2VydFRydWUoKGIgIT0gYl8pICYmIGIuZXF1YWxzKGJfKSk7Ci0JCWFzc2VydFRydWUoKGMgIT0gY18pICYmIGMuZXF1YWxzKGNfKSk7Ci0JCWFzc2VydFRydWUoKGQgIT0gZF8pICYmIGQuZXF1YWxzKGRfKSk7Ci0JCWFzc2VydFRydWUoKGUgIT0gZV8pICYmIGUuZXF1YWxzKGVfKSk7Ci0JCVN0cmluZ1tdIGFycmF5MTsKLQkJU3RyaW5nW10gYXJyYXkyOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyg1LCBDb2xsZWN0aW9uVG9vbHMuZGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXyB9OwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLmRpZmZTdGFydChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyg0LCBDb2xsZWN0aW9uVG9vbHMuZGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXyB9OwotCQlhc3NlcnRFcXVhbHMoNCwgQ29sbGVjdGlvblRvb2xzLmRpZmZTdGFydChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbMF07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLmRpZmZTdGFydChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1swXTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5kaWZmU3RhcnQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nWzBdOwotCQlhcnJheTIgPSBuZXcgU3RyaW5nWzBdOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLmRpZmZTdGFydChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBlXywgY18sIGRfIH07Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuZGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXyB9OwotCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLmRpZmZTdGFydChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5kaWZmU3RhcnQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlTdHJpbmcgY19fID0gbmV3IFN0cmluZyhjKTsKLQkJYXNzZXJ0VHJ1ZSgoYyAhPSBjX18pICYmIGMuZXF1YWxzKGNfXykpOwotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY19fLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDUsIENvbGxlY3Rpb25Ub29scy5kaWZmU3RhcnQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBudWxsLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLmRpZmZTdGFydChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIG51bGwsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBudWxsLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDUsIENvbGxlY3Rpb25Ub29scy5kaWZmU3RhcnQoYXJyYXkxLCBhcnJheTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzTGlzdEl0ZXJhdG9yTGlzdEl0ZXJhdG9yKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdDEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdDEuYWRkKCIxMDAwIik7Ci0JCWxpc3QxLmFkZCgiMjAwMCIpOwotCQlsaXN0MS5hZGQoIjMwMDAiKTsKLQkJbGlzdDEuYWRkKCI0MDAwIik7Ci0KLQkJTGlzdDxTdHJpbmc+IGxpc3QyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdDEuc2l6ZSgpOyBpKyspIHsKLQkJCWxpc3QyLmFkZChTdHJpbmcudmFsdWVPZigoaSArIDEpICogMTAwMCkpOwotCQl9Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5pZGVudGljYWwobGlzdDEubGlzdEl0ZXJhdG9yKCksIGxpc3QyLmxpc3RJdGVyYXRvcigpKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmVxdWFscyhsaXN0MS5saXN0SXRlcmF0b3IoKSwgbGlzdDIubGlzdEl0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TGlzdEl0ZXJhdG9ySW50KCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlTdHJpbmcgbyA9IENvbGxlY3Rpb25Ub29scy5nZXQobGlzdC5saXN0SXRlcmF0b3IoKSwgMSk7Ci0JCWFzc2VydEVxdWFscygib25lIiwgbyk7Ci0JCWxpc3QuYWRkKG51bGwpOwotCQlvID0gQ29sbGVjdGlvblRvb2xzLmdldChsaXN0Lmxpc3RJdGVyYXRvcigpLCBsaXN0LnNpemUoKSAtIDEpOwotCQlhc3NlcnROdWxsKG8pOwotCi0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUNvbGxlY3Rpb25Ub29scy5nZXQobGlzdC5saXN0SXRlcmF0b3IoKSwgbGlzdC5zaXplKCkpOwotCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElkZW50aWNhbE9iamVjdEFycmF5T2JqZWN0QXJyYXkoKSB7Ci0JCU9iamVjdFtdIGExID0gbmV3IE9iamVjdFs0XTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhMS5sZW5ndGg7IGkrKykgewotCQkJYTFbaV0gPSBTdHJpbmcudmFsdWVPZihpICogMTAwMCk7Ci0JCX0KLQotCQlPYmplY3RbXSBhMiA9IG5ldyBPYmplY3RbYTEubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhMi5sZW5ndGg7IGkrKykgewotCQkJYTJbaV0gPSBhMVtpXTsKLQkJfQotCi0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmlkZW50aWNhbChhMSwgYTIpKTsKLQkJYTJbMl0gPSAiMjAwMCI7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5pZGVudGljYWwoYTEsIGEyKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhhMSwgYTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SWRlbnRpY2FsTGlzdEl0ZXJhdG9yTGlzdEl0ZXJhdG9yKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdDEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdDEuYWRkKCIwIik7Ci0JCWxpc3QxLmFkZCgiMSIpOwotCQlsaXN0MS5hZGQoIjIiKTsKLQkJbGlzdDEuYWRkKCIzIik7Ci0KLQkJTGlzdDxTdHJpbmc+IGxpc3QyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWZvciAoU3RyaW5nIHMgOiBsaXN0MSkgewotCQkJbGlzdDIuYWRkKHMpOwotCQl9Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmlkZW50aWNhbChsaXN0MS5saXN0SXRlcmF0b3IoKSwgbGlzdDIubGlzdEl0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuZXF1YWxzKGxpc3QxLmxpc3RJdGVyYXRvcigpLCBsaXN0Mi5saXN0SXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJZGVudGl0eURpZmZFbmQoKSB7Ci0JCVN0cmluZyBhID0gImEiOwotCQlTdHJpbmcgYiA9ICJiIjsKLQkJU3RyaW5nIGMgPSAiYyI7Ci0JCVN0cmluZyBkID0gImQiOwotCQlTdHJpbmcgZSA9ICJlIjsKLQkJU3RyaW5nIGFfID0gYTsKLQkJU3RyaW5nIGJfID0gYjsKLQkJU3RyaW5nIGNfID0gYzsKLQkJU3RyaW5nIGRfID0gZDsKLQkJU3RyaW5nIGVfID0gZTsKLQkJYXNzZXJ0VHJ1ZSgoYSA9PSBhXykgJiYgYS5lcXVhbHMoYV8pKTsKLQkJYXNzZXJ0VHJ1ZSgoYiA9PSBiXykgJiYgYi5lcXVhbHMoYl8pKTsKLQkJYXNzZXJ0VHJ1ZSgoYyA9PSBjXykgJiYgYy5lcXVhbHMoY18pKTsKLQkJYXNzZXJ0VHJ1ZSgoZCA9PSBkXykgJiYgZC5lcXVhbHMoZF8pKTsKLQkJYXNzZXJ0VHJ1ZSgoZSA9PSBlXykgJiYgZS5lcXVhbHMoZV8pKTsKLQkJU3RyaW5nW10gYXJyYXkxOwotCQlTdHJpbmdbXSBhcnJheTI7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCBDb2xsZWN0aW9uVG9vbHMuaWRlbnRpdHlEaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXyB9OwotCQlhc3NlcnRFcXVhbHMoLTEsIENvbGxlY3Rpb25Ub29scy5pZGVudGl0eURpZmZFbmQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoNCwgQ29sbGVjdGlvblRvb2xzLmlkZW50aXR5RGlmZkVuZChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDQsIENvbGxlY3Rpb25Ub29scy5pZGVudGl0eURpZmZFbmQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nWzBdOwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDQsIENvbGxlY3Rpb25Ub29scy5pZGVudGl0eURpZmZFbmQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbMF07Ci0JCWFzc2VydEVxdWFscyg0LCBDb2xsZWN0aW9uVG9vbHMuaWRlbnRpdHlEaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1swXTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1swXTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCBDb2xsZWN0aW9uVG9vbHMuaWRlbnRpdHlEaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBiXywgY18sIGFfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5pZGVudGl0eURpZmZFbmQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuaWRlbnRpdHlEaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXyB9OwotCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLmlkZW50aXR5RGlmZkVuZChhcnJheTEsIGFycmF5MikpOwotCi0JCVN0cmluZyBjX18gPSBuZXcgU3RyaW5nKGMpOwotCQlhc3NlcnRUcnVlKChjICE9IGNfXykgJiYgYy5lcXVhbHMoY18pKTsKLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuaWRlbnRpdHlEaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgbnVsbCwgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5pZGVudGl0eURpZmZFbmQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBudWxsLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgbnVsbCwgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscygtMSwgQ29sbGVjdGlvblRvb2xzLmlkZW50aXR5RGlmZkVuZChhcnJheTEsIGFycmF5MikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJZGVudGl0eURpZmZSYW5nZSgpIHsKLQkJU3RyaW5nIGEgPSAiYSI7Ci0JCVN0cmluZyBiID0gImIiOwotCQlTdHJpbmcgYyA9ICJjIjsKLQkJU3RyaW5nIGQgPSAiZCI7Ci0JCVN0cmluZyBlID0gImUiOwotCQlTdHJpbmcgYV8gPSBhOwotCQlTdHJpbmcgYl8gPSBiOwotCQlTdHJpbmcgY18gPSBjOwotCQlTdHJpbmcgZF8gPSBkOwotCQlTdHJpbmcgZV8gPSBlOwotCQlhc3NlcnRUcnVlKChhID09IGFfKSAmJiBhLmVxdWFscyhhXykpOwotCQlhc3NlcnRUcnVlKChiID09IGJfKSAmJiBiLmVxdWFscyhiXykpOwotCQlhc3NlcnRUcnVlKChjID09IGNfKSAmJiBjLmVxdWFscyhjXykpOwotCQlhc3NlcnRUcnVlKChkID09IGRfKSAmJiBkLmVxdWFscyhkXykpOwotCQlhc3NlcnRUcnVlKChlID09IGVfKSAmJiBlLmVxdWFscyhlXykpOwotCQlTdHJpbmdbXSBhcnJheTE7Ci0JCVN0cmluZ1tdIGFycmF5MjsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDUsIC0xKSwgQ29sbGVjdGlvblRvb2xzLmlkZW50aXR5RGlmZlJhbmdlKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXyB9OwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDEsIC0xKSwgQ29sbGVjdGlvblRvb2xzLmlkZW50aXR5RGlmZlJhbmdlKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSYW5nZSgwLCA0KSwgQ29sbGVjdGlvblRvb2xzLmlkZW50aXR5RGlmZlJhbmdlKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDAsIDQpLCBDb2xsZWN0aW9uVG9vbHMuaWRlbnRpdHlEaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nWzBdOwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSYW5nZSgwLCA0KSwgQ29sbGVjdGlvblRvb2xzLmlkZW50aXR5RGlmZlJhbmdlKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nWzBdOwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDAsIDQpLCBDb2xsZWN0aW9uVG9vbHMuaWRlbnRpdHlEaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nWzBdOwotCQlhcnJheTIgPSBuZXcgU3RyaW5nWzBdOwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDAsIC0xKSwgQ29sbGVjdGlvblRvb2xzLmlkZW50aXR5RGlmZlJhbmdlKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBiXywgY18sIGFfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSYW5nZSgwLCAyKSwgQ29sbGVjdGlvblRvb2xzLmlkZW50aXR5RGlmZlJhbmdlKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDAsIDApLCBDb2xsZWN0aW9uVG9vbHMuaWRlbnRpdHlEaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfIH07Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoMywgMyksIENvbGxlY3Rpb25Ub29scy5pZGVudGl0eURpZmZSYW5nZShhcnJheTEsIGFycmF5MikpOwotCi0JCVN0cmluZyBjX18gPSBuZXcgU3RyaW5nKGMpOwotCQlhc3NlcnRUcnVlKChjICE9IGNfXykgJiYgYy5lcXVhbHMoY18pKTsKLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoMiwgMiksIENvbGxlY3Rpb25Ub29scy5pZGVudGl0eURpZmZSYW5nZShhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIG51bGwsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoMiwgMiksIENvbGxlY3Rpb25Ub29scy5pZGVudGl0eURpZmZSYW5nZShhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIG51bGwsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBudWxsLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSYW5nZSg1LCAtMSksIENvbGxlY3Rpb25Ub29scy5pZGVudGl0eURpZmZSYW5nZShhcnJheTEsIGFycmF5MikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJZGVudGl0eURpZmZTdGFydCgpIHsKLQkJU3RyaW5nIGEgPSAiYSI7Ci0JCVN0cmluZyBiID0gImIiOwotCQlTdHJpbmcgYyA9ICJjIjsKLQkJU3RyaW5nIGQgPSAiZCI7Ci0JCVN0cmluZyBlID0gImUiOwotCQlTdHJpbmcgYV8gPSBhOwotCQlTdHJpbmcgYl8gPSBiOwotCQlTdHJpbmcgY18gPSBjOwotCQlTdHJpbmcgZF8gPSBkOwotCQlTdHJpbmcgZV8gPSBlOwotCQlhc3NlcnRUcnVlKChhID09IGFfKSAmJiBhLmVxdWFscyhhXykpOwotCQlhc3NlcnRUcnVlKChiID09IGJfKSAmJiBiLmVxdWFscyhiXykpOwotCQlhc3NlcnRUcnVlKChjID09IGNfKSAmJiBjLmVxdWFscyhjXykpOwotCQlhc3NlcnRUcnVlKChkID09IGRfKSAmJiBkLmVxdWFscyhkXykpOwotCQlhc3NlcnRUcnVlKChlID09IGVfKSAmJiBlLmVxdWFscyhlXykpOwotCQlTdHJpbmdbXSBhcnJheTE7Ci0JCVN0cmluZ1tdIGFycmF5MjsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoNSwgQ29sbGVjdGlvblRvb2xzLmlkZW50aXR5RGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXyB9OwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLmlkZW50aXR5RGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDQsIENvbGxlY3Rpb25Ub29scy5pZGVudGl0eURpZmZTdGFydChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjXywgZF8gfTsKLQkJYXNzZXJ0RXF1YWxzKDQsIENvbGxlY3Rpb25Ub29scy5pZGVudGl0eURpZmZTdGFydChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbMF07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLmlkZW50aXR5RGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nWzBdOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLmlkZW50aXR5RGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1swXTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1swXTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5pZGVudGl0eURpZmZTdGFydChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBlXywgY18sIGRfIH07Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuaWRlbnRpdHlEaWZmU3RhcnQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfIH07Ci0JCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuaWRlbnRpdHlEaWZmU3RhcnQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuaWRlbnRpdHlEaWZmU3RhcnQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlTdHJpbmcgY19fID0gbmV3IFN0cmluZyhjKTsKLQkJYXNzZXJ0VHJ1ZSgoYyAhPSBjX18pICYmIGMuZXF1YWxzKGNfKSk7Ci0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjX18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLmlkZW50aXR5RGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgbnVsbCwgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5pZGVudGl0eURpZmZTdGFydChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIG51bGwsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBudWxsLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDUsIENvbGxlY3Rpb25Ub29scy5pZGVudGl0eURpZmZTdGFydChhcnJheTEsIGFycmF5MikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbmRleE9mTGlzdEl0ZXJhdG9yT2JqZWN0MSgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5pbmRleE9mKGxpc3QubGlzdEl0ZXJhdG9yKCksICJvbmUiKSk7Ci0JCWxpc3QuYWRkKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobGlzdC5zaXplKCkgLSAxLCBDb2xsZWN0aW9uVG9vbHMuaW5kZXhPZihsaXN0Lmxpc3RJdGVyYXRvcigpLCBudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluZGV4T2ZMaXN0SXRlcmF0b3JPYmplY3QyKCkgewotCQlMaXN0PE9iamVjdD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQlsaXN0LmFkZCgiMCIpOwotCQlsaXN0LmFkZCgiMSIpOwotCQlsaXN0LmFkZCgiMiIpOwotCQlsaXN0LmFkZCgiMyIpOwotCi0JCVN0cmluZyBvbmUgPSAiMSI7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuaW5kZXhPZihsaXN0Lmxpc3RJdGVyYXRvcigpLCBvbmUpKTsKLQkJbGlzdC5hZGQobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhsaXN0LnNpemUoKSAtIDEsIENvbGxlY3Rpb25Ub29scy5pbmRleE9mKGxpc3QubGlzdEl0ZXJhdG9yKCksIG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5kZXhPZk9iamVjdEFycmF5T2JqZWN0KCkgewotCQlPYmplY3RbXSBhID0gdGhpcy5idWlsZE9iamVjdEFycmF5MSgpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLmluZGV4T2YoYSwgIm9uZSIpKTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5hZGQoYSwgbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhhLmxlbmd0aCAtIDEsIENvbGxlY3Rpb25Ub29scy5pbmRleE9mKGEsIG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5kZXhPZkNoYXJBcnJheUNoYXIoKSB7Ci0JCWNoYXJbXSBhID0gdGhpcy5idWlsZENoYXJBcnJheSgpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLmluZGV4T2YoYSwgJ2InKSk7Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMuYWRkKGEsICdkJyk7Ci0JCWFzc2VydEVxdWFscyhhLmxlbmd0aCAtIDEsIENvbGxlY3Rpb25Ub29scy5pbmRleE9mKGEsICdkJykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbmRleE9mSW50QXJyYXlJbnQoKSB7Ci0JCWludFtdIGEgPSB0aGlzLmJ1aWxkSW50QXJyYXkoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5pbmRleE9mKGEsIDEwKSk7Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMuYWRkKGEsIDMwKTsKLQkJYXNzZXJ0RXF1YWxzKGEubGVuZ3RoIC0gMSwgQ29sbGVjdGlvblRvb2xzLmluZGV4T2YoYSwgMzApKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5zZXJ0aW9uSW5kZXhPZkxpc3RDb21wYXJhYmxlKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkEiLCAiQyIsICJEIiB9KTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5pbnNlcnRpb25JbmRleE9mKGxpc3QsICJCIikpOwotCi0JCWxpc3QgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJBIiwgIkIiLCAiQyIsICJEIiB9KTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5pbnNlcnRpb25JbmRleE9mKGxpc3QsICJCIikpOwotCi0JCWxpc3QgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJBIiwgIkIiLCAiQiIsICJCIiwgIkMiLCAiRCIgfSk7Ci0JCWFzc2VydEVxdWFscyg0LCBDb2xsZWN0aW9uVG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihsaXN0LCAiQiIpKTsKLQotCQlsaXN0ID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiQSIsICJCIiwgIkIiLCAiQiIsICJDIiwgIkQiIH0pOwotCQlhc3NlcnRFcXVhbHMoNiwgQ29sbGVjdGlvblRvb2xzLmluc2VydGlvbkluZGV4T2YobGlzdCwgIkUiKSk7Ci0KLQkJbGlzdCA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkIiLCAiQiIsICJCIiwgIkMiLCAiRCIgfSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihsaXN0LCAiQSIpKTsKLQotCQlsaXN0ID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkIiLCAiQiIsICJDIiwgIkQiIH0pOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLmluc2VydGlvbkluZGV4T2YobGlzdCwgIkEiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluc2VydGlvbkluZGV4T2ZMaXN0T2JqZWN0Q29tcGFyYXRvcigpIHsKLQkJQ29tcGFyYXRvcjxTdHJpbmc+IGMgPSBuZXcgUmV2ZXJzZUNvbXBhcmF0b3I8U3RyaW5nPigpOwotCQlMaXN0PFN0cmluZz4gbGlzdCA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkQiLCAiQyIsICJBIiB9KTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5pbnNlcnRpb25JbmRleE9mKGxpc3QsICJCIiwgYykpOwotCi0JCWxpc3QgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJEIiwgIkMiLCAiQiIsICJBIiB9KTsKLQkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5pbnNlcnRpb25JbmRleE9mKGxpc3QsICJCIiwgYykpOwotCi0JCWxpc3QgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJEIiwgIkMiLCAiQiIsICJCIiwgIkIiLCAiQSIgfSk7Ci0JCWFzc2VydEVxdWFscyg1LCBDb2xsZWN0aW9uVG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihsaXN0LCAiQiIsIGMpKTsKLQotCQlsaXN0ID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiRCIsICJDIiwgIkIiLCAiQiIsICJCIiwgIkEiIH0pOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLmluc2VydGlvbkluZGV4T2YobGlzdCwgIkUiLCBjKSk7Ci0KLQkJbGlzdCA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkQiLCAiQyIsICJCIiwgIkIiLCAiQiIgfSk7Ci0JCWFzc2VydEVxdWFscyg1LCBDb2xsZWN0aW9uVG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihsaXN0LCAiQSIsIGMpKTsKLQotCQlsaXN0ID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiRCIsICJDIiwgIkIiLCAiQiIsICJBIiwgIkEiIH0pOwotCQlhc3NlcnRFcXVhbHMoNiwgQ29sbGVjdGlvblRvb2xzLmluc2VydGlvbkluZGV4T2YobGlzdCwgIkEiLCBjKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluc2VydGlvbkluZGV4T2ZPYmplY3RBcnJheUNvbXBhcmFibGUoKSB7Ci0JCVN0cmluZ1tdIGEgPSBuZXcgU3RyaW5nW10geyAiQSIsICJDIiwgIkQiIH07Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihhLCAiQiIpKTsKLQotCQlhID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQiIsICJDIiwgIkQiIH07Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihhLCAiQiIpKTsKLQotCQlhID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQiIsICJCIiwgIkIiLCAiQyIsICJEIiB9OwotCQlhc3NlcnRFcXVhbHMoNCwgQ29sbGVjdGlvblRvb2xzLmluc2VydGlvbkluZGV4T2YoYSwgIkIiKSk7Ci0KLQkJYSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkIiLCAiQiIsICJCIiwgIkMiLCAiRCIgfTsKLQkJYXNzZXJ0RXF1YWxzKDYsIENvbGxlY3Rpb25Ub29scy5pbnNlcnRpb25JbmRleE9mKGEsICJFIikpOwotCi0JCWEgPSBuZXcgU3RyaW5nW10geyAiQiIsICJCIiwgIkIiLCAiQyIsICJEIiB9OwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLmluc2VydGlvbkluZGV4T2YoYSwgIkEiKSk7Ci0KLQkJYSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkEiLCAiQiIsICJCIiwgIkMiLCAiRCIgfTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5pbnNlcnRpb25JbmRleE9mKGEsICJBIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnNlcnRpb25JbmRleE9mT2JqZWN0QXJyYXlPYmplY3RDb21wYXJhdG9yKCkgewotCQlDb21wYXJhdG9yPFN0cmluZz4gYyA9IG5ldyBSZXZlcnNlQ29tcGFyYXRvcjxTdHJpbmc+KCk7Ci0JCVN0cmluZ1tdIGEgPSBuZXcgU3RyaW5nW10geyAiRCIsICJDIiwgIkEiIH07Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihhLCAiQiIsIGMpKTsKLQotCQlhID0gbmV3IFN0cmluZ1tdIHsgIkQiLCAiQyIsICJCIiwgIkEiIH07Ci0JCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihhLCAiQiIsIGMpKTsKLQotCQlhID0gbmV3IFN0cmluZ1tdIHsgIkQiLCAiQyIsICJCIiwgIkIiLCAiQiIsICJBIiB9OwotCQlhc3NlcnRFcXVhbHMoNSwgQ29sbGVjdGlvblRvb2xzLmluc2VydGlvbkluZGV4T2YoYSwgIkIiLCBjKSk7Ci0KLQkJYSA9IG5ldyBTdHJpbmdbXSB7ICJEIiwgIkMiLCAiQiIsICJCIiwgIkIiLCAiQSIgfTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5pbnNlcnRpb25JbmRleE9mKGEsICJFIiwgYykpOwotCi0JCWEgPSBuZXcgU3RyaW5nW10geyAiRCIsICJDIiwgIkIiLCAiQiIsICJCIiB9OwotCQlhc3NlcnRFcXVhbHMoNSwgQ29sbGVjdGlvblRvb2xzLmluc2VydGlvbkluZGV4T2YoYSwgIkEiLCBjKSk7Ci0KLQkJYSA9IG5ldyBTdHJpbmdbXSB7ICJEIiwgIkMiLCAiQiIsICJCIiwgIkEiLCAiQSIgfTsKLQkJYXNzZXJ0RXF1YWxzKDYsIENvbGxlY3Rpb25Ub29scy5pbnNlcnRpb25JbmRleE9mKGEsICJBIiwgYykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvck9iamVjdEFycmF5KCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSBDb2xsZWN0aW9uVG9vbHMuaXRlcmF0b3IoYSk7IHN0cmVhbS5oYXNOZXh0KCk7IGkrKykgewotCQkJYXNzZXJ0RXF1YWxzKGFbaV0sIHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExhc3RJbmRleE9mTGlzdEl0ZXJhdG9yT2JqZWN0KCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLmxhc3RJbmRleE9mKGxpc3QubGlzdEl0ZXJhdG9yKCksICJvbmUiKSk7Ci0JCWxpc3QuYWRkKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobGlzdC5zaXplKCkgLSAxLCBDb2xsZWN0aW9uVG9vbHMubGFzdEluZGV4T2YobGlzdC5saXN0SXRlcmF0b3IoKSwgbnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMYXN0SW5kZXhPZk9iamVjdEFycmF5T2JqZWN0KCkgewotCQlPYmplY3RbXSBhID0gdGhpcy5idWlsZE9iamVjdEFycmF5MSgpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLmxhc3RJbmRleE9mKGEsICJvbmUiKSk7Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMuYWRkKGEsIG51bGwpOwotCQlhc3NlcnRFcXVhbHMoYS5sZW5ndGggLSAxLCBDb2xsZWN0aW9uVG9vbHMubGFzdEluZGV4T2YoYSwgbnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMYXN0SW5kZXhPZkNoYXJBcnJheUNoYXIoKSB7Ci0JCWNoYXJbXSBhID0gdGhpcy5idWlsZENoYXJBcnJheSgpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLmxhc3RJbmRleE9mKGEsICdiJykpOwotCQlhID0gQ29sbGVjdGlvblRvb2xzLmFkZChhLCAnZCcpOwotCQlhc3NlcnRFcXVhbHMoYS5sZW5ndGggLSAxLCBDb2xsZWN0aW9uVG9vbHMubGFzdEluZGV4T2YoYSwgJ2QnKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExhc3RJbmRleE9mSW50QXJyYXlJbnQoKSB7Ci0JCWludFtdIGEgPSB0aGlzLmJ1aWxkSW50QXJyYXkoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5sYXN0SW5kZXhPZihhLCAxMCkpOwotCQlhID0gQ29sbGVjdGlvblRvb2xzLmFkZChhLCAzMCk7Ci0JCWFzc2VydEVxdWFscyhhLmxlbmd0aCAtIDEsIENvbGxlY3Rpb25Ub29scy5sYXN0SW5kZXhPZihhLCAzMCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0SXRlcmF0b3IxKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ0xpc3QxKCksIGxpc3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0SXRlcmF0b3IyKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdDEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdDEuYWRkKCIwIik7Ci0JCWxpc3QxLmFkZCgiMSIpOwotCQlsaXN0MS5hZGQoIjIiKTsKLQkJbGlzdDEuYWRkKCIzIik7Ci0KLQkJTGlzdDxPYmplY3Q+IGxpc3QyID0gQ29sbGVjdGlvblRvb2xzLjxPYmplY3Q+bGlzdChsaXN0MS5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKGxpc3QxLCBsaXN0Mik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RPYmplY3RBcnJheSgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ0xpc3QxKCksIGxpc3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0SXRlcmF0b3JPYmplY3RBcnJheSgpIHsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJaW50IGkgPSAwOwotCQlmb3IgKExpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IENvbGxlY3Rpb25Ub29scy5saXN0SXRlcmF0b3IoYSk7IHN0cmVhbS5oYXNOZXh0KCk7IGkrKykgewotCQkJYXNzZXJ0RXF1YWxzKGFbaV0sIHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RJdGVyYXRvck9iamVjdEFycmF5SW50KCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlpbnQgaSA9IDE7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gQ29sbGVjdGlvblRvb2xzLmxpc3RJdGVyYXRvcihhLCAxKTsgc3RyZWFtLmhhc05leHQoKTsgaSsrKSB7Ci0JCQlhc3NlcnRFcXVhbHMoYVtpXSwgc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWF4Q2hhckFycmF5KCkgewotCQlhc3NlcnRFcXVhbHMoJ2MnLCBDb2xsZWN0aW9uVG9vbHMubWF4KHRoaXMuYnVpbGRDaGFyQXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNYXhJbnRBcnJheSgpIHsKLQkJYXNzZXJ0RXF1YWxzKDIwLCBDb2xsZWN0aW9uVG9vbHMubWF4KHRoaXMuYnVpbGRJbnRBcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1pbkNoYXJBcnJheSgpIHsKLQkJYXNzZXJ0RXF1YWxzKCdhJywgQ29sbGVjdGlvblRvb2xzLm1pbih0aGlzLmJ1aWxkQ2hhckFycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWluSW50QXJyYXkoKSB7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMubWluKHRoaXMuYnVpbGRJbnRBcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbE9iamVjdEFycmF5T2JqZWN0QXJyYXkoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQSIsICJCIiwgIkIiLCAiQyIsICJDIiwgIkQiLCAiRCIsICJFIiwgIkUiLCAiRiIsICJGIiB9OwotCQlTdHJpbmdbXSBhMiA9IG5ldyBTdHJpbmdbXSB7ICJFIiwgIkIiIH07Ci0JCVN0cmluZ1tdIGEzID0gQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChhMSwgYTIpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIkEiLCAiQSIsICJDIiwgIkMiLCAiRCIsICJEIiwgIkYiLCAiRiIgfSwgYTMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsQ2hhckFycmF5Q2hhckFycmF5KCkgewotCQljaGFyW10gYTEgPSBuZXcgY2hhcltdIHsgJ0EnLCAnQScsICdCJywgJ0InLCAnQycsICdDJywgJ0QnLCAnRCcsICdFJywgJ0UnLCAnRicsICdGJyB9OwotCQljaGFyW10gYTIgPSBuZXcgY2hhcltdIHsgJ0UnLCAnQicgfTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBjaGFyW10geyAnQScsICdBJywgJ0MnLCAnQycsICdEJywgJ0QnLCAnRicsICdGJyB9LCBDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsKGExLCBhMikpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsSW50QXJyYXlJbnRBcnJheSgpIHsKLQkJaW50W10gYTEgPSBuZXcgaW50W10geyAxLCAxLCAyLCAyLCAzLCAzLCA0LCA0LCA1LCA1LCA2LCA2IH07Ci0JCWludFtdIGEyID0gbmV3IGludFtdIHsgNSwgMiB9OwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgMSwgMSwgMywgMywgNCwgNCwgNiwgNiB9LCBDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsKGExLCBhMikpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlT2JqZWN0QXJyYXlPYmplY3QxKCkgewotCQlPYmplY3RbXSBhID0gdGhpcy5idWlsZE9iamVjdEFycmF5MSgpOwotCQlhID0gQ29sbGVjdGlvblRvb2xzLmFkZChhLCAidGhyZWUiKTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5hZGQoYSwgImZvdXIiKTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5hZGQoYSwgImZpdmUiKTsKLQotCQlhc3NlcnRFcXVhbHMoNiwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhhLCAidGhyZWUiKSk7Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMucmVtb3ZlKGEsICJ0aHJlZSIpOwotCQlhc3NlcnRFcXVhbHMoNSwgYS5sZW5ndGgpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYSwgInRocmVlIikpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhhLCAiZm91ciIpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYSwgImZpdmUiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZU9iamVjdEFycmF5T2JqZWN0MigpIHsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5hZGQoYSwgInRocmVlIik7Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMuYWRkKGEsICJmb3VyIik7Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMuYWRkKGEsICJmaXZlIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKDYsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYSwgInRocmVlIikpOwotCQlhID0gQ29sbGVjdGlvblRvb2xzLnJlbW92ZShhLCAidGhyZWUiKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsICJ0aHJlZSIpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYSwgImZvdXIiKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsICJmaXZlIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVDaGFyQXJyYXlDaGFyKCkgewotCQljaGFyW10gYSA9IHRoaXMuYnVpbGRDaGFyQXJyYXkoKTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5hZGQoYSwgJ2QnKTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5hZGQoYSwgJ2UnKTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5hZGQoYSwgJ2YnKTsKLQotCQlhc3NlcnRFcXVhbHMoNiwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhhLCAnZCcpKTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5yZW1vdmUoYSwgJ2QnKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsICdkJykpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhhLCAnZScpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYSwgJ2YnKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUludEFycmF5SW50KCkgewotCQlpbnRbXSBhID0gdGhpcy5idWlsZEludEFycmF5KCk7Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMuYWRkKGEsIDMwKTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5hZGQoYSwgNDApOwotCQlhID0gQ29sbGVjdGlvblRvb2xzLmFkZChhLCA1MCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDYsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYSwgMzApKTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5yZW1vdmUoYSwgMzApOwotCQlhc3NlcnRFcXVhbHMoNSwgYS5sZW5ndGgpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYSwgMzApKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYSwgNDApKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYSwgNTApKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsQ29sbGVjdGlvbkl0ZXJhdG9yMSgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsKGMsIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygib25lIikpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJ0d28iKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoInRocmVlIikpOwotCi0JCWMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChjLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKS5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5zaXplKCksIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLCBjKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsQ29sbGVjdGlvbkl0ZXJhdG9yMigpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYy5hZGQoImEiKTsKLQkJYy5hZGQoImEiKTsKLQkJYy5hZGQoImIiKTsKLQkJYy5hZGQoImMiKTsKLQkJYy5hZGQoImQiKTsKLQkJYy5hZGQoImQiKTsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbXSB7ICJhIiwgImQiIH07Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChjLCBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KGEpKSk7Ci0JCWFzc2VydEVxdWFscygyLCBjLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoImEiKSk7Ci0JCWFzc2VydFRydWUoYy5jb250YWlucygiYiIpKTsKLQkJYXNzZXJ0VHJ1ZShjLmNvbnRhaW5zKCJjIikpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJkIikpOwotCi0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGwoYywgbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihhKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxDb2xsZWN0aW9uSXRlcmF0b3IzKCkgewotCQlDb2xsZWN0aW9uPE9iamVjdD4gYyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQljLmFkZCgiYSIpOwotCQljLmFkZCgiYSIpOwotCQljLmFkZCgiYiIpOwotCQljLmFkZCgiYyIpOwotCQljLmFkZCgiZCIpOwotCQljLmFkZCgiZCIpOwotCQlTdHJpbmdbXSBhID0gbmV3IFN0cmluZ1tdIHsgImEiLCAiZCIgfTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsKGMsIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oYSkpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygiYSIpKTsKLQkJYXNzZXJ0VHJ1ZShjLmNvbnRhaW5zKCJiIikpOwotCQlhc3NlcnRUcnVlKGMuY29udGFpbnMoImMiKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoImQiKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChjLCBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KGEpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbENvbGxlY3Rpb25PYmplY3RBcnJheTEoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChjLCB0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygib25lIikpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJ0d28iKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoInRocmVlIikpOwotCi0JCWMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChjLCB0aGlzLmJ1aWxkT2JqZWN0QXJyYXkyKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLnNpemUoKSwgYy5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ0xpc3QxKCksIGMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxDb2xsZWN0aW9uT2JqZWN0QXJyYXkyKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljLmFkZCgiYSIpOwotCQljLmFkZCgiYSIpOwotCQljLmFkZCgiYiIpOwotCQljLmFkZCgiYyIpOwotCQljLmFkZCgiZCIpOwotCQljLmFkZCgiZCIpOwotCQlTdHJpbmdbXSBhID0gbmV3IFN0cmluZ1tdIHsgImEiLCAiZCIgfTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsKGMsIGEpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygiYSIpKTsKLQkJYXNzZXJ0VHJ1ZShjLmNvbnRhaW5zKCJiIikpOwotCQlhc3NlcnRUcnVlKGMuY29udGFpbnMoImMiKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoImQiKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChjLCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbENvbGxlY3Rpb25PYmplY3RBcnJheTMoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMuYWRkKCJhIik7Ci0JCWMuYWRkKCJiIik7Ci0JCWMuYWRkKCJjIik7Ci0JCWMuYWRkKCJkIik7Ci0JCWMuYWRkKCJhIik7Ci0JCWMuYWRkKCJkIik7Ci0JCWMuYWRkKCJkIik7Ci0JCWMuYWRkKCJhIik7Ci0JCWMuYWRkKCJjIik7Ci0JCVN0cmluZ1tdIGEgPSBuZXcgU3RyaW5nW10geyAiYSIsICJkIiB9OwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGwoYywgYSkpOwotCQlhc3NlcnRFcXVhbHMoMywgYy5zaXplKCkpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJhIikpOwotCQlhc3NlcnRUcnVlKGMuY29udGFpbnMoImIiKSk7Ci0JCWFzc2VydFRydWUoYy5jb250YWlucygiYyIpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygiZCIpKTsKLQotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsKGMsIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsT2NjdXJyZW5jZXNDb2xsZWN0aW9uT2JqZWN0KCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRFcXVhbHMoMywgYy5zaXplKCkpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoYywgInRocmVlIikpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhjLCAidHdvIikpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoYywgInR3byIpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGMuc2l6ZSgpKTsKLQotCQljLmFkZCgiZml2ZSIpOwotCQljLmFkZCgiZml2ZSIpOwotCQljLmFkZCgiZml2ZSIpOwotCQlhc3NlcnRFcXVhbHMoNSwgYy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhjLCAiZml2ZSIpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGMsICJmaXZlIikpOwotCQlhc3NlcnRFcXVhbHMoMiwgYy5zaXplKCkpOwotCi0JCWMuYWRkKG51bGwpOwotCQljLmFkZChudWxsKTsKLQkJYy5hZGQobnVsbCk7Ci0JCWFzc2VydEVxdWFscyg1LCBjLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGMsIG51bGwpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGMsIG51bGwpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGMuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsT2NjdXJyZW5jZXNPYmplY3RBcnJheU9iamVjdCgpIHsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGEubGVuZ3RoKTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhhLCAidGhyZWUiKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGEubGVuZ3RoKTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhhLCAidHdvIik7Ci0JCWFzc2VydEVxdWFscygyLCBhLmxlbmd0aCk7Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoYSwgInR3byIpOwotCQlhc3NlcnRFcXVhbHMoMiwgYS5sZW5ndGgpOwotCi0JCWEgPSBDb2xsZWN0aW9uVG9vbHMuYWRkKGEsICJmaXZlIik7Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMuYWRkKGEsICJmaXZlIik7Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMuYWRkKGEsICJmaXZlIik7Ci0JCWFzc2VydEVxdWFscyg1LCBhLmxlbmd0aCk7Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoYSwgImZpdmUiKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGEubGVuZ3RoKTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhhLCAiZml2ZSIpOwotCQlhc3NlcnRFcXVhbHMoMiwgYS5sZW5ndGgpOwotCi0JCWEgPSBDb2xsZWN0aW9uVG9vbHMuYWRkKGEsIG51bGwpOwotCQlhID0gQ29sbGVjdGlvblRvb2xzLmFkZChhLCBudWxsKTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5hZGQoYSwgbnVsbCk7Ci0JCWFzc2VydEVxdWFscyg1LCBhLmxlbmd0aCk7Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoYSwgbnVsbCk7Ci0JCWFzc2VydEVxdWFscygyLCBhLmxlbmd0aCk7Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoYSwgbnVsbCk7Ci0JCWFzc2VydEVxdWFscygyLCBhLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbE9jY3VycmVuY2VzQ2hhckFycmF5Q2hhcigpIHsKLQkJY2hhcltdIGEgPSB0aGlzLmJ1aWxkQ2hhckFycmF5KCk7Ci0JCWFzc2VydEVxdWFscygzLCBhLmxlbmd0aCk7Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoYSwgJ2QnKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGEubGVuZ3RoKTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhhLCAnYicpOwotCQlhc3NlcnRFcXVhbHMoMiwgYS5sZW5ndGgpOwotCQlhID0gQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGEsICdiJyk7Ci0JCWFzc2VydEVxdWFscygyLCBhLmxlbmd0aCk7Ci0KLQkJYSA9IENvbGxlY3Rpb25Ub29scy5hZGQoYSwgJ2cnKTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5hZGQoYSwgJ2cnKTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5hZGQoYSwgJ2cnKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIGEubGVuZ3RoKTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhhLCAnZycpOwotCQlhc3NlcnRFcXVhbHMoMiwgYS5sZW5ndGgpOwotCQlhID0gQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGEsICdnJyk7Ci0JCWFzc2VydEVxdWFscygyLCBhLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbE9jY3VycmVuY2VzSW50QXJyYXlJbnQoKSB7Ci0JCWludFtdIGEgPSB0aGlzLmJ1aWxkSW50QXJyYXkoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGEubGVuZ3RoKTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhhLCA1NSk7Ci0JCWFzc2VydEVxdWFscygzLCBhLmxlbmd0aCk7Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoYSwgMTApOwotCQlhc3NlcnRFcXVhbHMoMiwgYS5sZW5ndGgpOwotCQlhID0gQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGEsIDEwKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGEubGVuZ3RoKTsKLQotCQlhID0gQ29sbGVjdGlvblRvb2xzLmFkZChhLCA3Nyk7Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMuYWRkKGEsIDc3KTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5hZGQoYSwgNzcpOwotCQlhc3NlcnRFcXVhbHMoNSwgYS5sZW5ndGgpOwotCQlhID0gQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGEsIDc3KTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGEubGVuZ3RoKTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhhLCA3Nyk7Ci0JCWFzc2VydEVxdWFscygyLCBhLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUVsZW1lbnRBdEluZGV4T2JqZWN0QXJyYXlJbnQoKSB7Ci0JCVN0cmluZ1tdIGEgPSBuZXcgU3RyaW5nW10geyAiQSIsICJCIiwgIkEiLCAiQyIsICJBIiwgIkQiIH07Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMucmVtb3ZlRWxlbWVudEF0SW5kZXgoYSwgMyk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiQSIsICJCIiwgIkEiLCAiQSIsICJEIiB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUVsZW1lbnRBdEluZGV4Q2hhckFycmF5SW50KCkgewotCQljaGFyW10gYSA9IG5ldyBjaGFyW10geyAnQScsICdCJywgJ0EnLCAnQycsICdBJywgJ0QnIH07Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMucmVtb3ZlRWxlbWVudEF0SW5kZXgoYSwgMyk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgY2hhcltdIHsgJ0EnLCAnQicsICdBJywgJ0EnLCAnRCcgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVFbGVtZW50QXRJbmRleEludEFycmF5SW50KCkgewotCQlpbnRbXSBhID0gbmV3IGludFtdIHsgOCwgNiwgNywgMzMsIDIsIDExIH07Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMucmVtb3ZlRWxlbWVudEF0SW5kZXgoYSwgMyk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgaW50W10geyA4LCA2LCA3LCAyLCAxMSB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlcGxhY2VBbGxPYmplY3RBcnJheTEoKSB7Ci0JCU9iamVjdFtdIGEgPSBuZXcgT2JqZWN0W10geyAiQSIsICJCIiwgIkEiLCAiQyIsICJBIiwgIkQiIH07Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMucmVwbGFjZUFsbChhLCAiQSIsICJaIik7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgT2JqZWN0W10geyAiWiIsICJCIiwgIloiLCAiQyIsICJaIiwgIkQiIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZUFsbE9iamVjdEFycmF5MigpIHsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkIiLCAiQSIsICJDIiwgIkEiLCAiRCIgfTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5yZXBsYWNlQWxsKGEsICJBIiwgIloiKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJaIiwgIkIiLCAiWiIsICJDIiwgIloiLCAiRCIgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlQWxsQ2hhckFycmF5KCkgewotCQljaGFyW10gYSA9IG5ldyBjaGFyW10geyAnQScsICdCJywgJ0EnLCAnQycsICdBJywgJ0QnIH07Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMucmVwbGFjZUFsbChhLCAnQScsICdaJyk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgY2hhcltdIHsgJ1onLCAnQicsICdaJywgJ0MnLCAnWicsICdEJyB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlcGxhY2VBbGxJbnRBcnJheSgpIHsKLQkJaW50W10gYSA9IG5ldyBpbnRbXSB7IDAsIDEsIDAsIDcsIDAsIDk5IH07Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMucmVwbGFjZUFsbChhLCAwLCAxMyk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgaW50W10geyAxMywgMSwgMTMsIDcsIDEzLCA5OSB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbENvbGxlY3Rpb25JdGVyYXRvcjEoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYywgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuc2l6ZSgpLCBjLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSwgYyk7Ci0KLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMucmV0YWluQWxsKGMsIHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygib25lIikpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJ0d28iKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoInRocmVlIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxDb2xsZWN0aW9uSXRlcmF0b3IyKCkgewotCQlDb2xsZWN0aW9uPE9iamVjdD4gYzEgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJYzEuYWRkKCJ6ZXJvIik7Ci0JCWMxLmFkZCgib25lIik7Ci0JCWMxLmFkZCgidHdvIik7Ci0JCQotCQlDb2xsZWN0aW9uPFN0cmluZz4gYzIgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYzIuYWRkKCJ6ZXJvIik7Ci0JCWMyLmFkZCgib25lIik7Ci0JCWMyLmFkZCgidHdvIik7Ci0JCQotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmV0YWluQWxsKGMxLCBjMi5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscyhjMi5zaXplKCksIGMxLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhjMiwgYzEpOwotCi0JCUNvbGxlY3Rpb248U3RyaW5nPiBjMyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljMy5hZGQoInRocmVlIik7Ci0JCWMzLmFkZCgiZm91ciIpOwotCQljMy5hZGQoImZpdmUiKTsKLQkJCi0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLnJldGFpbkFsbChjMSwgYzMuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYzEuc2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYzEuY29udGFpbnMoIm9uZSIpKTsKLQkJYXNzZXJ0RmFsc2UoYzEuY29udGFpbnMoInR3byIpKTsKLQkJYXNzZXJ0RmFsc2UoYzEuY29udGFpbnMoInRocmVlIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxDb2xsZWN0aW9uT2JqZWN0QXJyYXkoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYywgdGhpcy5idWlsZE9iamVjdEFycmF5MSgpKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5zaXplKCksIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLCBjKTsKLQotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYywgdGhpcy5idWlsZE9iamVjdEFycmF5MigpKSk7Ci0JCWFzc2VydEVxdWFscygwLCBjLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoIm9uZSIpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygidHdvIikpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJ0aHJlZSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsT2JqZWN0QXJyYXlPYmplY3RBcnJheSgpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkIiLCAiQiIsICJDIiwgIkMiLCAiRCIsICJEIiwgIkUiLCAiRSIsICJGIiwgIkYiIH07Ci0JCU9iamVjdFtdIGEyID0gbmV3IE9iamVjdFtdIHsgIkUiLCAiQiIsIG5ldyBJbnRlZ2VyKDcpIH07Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiQiIsICJCIiwgIkUiLCAiRSIgfSwgQ29sbGVjdGlvblRvb2xzLnJldGFpbkFsbChhMSwgYTIpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbENoYXJBcnJheUNoYXJBcnJheSgpIHsKLQkJY2hhcltdIGExID0gbmV3IGNoYXJbXSB7ICdBJywgJ0EnLCAnQicsICdCJywgJ0MnLCAnQycsICdEJywgJ0QnLCAnRScsICdFJywgJ0YnLCAnRicgfTsKLQkJY2hhcltdIGEyID0gbmV3IGNoYXJbXSB7ICdFJywgJ0InIH07Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgY2hhcltdIHsgJ0InLCAnQicsICdFJywgJ0UnIH0sIENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYTEsIGEyKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxJbnRBcnJheUludEFycmF5KCkgewotCQlpbnRbXSBhMSA9IG5ldyBpbnRbXSB7IDEsIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDUsIDUsIDYsIDYgfTsKLQkJaW50W10gYTIgPSBuZXcgaW50W10geyA1LCAyIH07Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgaW50W10geyAyLCAyLCA1LCA1IH0sIENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYTEsIGEyKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXZlcnNlT2JqZWN0QXJyYXkxKCkgewotCQlPYmplY3RbXSBhID0gdGhpcy5idWlsZE9iamVjdEFycmF5MSgpOwotCQlhID0gQ29sbGVjdGlvblRvb2xzLnJldmVyc2UoYSk7Ci0JCWFzc2VydEVxdWFscygidHdvIiwgYVswXSk7Ci0JCWFzc2VydEVxdWFscygib25lIiwgYVsxXSk7Ci0JCWFzc2VydEVxdWFscygiemVybyIsIGFbMl0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXZlcnNlT2JqZWN0QXJyYXkyKCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlhID0gQ29sbGVjdGlvblRvb2xzLnJldmVyc2UoYSk7Ci0JCWFzc2VydEVxdWFscygidHdvIiwgYVswXSk7Ci0JCWFzc2VydEVxdWFscygib25lIiwgYVsxXSk7Ci0JCWFzc2VydEVxdWFscygiemVybyIsIGFbMl0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXZlcnNlQ2hhckFycmF5KCkgewotCQljaGFyW10gYSA9IHRoaXMuYnVpbGRDaGFyQXJyYXkoKTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5yZXZlcnNlKGEpOwotCQlhc3NlcnRFcXVhbHMoJ2MnLCBhWzBdKTsKLQkJYXNzZXJ0RXF1YWxzKCdiJywgYVsxXSk7Ci0JCWFzc2VydEVxdWFscygnYScsIGFbMl0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXZlcnNlSW50QXJyYXkoKSB7Ci0JCWludFtdIGEgPSB0aGlzLmJ1aWxkSW50QXJyYXkoKTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5yZXZlcnNlKGEpOwotCQlhc3NlcnRFcXVhbHMoMjAsIGFbMF0pOwotCQlhc3NlcnRFcXVhbHMoMTAsIGFbMV0pOwotCQlhc3NlcnRFcXVhbHMoMCwgYVsyXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldmVyc2VMaXN0SXRlcmF0b3IxKCkgewotCQlMaXN0PFN0cmluZz4gYWN0dWFsID0gQ29sbGVjdGlvblRvb2xzLnJldmVyc2VMaXN0KHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpOwotCQlMaXN0PFN0cmluZz4gZXhwZWN0ZWQgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJQ29sbGVjdGlvbnMucmV2ZXJzZShleHBlY3RlZCk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgYWN0dWFsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV2ZXJzZUxpc3RJdGVyYXRvcjIoKSB7Ci0JCUxpc3Q8T2JqZWN0PiBhY3R1YWwgPSBDb2xsZWN0aW9uVG9vbHMuPE9iamVjdD5yZXZlcnNlTGlzdCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpKTsKLQkJTGlzdDxPYmplY3Q+IGV4cGVjdGVkID0gdGhpcy5idWlsZE9iamVjdExpc3QxKCk7Ci0JCUNvbGxlY3Rpb25zLnJldmVyc2UoZXhwZWN0ZWQpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJvdGF0ZU9iamVjdEFycmF5KCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlhID0gQ29sbGVjdGlvblRvb2xzLnJvdGF0ZShhKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0d28iLCBhWzBdKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6ZXJvIiwgYVsxXSk7Ci0JCWFzc2VydEVxdWFscygib25lIiwgYVsyXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJvdGF0ZU9iamVjdEFycmF5SW50KCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlhID0gQ29sbGVjdGlvblRvb2xzLnJvdGF0ZShhLCAyKTsKLQkJYXNzZXJ0RXF1YWxzKCJvbmUiLCBhWzBdKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0d28iLCBhWzFdKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6ZXJvIiwgYVsyXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJvdGF0ZUNoYXJBcnJheSgpIHsKLQkJY2hhcltdIGEgPSB0aGlzLmJ1aWxkQ2hhckFycmF5KCk7Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMucm90YXRlKGEpOwotCQlhc3NlcnRFcXVhbHMoJ2MnLCBhWzBdKTsKLQkJYXNzZXJ0RXF1YWxzKCdhJywgYVsxXSk7Ci0JCWFzc2VydEVxdWFscygnYicsIGFbMl0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSb3RhdGVDaGFyQXJyYXlJbnQoKSB7Ci0JCWNoYXJbXSBhID0gdGhpcy5idWlsZENoYXJBcnJheSgpOwotCQlhID0gQ29sbGVjdGlvblRvb2xzLnJvdGF0ZShhLCAyKTsKLQkJYXNzZXJ0RXF1YWxzKCdiJywgYVswXSk7Ci0JCWFzc2VydEVxdWFscygnYycsIGFbMV0pOwotCQlhc3NlcnRFcXVhbHMoJ2EnLCBhWzJdKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Um90YXRlSW50QXJyYXkoKSB7Ci0JCWludFtdIGEgPSB0aGlzLmJ1aWxkSW50QXJyYXkoKTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5yb3RhdGUoYSk7Ci0JCWFzc2VydEVxdWFscygyMCwgYVswXSk7Ci0JCWFzc2VydEVxdWFscygwLCBhWzFdKTsKLQkJYXNzZXJ0RXF1YWxzKDEwLCBhWzJdKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Um90YXRlSW50QXJyYXlJbnQoKSB7Ci0JCWludFtdIGEgPSB0aGlzLmJ1aWxkSW50QXJyYXkoKTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5yb3RhdGUoYSwgMik7Ci0JCWFzc2VydEVxdWFscygxMCwgYVswXSk7Ci0JCWFzc2VydEVxdWFscygyMCwgYVsxXSk7Ci0JCWFzc2VydEVxdWFscygwLCBhWzJdKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0SXRlcmF0b3IxKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ1NldDEoKSwgQ29sbGVjdGlvblRvb2xzLnNldCh0aGlzLmJ1aWxkU3RyaW5nU2V0MSgpLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0SXRlcmF0b3IyKCkgewotCQlTZXQ8U3RyaW5nPiBzZXQxID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCQlzZXQxLmFkZCgiMCIpOwotCQlzZXQxLmFkZCgiMSIpOwotCQlzZXQxLmFkZCgiMiIpOwotCQlzZXQxLmFkZCgiMyIpOwotCi0JCVNldDxPYmplY3Q+IHNldDIgPSBDb2xsZWN0aW9uVG9vbHMuPE9iamVjdD5zZXQoc2V0MS5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKHNldDEsIHNldDIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRPYmplY3RBcnJheSgpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTdHJpbmdTZXQxKCksIENvbGxlY3Rpb25Ub29scy5zZXQodGhpcy5idWlsZFN0cmluZ1NldDEoKS50b0FycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2h1ZmZsZU9iamVjdEFycmF5KCkgewotCQlTdHJpbmdbXSBhcnJheTEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCVN0cmluZ1tdIGFycmF5MiA9IENvbGxlY3Rpb25Ub29scy5zaHVmZmxlKHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKSk7Ci0JCWFzc2VydEVxdWFscyhhcnJheTEubGVuZ3RoLCBhcnJheTIubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwoYXJyYXkxLCBhcnJheTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2h1ZmZsZUNoYXJBcnJheSgpIHsKLQkJY2hhcltdIGFycmF5MSA9IHRoaXMuYnVpbGRDaGFyQXJyYXkoKTsKLQkJY2hhcltdIGFycmF5MiA9IENvbGxlY3Rpb25Ub29scy5zaHVmZmxlKHRoaXMuYnVpbGRDaGFyQXJyYXkoKSk7Ci0JCWFzc2VydEVxdWFscyhhcnJheTEubGVuZ3RoLCBhcnJheTIubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwoYXJyYXkxLCBhcnJheTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2h1ZmZsZUludEFycmF5KCkgewotCQlpbnRbXSBhcnJheTEgPSB0aGlzLmJ1aWxkSW50QXJyYXkoKTsKLQkJaW50W10gYXJyYXkyID0gQ29sbGVjdGlvblRvb2xzLnNodWZmbGUodGhpcy5idWlsZEludEFycmF5KCkpOwotCQlhc3NlcnRFcXVhbHMoYXJyYXkxLmxlbmd0aCwgYXJyYXkyLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKGFycmF5MSwgYXJyYXkyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpbmdsZXRvbkl0ZXJhdG9yMSgpIHsKLQkJSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSBDb2xsZWN0aW9uVG9vbHMuc2luZ2xldG9uSXRlcmF0b3IoImZvbyIpOwotCQlhc3NlcnRUcnVlKHN0cmVhbS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHN0cmVhbS5uZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaW5nbGV0b25JdGVyYXRvcjIoKSB7Ci0JCUl0ZXJhdG9yPE9iamVjdD4gc3RyZWFtID0gQ29sbGVjdGlvblRvb2xzLjxPYmplY3Q+c2luZ2xldG9uSXRlcmF0b3IoImZvbyIpOwotCQlhc3NlcnRUcnVlKHN0cmVhbS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHN0cmVhbS5uZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaW5nbGV0b25JdGVyYXRvcjMoKSB7Ci0JCUl0ZXJhdG9yPE9iamVjdD4gc3RyZWFtID0gQ29sbGVjdGlvblRvb2xzLnNpbmdsZXRvbkl0ZXJhdG9yKChPYmplY3QpICJmb28iKTsKLQkJYXNzZXJ0VHJ1ZShzdHJlYW0uaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBzdHJlYW0ubmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2l6ZUl0ZXJhdG9yKCkgewotCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLnNpemUodGhpcy5idWlsZE9iamVjdExpc3QxKCkuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTb3J0ZWRTZXRJdGVyYXRvcjEoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU29ydGVkU3RyaW5nU2V0MSgpLCBDb2xsZWN0aW9uVG9vbHMuc2V0KHRoaXMuYnVpbGRTb3J0ZWRTdHJpbmdTZXQxKCkuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTb3J0ZWRTZXRJdGVyYXRvcjIoKSB7Ci0JCVNvcnRlZFNldDxTdHJpbmc+IHNzMSA9IG5ldyBUcmVlU2V0PFN0cmluZz4oKTsKLQkJc3MxLmFkZCgiMCIpOwotCQlzczEuYWRkKCIyIik7Ci0JCXNzMS5hZGQoIjMiKTsKLQkJc3MxLmFkZCgiMSIpOwotCi0JCVNvcnRlZFNldDxTdHJpbmc+IHNldDIgPSBDb2xsZWN0aW9uVG9vbHMuPFN0cmluZz5zb3J0ZWRTZXQoc3MxLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoc3MxLCBzZXQyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U29ydGVkU2V0T2JqZWN0QXJyYXkoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU29ydGVkU3RyaW5nU2V0MSgpLCBDb2xsZWN0aW9uVG9vbHMuc2V0KHRoaXMuYnVpbGRTb3J0ZWRTdHJpbmdTZXQxKCkudG9BcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN3YXBPYmplY3RBcnJheSgpIHsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJYSA9IENvbGxlY3Rpb25Ub29scy5zd2FwKGEsIDEsIDIpOwotCQlhc3NlcnRFcXVhbHMoInplcm8iLCBhWzBdKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0d28iLCBhWzFdKTsKLQkJYXNzZXJ0RXF1YWxzKCJvbmUiLCBhWzJdKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3dhcENoYXJBcnJheSgpIHsKLQkJY2hhcltdIGEgPSB0aGlzLmJ1aWxkQ2hhckFycmF5KCk7Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMuc3dhcChhLCAxLCAyKTsKLQkJYXNzZXJ0RXF1YWxzKCdhJywgYVswXSk7Ci0JCWFzc2VydEVxdWFscygnYycsIGFbMV0pOwotCQlhc3NlcnRFcXVhbHMoJ2InLCBhWzJdKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3dhcEludEFycmF5KCkgewotCQlpbnRbXSBhID0gdGhpcy5idWlsZEludEFycmF5KCk7Ci0JCWEgPSBDb2xsZWN0aW9uVG9vbHMuc3dhcChhLCAxLCAyKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGFbMF0pOwotCQlhc3NlcnRFcXVhbHMoMjAsIGFbMV0pOwotCQlhc3NlcnRFcXVhbHMoMTAsIGFbMl0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVEdXBsaWNhdGVFbGVtZW50c0xpc3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFN0cmluZ1ZlY3RvcjEoKTsKLQkJbGlzdC5hZGQoInplcm8iKTsKLQkJbGlzdC5hZGQoInplcm8iKTsKLQkJbGlzdC5hZGQoInR3byIpOwotCQlsaXN0LmFkZCgiemVybyIpOwotCQlsaXN0ID0gQ29sbGVjdGlvblRvb2xzLnJlbW92ZUR1cGxpY2F0ZUVsZW1lbnRzKGxpc3QpOwotCQlpbnQgaSA9IDA7Ci0JCWFzc2VydEVxdWFscygiemVybyIsIGxpc3QuZ2V0KGkrKykpOwotCQlhc3NlcnRFcXVhbHMoIm9uZSIsIGxpc3QuZ2V0KGkrKykpOwotCQlhc3NlcnRFcXVhbHMoInR3byIsIGxpc3QuZ2V0KGkrKykpOwotCQlhc3NlcnRFcXVhbHMoaSwgbGlzdC5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVEdXBsaWNhdGVFbGVtZW50c09iamVjdEFycmF5MSgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nVmVjdG9yMSgpOwotCQlsaXN0LmFkZCgiemVybyIpOwotCQlsaXN0LmFkZCgiemVybyIpOwotCQlsaXN0LmFkZCgidHdvIik7Ci0JCWxpc3QuYWRkKCJ6ZXJvIik7Ci0JCVN0cmluZ1tdIGFycmF5ID0gQ29sbGVjdGlvblRvb2xzLnJlbW92ZUR1cGxpY2F0ZUVsZW1lbnRzKGxpc3QudG9BcnJheShuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXSkpOwotCQlpbnQgaSA9IDA7Ci0JCWFzc2VydEVxdWFscygiemVybyIsIGFycmF5W2krK10pOwotCQlhc3NlcnRFcXVhbHMoIm9uZSIsIGFycmF5W2krK10pOwotCQlhc3NlcnRFcXVhbHMoInR3byIsIGFycmF5W2krK10pOwotCQlhc3NlcnRFcXVhbHMoaSwgYXJyYXkubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRHVwbGljYXRlRWxlbWVudHNPYmplY3RBcnJheTIoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFN0cmluZ1ZlY3RvcjEoKTsKLQkJbGlzdC5hZGQoInplcm8iKTsKLQkJbGlzdC5hZGQoInplcm8iKTsKLQkJbGlzdC5hZGQoInR3byIpOwotCQlsaXN0LmFkZCgiemVybyIpOwotCQlTdHJpbmdbXSBhcnJheSA9IENvbGxlY3Rpb25Ub29scy5yZW1vdmVEdXBsaWNhdGVFbGVtZW50cyhsaXN0LnRvQXJyYXkobmV3IFN0cmluZ1tsaXN0LnNpemUoKV0pKTsKLQkJaW50IGkgPSAwOwotCQlhc3NlcnRFcXVhbHMoInplcm8iLCBhcnJheVtpKytdKTsKLQkJYXNzZXJ0RXF1YWxzKCJvbmUiLCBhcnJheVtpKytdKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0d28iLCBhcnJheVtpKytdKTsKLQkJYXNzZXJ0RXF1YWxzKGksIGFycmF5Lmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZlY3Rvckl0ZXJhdG9yMSgpIHsKLQkJVmVjdG9yPFN0cmluZz4gdiA9IENvbGxlY3Rpb25Ub29scy52ZWN0b3IodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygzLCB2LnNpemUoKSk7Ci0JCWFzc2VydFRydWUodi5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWZWN0b3JJdGVyYXRvcjIoKSB7Ci0JCVZlY3RvcjxPYmplY3Q+IHYgPSBDb2xsZWN0aW9uVG9vbHMuPE9iamVjdD52ZWN0b3IodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygzLCB2LnNpemUoKSk7Ci0JCWFzc2VydFRydWUodi5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWZWN0b3JPYmplY3RBcnJheSgpIHsKLQkJVmVjdG9yPFN0cmluZz4gdiA9IENvbGxlY3Rpb25Ub29scy52ZWN0b3IodGhpcy5idWlsZFN0cmluZ0FycmF5MSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHYuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2LmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpKSk7Ci0JfQotCi0JcHJpdmF0ZSBPYmplY3RbXSBidWlsZE9iamVjdEFycmF5MSgpIHsKLQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7ICJ6ZXJvIiwgIm9uZSIsICJ0d28iIH07Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmdbXSBidWlsZFN0cmluZ0FycmF5MSgpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7ICJ6ZXJvIiwgIm9uZSIsICJ0d28iIH07Ci0JfQotCi0JcHJpdmF0ZSBjaGFyW10gYnVpbGRDaGFyQXJyYXkoKSB7Ci0JCXJldHVybiBuZXcgY2hhcltdIHsgJ2EnLCAnYicsICdjJyB9OwotCX0KLQotCXByaXZhdGUgaW50W10gYnVpbGRJbnRBcnJheSgpIHsKLQkJcmV0dXJuIG5ldyBpbnRbXSB7IDAsIDEwLCAyMCB9OwotCX0KLQotCXByaXZhdGUgT2JqZWN0W10gYnVpbGRPYmplY3RBcnJheTIoKSB7Ci0JCXJldHVybiBuZXcgT2JqZWN0W10geyAidGhyZWUiLCAiZm91ciIsICJmaXZlIiB9OwotCX0KLQotCXByaXZhdGUgU3RyaW5nW10gYnVpbGRTdHJpbmdBcnJheTIoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyAidGhyZWUiLCAiZm91ciIsICJmaXZlIiB9OwotCX0KLQotCXByaXZhdGUgVmVjdG9yPFN0cmluZz4gYnVpbGRTdHJpbmdWZWN0b3IxKCkgewotCQlWZWN0b3I8U3RyaW5nPiB2ID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7Ci0JCXRoaXMuYWRkVG9Db2xsZWN0aW9uMSh2KTsKLQkJcmV0dXJuIHY7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGRTdHJpbmdMaXN0MSgpIHsKLQkJTGlzdDxTdHJpbmc+IGwgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJdGhpcy5hZGRUb0NvbGxlY3Rpb24xKGwpOwotCQlyZXR1cm4gbDsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8T2JqZWN0PiBidWlsZE9iamVjdExpc3QxKCkgewotCQlMaXN0PE9iamVjdD4gbCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQl0aGlzLmFkZFRvQ29sbGVjdGlvbjEobCk7Ci0JCXJldHVybiBsOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRUb0NvbGxlY3Rpb24xKENvbGxlY3Rpb248PyBzdXBlciBTdHJpbmc+IGMpIHsKLQkJYy5hZGQoInplcm8iKTsKLQkJYy5hZGQoIm9uZSIpOwotCQljLmFkZCgidHdvIik7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGRTdHJpbmdMaXN0MigpIHsKLQkJTGlzdDxTdHJpbmc+IGwgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJdGhpcy5hZGRUb0NvbGxlY3Rpb24yKGwpOwotCQlyZXR1cm4gbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkVG9Db2xsZWN0aW9uMihDb2xsZWN0aW9uPD8gc3VwZXIgU3RyaW5nPiBjKSB7Ci0JCWMuYWRkKCJ0aHJlZSIpOwotCQljLmFkZCgiZm91ciIpOwotCQljLmFkZCgiZml2ZSIpOwotCX0KLQotCXByaXZhdGUgU2V0PFN0cmluZz4gYnVpbGRTdHJpbmdTZXQxKCkgewotCQlTZXQ8U3RyaW5nPiBzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCQl0aGlzLmFkZFRvQ29sbGVjdGlvbjEocyk7Ci0JCXJldHVybiBzOwotCX0KLQotCXByaXZhdGUgU2V0PE9iamVjdD4gYnVpbGRPYmplY3RTZXQxKCkgewotCQlTZXQ8T2JqZWN0PiBzID0gbmV3IEhhc2hTZXQ8T2JqZWN0PigpOwotCQl0aGlzLmFkZFRvQ29sbGVjdGlvbjEocyk7Ci0JCXJldHVybiBzOwotCX0KLQotCXByaXZhdGUgU29ydGVkU2V0PFN0cmluZz4gYnVpbGRTb3J0ZWRTdHJpbmdTZXQxKCkgewotCQlTb3J0ZWRTZXQ8U3RyaW5nPiBzID0gbmV3IFRyZWVTZXQ8U3RyaW5nPigpOwotCQl0aGlzLmFkZFRvQ29sbGVjdGlvbjEocyk7Ci0JCXJldHVybiBzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9GaWxlVG9vbHNUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9GaWxlVG9vbHNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGNjY2YwLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvRmlsZVRvb2xzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUZpbHRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5DbGFzc1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5GaWxlVG9vbHM7Ci0KLXB1YmxpYyBjbGFzcyBGaWxlVG9vbHNUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIEZpbGUgdGVtcERpcjsKLQotCXB1YmxpYyBGaWxlVG9vbHNUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnRlbXBEaXIgPSB0aGlzLmJ1aWxkVGVtcERpcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JCXRoaXMuZGVsZXRlRGlyKHRoaXMudGVtcERpcik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpbGVzSW4oKSB7Ci0JCUNvbGxlY3Rpb248RmlsZT4gZmlsZXMgPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihGaWxlVG9vbHMuZmlsZXNJbih0aGlzLnRlbXBEaXIuZ2V0UGF0aCgpKSk7Ci0JCWFzc2VydEVxdWFscygiaW52YWxpZCBmaWxlIGNvdW50IiwgMywgZmlsZXMuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGlyZWN0b3JpZXNJbigpIHsKLQkJQ29sbGVjdGlvbjxGaWxlPiBmaWxlcyA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKEZpbGVUb29scy5kaXJlY3Rvcmllc0luKHRoaXMudGVtcERpci5nZXRQYXRoKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnZhbGlkIGRpcmVjdG9yeSBjb3VudCIsIDIsIGZpbGVzLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpbGVzSW5UcmVlKCkgewotCQlDb2xsZWN0aW9uPEZpbGU+IGZpbGVzID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oRmlsZVRvb2xzLmZpbGVzSW5UcmVlKHRoaXMudGVtcERpci5nZXRQYXRoKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnZhbGlkIGZpbGUgY291bnQiLCA5LCBmaWxlcy5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaXJlY3Rvcmllc0luVHJlZSgpIHsKLQkJQ29sbGVjdGlvbjxGaWxlPiBmaWxlcyA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKEZpbGVUb29scy5kaXJlY3Rvcmllc0luVHJlZSh0aGlzLnRlbXBEaXIuZ2V0UGF0aCgpKSk7Ci0JCWFzc2VydEVxdWFscygiaW52YWxpZCBkaXJlY3RvcnkgY291bnQiLCAzLCBmaWxlcy5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZWxldGVEaXJlY3RvcnkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBidWlsZCBhbm90aGVyIHRlbXBvcmFyeSBkaXJlY3RvcnkganVzdCBmb3IgdGhpcyB0ZXN0Ci0JCUZpbGUgZGlyID0gdGhpcy5idWlsZFRlbXBEaXIoKTsKLQkJYXNzZXJ0VHJ1ZSgidGVtcG9yYXJ5IGRpcmVjdG9yeSBub3QgY3JlYXRlZCIsIGRpci5leGlzdHMoKSk7Ci0JCUZpbGVUb29scy5kZWxldGVEaXJlY3RvcnkoZGlyLmdldFBhdGgoKSk7Ci0JCWFzc2VydEZhbHNlKCJ0ZW1wb3JhcnkgZGlyZWN0b3J5IG5vdCBkZWxldGVkIiwgZGlyLmV4aXN0cygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVsZXRlRGlyZWN0b3J5Q29udGVudHMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBidWlsZCBhbm90aGVyIHRlbXBvcmFyeSBkaXJlY3RvcnkganVzdCBmb3IgdGhpcyB0ZXN0Ci0JCUZpbGUgZGlyID0gdGhpcy5idWlsZFRlbXBEaXIoKTsKLQkJYXNzZXJ0VHJ1ZSgidGVtcG9yYXJ5IGRpcmVjdG9yeSBub3QgY3JlYXRlZCIsIGRpci5leGlzdHMoKSk7Ci0JCUZpbGVUb29scy5kZWxldGVEaXJlY3RvcnlDb250ZW50cyhkaXIuZ2V0UGF0aCgpKTsKLQkJYXNzZXJ0VHJ1ZSgidGVtcG9yYXJ5IGRpcmVjdG9yeSBzaG91bGQgbm90IGhhdmUgYmVlbiBkZWxldGVkIiwgZGlyLmV4aXN0cygpKTsKLQkJYXNzZXJ0VHJ1ZSgidGVtcG9yYXJ5IGRpcmVjdG9yeSBjb250ZW50cyBub3QgZGVsZXRlZCIsIGRpci5saXN0RmlsZXMoKS5sZW5ndGggPT0gMCk7Ci0JCWRpci5kZWxldGUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29weVRvRmlsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUZpbGUgZGVzdEZpbGUgPSBuZXcgRmlsZSh0aGlzLnRlbXBEaXIsICJkZXN0ZmlsZS50eHQiKTsKLQkJdGhpcy5jb3B5VG9GaWxlKGRlc3RGaWxlLCAidGVzdENvcHlUb0ZpbGUiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29weVRvUHJlRXhpc3RpbmdGaWxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRmlsZSBkZXN0RmlsZSA9IG5ldyBGaWxlKHRoaXMudGVtcERpciwgImRlc3RmaWxlLnR4dCIpOwotCQlXcml0ZXIgd3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihuZXcgRmlsZU91dHB1dFN0cmVhbShkZXN0RmlsZSkpOwotCQl3cml0ZXIud3JpdGUoInRoaXMgdGV4dCBzaG91bGQgYmUgcmVwbGFjZWQuLi4iKTsKLQkJd3JpdGVyLmNsb3NlKCk7Ci0JCXRoaXMuY29weVRvRmlsZShkZXN0RmlsZSwgInRlc3RDb3B5VG9QcmVFeGlzdGluZ0ZpbGUiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY29weVRvRmlsZShGaWxlIGRlc3RGaWxlLCBTdHJpbmcgd3JpdGVTdHJpbmcpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUZpbGUgc291cmNlRmlsZSA9IG5ldyBGaWxlKHRoaXMudGVtcERpciwgInNvdXJjZWZpbGUudHh0Iik7Ci0JCWNoYXJbXSByZWFkQnVmZmVyID0gbmV3IGNoYXJbd3JpdGVTdHJpbmcubGVuZ3RoKCldOwotCi0JCVdyaXRlciB3cml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG5ldyBGaWxlT3V0cHV0U3RyZWFtKHNvdXJjZUZpbGUpKTsKLQkJd3JpdGVyLndyaXRlKHdyaXRlU3RyaW5nKTsKLQkJd3JpdGVyLmNsb3NlKCk7Ci0KLQkJRmlsZVRvb2xzLmNvcHlUb0ZpbGUoc291cmNlRmlsZSwgZGVzdEZpbGUpOwotCi0JCVJlYWRlciByZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIobmV3IEZpbGVJbnB1dFN0cmVhbShkZXN0RmlsZSkpOwotCQlyZWFkZXIucmVhZChyZWFkQnVmZmVyKTsKLQkJcmVhZGVyLmNsb3NlKCk7Ci0JCVN0cmluZyByZWFkU3RyaW5nID0gbmV3IFN0cmluZyhyZWFkQnVmZmVyKTsKLQkJYXNzZXJ0RXF1YWxzKHdyaXRlU3RyaW5nLCByZWFkU3RyaW5nKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29weVRvRGlyZWN0b3J5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRmlsZSBzb3VyY2VGaWxlID0gbmV3IEZpbGUodGhpcy50ZW1wRGlyLCAic291cmNlZmlsZS50eHQiKTsKLQkJU3RyaW5nIHdyaXRlU3RyaW5nID0gInRlc3RDb3B5VG9EaXJlY3RvcnkiOwotCi0JCUZpbGUgZGVzdERpciA9IG5ldyBGaWxlKHRoaXMudGVtcERpciwgImRlc3RkaXIiKTsKLQkJZGVzdERpci5ta2RpcigpOwotCQlGaWxlIGRlc3RGaWxlID0gbmV3IEZpbGUoZGVzdERpciwgInNvdXJjZWZpbGUudHh0Iik7Ci0JCWNoYXJbXSByZWFkQnVmZmVyID0gbmV3IGNoYXJbd3JpdGVTdHJpbmcubGVuZ3RoKCldOwotCi0JCVdyaXRlciB3cml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG5ldyBGaWxlT3V0cHV0U3RyZWFtKHNvdXJjZUZpbGUpKTsKLQkJd3JpdGVyLndyaXRlKHdyaXRlU3RyaW5nKTsKLQkJd3JpdGVyLmNsb3NlKCk7Ci0KLQkJRmlsZVRvb2xzLmNvcHlUb0RpcmVjdG9yeShzb3VyY2VGaWxlLCBkZXN0RGlyKTsKLQotCQlSZWFkZXIgcmVhZGVyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKG5ldyBGaWxlSW5wdXRTdHJlYW0oZGVzdEZpbGUpKTsKLQkJcmVhZGVyLnJlYWQocmVhZEJ1ZmZlcik7Ci0JCXJlYWRlci5jbG9zZSgpOwotCQlTdHJpbmcgcmVhZFN0cmluZyA9IG5ldyBTdHJpbmcocmVhZEJ1ZmZlcik7Ci0JCWFzc2VydEVxdWFscyh3cml0ZVN0cmluZywgcmVhZFN0cmluZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpbHRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVN0cmluZyBwcmVmaXggPSAiWFhYdGVzdEZpbGVYWFgiOwotCQlGaWxlIHRlc3RGaWxlMSA9IG5ldyBGaWxlKHRoaXMudGVtcERpciwgcHJlZml4ICsgIjEiKTsKLQkJdGVzdEZpbGUxLmNyZWF0ZU5ld0ZpbGUoKTsKLQkJRmlsZSB0ZXN0RmlsZTIgPSBuZXcgRmlsZSh0aGlzLnRlbXBEaXIsIHByZWZpeCArICIyIik7Ci0JCXRlc3RGaWxlMi5jcmVhdGVOZXdGaWxlKCk7Ci0KLQkJRmlsZUZpbHRlciBmaWx0ZXIgPSB0aGlzLmJ1aWxkRmlsZUZpbHRlcihwcmVmaXgpOwotCQlJdGVyYXRvcjxGaWxlPiBmaWx0ZXJlZEZpbGVzSXRlcmF0b3IgPSBGaWxlVG9vbHMuZmlsdGVyKEZpbGVUb29scy5maWxlc0luKHRoaXMudGVtcERpciksIGZpbHRlcik7Ci0JCUNvbGxlY3Rpb248RmlsZT4gZmlsdGVyZWRGaWxlcyA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKGZpbHRlcmVkRmlsZXNJdGVyYXRvcik7Ci0JCWFzc2VydEVxdWFscygyLCBmaWx0ZXJlZEZpbGVzLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoZmlsdGVyZWRGaWxlcy5jb250YWlucyh0ZXN0RmlsZTEpKTsKLQkJYXNzZXJ0VHJ1ZShmaWx0ZXJlZEZpbGVzLmNvbnRhaW5zKHRlc3RGaWxlMikpOwotCX0KLQotCXByaXZhdGUgRmlsZUZpbHRlciBidWlsZEZpbGVGaWx0ZXIoZmluYWwgU3RyaW5nIHByZWZpeCkgewotCQlyZXR1cm4gbmV3IEZpbGVGaWx0ZXIoKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBmaWxlKSB7Ci0JCQkJcmV0dXJuIGZpbGUuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgocHJlZml4KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaXBFeHRlbnNpb24oKSB7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgRmlsZVRvb2xzLnN0cmlwRXh0ZW5zaW9uKCJmb28ueG1sIikpOwotCQlhc3NlcnRFcXVhbHMoImZvby5iYXIiLCBGaWxlVG9vbHMuc3RyaXBFeHRlbnNpb24oImZvby5iYXIueG1sIikpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIEZpbGVUb29scy5zdHJpcEV4dGVuc2lvbigiZm9vIikpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIEZpbGVUb29scy5zdHJpcEV4dGVuc2lvbigiZm9vLiIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXh0ZW5zaW9uKCkgewotCQlhc3NlcnRFcXVhbHMoIi54bWwiLCBGaWxlVG9vbHMuZXh0ZW5zaW9uKCJmb28ueG1sIikpOwotCQlhc3NlcnRFcXVhbHMoIi54bWwiLCBGaWxlVG9vbHMuZXh0ZW5zaW9uKCJmb28uYmFyLnhtbCIpKTsKLQkJYXNzZXJ0RXF1YWxzKCIiLCBGaWxlVG9vbHMuZXh0ZW5zaW9uKCJmb28iKSk7Ci0JCWFzc2VydEVxdWFscygiIiwgRmlsZVRvb2xzLmV4dGVuc2lvbigiZm9vLHhtbCIpKTsKLQkJYXNzZXJ0RXF1YWxzKCIuIiwgRmlsZVRvb2xzLmV4dGVuc2lvbigiZm9vLiIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW1wdHlUZW1wb3JhcnlEaXJlY3RvcnkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlGaWxlIHRlbXBEaXIxID0gRmlsZVRvb2xzLnRlbXBvcmFyeURpcmVjdG9yeSgpOwotCQlGaWxlIHRlc3RGaWxlMSA9IG5ldyBGaWxlKHRlbXBEaXIxLCAianVuayIpOwotCQl0ZXN0RmlsZTEuY3JlYXRlTmV3RmlsZSgpOwotCi0JCUZpbGUgdGVtcERpcjIgPSBGaWxlVG9vbHMuZW1wdHlUZW1wb3JhcnlEaXJlY3RvcnkoKTsKLQkJYXNzZXJ0RXF1YWxzKHRlbXBEaXIxLCB0ZW1wRGlyMik7Ci0JCWFzc2VydFRydWUodGVtcERpcjIuaXNEaXJlY3RvcnkoKSk7Ci0JCWFzc2VydEVxdWFscygwLCB0ZW1wRGlyMi5saXN0RmlsZXMoKS5sZW5ndGgpOwotCQl0ZW1wRGlyMi5kZWxldGUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2Fub25pY2FsRmlsZU5hbWUoKSB7Ci0JCUZpbGUgZmlsZTEgPSBuZXcgRmlsZSgiZm9vIik7Ci0JCWZpbGUxID0gbmV3IEZpbGUoZmlsZTEsICJiYXIiKTsKLQkJZmlsZTEgPSBuZXcgRmlsZShmaWxlMSwgImJheiIpOwotCQlmaWxlMSA9IG5ldyBGaWxlKGZpbGUxLCAiLi4iKTsKLQkJZmlsZTEgPSBuZXcgRmlsZShmaWxlMSwgIi4uIik7Ci0JCWZpbGUxID0gbmV3IEZpbGUoZmlsZTEsICJiYXIiKTsKLQkJZmlsZTEgPSBuZXcgRmlsZShmaWxlMSwgImJheiIpOwotCQlGaWxlIGZpbGUyID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpKTsKLQkJZmlsZTIgPSBuZXcgRmlsZShmaWxlMiwgImZvbyIpOwotCQlmaWxlMiA9IG5ldyBGaWxlKGZpbGUyLCAiYmFyIik7Ci0JCWZpbGUyID0gbmV3IEZpbGUoZmlsZTIsICJiYXoiKTsKLQkJRmlsZSBmaWxlMyA9IEZpbGVUb29scy5jYW5vbmljYWxGaWxlKGZpbGUxKTsKLQkJYXNzZXJ0RXF1YWxzKGZpbGUyLCBmaWxlMyk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRXhlY3V0aW5nT25XaW5kb3dzKCkgewotCQlyZXR1cm4gdGhpcy5pc0V4ZWN1dGluZ09uKCJXaW5kb3dzIik7Ci0JfQotCi0JLy8JcHJpdmF0ZSBib29sZWFuIGlzRXhlY3V0aW5nT25MaW51eCgpIHsKLQkvLwkJcmV0dXJuIHRoaXMuaXNFeGVjdXRpbmdPbigiTGludXgiKTsKLQkvLwl9Ci0JLy8KLQlwcml2YXRlIGJvb2xlYW4gaXNFeGVjdXRpbmdPbihTdHJpbmcgb3NOYW1lKSB7Ci0JCXJldHVybiBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKS5pbmRleE9mKG9zTmFtZSkgIT0gLTE7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFBhdGhGaWxlcygpIHsKLQkJRmlsZVtdIGV4cGVjdGVkOwotCQlGaWxlW10gYWN0dWFsOwotCi0JCWlmICh0aGlzLmlzRXhlY3V0aW5nT25XaW5kb3dzKCkpIHsKLQkJCWV4cGVjdGVkID0gbmV3IEZpbGVbXSB7IG5ldyBGaWxlKCJDOi8iKSwgbmV3IEZpbGUoIkM6L2ZvbyIpLCBuZXcgRmlsZSgiQzovZm9vL2JhciIpLCBuZXcgRmlsZSgiQzovZm9vL2Jhci9iYXoudHh0IikgfTsKLQkJCWFjdHVhbCA9IHRoaXMucGF0aEZpbGVzKG5ldyBGaWxlKCJDOi9mb28vYmFyL2Jhei50eHQiKSk7Ci0JCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCkpOwotCQl9Ci0KLQkJZXhwZWN0ZWQgPSBuZXcgRmlsZVtdIHsgbmV3IEZpbGUoIi8iKSwgbmV3IEZpbGUoIi9mb28iKSwgbmV3IEZpbGUoIi9mb28vYmFyIiksIG5ldyBGaWxlKCIvZm9vL2Jhci9iYXoudHh0IikgfTsKLQkJYWN0dWFsID0gdGhpcy5wYXRoRmlsZXMobmV3IEZpbGUoIi9mb28vYmFyL2Jhei50eHQiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgYWN0dWFsKSk7Ci0KLQkJZXhwZWN0ZWQgPSBuZXcgRmlsZVtdIHsgbmV3IEZpbGUoImZvbyIpLCBuZXcgRmlsZSgiZm9vL2JhciIpLCBuZXcgRmlsZSgiZm9vL2Jhci9iYXoudHh0IikgfTsKLQkJYWN0dWFsID0gdGhpcy5wYXRoRmlsZXMobmV3IEZpbGUoImZvby9iYXIvYmF6LnR4dCIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpKTsKLQotCQlleHBlY3RlZCA9IG5ldyBGaWxlW10geyBuZXcgRmlsZSgiLi4iKSwgbmV3IEZpbGUoIi4uL2ZvbyIpLCBuZXcgRmlsZSgiLi4vZm9vL2JhciIpLCBuZXcgRmlsZSgiLi4vZm9vL2Jhci9iYXoudHh0IikgfTsKLQkJYWN0dWFsID0gdGhpcy5wYXRoRmlsZXMobmV3IEZpbGUoIi4uL2Zvby9iYXIvYmF6LnR4dCIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpKTsKLQotCQlleHBlY3RlZCA9IG5ldyBGaWxlW10geyBuZXcgRmlsZSgiLiIpLCBuZXcgRmlsZSgiLi9mb28iKSwgbmV3IEZpbGUoIi4vZm9vL2JhciIpLCBuZXcgRmlsZSgiLi9mb28vYmFyL2Jhei50eHQiKSB9OwotCQlhY3R1YWwgPSB0aGlzLnBhdGhGaWxlcyhuZXcgRmlsZSgiLi9mb28vYmFyL2Jhei50eHQiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgYWN0dWFsKSk7Ci0JfQotCi0JcHJpdmF0ZSBGaWxlW10gcGF0aEZpbGVzKEZpbGUgZmlsZSkgewotCQlyZXR1cm4gKEZpbGVbXSkgQ2xhc3NUb29scy5leGVjdXRlU3RhdGljTWV0aG9kKEZpbGVUb29scy5jbGFzcywgInBhdGhGaWxlcyIsIEZpbGUuY2xhc3MsIGZpbGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZWxhdGl2ZVBhcmVudEZpbGUoKSB7Ci0JCWFzc2VydEVxdWFscyhuZXcgRmlsZSgiLi4iKSwgdGhpcy5yZWxhdGl2ZVBhcmVudEZpbGUoMSkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUoIi4uLy4uIiksIHRoaXMucmVsYXRpdmVQYXJlbnRGaWxlKDIpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKCIuLi8uLi8uLiIpLCB0aGlzLnJlbGF0aXZlUGFyZW50RmlsZSgzKSk7Ci0KLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJRmlsZSBmaWxlID0gdGhpcy5yZWxhdGl2ZVBhcmVudEZpbGUoMCk7Ci0JCQlmYWlsKCJpbnZhbGlkIHJldHVybjogIiArIGZpbGUpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0JCQlpZiAoZXguZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pIHsKLQkJCQlJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGl0ZSA9IChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKSBleC5nZXRDYXVzZSgpOwotCQkJCWlmIChpdGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgaW5zdGFuY2VvZiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24pIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwcml2YXRlIEZpbGUgcmVsYXRpdmVQYXJlbnRGaWxlKGludCBsZW4pIHsKLQkJcmV0dXJuIChGaWxlKSBDbGFzc1Rvb2xzLmV4ZWN1dGVTdGF0aWNNZXRob2QoRmlsZVRvb2xzLmNsYXNzLCAicmVsYXRpdmVQYXJlbnRGaWxlIiwgaW50LmNsYXNzLCBuZXcgSW50ZWdlcihsZW4pKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFRvUmVsYXRpdmVGaWxlKCkgewotCQlTdHJpbmcgcHJlZml4ID0gdGhpcy5pc0V4ZWN1dGluZ09uV2luZG93cygpID8gIkM6IiA6ICIiOwotCQlGaWxlIGZpbGU7Ci0JCUZpbGUgZGlyOwotCQlGaWxlIHJlbGF0aXZlRmlsZTsKLQotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uV2luZG93cygpKSB7Ci0JCQkvLyBvbiBXaW5kb3dzLCBhIGRyaXZlIG11c3QgYmUgc3BlY2lmaWVkIGZvciBhIGZpbGUgdG8gYmUgYWJzb2x1dGUgKGkuZS4gbm90IHJlbGF0aXZlKQotCQkJdGhpcy52ZXJpZnlVbmNoYW5nZWRSZWxhdGl2ZUZpbGUoIi9kaXIxL2RpcjIvZmlsZS50eHQiLCAiQzovZGlyMS9kaXIyIik7Ci0JCQkvLyBkaWZmZXJlbnQgZHJpdmVzCi0JCQl0aGlzLnZlcmlmeVVuY2hhbmdlZFJlbGF0aXZlRmlsZSgiRDovZGlyMS9kaXIyL2ZpbGUudHh0IiwgIkM6L2RpcjEvZGlyMiIpOwotCQl9Ci0JCXRoaXMudmVyaWZ5VW5jaGFuZ2VkUmVsYXRpdmVGaWxlKCJkaXIxL2RpcjIvZmlsZS50eHQiLCBwcmVmaXggKyAiL2RpcjEvZGlyMiIpOwotCQl0aGlzLnZlcmlmeVVuY2hhbmdlZFJlbGF0aXZlRmlsZSgiLi9kaXIxL2RpcjIvZmlsZS50eHQiLCBwcmVmaXggKyAiL2RpcjEvZGlyMiIpOwotCQl0aGlzLnZlcmlmeVVuY2hhbmdlZFJlbGF0aXZlRmlsZSgiLi4vLi4vZGlyMS9kaXIyL2ZpbGUudHh0IiwgcHJlZml4ICsgIi9kaXIxL2RpcjIiKTsKLQotCQlmaWxlID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIiKTsKLQkJZGlyID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIiKTsKLQkJcmVsYXRpdmVGaWxlID0gRmlsZVRvb2xzLmNvbnZlcnRUb1JlbGF0aXZlRmlsZShmaWxlLCBkaXIpOwotCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUoIi4iKSwgcmVsYXRpdmVGaWxlKTsKLQotCQlmaWxlID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvZmlsZS50eHQiKTsKLQkJZGlyID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIiKTsKLQkJcmVsYXRpdmVGaWxlID0gRmlsZVRvb2xzLmNvbnZlcnRUb1JlbGF0aXZlRmlsZShmaWxlLCBkaXIpOwotCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUoImZpbGUudHh0IiksIHJlbGF0aXZlRmlsZSk7Ci0KLQkJZmlsZSA9IG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyLy4uL2RpcjIvZmlsZS50eHQiKTsKLQkJZGlyID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIiKTsKLQkJcmVsYXRpdmVGaWxlID0gRmlsZVRvb2xzLmNvbnZlcnRUb1JlbGF0aXZlRmlsZShmaWxlLCBkaXIpOwotCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUoImZpbGUudHh0IiksIHJlbGF0aXZlRmlsZSk7Ci0KLQkJZmlsZSA9IG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyL2RpcjMvZGlyNC9kaXI1L2ZpbGUudHh0Iik7Ci0JCWRpciA9IG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyIik7Ci0JCXJlbGF0aXZlRmlsZSA9IEZpbGVUb29scy5jb252ZXJ0VG9SZWxhdGl2ZUZpbGUoZmlsZSwgZGlyKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKCJkaXIzL2RpcjQvZGlyNS9maWxlLnR4dCIpLCByZWxhdGl2ZUZpbGUpOwotCi0JCWZpbGUgPSBuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMi9maWxlLnR4dCIpOwotCQlkaXIgPSBuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMi9kaXIzL2RpcjQvZGlyNSIpOwotCQlyZWxhdGl2ZUZpbGUgPSBGaWxlVG9vbHMuY29udmVydFRvUmVsYXRpdmVGaWxlKGZpbGUsIGRpcik7Ci0JCWFzc2VydEVxdWFscyhuZXcgRmlsZSgiLi4vLi4vLi4vZmlsZS50eHQiKSwgcmVsYXRpdmVGaWxlKTsKLQotCQlmaWxlID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvZmlsZS50eHQiKTsKLQkJZGlyID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvZGlyMyIpOwotCQlyZWxhdGl2ZUZpbGUgPSBGaWxlVG9vbHMuY29udmVydFRvUmVsYXRpdmVGaWxlKGZpbGUsIGRpcik7Ci0JCWFzc2VydEVxdWFscyhuZXcgRmlsZSgiLi4vZmlsZS50eHQiKSwgcmVsYXRpdmVGaWxlKTsKLQotCQlmaWxlID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvZGlyQS9kaXJCL2RpckMvZmlsZS50eHQiKTsKLQkJZGlyID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvZGlyMy9kaXI0L2RpcjUiKTsKLQkJcmVsYXRpdmVGaWxlID0gRmlsZVRvb2xzLmNvbnZlcnRUb1JlbGF0aXZlRmlsZShmaWxlLCBkaXIpOwotCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUoIi4uLy4uLy4uL2RpckEvZGlyQi9kaXJDL2ZpbGUudHh0IiksIHJlbGF0aXZlRmlsZSk7Ci0KLQkJZmlsZSA9IG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyIik7Ci0JCWRpciA9IG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyL2RpcjMvZGlyNC9kaXI1Iik7Ci0JCXJlbGF0aXZlRmlsZSA9IEZpbGVUb29scy5jb252ZXJ0VG9SZWxhdGl2ZUZpbGUoZmlsZSwgZGlyKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKCIuLi8uLi8uLiIpLCByZWxhdGl2ZUZpbGUpOwotCi0JCWZpbGUgPSBuZXcgRmlsZShwcmVmaXggKyAiL015IERvY3VtZW50cy9NeSBXb3Jrc3BhY2UvUHJvamVjdCAxL2xpYi90b3BsaW5rLmphciIpOwotCQlkaXIgPSBuZXcgRmlsZShwcmVmaXggKyAiL015IERvY3VtZW50cy9NeSBXb3Jrc3BhY2UvUHJvamVjdCAxIik7Ci0JCXJlbGF0aXZlRmlsZSA9IEZpbGVUb29scy5jb252ZXJ0VG9SZWxhdGl2ZUZpbGUoZmlsZSwgZGlyKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKCJsaWIvdG9wbGluay5qYXIiKSwgcmVsYXRpdmVGaWxlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5VW5jaGFuZ2VkUmVsYXRpdmVGaWxlKFN0cmluZyBmaWxlTmFtZSwgU3RyaW5nIGRpck5hbWUpIHsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZmlsZU5hbWUpOwotCQlGaWxlIGRpciA9IG5ldyBGaWxlKGRpck5hbWUpOwotCQlGaWxlIHJlbGF0aXZlRmlsZSA9IEZpbGVUb29scy5jb252ZXJ0VG9SZWxhdGl2ZUZpbGUoZmlsZSwgZGlyKTsKLQkJYXNzZXJ0RXF1YWxzKGZpbGUsIHJlbGF0aXZlRmlsZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRUb0Fic29sdXRlRmlsZSgpIHsKLQkJU3RyaW5nIHByZWZpeCA9IHRoaXMuaXNFeGVjdXRpbmdPbldpbmRvd3MoKSA/ICJDOiIgOiAiIjsKLQkJRmlsZSBmaWxlOwotCQlGaWxlIGRpcjsKLQkJRmlsZSBhYnNvbHV0ZUZpbGU7Ci0KLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdPbldpbmRvd3MoKSkgewotCQkJLy8gb24gV2luZG93cywgYSBkcml2ZSBtdXN0IGJlIHNwZWNpZmllZCBmb3IgYSBmaWxlIHRvIGJlIGFic29sdXRlIChpLmUuIG5vdCByZWxhdGl2ZSkKLQkJCXRoaXMudmVyaWZ5VW5jaGFuZ2VkQWJzb2x1dGVGaWxlKCJDOi9kaXIxL2RpcjIvZmlsZS50eHQiLCAiQzovZGlyMS9kaXIyIik7Ci0JCQkvLyBkaWZmZXJlbnQgZHJpdmVzCi0JCQl0aGlzLnZlcmlmeVVuY2hhbmdlZEFic29sdXRlRmlsZSgiRDovZGlyMS9kaXIyL2ZpbGUudHh0IiwgIkM6L2RpcjEvZGlyMiIpOwotCQl9Ci0JCXRoaXMudmVyaWZ5VW5jaGFuZ2VkQWJzb2x1dGVGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyL2ZpbGUudHh0IiwgcHJlZml4ICsgIi9kaXIxL2RpcjIiKTsKLQkJdGhpcy52ZXJpZnlVbmNoYW5nZWRBYnNvbHV0ZUZpbGUocHJlZml4ICsgIi8uL2RpcjEvZGlyMi9maWxlLnR4dCIsIHByZWZpeCArICIvZGlyMS9kaXIyIik7Ci0JCXRoaXMudmVyaWZ5VW5jaGFuZ2VkQWJzb2x1dGVGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyLy4uLy4uL2RpcjEvZGlyMi9maWxlLnR4dCIsIHByZWZpeCArICIvZGlyMS9kaXIyIik7Ci0KLQkJZmlsZSA9IG5ldyBGaWxlKCIuIik7Ci0JCWRpciA9IG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyIik7Ci0JCWFic29sdXRlRmlsZSA9IEZpbGVUb29scy5jb252ZXJ0VG9BYnNvbHV0ZUZpbGUoZmlsZSwgZGlyKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyIiksIGFic29sdXRlRmlsZSk7Ci0KLQkJZmlsZSA9IG5ldyBGaWxlKCIuL2ZpbGUudHh0Iik7Ci0JCWRpciA9IG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyIik7Ci0JCWFic29sdXRlRmlsZSA9IEZpbGVUb29scy5jb252ZXJ0VG9BYnNvbHV0ZUZpbGUoZmlsZSwgZGlyKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyL2ZpbGUudHh0IiksIGFic29sdXRlRmlsZSk7Ci0KLQkJZmlsZSA9IG5ldyBGaWxlKCJmaWxlLnR4dCIpOwotCQlkaXIgPSBuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMiIpOwotCQlhYnNvbHV0ZUZpbGUgPSBGaWxlVG9vbHMuY29udmVydFRvQWJzb2x1dGVGaWxlKGZpbGUsIGRpcik7Ci0JCWFzc2VydEVxdWFscyhuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMi9maWxlLnR4dCIpLCBhYnNvbHV0ZUZpbGUpOwotCi0JCWZpbGUgPSBuZXcgRmlsZSgiLi4vZGlyMi9maWxlLnR4dCIpOwotCQlkaXIgPSBuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMiIpOwotCQlhYnNvbHV0ZUZpbGUgPSBGaWxlVG9vbHMuY29udmVydFRvQWJzb2x1dGVGaWxlKGZpbGUsIGRpcik7Ci0JCWFzc2VydEVxdWFscyhuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMi9maWxlLnR4dCIpLCBhYnNvbHV0ZUZpbGUpOwotCi0JCWZpbGUgPSBuZXcgRmlsZSgiZGlyMy9kaXI0L2RpcjUvZmlsZS50eHQiKTsKLQkJZGlyID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIiKTsKLQkJYWJzb2x1dGVGaWxlID0gRmlsZVRvb2xzLmNvbnZlcnRUb0Fic29sdXRlRmlsZShmaWxlLCBkaXIpOwotCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvZGlyMy9kaXI0L2RpcjUvZmlsZS50eHQiKSwgYWJzb2x1dGVGaWxlKTsKLQotCQlmaWxlID0gbmV3IEZpbGUoIi4uLy4uLy4uL2ZpbGUudHh0Iik7Ci0JCWRpciA9IG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyL2RpcjMvZGlyNC9kaXI1Iik7Ci0JCWFic29sdXRlRmlsZSA9IEZpbGVUb29scy5jb252ZXJ0VG9BYnNvbHV0ZUZpbGUoZmlsZSwgZGlyKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyL2ZpbGUudHh0IiksIGFic29sdXRlRmlsZSk7Ci0KLQkJLy8gdG9vIG1hbnkgIi4uIiBkaXJlY3RvcmllcyB3aWxsIHJlc29sdmUgdG8gdGhlIHJvb3Q7Ci0JCS8vIHRoaXMgaXMgY29uc2lzdGVudCB3aXRoIFdpbmRvd3MgYW5kIExpbnV4IGNvbW1hbmQgc2hlbGxzCi0JCWZpbGUgPSBuZXcgRmlsZSgiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZmlsZS50eHQiKTsKLQkJZGlyID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIiKTsKLQkJYWJzb2x1dGVGaWxlID0gRmlsZVRvb2xzLmNvbnZlcnRUb0Fic29sdXRlRmlsZShmaWxlLCBkaXIpOwotCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUocHJlZml4ICsgIi9maWxlLnR4dCIpLCBhYnNvbHV0ZUZpbGUpOwotCi0JCWZpbGUgPSBuZXcgRmlsZSgiLi4vZmlsZS50eHQiKTsKLQkJZGlyID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvZGlyMyIpOwotCQlhYnNvbHV0ZUZpbGUgPSBGaWxlVG9vbHMuY29udmVydFRvQWJzb2x1dGVGaWxlKGZpbGUsIGRpcik7Ci0JCWFzc2VydEVxdWFscyhuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMi9maWxlLnR4dCIpLCBhYnNvbHV0ZUZpbGUpOwotCi0JCWZpbGUgPSBuZXcgRmlsZSgiLi4vLi4vLi4vZGlyQS9kaXJCL2RpckMvZmlsZS50eHQiKTsKLQkJZGlyID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvZGlyMy9kaXI0L2RpcjUiKTsKLQkJYWJzb2x1dGVGaWxlID0gRmlsZVRvb2xzLmNvbnZlcnRUb0Fic29sdXRlRmlsZShmaWxlLCBkaXIpOwotCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvZGlyQS9kaXJCL2RpckMvZmlsZS50eHQiKSwgYWJzb2x1dGVGaWxlKTsKLQotCQlmaWxlID0gbmV3IEZpbGUoIi4uLy4uLy4uIik7Ci0JCWRpciA9IG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyL2RpcjMvZGlyNC9kaXI1Iik7Ci0JCWFic29sdXRlRmlsZSA9IEZpbGVUb29scy5jb252ZXJ0VG9BYnNvbHV0ZUZpbGUoZmlsZSwgZGlyKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyIiksIGFic29sdXRlRmlsZSk7Ci0KLQkJZmlsZSA9IG5ldyBGaWxlKCJsaWIvdG9wbGluay5qYXIiKTsKLQkJZGlyID0gbmV3IEZpbGUocHJlZml4ICsgIi9NeSBEb2N1bWVudHMvTXkgV29ya3NwYWNlL1Byb2plY3QgMSIpOwotCQlhYnNvbHV0ZUZpbGUgPSBGaWxlVG9vbHMuY29udmVydFRvQWJzb2x1dGVGaWxlKGZpbGUsIGRpcik7Ci0JCWFzc2VydEVxdWFscyhuZXcgRmlsZShwcmVmaXggKyAiL015IERvY3VtZW50cy9NeSBXb3Jrc3BhY2UvUHJvamVjdCAxL2xpYi90b3BsaW5rLmphciIpLCBhYnNvbHV0ZUZpbGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaWxlTmFtZUlzUmVzZXJ2ZWQoKSB7Ci0JCWJvb2xlYW4gZXhwZWN0ZWQgPSB0aGlzLmlzRXhlY3V0aW5nT25XaW5kb3dzKCk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgRmlsZVRvb2xzLmZpbGVOYW1lSXNSZXNlcnZlZCgiQ09OIikpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIEZpbGVUb29scy5maWxlTmFtZUlzUmVzZXJ2ZWQoImNvbiIpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBGaWxlVG9vbHMuZmlsZU5hbWVJc1Jlc2VydmVkKCJjT04iKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgRmlsZVRvb2xzLmZpbGVOYW1lSXNSZXNlcnZlZCgiQVVYIikpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIEZpbGVUb29scy5maWxlTmFtZUlzUmVzZXJ2ZWQoIkNPTTMiKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgRmlsZVRvb2xzLmZpbGVOYW1lSXNSZXNlcnZlZCgiTFBUMyIpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBGaWxlVG9vbHMuZmlsZU5hbWVJc1Jlc2VydmVkKCJuVUwiKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgRmlsZVRvb2xzLmZpbGVOYW1lSXNSZXNlcnZlZCgiUHJuIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaWxlSGFzQW55UmVzZXJ2ZWRDb21wb25lbnRzKCkgewotCQlib29sZWFuIGV4cGVjdGVkID0gdGhpcy5pc0V4ZWN1dGluZ09uV2luZG93cygpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIEZpbGVUb29scy5maWxlSGFzQW55UmVzZXJ2ZWRDb21wb25lbnRzKG5ldyBGaWxlKCJDOi9DT04iKSkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIEZpbGVUb29scy5maWxlSGFzQW55UmVzZXJ2ZWRDb21wb25lbnRzKG5ldyBGaWxlKCIvY29uL2ZvbyIpKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgRmlsZVRvb2xzLmZpbGVIYXNBbnlSZXNlcnZlZENvbXBvbmVudHMobmV3IEZpbGUoImM6L3RlbXAvY09OIikpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBGaWxlVG9vbHMuZmlsZUhhc0FueVJlc2VydmVkQ29tcG9uZW50cyhuZXcgRmlsZSgiYmFyLy9iYXovL0FVWCIpKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgRmlsZVRvb2xzLmZpbGVIYXNBbnlSZXNlcnZlZENvbXBvbmVudHMobmV3IEZpbGUoIkNPTTMvL3R0dCIpKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgRmlsZVRvb2xzLmZpbGVIYXNBbnlSZXNlcnZlZENvbXBvbmVudHMobmV3IEZpbGUoImQ6L0xQVDMveHh4IikpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBGaWxlVG9vbHMuZmlsZUhhc0FueVJlc2VydmVkQ29tcG9uZW50cyhuZXcgRmlsZSgiYzovbXkgZG9jcyBhbmQgc3R1ZmYvdHVlc2RheS9uVUwiKSkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIEZpbGVUb29scy5maWxlSGFzQW55UmVzZXJ2ZWRDb21wb25lbnRzKG5ldyBGaWxlKCJQcm4iKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaG9ydGVuRmlsZU5hbWVGaWxlKCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uV2luZG93cygpKSB7Ci0JCQl0aGlzLnZlcmlmeVNob3J0ZW5GaWxlTmFtZUZpbGVXaW4oKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMudmVyaWZ5U2hvcnRlbkZpbGVOYW1lRmlsZU5vbldpbigpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVNob3J0ZW5GaWxlTmFtZUZpbGVXaW4oKSB7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKCJDOlxcRG9jdW1lbnRzIGFuZCBTZXR0aW5nc1xcQWRtaW5pc3RyYXRvclxcRGVza3RvcFxcUHJvamVjdFxcVGV4dC50eHQiKTsKLQkJU3RyaW5nIGZpbGVOYW1lID0gRmlsZVRvb2xzLnNob3J0ZW5GaWxlTmFtZShmaWxlKTsKLQkJYXNzZXJ0RXF1YWxzKCJDOlxcRG9jdW1lbnRzIGFuZCBTZXR0aW5nc1xcLi4uXFxEZXNrdG9wXFxQcm9qZWN0XFxUZXh0LnR4dCIsIGZpbGVOYW1lKTsKLQkJYXNzZXJ0VHJ1ZShmaWxlTmFtZS5sZW5ndGgoKSA8PSBGaWxlVG9vbHMuTUFYSU1VTV9TSE9SVEVORURfRklMRV9OQU1FX0xFTkdUSCk7Ci0KLQkJZmlsZSA9IG5ldyBGaWxlKCJDOi8iKTsKLQkJZmlsZU5hbWUgPSBGaWxlVG9vbHMuc2hvcnRlbkZpbGVOYW1lKGZpbGUpOwotCQlhc3NlcnRFcXVhbHMoIkM6XFwiLCBmaWxlTmFtZSk7Ci0JCWFzc2VydFRydWUoZmlsZU5hbWUubGVuZ3RoKCkgPD0gRmlsZVRvb2xzLk1BWElNVU1fU0hPUlRFTkVEX0ZJTEVfTkFNRV9MRU5HVEgpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlTaG9ydGVuRmlsZU5hbWVGaWxlTm9uV2luKCkgewotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZSgiL2hvbWUvYWRtaW5pc3RyYXRvci9kb2N1bWVudHMgYW5kIHNldHRpbmdzL2Rlc2t0b3AvUHJvamVjdC9UZXh0LnR4dCIpOwotCQlTdHJpbmcgZmlsZU5hbWUgPSBGaWxlVG9vbHMuc2hvcnRlbkZpbGVOYW1lKGZpbGUpOwotCQlhc3NlcnRFcXVhbHMoIi9ob21lL2FkbWluaXN0cmF0b3IvLi4uL2Rlc2t0b3AvUHJvamVjdC9UZXh0LnR4dCIsIGZpbGVOYW1lKTsKLQkJYXNzZXJ0VHJ1ZShmaWxlTmFtZS5sZW5ndGgoKSA8PSBGaWxlVG9vbHMuTUFYSU1VTV9TSE9SVEVORURfRklMRV9OQU1FX0xFTkdUSCk7Ci0KLQkJZmlsZSA9IG5ldyBGaWxlKCIvaG9tZSIpOwotCQlmaWxlTmFtZSA9IEZpbGVUb29scy5zaG9ydGVuRmlsZU5hbWUoZmlsZSk7Ci0JCWFzc2VydEVxdWFscygiL2hvbWUiLCBmaWxlTmFtZSk7Ci0JCWFzc2VydFRydWUoZmlsZU5hbWUubGVuZ3RoKCkgPD0gRmlsZVRvb2xzLk1BWElNVU1fU0hPUlRFTkVEX0ZJTEVfTkFNRV9MRU5HVEgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaG9ydGVuRmlsZU5hbWVGaWxlSW50KCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uV2luZG93cygpKSB7Ci0JCQl0aGlzLnZlcmlmeVNob3J0ZW5GaWxlTmFtZUZpbGVJbnRXaW4oKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMudmVyaWZ5U2hvcnRlbkZpbGVOYW1lRmlsZUludE5vbldpbigpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVNob3J0ZW5GaWxlTmFtZUZpbGVJbnRXaW4oKSB7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKCJDOlxcRG9jdW1lbnRzIGFuZCBTZXR0aW5nc1xcQWRtaW5pc3RyYXRvclxcRGVza3RvcFxcUHJvamVjdFxcVGV4dC50eHQiKTsKLQkJU3RyaW5nIGZpbGVOYW1lID0gRmlsZVRvb2xzLnNob3J0ZW5GaWxlTmFtZShmaWxlLCAzMSk7Ci0JCWFzc2VydEVxdWFscygiQzpcXC4uLlxcRGVza3RvcFxcUHJvamVjdFxcVGV4dC50eHQiLCBmaWxlTmFtZSk7Ci0JCWFzc2VydEVxdWFscygzMSwgZmlsZU5hbWUubGVuZ3RoKCkpOwotCi0JCWZpbGUgPSBuZXcgRmlsZSgiQzovVGhpcyBpcyB0aGUgZmlsZSBuYW1lLnR4dCIpOwotCQlmaWxlTmFtZSA9IEZpbGVUb29scy5zaG9ydGVuRmlsZU5hbWUoZmlsZSwgMTApOwotCQlhc3NlcnRFcXVhbHMoIkM6XFxUaGlzIGlzIHRoZSBmaWxlIG5hbWUudHh0IiwgZmlsZU5hbWUpOwotCQlhc3NlcnRFcXVhbHMoMjgsIGZpbGVOYW1lLmxlbmd0aCgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5U2hvcnRlbkZpbGVOYW1lRmlsZUludE5vbldpbigpIHsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoIi9ob21lL2FkbWluaXN0cmF0b3IvZG9jdW1lbnRzIGFuZCBzZXR0aW5ncy9kZXNrdG9wL1Byb2plY3QvVGV4dC50eHQiKTsKLQkJU3RyaW5nIGZpbGVOYW1lID0gRmlsZVRvb2xzLnNob3J0ZW5GaWxlTmFtZShmaWxlLCAzMSk7Ci0JCWFzc2VydEVxdWFscygiL2hvbWUvLi4uL2Rlc2t0b3AvUHJvamVjdC9UZXh0LnR4dCIsIGZpbGVOYW1lKTsKLQkJYXNzZXJ0RXF1YWxzKDM0LCBmaWxlTmFtZS5sZW5ndGgoKSk7Ci0KLQkJZmlsZSA9IG5ldyBGaWxlKCIvVGhpcyBpcyB0aGUgZmlsZSBuYW1lLnR4dCIpOwotCQlmaWxlTmFtZSA9IEZpbGVUb29scy5zaG9ydGVuRmlsZU5hbWUoZmlsZSwgMTApOwotCQlhc3NlcnRFcXVhbHMoIi9UaGlzIGlzIHRoZSBmaWxlIG5hbWUudHh0IiwgZmlsZU5hbWUpOwotCQlhc3NlcnRFcXVhbHMoMjYsIGZpbGVOYW1lLmxlbmd0aCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2hvcnRlbkZpbGVOYW1lVVJMKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmICh0aGlzLmlzRXhlY3V0aW5nT25XaW5kb3dzKCkpIHsKLQkJCXRoaXMudmVyaWZ5U2hvcnRlbkZpbGVOYW1lVVJMV2luKCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLnZlcmlmeVNob3J0ZW5GaWxlTmFtZVVSTE5vbldpbigpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVNob3J0ZW5GaWxlTmFtZVVSTFdpbigpIHRocm93cyBFeGNlcHRpb24gewotCQlVUkwgdXJsID0gbmV3IFVSTCgiZmlsZSIsICIiLCAiQzovRG9jdW1lbnRzIGFuZCBTZXR0aW5ncy9BZG1pbmlzdHJhdG9yL0Rlc2t0b3AvUHJvamVjdC9UZXh0LnR4dCIpOwotCQlTdHJpbmcgZmlsZU5hbWUgPSBGaWxlVG9vbHMuc2hvcnRlbkZpbGVOYW1lKHVybCk7Ci0JCWFzc2VydEVxdWFscygiQzpcXERvY3VtZW50cyBhbmQgU2V0dGluZ3NcXC4uLlxcRGVza3RvcFxcUHJvamVjdFxcVGV4dC50eHQiLCBmaWxlTmFtZSk7Ci0JCWFzc2VydFRydWUoZmlsZU5hbWUubGVuZ3RoKCkgPD0gRmlsZVRvb2xzLk1BWElNVU1fU0hPUlRFTkVEX0ZJTEVfTkFNRV9MRU5HVEgpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlTaG9ydGVuRmlsZU5hbWVVUkxOb25XaW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVVJMIHVybCA9IG5ldyBVUkwoImZpbGUiLCAiIiwgIi9ob21lL2FkbWluaXN0cmF0b3IvZG9jdW1lbnRzIGFuZCBzZXR0aW5ncy9kZXNrdG9wL1Byb2plY3QvVGV4dC50eHQiKTsKLQkJU3RyaW5nIGZpbGVOYW1lID0gRmlsZVRvb2xzLnNob3J0ZW5GaWxlTmFtZSh1cmwpOwotCQlhc3NlcnRFcXVhbHMoIi9ob21lL2FkbWluaXN0cmF0b3IvLi4uL2Rlc2t0b3AvUHJvamVjdC9UZXh0LnR4dCIsIGZpbGVOYW1lKTsKLQkJYXNzZXJ0VHJ1ZShmaWxlTmFtZS5sZW5ndGgoKSA8PSBGaWxlVG9vbHMuTUFYSU1VTV9TSE9SVEVORURfRklMRV9OQU1FX0xFTkdUSCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNob3J0ZW5GaWxlTmFtZVVSTEludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uV2luZG93cygpKSB7Ci0JCQl0aGlzLnZlcmlmeVNob3J0ZW5GaWxlTmFtZVVSTEludFdpbigpOwotCQl9IGVsc2UgewotCQkJdGhpcy52ZXJpZnlTaG9ydGVuRmlsZU5hbWVVUkxJbnROb25XaW4oKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlTaG9ydGVuRmlsZU5hbWVVUkxJbnRXaW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVVJMIHVybCA9IG5ldyBVUkwoImZpbGUiLCAiIiwgIi9DOi9Eb2N1bWVudHMgYW5kIFNldHRpbmdzL0FkbWluaXN0cmF0b3IvRGVza3RvcC9Qcm9qZWN0L1RleHQudHh0Iik7Ci0JCVN0cmluZyBmaWxlTmFtZSA9IEZpbGVUb29scy5zaG9ydGVuRmlsZU5hbWUodXJsLCAzMSk7Ci0JCWFzc2VydEVxdWFscygiQzpcXC4uLlxcRGVza3RvcFxcUHJvamVjdFxcVGV4dC50eHQiLCBmaWxlTmFtZSk7Ci0JCWFzc2VydEVxdWFscygzMSwgZmlsZU5hbWUubGVuZ3RoKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlTaG9ydGVuRmlsZU5hbWVVUkxJbnROb25XaW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVVJMIHVybCA9IG5ldyBVUkwoImZpbGUiLCAiIiwgIi9ob21lL2FkbWluaXN0cmF0b3IvZG9jdW1lbnRzIGFuZCBzZXR0aW5ncy9kZXNrdG9wL1Byb2plY3QvVGV4dC50eHQiKTsKLQkJU3RyaW5nIGZpbGVOYW1lID0gRmlsZVRvb2xzLnNob3J0ZW5GaWxlTmFtZSh1cmwsIDMxKTsKLQkJYXNzZXJ0RXF1YWxzKCIvaG9tZS8uLi4vZGVza3RvcC9Qcm9qZWN0L1RleHQudHh0IiwgZmlsZU5hbWUpOwotCQlhc3NlcnRFcXVhbHMoMzQsIGZpbGVOYW1lLmxlbmd0aCgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5VW5jaGFuZ2VkQWJzb2x1dGVGaWxlKFN0cmluZyBmaWxlTmFtZSwgU3RyaW5nIGRpck5hbWUpIHsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZmlsZU5hbWUpOwotCQlGaWxlIGRpciA9IG5ldyBGaWxlKGRpck5hbWUpOwotCQlGaWxlIGFic29sdXRlRmlsZSA9IEZpbGVUb29scy5jb252ZXJ0VG9BYnNvbHV0ZUZpbGUoZmlsZSwgZGlyKTsKLQkJYXNzZXJ0RXF1YWxzKGZpbGUsIGFic29sdXRlRmlsZSk7Ci0JfQotCi0JcHJpdmF0ZSBGaWxlIGJ1aWxkVGVtcERpcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIGJ1aWxkIGEgbmV3IGRpcmVjdG9yeSBmb3IgZWFjaCB0ZXN0LCB0byBwcmV2ZW50IGFueSBjcm9zcy10ZXN0IGVmZmVjdHMKLQkJRmlsZSBkaXIgPSBGaWxlVG9vbHMubmV3VGVtcG9yYXJ5RGlyZWN0b3J5KENsYXNzVG9vbHMuc2hvcnRDbGFzc05hbWVGb3JPYmplY3QodGhpcykgKyAiLiIgKyB0aGlzLmdldE5hbWUoKSk7Ci0KLQkJRmlsZSBmaWxlMGEgPSBuZXcgRmlsZShkaXIsICJmaWxlMGEiKTsKLQkJZmlsZTBhLmNyZWF0ZU5ld0ZpbGUoKTsKLQkJRmlsZSBmaWxlMGIgPSBuZXcgRmlsZShkaXIsICJmaWxlMGIiKTsKLQkJZmlsZTBiLmNyZWF0ZU5ld0ZpbGUoKTsKLQkJRmlsZSBmaWxlMGMgPSBuZXcgRmlsZShkaXIsICJmaWxlMGMiKTsKLQkJZmlsZTBjLmNyZWF0ZU5ld0ZpbGUoKTsKLQotCQlGaWxlIHN1YmRpcjEgPSBuZXcgRmlsZShkaXIsICJzdWJkaXIxIik7Ci0JCXN1YmRpcjEubWtkaXIoKTsKLQkJRmlsZSBmaWxlMWEgPSBuZXcgRmlsZShzdWJkaXIxLCAiZmlsZTFhIik7Ci0JCWZpbGUxYS5jcmVhdGVOZXdGaWxlKCk7Ci0JCUZpbGUgZmlsZTFiID0gbmV3IEZpbGUoc3ViZGlyMSwgImZpbGUxYiIpOwotCQlmaWxlMWIuY3JlYXRlTmV3RmlsZSgpOwotCi0JCUZpbGUgc3ViZGlyMiA9IG5ldyBGaWxlKGRpciwgInN1YmRpcjIiKTsKLQkJc3ViZGlyMi5ta2RpcigpOwotCQlGaWxlIGZpbGUyYSA9IG5ldyBGaWxlKHN1YmRpcjIsICJmaWxlMmEiKTsKLQkJZmlsZTJhLmNyZWF0ZU5ld0ZpbGUoKTsKLQkJRmlsZSBmaWxlMmIgPSBuZXcgRmlsZShzdWJkaXIyLCAiZmlsZTJiIik7Ci0JCWZpbGUyYi5jcmVhdGVOZXdGaWxlKCk7Ci0KLQkJRmlsZSBzdWJkaXIzID0gbmV3IEZpbGUoc3ViZGlyMiwgInN1YmRpcjMiKTsKLQkJc3ViZGlyMy5ta2RpcigpOwotCQlGaWxlIGZpbGUzYSA9IG5ldyBGaWxlKHN1YmRpcjMsICJmaWxlM2EiKTsKLQkJZmlsZTNhLmNyZWF0ZU5ld0ZpbGUoKTsKLQkJRmlsZSBmaWxlM2IgPSBuZXcgRmlsZShzdWJkaXIzLCAiZmlsZTNiIik7Ci0JCWZpbGUzYi5jcmVhdGVOZXdGaWxlKCk7Ci0KLQkJcmV0dXJuIGRpcjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGVsZXRlRGlyKEZpbGUgZGlyKSB7Ci0JCUZpbGVUb29scy5kZWxldGVEaXJlY3RvcnkoZGlyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvSGFzaEJhZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0hhc2hCYWdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTEyMGM5Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvSGFzaEJhZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5CYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkhhc2hCYWc7Ci0KLXB1YmxpYyBjbGFzcyBIYXNoQmFnVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBIYXNoQmFnPFN0cmluZz4gYmFnOwotCi0JcHVibGljIEhhc2hCYWdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmJhZyA9IHRoaXMuYnVpbGRCYWcoKTsKLQl9Ci0KLQlwcml2YXRlIEhhc2hCYWc8U3RyaW5nPiBidWlsZEJhZygpIHsKLQkJSGFzaEJhZzxTdHJpbmc+IGIgPSBuZXcgSGFzaEJhZzxTdHJpbmc+KCk7Ci0JCWIuYWRkKG51bGwpOwotCQliLmFkZChuZXcgU3RyaW5nKCJvbmUiKSk7Ci0JCWIuYWRkKG5ldyBTdHJpbmcoInR3byIpKTsKLQkJYi5hZGQobmV3IFN0cmluZygidHdvIikpOwotCQliLmFkZChuZXcgU3RyaW5nKCJ0aHJlZSIpKTsKLQkJYi5hZGQobmV3IFN0cmluZygidGhyZWUiKSk7Ci0JCWIuYWRkKG5ldyBTdHJpbmcoInRocmVlIikpOwotCQliLmFkZChuZXcgU3RyaW5nKCJmb3VyIikpOwotCQliLmFkZChuZXcgU3RyaW5nKCJmb3VyIikpOwotCQliLmFkZChuZXcgU3RyaW5nKCJmb3VyIikpOwotCQliLmFkZChuZXcgU3RyaW5nKCJmb3VyIikpOwotCQlyZXR1cm4gYjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gYnVpbGRDb2xsZWN0aW9uKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljLmFkZChuZXcgU3RyaW5nKCJmb28iKSk7Ci0JCWMuYWRkKG5ldyBTdHJpbmcoImZvbyIpKTsKLQkJYy5hZGQobmV3IFN0cmluZygiYmFyIikpOwotCQljLmFkZChuZXcgU3RyaW5nKCJiYXIiKSk7Ci0JCWMuYWRkKG5ldyBTdHJpbmcoImJhciIpKTsKLQkJcmV0dXJuIGM7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEN0b3JDb2xsZWN0aW9uKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uKCk7Ci0JCUJhZzxTdHJpbmc+IGIgPSBuZXcgSGFzaEJhZzxTdHJpbmc+KGMpOwotCQlmb3IgKFN0cmluZyBzIDogYykgewotCQkJYXNzZXJ0VHJ1ZSgibWlzc2luZyBlbGVtZW50IiwgYi5jb250YWlucyhzKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3RvckludEZsb2F0KCkgewotCQlib29sZWFuIGV4Q2F1Z2h0OwotCi0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLmJhZyA9IG5ldyBIYXNoQmFnPFN0cmluZz4oLTIwLCAwLjY2Zik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCi0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLmJhZyA9IG5ldyBIYXNoQmFnPFN0cmluZz4oMjAsIC0wLjY2Zik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGQoKSB7Ci0JCS8vIHRoZSBvdGhlciBhZGRzIHRvb2sgcGxhY2UgaW4gc2V0VXAKLQkJYXNzZXJ0VHJ1ZSgiaW5jb3JyZWN0IHJldHVybiB2YWx1ZSIsIHRoaXMuYmFnLmFkZCgiZml2ZSIpKTsKLQotCQlhc3NlcnRUcnVlKCJtaXNzaW5nIGVsZW1lbnQiLCB0aGlzLmJhZy5jb250YWlucygib25lIikpOwotCQlhc3NlcnRUcnVlKCJtaXNzaW5nIGVsZW1lbnQiLCB0aGlzLmJhZy5jb250YWlucygidHdvIikpOwotCQlhc3NlcnRUcnVlKCJtaXNzaW5nIGVsZW1lbnQiLCB0aGlzLmJhZy5jb250YWlucygidGhyZWUiKSk7Ci0JCWFzc2VydFRydWUoIm1pc3NpbmcgZWxlbWVudCIsIHRoaXMuYmFnLmNvbnRhaW5zKCJmb3VyIikpOwotCQlhc3NlcnRUcnVlKCJtaXNzaW5nIGVsZW1lbnQiLCB0aGlzLmJhZy5jb250YWlucygiZml2ZSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uKCk7Ci0JCWFzc2VydFRydWUoImluY29ycmVjdCByZXR1cm4gdmFsdWUiLCB0aGlzLmJhZy5hZGRBbGwoYykpOwotCQlmb3IgKFN0cmluZyBzIDogYykgewotCQkJYXNzZXJ0VHJ1ZSgibWlzc2luZyBlbGVtZW50IiwgdGhpcy5iYWcuY29udGFpbnMocykpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsZWFyKCkgewotCQlhc3NlcnRUcnVlKCJtaXNzaW5nIGVsZW1lbnQiLCB0aGlzLmJhZy5jb250YWlucygib25lIikpOwotCQlhc3NlcnRUcnVlKCJtaXNzaW5nIGVsZW1lbnQiLCB0aGlzLmJhZy5jb250YWlucygidHdvIikpOwotCQlhc3NlcnRUcnVlKCJtaXNzaW5nIGVsZW1lbnQiLCB0aGlzLmJhZy5jb250YWlucygidGhyZWUiKSk7Ci0JCWFzc2VydFRydWUoIm1pc3NpbmcgZWxlbWVudCIsIHRoaXMuYmFnLmNvbnRhaW5zKCJmb3VyIikpOwotCQlhc3NlcnRUcnVlKCJtaXNzaW5nIGVsZW1lbnQiLCB0aGlzLmJhZy5jb250YWlucyhudWxsKSk7Ci0JCWFzc2VydEVxdWFscygiaW52YWxpZCBzaXplIiwgMTEsIHRoaXMuYmFnLnNpemUoKSk7Ci0JCXRoaXMuYmFnLmNsZWFyKCk7Ci0JCWFzc2VydEZhbHNlKCJtYWxpbmdlcmluZyBlbGVtZW50IiwgdGhpcy5iYWcuY29udGFpbnMoIm9uZSIpKTsKLQkJYXNzZXJ0RmFsc2UoIm1hbGluZ2VyaW5nIGVsZW1lbnQiLCB0aGlzLmJhZy5jb250YWlucygidHdvIikpOwotCQlhc3NlcnRGYWxzZSgibWFsaW5nZXJpbmcgZWxlbWVudCIsIHRoaXMuYmFnLmNvbnRhaW5zKCJ0aHJlZSIpKTsKLQkJYXNzZXJ0RmFsc2UoIm1hbGluZ2VyaW5nIGVsZW1lbnQiLCB0aGlzLmJhZy5jb250YWlucygiZm91ciIpKTsKLQkJYXNzZXJ0RmFsc2UoIm1hbGluZ2VyaW5nIGVsZW1lbnQiLCB0aGlzLmJhZy5jb250YWlucyhudWxsKSk7Ci0JCWFzc2VydEVxdWFscygiaW52YWxpZCBzaXplIiwgMCwgdGhpcy5iYWcuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xvbmUoKSB7Ci0JCUJhZzxTdHJpbmc+IGJhZzIgPSB0aGlzLmJhZy5jbG9uZSgpOwotCQlhc3NlcnRUcnVlKCJiYWQgY2xvbmUiLCB0aGlzLmJhZyAhPSBiYWcyKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYWQgY2xvbmUiLCB0aGlzLmJhZywgYmFnMik7Ci0JCWFzc2VydFRydWUoImJhZCBjbG9uZSIsIHRoaXMuYmFnLmhhc2hDb2RlKCkgPT0gYmFnMi5oYXNoQ29kZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnMoKSB7Ci0JCWFzc2VydFRydWUoIm1pc3NpbmcgZWxlbWVudCIsIHRoaXMuYmFnLmNvbnRhaW5zKG51bGwpKTsKLQkJYXNzZXJ0VHJ1ZSgibWlzc2luZyBlbGVtZW50IiwgdGhpcy5iYWcuY29udGFpbnMoIm9uZSIpKTsKLQkJYXNzZXJ0VHJ1ZSgibWlzc2luZyBlbGVtZW50IiwgdGhpcy5iYWcuY29udGFpbnMoInR3byIpKTsKLQkJYXNzZXJ0VHJ1ZSgibWlzc2luZyBlbGVtZW50IiwgdGhpcy5iYWcuY29udGFpbnMoInRocmVlIikpOwotCQlhc3NlcnRUcnVlKCJtaXNzaW5nIGVsZW1lbnQiLCB0aGlzLmJhZy5jb250YWlucygiZm91ciIpKTsKLQkJYXNzZXJ0VHJ1ZSgibWlzc2luZyBlbGVtZW50IiwgdGhpcy5iYWcuY29udGFpbnMobmV3IFN0cmluZygiZm91ciIpKSk7Ci0JCWFzc2VydFRydWUoIm1pc3NpbmcgZWxlbWVudCIsIHRoaXMuYmFnLmNvbnRhaW5zKCJmbyIgKyAidXIiKSk7Ci0JCWFzc2VydEZhbHNlKCJlbGVtZW50IGZvdW5kIiwgdGhpcy5iYWcuY29udGFpbnMoImZpdmUiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljLmFkZChudWxsKTsKLQkJYy5hZGQobmV3IFN0cmluZygib25lIikpOwotCQljLmFkZChuZXcgU3RyaW5nKCJ0d28iKSk7Ci0JCWMuYWRkKG5ldyBTdHJpbmcoInRocmVlIikpOwotCQljLmFkZChuZXcgU3RyaW5nKCJmb3VyIikpOwotCQlhc3NlcnRUcnVlKCJtaXNzaW5nIGVsZW1lbnQocykiLCB0aGlzLmJhZy5jb250YWluc0FsbChjKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvdW50KCkgewotCQlhc3NlcnRFcXVhbHMoImJhZCBjb3VudCIsIDAsIHRoaXMuYmFnLmNvdW50KCJ6ZXJvIikpOwotCQlhc3NlcnRFcXVhbHMoImJhZCBjb3VudCIsIDEsIHRoaXMuYmFnLmNvdW50KCJvbmUiKSk7Ci0JCWFzc2VydEVxdWFscygiYmFkIGNvdW50IiwgMiwgdGhpcy5iYWcuY291bnQoInR3byIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYWQgY291bnQiLCAzLCB0aGlzLmJhZy5jb3VudCgidGhyZWUiKSk7Ci0JCWFzc2VydEVxdWFscygiYmFkIGNvdW50IiwgNCwgdGhpcy5iYWcuY291bnQoImZvdXIiKSk7Ci0JCWFzc2VydEVxdWFscygiYmFkIGNvdW50IiwgMCwgdGhpcy5iYWcuY291bnQoImZpdmUiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVxdWFscygpIHsKLQkJQmFnPFN0cmluZz4gYmFnMiA9IHRoaXMuYnVpbGRCYWcoKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYWdzIGFyZSBub3QgZXF1YWwiLCB0aGlzLmJhZywgYmFnMik7Ci0JCWJhZzIuYWRkKCJmaXZlIik7Ci0JCWFzc2VydEZhbHNlKCJiYWdzIGFyZSBlcXVhbCIsIHRoaXMuYmFnLmVxdWFscyhiYWcyKSk7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KHRoaXMuYmFnKTsKLQkJYXNzZXJ0RmFsc2UoImJhZ3MgYXJlIG5vdCBlcXVhbCB0byBjb2xsZWN0aW9ucyIsIHRoaXMuYmFnLmVxdWFscyhjKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc2hDb2RlKCkgewotCQlCYWc8U3RyaW5nPiBiYWcyID0gdGhpcy5idWlsZEJhZygpOwotCQlhc3NlcnRFcXVhbHMoImJhZCBoYXNoIGNvZGUiLCB0aGlzLmJhZy5oYXNoQ29kZSgpLCBiYWcyLmhhc2hDb2RlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc0VtcHR5KCkgewotCQlhc3NlcnRGYWxzZSgiYmFnIGlzIGVtcHR5IiwgdGhpcy5iYWcuaXNFbXB0eSgpKTsKLQkJdGhpcy5iYWcuY2xlYXIoKTsKLQkJYXNzZXJ0VHJ1ZSgiYmFnIGlzIG5vdCBlbXB0eSIsIHRoaXMuYmFnLmlzRW1wdHkoKSk7Ci0JCXRoaXMuYmFnLmFkZCgiZm9vIik7Ci0JCWFzc2VydEZhbHNlKCJiYWcgaXMgZW1wdHkiLCB0aGlzLmJhZy5pc0VtcHR5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eUl0ZXJhdG9yKCkgewotCQl0aGlzLmJhZy5jbGVhcigpOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5iYWcuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UoIml0ZXJhdG9yIGlzIG5vdCBlbXB0eSIsIGl0ZXJhdG9yLmhhc05leHQoKSk7Ci0KLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlPYmplY3QgZWxlbWVudCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duOiAiICsgZWxlbWVudCwgZXhDYXVnaHQpOwotCi0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQlpbnQgaSA9IDA7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLmJhZy5pdGVyYXRvcigpOwotCQlhc3NlcnRUcnVlKCJpdGVyYXRvciBpcyBlbXB0eSIsIGl0ZXJhdG9yLmhhc05leHQoKSk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWl0ZXJhdG9yLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoImludmFsaWQgaGFzTmV4dCgpIGxvb3AiLCAxMSwgaSk7Ci0JCWFzc2VydEZhbHNlKCJpdGVyYXRvciBzaG91bGQgYmUgZW1wdHkgbm93IiwgaXRlcmF0b3IuaGFzTmV4dCgpKTsKLQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCU9iamVjdCBlbGVtZW50ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd246ICIgKyBlbGVtZW50LCBleENhdWdodCk7Ci0KLQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCWFzc2VydEVxdWFscygiaXRlcmF0b3IgZGlkIG5vdCByZW1vdmUgZWxlbWVudCIsIDEwLCB0aGlzLmJhZy5zaXplKCkpOwotCi0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0KLQkJLy8gc3RhcnQgb3ZlcgotCQlpdGVyYXRvciA9IHRoaXMuYmFnLml0ZXJhdG9yKCk7Ci0JCXRoaXMuYmFnLmFkZCgiZml2ZSIpOwotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJaXRlcmF0b3IubmV4dCgpOwotCQl9IGNhdGNoIChDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmlxdWVJdGVyYXRvcigpIHsKLQkJaW50IGkgPSAwOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5iYWcudW5pcXVlSXRlcmF0b3IoKTsKLQkJYXNzZXJ0VHJ1ZSgiaXRlcmF0b3IgaXMgZW1wdHkiLCBpdGVyYXRvci5oYXNOZXh0KCkpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlpdGVyYXRvci5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKCJpbnZhbGlkIGhhc05leHQoKSBsb29wIiwgNSwgaSk7Ci0JCWFzc2VydEZhbHNlKCJpdGVyYXRvciBzaG91bGQgYmUgZW1wdHkgbm93IiwgaXRlcmF0b3IuaGFzTmV4dCgpKTsKLQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCU9iamVjdCBlbGVtZW50ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd246ICIgKyBlbGVtZW50LCBleENhdWdodCk7Ci0KLQkJLy8gc3RhcnQgb3ZlcgotCQlpdGVyYXRvciA9IHRoaXMuYmFnLnVuaXF1ZUl0ZXJhdG9yKCk7Ci0JCU9iamVjdCBuZXh0ID0gbnVsbDsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSAmJiAhImZvdXIiLmVxdWFscyhuZXh0KSkgewotCQkJbmV4dCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJfQotCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpdGVyYXRvciBkaWQgbm90IHJlbW92ZSBhbGwgY29waWVzIG9mIGVsZW1lbnQiLCA3LCB0aGlzLmJhZy5zaXplKCkpOwotCi0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0KLQkJLy8gc3RhcnQgb3ZlcgotCQlpdGVyYXRvciA9IHRoaXMuYmFnLnVuaXF1ZUl0ZXJhdG9yKCk7Ci0JCXRoaXMuYmFnLmFkZCgiZml2ZSIpOwotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJaXRlcmF0b3IubmV4dCgpOwotCQl9IGNhdGNoIChDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNoaW5nRGlzdHJpYnV0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUJhZzxTdHJpbmc+IGJpZ0JhZyA9IG5ldyBIYXNoQmFnPFN0cmluZz4oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAxMDAwMDsgaSsrKSB7Ci0JCQliaWdCYWcuYWRkKCJvYmplY3QiICsgaSk7Ci0JCX0KLQotCQlqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCBmaWVsZCA9IGJpZ0JhZy5nZXRDbGFzcygpLmdldERlY2xhcmVkRmllbGQoInRhYmxlIik7Ci0JCWZpZWxkLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0JCU9iamVjdFtdIHRhYmxlID0gKE9iamVjdFtdKSBmaWVsZC5nZXQoYmlnQmFnKTsKLQkJaW50IGJ1Y2tldENvdW50ID0gdGFibGUubGVuZ3RoOwotCQlpbnQgZmlsbGVkQnVja2V0Q291bnQgPSAwOwotCQlmb3IgKE9iamVjdCBvIDogdGFibGUpIHsKLQkJCWlmIChvICE9IG51bGwpIHsKLQkJCQlmaWxsZWRCdWNrZXRDb3VudCsrOwotCQkJfQotCQl9Ci0JCWZsb2F0IGxvYWRGYWN0b3IgPSAoKGZsb2F0KSBmaWxsZWRCdWNrZXRDb3VudCkgLyAoKGZsb2F0KSBidWNrZXRDb3VudCk7Ci0JCWFzc2VydFRydWUoIldBUk5JTkcgLSBwb29yIGxvYWQgZmFjdG9yOiAiICsgbG9hZEZhY3RvciwgbG9hZEZhY3RvciA+IDAuMjApOwotCQlhc3NlcnRUcnVlKCJXQVJOSU5HIC0gcG9vciBsb2FkIGZhY3RvcjogIiArIGxvYWRGYWN0b3IsIGxvYWRGYWN0b3IgPCAwLjc1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlKCkgewotCQlhc3NlcnRUcnVlKCJpbmNvcnJlY3QgcmV0dXJuIHZhbHVlIiwgdGhpcy5iYWcucmVtb3ZlKCJvbmUiKSk7Ci0JCWFzc2VydEZhbHNlKCJlbGVtZW50IHN0aWxsIHByZXNlbnQiLCB0aGlzLmJhZy5jb250YWlucygib25lIikpOwotCQlhc3NlcnRGYWxzZSgiaW5jb3JyZWN0IHJldHVybiB2YWx1ZSIsIHRoaXMuYmFnLnJlbW92ZSgib25lIikpOwotCi0JCWFzc2VydFRydWUoImluY29ycmVjdCByZXR1cm4gdmFsdWUiLCB0aGlzLmJhZy5yZW1vdmUoInR3byIpKTsKLQkJYXNzZXJ0VHJ1ZSgiaW5jb3JyZWN0IHJldHVybiB2YWx1ZSIsIHRoaXMuYmFnLnJlbW92ZSgidHdvIikpOwotCQlhc3NlcnRGYWxzZSgiZWxlbWVudCBzdGlsbCBwcmVzZW50IiwgdGhpcy5iYWcuY29udGFpbnMoIm9uZSIpKTsKLQkJYXNzZXJ0RmFsc2UoImluY29ycmVjdCByZXR1cm4gdmFsdWUiLCB0aGlzLmJhZy5yZW1vdmUoIm9uZSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljLmFkZCgib25lIik7Ci0JCWMuYWRkKCJ0aHJlZSIpOwotCQlhc3NlcnRUcnVlKCJpbmNvcnJlY3QgcmV0dXJuIHZhbHVlIiwgdGhpcy5iYWcucmVtb3ZlQWxsKGMpKTsKLQkJYXNzZXJ0RmFsc2UoImVsZW1lbnQgc3RpbGwgcHJlc2VudCIsIHRoaXMuYmFnLmNvbnRhaW5zKCJvbmUiKSk7Ci0JCWFzc2VydEZhbHNlKCJlbGVtZW50IHN0aWxsIHByZXNlbnQiLCB0aGlzLmJhZy5jb250YWlucygidGhyZWUiKSk7Ci0JCWFzc2VydEZhbHNlKCJpbmNvcnJlY3QgcmV0dXJuIHZhbHVlIiwgdGhpcy5iYWcucmVtb3ZlKCJvbmUiKSk7Ci0JCWFzc2VydEZhbHNlKCJpbmNvcnJlY3QgcmV0dXJuIHZhbHVlIiwgdGhpcy5iYWcucmVtb3ZlKCJ0aHJlZSIpKTsKLQkJYXNzZXJ0RmFsc2UoImluY29ycmVjdCByZXR1cm4gdmFsdWUiLCB0aGlzLmJhZy5yZW1vdmVBbGwoYykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGwoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMuYWRkKCJvbmUiKTsKLQkJYy5hZGQoInRocmVlIik7Ci0JCWFzc2VydFRydWUoImluY29ycmVjdCByZXR1cm4gdmFsdWUiLCB0aGlzLmJhZy5yZXRhaW5BbGwoYykpOwotCQlhc3NlcnRUcnVlKCJlbGVtZW50IHJlbW92ZWQiLCB0aGlzLmJhZy5jb250YWlucygib25lIikpOwotCQlhc3NlcnRUcnVlKCJlbGVtZW50IHJlbW92ZWQiLCB0aGlzLmJhZy5jb250YWlucygidGhyZWUiKSk7Ci0JCWFzc2VydEZhbHNlKCJlbGVtZW50IHN0aWxsIHByZXNlbnQiLCB0aGlzLmJhZy5jb250YWlucygidHdvIikpOwotCQlhc3NlcnRGYWxzZSgiZWxlbWVudCBzdGlsbCBwcmVzZW50IiwgdGhpcy5iYWcuY29udGFpbnMoImZvdXIiKSk7Ci0JCWFzc2VydEZhbHNlKCJpbmNvcnJlY3QgcmV0dXJuIHZhbHVlIiwgdGhpcy5iYWcucmVtb3ZlKCJ0d28iKSk7Ci0JCWFzc2VydEZhbHNlKCJpbmNvcnJlY3QgcmV0dXJuIHZhbHVlIiwgdGhpcy5iYWcucmVtb3ZlKCJmb3VyIikpOwotCQlhc3NlcnRGYWxzZSgiaW5jb3JyZWN0IHJldHVybiB2YWx1ZSIsIHRoaXMuYmFnLnJldGFpbkFsbChjKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpemUoKSB7Ci0JCWFzc2VydFRydWUoImluY29ycmVjdCBzaXplIiwgdGhpcy5iYWcuc2l6ZSgpID09IDExKTsKLQkJdGhpcy5iYWcuYWRkKCJmaXZlIik7Ci0JCXRoaXMuYmFnLmFkZCgiZml2ZSIpOwotCQl0aGlzLmJhZy5hZGQoImZpdmUiKTsKLQkJdGhpcy5iYWcuYWRkKCJmaXZlIik7Ci0JCXRoaXMuYmFnLmFkZCgiZml2ZSIpOwotCQlhc3NlcnRFcXVhbHMoImluY29ycmVjdCBzaXplIiwgMTYsIHRoaXMuYmFnLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQmFnPFN0cmluZz4gYmFnMiA9IFRlc3RUb29scy5zZXJpYWxpemUodGhpcy5iYWcpOwotCi0JCWFzc2VydFRydWUoInNhbWUgb2JqZWN0PyIsIHRoaXMuYmFnICE9IGJhZzIpOwotCQlhc3NlcnRFcXVhbHMoImluY29ycmVjdCBzaXplIiwgMTEsIGJhZzIuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ1bmVxdWFsIGJhZyIsIHRoaXMuYmFnLCBiYWcyKTsKLQkJLy8gbG9vayBmb3Igc2ltaWxhciBlbGVtZW50cwotCQlhc3NlcnRUcnVlKCJtaXNzaW5nIGVsZW1lbnQiLCBiYWcyLmNvbnRhaW5zKG51bGwpKTsKLQkJYXNzZXJ0VHJ1ZSgibWlzc2luZyBlbGVtZW50IiwgYmFnMi5jb250YWlucygib25lIikpOwotCQlhc3NlcnRUcnVlKCJtaXNzaW5nIGVsZW1lbnQiLCBiYWcyLmNvbnRhaW5zKCJ0d28iKSk7Ci0JCWFzc2VydFRydWUoIm1pc3NpbmcgZWxlbWVudCIsIGJhZzIuY29udGFpbnMoInRocmVlIikpOwotCQlhc3NlcnRUcnVlKCJtaXNzaW5nIGVsZW1lbnQiLCBiYWcyLmNvbnRhaW5zKCJmb3VyIikpOwotCi0JCWludCBudWxsQ291bnQgPSAwLCBvbmVDb3VudCA9IDAsIHR3b0NvdW50ID0gMCwgdGhyZWVDb3VudCA9IDAsIGZvdXJDb3VudCA9IDA7Ci0JCWZvciAoU3RyaW5nIHMgOiBiYWcyKSB7Ci0JCQlpZiAocyA9PSBudWxsKSB7Ci0JCQkJbnVsbENvdW50Kys7Ci0JCQl9IGVsc2UgaWYgKHMuZXF1YWxzKCJvbmUiKSkgewotCQkJCW9uZUNvdW50Kys7Ci0JCQl9IGVsc2UgaWYgKHMuZXF1YWxzKCJ0d28iKSkgewotCQkJCXR3b0NvdW50Kys7Ci0JCQl9IGVsc2UgaWYgKHMuZXF1YWxzKCJ0aHJlZSIpKSB7Ci0JCQkJdGhyZWVDb3VudCsrOwotCQkJfSBlbHNlIGlmIChzLmVxdWFscygiZm91ciIpKSB7Ci0JCQkJZm91ckNvdW50Kys7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKCJiYWQgZWxlbWVudCBjb3VudCIsIDEsIG51bGxDb3VudCk7Ci0JCWFzc2VydEVxdWFscygiYmFkIGVsZW1lbnQgY291bnQiLCAxLCBvbmVDb3VudCk7Ci0JCWFzc2VydEVxdWFscygiYmFkIGVsZW1lbnQgY291bnQiLCAyLCB0d29Db3VudCk7Ci0JCWFzc2VydEVxdWFscygiYmFkIGVsZW1lbnQgY291bnQiLCAzLCB0aHJlZUNvdW50KTsKLQkJYXNzZXJ0RXF1YWxzKCJiYWQgZWxlbWVudCBjb3VudCIsIDQsIGZvdXJDb3VudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvQXJyYXkoKSB7Ci0JCU9iamVjdFtdIGEgPSB0aGlzLmJhZy50b0FycmF5KCk7Ci0JCWFzc2VydEVxdWFscygiaW5jb3JyZWN0IGxlbmd0aCIsIDExLCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoIm1pc3NpbmcgZWxlbWVudCIsIENvbGxlY3Rpb25Ub29scy5jb250YWlucyhhLCBudWxsKSk7Ci0JCWFzc2VydFRydWUoIm1pc3NpbmcgZWxlbWVudCIsIENvbGxlY3Rpb25Ub29scy5jb250YWlucyhhLCAib25lIikpOwotCQlhc3NlcnRUcnVlKCJtaXNzaW5nIGVsZW1lbnQiLCBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYSwgInR3byIpKTsKLQkJYXNzZXJ0VHJ1ZSgibWlzc2luZyBlbGVtZW50IiwgQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsICJ0aHJlZSIpKTsKLQkJYXNzZXJ0VHJ1ZSgibWlzc2luZyBlbGVtZW50IiwgQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsICJmb3VyIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUb0FycmF5T2JqZWN0QXJyYXkoKSB7Ci0JCVN0cmluZ1tdIGEgPSBuZXcgU3RyaW5nWzEyXTsKLQkJYVsxMV0gPSAibm90IG51bGwiOwotCQlTdHJpbmdbXSBiID0gdGhpcy5iYWcudG9BcnJheShhKTsKLQkJYXNzZXJ0RXF1YWxzKCJkaWZmZXJlbnQgYXJyYXkiLCBhLCBiKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbmNvcnJlY3QgbGVuZ3RoIiwgMTIsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZSgibWlzc2luZyBlbGVtZW50IiwgQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsIG51bGwpKTsKLQkJYXNzZXJ0VHJ1ZSgibWlzc2luZyBlbGVtZW50IiwgQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGEsICJvbmUiKSk7Ci0JCWFzc2VydFRydWUoIm1pc3NpbmcgZWxlbWVudCIsIENvbGxlY3Rpb25Ub29scy5jb250YWlucyhhLCAidHdvIikpOwotCQlhc3NlcnRUcnVlKCJtaXNzaW5nIGVsZW1lbnQiLCBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYSwgInRocmVlIikpOwotCQlhc3NlcnRUcnVlKCJtaXNzaW5nIGVsZW1lbnQiLCBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYSwgImZvdXIiKSk7Ci0JCWFzc2VydFRydWUoIm1pc3NpbmcgbnVsbCBlbGVtZW50IiwgYVsxMV0gPT0gbnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewotCQlTdHJpbmcgcyA9IHRoaXMuYmFnLnRvU3RyaW5nKCk7Ci0JCWFzc2VydFRydWUoImludmFsaWQgc3RyaW5nIHByZWZpeCIsIHMuc3RhcnRzV2l0aCgiWyIpKTsKLQkJYXNzZXJ0VHJ1ZSgiaW52YWxpZCBzdHJpbmcgc3VmZml4Iiwgcy5lbmRzV2l0aCgiXSIpKTsKLQkJaW50IGNvbW1hQ291bnQgPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHMubGVuZ3RoKCk7IGkrKykgewotCQkJaWYgKHMuY2hhckF0KGkpID09ICcsJykgewotCQkJCWNvbW1hQ291bnQrKzsKLQkJCX0KLQkJfQotCQlhc3NlcnRFcXVhbHMoImludmFsaWQgbnVtYmVyIG9mIGNvbW1hcyIsIDEwLCBjb21tYUNvdW50KTsKLQkJYXNzZXJ0VHJ1ZSgibWlzc2luZyBlbGVtZW50IHRvU3RyaW5nKCkiLCBzLmluZGV4T2YoIm9uZSIpICE9IC0xKTsKLQkJYXNzZXJ0VHJ1ZSgibWlzc2luZyBlbGVtZW50IHRvU3RyaW5nKCkiLCBzLmluZGV4T2YoInR3byIpICE9IC0xKTsKLQkJYXNzZXJ0VHJ1ZSgibWlzc2luZyBlbGVtZW50IHRvU3RyaW5nKCkiLCBzLmluZGV4T2YoInRocmVlIikgIT0gLTEpOwotCQlhc3NlcnRUcnVlKCJtaXNzaW5nIGVsZW1lbnQgdG9TdHJpbmcoKSIsIHMuaW5kZXhPZigiZm91ciIpICE9IC0xKTsKLQkJYXNzZXJ0VHJ1ZSgibWlzc2luZyBlbGVtZW50IHRvU3RyaW5nKCkiLCBzLmluZGV4T2YoIm51bGwiKSAhPSAtMSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0luZGVudGluZ1ByaW50V3JpdGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvSW5kZW50aW5nUHJpbnRXcml0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTYyMTMyLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvSW5kZW50aW5nUHJpbnRXcml0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuSW5kZW50aW5nUHJpbnRXcml0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBJbmRlbnRpbmdQcmludFdyaXRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCVN0cmluZ1dyaXRlciBzdzE7Ci0JU3RyaW5nV3JpdGVyIHN3MjsKLQlJbmRlbnRpbmdQcmludFdyaXRlciBpcHcxOwotCUluZGVudGluZ1ByaW50V3JpdGVyIGlwdzI7Ci0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIENSID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOwotCi0JcHVibGljIEluZGVudGluZ1ByaW50V3JpdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5zdzEgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCXRoaXMuaXB3MSA9IG5ldyBJbmRlbnRpbmdQcmludFdyaXRlcih0aGlzLnN3MSk7Ci0JCXRoaXMuc3cyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQl0aGlzLmlwdzIgPSBuZXcgSW5kZW50aW5nUHJpbnRXcml0ZXIodGhpcy5zdzIsICIgICAgIik7IC8vIGluZGVudCB3aXRoIDQgc3BhY2VzIGluc3RlYWQgb2YgYSB0YWIKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluZGVudCgpIHsKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBpbmRlbnQgbGV2ZWwiLCAwLCB0aGlzLmlwdzEuZ2V0SW5kZW50TGV2ZWwoKSk7Ci0JCXRoaXMuaXB3MS5pbmRlbnQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBpbmRlbnQgbGV2ZWwiLCAxLCB0aGlzLmlwdzEuZ2V0SW5kZW50TGV2ZWwoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuZGVudCgpIHsKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBpbmRlbnQgbGV2ZWwiLCAwLCB0aGlzLmlwdzEuZ2V0SW5kZW50TGV2ZWwoKSk7Ci0JCXRoaXMuaXB3MS5pbmRlbnQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBpbmRlbnQgbGV2ZWwiLCAxLCB0aGlzLmlwdzEuZ2V0SW5kZW50TGV2ZWwoKSk7Ci0JCXRoaXMuaXB3MS51bmRlbnQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBpbmRlbnQgbGV2ZWwiLCAwLCB0aGlzLmlwdzEuZ2V0SW5kZW50TGV2ZWwoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluY3JlbWVudEluZGVudExldmVsKCkgewotCQlhc3NlcnRFcXVhbHMoIndyb25nIGluZGVudCBsZXZlbCIsIDAsIHRoaXMuaXB3MS5nZXRJbmRlbnRMZXZlbCgpKTsKLQkJdGhpcy5pcHcxLmluY3JlbWVudEluZGVudExldmVsKCk7Ci0JCWFzc2VydEVxdWFscygid3JvbmcgaW5kZW50IGxldmVsIiwgMSwgdGhpcy5pcHcxLmdldEluZGVudExldmVsKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZWNyZW1lbnRJbmRlbnRMZXZlbCgpIHsKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBpbmRlbnQgbGV2ZWwiLCAwLCB0aGlzLmlwdzEuZ2V0SW5kZW50TGV2ZWwoKSk7Ci0JCXRoaXMuaXB3MS5pbmNyZW1lbnRJbmRlbnRMZXZlbCgpOwotCQlhc3NlcnRFcXVhbHMoIndyb25nIGluZGVudCBsZXZlbCIsIDEsIHRoaXMuaXB3MS5nZXRJbmRlbnRMZXZlbCgpKTsKLQkJdGhpcy5pcHcxLmRlY3JlbWVudEluZGVudExldmVsKCk7Ci0JCWFzc2VydEVxdWFscygid3JvbmcgaW5kZW50IGxldmVsIiwgMCwgdGhpcy5pcHcxLmdldEluZGVudExldmVsKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcmludFRhYigpIHsKLQkJU3RyaW5nIGV4cGVjdGVkID0gImZvbzAiICsgQ1IgKyAiXHRmb28xIiArIENSICsgIlx0Zm9vMSIgKyBDUiArICJcdFx0Zm9vMiIgKyBDUiArICJcdGZvbzEiICsgQ1IgKyAiXHRmb28xIiArIENSICsgImZvbzAiICsgQ1I7Ci0KLQkJdGhpcy5pcHcxLnByaW50bG4oImZvbzAiKTsKLQkJdGhpcy5pcHcxLmluZGVudCgpOwotCQl0aGlzLmlwdzEucHJpbnRsbigiZm9vMSIpOwotCQl0aGlzLmlwdzEucHJpbnRsbigiZm9vMSIpOwotCQl0aGlzLmlwdzEuaW5kZW50KCk7Ci0JCXRoaXMuaXB3MS5wcmludGxuKCJmb28yIik7Ci0JCXRoaXMuaXB3MS51bmRlbnQoKTsKLQkJdGhpcy5pcHcxLnByaW50bG4oImZvbzEiKTsKLQkJdGhpcy5pcHcxLnByaW50bG4oImZvbzEiKTsKLQkJdGhpcy5pcHcxLnVuZGVudCgpOwotCQl0aGlzLmlwdzEucHJpbnRsbigiZm9vMCIpOwotCi0JCWFzc2VydEVxdWFscygiYm9ndXMgb3V0cHV0IiwgZXhwZWN0ZWQsIHRoaXMuc3cxLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcmludFNwYWNlcygpIHsKLQkJU3RyaW5nIGV4cGVjdGVkID0gImZvbzAiICsgQ1IgKyAiICAgIGZvbzEiICsgQ1IgKyAiICAgIGZvbzEiICsgQ1IgKyAiICAgICAgICBmb28yIiArIENSICsgIiAgICBmb28xIiArIENSICsgIiAgICBmb28xIiArIENSICsgImZvbzAiICsgQ1I7Ci0KLQkJdGhpcy5pcHcyLnByaW50bG4oImZvbzAiKTsKLQkJdGhpcy5pcHcyLmluZGVudCgpOwotCQl0aGlzLmlwdzIucHJpbnRsbigiZm9vMSIpOwotCQl0aGlzLmlwdzIucHJpbnRsbigiZm9vMSIpOwotCQl0aGlzLmlwdzIuaW5kZW50KCk7Ci0JCXRoaXMuaXB3Mi5wcmludGxuKCJmb28yIik7Ci0JCXRoaXMuaXB3Mi51bmRlbnQoKTsKLQkJdGhpcy5pcHcyLnByaW50bG4oImZvbzEiKTsKLQkJdGhpcy5pcHcyLnByaW50bG4oImZvbzEiKTsKLQkJdGhpcy5pcHcyLnVuZGVudCgpOwotCQl0aGlzLmlwdzIucHJpbnRsbigiZm9vMCIpOwotCi0JCWFzc2VydEVxdWFscygiYm9ndXMgb3V0cHV0IiwgZXhwZWN0ZWQsIHRoaXMuc3cyLnRvU3RyaW5nKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9KREJDVHlwZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0pEQkNUeXBlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBmMTUyZC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0pEQkNUeXBlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnNxbC5UeXBlczsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuSkRCQ1R5cGU7Ci0KLXB1YmxpYyBjbGFzcyBKREJDVHlwZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIEpEQkNUeXBlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFR5cGVzU2l6ZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKFR5cGVzLmNsYXNzLmdldERlY2xhcmVkRmllbGRzKCkubGVuZ3RoLCBKREJDVHlwZS50eXBlcygpLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5hbWUoKSB7Ci0JCUpEQkNUeXBlIGpkYmNUeXBlOwotCQlqZGJjVHlwZSA9IEpEQkNUeXBlLnR5cGUoVHlwZXMuVkFSQ0hBUik7Ci0JCWFzc2VydEVxdWFscygiVkFSQ0hBUiIsIGpkYmNUeXBlLmdldE5hbWUoKSk7Ci0KLQkJamRiY1R5cGUgPSBKREJDVHlwZS50eXBlKFR5cGVzLklOVEVHRVIpOwotCQlhc3NlcnRFcXVhbHMoIklOVEVHRVIiLCBqZGJjVHlwZS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2RlKCkgewotCQlKREJDVHlwZSBqZGJjVHlwZTsKLQkJamRiY1R5cGUgPSBKREJDVHlwZS50eXBlKFR5cGVzLlZBUkNIQVIpOwotCQlhc3NlcnRFcXVhbHMoVHlwZXMuVkFSQ0hBUiwgamRiY1R5cGUuZ2V0Q29kZSgpKTsKLQotCQlqZGJjVHlwZSA9IEpEQkNUeXBlLnR5cGUoVHlwZXMuSU5URUdFUik7Ci0JCWFzc2VydEVxdWFscyhUeXBlcy5JTlRFR0VSLCBqZGJjVHlwZS5nZXRDb2RlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkVHlwZUNvZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJSkRCQ1R5cGUgamRiY1R5cGUgPSBKREJDVHlwZS50eXBlKDU1KTsKLQkJCWZhaWwoImludmFsaWQgSkRCQ1R5cGU6ICIgKyBqZGJjVHlwZSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkVHlwZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJSkRCQ1R5cGUgamRiY1R5cGUgPSBKREJDVHlwZS50eXBlKCJWQVJDSEFSMiIpOwotCQkJZmFpbCgiaW52YWxpZCBKREJDVHlwZTogIiArIGpkYmNUeXBlKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0phdmFUeXBlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvSmF2YVR5cGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTBjMGI4Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvSmF2YVR5cGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuSmF2YVR5cGU7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhVHlwZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIEphdmFUeXBlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRFbGVtZW50VHlwZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJSmF2YVR5cGUgamF2YVR5cGUgPSBuZXcgSmF2YVR5cGUobnVsbCwgMCk7Ci0JCQlmYWlsKCJpbnZhbGlkIEphdmFUeXBlOiAiICsgamF2YVR5cGUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZEVsZW1lbnRUeXBlRW1wdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJSmF2YVR5cGUgamF2YVR5cGUgPSBuZXcgSmF2YVR5cGUoIiIsIDApOwotCQkJZmFpbCgiaW52YWxpZCBKYXZhVHlwZTogIiArIGphdmFUeXBlKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRFbGVtZW50VHlwZUFycmF5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUphdmFUeXBlIGphdmFUeXBlID0gbmV3IEphdmFUeXBlKGphdmEubGFuZy5PYmplY3RbXS5jbGFzcy5nZXROYW1lKCksIDApOwotCQkJZmFpbCgiaW52YWxpZCBKYXZhVHlwZTogIiArIGphdmFUeXBlKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRBcnJheURlcHRoTmVnYXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJSmF2YVR5cGUgamF2YVR5cGUgPSBuZXcgSmF2YVR5cGUoamF2YS5sYW5nLk9iamVjdC5jbGFzcy5nZXROYW1lKCksIC0yKTsKLQkJCWZhaWwoImludmFsaWQgSmF2YVR5cGU6ICIgKyBqYXZhVHlwZSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkVm9pZEFycmF5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUphdmFUeXBlIGphdmFUeXBlID0gbmV3IEphdmFUeXBlKHZvaWQuY2xhc3MuZ2V0TmFtZSgpLCAyKTsKLQkJCWZhaWwoImludmFsaWQgSmF2YVR5cGU6ICIgKyBqYXZhVHlwZSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbGVtZW50VHlwZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSmF2YVR5cGUgamF2YVR5cGU7Ci0JCWphdmFUeXBlID0gbmV3IEphdmFUeXBlKGphdmEubGFuZy5PYmplY3QuY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5PYmplY3QiLCBqYXZhVHlwZS5nZXRFbGVtZW50VHlwZU5hbWUoKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgSmF2YVR5cGUoamF2YS5sYW5nLk9iamVjdFtdLmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuT2JqZWN0IiwgamF2YVR5cGUuZ2V0RWxlbWVudFR5cGVOYW1lKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IEphdmFUeXBlKGludC5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgamF2YVR5cGUuZ2V0RWxlbWVudFR5cGVOYW1lKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IEphdmFUeXBlKGludFtdLmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCBqYXZhVHlwZS5nZXRFbGVtZW50VHlwZU5hbWUoKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgSmF2YVR5cGUodm9pZC5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygidm9pZCIsIGphdmFUeXBlLmdldEVsZW1lbnRUeXBlTmFtZSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBKYXZhVHlwZShqYXZhLnV0aWwuTWFwLkVudHJ5LmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLnV0aWwuTWFwJEVudHJ5IiwgamF2YVR5cGUuZ2V0RWxlbWVudFR5cGVOYW1lKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IEphdmFUeXBlKGphdmEudXRpbC5NYXAuRW50cnlbXVtdLmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLnV0aWwuTWFwJEVudHJ5IiwgamF2YVR5cGUuZ2V0RWxlbWVudFR5cGVOYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheURlcHRoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUphdmFUeXBlIGphdmFUeXBlOwotCQlqYXZhVHlwZSA9IG5ldyBKYXZhVHlwZShqYXZhLmxhbmcuT2JqZWN0LmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGphdmFUeXBlLmdldEFycmF5RGVwdGgoKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgSmF2YVR5cGUoamF2YS5sYW5nLk9iamVjdFtdLmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGphdmFUeXBlLmdldEFycmF5RGVwdGgoKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgSmF2YVR5cGUoaW50LmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGphdmFUeXBlLmdldEFycmF5RGVwdGgoKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgSmF2YVR5cGUoaW50W10uY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoMSwgamF2YVR5cGUuZ2V0QXJyYXlEZXB0aCgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBKYXZhVHlwZSh2b2lkLmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGphdmFUeXBlLmdldEFycmF5RGVwdGgoKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgSmF2YVR5cGUoamF2YS51dGlsLk1hcC5FbnRyeS5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygwLCBqYXZhVHlwZS5nZXRBcnJheURlcHRoKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IEphdmFUeXBlKGphdmEudXRpbC5NYXAuRW50cnlbXVtdLmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGphdmFUeXBlLmdldEFycmF5RGVwdGgoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzQXJyYXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSmF2YVR5cGUgamF2YVR5cGU7Ci0JCWphdmFUeXBlID0gbmV3IEphdmFUeXBlKGphdmEubGFuZy5PYmplY3QuY2xhc3MpOwotCQlhc3NlcnRGYWxzZShqYXZhVHlwZS5pc0FycmF5KCkpOwotCi0JCWphdmFUeXBlID0gbmV3IEphdmFUeXBlKGphdmEubGFuZy5PYmplY3RbXS5jbGFzcyk7Ci0JCWFzc2VydFRydWUoamF2YVR5cGUuaXNBcnJheSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBKYXZhVHlwZShpbnQuY2xhc3MpOwotCQlhc3NlcnRGYWxzZShqYXZhVHlwZS5pc0FycmF5KCkpOwotCi0JCWphdmFUeXBlID0gbmV3IEphdmFUeXBlKGludFtdLmNsYXNzKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhVHlwZS5pc0FycmF5KCkpOwotCi0JCWphdmFUeXBlID0gbmV3IEphdmFUeXBlKHZvaWQuY2xhc3MpOwotCQlhc3NlcnRGYWxzZShqYXZhVHlwZS5pc0FycmF5KCkpOwotCi0JCWphdmFUeXBlID0gbmV3IEphdmFUeXBlKGphdmEudXRpbC5NYXAuRW50cnkuY2xhc3MpOwotCQlhc3NlcnRGYWxzZShqYXZhVHlwZS5pc0FycmF5KCkpOwotCi0JCWphdmFUeXBlID0gbmV3IEphdmFUeXBlKGphdmEudXRpbC5NYXAuRW50cnlbXVtdLmNsYXNzKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhVHlwZS5pc0FycmF5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RKYXZhQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlKYXZhQ2xhc3MoamF2YS5sYW5nLk9iamVjdC5jbGFzcyk7Ci0JCXRoaXMudmVyaWZ5SmF2YUNsYXNzKGphdmEubGFuZy5PYmplY3RbXS5jbGFzcyk7Ci0JCXRoaXMudmVyaWZ5SmF2YUNsYXNzKGludC5jbGFzcyk7Ci0JCXRoaXMudmVyaWZ5SmF2YUNsYXNzKGludFtdLmNsYXNzKTsKLQkJdGhpcy52ZXJpZnlKYXZhQ2xhc3Modm9pZC5jbGFzcyk7Ci0JCXRoaXMudmVyaWZ5SmF2YUNsYXNzKGphdmEudXRpbC5NYXAuRW50cnkuY2xhc3MpOwotCQl0aGlzLnZlcmlmeUphdmFDbGFzcyhqYXZhLnV0aWwuTWFwLkVudHJ5W11bXS5jbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUphdmFDbGFzcyhDbGFzczw/PiBqYXZhQ2xhc3MpIHRocm93cyBFeGNlcHRpb24gewotCQlKYXZhVHlwZSBqYXZhVHlwZSA9IG5ldyBKYXZhVHlwZShqYXZhQ2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoamF2YUNsYXNzLCBqYXZhVHlwZS5qYXZhQ2xhc3MoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEphdmFDbGFzc05hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSmF2YVR5cGUgamF2YVR5cGU7Ci0JCWphdmFUeXBlID0gbmV3IEphdmFUeXBlKGphdmEubGFuZy5PYmplY3QuY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5PYmplY3QiLCBqYXZhVHlwZS5qYXZhQ2xhc3NOYW1lKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IEphdmFUeXBlKGphdmEubGFuZy5PYmplY3RbXS5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiW0xqYXZhLmxhbmcuT2JqZWN0OyIsIGphdmFUeXBlLmphdmFDbGFzc05hbWUoKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgSmF2YVR5cGUoaW50LmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCBqYXZhVHlwZS5qYXZhQ2xhc3NOYW1lKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IEphdmFUeXBlKGludFtdLmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCJbSSIsIGphdmFUeXBlLmphdmFDbGFzc05hbWUoKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgSmF2YVR5cGUodm9pZC5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygidm9pZCIsIGphdmFUeXBlLmphdmFDbGFzc05hbWUoKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgSmF2YVR5cGUoamF2YS51dGlsLk1hcC5FbnRyeS5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiamF2YS51dGlsLk1hcCRFbnRyeSIsIGphdmFUeXBlLmphdmFDbGFzc05hbWUoKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgSmF2YVR5cGUoamF2YS51dGlsLk1hcC5FbnRyeVtdW10uY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoIltbTGphdmEudXRpbC5NYXAkRW50cnk7IiwgamF2YVR5cGUuamF2YUNsYXNzTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVzY3JpYmVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5RGVzY3JpYmVzKGphdmEubGFuZy5PYmplY3QuY2xhc3MpOwotCQl0aGlzLnZlcmlmeURlc2NyaWJlcyhqYXZhLmxhbmcuT2JqZWN0W10uY2xhc3MpOwotCQl0aGlzLnZlcmlmeURlc2NyaWJlcyhpbnQuY2xhc3MpOwotCQl0aGlzLnZlcmlmeURlc2NyaWJlcyhpbnRbXS5jbGFzcyk7Ci0JCXRoaXMudmVyaWZ5RGVzY3JpYmVzKHZvaWQuY2xhc3MpOwotCQl0aGlzLnZlcmlmeURlc2NyaWJlcyhqYXZhLnV0aWwuTWFwLkVudHJ5LmNsYXNzKTsKLQkJdGhpcy52ZXJpZnlEZXNjcmliZXMoamF2YS51dGlsLk1hcC5FbnRyeVtdW10uY2xhc3MpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlEZXNjcmliZXMoQ2xhc3M8Pz4gamF2YUNsYXNzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSmF2YVR5cGUgamF2YVR5cGUgPSBuZXcgSmF2YVR5cGUoamF2YUNsYXNzKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhVHlwZS5kZXNjcmliZXMoamF2YUNsYXNzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlY2xhcmF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUphdmFUeXBlIGphdmFUeXBlOwotCQlqYXZhVHlwZSA9IG5ldyBKYXZhVHlwZShqYXZhLmxhbmcuT2JqZWN0LmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuT2JqZWN0IiwgamF2YVR5cGUuZGVjbGFyYXRpb24oKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgSmF2YVR5cGUoamF2YS5sYW5nLk9iamVjdFtdLmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuT2JqZWN0W10iLCBqYXZhVHlwZS5kZWNsYXJhdGlvbigpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBKYXZhVHlwZShpbnQuY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIGphdmFUeXBlLmRlY2xhcmF0aW9uKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IEphdmFUeXBlKGludFtdLmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnRbXSIsIGphdmFUeXBlLmRlY2xhcmF0aW9uKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IEphdmFUeXBlKHZvaWQuY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoInZvaWQiLCBqYXZhVHlwZS5kZWNsYXJhdGlvbigpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBKYXZhVHlwZShqYXZhLnV0aWwuTWFwLkVudHJ5LmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLnV0aWwuTWFwLkVudHJ5IiwgamF2YVR5cGUuZGVjbGFyYXRpb24oKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgSmF2YVR5cGUoamF2YS51dGlsLk1hcC5FbnRyeVtdW10uY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoImphdmEudXRpbC5NYXAuRW50cnlbXVtdIiwgamF2YVR5cGUuZGVjbGFyYXRpb24oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzUHJpbWl0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUphdmFUeXBlIGphdmFUeXBlOwotCQlqYXZhVHlwZSA9IG5ldyBKYXZhVHlwZShqYXZhLmxhbmcuT2JqZWN0LmNsYXNzKTsKLQkJYXNzZXJ0RmFsc2UoamF2YVR5cGUuaXNQcmltaXRpdmUoKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgSmF2YVR5cGUoamF2YS5sYW5nLk9iamVjdFtdLmNsYXNzKTsKLQkJYXNzZXJ0RmFsc2UoamF2YVR5cGUuaXNQcmltaXRpdmUoKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgSmF2YVR5cGUoaW50LmNsYXNzKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhVHlwZS5pc1ByaW1pdGl2ZSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBKYXZhVHlwZShpbnRbXS5jbGFzcyk7Ci0JCWFzc2VydEZhbHNlKGphdmFUeXBlLmlzUHJpbWl0aXZlKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IEphdmFUeXBlKHZvaWQuY2xhc3MpOwotCQlhc3NlcnRUcnVlKGphdmFUeXBlLmlzUHJpbWl0aXZlKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IEphdmFUeXBlKGphdmEudXRpbC5NYXAuRW50cnkuY2xhc3MpOwotCQlhc3NlcnRGYWxzZShqYXZhVHlwZS5pc1ByaW1pdGl2ZSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBKYXZhVHlwZShqYXZhLnV0aWwuTWFwLkVudHJ5W11bXS5jbGFzcyk7Ci0JCWFzc2VydEZhbHNlKGphdmFUeXBlLmlzUHJpbWl0aXZlKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9KcHRVdGlsaXR5VGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvSnB0VXRpbGl0eVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyMTQzZjMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9KcHRVdGlsaXR5VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNsYXNzVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmF0b3JzLkpwdFV0aWxpdHlJdGVyYXRvcnNUZXN0czsKLQotLyoqCi0gKiBkZWNlbnRyYWxpemUgdGVzdCBjcmVhdGlvbiBjb2RlCi0gKi8KLXB1YmxpYyBjbGFzcyBKcHRVdGlsaXR5VGVzdHMgewotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKENsYXNzVG9vbHMucGFja2FnZU5hbWVGb3IoSnB0VXRpbGl0eVRlc3RzLmNsYXNzKSk7Ci0KLQkJc3VpdGUuYWRkVGVzdChKcHRVdGlsaXR5SXRlcmF0b3JzVGVzdHMuc3VpdGUoKSk7Ci0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEJpdFRvb2xzVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ2xhc3NwYXRoVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ2xhc3NUb29sc1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENvbGxlY3Rpb25Ub29sc1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEZpbGVUb29sc1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEhhc2hCYWdUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShJbmRlbnRpbmdQcmludFdyaXRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEphdmFUeXBlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSkRCQ1R5cGVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShOYW1lVG9vbHNUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShSZXZlcnNlQ29tcGFyYXRvclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFN0cmluZ1Rvb2xzVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoWE1MU3RyaW5nRW5jb2RlclRlc3RzLmNsYXNzKTsKLQotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi0JcHJpdmF0ZSBKcHRVdGlsaXR5VGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9OYW1lVG9vbHNUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9OYW1lVG9vbHNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjRmYTQ5Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvTmFtZVRvb2xzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLk5hbWVUb29sczsKLQotcHVibGljIGNsYXNzIE5hbWVUb29sc1Rlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIE5hbWVUb29sc1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdBYnNlbnRJZ25vcmVDYXNlKCkgewotCQlMaXN0PFN0cmluZz4gY29sb3JDb2xsZWN0aW9uID0gdGhpcy5idWlsZENvbG9yQ29sbGVjdGlvbigpOwotCQlTdHJpbmcgcmV0dXJuZWQgPSBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcklnbm9yZUNhc2UoIlRhdXBlIiwgY29sb3JDb2xsZWN0aW9uKTsKLQkJYXNzZXJ0RXF1YWxzKCJUYXVwZSIsIHJldHVybmVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nUHJlc2VudENhc2VEaWZmZXJzKCkgewotCQlMaXN0PFN0cmluZz4gY29sb3JDb2xsZWN0aW9uID0gdGhpcy5idWlsZENvbG9yQ29sbGVjdGlvbigpOwotCQlTdHJpbmcgcmV0dXJuZWQgPSBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcigiZ3JlZW4iLCBjb2xvckNvbGxlY3Rpb24pOwotCQlhc3NlcnRFcXVhbHMoImdyZWVuIiwgcmV0dXJuZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdQcmVzZW50SWdub3JlQ2FzZSgpIHsKLQkJTGlzdDxTdHJpbmc+IGNvbG9yQ29sbGVjdGlvbiA9IHRoaXMuYnVpbGRDb2xvckNvbGxlY3Rpb24oKTsKLQkJU3RyaW5nIHJldHVybmVkID0gTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3JJZ25vcmVDYXNlKCJncmVlbiIsIGNvbG9yQ29sbGVjdGlvbik7Ci0JCWFzc2VydEVxdWFscygiZ3JlZW4yIiwgcmV0dXJuZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdQcmVzZW50V2l0aEFwcGVuZGljZXMoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBjb2xvckNvbGxlY3Rpb24gPSB0aGlzLmJ1aWxkQ29sb3JDb2xsZWN0aW9uKCk7Ci0JCWNvbG9yQ29sbGVjdGlvbi5hZGQoIlJlZDEiKTsKLQkJY29sb3JDb2xsZWN0aW9uLmFkZCgicmVkMiIpOwotCQlTdHJpbmcgcmV0dXJuZWQgPSBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcklnbm9yZUNhc2UoInJlZCIsIGNvbG9yQ29sbGVjdGlvbik7Ci0JCWNvbG9yQ29sbGVjdGlvbi5yZW1vdmUoIlJlZDEiKTsKLQkJY29sb3JDb2xsZWN0aW9uLnJlbW92ZSgicmVkMiIpOwotCQlhc3NlcnRFcXVhbHMoInJlZDMiLCByZXR1cm5lZCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGRDb2xvckNvbGxlY3Rpb24oKSB7Ci0JCUxpc3Q8U3RyaW5nPiBjb2xvckNvbGxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJY29sb3JDb2xsZWN0aW9uLmFkZCgiUmVkIik7Ci0JCWNvbG9yQ29sbGVjdGlvbi5hZGQoIk9yYW5nZSIpOwotCQljb2xvckNvbGxlY3Rpb24uYWRkKCJZZWxsb3ciKTsKLQkJY29sb3JDb2xsZWN0aW9uLmFkZCgiR3JlZW4iKTsKLQkJY29sb3JDb2xsZWN0aW9uLmFkZCgiQmx1ZSIpOwotCQljb2xvckNvbGxlY3Rpb24uYWRkKCJJbmRpZ28iKTsKLQkJY29sb3JDb2xsZWN0aW9uLmFkZCgiVmlvbGV0Iik7Ci0JCXJldHVybiBjb2xvckNvbGxlY3Rpb247Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuaXF1ZU5hbWVGb3JDb2xsZWN0aW9uMSgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IHN0cmluZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJc3RyaW5ncy5hZGQoIk9yYWNsZSIpOwotCQlzdHJpbmdzLmFkZCgiT3JhY2xlIENvcnBvcmF0aW9uIik7Ci0JCXN0cmluZ3MuYWRkKCJPcmFjbGUyIik7Ci0JCXN0cmluZ3MuYWRkKCJvcmFjbGUxIik7Ci0JCXN0cmluZ3MuYWRkKCJPcmFjbCIpOwotCi0JCWFzc2VydEVxdWFscygiT3JhY2xlMyIsIE5hbWVUb29scy51bmlxdWVOYW1lRm9yKCJPcmFjbGUiLCBzdHJpbmdzKSk7Ci0JCWFzc2VydEVxdWFscygiVGVzdCIsIE5hbWVUb29scy51bmlxdWVOYW1lRm9yKCJUZXN0Iiwgc3RyaW5ncykpOwotCi0JCWFzc2VydEVxdWFscygiT3JhY2xlMyIsIE5hbWVUb29scy51bmlxdWVOYW1lRm9ySWdub3JlQ2FzZSgiT3JhY2xlIiwgc3RyaW5ncykpOwotCQlhc3NlcnRFcXVhbHMoIm9yYWNsZTMiLCBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcklnbm9yZUNhc2UoIm9yYWNsZSIsIHN0cmluZ3MpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUZXN0IiwgTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3JJZ25vcmVDYXNlKCJUZXN0Iiwgc3RyaW5ncykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmlxdWVOYW1lRm9yQ29sbGVjdGlvbjIoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBzdHJpbmdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXN0cmluZ3MuYWRkKCJPcmFjbGUiKTsKLQkJc3RyaW5ncy5hZGQoIm9yYWNsZSIpOwotCQlzdHJpbmdzLmFkZCgiT3JhY2xlMiIpOwotCQlzdHJpbmdzLmFkZCgiT3JhY2xlMSIpOwotCi0JCWFzc2VydEVxdWFscygiT3JhY2xlMyIsIE5hbWVUb29scy51bmlxdWVOYW1lRm9yKCJPcmFjbGUiLCBzdHJpbmdzKSk7Ci0JCWFzc2VydEVxdWFscygiVGVzdCIsIE5hbWVUb29scy51bmlxdWVOYW1lRm9yKCJUZXN0Iiwgc3RyaW5ncykpOwotCi0JCXN0cmluZ3MuYWRkKCJPcmFjbGUgQ29ycG9yYXRpb24iKTsKLQkJYXNzZXJ0RXF1YWxzKCJPcmFjbGUzIiwgTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3JJZ25vcmVDYXNlKCJPcmFjbGUiLCBzdHJpbmdzKSk7Ci0JCWFzc2VydEVxdWFscygib3JhY2xlMyIsIE5hbWVUb29scy51bmlxdWVOYW1lRm9ySWdub3JlQ2FzZSgib3JhY2xlIiwgc3RyaW5ncykpOwotCQlhc3NlcnRFcXVhbHMoIlRlc3QiLCBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcklnbm9yZUNhc2UoIlRlc3QiLCBzdHJpbmdzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuaXF1ZU5hbWVGb3JDb2xsZWN0aW9uMygpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IHN0cmluZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJc3RyaW5ncy5hZGQoIk9yYWNsZSIpOwotCQlzdHJpbmdzLmFkZCgiT3JhY2xlIik7Ci0JCXN0cmluZ3MuYWRkKCJPcmFjbGUyIik7Ci0JCXN0cmluZ3MuYWRkKCJPcmFjbGUxIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJPcmFjbGUzIiwgTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3IoIk9yYWNsZSIsIHN0cmluZ3MpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlTmFtZUZvckl0ZXJhdG9yMSgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IHN0cmluZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJc3RyaW5ncy5hZGQoIk9yYWNsZSIpOwotCQlzdHJpbmdzLmFkZCgiT3JhY2xlIENvcnBvcmF0aW9uIik7Ci0JCXN0cmluZ3MuYWRkKCJPcmFjbGUyIik7Ci0JCXN0cmluZ3MuYWRkKCJvcmFjbGUxIik7Ci0JCXN0cmluZ3MuYWRkKCJPcmFjbCIpOwotCi0JCWFzc2VydEVxdWFscygiT3JhY2xlMyIsIE5hbWVUb29scy51bmlxdWVOYW1lRm9yKCJPcmFjbGUiLCBzdHJpbmdzLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUZXN0IiwgTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3IoIlRlc3QiLCBzdHJpbmdzLml0ZXJhdG9yKCkpKTsKLQotCQlhc3NlcnRFcXVhbHMoIk9yYWNsZTMiLCBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcklnbm9yZUNhc2UoIk9yYWNsZSIsIHN0cmluZ3MuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRFcXVhbHMoIm9yYWNsZTMiLCBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcklnbm9yZUNhc2UoIm9yYWNsZSIsIHN0cmluZ3MuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRFcXVhbHMoIlRlc3QiLCBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcklnbm9yZUNhc2UoIlRlc3QiLCBzdHJpbmdzLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlTmFtZUZvckl0ZXJhdG9yMigpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IHN0cmluZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJc3RyaW5ncy5hZGQoIk9yYWNsZSIpOwotCQlzdHJpbmdzLmFkZCgib3JhY2xlIik7Ci0JCXN0cmluZ3MuYWRkKCJPcmFjbGUyIik7Ci0JCXN0cmluZ3MuYWRkKCJPcmFjbGUxIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJPcmFjbGUzIiwgTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3IoIk9yYWNsZSIsIHN0cmluZ3MuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRFcXVhbHMoIlRlc3QiLCBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcigiVGVzdCIsIHN0cmluZ3MuaXRlcmF0b3IoKSkpOwotCi0JCXN0cmluZ3MuYWRkKCJPcmFjbGUgQ29ycG9yYXRpb24iKTsKLQkJYXNzZXJ0RXF1YWxzKCJPcmFjbGUzIiwgTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3JJZ25vcmVDYXNlKCJPcmFjbGUiLCBzdHJpbmdzLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJvcmFjbGUzIiwgTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3JJZ25vcmVDYXNlKCJvcmFjbGUiLCBzdHJpbmdzLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUZXN0IiwgTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3JJZ25vcmVDYXNlKCJUZXN0Iiwgc3RyaW5ncy5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuaXF1ZU5hbWVGb3JJdGVyYXRvcjMoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBzdHJpbmdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXN0cmluZ3MuYWRkKCJPcmFjbGUiKTsKLQkJc3RyaW5ncy5hZGQoIk9yYWNsZSIpOwotCQlzdHJpbmdzLmFkZCgiT3JhY2xlMiIpOwotCQlzdHJpbmdzLmFkZCgiT3JhY2xlMSIpOwotCi0JCWFzc2VydEVxdWFscygiT3JhY2xlMyIsIE5hbWVUb29scy51bmlxdWVOYW1lRm9yKCJPcmFjbGUiLCBzdHJpbmdzLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlSmF2YU5hbWVGb3JDb2xsZWN0aW9uKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gc3RyaW5ncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlzdHJpbmdzLmFkZCgiT3JhY2xlIik7Ci0JCXN0cmluZ3MuYWRkKCJPcmFjbGUiKTsKLQkJc3RyaW5ncy5hZGQoIk9yYWNsZTIiKTsKLQkJc3RyaW5ncy5hZGQoIk9yYWNsZTEiKTsKLQotCQlhc3NlcnRFcXVhbHMoInByaXZhdGUyIiwgTmFtZVRvb2xzLnVuaXF1ZUphdmFOYW1lRm9yKCJwcml2YXRlIiwgc3RyaW5ncy5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscygiY2xhc3MyIiwgTmFtZVRvb2xzLnVuaXF1ZUphdmFOYW1lRm9yKCJjbGFzcyIsIHN0cmluZ3MuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCdWlsZFF1YWxpZmllZERhdGFiYXNlT2JqZWN0TmFtZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKCJjYXRhbG9nLnNjaGVtYS5uYW1lIiwgTmFtZVRvb2xzLmJ1aWxkUXVhbGlmaWVkRGF0YWJhc2VPYmplY3ROYW1lKCJjYXRhbG9nIiwgInNjaGVtYSIsICJuYW1lIikpOwotCQlhc3NlcnRFcXVhbHMoImNhdGFsb2cuLm5hbWUiLCBOYW1lVG9vbHMuYnVpbGRRdWFsaWZpZWREYXRhYmFzZU9iamVjdE5hbWUoImNhdGFsb2ciLCBudWxsLCAibmFtZSIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzY2hlbWEubmFtZSIsIE5hbWVUb29scy5idWlsZFF1YWxpZmllZERhdGFiYXNlT2JqZWN0TmFtZShudWxsLCAic2NoZW1hIiwgIm5hbWUiKSk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIE5hbWVUb29scy5idWlsZFF1YWxpZmllZERhdGFiYXNlT2JqZWN0TmFtZShudWxsLCBudWxsLCAibmFtZSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SmF2YVJlc2VydmVkV29yZHMoKSB7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKE5hbWVUb29scy5qYXZhUmVzZXJ2ZWRXb3JkcygpLCAiY2xhc3MiKSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhOYW1lVG9vbHMuamF2YVJlc2VydmVkV29yZHMoKSwgIkNsYXNzIikpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhOYW1lVG9vbHMuamF2YVJlc2VydmVkV29yZHMoKSwgInByaXZhdGUiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdGNvbnZlcnRUb0phdmFJZGVudGlmaWVyU3RyaW5nKCkgewotCQlhc3NlcnRFcXVhbHMoImZvbyIsIE5hbWVUb29scy5jb252ZXJ0VG9KYXZhSWRlbnRpZmllcigiZm9vIikpOwotCQlhc3NlcnRFcXVhbHMoImZvbzEiLCBOYW1lVG9vbHMuY29udmVydFRvSmF2YUlkZW50aWZpZXIoImZvbzEiKSk7Ci0JCWFzc2VydEVxdWFscygiUHJpdmF0ZSIsIE5hbWVUb29scy5jb252ZXJ0VG9KYXZhSWRlbnRpZmllcigicHJpdmF0ZSIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJfZm9vIiwgTmFtZVRvb2xzLmNvbnZlcnRUb0phdmFJZGVudGlmaWVyKCIxZm9vIikpOwotCQlhc3NlcnRFcXVhbHMoImZvb18iLCBOYW1lVG9vbHMuY29udmVydFRvSmF2YUlkZW50aWZpZXIoImZvbyUiKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vX19iYXJfXyIsIE5hbWVUb29scy5jb252ZXJ0VG9KYXZhSWRlbnRpZmllcigiZm9vICBiYXIgICIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Y29udmVydFRvSmF2YUlkZW50aWZpZXJTdHJpbmdDaGFyKCkgewotCQlhc3NlcnRFcXVhbHMoImZvbyIsIE5hbWVUb29scy5jb252ZXJ0VG9KYXZhSWRlbnRpZmllcigiZm9vIiwgJyQnKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vMSIsIE5hbWVUb29scy5jb252ZXJ0VG9KYXZhSWRlbnRpZmllcigiZm9vMSIsICckJykpOwotCQlhc3NlcnRFcXVhbHMoIlByaXZhdGUiLCBOYW1lVG9vbHMuY29udmVydFRvSmF2YUlkZW50aWZpZXIoInByaXZhdGUiLCAnJCcpKTsKLQkJYXNzZXJ0RXF1YWxzKCIkZm9vIiwgTmFtZVRvb2xzLmNvbnZlcnRUb0phdmFJZGVudGlmaWVyKCIxZm9vIiwgJyQnKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vJCIsIE5hbWVUb29scy5jb252ZXJ0VG9KYXZhSWRlbnRpZmllcigiZm9vJSIsICckJykpOwotCQlhc3NlcnRFcXVhbHMoImZvbyQkYmFyJCQiLCBOYW1lVG9vbHMuY29udmVydFRvSmF2YUlkZW50aWZpZXIoImZvbyAgYmFyICAiLCAnJCcpKTsKLQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgcyA9IE5hbWVUb29scy5jb252ZXJ0VG9KYXZhSWRlbnRpZmllcigiMWZvbyIsICc3Jyk7Ci0JCQlmYWlsKCJpbnZhbGlkIHN0cmluZzogXCIiICsgcyArICJcIiIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWlmIChleC5nZXRNZXNzYWdlKCkuaW5kZXhPZignNycpICE9IC0xKSB7Ci0JCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCi0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgcyA9IE5hbWVUb29scy5jb252ZXJ0VG9KYXZhSWRlbnRpZmllcigiZm9vJSIsICdeJyk7Ci0JCQlmYWlsKCJpbnZhbGlkIHN0cmluZzogXCIiICsgcyArICJcIiIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWlmIChleC5nZXRNZXNzYWdlKCkuaW5kZXhPZignXicpICE9IC0xKSB7Ci0JCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1JhbmdlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvUmFuZ2VUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2YyY2NlLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvUmFuZ2VUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5SYW5nZTsKLQotcHVibGljIGNsYXNzIFJhbmdlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgUmFuZ2VUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5jbHVkZXMoKSB7Ci0JCVJhbmdlIHJhbmdlID0gbmV3IFJhbmdlKDUsIDE3KTsKLQkJYXNzZXJ0RmFsc2UocmFuZ2UuaW5jbHVkZXMoLTU1KSk7Ci0JCWFzc2VydEZhbHNlKHJhbmdlLmluY2x1ZGVzKDApKTsKLQkJYXNzZXJ0RmFsc2UocmFuZ2UuaW5jbHVkZXMoNCkpOwotCQlhc3NlcnRUcnVlKHJhbmdlLmluY2x1ZGVzKDUpKTsKLQkJYXNzZXJ0VHJ1ZShyYW5nZS5pbmNsdWRlcyg2KSk7Ci0JCWFzc2VydFRydWUocmFuZ2UuaW5jbHVkZXMoMTYpKTsKLQkJYXNzZXJ0VHJ1ZShyYW5nZS5pbmNsdWRlcygxNykpOwotCQlhc3NlcnRGYWxzZShyYW5nZS5pbmNsdWRlcygxOCkpOwotCQlhc3NlcnRGYWxzZShyYW5nZS5pbmNsdWRlcygyMDApKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzKCkgewotCQlSYW5nZSByYW5nZTEgPSBuZXcgUmFuZ2UoNSwgMTcpOwotCQlSYW5nZSByYW5nZTIgPSBuZXcgUmFuZ2UoNSwgMTcpOwotCQlhc3NlcnROb3RTYW1lKHJhbmdlMSwgcmFuZ2UyKTsKLQkJYXNzZXJ0RXF1YWxzKHJhbmdlMSwgcmFuZ2UxKTsKLQkJYXNzZXJ0RXF1YWxzKHJhbmdlMSwgcmFuZ2UyKTsKLQkJYXNzZXJ0RXF1YWxzKHJhbmdlMiwgcmFuZ2UxKTsKLQkJYXNzZXJ0RXF1YWxzKHJhbmdlMS5oYXNoQ29kZSgpLCByYW5nZTIuaGFzaENvZGUoKSk7Ci0KLQkJcmFuZ2UyID0gbmV3IFJhbmdlKDE3LCA1KTsKLQkJYXNzZXJ0RmFsc2UocmFuZ2UxLmVxdWFscyhyYW5nZTIpKTsKLQkJYXNzZXJ0RmFsc2UocmFuZ2UyLmVxdWFscyhyYW5nZTEpKTsKLQkJLy8gYWx0aG91Z2ggdGhleSBhcmUgdW5lcXVhbCwgdGhleSBjYW4gaGF2ZSB0aGUgc2FtZSBoYXNoIGNvZGUKLQkJYXNzZXJ0RXF1YWxzKHJhbmdlMS5oYXNoQ29kZSgpLCByYW5nZTIuaGFzaENvZGUoKSk7Ci0KLQkJcmFuZ2UyID0gbmV3IFJhbmdlKDUsIDE1KTsKLQkJYXNzZXJ0RmFsc2UocmFuZ2UxLmVxdWFscyhyYW5nZTIpKTsKLQkJYXNzZXJ0RmFsc2UocmFuZ2UyLmVxdWFscyhyYW5nZTEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xvbmUoKSB7Ci0JCVJhbmdlIHJhbmdlMSA9IG5ldyBSYW5nZSg1LCAxNyk7Ci0JCVJhbmdlIHJhbmdlMiA9IHJhbmdlMS5jbG9uZSgpOwotCQlhc3NlcnROb3RTYW1lKHJhbmdlMSwgcmFuZ2UyKTsKLQkJYXNzZXJ0RXF1YWxzKHJhbmdlMSwgcmFuZ2UxKTsKLQkJYXNzZXJ0RXF1YWxzKHJhbmdlMSwgcmFuZ2UyKTsKLQkJYXNzZXJ0RXF1YWxzKHJhbmdlMiwgcmFuZ2UxKTsKLQkJYXNzZXJ0RXF1YWxzKHJhbmdlMS5oYXNoQ29kZSgpLCByYW5nZTIuaGFzaENvZGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUmFuZ2UgcmFuZ2UxID0gbmV3IFJhbmdlKDUsIDE3KTsKLQkJUmFuZ2UgcmFuZ2UyID0gVGVzdFRvb2xzLnNlcmlhbGl6ZShyYW5nZTEpOwotCQlhc3NlcnROb3RTYW1lKHJhbmdlMSwgcmFuZ2UyKTsKLQkJYXNzZXJ0RXF1YWxzKHJhbmdlMSwgcmFuZ2UxKTsKLQkJYXNzZXJ0RXF1YWxzKHJhbmdlMSwgcmFuZ2UyKTsKLQkJYXNzZXJ0RXF1YWxzKHJhbmdlMiwgcmFuZ2UxKTsKLQkJYXNzZXJ0RXF1YWxzKHJhbmdlMS5oYXNoQ29kZSgpLCByYW5nZTIuaGFzaENvZGUoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1JldmVyc2VDb21wYXJhdG9yVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvUmV2ZXJzZUNvbXBhcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWUwMGZkLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvUmV2ZXJzZUNvbXBhcmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuUmV2ZXJzZUNvbXBhcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBSZXZlcnNlQ29tcGFyYXRvclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgQ29tcGFyYXRvcjxTdHJpbmc+IG5hdHVyYWxSZXZlcnNlQ29tcGFyYXRvcjsKLQlwcml2YXRlIENvbXBhcmF0b3I8U3RyaW5nPiBjdXN0b21Db21wYXJhdG9yOwotCXByaXZhdGUgQ29tcGFyYXRvcjxTdHJpbmc+IGN1c3RvbVJldmVyc2VDb21wYXJhdG9yOwotCi0JcHVibGljIFJldmVyc2VDb21wYXJhdG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5uYXR1cmFsUmV2ZXJzZUNvbXBhcmF0b3IgPSBuZXcgUmV2ZXJzZUNvbXBhcmF0b3I8U3RyaW5nPigpOwotCQl0aGlzLmN1c3RvbUNvbXBhcmF0b3IgPSB0aGlzLmJ1aWxkQ3VzdG9tQ29tcGFyYXRvcigpOwotCQl0aGlzLmN1c3RvbVJldmVyc2VDb21wYXJhdG9yID0gbmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4odGhpcy5jdXN0b21Db21wYXJhdG9yKTsKLQl9Ci0KLQlwcml2YXRlIENvbXBhcmF0b3I8U3RyaW5nPiBidWlsZEN1c3RvbUNvbXBhcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQ29tcGFyYXRvcjxTdHJpbmc+KCkgewotCQkJcHVibGljIGludCBjb21wYXJlKFN0cmluZyBzMSwgU3RyaW5nIHMyKSB7Ci0JCQkJU3RyaW5nIGxvd2VyMSA9IHMxLnRvTG93ZXJDYXNlKCk7Ci0JCQkJU3RyaW5nIGxvd2VyMiA9IHMyLnRvTG93ZXJDYXNlKCk7Ci0JCQkJaW50IHJlc3VsdCA9IGxvd2VyMS5jb21wYXJlVG8obG93ZXIyKTsKLQkJCQlpZiAocmVzdWx0ID09IDApIHsKLQkJCQkJcmV0dXJuIHMxLmNvbXBhcmVUbyhzMik7IC8vIHVzZSBjYXNlIHRvIGRpZmZlcmVudGlhdGUgImVxdWFsIiBzdHJpbmdzCi0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGRVbnNvcnRlZExpc3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJcmVzdWx0LmFkZCgiVCIpOwotCQlyZXN1bHQuYWRkKCJaIik7Ci0JCXJlc3VsdC5hZGQoIlkiKTsKLQkJcmVzdWx0LmFkZCgiTSIpOwotCQlyZXN1bHQuYWRkKCJtIik7Ci0JCXJlc3VsdC5hZGQoImEiKTsKLQkJcmVzdWx0LmFkZCgiQiIpOwotCQlyZXN1bHQuYWRkKCJiIik7Ci0JCXJlc3VsdC5hZGQoIkEiKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBidWlsZE5hdHVyYWxseVNvcnRlZExpc3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4odGhpcy5idWlsZFVuc29ydGVkTGlzdCgpKTsKLQkJQ29sbGVjdGlvbnMuc29ydChyZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkQ3VzdG9tU29ydGVkTGlzdCgpIHsKLQkJTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPih0aGlzLmJ1aWxkVW5zb3J0ZWRMaXN0KCkpOwotCQlDb2xsZWN0aW9ucy5zb3J0KHJlc3VsdCwgdGhpcy5jdXN0b21Db21wYXJhdG9yKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5hdHVyYWwoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFVuc29ydGVkTGlzdCgpOwotCQlDb2xsZWN0aW9ucy5zb3J0KGxpc3QsIHRoaXMubmF0dXJhbFJldmVyc2VDb21wYXJhdG9yKTsKLQkJdGhpcy52ZXJpZnlMaXN0KHRoaXMuYnVpbGROYXR1cmFsbHlTb3J0ZWRMaXN0KCksIGxpc3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDdXN0b20oKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFVuc29ydGVkTGlzdCgpOwotCQlDb2xsZWN0aW9ucy5zb3J0KGxpc3QsIHRoaXMuY3VzdG9tUmV2ZXJzZUNvbXBhcmF0b3IpOwotCQl0aGlzLnZlcmlmeUxpc3QodGhpcy5idWlsZEN1c3RvbVNvcnRlZExpc3QoKSwgbGlzdCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUxpc3QoTGlzdDxTdHJpbmc+IG5vcm1hbCwgTGlzdDxTdHJpbmc+IHJldmVyc2UpIHsKLQkJaW50IHNpemUgPSBub3JtYWwuc2l6ZSgpOwotCQlpbnQgbWF4ID0gc2l6ZSAtIDE7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlhc3NlcnRFcXVhbHMobm9ybWFsLmdldChpKSwgcmV2ZXJzZS5nZXQobWF4IC0gaSkpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9TdHJpbmdUb29sc1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1N0cmluZ1Rvb2xzVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU0Y2I4MS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1N0cmluZ1Rvb2xzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi1wdWJsaWMgY2xhc3MgU3RyaW5nVG9vbHNUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBTdHJpbmdUb29sc1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8vICoqKioqKioqKiogcGFkZGluZy90cnVuY2F0aW5nICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RQYWQoKSB7Ci0JCWFzc2VydEVxdWFscygiZnJlZCIsIFN0cmluZ1Rvb2xzLnBhZCgiZnJlZCIsIDQpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmcmVkICAiLCBTdHJpbmdUb29scy5wYWQoImZyZWQiLCA2KSk7Ci0JCWJvb2xlYW4gZXhUaHJvd24gPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWFzc2VydEVxdWFscygiZnIiLCBTdHJpbmdUb29scy5wYWQoImZyZWQiLCAyKSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhUaHJvd24gPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhUaHJvd24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQYWRDaGFyQXJyYXkoKSB7Ci0JCWFzc2VydEVxdWFscygiZnJlZCIsIG5ldyBTdHJpbmcoU3RyaW5nVG9vbHMucGFkKG5ldyBjaGFyW10geyAnZicsICdyJywgJ2UnLCAnZCcgfSwgNCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmcmVkICAiLCBuZXcgU3RyaW5nKFN0cmluZ1Rvb2xzLnBhZChuZXcgY2hhcltdIHsgJ2YnLCAncicsICdlJywgJ2QnIH0sIDYpKSk7Ci0JCWJvb2xlYW4gZXhUaHJvd24gPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWFzc2VydEVxdWFscygiZnIiLCBuZXcgU3RyaW5nKFN0cmluZ1Rvb2xzLnBhZChuZXcgY2hhcltdIHsgJ2YnLCAncicsICdlJywgJ2QnIH0sIDIpKSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhUaHJvd24gPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhUaHJvd24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQYWRPbldyaXRlcigpIHsKLQkJV3JpdGVyIHdyaXRlcjsKLQkJd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlTdHJpbmdUb29scy5wYWRPbigiZnJlZCIsIDQsIHdyaXRlcik7Ci0JCWFzc2VydEVxdWFscygiZnJlZCIsIHdyaXRlci50b1N0cmluZygpKTsKLQotCQl3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnBhZE9uKCJmcmVkIiwgNiwgd3JpdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKCJmcmVkICAiLCB3cml0ZXIudG9TdHJpbmcoKSk7Ci0KLQkJd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlib29sZWFuIGV4VGhyb3duID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlTdHJpbmdUb29scy5wYWRPbigiZnJlZCIsIDIsIHdyaXRlcik7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhUaHJvd24gPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhUaHJvd24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQYWRPblN0cmluZ0J1ZmZlcigpIHsKLQkJU3RyaW5nQnVmZmVyIHNiOwotCQlzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMucGFkT24oImZyZWQiLCA0LCBzYik7Ci0JCWFzc2VydEVxdWFscygiZnJlZCIsIHNiLnRvU3RyaW5nKCkpOwotCi0JCXNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmdUb29scy5wYWRPbigiZnJlZCIsIDYsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKCJmcmVkICAiLCBzYi50b1N0cmluZygpKTsKLQotCQlzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYm9vbGVhbiBleFRocm93biA9IGZhbHNlOwotCQl0cnkgewotCQkJU3RyaW5nVG9vbHMucGFkT24oImZyZWQiLCAyLCBzYik7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhUaHJvd24gPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhUaHJvd24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQYWRPclRydW5jYXRlKCkgewotCQlhc3NlcnRFcXVhbHMoImZyZWQiLCBTdHJpbmdUb29scy5wYWRPclRydW5jYXRlKCJmcmVkIiwgNCkpOwotCQlhc3NlcnRFcXVhbHMoImZyZWQgICIsIFN0cmluZ1Rvb2xzLnBhZE9yVHJ1bmNhdGUoImZyZWQiLCA2KSk7Ci0JCWFzc2VydEVxdWFscygiZnIiLCBTdHJpbmdUb29scy5wYWRPclRydW5jYXRlKCJmcmVkIiwgMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQYWRPclRydW5jYXRlQ2hhckFycmF5KCkgewotCQlhc3NlcnRFcXVhbHMoImZyZWQiLCBuZXcgU3RyaW5nKFN0cmluZ1Rvb2xzLnBhZE9yVHJ1bmNhdGUobmV3IGNoYXJbXSB7ICdmJywgJ3InLCAnZScsICdkJyB9LCA0KSkpOwotCQlhc3NlcnRFcXVhbHMoImZyZWQgICIsIG5ldyBTdHJpbmcoU3RyaW5nVG9vbHMucGFkT3JUcnVuY2F0ZShuZXcgY2hhcltdIHsgJ2YnLCAncicsICdlJywgJ2QnIH0sIDYpKSk7Ci0JCWFzc2VydEVxdWFscygiZnIiLCBuZXcgU3RyaW5nKFN0cmluZ1Rvb2xzLnBhZE9yVHJ1bmNhdGUobmV3IGNoYXJbXSB7ICdmJywgJ3InLCAnZScsICdkJyB9LCAyKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQYWRPclRydW5jYXRlT25Xcml0ZXIoKSB7Ci0JCXRoaXMudmVyaWZ5UGFkT3JUcnVuY2F0ZU9uV3JpdGVyKCJmcmVkIiwgImZyZWQiLCA0KTsKLQkJdGhpcy52ZXJpZnlQYWRPclRydW5jYXRlT25Xcml0ZXIoImZyZWQgICIsICJmcmVkIiwgNik7Ci0JCXRoaXMudmVyaWZ5UGFkT3JUcnVuY2F0ZU9uV3JpdGVyKCJmciIsICJmcmVkIiwgMik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVBhZE9yVHJ1bmNhdGVPbldyaXRlcihTdHJpbmcgZXhwZWN0ZWQsIFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgpIHsKLQkJV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJU3RyaW5nVG9vbHMucGFkT3JUcnVuY2F0ZU9uKHN0cmluZywgbGVuZ3RoLCB3cml0ZXIpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHdyaXRlci50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGFkT3JUcnVuY2F0ZU9uU3RyaW5nQnVmZmVyKCkgewotCQl0aGlzLnZlcmlmeVBhZE9yVHJ1bmNhdGVPblN0cmluZ0J1ZmZlcigiZnJlZCIsICJmcmVkIiwgNCk7Ci0JCXRoaXMudmVyaWZ5UGFkT3JUcnVuY2F0ZU9uU3RyaW5nQnVmZmVyKCJmcmVkICAiLCAiZnJlZCIsIDYpOwotCQl0aGlzLnZlcmlmeVBhZE9yVHJ1bmNhdGVPblN0cmluZ0J1ZmZlcigiZnIiLCAiZnJlZCIsIDIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlQYWRPclRydW5jYXRlT25TdHJpbmdCdWZmZXIoU3RyaW5nIGV4cGVjdGVkLCBTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMucGFkT3JUcnVuY2F0ZU9uKHN0cmluZywgbGVuZ3RoLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFplcm9QYWQoKSB7Ci0JCWFzc2VydEVxdWFscygiMTIzNCIsIFN0cmluZ1Rvb2xzLnplcm9QYWQoIjEyMzQiLCA0KSk7Ci0JCWFzc2VydEVxdWFscygiMDAxMjM0IiwgU3RyaW5nVG9vbHMuemVyb1BhZCgiMTIzNCIsIDYpKTsKLQkJYm9vbGVhbiBleFRocm93biA9IGZhbHNlOwotCQl0cnkgewotCQkJYXNzZXJ0RXF1YWxzKCIxMiIsIFN0cmluZ1Rvb2xzLnplcm9QYWQoIjEyMzQiLCAyKSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhUaHJvd24gPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhUaHJvd24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RaZXJvUGFkQ2hhckFycmF5KCkgewotCQlhc3NlcnRFcXVhbHMoIjEyMzQiLCBuZXcgU3RyaW5nKFN0cmluZ1Rvb2xzLnplcm9QYWQobmV3IGNoYXJbXSB7ICcxJywgJzInLCAnMycsICc0JyB9LCA0KSkpOwotCQlhc3NlcnRFcXVhbHMoIjAwMTIzNCIsIG5ldyBTdHJpbmcoU3RyaW5nVG9vbHMuemVyb1BhZChuZXcgY2hhcltdIHsgJzEnLCAnMicsICczJywgJzQnIH0sIDYpKSk7Ci0JCWJvb2xlYW4gZXhUaHJvd24gPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWFzc2VydEVxdWFscygiMTIiLCBuZXcgU3RyaW5nKFN0cmluZ1Rvb2xzLnplcm9QYWQobmV3IGNoYXJbXSB7ICcxJywgJzInLCAnMycsICc0JyB9LCAyKSkpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4VGhyb3duID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4VGhyb3duKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0WmVyb1BhZE9uV3JpdGVyKCkgewotCQlXcml0ZXIgd3JpdGVyOwotCQl3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnplcm9QYWRPbigiMTIzNCIsIDQsIHdyaXRlcik7Ci0JCWFzc2VydEVxdWFscygiMTIzNCIsIHdyaXRlci50b1N0cmluZygpKTsKLQotCQl3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnplcm9QYWRPbigiMTIzNCIsIDYsIHdyaXRlcik7Ci0JCWFzc2VydEVxdWFscygiMDAxMjM0Iiwgd3JpdGVyLnRvU3RyaW5nKCkpOwotCi0JCXdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJYm9vbGVhbiBleFRocm93biA9IGZhbHNlOwotCQl0cnkgewotCQkJU3RyaW5nVG9vbHMuemVyb1BhZE9uKCIxMjM0IiwgMiwgd3JpdGVyKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleFRocm93biA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleFRocm93bik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFplcm9QYWRPblN0cmluZ0J1ZmZlcigpIHsKLQkJU3RyaW5nQnVmZmVyIHNiOwotCQlzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMuemVyb1BhZE9uKCIxMjM0IiwgNCwgc2IpOwotCQlhc3NlcnRFcXVhbHMoIjEyMzQiLCBzYi50b1N0cmluZygpKTsKLQotCQlzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMuemVyb1BhZE9uKCIxMjM0IiwgNiwgc2IpOwotCQlhc3NlcnRFcXVhbHMoIjAwMTIzNCIsIHNiLnRvU3RyaW5nKCkpOwotCi0JCXNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlib29sZWFuIGV4VGhyb3duID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlTdHJpbmdUb29scy56ZXJvUGFkT24oIjEyMzQiLCAyLCBzYik7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhUaHJvd24gPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhUaHJvd24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RaZXJvUGFkT3JUcnVuY2F0ZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKCIxMjM0IiwgU3RyaW5nVG9vbHMuemVyb1BhZE9yVHJ1bmNhdGUoIjEyMzQiLCA0KSk7Ci0JCWFzc2VydEVxdWFscygiMDAxMjM0IiwgU3RyaW5nVG9vbHMuemVyb1BhZE9yVHJ1bmNhdGUoIjEyMzQiLCA2KSk7Ci0JCWFzc2VydEVxdWFscygiMzQiLCBTdHJpbmdUb29scy56ZXJvUGFkT3JUcnVuY2F0ZSgiMTIzNCIsIDIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0WmVyb1BhZE9yVHJ1bmNhdGVDaGFyQXJyYXkoKSB7Ci0JCWFzc2VydEVxdWFscygiMTIzNCIsIG5ldyBTdHJpbmcoU3RyaW5nVG9vbHMuemVyb1BhZE9yVHJ1bmNhdGUobmV3IGNoYXJbXSB7ICcxJywgJzInLCAnMycsICc0JyB9LCA0KSkpOwotCQlhc3NlcnRFcXVhbHMoIjAwMTIzNCIsIG5ldyBTdHJpbmcoU3RyaW5nVG9vbHMuemVyb1BhZE9yVHJ1bmNhdGUobmV3IGNoYXJbXSB7ICcxJywgJzInLCAnMycsICc0JyB9LCA2KSkpOwotCQlhc3NlcnRFcXVhbHMoIjM0IiwgbmV3IFN0cmluZyhTdHJpbmdUb29scy56ZXJvUGFkT3JUcnVuY2F0ZShuZXcgY2hhcltdIHsgJzEnLCAnMicsICczJywgJzQnIH0sIDIpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFplcm9QYWRPclRydW5jYXRlT25Xcml0ZXIoKSB7Ci0JCXRoaXMudmVyaWZ5WmVyb1BhZE9yVHJ1bmNhdGVPbldyaXRlcigiMTIzNCIsICIxMjM0IiwgNCk7Ci0JCXRoaXMudmVyaWZ5WmVyb1BhZE9yVHJ1bmNhdGVPbldyaXRlcigiMDAxMjM0IiwgIjEyMzQiLCA2KTsKLQkJdGhpcy52ZXJpZnlaZXJvUGFkT3JUcnVuY2F0ZU9uV3JpdGVyKCIzNCIsICIxMjM0IiwgMik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVplcm9QYWRPclRydW5jYXRlT25Xcml0ZXIoU3RyaW5nIGV4cGVjdGVkLCBTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoKSB7Ci0JCVdyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnplcm9QYWRPclRydW5jYXRlT24oc3RyaW5nLCBsZW5ndGgsIHdyaXRlcik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgd3JpdGVyLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RaZXJvUGFkT3JUcnVuY2F0ZU9uU3RyaW5nQnVmZmVyKCkgewotCQl0aGlzLnZlcmlmeVplcm9QYWRPclRydW5jYXRlT25TdHJpbmdCdWZmZXIoIjEyMzQiLCAiMTIzNCIsIDQpOwotCQl0aGlzLnZlcmlmeVplcm9QYWRPclRydW5jYXRlT25TdHJpbmdCdWZmZXIoIjAwMTIzNCIsICIxMjM0IiwgNik7Ci0JCXRoaXMudmVyaWZ5WmVyb1BhZE9yVHJ1bmNhdGVPblN0cmluZ0J1ZmZlcigiMzQiLCAiMTIzNCIsIDIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlaZXJvUGFkT3JUcnVuY2F0ZU9uU3RyaW5nQnVmZmVyKFN0cmluZyBleHBlY3RlZCwgU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnplcm9QYWRPclRydW5jYXRlT24oc3RyaW5nLCBsZW5ndGgsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHdyYXBwaW5nICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RXcmFwKCkgewotCQl0aGlzLnZlcmlmeVdyYXAoIkVtcGxveWVlIiwgIjEyMyIsICIxMjNFbXBsb3llZTEyMyIpOwotCQl0aGlzLnZlcmlmeVdyYXAoIjEyMyIsICIxMjMiLCAiMTIzMTIzMTIzIik7Ci0JCXRoaXMudmVyaWZ5V3JhcCgiIiwgIjEyMyIsICIxMjMxMjMiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5V3JhcChTdHJpbmcgc3RyaW5nLCBTdHJpbmcgd3JhcCwgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZFN0cmluZywgU3RyaW5nVG9vbHMud3JhcChzdHJpbmcsIHdyYXApKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0V3JhcE9uV3JpdGVyKCkgewotCQl0aGlzLnZlcmlmeVdyYXBPbldyaXRlcigiRW1wbG95ZWUiLCAiMTIzIiwgIjEyM0VtcGxveWVlMTIzIik7Ci0JCXRoaXMudmVyaWZ5V3JhcE9uV3JpdGVyKCIxMjMiLCAiMTIzIiwgIjEyMzEyMzEyMyIpOwotCQl0aGlzLnZlcmlmeVdyYXBPbldyaXRlcigiIiwgIjEyMyIsICIxMjMxMjMiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5V3JhcE9uV3JpdGVyKFN0cmluZyBzdHJpbmcsIFN0cmluZyB3cmFwLCBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcpIHsKLQkJV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJU3RyaW5nVG9vbHMud3JhcE9uKHN0cmluZywgd3JhcCwgd3JpdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCB3cml0ZXIudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFdyYXBPblN0cmluZ0J1ZmZlcigpIHsKLQkJdGhpcy52ZXJpZnlXcmFwT25TdHJpbmdCdWZmZXIoIkVtcGxveWVlIiwgIjEyMyIsICIxMjNFbXBsb3llZTEyMyIpOwotCQl0aGlzLnZlcmlmeVdyYXBPblN0cmluZ0J1ZmZlcigiMTIzIiwgIjEyMyIsICIxMjMxMjMxMjMiKTsKLQkJdGhpcy52ZXJpZnlXcmFwT25TdHJpbmdCdWZmZXIoIiIsICIxMjMiLCAiMTIzMTIzIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVdyYXBPblN0cmluZ0J1ZmZlcihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgd3JhcCwgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMud3JhcE9uKHN0cmluZywgd3JhcCwgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RRdW90ZSgpIHsKLQkJdGhpcy52ZXJpZnlRdW90ZSgiRW1wbG95ZWUiLCAiXCJFbXBsb3llZVwiIik7Ci0JCXRoaXMudmVyaWZ5UXVvdGUoIjEyMyIsICJcIjEyM1wiIik7Ci0JCXRoaXMudmVyaWZ5UXVvdGUoIiIsICJcIlwiIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVF1b3RlKFN0cmluZyBzdHJpbmcsIFN0cmluZyBleHBlY3RlZFN0cmluZykgewotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIFN0cmluZ1Rvb2xzLnF1b3RlKHN0cmluZykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RRdW90ZU9uV3JpdGVyKCkgewotCQl0aGlzLnZlcmlmeVF1b3RlT25Xcml0ZXIoIkVtcGxveWVlIiwgIlwiRW1wbG95ZWVcIiIpOwotCQl0aGlzLnZlcmlmeVF1b3RlT25Xcml0ZXIoIjEyMyIsICJcIjEyM1wiIik7Ci0JCXRoaXMudmVyaWZ5UXVvdGVPbldyaXRlcigiIiwgIlwiXCIiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UXVvdGVPbldyaXRlcihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcpIHsKLQkJV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJU3RyaW5nVG9vbHMucXVvdGVPbihzdHJpbmcsIHdyaXRlcik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZFN0cmluZywgd3JpdGVyLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RRdW90ZU9uU3RyaW5nQnVmZmVyKCkgewotCQl0aGlzLnZlcmlmeVF1b3RlT25TdHJpbmdCdWZmZXIoIkVtcGxveWVlIiwgIlwiRW1wbG95ZWVcIiIpOwotCQl0aGlzLnZlcmlmeVF1b3RlT25TdHJpbmdCdWZmZXIoIjEyMyIsICJcIjEyM1wiIik7Ci0JCXRoaXMudmVyaWZ5UXVvdGVPblN0cmluZ0J1ZmZlcigiIiwgIlwiXCIiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UXVvdGVPblN0cmluZ0J1ZmZlcihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmdUb29scy5xdW90ZU9uKHN0cmluZywgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCS8vICoqKioqKioqKiogcmVtb3ZpbmcgY2hhcmFjdGVycyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRmlyc3RPY2N1cnJlbmNlKCkgewotCQl0aGlzLnZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZSgiRW1wbG8meWVlIiwgJyYnLCAiRW1wbG95ZWUiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2UoIkVtcGxvJnllZSYiLCAnJicsICJFbXBsb3llZSYiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2UoIkVtcGxveWVlICZGb28iLCAnJicsICJFbXBsb3llZSBGb28iKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2UoIkVtcGxveWVlJiIsICcmJywgIkVtcGxveWVlIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlRmlyc3RPY2N1cnJlbmNlKCImRW1wbG95ZWUiLCAnJicsICJFbXBsb3llZSIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2UoU3RyaW5nIHN0cmluZywgY2hhciBjaGFyVG9SZW1vdmUsIFN0cmluZyBleHBlY3RlZFN0cmluZykgewotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIFN0cmluZ1Rvb2xzLnJlbW92ZUZpcnN0T2NjdXJyZW5jZShzdHJpbmcsIGNoYXJUb1JlbW92ZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVGaXJzdE9jY3VycmVuY2VDaGFyQXJyYXkoKSB7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlRmlyc3RPY2N1cnJlbmNlQ2hhckFycmF5KCJFbXBsbyZ5ZWUiLCAnJicsICJFbXBsb3llZSIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZUNoYXJBcnJheSgiRW1wbG8meWVlJiIsICcmJywgIkVtcGxveWVlJiIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZUNoYXJBcnJheSgiRW1wbG95ZWUgJkZvbyIsICcmJywgIkVtcGxveWVlIEZvbyIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZUNoYXJBcnJheSgiRW1wbG95ZWUmIiwgJyYnLCAiRW1wbG95ZWUiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2VDaGFyQXJyYXkoIiZFbXBsb3llZSIsICcmJywgIkVtcGxveWVlIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZUNoYXJBcnJheShTdHJpbmcgc3RyaW5nLCBjaGFyIGNoYXJUb1JlbW92ZSwgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZFN0cmluZywgbmV3IFN0cmluZyhTdHJpbmdUb29scy5yZW1vdmVGaXJzdE9jY3VycmVuY2Uoc3RyaW5nLnRvQ2hhckFycmF5KCksIGNoYXJUb1JlbW92ZSkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRmlyc3RPY2N1cnJlbmNlT25Xcml0ZXIoKSB7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlRmlyc3RPY2N1cnJlbmNlT25Xcml0ZXIoIkVtcGxvJnllZSIsICcmJywgIkVtcGxveWVlIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlRmlyc3RPY2N1cnJlbmNlT25Xcml0ZXIoIkVtcGxvJnllZSYiLCAnJicsICJFbXBsb3llZSYiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2VPbldyaXRlcigiRW1wbG95ZWUgJkZvbyIsICcmJywgIkVtcGxveWVlIEZvbyIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uV3JpdGVyKCJFbXBsb3llZSYiLCAnJicsICJFbXBsb3llZSIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uV3JpdGVyKCImRW1wbG95ZWUiLCAnJicsICJFbXBsb3llZSIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2VPbldyaXRlcihTdHJpbmcgc3RyaW5nLCBjaGFyIGNoYXJUb1JlbW92ZSwgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCVdyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uKHN0cmluZywgY2hhclRvUmVtb3ZlLCB3cml0ZXIpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIHdyaXRlci50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRmlyc3RPY2N1cnJlbmNlT25TdHJpbmdCdWZmZXIoKSB7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlRmlyc3RPY2N1cnJlbmNlT25TdHJpbmdCdWZmZXIoIkVtcGxvJnllZSIsICcmJywgIkVtcGxveWVlIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlRmlyc3RPY2N1cnJlbmNlT25TdHJpbmdCdWZmZXIoIkVtcGxvJnllZSYiLCAnJicsICJFbXBsb3llZSYiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2VPblN0cmluZ0J1ZmZlcigiRW1wbG95ZWUgJkZvbyIsICcmJywgIkVtcGxveWVlIEZvbyIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uU3RyaW5nQnVmZmVyKCJFbXBsb3llZSYiLCAnJicsICJFbXBsb3llZSIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uU3RyaW5nQnVmZmVyKCImRW1wbG95ZWUiLCAnJicsICJFbXBsb3llZSIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2VPblN0cmluZ0J1ZmZlcihTdHJpbmcgc3RyaW5nLCBjaGFyIGNoYXJUb1JlbW92ZSwgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMucmVtb3ZlRmlyc3RPY2N1cnJlbmNlT24oc3RyaW5nLCBjaGFyVG9SZW1vdmUsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsT2NjdXJyZW5jZXMoKSB7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsT2NjdXJyZW5jZXMoIkVtcGxveWVlIEZyZWQiLCAnICcsICJFbXBsb3llZUZyZWQiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxPY2N1cnJlbmNlcygiIEVtcGxveWVlICIsICcgJywgIkVtcGxveWVlIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsT2NjdXJyZW5jZXMoIkVtcGxveWVlICAgRm9vIiwgJyAnLCAiRW1wbG95ZWVGb28iKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxPY2N1cnJlbmNlcygiIEVtcCBsb3llZSAgIEZvbyIsICcgJywgIkVtcGxveWVlRm9vIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVJlbW92ZUFsbE9jY3VycmVuY2VzKFN0cmluZyBzdHJpbmcsIGNoYXIgY2hhclRvUmVtb3ZlLCBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcpIHsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCBTdHJpbmdUb29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhzdHJpbmcsIGNoYXJUb1JlbW92ZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxPY2N1cnJlbmNlc0NoYXJBcnJheSgpIHsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxPY2N1cnJlbmNlc0NoYXJBcnJheSgiRW1wbG95ZWUgRnJlZCIsICcgJywgIkVtcGxveWVlRnJlZCIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbE9jY3VycmVuY2VzQ2hhckFycmF5KCIgRW1wbG95ZWUgIiwgJyAnLCAiRW1wbG95ZWUiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxPY2N1cnJlbmNlc0NoYXJBcnJheSgiRW1wbG95ZWUgICBGb28iLCAnICcsICJFbXBsb3llZUZvbyIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbE9jY3VycmVuY2VzQ2hhckFycmF5KCIgRW1wIGxveWVlICAgRm9vIiwgJyAnLCAiRW1wbG95ZWVGb28iKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UmVtb3ZlQWxsT2NjdXJyZW5jZXNDaGFyQXJyYXkoU3RyaW5nIHN0cmluZywgY2hhciBjaGFyVG9SZW1vdmUsIFN0cmluZyBleHBlY3RlZFN0cmluZykgewotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIG5ldyBTdHJpbmcoU3RyaW5nVG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoc3RyaW5nLnRvQ2hhckFycmF5KCksIGNoYXJUb1JlbW92ZSkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsT2NjdXJyZW5jZXNPbldyaXRlcigpIHsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxPY2N1cnJlbmNlc09uV3JpdGVyKCJFbXBsb3llZSBGcmVkIiwgJyAnLCAiRW1wbG95ZWVGcmVkIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsT2NjdXJyZW5jZXNPbldyaXRlcigiIEVtcGxveWVlICIsICcgJywgIkVtcGxveWVlIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsT2NjdXJyZW5jZXNPbldyaXRlcigiRW1wbG95ZWUgICBGb28iLCAnICcsICJFbXBsb3llZUZvbyIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbE9jY3VycmVuY2VzT25Xcml0ZXIoIiBFbXAgbG95ZWUgICBGb28iLCAnICcsICJFbXBsb3llZUZvbyIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlSZW1vdmVBbGxPY2N1cnJlbmNlc09uV3JpdGVyKFN0cmluZyBzdHJpbmcsIGNoYXIgY2hhclRvUmVtb3ZlLCBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcpIHsKLQkJV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJU3RyaW5nVG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXNPbihzdHJpbmcsIGNoYXJUb1JlbW92ZSwgd3JpdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCB3cml0ZXIudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbE9jY3VycmVuY2VzT25TdHJpbmdCdWZmZXIoKSB7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsT2NjdXJyZW5jZXNPblN0cmluZ0J1ZmZlcigiRW1wbG95ZWUgRnJlZCIsICcgJywgIkVtcGxveWVlRnJlZCIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbE9jY3VycmVuY2VzT25TdHJpbmdCdWZmZXIoIiBFbXBsb3llZSAiLCAnICcsICJFbXBsb3llZSIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbE9jY3VycmVuY2VzT25TdHJpbmdCdWZmZXIoIkVtcGxveWVlICAgRm9vIiwgJyAnLCAiRW1wbG95ZWVGb28iKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxPY2N1cnJlbmNlc09uU3RyaW5nQnVmZmVyKCIgRW1wIGxveWVlICAgRm9vIiwgJyAnLCAiRW1wbG95ZWVGb28iKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UmVtb3ZlQWxsT2NjdXJyZW5jZXNPblN0cmluZ0J1ZmZlcihTdHJpbmcgc3RyaW5nLCBjaGFyIGNoYXJUb1JlbW92ZSwgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXNPbihzdHJpbmcsIGNoYXJUb1JlbW92ZSwgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCS8vICoqKioqKioqKiogY29tbW9uIHByZWZpeCAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29tbW9uUHJlZml4TGVuZ3RoKCkgewotCQlhc3NlcnRFcXVhbHMoMywgU3RyaW5nVG9vbHMuY29tbW9uUHJlZml4TGVuZ3RoKCJmb29aWloiLCAiZm9vQkJCIikpOwotCQlhc3NlcnRFcXVhbHMoMywgU3RyaW5nVG9vbHMuY29tbW9uUHJlZml4TGVuZ3RoKCJmb28iLCAiZm9vQkJCIikpOwotCQlhc3NlcnRFcXVhbHMoMywgU3RyaW5nVG9vbHMuY29tbW9uUHJlZml4TGVuZ3RoKCJmb29aWloiLCAiZm9vIikpOwotCQlhc3NlcnRFcXVhbHMoMywgU3RyaW5nVG9vbHMuY29tbW9uUHJlZml4TGVuZ3RoKCJmb28iLCAiZm9vIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb21tb25QcmVmaXhMZW5ndGhNYXgoKSB7Ci0JCWFzc2VydEVxdWFscygyLCBTdHJpbmdUb29scy5jb21tb25QcmVmaXhMZW5ndGgoImZvb1paWiIsICJmb29CQkIiLCAyKSk7Ci0JCWFzc2VydEVxdWFscygyLCBTdHJpbmdUb29scy5jb21tb25QcmVmaXhMZW5ndGgoImZvbyIsICJmb29CQkIiLCAyKSk7Ci0JCWFzc2VydEVxdWFscygyLCBTdHJpbmdUb29scy5jb21tb25QcmVmaXhMZW5ndGgoImZvb1paWiIsICJmb28iLCAyKSk7Ci0JCWFzc2VydEVxdWFscygyLCBTdHJpbmdUb29scy5jb21tb25QcmVmaXhMZW5ndGgoImZvbyIsICJmb28iLCAyKSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBjYXBpdGFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2FwaXRhbGl6ZUNoYXJBcnJheSgpIHsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplQ2hhckFycmF5KCJPcmFjbGUiLCBuZXcgY2hhcltdIHsgJ08nLCAncicsICdhJywgJ2MnLCAnbCcsICdlJyB9KTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplQ2hhckFycmF5KCJPcmFjbGUiLCBuZXcgY2hhcltdIHsgJ28nLCAncicsICdhJywgJ2MnLCAnbCcsICdlJyB9KTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplQ2hhckFycmF5KCIgICAiLCBuZXcgY2hhcltdIHsgJyAnLCAnICcsICcgJyB9KTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplQ2hhckFycmF5KCJPUkFDTEUiLCBuZXcgY2hhcltdIHsgJ08nLCAnUicsICdBJywgJ0MnLCAnTCcsICdFJyB9KTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplQ2hhckFycmF5KCIiLCBuZXcgY2hhclswXSk7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZUNoYXJBcnJheSgiQSIsIG5ldyBjaGFyW10geyAnYScgfSk7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZUNoYXJBcnJheSgiXHUwMEM5Y29sZSIsIG5ldyBjaGFyW10geyAnXHUwMEU5JywgJ2MnLCAnbycsICdsJywgJ2UnIH0pOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDYXBpdGFsaXplQ2hhckFycmF5KFN0cmluZyBleHBlY3RlZCwgY2hhcltdIHN0cmluZykgewotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIG5ldyBTdHJpbmcoU3RyaW5nVG9vbHMuY2FwaXRhbGl6ZShzdHJpbmcpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENhcGl0YWxpemVTdHJpbmcoKSB7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZVN0cmluZygiT3JhY2xlIiwgIk9yYWNsZSIpOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVTdHJpbmcoIk9yYWNsZSIsICJvcmFjbGUiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplU3RyaW5nKCIgICAiLCAiICAgIik7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZVN0cmluZygiT1JBQ0xFIiwgIk9SQUNMRSIpOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVTdHJpbmcoIiIsICIiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplU3RyaW5nKCJBIiwgImEiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplU3RyaW5nKCJcdTAwQzljb2xlIiwgIlx1MDBFOWNvbGUiKTsgLy8g77+9Y29sZS0+77+9Q09MRQotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDYXBpdGFsaXplU3RyaW5nKFN0cmluZyBleHBlY3RlZCwgU3RyaW5nIHN0cmluZykgewotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIFN0cmluZ1Rvb2xzLmNhcGl0YWxpemUoc3RyaW5nKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1ZmZlcigpIHsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWZmZXIoIk9yYWNsZSIsIG5ldyBjaGFyW10geyAnTycsICdyJywgJ2EnLCAnYycsICdsJywgJ2UnIH0pOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1ZmZlcigiT3JhY2xlIiwgbmV3IGNoYXJbXSB7ICdvJywgJ3InLCAnYScsICdjJywgJ2wnLCAnZScgfSk7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVmZmVyKCIgICAiLCBuZXcgY2hhcltdIHsgJyAnLCAnICcsICcgJyB9KTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWZmZXIoIk9SQUNMRSIsIG5ldyBjaGFyW10geyAnTycsICdSJywgJ0EnLCAnQycsICdMJywgJ0UnIH0pOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1ZmZlcigiIiwgbmV3IGNoYXJbMF0pOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1ZmZlcigiQSIsIG5ldyBjaGFyW10geyAnYScgfSk7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVmZmVyKCJcdTAwQzljb2xlIiwgbmV3IGNoYXJbXSB7ICdcdTAwRTknLCAnYycsICdvJywgJ2wnLCAnZScgfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1ZmZlcihTdHJpbmcgZXhwZWN0ZWQsIGNoYXJbXSBzdHJpbmcpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmdUb29scy5jYXBpdGFsaXplT24oc3RyaW5nLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1ZmZlcigpIHsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWZmZXIoIk9yYWNsZSIsICJPcmFjbGUiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWZmZXIoIk9yYWNsZSIsICJvcmFjbGUiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWZmZXIoIiAgICIsICIgICAiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWZmZXIoIk9SQUNMRSIsICJPUkFDTEUiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWZmZXIoIiIsICIiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWZmZXIoIkEiLCAiYSIpOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1ZmZlcigiXHUwMEM5Y29sZSIsICJcdTAwRTljb2xlIik7IC8vIO+/vWNvbGUtPu+/vUNPTEUKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVmZmVyKFN0cmluZyBleHBlY3RlZCwgU3RyaW5nIHN0cmluZykgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZ1Rvb2xzLmNhcGl0YWxpemVPbihzdHJpbmcsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2FwaXRhbGl6ZU9uQ2hhckFycmF5V3JpdGVyKCkgewotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPbkNoYXJBcnJheVdyaXRlcigiT3JhY2xlIiwgbmV3IGNoYXJbXSB7ICdPJywgJ3InLCAnYScsICdjJywgJ2wnLCAnZScgfSk7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uQ2hhckFycmF5V3JpdGVyKCJPcmFjbGUiLCBuZXcgY2hhcltdIHsgJ28nLCAncicsICdhJywgJ2MnLCAnbCcsICdlJyB9KTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25DaGFyQXJyYXlXcml0ZXIoIiAgICIsIG5ldyBjaGFyW10geyAnICcsICcgJywgJyAnIH0pOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPbkNoYXJBcnJheVdyaXRlcigiT1JBQ0xFIiwgbmV3IGNoYXJbXSB7ICdPJywgJ1InLCAnQScsICdDJywgJ0wnLCAnRScgfSk7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uQ2hhckFycmF5V3JpdGVyKCIiLCBuZXcgY2hhclswXSk7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uQ2hhckFycmF5V3JpdGVyKCJBIiwgbmV3IGNoYXJbXSB7ICdhJyB9KTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25DaGFyQXJyYXlXcml0ZXIoIlx1MDBDOWNvbGUiLCBuZXcgY2hhcltdIHsgJ1x1MDBFOScsICdjJywgJ28nLCAnbCcsICdlJyB9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q2FwaXRhbGl6ZU9uQ2hhckFycmF5V3JpdGVyKFN0cmluZyBleHBlY3RlZCwgY2hhcltdIHN0cmluZykgewotCQlXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlTdHJpbmdUb29scy5jYXBpdGFsaXplT24oc3RyaW5nLCB3cml0ZXIpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHdyaXRlci50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2FwaXRhbGl6ZU9uU3RyaW5nV3JpdGVyKCkgewotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPblN0cmluZ1dyaXRlcigiT3JhY2xlIiwgIk9yYWNsZSIpOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPblN0cmluZ1dyaXRlcigiT3JhY2xlIiwgIm9yYWNsZSIpOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPblN0cmluZ1dyaXRlcigiICAgIiwgIiAgICIpOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPblN0cmluZ1dyaXRlcigiT1JBQ0xFIiwgIk9SQUNMRSIpOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPblN0cmluZ1dyaXRlcigiIiwgIiIpOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPblN0cmluZ1dyaXRlcigiQSIsICJhIik7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uU3RyaW5nV3JpdGVyKCJcdTAwQzljb2xlIiwgIlx1MDBFOWNvbGUiKTsgLy8g77+9Y29sZS0+77+9Q09MRQotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdXcml0ZXIoU3RyaW5nIGV4cGVjdGVkLCBTdHJpbmcgc3RyaW5nKSB7Ci0JCVdyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLmNhcGl0YWxpemVPbihzdHJpbmcsIHdyaXRlcik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgd3JpdGVyLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmFwaXRhbGl6ZUNoYXJBcnJheSgpIHsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVDaGFyQXJyYXkoIm9yYWNsZSIsIG5ldyBjaGFyW10geyAnTycsICdyJywgJ2EnLCAnYycsICdsJywgJ2UnIH0pOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZUNoYXJBcnJheSgib3JhY2xlIiwgbmV3IGNoYXJbXSB7ICdvJywgJ3InLCAnYScsICdjJywgJ2wnLCAnZScgfSk7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplQ2hhckFycmF5KCIgICAiLCBuZXcgY2hhcltdIHsgJyAnLCAnICcsICcgJyB9KTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVDaGFyQXJyYXkoIk9SQUNMRSIsIG5ldyBjaGFyW10geyAnTycsICdSJywgJ0EnLCAnQycsICdMJywgJ0UnIH0pOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZUNoYXJBcnJheSgiIiwgbmV3IGNoYXJbMF0pOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZUNoYXJBcnJheSgiYSIsIG5ldyBjaGFyW10geyAnQScgfSk7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplQ2hhckFycmF5KCJcdTAwRTljb2xlIiwgbmV3IGNoYXJbXSB7ICdcdTAwQzknLCAnYycsICdvJywgJ2wnLCAnZScgfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVVuY2FwaXRhbGl6ZUNoYXJBcnJheShTdHJpbmcgZXhwZWN0ZWQsIGNoYXJbXSBzdHJpbmcpIHsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBuZXcgU3RyaW5nKFN0cmluZ1Rvb2xzLnVuY2FwaXRhbGl6ZShzdHJpbmcpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuY2FwaXRhbGl6ZVN0cmluZygpIHsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVTdHJpbmcoIm9yYWNsZSIsICJPcmFjbGUiKTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVTdHJpbmcoIm9yYWNsZSIsICJvcmFjbGUiKTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVTdHJpbmcoIiAgICIsICIgICAiKTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVTdHJpbmcoIk9SQUNMRSIsICJPUkFDTEUiKTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVTdHJpbmcoIiIsICIiKTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVTdHJpbmcoImEiLCAiQSIpOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZVN0cmluZygiXHUwMEU5Y29sZSIsICJcdTAwQzljb2xlIik7IC8vIO+/vWNvbGUtPu+/vUNPTEUKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5VW5jYXBpdGFsaXplU3RyaW5nKFN0cmluZyBleHBlY3RlZCwgU3RyaW5nIHN0cmluZykgewotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIFN0cmluZ1Rvb2xzLnVuY2FwaXRhbGl6ZShzdHJpbmcpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5jYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWZmZXIoKSB7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWZmZXIoIm9yYWNsZSIsIG5ldyBjaGFyW10geyAnTycsICdyJywgJ2EnLCAnYycsICdsJywgJ2UnIH0pOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVmZmVyKCJvcmFjbGUiLCBuZXcgY2hhcltdIHsgJ28nLCAncicsICdhJywgJ2MnLCAnbCcsICdlJyB9KTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1ZmZlcigiICAgIiwgbmV3IGNoYXJbXSB7ICcgJywgJyAnLCAnICcgfSk7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWZmZXIoIk9SQUNMRSIsIG5ldyBjaGFyW10geyAnTycsICdSJywgJ0EnLCAnQycsICdMJywgJ0UnIH0pOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVmZmVyKCIiLCBuZXcgY2hhclswXSk7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWZmZXIoImEiLCBuZXcgY2hhcltdIHsgJ0EnIH0pOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVmZmVyKCJcdTAwRTljb2xlIiwgbmV3IGNoYXJbXSB7ICdcdTAwQzknLCAnYycsICdvJywgJ2wnLCAnZScgfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVVuY2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVmZmVyKFN0cmluZyBleHBlY3RlZCwgY2hhcltdIHN0cmluZykgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnVuY2FwaXRhbGl6ZU9uKHN0cmluZywgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1ZmZlcigpIHsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1ZmZlcigib3JhY2xlIiwgIk9yYWNsZSIpOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVmZmVyKCJvcmFjbGUiLCAib3JhY2xlIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWZmZXIoIiAgICIsICIgICAiKTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1ZmZlcigiT1JBQ0xFIiwgIk9SQUNMRSIpOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVmZmVyKCIiLCAiIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWZmZXIoImEiLCAiQSIpOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVmZmVyKCJcdTAwRTljb2xlIiwgIlx1MDBDOWNvbGUiKTsgLy8g77+9Y29sZS0+77+9Q09MRQotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlVbmNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1ZmZlcihTdHJpbmcgZXhwZWN0ZWQsIFN0cmluZyBzdHJpbmcpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmdUb29scy51bmNhcGl0YWxpemVPbihzdHJpbmcsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5jYXBpdGFsaXplT25DaGFyQXJyYXlXcml0ZXIoKSB7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25DaGFyQXJyYXlXcml0ZXIoIm9yYWNsZSIsIG5ldyBjaGFyW10geyAnTycsICdyJywgJ2EnLCAnYycsICdsJywgJ2UnIH0pOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uQ2hhckFycmF5V3JpdGVyKCJvcmFjbGUiLCBuZXcgY2hhcltdIHsgJ28nLCAncicsICdhJywgJ2MnLCAnbCcsICdlJyB9KTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPbkNoYXJBcnJheVdyaXRlcigiICAgIiwgbmV3IGNoYXJbXSB7ICcgJywgJyAnLCAnICcgfSk7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25DaGFyQXJyYXlXcml0ZXIoIk9SQUNMRSIsIG5ldyBjaGFyW10geyAnTycsICdSJywgJ0EnLCAnQycsICdMJywgJ0UnIH0pOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uQ2hhckFycmF5V3JpdGVyKCIiLCBuZXcgY2hhclswXSk7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25DaGFyQXJyYXlXcml0ZXIoImEiLCBuZXcgY2hhcltdIHsgJ0EnIH0pOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uQ2hhckFycmF5V3JpdGVyKCJcdTAwRTljb2xlIiwgbmV3IGNoYXJbXSB7ICdcdTAwQzknLCAnYycsICdvJywgJ2wnLCAnZScgfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVVuY2FwaXRhbGl6ZU9uQ2hhckFycmF5V3JpdGVyKFN0cmluZyBleHBlY3RlZCwgY2hhcltdIHN0cmluZykgewotCQlXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlTdHJpbmdUb29scy51bmNhcGl0YWxpemVPbihzdHJpbmcsIHdyaXRlcik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgd3JpdGVyLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmNhcGl0YWxpemVPblN0cmluZ1dyaXRlcigpIHsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPblN0cmluZ1dyaXRlcigib3JhY2xlIiwgIk9yYWNsZSIpOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uU3RyaW5nV3JpdGVyKCJvcmFjbGUiLCAib3JhY2xlIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25TdHJpbmdXcml0ZXIoIiAgICIsICIgICAiKTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPblN0cmluZ1dyaXRlcigiT1JBQ0xFIiwgIk9SQUNMRSIpOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uU3RyaW5nV3JpdGVyKCIiLCAiIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25TdHJpbmdXcml0ZXIoImEiLCAiQSIpOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uU3RyaW5nV3JpdGVyKCJcdTAwRTljb2xlIiwgIlx1MDBDOWNvbGUiKTsgLy8g77+9Y29sZS0+77+9Q09MRQotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlVbmNhcGl0YWxpemVPblN0cmluZ1dyaXRlcihTdHJpbmcgZXhwZWN0ZWQsIFN0cmluZyBzdHJpbmcpIHsKLQkJV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJU3RyaW5nVG9vbHMudW5jYXBpdGFsaXplT24oc3RyaW5nLCB3cml0ZXIpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHdyaXRlci50b1N0cmluZygpKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdFN0cmluZ0lzRW1wdHlTdHJpbmcoKSB7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSgoU3RyaW5nKSBudWxsKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSgiIikpOwotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoIiAgICAgICIpKTsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KCIgICAgICBcdFx0ICAgIikpOwotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoIiAgICAgIFx0XHQgICAiICsgU3RyaW5nVG9vbHMuQ1IpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nSXNFbXB0eUNoYXJBcnJheSgpIHsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KChjaGFyW10pIG51bGwpKTsKLQkJdGhpcy52ZXJpZnlTdHJpbmdJc0VtcHR5Q2hhckFycmF5KCIiKTsKLQkJdGhpcy52ZXJpZnlTdHJpbmdJc0VtcHR5Q2hhckFycmF5KCIgICAgICBcdFx0ICAgIik7Ci0JCXRoaXMudmVyaWZ5U3RyaW5nSXNFbXB0eUNoYXJBcnJheSgiICAgICAgIik7Ci0JCXRoaXMudmVyaWZ5U3RyaW5nSXNFbXB0eUNoYXJBcnJheSgiICAgICAgXHRcdCAgICIgKyBTdHJpbmdUb29scy5DUik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVN0cmluZ0lzRW1wdHlDaGFyQXJyYXkoU3RyaW5nIHN0cmluZykgewotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoc3RyaW5nLnRvQ2hhckFycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nc0FyZUVxdWFsSWdub3JlQ2FzZVN0cmluZ1N0cmluZygpIHsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWxJZ25vcmVDYXNlKChTdHJpbmcpIG51bGwsIChTdHJpbmcpIG51bGwpKTsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsSWdub3JlQ2FzZShudWxsLCAiYXNkZiIpKTsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsSWdub3JlQ2FzZSgiYXNkZiIsIG51bGwpKTsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWxJZ25vcmVDYXNlKCJhc2RmIiwgImFzZGYiKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsSWdub3JlQ2FzZSgiYXNkZiIsICJBU0RGIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdzQXJlRXF1YWxJZ25vcmVDYXNlQ2hhckFycmF5Q2hhckFycmF5KCkgewotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbElnbm9yZUNhc2UoKGNoYXJbXSkgbnVsbCwgKGNoYXJbXSkgbnVsbCkpOwotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWxJZ25vcmVDYXNlKChjaGFyW10pIG51bGwsICJhc2RmIi50b0NoYXJBcnJheSgpKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbElnbm9yZUNhc2UoImFzZGYiLnRvQ2hhckFycmF5KCksIChjaGFyW10pIG51bGwpKTsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWxJZ25vcmVDYXNlKCJhc2RmIi50b0NoYXJBcnJheSgpLCAiYXNkZiIudG9DaGFyQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbElnbm9yZUNhc2UoImFzZGYiLnRvQ2hhckFycmF5KCksICJBU0RGIi50b0NoYXJBcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlU3RyaW5nU3RyaW5nKCkgewotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlKCJhc2RmIiwgImFzIikpOwotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlKCJhc2RmIiwgImFTIikpOwotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlKCJhc2RmIiwgIiIpKTsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdTdGFydHNXaXRoSWdub3JlQ2FzZSgiYXNkZiIsICJBIikpOwotCi0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlKCJhc2RmIiwgImJzZGYiKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlKCJhc2RmIiwgImciKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlKCJhc2RmIiwgImFzZGciKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlKCJhc2RmIiwgImFzZGZnIikpOwotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdTdGFydHNXaXRoSWdub3JlQ2FzZSgiYXNkZiIsICJhc2RmZ2dnZ2dnIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdTdGFydHNXaXRoSWdub3JlQ2FzZUNoYXJBcnJheUNoYXJBcnJheSgpIHsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdTdGFydHNXaXRoSWdub3JlQ2FzZSgiYXNkZiIudG9DaGFyQXJyYXkoKSwgImFzIi50b0NoYXJBcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nU3RhcnRzV2l0aElnbm9yZUNhc2UoImFzZGYiLnRvQ2hhckFycmF5KCksICJhUyIudG9DaGFyQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlKCJhc2RmIi50b0NoYXJBcnJheSgpLCAiIi50b0NoYXJBcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nU3RhcnRzV2l0aElnbm9yZUNhc2UoImFzZGYiLnRvQ2hhckFycmF5KCksICJBIi50b0NoYXJBcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nU3RhcnRzV2l0aElnbm9yZUNhc2UoImFzZGYiLnRvQ2hhckFycmF5KCksICJBU0RGIi50b0NoYXJBcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nU3RhcnRzV2l0aElnbm9yZUNhc2UoImFzZGYiLnRvQ2hhckFycmF5KCksICJhc2RmIi50b0NoYXJBcnJheSgpKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nU3RhcnRzV2l0aElnbm9yZUNhc2UoImFzZGYiLnRvQ2hhckFycmF5KCksICJic2RmIi50b0NoYXJBcnJheSgpKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlKCJhc2RmIi50b0NoYXJBcnJheSgpLCAiZyIudG9DaGFyQXJyYXkoKSkpOwotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdTdGFydHNXaXRoSWdub3JlQ2FzZSgiYXNkZiIudG9DaGFyQXJyYXkoKSwgImFzZGciLnRvQ2hhckFycmF5KCkpKTsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nU3RhcnRzV2l0aElnbm9yZUNhc2UoImFzZGYiLnRvQ2hhckFycmF5KCksICJhc2RmZyIudG9DaGFyQXJyYXkoKSkpOwotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdTdGFydHNXaXRoSWdub3JlQ2FzZSgiYXNkZiIudG9DaGFyQXJyYXkoKSwgImFzZGZnZ2dnZ2ciLnRvQ2hhckFycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hhcmFjdGVyc0FyZUVxdWFsSWdub3JlQ2FzZSgpIHsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5jaGFyYWN0ZXJzQXJlRXF1YWxJZ25vcmVDYXNlKCdhJywgJ2EnKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuY2hhcmFjdGVyc0FyZUVxdWFsSWdub3JlQ2FzZSgnYScsICdBJykpOwotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLmNoYXJhY3RlcnNBcmVFcXVhbElnbm9yZUNhc2UoJ0EnLCAnYScpKTsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5jaGFyYWN0ZXJzQXJlRXF1YWxJZ25vcmVDYXNlKCdBJywgJ0EnKSk7Ci0JCQotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5jaGFyYWN0ZXJzQXJlRXF1YWxJZ25vcmVDYXNlKCdhJywgJ2InKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLmNoYXJhY3RlcnNBcmVFcXVhbElnbm9yZUNhc2UoJ0EnLCAnYicpKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGNvbnZlcnNpb25zICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKCkgewotCQlhc3NlcnRFcXVhbHMoIlRFU1QiLCBTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKCJ0ZXN0IikpOwotCQlhc3NlcnRFcXVhbHMoIlRFU1QiLCBTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKCJURVNUIikpOwotCQlhc3NlcnRFcXVhbHMoIlRFU1RfVEVTVCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoInRlc3RUZXN0IikpOwotCQlhc3NlcnRFcXVhbHMoIlRFU1RfVEVTVCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoIlRlc3RUZXN0IikpOwotCQlhc3NlcnRFcXVhbHMoIlRFU1RfVEVTVF9URVNUIiwgU3RyaW5nVG9vbHMuY29udmVydENhbWVsQ2FzZVRvQWxsQ2FwcygidGVzdFRFU1RUZXN0IikpOwotCQlhc3NlcnRFcXVhbHMoIlRFU1RfVEVTVF9URVNUIiwgU3RyaW5nVG9vbHMuY29udmVydENhbWVsQ2FzZVRvQWxsQ2FwcygiVGVzdFRFU1RUZXN0IikpOwotCQlhc3NlcnRFcXVhbHMoIlRFU1RfVEVTVF9URVNUX1QiLCBTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKCJUZXN0VEVTVFRlc3RUIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25Xcml0ZXIoKSB7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uV3JpdGVyKCJURVNUIiwgInRlc3QiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25Xcml0ZXIoIlRFU1QiLCAiVEVTVCIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbldyaXRlcigiVEVTVF9URVNUIiwgInRlc3RUZXN0Iik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uV3JpdGVyKCJURVNUX1RFU1QiLCAiVGVzdFRlc3QiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25Xcml0ZXIoIlRFU1RfVEVTVF9URVNUIiwgInRlc3RURVNUVGVzdCIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbldyaXRlcigiVEVTVF9URVNUX1RFU1QiLCAiVGVzdFRFU1RUZXN0Iik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uV3JpdGVyKCJURVNUX1RFU1RfVEVTVF9UIiwgIlRlc3RURVNUVGVzdFQiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uV3JpdGVyKFN0cmluZyBleHBlY3RlZCwgU3RyaW5nIHN0cmluZykgewotCQlXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT24oc3RyaW5nLCB3cml0ZXIpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHdyaXRlci50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aCgpIHsKLQkJYXNzZXJ0RXF1YWxzKCJURVNUIiwgU3RyaW5nVG9vbHMuY29udmVydENhbWVsQ2FzZVRvQWxsQ2FwcygidGVzdCIsIDQ0KSk7Ci0JCWFzc2VydEVxdWFscygiVEVTVCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoInRlc3QiLCA0KSk7Ci0JCWFzc2VydEVxdWFscygiVEVTIiwgU3RyaW5nVG9vbHMuY29udmVydENhbWVsQ2FzZVRvQWxsQ2FwcygidGVzdCIsIDMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJURVNUIiwgU3RyaW5nVG9vbHMuY29udmVydENhbWVsQ2FzZVRvQWxsQ2FwcygiVEVTVCIsIDUpKTsKLQkJYXNzZXJ0RXF1YWxzKCJURSIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoIlRFU1QiLCAyKSk7Ci0JCWFzc2VydEVxdWFscygiVEVTVF9URVNUIiwgU3RyaW5nVG9vbHMuY29udmVydENhbWVsQ2FzZVRvQWxsQ2FwcygidGVzdFRlc3QiLCA5KSk7Ci0JCWFzc2VydEVxdWFscygiVEVTVF9URVMiLCBTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKCJ0ZXN0VGVzdCIsIDgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJURVNUX1QiLCBTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKCJ0ZXN0VGVzdCIsIDYpKTsKLQkJYXNzZXJ0RXF1YWxzKCJURVNUXyIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoInRlc3RUZXN0IiwgNSkpOwotCQlhc3NlcnRFcXVhbHMoIlRFU1QiLCBTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKCJ0ZXN0VGVzdCIsIDQpKTsKLQkJYXNzZXJ0RXF1YWxzKCJURVNUX1RFU1QiLCBTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKCJUZXN0VGVzdCIsIDkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJURVNUX1RFU1QiLCBTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKCJUZXN0VGVzdCIsIDExMDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJURVNUX1RFU1RfIiwgU3RyaW5nVG9vbHMuY29udmVydENhbWVsQ2FzZVRvQWxsQ2FwcygidGVzdFRFU1RUZXN0IiwgMTApKTsKLQkJYXNzZXJ0RXF1YWxzKCJURVNUX1RFU1RfVEVTVCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoIlRlc3RURVNUVGVzdCIsIDE0KSk7Ci0JCWFzc2VydEVxdWFscygiVEVTVF9URVNUX1RFU1RfVCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoIlRlc3RURVNUVGVzdFQiLCAxNikpOwotCQlhc3NlcnRFcXVhbHMoIlRFU1RfVEVTVF9URVNUXyIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoIlRlc3RURVNUVGVzdFQiLCAxNSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25Xcml0ZXIoKSB7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uV3JpdGVyKCJURVNUIiwgInRlc3QiLCA0NCk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uV3JpdGVyKCJURVNUIiwgInRlc3QiLCA0KTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25Xcml0ZXIoIlRFUyIsICJ0ZXN0IiwgMyk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uV3JpdGVyKCJURVNUIiwgIlRFU1QiLCA1KTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25Xcml0ZXIoIlRFIiwgIlRFU1QiLCAyKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25Xcml0ZXIoIlRFU1RfVEVTVCIsICJ0ZXN0VGVzdCIsIDkpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPbldyaXRlcigiVEVTVF9URVMiLCAidGVzdFRlc3QiLCA4KTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25Xcml0ZXIoIlRFU1RfVCIsICJ0ZXN0VGVzdCIsIDYpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPbldyaXRlcigiVEVTVF8iLCAidGVzdFRlc3QiLCA1KTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25Xcml0ZXIoIlRFU1QiLCAidGVzdFRlc3QiLCA0KTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25Xcml0ZXIoIlRFU1RfVEVTVCIsICJUZXN0VGVzdCIsIDkpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPbldyaXRlcigiVEVTVF9URVNUIiwgIlRlc3RUZXN0IiwgMTEwMCk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uV3JpdGVyKCJURVNUX1RFU1RfIiwgInRlc3RURVNUVGVzdCIsIDEwKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25Xcml0ZXIoIlRFU1RfVEVTVF9URVNUIiwgIlRlc3RURVNUVGVzdCIsIDE0KTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25Xcml0ZXIoIlRFU1RfVEVTVF9URVNUX1QiLCAiVGVzdFRFU1RUZXN0VCIsIDE2KTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25Xcml0ZXIoIlRFU1RfVEVTVF9URVNUXyIsICJUZXN0VEVTVFRlc3RUIiwgMTUpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25Xcml0ZXIoU3RyaW5nIGV4cGVjdGVkLCBTdHJpbmcgc3RyaW5nLCBpbnQgbWF4KSB7Ci0JCVdyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbihzdHJpbmcsIG1heCwgd3JpdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCB3cml0ZXIudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCkgewotCQlhc3NlcnRFcXVhbHMoInRlc3QiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgiVEVTVCIsIGZhbHNlKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJURVNUXyIsIGZhbHNlKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJURVNUX19fXyIsIGZhbHNlKSk7Ci0JCWFzc2VydEVxdWFscygiVGVzdCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJURVNUIiwgdHJ1ZSkpOwotCQlhc3NlcnRFcXVhbHMoInRlc3QiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgiVGVTVCIsIGZhbHNlKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdFRlc3QiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgiVEVTVF9URVNUIiwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0VGVzdCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJURVNUX19fVEVTVCIsIGZhbHNlKSk7Ci0JCWFzc2VydEVxdWFscygiVGVzdFRlc3QiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgiVEVTVF9URVNUIiwgdHJ1ZSkpOwotCQlhc3NlcnRFcXVhbHMoInRlc3RUZXN0VGVzdCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJURVNUX1RFU1RfVEVTVCIsIGZhbHNlKSk7Ci0JCWFzc2VydEVxdWFscygiVGVzdFRlc3RUZXN0IiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoIlRFU1RfVEVTVF9URVNUIiwgdHJ1ZSkpOwotCQlhc3NlcnRFcXVhbHMoInRlc3RUZXN0VGVzdFQiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgiVEVTVF9URVNUX1RFU1RfVCIsIGZhbHNlKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdFRlc3RUZXN0VCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJfVEVTVF9URVNUX1RFU1RfVCIsIGZhbHNlKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdFRlc3RUZXN0VCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJfX1RFU1RfVEVTVF9URVNUX1QiLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoIlRlc3RUZXN0VGVzdFQiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgiVEVTVF9URVNUX1RFU1RfVCIsIHRydWUpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUZXN0VGVzdFRlc3RUIiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoIl9URVNUX1RFU1RfVEVTVF9UIiwgdHJ1ZSkpOwotCQlhc3NlcnRFcXVhbHMoIlRlc3RUZXN0VGVzdFQiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgiX19URVNUX1RFU1RfVEVTVF9UIiwgdHJ1ZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZUxvd2VyY2FzZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0IiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoInRlc3QiLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoInRlc3QiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgidGVzdF8iLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoInRlc3QiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgidGVzdF9fX18iLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoIlRlc3QiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgidGVzdCIsIHRydWUpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0IiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoInRlc3QiLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoInRlc3RUZXN0IiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoInRlc3RfdGVzdCIsIGZhbHNlKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdFRlc3QiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgidGVzdF9fX3Rlc3QiLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoIlRlc3RUZXN0IiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoInRlc3RfdGVzdCIsIHRydWUpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0VGVzdFRlc3QiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgidGVzdF90ZXN0X3Rlc3QiLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoIlRlc3RUZXN0VGVzdCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJ0ZXN0X3Rlc3RfdGVzdCIsIHRydWUpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0VGVzdFRlc3RUIiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoInRlc3RfdGVzdF90ZXN0X3QiLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoInRlc3RUZXN0VGVzdFQiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgiX3Rlc3RfdGVzdF90ZXN0X3QiLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoInRlc3RUZXN0VGVzdFQiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgiX190ZXN0X3Rlc3RfdGVzdF90IiwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUZXN0VGVzdFRlc3RUIiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoInRlc3RfdGVzdF90ZXN0X3QiLCB0cnVlKSk7Ci0JCWFzc2VydEVxdWFscygiVGVzdFRlc3RUZXN0VCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJfdGVzdF90ZXN0X3Rlc3RfdCIsIHRydWUpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUZXN0VGVzdFRlc3RUIiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoIl9fdGVzdF90ZXN0X3Rlc3RfdCIsIHRydWUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigpIHsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJ0ZXN0IiwgIlRFU1QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigidGVzdCIsICJURVNUXyIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJ0ZXN0IiwgIlRFU1RfX19fIiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoIlRlc3QiLCAiVEVTVCIsIHRydWUpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoInRlc3QiLCAiVGVTVCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJ0ZXN0VGVzdCIsICJURVNUX1RFU1QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigidGVzdFRlc3QiLCAiVEVTVF9fX1RFU1QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigiVGVzdFRlc3QiLCAiVEVTVF9URVNUIiwgdHJ1ZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigidGVzdFRlc3RUZXN0IiwgIlRFU1RfVEVTVF9URVNUIiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoIlRlc3RUZXN0VGVzdCIsICJURVNUX1RFU1RfVEVTVCIsIHRydWUpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoInRlc3RUZXN0VGVzdFQiLCAiVEVTVF9URVNUX1RFU1RfVCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJ0ZXN0VGVzdFRlc3RUIiwgIl9URVNUX1RFU1RfVEVTVF9UIiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoInRlc3RUZXN0VGVzdFQiLCAiX19URVNUX1RFU1RfVEVTVF9UIiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoIlRlc3RUZXN0VGVzdFQiLCAiVEVTVF9URVNUX1RFU1RfVCIsIHRydWUpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoIlRlc3RUZXN0VGVzdFQiLCAiX1RFU1RfVEVTVF9URVNUX1QiLCB0cnVlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJUZXN0VGVzdFRlc3RUIiwgIl9fVEVTVF9URVNUX1RFU1RfVCIsIHRydWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyTG93ZXJjYXNlKCkgewotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoInRlc3QiLCAidGVzdCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJ0ZXN0IiwgInRlc3RfIiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoInRlc3QiLCAidGVzdF9fX18iLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigiVGVzdCIsICJ0ZXN0IiwgdHJ1ZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigidGVzdCIsICJ0ZXN0IiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoInRlc3RUZXN0IiwgInRlc3RfdGVzdCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJ0ZXN0VGVzdCIsICJ0ZXN0X19fdGVzdCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJUZXN0VGVzdCIsICJ0ZXN0X3Rlc3QiLCB0cnVlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJ0ZXN0VGVzdFRlc3QiLCAidGVzdF90ZXN0X3Rlc3QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigiVGVzdFRlc3RUZXN0IiwgInRlc3RfdGVzdF90ZXN0IiwgdHJ1ZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigidGVzdFRlc3RUZXN0VCIsICJ0ZXN0X3Rlc3RfdGVzdF90IiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoInRlc3RUZXN0VGVzdFQiLCAiX3Rlc3RfdGVzdF90ZXN0X3QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigidGVzdFRlc3RUZXN0VCIsICJfX3Rlc3RfdGVzdF90ZXN0X3QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigiVGVzdFRlc3RUZXN0VCIsICJ0ZXN0X3Rlc3RfdGVzdF90IiwgdHJ1ZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigiVGVzdFRlc3RUZXN0VCIsICJfdGVzdF90ZXN0X3Rlc3RfdCIsIHRydWUpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoIlRlc3RUZXN0VGVzdFQiLCAiX190ZXN0X3Rlc3RfdGVzdF90IiwgdHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoU3RyaW5nIGV4cGVjdGVkLCBTdHJpbmcgc3RyaW5nLCBib29sZWFuIGNhcGl0YWxpemVGaXJzdExldHRlcikgewotCQlXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uKHN0cmluZywgY2FwaXRhbGl6ZUZpcnN0TGV0dGVyLCB3cml0ZXIpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHdyaXRlci50b1N0cmluZygpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvVGVzdFRvb2xzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1Rlc3RUb29scy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGEzZDg0Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvVGVzdFRvb2xzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0OwotaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdEZhaWx1cmU7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RSZXN1bHQ7Ci0KLS8qKgotICogdmFyaW91cyB0b29scyB0aGF0IGNhbiBiZSB1c2VkIGJ5IHRlc3QgY2FzZXMKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFRlc3RUb29scyB7Ci0KLQkvKioKLQkgKiB0ZXN0IGFuIG9iamVjdCdzIGltcGxlbWVudGF0aW9uIG9mIFNlcmlhbGl6YWJsZSBieSBzZXJpYWxpemluZyB0aGUKLQkgKiBzcGVjaWZpZWQgb2JqZWN0IHRvIGEgYnl0ZSBhcnJheTsgdGhlbiBkZS1zZXJpYWxpemluZyB0aGUgYnl0ZSBhcnJheSBhbmQKLQkgKiByZXR1cm5pbmcgdGhlIHJlc3VsdGFudCBvYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxUPiBUIHNlcmlhbGl6ZShUIG8pIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYU91dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oMjAwMCk7Ci0JCU9iamVjdE91dHB1dFN0cmVhbSBvdXRTdHJlYW0gPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKGJhT3V0U3RyZWFtKTsKLQkJb3V0U3RyZWFtLndyaXRlT2JqZWN0KG8pOwotCQlvdXRTdHJlYW0uY2xvc2UoKTsKLQotCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYUluU3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhT3V0U3RyZWFtLnRvQnl0ZUFycmF5KCkpOwotCQlPYmplY3RJbnB1dFN0cmVhbSBpblN0cmVhbSA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShiYUluU3RyZWFtKTsKLQkJVCBvMiA9IHJlYWRPYmplY3QoaW5TdHJlYW0pOwotCQlpblN0cmVhbS5jbG9zZSgpOwotCi0JCXJldHVybiBvMjsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIHN0YXRpYyA8VD4gVCByZWFkT2JqZWN0KE9iamVjdElucHV0IG9iamVjdElucHV0KSB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlyZXR1cm4gKFQpIG9iamVjdElucHV0LnJlYWRPYmplY3QoKTsKLQl9Ci0KLQkvKioKLQkgKiBzb21lIHRlc3RzIHJlcXVpcmUgYWNjZXNzIHRvIHRoZSBXZWIgKGUuZy4gYW55IHRlc3RzIHRoYXQgcGFyc2UgYW4gWE1MCi0JICogZG9jdW1lbnQgdGhhdCBzcGVjaWZpZXMgYSBEVEQgb3IgU2NoZW1hIHRoYXQgaXMgbG9hZGVkIGZyb20gdGhlIFdlYik7IHVzZQotCSAqIHRoaXMgbWV0aG9kIHRvIGNvbmZpZ3VyZSB0aGUgSkRLIHByb3h5IHNldHRpbmdzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFVwT3JhY2xlUHJveHkoKSB7Ci0JCVN5c3RlbS5zZXRQcm9wZXJ0eSgiaHR0cC5wcm94eUhvc3QiLCAid3d3LXByb3h5LnVzLm9yYWNsZS5jb20iKTsKLQkJU3lzdGVtLnNldFByb3BlcnR5KCJodHRwLnByb3h5UG9ydCIsICI4MCIpOwotCX0KLQotCS8qKgotCSAqIHNvbWUgdGVzdHMgcmVxdWlyZSBhY2Nlc3MgdG8gdGhlIFdlYiAoZS5nLiBhbnkgdGVzdHMgdGhhdCBwYXJzZSBhbiBYTUwKLQkgKiBkb2N1bWVudCB0aGF0IHNwZWNpZmllcyBhIERURCBvciBTY2hlbWEgdGhhdCBpcyBsb2FkZWQgZnJvbSB0aGUgV2ViKTsgdXNlCi0JICogdGhpcyBtZXRob2QgdG8gY29uZmlndXJlIHRoZSBKREsgcHJveHkgc2V0dGluZ3MgdmlhIHRoZSBjb21tYW5kLWxpbmUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGJ1aWxkT3JhY2xlUHJveHlDb21tYW5kTGluZU9wdGlvbnMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyAiLURodHRwLnByb3h5SG9zdD13d3ctcHJveHkudXMub3JhY2xlLmNvbSIsICItRGh0dHAucHJveHlQb3J0PTgwIiB9OwotCX0KLQotCS8qKgotCSAqIHJlZGlyZWN0IHN0ZCBvdXQgYW5kIHN0ZCBlcnIgdG8gdGhlIHNwZWNpZmllZCBzdHJlYW0KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVkaXJlY3RTeXN0ZW1TdHJlYW1zVG8oT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSkgewotCQlyZWRpcmVjdFN5c3RlbVN0cmVhbXNUbyhuZXcgUHJpbnRTdHJlYW0ob3V0cHV0U3RyZWFtKSk7Ci0JfQotCi0JLyoqCi0JICogcmVkaXJlY3Qgc3RkIG91dCBhbmQgc3RkIGVyciB0byB0aGUgc3BlY2lmaWVkIHN0cmVhbQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWRpcmVjdFN5c3RlbVN0cmVhbXNUbyhQcmludFN0cmVhbSBwcmludFN0cmVhbSkgewotCQlTeXN0ZW0uc2V0T3V0KHByaW50U3RyZWFtKTsKLQkJU3lzdGVtLnNldEVycihwcmludFN0cmVhbSk7Ci0JfQotCi0JLyoqCi0JICogZXhlY3V0ZSB0aGUgc3BlY2lmaWVkIHRlc3QgYW5kIGR1bXAgdGhlIHJlc3VsdHMgdG8gdGhlIGNvbnNvbGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleGVjdXRlKFRlc3RDYXNlIHRlc3RDYXNlKSB7Ci0JCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJVGVzdFJlc3VsdCByZXN1bHQgPSB0ZXN0Q2FzZS5ydW4oKTsKLQkJbG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQotCQlTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlQcmludFdyaXRlciB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoc3RyaW5nV3JpdGVyKTsKLQkJd3JpdGVyLnByaW50KHRlc3RDYXNlLmdldE5hbWUoKSk7Ci0JCXdyaXRlci5wcmludCgiOiAiKTsKLQkJaWYgKHJlc3VsdC53YXNTdWNjZXNzZnVsKCkpIHsKLQkJCXdyaXRlci5wcmludGxuKCJPSyIpOwotCQl9IGVsc2UgewotCQkJVGVzdEZhaWx1cmUgZmFpbHVyZSA9IG51bGw7Ci0JCQlpZiAocmVzdWx0LmZhaWx1cmVzKCkuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQlmYWlsdXJlID0gKFRlc3RGYWlsdXJlKSByZXN1bHQuZmFpbHVyZXMoKS5uZXh0RWxlbWVudCgpOwotCQkJfSBlbHNlIHsKLQkJCQlmYWlsdXJlID0gKFRlc3RGYWlsdXJlKSByZXN1bHQuZXJyb3JzKCkubmV4dEVsZW1lbnQoKTsKLQkJCX0KLQkJCWZhaWx1cmUudGhyb3duRXhjZXB0aW9uKCkucHJpbnRTdGFja1RyYWNlKHdyaXRlcik7Ci0JCX0KLQkJd3JpdGVyLnByaW50KCJlbGFwc2VkIHRpbWU6ICIpOwotCQlsb25nIGVsYXBzZWQgPSBlbmQgLSBzdGFydDsKLQkJd3JpdGVyLnByaW50KGVsYXBzZWQgLyAxMDAwTCk7Ci0JCXdyaXRlci5wcmludGxuKCIgc2VjLiIpOwotCQlyZXR1cm4gc3RyaW5nV3JpdGVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3M8VGVzdENhc2U+IFRlc3RDYXNlX2NsYXNzID0gVGVzdENhc2UuY2xhc3M7Ci0KLQkvKioKLQkgKiBDbGVhciBvdXQgYWxsIHRoZSBpbnN0YW5jZSB2YXJpYWJsZSBvZiB0aGUgc3BlY2lmaWVkIHRlc3QgY2FzZSwgYWxsb3dpbmcKLQkgKiB0aGUgdmFyaW91cyB0ZXN0IGZpeHR1cmVzIHRvIGJlIGdhcmJhZ2UtY29sbGVjdGVkLiBUeXBpY2FsbHkgdGhpcyBpcwotCSAqIGNhbGxlZCBpbiB0aGUgI3RlYXJEb3duKCkgbWV0aG9kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjbGVhcihUZXN0Q2FzZSB0ZXN0Q2FzZSkgdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gewotCQlmb3IgKENsYXNzPD8+IHRlbXBDbGFzcyA9IHRlc3RDYXNlLmdldENsYXNzKCk7IHRlbXBDbGFzcyAhPSBUZXN0Q2FzZV9jbGFzczsgdGVtcENsYXNzID0gdGVtcENsYXNzLmdldFN1cGVyY2xhc3MoKSkgewotCQkJRmllbGRbXSBmaWVsZHMgPSB0ZW1wQ2xhc3MuZ2V0RGVjbGFyZWRGaWVsZHMoKTsKLQkJCWZvciAoaW50IGkgPSBmaWVsZHMubGVuZ3RoOyBpLS0gPiAwOykgewotCQkJCUZpZWxkIGZpZWxkID0gZmllbGRzW2ldOwotCQkJCS8vIGxlYXZlIHByaW1pdGl2ZXMgYWxvbmUgLSB0aGV5IGRvbid0IGdldCBnYXJiYWdlLWNvbGxlY3RlZCwgYW5kIHdlIGNhbid0IHNldCB0aGVtIHRvIG51bGwuLi4KLQkJCQlpZiAoZmllbGQuZ2V0VHlwZSgpLmlzUHJpbWl0aXZlKCkpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCS8vIGxlYXZlIHN0YXRpYyBmaWVsZHMgYWxvbmUgKD8pCi0JCQkJaWYgKE1vZGlmaWVyLmlzU3RhdGljKGZpZWxkLmdldE1vZGlmaWVycygpKSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJZmllbGQuc2V0QWNjZXNzaWJsZSh0cnVlKTsKLQkJCQlmaWVsZC5zZXQodGVzdENhc2UsIG51bGwpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogV29ya2Fyb3VuZCBmb3IgYSBKVW5pdCBidWc6IEpVbml0IGRvZXMgbm90IGNvbmZpZ3VyZSB0aGUgdGVzdGluZyBUaHJlYWQKLQkgKiB3aXRoIGEgY29udGV4dCBjbGFzcyBsb2FkZXIuIFRoaXMgc2hvdWxkIHByb2JhYmx5IGhhcHBlbiBpbgotCSAqIFRlc3RSdW5uZXIuZG9SdW5UZXN0KFRlc3QpLCBqdXN0IGJlZm9yZSBzdGFydGluZyB0aGUgdGhyZWFkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRVcEpVbml0VGhyZWFkQ29udGV4dENsYXNzTG9hZGVyKCkgewotCQlUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihUZXN0VG9vbHMuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBUZXN0VG9vbHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9YTUxTdHJpbmdFbmNvZGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvWE1MU3RyaW5nRW5jb2RlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiMTA0YjkuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9YTUxTdHJpbmdFbmNvZGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkZpbGVUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5YTUxTdHJpbmdFbmNvZGVyOwotCi1wdWJsaWMgY2xhc3MgWE1MU3RyaW5nRW5jb2RlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIFhNTFN0cmluZ0VuY29kZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW5jb2RlTm9DaGFyYWN0ZXJTZXF1ZW5jZXMoKSB7Ci0JCVhNTFN0cmluZ0VuY29kZXIgZW5jb2RlciA9IG5ldyBYTUxTdHJpbmdFbmNvZGVyKEZpbGVUb29scy5JTlZBTElEX0ZJTEVOQU1FX0NIQVJBQ1RFUlMpOwotCi0JCVN0cmluZyBzID0gImZvbyI7Ci0JCWFzc2VydEVxdWFscyhzLCBlbmNvZGVyLmVuY29kZShzKSk7Ci0KLQkJcyA9ICIxMjNmb28xMjMiOwotCQlhc3NlcnRFcXVhbHMocywgZW5jb2Rlci5lbmNvZGUocykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbmNvZGVDaGFyYWN0ZXJTZXF1ZW5jZXMoKSB7Ci0JCVhNTFN0cmluZ0VuY29kZXIgZW5jb2RlciA9IG5ldyBYTUxTdHJpbmdFbmNvZGVyKEZpbGVUb29scy5JTlZBTElEX0ZJTEVOQU1FX0NIQVJBQ1RFUlMpOwotCi0JCVN0cmluZyBzID0gIj9mb28/IjsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIiYjeDNmO2ZvbyYjeDNmOyI7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgZW5jb2Rlci5lbmNvZGUocykpOwotCi0JCXMgPSAiP2ZvbyYxMjMiOwotCQlleHBlY3RlZCA9ICImI3gzZjtmb28mI3gyNjsxMjMiOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGVuY29kZXIuZW5jb2RlKHMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVub3JtYWxpemVWYWxpZEZpbGVOYW1lKCkgewotCQlYTUxTdHJpbmdFbmNvZGVyIGVuY29kZXIgPSBuZXcgWE1MU3RyaW5nRW5jb2RlcihGaWxlVG9vbHMuSU5WQUxJRF9GSUxFTkFNRV9DSEFSQUNURVJTKTsKLQotCQlTdHJpbmcgcyA9ICJmb28iOwotCQlhc3NlcnRFcXVhbHMocywgZW5jb2Rlci5kZWNvZGUocykpOwotCi0JCXMgPSAiMTIzZm9vMTIzIjsKLQkJYXNzZXJ0RXF1YWxzKHMsIGVuY29kZXIuZGVjb2RlKHMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVub3JtYWxpemVJbnZhbGlkRmlsZU5hbWUoKSB7Ci0JCVhNTFN0cmluZ0VuY29kZXIgZW5jb2RlciA9IG5ldyBYTUxTdHJpbmdFbmNvZGVyKEZpbGVUb29scy5JTlZBTElEX0ZJTEVOQU1FX0NIQVJBQ1RFUlMpOwotCi0JCVN0cmluZyBzID0gIiYjeDNmO2ZvbyYjeDNmOyI7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICI/Zm9vPyI7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgZW5jb2Rlci5kZWNvZGUocykpOwotCi0JCXMgPSAiJiN4M2Y7Zm9vJiN4MjY7MTIzIjsKLQkJZXhwZWN0ZWQgPSAiP2ZvbyYxMjMiOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGVuY29kZXIuZGVjb2RlKHMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Um91bmRUcmlwTm9DaGFyYWN0ZXJTZXF1ZW5jZXMoKSB7Ci0JCXRoaXMudmVyaWZ5Um91bmRUcmlwKCJmb28iKTsKLQkJdGhpcy52ZXJpZnlSb3VuZFRyaXAoIjEyM2ZvbzQ1NiIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSb3VuZFRyaXBDaGFyYWN0ZXJTZXF1ZW5jZXMoKSB7Ci0JCXRoaXMudmVyaWZ5Um91bmRUcmlwKCI/Zm9vPyIpOwotCQl0aGlzLnZlcmlmeVJvdW5kVHJpcCgiP2ZvbyYxMjMmJiYmJiY+Pj4+Iik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVJvdW5kVHJpcChTdHJpbmcgcykgewotCQlYTUxTdHJpbmdFbmNvZGVyIGVuY29kZXIgPSBuZXcgWE1MU3RyaW5nRW5jb2RlcihGaWxlVG9vbHMuSU5WQUxJRF9GSUxFTkFNRV9DSEFSQUNURVJTKTsKLQkJU3RyaW5nIGFjdHVhbCA9IGVuY29kZXIuZW5jb2RlKHMpOwotCQlhc3NlcnRFcXVhbHMocywgZW5jb2Rlci5kZWNvZGUoYWN0dWFsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRDaGFyYWN0ZXJTZXF1ZW5jZTEoKSB7Ci0JCXRoaXMudmVyaWZ5SWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJmb28mIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRDaGFyYWN0ZXJTZXF1ZW5jZTIoKSB7Ci0JCXRoaXMudmVyaWZ5SWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJmb28mIyIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQ2hhcmFjdGVyU2VxdWVuY2UzKCkgewotCQl0aGlzLnZlcmlmeUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZm9vJiN4Iik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRDaGFyYWN0ZXJTZXF1ZW5jZTQoKSB7Ci0JCXRoaXMudmVyaWZ5SWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJmb28mI3gzIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRDaGFyYWN0ZXJTZXF1ZW5jZTUoKSB7Ci0JCXRoaXMudmVyaWZ5SWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJmb28mI3g7Iik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRDaGFyYWN0ZXJTZXF1ZW5jZTYoKSB7Ci0JCXRoaXMudmVyaWZ5SWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJmb28mQSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQ2hhcmFjdGVyU2VxdWVuY2U3KCkgewotCQl0aGlzLnZlcmlmeUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZm9vJiNBIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbihTdHJpbmcgcykgewotCQlYTUxTdHJpbmdFbmNvZGVyIGVuY29kZXIgPSBuZXcgWE1MU3RyaW5nRW5jb2RlcihGaWxlVG9vbHMuSU5WQUxJRF9GSUxFTkFNRV9DSEFSQUNURVJTKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJcyA9IGVuY29kZXIuZGVjb2RlKHMpOwotCQkJZmFpbChzKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRDaGFyYWN0ZXJTZXF1ZW5jZTgoKSB7Ci0JCVN0cmluZyBzID0gImZvbyYjeFpaWlo7IjsKLQkJWE1MU3RyaW5nRW5jb2RlciBlbmNvZGVyID0gbmV3IFhNTFN0cmluZ0VuY29kZXIoRmlsZVRvb2xzLklOVkFMSURfRklMRU5BTUVfQ0hBUkFDVEVSUyk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXMgPSBlbmNvZGVyLmRlY29kZShzKTsKLQkJCWZhaWwocyk7Ci0JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvQXJyYXlJdGVyYXRvclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9BcnJheUl0ZXJhdG9yVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdjZjc2YS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9BcnJheUl0ZXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBBcnJheUl0ZXJhdG9yVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgQXJyYXlJdGVyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNOZXh0KCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkSXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRBcnJheSgpLmxlbmd0aCwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHQoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBlbGVtZW50IiwgKytpLCBJbnRlZ2VyLnBhcnNlSW50KHN0cmVhbS5uZXh0KCkpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSBudWxsOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJfQotCQl0cnkgewotCQkJc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93bjogIiArIHN0cmluZywgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlpZiAoc3RyZWFtLm5leHQoKS5lcXVhbHMoIjMiKSkgewotCQkJCXRyeSB7Ci0JCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpIHsKLQkJdGhpcy50cmlnZ2VySWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKC0xLCAxKTsKLQkJdGhpcy50cmlnZ2VySWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKDgsIDEpOwotCQl0aGlzLnRyaWdnZXJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oMCwgLTEpOwotCQl0aGlzLnRyaWdnZXJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oMCwgOSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdlbmVyaWNzKCkgewotCQlJbnRlZ2VyW10gaW50ZWdlcnMgPSBuZXcgSW50ZWdlclszXTsKLQkJaW50ZWdlcnNbMF0gPSAwOwotCQlpbnRlZ2Vyc1sxXSA9IDE7Ci0JCWludGVnZXJzWzJdID0gMjsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPE51bWJlcj4gc3RyZWFtID0gbmV3IEFycmF5SXRlcmF0b3I8TnVtYmVyPihpbnRlZ2Vycyk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlhc3NlcnRFcXVhbHMoaSsrLCBzdHJlYW0ubmV4dCgpLmludFZhbHVlKCkpOwotCQl9Ci0JCWFzc2VydEVxdWFscyhpbnRlZ2Vycy5sZW5ndGgsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYXJhcmdzKCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8TnVtYmVyPiBzdHJlYW0gPSBuZXcgQXJyYXlJdGVyYXRvcjxOdW1iZXI+KDAsIDEsIDIpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJYXNzZXJ0RXF1YWxzKGkrKywgc3RyZWFtLm5leHQoKS5pbnRWYWx1ZSgpKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoMywgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdHJpZ2dlcklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlzdHJlYW0gPSB0aGlzLmJ1aWxkSXRlcmF0b3Ioc3RhcnQsIGxlbmd0aCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBub3QgdGhyb3duOiAiICsgc3RyZWFtLCBleENhdWdodCk7Ci0JfQotCi0JSXRlcmF0b3I8U3RyaW5nPiBidWlsZEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZEl0ZXJhdG9yKHRoaXMuYnVpbGRBcnJheSgpKTsKLQl9Ci0KLQlJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkSXRlcmF0b3IoU3RyaW5nW10gYXJyYXkpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oYXJyYXkpOwotCX0KLQotCUl0ZXJhdG9yPFN0cmluZz4gYnVpbGRJdGVyYXRvcihpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRJdGVyYXRvcih0aGlzLmJ1aWxkQXJyYXkoKSwgc3RhcnQsIGxlbmd0aCk7Ci0JfQotCi0JSXRlcmF0b3I8U3RyaW5nPiBidWlsZEl0ZXJhdG9yKFN0cmluZ1tdIGFycmF5LCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oYXJyYXksIHN0YXJ0LCBsZW5ndGgpOwotCX0KLQotCVN0cmluZ1tdIGJ1aWxkQXJyYXkoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyAiMSIsICIyIiwgIjMiLCAiNCIsICI1IiwgIjYiLCAiNyIsICI4IiB9OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvQXJyYXlMaXN0SXRlcmF0b3JUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvQXJyYXlMaXN0SXRlcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDgyOTUwLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0FycmF5TGlzdEl0ZXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUxpc3RJdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIEFycmF5TGlzdEl0ZXJhdG9yVGVzdHMgZXh0ZW5kcyBBcnJheUl0ZXJhdG9yVGVzdHMgewotCi0JcHVibGljIEFycmF5TGlzdEl0ZXJhdG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc1ByZXZpb3VzKCkgewotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkTGlzdEl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCWludCBpID0gMDsKLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlzdHJlYW0ucHJldmlvdXMoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZEFycmF5KCkubGVuZ3RoLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJldmlvdXMoKSB7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRMaXN0SXRlcmF0b3IoKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJaW50IGkgPSB0aGlzLmJ1aWxkQXJyYXkoKS5sZW5ndGg7Ci0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBlbGVtZW50IiwgaS0tLCBJbnRlZ2VyLnBhcnNlSW50KHN0cmVhbS5wcmV2aW91cygpKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dEluZGV4KCkgewotCQlpbnQgaSA9IDA7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRMaXN0SXRlcmF0b3IoKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCWFzc2VydEVxdWFscyhpLCBzdHJlYW0ubmV4dEluZGV4KCkpOwotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoaSwgc3RyZWFtLm5leHRJbmRleCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJldmlvdXNJbmRleCgpIHsKLQkJaW50IGkgPSAwOwotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkTGlzdEl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoaSAtIDEsIHN0cmVhbS5wcmV2aW91c0luZGV4KCkpOwotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoaSAtIDEsIHN0cmVhbS5wcmV2aW91c0luZGV4KCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRMaXN0SXRlcmF0b3IoKTsKLQkJU3RyaW5nIHN0cmluZyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlzdHJpbmcgPSBzdHJlYW0ucHJldmlvdXMoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93bjogIiArIHN0cmluZywgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbkFkZCgpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlmb3IgKExpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRMaXN0SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWlmIChzdHJlYW0ubmV4dCgpLmVxdWFscygiMyIpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLmFkZCgiMy41Iik7Ci0JCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKCJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvblNldCgpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlmb3IgKExpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRMaXN0SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWlmIChzdHJlYW0ubmV4dCgpLmVxdWFscygiMyIpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLnNldCgidGhyZWUiKTsKLQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdGVzdEdlbmVyaWNzKCkgewotCQlJbnRlZ2VyW10gaW50ZWdlcnMgPSBuZXcgSW50ZWdlclszXTsKLQkJaW50ZWdlcnNbMF0gPSAwOwotCQlpbnRlZ2Vyc1sxXSA9IDE7Ci0JCWludGVnZXJzWzJdID0gMjsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPE51bWJlcj4gc3RyZWFtID0gbmV3IEFycmF5TGlzdEl0ZXJhdG9yPE51bWJlcj4oaW50ZWdlcnMpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJYXNzZXJ0RXF1YWxzKGkrKywgc3RyZWFtLm5leHQoKS5pbnRWYWx1ZSgpKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoaW50ZWdlcnMubGVuZ3RoLCBpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0ZXN0VmFyYXJncygpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPE51bWJlcj4gc3RyZWFtID0gbmV3IEFycmF5TGlzdEl0ZXJhdG9yPE51bWJlcj4oMCwgMSwgMik7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlhc3NlcnRFcXVhbHMoaSsrLCBzdHJlYW0ubmV4dCgpLmludFZhbHVlKCkpOwotCQl9Ci0JCWFzc2VydEVxdWFscygzLCBpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkTGlzdEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZExpc3RJdGVyYXRvcih0aGlzLmJ1aWxkQXJyYXkoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0SXRlcmF0b3I8U3RyaW5nPiBidWlsZExpc3RJdGVyYXRvcihTdHJpbmdbXSBhcnJheSkgewotCQlyZXR1cm4gbmV3IEFycmF5TGlzdEl0ZXJhdG9yPFN0cmluZz4oYXJyYXkpOwotCX0KLQotCUBPdmVycmlkZQotCUl0ZXJhdG9yPFN0cmluZz4gYnVpbGRJdGVyYXRvcihTdHJpbmdbXSBhcnJheSkgewotCQlyZXR1cm4gbmV3IEFycmF5TGlzdEl0ZXJhdG9yPFN0cmluZz4oYXJyYXkpOwotCX0KLQotCUBPdmVycmlkZQotCUl0ZXJhdG9yPFN0cmluZz4gYnVpbGRJdGVyYXRvcihTdHJpbmdbXSBhcnJheSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlMaXN0SXRlcmF0b3I8U3RyaW5nPihhcnJheSwgc3RhcnQsIGxlbmd0aCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9DaGFpbkl0ZXJhdG9yVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0NoYWluSXRlcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWNkMzA3Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0NoYWluSXRlcmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkFic3RyYWN0Q29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2hhaW5JdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIENoYWluSXRlcmF0b3JUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBDbGFzczw/PltdIFZFQ1RPUl9ISUVSQVJDSFkgPSB7IFZlY3Rvci5jbGFzcywgQWJzdHJhY3RMaXN0LmNsYXNzLCBBYnN0cmFjdENvbGxlY3Rpb24uY2xhc3MsIE9iamVjdC5jbGFzcyB9OwotCi0JcHVibGljIENoYWluSXRlcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTmV4dCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPENsYXNzPD8+PiBzdHJlYW0gPSB0aGlzLmJ1aWxkSXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKFZFQ1RPUl9ISUVSQVJDSFkubGVuZ3RoLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5uZXJIYXNOZXh0KCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8Q2xhc3M8Pz4+IHN0cmVhbSA9IHRoaXMuYnVpbGRJbm5lckl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyhWRUNUT1JfSElFUkFSQ0hZLmxlbmd0aCwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHQoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxDbGFzczw/Pj4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7IGkrKykgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBsaW5rIiwgVkVDVE9SX0hJRVJBUkNIWVtpXSwgc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5uZXJOZXh0KCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8Q2xhc3M8Pz4+IHN0cmVhbSA9IHRoaXMuYnVpbGRJbm5lckl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7IGkrKykgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBsaW5rIiwgVkVDVE9SX0hJRVJBUkNIWVtpXSwgc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlJdGVyYXRvcjxDbGFzczw/Pj4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yKCk7Ci0JCUNsYXNzPD8+IGphdmFDbGFzcyA9IG51bGw7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlqYXZhQ2xhc3MgPSBzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCXRyeSB7Ci0JCQlqYXZhQ2xhc3MgPSBzdHJlYW0ubmV4dCgpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duOiAiICsgamF2YUNsYXNzLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCWZvciAoSXRlcmF0b3I8Q2xhc3M8Pz4+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkgPT0gQWJzdHJhY3RDb2xsZWN0aW9uLmNsYXNzKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPENsYXNzPD8+PiBidWlsZEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZENoYWluSXRlcmF0b3IoVmVjdG9yLmNsYXNzLCB0aGlzLmJ1aWxkTGlua2VyKCkpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8Q2xhc3M8Pz4+IGJ1aWxkSW5uZXJJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRJbm5lckNoYWluSXRlcmF0b3IoVmVjdG9yLmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPENsYXNzPD8+PiBidWlsZENoYWluSXRlcmF0b3IoQ2xhc3M8Pz4gc3RhcnRMaW5rLCBDaGFpbkl0ZXJhdG9yLkxpbmtlcjxDbGFzczw/Pj4gbGlua2VyKSB7Ci0JCXJldHVybiBuZXcgQ2hhaW5JdGVyYXRvcjxDbGFzczw/Pj4oc3RhcnRMaW5rLCBsaW5rZXIpOwotCX0KLQotCXByaXZhdGUgQ2hhaW5JdGVyYXRvci5MaW5rZXI8Q2xhc3M8Pz4+IGJ1aWxkTGlua2VyKCkgewotCQkvLyBjaGFpbiB1cCB0aGUgY2xhc3MncyBoaWVyYXJjaHkKLQkJcmV0dXJuIG5ldyBDaGFpbkl0ZXJhdG9yLkxpbmtlcjxDbGFzczw/Pj4oKSB7Ci0JCQlwdWJsaWMgQ2xhc3M8Pz4gbmV4dExpbmsoQ2xhc3M8Pz4gY3VycmVudExpbmspIHsKLQkJCQlyZXR1cm4gY3VycmVudExpbmsuZ2V0U3VwZXJjbGFzcygpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8Q2xhc3M8Pz4+IGJ1aWxkSW5uZXJDaGFpbkl0ZXJhdG9yKENsYXNzPD8+IHN0YXJ0TGluaykgewotCQkvLyBjaGFpbiB1cCB0aGUgY2xhc3MncyBoaWVyYXJjaHkKLQkJcmV0dXJuIG5ldyBDaGFpbkl0ZXJhdG9yPENsYXNzPD8+PihzdGFydExpbmspIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIENsYXNzPD8+IG5leHRMaW5rKENsYXNzPD8+IGN1cnJlbnRMaW5rKSB7Ci0JCQkJcmV0dXJuIGN1cnJlbnRMaW5rLmdldFN1cGVyY2xhc3MoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0Nsb25lSXRlcmF0b3JUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvQ2xvbmVJdGVyYXRvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzYWZkYjUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvQ2xvbmVJdGVyYXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotcHVibGljIGNsYXNzIENsb25lSXRlcmF0b3JUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlDb2xsZWN0aW9uPFN0cmluZz4gb3JpZ2luYWxDb2xsZWN0aW9uOwotCi0JcHJpdmF0ZSBib29sZWFuIGNvbmN1cnJlbnRQcm9ibGVtOwotCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IGNvbmN1cnJlbnRDb2xsZWN0aW9uOwotCi0JcHVibGljIENsb25lSXRlcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLm9yaWdpbmFsQ29sbGVjdGlvbiA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNOZXh0KCkgewotCQlpbnQgb3JpZ2luYWxTaXplID0gdGhpcy5vcmlnaW5hbENvbGxlY3Rpb24uc2l6ZSgpOwotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkQ2xvbmVJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCS8vIHNob3VsZCBhbGxvdyBjb25jdXJyZW50IG1vZGlmaWNhdGlvbgotCQkJdGhpcy5vcmlnaW5hbENvbGxlY3Rpb24uYWRkKCJmb28iKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRUcnVlKG9yaWdpbmFsU2l6ZSAhPSB0aGlzLm9yaWdpbmFsQ29sbGVjdGlvbi5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JpZ2luYWxTaXplLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dCgpIHsKLQkJSXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRJdGVyYXRvciA9IHRoaXMub3JpZ2luYWxDb2xsZWN0aW9uLml0ZXJhdG9yKCk7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkQ2xvbmVJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBlbGVtZW50IiwgbmVzdGVkSXRlcmF0b3IubmV4dCgpLCBzdHJlYW0ubmV4dCgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZENsb25lSXRlcmF0b3IoKTsKLQkJU3RyaW5nIHN0cmluZyA9IG51bGw7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJpbmcgPSBzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCXRyeSB7Ci0JCQlzdHJpbmcgPSBzdHJlYW0ubmV4dCgpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duOiAiICsgc3RyaW5nLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZURlZmF1bHQoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRDbG9uZUl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlpZiAoc3RyZWFtLm5leHQoKS5lcXVhbHMoInRocmVlIikpIHsKLQkJCQl0cnkgewotCQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKCJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVFbGltaW5hdG9yKCkgewotCQlDbG9uZUl0ZXJhdG9yLk11dGF0b3I8U3RyaW5nPiBlbGltaW5hdG9yID0gbmV3IENsb25lSXRlcmF0b3IuTXV0YXRvcjxTdHJpbmc+KCkgewotCQkJcHVibGljIHZvaWQgcmVtb3ZlKFN0cmluZyBjdXJyZW50KSB7Ci0JCQkJQ2xvbmVJdGVyYXRvclRlc3RzLnRoaXMub3JpZ2luYWxDb2xsZWN0aW9uLnJlbW92ZShjdXJyZW50KTsKLQkJCX0KLQkJfTsKLQkJdGhpcy52ZXJpZnlSZW1vdmUobmV3IENsb25lSXRlcmF0b3I8U3RyaW5nPih0aGlzLm9yaWdpbmFsQ29sbGVjdGlvbiwgZWxpbWluYXRvcikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVTdWJjbGFzcygpIHsKLQkJdGhpcy52ZXJpZnlSZW1vdmUobmV3IENsb25lSXRlcmF0b3I8U3RyaW5nPih0aGlzLm9yaWdpbmFsQ29sbGVjdGlvbikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCByZW1vdmUoU3RyaW5nIGN1cnJlbnQpIHsKLQkJCQlDbG9uZUl0ZXJhdG9yVGVzdHMudGhpcy5vcmlnaW5hbENvbGxlY3Rpb24ucmVtb3ZlKGN1cnJlbnQpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBUZXN0IGNvbmN1cnJlbnQgYWNjZXNzOiBGaXJzdCBidWlsZCBhIGNsb25lIGl0ZXJhdG9yIGluIGEgc2VwYXJhdGUgdGhyZWFkCi0JICogdGhhdCBoYW5ncyBtb21lbnRhcmlseSBkdXJpbmcgaXRzIGNvbnN0cnVjdGlvbjsgdGhlbiBtb2RpZnkgdGhlIHNoYXJlZAotCSAqIGNvbGxlY3Rpb24gaW4gdGhpcyB0aHJlYWQuIFRoaXMgd291bGQgY2F1c2UgYQotCSAqIENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24gaW4gdGhlIG90aGVyIHRocmVhZCBpZiB0aGUgY2xvbmUgaXRlcmF0b3IKLQkgKiB3ZXJlIG5vdCBzeW5jaHJvbml6ZWQgb24gdGhlIG9yaWdpbmFsIGNvbGxlY3Rpb24uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdENvbmN1cnJlbnRBY2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2xvd0NvbGxlY3Rpb248U3RyaW5nPiBzbG93ID0gbmV3IFNsb3dDb2xsZWN0aW9uPFN0cmluZz4oKTsKLQkJdGhpcy5wb3B1bGF0ZUNvbGxlY3Rpb24oc2xvdyk7Ci0JCS8vIHVzaW5nIHRoZSB1bnN5bmNocm9uaXplZCBjb2xsZWN0aW9uIHdpbGwgY2F1c2UgdGhlIHRlc3QgdG8gZmFpbAotCQkvLwkJdGhpcy5vcmlnaW5hbENvbGxlY3Rpb24gPSBzbG93OwotCQl0aGlzLm9yaWdpbmFsQ29sbGVjdGlvbiA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZENvbGxlY3Rpb24oc2xvdyk7Ci0KLQkJdGhpcy5jb25jdXJyZW50UHJvYmxlbSA9IGZhbHNlOwotCQl0aGlzLmNvbmN1cnJlbnRDb2xsZWN0aW9uID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCVRocmVhZCB0aHJlYWQgPSBuZXcgVGhyZWFkKHRoaXMuYnVpbGRSdW5uYWJsZSgpKTsKLQkJdGhyZWFkLnN0YXJ0KCk7Ci0JCXdoaWxlICghc2xvdy5oYXNTdGFydGVkQ2xvbmUoKSkgewotCQkJLy8gd2FpdCBmb3IgdGhlIG90aGVyIHRocmVhZCB0byBzdGFydCB0aGUgY2xvbmUuLi4KLQkJCVRocmVhZC55aWVsZCgpOwotCQl9Ci0JCS8vIC4uLnRoZW4gc25lYWsgaW4gYW4gZXh0cmEgZWxlbWVudAotCQl0aGlzLm9yaWdpbmFsQ29sbGVjdGlvbi5hZGQoInNldmVudGVlbiIpOwotCQl3aGlsZSAodGhyZWFkLmlzQWxpdmUoKSkgewotCQkJLy8gd2FpdCBmb3IgdGhlIG90aGVyIHRocmVhZCB0byBmaW5pc2gKLQkJCVRocmVhZC55aWVsZCgpOwotCQl9Ci0JCWFzc2VydEZhbHNlKHRoaXMuY29uY3VycmVudFByb2JsZW0pOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gZXhwZWN0ZWQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJdGhpcy5wb3B1bGF0ZUNvbGxlY3Rpb24oZXhwZWN0ZWQpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29uY3VycmVudENvbGxlY3Rpb24pOwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRSdW5uYWJsZSgpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlDbG9uZUl0ZXJhdG9yVGVzdHMudGhpcy5sb29wV2l0aENsb25lSXRlcmF0b3IoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiB1c2UgYSBjbG9uZSBpdGVyYXRvciB0byBsb29wIG92ZXIgdGhlICJzbG93IiBjb2xsZWN0aW9uIGFuZCBjb3B5IGl0cwotCSAqIGNvbnRlbnRzIHRvIHRoZSBjb25jdXJyZW50IGNvbGxlY3Rpb24KLQkgKi8KLQl2b2lkIGxvb3BXaXRoQ2xvbmVJdGVyYXRvcigpIHsKLQkJdHJ5IHsKLQkJCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkQ2xvbmVJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJCXRoaXMuY29uY3VycmVudENvbGxlY3Rpb24uYWRkKHN0cmVhbS5uZXh0KCkpOwotCQkJfQotCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJdGhpcy5jb25jdXJyZW50UHJvYmxlbSA9IHRydWU7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UmVtb3ZlKEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IpIHsKLQkJT2JqZWN0IHJlbW92ZWQgPSAidGhyZWUiOwotCQlhc3NlcnRUcnVlKHRoaXMub3JpZ2luYWxDb2xsZWN0aW9uLmNvbnRhaW5zKHJlbW92ZWQpKTsKLQkJLy8gdHJ5IHRvIHJlbW92ZSBiZWZvcmUgY2FsbGluZyAjbmV4dCgpCi0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJaWYgKGl0ZXJhdG9yLm5leHQoKS5lcXVhbHMocmVtb3ZlZCkpIHsKLQkJCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJCQkvLyB0cnkgdG8gcmVtb3ZlIHR3aWNlCi0JCQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJCQl0cnkgewotCQkJCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCQlhc3NlcnRUcnVlKCJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQkJCX0KLQkJfQotCQlhc3NlcnRGYWxzZSh0aGlzLm9yaWdpbmFsQ29sbGVjdGlvbi5jb250YWlucyhyZW1vdmVkKSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkQ2xvbmVJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRDbG9uZUl0ZXJhdG9yKHRoaXMub3JpZ2luYWxDb2xsZWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRDbG9uZUl0ZXJhdG9yKENvbGxlY3Rpb248U3RyaW5nPiBjKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVJdGVyYXRvcjxTdHJpbmc+KGMpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IGJ1aWxkQ29sbGVjdGlvbigpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSB0aGlzLmJ1aWxkRW1wdHlDb2xsZWN0aW9uKCk7Ci0JCXRoaXMucG9wdWxhdGVDb2xsZWN0aW9uKGMpOwotCQlyZXR1cm4gYzsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxTdHJpbmc+IGJ1aWxkRW1wdHlDb2xsZWN0aW9uKCkgewotCQlyZXR1cm4gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlQ29sbGVjdGlvbihDb2xsZWN0aW9uPFN0cmluZz4gYykgewotCQljLmFkZCgib25lIik7Ci0JCWMuYWRkKCJ0d28iKTsKLQkJYy5hZGQoInRocmVlIik7Ci0JCWMuYWRkKCJmb3VyIik7Ci0JCWMuYWRkKCJmaXZlIik7Ci0JCWMuYWRkKCJzaXgiKTsKLQkJYy5hZGQoInNldmVuIik7Ci0JCWMuYWRkKCJlaWdodCIpOwotCX0KLQotCS8vICoqKioqKioqKiogY3VzdG9tIGNvbGxlY3Rpb24gKioqKioqKioqKgotCXN0YXRpYyBjbGFzcyBTbG93Q29sbGVjdGlvbjxFPiBleHRlbmRzIEFycmF5TGlzdDxFPiB7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQlwcml2YXRlIGJvb2xlYW4gaGFzU3RhcnRlZENsb25lID0gZmFsc2U7Ci0KLQkJcHVibGljIFNsb3dDb2xsZWN0aW9uKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpIHsKLQkJCXRoaXMuc2V0SGFzU3RhcnRlZENsb25lKHRydWUpOwotCQkJLy8gdGFrZSBhIGxpdHRsZSBzbm9vemUgYmVmb3JlIHJldHVybmluZyB0aGUgYXJyYXkKLQkJCXRyeSB7Ci0JCQkJVGhyZWFkLnNsZWVwKDEwMCk7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgewotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLQkJCX0KLQkJCXJldHVybiBzdXBlci50b0FycmF5KCk7Ci0JCX0KLQotCQlzeW5jaHJvbml6ZWQgdm9pZCBzZXRIYXNTdGFydGVkQ2xvbmUoYm9vbGVhbiBoYXNTdGFydGVkQ2xvbmUpIHsKLQkJCXRoaXMuaGFzU3RhcnRlZENsb25lID0gaGFzU3RhcnRlZENsb25lOwotCQl9Ci0KLQkJc3luY2hyb25pemVkIGJvb2xlYW4gaGFzU3RhcnRlZENsb25lKCkgewotCQkJcmV0dXJuIHRoaXMuaGFzU3RhcnRlZENsb25lOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9DbG9uZUxpc3RJdGVyYXRvclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9DbG9uZUxpc3RJdGVyYXRvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDQ1YTkuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvQ2xvbmVMaXN0SXRlcmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotcHVibGljIGNsYXNzIENsb25lTGlzdEl0ZXJhdG9yVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JTGlzdDxTdHJpbmc+IG9yaWdpbmFsTGlzdDsKLQotCXByaXZhdGUgYm9vbGVhbiBjb25jdXJyZW50UHJvYmxlbTsKLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBjb25jdXJyZW50TGlzdDsKLQotCXB1YmxpYyBDbG9uZUxpc3RJdGVyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMub3JpZ2luYWxMaXN0ID0gdGhpcy5idWlsZExpc3QoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc05leHQoKSB7Ci0JCWludCBvcmlnaW5hbFNpemUgPSB0aGlzLm9yaWdpbmFsTGlzdC5zaXplKCk7Ci0JCWludCBpID0gMDsKLQkJZm9yIChMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkQ2xvbmVMaXN0SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQkvLyBzaG91bGQgYWxsb3cgY29uY3VycmVudCBtb2RpZmljYXRpb24KLQkJCXRoaXMub3JpZ2luYWxMaXN0LmFkZCgiZm9vIik7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShvcmlnaW5hbFNpemUgIT0gdGhpcy5vcmlnaW5hbExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yaWdpbmFsU2l6ZSwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHQoKSB7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZExpc3RJdGVyYXRvciA9IHRoaXMuYnVpbGROZXN0ZWRMaXN0SXRlcmF0b3IoKTsKLQkJZm9yIChMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkQ2xvbmVMaXN0SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgZWxlbWVudCIsIG5lc3RlZExpc3RJdGVyYXRvci5uZXh0KCksIHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluZGV4KCkgewotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBjbG9uZUxpc3RJdGVyYXRvciA9IHRoaXMuYnVpbGRDbG9uZUxpc3RJdGVyYXRvcigpOwotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRMaXN0SXRlcmF0b3IgPSB0aGlzLmJ1aWxkTmVzdGVkTGlzdEl0ZXJhdG9yKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgNzsgaSsrKSB7Ci0JCQluZXN0ZWRMaXN0SXRlcmF0b3IubmV4dCgpOwotCQkJY2xvbmVMaXN0SXRlcmF0b3IubmV4dCgpOwotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBpbmRleCIsIG5lc3RlZExpc3RJdGVyYXRvci5uZXh0SW5kZXgoKSwgY2xvbmVMaXN0SXRlcmF0b3IubmV4dEluZGV4KCkpOwotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBpbmRleCIsIG5lc3RlZExpc3RJdGVyYXRvci5wcmV2aW91c0luZGV4KCksIGNsb25lTGlzdEl0ZXJhdG9yLnByZXZpb3VzSW5kZXgoKSk7Ci0JCX0KLQotCQlmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotCQkJbmVzdGVkTGlzdEl0ZXJhdG9yLnByZXZpb3VzKCk7Ci0JCQljbG9uZUxpc3RJdGVyYXRvci5wcmV2aW91cygpOwotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBpbmRleCIsIG5lc3RlZExpc3RJdGVyYXRvci5uZXh0SW5kZXgoKSwgY2xvbmVMaXN0SXRlcmF0b3IubmV4dEluZGV4KCkpOwotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBpbmRleCIsIG5lc3RlZExpc3RJdGVyYXRvci5wcmV2aW91c0luZGV4KCksIGNsb25lTGlzdEl0ZXJhdG9yLnByZXZpb3VzSW5kZXgoKSk7Ci0JCX0KLQotCQl3aGlsZSAobmVzdGVkTGlzdEl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJbmVzdGVkTGlzdEl0ZXJhdG9yLm5leHQoKTsKLQkJCWNsb25lTGlzdEl0ZXJhdG9yLm5leHQoKTsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgaW5kZXgiLCBuZXN0ZWRMaXN0SXRlcmF0b3IubmV4dEluZGV4KCksIGNsb25lTGlzdEl0ZXJhdG9yLm5leHRJbmRleCgpKTsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgaW5kZXgiLCBuZXN0ZWRMaXN0SXRlcmF0b3IucHJldmlvdXNJbmRleCgpLCBjbG9uZUxpc3RJdGVyYXRvci5wcmV2aW91c0luZGV4KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc1ByZXZpb3VzKCkgewotCQlpbnQgb3JpZ2luYWxTaXplID0gdGhpcy5vcmlnaW5hbExpc3Quc2l6ZSgpOwotCQlpbnQgaSA9IDA7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRDbG9uZUxpc3RJdGVyYXRvcigpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCXRoaXMub3JpZ2luYWxMaXN0LmFkZCgiZm9vIik7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShvcmlnaW5hbFNpemUgIT0gdGhpcy5vcmlnaW5hbExpc3Quc2l6ZSgpKTsKLQkJb3JpZ2luYWxTaXplID0gdGhpcy5vcmlnaW5hbExpc3Quc2l6ZSgpOwotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCXN0cmVhbS5wcmV2aW91cygpOwotCQkJLy8gc2hvdWxkIGFsbG93IGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uCi0JCQl0aGlzLm9yaWdpbmFsTGlzdC5hZGQoImJhciIpOwotCQkJaS0tOwotCQl9Ci0JCWFzc2VydFRydWUob3JpZ2luYWxTaXplICE9IHRoaXMub3JpZ2luYWxMaXN0LnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJldmlvdXMoKSB7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZExpc3RJdGVyYXRvciA9IHRoaXMuYnVpbGROZXN0ZWRMaXN0SXRlcmF0b3IoKTsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZENsb25lTGlzdEl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQluZXN0ZWRMaXN0SXRlcmF0b3IubmV4dCgpOwotCQkJc3RyZWFtLm5leHQoKTsKLQkJfQotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgZWxlbWVudCIsIG5lc3RlZExpc3RJdGVyYXRvci5wcmV2aW91cygpLCBzdHJlYW0ucHJldmlvdXMoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkQ2xvbmVMaXN0SXRlcmF0b3IoKTsKLQkJU3RyaW5nIHN0cmluZyA9IG51bGw7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJpbmcgPSBzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCXRyeSB7Ci0JCQlzdHJpbmcgPSBzdHJlYW0ubmV4dCgpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duOiAiICsgc3RyaW5nLCBleENhdWdodCk7Ci0KLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlzdHJpbmcgPSBzdHJlYW0ucHJldmlvdXMoKTsKLQkJfQotCQl0cnkgewotCQkJc3RyaW5nID0gc3RyZWFtLnByZXZpb3VzKCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd246ICIgKyBzdHJpbmcsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5RGVmYXVsdCgpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlmb3IgKExpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRDbG9uZUxpc3RJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuZXF1YWxzKCJ0aHJlZSIpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQotCQlleENhdWdodCA9IGZhbHNlOwotCQlmb3IgKExpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRDbG9uZUxpc3RJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuZXF1YWxzKCJ0aHJlZSIpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLmFkZCgidGhyZWUgYW5kIGEgaGFsZiIpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQotCQlleENhdWdodCA9IGZhbHNlOwotCQlmb3IgKExpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRDbG9uZUxpc3RJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuZXF1YWxzKCJ0aHJlZSIpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLnNldCgiYW5vdGhlciB0aHJlZSIpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TXV0YXRvck5leHQoKSB7Ci0JCXRoaXMudmVyaWZ5TW9kaWZ5TmV4dChuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8U3RyaW5nPih0aGlzLm9yaWdpbmFsTGlzdCwgdGhpcy5idWlsZE11dGF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlNdXRhdG9yUHJldmlvdXMoKSB7Ci0JCXRoaXMudmVyaWZ5TW9kaWZ5UHJldmlvdXMobmV3IENsb25lTGlzdEl0ZXJhdG9yPFN0cmluZz4odGhpcy5vcmlnaW5hbExpc3QsIHRoaXMuYnVpbGRNdXRhdG9yKCkpKTsKLQl9Ci0KLQlwcml2YXRlIENsb25lTGlzdEl0ZXJhdG9yLk11dGF0b3I8U3RyaW5nPiBidWlsZE11dGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3IuTXV0YXRvcjxTdHJpbmc+KCkgewotCQkJcHVibGljIHZvaWQgYWRkKGludCBpbmRleCwgU3RyaW5nIG8pIHsKLQkJCQlDbG9uZUxpc3RJdGVyYXRvclRlc3RzLnRoaXMub3JpZ2luYWxMaXN0LmFkZChpbmRleCwgbyk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHJlbW92ZShpbnQgaW5kZXgpIHsKLQkJCQlDbG9uZUxpc3RJdGVyYXRvclRlc3RzLnRoaXMub3JpZ2luYWxMaXN0LnJlbW92ZShpbmRleCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHNldChpbnQgaW5kZXgsIFN0cmluZyBvKSB7Ci0JCQkJQ2xvbmVMaXN0SXRlcmF0b3JUZXN0cy50aGlzLm9yaWdpbmFsTGlzdC5zZXQoaW5kZXgsIG8pOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTdWJjbGFzc05leHQoKSB7Ci0JCXRoaXMudmVyaWZ5TW9kaWZ5TmV4dCh0aGlzLmJ1aWxkU3ViY2xhc3MoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVN1YmNsYXNzUHJldmlvdXMoKSB7Ci0JCXRoaXMudmVyaWZ5TW9kaWZ5UHJldmlvdXModGhpcy5idWlsZFN1YmNsYXNzKCkpOwotCX0KLQotCXByaXZhdGUgTGlzdEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRTdWJjbGFzcygpIHsKLQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxTdHJpbmc+KHRoaXMub3JpZ2luYWxMaXN0KSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZChpbnQgY3VycmVudEluZGV4LCBTdHJpbmcgbykgewotCQkJCUNsb25lTGlzdEl0ZXJhdG9yVGVzdHMudGhpcy5vcmlnaW5hbExpc3QuYWRkKGN1cnJlbnRJbmRleCwgbyk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlKGludCBjdXJyZW50SW5kZXgpIHsKLQkJCQlDbG9uZUxpc3RJdGVyYXRvclRlc3RzLnRoaXMub3JpZ2luYWxMaXN0LnJlbW92ZShjdXJyZW50SW5kZXgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldChpbnQgY3VycmVudEluZGV4LCBTdHJpbmcgbykgewotCQkJCUNsb25lTGlzdEl0ZXJhdG9yVGVzdHMudGhpcy5vcmlnaW5hbExpc3Quc2V0KGN1cnJlbnRJbmRleCwgbyk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeU1vZGlmeU5leHQoTGlzdEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IpIHsKLQkJU3RyaW5nIHJlbW92ZWQgPSAidGhyZWUiOwotCQlTdHJpbmcgYWRkZWRBZnRlciA9ICJmaXZlIjsKLQkJU3RyaW5nIGFkZGVkID0gImZpdmUgYW5kIGEgaGFsZiI7Ci0JCVN0cmluZyByZXBsYWNlZCA9ICJzZXZlbiI7Ci0JCVN0cmluZyByZXBsYWNlbWVudCA9ICJhbm90aGVyIHNldmVuIjsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm9yaWdpbmFsTGlzdC5jb250YWlucyhyZW1vdmVkKSk7Ci0JCWFzc2VydFRydWUodGhpcy5vcmlnaW5hbExpc3QuY29udGFpbnMoYWRkZWRBZnRlcikpOwotCQlhc3NlcnRUcnVlKHRoaXMub3JpZ2luYWxMaXN0LmNvbnRhaW5zKHJlcGxhY2VkKSk7Ci0JCS8vIHRyeSB0byByZW1vdmUgYmVmb3JlIGNhbGxpbmcgI25leHQoKQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyBuZXh0ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKG5leHQuZXF1YWxzKGFkZGVkQWZ0ZXIpKSB7Ci0JCQkJaXRlcmF0b3IuYWRkKGFkZGVkKTsKLQkJCX0KLQkJCWlmIChuZXh0LmVxdWFscyhyZW1vdmVkKSkgewotCQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQkJCS8vIHRyeSB0byByZW1vdmUgdHdpY2UKLQkJCQlleENhdWdodCA9IGZhbHNlOwotCQkJCXRyeSB7Ci0JCQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQkJCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJCWFzc2VydFRydWUoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCQkJfQotCQkJaWYgKG5leHQuZXF1YWxzKHJlcGxhY2VkKSkgewotCQkJCWl0ZXJhdG9yLnNldChyZXBsYWNlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSh0aGlzLm9yaWdpbmFsTGlzdC5jb250YWlucyhhZGRlZCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLm9yaWdpbmFsTGlzdC5jb250YWlucyhyZW1vdmVkKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMub3JpZ2luYWxMaXN0LmNvbnRhaW5zKHJlcGxhY2VkKSk7Ci0JCWFzc2VydFRydWUodGhpcy5vcmlnaW5hbExpc3QuY29udGFpbnMocmVwbGFjZW1lbnQpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5TW9kaWZ5UHJldmlvdXMoTGlzdEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IpIHsKLQkJU3RyaW5nIHJlbW92ZWQgPSAidGhyZWUiOwotCQlTdHJpbmcgYWRkZWRCZWZvcmUgPSAiZml2ZSI7Ci0JCVN0cmluZyBhZGRlZCA9ICJmb3VyIGFuZCBhIGhhbGYiOwotCQlTdHJpbmcgcmVwbGFjZWQgPSAic2V2ZW4iOwotCQlTdHJpbmcgcmVwbGFjZW1lbnQgPSAiYW5vdGhlciBzZXZlbiI7Ci0JCWFzc2VydFRydWUodGhpcy5vcmlnaW5hbExpc3QuY29udGFpbnMocmVtb3ZlZCkpOwotCQlhc3NlcnRUcnVlKHRoaXMub3JpZ2luYWxMaXN0LmNvbnRhaW5zKGFkZGVkQmVmb3JlKSk7Ci0JCWFzc2VydFRydWUodGhpcy5vcmlnaW5hbExpc3QuY29udGFpbnMocmVwbGFjZWQpKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJaXRlcmF0b3IubmV4dCgpOwotCQl9Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNQcmV2aW91cygpKSB7Ci0JCQlPYmplY3QgcHJldmlvdXMgPSBpdGVyYXRvci5wcmV2aW91cygpOwotCQkJaWYgKHByZXZpb3VzLmVxdWFscyhhZGRlZEJlZm9yZSkpIHsKLQkJCQlpdGVyYXRvci5hZGQoYWRkZWQpOwotCQkJfQotCQkJaWYgKHByZXZpb3VzLmVxdWFscyhyZW1vdmVkKSkgewotCQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQkJCS8vIHRyeSB0byByZW1vdmUgdHdpY2UKLQkJCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCQkJdHJ5IHsKLQkJCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJYXNzZXJ0VHJ1ZSgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JCQl9Ci0JCQlpZiAocHJldmlvdXMuZXF1YWxzKHJlcGxhY2VkKSkgewotCQkJCWl0ZXJhdG9yLnNldChyZXBsYWNlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSh0aGlzLm9yaWdpbmFsTGlzdC5jb250YWlucyhhZGRlZCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLm9yaWdpbmFsTGlzdC5jb250YWlucyhyZW1vdmVkKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMub3JpZ2luYWxMaXN0LmNvbnRhaW5zKHJlcGxhY2VkKSk7Ci0JCWFzc2VydFRydWUodGhpcy5vcmlnaW5hbExpc3QuY29udGFpbnMocmVwbGFjZW1lbnQpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkQ2xvbmVMaXN0SXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkQ2xvbmVMaXN0SXRlcmF0b3IodGhpcy5vcmlnaW5hbExpc3QpOwotCX0KLQotCXByaXZhdGUgTGlzdEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRDbG9uZUxpc3RJdGVyYXRvcihMaXN0PFN0cmluZz4gbGlzdCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPFN0cmluZz4obGlzdCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0SXRlcmF0b3I8U3RyaW5nPiBidWlsZE5lc3RlZExpc3RJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMub3JpZ2luYWxMaXN0Lmxpc3RJdGVyYXRvcigpOwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkTGlzdCgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkRW1wdHlMaXN0KCk7Ci0JCXRoaXMucG9wdWxhdGVMaXN0KGxpc3QpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVMaXN0KExpc3Q8U3RyaW5nPiBsaXN0KSB7Ci0JCWxpc3QuYWRkKCJ6ZXJvIik7Ci0JCWxpc3QuYWRkKCJvbmUiKTsKLQkJbGlzdC5hZGQoInR3byIpOwotCQlsaXN0LmFkZCgidGhyZWUiKTsKLQkJbGlzdC5hZGQoImZvdXIiKTsKLQkJbGlzdC5hZGQoImZpdmUiKTsKLQkJbGlzdC5hZGQoInNpeCIpOwotCQlsaXN0LmFkZCgic2V2ZW4iKTsKLQkJbGlzdC5hZGQoImVpZ2h0Iik7Ci0JCWxpc3QuYWRkKCJuaW5lIik7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3Q8U3RyaW5nPiBidWlsZEVtcHR5TGlzdCgpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCX0KLQotCS8qKgotCSAqIFRlc3QgY29uY3VycmVudCBhY2Nlc3M6IEZpcnN0IGJ1aWxkIGEgY2xvbmUgaXRlcmF0b3IgaW4gYSBzZXBhcmF0ZSB0aHJlYWQKLQkgKiB0aGF0IGhhbmdzIG1vbWVudGFyaWx5IGR1cmluZyBpdHMgY29uc3RydWN0aW9uOyB0aGVuIG1vZGlmeSB0aGUgc2hhcmVkCi0JICogY29sbGVjdGlvbiBpbiB0aGlzIHRocmVhZC4gVGhpcyB3b3VsZCBjYXVzZSBhCi0JICogQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbiBpbiB0aGUgb3RoZXIgdGhyZWFkIGlmIHRoZSBjbG9uZSBpdGVyYXRvcgotCSAqIHdlcmUgbm90IHN5bmNocm9uaXplZCBvbiB0aGUgb3JpZ2luYWwgY29sbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0Q29uY3VycmVudEFjY2VzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlDbG9uZUl0ZXJhdG9yVGVzdHMuU2xvd0NvbGxlY3Rpb248U3RyaW5nPiBzbG93ID0gbmV3IENsb25lSXRlcmF0b3JUZXN0cy5TbG93Q29sbGVjdGlvbjxTdHJpbmc+KCk7Ci0JCXRoaXMucG9wdWxhdGVMaXN0KHNsb3cpOwotCQkvLyB1c2luZyB0aGUgdW5zeW5jaHJvbml6ZWQgbGlzdCB3aWxsIGNhdXNlIHRoZSB0ZXN0IHRvIGZhaWwKLQkJLy8gdGhpcy5vcmlnaW5hbExpc3QgPSBzbG93OwotCQl0aGlzLm9yaWdpbmFsTGlzdCA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZExpc3Qoc2xvdyk7Ci0KLQkJdGhpcy5jb25jdXJyZW50UHJvYmxlbSA9IGZhbHNlOwotCQl0aGlzLmNvbmN1cnJlbnRMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCVRocmVhZCB0aHJlYWQgPSBuZXcgVGhyZWFkKHRoaXMuYnVpbGRSdW5uYWJsZSgpKTsKLQkJdGhyZWFkLnN0YXJ0KCk7Ci0JCXdoaWxlICghc2xvdy5oYXNTdGFydGVkQ2xvbmUoKSkgewotCQkJLy8gd2FpdCBmb3IgdGhlIG90aGVyIHRocmVhZCB0byBzdGFydCB0aGUgY2xvbmUuLi4KLQkJCVRocmVhZC55aWVsZCgpOwotCQl9Ci0JCS8vIC4uLnRoZW4gc25lYWsgaW4gYW4gZXh0cmEgZWxlbWVudAotCQl0aGlzLm9yaWdpbmFsTGlzdC5hZGQoInNldmVudGVlbiIpOwotCQl3aGlsZSAodGhyZWFkLmlzQWxpdmUoKSkgewotCQkJLy8gd2FpdCBmb3IgdGhlIG90aGVyIHRocmVhZCB0byBmaW5pc2gKLQkJCVRocmVhZC55aWVsZCgpOwotCQl9Ci0JCWFzc2VydEZhbHNlKHRoaXMuY29uY3VycmVudFByb2JsZW0pOwotCQlMaXN0PFN0cmluZz4gZXhwZWN0ZWQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJdGhpcy5wb3B1bGF0ZUxpc3QoZXhwZWN0ZWQpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29uY3VycmVudExpc3QpOwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRSdW5uYWJsZSgpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlDbG9uZUxpc3RJdGVyYXRvclRlc3RzLnRoaXMubG9vcFdpdGhDbG9uZUxpc3RJdGVyYXRvcigpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIHVzZSBhIGNsb25lIGl0ZXJhdG9yIHRvIGxvb3Agb3ZlciB0aGUgInNsb3ciIGNvbGxlY3Rpb24gYW5kIGNvcHkgaXRzCi0JICogY29udGVudHMgdG8gdGhlIGNvbmN1cnJlbnQgY29sbGVjdGlvbgotCSAqLwotCXZvaWQgbG9vcFdpdGhDbG9uZUxpc3RJdGVyYXRvcigpIHsKLQkJdHJ5IHsKLQkJCWZvciAoTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZENsb25lTGlzdEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQkJdGhpcy5jb25jdXJyZW50TGlzdC5hZGQoc3RyZWFtLm5leHQoKSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQl0aGlzLmNvbmN1cnJlbnRQcm9ibGVtID0gdHJ1ZTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvQ29tcG9zaXRlSXRlcmF0b3JUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvQ29tcG9zaXRlSXRlcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzE3M2NlLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0NvbXBvc2l0ZUl0ZXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ29tcG9zaXRlSXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBDb21wb3NpdGVJdGVyYXRvclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIENvbXBvc2l0ZUl0ZXJhdG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0Fub3RoZXIoKSB7Ci0JCXRoaXMudmVyaWZ5SGFzQW5vdGhlcih0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0Fub3RoZXIyKCkgewotCQl0aGlzLnZlcmlmeUhhc0Fub3RoZXIodGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yMigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzQW5vdGhlcjMoKSB7Ci0JCXRoaXMudmVyaWZ5SGFzQW5vdGhlcih0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IzKCkpOwotCX0KLQotCXZvaWQgdmVyaWZ5SGFzQW5vdGhlcihJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSkgewotCQl0aGlzLnZlcmlmeUhhc0Fub3RoZXIoOCwgc3RyZWFtKTsKLQl9Ci0KLQl2b2lkIHZlcmlmeUhhc0Fub3RoZXIoaW50IGV4cGVjdGVkLCBJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSkgewotCQlpbnQgaSA9IDA7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFub3RoZXIoKSB7Ci0JCXRoaXMudmVyaWZ5QW5vdGhlcih0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFub3RoZXIyKCkgewotCQl0aGlzLnZlcmlmeUFub3RoZXIodGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yMigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QW5vdGhlcjMoKSB7Ci0JCXRoaXMudmVyaWZ5QW5vdGhlcih0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IzKCkpOwotCX0KLQotCXZvaWQgdmVyaWZ5QW5vdGhlcihJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSkgewotCQl0aGlzLnZlcmlmeUFub3RoZXIoMSwgc3RyZWFtKTsKLQl9Ci0KLQl2b2lkIHZlcmlmeUFub3RoZXIoaW50IHN0YXJ0LCBJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSkgewotCQlpbnQgaW5kZXggPSBzdGFydDsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgZWxlbWVudCIsIFN0cmluZy52YWx1ZU9mKGluZGV4KyspLCBzdHJlYW0ubmV4dCgpLnN1YnN0cmluZygwLCAxKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdDEgPSB0aGlzLmJ1aWxkTGlzdDEoKTsKLQkJT2JqZWN0IGxhc3RFbGVtZW50MSA9IGxpc3QxLmdldChsaXN0MS5zaXplKCkgLSAxKTsKLQkJTGlzdDxTdHJpbmc+IGxpc3QyID0gdGhpcy5idWlsZExpc3QyKCk7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MyA9IHRoaXMuYnVpbGRMaXN0MygpOwotCi0JCUxpc3Q8SXRlcmF0b3I8U3RyaW5nPj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SXRlcmF0b3I8U3RyaW5nPj4oKTsKLQkJbGlzdC5hZGQobGlzdDEubGlzdEl0ZXJhdG9yKCkpOwotCQlsaXN0LmFkZChsaXN0Mi5saXN0SXRlcmF0b3IoKSk7Ci0JCWxpc3QuYWRkKGxpc3QzLmxpc3RJdGVyYXRvcigpKTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcihsaXN0Lmxpc3RJdGVyYXRvcigpKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBuZXh0ID0gc3RyZWFtLm5leHQoKTsKLQkJCWlmIChuZXh0LmVxdWFscygiMzMzIikpIHsKLQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQl9Ci0JCQkvLyB0ZXN0IHNwZWNpYWwgY2FzZSAtIHdoZXJlIHdlIGFyZSBiZXR3ZWVuIGl0ZXJhdG9ycwotCQkJaWYgKG5leHQuZXF1YWxzKGxhc3RFbGVtZW50MSkpIHsKLQkJCQkvLyB0aGlzIHdpbGwgdHJpZ2dlciB0aGUgbmV4dCBpdGVyYXRvciB0byBiZSBsb2FkZWQKLQkJCQlzdHJlYW0uaGFzTmV4dCgpOwotCQkJCS8vIG5vdyB0cnkgdG8gcmVtb3ZlIGZyb20gdGhlIHByZXZpb3VzIGl0ZXJhdG9yCi0JCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JCXN0cmVhbS5yZW1vdmUoKTsKLQotCQlhc3NlcnRFcXVhbHMoIm5vdGhpbmcgcmVtb3ZlZCBmcm9tIGNvbGxlY3Rpb24gMSIsIHRoaXMuYnVpbGRMaXN0MSgpLnNpemUoKSAtIDIsIGxpc3QxLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKCJlbGVtZW50IHN0aWxsIGluIGNvbGxlY3Rpb24gMSIsIGxpc3QxLmNvbnRhaW5zKCIzMzMiKSk7Ci0JCWFzc2VydEZhbHNlKCJsYXN0IGVsZW1lbnQgc3RpbGwgaW4gY29sbGVjdGlvbiAxIiwgbGlzdDEuY29udGFpbnMobGFzdEVsZW1lbnQxKSk7Ci0JCWFzc2VydFRydWUoIndyb25nIGVsZW1lbnQgcmVtb3ZlZCBmcm9tIGNvbGxlY3Rpb24gMSIsIGxpc3QxLmNvbnRhaW5zKCIyMiIpKTsKLQotCQlhc3NlcnRFcXVhbHMoIm5vdGhpbmcgcmVtb3ZlZCBmcm9tIGNvbGxlY3Rpb24gMyIsIHRoaXMuYnVpbGRMaXN0MygpLnNpemUoKSAtIDEsIGxpc3QzLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKCJlbGVtZW50IHN0aWxsIGluIGNvbGxlY3Rpb24gMyIsIGxpc3QzLmNvbnRhaW5zKCI4ODg4ODg4OCIpKTsKLQkJYXNzZXJ0VHJ1ZSgid3JvbmcgZWxlbWVudCByZW1vdmVkIGZyb20gY29sbGVjdGlvbiAzIiwgbGlzdDMuY29udGFpbnMoIjY2NjY2NiIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlRWxlbWVudCgpIHsKLQkJU3RyaW5nIGl0ZW0gPSAiMCI7Ci0JCXRoaXMudmVyaWZ5SGFzQW5vdGhlcig5LCB0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IoaXRlbSwgdGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKCkpKTsKLQkJdGhpcy52ZXJpZnlBbm90aGVyKDAsIHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcihpdGVtLCB0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCkgewotCQl0aGlzLnZlcmlmeU5vU3VjaEVsZW1lbnRFeGNlcHRpb24odGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKCkpOwotCX0KLQotCXZvaWQgdmVyaWZ5Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbihJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCVN0cmluZyBzdHJpbmcgPSBudWxsOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJfQotCQl0cnkgewotCQkJc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93bjogIiArIHN0cmluZywgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpIHsKLQkJdGhpcy52ZXJpZnlVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbih0aGlzLmJ1aWxkVW5tb2RpZmlhYmxlQ29tcG9zaXRlSXRlcmF0b3IoKSk7Ci0JfQotCi0Jdm9pZCB2ZXJpZnlVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3Qgc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJCWlmIChzdHJpbmcuZXF1YWxzKCIzMzMiKSkgewotCQkJCXRyeSB7Ci0JCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpIHsKLQkJdGhpcy52ZXJpZnlJbGxlZ2FsU3RhdGVFeGNlcHRpb24odGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKCkpOwotCX0KLQotCXZvaWQgdmVyaWZ5SWxsZWdhbFN0YXRlRXhjZXB0aW9uKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVtcHR5SGFzQW5vdGhlcjEoKSB7Ci0JCXRoaXMudmVyaWZ5RW1wdHlIYXNBbm90aGVyKHRoaXMuYnVpbGRFbXB0eUNvbXBvc2l0ZUl0ZXJhdG9yMSgpKTsKLQl9Ci0KLQl2b2lkIHZlcmlmeUVtcHR5SGFzQW5vdGhlcihJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSkgewotCQlpbnQgaSA9IDA7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscygwLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW1wdHlOb1N1Y2hFbGVtZW50RXhjZXB0aW9uMSgpIHsKLQkJdGhpcy52ZXJpZnlOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKHRoaXMuYnVpbGRFbXB0eUNvbXBvc2l0ZUl0ZXJhdG9yMSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW1wdHlJbGxlZ2FsU3RhdGVFeGNlcHRpb24xKCkgewotCQl0aGlzLnZlcmlmeUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbih0aGlzLmJ1aWxkRW1wdHlDb21wb3NpdGVJdGVyYXRvcjEoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVtcHR5SGFzQW5vdGhlcjIoKSB7Ci0JCXRoaXMudmVyaWZ5RW1wdHlIYXNBbm90aGVyKHRoaXMuYnVpbGRFbXB0eUNvbXBvc2l0ZUl0ZXJhdG9yMigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW1wdHlOb1N1Y2hFbGVtZW50RXhjZXB0aW9uMigpIHsKLQkJdGhpcy52ZXJpZnlOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKHRoaXMuYnVpbGRFbXB0eUNvbXBvc2l0ZUl0ZXJhdG9yMigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW1wdHlJbGxlZ2FsU3RhdGVFeGNlcHRpb24yKCkgewotCQl0aGlzLnZlcmlmeUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbih0aGlzLmJ1aWxkRW1wdHlDb21wb3NpdGVJdGVyYXRvcjIoKSk7Ci0JfQotCi0JSXRlcmF0b3I8U3RyaW5nPiBidWlsZENvbXBvc2l0ZUl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKHRoaXMuYnVpbGRJdGVyYXRvcnMoKSk7Ci0JfQotCi0JSXRlcmF0b3I8U3RyaW5nPiBidWlsZEVtcHR5Q29tcG9zaXRlSXRlcmF0b3IxKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKHRoaXMuYnVpbGRFbXB0eUl0ZXJhdG9yczEoKSk7Ci0JfQotCi0JSXRlcmF0b3I8U3RyaW5nPiBidWlsZEVtcHR5Q29tcG9zaXRlSXRlcmF0b3IyKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKHRoaXMuYnVpbGRFbXB0eUl0ZXJhdG9yczIoKSk7Ci0JfQotCi0JSXRlcmF0b3I8U3RyaW5nPiBidWlsZFVubW9kaWZpYWJsZUNvbXBvc2l0ZUl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKHRoaXMuYnVpbGRVbm1vZGlmaWFibGVJdGVyYXRvcnMoKSk7Ci0JfQotCi0JLy8gbGVhdmUgdW5jaGVja2VkIHNvIHdlIGNhbiBvdmVycmlkZSBpbiBzdWJjbGFzcwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUl0ZXJhdG9yPFN0cmluZz4gYnVpbGRDb21wb3NpdGVJdGVyYXRvcihJdGVyYXRvciBpdGVyYXRvcnMpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYXRvcjxTdHJpbmc+KGl0ZXJhdG9ycyk7Ci0JfQotCi0JLy8gdXNlIHZhcmFyZyBjb25zdHJ1Y3RvcgotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUl0ZXJhdG9yPFN0cmluZz4gYnVpbGRDb21wb3NpdGVJdGVyYXRvcjIoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmF0b3I8U3RyaW5nPih0aGlzLmJ1aWxkSXRlcmF0b3IxKCksIHRoaXMuYnVpbGRJdGVyYXRvcjIoKSwgdGhpcy5idWlsZEl0ZXJhdG9yMygpKTsKLQl9Ci0KLQkvLyB1c2UgdmFyYXJnIGNvbnN0cnVjdG9yCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JSXRlcmF0b3I8U3RyaW5nPiBidWlsZENvbXBvc2l0ZUl0ZXJhdG9yMygpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYXRvcjxTdHJpbmc+KG5ldyBJdGVyYXRvcltdIHsgdGhpcy5idWlsZEl0ZXJhdG9yMSgpLCB0aGlzLmJ1aWxkSXRlcmF0b3IyKCksIHRoaXMuYnVpbGRJdGVyYXRvcjMoKSB9KTsKLQl9Ci0KLQlJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IoU3RyaW5nIHN0cmluZywgSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvcikgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhdG9yPFN0cmluZz4oc3RyaW5nLCBpdGVyYXRvcik7Ci0JfQotCi0JTGlzdEl0ZXJhdG9yPEl0ZXJhdG9yPFN0cmluZz4+IGJ1aWxkSXRlcmF0b3JzKCkgewotCQlMaXN0PEl0ZXJhdG9yPFN0cmluZz4+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEl0ZXJhdG9yPFN0cmluZz4+KCk7Ci0JCWxpc3QuYWRkKHRoaXMuYnVpbGRJdGVyYXRvcjEoKSk7Ci0JCWxpc3QuYWRkKHRoaXMuYnVpbGRJdGVyYXRvcjIoKSk7Ci0JCWxpc3QuYWRkKHRoaXMuYnVpbGRJdGVyYXRvcjMoKSk7Ci0JCXJldHVybiBsaXN0Lmxpc3RJdGVyYXRvcigpOwotCX0KLQotCUxpc3RJdGVyYXRvcjxJdGVyYXRvcjxTdHJpbmc+PiBidWlsZEVtcHR5SXRlcmF0b3JzMSgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRFbXB0eUl0ZXJhdG9ySXRlcmF0b3IoKTsKLQl9Ci0KLQlMaXN0SXRlcmF0b3I8SXRlcmF0b3I8U3RyaW5nPj4gYnVpbGRFbXB0eUl0ZXJhdG9yczIoKSB7Ci0JCUxpc3Q8SXRlcmF0b3I8U3RyaW5nPj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SXRlcmF0b3I8U3RyaW5nPj4oKTsKLQkJbGlzdC5hZGQodGhpcy5idWlsZEVtcHR5U3RyaW5nSXRlcmF0b3IoKSk7Ci0JCWxpc3QuYWRkKHRoaXMuYnVpbGRFbXB0eVN0cmluZ0l0ZXJhdG9yKCkpOwotCQlsaXN0LmFkZCh0aGlzLmJ1aWxkRW1wdHlTdHJpbmdJdGVyYXRvcigpKTsKLQkJcmV0dXJuIGxpc3QubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JTGlzdEl0ZXJhdG9yPEl0ZXJhdG9yPFN0cmluZz4+IGJ1aWxkVW5tb2RpZmlhYmxlSXRlcmF0b3JzKCkgewotCQlMaXN0PEl0ZXJhdG9yPFN0cmluZz4+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEl0ZXJhdG9yPFN0cmluZz4+KCk7Ci0JCWxpc3QuYWRkKHRoaXMuYnVpbGRVbm1vZGlmaWFibGVJdGVyYXRvcjEoKSk7Ci0JCWxpc3QuYWRkKHRoaXMuYnVpbGRVbm1vZGlmaWFibGVJdGVyYXRvcjIoKSk7Ci0JCWxpc3QuYWRkKHRoaXMuYnVpbGRVbm1vZGlmaWFibGVJdGVyYXRvcjMoKSk7Ci0JCXJldHVybiBsaXN0Lmxpc3RJdGVyYXRvcigpOwotCX0KLQotCUxpc3RJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkSXRlcmF0b3IxKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZExpc3QxKCkubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JTGlzdEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRJdGVyYXRvcjIoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkTGlzdDIoKS5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBidWlsZEl0ZXJhdG9yMygpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRMaXN0MygpLmxpc3RJdGVyYXRvcigpOwotCX0KLQotCUxpc3RJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkVW5tb2RpZmlhYmxlSXRlcmF0b3IxKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFVubW9kaWZpYWJsZUxpc3QxKCkubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JTGlzdEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRVbm1vZGlmaWFibGVJdGVyYXRvcjIoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVW5tb2RpZmlhYmxlTGlzdDIoKS5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBidWlsZFVubW9kaWZpYWJsZUl0ZXJhdG9yMygpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRVbm1vZGlmaWFibGVMaXN0MygpLmxpc3RJdGVyYXRvcigpOwotCX0KLQotCUxpc3RJdGVyYXRvcjxJdGVyYXRvcjxTdHJpbmc+PiBidWlsZEVtcHR5SXRlcmF0b3JJdGVyYXRvcigpIHsKLQkJcmV0dXJuIChuZXcgQXJyYXlMaXN0PEl0ZXJhdG9yPFN0cmluZz4+KCkpLmxpc3RJdGVyYXRvcigpOwotCX0KLQotCUxpc3RJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkRW1wdHlTdHJpbmdJdGVyYXRvcigpIHsKLQkJcmV0dXJuIChuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSkubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JTGlzdDxTdHJpbmc+IGJ1aWxkTGlzdDEoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QuYWRkKCIxIik7Ci0JCWxpc3QuYWRkKCIyMiIpOwotCQlsaXN0LmFkZCgiMzMzIik7Ci0JCWxpc3QuYWRkKCI0NDQ0Iik7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCUxpc3Q8U3RyaW5nPiBidWlsZExpc3QyKCkgewotCQlyZXR1cm4gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JfQotCi0JTGlzdDxTdHJpbmc+IGJ1aWxkTGlzdDMoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QuYWRkKCI1NTU1NSIpOwotCQlsaXN0LmFkZCgiNjY2NjY2Iik7Ci0JCWxpc3QuYWRkKCI3Nzc3Nzc3Iik7Ci0JCWxpc3QuYWRkKCI4ODg4ODg4OCIpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlMaXN0PFN0cmluZz4gYnVpbGRVbm1vZGlmaWFibGVMaXN0MSgpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QodGhpcy5idWlsZExpc3QxKCkpOwotCX0KLQotCUxpc3Q8U3RyaW5nPiBidWlsZFVubW9kaWZpYWJsZUxpc3QyKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCh0aGlzLmJ1aWxkTGlzdDIoKSk7Ci0JfQotCi0JTGlzdDxTdHJpbmc+IGJ1aWxkVW5tb2RpZmlhYmxlTGlzdDMoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KHRoaXMuYnVpbGRMaXN0MygpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0NvbXBvc2l0ZUxpc3RJdGVyYXRvclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9Db21wb3NpdGVMaXN0SXRlcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmRlMWQxLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0NvbXBvc2l0ZUxpc3RJdGVyYXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5Db21wb3NpdGVMaXN0SXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBDb21wb3NpdGVMaXN0SXRlcmF0b3JUZXN0cyBleHRlbmRzIENvbXBvc2l0ZUl0ZXJhdG9yVGVzdHMgewotCi0JcHVibGljIENvbXBvc2l0ZUxpc3RJdGVyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXZvaWQgdmVyaWZ5SGFzQW5vdGhlcihJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSkgewotCQlzdXBlci52ZXJpZnlIYXNBbm90aGVyKHN0cmVhbSk7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbTIgPSAoTGlzdEl0ZXJhdG9yPFN0cmluZz4pIHN0cmVhbTsKLQkJaW50IGkgPSAwOwotCQl3aGlsZSAoc3RyZWFtMi5oYXNQcmV2aW91cygpKSB7Ci0JCQlzdHJlYW0yLnByZXZpb3VzKCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDgsIGkpOwotCX0KLQotCUBPdmVycmlkZQotCXZvaWQgdmVyaWZ5QW5vdGhlcihJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSkgewotCQlzdXBlci52ZXJpZnlBbm90aGVyKHN0cmVhbSk7Ci0JCWludCBpID0gODsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtMiA9IChMaXN0SXRlcmF0b3I8U3RyaW5nPikgc3RyZWFtOwotCQl3aGlsZSAoc3RyZWFtMi5oYXNQcmV2aW91cygpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGVsZW1lbnQiLCBTdHJpbmcudmFsdWVPZihpLS0pLCBzdHJlYW0yLnByZXZpb3VzKCkuc3Vic3RyaW5nKDAsIDEpKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0JCXN1cGVyLnRlc3RSZW1vdmUoKTsKLQkJTGlzdDxTdHJpbmc+IGxpc3QxID0gdGhpcy5idWlsZExpc3QxKCk7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MiA9IHRoaXMuYnVpbGRMaXN0MigpOwotCQlMaXN0PFN0cmluZz4gbGlzdDMgPSB0aGlzLmJ1aWxkTGlzdDMoKTsKLQkJT2JqZWN0IGZpcnN0RWxlbWVudDMgPSBsaXN0My5nZXQoMCk7Ci0KLQkJTGlzdDxJdGVyYXRvcjxTdHJpbmc+PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJdGVyYXRvcjxTdHJpbmc+PigpOwotCQlsaXN0LmFkZChsaXN0MS5saXN0SXRlcmF0b3IoKSk7Ci0JCWxpc3QuYWRkKGxpc3QyLmxpc3RJdGVyYXRvcigpKTsKLQkJbGlzdC5hZGQobGlzdDMubGlzdEl0ZXJhdG9yKCkpOwotCi0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IChMaXN0SXRlcmF0b3I8U3RyaW5nPikgdGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKGxpc3QubGlzdEl0ZXJhdG9yKCkpOwotCQkvLyBwb3NpdGlvbiB0byBlbmQgb2Ygc3RyZWFtCi0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJT2JqZWN0IHByZXZpb3VzID0gc3RyZWFtLnByZXZpb3VzKCk7Ci0JCQlpZiAocHJldmlvdXMuZXF1YWxzKCIzMzMiKSkgewotCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCX0KLQkJCS8vIHRlc3Qgc3BlY2lhbCBjYXNlIC0gd2hlcmUgd2UgYXJlIGJldHdlZW4gaXRlcmF0b3JzCi0JCQlpZiAocHJldmlvdXMuZXF1YWxzKGZpcnN0RWxlbWVudDMpKSB7Ci0JCQkJLy8gdGhpcyB3aWxsIHRyaWdnZXIgdGhlIG5leHQgaXRlcmF0b3IgdG8gYmUgbG9hZGVkCi0JCQkJc3RyZWFtLmhhc1ByZXZpb3VzKCk7Ci0JCQkJLy8gbm93IHRyeSB0byByZW1vdmUgZnJvbSB0aGUgcHJldmlvdXMgaXRlcmF0b3IKLQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQkJc3RyZWFtLnJlbW92ZSgpOwotCi0JCWFzc2VydEVxdWFscygibm90aGluZyByZW1vdmVkIGZyb20gY29sbGVjdGlvbiAxIiwgdGhpcy5idWlsZExpc3QxKCkuc2l6ZSgpIC0gMiwgbGlzdDEuc2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoImVsZW1lbnQgc3RpbGwgaW4gY29sbGVjdGlvbiAxIiwgbGlzdDEuY29udGFpbnMoIjEiKSk7Ci0JCWFzc2VydEZhbHNlKCJlbGVtZW50IHN0aWxsIGluIGNvbGxlY3Rpb24gMSIsIGxpc3QxLmNvbnRhaW5zKCIzMzMiKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJub3RoaW5nIHJlbW92ZWQgZnJvbSBjb2xsZWN0aW9uIDMiLCB0aGlzLmJ1aWxkTGlzdDMoKS5zaXplKCkgLSAxLCBsaXN0My5zaXplKCkpOwotCQlhc3NlcnRGYWxzZSgiZmlyc3QgZWxlbWVudCBzdGlsbCBpbiBjb2xsZWN0aW9uIDMiLCBsaXN0My5jb250YWlucyhmaXJzdEVsZW1lbnQzKSk7Ci0JCWFzc2VydFRydWUoIndyb25nIGVsZW1lbnQgcmVtb3ZlZCBmcm9tIGNvbGxlY3Rpb24gMyIsIGxpc3QzLmNvbnRhaW5zKCI2NjY2NjYiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZCgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QxID0gdGhpcy5idWlsZExpc3QxKCk7Ci0JCU9iamVjdCBsYXN0RWxlbWVudDEgPSBsaXN0MS5nZXQobGlzdDEuc2l6ZSgpIC0gMSk7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MiA9IHRoaXMuYnVpbGRMaXN0MigpOwotCQlMaXN0PFN0cmluZz4gbGlzdDMgPSB0aGlzLmJ1aWxkTGlzdDMoKTsKLQkJT2JqZWN0IGZpcnN0RWxlbWVudDMgPSBsaXN0My5nZXQoMCk7Ci0KLQkJTGlzdDxJdGVyYXRvcjxTdHJpbmc+PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJdGVyYXRvcjxTdHJpbmc+PigpOwotCQlsaXN0LmFkZChsaXN0MS5saXN0SXRlcmF0b3IoKSk7Ci0JCWxpc3QuYWRkKGxpc3QyLmxpc3RJdGVyYXRvcigpKTsKLQkJbGlzdC5hZGQobGlzdDMubGlzdEl0ZXJhdG9yKCkpOwotCi0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IChMaXN0SXRlcmF0b3I8U3RyaW5nPikgdGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKGxpc3QubGlzdEl0ZXJhdG9yKCkpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJT2JqZWN0IG5leHQgPSBzdHJlYW0ubmV4dCgpOwotCQkJaWYgKG5leHQuZXF1YWxzKCIzMzMiKSkgewotCQkJCXN0cmVhbS5hZGQoIjMuNSIpOwotCQkJfQotCQkJLy8gdGVzdCBzcGVjaWFsIGNhc2UgLSB3aGVyZSB3ZSBhcmUgYmV0d2VlbiBpdGVyYXRvcnMKLQkJCWlmIChuZXh0LmVxdWFscyhsYXN0RWxlbWVudDEpKSB7Ci0JCQkJLy8gdGhpcyB3aWxsIHRyaWdnZXIgdGhlIG5leHQgaXRlcmF0b3IgdG8gYmUgbG9hZGVkCi0JCQkJc3RyZWFtLmhhc05leHQoKTsKLQkJCQkvLyBub3cgdHJ5IHRvIGFkZCB0byB0aGUgaXRlcmF0b3IKLQkJCQlzdHJlYW0uYWRkKCJzb21ldGhpbmcgaW4gMyIpOwotCQkJfQotCQl9Ci0JCXN0cmVhbS5hZGQoImZpbmFsZSIpOwotCQlib29sZWFuIGNoZWNrRm9yRmluYWxlID0gdHJ1ZTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlPYmplY3QgcHJldmlvdXMgPSBzdHJlYW0ucHJldmlvdXMoKTsKLQkJCWlmIChjaGVja0ZvckZpbmFsZSkgewotCQkJCWNoZWNrRm9yRmluYWxlID0gZmFsc2U7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJhZGRlZCBlbGVtZW50IGRyb3BwZWQiLCAiZmluYWxlIiwgcHJldmlvdXMpOwotCQkJfQotCQkJaWYgKHByZXZpb3VzLmVxdWFscygiMzMzIikpIHsKLQkJCQlzdHJlYW0uYWRkKCIyLjUiKTsKLQkJCX0KLQkJCS8vIHRlc3Qgc3BlY2lhbCBjYXNlIC0gd2hlcmUgd2UgYXJlIGJldHdlZW4gaXRlcmF0b3JzCi0JCQlpZiAocHJldmlvdXMuZXF1YWxzKGZpcnN0RWxlbWVudDMpKSB7Ci0JCQkJLy8gdGhpcyB3aWxsIHRyaWdnZXIgdGhlIG5leHQgaXRlcmF0b3IgdG8gYmUgbG9hZGVkCi0JCQkJc3RyZWFtLmhhc1ByZXZpb3VzKCk7Ci0JCQkJLy8gbm93IHRyeSB0byByZW1vdmUgZnJvbSB0aGUgcHJldmlvdXMgaXRlcmF0b3IKLQkJCQlzdHJlYW0uYWRkKCJvbGQgc3RhcnQgb2YgMyIpOwotCQkJfQotCQl9Ci0JCXN0cmVhbS5hZGQoInByZWx1ZGUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRlZCBlbGVtZW50IGRyb3BwZWQiLCAicHJlbHVkZSIsIHN0cmVhbS5wcmV2aW91cygpKTsKLQotCQlhc3NlcnRFcXVhbHMoImVsZW1lbnRzIG5vdCBhZGRlZCB0byBjb2xsZWN0aW9uIDEiLCB0aGlzLmJ1aWxkTGlzdDEoKS5zaXplKCkgKyAzLCBsaXN0MS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImVsZW1lbnQgbm90IGFkZGVkIHRvIGNvbGxlY3Rpb24gMSIsICJwcmVsdWRlIiwgbGlzdDEuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbGVtZW50IG5vdCBhZGRlZCB0byBjb2xsZWN0aW9uIDEiLCAiMi41IiwgbGlzdDEuZ2V0KDMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbGVtZW50IG5vdCBhZGRlZCB0byBjb2xsZWN0aW9uIDEiLCAiMy41IiwgbGlzdDEuZ2V0KDUpKTsKLQotCQlhc3NlcnRFcXVhbHMoImVsZW1lbnRzIG5vdCBhZGRlZCB0byBjb2xsZWN0aW9uIDMiLCB0aGlzLmJ1aWxkTGlzdDMoKS5zaXplKCkgKyAzLCBsaXN0My5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImVsZW1lbnQgbm90IGFkZGVkIHRvIGNvbGxlY3Rpb24gMyIsICJzb21ldGhpbmcgaW4gMyIsIGxpc3QzLmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscygiZWxlbWVudCBub3QgYWRkZWQgdG8gY29sbGVjdGlvbiAzIiwgIm9sZCBzdGFydCBvZiAzIiwgbGlzdDMuZ2V0KDEpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbGVtZW50IG5vdCBhZGRlZCB0byBjb2xsZWN0aW9uIDMiLCAiZmluYWxlIiwgbGlzdDMuZ2V0KGxpc3QzLnNpemUoKSAtIDEpKTsKLQotCQkvLyBhZGQgdG8gdGhlIGZyb250Ci0JCXN0cmVhbSA9IChMaXN0SXRlcmF0b3I8U3RyaW5nPikgdGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKCk7Ci0JCXN0cmVhbS5hZGQoImJsYWgiKTsKLQkJYXNzZXJ0RmFsc2UoImFkZGVkIGVsZW1lbnQgc2hvdWxkIGJlIHBsYWNlZCBCRUZPUkUgdGhlIFwiY3Vyc29yXCIiLCBzdHJlYW0ubmV4dCgpLmVxdWFscygiYmxhaCIpKTsKLQotCQlzdHJlYW0gPSAoTGlzdEl0ZXJhdG9yPFN0cmluZz4pIHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcigpOwotCQlzdHJlYW0uYWRkKCJibGFoIik7Ci0JCWFzc2VydFRydWUoImFkZGVkIGVsZW1lbnQgc2hvdWxkIGJlIHBsYWNlZCBCRUZPUkUgdGhlIFwiY3Vyc29yXCIiLCBzdHJlYW0ucHJldmlvdXMoKS5lcXVhbHMoImJsYWgiKSk7Ci0KLQkJc3RyZWFtID0gKExpc3RJdGVyYXRvcjxTdHJpbmc+KSB0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IoKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlzdHJlYW0ucHJldmlvdXMoKTsKLQkJfQotCQlzdHJlYW0uYWRkKCJibGFoIik7Ci0JCWFzc2VydEZhbHNlKCJhZGRlZCBlbGVtZW50IHNob3VsZCBiZSBwbGFjZWQgQkVGT1JFIHRoZSBcImN1cnNvclwiIiwgc3RyZWFtLm5leHQoKS5lcXVhbHMoImJsYWgiKSk7Ci0KLQkJc3RyZWFtID0gKExpc3RJdGVyYXRvcjxTdHJpbmc+KSB0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IoKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlzdHJlYW0ucHJldmlvdXMoKTsKLQkJfQotCQlzdHJlYW0uYWRkKCJibGFoIik7Ci0JCWFzc2VydFRydWUoImFkZGVkIGVsZW1lbnQgc2hvdWxkIGJlIHBsYWNlZCBCRUZPUkUgdGhlIFwiY3Vyc29yXCIiLCBzdHJlYW0ucHJldmlvdXMoKS5lcXVhbHMoImJsYWgiKSk7Ci0KLQkJLy8gYWRkIHRvIHRoZSBtaWRkbGUKLQkJc3RyZWFtID0gKExpc3RJdGVyYXRvcjxTdHJpbmc+KSB0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IoKTsKLQkJc3RyZWFtLm5leHQoKTsKLQkJc3RyZWFtLmFkZCgiYmxhaCIpOwotCQlhc3NlcnRGYWxzZSgiYWRkZWQgZWxlbWVudCBzaG91bGQgYmUgcGxhY2VkIEJFRk9SRSB0aGUgXCJjdXJzb3JcIiIsIHN0cmVhbS5uZXh0KCkuZXF1YWxzKCJibGFoIikpOwotCi0JCXN0cmVhbSA9IChMaXN0SXRlcmF0b3I8U3RyaW5nPikgdGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKCk7Ci0JCXN0cmVhbS5uZXh0KCk7Ci0JCXN0cmVhbS5hZGQoImJsYWgiKTsKLQkJYXNzZXJ0VHJ1ZSgiYWRkZWQgZWxlbWVudCBzaG91bGQgYmUgcGxhY2VkIEJFRk9SRSB0aGUgXCJjdXJzb3JcIiIsIHN0cmVhbS5wcmV2aW91cygpLmVxdWFscygiYmxhaCIpKTsKLQotCQlzdHJlYW0gPSAoTGlzdEl0ZXJhdG9yPFN0cmluZz4pIHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcigpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJfQotCQlzdHJlYW0ucHJldmlvdXMoKTsKLQkJc3RyZWFtLmFkZCgiYmxhaCIpOwotCQlhc3NlcnRGYWxzZSgiYWRkZWQgZWxlbWVudCBzaG91bGQgYmUgcGxhY2VkIEJFRk9SRSB0aGUgXCJjdXJzb3JcIiIsIHN0cmVhbS5uZXh0KCkuZXF1YWxzKCJibGFoIikpOwotCi0JCXN0cmVhbSA9IChMaXN0SXRlcmF0b3I8U3RyaW5nPikgdGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCXN0cmVhbS5wcmV2aW91cygpOwotCQlzdHJlYW0uYWRkKCJibGFoIik7Ci0JCWFzc2VydFRydWUoImFkZGVkIGVsZW1lbnQgc2hvdWxkIGJlIHBsYWNlZCBCRUZPUkUgdGhlIFwiY3Vyc29yXCIiLCBzdHJlYW0ucHJldmlvdXMoKS5lcXVhbHMoImJsYWgiKSk7Ci0KLQkJLy8gYWRkIHRvIHRoZSBlbmQKLQkJc3RyZWFtID0gKExpc3RJdGVyYXRvcjxTdHJpbmc+KSB0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IoKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJc3RyZWFtLmFkZCgiYmxhaCIpOwotCQlhc3NlcnRGYWxzZSgiYWRkZWQgZWxlbWVudCBzaG91bGQgYmUgcGxhY2VkIEJFRk9SRSB0aGUgXCJjdXJzb3JcIiIsIHN0cmVhbS5oYXNOZXh0KCkpOwotCi0JCXN0cmVhbSA9IChMaXN0SXRlcmF0b3I8U3RyaW5nPikgdGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCXN0cmVhbS5hZGQoImJsYWgiKTsKLQkJYXNzZXJ0VHJ1ZSgiYWRkZWQgZWxlbWVudCBzaG91bGQgYmUgcGxhY2VkIEJFRk9SRSB0aGUgXCJjdXJzb3JcIiIsIHN0cmVhbS5wcmV2aW91cygpLmVxdWFscygiYmxhaCIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0KCkgewotCQlMaXN0PFN0cmluZz4gbGlzdDEgPSB0aGlzLmJ1aWxkTGlzdDEoKTsKLQkJT2JqZWN0IGxhc3RFbGVtZW50MSA9IGxpc3QxLmdldChsaXN0MS5zaXplKCkgLSAxKTsKLQkJTGlzdDxTdHJpbmc+IGxpc3QyID0gdGhpcy5idWlsZExpc3QyKCk7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MyA9IHRoaXMuYnVpbGRMaXN0MygpOwotCQlPYmplY3QgZmlyc3RFbGVtZW50MyA9IGxpc3QzLmdldCgwKTsKLQotCQlMaXN0PEl0ZXJhdG9yPFN0cmluZz4+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEl0ZXJhdG9yPFN0cmluZz4+KCk7Ci0JCWxpc3QuYWRkKGxpc3QxLmxpc3RJdGVyYXRvcigpKTsKLQkJbGlzdC5hZGQobGlzdDIubGlzdEl0ZXJhdG9yKCkpOwotCQlsaXN0LmFkZChsaXN0My5saXN0SXRlcmF0b3IoKSk7Ci0KLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gKExpc3RJdGVyYXRvcjxTdHJpbmc+KSB0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IobGlzdC5saXN0SXRlcmF0b3IoKSk7Ci0JCS8vIHBvc2l0aW9uIHRvIGVuZCBvZiBzdHJlYW0KLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBuZXh0ID0gc3RyZWFtLm5leHQoKTsKLQkJCWlmIChuZXh0LmVxdWFscygiMzMzIikpIHsKLQkJCQlzdHJlYW0uc2V0KCIzMzNhIik7Ci0JCQl9Ci0JCQkvLyB0ZXN0IHNwZWNpYWwgY2FzZSAtIHdoZXJlIHdlIGFyZSBiZXR3ZWVuIGl0ZXJhdG9ycwotCQkJaWYgKG5leHQuZXF1YWxzKGxhc3RFbGVtZW50MSkpIHsKLQkJCQkvLyB0aGlzIHdpbGwgdHJpZ2dlciB0aGUgbmV4dCBpdGVyYXRvciB0byBiZSBsb2FkZWQKLQkJCQlzdHJlYW0uaGFzTmV4dCgpOwotCQkJCS8vIG5vdyB0cnkgdG8gcmVtb3ZlIGZyb20gdGhlIHByZXZpb3VzIGl0ZXJhdG9yCi0JCQkJc3RyZWFtLnNldCgiZW5kIG9mIDEiKTsKLQkJCX0KLQkJfQotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCU9iamVjdCBwcmV2aW91cyA9IHN0cmVhbS5wcmV2aW91cygpOwotCQkJaWYgKHByZXZpb3VzLmVxdWFscygiMjIiKSkgewotCQkJCXN0cmVhbS5zZXQoIjIyYSIpOwotCQkJfQotCQkJLy8gdGVzdCBzcGVjaWFsIGNhc2UgLSB3aGVyZSB3ZSBhcmUgYmV0d2VlbiBpdGVyYXRvcnMKLQkJCWlmIChwcmV2aW91cy5lcXVhbHMoZmlyc3RFbGVtZW50MykpIHsKLQkJCQkvLyB0aGlzIHdpbGwgdHJpZ2dlciB0aGUgbmV4dCBpdGVyYXRvciB0byBiZSBsb2FkZWQKLQkJCQlzdHJlYW0uaGFzUHJldmlvdXMoKTsKLQkJCQkvLyBub3cgdHJ5IHRvIHJlbW92ZSBmcm9tIHRoZSBwcmV2aW91cyBpdGVyYXRvcgotCQkJCXN0cmVhbS5zZXQoInN0YXJ0IG9mIDMiKTsKLQkJCX0KLQkJfQotCi0JCWFzc2VydEVxdWFscygiZWxlbWVudChzKSBhZGRlZCB0byBjb2xsZWN0aW9uIDEiLCB0aGlzLmJ1aWxkTGlzdDEoKS5zaXplKCksIGxpc3QxLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiZWxlbWVudCBub3Qgc2V0IGluIGNvbGxlY3Rpb24gMSIsICIyMmEiLCBsaXN0MS5nZXQoMSkpOwotCQlhc3NlcnRGYWxzZSgiZWxlbWVudCBub3Qgc2V0IGluIGNvbGxlY3Rpb24gMSIsIGxpc3QxLmNvbnRhaW5zKCIyMiIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbGVtZW50IG5vdCBzZXQgaW4gY29sbGVjdGlvbiAxIiwgIjMzM2EiLCBsaXN0MS5nZXQoMikpOwotCQlhc3NlcnRGYWxzZSgiZWxlbWVudCBub3Qgc2V0IGluIGNvbGxlY3Rpb24gMSIsIGxpc3QxLmNvbnRhaW5zKCIzMzMiKSk7Ci0JCWFzc2VydEVxdWFscygiZWxlbWVudCBub3Qgc2V0IGluIGNvbGxlY3Rpb24gMSIsICJlbmQgb2YgMSIsIGxpc3QxLmdldChsaXN0MS5zaXplKCkgLSAxKSk7Ci0JCWFzc2VydEZhbHNlKCJlbGVtZW50IG5vdCBzZXQgaW4gY29sbGVjdGlvbiAxIiwgbGlzdDEuY29udGFpbnMobGFzdEVsZW1lbnQxKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJlbGVtZW50KHMpIGFkZGVkIHRvIGNvbGxlY3Rpb24gMyIsIHRoaXMuYnVpbGRMaXN0MygpLnNpemUoKSwgbGlzdDMuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbGVtZW50IG5vdCBzZXQgaW4gY29sbGVjdGlvbiAzIiwgInN0YXJ0IG9mIDMiLCBsaXN0My5nZXQoMCkpOwotCQlhc3NlcnRGYWxzZSgiZWxlbWVudCBub3Qgc2V0IGluIGNvbGxlY3Rpb24gMyIsIGxpc3QzLmNvbnRhaW5zKGZpcnN0RWxlbWVudDMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dEluZGV4UHJldmlvdXNJbmRleCgpIHsKLQkJaW50IGkgPSAwOwotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSAoTGlzdEl0ZXJhdG9yPFN0cmluZz4pIHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoaSwgc3RyZWFtLm5leHRJbmRleCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGkgLSAxLCBzdHJlYW0ucHJldmlvdXNJbmRleCgpKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBuZXh0ID0gc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJCWlmIChuZXh0LmVxdWFscygiMzMzIikpIHsKLQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQkJaS0tOwotCQkJfQotCQkJaWYgKG5leHQuZXF1YWxzKCI3Nzc3Nzc3IikpIHsKLQkJCQlzdHJlYW0uYWRkKCI3LjUiKTsKLQkJCQlpKys7Ci0JCQl9Ci0JCQlhc3NlcnRFcXVhbHMoaSwgc3RyZWFtLm5leHRJbmRleCgpKTsKLQkJCWFzc2VydEVxdWFscyhpIC0gMSwgc3RyZWFtLnByZXZpb3VzSW5kZXgoKSk7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKCJpbmRleCBpcyBjb3JydXB0IiwgOCwgaSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKGksIHN0cmVhbS5uZXh0SW5kZXgoKSk7Ci0JCWFzc2VydEVxdWFscyhpIC0gMSwgc3RyZWFtLnByZXZpb3VzSW5kZXgoKSk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJT2JqZWN0IHByZXZpb3VzID0gc3RyZWFtLnByZXZpb3VzKCk7Ci0JCQlpLS07Ci0JCQlpZiAocHJldmlvdXMuZXF1YWxzKCI2NjY2NjYiKSkgewotCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCQkvLyByZW1vdmluZyBhIHByZXZpb3VzIGVsZW1lbnQsIGRvZXMgbm90IGNoYW5nZSB0aGUgY3Vyc29yCi0JCQl9Ci0JCQlpZiAocHJldmlvdXMuZXF1YWxzKCIyMiIpKSB7Ci0JCQkJc3RyZWFtLmFkZCgiMS41Iik7Ci0JCQkJaSsrOwotCQkJfQotCQkJYXNzZXJ0RXF1YWxzKGksIHN0cmVhbS5uZXh0SW5kZXgoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoaSAtIDEsIHN0cmVhbS5wcmV2aW91c0luZGV4KCkpOwotCQl9Ci0JCWFzc2VydEVxdWFscygiaW5kZXggaXMgY29ycnVwdCIsIDAsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcmV2aW91c0luZGV4KCkgewotCQkvLyBUT0RPCi0JfQotCi0JQE92ZXJyaWRlCi0Jdm9pZCB2ZXJpZnlOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtKSB7Ci0JCXN1cGVyLnZlcmlmeU5vU3VjaEVsZW1lbnRFeGNlcHRpb24oc3RyZWFtKTsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtMiA9IChMaXN0SXRlcmF0b3I8U3RyaW5nPikgc3RyZWFtOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCVN0cmluZyBzdHJpbmcgPSBudWxsOwotCQl3aGlsZSAoc3RyZWFtMi5oYXNQcmV2aW91cygpKSB7Ci0JCQlzdHJpbmcgPSBzdHJlYW0yLnByZXZpb3VzKCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCXN0cmluZyA9IHN0cmVhbTIucHJldmlvdXMoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93bjogIiArIHN0cmluZywgZXhDYXVnaHQpOwotCX0KLQotCUBPdmVycmlkZQotCXZvaWQgdmVyaWZ5VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0pIHsKLQkJc3VwZXIudmVyaWZ5VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oc3RyZWFtKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0yID0gKExpc3RJdGVyYXRvcjxTdHJpbmc+KSBzdHJlYW07Ci0JCXdoaWxlIChzdHJlYW0yLmhhc1ByZXZpb3VzKCkpIHsKLQkJCU9iamVjdCBzdHJpbmcgPSBzdHJlYW0yLnByZXZpb3VzKCk7Ci0JCQlpZiAoc3RyaW5nLmVxdWFscygiMzMzIikpIHsKLQkJCQl0cnkgewotCQkJCQlzdHJlYW0yLnJlbW92ZSgpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQl2b2lkIHZlcmlmeUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbihJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSkgewotCQlzdXBlci52ZXJpZnlJbGxlZ2FsU3RhdGVFeGNlcHRpb24oc3RyZWFtKTsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtMiA9IChMaXN0SXRlcmF0b3I8U3RyaW5nPikgc3RyZWFtOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlzdHJlYW0yLnNldCgianVuayIpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQl2b2lkIHZlcmlmeUVtcHR5SGFzQW5vdGhlcihJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSkgewotCQlzdXBlci52ZXJpZnlFbXB0eUhhc0Fub3RoZXIoc3RyZWFtKTsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtMiA9IChMaXN0SXRlcmF0b3I8U3RyaW5nPikgc3RyZWFtOwotCQlpbnQgaSA9IDA7Ci0JCXdoaWxlIChzdHJlYW0yLmhhc1ByZXZpb3VzKCkpIHsKLQkJCXN0cmVhbTIucHJldmlvdXMoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoMCwgaSk7Ci0JfQotCi0JLy8gdW5jaGVja2VkIHNvIHdlIGNhbiBvdmVycmlkZSB0aGUgdW5jaGVja2VkIG1ldGhvZCBpbiBzdXBlcmNsYXNzCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JSXRlcmF0b3I8U3RyaW5nPiBidWlsZENvbXBvc2l0ZUl0ZXJhdG9yKEl0ZXJhdG9yIGl0ZXJhdG9ycykgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUxpc3RJdGVyYXRvcjxTdHJpbmc+KChMaXN0SXRlcmF0b3I8TGlzdEl0ZXJhdG9yPFN0cmluZz4+KSBpdGVyYXRvcnMpOwotCX0KLQotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUl0ZXJhdG9yPFN0cmluZz4gYnVpbGRDb21wb3NpdGVJdGVyYXRvcjIoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlTGlzdEl0ZXJhdG9yPFN0cmluZz4odGhpcy5idWlsZEl0ZXJhdG9yMSgpLCB0aGlzLmJ1aWxkSXRlcmF0b3IyKCksIHRoaXMuYnVpbGRJdGVyYXRvcjMoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JSXRlcmF0b3I8U3RyaW5nPiBidWlsZENvbXBvc2l0ZUl0ZXJhdG9yMygpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVMaXN0SXRlcmF0b3I8U3RyaW5nPihuZXcgTGlzdEl0ZXJhdG9yW10geyB0aGlzLmJ1aWxkSXRlcmF0b3IxKCksIHRoaXMuYnVpbGRJdGVyYXRvcjIoKSwgdGhpcy5idWlsZEl0ZXJhdG9yMygpIH0pOwotCX0KLQotCUl0ZXJhdG9yPFN0cmluZz4gYnVpbGRDb21wb3NpdGVJdGVyYXRvcihTdHJpbmcgc3RyaW5nLCBMaXN0SXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvcikgewotCQlyZXR1cm4gdGhpcy5idWlsZENvbXBvc2l0ZUxpc3RJdGVyYXRvcihzdHJpbmcsIGl0ZXJhdG9yKTsKLQl9Ci0KLQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBidWlsZENvbXBvc2l0ZUxpc3RJdGVyYXRvcihTdHJpbmcgc3RyaW5nLCBMaXN0SXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvcikgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUxpc3RJdGVyYXRvcjxTdHJpbmc+KHN0cmluZywgaXRlcmF0b3IpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvRW1wdHlFbnVtZXJhdGlvblRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9FbXB0eUVudW1lcmF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg2OTc4OS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9FbXB0eUVudW1lcmF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlFbnVtZXJhdGlvbjsKLQotcHVibGljIGNsYXNzIEVtcHR5RW51bWVyYXRpb25UZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBFbXB0eUVudW1lcmF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc01vcmVFbGVtZW50cygpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEVudW1lcmF0aW9uPE9iamVjdD4gc3RyZWFtID0gRW1wdHlFbnVtZXJhdGlvbi5pbnN0YW5jZSgpOyBzdHJlYW0uaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JCQlzdHJlYW0ubmV4dEVsZW1lbnQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoMCwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHRFbGVtZW50KCkgewotCQlmb3IgKEVudW1lcmF0aW9uPE9iamVjdD4gc3RyZWFtID0gRW1wdHlFbnVtZXJhdGlvbi5pbnN0YW5jZSgpOyBzdHJlYW0uaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JCQlmYWlsKCJib2d1cyBlbGVtZW50OiAiICsgc3RyZWFtLm5leHRFbGVtZW50KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJRW51bWVyYXRpb248T2JqZWN0PiBzdHJlYW0gPSBFbXB0eUVudW1lcmF0aW9uLmluc3RhbmNlKCk7Ci0JCU9iamVjdCBlbGVtZW50ID0gbnVsbDsKLQkJd2hpbGUgKHN0cmVhbS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJZWxlbWVudCA9IHN0cmVhbS5uZXh0RWxlbWVudCgpOwotCQl9Ci0JCXRyeSB7Ci0JCQllbGVtZW50ID0gc3RyZWFtLm5leHRFbGVtZW50KCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd246ICIgKyBlbGVtZW50LCBleENhdWdodCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9FbXB0eUl0ZXJhdG9yVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0VtcHR5SXRlcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTg1YWQ0Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0VtcHR5SXRlcmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgRW1wdHlJdGVyYXRvclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIEVtcHR5SXRlcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTmV4dCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPE9iamVjdD4gc3RyZWFtID0gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoMCwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHQoKSB7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlmYWlsKCJib2d1cyBlbGVtZW50OiAiICsgc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlJdGVyYXRvcjxOdW1iZXI+IHN0cmVhbSA9IEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQkJT2JqZWN0IGVsZW1lbnQgPSBudWxsOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJZWxlbWVudCA9IHN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCWVsZW1lbnQgPSBzdHJlYW0ubmV4dCgpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duOiAiICsgZWxlbWVudCwgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpLnJlbW92ZSgpOwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9FbXB0eUxpc3RJdGVyYXRvclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9FbXB0eUxpc3RJdGVyYXRvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1YzhlZmMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvRW1wdHlMaXN0SXRlcmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5TGlzdEl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgRW1wdHlMaXN0SXRlcmF0b3JUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBFbXB0eUxpc3RJdGVyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNOZXh0KCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPE9iamVjdD4gc3RyZWFtID0gRW1wdHlMaXN0SXRlcmF0b3IuaW5zdGFuY2UoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDAsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0KCkgewotCQlmb3IgKExpc3RJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSA9IEVtcHR5TGlzdEl0ZXJhdG9yLmluc3RhbmNlKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlmYWlsKCJib2d1cyBlbGVtZW50OiAiICsgc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dEluZGV4KCkgewotCQlMaXN0SXRlcmF0b3I8T2JqZWN0PiBzdHJlYW0gPSBFbXB0eUxpc3RJdGVyYXRvci5pbnN0YW5jZSgpOwotCQlhc3NlcnRFcXVhbHMoMCwgc3RyZWFtLm5leHRJbmRleCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzUHJldmlvdXMoKSB7Ci0JCUxpc3RJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSA9IEVtcHR5TGlzdEl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JCWludCBpID0gMDsKLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlzdHJlYW0ucHJldmlvdXMoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoMCwgaSk7Ci0KLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJaSA9IDA7Ci0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJc3RyZWFtLnByZXZpb3VzKCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDAsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcmV2aW91cygpIHsKLQkJTGlzdEl0ZXJhdG9yPE9iamVjdD4gc3RyZWFtID0gRW1wdHlMaXN0SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlmYWlsKCJib2d1cyBlbGVtZW50OiAiICsgc3RyZWFtLnByZXZpb3VzKCkpOwotCQl9Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJZmFpbCgiYm9ndXMgZWxlbWVudDogIiArIHN0cmVhbS5wcmV2aW91cygpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcmV2aW91c0luZGV4KCkgewotCQlMaXN0SXRlcmF0b3I8T2JqZWN0PiBzdHJlYW0gPSBFbXB0eUxpc3RJdGVyYXRvci5pbnN0YW5jZSgpOwotCQlhc3NlcnRFcXVhbHMoLTEsIHN0cmVhbS5wcmV2aW91c0luZGV4KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCUxpc3RJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSA9IEVtcHR5TGlzdEl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JCU9iamVjdCBlbGVtZW50ID0gbnVsbDsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCWVsZW1lbnQgPSBzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCXRyeSB7Ci0JCQllbGVtZW50ID0gc3RyZWFtLm5leHQoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93biAobmV4dCk6ICIgKyBlbGVtZW50LCBleENhdWdodCk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJZWxlbWVudCA9IHN0cmVhbS5wcmV2aW91cygpOwotCQl9Ci0JCXRyeSB7Ci0JCQllbGVtZW50ID0gc3RyZWFtLnByZXZpb3VzKCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd24gKHByZXZpb3VzKTogIiArIGVsZW1lbnQsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUVtcHR5TGlzdEl0ZXJhdG9yLmluc3RhbmNlKCkucmVtb3ZlKCk7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biAocmVtb3ZlKSIsIGV4Q2F1Z2h0KTsKLQkJdHJ5IHsKLQkJCUVtcHR5TGlzdEl0ZXJhdG9yLmluc3RhbmNlKCkuc2V0KG5ldyBPYmplY3QoKSk7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biAoc2V0KSIsIGV4Q2F1Z2h0KTsKLQkJdHJ5IHsKLQkJCUVtcHR5TGlzdEl0ZXJhdG9yLmluc3RhbmNlKCkuYWRkKG5ldyBPYmplY3QoKSk7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biAoYWRkKSIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0VudW1lcmF0aW9uSXRlcmF0b3JUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvRW51bWVyYXRpb25JdGVyYXRvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyOGYxMDEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvRW51bWVyYXRpb25JdGVyYXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbnVtZXJhdGlvbkl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgRW51bWVyYXRpb25JdGVyYXRvclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIEVudW1lcmF0aW9uSXRlcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTmV4dCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkVmVjdG9yKCkuc2l6ZSgpLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTmV4dFVwY2FzdCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPE9iamVjdD4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yVXBjYXN0KCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkVmVjdG9yKCkuc2l6ZSgpLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dCgpIHsKLQkJRW51bWVyYXRpb248U3RyaW5nPiBlbnVtZXJhdGlvbiA9IHRoaXMuYnVpbGRFbnVtZXJhdGlvbigpOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGVsZW1lbnQiLCBlbnVtZXJhdGlvbi5uZXh0RWxlbWVudCgpLCBzdHJlYW0ubmV4dCgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0VXBjYXN0KCkgewotCQlFbnVtZXJhdGlvbjxTdHJpbmc+IGVudW1lcmF0aW9uID0gdGhpcy5idWlsZEVudW1lcmF0aW9uKCk7Ci0JCWZvciAoSXRlcmF0b3I8T2JqZWN0PiBzdHJlYW0gPSB0aGlzLmJ1aWxkSXRlcmF0b3JVcGNhc3QoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgZWxlbWVudCIsIGVudW1lcmF0aW9uLm5leHRFbGVtZW50KCksIHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkSXRlcmF0b3IoKTsKLQkJU3RyaW5nIHN0cmluZyA9IG51bGw7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJpbmcgPSBzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCXRyeSB7Ci0JCQlzdHJpbmcgPSBzdHJlYW0ubmV4dCgpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duOiAiICsgc3RyaW5nLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkSXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWlmIChzdHJlYW0ubmV4dCgpLmVxdWFscygidGhyZWUiKSkgewotCQkJCXRyeSB7Ci0JCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkSXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkSXRlcmF0b3IodGhpcy5idWlsZEVudW1lcmF0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBidWlsZEl0ZXJhdG9yKEVudW1lcmF0aW9uPFN0cmluZz4gZW51bWVyYXRpb24pIHsKLQkJcmV0dXJuIG5ldyBFbnVtZXJhdGlvbkl0ZXJhdG9yPFN0cmluZz4oZW51bWVyYXRpb24pOwotCX0KLQotCXByaXZhdGUgRW51bWVyYXRpb248U3RyaW5nPiBidWlsZEVudW1lcmF0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFZlY3RvcigpLmVsZW1lbnRzKCk7Ci0JfQotCi0JcHJpdmF0ZSBWZWN0b3I8U3RyaW5nPiBidWlsZFZlY3RvcigpIHsKLQkJVmVjdG9yPFN0cmluZz4gdiA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOwotCQl2LmFkZEVsZW1lbnQoIm9uZSIpOwotCQl2LmFkZEVsZW1lbnQoInR3byIpOwotCQl2LmFkZEVsZW1lbnQoInRocmVlIik7Ci0JCXYuYWRkRWxlbWVudCgiZm91ciIpOwotCQl2LmFkZEVsZW1lbnQoImZpdmUiKTsKLQkJdi5hZGRFbGVtZW50KCJzaXgiKTsKLQkJdi5hZGRFbGVtZW50KCJzZXZlbiIpOwotCQl2LmFkZEVsZW1lbnQoImVpZ2h0Iik7Ci0JCXJldHVybiB2OwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8T2JqZWN0PiBidWlsZEl0ZXJhdG9yVXBjYXN0KCkgewotCQlyZXR1cm4gdGhpcy5idWlsZEl0ZXJhdG9yVXBjYXN0KHRoaXMuYnVpbGRFbnVtZXJhdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPE9iamVjdD4gYnVpbGRJdGVyYXRvclVwY2FzdChFbnVtZXJhdGlvbjxTdHJpbmc+IGVudW1lcmF0aW9uKSB7Ci0JCXJldHVybiBuZXcgRW51bWVyYXRpb25JdGVyYXRvcjxPYmplY3Q+KGVudW1lcmF0aW9uKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0ZpbHRlcmluZ0l0ZXJhdG9yVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0ZpbHRlcmluZ0l0ZXJhdG9yVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI2ODI0NS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9GaWx0ZXJpbmdJdGVyYXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5TaW1wbGVGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkZpbHRlcmluZ0l0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgRmlsdGVyaW5nSXRlcmF0b3JUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVggPSAicHJlZml4IjsKLQotCXB1YmxpYyBGaWx0ZXJpbmdJdGVyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZEFjY2VwdEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcgc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJCWlmIChzdHJpbmcuZXF1YWxzKFBSRUZJWCArICIzIikpIHsKLQkJCQl0cnkgewotCQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKCJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZEFjY2VwdEl0ZXJhdG9yKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSBudWxsOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJfQotCQl0cnkgewotCQkJc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93bjogIiArIHN0cmluZywgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBY2NlcHRIYXNOZXh0KCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkQWNjZXB0SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDYsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBY2NlcHROZXh0KCkgewotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZEFjY2VwdEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlhc3NlcnRUcnVlKCJib2d1cyBhY2NlcHQiLCBzdHJlYW0ubmV4dCgpLnN0YXJ0c1dpdGgoUFJFRklYKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5uZXJIYXNOZXh0KCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkSW5uZXJJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoNiwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElubmVyTmV4dCgpIHsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRJbm5lckl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlhc3NlcnRUcnVlKCJib2d1cyBhY2NlcHQiLCBzdHJlYW0ubmV4dCgpLnN0YXJ0c1dpdGgoUFJFRklYKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVqZWN0SGFzTmV4dCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFJlamVjdEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscygyLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVqZWN0TmV4dCgpIHsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRSZWplY3RJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJYXNzZXJ0RmFsc2UoImJvZ3VzIHJlamVjdCIsIHN0cmVhbS5uZXh0KCkuc3RhcnRzV2l0aChQUkVGSVgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCb3RoSGFzTmV4dCgpIHsKLQkJLy8gaWYgYm90aCBhY2NlcHQoKSBhbmQgcmVqZWN0KCkgYXJlIG92ZXJyaWRkZW4sIGFjY2VwdCgpIGlzIHVzZWQKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZEJvdGhJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoNiwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExvYWROZXh0KCkgewotCQkvLyBsb2FkTmV4dCgpIHVzZWQgdG8gY2F1c2UgYSBOUEUgd2hlbiBleGVjdXRpbmcgZHVyaW5nIHRoZQotCQkvLyBjb25zdHJ1Y3RvciBiZWNhdXNlIHRoZSAib3V0ZXIiIGNsYXNzIGlzIG5vdCBib3VuZCB1bnRpbCBjb21wbGV0aW9uCi0JCS8vIG9mIHRoZSBjb25zdHJ1Y3RvcgotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZElubmVySXRlcmF0b3IyKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlhc3NlcnRUcnVlKCJib2d1cyBhY2NlcHQiLCBzdHJlYW0ubmV4dCgpLnN0YXJ0c1dpdGgoUFJFRklYKSk7Ci0JCX0KLQl9Ci0KLQkvLyB0ZXN0IGEgZmlsdGVyZWQgaXRlcmF0b3Igd2l0aCBhIG5lc3RlZCBpdGVyYXRvciBvZiBhIHN1Yi10eXBlIChOdW1iZXIgdnMuIEludGVnZXIpCi0JcHVibGljIHZvaWQgdGVzdEdlbmVyaWNzMSgpIHsKLQkJTGlzdDxJbnRlZ2VyPiBpbnRlZ2VycyA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTsKLQkJaW50ZWdlcnMuYWRkKG5ldyBJbnRlZ2VyKDApKTsKLQkJaW50ZWdlcnMuYWRkKG5ldyBJbnRlZ2VyKDEpKTsKLQkJaW50ZWdlcnMuYWRkKG5ldyBJbnRlZ2VyKDIpKTsKLQkJaW50ZWdlcnMuYWRkKG5ldyBJbnRlZ2VyKDMpKTsKLQkJSXRlcmF0b3I8TnVtYmVyPiBzdHJlYW0gPSBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8TnVtYmVyPihpbnRlZ2Vycy5pdGVyYXRvcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChPYmplY3QgbykgewotCQkJCXJldHVybiAoKE51bWJlcikgbykuaW50VmFsdWUoKSA+IDE7Ci0JCQl9Ci0JCX07Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShzdHJlYW0pKTsKLQl9Ci0KLQkvLyB0ZXN0IGEgZmlsdGVyZWQgaXRlcmF0b3Igd2l0aCBhIG5lc3RlZCBpdGVyYXRvciBvZiBhIHN1cGVyLXR5cGUgKEludGVnZXIgdnMuIE51bWJlcikKLQkvLyBpLmUuIHRydXN0IHRoYXQgRmlsdGVyIHdpbGwgb25seSByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIHN1Yi10eXBlIG9iamVjdHMKLQlwdWJsaWMgdm9pZCB0ZXN0R2VuZXJpY3MyKCkgewotCQlMaXN0PE51bWJlcj4gaW50ZWdlcnMgPSBuZXcgQXJyYXlMaXN0PE51bWJlcj4oKTsKLQkJaW50ZWdlcnMuYWRkKG5ldyBJbnRlZ2VyKDApKTsKLQkJaW50ZWdlcnMuYWRkKG5ldyBMb25nKDEpKTsKLQkJaW50ZWdlcnMuYWRkKG5ldyBJbnRlZ2VyKDIpKTsKLQkJaW50ZWdlcnMuYWRkKG5ldyBGbG9hdCgzKSk7Ci0JCUl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxJbnRlZ2VyPihpbnRlZ2Vycy5pdGVyYXRvcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChPYmplY3QgbykgewotCQkJCXJldHVybiBvIGluc3RhbmNlb2YgSW50ZWdlcjsKLQkJCX0KLQkJfTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHN0cmVhbSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaWx0ZXJIYXNOZXh0KCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkRmlsdGVySXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDYsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaWx0ZXJOZXh0KCkgewotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZEZpbHRlckl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlhc3NlcnRUcnVlKCJib2d1cyBhY2NlcHQiLCBzdHJlYW0ubmV4dCgpLnN0YXJ0c1dpdGgoUFJFRklYKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRGaWx0ZXJlZEl0ZXJhdG9yKEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IsIEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPFN0cmluZz4obmVzdGVkSXRlcmF0b3IsIGZpbHRlcik7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkSW5uZXJGaWx0ZXJlZEl0ZXJhdG9yKEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxTdHJpbmc+KG5lc3RlZEl0ZXJhdG9yKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChPYmplY3QgbykgewotCQkJCXJldHVybiAoKFN0cmluZykgbykuc3RhcnRzV2l0aChQUkVGSVgpOwotCQkJfQotCQl9OwotCX0KLQotCVN0cmluZyBnZXRQcmVmaXgoKSB7Ci0JCXJldHVybiBQUkVGSVg7Ci0JfQotCi0JLy8gdGhpcyBpbm5lciBpdGVyYXRvciB3aWxsIGNhbGwgdGhlICJvdXRlciIgb2JqZWN0Ci0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkSW5uZXJGaWx0ZXJlZEl0ZXJhdG9yMihJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZEl0ZXJhdG9yKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8U3RyaW5nPihuZXN0ZWRJdGVyYXRvcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG8pIHsKLQkJCQlyZXR1cm4gKChTdHJpbmcpIG8pLnN0YXJ0c1dpdGgoRmlsdGVyaW5nSXRlcmF0b3JUZXN0cy50aGlzLmdldFByZWZpeCgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gYnVpbGROZXN0ZWRJdGVyYXRvcigpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYy5hZGQoUFJFRklYICsgIjEiKTsKLQkJYy5hZGQoUFJFRklYICsgIjIiKTsKLQkJYy5hZGQoUFJFRklYICsgIjMiKTsKLQkJYy5hZGQoIjQiKTsKLQkJYy5hZGQoUFJFRklYICsgIjUiKTsKLQkJYy5hZGQoUFJFRklYICsgIjYiKTsKLQkJYy5hZGQoUFJFRklYICsgIjciKTsKLQkJYy5hZGQoIjgiKTsKLQkJcmV0dXJuIGMuaXRlcmF0b3IoKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRBY2NlcHRJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRGaWx0ZXJlZEl0ZXJhdG9yKHRoaXMuYnVpbGROZXN0ZWRJdGVyYXRvcigpLCB0aGlzLmJ1aWxkQWNjZXB0RmlsdGVyKFBSRUZJWCkpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBidWlsZElubmVySXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkSW5uZXJGaWx0ZXJlZEl0ZXJhdG9yKHRoaXMuYnVpbGROZXN0ZWRJdGVyYXRvcigpKTsKLQl9Ci0KLQkvLyB0aGlzIGlubmVyIGl0ZXJhdG9yIHdpbGwgY2FsbCB0aGUgIm91dGVyIiBvYmplY3QKLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRJbm5lckl0ZXJhdG9yMigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRJbm5lckZpbHRlcmVkSXRlcmF0b3IyKHRoaXMuYnVpbGROZXN0ZWRJdGVyYXRvcigpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRGaWx0ZXJJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRGaWx0ZXJlZEl0ZXJhdG9yKHRoaXMuYnVpbGROZXN0ZWRJdGVyYXRvcigpLCB0aGlzLmJ1aWxkRmlsdGVyRmlsdGVyKFBSRUZJWCkpOwotCX0KLQotCXByaXZhdGUgRmlsdGVyPFN0cmluZz4gYnVpbGRBY2NlcHRGaWx0ZXIoU3RyaW5nIHByZWZpeCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUZpbHRlcjxTdHJpbmcsIFN0cmluZz4ocHJlZml4KSB7Ci0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoU3RyaW5nIHMpIHsKLQkJCQlyZXR1cm4gcy5zdGFydHNXaXRoKHRoaXMuY3JpdGVyaW9uKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRSZWplY3RJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRGaWx0ZXJlZEl0ZXJhdG9yKHRoaXMuYnVpbGROZXN0ZWRJdGVyYXRvcigpLCB0aGlzLmJ1aWxkUmVqZWN0RmlsdGVyKFBSRUZJWCkpOwotCX0KLQotCXByaXZhdGUgRmlsdGVyPFN0cmluZz4gYnVpbGRSZWplY3RGaWx0ZXIoU3RyaW5nIHByZWZpeCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUZpbHRlcjxTdHJpbmcsIFN0cmluZz4ocHJlZml4KSB7Ci0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiByZWplY3QoU3RyaW5nIHMpIHsKLQkJCQlyZXR1cm4gcy5zdGFydHNXaXRoKHRoaXMuY3JpdGVyaW9uKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvLyB1c2UgYW5vbnltb3VzIGlubmVyIEZpbHRlcgotCXByaXZhdGUgRmlsdGVyPFN0cmluZz4gYnVpbGRGaWx0ZXJGaWx0ZXIoZmluYWwgU3RyaW5nIHByZWZpeCkgewotCQlyZXR1cm4gbmV3IEZpbHRlcjxTdHJpbmc+KCkgewotCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KFN0cmluZyBzKSB7Ci0JCQkJcmV0dXJuIHMuc3RhcnRzV2l0aChwcmVmaXgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBidWlsZEJvdGhJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRGaWx0ZXJlZEl0ZXJhdG9yKHRoaXMuYnVpbGROZXN0ZWRJdGVyYXRvcigpLCB0aGlzLmJ1aWxkQm90aEZpbHRlcihQUkVGSVgpKTsKLQl9Ci0KLQlwcml2YXRlIEZpbHRlcjxTdHJpbmc+IGJ1aWxkQm90aEZpbHRlcihTdHJpbmcgcHJlZml4KSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlRmlsdGVyPFN0cmluZywgU3RyaW5nPihwcmVmaXgpIHsKLQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBib29sZWFuIHJlamVjdChTdHJpbmcgcykgewotCQkJCXJldHVybiBzLnN0YXJ0c1dpdGgodGhpcy5jcml0ZXJpb24pOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChTdHJpbmcgcykgewotCQkJCXJldHVybiBzLnN0YXJ0c1dpdGgodGhpcy5jcml0ZXJpb24pOwotCQkJfQotCQl9OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvR3JhcGhJdGVyYXRvclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9HcmFwaEl0ZXJhdG9yVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdmODg0Yy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9HcmFwaEl0ZXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkdyYXBoSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1wdWJsaWMgY2xhc3MgR3JhcGhJdGVyYXRvclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCS8qKiB0aGlzIHdpbGwgYmUgcG9wdWxhdGVkIHdpdGggYWxsIHRoZSBub2RlcyBjcmVhdGVkIGZvciB0aGUgdGVzdCAqLwotCUNvbGxlY3Rpb248R3JhcGhOb2RlPiBub2RlcyA9IG5ldyBBcnJheUxpc3Q8R3JhcGhOb2RlPigpOwotCi0JcHVibGljIEdyYXBoSXRlcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc05leHQxKCkgewotCQl0aGlzLnZlcmlmeUhhc05leHQodGhpcy5idWlsZEdyYXBoSXRlcmF0b3IxKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNOZXh0MigpIHsKLQkJdGhpcy52ZXJpZnlIYXNOZXh0KHRoaXMuYnVpbGRHcmFwaEl0ZXJhdG9yMigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5SGFzTmV4dChJdGVyYXRvcjxHcmFwaE5vZGU+IGl0ZXJhdG9yKSB7Ci0JCWludCBpID0gMDsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJaXRlcmF0b3IubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyh0aGlzLm5vZGVzLnNpemUoKSwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHQxKCkgewotCQl0aGlzLnZlcmlmeU5leHQodGhpcy5idWlsZEdyYXBoSXRlcmF0b3IxKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0MigpIHsKLQkJdGhpcy52ZXJpZnlOZXh0KHRoaXMuYnVpbGRHcmFwaEl0ZXJhdG9yMigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5TmV4dChJdGVyYXRvcjxHcmFwaE5vZGU+IGl0ZXJhdG9yKSB7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWFzc2VydFRydWUoImJvZ3VzIGVsZW1lbnQiLCB0aGlzLm5vZGVzLmNvbnRhaW5zKGl0ZXJhdG9yLm5leHQoKSkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vU3VjaEVsZW1lbnRFeGNlcHRpb24xKCkgewotCQl0aGlzLnZlcmlmeU5vU3VjaEVsZW1lbnRFeGNlcHRpb24odGhpcy5idWlsZEdyYXBoSXRlcmF0b3IxKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hFbGVtZW50RXhjZXB0aW9uMigpIHsKLQkJdGhpcy52ZXJpZnlOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKHRoaXMuYnVpbGRHcmFwaEl0ZXJhdG9yMigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbihJdGVyYXRvcjxHcmFwaE5vZGU+IGl0ZXJhdG9yKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJaXRlcmF0b3IubmV4dCgpOwotCQl9Ci0JCXRyeSB7Ci0JCQlpdGVyYXRvci5uZXh0KCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpemUxKCkgewotCQl0aGlzLnZlcmlmeVNpemUodGhpcy5idWlsZEdyYXBoSXRlcmF0b3IxKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaXplMigpIHsKLQkJdGhpcy52ZXJpZnlTaXplKHRoaXMuYnVpbGRHcmFwaEl0ZXJhdG9yMigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5U2l6ZShJdGVyYXRvcjxHcmFwaE5vZGU+IGl0ZXJhdG9yKSB7Ci0JCWludCBpdGVyYXRvclNpemUgPSBDb2xsZWN0aW9uVG9vbHMuc2l6ZShpdGVyYXRvcik7Ci0JCWludCBhY3R1YWxTaXplID0gdGhpcy5ub2Rlcy5zaXplKCk7Ci0JCWFzc2VydFRydWUoIlRvbyBmZXcgaXRlbXMgaW4gaXRlcmF0b3IuIiwgaXRlcmF0b3JTaXplID49IGFjdHVhbFNpemUpOwotCQlhc3NlcnRUcnVlKCJUb28gbWFueSBpdGVtcyBpbiBpdGVyYXRvci4iLCBpdGVyYXRvclNpemUgPD0gYWN0dWFsU2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogYnVpbGQgYSBncmFwaCBpdGVyYXRvciB3aXRoIGFuIGV4cGxpY2l0IG1pc3RlclJvZ2VycwotCSAqLwotCXByaXZhdGUgSXRlcmF0b3I8R3JhcGhOb2RlPiBidWlsZEdyYXBoSXRlcmF0b3IxKCkgewotCQlyZXR1cm4gbmV3IEdyYXBoSXRlcmF0b3I8R3JhcGhOb2RlPih0aGlzLmJ1aWxkR3JhcGhSb290KCksIHRoaXMuYnVpbGRNaXN0ZXJSb2dlcnMoKSk7Ci0JfQotCi0JcHJpdmF0ZSBHcmFwaEl0ZXJhdG9yLk1pc3RlclJvZ2VyczxHcmFwaE5vZGU+IGJ1aWxkTWlzdGVyUm9nZXJzKCkgewotCQlyZXR1cm4gbmV3IEdyYXBoSXRlcmF0b3IuTWlzdGVyUm9nZXJzPEdyYXBoTm9kZT4oKSB7Ci0JCQlwdWJsaWMgSXRlcmF0b3I8R3JhcGhOb2RlPiBuZWlnaGJvcnMoR3JhcGhOb2RlIG5leHQpIHsKLQkJCQlyZXR1cm4gbmV4dC5uZWlnaGJvcnMoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBidWlsZCBhIGdyYXBoIGl0ZXJhdG9yIHdpdGggYW4gb3ZlcnJpZGUKLQkgKi8KLQlwcml2YXRlIEl0ZXJhdG9yPEdyYXBoTm9kZT4gYnVpbGRHcmFwaEl0ZXJhdG9yMigpIHsKLQkJcmV0dXJuIG5ldyBHcmFwaEl0ZXJhdG9yPEdyYXBoTm9kZT4odGhpcy5idWlsZEdyYXBoUm9vdCgpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxHcmFwaE5vZGU+IG5laWdoYm9ycyhHcmFwaE5vZGUgbmV4dCkgewotCQkJCXJldHVybiBuZXh0Lm5laWdoYm9ycygpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgR3JhcGhOb2RlIGJ1aWxkR3JhcGhSb290KCkgewotCQlHcmFwaE5vZGUgbmNOb2RlID0gbmV3IEdyYXBoTm9kZSgiTm9ydGggQ2Fyb2xpbmEiKTsKLQkJR3JhcGhOb2RlIHZhTm9kZSA9IG5ldyBHcmFwaE5vZGUoIlZpcmdpbmlhIik7Ci0JCUdyYXBoTm9kZSBzY05vZGUgPSBuZXcgR3JhcGhOb2RlKCJTb3V0aCBDYXJvbGluYSIpOwotCQlHcmFwaE5vZGUgZ2FOb2RlID0gbmV3IEdyYXBoTm9kZSgiR2VvcmdpYSIpOwotCQlHcmFwaE5vZGUgZmxOb2RlID0gbmV3IEdyYXBoTm9kZSgiRmxvcmlkYSIpOwotCQlHcmFwaE5vZGUgYWxOb2RlID0gbmV3IEdyYXBoTm9kZSgiQWxhYmFtYSIpOwotCQlHcmFwaE5vZGUgbXNOb2RlID0gbmV3IEdyYXBoTm9kZSgiTWlzc2lzc2lwcGkiKTsKLQkJR3JhcGhOb2RlIHRuTm9kZSA9IG5ldyBHcmFwaE5vZGUoIlRlbm5lc3NlZSIpOwotCi0JCW5jTm9kZS5zZXROZWlnaGJvcnMobmV3IEdyYXBoTm9kZVtdIHsgdmFOb2RlLCBzY05vZGUsIGdhTm9kZSwgdG5Ob2RlIH0pOwotCQl2YU5vZGUuc2V0TmVpZ2hib3JzKG5ldyBHcmFwaE5vZGVbXSB7IG5jTm9kZSwgdG5Ob2RlIH0pOwotCQlzY05vZGUuc2V0TmVpZ2hib3JzKG5ldyBHcmFwaE5vZGVbXSB7IG5jTm9kZSwgZ2FOb2RlIH0pOwotCQlnYU5vZGUuc2V0TmVpZ2hib3JzKG5ldyBHcmFwaE5vZGVbXSB7IG5jTm9kZSwgc2NOb2RlLCBmbE5vZGUsIGFsTm9kZSwgdG5Ob2RlIH0pOwotCQlmbE5vZGUuc2V0TmVpZ2hib3JzKG5ldyBHcmFwaE5vZGVbXSB7IGdhTm9kZSB9KTsKLQkJYWxOb2RlLnNldE5laWdoYm9ycyhuZXcgR3JhcGhOb2RlW10geyBnYU5vZGUsIG1zTm9kZSwgdG5Ob2RlIH0pOwotCQltc05vZGUuc2V0TmVpZ2hib3JzKG5ldyBHcmFwaE5vZGVbXSB7IGFsTm9kZSwgdG5Ob2RlIH0pOwotCQl0bk5vZGUuc2V0TmVpZ2hib3JzKG5ldyBHcmFwaE5vZGVbXSB7IHZhTm9kZSwgbmNOb2RlLCBnYU5vZGUsIGFsTm9kZSwgbXNOb2RlIH0pOwotCi0JCXJldHVybiBuY05vZGU7Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBHcmFwaE5vZGUgewotCQlwcml2YXRlIFN0cmluZyBuYW1lOwotCi0JCXByaXZhdGUgQ29sbGVjdGlvbjxHcmFwaE5vZGU+IG5laWdoYm9ycyA9IG5ldyBBcnJheUxpc3Q8R3JhcGhOb2RlPigpOwotCi0JCXB1YmxpYyBHcmFwaE5vZGUoU3RyaW5nIG5hbWUpIHsKLQkJCXN1cGVyKCk7Ci0JCQlHcmFwaEl0ZXJhdG9yVGVzdHMudGhpcy5ub2Rlcy5hZGQodGhpcyk7IC8vIGxvZyBub2RlCi0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZTsKLQkJfQotCi0JCXZvaWQgc2V0TmVpZ2hib3JzKEdyYXBoTm9kZVtdIG5laWdoYm9ycykgewotCQkJdGhpcy5uZWlnaGJvcnMgPSBDb2xsZWN0aW9uVG9vbHMubGlzdChuZWlnaGJvcnMpOwotCQl9Ci0KLQkJcHVibGljIEl0ZXJhdG9yPEdyYXBoTm9kZT4gbmVpZ2hib3JzKCkgewotCQkJcmV0dXJuIHRoaXMubmVpZ2hib3JzLml0ZXJhdG9yKCk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IG5laWdoYm9yc1NpemUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5uZWlnaGJvcnMuc2l6ZSgpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIkdyYXBoTm9kZSgiICsgdGhpcy5uYW1lICsgIikiOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvSXRlcmF0b3JFbnVtZXJhdGlvblRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9JdGVyYXRvckVudW1lcmF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJkOGViNC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9JdGVyYXRvckVudW1lcmF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuSXRlcmF0b3JFbnVtZXJhdGlvbjsKLQotcHVibGljIGNsYXNzIEl0ZXJhdG9yRW51bWVyYXRpb25UZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBJdGVyYXRvckVudW1lcmF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc01vcmVFbGVtZW50cygpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEVudW1lcmF0aW9uPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZEVudW1lcmF0aW9uKCk7IHN0cmVhbS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLQkJCXN0cmVhbS5uZXh0RWxlbWVudCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkVmVjdG9yKCkuc2l6ZSgpLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTW9yZUVsZW1lbnRzVXBjYXN0KCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoRW51bWVyYXRpb248T2JqZWN0PiBzdHJlYW0gPSB0aGlzLmJ1aWxkRW51bWVyYXRpb25VcGNhc3QoKTsgc3RyZWFtLmhhc01vcmVFbGVtZW50cygpOykgewotCQkJc3RyZWFtLm5leHRFbGVtZW50KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRWZWN0b3IoKS5zaXplKCksIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0RWxlbWVudCgpIHsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOwotCQlmb3IgKEVudW1lcmF0aW9uPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZEVudW1lcmF0aW9uKCk7IHN0cmVhbS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgZWxlbWVudCIsIGl0ZXJhdG9yLm5leHQoKSwgc3RyZWFtLm5leHRFbGVtZW50KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJRW51bWVyYXRpb248U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkRW51bWVyYXRpb24oKTsKLQkJU3RyaW5nIHN0cmluZyA9IG51bGw7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCXN0cmluZyA9IHN0cmVhbS5uZXh0RWxlbWVudCgpOwotCQl9Ci0JCXRyeSB7Ci0JCQlzdHJpbmcgPSBzdHJlYW0ubmV4dEVsZW1lbnQoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93bjogIiArIHN0cmluZywgZXhDYXVnaHQpOwotCX0KLQotCXByaXZhdGUgRW51bWVyYXRpb248U3RyaW5nPiBidWlsZEVudW1lcmF0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZEVudW1lcmF0aW9uKHRoaXMuYnVpbGRJdGVyYXRvcigpKTsKLQl9Ci0KLQlwcml2YXRlIEVudW1lcmF0aW9uPE9iamVjdD4gYnVpbGRFbnVtZXJhdGlvblVwY2FzdCgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRFbnVtZXJhdGlvblVwY2FzdCh0aGlzLmJ1aWxkSXRlcmF0b3IoKSk7Ci0JfQotCi0JcHJpdmF0ZSBFbnVtZXJhdGlvbjxTdHJpbmc+IGJ1aWxkRW51bWVyYXRpb24oSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvcikgewotCQlyZXR1cm4gbmV3IEl0ZXJhdG9yRW51bWVyYXRpb248U3RyaW5nPihpdGVyYXRvcik7Ci0JfQotCi0JcHJpdmF0ZSBFbnVtZXJhdGlvbjxPYmplY3Q+IGJ1aWxkRW51bWVyYXRpb25VcGNhc3QoSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvcikgewotCQlyZXR1cm4gbmV3IEl0ZXJhdG9yRW51bWVyYXRpb248T2JqZWN0PihpdGVyYXRvcik7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkSXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVmVjdG9yKCkuaXRlcmF0b3IoKTsKLQl9Ci0KLQlwcml2YXRlIFZlY3RvcjxTdHJpbmc+IGJ1aWxkVmVjdG9yKCkgewotCQlWZWN0b3I8U3RyaW5nPiB2ID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7Ci0JCXYuYWRkRWxlbWVudCgib25lIik7Ci0JCXYuYWRkRWxlbWVudCgidHdvIik7Ci0JCXYuYWRkRWxlbWVudCgidGhyZWUiKTsKLQkJdi5hZGRFbGVtZW50KCJmb3VyIik7Ci0JCXYuYWRkRWxlbWVudCgiZml2ZSIpOwotCQl2LmFkZEVsZW1lbnQoInNpeCIpOwotCQl2LmFkZEVsZW1lbnQoInNldmVuIik7Ci0JCXYuYWRkRWxlbWVudCgiZWlnaHQiKTsKLQkJcmV0dXJuIHY7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9KcHRVdGlsaXR5SXRlcmF0b3JzVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0pwdFV0aWxpdHlJdGVyYXRvcnNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmU2NzE3Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0pwdFV0aWxpdHlJdGVyYXRvcnNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIGRlY2VudHJhbGl6ZSB0ZXN0IGNyZWF0aW9uIGNvZGUKLSAqLwotcHVibGljIGNsYXNzIEpwdFV0aWxpdHlJdGVyYXRvcnNUZXN0cyB7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0VXRpbGl0eUl0ZXJhdG9yc1Rlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShBcnJheUl0ZXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQXJyYXlMaXN0SXRlcmF0b3JUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDaGFpbkl0ZXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ2xvbmVJdGVyYXRvclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENsb25lTGlzdEl0ZXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ29tcG9zaXRlSXRlcmF0b3JUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDb21wb3NpdGVMaXN0SXRlcmF0b3JUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFbXB0eUVudW1lcmF0aW9uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRW1wdHlJdGVyYXRvclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVtcHR5TGlzdEl0ZXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRW51bWVyYXRpb25JdGVyYXRvclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEZpbHRlcmluZ0l0ZXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoR3JhcGhJdGVyYXRvclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEl0ZXJhdG9yRW51bWVyYXRpb25UZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShQZWVrYWJsZUl0ZXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUmVhZE9ubHlJdGVyYXRvclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFJlYWRPbmx5TGlzdEl0ZXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU2luZ2xlRWxlbWVudEl0ZXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFRyYW5zZm9ybWF0aW9uSXRlcmF0b3JUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFRyZWVJdGVyYXRvclRlc3RzLmNsYXNzKTsKLQotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi0JcHJpdmF0ZSBKcHRVdGlsaXR5SXRlcmF0b3JzVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9QZWVrYWJsZUl0ZXJhdG9yVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1BlZWthYmxlSXRlcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTNiNDdiLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1BlZWthYmxlSXRlcmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5QZWVrYWJsZUl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgUGVla2FibGVJdGVyYXRvclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIFBlZWthYmxlSXRlcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRQZWVrYWJsZUl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcgc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJCWlmIChzdHJpbmcuZXF1YWxzKCJ0aHJlZSIpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRQZWVrYWJsZUl0ZXJhdG9yKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSBudWxsOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJfQotCQl0cnkgewotCQkJc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93bjogIiArIHN0cmluZywgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNOZXh0KCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkUGVla2FibGVJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoNiwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc05leHRVcGNhc3QoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSA9IHRoaXMuYnVpbGRQZWVrYWJsZUl0ZXJhdG9yVXBjYXN0KCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyg2LCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dCgpIHsKLQkJSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkUGVla2FibGVJdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoInplcm8iLCBzdHJlYW0ubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJvbmUiLCBzdHJlYW0ubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0d28iLCBzdHJlYW0ubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0aHJlZSIsIHN0cmVhbS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvdXIiLCBzdHJlYW0ubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmaXZlIiwgc3RyZWFtLm5leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHRVcGNhc3QoKSB7Ci0JCUl0ZXJhdG9yPE9iamVjdD4gc3RyZWFtID0gdGhpcy5idWlsZFBlZWthYmxlSXRlcmF0b3JVcGNhc3QoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6ZXJvIiwgc3RyZWFtLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygib25lIiwgc3RyZWFtLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygidHdvIiwgc3RyZWFtLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygidGhyZWUiLCBzdHJlYW0ubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb3VyIiwgc3RyZWFtLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZml2ZSIsIHN0cmVhbS5uZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQZWVrKCkgewotCQlPYmplY3QgbmV4dCA9IG51bGw7Ci0JCWZvciAoUGVla2FibGVJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRQZWVrYWJsZUl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgcGVlayA9IHN0cmVhbS5wZWVrKCk7Ci0JCQlhc3NlcnRUcnVlKCJwZWVrIGFuZCBuZXh0IGFyZSBwcmVtYXR1cmVseSBpZGVudGljYWwiLCBwZWVrICE9IG5leHQpOwotCQkJbmV4dCA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlhc3NlcnRUcnVlKCJwZWVrIGFuZCBuZXh0IGFyZSBub3QgaWRlbnRpY2FsIiwgcGVlayA9PSBuZXh0KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQZWVrVXBjYXN0KCkgewotCQlPYmplY3QgbmV4dCA9IG51bGw7Ci0JCWZvciAoUGVla2FibGVJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSA9IHRoaXMuYnVpbGRQZWVrYWJsZUl0ZXJhdG9yVXBjYXN0KCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgcGVlayA9IHN0cmVhbS5wZWVrKCk7Ci0JCQlhc3NlcnRUcnVlKCJwZWVrIGFuZCBuZXh0IGFyZSBwcmVtYXR1cmVseSBpZGVudGljYWwiLCBwZWVrICE9IG5leHQpOwotCQkJbmV4dCA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlhc3NlcnRUcnVlKCJwZWVrIGFuZCBuZXh0IGFyZSBub3QgaWRlbnRpY2FsIiwgcGVlayA9PSBuZXh0KTsKLQkJfQotCX0KLQotCXByaXZhdGUgUGVla2FibGVJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkUGVla2FibGVJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRQZWVrYWJsZUl0ZXJhdG9yKHRoaXMuYnVpbGROZXN0ZWRJdGVyYXRvcigpKTsKLQl9Ci0KLQlwcml2YXRlIFBlZWthYmxlSXRlcmF0b3I8T2JqZWN0PiBidWlsZFBlZWthYmxlSXRlcmF0b3JVcGNhc3QoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkUGVla2FibGVJdGVyYXRvclVwY2FzdCh0aGlzLmJ1aWxkTmVzdGVkSXRlcmF0b3IoKSk7Ci0JfQotCi0JcHJpdmF0ZSBQZWVrYWJsZUl0ZXJhdG9yPFN0cmluZz4gYnVpbGRQZWVrYWJsZUl0ZXJhdG9yKEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IpIHsKLQkJcmV0dXJuIG5ldyBQZWVrYWJsZUl0ZXJhdG9yPFN0cmluZz4obmVzdGVkSXRlcmF0b3IpOwotCX0KLQotCXByaXZhdGUgUGVla2FibGVJdGVyYXRvcjxPYmplY3Q+IGJ1aWxkUGVla2FibGVJdGVyYXRvclVwY2FzdChJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZEl0ZXJhdG9yKSB7Ci0JCXJldHVybiBuZXcgUGVla2FibGVJdGVyYXRvcjxPYmplY3Q+KG5lc3RlZEl0ZXJhdG9yKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gYnVpbGROZXN0ZWRJdGVyYXRvcigpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYy5hZGQoInplcm8iKTsKLQkJYy5hZGQoIm9uZSIpOwotCQljLmFkZCgidHdvIik7Ci0JCWMuYWRkKCJ0aHJlZSIpOwotCQljLmFkZCgiZm91ciIpOwotCQljLmFkZCgiZml2ZSIpOwotCQlyZXR1cm4gYy5pdGVyYXRvcigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvUmVhZE9ubHlJdGVyYXRvclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9SZWFkT25seUl0ZXJhdG9yVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRlZmEyZS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9SZWFkT25seUl0ZXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuUmVhZE9ubHlJdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIFJlYWRPbmx5SXRlcmF0b3JUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBSZWFkT25seUl0ZXJhdG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc05leHQoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRSZWFkT25seUl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkVmVjdG9yKCkuc2l6ZSgpLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTmV4dFVwY2FzdCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPE9iamVjdD4gc3RyZWFtID0gdGhpcy5idWlsZFJlYWRPbmx5SXRlcmF0b3JVcGNhc3QoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRWZWN0b3IoKS5zaXplKCksIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0KCkgewotCQlJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZEl0ZXJhdG9yID0gdGhpcy5idWlsZE5lc3RlZEl0ZXJhdG9yKCk7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkUmVhZE9ubHlJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBlbGVtZW50IiwgbmVzdGVkSXRlcmF0b3IubmV4dCgpLCBzdHJlYW0ubmV4dCgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0VXBjYXN0KCkgewotCQlJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZEl0ZXJhdG9yID0gdGhpcy5idWlsZE5lc3RlZEl0ZXJhdG9yKCk7Ci0JCWZvciAoSXRlcmF0b3I8T2JqZWN0PiBzdHJlYW0gPSB0aGlzLmJ1aWxkUmVhZE9ubHlJdGVyYXRvclVwY2FzdCgpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBlbGVtZW50IiwgbmVzdGVkSXRlcmF0b3IubmV4dCgpLCBzdHJlYW0ubmV4dCgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFJlYWRPbmx5SXRlcmF0b3IoKTsKLQkJU3RyaW5nIHN0cmluZyA9IG51bGw7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJpbmcgPSBzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCXRyeSB7Ci0JCQlzdHJpbmcgPSBzdHJlYW0ubmV4dCgpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duOiAiICsgc3RyaW5nLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZSgpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFJlYWRPbmx5SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWlmIChzdHJlYW0ubmV4dCgpLmVxdWFscygidGhyZWUiKSkgewotCQkJCXRyeSB7Ci0JCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkUmVhZE9ubHlJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRSZWFkT25seUl0ZXJhdG9yKHRoaXMuYnVpbGROZXN0ZWRJdGVyYXRvcigpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPE9iamVjdD4gYnVpbGRSZWFkT25seUl0ZXJhdG9yVXBjYXN0KCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFJlYWRPbmx5SXRlcmF0b3JVcGNhc3QodGhpcy5idWlsZE5lc3RlZEl0ZXJhdG9yKCkpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBidWlsZFJlYWRPbmx5SXRlcmF0b3IoSXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRJdGVyYXRvcikgewotCQlyZXR1cm4gbmV3IFJlYWRPbmx5SXRlcmF0b3I8U3RyaW5nPihuZXN0ZWRJdGVyYXRvcik7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxPYmplY3Q+IGJ1aWxkUmVhZE9ubHlJdGVyYXRvclVwY2FzdChJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZEl0ZXJhdG9yKSB7Ci0JCXJldHVybiBuZXcgUmVhZE9ubHlJdGVyYXRvcjxPYmplY3Q+KG5lc3RlZEl0ZXJhdG9yKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gYnVpbGROZXN0ZWRJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRWZWN0b3IoKS5pdGVyYXRvcigpOwotCX0KLQotCXByaXZhdGUgVmVjdG9yPFN0cmluZz4gYnVpbGRWZWN0b3IoKSB7Ci0JCVZlY3RvcjxTdHJpbmc+IHYgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKLQkJdi5hZGRFbGVtZW50KCJvbmUiKTsKLQkJdi5hZGRFbGVtZW50KCJ0d28iKTsKLQkJdi5hZGRFbGVtZW50KCJ0aHJlZSIpOwotCQl2LmFkZEVsZW1lbnQoImZvdXIiKTsKLQkJdi5hZGRFbGVtZW50KCJmaXZlIik7Ci0JCXYuYWRkRWxlbWVudCgic2l4Iik7Ci0JCXYuYWRkRWxlbWVudCgic2V2ZW4iKTsKLQkJdi5hZGRFbGVtZW50KCJlaWdodCIpOwotCQlyZXR1cm4gdjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1JlYWRPbmx5TGlzdEl0ZXJhdG9yVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1JlYWRPbmx5TGlzdEl0ZXJhdG9yVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRiNzJmNi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9SZWFkT25seUxpc3RJdGVyYXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5SZWFkT25seUxpc3RJdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIFJlYWRPbmx5TGlzdEl0ZXJhdG9yVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgUmVhZE9ubHlMaXN0SXRlcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTmV4dEFuZEhhc1ByZXZpb3VzKCkgewotCQlpbnQgaSA9IDA7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRSZWFkT25seUxpc3RJdGVyYXRvcigpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZExpc3QoKS5zaXplKCksIGkpOwotCi0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJc3RyZWFtLnByZXZpb3VzKCk7Ci0JCQlpLS07Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDAsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNOZXh0QW5kSGFzUHJldmlvdXNVcGNhc3QoKSB7Ci0JCWludCBpID0gMDsKLQkJTGlzdEl0ZXJhdG9yPE9iamVjdD4gc3RyZWFtID0gdGhpcy5idWlsZFJlYWRPbmx5TGlzdEl0ZXJhdG9yVXBjYXN0KCk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkTGlzdCgpLnNpemUoKSwgaSk7Ci0KLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlzdHJlYW0ucHJldmlvdXMoKTsKLQkJCWktLTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoMCwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHRBbmRQcmV2aW91cygpIHsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkTGlzdEl0ZXJhdG9yID0gdGhpcy5idWlsZE5lc3RlZExpc3RJdGVyYXRvcigpOwotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkUmVhZE9ubHlMaXN0SXRlcmF0b3IoKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgZWxlbWVudCIsIG5lc3RlZExpc3RJdGVyYXRvci5uZXh0KCksIHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBlbGVtZW50IiwgbmVzdGVkTGlzdEl0ZXJhdG9yLnByZXZpb3VzKCksIHN0cmVhbS5wcmV2aW91cygpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0QW5kUHJldmlvdXNVcGNhc3QoKSB7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZExpc3RJdGVyYXRvciA9IHRoaXMuYnVpbGROZXN0ZWRMaXN0SXRlcmF0b3IoKTsKLQkJTGlzdEl0ZXJhdG9yPE9iamVjdD4gc3RyZWFtID0gdGhpcy5idWlsZFJlYWRPbmx5TGlzdEl0ZXJhdG9yVXBjYXN0KCk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGVsZW1lbnQiLCBuZXN0ZWRMaXN0SXRlcmF0b3IubmV4dCgpLCBzdHJlYW0ubmV4dCgpKTsKLQkJfQotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgZWxlbWVudCIsIG5lc3RlZExpc3RJdGVyYXRvci5wcmV2aW91cygpLCBzdHJlYW0ucHJldmlvdXMoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dEluZGV4QW5kUHJldmlvdXNJbmRleCgpIHsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkTGlzdEl0ZXJhdG9yID0gdGhpcy5idWlsZE5lc3RlZExpc3RJdGVyYXRvcigpOwotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkUmVhZE9ubHlMaXN0SXRlcmF0b3IoKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgaW5kZXgiLCBuZXN0ZWRMaXN0SXRlcmF0b3IubmV4dEluZGV4KCksIHN0cmVhbS5uZXh0SW5kZXgoKSk7Ci0JCQluZXN0ZWRMaXN0SXRlcmF0b3IubmV4dCgpOwotCQkJc3RyZWFtLm5leHQoKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGluZGV4IiwgdGhpcy5idWlsZExpc3QoKS5zaXplKCksIHN0cmVhbS5uZXh0SW5kZXgoKSk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBlbGVtZW50IiwgbmVzdGVkTGlzdEl0ZXJhdG9yLnByZXZpb3VzSW5kZXgoKSwgc3RyZWFtLnByZXZpb3VzSW5kZXgoKSk7Ci0JCQluZXN0ZWRMaXN0SXRlcmF0b3IucHJldmlvdXMoKTsKLQkJCXN0cmVhbS5wcmV2aW91cygpOwotCQl9Ci0JCWFzc2VydEVxdWFscygiYm9ndXMgaW5kZXgiLCAtMSwgc3RyZWFtLnByZXZpb3VzSW5kZXgoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHRJbmRleEFuZFByZXZpb3VzSW5kZXhVcGNhc3QoKSB7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZExpc3RJdGVyYXRvciA9IHRoaXMuYnVpbGROZXN0ZWRMaXN0SXRlcmF0b3IoKTsKLQkJTGlzdEl0ZXJhdG9yPE9iamVjdD4gc3RyZWFtID0gdGhpcy5idWlsZFJlYWRPbmx5TGlzdEl0ZXJhdG9yVXBjYXN0KCk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGluZGV4IiwgbmVzdGVkTGlzdEl0ZXJhdG9yLm5leHRJbmRleCgpLCBzdHJlYW0ubmV4dEluZGV4KCkpOwotCQkJbmVzdGVkTGlzdEl0ZXJhdG9yLm5leHQoKTsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBpbmRleCIsIHRoaXMuYnVpbGRMaXN0KCkuc2l6ZSgpLCBzdHJlYW0ubmV4dEluZGV4KCkpOwotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgZWxlbWVudCIsIG5lc3RlZExpc3RJdGVyYXRvci5wcmV2aW91c0luZGV4KCksIHN0cmVhbS5wcmV2aW91c0luZGV4KCkpOwotCQkJbmVzdGVkTGlzdEl0ZXJhdG9yLnByZXZpb3VzKCk7Ci0JCQlzdHJlYW0ucHJldmlvdXMoKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGluZGV4IiwgLTEsIHN0cmVhbS5wcmV2aW91c0luZGV4KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRSZWFkT25seUxpc3RJdGVyYXRvcigpOwotCQlTdHJpbmcgc3RyaW5nID0gbnVsbDsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmluZyA9IHN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCXN0cmluZyA9IHN0cmVhbS5uZXh0KCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd246ICIgKyBzdHJpbmcsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFJlYWRPbmx5TGlzdEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlpZiAoc3RyZWFtLm5leHQoKS5lcXVhbHMoInRocmVlIikpIHsKLQkJCQl0cnkgewotCQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKCJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXQoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJZm9yIChMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkUmVhZE9ubHlMaXN0SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWlmIChzdHJlYW0ubmV4dCgpLmVxdWFscygidGhyZWUiKSkgewotCQkJCXRyeSB7Ci0JCQkJCXN0cmVhbS5zZXQoImJvZ3VzIik7Ci0JCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKCJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGQoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJZm9yIChMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkUmVhZE9ubHlMaXN0SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWlmIChzdHJlYW0ubmV4dCgpLmVxdWFscygidGhyZWUiKSkgewotCQkJCXRyeSB7Ci0JCQkJCXN0cmVhbS5hZGQoImJvZ3VzIik7Ci0JCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKCJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCXByaXZhdGUgTGlzdEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRSZWFkT25seUxpc3RJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRSZWFkT25seUxpc3RJdGVyYXRvcih0aGlzLmJ1aWxkTmVzdGVkTGlzdEl0ZXJhdG9yKCkpOwotCX0KLQotCXByaXZhdGUgTGlzdEl0ZXJhdG9yPE9iamVjdD4gYnVpbGRSZWFkT25seUxpc3RJdGVyYXRvclVwY2FzdCgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRSZWFkT25seUxpc3RJdGVyYXRvclVwY2FzdCh0aGlzLmJ1aWxkTmVzdGVkTGlzdEl0ZXJhdG9yKCkpOwotCX0KLQotCXByaXZhdGUgTGlzdEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRSZWFkT25seUxpc3RJdGVyYXRvcihMaXN0SXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRMaXN0SXRlcmF0b3IpIHsKLQkJcmV0dXJuIG5ldyBSZWFkT25seUxpc3RJdGVyYXRvcjxTdHJpbmc+KG5lc3RlZExpc3RJdGVyYXRvcik7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0SXRlcmF0b3I8T2JqZWN0PiBidWlsZFJlYWRPbmx5TGlzdEl0ZXJhdG9yVXBjYXN0KExpc3RJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZExpc3RJdGVyYXRvcikgewotCQlyZXR1cm4gbmV3IFJlYWRPbmx5TGlzdEl0ZXJhdG9yPE9iamVjdD4obmVzdGVkTGlzdEl0ZXJhdG9yKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkTmVzdGVkTGlzdEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZExpc3QoKS5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBidWlsZExpc3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWwuYWRkKCJvbmUiKTsKLQkJbC5hZGQoInR3byIpOwotCQlsLmFkZCgidGhyZWUiKTsKLQkJbC5hZGQoImZvdXIiKTsKLQkJbC5hZGQoImZpdmUiKTsKLQkJbC5hZGQoInNpeCIpOwotCQlsLmFkZCgic2V2ZW4iKTsKLQkJbC5hZGQoImVpZ2h0Iik7Ci0JCXJldHVybiBsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvU2luZ2xlRWxlbWVudEl0ZXJhdG9yVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1NpbmdsZUVsZW1lbnRJdGVyYXRvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4NDY1N2MuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvU2luZ2xlRWxlbWVudEl0ZXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuU2luZ2xlRWxlbWVudEl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgU2luZ2xlRWxlbWVudEl0ZXJhdG9yVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgU2luZ2xlRWxlbWVudEl0ZXJhdG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc05leHQoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRTaW5nbGVFbGVtZW50SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDEsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0KCkgewotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFNpbmdsZUVsZW1lbnRJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBlbGVtZW50IiwgdGhpcy5zaW5nbGVFbGVtZW50KCksIHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkU2luZ2xlRWxlbWVudEl0ZXJhdG9yKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSBzdHJlYW0ubmV4dCgpOwotCQl0cnkgewotCQkJc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93bjogIiArIHN0cmluZywgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRTaW5nbGVFbGVtZW50SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWlmIChzdHJlYW0ubmV4dCgpLmVxdWFscyh0aGlzLnNpbmdsZUVsZW1lbnQoKSkpIHsKLQkJCQl0cnkgewotCQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKCJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkU2luZ2xlRWxlbWVudEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IFNpbmdsZUVsZW1lbnRJdGVyYXRvcjxTdHJpbmc+KHRoaXMuc2luZ2xlRWxlbWVudCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHNpbmdsZUVsZW1lbnQoKSB7Ci0JCXJldHVybiAic2luZ2xlIGVsZW1lbnQiOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1NpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3JUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzZTQxOTcuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3JUZXN0cyBleHRlbmRzIFNpbmdsZUVsZW1lbnRJdGVyYXRvclRlc3RzIHsKLQotCXB1YmxpYyBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHRJbmRleCgpIHsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3IoKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgaW5kZXgiLCAwLCBzdHJlYW0ubmV4dEluZGV4KCkpOwotCQkJc3RyZWFtLm5leHQoKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGluZGV4IiwgMSwgc3RyZWFtLm5leHRJbmRleCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzUHJldmlvdXMoKSB7Ci0JCWludCBpID0gMDsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3IoKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDEsIGkpOwotCi0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJc3RyZWFtLnByZXZpb3VzKCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDIsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcmV2aW91cygpIHsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3IoKTsKLQotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBlbGVtZW50IiwgdGhpcy5zaW5nbGVFbGVtZW50KCksIHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0KLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGVsZW1lbnQiLCB0aGlzLnNpbmdsZUVsZW1lbnQoKSwgc3RyZWFtLnByZXZpb3VzKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByZXZpb3VzSW5kZXgoKSB7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRTaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yKCk7Ci0KLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgaW5kZXgiLCAwLCBzdHJlYW0ubmV4dEluZGV4KCkpOwotCQkJc3RyZWFtLm5leHQoKTsKLQkJfQotCi0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBpbmRleCIsIDAsIHN0cmVhbS5wcmV2aW91c0luZGV4KCkpOwotCQkJc3RyZWFtLnByZXZpb3VzKCk7Ci0JCX0KLQotCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGluZGV4IiwgLTEsIHN0cmVhbS5wcmV2aW91c0luZGV4KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGQoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3IoKTsKLQotCQl0cnkgewotCQkJc3RyZWFtLmFkZCgiZm9vIik7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQotCQlhc3NlcnRUcnVlKCJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXQoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJZm9yIChMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuZXF1YWxzKHRoaXMuc2luZ2xlRWxlbWVudCgpKSkgewotCQkJCXRyeSB7Ci0JCQkJCXN0cmVhbS5zZXQoImZvbyIpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSXRlcmF0b3I8U3RyaW5nPiBidWlsZFNpbmdsZUVsZW1lbnRJdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yPFN0cmluZz4odGhpcy5zaW5nbGVFbGVtZW50KCkpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8U3RyaW5nPiBidWlsZFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3IoKSB7Ci0JCXJldHVybiAoTGlzdEl0ZXJhdG9yPFN0cmluZz4pIHRoaXMuYnVpbGRTaW5nbGVFbGVtZW50SXRlcmF0b3IoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1RyYW5zZm9ybWF0aW9uSXRlcmF0b3JUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvVHJhbnNmb3JtYXRpb25JdGVyYXRvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlYzBkMDguLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvVHJhbnNmb3JtYXRpb25JdGVyYXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLlRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgVHJhbnNmb3JtYXRpb25JdGVyYXRvclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIFRyYW5zZm9ybWF0aW9uSXRlcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTmV4dCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoOCwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc05leHRVcGNhc3QoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvclVwY2FzdCgpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoOCwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElubmVySGFzTmV4dCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRJbm5lckl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyg4LCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyB0cmFuc2Zvcm1hdGlvbiIsICsraSwgc3RyZWFtLm5leHQoKS5pbnRWYWx1ZSgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0VXBjYXN0KCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8T2JqZWN0PiBzdHJlYW0gPSB0aGlzLmJ1aWxkSXRlcmF0b3JVcGNhc3QoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgdHJhbnNmb3JtYXRpb24iLCArK2ksICgoSW50ZWdlcikgc3RyZWFtLm5leHQoKSkuaW50VmFsdWUoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5uZXJOZXh0KCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8SW50ZWdlcj4gc3RyZWFtID0gdGhpcy5idWlsZElubmVySXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgdHJhbnNmb3JtYXRpb24iLCArK2ksIHN0cmVhbS5uZXh0KCkuaW50VmFsdWUoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uKCk7Ci0JCWZvciAoSXRlcmF0b3I8SW50ZWdlcj4gc3RyZWFtID0gdGhpcy5idWlsZElubmVyVHJhbnNmb3JtYXRpb25JdGVyYXRvcihjLml0ZXJhdG9yKCkpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuaW50VmFsdWUoKSA9PSAzKSB7Ci0JCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JCWFzc2VydEVxdWFscygibm90aGluZyByZW1vdmVkIiwgdGhpcy5idWlsZENvbGxlY3Rpb24oKS5zaXplKCkgLSAxLCBjLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKCJlbGVtZW50IHN0aWxsIGluIGNvbGxlY3Rpb24iLCBjLmNvbnRhaW5zKCIzMzMiKSk7Ci0JCWFzc2VydFRydWUoIndyb25nIGVsZW1lbnQgcmVtb3ZlZCIsIGMuY29udGFpbnMoIjIyIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbm5lclJlbW92ZSgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSB0aGlzLmJ1aWxkQ29sbGVjdGlvbigpOwotCQlmb3IgKEl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yKGMuaXRlcmF0b3IoKSwgdGhpcy5idWlsZFRyYW5zZm9ybWVyKCkpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuaW50VmFsdWUoKSA9PSAzKSB7Ci0JCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JCWFzc2VydEVxdWFscygibm90aGluZyByZW1vdmVkIiwgdGhpcy5idWlsZENvbGxlY3Rpb24oKS5zaXplKCkgLSAxLCBjLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKCJlbGVtZW50IHN0aWxsIGluIGNvbGxlY3Rpb24iLCBjLmNvbnRhaW5zKCIzMzMiKSk7Ci0JCWFzc2VydFRydWUoIndyb25nIGVsZW1lbnQgcmVtb3ZlZCIsIGMuY29udGFpbnMoIjIyIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCUl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOwotCQlJbnRlZ2VyIGludGVnZXIgPSBudWxsOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJaW50ZWdlciA9IHN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCWludGVnZXIgPSBzdHJlYW0ubmV4dCgpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duOiAiICsgaW50ZWdlciwgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlmb3IgKEl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRVbm1vZGlmaWFibGVJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaW50IGkgPSBzdHJlYW0ubmV4dCgpLmludFZhbHVlKCk7Ci0JCQlpZiAoaSA9PSAzKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLmJ1aWxkSXRlcmF0b3IoKS5yZW1vdmUoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxJbnRlZ2VyPiBidWlsZEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFRyYW5zZm9ybWF0aW9uSXRlcmF0b3IodGhpcy5idWlsZE5lc3RlZEl0ZXJhdG9yKCksIHRoaXMuYnVpbGRUcmFuc2Zvcm1lcigpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPE9iamVjdD4gYnVpbGRJdGVyYXRvclVwY2FzdCgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yVXBjYXN0KHRoaXMuYnVpbGROZXN0ZWRJdGVyYXRvcigpLCB0aGlzLmJ1aWxkVHJhbnNmb3JtZXJVcGNhc3QoKSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxJbnRlZ2VyPiBidWlsZElubmVySXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkSW5uZXJUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yKHRoaXMuYnVpbGROZXN0ZWRJdGVyYXRvcigpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPEludGVnZXI+IGJ1aWxkVW5tb2RpZmlhYmxlSXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVHJhbnNmb3JtYXRpb25JdGVyYXRvcih0aGlzLmJ1aWxkVW5tb2RpZmlhYmxlTmVzdGVkSXRlcmF0b3IoKSwgdGhpcy5idWlsZFRyYW5zZm9ybWVyKCkpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8SW50ZWdlcj4gYnVpbGRUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yKEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IsIFRyYW5zZm9ybWVyPFN0cmluZywgSW50ZWdlcj4gdHJhbnNmb3JtZXIpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPFN0cmluZywgSW50ZWdlcj4obmVzdGVkSXRlcmF0b3IsIHRyYW5zZm9ybWVyKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPE9iamVjdD4gYnVpbGRUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yVXBjYXN0KEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IsIFRyYW5zZm9ybWVyPE9iamVjdCwgSW50ZWdlcj4gdHJhbnNmb3JtZXIpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPE9iamVjdCwgT2JqZWN0PihuZXN0ZWRJdGVyYXRvciwgdHJhbnNmb3JtZXIpOwotCX0KLQotCXByaXZhdGUgVHJhbnNmb3JtZXI8U3RyaW5nLCBJbnRlZ2VyPiBidWlsZFRyYW5zZm9ybWVyKCkgewotCQkvLyB0cmFuc2Zvcm0gZWFjaCBzdHJpbmcgaW50byBhbiBpbnRlZ2VyIHdpdGggYSB2YWx1ZSBvZiB0aGUgc3RyaW5nJ3MgbGVuZ3RoCi0JCXJldHVybiBuZXcgVHJhbnNmb3JtZXI8U3RyaW5nLCBJbnRlZ2VyPigpIHsKLQkJCXB1YmxpYyBJbnRlZ2VyIHRyYW5zZm9ybShTdHJpbmcgbmV4dCkgewotCQkJCXJldHVybiBuZXcgSW50ZWdlcihuZXh0Lmxlbmd0aCgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFRyYW5zZm9ybWVyPE9iamVjdCwgSW50ZWdlcj4gYnVpbGRUcmFuc2Zvcm1lclVwY2FzdCgpIHsKLQkJLy8gdHJhbnNmb3JtIGVhY2ggc3RyaW5nIGludG8gYW4gaW50ZWdlciB3aXRoIGEgdmFsdWUgb2YgdGhlIHN0cmluZydzIGxlbmd0aAotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWVyPE9iamVjdCwgSW50ZWdlcj4oKSB7Ci0JCQlwdWJsaWMgSW50ZWdlciB0cmFuc2Zvcm0oT2JqZWN0IG5leHQpIHsKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIoKChTdHJpbmcpIG5leHQpLmxlbmd0aCgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPEludGVnZXI+IGJ1aWxkSW5uZXJUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yKEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IpIHsKLQkJLy8gdHJhbnNmb3JtIGVhY2ggc3RyaW5nIGludG8gYW4gaW50ZWdlciB3aXRoIGEgdmFsdWUgb2YgdGhlIHN0cmluZydzIGxlbmd0aAotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8U3RyaW5nLCBJbnRlZ2VyPihuZXN0ZWRJdGVyYXRvcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSW50ZWdlciB0cmFuc2Zvcm0oU3RyaW5nIG5leHQpIHsKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIobmV4dC5sZW5ndGgoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkTmVzdGVkSXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkQ29sbGVjdGlvbigpLml0ZXJhdG9yKCk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkVW5tb2RpZmlhYmxlTmVzdGVkSXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVW5tb2RpZmlhYmxlQ29sbGVjdGlvbigpLml0ZXJhdG9yKCk7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gYnVpbGRDb2xsZWN0aW9uKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljLmFkZCgiMSIpOwotCQljLmFkZCgiMjIiKTsKLQkJYy5hZGQoIjMzMyIpOwotCQljLmFkZCgiNDQ0NCIpOwotCQljLmFkZCgiNTU1NTUiKTsKLQkJYy5hZGQoIjY2NjY2NiIpOwotCQljLmFkZCgiNzc3Nzc3NyIpOwotCQljLmFkZCgiODg4ODg4ODgiKTsKLQkJcmV0dXJuIGM7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gYnVpbGRVbm1vZGlmaWFibGVDb2xsZWN0aW9uKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlQ29sbGVjdGlvbih0aGlzLmJ1aWxkQ29sbGVjdGlvbigpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1RyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1RyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI1MDdkNS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9UcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3JUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwdWJsaWMgVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTmV4dEFuZEhhc1ByZXZpb3VzKCkgewotCQlpbnQgaSA9IDA7Ci0JCUxpc3RJdGVyYXRvcjxJbnRlZ2VyPiBzdHJlYW0gPSB0aGlzLmJ1aWxkSXRlcmF0b3IoKTsKLQotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoOCwgaSk7Ci0KLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlzdHJlYW0ucHJldmlvdXMoKTsKLQkJCWktLTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoMCwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc05leHRBbmRIYXNQcmV2aW91c1VwY2FzdCgpIHsKLQkJaW50IGkgPSAwOwotCQlMaXN0SXRlcmF0b3I8T2JqZWN0PiBzdHJlYW0gPSB0aGlzLmJ1aWxkSXRlcmF0b3JVcGNhc3QoKTsKLQotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoOCwgaSk7Ci0KLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlzdHJlYW0ucHJldmlvdXMoKTsKLQkJCWktLTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoMCwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElubmVySGFzTmV4dEFuZEhhc1ByZXZpb3VzKCkgewotCQlpbnQgaSA9IDA7Ci0JCUxpc3RJdGVyYXRvcjxJbnRlZ2VyPiBzdHJlYW0gPSB0aGlzLmJ1aWxkSW5uZXJJdGVyYXRvcigpOwotCi0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyg4LCBpKTsKLQotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCXN0cmVhbS5wcmV2aW91cygpOwotCQkJaS0tOwotCQl9Ci0JCWFzc2VydEVxdWFscygwLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dEFuZFByZXZpb3VzKCkgewotCQlpbnQgaSA9IDA7Ci0JCUxpc3RJdGVyYXRvcjxJbnRlZ2VyPiBzdHJlYW0gPSB0aGlzLmJ1aWxkSXRlcmF0b3IoKTsKLQotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJYXNzZXJ0RXF1YWxzKCsraSwgc3RyZWFtLm5leHQoKS5pbnRWYWx1ZSgpKTsKLQkJfQotCi0JCSsraTsKLQotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCWFzc2VydEVxdWFscygtLWksIHN0cmVhbS5wcmV2aW91cygpLmludFZhbHVlKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElubmVyTmV4dEFuZFByZXZpb3VzKCkgewotCQlpbnQgaSA9IDA7Ci0JCUxpc3RJdGVyYXRvcjxJbnRlZ2VyPiBzdHJlYW0gPSB0aGlzLmJ1aWxkSW5uZXJJdGVyYXRvcigpOwotCi0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoKytpLCBzdHJlYW0ubmV4dCgpLmludFZhbHVlKCkpOwotCQl9Ci0KLQkJKytpOwotCi0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJYXNzZXJ0RXF1YWxzKC0taSwgc3RyZWFtLnByZXZpb3VzKCkuaW50VmFsdWUoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dEluZGV4QW5kUHJldmlvdXNJbmRleCgpIHsKLQkJaW50IGkgPSAtMTsKLQkJTGlzdEl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOwotCi0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoKytpLCBzdHJlYW0ubmV4dEluZGV4KCkpOwotCQkJc3RyZWFtLm5leHQoKTsKLQkJfQotCi0JCSsraTsKLQotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCWFzc2VydEVxdWFscygtLWksIHN0cmVhbS5wcmV2aW91c0luZGV4KCkpOwotCQkJc3RyZWFtLnByZXZpb3VzKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5uZXJOZXh0SW5kZXhBbmRQcmV2aW91c0luZGV4KCkgewotCQlpbnQgaSA9IC0xOwotCQlMaXN0SXRlcmF0b3I8SW50ZWdlcj4gc3RyZWFtID0gdGhpcy5idWlsZElubmVySXRlcmF0b3IoKTsKLQotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJYXNzZXJ0RXF1YWxzKCsraSwgc3RyZWFtLm5leHRJbmRleCgpKTsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCX0KLQotCQkrK2k7Ci0KLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoLS1pLCBzdHJlYW0ucHJldmlvdXNJbmRleCgpKTsKLQkJCXN0cmVhbS5wcmV2aW91cygpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZSgpIHsKLQkJTGlzdDxTdHJpbmc+IGwgPSB0aGlzLmJ1aWxkTGlzdCgpOwotCQlmb3IgKExpc3RJdGVyYXRvcjxJbnRlZ2VyPiBzdHJlYW0gPSB0aGlzLmJ1aWxkSW5uZXJUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcihsLmxpc3RJdGVyYXRvcigpKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWlmIChzdHJlYW0ubmV4dCgpLmludFZhbHVlKCkgPT0gMykgewotCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCQlhc3NlcnRFcXVhbHMoIm5vdGhpbmcgcmVtb3ZlZCIsIHRoaXMuYnVpbGRMaXN0KCkuc2l6ZSgpIC0gMSwgbC5zaXplKCkpOwotCQlhc3NlcnRGYWxzZSgiZWxlbWVudCBzdGlsbCBpbiBsaXN0IiwgbC5jb250YWlucygiMzMzIikpOwotCQlhc3NlcnRUcnVlKCJ3cm9uZyBlbGVtZW50IHJlbW92ZWQiLCBsLmNvbnRhaW5zKCIyMiIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5uZXJSZW1vdmUoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsID0gdGhpcy5idWlsZExpc3QoKTsKLQkJZm9yIChMaXN0SXRlcmF0b3I8SW50ZWdlcj4gc3RyZWFtID0gdGhpcy5idWlsZFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yKGwubGlzdEl0ZXJhdG9yKCksIHRoaXMuYnVpbGRUcmFuc2Zvcm1lcigpKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWlmIChzdHJlYW0ubmV4dCgpLmludFZhbHVlKCkgPT0gMykgewotCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCQlhc3NlcnRFcXVhbHMoIm5vdGhpbmcgcmVtb3ZlZCIsIHRoaXMuYnVpbGRMaXN0KCkuc2l6ZSgpIC0gMSwgbC5zaXplKCkpOwotCQlhc3NlcnRGYWxzZSgiZWxlbWVudCBzdGlsbCBpbiBsaXN0IiwgbC5jb250YWlucygiMzMzIikpOwotCQlhc3NlcnRUcnVlKCJ3cm9uZyBlbGVtZW50IHJlbW92ZWQiLCBsLmNvbnRhaW5zKCIyMiIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb25PbkFkZCgpIHsKLQkJTGlzdEl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlzdHJlYW0uYWRkKG5ldyBJbnRlZ2VyKDApKTsKLQkJCWZhaWwoImV4Y2VwdGlvbiBub3QgdGhyb3duIik7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb25PblNldCgpIHsKLQkJTGlzdEl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlzdHJlYW0uc2V0KG5ldyBJbnRlZ2VyKDApKTsKLQkJCWZhaWwoImV4Y2VwdGlvbiBub3QgdGhyb3duIik7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlMaXN0SXRlcmF0b3I8SW50ZWdlcj4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yKCk7Ci0JCUludGVnZXIgaW50ZWdlciA9IG51bGw7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlpbnRlZ2VyID0gc3RyZWFtLm5leHQoKTsKLQkJfQotCQl0cnkgewotCQkJaW50ZWdlciA9IHN0cmVhbS5uZXh0KCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd246ICIgKyBpbnRlZ2VyLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCWZvciAoSXRlcmF0b3I8SW50ZWdlcj4gc3RyZWFtID0gdGhpcy5idWlsZFVubW9kaWZpYWJsZUl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlpbnQgaSA9IHN0cmVhbS5uZXh0KCkuaW50VmFsdWUoKTsKLQkJCWlmIChpID09IDMpIHsKLQkJCQl0cnkgewotCQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKCJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMuYnVpbGRJdGVyYXRvcigpLnJlbW92ZSgpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwcml2YXRlIExpc3RJdGVyYXRvcjxJbnRlZ2VyPiBidWlsZEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yKHRoaXMuYnVpbGROZXN0ZWRJdGVyYXRvcigpLCB0aGlzLmJ1aWxkVHJhbnNmb3JtZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0SXRlcmF0b3I8T2JqZWN0PiBidWlsZEl0ZXJhdG9yVXBjYXN0KCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yVXBjYXN0KHRoaXMuYnVpbGROZXN0ZWRJdGVyYXRvcigpLCB0aGlzLmJ1aWxkVHJhbnNmb3JtZXJVcGNhc3QoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0SXRlcmF0b3I8SW50ZWdlcj4gYnVpbGRJbm5lckl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZElubmVyVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3IodGhpcy5idWlsZE5lc3RlZEl0ZXJhdG9yKCkpOwotCX0KLQotCXByaXZhdGUgTGlzdEl0ZXJhdG9yPEludGVnZXI+IGJ1aWxkVW5tb2RpZmlhYmxlSXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3IodGhpcy5idWlsZFVubW9kaWZpYWJsZU5lc3RlZEl0ZXJhdG9yKCksIHRoaXMuYnVpbGRUcmFuc2Zvcm1lcigpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RJdGVyYXRvcjxJbnRlZ2VyPiBidWlsZFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yKExpc3RJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZEl0ZXJhdG9yLCBUcmFuc2Zvcm1lcjxTdHJpbmcsIEludGVnZXI+IHRyYW5zZm9ybWVyKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3I8U3RyaW5nLCBJbnRlZ2VyPihuZXN0ZWRJdGVyYXRvciwgdHJhbnNmb3JtZXIpOwotCX0KLQotCXByaXZhdGUgTGlzdEl0ZXJhdG9yPE9iamVjdD4gYnVpbGRUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvclVwY2FzdChMaXN0SXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRJdGVyYXRvciwgVHJhbnNmb3JtZXI8T2JqZWN0LCBJbnRlZ2VyPiB0cmFuc2Zvcm1lcikgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yPE9iamVjdCwgT2JqZWN0PihuZXN0ZWRJdGVyYXRvciwgdHJhbnNmb3JtZXIpOwotCX0KLQotCXByaXZhdGUgVHJhbnNmb3JtZXI8U3RyaW5nLCBJbnRlZ2VyPiBidWlsZFRyYW5zZm9ybWVyKCkgewotCQkvLyB0cmFuc2Zvcm0gZWFjaCBzdHJpbmcgaW50byBhbiBpbnRlZ2VyIHdpdGggYSB2YWx1ZSBvZiB0aGUgc3RyaW5nJ3MgbGVuZ3RoCi0JCXJldHVybiBuZXcgVHJhbnNmb3JtZXI8U3RyaW5nLCBJbnRlZ2VyPigpIHsKLQkJCXB1YmxpYyBJbnRlZ2VyIHRyYW5zZm9ybShTdHJpbmcgbmV4dCkgewotCQkJCXJldHVybiBuZXcgSW50ZWdlcihuZXh0Lmxlbmd0aCgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFRyYW5zZm9ybWVyPE9iamVjdCwgSW50ZWdlcj4gYnVpbGRUcmFuc2Zvcm1lclVwY2FzdCgpIHsKLQkJLy8gdHJhbnNmb3JtIGVhY2ggc3RyaW5nIGludG8gYW4gaW50ZWdlciB3aXRoIGEgdmFsdWUgb2YgdGhlIHN0cmluZydzIGxlbmd0aAotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWVyPE9iamVjdCwgSW50ZWdlcj4oKSB7Ci0JCQlwdWJsaWMgSW50ZWdlciB0cmFuc2Zvcm0oT2JqZWN0IG5leHQpIHsKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIoKChTdHJpbmcpIG5leHQpLmxlbmd0aCgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RJdGVyYXRvcjxJbnRlZ2VyPiBidWlsZElubmVyVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3IoTGlzdEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IpIHsKLQkJLy8gdHJhbnNmb3JtIGVhY2ggc3RyaW5nIGludG8gYW4gaW50ZWdlciB3aXRoIGEgdmFsdWUgb2YgdGhlIHN0cmluZydzIGxlbmd0aAotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yPFN0cmluZywgSW50ZWdlcj4obmVzdGVkSXRlcmF0b3IpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEludGVnZXIgdHJhbnNmb3JtKFN0cmluZyBuZXh0KSB7Ci0JCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKG5leHQubGVuZ3RoKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdEl0ZXJhdG9yPFN0cmluZz4gYnVpbGROZXN0ZWRJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRMaXN0KCkubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0SXRlcmF0b3I8U3RyaW5nPiBidWlsZFVubW9kaWZpYWJsZU5lc3RlZEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFVubW9kaWZpYWJsZUxpc3QoKS5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBidWlsZExpc3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWwuYWRkKCIxIik7Ci0JCWwuYWRkKCIyMiIpOwotCQlsLmFkZCgiMzMzIik7Ci0JCWwuYWRkKCI0NDQ0Iik7Ci0JCWwuYWRkKCI1NTU1NSIpOwotCQlsLmFkZCgiNjY2NjY2Iik7Ci0JCWwuYWRkKCI3Nzc3Nzc3Iik7Ci0JCWwuYWRkKCI4ODg4ODg4OCIpOwotCQlyZXR1cm4gbDsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBidWlsZFVubW9kaWZpYWJsZUxpc3QoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KHRoaXMuYnVpbGRMaXN0KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1RyZWVJdGVyYXRvclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9UcmVlSXRlcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTVkMDgzLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1RyZWVJdGVyYXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLXB1YmxpYyBjbGFzcyBUcmVlSXRlcmF0b3JUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQkvKiogdGhpcyB3aWxsIGJlIHBvcHVsYXRlZCB3aXRoIGFsbCB0aGUgbm9kZXMgY3JlYXRlZCBmb3IgdGhlIHRlc3QgKi8KLQlDb2xsZWN0aW9uPFRyZWVOb2RlPiBub2RlcyA9IG5ldyBBcnJheUxpc3Q8VHJlZU5vZGU+KCk7Ci0KLQlwdWJsaWMgVHJlZUl0ZXJhdG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNOZXh0MSgpIHsKLQkJdGhpcy52ZXJpZnlIYXNOZXh0KHRoaXMuYnVpbGRUcmVlSXRlcmF0b3IxKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNOZXh0MigpIHsKLQkJdGhpcy52ZXJpZnlIYXNOZXh0KHRoaXMuYnVpbGRUcmVlSXRlcmF0b3IyKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNOZXh0KEl0ZXJhdG9yPFRyZWVOb2RlPiBpdGVyYXRvcikgewotCQlpbnQgaSA9IDA7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWl0ZXJhdG9yLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHModGhpcy5ub2Rlcy5zaXplKCksIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0MSgpIHsKLQkJdGhpcy52ZXJpZnlOZXh0KHRoaXMuYnVpbGRUcmVlSXRlcmF0b3IxKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0MigpIHsKLQkJdGhpcy52ZXJpZnlOZXh0KHRoaXMuYnVpbGRUcmVlSXRlcmF0b3IyKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlOZXh0KEl0ZXJhdG9yPFRyZWVOb2RlPiBpdGVyYXRvcikgewotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlhc3NlcnRUcnVlKCJib2d1cyBlbGVtZW50IiwgdGhpcy5ub2Rlcy5jb250YWlucyhpdGVyYXRvci5uZXh0KCkpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hFbGVtZW50RXhjZXB0aW9uMSgpIHsKLQkJdGhpcy52ZXJpZnlOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKHRoaXMuYnVpbGRUcmVlSXRlcmF0b3IxKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hFbGVtZW50RXhjZXB0aW9uMigpIHsKLQkJdGhpcy52ZXJpZnlOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKHRoaXMuYnVpbGRUcmVlSXRlcmF0b3IyKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKEl0ZXJhdG9yPFRyZWVOb2RlPiBpdGVyYXRvcikgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWl0ZXJhdG9yLm5leHQoKTsKLQkJfQotCQl0cnkgewotCQkJaXRlcmF0b3IubmV4dCgpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUxKCkgewotCQl0aGlzLnZlcmlmeVJlbW92ZSh0aGlzLmJ1aWxkVHJlZUl0ZXJhdG9yMSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlMigpIHsKLQkJdGhpcy52ZXJpZnlSZW1vdmUodGhpcy5idWlsZFRyZWVJdGVyYXRvcjIoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVJlbW92ZShJdGVyYXRvcjxUcmVlTm9kZT4gaXRlcmF0b3IpIHsKLQkJU3RyaW5nIHBhcmVudE5hbWUgPSAiY2hpbGQgMiI7Ci0JCVN0cmluZyBjaGlsZE5hbWUgPSAiZ3JhbmRjaGlsZCAyQSI7Ci0JCWludCBzdGFydFNpemUgPSB0aGlzLmNoaWxkcmVuU2l6ZShwYXJlbnROYW1lKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJVHJlZU5vZGUgbm9kZSA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChub2RlLmdldE5hbWUoKS5lcXVhbHMoY2hpbGROYW1lKSkgewotCQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JCWludCBlbmRTaXplID0gdGhpcy5jaGlsZHJlblNpemUocGFyZW50TmFtZSk7Ci0JCWFzc2VydEVxdWFscyhzdGFydFNpemUgLSAxLCBlbmRTaXplKTsKLQl9Ci0KLQlwcml2YXRlIGludCBjaGlsZHJlblNpemUoU3RyaW5nIG5vZGVOYW1lKSB7Ci0JCWZvciAoSXRlcmF0b3I8VHJlZU5vZGU+IHN0cmVhbSA9IHRoaXMubm9kZXMuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCVRyZWVOb2RlIG5vZGUgPSBzdHJlYW0ubmV4dCgpOwotCQkJaWYgKG5vZGUuZ2V0TmFtZSgpLmVxdWFscyhub2RlTmFtZSkpIHsKLQkJCQlyZXR1cm4gbm9kZS5jaGlsZHJlblNpemUoKTsKLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKG5vZGVOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBidWlsZCBhIHRyZWUgaXRlcmF0b3Igd2l0aCBhbiBleHBsaWNpdCBtaWR3aWZlCi0JICovCi0JcHJpdmF0ZSBJdGVyYXRvcjxUcmVlTm9kZT4gYnVpbGRUcmVlSXRlcmF0b3IxKCkgewotCQlyZXR1cm4gbmV3IFRyZWVJdGVyYXRvcjxUcmVlTm9kZT4odGhpcy5idWlsZFRyZWUoKSwgdGhpcy5idWlsZE1pZHdpZmUoKSk7Ci0JfQotCi0JcHJpdmF0ZSBUcmVlSXRlcmF0b3IuTWlkd2lmZTxUcmVlTm9kZT4gYnVpbGRNaWR3aWZlKCkgewotCQlyZXR1cm4gbmV3IFRyZWVJdGVyYXRvci5NaWR3aWZlPFRyZWVOb2RlPigpIHsKLQkJCXB1YmxpYyBJdGVyYXRvcjxUcmVlTm9kZT4gY2hpbGRyZW4oVHJlZU5vZGUgbmV4dCkgewotCQkJCXJldHVybiBuZXh0LmNoaWxkcmVuKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogYnVpbGQgYSB0cmVlIGl0ZXJhdG9yIHdpdGggYW4gb3ZlcnJpZGUKLQkgKi8KLQlwcml2YXRlIEl0ZXJhdG9yPFRyZWVOb2RlPiBidWlsZFRyZWVJdGVyYXRvcjIoKSB7Ci0JCXJldHVybiBuZXcgVHJlZUl0ZXJhdG9yPFRyZWVOb2RlPih0aGlzLmJ1aWxkVHJlZSgpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxUcmVlTm9kZT4gY2hpbGRyZW4oVHJlZU5vZGUgbmV4dCkgewotCQkJCXJldHVybiBuZXh0LmNoaWxkcmVuKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBUcmVlTm9kZSBidWlsZFRyZWUoKSB7Ci0JCVRyZWVOb2RlIHJvb3QgPSBuZXcgVHJlZU5vZGUoInJvb3QiKTsKLQkJVHJlZU5vZGUgY2hpbGQxID0gbmV3IFRyZWVOb2RlKHJvb3QsICJjaGlsZCAxIik7Ci0JCW5ldyBUcmVlTm9kZShjaGlsZDEsICJncmFuZGNoaWxkIDFBIik7Ci0JCVRyZWVOb2RlIGNoaWxkMiA9IG5ldyBUcmVlTm9kZShyb290LCAiY2hpbGQgMiIpOwotCQluZXcgVHJlZU5vZGUoY2hpbGQyLCAiZ3JhbmRjaGlsZCAyQSIpOwotCQlUcmVlTm9kZSBncmFuZGNoaWxkMkIgPSBuZXcgVHJlZU5vZGUoY2hpbGQyLCAiZ3JhbmRjaGlsZCAyQiIpOwotCQluZXcgVHJlZU5vZGUoZ3JhbmRjaGlsZDJCLCAiZ3JlYXQtZ3JhbmRjaGlsZCAyQjEiKTsKLQkJbmV3IFRyZWVOb2RlKGdyYW5kY2hpbGQyQiwgImdyZWF0LWdyYW5kY2hpbGQgMkIyIik7Ci0JCVRyZWVOb2RlIGdyYW5kY2hpbGQyQyA9IG5ldyBUcmVlTm9kZShjaGlsZDIsICJncmFuZGNoaWxkIDJDIik7Ci0JCW5ldyBUcmVlTm9kZShncmFuZGNoaWxkMkMsICJncmVhdC1ncmFuZGNoaWxkIDJDMSIpOwotCQluZXcgVHJlZU5vZGUocm9vdCwgImNoaWxkIDMiKTsKLQkJcmV0dXJuIHJvb3Q7Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBUcmVlTm9kZSB7Ci0JCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCXByaXZhdGUgQ29sbGVjdGlvbjxUcmVlTm9kZT4gY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0PFRyZWVOb2RlPigpOwotCi0JCXB1YmxpYyBUcmVlTm9kZShTdHJpbmcgbmFtZSkgewotCQkJc3VwZXIoKTsKLQkJCVRyZWVJdGVyYXRvclRlc3RzLnRoaXMubm9kZXMuYWRkKHRoaXMpOyAvLyBsb2cgbm9kZQotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJfQotCi0JCXB1YmxpYyBUcmVlTm9kZShUcmVlTm9kZSBwYXJlbnQsIFN0cmluZyBuYW1lKSB7Ci0JCQl0aGlzKG5hbWUpOwotCQkJcGFyZW50LmFkZENoaWxkKHRoaXMpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBhZGRDaGlsZChUcmVlTm9kZSBjaGlsZCkgewotCQkJdGhpcy5jaGlsZHJlbi5hZGQoY2hpbGQpOwotCQl9Ci0KLQkJcHVibGljIEl0ZXJhdG9yPFRyZWVOb2RlPiBjaGlsZHJlbigpIHsKLQkJCXJldHVybiB0aGlzLmNoaWxkcmVuLml0ZXJhdG9yKCk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGNoaWxkcmVuU2l6ZSgpIHsKLQkJCXJldHVybiB0aGlzLmNoaWxkcmVuLnNpemUoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJUcmVlTm9kZSgiICsgdGhpcy5uYW1lICsgIikiOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvdGVzdC54bWwgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMvdGVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1OThkYzYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzL3Rlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08cHJvamVjdCBuYW1lPSJ0ZXN0c3VpdGUiIGRlZmF1bHQ9InJ1biIgYmFzZWRpcj0iLiI+Ci0JPCEtLSBUaGUgcHJvcGVydHkgJHtlY2xpcHNlLWhvbWV9IHNob3VsZCBiZSBwYXNzZWQgaW50byB0aGlzIHNjcmlwdCAtLT4KLQk8IS0tIFNldCBhIG1lYW5pbmdmdWwgZGVmYXVsdCB2YWx1ZSBmb3Igd2hlbiBpdCBpcyBub3QuIC0tPgotCTxlY2hvIG1lc3NhZ2U9ImJhc2VkaXIgJHtiYXNlZGlyfSIgLz4KLQk8ZWNobyBtZXNzYWdlPSJlY2xpcHNlIHBsYWNlICR7ZWNsaXBzZS1ob21lfSIgLz4KLQk8IS0tIHNldHMgdGhlIHByb3BlcnRpZXMgcGx1Z2luLW5hbWUsIGFuZCBsaWJyYXJ5LWZpbGUgLS0+Ci0JPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHMiLz4KLQk8cHJvcGVydHkgbmFtZT0ibGlicmFyeS1maWxlIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L3BsdWdpbnMvb3JnLmVjbGlwc2UudGVzdF8zLjEuMC9saWJyYXJ5LnhtbCIvPgotCi0JPCEtLSBUaGlzIHRhcmdldCBob2xkcyBhbGwgaW5pdGlhbGl6YXRpb24gY29kZSB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgZm9yIC0tPgotCTwhLS0gYWxsIHRlc3RzIHRoYXQgYXJlIHRvIGJlIHJ1bi4gSW5pdGlhbGl6YXRpb24gZm9yIGluZGl2aWR1YWwgdGVzdHMgLS0+Ci0JPCEtLSBzaG91bGQgYmUgZG9uZSB3aXRoaW4gdGhlIGJvZHkgb2YgdGhlIHN1aXRlIHRhcmdldC4gLS0+Ci0JPHRhcmdldCBuYW1lPSJpbml0Ij4KLQkJPHRzdGFtcC8+Ci0JCTxkZWxldGU+Ci0JCQk8ZmlsZXNldCBkaXI9IiR7ZWNsaXBzZS1ob21lfSIgaW5jbHVkZXM9Im9yZyoueG1sIi8+Ci0JCTwvZGVsZXRlPgotCTwvdGFyZ2V0PgotCi0JPCEtLSBUaGlzIHRhcmdldCBkZWZpbmVzIHRoZSB0ZXN0cyB0aGF0IG5lZWQgdG8gYmUgcnVuLiAtLT4KLQk8dGFyZ2V0IG5hbWU9InN1aXRlIj4KLQkJPGFudCB0YXJnZXQ9ImNvcmUtdGVzdCIgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0JCQk8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfSIvPgotCQkJPHByb3BlcnR5IG5hbWU9ImNsYXNzbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLmludGVybmFsLkpwdFV0aWxpdHlUZXN0cyIgLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tcGF0aCIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9wbHVnaW5zLyR7cGx1Z2luLW5hbWV9Ii8+Ci0JCTwvYW50PgotCTwvdGFyZ2V0PgotCi0JPCEtLSBUaGlzIHRhcmdldCBob2xkcyBjb2RlIHRvIGNsZWFudXAgdGhlIHRlc3RpbmcgZW52aXJvbm1lbnQgYWZ0ZXIgLS0+Ci0JPCEtLSBhZnRlciBhbGwgb2YgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4uIFlvdSBjYW4gdXNlIHRoaXMgdGFyZ2V0IHRvIC0tPgotCTwhLS0gZGVsZXRlIHRlbXBvcmFyeSBmaWxlcyB0aGF0IGhhdmUgYmVlbiBjcmVhdGVkLiAtLT4KLQk8dGFyZ2V0IG5hbWU9ImNsZWFudXAiPgotCTwvdGFyZ2V0PgotCi0JPCEtLSBUaGlzIHRhcmdldCBydW5zIHRoZSB0ZXN0IHN1aXRlLiBBbnkgYWN0aW9ucyB0aGF0IG5lZWQgdG8gaGFwcGVuIC0tPgotCTwhLS0gYWZ0ZXIgYWxsIHRoZSB0ZXN0cyBoYXZlIGJlZW4gcnVuIHNob3VsZCBnbyBoZXJlLiAtLT4KLQk8dGFyZ2V0IG5hbWU9InJ1biIgZGVwZW5kcz0iaW5pdCxzdWl0ZSxjbGVhbnVwIj4KLQkJPGFudCB0YXJnZXQ9ImNvbGxlY3QiIGFudGZpbGU9IiR7bGlicmFyeS1maWxlfSIgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgotCQkJPHByb3BlcnR5IG5hbWU9ImluY2x1ZGVzIiB2YWx1ZT0ib3JnKi54bWwiLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJvdXRwdXQtZmlsZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9LnhtbCIvPgotCQk8L2FudD4KLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCg==