ZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2xfdGVzdHMuZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2xfdGVzdHMuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmExMmQ0NS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsX3Rlc3RzLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QueHNsX3Rlc3RzLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsX3Rlc3RzLmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbF90ZXN0cy5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc1MGRmMS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsX3Rlc3RzLmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jU3VuIERlYyAxNiAxNjo1Nzo1NyBFU1QgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsX3Rlc3RzLmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2xfdGVzdHMuZmVhdHVyZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGQ4NTY4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2xfdGVzdHMuZmVhdHVyZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotI0ZyaSBKYW4gMDQgMDk6MDQ6NDMgRVNUIDIwMDgKLWNvbXBpbGVycy5pbmNvbXBhdGlibGUtZW52aXJvbm1lbnQ9MQotY29tcGlsZXJzLnAuYnVpbGQ9MAotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5taXNzaW5nLWJ1bmRsZS1jbGFzc3BhdGgtZW50cmllcz0wCi1jb21waWxlcnMucC5taXNzaW5nLXBhY2thZ2VzPTIKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0wCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTEKLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0wCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTEKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbF90ZXN0cy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsX3Rlc3RzLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRmOTNhOS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsX3Rlc3RzLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsX3Rlc3RzLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2xfdGVzdHMuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2xfdGVzdHMuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbF90ZXN0cy5mZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2xfdGVzdHMuZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbF90ZXN0cy5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+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+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsX3Rlc3RzLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbF90ZXN0cy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NlMzk5OC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueHNsX3Rlc3RzLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9WFNMIFRlc3RzIEZlYXR1cmUgKEluY3ViYXRpbmcpCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249WFNMIFRlc3QgRmVhdHVyZQotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDggRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkKSxcblwKLURhdmlkIENhcnZlciAoU3RhbmRhcmRzIGZvciBUZWNobm9sb2d5IGluIEF1dG9tb3RpdmUgUmV0YWlsKSBhbmQgb3RoZXJzIDIwMDguXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgRG91ZyBTYXRjaHdlbGwgKENoYXNlIFRlY2hub2xvZ3kgTHRkIC0gaHR0cDovL3d3dy5jaGFzZXRlY2hub2xvZ3kuY28udWspXG5cCi0gICAgRGF2aWQgQ2FydmVyIChTdGFuZGFyZHMgZm9yIFRlY2hub2xvZ3kgaW4gQXV0b21vdGl2ZSBSZXRhaWwgLSBodHRwOi8vd3d3LnN0YXJzdGFuZGFyZC5vcmcpXG5cCi0gICAgSmVzcGVyIE1vbGxlciAoTmluZUNvbnN1bHQgLSBodHRwOi8vd3d3Lm5pbmVjb25zdWx0LmRrKVxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotSnVuZSAwNiwgMjAwN1xuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLSAgICAtIENvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbF90ZXN0cy5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbF90ZXN0cy5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGIxOWFmLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2xfdGVzdHMuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54c2xfdGVzdHMuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIxLjAuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvdXBkYXRlcy8iLz4KLSAgICAgIDxkaXNjb3ZlcnkgbGFiZWw9IldlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBVcGRhdGVzIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzIi8+Ci0gICA8L3VybD4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLnRlc3RzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueHNsLnRlc3RzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueHNsLnVpLnRlc3RzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueHNsLmNvcmUudGVzdHMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwueHBhdGguY29yZS50ZXN0cyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbF90ZXN0cy5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54c2xfdGVzdHMuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwM2U2NjUuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhzbF90ZXN0cy5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczYy5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9sb29zZS5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxIVE1MPjxIRUFEPjxUSVRMRT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvVElUTEU+Ci08TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TUVUQSBjb250ZW50PSJNU0hUTUwgNi4wMC4yODAwLjE0NzkiIG5hbWU9R0VORVJBVE9SPjwvSEVBRD4KLTxCT0RZIGxhbmc9RU4tVVMgdkxpbms9cHVycGxlIGxpbms9Ymx1ZT4KLTxIMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L0gyPgotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLTxIMz5Vc2FnZSBPZiBDb250ZW50PC9IMz4KLTxQPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiAKLUFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GIAotVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCAKLUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgCi1CWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgCi1BR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgCi1BUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSAKLU1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvUD4KLTxIMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9IMz4KLTxQPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSAKLUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSAKLVB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyAKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxBIAotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci08UD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAKLSgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgCi1hcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvUD4KLTxQPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSAKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IAotY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgCi1hc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIAotbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLjwvUD4KLTxQPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZCAKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIAotRmVhdHVyZXMuPC9QPgotPFA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgCi1pbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyAKLUZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAotKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgCi1kaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyAKLWxvY2F0aW9uczo8L1A+Ci08VUw+Ci0gIDxMST5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnkgCi0gIDxMST5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllcyAKLSAgPExJPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWlucyAKLSAgPExJPkZlYXR1cmUgZGlyZWN0b3JpZXMgPC9MST48L1VMPgotPFA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIAotdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIAotRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgCi1hbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiAKLWxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiAKLWZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSAKLVVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCAKLWRpcmVjdG9yeS48L1A+Ci08UD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCAKLU9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSAKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9QPgotPFVMPgotICA8TEk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvQT4pCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L0E+KQotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L0E+KQotCi0gIDxMST5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvQT4pCi0gIDxMST5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9BPikgCi0gIAotICA8TEk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvQT4pIDwvTEk+Ci0gIAotICA8bGk+Q29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sIj5odHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpPC9BPgotICA8L0xJPgotPC9VTD4KLTxQPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyAKLXByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCAKLWNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvUD4KLTxIMz5DcnlwdG9ncmFwaHk8L0gzPgotPFA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgCi1yZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IAotZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIAotY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgCi10byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9QPjwvQk9EWT48L0hUTUw+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy50ZXN0cy8uY2xhc3NwYXRoIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcudGVzdHMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzEwMGE2Yi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy50ZXN0cy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJ0ZXN0LWxhdW5jaGluZy1zcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJ4c2wtdGVzdC1yZXNvdXJjZXMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLnRlc3RzLy5wcm9qZWN0IGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcudGVzdHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMDhiOGUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcudGVzdHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy50ZXN0czwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmNzgyNGYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVGh1IEphbiAwMyAyMjoyNDozNyBFU1QgMjAwOAotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmYjljM2EuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jRnJpIEphbiAwNCAwOTowODo0MiBFU1QgMjAwOAotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRkODU2OC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotI0ZyaSBKYW4gMDQgMDk6MDQ6NDMgRVNUIDIwMDgKLWNvbXBpbGVycy5pbmNvbXBhdGlibGUtZW52aXJvbm1lbnQ9MQotY29tcGlsZXJzLnAuYnVpbGQ9MAotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5taXNzaW5nLWJ1bmRsZS1jbGFzc3BhdGgtZW50cmllcz0wCi1jb21waWxlcnMucC5taXNzaW5nLXBhY2thZ2VzPTIKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0wCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTEKLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0wCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTEKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRjMWMyNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy50ZXN0cwotQnVuZGxlLVZlcnNpb246IDEuMC4wLnF1YWxpZmllcgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5qdW5pdDtidW5kbGUtdmVyc2lvbj0iWzMuOC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZGVidWcuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmc7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwyLjAuMCkiCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy50ZXN0cy5BY3RpdmF0b3IKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMAotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLnRlc3RzLAotIG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLnRlc3RzLnRlc3RjYXNlCi0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLnRlc3RzL2Fib3V0Lmh0bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy50ZXN0cy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLnRlc3RzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2MwYmFiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXNvdXJjZS4uID0gdGVzdC1sYXVuY2hpbmctc3JjLyx4c2wtdGVzdC1yZXNvdXJjZXMvCi1vdXRwdXQuLiA9IGJpbi8KLXNyYy5pbmNsdWRlcyA9IHRlc3QtbGF1bmNoaW5nLXNyYy8seHNsLXRlc3QtcmVzb3VyY2VzLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbApkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy50ZXN0cy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJmM2U3NC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy50ZXN0cy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1Byb3BlcnRpZXMgZmlsZSBmb3Igb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcudGVzdHMKLUJ1bmRsZS1OYW1lLjAgPSBYU1QgQ29yZSBUZXN0IFBsdWctaW4gKEluY3ViYXRpbmcpCi1CdW5kbGUtVmVuZG9yLjAgPSBFY2xpcHNlLm9yZwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLnRlc3RzL3Rlc3QtbGF1bmNoaW5nLXNyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy90ZXN0cy9BY3RpdmF0b3IuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLnRlc3RzL3Rlc3QtbGF1bmNoaW5nLXNyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy90ZXN0cy9BY3RpdmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzlhNjcwYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy50ZXN0cy90ZXN0LWxhdW5jaGluZy1zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvdGVzdHMvQWN0aXZhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgR2FyeSBLYXJhc2l1ayAoSUJNIENvcnBvcmF0aW9uKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZXNwZXIgU3RlZW4gTfhsbGVyIC0gYWRhcHRlZCBmb3IgWFNMCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy50ZXN0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2YXRvciBleHRlbmRzIFBsdWdpbiB7Ci0KLQkvKiogb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcudGVzdHMgLSBwbHVnLWluIGlkICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLnRlc3RzIjsKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKLQlwcml2YXRlIHN0YXRpYyBBY3RpdmF0b3IgcGx1Z2luOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBBY3RpdmF0b3IoKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2lucyNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFjdGl2YXRvciBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBoYW5kbGVFeGNlcHRpb24oRXhjZXB0aW9uIGUpewotCQlTdGF0dXMgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBlKTsKLQkJZ2V0TG9nKCkubG9nKHN0YXR1cyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy50ZXN0cy90ZXN0LWxhdW5jaGluZy1zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvdGVzdHMvTGF1bmNoaW5nU3VpdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLnRlc3RzL3Rlc3QtbGF1bmNoaW5nLXNyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy90ZXN0cy9MYXVuY2hpbmdTdWl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2JlMWZhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLnRlc3RzL3Rlc3QtbGF1bmNoaW5nLXNyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy90ZXN0cy9MYXVuY2hpbmdTdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy50ZXN0cy50ZXN0Y2FzZS5YU0xMYXVuY2hpbmdUZXN0czsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogVGhpcyBjbGFzcyBkb2VzIHNwZWNpZmllcyBhbGwgdGhlIGNsYXNzZXMgaW4gdGhpcyBidW5kbGUKLSAqIHRoYXQgcHJvdmlkZSB0ZXN0cy4gSXQgaXMgcHJpbWFyaWx5IGZvciB0aGUgY29udmVuaWVuY2Ugb2YgCi0gKiB0aGUgQWxsVGVzdHNTdWl0ZS4KLSAqICAKLSAqLwotcHVibGljIGNsYXNzIExhdW5jaGluZ1N1aXRlIGV4dGVuZHMgVGVzdFN1aXRlIHsKLQotCXByaXZhdGUgc3RhdGljIENsYXNzW10gY2xhc3NlcyA9IG5ldyBDbGFzc1tde1hTTExhdW5jaGluZ1Rlc3RzLmNsYXNzfTsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdFN1aXRlIHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IExhdW5jaGluZ1N1aXRlKCk7Ci0JfQotCi0JcHVibGljIExhdW5jaGluZ1N1aXRlKCkgewotCQlzdXBlcigiWFNMIExhdW5jaGluZyBUZXN0IFN1aXRlIik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3Nlcy5sZW5ndGg7IGkrKykgewotCQkJYWRkVGVzdChuZXcgVGVzdFN1aXRlKGNsYXNzZXNbaV0sIGNsYXNzZXNbaV0uZ2V0TmFtZSgpKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgTGF1bmNoaW5nU3VpdGUoQ2xhc3MgdGhlQ2xhc3MsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKHRoZUNsYXNzLCBuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgTGF1bmNoaW5nU3VpdGUoQ2xhc3MgdGhlQ2xhc3MpIHsKLQkJc3VwZXIodGhlQ2xhc3MpOwotCX0KLQotCXB1YmxpYyBMYXVuY2hpbmdTdWl0ZShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy50ZXN0cy90ZXN0LWxhdW5jaGluZy1zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvdGVzdHMvTWlzYy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcudGVzdHMvdGVzdC1sYXVuY2hpbmctc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL3Rlc3RzL01pc2MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ3OGM0YS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy50ZXN0cy90ZXN0LWxhdW5jaGluZy1zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvdGVzdHMvTWlzYy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIEdhcnkgS2FyYXNpdWsgKElCTSBDb3Jwb3JhdGlvbikgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVzcGVyIFN0ZWVuIE34bGxlciAtIGFkYXB0ZWQgZm9yIFhTTAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcudGVzdHM7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS50ZXh0LkRhdGVGb3JtYXQ7Ci1pbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci0KLS8qKgotICogU29tZSBtaXNjZWxsYW5lb3VzIGhlbHBlciBtZXRob2RzLiAKLSAqIEBhdXRob3Iga2FyYXNpdWsKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBNaXNjIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBEYXRlRm9ybWF0IF9kZiA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJISDptbTpzcy5TU1NTIik7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgY2xvc2UoSW5wdXRTdHJlYW0gaW4pewotCQlpZiAoaW4gPT0gbnVsbClyZXR1cm47Ci0JCXRyeSB7Ci0JCQlpbi5jbG9zZSgpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKXsKLQkJCS8vIGVhdCBpdAotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGNsb3NlKE91dHB1dFN0cmVhbSBvdXQpIHsKLQkJaWYgKG91dCA9PSBudWxsKXJldHVybjsKLQkJdHJ5IHsKLQkJCW91dC5jbG9zZSgpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKXsKLQkJCS8vIGVhdCBpdAotCQl9CQkKLQl9Ci0JCi0JLyoqCi0JICogV3JpdGUgYSBsaW5lIHRvIHRoZSBjb25zb2xlIGZvciBkZWJ1Z2dpbmcuCi0JICogQHBhcmFtIGxpbmUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFN0cmluZyBsaW5lKXsKLQkJU3lzdGVtLmVyci5wcmludGxuKHRpbWVzdGFtcEl0KGxpbmUpKTsgIAotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0aW1lc3RhbXBJdChTdHJpbmcgbGluZSl7Ci0JCURhdGUgZGF0ZSA9IG5ldyBEYXRlKCk7Ci0JCWxvbmcgdGhyZWFkID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRJZCgpOwotCQlyZXR1cm4gX2RmLmZvcm1hdChkYXRlKSArICIgIiArIHRocmVhZCArICIgIiArIGxpbmU7Ly8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhTdHJpbmdCdWZmZXIgYil7Ci0JCWxvZyhiLnRvU3RyaW5nKCkpOwotCQliLnNldExlbmd0aCgwKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIG5peShTdHJpbmcgbXNnKXsKLQkJaWYgKG1zZyA9PSBudWxsKW1zZyA9ICJTb3JyeSwgdGhpcyBmdW5jdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQgeWV0IjsgLy8kTk9OLU5MUy0xJAotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihtc2cpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLnRlc3RzL3Rlc3QtbGF1bmNoaW5nLXNyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy90ZXN0cy9UZXN0RW52aXJvbm1lbnQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLnRlc3RzL3Rlc3QtbGF1bmNoaW5nLXNyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy90ZXN0cy9UZXN0RW52aXJvbm1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMxMDA4OS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy50ZXN0cy90ZXN0LWxhdW5jaGluZy1zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvdGVzdHMvVGVzdEVudmlyb25tZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIEdhcnkgS2FyYXNpdWsgKElCTSBDb3Jwb3JhdGlvbikgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVzcGVyIFN0ZWVuIE34bGxlciAtIGFkYXB0ZWQgZm9yIFhTTAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLnRlc3RzOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLkluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0RW52aXJvbm1lbnQgewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IHRydWU7Ci0JCi0JcHJpdmF0ZSBJV29ya3NwYWNlCV93b3Jrc3BhY2U7Ci0JcHJpdmF0ZSBIYXNoTWFwPFN0cmluZywgSVByb2plY3Q+IF9wcm9qZWN0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgSVByb2plY3Q+KDIwKTsKLQkKLQlwdWJsaWMgVGVzdEVudmlyb25tZW50KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlfd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQlpZiAoREVCVUcpewotCQkJX3dvcmtzcGFjZS5nZXRSb290KCkuZGVsZXRlKHRydWUsIHRydWUsIG51bGwpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBJUGF0aCBhZGRGb2xkZXIoSVBhdGggcm9vdCwgU3RyaW5nIGZvbGRlck5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVBhdGggcGF0aCA9IHJvb3QuYXBwZW5kKGZvbGRlck5hbWUpOwotCQljcmVhdGVGb2xkZXIocGF0aCk7Ci0JCXJldHVybiBwYXRoOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbmNyZW1lbnRhbEJ1aWxkKCkgdGhyb3dzIENvcmVFeGNlcHRpb257Ci0JCWdldFdvcmtzcGFjZSgpLmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuSU5DUkVNRU5UQUxfQlVJTEQsIG51bGwpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBmdWxsQnVpbGQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbnsKLQkJZ2V0V29ya3NwYWNlKCkuYnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5GVUxMX0JVSUxELCBudWxsKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgd2FpdEZvckJ1aWxkKCl7Ci0JCWJvb2xlYW4gd2FzSW50ZXJydXB0ZWQgPSBmYWxzZTsKLQkJZG8gewotCQkJdHJ5IHsKLQkJCQlKb2IuZ2V0Sm9iTWFuYWdlcigpLmpvaW4oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9NQU5VQUxfQlVJTEQsIG51bGwpOwotCQkJCXdhc0ludGVycnVwdGVkID0gZmFsc2U7Ci0JCQl9Ci0JCQljYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSl7Ci0JCQkJd2FzSW50ZXJydXB0ZWQgPSB0cnVlOwotCQkJfQotCQl9IHdoaWxlKHdhc0ludGVycnVwdGVkKTsKLQl9Ci0KLQlwcml2YXRlIElGb2xkZXIgY3JlYXRlRm9sZGVyKElQYXRoIHBhdGgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKHBhdGguc2VnbWVudENvdW50KCkgPD0gMSlyZXR1cm4gbnVsbDsKLQkJCi0JCUlGb2xkZXIgZm9sZGVyID0gX3dvcmtzcGFjZS5nZXRSb290KCkuZ2V0Rm9sZGVyKHBhdGgpOwotCQlpZiAoIWZvbGRlci5leGlzdHMoKSl7Ci0JCQlmb2xkZXIuY3JlYXRlKHRydWUsIHRydWUsIG51bGwpOwotCQl9Ci0JCXJldHVybiBmb2xkZXI7Ci0JfQotCi0JcHVibGljIElQcm9qZWN0IGNyZWF0ZVByb2plY3QoU3RyaW5nIG5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJZmluYWwgSVByb2plY3QgcHJvamVjdCA9IF93b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldFByb2plY3QobmFtZSk7Ci0JCUlXb3Jrc3BhY2VSdW5uYWJsZSBjcmVhdGUgPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotCi0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJcHJvamVjdC5jcmVhdGUobW9uaXRvcik7Ci0JCQkJcHJvamVjdC5vcGVuKG1vbml0b3IpOwkKLQkJCX0JCQotCQl9OwotCQkKLQkJX3dvcmtzcGFjZS5ydW4oY3JlYXRlLCBudWxsKTsKLQkJX3Byb2plY3RzLnB1dChuYW1lLCBwcm9qZWN0KTsKLQkJCi0JCXJldHVybiBwcm9qZWN0OwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChERUJVRylyZXR1cm47Ci0JCWZvciAoSXRlcmF0b3I8SVByb2plY3Q+IGl0PV9wcm9qZWN0cy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KXsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBpdC5uZXh0KCk7Ci0JCQlwcm9qZWN0LmRlbGV0ZSh0cnVlLCBudWxsKTsKLQkJfQotCX0KLQotCXB1YmxpYyBJUGF0aCBhZGRGaWxlKElQYXRoIGZvbGRlciwgU3RyaW5nIGZpbGVOYW1lLCBTdHJpbmcgY29udGVudHMpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLQkJSVBhdGggZmlsZVBhdGggPSBmb2xkZXIuYXBwZW5kKGZpbGVOYW1lKTsKLQkJY3JlYXRlRmlsZShmaWxlUGF0aCwgY29udGVudHMuZ2V0Qnl0ZXMoIlVURjgiKSk7Ci0JCXJldHVybiBmaWxlUGF0aDsKLQl9Ci0JCi0JcHVibGljIElQYXRoIGFkZEZpbGVGcm9tUmVzb3VyY2UoSVBhdGggZm9sZGVyLCBTdHJpbmcgZmlsZU5hbWUsIFN0cmluZyBwYXRoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlQYXRoIGZpbGVQYXRoID0gZm9sZGVyLmFwcGVuZChmaWxlTmFtZSk7Ci0JCWNyZWF0ZUZpbGVGcm9tUmVzb3VyY2UoZmlsZVBhdGgsIHBhdGgpOwotCQlyZXR1cm4gZmlsZVBhdGg7Ci0JfQotCQotCXByaXZhdGUgSUZpbGUgY3JlYXRlRmlsZShJUGF0aCBmaWxlUGF0aCwgYnl0ZVtdIGNvbnRlbnRzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlGaWxlIGZpbGUgPSBfd29ya3NwYWNlLmdldFJvb3QoKS5nZXRGaWxlKGZpbGVQYXRoKTsKLQkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oY29udGVudHMpOwotCQlpZiAoZmlsZS5leGlzdHMoKSlmaWxlLnNldENvbnRlbnRzKGluLCB0cnVlLCBmYWxzZSwgbnVsbCk7Ci0JCWVsc2UgZmlsZS5jcmVhdGUoaW4sIHRydWUsIG51bGwpOwotCQlyZXR1cm4gZmlsZTsKLQl9Ci0KLQlwcml2YXRlIElGaWxlIGNyZWF0ZUZpbGVGcm9tUmVzb3VyY2UoSVBhdGggZmlsZVBhdGgsIFN0cmluZyBwYXRoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlGaWxlIGZpbGUgPSBfd29ya3NwYWNlLmdldFJvb3QoKS5nZXRGaWxlKGZpbGVQYXRoKTsKLQkJSW5wdXRTdHJlYW0gaW4gPSBUZXN0RW52aXJvbm1lbnQuY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbShwYXRoKTsKLQkJaWYgKGZpbGUuZXhpc3RzKCkpZmlsZS5zZXRDb250ZW50cyhpbiwgdHJ1ZSwgZmFsc2UsIG51bGwpOwotCQllbHNlIGZpbGUuY3JlYXRlKGluLCB0cnVlLCBudWxsKTsKLQkJcmV0dXJuIGZpbGU7Ci0JfQotCXB1YmxpYyBJV29ya3NwYWNlIGdldFdvcmtzcGFjZSgpewotCQlyZXR1cm4gX3dvcmtzcGFjZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLnRlc3RzL3Rlc3QtbGF1bmNoaW5nLXNyYy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy90ZXN0cy90ZXN0Y2FzZS9YU0xMYXVuY2hpbmdUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcudGVzdHMvdGVzdC1sYXVuY2hpbmctc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL3Rlc3RzL3Rlc3RjYXNlL1hTTExhdW5jaGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljYTVjMmYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcudGVzdHMvdGVzdC1sYXVuY2hpbmctc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL3Rlc3RzL3Rlc3RjYXNlL1hTTExhdW5jaGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBKZXNwZXIgU3RlZW4gTfhsbGVyCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBKZXNwZXIgU3RlZW4gTfhsbGVyIC0gaW5pdGlhbCBYU0wgbGF1bmNoaW5nIHRlc3QKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLnRlc3RzLnRlc3RjYXNlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcudGVzdHMuVGVzdEVudmlyb25tZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIFhTTExhdW5jaGluZ1Rlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCQotCXByaXZhdGUgVGVzdEVudmlyb25tZW50IF9lbnY7Ci0JcHJpdmF0ZSBJUHJvamVjdAkJX3Rlc3RQcm9qZWN0OwotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJX2VudiA9IG5ldyBUZXN0RW52aXJvbm1lbnQoKTsKLQkJX3Rlc3RQcm9qZWN0ID0gX2Vudi5jcmVhdGVQcm9qZWN0KCJYU0xUZXN0UHJvamVjdCIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCdWlsZENvbmZpZygpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCUlQYXRoIGZvbGRlciA9IF90ZXN0UHJvamVjdC5nZXRGdWxsUGF0aCgpOwotCQlfZW52LmFkZEZpbGVGcm9tUmVzb3VyY2UoZm9sZGVyLCAiaW5wdXQueG1sIiwgIjEtaW5wdXQueG1sIik7Ci0JCV9lbnYuYWRkRmlsZUZyb21SZXNvdXJjZShmb2xkZXIsICJ0cmFuc2Zvcm0ueHNsIiwgIjEtdHJhbnNmb3JtLnhzbCIpOwotLy8KLS8vCQlTdHJpbmcgbGF1bmNoWG1sID0gIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCIgc3RhbmRhbG9uZT1cIm5vXCI/PlxyXG4iICsgCi0vLwkJCQkiPGxhdW5jaENvbmZpZ3VyYXRpb24gdHlwZT1cIm9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLmxhdW5jaENvbmZpZ3VyYXRpb25UeXBlXCI+XHJcbiIgKyAKLS8vCQkJCSI8c3RyaW5nQXR0cmlidXRlIGtleT1cIm9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLkFUVFJfSU5QVVRfRklMRVwiIHZhbHVlPVwiJHt3b3Jrc3BhY2VfbG9jOi9YU0xUZXN0UHJvamVjdC9pbnB1dC54bWx9XCIvPlxyXG4iICsgCi0vLwkJCQkiPGJvb2xlYW5BdHRyaWJ1dGUga2V5PVwib3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuQVRUUl9PUEVOX0ZJTEVcIiB2YWx1ZT1cImZhbHNlXCIvPlxyXG4iICsgCi0vLwkJCQkiPHN0cmluZ0F0dHJpYnV0ZSBrZXk9XCJvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5BVFRSX09VVFBVVF9GSUxFXCIgdmFsdWU9XCIke3dvcmtzcGFjZV9sb2M6L1hTTFRlc3RQcm9qZWN0fS9vdXRwdXQueG1sXCIvPlxyXG4iICsgCi0vLwkJCQkiPHN0cmluZ0F0dHJpYnV0ZSBrZXk9XCJvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5BVFRSX09VVFBVVF9QUk9QRVJUSUVTXCIgdmFsdWU9XCImbHQ7P3htbCB2ZXJzaW9uPSZxdW90OzEuMCZxdW90OyBlbmNvZGluZz0mcXVvdDtVVEYtOCZxdW90OyBzdGFuZGFsb25lPSZxdW90O25vJnF1b3Q7PyZndDsmIzEzOyYjMTA7Jmx0O1Byb3BlcnRpZXMmZ3Q7JiMxMzsmIzEwOyZsdDtQcm9wZXJ0eSBuYW1lPSZxdW90O2luZGVudCZxdW90OyB2YWx1ZT0mcXVvdDt5ZXMmcXVvdDsvJmd0OyYjMTM7JiMxMDsmbHQ7L1Byb3BlcnRpZXMmZ3Q7JiMxMzsmIzEwO1wiLz5cclxuIiArIAotLy8JCQkJIjxzdHJpbmdBdHRyaWJ1dGUga2V5PVwib3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuQVRUUl9QSVBFTElORVwiIHZhbHVlPVwiJmx0Oz94bWwgdmVyc2lvbj0mcXVvdDsxLjAmcXVvdDsgZW5jb2Rpbmc9JnF1b3Q7VVRGLTgmcXVvdDsgc3RhbmRhbG9uZT0mcXVvdDtubyZxdW90Oz8mZ3Q7JiMxMzsmIzEwOyZsdDtQaXBlbGluZSZndDsmIzEzOyYjMTA7Jmx0O091dHB1dFByb3BlcnRpZXMvJmd0OyYjMTM7JiMxMDsmbHQ7VHJhbnNmb3JtIHBhdGg9JnF1b3Q7L1hTTFRlc3RQcm9qZWN0L3RyYW5zZm9ybS54c2wmcXVvdDsgcGF0aFR5cGU9JnF1b3Q7cmVzb3VyY2UmcXVvdDsgdXJpUmVzb2x2ZXI9JnF1b3Q7JnF1b3Q7Jmd0OyYjMTM7JiMxMDsmbHQ7UGFyYW1ldGVycy8mZ3Q7JiMxMzsmIzEwOyZsdDsvVHJhbnNmb3JtJmd0OyYjMTM7JiMxMDsmbHQ7L1BpcGVsaW5lJmd0OyYjMTM7JiMxMDtcIi8+XHJcbiIgKyAKLS8vCQkJCSI8c3RyaW5nQXR0cmlidXRlIGtleT1cIm9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLkFUVFJfUFJPQ0VTU09SXCIgdmFsdWU9XCJvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5qcmUuZGVmYXVsdFwiLz5cclxuIiArIAotLy8JCQkJIjxib29sZWFuQXR0cmlidXRlIGtleT1cIm9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLkFUVFJfVVNFX0RFRkFVTFRfT1VUUFVUX0ZJTEVcIiB2YWx1ZT1cImZhbHNlXCIvPlxyXG4iICsgCi0vLwkJCQkiPGJvb2xlYW5BdHRyaWJ1dGUga2V5PVwib3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuQVRUUl9VU0VfREVGQVVMVF9QUk9DRVNTT1JcIiB2YWx1ZT1cImZhbHNlXCIvPlxyXG4iICsgCi0vLwkJCQkiPGJvb2xlYW5BdHRyaWJ1dGUga2V5PVwib3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuQVRUUl9VU0VfRkVBVFVSRVNfRlJPTV9QUkVGRVJFTkNFU1wiIHZhbHVlPVwidHJ1ZVwiLz5cclxuIiArIAotLy8JCQkJIjxib29sZWFuQXR0cmlidXRlIGtleT1cIm9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLkFUVFJfVVNFX1BST1BFUlRJRVNfRlJPTV9QUkVGRVJFTkNFU1wiIHZhbHVlPVwidHJ1ZVwiLz5cclxuIiArIAotLy8JCQkJIjxzdHJpbmdBdHRyaWJ1dGUga2V5PVwib3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuSU5WT0tFUl9ERVNDUklQVE9SXCIgdmFsdWU9XCJvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5qYXhwLmludm9rZVwiLz5cclxuIiArIAotLy8JCQkJIjwvbGF1bmNoQ29uZmlndXJhdGlvbj4iOwotCQkKLQkJU3RyaW5nIGxhdW5jaFhtbCA9ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiIHN0YW5kYWxvbmU9XCJub1wiPz4iICsKLQkJIjxsYXVuY2hDb25maWd1cmF0aW9uIHR5cGU9XCJvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5sYXVuY2hDb25maWd1cmF0aW9uVHlwZVwiPiIgKwotCQkiPHN0cmluZ0F0dHJpYnV0ZSBrZXk9XCJvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLkFUVFJfQVRUUklCVVRFU1wiIHZhbHVlPVwiJmx0Oz94bWwgdmVyc2lvbj0mcXVvdDsxLjAmcXVvdDsgZW5jb2Rpbmc9JnF1b3Q7VVRGLTgmcXVvdDsgc3RhbmRhbG9uZT0mcXVvdDtubyZxdW90Oz8mZ3Q7JiMxMzsmIzEwOyZsdDtBdHRyaWJ1dGVzLyZndDsmIzEzOyYjMTA7XCIvPiIgKwotCQkiPHN0cmluZ0F0dHJpYnV0ZSBrZXk9XCJvcmcuZWNsaXBzZS53c3QueHNsLmpheHAubGF1bmNoaW5nLkFUVFJfT1VUUFVUX1BST1BFUlRJRVNcIiB2YWx1ZT1cIiZsdDs/eG1sIHZlcnNpb249JnF1b3Q7MS4wJnF1b3Q7IGVuY29kaW5nPSZxdW90O1VURi04JnF1b3Q7IHN0YW5kYWxvbmU9JnF1b3Q7bm8mcXVvdDs/Jmd0OyYjMTM7JiMxMDsmbHQ7UHJvcGVydGllcy8mZ3Q7JiMxMzsmIzEwO1wiLz4iICsKLQkJIjxib29sZWFuQXR0cmlidXRlIGtleT1cIm9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuQVRUUl9VU0VfREVGQVVMVF9QUk9DRVNTT1JcIiB2YWx1ZT1cInRydWVcIi8+IiArCi0JCSI8c3RyaW5nQXR0cmlidXRlIGtleT1cIm9yZy5lY2xpcHNlLndzdC54c2wuamF4cC5sYXVuY2hpbmcuSU5WT0tFUl9ERVNDUklQVE9SXCIgdmFsdWU9XCJvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5qYXhwLmludm9rZVwiLz4iICsKLQkJIjxib29sZWFuQXR0cmlidXRlIGtleT1cIm9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLkFUVFJfRk9STUFUX0ZJTEVcIiB2YWx1ZT1cImZhbHNlXCIvPiIgKwotCQkiPHN0cmluZ0F0dHJpYnV0ZSBrZXk9XCJvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5BVFRSX0lOUFVUX0ZJTEVcIiB2YWx1ZT1cIiR7d29ya3NwYWNlX2xvYzovWFNMVGVzdFByb2plY3QvaW5wdXQueG1sfVwiLz4iICsKLQkJIjxib29sZWFuQXR0cmlidXRlIGtleT1cIm9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLkFUVFJfT1BFTl9GSUxFXCIgdmFsdWU9XCJ0cnVlXCIvPiIgKwotCQkiPHN0cmluZ0F0dHJpYnV0ZSBrZXk9XCJvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5BVFRSX09VVFBVVF9GSUxFTkFNRVwiIHZhbHVlPVwib3V0cHV0LnhtbFwiLz4iICsKLQkJIjxzdHJpbmdBdHRyaWJ1dGUga2V5PVwib3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcuQVRUUl9QSVBFTElORVwiIHZhbHVlPVwiJmx0Oz94bWwgdmVyc2lvbj0mcXVvdDsxLjAmcXVvdDsgZW5jb2Rpbmc9JnF1b3Q7VVRGLTgmcXVvdDsgc3RhbmRhbG9uZT0mcXVvdDtubyZxdW90Oz8mZ3Q7JiMxMzsmIzEwOyZsdDtQaXBlbGluZSZndDsmIzEzOyYjMTA7Jmx0O091dHB1dFByb3BlcnRpZXMvJmd0OyYjMTM7JiMxMDsmbHQ7VHJhbnNmb3JtIHBhdGg9JnF1b3Q7L1hTTFRlc3RQcm9qZWN0L3RyYW5zZm9ybS54c2wmcXVvdDsgcGF0aFR5cGU9JnF1b3Q7cmVzb3VyY2UmcXVvdDsmZ3Q7JiMxMzsmIzEwOyZsdDtQYXJhbWV0ZXJzLyZndDsmIzEzOyYjMTA7Jmx0Oy9UcmFuc2Zvcm0mZ3Q7JiMxMzsmIzEwOyZsdDsvUGlwZWxpbmUmZ3Q7JiMxMzsmIzEwO1wiLz4iICsKLQkJIjxib29sZWFuQXR0cmlidXRlIGtleT1cIm9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLkFUVFJfVVNFX0RFRkFVTFRfT1VUUFVUX0ZJTEVcIiB2YWx1ZT1cImZhbHNlXCIvPiIgKwotCQkiPHN0cmluZ0F0dHJpYnV0ZSBrZXk9XCJvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy5BVFRSX09VVFBVVF9GT0xERVJcIiB2YWx1ZT1cIiR7d29ya3NwYWNlX2xvYzovWFNMVGVzdFByb2plY3R9XCIvPiIgKwotCQkiPC9sYXVuY2hDb25maWd1cmF0aW9uPiI7Ci0KLQkJCi0JCVN0cmluZyBuYW1lID0gImxhdW5jaCIgKyAoaW50KShNYXRoLnJhbmRvbSgpKjEwMDApOwotCQlfZW52LmFkZEZpbGUoZm9sZGVyLCBuYW1lICsgIi5sYXVuY2giLCBsYXVuY2hYbWwpOwotCQkKLQkJSUxhdW5jaE1hbmFnZXIgbWdyID0gRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExhdW5jaE1hbmFnZXIoKTsgIAotCQlJTGF1bmNoQ29uZmlndXJhdGlvbltdIGFsbENvbmZpZ3MgPSBtZ3IuZ2V0TGF1bmNoQ29uZmlndXJhdGlvbnMoKTsKLQkJSUxhdW5jaENvbmZpZ3VyYXRpb24gbWluZSA9IG51bGw7Ci0JCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJZm9yIChJTGF1bmNoQ29uZmlndXJhdGlvbiBsYyA6IGFsbENvbmZpZ3MpIHsKLQkJCWlmIChsYy5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJZm91bmQgPSB0cnVlOwotCQkJCW1pbmUgPSBsYzsKLQkJCQlhc3NlcnRFcXVhbHMoImJhZCBsYXVuY2ggY29uZmlnIHR5cGU/IiwgIm9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLmxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIiwgbGMuZ2V0VHlwZSgpLmdldElkZW50aWZpZXIoKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJiYWQgbGF1bmNoIGNvbmZpZyBwbHVnaW4/IiwgIm9yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nIiwgbGMuZ2V0VHlwZSgpLmdldFBsdWdpbklkZW50aWZpZXIoKSk7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiZXhwZWN0ZWQgdG8gZmluZCB0aGUgbGF1bmNoIGNvbmZpZyB3ZSBqdXN0IGFkZGVkIiwgZm91bmQpOwotCi0JCUlMYXVuY2ggbGF1bmNoID0gbWluZS5sYXVuY2goSUxhdW5jaE1hbmFnZXIuUlVOX01PREUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDIwMCAmJiAhIGxhdW5jaC5pc1Rlcm1pbmF0ZWQoKTsgKytpKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIndhaXRpbmciKTsKLQkJCVRocmVhZC5zbGVlcCgxMDApOwotCQl9Ci0JCWFzc2VydFRydWUoIkxhdW5jaCBkaWQgbm90IGNvbXBsZXRlIHdpdGhpbiBhIDIwIHNlY29uZCB0aW1lIHBlcmlvZCIsIGxhdW5jaC5pc1Rlcm1pbmF0ZWQoKSk7Ci0KLQkJX3Rlc3RQcm9qZWN0LnJlZnJlc2hMb2NhbCgyLCBudWxsKTsKLQkJSUZpbGUgb3V0cHV0ID0gX3Rlc3RQcm9qZWN0LmdldEZpbGUoIm91dHB1dC54bWwiKTsKLQkJRG9jdW1lbnQgZG9jID0gcGFyc2VYbWwob3V0cHV0LmdldENvbnRlbnRzKHRydWUpKTsKLQkJCi0JCWFzc2VydEVxdWFscygicm9vdC1vdXQiLCBkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCkuZ2V0Tm9kZU5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3ROb3RoaW5nKCkgewkKLQl9Ci0JCi0Jc3RhdGljIHByaXZhdGUgRG9jdW1lbnQgcGFyc2VYbWwoSW5wdXRTdHJlYW0gY29udGVudHMpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBidWlsZGVyRmFjdG9yeSA9Ci0JCQkgIERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQkJCURvY3VtZW50QnVpbGRlciBidWlsZGVyID0KLQkJCSAgYnVpbGRlckZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0JCQkKLQkJCXJldHVybiBidWlsZGVyLnBhcnNlKGNvbnRlbnRzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlfZW52LmRpc3Bvc2UoKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy50ZXN0cy94c2wtdGVzdC1yZXNvdXJjZXMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvdGVzdHMvMS1pbnB1dC54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy50ZXN0cy94c2wtdGVzdC1yZXNvdXJjZXMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvdGVzdHMvMS1pbnB1dC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3NTdkZGUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LnhzbC5sYXVuY2hpbmcudGVzdHMveHNsLXRlc3QtcmVzb3VyY2VzL29yZy9lY2xpcHNlL3dzdC94c2wvbGF1bmNoaW5nL3Rlc3RzLzEtaW5wdXQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHJvb3Q+Ci0JPGVsZW1lbnQgYXR0cmlidXRlPSJ5ZXMiLz4KLTwvcm9vdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLnRlc3RzL3hzbC10ZXN0LXJlc291cmNlcy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy90ZXN0cy8xLXRyYW5zZm9ybS54c2wgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy50ZXN0cy94c2wtdGVzdC1yZXNvdXJjZXMvb3JnL2VjbGlwc2Uvd3N0L3hzbC9sYXVuY2hpbmcvdGVzdHMvMS10cmFuc2Zvcm0ueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmFmNDhjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC54c2wubGF1bmNoaW5nLnRlc3RzL3hzbC10ZXN0LXJlc291cmNlcy9vcmcvZWNsaXBzZS93c3QveHNsL2xhdW5jaGluZy90ZXN0cy8xLXRyYW5zZm9ybS54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIiB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSI+Ci0JPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9yb290Ij4KLQkJPHJvb3Qtb3V0Lz4KLQk8L3hzbDp0ZW1wbGF0ZT4KLTwveHNsOnN0eWxlc2hlZXQ+Ci0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC54c2wudGVzdHMvLmNsYXNzcGF0aCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC54c2wudGVzdHMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U3MzkzMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QueHNsLnRlc3RzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjQiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LnhzbC50ZXN0cy8ucHJvamVjdCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC54c2wudGVzdHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyOTNhM2QuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LnhzbC50ZXN0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC54c2wudGVzdHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LnhzbC50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QueHNsLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU1MmYwMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QueHNsLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI1RodSBKYW4gMTAgMDk6MjA6NTQgRVNUIDIwMDgKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC54c2wudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QueHNsLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWQ5MWI4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC54c2wudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUuMAotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LnhzbC50ZXN0cztzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjAKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNAotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmp1bml0O2J1bmRsZS12ZXJzaW9uPSJbMy44LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy50ZXN0cztidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhzbC51aS50ZXN0cztidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlLnRlc3RzO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnhwYXRoLmNvcmUudGVzdHM7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwyLjAuMCkiCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LnhzbC50ZXN0cwotQnVuZGxlLUNsYXNzUGF0aDogLgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC54c2wudGVzdHMvYWJvdXQuaHRtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC54c2wudGVzdHMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QueHNsLnRlc3RzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC54c2wudGVzdHMvYnVpbGQucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC54c2wudGVzdHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRmOTBkOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QueHNsLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgdGVzdC54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotc291cmNlLi4gPSBzcmMvCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QueHNsLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LnhzbC50ZXN0cy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTcwYzVkMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QueHNsLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotI1Byb3BlcnRpZXMgZmlsZSBmb3Igb3JnLmVjbGlwc2Uud3N0LnhzbC50ZXN0cwotQnVuZGxlLU5hbWUuMCA9IFRlc3RzIFBsdWctaW4KLUJ1bmRsZS1WZW5kb3IuMCA9IEVjbGlwc2Uub3JnClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LnhzbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC90ZXN0cy9BbGxUZXN0c1N1aXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QueHNsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3Rlc3RzL0FsbFRlc3RzU3VpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkyN2E2My4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QueHNsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3Rlc3RzL0FsbFRlc3RzU3VpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwueHBhdGguY29yZS50ZXN0cy5YUGF0aENvcmVUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy50ZXN0cy5MYXVuY2hpbmdTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLnVpLnRlc3RzLlhTTFVJVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuY29yZS50ZXN0cy5YU0xDb3JlVGVzdFN1aXRlOwotCi0vKioKLSAqIFRoaXMgY2xhc3Mgc3BlY2lmaWVzIGFsbCB0aGUgYnVuZGxlcyBvZiB0aGlzIGNvbXBvbmVudCB0aGF0IHByb3ZpZGUgYSB0ZXN0Ci0gKiBzdWl0ZSB0byBydW4gZHVyaW5nIGF1dG9tYXRlZCB0ZXN0aW5nLgotICovCi1wdWJsaWMgY2xhc3MgQWxsVGVzdHNTdWl0ZSBleHRlbmRzIFRlc3RTdWl0ZSB7Ci0KLQotCXB1YmxpYyBBbGxUZXN0c1N1aXRlKCkgewotCQlzdXBlcigiQWxsIFhTTCBUZXN0IFN1aXRlcyIpOwotCQlhZGRUZXN0KExhdW5jaGluZ1N1aXRlLnN1aXRlKCkpOwotCQlhZGRUZXN0KFhTTFVJVGVzdFN1aXRlLnN1aXRlKCkpOwotCQlhZGRUZXN0KFhTTENvcmVUZXN0U3VpdGUuc3VpdGUoKSk7Ci0JCWFkZFRlc3QoWFBhdGhDb3JlVGVzdHMuc3VpdGUoKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpcyBqdXN0IG5lZWQgdG8gcnVuIGluIGEgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgd29ya2JlbmNoLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RBbGwoKSB7Ci0JCS8vIHRoaXMgbWV0aG9kIG5lZWRzIHRvIGV4aXN0LCBidXQgZG9lc24ndCByZWFsbHkgZG8gYW55dGhpbmcKLQkJLy8gb3RoZXIgdGhhbiB0byBzaWduYWwgdG8gY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCi0JCS8vIFRoZSByZXN0IGl0IGF1dG9tYXRpYyBmcm9tIHRoZSB0ZXN0cyBhZGRlZCBpbiBjb25zdHJ1Y3Rvci4KLQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC54c2wudGVzdHMvdGVzdC54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QueHNsLnRlc3RzL3Rlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTEyY2I2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC54c2wudGVzdHMvdGVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPHByb2plY3QKLSAgICBuYW1lPSJ0ZXN0c3VpdGUiCi0gICAgZGVmYXVsdD0icnVuIgotICAgIGJhc2VkaXI9Ii4iPgotICAgIAotICAgIDwhLS0gVGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIHNob3VsZCBiZSBwYXNzZWQgaW50byB0aGlzIHNjcmlwdCAtLT4KLSAgICA8IS0tICR7ZWNsaXBzZS1ob21lfSAgIC0tPgotICAgIDwhLS0gJHtidWlsZERpcmVjdG9yeX0gIC0tPgotICAgIDwhLS0gJHtidWlsZExhYmVsfSAgICAgICAgLS0+Ci0KLSAgICA8IS0tIHNob3VsZCBiZSBsaXR0bGUgbmVlZCB0byBjaGFuZ2Ugd2hhdCdzIGFib3ZlICAtLT4KLSAgICAKLSAgICA8cHJvcGVydHkKLSAgICAgICAgbmFtZT0icGx1Z2luLW5hbWUiCi0gICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS53c3QueHNsLnRlc3RzIiAvPgotICAgIDxwcm9wZXJ0eQotICAgICAgICBuYW1lPSJjbGFzc25hbWUiCi0gICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS53c3QueHNsLnRlc3RzLkFsbFRlc3RzU3VpdGUiIC8+Ci0gICAgPHByb3BlcnR5Ci0gICAgICAgIG5hbWU9InRlc3RUeXBlIgotICAgICAgICB2YWx1ZT0idWktdGVzdCIgLz4KLQotICAgIDwhLS0gc2hvdWxkIGJlIGxpdHRsZSBuZWVkIHRvIGNoYW5nZSB3aGF0J3MgYmVsb3cgLS0+Ci0KLSAgICA8ZWNobyBtZXNzYWdlPSJiYXNlZGlyOiAke2Jhc2VkaXJ9IiAvPgotICAgIDxlY2hvIG1lc3NhZ2U9ImVjbGlwc2UtaG9tZTogJHtlY2xpcHNlLWhvbWV9IiAvPgotICAgIDxlY2hvIG1lc3NhZ2U9ImJ1aWxkRGlyZWN0b3J5OiAke2J1aWxkRGlyZWN0b3J5fSIgLz4KLSAgICA8ZWNobyBtZXNzYWdlPSJwbHVnaW4tbmFtZTogJHtwbHVnaW4tbmFtZX0iIC8+Ci0gICAgPGVjaG8gbWVzc2FnZT0iY2xhc3NuYW1lOiAke2NsYXNzbmFtZX0iIC8+Ci0gICAgPGVjaG8gbWVzc2FnZT0idGVzdFR5cGUgJHt0ZXN0VHlwZX0iIC8+Ci0KLQotICAgIDxwcm9wZXJ0eQotICAgICAgICBuYW1lPSJsaWJyYXJ5LWZpbGUiCi0gICAgICAgIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vcGx1Z2lucy9vcmcuZWNsaXBzZS50ZXN0XzMuMS4wL2xpYnJhcnkueG1sIiAvPgotICAgIDxwcm9wZXJ0eQotICAgICAgICBuYW1lPSJ3b3Jrc3BhY2UiCi0gICAgICAgIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vanVuaXR3b3Jrc3BhY2VzLyR7cGx1Z2luLW5hbWV9IiAvPgotICAgICAgICAKLSAgICA8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGFsbCBpbml0aWFsaXphdGlvbiBjb2RlIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSBmb3IgLS0+Ci0gICAgPCEtLSBhbGwgdGVzdHMgdGhhdCBhcmUgdG8gYmUgcnVuLiBJbml0aWFsaXphdGlvbiBmb3IgaW5kaXZpZHVhbCB0ZXN0cyAtLT4KLSAgICA8IS0tIHNob3VsZCBiZSBkb25lIHdpdGhpbiB0aGUgYm9keSBvZiB0aGUgc3VpdGUgdGFyZ2V0LiAtLT4KLSAgICA8dGFyZ2V0IG5hbWU9ImluaXQiPgotICAgICAgICA8dHN0YW1wIC8+Ci0gICAgICAgIDxkZWxldGU+Ci0gICAgICAgICAgICA8ZmlsZXNldAotICAgICAgICAgICAgICAgIGRpcj0iJHtlY2xpcHNlLWhvbWV9IgotICAgICAgICAgICAgICAgIGluY2x1ZGVzPSIke3BsdWdpbi1uYW1lfS4qeG1sIiAvPgotICAgICAgICA8L2RlbGV0ZT4KLSAgICAgICAgPCEtLSBtYWtlIGRpcmVjdG9yeSwgaW4gY2FzZSBwYXRoIGRvZXNuJ3QgZXhpc3QgeWV0IC0tPgotICAgICAgICA8bWtkaXIgZGlyPSIke3dvcmtzcGFjZX0iIC8+Ci0gICAgICAgIDwhLS0gIGJ1dCBkZWxldGUgdG8gbWFrZSBzdXJlIGZyZXNoIGNvbnRlbnRzLS0+Ci0gICAgICAgIDxkZWxldGUKLSAgICAgICAgICAgIGRpcj0iJHt3b3Jrc3BhY2V9IgotICAgICAgICAgICAgcXVpZXQ9InRydWUiIC8+Ci0KLSAgICA8L3RhcmdldD4KLQotICAgIDwhLS0gVGhpcyB0YXJnZXQgZGVmaW5lcyB0aGUgdGVzdHMgdGhhdCBuZWVkIHRvIGJlIHJ1bi4gLS0+Ci0gICAgPHRhcmdldCBuYW1lPSJzdWl0ZSI+Ci0KLSAgICAgICAgPGFudAotICAgICAgICAgICAgdGFyZ2V0PSIke3Rlc3RUeXBlfSIKLSAgICAgICAgICAgIGFudGZpbGU9IiR7bGlicmFyeS1maWxlfSIKLSAgICAgICAgICAgIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgICAgICAgIDxwcm9wZXJ0eQotICAgICAgICAgICAgICAgIG5hbWU9ImRhdGEtZGlyIgotICAgICAgICAgICAgICAgIHZhbHVlPSIke3dvcmtzcGFjZX0iIC8+Ci0gICAgICAgICAgICA8cHJvcGVydHkKLSAgICAgICAgICAgICAgICBuYW1lPSJwbHVnaW4tbmFtZSIKLSAgICAgICAgICAgICAgICB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0iIC8+Ci0gICAgICAgICAgICA8cHJvcGVydHkKLSAgICAgICAgICAgICAgICBuYW1lPSJjbGFzc25hbWUiCi0gICAgICAgICAgICAgICAgdmFsdWU9IiR7Y2xhc3NuYW1lfSIgLz4KLSAgICAgICAgICAgIDxwcm9wZXJ0eQotICAgICAgICAgICAgICAgIG5hbWU9InBsdWdpbi1wYXRoIgotICAgICAgICAgICAgICAgIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vcGx1Z2lucy8ke3BsdWdpbi1uYW1lfSIgLz4KLSAgICAgICAgPC9hbnQ+Ci0KLSAgICAgICAgPGNvcHkKLSAgICAgICAgICAgIGZhaWxvbmVycm9yPSJmYWxzZSIKLSAgICAgICAgICAgIGZpbGU9IiR7d29ya3NwYWNlfS8ubWV0YWRhdGEvLmxvZyIKLSAgICAgICAgICAgIHRvZmlsZT0iJHtidWlsZERpcmVjdG9yeX0vJHtidWlsZExhYmVsfS90ZXN0UmVzdWx0cy9jb25zb2xlbG9ncy8ke3BsdWdpbi1uYW1lfS5jb25zb2xlbG9nLnR4dCIgLz4KLQotICAgIDwvdGFyZ2V0PgotCi0gICAgPCEtLSBUaGlzIHRhcmdldCBob2xkcyBjb2RlIHRvIGNsZWFudXAgdGhlIHRlc3RpbmcgZW52aXJvbm1lbnQgYWZ0ZXIgLS0+Ci0gICAgPCEtLSBhZnRlciBhbGwgb2YgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4uIFlvdSBjYW4gdXNlIHRoaXMgdGFyZ2V0IHRvIC0tPgotICAgIDwhLS0gZGVsZXRlIHRlbXBvcmFyeSBmaWxlcyB0aGF0IGhhdmUgYmVlbiBjcmVhdGVkLiAtLT4KLSAgICA8dGFyZ2V0IG5hbWU9ImNsZWFudXAiPgotICAgICAgICA8IS0tIHVzdWFsbHkgbm8gbmVlZCB0byBkZWxldGUgd29ya3NwYWNlIHVudGlsIG5leHQgcnVuLCBhbmQgbGVhdmluZyBpdCBhbGxvd3MgaW5zcGVjdGlvbiAtLT4KLSAgICAgICAgPCEtLSA8ZGVsZXRlIGRpcj0iJHt3b3Jrc3BhY2V9IiBxdWlldD0idHJ1ZSIgLz4gLS0+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8IS0tIFRoaXMgdGFyZ2V0IHJ1bnMgdGhlIHRlc3Qgc3VpdGUuIEFueSBhY3Rpb25zIHRoYXQgbmVlZCB0byBoYXBwZW4gLS0+Ci0gICAgPCEtLSBhZnRlciBhbGwgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4gc2hvdWxkIGdvIGhlcmUuIC0tPgotICAgIDx0YXJnZXQKLSAgICAgICAgbmFtZT0icnVuIgotICAgICAgICBkZXBlbmRzPSJpbml0LHN1aXRlLGNsZWFudXAiPgotICAgICAgICA8YW50Ci0gICAgICAgICAgICB0YXJnZXQ9ImNvbGxlY3QiCi0gICAgICAgICAgICBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iCi0gICAgICAgICAgICBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0gICAgICAgICAgICA8cHJvcGVydHkKLSAgICAgICAgICAgICAgICBuYW1lPSJpbmNsdWRlcyIKLSAgICAgICAgICAgICAgICB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0uKnhtbCIgLz4KLSAgICAgICAgICAgIDxwcm9wZXJ0eQotICAgICAgICAgICAgICAgIG5hbWU9Im91dHB1dC1maWxlIgotICAgICAgICAgICAgICAgIHZhbHVlPSIke3BsdWdpbi1uYW1lfS54bWwiIC8+Ci0gICAgICAgIDwvYW50PgotICAgIDwvdGFyZ2V0PgotCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS50ZXN0cy8uY2xhc3NwYXRoIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS50ZXN0cy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWViMGU5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC54c2wudWkudGVzdHMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSIqKi9pbnRlcm5hbC8qKiIvPgotCQk8L2FjY2Vzc3J1bGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC54c2wudWkudGVzdHMvLnByb2plY3QgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QueHNsLnVpLnRlc3RzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTc3NWJiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC54c2wudWkudGVzdHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QueHNsLnVpLnRlc3RzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC54c2wudWkudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5Nzg5ZjMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNGcmkgQXByIDA0IDE0OjQ1OjEzIEdNVC0wNTowMCAyMDA4Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC54c2wudWkudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QueHNsLnVpLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTE4MTdlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC54c2wudWkudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LnhzbC51aS50ZXN0cwotQnVuZGxlLVZlcnNpb246IDEuMC4wLnF1YWxpZmVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS53c3QueHNsLnVpLnRlc3RzLkFjdGl2YXRvcgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5qdW5pdDtidW5kbGUtdmVyc2lvbj0iMy44LjIiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhzbC51aTtidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkuaWRlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMzAwLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamZhY2UudGV4dDtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlO2J1bmRsZS12ZXJzaW9uPSIxLjEuMzAwIiwKLSBvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvcjtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC51aTtidW5kbGUtdmVyc2lvbj0iWzEuMC40MDAsMi4wLjApIgotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwudmFsaWRhdGlvbjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2wudWkudGVzdHM7Ci0gIHVzZXM6PSJvcmcuZWNsaXBzZS51aS5kaWFsb2dzLAotICAgb3JnLm9zZ2kuZnJhbWV3b3JrLAotICAgb3JnLmVjbGlwc2UudWkucGx1Z2luLAotICAganVuaXQuZnJhbWV3b3JrLAotICAgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMsCi0gICBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLAotIG9yZy5lY2xpcHNlLndzdC54c2wudWkudGVzdHMuZWRpdG9yOwotICB1c2VzOj0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQsCi0gICBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcsCi0gICBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLAotICAgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMsCi0gICBvcmcuZWNsaXBzZS53c3QueHNsLnVpLnRlc3RzLAotICAgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbCwKLSAgIG9yZy5lY2xpcHNlLnVpIgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QueHNsLnVpLnRlc3RzL2Fib3V0Lmh0bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QueHNsLnVpLnRlc3RzL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTlkZjMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS50ZXN0cy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QueHNsLnVpLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QueHNsLnVpLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4YjRmNDMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHByb2plY3RmaWxlcy8sXAotICAgICAgICAgICAgICAgYmluLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1zcmMuaW5jbHVkZXMgPSBzcmMvLFwKLSAgICAgICAgICAgICAgIHByb2plY3RmaWxlcy8sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGJ1aWxkLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC54c2wudWkudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QueHNsLnVpLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGZkNmE1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC54c2wudWkudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSNQcm9wZXJ0aWVzIGZpbGUgZm9yIG9yZy5lY2xpcHNlLndzdC54c2wudWkudGVzdHMKLXBsdWdpbk5hbWUgPSBUZXN0cyBQbHVnLWluClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS50ZXN0cy9wcm9qZWN0ZmlsZXMvQ2hhbmdlUmVxdWVzdHNCeVJlc3BvbnNpYmlsaXR5LnhzbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC54c2wudWkudGVzdHMvcHJvamVjdGZpbGVzL0NoYW5nZVJlcXVlc3RzQnlSZXNwb25zaWJpbGl0eS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlZDE3MDMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS50ZXN0cy9wcm9qZWN0ZmlsZXMvQ2hhbmdlUmVxdWVzdHNCeVJlc3BvbnNpYmlsaXR5LnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBTdGFuZGFyZHMgZm9yIFRlY2hub2xvZ3kgaW4gQXV0b21vdGl2ZSBSZXRhaWwgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEYXZpZCBDYXJ2ZXIgLSBTVEFSIC0gU3R5bGVzaGVldCBmb3IgdGVzdGluZyBwdXJwb3Nlcy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotIC0tPgotPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB2ZXJzaW9uPSIyLjAiPgotICAgIAotICAgIDx4c2w6cGFyYW0gbmFtZT0iZGF0ZSI+PC94c2w6cGFyYW0+Ci0KLSAgICA8eHNsOmluY2x1ZGUgaHJlZj0idXRpbHMueHNsIi8+Ci0gICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iU3RhclRlYW0iPgotICAgICAgICA8aHRtbD4KLSAgICAgICAgICAgIDxoZWFkPgotICAgICAgICAgICAgICAgIDx0aXRsZT5DaGFuZ2UgUmVxdWVzdCBieSBSZXNwb25zaWJpbGl0eTwvdGl0bGU+Ci0gICAgICAgICAgICA8L2hlYWQ+Ci0gICAgICAgICAgICA8Ym9keT4KLSAgICAgICAgICAgICAgICA8cD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2gtZ3JvdXAgc2VsZWN0PSJDaGFuZ2VSZXF1ZXN0IiBncm91cC1ieT0iQXNzaWduZWRUbyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjYXB0aW9uPjxiPkNoYW5nZSBSZXF1ZXN0cyBBc3NpZ25lZCBUbyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iY3VycmVudC1ncm91cGluZy1rZXkoKSIvPjwvYj48L2NhcHRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGFibGVIZWFkZXIiPjwveHNsOmNhbGwtdGVtcGxhdGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iY3VycmVudC1ncm91cCgpIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6c29ydCBzZWxlY3Q9IlN0YXR1cyIgb3JkZXI9ImRlc2NlbmRpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJDaGFuZ2VSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaC1ncm91cD4KLSAgICAgICAgICAgICAgICA8L3A+Ci0gICAgICAgICAgICA8L2JvZHk+Ci0gICAgICAgIDwvaHRtbD4KLSAgICA8L3hzbDp0ZW1wbGF0ZT4KLSAgICAKLSAgICA8eHNsOnRlbXBsYXRlIG5hbWU9InRhYmxlSGVhZGVyIj4KLSAgICAgICAgPHRyIGJnY29sb3I9InNpbHZlciI+Ci0gICAgICAgICAgICA8dGQ+PHN0cm9uZz5OdW1iZXI8L3N0cm9uZz48L3RkPgotICAgICAgICAgICAgPHRkPjxzdHJvbmc+Q3JlYXRpb24gRGF0ZTwvc3Ryb25nPjwvdGQ+Ci0gICAgICAgICAgICA8dGQ+PHN0cm9uZz5Bc3NpZ25lZCBUbzwvc3Ryb25nPjwvdGQ+Ci0gICAgICAgICAgICA8dGQ+PHN0cm9uZz5DYXRlZ29yeTwvc3Ryb25nPjwvdGQ+Ci0gICAgICAgICAgICA8dGQ+PHN0cm9uZz5Db21wb25lbnQ8L3N0cm9uZz48L3RkPgotICAgICAgICAgICAgPHRkPjxzdHJvbmc+U3lub3BzaXM8L3N0cm9uZz48L3RkPgotICAgICAgICAgICAgPHRkPjxzdHJvbmc+U3RhdHVzPC9zdHJvbmc+PC90ZD4KLSAgICAgICAgPC90cj4KLSAgICA8L3hzbDp0ZW1wbGF0ZT4KLSAgICAKLSAgICA8eHNsOnRlbXBsYXRlIG5hbWU9IkNoYW5nZVJlcXVlc3QiPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkNSTnVtYmVyIi8+PC90ZD4KLSAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibG9uZ19kYXRlIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRhdGUiIHNlbGVjdD0iQ3JlYXRlZE9uRGF0ZSIvPgotICAgICAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJBc3NpZ25lZFRvIi8+PC90ZD4KLSAgICAgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQ2F0ZWdvcnkiLz48L3RkPgotICAgICAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJDb21wb25lbnQiLz48L3RkPgotICAgICAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJTeW5vcHNpcyIvPjwvdGQ+Ci0gICAgICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IlN0YXR1cyIvPjwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgPC94c2w6dGVtcGxhdGU+Ci08L3hzbDpzdHlsZXNoZWV0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC54c2wudWkudGVzdHMvcHJvamVjdGZpbGVzL0NoYW5nZVJlcXVlc3RzQnlTdGF0dXMueHNsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS50ZXN0cy9wcm9qZWN0ZmlsZXMvQ2hhbmdlUmVxdWVzdHNCeVN0YXR1cy54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzZDAxMWYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS50ZXN0cy9wcm9qZWN0ZmlsZXMvQ2hhbmdlUmVxdWVzdHNCeVN0YXR1cy54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggU3RhbmRhcmRzIGZvciBUZWNobm9sb2d5IGluIEF1dG9tb3RpdmUgUmV0YWlsIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRGF2aWQgQ2FydmVyIC0gU1RBUiAtIFN0eWxlc2hlZXQgZm9yIHRlc3RpbmcgcHVycG9zZXMuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotIC0tPgotPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB2ZXJzaW9uPSIyLjAiPgotICAgIAotICAgIDx4c2w6cGFyYW0gbmFtZT0iZGF0ZSI+PC94c2w6cGFyYW0+Ci0KLSAgICA8eHNsOmluY2x1ZGUgaHJlZj0idXRpbHMueHNsIi8+Ci0gICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iU3RhclRlYW0iPgotICAgICAgICA8aHRtbD4KLSAgICAgICAgICAgIDxoZWFkPgotICAgICAgICAgICAgICAgIDx0aXRsZT5DaGFuZ2UgUmVxdWVzdCBieSBTdGF0dXM8L3RpdGxlPgotICAgICAgICAgICAgPC9oZWFkPgotICAgICAgICAgICAgPGJvZHk+Ci0gICAgICAgICAgICAgICAgPHA+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoLWdyb3VwIHNlbGVjdD0iQ2hhbmdlUmVxdWVzdCIgZ3JvdXAtYnk9IlN0YXR1cyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjYXB0aW9uPjxiPkNoYW5nZSBSZXF1ZXN0IFN0YXR1czx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjdXJyZW50LWdyb3VwaW5nLWtleSgpIi8+PC9iPjwvY2FwdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ0YWJsZUhlYWRlciI+PC94c2w6Y2FsbC10ZW1wbGF0ZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJjdXJyZW50LWdyb3VwKCkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpzb3J0IHNlbGVjdD0iQ2F0ZWdvcnkiIG9yZGVyPSJkZXNjZW5kaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iQ2hhbmdlUmVxdWVzdCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2gtZ3JvdXA+Ci0gICAgICAgICAgICAgICAgPC9wPgotICAgICAgICAgICAgPC9ib2R5PgotICAgICAgICA8L2h0bWw+Ci0gICAgPC94c2w6dGVtcGxhdGU+Ci0gICAgCi0gICAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJ0YWJsZUhlYWRlciI+Ci0gICAgICAgIDx0ciBiZ2NvbG9yPSJzaWx2ZXIiPgotICAgICAgICAgICAgPHRkPjxzdHJvbmc+TnVtYmVyPC9zdHJvbmc+PC90ZD4KLSAgICAgICAgICAgIDx0ZD48c3Ryb25nPkNyZWF0aW9uIERhdGU8L3N0cm9uZz48L3RkPgotICAgICAgICAgICAgPHRkPjxzdHJvbmc+QXNzaWduZWQgVG88L3N0cm9uZz48L3RkPgotICAgICAgICAgICAgPHRkPjxzdHJvbmc+Q2F0ZWdvcnk8L3N0cm9uZz48L3RkPgotICAgICAgICAgICAgPHRkPjxzdHJvbmc+Q29tcG9uZW50PC9zdHJvbmc+PC90ZD4KLSAgICAgICAgICAgIDx0ZD48c3Ryb25nPlN5bm9wc2lzPC9zdHJvbmc+PC90ZD4KLSAgICAgICAgICAgIDx0ZD48c3Ryb25nPlN0YXR1czwvc3Ryb25nPjwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgPC94c2w6dGVtcGxhdGU+Ci0gICAgCi0gICAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJDaGFuZ2VSZXF1ZXN0Ij4KLSAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJDUk51bWJlciIvPjwvdGQ+Ci0gICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImxvbmdfZGF0ZSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkYXRlIiBzZWxlY3Q9IkNyZWF0ZWRPbkRhdGUiLz4KLSAgICAgICAgICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQXNzaWduZWRUbyIvPjwvdGQ+Ci0gICAgICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkNhdGVnb3J5Ii8+PC90ZD4KLSAgICAgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQ29tcG9uZW50Ii8+PC90ZD4KLSAgICAgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iU3lub3BzaXMiLz48L3RkPgotICAgICAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJTdGF0dXMiLz48L3RkPgotICAgICAgICA8L3RyPgotICAgIDwveHNsOnRlbXBsYXRlPgotPC94c2w6c3R5bGVzaGVldD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QueHNsLnVpLnRlc3RzL3Byb2plY3RmaWxlcy9EcmFmdFJlbGVhc2VDUnMueHNsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS50ZXN0cy9wcm9qZWN0ZmlsZXMvRHJhZnRSZWxlYXNlQ1JzLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM4MzQxNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QueHNsLnVpLnRlc3RzL3Byb2plY3RmaWxlcy9EcmFmdFJlbGVhc2VDUnMueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBTdGFuZGFyZHMgZm9yIFRlY2hub2xvZ3kgaW4gQXV0b21vdGl2ZSBSZXRhaWwgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEYXZpZCBDYXJ2ZXIgLSBTVEFSIC0gU3R5bGVzaGVldCBmb3IgdGVzdGluZyBwdXJwb3Nlcy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gLS0+Ci08eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHZlcnNpb249IjEuMCI+Ci0gICAgPHhzbDpwYXJhbSBuYW1lPSJkYXRlIi8+Ci0gICAgPHhzbDppbmNsdWRlIGhyZWY9InV0aWxzLnhzbCIvPgotICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9IlN0YXJUZWFtIj4KLSAgICAgICAgPGh0bWw+Ci0gICAgICAgICAgICA8aGVhZD4KLSAgICAgICAgICAgICAgICA8dGl0bGU+Q2hhbmdlIFJlcXVlc3QgYnkgUmVzcG9uc2liaWxpdHk8L3RpdGxlPgotICAgICAgICAgICAgPC9oZWFkPgotICAgICAgICAgICAgPGJvZHk+Ci0gICAgICAgICAgICAgICAgPHA+Ci0gICAgICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjEiPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNhcHRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGI+RHJhZnQvTWlsZXN0b25lIENvbXBsZXRlZCBDaGFuZ2UgUmVxdWVzdHM8L2I+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NhcHRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGFibGVIZWFkZXIiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJDaGFuZ2VSZXF1ZXN0WyhTdGF0dXMgPSAnRml4ZWQnIG9yIFN0YXR1cyA9ICdJbiBQcm9ncmVzcycpIGFuZCAoQ2F0ZWdvcnkgPSAnWE1MJyBvciBDYXRlZ29yeSA9ICdEVFMnKV0iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6c29ydCBzZWxlY3Q9Ik1vZGlmaWVkRGF0ZSIgb3JkZXI9ImRlc2NlbmRpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnNvcnQgc2VsZWN0PSJBc3NpZ25lZFRvIiBvcmRlcj0iZGVzY2VuZGluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJDaGFuZ2VSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KLSAgICAgICAgICAgICAgICA8L3A+Ci0gICAgICAgICAgICA8L2JvZHk+Ci0gICAgICAgIDwvaHRtbD4KLSAgICA8L3hzbDp0ZW1wbGF0ZT4KLSAgICA8eHNsOnRlbXBsYXRlIG5hbWU9InRhYmxlSGVhZGVyIj4KLSAgICAgICAgPHRyIGJnY29sb3I9InNpbHZlciI+Ci0gICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgPHN0cm9uZz5OdW1iZXI8L3N0cm9uZz4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgPHN0cm9uZz5DcmVhdGlvbiBEYXRlPC9zdHJvbmc+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgIDxzdHJvbmc+TW9kaWZpZWQgRGF0ZTwvc3Ryb25nPgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICA8c3Ryb25nPkNhdGVnb3J5PC9zdHJvbmc+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgIDxzdHJvbmc+Q29tcG9uZW50PC9zdHJvbmc+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgIDxzdHJvbmc+U3lub3BzaXM8L3N0cm9uZz4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgPHN0cm9uZz5Bc3NpZ25lZCBUbzwvc3Ryb25nPgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICA8c3Ryb25nPlN0YXR1czwvc3Ryb25nPgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICA8L3hzbDp0ZW1wbGF0ZT4KLSAgICA8eHNsOnRlbXBsYXRlIG5hbWU9IkNoYW5nZVJlcXVlc3QiPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkNSTnVtYmVyIi8+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJsb25nX2RhdGUiPgotICAgICAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGF0ZSIgc2VsZWN0PSJDcmVhdGVkT25EYXRlIi8+Ci0gICAgICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImxvbmdfZGF0ZSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkYXRlIiBzZWxlY3Q9Ik1vZGlmaWVkRGF0ZSIvPgotICAgICAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJDYXRlZ29yeSIvPgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQ29tcG9uZW50Ii8+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJTeW5vcHNpcyIvPgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQXNzaWduZWRUbyIvPgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iU3RhdHVzIi8+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotICAgIDwveHNsOnRlbXBsYXRlPgotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC54c2wudWkudGVzdHMvcHJvamVjdGZpbGVzL0xpc3RBbGxDaGFuZ2VSZXF1ZXN0cy54c2wgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QueHNsLnVpLnRlc3RzL3Byb2plY3RmaWxlcy9MaXN0QWxsQ2hhbmdlUmVxdWVzdHMueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGRmOGRlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC54c2wudWkudGVzdHMvcHJvamVjdGZpbGVzL0xpc3RBbGxDaGFuZ2VSZXF1ZXN0cy54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggU3RhbmRhcmRzIGZvciBUZWNobm9sb2d5IGluIEF1dG9tb3RpdmUgUmV0YWlsIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRGF2aWQgQ2FydmVyIC0gU1RBUiAtIFN0eWxlc2hlZXQgZm9yIHRlc3RpbmcgcHVycG9zZXMuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAtLT4KLQotPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB2ZXJzaW9uPSIxLjAiPgotICAgIAotICAgIDx4c2w6cGFyYW0gbmFtZT0iZGF0ZSI+PC94c2w6cGFyYW0+Ci0KLSAgICA8eHNsOmluY2x1ZGUgaHJlZj0idXRpbHMueHNsIi8+Ci0gICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iU3RhclRlYW0iPgotICAgICAgICA8aHRtbD4KLSAgICAgICAgICAgIDxoZWFkPgotICAgICAgICAgICAgICAgIDx0aXRsZT5MaXN0IEFsbCBDaGFuZ2UgUmVxdWVzdHM8L3RpdGxlPgotICAgICAgICAgICAgPC9oZWFkPgotICAgICAgICAgICAgPGJvZHk+Ci0gICAgICAgICAgICAgICAgPHA+Ci0gICAgICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjEiPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNhcHRpb24+PGI+QWxsIENoYW5nZSBSZXF1ZXN0cyBpbiBYTUwvRFRTPC9iPjwvY2FwdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ0YWJsZUhlYWRlciI+PC94c2w6Y2FsbC10ZW1wbGF0ZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJDaGFuZ2VSZXF1ZXN0Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnNvcnQgc2VsZWN0PSJTdGF0dXMiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iQ2hhbmdlUmVxdWVzdCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgICAgICAgICAgICAgIDwvdGFibGU+Ci0gICAgICAgICAgICAgICAgPC9wPgotICAgICAgICAgICAgPC9ib2R5PgotICAgICAgICA8L2h0bWw+Ci0gICAgPC94c2w6dGVtcGxhdGU+Ci0gICAgCi0gICAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJ0YWJsZUhlYWRlciI+Ci0gICAgICAgIDx0ciBiZ2NvbG9yPSJzaWx2ZXIiPgotICAgICAgICAgICAgPHRkPjxzdHJvbmc+TnVtYmVyPC9zdHJvbmc+PC90ZD4KLSAgICAgICAgICAgIDx0ZD48c3Ryb25nPkNyZWF0aW9uIERhdGU8L3N0cm9uZz48L3RkPgotICAgICAgICAgICAgPHRkPjxzdHJvbmc+QXNzaWduZWQgVG88L3N0cm9uZz48L3RkPgotICAgICAgICAgICAgPHRkPjxzdHJvbmc+Q2F0ZWdvcnk8L3N0cm9uZz48L3RkPgotICAgICAgICAgICAgPHRkPjxzdHJvbmc+Q29tcG9uZW50PC9zdHJvbmc+PC90ZD4KLSAgICAgICAgICAgIDx0ZD48c3Ryb25nPlN5bm9wc2lzPC9zdHJvbmc+PC90ZD4KLSAgICAgICAgICAgIDx0ZD48c3Ryb25nPlN0YXR1czwvc3Ryb25nPjwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgPC94c2w6dGVtcGxhdGU+Ci0gICAgCi0gICAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJDaGFuZ2VSZXF1ZXN0Ij4KLSAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJDUk51bWJlciIvPjwvdGQ+Ci0gICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImxvbmdfZGF0ZSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkYXRlIiBzZWxlY3Q9IkNyZWF0ZWRPbkRhdGUiLz4KLSAgICAgICAgICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQXNzaWduZWRUbyIvPjwvdGQ+Ci0gICAgICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkNhdGVnb3J5Ii8+PC90ZD4KLSAgICAgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQ29tcG9uZW50Ii8+PC90ZD4KLSAgICAgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iU3lub3BzaXMiLz48L3RkPgotICAgICAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJTdGF0dXMiLz48L3RkPgotICAgICAgICA8L3RyPgotICAgIDwveHNsOnRlbXBsYXRlPgotPC94c2w6c3R5bGVzaGVldD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QueHNsLnVpLnRlc3RzL3Byb2plY3RmaWxlcy9PdXRzdGFuZGluZ0NScy54c2wgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QueHNsLnVpLnRlc3RzL3Byb2plY3RmaWxlcy9PdXRzdGFuZGluZ0NScy54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4ODAzNGIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS50ZXN0cy9wcm9qZWN0ZmlsZXMvT3V0c3RhbmRpbmdDUnMueHNsCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IFN0YW5kYXJkcyBmb3IgVGVjaG5vbG9neSBpbiBBdXRvbW90aXZlIFJldGFpbCBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIERhdmlkIENhcnZlciAtIFNUQVIgLSBTdHlsZXNoZWV0IGZvciB0ZXN0aW5nIHB1cnBvc2VzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgdmVyc2lvbj0iMi4wIj4KLSAgICA8eHNsOnBhcmFtIG5hbWU9ImRhdGUiLz4KLSAgICA8eHNsOmluY2x1ZGUgaHJlZj0idXRpbHMueHNsIi8+Ci0gICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iU3RhclRlYW0iPgotICAgICAgICA8aHRtbD4KLSAgICAgICAgICAgIDxoZWFkPgotICAgICAgICAgICAgICAgIDx0aXRsZT5PdXRzdGFuZGluZy9VbmFzc2lnbmVkIENoYW5nZSBSZXF1ZXN0czwvdGl0bGU+Ci0gICAgICAgICAgICA8L2hlYWQ+Ci0gICAgICAgICAgICA8Ym9keT4KLSAgICAgICAgICAgICAgICA8cD4KLSAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y2FwdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Yj5PdXRzdGFuZGluZy9VbmFzc2lnbmVkIENoYW5nZSBSZXF1ZXN0czwvYj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY2FwdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ0YWJsZUhlYWRlciIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IkNoYW5nZVJlcXVlc3RbU3RhdHVzID0gJ05ldyddIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iQ2hhbmdlUmVxdWVzdCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgICAgICAgICAgICAgIDwvdGFibGU+Ci0gICAgICAgICAgICAgICAgPC9wPgotICAgICAgICAgICAgPC9ib2R5PgotICAgICAgICA8L2h0bWw+Ci0gICAgPC94c2w6dGVtcGxhdGU+Ci0gICAgCi0gICAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJ0YWJsZUhlYWRlciI+Ci0gICAgICAgIDx0ciBiZ2NvbG9yPSJzaWx2ZXIiPgotICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgIDxzdHJvbmc+TnVtYmVyPC9zdHJvbmc+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgIDxzdHJvbmc+Q3JlYXRpb24gRGF0ZTwvc3Ryb25nPgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICA8c3Ryb25nPkFzc2lnbmVkIFRvPC9zdHJvbmc+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgIDxzdHJvbmc+Q2F0ZWdvcnk8L3N0cm9uZz4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgPHN0cm9uZz5Db21wb25lbnQ8L3N0cm9uZz4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgPHN0cm9uZz5TeW5vcHNpczwvc3Ryb25nPgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICA8c3Ryb25nPlN0YXR1czwvc3Ryb25nPgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICA8L3hzbDp0ZW1wbGF0ZT4KLSAgICA8eHNsOnRlbXBsYXRlIG5hbWU9IkNoYW5nZVJlcXVlc3QiPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkNSTnVtYmVyIi8+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJsb25nX2RhdGUiPgotICAgICAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGF0ZSIgc2VsZWN0PSJDcmVhdGVkT25EYXRlIi8+Ci0gICAgICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkFzc2lnbmVkVG8iLz4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkNhdGVnb3J5Ii8+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJDb21wb25lbnQiLz4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IlN5bm9wc2lzIi8+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJTdGF0dXMiLz4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgPC94c2w6dGVtcGxhdGU+Ci08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS50ZXN0cy9wcm9qZWN0ZmlsZXMvVGVzdFJlc3VsdFByZWZpeGVzLnhzbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC54c2wudWkudGVzdHMvcHJvamVjdGZpbGVzL1Rlc3RSZXN1bHRQcmVmaXhlcy54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzYmIyZGIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS50ZXN0cy9wcm9qZWN0ZmlsZXMvVGVzdFJlc3VsdFByZWZpeGVzLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotICAgIGV4Y2x1ZGUtcmVzdWx0LXByZWZpeGVzPSIjYWxsIgotICAgIHhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLQk8eHNsOnRlbXBsYXRlIG1hdGNoPSIvIj4KLQkJPCEtLSBUT0RPOiBBdXRvLWdlbmVyYXRlZCB0ZW1wbGF0ZSAtLT4KLQk8L3hzbDp0ZW1wbGF0ZT4KLTwveHNsOnN0eWxlc2hlZXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS50ZXN0cy9wcm9qZWN0ZmlsZXMvVGVzdFJlc3VsdFByZWZpeGVzRW1wdHkueHNsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS50ZXN0cy9wcm9qZWN0ZmlsZXMvVGVzdFJlc3VsdFByZWZpeGVzRW1wdHkueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDNmM2NmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC54c2wudWkudGVzdHMvcHJvamVjdGZpbGVzL1Rlc3RSZXN1bHRQcmVmaXhlc0VtcHR5LnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotICAgIGV4Y2x1ZGUtcmVzdWx0LXByZWZpeGVzPSIiCi0gICAgeG1sbnM6eGh0bWw9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotCTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8iPgotCQk8IS0tIFRPRE86IEF1dG8tZ2VuZXJhdGVkIHRlbXBsYXRlIC0tPgotCTwveHNsOnRlbXBsYXRlPgotPC94c2w6c3R5bGVzaGVldD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QueHNsLnVpLnRlc3RzL3Byb2plY3RmaWxlcy9UZXN0UmVzdWx0UHJlZml4ZXNXaXRoWGh0bWwueHNsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS50ZXN0cy9wcm9qZWN0ZmlsZXMvVGVzdFJlc3VsdFByZWZpeGVzV2l0aFhodG1sLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcxNTdlNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QueHNsLnVpLnRlc3RzL3Byb2plY3RmaWxlcy9UZXN0UmVzdWx0UHJlZml4ZXNXaXRoWGh0bWwueHNsCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0gICAgZXhjbHVkZS1yZXN1bHQtcHJlZml4ZXM9InhodG1sICIKLSAgICB4bWxuczp4aHRtbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgICB4bWxuczp0ZXN0PSJodHRwOi8vd3d3LmV4YW1wbGVzLm9yZy8iPgotCTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8iPgotCQk8IS0tIFRPRE86IEF1dG8tZ2VuZXJhdGVkIHRlbXBsYXRlIC0tPgotCTwveHNsOnRlbXBsYXRlPgotPC94c2w6c3R5bGVzaGVldD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QueHNsLnVpLnRlc3RzL3Byb2plY3RmaWxlcy9idWlsZC54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QueHNsLnVpLnRlc3RzL3Byb2plY3RmaWxlcy9idWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3NTIyNmMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS50ZXN0cy9wcm9qZWN0ZmlsZXMvYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAKLSAgICAgU2VwIDYsIDIwMDggNToyODo0MCBQTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgUHJvamVjdFppcEZpbGUKLSAgICAgCi0gICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08cHJvamVjdCBuYW1lPSJQcm9qZWN0WmlwRmlsZSIgZGVmYXVsdD0iZGVmYXVsdCI+Ci0JCi0gICAgPHRhcmdldCBuYW1lPSJkZWZhdWx0IiBkZXNjcmlwdGlvbj0iZGVzY3JpcHRpb24iPgotICAgIAk8emlwIGRlc3RmaWxlPSJwcm9qZWN0ZmlsZXMuemlwIiBjb21wcmVzcz0idHJ1ZSIgdXBkYXRlPSJ0cnVlIiA+Ci0gICAgCQk8emlwZmlsZXNldCBkaXI9Ii4iPgotICAgIAkJICAgPGluY2x1ZGUgbmFtZT0iKi54c2wiLz4KLSAgICAJCTwvemlwZmlsZXNldD4KLSAgICAJPC96aXA+Ci0gICAgPC90YXJnZXQ+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC54c2wudWkudGVzdHMvcHJvamVjdGZpbGVzL3Byb2plY3RmaWxlcy56aXAgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QueHNsLnVpLnRlc3RzL3Byb2plY3RmaWxlcy9wcm9qZWN0ZmlsZXMuemlwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2UwZDRjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC54c2wudWkudGVzdHMvcHJvamVjdGZpbGVzL3Byb2plY3RmaWxlcy56aXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QueHNsLnVpLnRlc3RzL3Byb2plY3RmaWxlcy91dGlscy54c2wgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QueHNsLnVpLnRlc3RzL3Byb2plY3RmaWxlcy91dGlscy54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyODUxMWEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS50ZXN0cy9wcm9qZWN0ZmlsZXMvdXRpbHMueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IFN0YW5kYXJkcyBmb3IgVGVjaG5vbG9neSBpbiBBdXRvbW90aXZlIFJldGFpbCBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIERhdmlkIENhcnZlciAtIFNUQVIgLSBTdHlsZXNoZWV0IGZvciB0ZXN0aW5nIHB1cnBvc2VzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgdmVyc2lvbj0iMS4wIj4KLSAgICA8eHNsOnRlbXBsYXRlIG5hbWU9ImxvbmdfZGF0ZSI+Ci0gICAgICAgIDx4c2w6cGFyYW0gbmFtZT0iZGF0ZSIvPgotICAgICAgICA8IS0tIE1vbnRoIC0tPgotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im1vbnRoIiBzZWxlY3Q9Im51bWJlcihzdWJzdHJpbmcoJGRhdGUsIDYsIDIpKSIvPgotICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbW9udGg9MSI+SmFudWFyeTwveHNsOndoZW4+Ci0gICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG1vbnRoPTIiPkZlYnJ1YXJ5PC94c2w6d2hlbj4KLSAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbW9udGg9MyI+TWFyY2g8L3hzbDp3aGVuPgotICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRtb250aD00Ij5BcHJpbDwveHNsOndoZW4+Ci0gICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG1vbnRoPTUiPk1heTwveHNsOndoZW4+Ci0gICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG1vbnRoPTYiPkp1bmU8L3hzbDp3aGVuPgotICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRtb250aD03Ij5KdWx5PC94c2w6d2hlbj4KLSAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbW9udGg9OCI+QXVndXN0PC94c2w6d2hlbj4KLSAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbW9udGg9OSI+U2VwdGVtYmVyPC94c2w6d2hlbj4KLSAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbW9udGg9MTAiPk9jdG9iZXI8L3hzbDp3aGVuPgotICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRtb250aD0xMSI+Tm92ZW1iZXI8L3hzbDp3aGVuPgotICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRtb250aD0xMiI+RGVjZW1iZXI8L3hzbDp3aGVuPgotICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+SU5WQUxJRCBNT05USDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICA8eHNsOnRleHQvPiAKLSAgICAgICAgPCEtLSBEYXkgLS0+Ci0gICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJudW1iZXIoc3Vic3RyaW5nKCRkYXRlLCA5LCAyKSkiIC8+Ci0gICAgICAgIDx4c2w6dGV4dD4sIDwveHNsOnRleHQ+Ci0gICAgICAgIDwhLS0gWWVhciAtLT4KLSAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZygkZGF0ZSwgMSwgNCkiIC8+Ci0gICAgICAgPC94c2w6dGVtcGxhdGU+Ci08L3hzbDpzdHlsZXNoZWV0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC54c2wudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi9UZXN0RGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvckZvclhTTC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL1Rlc3REZWxlZ2F0aW5nU291cmNlVmFsaWRhdG9yRm9yWFNMLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUwNWY2MDYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL1Rlc3REZWxlZ2F0aW5nU291cmNlVmFsaWRhdG9yRm9yWFNMLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBTdGFuZGFyZHMgZm9yIFRlY2hub2xvZ3kgaW4gQXV0b21vdGl2ZSBSZXRhaWwgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEYXZpZCBDYXJ2ZXIgLSBTVEFSIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uLCBiYXNlZCBvZmYgb2YKLSAqICAgICAgICAgICAgICAgICAgICBYTUwgU291cmNlIERlbGdhdGluZyBWYWxpZGF0b3IgdGVzdHMuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5Xb3JrYmVuY2hDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wudWkudGVzdHMuVW56aXBwZWRQcm9qZWN0VGVzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wudWkudGVzdHMuWFNMVUlUZXN0c1BsdWdpbjsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wuZG9jYm9vay5jb3JlLkRvY2Jvb2tQbHVnaW47Ci0KLS8qKgotICogVGVzdCB0aGUgWE1MIGRlbGVnYXRpbmcgc291cmNlIHZhbGlkYXRvci4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0RGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvckZvclhTTCBleHRlbmRzIFVuemlwcGVkUHJvamVjdFRlc3RlciAKLXsKLQlEZWxlZ2F0aW5nU291cmNlVmFsaWRhdG9yRm9yWFNMIHNvdXJjZVZhbGlkYXRvciA9ICBuZXcgRGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvckZvclhTTCgpOwotCQotCXB1YmxpYyBUZXN0RGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvckZvclhTTCgpIHsKLQkJCi0JfQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCQotCQotCXByaXZhdGUgU3RyaW5nIGdldHhzbFRlc3RGaWxlc1Byb2plY3ROYW1lKCkgewotCQlyZXR1cm4gInhzbHRlc3RmaWxlcyI7Ci0JfQotCS8qKgotCSAqIFRlc3QgWFBhdGggMi4wIHZhbGlkYXRpb24gZmFpbHMKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0WFNMVDJYUGF0aDIwRmFpbHMoKQotCXsKLQkJU3RyaW5nIHByb2pOYW1lID0gZ2V0eHNsVGVzdEZpbGVzUHJvamVjdE5hbWUoKTsKLQkJU3RyaW5nIGZpbGVOYW1lMSA9ICJDaGFuZ2VSZXF1ZXN0c0J5UmVzcG9uc2liaWxpdHkueHNsIjsKLQotCQlTdHJpbmcgdmFsaWRhdGVGaWxlUGF0aCA9IHByb2pOYW1lICsgRmlsZS5zZXBhcmF0b3IgKyBmaWxlTmFtZTE7Ci0KLQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5uZXdQcm9qZWN0RGVzY3JpcHRpb24ocHJvak5hbWUpOwotCi0JCUlQcm9qZWN0IHByb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QocHJvak5hbWUpOwotCQl0cnkgewotCQkJcHJvamVjdC5jcmVhdGUoZGVzY3JpcHRpb24sIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJcHJvamVjdC5vcGVuKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJCi0JCUlGaWxlIGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUobmV3IFBhdGgodmFsaWRhdGVGaWxlUGF0aCkpOwotCQlpZiAoZmlsZSAhPSBudWxsICYmICFmaWxlLmV4aXN0cygpKSB7Ci0JCQlmYWlsKCJVbmFibGUgdG8gbG9jYXRlICIgKyBmaWxlTmFtZTEgKyAiIHN0eWxlc2hlZXQuIik7Ci0JCX0KLQkJV29ya2JlbmNoQ29udGV4dCBjb250ZXh0ID0gbmV3IFdvcmtiZW5jaENvbnRleHQoKTsKLQkJTGlzdCBmaWxlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZmlsZUxpc3QuYWRkKEZpbGUuc2VwYXJhdG9yICsgdmFsaWRhdGVGaWxlUGF0aCk7Ci0JCWNvbnRleHQuc2V0VmFsaWRhdGlvbkZpbGVVUklzKGZpbGVMaXN0KTsKLQkJVGVzdFJlcG9ydGVyIHJlcG9ydGVyID0gbmV3IFRlc3RSZXBvcnRlcigpOwotCQl0cnl7Ci0JCQlzb3VyY2VWYWxpZGF0b3IudmFsaWRhdGUoY29udGV4dCwgcmVwb3J0ZXIpOwotCQl9Ci0JCWNhdGNoKFZhbGlkYXRpb25FeGNlcHRpb24gZSl7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCQotCQlhc3NlcnRUcnVlKCJObyBNZXNzYWdlcyB3ZXJlIHJlcG9ydGVkIG9uIGZpbGUgd2l0aCBpbnZhbGlkIFhQYXRoIDEuMC4iLCByZXBvcnRlci5pc01lc3NhZ2VSZXBvcnRlZCgpKTsJCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmFsaWRYU0xUKCkKLQl7Ci0JCVN0cmluZyBwcm9qTmFtZSA9IGdldHhzbFRlc3RGaWxlc1Byb2plY3ROYW1lKCk7Ci0JCVN0cmluZyBmaWxlTmFtZTEgPSAiTGlzdEFsbENoYW5nZVJlcXVlc3RzLnhzbCI7Ci0KLQkJU3RyaW5nIHZhbGlkYXRlRmlsZVBhdGggPSBwcm9qTmFtZSArIEZpbGUuc2VwYXJhdG9yICsgZmlsZU5hbWUxOwotCi0JCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkubmV3UHJvamVjdERlc2NyaXB0aW9uKHByb2pOYW1lKTsKLQotCQlJUHJvamVjdCBwcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2pOYW1lKTsKLQkJdHJ5IHsKLQkJCXByb2plY3QuY3JlYXRlKGRlc2NyaXB0aW9uLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCXByb2plY3Qub3BlbihuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCQotCQlJRmlsZSBmaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKG5ldyBQYXRoKHZhbGlkYXRlRmlsZVBhdGgpKTsKLQkJaWYgKGZpbGUgIT0gbnVsbCAmJiAhZmlsZS5leGlzdHMoKSkgewotCQkJZmFpbCgiVW5hYmxlIHRvIGxvY2F0ZSAiICsgZmlsZU5hbWUxICsgIiBzdHlsZXNoZWV0LiIpOwotCQl9Ci0JCVdvcmtiZW5jaENvbnRleHQgY29udGV4dCA9IG5ldyBXb3JrYmVuY2hDb250ZXh0KCk7Ci0JCUxpc3QgZmlsZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZpbGVMaXN0LmFkZChGaWxlLnNlcGFyYXRvciArIHZhbGlkYXRlRmlsZVBhdGgpOwotCQljb250ZXh0LnNldFZhbGlkYXRpb25GaWxlVVJJcyhmaWxlTGlzdCk7Ci0JCVRlc3RSZXBvcnRlciByZXBvcnRlciA9IG5ldyBUZXN0UmVwb3J0ZXIoKTsKLQkJdHJ5ewotCQkJc291cmNlVmFsaWRhdG9yLnZhbGlkYXRlKGNvbnRleHQsIHJlcG9ydGVyKTsKLQkJfQotCQljYXRjaChWYWxpZGF0aW9uRXhjZXB0aW9uIGUpewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQkKLQkJYXNzZXJ0RmFsc2UoIk1lc3NhZ2VzIHdlcmUgcmVwb3J0ZWQgb24gIiArIGZpbGVOYW1lMSArICIuIiwgcmVwb3J0ZXIuaXNNZXNzYWdlUmVwb3J0ZWQoKSk7CQkKLQl9Ci0JCi0JCi0JCi0JcHJpdmF0ZSBjbGFzcyBUZXN0UmVwb3J0ZXIgaW1wbGVtZW50cyBJUmVwb3J0ZXIKLQl7Ci0JCXByb3RlY3RlZCBib29sZWFuIG1lc3NhZ2VSZXBvcnRlZCA9IGZhbHNlOwotCQkKLQkJcHVibGljIFRlc3RSZXBvcnRlcigpewotCQkJCi0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIGFkZE1lc3NhZ2UoSVZhbGlkYXRvciBvcmlnaW4sIElNZXNzYWdlIG1lc3NhZ2UpIHsKLQkJCWlmIChtZXNzYWdlLmdldFNldmVyaXR5KCkgPT0gSU1lc3NhZ2UuSElHSF9TRVZFUklUWSkKLQkJCXsKLQkJCQltZXNzYWdlUmVwb3J0ZWQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBpc01lc3NhZ2VSZXBvcnRlZCgpCi0JCXsKLQkJCXJldHVybiBtZXNzYWdlUmVwb3J0ZWQ7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkaXNwbGF5U3VidGFzayhJVmFsaWRhdG9yIHZhbGlkYXRvciwgSU1lc3NhZ2UgbWVzc2FnZSkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkJCi0JCX0KLQotCQlwdWJsaWMgTGlzdCBnZXRNZXNzYWdlcygpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNDYW5jZWxsZWQoKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmVBbGxNZXNzYWdlcyhJVmFsaWRhdG9yIG9yaWdpbiwgT2JqZWN0IG9iamVjdCkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkJCi0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmVBbGxNZXNzYWdlcyhJVmFsaWRhdG9yIG9yaWdpbikgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkJCi0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmVNZXNzYWdlU3Vic2V0KElWYWxpZGF0b3IgdmFsaWRhdG9yLCBPYmplY3Qgb2JqLCBTdHJpbmcgZ3JvdXBOYW1lKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCQkKLQkJfQotCQkKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QueHNsLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL3Rlc3RzL0FjdGl2YXRvci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS90ZXN0cy9BY3RpdmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE0ZTExMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QueHNsLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL3Rlc3RzL0FjdGl2YXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLnVpLnRlc3RzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3RpdmF0b3IgZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQotCS8vIFRoZSBwbHVnLWluIElECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC54c2wudWkudGVzdHMiOwotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotCXByaXZhdGUgc3RhdGljIEFjdGl2YXRvciBwbHVnaW47Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEFjdGl2YXRvcigpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFjdGl2YXRvciBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS90ZXN0cy9Qcm9qZWN0VW56aXBVdGlsaXR5LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QueHNsLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL3Rlc3RzL1Byb2plY3RVbnppcFV0aWxpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGVhMmI4ZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QueHNsLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL3Rlc3RzL1Byb2plY3RVbnppcFV0aWxpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC51aS50ZXN0czsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLldvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLklPdmVyd3JpdGVRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS53aXphcmRzLmRhdGF0cmFuc2Zlci5GaWxlU3lzdGVtU3RydWN0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkud2l6YXJkcy5kYXRhdHJhbnNmZXIuSUltcG9ydFN0cnVjdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLndpemFyZHMuZGF0YXRyYW5zZmVyLkltcG9ydE9wZXJhdGlvbjsKLQotLyoqCi0gKiBJbXBvcnRzIHppcHBlZCBmaWxlcyBpbnRvIHRoZSB0ZXN0IHdvcmtzcGFjZS4gRGVsZXRlcyBhbGwgcHJvamVjdHMgaW4KLSAqIHdvcmtzcGFjZS4KLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIFByb2plY3RVbnppcFV0aWxpdHkgewotCWNsYXNzIFdvcmtzcGFjZVByb2dyZXNzTW9uaXRvciBpbXBsZW1lbnRzIElQcm9ncmVzc01vbml0b3IgewotCQlwcml2YXRlIGJvb2xlYW4gZmluaXNoZWQgPSBmYWxzZTsKLQotCQlwdWJsaWMgdm9pZCBiZWdpblRhc2soU3RyaW5nIG5hbWUsIGludCB0b3RhbFdvcmspIHsKLQkJCS8vIG5vb3AKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRvbmUoKSB7Ci0JCQlmaW5pc2hlZCA9IHRydWU7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc0ZpbmlzaGVkKCkgewotCQkJcmV0dXJuIGZpbmlzaGVkOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgaW50ZXJuYWxXb3JrZWQoZG91YmxlIHdvcmspIHsKLQkJCS8vIG5vb3AKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzQ2FuY2VsZWQoKSB7Ci0JCQlyZXR1cm4gZmluaXNoZWQ7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRDYW5jZWxlZChib29sZWFuIHZhbHVlKSB7Ci0JCQlpZiAodmFsdWUgPT0gdHJ1ZSkKLQkJCQlmaW5pc2hlZCA9IHRydWU7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRUYXNrTmFtZShTdHJpbmcgbmFtZSkgewotCQkJLy8gbm9vcAotCQl9Ci0KLQkJcHVibGljIHZvaWQgc3ViVGFzayhTdHJpbmcgbmFtZSkgewotCQkJLy8gbm9vcAotCQl9Ci0KLQkJcHVibGljIHZvaWQgd29ya2VkKGludCB3b3JrKSB7Ci0JCQkvLyBub29wCi0JCX0KLQl9Ci0KLQljbGFzcyBNeU92ZXJ3cml0ZVF1ZXJ5IGltcGxlbWVudHMgSU92ZXJ3cml0ZVF1ZXJ5IHsKLQkJcHVibGljIFN0cmluZyBxdWVyeU92ZXJ3cml0ZShTdHJpbmcgcGF0aFN0cmluZykgewotCQkJcmV0dXJuIEFMTDsKLQkJfQotCX0KLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBST0pFQ1RfWklQU19GT0xERVIgPSAicHJvamVjdHRlc3RmaWxlcyI7Ci0JcHJpdmF0ZSBMaXN0IGZDcmVhdGVkUHJvamVjdHMgPSBudWxsOwotCi0JcHVibGljIFByb2plY3RVbnppcFV0aWxpdHkoKSB7Ci0JCS8vIGZvciBkZWxldGlvbiBsYXRlcgotCQlmQ3JlYXRlZFByb2plY3RzID0gbmV3IEFycmF5TGlzdCgpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBmaWxlVG9JbXBvcnQKLQkgKiAgICAgICAgICAgIHRoZSBmaWxlIHlvdSB3aXNoIHRvIGltcG9ydAotCSAqIEBwYXJhbSBmb2xkZXJQYXRoCi0JICogICAgICAgICAgICB0aGUgY29udGFpbmVyIHBhdGggd2l0aGluIHRoZSB3b3Jrc3BhY2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbXBvcnRGaWxlKEZpbGUgZmlsZVRvSW1wb3J0LCBTdHJpbmcgZm9sZGVyUGF0aCkgewotCQlXb3Jrc3BhY2VQcm9ncmVzc01vbml0b3IgaW1wb3J0UHJvZ3Jlc3MgPSBuZXcgV29ya3NwYWNlUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCXRyeSB7Ci0JCQlpZiAoZmlsZVRvSW1wb3J0LmV4aXN0cygpKSB7Ci0JCQkJSVBhdGggY29udGFpbmVyUGF0aCA9IG5ldyBQYXRoKGZvbGRlclBhdGgpOwotCQkJCS8vZkNyZWF0ZWRQcm9qZWN0cy5hZGQoZm9sZGVyUGF0aCk7Ci0JCQkJSUltcG9ydFN0cnVjdHVyZVByb3ZpZGVyIHByb3ZpZGVyID0gRmlsZVN5c3RlbVN0cnVjdHVyZVByb3ZpZGVyLklOU1RBTkNFOwotCQkJCUlPdmVyd3JpdGVRdWVyeSBvdmVyd3JpdGVJbXBsZW1lbnRvciA9IG5ldyBNeU92ZXJ3cml0ZVF1ZXJ5KCk7Ci0JCQkJRmlsZVtdIGZpbGVzVG9JbXBvcnQgPSB7ZmlsZVRvSW1wb3J0fTsKLQkJCQlJbXBvcnRPcGVyYXRpb24gaW1wb3J0T3AgPSBuZXcgSW1wb3J0T3BlcmF0aW9uKGNvbnRhaW5lclBhdGgsIG51bGwsIHByb3ZpZGVyLCBvdmVyd3JpdGVJbXBsZW1lbnRvciwgQXJyYXlzLmFzTGlzdChmaWxlc1RvSW1wb3J0KSk7Ci0JCQkJaW1wb3J0T3Auc2V0Q3JlYXRlQ29udGFpbmVyU3RydWN0dXJlKGZhbHNlKTsKLQkJCQlpbXBvcnRPcC5zZXRPdmVyd3JpdGVSZXNvdXJjZXModHJ1ZSk7Ci0JCQkJaW1wb3J0T3AucnVuKGltcG9ydFByb2dyZXNzKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiaGFuZGxlIHNvdXJjZSBkb2Vzbid0IGV4aXN0Iik7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpbXBvcnRQcm9ncmVzcy5kb25lKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiB0aGUgZm9sbG93aW5nIGlzIGxvZ2ljIGZyb20KLQkgKiBodHRwOi8vd3d3LmRldnNoZWQuY29tL2MvYS9KYXZhL1ppcC1NZWV0cy1KYXZhLzIvCi0JICovCi0JLy8gc3BlY2lmeSBidWZmZXIgc2l6ZSBmb3IgZXh0cmFjdGlvbgotCXN0YXRpYyBmaW5hbCBpbnQgQlVGRkVSID0gMjA0ODsKLQotCXB1YmxpYyB2b2lkIHVuemlwQW5kSW1wb3J0KEZpbGUgaW5GaWxlLCBTdHJpbmcgZGVzdGluYXRpb25EaXJlY3RvcnkpIHsKLQkJdHJ5IHsKLQkJCS8vIFNwZWNpZnkgZmlsZSB0byBkZWNvbXByZXNzCi0JCQlTdHJpbmcgaW5GaWxlTmFtZSA9IGluRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsgLy8iYzovZXhhbXBsZS56aXAiOwotCQkJLy8gU3BlY2lmeSBkZXN0aW5hdGlvbiB3aGVyZSBmaWxlIHdpbGwgYmUgdW56aXBwZWQKLQkJCS8vU3RyaW5nIGRlc3RpbmF0aW9uRGlyZWN0b3J5ID0KLQkJCS8vICJkOi9lY2xpcHNlZGV2L001X1NTRV9URVNUU19XT1JLU1BBQ0UvIjsgLy8iYzovdGVtcC8iOwotCQkJRmlsZSBzb3VyY2VaaXBGaWxlID0gbmV3IEZpbGUoaW5GaWxlTmFtZSk7Ci0JCQlGaWxlIHVuemlwRGVzdGluYXRpb25EaXJlY3RvcnkgPSBuZXcgRmlsZShkZXN0aW5hdGlvbkRpcmVjdG9yeSk7Ci0JCQkvLyBPcGVuIFppcCBmaWxlIGZvciByZWFkaW5nCi0JCQlaaXBGaWxlIHppcEZpbGUgPSBuZXcgWmlwRmlsZShzb3VyY2VaaXBGaWxlLCBaaXBGaWxlLk9QRU5fUkVBRCk7Ci0JCQkvLyBDcmVhdGUgYW4gZW51bWVyYXRpb24gb2YgdGhlIGVudHJpZXMgaW4gdGhlIHppcCBmaWxlCi0JCQlFbnVtZXJhdGlvbiB6aXBGaWxlRW50cmllcyA9IHppcEZpbGUuZW50cmllcygpOwotCQkJU3RyaW5nIHByb2plY3RGb2xkZXJOYW1lID0gbnVsbDsKLQkJCUlQcm9qZWN0IGN1cnJlbnRQcm9qZWN0ID0gbnVsbDsKLQkJCS8vIFByb2Nlc3MgZWFjaCBlbnRyeQotCQkJd2hpbGUgKHppcEZpbGVFbnRyaWVzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJLy8gZ3JhYiBhIHppcCBmaWxlIGVudHJ5Ci0JCQkJWmlwRW50cnkgZW50cnkgPSAoWmlwRW50cnkpIHppcEZpbGVFbnRyaWVzLm5leHRFbGVtZW50KCk7Ci0JCQkJU3RyaW5nIGN1cnJlbnRFbnRyeSA9IGVudHJ5LmdldE5hbWUoKTsKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiRXh0cmFjdGluZzogIiArIGVudHJ5KTsKLQkJCQlGaWxlIGRlc3RGaWxlID0gbmV3IEZpbGUodW56aXBEZXN0aW5hdGlvbkRpcmVjdG9yeSwgY3VycmVudEVudHJ5KTsKLQkJCQkvLyBncmFiIGZpbGUncyBwYXJlbnQgZGlyZWN0b3J5IHN0cnVjdHVyZQotCQkJCUZpbGUgZGVzdGluYXRpb25QYXJlbnQgPSBkZXN0RmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0JCQkJLy8gY3JlYXRlIHRoZSBwYXJlbnQgZGlyZWN0b3J5IHN0cnVjdHVyZSBpZiBuZWVkZWQKLQkJCQlkZXN0aW5hdGlvblBhcmVudC5ta2RpcnMoKTsKLQkJCQkvLyBleHRyYWN0IGZpbGUgaWYgbm90IGEgZGlyZWN0b3J5Ci0JCQkJaWYgKCFlbnRyeS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJCUJ1ZmZlcmVkSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbSh6aXBGaWxlLmdldElucHV0U3RyZWFtKGVudHJ5KSk7Ci0JCQkJCWludCBjdXJyZW50Qnl0ZTsKLQkJCQkJLy8gZXN0YWJsaXNoIGJ1ZmZlciBmb3Igd3JpdGluZyBmaWxlCi0JCQkJCWJ5dGUgZGF0YVtdID0gbmV3IGJ5dGVbQlVGRkVSXTsKLQkJCQkJLy8gd3JpdGUgdGhlIGN1cnJlbnQgZmlsZSB0byBkaXNrCi0JCQkJCUZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZGVzdEZpbGUpOwotCQkJCQlCdWZmZXJlZE91dHB1dFN0cmVhbSBkZXN0ID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKGZvcywgQlVGRkVSKTsKLQkJCQkJLy8gcmVhZCBhbmQgd3JpdGUgdW50aWwgbGFzdCBieXRlIGlzIGVuY291bnRlcmVkCi0JCQkJCXdoaWxlICgoY3VycmVudEJ5dGUgPSBpcy5yZWFkKGRhdGEsIDAsIEJVRkZFUikpICE9IC0xKSB7Ci0JCQkJCQlkZXN0LndyaXRlKGRhdGEsIDAsIGN1cnJlbnRCeXRlKTsKLQkJCQkJfQotCQkJCQlkZXN0LmZsdXNoKCk7Ci0JCQkJCWRlc3QuY2xvc2UoKTsKLQkJCQkJaXMuY2xvc2UoKTsKLQkJCQkJaWYgKHByb2plY3RGb2xkZXJOYW1lICE9IG51bGwpCi0JCQkJCQlpbXBvcnRGaWxlKGRlc3RGaWxlLCBwcm9qZWN0Rm9sZGVyTmFtZSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyBuZWVkIGhhbmRsZSB0byB0aGUgbWFpbiBwcm9qZWN0IGZvbGRlciB0byBjcmVhdGUKLQkJCQkJLy8gY29udGFpbmVyUGF0aAotCQkJCQkvLyB1bmxpa2UgdmVyc2lvbiBpbiBzc2UudGVzdHMsIHdlIGRvbid0IGNyZWF0ZSBwcm9qZWN0Ci0JCQkJCS8vIGZvcgotCQkJCQkvLyBldmVyeSBkaXJlY3RvcnkKLQkJCQkJLy8JCQkJCWlmKHByb2plY3RGb2xkZXJOYW1lID09IG51bGwpIHsKLQkJCQkJLy8JCQkJCQlwcm9qZWN0Rm9sZGVyTmFtZSA9IGRlc3RGaWxlLmdldE5hbWUoKTsKLQkJCQkJLy8JCQkJCQlmQ3JlYXRlZFByb2plY3RzLmFkZChwcm9qZWN0Rm9sZGVyTmFtZSk7Ci0JCQkJCS8vCQkJCQkJCi0JCQkJCS8vCQkJCQkJY3VycmVudFByb2plY3QgPQotCQkJCQkvLyBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QocHJvamVjdEZvbGRlck5hbWUpOwotCQkJCQkvLwkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXppcEZpbGUuY2xvc2UoKTsKLQkJCS8vIGZpeGVzIHdvcmtzcGFjZSBtZXRhZGF0YSBmb3IgdGhlIHByb2plY3QKLQkJCS8vIGZvciBjbGVhbiBzdGFydHVwIG5leHQgcnVuCi0JCQlpZiAoY3VycmVudFByb2plY3QgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCVBhdGggcHJvamVjdExvY2F0aW9uID0gbmV3IFBhdGgoUGxhdGZvcm0uZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCkpOwotCQkJCQljcmVhdGVQcm9qZWN0KGN1cnJlbnRQcm9qZWN0LCBwcm9qZWN0TG9jYXRpb24sIG5ldyBXb3Jrc3BhY2VQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJfQotCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGNleCkgewotCQkJCQljZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCWlvZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoV29ya3NwYWNlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJV29ya3NwYWNlUm9vdCB3c1Jvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQlJUHJvamVjdFtdIHByb2plY3RzID0gd3NSb290LmdldFByb2plY3RzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCXByb2plY3RzW2ldLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUsIG51bGwpOwotCQl9Ci0JCXdzUm9vdC5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBEZWxldGUgcHJvamVjdHMgY3JlYXRlZCAodW56aXBwZWQgYW5kIGltcG9ydGVkKSBieSB0aGlzIHV0aWxpdHkKLQkgKiAKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0ZVByb2plY3RzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWZpbmFsIElQcm9qZWN0W10gcHJvamVjdHMgPSBnZXRDcmVhdGVkUHJvamVjdHMoKTsKLQkJV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uIGRlbGV0ZU9wID0gbmV3IFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbigpIHsKLQkJCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJCQlwcm9qZWN0c1tpXS5jbGVhckhpc3RvcnkobnVsbCk7Ci0JCQkJCXByb2plY3RzW2ldLmNsb3NlKG51bGwpOwotCQkJCQlwcm9qZWN0c1tpXS5kZWxldGUodHJ1ZSwgdHJ1ZSwgbnVsbCk7Ci0JCQkJfQotCQkJCXJlZnJlc2hXb3Jrc3BhY2UoKTsKLQkJCX0KLQkJfTsKLQkJV29ya3NwYWNlUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzID0gbmV3IFdvcmtzcGFjZVByb2dyZXNzTW9uaXRvcigpOwotCQlkZWxldGVPcC5ydW4ocHJvZ3Jlc3MpOwotCQkvLyBzYXZlcyB0aGUgbmV3IHdvcmtzcGFjZSBtZXRhZGF0YQotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuc2F2ZSh0cnVlLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZWxldGVQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWZpbmFsIFN0cmluZyBuYW1lID0gcHJvamVjdE5hbWU7Ci0JCUlXb3Jrc3BhY2VSb290IHdzUm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCWZpbmFsIElQcm9qZWN0IHByb2ogPSB3c1Jvb3QuZ2V0UHJvamVjdChuYW1lKTsKLQkJV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uIGRlbGV0ZU9wID0gbmV3IFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbihwcm9qKSB7Ci0JCQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCS8vCQkJCUlXb3Jrc3BhY2VSb290IHdzUm9vdCA9Ci0JCQkJLy8gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJCQkvLwkJCQlJUHJvamVjdCBwcm9qID0gd3NSb290LmdldFByb2plY3QobmFtZSk7Ci0JCQkJaWYgKHByb2ogIT0gbnVsbCAmJiBwcm9qLmV4aXN0cygpKSB7Ci0JCQkJCXByb2ouY2xlYXJIaXN0b3J5KG51bGwpOwotCQkJCQkvL3Byb2ouY2xvc2UobnVsbCk7Ci0JCQkJCXByb2oucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgbnVsbCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlwcm9qLmRlbGV0ZSh0cnVlLCB0cnVlLCBudWxsKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIGp1c3QgdHJ5IGFnYWluIChub3Qgc3VyZSB3aHkgdGhleSBhcmUgbm90IGJlaW5nCi0JCQkJCQkvLyBkZWxldGVkKQotCQkJCQkJcHJvai5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCBudWxsKTsKLQkJCQkJCXByb2ouZGVsZXRlKHRydWUsIHRydWUsIG51bGwpOwotCQkJCQl9Ci0JCQkJCS8vcHJvaiA9IG51bGw7Ci0JCQkJfQotCQkJCXJlZnJlc2hXb3Jrc3BhY2UoKTsKLQkJCX0KLQkJfTsKLQkJV29ya3NwYWNlUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzID0gbmV3IFdvcmtzcGFjZVByb2dyZXNzTW9uaXRvcigpOwotCQlkZWxldGVPcC5ydW4ocHJvZ3Jlc3MpOwotCQkvLyBzYXZlcyB0aGUgbmV3IHdvcmtzcGFjZSBtZXRhZGF0YQotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuc2F2ZSh0cnVlLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIElQcm9qZWN0cyB0aGF0IHdlcmUgdW56aXBwZWQgYW5kIGltcG9ydGVkIGludG8gdGhlIHdvcmtzcGFjZSBieQotCSAqICAgICAgICAgdGhpcyB1dGlsaXR5Ci0JICovCi0JcHVibGljIElQcm9qZWN0W10gZ2V0Q3JlYXRlZFByb2plY3RzKCkgewotCQlJV29ya3NwYWNlUm9vdCB3c1Jvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQlTdHJpbmdbXSBwcm9qZWN0TmFtZXMgPSAoU3RyaW5nW10pIGZDcmVhdGVkUHJvamVjdHMudG9BcnJheShuZXcgU3RyaW5nW2ZDcmVhdGVkUHJvamVjdHMuc2l6ZSgpXSk7Ci0JCUlQcm9qZWN0W10gcHJvamVjdHMgPSBuZXcgSVByb2plY3RbcHJvamVjdE5hbWVzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdE5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlwcm9qZWN0c1tpXSA9IHdzUm9vdC5nZXRQcm9qZWN0KHByb2plY3ROYW1lc1tpXSk7Ci0JCX0KLQkJcmV0dXJuIHByb2plY3RzOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRKYXZhUHJvamVjdChTdHJpbmcgcHJvak5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gcmVzeW5jaAotCQlyZWZyZXNoV29ya3NwYWNlKCk7Ci0JCS8vY2hhbmdlIHByZXJlcXMgdG8gZ2V0IHRoaXMgZnVuY3Rpb25hbGl0eSBiYWNrIGluCi0JCUlQcm9qZWN0IHByb2ogPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QocHJvak5hbWUpOwotCQlpZiAoIXByb2ouZXhpc3RzKCkpIHsKLQkJCXByb2ouY3JlYXRlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9Ci0JCS8vIG5lZWQgdG8gYWRkIGphdmEgbmF0dXJlLCBvciBlbHNlIHByb2plY3Qgd29uJ3QgImV4aXN0KCkiIGluIHRoZQotCQkvLyBqYXZhCi0JCS8vIGVsZW1lbnQgc2Vuc2UKLQkJU3RyaW5nW10gbmF0dXJlSWRzID0geyJvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlIn07Ci0JCWlmICghcHJvai5pc09wZW4oKSkgewotCQkJcHJvai5vcGVuKG51bGwpOwotCQl9Ci0JCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzYyA9IHByb2ouZ2V0RGVzY3JpcHRpb24oKTsKLQkJZGVzYy5zZXROYXR1cmVJZHMobmF0dXJlSWRzKTsKLQkJcHJvai5zZXREZXNjcmlwdGlvbihkZXNjLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlUHJvamVjdChJUHJvamVjdCBwcm9qZWN0LCBJUGF0aCBsb2NhdGlvblBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAobW9uaXRvciA9PSBudWxsKSB7Ci0JCQltb25pdG9yID0gbmV3IFdvcmtzcGFjZVByb2dyZXNzTW9uaXRvcigpOwotCQl9Ci0JCW1vbml0b3IuYmVnaW5UYXNrKCJjcmVhdGluZyB0ZXN0IHByb2plY3QiLCAxMCk7Ci0JCS8vIGNyZWF0ZSB0aGUgcHJvamVjdAotCQl0cnkgewotCQkJaWYgKCFwcm9qZWN0LmV4aXN0cygpKSB7Ci0JCQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjID0gcHJvamVjdC5nZXRXb3Jrc3BhY2UoKS5uZXdQcm9qZWN0RGVzY3JpcHRpb24ocHJvamVjdC5nZXROYW1lKCkpOwotCQkJCWlmIChQbGF0Zm9ybS5nZXRMb2NhdGlvbigpLmVxdWFscyhsb2NhdGlvblBhdGgpKSB7Ci0JCQkJCWxvY2F0aW9uUGF0aCA9IG51bGw7Ci0JCQkJfQotCQkJCWRlc2Muc2V0TG9jYXRpb24obG9jYXRpb25QYXRoKTsKLQkJCQlwcm9qZWN0LmNyZWF0ZShkZXNjLCBtb25pdG9yKTsKLQkJCQltb25pdG9yID0gbnVsbDsKLQkJCX0KLQkJCWlmICghcHJvamVjdC5pc09wZW4oKSkgewotCQkJCXByb2plY3Qub3Blbihtb25pdG9yKTsKLQkJCQltb25pdG9yID0gbnVsbDsKLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGRlbGV0ZVByb2plY3QoSVByb2plY3QgZlByb2plY3QpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCWZpbmFsIElQcm9qZWN0IHByb2ogPSBmUHJvamVjdDsKLQkJV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uIGRlbGV0ZU9wID0gbmV3IFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbihwcm9qKSB7Ci0JCQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCS8vCQkJCUlXb3Jrc3BhY2VSb290IHdzUm9vdCA9Ci0JCQkJLy8gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJCQkvLwkJCQlJUHJvamVjdCBwcm9qID0gd3NSb290LmdldFByb2plY3QobmFtZSk7Ci0JCQkJaWYgKHByb2ogIT0gbnVsbCAmJiBwcm9qLmV4aXN0cygpKSB7Ci0JCQkJCXByb2ouY2xlYXJIaXN0b3J5KG51bGwpOwotCQkJCQkvL3Byb2ouY2xvc2UobnVsbCk7Ci0JCQkJCXByb2oucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgbnVsbCk7Ci0JCQkJCXByb2ouZGVsZXRlKHRydWUsIHRydWUsIG51bGwpOwotCQkJCQkvL3Byb2ogPSBudWxsOwotCQkJCX0KLQkJCQlyZWZyZXNoV29ya3NwYWNlKCk7Ci0JCQl9Ci0JCX07Ci0JCS8vV29ya3NwYWNlUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzID0gbmV3IFdvcmtzcGFjZVByb2dyZXNzTW9uaXRvcigpOwotCQlkZWxldGVPcC5ydW4obnVsbCk7Ci0JCS8vIHNhdmVzIHRoZSBuZXcgd29ya3NwYWNlIG1ldGFkYXRhCi0JCS8vUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnNhdmUodHJ1ZSwgbnVsbCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS90ZXN0cy9VbnppcHBlZFByb2plY3RUZXN0ZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC54c2wudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvdGVzdHMvVW56aXBwZWRQcm9qZWN0VGVzdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM2YTdiZWQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS90ZXN0cy9VbnppcHBlZFByb2plY3RUZXN0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLnVpLnRlc3RzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNsLnVpLnRlc3RzLlByb2plY3RVbnppcFV0aWxpdHk7Ci0KLQotLyogCi0gKiBNYWRlIGFic3RyYWN0LCBzbyB3b24ndCBiZSBhdXRvbWF0aWNhbGx5IHBpY2tlZCB1cCBhcyB0ZXN0IChzaW5jZSBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkKS4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFVuemlwcGVkUHJvamVjdFRlc3RlciBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXByb3RlY3RlZCBzdGF0aWMgSVByb2plY3QgZlRlc3RQcm9qZWN0OwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZlRlc3RQcm9qZWN0SW5pdGlhbGl6ZWQ7Ci0JcHJpdmF0ZSBzdGF0aWMgaW50IG5TZXR1cHMgPSAwOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1BST0pFQ1RfTkFNRSA9ICJ4c2x0ZXN0ZmlsZXMiOwotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJblNldHVwcysrOwotCQlpZiAoIWZUZXN0UHJvamVjdEluaXRpYWxpemVkKSB7Ci0JCQlnZXRBbmRDcmVhdGVQcm9qZWN0KCk7Ci0JCQkvLyB1bnppcCBmaWxlcyB0byB0aGUgcm9vdCBvZiB3b3Jrc3BhY2UgZGlyZWN0b3J5Ci0JCQlTdHJpbmcgZGVzdGluYXRpb25Qcm9qZWN0U3RyaW5nID0gZlRlc3RQcm9qZWN0LmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpOwotCQkJU3RyaW5nIGRlc3RpbmF0aW9uRm9sZGVyID0gZGVzdGluYXRpb25Qcm9qZWN0U3RyaW5nICsgIi8iOwotCQkJRmlsZSB6aXBGaWxlID0gWFNMTW9kZWxYTUxUZXN0c1BsdWdpbi5nZXRUZXN0RmlsZSgicHJvamVjdGZpbGVzL3Byb2plY3RmaWxlcy56aXAiKTsKLQkJCVByb2plY3RVbnppcFV0aWxpdHkgcHJvalV0aWwgPSBuZXcgUHJvamVjdFVuemlwVXRpbGl0eSgpOwotCQkJcHJvalV0aWwudW56aXBBbmRJbXBvcnQoemlwRmlsZSwgZGVzdGluYXRpb25Gb2xkZXIpOwotCQkJcHJvalV0aWwuaW5pdEphdmFQcm9qZWN0KFRFU1RfUFJPSkVDVF9OQU1FKTsKLQkJCWZUZXN0UHJvamVjdC5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCBudWxsKTsKLQkJCWZUZXN0UHJvamVjdEluaXRpYWxpemVkID0gdHJ1ZTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JCW5TZXR1cHMtLTsKLQkJaWYgKG5TZXR1cHMgPT0gMCkgewotCQkJaWYgKCFERUJVRykgewotCQkJCS8vCQkJCURpc3BsYXkgZGlzcGxheSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpOwotCQkJCS8vCQkJCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkvLwkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCS8vCQkJCQkJUHJvamVjdFVuemlwVXRpbGl0eSBwcm9qVXRpbCA9IG5ldyBQcm9qZWN0VW56aXBVdGlsaXR5KCk7Ci0JCQkJLy8JCQkJCQlJUHJvamVjdCBwcm9qID0gZlRlc3RQcm9qZWN0OwotCQkJCS8vCQkJCQkJZlRlc3RQcm9qZWN0ID0gbnVsbDsKLQkJCQkvLwkJCQkJCXRyeSB7Ci0JCQkJLy8JCQkJCQkJcHJvalV0aWwuZGVsZXRlUHJvamVjdChwcm9qKTsKLQkJCQkvLwkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8JCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkvLwkJCQkJCX0KLQkJCQkvLwkJCQkJfQotCQkJCS8vCQkJCX0pOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBnZXRBbmRDcmVhdGVQcm9qZWN0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvL1Rlc3RzUGx1Z2luIHRlc3RzUGx1Z2luID0gKFRlc3RzUGx1Z2luKQotCQkvLyBQbGF0Zm9ybS5nZXRQbHVnaW4oIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy50ZXN0cyIpOwotCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IGdldFdvcmtzcGFjZSgpOwotCQlJV29ya3NwYWNlUm9vdCByb290ID0gd29ya3NwYWNlLmdldFJvb3QoKTsKLQkJZlRlc3RQcm9qZWN0ID0gcm9vdC5nZXRQcm9qZWN0KFRFU1RfUFJPSkVDVF9OQU1FKTsKLQkJCi0JCS8vIHRoaXMgZm9ybSBjcmVhdGVzIHByb2plY3QgYXMgImxpbmtlZCIgYmFjayB0byAnZmlsZVJvb3QnCi0JCS8vY3JlYXRlUHJvamVjdCh0ZXN0UHJvamVjdCwgbmV3IFBhdGgoZmlsZVJvb3QpLCBudWxsKTsKLQkJY3JlYXRlUHJvamVjdChmVGVzdFByb2plY3QsIG51bGwsIG51bGwpOwotCQlmVGVzdFByb2plY3QucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgbnVsbCk7Ci0JCWFzc2VydFRydWUoZlRlc3RQcm9qZWN0LmV4aXN0cygpKTsKLQkJCi0JCS8vCQlJQ29udGFpbmVyIGRvdGVzdEZpbGVzID0gdGVzdFByb2plY3QuZ2V0Rm9sZGVyKCJkb3Rlc3RGaWxlcyIpOwotCQkvLwkJYXNzZXJ0VHJ1ZShkb3Rlc3RGaWxlcy5leGlzdHMoKSk7Ci0JCS8vCQlJUmVzb3VyY2VbXSBhbGxGb2xkZXJzID0gZG90ZXN0RmlsZXMubWVtYmVycygpOwotCQkvLwkJYXNzZXJ0Tm90TnVsbChhbGxGb2xkZXJzKTsKLQl9Ci0gCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjcmVhdGVQcm9qZWN0KElQcm9qZWN0IHByb2plY3QsIElQYXRoIGxvY2F0aW9uUGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChtb25pdG9yID09IG51bGwpIHsKLQkJCW1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQl9Ci0JCW1vbml0b3IuYmVnaW5UYXNrKCJjcmVhdGluZyB0ZXN0IHByb2plY3QiLCAxMCk7Ci0JCS8vIGNyZWF0ZSB0aGUgcHJvamVjdAotCQl0cnkgewotCQkJaWYgKCFwcm9qZWN0LmV4aXN0cygpKSB7Ci0JCQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjID0gcHJvamVjdC5nZXRXb3Jrc3BhY2UoKS5uZXdQcm9qZWN0RGVzY3JpcHRpb24ocHJvamVjdC5nZXROYW1lKCkpOwotCQkJCWlmIChQbGF0Zm9ybS5nZXRMb2NhdGlvbigpLmVxdWFscyhsb2NhdGlvblBhdGgpKSB7Ci0JCQkJCWxvY2F0aW9uUGF0aCA9IG51bGw7Ci0JCQkJfQotCQkJCWRlc2Muc2V0TG9jYXRpb24obG9jYXRpb25QYXRoKTsKLQkJCQlwcm9qZWN0LmNyZWF0ZShkZXNjLCBtb25pdG9yKTsKLQkJCQltb25pdG9yID0gbnVsbDsKLQkJCX0KLQkJCWlmICghcHJvamVjdC5pc09wZW4oKSkgewotCQkJCXByb2plY3Qub3Blbihtb25pdG9yKTsKLQkJCQltb25pdG9yID0gbnVsbDsKLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdvcmtzcGFjZSBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlKCkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC54c2wudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvdGVzdHMvWFNMTW9kZWxYTUxUZXN0c1BsdWdpbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS90ZXN0cy9YU0xNb2RlbFhNTFRlc3RzUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFmNDljYTQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS90ZXN0cy9YU0xNb2RlbFhNTFRlc3RzUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzbC51aS50ZXN0czsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBYU0xNb2RlbFhNTFRlc3RzUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQkvL1RoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgWFNMTW9kZWxYTUxUZXN0c1BsdWdpbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIFhTTE1vZGVsWE1MVGVzdHNQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgWFNMTW9kZWxYTUxUZXN0c1BsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0cmluZyBmcm9tIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsCi0JICogb3IgJ2tleScgaWYgbm90IGZvdW5kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIGtleTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsCi0JICovCi0JcHVibGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFVSTCBnZXRJbnN0YWxsTG9jYXRpb24oKSB7Ci0JCVVSTCBpbnN0YWxsTG9jYXRpb24gPSBQbGF0Zm9ybS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLndzdC54c2wudWkudGVzdHMiKS5nZXRFbnRyeSgiLyIpOwotCQlVUkwgcmVzb2x2ZWRMb2NhdGlvbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlyZXNvbHZlZExvY2F0aW9uID0gRmlsZUxvY2F0b3IucmVzb2x2ZShpbnN0YWxsTG9jYXRpb24pOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpbXBvc3NpYmxlCi0JCQl0aHJvdyBuZXcgRXJyb3IoZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc29sdmVkTG9jYXRpb247Ci0JfQotCi0JcHVibGljIHN0YXRpYyBGaWxlIGdldFRlc3RGaWxlKFN0cmluZyBmaWxlcGF0aCkgewotCQlVUkwgaW5zdGFsbFVSTCA9IGdldEluc3RhbGxMb2NhdGlvbigpOwotCQkvL1N0cmluZyBzY2hlbWUgPSBpbnN0YWxsVVJMLmdldFByb3RvY29sKCk7Ci0JCVN0cmluZyBwYXRoID0gaW5zdGFsbFVSTC5nZXRQYXRoKCk7Ci0JCVN0cmluZyBsb2NhdGlvbiA9IHBhdGggKyBmaWxlcGF0aDsKLQkJRmlsZSByZXN1bHQgPSBuZXcgRmlsZShsb2NhdGlvbik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS90ZXN0cy9YU0xVSVRlc3RTdWl0ZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS90ZXN0cy9YU0xVSVRlc3RTdWl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNWIyMTBlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC54c2wudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvdGVzdHMvWFNMVUlUZXN0U3VpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLnVpLnRlc3RzOwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC52YWxpZGF0aW9uLlRlc3REZWxlZ2F0aW5nU291cmNlVmFsaWRhdG9yRm9yWFNMOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wudWkudGVzdHMuZWRpdG9yLlRlc3RFeGNsdWRlUmVzdWx0UHJlZml4ZXNDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC51aS50ZXN0cy5lZGl0b3IuWFNMQ29tcGxldGlvblRlc3Q7Ci0KLQotcHVibGljIGNsYXNzIFhTTFVJVGVzdFN1aXRlIGV4dGVuZHMgVGVzdFN1aXRlIHsKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgWFNMVUlUZXN0U3VpdGUoKTsKLQl9Ci0KLQlwdWJsaWMgWFNMVUlUZXN0U3VpdGUoKSB7Ci0JCXN1cGVyKCJYTUwgVUkgVGVzdCBTdWl0ZSIpOwotCQlhZGRUZXN0U3VpdGUoVGVzdERlbGVnYXRpbmdTb3VyY2VWYWxpZGF0b3JGb3JYU0wuY2xhc3MpOwotCQlhZGRUZXN0U3VpdGUoWFNMQ29tcGxldGlvblRlc3QuY2xhc3MpOwotCQlhZGRUZXN0U3VpdGUoVGVzdEV4Y2x1ZGVSZXN1bHRQcmVmaXhlc0NvbXBsZXRpb25Qcm9wb3NhbC5jbGFzcyk7Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QueHNsLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL3Rlc3RzL1hTTFVJVGVzdHNQbHVnaW4uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC54c2wudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvdGVzdHMvWFNMVUlUZXN0c1BsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxOWQ5ZGQ1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC54c2wudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvdGVzdHMvWFNMVUlUZXN0c1BsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLnVpLnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBYU0xVSVRlc3RzUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JLy9UaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIFhTTFVJVGVzdHNQbHVnaW4gcGx1Z2luOwotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBYU0xVSVRlc3RzUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB1cG9uIHBsdWctaW4gYWN0aXZhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBwbHVnLWluIGlzIHN0b3BwZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgWFNMVUlUZXN0c1BsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0cmluZyBmcm9tIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsCi0JICogb3IgJ2tleScgaWYgbm90IGZvdW5kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIGtleTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsCi0JICovCi0JcHVibGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS90ZXN0cy9lZGl0b3IvVGVzdEV4Y2x1ZGVSZXN1bHRQcmVmaXhlc0NvbXBsZXRpb25Qcm9wb3NhbC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LnhzbC51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzbC91aS90ZXN0cy9lZGl0b3IvVGVzdEV4Y2x1ZGVSZXN1bHRQcmVmaXhlc0NvbXBsZXRpb25Qcm9wb3NhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2FkMDk3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC54c2wudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvdGVzdHMvZWRpdG9yL1Rlc3RFeGNsdWRlUmVzdWx0UHJlZml4ZXNDb21wbGV0aW9uUHJvcG9zYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSBTdGFuZGFyZHMgZm9yIFRlY2hub2xvZ3kgaW4gQXV0b21vdGl2ZSBSZXRhaWwgYW5kIG90aGVycwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEYXZpZCBDYXJ2ZXIgLSBTVEFSIC0gYnVnIDIzMDEzNiAtIGludGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLnVpLnRlc3RzLmVkaXRvcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXhjZXB0aW9ucy5SZXNvdXJjZUFscmVhZHlFeGlzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV4Y2VwdGlvbnMuUmVzb3VyY2VJblVzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU3RydWN0dXJlZFRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkNvbnRlbnRBc3Npc3RVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuWE1MRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uWFNMOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5YU0xDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wudWkudGVzdHMuVW56aXBwZWRQcm9qZWN0VGVzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2wudWkudGVzdHMuWFNMVUlUZXN0c1BsdWdpbjsKLQotLyoqCi0gKiBUZXN0cyBldmVyeXRoaW5nIGFib3V0IGNvZGUgY29tcGxldGlvbiBhbmQgY29kZSBhc3Npc3RhbmNlLgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0RXhjbHVkZVJlc3VsdFByZWZpeGVzQ29tcGxldGlvblByb3Bvc2FsIGV4dGVuZHMgVW56aXBwZWRQcm9qZWN0VGVzdGVyIHsKLQotCXByb3RlY3RlZCBTdHJpbmcgcHJvamVjdE5hbWUgPSBudWxsOwotCXByb3RlY3RlZCBTdHJpbmcgZmlsZU5hbWUgPSBudWxsOwotCXByb3RlY3RlZCBJRmlsZSBmaWxlID0gbnVsbDsKLQlwcm90ZWN0ZWQgSUVkaXRvclBhcnQgdGV4dEVkaXRvclBhcnQgPSBudWxsOwotCXByb3RlY3RlZCBJVGV4dEVkaXRvciBlZGl0b3IgPSBudWxsOwotCi0JcHJvdGVjdGVkIFhNTERvY3VtZW50TG9hZGVyIHhtbERvY3VtZW50TG9hZGVyID0gbnVsbDsKLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0JcHJvdGVjdGVkIFN0cnVjdHVyZWRUZXh0Vmlld2VyIHNvdXJjZVZpZXdlciA9IG51bGw7Ci0JCi0JcHVibGljIFRlc3RFeGNsdWRlUmVzdWx0UHJlZml4ZXNDb21wbGV0aW9uUHJvcG9zYWwoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQkKLQkvKioKLQkgKiBTZXR1cCB0aGUgbmVjZXNzYXJ5IHByb2plY3RzLCBmaWxlcywgYW5kIHNvdXJjZSB2aWV3ZXIgZm9yIHRoZQotCSAqIHRlc3RzLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXNldHVwUHJvamVjdCgpOwotCQkKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkRmlsZUZvclRlc3RpbmcoU3RyaW5nIHhzbEZpbGVQYXRoKQotCQkJdGhyb3dzIFJlc291cmNlQWxyZWFkeUV4aXN0cywgUmVzb3VyY2VJblVzZSwgSU9FeGNlcHRpb24sCi0JCQlDb3JlRXhjZXB0aW9uIHsKLQkJZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShuZXcgUGF0aCh4c2xGaWxlUGF0aCkpOwotCQlpZiAoZmlsZSAhPSBudWxsICYmICFmaWxlLmV4aXN0cygpKSB7Ci0JCQlBc3NlcnQuZmFpbCgiVW5hYmxlIHRvIGxvY2F0ZSAiICsgZmlsZU5hbWUgKyAiIHN0eWxlc2hlZXQuIik7Ci0JCX0KLQkJCi0JCWxvYWRYU0xGaWxlKCk7Ci0JCQotCQlpbml0aWFsaXplU291cmNlVmlld2VyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVNvdXJjZVZpZXdlcigpIHsKLQkJLy8gc29tZSB0ZXN0IGVudmlyb25tZW50cyBtaWdodCBub3QgaGF2ZSBhICJyZWFsIiBkaXNwbGF5Ci0JCWlmKERpc3BsYXkuZ2V0Q3VycmVudCgpICE9IG51bGwpIHsKLQkJCQotCQkJU2hlbGwgc2hlbGwgPSBudWxsOwotCQkJQ29tcG9zaXRlIHBhcmVudCA9IG51bGw7Ci0JCQkKLQkJCWlmKFBsYXRmb3JtVUkuaXNXb3JrYmVuY2hSdW5uaW5nKCkpIHsKLQkJCQlzaGVsbCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKTsKLQkJCX0KLQkJCWVsc2UgewkKLQkJCQlzaGVsbCA9IG5ldyBTaGVsbChEaXNwbGF5LmdldEN1cnJlbnQoKSk7Ci0JCQl9Ci0JCQlwYXJlbnQgPSBuZXcgQ29tcG9zaXRlKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCQkKLQkJCS8vIGR1bW15IHZpZXdlcgotCQkJc291cmNlVmlld2VyID0gbmV3IFN0cnVjdHVyZWRUZXh0Vmlld2VyKHBhcmVudCwgbnVsbCwgbnVsbCwgZmFsc2UsIFNXVC5OT05FKTsKLQkJfQotCQllbHNlIHsKLQkJCUFzc2VydC5mYWlsKCJVbmFibGUgdG8gcnVuIHRoZSB0ZXN0IGFzIGEgZGlzcGxheSBtdXN0IGJlIGF2YWlsYWJsZS4iKTsKLQkJfQotCQkKLQkJY29uZmlndXJlU291cmNlVmlld2VyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU291cmNlVmlld2VyKCkgewotCQlzb3VyY2VWaWV3ZXIuY29uZmlndXJlKG5ldyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25YU0woKSk7Ci0JCQotICAgICAgICBzb3VyY2VWaWV3ZXIuc2V0RG9jdW1lbnQoZG9jdW1lbnQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGxvYWRYU0xGaWxlKCkgdGhyb3dzIFJlc291cmNlQWxyZWFkeUV4aXN0cywgUmVzb3VyY2VJblVzZSwKLQkJCUlPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJSU1vZGVsTWFuYWdlciBtb2RlbE1hbmFnZXIgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpOwotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbW9kZWxNYW5hZ2VyLmdldE5ld01vZGVsRm9yRWRpdChmaWxlLCB0cnVlKTsKLQkJZG9jdW1lbnQgPSBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXR1cFByb2plY3QoKSB7Ci0JCXByb2plY3ROYW1lID0gInhzbHRlc3RmaWxlcyI7Ci0JCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkubmV3UHJvamVjdERlc2NyaXB0aW9uKHByb2plY3ROYW1lKTsKLQotCQlJUHJvamVjdCBwcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLQkJdHJ5IHsKLQkJCXByb2plY3QuY3JlYXRlKGRlc2NyaXB0aW9uLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCXByb2plY3Qub3BlbihuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIGNvbnRlbnQgY29tcGxldGlvbiBwcm9wb3NhbHMgYXQgPGNvZGU+bGluZU51bWJlcjwvY29kZT4sIDxjb2RlPmNvbHVtbk51bWJlcjwvY29kZT4uCi0JICogQHBhcmFtIGxpbmVOdW1iZXIKLQkgKiBAcGFyYW0gY29sdW1uTnVtYmVyCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSBJQ29tcGxldGlvblByb3Bvc2FsW10gZ2V0UHJvcG9zYWxzKGludCBvZmZzZXQpIHRocm93cyBFeGNlcHRpb24gewotICAgIAlyZXR1cm4gbmV3IFhTTENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKS5jb21wdXRlQ29tcGxldGlvblByb3Bvc2Fscyhzb3VyY2VWaWV3ZXIsIG9mZnNldCk7IAotCX0KLQkKLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWxsRGVmYXVsdFZhbHVlTm9Qcm9wb3NhbHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZmlsZU5hbWUgPSAiVGVzdFJlc3VsdFByZWZpeGVzLnhzbCI7Ci0JCVN0cmluZyB4c2xGaWxlUGF0aCA9IHByb2plY3ROYW1lICsgRmlsZS5zZXBhcmF0b3IgKyBmaWxlTmFtZTsKLQkJbG9hZEZpbGVGb3JUZXN0aW5nKHhzbEZpbGVQYXRoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCA9IChJU3RydWN0dXJlZERvY3VtZW50KSBzb3VyY2VWaWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQkJLy8gQ29sdW1uIGlzIG9mZiBieSBvbmUgd2hlbiBjYWxjdWxhdGluZyBmb3IgdGhlIG9mZnNldCBwb3NpdGlvbgotCQlpbnQgY29sdW1uID0gMjk7Ci0JCWludCBsaW5lID0gMjsKLQkJCi0JCWludCBvZmZzZXQgPSBkb2N1bWVudC5nZXRMaW5lT2Zmc2V0KGxpbmUpICsgY29sdW1uOwotCQlhc3NlcnRFcXVhbHMoIkxpbmUgT2Zmc2V0IGluY29ycmVjdDoiLCAxNDcsIG9mZnNldCk7Ci0gICAgCQotICAgIAlJQ29tcGxldGlvblByb3Bvc2FsW10gcHJvcG9zYWxzID0gZ2V0UHJvcG9zYWxzKG9mZnNldCk7Ci0gICAgCWFzc2VydE51bGwoIkZvdW5kIHByb3Bvc2FscyB3aGVuICNhbGwgYWxyZWFkeSBpbiByZXN1bHQgdmFsdWUuIiwgcHJvcG9zYWxzKTsKLSAgICAJc291cmNlVmlld2VyID0gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdFhIVE1MTmFtZXNwYWNlUHJvcHNvYWxBdmFpbGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZmlsZU5hbWUgPSAiVGVzdFJlc3VsdFByZWZpeGVzRW1wdHkueHNsIjsKLQkJU3RyaW5nIHhzbEZpbGVQYXRoID0gcHJvamVjdE5hbWUgKyBGaWxlLnNlcGFyYXRvciArIGZpbGVOYW1lOwotCQlsb2FkRmlsZUZvclRlc3RpbmcoeHNsRmlsZVBhdGgpOwotCQlJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50ID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHNvdXJjZVZpZXdlci5nZXREb2N1bWVudCgpOwotCQkvLyBDb2x1bW4gaXMgb2ZmIGJ5IG9uZSB3aGVuIGNhbGN1bGF0aW5nIGZvciB0aGUgb2Zmc2V0IHBvc2l0aW9uCi0JCWludCBjb2x1bW4gPSAyOTsKLQkJaW50IGxpbmUgPSAyOwotCQkKLQkJaW50IG9mZnNldCA9IGRvY3VtZW50LmdldExpbmVPZmZzZXQobGluZSkgKyBjb2x1bW47Ci0JCWFzc2VydEVxdWFscygiTGluZSBPZmZzZXQgaW5jb3JyZWN0OiIsIDE0Nywgb2Zmc2V0KTsKLQkJCi0gICAgCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBwcm9wb3NhbHMgPSBnZXRQcm9wb3NhbHMob2Zmc2V0KTsKLSAgICAJYXNzZXJ0Tm90TnVsbCgiRGlkIG5vdCBmaW5kIHByb3Bvc2Fscy4iLCBwcm9wb3NhbHMpOwotICAgIAlhc3NlcnRFcXVhbHMoIlByb3Bvc2FsIGxlbmd0aCBub3QgMi4iLCAyLCBwcm9wb3NhbHMubGVuZ3RoICk7Ci0gICAgCWFzc2VydEVxdWFscygiUHJvcG9zYWwgZGlkIG5vdCBmaW5kIHhodG1sIGFzIHByb3Bvc2FsIHZhbHVlLiIsICJ4aHRtbCIsIHByb3Bvc2Fsc1sxXS5nZXREaXNwbGF5U3RyaW5nKCkpOwotICAgIAlzb3VyY2VWaWV3ZXIgPSBudWxsOwotICAgIAkKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEFsbFByb3Bzb2FsQXZhaWxhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWZpbGVOYW1lID0gIlRlc3RSZXN1bHRQcmVmaXhlc0VtcHR5LnhzbCI7Ci0JCVN0cmluZyB4c2xGaWxlUGF0aCA9IHByb2plY3ROYW1lICsgRmlsZS5zZXBhcmF0b3IgKyBmaWxlTmFtZTsKLQkJbG9hZEZpbGVGb3JUZXN0aW5nKHhzbEZpbGVQYXRoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCA9IChJU3RydWN0dXJlZERvY3VtZW50KSBzb3VyY2VWaWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQkJLy8gQ29sdW1uIGlzIG9mZiBieSBvbmUgd2hlbiBjYWxjdWxhdGluZyBmb3IgdGhlIG9mZnNldCBwb3NpdGlvbgotCQlpbnQgY29sdW1uID0gMjk7Ci0JCWludCBsaW5lID0gMjsKLQkJCi0JCWludCBvZmZzZXQgPSBkb2N1bWVudC5nZXRMaW5lT2Zmc2V0KGxpbmUpICsgY29sdW1uOwotCQlhc3NlcnRFcXVhbHMoIkxpbmUgT2Zmc2V0IGluY29ycmVjdDoiLCAxNDcsIG9mZnNldCk7Ci0JCQotICAgIAlJQ29tcGxldGlvblByb3Bvc2FsW10gcHJvcG9zYWxzID0gZ2V0UHJvcG9zYWxzKG9mZnNldCk7Ci0gICAgCWFzc2VydE5vdE51bGwoIkRpZCBub3QgZmluZCBwcm9wb3NhbHMuIiwgcHJvcG9zYWxzKTsKLSAgICAJYXNzZXJ0RXF1YWxzKCJQcm9wb3NhbCBsZW5ndGggbm90IDIuIiwgMiwgcHJvcG9zYWxzLmxlbmd0aCApOwotICAgIAlhc3NlcnRFcXVhbHMoIlByb3Bvc2FsIGRpZCBub3QgZmluZCB4aHRtbCBhcyBwcm9wb3NhbCB2YWx1ZS4iLCAiI2FsbCIsIHByb3Bvc2Fsc1swXS5nZXREaXNwbGF5U3RyaW5nKCkpOwotICAgIAlzb3VyY2VWaWV3ZXIgPSBudWxsOwotICAgIAkKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEV4Y2x1ZGVYSFRNTFByb3Bvc2FsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWZpbGVOYW1lID0gIlRlc3RSZXN1bHRQcmVmaXhlc1dpdGhYaHRtbC54c2wiOwotCQlTdHJpbmcgeHNsRmlsZVBhdGggPSBwcm9qZWN0TmFtZSArIEZpbGUuc2VwYXJhdG9yICsgZmlsZU5hbWU7Ci0JCWxvYWRGaWxlRm9yVGVzdGluZyh4c2xGaWxlUGF0aCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQgPSAoSVN0cnVjdHVyZWREb2N1bWVudCkgc291cmNlVmlld2VyLmdldERvY3VtZW50KCk7Ci0JCS8vIENvbHVtbiBpcyBvZmYgYnkgb25lIHdoZW4gY2FsY3VsYXRpbmcgZm9yIHRoZSBvZmZzZXQgcG9zaXRpb24KLQkJaW50IGNvbHVtbiA9IDM1OwotCQlpbnQgbGluZSA9IDI7Ci0JCWludCBvZmZzZXQgPSBkb2N1bWVudC5nZXRMaW5lT2Zmc2V0KGxpbmUpICsgY29sdW1uOwotCQkKLSAgICAJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHByb3Bvc2FscyA9IGdldFByb3Bvc2FscyhvZmZzZXQpOwotICAgIAlhc3NlcnROb3ROdWxsKCJEaWQgbm90IGZpbmQgcHJvcG9zYWxzLiIsIHByb3Bvc2Fscyk7Ci0gICAgCQotICAgIAlmb3IgKGludCBjbnQgPSAwOyBjbnQgPCBwcm9wb3NhbHMubGVuZ3RoOyBjbnQrKykgewotICAgIAkJaWYgKHByb3Bvc2Fsc1tjbnRdLmdldERpc3BsYXlTdHJpbmcoKS5lcXVhbHMoInhodG1sIikpIHsKLSAgICAJICAgIAlzb3VyY2VWaWV3ZXIgPSBudWxsOwotICAgIAkJCWZhaWwoIlhIVE1MIFByb3Bvc2FsIGZvdW5kLCB3aGVuIGl0IHNob3VsZCBub3QgaGF2ZSBiZWVuISIpOwotICAgIAkJfQotICAgIAl9Ci0gICAgCXNvdXJjZVZpZXdlciA9IG51bGw7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RUZXN0UHJvcG9zYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZmlsZU5hbWUgPSAiVGVzdFJlc3VsdFByZWZpeGVzV2l0aFhodG1sLnhzbCI7Ci0JCVN0cmluZyB4c2xGaWxlUGF0aCA9IHByb2plY3ROYW1lICsgRmlsZS5zZXBhcmF0b3IgKyBmaWxlTmFtZTsKLQkJbG9hZEZpbGVGb3JUZXN0aW5nKHhzbEZpbGVQYXRoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCA9IChJU3RydWN0dXJlZERvY3VtZW50KSBzb3VyY2VWaWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQkJLy8gQ29sdW1uIGlzIG9mZiBieSBvbmUgd2hlbiBjYWxjdWxhdGluZyBmb3IgdGhlIG9mZnNldCBwb3NpdGlvbgotCQlpbnQgY29sdW1uID0gMzU7Ci0JCWludCBsaW5lID0gMjsKLQkJaW50IG9mZnNldCA9IGRvY3VtZW50LmdldExpbmVPZmZzZXQobGluZSkgKyBjb2x1bW47Ci0JCQotICAgIAlJQ29tcGxldGlvblByb3Bvc2FsW10gcHJvcG9zYWxzID0gZ2V0UHJvcG9zYWxzKG9mZnNldCk7Ci0gICAgCWFzc2VydE5vdE51bGwoIkRpZCBub3QgZmluZCBwcm9wb3NhbHMuIiwgcHJvcG9zYWxzKTsKLSAgICAJYXNzZXJ0RmFsc2UoIlByb3Bvc2FscyByZXR1cm5lZCBtb3JlIHRoYW4gb25lLiIsIHByb3Bvc2Fscy5sZW5ndGggPiAxKTsKLSAgICAJYXNzZXJ0RXF1YWxzKCJEaWQgbm90IGZpbmQgdGVzdCBpbiBwcm9wb3NhbCBsaXN0IiwgInRlc3QiLCBwcm9wb3NhbHNbMF0uZ2V0RGlzcGxheVN0cmluZygpKTsKLSAgICAJCi0gICAgCXNvdXJjZVZpZXdlciA9IG51bGw7Ci0gICAgfQotICAgIAotICAgIAotICAgIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC54c2wudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvdGVzdHMvZWRpdG9yL1hTTENvbXBsZXRpb25UZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QueHNsLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QveHNsL3VpL3Rlc3RzL2VkaXRvci9YU0xDb21wbGV0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyZDA4MTRlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC54c2wudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC94c2wvdWkvdGVzdHMvZWRpdG9yL1hTTENvbXBsZXRpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgU3RhbmRhcmRzIGZvciBUZWNobm9sb2d5IGluIEF1dG9tb3RpdmUgUmV0YWlsIGFuZCBvdGhlcnMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRGF2aWQgQ2FydmVyIC0gU1RBUiAtIGludGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLnVpLnRlc3RzLmVkaXRvcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5leGNlcHRpb25zLlJlc291cmNlQWxyZWFkeUV4aXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXhjZXB0aW9ucy5SZXNvdXJjZUluVXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TdHJ1Y3R1cmVkVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5YTUxEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25YU0w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LlhTTENvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzbC51aS50ZXN0cy5VbnppcHBlZFByb2plY3RUZXN0ZXI7Ci0KLS8qKgotICogVGVzdHMgZXZlcnl0aGluZyBhYm91dCBjb2RlIGNvbXBsZXRpb24gYW5kIGNvZGUgYXNzaXN0YW5jZS4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgWFNMQ29tcGxldGlvblRlc3QgZXh0ZW5kcyBVbnppcHBlZFByb2plY3RUZXN0ZXIgewotCi0JcHJvdGVjdGVkIFN0cmluZyBwcm9qZWN0TmFtZSA9IG51bGw7Ci0JcHJvdGVjdGVkIFN0cmluZyBmaWxlTmFtZSA9IG51bGw7Ci0JcHJvdGVjdGVkIElGaWxlIGZpbGUgPSBudWxsOwotCXByb3RlY3RlZCBJRWRpdG9yUGFydCB0ZXh0RWRpdG9yUGFydCA9IG51bGw7Ci0JcHJvdGVjdGVkIElUZXh0RWRpdG9yIGVkaXRvciA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgWE1MRG9jdW1lbnRMb2FkZXIgeG1sRG9jdW1lbnRMb2FkZXIgPSBudWxsOwotCXByb3RlY3RlZCBJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLQlwcm90ZWN0ZWQgU3RydWN0dXJlZFRleHRWaWV3ZXIgc291cmNlVmlld2VyID0gbnVsbDsKLQkKLQlwdWJsaWMgWFNMQ29tcGxldGlvblRlc3QoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQkKLQkvKioKLQkgKiBTZXR1cCB0aGUgbmVjZXNzYXJ5IHByb2plY3RzLCBmaWxlcywgYW5kIHNvdXJjZSB2aWV3ZXIgZm9yIHRoZQotCSAqIHRlc3RzLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJc3VwZXIuc2V0VXAoKTsKLQkJcHJvamVjdE5hbWUgPSAieHNsdGVzdGZpbGVzIjsKLQkJZmlsZU5hbWUgPSAidXRpbHMueHNsIjsKLQkJCi0gICAgICAgIC8vIFNldHVwIHRoZSBQcm9qZWN0IGFuZCBGaWxlIHRvIGJlIHVzZWQgZHVyaW5nIHRoZSB0ZXN0LgotCQlTdHJpbmcgeHNsRmlsZVBhdGggPSBzZXR1cFByb2plY3QoKTsKLQkJZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShuZXcgUGF0aCh4c2xGaWxlUGF0aCkpOwotCQlpZiAoZmlsZSAhPSBudWxsICYmICFmaWxlLmV4aXN0cygpKSB7Ci0JCQlBc3NlcnQuZmFpbCgiVW5hYmxlIHRvIGxvY2F0ZSAiICsgZmlsZU5hbWUgKyAiIHN0eWxlc2hlZXQuIik7Ci0JCX0KLQkJCi0JCWxvYWRYU0xGaWxlKCk7Ci0JCQotCQlpbml0aWFsaXplU291cmNlVmlld2VyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVNvdXJjZVZpZXdlcigpIHsKLQkJLy8gc29tZSB0ZXN0IGVudmlyb25tZW50cyBtaWdodCBub3QgaGF2ZSBhICJyZWFsIiBkaXNwbGF5Ci0JCWlmKERpc3BsYXkuZ2V0Q3VycmVudCgpICE9IG51bGwpIHsKLQkJCQotCQkJU2hlbGwgc2hlbGwgPSBudWxsOwotCQkJQ29tcG9zaXRlIHBhcmVudCA9IG51bGw7Ci0JCQkKLQkJCWlmKFBsYXRmb3JtVUkuaXNXb3JrYmVuY2hSdW5uaW5nKCkpIHsKLQkJCQlzaGVsbCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKTsKLQkJCX0KLQkJCWVsc2UgewkKLQkJCQlzaGVsbCA9IG5ldyBTaGVsbChEaXNwbGF5LmdldEN1cnJlbnQoKSk7Ci0JCQl9Ci0JCQlwYXJlbnQgPSBuZXcgQ29tcG9zaXRlKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCQkKLQkJCS8vIGR1bW15IHZpZXdlcgotCQkJc291cmNlVmlld2VyID0gbmV3IFN0cnVjdHVyZWRUZXh0Vmlld2VyKHBhcmVudCwgbnVsbCwgbnVsbCwgZmFsc2UsIFNXVC5OT05FKTsKLQkJfQotCQllbHNlIHsKLQkJCUFzc2VydC5mYWlsKCJVbmFibGUgdG8gcnVuIHRoZSB0ZXN0IGFzIGEgZGlzcGxheSBtdXN0IGJlIGF2YWlsYWJsZS4iKTsKLQkJfQotCQkKLQkJY29uZmlndXJlU291cmNlVmlld2VyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU291cmNlVmlld2VyKCkgewotCQlzb3VyY2VWaWV3ZXIuY29uZmlndXJlKG5ldyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25YU0woKSk7Ci0JCQotICAgICAgICBzb3VyY2VWaWV3ZXIuc2V0RG9jdW1lbnQoZG9jdW1lbnQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGxvYWRYU0xGaWxlKCkgdGhyb3dzIFJlc291cmNlQWxyZWFkeUV4aXN0cywgUmVzb3VyY2VJblVzZSwKLQkJCUlPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJSU1vZGVsTWFuYWdlciBtb2RlbE1hbmFnZXIgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpOwotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbW9kZWxNYW5hZ2VyLmdldE5ld01vZGVsRm9yRWRpdChmaWxlLCB0cnVlKTsKLQkJZG9jdW1lbnQgPSBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHNldHVwUHJvamVjdCgpIHsKLQkJU3RyaW5nIHhzbEZpbGVQYXRoID0gcHJvamVjdE5hbWUgKyBGaWxlLnNlcGFyYXRvciArIGZpbGVOYW1lOwotCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLm5ld1Byb2plY3REZXNjcmlwdGlvbihwcm9qZWN0TmFtZSk7Ci0KLQkJSVByb2plY3QgcHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0JCXRyeSB7Ci0JCQlwcm9qZWN0LmNyZWF0ZShkZXNjcmlwdGlvbiwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQlwcm9qZWN0Lm9wZW4obmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCi0JCX0KLQkJcmV0dXJuIHhzbEZpbGVQYXRoOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIGNvbnRlbnQgY29tcGxldGlvbiBwcm9wb3NhbHMgYXQgPGNvZGU+bGluZU51bWJlcjwvY29kZT4sIDxjb2RlPmNvbHVtbk51bWJlcjwvY29kZT4uCi0JICogQHBhcmFtIGxpbmVOdW1iZXIKLQkgKiBAcGFyYW0gY29sdW1uTnVtYmVyCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSBJQ29tcGxldGlvblByb3Bvc2FsW10gZ2V0UHJvcG9zYWxzKGludCBvZmZzZXQpIHRocm93cyBFeGNlcHRpb24gewotICAgIAlyZXR1cm4gbmV3IFhTTENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKS5jb21wdXRlQ29tcGxldGlvblByb3Bvc2Fscyhzb3VyY2VWaWV3ZXIsIG9mZnNldCk7IAotCX0KLQkJCi0JCi0JcHVibGljIHZvaWQgdGVzdEdldE5vZGVBdExpbmUxNSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJRE9NTm9kZSBub2RlID0gKElET01Ob2RlKSBDb250ZW50QXNzaXN0VXRpbHMuZ2V0Tm9kZUF0KHNvdXJjZVZpZXdlciwgNjMxKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBub2RlIG5hbWUgcmV0dXJuZWQ6IiwgInhzbDpzdHlsZXNoZWV0Iiwgbm9kZS5nZXROb2RlTmFtZSgpKTsKLQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXROb2RlQXRMaW5lMTYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSURPTU5vZGUgbm9kZSA9IChJRE9NTm9kZSkgQ29udGVudEFzc2lzdFV0aWxzLmdldE5vZGVBdChzb3VyY2VWaWV3ZXIsIDcxMik7Ci0JCWFzc2VydEVxdWFscygiV3Jvbmcgbm9kZSBuYW1lIHJldHVybmVkOiIsICJ4c2w6dGVtcGxhdGUiLCBub2RlLmdldE5vZGVOYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Tm9kZUF0TGluZTE3KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlET01Ob2RlIG5vZGUgPSAoSURPTU5vZGUpIENvbnRlbnRBc3Npc3RVdGlscy5nZXROb2RlQXQoc291cmNlVmlld2VyLCA3NDgpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIG5vZGUgbmFtZSByZXR1cm5lZDoiLCAieHNsOnBhcmFtIiwgbm9kZS5nZXROb2RlTmFtZSgpKTsKLQl9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdFNlbGVjdEF0dHJpYnV0ZVByb3Bvc2Fsc0F2YWlsYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIAlpbnQgb2Zmc2V0ID0gc291cmNlVmlld2VyLmdldERvY3VtZW50KCkuZ2V0TGluZU9mZnNldCgxOCkgKyA0NDsKLSAgICAJU3RyaW5nIHMgPSBzb3VyY2VWaWV3ZXIuZ2V0RG9jdW1lbnQoKS5nZXQob2Zmc2V0LTEsIDYgKTsKLSAgICAJYXNzZXJ0RXF1YWxzKCJudW1iZXIiLHMpOwotCi0gICAgCQotICAgIAlJQ29tcGxldGlvblByb3Bvc2FsW10gcHJvcG9zYWxzID0gZ2V0UHJvcG9zYWxzKDgzOCk7Ci0gICAgCQotICAgIAlhc3NlcnRUcnVlKHByb3Bvc2Fscy5sZW5ndGggPiAxKTsKLSAgICAJSUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IHByb3Bvc2Fsc1szXTsKLSAgICAJYXNzZXJ0RXF1YWxzKCJXcm9uZyBzZWxlY3QgaXRlbSByZXR1cm5lZDogIiwgIi4uIiwgcHJvcG9zYWwuZ2V0RGlzcGxheVN0cmluZygpKTsKLSAgICB9Ci0gCi0gICAgLyoqCi0gICAgICogQnVnIDI0MDE3MAotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFNlbGVjdEF0dHJpYnV0ZVByb3Bvc2Fsc05hcnJvdygpIHRocm93cyBFeGNlcHRpb24gewotICAgIAlpbnQgb2Zmc2V0ID0gc291cmNlVmlld2VyLmdldERvY3VtZW50KCkuZ2V0TGluZU9mZnNldCgxOCkgKyA0NDsKLSAgICAJU3RyaW5nIHMgPSBzb3VyY2VWaWV3ZXIuZ2V0RG9jdW1lbnQoKS5nZXQob2Zmc2V0LTksOSk7Ci0gICAgCWFzc2VydEVxdWFscygic2VsZWN0PVwibiIscyk7Ci0gICAgCQotICAgIAlJQ29tcGxldGlvblByb3Bvc2FsW10gcHJvcG9zYWxzID0gZ2V0UHJvcG9zYWxzKG9mZnNldCk7Ci0gICAgCWFzc2VydEVxdWFscygiV3JvbmcgeHBhdGggaXRlbSByZXR1cm5lZDogIiwgIm5hbWUobm9kZS1zZXQpIiwgcHJvcG9zYWxzWzBdLmdldERpc3BsYXlTdHJpbmcoKSk7Ci0gICAgCWFzc2VydEVxdWFscygiV3JvbmcgTnVtYmVyIG9mIGl0ZW1zIHJldHVybmVkOiAiLCA2LCBwcm9wb3NhbHMubGVuZ3RoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VGVzdEF0dHJpYnV0ZVByb3Bvc2Fsc0F2YWlsYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIAlJQ29tcGxldGlvblByb3Bvc2FsW10gcHJvcG9zYWxzID0gZ2V0UHJvcG9zYWxzKDE3NTMpOwotICAgIAlhc3NlcnRUcnVlKHByb3Bvc2Fscy5sZW5ndGggPj0gMSk7Ci0gICAgCUlDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSBwcm9wb3NhbHNbMF07Ci0gICAgCWFzc2VydFRydWUoIldyb25nIGF0dHJpYnV0ZSBwcm9wb3NhbCByZXR1cm5lZDoiLCBwcm9wb3NhbC5nZXREaXNwbGF5U3RyaW5nKCkuY29udGFpbnMoImRpc2FibGUtb3V0cHV0LWVzY2FwaW5nIikpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0WFNMRWxlbWVudFByb3Bvc2Fsc0F2YWlsYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIAlJQ29tcGxldGlvblByb3Bvc2FsW10gcHJvcG9zYWxzID0gZ2V0UHJvcG9zYWxzKDE1NjkpOwotICAgIAlhc3NlcnRUcnVlKHByb3Bvc2Fscy5sZW5ndGggPj0gMik7Ci0gICAgCQotICAgIAlJQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gcHJvcG9zYWxzWzFdOwotICAgIAlhc3NlcnRUcnVlKCJDYW4ndCBmaW5kIFhTTCBlbGVtZW50IHByb3Bvc2Fscy4iLCBwcm9wb3NhbC5nZXREaXNwbGF5U3RyaW5nKCkuZXF1YWxzKCJ4c2w6b3RoZXJ3aXNlIikpOwotICAgIH0KLSAgICAKLSAgICAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCg==