ZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS8uY2xhc3NwYXRoIGIvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5NDYxNzIuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMvIi8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjX2FudC8iLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSIvb3JnLmFwYWNoZS54ZXJjZXMiLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSIvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iL29yZy5lY2xpcHNlLmNvcmUuYm9vdCIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJ2YXIiIHBhdGg9IkpSRV9MSUIiIHJvb3RwYXRoPSJKUkVfU1JDUk9PVCIgc291cmNlcGF0aD0iSlJFX1NSQyIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Ii9vcmcuYXBhY2hlLmFudCIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvLmN2c2lnbm9yZSBiL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTA3N2E0Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvLm9wdGlvbnMgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0YjM0ZDUuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlLy5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jIERlYnVnZ2luZyBvcHRpb25zIGZvciB0aGUgb3JnLmVjbGlwc2UuYW50LmNvcmUgcGx1Z2luLgotCi0jIFR1cm4gb24gZGVidWdnaW5nIGZvciB0aGUgb3JnLmVjbGlwc2UuYW50LmNvcmUgcGx1Z2luLgotb3JnLmVjbGlwc2UuYW50LmNvcmUvZGVidWc9dHJ1ZQotCi0jIERpc3BsYXlzIGJ1aWxkZmlsZSBydW4gdGltZXMuCi1vcmcuZWNsaXBzZS5hbnQuY29yZS9idWlsZGZpbGUvdGltaW5nPWZhbHNlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvLnByb2plY3QgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZmRjNWQuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuYW50LmNvcmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQkJPHByb2plY3Q+b3JnLmFwYWNoZS5hbnQ8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5hcGFjaGUueGVyY2VzPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5jb3JlLmJvb3Q8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmNvcmUucnVudGltZTwvcHJvamVjdD4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9hYm91dC5odG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MzVjMGYuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotCi08cD4zcmQgTWFyY2gsIDIwMDM8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotPHA+RWNsaXBzZS5vcmcgbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7Q1BMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgQ1BMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBDUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPlRoaXJkIFBhcnR5IENvbnRlbnQ8L2gzPgotCi08cD5UaGUgQ29udGVudCBpbmNsdWRlcyBpdGVtcyB0aGF0IGhhdmUgYmVlbiBzb3VyY2VkIGZyb20gdGhpcmQgcGFydGllcyBhcyBmb2xsb3dzOjwvcD4KLQotPHA+PGI+QW50IDEuNS4yPC9iPjwvcD4KLTxwPlRoZSBwbHVnLWluIGlzIGJhc2VkIG9uIHNvZnR3YXJlIGRldmVsb3BlZCBieSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYXMgcGFydCBvZiB0aGUgSmFrYXJ0YSBwcm9qZWN0LiAgVGhlcmVmb3JlOjwvcD4KLQotPGJsb2NrcXVvdGU+Ci1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnLyI+aHR0cDovL3d3dy5hcGFjaGUub3JnLzwvYT4pLgotPC9ibG9ja3F1b3RlPgotCi08cD5UaGUgZm9sbG93aW5nIGNsYXNzZXMgKCZxdW90O0FudCBEZXJpdmF0aXZlIFdvcmsmcXVvdDspIGFyZSBiYXNlZCBvbiBBbnQgY29kZTo8L3A+Ci0KLTx1bD4KLQk8bGk+SW50ZXJuYWxBbnRSdW5uZXIgY29udGFpbmVkIGluIGFudHN1cHBvcnRsaWIuamFyIGFuZCBhbnRzdXBwb3J0bGlic3JjLnppcDwvbGk+Ci0JPGxpPkludGVybmFsUHJvamVjdCBjb250YWluZWQgaW4gYW50c3VwcG9ydGxpYi5qYXIgYW5kIGFudHN1cHBvcnRsaWJzcmMuemlwPC9saT4KLTwvdWw+Ci0KLTxwPlRoZSBBbnQgRGVyaXZhdGl2ZSBXb3JrIGlzOjwvcD4KLQotPGJsb2NrcXVvdGU+Q29weXJpZ2h0IChjKSAyMDAwLTIwMDIgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvYmxvY2txdW90ZT4KLQotPHA+WW91ciB1c2Ugb2YgdGhlIEFudCBEZXJpdmF0aXZlIFdvcmsgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSB3aGljaAotaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvTElDRU5TRSI+aHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC9MSUNFTlNFPC9hPi4KLU1vcmUgc3BlY2lmaWNhbGx5OjwvcD4KLTxibG9ja3F1b3RlPgotCTEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mPGJyPgotCWNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci48YnI+Ci08YnI+Ci0JMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2Y8YnI+Ci0JY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHM8YnI+Ci0JcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLjxicj4KLTxicj4KLQkzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlPGJyPgotCWZvbGxvd2luZyBhY2tub3dsZWRnbWVudDo8YnI+Ci0JPGJsb2NrcXVvdGU+Ci0JCSZxdW90O1RoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPGJyPgotCQkoPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnLyI+aHR0cDovL3d3dy5hcGFjaGUub3JnLzwvYT4pLiZxdW90OwotCTwvYmxvY2txdW90ZT4KLQlBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsIGlmIGFuZCB3aGVyZXZlciBzdWNoPGJyPgotCXRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuPGJyPgotPGJyPgotCTQuIFRoZSBuYW1lcyAmcXVvdDtBbnQmcXVvdDsgYW5kICZxdW90O0FwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uJnF1b3Q7IG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvcjxicj4KLQlwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbjxicj4KLQlwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCA8YSBocmVmPSJtYWlsdG86YXBhY2hlQGFwYWNoZS5vcmciPmFwYWNoZUBhcGFjaGUub3JnPC9hPi48YnI+Ci08YnI+Ci0JNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgJnF1b3Q7QXBhY2hlJnF1b3Q7LCBub3IgbWF5ICZxdW90O0FwYWNoZSZxdW90OyBhcHBlYXI8YnI+Ci0JaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLjxicj4KLTxicj4KLQlUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICZxdW90O0FTIElTJnF1b3Q7IEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UPGJyPgotCUxJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVI8YnI+Ci0JUFVSUE9TRSBBUkUJRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUiBJVFM8YnI+Ci0JQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1I8YnI+Ci0JQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUjxicj4KLQlTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OPGJyPgotCUFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAlPUiBUT1JUIChJTkNMVURJTkc8YnI+Ci0JTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQJT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGPGJyPgotCUFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotPC9ibG9ja3F1b3RlPgotCi08aDM+Q29udHJpYnV0aW9uczwvaDM+Ci0KLTxwPklmIHRoaXMgQ29udGVudCBpcyBsaWNlbnNlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBDUEwsIGFueSBDb250cmlidXRpb25zLCBhcyBkZWZpbmVkIGluIHRoZSBDUEwsIHVwbG9hZGVkLCBzdWJtaXR0ZWQsIG9yIG90aGVyd2lzZQotbWFkZSBhdmFpbGFibGUgdG8gRWNsaXBzZS5vcmcsIG1lbWJlcnMgb2YgRWNsaXBzZS5vcmcgYW5kL29yIHRoZSBob3N0IG9mIEVjbGlwc2Uub3JnIHdlYiBzaXRlLCBieSB5b3UgdGhhdCByZWxhdGUgdG8gc3VjaAotQ29udGVudCBhcmUgcHJvdmlkZWQgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBDUEwgYW5kIGNhbiBiZSBtYWRlIGF2YWlsYWJsZSB0byBvdGhlcnMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDUEwuPC9wPgotCi08cD5JZiB0aGlzIENvbnRlbnQgaXMgbGljZW5zZWQgdG8geW91IHVuZGVyIGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgb3RoZXIgdGhhbiB0aGUgQ1BMICgmcXVvdDtPdGhlciBMaWNlbnNlJnF1b3Q7KSwgYW55IG1vZGlmaWNhdGlvbnMsIGVuaGFuY2VtZW50cyBhbmQvb3IKLW90aGVyIGNvZGUgYW5kL29yIGRvY3VtZW50YXRpb24gKCZxdW90O01vZGlmaWNhdGlvbnMmcXVvdDspIHVwbG9hZGVkLCBzdWJtaXR0ZWQsIG9yIG90aGVyd2lzZSBtYWRlIGF2YWlsYWJsZSB0byBFY2xpcHNlLm9yZywgbWVtYmVycyBvZiBFY2xpcHNlLm9yZyBhbmQvb3IgdGhlCi1ob3N0IG9mIEVjbGlwc2Uub3JnLCBieSB5b3UgdGhhdCByZWxhdGUgdG8gc3VjaCBDb250ZW50IGFyZSBwcm92aWRlZCB1bmRlciB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgT3RoZXIgTGljZW5zZSBhbmQgY2FuIGJlIG1hZGUgYXZhaWxhYmxlCi10byBvdGhlcnMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPdGhlciBMaWNlbnNlLiAgSW4gYWRkaXRpb24sIHdpdGggcmVnYXJkIHRvIE1vZGlmaWNhdGlvbnMgZm9yIHdoaWNoIHlvdSBhcmUgdGhlIGNvcHlyaWdodCBob2xkZXIsIHlvdSBhcmUgYWxzbwotcHJvdmlkaW5nIHRoZSBNb2RpZmljYXRpb25zIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ1BMIGFuZCBzdWNoIE1vZGlmaWNhdGlvbnMgY2FuIGJlIG1hZGUgYXZhaWxhYmxlIHRvIG90aGVycyB1bmRlciB0aGUgdGVybXMgb2YKLXRoZSBDUEwuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL2J1aWxkLnByb3BlcnRpZXMgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU3MDNiMy4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuYW50c3VwcG9ydC5qYXI9c3JjLwotc291cmNlLmxpYi9hbnRzdXBwb3J0bGliLmphcj1zcmNfYW50Lwotc3JjLmluY2x1ZGVzPWFib3V0Lmh0bWwsc2NoZW1hLwotYmluLmluY2x1ZGVzPXBsdWdpbi54bWwscGx1Z2luLnByb3BlcnRpZXMsYWJvdXQuaHRtbCwqLmphcixsaWIvKi5qYXIsLm9wdGlvbnMKLWphcnMuY29tcGlsZS5vcmRlcj1hbnRzdXBwb3J0LmphcixsaWIvYW50c3VwcG9ydGxpYi5qYXIKLWphcnMuZXh0cmEuY2xhc3NwYXRoPS4uL29yZy5hcGFjaGUuYW50L2FudC5qYXIKLWphdmFkb2MucGFja2FnZXM9b3JnLmVjbGlwc2UuKgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9idWlsZG5vdGVzX3BsYXRmb3JtLWFudC5odG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL2J1aWxkbm90ZXNfcGxhdGZvcm0tYW50Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5OGQwMGUuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL2J1aWxkbm90ZXNfcGxhdGZvcm0tYW50Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgotPGh0bWw+Ci08aGVhZD4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPG1ldGEgbmFtZT0iR0VORVJBVE9SIiBjb250ZW50PSJNb3ppbGxhLzQuNyBbZW5dIChXaW5OVDsgSSkgW05ldHNjYXBlXSI+Ci0gICA8dGl0bGU+RWNsaXBzZSBQbGF0Zm9ybSAyLjEuMSBSZWxlYXNlIE5vdGVzIEFudDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLQotPGgxPgotRWNsaXBzZSAyLjEuMSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KLUFudDwvaDE+Ci1FY2xpcHNlIFNESyBCdWlsZCBBcHJpbCA/PywgMjAwMwotCi08aDM+Ci1SZXNvbHZlZCBCdWdzPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0NjA4Ij4zNDYwODwvYT46IEV4Y2VwdGlvbiB1c2luZyBjb250ZW50IGFzc2lzdDxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM1NDk3Ij4zNTQ5NzwvYT46IEFycmF5SW5kZXhPdXRPZkJvdW5kcyBvbiBleHRlcm5hbCB0b29scyBwYWdlPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzYzNTMiPjM2MzUzPC9hPjogTW92ZSB0byBBbnQgMS41LjM8YnI+Ci0KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL2RvYy9vcmdfZWNsaXBzZV9hbnRfY29yZS5odG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL2RvYy9vcmdfZWNsaXBzZV9hbnRfY29yZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDg5YjhhLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9kb2Mvb3JnX2VjbGlwc2VfYW50X2NvcmUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+Ci08aHRtbD4KLTxoZWFkPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8dGl0bGU+QW50IEJ1aWxkIFRvb2wgQ29yZSBleHRlbnNpb24tcG9pbnRzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxpbms9IiMwMDAwRkYiIHZsaW5rPSIjODAwMDgwIj4KLQotPGNlbnRlcj4KLTxoMT4KLUFudCBCdWlsZCBUb29sIENvcmUgUGx1Zy1pbjwvaDE+PC9jZW50ZXI+Ci1UaGlzIGRvY3VtZW50IGxpc3RzIGFsbCBvZiB0aGUgZXh0ZW5zaW9uIHBvaW50cyB0aGF0IHRoZSBBbnQgQnVpbGQgVG9vbCBDb3JlCi1wbHVnLWluIG1ha2VzIGF2YWlsYWJsZSB0byB0b29sIGRldmVsb3BlcnMuCi08cD4KLTxociBXSURUSD0iMTAwJSI+Ci08aDE+Ci1HZW5lcmFsIEV4dGVuc2lvbiBQb2ludHM8L2gxPgotVGhlIGZvbGxvd2luZyBleHRlbnNpb24gcG9pbnRzIGNhbiBiZSB1c2VkIHRvIGV4dGVuZCB0aGUgZnVuZGFtZW50YWwgY2FwYWJpbGl0aWVzCi1vZiB0aGUgQW50IGNvcmUgcGx1Zy1pbjoKLTx1bD4KLTxsaT4KLTxhIGhyZWY9Im9yZ19lY2xpcHNlX2FudF9jb3JlX2FudFRhc2tzLmh0bWwiPm9yZy5lY2xpcHNlLmFudC5jb3JlLmFudFRhc2tzPC9hPjwvbGk+Ci0KLTxsaT4KLTxhIGhyZWY9Im9yZ19lY2xpcHNlX2FudF9jb3JlX2FudFR5cGVzLmh0bWwiPm9yZy5lY2xpcHNlLmFudC5jb3JlLmFudFR5cGVzPC9hPjwvbGk+Ci08bGk+Ci08YSBocmVmPSJvcmdfZWNsaXBzZV9hbnRfY29yZV9leHRyYUNsYXNzcGF0aEVudHJpZXMuaHRtbCI+b3JnLmVjbGlwc2UuYW50LmNvcmUuZXh0cmFDbGFzc3BhdGhFbnRyaWVzPC9hPjwvbGk+Ci08L3VsPgotPGEgaHJlZj0iaGdsZWdhbDIwMDMuaHRtIj48aW1nIFNSQz0ibmdpYm1jcHkyMDAzLmdpZiIgQUxUPSJDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDAsIDIwMDMuICBBbGwgUmlnaHRzIFJlc2VydmVkLiIgQk9SREVSPTAgaGVpZ2h0PTEyIHdpZHRoPTE5NT48L2E+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvZG9jL29yZ19lY2xpcHNlX2FudF9jb3JlX2FudFRhc2tzLmh0bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvZG9jL29yZ19lY2xpcHNlX2FudF9jb3JlX2FudFRhc2tzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiOGY5MzUuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL2RvYy9vcmdfZWNsaXBzZV9hbnRfY29yZV9hbnRUYXNrcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTxIRUFEPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPFNUWUxFIHR5cGU9InRleHQvY3NzIj4KLWRpdi5kdGQtZnJhZ21lbnQgewotCXdpZHRoOiAxMDAlOwotCWJvcmRlcjogbm9uZTsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZWVlOwotfQotPC9TVFlMRT4KLTwvSEVBRD4KLTxIVE1MPgotPEJPRFk+Ci08SDE+PENFTlRFUj5BbnQgVGFza3M8L0NFTlRFUj48L0gxPgotPGI+PGk+SWRlbnRpZmllcjogPC9pPjwvYj5vcmcuZWNsaXBzZS5hbnQuY29yZS5hbnRUYXNrczxwPgotPGI+PGk+RGVzY3JpcHRpb246IDwvaT48L2I+QWxsb3dzIHBsdWctaW5zIHRvIGRlZmluZSBhcmJpdHJhcnkgQW50IHRhc2tzIGZvciB1c2UgCi1ieSB0aGUgQW50IGluZnJhc3RydWN0dXJlLiAgVGhlIHN0YW5kYXJkIEFudCBpbmZyYXN0cnVjdHVyZSAKLWFsbG93cyBmb3IgdGhlIGFkZGl0aW9uIG9mIGFyYml0cmFyeSB0YXNrcy4gIAotVW5mb3J0dW5hdGVseSwgaXQgaXMgdW5saWtlbHkgdGhhdCB0aGUgQW50IENvcmUgcGx1Zy1pbiAKLXdvdWxkIGhhdmUgdGhlIGNsYXNzZXMgcmVxdWlyZWQgYnkgdGhlc2UgdGFza3Mgb24gaXRzIAotY2xhc3NwYXRoIChvciB0aGF0IG9mIGFueSBvZiBpdHMgcHJlcmVxdWlzaXRlcykuICAKLVRvIGFkZHJlc3MgdGhpcywgY2xpZW50cyBzaG91bGQgZGVmaW5lIGFuIGV4dGVuc2lvbiAKLXdoaWNoIHBsdWdzIGludG8gdGhpcyBleHRlbnNpb24tcG9pbnQgYW5kIG1hcHMgYSAKLXRhc2sgbmFtZSBvbnRvIGEgY2xhc3MuICBUaGUgQW50IHBsdWctaW4gY2FuIHRoZW4gCi1yZXF1ZXN0IHRoYXQgdGhlIGRlY2xhcmluZyBwbHVnLWluIGxvYWQgdGhlIHNwZWNpZmllZCBjbGFzcy48cD48Yj48aT5Db25maWd1cmF0aW9uIE1hcmt1cDo8L2k+PC9iPjxwPgotPHA+PHNhbXA+PGZvbnQgY29sb3I9IiM4MDAwMDAiPiZuYnNwOyZuYnNwOyAmbHQ7IUVMRU1FTlQgPGEgbmFtZT0iZS5leHRlbnNpb24iPmV4dGVuc2lvbjwvYT4gKDxhIGhyZWY9IiNlLmFudFRhc2siPmFudFRhc2s8L2E+KikmZ3Q7PC9mb250Pjwvc2FtcD4KLTxicj48YnI+PHNhbXA+PGZvbnQgY29sb3I9IiM4MDAwMDAiPiZuYnNwOyZuYnNwOyAmbHQ7IUFUVExJU1QgZXh0ZW5zaW9uPC9zYW1wPgotPGJyPjxzYW1wPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3BvaW50Jm5ic3A7Q0RBVEEgI1JFUVVJUkVEPC9zYW1wPgotPGJyPjxzYW1wPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO2lkJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Q0RBVEEgI0lNUExJRUQ8L3NhbXA+Ci08YnI+PHNhbXA+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7bmFtZSZuYnNwOyZuYnNwO0NEQVRBICNJTVBMSUVEPC9zYW1wPgotPGJyPjxzYW1wPiZuYnNwOyZuYnNwOyAmZ3Q7PC9mb250Pjwvc2FtcD4KLTx1bD4KLTxsaT48Yj5wb2ludDwvYj4gLSBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50PC9saT4KLTxsaT48Yj5pZDwvYj4gLSBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2U8L2xpPgotPGxpPjxiPm5hbWU8L2I+IC0gYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlPC9saT4KLTwvdWw+Ci08cD48c2FtcD48Zm9udCBjb2xvcj0iIzgwMDAwMCI+Jm5ic3A7Jm5ic3A7ICZsdDshRUxFTUVOVCA8YSBuYW1lPSJlLmFudFRhc2siPmFudFRhc2s8L2E+IEVNUFRZJmd0OzwvZm9udD48L3NhbXA+Ci08YnI+PGJyPjxzYW1wPjxmb250IGNvbG9yPSIjODAwMDAwIj4mbmJzcDsmbmJzcDsgJmx0OyFBVFRMSVNUIGFudFRhc2s8L3NhbXA+Ci08YnI+PHNhbXA+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7bmFtZSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NEQVRBICNSRVFVSVJFRDwvc2FtcD4KLTxicj48c2FtcD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtjbGFzcyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NEQVRBICNSRVFVSVJFRDwvc2FtcD4KLTxicj48c2FtcD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtsaWJyYXJ5Jm5ic3A7Jm5ic3A7Q0RBVEEgI1JFUVVJUkVEPC9zYW1wPgotPGJyPjxzYW1wPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO2hlYWRsZXNzJm5ic3A7Q0RBVEEgI0lNUExJRUQ8L3NhbXA+Ci08YnI+PHNhbXA+Jm5ic3A7Jm5ic3A7ICZndDs8L2ZvbnQ+PC9zYW1wPgotPHVsPgotPGxpPjxiPm5hbWU8L2I+IC0gbmFtZSBvZiB0aGUgdGFzayB0byBiZSBkZWZpbmVkPC9saT4KLTxsaT48Yj5jbGFzczwvYj4gLSB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBKYXZhIGNsYXNzIGltcGxlbWVudGluZyAKLXRoZSB0YXNrLiAgR2VuZXJhbGx5IHRoaXMgY2xhc3MgbXVzdCBiZSBhIHN1YmNsYXNzIG9mCi08c2FtcD5vcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrPC9zYW1wPi48L2xpPgotPGxpPjxiPmxpYnJhcnk8L2I+IC0gYSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBwbHVnLWluIGluc3RhbGwgbG9jYXRpb24KLWZvciB0aGUgbGlicmFyeSBjb250YWluaW5nIHRoZSB0YXNrLjwvbGk+Ci08bGk+PGI+aGVhZGxlc3M8L2I+IC0gaW5kaWNhdGVzIHdoZXRoZXIgdGhpcyB0YXNrIGlzIHN1aXRhYmxlIGZvciB1c2UgaW4gYSAiaGVhZGxlc3MiIEFudCBlbnZpcm9ubWVudC4gSWYgcnVubmluZyBoZWFkbGVzcyBhbmQgdGhlIGF0dHJpYnV0ZSBpcyAiZmFsc2UiLCAKLSAgICAgICAgICAgICAgICAgIHRoZSB0YXNrIHdpbGwgbm90IGJlIGxvYWRlZCBvciBkZWZpbmVkLiBBcyB3ZWxsLCB0aGUgcGx1Z2luIGNsYXNzIGxvYWRlciB3aWxsIG5vdCBiZSBhZGRlZCBhcyBhIHBhcmVudCBjbGFzc2xvYWRlciB0byB0aGUgQW50IGNsYXNzbG9hZGVyLgotICAgICAgICAgICAgICAgICAgVGhlIGltcGxpZWQgdmFsdWUgaXMgdHJ1ZSwgd2hlbiBub3Qgc3BlY2lmaWVkLjwvbGk+Ci08L3VsPgotPGI+PGk+RXhhbXBsZXM6IDwvaT48L2I+VGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGFuIEFudCB0YXNrcyBleHRlbnNpb24gcG9pbnQ6IAotPHA+Ci08cHJlPgotICAgPGZvbnQgY29sb3I9IiMwMDAwODAiPiZsdDtleHRlbnNpb24gcG9pbnQ9PGZvbnQgY29sb3I9IiMwMDgwMDAiPiZxdW90O29yZy5lY2xpcHNlLmFudC5jb3JlLmFudFRhc2tzJnF1b3Q7PC9mb250PiZndDs8L2ZvbnQ+Ci0gICAgICA8Zm9udCBjb2xvcj0iIzAwMDA4MCI+Jmx0O2FudFRhc2sgbmFtZT08Zm9udCBjb2xvcj0iIzAwODAwMCI+JnF1b3Q7Y29vbFRhc2smcXVvdDs8L2ZvbnQ+IGNsYXNzPTxmb250IGNvbG9yPSIjMDA4MDAwIj4mcXVvdDtjb20uZXhhbXBsZS5Db29sVGFzayZxdW90OzwvZm9udD4vJmd0OzwvZm9udD4KLSAgIDxmb250IGNvbG9yPSIjMDAwMDgwIj4mbHQ7L2V4dGVuc2lvbiZndDs8L2ZvbnQ+IAotPC9wcmU+Ci08L3A+PHA+Ci08Yj48aT5TdXBwbGllZCBJbXBsZW1lbnRhdGlvbjogPC9pPjwvYj5UaGUgcGxhdGZvcm0gaXRzZWxmIHN1cHBsaWVzIGEgbnVtYmVyIG9mIHRhc2tzIGluY2x1ZGluZyAKLWVjbGlwc2UuaW5jcmVtZW50YWxCdWlsZCBhbmQgZWNsaXBzZS5yZWZyZXNoTG9jYWwuPHA+Ci08Zm9udCBzaXplPSItMSIgY29sb3I9IiMzMzY2OTkiPgotPGEgaHJlZj0iaGdsZWdhbC5odG0iPjxpbWcgU1JDPSJuZ2libWNweS5naWYiIEFMVD0iQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAwLCAyMDAzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4iIEJPUkRFUj0wIGhlaWdodD0xMiB3aWR0aD0xOTU+PC9hPjxwPgotPC9mb250PgotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL2RvYy9vcmdfZWNsaXBzZV9hbnRfY29yZV9hbnRUeXBlcy5odG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL2RvYy9vcmdfZWNsaXBzZV9hbnRfY29yZV9hbnRUeXBlcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDcwNWMwLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9kb2Mvb3JnX2VjbGlwc2VfYW50X2NvcmVfYW50VHlwZXMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci08SEVBRD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxTVFlMRSB0eXBlPSJ0ZXh0L2NzcyI+Ci1kaXYuZHRkLWZyYWdtZW50IHsKLQl3aWR0aDogMTAwJTsKLQlib3JkZXI6IG5vbmU7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2VlZTsKLX0KLTwvU1RZTEU+Ci08L0hFQUQ+Ci08SFRNTD4KLTxCT0RZPgotPEgxPjxDRU5URVI+QW50IFR5cGVzPC9DRU5URVI+PC9IMT4KLTxiPjxpPklkZW50aWZpZXI6IDwvaT48L2I+b3JnLmVjbGlwc2UuYW50LmNvcmUuYW50VHlwZXM8cD4KLTxiPjxpPkRlc2NyaXB0aW9uOiA8L2k+PC9iPkFsbG93cyBwbHVnLWlucyB0byBkZWZpbmUgYXJiaXRyYXJ5IEFudCBkYXRhdHlwZXMgZm9yIAotdXNlIGJ5IHRoZSBBbnQgaW5mcmFzdHJ1Y3R1cmUuICBUaGUgc3RhbmRhcmQgQW50IAotaW5mcmFzdHJ1Y3R1cmUgYWxsb3dzIGZvciB0aGUgYWRkaXRpb24gb2YgYXJiaXRyYXJ5IAotZGF0YXR5cGVzLiAgVW5mb3J0dW5hdGVseSwgaXQgaXMgdW5saWtlbHkgdGhhdCB0aGUgCi1BbnQgQ29yZSBwbHVnLWluIHdvdWxkIGhhdmUgdGhlIGNsYXNzZXMgcmVxdWlyZWQgCi1ieSB0aGVzZSBkYXRhdHlwZXMgb24gaXRzIGNsYXNzcGF0aCAob3IgdGhhdCBvZiBhbnkgCi1vZiBpdHMgcHJlcmVxdWlzaXRlcykuICBUbyBhZGRyZXNzIHRoaXMsIGNsaWVudHMgCi1zaG91bGQgZGVmaW5lIGFuIGV4dGVuc2lvbiB3aGljaCBwbHVncyBpbnRvIHRoaXMgCi1leHRlbnNpb24tcG9pbnQgYW5kIG1hcHMgYSBkYXRhdHlwZSBuYW1lIG9udG8gYSBjbGFzcy4gIAotVGhlIEFudCBwbHVnLWluIGNhbiB0aGVuIHJlcXVlc3QgdGhhdCB0aGUgZGVjbGFyaW5nIAotcGx1Zy1pbiBsb2FkIHRoZSBzcGVjaWZpZWQgY2xhc3MuPHA+PGI+PGk+Q29uZmlndXJhdGlvbiBNYXJrdXA6PC9pPjwvYj48cD4KLTxwPjxzYW1wPjxmb250IGNvbG9yPSIjODAwMDAwIj4mbmJzcDsmbmJzcDsgJmx0OyFFTEVNRU5UIDxhIG5hbWU9ImUuZXh0ZW5zaW9uIj5leHRlbnNpb248L2E+ICg8YSBocmVmPSIjZS5hbnRUeXBlIj5hbnRUeXBlPC9hPiopJmd0OzwvZm9udD48L3NhbXA+Ci08YnI+PGJyPjxzYW1wPjxmb250IGNvbG9yPSIjODAwMDAwIj4mbmJzcDsmbmJzcDsgJmx0OyFBVFRMSVNUIGV4dGVuc2lvbjwvc2FtcD4KLTxicj48c2FtcD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtwb2ludCZuYnNwO0NEQVRBICNSRVFVSVJFRDwvc2FtcD4KLTxicj48c2FtcD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtpZCZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO0NEQVRBICNJTVBMSUVEPC9zYW1wPgotPGJyPjxzYW1wPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO25hbWUmbmJzcDsmbmJzcDtDREFUQSAjSU1QTElFRDwvc2FtcD4KLTxicj48c2FtcD4mbmJzcDsmbmJzcDsgJmd0OzwvZm9udD48L3NhbXA+Ci08dWw+Ci08bGk+PGI+cG9pbnQ8L2I+IC0gYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludDwvbGk+Ci08bGk+PGI+aWQ8L2I+IC0gYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlPC9saT4KLTxsaT48Yj5uYW1lPC9iPiAtIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZTwvbGk+Ci08L3VsPgotPHA+PHNhbXA+PGZvbnQgY29sb3I9IiM4MDAwMDAiPiZuYnNwOyZuYnNwOyAmbHQ7IUVMRU1FTlQgPGEgbmFtZT0iZS5hbnRUeXBlIj5hbnRUeXBlPC9hPiBFTVBUWSZndDs8L2ZvbnQ+PC9zYW1wPgotPGJyPjxicj48c2FtcD48Zm9udCBjb2xvcj0iIzgwMDAwMCI+Jm5ic3A7Jm5ic3A7ICZsdDshQVRUTElTVCBhbnRUeXBlPC9zYW1wPgotPGJyPjxzYW1wPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO25hbWUmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDREFUQSAjUkVRVUlSRUQ8L3NhbXA+Ci08YnI+PHNhbXA+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Y2xhc3MmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDREFUQSAjUkVRVUlSRUQ8L3NhbXA+Ci08YnI+PHNhbXA+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7bGlicmFyeSZuYnNwOyZuYnNwO0NEQVRBICNSRVFVSVJFRDwvc2FtcD4KLTxicj48c2FtcD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtoZWFkbGVzcyZuYnNwO0NEQVRBICNJTVBMSUVEPC9zYW1wPgotPGJyPjxzYW1wPiZuYnNwOyZuYnNwOyAmZ3Q7PC9mb250Pjwvc2FtcD4KLTx1bD4KLTxsaT48Yj5uYW1lPC9iPiAtIG5hbWUgb2YgdGhlIHR5cGUgdG8gYmUgZGVmaW5lZDwvbGk+Ci08bGk+PGI+Y2xhc3M8L2I+IC0gdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgSmF2YSBjbGFzcyBpbXBsZW1lbnRpbmcgCi10aGUgZGF0YXR5cGUuICBHZW5lcmFsbHkgdGhpcyBjbGFzcyBtdXN0IGJlIGEgc3ViY2xhc3Mgb2YKLTxzYW1wPm9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkRhdGFUeXBlPC9zYW1wPi48L2xpPgotPGxpPjxiPmxpYnJhcnk8L2I+IC0gYSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBwbHVnLWluIGluc3RhbGwgbG9jYXRpb24KLWZvciB0aGUgbGlicmFyeSBjb250YWluaW5nIHRoZSB0eXBlLjwvbGk+Ci08bGk+PGI+aGVhZGxlc3M8L2I+IC0gaW5kaWNhdGVzIHdoZXRoZXIgdGhpcyB0eXBlIGlzIHN1aXRhYmxlIGZvciB1c2UgaW4gYSAiaGVhZGxlc3MiIEFudCBlbnZpcm9ubWVudC4gSWYgcnVubmluZyBoZWFkbGVzcyBhbmQgdGhlIGF0dHJpYnV0ZSBpcyAiZmFsc2UiLCAKLSAgICAgICAgICAgICAgICAgIHRoZSB0eXBlIHdpbGwgbm90IGJlIGxvYWRlZCBvciBkZWZpbmVkLiBBcyB3ZWxsLCB0aGUgcGx1Z2luIGNsYXNzIGxvYWRlciB3aWxsIG5vdCBiZSBhZGRlZCBhcyBhIHBhcmVudCBjbGFzc2xvYWRlciB0byB0aGUgQW50IGNsYXNzbG9hZGVyLgotICAgICAgICAgICAgICAgICAgVGhlIGltcGxpZWQgdmFsdWUgaXMgdHJ1ZSwgd2hlbiBub3Qgc3BlY2lmaWVkLjwvbGk+Ci08L3VsPgotPGI+PGk+RXhhbXBsZXM6IDwvaT48L2I+VGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGFuIEFudCB0eXBlcyBleHRlbnNpb24gcG9pbnQ6IAotPHA+Ci08cHJlPgotICAgPGZvbnQgY29sb3I9IiMwMDAwODAiPiZsdDtleHRlbnNpb24gcG9pbnQ9PGZvbnQgY29sb3I9IiMwMDgwMDAiPiZxdW90O29yZy5lY2xpcHNlLmFudC5jb3JlLmFudFR5cGVzJnF1b3Q7PC9mb250PiZndDs8L2ZvbnQ+Ci0gICAgICA8Zm9udCBjb2xvcj0iIzAwMDA4MCI+Jmx0O2FudFR5cGUgbmFtZT08Zm9udCBjb2xvcj0iIzAwODAwMCI+JnF1b3Q7Y29vbFR5cGUmcXVvdDs8L2ZvbnQ+IGNsYXNzPTxmb250IGNvbG9yPSIjMDA4MDAwIj4mcXVvdDtjb20uZXhhbXBsZS5Db29sVHlwZSZxdW90OzwvZm9udD4vJmd0OzwvZm9udD4KLSAgIDxmb250IGNvbG9yPSIjMDAwMDgwIj4mbHQ7L2V4dGVuc2lvbiZndDs8L2ZvbnQ+IAotPC9wcmU+Ci08L3A+PHA+Ci08Zm9udCBzaXplPSItMSIgY29sb3I9IiMzMzY2OTkiPgotPGEgaHJlZj0iaGdsZWdhbC5odG0iPjxpbWcgU1JDPSJuZ2libWNweS5naWYiIEFMVD0iQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAwLCAyMDAzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4iIEJPUkRFUj0wIGhlaWdodD0xMiB3aWR0aD0xOTU+PC9hPjxwPgotPC9mb250PgotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL2RvYy9vcmdfZWNsaXBzZV9hbnRfY29yZV9leHRyYUNsYXNzcGF0aEVudHJpZXMuaHRtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9kb2Mvb3JnX2VjbGlwc2VfYW50X2NvcmVfZXh0cmFDbGFzc3BhdGhFbnRyaWVzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmNzdiMWQuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL2RvYy9vcmdfZWNsaXBzZV9hbnRfY29yZV9leHRyYUNsYXNzcGF0aEVudHJpZXMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci08SEVBRD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxTVFlMRSB0eXBlPSJ0ZXh0L2NzcyI+Ci1kaXYuZHRkLWZyYWdtZW50IHsKLQl3aWR0aDogMTAwJTsKLQlib3JkZXI6IG5vbmU7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2VlZTsKLX0KLTwvU1RZTEU+Ci08L0hFQUQ+Ci08SFRNTD4KLTxCT0RZPgotPEgxPjxDRU5URVI+RXh0cmEgQW50IENsYXNzcGF0aCBFbnRyaWVzPC9DRU5URVI+PC9IMT4KLTxiPjxpPklkZW50aWZpZXI6IDwvaT48L2I+b3JnLmVjbGlwc2UuYW50LmNvcmUuZXh0cmFDbGFzc3BhdGhFbnRyaWVzPHA+Ci08Yj48aT5EZXNjcmlwdGlvbjogPC9pPjwvYj5BbGxvd3MgcGx1Zy1pbnMgdG8gZGVmaW5lIGFyYml0cmFyeSBKQVJzIGZvciB1c2UgYnkgdGhlIEFudCBpbmZyYXN0cnVjdHVyZS4KLVRoZXNlIEpBUnMgYXJlIHB1dCBpbnRvIHRoZSBBbnQgY2xhc3NwYXRoIGF0IHJ1bnRpbWUuICBCZXNpZGVzCi10aGUgSkFSLCB0aGUgcGx1Zy1pbiBjbGFzc2xvYWRlciBvZiB0aGUgcGx1Zy1pbiBwcm92aWRpbmcgdGhlCi1KQVIgaXMgYWxzbyBhZGRlZCB0byB0aGUgY2xhc3NwYXRoLjxwPjxiPjxpPkNvbmZpZ3VyYXRpb24gTWFya3VwOjwvaT48L2I+PHA+Ci08cD48c2FtcD48Zm9udCBjb2xvcj0iIzgwMDAwMCI+Jm5ic3A7Jm5ic3A7ICZsdDshRUxFTUVOVCA8YSBuYW1lPSJlLmV4dGVuc2lvbiI+ZXh0ZW5zaW9uPC9hPiAoPGEgaHJlZj0iI2UuZXh0cmFDbGFzc3BhdGhFbnRyeSI+ZXh0cmFDbGFzc3BhdGhFbnRyeTwvYT4qKSZndDs8L2ZvbnQ+PC9zYW1wPgotPGJyPjxicj48c2FtcD48Zm9udCBjb2xvcj0iIzgwMDAwMCI+Jm5ic3A7Jm5ic3A7ICZsdDshQVRUTElTVCBleHRlbnNpb248L3NhbXA+Ci08YnI+PHNhbXA+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7cG9pbnQmbmJzcDtDREFUQSAjUkVRVUlSRUQ8L3NhbXA+Ci08YnI+PHNhbXA+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7aWQmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtDREFUQSAjSU1QTElFRDwvc2FtcD4KLTxicj48c2FtcD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtuYW1lJm5ic3A7Jm5ic3A7Q0RBVEEgI0lNUExJRUQ8L3NhbXA+Ci08YnI+PHNhbXA+Jm5ic3A7Jm5ic3A7ICZndDs8L2ZvbnQ+PC9zYW1wPgotPHVsPgotPGxpPjxiPnBvaW50PC9iPiAtIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQ8L2xpPgotPGxpPjxiPmlkPC9iPiAtIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZTwvbGk+Ci08bGk+PGI+bmFtZTwvYj4gLSBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2U8L2xpPgotPC91bD4KLTxwPjxzYW1wPjxmb250IGNvbG9yPSIjODAwMDAwIj4mbmJzcDsmbmJzcDsgJmx0OyFFTEVNRU5UIDxhIG5hbWU9ImUuZXh0cmFDbGFzc3BhdGhFbnRyeSI+ZXh0cmFDbGFzc3BhdGhFbnRyeTwvYT4gRU1QVFkmZ3Q7PC9mb250Pjwvc2FtcD4KLTxicj48YnI+PHNhbXA+PGZvbnQgY29sb3I9IiM4MDAwMDAiPiZuYnNwOyZuYnNwOyAmbHQ7IUFUVExJU1QgZXh0cmFDbGFzc3BhdGhFbnRyeTwvc2FtcD4KLTxicj48c2FtcD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtsaWJyYXJ5Jm5ic3A7Jm5ic3A7Q0RBVEEgI1JFUVVJUkVEPC9zYW1wPgotPGJyPjxzYW1wPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO2hlYWRsZXNzJm5ic3A7Q0RBVEEgI0lNUExJRUQ8L3NhbXA+Ci08YnI+PHNhbXA+Jm5ic3A7Jm5ic3A7ICZndDs8L2ZvbnQ+PC9zYW1wPgotPHVsPgotPGxpPjxiPmxpYnJhcnk8L2I+IC0gYSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBwbHVnLWluIGluc3RhbGwgbG9jYXRpb24gZm9yIHRoZSBsaWJyYXJ5LjwvbGk+Ci08bGk+PGI+aGVhZGxlc3M8L2I+IC0gaW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBleHRyYSBjbGFzc3BhdGggZW50cnkgaXMgc3VpdGFibGUgZm9yIHVzZSBpbiBhICJoZWFkbGVzcyIgQW50IGVudmlyb25tZW50LiBJZiBydW5uaW5nIGhlYWRsZXNzIGFuZCB0aGUgYXR0cmlidXRlIGlzICJmYWxzZSIsIAotICAgICAgICAgICAgICAgICAgdGhpcyBlbnRyeSB3aWxsIG5vdCBiZSBhZGRlZCB0byB0aGUgQW50IGNsYXNzcGF0aC4gQXMgd2VsbCwgdGhlIHBsdWdpbiBjbGFzcyBsb2FkZXIgd2lsbCBub3QgYmUgYWRkZWQgYXMgYSBwYXJlbnQgY2xhc3Nsb2FkZXIgdG8gdGhlIEFudCBjbGFzc2xvYWRlci4KLSAgICAgICAgICAgICAgICAgIFRoZSBpbXBsaWVkIHZhbHVlIGlzIHRydWUsIHdoZW4gbm90IHNwZWNpZmllZC48L2xpPgotPC91bD4KLTxiPjxpPkV4YW1wbGVzOiA8L2k+PC9iPlRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBhbiBleHRyYSBjbGFzc3BhdGggZW50cmllcyBleHRlbnNpb24gcG9pbnQ6Ci0KLTxwPgotPHByZT4KLSA8Zm9udCBjb2xvcj0iIzAwMDA4MCI+Jmx0O2V4dGVuc2lvbiBwb2ludD08Zm9udCBjb2xvcj0iIzAwODAwMCI+JnF1b3Q7b3JnLmVjbGlwc2UuYW50LmNvcmUuZXh0cmFDbGFzc3BhdGhFbnRyaWVzJnF1b3Q7PC9mb250PiZndDs8L2ZvbnQ+Ci0gIDxmb250IGNvbG9yPSIjMDAwMDgwIj4mbHQ7ZXh0cmFDbGFzc3BhdGhFbnRyeSBsaWJyYXJ5PTxmb250IGNvbG9yPSIjMDA4MDAwIj4mcXVvdDtteUV4dHJhTGlicmFyeS5qYXImcXVvdDs8L2ZvbnQ+LyZndDs8L2ZvbnQ+Ci0gPGZvbnQgY29sb3I9IiMwMDAwODAiPiZsdDsvZXh0ZW5zaW9uJmd0OzwvZm9udD4KLTwvcHJlPgotPC9wPjxwPgotPGI+PGk+U3VwcGxpZWQgSW1wbGVtZW50YXRpb246IDwvaT48L2I+VGhlIHBsYXRmb3JtIGl0c2VsZiBzdXBwbGllcyBhbiBBbnQgc3VwcG9ydCBqYXIgKGFudHN1cHBvcnRsaWIuamFyKS48cD4KLTxmb250IHNpemU9Ii0xIiBjb2xvcj0iIzMzNjY5OSI+Ci08YSBocmVmPSJoZ2xlZ2FsLmh0bSI+PGltZyBTUkM9Im5naWJtY3B5LmdpZiIgQUxUPSJDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDAsIDIwMDMuICBBbGwgUmlnaHRzIFJlc2VydmVkLiIgQk9SREVSPTAgaGVpZ2h0PTEyIHdpZHRoPTE5NT48L2E+PHA+Ci08L2ZvbnQ+Ci08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvbGliL2FudHN1cHBvcnRsaWIuamFyIGIvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL2xpYi9hbnRzdXBwb3J0bGliLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU5ZDU2Yi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvbGliL2FudHN1cHBvcnRsaWIuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmJkNzc4Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWUgPSBBbnQgQnVpbGQgVG9vbCBDb3JlCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwotY2xhc3NwYXRoTmFtZSA9IEV4dHJhIEFudCBDbGFzc3BhdGggRW50cnkgRGVmaW5pdGlvbnMKLXRhc2tzTmFtZSA9IEFudCBUYXNrIERlZmluaXRpb25zCi10eXBlc05hbWUgPSBBbnQgVHlwZSBEZWZpbml0aW9ucwpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3BsdWdpbi54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZmNzE2My4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cGx1Z2luCi0gICBpZD0ib3JnLmVjbGlwc2UuYW50LmNvcmUiCi0gICBuYW1lPSIlcGx1Z2luTmFtZSIKLSAgIHZlcnNpb249IjIuMS4xIgotICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgIGNsYXNzPSJvcmcuZWNsaXBzZS5hbnQuY29yZS5BbnRDb3JlUGx1Z2luIj4KLQotICAgPHJlcXVpcmVzPgotICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmFwYWNoZS54ZXJjZXMiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxydW50aW1lPgotICAgICA8bGlicmFyeSBuYW1lPSJhbnRzdXBwb3J0LmphciI+Ci0gICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgICAgPHBhY2thZ2VzIHByZWZpeGVzPSJvcmcuZWNsaXBzZS5hbnQiLz4KLSAgICAgPC9saWJyYXJ5PgotICAgPC9ydW50aW1lPgotCi0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJleHRyYUNsYXNzcGF0aEVudHJpZXMiIG5hbWU9IiVjbGFzc3BhdGhOYW1lIiBzY2hlbWE9InNjaGVtYS9leHRyYUNsYXNzcGF0aEVudHJpZXMuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iYW50VGFza3MiIG5hbWU9IiV0YXNrc05hbWUiIHNjaGVtYT0ic2NoZW1hL2FudFRhc2tzLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImFudFR5cGVzIiBuYW1lPSIldHlwZXNOYW1lIiBzY2hlbWE9InNjaGVtYS9hbnRUeXBlcy5leHNkIi8+Ci0KLSAgIDwhLS0gQXBwbGljYXRpb25zIC0tPgotICAgPGV4dGVuc2lvbgotICAgICBpZD0iYW50UnVubmVyIgotICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmFwcGxpY2F0aW9ucyI+Ci0gICAgIDxhcHBsaWNhdGlvbj4KLSAgICAgICA8cnVuCi0gICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuYW50LmNvcmUuQW50UnVubmVyIj4KLSAgICAgICA8L3J1bj4KLSAgICA8L2FwcGxpY2F0aW9uPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDwhLS0gRXh0cmEgQ2xhc3NwYXRoIC0tPgotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuYW50LmNvcmUuZXh0cmFDbGFzc3BhdGhFbnRyaWVzIj4KLSAgICAgIDxleHRyYUNsYXNzcGF0aEVudHJ5Ci0gICAgICAgICBsaWJyYXJ5PSJsaWIvYW50c3VwcG9ydGxpYi5qYXIiPgotICAgICAgPC9leHRyYUNsYXNzcGF0aEVudHJ5PgotICAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9yMl8wX2J1aWxkbm90ZXNfcGxhdGZvcm0tYW50Lmh0bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvcjJfMF9idWlsZG5vdGVzX3BsYXRmb3JtLWFudC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzhkNjlhLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9yMl8wX2J1aWxkbm90ZXNfcGxhdGZvcm0tYW50Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NTIgKzAsMCBAQAotPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KLTxodG1sPgotPGhlYWQ+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDxtZXRhIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iTW96aWxsYS80LjcgW2VuXSAoV2luTlQ7IEkpIFtOZXRzY2FwZV0iPgotICAgPHRpdGxlPkVjbGlwc2UgUGxhdGZvcm0gUmVsZWFzZSBOb3RlcyBDb3JlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotCi08aDE+Ci1FY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotQW50PC9oMT4KLUVjbGlwc2UgU0RLIEJ1aWxkIDIwMDIwNjEyCi08aDI+Ci1XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci0KLTxoMz4KLUFQSSBjaGFuZ2VzPC9oMz4KLQotPHVsPgotPGxpPgotTm9uZS48L2xpPgotPC91bD4KLQotPGgzPgotT3RoZXIgaGlnaGxpZ2h0czwvaDM+Ci0KLTx1bD4KLTxsaT4KLU5vbmUuPC9saT4KLTwvdWw+Ci0KLTxoMz4KLVJlc29sdmVkIEJ1Z3M8L2gzPgotCi08dWw+Ci08bGk+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3MvYnVnbGlzdC5jZ2k/YnVnX3N0YXR1cz1SRVNPTFZFRCZidWdfc3RhdHVzPVZFUklGSUVEJmJ1Z19zdGF0dXM9Q0xPU0VEJmVtYWlsMT0mZW1haWx0eXBlMT1zdWJzdHJpbmcmZW1haWxhc3NpZ25lZF90bzE9MSZlbWFpbDI9JmVtYWlsdHlwZTI9c3Vic3RyaW5nJmVtYWlscmVwb3J0ZXIyPTEmYnVnaWR0eXBlPWluY2x1ZGUmYnVnX2lkPSZjaGFuZ2VkaW49JnZvdGVzPSZjaGZpZWxkPWJ1Z19zdGF0dXMmY2hmaWVsZGZyb209MjAwMiUyRjA2JTJGMTEmY2hmaWVsZHRvPTIwMDIlMkYwNiUyRjEyJmNoZmllbGR2YWx1ZT0mcHJvZHVjdD1QbGF0Zm9ybSZjb21wb25lbnQ9QW50JnNob3J0X2Rlc2M9JnNob3J0X2Rlc2NfdHlwZT1hbGx3b3Jkc3N1YnN0ciZsb25nX2Rlc2M9JmxvbmdfZGVzY190eXBlPWFsbHdvcmRzc3Vic3RyJmtleXdvcmRzPSZrZXl3b3Jkc190eXBlPWFueXdvcmRzJmZpZWxkMC0wLTA9bm9vcCZ0eXBlMC0wLTA9bm9vcCZ2YWx1ZTAtMC0wPSZmaWVsZDAtMC0xPW5vb3AmdHlwZTAtMC0xPW5vb3AmdmFsdWUwLTAtMT0mY21kdHlwZT1kb2l0Jm9yZGVyPUJ1ZytOdW1iZXIiPkNsaWNrCi1oZXJlPC9hPiB0byBzZWUgUFJzIHdoaWNoIGhhdmUgYmVlbiBtYXJrZWQgYXMgUkVTT0xWRUQsIFZFUklGSUVEIG9yIENMT1NFRAotc2luY2UgdGhlIGxhc3QgaW50ZWdyYXRpb24gYnVpbGQuPC9saT4KLTwvdWw+Ci0KLTxoMT4KLQotPGhyIFdJRFRIPSIxMDAlIj5FY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotQW50PC9oMT4KLUVjbGlwc2UgU0RLIEJ1aWxkIDIwMDIwNjExCi08aDI+Ci1XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci0KLTxoMz4KLUFQSSBjaGFuZ2VzPC9oMz4KLQotPHVsPgotPGxpPgotTm9uZS48L2xpPgotPC91bD4KLQotPGgzPgotT3RoZXIgaGlnaGxpZ2h0czwvaDM+Ci0KLTx1bD4KLTxsaT4KLU5vbmUuPC9saT4KLTwvdWw+Ci0KLTxoMz4KLVJlc29sdmVkIEJ1Z3M8L2gzPgotCi08dWw+Ci08bGk+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3MvYnVnbGlzdC5jZ2k/YnVnX3N0YXR1cz1SRVNPTFZFRCZidWdfc3RhdHVzPVZFUklGSUVEJmJ1Z19zdGF0dXM9Q0xPU0VEJmVtYWlsMT0mZW1haWx0eXBlMT1zdWJzdHJpbmcmZW1haWxhc3NpZ25lZF90bzE9MSZlbWFpbDI9JmVtYWlsdHlwZTI9c3Vic3RyaW5nJmVtYWlscmVwb3J0ZXIyPTEmYnVnaWR0eXBlPWluY2x1ZGUmYnVnX2lkPSZjaGFuZ2VkaW49JnZvdGVzPSZjaGZpZWxkPWJ1Z19zdGF0dXMmY2hmaWVsZGZyb209MjAwMiUyRjA2JTJGMDcmY2hmaWVsZHRvPTIwMDIlMkYwNiUyRjExJmNoZmllbGR2YWx1ZT0mcHJvZHVjdD1QbGF0Zm9ybSZjb21wb25lbnQ9QW50JnNob3J0X2Rlc2M9JnNob3J0X2Rlc2NfdHlwZT1hbGx3b3Jkc3N1YnN0ciZsb25nX2Rlc2M9JmxvbmdfZGVzY190eXBlPWFsbHdvcmRzc3Vic3RyJmtleXdvcmRzPSZrZXl3b3Jkc190eXBlPWFueXdvcmRzJmZpZWxkMC0wLTA9bm9vcCZ0eXBlMC0wLTA9bm9vcCZ2YWx1ZTAtMC0wPSZmaWVsZDAtMC0xPW5vb3AmdHlwZTAtMC0xPW5vb3AmdmFsdWUwLTAtMT0mY21kdHlwZT1kb2l0Jm9yZGVyPUJ1ZytOdW1iZXIiPkNsaWNrCi1oZXJlPC9hPiB0byBzZWUgUFJzIHdoaWNoIGhhdmUgYmVlbiBtYXJrZWQgYXMgUkVTT0xWRUQsIFZFUklGSUVEIG9yIENMT1NFRAotc2luY2UgdGhlIGxhc3QgaW50ZWdyYXRpb24gYnVpbGQuPC9saT4KLTwvdWw+Ci0KLTxoMT4KLQotPGhyIFdJRFRIPSIxMDAlIj5FY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotQW50PC9oMT4KLUVjbGlwc2UgU0RLIEJ1aWxkIDIwMDIwNjA3Ci08aDI+Ci1XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci0KLTxoMz4KLUFQSSBjaGFuZ2VzPC9oMz4KLQotPHVsPgotPGxpPgotTm9uZS48L2xpPgotPC91bD4KLQotPGgzPgotT3RoZXIgaGlnaGxpZ2h0czwvaDM+Ci0KLTx1bD4KLTxsaT4KLU5vbmUuPC9saT4KLTwvdWw+Ci0KLTxoMz4KLVJlc29sdmVkIEJ1Z3M8L2gzPgotCi08dWw+Ci08bGk+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3MvYnVnbGlzdC5jZ2k/YnVnX3N0YXR1cz1SRVNPTFZFRCZidWdfc3RhdHVzPVZFUklGSUVEJmJ1Z19zdGF0dXM9Q0xPU0VEJmVtYWlsMT0mZW1haWx0eXBlMT1zdWJzdHJpbmcmZW1haWxhc3NpZ25lZF90bzE9MSZlbWFpbDI9JmVtYWlsdHlwZTI9c3Vic3RyaW5nJmVtYWlscmVwb3J0ZXIyPTEmYnVnaWR0eXBlPWluY2x1ZGUmYnVnX2lkPSZjaGFuZ2VkaW49JnZvdGVzPSZjaGZpZWxkPWJ1Z19zdGF0dXMmY2hmaWVsZGZyb209MjAwMiUyRjA1JTJGMzEmY2hmaWVsZHRvPTIwMDIlMkYwNiUyRjA3JmNoZmllbGR2YWx1ZT0mcHJvZHVjdD1QbGF0Zm9ybSZjb21wb25lbnQ9QW50JnNob3J0X2Rlc2M9JnNob3J0X2Rlc2NfdHlwZT1hbGx3b3Jkc3N1YnN0ciZsb25nX2Rlc2M9JmxvbmdfZGVzY190eXBlPWFsbHdvcmRzc3Vic3RyJmtleXdvcmRzPSZrZXl3b3Jkc190eXBlPWFueXdvcmRzJmZpZWxkMC0wLTA9bm9vcCZ0eXBlMC0wLTA9bm9vcCZ2YWx1ZTAtMC0wPSZmaWVsZDAtMC0xPW5vb3AmdHlwZTAtMC0xPW5vb3AmdmFsdWUwLTAtMT0mY21kdHlwZT1kb2l0Jm9yZGVyPUJ1ZytOdW1iZXIiPkNsaWNrCi1oZXJlPC9hPiB0byBzZWUgUFJzIHdoaWNoIGhhdmUgYmVlbiBtYXJrZWQgYXMgUkVTT0xWRUQsIFZFUklGSUVEIG9yIENMT1NFRAotc2luY2UgdGhlIGxhc3QgaW50ZWdyYXRpb24gYnVpbGQuPC9saT4KLTwvdWw+Ci0KLTxoMT4KLQotPGhyIFdJRFRIPSIxMDAlIj5FY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotQW50PC9oMT4KLUVjbGlwc2UgU0RLIEJ1aWxkIDIwMDIwNTMxCi08aDI+Ci1XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci0KLTxoMz4KLUFQSSBjaGFuZ2VzPC9oMz4KLQotPHVsPgotPGxpPgotTm9uZS48L2xpPgotPC91bD4KLQotPGgzPgotT3RoZXIgaGlnaGxpZ2h0czwvaDM+Ci0KLTx1bD4KLTxsaT4KLU5vbmUuPC9saT4KLTwvdWw+Ci0KLTxoMz4KLVJlc29sdmVkIEJ1Z3M8L2gzPgotCi08dWw+Ci08bGk+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3MvYnVnbGlzdC5jZ2k/YnVnX3N0YXR1cz1SRVNPTFZFRCZidWdfc3RhdHVzPVZFUklGSUVEJmJ1Z19zdGF0dXM9Q0xPU0VEJmVtYWlsMT0mZW1haWx0eXBlMT1zdWJzdHJpbmcmZW1haWxhc3NpZ25lZF90bzE9MSZlbWFpbDI9JmVtYWlsdHlwZTI9c3Vic3RyaW5nJmVtYWlscmVwb3J0ZXIyPTEmYnVnaWR0eXBlPWluY2x1ZGUmYnVnX2lkPSZjaGFuZ2VkaW49JnZvdGVzPSZjaGZpZWxkPWJ1Z19zdGF0dXMmY2hmaWVsZGZyb209MjAwMiUyRjA1JTJGMzAmY2hmaWVsZHRvPTIwMDIlMkYwNSUyRjMxJmNoZmllbGR2YWx1ZT0mcHJvZHVjdD1QbGF0Zm9ybSZjb21wb25lbnQ9QW50JnNob3J0X2Rlc2M9JnNob3J0X2Rlc2NfdHlwZT1hbGx3b3Jkc3N1YnN0ciZsb25nX2Rlc2M9JmxvbmdfZGVzY190eXBlPWFsbHdvcmRzc3Vic3RyJmtleXdvcmRzPSZrZXl3b3Jkc190eXBlPWFueXdvcmRzJmZpZWxkMC0wLTA9bm9vcCZ0eXBlMC0wLTA9bm9vcCZ2YWx1ZTAtMC0wPSZmaWVsZDAtMC0xPW5vb3AmdHlwZTAtMC0xPW5vb3AmdmFsdWUwLTAtMT0mY21kdHlwZT1kb2l0Jm9yZGVyPUJ1ZytOdW1iZXIiPkNsaWNrCi1oZXJlPC9hPiB0byBzZWUgUFJzIHdoaWNoIGhhdmUgYmVlbiBtYXJrZWQgYXMgUkVTT0xWRUQsIFZFUklGSUVEIG9yIENMT1NFRAotc2luY2UgdGhlIGxhc3QgaW50ZWdyYXRpb24gYnVpbGQuPC9saT4KLTwvdWw+Ci0KLTxociBXSURUSD0iMTAwJSI+Ci08aDE+Ci1FY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotQW50PC9oMT4KLUVjbGlwc2UgU0RLIEJ1aWxkIDIwMDIwNTMwCi08aDI+Ci1XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci0KLTxoMz4KLUFQSSBjaGFuZ2VzPC9oMz4KLQotPHVsPgotPGxpPgotTm9uZS48L2xpPgotPC91bD4KLQotPGgzPgotT3RoZXIgaGlnaGxpZ2h0czwvaDM+Ci0KLTx1bD4KLTxsaT4KLU5vbmUuPC9saT4KLTwvdWw+Ci0KLTxoMz4KLVJlc29sdmVkIEJ1Z3M8L2gzPgotCi08dWw+Ci08bGk+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3MvYnVnbGlzdC5jZ2k/YnVnX3N0YXR1cz1SRVNPTFZFRCZidWdfc3RhdHVzPVZFUklGSUVEJmJ1Z19zdGF0dXM9Q0xPU0VEJmVtYWlsMT0mZW1haWx0eXBlMT1zdWJzdHJpbmcmZW1haWxhc3NpZ25lZF90bzE9MSZlbWFpbDI9JmVtYWlsdHlwZTI9c3Vic3RyaW5nJmVtYWlscmVwb3J0ZXIyPTEmYnVnaWR0eXBlPWluY2x1ZGUmYnVnX2lkPSZjaGFuZ2VkaW49JnZvdGVzPSZjaGZpZWxkPWJ1Z19zdGF0dXMmY2hmaWVsZGZyb209MjAwMiUyRjA1JTJGMjkmY2hmaWVsZHRvPTIwMDIlMkYwNSUyRjMwJmNoZmllbGR2YWx1ZT0mcHJvZHVjdD1QbGF0Zm9ybSZjb21wb25lbnQ9QW50JnNob3J0X2Rlc2M9JnNob3J0X2Rlc2NfdHlwZT1hbGx3b3Jkc3N1YnN0ciZsb25nX2Rlc2M9JmxvbmdfZGVzY190eXBlPWFsbHdvcmRzc3Vic3RyJmtleXdvcmRzPSZrZXl3b3Jkc190eXBlPWFueXdvcmRzJmZpZWxkMC0wLTA9bm9vcCZ0eXBlMC0wLTA9bm9vcCZ2YWx1ZTAtMC0wPSZjbWR0eXBlPWRvaXQmb3JkZXI9QnVnK051bWJlciI+Q2xpY2sKLWhlcmU8L2E+IHRvIHNlZSBQUnMgd2hpY2ggaGF2ZSBiZWVuIG1hcmtlZCBhcyBSRVNPTFZFRCwgVkVSSUZJRUQgb3IgQ0xPU0VECi1zaW5jZSB0aGUgbGFzdCBpbnRlZ3JhdGlvbiBidWlsZC48L2xpPgotPC91bD4KLQotPGgxPgotCi08aHIgV0lEVEg9IjEwMCUiPkVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+Ci1BbnQ8L2gxPgotRWNsaXBzZSBTREsgQnVpbGQgMjAwMjA1MjkKLTxoMj4KLVdoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KLQotPGgzPgotQVBJIGNoYW5nZXM8L2gzPgotCi08dWw+Ci08bGk+Ci1Ob25lLjwvbGk+Ci08L3VsPgotCi08aDM+Ci1PdGhlciBoaWdobGlnaHRzPC9oMz4KLQotPHVsPgotPGxpPgotTm9uZS48L2xpPgotPC91bD4KLQotPGgzPgotUmVzb2x2ZWQgQnVnczwvaDM+Ci0KLTx1bD4KLTxsaT4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9idWdsaXN0LmNnaT9idWdfc3RhdHVzPVJFU09MVkVEJmJ1Z19zdGF0dXM9VkVSSUZJRUQmYnVnX3N0YXR1cz1DTE9TRUQmZW1haWwxPSZlbWFpbHR5cGUxPXN1YnN0cmluZyZlbWFpbGFzc2lnbmVkX3RvMT0xJmVtYWlsMj0mZW1haWx0eXBlMj1zdWJzdHJpbmcmZW1haWxyZXBvcnRlcjI9MSZidWdpZHR5cGU9aW5jbHVkZSZidWdfaWQ9JmNoYW5nZWRpbj0mdm90ZXM9JmNoZmllbGQ9YnVnX3N0YXR1cyZjaGZpZWxkZnJvbT0yMDAyJTJGMDUlMkYyMSZjaGZpZWxkdG89MjAwMiUyRjA1JTJGMjkmY2hmaWVsZHZhbHVlPSZwcm9kdWN0PVBsYXRmb3JtJmNvbXBvbmVudD1BbnQmc2hvcnRfZGVzYz0mc2hvcnRfZGVzY190eXBlPWFsbHdvcmRzc3Vic3RyJmxvbmdfZGVzYz0mbG9uZ19kZXNjX3R5cGU9YWxsd29yZHNzdWJzdHIma2V5d29yZHM9JmtleXdvcmRzX3R5cGU9YW55d29yZHMmZmllbGQwLTAtMD1ub29wJnR5cGUwLTAtMD1ub29wJnZhbHVlMC0wLTA9JmNtZHR5cGU9ZG9pdCZvcmRlcj1CdWcrTnVtYmVyIj5DbGljawotaGVyZTwvYT4gdG8gc2VlIFBScyB3aGljaCBoYXZlIGJlZW4gbWFya2VkIGFzIFJFU09MVkVELCBWRVJJRklFRCBvciBDTE9TRUQKLXNpbmNlIHRoZSBsYXN0IGludGVncmF0aW9uIGJ1aWxkLjwvbGk+Ci08L3VsPgotCi08aDE+Ci0KLTxociBXSURUSD0iMTAwJSI+RWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KLUFudDwvaDE+Ci1FY2xpcHNlIFNESyBCdWlsZCAyMDAyMDUyMQotPGgyPgotV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgotCi08aDM+Ci1BUEkgY2hhbmdlczwvaDM+Ci0KLTx1bD4KLTxsaT4KLVRoZSBwbHVnLWluIDxiPjx0dD5vcmcuZWNsaXBzZS5hbnQudWk8L3R0PjwvYj4gaGFzIGJlZW4gcmVtb3ZlZCBpbiBmYXZvcgotb2YgPGI+PHR0Pm9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHM8L3R0PjwvYj4uPC9saT4KLTwvdWw+Ci0KLTxoMz4KLU90aGVyIGhpZ2hsaWdodHM8L2gzPgotCi08dWw+Ci08bGk+Ci1Ob25lLjwvbGk+Ci08L3VsPgotCi08aDM+Ci1SZXNvbHZlZCBCdWdzPC9oMz4KLQotPHVsPgotPGxpPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL2J1Z2xpc3QuY2dpP2J1Z19zdGF0dXM9UkVTT0xWRUQmYnVnX3N0YXR1cz1WRVJJRklFRCZidWdfc3RhdHVzPUNMT1NFRCZlbWFpbDE9JmVtYWlsdHlwZTE9c3Vic3RyaW5nJmVtYWlsYXNzaWduZWRfdG8xPTEmZW1haWwyPSZlbWFpbHR5cGUyPXN1YnN0cmluZyZlbWFpbHJlcG9ydGVyMj0xJmJ1Z2lkdHlwZT1pbmNsdWRlJmJ1Z19pZD0mY2hhbmdlZGluPSZ2b3Rlcz0mY2hmaWVsZD1idWdfc3RhdHVzJmNoZmllbGRmcm9tPTIwMDIlMkYwNSUyRjE0JmNoZmllbGR0bz0yMDAyJTJGMDUlMkYyMSZjaGZpZWxkdmFsdWU9JnByb2R1Y3Q9UGxhdGZvcm0mY29tcG9uZW50PUFudCZzaG9ydF9kZXNjPSZzaG9ydF9kZXNjX3R5cGU9YWxsd29yZHNzdWJzdHImbG9uZ19kZXNjPSZsb25nX2Rlc2NfdHlwZT1hbGx3b3Jkc3N1YnN0ciZrZXl3b3Jkcz0ma2V5d29yZHNfdHlwZT1hbnl3b3JkcyZmaWVsZDAtMC0wPW5vb3AmdHlwZTAtMC0wPW5vb3AmdmFsdWUwLTAtMD0mY21kdHlwZT1kb2l0Jm9yZGVyPUJ1ZytOdW1iZXIiPkNsaWNrCi1oZXJlPC9hPiB0byBzZWUgUFJzIHdoaWNoIGhhdmUgYmVlbiBtYXJrZWQgYXMgUkVTT0xWRUQsIFZFUklGSUVEIG9yIENMT1NFRAotc2luY2UgdGhlIGxhc3QgaW50ZWdyYXRpb24gYnVpbGQuPC9saT4KLTwvdWw+Ci0KLTxociBXSURUSD0iMTAwJSI+Ci08aDE+Ci1FY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotQW50PC9oMT4KLUVjbGlwc2UgU0RLIEJ1aWxkIDIwMDIwNTE0Ci08aDI+Ci1XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci0KLTxoMz4KLUFQSSBjaGFuZ2VzPC9oMz4KLQotPHVsPgotPGxpPgotTm9uZS48L2xpPgotPC91bD4KLQotPGgzPgotT3RoZXIgaGlnaGxpZ2h0czwvaDM+Ci0KLTx1bD4KLTxsaT4KLUFudCB0eXBlIGVjbGlwc2UuY29tbWFwYXR0ZXJuc2V0IGhhcyBiZWVuIHJlbW92ZWQuPC9saT4KLTwvdWw+Ci0KLTxoMz4KLVJlc29sdmVkIEJ1Z3M8L2gzPgotCi08dWw+Ci08bGk+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3MvYnVnbGlzdC5jZ2k/YnVnX3N0YXR1cz1SRVNPTFZFRCZidWdfc3RhdHVzPVZFUklGSUVEJmJ1Z19zdGF0dXM9Q0xPU0VEJmVtYWlsMT0mZW1haWx0eXBlMT1zdWJzdHJpbmcmZW1haWxhc3NpZ25lZF90bzE9MSZlbWFpbDI9JmVtYWlsdHlwZTI9c3Vic3RyaW5nJmVtYWlscmVwb3J0ZXIyPTEmYnVnaWR0eXBlPWluY2x1ZGUmYnVnX2lkPSZjaGFuZ2VkaW49JnZvdGVzPSZjaGZpZWxkPWJ1Z19zdGF0dXMmY2hmaWVsZGZyb209MjAwMiUyRjA0JTJGMzAmY2hmaWVsZHRvPTIwMDIlMkYwNSUyRjE0JmNoZmllbGR2YWx1ZT0mcHJvZHVjdD1QbGF0Zm9ybSZjb21wb25lbnQ9QW50JnNob3J0X2Rlc2M9JnNob3J0X2Rlc2NfdHlwZT1hbGx3b3Jkc3N1YnN0ciZsb25nX2Rlc2M9JmxvbmdfZGVzY190eXBlPWFsbHdvcmRzc3Vic3RyJmtleXdvcmRzPSZrZXl3b3Jkc190eXBlPWFueXdvcmRzJmZpZWxkMC0wLTA9bm9vcCZ0eXBlMC0wLTA9bm9vcCZ2YWx1ZTAtMC0wPSZjbWR0eXBlPWRvaXQmb3JkZXI9QnVnK051bWJlciI+Q2xpY2sKLWhlcmU8L2E+IHRvIHNlZSBQUnMgd2hpY2ggaGF2ZSBiZWVuIG1hcmtlZCBhcyBSRVNPTFZFRCwgVkVSSUZJRUQgb3IgQ0xPU0VECi1zaW5jZSB0aGUgbGFzdCBpbnRlZ3JhdGlvbiBidWlsZC48L2xpPgotPC91bD4KLQotPGgxPgotCi08aHIgV0lEVEg9IjEwMCUiPkVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+Ci1BbnQ8L2gxPgotRWNsaXBzZSBTREsgQnVpbGQgMjAwMjA0MzAKLTxoMj4KLVdoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KLQotPGgzPgotQVBJIGNoYW5nZXM8L2gzPgotCi08dWw+Ci08bGk+Ci1Ob25lLjwvbGk+Ci08L3VsPgotCi08aDM+Ci1PdGhlciBoaWdobGlnaHRzPC9oMz4KLQotPHVsPgotPGxpPgotVHlwZSBjb21tYXBhdHRlcm5zZXQgaXMgbm93IGNhbGxlZCBlY2xpcHNlLmNvbW1hcGF0dGVybnNldCAuPC9saT4KLTwvdWw+Ci0KLTxoMz4KLVJlc29sdmVkIEJ1Z3M8L2gzPgotCi08dWw+Ci08bGk+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3MvYnVnbGlzdC5jZ2k/YnVnX3N0YXR1cz1SRVNPTFZFRCZidWdfc3RhdHVzPVZFUklGSUVEJmJ1Z19zdGF0dXM9Q0xPU0VEJmVtYWlsMT0mZW1haWx0eXBlMT1zdWJzdHJpbmcmZW1haWxhc3NpZ25lZF90bzE9MSZlbWFpbDI9JmVtYWlsdHlwZTI9c3Vic3RyaW5nJmVtYWlscmVwb3J0ZXIyPTEmYnVnaWR0eXBlPWluY2x1ZGUmYnVnX2lkPSZjaGFuZ2VkaW49JnZvdGVzPSZjaGZpZWxkPWJ1Z19zdGF0dXMmY2hmaWVsZGZyb209MjAwMiUyRjA0JTJGMTImY2hmaWVsZHRvPTIwMDIlMkYwNCUyRjMwJmNoZmllbGR2YWx1ZT0mcHJvZHVjdD1QbGF0Zm9ybSZjb21wb25lbnQ9QW50JnNob3J0X2Rlc2M9JnNob3J0X2Rlc2NfdHlwZT1hbGx3b3Jkc3N1YnN0ciZsb25nX2Rlc2M9JmxvbmdfZGVzY190eXBlPWFsbHdvcmRzc3Vic3RyJmtleXdvcmRzPSZrZXl3b3Jkc190eXBlPWFueXdvcmRzJmZpZWxkMC0wLTA9bm9vcCZ0eXBlMC0wLTA9bm9vcCZ2YWx1ZTAtMC0wPSZjbWR0eXBlPWRvaXQmb3JkZXI9QnVnK051bWJlciI+Q2xpY2sKLWhlcmU8L2E+IHRvIHNlZSBQUnMgd2hpY2ggaGF2ZSBiZWVuIG1hcmtlZCBhcyBSRVNPTFZFRCwgVkVSSUZJRUQgb3IgQ0xPU0VECi1zaW5jZSB0aGUgbGFzdCBpbnRlZ3JhdGlvbiBidWlsZC48L2xpPgotPC91bD4KLQotPGgxPgotCi08aHIgV0lEVEg9IjEwMCUiPkVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+Ci1BbnQ8L2gxPgotRWNsaXBzZSBTREsgQnVpbGQgMjAwMjA0MTEKLTxoMj4KLVdoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KLQotPGgzPgotQVBJIGNoYW5nZXM8L2gzPgotCi08dWw+Ci08bGk+Ci1Ob25lLjwvbGk+Ci08L3VsPgotCi08aDM+Ci1PdGhlciBoaWdobGlnaHRzPC9oMz4KLQotPHVsPgotPGxpPgotTm9uZS48L2xpPgotPC91bD4KLQotPGgzPgotUmVzb2x2ZWQgQnVnczwvaDM+Ci0KLTx1bD4KLTxsaT4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9idWdsaXN0LmNnaT9idWdfc3RhdHVzPVJFU09MVkVEJmJ1Z19zdGF0dXM9VkVSSUZJRUQmYnVnX3N0YXR1cz1DTE9TRUQmZW1haWwxPSZlbWFpbHR5cGUxPXN1YnN0cmluZyZlbWFpbGFzc2lnbmVkX3RvMT0xJmVtYWlsMj0mZW1haWx0eXBlMj1zdWJzdHJpbmcmZW1haWxyZXBvcnRlcjI9MSZidWdpZHR5cGU9aW5jbHVkZSZidWdfaWQ9JmNoYW5nZWRpbj0mdm90ZXM9JmNoZmllbGQ9YnVnX3N0YXR1cyZjaGZpZWxkZnJvbT0yMDAyJTJGMDQlMkYwOSZjaGZpZWxkdG89MjAwMiUyRjA0JTJGMTImY2hmaWVsZHZhbHVlPSZwcm9kdWN0PVBsYXRmb3JtJmNvbXBvbmVudD1BbnQmc2hvcnRfZGVzYz0mc2hvcnRfZGVzY190eXBlPWFsbHdvcmRzc3Vic3RyJmxvbmdfZGVzYz0mbG9uZ19kZXNjX3R5cGU9YWxsd29yZHNzdWJzdHIma2V5d29yZHM9JmtleXdvcmRzX3R5cGU9YW55d29yZHMmZmllbGQwLTAtMD1ub29wJnR5cGUwLTAtMD1ub29wJnZhbHVlMC0wLTA9JmNtZHR5cGU9ZG9pdCZuYW1lZGNtZD1BY3RpdmUmbmV3cXVlcnluYW1lPSZvcmRlcj1CdWcrTnVtYmVyIj5DbGljawotaGVyZTwvYT4gdG8gc2VlIFBScyB3aGljaCBoYXZlIGJlZW4gbWFya2VkIGFzIFJFU09MVkVELCBWRVJJRklFRCBvciBDTE9TRUQKLXNpbmNlIHRoZSBsYXN0IGludGVncmF0aW9uIGJ1aWxkLjwvbGk+Ci08L3VsPgotCi08aDE+Ci0KLTxociBXSURUSD0iMTAwJSI+RWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KLUFudDwvaDE+Ci1FY2xpcHNlIFNESyBCdWlsZCAyMDAyMDQwOQotPGgyPgotV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgotCi08aDM+Ci1BUEkgY2hhbmdlczwvaDM+Ci0KLTx1bD4KLTxsaT4KLTxiPjx0dD5vcmcuZWNsaXBzZS5hbnQuY29yZTwvdHQ+PC9iPiBkb2VzIG5vdCBleHBvcnQgPGI+PHR0Pm9yZy5hcGFjaGUuYW50PC90dD48L2I+Ci1hbnltb3JlLiBQbHVnLWlucyB0aGF0IG5lZWQgdG8gaGF2ZSBhY2Nlc3MgdG8gQW50IGNsYXNzZXMgbmVlZCB0byByZXF1aXJlCi08Yj48dHQ+b3JnLmFwYWNoZS5hbnQ8L3R0PjwvYj4KLWRpcmVjdGx5LjwvbGk+Ci0KLTxsaT4KLVRhc2tzIDxiPjx0dD5yZWZyZXNoTG9jYWw8L3R0PjwvYj4gYW5kIDxiPjx0dD5pbmNyZW1lbnRhbEJ1aWxkPC90dD48L2I+Ci1hcmUgbm90IGF2YWlsYWJsZSBhbnltb3JlLiBVc2UgPGI+PHR0PmVjbGlwc2UucmVmcmVzaExvY2FsPC90dD48L2I+IGFuZAotPGI+PHR0PmVjbGlwc2UuaW5jcmVtZW50YWxCdWlsZDwvdHQ+PC9iPgotaW5zdGVhZC48L2xpPgotPC91bD4KLQotPGgzPgotT3RoZXIgaGlnaGxpZ2h0czwvaDM+Ci0KLTx1bD4KLTxsaT4KLU5ldyBwcm9wZXJ0eSA8Yj48dHQ+ZWNsaXBzZS5ydW5uaW5nPC90dD48L2I+IGlzIHNldCBmb3Igc2NyaXB0cyBydW5uaW5nCi1pbnNpZGUgRWNsaXBzZS48L2xpPgotCi08bGk+Ci1JdCBpcyBub3cgcG9zc2libGUgdG8gZXh0ZW5kIHRoZSBBbnQgY2xhc3NwYXRoIGJ5IGFkZGluZyBuZXcgSkFScywgZm9sZGVycywKLXRhc2tzIGFuZCB0eXBlcyB0aHJvdWdoIGEgcHJlZmVyZW5jZSAoV29ya2JlbmNoLT5QcmVmZXJlbmNlcy0+QW50LT5DdXN0b21pemUpLjwvbGk+Ci08L3VsPgotCi08aDM+Ci1SZXNvbHZlZCBCdWdzPC9oMz4KLQotPHVsPgotPGxpPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL2J1Z2xpc3QuY2dpP2J1Z19zdGF0dXM9UkVTT0xWRUQmYnVnX3N0YXR1cz1WRVJJRklFRCZidWdfc3RhdHVzPUNMT1NFRCZlbWFpbDE9JmVtYWlsdHlwZTE9c3Vic3RyaW5nJmVtYWlsYXNzaWduZWRfdG8xPTEmZW1haWwyPSZlbWFpbHR5cGUyPXN1YnN0cmluZyZlbWFpbHJlcG9ydGVyMj0xJmJ1Z2lkdHlwZT1pbmNsdWRlJmJ1Z19pZD0mY2hhbmdlZGluPSZ2b3Rlcz0mY2hmaWVsZD1idWdfc3RhdHVzJmNoZmllbGRmcm9tPTIwMDIlMkYwMSUyRjI5JmNoZmllbGR0bz0yMDAyJTJGMDQlMkYwOSZjaGZpZWxkdmFsdWU9JnByb2R1Y3Q9UGxhdGZvcm0mY29tcG9uZW50PUFudCZzaG9ydF9kZXNjPSZzaG9ydF9kZXNjX3R5cGU9YWxsd29yZHNzdWJzdHImbG9uZ19kZXNjPSZsb25nX2Rlc2NfdHlwZT1hbGx3b3Jkc3N1YnN0ciZrZXl3b3Jkcz0ma2V5d29yZHNfdHlwZT1hbnl3b3JkcyZmaWVsZDAtMC0wPW5vb3AmdHlwZTAtMC0wPW5vb3AmdmFsdWUwLTAtMD0mY21kdHlwZT1kb2l0Jm5hbWVkY21kPUFjdGl2ZSZuZXdxdWVyeW5hbWU9Jm9yZGVyPUJ1ZytOdW1iZXIiPkNsaWNrCi1oZXJlPC9hPiB0byBzZWUgUFJzIHdoaWNoIGhhdmUgYmVlbiBtYXJrZWQgYXMgUkVTT0xWRUQsIFZFUklGSUVEIG9yIENMT1NFRAotc2luY2UgdGhlIGxhc3QgaW50ZWdyYXRpb24gYnVpbGQuPC9saT4KLTwvdWw+Ci0KLTxoMT4KLQotPGhyIFdJRFRIPSIxMDAlIj5FY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotQW50PC9oMT4KLUVjbGlwc2UgU0RLIEJ1aWxkIDIwMDIwMTI5Ci08aDI+Ci1XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci0KLTxoMz4KLUFQSSBjaGFuZ2VzPC9oMz4KLQotPHVsPgotPGxpPgotTm9uZS48L2xpPgotPC91bD4KLQotPGgzPgotT3RoZXIgaGlnaGxpZ2h0czwvaDM+Ci0KLTx1bD4KLTxsaT4KLU5vbmUuPC9saT4KLTwvdWw+Ci0KLTxoMz4KLVJlc29sdmVkIEJ1Z3M8L2gzPgotCi08dWw+Ci08bGk+Ci08YSBocmVmPSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3MvYnVnbGlzdC5jZ2k/YnVnX3N0YXR1cz1SRVNPTFZFRCZidWdfc3RhdHVzPVZFUklGSUVEJmJ1Z19zdGF0dXM9Q0xPU0VEJmVtYWlsMT0mZW1haWx0eXBlMT1zdWJzdHJpbmcmZW1haWxhc3NpZ25lZF90bzE9MSZlbWFpbDI9JmVtYWlsdHlwZTI9c3Vic3RyaW5nJmVtYWlscmVwb3J0ZXIyPTEmYnVnaWR0eXBlPWluY2x1ZGUmYnVnX2lkPSZjaGFuZ2VkaW49JnZvdGVzPSZjaGZpZWxkPWJ1Z19zdGF0dXMmY2hmaWVsZGZyb209MjAwMSUyRjEyJTJGMTcmY2hmaWVsZHRvPTIwMDIlMkYwMSUyRjI5JmNoZmllbGR2YWx1ZT0mcHJvZHVjdD1QbGF0Zm9ybSZjb21wb25lbnQ9QW50JnNob3J0X2Rlc2M9JnNob3J0X2Rlc2NfdHlwZT1hbGx3b3Jkc3N1YnN0ciZsb25nX2Rlc2M9JmxvbmdfZGVzY190eXBlPWFsbHdvcmRzc3Vic3RyJmtleXdvcmRzPSZrZXl3b3Jkc190eXBlPWFueXdvcmRzJmZpZWxkMC0wLTA9bm9vcCZ0eXBlMC0wLTA9bm9vcCZ2YWx1ZTAtMC0wPSZjbWR0eXBlPWRvaXQmbmFtZWRjbWQ9YW50Jm5ld3F1ZXJ5bmFtZT0mb3JkZXI9QnVnK051bWJlciI+Q2xpY2sKLWhlcmU8L2E+IHRvIHNlZSBQUnMgd2hpY2ggaGF2ZSBiZWVuIG1hcmtlZCBhcyBSRVNPTFZFRCwgVkVSSUZJRUQgb3IgQ0xPU0VECi1zaW5jZSB0aGUgbGFzdCBpbnRlZ3JhdGlvbiBidWlsZC48L2xpPgotPC91bD4KLQotPGgxPgotCi08aHIgV0lEVEg9IjEwMCUiPkVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+Ci1BbnQ8L2gxPgotRWNsaXBzZSBTREsgQnVpbGQgMjAwMTEyMTgKLTxoMj4KLVdoYXQncyBuZXcgaW4gdGhpcyBkcm9wPC9oMj4KLQotPGgzPgotQVBJIGNoYW5nZXM8L2gzPgotCi08dWw+Ci08bGk+Ci1Ob25lLjwvbGk+Ci08L3VsPgotCi08aDM+Ci1PdGhlciBoaWdobGlnaHRzPC9oMz4KLQotPHVsPgotPGxpPgotTm9uZS48L2xpPgotPC91bD4KLQotPGgzPgotUmVzb2x2ZWQgQnVnczwvaDM+Ci0KLTx1bD4KLTxsaT4KLTxhIGhyZWY9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9idWdsaXN0LmNnaT9idWdfc3RhdHVzPVJFU09MVkVEJmJ1Z19zdGF0dXM9VkVSSUZJRUQmYnVnX3N0YXR1cz1DTE9TRUQmZW1haWwxPSZlbWFpbHR5cGUxPXN1YnN0cmluZyZlbWFpbGFzc2lnbmVkX3RvMT0xJmVtYWlsMj0mZW1haWx0eXBlMj1zdWJzdHJpbmcmZW1haWxyZXBvcnRlcjI9MSZidWdpZHR5cGU9aW5jbHVkZSZidWdfaWQ9JmNoYW5nZWRpbj0mdm90ZXM9JmNoZmllbGQ9YnVnX3N0YXR1cyZjaGZpZWxkZnJvbT0yMDAxJTJGMTIlMkYxMSZjaGZpZWxkdG89MjAwMSUyRjEyJTJGMTcmY2hmaWVsZHZhbHVlPSZwcm9kdWN0PVBsYXRmb3JtJmNvbXBvbmVudD1BbnQmc2hvcnRfZGVzYz0mc2hvcnRfZGVzY190eXBlPWFsbHdvcmRzc3Vic3RyJmxvbmdfZGVzYz0mbG9uZ19kZXNjX3R5cGU9YWxsd29yZHNzdWJzdHIma2V5d29yZHM9JmtleXdvcmRzX3R5cGU9YW55d29yZHMmZmllbGQwLTAtMD1ub29wJnR5cGUwLTAtMD1ub29wJnZhbHVlMC0wLTA9JmNtZHR5cGU9ZG9pdCZuYW1lZGNtZD1hbnQmbmV3cXVlcnluYW1lPSZvcmRlcj1CdWcrTnVtYmVyIj5DbGljawotaGVyZTwvYT4gdG8gc2VlIFBScyB3aGljaCBoYXZlIGJlZW4gbWFya2VkIGFzIFJFU09MVkVELCBWRVJJRklFRCBvciBDTE9TRUQKLXNpbmNlIHRoZSBsYXN0IGludGVncmF0aW9uIGJ1aWxkLjwvbGk+Ci08L3VsPgotCi08aDE+Ci0KLTxociBXSURUSD0iMTAwJSI+RWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KLUFudDwvaDE+Ci1FY2xpcHNlIFNESyBCdWlsZCAyMDAxMTIxMQotPGgyPgotV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgotCi08aDM+Ci1BUEkgY2hhbmdlczwvaDM+Ci0KLTx1bD4KLTxsaT4KLU5vbmUuPC9saT4KLTwvdWw+Ci0KLTxoMz4KLU90aGVyIGhpZ2hsaWdodHM8L2gzPgotCi08dWw+Ci08bGk+Ci1BbnQgY29kZSBmcm9tIEFwYWNoZSBoYXMgbW92ZWQgdG8gYSBuZXcgcGx1Zy1pbiBjYWxsZWQgb3JnLmFwYWNoZS5hbnQuLjwvbGk+Ci08L3VsPgotCi08aDM+Ci1SZXNvbHZlZCBCdWdzPC9oMz4KLQotPHVsPgotPGxpPgotPGEgaHJlZj0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL2J1Z2xpc3QuY2dpP2J1Z19zdGF0dXM9UkVTT0xWRUQmYnVnX3N0YXR1cz1WRVJJRklFRCZidWdfc3RhdHVzPUNMT1NFRCZlbWFpbDE9JmVtYWlsdHlwZTE9c3Vic3RyaW5nJmVtYWlsYXNzaWduZWRfdG8xPTEmZW1haWwyPSZlbWFpbHR5cGUyPXN1YnN0cmluZyZlbWFpbHJlcG9ydGVyMj0xJmJ1Z2lkdHlwZT1pbmNsdWRlJmJ1Z19pZD0mY2hhbmdlZGluPSZ2b3Rlcz0mY2hmaWVsZD1idWdfc3RhdHVzJmNoZmllbGRmcm9tPTIwMDElMkYxMSUyRjI3JmNoZmllbGR0bz0yMDAxJTJGMTIlMkYxMCZjaGZpZWxkdmFsdWU9JnByb2R1Y3Q9UGxhdGZvcm0mY29tcG9uZW50PUFudCZzaG9ydF9kZXNjPSZzaG9ydF9kZXNjX3R5cGU9YWxsd29yZHNzdWJzdHImbG9uZ19kZXNjPSZsb25nX2Rlc2NfdHlwZT1hbGx3b3Jkc3N1YnN0ciZrZXl3b3Jkcz0ma2V5d29yZHNfdHlwZT1hbnl3b3JkcyZmaWVsZDAtMC0wPW5vb3AmdHlwZTAtMC0wPW5vb3AmdmFsdWUwLTAtMD0mY21kdHlwZT1kb2l0Jm5hbWVkY21kPUFjdGl2ZSZuZXdxdWVyeW5hbWU9Jm9yZGVyPUJ1ZytOdW1iZXIiPkNsaWNrCi1oZXJlPC9hPiB0byBzZWUgUFJzIHdoaWNoIGhhdmUgYmVlbiBtYXJrZWQgYXMgUkVTT0xWRUQsIFZFUklGSUVEIG9yIENMT1NFRAotc2luY2UgdGhlIGxhc3QgaW50ZWdyYXRpb24gYnVpbGQuPC9saT4KLTwvdWw+Ci0KLTxoMT4KLQotPGhyIFdJRFRIPSIxMDAlIj5FY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotQW50PC9oMT4KLUVjbGlwc2UgU0RLIEJ1aWxkIDIwMDExMTI3ICh2MjEzKQotPGgyPgotV2hhdCdzIG5ldyBpbiB0aGlzIGRyb3A8L2gyPgotCi08aDM+Ci1BUEkgY2hhbmdlczwvaDM+Ci0KLTx1bD4KLTxsaT4KLU5vbmUuPC9saT4KLTwvdWw+Ci0KLTxoMz4KLU90aGVyIGhpZ2hsaWdodHM8L2gzPgotCi08dWw+Ci08bGk+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01MzkxIj41MzkxPC9hPiZuYnNwOwotVXBncmFkZSB0byBBbnQgMS40LjE8L2xpPgotPC91bD4KLQotPGgxPgotCi08aHIgV0lEVEg9IjEwMCUiPkVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+Ci1BbnQ8L2gxPgotRWNsaXBzZSBTREsgQnVpbGQgMjAwMTExMjAgKHYyMTEpCi08aDI+Ci1XaGF0J3MgbmV3IGluIHRoaXMgZHJvcDwvaDI+Ci0KLTxoMz4KLUFQSSBjaGFuZ2VzPC9oMz4KLQotPHVsPgotPGxpPgotTm9uZS48L2xpPgotPC91bD4KLQotPGgzPgotT3RoZXIgaGlnaGxpZ2h0czwvaDM+Ci0KLTx1bD4KLTxsaT4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTUzMzEiPjUzMzE8L2E+Jm5ic3A7Ci1BbnQgZG9lcyBub3Qgb3ZlcnJpZGUgb3B0aW9uYWwgdGFza3Mgd2l0aCBvcmcuZWNsaXBzZS5hbnQuY29yZS5hbnRUYXNrcwotZXh0ZW5zaW9uIHBvaW50PC9saT4KLTwvdWw+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9yMl8xX2J1aWxkbm90ZXNfcGxhdGZvcm0tYW50Lmh0bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvcjJfMV9idWlsZG5vdGVzX3BsYXRmb3JtLWFudC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2UwODI4Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9yMl8xX2J1aWxkbm90ZXNfcGxhdGZvcm0tYW50Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MDYgKzAsMCBAQAotPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KLTxodG1sPgotPGhlYWQ+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDxtZXRhIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iTW96aWxsYS80LjcgW2VuXSAoV2luTlQ7IEkpIFtOZXRzY2FwZV0iPgotICAgPHRpdGxlPkVjbGlwc2UgUGxhdGZvcm0gUmVsZWFzZSBOb3RlcyBBbnQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci0KLTxoMT4KLUVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+Ci1BbnQ8L2gxPgotRWNsaXBzZSBTREsgQnVpbGQgTWFyY2ggMjUsIDIwMDMKLQotPGgzPgotUmVzb2x2ZWQgQnVnczwvaDM+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNTYxMCI+MzU2MTA8L2E+OiBFeHRlcm5hbCB0b29scyBwbHVnaW4ueG1sIGVycm9yPGJyPgotCi08aDE+Ci1FY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotQW50PC9oMT4KLUVjbGlwc2UgU0RLIEJ1aWxkIE1hcmNoIDE3LCAyMDAzCi0KLTxoMz4KLVJlc29sdmVkIEJ1Z3M8L2gzPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzUxMzgiPjM1MTM4PC9hPjogTlBFIGR1cmluZyBzaHV0ZG93bjxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0NzY3Ij4zNDc2NzwvYT46IEFudCBwcmVmZXJlbmNlcyBub3QgaW1wb3J0ZWQ8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNTEwMCI+MzUxMDA8L2E+OiBNaWdyYXRlIGFjdGlvbnMgdG8gY29tbWFuZCBleHRlbnNpb24gcG9pbnQ8YnI+Ci0KLTxoMT4KLUVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+Ci1BbnQ8L2gxPgotRWNsaXBzZSBTREsgQnVpbGQgTWFyY2ggMTMsIDIwMDMKLQotPGgzPgotUmVzb2x2ZWQgQnVnczwvaDM+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDcyNiI+MzQ3MjY8L2E+OiBBbnQgdGVzdHMgZG8gbm90IG5lZWQgdGhlIG92ZXJoZWFkIG9mIEF1dG9tYXRlZFN1aXRlLnJ1bjxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0OTIyIj4zNDkyMjwvYT46IFR5cG9zPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQ0MzkiPjM0NDM5PC9hPjogSW5kZXggb3V0IG9mIGJvdW5kcyBlZGl0aW5nIGN1c3RvbSB0YXNrPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQ0OTYiPjM0NDk2PC9hPjogZG91YmxlIGNsaWNrIGFkZHMgdHlwZSB3aXRob3V0IG5hbWU8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDY4MiI+MzQ2ODI8L2E+OiBFeHRlcm5hbCBlbnRpdHkgd2l0aCB1bnJlY29nbml6ZWQgcHJvdG9jb2w8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDY3OCI+MzQ2Nzg8L2E+OiBEdXBsaWNhdGUgcHJvcGVydGllcyBpbiBmaWxlczxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0NjYzIj4zNDY2MzwvYT46IEFudCBhdHRlbXB0cyB0byByZXNvbHZlIHRhc2tkZWZzIGJlZm9yZSByZXNvbHZpbmcgcHJvcGVydGllczxicj4KLQotPGgxPgotRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KLUFudDwvaDE+Ci1FY2xpcHNlIFNESyBCdWlsZCBNYXJjaCAxMiwgMjAwMwotCi08aDM+Ci1SZXNvbHZlZCBCdWdzPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0NDQyIj4zNDQ0MjwvYT46IEN1c3RvbSB0YXNrIGRvZXMgbm90IHdvcmsgaW4gZm9sZGVyIChvbmx5IGluIGphcik8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zNDQ3MiI+MzQ0NzI8L2E+OiBFeHRlcm5hbCB0b29scyBwcmVmZXJlbmNlIGlzIG5vdCBjbGVhcjxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM0NTE5Ij4zNDUxOTwvYT46IERpYWxvZyBzbG93IHRvIGNhbmNlbCB3aGVuIFByb3BlcnRpZXMvRXh0ZXJuYWwgVG9vbHMgd2FzIHNlbGVjdGVkPGJyPgotCi08aDE+Ci1FY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotQW50PC9oMT4KLUVjbGlwc2UgU0RLIEJ1aWxkIE1hcmNoIDYsIDIwMDMKLTxwPgotPGI+Tm90ZTo8L2I+IEFkZGluZyB0aGUgWGVyY2VzIEpBUnMgdG8geW91ciBydW50aW1lIEFudCBjbGFzc3BhdGggaXMgbm8gbG9uZ2VyIHJlcXVpcmVkLgotSW4gZmFjdCwgYWRkaW5nIHRoZXNlIEpBUnMgY2FuIGNhdXNlIHByb2JsZW1zLiBUaGUgWGVyY2VzIGNsYXNzZXMgYXJlIGxvYWRlZCBmcm9tIHRoZSBYZXJjZXMgcGx1Z2luIHByb3ZpZGVkIHdpdGggRWNsaXBzZS4KLTxoMz4KLVJlc29sdmVkIEJ1Z3M8L2gzPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI2NDMiPjMyNjQzPC9hPjogUGxhbnR5Q29udGVudE91dGxpbmVQYWdlOiAnT3BlbiBXaXRoJyBzaG93cyB1cCBpbiBjb250ZXh0IG1lbnUgZm9yIG5vbi1leGlzdGFudCBleHRlcm5hbCBlbnRpdHk8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzY4MiI+MzM2ODI8L2E+OiBBbnQgYnVpbGQgZmlsZSBlZGl0b3IgY2F1c2VzIGV4Y2VwdGlvbnMgd2hlbiBmaWxlIGVtcHR5PGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM3OTQiPjMzNzk0PC9hPjogVmFyaWFibGVzIHNob3VsZCBiZSBzb3J0ZWQgaW4gdGhlICJTZWxlY3QgVmFyaWFibGUiIGRpYWxvZzxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzODI2Ij4zMzgyNjwvYT46IFByZWZlcmVuY2VzPkVkaXRvcj5BcHBlYXJhbmNlOiBsYXlvdXQgcHJvYmxlbTxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzMDY5Ij4zMzA2OTwvYT46IFN0YWNrIHRyYWNlcyB1c2luZyBhbnQgZWRpdG9yPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzE3MjciPjMxNzI3PC9hPjogQW50IEVkaXRvciB0ZXN0cyBmYWlsIHdoZW4gcnVuIGFzIFBERSBKVW5pdCB0ZXN0czxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzODM4Ij4zMzgzODwvYT46IEhhdmUgYnVpbGQueG1sIGFzIGEgZGVmYXVsdCBuYW1lIGZvciAtZmluZCBlbXVsYXRpb248YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjcwMCI+MzI3MDA8L2E+OiBSZWZyZXNoIFRhYiBTY29wZSB2YXJpYWJsZSBzZWxlY3RlZCBidXQgbm8gc2VsZWN0aW9uIHdpZGdldDxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzNjg1Ij4zMzY4NTwvYT46IEFudCB2aWV3OiBvcGVuIHdpdGggbm90IGF2YWlsYWJsZSBmb3IgdGFyZ2V0czxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyNjU3Ij4zMjY1NzwvYT46IEFudCBidWlsZCBzdG9wcyB3b3JraW5nIGFmdGVyIHRlcm1pbmF0aW5nIGJ1aWxkPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM4NjEiPjMzODYxPC9hPjogW0V4dGVybmFsIFRvb2xzXSBQcmVmIHBhZ2UgdG9vIHByb21pbmVudDxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzODcwIj4zMzg3MDwvYT46IFRoZSBidWlsZC5wcm9wZXJ0aWVzIGZvciBvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZSBpcyBpbmNvcnJlY3Q8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzgzNyI+MzM4Mzc8L2E+OiBBbnQgZWRpdG9yIGNvZGUgYXNzaXN0IGlzIGNhc2Ugc2Vuc2l0aXZlPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM4NTkiPjMzODU5PC9hPjogQW50RWRpdG9yOiBlcnJvciBub2RlcyBpbiBvdXRsaW5lIGFyZSBpbmNvbnNpc3RlbnQgd2l0aCB0aGUgSmF2YSBlZGl0b3I8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzg2NyI+MzM4Njc8L2E+OiBNaXNzcGVsbGluZyBpbiBBbnQgVmlldyBjb250ZXh0IG1lbnU8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzg3NCI+MzM4NzQ8L2E+OiBBbnRFZGl0b3I6IG5vIGNvbnRleHQgbWVudSBvbiB2ZXJ0aWNhbCBydWxlcjxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzODU3Ij4zMzg1NzwvYT46IEFudEVkaXRvcjogZG9lc24ndCBzdXBwb3J0IGhvdmVycyBvbiBhbm5vdGF0aW9uczxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzOTI4Ij4zMzkyODwvYT46IE5QRSBjbG9zaW5nIHdvcmtiZW5jaDxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzOTgxIj4zMzk4MTwvYT46IEJldHRlciBwb3NpdGlvbmluZyBvZiBlcnJvciBzcXVpZ2dsZXMgaW4gQW50IEVkaXRvcjxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzMjY0Ij4zMzI2NDwvYT46IENvbnRlbnQgYXNzaXN0IGZhaWxzIGlmIHJlZmVyZW5jZSBleHRlcm5hbCBlbnRpdHk8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzY2NCI+MzM2NDQ8L2E+OiBDbGFzcyBvcmcveG1sL3NheC9QYXJzZXIgdmlvbGF0ZXMgbG9hZGVyIGNvbnN0cmFpbnRzIHdpdGggSUJNIHZtIDEzMTxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyODkwIj4zMjg5MDwvYT46IENvbG9yaW5nIGJ1ZyBpbiBhbnQgZWRpdG9yPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM4OTIiPjMzODkyPC9hPjogQmFkTG9jYXRpb25FeGNlcHRpb24gcG9zc2libGUgZHVyaW5nIHJlY29uY2lsaWF0aW9uIG9mIEFudEVkaXRvcjxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzOTUyIj4zMzk1MjwvYT46IEFudEVkaXRvcjogcG9zc2libGUgYXV0b21hdGljIG1vdmUgb2YgY3Vyc29yIHdoaWxlIGVkaXRpbmc8YnI+Ci0KLTxoMT4KLUVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+Ci1BbnQ8L2gxPgotRWNsaXBzZSBTREsgQnVpbGQgTWFyY2ggNCwgMjAwMwotCi08aDM+Ci1SZXNvbHZlZCBCdWdzPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzNDQzIj4zMzQ0MzwvYT46IE5vIG5lZWQgZm9yIG91ciBvd24gQW50IHZlcnNpb24gaW1wbGVtZW50YXRpb248YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzI2MyI+MzMyNjM8L2E+OiBBbnQgY29tcGxldGlvbiBvZiBwcm9wZXJ0aWVzIGlzIGluY29ycmVjdC48YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjgyNSI+MzI4MjU8L2E+OiBNaXNzaW5nIE5MUyBzdHJpbmdzIGZvciBBbnQgRWRpdG9yIHByZWZlcmVuY2UgcGFnZTxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyMTgzIj4zMjE4MzwvYT46IFJ1bm5pbmcgd2l0aCBBbnQxLjYgYWxwaGE8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjQ3NyI+MzI0Nzc8L2E+OiBFcnJvcnMgaW4gZXh0ZXJuYWwgZW50aXRpZXMgYW5kIG5lc3RlZCBleHRlcm5hbCBlbnRpdGllcyBhcmVuJ3Qgc3VwcG9ydGVkIGJ5IHRoZSBlZGl0b3Igb3V0bGluZTxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyNTUxIj4zMjU1MTwvYT46ICJSdW4gQW50IiBjYXVzZXMgQ2xhc3NDYXN0RXhjZXB0aW9uIHdpdGggZmlsZXNldHM8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjU4NyI+MzI1ODc8L2E+OiBBbnRWaWV3IGFjdGlvbnMgYXJlIGluY29ycmVjbHkgZW5hYmxlZCAtLT4gTlBFPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI4MjQiPjMyODI0PC9hPjogQmFkTG9jYXRpb25FeGNlcHRpb24gY3JlYXRpbmcgYnVpbGQueG1sIGZpbGU8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjYyNCI+MzI2MjQ8L2E+OiBQcm9ibGVtIHdpdGggYXN5bmNFeGVjKC4uKSBSdW5uYWJsZSBpbiBQbGFudHlDb250ZW50T3V0bGluZVBhZ2UgaWYgY29udHJvbCBvZiB0cmVldmlld2VyIGdldHMgZGlzcG9zZWQuPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI3ODciPjMyNzg3PC9hPjogQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uIHNlbGVjdGluZyBlcnJvciBub2RlIGluIEFudEVkaXRvciBvdXRsaW5lPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzMwNDMiPjMzMDQzPC9hPjogQ3VzdG9tIHR5cGVzIGFyZSBicm9rZW48YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzI4OCI+MzMyODg8L2E+OiBBbnQgVmlldyB0b29sdGlwcyBzaG91bGQgdXNlIGJvb2sgY2FwaXRhbGl6YXRpb248YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjUxNyI+MzI1MTc8L2E+OiBObyBtbmV1bW9uaWNzIG9uIHRoZSBDaG9vc2UgQ29uZmlndXJhdGlvbiBUeXBlIGRpYWxvZzxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxNDMzIj4zMTQzMzwvYT46IEFudCB2aWV3IHdpbGwgbm90IHNldCBpdHMgZm9jdXMgd2hlbiBzZWxlY3RpbmcgdGhlIHdpbmRvdzxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzNTE0Ij4zMzUxNDwvYT46IEFudCBpbnRlZ3JhdGlvbiBhcHBlYXJzIGJyb2tlbiBpbiBJMjAwMzAyMjc8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjcxNSI+MzI3MTU8L2E+OiBDYW5jZWxsaW5nIHJlbW92aW5nIGEgZXh0ZXJuYWwgdG9vbCBidWlsZGVyIGZhaWxzPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI4MzYiPjMyODM2PC9hPjogQ2Fubm90IHJlbW92ZSBjdXN0b20gdGFzazxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzMjg0Ij4zMzI4NDwvYT46IEFudCBwcmVmZXJlbmNlczogYWRkaXRpb25hbCBjbGFzc3BhdGggZW50cmllcyBub3QgcmVtb3ZlZCBwZXJtYW5lbnRseTxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMzMTE3Ij4zMzExNzwvYT46IENsYXNzQ2FzdEV4Y2VwdGlvbiB3aXRoIHRhc2tzIHVzaW5nIFhlcmNlczxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyODM3Ij4zMjgzNzwvYT46IFRhc2tzIHRhYiByZXN0b3JlIGRlZmF1bHRzPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI4MjciPjMyODI3PC9hPjogRWRpdG9yIHNlbGVjdGlvbiBmb3IgZXh0ZXJuYWwgZW50aXRpZXMgY2FuIGJlIGltcHJvdmVkPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI4MDkiPjMyODA5PC9hPjogQW50VmlldyBzZWFyY2ggZGlhbG9nIHJldGFpbnMgbmFtZSBvZiByZW1vdmVkIHdvcmtpbmcgc2V0PGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI2OTMiPjMyNjkzPC9hPjogRHVwbGljYXRlIG1uZXVtb25pYyBvbiBQcm9ncmFtIG1haW4gdGFiPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM1MzQiPjMzNTM0PC9hPjogQW50IEVkaXRvcjogcmFuZ2UgaW5kaWNhdGlvbiBub3Qgc3VwcG9ydGVkPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzMyNzIiPjMzMjcyPC9hPjogTGVha2luZyBQbGFudHlEb2N1bWVudFByb3ZpZGVyczxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyNzY4Ij4zMjc2ODwvYT46IEVkaXQgbGF1bmNoIGNvbmZpZyBmcm9tIEFudCB2aWV3IHN0YXJ0cyBvdXQgImRpcnR5Ijxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyODExIj4zMjgxMTwvYT46IFNldHRpbmcgQU5UX0hPTUUgZm9yIHNwZWNpZmljIGNvbmZpZyBkb2VzIG5vdCB1cGRhdGUgY2xhc3NwYXRoPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzI3ODEiPjMyNzgxPC9hPjogRGVzY3JpcHRpb24gaW4gQW50IHByZWZlcmVuY2UgcGFnZSBpcyBjb25mdXNpbmc8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzcwMiI+MzM3MDI8L2E+OiBbQW50IFZpZXddIFByb3BlcnRpZXMgYWN0aW9uPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzMzNDYiPjMzMzQ2PC9hPjogTW92ZSB0byBBbnQgMS41LjI8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjUyMSI+MzI1MjE8L2E+OiAobWlub3IpQW50VmlldyBzdGF0dXMgbGluZSBzaG93cyAibm8gZGVzY3JpcHRpb24iPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM2NzAiPjMzNjcwPC9hPjogQW50IHZpZXcgZXJyb3Igc3RyaW5ncyBhcmUgdG9vIGxvbmc8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjc2MiI+MzI3NjI8L2E+OiAke3Jlc291cmNlX2xvY30gdmFyaWFibGUgY29tcG9uZW50IHNwZWNpZmljIHJlc291cmNlIHRyZWUgdG9vIHNtYWxsPGJyPgotCi08aDE+Ci1FY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotQW50PC9oMT4KLUVjbGlwc2UgU0RLIEJ1aWxkIEZlYiAyMSwgMjAwMwotCi08aDM+Ci1SZXNvbHZlZCBCdWdzPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzOTY5Ij4yMzk2OTwvYT46IExhdW5jaGVyIHNob3VsZCB0aHJvdyBKVk0gZXhpdCBjb2RlIHRvIHBhcmVudCBwcm9jZXNzIHdoZW4gYnVpbGQgZmFpbHM8YnI+Ci0KLTxoMT4KLUVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+Ci1BbnQ8L2gxPgotRWNsaXBzZSBTREsgQnVpbGQgRmViIDIwLCAyMDAzCi0KLTxoMz4KLVJlc29sdmVkIEJ1Z3M8L2gzPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzE4MTkiPjMxODE5PC9hPjogTmV3IHN1cHBvcnQgZm9yIGNvbG9yIGluIFRhYmxlVmlld2VycyBhbmQgVHJlZVZpZXdlcnM8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjE1OCI+MzIxNTg8L2E+OiBDYW4ndCByZW1vdmUgZXJyb25lb3VzIHByb2plY3QgYnVpbGRlcnM8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDcxNiI+MzA3MTY8L2E+OiBjYW5ub3QgY2hhbmdlIGV4dGVybmFsIHRvb2wgYnVpbGRlciBsYXVuY2ggY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzE5NDkiPjMxOTQ5PC9hPjogVXNlIE9wZW5XaXRoIG1lbnUgZm9yIGV4dGVybmFsIGVudGl0aWVzIGluIHRoZSBBbnRFZGl0b3Igb3V0bGluZTxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyMDkxIj4zMjA5MTwvYT46IEFudENsYXNzbG9hZGVyIHNob3VsZCBiZSBzZXR0aW5nIGl0cyBwYXJlbnQgY2xhc3Nsb2FkZXI8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMTYyNSI+MzE2MjU8L2E+OiBNaXhpbmcgYnVpbGQgZmlsZXMgaW4gQW50IHZpZXcgZG9lcyBub3Qgd29yazxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxOTM0Ij4zMTkzNDwvYT46IFRhcmdldHMgdGFiIGdldHMgdmVyeSB3aWRlIGlmIGxvdHMgb2YgdGFyZ2V0cyBzZWxlY3RlZDxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE5NDU5Ij4xOTQ1OTwvYT46IFtFeHRlcm5hbFRvb2xzXSBmYWlsdXJlIHRvIGV4ZWN1dGUgaW52YWxpZCB0b29scyBzaG91bGQgYmUgYmV0dGVyIGhhbmRsZWQgYnkgdWkuPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzIyOTciPjMyMjk3PC9hPjogInBsdWctaW4iIHNob3VsZCBiZSBzcGVsbGVkIHdpdGggYSBoeXBoZW48YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjI3NiI+MzIyNzY8L2E+OiBTdGFjayB0cmFjZSBydW5uaW5nIGFudC5iYXQgYXMgYW4gZXh0ZXJuYWwgcHJvY2Vzczxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxOTU1Ij4zMTk1NTwvYT46IE91dGxpbmUgaXMgbm90IGNyZWF0ZWQgdW50aWwgaW5pdGlhbCByZWNvbmNpbGF0aW9uOiBub3RpY2VhYmxlIGRlbGF5PGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzIzNDUiPjMyMzQ1PC9hPjogQW50IEVkaXRvciBkb2Vzbid0IHN1cHBvcnQgYW5ub3RhdGlvbnM8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMjM3NCI+MzIzNzQ8L2E+OiBCYWRMb2NhdGlvbkV4Y2VwdGlvbiBvbiBleHRlcm5hbCBlbnRpdHkgYnVpbGQgZmlsZTxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyNDIzIj4zMjQyMzwvYT46IENhbm5vdCB1c2UgUnVuIGFzIEFudCBidWlsZCB3aXRoIHRoZSBBbnQgRWRpdG9yIG91dGxpbmUgd2l0aCBmb2N1czxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMyNDE5Ij4zMjQxOTwvYT46IFB1dCBFeHRlcm5hbCBUb29scyBsYXVuY2ggYnV0dG9uIHdpdGggUnVuIGFuZCBEZWJ1ZyBsYXVuY2ggYnV0dG9uczxicj4KLQotPGgxPgotRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KLUFudDwvaDE+Ci1FY2xpcHNlIFNESyBCdWlsZCBGZWIgMTgsIDIwMDMKLQotPGgzPgotUmVzb2x2ZWQgQnVnczwvaDM+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODc3MCI+Mjg3NzA8L2E+OiBEaXNwbGF5IGRlZmF1bHQgdGFyZ2V0IGluIHByb2plY3QgbGFiZWwgaW4gQW50IHZpZXc8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDU5NiI+MzA1OTY8L2E+OiBGaXhlcyBmb3IgdGhlIEFudCBFZGl0b3IgVGVzdHM8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTIzNiI+MjkyMzY8L2E+OiBBbnRWaWV3IHRlc3RzICYgQW50IGVkaXRvciB0ZXN0czxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxNzgwIj4zMTc4MDwvYT46IFdvcmthcm91bmQgSkZhY2Ugc2VsZWN0aW9uIGJ1Zzxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxNzc2Ij4zMTc3NjwvYT46IEFudCB0YXJnZXRzIGNhbm5vdCBiZSBjb25maWd1cmVkIHdpdGhpbiB0aGUgbGlzdCBib3ggaWYgbWFueSB0YXJnZXRzIGV4aXN0PGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzE3NzciPjMxNzc3PC9hPjogQWRkIHJlY29uY2lsaW5nIHRvIHRoZSBBbnQgZWRpdG9yIG91dGxpbmUgcGFnZTxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxNzkzIj4yMTc5MzwvYT46IEFudCBQcm9qZWN0SGVscGVyIG5vdCBsb2FkZWQgY29ycmVjdGx5IFtzZXQgdGhyZWFkIGNvbnRleHQgY2xhc3Nsb2FkZXJdPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzE3OTYiPjMxNzk2PC9hPjogQW50IEVkaXRvciBzeW50YXggY29sb3JpbmcgZmFpbHMgb3ZlciBtdWx0aXBsZSBsaW5lczxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwODM2Ij4zMDgzNjwvYT46IFhNTEVsZW1lbnRzIGZyb20gZXh0ZXJuYWwgZW50aXRpZXMgaGF2ZSBpbmNvcnJlY3Qgc2VsZWN0aW9uIGluIEFudEVkaXRvcjxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxMzY5Ij4zMTM2OTwvYT46IEV4dGVybmFsIFByb2Nlc3NlcyBhcmUgbm90IHR5cGVkPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzE0MzkiPjMxNDM5PC9hPjogUGxhbnR5RXhjZXB0aW9uIG9uIG9wZW5pbmcgYW50IHNjcmlwdDxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxNTg4Ij4zMTU4ODwvYT46IFNob3cgSW4uLi4gc3VwcG9ydCBmcm9tIHRoZSBBbnQ8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMTc5MiI+MzE3OTI8L2E+OiBQcm9qZWN0LmluaXQgc2hvcnRjdXQgbm90IHdvcmtpbmcgZm9yIGRhdGF0eXBlczxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxNzk3Ij4zMTc5NzwvYT46IEFudEVkaXRvciBzeW50YXggY29sb3IgZG9lcyBub3QgdXBkYXRlIHVudGlsIHRoZSBlZGl0b3IgaXMgcmUtb3BlbmVkPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzE5MzUiPjMxOTM1PC9hPjogTm8gdGFyZ2V0cyBzZWxlY3RlZCwgeWV0IHN0aWxsIGhhdmUgdGFyZ2V0cyBpbiB0YXJnZXQgZXhlY3V0aW9uIG9yZGVyPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzE4NzYiPjMxODc2PC9hPjogQ2xhc3NDYXN0RXhjZXB0aW9uIGNvZGUgYXNzaXN0aW5nIGluIEFudCBFZGl0b3I8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMTk0OCI+MzE5NDg8L2E+OiBBbnRFZGl0b3IgcmVjb25jaWxpbmcgaGFzIGJyb2tlbiByZXNvbHV0aW9uIG9mIGV4dGVybmFsIGVudGl0aWVzPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzIwNjkiPjMyMDY5PC9hPjogQ29sb3IgcHJlZmVyZW5jZXMgYXJlIGFwcGxpZWQgdG9vIGVhcmx5PGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjc2MTMiPjI3NjEzPC9hPjogQ29kZSBkdXBsaWNhdGlvbiB3aXRoIEFudCBwcmVmZXJlbmNlIHBhZ2VzIGFuZCBBbnQgbGF1bmNoIGNvbmZpZyB0YWJzPGJyPgotCi08aDE+Ci1FY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotQW50PC9oMT4KLUVjbGlwc2UgU0RLIEJ1aWxkIEZlYiAxMywgMjAwMwotCi08aDM+Ci1SZXNvbHZlZCBCdWdzPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxNTg3Ij4zMTU4NzwvYT46IE9wZW4gRWRpdG9yIGZvciBleHRlcm5hbCBlbnRpdGllcyBzaG91bGQgdXNlIHNlbGVjdGlvbjxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxNTYxIj4zMTU2MTwvYT46IFBhcnNlIGJ1aWxkIGZpbGVzIGZhc3Rlcjxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxNjcyIj4zMTY3MjwvYT46IEJyb2tlbiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIEFudCAxLjQuKjxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxNjc4Ij4zMTY3ODwvYT46IERpc2FsbG93IHRoZSBBbnRDbGFzc0xvYWRlciB0byBsb2FkIGNvcmUgQW50IGNsYXNzZXMgZnJvbSBwbHVnaW4gcGFyZW50czxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwNjc5Ij4zMDY3OTwvYT46IEV4dGVybmFsIHRvb2wgbWlncmF0aW9uIGFuZCB3cml0aW5nIHRvIFN5c3RlbS5lcnI8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMTA5NyI+MzEwOTc8L2E+OiBBbnQgQ29sb3IgT3B0aW9uIGxpc3QgbmVlZHMgc2Nyb2xsYmFyczxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4OTI4Ij4yODkyODwvYT46IFNldCBtaW5pbXVtIHNpemUgb2YgUnVudGltZSBjbGFzcyBwYXRoPGJyPgotCi08aDE+Ci1FY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotQW50PC9oMT4KLUVjbGlwc2UgU0RLIEJ1aWxkIEZlYiAxMSwgMjAwMwotCi08aDM+Ci1SZXNvbHZlZCBCdWdzPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwOTM5Ij4zMDkzOTwvYT46IERCQ1MgY2hhcmFjdGVycyBhcmUgZ2FyYmxlZCBhdCB0aGUgT3V0bGluZSB2aWV3IHVzaW5nIG5vbi1uYXRpdmUgd29ya2JlbmNoIGVuY29kaW5nPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzExODAiPjMxMTgwPC9hPjogT3V0bGluZSBjb2xvcnMgYWxsIGVsZW1lbnRzIHdob3NlIG5hbWUgbWF0Y2hlcyBkZWZhdWx0IHRhcmdldCdzPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjk4MTUiPjI5ODE1PC9hPjogQW50IGFydHdvcms8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTg5OCI+Mjk4OTg8L2E+OiBVcGRhdGluZyBhY3Rpb25zIGluIHRoZSBBbnRWaWV3PGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzA5MzEiPjMwOTMxPC9hPjogW0FudCBWaWV3XSBSdW4gYnV0dG9uIG5vdCBlbmFibGVkIHdoZW4gZmlyc3QgdGFyZ2V0IGFkZGVkIHRvIGxpc3Q8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDk2MSI+MzA5NjE8L2E+OiBBcmd1bWVudHMgZmllbGQgb24gdGhlIEV4dGVybmFsVG9vbHNNYWluIHRhYiBuZWVkcyB0byBiZSBtdWx0aWxpbmU8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDIzOSI+MzAyMzk8L2E+OiBTb21lIGJ1Z3MgaW4gbGF1bmNoIGNvbmZpZ3VyYXRpb25zIGZvciBleHRlcm5hbCB0b29sczxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxMzc4Ij4zMTM3ODwvYT46IEFudFRhcmdldHNUYWIgb3JkZXIgdGFiIGRvZXMgbm90IGNvbG9yIGRlZmF1bHQgdGFyZ2V0IGNvcnJlY3RseTxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMxMjAwIj4zMTIwMDwvYT46IFVuYWJsZSB0byB1bmNoZWNrIEFudCBUYXJnZXRzIGFmdGVyIGNsaWNraW5nICJSZXZlcnQiPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzExNDUiPjMxMTQ1PC9hPjogU2hvdyBleHRlcm5hbCBlbnRpdGllcyBhcyByb290IG5vZGVzIGluIHRoZSBvdXRsaW5lIHBhZ2U8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDg4NCI+MzA4ODQ8L2E+OiBQbGFudHlDb21wbGV0aW9uUHJvY2Vzc29yIGRvZXMgbm90IGhhbmRsZSBleHRlcm5hbCBlbnRpdGllczxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwODQ0Ij4zMDg0NDwvYT46IEFudENsYXNzcGF0aFRhYiB0b3AgdGFibGUgd2lsbCBncm93IHVuYm91bmRlZDxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5NTcyIj4yOTU3MjwvYT46IGhlYWRsZXNzIEFudCBzdXBwb3J0IGRvZXMgbm90IHByb3Blcmx5IGhhbmRsZSBJREUgYmFzZWQgQW50IHRhc2tzPGJyPgotCi08aDE+Ci1FY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotQW50PC9oMT4KLUVjbGlwc2UgU0RLIEJ1aWxkIEZlYiA2LCAyMDAzCi0KLTxoMz4KLVJlc29sdmVkIEJ1Z3M8L2gzPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzEwNTUiPjMxMDU1PC9hPjogTlBFIGRldGVybWluaW5nIGlmIGRlZmF1bHQgdGFyZ2V0PGJyPgotCi08aDE+Ci1FY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotQW50PC9oMT4KLUVjbGlwc2UgU0RLIEJ1aWxkIEZlYiA1LCAyMDAzCi0KLTxoMz4KLVJlc29sdmVkIEJ1Z3M8L2gzPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzAyMzkiPjMwMjM5PC9hPjogU29tZSBidWdzIGluIGxhdW5jaCBjb25maWd1cmF0aW9ucyBmb3IgZXh0ZXJuYWwgdG9vbHM8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjc1MCI+MjY3NTA8L2E+OiAiUnVuIHdpdGguLi4iIGRpYWxvZyBmb3IgQW50Vmlldzxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5MjMxIj4yOTIzMTwvYT46IEFudCB2aWV3IGlzIGxpc3RlZCB1bmRlciAiRXh0ZXJuYWwgVG9vbHMiIGluIG1lbnU8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTgyNCI+Mjk4MjQ8L2E+OiBBbnQgdmlldyB0b29sYmFycyBzaG91bGQgZm9sbG93IHR5cGUgaGllcmFyY2h5IGV4YW1wbGU8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDIyMCI+MzAyMjA8L2E+OiBleHRlcm5hbCBidWlsZGVyIG5vdCByZWFkZGVkIHRvIHByb2plY3RzPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzAyMjgiPjMwMjI4PC9hPjogTW5ldW1vbmljIGNvbGxpc2lvbiBvbiBSZWZyZXNoIHRhYiBmb3IgcmVzb3VyY2UgdmFyaWFibGU8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDY0OSI+MzA2NDk8L2E+OiBBbnQgUnVudGltZSBDbGFzc3BhdGggVXAvRG93biBidXR0b25zIGJyb2tlbjxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwNTkxIj4zMDU5MTwvYT46IERCQ1M6QWZ0ZXIgcmVtb3ZlIGFsbCB0YXJnZXRzLCAiUnVuIEFudC4uLiIgd2lsbCByZXBlYXQgbGFzdCB0YXJnZXQ8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTgyMiI+Mjk4MjI8L2E+OiBTdHJlYW1saW5lIHNpbmdsZSB0YXJnZXQgY2FzZSBmb3IgQW50IFZpZXc8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDMzMSI+MzAzMzE8L2E+OiBbQW50IFZpZXddIEFkZCBidWlsZCBmaWxlcyBzb3J0cyBjYXNlIGRlcGVuZGFudDxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwMzE4Ij4zMDMxODwvYT46IFBsYW50eSBzaG91bGQgYmUgcmVuYW1lZCB0byAiQW50IEVkaXRvciI8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTgyMCI+Mjk4MjA8L2E+OiBSZWR1Y2UgY2x1dHRlciBpbiBBbnQgVmlldzxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwMDk4Ij4zMDA5ODwvYT46IEFudFNlY3VyaXR5TWFuYWdlciB0aHJvd3MgZXhjZXB0aW9uIHdoZW4gZXhpdGluZyBFY2xpcHNlPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzA3MTUiPjMwNzE1PC9hPjogSW5jb3JyZWN0IHN0cmluZyBkZXNjcmlwdGlvbiBmb3IgJHtidWlsZF90eXBlfSB2YXJpYWJsZTxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwNDIwIj4zMDQyMDwvYT46IFN0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gb24gcmVzdGFydCB3aXRoIEFudCBlZGl0b3IgYWN0aXZlPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzA3NDQiPjMwNzQ0PC9hPjogQWN0aXZhdGluZyBhIHRhcmdldCBpbiB0aGUgQW50IHZpZXcgc3dpdGNoZXMgdmlldyBsYXlvdXQ8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDU4OSI+MzA1ODk8L2E+OiBEQkNTOkNsaWNraW5nICJVcCIgb3IgIkRvd24iIG1ha2UgVGFyZ2V0IGxvc3Q8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTMxOCI+MjkzMTg8L2E+OiBUd28gYnVpbGRzIGF0IHRoZSBzYW1lIHRpbWUuLi5vbmUgc3RhcnRzIGxvZ2dpbmcgdG8gdGhlIERPUyBjb25zb2xlPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjkyNzEiPjI5MjcxPC9hPjogRXh0ZXJuYWwgdG9vbHMgYW50IG91dHB1dCBhbHdheXMgZ29lcyB0byB0aGUgY29uc29sZTxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwNTQ3Ij4zMDU0NzwvYT46IEFudCB2aWV3IHByb3BlcnRpZXMgYWN0aW9uIGRvZXNuJ3QgaGFuZGxlIG1vcmUgdGhhbiBvbmUgY29uZmlnPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzA2ODAiPjMwNjgwPC9hPjogIldpZGdldCBpcyBkaXNwb3NlZCIgc2V0dGluZyB2YXJpYWJsZSBhcmd1bWVudHMgZm9yIEFudCBCdWlsZDxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwNzY5Ij4zMDc2OTwvYT46IE1pc3NpbmcgaWNvbiBmb3IgdGFyZ2V0IGVycm9yIG5vZGU8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTg4NSI+Mjk4ODU8L2E+OiBBbnQgZWRpdG9yIChwbGFudHkpIGRvZXMgbm90IGhhbmRsZSByZWxhdGl2ZSBwYXRocyBuaWNlbHk8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTc0NCI+Mjk3NDQ8L2E+OiBbRXh0ZXJuYWwgVG9vbHNdIHJlZnJlc2ggJHt3b3JraW5nX3NldH0gZG9lcyBub3Qgd29yazxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwNTU5Ij4zMDU1OTwvYT46IEV4dGVybmFsVG9vbHNQbHVnaW4ubG9nKFRocm93YWJsZSkgbG9ncyBubyBtZXNzYWdlPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzA3NzAiPjMwNzcwPC9hPjogV2hlbiB0aGluZ3MgZ28gd3JvbmcgcGFyc2luZyBmb3IgdGhlIEFudCBFZGl0b3Igb3V0bGluZTxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwNzY3Ij4zMDc2NzwvYT46IE5QRSBvbiByZXNvdXJjZSBjaGFuZ2VkIGZyb20gQW50Vmlldzxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwMzQzIj4zMDM0MzwvYT46IEFudCBFZGl0b3Igb3V0bGluZSBkb2VzIG5vdCBpbmRpY2F0ZSBkZWZhdWx0IHRhcmdldDxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0MTA4Ij4yNDEwODwvYT46IE5scyBleHRlcm5hbCB0b29sczxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2NjgzIj4yNjY4MzwvYT46IFRhcmdldHMgdGFiIGJlaGF2aW9yPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjczMjUiPjI3MzI1PC9hPjogImFjdGl2YXRlIiB0ZXJtaW5vbG9neTxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5ODI4Ij4yOTgyODwvYT46IFRvbyBtYW55IHByZWZlcmVuY2UgcGFnZXM8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDkxNSI+MzA5MTU8L2E+OiBTZWxlY3RlZCByZXNvdXJjZSB0cmFja2luZyBmYWlsczxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwOTMyIj4zMDkzMjwvYT46IFJlc3RvcmUgZGVmYXVsdHMgZG9lcyBub3Qgd29yayBmb3IgY29sb3IgcHJlZmVyZW5jZXM8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDg0NSI+MzA4NDU8L2E+OiBvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLmludGVybmFsLmFudC5kdGQudGVzdC5kdW1wZXIuamF2YTxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwMDkzIj4zMDA5MzwvYT46IEhhbmRsaW5nIGJhZCBkZWZpbml0aW9ucyBvZiBleHRlbnNpb24gcG9pbnRzPGJyPgotCi08aDE+Ci1FY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotQW50PC9oMT4KLUVjbGlwc2UgU0RLIEJ1aWxkIEphbiAyOCwgMjAwMwotCi08aDM+Ci1SZXNvbHZlZCBCdWdzPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5ODc4Ij4yOTg3ODwvYT46IENoa3BpaSBmYWlsdXJlcyBmb3IgQW50IC8gZXh0ZXJuYWwgdG9vbHM8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTg1NyI+Mjk4NTc8L2E+OiBPcGVuIHdpdGggIlBsYW50eSI8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODg3NyI+Mjg4Nzc8L2E+OiBEb3VibGUgY2xpY2tpbmcgYWN0aXZlIHRhcmdldCBzaG91bGQgcnVuIHRoZSBhY3RpdmUgdGFyZ2V0PGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjk4MTYiPjI5ODE2PC9hPjogU3VwcG9ydCAiZGVsZXRlIiBrZXkgaW4gdGhlIEFudCB2aWV3IGZvciBhY3RpdmUgdGFyZ2V0czxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwMDM1Ij4zMDAzNTwvYT46IE5QRSBydW5uaW5nIGJ1aWxkIGZpbGUgaW4gZXh0ZXJuYWwgcHJvamVjdDxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5MzE1Ij4yOTMxNTwvYT46IEFudFByb2dyZXNzQnVpbGRMaXN0ZW5lciB3cml0aW5nIHRvIC5sb2cgb24gYnVpbGQgY2FuY2VsbGVkPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjkzMjEiPjI5MzIxPC9hPjogU2V0IEFOVF9IT01FIGRvZXMgbm90IGZvcmNlIHlvdSB0byBlbnRlciBsb2NhdGlvbjxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5MjQ5Ij4yOTI0OTwvYT46IEFudCB2aWV3IHVwZGF0ZXMgZm9yIHJlc291cmNlIGNoYW5nZXMgaW5lZmZpY2llbnRseTxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI3Njc1Ij4yNzY3NTwvYT46IFNob3cgY3VzdG9tIEVjbGlwc2UgdGFza3MgLyB0eXBlczxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTMwMDgzIj4zMDA4MzwvYT46IEFkZGluZyAtbG9nZ2VyIFhtbExvZ2dlciBjYXVzZSBFeGNlcHRpb24gb24gYnVpbGQgZmluaXNoZWQ8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzYyNyI+Mjc2Mjc8L2E+OiBBUEkgcmV2aWV3PGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzAwODYiPjMwMDg2PC9hPjogQW50IHZpZXcgbm90IHVwZGF0ZWQgd2hlbiBwcm9qZWN0IGRlbGV0ZWQ8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTc0MyI+Mjk3NDM8L2E+OiBbRXh0ZXJuYWwgVG9vbHNdIEFwcGx5IGJ1dHRvbiBkb2VzIG5vdCBlbmFibGUgaW4gInJlZnJlc2ggdGFiIjxicj4KLQotPGgxPgotRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KLUFudDwvaDE+Ci1FY2xpcHNlIFNESyBCdWlsZCBKYW4gMjEsIDIwMDMKLQotPGgzPgotUmVzb2x2ZWQgQnVnczwvaDM+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjUzMiI+MjY1MzI8L2E+OiBbRXh0ZXJuYWwgVG9vbHNdIHRoZSBleHRlcm5hbCB0b29scyBtZW51IGluIHRoZSBydW4gbWVudTxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1ODYwIj4yNTg2MDwvYT46IEFudCBydW5uZXIgc2V0cyBiYXNlZGlyIGluY29ycmVjdGx5PGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjY2NjciPjI2NjY3PC9hPjogRXh0ZXJuYWwgVG9vbCB2YXJpYWJsZXMgYXJlIGV4cGFuZGVkIGluIGxhdW5jaCBjb25maWcgZGlhbG9nPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjk1MDQiPjI5NTA0PC9hPjogRXh0ZXJuYWwgVG9vbHMnIEVjbGlwc2UgdmFyaWFibGVzIGFyZSBkaXNhbGxvd2VkIHRvIGhhdmUgdGV4dCBiZWZvcmUvYWZ0ZXI8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjYxOCI+MTY2MTg8L2E+OiBbRXh0ZXJuYWxUb29sc10gUmUtbGF1bmNoIGxhc3QgRXh0ZXJuYWwgVG9vbCBob3RrZXkgPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjY1MjMiPjI2NTIzPC9hPjogTlBFIGluIGdldEh5cGVyTGluazxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5NTczIj4yOTU3MzwvYT46IEV4dGVybmFsIHRvb2wgdmFyaWFibGUgc2NvcGUgaXMgdG9vIHJlc3RyaWN0aXZlPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjk2NzIiPjI5NjcyPC9hPjogV2hlbiBleHRlcm5hbCB0b29sIGJ1aWxkZXJzIGdvIGJhZDxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5MTUyIj4yOTE1MjwvYT46IE1pZ3JhdGUgZXh0ZW5zaW9uIHBvaW50IHNjaGVtYSBvd25lcnNoaXA8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTE0OCI+MjkxNDg8L2E+OiBDb250cmlidXRpb24gb2YgUGxhbnR5IDAuOS4xPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjg3NDYiPjI4NzQ2PC9hPjogUGxlYXNlIHNvcnQgYnVpbGQgdGFyZ2V0cyBhbHBoYWJldGljYWxseTxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5MzIyIj4yOTMyMjwvYT46IFJldmVydCBoYXMgbm8gZWZmZWN0IG9uIEJ1aWxkIE9wdGlvbnMgdGFiPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjk4MDYiPjI5ODA2PC9hPjogRGVmYXVsdCBzY3JpcHQgbmFtZTxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5ODEyIj4yOTgxMjwvYT46IERlZmluZSBwbGFjZWhvbGRlciBmb3IgQW50IFZpZXc8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTgxMSI+Mjk4MTE8L2E+OiBBZGQgIkFudCBWaWV3IiB0byB0b3AgbGV2ZWwgbWVudTxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4MzA2Ij4yODMwNjwvYT46IEV4dGVybmFsIHRvb2wgYnVpbGRlciBub3QgZGVsZXRlZCBvbiBjYW5jZWw8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODU3NyI+Mjg1Nzc8L2E+OiBFeHRlcm5hbCB0b29sIGJ1aWxkZXIgbm90IGFkZGVkPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjg3NjkiPjI4NzY5PC9hPjogTmV3IEFudCBWaWV3IGRvZXNuJ3QgZ3JhY2VmdWxseSBoYW5kbGUgbWlzc2luZyB0YXJnZXRzPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjk0NDkiPjI5NDQ5PC9hPjogU2VhcmNoRm9yQnVpbGRGaWxlc0RpYWxvZy5zZWFyY2hGb3JCdWlsZEZpbGVzIG9wdGltaXphdGlvbjxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5NjYzIj4yOTY2MzwvYT46IERlc2NyaXB0aW9ucyBpbiB0aGUgQW50Vmlldzxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5ODE4Ij4yOTgxODwvYT46IFJlcGxhY2UgIkdvIFRvIEZpbGUiIHdpdGggIk9wZW4gV2l0aCAtPiI8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMDc5Ij4zMDc5PC9hPjogW0V4dGVybmFsVG9vbHNdIENsaWNraW5nIG9uIG91dHB1dCBzaG91bGQgb3BlbiByZXNvdXJjZTxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI3Njg0Ij4yNzY4NDwvYT46IFRhc2tzIGFuZCBUeXBlcyBsaXN0cyBuZWVkIHRvIGJlIHNvcnRlZDxicj4KLQotPGgxPgotRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KLUFudDwvaDE+Ci1FY2xpcHNlIFNESyBCdWlsZCBKYW4gMTQsIDIwMDMKLQotPGgzPgotUmVzb2x2ZWQgQnVnczwvaDM+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjY4OCI+MjY2ODg8L2E+OiBSZW5kZXJpbmcgb2YgQW50IHByb2plY3RzIGluIHRoZSBBbnQgVmlldzxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI3Njk5Ij4yNzY5OTwvYT46IE1vdmUgdXAvZG93biBlbmFibGVkIHdoZW4gbm8gc2VsZWN0aW9uIGFuZCBvbmx5IG9uZSB0YXJnZXQ8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTE4MCI+MjkxODA8L2E+OiBTdXBwb3J0IGRvdWJsZS1jbGljayBpbiB0aGUgc2VsZWN0aW9uIGRpYWxvZzxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4ODA5Ij4yODgwOTwvYT46IEFOVF9IT01FIG5vdCBzZXQgb24gZmlyc3QgcnVuIG9mIEFudCB0b29sPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjc1NDAiPjI3NTQwPC9hPjogUnVuIEFudCB2cy4gQW50IFZpZXc8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTYyMyI+MTk2MjM8L2E+OiBbRXh0ZXJuYWxUb29sc10gRGlzcGxheSBmdWxsIGNvbW1hbmQgbGluZSBmb3IgZXh0ZXJuYWwgdG9vbDxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5MjIwIj4yOTIyMDwvYT46IEFudCB2aWV3IGV4ZWN1dGlvbiBvcmRlciBjb250YWlucyBleHRyYSBub2RlPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjkyMjEiPjI5MjIxPC9hPjogUnVuIGFzIEFudCBkb2VzIG5vdCByZXBvcnQgYW55dGhpbmcgb24gc29tZSBmYWlsdXJlczxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0MzM4Ij4yNDMzODwvYT46IENhbmNlbGxpbmcgYW4gQW50IHJ1biBjYW4gdGFrZSBhIGxvbmcgdGltZTxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxMDEyIj4yMTAxMjwvYT46IFtFeHRlcm5hbFRvb2xzXSBDYW5jZWwgdG9vbCBkb2VzIG5vdCBjYW5jZWwgdG9vbDxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4OTMzIj4yODkzMzwvYT46IENhbm5vdCBhZGQgdGFza3MvdHlwZXMgZnJvbSBmb2xkZXI8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODg3NiI+Mjg4NzY8L2E+OiBBbnQgVmlldyBpbiBNNCBzaG91bGQgc3BsaXQgdmVydGljYWw8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTI2OSI+MjkyNjk8L2E+OiBDbGFzc05vdEZvdW5kRXhjZXB0aW9uOiBUYXNrTGluZVRyYWNrZXI8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjk3OCI+MjY5Nzg8L2E+OiBBbnQgdGFyZ2V0cyB0YWIgc2hvdWxkbid0IGFkZCBhbGwgdGFyZ2V0cyBieSBkZWZhdWx0dDxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2ODgyIj4yNjg4MjwvYT46IE5lZWQgInJ1biBmb3IgYnVpbGQga2luZHMiIFVJIGZvciBwcm9qZWN0IGJ1aWxkZXJzPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjg0MzEiPjI4NDMxPC9hPjogVmFyaWFibGUgZXhwYW5zaW9uIGlzIHVzaW5nIGluY29ycmVjdCBwYXRoIHNlcGFyYXRvcnM8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODU2OSI+Mjg1Njk8L2E+OiBCcm93c2Ugd29ya3NwYWNlIGRpYWxvZyBuZWVkcyBjb2xvbjxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4NTcwIj4yODU3MDwvYT46IE1pc3NpbmcgbW5ldW1vbmljIGZvciBjb3B5IGJ1dHRvbiBpbiBFeHRlcm5hbCBUb29scyBidWlsZGVycyBwYWdlPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjgzMDUiPjI4MzA1PC9hPjogRWRpdCBwcm9wZXJ0aWVzIGZvciBMYXVuY2ggQ29uZmlndXJhdGlvbiBmb3IgRXh0ZXJuYWwgdG9vbHM8YnI+Ci0KLTxoMT4KLUVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+Ci1BbnQ8L2gxPgotRWNsaXBzZSBTREsgQnVpbGQgSmFuIDcsIDIwMDMKLQotPGgzPgotUmVzb2x2ZWQgQnVnczwvaDM+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzk4MyI+Mjc5ODM8L2E+OiBBbnQgbG9nZ2VyIGRvZXMgbm90IHJlc3BlY3QgY29uc29sZSBidWZmZXIgc2l6ZTxicj4KLQotPGgxPgotRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KLUFudDwvaDE+Ci1FY2xpcHNlIFNESyBCdWlsZCBEZWMgMTcsIDIwMDIKLQotPGgzPgotUmVzb2x2ZWQgQnVnczwvaDM+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODI3NiI+MjgyNzY8L2E+OiBTaG91bGQgbm90IGV4cG9zZSAiYW50IGNsYXNzIGxvYWRlciIgb3B0aW9uIHRvIHVzZXI8YnI+Ci0KLTxoMT4KLUVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+Ci1BbnQ8L2gxPgotRWNsaXBzZSBTREsgQnVpbGQgRGVjIDE2LCAyMDAyCi0KLTxoMz4KLVJlc29sdmVkIEJ1Z3M8L2gzPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjgzMDEiPjI4MzAxPC9hPjogQ3JlYXRpb24gb2YgYW4gRXh0ZXJuYWwgVG9vbCBCdWlsZGVyIGdldHMgbmFtZSB3cm9uZy48YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODMwNiI+MjgzMDY8L2E+OiBFeHRlcm5hbCB0b29sIGJ1aWxkZXIgbm90IGRlbGV0ZWQgb24gY2FuY2VsPGJyPgotPGgxPgotRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KLUFudDwvaDE+Ci1FY2xpcHNlIFNESyBCdWlsZCBEZWMgMTMsIDIwMDIKLQotPGgzPgotUmVzb2x2ZWQgQnVnczwvaDM+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzk4NCI+Mjc5ODQ8L2E+OiBUb3RhbCBidWlsZCB0aW1lIHdyb25nPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjM2NjEiPjIzNjYxPC9hPjogW0V4dGVybmFsVG9vbHNdIExhdW5jaGluZyBBbnQgb24geG1sIGZpbGUgdGhhdCBpcyBpbiB0aGUgYWN0aXZlIGVkaXRvcjxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwNTgxIj4yMDU4MTwvYT46IFtFeHRlcm5hbFRvb2xzXSBWYXJpYWJsZXMgc2hvdWxkIGluc2VydCBhdCBjYXJldDxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2MTgyIj4yNjE4MjwvYT46IEFudCBwcmVmZXJlbmNlIHBhZ2UgaGFzIGNvbmZsaWN0aW5nIG1uZW1vbmljczxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2MjAwIj4yNjIwMDwvYT46IEV4dGVybmFsIHRvb2xzIG1lbnUgaXMgbWlzc2luZyBtbmVtb25pY3M8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzUyNSI+Mjc1MjU8L2E+OiBSZW1vdmUgQWxsIFByb2plY3RzIGFuZCBSZW1vdmUgYWxsIGJ1aWxkIGZpbGVzPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjgwNTIiPjI4MDUyPC9hPjogQW50UHJvY2Vzc0J1aWxkTG9nZ2VyIGRvZXNuJ3QgaGFuZGxlIGVtcHR5IGxvY2F0aW9uczxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI3ODA0Ij4yNzgwNDwvYT46IFZhcmlhYmxlQ29udGV4dE1hbmFnZXIgYW5kIEV4dGVybmFsVG9vbHNQbHVnaW4jc3RhcnR1cDxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4MTMwIj4yODEzMDwvYT46IDEuMyBpbmNvbXBhdGlibGUgY29tcGlsZSB3aGVuIHRhcmdldCwgc291cmNlIHNldCB0byAiMS4zIiB1c2luZyAxLjQuKiB2bTxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4MTM2Ij4yODEzNjwvYT46IEFudCB2aWV3ICJSdW4iIGJ1dHRvbiBpcyBhbWJpZ3VvdXM8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODIxMyI+MjgyMTM8L2E+OiBBZGRpbmcgYSBmaWxlIHRvIHRoZSBBbnQgdmlldyB0aGF0IGFscmVhZHkgZXhpc3RzIHRha2VzIHdheSB0b28gbG9uZzxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2Njg5Ij4yNjY4OTwvYT46IG5hdmlnYXRlIGZyb20gYW50IHZpZXcgdG8gZWRpdG9yPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjY1NTQiPjI2NTU0PC9hPjogQW50IHZpZXcgc2hvdWxkIHVwZGF0ZSB3aGVuIHByb2plY3RzIGNsb3NlZC9yZW1vdmVkPGJyPgotCi08aDE+Ci1FY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotQW50PC9oMT4KLUVjbGlwc2UgU0RLIEJ1aWxkIERlYyAxMCwgMjAwMgotCi08aDM+Ci1SZXNvbHZlZCBCdWdzPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI3MzI4Ij4yNzMyODwvYT46IFNlYXJjaCBmb3IgYnVpbGQgZmlsZSBkb2VzIG5vdCByZW1lYmVyIGxhc3Qgc2VhcmNoIHRleHQ8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzU0MSI+Mjc1NDE8L2E+OiBDYW5ub3QgYWRkIGFuIEFudCBFeHRlcm5hbCBUb29sIEJ1aWxkZXI8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzA1MCI+MjcwNTA8L2E+OiBOdWxsQnVpbGRMb2dnZXIgbm8gbG9uZ2VyIG5lZWRlZDxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2NTc0Ij4xNjU3NDwvYT46IFtFeHRlcm5hbFRvb2xzXSBFeHRlcm5hbCB0b29sIGJ1aWxkZXJzIHNob3VsZCB1c2Ugc2FtZSBzZXQgb2YgZXh0ZXJuYWwgdG9vbHM8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzEwMSI+MjcxMDE8L2E+OiBBbnRWaWV3IGVuaGFuY2VtZW50PGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjc2ODYiPjI3Njg2PC9hPjogSGF2aW5nIGJvdGggUnVuIEFudCBhbmQgUnVuIEFudC4uLiBpbiB0aGUgc2FtZSBtZW51IGlzIHByb2JsZW1hdGljPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjc2NjkiPjI3NjY5PC9hPjogQW50IHZpZXcgdG9vbGJhciBpcyBtaXNsZWFkaW5nPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjc2MTUiPjI3NjE1PC9hPjogSW5jb3JyZWN0IGJ1dHRvbiBlbmFibGVtZW50IG9uIEFudENsYXNzcGF0aFBhZ2U8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjc5MyI+MjI3OTM8L2E+OiBbRXh0ZXJuYWxUb29sc10gQW50IHByZWZlcmVuY2UgcGFnZSBqYXIgYXJlYSBjaGFuZ2VzIHNpemU8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzgxNCI+Mjc4MTQ8L2E+OiBBbnRMYXVuY2hTaG9ydGN1dCByZWZlcmVyZW5jZXMgaW50ZXJuYWwgZGVidWcgVUkgY2xhc3M8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzY2NSI+Mjc2NjU8L2E+OiBCdWlsZGZpbGUgaHlwZXJsaW5rIG9mZiBieSAxPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjczMjMiPjI3MzIzPC9hPjogY2FuIG9ubHkgc2luZ2xlLXNlbGVjdCBhY3RpdmUgdGFyZ2V0czxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI3NzAwIj4yNzcwMDwvYT46IEFudCBWaWV3OiBJIGNhbiBhY3RpdmF0ZSBhIHRhcmdldCBtb3JlIHRoYW4gb25jZTxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI3ODEwIj4yNzgxMDwvYT46IEJ1aWxkZXJQcm9wZXJ0eVBhZ2UgbWFrZXMgbXVsdGlwbGUgZGlzcGF0Y2hpbmcgbGlzdGVuZXJzPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU0MDUiPjE1NDA1PC9hPjogTWFrZSBhbGwgQU5UIGNvbmZpZ3VyYXRpb24gZGVmaW5lZCBhdCBjb25maWcgbGV2ZWw8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzg0MSI+Mjc4NDE8L2E+OiBJbGxlZ2FsIHJlZmVyZW5jZSB0byBMYXVuY2hHcm91cCBhbmQgRGVidWdVSVBsdWdpbjxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI3ODMyIj4yNzgzMjwvYT46IEVhc3kgdG8gY3V0IG9mZiB0aGUgIlJldXNlIEFudCBjbGFzc2xvYWRlciIgb3B0aW9uPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjc4MzEiPjI3ODMxPC9hPjogU2F2ZSBjaGFuZ2VzIHByb21wdCBmcm9tIGNsYXNzcGF0aCB0YWI8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTY0OSI+MjU2NDk8L2E+OiBBZGQgYWN0aW9uIHRvIGFkZCBhbnQgcHJvamVjdCB0byBhbnQgdmlldzxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI3NTA1Ij4yNzUwNTwvYT46IEFudCBzcGVjaWZpYyBhY3Rpb25zIGluIEV4dGVybmFsIHRvb2xzIGJhc2U8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzg2NSI+Mjc4NjU8L2E+OiBDYW4ndCBjYW5jZWwgQW50VmlldyBzZWFyY2g8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzcwMiI+Mjc3MDI8L2E+OiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaW4gQW50Vmlldzxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI3ODQ2Ij4yNzg0NjwvYT46IENhbm5vdCBhZGQgbmV3IGV4dCB0b29sIGJ1aWxlcjxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwODU2Ij4yMDg1NjwvYT46IFtFeHRlcm5hbFRvb2xzXSBQcmVmZXJlbmNlcy9BbnQvQ2xhc3NwYXRoIGluY29uc2lzdGVuY3k8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzQ0MCI+Mjc0NDA8L2E+OiBDYWNoZWQgY2xhc3Nsb2FkZXIgbWlzc2VzIGNoYW5nZXMgdG8gdGFza3MgLyB0eXBlczxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1NjUwIj4yNTY1MDwvYT46IEFkZCBhY3Rpb24gdG8gYW50IHZpZXcgdG8gc2VhcmNoIGZvciBidWlsZCBmaWxlczxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI3OTU0Ij4yNzk1NDwvYT46IE1lcmdlIE1haW4gYW5kIE9wdGlvbnMgdGFiczxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI3ODQxIj4yNzg0MTwvYT46IEV4dCB0b29sIGJ1aWxkZXJzIGhhdmUgd3JvbmcgaWNvbiBhbmQgTlBFJ2Q8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzc4MiI+MTc3ODI8L2E+OiBbRXh0ZXJuYWxUb29sc10gQ3VzdG9tIHRhc2tzIG5vdCBjaGVja2VkIGZvciB2YWxpZGl0eTxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2NDU1Ij4yNjQ1NTwvYT46IC1maW5kIG9wdGlvbiBub3QgeWV0IGltcGxlbWVudGVkPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjc3MDMiPjI3NzAzPC9hPjogQWRkIGNsYXNzcGF0aCB0YWIgZm9yIEFudDxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI3Nzc2Ij4yNzc3NjwvYT46IERvbid0IHVzZSB0aGUgdGVybSAiQW50IFNjcmlwdCI8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzc4MCI+Mjc3ODA8L2E+OiBBbnQgUHJlZmVyZW5jZSBwYWdlIHJlb3JnYW5pemF0aW9uPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjc4NTYiPjI3ODU2PC9hPjogRGVzY3JpcHRpb24gZmllbGQgb24gRXh0ZXJuYWxUb29sc01haW5UYWI8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzk2NCI+Mjc5NjQ8L2E+OiBOb1N1Y2hFbGVtZW50IGV4Y2VwdGlvbiBpbiBBZGRDdXN0b21EaWFsb2c8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzk1NiI+Mjc5NTY8L2E+OiBDcmVhdGUgQW50IE1haW4gdGFiIHRvIGxpbWl0IGxvY2F0aW9uIHNlbGVjdGlvbjxicj4KLQotPGgxPgotRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KLUFudDwvaDE+Ci1FY2xpcHNlIFNESyBCdWlsZCBEZWMgMDMsIDIwMDIKLQotPGgzPgotUmVzb2x2ZWQgQnVnczwvaDM+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDAxNCI+MjAwMTQ8L2E+OiBbRXh0ZXJuYWxUb29sc10gVG9vbCBsb2NhdGlvbiBzaG91bGQgYWNjZXB0IG9ubHkgZmlsZXM8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjkxOCI+MjY5MTg8L2E+OiBQcm9qZWN0cyB3aXRoIGV4dGVybmFsIGJ1aWxkZXJzIGNhdXNlIE5QRXMgd2hlbiBidWlsdCBpbiBoZWFkbGVzcyBtb2RlPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjY2NzEiPjI2NjcxPC9hPjogQW50IGV4dGVybmFsIHRvb2wgaGFuZ3MgRWNsaXBzZTxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1NzA5Ij4yNTcwOTwvYT46IExpc3RzIG9uIFRhcmdldHMgcGFnZSBvZiBFeHRlcm5hbCBUb29scyBwcm9wZXJ0aWVzIG5lZWQgc2Nyb2xsYmFyczxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2NjM3Ij4yNjYzNzwvYT46IFByb2Nlc3MgdGltZXN0YW1wIHNob3dpbmcgYXMgbGF1bmNoIGNvbmZpZ3VyYXRpb24gcHJvcGVydHk8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjYzOCI+MjY2Mzg8L2E+OiBUb28gbXVjaCBsb2dnaW5nIHRvIHRoZSBsb2c8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjk5NSI+MjY5OTU8L2E+OiBSdW4gQW50IGFjdGlvbiBzaG91bGQgcHJvbXB0IGZvciBjb25maWc8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjQ0OSI+MjY0NDk8L2E+OiBwcmVmIHBhZ2U6IHNldCBBTlRfSE9NRSAnQnJvd3NlJyBidXR0b24gc2l6ZSBpcyB1bnVzdWFsPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjc1MDAiPjI3NTAwPC9hPjogQW50IHRhc2tzIGRvIG5vdCBhbHdheXMgaGF2ZSBhIG5hbWU8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTcxMiI+MjU3MTI8L2E+OiBleHRlcm5hbCB0b29scyB0YWJzIG1pc3NpbmcgbW5ldW1vbmljczxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI3MTI0Ij4yNzEyNDwvYT46IEFkanVzdCBoeXBlcmxpbmsgZm9yIGFkb3JuZWQgdGFza3MgaW4gQW50IG91dHB1dDxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI3MDQ5Ij4yNzA0OTwvYT46IEFudFByb2Nlc3NCdWlsZExvZ2dlciBkb2VzIG5vdCB3cml0ZSB0byBsb2dmaWxlPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQ3MDQiPjI0NzA0PC9hPjogVGFza3Mgd2l0aCB0aGUgc2FtZSBuYW1lIGNhbiBiZSBlbnRlcmVkIHZpYSB0aGUgcHJlZiBwYWdlPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjczNDUiPjI3MzQ1PC9hPjogIkRvbid0IGFzayBhZ2FpbiIgcHJlZmVyZW5jZSB3aGVuIG1pZ3JhdGluZyBleHRlcm5hbCB0b29sIGJ1aWxkZXJzPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjcxMjgiPjI3MTI4PC9hPjogSHlwZXJsaW5raW5nIGZvciBBbnQgdGFza3MgZG9lcyBub3Qgd29yayBvbiBvbGRlciBBbnRzPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjcxNDEiPjI3MTQxPC9hPjogW0V4dGVybmFsIFRvb2xzXSBVbmV4cGVjdGVkIFJ1biBBbnQgZGlhbG9nIGJlaGF2aW91ci48YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzUzMSI+Mjc1MzE8L2E+OiBCcm93c2UgZm9yIEFudCBob21lIHNob3VsZCBzdG9yZSBsYXN0IGxvY2F0aW9uPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjcxNTciPjI3MTU3PC9hPjogVHdvIGxhdW5jaCBoaXN0b3JpZXMgZm9yIGV4dGVybmFsIHRvb2xzPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjc1MzQiPjI3NTM0PC9hPjogRXh0cmEgcnVudGltZSBjbGFzc3BhdGggZW50cmllcyBsb3N0IGlmIEFudCBob21lIHNwZWNpZmllZDxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1NTAwIj4yNTUwMDwvYT46IEFkZCBKQVIgdG8gY2xhc3NwYXRoIHNob3VsZCBkZWZhdWx0IHRvIHdvcmtzcGFjZSByb290PGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTMxNDQiPjEzMTQ0PC9hPjogW0V4dGVybmFsVG9vbHNdIEFudCBwcmVmZXJlbmNlIHBhZ2UgZGV0YWlsczxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI3NDQ5Ij4yNzQ0OTwvYT46IEV4dGVybmFsIFRvb2xzL0FudCBzaG91bGQgaG9ub3VyIGRpYWxvZyBmb250PGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjcyMDYiPjI3MjA2PC9hPjogQWRkaXRpb25hbCBhbnQgY2xhc3NwYXRoIHVybHMgZG8gbm90IHNob3cgdXAgZm9yIGFkZGluZyB0YXNrcy90eXBlczxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0ODY1Ij4yNDg2NTwvYT46IE1pc2MgUmVzdHJpY3RlZCB0byBTZWxlY3RlZCBPYmplY3RzIGluIEJyZWFrcG9pbnQgUHJvcGVydGllcyBkaWFsb2c8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzI2NSI+MjcyNjU8L2E+OiBBZG9ybm1lbnQgYWRqdXN0bWVudCBpcyBpbmNvcnJlY3QgZm9yIGxvbmcgdGFzayBuYW1lcy48YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDkyMSI+MjA5MjE8L2E+OiBbRXh0ZXJuYWxUb29sc10gUHJvamVjdCBwcm9wZXJ0aWVzIHJ1bnMgYXV0b2J1aWxkIGZvciBhbGwgcHJvamVjdHM8YnI+Ci0KLTxoMT4KLUVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+Ci1BbnQ8L2gxPgotRWNsaXBzZSBTREsgQnVpbGQgTm92IDI2LCAyMDAyCi0KLTxoMz4KLVJlc29sdmVkIEJ1Z3M8L2gzPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjcwMDkiPjI3MDA5PC9hPjogRXh0ZXJuYWwgdG9vbCBvcHRpb24gdGFiIGRlZmF1bHRzIHRvICJydW4gaW4gYmFja2dyb3VuZCI8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDY5OSI+MjQ2OTk8L2E+OiBBbnQgY2xhc3NwYXRoIHNob3VsZCBiZSBzZXBhcmF0ZWQgaW50byB0d28gY29tcG9uZW50cz88YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjQwNSI+MjY0MDU8L2E+OiBBbnRUYXJnZXRzVGFiIGRvZXNuJ3Qgc2F2ZSB0YXJnZXQgc2VsZWN0aW9uPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjY0MTUiPjI2NDE1PC9hPjogTWlncmF0ZSBleHRlcm5hbCB0b29sIHByb2plY3QgYnVpbGRlcnMgdG8gdXNlIGxhdW5jaCBjb25maWd1cmF0aW9uczxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2NzA0Ij4yNjcwNDwvYT46IFJlbW92ZSBFeHRlcm5hbCBUb29scyBWaWV3PGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjY3MDUiPjI2NzA1PC9hPjogUmVtb3ZlICJFeHRlcm5hbFRvb2wiIFVJIGNvZGU8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjcwOCI+MjY3MDg8L2E+OiBvdXRwdXQgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIGZyb20gY29tbWFuZCBsaW5lPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjcwMTQiPjI3MDE0PC9hPjogUHJvbXB0IGZvciBhcmd1bWVudCBjaGVja2JveCBzaG91bGQgYmUgdGVtcG9yYXJpbHkgcmVtb3ZlZDxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI3MDMzIj4yNzAzMzwvYT46IEFudFZpZXcgdXNlcyBKREsgMS40IG1ldGhvZCBTdHJpbmcuc3BsaXQoLi4uKTxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2NzQ0Ij4yNjc0NDwvYT46IFtFeHRlcm5hbFRvb2xzXSBDb25zb2xlIGFsd2F5cyBvcGVucyBidWlsZCBmaWxlIHdpdGggVGV4dCBlZGl0b3I8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjYzNiI+MjY2MzY8L2E+OiBDYWNoZWQgQW50IGNsYXNzbG9hZGVyIG5vdCByZXNldCB3aXRoIGNsYXNzcGF0aCBjaGFuZ2U8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjg0OSI+MTY4NDk8L2E+OiBbRXh0ZXJuYWxUb29sc10gQW50IGRvZXMgbm90IHJlc3BlY3Qgb3V0cHV0IGxldmVsIHByZWZlcmVuY2U8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjk0OCI+MjY5NDg8L2E+OiBSZXF1ZXN0aW5nIGludmFsaWQgdGFyZ2V0IGV4ZWN1dGlvbiBjYXVzZXMgTlBFIGluIFByb2dyZXNzQnVpbGRMaXN0ZW5lcjxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2MDQyIj4yNjA0MjwvYT46IENhbid0IHJ1biBBbnQgc2NyaXB0IHdpdGggbmV3IEFudCBvbiBNYWNPUyBYPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjY2MDYiPjI2NjA2PC9hPjogQW50IGVycm9ycyBub3Qgc2hvd2luZyBpbiBjb25zb2xlPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTk1MjAiPjE5NTIwPC9hPjogW0V4dGVybmFsVG9vbHNdIFBlcmZvcm1hbmNlIHN1ZmZlcnMgd2l0aCBjb25zb2xlIGxvZyBvdXB1dCBlbmFibGVkPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjI0MDIiPjIyNDAyPC9hPjogW0V4dGVybmFsVG9vbHNdIFBvcnQgZml4IGZvciBoYW5kbGluZyBzcGFjZXMgaW4gYXJndW1lbnRzLi4uPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjYxOTIiPjI2MTkyPC9hPjogTlBFIGZyb20gYW50IHRhcmdldHMgdGFiPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjY3MjkiPjI2NzI5PC9hPjogRXh0ZXJuYWwgdG9vbHMgbWVudSBkb2VzIG5vdCB1cGRhdGU8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjcxNCI+MjY3MTQ8L2E+OiBBbnQgbG9zZXMgcHJlZmVyZW5jZXM8YnI+Ci0KLTxoMT4KLUVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+Ci1BbnQ8L2gxPgotRWNsaXBzZSBTREsgQnVpbGQgTm92IDE5LCAyMDAyCi0KLTxoMz4KLVJlc29sdmVkIEJ1Z3M8L2gzPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjYxMTIiPjI2MTEyPC9hPjogIlJ1biBBbnQuLi4iIGltcGxpZXMgZGlhbG9nPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjQ5OCI+NjQ5ODwvYT46IFtFeHRlcm5hbFRvb2xzXSBzZWxlY3RpbmcgYW5kIGJ1aWxkaW5nIGluZGl2aWR1YWwgdGFyZ2V0cyBpbiBBTlQgc2NyaXB0czxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4OTcxIj4xODk3MTwvYT46IFtFeHRlcm5hbFRvb2xzXSBVc2luZyBleHRlcm5hbCB0b29sIGNvbmZpZ3MgaW4gb3RoZXIgY29udGV4dHM8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTQ1MCI+MTk0NTA8L2E+OiBbRXh0ZXJuYWxUb29sc10gbWVudSBzaG91bGQgbGltaXQgaXRzZWxmIHRvIHRoZSBmaXJzdCBuIHRvb2xzIChwZXJoYXBzIG4gPSAyMCk8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTgwOSI+MjE4MDk8L2E+OiBMZXQgdXNlciBzcGVjaWZ5IGluc3RhbGxhdGlvbiBkaXJlY3Rvcnkgb2YgQW50PGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQ3MTgiPjI0NzE4PC9hPjogUnVuIEFudCBzaG91bGQgYmUgcHJvZ3JhbW1hdGljYWxseSBhdmFpbGFibGU8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTA1OSI+MjUwNTk8L2E+OiBbRXh0ZXJuYWxUb29sc10gUmVmcmVzaCBTY29wZXMgZGlhbG9nIHNob3VsZCBiZSB3aXphcmQ8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTA2MiI+MjUwNjI8L2E+OiBTdXBwb3J0IGV4ZWN1dGlvbiBvZiBhbnQgdGFza3MgaW4gYSBzZXBlcmF0ZSB0aHJlYWQ8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTgyMSI+MjU4MjE8L2E+OiBFeHRlcm5hbCBUb29sXSBFcnJvciBNZXNzYWdlICJFeHRlcm5hbCBUb29sIHJ1bm5lciBpbnRlcm5hbCBlcnJvciI8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjA2MSI+MjYwNjE8L2E+OiBDaGFuZ2VzIHRvIEFudCBjbGFzc3BhdGggZG9uJ3QgcGVyc2lzdDxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2NDE4Ij4yNjQxODwvYT46IFJlbW92ZSAibGF1bmNoIGNvbmZpZ3VyYXRpb24gbW9kZSIgYXMgYW4gb3B0aW9uIGluIGV4dGVybmFsIHRvb2xzPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjY2MjkiPjI2NjI5PC9hPjogRXJyb3IgbWVzc2FnZSBoYXMgcmV2ZXJzZWQgYXJndW1lbnRzPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTk0NTAiPjE5NDUwPC9hPjogW0V4dGVybmFsVG9vbHNdIG1lbnUgc2hvdWxkIGxpbWl0IGl0c2VsZiB0byB0aGUgZmlyc3QgbiB0b29scyAocGVyaGFwcyBuID0gMjApPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjI3MzgiPjIyNzM4PC9hPjogW0V4dGVybmFsVG9vbHNdIFRvb2wgYXJndW1lbnRzIHNob3VsZCBiZSBhIHdpemFyZDxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzMjc1Ij4xMzI3NTwvYT46IFtFeHRlcm5hbFRvb2xzXSBBbnQgV2l6YXJkIHNob3VsZCBub3QgImFsd2F5cyIgYmUgbW9kYWw8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDg1NyI+MjA4NTc8L2E+OiBQcm9ibGVtcyB3aXRoIEFudCBjbGFzc3BhdGggbm90IGJlaW5nIHBpY2tlZCB1cDxicj4KLQotPGgxPgotRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KLUFudDwvaDE+Ci1FY2xpcHNlIFNESyBCdWlsZCBOb3YgMTMsIDIwMDIKLQotPGgzPgotUmVzb2x2ZWQgQnVnczwvaDM+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjA1MCI+MjYwNTA8L2E+OiBVbm5hbWVkIHByb2plY3RzIGNhdXNlIE5QRSBpbiBBbnQgVmlldzxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2OTgyIj4xNjk4MjwvYT46IFtFeHRlcm5hbFRvb2xzXSBDb25zb2xlIGZvbnQgc2V0dGluZyBzaG91bGQgYmUgd29ya2JlbmNoIHRleHQgZm9udDxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1NTkyIj4yNTU5MjwvYT46IFtFeHRlcm5hbCBUb29sc10gTG9nIGNvbnNvbGUgc2hvdWxkIGhhdmUgYXV0b3Njcm9sbDxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4NDc4Ij4xODQ3ODwvYT46IFtFeHRlcm5hbCBUb29sc10gTWlub3I6IG91dHB1dCBub3QgYWx3YXlzIGluIHJpZ2h0IG9yZGVyPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjI3MjciPjIyNzI3PC9hPjogW0V4dGVybmFsIFRvb2xzXSBQcm9ncmFtIHRvb2wgb3V0cHV0IG5vdCBzaG93biBvbiBsb2cgY29uc29sZTxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1NzYyIj4yNTc2MjwvYT46IFByb2JsZW0gc3RhcnRpbmcgSlVuaXQgcGx1Z2luIHRlc3RzPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjU3NDYiPjI1NzQ2PC9hPjogUnVudGltZSBleGVjIHN1cHBvcnQgc2hvdWxkIGJlIGluIGRlYnVnIGNvcmU8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTg3NyI+MjU4Nzc8L2E+OiBzaG91bGQgc2F2ZSBhbGwgZmlsZXMgYmVmb3JlIGV4ZWN1dGUgYW50IHNjcmlwdDxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzNjYyIj4yMzY2MjwvYT46IFtFeHRlcm5hbFRvb2xzXSBFeHRlcm5hbCB0b29scyBoaXN0b3J5IG1hbmlwdWxhdGlvbjxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1OTA3Ij4yNTkwNzwvYT46IFtFeHRlcm5hbFRvb2xzXSBFeHRlcm5hbFRvb2xNZW51RGVsZWdhdGUgbGVha2luZyBtZW51czxicj4KLTxoMT4KLUVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+Ci1BbnQ8L2gxPgotRWNsaXBzZSBTREsgQnVpbGQgTm92IDEyLCAyMDAyCi0KLTxoMz4KLVJlc29sdmVkIEJ1Z3M8L2gzPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjU3NTkiPjI1NzU5PC9hPjogTlBFIHRyeWluZyB0byBvcGVuIHRoZSBhbnR2aWV3IHByZWZlcmVuY2VzIHBhZ2U8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjczMCI+MjI3MzA8L2E+OiBbRXh0ZXJuYWxUb29sc10gQ2FwdHVyZSBvdXRwdXQ8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTM5NyI+MjUzOTc8L2E+OiBBbnRQYWdlIGZsYXNoZXMgd2hlbiByZXNpemVkPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjU0OTMiPjI1NDkzPC9hPjogTlBFIGlmIGRlZmF1bHQgdGFyZ2V0IGRvZXMgbm90IGV4aXN0IGluIGV4dGVybmFsIHRvb2wgYnVpbGRlciBhbnQgZmlsZTxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1NjQ4Ij4yNTY0ODwvYT46IEFkZCByZW1vdmUgYWN0aW9uIHRvIGFudCB2aWV3PGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjU0NjgiPjI1NDY4PC9hPjogQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBBbnQgMS40LjE8YnI+Ci0KLTxoMT4KLUVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+Ci1BbnQ8L2gxPgotRWNsaXBzZSBTREsgQnVpbGQgTm92IDA1LCAyMDAyCi0KLTxoMz4KLVJlc29sdmVkIEJ1Z3M8L2gzPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjU1MDkiPjI1NTA5PC9hPjogTlBFIGZyb20gSW50ZXJuYWxBbnRSdW5uZXI8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTYzOSI+MjU2Mzk8L2E+OiBEb3VibGUgY2xpY2sgaW4gdGFza3MgYW5kIHR5cGVzIHRhYnMgc2hvdWxkIGludm9rZSBlZGl0PGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjU2NTYiPjI1NjU2PC9hPjogW2FudF0gQ2Fubm90IGFkZCBtdWx0aXBsZSBKYXJzIHRvIGFudCBjbGFzc3BhdGggYXQgdGhlIHNhbWUgdGltZTxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1NjkzIj4yNTY5MzwvYT46IEltcGxlbWVudCBzdXBwb3J0IGZvciB0aGUgLWRpYWdub3N0aWNzIG9wdGlvbjxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1NjQ3Ij4yNTY0NzwvYT46IEFkZCBBbnQgVmlldyB0byBFY2xpcHNlPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjU2OTgiPjI1Njk4PC9hPjogR2xvYmFsIHByb3BlcnRpZXM8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTY5OSI+MjU2OTk8L2E+OiBHbG9iYWwgcHJvcGVydHkgZmlsZXM8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTcwMiI+MjU3MDI8L2E+OiAgW0V4dGVybmFsIFRvb2xzXSBSZXN0b3JlIGRlZmF1bHRzIGRvZXMgbm90IHdvcms8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDUyNSI+MjQ1MjU8L2E+OiAgQWN0aXZlIHRhcmdldHMgbm90IHNob3duIGluIGFudCB0b29sIHByb3BlcnR5IHBhZ2U8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDU3OCI+MjQ1Nzg8L2E+OiAgQ2FuJ3QgYWRkIHZhcmlhYmxlIHRvIHRvb2wgYXJndW1lbnRzPGJyPgotCi08aDE+Ci1FY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotQW50PC9oMT4KLUVjbGlwc2UgU0RLIEJ1aWxkIE9jdCAyOSwgMjAwMgotCi08aDM+Ci1SZXNvbHZlZCBCdWdzPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0ODQ3Ij4yNDg0NzwvYT46IGR1cGxpY2F0ZSBvcHRpb25zIG5vdCBoYW5kbGVkIHRoZSBzYW1lIGFzIGNtZCBsaW5lIEFudDxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1MTMzIj4yNTEzMzwvYT46IEltcGxlbWVudCBzdXBwb3J0IGZvciB0aGUgMS41LjEgZmVhdHVyZTogLXByb3BlcnR5ZmlsZTxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI1MjEzIj4yNTIxMzwvYT46IC1wcm9wZXJ0eWZpbGUgc2hvdWxkIG5vdCBhYm9ydCBidWlsZCBpZiB0aGUgcHJvcGVydHkgZmlsZSBpcyBub3QgZm91bmQ8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDU4MCI+MjQ1ODA8L2E+OiBFeHBvc2UgbW9yZSBpbmZvcm1hdGlvbiBpbiBUYXJnZXRJbmZvPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc4MDMiPjE3ODAzPC9hPjogW0V4dGVybmFsVG9vbHNdIEFudFBhZ2UgdGFibGUgc2hvdWxkIHNjcm9sbCBob3Jpem9udGFsbHk8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xODI5NCI+MTgyOTQ8L2E+OiBbRXh0ZXJuYWxUb29sc10gQW50IHByZWZlcmVuY2UgcGFnZTogY2xhc3NwYXRoIGxpc3QgdG9vIHdpZGU8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDM4MyI+MjQzODM8L2E+OiBVcGRhdGUgdGhlIHByaW50VXNhZ2Ugb2YgSW50ZXJuYWxBbnRSdW5uZXI8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDgyNCI+MjQ4MjQ8L2E+OiBEZWZhdWx0TG9nZ2VyIHNob3VsZCBiZSB1c2VkIGZvciBoZWFkbGVzcyBBbnQ8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDU3NiI+MjA1NzY8L2E+OiBbRXh0ZXJuYWxUb29sc10gU2hvdWxkIHNwZWNpZnkgb3JkZXIgb2YgamFycyBvbiBjbGFzc3BhdGg8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDIzNCI+MjQyMzQ8L2E+OiBBbnQgdGVzdCBzdWl0ZTxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0MzE4Ij4yNDMxODwvYT46IE1vdmUgdG8gQW50IDEuNS4xPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjUxMzQiPjI1MTM0PC9hPjogSW1wbGVtZW50IHN1cHBvcnQgZm9yIHRoZSAxLjUuMSBmZWF0dXJlOiAtaW5wdXRoYW5kbGVyPGJyPgotCi08aDE+Ci1FY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotQW50PC9oMT4KLUVjbGlwc2UgU0RLIEJ1aWxkIE9jdCAyMiwgMjAwMgotCi08aDM+Ci1SZXNvbHZlZCBCdWdzPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0NzU2Ij4yNDc1NjwvYT46IC1wcm9qZWN0aGVscCBpbmRpY2F0ZXMgQlVJTEQgU1VDQ0VTU0ZVTDxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0ODMxIj4yNDgzMTwvYT46IFNhbWUgVVJMIG11bHRpcGxlIHRpbWVzIGluIHRoZSBBbnRDbGFzc0xvYWRlcjxicj4KLQotCi08aDE+Ci1FY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotQW50PC9oMT4KLUVjbGlwc2UgU0RLIEJ1aWxkIE9jdCAxNiwgMjAwMgotCi08aDM+Ci1SZXNvbHZlZCBCdWdzPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1ODIxIj4xNTgyMTwvYT46IFtFeHRlcm5hbFRvb2xzXSBNaW5vcjogQW50IGNvbnNvbGUgInN0ZWFscyIgZm9jdXM8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjQwMCI+MjI0MDA8L2E+OiBbRXh0ZXJuYWxUb29sc10gUnVuIEFudC4uLiBhY3Rpb24gZGlzcGxheWVkIGZvciBpbnZhbGlkIHJlc291cmNlcyAoYnVpbGQgSTA4MTMpPGJyPgotCi08aDE+Ci1FY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotQW50PC9oMT4KLUVjbGlwc2UgU0RLIEJ1aWxkIE9jdCAxNSwgMjAwMgotCi08aDM+Ci1SZXNvbHZlZCBCdWdzPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYwMjAiPjYwMjA8L2E+OiBUYXNrcyBjYWxsaW5nIFN5c3RlbS5leGl0IGNyYXNoIEVjbGlwc2U8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzY1MSI+MjM2NTE8L2E+OiBbZG9jXSBBbnRUYXNrcyBhbmQgQW50VHlwZXMgcmVmZXIgdG8gbm9uLWV4aXN0YW50IEFQSTxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzNjUzIj4yMzY1MzwvYT46IFtkb2NdIEV4dHJhIEFudCBjbGFzc3BhdGggZW50cmllcyBleHRlbnNpb248YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDQ1OSI+MjQ0NTk8L2E+OiBBbnRDb3JlUGx1Z2luIHN0YXJ0dXA8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTg5OSI+MTk4OTk8L2E+OiBJZiB0aGUgdXNlciBuZXZlciBjaGFuZ2VzIHRoZSBBbnQgY2xhc3NwYXRoLCBpdCBzaG91bGQgYWx3YXlzIGJlIGNvbXB1dGVkPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjM5MTciPjIzOTE3PC9hPjogbG9nZmlsZSBub3QgY3JlYXRlZCBpbiB0aGUgY29ycmVjdCBsb2NhdGlvbiB3aGVuIHBhdGggbm90IGZ1bGx5IHNwZWNpZmllZDxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0NTg3Ij4yNDU4NzwvYT46IFByb2plY3QgcHJvcGVydGllcyBub3Qgc2V0IHByb3Blcmx5IGlmIG5vIGFyZ3VtZW50cyBwYXNzZWQ8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDY5NiI+MjQ2OTY8L2E+OiBFeHRlcm5hbFRvb2xzIGFudHJ1bm5lci5qYXIgaXMgc3RpbGwgaW4gdGhlIEhFQUQgc3RyZWFtPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQ0MTgiPjI0NDE4PC9hPjogT3B0aW9uIHdpdGhvdXQgbmVjZXNzYXJ5IGNvcnJlc3BvbmRpbmcgYXJndW1lbnQgbm90IGhhbmRsZWQgY29ycmVjdGx5PGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQ1OTQiPjI0NTk0PC9hPjogVGFyZ2V0cyBzcGVjaWZpZWQgYXMgYXJndW1lbnRzIG5vdCByZWNvZ25pemVkPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjM5OTUiPjIzOTk1PC9hPjogZGVhZGxvY2sgd2hpbGUgcnVubmluZyBidWlsZC54bWw8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDczMyI+MjQ3MzM8L2E+OiBIZWxwIHRleHQgaXMgd3Jvbmc8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDcxMCI+MjQ3MTA8L2E+OiBDdXN0b20gYW50IHRhc2sgY2xhc3NlcyBub3QgZm91bmQ8YnI+Ci0KLTxoMT4KLUVjbGlwc2UgUGxhdGZvcm0gQnVpbGQgTm90ZXM8YnI+Ci1BbnQ8L2gxPgotRWNsaXBzZSBTREsgQnVpbGQgT2N0IDA5LCAyMDAyCi0KLTxoMz4KLVJlc29sdmVkIEJ1Z3M8L2gzPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQ1MjciPjI0NTI3PC9hPjogamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24gb2NjdXJzIHdoZW4gaW52b2tpbmcgQW50UnVubmVyPGJyPgotCi08aDE+Ci1FY2xpcHNlIFBsYXRmb3JtIEJ1aWxkIE5vdGVzPGJyPgotQW50PC9oMT4KLUVjbGlwc2UgU0RLIEJ1aWxkIE9jdCAwOCwgMjAwMgotCi08aDM+Ci1SZXNvbHZlZCBCdWdzPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwNTU3Ij4yMDU1NzwvYT46IFJ1bm5pbmcgYW4gZW1wdHkgYW50IHNjcmlwdCB0YWtlcyBhYm91dCAyIHNlY29uZHM8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjQ1OSI+MjI0NTk8L2E+OiBBbnRSdW5uZXIgcHJpbnRzIHN0YWNrIHRyYWNlIG9uIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjMzODMiPjIzMzgzPC9hPjogQVBJOiBBZGQgQHNpbmNlIHRhZ3M8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDI5MCI+MjQyOTA8L2E+OiBBbnQgcHJlZmVyZW5jZXMgYXJlIG9ubHkgc2F2ZWQgYXQgc2h1dGRvd248YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzU4NCI+MjM1ODQ8L2E+OiBKYXZhIHNob3VsZCBiZSBjYXBpdGFsaXplZDxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3NDg0Ij4xNzQ4NDwvYT46IFtFeHRlcm5hbFRvb2xzXSBBZGRpbmcgdGFza3MgZnJvbSBKQVJzIGluIHRoZSBBbnQgUHJlZmVyZW5jZSBQYWdlPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjM2NjQiPjIzNjY0PC9hPjogQmV0dGVyIHJlcG9ydGluZyBvZiBlcnJvcnMgd2hlbiByZWFkaW5nIEFudCBidWlsZCBmaWxlPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQ0MTUiPjI0NDE1PC9hPjogUnVubmluZyBhbiBBbnQgc2NyaXB0IHdpdGggY29uc29sZSBsb2dnaW5nIHR1cm5lZCBvZmYgd3JpdGVzIHRvIE9TIGNvbnNvbGU8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDQ1MiI+MjQ0NTI8L2E+OiBLZXkgY2xhc2hlcyB3aXRoaW4gZXh0ZW5zaW9uIHBvaW50IGRlZmluaXRpb25zPGJyPgotCi08aDM+Ci1Qcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzMzUwIj4yMzM1MDwvYT46IFBvc3NpYmxlIE5QRTxicj4KLQotPGgxPgotRWNsaXBzZSBQbGF0Zm9ybSBCdWlsZCBOb3Rlczxicj4KLUFudDwvaDE+Ci1FY2xpcHNlIFNESyBCdWlsZCBPY3QgMDEsIDIwMDIKLQotPGgzPgotUmVzb2x2ZWQgQnVnczwvaDM+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzQ4MiI+MjM0ODI8L2E+OiBSZXdvcmsgdGhlIENvcmUgQW50IGNvZGUgdG8gYmUgYWJsZSB0byB1c2UgdGhlIE5MUyB0b29sczxicj4gCi08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDE4MCI+MTQxODA8L2E+OiBBbnQgLWhlbHAgbm90IGZ1bmN0aW9uPGJyPiAKLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE5ODAxIj4xOTgwMTwvYT46IEFudENvcmVQcmVmZXJlbmNlcywgVHlwZSwgVGFza3MgY291bGQgYmUgYSBwdWJsaWMgY2xhc3M8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzg4MSI+MjM4ODE8L2E+OiBTYW1lIGVycm9yIGxvZ2dlZCB0aHJlZSB0aW1lczxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzOTEzIj4yMzkxMzwvYT46IElzc3VlcyB3aXRoIEludGVybmFsQW50UnVubmVyI3ByaW50SGVscChQcm9qZWN0KTxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyNzE0Ij4yMjcxNDwvYT46IEFyZ3VtZW50cyBsaW5lIGxvc2Ugc3BhY2VzIHdoZW4gcHJpbnRlZCB0byBjb25zb2xlPGJyPgotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjMxMzIiPjIzMTMyPC9hPjogLWxvZ2ZpbGUgb3B0aW9uIGZvciBhbnQgZG9lc250IHNlZW0gdG8gd29yazxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2NzQwIj4xNjc0MDwvYT46IFtFeHRlcm5hbFRvb2xzXSBJcnJlbGV2YW50IHN0YWNrIHRyYWNlIGZvciBlcnJvcnMgaW4gQW50IGJ1aWxkIGZpbGU8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTgzOCI+MTk4Mzg8L2E+OiBFcnJvciBjb2RlcyBmb3IgQW50IENvcmUgc2hvdWxkIGJlIHB1YmxpYzxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxNDc4Ij4yMTQ3ODwvYT46IEluc3VmZmljaWVudCBBbnQgYWN0aXZhdGlvbiBlcnJvciByZXBvcnRpbmc8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzY1OCI+MjM2NTg8L2E+OiBCdWlsZCBmaWxlIGlzIG5vdCBsb2dnZWQgdG8gbG9nIGNvbnNvbGUgdmlldzxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyNDY1Ij4yMjQ2NTwvYT46IFdyb25nIGFudCBzY3JpcHQgY2F1c2VzIGZhdGFsIGVycm9yIHdyaXR0ZW4gdG8gY29uc29sZTxicj4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzOTI0Ij4yMzkyNDwvYT46IGhhbmRsaW5nIG9mIGluY29ycmVjdCAvIHVucmVjb2duaXplZCBhcmd1bWVudHM8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzcyMCI+MjM3MjA8L2E+OiBbZG9jXSBFeHRlbnNpb24gcG9pbnQgbGlzdGluZyBpcyBpbmNvcnJlY3Q8YnI+Ci08YSBocmVmPSJodHRwOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjcwMiI+MjI3MDI8L2E+OiBYbWxMb2dnZXIgbm90IHdvcmtpbmc/PGJyPgotCi08aDM+Ci1Qcm9ibGVtIFJlcG9ydHMgQ2xvc2VkPC9oMz4KLTxhIGhyZWY9Imh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxNDc5Ij4yMTQ3OTwvYT46IEFudCBjbGFzc3BhdGggcmVmZXJzIHRvIG9sZCAneGVyY2VzLmphcic8YnI+IAotPGEgaHJlZj0iaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjM4MzIiPjIzODMyPC9hPjogVXBkYXRlIEFudCBwYWdlcyBvbiBkZXYuZWNsaXBzZS5vcmc8YnI+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zY2hlbWEvYW50VGFza3MuZXhzZCBiL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zY2hlbWEvYW50VGFza3MuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWYyMzZiMi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc2NoZW1hL2FudFRhc2tzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuYW50LmNvcmUiPgotPGFubm90YXRpb24+Ci0gICA8YXBwSW5mbz4KLSAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmFudC5jb3JlIiBpZD0iYW50VGFza3MiIG5hbWU9IkFudCBUYXNrcyIvPgotICAgPC9hcHBJbmZvPgotICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICBBbGxvd3MgcGx1Zy1pbnMgdG8gZGVmaW5lIGFyYml0cmFyeSBBbnQgdGFza3MgZm9yIHVzZSAKLWJ5IHRoZSBBbnQgaW5mcmFzdHJ1Y3R1cmUuICBUaGUgc3RhbmRhcmQgQW50IGluZnJhc3RydWN0dXJlIAotYWxsb3dzIGZvciB0aGUgYWRkaXRpb24gb2YgYXJiaXRyYXJ5IHRhc2tzLiAgCi1VbmZvcnR1bmF0ZWx5LCBpdCBpcyB1bmxpa2VseSB0aGF0IHRoZSBBbnQgQ29yZSBwbHVnLWluIAotd291bGQgaGF2ZSB0aGUgY2xhc3NlcyByZXF1aXJlZCBieSB0aGVzZSB0YXNrcyBvbiBpdHMgCi1jbGFzc3BhdGggKG9yIHRoYXQgb2YgYW55IG9mIGl0cyBwcmVyZXF1aXNpdGVzKS4gIAotVG8gYWRkcmVzcyB0aGlzLCBjbGllbnRzIHNob3VsZCBkZWZpbmUgYW4gZXh0ZW5zaW9uIAotd2hpY2ggcGx1Z3MgaW50byB0aGlzIGV4dGVuc2lvbi1wb2ludCBhbmQgbWFwcyBhIAotdGFzayBuYW1lIG9udG8gYSBjbGFzcy4gIFRoZSBBbnQgcGx1Zy1pbiBjYW4gdGhlbiAKLXJlcXVlc3QgdGhhdCB0aGUgZGVjbGFyaW5nIHBsdWctaW4gbG9hZCB0aGUgc3BlY2lmaWVkIGNsYXNzLgotICAgPC9kb2N1bWVudGF0aW9uPgotPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJhbnRUYXNrIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJhbnRUYXNrIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJuYW1lIi8+Ci0gICAgICAgICA8L2FwcEluZm8+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgbmFtZSBvZiB0aGUgdGFzayB0byBiZSBkZWZpbmVkCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgSmF2YSBjbGFzcyBpbXBsZW1lbnRpbmcgCi10aGUgdGFzay4gIEdlbmVyYWxseSB0aGlzIGNsYXNzIG11c3QgYmUgYSBzdWJjbGFzcyBvZgotJmx0O3NhbXAmZ3Q7b3JnLmFwYWNoZS50b29scy5hbnQuVGFzayZsdDsvc2FtcCZndDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibGlicmFyeSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIHBhdGggcmVsYXRpdmUgdG8gdGhlIHBsdWctaW4gaW5zdGFsbCBsb2NhdGlvbgotZm9yIHRoZSBsaWJyYXJ5IGNvbnRhaW5pbmcgdGhlIHRhc2suCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaGVhZGxlc3MiIHR5cGU9InN0cmluZyIgdXNlPSJvcHRpb25hbCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgaW5kaWNhdGVzIHdoZXRoZXIgdGhpcyB0YXNrIGlzIHN1aXRhYmxlIGZvciB1c2UgaW4gYSAiaGVhZGxlc3MiIEFudCBlbnZpcm9ubWVudC4gSWYgcnVubmluZyBoZWFkbGVzcyBhbmQgdGhlIGF0dHJpYnV0ZSBpcyAiZmFsc2UiLCAKLSAgICAgICAgICAgICAgICAgIHRoZSB0YXNrIHdpbGwgbm90IGJlIGxvYWRlZCBvciBkZWZpbmVkLiBBcyB3ZWxsLCB0aGUgcGx1Z2luIGNsYXNzIGxvYWRlciB3aWxsIG5vdCBiZSBhZGRlZCBhcyBhIHBhcmVudCBjbGFzc2xvYWRlciB0byB0aGUgQW50IGNsYXNzbG9hZGVyLgotICAgICAgICAgICAgICAgICAgVGhlIGltcGxpZWQgdmFsdWUgaXMgdHJ1ZSwgd2hlbiBub3Qgc3BlY2lmaWVkLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYW4gQW50IHRhc2tzIGV4dGVuc2lvbiBwb2ludDogCi0mbHQ7cCZndDsKLSZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5hbnQuY29yZS5hbnRUYXNrcyImZ3Q7Ci0gICAgICAmbHQ7YW50VGFzayBuYW1lPSJjb29sVGFzayIgY2xhc3M9ImNvbS5leGFtcGxlLkNvb2xUYXNrIi8mZ3Q7Ci0gICAmbHQ7L2V4dGVuc2lvbiZndDsgCi0mbHQ7L3ByZSZndDsKLSZsdDsvcCZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIHBsYXRmb3JtIGl0c2VsZiBzdXBwbGllcyBhIG51bWJlciBvZiB0YXNrcyBpbmNsdWRpbmcgCi1lY2xpcHNlLmluY3JlbWVudGFsQnVpbGQgYW5kIGVjbGlwc2UucmVmcmVzaExvY2FsLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2EgaHJlZj0iaGdsZWdhbC5odG0iJmd0OyZsdDtpbWcgU1JDPSJuZ2libWNweS5naWYiIEFMVD0iQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAwLCAyMDAzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4iIEJPUkRFUj0wIGhlaWdodD0xMiB3aWR0aD0xOTUmZ3Q7Jmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zY2hlbWEvYW50VHlwZXMuZXhzZCBiL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zY2hlbWEvYW50VHlwZXMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ1YjM4Zi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc2NoZW1hL2FudFR5cGVzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuYW50LmNvcmUiPgotPGFubm90YXRpb24+Ci0gICA8YXBwSW5mbz4KLSAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmFudC5jb3JlIiBpZD0iYW50VHlwZXMiIG5hbWU9IkFudCBUeXBlcyIvPgotICAgPC9hcHBJbmZvPgotICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICBBbGxvd3MgcGx1Zy1pbnMgdG8gZGVmaW5lIGFyYml0cmFyeSBBbnQgZGF0YXR5cGVzIGZvciAKLXVzZSBieSB0aGUgQW50IGluZnJhc3RydWN0dXJlLiAgVGhlIHN0YW5kYXJkIEFudCAKLWluZnJhc3RydWN0dXJlIGFsbG93cyBmb3IgdGhlIGFkZGl0aW9uIG9mIGFyYml0cmFyeSAKLWRhdGF0eXBlcy4gIFVuZm9ydHVuYXRlbHksIGl0IGlzIHVubGlrZWx5IHRoYXQgdGhlIAotQW50IENvcmUgcGx1Zy1pbiB3b3VsZCBoYXZlIHRoZSBjbGFzc2VzIHJlcXVpcmVkIAotYnkgdGhlc2UgZGF0YXR5cGVzIG9uIGl0cyBjbGFzc3BhdGggKG9yIHRoYXQgb2YgYW55IAotb2YgaXRzIHByZXJlcXVpc2l0ZXMpLiAgVG8gYWRkcmVzcyB0aGlzLCBjbGllbnRzIAotc2hvdWxkIGRlZmluZSBhbiBleHRlbnNpb24gd2hpY2ggcGx1Z3MgaW50byB0aGlzIAotZXh0ZW5zaW9uLXBvaW50IGFuZCBtYXBzIGEgZGF0YXR5cGUgbmFtZSBvbnRvIGEgY2xhc3MuICAKLVRoZSBBbnQgcGx1Zy1pbiBjYW4gdGhlbiByZXF1ZXN0IHRoYXQgdGhlIGRlY2xhcmluZyAKLXBsdWctaW4gbG9hZCB0aGUgc3BlY2lmaWVkIGNsYXNzLgotICAgPC9kb2N1bWVudGF0aW9uPgotPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJhbnRUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImFudFR5cGUiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9Im5hbWUiLz4KLSAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBuYW1lIG9mIHRoZSB0eXBlIHRvIGJlIGRlZmluZWQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBKYXZhIGNsYXNzIGltcGxlbWVudGluZyAKLXRoZSBkYXRhdHlwZS4gIEdlbmVyYWxseSB0aGlzIGNsYXNzIG11c3QgYmUgYSBzdWJjbGFzcyBvZgotJmx0O3NhbXAmZ3Q7b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRGF0YVR5cGUmbHQ7L3NhbXAmZ3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRGF0YVR5cGUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsaWJyYXJ5IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgcGF0aCByZWxhdGl2ZSB0byB0aGUgcGx1Zy1pbiBpbnN0YWxsIGxvY2F0aW9uCi1mb3IgdGhlIGxpYnJhcnkgY29udGFpbmluZyB0aGUgdHlwZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJoZWFkbGVzcyIgdHlwZT0ic3RyaW5nIiB1c2U9Im9wdGlvbmFsIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBpbmRpY2F0ZXMgd2hldGhlciB0aGlzIHR5cGUgaXMgc3VpdGFibGUgZm9yIHVzZSBpbiBhICJoZWFkbGVzcyIgQW50IGVudmlyb25tZW50LiBJZiBydW5uaW5nIGhlYWRsZXNzIGFuZCB0aGUgYXR0cmlidXRlIGlzICJmYWxzZSIsIAotICAgICAgICAgICAgICAgICAgdGhlIHR5cGUgd2lsbCBub3QgYmUgbG9hZGVkIG9yIGRlZmluZWQuIEFzIHdlbGwsIHRoZSBwbHVnaW4gY2xhc3MgbG9hZGVyIHdpbGwgbm90IGJlIGFkZGVkIGFzIGEgcGFyZW50IGNsYXNzbG9hZGVyIHRvIHRoZSBBbnQgY2xhc3Nsb2FkZXIuCi0gICAgICAgICAgICAgICAgICBUaGUgaW1wbGllZCB2YWx1ZSBpcyB0cnVlLCB3aGVuIG5vdCBzcGVjaWZpZWQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBhbiBBbnQgdHlwZXMgZXh0ZW5zaW9uIHBvaW50OiAKLSZsdDtwJmd0OwotJmx0O3ByZSZndDsKLSAgICZsdDtleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmFudC5jb3JlLmFudFR5cGVzIiZndDsKLSAgICAgICZsdDthbnRUeXBlIG5hbWU9ImNvb2xUeXBlIiBjbGFzcz0iY29tLmV4YW1wbGUuQ29vbFR5cGUiLyZndDsKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OyAKLSZsdDsvcHJlJmd0OwotJmx0Oy9wJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2EgaHJlZj0iaGdsZWdhbC5odG0iJmd0OyZsdDtpbWcgU1JDPSJuZ2libWNweS5naWYiIEFMVD0iQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAwLCAyMDAzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4iIEJPUkRFUj0wIGhlaWdodD0xMiB3aWR0aD0xOTUmZ3Q7Jmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zY2hlbWEvZXh0cmFDbGFzc3BhdGhFbnRyaWVzLmV4c2QgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc2NoZW1hL2V4dHJhQ2xhc3NwYXRoRW50cmllcy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjM0NjViLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zY2hlbWEvZXh0cmFDbGFzc3BhdGhFbnRyaWVzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuYW50LmNvcmUiPgotPGFubm90YXRpb24+Ci0gICA8YXBwSW5mbz4KLSAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmFudC5jb3JlIiBpZD0iZXh0cmFDbGFzc3BhdGhFbnRyaWVzIiBuYW1lPSJFeHRyYSBBbnQgQ2xhc3NwYXRoIEVudHJpZXMiLz4KLSAgIDwvYXBwSW5mbz4KLSAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgQWxsb3dzIHBsdWctaW5zIHRvIGRlZmluZSBhcmJpdHJhcnkgSkFScyBmb3IgdXNlIGJ5IHRoZSBBbnQgaW5mcmFzdHJ1Y3R1cmUuCi1UaGVzZSBKQVJzIGFyZSBwdXQgaW50byB0aGUgQW50IGNsYXNzcGF0aCBhdCBydW50aW1lLiAgQmVzaWRlcwotdGhlIEpBUiwgdGhlIHBsdWctaW4gY2xhc3Nsb2FkZXIgb2YgdGhlIHBsdWctaW4gcHJvdmlkaW5nIHRoZQotSkFSIGlzIGFsc28gYWRkZWQgdG8gdGhlIGNsYXNzcGF0aC4KLSAgIDwvZG9jdW1lbnRhdGlvbj4KLTwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZXh0cmFDbGFzc3BhdGhFbnRyeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0cmFDbGFzc3BhdGhFbnRyeSI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImxpYnJhcnkiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBwbHVnLWluIGluc3RhbGwgbG9jYXRpb24gZm9yIHRoZSBsaWJyYXJ5LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImhlYWRsZXNzIiB0eXBlPSJzdHJpbmciIHVzZT0ib3B0aW9uYWwiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGluZGljYXRlcyB3aGV0aGVyIHRoaXMgZXh0cmEgY2xhc3NwYXRoIGVudHJ5IGlzIHN1aXRhYmxlIGZvciB1c2UgaW4gYSAiaGVhZGxlc3MiIEFudCBlbnZpcm9ubWVudC4gSWYgcnVubmluZyBoZWFkbGVzcyBhbmQgdGhlIGF0dHJpYnV0ZSBpcyAiZmFsc2UiLCAKLSAgICAgICAgICAgICAgICAgIHRoaXMgZW50cnkgd2lsbCBub3QgYmUgYWRkZWQgdG8gdGhlIEFudCBjbGFzc3BhdGguIEFzIHdlbGwsIHRoZSBwbHVnaW4gY2xhc3MgbG9hZGVyIHdpbGwgbm90IGJlIGFkZGVkIGFzIGEgcGFyZW50IGNsYXNzbG9hZGVyIHRvIHRoZSBBbnQgY2xhc3Nsb2FkZXIuCi0gICAgICAgICAgICAgICAgICBUaGUgaW1wbGllZCB2YWx1ZSBpcyB0cnVlLCB3aGVuIG5vdCBzcGVjaWZpZWQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBhbiBleHRyYSBjbGFzc3BhdGggZW50cmllcyBleHRlbnNpb24gcG9pbnQ6Ci0KLSZsdDtwJmd0OwotJmx0O3ByZSZndDsKLSAmbHQ7ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5hbnQuY29yZS5leHRyYUNsYXNzcGF0aEVudHJpZXMiJmd0OwotICAmbHQ7ZXh0cmFDbGFzc3BhdGhFbnRyeSBsaWJyYXJ5PSJteUV4dHJhTGlicmFyeS5qYXIiLyZndDsKLSAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotJmx0Oy9wJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgcGxhdGZvcm0gaXRzZWxmIHN1cHBsaWVzIGFuIEFudCBzdXBwb3J0IGphciAoYW50c3VwcG9ydGxpYi5qYXIpLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2EgaHJlZj0iaGdsZWdhbC5odG0iJmd0OyZsdDtpbWcgU1JDPSJuZ2libWNweS5naWYiIEFMVD0iQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAwLCAyMDAzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4iIEJPUkRFUj0wIGhlaWdodD0xMiB3aWR0aD0xOTUmZ3Q7Jmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zY3JpcHRzL2J1aWxkRXh0cmFKQVIueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NjcmlwdHMvYnVpbGRFeHRyYUpBUi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4ZjAyMTUuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NjcmlwdHMvYnVpbGRFeHRyYUpBUi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3QgbmFtZT0iQnVpbGQgQW50IHN1cHBvcnQgSkFSIiBkZWZhdWx0PSJtYWluIiBiYXNlZGlyPSIuLiI+Ci0KLQk8cHJvcGVydHkgbmFtZT0iYm9vdGNsYXNzcGF0aCIgdmFsdWU9IiIvPgotCi0JPHRhcmdldCBuYW1lPSJtYWluIj4KLQkJPGNvbmRpdGlvbiBwcm9wZXJ0eT0iZnVsbEJ1aWxkIj4KLQkJCTxlcXVhbHMgYXJnMT0iJHtidWlsZFR5cGV9IiBhcmcyPSJmdWxsIi8+Ci0JCTwvY29uZGl0aW9uPgotCQk8YW50Y2FsbCB0YXJnZXQ9ImJ1aWxkIi8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9ImJ1aWxkIiBpZj0iZnVsbEJ1aWxkIj4KLQkJPGFudGNhbGwgdGFyZ2V0PSJjbGVhbiIvPgotCQk8YW50Y2FsbCB0YXJnZXQ9ImxpYi9hbnRzdXBwb3J0bGliLmphciIvPgotCQk8YW50Y2FsbCB0YXJnZXQ9InJlZnJlc2giLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iaW5pdCIgZGVwZW5kcz0icHJvcGVydGllcyI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4iIHZhbHVlPSJvcmcuZWNsaXBzZS5hbnQuY29yZSIvPgotCQk8cHJvcGVydHkgbmFtZT0idmVyc2lvbi5zdWZmaXgiIHZhbHVlPSJfMi4xLjAiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImZ1bGwubmFtZSIgdmFsdWU9IiR7cGx1Z2lufSR7dmVyc2lvbi5zdWZmaXh9Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ0ZW1wLmZvbGRlciIgdmFsdWU9IiR7YmFzZWRpcn0vdGVtcC5mb2xkZXIiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbi5kZXN0aW5hdGlvbiIgdmFsdWU9IiR7YmFzZWRpcn0iLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJ1aWxkLnJlc3VsdC5mb2xkZXIiIHZhbHVlPSIke2Jhc2VkaXJ9Ii8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9InByb3BlcnRpZXMiIGlmPSJlY2xpcHNlLnJ1bm5pbmciPgotCQk8cHJvcGVydHkgbmFtZT0iYnVpbGQuY29tcGlsZXIiIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5KRFRDb21waWxlckFkYXB0ZXIiLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0ibGliL2FudHN1cHBvcnRsaWIuamFyIiBkZXBlbmRzPSJpbml0Ij4KLQkJPHByb3BlcnR5IG5hbWU9ImRlc3RkaXIiIHZhbHVlPSIke3RlbXAuZm9sZGVyfS9saWIvYW50c3VwcG9ydGxpYi5qYXIuYmluIi8+Ci0JCTxkZWxldGUgZGlyPSIke3RlbXAuZm9sZGVyfS9saWIvYW50c3VwcG9ydGxpYi5qYXIuYmluIi8+Ci0JCTxta2RpciBkaXI9IiR7dGVtcC5mb2xkZXJ9L2xpYi9hbnRzdXBwb3J0bGliLmphci5iaW4iLz4KLQkJPCEtLSBjb21waWxlIHRoZSBzb3VyY2UgY29kZSAtLT4KLQkJPGphdmFjIHRhcmdldD0iMS4zIiBzb3VyY2U9IjEuMyIgZGVzdGRpcj0iJHt0ZW1wLmZvbGRlcn0vbGliL2FudHN1cHBvcnRsaWIuamFyLmJpbiIKLQkJCWZhaWxvbmVycm9yPSJmYWxzZSIKLQkJCXZlcmJvc2U9ImZhbHNlIgotCQkJZGVidWc9Im9uIgotCQkJaW5jbHVkZUFudFJ1bnRpbWU9Im5vIgotCQkJYm9vdGNsYXNzcGF0aD0iJHtib290Y2xhc3NwYXRofSIgCi0JCQljbGFzc3BhdGg9IiR7YmFzZWRpcn0vLi4vb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL3J1bnRpbWUuamFyOwotCQkJJHtiYXNlZGlyfS8uLi9vcmcuYXBhY2hlLmFudC9hbnQuamFyOwotCQkJJHtiYXNlZGlyfS8uLi9vcmcuYXBhY2hlLnhlcmNlcy94ZXJjZXNJbXBsLmphcjsKLQkJCSR7YmFzZWRpcn0vLi4vb3JnLmFwYWNoZS54ZXJjZXMveG1sUGFyc2VyQVBJcy5qYXI7Ci0JCQkke2Jhc2VkaXJ9L2JpbjsKLQkJCSR7YmFzZWRpcn0vLi4vb3JnLmVjbGlwc2UuY29yZS5ib290L2Jvb3QuamFyIj4KLQkJCTxzcmMgcGF0aD0ic3JjX2FudC8iLz4KLQkJPC9qYXZhYz4KLQkJPCEtLSBjb3B5IG5lY2Vzc2FyeSByZXNvdXJjZXMgLS0+Ci0JCTxjb3B5IHRvZGlyPSIke3RlbXAuZm9sZGVyfS9saWIvYW50c3VwcG9ydGxpYi5qYXIuYmluIj4KLQkJCTxmaWxlc2V0IGRpcj0ic3JjX2FudC8iIGV4Y2x1ZGVzPSIqKi8qLmphdmEiLz4KLQkJPC9jb3B5PgotCQk8bWtkaXIgZGlyPSIke2J1aWxkLnJlc3VsdC5mb2xkZXJ9L2xpYiIvPgotCQk8amFyIGphcmZpbGU9IiR7YnVpbGQucmVzdWx0LmZvbGRlcn0vbGliL2FudHN1cHBvcnRsaWIuamFyIiBiYXNlZGlyPSIke3RlbXAuZm9sZGVyfS9saWIvYW50c3VwcG9ydGxpYi5qYXIuYmluIi8+Ci0JCTxkZWxldGUgZGlyPSIke3RlbXAuZm9sZGVyfSIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJjbGVhbiIgZGVwZW5kcz0iaW5pdCI+Ci0JCTxkZWxldGUgZmlsZT0iJHtidWlsZC5yZXN1bHQuZm9sZGVyfS9saWIvYW50c3VwcG9ydGxpYi5qYXIiLz4KLQkJPGRlbGV0ZSBkaXI9IiR7dGVtcC5mb2xkZXJ9Ii8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9InJlZnJlc2giIGRlcGVuZHM9ImluaXQiIGlmPSJlY2xpcHNlLnJ1bm5pbmciPgotCQk8ZWNsaXBzZS5yZWZyZXNoTG9jYWwgcmVzb3VyY2U9IiR7cGx1Z2lufSIgZGVwdGg9ImluZmluaXRlIi8+Ci0JPC90YXJnZXQ+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zY3JpcHRzL2V4cG9ydHBsdWdpbi54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc2NyaXB0cy9leHBvcnRwbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjNiYzVhLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zY3JpcHRzL2V4cG9ydHBsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08IS0tIEV4cG9ydCBhIGphciBvZiAuY2xhc3MgZmlsZXMgZm9yIHRoZSBvcmcuZWNsaXBzZS5hbnQuY29yZSBFY2xpcHNlIHBsdWctaW4KLSAgICAgYWxvbmcgd2l0aCBvdGhlciBpbXBvcnRhbnQgcGx1Z2luIGZpbGVzIHRvIHRoZSAicGx1Z2luLWV4cG9ydCIgc3ViZGlyZWN0b3J5Ci0gICAgIG9mIHRoZSB0YXJnZXQgRWNsaXBzZSBpbnN0YWxsYXRpb24gLS0+Ci08cHJvamVjdCBuYW1lPSJFeHBvcnQgYW50LmNvcmUiIGRlZmF1bHQ9ImV4cG9ydCIgYmFzZWRpcj0iLi4iPgotCi0JPCEtLSBTZXQgdGhlIHRpbWVzdGFtcCBhbmQgaW1wb3J0YW50IHByb3BlcnRpZXMgLS0+Ci0JPHRhcmdldCBuYW1lPSJpbml0Ij4KLQkJPHRzdGFtcC8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJkZXN0ZGlyIiB2YWx1ZT0iLi4vLi4vcGx1Z2luLWV4cG9ydCIgLz4KLQkJPHByb3BlcnR5IG5hbWU9ImRlc3QiICB2YWx1ZT0iJHtkZXN0ZGlyfS9vcmcuZWNsaXBzZS5hbnQuY29yZV8yLjEuMCIgLz4KLQk8L3RhcmdldD4KLQotCTwhLS0gQ3JlYXRlIHRoZSBqYXIgb2YgLmNsYXNzIGZpbGVzLCBhbmQgY29weSBvdGhlciBpbXBvcnRhbnQgZmlsZXMgdG8gZXhwb3J0IGRpciAtLT4KLQk8dGFyZ2V0IG5hbWU9ImV4cG9ydCIgZGVwZW5kcz0iaW5pdCI+Ci0JCTxta2RpciBkaXI9IiR7ZGVzdGRpcn0iIC8+Ci0JCTxkZWxldGUgZGlyPSIke2Rlc3R9IiAvPgotCQk8bWtkaXIgZGlyPSIke2Rlc3R9IiAvPgotCQk8ZGVsZXRlIGRpcj0iJHtkZXN0fS9saWIiLz4KLQkJPG1rZGlyIGRpcj0iJHtkZXN0fS9saWIiLz4KLQkJPGphciBqYXJmaWxlPSIke2Rlc3R9L2FudHN1cHBvcnQuamFyIj4KLQkJCTxmaWxlc2V0IGRpcj0iYmluIj4KLQkJCQk8ZXhjbHVkZSBuYW1lPSJvcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvY29yZS9hbnQvKiIvPgotCQkJPC9maWxlc2V0PgotCQk8L2phcj4KLQkJPCEtLSBDcmVhdGUgdGhlIHNvdXJjZSB6aXAgLS0+Ci0JCTx6aXAgemlwZmlsZT0iJHtkZXN0fS9hbnRzdXBwb3J0c3JjLnppcCI+Ci0JCQk8ZmlsZXNldCBkaXI9InNyYyIvPgotCQk8L3ppcD4KLQkJPGNvcHkgZmlsZT0icGx1Z2luLnhtbCIgdG9kaXI9IiR7ZGVzdH0iLz4KLQkJPGNvcHkgZmlsZT0icGx1Z2luLnByb3BlcnRpZXMiIHRvZGlyPSIke2Rlc3R9Ii8+Ci0JCTxjb3B5IGZpbGU9Ii5jbGFzc3BhdGgiIHRvZGlyPSIke2Rlc3R9Ii8+Ci0JCTxjb3B5IGZpbGU9Ii5vcHRpb25zIiB0b2Rpcj0iJHtkZXN0fSIvPgotCQk8YW50IGFudGZpbGU9InNjcmlwdHMvYnVpbGRFeHRyYUpBUi54bWwiIHRhcmdldD0iYnVpbGQiLz4KLQkJPGNvcHkgZmlsZT0ibGliL2FudHN1cHBvcnRsaWIuamFyIiB0b2Rpcj0iJHtkZXN0fS9saWIiLz4KLQk8L3RhcmdldD4KLQkKLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zY3JpcHRzL3VwZGF0ZVRhcmdldC54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc2NyaXB0cy91cGRhdGVUYXJnZXQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWU0YWE4Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zY3JpcHRzL3VwZGF0ZVRhcmdldC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi08IS0tCi0JRm9yIHVzZSBpbiBkZXZlbG9wbWVudCBvZiB0aGUgQW50IGNvcmUgcGx1Z2luIAotCVRoaXMgc2NyaXB0IGNhbiBiZSB1c2VkIHRvIHVwZGF0ZSBhIHRhcmdldCBmb3IgdGVzdGluZy9kZWJ1Z2dpbmcKLQlFeHBvcnQgYSBqYXIgb2YgLmNsYXNzIGZpbGVzIGZvciB0aGUgb3JnLmVjbGlwc2UuYW50LmNvcmUgRWNsaXBzZSBwbHVnaW4KLSAgICBhbG9uZyB3aXRoIG90aGVyIGltcG9ydGFudCBwbHVnaW4gZmlsZXMgdG8gdGhlICJwbHVnaW4tZXhwb3J0IiBzdWJkaXJlY3RvcnkKLSAgICBvZiB0aGUgdGFyZ2V0IEVjbGlwc2UgaW5zdGFsbGF0aW9uCi0JQXMgd2VsbCB0aGUgZXhwb3J0IG9mIHRoZSBwbHVnaW4gaXMgY29waWVkIHRvIGEgdGFyZ2V0IGluc3RhbGxhdGlvbi4KLSAtLT4KLTxwcm9qZWN0IG5hbWU9IlVwZGF0ZSB0YXJnZXQiIGRlZmF1bHQ9ImV4cG9ydCIgYmFzZWRpcj0iLi4iPgotCi0JPCEtLSBTZXQgdGhlIHRpbWVzdGFtcCBhbmQgaW1wb3J0YW50IHByb3BlcnRpZXMgLS0+Ci0JPHRhcmdldCBuYW1lPSJpbml0Ij4KLQkJPHRzdGFtcC8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib290Y2xhc3NwYXRoIiB2YWx1ZT0iIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJidWlsZC5jb21waWxlciIgdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLkpEVENvbXBpbGVyQWRhcHRlciIvPgotCQk8cHJvcGVydHkgbmFtZT0iZGVzdGRpciIgdmFsdWU9Ii4uLy4uL3BsdWdpbi1leHBvcnQiIC8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW5OYW1lIiB2YWx1ZT0gIm9yZy5lY2xpcHNlLmFudC5jb3JlXzIuMS4wIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJkZXN0QmluIiAgdmFsdWU9IiR7ZGVzdGRpcn0vJHtwbHVnaW5OYW1lfSIgLz4KLQkJPHByb3BlcnR5IG5hbWU9ImRlc3RTcmMiICB2YWx1ZT0iJHtkZXN0ZGlyfS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5zb3VyY2Uvc3JjL29yZy5lY2xpcHNlLmFudC5jb3JlXzIuMS4wIiAvPgotCQk8cHJvcGVydHkgbmFtZT0idGVtcC5mb2xkZXIiIHZhbHVlPSIke2Rlc3RkaXJ9L3RlbXAuZm9sZGVyIi8+Ci0KLQkJPHByb3BlcnR5IG5hbWU9ImN1cnJlbnRCdWlsZCIgdmFsdWU9Ii4uLy4uL0RlYnVnZ2VyL0FudC9lY2xpcHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJjdXJyZW50QnVpbGRQbHVnaW5zIiB2YWx1ZT0iJHtjdXJyZW50QnVpbGR9L3BsdWdpbnMvJHtwbHVnaW5OYW1lfSIvPgotCTwvdGFyZ2V0PgotCi0JPCEtLSBDcmVhdGUgdGhlIGphciBvZiAuY2xhc3MgZmlsZXMsIGFuZCBjb3B5IG90aGVyIGltcG9ydGFudCBmaWxlcyB0byBleHBvcnQgZGlyIC0tPgotCTx0YXJnZXQgbmFtZT0iZXhwb3J0IiBkZXBlbmRzPSJpbml0Ij4KLQkJPG1rZGlyIGRpcj0iJHtkZXN0ZGlyfSIgLz4KLQkJPGRlbGV0ZSBkaXI9IiR7ZGVzdEJpbn0iIC8+Ci0JCTxta2RpciBkaXI9IiR7ZGVzdEJpbn0iIC8+Ci0JCTxkZWxldGUgZGlyPSIke2Rlc3RTcmN9IiAvPgotCQk8bWtkaXIgZGlyPSIke2Rlc3RTcmN9IiAvPgotCQk8ZGVsZXRlIGRpcj0iJHtkZXN0QmlufS9saWIiIC8+Ci0JCTxqYXIgCi0JCQlqYXJmaWxlPSIke2Rlc3RCaW59L2FudHN1cHBvcnQuamFyIgotCQkJYmFzZWRpcj0iYmluIgotCQkJZXhjbHVkZXM9ImJpbi9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvY29yZS9hbnQiCi0JCS8+Ci0JCTwhLS0gQ3JlYXRlIHRoZSBzb3VyY2UgemlwIC0tPgotCQk8emlwIHppcGZpbGU9IiR7ZGVzdFNyY30vYW50c3VwcHBvcnRzcmMuemlwIj4KLQkJCTxmaWxlc2V0IGRpcj0ic3JjIi8+Ci0JCTwvemlwPgotCQk8Y29weSBmaWxlPSJwbHVnaW4ueG1sIiB0b2Rpcj0iJHtkZXN0QmlufSIvPgotCQk8Y29weSBmaWxlPSJwbHVnaW4ucHJvcGVydGllcyIgdG9kaXI9IiR7ZGVzdEJpbn0iLz4KLQkJPGNvcHkgZmlsZT0iYWJvdXQuaHRtbCIgdG9kaXI9IiR7ZGVzdEJpbn0iLz4KLQkJPGNvcHkgZmlsZT0iLmNsYXNzcGF0aCIgdG9kaXI9IiR7ZGVzdEJpbn0iLz4KLQkJPGNvcHkgZmlsZT0iLm9wdGlvbnMiIHRvZGlyPSIke2Rlc3RCaW59Ii8+Ci0JCQotCQk8ZGVsZXRlIGRpcj0iJHt0ZW1wLmZvbGRlcn0vbGliL2FudHN1cHBvcnRsaWIuamFyLmJpbiIvPgotCQk8bWtkaXIgZGlyPSIke3RlbXAuZm9sZGVyfS9saWIvYW50c3VwcG9ydGxpYi5qYXIuYmluIi8+Ci0JCTwhLS0gY29tcGlsZSB0aGUgc291cmNlIGNvZGUgLS0+Ci0JCTxqYXZhYyB0YXJnZXQ9IjEuMyIgc291cmNlPSIxLjMiIGRlc3RkaXI9IiR7dGVtcC5mb2xkZXJ9L2xpYi9hbnRzdXBwb3J0bGliLmphci5iaW4iIGZhaWxvbmVycm9yPSJmYWxzZSIgdmVyYm9zZT0iZmFsc2UiIGRlYnVnPSJvbiIgaW5jbHVkZUFudFJ1bnRpbWU9Im5vIiBib290Y2xhc3NwYXRoPSIke2Jvb3RjbGFzc3BhdGh9IiBjbGFzc3BhdGg9IiR7YmFzZWRpcn0vLi4vb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL3J1bnRpbWUuamFyOyR7YmFzZWRpcn0vLi4vb3JnLmFwYWNoZS5hbnQvYW50Lmphcjske2Jhc2VkaXJ9Ly4uL29yZy5hcGFjaGUueGVyY2VzL3hlcmNlc0ltcGwuamFyOyR7YmFzZWRpcn0vLi4vb3JnLmFwYWNoZS54ZXJjZXMveG1sUGFyc2VyQVBJcy5qYXI7JHtiYXNlZGlyfS9iaW47JHtiYXNlZGlyfS8uLi9vcmcuZWNsaXBzZS5jb3JlLmJvb3QvYm9vdC5qYXI7Ij4KLQkJCTxzcmMgcGF0aD0ic3JjX2FudC8iLz4KLQkJPC9qYXZhYz4KLQkJPCEtLSBjb3B5IG5lY2Vzc2FyeSByZXNvdXJjZXMgLS0+Ci0JCTxjb3B5IHRvZGlyPSIke3RlbXAuZm9sZGVyfS9saWIvYW50c3VwcG9ydGxpYi5qYXIuYmluIj4KLQkJCTxmaWxlc2V0IGRpcj0ic3JjX2FudC8iIGV4Y2x1ZGVzPSIqKi8qLmphdmEiLz4KLQkJPC9jb3B5PgotCQk8bWtkaXIgZGlyPSIke2Rlc3RCaW59L2xpYiIvPgotCQk8amFyIGphcmZpbGU9IiR7ZGVzdEJpbn0vbGliL2FudHN1cHBvcnRsaWIuamFyIiBiYXNlZGlyPSIke3RlbXAuZm9sZGVyfS9saWIvYW50c3VwcG9ydGxpYi5qYXIuYmluIi8+Ci0JCTxkZWxldGUgZGlyPSIke3RlbXAuZm9sZGVyfSIvPgotCQkKLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9ImNvcHkiIGRlcGVuZHM9ImluaXQiPgotCQk8Y29weSB0b2Rpcj0iJHtjdXJyZW50QnVpbGRQbHVnaW5zfSI+Ci0JCQk8ZmlsZXNldCBkaXI9IiR7ZGVzdEJpbn0iLz4KLQkJPC9jb3B5PgotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9hbnQvY29yZS9BbnRDb3JlUGx1Z2luLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc3JjL29yZy9lY2xpcHNlL2FudC9jb3JlL0FudENvcmVQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM5NmVmMC4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc3JjL29yZy9lY2xpcHNlL2FudC9jb3JlL0FudENvcmVQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5jb3JlOwotCi0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5jb3JlLkFudENsYXNzTG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotCi0vKioKLSAqIFRoZSBwbHVnLWluIHJ1bnRpbWUgY2xhc3MgZm9yIHRoZSBBbnQgQ29yZSBwbHVnLWluLgotICovCi1wdWJsaWMgY2xhc3MgQW50Q29yZVBsdWdpbiBleHRlbmRzIFBsdWdpbiB7Ci0KLQkvKioKLQkgKiBTdGF0dXMgY29kZSBpbmRpY2F0aW5nIGFuIHVuZXhwZWN0ZWQgaW50ZXJuYWwgZXJyb3IuCi0JICogQHNpbmNlIDIuMQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkFMX0VSUk9SID0gMTIwOwkJCi0JCi0JLyoqCi0JICogVGhlIHNpbmdsZSBpbnN0YW5jZSBvZiB0aGlzIHBsdWctaW4gcnVudGltZSBjbGFzcy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBBbnRDb3JlUGx1Z2luIHBsdWdpbjsKLQotCS8qKgotCSAqIFRoZSBwcmVmZXJlbmNlcyBjbGFzcyBmb3IgdGhpcyBwbHVnaW4uCi0JICovCi0JcHJpdmF0ZSBBbnRDb3JlUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXM7Ci0KLQkvKioKLQkgKiBVbmlxdWUgaWRlbnRpZmllciBjb25zdGFudCAodmFsdWUgPGNvZGU+Im9yZy5lY2xpcHNlLmFudC5jb3JlIjwvY29kZT4pCi0JICogZm9yIHRoZSBBbnQgQ29yZSBwbHVnLWluLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBJX0FOVENPUkUgPSAib3JnLmVjbGlwc2UuYW50LmNvcmUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTaW1wbGUgaWRlbnRpZmllciBjb25zdGFudCAodmFsdWUgPGNvZGU+ImFudFRhc2tzIjwvY29kZT4pCi0JICogZm9yIHRoZSBBbnQgdGFza3MgZXh0ZW5zaW9uIHBvaW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBUX1RBU0tTID0gImFudFRhc2tzIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogU2ltcGxlIGlkZW50aWZpZXIgY29uc3RhbnQgKHZhbHVlIDxjb2RlPiJleHRyYUNsYXNzcGF0aEVudHJpZXMiPC9jb2RlPikKLQkgKiBmb3IgdGhlIGV4dHJhIGNsYXNzcGF0aCBlbnRyaWVzIGV4dGVuc2lvbiBwb2ludC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQVF9FWFRSQV9DTEFTU1BBVEggPSAiZXh0cmFDbGFzc3BhdGhFbnRyaWVzIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogU2ltcGxlIGlkZW50aWZpZXIgY29uc3RhbnQgKHZhbHVlIDxjb2RlPiJhbnRUeXBlcyI8L2NvZGU+KQotCSAqIGZvciB0aGUgQW50IHR5cGVzIGV4dGVuc2lvbiBwb2ludC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQVF9UWVBFUyA9ICJhbnRUeXBlcyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFNpbXBsZSBpZGVudGlmaWVyIGNvbnN0YW50ICh2YWx1ZSA8Y29kZT4iY2xhc3MiPC9jb2RlPikKLQkgKiBvZiBhIHRhZyB0aGF0IGFwcGVhcnMgaW4gQW50IGV4dGVuc2lvbnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTaW1wbGUgaWRlbnRpZmllciBjb25zdGFudCAodmFsdWUgPGNvZGU+Im5hbWUiPC9jb2RlPikKLQkgKiBvZiBhIHRhZyB0aGF0IGFwcGVhcnMgaW4gQW50IGV4dGVuc2lvbnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogU2ltcGxlIGlkZW50aWZpZXIgY29uc3RhbnQgKHZhbHVlIDxjb2RlPiJsaWJyYXJ5IjwvY29kZT4pCi0JICogb2YgYSB0YWcgdGhhdCBhcHBlYXJzIGluIEFudCBleHRlbnNpb25zLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJQlJBUlkgPSAibGlicmFyeSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBTaW1wbGUgaWRlbnRpZmllciBjb25zdGFudCAodmFsdWUgPGNvZGU+ImhlYWRsZXNzIjwvY29kZT4pIG9mIGEgdGFnCi0JICogdGhhdCBhcHBlYXJzIGluIEFudCBleHRlbnNpb25zLgotCSAqIEBzaW5jZSAyLjEKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFETEVTUyA9ICJoZWFkbGVzcyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEtleSB0byBhY2Nlc3MgdGhlIDxjb2RlPklQcm9ncmVzc01vbml0b3I8L2NvZGU+IHJlZmVyZW5jZS4gV2hlbiBhCi0JICogcHJvZ3Jlc3MgbW9uaXRvciBpcyBwYXNzZWQgdG8gdGhlIDxjb2RlPkFudFJ1bm5lci5ydW4oSVByb2dyZXNzTW9uaXRvcik8L2NvZGU+Ci0JICogbWV0aG9kLCB0aGUgb2JqZWN0IGlzIGF2YWlsYWJsZSBhcyBhIHJlZmVyZW5jZSBmb3IgdGhlIGN1cnJlbnQKLQkgKiBBbnQgcHJvamVjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFX1BST0dSRVNTX01PTklUT1IgPSAiZWNsaXBzZS5wcm9ncmVzcy5tb25pdG9yIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFN0YXR1cyBjb2RlIGluZGljYXRpbmcgYW4gZXJyb3Igb2NjdXJyZWQgcnVubmluZyBhIGJ1aWxkLgotCSAqIEBzaW5jZSAyLjEKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9SVU5OSU5HX0JVSUxEID0gMTsKLQkKLQkvKioKLQkgKiBTdGF0dXMgY29kZSBpbmRpY2F0aW5nIGFuIGVycm9yIG9jY3VycmVkIGR1ZSB0byBhIG1hbGZvcm1lZCBVUkwuCi0JICogQHNpbmNlIDIuMQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX01BTEZPUk1FRF9VUkwgPSAyOwotCQotCS8qKgotCSAqIFN0YXR1cyBjb2RlIGluZGljYXRpbmcgYW4gZXJyb3Igb2NjdXJyZWQgYXMgYSBsaWJyYXJ5IHdhcyBub3Qgc3BlY2lmaWVkCi0JICogQHNpbmNlIDIuMQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX0xJQlJBUllfTk9UX1NQRUNJRklFRCA9IDM7Ci0KLQkvKiogCi0JICogQ29uc3RydWN0cyBhbiBpbnN0YW5jZSBvZiB0aGlzIHBsdWctaW4gcnVudGltZSBjbGFzcy4KLQkgKiA8cD4KLQkgKiBBbiBpbnN0YW5jZSBvZiB0aGlzIHBsdWctaW4gcnVudGltZSBjbGFzcyBpcyBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgCi0JICogd2hlbiB0aGUgZmFjaWxpdGllcyBwcm92aWRlZCBieSB0aGUgQW50IENvcmUgcGx1Zy1pbiBhcmUgcmVxdWlyZWQuCi0JICogPGI+Q2xpZW50cyBtdXN0IG5ldmVyIGV4cGxpY2l0bHkgaW5zdGFudGlhdGUgYSBwbHVnLWluIHJ1bnRpbWUgY2xhc3MuPC9iPgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcGx1Z2luRGVzY3JpcHRvciB0aGUgcGx1Zy1pbiBkZXNjcmlwdG9yIGZvciB0aGUKLQkgKiAgIEFudCBDb3JlIHBsdWctaW4KLQkgKi8KLQlwdWJsaWMgQW50Q29yZVBsdWdpbihJUGx1Z2luRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCXN1cGVyKGRlc2NyaXB0b3IpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgUGx1Z2luI3NodXRkb3duKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzaHV0ZG93bigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKHByZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlwcmVmZXJlbmNlcy51cGRhdGVQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlzYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBHaXZlbiBhbiBleHRlbnNpb24gcG9pbnQgbmFtZSwgZXh0cmFjdCBpdHMgZXh0ZW5zaW9ucyBhbmQgcmV0dXJuIHRoZW0KLQkgKiBhcyBhIExpc3QuCi0JICovCi0JcHJpdmF0ZSBMaXN0IGV4dHJhY3RFeHRlbnNpb25zKFN0cmluZyBwb2ludCkgewotCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSBnZXREZXNjcmlwdG9yKCkuZ2V0RXh0ZW5zaW9uUG9pbnQocG9pbnQpOwotCQlpZiAoZXh0ZW5zaW9uUG9pbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZXh0ZW5zaW9ucyA9IGV4dGVuc2lvblBvaW50LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQlyZXR1cm4gQXJyYXlzLmFzTGlzdChleHRlbnNpb25zKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhpcyBwbHVnLWluJ3MgcHJlZmVyZW5jZXMuCi0JICogCi0JICogQHJldHVybiB0aGUgQW50IGNvcmUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgcHJlZmVyZW5jZXMgZm9yIHRoaXMgcGx1Zy1pbi4KLQkgKi8KLQlwdWJsaWMgQW50Q29yZVByZWZlcmVuY2VzIGdldFByZWZlcmVuY2VzKCkgewotCQlpZiAocHJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJcHJlZmVyZW5jZXMgPSBuZXcgQW50Q29yZVByZWZlcmVuY2VzKGV4dHJhY3RFeHRlbnNpb25zKFBUX1RBU0tTKSwgZXh0cmFjdEV4dGVuc2lvbnMoUFRfRVhUUkFfQ0xBU1NQQVRIKSwgZXh0cmFjdEV4dGVuc2lvbnMoUFRfVFlQRVMpLCBmYWxzZSk7Ci0JCX0KLQkJcmV0dXJuIHByZWZlcmVuY2VzOwotCX0KLQkKLQkvKioKLQkgKiBTZXQgdGhpcyBwbHVnLWluJ3MgcHJlZmVyZW5jZXMgZm9yIHJ1bm5pbmcgaGVhZGxlc3MuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0UnVubmluZ0hlYWRsZXNzKCkgewotCQlwcmVmZXJlbmNlcyA9IG5ldyBBbnRDb3JlUHJlZmVyZW5jZXMoZXh0cmFjdEV4dGVuc2lvbnMoUFRfVEFTS1MpLCBleHRyYWN0RXh0ZW5zaW9ucyhQVF9FWFRSQV9DTEFTU1BBVEgpLCBleHRyYWN0RXh0ZW5zaW9ucyhQVF9UWVBFUyksIHRydWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhpcyBwbHVnLWluIGluc3RhbmNlLgotCSAqCi0JICogQHJldHVybiB0aGUgc2luZ2xlIGluc3RhbmNlIG9mIHRoaXMgcGx1Zy1pbiBydW50aW1lIGNsYXNzCi0JICovCi0JcHVibGljIHN0YXRpYyBBbnRDb3JlUGx1Z2luIGdldFBsdWdpbigpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBjbGFzcyBsb2FkZXIgdG8gdXNlIHdoZW4gZXhlY3V0aW5nIEFudCBidWlsZHMuCi0JICogCi0JICogQHJldHVybiB0aGUgbmV3IGNsYXNzIGxvYWRlcgotCSAqLwotCXByb3RlY3RlZCBDbGFzc0xvYWRlciBnZXROZXdDbGFzc0xvYWRlcigpIHsKLQkJQW50Q29yZVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gZ2V0UHJlZmVyZW5jZXMoKTsKLQkJVVJMW10gdXJscyA9IHByZWZlcmVuY2VzLmdldFVSTHMoKTsKLQkJQ2xhc3NMb2FkZXJbXSBwbHVnaW5Mb2FkZXJzID0gcHJlZmVyZW5jZXMuZ2V0UGx1Z2luQ2xhc3NMb2FkZXJzKCk7Ci0JCXJldHVybiBuZXcgQW50Q2xhc3NMb2FkZXIodXJscywgcGx1Z2luTG9hZGVycyk7Ci0JfQotCQotCS8qKgotCSAqIExvZ3MgdGhlIHNwZWNpZmllZCB0aHJvd2FibGUgd2l0aCB0aGlzIHBsdWctaW4ncyBsb2cuCi0JICogCi0JICogQHBhcmFtIHQgdGhyb3dhYmxlIHRvIGxvZyAKLQkgKiBAc2luY2UgMi4xCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhUaHJvd2FibGUgdCkgewotCQlJU3RhdHVzIHN0YXR1cz0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQSV9BTlRDT1JFLCBJTlRFUk5BTF9FUlJPUiwgIkVycm9yIGxvZ2dlZCBmcm9tIEFudCBDb3JlOiAiLCB0KTsgLy8kTk9OLU5MUy0xJAotCQlnZXRQbHVnaW4oKS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc3JjL29yZy9lY2xpcHNlL2FudC9jb3JlL0FudENvcmVQcmVmZXJlbmNlcy5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9hbnQvY29yZS9BbnRDb3JlUHJlZmVyZW5jZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY5NWIyNS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc3JjL29yZy9lY2xpcHNlL2FudC9jb3JlL0FudENvcmVQcmVmZXJlbmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmNvcmU7Ci0KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmNvcmUuSUFudENvcmVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmNvcmUuSW50ZXJuYWxDb3JlQW50TWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ib290LkJvb3RMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5wbHVnaW5zLlBsdWdpbkNsYXNzTG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotCi0KLS8qKgotICogUmVwcmVzZW50cyB0aGUgQW50IENvcmUgcGx1Zy1pbidzIHByZWZlcmVuY2VzIHByb3ZpZGluZyB1dGlsaXRpZXMgZm9yCi0gKiBleHRyYWN0aW5nLCBjaGFuZ2luZyBhbmQgdXBkYXRpbmcgdGhlIHVuZGVybHlpbmcgcHJlZmVyZW5jZXMuCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBjbGFzcyBBbnRDb3JlUHJlZmVyZW5jZXMgaW1wbGVtZW50cyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXMuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgewotCi0JcHJvdGVjdGVkIExpc3QgZGVmYXVsdFRhc2tzOwotCXByb3RlY3RlZCBMaXN0IGRlZmF1bHRUeXBlczsKLQlwcm90ZWN0ZWQgTGlzdCBleHRyYUNsYXNzcGF0aFVSTHM7Ci0JcHJvdGVjdGVkIFVSTFtdIGRlZmF1bHRBbnRVUkxzOwotCQotCXByb3RlY3RlZCBUYXNrW10gY3VzdG9tVGFza3M7Ci0JcHJvdGVjdGVkIFR5cGVbXSBjdXN0b21UeXBlczsKLQlwcm90ZWN0ZWQgVVJMW10gYW50VVJMczsKLQlwcm90ZWN0ZWQgVVJMW10gY3VzdG9tVVJMczsKLQlwcm90ZWN0ZWQgUHJvcGVydHlbXSBjdXN0b21Qcm9wZXJ0aWVzOwotCXByb3RlY3RlZCBTdHJpbmdbXSBjdXN0b21Qcm9wZXJ0eUZpbGVzOwotCQotCXByb3RlY3RlZCBMaXN0IHBsdWdpbkNsYXNzTG9hZGVyczsKLQkKLQlwcml2YXRlIENsYXNzTG9hZGVyW10gb3JkZXJlZFBsdWdpbkNsYXNzTG9hZGVyczsKLQkKLQlwcml2YXRlIFN0cmluZyBhbnRIb21lOwotCQotCXByaXZhdGUgYm9vbGVhbiBydW5uaW5nSGVhZGxlc3M9IGZhbHNlOwotCi0JcHJvdGVjdGVkIEFudENvcmVQcmVmZXJlbmNlcyhMaXN0IGRlZmF1bHRUYXNrcywgTGlzdCBkZWZhdWx0RXh0cmFDbGFzc3BhdGgsIExpc3QgZGVmYXVsdFR5cGVzLCBib29sZWFuIGhlYWRsZXNzKSB7Ci0JCXJ1bm5pbmdIZWFkbGVzcz0gaGVhZGxlc3M7Ci0JCWluaXRpYWxpemVQbHVnaW5DbGFzc0xvYWRlcnMoKTsKLQkJZXh0cmFDbGFzc3BhdGhVUkxzID0gbmV3IEFycmF5TGlzdCgyMCk7Ci0JCXRoaXMuZGVmYXVsdFRhc2tzID0gY29tcHV0ZURlZmF1bHRUYXNrcyhkZWZhdWx0VGFza3MpOwotCQl0aGlzLmRlZmF1bHRUeXBlcyA9IGNvbXB1dGVEZWZhdWx0VHlwZXMoZGVmYXVsdFR5cGVzKTsKLQkJY29tcHV0ZURlZmF1bHRFeHRyYUNsYXNzcGF0aEVudHJpZXMoZGVmYXVsdEV4dHJhQ2xhc3NwYXRoKTsKLQkJcmVzdG9yZUN1c3RvbU9iamVjdHMoKTsKLQl9Ci0JCi0JLyoqCi0JICogV2hlbiBhIHByZWZlcmVuY2UgY2hhbmdlcywgdXBkYXRlIHRoZSBpbi1tZW1vcnkgY2FjaGUgb2YgdGhlIHByZWZlcmVuY2UuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXMuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIjcHJvcGVydHlDaGFuZ2Uob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzLlByb3BlcnR5Q2hhbmdlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJlZmVyZW5jZXMuUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlQcmVmZXJlbmNlcyBwcmVmcyA9IEFudENvcmVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJU3RyaW5nIHByb3BlcnR5PSBldmVudC5nZXRQcm9wZXJ0eSgpOwotCQlpZiAocHJvcGVydHkuZXF1YWxzKElBbnRDb3JlQ29uc3RhbnRzLlBSRUZFUkVOQ0VfVEFTS1MpIHx8IHByb3BlcnR5LnN0YXJ0c1dpdGgoSUFudENvcmVDb25zdGFudHMuUFJFRklYX1RBU0spKSB7Ci0JCQlyZXN0b3JlVGFza3MocHJlZnMpOwotCQl9IGVsc2UgaWYgKHByb3BlcnR5LmVxdWFscyhJQW50Q29yZUNvbnN0YW50cy5QUkVGRVJFTkNFX1RZUEVTKSB8fCBwcm9wZXJ0eS5zdGFydHNXaXRoKElBbnRDb3JlQ29uc3RhbnRzLlBSRUZJWF9UWVBFKSkgewotCQkJcmVzdG9yZVR5cGVzKHByZWZzKTsKLQkJfSBlbHNlIGlmIChwcm9wZXJ0eS5lcXVhbHMoSUFudENvcmVDb25zdGFudHMuUFJFRkVSRU5DRV9BTlRfVVJMUykpIHsKLQkJCXJlc3RvcmVBbnRVUkxzKHByZWZzKTsKLQkJfSBlbHNlIGlmIChwcm9wZXJ0eS5lcXVhbHMoSUFudENvcmVDb25zdGFudHMuUFJFRkVSRU5DRV9VUkxTKSkgewotCQkJcmVzdG9yZUN1c3RvbVVSTHMocHJlZnMpOwotCQl9IGVsc2UgaWYgKHByb3BlcnR5LmVxdWFscyhJQW50Q29yZUNvbnN0YW50cy5QUkVGRVJFTkNFX0FOVF9IT01FKSkgewotCQkJcmVzdG9yZUFudEhvbWUocHJlZnMpOwotCQl9IGVsc2UgaWYgKHByb3BlcnR5LmVxdWFscyhJQW50Q29yZUNvbnN0YW50cy5QUkVGRVJFTkNFX1BST1BFUlRJRVMpIHx8IHByb3BlcnR5LnN0YXJ0c1dpdGgoSUFudENvcmVDb25zdGFudHMuUFJFRklYX1BST1BFUlRZKSkgewotCQkJcmVzdG9yZUN1c3RvbVByb3BlcnRpZXMocHJlZnMpOwotCQl9IGVsc2UgaWYgKHByb3BlcnR5LmVxdWFscyhJQW50Q29yZUNvbnN0YW50cy5QUkVGRVJFTkNFX1BST1BFUlRZX0ZJTEVTKSkgewotCQkJcmVzdG9yZUN1c3RvbVByb3BlcnR5RmlsZXMocHJlZnMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVzdG9yZXMgdGhlIGluLW1lbW9yeSBtb2RlbCBvZiB0aGUgcHJlZmVyZW5jZXMgZnJvbSB0aGUgcHJlZmVyZW5jZSBzdG9yZQotCSAqLwotCXByaXZhdGUgdm9pZCByZXN0b3JlQ3VzdG9tT2JqZWN0cygpIHsKLQkJUHJlZmVyZW5jZXMgcHJlZnMgPSBBbnRDb3JlUGx1Z2luLmdldFBsdWdpbigpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCXJlc3RvcmVUYXNrcyhwcmVmcyk7Ci0JCXJlc3RvcmVUeXBlcyhwcmVmcyk7Ci0JCXJlc3RvcmVBbnRVUkxzKHByZWZzKTsKLQkJcmVzdG9yZUN1c3RvbVVSTHMocHJlZnMpOwotCQlyZXN0b3JlQW50SG9tZShwcmVmcyk7Ci0JCXJlc3RvcmVDdXN0b21Qcm9wZXJ0aWVzKHByZWZzKTsKLQkJcmVzdG9yZUN1c3RvbVByb3BlcnR5RmlsZXMocHJlZnMpOwotCQlwcmVmcy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcmVzdG9yZVRhc2tzKFByZWZlcmVuY2VzIHByZWZzKSB7Ci0JCSBTdHJpbmcgdGFza3MgPSBwcmVmcy5nZXRTdHJpbmcoSUFudENvcmVDb25zdGFudHMuUFJFRkVSRU5DRV9UQVNLUyk7Ci0JCSBpZiAodGFza3MuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkgY3VzdG9tVGFza3MgPSBuZXcgVGFza1swXTsKLQkJIH0gZWxzZSB7Ci0JCQkgY3VzdG9tVGFza3MgPSBleHRyYWN0VGFza3MocHJlZnMsIGdldEFycmF5RnJvbVN0cmluZyh0YXNrcykpOwotCQkgfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgcmVzdG9yZVR5cGVzKFByZWZlcmVuY2VzIHByZWZzKSB7Ci0JCVN0cmluZyB0eXBlcyA9IHByZWZzLmdldFN0cmluZyhJQW50Q29yZUNvbnN0YW50cy5QUkVGRVJFTkNFX1RZUEVTKTsKLQkJaWYgKHR5cGVzLmVxdWFscygiIikpIHsvLyROT04tTkxTLTEkCi0JCQljdXN0b21UeXBlcyA9IG5ldyBUeXBlWzBdOwotCQl9IGVsc2UgewotCQkJY3VzdG9tVHlwZXMgPSBleHRyYWN0VHlwZXMocHJlZnMsIGdldEFycmF5RnJvbVN0cmluZyh0eXBlcykpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCByZXN0b3JlQW50VVJMcyhQcmVmZXJlbmNlcyBwcmVmcykgewotCQlTdHJpbmcgdXJscyA9IHByZWZzLmdldFN0cmluZyhJQW50Q29yZUNvbnN0YW50cy5QUkVGRVJFTkNFX0FOVF9VUkxTKTsKLQkJaWYgKHVybHMuZXF1YWxzKCIiKSkgey8vJE5PTi1OTFMtMSQKLQkJCWFudFVSTHMgPSBnZXREZWZhdWx0QW50VVJMcygpOwotCQl9IGVsc2UgewotCQkJYW50VVJMcyA9IGV4dHJhY3RVUkxzKGdldEFycmF5RnJvbVN0cmluZyh1cmxzKSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHJlc3RvcmVDdXN0b21VUkxzKFByZWZlcmVuY2VzIHByZWZzKSB7Ci0JCVN0cmluZyB1cmxzID0gcHJlZnMuZ2V0U3RyaW5nKElBbnRDb3JlQ29uc3RhbnRzLlBSRUZFUkVOQ0VfVVJMUyk7Ci0JCWlmICh1cmxzLmVxdWFscygiIikpIHsvLyROT04tTkxTLTEkCi0JCQljdXN0b21VUkxzID0gbmV3IFVSTFswXTsKLQkJfSBlbHNlIHsKLQkJCWN1c3RvbVVSTHMgPSBleHRyYWN0VVJMcyhnZXRBcnJheUZyb21TdHJpbmcodXJscykpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCByZXN0b3JlQW50SG9tZShQcmVmZXJlbmNlcyBwcmVmcykgewotCQlhbnRIb21lPSBwcmVmcy5nZXRTdHJpbmcoSUFudENvcmVDb25zdGFudHMuUFJFRkVSRU5DRV9BTlRfSE9NRSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCByZXN0b3JlQ3VzdG9tUHJvcGVydGllcyhQcmVmZXJlbmNlcyBwcmVmcykgewotCQlTdHJpbmcgcHJvcGVydGllcyA9IHByZWZzLmdldFN0cmluZyhJQW50Q29yZUNvbnN0YW50cy5QUkVGRVJFTkNFX1BST1BFUlRJRVMpOwotCQlpZiAocHJvcGVydGllcy5lcXVhbHMoIiIpKSB7Ly8kTk9OLU5MUy0xJAotCQkJY3VzdG9tUHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0eVswXTsKLQkJfSBlbHNlIHsKLQkJCWN1c3RvbVByb3BlcnRpZXMgPSBleHRyYWN0UHJvcGVydGllcyhwcmVmcywgZ2V0QXJyYXlGcm9tU3RyaW5nKHByb3BlcnRpZXMpKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgcmVzdG9yZUN1c3RvbVByb3BlcnR5RmlsZXMoUHJlZmVyZW5jZXMgcHJlZnMpIHsKLQkJU3RyaW5nIHByb3BlcnR5RmlsZXM9IHByZWZzLmdldFN0cmluZyhJQW50Q29yZUNvbnN0YW50cy5QUkVGRVJFTkNFX1BST1BFUlRZX0ZJTEVTKTsKLQkJaWYgKHByb3BlcnR5RmlsZXMuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQljdXN0b21Qcm9wZXJ0eUZpbGVzPSBuZXcgU3RyaW5nWzBdOwotCQl9IGVsc2UgewotCQkJY3VzdG9tUHJvcGVydHlGaWxlcz0gZ2V0QXJyYXlGcm9tU3RyaW5nKHByb3BlcnR5RmlsZXMpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFRhc2tbXSBleHRyYWN0VGFza3MoUHJlZmVyZW5jZXMgcHJlZnMsIFN0cmluZ1tdIHRhc2tzKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCh0YXNrcy5sZW5ndGgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRhc2tzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCVN0cmluZyB0YXNrTmFtZSA9IHRhc2tzW2ldOwotCQkJCVN0cmluZ1tdIHZhbHVlcyA9IGdldEFycmF5RnJvbVN0cmluZyhwcmVmcy5nZXRTdHJpbmcoSUFudENvcmVDb25zdGFudHMuUFJFRklYX1RBU0sgKyB0YXNrTmFtZSkpOwotCQkJCWlmICh2YWx1ZXMubGVuZ3RoIDwgMikgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJVGFzayB0YXNrID0gbmV3IFRhc2soKTsKLQkJCQl0YXNrLnNldFRhc2tOYW1lKHRhc2tOYW1lKTsKLQkJCQl0YXNrLnNldENsYXNzTmFtZSh2YWx1ZXNbMF0pOwotCQkJCXRhc2suc2V0TGlicmFyeShuZXcgVVJMKHZhbHVlc1sxXSkpOwotCQkJCXJlc3VsdC5hZGQodGFzayk7Ci0JCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJCS8vIGlmIHRoZSBVUkwgZG9lcyBub3QgaGF2ZSBhIHZhbGlkIGZvcm1hdCwganVzdCBsb2cgYW5kIGlnbm9yZSB0aGUgZXhjZXB0aW9uCi0JCQkJSVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFudENvcmVQbHVnaW4uUElfQU5UQ09SRSwgQW50Q29yZVBsdWdpbi5FUlJPUl9NQUxGT1JNRURfVVJMLCBJbnRlcm5hbENvcmVBbnRNZXNzYWdlcy5nZXRTdHJpbmcoIkFudENvcmVQcmVmZXJlbmNlcy5NYWxmb3JtZWRfVVJMLl8xIiksIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJQW50Q29yZVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKFRhc2tbXSkgcmVzdWx0LnRvQXJyYXkobmV3IFRhc2tbcmVzdWx0LnNpemUoKV0pOwotCX0KLQotCXByb3RlY3RlZCBUeXBlW10gZXh0cmFjdFR5cGVzKFByZWZlcmVuY2VzIHByZWZzLCBTdHJpbmdbXSB0eXBlcykgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QodHlwZXMubGVuZ3RoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgdHlwZU5hbWUgPSB0eXBlc1tpXTsKLQkJCQlTdHJpbmdbXSB2YWx1ZXMgPSBnZXRBcnJheUZyb21TdHJpbmcocHJlZnMuZ2V0U3RyaW5nKElBbnRDb3JlQ29uc3RhbnRzLlBSRUZJWF9UWVBFICsgdHlwZU5hbWUpKTsKLQkJCQlpZiAodmFsdWVzLmxlbmd0aCA8IDIpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCVR5cGUgdHlwZSA9IG5ldyBUeXBlKCk7Ci0JCQkJdHlwZS5zZXRUeXBlTmFtZSh0eXBlTmFtZSk7Ci0JCQkJdHlwZS5zZXRDbGFzc05hbWUodmFsdWVzWzBdKTsKLQkJCQl0eXBlLnNldExpYnJhcnkobmV3IFVSTCh2YWx1ZXNbMV0pKTsKLQkJCQlyZXN1bHQuYWRkKHR5cGUpOwotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZiB0aGUgVVJMIGRvZXMgbm90IGhhdmUgYSB2YWxpZCBmb3JtYXQsIGp1c3QgbG9nIGFuZCBpZ25vcmUgdGhlIGV4Y2VwdGlvbgotCQkJCUlTdGF0dXMgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBbnRDb3JlUGx1Z2luLlBJX0FOVENPUkUsIEFudENvcmVQbHVnaW4uRVJST1JfTUFMRk9STUVEX1VSTCwgSW50ZXJuYWxDb3JlQW50TWVzc2FnZXMuZ2V0U3RyaW5nKCJBbnRDb3JlUHJlZmVyZW5jZXMuTWFsZm9ybWVkX1VSTC5fMSIpLCBlKTsgIC8vJE5PTi1OTFMtMSQKLQkJCQlBbnRDb3JlUGx1Z2luLmdldFBsdWdpbigpLmdldExvZygpLmxvZyhzdGF0dXMpOwotCQkJfQotCQl9Ci0JCXJldHVybiAoVHlwZVtdKSByZXN1bHQudG9BcnJheShuZXcgVHlwZVtyZXN1bHQuc2l6ZSgpXSk7Ci0JfQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eVtdIGV4dHJhY3RQcm9wZXJ0aWVzKFByZWZlcmVuY2VzIHByZWZzLCBTdHJpbmdbXSBwcm9wZXJ0aWVzKSB7Ci0JCVByb3BlcnR5W10gcmVzdWx0ID0gbmV3IFByb3BlcnR5W3Byb3BlcnRpZXMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gcHJvcGVydGllc1tpXTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IGdldEFycmF5RnJvbVN0cmluZyhwcmVmcy5nZXRTdHJpbmcoSUFudENvcmVDb25zdGFudHMuUFJFRklYX1BST1BFUlRZICsgcHJvcGVydHlOYW1lKSk7Ci0JCQlpZiAodmFsdWVzLmxlbmd0aCA8IDEpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCVByb3BlcnR5IHByb3BlcnR5ID0gbmV3IFByb3BlcnR5KCk7Ci0JCQlwcm9wZXJ0eS5zZXROYW1lKHByb3BlcnR5TmFtZSk7Ci0JCQlwcm9wZXJ0eS5zZXRWYWx1ZSh2YWx1ZXNbMF0pOwotCQkJcmVzdWx0W2ldPSBwcm9wZXJ0eTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBVUkxbXSBleHRyYWN0VVJMcyhTdHJpbmdbXSB1cmxzKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCh1cmxzLmxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdXJscy5sZW5ndGg7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlyZXN1bHQuYWRkKG5ldyBVUkwodXJsc1tpXSkpOwotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZiB0aGUgVVJMIGRvZXMgbm90IGhhdmUgYSB2YWxpZCBmb3JtYXQsIGp1c3QgbG9nIGFuZCBpZ25vcmUgdGhlIGV4Y2VwdGlvbgotCQkJCUlTdGF0dXMgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBbnRDb3JlUGx1Z2luLlBJX0FOVENPUkUsIEFudENvcmVQbHVnaW4uRVJST1JfTUFMRk9STUVEX1VSTCwgSW50ZXJuYWxDb3JlQW50TWVzc2FnZXMuZ2V0U3RyaW5nKCJBbnRDb3JlUHJlZmVyZW5jZXMuTWFsZm9ybWVkX1VSTC5fMSIpLCBlKTsgIC8vJE5PTi1OTFMtMSQKLQkJCQlBbnRDb3JlUGx1Z2luLmdldFBsdWdpbigpLmdldExvZygpLmxvZyhzdGF0dXMpOwotCQkJfQotCQl9Ci0JCXJldHVybiAoVVJMW10pIHJlc3VsdC50b0FycmF5KG5ldyBVUkxbcmVzdWx0LnNpemUoKV0pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFycmF5IG9mIFVSTHMgdGhhdCBpcyB0aGUgZGVmYXVsdCBzZXQgb2YgVVJMcyBkZWZpbmluZwotCSAqIHRoZSBBbnQgY2xhc3NwYXRoLgotCSAqIFRoZSBYZXJjZXMgSkFScyBhcmUgaW5jbHVkZWQgd2hlbiB0aGUgcGx1Z2luIGNsYXNzbG9hZGVyIGZvciBvcmcuZWNsaXBzZS5hbnQuY29yZQotCSAqIGlzIHNldCBhcyBvbmUgb2YgdGhlIHBsdWdpbiBjbGFzc2xvYWRlcnMgb2YgdGhlIEFudENsYXNzTG9hZGVyLgotCSAqIAotCSAqIEFudCBydW5uaW5nIHRocm91Z2ggdGhlIGNvbW1hbmQgbGluZSB0cmllcyB0byBmaW5kIHRvb2xzLmphciB0byBoZWxwIHRoZQotCSAqIHVzZXIuIFRyeSBlbXVsYXRpbmcgdGhlIHNhbWUgYmVoYXZpb3VyIGhlcmUuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IHNldCBvZiBVUkxzIGRlZmluaW5nIHRoZSBBbnQgY2xhc3NwYXRoCi0JICovCi0JcHVibGljIFVSTFtdIGdldERlZmF1bHRBbnRVUkxzKCkgewotCQlpZiAoZGVmYXVsdEFudFVSTHMgPT0gbnVsbCkgewotCQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KDMpOwotCQkJUGx1Z2luIGFudFBsdWdpbj0gUGxhdGZvcm0uZ2V0UGx1Z2luKCJvcmcuYXBhY2hlLmFudCIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoYW50UGx1Z2luICE9IG51bGwpIHsKLQkJCQlJUGx1Z2luRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gYW50UGx1Z2luLmdldERlc2NyaXB0b3IoKTsgCi0JCQkJYWRkTGlicmFyaWVzKGRlc2NyaXB0b3IsIHJlc3VsdCk7Ci0JCQl9Ci0JCQkKLQkJCVVSTCB0b29sc1VSTD0gZ2V0VG9vbHNKYXJVUkwoKTsKLQkJCWlmICh0b29sc1VSTCAhPSBudWxsKSB7Ci0JCQkJcmVzdWx0LmFkZCh0b29sc1VSTCk7Ci0JCQl9Ci0JCQlkZWZhdWx0QW50VVJMcz0gKFVSTFtdKSByZXN1bHQudG9BcnJheShuZXcgVVJMW3Jlc3VsdC5zaXplKCldKTsKLQkJfQotCQlyZXR1cm4gZGVmYXVsdEFudFVSTHM7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFycmF5IG9mIFVSTHMgdGhhdCBpcyB0aGUgc2V0IG9mIFVSTHMgZGVmaW5pbmcgdGhlIEFudAotCSAqIGNsYXNzcGF0aC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzZXQgb2YgVVJMcyBkZWZpbmluZyB0aGUgQW50IGNsYXNzcGF0aAotCSAqLwotCXB1YmxpYyBVUkxbXSBnZXRBbnRVUkxzKCkgewotCQlyZXR1cm4gYW50VVJMczsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBjb21wdXRlRGVmYXVsdFRhc2tzKExpc3QgdGFza3MpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KHRhc2tzLnNpemUoKSk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSB0YXNrcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCA9IChJQ29uZmlndXJhdGlvbkVsZW1lbnQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChydW5uaW5nSGVhZGxlc3MpIHsKLQkJCQlTdHJpbmcgaGVhZGxlc3MgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBbnRDb3JlUGx1Z2luLkhFQURMRVNTKTsKLQkJCQlpZiAoaGVhZGxlc3MgIT0gbnVsbCkgewotCQkJCQlib29sZWFuIGhlYWRsZXNzVHlwZT0gQm9vbGVhbi52YWx1ZU9mKGhlYWRsZXNzKS5ib29sZWFuVmFsdWUoKTsKLQkJCQkJaWYgKCFoZWFkbGVzc1R5cGUpIHsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJVGFzayB0YXNrID0gbmV3IFRhc2soKTsKLQkJCXRhc2suc2V0SXNEZWZhdWx0KHRydWUpOwotCQkJdGFzay5zZXRUYXNrTmFtZShlbGVtZW50LmdldEF0dHJpYnV0ZShBbnRDb3JlUGx1Z2luLk5BTUUpKTsKLQkJCXRhc2suc2V0Q2xhc3NOYW1lKGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFudENvcmVQbHVnaW4uQ0xBU1MpKTsKLQkJCVN0cmluZyBsaWJyYXJ5ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQW50Q29yZVBsdWdpbi5MSUJSQVJZKTsKLQkJCWlmIChsaWJyYXJ5ID09IG51bGwpIHsKLQkJCQlJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQW50Q29yZVBsdWdpbi5QSV9BTlRDT1JFLCBBbnRDb3JlUGx1Z2luLkVSUk9SX0xJQlJBUllfTk9UX1NQRUNJRklFRCwgTWVzc2FnZUZvcm1hdC5mb3JtYXQoSW50ZXJuYWxDb3JlQW50TWVzc2FnZXMuZ2V0U3RyaW5nKCJBbnRDb3JlUHJlZmVyZW5jZXMuTGlicmFyeV9ub3Rfc3BlY2lmaWVkX2Zvcl9fezB9XzQiKSwgbmV3IFN0cmluZ1tde3Rhc2suZ2V0VGFza05hbWUoKX0pLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJCUFudENvcmVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nKCkubG9nKHN0YXR1cyk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQkKLQkJCUlQbHVnaW5EZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBlbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldERlY2xhcmluZ1BsdWdpbkRlc2NyaXB0b3IoKTsKLQkJCXRyeSB7Ci0JCQkJVVJMIHVybCA9IFBsYXRmb3JtLmFzTG9jYWxVUkwobmV3IFVSTChkZXNjcmlwdG9yLmdldEluc3RhbGxVUkwoKSwgbGlicmFyeSkpOwotCQkJCWlmIChuZXcgRmlsZSh1cmwuZ2V0UGF0aCgpKS5leGlzdHMoKSkgewotCQkJCQlpZiAoIWV4dHJhQ2xhc3NwYXRoVVJMcy5jb250YWlucyh1cmwpKSB7Ci0JCQkJCQlleHRyYUNsYXNzcGF0aFVSTHMuYWRkKHVybCk7Ci0JCQkJCX0KLQkJCQkJcmVzdWx0LmFkZCh0YXNrKTsKLQkJCQkJYWRkUGx1Z2luQ2xhc3NMb2FkZXIoZGVzY3JpcHRvci5nZXRQbHVnaW5DbGFzc0xvYWRlcigpKTsKLQkJCQkJdGFzay5zZXRMaWJyYXJ5KHVybCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy90YXNrIHNwZWNpZmllcyBhIGxpYnJhcnkgdGhhdCBkb2VzIG5vdCBleGlzdAotCQkJCQlJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQW50Q29yZVBsdWdpbi5QSV9BTlRDT1JFLCBBbnRDb3JlUGx1Z2luLkVSUk9SX0xJQlJBUllfTk9UX1NQRUNJRklFRCwgTWVzc2FnZUZvcm1hdC5mb3JtYXQoSW50ZXJuYWxDb3JlQW50TWVzc2FnZXMuZ2V0U3RyaW5nKCJBbnRDb3JlUHJlZmVyZW5jZXMuTm9fbGlicmFyeV9mb3JfdGFzayIpLCBuZXcgU3RyaW5nW117dXJsLnRvRXh0ZXJuYWxGb3JtKCksIGRlc2NyaXB0b3IuZ2V0TGFiZWwoKX0pLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlBbnRDb3JlUGx1Z2luLmdldFBsdWdpbigpLmdldExvZygpLmxvZyhzdGF0dXMpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vIGlmIHRoZSBVUkwgZG9lcyBub3QgaGF2ZSBhIHZhbGlkIGZvcm1hdCwganVzdCBsb2cgYW5kIGlnbm9yZSB0aGUgZXhjZXB0aW9uCi0JCQkJSVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFudENvcmVQbHVnaW4uUElfQU5UQ09SRSwgQW50Q29yZVBsdWdpbi5FUlJPUl9NQUxGT1JNRURfVVJMLCBJbnRlcm5hbENvcmVBbnRNZXNzYWdlcy5nZXRTdHJpbmcoIkFudENvcmVQcmVmZXJlbmNlcy5NYWxmb3JtZWRfVVJMLl8xIiksIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJQW50Q29yZVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGNvbXB1dGVEZWZhdWx0VHlwZXMoTGlzdCB0eXBlcykgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QodHlwZXMuc2l6ZSgpKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHR5cGVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gKElDb25maWd1cmF0aW9uRWxlbWVudCkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKHJ1bm5pbmdIZWFkbGVzcykgewotCQkJCVN0cmluZyBoZWFkbGVzcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFudENvcmVQbHVnaW4uSEVBRExFU1MpOwotCQkJCWlmIChoZWFkbGVzcyAhPSBudWxsKSB7Ci0JCQkJCWJvb2xlYW4gaGVhZGxlc3NUYXNrPSBCb29sZWFuLnZhbHVlT2YoaGVhZGxlc3MpLmJvb2xlYW5WYWx1ZSgpOwotCQkJCQlpZiAoIWhlYWRsZXNzVGFzaykgewotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlUeXBlIHR5cGUgPSBuZXcgVHlwZSgpOwotCQkJdHlwZS5zZXRJc0RlZmF1bHQodHJ1ZSk7Ci0JCQl0eXBlLnNldFR5cGVOYW1lKGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFudENvcmVQbHVnaW4uTkFNRSkpOwotCQkJdHlwZS5zZXRDbGFzc05hbWUoZWxlbWVudC5nZXRBdHRyaWJ1dGUoQW50Q29yZVBsdWdpbi5DTEFTUykpOwotCQkJU3RyaW5nIGxpYnJhcnkgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBbnRDb3JlUGx1Z2luLkxJQlJBUlkpOwotCQkJaWYgKGxpYnJhcnkgPT0gbnVsbCkgewotCQkJCUlTdGF0dXMgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBbnRDb3JlUGx1Z2luLlBJX0FOVENPUkUsIEFudENvcmVQbHVnaW4uRVJST1JfTElCUkFSWV9OT1RfU1BFQ0lGSUVELCBNZXNzYWdlRm9ybWF0LmZvcm1hdChJbnRlcm5hbENvcmVBbnRNZXNzYWdlcy5nZXRTdHJpbmcoIkFudENvcmVQcmVmZXJlbmNlcy5MaWJyYXJ5X25vdF9zcGVjaWZpZWRfZm9yX197MH1fNCIpLCBuZXcgU3RyaW5nW117dHlwZS5nZXRUeXBlTmFtZSgpfSksIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCQkJQW50Q29yZVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCUlQbHVnaW5EZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBlbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldERlY2xhcmluZ1BsdWdpbkRlc2NyaXB0b3IoKTsKLQkJCXRyeSB7Ci0JCQkJVVJMIHVybCA9IFBsYXRmb3JtLmFzTG9jYWxVUkwobmV3IFVSTChkZXNjcmlwdG9yLmdldEluc3RhbGxVUkwoKSwgbGlicmFyeSkpOwotCQkJCWlmIChuZXcgRmlsZSh1cmwuZ2V0UGF0aCgpKS5leGlzdHMoKSkgewotCQkJCQlpZiAoIWV4dHJhQ2xhc3NwYXRoVVJMcy5jb250YWlucyh1cmwpKSB7Ci0JCQkJCQlleHRyYUNsYXNzcGF0aFVSTHMuYWRkKHVybCk7Ci0JCQkJCX0KLQkJCQkJcmVzdWx0LmFkZCh0eXBlKTsKLQkJCQkJYWRkUGx1Z2luQ2xhc3NMb2FkZXIoZGVzY3JpcHRvci5nZXRQbHVnaW5DbGFzc0xvYWRlcigpKTsKLQkJCQkJdHlwZS5zZXRMaWJyYXJ5KHVybCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy90eXBlIHNwZWNpZmllcyBhIGxpYnJhcnkgdGhhdCBkb2VzIG5vdCBleGlzdAotCQkJCQlJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQW50Q29yZVBsdWdpbi5QSV9BTlRDT1JFLCBBbnRDb3JlUGx1Z2luLkVSUk9SX0xJQlJBUllfTk9UX1NQRUNJRklFRCwgTWVzc2FnZUZvcm1hdC5mb3JtYXQoSW50ZXJuYWxDb3JlQW50TWVzc2FnZXMuZ2V0U3RyaW5nKCJBbnRDb3JlUHJlZmVyZW5jZXMuTm9fbGlicmFyeV9mb3JfdHlwZSIpLCBuZXcgU3RyaW5nW117dXJsLnRvRXh0ZXJuYWxGb3JtKCksIGRlc2NyaXB0b3IuZ2V0TGFiZWwoKX0pLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlBbnRDb3JlUGx1Z2luLmdldFBsdWdpbigpLmdldExvZygpLmxvZyhzdGF0dXMpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vIGlmIHRoZSBVUkwgZG9lcyBub3QgaGF2ZSBhIHZhbGlkIGZvcm1hdCwganVzdCBsb2cgYW5kIGlnbm9yZSB0aGUgZXhjZXB0aW9uCi0JCQkJSVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFudENvcmVQbHVnaW4uUElfQU5UQ09SRSwgQW50Q29yZVBsdWdpbi5FUlJPUl9NQUxGT1JNRURfVVJMLCBJbnRlcm5hbENvcmVBbnRNZXNzYWdlcy5nZXRTdHJpbmcoIkFudENvcmVQcmVmZXJlbmNlcy5NYWxmb3JtZWRfVVJMLl8xIiksIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJQW50Q29yZVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENvbXB1dGVzIHRoZSBleHRyYSBjbGFzc3BhdGggZW50cmllcyBkZWZpbmVkIHBsdWdpbnMgYW5kIGZyYWdtZW50cy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb21wdXRlRGVmYXVsdEV4dHJhQ2xhc3NwYXRoRW50cmllcyhMaXN0IGVudHJpZXMpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGVudHJpZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgPSAoSUNvbmZpZ3VyYXRpb25FbGVtZW50KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAocnVubmluZ0hlYWRsZXNzKSB7Ci0JCQkJU3RyaW5nIGhlYWRsZXNzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQW50Q29yZVBsdWdpbi5IRUFETEVTUyk7Ci0JCQkJaWYgKGhlYWRsZXNzICE9IG51bGwpIHsKLQkJCQkJYm9vbGVhbiBoZWFkbGVzc0VudHJ5PSBCb29sZWFuLnZhbHVlT2YoaGVhZGxlc3MpLmJvb2xlYW5WYWx1ZSgpOwotCQkJCQlpZiAoIWhlYWRsZXNzRW50cnkpIHsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJU3RyaW5nIGxpYnJhcnkgPSAoU3RyaW5nKSBlbGVtZW50LmdldEF0dHJpYnV0ZShBbnRDb3JlUGx1Z2luLkxJQlJBUlkpOwotCQkJSVBsdWdpbkRlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0RGVjbGFyaW5nUGx1Z2luRGVzY3JpcHRvcigpOwotCQkJdHJ5IHsKLQkJCQlVUkwgdXJsID0gUGxhdGZvcm0uYXNMb2NhbFVSTChuZXcgVVJMKGRlc2NyaXB0b3IuZ2V0SW5zdGFsbFVSTCgpLCBsaWJyYXJ5KSk7Ci0JCQkJCi0JCQkJaWYgKG5ldyBGaWxlKHVybC5nZXRQYXRoKCkpLmV4aXN0cygpKSB7Ci0JCQkJCWlmICghZXh0cmFDbGFzc3BhdGhVUkxzLmNvbnRhaW5zKHVybCkpIHsKLQkJCQkJCWV4dHJhQ2xhc3NwYXRoVVJMcy5hZGQodXJsKTsKLQkJCQkJfQotCQkJCQlhZGRQbHVnaW5DbGFzc0xvYWRlcihkZXNjcmlwdG9yLmdldFBsdWdpbkNsYXNzTG9hZGVyKCkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vZXh0cmEgY2xhc3NwYXRoIGVudHJ5IHRoYXQgZG9lcyBub3QgZXhpc3QKLQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFudENvcmVQbHVnaW4uUElfQU5UQ09SRSwgQW50Q29yZVBsdWdpbi5FUlJPUl9MSUJSQVJZX05PVF9TUEVDSUZJRUQsIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEludGVybmFsQ29yZUFudE1lc3NhZ2VzLmdldFN0cmluZygiQW50Q29yZVByZWZlcmVuY2VzLk5vX2xpYnJhcnlfZm9yX2V4dHJhQ2xhc3NwYXRoRW50cnkiKSwgbmV3IFN0cmluZ1tde3VybC50b0V4dGVybmFsRm9ybSgpLCBkZXNjcmlwdG9yLmdldExhYmVsKCl9KSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJQW50Q29yZVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZiB0aGUgVVJMIGRvZXMgbm90IGhhdmUgYSB2YWxpZCBmb3JtYXQsIGp1c3QgbG9nIGFuZCBpZ25vcmUgdGhlIGV4Y2VwdGlvbgotCQkJCUlTdGF0dXMgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBbnRDb3JlUGx1Z2luLlBJX0FOVENPUkUsIEFudENvcmVQbHVnaW4uRVJST1JfTUFMRk9STUVEX1VSTCwgSW50ZXJuYWxDb3JlQW50TWVzc2FnZXMuZ2V0U3RyaW5nKCJBbnRDb3JlUHJlZmVyZW5jZXMuTWFsZm9ybWVkX1VSTC5fMSIpLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCUFudENvcmVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nKCkubG9nKHN0YXR1cyk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBVUkwgZm9yIHRoZSB0b29scy5qYXIgYXNzb2NpYXRlZCB3aXRoIHRoZSAiamF2YS5ob21lIgotCSAqIGxvY2F0aW9uLiBNYXkgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHRvb2xzLmphciBpcyBmb3VuZCAoZS5nLiAiamF2YS5ob21lIgotCSAqIHBvaW50cyB0byBhIEpSRSBpbnN0YWxsKS4KLQkgKiAKLQkgKiBAcmV0dXJuIFVSTCB0b29scy5qYXIgVVJMIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIFVSTCBnZXRUb29sc0phclVSTCgpIHsKLQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5ob21lIikpOyAvLyROT04tTkxTLTEkCi0JCWlmIChwYXRoLmxhc3RTZWdtZW50KCkuZXF1YWxzSWdub3JlQ2FzZSgianJlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcGF0aCA9IHBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpOwotCQl9Ci0JCXBhdGggPSBwYXRoLmFwcGVuZCgibGliIikuYXBwZW5kKCJ0b29scy5qYXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCUZpbGUgdG9vbHMgPSBwYXRoLnRvRmlsZSgpOwotCQlpZiAoIXRvb2xzLmV4aXN0cygpKSB7Ci0JCQkvL2F0dGVtcHQgdG8gZmluZCBpbiB0aGUgb2xkZXIgMS4xLiogCi0JCQlwYXRoPSBwYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKTsKLQkJCXBhdGg9IHBhdGguYXBwZW5kKCJjbGFzc2VzLnppcCIpOyAvLyROT04tTkxTLTEkCi0JCQl0b29scyA9IHBhdGgudG9GaWxlKCk7Ci0JCQlpZiAoIXRvb2xzLmV4aXN0cygpKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQkJdHJ5IHsKLQkJCXJldHVybiBuZXcgVVJMKCJmaWxlOiIgKyB0b29scy5nZXRBYnNvbHV0ZVBhdGgoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlmIHRoZSBVUkwgZG9lcyBub3QgaGF2ZSBhIHZhbGlkIGZvcm1hdCwganVzdCBsb2cgYW5kIGlnbm9yZSB0aGUgZXhjZXB0aW9uCi0JCQlJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQW50Q29yZVBsdWdpbi5QSV9BTlRDT1JFLCBBbnRDb3JlUGx1Z2luLkVSUk9SX01BTEZPUk1FRF9VUkwsIEludGVybmFsQ29yZUFudE1lc3NhZ2VzLmdldFN0cmluZygiQW50Q29yZVByZWZlcmVuY2VzLk1hbGZvcm1lZF9VUkwuXzEiKSwgZSk7ICAvLyROT04tTkxTLTEkCi0JCQlBbnRDb3JlUGx1Z2luLmdldFBsdWdpbigpLmdldExvZygpLmxvZyhzdGF0dXMpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZExpYnJhcmllcyhJUGx1Z2luRGVzY3JpcHRvciBzb3VyY2UsIExpc3QgZGVzdGluYXRpb24pIHsKLQkJVVJMIHJvb3QgPSBzb3VyY2UuZ2V0SW5zdGFsbFVSTCgpOwotCQlJTGlicmFyeVtdIGxpYnJhcmllcyA9IHNvdXJjZS5nZXRSdW50aW1lTGlicmFyaWVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlicmFyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCVVSTCB1cmwgPSBuZXcgVVJMKHJvb3QsIGxpYnJhcmllc1tpXS5nZXRQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCQkJZGVzdGluYXRpb24uYWRkKFBsYXRmb3JtLmFzTG9jYWxVUkwodXJsKSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vIGlmIHRoZSBVUkwgZG9lcyBub3QgaGF2ZSBhIHZhbGlkIGZvcm1hdCwganVzdCBsb2cgYW5kIGlnbm9yZSB0aGUgZXhjZXB0aW9uCi0JCQkJSVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFudENvcmVQbHVnaW4uUElfQU5UQ09SRSwgQW50Q29yZVBsdWdpbi5FUlJPUl9NQUxGT1JNRURfVVJMLCBJbnRlcm5hbENvcmVBbnRNZXNzYWdlcy5nZXRTdHJpbmcoIkFudENvcmVQcmVmZXJlbmNlcy5NYWxmb3JtZWRfVVJMLl8xIiksIGUpOyAgLy8kTk9OLU5MUy0xJAotCQkJCUFudENvcmVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nKCkubG9nKHN0YXR1cyk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQbHVnaW5DbGFzc0xvYWRlcihDbGFzc0xvYWRlciBsb2FkZXIpIHsKLQkJaWYgKCFwbHVnaW5DbGFzc0xvYWRlcnMuY29udGFpbnMobG9hZGVyKSkgewotCQkJcGx1Z2luQ2xhc3NMb2FkZXJzLmFkZChsb2FkZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGlzdCBvZiB1cmxzIGFkZGVkIHRvIHRoZSBjbGFzc3BhdGggYnkgdGhlIGV4dHJhIGNsYXNzcGF0aAotCSAqIGVudHJpZXMgZXh0ZW5zaW9uIHBvaW50LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgZXh0cmEgY2xhc3NwYXRoIFVSTHMKLQkgKi8KLQlwdWJsaWMgVVJMW10gZ2V0RXh0cmFDbGFzc3BhdGhVUkxzKCkgewotCQlyZXR1cm4gKFVSTFtdKWV4dHJhQ2xhc3NwYXRoVVJMcy50b0FycmF5KG5ldyBVUkxbZXh0cmFDbGFzc3BhdGhVUkxzLnNpemUoKV0pOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlbnRpcmUgc2V0IG9mIFVSTHMgdGhhdCBkZWZpbmUgdGhlIEFudCBydW50aW1lIGNsYXNzcGF0aC4KLQkgKiBJbmNsdWRlcyB0aGUgQW50IFVSTHMsIHRoZSBjdXN0b20gVVJMcyBhbmQgZXh0cmEgY2xhc3NwYXRoIFVSTHMuCi0JICogCi0JICogQHJldHVybiB0aGUgZW50aXJlIHJ1bnRpbWUgY2xhc3NwYXRoIG9mIFVSTHMKLQkgKi8KLQlwdWJsaWMgVVJMW10gZ2V0VVJMcygpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KDIwKTsKLQkJaWYgKGFudFVSTHMgIT0gbnVsbCkgewotCQkJcmVzdWx0LmFkZEFsbChBcnJheXMuYXNMaXN0KGFudFVSTHMpKTsKLQkJfQotCQlpZiAoY3VzdG9tVVJMcyAhPSBudWxsICYmIGN1c3RvbVVSTHMubGVuZ3RoID4gMCkgewotCQkJcmVzdWx0LmFkZEFsbChBcnJheXMuYXNMaXN0KGN1c3RvbVVSTHMpKTsKLQkJfQotCQlpZiAoZXh0cmFDbGFzc3BhdGhVUkxzICE9IG51bGwpIHsKLQkJCXJlc3VsdC5hZGRBbGwoZXh0cmFDbGFzc3BhdGhVUkxzKTsKLQkJfQotCQlyZXR1cm4gKFVSTFtdKSByZXN1bHQudG9BcnJheShuZXcgVVJMW3Jlc3VsdC5zaXplKCldKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ2xhc3NMb2FkZXJbXSBnZXRQbHVnaW5DbGFzc0xvYWRlcnMoKSB7Ci0JCWlmIChvcmRlcmVkUGx1Z2luQ2xhc3NMb2FkZXJzID09IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGNsYXNzTG9hZGVycz0gcGx1Z2luQ2xhc3NMb2FkZXJzLml0ZXJhdG9yKCk7Ci0JCQlNYXAgaWRUb0xvYWRlcj0gbmV3IEhhc2hNYXAocGx1Z2luQ2xhc3NMb2FkZXJzLnNpemUoKSk7Ci0JCQlJUGx1Z2luRGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzPSBuZXcgSVBsdWdpbkRlc2NyaXB0b3JbcGx1Z2luQ2xhc3NMb2FkZXJzLnNpemUoKV07Ci0JCQlpbnQgaT0gMDsKLQkJCXdoaWxlIChjbGFzc0xvYWRlcnMuaGFzTmV4dCgpKSB7Ci0JCQkJUGx1Z2luQ2xhc3NMb2FkZXIgbG9hZGVyID0gKFBsdWdpbkNsYXNzTG9hZGVyKSBjbGFzc0xvYWRlcnMubmV4dCgpOwotCQkJCUlQbHVnaW5EZXNjcmlwdG9yIGRlc2NyaXB0b3I9IGxvYWRlci5nZXRQbHVnaW5EZXNjcmlwdG9yKCk7Ci0JCQkJaWRUb0xvYWRlci5wdXQoZGVzY3JpcHRvci5nZXRVbmlxdWVJZGVudGlmaWVyKCksIGxvYWRlcik7Ci0JCQkJZGVzY3JpcHRvcnNbaV09IGRlc2NyaXB0b3I7Ci0JCQkJaSsrOwotCQkJfQotCQkJU3RyaW5nW10gaWRzPSBjb21wdXRlUHJlcmVxdWlzaXRlT3JkZXJQbHVnaW5zKGRlc2NyaXB0b3JzKTsKLQkJCW9yZGVyZWRQbHVnaW5DbGFzc0xvYWRlcnM9IG5ldyBDbGFzc0xvYWRlcltwbHVnaW5DbGFzc0xvYWRlcnMuc2l6ZSgpXTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgaWRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJU3RyaW5nIGlkID0gaWRzW2pdOwotCQkJCW9yZGVyZWRQbHVnaW5DbGFzc0xvYWRlcnNbal09IChDbGFzc0xvYWRlcilpZFRvTG9hZGVyLmdldChpZCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG9yZGVyZWRQbHVnaW5DbGFzc0xvYWRlcnM7Ci0JfQotCi0JLyoqCi0JICogQ29waWVkIGZyb20gb3JnLmVjbGlwc2UucGRlLmludGVybmFsLmJ1aWxkLlV0aWxzCi0JICovCi0JcHJpdmF0ZSBTdHJpbmdbXSBjb21wdXRlUHJlcmVxdWlzaXRlT3JkZXJQbHVnaW5zKElQbHVnaW5EZXNjcmlwdG9yW10gcGx1Z2lucykgewotCQlMaXN0IHByZXJlcXMgPSBuZXcgQXJyYXlMaXN0KDkpOwotCQlTZXQgcGx1Z2luTGlzdCA9IG5ldyBIYXNoU2V0KHBsdWdpbnMubGVuZ3RoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwbHVnaW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlwbHVnaW5MaXN0LmFkZChwbHVnaW5zW2ldLmdldFVuaXF1ZUlkZW50aWZpZXIoKSk7Ci0JCX0KLQkJCi0JCS8vIGNyZWF0ZSBhIGNvbGxlY3Rpb24gb2YgZGlyZWN0ZWQgZWRnZXMgZnJvbSBwbHVnaW4gdG8gcHJlcmVxCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGx1Z2lucy5sZW5ndGg7IGkrKykgewotCQkJYm9vbGVhbiBib290ID0gZmFsc2U7Ci0JCQlib29sZWFuIHJ1bnRpbWUgPSBmYWxzZTsKLQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCUlQbHVnaW5QcmVyZXF1aXNpdGVbXSBwcmVyZXFMaXN0ID0gcGx1Z2luc1tpXS5nZXRQbHVnaW5QcmVyZXF1aXNpdGVzKCk7Ci0JCQlpZiAocHJlcmVxTGlzdCAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBwcmVyZXFMaXN0Lmxlbmd0aDsgaisrKSB7Ci0JCQkJCS8vIGVuc3VyZSB0aGF0IHdlIG9ubHkgaW5jbHVkZSB2YWx1ZXMgZnJvbSB0aGUgb3JpZ2luYWwgc2V0LgotCQkJCQlTdHJpbmcgcHJlcmVxID0gcHJlcmVxTGlzdFtqXS5nZXRVbmlxdWVJZGVudGlmaWVyKCk7Ci0JCQkJCWJvb3QgPSBib290IHx8IHByZXJlcS5lcXVhbHMoQm9vdExvYWRlci5QSV9CT09UKTsKLQkJCQkJcnVudGltZSA9IHJ1bnRpbWUgfHwgcHJlcmVxLmVxdWFscyhQbGF0Zm9ybS5QSV9SVU5USU1FKTsKLQkJCQkJaWYgKHBsdWdpbkxpc3QuY29udGFpbnMocHJlcmVxKSkgewotCQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQkJcHJlcmVxcy5hZGQobmV3IFN0cmluZ1tdIHsgcGx1Z2luc1tpXS5nZXRVbmlxdWVJZGVudGlmaWVyKCksIHByZXJlcSB9KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJLy8gaWYgd2UgZGlkbid0IGZpbmQgYW55IHByZXJlcXMgZm9yIHRoaXMgcGx1Z2luLCBhZGQgYSBudWxsIHByZXJlcQotCQkJLy8gdG8gZW5zdXJlIHRoZSB2YWx1ZSBpcyBpbiB0aGUgb3V0cHV0CQotCQkJaWYgKCFmb3VuZCkgewotCQkJCXByZXJlcXMuYWRkKG5ldyBTdHJpbmdbXSB7IHBsdWdpbnNbaV0uZ2V0VW5pcXVlSWRlbnRpZmllcigpLCBudWxsIH0pOwotCQkJfQotCi0JCQkvLyBpZiB3ZSBkaWRuJ3QgZmluZCB0aGUgYm9vdCBvciBydW50aW1lIHBsdWdpbnMgYXMgcHJlcmVxcyBhbmQgdGhleSBhcmUgaW4gdGhlIGxpc3QKLQkJCS8vIG9mIHBsdWdpbnMgdG8gYnVpbGQsIGFkZCBwcmVyZXEgcmVsYXRpb25zIGZvciB0aGVtLiAgVGhpcyBpcyByZXF1aXJlZCBzaW5jZSB0aGUgCi0JCQkvLyBib290IGFuZCBydW50aW1lIGFyZSBpbXBsaWNpdGx5IGFkZGVkIHRvIGEgcGx1Z2luJ3MgcmVxdWlyZXMgbGlzdCBieSB0aGUgcGxhdGZvcm0gcnVudGltZS4KLQkJCS8vIE5vdGUgdGhhdCB3ZSBzaG91bGQgc2tpcCB0aGUgeGVyY2VzIHBsdWdpbiBhcyB0aGlzIHdvdWxkIGNhdXNlIGEgY2lyY3VsYXJpdHkuCi0JCQlpZiAocGx1Z2luc1tpXS5nZXRVbmlxdWVJZGVudGlmaWVyKCkuZXF1YWxzKCJvcmcuYXBhY2hlLnhlcmNlcyIpKSAvLyROT04tTkxTLTEkCi0JCQkJY29udGludWU7Ci0JCQlpZiAoIWJvb3QgJiYgcGx1Z2luTGlzdC5jb250YWlucyhCb290TG9hZGVyLlBJX0JPT1QpICYmICFwbHVnaW5zW2ldLmdldFVuaXF1ZUlkZW50aWZpZXIoKS5lcXVhbHMoQm9vdExvYWRlci5QSV9CT09UKSkKLQkJCQlwcmVyZXFzLmFkZChuZXcgU3RyaW5nW10geyBwbHVnaW5zW2ldLmdldFVuaXF1ZUlkZW50aWZpZXIoKSwgQm9vdExvYWRlci5QSV9CT09UIH0pOwotCQkJaWYgKCFydW50aW1lICYmIHBsdWdpbkxpc3QuY29udGFpbnMoUGxhdGZvcm0uUElfUlVOVElNRSkgJiYgIXBsdWdpbnNbaV0uZ2V0VW5pcXVlSWRlbnRpZmllcigpLmVxdWFscyhQbGF0Zm9ybS5QSV9SVU5USU1FKSAmJiAhcGx1Z2luc1tpXS5nZXRVbmlxdWVJZGVudGlmaWVyKCkuZXF1YWxzKEJvb3RMb2FkZXIuUElfQk9PVCkpCi0JCQkJcHJlcmVxcy5hZGQobmV3IFN0cmluZ1tdIHsgcGx1Z2luc1tpXS5nZXRVbmlxdWVJZGVudGlmaWVyKCksIFBsYXRmb3JtLlBJX1JVTlRJTUUgfSk7Ci0JCX0KLQotCQkvLyBkbyBhIHRvcG9sb2dpY2FsIHNvcnQsIGluc2VydCB0aGUgZnJhZ21lbnRzIGludG8gdGhlIHNvcnRlZCBlbGVtZW50cwotCQlTdHJpbmdbXVtdIHByZXJlcUFycmF5ID0gKFN0cmluZ1tdW10pIHByZXJlcXMudG9BcnJheShuZXcgU3RyaW5nW3ByZXJlcXMuc2l6ZSgpXVtdKTsKLQkJcmV0dXJuIGNvbXB1dGVOb2RlT3JkZXIocHJlcmVxQXJyYXkpOwotCX0KLQkKLQkvKioKLQkgKiBDb3BpZWQgZnJvbSBvcmcuZWNsaXBzZS5wZGUuaW50ZXJuYWwuYnVpbGQuVXRpbHMKLQkgKi8KLQlwcml2YXRlIFN0cmluZ1tdIGNvbXB1dGVOb2RlT3JkZXIoU3RyaW5nW11bXSBzcGVjcykgewotCQlNYXAgY291bnRzID0gY29tcHV0ZUNvdW50cyhzcGVjcyk7Ci0JCUxpc3Qgbm9kZXMgPSBuZXcgQXJyYXlMaXN0KGNvdW50cy5zaXplKCkpOwotCQl3aGlsZSAoIWNvdW50cy5pc0VtcHR5KCkpIHsKLQkJCUxpc3Qgcm9vdHMgPSBmaW5kUm9vdE5vZGVzKGNvdW50cyk7Ci0JCQlpZiAocm9vdHMuaXNFbXB0eSgpKQotCQkJCWJyZWFrOwotCQkJZm9yIChJdGVyYXRvciBpID0gcm9vdHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotCQkJCWNvdW50cy5yZW1vdmUoaS5uZXh0KCkpOwotCQkJbm9kZXMuYWRkQWxsKHJvb3RzKTsKLQkJCXJlbW92ZUFyY3Moc3BlY3MsIHJvb3RzLCBjb3VudHMpOwotCQl9Ci0JCVN0cmluZ1tdIHJlc3VsdCA9IG5ldyBTdHJpbmdbbm9kZXMuc2l6ZSgpXTsKLQkJbm9kZXMudG9BcnJheShyZXN1bHQpOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCS8qKgotCSAqIENvcGllZCBmcm9tIG9yZy5lY2xpcHNlLnBkZS5pbnRlcm5hbC5idWlsZC5VdGlscwotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVBcmNzKFN0cmluZ1tdW10gbWFwcGluZ3MsIExpc3Qgcm9vdHMsIE1hcCBjb3VudHMpIHsKLQkJZm9yIChJdGVyYXRvciBqID0gcm9vdHMuaXRlcmF0b3IoKTsgai5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcgcm9vdCA9IChTdHJpbmcpIGoubmV4dCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXBwaW5ncy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChyb290LmVxdWFscyhtYXBwaW5nc1tpXVsxXSkpIHsKLQkJCQkJU3RyaW5nIGlucHV0ID0gbWFwcGluZ3NbaV1bMF07Ci0JCQkJCUludGVnZXIgY291bnQgPSAoSW50ZWdlcikgY291bnRzLmdldChpbnB1dCk7Ci0JCQkJCWlmIChjb3VudCAhPSBudWxsKQotCQkJCQkJY291bnRzLnB1dChpbnB1dCwgbmV3IEludGVnZXIoY291bnQuaW50VmFsdWUoKSAtIDEpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ29waWVkIGZyb20gb3JnLmVjbGlwc2UucGRlLmludGVybmFsLmJ1aWxkLlV0aWxzCi0JICovCi0JcHJpdmF0ZSBMaXN0IGZpbmRSb290Tm9kZXMoTWFwIGNvdW50cykgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoNSk7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IGNvdW50cy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCVN0cmluZyBub2RlID0gKFN0cmluZykgaS5uZXh0KCk7Ci0JCQlpbnQgY291bnQgPSAoKEludGVnZXIpIGNvdW50cy5nZXQobm9kZSkpLmludFZhbHVlKCk7Ci0JCQlpZiAoY291bnQgPT0gMCkKLQkJCQlyZXN1bHQuYWRkKG5vZGUpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCS8qKgotCSAqIENvcGllZCBmcm9tIG9yZy5lY2xpcHNlLnBkZS5pbnRlcm5hbC5idWlsZC5VdGlscwotCSAqLwotCXByaXZhdGUgTWFwIGNvbXB1dGVDb3VudHMoU3RyaW5nW11bXSBtYXBwaW5ncykgewotCQlNYXAgY291bnRzID0gbmV3IEhhc2hNYXAoNSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWFwcGluZ3MubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBmcm9tID0gbWFwcGluZ3NbaV1bMF07Ci0JCQlJbnRlZ2VyIGZyb21Db3VudCA9IChJbnRlZ2VyKSBjb3VudHMuZ2V0KGZyb20pOwotCQkJU3RyaW5nIHRvID0gbWFwcGluZ3NbaV1bMV07Ci0JCQlpZiAodG8gPT0gbnVsbCkKLQkJCQljb3VudHMucHV0KGZyb20sIG5ldyBJbnRlZ2VyKDApKTsKLQkJCWVsc2UgewotCQkJCWlmICgoKEludGVnZXIpIGNvdW50cy5nZXQodG8pKSA9PSBudWxsKQotCQkJCQljb3VudHMucHV0KHRvLCBuZXcgSW50ZWdlcigwKSk7Ci0JCQkJZnJvbUNvdW50ID0gZnJvbUNvdW50ID09IG51bGwgPyBuZXcgSW50ZWdlcigxKSA6IG5ldyBJbnRlZ2VyKGZyb21Db3VudC5pbnRWYWx1ZSgpICsgMSk7Ci0JCQkJY291bnRzLnB1dChmcm9tLCBmcm9tQ291bnQpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjb3VudHM7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplUGx1Z2luQ2xhc3NMb2FkZXJzKCkgewotCQlwbHVnaW5DbGFzc0xvYWRlcnMgPSBuZXcgQXJyYXlMaXN0KDEwKTsKLQkJLy8gYW50LmNvcmUgc2hvdWxkIGFsd2F5cyBiZSBwcmVzZW50IChwcm92aWRlcyBhY2Nlc3MgdG8gWGVyY2VzIGFzIHdlbGwpCi0JCXBsdWdpbkNsYXNzTG9hZGVycy5hZGQoUGxhdGZvcm0uZ2V0UGx1Z2luKEFudENvcmVQbHVnaW4uUElfQU5UQ09SRSkuZ2V0RGVzY3JpcHRvcigpLmdldFBsdWdpbkNsYXNzTG9hZGVyKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRlZmF1bHQgYW5kIGN1c3RvbSB0YXNrcy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIGRlZmF1bHQgYW5kIGN1c3RvbSB0YXNrcy4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRUYXNrcygpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KDEwKTsKLQkJaWYgKGRlZmF1bHRUYXNrcyAhPSBudWxsICYmICFkZWZhdWx0VGFza3MuaXNFbXB0eSgpKSB7Ci0JCQlyZXN1bHQuYWRkQWxsKGRlZmF1bHRUYXNrcyk7Ci0JCX0KLQkJaWYgKGN1c3RvbVRhc2tzICE9IG51bGwgJiYgY3VzdG9tVGFza3MubGVuZ3RoICE9IDApIHsKLQkJCXJlc3VsdC5hZGRBbGwoQXJyYXlzLmFzTGlzdChjdXN0b21UYXNrcykpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdXNlciBkZWZpbmVkIGN1c3RvbSB0YXNrcwotCSAqIEByZXR1cm4gdGhlIHVzZXIgZGVmaW5lZCB0YXNrcwotCSAqLwotCXB1YmxpYyBUYXNrW10gZ2V0Q3VzdG9tVGFza3MoKSB7Ci0JCXJldHVybiBjdXN0b21UYXNrczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB1c2VyIGRlZmluZWQgY3VzdG9tIHR5cGVzCi0JICogQHJldHVybiB0aGUgdXNlciBkZWZpbmVkIHR5cGVzCi0JICovCi0JcHVibGljIFR5cGVbXSBnZXRDdXN0b21UeXBlcygpIHsKLQkJcmV0dXJuIGN1c3RvbVR5cGVzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1c3RvbSB1c2VyIHByb3BlcnRpZXMgc3BlY2lmaWVkIGZvciBBbnQgYnVpbGRzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHByb3BlcnRpZXMgZGVmaW5lZCBmb3IgQW50IGJ1aWxkcy4KLQkgKi8KLQlwdWJsaWMgUHJvcGVydHlbXSBnZXRDdXN0b21Qcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gY3VzdG9tUHJvcGVydGllczsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY3VzdG9tIHByb3BlcnR5IGZpbGVzIHNwZWNpZmllZCBmb3IgQW50IGJ1aWxkcy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwcm9wZXJ0eSBmaWxlcyBkZWZpbmVkIGZvciBBbnQgYnVpbGRzLgotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRDdXN0b21Qcm9wZXJ0eUZpbGVzKCkgewotCQlyZXR1cm4gY3VzdG9tUHJvcGVydHlGaWxlczsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY3VzdG9tIFVSTHMgc3BlY2lmaWVkIGZvciB0aGUgQW50IGNsYXNzcGF0aAotCSAqIAotCSAqIEByZXR1cm4gdGhlIHVybHMgZGVmaW5pbmcgdGhlIEFudCBjbGFzc3BhdGgKLQkgKi8KLQlwdWJsaWMgVVJMW10gZ2V0Q3VzdG9tVVJMcygpIHsKLQkJcmV0dXJuIGN1c3RvbVVSTHM7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdXNlciBkZWZpbmVkIGN1c3RvbSB0YXNrcwotCSAqIEBwYXJhbSB0YXNrcwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEN1c3RvbVRhc2tzKFRhc2tbXSB0YXNrcykgewotCQljdXN0b21UYXNrcyA9IHRhc2tzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHVzZXIgZGVmaW5lZCBjdXN0b20gdHlwZXMKLQkgKiBAcGFyYW0gdGFza3MKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDdXN0b21UeXBlcyhUeXBlW10gdHlwZXMpIHsKLQkJY3VzdG9tVHlwZXMgPSB0eXBlczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjdXN0b20gVVJMcyBzcGVjaWZpZWQgZm9yIHRoZSBBbnQgY2xhc3NwYXRoLgotCSAqIFRvIGNvbW1pdCB0aGUgY2hhbmdlcywgdXBkYXRlUGx1Z2luUHJlZmVyZW5jZXMgbXVzdCBiZQotCSAqIGNhbGxlZC4KLQkgKiAKLQkgKiBAcGFyYW0gdGhlIHVybHMgZGVmaW5pbmcgdGhlIEFudCBjbGFzc3BhdGgKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDdXN0b21VUkxzKFVSTFtdIHVybHMpIHsKLQkJY3VzdG9tVVJMcyA9IHVybHM7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIEFudCBVUkxzIHNwZWNpZmllZCBmb3IgdGhlIEFudCBjbGFzc3BhdGguIFRvIGNvbW1pdCB0aGUgY2hhbmdlcywKLQkgKiB1cGRhdGVQbHVnaW5QcmVmZXJlbmNlcyBtdXN0IGJlIGNhbGxlZC4KLQkgKiAKLQkgKiBAcGFyYW0gdGhlIHVybHMgZGVmaW5pbmcgdGhlIEFudCBjbGFzc3BhdGgKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBbnRVUkxzKFVSTFtdIHVybHMpIHsKLQkJYW50VVJMcyA9IHVybHM7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGN1c3RvbSBwcm9wZXJ0eSBmaWxlcyBzcGVjaWZpZWQgZm9yIEFudCBidWlsZHMuIFRvIGNvbW1pdCB0aGUKLQkgKiBjaGFuZ2VzLCB1cGRhdGVQbHVnaW5QcmVmZXJlbmNlcyBtdXN0IGJlIGNhbGxlZC4KLQkgKiAKLQkgKiBAcGFyYW0gdGhlIGFic29sdXRlIHBhdGhzIGRlZmluaW5nIHRoZSBwcm9wZXJ0eSBmaWxlcyB0byB1c2UuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3VzdG9tUHJvcGVydHlGaWxlcyhTdHJpbmdbXSBwYXRocykgewotCQljdXN0b21Qcm9wZXJ0eUZpbGVzID0gcGF0aHM7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGN1c3RvbSB1c2VyIHByb3BlcnRpZXMgc3BlY2lmaWVkIGZvciBBbnQgYnVpbGRzLiBUbyBjb21taXQgdGhlCi0JICogY2hhbmdlcywgdXBkYXRlUGx1Z2luUHJlZmVyZW5jZXMgbXVzdCBiZSBjYWxsZWQuCi0JICogCi0JICogQHBhcmFtIHRoZSBwcm9wZXJ0aWVzIGRlZmluaW5nIHRoZSBBbnQgcHJvcGVydGllcwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEN1c3RvbVByb3BlcnRpZXMoUHJvcGVydHlbXSBwcm9wZXJ0aWVzKSB7Ci0JCWN1c3RvbVByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRlZmF1bHQgYW5kIGN1c3RvbSB0eXBlcy4KLQkgKiAKLQkgKiBAcmV0dXJuIGFsbCBvZiB0aGUgZGVmaW5lZCB0eXBlcwotCSAqLwotCXB1YmxpYyBMaXN0IGdldFR5cGVzKCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoMTApOwotCQlpZiAoZGVmYXVsdFR5cGVzICE9IG51bGwgJiYgIWRlZmF1bHRUeXBlcy5pc0VtcHR5KCkpIHsKLQkJCXJlc3VsdC5hZGRBbGwoZGVmYXVsdFR5cGVzKTsKLQkJfQotCQlpZiAoY3VzdG9tVHlwZXMgIT0gbnVsbCAmJiBjdXN0b21UeXBlcy5sZW5ndGggIT0gMCkgewotCQkJcmVzdWx0LmFkZEFsbChBcnJheXMuYXNMaXN0KGN1c3RvbVR5cGVzKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVmYXVsdCB0eXBlcyBkZWZpbmVkIHZpYSB0aGUgdHlwZSBleHRlbnNpb24gcG9pbnQKLQkgKiAKLQkgKiBAcmV0dXJuIGFsbCBvZiB0aGUgZGVmYXVsdCB0eXBlcwotCSAqLwotCXB1YmxpYyBMaXN0IGdldERlZmF1bHRUeXBlcygpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KDEwKTsKLQkJaWYgKGRlZmF1bHRUeXBlcyAhPSBudWxsICYmICFkZWZhdWx0VHlwZXMuaXNFbXB0eSgpKSB7Ci0JCQlyZXN1bHQuYWRkQWxsKGRlZmF1bHRUeXBlcyk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVmYXVsdCB0YXNrcyBkZWZpbmVkIHZpYSB0aGUgdGFzayBleHRlbnNpb24gcG9pbnQKLQkgKiAKLQkgKiBAcmV0dXJuIGFsbCBvZiB0aGUgZGVmYXVsdCB0YXNrcwotCSAqLwotCXB1YmxpYyBMaXN0IGdldERlZmF1bHRUYXNrcygpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KDEwKTsKLQkJaWYgKGRlZmF1bHRUYXNrcyAhPSBudWxsICYmICFkZWZhdWx0VGFza3MuaXNFbXB0eSgpKSB7Ci0JCQlyZXN1bHQuYWRkQWxsKGRlZmF1bHRUYXNrcyk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IGEgbGlzdCBvZiB0b2tlbnMgaW50byBhbiBhcnJheSB1c2luZyAiLCIgYXMgdGhlIHRva2VuaXplci4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0QXJyYXlGcm9tU3RyaW5nKFN0cmluZyBsaXN0KSB7Ci0JCVN0cmluZyBzZXBhcmF0b3I9ICIsIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAobGlzdCA9PSBudWxsIHx8IGxpc3QudHJpbSgpLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci0JCX0KLQkJQXJyYXlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChTdHJpbmdUb2tlbml6ZXIgdG9rZW5zID0gbmV3IFN0cmluZ1Rva2VuaXplcihsaXN0LCBzZXBhcmF0b3IpOyB0b2tlbnMuaGFzTW9yZVRva2VucygpOykgewotCQkJU3RyaW5nIHRva2VuID0gdG9rZW5zLm5leHRUb2tlbigpLnRyaW0oKTsKLQkJCWlmICghdG9rZW4uZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJcmVzdWx0LmFkZCh0b2tlbik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChTdHJpbmdbXSkgcmVzdWx0LnRvQXJyYXkobmV3IFN0cmluZ1tyZXN1bHQuc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgdW5kZXJseWluZyBwbHVnaW4gcHJlZmVyZW5jZXMgdG8gdGhlIGN1cnJlbnQgc3RhdGUuCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlUGx1Z2luUHJlZmVyZW5jZXMoKSB7Ci0JCVByZWZlcmVuY2VzIHByZWZzID0gQW50Q29yZVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlwcmVmcy5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQl1cGRhdGVUYXNrcyhwcmVmcyk7Ci0JCXVwZGF0ZVR5cGVzKHByZWZzKTsKLQkJdXBkYXRlQW50VVJMcyhwcmVmcyk7Ci0JCXVwZGF0ZVVSTHMocHJlZnMpOwotCQl1cGRhdGVQcm9wZXJ0aWVzKHByZWZzKTsKLQkJdXBkYXRlUHJvcGVydHlGaWxlcyhwcmVmcyk7Ci0JCUFudENvcmVQbHVnaW4uZ2V0UGx1Z2luKCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCXByZWZzLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlVGFza3MoUHJlZmVyZW5jZXMgcHJlZnMpIHsKLQkJaWYgKGN1c3RvbVRhc2tzLmxlbmd0aCA9PSAwKSB7Ci0JCQlwcmVmcy5zZXRWYWx1ZShJQW50Q29yZUNvbnN0YW50cy5QUkVGRVJFTkNFX1RBU0tTLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJfQotCQlTdHJpbmdCdWZmZXIgdGFza3MgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY3VzdG9tVGFza3MubGVuZ3RoOyBpKyspIHsKLQkJCXRhc2tzLmFwcGVuZChjdXN0b21UYXNrc1tpXS5nZXRUYXNrTmFtZSgpKTsKLQkJCXRhc2tzLmFwcGVuZCgnLCcpOwotCQkJcHJlZnMuc2V0VmFsdWUoSUFudENvcmVDb25zdGFudHMuUFJFRklYX1RBU0sgKyBjdXN0b21UYXNrc1tpXS5nZXRUYXNrTmFtZSgpLCBjdXN0b21UYXNrc1tpXS5nZXRDbGFzc05hbWUoKSArICIsIiArIGN1c3RvbVRhc2tzW2ldLmdldExpYnJhcnkoKS50b0V4dGVybmFsRm9ybSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXByZWZzLnNldFZhbHVlKElBbnRDb3JlQ29uc3RhbnRzLlBSRUZFUkVOQ0VfVEFTS1MsIHRhc2tzLnRvU3RyaW5nKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVR5cGVzKFByZWZlcmVuY2VzIHByZWZzKSB7Ci0JCWlmIChjdXN0b21UeXBlcy5sZW5ndGggPT0gMCkgewotCQkJcHJlZnMuc2V0VmFsdWUoSUFudENvcmVDb25zdGFudHMuUFJFRkVSRU5DRV9UWVBFUywgIiIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCX0KLQkJU3RyaW5nQnVmZmVyIHR5cGVzID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGN1c3RvbVR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0eXBlcy5hcHBlbmQoY3VzdG9tVHlwZXNbaV0uZ2V0VHlwZU5hbWUoKSk7Ci0JCQl0eXBlcy5hcHBlbmQoJywnKTsKLQkJCXByZWZzLnNldFZhbHVlKElBbnRDb3JlQ29uc3RhbnRzLlBSRUZJWF9UWVBFICsgY3VzdG9tVHlwZXNbaV0uZ2V0VHlwZU5hbWUoKSwgY3VzdG9tVHlwZXNbaV0uZ2V0Q2xhc3NOYW1lKCkgKyAiLCIgKyBjdXN0b21UeXBlc1tpXS5nZXRMaWJyYXJ5KCkudG9FeHRlcm5hbEZvcm0oKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlwcmVmcy5zZXRWYWx1ZShJQW50Q29yZUNvbnN0YW50cy5QUkVGRVJFTkNFX1RZUEVTLCB0eXBlcy50b1N0cmluZygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlUHJvcGVydGllcyhQcmVmZXJlbmNlcyBwcmVmcykgewotCQlpZiAoY3VzdG9tUHJvcGVydGllcy5sZW5ndGggPT0gMCkgewotCQkJcHJlZnMuc2V0VmFsdWUoSUFudENvcmVDb25zdGFudHMuUFJFRkVSRU5DRV9QUk9QRVJUSUVTLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJfQotCQlTdHJpbmdCdWZmZXIgcHJvcGVydGllcyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjdXN0b21Qcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlwcm9wZXJ0aWVzLmFwcGVuZChjdXN0b21Qcm9wZXJ0aWVzW2ldLmdldE5hbWUoKSk7Ci0JCQlwcm9wZXJ0aWVzLmFwcGVuZCgnLCcpOwotCQkJcHJlZnMuc2V0VmFsdWUoSUFudENvcmVDb25zdGFudHMuUFJFRklYX1BST1BFUlRZICsgY3VzdG9tUHJvcGVydGllc1tpXS5nZXROYW1lKCksIGN1c3RvbVByb3BlcnRpZXNbaV0uZ2V0VmFsdWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlwcmVmcy5zZXRWYWx1ZShJQW50Q29yZUNvbnN0YW50cy5QUkVGRVJFTkNFX1BST1BFUlRJRVMsIHByb3BlcnRpZXMudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlVVJMcyhQcmVmZXJlbmNlcyBwcmVmcykgewotCQlTdHJpbmdCdWZmZXIgdXJscyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjdXN0b21VUkxzLmxlbmd0aDsgaSsrKSB7Ci0JCQl1cmxzLmFwcGVuZChjdXN0b21VUkxzW2ldLnRvRXh0ZXJuYWxGb3JtKCkpOwotCQkJdXJscy5hcHBlbmQoJywnKTsKLQkJfQotCQkKLQkJcHJlZnMuc2V0VmFsdWUoSUFudENvcmVDb25zdGFudHMuUFJFRkVSRU5DRV9VUkxTLCB1cmxzLnRvU3RyaW5nKCkpOwotCQlTdHJpbmcgcHJlZkFudEhvbWU9ICIiOyAvLyROT04tTkxTLTEkCi0JCWlmIChhbnRIb21lICE9IG51bGwpIHsKLQkJCXByZWZBbnRIb21lPSBhbnRIb21lOwotCQl9IAotCQlwcmVmcy5zZXRWYWx1ZShJQW50Q29yZUNvbnN0YW50cy5QUkVGRVJFTkNFX0FOVF9IT01FLCBwcmVmQW50SG9tZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUFudFVSTHMoUHJlZmVyZW5jZXMgcHJlZnMpIHsKLQkJLy9zZWUgaWYgdGhlIGN1c3RvbSBVUkxTIGFyZSBqdXN0IHRoZSBkZWZhdWx0IFVSTFMKLQkJVVJMW10gZGNVcmxzPSBnZXREZWZhdWx0QW50VVJMcygpOwotCQlib29sZWFuIGRmbHQ9IGZhbHNlOwotCQlpZiAoZGNVcmxzLmxlbmd0aCA9PSBhbnRVUkxzLmxlbmd0aCkgewotCQkJZGZsdD0gdHJ1ZTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYW50VVJMcy5sZW5ndGg7IGkrKykgewotCQkJCWlmICghYW50VVJMc1tpXS5lcXVhbHMoZGNVcmxzW2ldKSkgewotCQkJCQlkZmx0PSBmYWxzZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChkZmx0KSB7Ci0JCQkvL2Fsd2F5cyB3YW50IHRvIHJlY2FsY3VsYXRlIHRoZSBkZWZhdWx0IEFudCB1cmxzCi0JCQkvL3RvIHBpY2sgdXAgYW55IGNoYW5nZXMgaW4gdGhlIGRlZmF1bHQgQW50IGNsYXNzcGF0aAotCQkJcHJlZnMuc2V0VmFsdWUoSUFudENvcmVDb25zdGFudHMuUFJFRkVSRU5DRV9BTlRfVVJMUywgIiIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCX0KLQkJU3RyaW5nQnVmZmVyIHVybHMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYW50VVJMcy5sZW5ndGg7IGkrKykgewotCQkJdXJscy5hcHBlbmQoYW50VVJMc1tpXS50b0V4dGVybmFsRm9ybSgpKTsKLQkJCXVybHMuYXBwZW5kKCcsJyk7Ci0JCX0KLQkJCi0JCXByZWZzLnNldFZhbHVlKElBbnRDb3JlQ29uc3RhbnRzLlBSRUZFUkVOQ0VfQU5UX1VSTFMsIHVybHMudG9TdHJpbmcoKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVByb3BlcnR5RmlsZXMoUHJlZmVyZW5jZXMgcHJlZnMpIHsKLQkJU3RyaW5nQnVmZmVyIGZpbGVzID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGN1c3RvbVByb3BlcnR5RmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCWZpbGVzLmFwcGVuZChjdXN0b21Qcm9wZXJ0eUZpbGVzW2ldKTsKLQkJCWZpbGVzLmFwcGVuZCgnLCcpOwotCQl9Ci0JCQotCQlwcmVmcy5zZXRWYWx1ZShJQW50Q29yZUNvbnN0YW50cy5QUkVGRVJFTkNFX1BST1BFUlRZX0ZJTEVTLCBmaWxlcy50b1N0cmluZygpKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgc3RyaW5nIHRoYXQgZGVmaW5lcyB0aGUgQW50IGhvbWUgc2V0IGJ5IHRoZSB1c2VyLgotCSAqIE1heSBiZSBzZXQgdG8gPGNvZGU+bnVsbDwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIHRoZSBmdWxseSBxdWFsaWZpZWQgcGF0aCB0byBBbnQgaG9tZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFudEhvbWUoU3RyaW5nIGFudEhvbWUpIHsKLQkJdGhpcy5hbnRIb21lPSBhbnRIb21lOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJpbmcgdGhhdCBkZWZpbmVzIHRoZSBBbnQgaG9tZSBzZXQgYnkgdGhlIHVzZXIuCi0JICogTWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+IGlmIEFudCBob21lIGhhcyBub3QgYmVlbiBzZXQuCi0JICogCi0JICogQHJldHVybiB0aGUgZnVsbHkgcXVhbGlmaWVkIHBhdGggdG8gQW50IGhvbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFudEhvbWUoKSB7Ci0JCXJldHVybiBhbnRIb21lOwotCX0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvYW50L2NvcmUvQW50UnVubmVyLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc3JjL29yZy9lY2xpcHNlL2FudC9jb3JlL0FudFJ1bm5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjFkNzAzLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvYW50L2NvcmUvQW50UnVubmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuY29yZTsKLQotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmNvcmUuQW50Q2xhc3NMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmNvcmUuSUFudENvcmVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmNvcmUuSW50ZXJuYWxDb3JlQW50TWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ib290LkJvb3RMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ib290LklQbGF0Zm9ybVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotCi0vKioKLSAqIEVudHJ5IHBvaW50IGZvciBydW5uaW5nIEFudCBidWlsZHMgaW5zaWRlIEVjbGlwc2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBBbnRSdW5uZXIgaW1wbGVtZW50cyBJUGxhdGZvcm1SdW5uYWJsZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGJ1aWxkUnVubmluZz0gZmFsc2U7Ci0JcHJvdGVjdGVkIFN0cmluZyBidWlsZEZpbGVMb2NhdGlvbiA9IElBbnRDb3JlQ29uc3RhbnRzLkRFRkFVTFRfQlVJTERfRklMRU5BTUU7Ci0JcHJvdGVjdGVkIExpc3QgYnVpbGRMaXN0ZW5lcnM7Ci0JcHJvdGVjdGVkIFN0cmluZ1tdIHRhcmdldHM7Ci0JcHJvdGVjdGVkIE1hcCB1c2VyUHJvcGVydGllczsKLQlwcm90ZWN0ZWQgaW50IG1lc3NhZ2VPdXRwdXRMZXZlbCA9IDI7IC8vIFByb2plY3QuTVNHX0lORk8KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkTG9nZ2VyQ2xhc3NOYW1lOwotCXByb3RlY3RlZCBTdHJpbmcgaW5wdXRIYW5kbGVyQ2xhc3NOYW1lOwotCXByb3RlY3RlZCBTdHJpbmdbXSBhcmd1bWVudHM7Ci0JcHJvdGVjdGVkIFN0cmluZ1tdIHByb3BlcnR5RmlsZXM7Ci0JcHJvdGVjdGVkIFVSTFtdIGN1c3RvbUNsYXNzcGF0aDsKLQlwcm90ZWN0ZWQgU3RyaW5nIGFudEhvbWU7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBidWlsZCBmaWxlIGxvY2F0aW9uIG9uIHRoZSBmaWxlIHN5c3RlbS4KLQkgKiAKLQkgKiBAcGFyYW0gYnVpbGRGaWxlTG9jYXRpb24gdGhlIGZpbGUgc3lzdGVtIGxvY2F0aW9uIG9mIHRoZSBidWlsZCBmaWxlCi0JICovCi0JcHVibGljIHZvaWQgc2V0QnVpbGRGaWxlTG9jYXRpb24oU3RyaW5nIGJ1aWxkRmlsZUxvY2F0aW9uKSB7Ci0JCWlmIChidWlsZEZpbGVMb2NhdGlvbiA9PSBudWxsKSB7Ci0JCQl0aGlzLmJ1aWxkRmlsZUxvY2F0aW9uID0gSUFudENvcmVDb25zdGFudHMuREVGQVVMVF9CVUlMRF9GSUxFTkFNRTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuYnVpbGRGaWxlTG9jYXRpb24gPSBidWlsZEZpbGVMb2NhdGlvbjsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgbWVzc2FnZSBvdXRwdXQgbGV2ZWwuCi0JICogPHA+Ci0JICogVmFsaWQgdmFsdWVzIGFyZToKLQkgKiA8dWw+Ci0JICogPGxpPjxjb2RlPm9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3QuRVJSPC9jb2RlPiwgCi0JICogPGxpPjxjb2RlPm9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3QuV0FSTjwvY29kZT4sCi0JICogPGxpPjxjb2RlPm9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3QuSU5GTzwvY29kZT4sCi0JICogPGxpPjxjb2RlPm9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3QuVkVSQk9TRTwvY29kZT4gb3IKLQkgKiA8bGk+PGNvZGU+b3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdC5ERUJVRzwvY29kZT4KLQkgKiA8L3VsPgotCSAqIAotCSAqIEBwYXJhbSBsZXZlbCB0aGUgbWVzc2FnZSBvdXRwdXQgbGV2ZWwKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXNzYWdlT3V0cHV0TGV2ZWwoaW50IGxldmVsKSB7Ci0JCW1lc3NhZ2VPdXRwdXRMZXZlbCA9IGxldmVsOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGFyZ3VtZW50cyB0byBiZSBwYXNzZWQgdG8gdGhlIGJ1aWxkIChlLmcuIC1Eb3M9d2luMzIgLUR3cz13aW4zMgotCSAqIC0gdmVyYm9zZSkuCi0JICogCi0JICogQHBhcmFtIGFyZ3VtZW50cyB0aGUgYXJndW1lbnRzIHRvIGJlIHBhc3NlZCB0byB0aGUgYnVpbGQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBcmd1bWVudHMoU3RyaW5nIGFyZ3VtZW50cykgewotCQl0aGlzLmFyZ3VtZW50cyA9IGdldEFycmF5KGFyZ3VtZW50cyk7Ci0JfQotCi0JLyoqCi0JICogSGVscGVyIG1ldGhvZCB0byBlbnN1cmUgYW4gYXJyYXkgaXMgY29udmVydGVkIGludG8gYW4gQXJyYXlMaXN0LgotCSAqLwotCXByaXZhdGUgU3RyaW5nW10gZ2V0QXJyYXkoU3RyaW5nIGFyZ3MpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlib29sZWFuIHdhaXRpbmdGb3JRdW90ZSA9IGZhbHNlOwotCQlBcnJheUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKFN0cmluZ1Rva2VuaXplciB0b2tlbnMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGFyZ3MsICIsIFwiIiwgdHJ1ZSk7IHRva2Vucy5oYXNNb3JlVG9rZW5zKCk7KSB7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyB0b2tlbiA9IHRva2Vucy5uZXh0VG9rZW4oKTsKLQkJCWlmICh3YWl0aW5nRm9yUXVvdGUpIHsKLQkJCQlpZiAodG9rZW4uZXF1YWxzKCJcIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcmVzdWx0LmFkZChzYi50b1N0cmluZygpKTsKLQkJCQkJc2Iuc2V0TGVuZ3RoKDApOwotCQkJCQl3YWl0aW5nRm9yUXVvdGUgPSBmYWxzZTsKLQkJCQl9IGVsc2UgewotCQkJCQlzYi5hcHBlbmQodG9rZW4pOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHRva2VuLmVxdWFscygiXCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCS8vIHRlc3QgaWYgd2UgaGF2ZSBzb21ldGhpbmcgbGlrZSAtRHByb3BlcnR5PSJ2YWx1ZSIKLQkJCQkJaWYgKHJlc3VsdC5zaXplKCkgPiAwKSB7Ci0JCQkJCQlpbnQgaW5kZXggPSByZXN1bHQuc2l6ZSgpIC0gMTsKLQkJCQkJCVN0cmluZyBsYXN0ID0gKFN0cmluZykgcmVzdWx0LmdldChpbmRleCk7Ci0JCQkJCQlpZiAobGFzdC5jaGFyQXQobGFzdC5sZW5ndGgoKSAtIDEpID09ICc9JykgewotCQkJCQkJCXJlc3VsdC5yZW1vdmUoaW5kZXgpOwotCQkJCQkJCXNiLmFwcGVuZChsYXN0KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQl3YWl0aW5nRm9yUXVvdGUgPSB0cnVlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmICghKHRva2VuLmVxdWFscygiLCIpIHx8IHRva2VuLmVxdWFscygiICIpKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQlyZXN1bHQuYWRkKHRva2VuKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChTdHJpbmdbXSkgcmVzdWx0LnRvQXJyYXkobmV3IFN0cmluZ1tyZXN1bHQuc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgYXJndW1lbnRzIHRvIGJlIHBhc3NlZCB0byB0aGUgYnVpbGQgKGUuZy4gLURvcz13aW4zMiAtRHdzPXdpbjMyIC12ZXJib3NlKS4KLQkgKiAKLQkgKiBAcGFyYW0gYXJndW1lbnRzIHRoZSBhcmd1bWVudHMgdG8gYmUgcGFzc2VkIHRvIHRoZSBidWlsZAotCSAqIEBzaW5jZSAyLjEKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBcmd1bWVudHMoU3RyaW5nW10gYXJndW1lbnRzKSB7Ci0JCXRoaXMuYXJndW1lbnRzID0gYXJndW1lbnRzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHRhcmdldHMgYW5kIGV4ZWN1dGlvbiBvcmRlci4KLQkgKiAKLQkgKiBAcGFyYW0gZXhlY3V0aW9uVGFyZ2V0cyB3aGljaCB0YXJnZXRzIHNob3VsZCBiZSBydW4gYW5kIGluIHdoaWNoIG9yZGVyCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXhlY3V0aW9uVGFyZ2V0cyhTdHJpbmdbXSBleGVjdXRpb25UYXJnZXRzKSB7Ci0JCXRoaXMudGFyZ2V0cyA9IGV4ZWN1dGlvblRhcmdldHM7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIGJ1aWxkIGxpc3RlbmVyLiBUaGUgcGFyYW1ldGVyIDxjb2RlPmNsYXNzTmFtZTwvY29kZT4KLQkgKiBpcyB0aGUgY2xhc3MgbmFtZSBvZiBhIDxjb2RlPm9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkTGlzdGVuZXI8L2NvZGU+Ci0JICogaW1wbGVtZW50YXRpb24uIFRoZSBjbGFzcyB3aWxsIGJlIGluc3RhbnRpYXRlZCBhdCBydW50aW1lIGFuZCB0aGUKLQkgKiBsaXN0ZW5lciB3aWxsIGJlIGNhbGxlZCBvbiBidWlsZCBldmVudHMKLQkgKiAoPGNvZGU+b3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFdmVudDwvY29kZT4pLgotCSAqCi0JICogQHBhcmFtIGNsYXNzTmFtZSBhIGJ1aWxkIGxpc3RlbmVyIGNsYXNzIG5hbWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRCdWlsZExpc3RlbmVyKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJaWYgKGNsYXNzTmFtZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGJ1aWxkTGlzdGVuZXJzID09IG51bGwpIHsKLQkJCWJ1aWxkTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCg1KTsKLQkJfQotCQlidWlsZExpc3RlbmVycy5hZGQoY2xhc3NOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBidWlsZCBsb2dnZXIuIFRoZSBwYXJhbWV0ZXIgPGNvZGU+Y2xhc3NOYW1lPC9jb2RlPgotCSAqIGlzIHRoZSBjbGFzcyBuYW1lIG9mIGEgPGNvZGU+b3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMb2dnZXI8L2NvZGU+Ci0JICogaW1wbGVtZW50YXRpb24uIFRoZSBjbGFzcyB3aWxsIGJlIGluc3RhbnRpYXRlZCBhdCBydW50aW1lIGFuZCB0aGUKLQkgKiBsb2dnZXIgd2lsbCBiZSBjYWxsZWQgb24gYnVpbGQgZXZlbnRzCi0JICogKDxjb2RlPm9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXZlbnQ8L2NvZGU+KS4gIAotCSAqIE9ubHkgb25lIGJ1aWxkIGxvZ2dlciBpcyBwZXJtaXR0ZWQgZm9yIGFueSBidWlsZC4KLQkgKiAKLQkgKgotCSAqIEBwYXJhbSBjbGFzc05hbWUgYSBidWlsZCBsb2dnZXIgY2xhc3MgbmFtZQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEJ1aWxkTG9nZ2VyKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJYnVpbGRMb2dnZXJDbGFzc05hbWUgPSBjbGFzc05hbWU7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB1c2VyLWRlZmluZWQgcHJvcGVydGllcy4gS2V5cyBhbmQgdmFsdWVzIG11c3QgYmUgU3RyaW5nIG9iamVjdHMuCi0JICogCi0JICogQHBhcmFtIHByb3BlcnRpZXMgYSBNYXAgb2YgdXNlci1kZWZpbmVkIHByb3BlcnRpZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRVc2VyUHJvcGVydGllcyhNYXAgcHJvcGVydGllcykgewotCQl1c2VyUHJvcGVydGllcyA9IHByb3BlcnRpZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYnVpbGQgZmlsZSB0YXJnZXQgaW5mb3JtYXRpb24uCi0JICogCi0JICogQHJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHRoZSB0YXJnZXQgaW5mb3JtYXRpb24KLQkgKiAKLQkgKiBAc2VlIFRhcmdldEluZm8KLQkgKiBAc2luY2UgMi4xCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBUYXJnZXRJbmZvW10gZ2V0QXZhaWxhYmxlVGFyZ2V0cygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJQ2xhc3MgY2xhc3NJbnRlcm5hbEFudFJ1bm5lcj0gbnVsbDsKLQkJT2JqZWN0IHJ1bm5lcj0gbnVsbDsKLQkJQ2xhc3NMb2FkZXIgb3JpZ2luYWxDbGFzc0xvYWRlcj0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLQkJdHJ5IHsKLQkJCUNsYXNzTG9hZGVyIGxvYWRlciA9IEFudENvcmVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TmV3Q2xhc3NMb2FkZXIoKTsKLQkJCVRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKGxvYWRlcik7Ci0JCQljbGFzc0ludGVybmFsQW50UnVubmVyID0gbG9hZGVyLmxvYWRDbGFzcygib3JnLmVjbGlwc2UuYW50LmludGVybmFsLmNvcmUuYW50LkludGVybmFsQW50UnVubmVyIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJ1bm5lciA9IGNsYXNzSW50ZXJuYWxBbnRSdW5uZXIubmV3SW5zdGFuY2UoKTsKLQkJCS8vIHNldCBidWlsZCBmaWxlCi0JCQlNZXRob2Qgc2V0QnVpbGRGaWxlTG9jYXRpb24gPSBjbGFzc0ludGVybmFsQW50UnVubmVyLmdldE1ldGhvZCgic2V0QnVpbGRGaWxlTG9jYXRpb24iLCBuZXcgQ2xhc3NbXSB7IFN0cmluZy5jbGFzcyB9KTsgLy8kTk9OLU5MUy0xJAotCQkJc2V0QnVpbGRGaWxlTG9jYXRpb24uaW52b2tlKHJ1bm5lciwgbmV3IE9iamVjdFtdIHsgYnVpbGRGaWxlTG9jYXRpb24gfSk7Ci0JCQkKLQkJCXNldFByb3BlcnRpZXMocnVubmVyLCBjbGFzc0ludGVybmFsQW50UnVubmVyKTsKLQkJCQotCQkJaWYgKGFyZ3VtZW50cyAhPSBudWxsICYmIGFyZ3VtZW50cy5sZW5ndGggPiAwKSB7Ci0JCQkJTWV0aG9kIHNldEFyZ3VtZW50cyA9IGNsYXNzSW50ZXJuYWxBbnRSdW5uZXIuZ2V0TWV0aG9kKCJzZXRBcmd1bWVudHMiLCBuZXcgQ2xhc3NbXSB7IFN0cmluZ1tdLmNsYXNzIH0pOyAvLyROT04tTkxTLTEkCi0JCQkJc2V0QXJndW1lbnRzLmludm9rZShydW5uZXIsIG5ldyBPYmplY3RbXSB7IGFyZ3VtZW50cyB9KTsKLQkJCX0KLQkJCQkJCQotCQkJLy8gZ2V0IHRoZSBpbmZvIGZvciBlYWNoIHRhcmdldHMKLQkJCU1ldGhvZCBnZXRUYXJnZXRzID0gY2xhc3NJbnRlcm5hbEFudFJ1bm5lci5nZXRNZXRob2QoImdldFRhcmdldHMiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJT2JqZWN0IHJlc3VsdHMgPSBnZXRUYXJnZXRzLmludm9rZShydW5uZXIsIG51bGwpOwotCQkJLy8gZ2V0IHRoZSBkZWZhdWx0IHRhcmdldAotCQkJTWV0aG9kIGdldERlZmF1bHQ9IGNsYXNzSW50ZXJuYWxBbnRSdW5uZXIuZ2V0TWV0aG9kKCJnZXREZWZhdWx0VGFyZ2V0IiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBkZWZhdWx0TmFtZT0gKFN0cmluZylnZXREZWZhdWx0Lmludm9rZShydW5uZXIsIG51bGwpOwotCQkJLy8gY29sbGVjdCB0aGUgaW5mbyBpbnRvIHRhcmdldCBvYmplY3RzCi0JCQlMaXN0IGluZm9zID0gKExpc3QpIHJlc3VsdHM7Ci0JCQkKLQkJCVByb2plY3RJbmZvIHByb2plY3Q9IG5ldyBQcm9qZWN0SW5mbygoU3RyaW5nKWluZm9zLnJlbW92ZSgwKSwgKFN0cmluZylpbmZvcy5yZW1vdmUoMCkpOwotCQkJaW50IGk9IDA7Ci0JCQlJdGVyYXRvciBpdGVyPSBpbmZvcy5pdGVyYXRvcigpOwotCQkJTGlzdCBpbmZvOwotCQkJVGFyZ2V0SW5mb1tdIHRhcmdldHM9IG5ldyBUYXJnZXRJbmZvW2luZm9zLnNpemUoKV07Ci0JCQkKLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCWluZm89IChMaXN0KWl0ZXIubmV4dCgpOwotCQkJCXRhcmdldHNbaSsrXSA9IG5ldyBUYXJnZXRJbmZvKHByb2plY3QsIChTdHJpbmcpaW5mby5nZXQoMCksIChTdHJpbmcpaW5mby5nZXQoMSksIChTdHJpbmdbXSlpbmZvLmdldCgyKSwgaW5mby5nZXQoMCkuZXF1YWxzKGRlZmF1bHROYW1lKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gdGFyZ2V0czsKLQkJfSBjYXRjaCAoTm9DbGFzc0RlZkZvdW5kRXJyb3IgZSkgewotCQkJcHJvYmxlbUxvYWRpbmdDbGFzcyhlKTsKLQkJCS8vbm90IHBvc3NpYmxlIHRvIHJlYWNoIHRoaXMgbGluZQotCQkJcmV0dXJuIG5ldyBUYXJnZXRJbmZvWzBdOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCXByb2JsZW1Mb2FkaW5nQ2xhc3MoZSk7Ci0JCQkvL25vdCBwb3NzaWJsZSB0byByZWFjaCB0aGlzIGxpbmUKLQkJCXJldHVybiBuZXcgVGFyZ2V0SW5mb1swXTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQloYW5kbGVJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKHJ1bm5lciwgY2xhc3NJbnRlcm5hbEFudFJ1bm5lciwgZSk7Ci0JCQkvL25vdCBwb3NzaWJsZSB0byByZWFjaCB0aGlzIGxpbmUKLQkJCXJldHVybiBuZXcgVGFyZ2V0SW5mb1swXTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVN0cmluZyBtZXNzYWdlID0gKGUuZ2V0TWVzc2FnZSgpID09IG51bGwpID8gSW50ZXJuYWxDb3JlQW50TWVzc2FnZXMuZ2V0U3RyaW5nKCJBbnRSdW5uZXIuQnVpbGRfRmFpbGVkLl8zIikgOiBlLmdldE1lc3NhZ2UoKTsgLy8kTk9OLU5MUy0xJAotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBbnRDb3JlUGx1Z2luLlBJX0FOVENPUkUsIEFudENvcmVQbHVnaW4uRVJST1JfUlVOTklOR19CVUlMRCwgbWVzc2FnZSwgZSkpOwotCQl9IGZpbmFsbHkgewotCQkJVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIob3JpZ2luYWxDbGFzc0xvYWRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSdW5zIHRoZSBidWlsZCBmaWxlLiBJZiBhIHByb2dyZXNzIG1vbml0b3IgaXMgc3BlY2lmaWVkIGl0IHdpbGwgYmUKLQkgKiBhdmFpbGFibGUgZHVyaW5nIHRoZSBzY3JpcHQgZXhlY3V0aW9uIGFzIGEgcmVmZXJlbmNlIGluIHRoZSBBbnQgUHJvamVjdAotCSAqICg8Y29kZT5vcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0LmdldFJlZmVyZW5jZXMoKTwvY29kZT4pLiBBIGxvbmctCi0JICogcnVubmluZyB0YXNrIGNvdWxkLCBmb3IgZXhhbXBsZSwgZ2V0IHRoZSBtb25pdG9yIGR1cmluZyBpdHMgZXhlY3V0aW9uIGFuZAotCSAqIGNoZWNrIGZvciBjYW5jZWxsYXRpb24uIFRoZSBrZXkgdmFsdWUgdG8gcmV0cmlldmUgdGhlIHByb2dyZXNzIG1vbml0b3IKLQkgKiBpbnN0YW5jZSBpcyA8Y29kZT5BbnRDb3JlUGx1Z2luLkVDTElQU0VfUFJPR1JFU1NfTU9OSVRPUjwvY29kZT4uCi0JICogCi0JICogT25seSBvbmUgYnVpbGQgY2FuIG9jY3VyIGF0IGFueSBnaXZlbiB0aW1lLgotCSAqIAotCSAqIFNldHMgdGhlIGN1cnJlbnQgdGhyZWFkcyBjb250ZXh0IGNsYXNzIGxvYWRlciB0byB0aGUgQW50Q2xhc3NMb2FkZXIKLQkgKiBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBidWlsZC4KLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoYnVpbGRSdW5uaW5nKSB7Ci0JCQlJU3RhdHVzIHN0YXR1cz0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBbnRDb3JlUGx1Z2luLlBJX0FOVENPUkUsIEFudENvcmVQbHVnaW4uRVJST1JfUlVOTklOR19CVUlMRCwgTWVzc2FnZUZvcm1hdC5mb3JtYXQoSW50ZXJuYWxDb3JlQW50TWVzc2FnZXMuZ2V0U3RyaW5nKCJBbnRSdW5uZXIuQWxyZWFkeV9pbl9wcm9nZXNzIiksIG5ldyBTdHJpbmdbXXtidWlsZEZpbGVMb2NhdGlvbn0pLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzKTsKLQkJfQotCQlidWlsZFJ1bm5pbmc9IHRydWU7Ci0JCU9iamVjdCBydW5uZXI9IG51bGw7Ci0JCUNsYXNzIGNsYXNzSW50ZXJuYWxBbnRSdW5uZXI9IG51bGw7Ci0JCUNsYXNzTG9hZGVyIG9yaWdpbmFsQ2xhc3NMb2FkZXI9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7Ci0JCXRyeSB7Ci0JCQlDbGFzc0xvYWRlciBsb2FkZXIgPSBnZXRDbGFzc0xvYWRlcigpOwotCQkJVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIobG9hZGVyKTsKLQkJCWNsYXNzSW50ZXJuYWxBbnRSdW5uZXIgPSBsb2FkZXIubG9hZENsYXNzKCJvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwuY29yZS5hbnQuSW50ZXJuYWxBbnRSdW5uZXIiKTsgLy8kTk9OLU5MUy0xJAotCQkJcnVubmVyID0gY2xhc3NJbnRlcm5hbEFudFJ1bm5lci5uZXdJbnN0YW5jZSgpOwotCQkJLy8gc2V0IGJ1aWxkIGZpbGUKLQkJCU1ldGhvZCBzZXRCdWlsZEZpbGVMb2NhdGlvbiA9IGNsYXNzSW50ZXJuYWxBbnRSdW5uZXIuZ2V0TWV0aG9kKCJzZXRCdWlsZEZpbGVMb2NhdGlvbiIsIG5ldyBDbGFzc1tdIHsgU3RyaW5nLmNsYXNzIH0pOyAvLyROT04tTkxTLTEkCi0JCQlzZXRCdWlsZEZpbGVMb2NhdGlvbi5pbnZva2UocnVubmVyLCBuZXcgT2JqZWN0W10geyBidWlsZEZpbGVMb2NhdGlvbiB9KTsKLQkJCS8vIGFkZCBsaXN0ZW5lcnMKLQkJCWlmIChidWlsZExpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJTWV0aG9kIGFkZEJ1aWxkTGlzdGVuZXJzID0gY2xhc3NJbnRlcm5hbEFudFJ1bm5lci5nZXRNZXRob2QoImFkZEJ1aWxkTGlzdGVuZXJzIiwgbmV3IENsYXNzW10geyBMaXN0LmNsYXNzIH0pOyAvLyROT04tTkxTLTEkCi0JCQkJYWRkQnVpbGRMaXN0ZW5lcnMuaW52b2tlKHJ1bm5lciwgbmV3IE9iamVjdFtdIHsgYnVpbGRMaXN0ZW5lcnMgfSk7Ci0JCQl9Ci0JCQkKLQkJCWlmIChidWlsZExvZ2dlckNsYXNzTmFtZSA9PSBudWxsKSB7Ci0JCQkJLy9pbmRpY2F0ZSB0aGF0IHRoZSBkZWZhdWx0IGxvZ2dlciBpcyBub3QgdG8gYmUgdXNlZAotCQkJCWJ1aWxkTG9nZ2VyQ2xhc3NOYW1lPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJLy8gYWRkIGJ1aWxkIGxvZ2dlcgotCQkJTWV0aG9kIGFkZEJ1aWxkTG9nZ2VyID0gY2xhc3NJbnRlcm5hbEFudFJ1bm5lci5nZXRNZXRob2QoImFkZEJ1aWxkTG9nZ2VyIiwgbmV3IENsYXNzW10geyBTdHJpbmcuY2xhc3MgfSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFkZEJ1aWxkTG9nZ2VyLmludm9rZShydW5uZXIsIG5ldyBPYmplY3RbXSB7IGJ1aWxkTG9nZ2VyQ2xhc3NOYW1lIH0pOwotCQkJCi0JCQlpZiAoaW5wdXRIYW5kbGVyQ2xhc3NOYW1lICE9IG51bGwpIHsJCi0JCQkJLy8gYWRkIHRoZSBpbnB1dCBoYW5kbGVyCi0JCQkJTWV0aG9kIHNldElucHV0SGFuZGxlciA9IGNsYXNzSW50ZXJuYWxBbnRSdW5uZXIuZ2V0TWV0aG9kKCJzZXRJbnB1dEhhbmRsZXIiLCBuZXcgQ2xhc3NbXSB7IFN0cmluZy5jbGFzcyB9KTsgLy8kTk9OLU5MUy0xJAotCQkJCXNldElucHV0SGFuZGxlci5pbnZva2UocnVubmVyLCBuZXcgT2JqZWN0W10geyBpbnB1dEhhbmRsZXJDbGFzc05hbWUgfSk7Ci0JCQl9Ci0JCQkKLQkJCWlmIChhbnRIb21lICE9IG51bGwpIHsJCi0JCQkJTWV0aG9kIHNldEFudEhvbWUgPSBjbGFzc0ludGVybmFsQW50UnVubmVyLmdldE1ldGhvZCgic2V0QW50SG9tZSIsIG5ldyBDbGFzc1tdIHsgU3RyaW5nLmNsYXNzIH0pOyAvLyROT04tTkxTLTEkCi0JCQkJc2V0QW50SG9tZS5pbnZva2UocnVubmVyLCBuZXcgT2JqZWN0W10geyBhbnRIb21lIH0pOwotCQkJfQotCQkJCi0JCQkvLyBhZGQgcHJvZ3Jlc3MgbW9uaXRvcgotCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgewotCQkJCU1ldGhvZCBzZXRQcm9ncmVzc01vbml0b3IgPSBjbGFzc0ludGVybmFsQW50UnVubmVyLmdldE1ldGhvZCgic2V0UHJvZ3Jlc3NNb25pdG9yIiwgbmV3IENsYXNzW10geyBJUHJvZ3Jlc3NNb25pdG9yLmNsYXNzIH0pOyAvLyROT04tTkxTLTEkCi0JCQkJc2V0UHJvZ3Jlc3NNb25pdG9yLmludm9rZShydW5uZXIsIG5ldyBPYmplY3RbXSB7IG1vbml0b3IgfSk7Ci0JCQl9Ci0JCQkKLQkJCXNldFByb3BlcnRpZXMocnVubmVyLCBjbGFzc0ludGVybmFsQW50UnVubmVyKTsKLQkJCQotCQkJLy8gc2V0IG1lc3NhZ2Ugb3V0cHV0IGxldmVsCi0JCQlNZXRob2Qgc2V0TWVzc2FnZU91dHB1dExldmVsID0gY2xhc3NJbnRlcm5hbEFudFJ1bm5lci5nZXRNZXRob2QoInNldE1lc3NhZ2VPdXRwdXRMZXZlbCIsIG5ldyBDbGFzc1tdIHsgaW50LmNsYXNzIH0pOyAvLyROT04tTkxTLTEkCi0JCQlzZXRNZXNzYWdlT3V0cHV0TGV2ZWwuaW52b2tlKHJ1bm5lciwgbmV3IE9iamVjdFtdIHsgbmV3IEludGVnZXIobWVzc2FnZU91dHB1dExldmVsKX0pOwotCQkJLy8gc2V0IGV4ZWN1dGlvbiB0YXJnZXRzCi0JCQlpZiAodGFyZ2V0cyAhPSBudWxsKSB7Ci0JCQkJTWV0aG9kIHNldEV4ZWN1dGlvblRhcmdldHMgPSBjbGFzc0ludGVybmFsQW50UnVubmVyLmdldE1ldGhvZCgic2V0RXhlY3V0aW9uVGFyZ2V0cyIsIG5ldyBDbGFzc1tdIHsgU3RyaW5nW10uY2xhc3MgfSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlzZXRFeGVjdXRpb25UYXJnZXRzLmludm9rZShydW5uZXIsIG5ldyBPYmplY3RbXSB7IHRhcmdldHMgfSk7Ci0JCQl9IAotCQkJLy8gc2V0IGV4dHJhIGFyZ3VtZW50cwotCQkJaWYgKGFyZ3VtZW50cyAhPSBudWxsICYmIGFyZ3VtZW50cy5sZW5ndGggPiAwKSB7Ci0JCQkJTWV0aG9kIHNldEFyZ3VtZW50cyA9IGNsYXNzSW50ZXJuYWxBbnRSdW5uZXIuZ2V0TWV0aG9kKCJzZXRBcmd1bWVudHMiLCBuZXcgQ2xhc3NbXSB7IFN0cmluZ1tdLmNsYXNzIH0pOyAvLyROT04tTkxTLTEkCi0JCQkJc2V0QXJndW1lbnRzLmludm9rZShydW5uZXIsIG5ldyBPYmplY3RbXSB7IGFyZ3VtZW50cyB9KTsKLQkJCX0KLQkJCS8vIHJ1bgotCQkJTWV0aG9kIHJ1biA9IGNsYXNzSW50ZXJuYWxBbnRSdW5uZXIuZ2V0TWV0aG9kKCJydW4iLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJcnVuLmludm9rZShydW5uZXIsIG51bGwpOwotCQl9IGNhdGNoIChOb0NsYXNzRGVmRm91bmRFcnJvciBlKSB7Ci0JCQlwcm9ibGVtTG9hZGluZ0NsYXNzKGUpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCXByb2JsZW1Mb2FkaW5nQ2xhc3MoZSk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJaGFuZGxlSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihydW5uZXIsIGNsYXNzSW50ZXJuYWxBbnRSdW5uZXIsIGUpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJU3RyaW5nIG1lc3NhZ2UgPSAoZS5nZXRNZXNzYWdlKCkgPT0gbnVsbCkgPyBJbnRlcm5hbENvcmVBbnRNZXNzYWdlcy5nZXRTdHJpbmcoIkFudFJ1bm5lci5CdWlsZF9GYWlsZWQuXzMiKSA6IGUuZ2V0TWVzc2FnZSgpOyAvLyROT04tTkxTLTEkCi0JCQlJU3RhdHVzIHN0YXR1cz0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBbnRDb3JlUGx1Z2luLlBJX0FOVENPUkUsIEFudENvcmVQbHVnaW4uRVJST1JfUlVOTklOR19CVUlMRCwgbWVzc2FnZSwgZSk7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMpOwotCQl9IGZpbmFsbHkgewotCQkJYnVpbGRSdW5uaW5nPSBmYWxzZTsKLQkJCVRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKG9yaWdpbmFsQ2xhc3NMb2FkZXIpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFByb3BlcnRpZXMoT2JqZWN0IHJ1bm5lciwgQ2xhc3MgY2xhc3NJbnRlcm5hbEFudFJ1bm5lcikKLQkJdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCS8vIGFkZCBwcm9wZXJ0aWVzCi0JCWlmICh1c2VyUHJvcGVydGllcyAhPSBudWxsKSB7Ci0JCQlNZXRob2QgYWRkVXNlclByb3BlcnRpZXMgPSBjbGFzc0ludGVybmFsQW50UnVubmVyLmdldE1ldGhvZCgiYWRkVXNlclByb3BlcnRpZXMiLCBuZXcgQ2xhc3NbXSB7IE1hcC5jbGFzcyB9KTsgLy8kTk9OLU5MUy0xJAotCQkJYWRkVXNlclByb3BlcnRpZXMuaW52b2tlKHJ1bm5lciwgbmV3IE9iamVjdFtdIHsgdXNlclByb3BlcnRpZXMgfSk7Ci0JCX0KLQkJCi0JCS8vIGFkZCBwcm9wZXJ0eSBmaWxlcwotCQlpZiAocHJvcGVydHlGaWxlcyAhPSBudWxsKSB7Ci0JCQlNZXRob2QgYWRkUHJvcGVydHlGaWxlcyA9IGNsYXNzSW50ZXJuYWxBbnRSdW5uZXIuZ2V0TWV0aG9kKCJhZGRQcm9wZXJ0eUZpbGVzIiwgbmV3IENsYXNzW10geyBTdHJpbmdbXS5jbGFzcyB9KTsgLy8kTk9OLU5MUy0xJAotCQkJYWRkUHJvcGVydHlGaWxlcy5pbnZva2UocnVubmVyLCBuZXcgT2JqZWN0W10geyBwcm9wZXJ0eUZpbGVzIH0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlcyBleGNlcHRpb25zIHRoYXQgYXJlIGxvYWRlZCBieSB0aGUgQW50IENsYXNzIExvYWRlciBieQotCSAqIGFza2luZyB0aGUgSW50ZXJuYWwgQW50IFJ1bm5lciBjbGFzcyBmb3IgdGhlIGNvcnJlY3QgZXJyb3IgbWVzc2FnZS4KLQkgKiAKLQkgKiBIYW5kbGVzIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9ucywgbmVzdGVkIE5vQ2xhc3NEZWZGb3VuZEVycm9yIGFuZAotCSAqIG5lc3RlZCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihPYmplY3QgcnVubmVyLCBDbGFzcyBjbGFzc0ludGVybmFsQW50UnVubmVyLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJVGhyb3dhYmxlIHJlYWxFeGNlcHRpb24gPSBlLmdldFRhcmdldEV4Y2VwdGlvbigpOwotCQlpZiAocmVhbEV4Y2VwdGlvbiBpbnN0YW5jZW9mIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU3RyaW5nIG1lc3NhZ2U9IG51bGw7Ci0JCWlmIChydW5uZXIgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlNZXRob2QgZ2V0QnVpbGRFcnJvck1lc3NhZ2UgPSBjbGFzc0ludGVybmFsQW50UnVubmVyLmdldE1ldGhvZCgiZ2V0QnVpbGRFeGNlcHRpb25FcnJvck1lc3NhZ2UiLCBuZXcgQ2xhc3NbXSB7IFRocm93YWJsZS5jbGFzcyB9KTsgLy8kTk9OLU5MUy0xJAotCQkJCW1lc3NhZ2U9IChTdHJpbmcpZ2V0QnVpbGRFcnJvck1lc3NhZ2UuaW52b2tlKHJ1bm5lciwgbmV3IE9iamVjdFtdIHsgcmVhbEV4Y2VwdGlvbiB9KTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCS8vZG8gbm90aGluZyBhcyBhbHJlYWR5IGluIGVycm9yIHN0YXRlCi0JCQl9Ci0JCX0KLQkJLy8gSjkgdGhyb3dzIE5vQ2xhc3NEZWZGb3VuZEVycm9yIG5lc3RlZCBpbiBhIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24KLQkJaWYgKG1lc3NhZ2UgPT0gbnVsbCAmJiAoKHJlYWxFeGNlcHRpb24gaW5zdGFuY2VvZiBOb0NsYXNzRGVmRm91bmRFcnJvcikgfHwgKHJlYWxFeGNlcHRpb24gaW5zdGFuY2VvZiBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKSkpIHsKLQkJCXByb2JsZW1Mb2FkaW5nQ2xhc3MocmVhbEV4Y2VwdGlvbik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJYm9vbGVhbiBpbnRlcm5hbEVycm9yPSBmYWxzZTsKLQkJaWYgKG1lc3NhZ2UgPT0gbnVsbCkgewotCQkJLy9lcnJvciBkaWQgbm90IHJlc3VsdCBmcm9tIGEgQnVpbGRFeGNlcHRpb24KLQkJCWludGVybmFsRXJyb3I9IHRydWU7Ci0JCQltZXNzYWdlID0gKHJlYWxFeGNlcHRpb24uZ2V0TWVzc2FnZSgpID09IG51bGwpID8gSW50ZXJuYWxDb3JlQW50TWVzc2FnZXMuZ2V0U3RyaW5nKCJBbnRSdW5uZXIuQnVpbGRfRmFpbGVkLl8zIikgOiByZWFsRXhjZXB0aW9uLmdldE1lc3NhZ2UoKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCUlTdGF0dXMgc3RhdHVzPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFudENvcmVQbHVnaW4uUElfQU5UQ09SRSwgQW50Q29yZVBsdWdpbi5FUlJPUl9SVU5OSU5HX0JVSUxELCBtZXNzYWdlLCByZWFsRXhjZXB0aW9uKTsKLQkJaWYgKGludGVybmFsRXJyb3IpIHsKLQkJCUFudENvcmVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TG9nKCkubG9nKHN0YXR1cyk7Ci0JCX0KLQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcm9ibGVtTG9hZGluZ0NsYXNzKFRocm93YWJsZSBlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBtaXNzaW5nQ2xhc3NOYW1lPSBlLmdldE1lc3NhZ2UoKTsKLQkJU3RyaW5nIG1lc3NhZ2U7Ci0JCWlmIChtaXNzaW5nQ2xhc3NOYW1lICE9IG51bGwpIHsKLQkJCW1pc3NpbmdDbGFzc05hbWU9IG1pc3NpbmdDbGFzc05hbWUucmVwbGFjZSgnLycsICcuJyk7Ci0JCQltZXNzYWdlPSBJbnRlcm5hbENvcmVBbnRNZXNzYWdlcy5nZXRTdHJpbmcoIkFudFJ1bm5lci5Db3VsZF9ub3RfZmluZF9vbmVfb3JfbW9yZV9jbGFzc2VzLl9QbGVhc2VfY2hlY2tfdGhlX0FudF9jbGFzc3BhdGguXzIiKTsgLy8kTk9OLU5MUy0xJAotCQkJbWVzc2FnZT0gTWVzc2FnZUZvcm1hdC5mb3JtYXQobWVzc2FnZSwgbmV3IFN0cmluZ1tde21pc3NpbmdDbGFzc05hbWV9KTsKLQkJfSBlbHNlIHsKLQkJCW1lc3NhZ2U9IEludGVybmFsQ29yZUFudE1lc3NhZ2VzLmdldFN0cmluZygiQW50UnVubmVyLkNvdWxkX25vdF9maW5kX29uZV9vcl9tb3JlX2NsYXNzZXMuX1BsZWFzZV9jaGVja190aGVfQW50X2NsYXNzcGF0aC5fMSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJSVN0YXR1cyBzdGF0dXM9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQW50Q29yZVBsdWdpbi5QSV9BTlRDT1JFLCBBbnRDb3JlUGx1Z2luLkVSUk9SX1JVTk5JTkdfQlVJTEQsIG1lc3NhZ2UsIGUpOwotCQlBbnRDb3JlUGx1Z2luLmdldFBsdWdpbigpLmdldExvZygpLmxvZyhzdGF0dXMpOwotCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMpOwotCX0KLQotCS8qKgotCSAqIFJ1bnMgdGhlIGJ1aWxkIGZpbGUuCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlydW4oKElQcm9ncmVzc01vbml0b3IpIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEludm9rZXMgdGhlIGJ1aWxkaW5nIG9mIGEgcHJvamVjdCBvYmplY3QgYW5kIGV4ZWN1dGVzIGEgYnVpbGQgdXNpbmcgZWl0aGVyIGEgZ2l2ZW4KLQkgKiB0YXJnZXQgb3IgdGhlIGRlZmF1bHQgdGFyZ2V0LiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBydW5uaW5nIEVjbGlwc2UgaGVhZGxlc3MKLQkgKiBhbmQgc3BlY2lmeWluZyA8Y29kZT5vcmcuZWNsaXBzZS5hbnQuY29yZS5hbnRSdW5uZXI8L2NvZGU+IGFzIHRoZSBhcHBsaWNhdGlvbi4KLQkgKiAKLQkgKiBTZXRzIHRoZSBjdXJyZW50IHRocmVhZHMgY29udGV4dCBjbGFzcyBsb2FkZXIgdG8gdGhlIEFudENsYXNzTG9hZGVyCi0JICogZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgYnVpbGQuCi0JICoKLQkgKiBAcGFyYW0gYXJnQXJyYXkgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKLQkgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiBhIHByb2JsZW0gb2NjdXJyZWQgZHVyaW5nIHRoZSBzY3JpcHQgZXhlY3V0aW9uCi0JICovCi0JcHVibGljIE9iamVjdCBydW4oT2JqZWN0IGFyZ0FycmF5KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQ2xhc3NMb2FkZXIgb3JpZ2luYWxDbGFzc0xvYWRlcj0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLQkJdHJ5IHsKLQkJCS8vc2V0IHRoZSBwcmVmZXJlbmNlcyBmb3IgaGVhZGxlc3MgbW9kZQotCQkJQW50Q29yZVBsdWdpbi5nZXRQbHVnaW4oKS5zZXRSdW5uaW5nSGVhZGxlc3MoKTsKLQkJCQotCQkJLy8gQWRkIGRlYnVnIGluZm9ybWF0aW9uIGlmIG5lY2Vzc2FyeSAtIGZpeCBmb3IgYnVnIDU2NzIuCi0JCQkvLyBTaW5jZSB0aGUgcGxhdGZvcm0gcGFyc2VzIHRoZSAtZGVidWcgY29tbWFuZCBsaW5lIGFyZwotCQkJLy8gYW5kIHJlbW92ZXMgaXQgZnJvbSB0aGUgYXJncyBwYXNzZWQgdG8gdGhlIGFwcGxpY2F0aW9ucywKLQkJCS8vIHdlIGhhdmUgdG8gY2hlY2sgaWYgRWNsaXBzZSBpcyBpbiBkZWJ1ZyBtb2RlIGluIG9yZGVyIHRvCi0JCQkvLyBmb3J3YXJkIHRoZSAtZGVidWcgYXJndW1lbnQgdG8gQW50LgotCQkJaWYgKEJvb3RMb2FkZXIuaW5EZWJ1Z01vZGUoKSkgewotCQkJCVN0cmluZ1tdIGFyZ3MgPSAoU3RyaW5nW10pIGFyZ0FycmF5OwotCQkJCVN0cmluZ1tdIG5ld0FyZ3MgPSBuZXcgU3RyaW5nW2FyZ3MubGVuZ3RoICsgMV07Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCW5ld0FyZ3NbaV0gPSBhcmdzW2ldOwotCQkJCX0KLQkJCQluZXdBcmdzW2FyZ3MubGVuZ3RoXSA9ICItZGVidWciOyAvLyROT04tTkxTLTEkCi0JCQkJYXJnQXJyYXkgPSBuZXdBcmdzOwotCQkJfQotCQkJQ2xhc3NMb2FkZXIgbG9hZGVyID0gZ2V0Q2xhc3NMb2FkZXIoKTsKLQkJCVRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKGxvYWRlcik7Ci0JCQlDbGFzcyBjbGFzc0ludGVybmFsQW50UnVubmVyID0gbG9hZGVyLmxvYWRDbGFzcygib3JnLmVjbGlwc2UuYW50LmludGVybmFsLmNvcmUuYW50LkludGVybmFsQW50UnVubmVyIik7IC8vJE5PTi1OTFMtMSQKLQkJCU9iamVjdCBydW5uZXIgPSBjbGFzc0ludGVybmFsQW50UnVubmVyLm5ld0luc3RhbmNlKCk7Ci0JCQlNZXRob2QgcnVuID0gY2xhc3NJbnRlcm5hbEFudFJ1bm5lci5nZXRNZXRob2QoInJ1biIsIG5ldyBDbGFzc1tdIHsgT2JqZWN0LmNsYXNzIH0pOyAvLyROT04tTkxTLTEkCi0JCQlydW4uaW52b2tlKHJ1bm5lciwgbmV3IE9iamVjdFtdIHsgYXJnQXJyYXkgfSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihvcmlnaW5hbENsYXNzTG9hZGVyKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBDbGFzc0xvYWRlciBnZXRDbGFzc0xvYWRlcigpIHsKLQkJaWYgKGN1c3RvbUNsYXNzcGF0aCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gQW50Q29yZVBsdWdpbi5nZXRQbHVnaW4oKS5nZXROZXdDbGFzc0xvYWRlcigpOwotCQl9IGVsc2UgewotCQkJQW50Q29yZVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gQW50Q29yZVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRQcmVmZXJlbmNlcygpOwotCQkJTGlzdCBmdWxsQ2xhc3NwYXRoPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmdWxsQ2xhc3NwYXRoLmFkZEFsbChBcnJheXMuYXNMaXN0KGN1c3RvbUNsYXNzcGF0aCkpOwotCQkJZnVsbENsYXNzcGF0aC5hZGRBbGwoQXJyYXlzLmFzTGlzdChwcmVmZXJlbmNlcy5nZXRFeHRyYUNsYXNzcGF0aFVSTHMoKSkpOwotCQkJcmV0dXJuIG5ldyBBbnRDbGFzc0xvYWRlcigoVVJMW10pZnVsbENsYXNzcGF0aC50b0FycmF5KG5ldyBVUkxbZnVsbENsYXNzcGF0aC5zaXplKCldKSwgcHJlZmVyZW5jZXMuZ2V0UGx1Z2luQ2xhc3NMb2FkZXJzKCkpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGlucHV0IGhhbmRsZXIuIFRoZSBwYXJhbWV0ZXIgPGNvZGU+Y2xhc3NOYW1lPC9jb2RlPgotCSAqIGlzIHRoZSBjbGFzcyBuYW1lIG9mIGEgPGNvZGU+b3JnLmFwYWNoZS50b29scy5hbnQuaW5wdXQuSW5wdXRIYW5kbGVyPC9jb2RlPgotCSAqIGltcGxlbWVudGF0aW9uLiBUaGUgY2xhc3Mgd2lsbCBiZSBpbnN0YW50aWF0ZWQgYXQgcnVudGltZSBhbmQgdGhlCi0JICogaW5wdXQgaGFuZGxlciB3aWxsIGJlIHVzZWQgdG8gcmVzcG9uZCB0byAmbHQ7aW5wdXQmZ3Q7IHJlcXVlc3RzCi0JICogT25seSBvbmUgaW5wdXQgaGFuZGxlciBpcyBwZXJtaXR0ZWQgZm9yIGFueSBidWlsZC4KLQkgKiAKLQkgKiBAcGFyYW0gY2xhc3NOYW1lIGFuIGlucHV0IGhhbmRsZXIgY2xhc3MgbmFtZQotCSAqIEBzaW5jZSAyLjEKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbnB1dEhhbmRsZXIoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlpbnB1dEhhbmRsZXJDbGFzc05hbWU9IGNsYXNzTmFtZTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgcHJvcGVydHkgZmlsZXMuCi0JICogQHBhcmFtIGFycmF5IG9mIHByb3BlcnR5IGZpbGUgcGF0aHMKLQkgKiBAc2luY2UgMi4xCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvcGVydHlGaWxlcyhTdHJpbmdbXSBwcm9wZXJ0eUZpbGVzKSB7Ci0JCXRoaXMucHJvcGVydHlGaWxlcz0gcHJvcGVydHlGaWxlczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjdXN0b20gY2xhc3NwYXRoIHRvIHVzZSBmb3IgdGhpcyBidWlsZAotCSAqIEBwYXJhbSBhcnJheSBvZiBVUkxzIHRoYXQgZGVmaW5lIHRoZSBjdXN0b20gY2xhc3NwYXRoCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3VzdG9tQ2xhc3NwYXRoKFVSTFtdIGN1c3RvbUNsYXNzcGF0aCkgewotCQl0aGlzLmN1c3RvbUNsYXNzcGF0aCA9IGN1c3RvbUNsYXNzcGF0aDsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgQW50IGhvbWUgdG8gdXNlIGZvciB0aGlzIGJ1aWxkCi0JICogQHBhcmFtIFN0cmluZyBzcGVjaWZ5aW5nIHRoZSBBbnQgaG9tZSB0byB1c2UKLQkgKiBAc2luY2UgMi4xCi0JICovCi0gCXB1YmxpYyB2b2lkIHNldEFudEhvbWUoU3RyaW5nIGFudEhvbWUpIHsKLSAJCXRoaXMuYW50SG9tZT0gYW50SG9tZTsKLSAJfQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciBhbiBBbnQgYnVpbGQgaXMgYWxyZWFkeSBpbiBwcm9ncmVzcwotCSAqIAotCSAqIE9ubHkgb25lIEFudCBidWlsZCBjYW4gb2NjdXIgYXQgYW55IGdpdmVuIHRpbWUuCi0JICogCi0JICogQHNpbmNlIDIuMQotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0J1aWxkUnVubmluZygpIHsKLQkJcmV0dXJuIGJ1aWxkUnVubmluZzsKLQl9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc3JjL29yZy9lY2xpcHNlL2FudC9jb3JlL0FudFNlY3VyaXR5RXhjZXB0aW9uLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc3JjL29yZy9lY2xpcHNlL2FudC9jb3JlL0FudFNlY3VyaXR5RXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ZmQ5MTEuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9hbnQvY29yZS9BbnRTZWN1cml0eUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuY29yZTsKLQotCi0vKioKLSAqIEEgc2VjdXJpdHkgZXhjZXB0aW9uIHRoYXQgaXMgdGhyb3duIGJ5IHRoZSBBbnRTZWN1cml0eU1hbmFnZXIgaWYKLSAqIGFuIEFudCB0YXNrIGluIHNvbWUgd2F5IGF0dGVtcHRzIHRvIGhhbHQgb3IgZXhpdCB0aGUgSmF2YSBWaXJ0dWFsIE1hY2hpbmUuCi0gKiAKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGNsYXNzIEFudFNlY3VyaXR5RXhjZXB0aW9uIGV4dGVuZHMgU2VjdXJpdHlFeGNlcHRpb24gewotCi19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc3JjL29yZy9lY2xpcHNlL2FudC9jb3JlL1Byb2plY3RJbmZvLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc3JjL29yZy9lY2xpcHNlL2FudC9jb3JlL1Byb2plY3RJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNmVlNTYuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9hbnQvY29yZS9Qcm9qZWN0SW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuY29yZTsKLQotCi0vKioKLSAqIFJlcHJlc2VudHMgaW5mb3JtYXRpb24gYWJvdXQgYSBwcm9qZWN0IHdpdGhpbiBhbiBBbnQgYnVpbGQgZmlsZS4KLSAqIEBzaW5jZSAyLjEKLSAqLwotCi1wdWJsaWMgY2xhc3MgUHJvamVjdEluZm8gewotCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZSA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb24gPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgcHJvamVjdCBpbmZvcm1hdGlvbgotCSAqIAotCSAqIEBwYXJhbSBuYW1lIHByb2plY3QgbmFtZQotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbiBhIGJyaWVmIGV4cGxhbmF0aW9uIG9mIHRoZSBwcm9qZWN0J3MgcHVycG9zZSAJCW9yCi0JICogPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IHNwZWNpZmllZAotCSAqLwotCS8qcGFja2FnZSovCi0JUHJvamVjdEluZm8oU3RyaW5nIG5hbWUsIFN0cmluZyBkZXNjcmlwdGlvbikgewotCQl0aGlzLm5hbWUgPSBuYW1lID09IG51bGwgPyAiIiA6IG5hbWU7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHByb2plY3QgbmFtZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwcm9qZWN0IG5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHByb2plY3QgZGVzY3JpcHRpb24gb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8KLQkgKiBkZXNjcmlwdGlvbiBpcyBwcm92aWRlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwcm9qZWN0IGRlc2NyaXB0aW9uIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9hbnQvY29yZS9Qcm9wZXJ0eS5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9hbnQvY29yZS9Qcm9wZXJ0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWIyN2ViLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvYW50L2NvcmUvUHJvcGVydHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmNvcmU7Ci0KLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgQW50IHVzZXIgcHJvcGVydHkuCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eSB7Ci0KLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCXByaXZhdGUgU3RyaW5nIHZhbHVlOwotCi0JcHVibGljIFByb3BlcnR5KFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLQkJdGhpcy5uYW1lPSBuYW1lOwotCQl0aGlzLnZhbHVlPSB2YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgUHJvcGVydHkoKSB7Ci0JfQotCS8qKgotCSAqIEdldHMgdGhlIG5hbWUKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG5hbWUKLQkgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXRoaXMubmFtZT0gbmFtZTsKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIE9iamVjdCNlcXVhbHMoKQotCSAqLwkKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7Ci0JCWlmIChvdGhlci5nZXRDbGFzcygpLmVxdWFscyhnZXRDbGFzcygpKSkgewotCQkJUHJvcGVydHkgZWxlbT0gKFByb3BlcnR5KW90aGVyOwotCQkJcmV0dXJuIG5hbWUuZXF1YWxzKGVsZW0uZ2V0TmFtZSgpKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qCi0JICogQHNlZSBPYmplY3QjaGFzaENvZGUoKQotCSAqLwotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiBuYW1lLmhhc2hDb2RlKCk7Ci0JfQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZS4KLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZS4KLQkgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JfQotCS8qKgotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmY9IG5ldyBTdHJpbmdCdWZmZXIoIlwiIik7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZi5hcHBlbmQoZ2V0TmFtZSgpKTsKLQkJYnVmZi5hcHBlbmQoIlwiPSBcIiIpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmYuYXBwZW5kKGdldFZhbHVlKCkpOwotCQlidWZmLmFwcGVuZCgiXCIiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gYnVmZi50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvYW50L2NvcmUvVGFyZ2V0SW5mby5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9hbnQvY29yZS9UYXJnZXRJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNTBhNTkuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9hbnQvY29yZS9UYXJnZXRJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuY29yZTsKLQotCi0vKioKLSAqIFJlcHJlc2VudHMgaW5mb3JtYXRpb24gYWJvdXQgYSB0YXJnZXQgd2l0aGluIGFuIEFudCBidWlsZCBmaWxlLgotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgY2xhc3MgVGFyZ2V0SW5mbyB7Ci0KLQlwcml2YXRlIFN0cmluZyBuYW1lID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbiA9IG51bGw7Ci0JcHJpdmF0ZSBQcm9qZWN0SW5mbyBwcm9qZWN0ID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZ1tdIGRlcGVuZGVuY2llcyA9IG51bGw7Ci0JcHJpdmF0ZSBib29sZWFuIGlzRGVmYXVsdCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgdGFyZ2V0IGluZm9ybWF0aW9uCi0JICogCi0JICogQHBhcmFtIG5hbWUgdGFyZ2V0IG5hbWUKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24gYSBicmllZiBleHBsYW5hdGlvbiBvZiB0aGUgdGFyZ2V0J3MgcHVycG9zZQotCSAqIAkJb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IHNwZWNpZmllZAotCSAqIEBwYXJhbSBwcm9qZWN0IGVuY2xvc2luZyBwcm9qZWN0Ci0JICogQHBhcmFtIGRlcGVuZGVuY2llcyBuYW1lcyBvZiBwcmVyZXF1aXNpdGUgcHJvamVjdHMgCi0JICogQHBhcmFtIGlzRGVmYXVsdCB3aGV0aGVyIHRoaXMgaXMgdGhlIGJ1aWxkIGZpbGUgZGVmYXVsdCB0YXJnZXQKLQkgKi8KLQkvKnBhY2thZ2UqLwotCVRhcmdldEluZm8oUHJvamVjdEluZm8gcHJvamVjdCwgU3RyaW5nIG5hbWUsIFN0cmluZyBkZXNjcmlwdGlvbiwgU3RyaW5nW10gZGVwZW5kZW5jaWVzLCBib29sZWFuIGlzRGVmYXVsdCkgewotCQl0aGlzLm5hbWUgPSBuYW1lID09IG51bGwgPyAiIiA6IG5hbWU7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQl0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotCQl0aGlzLmRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY2llczsKLQkJdGhpcy5pc0RlZmF1bHQgPSBpc0RlZmF1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGFyZ2V0IG5hbWUuCi0JICogCi0JICogQHJldHVybiB0aGUgdGFyZ2V0IG5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRhcmdldCBkZXNjcmlwdGlvbiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubwotCSAqIGRlc2NyaXB0aW9uIGlzIHByb3ZpZGVkLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRhcmdldCBkZXNjcmlwdGlvbiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBQcm9qZWN0SW5mbyBvZiB0aGUgZW5jbG9zaW5nIHByb2plY3QuCi0JICogCi0JICogQHJldHVybiB0aGUgcHJvamVjdCBpbmZvIGZvciB0aGUgZW5jbG9zaW5nIHByb2plY3QKLQkgKi8KLQlwdWJsaWMgUHJvamVjdEluZm8gZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIHByb2plY3Q7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZXMgb2YgdGhlIHRhcmdldHMgdGhhdCB0aGlzIHRhcmdldCBkZXBlbmRzIG9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGRlcGVuZGVudCBuYW1lcwotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXREZXBlbmRlbmNpZXMoKSB7Ci0JCXJldHVybiBkZXBlbmRlbmNpZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgaXMgdGhlIGJ1aWxkIGZpbGUgZGVmYXVsdCB0YXJnZXQuCi0JICogCi0JICogQHJldHVybiB3aGV0aGVyIHRoaXMgaXMgdGhlIGJ1aWxkIGZpbGUgZGVmYXVsdCB0YXJnZXQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHQoKSB7Ci0JCXJldHVybiBpc0RlZmF1bHQ7Ci0JfQotCS8qKgotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAoIShvYmogaW5zdGFuY2VvZiBUYXJnZXRJbmZvKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVRhcmdldEluZm8gb3RoZXI9IChUYXJnZXRJbmZvKW9iajsKLQkJcmV0dXJuIGdldE5hbWUoKS5lcXVhbHMob3RoZXIuZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjaGFzaENvZGUoKQotCSAqLwotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiBnZXROYW1lKCkuaGFzaENvZGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBnZXROYW1lKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc3JjL29yZy9lY2xpcHNlL2FudC9jb3JlL1Rhc2suamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvYW50L2NvcmUvVGFzay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjlkZjA1Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvYW50L2NvcmUvVGFzay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuY29yZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmNvcmUuQW50T2JqZWN0OwotCi0vKioKLSAqIFJlcHJlc2VudHMgYW4gQW50IHRhc2suCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrIGV4dGVuZHMgQW50T2JqZWN0IHsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHRhc2sKLQkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSB0YXNrCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUYXNrTmFtZSgpIHsKLQkJcmV0dXJuIGZOYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIHRhc2sKLQkgKiBAcGFyYW0gdGFza05hbWUgVGhlIHRhc2tOYW1lIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhc2tOYW1lKFN0cmluZyB0YXNrTmFtZSkgewotCQlmTmFtZT0gdGFza05hbWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9hbnQvY29yZS9UeXBlLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc3JjL29yZy9lY2xpcHNlL2FudC9jb3JlL1R5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTljOGY4ZS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc3JjL29yZy9lY2xpcHNlL2FudC9jb3JlL1R5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmNvcmU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5jb3JlLkFudE9iamVjdDsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGFuIEFudCB0eXBlLgotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgY2xhc3MgVHlwZSBleHRlbmRzIEFudE9iamVjdCB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0eXBlIG5hbWUKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotCQlyZXR1cm4gZk5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdGFza05hbWUuCi0JICogQHBhcmFtIHRhc2tOYW1lIFRoZSB0YXNrTmFtZSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlTmFtZShTdHJpbmcgdGFza05hbWUpIHsKLQkJZk5hbWUgPSB0YXNrTmFtZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc3JjL29yZy9lY2xpcHNlL2FudC9jb3JlL3BhY2thZ2UuaHRtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvYW50L2NvcmUvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTMxMDg5Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvYW50L2NvcmUvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KLTxodG1sPgotPGhlYWQ+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLSAgIDx0aXRsZT5QYWNrYWdlLWxldmVsIEphdmFkb2M8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci1Qcm92aWRlcyBzdXBwb3J0IGZvciBydW5uaW5nIHRoZSBBbnQgYnVpbGQgdG9vbCBpbiB0aGUgcGxhdGZvcm0uCi08aDI+Ci1QYWNrYWdlIFNwZWNpZmljYXRpb248L2gyPgotVGhpcyBwYWNrYWdlIGRlZmluZXMgYSBudW1iZXIgb2YgdGFzayBhbmQgZGF0YSB0eXBlcyBhbmQgdmFyaW91cyBpbmZyYXN0cnVjdHVyZQotcGllY2VzIHdoaWNoIG1ha2UgQW50IGluIHRoZSBwbGF0Zm9ybSBlYXNpZXIgYW5kIG1vcmUgcG93ZXJmdWwuCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9jb3JlL0FudENsYXNzTG9hZGVyLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9jb3JlL0FudENsYXNzTG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkOWUxYTMuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvY29yZS9BbnRDbGFzc0xvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmNvcmU7Ci0KLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuYm9vdC5Cb290TG9hZGVyOwotCi1wdWJsaWMgY2xhc3MgQW50Q2xhc3NMb2FkZXIgZXh0ZW5kcyBVUkxDbGFzc0xvYWRlciB7Ci0KLQlwcm90ZWN0ZWQgQ2xhc3NMb2FkZXJbXSBwbHVnaW5Mb2FkZXJzOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBTlRfUEFDS0FHRVNfUFJFRklYPSAib3JnLmFwYWNoZS50b29scy5hbnQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gRUNMSVBTRV9BTlRfUEFDS0FHRVNfUFJFRklYRVM9IG5ldyBTdHJpbmdbNF07Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBkZXZNb2RlPSBCb290TG9hZGVyLmluRGV2ZWxvcG1lbnRNb2RlKCk7Ci0JCi0Jc3RhdGljIHsKLQkJaWYgKGRldk1vZGUpIHsKLQkJCUVDTElQU0VfQU5UX1BBQ0tBR0VTX1BSRUZJWEVTWzBdPSAib3JnLmVjbGlwc2UuYW50LmludGVybmFsLmNvcmUuYW50IjsgLy8kTk9OLU5MUy0xJAotCQkJRUNMSVBTRV9BTlRfUEFDS0FHRVNfUFJFRklYRVNbMV09ICJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLmludGVybmFsLmFudC5sb2dnZXIiOyAvLyROT04tTkxTLTEkCi0JCQlFQ0xJUFNFX0FOVF9QQUNLQUdFU19QUkVGSVhFU1syXT0gIm9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuaW50ZXJuYWwuYW50LmlucHV0aGFuZGxlciI7IC8vJE5PTi1OTFMtMSQKLQkJCUVDTElQU0VfQU5UX1BBQ0tBR0VTX1BSRUZJWEVTWzNdPSAib3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUuc3VwcG9ydCI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQkKLQlwdWJsaWMgQW50Q2xhc3NMb2FkZXIoVVJMW10gdXJscywgQ2xhc3NMb2FkZXJbXSBwbHVnaW5Mb2FkZXJzKSB7Ci0JCXN1cGVyKHVybHMsIENsYXNzTG9hZGVyLmdldFN5c3RlbUNsYXNzTG9hZGVyKCkpOwotCQl0aGlzLnBsdWdpbkxvYWRlcnMgPSBwbHVnaW5Mb2FkZXJzOwotCX0KLQotCXB1YmxpYyBDbGFzcyBsb2FkQ2xhc3MoU3RyaW5nIG5hbWUpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJQ2xhc3MgcmVzdWx0ID0gbnVsbDsKLQkJLy9kbyBub3QgbG9hZCB0aGUgImJhc2UiIGFudCBjbGFzc2VzIGZyb20gdGhlIHBsdWdpbiBjbGFzcyBsb2FkZXJzIAotCQkvL3RoZXNlIHNob3VsZCBvbmx5IGJlIHNwZWNpZmllZCBmcm9tIHRoZSBBbnQgcnVudGltZSBjbGFzc3BhdGggcHJlZmVyZW5jZXMgc2V0dGluZwotCQlpZiAoIShuYW1lLnN0YXJ0c1dpdGgoQU5UX1BBQ0tBR0VTX1BSRUZJWCkpKSB7Ci0JCQlpZiAoZGV2TW9kZSkgeyAKLQkJCQlpZiAoc2hvdWxkUGx1Z2luc0xvYWQobmFtZSkpIHsKLQkJCQkJcmVzdWx0PSBsb2FkQ2xhc3NQbHVnaW5zKG5hbWUpOwotCQkJCX0KLQkJICAJfSBlbHNlIHsKLQkJCQlyZXN1bHQ9IGxvYWRDbGFzc1BsdWdpbnMobmFtZSk7Ci0JCSAgCX0KLQkJfQotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCXJlc3VsdCA9IGxvYWRDbGFzc1VSTHMobmFtZSk7Ci0JCX0KLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbihuYW1lKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQkvKioKLQkgKiBVc2VkIGR1cmluZyBkZXZlbG9wbWVudCBtb2RlIHRvIGRpc2FsbG93IHBsdWdpbnMgZnJvbSBsb2FkaW5nIGNsYXNzZXMKLQkgKiB0aGF0IHNob3VsZCBiZSBsb2FkZWQgb25seSBiZSB0aGlzIGNsYXNzIGxvYWRlci4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gc2hvdWxkUGx1Z2luc0xvYWQoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBFQ0xJUFNFX0FOVF9QQUNLQUdFU19QUkVGSVhFUy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIHByZWZpeCA9IEVDTElQU0VfQU5UX1BBQ0tBR0VTX1BSRUZJWEVTW2ldOwotCQkJaWYgKG5hbWUuc3RhcnRzV2l0aChwcmVmaXgpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwkKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ2xhc3MgbG9hZENsYXNzVVJMcyhTdHJpbmcgbmFtZSkgewotCQl0cnkgewotCQkJcmV0dXJuIHN1cGVyLmxvYWRDbGFzcyhuYW1lKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBJZ25vcmUgZXhjZXB0aW9uIG5vdy4gSWYgbmVjZXNzYXJ5IHdlJ2xsIHRocm93Ci0JCQkvLyBhIENsYXNzTm90Rm91bmRFeGNlcHRpb24gaW4gbG9hZENsYXNzKFN0cmluZykKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ2xhc3MgbG9hZENsYXNzUGx1Z2lucyhTdHJpbmcgbmFtZSkgewotCQlDbGFzcyByZXN1bHQgPSBudWxsOwotCQlpZiAocGx1Z2luTG9hZGVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgKGkgPCBwbHVnaW5Mb2FkZXJzLmxlbmd0aCkgJiYgKHJlc3VsdCA9PSBudWxsKTsgaSsrKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcmVzdWx0ID0gcGx1Z2luTG9hZGVyc1tpXS5sb2FkQ2xhc3MobmFtZSk7Ci0JCQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIElnbm9yZSBleGNlcHRpb24gbm93LiBJZiBuZWNlc3Nhcnkgd2UnbGwgdGhyb3cKLQkJCQkJLy8gYSBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGluIGxvYWRDbGFzcyhTdHJpbmcpCi0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvY29yZS9BbnRPYmplY3QuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2NvcmUvQW50T2JqZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1MTY4NjAuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvY29yZS9BbnRPYmplY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmNvcmU7Ci0KLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFudE9iamVjdCB7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGZDbGFzc05hbWU7Ci0JcHJvdGVjdGVkIFVSTCBmTGlicmFyeTsKLQlwcm90ZWN0ZWQgU3RyaW5nIGZOYW1lOwotCXByaXZhdGUgYm9vbGVhbiBmSXNEZWZhdWx0PSBmYWxzZTsKLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBjbGFzc05hbWUuCi0JICogQHJldHVybiBSZXR1cm5zIGEgU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0JCXJldHVybiBmQ2xhc3NOYW1lOwotCX0KLQkvKioKLQkgKiBTZXRzIHRoZSBjbGFzc05hbWUuCi0JICogQHBhcmFtIGNsYXNzTmFtZSBUaGUgY2xhc3NOYW1lIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWZDbGFzc05hbWUgPSBjbGFzc05hbWU7Ci0JfQotCS8qKgotCSAqIEdldHMgdGhlIGxpYnJhcnkuCi0JICogQHJldHVybiBSZXR1cm5zIGEgVVJMCi0JICovCi0JcHVibGljIFVSTCBnZXRMaWJyYXJ5KCkgewotCQlyZXR1cm4gZkxpYnJhcnk7Ci0JfQotCS8qKgotCSAqIFNldHMgdGhlIGxpYnJhcnkuCi0JICogQHBhcmFtIGxpYnJhcnkgVGhlIGxpYnJhcnkgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TGlicmFyeShVUkwgbGlicmFyeSkgewotCQlmTGlicmFyeSA9IGxpYnJhcnk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGZOYW1lOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBhbnQgb2JqZWN0IGhhcyBiZWVuIGNyZWF0ZWQgYmVjYXVzZSBvZiBhbiBleHRlbnNpb24KLQkgKiBwb2ludCBkZWZpbml0aW9uLgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdCgpIHsKLQkJcmV0dXJuIGZJc0RlZmF1bHQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGF0IHRoaXMgYW50IG9iamVjdCBoYXMgYmVlbiBjcmVhdGVkIGJ5IHRoZSBhcHByb3ByaWF0ZSBleHRlbnNpb24KLQkgKiBwb2ludC4KLQkgKiBAcGFyYW0gaXNEZWZhdWx0IFdoZXRoZXIgdGhpcyBhbnQgb2JqZWN0IGhhcyBiZWVuIGNyZWF0ZWQgYmVjYXVzZSBvZiBhbgotCSAqIGV4dGVuc2lvbiBwb2ludCBkZWZpbnRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNEZWZhdWx0KGJvb2xlYW4gaXNEZWZhdWx0KSB7Ci0JCXRoaXMuZklzRGVmYXVsdCA9IGlzRGVmYXVsdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2NvcmUvSUFudENvcmVDb25zdGFudHMuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2NvcmUvSUFudENvcmVDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjYzMjQ1YS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9jb3JlL0lBbnRDb3JlQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5jb3JlOwotCi0KLS8qKgotICogQ29tbW9uIGNvbnN0YW50cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJQW50Q29yZUNvbnN0YW50cyB7Ci0KLQkvLyBkZWZhdWx0IHZhbHVlcwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQlVJTERfRklMRU5BTUUgPSAiYnVpbGQueG1sIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gcHJlZmVyZW5jZXMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX1RBU0tTID0gInRhc2tzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfVFlQRVMgPSAidHlwZXMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9VUkxTID0gInVybHMiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX1RBU0sgPSAidGFzay4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX1RZUEUgPSAidHlwZS4iOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogUHJlZmVyZW5jZXMKLQkgKiBAc2luY2UgMi4xCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9BTlRfVVJMUyA9ICJhbnRfdXJscyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX0FOVF9IT01FID0gImFudF9ob21lIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfUFJPUEVSVElFUyA9ICJwcm9wZXJ0aWVzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfUFJPUEVSVFlfRklMRVMgPSAicHJvcGVydHlmaWxlcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfUFJPUEVSVFkgPSAicHJvcGVydHkuIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvY29yZS9JbnRlcm5hbENvcmVBbnRNZXNzYWdlcy5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvY29yZS9JbnRlcm5hbENvcmVBbnRNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Yzc4YjVmLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2NvcmUvSW50ZXJuYWxDb3JlQW50TWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmNvcmU7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1wdWJsaWMgY2xhc3MgSW50ZXJuYWxDb3JlQW50TWVzc2FnZXMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5jb3JlLkludGVybmFsQ29yZUFudE1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2VCdW5kbGUgUkVTT1VSQ0VfQlVORExFID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKEJVTkRMRV9OQU1FKTsKLQotCXByaXZhdGUgSW50ZXJuYWxDb3JlQW50TWVzc2FnZXMoKSB7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBSRVNPVVJDRV9CVU5ETEUuZ2V0U3RyaW5nKGtleSk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gJyEnICsga2V5ICsgJyEnOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvY29yZS9JbnRlcm5hbENvcmVBbnRNZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvY29yZS9JbnRlcm5hbENvcmVBbnRNZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDk5ZTRjLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2NvcmUvSW50ZXJuYWxDb3JlQW50TWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLUFudENvcmVQcmVmZXJlbmNlcy5NYWxmb3JtZWRfVVJMLl8xPU1hbGZvcm1lZCBVUkwuCi1BbnRDb3JlUHJlZmVyZW5jZXMuTGlicmFyeV9ub3Rfc3BlY2lmaWVkX2Zvcl9fezB9XzQ9TGlicmFyeSBub3Qgc3BlY2lmaWVkIGZvcjogezB9Ci1BbnRDb3JlUHJlZmVyZW5jZXMuTm9fbGlicmFyeV9mb3JfdGFzaz1UaGUgbGlicmFyeSB7MH0gc3BlY2lmaWVkIHZpYSB0aGUgYW50VGFza3MgZXh0ZW5zaW9uIHBvaW50IG9mIHsxfSBkb2VzIG5vdCBleGlzdAotQW50Q29yZVByZWZlcmVuY2VzLk5vX2xpYnJhcnlfZm9yX3R5cGU9VGhlIGxpYnJhcnkgezB9IHNwZWNpZmllZCB2aWEgdGhlIGFudFR5cGVzIGV4dGVuc2lvbiBwb2ludCBvZiB7MX0gZG9lcyBub3QgZXhpc3QKLUFudENvcmVQcmVmZXJlbmNlcy5Ob19saWJyYXJ5X2Zvcl9leHRyYUNsYXNzcGF0aEVudHJ5PVRoZSBsaWJyYXJ5IHswfSBzcGVjaWZpZWQgdmlhIHRoZSBleHRyYUNsYXNzcGF0aEVudHJpZXMgZXh0ZW5zaW9uIHBvaW50IG9mIHsxfSBkb2VzIG5vdCBleGlzdAotCi1BbnRSdW5uZXIuQ291bGRfbm90X2ZpbmRfb25lX29yX21vcmVfY2xhc3Nlcy5fUGxlYXNlX2NoZWNrX3RoZV9BbnRfY2xhc3NwYXRoLl8xPUNvdWxkIG5vdCBmaW5kIG9uZSBvciBtb3JlIGNsYXNzZXMuIFBsZWFzZSBjaGVjayB0aGUgQW50IGNsYXNzcGF0aC4KLUFudFJ1bm5lci5Db3VsZF9ub3RfZmluZF9vbmVfb3JfbW9yZV9jbGFzc2VzLl9QbGVhc2VfY2hlY2tfdGhlX0FudF9jbGFzc3BhdGguXzI9Q291bGQgbm90IGZpbmQgb25lIG9yIG1vcmUgY2xhc3NlczogXCJ7MH1cIi4gUGxlYXNlIGNoZWNrIHRoZSBBbnQgY2xhc3NwYXRoLgotQW50UnVubmVyLkJ1aWxkX0ZhaWxlZC5fMz1CVUlMRCBGQUlMRUQKLUFudFJ1bm5lci5BbHJlYWR5X2luX3Byb2dlc3M9QW50IGJ1aWxkIHswfSBhbHJlYWR5IGluIHByb2dyZXNzCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc3JjX2FudC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvY29yZS9hbnQvQW50U2VjdXJpdHlNYW5hZ2VyLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc3JjX2FudC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvY29yZS9hbnQvQW50U2VjdXJpdHlNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyNDYzMzkuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyY19hbnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2NvcmUvYW50L0FudFNlY3VyaXR5TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmNvcmUuYW50OwotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yOwotaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOwotaW1wb3J0IGphdmEubmV0LlNvY2tldFBlcm1pc3Npb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmNvcmUuQW50U2VjdXJpdHlFeGNlcHRpb247Ci0KLS8qKgotICogQSBzZWN1cml0eSBtYW5hZ2VyIHRoYXQgYWx3YXlzIHRocm93cyBhbiA8Y29kZT5BbnRTZWN1cml0eUV4Y2VwdGlvbjwvY29kZT4KLSAqIGlmIHRoZSBjYWxsaW5nIHRocmVhZCBhdHRlbXB0cyB0byBjYXVzZSB0aGUgSmF2YSBWaXJ0dWFsIE1hY2hpbmUgdG8gCi0gKiBleGl0L2hhbHQuCi0gKiBPdGhlcndpc2UgdGhpcyBtYW5hZ2VyIGp1c3QgZGVsZWdhdGVzIHRvIHRoZSBwcmUtZXhpc3RpbmcgbWFuYWdlcgotICogcGFzc2VkIGluIHRoZSBjb25zdHJ1Y3Rvci4KLSAqLwotcHVibGljIGNsYXNzIEFudFNlY3VyaXR5TWFuYWdlciBleHRlbmRzIFNlY3VyaXR5TWFuYWdlciB7Ci0KLQlwcm90ZWN0ZWQgU2VjdXJpdHlNYW5hZ2VyIHNlY3VyaXR5TWFuYWdlcj0gbnVsbDsKLQkKLQlwcm90ZWN0ZWQgQW50U2VjdXJpdHlNYW5hZ2VyKFNlY3VyaXR5TWFuYWdlciBzZWN1cml0eU1hbmFnZXIpIHsKLQkJdGhpcy5zZWN1cml0eU1hbmFnZXI9IHNlY3VyaXR5TWFuYWdlcjsKLQl9Ci0JLyoqCi0JICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2NoZWNrRXhpdChpbnQpCi0JICovCi0JcHVibGljIHZvaWQgY2hlY2tFeGl0KGludCBzdGF0dXMpIHsKLQkJLy9ubyBleGl0IGFsbG93ZWQuLi5TeXN0ZW0uZXhpdCBpcyBiZWluZyBjYWxsZWQKLQkJLy9ieSBzb21lIGFudCB0YXNrLi4uZG8gbm90IHdhbnQgRWNsaXBzZSB0byBleGl0IGlmCi0JCS8vaW4gdGhlIHNhbWUgVk0sCi0JCS8vVGhlIG1lc3NhZ2UgaXMgdXNlZCBpbiBsb2dnZXJzIHRvIGRldGVybWluZSB0aGF0IHRoaXMgaXMKLQkJLy9ub3QgcmVhbGx5IGFuIGV4Y2VwdGlvbiBjYXNlLgotCQl0aHJvdyBuZXcgQW50U2VjdXJpdHlFeGNlcHRpb24oKTsKLQl9Ci0JLyoqCi0JICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2NoZWNrQWNjZXB0KGphdmEubGFuZy5TdHJpbmcsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGVja0FjY2VwdChTdHJpbmcgaG9zdCwgaW50IHBvcnQpIHsKLQkJaWYgKHNlY3VyaXR5TWFuYWdlciAhPSBudWxsKSB7Ci0JCQlzZWN1cml0eU1hbmFnZXIuY2hlY2tBY2NlcHQoaG9zdCwgcG9ydCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tBY2Nlc3MoamF2YS5sYW5nLlRocmVhZCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGVja0FjY2VzcyhUaHJlYWQgdCkgewotCQlpZiAoc2VjdXJpdHlNYW5hZ2VyICE9IG51bGwpIHsKLQkJCXNlY3VyaXR5TWFuYWdlci5jaGVja0FjY2Vzcyh0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja0FjY2VzcyhqYXZhLmxhbmcuVGhyZWFkR3JvdXApCi0JICovCi0JcHVibGljIHZvaWQgY2hlY2tBY2Nlc3MoVGhyZWFkR3JvdXAgZykgewotCQlpZiAoc2VjdXJpdHlNYW5hZ2VyICE9IG51bGwpIHsKLQkJCXNlY3VyaXR5TWFuYWdlci5jaGVja0FjY2VzcyhnKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja0F3dEV2ZW50UXVldWVBY2Nlc3MoKQotCSAqLwotCXB1YmxpYyB2b2lkIGNoZWNrQXd0RXZlbnRRdWV1ZUFjY2VzcygpIHsKLQkJaWYgKHNlY3VyaXR5TWFuYWdlciAhPSBudWxsKSB7Ci0JCQlzZWN1cml0eU1hbmFnZXIuY2hlY2tBd3RFdmVudFF1ZXVlQWNjZXNzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tDb25uZWN0KGphdmEubGFuZy5TdHJpbmcsIGludCwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGVja0Nvbm5lY3QoU3RyaW5nIGhvc3QsIGludCBwb3J0LCBPYmplY3QgY29udGV4dCkgewotCQlpZiAoc2VjdXJpdHlNYW5hZ2VyICE9IG51bGwpIHsKLQkJCXNlY3VyaXR5TWFuYWdlci5jaGVja0Nvbm5lY3QoaG9zdCwgcG9ydCwgY29udGV4dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tDb25uZWN0KGphdmEubGFuZy5TdHJpbmcsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGVja0Nvbm5lY3QoU3RyaW5nIGhvc3QsIGludCBwb3J0KSB7Ci0JCWlmIChzZWN1cml0eU1hbmFnZXIgIT0gbnVsbCkgewotCQkJc2VjdXJpdHlNYW5hZ2VyLmNoZWNrQ29ubmVjdChob3N0LCBwb3J0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja0NyZWF0ZUNsYXNzTG9hZGVyKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGVja0NyZWF0ZUNsYXNzTG9hZGVyKCkgewotCQlpZiAoc2VjdXJpdHlNYW5hZ2VyICE9IG51bGwpIHsKLQkJCXNlY3VyaXR5TWFuYWdlci5jaGVja0NyZWF0ZUNsYXNzTG9hZGVyKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tEZWxldGUoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGVja0RlbGV0ZShTdHJpbmcgZmlsZSkgewotCQlpZiAoc2VjdXJpdHlNYW5hZ2VyICE9IG51bGwpIHsKLQkJCXNlY3VyaXR5TWFuYWdlci5jaGVja0RlbGV0ZShmaWxlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja0V4ZWMoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGVja0V4ZWMoU3RyaW5nIGNtZCkgewotCQlpZiAoc2VjdXJpdHlNYW5hZ2VyICE9IG51bGwpIHsKLQkJCXNlY3VyaXR5TWFuYWdlci5jaGVja0V4ZWMoY21kKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja0xpbmsoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGVja0xpbmsoU3RyaW5nIGxpYikgewotCQlpZiAoc2VjdXJpdHlNYW5hZ2VyICE9IG51bGwpIHsKLQkJCXNlY3VyaXR5TWFuYWdlci5jaGVja0xpbmsobGliKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja0xpc3RlbihpbnQpCi0JICovCi0JcHVibGljIHZvaWQgY2hlY2tMaXN0ZW4oaW50IHBvcnQpIHsKLQkJaWYgKHNlY3VyaXR5TWFuYWdlciAhPSBudWxsKSB7Ci0JCQlzZWN1cml0eU1hbmFnZXIuY2hlY2tMaXN0ZW4ocG9ydCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tNZW1iZXJBY2Nlc3MoamF2YS5sYW5nLkNsYXNzLCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgY2hlY2tNZW1iZXJBY2Nlc3MoQ2xhc3MgY2xhenosIGludCB3aGljaCkgewotCQlpZiAoc2VjdXJpdHlNYW5hZ2VyICE9IG51bGwpIHsKLQkJCXNlY3VyaXR5TWFuYWdlci5jaGVja01lbWJlckFjY2VzcyhjbGF6eiwgd2hpY2gpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2NoZWNrTXVsdGljYXN0KGphdmEubmV0LkluZXRBZGRyZXNzLCBieXRlKQotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JcHVibGljIHZvaWQgY2hlY2tNdWx0aWNhc3QoSW5ldEFkZHJlc3MgbWFkZHIsIGJ5dGUgdHRsKSB7Ci0JCWlmIChzZWN1cml0eU1hbmFnZXIgIT0gbnVsbCkgewotCQkJU3RyaW5nIGhvc3QgPSBtYWRkci5nZXRIb3N0QWRkcmVzcygpOwotCQkJaWYgKCFob3N0LnN0YXJ0c1dpdGgoIlsiKSAmJiBob3N0LmluZGV4T2YoJzonKSAhPSAtMSkgeyAvLyROT04tTkxTLTEkCi0JICAgCQkJaG9zdCA9ICJbIiArIGhvc3QgKyAiXSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCSAgICAJY2hlY2tQZXJtaXNzaW9uKG5ldyBTb2NrZXRQZXJtaXNzaW9uKGhvc3QsICJhY2NlcHQsY29ubmVjdCIpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2NoZWNrTXVsdGljYXN0KGphdmEubmV0LkluZXRBZGRyZXNzKQotCSAqLwotCXB1YmxpYyB2b2lkIGNoZWNrTXVsdGljYXN0KEluZXRBZGRyZXNzIG1hZGRyKSB7Ci0JCWlmIChzZWN1cml0eU1hbmFnZXIgIT0gbnVsbCkgewotCQkJc2VjdXJpdHlNYW5hZ2VyLmNoZWNrTXVsdGljYXN0KG1hZGRyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja1BhY2thZ2VBY2Nlc3MoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGVja1BhY2thZ2VBY2Nlc3MoU3RyaW5nIHBrZykgewotCQlpZiAoc2VjdXJpdHlNYW5hZ2VyICE9IG51bGwpIHsKLQkJCXNlY3VyaXR5TWFuYWdlci5jaGVja1BhY2thZ2VBY2Nlc3MocGtnKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja1BhY2thZ2VEZWZpbml0aW9uKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgY2hlY2tQYWNrYWdlRGVmaW5pdGlvbihTdHJpbmcgcGtnKSB7Ci0JCWlmIChzZWN1cml0eU1hbmFnZXIgIT0gbnVsbCkgewotCQkJc2VjdXJpdHlNYW5hZ2VyLmNoZWNrUGFja2FnZURlZmluaXRpb24ocGtnKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja1Blcm1pc3Npb24oamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uLCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGNoZWNrUGVybWlzc2lvbihQZXJtaXNzaW9uIHBlcm0sIE9iamVjdCBjb250ZXh0KSB7Ci0JCWlmIChzZWN1cml0eU1hbmFnZXIgIT0gbnVsbCkgewotCQkJc2VjdXJpdHlNYW5hZ2VyLmNoZWNrUGVybWlzc2lvbihwZXJtLCBjb250ZXh0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja1Blcm1pc3Npb24oamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGNoZWNrUGVybWlzc2lvbihQZXJtaXNzaW9uIHBlcm0pIHsKLQkJaWYgKHNlY3VyaXR5TWFuYWdlciAhPSBudWxsKSB7Ci0JCQlzZWN1cml0eU1hbmFnZXIuY2hlY2tQZXJtaXNzaW9uKHBlcm0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2NoZWNrUHJpbnRKb2JBY2Nlc3MoKQotCSAqLwotCXB1YmxpYyB2b2lkIGNoZWNrUHJpbnRKb2JBY2Nlc3MoKSB7Ci0JCWlmIChzZWN1cml0eU1hbmFnZXIgIT0gbnVsbCkgewotCQkJc2VjdXJpdHlNYW5hZ2VyLmNoZWNrUHJpbnRKb2JBY2Nlc3MoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja1Byb3BlcnRpZXNBY2Nlc3MoKQotCSAqLwotCXB1YmxpYyB2b2lkIGNoZWNrUHJvcGVydGllc0FjY2VzcygpIHsKLQkJaWYgKHNlY3VyaXR5TWFuYWdlciAhPSBudWxsKSB7Ci0JCQlzZWN1cml0eU1hbmFnZXIuY2hlY2tQcm9wZXJ0aWVzQWNjZXNzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tQcm9wZXJ0eUFjY2VzcyhqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIGNoZWNrUHJvcGVydHlBY2Nlc3MoU3RyaW5nIGtleSkgewotCQlpZiAoc2VjdXJpdHlNYW5hZ2VyICE9IG51bGwpIHsKLQkJCXNlY3VyaXR5TWFuYWdlci5jaGVja1Byb3BlcnR5QWNjZXNzKGtleSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tSZWFkKGphdmEuaW8uRmlsZURlc2NyaXB0b3IpCi0JICovCi0JcHVibGljIHZvaWQgY2hlY2tSZWFkKEZpbGVEZXNjcmlwdG9yIGZkKSB7Ci0JCWlmIChzZWN1cml0eU1hbmFnZXIgIT0gbnVsbCkgewotCQkJc2VjdXJpdHlNYW5hZ2VyLmNoZWNrUmVhZChmZCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tSZWFkKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgY2hlY2tSZWFkKFN0cmluZyBmaWxlLCBPYmplY3QgY29udGV4dCkgewotCQlpZiAoc2VjdXJpdHlNYW5hZ2VyICE9IG51bGwpIHsKLQkJCXNlY3VyaXR5TWFuYWdlci5jaGVja1JlYWQoZmlsZSwgY29udGV4dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tSZWFkKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgY2hlY2tSZWFkKFN0cmluZyBmaWxlKSB7Ci0JCWlmIChzZWN1cml0eU1hbmFnZXIgIT0gbnVsbCkgewotCQkJc2VjdXJpdHlNYW5hZ2VyLmNoZWNrUmVhZChmaWxlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja1NlY3VyaXR5QWNjZXNzKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgY2hlY2tTZWN1cml0eUFjY2VzcyhTdHJpbmcgdGFyZ2V0KSB7Ci0JCWlmIChzZWN1cml0eU1hbmFnZXIgIT0gbnVsbCkgewotCQkJc2VjdXJpdHlNYW5hZ2VyLmNoZWNrU2VjdXJpdHlBY2Nlc3ModGFyZ2V0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja1NldEZhY3RvcnkoKQotCSAqLwotCXB1YmxpYyB2b2lkIGNoZWNrU2V0RmFjdG9yeSgpIHsKLQkJaWYgKHNlY3VyaXR5TWFuYWdlciAhPSBudWxsKSB7Ci0JCQlzZWN1cml0eU1hbmFnZXIuY2hlY2tTZXRGYWN0b3J5KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tTeXN0ZW1DbGlwYm9hcmRBY2Nlc3MoKQotCSAqLwotCXB1YmxpYyB2b2lkIGNoZWNrU3lzdGVtQ2xpcGJvYXJkQWNjZXNzKCkgewotCQlpZiAoc2VjdXJpdHlNYW5hZ2VyICE9IG51bGwpIHsKLQkJCXNlY3VyaXR5TWFuYWdlci5jaGVja1N5c3RlbUNsaXBib2FyZEFjY2VzcygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2NoZWNrVG9wTGV2ZWxXaW5kb3coamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjaGVja1RvcExldmVsV2luZG93KE9iamVjdCB3aW5kb3cpIHsKLQkJaWYgKHNlY3VyaXR5TWFuYWdlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gc2VjdXJpdHlNYW5hZ2VyLmNoZWNrVG9wTGV2ZWxXaW5kb3cod2luZG93KTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2NoZWNrV3JpdGUoamF2YS5pby5GaWxlRGVzY3JpcHRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGVja1dyaXRlKEZpbGVEZXNjcmlwdG9yIGZkKSB7Ci0JCWlmIChzZWN1cml0eU1hbmFnZXIgIT0gbnVsbCkgewotCQkJc2VjdXJpdHlNYW5hZ2VyLmNoZWNrV3JpdGUoZmQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2NoZWNrV3JpdGUoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGVja1dyaXRlKFN0cmluZyBmaWxlKSB7Ci0JCWlmIChzZWN1cml0eU1hbmFnZXIgIT0gbnVsbCkgewotCQkJc2VjdXJpdHlNYW5hZ2VyLmNoZWNrV3JpdGUoZmlsZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2xhc3NEZXB0aChqYXZhLmxhbmcuU3RyaW5nKQotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JcHJvdGVjdGVkIGludCBjbGFzc0RlcHRoKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2xhc3NMb2FkZXJEZXB0aCgpCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGNsYXNzTG9hZGVyRGVwdGgoKSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY3VycmVudENsYXNzTG9hZGVyKCkKLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCXByb3RlY3RlZCBDbGFzc0xvYWRlciBjdXJyZW50Q2xhc3NMb2FkZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjdXJyZW50TG9hZGVkQ2xhc3MoKQotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JcHJvdGVjdGVkIENsYXNzIGN1cnJlbnRMb2FkZWRDbGFzcygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2dldENsYXNzQ29udGV4dCgpCi0JICovCi0JcHJvdGVjdGVkIENsYXNzW10gZ2V0Q2xhc3NDb250ZXh0KCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0Q2xhc3NDb250ZXh0KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2dldEluQ2hlY2soKQotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0SW5DaGVjaygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNnZXRTZWN1cml0eUNvbnRleHQoKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0U2VjdXJpdHlDb250ZXh0KCkgewotCQlpZiAoc2VjdXJpdHlNYW5hZ2VyICE9IG51bGwpIHsKLQkJCXJldHVybiBzZWN1cml0eU1hbmFnZXIuZ2V0U2VjdXJpdHlDb250ZXh0KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2dldFRocmVhZEdyb3VwKCkKLQkgKi8KLQlwdWJsaWMgVGhyZWFkR3JvdXAgZ2V0VGhyZWFkR3JvdXAoKSB7Ci0JCWlmIChzZWN1cml0eU1hbmFnZXIgIT0gbnVsbCkgewotCQkJc2VjdXJpdHlNYW5hZ2VyLmdldFRocmVhZEdyb3VwKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2luQ2xhc3MoamF2YS5sYW5nLlN0cmluZykKLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGluQ2xhc3MoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNpbkNsYXNzTG9hZGVyKCkKLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGluQ2xhc3NMb2FkZXIoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc3JjX2FudC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvY29yZS9hbnQvSW5wdXRIYW5kbGVyU2V0dGVyLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc3JjX2FudC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvY29yZS9hbnQvSW5wdXRIYW5kbGVyU2V0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3MmEwMWMuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyY19hbnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2NvcmUvYW50L0lucHV0SGFuZGxlclNldHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwuY29yZS5hbnQ7Ci0KLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5pbnB1dC5EZWZhdWx0SW5wdXRIYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LmlucHV0LklucHV0SGFuZGxlcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGV4aXN0cyBzbyB0aGF0IHRoZSBBbnQgaW50ZWdyYXRpb24gaGFzIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5Ci0gKiB3aXRoIEFudCByZWxlYXNlcyBwcmV2aW91cyB0byAxLjUuIElucHV0SGFuZGxlcnMgYXJlIGEgbmV3IGZlYXR1cmUgb2YgQW50IDEuNS4KLSAqLwotY2xhc3MgSW5wdXRIYW5kbGVyU2V0dGVyIHsKLQotCXByb3RlY3RlZCB2b2lkIHNldElucHV0SGFuZGxlcihQcm9qZWN0IHByb2plY3QsIFN0cmluZyBpbnB1dEhhbmRsZXJDbGFzc25hbWUpIHsKLQkJSW5wdXRIYW5kbGVyIGhhbmRsZXIgPSBudWxsOwotCQlpZiAoaW5wdXRIYW5kbGVyQ2xhc3NuYW1lID09IG51bGwpIHsKLQkJCWhhbmRsZXIgPSBuZXcgRGVmYXVsdElucHV0SGFuZGxlcigpOwotCQl9IGVsc2UgewotCQkJdHJ5IHsKLQkJCQloYW5kbGVyID0gKElucHV0SGFuZGxlcikoQ2xhc3MuZm9yTmFtZShpbnB1dEhhbmRsZXJDbGFzc25hbWUpLm5ld0luc3RhbmNlKCkpOwotCQkJfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLQkJCQlTdHJpbmcgbXNnID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoSW50ZXJuYWxBbnRNZXNzYWdlcy5nZXRTdHJpbmcoIkludGVybmFsQW50UnVubmVyLlRoZV9zcGVjaWZpZWRfaW5wdXRfaGFuZGxlcl9jbGFzc197MH1fZG9lc19ub3RfaW1wbGVtZW50X3RoZV9vcmcuYXBhY2hlLnRvb2xzLmFudC5pbnB1dC5JbnB1dEhhbmRsZXJfaW50ZXJmYWNlXzUiKSwgbmV3IFN0cmluZ1tde2lucHV0SGFuZGxlckNsYXNzbmFtZX0pOyAvLyROT04tTkxTLTEkCi0JCQkJdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgZSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVN0cmluZyBtc2cgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChJbnRlcm5hbEFudE1lc3NhZ2VzLmdldFN0cmluZygiSW50ZXJuYWxBbnRSdW5uZXIuVW5hYmxlX3RvX2luc3RhbnRpYXRlX3NwZWNpZmllZF9pbnB1dF9oYW5kbGVyX2NsYXNzX3swfV9fX3sxfV82IiksIG5ldyBTdHJpbmdbXXtpbnB1dEhhbmRsZXJDbGFzc25hbWUsIGUuZ2V0Q2xhc3MoKS5nZXROYW1lKCl9KTsgLy8kTk9OLU5MUy0xJAotCQkJCXRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGUpOwotCQkJfQotCQl9Ci0JCXByb2plY3Quc2V0SW5wdXRIYW5kbGVyKGhhbmRsZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmNfYW50L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9jb3JlL2FudC9JbnRlcm5hbEFudE1lc3NhZ2VzLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc3JjX2FudC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvY29yZS9hbnQvSW50ZXJuYWxBbnRNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTdmM2IxLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmNfYW50L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9jb3JlL2FudC9JbnRlcm5hbEFudE1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5jb3JlLmFudDsKLQotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLXB1YmxpYyBjbGFzcyBJbnRlcm5hbEFudE1lc3NhZ2VzIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwuY29yZS5hbnQuSW50ZXJuYWxBbnRNZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlQnVuZGxlIFJFU09VUkNFX0JVTkRMRSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShCVU5ETEVfTkFNRSk7Ci0KLQlwcml2YXRlIEludGVybmFsQW50TWVzc2FnZXMoKSB7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBSRVNPVVJDRV9CVU5ETEUuZ2V0U3RyaW5nKGtleSk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gJyEnICsga2V5ICsgJyEnOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyY19hbnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2NvcmUvYW50L0ludGVybmFsQW50TWVzc2FnZXMucHJvcGVydGllcyBiL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmNfYW50L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9jb3JlL2FudC9JbnRlcm5hbEFudE1lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxNWY4ZDYuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyY19hbnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2NvcmUvYW50L0ludGVybmFsQW50TWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLUludGVybmFsQW50UnVubmVyLkJ1aWxkX2ZpbGVfX3swfV8xPUJ1aWxkZmlsZTogezB9Ci1JbnRlcm5hbEFudFJ1bm5lci5Bcmd1bWVudHNfX3swfV8yPUFyZ3VtZW50czogezB9Ci1JbnRlcm5hbEFudFJ1bm5lci5EZWZhdWx0X3RhcmdldF9fMz1EZWZhdWx0IHRhcmdldDoKLUludGVybmFsQW50UnVubmVyLk1haW5fdGFyZ2V0c19fND1NYWluIHRhcmdldHM6Ci1JbnRlcm5hbEFudFJ1bm5lci5TdWJ0YXJnZXRzX181PVN1YnRhcmdldHM6Ci1JbnRlcm5hbEFudFJ1bm5lci5VbmFibGVfdG9faW5zdGFudGlhdGVfbG9nZ2VyX197MH1fNj1VbmFibGUgdG8gaW5zdGFudGlhdGUgbG9nZ2VyOiB7MH0KLUludGVybmFsQW50UnVubmVyLm9wdGlvbnNfMTM9b3B0aW9ucwotSW50ZXJuYWxBbnRSdW5uZXIudGFyZ2V0XzE1PXRhcmdldAotSW50ZXJuYWxBbnRSdW5uZXIuT3B0aW9uc19fXzIxPU9wdGlvbnM6IAotSW50ZXJuYWxBbnRSdW5uZXIucHJpbnRfdGhpc19tZXNzYWdlXzIzPXByaW50IHRoaXMgbWVzc2FnZQotSW50ZXJuYWxBbnRSdW5uZXIucHJpbnRfcHJvamVjdF9oZWxwX2luZm9ybWF0aW9uXzI1PXByaW50IHByb2plY3QgaGVscCBpbmZvcm1hdGlvbgotSW50ZXJuYWxBbnRSdW5uZXIucHJpbnRfdGhlX3ZlcnNpb25faW5mb3JtYXRpb25fYW5kX2V4aXRfMjc9cHJpbnQgdGhlIHZlcnNpb24gaW5mb3JtYXRpb24gYW5kIGV4aXQKLUludGVybmFsQW50UnVubmVyLmJlX2V4dHJhX3F1aWV0XzI5PWJlIGV4dHJhIHF1aWV0Ci1JbnRlcm5hbEFudFJ1bm5lci5iZV9leHRyYV92ZXJib3NlXzMxPWJlIGV4dHJhIHZlcmJvc2UKLUludGVybmFsQW50UnVubmVyLnByaW50X2RlYnVnZ2luZ19pbmZvcm1hdGlvbl8zMz1wcmludCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24KLUludGVybmFsQW50UnVubmVyLnByb2R1Y2VfbG9nZ2luZ19pbmZvcm1hdGlvbl93aXRob3V0X2Fkb3JubWVudHNfMzU9cHJvZHVjZSBsb2dnaW5nIGluZm9ybWF0aW9uIHdpdGhvdXQgYWRvcm5tZW50cwotSW50ZXJuYWxBbnRSdW5uZXIudXNlX2dpdmVuX2ZpbGVfZm9yX2xvZ18zNz11c2UgZ2l2ZW4gZmlsZSBmb3IgbG9nCi1JbnRlcm5hbEFudFJ1bm5lci50aGVfY2xhc3Nfd2hpY2hfaXNfdG9fcGVyZm9ybV9sb2dnaW5nXzM5PXRoZSBjbGFzcyB3aGljaCBpcyB0byBwZXJmb3JtIGxvZ2dpbmcKLUludGVybmFsQW50UnVubmVyLmFkZF9hbl9pbnN0YW5jZV9vZl9jbGFzc19hc19hX3Byb2plY3RfbGlzdGVuZXJfNDE9YWRkIGFuIGluc3RhbmNlIG9mIGNsYXNzIGFzIGEgcHJvamVjdCBsaXN0ZW5lcgotSW50ZXJuYWxBbnRSdW5uZXIudXNlX2dpdmVuX2J1aWxkZmlsZV80Mz11c2UgZ2l2ZW4gYnVpbGRmaWxlCi1JbnRlcm5hbEFudFJ1bm5lci51c2VfdmFsdWVfZm9yX2dpdmVuX3Byb3BlcnR5XzQ1PXVzZSB2YWx1ZSBmb3IgZ2l2ZW4gcHJvcGVydHkKLUludGVybmFsQW50UnVubmVyLlVzaW5nX3swfV9maWxlX2FzX2J1aWxkX2xvZy5fMT1Vc2luZyB7MH0gZmlsZSBhcyBidWlsZCBsb2cuCi1JbnRlcm5hbEFudFJ1bm5lci5Db3VsZF9ub3Rfd3JpdGVfdG9fdGhlX3NwZWNpZmllZF9sb2dfZmlsZV9fezB9Ll9NYWtlX3N1cmVfdGhlX3BhdGhfZXhpc3RzX2FuZF95b3VfaGF2ZV93cml0ZV9wZXJtaXNzaW9ucy5fMj1DYW5ub3Qgd3JpdGUgb24gdGhlIHNwZWNpZmllZCBsb2cgZmlsZTogezB9LiBNYWtlIHN1cmUgdGhlIHBhdGggZXhpc3RzIGFuZCB5b3UgaGF2ZSB3cml0ZSBwZXJtaXNzaW9ucy4KLUludGVybmFsQW50UnVubmVyLkJVSUxEX1NVQ0NFU1NGVUxfMT1CVUlMRCBTVUNDRVNTRlVMCi1JbnRlcm5hbEFudFJ1bm5lci5Vbmtub3duX2FyZ3VtZW50X197MH1fMj1Vbmtub3duIGFyZ3VtZW50OiB7MH0KLUludGVybmFsQW50UnVubmVyLkJ1aWxkZmlsZV9fezB9X2RvZXNfbm90X2V4aXN0XyFfMT1CdWlsZGZpbGU6IHswfSBkb2VzIG5vdCBleGlzdAotSW50ZXJuYWxBbnRSdW5uZXIuezB9X3doaWNoX3dhc19zcGVjaWZpZWRfdG9fYmVfYV9idWlsZF9saXN0ZW5lcl9pc19ub3RfYW5faW5zdGFuY2Vfb2Zfb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMaXN0ZW5lci5fMT17MH0gd2hpY2ggd2FzIHNwZWNpZmllZCB0byBiZSBhIGJ1aWxkIGxpc3RlbmVyIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZExpc3RlbmVyLgotSW50ZXJuYWxBbnRSdW5uZXIuezB9X3doaWNoX3dhc19zcGVjaWZpZWRfdG9fcGVyZm9ybV9sb2dnaW5nX2lzX25vdF9hbl9pbnN0YW5jZV9vZl9vcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZExvZ2dlci5fMj17MH0gd2hpY2ggd2FzIHNwZWNpZmllZCB0byBwZXJmb3JtIGxvZ2dpbmcgaXMgbm90IGFuIGluc3RhbmNlIG9mIG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkTG9nZ2VyLgotSW50ZXJuYWxBbnRSdW5uZXIuWW91X211c3Rfc3BlY2lmeV9hX2NsYXNzbmFtZV93aGVuX3VzaW5nX3RoZV8tbGlzdGVuZXJfYXJndW1lbnRfMT1Zb3UgbXVzdCBzcGVjaWZ5IGEgY2xhc3NuYW1lIHdoZW4gdXNpbmcgdGhlIC1saXN0ZW5lciBhcmd1bWVudAotSW50ZXJuYWxBbnRSdW5uZXIuWW91X211c3Rfc3BlY2lmeV9hX2NsYXNzbmFtZV93aGVuX3VzaW5nX3RoZV8tbG9nZ2VyX2FyZ3VtZW50XzI9WW91IG11c3Qgc3BlY2lmeSBhIGNsYXNzbmFtZSB3aGVuIHVzaW5nIHRoZSAtbG9nZ2VyIGFyZ3VtZW50Ci1JbnRlcm5hbEFudFJ1bm5lci5Zb3VfbXVzdF9zcGVjaWZ5X2FfbG9nX2ZpbGVfd2hlbl91c2luZ190aGVfLWxvZ19hcmd1bWVudF8zPVlvdSBtdXN0IHNwZWNpZnkgYSBsb2cgZmlsZSB3aGVuIHVzaW5nIHRoZSAtbG9nIGFyZ3VtZW50Ci1JbnRlcm5hbEFudFJ1bm5lci5Zb3VfbXVzdF9zcGVjaWZ5X2FfYnVpbGRmaWxlX3doZW5fdXNpbmdfdGhlXy1idWlsZGZpbGVfYXJndW1lbnRfND1Zb3UgbXVzdCBzcGVjaWZ5IGEgYnVpbGRmaWxlIHdoZW4gdXNpbmcgdGhlIC1idWlsZGZpbGUgYXJndW1lbnQKLUludGVybmFsQW50UnVubmVyLnByaW50X2luZm9ybWF0aW9uX3RoYXRfbWlnaHRfYmVfaGVscGZ1bF90b18xMj1wcmludCBpbmZvcm1hdGlvbiB0aGF0IG1pZ2h0IGJlIGhlbHBmdWwgdG8KLUludGVybmFsQW50UnVubmVyLl90X3RfdF90X3RfdF90X3RfdF90X3RkaWFnbm9zZV9vcl9yZXBvcnRfcHJvYmxlbXMuXzEzPVx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkaWFnbm9zZSBvciByZXBvcnQgcHJvYmxlbXMuCi1JbnRlcm5hbEFudFJ1bm5lci5fdF90X3RfdF90X3RfdF90X19fX18xNT1cdFx0XHRcdFx0XHRcdFx0XCdcJwotSW50ZXJuYWxBbnRSdW5uZXIubG9hZF9hbGxfcHJvcGVydGllc19mcm9tX2ZpbGVfd2l0aF8tRF8xOT1sb2FkIGFsbCBwcm9wZXJ0aWVzIGZyb20gZmlsZSB3aXRoIC1ECi1JbnRlcm5hbEFudFJ1bm5lci5fdF90X3RfdF90X3RfdF90X3RfdF90cHJvcGVydGllc190YWtpbmdfcHJlY2VkZW5jZV8yMD1cdFx0XHRcdFx0XHRcdFx0XHRcdFx0cHJvcGVydGllcyB0YWtpbmcgcHJlY2VkZW5jZQotSW50ZXJuYWxBbnRSdW5uZXIudGhlX2NsYXNzX3doaWNoX3dpbGxfaGFuZGxlX2lucHV0X3JlcXVlc3RzXzIyPXRoZSBjbGFzcyB3aGljaCB3aWxsIGhhbmRsZSBpbnB1dCByZXF1ZXN0cwotSW50ZXJuYWxBbnRSdW5uZXIuX3RfdF90X3RfdF90X3RfX19fXzE9XHRcdFx0XHRcdFx0XHRcJ1wnCi1JbnRlcm5hbEFudFJ1bm5lci5DbGFzc197MH1fbm90X2ZvdW5kX2Zvcl90YXNrX3sxfV8xPUNsYXNzIHswfSBub3QgZm91bmQgZm9yIHRhc2sgezF9Ci1JbnRlcm5hbEFudFJ1bm5lci5DbGFzc197MH1fbm90X2ZvdW5kX2Zvcl90eXBlX3sxfV8yPUNsYXNzIHswfSBub3QgZm91bmQgZm9yIHR5cGUgezF9Ci1JbnRlcm5hbEFudFJ1bm5lci5Pbmx5X29uZV9sb2dnZXJfY2xhc3NfbWF5X2JlX3NwZWNpZmllZF8xPU9ubHkgb25lIGxvZ2dlciBjbGFzcyBtYXkgYmUgc3BlY2lmaWVkCi1JbnRlcm5hbEFudFJ1bm5lci5Zb3VfbXVzdF9zcGVjaWZ5X2FfY2xhc3NuYW1lX3doZW5fdXNpbmdfdGhlXy1pbnB1dGhhbmRsZXJfYXJndW1lbnRfMT1Zb3UgbXVzdCBzcGVjaWZ5IGEgY2xhc3NuYW1lIHdoZW4gdXNpbmcgdGhlIC1pbnB1dGhhbmRsZXIgYXJndW1lbnQKLUludGVybmFsQW50UnVubmVyLk9ubHlfb25lX2lucHV0X2hhbmRsZXJfY2xhc3NfbWF5X2JlX3NwZWNpZmllZC5fMj1Pbmx5IG9uZSBpbnB1dCBoYW5kbGVyIGNsYXNzIG1heSBiZSBzcGVjaWZpZWQuCi1JbnRlcm5hbEFudFJ1bm5lci5Zb3VfbXVzdF9zcGVjaWZ5X2FfcHJvcGVydHlfZmlsZW5hbWVfd2hlbl91c2luZ190aGVfLXByb3BlcnR5ZmlsZV9hcmd1bWVudF8zPVlvdSBtdXN0IHNwZWNpZnkgYSBwcm9wZXJ0eSBmaWxlbmFtZSB3aGVuIHVzaW5nIHRoZSAtcHJvcGVydHlmaWxlIGFyZ3VtZW50Ci1JbnRlcm5hbEFudFJ1bm5lci5Db3VsZF9ub3RfbG9hZF9wcm9wZXJ0eV9maWxlX3swfV9fezF9XzQ9Q291bGQgbm90IGxvYWQgcHJvcGVydHkgZmlsZSB7MH06IHsxfQotSW50ZXJuYWxBbnRSdW5uZXIuVGhlX3NwZWNpZmllZF9pbnB1dF9oYW5kbGVyX2NsYXNzX3swfV9kb2VzX25vdF9pbXBsZW1lbnRfdGhlX29yZy5hcGFjaGUudG9vbHMuYW50LmlucHV0LklucHV0SGFuZGxlcl9pbnRlcmZhY2VfNT1UaGUgc3BlY2lmaWVkIGlucHV0IGhhbmRsZXIgY2xhc3MgezB9IGRvZXMgbm90IGltcGxlbWVudCB0aGUgb3JnLmFwYWNoZS50b29scy5hbnQuaW5wdXQuSW5wdXRIYW5kbGVyIGludGVyZmFjZQotSW50ZXJuYWxBbnRSdW5uZXIuVW5hYmxlX3RvX2luc3RhbnRpYXRlX3NwZWNpZmllZF9pbnB1dF9oYW5kbGVyX2NsYXNzX3swfV9fX3sxfV82PVVuYWJsZSB0byBpbnN0YW50aWF0ZSBzcGVjaWZpZWQgaW5wdXQgaGFuZGxlciBjbGFzcyB7MH0gOiB7MX0KLUludGVybmFsQW50UnVubmVyLlNwZWNpZnlpbmdfYW5fSW5wdXRIYW5kbGVyX2lzX2FuX0FudF8xLjUuKl9mZWF0dXJlLl9QbGVhc2VfdXBkYXRlX3lvdXJfQW50X2NsYXNzcGF0aF90b19pbmNsdWRlX2FuX0FudF92ZXJzaW9uX2dyZWF0ZXJfdGhhbl90aGlzLl8yPVNwZWNpZnlpbmcgYW4gSW5wdXRIYW5kbGVyIGlzIGFuIEFudCAxLjUuKiBmZWF0dXJlLiBQbGVhc2UgdXBkYXRlIHlvdXIgQW50IGNsYXNzcGF0aCB0byBpbmNsdWRlIGFuIEFudCB2ZXJzaW9uIGdyZWF0ZXIgdGhhbiB0aGlzLgotSW50ZXJuYWxBbnRSdW5uZXIuVGhlX2RpYWdub3NpdGljc19vcHRpb25zX2lzX2FuX0FudF8xLjUuKl9mZWF0dXJlLl9QbGVhc2VfdXBkYXRlX3lvdXJfQW50X2NsYXNzcGF0aF90b19pbmNsdWRlX2FuX0FudF92ZXJzaW9uX2dyZWF0ZXJfdGhhbl90aGlzLl80PVRoZSBkaWFnbm9zaXRpY3Mgb3B0aW9ucyBpcyBhbiBBbnQgMS41LiogZmVhdHVyZS4gUGxlYXNlIHVwZGF0ZSB5b3VyIEFudCBjbGFzc3BhdGggdG8gaW5jbHVkZSBhbiBBbnQgdmVyc2lvbiBncmVhdGVyIHRoYW4gdGhpcy4KLUludGVybmFsQW50UnVubmVyLlNwZWNpZnlpbmdfcHJvcGVydHlfZmlsZXNfaXNfYV9BbnRfMS41LipfZmVhdHVyZS5fUGxlYXNlX3VwZGF0ZV95b3VyX0FudF9jbGFzc3BhdGguXzY9U3BlY2lmeWluZyBwcm9wZXJ0eSBmaWxlcyBpcyBhIEFudCAxLjUuKiBmZWF0dXJlLiBQbGVhc2UgdXBkYXRlIHlvdXIgQW50IGNsYXNzcGF0aCB0byBpbmNsdWRlIGFuIEFudCB2ZXJzaW9uIGdyZWF0ZXIgdGhhbiB0aGlzLgotSW50ZXJuYWxBbnRSdW5uZXIuRGVmYXVsdF90YXJnZXRfezB9ezF9ezJ9X2RvZXNfbm90X2V4aXN0X2luX3RoaXNfcHJvamVjdF8xPURlZmF1bHQgdGFyZ2V0IHswfXsxfXsyfSBkb2VzIG5vdCBleGlzdCBpbiB0aGlzIHByb2plY3QKLUludGVybmFsQW50UnVubmVyLkFOVF9IT01FX211c3RfYmVfc2V0X3RvX3VzZV9BbnRfZGlhZ25vc3RpY3NfMj1BTlRfSE9NRSBtdXN0IGJlIHNldCB0byB1c2UgQW50IGRpYWdub3N0aWNzCi1JbnRlcm5hbEFudFJ1bm5lci5CdWlsZGZpbGVfX3swfV9pc19ub3RfYV9maWxlXzE9QnVpbGRmaWxlOiB7MH0gaXMgbm90IGEgZmlsZQotSW50ZXJuYWxBbnRSdW5uZXIuLWZpbmRfbm90X3N1cHBvcnRlZD0tZmluZCBub3Qgc3VwcG9ydGVkLlxuQ2FuIGJlIGVtdWxhdGVkIHVzaW5nIFJ1biBBcyA+IEFudCBCdWlsZCBsb2NhdGVkXG5pbiB0aGUgUnVuID4gRXh0ZXJuYWwgVG9vbHMgbWVudQotSW50ZXJuYWxBbnRSdW5uZXIuRXJyb3Jfc2V0dGluZ19BbnRfdGFzaz1FcnJvciBzZXR0aW5nIEFudCB0YXNrIHswfQotSW50ZXJuYWxBbnRSdW5uZXIuTWlzc2luZ19DbGFzcz1Db3VsZCBub3QgbG9hZCBhIGNsYXNzIHJlcXVpcmVkIGZvciBwYXJzaW5nIHRhcmdldHMKLQotUHJvZ3Jlc3NCdWlsZExpc3RlbmVyLkJ1aWxkX2NhbmNlbGxlZC5fNT1CdWlsZCBjYW5jZWxsZWQuCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc3JjX2FudC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvY29yZS9hbnQvSW50ZXJuYWxBbnRSdW5uZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmNfYW50L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9jb3JlL2FudC9JbnRlcm5hbEFudFJ1bm5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTQ1OTQyLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmNfYW50L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9jb3JlL2FudC9JbnRlcm5hbEFudFJ1bm5lci5qYXZhCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyY19hbnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2NvcmUvYW50L0ludGVybmFsUHJvamVjdC5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyY19hbnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2NvcmUvYW50L0ludGVybmFsUHJvamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjRiODcxLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmNfYW50L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9jb3JlL2FudC9JbnRlcm5hbFByb2plY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmNvcmUuYW50OwotCi0vKgotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSwgMjAwMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKLSAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVnZW1lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlRoZSBKYWthcnRhIFByb2plY3QiLCAiQW50IiwgYW5kICJBcGFjaGUgU29mdHdhcmUKLSAqICAgIEZvdW5kYXRpb24iIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwotIAotIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLUNvcHlyaWdodCAoYykgMjAwMyBJQk0gQ29ycC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi1UaGlzIGZpbGUgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3RDb21wb25lbnQ7Ci0KLS8qKgotICogQSBzdWJjbGFzcyBvZiBQcm9qZWN0IHRvIGZhY2lsaXRhdGUgImZhc3RlciIgcGFyc2luZyB3aXRoCi0gKiBsZXNzIGdhcmJhZ2UgZ2VuZXJhdGVkLiBUaGlzIGNsYXNzIGlzIG5vdCB1c2VkIG9uIEFudCAxLjYgYW5kIG5ld2VyCi0gKiBkdWUgdG8gdGhlIGltcHJvdmVtZW50cyBpbiBsYXp5IGxvYWRpbmcgb2YgdGhlc2UgQW50IHZlcnNpb25zLgotICogCi0gKiBPbmx5IHRocmVlIHRhc2tzIGFyZSBsb2FkZWQgKHByb3BlcnR5LCB0YXNrZGVmIGFuZCAKLSAqIHR5cGVkZWY6IHRocmVlIHRhc2tzIHRoYXQgY2FuIGJlIGRlZmluZWQgb3V0c2lkZSBvZiBhIHRhcmdldCBvbiBBbnQgMS41LjEgb3Igb2xkZXIpLgotICoKLSAqIERhdGF0eXBlcyBhcmUgbG9hZGVkIGlmIHJlcXVlc3RlZC4KLSAqIAotICogRGVyaXZlZCBmcm9tIHRoZSBvcmlnaW5hbCBBbnQgUHJvamVjdCBjbGFzcwotICovCi1wdWJsaWMgY2xhc3MgSW50ZXJuYWxQcm9qZWN0IGV4dGVuZHMgUHJvamVjdCB7Ci0KLQlwcml2YXRlIEhhc2h0YWJsZSB0eXBlTmFtZVRvQ2xhc3MgPSBudWxsOwotCQotCXB1YmxpYyBJbnRlcm5hbFByb2plY3QoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdCNpbml0KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLQkJc2V0SmF2YVZlcnNpb25Qcm9wZXJ0eSgpOwotCi0JCXRyeSB7Ci0JCQlDbGFzcyB0YXNrQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKCJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5Qcm9wZXJ0eSIpOyAvLyROT04tTkxTLTEkCi0JCQlhZGRUYXNrRGVmaW5pdGlvbigicHJvcGVydHkiLCB0YXNrQ2xhc3MpOyAvLyROT04tTkxTLTEkCi0JCQl0YXNrQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKCJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5UeXBlZGVmIik7IC8vJE5PTi1OTFMtMSQKLQkJCWFkZFRhc2tEZWZpbml0aW9uKCJ0eXBlZGVmIiwgdGFza0NsYXNzKTsgLy8kTk9OLU5MUy0xJAotCQkJdGFza0NsYXNzID0gQ2xhc3MuZm9yTmFtZSgib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuVGFza2RlZiIpOyAvLyROT04tTkxTLTEkCi0JCQlhZGRUYXNrRGVmaW5pdGlvbigidGFza2RlZiIsIHRhc2tDbGFzcyk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoTm9DbGFzc0RlZkZvdW5kRXJyb3IgZSkgewotCQkJdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKEludGVybmFsQW50TWVzc2FnZXMuZ2V0U3RyaW5nKCJJbnRlcm5hbEFudFJ1bm5lci5NaXNzaW5nX0NsYXNzIiksIGUpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gYykgewotCQkJdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKEludGVybmFsQW50TWVzc2FnZXMuZ2V0U3RyaW5nKCJJbnRlcm5hbEFudFJ1bm5lci5NaXNzaW5nX0NsYXNzIiksIGMpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlzZXRTeXN0ZW1Qcm9wZXJ0aWVzKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdCNjcmVhdGVEYXRhVHlwZShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBPYmplY3QgY3JlYXRlRGF0YVR5cGUoU3RyaW5nIHR5cGVOYW1lKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotCQlpZiAodHlwZU5hbWVUb0NsYXNzID09IG51bGwpIHsKLQkJCWluaXRpYWxpemVUeXBlcygpOwotCQl9Ci0JCUNsYXNzIHR5cGVDbGFzcyA9IChDbGFzcykgdHlwZU5hbWVUb0NsYXNzLmdldCh0eXBlTmFtZSk7Ci0KLQkJaWYgKHR5cGVDbGFzcyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXRyeSB7Ci0JCQlDb25zdHJ1Y3RvciBjdG9yID0gbnVsbDsKLQkJCWJvb2xlYW4gbm9BcmcgPSBmYWxzZTsKLQkJCS8vIERhdGFUeXBlIGNhbiBoYXZlIGEgIm5vIGFyZyIgY29uc3RydWN0b3Igb3IgdGFrZSBhIHNpbmdsZQotCQkJLy8gUHJvamVjdCBhcmd1bWVudC4KLQkJCXRyeSB7Ci0JCQkJY3RvciA9IHR5cGVDbGFzcy5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbMF0pOwotCQkJCW5vQXJnID0gdHJ1ZTsKLQkJCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBuc2UpIHsKLQkJCQljdG9yID0gdHlwZUNsYXNzLmdldENvbnN0cnVjdG9yKG5ldyBDbGFzc1tdIHsgUHJvamVjdC5jbGFzcyB9KTsKLQkJCQlub0FyZyA9IGZhbHNlOwotCQkJfQotCi0JCQlPYmplY3QgbyA9IG51bGw7Ci0JCQlpZiAobm9BcmcpIHsKLQkJCQlvID0gY3Rvci5uZXdJbnN0YW5jZShuZXcgT2JqZWN0WzBdKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbyA9IGN0b3IubmV3SW5zdGFuY2UobmV3IE9iamVjdFtdIHsgdGhpcyB9KTsKLQkJCX0KLQkJCWlmIChvIGluc3RhbmNlb2YgUHJvamVjdENvbXBvbmVudCkgewotCQkJCSgoUHJvamVjdENvbXBvbmVudCkgbykuc2V0UHJvamVjdCh0aGlzKTsKLQkJCX0KLQkJCXJldHVybiBvOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGl0ZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgdGhlIG1hcHBpbmcgb2YgZGF0YSB0eXBlIG5hbWUgdG8gZGF0YSB0eXBlIGNsYXNzbmFtZQotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplVHlwZXMoKSB7Ci0JCXR5cGVOYW1lVG9DbGFzcyA9IG5ldyBIYXNodGFibGUoMTgpOwotCQlTdHJpbmcgZGF0YURlZnMgPSAiL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL2RlZmF1bHRzLnByb3BlcnRpZXMiOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQlQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJCUlucHV0U3RyZWFtIGluID0gUHJvamVjdC5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKGRhdGFEZWZzKTsKLQkJCWlmIChpbiA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJcHJvcHMubG9hZChpbik7Ci0JCQlpbi5jbG9zZSgpOwotCi0JCQlFbnVtZXJhdGlvbiBlbnVtID0gcHJvcHMucHJvcGVydHlOYW1lcygpOwotCQkJd2hpbGUgKGVudW0uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQlTdHJpbmcgdHlwZU5hbWUgPSAoU3RyaW5nKSBlbnVtLm5leHRFbGVtZW50KCk7Ci0JCQkJU3RyaW5nIGNsYXNzTmFtZSA9IHByb3BzLmdldFByb3BlcnR5KHR5cGVOYW1lKTsKLQkJCQl0cnkgewotCQkJCQlDbGFzcyB0eXBlQ2xhc3M9IENsYXNzLmZvck5hbWUoY2xhc3NOYW1lKTsKLQkJCQkJdHlwZU5hbWVUb0NsYXNzLnB1dCh0eXBlTmFtZSwgdHlwZUNsYXNzKTsKLQkJCQl9IGNhdGNoIChOb0NsYXNzRGVmRm91bmRFcnJvciBlKSB7Ci0JCQkJCS8vaWdub3JlCi0JCQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBjKSB7Ci0JCQkJCS8vaWdub3JlCi0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3QjZ2V0RGF0YVR5cGVEZWZpbml0aW9ucygpCi0JICovCi0JcHVibGljIEhhc2h0YWJsZSBnZXREYXRhVHlwZURlZmluaXRpb25zKCkgewotCQlpZiAodHlwZU5hbWVUb0NsYXNzID09IG51bGwpIHsKLQkJCWluaXRpYWxpemVUeXBlcygpOwotCQl9Ci0JCXJldHVybiB0eXBlTmFtZVRvQ2xhc3M7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3QjYWRkRGF0YVR5cGVEZWZpbml0aW9uKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5DbGFzcykKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGREYXRhVHlwZURlZmluaXRpb24oU3RyaW5nIHR5cGVOYW1lLCBDbGFzcyB0eXBlQ2xhc3MpIHsKLQkJZ2V0RGF0YVR5cGVEZWZpbml0aW9ucygpOwotCQl0eXBlTmFtZVRvQ2xhc3MucHV0KHR5cGVOYW1lLCB0eXBlQ2xhc3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmNfYW50L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9jb3JlL2FudC9Qcm9ncmVzc0J1aWxkTGlzdGVuZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmNfYW50L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9jb3JlL2FudC9Qcm9ncmVzc0J1aWxkTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdhOThjNi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc3JjX2FudC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvY29yZS9hbnQvUHJvZ3Jlc3NCdWlsZExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwuY29yZS5hbnQ7Ci0KLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuKjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5BbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuQ2FsbFRhcmdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS5BbnRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotCi0vKioKLSAqIFJlcG9ydHMgcHJvZ3Jlc3MgYW5kIGNoZWNrcyBmb3IgY2FuY2VsYXRpb24gb2YgYSBzY3JpcHQgZXhlY3V0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgUHJvZ3Jlc3NCdWlsZExpc3RlbmVyIGltcGxlbWVudHMgQnVpbGRMaXN0ZW5lciB7Ci0KLQlwcm90ZWN0ZWQgTWFwIHByb2plY3RzOwotCXByb3RlY3RlZCBQcm9qZWN0IG1haW5Qcm9qZWN0OwotCXByb3RlY3RlZCBQcm9qZWN0IHBhcmVudFByb2plY3Q7Ci0JcHJpdmF0ZSBUaHJlYWQgY3VycmVudFRhc2tUaHJlYWQ7Ci0KLQkvKioKLQkgKiAgQ29udGFpbnMgdGhlIHByb2dyZXNzIG1vbml0b3IgaW5zdGFuY2VzIGZvciB0aGUgdmFyaW91cwotCSAqCXByb2plY3RzIGluIGEgY2hhaW4uCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIFByb2plY3RNb25pdG9ycyB7Ci0JCS8qKgotCQkgKiAgVGhpcyBmaWVsZCBpcyBudWxsIGZvciB0aGUgbWFpbiBwcm9qZWN0Ci0JCSAqLwotCQlwcml2YXRlIFRhcmdldCBtYWluVGFyZ2V0OwotCQlwcml2YXRlIElQcm9ncmVzc01vbml0b3IgbWFpbk1vbml0b3I7Ci0JCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciB0YXJnZXRNb25pdG9yOwotCQlwcml2YXRlIElQcm9ncmVzc01vbml0b3IgdGFza01vbml0b3I7Ci0JCQotCQlwcm90ZWN0ZWQgSVByb2dyZXNzTW9uaXRvciBnZXRNYWluTW9uaXRvcigpIHsKLQkJCXJldHVybiBtYWluTW9uaXRvcjsKLQkJfQotCi0JCXByb3RlY3RlZCBUYXJnZXQgZ2V0TWFpblRhcmdldCgpIHsKLQkJCXJldHVybiBtYWluVGFyZ2V0OwotCQl9Ci0KLQkJcHJvdGVjdGVkIElQcm9ncmVzc01vbml0b3IgZ2V0VGFyZ2V0TW9uaXRvcigpIHsKLQkJCXJldHVybiB0YXJnZXRNb25pdG9yOwotCQl9Ci0KLQkJcHJvdGVjdGVkIElQcm9ncmVzc01vbml0b3IgZ2V0VGFza01vbml0b3IoKSB7Ci0JCQlyZXR1cm4gdGFza01vbml0b3I7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBzZXRNYWluTW9uaXRvcihJUHJvZ3Jlc3NNb25pdG9yIG1haW5Nb25pdG9yKSB7Ci0JCQl0aGlzLm1haW5Nb25pdG9yID0gbWFpbk1vbml0b3I7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBzZXRNYWluVGFyZ2V0KFRhcmdldCBtYWluVGFyZ2V0KSB7Ci0JCQl0aGlzLm1haW5UYXJnZXQgPSBtYWluVGFyZ2V0OwotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgc2V0VGFyZ2V0TW9uaXRvcihJUHJvZ3Jlc3NNb25pdG9yIHRhcmdldE1vbml0b3IpIHsKLQkJCXRoaXMudGFyZ2V0TW9uaXRvciA9IHRhcmdldE1vbml0b3I7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBzZXRUYXNrTW9uaXRvcihJUHJvZ3Jlc3NNb25pdG9yIHRhc2tNb25pdG9yKSB7Ci0JCQl0aGlzLnRhc2tNb25pdG9yID0gdGFza01vbml0b3I7Ci0JCX0KLQotCX0KLQotCXB1YmxpYyBQcm9ncmVzc0J1aWxkTGlzdGVuZXIoUHJvamVjdCBwcm9qZWN0LCBMaXN0IHRhcmdldE5hbWVzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJcHJvamVjdHMgPSBuZXcgSGFzaE1hcCgpOwotCQltYWluUHJvamVjdCA9IHByb2plY3Q7Ci0JCVByb2plY3RNb25pdG9ycyBtb25pdG9ycyA9IG5ldyBQcm9qZWN0TW9uaXRvcnMoKTsKLQkJaWYgKG1vbml0b3IgPT0gbnVsbCkgewotCQkJbW9uaXRvcj0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJfQotCQltb25pdG9ycy5zZXRNYWluTW9uaXRvcihtb25pdG9yKTsKLQkJcHJvamVjdHMucHV0KG1haW5Qcm9qZWN0LCBtb25pdG9ycyk7Ci0JCUxpc3QgdGFyZ2V0cz0gbmV3IEFycmF5TGlzdCh0YXJnZXROYW1lcy5zaXplKCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRhcmdldE5hbWVzLnNpemUoKTsgaSsrKSB7Ci0JCQlTdHJpbmcgdGFyZ2V0TmFtZSA9IChTdHJpbmcpIHRhcmdldE5hbWVzLmdldChpKTsKLQkJCVRhcmdldCB0YXJnZXQ9IChUYXJnZXQpIG1haW5Qcm9qZWN0LmdldFRhcmdldHMoKS5nZXQodGFyZ2V0TmFtZSk7Ci0JCQlpZiAodGFyZ2V0ICE9IG51bGwpIHsKLQkJCQl0YXJnZXRzLmFkZCh0YXJnZXQpOwotCQkJfQotCQl9Ci0JCWludCB3b3JrID0gY29tcHV0ZVdvcmsodGFyZ2V0cyk7Ci0JCW1vbml0b3JzLmdldE1haW5Nb25pdG9yKCkuYmVnaW5UYXNrKCIiLCB3b3JrKTsgIC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkTGlzdGVuZXIjYnVpbGRTdGFydGVkKG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgYnVpbGRTdGFydGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKLQkJY2hlY2tDYW5jZWxlZCgpOwotCX0KLQotCXByb3RlY3RlZCBpbnQgY29tcHV0ZVdvcmsoTGlzdCB0YXJnZXRzKSB7Ci0JCWludCByZXN1bHQgPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRhcmdldHMuc2l6ZSgpOyBpKyspIHsKLQkJCXJlc3VsdCA9IHJlc3VsdCArIGNvdW50VGFyZ2V0KChUYXJnZXQpdGFyZ2V0cy5nZXQoaSkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBjb3VudFRhcmdldChUYXJnZXQgdGFyZ2V0KSB7Ci0JCWludCByZXN1bHQgPSAxOwotCQlQcm9qZWN0IHByb2plY3QgPSB0YXJnZXQuZ2V0UHJvamVjdCgpOwotCQlIYXNodGFibGUgdGFyZ2V0cz0gcHJvamVjdC5nZXRUYXJnZXRzKCk7Ci0JCWZvciAoRW51bWVyYXRpb24gZGVwZW5kZW5jaWVzID0gdGFyZ2V0LmdldERlcGVuZGVuY2llcygpOyBkZXBlbmRlbmNpZXMuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JCQlTdHJpbmcgdGFyZ2V0TmFtZSA9IChTdHJpbmcpIGRlcGVuZGVuY2llcy5uZXh0RWxlbWVudCgpOwotCQkJVGFyZ2V0IGRlcGVuZGVuY3kgPSAoVGFyZ2V0KXRhcmdldHMuZ2V0KHRhcmdldE5hbWUpOwotCQkJaWYgKGRlcGVuZGVuY3kgIT0gbnVsbCkgewotCQkJCXJlc3VsdCA9IHJlc3VsdCArIGNvdW50VGFyZ2V0KGRlcGVuZGVuY3kpOwotCQkJfQotCQl9Ci0JCS8vIHdlIGhhdmUgdG8gaGFuZGxlIGFudGNhbGwgdGFza3MgYXMgd2VsbAotCQlUYXNrW10gdGFza3MgPSB0YXJnZXQuZ2V0VGFza3MoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0YXNrcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRhc2tzW2ldIGluc3RhbmNlb2YgQ2FsbFRhcmdldCkgewotCQkJCS8vIEFzIHdlIGRvIG5vdCBoYXZlIGFjY2VzcyB0byB0aGUgaW5mb3JtYXRpb24gKGF0IGxlYXN0IGluIEFudCAxLjQuMSkKLQkJCQkvLyBkZXNjcmliaW5nIHdoYXQgdGFyZ2V0IGlzIGV4ZWN1dGVkIGJ5IHRoaXMgYW50Y2FsbCB0YXNrLCB3ZSBhc3N1bWUKLQkJCQkvLyBhIHNjZW5hcmlvIHdoZXJlIGl0IGRlcGVuZHMgb24gYWxsIHRhcmdldHMgb2YgdGhlIHByb2plY3QgYnV0IGl0c2VsZi4KLQkJCQlyZXN1bHQgPSByZXN1bHQgKyAodGFyZ2V0cy5zaXplKCkgLSAxKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMaXN0ZW5lciNidWlsZEZpbmlzaGVkKG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgYnVpbGRGaW5pc2hlZChCdWlsZEV2ZW50IGV2ZW50KSB7Ci0JCVByb2plY3RNb25pdG9ycyBtb25pdG9ycyA9IChQcm9qZWN0TW9uaXRvcnMpIHByb2plY3RzLmdldChtYWluUHJvamVjdCk7Ci0JCW1vbml0b3JzLmdldE1haW5Nb25pdG9yKCkuZG9uZSgpOwotCQlTZXQga2V5cz0gcHJvamVjdHMua2V5U2V0KCk7Ci0JCUl0ZXJhdG9yIGl0cj0ga2V5cy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRyLmhhc05leHQoKSkgewotCQkJUHJvamVjdCBwcm9qZWN0ID0gKFByb2plY3QpIGl0ci5uZXh0KCk7Ci0JCQlwcm9qZWN0LnJlbW92ZUJ1aWxkTGlzdGVuZXIodGhpcyk7Ci0JCQlwcm9qZWN0LmdldFJlZmVyZW5jZXMoKS5yZW1vdmUoQW50Q29yZVBsdWdpbi5FQ0xJUFNFX1BST0dSRVNTX01PTklUT1IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZExpc3RlbmVyI3RhcmdldFN0YXJ0ZWQob3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0YXJnZXRTdGFydGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKLQkJY2hlY2tDYW5jZWxlZCgpOwotCQlQcm9qZWN0IGN1cnJlbnRQcm9qZWN0ID0gZXZlbnQuZ2V0UHJvamVjdCgpOwotCQlpZiAoY3VycmVudFByb2plY3QgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCVRhcmdldCB0YXJnZXQgPSBldmVudC5nZXRUYXJnZXQoKTsKLQkJUHJvamVjdE1vbml0b3JzIG1vbml0b3JzID0gKFByb2plY3RNb25pdG9ycykgcHJvamVjdHMuZ2V0KGN1cnJlbnRQcm9qZWN0KTsKLQotCQkvLyBpZiBtb25pdG9ycyBpcyBudWxsIHdlIGFyZSBpbiBhIG5ldyBzY3JpcHQKLQkJaWYgKG1vbml0b3JzID09IG51bGwpIHsKLQkJCW1vbml0b3JzID0gY3JlYXRlTW9uaXRvcnMoY3VycmVudFByb2plY3QsIHRhcmdldCk7Ci0JCX0KLQotCQltb25pdG9ycy5zZXRUYXJnZXRNb25pdG9yKHN1Yk1vbml0b3JGb3IobW9uaXRvcnMuZ2V0TWFpbk1vbml0b3IoKSwgMSkpOwotCQlpbnQgd29yayA9ICh0YXJnZXQgIT0gbnVsbCkgPyB0YXJnZXQuZ2V0VGFza3MoKS5sZW5ndGggOiAxMDA7Ci0JCW1vbml0b3JzLmdldFRhcmdldE1vbml0b3IoKS5iZWdpblRhc2soIiIsIHdvcmspOyAgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBQcm9qZWN0TW9uaXRvcnMgY3JlYXRlTW9uaXRvcnMoUHJvamVjdCBjdXJyZW50UHJvamVjdCwgVGFyZ2V0IHRhcmdldCkgewotCQlQcm9qZWN0TW9uaXRvcnMgbW9uaXRvcnMgPSBuZXcgUHJvamVjdE1vbml0b3JzKCk7Ci0JCS8vIHJlbWVtYmVyIHRoZSB0YXJnZXQgc28gd2UgY2FuIHJlbW92ZSB0aGlzIG1vbml0b3JzIG9iamVjdCBsYXRlcgotCQltb25pdG9ycy5zZXRNYWluVGFyZ2V0KHRhcmdldCk7Ci0JCUxpc3QgdGFyZ2V0cz0gbmV3IEFycmF5TGlzdCgxKTsKLQkJdGFyZ2V0cy5hZGQodGFyZ2V0KTsKLQkJaW50IHdvcmsgPSBjb21wdXRlV29yayh0YXJnZXRzKTsKLQkJUHJvamVjdE1vbml0b3JzIHBhcmVudE1vbml0b3JzID0gbnVsbDsKLQkJaWYgKHBhcmVudFByb2plY3QgPT0gbnVsbCkgewotCQkJcGFyZW50TW9uaXRvcnMgPSAoUHJvamVjdE1vbml0b3JzKSBwcm9qZWN0cy5nZXQobWFpblByb2plY3QpOwotCQkJbW9uaXRvcnMuc2V0TWFpbk1vbml0b3Ioc3ViTW9uaXRvckZvcihwYXJlbnRNb25pdG9ycy5nZXRNYWluTW9uaXRvcigpLCAxKSk7Ci0JCX0gZWxzZSB7Ci0JCQlwYXJlbnRNb25pdG9ycyA9IChQcm9qZWN0TW9uaXRvcnMpIHByb2plY3RzLmdldChwYXJlbnRQcm9qZWN0KTsKLQkJCXBhcmVudFByb2plY3QgPSBudWxsOwotCQkJbW9uaXRvcnMuc2V0TWFpbk1vbml0b3Ioc3ViTW9uaXRvckZvcihwYXJlbnRNb25pdG9ycy5nZXRUYXNrTW9uaXRvcigpLCAxKSk7Ci0JCX0KLQkJbW9uaXRvcnMuZ2V0TWFpbk1vbml0b3IoKS5iZWdpblRhc2soIiIsIHdvcmspOyAgLy8kTk9OLU5MUy0xJAotCQlwcm9qZWN0cy5wdXQoY3VycmVudFByb2plY3QsIG1vbml0b3JzKTsKLQkJcmV0dXJuIG1vbml0b3JzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMaXN0ZW5lciN0YXJnZXRGaW5pc2hlZChvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRhcmdldEZpbmlzaGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKLQkJY2hlY2tDYW5jZWxlZCgpOwotCQlQcm9qZWN0IGN1cnJlbnRQcm9qZWN0ID0gZXZlbnQuZ2V0UHJvamVjdCgpOwotCQlpZiAoY3VycmVudFByb2plY3QgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCVByb2plY3RNb25pdG9ycyBtb25pdG9ycyA9IChQcm9qZWN0TW9uaXRvcnMpIHByb2plY3RzLmdldChjdXJyZW50UHJvamVjdCk7Ci0JCWlmIChtb25pdG9ycyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJbW9uaXRvcnMuZ2V0VGFyZ2V0TW9uaXRvcigpLmRvbmUoKTsKLQkJLy8gaWYgdGhpcyBpcyBub3QgdGhlIG1haW4gcHJvamVjdCB0ZXN0IGlmIHdlIGFyZSBkb25lIHdpdGggdGhpcyBwcm9qZWN0Ci0JCWlmICgoY3VycmVudFByb2plY3QgIT0gbWFpblByb2plY3QpICYmIChtb25pdG9ycy5nZXRNYWluVGFyZ2V0KCkgPT0gZXZlbnQuZ2V0VGFyZ2V0KCkpKSB7Ci0JCQltb25pdG9ycy5nZXRNYWluTW9uaXRvcigpLmRvbmUoKTsKLQkJCXByb2plY3RzLnJlbW92ZShjdXJyZW50UHJvamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkTGlzdGVuZXIjdGFza1N0YXJ0ZWQob3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0YXNrU3RhcnRlZChCdWlsZEV2ZW50IGV2ZW50KSB7Ci0JCWNoZWNrQ2FuY2VsZWQoKTsKLQkJUHJvamVjdCBjdXJyZW50UHJvamVjdCA9IGV2ZW50LmdldFByb2plY3QoKTsKLQkJaWYgKGN1cnJlbnRQcm9qZWN0ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQljdXJyZW50UHJvamVjdC5nZXRSZWZlcmVuY2VzKCkucmVtb3ZlKEFudENvcmVQbHVnaW4uRUNMSVBTRV9QUk9HUkVTU19NT05JVE9SKTsKLQkJUHJvamVjdE1vbml0b3JzIG1vbml0b3JzID0gKFByb2plY3RNb25pdG9ycykgcHJvamVjdHMuZ2V0KGN1cnJlbnRQcm9qZWN0KTsKLQkJaWYgKG1vbml0b3JzID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlUYXNrIHRhc2sgPSBldmVudC5nZXRUYXNrKCk7Ci0JCWlmICh0YXNrID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQljdXJyZW50VGFza1RocmVhZD0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKTsKLQkJbW9uaXRvcnMuc2V0VGFza01vbml0b3Ioc3ViTW9uaXRvckZvcihtb25pdG9ycy5nZXRUYXJnZXRNb25pdG9yKCksIDEpKTsKLQkJbW9uaXRvcnMuZ2V0VGFza01vbml0b3IoKS5iZWdpblRhc2soIiIsIDEpOyAgLy8kTk9OLU5MUy0xJAotCQkvLyBJZiB0aGlzIHNjcmlwdCBpcyBjYWxsaW5nIGFub3RoZXIgb25lLCB0cmFjayB0aGUgcHJvamVjdCBjaGFpbi4KLQkJaWYgKHRhc2sgaW5zdGFuY2VvZiBBbnQpIHsKLQkJCXBhcmVudFByb2plY3QgPSBjdXJyZW50UHJvamVjdDsKLQkJfSBlbHNlIHsKLQkJCWN1cnJlbnRQcm9qZWN0LmFkZFJlZmVyZW5jZShBbnRDb3JlUGx1Z2luLkVDTElQU0VfUFJPR1JFU1NfTU9OSVRPUiwgbW9uaXRvcnMuZ2V0VGFza01vbml0b3IoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkTGlzdGVuZXIjdGFza0ZpbmlzaGVkKG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgdGFza0ZpbmlzaGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKLQkJY2hlY2tDYW5jZWxlZCgpOwotCQlQcm9qZWN0IHByb2plY3QgPSBldmVudC5nZXRQcm9qZWN0KCk7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlwcm9qZWN0LmdldFJlZmVyZW5jZXMoKS5yZW1vdmUoQW50Q29yZVBsdWdpbi5FQ0xJUFNFX1BST0dSRVNTX01PTklUT1IpOwotCQlQcm9qZWN0TW9uaXRvcnMgbW9uaXRvcnMgPSAoUHJvamVjdE1vbml0b3JzKSBwcm9qZWN0cy5nZXQocHJvamVjdCk7Ci0JCWlmIChtb25pdG9ycyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJbW9uaXRvcnMuZ2V0VGFza01vbml0b3IoKS5kb25lKCk7Ci0JCWN1cnJlbnRUYXNrVGhyZWFkPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMaXN0ZW5lciNtZXNzYWdlTG9nZ2VkKG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgbWVzc2FnZUxvZ2dlZChCdWlsZEV2ZW50IGV2ZW50KSB7Ci0JCWNoZWNrQ2FuY2VsZWQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjaGVja0NhbmNlbGVkKCkgewotCQkvL29ubHkgY2FuY2VsIGlmIHRoZSBjdXJyZW50IHRhc2sgdGhyZWFkIG1hdGNoZXMgdGhlIGN1cnJlbnQgdGhyZWFkCi0JCS8vZG8gbm90IHdhbnQgdG8gdGhyb3cgYW4gZXhjZXB0aW9uIGluIGEgc2VwYXJhdGUgdGhyZWFkIG9yIHByb2Nlc3MKLQkJLy9zZWUgYnVnIDMyNjU3Ci0JCWlmIChjdXJyZW50VGFza1RocmVhZCAhPSBudWxsICYmIGN1cnJlbnRUYXNrVGhyZWFkICE9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlQcm9qZWN0TW9uaXRvcnMgbW9uaXRvcnMgPSAoUHJvamVjdE1vbml0b3JzKSBwcm9qZWN0cy5nZXQobWFpblByb2plY3QpOwotCQlpZiAobW9uaXRvcnMuZ2V0TWFpbk1vbml0b3IoKS5pc0NhbmNlbGVkKCkpIHsKLQkJCWN1cnJlbnRUYXNrVGhyZWFkPSBudWxsOwotCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKEludGVybmFsQW50TWVzc2FnZXMuZ2V0U3RyaW5nKCJQcm9ncmVzc0J1aWxkTGlzdGVuZXIuQnVpbGRfY2FuY2VsbGVkLl81IikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSVByb2dyZXNzTW9uaXRvciBzdWJNb25pdG9yRm9yKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgaW50IHRpY2tzKSB7Ci0JCWlmIChtb25pdG9yID09IG51bGwpIHsKLQkJCXJldHVybiBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQl9Ci0JCWlmIChtb25pdG9yIGluc3RhbmNlb2YgTnVsbFByb2dyZXNzTW9uaXRvcikgewotCQkJcmV0dXJuIG1vbml0b3I7Ci0JCX0KLQkJcmV0dXJuIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgdGlja3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS8uY2xhc3NwYXRoIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwMjY2MTIuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJ0ZXN0IHBsdWdpbiIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InRlc3RzIi8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0idGVzdCBzdXBwb3J0Ii8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iL29yZy5hcGFjaGUuYW50Ii8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iL29yZy5qdW5pdCIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Ii9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Ii9vcmcuYXBhY2hlLnhlcmNlcyIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Ii9vcmcuZWNsaXBzZS5qZHQuY29yZSIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Ii9vcmcuZWNsaXBzZS51aSIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Ii9vcmcuZWNsaXBzZS5hbnQuY29yZSIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Ii9vcmcuZWNsaXBzZS51cGRhdGUuY29yZSIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Ii9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSIvb3JnLmVjbGlwc2UuY29yZS5ib290Ii8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InZhciIgcGF0aD0iSlJFX0xJQiIgcm9vdHBhdGg9IkpSRV9TUkNST09UIiBzb3VyY2VwYXRoPSJKUkVfU1JDIi8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS8uY3ZzaWdub3JlIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3YjQ4MGYuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWJpbgotbGliCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvLnByb2plY3QgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3ZDE0NDkuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQkJPHByb2plY3Q+b3JnLmFwYWNoZS5hbnQ8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5hcGFjaGUueGVyY2VzPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5hbnQuY29yZTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuY29yZS5ib290PC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlczwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuY29yZS5ydW50aW1lPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5qZHQuY29yZTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UudWk8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuanVuaXQ8L3Byb2plY3Q+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS9hYm91dC5odG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1N2I0MzIuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+MTZ0aCBPY3RvYmVyLCAyMDAyPC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLTxwPkVjbGlwc2Uub3JnIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0NQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIENQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgQ1BMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxoMz5Db250cmlidXRpb25zPC9oMz4KLQotPHA+SWYgdGhpcyBDb250ZW50IGlzIGxpY2Vuc2VkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENQTCwgYW55IENvbnRyaWJ1dGlvbnMsIGFzIGRlZmluZWQgaW4gdGhlIENQTCwgdXBsb2FkZWQsIHN1Ym1pdHRlZCwgb3Igb3RoZXJ3aXNlCi1tYWRlIGF2YWlsYWJsZSB0byBFY2xpcHNlLm9yZywgbWVtYmVycyBvZiBFY2xpcHNlLm9yZyBhbmQvb3IgdGhlIGhvc3Qgb2YgRWNsaXBzZS5vcmcgd2ViIHNpdGUsIGJ5IHlvdSB0aGF0IHJlbGF0ZSB0byBzdWNoCi1Db250ZW50IGFyZSBwcm92aWRlZCB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENQTCBhbmQgY2FuIGJlIG1hZGUgYXZhaWxhYmxlIHRvIG90aGVycyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENQTC48L3A+Ci0KLTxwPklmIHRoaXMgQ29udGVudCBpcyBsaWNlbnNlZCB0byB5b3UgdW5kZXIgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvdGhlciB0aGFuIHRoZSBDUEwgKCZxdW90O090aGVyIExpY2Vuc2UmcXVvdDspLCBhbnkgbW9kaWZpY2F0aW9ucywgZW5oYW5jZW1lbnRzIGFuZC9vcgotb3RoZXIgY29kZSBhbmQvb3IgZG9jdW1lbnRhdGlvbiAoJnF1b3Q7TW9kaWZpY2F0aW9ucyZxdW90OykgdXBsb2FkZWQsIHN1Ym1pdHRlZCwgb3Igb3RoZXJ3aXNlIG1hZGUgYXZhaWxhYmxlIHRvIEVjbGlwc2Uub3JnLCBtZW1iZXJzIG9mIEVjbGlwc2Uub3JnIGFuZC9vciB0aGUKLWhvc3Qgb2YgRWNsaXBzZS5vcmcsIGJ5IHlvdSB0aGF0IHJlbGF0ZSB0byBzdWNoIENvbnRlbnQgYXJlIHByb3ZpZGVkIHVuZGVyIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBPdGhlciBMaWNlbnNlIGFuZCBjYW4gYmUgbWFkZSBhdmFpbGFibGUKLXRvIG90aGVycyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE90aGVyIExpY2Vuc2UuICBJbiBhZGRpdGlvbiwgd2l0aCByZWdhcmQgdG8gTW9kaWZpY2F0aW9ucyBmb3Igd2hpY2ggeW91IGFyZSB0aGUgY29weXJpZ2h0IGhvbGRlciwgeW91IGFyZSBhbHNvCi1wcm92aWRpbmcgdGhlIE1vZGlmaWNhdGlvbnMgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBDUEwgYW5kIHN1Y2ggTW9kaWZpY2F0aW9ucyBjYW4gYmUgbWFkZSBhdmFpbGFibGUgdG8gb3RoZXJzIHVuZGVyIHRoZSB0ZXJtcyBvZgotdGhlIENQTC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvYnVpbGQucHJvcGVydGllcyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWE2YThiLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotCQkJICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgdGVzdC54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICB0ZXN0YnVpbGRmaWxlcy8sXAotICAgICAgICAgICAgICAgdGVzdHJlc291cmNlcy8sXAotICAgICAgICAgICAgICAgdGVzdGxpYi8sXAotICAgICAgICAgICAgICAgbGliLyxcCi0gICAgICAgICAgICAgICBsaWIvKi5qYXIsXAotICAgICAgICAgICAgICAgKi5qYXIKLSAgICAgICAgICAgICAgIAotc291cmNlLmFudHRlc3RzY29yZS5qYXIgPSB0ZXN0IHBsdWdpbi8sXAotICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RzLyxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRmaWxlcy8KLXNvdXJjZS5saWIvYW50VGVzdHNTdXBwb3J0LmphciA9IHRlc3Qgc3VwcG9ydC8KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS9idWlsZGZpbGVzL2J1aWxkQW50VGVzdHNTdXBwb3J0SkFSLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS9idWlsZGZpbGVzL2J1aWxkQW50VGVzdHNTdXBwb3J0SkFSLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU5NjNiOC4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvYnVpbGRmaWxlcy9idWlsZEFudFRlc3RzU3VwcG9ydEpBUi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3QgbmFtZT0iYnVpbGQgdGVzdHMgc3VwcG9ydCBqYXIiIGRlZmF1bHQ9ImJ1aWxkIiBiYXNlZGlyPSIuLiI+Ci0KLQk8cHJvcGVydHkgbmFtZT0iYm9vdGNsYXNzcGF0aCIgdmFsdWU9IiIvPgotCi0JPHRhcmdldCBuYW1lPSJidWlsZCIgZGVzY3JpcHRpb249IlJlbW92ZXMgYWxsIGJ1aWxkIGFydGlmYWN0cywgcmVjcmVhdGVzIHRoZSBzdXBwb3J0IGphciwgYW5kIHJlZnJlc2hlcyB0aGlzIHBsdWdpbidzIHJlc291cmNlcyI+Ci0JCTxhbnRjYWxsIHRhcmdldD0iY2xlYW4iLz4KLQkJPGFudGNhbGwgdGFyZ2V0PSJsaWIvYW50VGVzdHNTdXBwb3J0LmphciIvPgotCQk8YW50Y2FsbCB0YXJnZXQ9InJlZnJlc2giLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iaW5pdCIgZGVwZW5kcz0icHJvcGVydGllcyI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4iIHZhbHVlPSJvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZSIvPgotCQk8cHJvcGVydHkgbmFtZT0idmVyc2lvbi5zdWZmaXgiIHZhbHVlPSJfMi4xLjAiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImZ1bGwubmFtZSIgdmFsdWU9IiR7cGx1Z2lufSR7dmVyc2lvbi5zdWZmaXh9Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ0ZW1wLmZvbGRlciIgdmFsdWU9IiR7YmFzZWRpcn0vdGVtcC5mb2xkZXIiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbi5kZXN0aW5hdGlvbiIgdmFsdWU9IiR7YmFzZWRpcn0iLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJ1aWxkLnJlc3VsdC5mb2xkZXIiIHZhbHVlPSIke2Jhc2VkaXJ9Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ3aW4zMi5qYXIiIHZhbHVlPSIke2Jhc2VkaXJ9Ly4uL29yZy5lY2xpcHNlLnN3dC53aW4zMi93cy93aW4zMi9zd3QuamFyIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJndGsuamFyIiB2YWx1ZT0iJHtiYXNlZGlyfS8uLi9vcmcuZWNsaXBzZS5zd3QuZ3RrL3dzL2d0ay9zd3QuamFyIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJtb3RpZi5qYXIiIHZhbHVlPSIke2Jhc2VkaXJ9Ly4uL29yZy5lY2xpcHNlLnN3dC5tb3RpZi93cy9tb3RpZi9zd3QuamFyIi8+Ci0JCTxhdmFpbGFibGUgZmlsZT0iJHt3aW4zMi5qYXJ9IiBwcm9wZXJ0eT0ic3d0LmphciIgdmFsdWU9IiR7d2luMzIuamFyfSIvPgotCQk8YXZhaWxhYmxlIGZpbGU9IiR7Z3RrLmphcn0iIHByb3BlcnR5PSJzd3QuamFyIiB2YWx1ZT0iJHtndGsuamFyfSIvPgotCQk8YXZhaWxhYmxlIGZpbGU9IiR7bW90aWYuamFyfSIgcHJvcGVydHk9InN3dC5qYXIiIHZhbHVlPSIke21vdGlmLmphcn0iLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0icHJvcGVydGllcyIgaWY9ImVjbGlwc2UucnVubmluZyI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJidWlsZC5jb21waWxlciIgdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLkpEVENvbXBpbGVyQWRhcHRlciIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJsaWIvYW50VGVzdHNTdXBwb3J0LmphciIgZGVwZW5kcz0iaW5pdCIgZGVzY3JpcHRpb249ICJCdWlsZHMgdGhlIHN1cHBvcnQgSkFSIj4KLQkJPHByb3BlcnR5IG5hbWU9ImRlc3RkaXIiIHZhbHVlPSIke3RlbXAuZm9sZGVyfS9saWIvYW50VGVzdHNTdXBwb3J0Lmphci5iaW4iLz4KLQkJPGRlbGV0ZSBkaXI9IiR7dGVtcC5mb2xkZXJ9L2xpYi9hbnRUZXN0c1N1cHBvcnQuamFyLmJpbiIvPgotCQk8bWtkaXIgZGlyPSIke3RlbXAuZm9sZGVyfS9saWIvYW50VGVzdHNTdXBwb3J0Lmphci5iaW4iLz4KLQkJPCEtLSBjb21waWxlIHRoZSBzb3VyY2UgY29kZSAtLT4KLQkJPGphdmFjIHRhcmdldD0iMS4zIiBzb3VyY2U9IjEuMyIgZGVzdGRpcj0iJHt0ZW1wLmZvbGRlcn0vbGliL2FudFRlc3RzU3VwcG9ydC5qYXIuYmluIiBmYWlsb25lcnJvcj0iZmFsc2UiIHZlcmJvc2U9ImZhbHNlIiBkZWJ1Zz0ib24iIGluY2x1ZGVBbnRSdW50aW1lPSJubyIgYm9vdGNsYXNzcGF0aD0iJHtib290Y2xhc3NwYXRofSIgY2xhc3NwYXRoPSIke2Jhc2VkaXJ9Ly4uL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS9ydW50aW1lLmphcjske2Jhc2VkaXJ9Ly4uL29yZy5hcGFjaGUuYW50L2FudC5qYXI7JHtiYXNlZGlyfS8uLi9vcmcuYXBhY2hlLnhlcmNlcy94ZXJjZXNJbXBsLmphcjske2Jhc2VkaXJ9Ly4uL29yZy5hcGFjaGUueGVyY2VzL3htbFBhcnNlckFQSXMuamFyOyR7YmFzZWRpcn0vYmluOyR7YmFzZWRpcn0vLi4vb3JnLmVjbGlwc2UuY29yZS5ib290L2Jvb3QuamFyOyR7YmFzZWRpcn0vLi4vb3JnLmVjbGlwc2UuYW50LmNvcmUvYmluIj4KLQkJCTxzcmMgcGF0aD0idGVzdCBzdXBwb3J0LyIvPgotCQk8L2phdmFjPgotCQk8bWtkaXIgZGlyPSIke2J1aWxkLnJlc3VsdC5mb2xkZXJ9L2xpYiIvPgotCQk8amFyIGphcmZpbGU9IiR7YnVpbGQucmVzdWx0LmZvbGRlcn0vbGliL2FudFRlc3RzU3VwcG9ydC5qYXIiIGJhc2VkaXI9IiR7dGVtcC5mb2xkZXJ9L2xpYi9hbnRUZXN0c1N1cHBvcnQuamFyLmJpbiIvPgotCQk8ZGVsZXRlIGRpcj0iJHt0ZW1wLmZvbGRlcn0iLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iY2xlYW4iIGRlcGVuZHM9ImluaXQiPgotCQk8ZGVsZXRlIGZpbGU9IiR7YnVpbGQucmVzdWx0LmZvbGRlcn0vbGliL2FudFRlc3RzU3VwcG9ydC5qYXIiLz4KLQkJPGRlbGV0ZSBkaXI9IiR7dGVtcC5mb2xkZXJ9Ii8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9InJlZnJlc2giIGRlcGVuZHM9ImluaXQiIGlmPSJlY2xpcHNlLnJ1bm5pbmciIGRlc2NyaXB0aW9uPSAiUmVmcmVzaGVzIHRoZSBwcm9qZWN0J3MgcmVzb3VyY2VzIj4KLQkJPGVjbGlwc2UucmVmcmVzaExvY2FsIHJlc291cmNlPSIke3BsdWdpbn0iIGRlcHRoPSJpbmZpbml0ZSIvPgotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL2xpYi9hbnRUZXN0c1N1cHBvcnQuamFyIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL2xpYi9hbnRUZXN0c1N1cHBvcnQuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmQ2MjRhLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS9saWIvYW50VGVzdHNTdXBwb3J0LmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS9wbHVnaW4ucHJvcGVydGllcyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTgxNTI5NC4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lPUFudCBDb3JlIFRlc3QgUGx1Z2luCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS9wbHVnaW4ueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmZDc5ODkuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08cGx1Z2luCi0gICBpZD0ib3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUiCi0gICBuYW1lPSIlcGx1Z2luTmFtZSIKLSAgIHZlcnNpb249IjIuMS4wIgotICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgIGNsYXNzPSJvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS50ZXN0cGx1Z2luLkFudFRlc3RQbHVnaW4iPgotICAgCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmFwYWNoZS5hbnQiLz4KLQkgIDxpbXBvcnQgcGx1Z2luPSJvcmcuanVuaXQiLz4gICAKLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5hcGFjaGUueGVyY2VzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamR0LmNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmFudC5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLTxydW50aW1lPgotICA8bGlicmFyeSBuYW1lPSJhbnR0ZXN0c2NvcmUuamFyIiA+Ci0gICAgIDxleHBvcnQgbmFtZSA9ICIqIi8+Ci0gIDwvbGlicmFyeT4gCi08L3J1bnRpbWU+Ci0KLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmFudC5jb3JlLmV4dHJhQ2xhc3NwYXRoRW50cmllcyI+Ci0JCTxleHRyYUNsYXNzcGF0aEVudHJ5Ci0JCWxpYnJhcnk9ImxpYi9hbnRUZXN0c1N1cHBvcnQuamFyIj4KLQk8L2V4dHJhQ2xhc3NwYXRoRW50cnk+Ci08L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdCBwbHVnaW4vb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvdGVzdHBsdWdpbi9BbnRGaWxlUnVubmVyLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdCBwbHVnaW4vb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvdGVzdHBsdWdpbi9BbnRGaWxlUnVubmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0ZTgyMTYuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3QgcGx1Z2luL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3Rlc3RwbHVnaW4vQW50RmlsZVJ1bm5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS50ZXN0cGx1Z2luOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS5BbnRSdW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUuQWJzdHJhY3RBbnRUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotCi0vKioKLSAqIFJlc3BvbnNpYmxlIGZvciBydW5uaW5nIHRlc3QgYW50IGJ1aWxkIGZpbGVzLgotICovCi1wdWJsaWMgY2xhc3MgQW50RmlsZVJ1bm5lciB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJBU0VfRElSX1BSRUZJWCA9ICItRGJhc2VkaXI9IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHZvaWQgcnVuKElGaWxlIGJ1aWxkRmlsZSwgU3RyaW5nW10gdGFyZ2V0cywgU3RyaW5nW10gYXJncywgU3RyaW5nIGJhc2VEaXIsIGJvb2xlYW4gY2FwdHVyZU91dHB1dCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQotCQlBbnRSdW5uZXIgcnVubmVyID0gbmV3IEFudFJ1bm5lcigpOwotCi0JCVN0cmluZ1tdIHJ1bm5lckFyZ3MgPSBhcmdzOwotCi0JCWlmIChiYXNlRGlyLmxlbmd0aCgpID4gMCkgewotCQkJLy8gQW50IHJlcXVpcmVzIHRoZSB3b3JraW5nIGRpcmVjdG9yeSB0byBiZSBzcGVjaWZpZWQKLQkJCS8vIGFzIG9uZSBvZiB0aGUgYXJndW1lbnRzLCBzbyBpdCBuZWVkcyB0byBiZSBhcHBlbmRlZC4KLQkJCWludCBsZW5ndGggPSAxOwotCQkJaWYgKGFyZ3MgIT0gbnVsbCkgewotCQkJCWxlbmd0aCA9IGFyZ3MubGVuZ3RoICsgMTsKLQkJCX0gCi0JCQkKLQkJCXJ1bm5lckFyZ3MgPSBuZXcgU3RyaW5nW2xlbmd0aF07Ci0JCQlpZiAoYXJncyAhPSBudWxsKSB7Ci0JCQkJU3lzdGVtLmFycmF5Y29weShhcmdzLCAwLCBydW5uZXJBcmdzLCAwLCBhcmdzLmxlbmd0aCk7Ci0JCQl9Ci0JCQlydW5uZXJBcmdzW2xlbmd0aCAtIDFdID0gQkFTRV9ESVJfUFJFRklYICsgYmFzZURpcjsKLQkJfQotCQlydW5uZXIuc2V0QXJndW1lbnRzKHJ1bm5lckFyZ3MpOwotCi0JCWlmIChidWlsZEZpbGUgIT0gbnVsbCkgewotCQkJcnVubmVyLnNldEJ1aWxkRmlsZUxvY2F0aW9uKGJ1aWxkRmlsZS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpLnRvU3RyaW5nKCkpOwotCQl9Ci0JCWlmICh0YXJnZXRzICE9IG51bGwgJiYgdGFyZ2V0cy5sZW5ndGggPiAwKSB7Ci0JCQlydW5uZXIuc2V0RXhlY3V0aW9uVGFyZ2V0cyh0YXJnZXRzKTsKLQkJfQotCQlpZiAoY2FwdHVyZU91dHB1dCkgewotCQkJcnVubmVyLmFkZEJ1aWxkTG9nZ2VyKEFic3RyYWN0QW50VGVzdC5BTlRfVEVTVF9CVUlMRF9MT0dHRVIpOwotCQl9Ci0KLQkJcnVubmVyLnJ1bihudWxsKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKFN0cmluZ1tdIGFyZ3MsIFN0cmluZyBiYXNlRGlyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkKLQkJQW50UnVubmVyIHJ1bm5lciA9IG5ldyBBbnRSdW5uZXIoKTsKLQotCQlTdHJpbmdbXSBydW5uZXJBcmdzID0gYXJnczsKLQotCQlpZiAoYmFzZURpci5sZW5ndGgoKSA+IDApIHsKLQkJCS8vIEFudCByZXF1aXJlcyB0aGUgd29ya2luZyBkaXJlY3RvcnkgdG8gYmUgc3BlY2lmaWVkCi0JCQkvLyBhcyBvbmUgb2YgdGhlIGFyZ3VtZW50cywgc28gaXQgbmVlZHMgdG8gYmUgYXBwZW5kZWQuCi0JCQlydW5uZXJBcmdzID0gbmV3IFN0cmluZ1thcmdzLmxlbmd0aCArIDFdOwotCQkJU3lzdGVtLmFycmF5Y29weShhcmdzLCAwLCBydW5uZXJBcmdzLCAwLCBhcmdzLmxlbmd0aCk7Ci0JCQlydW5uZXJBcmdzW2FyZ3MubGVuZ3RoXSA9IEJBU0VfRElSX1BSRUZJWCArIGJhc2VEaXI7Ci0JCX0KLQkJcnVubmVyLnNldEFyZ3VtZW50cyhydW5uZXJBcmdzKTsKLQotCQlydW5uZXIucnVuKGFyZ3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0IHBsdWdpbi9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS90ZXN0cGx1Z2luL0FudFRlc3RDaGVja2VyLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdCBwbHVnaW4vb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvdGVzdHBsdWdpbi9BbnRUZXN0Q2hlY2tlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmFiYmYxLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0IHBsdWdpbi9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS90ZXN0cGx1Z2luL0FudFRlc3RDaGVja2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS50ZXN0cGx1Z2luOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBBbnRUZXN0Q2hlY2tlciB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgQW50VGVzdENoZWNrZXIgZGVmbHQ9IG51bGw7Ci0JCi0JcHJpdmF0ZSBpbnQgdGFza1N0YXJ0ZWRDb3VudDsKLQkKLQlwcml2YXRlIGludCB0YXNrRmluaXNoZWRDb3VudDsKLQkKLQlwcml2YXRlIGludCB0YXJnZXRzU3RhcnRlZENvdW50OwotCQotCXByaXZhdGUgaW50IHRhcmdldHNGaW5pc2hlZENvdW50OwotCQotCXByaXZhdGUgaW50IGJ1aWxkc1N0YXJ0ZWRDb3VudDsKLQkKLQlwcml2YXRlIGludCBidWlsZHNGaW5pc2hlZENvdW50OwotCQotCXByaXZhdGUgTGlzdCBtZXNzYWdlcz0gbmV3IEFycmF5TGlzdCgpOwotCQotCXByaXZhdGUgTGlzdCB0YXJnZXRzPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCi0JcHJpdmF0ZSBMaXN0IHRhc2tzPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCi0JcHJpdmF0ZSBMaXN0IHByb2plY3RzPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCi0JcHJpdmF0ZSBIYXNodGFibGUgdXNlclByb3BlcnRpZXM7Ci0JCi0JcHJpdmF0ZSBMaXN0IG5hbWVPZkxpc3RlbmVycz0gbmV3IEFycmF5TGlzdCgpOwotCQotCXByaXZhdGUgQW50VGVzdENoZWNrZXIoKSAgewotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gQW50TG9nZ2VyQ2hlY2tlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQW50VGVzdENoZWNrZXIgZ2V0RGVmYXVsdCgpIHsKLQkJaWYgKGRlZmx0ID09IG51bGwpIHsKLQkJCWRlZmx0PSBuZXcgQW50VGVzdENoZWNrZXIoKTsKLQkJfQotCQlyZXR1cm4gZGVmbHQ7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBBbnRMb2dnZXJDaGVja2VyCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlc2V0KCkgewotCQlpZiAoZGVmbHQgIT0gbnVsbCkgewotCQkJZGVmbHQucmVzZXRTdGF0ZSgpOwotCQl9Ci0JfQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMaXN0ZW5lciNidWlsZEZpbmlzaGVkKG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgYnVpbGRGaW5pc2hlZChTdHJpbmcgcHJvamVjdE5hbWUpIHsKLQkJYnVpbGRzRmluaXNoZWRDb3VudCsrOwotCX0KLQotCQotCXB1YmxpYyB2b2lkIGJ1aWxkU3RhcnRlZChTdHJpbmcgcHJvamVjdE5hbWUpIHsKLQkJYnVpbGRzU3RhcnRlZENvdW50Kys7Ci0JCXByb2plY3RzLmFkZChwcm9qZWN0TmFtZSk7Ci0JfQotCi0JCi0JcHVibGljIHZvaWQgbWVzc2FnZUxvZ2dlZChTdHJpbmcgbWVzc2FnZSkgewotCQltZXNzYWdlcy5hZGQobWVzc2FnZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZExpc3RlbmVyI3RhcmdldEZpbmlzaGVkKG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgdGFyZ2V0RmluaXNoZWQoU3RyaW5nIHRhcmdldE5hbWUpIHsKLQkJdGFyZ2V0c0ZpbmlzaGVkQ291bnQrKzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkTGlzdGVuZXIjdGFyZ2V0U3RhcnRlZChvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRhcmdldFN0YXJ0ZWQoU3RyaW5nIHRhcmdldE5hbWUpIHsKLQkJdGFyZ2V0c1N0YXJ0ZWRDb3VudCsrOwotCQl0YXJnZXRzLmFkZCh0YXJnZXROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkTGlzdGVuZXIjdGFza0ZpbmlzaGVkKG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgdGFza0ZpbmlzaGVkKFN0cmluZyB0YXNrTmFtZSkgewotCQl0YXNrRmluaXNoZWRDb3VudCsrOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMaXN0ZW5lciN0YXNrU3RhcnRlZChvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRhc2tTdGFydGVkKFN0cmluZyB0YXNrTmFtZSkgewotCQl0YXNrU3RhcnRlZENvdW50Kys7Ci0JCXRhc2tzLmFkZCh0YXNrTmFtZSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGJ1aWxkc0ZpbmlzaGVkQ291bnQuCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldEJ1aWxkc0ZpbmlzaGVkQ291bnQoKSB7Ci0JCXJldHVybiBidWlsZHNGaW5pc2hlZENvdW50OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGJ1aWxkc1N0YXJ0ZWRDb3VudC4KLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0QnVpbGRzU3RhcnRlZENvdW50KCkgewotCQlyZXR1cm4gYnVpbGRzU3RhcnRlZENvdW50OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1lc3NhZ2VzTG9nZ2VkQ291bnQuCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldE1lc3NhZ2VzTG9nZ2VkQ291bnQoKSB7Ci0JCXJldHVybiBtZXNzYWdlcy5zaXplKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGFyZ2V0c0ZpbmlzaGVkQ291bnQuCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFRhcmdldHNGaW5pc2hlZENvdW50KCkgewotCQlyZXR1cm4gdGFyZ2V0c0ZpbmlzaGVkQ291bnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGFyZ2V0c1N0YXJ0ZWRDb3VudC4KLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VGFyZ2V0c1N0YXJ0ZWRDb3VudCgpIHsKLQkJcmV0dXJuIHRhcmdldHNTdGFydGVkQ291bnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGFza0ZpbmlzaGVkQ291bnQuCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFRhc2tGaW5pc2hlZENvdW50KCkgewotCQlyZXR1cm4gdGFza0ZpbmlzaGVkQ291bnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGFza1N0YXJ0ZWRDb3VudC4KLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VGFza1N0YXJ0ZWRDb3VudCgpIHsKLQkJcmV0dXJuIHRhc2tTdGFydGVkQ291bnQ7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlc2V0U3RhdGUoKSB7Ci0JCXRhc2tTdGFydGVkQ291bnQ9IDA7Ci0JCXRhc2tGaW5pc2hlZENvdW50PSAwOwotCQl0YXJnZXRzU3RhcnRlZENvdW50PSAwOwotCQl0YXJnZXRzRmluaXNoZWRDb3VudD0gMDsKLQkJYnVpbGRzU3RhcnRlZENvdW50PSAwOwotCQlidWlsZHNGaW5pc2hlZENvdW50PSAwOwotCQltZXNzYWdlcz0gbmV3IEFycmF5TGlzdCgpOwotCQl0YXNrcz0gbmV3IEFycmF5TGlzdCgpOwotCQl0YXJnZXRzPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXByb2plY3RzPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXVzZXJQcm9wZXJ0aWVzPSBudWxsOwotCQluYW1lT2ZMaXN0ZW5lcnM9IG5ldyBBcnJheUxpc3QoKTsKLQl9Ci0JCi0JLyoqCi0gICAgICogUmV0dXJuIHRoZSBtZXNzYWdlIG4gZnJvbSB0aGUgbGFzdDoKLSAgICAgKiBlLmcuIGdldExvZ2dlZE1lc3NhZ2UoMCkgcmV0dXJucyB0aGUgbW9zdCByZWNlbnQgbWVzc2FnZQotICAgICAqIAotCSAqIEBwYXJhbSBuIG1lc3NhZ2UgaW5kZXgKLQkgKiBAcmV0dXJuIHRoZSBudGggbGFzdCBtZXNzYWdlCi0JICovCi0gICAgcHVibGljIFN0cmluZyBnZXRMb2dnZWRNZXNzYWdlKGludCBuKSB7Ci0gICAgICAgIG4gPSBtZXNzYWdlcy5zaXplKCkgLSAobiArIDEpOwotICAgICAgICBpZiAoKG4gPCAwKSB8fCAobiA+PSBtZXNzYWdlcy5zaXplKCkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKFN0cmluZykgbWVzc2FnZXMuZ2V0KG4pOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFzdE1lc3NhZ2VMb2dnZWQoKSB7Ci0gICAgICAgIHJldHVybiBnZXRMb2dnZWRNZXNzYWdlKDApOwotICAgIH0KLQkKLQlwdWJsaWMgdm9pZCBzZXRVc2VyUHJvcGVydGllcyhIYXNodGFibGUgdXNlclByb3BlcnRpZXMpIHsKLQkJdGhpcy51c2VyUHJvcGVydGllcz0gdXNlclByb3BlcnRpZXM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRVc2VyUHJvcGVydHkoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpdXNlclByb3BlcnRpZXMuZ2V0KG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgTGlzdCBnZXRNZXNzYWdlcygpIHsKLQkJcmV0dXJuIG1lc3NhZ2VzOwotCX0KLQkKLQlwdWJsaWMgTGlzdCBnZXRMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiBuYW1lT2ZMaXN0ZW5lcnM7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFzdExpc3RlbmVyKCkgewotCQlyZXR1cm4gKFN0cmluZyluYW1lT2ZMaXN0ZW5lcnMuZ2V0KG5hbWVPZkxpc3RlbmVycy5zaXplKCkgLSAxKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGFkZE5hbWVPZkxpc3RlbmVyKFN0cmluZyBuYW1lT2ZMaXN0ZW5lcikgewotCQl0aGlzLm5hbWVPZkxpc3RlbmVycy5hZGQobmFtZU9mTGlzdGVuZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0IHBsdWdpbi9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS90ZXN0cGx1Z2luL0FudFRlc3RQbHVnaW4uamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0IHBsdWdpbi9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS90ZXN0cGx1Z2luL0FudFRlc3RQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMxYzIwOC4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdCBwbHVnaW4vb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvdGVzdHBsdWdpbi9BbnRUZXN0UGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLnRlc3RwbHVnaW47Ci0KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci0KLQotcHVibGljIGNsYXNzIEFudFRlc3RQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBBbnRUZXN0UGx1Z2luIGRlZmx0OwotCQotCXB1YmxpYyBBbnRUZXN0UGx1Z2luKElQbHVnaW5EZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJc3VwZXIoZGVzY3JpcHRvcik7Ci0JCWRlZmx0PSB0aGlzOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIEFudFRlc3RQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIGRlZmx0OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlKCkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgZW5hYmxlQXV0b2J1aWxkKGJvb2xlYW4gZW5hYmxlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIGRpc2FibGUgYXV0byBidWlsZAotCQlJV29ya3NwYWNlIHdvcmtzcGFjZT0gQW50VGVzdFBsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJSVdvcmtzcGFjZURlc2NyaXB0aW9uIGRlc2M9IHdvcmtzcGFjZS5nZXREZXNjcmlwdGlvbigpOwotCQlkZXNjLnNldEF1dG9CdWlsZGluZyhlbmFibGUpOwotCQl3b3Jrc3BhY2Uuc2V0RGVzY3JpcHRpb24oZGVzYyk7Ci0JfQotCQotCXB1YmxpYyBGaWxlIGdldEZpbGVJblBsdWdpbihJUGF0aCBwYXRoKSB7Ci0JCXRyeSB7Ci0JCQlVUkwgaW5zdGFsbFVSTD0gbmV3IFVSTChnZXREZXNjcmlwdG9yKCkuZ2V0SW5zdGFsbFVSTCgpLCBwYXRoLnRvU3RyaW5nKCkpOwotCQkJVVJMIGxvY2FsVVJMPSBQbGF0Zm9ybS5hc0xvY2FsVVJMKGluc3RhbGxVUkwpOwotCQkJcmV0dXJuIG5ldyBGaWxlKGxvY2FsVVJMLmdldEZpbGUoKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3QgcGx1Z2luL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3Rlc3RwbHVnaW4vUHJvamVjdEhlbHBlci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3QgcGx1Z2luL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3Rlc3RwbHVnaW4vUHJvamVjdEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDEzMmMzLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0IHBsdWdpbi9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS90ZXN0cGx1Z2luL1Byb2plY3RIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLnRlc3RwbHVnaW47Ci0KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuSU92ZXJ3cml0ZVF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLndpemFyZHMuZGF0YXRyYW5zZmVyLio7Ci0KLS8qKgotICogSGVscGVyIG1ldGhvZHMgdG8gc2V0IHVwIGFuIElQcm9qZWN0LgotICovCi1wdWJsaWMgY2xhc3MgUHJvamVjdEhlbHBlciB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJUGF0aCBURVNUX0JVSUxERklMRVNfRElSPSBuZXcgUGF0aCgidGVzdGJ1aWxkZmlsZXMiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIElQYXRoIFRFU1RfUkVTT1VSQ0VTX0RJUj0gbmV3IFBhdGgoInRlc3RyZXNvdXJjZXMiKTsJCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJUGF0aCBURVNUX0xJQl9ESVI9IG5ldyBQYXRoKCJ0ZXN0bGliIik7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIElQcm9qZWN0LgotCSAqLwkKLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0IGNyZWF0ZVByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lLCBTdHJpbmcgYmluRm9sZGVyTmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJV29ya3NwYWNlUm9vdCByb290PSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQlJUHJvamVjdCBwcm9qZWN0PSByb290LmdldFByb2plY3QocHJvamVjdE5hbWUpOwotCQlpZiAoIXByb2plY3QuZXhpc3RzKCkpIHsKLQkJCXByb2plY3QuY3JlYXRlKG51bGwpOwotCQl9IGVsc2UgewotCQkJcHJvamVjdC5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCBudWxsKTsKLQkJfQotCQkKLQkJaWYgKCFwcm9qZWN0LmlzT3BlbigpKSB7Ci0JCQlwcm9qZWN0Lm9wZW4obnVsbCk7Ci0JCX0KLQkJCi0JCXJldHVybiBwcm9qZWN0OwotCX0KLQkKLQkvKioKLQkgKiBSZW1vdmVzIGFuIElQcm9qZWN0LgotCSAqLwkJCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZShJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXByb2plY3QuZGVsZXRlKHRydWUsIHRydWUsIG51bGwpOwotCX0KLQotCi0JLyoqCi0JICogQWRkcyBhIGZvbGRlciB0byBhbiBJUHJvamVjdC4KLQkgKi8JCQotCXB1YmxpYyBzdGF0aWMgSUZvbGRlciBhZGRGb2xkZXIoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIGNvbnRhaW5lck5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCi0JCQlJRm9sZGVyIGZvbGRlcj0gcHJvamVjdC5nZXRGb2xkZXIoY29udGFpbmVyTmFtZSk7Ci0JCQlpZiAoIWZvbGRlci5leGlzdHMoKSkgewotCQkJCWZvbGRlci5jcmVhdGUoZmFsc2UsIHRydWUsIG51bGwpOwotCQkJfQotCQkKLQkJcmV0dXJuIGZvbGRlcjsKLQkJCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbXBvcnRGaWxlc0Zyb21EaXJlY3RvcnkoRmlsZSByb290RGlyLCBJUGF0aCBkZXN0UGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewkJCi0JCUlJbXBvcnRTdHJ1Y3R1cmVQcm92aWRlciBzdHJ1Y3R1cmVQcm92aWRlciA9IEZpbGVTeXN0ZW1TdHJ1Y3R1cmVQcm92aWRlci5JTlNUQU5DRTsKLQkJTGlzdCBmaWxlcyA9IG5ldyBBcnJheUxpc3QoMTAwKTsKLQkJYWRkRmlsZXMocm9vdERpciwgZmlsZXMpOwotCQl0cnkgewotCQkJSW1wb3J0T3BlcmF0aW9uIG9wPSBuZXcgSW1wb3J0T3BlcmF0aW9uKGRlc3RQYXRoLCByb290RGlyLCBzdHJ1Y3R1cmVQcm92aWRlciwgbmV3IEltcG9ydE92ZXJ3cml0ZVF1ZXJ5KCksIGZpbGVzKTsKLQkJCW9wLnNldENyZWF0ZUNvbnRhaW5lclN0cnVjdHVyZShmYWxzZSk7Ci0JCQlvcC5ydW4obW9uaXRvcik7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHNob3VsZCBub3QgaGFwcGVuCi0JCX0KLQl9CQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkRmlsZXMoRmlsZSBkaXIsIExpc3QgY29sbGVjdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRmlsZVtdIGZpbGVzID0gZGlyLmxpc3RGaWxlcygpOwotCQlMaXN0IHN1YkRpcnMgPSBuZXcgQXJyYXlMaXN0KDIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZmlsZXNbaV0uaXNGaWxlKCkpIHsKLQkJCQljb2xsZWN0aW9uLmFkZChmaWxlc1tpXSk7Ci0JCQl9IGVsc2UgaWYgKGZpbGVzW2ldLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQlzdWJEaXJzLmFkZChmaWxlc1tpXSk7Ci0JCQl9Ci0JCX0KLQkJSXRlcmF0b3IgaXRlciA9IHN1YkRpcnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlGaWxlIHN1YkRpciA9IChGaWxlKWl0ZXIubmV4dCgpOwotCQkJYWRkRmlsZXMoc3ViRGlyLCBjb2xsZWN0aW9uKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBJbXBvcnRPdmVyd3JpdGVRdWVyeSBpbXBsZW1lbnRzIElPdmVyd3JpdGVRdWVyeSB7Ci0JCXB1YmxpYyBTdHJpbmcgcXVlcnlPdmVyd3JpdGUoU3RyaW5nIGZpbGUpIHsKLQkJCXJldHVybiBBTEw7Ci0JCX0JCi0JfQkJCQotfQotCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdCBzdXBwb3J0L29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3N1cHBvcnQvaW5wdXRIYW5kbGVycy9BbnRUZXN0SW5wdXRIYW5kbGVyLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdCBzdXBwb3J0L29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3N1cHBvcnQvaW5wdXRIYW5kbGVycy9BbnRUZXN0SW5wdXRIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0NDFiMWYuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3Qgc3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS9zdXBwb3J0L2lucHV0SGFuZGxlcnMvQW50VGVzdElucHV0SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS5zdXBwb3J0LmlucHV0SGFuZGxlcnM7Ci0KLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LmlucHV0LkRlZmF1bHRJbnB1dEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuaW5wdXQuSW5wdXRSZXF1ZXN0OwotCi0vKioKLSAqIEEgdGVzdCBpbnB1dCBoYW5kbGVyIHdoZW4gdXNpbmcgQW50IHdpdGhpbiBFY2xpcHNlLgotICogVGhpcyBpcyB0aGUgY2xhc3MgdGhhdCB3aWxsIHJlc3BvbmQgdG8gPGlucHV0PiByZXF1ZXN0cyBmcm9tCi0gKiB3aXRoaW4gYW4gQW50IGJ1aWxkIGZpbGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBBbnRUZXN0SW5wdXRIYW5kbGVyIGV4dGVuZHMgRGVmYXVsdElucHV0SGFuZGxlciB7Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5pbnB1dC5JbnB1dEhhbmRsZXIjaGFuZGxlSW5wdXQob3JnLmFwYWNoZS50b29scy5hbnQuaW5wdXQuSW5wdXRSZXF1ZXN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUlucHV0KElucHV0UmVxdWVzdCByZXF1ZXN0KSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotCQlyZXF1ZXN0LnNldElucHV0KCJ0ZXN0aW5nIGhhbmRsaW5nIGlucHV0IHJlcXVlc3RzIik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3Qgc3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS9zdXBwb3J0L3Rhc2tzL0FudFRlc3RUYXNrLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdCBzdXBwb3J0L29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3N1cHBvcnQvdGFza3MvQW50VGVzdFRhc2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzczYzgzNi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdCBzdXBwb3J0L29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3N1cHBvcnQvdGFza3MvQW50VGVzdFRhc2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUuc3VwcG9ydC50YXNrczsKLQotCi0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkVjaG87Ci0KLQotcHVibGljIGNsYXNzIEFudFRlc3RUYXNrIGV4dGVuZHMgVGFzayB7Ci0JCi0JcHVibGljIEFudFRlc3RUYXNrKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2sjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0JCUVjaG8gZWNobz0gbmV3IEVjaG8oKTsKLQkJZWNoby5zZXRQcm9qZWN0KGdldFByb2plY3QoKSk7Ci0JCWVjaG8uc2V0TWVzc2FnZSgiVGVzdGluZyBBbnQgaW4gRWNsaXBzZSB3aXRoIGEgY3VzdG9tIHRhc2siKTsKLQkJZWNoby5leGVjdXRlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3Qgc3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS9zdXBwb3J0L3Rhc2tzL0FudFRlc3RUYXNrMi5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3Qgc3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS9zdXBwb3J0L3Rhc2tzL0FudFRlc3RUYXNrMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWRkZGM3Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0IHN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvc3VwcG9ydC90YXNrcy9BbnRUZXN0VGFzazIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUuc3VwcG9ydC50YXNrczsKLQotCi0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkVjaG87Ci0KLQotcHVibGljIGNsYXNzIEFudFRlc3RUYXNrMiBleHRlbmRzIFRhc2sgewotCQotCXB1YmxpYyBBbnRUZXN0VGFzazIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzayNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLQkJRWNobyBlY2hvPSBuZXcgRWNobygpOwotCQllY2hvLnNldFByb2plY3QoZ2V0UHJvamVjdCgpKTsKLQkJZWNoby5zZXRNZXNzYWdlKCJUZXN0aW5nIEFudCBpbiBFY2xpcHNlIHdpdGggYSBjdXN0b20gdGFzayIpOwotCQllY2hvLmV4ZWN1dGUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdCBzdXBwb3J0L29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3N1cHBvcnQvdGVzdGxvZ2dlcnMvVGVzdEJ1aWxkTGlzdGVuZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0IHN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvc3VwcG9ydC90ZXN0bG9nZ2Vycy9UZXN0QnVpbGRMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGQ0ZGRmLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0IHN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvc3VwcG9ydC90ZXN0bG9nZ2Vycy9UZXN0QnVpbGRMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS5zdXBwb3J0LnRlc3Rsb2dnZXJzOwotCi0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV2ZW50OwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUudGVzdHBsdWdpbi5BbnRUZXN0Q2hlY2tlcjsKLQotCi1wdWJsaWMgY2xhc3MgVGVzdEJ1aWxkTGlzdGVuZXIgaW1wbGVtZW50cyBCdWlsZExpc3RlbmVyIHsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMaXN0ZW5lciNidWlsZEZpbmlzaGVkKG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgYnVpbGRGaW5pc2hlZChCdWlsZEV2ZW50IGV2ZW50KSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZExpc3RlbmVyI2J1aWxkU3RhcnRlZChvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGJ1aWxkU3RhcnRlZChCdWlsZEV2ZW50IGV2ZW50KSB7Ci0JCUFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5hZGROYW1lT2ZMaXN0ZW5lcih0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkTGlzdGVuZXIjbWVzc2FnZUxvZ2dlZChvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIG1lc3NhZ2VMb2dnZWQoQnVpbGRFdmVudCBldmVudCkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMaXN0ZW5lciN0YXJnZXRGaW5pc2hlZChvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRhcmdldEZpbmlzaGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkTGlzdGVuZXIjdGFyZ2V0U3RhcnRlZChvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRhcmdldFN0YXJ0ZWQoQnVpbGRFdmVudCBldmVudCkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMaXN0ZW5lciN0YXNrRmluaXNoZWQob3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0YXNrRmluaXNoZWQoQnVpbGRFdmVudCBldmVudCkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMaXN0ZW5lciN0YXNrU3RhcnRlZChvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRhc2tTdGFydGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0IHN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvc3VwcG9ydC90ZXN0bG9nZ2Vycy9UZXN0QnVpbGRMb2dnZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0IHN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvc3VwcG9ydC90ZXN0bG9nZ2Vycy9UZXN0QnVpbGRMb2dnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDljMTQxNC4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdCBzdXBwb3J0L29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3N1cHBvcnQvdGVzdGxvZ2dlcnMvVGVzdEJ1aWxkTG9nZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS5zdXBwb3J0LnRlc3Rsb2dnZXJzOwotCi0KLWltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS5BbnRTZWN1cml0eUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS50ZXN0cGx1Z2luLkFudFRlc3RDaGVja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIFRlc3RCdWlsZExvZ2dlciBpbXBsZW1lbnRzIEJ1aWxkTG9nZ2VyIHsKLQotCXByaXZhdGUgaW50IG1lc3NhZ2VPdXRwdXRMZXZlbCA9UHJvamVjdC5NU0dfSU5GTzsKLQlwcml2YXRlIFByaW50U3RyZWFtIGZFcnI9IG51bGw7Ci0JcHJpdmF0ZSBQcmludFN0cmVhbSBmT3V0PSBudWxsOwotCQotCS8qKgotCSAqIEFuIGV4Y2VwdGlvbiB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gbG9nZ2VkLgotCSAqLwotCXByaXZhdGUgVGhyb3dhYmxlIGZIYW5kbGVkRXhjZXB0aW9uPSBudWxsOwotCQotCQotCXB1YmxpYyBUZXN0QnVpbGRMb2dnZXIoKSB7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMb2dnZXIjc2V0TWVzc2FnZU91dHB1dExldmVsKGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXNzYWdlT3V0cHV0TGV2ZWwoaW50IGxldmVsKSB7Ci0JCW1lc3NhZ2VPdXRwdXRMZXZlbD0gbGV2ZWw7Ci0JfQotCQotCXByb3RlY3RlZCBpbnQgZ2V0TWVzc2FnZU91dHB1dExldmVsKCkgewotCQlyZXR1cm4gbWVzc2FnZU91dHB1dExldmVsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMb2dnZXIjc2V0RW1hY3NNb2RlKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW1hY3NNb2RlKGJvb2xlYW4gZW1hY3NNb2RlKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZExpc3RlbmVyI2J1aWxkU3RhcnRlZChvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGJ1aWxkU3RhcnRlZChCdWlsZEV2ZW50IGV2ZW50KSB7Ci0JCUFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5idWlsZFN0YXJ0ZWQoZXZlbnQuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7Ci0JCUFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5zZXRVc2VyUHJvcGVydGllcyhldmVudC5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydGllcygpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkTGlzdGVuZXIjYnVpbGRGaW5pc2hlZChvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGJ1aWxkRmluaXNoZWQoQnVpbGRFdmVudCBldmVudCkgewotCQloYW5kbGVFeGNlcHRpb24oZXZlbnQpOwotCQlmSGFuZGxlZEV4Y2VwdGlvbj0gbnVsbDsKLQkJQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmJ1aWxkRmluaXNoZWQoZXZlbnQuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZExpc3RlbmVyI3RhcmdldFN0YXJ0ZWQob3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0YXJnZXRTdGFydGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKLQkJQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLnRhcmdldFN0YXJ0ZWQoZXZlbnQuZ2V0VGFyZ2V0KCkuZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkTGlzdGVuZXIjdGFyZ2V0RmluaXNoZWQob3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0YXJnZXRGaW5pc2hlZChCdWlsZEV2ZW50IGV2ZW50KSB7Ci0JCWhhbmRsZUV4Y2VwdGlvbihldmVudCk7Ci0JCUFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS50YXJnZXRGaW5pc2hlZChldmVudC5nZXRUYXJnZXQoKS5nZXROYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMaXN0ZW5lciN0YXNrU3RhcnRlZChvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRhc2tTdGFydGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKLQkJQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLnRhc2tTdGFydGVkKGV2ZW50LmdldFRhc2soKS5nZXRUYXNrTmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkTGlzdGVuZXIjdGFza0ZpbmlzaGVkKG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgdGFza0ZpbmlzaGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKLQkJaGFuZGxlRXhjZXB0aW9uKGV2ZW50KTsKLQkJQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLnRhcmdldEZpbmlzaGVkKGV2ZW50LmdldFRhc2soKS5nZXRUYXNrTmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEJ1aWxkTGlzdGVuZXIjbWVzc2FnZUxvZ2dlZChCdWlsZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIG1lc3NhZ2VMb2dnZWQoQnVpbGRFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQuZ2V0UHJpb3JpdHkoKSA+IGdldE1lc3NhZ2VPdXRwdXRMZXZlbCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJbG9nTWVzc2FnZShldmVudC5nZXRNZXNzYWdlKCksIGV2ZW50LmdldFByaW9yaXR5KCkpOwotCQlBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkubWVzc2FnZUxvZ2dlZChldmVudC5nZXRNZXNzYWdlKCkpOwotCX0KLQotCXByb3RlY3RlZCBQcmludFN0cmVhbSBnZXRFcnJvclByaW50U3RyZWFtKCkgewotCQlyZXR1cm4gZkVycjsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByaW50U3RyZWFtIGdldE91dHB1dFByaW50U3RyZWFtKCkgewotCQlyZXR1cm4gZk91dDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZExvZ2dlciNzZXRFcnJvclByaW50U3RyZWFtKGphdmEuaW8uUHJpbnRTdHJlYW0pCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXJyb3JQcmludFN0cmVhbShQcmludFN0cmVhbSBlcnIpIHsKLQkJLy90aGlzIGJ1aWxkIGxvZ2dlciBsb2dzIHRvICJudWxsIiB1bmxlc3MKLQkJLy90aGUgdXNlciBoYXMgZXhwbGljaXRseSBzZXQgYSBsb2dmaWxlIHRvIHVzZQotCQlpZiAoZXJyID09IFN5c3RlbS5lcnIpIHsKLQkJCWZFcnI9IG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQlmRXJyPSBlcnI7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkTG9nZ2VyI3NldE91dHB1dFByaW50U3RyZWFtKGphdmEuaW8uUHJpbnRTdHJlYW0pCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3V0cHV0UHJpbnRTdHJlYW0oUHJpbnRTdHJlYW0gb3V0cHV0KSB7Ci0JCS8vdGhpcyBidWlsZCBsb2dnZXIgbG9ncyB0byAibnVsbCIgdW5sZXNzCi0JCS8vdGhlIHVzZXIgaGFzIGV4cGxpY2l0bHkgc2V0IGEgbG9nZmlsZSB0byB1c2UKLQkJaWYgKG91dHB1dCA9PSBTeXN0ZW0ub3V0KSB7Ci0JCQlmT3V0PSBudWxsOwotCQl9IGVsc2UgewotCQkJZk91dD0gb3V0cHV0OwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGxvZ01lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UsIGludCBwcmlvcml0eSkgewotCQlpZiAocHJpb3JpdHkgPiBnZXRNZXNzYWdlT3V0cHV0TGV2ZWwoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZiAocHJpb3JpdHkgPT0gUHJvamVjdC5NU0dfRVJSKSB7Ci0JCQlpZiAoZ2V0RXJyb3JQcmludFN0cmVhbSgpICE9IG51bGwgJiYgZ2V0RXJyb3JQcmludFN0cmVhbSgpICE9IFN5c3RlbS5lcnIpIHsKLQkJCQkvL3VzZXIgaGFzIGRlc2lnbmF0ZWQgdG8gbG9nIHRvIGEgbG9nZmlsZQotCQkJCWdldEVycm9yUHJpbnRTdHJlYW0oKS5wcmludGxuKG1lc3NhZ2UpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKGdldE91dHB1dFByaW50U3RyZWFtKCkgIT0gbnVsbCAmJiBnZXRPdXRwdXRQcmludFN0cmVhbSgpICE9IFN5c3RlbS5vdXQpIHsKLQkJCQkvL3VzZXIgaGFzIGRlc2lnbmF0ZWQgdG8gbG9nIHRvIGEgbG9nZmlsZQotCQkJCWdldE91dHB1dFByaW50U3RyZWFtKCkucHJpbnRsbihtZXNzYWdlKTsKLQkJCX0gCi0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlRXhjZXB0aW9uKEJ1aWxkRXZlbnQgZXZlbnQpIHsKLQkJVGhyb3dhYmxlIGV4Y2VwdGlvbiA9IGV2ZW50LmdldEV4Y2VwdGlvbigpOwotCQlpZiAoZXhjZXB0aW9uID09IG51bGwgfHwgZXhjZXB0aW9uID09IGZIYW5kbGVkRXhjZXB0aW9uCi0JCXx8IGV4Y2VwdGlvbiBpbnN0YW5jZW9mIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uCi0JCXx8IGV4Y2VwdGlvbiBpbnN0YW5jZW9mIEFudFNlY3VyaXR5RXhjZXB0aW9uKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZkhhbmRsZWRFeGNlcHRpb249IGV4Y2VwdGlvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdCBzdXBwb3J0L29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3N1cHBvcnQvdHlwZXMvQW50VGVzdFBhdGguamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0IHN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvc3VwcG9ydC90eXBlcy9BbnRUZXN0UGF0aC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDhhYzRhLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0IHN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvc3VwcG9ydC90eXBlcy9BbnRUZXN0UGF0aC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS5zdXBwb3J0LnR5cGVzOwotCi0KLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDsKLQotcHVibGljIGNsYXNzIEFudFRlc3RQYXRoIGV4dGVuZHMgUGF0aCB7Ci0JCi0JU3RyaW5nIG1lc3NhZ2U7Ci0JCi0JcHVibGljIEFudFRlc3RQYXRoKFByb2plY3QgcHJvamVjdCkgewotCQlzdXBlcihwcm9qZWN0KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgewotCQl0aGlzLm1lc3NhZ2U9IG1lc3NhZ2U7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKLQkJcmV0dXJuIG1lc3NhZ2U7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3QueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2QzYWIwLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08cHJvamVjdCBuYW1lPSJ0ZXN0c3VpdGUiIGRlZmF1bHQ9InJ1biIgYmFzZWRpcj0iLiI+Ci0gIDwhLS0gc2V0cyB0aGUgcHJvcGVydGllcyBlY2xpcHNlLWhvbWUsIGFuZCBsaWJyYXJ5LWZpbGUgLS0+Ci0gIDwhLS0gVGhlIHByb3BlcnR5ICR7ZWNsaXBzZS1ob21lfSBzaG91bGQgYmUgcGFzc2VkIGludG8gdGhpcyBzY3JpcHQgLS0+Ci0gIDwhLS0gU2V0IGEgbWVhbmluZ2Z1bCBkZWZhdWx0IHZhbHVlIGZvciB3aGVuIGl0IGlzIG5vdC4gLS0+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJlY2xpcHNlLWhvbWUiIHZhbHVlPSIke2Jhc2VkaXJ9XC4uXC4uIi8+Ci08cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZSIvPgotICA8cHJvcGVydHkgbmFtZT0ibGlicmFyeS1maWxlIgotICAgICAgICAgICAgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9wbHVnaW5zL29yZy5lY2xpcHNlLnRlc3QvbGlicmFyeS54bWwiLz4KLSAKLSAgPCEtLSBUaGlzIHRhcmdldCBob2xkcyBhbGwgaW5pdGlhbGl6YXRpb24gY29kZSB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgZm9yIC0tPgotICA8IS0tIGFsbCB0ZXN0cyB0aGF0IGFyZSB0byBiZSBydW4uIEluaXRpYWxpemF0aW9uIGZvciBpbmRpdmlkdWFsIHRlc3RzIC0tPgotICA8IS0tIHNob3VsZCBiZSBkb25lIHdpdGhpbiB0aGUgYm9keSBvZiB0aGUgc3VpdGUgdGFyZ2V0LiAtLT4KLSAgPHRhcmdldCBuYW1lPSJpbml0Ij4KLSAgICA8dHN0YW1wLz4KLSAgICA8ZGVsZXRlPgotICAgICAgPGZpbGVzZXQgZGlyPSIke2VjbGlwc2UtaG9tZX0iIGluY2x1ZGVzPSJvcmcqLnhtbCIvPgotICAgIDwvZGVsZXRlPgotICA8L3RhcmdldD4KLQotICA8IS0tIFRoaXMgdGFyZ2V0IGRlZmluZXMgdGhlIHRlc3RzIHRoYXQgbmVlZCB0byBiZSBydW4uIC0tPgotICA8dGFyZ2V0IG5hbWU9InN1aXRlIj4KLSAgICA8cHJvcGVydHkgbmFtZT0iamR0LWZvbGRlciIgCi0gICAgICAgICAgICAgIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vamR0X2ZvbGRlciIvPgotICAgIDxkZWxldGUgZGlyPSIke2pkdC1mb2xkZXJ9IiBxdWlldD0idHJ1ZSIvPgotICAgIDxhbnQgdGFyZ2V0PSJ1aS10ZXN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkYXRhLWRpciIgdmFsdWU9IiR7amR0LWZvbGRlcn0iLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iY2xhc3NuYW1lIiAKLSAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUuQXV0b21hdGVkU3VpdGUiLz4KLSAgICA8L2FudD4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBUaGlzIHRhcmdldCBob2xkcyBjb2RlIHRvIGNsZWFudXAgdGhlIHRlc3RpbmcgZW52aXJvbm1lbnQgYWZ0ZXIgLS0+Ci0gIDwhLS0gYWZ0ZXIgYWxsIG9mIHRoZSB0ZXN0cyBoYXZlIGJlZW4gcnVuLiBZb3UgY2FuIHVzZSB0aGlzIHRhcmdldCB0byAtLT4KLSAgPCEtLSBkZWxldGUgdGVtcG9yYXJ5IGZpbGVzIHRoYXQgaGF2ZSBiZWVuIGNyZWF0ZWQuIC0tPgotICA8dGFyZ2V0IG5hbWU9ImNsZWFudXAiPgotICA8L3RhcmdldD4KLQotICA8IS0tIFRoaXMgdGFyZ2V0IHJ1bnMgdGhlIHRlc3Qgc3VpdGUuIEFueSBhY3Rpb25zIHRoYXQgbmVlZCB0byBoYXBwZW4gLS0+Ci0gIDwhLS0gYWZ0ZXIgYWxsIHRoZSB0ZXN0cyBoYXZlIGJlZW4gcnVuIHNob3VsZCBnbyBoZXJlLiAtLT4KLSAgPHRhcmdldCBuYW1lPSJydW4iIGRlcGVuZHM9ImluaXQsc3VpdGUsY2xlYW51cCI+Ci0gICAgPGFudCB0YXJnZXQ9ImNvbGxlY3QiIGFudGZpbGU9IiR7bGlicmFyeS1maWxlfSIgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImluY2x1ZGVzIiB2YWx1ZT0ib3JnKi54bWwiLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvdXRwdXQtZmlsZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9LnhtbCIvPgotICAgIDwvYW50PgotICA8L3RhcmdldD4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RidWlsZGZpbGVzL0J1ZzMyNTUxLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0YnVpbGRmaWxlcy9CdWczMjU1MS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1NDM5OTcuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RidWlsZGZpbGVzL0J1ZzMyNTUxLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLTxwcm9qZWN0IG5hbWU9ImJ1ZyIgZGVmYXVsdD0iYWxsIj4KLSA8cGF0aCBpZD0ibXljbGFzc3BhdGgiPgotIAk8ZmlsZXNldCBkaXI9Ii4uXGxpYiI+Ci0gIAkJPGluY2x1ZGUgbmFtZT0iYW50VGVzdHNTdXBwb3J0LmphciIgLz4gCi0gIAk8L2ZpbGVzZXQ+Ci0gIDwvcGF0aD4KLSAgCi0gPHRhc2tkZWYgbmFtZT0iaGVsbG8iIGNsYXNzbmFtZT0ib3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUuc3VwcG9ydC50YXNrcy5BbnRUZXN0VGFzayI+Ci0gIAk8Y2xhc3NwYXRoIHJlZmlkPSJteWNsYXNzcGF0aCIgLz4gCi0gIDwvdGFza2RlZj4KLSAgCi0gPHRhcmdldCBuYW1lPSJhbGwiPgotICAJPGhlbGxvIC8+IAotICA8L3RhcmdldD4KLSAgPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0YnVpbGRmaWxlcy9CdWczNDY2My54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvQnVnMzQ2NjMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmEwM2YxLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0YnVpbGRmaWxlcy9CdWczNDY2My54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTxwcm9qZWN0IG5hbWU9IjM0NjYzLnhtbCIgZGVmYXVsdD0iZWNob1AiPgotCi08dGFza2RlZiBmaWxlPSIke1JPT1RESVJ9L3Rhc2tkZWZzLnByb3BlcnRpZXMiIC8+Ci0gCi0gPHRhcmdldCBuYW1lPSJlY2hvUCI+Ci0gCTxlY2hvUHJvcGVydGllcy8+Ci0gPC90YXJnZXQ+Ci08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RidWlsZGZpbGVzL0NsYXNzcGF0aE9yZGVyaW5nLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0YnVpbGRmaWxlcy9DbGFzc3BhdGhPcmRlcmluZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5OWI2NWUuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RidWlsZGZpbGVzL0NsYXNzcGF0aE9yZGVyaW5nLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPHByb2plY3QgbmFtZT0iQ2xhc3NwYXRoT3JkZXJpbmciIGRlZmF1bHQ9Im9yZGVyZWQiIGJhc2VkaXI9Ii4uIj4KLQotCTx0YXJnZXQgbmFtZT0ib3JkZXJlZCI+Ci0JCTxqYXZhIGNsYXNzbmFtZT0gIkNsYXNzcGF0aE9yZGVyaW5nIi8+Ci0JPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvQ3VzdG9tVGFzay54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvQ3VzdG9tVGFzay54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5ZGM0NDIuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RidWlsZGZpbGVzL0N1c3RvbVRhc2sueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08cHJvamVjdCBuYW1lPSJDdXN0b20gVGFzayIgZGVmYXVsdD0iQ3VzdG9tIFRhc2siIGJhc2VkaXI9Ii4iPgotCTx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0JCTx0c3RhbXAvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJDdXN0b20gVGFzayIgZGVzY3JpcHRpb249ICJUZXN0IGFkZGluZyBhIGN1c3RvbSB0YXNrIiBkZXBlbmRzPSJpbml0Ij4KLQkJPEFudFRlc3RUYXNrLz4KLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0YnVpbGRmaWxlcy9DdXN0b21UeXBlLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0YnVpbGRmaWxlcy9DdXN0b21UeXBlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFlMWVmNS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvQ3VzdG9tVHlwZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi08cHJvamVjdCBuYW1lPSJDdXN0b20gVHlwZSIgZGVmYXVsdD0iQ3VzdG9tIFR5cGUiIGJhc2VkaXI9Ii4iPgotCi0JPGFudHRlc3RwYXRoIGlkPSJjb21waWxlLmNsYXNzcGF0aCI+Ci0gICAgICA8ZmlsZXNldCBkaXI9ImxpYiI+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouamFyIi8+Ci0gICAgICA8L2ZpbGVzZXQ+Ci0gICAgPC9hbnR0ZXN0cGF0aD4KLSAgICAKLQk8dGFyZ2V0IG5hbWU9ImluaXQiPgotCQk8dHN0YW1wLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iQ3VzdG9tIFR5cGUiIGRlc2NyaXB0aW9uPSAiVGVzdCBhZGRpbmcgYSBjdXN0b20gdHlwZSIgZGVwZW5kcz0iaW5pdCI+Ci0JCTxlY2hvIG1lc3NhZ2U9IlRlc3QgYWRkaW5nIGEgY3VzdG9tIHR5cGUiLz4KLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0YnVpbGRmaWxlcy9Ob0RlZmF1bHQueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RidWlsZGZpbGVzL05vRGVmYXVsdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNWQ3ZTkuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RidWlsZGZpbGVzL05vRGVmYXVsdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTxwcm9qZWN0IG5hbWU9ICJUZXN0aW5nIiBkZWZhdWx0PSJidWlsZCI+Ci0KLQk8dGFyZ2V0IG5hbWU9ICJ0ZXN0Ij4KLQkJPGVjaG8gbWVzc2FnZT0idGVzdGluZyIvPgotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0YnVpbGRmaWxlcy9UZXN0Rm9yRWNoby54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvVGVzdEZvckVjaG8ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjEzZTVlLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0YnVpbGRmaWxlcy9UZXN0Rm9yRWNoby54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08cHJvamVjdCBuYW1lPSJFY2hvIFRlc3QiIGRlZmF1bHQ9IlRlc3QgZm9yIEVjaG8iIGJhc2VkaXI9Ii4iPgotCTx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0JCTx0c3RhbXAvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJUZXN0IGZvciBFY2hvIiBkZXNjcmlwdGlvbj0gIkNhbGxzIG90aGVyIGVjaG9zIiBkZXBlbmRzPSJpbml0Ij4KLQkJPGFudCBhbnRmaWxlPSJidWlsZGZpbGVzL2VjaG9pbmcueG1sIiBkaXI9Ii4uLy4uL0FudFRlc3RzIiB0YXJnZXQ9ImVjaG8xIi8+Ci0JCTxhbnQgYW50ZmlsZT0iYnVpbGRmaWxlcy9lY2hvaW5nLnhtbCIgZGlyPSIuLi8uLi9BbnRUZXN0cyIgdGFyZ2V0PSJlY2hvMiIvPgotCQk8YW50IGFudGZpbGU9ImJ1aWxkZmlsZXMvZWNob2luZy54bWwiIGRpcj0iLi4vLi4vQW50VGVzdHMiIHRhcmdldD0iZWNobzMiLz4KLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0YnVpbGRmaWxlcy9idWlsZC54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjM4YTUzLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0YnVpbGRmaWxlcy9idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi08cHJvamVjdCBuYW1lPSJFY2hpbmciIGRlZmF1bHQ9ImVjaG8xIiBiYXNlZGlyPSIuLiI+Ci0KLQk8dGFyZ2V0IG5hbWU9ImVjaG8xIj4KLQkJPGVjaG8gbWVzc2FnZT0iZWNobzEiLz4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9ImVjaG8yIj4KLQkJPGVjaG8gbWVzc2FnZT0iZWNobzIiLz4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9ImVjaG8zIiBkZXNjcmlwdGlvbj0gIkFuIGVjaG8zISI+Ci0JCTxlY2hvIG1lc3NhZ2U9ImVjaG8zIi8+Ci0JPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvZWNob2luZy54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvZWNob2luZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2MzhhNTMuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RidWlsZGZpbGVzL2VjaG9pbmcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotPHByb2plY3QgbmFtZT0iRWNoaW5nIiBkZWZhdWx0PSJlY2hvMSIgYmFzZWRpcj0iLi4iPgotCi0JPHRhcmdldCBuYW1lPSJlY2hvMSI+Ci0JCTxlY2hvIG1lc3NhZ2U9ImVjaG8xIi8+Ci0JPC90YXJnZXQ+Ci0JCi0JPHRhcmdldCBuYW1lPSJlY2hvMiI+Ci0JCTxlY2hvIG1lc3NhZ2U9ImVjaG8yIi8+Ci0JPC90YXJnZXQ+Ci0JCi0JPHRhcmdldCBuYW1lPSJlY2hvMyIgZGVzY3JpcHRpb249ICJBbiBlY2hvMyEiPgotCQk8ZWNobyBtZXNzYWdlPSJlY2hvMyIvPgotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RidWlsZGZpbGVzL2lucHV0LnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0YnVpbGRmaWxlcy9pbnB1dC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNzBhYjUuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RidWlsZGZpbGVzL2lucHV0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPHByb2plY3QgbmFtZT0iaW5wdXQgdGVzdGluZyIgZGVmYXVsdD0gImlucHV0IHRlc3QiPgotCTx0YXJnZXQgbmFtZT0iaW5wdXQgdGVzdCI+Ci0JCTxpbnB1dCBtZXNzYWdlPSJFbnRlciBmb3IgZWNobyIgYWRkcHJvcGVydHk9ICJpbnB1dFRlc3QiPgotCQk8L2lucHV0PgotCQk8ZWNobyBtZXNzYWdlPSIke2lucHV0VGVzdH0iLz4KLQk8L3RhcmdldD4JCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RidWlsZGZpbGVzL2phdmFjLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0YnVpbGRmaWxlcy9qYXZhYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyZjAyMjUuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RidWlsZGZpbGVzL2phdmFjLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdCBuYW1lPSJvcmcuZWNsaXBzZS5hbnQuY29yZSIgZGVmYXVsdD0iYnVpbGQiIGJhc2VkaXI9Ii4uIj4KLQotCQotCTx0YXJnZXQgbmFtZT0iaW5pdCIgZGVwZW5kcz0icHJvcGVydGllcyI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4iIHZhbHVlPSJBbnRUZXN0cyIvPgotCQk8cHJvcGVydHkgbmFtZT0idGVtcC5mb2xkZXIiIHZhbHVlPSIke2Jhc2VkaXJ9L3RlbXAuZm9sZGVyIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4uZGVzdGluYXRpb24iIHZhbHVlPSIke2Jhc2VkaXJ9Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJidWlsZC5yZXN1bHQuZm9sZGVyIiB2YWx1ZT0iJHtiYXNlZGlyfSIvPgotCTwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0icHJvcGVydGllcyIgaWY9InVzZS5lY2xpcHNlLkpEVENvbXBpbGVyIj4KLQkJPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmNvbXBpbGVyIiB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSkRUQ29tcGlsZXJBZGFwdGVyIi8+Ci0JPC90YXJnZXQ+Ci0JCi0JPHRhcmdldCBuYW1lPSJidWlsZCIgZGVwZW5kcz0iaW5pdCI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJkZXN0ZGlyIiB2YWx1ZT0iJHt0ZW1wLmZvbGRlcn0vamF2YWMuYmluIi8+Ci0JCTxkZWxldGUgZGlyPSIke3RlbXAuZm9sZGVyfS9qYXZhYy5iaW4iLz4KLQkJPG1rZGlyIGRpcj0iJHt0ZW1wLmZvbGRlcn0vamF2YWMuYmluIi8+Ci0JCTwhLS0gY29tcGlsZSB0aGUgc291cmNlIGNvZGUgLS0+Ci0JCTxqYXZhYyBkZXN0ZGlyPSIke3RlbXAuZm9sZGVyfS9qYXZhYy5iaW4iIGZhaWxvbmVycm9yPSJmYWxzZSIgdmVyYm9zZT0iZmFsc2UiIGRlYnVnPSJvbiIgaW5jbHVkZUFudFJ1bnRpbWU9InllcyI+Ci0JCQk8c3JjIHBhdGg9InJlc291cmNlcyIvPgotCQk8L2phdmFjPgotCTwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0iY2xlYW4iIGRlcGVuZHM9ImluaXQiPgotCQk8ZGVsZXRlIGRpcj0iJHt0ZW1wLmZvbGRlcn0iLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0icmVmcmVzaCIgZGVwZW5kcz0iaW5pdCIgaWY9ImVjbGlwc2UucnVubmluZyI+Ci0JCTxlY2xpcHNlLnJlZnJlc2hMb2NhbCByZXNvdXJjZT0iJHtwbHVnaW59IiBkZXB0aD0iaW5maW5pdGUiLz4KLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0bGliL2NsYXNzcGF0aE9yZGVyaW5nMS5qYXIgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGxpYi9jbGFzc3BhdGhPcmRlcmluZzEuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTBjYjdmLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0bGliL2NsYXNzcGF0aE9yZGVyaW5nMS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGxpYi9jbGFzc3BhdGhPcmRlcmluZzIuamFyIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RsaWIvY2xhc3NwYXRoT3JkZXJpbmcyLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgxNjc0MS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGxpYi9jbGFzc3BhdGhPcmRlcmluZzIuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RsaWIvdGFza0ZvbGRlci9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS9zdXBwb3J0L3Rhc2tzL0FudFRlc3RUYXNrMi5jbGFzcyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0bGliL3Rhc2tGb2xkZXIvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvc3VwcG9ydC90YXNrcy9BbnRUZXN0VGFzazIuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhMzdlYjUuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RsaWIvdGFza0ZvbGRlci9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS9zdXBwb3J0L3Rhc2tzL0FudFRlc3RUYXNrMi5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0cmVzb3VyY2VzL0FudFRlc3RUYXNrLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdHJlc291cmNlcy9BbnRUZXN0VGFzay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzRmNjAyLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0cmVzb3VyY2VzL0FudFRlc3RUYXNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FY2hvOwotCi0KLXB1YmxpYyBjbGFzcyBBbnRUZXN0VGFzayBleHRlbmRzIFRhc2sgewotCQotCXB1YmxpYyBBbnRUZXN0VGFzaygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotCQlFY2hvIGVjaG89IG5ldyBFY2hvKCk7Ci0JCWVjaG8uc2V0UHJvamVjdChnZXRQcm9qZWN0KCkpOwotCQllY2hvLnNldE1lc3NhZ2UoIlRlc3RpbmcgQW50IGluIEVjbGlwc2Ugd2l0aCBhIGN1c3RvbSB0YXNrIik7Ci0JCWVjaG8uZXhlY3V0ZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0cmVzb3VyY2VzL3Rhc2tkZWZzLnByb3BlcnRpZXMgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdHJlc291cmNlcy90YXNrZGVmcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjA0OWZmLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0cmVzb3VyY2VzL3Rhc2tkZWZzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1lY2hvUHJvcGVydGllcz1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5FY2hvUHJvcGVydGllcwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0cmVzb3VyY2VzL3Rlc3QucHJvcGVydGllcyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0cmVzb3VyY2VzL3Rlc3QucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VhY2QzYS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdHJlc291cmNlcy90ZXN0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotQW50VGVzdHM9dGVzdGluZyBmcm9tIHByb3BlcnRpZXMgZmlsZQotZWNsaXBzZS5pcy5jb29sPVllcApkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL0Fic3RyYWN0QW50VGVzdC5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL0Fic3RyYWN0QW50VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTMxOTY3Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS9BYnN0cmFjdEFudFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlOwotCi0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLnRlc3RwbHVnaW4uQW50RmlsZVJ1bm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS50ZXN0cGx1Z2luLkFudFRlc3RDaGVja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotCi0KLSAKLS8qKgotICogVGVzdHMgZm9yIEFudCBjb3JlCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEFudFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVJTERfU1VDQ0VTU0ZVTD0gIkJVSUxEIFNVQ0NFU1NGVUwiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFOVF9URVNUX0JVSUxEX0xPR0dFUiA9ICJvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS5zdXBwb3J0LnRlc3Rsb2dnZXJzLlRlc3RCdWlsZExvZ2dlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTlRfVEVTVF9CVUlMRF9MSVNURU5FUj0gIm9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLnN1cHBvcnQudGVzdGxvZ2dlcnMuVGVzdEJ1aWxkTGlzdGVuZXIiOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhlICdBbnRUZXN0cycgcHJvamVjdC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0ZXN0IHByb2plY3QKLQkgKi8KLQlwcm90ZWN0ZWQgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdCgiQW50VGVzdHMiKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBwcm9qZWN0OwotCQotCQotCXB1YmxpYyBBYnN0cmFjdEFudFRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByb3RlY3RlZCBJRmlsZSBnZXRCdWlsZEZpbGUoU3RyaW5nIGJ1aWxkRmlsZU5hbWUpIHsKLQkJSUZpbGUgZmlsZSA9IGdldFByb2plY3QoKS5nZXRGb2xkZXIoImJ1aWxkZmlsZXMiKS5nZXRGaWxlKGJ1aWxkRmlsZU5hbWUpOwotCQlhc3NlcnRUcnVlKCJDb3VsZCBub3QgZmluZCBzY3JpcHQgZmlsZSBuYW1lZDogIiArIGJ1aWxkRmlsZU5hbWUsIGZpbGUuZXhpc3RzKCkpOwotCQlyZXR1cm4gZmlsZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElGb2xkZXIgZ2V0V29ya2luZ0RpcmVjdG9yeShTdHJpbmcgd29ya2luZ0RpcmVjdG9yeU5hbWUpIHsKLQkJSUZvbGRlciBmb2xkZXIgPSBnZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKHdvcmtpbmdEaXJlY3RvcnlOYW1lKTsKLQkJYXNzZXJ0VHJ1ZSgiQ291bGQgbm90IGZpbmQgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IG5hbWVkOiAiICsgd29ya2luZ0RpcmVjdG9yeU5hbWUsIGZvbGRlci5leGlzdHMoKSk7Ci0JCXJldHVybiBmb2xkZXI7Ci0JfQotCQotCXByb3RlY3RlZCBJRmlsZSBjaGVja0ZpbGVFeGlzdHMoU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWdldFByb2plY3QoKS5yZWZyZXNoTG9jYWwoSVByb2plY3QuREVQVEhfSU5GSU5JVEUsIG51bGwpOwotCQlJRmlsZSBmaWxlID0gZ2V0UHJvamVjdCgpLmdldEZvbGRlcigiYnVpbGRmaWxlcyIpLmdldEZpbGUoZmlsZU5hbWUpOwotCQlhc3NlcnRUcnVlKCJDb3VsZCBub3QgZmluZCBmaWxlIG5hbWVkOiAiICsgZmlsZU5hbWUsIGZpbGUuZXhpc3RzKCkpOwotCQlyZXR1cm4gZmlsZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKFN0cmluZyBidWlsZEZpbGVOYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJ1bihidWlsZEZpbGVOYW1lLCBudWxsLCB0cnVlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKFN0cmluZyBidWlsZEZpbGVOYW1lLCBTdHJpbmdbXSBhcmdzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJ1bihidWlsZEZpbGVOYW1lLCBhcmdzLCB0cnVlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKFN0cmluZyBidWlsZEZpbGVOYW1lLCBTdHJpbmdbXSBhcmdzLCBib29sZWFuIHJldHJpZXZlVGFyZ2V0cykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlydW4oYnVpbGRGaWxlTmFtZSwgYXJncywgcmV0cmlldmVUYXJnZXRzLCAiIik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJ1bihTdHJpbmcgYnVpbGRGaWxlTmFtZSwgU3RyaW5nW10gYXJncywgYm9vbGVhbiByZXRyaWV2ZVRhcmdldHMsIFN0cmluZyB3b3JraW5nRGlyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUFudFRlc3RDaGVja2VyLnJlc2V0KCk7Ci0JCUlGaWxlIGJ1aWxkRmlsZT0gbnVsbDsKLQkJaWYgKGJ1aWxkRmlsZU5hbWUgIT0gbnVsbCkgewotCQkJYnVpbGRGaWxlPSBnZXRCdWlsZEZpbGUoYnVpbGRGaWxlTmFtZSk7Ci0JCX0KLQkJQW50RmlsZVJ1bm5lciBydW5uZXI9IG5ldyBBbnRGaWxlUnVubmVyKCk7Ci0JCVN0cmluZ1tdIHRhcmdldHM9IG51bGw7Ci0JCWlmIChyZXRyaWV2ZVRhcmdldHMpIHsKLQkJCXRhcmdldHM9IGdldFRhcmdldE5hbWVzKGJ1aWxkRmlsZU5hbWUpOwotCQl9Ci0JCWlmICh3b3JraW5nRGlyLmxlbmd0aCgpID4gMCkgewotCQkJd29ya2luZ0Rpcj0gZ2V0V29ya2luZ0RpcmVjdG9yeSh3b3JraW5nRGlyKS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpLmdldEFic29sdXRlUGF0aCgpOwotCQl9IAotCQlydW5uZXIucnVuKGJ1aWxkRmlsZSwgdGFyZ2V0cywgYXJncywgd29ya2luZ0RpciwgdHJ1ZSk7Ci0JCWFzc2VydFRydWUoIkJ1aWxkIHN0YXJ0cyBkaWQgbm90IGVxdWFsIGJ1aWxkIGZpbmlzaGVzIiwgQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldEJ1aWxkc1N0YXJ0ZWRDb3VudCgpID09IEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRCdWlsZHNGaW5pc2hlZENvdW50KCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgVGFyZ2V0SW5mb1tdIGdldFRhcmdldHMoU3RyaW5nIGJ1aWxkRmlsZU5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSUZpbGUgYnVpbGRGaWxlPSBnZXRCdWlsZEZpbGUoYnVpbGRGaWxlTmFtZSk7Ci0JCQotCQlBbnRSdW5uZXIgcnVubmVyID0gbmV3IEFudFJ1bm5lcigpOwotCQlydW5uZXIuc2V0QnVpbGRGaWxlTG9jYXRpb24oYnVpbGRGaWxlLmdldExvY2F0aW9uKCkudG9GaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCSAJcmV0dXJuIHJ1bm5lci5nZXRBdmFpbGFibGVUYXJnZXRzKCk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRUYXJnZXROYW1lcyhTdHJpbmcgYnVpbGRGaWxlTmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlUYXJnZXRJbmZvW10gaW5mb3M9IGdldFRhcmdldHMoYnVpbGRGaWxlTmFtZSk7Ci0JCVN0cmluZ1tdIG5hbWVzPSBuZXcgU3RyaW5nW2luZm9zLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW5mb3MubGVuZ3RoOyBpKyspIHsKLQkJCVRhcmdldEluZm8gaW5mbyA9IGluZm9zW2ldOwotCQkJbmFtZXNbaV09IGluZm8uZ2V0TmFtZSgpOwotCQl9Ci0JCXJldHVybiBuYW1lczsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFRhcmdldERlc2NyaXB0aW9ucyhTdHJpbmcgYnVpbGRGaWxlTmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlUYXJnZXRJbmZvW10gaW5mb3M9IGdldFRhcmdldHMoYnVpbGRGaWxlTmFtZSk7Ci0JCVN0cmluZ1tdIGRlc2NyaXB0aW9ucz0gbmV3IFN0cmluZ1tpbmZvcy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGluZm9zLmxlbmd0aDsgaSsrKSB7Ci0JCQlUYXJnZXRJbmZvIGluZm8gPSBpbmZvc1tpXTsKLQkJCWRlc2NyaXB0aW9uc1tpXT0gaW5mby5nZXREZXNjcmlwdGlvbigpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbnM7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHByb2plY3QgY29udGFpbmluZyB0aGUgZ2l2ZW4gdGFyZ2V0IGluIHRoZSBnaXZlbiBidWlsZCBmaWxlIG9yCi0JICogPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gcHJvamVjdCBuYW1lIGNhbiBiZSBmb3VuZC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2plY3ROYW1lKFN0cmluZyBidWlsZEZpbGVOYW1lLCBTdHJpbmcgdGFyZ2V0TmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlUYXJnZXRJbmZvIGluZm89IGdldFRhcmdldChidWlsZEZpbGVOYW1lLCB0YXJnZXROYW1lKTsKLQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJcmV0dXJuIGluZm8uZ2V0UHJvamVjdCgpLmdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVwZW5kZW5jaWVzIG9mIHRoZSB0YXJnZXQgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBpbiB0aGUgZ2l2ZW4gYnVpbGQgZmlsZSBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIGlmIG5vIHN1Y2ggdGFyZ2V0IGNhbiBiZSBmb3VuZC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0RGVwZW5kZW5jaWVzKFN0cmluZyBidWlsZEZpbGVOYW1lLCBTdHJpbmcgdGFyZ2V0TmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlUYXJnZXRJbmZvIGluZm89IGdldFRhcmdldChidWlsZEZpbGVOYW1lLCB0YXJnZXROYW1lKTsKLQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJcmV0dXJuIGluZm8uZ2V0RGVwZW5kZW5jaWVzKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRhcmdldCB3aXRoIHRoZSBnaXZlbiBuYW1lIGluIHRoZSBnaXZlbiBidWlsZCBmaWxlIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogaWYgbm8gc3VjaCB0YXJnZXQgY2FuIGJlIGZvdW5kLgotCSAqLwotCXByb3RlY3RlZCBUYXJnZXRJbmZvIGdldFRhcmdldChTdHJpbmcgYnVpbGRGaWxlTmFtZSwgU3RyaW5nIHRhcmdldE5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJVGFyZ2V0SW5mb1tdIGluZm9zPSBnZXRUYXJnZXRzKGJ1aWxkRmlsZU5hbWUpOwotCQlmb3IgKGludCBpPSAwLCBudW1UYXJnZXRzPSBpbmZvcy5sZW5ndGg7IGkgPCBudW1UYXJnZXRzOyBpKyspIHsKLQkJCWlmIChpbmZvc1tpXS5nZXROYW1lKCkuZXF1YWxzKHRhcmdldE5hbWUpKSB7Ci0JCQkJcmV0dXJuIGluZm9zW2ldOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGxvZyBtZXNzYWdlIG4gZnJvbSB0aGUgbGFzdDoKLSAgICAgKiBlLmcuIGdldExvZ2dlZE1lc3NhZ2UoMCkgcmV0dXJucyB0aGUgbW9zdCByZWNlbnQgbWVzc2FnZQotICAgICAqIAotICAgICAqIEBwYXJhbSBuIG1lc3NhZ2UgaW5kZXgKLSAgICAgKiBAcmV0dXJuIHRoZSBudGggbGFzdCBtZXNzYWdlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRMb2dnZWRNZXNzYWdlKGludCBuKSB7Ci0gICAgICAgIHJldHVybiBBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VkTWVzc2FnZShuKTsKLSAgICB9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYXN0TWVzc2FnZUxvZ2dlZCgpIHsKLQkJcmV0dXJuIGdldExvZ2dlZE1lc3NhZ2UoMCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFzc2VydFN1Y2Nlc3NmdWwoKSB7Ci0JCUxpc3QgbWVzc2FnZXM9IEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRNZXNzYWdlcygpOwotCQlTdHJpbmcgc3VjY2Vzcz0gKFN0cmluZyltZXNzYWdlcy5nZXQobWVzc2FnZXMuc2l6ZSgpIC0gMSk7Ci0JCWFzc2VydFRydWUoIkJ1aWxkIHdhcyBub3QgZmxhZ2dlZCBhcyBzdWNjZXNzZnVsOiAiICsgc3VjY2VzcywgQlVJTERfU1VDQ0VTU0ZVTC5lcXVhbHMoc3VjY2VzcykpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb3BlcnR5RmlsZU5hbWUoKSB7Ci0JCXJldHVybiBnZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKCJyZXNvdXJjZXMiKS5nZXRGaWxlKCJ0ZXN0LnByb3BlcnRpZXMiKS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpLmdldEFic29sdXRlUGF0aCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZXN0b3JlUHJlZmVyZW5jZURlZmF1bHRzKCkgewotCQlBbnRDb3JlUHJlZmVyZW5jZXMgcHJlZnM9IEFudENvcmVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0UHJlZmVyZW5jZXMoKTsKLQkJcHJlZnMuc2V0Q3VzdG9tVVJMcyhwcmVmcy5nZXREZWZhdWx0QW50VVJMcygpKTsKLQkJcHJlZnMuc2V0Q3VzdG9tVGFza3MobmV3IFRhc2tbXXt9KTsKLQkJcHJlZnMuc2V0Q3VzdG9tVHlwZXMobmV3IFR5cGVbXXt9KTsKLQkJcHJlZnMuc2V0Q3VzdG9tUHJvcGVydHlGaWxlcyhuZXcgU3RyaW5nW117fSk7Ci0JCXByZWZzLnNldEN1c3RvbVByb3BlcnRpZXMobmV3IFByb3BlcnR5W117fSk7Ci0JCXByZWZzLnNldEFudEhvbWUoIiIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEFudEhvbWUoKSB7Ci0JCUFudENvcmVQcmVmZXJlbmNlcyBwcmVmcz0gQW50Q29yZVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRQcmVmZXJlbmNlcygpOwotCQlVUkxbXSB1cmxzPSBwcmVmcy5nZXREZWZhdWx0QW50VVJMcygpOwotCQlVUkwgYW50amFyPSB1cmxzWzBdOwotCQlJUGF0aCBhbnRIb21lUGF0aD0gbmV3IFBhdGgoYW50amFyLmdldEZpbGUoKSk7Ci0JCWFudEhvbWVQYXRoPSBhbnRIb21lUGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSk7Ci0JCXJldHVybiBhbnRIb21lUGF0aC50b0ZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS9BdXRvbWF0ZWRTdWl0ZS5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL0F1dG9tYXRlZFN1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3OWJhYmEuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL0F1dG9tYXRlZFN1aXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlOwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUudGVzdHMuKjsKLQotLyoqCi0gKiBUZXN0IGFsbCBhcmVhcyBvZiBBbnQuCi0gKiAKLSAqIFRvIHJ1biB0aGlzIHRlc3Qgc3VpdGU6Ci0gKiA8b2w+Ci0gKiA8bGk+Q3JlYXRlIGEgbmV3IEpVbml0IHBsdWdpbiB0ZXN0IGxhdW5jaCBjb25maWd1cmF0aW9uPC9saT4KLSAqIDxsaT5TZXQgdGhlIFRlc3QgY2xhc3MgdG8gIm9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLkF1dG9tYXRlZFN1aXRlIjwvbGk+Ci0gKiA8bGk+U2V0IHRoZSBQcm9qZWN0IHRvICJvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZSI8L2xpPgotICogPGxpPlJ1biB0aGUgbGF1bmNoIGNvbmZpZ3VyYXRpb24uIE91dHB1dCBmcm9tIHRoZSB0ZXN0cyB3aWxsIGJlIGRpc3BsYXllZCBpbiBhIEpVbml0IHZpZXc8L2xpPgotICogPC9vbD4KLSAqLwotcHVibGljIGNsYXNzIEF1dG9tYXRlZFN1aXRlIGV4dGVuZHMgVGVzdFN1aXRlIHsKLQkKLQkvKioKLQkgKiBGbGFnIHRoYXQgaW5kaWNhdGVzIHRlc3QgYXJlIGluIHByb2dyZXNzCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdGVzdGluZyA9IHRydWU7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdWl0ZS4gIFRoaXMgaXMgcmVxdWlyZWQgdG8KLQkgKiB1c2UgdGhlIEpVbml0IExhdW5jaGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBBdXRvbWF0ZWRTdWl0ZSgpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCB0aGUgdGVzdCBzdWl0ZS4KLQkgKi8KLQlwdWJsaWMgQXV0b21hdGVkU3VpdGUoKSB7Ci0JCWFkZFRlc3QobmV3IFRlc3RTdWl0ZShQcm9qZWN0Q3JlYXRpb25EZWNvcmF0b3IuY2xhc3MpKTsKLQkJYWRkVGVzdChuZXcgVGVzdFN1aXRlKEZyYW1ld29ya1Rlc3RzLmNsYXNzKSk7Ci0JCWFkZFRlc3QobmV3IFRlc3RTdWl0ZShUYXJnZXRUZXN0cy5jbGFzcykpOwotCQlhZGRUZXN0KG5ldyBUZXN0U3VpdGUoUHJvamVjdFRlc3RzLmNsYXNzKSk7Ci0JCWFkZFRlc3QobmV3IFRlc3RTdWl0ZShPcHRpb25UZXN0cy5jbGFzcykpOwotCQlhZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGFza1Rlc3RzLmNsYXNzKSk7Ci0JCWFkZFRlc3QobmV3IFRlc3RTdWl0ZShUeXBlVGVzdHMuY2xhc3MpKTsKLQl9Ci0KLQkvKioKLQkgKiBSdW5zIHRoZSB0ZXN0cyBhbmQgY29sbGVjdHMgdGhlaXIgcmVzdWx0IGluIGEgVGVzdFJlc3VsdCB3aXRob3V0IGJsb2NraW5nLgotCSAqIHRoZSBVSSB0aHJlYWQuIE5vdCBub3JtYWxseSBuZWVkZWQgYnV0IG5pY2UgdG8gaGF2ZSB0byBjaGVjayBvbiB0aGUgc3RhdGUgb2YKLQkgKiBlbnZpcm9ubWVudCBkdXJpbmcgYSB0ZXN0IHJ1bi4KLQkgKi8KLS8vCXB1YmxpYyB2b2lkIHJ1bihmaW5hbCBUZXN0UmVzdWx0IHJlc3VsdCkgewotLy8JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotLy8JCVRocmVhZCB0aHJlYWQgPSBudWxsOwotLy8JCXRyeSB7Ci0vLwkJCVJ1bm5hYmxlIHIgPSBuZXcgUnVubmFibGUoKSB7Ci0vLwkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0vLwkJCQkJZm9yIChFbnVtZXJhdGlvbiBlPSB0ZXN0cygpOyBlLmhhc01vcmVFbGVtZW50cygpOyApIHsKLS8vCQkJCSAgCQlpZiAocmVzdWx0LnNob3VsZFN0b3AoKSApCi0vLwkJCQkgIAkJCWJyZWFrOwotLy8JCQkJCQlUZXN0IHRlc3Q9IChUZXN0KWUubmV4dEVsZW1lbnQoKTsKLS8vCQkJCQkJcnVuVGVzdCh0ZXN0LCByZXN1bHQpOwotLy8JCQkJCX0JCQkJCQotLy8JCQkJCXRlc3RpbmcgPSBmYWxzZTsKLS8vCQkJCQlkaXNwbGF5Lndha2UoKTsKLS8vCQkJCX0KLS8vCQkJfTsKLS8vCQkJdGhyZWFkID0gbmV3IFRocmVhZChyKTsKLS8vCQkJdGhyZWFkLnN0YXJ0KCk7Ci0vLwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLS8vCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLS8vCQl9Ci0vLwkJCQkKLS8vCQl3aGlsZSAodGVzdGluZykgewotLy8JCQl0cnkgewotLy8JCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotLy8JCQkJCWRpc3BsYXkuc2xlZXAoKTsKLS8vCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLS8vCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0vLwkJCX0JCQkKLS8vCQl9CQkKLS8vCX0KLX0KLQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL1Byb2plY3RDcmVhdGlvbkRlY29yYXRvci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL1Byb2plY3RDcmVhdGlvbkRlY29yYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzUwODlmLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS9Qcm9qZWN0Q3JlYXRpb25EZWNvcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmU7Ci0KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLnRlc3RwbHVnaW4uQW50VGVzdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS50ZXN0cGx1Z2luLlByb2plY3RIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKLQotLyoqCi0gKiBUZXN0IHRvIGNsb3NlIHRoZSB3b3JrYmVuY2gsIHNpbmNlIGRlYnVnIHRlc3RzIGRvIG5vdCBydW4gaW4gdGhlIFVJCi0gKiB0aHJlYWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9qZWN0Q3JlYXRpb25EZWNvcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdEFudFRlc3QgewotCQotCXB1YmxpYyBQcm9qZWN0Q3JlYXRpb25EZWNvcmF0b3IoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RQcm9qZWN0Q3JlYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gZGVsZXRlIGFueSBwcmUtZXhpc3RpbmcgcHJvamVjdAotCQlJUHJvamVjdCBwcm8gPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QoIkFudFRlc3RzIik7Ci0JCWlmIChwcm8uZXhpc3RzKCkpIHsKLQkJCXByby5kZWxldGUodHJ1ZSwgdHJ1ZSwgbnVsbCk7Ci0JCX0KLQkJLy8gY3JlYXRlIHByb2plY3QgYW5kIGltcG9ydCBidWlsZGZpbGVzIGFuZCBzdXBwb3J0IGZpbGVzCi0JCXByb2plY3QgPSBQcm9qZWN0SGVscGVyLmNyZWF0ZVByb2plY3QoIkFudFRlc3RzIiwgImJpbiIpOwotCQlJRm9sZGVyIGZvbGRlciA9IFByb2plY3RIZWxwZXIuYWRkRm9sZGVyKHByb2plY3QsICJidWlsZGZpbGVzIik7Ci0JCUZpbGUgcm9vdCA9IEFudFRlc3RQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEZpbGVJblBsdWdpbihQcm9qZWN0SGVscGVyLlRFU1RfQlVJTERGSUxFU19ESVIpOwotCQlQcm9qZWN0SGVscGVyLmltcG9ydEZpbGVzRnJvbURpcmVjdG9yeShyb290LCBmb2xkZXIuZ2V0RnVsbFBhdGgoKSwgbnVsbCk7Ci0JCQotCQlmb2xkZXIgPSBQcm9qZWN0SGVscGVyLmFkZEZvbGRlcihwcm9qZWN0LCAicmVzb3VyY2VzIik7Ci0JCXJvb3QgPSBBbnRUZXN0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRGaWxlSW5QbHVnaW4oUHJvamVjdEhlbHBlci5URVNUX1JFU09VUkNFU19ESVIpOwotCQlQcm9qZWN0SGVscGVyLmltcG9ydEZpbGVzRnJvbURpcmVjdG9yeShyb290LCBmb2xkZXIuZ2V0RnVsbFBhdGgoKSwgbnVsbCk7Ci0JCQotCQlmb2xkZXIgPSBQcm9qZWN0SGVscGVyLmFkZEZvbGRlcihwcm9qZWN0LCAibGliIik7Ci0JCXJvb3QgPSBBbnRUZXN0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRGaWxlSW5QbHVnaW4oUHJvamVjdEhlbHBlci5URVNUX0xJQl9ESVIpOwotCQlQcm9qZWN0SGVscGVyLmltcG9ydEZpbGVzRnJvbURpcmVjdG9yeShyb290LCBmb2xkZXIuZ2V0RnVsbFBhdGgoKSwgbnVsbCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3Rlc3RzL0ZyYW1ld29ya1Rlc3RzLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvdGVzdHMvRnJhbWV3b3JrVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY1ZGYyOC4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvdGVzdHMvRnJhbWV3b3JrVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLnRlc3RzOwotCi0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmNvcmUuQW50Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS5BbnRDb3JlUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmNvcmUuUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUuQWJzdHJhY3RBbnRUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLnRlc3RwbHVnaW4uQW50VGVzdENoZWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBGcmFtZXdvcmtUZXN0cyBleHRlbmRzIEFic3RyYWN0QW50VGVzdCB7Ci0JCi0JcHVibGljIEZyYW1ld29ya1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2xhc3NwYXRoT3JkZXJpbmcoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJQW50Q29yZVByZWZlcmVuY2VzIHByZWZzID1BbnRDb3JlUGx1Z2luLmdldFBsdWdpbigpLmdldFByZWZlcmVuY2VzKCk7Ci0JCQotCQlTdHJpbmcgcGF0aD0gZ2V0UHJvamVjdCgpLmdldEZvbGRlcigibGliIikuZ2V0RmlsZSgiY2xhc3NwYXRoT3JkZXJpbmcxLmphciIpLmdldExvY2F0aW9uKCkudG9GaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCVVSTCB1cmw9IG5ldyBVUkwoImZpbGU6IiArIHBhdGgpOwotCQkKLQkJcGF0aD0gZ2V0UHJvamVjdCgpLmdldEZvbGRlcigibGliIikuZ2V0RmlsZSgiY2xhc3NwYXRoT3JkZXJpbmcyLmphciIpLmdldExvY2F0aW9uKCkudG9GaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCVVSTCB1cmwyPSBuZXcgVVJMKCJmaWxlOiIgKyBwYXRoKTsKLQkJCi0JCVVSTCB1cmxzW10gPSBwcmVmcy5nZXRDdXN0b21VUkxzKCk7Ci0JCVVSTCBuZXdVcmxzW10gPSBuZXcgVVJMW3VybHMubGVuZ3RoICsgMl07Ci0JCVN5c3RlbS5hcnJheWNvcHkodXJscywgMCwgbmV3VXJscywgMCwgdXJscy5sZW5ndGgpOwotCQluZXdVcmxzW3VybHMubGVuZ3RoXSA9IHVybDsKLQkJbmV3VXJsc1t1cmxzLmxlbmd0aCArIDFdID0gdXJsMjsKLQkJcHJlZnMuc2V0Q3VzdG9tVVJMcyhuZXdVcmxzKTsKLQkJCi0JCXByZWZzLnVwZGF0ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCQotCQlydW4oIkNsYXNzcGF0aE9yZGVyaW5nLnhtbCIpOwotCQlTdHJpbmcgbXNnPSAoU3RyaW5nKUFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRNZXNzYWdlcygpLmdldCgxKTsKLQkJYXNzZXJ0VHJ1ZSgiTWVzc2FnZSBpbmNvcnJlY3Q6ICIgKyBtc2csIG1zZy5lcXVhbHMoImNsYXNzcGF0aE9yZGVyaW5nMSIpKTsKLQkJYXNzZXJ0U3VjY2Vzc2Z1bCgpOwotCQkKLQkJcmVzdG9yZVByZWZlcmVuY2VEZWZhdWx0cygpOwotCQkKLQkJdXJscyA9IHByZWZzLmdldEN1c3RvbVVSTHMoKTsKLQkJbmV3VXJscyA9IG5ldyBVUkxbdXJscy5sZW5ndGggKyAyXTsKLQkJU3lzdGVtLmFycmF5Y29weSh1cmxzLCAwLCBuZXdVcmxzLCAwLCB1cmxzLmxlbmd0aCk7Ci0JCW5ld1VybHNbdXJscy5sZW5ndGhdID0gdXJsMjsKLQkJbmV3VXJsc1t1cmxzLmxlbmd0aCArIDFdID0gdXJsOwotCQlwcmVmcy5zZXRDdXN0b21VUkxzKG5ld1VybHMpOwotCQkKLQkJcHJlZnMudXBkYXRlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJCi0JCXJ1bigiQ2xhc3NwYXRoT3JkZXJpbmcueG1sIik7Ci0JCW1zZz0gKFN0cmluZylBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0TWVzc2FnZXMoKS5nZXQoMSk7Ci0JCWFzc2VydFRydWUoIk1lc3NhZ2UgaW5jb3JyZWN0OiAiICsgbXNnLCBtc2cuZXF1YWxzKCJjbGFzc3BhdGhPcmRlcmluZzIiKSk7Ci0JCWFzc2VydFN1Y2Nlc3NmdWwoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE5vRGVmYXVsdFRhcmdldCgpIHsKLQkJdHJ5IHsKLQkJCXJ1bigiTm9EZWZhdWx0LnhtbCIsIG5ldyBTdHJpbmdbXXsidGVzdCJ9LCBmYWxzZSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJU3RyaW5nIG1zZz0gZS5nZXRNZXNzYWdlKCk7Ci0JCQlhc3NlcnRUcnVlKCJNZXNzYWdlIGluY29ycmVjdDogIiArIG1zZywgbXNnLmVxdWFscygiRGVmYXVsdCB0YXJnZXQgJ2J1aWxkJyBkb2VzIG5vdCBleGlzdCBpbiB0aGlzIHByb2plY3QiKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiQnVpbGQgZmlsZXMgd2l0aCBubyBkZWZhdWx0IHRhcmdldHMgc2hvdWxkIG5vdCBiZSBhY2NlcHRlZCIsIGZhbHNlKTsKLQl9Ci0JCi0JLyoqCi0JICogRW5zdXJlcyB0aGF0IHRhc2tzIGxpa2UgamF2YWMgd29yayB3aGVuIGluY2x1ZGVBbnRSdW50aW1lIGlzIHNwZWNpZmllZAotCSAqIGJ1ZyAyMDg1Ny4KLQkgKiBUaGlzIHRlc3Qgd2lsbCBqdXN0IHJldHVybiBpZiB0aGUgdGVzdHMgYXJlIGNvbmR1Y3RlZCBvbiBhIEpSRSAobm8gdG9vbHMuamFyKS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0SW5jbHVkZUFudFJ1bnRpbWUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVVSTCB0b29sc1VSTD0gQW50Q29yZVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRQcmVmZXJlbmNlcygpLmdldFRvb2xzSmFyVVJMKCk7Ci0JCWlmICh0b29sc1VSTCA9PSBudWxsKSB7Ci0JCQkvL3J1bm5pbmcgb24gYSBKUkUgd2hlcmUgdG9vbHMuamFyIGNvdWxkIG5vdCBiZSBmb3VuZAotCQkJcmV0dXJuOwotCQl9Ci0JCXJ1bigiamF2YWMueG1sIiwgbmV3IFN0cmluZ1tdeyJidWlsZCIsInJlZnJlc2gifSwgZmFsc2UpOyAvL3N0YW5kYXJkIGNvbXBpbGVyCi0JCWFzc2VydFN1Y2Nlc3NmdWwoKTsKLQkJSUZpbGUgY2xhc3NGaWxlPSBnZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKCJ0ZW1wLmZvbGRlciIpLmdldEZvbGRlcigiamF2YWMuYmluIikuZ2V0RmlsZSgiQW50VGVzdFRhc2suY2xhc3MiKTsKLQkJYXNzZXJ0VHJ1ZSgiQ2xhc3MgZmlsZSB3YXMgbm90IGdlbmVyYXRlZCIsIGNsYXNzRmlsZS5leGlzdHMoKSk7Ci0JCXJ1bigiamF2YWMueG1sIiwgbmV3IFN0cmluZ1tdeyItRHVzZS5lY2xpcHNlLmNvbXBpbGVyPXRydWUiLCAiY2xlYW4iLCAiYnVpbGQiLCAicmVmcmVzaCJ9LCBmYWxzZSk7IC8vSkRUQ29tcGlsZXIKLQkJYXNzZXJ0U3VjY2Vzc2Z1bCgpOwotCQljbGFzc0ZpbGU9IGdldFByb2plY3QoKS5nZXRGb2xkZXIoInRlbXAuZm9sZGVyIikuZ2V0Rm9sZGVyKCJqYXZhYy5iaW4iKS5nZXRGaWxlKCJBbnRUZXN0VGFzay5jbGFzcyIpOwotCQlhc3NlcnRUcnVlKCJDbGFzcyBmaWxlIHdhcyBub3QgZ2VuZXJhdGVkIiwgY2xhc3NGaWxlLmV4aXN0cygpKTsKLQl9Ci0JCi0JLyoqCi0JICogVGVzdHMgdGhlIHByb3BlcnRpZXMgYWRkZWQgdXNpbmcgYSBnbG9iYWwgcHJvcGVydHkgZmlsZQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RHbG9iYWxQcm9wZXJ0eUZpbGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQotCQlBbnRDb3JlUHJlZmVyZW5jZXMgcHJlZnMgPUFudENvcmVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0UHJlZmVyZW5jZXMoKTsKLQkJCi0JCVN0cmluZyBwYXRoPSBnZXRQcm9wZXJ0eUZpbGVOYW1lKCk7Ci0JCXByZWZzLnNldEN1c3RvbVByb3BlcnR5RmlsZXMobmV3IFN0cmluZ1tde3BhdGh9KTsKLQkJCi0JCXJ1bigiVGVzdEZvckVjaG8ueG1sIiwgbmV3IFN0cmluZ1tde30pOwotCQlhc3NlcnRTdWNjZXNzZnVsKCk7Ci0JCWFzc2VydFRydWUoImVjbGlwc2UuaXMuY29vbCBzaG91bGQgaGF2ZSBiZWVuIHNldCBhcyBZZXAiLCAiWWVwIi5lcXVhbHMoQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldFVzZXJQcm9wZXJ0eSgiZWNsaXBzZS5pcy5jb29sIikpKTsKLQkJYXNzZXJ0VHJ1ZSgiQW50VGVzdHMgc2hvdWxkIGhhdmUgYSB2YWx1ZSBvZiB0ZXN0aW5nIiwgInRlc3RpbmcgZnJvbSBwcm9wZXJ0aWVzIGZpbGUiLmVxdWFscyhBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0VXNlclByb3BlcnR5KCJBbnRUZXN0cyIpKSk7Ci0JCWFzc2VydE51bGwoIm15Lm5hbWUgd2FzIG5vdCBzZXQgYW5kIHNob3VsZCBiZSBudWxsIiwgQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldFVzZXJQcm9wZXJ0eSgibXkubmFtZSIpKTsKLQkJCi0JCXJlc3RvcmVQcmVmZXJlbmNlRGVmYXVsdHMoKTsKLQl9Ci0JCi0JLyoqCi0JICogVGVzdHMgdGhlIHByb3BlcnRpZXMgYWRkZWQgdXNpbmcgYSBnbG9iYWwgcHJvcGVydHkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0R2xvYmFsUHJvcGVydHkoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQotCQlBbnRDb3JlUHJlZmVyZW5jZXMgcHJlZnMgPUFudENvcmVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0UHJlZmVyZW5jZXMoKTsKLQkJcHJlZnMuc2V0Q3VzdG9tUHJvcGVydGllcyhuZXcgUHJvcGVydHlbXXtuZXcgUHJvcGVydHkoImVjbGlwc2UuaXMuY29vbCIsICJZZXAiKSwgbmV3IFByb3BlcnR5KCJKVW5pdFRlc3QiLCAidHJ1ZSIpfSk7Ci0JCQotCQlydW4oIlRlc3RGb3JFY2hvLnhtbCIsIG5ldyBTdHJpbmdbXXt9KTsKLQkJYXNzZXJ0U3VjY2Vzc2Z1bCgpOwotCQlhc3NlcnRUcnVlKCJlY2xpcHNlLmlzLmNvb2wgc2hvdWxkIGhhdmUgYmVlbiBzZXQgYXMgWWVwIiwgIlllcCIuZXF1YWxzKEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRVc2VyUHJvcGVydHkoImVjbGlwc2UuaXMuY29vbCIpKSk7Ci0JCWFzc2VydFRydWUoIkpVbml0VGVzdHMgc2hvdWxkIGhhdmUgYSB2YWx1ZSBvZiB0cnVlIiwgInRydWUiLmVxdWFscyhBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0VXNlclByb3BlcnR5KCJKVW5pdFRlc3QiKSkpOwotCQlhc3NlcnROdWxsKCJteS5uYW1lIHdhcyBub3Qgc2V0IGFuZCBzaG91bGQgYmUgbnVsbCIsIEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRVc2VyUHJvcGVydHkoIm15Lm5hbWUiKSk7Ci0JCQotCQlyZXN0b3JlUHJlZmVyZW5jZURlZmF1bHRzKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHbG9iYWxQcm9wZXJ0eUZpbGVXaXRoTWludXNEVGFraW5nUHJlY2VkZW5jZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJQW50Q29yZVByZWZlcmVuY2VzIHByZWZzID1BbnRDb3JlUGx1Z2luLmdldFBsdWdpbigpLmdldFByZWZlcmVuY2VzKCk7Ci0JCQotCQlTdHJpbmcgcGF0aD0gZ2V0UHJvcGVydHlGaWxlTmFtZSgpOwotCQlwcmVmcy5zZXRDdXN0b21Qcm9wZXJ0eUZpbGVzKG5ldyBTdHJpbmdbXXtwYXRofSk7Ci0JCQotCQlydW4oImVjaG9pbmcueG1sIiwgbmV3IFN0cmluZ1tdeyItREFudFRlc3RzPXRlc3RpbmciLCAiLURlY2xpcHNlLmlzLmNvb2w9dHJ1ZSJ9LCBmYWxzZSk7Ci0JCWFzc2VydFN1Y2Nlc3NmdWwoKTsKLQkJYXNzZXJ0VHJ1ZSgiZWNsaXBzZS5pcy5jb29sIHNob3VsZCBoYXZlIGJlZW4gc2V0IGFzIHRydWUiLCAidHJ1ZSIuZXF1YWxzKEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRVc2VyUHJvcGVydHkoImVjbGlwc2UuaXMuY29vbCIpKSk7Ci0JCWFzc2VydFRydWUoIkFudFRlc3RzIHNob3VsZCBoYXZlIGEgdmFsdWUgb2YgdGVzdGluZyIsICJ0ZXN0aW5nIi5lcXVhbHMoQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldFVzZXJQcm9wZXJ0eSgiQW50VGVzdHMiKSkpOwotCQlhc3NlcnROdWxsKCJteS5uYW1lIHdhcyBub3Qgc2V0IGFuZCBzaG91bGQgYmUgbnVsbCIsIEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRVc2VyUHJvcGVydHkoIm15Lm5hbWUiKSk7Ci0JCXJlc3RvcmVQcmVmZXJlbmNlRGVmYXVsdHMoKTsKLQl9Ci0JCi0JLyoqCi0JICogVGVzdHMgc2V0dGluZyBBTlRfSE9NRQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RTZXR0aW5nQW50SG9tZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCUFudENvcmVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0UHJlZmVyZW5jZXMoKS5zZXRBbnRIb21lKGdldEFudEhvbWUoKSk7Ci0JCQlydW4oImVjaG9pbmcueG1sIik7Ci0JCQlhc3NlcnRUcnVlKCJBTlRfSE9NRSBub3Qgc2V0IGNvcnJlY3RseSIsIGdldEFudEhvbWUoKS5lcXVhbHMoU3lzdGVtLmdldFByb3BlcnR5KCJhbnQuaG9tZSIpKSk7Ci0JCQlBbnRDb3JlUGx1Z2luLmdldFBsdWdpbigpLmdldFByZWZlcmVuY2VzKCkuc2V0QW50SG9tZSgiIik7Ci0JCQlydW4oImVjaG9pbmcueG1sIik7Ci0JCQlhc3NlcnRUcnVlKCJBTlRfSE9NRSBub3Qgc2V0IGNvcnJlY3RseSIsIG51bGwgPT0gU3lzdGVtLmdldFByb3BlcnR5KCJhbnQuaG9tZSIpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXJlc3RvcmVQcmVmZXJlbmNlRGVmYXVsdHMoKTsKLQkJfQotCQkKLQkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3Rlc3RzL09wdGlvblRlc3RzLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvdGVzdHMvT3B0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM0ZDAxZi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvdGVzdHMvT3B0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLnRlc3RzOwotCi0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS5BbnRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLkFic3RyYWN0QW50VGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS50ZXN0cGx1Z2luLkFudFRlc3RDaGVja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgT3B0aW9uVGVzdHMgZXh0ZW5kcyBBYnN0cmFjdEFudFRlc3QgewotCQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVJUX09GX0hFTFA9ICJhbnQgW29wdGlvbnNdIFt0YXJnZXQgW3RhcmdldDIgW3RhcmdldDNdIC4uLl1dIjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OPSAiQXBhY2hlIEFudCB2ZXJzaW9uIDEuNS4zIGNvbXBpbGVkIG9uIEFwcmlsIDkgMjAwMyI7Ci0JIAotCXB1YmxpYyBPcHRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JLyoqCi0JICogVGVzdHMgdGhlICItaGVscCIgb3B0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEhlbHAoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJ1bigiVGVzdEZvckVjaG8ueG1sIiwgbmV3IFN0cmluZ1tdeyItaGVscCJ9KTsKLQkJYXNzZXJ0VHJ1ZSgiT25lIG1lc3NhZ2Ugc2hvdWxkIGhhdmUgYmVlbiBsb2dnZWQiLCBBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0TWVzc2FnZXNMb2dnZWRDb3VudCgpID09IDEpOwotCQlhc3NlcnRUcnVlKCJIZWxwIGlzIGluY29ycmVjdCIsIGdldExhc3RNZXNzYWdlTG9nZ2VkKCkgIT0gbnVsbCAmJiBnZXRMYXN0TWVzc2FnZUxvZ2dlZCgpLnN0YXJ0c1dpdGgoU1RBUlRfT0ZfSEVMUCkpOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0cyB0aGUgIi12ZXJzaW9uIiBvcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0VmVyc2lvbigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcnVuKCJUZXN0Rm9yRWNoby54bWwiLCBuZXcgU3RyaW5nW117Ii12ZXJzaW9uIn0pOwotCQlhc3NlcnRUcnVlKCJPbmUgbWVzc2FnZSBzaG91bGQgaGF2ZSBiZWVuIGxvZ2dlZCIsIEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRNZXNzYWdlc0xvZ2dlZENvdW50KCkgPT0gMSk7Ci0JCWFzc2VydFRydWUoIlZlcnNpb24gaXMgaW5jb3JyZWN0IiwgVkVSU0lPTi5lcXVhbHMoZ2V0TGFzdE1lc3NhZ2VMb2dnZWQoKSkpOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0cyB0aGUgIi1wcm9qZWN0aGVscCIgb3B0aW9uIHdoZW4gaXQgd2lsbCBub3Qgc2hvdyAocXVpdGUgbW9kZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0UHJvamVjdGhlbHAoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJ1bigiVGVzdEZvckVjaG8ueG1sIiwgbmV3IFN0cmluZ1tdeyItcHJvamVjdGhlbHAifSk7Ci0JCWFzc2VydFRydWUoIjQgbWVzc2FnZXMgc2hvdWxkIGhhdmUgYmVlbiBsb2dnZWQ7IHdhcyAiICsgQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldE1lc3NhZ2VzTG9nZ2VkQ291bnQoKSwgQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldE1lc3NhZ2VzTG9nZ2VkQ291bnQoKSA9PSA0KTsKLQkJYXNzZXJ0VHJ1ZSgiUHJvamVjdCBoZWxwIGlzIGluY29ycmVjdCIsIGdldExhc3RNZXNzYWdlTG9nZ2VkKCkuc3RhcnRzV2l0aCgiU3VidGFyZ2V0czoiKSk7Ci0JfQotCQotCS8qKgotCSAqIFRlc3RzIHRoZSAiLXByb2plY3RoZWxwIiBvcHRpb24gd2hlbiBpdCB3aWxsIG5vdCBzaG93IChxdWl0ZSBtb2RlKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RQcm9qZWN0aGVscFF1aWV0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlydW4oIlRlc3RGb3JFY2hvLnhtbCIsIG5ldyBTdHJpbmdbXXsiLXByb2plY3RoZWxwIiwgIi1xIn0pOwotCQlhc3NlcnRUcnVlKCJubyBtZXNzYWdlcyBzaG91bGQgaGF2ZSBiZWVuIGxvZ2dlZDsgd2FzICIgKyBBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0TWVzc2FnZXNMb2dnZWRDb3VudCgpLCBBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0TWVzc2FnZXNMb2dnZWRDb3VudCgpID09IDApOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0cyB0aGUgIi1saXN0ZW5lciIgb3B0aW9uIHdpdGggYSBsaXN0ZW5lciB0aGF0IGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBCdWlsZExpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgdGVzdExpc3RlbmVyQmFkKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJcnVuKCJUZXN0Rm9yRWNoby54bWwiLCBuZXcgU3RyaW5nW117Ii1saXN0ZW5lciIsICJqYXZhLmxhbmcuU3RyaW5nIn0pOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQlTdHJpbmcgbXNnPSBjZS5nZXRNZXNzYWdlKCk7Ci0JCQlhc3NlcnRUcnVlKCJNZXNzYWdlIGluY29ycmVjdCE6ICIgKyBtc2csIG1zZy5lcXVhbHMoImphdmEubGFuZy5TdHJpbmcgd2hpY2ggd2FzIHNwZWNpZmllZCB0byBiZSBhIGJ1aWxkIGxpc3RlbmVyIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZExpc3RlbmVyLiIpKTsKLQkJCXJldHVybjsKLQkJfQotCQlhc3NlcnRUcnVlKCJBIGNvcmUgZXhjZXB0aW9uIHNob3VsZCBoYXZlIG9jY3VycmVkIHdyYXBwZXJpbmcgYSBjbGFzcyBjYXN0IGV4Y2VwdGlvbiIsIGZhbHNlKTsKLQl9Ci0JCi0JLyoqCi0JICogVGVzdHMgcGFzc2luZyBhbiB1bnJlY29nbml6ZWQgYXJndW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0VW5rbm93bkFyZygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsJCi0JCXJ1bigiVGVzdEZvckVjaG8ueG1sIiwgbmV3IFN0cmluZ1tdeyItbGlzdGVuciJ9KTsKLQkJLy91bmtub3duIGFyZywgcHJpbnQgdXNhZ2UKLQkJYXNzZXJ0VHJ1ZSgiVHdvIG1lc3NhZ2Ugc2hvdWxkIGhhdmUgYmVlbiBsb2dnZWQiLCBBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0TWVzc2FnZXNMb2dnZWRDb3VudCgpID09IDIpOwotCQlhc3NlcnRUcnVlKCJTaG91bGQgaGF2ZSBwcmludGVkIHRoZSB1c2FnZSIsIGdldExhc3RNZXNzYWdlTG9nZ2VkKCkgIT0gbnVsbCAmJiBnZXRMYXN0TWVzc2FnZUxvZ2dlZCgpLnN0YXJ0c1dpdGgoU1RBUlRfT0ZfSEVMUCkpOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0cyBzcGVjaWZ5aW5nIHRoZSAtbG9nZmlsZSB3aXRoIG5vIGFyZwotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RMb2dGaWxlV2l0aE5vQXJnKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJcnVuKCJUZXN0Rm9yRWNoby54bWwiLCBuZXcgU3RyaW5nW117Ii1sb2dmaWxlIn0pOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiWW91IG11c3Qgc3BlY2lmeSBhIGxvZyBmaWxlIHdoZW4gdXNpbmcgdGhlIC1sb2cgYXJndW1lbnQiLCBmYWxzZSk7Ci0JfQotCQotCS8qKgotCSAqIFRlc3RzIHNwZWNpZnlpbmcgdGhlIC1sb2dmaWxlCi0JICovCi0JcHVibGljIHZvaWQgdGVzdExvZ0ZpbGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlydW4oIlRlc3RGb3JFY2hvLnhtbCIsIG5ldyBTdHJpbmdbXXsiLWxvZ2ZpbGUiLCAiVGVzdExvZ0ZpbGUudHh0In0pOwotCQlJRmlsZSBmaWxlPSBjaGVja0ZpbGVFeGlzdHMoIlRlc3RMb2dGaWxlLnR4dCIpOwotCQlJbnB1dFN0cmVhbSBzdHJlYW0gPWZpbGUuZ2V0Q29udGVudHMoKTsKLQkJCi0JCUlucHV0U3RyZWFtUmVhZGVyIGluPSBudWxsOwotCQl0cnkgewkJCi0JCQlpbj0gbmV3IElucHV0U3RyZWFtUmVhZGVyKG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKHN0cmVhbSkpOwotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlcj0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJY2hhcltdIHJlYWRCdWZmZXI9IG5ldyBjaGFyWzIwNDhdOwotCQkJaW50IG49IGluLnJlYWQocmVhZEJ1ZmZlcik7Ci0JCQl3aGlsZSAobiA+IDApIHsKLQkJCQlidWZmZXIuYXBwZW5kKHJlYWRCdWZmZXIsIDAsIG4pOwotCQkJCW49IGluLnJlYWQocmVhZEJ1ZmZlcik7Ci0JCQl9Ci0JCQlhc3NlcnRUcnVlKCJGaWxlIHNob3VsZCBoYXZlIHN0YXJ0ZWQgd2l0aCBCdWlsZGZpbGUiLCBidWZmZXIudG9TdHJpbmcoKS5zdGFydHNXaXRoKCJCdWlsZGZpbGUiKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpbi5jbG9zZSgpOwotCQkJc3RyZWFtLmNsb3NlKCk7Ci0JCX0KLQkJCi0JfQotCQotCS8qKgotCSAqIFRlc3RzIHNwZWNpZnlpbmcgdGhlIC1sb2dnZXIgd2l0aCBubyBhcmcKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0TG9nZ2VyV2l0aE5vQXJnKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJcnVuKCJUZXN0Rm9yRWNoby54bWwiLCBuZXcgU3RyaW5nW117Ii1sb2dnZXIifSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCXJldHVybjsKLQkJfQotCQlhc3NlcnRUcnVlKCJZb3UgbXVzdCBzcGVjaWZ5IGEgY2xhc3NuYW1lIHdoZW4gdXNpbmcgdGhlIC1sb2dnZXIgYXJndW1lbnQiLCBmYWxzZSk7Ci0JfQotCQotCS8qKgotCSAqIFRlc3RzIHRoZSAiLWxvZ2dlciIgb3B0aW9uIHdpdGggYSBsb2dnZXIgdGhhdCBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgQnVpbGRMb2dnZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0TG9nZ2VyQmFkKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJcnVuKCJUZXN0Rm9yRWNoby54bWwiLCBuZXcgU3RyaW5nW117Ii1sb2dnZXIiLCAiamF2YS5sYW5nLlN0cmluZyJ9KTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWFzc2VydFRydWUoIkEgY29yZSBleGNlcHRpb24gc2hvdWxkIGhhdmUgb2NjdXJyZWQgd3JhcHBlcmluZyBhIGNsYXNzIGNhc3QgZXhjZXB0aW9uIiwgZmFsc2UpOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0cyB0aGUgIi1sb2dnZXIiIG9wdGlvbiB3aXRoIHR3byBsb2dnZXJzIHNwZWNpZmllZC4uLm9ubHkgb25lIGlzIGFsbG93ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0VHdvTG9nZ2VycygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXJ1bigiVGVzdEZvckVjaG8ueG1sIiwgbmV3IFN0cmluZ1tdeyItbG9nZ2VyIiwgImphdmEubGFuZy5TdHJpbmciLCAiLXEiLCAiLWxvZ2dlciIsICJqYXZhLmxhbmcuU3RyaW5nIn0pOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiQXMgb25seSBvbmUgbG9nZ2VyIGNhbiBiZSBzcGVjaWZpZWQiLCBmYWxzZSk7Ci0JfQotCQotCS8qKgotCSAqIFRlc3RzIHNwZWNpZnlpbmcgdGhlIC1saXN0ZW5lciB3aXRoIG5vIGFyZwotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RMaXN0ZW5lcldpdGhOb0FyZygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXJ1bigiVGVzdEZvckVjaG8ueG1sIiwgbmV3IFN0cmluZ1tdeyItbGlzdGVuZXIifSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCXJldHVybjsKLQkJfQotCQlhc3NlcnRUcnVlKCJZb3UgbXVzdCBzcGVjaWZ5IGEgbGlzdGVuZXJzIHdoZW4gdXNpbmcgdGhlIC1saXN0ZW5lciBhcmd1bWVudCAiLCBmYWxzZSk7Ci0JfQotCQotCS8qKgotCSAqIFRlc3RzIHNwZWNpZnlpbmcgdGhlIC1saXN0ZW5lciB3aXRoIGEgY2xhc3MgdGhhdCB3aWxsIG5vdCBiZSBmb3VuZAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RMaXN0ZW5lckNsYXNzTm90Rm91bmQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlydW4oIlRlc3RGb3JFY2hvLnhtbCIsIG5ldyBTdHJpbmdbXXsiLWxpc3RlbmVyIiwgIlRlc3RCdWlsZExpc3RlbmVyIn0pOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVN0cmluZyBtZXNzYWdlPSBlLmdldFN0YXR1cygpLmdldEV4Y2VwdGlvbigpLmdldE1lc3NhZ2UoKTsKLQkJCWFzc2VydFRydWUoIlNob3VsZCBiZSBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIiwgImphdmEubGFuZy5DbGFzc05vdEZvdW5kRXhjZXB0aW9uOiBUZXN0QnVpbGRMaXN0ZW5lciIuZXF1YWxzKG1lc3NhZ2UpKTsKLQkJCXJldHVybjsKLQkJfQotCQlhc3NlcnRUcnVlKCJBIENvcmVFeGNlcHRpb24gc2hvdWxkIGhhdmUgb2NjdXJyZWQgYXMgdGhlIGxpc3RlbmVyIGNsYXNzIHdpbGwgbm90IGJlIGZvdW5kIiwgZmFsc2UpOwotCQkKLQl9Ci0JLyoqCi0JICogVGVzdHMgc3BlY2lmeWluZyB0aGUgLWxpc3RlbmVyIG9wdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RMaXN0ZW5lcigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcnVuKCJUZXN0Rm9yRWNoby54bWwiLCBuZXcgU3RyaW5nW117Ii1saXN0ZW5lciIsIEFOVF9URVNUX0JVSUxEX0xJU1RFTkVSfSk7Ci0JCWFzc2VydFN1Y2Nlc3NmdWwoKTsKLQkJYXNzZXJ0VHJ1ZSgiQSBsaXN0ZW5lciBzaG91bGQgaGF2ZSBiZWVuIGFkZGVkIG5hbWVkOiAiICsgQU5UX1RFU1RfQlVJTERfTElTVEVORVIsIEFOVF9URVNUX0JVSUxEX0xJU1RFTkVSLmVxdWFscyhBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0TGFzdExpc3RlbmVyKCkpKTsKLQl9Ci0JCi0JLyoqCi0JICogVGVzdHMgc3BlY2lmeWluZyB0aGUgLWxpc3RlbmVyIG9wdGlvbiBtdWx0aXBsZSB0aW1lcy4uLndoaWNoIGlzIGFsbG93ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdGVuZXJNdWx0aXBsZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcnVuKCJUZXN0Rm9yRWNoby54bWwiLCBuZXcgU3RyaW5nW117Ii1saXN0ZW5lciIsIEFOVF9URVNUX0JVSUxEX0xJU1RFTkVSLCAiLWxpc3RlbmVyIiwgQU5UX1RFU1RfQlVJTERfTElTVEVORVJ9KTsKLQkJYXNzZXJ0U3VjY2Vzc2Z1bCgpOwotCQlhc3NlcnRUcnVlKCJBIGxpc3RlbmVyIHNob3VsZCBoYXZlIGJlZW4gYWRkZWQgbmFtZWQ6ICIgKyBBTlRfVEVTVF9CVUlMRF9MSVNURU5FUiwgQU5UX1RFU1RfQlVJTERfTElTVEVORVIuZXF1YWxzKEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRMYXN0TGlzdGVuZXIoKSkpOwotCQlhc3NlcnRUcnVlKCJUd28gbGlzdGVuZXJzIHNob3VsZCBoYXZlIGJlZW4gYWRkZWQiLCBBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0TGlzdGVuZXJzKCkuc2l6ZSgpID09IDIpOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0cyBzcGVjaWZ5aW5nIHRoZSAtbGlzdGVuZXIgb3B0aW9uIG11bHRpcGxlIHRpbWVzLCB3aXRoIG9uZSBtaXNzaW5nIHRoZSBhcmcKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdGVuZXJNdWx0aXBsZVdpdGhCYWQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlydW4oIlRlc3RGb3JFY2hvLnhtbCIsIG5ldyBTdHJpbmdbXXsiLWxpc3RlbmVyIiwgQU5UX1RFU1RfQlVJTERfTElTVEVORVIsICItcSIsICItbGlzdGVuZXIiLCAiLXZlcmJvc2UifSk7Ci0JCX0gY2F0Y2goQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvL1lvdSBtdXN0IHNwZWNpZnkgYSBsaXN0ZW5lciBmb3IgYWxsIC1saXN0ZW5lciBhcmd1bWVudHMKLQkJCXJldHVybjsKLQkJfQotCQlhc3NlcnRUcnVlKCJZb3UgbXVzdCBzcGVjaWZ5IGEgbGlzdGVuZXIgZm9yIGFsbCAtbGlzdGVuZXIgYXJndW1lbnRzICIsIGZhbHNlKTsKLQl9Ci0JCi0JLyoqCi0JICogVGVzdHMgc3BlY2lmeWluZyB0aGUgLWJ1aWxkZmlsZSB3aXRoIG5vIGFyZwotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RCdWlsZEZpbGVXaXRoTm9BcmcoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlydW4oIlRlc3RGb3JFY2hvLnhtbCIsIG5ldyBTdHJpbmdbXXsiLWJ1aWxkZmlsZSJ9KTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJLy9Zb3UgbXVzdCBzcGVjaWZ5IGEgYnVpbGRmaWxlIHdoZW4gdXNpbmcgdGhlIC1idWlsZGZpbGUgYXJndW1lbnQKLQkJCXJldHVybjsKLQkJfQotCQlhc3NlcnRUcnVlKCJZb3UgbXVzdCBzcGVjaWZ5IGEgYnVpbGRmaWxlIHdoZW4gdXNpbmcgdGhlIC1idWlsZGZpbGUgYXJndW1lbnQiLCBmYWxzZSk7Ci0JfQotCQotCS8qKgotCSAqIFRlc3RzIHNwZWNpZnlpbmcgdGhlIC1idWlsZGZpbGUKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0QnVpbGRGaWxlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTdHJpbmcgYnVpbGRGaWxlTmFtZT0gZ2V0UHJvamVjdCgpLmdldEZvbGRlcigiYnVpbGRmaWxlcyIpLmdldEZpbGUoImVjaG9pbmcueG1sIikuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJcnVuKCJUZXN0Rm9yRWNoby54bWwiLCBuZXcgU3RyaW5nW117Ii1idWlsZGZpbGUiLCBidWlsZEZpbGVOYW1lfSwgZmFsc2UsICJidWlsZGZpbGVzIik7Ci0JCQotCQlhc3NlcnRUcnVlKCJTaG91bGQgaGF2ZSBiZWVuIDEgdGFza3MsIHdhczogIiArIEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRUYXNrU3RhcnRlZENvdW50KCksIEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRUYXNrU3RhcnRlZENvdW50KCkgPT0gMSk7Ci0JfQotCQotCS8qKgotCSAqIFRlc3RzIHNwZWNpZnlpbmcgYSB0YXJnZXQgYXQgdGhlIGNvbW1hbmQgbGluZSB0aGF0IGRvZXMgbm90IGV4aXN0LgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZ5QmFkVGFyZ2V0QXNBcmcoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlydW4oIlRlc3RGb3JFY2hvLnhtbCIsIG5ldyBTdHJpbmdbXXsiZWNobzIifSwgZmFsc2UpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiQSBjb3JlIGV4Y2VwdGlvbiBzaG91bGQgaGF2ZSBvY2N1cnJlZCBhcyB0aGUgdGFyZ2V0IGRvZXMgbm90IGV4aXN0IiwgZmFsc2UpOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0cyBzcGVjaWZ5aW5nIGEgdGFyZ2V0IGF0IHRoZSBjb21tYW5kIGxpbmUKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmeVRhcmdldEFzQXJnKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlydW4oImVjaG9pbmcueG1sIiwgbmV3IFN0cmluZ1tdeyJlY2hvMyJ9LCBmYWxzZSk7Ci0JCWFzc2VydFRydWUoIjMgbWVzc2FnZXMgc2hvdWxkIGhhdmUgYmVlbiBsb2dnZWQ7IHdhcyAiICsgQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldE1lc3NhZ2VzTG9nZ2VkQ291bnQoKSwgQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldE1lc3NhZ2VzTG9nZ2VkQ291bnQoKSA9PSAzKTsKLQkJYXNzZXJ0U3VjY2Vzc2Z1bCgpOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0cyBzcGVjaWZ5aW5nIGEgdGFyZ2V0IGF0IHRoZSBjb21tYW5kIGxpbmUgd2l0aCBvdGhlciBvcHRpb25zCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZnlUYXJnZXRBc0FyZ1dpdGhPdGhlck9wdGlvbnMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJ1bigiZWNob2luZy54bWwiLCBuZXcgU3RyaW5nW117Ii1sb2dmaWxlIiwgIlRlc3RMb2dGaWxlLnR4dCIsICJlY2hvMyJ9LCBmYWxzZSk7Ci0JCWFzc2VydFRydWUoIjQgbWVzc2FnZXMgc2hvdWxkIGhhdmUgYmVlbiBsb2dnZWQ7IHdhcyAiICsgQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldE1lc3NhZ2VzTG9nZ2VkQ291bnQoKSwgQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldE1lc3NhZ2VzTG9nZ2VkQ291bnQoKSA9PSA0KTsKLQkJTGlzdCBtZXNzYWdlcz0gQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldE1lc3NhZ2VzKCk7Ci0JCS8vZW5zdXJlIHRoYXQgZWNobzMgdGFyZ2V0IGV4ZWN1dGVkIGFuZCBvbmx5IHRoYXQgdGFyZ2V0Ci0JCWFzc2VydFRydWUoImVjaG8zIHRhcmdldCBub3QgZXhlY3V0ZWQiLCBtZXNzYWdlcy5nZXQoMikuZXF1YWxzKCJlY2hvMyIpKTsKLQkJYXNzZXJ0U3VjY2Vzc2Z1bCgpOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0cyBzcGVjaWZ5aW5nIHRhcmdldHMgYXQgdGhlIGNvbW1hbmQgbGluZSB3aXRoIG90aGVyIG9wdGlvbnMKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmeVRhcmdldHNBc0FyZ1dpdGhPdGhlck9wdGlvbnMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJ1bigiZWNob2luZy54bWwiLCBuZXcgU3RyaW5nW117Ii1sb2dmaWxlIiwgIlRlc3RMb2dGaWxlLnR4dCIsICJlY2hvMiIsICJlY2hvMyJ9LCBmYWxzZSk7Ci0JCWFzc2VydFRydWUoIjUgbWVzc2FnZXMgc2hvdWxkIGhhdmUgYmVlbiBsb2dnZWQ7IHdhcyAiICsgQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldE1lc3NhZ2VzTG9nZ2VkQ291bnQoKSwgQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldE1lc3NhZ2VzTG9nZ2VkQ291bnQoKSA9PSA1KTsKLQkJTGlzdCBtZXNzYWdlcz0gQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldE1lc3NhZ2VzKCk7Ci0JCS8vZW5zdXJlIHRoYXQgZWNobzIgdGFyZ2V0IGV4ZWN1dGVkCi0JCWFzc2VydFRydWUoImVjaG8yIHRhcmdldCBub3QgZXhlY3V0ZWQiLCBtZXNzYWdlcy5nZXQoMikuZXF1YWxzKCJlY2hvMiIpKTsKLQkJYXNzZXJ0U3VjY2Vzc2Z1bCgpOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0cyBzcGVjaWZ5aW5nIGEgdGFyZ2V0IGF0IHRoZSBjb21tYW5kIGxpbmUgYW5kIHF1aWV0IHJlcG9ydGluZwotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZ5VGFyZ2V0QXNBcmdBbmRRdWlldCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcnVuKCJlY2hvaW5nLnhtbCIsIG5ldyBTdHJpbmdbXXsiLWxvZ2ZpbGUiLCAiVGVzdExvZ0ZpbGUudHh0IiwgImVjaG8zIiwgIi1xdWlldCJ9LCBmYWxzZSk7Ci0JCWFzc2VydFRydWUoIjEgbWVzc2FnZSBzaG91bGQgaGF2ZSBiZWVuIGxvZ2dlZDsgd2FzICIgKyBBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0TWVzc2FnZXNMb2dnZWRDb3VudCgpLCBBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0TWVzc2FnZXNMb2dnZWRDb3VudCgpID09IDEpOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0cyBzcGVjaWZ5aW5nIGEgdGFyZ2V0IGF0IHRoZSBjb21tYW5kIGxpbmUgYW5kIHF1aWV0IHJlcG9ydGluZwotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RNaW51c0QoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJ1bigiZWNob2luZy54bWwiLCBuZXcgU3RyaW5nW117Ii1EQW50VGVzdHM9dGVzdGluZyIsICItRGVjbGlwc2UuaXMuY29vbD10cnVlIn0sIGZhbHNlKTsKLQkJYXNzZXJ0U3VjY2Vzc2Z1bCgpOwotCQlhc3NlcnRUcnVlKCJlY2xpcHNlLmlzLmNvb2wgc2hvdWxkIGhhdmUgYmVlbiBzZXQgYXMgdHJ1ZSIsICJ0cnVlIi5lcXVhbHMoQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldFVzZXJQcm9wZXJ0eSgiZWNsaXBzZS5pcy5jb29sIikpKTsKLQkJYXNzZXJ0VHJ1ZSgiQW50VGVzdHMgc2hvdWxkIGhhdmUgYSB2YWx1ZSBvZiB0ZXN0aW5nIiwgInRlc3RpbmciLmVxdWFscyhBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0VXNlclByb3BlcnR5KCJBbnRUZXN0cyIpKSk7Ci0JCWFzc2VydE51bGwoIm15Lm5hbWUgd2FzIG5vdCBzZXQgYW5kIHNob3VsZCBiZSBudWxsIiwgQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldFVzZXJQcm9wZXJ0eSgibXkubmFtZSIpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFByb3BlcnR5RmlsZVdpdGhOb0FyZygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXJ1bigiVGVzdEZvckVjaG8ueG1sIiwgbmV3IFN0cmluZ1tdeyItcHJvcGVydHlmaWxlIn0pOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQlTdHJpbmcgbXNnPSAoU3RyaW5nKUFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRNZXNzYWdlcygpLmdldCgwKTsKLQkJCWFzc2VydFRydWUoIk1lc3NhZ2UgaW5jb3JyZWN0ITogIiArIG1zZywgbXNnLmVxdWFscygiWW91IG11c3Qgc3BlY2lmeSBhIHByb3BlcnR5IGZpbGVuYW1lIHdoZW4gdXNpbmcgdGhlIC1wcm9wZXJ0eWZpbGUgYXJndW1lbnQiKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiWW91IG11c3Qgc3BlY2lmeSBhIHByb3BlcnR5IGZpbGVuYW1lIHdoZW4gdXNpbmcgdGhlIC1wcm9wZXJ0eWZpbGUgYXJndW1lbnQiLCBmYWxzZSk7Ci0JfQotCQotCS8qKgotCSAqIEEgYnVpbGQgc2hvdWxkIHN1Y2NlZWQgd2hlbiBhIHByb3BlcnR5IGZpbGUgaXMgbm90IGZvdW5kLgotCSAqIFRoZSBlcnJvciBpcyByZXBvcnRlZCBhbmQgdGhlIGJ1aWxkIGNvbnRpbnVlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlGaWxlRmlsZU5vdEZvdW5kKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkKLQkJcnVuKCJUZXN0Rm9yRWNoby54bWwiLCBuZXcgU3RyaW5nW117Ii1wcm9wZXJ0eWZpbGUiLCAicXEudHh0In0pOwotCQlhc3NlcnRTdWNjZXNzZnVsKCk7Ci0JCVN0cmluZyBtc2c9IChTdHJpbmcpQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldE1lc3NhZ2VzKCkuZ2V0KDApOwotCQlhc3NlcnRUcnVlKCJNZXNzYWdlIGluY29ycmVjdCE6ICIgKyBtc2csIG1zZy5zdGFydHNXaXRoKCJDb3VsZCBub3QgbG9hZCBwcm9wZXJ0eSBmaWxlIHFxLnR4dDoiKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0eUZpbGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJ1bigiVGVzdEZvckVjaG8ueG1sIiwgbmV3IFN0cmluZ1tdeyItcHJvcGVydHlmaWxlIiwgZ2V0UHJvcGVydHlGaWxlTmFtZSgpfSk7Ci0JCWFzc2VydFN1Y2Nlc3NmdWwoKTsKLQkJYXNzZXJ0VHJ1ZSgiZWNsaXBzZS5pcy5jb29sIHNob3VsZCBoYXZlIGJlZW4gc2V0IGFzIFllcCIsICJZZXAiLmVxdWFscyhBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0VXNlclByb3BlcnR5KCJlY2xpcHNlLmlzLmNvb2wiKSkpOwotCQlhc3NlcnRUcnVlKCJBbnRUZXN0cyBzaG91bGQgaGF2ZSBhIHZhbHVlIG9mIHRlc3RpbmciLCAidGVzdGluZyBmcm9tIHByb3BlcnRpZXMgZmlsZSIuZXF1YWxzKEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRVc2VyUHJvcGVydHkoIkFudFRlc3RzIikpKTsKLQkJYXNzZXJ0TnVsbCgibXkubmFtZSB3YXMgbm90IHNldCBhbmQgc2hvdWxkIGJlIG51bGwiLCBBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0VXNlclByb3BlcnR5KCJteS5uYW1lIikpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlGaWxlV2l0aE1pbnVzRFRha2luZ1ByZWNlZGVuY2UoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJ1bigiZWNob2luZy54bWwiLCBuZXcgU3RyaW5nW117Ii1wcm9wZXJ0eWZpbGUiLCBnZXRQcm9wZXJ0eUZpbGVOYW1lKCksICItREFudFRlc3RzPXRlc3RpbmciLCAiLURlY2xpcHNlLmlzLmNvb2w9dHJ1ZSJ9LCBmYWxzZSk7Ci0JCWFzc2VydFN1Y2Nlc3NmdWwoKTsKLQkJYXNzZXJ0VHJ1ZSgiZWNsaXBzZS5pcy5jb29sIHNob3VsZCBoYXZlIGJlZW4gc2V0IGFzIHRydWUiLCAidHJ1ZSIuZXF1YWxzKEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRVc2VyUHJvcGVydHkoImVjbGlwc2UuaXMuY29vbCIpKSk7Ci0JCWFzc2VydFRydWUoIkFudFRlc3RzIHNob3VsZCBoYXZlIGEgdmFsdWUgb2YgdGVzdGluZyIsICJ0ZXN0aW5nIi5lcXVhbHMoQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldFVzZXJQcm9wZXJ0eSgiQW50VGVzdHMiKSkpOwotCQlhc3NlcnROdWxsKCJteS5uYW1lIHdhcyBub3Qgc2V0IGFuZCBzaG91bGQgYmUgbnVsbCIsIEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRVc2VyUHJvcGVydHkoIm15Lm5hbWUiKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJbnB1dEhhbmRsZXJXaXRoTm9BcmcoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlydW4oIlRlc3RGb3JFY2hvLnhtbCIsIG5ldyBTdHJpbmdbXXsiLWlucHV0aGFuZGxlciJ9KTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJU3RyaW5nIG1zZz0gY2UuZ2V0TWVzc2FnZSgpOwotCQkJYXNzZXJ0VHJ1ZSgiTWVzc2FnZSBpbmNvcnJlY3QhOiAiICsgbXNnLCBtc2cuZXF1YWxzKCJZb3UgbXVzdCBzcGVjaWZ5IGEgY2xhc3NuYW1lIHdoZW4gdXNpbmcgdGhlIC1pbnB1dGhhbmRsZXIgYXJndW1lbnQiKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiWW91IG11c3Qgc3BlY2lmeSBhIGNsYXNzbmFtZSB3aGVuIHVzaW5nIHRoZSAtaW5wdXRoYW5kbGVyIGFyZ3VtZW50IiwgZmFsc2UpOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0cyB0aGUgIi1pbnB1dGhhbmRsZXIiIG9wdGlvbiB3aXRoIHR3byBoYW5kbGVycyBzcGVjaWZpZWQuLi5vbmx5IG9uZSBpcyBhbGxvd2VkCi0JICovCi0JcHVibGljIHZvaWQgdGVzdElucHV0SGFuZGxlck11bHRpcGxlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJcnVuKCJUZXN0Rm9yRWNoby54bWwiLCBuZXcgU3RyaW5nW117Ii1pbnB1dGhhbmRsZXIiLCAib3JnLmFwYWNoZS50b29scy5hbnQuaW5wdXQuRGVmYXVsdElucHV0SGFuZGxlciIsICItcSIsICItaW5wdXRoYW5kbGVyIiwgIm9yZy5hcGFjaGUudG9vbHMuYW50LmlucHV0LkRlZmF1bHRJbnB1dEhhbmRsZXIifSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCVN0cmluZyBtc2c9IGNlLmdldE1lc3NhZ2UoKTsKLQkJCWFzc2VydFRydWUoIk1lc3NhZ2UgaW5jb3JyZWN0ITogIiArIG1zZywgbXNnLmVxdWFscygiT25seSBvbmUgaW5wdXQgaGFuZGxlciBjbGFzcyBtYXkgYmUgc3BlY2lmaWVkLiIpKTsKLQkJCXJldHVybjsKLQkJfQotCQlhc3NlcnRUcnVlKCJBcyBvbmx5IG9uZSBpbnB1dCBoYW5kbGVyIGNhbiBiZSBzcGVjaWZpZWQiLCBmYWxzZSk7Ci0JfQotCQotCS8qKgotCSAqIFRlc3RzIHRoZSAiLWlucHV0aGFuZGxlciIgb3B0aW9uIHdpdGggYSBpbnB1dCBoYW5kbGVyIHRoYXQgaXMgbm90IGFuIGluc3RhbmNlIG9mIElucHV0SGFuZGxlcgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RJbnB1dEhhbmRsZXJCYWQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlydW4oIlRlc3RGb3JFY2hvLnhtbCIsIG5ldyBTdHJpbmdbXXsiLWlucHV0aGFuZGxlciIsICJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIn0pOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQlTdHJpbmcgbXNnPSBjZS5nZXRNZXNzYWdlKCk7Ci0JCQlhc3NlcnRUcnVlKCJNZXNzYWdlIGluY29ycmVjdCE6ICIgKyBtc2csIG1zZy5lcXVhbHMoIlRoZSBzcGVjaWZpZWQgaW5wdXQgaGFuZGxlciBjbGFzcyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIGRvZXMgbm90IGltcGxlbWVudCB0aGUgb3JnLmFwYWNoZS50b29scy5hbnQuaW5wdXQuSW5wdXRIYW5kbGVyIGludGVyZmFjZSIpKTsKLQkJCXJldHVybjsKLQkJfQotCQlhc3NlcnRUcnVlKCJJbmNvcnJlY3QgaW5wdXRoYW5kbGVyIiwgZmFsc2UpOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0cyB0aGUgIi1pbnB1dGhhbmRsZXIiIG9wdGlvbiB3aXRoIGEgaW5wdXQgaGFuZGxlciB0aGF0IGlzIG5vdCBhIGRlZmluZWQgY2xhc3MKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0SW5wdXRIYW5kbGVyQmFkMigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXJ1bigiVGVzdEZvckVjaG8ueG1sIiwgbmV3IFN0cmluZ1tdeyItaW5wdXRoYW5kbGVyIiwgImphLmxhbmcuU3RyaW5nQnVmZmVyIn0pOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQlTdHJpbmcgbXNnPSBjZS5nZXRNZXNzYWdlKCk7Ci0JCQlhc3NlcnRUcnVlKCJNZXNzYWdlIGluY29ycmVjdCE6ICIgKyBtc2csIG1zZy5zdGFydHNXaXRoKCJVbmFibGUgdG8gaW5zdGFudGlhdGUgc3BlY2lmaWVkIGlucHV0IGhhbmRsZXIgY2xhc3MgamEubGFuZy5TdHJpbmdCdWZmZXIiKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IGlucHV0aGFuZGxlciIsIGZhbHNlKTsKLQl9Ci0JCi0JLyoqCi0JICogVGVzdHMgdGhlICItaW5wdXRoYW5kbGVyIiBvcHRpb24gd2l0aCBhIHRlc3QgaW5wdXQgaGFuZGxlcgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RJbnB1dEhhbmRsZXIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQotCQlydW4oImlucHV0LnhtbCIsIG5ldyBTdHJpbmdbXXsiLWlucHV0aGFuZGxlciIsICJvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS5zdXBwb3J0LmlucHV0SGFuZGxlcnMuQW50VGVzdElucHV0SGFuZGxlciJ9KTsKLQkJYXNzZXJ0U3VjY2Vzc2Z1bCgpOwotCQlTdHJpbmcgbXNnPSAoU3RyaW5nKUFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRNZXNzYWdlcygpLmdldCgxKTsKLQkJYXNzZXJ0VHJ1ZSgiTWVzc2FnZSBpbmNvcnJlY3Q6ICIgKyBtc2csIG1zZy5lcXVhbHMoInRlc3RpbmcgaGFuZGxpbmcgaW5wdXQgcmVxdWVzdHMiKSk7Ci0JCQotCX0KLQkKLQkvKioKLQkgKiBUZXN0cyB0aGUgIi1kaWFnbm9zdGljcyIgb3B0aW9uIHdpdGggbm8gQU5UX0hPTUUgc2V0Ci0JICogYnVnIDI1NjkzCi0JICovCi0JcHVibGljIHZvaWQgdGVzdERpYWdub3N0aWNzV2l0aE5vQW50SG9tZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCi0JCXJ1bigiaW5wdXQueG1sIiwgbmV3IFN0cmluZ1tdeyItZGlhZ25vc3RpY3MifSk7Ci0JCVN0cmluZyBtc2c9IChTdHJpbmcpQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldE1lc3NhZ2VzKCkuZ2V0KDApOwotCQlhc3NlcnRUcnVlKCJNZXNzYWdlIGluY29ycmVjdDogIiArIG1zZywgbXNnLmVxdWFscygiLS0tLS0tLSBBbnQgZGlhZ25vc3RpY3MgcmVwb3J0IC0tLS0tLS0iKSk7Ci0JfQotCQkKLQkvKioKLQkgKiBUZXN0cyB0aGUgIi1kaWFnbm9zdGljcyIgb3B0aW9uIHdpdGggQU5UX0hPTUUgc2V0Ci0JICogYnVnIDI1NjkzCi0JICovCi0JcHVibGljIHZvaWQgdGVzdERpYWdub3N0aWNzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlBbnRDb3JlUGx1Z2luLmdldFBsdWdpbigpLmdldFByZWZlcmVuY2VzKCkuc2V0QW50SG9tZShnZXRBbnRIb21lKCkpOwotCQl0cnkgewotCQkJcnVuKCJpbnB1dC54bWwiLCBuZXcgU3RyaW5nW117Ii1kaWFnbm9zdGljcyJ9KTsKLQkJfSBmaW5hbGx5IHsKLQkJCXJlc3RvcmVQcmVmZXJlbmNlRGVmYXVsdHMoKTsKLQkJfQotCQkKLQkJU3RyaW5nIG1zZz0gKFN0cmluZylBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0TWVzc2FnZXMoKS5nZXQoMTIpOwotCQkvL21zZyBkZXBlbmRzIG9uIHdoZXRoZXIgc2VsZiBob3N0aW5nIHRlc3Rpbmcgb3IgYnVpbGQgdGVzdGluZwotCQlhc3NlcnRUcnVlKCJNZXNzYWdlIGluY29ycmVjdDogIiArIG1zZywgbXNnLmVuZHNXaXRoKCJvcmcuYXBhY2hlLmFudCIpIHx8IG1zZy5lbmRzV2l0aCgib3JnLmFwYWNoZS5hbnRfMS41LjMiKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3Rlc3RzL1Byb2plY3RUZXN0cy5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3Rlc3RzL1Byb2plY3RUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjI1Y2U4Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS90ZXN0cy9Qcm9qZWN0VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUudGVzdHM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLkFic3RyYWN0QW50VGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS50ZXN0cGx1Z2luLkFudFRlc3RDaGVja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBQcm9qZWN0VGVzdHMgZXh0ZW5kcyBBYnN0cmFjdEFudFRlc3QgewotCQotCXB1YmxpYyBQcm9qZWN0VGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCS8qKgotCSAqIFRlc3RzIHRoYXQgdGhlIHRocmVlIHByb3BlcnRpZXMgdGhhdCBzaG91bGQgYWx3YXlzIGJlIHNldCBhcmUgY29ycmVjdAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RCYXNlUHJvcGVydGllc1NldCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGJ1aWxkRmlsZU5hbWU9IlRlc3RGb3JFY2hvLnhtbCI7IAotCQlydW4oYnVpbGRGaWxlTmFtZSk7Ci0JCUlGaWxlIGJ1aWxkRmlsZT0gZ2V0QnVpbGRGaWxlKGJ1aWxkRmlsZU5hbWUpOwotCQlTdHJpbmcgZnVsbE5hbWU9IGJ1aWxkRmlsZS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpLmdldEFic29sdXRlUGF0aCgpOwotCQlhc3NlcnRUcnVlKCJlY2xpcHNlLnJ1bm5pbmcgc2hvdWxkIGhhdmUgYmVlbiBzZXQgYXMgdHJ1ZSIsICJ0cnVlIi5lcXVhbHMoQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldFVzZXJQcm9wZXJ0eSgiZWNsaXBzZS5ydW5uaW5nIikpKTsKLQkJYXNzZXJ0VHJ1ZSgiYW50LmZpbGUgc2hvdWxkIGhhdmUgYmVlbiBzZXQgYXMgdGhlIGJ1aWxkIGZpbGUgbmFtZSIsIGZ1bGxOYW1lLmVxdWFscyhBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0VXNlclByb3BlcnR5KCJhbnQuZmlsZSIpKSk7Ci0JCWFzc2VydE5vdE51bGwoImFudC52ZXJzaW9uIHNob3VsZCBoYXZlIGJlZW4gc2V0IiwgQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldFVzZXJQcm9wZXJ0eSgiYW50LnZlcnNpb24iKSk7Ci0JfQotfQotCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvdGVzdHMvVGFyZ2V0VGVzdHMuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS90ZXN0cy9UYXJnZXRUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWRlMDQ0Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS90ZXN0cy9UYXJnZXRUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS50ZXN0czsKLQotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmNvcmUuVGFyZ2V0SW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS5BYnN0cmFjdEFudFRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUudGVzdHBsdWdpbi5BbnRUZXN0Q2hlY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgVGFyZ2V0VGVzdHMgZXh0ZW5kcyBBYnN0cmFjdEFudFRlc3QgewotCQotCXB1YmxpYyBUYXJnZXRUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JLyoqCi0JICogRW5zdXJlcyB0aGF0IGEgZGVmYXVsdCB0YXJnZXQgaXMgZm91bmQKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFRhcmdldCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJVGFyZ2V0SW5mb1tdIHRhcmdldHM9IGdldFRhcmdldHMoIlRlc3RGb3JFY2hvLnhtbCIpOwotCQlhc3NlcnRUcnVlKCJTaG91bGQgYmUgdHdvIHRhcmdldHMgaW4gVGVzdEZvckVjaG8ueG1sIiwgdGFyZ2V0cy5sZW5ndGggPT0gMik7Ci0JCWFzc2VydFRydWUoIlRlc3QgZm9yIEVjaG8gc2hvdWxkIGJlIHRoZSBkZWZhdWx0IHRhcmdldCIsIHRhcmdldHNbMV0uaXNEZWZhdWx0KCkpOwotCX0KLQkKLQkvKioKLQkgKiBFbnN1cmVzIHRoYXQgdGFyZ2V0cyBhcmUgZm91bmQgaW4gYSBidWlsZCBmaWxlIHdpdGggZGF0YSB0eXBlcwotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RHZXRUYXJnZXRzV2l0aERhdGFUeXBlcygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJVGFyZ2V0SW5mb1tdIHRhcmdldHM9IGdldFRhcmdldHMoIkJ1ZzMyNTUxLnhtbCIpOwotCQlhc3NlcnRUcnVlKCJTaG91bGQgYmUgb25lIHRhcmdldHMgaW4gQnVnMzI1NTEueG1sIiwgdGFyZ2V0cy5sZW5ndGggPT0gMSk7Ci0JfQotCQotCS8qKgotCSAqIEVuc3VyZXMgdGhhdCB0YXJnZXQgbmFtZXMgYXJlIHJldHJpZXZlZCBwcm9wZXJseQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RUYXJnZXROYW1lcygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJU3RyaW5nW10gdGFyZ2V0TmFtZXM9IGdldFRhcmdldE5hbWVzKCJUZXN0Rm9yRWNoby54bWwiKTsKLQkJYXNzZXJ0VHJ1ZSgiU2hvdWxkIGJlIHR3byB0YXJnZXRzIGluIFRlc3RGb3JFY2hvLnhtbCIsIHRhcmdldE5hbWVzLmxlbmd0aCA9PSAyKTsKLQkJYXNzZXJ0VHJ1ZSgiRmlyc3QgbmFtZSBzaG91bGQgYmUgaW5pdCIsIHRhcmdldE5hbWVzWzBdLmVxdWFscygiaW5pdCIpKTsKLQkJYXNzZXJ0VHJ1ZSgiU2Vjb25kIG5hbWUgc2hvdWxkIGJlIFRlc3QgZm9yIEVjaG8iLCB0YXJnZXROYW1lc1sxXS5lcXVhbHMoIlRlc3QgZm9yIEVjaG8iKSk7Ci0JfQotCQotCS8qKgotCSAqIEVuc3VyZXMgdGhhdCB0YXJnZXQgZGVzY3JpcHRpb25zIGFyZSByZXRyaWV2ZWQgcHJvcGVybHkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0VGFyZ2V0RGVzY3JpcHRpb24oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZ1tdIHRhcmdldERlc2NyaXB0aW9ucz0gZ2V0VGFyZ2V0RGVzY3JpcHRpb25zKCJUZXN0Rm9yRWNoby54bWwiKTsKLQkJYXNzZXJ0VHJ1ZSgiU2hvdWxkIGJlIHR3byB0YXJnZXRzIGluIFRlc3RGb3JFY2hvLnhtbCIsIHRhcmdldERlc2NyaXB0aW9ucy5sZW5ndGggPT0gMik7Ci0JCWFzc2VydE51bGwoIkZpcnN0IGRlc2NyaXB0aW9uIHNob3VsZCBiZSBudWxsIiwgdGFyZ2V0RGVzY3JpcHRpb25zWzBdKTsKLQkJYXNzZXJ0VHJ1ZSgiU2Vjb25kIGRlc2NyaXB0aW9uIHNob3VsZCBiZSBDYWxscyBvdGhlciB0YXJnZXRzIiwgdGFyZ2V0RGVzY3JpcHRpb25zWzFdLmVxdWFscygiQ2FsbHMgb3RoZXIgZWNob3MiKSk7Ci0JfQotCQotCS8qKgotCSAqIEVuc3VyZXMgdGhhdCB0YXJnZXQgcHJvamVjdHMgYXJlIHJldHJpZXZlZCBwcm9wZXJseQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RUYXJnZXRQcm9qZWN0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTdHJpbmcgdGFyZ2V0UHJvamVjdD0gZ2V0UHJvamVjdE5hbWUoIlRlc3RGb3JFY2hvLnhtbCIsICJUZXN0IGZvciBFY2hvIik7Ci0JCWFzc2VydFRydWUoIlByb2plY3QgbmFtZSBzaG91bGQgYmUgRWNobyBUZXN0IiwgIkVjaG8gVGVzdCIuZXF1YWxzKHRhcmdldFByb2plY3QpKTsKLQl9Ci0JCi0JLyoqCi0JICogRW5zdXJlcyB0aGF0IHRhcmdldCBkZXBlbmRlbmNpZXMgYXJlIHJldHJpZXZlZCBwcm9wZXJseQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RUYXJnZXREZXBlbmRlbmNpZXMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZ1tdIGRlcGVuZGVuY2llcz0gZ2V0RGVwZW5kZW5jaWVzKCJUZXN0Rm9yRWNoby54bWwiLCAiVGVzdCBmb3IgRWNobyIpOwotCQlhc3NlcnROb3ROdWxsKCJEZXBlbmRlbmNpZXMgc2hvdWxkIG5vdCBiZSBudWxsIiwgZGVwZW5kZW5jaWVzKTsKLQkJYXNzZXJ0VHJ1ZSgiU2hvdWxkIGJlIG9uZSBkZXBlbmRlbmN5IGluIFRlc3QgZm9yIEVjaG8iLCBkZXBlbmRlbmNpZXMubGVuZ3RoID09IDEpOwotCQlhc3NlcnRUcnVlKCJGaXJzdCBkZXBlbmRlbmN5IHNob3VsZCBiZSBpbml0IiwgImluaXQiLmVxdWFscyhkZXBlbmRlbmNpZXNbMF0pKTsKLQl9Ci0JCi0JLyoqCi0JICogUnVucyBhbiBBbnQgYnVpbGQgYW5kIGVuc3VyZSB0aGF0IHRoZSBidWlsZCBmaWxlIGxvY2F0aW9uIGlzIGxvZ2dlZAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RSdW5TY3JpcHQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJ1bigiVGVzdEZvckVjaG8ueG1sIik7Ci0JCVN0cmluZyBtZXNzYWdlPSAoU3RyaW5nKUFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRNZXNzYWdlcygpLmdldCgwKTsKLQkJYXNzZXJ0VHJ1ZSgiQnVpbGQgZmlsZSBsb2NhdGlvbiBzaG91bGQgYmUgbG9nZ2VkIGFzIHRoZSBmaXJzdCBtZXNzYWdlIiwgbWVzc2FnZSAhPSBudWxsICYmIG1lc3NhZ2UuZW5kc1dpdGgoIkFudFRlc3RzIiArIEZpbGUuc2VwYXJhdG9yICsgImJ1aWxkZmlsZXMiICsgRmlsZS5zZXBhcmF0b3IgKyAiVGVzdEZvckVjaG8ueG1sIikpOwotCQlhc3NlcnRTdWNjZXNzZnVsKCk7Ci0JfQotfQotCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvdGVzdHMvVGFza1Rlc3RzLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvdGVzdHMvVGFza1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmMzcwY2QuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3Rlc3RzL1Rhc2tUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUudGVzdHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5jb3JlLkFudENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmNvcmUuQW50Q29yZVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5jb3JlLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5jb3JlLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUuQWJzdHJhY3RBbnRUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLnRlc3RwbHVnaW4uQW50VGVzdENoZWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBUYXNrVGVzdHMgZXh0ZW5kcyBBYnN0cmFjdEFudFRlc3QgewotCi0JCi0JcHVibGljIFRhc2tUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZFRhc2soKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJQW50Q29yZVByZWZlcmVuY2VzIHByZWZzID1BbnRDb3JlUGx1Z2luLmdldFBsdWdpbigpLmdldFByZWZlcmVuY2VzKCk7Ci0JCVRhc2sgbmV3VGFzaz0gbmV3IFRhc2soKTsKLQkJU3RyaW5nIHBhdGg9IGdldFByb2plY3QoKS5nZXRGb2xkZXIoImxpYiIpLmdldEZpbGUoImFudFRlc3RzU3VwcG9ydC5qYXIiKS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpLmdldEFic29sdXRlUGF0aCgpOwotCQlVUkwgdXJsPSBuZXcgVVJMKCJmaWxlOiIgKyBwYXRoKTsKLQkJVVJMIHVybHNbXSA9IHByZWZzLmdldEN1c3RvbVVSTHMoKTsKLQkJVVJMIG5ld1VybHNbXSA9IG5ldyBVUkxbdXJscy5sZW5ndGggKyAxXTsKLQkJU3lzdGVtLmFycmF5Y29weSh1cmxzLCAwLCBuZXdVcmxzLCAwLCB1cmxzLmxlbmd0aCk7Ci0JCW5ld1VybHNbdXJscy5sZW5ndGhdID0gdXJsOwotCQlwcmVmcy5zZXRDdXN0b21VUkxzKG5ld1VybHMpOwotCQkKLQkJbmV3VGFzay5zZXRMaWJyYXJ5KHVybCk7Ci0JCW5ld1Rhc2suc2V0VGFza05hbWUoIkFudFRlc3RUYXNrIik7Ci0JCW5ld1Rhc2suc2V0Q2xhc3NOYW1lKCJvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS5zdXBwb3J0LnRhc2tzLkFudFRlc3RUYXNrIik7Ci0JCXByZWZzLnNldEN1c3RvbVRhc2tzKG5ldyBUYXNrW117bmV3VGFza30pOwotCQkKLQkJcHJlZnMudXBkYXRlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJCi0JCXJ1bigiQ3VzdG9tVGFzay54bWwiKTsKLQkJU3RyaW5nIG1zZz0gKFN0cmluZylBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0TWVzc2FnZXMoKS5nZXQoMSk7Ci0JCWFzc2VydFRydWUoIk1lc3NhZ2UgaW5jb3JyZWN0OiAiICsgbXNnLCBtc2cuZXF1YWxzKCJUZXN0aW5nIEFudCBpbiBFY2xpcHNlIHdpdGggYSBjdXN0b20gdGFzayIpKTsKLQkJYXNzZXJ0U3VjY2Vzc2Z1bCgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlVGFzaygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJQW50Q29yZVByZWZlcmVuY2VzIHByZWZzID1BbnRDb3JlUGx1Z2luLmdldFBsdWdpbigpLmdldFByZWZlcmVuY2VzKCk7Ci0JCXByZWZzLnNldEN1c3RvbVRhc2tzKG5ldyBUYXNrW117fSk7Ci0JCXRyeSB7Ci0JCQlydW4oIkN1c3RvbVRhc2sueG1sIik7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCWFzc2VydFRydWUoIkV4Y2VwdGlvbiBmcm9tIHVuZGVmaW5lZCB0YXNrIGlzIGluY29ycmVjdCIsIGNlLmdldE1lc3NhZ2UoKS5lbmRzV2l0aCgiYXMgdGhpcyBpcyBub3QgYW4gQW50IGJ1Zy4iKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiQnVpbGQgc2hvdWxkIGhhdmUgZmFpbGVkIGFzIHRhc2sgbm8gbG9uZ2VyIGRlZmluZWQiLCBmYWxzZSk7Ci0JCXJlc3RvcmVQcmVmZXJlbmNlRGVmYXVsdHMoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZFRhc2tGcm9tRm9sZGVyKCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlBbnRDb3JlUHJlZmVyZW5jZXMgcHJlZnMgPUFudENvcmVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0UHJlZmVyZW5jZXMoKTsKLQkJCVRhc2sgbmV3VGFzaz0gbmV3IFRhc2soKTsKLQkJCVN0cmluZyBwYXRoPSBnZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKCJsaWIiKS5nZXRGaWxlKCJ0YXNrRm9sZGVyIikuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCVVSTCB1cmw9IG5ldyBVUkwoImZpbGU6IiArIHBhdGggKyBGaWxlLnNlcGFyYXRvckNoYXIpOwotCQkJVVJMIHVybHNbXSA9IHByZWZzLmdldEN1c3RvbVVSTHMoKTsKLQkJCVVSTCBuZXdVcmxzW10gPSBuZXcgVVJMW3VybHMubGVuZ3RoICsgMV07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHVybHMsIDAsIG5ld1VybHMsIDAsIHVybHMubGVuZ3RoKTsKLQkJCW5ld1VybHNbdXJscy5sZW5ndGhdID0gdXJsOwotCQkJcHJlZnMuc2V0Q3VzdG9tVVJMcyhuZXdVcmxzKTsKLQkJCi0JCQluZXdUYXNrLnNldExpYnJhcnkodXJsKTsKLQkJCW5ld1Rhc2suc2V0VGFza05hbWUoIkFudFRlc3RUYXNrIik7Ci0JCQluZXdUYXNrLnNldENsYXNzTmFtZSgib3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUuc3VwcG9ydC50YXNrcy5BbnRUZXN0VGFzazIiKTsKLQkJCXByZWZzLnNldEN1c3RvbVRhc2tzKG5ldyBUYXNrW117bmV3VGFza30pOwotCQkKLQkJCXByZWZzLnVwZGF0ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCQotCQkJcnVuKCJDdXN0b21UYXNrLnhtbCIpOwotCQkJU3RyaW5nIG1zZz0gKFN0cmluZylBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0TWVzc2FnZXMoKS5nZXQoMSk7Ci0JCQlhc3NlcnRUcnVlKCJNZXNzYWdlIGluY29ycmVjdDogIiArIG1zZywgbXNnLmVxdWFscygiVGVzdGluZyBBbnQgaW4gRWNsaXBzZSB3aXRoIGEgY3VzdG9tIHRhc2siKSk7Ci0JCQlhc3NlcnRTdWNjZXNzZnVsKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlyZXN0b3JlUHJlZmVyZW5jZURlZmF1bHRzKCk7Ci0JCX0KLQl9Ci0JCQotCXB1YmxpYyB2b2lkIHRlc3RUYXNrc0RlZmluZWRJblByb3BlcnR5RmlsZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCUFudENvcmVQcmVmZXJlbmNlcyBwcmVmcyA9QW50Q29yZVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRQcmVmZXJlbmNlcygpOwotCQkJUHJvcGVydHkgbmV3UHJvcD0gbmV3IFByb3BlcnR5KCJST09URElSIiwgIi4uLy9yZXNvdXJjZXMiKTsKLQkJCXByZWZzLnNldEN1c3RvbVByb3BlcnRpZXMobmV3IFByb3BlcnR5W117bmV3UHJvcH0pOwotCQkJcnVuKCJCdWczNDY2My54bWwiKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXJlc3RvcmVQcmVmZXJlbmNlRGVmYXVsdHMoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS90ZXN0cy9UeXBlVGVzdHMuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS90ZXN0cy9UeXBlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTAyOTcwNS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvdGVzdHMvVHlwZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLnRlc3RzOwotCi0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmNvcmUuQW50Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS5BbnRDb3JlUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmNvcmUuVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS5BYnN0cmFjdEFudFRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUudGVzdHBsdWdpbi5BbnRUZXN0Q2hlY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIFR5cGVUZXN0cyBleHRlbmRzIEFic3RyYWN0QW50VGVzdCB7Ci0KLQlwdWJsaWMgVHlwZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRUeXBlKCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCUFudENvcmVQcmVmZXJlbmNlcyBwcmVmcyA9QW50Q29yZVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRQcmVmZXJlbmNlcygpOwotCQlUeXBlIG5ld1R5cGU9IG5ldyBUeXBlKCk7Ci0JCVN0cmluZyBwYXRoPSBnZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKCJsaWIiKS5nZXRGaWxlKCJhbnRUZXN0c1N1cHBvcnQuamFyIikuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJVVJMIHVybD0gbmV3IFVSTCgiZmlsZToiICsgcGF0aCk7Ci0JCW5ld1R5cGUuc2V0TGlicmFyeSh1cmwpOwotCQluZXdUeXBlLnNldFR5cGVOYW1lKCJhbnR0ZXN0cGF0aCIpOwotCQluZXdUeXBlLnNldENsYXNzTmFtZSgib3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUuc3VwcG9ydC50eXBlcy5BbnRUZXN0UGF0aCIpOwotCQlwcmVmcy5zZXRDdXN0b21UeXBlcyhuZXcgVHlwZVtde25ld1R5cGV9KTsKLQkJCi0JCXJ1bigiQ3VzdG9tVHlwZS54bWwiKTsKLQkJU3RyaW5nIG1zZz0gKFN0cmluZylBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0TWVzc2FnZXMoKS5nZXQoMSk7Ci0JCWFzc2VydFRydWUoIk1lc3NhZ2UgaW5jb3JyZWN0OiAiICsgbXNnLCBtc2cuZXF1YWxzKCJUZXN0IGFkZGluZyBhIGN1c3RvbSB0eXBlIikpOwotCQlhc3NlcnRTdWNjZXNzZnVsKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVUeXBlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlBbnRDb3JlUHJlZmVyZW5jZXMgcHJlZnMgPUFudENvcmVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0UHJlZmVyZW5jZXMoKTsKLQkJcHJlZnMuc2V0Q3VzdG9tVHlwZXMobmV3IFR5cGVbXXt9KTsKLQkJdHJ5IHsKLQkJCXJ1bigiQ3VzdG9tVHlwZS54bWwiKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJYXNzZXJ0VHJ1ZSgiRXhjZXB0aW9uIGZyb20gdW5kZWZpbmVkIHR5cGUgaXMgaW5jb3JyZWN0IiwgY2UuZ2V0TWVzc2FnZSgpLmVuZHNXaXRoKCJVbmV4cGVjdGVkIGVsZW1lbnQgXCJhbnR0ZXN0cGF0aFwiIikpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWFzc2VydFRydWUoIkJ1aWxkIHNob3VsZCBoYXZlIGZhaWxlZCBhcyB0eXBlIG5vIGxvbmdlciBkZWZpbmVkIiwgZmFsc2UpOwotCQlyZXN0b3JlUHJlZmVyZW5jZURlZmF1bHRzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS8uY2xhc3NwYXRoIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWIzZDA5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLyIvPg0KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBvdXRwdXQ9IndlYmFwcC9XRUItSU5GL2NsYXNzZXMiIHBhdGg9InNyY193ZWJhcHAiLz4NCi0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iL29yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPg0KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSIvb3JnLmVjbGlwc2UudWkiLz4NCi0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlIi8+DQotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Ii9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMiLz4NCi0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzIi8+DQotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Ii9vcmcuYXBhY2hlLnhlcmNlcyIvPg0KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSIvb3JnLmVjbGlwc2UuaGVscC5hcHBzZXJ2ZXIiLz4NCi0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iL29yZy5lY2xpcHNlLmhlbHAiLz4NCi0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iL29yZy5lY2xpcHNlLmNvcmUuYm9vdCIvPg0KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4NCi0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImxpYiIgcGF0aD0iL29yZy5lY2xpcHNlLnRvbWNhdC9zZXJ2bGV0LmphciIgc291cmNlcGF0aD0iL29yZy5lY2xpcHNlLnBsYXRmb3JtLnNvdXJjZS9zcmMvb3JnLmVjbGlwc2UudG9tY2F0XzQuMC42L3RvbWNhdHdyYXBwZXJzcmMuemlwIi8+DQotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvLmN2c2lnbm9yZSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEwNzdhNC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvLnByb2plY3QgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODY5ZGFjLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLnVwZGF0ZS51aTwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCQk8cHJvamVjdD5vcmcuYXBhY2hlLnhlcmNlczwvcHJvamVjdD4NCi0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmNvcmUuYm9vdDwvcHJvamVjdD4NCi0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzPC9wcm9qZWN0Pg0KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuY29yZS5ydW50aW1lPC9wcm9qZWN0Pg0KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuaGVscDwvcHJvamVjdD4NCi0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmhlbHAuYXBwc2VydmVyPC9wcm9qZWN0Pg0KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UudWk8L3Byb2plY3Q+DQotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS51cGRhdGUuY29yZTwvcHJvamVjdD4NCi0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3JtczwvcHJvamVjdD4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQk8L2J1aWxkU3BlYz4NCi0JPG5hdHVyZXM+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQk8L25hdHVyZXM+DQotPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9HcmFwaGljc191cGRhdGUuaHRtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvR3JhcGhpY3NfdXBkYXRlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYWUxYTMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9HcmFwaGljc191cGRhdGUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDk1NSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDExMClodHRwOi8vZGVzaWduLnRvcm9sYWIuaWJtLmNvbS9haW0vV1NXQi1lY2xpcHNlLzEwMjBfUERFL2ltcGxlbWVudGF0aW9uX2ljb25zL29yZy5lY2xpcHNlLnBkZS9HcmFwaGljc19wZGUuaHRtbCAtLT4KLTxIVE1MPjxIRUFEPjxUSVRMRT5ncmFwaGljczwvVElUTEU+Ci08TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TUVUQSBjb250ZW50PSJHcmVnIEFkYW1zIiBuYW1lPUF1dGhvcj4KLTxNRVRBIGNvbnRlbnQ9Ik1pY3Jvc29mdCBGcm9udFBhZ2UgNC4wIiBuYW1lPUdFTkVSQVRPUj48L0hFQUQ+Ci08Qk9EWSBiZ0NvbG9yPXdoaXRlPgotPEgyPm9yZy5lY2xpcHNlLnVwZGF0ZS51aSAtIEdyYXBoaWNzIFN1bW1hcnk8L0gyPjxGT05UIHNpemU9LTE+PFNUUk9ORz5Db21wZXRlbmN5IAotbGVhZDogPC9TVFJPTkc+VmxhZCBLbGljbmlrIC8gVE9MIDxCUj48U1RST05HPlRlY2huaWNhbCBsZWFkOiA8L1NUUk9ORz5EZWphbiAKLUdsb3ppYyAvIFRPTCA8QlI+PFNUUk9ORz5VQ0QgZGVzaWduZXI6IDwvU1RST05HPkp1bGlhbiBKb25lcyAvIFRPTCAKLTxCUj48U1RST05HPlVJIGRlc2lnbmVyOiA8L1NUUk9ORz5BbmRy6WUgUHJvdWx4IC8gVE9MIDxCUj48U1RST05HPklEIHdyaXRlcjogCi08L1NUUk9ORz4tPC9GT05UPiAKLTxIUiB3aWR0aD0iMTAwJSIgU0laRT0xPgotPEI+PEZPTlQgc2l6ZT0tMT5IaXN0b3J5OjwvRk9OVD48L0I+IAotPHA+PGZvbnQgc2l6ZT0iLTEiPkFwcmlsIDE5LCAyMDAyIDogVGVtcGxhdGUgU3VibWlzc2lvbjwvZm9udD48L3A+Ci08SFIgd2lkdGg9IjEwMCUiIFNJWkU9MT4KLTwhLS0tIFN0YXJ0IEhlcmUgLS0tPgotPFRBQkxFIGNlbGxTcGFjaW5nPTAgY2VsbFBhZGRpbmc9MyB3aWR0aD0iMTAwJSIgYm9yZGVyPTAgaGVpZ2h0PSIzMTQ3Ij4KLSAgCi0gIDxUUiBiZ0NvbG9yPSNiZmJmN2Y+Ci0gICAgPFREIGNvbFNwYW49Nz48Qj48Rk9OVCBzaXplPSsyPlZpZXc8L0ZPTlQ+PC9CPjwvVEQ+PC9UUj4KLSAgPFRSIGJnQ29sb3I9I2RmZGY5Zj4KLSAgICA8VEQ+Jm5ic3A7PC9URD4KLSAgICA8VEQ+PEI+PEZPTlQgc2l6ZT0tMT5JdGVtPC9GT05UPjwvQj48L1REPgotICAgIDxURD48Qj48Rk9OVCBzaXplPS0xPkZpbGUgTmFtZSZuYnNwOyAoLmdpZik8L0ZPTlQ+PC9CPjwvVEQ+Ci0gICAgPFREPjxCPjxGT05UIHNpemU9LTE+RGVzY3JpcHRpb24vSG9vdmVyIEhlbHA8L0ZPTlQ+PC9CPjwvVEQ+Ci0gICAgPFREPgotICAgICAgPENFTlRFUj48Qj48Rk9OVCBzaXplPS0xPk9sZDwvRk9OVD48L0I+IDwvQ0VOVEVSPjwvVEQ+Ci0gICAgPFREPgotICAgICAgPENFTlRFUj48Qj48Rk9OVCBzaXplPS0xPk5ldyBGdWxsPC9GT05UPjwvQj4gPC9DRU5URVI+PC9URD4KLSAgICA8VEQ+PEI+PEZPTlQgc2l6ZT0tMT5TdGF0dXM8L0ZPTlQ+PC9CPjwvVEQ+PC9UUj4KLSAgPFRSIGJnQ29sb3I9I2ZmZmZmZj4KLSAgICA8VEQ+MTwvVEQ+Ci0gICAgPFREPkNvbmZpZ3VyYXRpb25zPC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT5jb25maWdzPC9GT05UPjwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+IHNob3dzIHRoZSBjb25maWd1cmF0aW9ucyBvZiB0aGUgRWNsaXBzZS1iYXNlZCBhcHBsaWNhdGlvbjwvRk9OVD48L1REPgotICAgIDxURD48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL3ZpZXcxNi9jb25maWdzLmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+PC9URD4KLSAgICA8VEQ+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL2N2aWV3MTYvY29uZmlncy5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiZuYnNwOzxJTUcgaGVpZ2h0PTE2IAotICAgICAgYWx0PSIiIHNyYz0iaWNvbnMvZnVsbC9ldmlldzE2L2NvbmZpZ3MuZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4mbmJzcDs8L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPiA8L0ZPTlQ+PC9URD48L1RSPgotICA8VFIgYmdDb2xvcj0jZGZkZmI+Ci0gICAgPFREPjI8L1REPgotICAgIDxURD5VcGRhdGVzPC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT51cGRhdGVzPC9GT05UPjwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+c2hvd3Mgc2l0ZXMgYW4gRWNsaXBzZSBhcHAgY2FuIGJlIHVwZGF0ZWQgZnJvbTwvRk9OVD48L1REPgotICAgIDxURD48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL3ZpZXcxNi91cGRhdGVzLmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+PC9URD4KLSAgICA8VEQ+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL2N2aWV3MTYvdXBkYXRlcy5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiZuYnNwOzxJTUcgaGVpZ2h0PTE2IAotICAgICAgYWx0PSIiIHNyYz0iaWNvbnMvZnVsbC9ldmlldzE2L3VwZGF0ZXMuZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4mbmJzcDs8L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPiA8L0ZPTlQ+PC9URD48L1RSPgotICA8VFIgYmdDb2xvcj0jZmZmZmZmPgotICAgIDxURD4zPC9URD4KLSAgICA8VEQ+UHJldmlldzwvVEQ+Ci0gICAgPFREPjxmb250IHNpemU9Ii0xIj5wcmV2aWV3PC9mb250PjwvVEQ+Ci0gICAgPFREPjxmb250IHNpemU9Ii0xIj5zaG93cyBkZXRhaWxzIG9mIHRoZSBzZWxlY3RlZCBvYmplY3Q8L2ZvbnQ+PC9URD4KLSAgICA8VEQ+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC92aWV3MTYvcHJldmlldy5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPjwvVEQ+Ci0gICAgPFREPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9jdmlldzE2L3ByZXZpZXcuZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4mbmJzcDs8SU1HIGhlaWdodD0xNiAKLSAgICAgIGFsdD0iIiBzcmM9Imljb25zL2Z1bGwvZXZpZXcxNi9wcmV2aWV3LmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Jm5ic3A7PC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4gPC9GT05UPjwvVEQ+PC9UUj4KLSAgPFRSIGJnQ29sb3I9I2RmZGZiPgotICAgIDxURD40PC9URD4KLSAgICA8VEQ+V2ViIEJyb3dzZXI8L1REPgotICAgIDxURD48Zm9udCBzaXplPSItMSI+YnJvd3NlcjwvZm9udD48L1REPgotICAgIDxURD48Zm9udCBzaXplPSItMSI+YSBmdWxseS1mdW5jdGlvbmluZyBXZWIgYnJvd3NlciAoaG9zdHMgSUU1IC0gV2luZG93cyBvbmx5KTwvZm9udD48L1REPgotICAgIDxURD48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL3ZpZXcxNi9icm93c2VyLmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+PC9URD4KLSAgICA8VEQ+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL2N2aWV3MTYvYnJvd3Nlci5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiZuYnNwOzxJTUcgaGVpZ2h0PTE2IAotICAgICAgYWx0PSIiIHNyYz0iaWNvbnMvZnVsbC9ldmlldzE2L2Jyb3dzZXIuZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4mbmJzcDs8L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPiA8L0ZPTlQ+PC9URD48L1RSPgotICAgPFRSIGJnQ29sb3I9I2ZmZmZmZj4KLSAgICA8VEQ+NTwvVEQ+Ci0gICAgPFREPlVwZGF0ZSBQZXJzcGVjdGl2ZTwvVEQ+Ci0gICAgPFREPjxmb250IHNpemU9Ii0xIj51cGRhdGVfcGVyczwvZm9udD48L1REPgotICAgIDxURD48Zm9udCBzaXplPSItMSI+UmVwcmVzZW50cyBJbnN0YWxsL1VwZGF0ZQotICAgICAgcGVyc3BlY3RpdmUgaW4gdGhlIFVJPC9mb250PjwvVEQ+Ci0gICAgPFREPjwvVEQ+Ci0gICAgPFREPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9jdmlldzE2L3VwZGF0ZV9wZXJzLmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Jm5ic3A7PElNRyBoZWlnaHQ9MTYgCi0gICAgICBhbHQ9IiIgc3JjPSJpY29ucy9mdWxsL2V2aWV3MTYvdXBkYXRlX3BlcnMuZ2lmIiB3aWR0aD0xNiAKLWJvcmRlcj0wPiZuYnNwOzwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+IDwvRk9OVD48L1REPgotICA8L1RSPgotICAKLSAgPFRSIGJnQ29sb3I9I2JmYmY3Zj4KLSAgICA8VEQgY29sU3Bhbj03PjxCPjxGT05UIHNpemU9KzI+VG9vbGJhciBXaXphcmQ8L0ZPTlQ+PC9CPjwvVEQ+PC9UUj4KLSAgPFRSIGJnQ29sb3I9I2ZmZmZmZj4KLSAgICA8VEQ+MTwvVEQ+Ci0gICAgPFREPiA8L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPiZuYnNwOzwvRk9OVD48L1REPgotICAgIDxURD4KLSAgICAgIDxUQUJMRSBjZWxsU3BhY2luZz0yIGNlbGxQYWRkaW5nPTAgd2lkdGg9IjEwMCUiIGJvcmRlcj0wPgotICAgICAgICAKLSAgICAgICAgPFRSPgotICAgICAgICAgIDxURCB2QWxpZ249dG9wPjxmb250IHNpemU9Ii0xIj4gICAgZGVzY3JpcHRpb248L2ZvbnQ+PC9URD4KLSAgICAgICAgICA8VEQgdkFsaWduPWNlbnRlciBhbGlnbj1yaWdodD4KLSAgICAgICAgICAgIDxUQUJMRT4KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIDxUUj4KLSAgICAgICAgICAgICAgICA8VEQgCi0gICAgICAgICAgICAgICAgc3R5bGU9IkJPUkRFUi1SSUdIVDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItVE9QOiBibGFjayAxcHggc29saWQ7IEJPUkRFUi1MRUZUOiBibGFjayAxcHggc29saWQ7IEJPUkRFUi1CT1RUT006IGJsYWNrIDFweCBzb2xpZCIgCi0gICAgICAgICAgICAgICAgYWxpZ249bWlkZGxlIGJnQ29sb3I9I2ZmZmZlMT48Rk9OVCAKLSAgICAgICAgICAgICAgICAgIHNpemU9LTI+Jm5ic3A7dG9vbCB0aXAmbmJzcDs8L0ZPTlQ+PC9URD48L1RSPjwvVEFCTEU+PC9URD48L1RSPjwvVEFCTEU+PC9URD4KLSAgICA8VEQ+PC9URD4KLSAgICA8VEQgYmdDb2xvcj0jY2NjY2NjPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9jdG9vbDE2L2NvbmZpZ193aXouZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4mbmJzcDs8SU1HIAotICAgICAgaGVpZ2h0PTE2IGFsdD0iIiBzcmM9Imljb25zL2Z1bGwvZXRvb2wxNi9jb25maWdfd2l6LmdpZiIgd2lkdGg9MTYgCi0gICAgICBib3JkZXI9MD4mbmJzcDs8SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvZHRvb2wxNi9jb25maWdfd2l6LmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Jm5ic3A7PC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4gPC9GT05UPjwvVEQ+PC9UUj4KLQkKLSAgPFRSIGJnQ29sb3I9I2RmZGY5Zj4KLSAgICA8VEQ+MjwvVEQ+Ci0gICAgPFREPiA8L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPjwvRk9OVD48L1REPgotICAgIDxURD4KLSAgICAgIDxUQUJMRSBjZWxsU3BhY2luZz0yIGNlbGxQYWRkaW5nPTAgd2lkdGg9IjEwMCUiIGJvcmRlcj0wPgotICAgICAgICAKLSAgICAgICAgPFRSPgotICAgICAgICAgIDxURCB2QWxpZ249dG9wPjxmb250IHNpemU9Ii0xIj4gICAgZGVzY3JpcHRpb248L2ZvbnQ+PC9URD4KLSAgICAgICAgICA8VEQgdkFsaWduPWNlbnRlciBhbGlnbj1yaWdodD4KLSAgICAgICAgICAgIDxUQUJMRT4KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIDxUUj4KLSAgICAgICAgICAgICAgICA8VEQgCi0gICAgICAgICAgICAgICAgc3R5bGU9IkJPUkRFUi1SSUdIVDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItVE9QOiBibGFjayAxcHggc29saWQ7IEJPUkRFUi1MRUZUOiBibGFjayAxcHggc29saWQ7IEJPUkRFUi1CT1RUT006IGJsYWNrIDFweCBzb2xpZCIgCi0gICAgICAgICAgICAgICAgYWxpZ249bWlkZGxlIGJnQ29sb3I9I2ZmZmZlMT48Rk9OVCAKLSAgICAgICAgICAgICAgICAgIHNpemU9LTI+Jm5ic3A7dG9vbCB0aXAmbmJzcDs8L0ZPTlQ+PC9URD48L1RSPjwvVEFCTEU+PC9URD48L1RSPjwvVEFCTEU+PC9URD4KLSAgICA8VEQ+PC9URD4KLSAgICA8VEQgYmdDb2xvcj0jY2NjY2NjPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9jdG9vbDE2L2luc3RhbGxfd2l6LmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Jm5ic3A7PElNRyAKLSAgICAgIGhlaWdodD0xNiBhbHQ9IiIgc3JjPSJpY29ucy9mdWxsL2V0b29sMTYvaW5zdGFsbF93aXouZ2lmIiB3aWR0aD0xNiAKLSAgICAgIGJvcmRlcj0wPiZuYnNwOzxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9kdG9vbDE2L2luc3RhbGxfd2l6LmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Jm5ic3A7PC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4gPC9GT05UPjwvVEQ+PC9UUj4KLSAgCi0gIDxUUiBiZ0NvbG9yPSNmZmZmZmY+Ci0gICAgPFREPjM8L1REPgotICAgIDxURD4gPC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4mbmJzcDs8L0ZPTlQ+PC9URD4KLSAgICA8VEQ+Ci0gICAgICA8VEFCTEUgY2VsbFNwYWNpbmc9MiBjZWxsUGFkZGluZz0wIHdpZHRoPSIxMDAlIiBib3JkZXI9MD4KLSAgICAgICAgCi0gICAgICAgIDxUUj4KLSAgICAgICAgICA8VEQgdkFsaWduPXRvcD48Zm9udCBzaXplPSItMSI+ICAgIGRlc2NyaXB0aW9uPC9mb250PjwvVEQ+Ci0gICAgICAgICAgPFREIHZBbGlnbj1jZW50ZXIgYWxpZ249cmlnaHQ+Ci0gICAgICAgICAgICA8VEFCTEU+Ci0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICA8VFI+Ci0gICAgICAgICAgICAgICAgPFREIAotICAgICAgICAgICAgICAgIHN0eWxlPSJCT1JERVItUklHSFQ6IGJsYWNrIDFweCBzb2xpZDsgQk9SREVSLVRPUDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItTEVGVDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItQk9UVE9NOiBibGFjayAxcHggc29saWQiIAotICAgICAgICAgICAgICAgIGFsaWduPW1pZGRsZSBiZ0NvbG9yPSNmZmZmZTE+PEZPTlQgCi0gICAgICAgICAgICAgICAgICBzaXplPS0yPiZuYnNwO3Rvb2wgdGlwJm5ic3A7PC9GT05UPjwvVEQ+PC9UUj48L1RBQkxFPjwvVEQ+PC9UUj48L1RBQkxFPjwvVEQ+Ci0gICAgPFREPjwvVEQ+Ci0gICAgPFREIGJnQ29sb3I9I2NjY2NjYz48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvY3Rvb2wxNi9uZXdfYm9va21hcmtfd2l6LmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Jm5ic3A7PElNRyAKLSAgICAgIGhlaWdodD0xNiBhbHQ9IiIgc3JjPSJpY29ucy9mdWxsL2V0b29sMTYvbmV3X2Jvb2ttYXJrX3dpei5naWYiIHdpZHRoPTE2IAotICAgICAgYm9yZGVyPTA+Jm5ic3A7PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL2R0b29sMTYvbmV3X2Jvb2ttYXJrX3dpei5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiZuYnNwOzwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+IDwvRk9OVD48L1REPjwvVFI+Ci0JCi0gIDxUUiBiZ0NvbG9yPSNkZmRmOWY+Ci0gICAgPFREPjQ8L1REPgotICAgIDxURD4gPC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4mbmJzcDs8L0ZPTlQ+PC9URD4KLSAgICA8VEQ+Ci0gICAgICA8VEFCTEUgY2VsbFNwYWNpbmc9MiBjZWxsUGFkZGluZz0wIHdpZHRoPSIxMDAlIiBib3JkZXI9MD4KLSAgICAgICAgCi0gICAgICAgIDxUUj4KLSAgICAgICAgICA8VEQgdkFsaWduPXRvcD48Zm9udCBzaXplPSItMSI+ICAgIGRlc2NyaXB0aW9uPC9mb250PjwvVEQ+Ci0gICAgICAgICAgPFREIHZBbGlnbj1jZW50ZXIgYWxpZ249cmlnaHQ+Ci0gICAgICAgICAgICA8VEFCTEU+Ci0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICA8VFI+Ci0gICAgICAgICAgICAgICAgPFREIAotICAgICAgICAgICAgICAgIHN0eWxlPSJCT1JERVItUklHSFQ6IGJsYWNrIDFweCBzb2xpZDsgQk9SREVSLVRPUDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItTEVGVDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItQk9UVE9NOiBibGFjayAxcHggc29saWQiIAotICAgICAgICAgICAgICAgIGFsaWduPW1pZGRsZSBiZ0NvbG9yPSNmZmZmZTE+PEZPTlQgCi0gICAgICAgICAgICAgICAgICBzaXplPS0yPiZuYnNwO3Rvb2wgdGlwJm5ic3A7PC9GT05UPjwvVEQ+PC9UUj48L1RBQkxFPjwvVEQ+PC9UUj48L1RBQkxFPjwvVEQ+Ci0gICAgPFREPjwvVEQ+Ci0gICAgPFREIGJnQ29sb3I9I2NjY2NjYz48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvY3Rvb2wxNi9uZXdfZm9sZGVyX3dpei5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiZuYnNwOzxJTUcgCi0gICAgICBoZWlnaHQ9MTYgYWx0PSIiIHNyYz0iaWNvbnMvZnVsbC9ldG9vbDE2L25ld19mb2xkZXJfd2l6LmdpZiIgd2lkdGg9MTYgCi0gICAgICBib3JkZXI9MD4mbmJzcDs8SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvZHRvb2wxNi9uZXdfZm9sZGVyX3dpei5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiZuYnNwOzwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+IDwvRk9OVD48L1REPjwvVFI+Ci0gIDxUUiBiZ0NvbG9yPSNmZmZmZmY+Ci0gICAgPFREPjU8L1REPgotICAgIDxURD4gPC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4mbmJzcDs8L0ZPTlQ+PC9URD4KLSAgICA8VEQ+Ci0gICAgICA8VEFCTEUgY2VsbFNwYWNpbmc9MiBjZWxsUGFkZGluZz0wIHdpZHRoPSIxMDAlIiBib3JkZXI9MD4KLSAgICAgICAgCi0gICAgICAgIDxUUj4KLSAgICAgICAgICA8VEQgdkFsaWduPXRvcD48Zm9udCBzaXplPSItMSI+ICAgIGRlc2NyaXB0aW9uPC9mb250PjwvVEQ+Ci0gICAgICAgICAgPFREIHZBbGlnbj1jZW50ZXIgYWxpZ249cmlnaHQ+Ci0gICAgICAgICAgICA8VEFCTEU+Ci0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICA8VFI+Ci0gICAgICAgICAgICAgICAgPFREIAotICAgICAgICAgICAgICAgIHN0eWxlPSJCT1JERVItUklHSFQ6IGJsYWNrIDFweCBzb2xpZDsgQk9SREVSLVRPUDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItTEVGVDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItQk9UVE9NOiBibGFjayAxcHggc29saWQiIAotICAgICAgICAgICAgICAgIGFsaWduPW1pZGRsZSBiZ0NvbG9yPSNmZmZmZTE+PEZPTlQgCi0gICAgICAgICAgICAgICAgICBzaXplPS0yPiZuYnNwO3Rvb2wgdGlwJm5ic3A7PC9GT05UPjwvVEQ+PC9UUj48L1RBQkxFPjwvVEQ+PC9UUj48L1RBQkxFPjwvVEQ+Ci0gICAgPFREPjwvVEQ+Ci0gICAgPFREIGJnQ29sb3I9I2NjY2NjYz48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvY3Rvb2wxNi9uZXdfc2VhcmNoX3dpei5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiZuYnNwOzxJTUcgCi0gICAgICBoZWlnaHQ9MTYgYWx0PSIiIHNyYz0iaWNvbnMvZnVsbC9ldG9vbDE2L25ld19zZWFyY2hfd2l6LmdpZiIgd2lkdGg9MTYgCi0gICAgICBib3JkZXI9MD4mbmJzcDs8SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvZHRvb2wxNi9uZXdfc2VhcmNoX3dpei5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiZuYnNwOzwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+IDwvRk9OVD48L1REPjwvVFI+Ci0JCi0gIDxUUiBiZ0NvbG9yPSNkZmRmOWY+Ci0gICAgPFREPjY8L1REPgotICAgIDxURD4gPC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4mbmJzcDs8L0ZPTlQ+PC9URD4KLSAgICA8VEQ+Ci0gICAgICA8VEFCTEUgY2VsbFNwYWNpbmc9MiBjZWxsUGFkZGluZz0wIHdpZHRoPSIxMDAlIiBib3JkZXI9MD4KLSAgICAgICAgCi0gICAgICAgIDxUUj4KLSAgICAgICAgICA8VEQgdkFsaWduPXRvcD48Zm9udCBzaXplPSItMSI+ICAgIGRlc2NyaXB0aW9uPC9mb250PjwvVEQ+Ci0gICAgICAgICAgPFREIHZBbGlnbj1jZW50ZXIgYWxpZ249cmlnaHQ+Ci0gICAgICAgICAgICA8VEFCTEU+Ci0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICA8VFI+Ci0gICAgICAgICAgICAgICAgPFREIAotICAgICAgICAgICAgICAgIHN0eWxlPSJCT1JERVItUklHSFQ6IGJsYWNrIDFweCBzb2xpZDsgQk9SREVSLVRPUDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItTEVGVDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItQk9UVE9NOiBibGFjayAxcHggc29saWQiIAotICAgICAgICAgICAgICAgIGFsaWduPW1pZGRsZSBiZ0NvbG9yPSNmZmZmZTE+PEZPTlQgCi0gICAgICAgICAgICAgICAgICBzaXplPS0yPiZuYnNwO3Rvb2wgdGlwJm5ic3A7PC9GT05UPjwvVEQ+PC9UUj48L1RBQkxFPjwvVEQ+PC9UUj48L1RBQkxFPjwvVEQ+Ci0gICAgPFREPjwvVEQ+Ci0gICAgPFREIGJnQ29sb3I9I2NjY2NjYz48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvY3Rvb2wxNi91bmluc3RhbGxfd2l6LmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Jm5ic3A7PElNRyAKLSAgICAgIGhlaWdodD0xNiBhbHQ9IiIgc3JjPSJpY29ucy9mdWxsL2V0b29sMTYvdW5pbnN0YWxsX3dpei5naWYiIHdpZHRoPTE2IAotICAgICAgYm9yZGVyPTA+Jm5ic3A7PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL2R0b29sMTYvdW5pbnN0YWxsX3dpei5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiZuYnNwOzwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+IDwvRk9OVD48L1REPjwvVFI+Ci0JPFRSIGJnQ29sb3I9I2ZmZmZmZj4KLSAgICA8VEQ+NzwvVEQ+Ci0gICAgPFREPiA8L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPiZuYnNwOzwvRk9OVD48L1REPgotICAgIDxURD4KLSAgICAgIDxUQUJMRSBjZWxsU3BhY2luZz0yIGNlbGxQYWRkaW5nPTAgd2lkdGg9IjEwMCUiIGJvcmRlcj0wPgotICAgICAgICAKLSAgICAgICAgPFRSPgotICAgICAgICAgIDxURCB2QWxpZ249dG9wPjxmb250IHNpemU9Ii0xIj4gICAgZGVzY3JpcHRpb248L2ZvbnQ+PC9URD4KLSAgICAgICAgICA8VEQgdkFsaWduPWNlbnRlciBhbGlnbj1yaWdodD4KLSAgICAgICAgICAgIDxUQUJMRT4KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIDxUUj4KLSAgICAgICAgICAgICAgICA8VEQgCi0gICAgICAgICAgICAgICAgc3R5bGU9IkJPUkRFUi1SSUdIVDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItVE9QOiBibGFjayAxcHggc29saWQ7IEJPUkRFUi1MRUZUOiBibGFjayAxcHggc29saWQ7IEJPUkRFUi1CT1RUT006IGJsYWNrIDFweCBzb2xpZCIgCi0gICAgICAgICAgICAgICAgYWxpZ249bWlkZGxlIGJnQ29sb3I9I2ZmZmZlMT48Rk9OVCAKLSAgICAgICAgICAgICAgICAgIHNpemU9LTI+Jm5ic3A7dG9vbCB0aXAmbmJzcDs8L0ZPTlQ+PC9URD48L1RSPjwvVEFCTEU+PC9URD48L1RSPjwvVEFCTEU+PC9URD4KLSAgICA8VEQ+PC9URD4KLSAgICA8VEQgYmdDb2xvcj0jY2NjY2NjPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9jdG9vbDE2L3VwZGF0ZV93aXouZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4mbmJzcDs8SU1HIAotICAgICAgaGVpZ2h0PTE2IGFsdD0iIiBzcmM9Imljb25zL2Z1bGwvZXRvb2wxNi91cGRhdGVfd2l6LmdpZiIgd2lkdGg9MTYgCi0gICAgICBib3JkZXI9MD4mbmJzcDs8SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvZHRvb2wxNi91cGRhdGVfd2l6LmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Jm5ic3A7PC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4gPC9GT05UPjwvVEQ+PC9UUj4KLSAgCi0gIAotICA8VFIgYmdDb2xvcj0jYmZiZjdmPgotICAgIDxURCBjb2xTcGFuPTc+PEI+PEZPTlQgc2l6ZT0rMj5Mb2NhbCBUb29sYmFyPC9GT05UPjwvQj48L1REPjwvVFI+Ci0gIDxUUiBiZ0NvbG9yPSNmZmZmZmY+Ci0gICAgPFREPjE8L1REPgotICAgIDxURD5HbyBCYWNrd2FyZDwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+Jm5ic3A7YmFja3dhcmRfbmF2PC9GT05UPjwvVEQ+Ci0gICAgPFREPgotICAgICAgPFRBQkxFIGNlbGxTcGFjaW5nPTIgY2VsbFBhZGRpbmc9MCB3aWR0aD0iMTAwJSIgYm9yZGVyPTA+Ci0gICAgICAgIAotICAgICAgICA8VFI+Ci0gICAgICAgICAgPFREIHZBbGlnbj10b3A+PGZvbnQgc2l6ZT0iLTEiPkEgc3RhbmRhcmQgYnJvd3NlciAnYmFja3dhcmQnIGJ1dHRvbjwvZm9udD48L1REPgotICAgICAgICAgIDxURCB2QWxpZ249Y2VudGVyIGFsaWduPXJpZ2h0PgotICAgICAgICAgICAgPFRBQkxFPgotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgPFRSPgotICAgICAgICAgICAgICAgIDxURCAKLSAgICAgICAgICAgICAgICBzdHlsZT0iQk9SREVSLVJJR0hUOiBibGFjayAxcHggc29saWQ7IEJPUkRFUi1UT1A6IGJsYWNrIDFweCBzb2xpZDsgQk9SREVSLUxFRlQ6IGJsYWNrIDFweCBzb2xpZDsgQk9SREVSLUJPVFRPTTogYmxhY2sgMXB4IHNvbGlkIiAKLSAgICAgICAgICAgICAgICBhbGlnbj1taWRkbGUgYmdDb2xvcj0jZmZmZmUxPjxGT05UIAotICAgICAgICAgICAgICAgICAgc2l6ZT0tMj4mbmJzcDtHbyBCYWNrd2FyZCZuYnNwOzwvRk9OVD48L1REPjwvVFI+PC9UQUJMRT48L1REPjwvVFI+PC9UQUJMRT48L1REPgotICAgIDxURD48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL2NsY2wxNi9iYWNrd2FyZF9uYXYuZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4gPElNRyAKLSAgICAgIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL2VsY2wxNi9iYWNrd2FyZF9uYXYuZ2lmIiAKLSAgICAgIHdpZHRoPTE2IGJvcmRlcj0wPiA8SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL2RsY2wxNi9iYWNrd2FyZF9uYXYuZ2lmIiAKLSAgICAgIHdpZHRoPTE2IGJvcmRlcj0wPjwvVEQ+Ci0gICAgPFREIGJnQ29sb3I9I2NjY2NjYz48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvY2xjbDE2L2JhY2t3YXJkX25hdi5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiZuYnNwOzxJTUcgCi0gICAgICBoZWlnaHQ9MTYgYWx0PSIiIHNyYz0iaWNvbnMvZnVsbC9lbGNsMTYvYmFja3dhcmRfbmF2LmdpZiIgd2lkdGg9MTYgCi0gICAgICBib3JkZXI9MD4mbmJzcDs8SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvZGxjbDE2L2JhY2t3YXJkX25hdi5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiZuYnNwOzwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+IDwvRk9OVD48L1REPjwvVFI+Ci0JCi0gIDxUUiBiZ0NvbG9yPSNkZmRmOWY+Ci0gICAgPFREPjI8L1REPgotICAgIDxURD5HbyBGb3J3YXJkPC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4mbmJzcDtmb3J3YXJkX25hdjwvRk9OVD48L1REPgotICAgIDxURD4KLSAgICAgIDxUQUJMRSBjZWxsU3BhY2luZz0yIGNlbGxQYWRkaW5nPTAgd2lkdGg9IjEwMCUiIGJvcmRlcj0wPgotICAgICAgICAKLSAgICAgICAgPFRSPgotICAgICAgICAgIDxURCB2QWxpZ249dG9wPjxmb250IHNpemU9Ii0xIj5BIHN0YW5kYXJkIGJyb3dzZXIgJ2ZvcndhcmQnIGJ1dHRvbjwvZm9udD48L1REPgotICAgICAgICAgIDxURCB2QWxpZ249Y2VudGVyIGFsaWduPXJpZ2h0PgotICAgICAgICAgICAgPFRBQkxFPgotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgPFRSPgotICAgICAgICAgICAgICAgIDxURCAKLSAgICAgICAgICAgICAgICBzdHlsZT0iQk9SREVSLVJJR0hUOiBibGFjayAxcHggc29saWQ7IEJPUkRFUi1UT1A6IGJsYWNrIDFweCBzb2xpZDsgQk9SREVSLUxFRlQ6IGJsYWNrIDFweCBzb2xpZDsgQk9SREVSLUJPVFRPTTogYmxhY2sgMXB4IHNvbGlkIiAKLSAgICAgICAgICAgICAgICBhbGlnbj1taWRkbGUgYmdDb2xvcj0jZmZmZmUxPjxGT05UIAotICAgICAgICAgICAgICAgICAgc2l6ZT0tMj4mbmJzcDtHbyBGb3J3YXJkJm5ic3A7PC9GT05UPjwvVEQ+PC9UUj48L1RBQkxFPjwvVEQ+PC9UUj48L1RBQkxFPjwvVEQ+Ci0gICAgPFREPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvY2xjbDE2L2ZvcndhcmRfbmF2LmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+IDxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvZWxjbDE2L2ZvcndhcmRfbmF2LmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+IDxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvZGxjbDE2L2ZvcndhcmRfbmF2LmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+PC9URD4KLSAgICA8VEQgYmdDb2xvcj0jY2NjY2NjPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9jbGNsMTYvZm9yd2FyZF9uYXYuZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4mbmJzcDs8SU1HIAotICAgICAgaGVpZ2h0PTE2IGFsdD0iIiBzcmM9Imljb25zL2Z1bGwvZWxjbDE2L2ZvcndhcmRfbmF2LmdpZiIgd2lkdGg9MTYgCi0gICAgICBib3JkZXI9MD4mbmJzcDs8SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvZGxjbDE2L2ZvcndhcmRfbmF2LmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Jm5ic3A7PC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4gPC9GT05UPjwvVEQ+PC9UUj4KLSAgPFRSIGJnQ29sb3I9I2ZmZmZmZj4KLSAgICA8VEQ+MzwvVEQ+Ci0gICAgPFREPkdvPC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4mbmJzcDtnb19uYXY8L0ZPTlQ+PC9URD4KLSAgICA8VEQ+Ci0gICAgICA8VEFCTEUgY2VsbFNwYWNpbmc9MiBjZWxsUGFkZGluZz0wIHdpZHRoPSIxMDAlIiBib3JkZXI9MD4KLSAgICAgICAgCi0gICAgICAgIDxUUj4KLSAgICAgICAgICA8VEQgdkFsaWduPXRvcD48Zm9udCBzaXplPSItMSI+QSBzdGFuZGFyZCBicm93c2VyIGJ1dHRvbiBmb3IKLSAgICAgICAgICAgIG5hdmlnYXRpbmcgdG8gYSBVUkwuPC9mb250PjwvVEQ+Ci0gICAgICAgICAgPFREIHZBbGlnbj1jZW50ZXIgYWxpZ249cmlnaHQ+Ci0gICAgICAgICAgICA8VEFCTEU+Ci0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICA8VFI+Ci0gICAgICAgICAgICAgICAgPFREIAotICAgICAgICAgICAgICAgIHN0eWxlPSJCT1JERVItUklHSFQ6IGJsYWNrIDFweCBzb2xpZDsgQk9SREVSLVRPUDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItTEVGVDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItQk9UVE9NOiBibGFjayAxcHggc29saWQiIAotICAgICAgICAgICAgICAgIGFsaWduPW1pZGRsZSBiZ0NvbG9yPSNmZmZmZTE+PEZPTlQgCi0gICAgICAgICAgICAgICAgICBzaXplPS0yPiZuYnNwO0dvJm5ic3A7PC9GT05UPjwvVEQ+PC9UUj48L1RBQkxFPjwvVEQ+PC9UUj48L1RBQkxFPjwvVEQ+Ci0gICAgPFREPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvY2xjbDE2L2dvX25hdi5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiA8SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL2VsY2wxNi9nb19uYXYuZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4gPElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9kbGNsMTYvZ29fbmF2LmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+PC9URD4KLSAgICA8VEQgYmdDb2xvcj0jY2NjY2NjPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9jbGNsMTYvZ29fbmF2LmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Jm5ic3A7PElNRyBoZWlnaHQ9MTYgCi0gICAgICBhbHQ9IiIgc3JjPSJpY29ucy9mdWxsL2VsY2wxNi9nb19uYXYuZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4mbmJzcDs8SU1HIAotICAgICAgaGVpZ2h0PTE2IGFsdD0iIiBzcmM9Imljb25zL2Z1bGwvZGxjbDE2L2dvX25hdi5naWYiIHdpZHRoPTE2IAotICAgIGJvcmRlcj0wPiZuYnNwOzwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+IDwvRk9OVD48L1REPjwvVFI+Ci0JCi0gIDxUUiBiZ0NvbG9yPSNkZmRmOWY+Ci0gICAgPFREPjQ8L1REPgotICAgIDxURD5HbyBIb21lPC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4mbmJzcDtob21lX25hdjwvRk9OVD48L1REPgotICAgIDxURCA+Ci0gICAgICA8VEFCTEUgY2VsbFNwYWNpbmc9MiBjZWxsUGFkZGluZz0wIGJvcmRlcj0wPgotICAgICAgICAKLSAgICAgICAgPFRSPgotICAgICAgICAgIDxURCB2QWxpZ249dG9wPjxmb250IHNpemU9Ii0xIj5BIHN0YW5kYXJkIGJyb3dzZXIgYnV0dG9uCi0gICAgICAgICAgICBmb3IgZ29pbmcgdG8gdGhlIGhvbWUgbG9jYXRpb248L2ZvbnQ+PC9URD4KLSAgICAgICAgICA8VEQ+Ci0gICAgICAgICAgICA8VEFCTEU+Ci0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICA8VFI+Ci0gICAgICAgICAgICAgICAgPFREIAotICAgICAgICAgICAgICAgIHN0eWxlPSJCT1JERVItUklHSFQ6IGJsYWNrIDFweCBzb2xpZDsgQk9SREVSLVRPUDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItTEVGVDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItQk9UVE9NOiBibGFjayAxcHggc29saWQiIAotICAgICAgICAgICAgICAgIGFsaWduPW1pZGRsZSBiZ0NvbG9yPSNmZmZmZTE+PEZPTlQgCi0gICAgICAgICAgICAgICAgICBzaXplPS0yPiZuYnNwO0dvIEhvbWUmbmJzcDs8L0ZPTlQ+PC9URD48L1RSPjwvVEFCTEU+PC9URD48L1RSPjwvVEFCTEU+PC9URD4KLSAgICA8VEQ+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9jbGNsMTYvaG9tZV9uYXYuZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4gPElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9lbGNsMTYvaG9tZV9uYXYuZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4gPElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9kbGNsMTYvaG9tZV9uYXYuZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD48L1REPgotICAgIDxURCBiZ0NvbG9yPSNjY2NjY2M+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL2NsY2wxNi9ob21lX25hdi5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiZuYnNwOzxJTUcgCi0gICAgICBoZWlnaHQ9MTYgYWx0PSIiIHNyYz0iaWNvbnMvZnVsbC9lbGNsMTYvaG9tZV9uYXYuZ2lmIiB3aWR0aD0xNiAKLSAgICAgIGJvcmRlcj0wPiZuYnNwOzxJTUcgaGVpZ2h0PTE2IGFsdD0iIiBzcmM9Imljb25zL2Z1bGwvZGxjbDE2L2hvbWVfbmF2LmdpZiIgCi0gICAgICB3aWR0aD0xNiBib3JkZXI9MD4mbmJzcDs8L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPiA8L0ZPTlQ+PC9URD48L1RSPgotICA8VFIgYmdDb2xvcj0jZmZmZmZmPgotICAgIDxURD41PC9URD4KLSAgICA8VEQ+UmVmcmVzaDwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+Jm5ic3A7cmVmcmVzaF9uYXY8L0ZPTlQ+PC9URD4KLSAgICA8VEQ+Ci0gICAgICA8VEFCTEUgY2VsbFNwYWNpbmc9MiBjZWxsUGFkZGluZz0wIHdpZHRoPSIxMDAlIiBib3JkZXI9MD4KLSAgICAgICAgCi0gICAgICAgIDxUUj4KLSAgICAgICAgICA8VEQgdkFsaWduPXRvcD48Zm9udCBzaXplPSItMSI+UmVmcmVzaCB0aGUgY29udGVudHMgb2YgdGhlIHZpZXc8L2ZvbnQ+PC9URD4KLSAgICAgICAgICA8VEQgdkFsaWduPWNlbnRlciBhbGlnbj1yaWdodD4KLSAgICAgICAgICAgIDxUQUJMRT4KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIDxUUj4KLSAgICAgICAgICAgICAgICA8VEQgCi0gICAgICAgICAgICAgICAgc3R5bGU9IkJPUkRFUi1SSUdIVDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItVE9QOiBibGFjayAxcHggc29saWQ7IEJPUkRFUi1MRUZUOiBibGFjayAxcHggc29saWQ7IEJPUkRFUi1CT1RUT006IGJsYWNrIDFweCBzb2xpZCIgCi0gICAgICAgICAgICAgICAgYWxpZ249bWlkZGxlIGJnQ29sb3I9I2ZmZmZlMT48Rk9OVCAKLSAgICAgICAgICAgICAgICAgIHNpemU9LTI+Jm5ic3A7UmVmcmVzaCZuYnNwOzwvRk9OVD48L1REPjwvVFI+PC9UQUJMRT48L1REPjwvVFI+PC9UQUJMRT48L1REPgotICAgIDxURD48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL2NsY2wxNi9yZWZyZXNoX25hdi5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiA8SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL2VsY2wxNi9yZWZyZXNoX25hdi5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiA8SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL2RsY2wxNi9yZWZyZXNoX25hdi5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPjwvVEQ+Ci0gICAgPFREIGJnQ29sb3I9I2NjY2NjYz48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvY2xjbDE2L3JlZnJlc2hfbmF2LmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Jm5ic3A7PElNRyAKLSAgICAgIGhlaWdodD0xNiBhbHQ9IiIgc3JjPSJpY29ucy9mdWxsL2VsY2wxNi9yZWZyZXNoX25hdi5naWYiIHdpZHRoPTE2IAotICAgICAgYm9yZGVyPTA+Jm5ic3A7PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL2RsY2wxNi9yZWZyZXNoX25hdi5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiZuYnNwOzwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+IDwvRk9OVD48L1REPjwvVFI+Ci0gIDxUUiBiZ0NvbG9yPSNkZmRmOWY+Ci0gICAgPFREPjY8L1REPgotICAgIDxURD5TdG9wPC9URD4KLSAgICA8VEQ+PGZvbnQgc2l6ZT0iLTEiPnN0b3BfbmF2PC9mb250PjwvVEQ+Ci0gICAgPFREPgotICAgICAgPFRBQkxFIGNlbGxTcGFjaW5nPTIgY2VsbFBhZGRpbmc9MCB3aWR0aD0iMTAwJSIgYm9yZGVyPTA+Ci0gICAgICAgIAotICAgICAgICA8VFI+Ci0gICAgICAgICAgPFREIHZBbGlnbj10b3A+PGZvbnQgc2l6ZT0iLTEiPkEgc3RhbmRhcmQgYnJvd3NlciBidXR0b24gZm9yIHN0b3BwaW5nCi0gICAgICAgICAgICB0aGUgbmF2aWdhdGlvbiBpbiBwcm9ncmVzczwvZm9udD48L1REPgotICAgICAgICAgIDxURCB2QWxpZ249Y2VudGVyIGFsaWduPXJpZ2h0PgotICAgICAgICAgICAgPFRBQkxFPgotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgPFRSPgotICAgICAgICAgICAgICAgIDxURCAKLSAgICAgICAgICAgICAgICBzdHlsZT0iQk9SREVSLVJJR0hUOiBibGFjayAxcHggc29saWQ7IEJPUkRFUi1UT1A6IGJsYWNrIDFweCBzb2xpZDsgQk9SREVSLUxFRlQ6IGJsYWNrIDFweCBzb2xpZDsgQk9SREVSLUJPVFRPTTogYmxhY2sgMXB4IHNvbGlkIiAKLSAgICAgICAgICAgICAgICBhbGlnbj1taWRkbGUgYmdDb2xvcj0jZmZmZmUxPjxGT05UIAotICAgICAgICAgICAgICAgICAgc2l6ZT0tMj4mbmJzcDtTdG9wJm5ic3A7Jm5ic3A7PC9GT05UPjwvVEQ+PC9UUj48L1RBQkxFPjwvVEQ+PC9UUj48L1RBQkxFPjwvVEQ+Ci0gICAgPFREPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvY2xjbDE2L3N0b3BfbmF2LmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+IDxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvZWxjbDE2L3N0b3BfbmF2LmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+IDxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvZGxjbDE2L3N0b3BfbmF2LmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+PC9URD4KLSAgICA8VEQgYmdDb2xvcj0jY2NjY2NjPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9jbGNsMTYvc3RvcF9uYXYuZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4mbmJzcDs8SU1HIAotICAgICAgaGVpZ2h0PTE2IGFsdD0iIiBzcmM9Imljb25zL2Z1bGwvZWxjbDE2L3N0b3BfbmF2LmdpZiIgd2lkdGg9MTYgCi0gICAgICBib3JkZXI9MD4mbmJzcDs8SU1HIGhlaWdodD0xNiBhbHQ9IiIgc3JjPSJpY29ucy9mdWxsL2RsY2wxNi9zdG9wX25hdi5naWYiIAotICAgICAgd2lkdGg9MTYgYm9yZGVyPTA+Jm5ic3A7PC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4gPC9GT05UPjwvVEQ+PC9UUj4KLSAgPFRSPgotICAgIDxURD43PC9URD4KLSAgICA8VEQ+U2hvdyBVbmNvbmZpZ3VyZWQgRmVhdHVyZXM8L1REPgotICAgIDxURD5zaG93X3VuY29uZjwvVEQ+Ci0gICAgPFREPgotICAgICAgPFRBQkxFIGNlbGxTcGFjaW5nPTIgY2VsbFBhZGRpbmc9MCB3aWR0aD0iMTAwJSIgYm9yZGVyPTA+Ci0gICAgICAgIAotICAgICAgICA8VFI+Ci0gICAgICAgICAgPFREIHZBbGlnbj10b3A+PGZvbnQgc2l6ZT0iLTEiPkEgdG9nZ2xlIGJ1dHRvbiB0aGF0IGFsbG93cwotICAgICAgICAgICAgdW5jb25maWd1cmVkIGZlYXR1cmVzIHRvIHNob3cgaW4gdGhlIHZpZXc8L2ZvbnQ+PC9URD4KLSAgICAgICAgICA8VEQgdkFsaWduPWNlbnRlciBhbGlnbj1yaWdodD4KLSAgICAgICAgICAgIDxUQUJMRT4KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIDxUUj4KLSAgICAgICAgICAgICAgICA8VEQgCi0gICAgICAgICAgICAgICAgc3R5bGU9IkJPUkRFUi1SSUdIVDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItVE9QOiBibGFjayAxcHggc29saWQ7IEJPUkRFUi1MRUZUOiBibGFjayAxcHggc29saWQ7IEJPUkRFUi1CT1RUT006IGJsYWNrIDFweCBzb2xpZCIgCi0gICAgICAgICAgICAgICAgYWxpZ249bWlkZGxlIGJnQ29sb3I9I2ZmZmZlMT48Rk9OVCAKLSAgICAgICAgICAgICAgICAgIHNpemU9LTI+Jm5ic3A7U2hvdyBVbmNvbmZpZ3VyZWQgRmVhdHVyZXMmbmJzcDs8L0ZPTlQ+PC9URD48L1RSPjwvVEFCTEU+PC9URD48L1RSPjwvVEFCTEU+PC9URD4KLSAgICA8VEQ+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9jbGNsMTYvc2hvd191bmNvbmYuZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4gPC9URD4KLSAgICA8VEQgQkdDT0xPUj0jY2NjY2NjPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9jbGNsMTYvc2hvd191bmNvbmYuZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4mbmJzcDs8SU1HIAotICAgICAgaGVpZ2h0PTE2IGFsdD0iIiBzcmM9Imljb25zL2Z1bGwvZWxjbDE2L3Nob3dfdW5jb25mLmdpZiIgd2lkdGg9MTYgCi0gICAgICBib3JkZXI9MD4mbmJzcDs8SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvZGxjbDE2L3Nob3dfdW5jb25mLmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+PC9URD4KLSAgICA8VEQ+PC9URD48L1RSPgotCQotICA8VFIgYmdDb2xvcj0jYmZiZjdmPgotICAgIDxURCBjb2xTcGFuPTc+PEI+PEZPTlQgc2l6ZT0rMj5Nb2RlbCBPYmplY3Q8L0ZPTlQ+PC9CPjwvVEQ+PC9UUj4KLSAgPFRSIGJnQ29sb3I9I2ZmZmZmZj4KLSAgICA8VEQ+MTwvVEQ+Ci0gICAgPFREPiZuYnNwO0FwcGxpY2F0aW9uIENvbmZpZ3VyYXRpb248L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPiZuYnNwO2FwcF9vYmo8L0ZPTlQ+PC9URD4KLSAgICA8VEQ+PGZvbnQgc2l6ZT0iLTEiPnRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gdXNlZCB0byBsb2FkIHRoZSBjdXJyZW50Ci0gICAgICBhcHBsaWNhdGlvbjwvZm9udD48L1REPgotICAgIDxURD48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL29iajE2L2FwcF9vYmouZ2lmIiB3aWR0aD0xNiAKLSAgICBhbGlnbj1sZWZ0IGJvcmRlcj0wPjwvVEQ+Ci0gICAgPFREPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiBzcmM9Imljb25zL2Z1bGwvb2JqMTYvYXBwX29iai5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPjwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+IDwvRk9OVD48L1REPjwvVFI+Ci0JCi0gIDxUUiBiZ0NvbG9yPSNkZmRmYj4KLSAgICA8VEQ+MjwvVEQ+Ci0gICAgPFREPk15IENvbXB1dGVyPC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4mbmJzcDtjb21wdXRlcl9vYmo8L0ZPTlQ+PC9URD4KLSAgICA8VEQ+PGZvbnQgc2l6ZT0iLTEiPnRoZSBmaWxlIHN5c3RlbSByb290PC9mb250PjwvVEQ+Ci0gICAgPFREPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvb2JqMTYvY29tcHV0ZXJfb2JqLmdpZiIgd2lkdGg9MTYgCi0gICAgYWxpZ249bGVmdCBib3JkZXI9MD48L1REPgotICAgIDxURCBiZ0NvbG9yPSNmZmZmZmY+Ci0gICAgICA8SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvb2JqMTYvY29tcHV0ZXJfb2JqLmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Ci0gICAgICA8UD48L1A+PC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4gPC9GT05UPjwvVEQ+PC9UUj4KLSAgPFRSIGJnQ29sb3I9I2ZmZmZmZj4KLSAgICA8VEQ+MzwvVEQ+Ci0gICAgPFREPiZuYnNwO0ZlYXR1cmU8L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPiZuYnNwO2ZlYXR1cmVfb2JqPC9GT05UPjwvVEQ+Ci0gICAgPFREPjxmb250IHNpemU9Ii0xIj5mZWF0dXJlIG9iamVjdDwvZm9udD48L1REPgotICAgIDxURD48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL29iajE2L2ZlYXR1cmVfb2JqLmdpZiIgd2lkdGg9MTYgCi1hbGlnbj1sZWZ0IGJvcmRlcj0wPjwvVEQ+Ci0gICAgPFREIGJnQ29sb3I9I2ZmZmZmZj4KLSAgICAgIDxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9vYmoxNi9mZWF0dXJlX29iai5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPgotICAgICAgPFA+PC9QPjwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+IDwvRk9OVD48L1REPjwvVFI+Ci0gIDxUUiBiZ0NvbG9yPSNkZmRmYj4KLSAgICA8VEQ+NDwvVEQ+Ci0gICAgPFREPlVuY29uZmlndXJlZCBGZWF0dXJlPC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4mbmJzcDt1bmNvbmZfZmVhdHVyZV9vYmo8L0ZPTlQ+PC9URD4KLSAgICA8VEQ+PGZvbnQgc2l6ZT0iLTEiPmZlYXR1cmUgdGhhdCBpcyBjdXJyZW50bHkgdW5jb25maWd1cmVkIChpLmUuIHN0aWxsCi0gICAgICBwcmVzZW50IGJ1dCBkaXNhYmxlZCBpbiB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uKTwvZm9udD48L1REPgotICAgIDxURD48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL29iajE2L3VuY29uZl9mZWF0dXJlX29iai5naWYiIHdpZHRoPTE2IAotICAgIGFsaWduPWxlZnQgYm9yZGVyPTA+PC9URD4KLSAgICA8VEQgYmdDb2xvcj0jZmZmZmZmPgotICAgICAgPElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL29iajE2L3VuY29uZl9mZWF0dXJlX29iai5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPgotICAgICAgPFA+PC9QPjwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+IDwvRk9OVD48L1REPjwvVFI+Ci0gIDxUUiBiZ0NvbG9yPSNmZmZmZmY+Ci0gICAgPFREPjU8L1REPgotICAgIDxURD5QbGFjZXMgdG8gVmlzaXQ8L1REPgotICAgIDxURD5wbGFjZXNfb2JqPC9URD4KLSAgICA8VEQ+YSBmb2xkZXIgdGhhdCBjb250YWlucyBib29rbWFya3MgdG8gcmVtb3RlIHNpdGVzIHRoYXQKLSAgICAgIGNvbnRhaW4gY29vbCBmZWF0dXJlczwvVEQ+Ci0gICAgPFREPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvb2JqMTYvcGxhY2VzX29iai5naWYiIHdpZHRoPTE2IAotYWxpZ249bGVmdCBib3JkZXI9MD48L1REPgotICAgIDxURCBiZ0NvbG9yPSNmZmZmZmY+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL29iajE2L3BsYWNlc19vYmouZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4KLSAgICAgICZuYnNwOzwvVEQ+Ci0gICAgPFREPjwvVEQ+PC9UUj4KLSAgPFRSIGJnQ29sb3I9I2RmZGZiPgotICAgIDxURD42PC9URD4KLSAgICA8VEQ+U2l0ZTwvVEQ+Ci0gICAgPFREPjxmb250IHNpemU9Ii0xIj5zaXRlX29iaiZuYnNwOzwvZm9udD48L1REPgotICAgIDxURD48Zm9udCBzaXplPSItMSI+dXBkYXRlIHNpdGUgb2JqZWN0IHRoYXQgcmVwcmVzZW50IGEgcHJvdmlkZXIKLSAgICAgIHNpdGUgKHNpdGUgdGhhdCBpcyBzZXQgdXAgdG8gYWN0IGFzIGEgc291cmNlIG9mIGZlYXR1cmVzKTwvZm9udD48L1REPgotICAgIDxURD48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL29iajE2L3NpdGVfb2JqLmdpZiIgd2lkdGg9MTYgCi1hbGlnbj1sZWZ0IGJvcmRlcj0wPjwvVEQ+Ci0gICAgPFREIGJnQ29sb3I9I2ZmZmZmZj4KLSAgICAgIDxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9vYmoxNi9zaXRlX29iai5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPgotICAgICAgPFA+PC9QPjwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+IDwvRk9OVD48L1REPjwvVFI+Ci0gIDxUUj4KLSAgICA8VEQ+NzwvVEQ+Ci0gICAgPFREPjxmb250IHNpemU9Ii0xIj5Mb2NhbCBTaXRlPC9mb250PjwvVEQ+Ci0gICAgPFREPjxmb250IHNpemU9Ii0xIj5sc2l0ZV9vYmo8L2ZvbnQ+PC9URD4KLSAgICA8VEQ+dXBkYXRlIHNpdGUgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyBhIHJlY2VpdmVyIHNpdGUgKHNpdGUKLSAgICAgIHRoYXQgaXMgc2V0IHVwIHRvIGFjdCBhcyBhIHRhcmdldCBvZiB0aGUgZmVhdHVyZSBpbnN0YWxsYXRpb24pPC9URD4KLSAgICA8VEQ+PElNRyBoZWlnaHQ9MTYgCi0gICAgICBhbHQ9IiIgCi1zcmM9Ii4uL29sZC5pY29ucy9mdWxsL29iajE2L2xzaXRlX29iai5naWYiIHdpZHRoPTE2IGFsaWduPWxlZnQgYm9yZGVyPTA+PC9URD4KLSAgICA8VEQgYmdDb2xvcj0jZmZmZmZmPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9vYmoxNi9sc2l0ZV9vYmouZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4KLSAgICAgICZuYnNwOzwvVEQ+Ci0gICAgPFREPjwvVEQ+PC9UUj4KLSAgPFRSIGJnQ29sb3I9I2RmZGZiPgotICAgIDxURD44PC9URD4KLSAgICA8VEQ+PGZvbnQgc2l6ZT0iLTEiPkZlYXR1cmUgQ2F0ZWdvcnk8L2ZvbnQ+PC9URD4KLSAgICA8VEQ+PGZvbnQgc2l6ZT0iLTEiPmNhdGVnb3J5X29iajwvZm9udD48L1REPgotICAgIDxURD5zaXRlcyBjYW4gY2xhc3NpZnkgZmVhdHVyZXMgdGhleSBob3N0IGludG8gaGllcmFyY2hpY2FsCi0gICAgICBjYXRlZ29yaWVzPC9URD4KLSAgICA8VEQ+Ci0gICAgICA8UCBhbGlnbj1sZWZ0PjxJTUcgaGVpZ2h0PTE2IHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvb2JqMTYvY2F0ZWdvcnlfb2JqLmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+PC9QPjwvVEQ+Ci0gICAgPFREIGJnQ29sb3I9I2ZmZmZmZj48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvb2JqMTYvY2F0ZWdvcnlfb2JqLmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Ci0gICAgICAmbmJzcDs8L1REPgotICAgIDxURD48L1REPjwvVFI+Ci0gIDxUUj4KLSAgICA8VEQ+OTwvVEQ+Ci0gICAgPFREPjxmb250IHNpemU9Ii0xIj5Cb29rbWFyayBGb2xkZXI8L2ZvbnQ+PC9URD4KLSAgICA8VEQ+PGZvbnQgc2l6ZT0iLTEiPmJmb2xkZXJfb2JqPC9mb250PjwvVEQ+Ci0gICAgPFREPmZvbGRlciBvYmplY3QgaW4gdGhlIHZpZXcgdGhhdCBwcm92aWRlcyBmb3IKLSAgICAgIG9yZ2FuaXppbmcgc2l0ZSBib29rbWFya3MgYW5kIHNlYXJjaCBvYmplY3RzPC9URD4KLSAgICA8VEQ+Ci0gICAgICA8UCBhbGlnbj1sZWZ0PjxJTUcgaGVpZ2h0PTE2IHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvb2JqMTYvYmZvbGRlcl9vYmouZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD48L1A+PC9URD4KLSAgICA8VEQgYmdDb2xvcj0jZmZmZmZmID48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvb2JqMTYvYmZvbGRlcl9vYmouZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4KLSAgICAgICZuYnNwOzwvVEQ+Ci0gICAgPFREPjwvVEQ+PC9UUj4KLSAgPFRSIGJnQ29sb3I9I2RmZGZiPgotICAgIDxURD4xMDwvVEQ+Ci0gICAgPFREPlRleHQgU2VhcmNoPC9URD4KLSAgICA8VEQ+PGZvbnQgc2l6ZT0iLTEiPnRzZWFyY2hfb2JqPC9mb250PjwvVEQ+Ci0gICAgPFREPjxmb250IHNpemU9Ii0xIj5UZXh0IHNlYXJjaCBvYmplY3QmbmJzcDs8L2ZvbnQ+PC9URD4KLSAgICA8VEQ+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9vYmoxNi90c2VhcmNoX29iai5naWYiIHdpZHRoPTE2IGFsaWduPWxlZnQgYm9yZGVyPTA+PC9URD4KLSAgICA8VEQgYmdDb2xvcj0jZmZmZmZmPgotICAgICAgPElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL29iajE2L3RzZWFyY2hfb2JqLmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Ci0gICAgICA8UD48L1A+PC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4gPC9GT05UPjwvVEQ+PC9UUj4KLSAgPFRSPgotICAgIDxURD4xMTwvVEQ+Ci0gICAgPFREPlVwZGF0ZSBTZWFyY2g8L1REPgotICAgIDxURD51c2VhcmNoX29iajwvVEQ+Ci0gICAgPFREPkF2YWlsYWJsZSBVcGRhdGVzIHNlYXJjaCBvYmplY3Q8L1REPgotICAgIDxURD48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL29iajE2L3VzZWFyY2hfb2JqLmdpZiIgd2lkdGg9MTYgYWxpZ249bGVmdCBib3JkZXI9MD48L1REPgotICAgIDxURCBiZ0NvbG9yPSNmZmZmZmY+Ci0gICAgICA8SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvb2JqMTYvdXNlYXJjaF9vYmouZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4KLSAgICAgIDxQPjwvUD4KLSAgICA8L1REPgotICAgIDxURD48L1REPjwvVFI+Ci0gIDxUUiBiZ0NvbG9yPSNkZmRmYj4KLSAgICA8VEQ+MTI8L1REPgotICAgIDxURD5QbHVnLWluIFNlYXJjaDwvVEQ+Ci0gICAgPFREPnBzZWFyY2hfb2JqPC9URD4KLSAgICA8VEQ+UGx1Zy1pbiBzZWFyY2ggb2JqZWN0PC9URD4KLSAgICA8VEQ+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9vYmoxNi9wc2VhcmNoX29iai5naWYiIHdpZHRoPTE2IGFsaWduPWxlZnQgYm9yZGVyPTA+PC9URD4KLSAgICA8VEQgYmdDb2xvcj0jZmZmZmZmPgotICAgICAgPElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL29iajE2L3BzZWFyY2hfb2JqLmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Ci0gICAgICA8UD48L1A+Ci0gICAgPC9URD4KLSAgICA8VEQ+PC9URD48L1RSPgotICA8VFI+Ci0gICAgPFREPjEzPC9URD4KLSAgICA8VEQ+Rml4ZWQgVm9sdW1lPC9URD4KLSAgICA8VEQ+dmZpeGVkX29iajwvVEQ+Ci0gICAgPFREPkxvY2FsIGZpbGUgc3lzdGVtIHZvbHVtZSB0aGF0IHJlcHJlc2VudHMgYSBmaXhlZCBkcml2ZSAoV2luZG93cykgb3IKLSAgICAgIGZvbGRlciAoTGludXgpPC9URD4KLSAgICA8VEQ+PElNRyBoZWlnaHQ9MTYgCi0gICAgICBhbHQ9IiIgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9vYmoxNi92Zml4ZWRfb2JqLmdpZiIgd2lkdGg9MTYgYWxpZ249bGVmdCBib3JkZXI9MD4KLSAgICA8L1REPgotICAgIDxURCBiZ0NvbG9yPSNmZmZmZmY+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL29iajE2L3ZmaXhlZF9vYmouZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4KLSAgICAgIAotICAgIDwvVEQ+Ci0gICAgPFREPjwvVEQ+PC9UUj4KLSAgPFRSIGJnQ29sb3I9I2RmZGZiPgotICAgIDxURD4xNDwvVEQ+Ci0gICAgPFREPlJlbW90ZSBWb2x1bWU8L1REPgotICAgIDxURD52cmVtb3RlX29iajwvVEQ+Ci0gICAgPFREPlJlbW90ZSBmaWxlIHN5c3RlbSB2b2x1bWUgdGhhdCByZXByZXNlbnRzIGEgc2hhcmVkIGRyaXZlIChXaW5kb3cpIG9yCi0gICAgICBtb3VudGVkIHZvbHVtZSAoTGludXgpPC9URD4KLSAgICA8VEQgaGVpZ2h0ID0xNiAKLSAgICAgIGFsdD0iIiA8SU1HIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvb2JqMTYvdnJlbW90ZV9vYmouZ2lmIiB3aWR0aD0xNiBhbGlnbj1sZWZ0IGJvcmRlcj0iMSIgCi0gICA+Ci0gICAgPC9URD4KLSAgICA8VEQgYmdDb2xvcj0jZmZmZmZmPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9vYmoxNi92cmVtb3RlX29iai5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPgotICAgICAgJm5ic3A7Ci0gICAgPC9URD4KLSAgICA8VEQ+PC9URD48L1RSPgotICA8VFI+Ci0gICAgPFREPjE1PC9URD4KLSAgICA8VEQ+UmVtb3ZhYmxlIFZvbHVtZTwvVEQ+Ci0gICAgPFREPnZyZW1vdmFibGVfb2JqPC9URD4KLSAgICA8VEQ+UmVtb3ZhYmxlIGZpbGUgc3lzdGVtIHZvbHVtZSB0aGF0IGlzIG5laXRoZXIgQ0QtUk9NIG5vciBGbG9wcHkgRGlzay4KLSAgICAgIFRoaXMgaW1hZ2UgaXMgdXNlZCBmb3IgYWxsIG90aGVyIHJlbW92YWJsZSB2b2x1bWVzIGxpa2UgRFZELVJPTSwgdmFyaW91cwotICAgICAgUENNQ0lBIGNhcmRzIGV0Yy48L1REPgotICAgIDxURD48SU1HIGhlaWdodD0xNiAKLSAgICAgIGFsdD0iIiBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL29iajE2L3ZyZW1vdmFibGVfb2JqLmdpZiIgd2lkdGg9MTYgYWxpZ249bGVmdCBib3JkZXI9MD4KLSAgICA8L1REPgotICAgIDxURCBiZ0NvbG9yPSNmZmZmZmY+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL29iajE2L3ZyZW1vdmFibGVfb2JqLmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Ci0gICAgICAmbmJzcDsKLSAgICA8L1REPgotICAgIDxURD48L1REPjwvVFI+Ci0gIDxUUiBiZ0NvbG9yPSNkZmRmYj4KLSAgICA8VEQ+MTY8L1REPgotICAgIDxURD5DRC1ST008L1REPgotICAgIDxURD5jZF9vYmo8L1REPgotICAgIDxURD5GaWxlIHN5c3RlbSB2b2x1bWUgdGhhdCByZXByZXNlbnQgYSBDRC1ST00gZHJpdmU8L1REPgotICAgIDxURD48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL29iajE2L2NkX29iai5naWYiIHdpZHRoPTE2IGFsaWduPWxlZnQgYm9yZGVyPTA+PC9URD4KLSAgICA8VEQgYmdDb2xvcj0jZmZmZmZmPgotICAgICAgPElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL29iajE2L2NkX29iai5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPgotICAgICAgPFA+PC9QPgotICAgIDwvVEQ+Ci0gICAgPFREPjwvVEQ+PC9UUj4KLSAgPFRSPgotICAgIDxURD4xNzwvVEQ+Ci0gICAgPFREPkZsb3BweSBEaXNrPC9URD4KLSAgICA8VEQ+PGZvbnQgc2l6ZT0iLTEiPmZsb3BweV9vYmo8L2ZvbnQ+PC9URD4KLSAgICA8VEQ+PGZvbnQgc2l6ZT0iLTEiPkZpbGUgc3lzdGVtIHZvbHVtZSB0aGF0IHJlcHJlc2VudHMgYSAzIDEvMiBpbmNoIGZsb3BweQotICAgICAgZGlzayBkcml2ZTwvZm9udD48L1REPgotICAgIDxURD48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL29iajE2L2Zsb3BweV9vYmouZ2lmIiB3aWR0aD0xNiBhbGlnbj1sZWZ0IGJvcmRlcj0wPjwvVEQ+Ci0gICAgPFREIGJnQ29sb3I9I2ZmZmZmZj4KLSAgICAgIDxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9vYmoxNi9mbG9wcHlfb2JqLmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Ci0gICAgICA8UD48L1A+PC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4gPC9GT05UPjwvVEQ+PC9UUj4KLSAgPFRSIGJnQ29sb3I9I2RmZGZiPgotICAgIDxURD4xODwvVEQ+Ci0gICAgPFREPlNhdmVkIENvbmZpZ3VyYXRpb25zPC9URD4KLSAgICA8VEQ+c2F2ZWRfb2JqPC9URD4KLSAgICA8VEQ+PGZvbnQgc2l6ZT0iMiI+Rm9sZGVyIHRoYXQgaG9sZHMgcGFzdCBjb25maWd1cmF0aW9ucyB0aGF0IGhhdmUgYmVlbiBwcmVzZXJ2ZWQgYW5kL29yCi0gICAgICByZW5hbWVkPC9mb250PjwvVEQ+Ci0gICAgPFREPjxJTUcgaGVpZ2h0PTE2IAotICAgICAgYWx0PSIiIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvb2JqMTYvc2F2ZWRfb2JqLmdpZiIgd2lkdGg9MTYgYWxpZ249bGVmdCBib3JkZXI9MD48L1REPgotICAgIDxURCBiZ0NvbG9yPSNmZmZmZmYgPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9vYmoxNi9zYXZlZF9vYmouZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD48L1REPgotICAgIDxURD48L1REPjwvVFI+Ci0gIDxUUj4KLSAgICA8VEQ+MTk8L1REPgotICAgIDxURD5Db25maWd1cmF0aW9uIEhpc3Rvcnk8L1REPgotICAgIDxURD5oaXN0b3J5X29iajwvVEQ+Ci0gICAgPFREPkZvbGRlciB0aGF0IGhvbGRzIHBhc3QgY29uZmlndXJhdGlvbnM8L1REPgotICAgIDxURD48SU1HIGhlaWdodD0xNiAKLSAgICAgIGFsdD0iIiBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL29iajE2L2hpc3Rvcnlfb2JqLmdpZiIgd2lkdGg9MTYgYWxpZ249bGVmdCBib3JkZXI9MD48L1REPgotICAgIDxURCBiZ0NvbG9yPSNmZmZmZmYgPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9vYmoxNi9oaXN0b3J5X29iai5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPjwvVEQ+Ci0gICAgPFREPjwvVEQ+PC9UUj4KLSAgPFRSIGJnQ29sb3I9I2RmZGZiPgotICAgIDxURD4yMDwvVEQ+Ci0gICAgPFREPkF2YWlsYWJsZSBVcGRhdGVzPC9URD4KLSAgICA8VEQ+dXBkYXRlc19vYmo8L1REPgotICAgIDxURD5VcGRhdGUgU2VhcmNoIG9iamVjdCB0aGF0IGlzIHByZS1jb25maWd1cmVkIHRvIGxvb2sgZm9yCi0gICAgICBhdmFpbGFibGUgdXBkYXRlcyBvZiBhbGwgdGhlIGluc3RhbGxlZCBmZWF0dXJlcy4gSXQgY2Fubm90IGJlIHJlbW92ZWQgZnJvbQotICAgICAgdGhlIHZpZXcuPC9URD4KLSAgICA8VEQ+PElNRyBoZWlnaHQ9MTYgCi0gICAgICBhbHQ9IiIgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9vYmoxNi91cGRhdGVzX29iai5naWYiIHdpZHRoPTE2IGFsaWduPWxlZnQgYm9yZGVyPTA+PC9URD4KLSAgICA8VEQgYmdDb2xvcj0jZmZmZmZmID48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvb2JqMTYvdXBkYXRlc19vYmouZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD48L1REPgotICAgIDxURD48L1REPjwvVFI+Ci0gIDxUUj4KLSAgICA8VEQ+MjE8L1REPgotICAgIDxURD5Db25maWd1cmF0aW9uPC9URD4KLSAgICA8VEQ+Y29uZmlnX29iajwvVEQ+Ci0gICAgPFREPkEgY29uZmlndXJhdGlvbiBoaXN0b3J5IGVudHJ5IHRoYXQgcmVwcmVzZW50cyBvbmUKLSAgICAgIGNvbmZpZ3VyYXRpb248L1REPgotICAgIDxURD48SU1HIGhlaWdodD0xNiAKLSAgICAgIGFsdD0iIiBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL29iajE2L2NvbmZpZ19vYmouZ2lmIiB3aWR0aD0xNiBhbGlnbj1sZWZ0IGJvcmRlcj0wPjwvVEQ+Ci0gICAgPFREIGJnQ29sb3I9I2ZmZmZmZiA+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL29iajE2L2NvbmZpZ19vYmouZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD48L1REPgotICAgIDxURD48L1REPjwvVFI+Ci0JCi0JCi0JCi0gIDxUUiBiZ0NvbG9yPSNjY2NjY2M+Ci0gICAgPFREIGNvbFNwYW49Nz48Qj48Rk9OVCBzaXplPSsyPk9iamVjdCBPdmVybGF5IDwvRk9OVD48L0I+PC9URD48L1RSPgotICA8VFIgYmdDb2xvcj0jZmZmZmZmPgotICAgIDxURD4xPC9URD4KLSAgICA8VEQ+Jm5ic3A7Y3VycmVudDwvVEQ+Ci0gICAgPFREPjxmb250IHNpemU9Ii0xIj5jdXJyZW50X2NvJm5ic3A7PC9mb250PjwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+Jm5ic3A7aW5kaWNhdGVzIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gaXMgY3VycmVudCBpLmUuIGluCi0gICAgICBlZmZlY3Q8L0ZPTlQ+PC9URD4KLSAgICA8VEQ+PElNRyBoZWlnaHQ9OCBhbHQ9IiIgCi0gICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL292cjE2L2N1cnJlbnRfY28uZ2lmIiB3aWR0aD03IGJvcmRlcj0wPjwvVEQ+Ci0gICAgPFREIGJnQ29sb3I9I2ZmZmZmZj4KLSAgICAgIDxJTUcgaGVpZ2h0PTggYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL292cjE2L2N1cnJlbnRfY28uZ2lmIiB3aWR0aD03IGJvcmRlcj0wPgotICAgICAgPFA+PC9QPjwvVEQ+Ci0gICAgPFREPiA8L1REPjwvVFI+Ci0gIDxUUiBiZ0NvbG9yPSNkZmRmYj4KLSAgICA8VEQ+MjwvVEQ+Ci0gICAgPFREPiZuYnNwO2Vycm9yPC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT5lcnJvcl9jbyZuYnNwOzwvRk9OVD48L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPndpbGwgYmUgb3ZlcmxheWVkIG92ZXIgUERFIGVkaXRvciBvYmplY3RzIHRoYXQgYXJlIAotICAgICAgc29tZWhvdyBhc3NvY2lhdGVkIHdpdGggWE1MIHN5bnRheCBvciB2YWxpZGF0aW9uIGVycm9ycyZuYnNwOzwvRk9OVD48L1REPgotICAgIDxURD48SU1HIGhlaWdodD04IGFsdD0iIiAKLSAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvb3ZyMTYvZXJyb3JfY28uZ2lmIiB3aWR0aD03IGJvcmRlcj0wPjwvVEQ+Ci0gICAgPFREIGJnQ29sb3I9I2ZmZmZmZj4KLSAgICAgIDxJTUcgaGVpZ2h0PTggYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL292cjE2L2Vycm9yX2NvLmdpZiIgd2lkdGg9NyBib3JkZXI9MD4KLSAgICAgIDxQPjwvUD48L1REPgotICAgIDxURD4gPC9URD48L1RSPgotICA8VFIgYmdDb2xvcj0jZmZmZmZmPgotICAgIDxURD4zPC9URD4KLSAgICA8VEQ+Jm5ic3A7aW5zdGFsbGFibGU8L1REPgotICAgIDxURD48Zm9udCBzaXplPSItMSI+aW5zdGFsbGFibGVfY28mbmJzcDs8L2ZvbnQ+PC9URD4KLSAgICA8VEQ+PGZvbnQgc2l6ZT0iLTEiPmluZGljYXRlcyB0aGF0IHNpdGUgY2FuIGFjY2VwdCBmZWF0dXJlcyBkdXJpbmcKLSAgICAgIGluc3RhbGxhdGlvbjwvZm9udD48L1REPgotICAgIDxURD48SU1HIGhlaWdodD04IGFsdD0iIiAKLSAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvb3ZyMTYvaW5zdGFsbGFibGVfY28uZ2lmIiB3aWR0aD03IGJvcmRlcj0wPjwvVEQ+Ci0gICAgPFREIGJnQ29sb3I9I2ZmZmZmZj4KLSAgICAgIDxJTUcgaGVpZ2h0PTggYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL292cjE2L2luc3RhbGxhYmxlX2NvLmdpZiIgd2lkdGg9NyBib3JkZXI9MD4KLSAgICAgIDxQPjwvUD48L1REPgotICAgIDxURD4gPC9URD48L1RSPgotICA8VFIgYmdDb2xvcj0jZGZkZmI+Ci0gICAgPFREPjQ8L1REPgotICAgIDxURD4mbmJzcDtsaW5rZWQ8L1REPgotICAgIDxURD48Zm9udCBzaXplPSItMSI+bGlua2VkX2NvJm5ic3A7PC9mb250PjwvVEQ+Ci0gICAgPFREPjxmb250IHNpemU9Ii0xIj5pbmRpY2F0ZXMgdGhhdCB0aGUgc2l0ZSBpcyBvbmx5IGxpbmtlZCB0byB0aGUKLSAgICAgIGNvbmZpZ3VyYXRpb248L2ZvbnQ+PC9URD4KLSAgICA8VEQ+PElNRyBoZWlnaHQ9MTAgYWx0PSIiIAotICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9vdnIxNi9saW5rZWRfY28uZ2lmIiB3aWR0aD0xMSBib3JkZXI9MD48L1REPgotICAgIDxURCBiZ0NvbG9yPSNmZmZmZmY+Ci0gICAgICA8SU1HIGhlaWdodD04IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9vdnIxNi9saW5rZWRfY28uZ2lmIiB3aWR0aD03IGJvcmRlcj0wPgotICAgICAgPFA+PC9QPjwvVEQ+Ci0gICAgPFREPiA8L1REPjwvVFI+Ci0gICAgPFRSIGJnQ29sb3I9I2ZmZmZmZj4KLSAgICA8VEQ+NTwvVEQ+Ci0gICAgPFREPnVuY29uZmlndXJlZDwvVEQ+Ci0gICAgPFREPjxmb250IHNpemU9Ii0xIj51bmNvbmZpZ3VyZWRfY28mbmJzcDs8L2ZvbnQ+PC9URD4KLSAgICA8VEQ+PGZvbnQgc2l6ZT0iLTEiPiAgICAgIAotICAgICAgPC9mb250PjwvVEQ+Ci0gICAgPFREPjwvVEQ+Ci0gICAgPFREIGJnQ29sb3I9I2ZmZmZmZj4KLSAgICAgIDxQPjwvUD48SU1HIGhlaWdodD04IGFsdD0iIiBzcmM9Imljb25zL2Z1bGwvb3ZyMTYvdW5jb25maWd1cmVkX2NvLmdpZiIgCi0gICAgICB3aWR0aD03IGJvcmRlcj0wPjwvVEQ+Ci0gICAgPFREPiA8L1REPjwvVFI+Ci0JCi0gIAotICAKLSAgPHRyIGJnQ29sb3I9I2NjY2NjYz4KLSAgICA8VEQgY29sU3Bhbj03PjxiPjxmb250IHNpemU9IisyIj5Gb3JtcyBBcnR3b3JrPC9mb250PjwvYj48L1REPgotICA8L3RyPgotICA8dHI+Ci0gICAgPFREPjE8L1REPgotICAgIDxURD4mbmJzcDtUb3BpYzwvVEQ+Ci0gICAgPFREPjxmb250IHNpemU9Ii0xIj50b3BpYyZuYnNwOzwvZm9udD48L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPiZuYnNwO2FuIGltYWdlIHRvIGJlIHVzZWQgYXMgYSBjdXN0b20gYnVsbGV0IGZvciBpdGVtcyBpbgotICAgICAgYSAnV2VsY29tZScgcGFnZTwvRk9OVD48L1REPgotICAgIDxURD48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL2Zvcm1zL3RvcGljLmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+PC9URD4KLSAgICA8VEQgYmdDb2xvcj0jZmZmZmZmPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9mb3Jtcy90b3BpYy5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPjwvVEQ+Ci0gICAgPFREPiA8L1REPgotICA8L3RyPgotICA8dHIgYmdDb2xvcj0jZGZkZmI+Ci0gICAgPFREPjI8L1REPgotICAgIDxURD5EZWZhdWx0IFByb3ZpZGVyPC9URD4KLSAgICA8VEQ+PGZvbnQgc2l6ZT0iLTEiPmRlZl9wcm92aWRlciZuYnNwOzwvZm9udD48L1REPgotICAgIDxURD48Zm9udCBzaXplPSItMSI+YW4gaW1hZ2UgdG8gYmUgdXNlZCBpbiBhIGZlYXR1cmUgZGVzY3JpcHRpb24gcGFnZSBpbiAKLSAgICAgIGNhc2VzIHdoZXJlIG9uZSB3YXMgbm90IHN1cHBsaWVkIGJ5IGZlYXR1cmUgcHJvdmlkZXIgKHNob3VsZCBiZSBKUEVHKTxJTUcgCi0gICAgICBoZWlnaHQ9NDggYWx0PSIiIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvZm9ybXMvZGVmX3Byb3ZpZGVyLmdpZiIgd2lkdGg9MTA5IAotICAgICAgYm9yZGVyPTA+ICAgICAgICAgIAotICAgICAgICAgICAgICAgICA8L2ZvbnQ+PC9URD4KLSAgICA8VEQ+PC9URD4KLSAgICA8VEQgYmdDb2xvcj0jZmZmZmZmPjxJTUcgaGVpZ2h0PTE1MCBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvZm9ybXMvZGVmX3Byb3ZpZGVyLmdpZiIgd2lkdGg9MTkwIGJvcmRlcj0wPiZuYnNwOzwvVEQ+Ci0gICAgPFREPiA8L1REPgotICA8L3RyPgotICA8dHI+Ci0gICAgPFREPjM8L1REPgotICAgIDxURD4mbmJzcDtGb3JtIEJhbm5lcjwvVEQ+Ci0gICAgPFREPjxmb250IHNpemU9Ii0xIj5mb3JtX2Jhbm5lciZuYnNwOzwvZm9udD48L1REPgotICAgIDxURD48Zm9udCBzaXplPSItMSI+YSBiYW5uZXIgaW1hZ2UgdXNlZCBpbiBhbGwgZm9ybSBwYWdlcyBiZWhpbmQgdGhlIGhlYWRpbmcKLSAgICAgIChzaG93biBoZXJlIGluIDE6MTAgem9vbSBvdXQpPC9mb250PjwvVEQ+Ci0gICAgPFREPjxJTUcgaGVpZ2h0PTMgYWx0PSIiIAotICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9mb3Jtcy9mb3JtX2Jhbm5lci5naWYiIHdpZHRoPTYwIGJvcmRlcj0wPjwvVEQ+Ci0gICAgPFREIGJnQ29sb3I9I2ZmZmZmZj4mbmJzcDsKLSAgICAgIDxQPjwvUD48L1REPgotICAgIDxURD4gPC9URD4KLSAgPC90cj4KLSAgPHRyIGJnQ29sb3I9I2RmZGZiPgotICAgIDxURD40PC9URD4KLSAgICA8VEQ+Jm5ic3A7Rm9ybSBCYW5uZXIgVW5kZXJsaW5lPC9URD4KLSAgICA8VEQ+PGZvbnQgc2l6ZT0iLTEiPmZvcm1fdW5kZXJsaW5lJm5ic3A7PC9mb250PjwvVEQ+Ci0gICAgPFREPjxmb250IHNpemU9Ii0xIj5hIHNlY29uZCBwb3J0aW9uIG9mIHRoZSBiYW5uZXIgdXNlZCB1bmRlciB0aGUgaGVhZGluZwotICAgICAgdGV4dCAoc2hvd24gaGVyZSBpbiAxOjEwIHpvb20gb3V0KTwvZm9udD48L1REPgotICAgIDxURD48SU1HIGhlaWdodD0xIGFsdD0iIiAKLSAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvZm9ybXMvZm9ybV91bmRlcmxpbmUuZ2lmIiB3aWR0aD02MCBib3JkZXI9MD48L1REPgotICAgIDxURCBiZ0NvbG9yPSNmZmZmZmY+Jm5ic3A7Ci0gICAgICA8UD48L1A+PC9URD4KLSAgICA8VEQ+IDwvVEQ+Ci0gIDwvdHI+Ci0gIAotICAKLSAgCi0gIAotICA8VFIgYmdDb2xvcj0jY2NjY2NjPgotICAgIDxURCBjb2xTcGFuPTc+PEI+PEZPTlQgc2l6ZT0rMj5XaXphcmQgR3JhcGhpYzwvRk9OVD48L0I+PC9URD48L1RSPgotICA8VFIgYmdDb2xvcj0jZmZmZmZmPgotICAgIDxURD4xPC9URD4KLSAgICA8VEQ+TmV3IEJvb2ttYXJrIHdpemFyZDwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+Jm5ic3A7bmV3X2Jvb2ttYXJrX3dpejwvRk9OVD48L1REPgotICAgIDxURD48Zm9udCBzaXplPSItMSI+Y3JlYXRlcyBhIG5ldyB1cGRhdGUgc2l0ZSBib29rbWFyazwvZm9udD48L1REPgotICAgIDxURD48SU1HIGhlaWdodD01OCBhbHQ9IiIgCi0gICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL3dpemJhbi9uZXdfYm9va21hcmtfd2l6LmdpZiIgCi0gICAgICB3aWR0aD03NSBib3JkZXI9MD48L1REPgotICAgIDxURCBiZ0NvbG9yPSNmZmZmZmY+PElNRyBoZWlnaHQ9NTggYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL3dpemJhbi9uZXdfYm9va21hcmtfd2l6LmdpZiIgd2lkdGg9NzUgYm9yZGVyPTA+Jm5ic3A7PC9URD4KLSAgICA8VEQ+IDwvVEQ+PC9UUj4KLSAgPFRSIGJnQ29sb3I9I2RmZGZiPgotICAgIDxURD4yPC9URD4KLSAgICA8VEQ+TmV3IEZvbGRlciB3aXphcmQ8L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPiZuYnNwO25ld19mb2xkZXJfd2l6PC9GT05UPjwvVEQ+Ci0gICAgPFREPjxmb250IHNpemU9Ii0xIj5jcmVhdGVzIGEgbmV3IGJvb2ttYXJrIGZvbGRlcjwvZm9udD48L1REPgotICAgIDxURD48SU1HIGhlaWdodD01OCBhbHQ9IiIgCi0gICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL3dpemJhbi9uZXdfZm9sZGVyX3dpei5naWYiIAotICAgICAgd2lkdGg9NzUgYm9yZGVyPTA+PC9URD4KLSAgICA8VEQgYmdDb2xvcj0jZmZmZmZmPjxJTUcgaGVpZ2h0PTU4IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC93aXpiYW4vbmV3X2ZvbGRlcl93aXouZ2lmIiB3aWR0aD03NSBib3JkZXI9MD4mbmJzcDs8L1REPgotICAgIDxURD4gPC9URD48L1RSPgotICA8VFIgYmdDb2xvcj0jZmZmZmZmPgotICAgIDxURD4zPC9URD4KLSAgICA8VEQ+TmV3IFNlYXJjaCB3aXphcmQ8L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPiZuYnNwO25ld19zZWFyY2hfd2l6PC9GT05UPjwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+Y3JlYXRlcyBhIG5ldyBzZWFyY2ggb2JqZWN0PC9GT05UPjwvVEQ+Ci0gICAgPFREPjxJTUcgaGVpZ2h0PTU4IGFsdD0iIiAKLSAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvd2l6YmFuL25ld19zZWFyY2hfd2l6LmdpZiIgCi0gICAgICB3aWR0aD03NSBib3JkZXI9MD48L1REPgotICAgIDxURCBiZ0NvbG9yPSNmZmZmZmY+PElNRyBoZWlnaHQ9NTggYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL3dpemJhbi9uZXdfc2VhcmNoX3dpei5naWYiIHdpZHRoPTc1IGJvcmRlcj0wPiZuYnNwOzwvVEQ+Ci0gICAgPFREPiA8L1REPjwvVFI+Ci0gIDxUUiBiZ0NvbG9yPSNkZmRmYj4KLSAgICA8VEQ+NDwvVEQ+Ci0gICAgPFREPkluc3RhbGwgRmVhdHVyZSB3aXphcmQ8L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPiZuYnNwO2luc3RhbGxfd2l6PC9GT05UPjwvVEQ+Ci0gICAgPFREPjxmb250IHNpemU9Ii0xIj5pbnN0YWxscyBhIG5ldyBmZWF0dXJlIGludG8gdGhlIHBsYXRmb3JtPC9mb250PjwvVEQ+Ci0gICAgPFREPjxJTUcgaGVpZ2h0PTU4IGFsdD0iIiAKLSAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvd2l6YmFuL2luc3RhbGxfd2l6LmdpZiIgCi0gICAgICB3aWR0aD03NSBib3JkZXI9MD48L1REPgotICAgIDxURCBiZ0NvbG9yPSNmZmZmZmY+PElNRyBoZWlnaHQ9NTggYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL3dpemJhbi9pbnN0YWxsX3dpei5naWYiIHdpZHRoPTc1IGJvcmRlcj0wPiZuYnNwOzwvVEQ+Ci0gICAgPFREPiA8L1REPjwvVFI+Ci0gIDxUUiBiZ0NvbG9yPSNmZmZmZmY+Ci0gICAgPFREID41PC9URD4KLSAgICA8VEQ+VXBkYXRlIEZlYXR1cmUgd2l6YXJkPC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4mbmJzcDt1cGRhdGVfd2l6PC9GT05UPjwvVEQ+Ci0gICAgPFREPjxmb250IHNpemU9Ii0xIj5pbnN0YWxscyBhIG5ld2VyIHZlcnNpb24gb2YgYW4gYWxyZWFkeSBpbnN0YWxsZWQgZmVhdHVyZTwvZm9udD48L1REPgotICAgIDxURD48SU1HIGhlaWdodD01OCBhbHQ9IiIgCi0gICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL3dpemJhbi91cGRhdGVfd2l6LmdpZiIgCi0gICAgICB3aWR0aD03NSBib3JkZXI9MD48L1REPgotICAgIDxURCBiZ0NvbG9yPSNmZmZmZmY+PElNRyBoZWlnaHQ9NTggYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL3dpemJhbi91cGRhdGVfd2l6LmdpZiIgd2lkdGg9NzUgYm9yZGVyPTA+Jm5ic3A7PC9URD4KLSAgICA8VEQ+IDwvVEQ+PC9UUj4KLSAgPFRSIGJnQ29sb3I9I2RmZGZiPgotICAgIDxURCA+NjwvVEQ+Ci0gICAgPFREPkNvbmZpZ3VyZSBGZWF0dXJlIHdpemFyZDwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+Jm5ic3A7Y29uZmlnX3dpejwvRk9OVD48L1REPgotICAgIDxURD48Zm9udCBzaXplPSItMSI+Y29uZmlndXJlcyBvciB1bmNvbmZpZ3VyZXMgYW4gaW5zdGFsbGVkIGZlYXR1cmU8L2ZvbnQ+PC9URD4KLSAgICA8VEQ+PElNRyBoZWlnaHQ9NTggYWx0PSIiIAotICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC93aXpiYW4vY29uZmlnX3dpei5naWYiIAotICAgICAgd2lkdGg9NzUgYm9yZGVyPTA+PC9URD4KLSAgICA8VEQgYmdDb2xvcj0jZmZmZmZmPjxJTUcgaGVpZ2h0PTU4IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC93aXpiYW4vY29uZmlnX3dpei5naWYiIHdpZHRoPTc1IGJvcmRlcj0wPiZuYnNwOzwvVEQ+Ci0gICAgPFREPiA8L1REPjwvVFI+Ci0gIDxUUj4KLSAgICA8VEQ+NzwvVEQ+Ci0gICAgPFREPlVuaW5zdGFsbCBGZWF0dXJlIHdpemFyZDwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+Jm5ic3A7dW5pbnN0YWxsX3dpejwvRk9OVD48L1REPgotICAgIDxURD48Zm9udCBzaXplPSItMSI+cGVybWFuZW50bHkgcmVtb3ZlcyBhIGZlYXR1cmUgZnJvbSB0aGUgcGxhdGZvcm08L2ZvbnQ+PC9URD4KLSAgICA8VEQ+PElNRyBoZWlnaHQ9NTggYWx0PSIiIAotICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC93aXpiYW4vdW5pbnN0YWxsX3dpei5naWYiIAotICAgICAgd2lkdGg9NzUgYm9yZGVyPTA+PC9URD4KLSAgICA8VEQgYmdDb2xvcj0jZmZmZmZmPjxJTUcgaGVpZ2h0PTU4IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC93aXpiYW4vdW5pbnN0YWxsX3dpei5naWYiIHdpZHRoPTc1IGJvcmRlcj0wPiZuYnNwOzwvVEQ+Ci0gICAgPFREPiA8L1REPjwvVFI+Ci0gIDxUUiBiZ0NvbG9yPSNkZmRmYj4KLSAgICA8VEQ+ODwvVEQ+Ci0gICAgPFREPkRlZmF1bHQgSW5zdGFsbCBXaXphcmQgYmFubmVyPC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4mbmJzcDtkZWZfd2l6YmFuPC9GT05UPjwvVEQ+Ci0gICAgPFREPjxmb250IHNpemU9Ii0xIj5hIGRlZmF1bHQgaW1hZ2Ugc2hvd24gaW4gaW5zdGFsbCB3aXphcmQgcGFnZXMgd2hlbiAKLSAgICAgIG9uZSBpcyBub3Qgc3VwcGxpZWQgYnkgZmVhdHVyZSBwcm92aWRlcnM8SU1HIGhlaWdodD0yNTggYWx0PSIiIAotICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC93aXpiYW4vZGVmX3dpemJhbi5qcGciIHdpZHRoPTExOCAKLWJvcmRlcj0wPiAgICAgICAgIAotICAgICAgICAgICA8L2ZvbnQ+PC9URD4KLSAgICA8VEQ+PC9URD4KLSAgICA8VEQgYmdDb2xvcj0jZmZmZmZmPjxJTUcgaGVpZ2h0PTI1OCBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvd2l6YmFuL2RlZl93aXpiYW4uanBnIiB3aWR0aD0xMTggYm9yZGVyPTA+Jm5ic3A7PC9URD4KLSAgICA8VEQ+IDwvVEQ+PC9UUj48L1RBQkxFPgotPFA+PC9QPjwvQk9EWT48L0hUTUw+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2Fib3V0Lmh0bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkYjQxMWEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPjIwdGggSnVuZSwgMjAwMjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci08cD5FY2xpcHNlLm9yZyBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtDUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBDUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIENQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08aDM+Q29udHJpYnV0aW9uczwvaDM+Ci0KLTxwPklmIHRoaXMgQ29udGVudCBpcyBsaWNlbnNlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBDUEwsIGFueSBDb250cmlidXRpb25zLCBhcyBkZWZpbmVkIGluIHRoZSBDUEwsIHVwbG9hZGVkLCBzdWJtaXR0ZWQsIG9yIG90aGVyd2lzZQotbWFkZSBhdmFpbGFibGUgdG8gRWNsaXBzZS5vcmcsIG1lbWJlcnMgb2YgRWNsaXBzZS5vcmcgYW5kL29yIHRoZSBob3N0IG9mIEVjbGlwc2Uub3JnIHdlYiBzaXRlLCBieSB5b3UgdGhhdCByZWxhdGUgdG8gc3VjaAotQ29udGVudCBhcmUgcHJvdmlkZWQgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBDUEwgYW5kIGNhbiBiZSBtYWRlIGF2YWlsYWJsZSB0byBvdGhlcnMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDUEwuPC9wPgotCi08cD5JZiB0aGlzIENvbnRlbnQgaXMgbGljZW5zZWQgdG8geW91IHVuZGVyIGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgb3RoZXIgdGhhbiB0aGUgQ1BMICgmcXVvdDtPdGhlciBMaWNlbnNlJnF1b3Q7KSwgYW55IG1vZGlmaWNhdGlvbnMsIGVuaGFuY2VtZW50cyBhbmQvb3IKLW90aGVyIGNvZGUgYW5kL29yIGRvY3VtZW50YXRpb24gKCZxdW90O01vZGlmaWNhdGlvbnMmcXVvdDspIHVwbG9hZGVkLCBzdWJtaXR0ZWQsIG9yIG90aGVyd2lzZSBtYWRlIGF2YWlsYWJsZSB0byBFY2xpcHNlLm9yZywgbWVtYmVycyBvZiBFY2xpcHNlLm9yZyBhbmQvb3IgdGhlCi1ob3N0IG9mIEVjbGlwc2Uub3JnLCBieSB5b3UgdGhhdCByZWxhdGUgdG8gc3VjaCBDb250ZW50IGFyZSBwcm92aWRlZCB1bmRlciB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgT3RoZXIgTGljZW5zZSBhbmQgY2FuIGJlIG1hZGUgYXZhaWxhYmxlCi10byBvdGhlcnMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPdGhlciBMaWNlbnNlLiAgSW4gYWRkaXRpb24sIHdpdGggcmVnYXJkIHRvIE1vZGlmaWNhdGlvbnMgZm9yIHdoaWNoIHlvdSBhcmUgdGhlIGNvcHlyaWdodCBob2xkZXIsIHlvdSBhcmUgYWxzbwotcHJvdmlkaW5nIHRoZSBNb2RpZmljYXRpb25zIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ1BMIGFuZCBzdWNoIE1vZGlmaWNhdGlvbnMgY2FuIGJlIG1hZGUgYXZhaWxhYmxlIHRvIG90aGVycyB1bmRlciB0aGUgdGVybXMgb2YKLXRoZSBDUEwuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9idWlsZC5wcm9wZXJ0aWVzIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTBiZDFhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotIyANCi0jIENvbnRyaWJ1dG9yczoNCi0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotYmluLmluY2x1ZGVzID0gcGx1Z2luLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIGljb25zLyxcDQotICAgICAgICAgICAgICAgKi5qYXIsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXA0KLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXA0KLSAgICAgICAgICAgICAgIHdlYmFwcC8NCi1qYXJzLmNvbXBpbGUub3JkZXIgPSB1cGRhdGV1aS5qYXIsXA0KLSAgICAgICAgICAgICAgICAgICAgIHdlYmFwcC9XRUItSU5GL2xpYi91cGRhdGUtc2VydmxldHMuamFyDQotc3JjLmluY2x1ZGVzID0gYWJvdXQuaHRtbCxcDQotICAgICAgICAgICAgICAgc2NoZW1hLw0KLXNvdXJjZS51cGRhdGV1aS5qYXIgPSBzcmMvDQotc291cmNlLndlYmFwcC9XRUItSU5GL2xpYi91cGRhdGUtc2VydmxldHMuamFyID0gc3JjX3dlYmFwcA0KLWphcnMuZXh0cmEuY2xhc3NwYXRoID0gLi4vb3JnLmVjbGlwc2UudG9tY2F0L3NlcnZsZXQuamFyDQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL2NsY2wxNi9iYWNrd2FyZF9uYXYuZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL2NsY2wxNi9iYWNrd2FyZF9uYXYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDA0MTliLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9jbGNsMTYvYmFja3dhcmRfbmF2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9jbGNsMTYvZm9yd2FyZF9uYXYuZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL2NsY2wxNi9mb3J3YXJkX25hdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMTUxMWQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL2NsY2wxNi9mb3J3YXJkX25hdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvY2xjbDE2L2dvX25hdi5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvY2xjbDE2L2dvX25hdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiMjBkODguLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL2NsY2wxNi9nb19uYXYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL2NsY2wxNi9ob21lX25hdi5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvY2xjbDE2L2hvbWVfbmF2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ5YzJkYi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvY2xjbDE2L2hvbWVfbmF2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9jbGNsMTYvcmVmcmVzaF9uYXYuZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL2NsY2wxNi9yZWZyZXNoX25hdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwNjNjMjMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL2NsY2wxNi9yZWZyZXNoX25hdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvY2xjbDE2L3Nob3dfdW5jb25mLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9jbGNsMTYvc2hvd191bmNvbmYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Yzc1ZjU1Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9jbGNsMTYvc2hvd191bmNvbmYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL2NsY2wxNi9zdG9wX25hdi5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvY2xjbDE2L3N0b3BfbmF2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGViNTNlYy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvY2xjbDE2L3N0b3BfbmF2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2NvbmZpZ193aXouZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL2N0b29sMTYvY29uZmlnX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwNDI0NjAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL2N0b29sMTYvY29uZmlnX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9pbnN0YWxsX3dpei5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9pbnN0YWxsX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NWVmZmEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL2N0b29sMTYvaW5zdGFsbF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3X2Jvb2ttYXJrX3dpei5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXdfYm9va21hcmtfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTcwN2I4ZS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXdfYm9va21hcmtfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld19mb2xkZXJfd2l6LmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld19mb2xkZXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk2MTFmOS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXdfZm9sZGVyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXdfc2VhcmNoX3dpei5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXdfc2VhcmNoX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhMzM4OWUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3X3NlYXJjaF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL2N0b29sMTYvdW5pbnN0YWxsX3dpei5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi91bmluc3RhbGxfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDMwNmZjYi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi91bmluc3RhbGxfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9jdG9vbDE2L3VwZGF0ZV93aXouZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL2N0b29sMTYvdXBkYXRlX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2NmE0OGEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL2N0b29sMTYvdXBkYXRlX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvY3ZpZXcxNi9icm93c2VyLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9jdmlldzE2L2Jyb3dzZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTgwNDU0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9jdmlldzE2L2Jyb3dzZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL2N2aWV3MTYvY29uZmlncy5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvY3ZpZXcxNi9jb25maWdzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZjMGFkOC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvY3ZpZXcxNi9jb25maWdzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9jdmlldzE2L2ZlYXR1cmVzcmNfcmVzdWx0LmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9jdmlldzE2L2ZlYXR1cmVzcmNfcmVzdWx0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY5NzNjZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvY3ZpZXcxNi9mZWF0dXJlc3JjX3Jlc3VsdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvY3ZpZXcxNi9wcmV2aWV3LmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9jdmlldzE2L3ByZXZpZXcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWE5OTEzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9jdmlldzE2L3ByZXZpZXcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL2N2aWV3MTYvc2VsZWN0ZWRfdXBkYXRlcy5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvY3ZpZXcxNi9zZWxlY3RlZF91cGRhdGVzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdhMmRhNC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvY3ZpZXcxNi9zZWxlY3RlZF91cGRhdGVzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9jdmlldzE2L3VwZGF0ZV9wZXJzLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9jdmlldzE2L3VwZGF0ZV9wZXJzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWViODhmYS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvY3ZpZXcxNi91cGRhdGVfcGVycy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvY3ZpZXcxNi91cGRhdGVzLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9jdmlldzE2L3VwZGF0ZXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjE1YjhiLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9jdmlldzE2L3VwZGF0ZXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL2RsY2wxNi9iYWNrd2FyZF9uYXYuZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL2RsY2wxNi9iYWNrd2FyZF9uYXYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjE3OWFkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9kbGNsMTYvYmFja3dhcmRfbmF2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9kbGNsMTYvZm9yd2FyZF9uYXYuZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL2RsY2wxNi9mb3J3YXJkX25hdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjNWFmMDguLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL2RsY2wxNi9mb3J3YXJkX25hdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvZGxjbDE2L2dvX25hdi5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvZGxjbDE2L2dvX25hdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MmYwMDUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL2RsY2wxNi9nb19uYXYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL2RsY2wxNi9ob21lX25hdi5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvZGxjbDE2L2hvbWVfbmF2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M4MDA4MC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvZGxjbDE2L2hvbWVfbmF2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9kbGNsMTYvcmVmcmVzaF9uYXYuZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL2RsY2wxNi9yZWZyZXNoX25hdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMjgxYjQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL2RsY2wxNi9yZWZyZXNoX25hdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvZGxjbDE2L3Nob3dfdW5jb25mLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9kbGNsMTYvc2hvd191bmNvbmYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTNmNDk4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9kbGNsMTYvc2hvd191bmNvbmYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL2RsY2wxNi9zdG9wX25hdi5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvZGxjbDE2L3N0b3BfbmF2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YwZjliOS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvZGxjbDE2L3N0b3BfbmF2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9kdG9vbDE2L2NvbmZpZ193aXouZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL2R0b29sMTYvY29uZmlnX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljNjg2OGMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL2R0b29sMTYvY29uZmlnX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9pbnN0YWxsX3dpei5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9pbnN0YWxsX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ZWJmYTguLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL2R0b29sMTYvaW5zdGFsbF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL2R0b29sMTYvbmV3X2Jvb2ttYXJrX3dpei5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9uZXdfYm9va21hcmtfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFlMzE3Yi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9uZXdfYm9va21hcmtfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9kdG9vbDE2L25ld19mb2xkZXJfd2l6LmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9kdG9vbDE2L25ld19mb2xkZXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE4MzJiOS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9uZXdfZm9sZGVyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9uZXdfc2VhcmNoX3dpei5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9uZXdfc2VhcmNoX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxM2Q1NjguLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL2R0b29sMTYvbmV3X3NlYXJjaF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL2R0b29sMTYvdW5pbnN0YWxsX3dpei5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi91bmluc3RhbGxfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRhNTMwMi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi91bmluc3RhbGxfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9kdG9vbDE2L3VwZGF0ZV93aXouZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL2R0b29sMTYvdXBkYXRlX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2MTNlNDIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL2R0b29sMTYvdXBkYXRlX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvZWxjbDE2L2JhY2t3YXJkX25hdi5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvZWxjbDE2L2JhY2t3YXJkX25hdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1MTg4YjcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL2VsY2wxNi9iYWNrd2FyZF9uYXYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL2VsY2wxNi9jb2xsYXBzZWFsbC5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvZWxjbDE2L2NvbGxhcHNlYWxsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJjN2NhMi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvZWxjbDE2L2NvbGxhcHNlYWxsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9lbGNsMTYvZm9yd2FyZF9uYXYuZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL2VsY2wxNi9mb3J3YXJkX25hdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMjhlZTEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL2VsY2wxNi9mb3J3YXJkX25hdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvZWxjbDE2L2dvX25hdi5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvZWxjbDE2L2dvX25hdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ODMzMjcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL2VsY2wxNi9nb19uYXYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL2VsY2wxNi9ob21lX25hdi5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvZWxjbDE2L2hvbWVfbmF2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYyYmE4Ni4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvZWxjbDE2L2hvbWVfbmF2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9lbGNsMTYvcmVmcmVzaF9uYXYuZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL2VsY2wxNi9yZWZyZXNoX25hdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxOTQyM2QuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL2VsY2wxNi9yZWZyZXNoX25hdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvZWxjbDE2L3Nob3dfdW5jb25mLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9lbGNsMTYvc2hvd191bmNvbmYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGYzODFhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9lbGNsMTYvc2hvd191bmNvbmYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL2VsY2wxNi9zdG9wX25hdi5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvZWxjbDE2L3N0b3BfbmF2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTUxOWY0NC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvZWxjbDE2L3N0b3BfbmF2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9ldG9vbDE2L2NvbmZpZ193aXouZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL2V0b29sMTYvY29uZmlnX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2ZWU1YWUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL2V0b29sMTYvY29uZmlnX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9pbnN0YWxsX3dpei5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9pbnN0YWxsX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxYTZjODguLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL2V0b29sMTYvaW5zdGFsbF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL2V0b29sMTYvbmV3X2Jvb2ttYXJrX3dpei5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9uZXdfYm9va21hcmtfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNjNWJmMy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9uZXdfYm9va21hcmtfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9ldG9vbDE2L25ld19mb2xkZXJfd2l6LmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9ldG9vbDE2L25ld19mb2xkZXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDUzNjhiZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9uZXdfZm9sZGVyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9uZXdfc2VhcmNoX3dpei5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9uZXdfc2VhcmNoX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMWM5MGUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL2V0b29sMTYvbmV3X3NlYXJjaF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL2V0b29sMTYvdW5pbnN0YWxsX3dpei5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi91bmluc3RhbGxfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjUxZDU1MC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi91bmluc3RhbGxfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9ldG9vbDE2L3VwZGF0ZV93aXouZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL2V0b29sMTYvdXBkYXRlX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlMmQ3OGUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL2V0b29sMTYvdXBkYXRlX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvZXZpZXcxNi9icm93c2VyLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9ldmlldzE2L2Jyb3dzZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWY2OWQwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9ldmlldzE2L2Jyb3dzZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL2V2aWV3MTYvY29uZmlncy5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvZXZpZXcxNi9jb25maWdzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNiMDkwZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvZXZpZXcxNi9jb25maWdzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9ldmlldzE2L2ZlYXR1cmVzcmNfcmVzdWx0LmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9ldmlldzE2L2ZlYXR1cmVzcmNfcmVzdWx0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY5YmVkYy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvZXZpZXcxNi9mZWF0dXJlc3JjX3Jlc3VsdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvZXZpZXcxNi9wcmV2aWV3LmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9ldmlldzE2L3ByZXZpZXcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjVmOTk3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9ldmlldzE2L3ByZXZpZXcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL2V2aWV3MTYvc2VsZWN0ZWRfdXBkYXRlcy5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvZXZpZXcxNi9zZWxlY3RlZF91cGRhdGVzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGEwNWFkNi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvZXZpZXcxNi9zZWxlY3RlZF91cGRhdGVzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9ldmlldzE2L3VwZGF0ZV9wZXJzLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9ldmlldzE2L3VwZGF0ZV9wZXJzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI4MTY3My4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvZXZpZXcxNi91cGRhdGVfcGVycy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvZXZpZXcxNi91cGRhdGVzLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9ldmlldzE2L3VwZGF0ZXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDFjYjQwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9ldmlldzE2L3VwZGF0ZXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL2Zvcm1zL2RlZl9wcm92aWRlci5qcGcgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvZm9ybXMvZGVmX3Byb3ZpZGVyLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQzY2JlYi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvZm9ybXMvZGVmX3Byb3ZpZGVyLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9mb3Jtcy9mb3JtX2Jhbm5lci5qcGcgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvZm9ybXMvZm9ybV9iYW5uZXIuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTNlMmQyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9mb3Jtcy9mb3JtX2Jhbm5lci5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvZm9ybXMvZm9ybV91bmRlcmxpbmUuanBnIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL2Zvcm1zL2Zvcm1fdW5kZXJsaW5lLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZmM2QwYi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvZm9ybXMvZm9ybV91bmRlcmxpbmUuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL2Zvcm1zL3RvcGljLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9mb3Jtcy90b3BpYy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwMTM3ZTkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL2Zvcm1zL3RvcGljLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9vYmoxNi9hcHBfb2JqLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9vYmoxNi9hcHBfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIzYTNjOC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvb2JqMTYvYXBwX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvb2JqMTYvYmZvbGRlcl9vYmouZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL29iajE2L2Jmb2xkZXJfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRhMzgyZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvb2JqMTYvYmZvbGRlcl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL29iajE2L2NhdGVnb3J5X29iai5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvb2JqMTYvY2F0ZWdvcnlfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY0N2RmNS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvb2JqMTYvY2F0ZWdvcnlfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9vYmoxNi9jZF9vYmouZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL29iajE2L2NkX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3YjIzNzAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL29iajE2L2NkX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvb2JqMTYvY29tcHV0ZXJfb2JqLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9vYmoxNi9jb21wdXRlcl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWMyMGJhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9vYmoxNi9jb21wdXRlcl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL29iajE2L2NvbmZpZ19vYmouZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL29iajE2L2NvbmZpZ19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWQ2MTQ4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9vYmoxNi9jb25maWdfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9vYmoxNi9lZml4Ml9vYmouZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL29iajE2L2VmaXgyX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyMzVhYTUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL29iajE2L2VmaXgyX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvb2JqMTYvZWZpeF9vYmouZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL29iajE2L2VmaXhfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmEwODk4MS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvb2JqMTYvZWZpeF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL29iajE2L2VzaXRlX29iai5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvb2JqMTYvZXNpdGVfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhiZDBmMS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvb2JqMTYvZXNpdGVfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9vYmoxNi9mZWF0dXJlX29iai5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvb2JqMTYvZmVhdHVyZV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGY2NmYxLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9vYmoxNi9mZWF0dXJlX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvb2JqMTYvZmxvcHB5X29iai5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvb2JqMTYvZmxvcHB5X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMWEwNGIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL29iajE2L2Zsb3BweV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL29iajE2L2hpc3Rvcnlfb2JqLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9vYmoxNi9oaXN0b3J5X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmNjJmNjUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL29iajE2L2hpc3Rvcnlfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9vYmoxNi9sc2l0ZV9vYmouZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL29iajE2L2xzaXRlX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxNDM2OTUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL29iajE2L2xzaXRlX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvb2JqMTYvbm90aW5zdGFsbGVkX2ZlYXR1cmVfb2JqLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9vYmoxNi9ub3RpbnN0YWxsZWRfZmVhdHVyZV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2RiODk5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9vYmoxNi9ub3RpbnN0YWxsZWRfZmVhdHVyZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL29iajE2L3BsYWNlc19vYmouZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL29iajE2L3BsYWNlc19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTM0Njk4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9vYmoxNi9wbGFjZXNfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9vYmoxNi9wc2VhcmNoX29iai5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvb2JqMTYvcHNlYXJjaF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Njc2OWVkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9vYmoxNi9wc2VhcmNoX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvb2JqMTYvcHNpdGVfb2JqLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9vYmoxNi9wc2l0ZV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDQ2YzI5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9vYmoxNi9wc2l0ZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL29iajE2L3NhdmVkX29iai5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvb2JqMTYvc2F2ZWRfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE3YmM2MS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvb2JqMTYvc2F2ZWRfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9vYmoxNi9zaXRlX29iai5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvb2JqMTYvc2l0ZV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDE2MDhiLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9vYmoxNi9zaXRlX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvb2JqMTYvdHNlYXJjaF9vYmouZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL29iajE2L3RzZWFyY2hfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTEyNmU4YS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvb2JqMTYvdHNlYXJjaF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL29iajE2L3VuY29uZl9mZWF0dXJlX29iai5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvb2JqMTYvdW5jb25mX2ZlYXR1cmVfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ5NTNlMy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvb2JqMTYvdW5jb25mX2ZlYXR1cmVfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9vYmoxNi91cGRhdGVzX29iai5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvb2JqMTYvdXBkYXRlc19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzIzMzJjLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9vYmoxNi91cGRhdGVzX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvb2JqMTYvdXNlYXJjaF9vYmouZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL29iajE2L3VzZWFyY2hfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI0YTMzNC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvb2JqMTYvdXNlYXJjaF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL29iajE2L3ZmaXhlZF9vYmouZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL29iajE2L3ZmaXhlZF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDg0YTk5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9vYmoxNi92Zml4ZWRfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9vYmoxNi92cmVtb3RlX29iai5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvb2JqMTYvdnJlbW90ZV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWFjYmM3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9vYmoxNi92cmVtb3RlX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvb2JqMTYvdnJlbW92YWJsZV9vYmouZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL29iajE2L3ZyZW1vdmFibGVfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM4OTkxNy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvb2JqMTYvdnJlbW92YWJsZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL29iajE2L3dlYl9ia21ya19vYmouZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL29iajE2L3dlYl9ia21ya19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTdjY2NiLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9vYmoxNi93ZWJfYmttcmtfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9vdnIxNi9hZGRfc3RhdC5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvb3ZyMTYvYWRkX3N0YXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTgxMTU2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9vdnIxNi9hZGRfc3RhdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvb3ZyMTYvY3VycmVudF9jby5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvb3ZyMTYvY3VycmVudF9jby5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3OTQ5NDMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL292cjE2L2N1cnJlbnRfY28uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL292cjE2L2RlbF9zdGF0LmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9vdnIxNi9kZWxfc3RhdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhNTQyOWEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL292cjE2L2RlbF9zdGF0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9vdnIxNi9lcnJvcl9jby5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvb3ZyMTYvZXJyb3JfY28uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjEyZWFmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9vdnIxNi9lcnJvcl9jby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvb3ZyMTYvaW5zdGFsbGFibGVfY28uZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL292cjE2L2luc3RhbGxhYmxlX2NvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY2M2Q1Yy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvb3ZyMTYvaW5zdGFsbGFibGVfY28uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL292cjE2L2xpbmtlZF9jby5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvb3ZyMTYvbGlua2VkX2NvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY1YzhmNi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvb3ZyMTYvbGlua2VkX2NvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9vdnIxNi9tb2RfY28uZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL292cjE2L21vZF9jby5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3YjI1YzQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL292cjE2L21vZF9jby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvb3ZyMTYvdW5jb25maWd1cmVkX2NvLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9vdnIxNi91bmNvbmZpZ3VyZWRfY28uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTNmN2IwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9vdnIxNi91bmNvbmZpZ3VyZWRfY28uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL292cjE2L3VwZGF0ZWRfY28uZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL292cjE2L3VwZGF0ZWRfY28uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDBhMzdmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9vdnIxNi91cGRhdGVkX2NvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9vdnIxNi93YXJuaW5nX2NvLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC9vdnIxNi93YXJuaW5nX2NvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FmMjI4Yy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvb3ZyMTYvd2FybmluZ19jby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2NvbmZpZ193aXouZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL3dpemJhbi9jb25maWdfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE1OWFlMy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2NvbmZpZ193aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL3dpemJhbi9kZWZfd2l6YmFuLmpwZyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC93aXpiYW4vZGVmX3dpemJhbi5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMmE1MDQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL3dpemJhbi9kZWZfd2l6YmFuLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC93aXpiYW4vaW5zdGFsbF93aXouZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL3dpemJhbi9pbnN0YWxsX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5YjZjMDQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL3dpemJhbi9pbnN0YWxsX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL25ld19ib29rbWFya193aXouZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL3dpemJhbi9uZXdfYm9va21hcmtfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMyNDdkNC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL25ld19ib29rbWFya193aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL3dpemJhbi9uZXdfZm9sZGVyX3dpei5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL25ld19mb2xkZXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDkzY2QxNi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL25ld19mb2xkZXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC93aXpiYW4vbmV3X3NlYXJjaF93aXouZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL3dpemJhbi9uZXdfc2VhcmNoX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjNzA5NTQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL3dpemJhbi9uZXdfc2VhcmNoX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL3VuaW5zdGFsbF93aXouZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL3dpemJhbi91bmluc3RhbGxfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZkOTZjOC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Z1bGwvd2l6YmFuL3VuaW5zdGFsbF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL3dpemJhbi91cGRhdGVfd2l6LmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZnVsbC93aXpiYW4vdXBkYXRlX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1OWZkMjUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mdWxsL3dpemJhbi91cGRhdGVfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvcGx1Z2luLnByb3BlcnRpZXMgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDJiNjU2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSMgDQotIyBDb250cmlidXRvcnM6DQotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMNCi0jIFVwZGF0ZSBVSSBwbHVnaW4ueG1sIHJlc291cmNlcw0KLSMNCi1wbHVnaW5OYW1lID0gSW5zdGFsbC9VcGRhdGUgVUkNCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZw0KLWZyYWdtZW50TmFtZVdpbiA9IEluc3RhbGwvVXBkYXRlIFVJIGZvciBXaW5kb3dzDQotDQotdXBkYXRlTWVudS5sYWJlbCA9ICZTb2Z0d2FyZSBVcGRhdGVzDQotYWN0aW9uU2V0cy5zb2Z0d2FyZVVwZGF0ZXMubGFiZWwgPSBTb2Z0d2FyZSBVcGRhdGVzDQotYWN0aW9uU2V0cy5uZXdVcGRhdGVzLmxhYmVsID0gJk5ldyBVcGRhdGVzDQotYWN0aW9uU2V0cy5wZW5kaW5nQ2hhbmdlcy5sYWJlbCA9ICZQZW5kaW5nIENoYW5nZXMuLi4NCi1hY3Rpb25TZXRzLnVwZGF0ZU1hbmFnZXIubGFiZWwgPSAmVXBkYXRlIE1hbmFnZXINCi0NCi1zZWFyY2hDYXRlZ29yeS5uYW1lID0gU2VhcmNoIENhdGVnb3J5DQotc2VhcmNoQ2F0ZWdvcmllcy51cGRhdGVzID0gQXZhaWxhYmxlIFVwZGF0ZXMNCi1zZWFyY2hDYXRlZ29yaWVzLnVwZGF0ZXMuZGVzYyA9IDxmb3JtPjxwPlNlYXJjaCBmb3IgdXBkYXRlcyB0byBcDQotZmVhdHVyZXMgY3VycmVudGx5IGluc3RhbGxlZCBpbiB0aGlzIGFwcGxpY2F0aW9uLiBVcGRhdGVzIGFyZSBcDQotZmVhdHVyZXMgdGhhdCBoYXZlIHRoZSBzYW1lIGlkZW50aWZpZXIgYXMgdGhlIGluc3RhbGxlZCBmZWF0dXJlcywgXA0KLWJ1dCBuZXdlciB2ZXJzaW9ucy48L3A+XA0KLTxwPlVzZSBzY29wZSBzZXR0aW5ncyB0byBjb250cm9sIHRoZSBcDQotZXh0ZW50IG9mIHRoZSBzZWFyY2ggYW5kIHRoZSB1cGRhdGUgc2l0ZXMgdGhhdCB3aWxsIGJlIHZpc2l0ZWQuPC9wPlwNCi08cD5Ob3RlIHRoYXQgdGhlIHNldHRpbmdzIGluIDxiPlByZWZlcmVuY2VzPC9iPiBhZmZlY3Qgd2hldGhlciB0aGUgbmV3IGZlYXR1cmUgXA0KLXZlcnNpb25zIHdpbGwgYmUgY29uc2lkZXJlZCB2YWxpZCBhcyB1cGRhdGVzLjwvcD48L2Zvcm0+DQotDQotc2VhcmNoQ2F0ZWdvcmllcy5leHByZXNzaW9uID0gUmVndWxhciBFeHByZXNzaW9ucw0KLXNlYXJjaENhdGVnb3JpZXMuZXhwcmVzc2lvbi5kZXNjID0gPGZvcm0+PHA+U2VhcmNoIGZvciBmZWF0dXJlcyB0aGF0IFwNCi1jb250YWluIGRlc2lyZWQgdGV4dCBvciByZXF1bGFyIGV4cHJlc3Npb24uIFVzZSB0aGUgcXVlcnkgc2V0dGluZ3MgXA0KLXRvIGNvbmZpZ3VyZSBzZWFyY2ggb3B0aW9ucy48L3A+PC9mb3JtPg0KLQ0KLXNlYXJjaENhdGVnb3JpZXMucGx1Z2luID0gUGx1Zy1pbnMgaW4gRmVhdHVyZXMNCi1zZWFyY2hDYXRlZ29yaWVzLnBsdWdpbi5kZXNjID0gPGZvcm0+PHA+TG9vayBmb3IgcGx1Zy1pbnMgdGhhdCBcDQotYXJlIHBhY2thZ2VkIGluIHRoZSBmZWF0dXJlcy4gVGhpcyBzZWFyY2ggY2F0ZWdvcnkgaXMgdXNlZnVsIFwNCi13aGVuIHJlcXVpcmVkIHBsdWctaW5zIG9mIHRoZSBmZWF0dXJlIHlvdSB3YW50ZWQgdG8gaW5zdGFsbCBcDQotd2VyZSBub3QgZm91bmQgaW4gdGhpcyBhcHBsaWNhdGlvbi48L3A+PC9mb3JtPg0KLQ0KLW1haW5QcmVmZXJlbmNlLm5hbWUgPSBJbnN0YWxsL1VwZGF0ZQ0KLWFwcFNlcnZlclByZWZlcmVuY2UubmFtZSA9IFdlYi10cmlnZ2VyZWQgVXBkYXRlcw0KLQ0KLXZpZXdzLmNhdGVnb3J5LmxhYmVsID0gVXBkYXRlIE1hbmFnZXINCi12aWV3cy51cGRhdGVzLmxhYmVsID0gRmVhdHVyZSBVcGRhdGVzDQotdmlld3MuY29uZmlndXJhdGlvbi5sYWJlbCA9IEluc3RhbGwgQ29uZmlndXJhdGlvbg0KLXZpZXdzLnByZXZpZXcubGFiZWwgPSBQcmV2aWV3DQotdmlld3Mud2ViQnJvd3Nlci5sYWJlbCA9IEV4dGVybmFsIFByZXZpZXcNCi12aWV3cy5zZWFyY2hSZXN1bHRzLmxhYmVsID0gRmVhdHVyZSBTZWFyY2ggUmVzdWx0cw0KLXZpZXdzLnVwZGF0ZUl0ZW1zLmxhYmVsID0gU2VsZWN0ZWQgVXBkYXRlcw0KLXBlcnNwZWN0aXZlLmxhYmVsID0gSW5zdGFsbC9VcGRhdGUNCi1wcm9wZXJ0aWVzLnNpdGUubGFiZWwgPSBTaXRlIEluZm8NCi1wcm9wZXJ0aWVzLmZvbGRlci5sYWJlbCA9IEZvbGRlciBJbmZvDQotcHJvcGVydGllcy5zZWFyY2gubGFiZWwgPSBTZWFyY2ggSW5mbw0KLXByb3BlcnRpZXMuY29uZmlndXJhdGlvbi5sYWJlbCA9IENvbmZpZ3VyYXRpb24NCi1wcm9wZXJ0aWVzLnByZXNlcnZlZC5sYWJlbCA9IFByZXNlcnZlZCBDb25maWd1cmF0aW9uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9wbHVnaW4ueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTgwYmE4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwbHVnaW4NCi0gICBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLnVpIg0KLSAgIG5hbWU9IiVwbHVnaW5OYW1lIg0KLSAgIHZlcnNpb249IjIuMS4yIg0KLSAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiDQotICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSSI+DQotDQotICAgPHJ1bnRpbWU+DQotICAgICAgPGxpYnJhcnkgbmFtZT0idXBkYXRldWkuamFyIj4NCi0gICAgICAgICA8ZXhwb3J0IG5hbWU9IioiLz4NCi0gICAgICAgICA8cGFja2FnZXMgcHJlZml4ZXM9Im9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aSIvPg0KLSAgICAgIDwvbGlicmFyeT4NCi0gICA8L3J1bnRpbWU+DQotICAgPHJlcXVpcmVzPg0KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4NCi0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4NCi0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUiLz4NCi0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zIi8+DQotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzIi8+DQotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5hcGFjaGUueGVyY2VzIi8+DQotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmhlbHAuYXBwc2VydmVyIi8+DQotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmhlbHAiLz4NCi0gICA8L3JlcXVpcmVzPg0KLQ0KLQ0KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9InNlYXJjaENhdGVnb3J5IiBuYW1lPSIlc2VhcmNoQ2F0ZWdvcnkubmFtZSIgc2NoZW1hPSJzY2hlbWEvc2VhcmNoQ2F0ZWdvcnkuZXhzZCIvPg0KLQ0KLSAgIDxleHRlbnNpb24NCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuYWN0aW9uU2V0cyI+DQotICAgICAgPGFjdGlvblNldA0KLSAgICAgICAgICAgIGxhYmVsPSIlYWN0aW9uU2V0cy5zb2Z0d2FyZVVwZGF0ZXMubGFiZWwiDQotICAgICAgICAgICAgdmlzaWJsZT0idHJ1ZSINCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLnVpLnNvZnR3YXJlVXBkYXRlcyI+DQotICAgICAgICAgPG1lbnUNCi0gICAgICAgICAgICAgICBsYWJlbD0iJXVwZGF0ZU1lbnUubGFiZWwiDQotICAgICAgICAgICAgICAgcGF0aD0iaGVscC9oZWxwRW5kIg0KLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUudWkudXBkYXRlTWVudSI+DQotICAgICAgICAgICAgPHNlcGFyYXRvcg0KLSAgICAgICAgICAgICAgICAgIG5hbWU9Imdyb3VwMSI+DQotICAgICAgICAgICAgPC9zZXBhcmF0b3I+DQotICAgICAgICAgICAgPHNlcGFyYXRvcg0KLSAgICAgICAgICAgICAgICAgIG5hbWU9Imdyb3VwMiI+DQotICAgICAgICAgICAgPC9zZXBhcmF0b3I+DQotICAgICAgICAgPC9tZW51Pg0KLSAgICAgICAgIDxhY3Rpb24NCi0gICAgICAgICAgICAgICBsYWJlbD0iJWFjdGlvblNldHMubmV3VXBkYXRlcy5sYWJlbCINCi0gICAgICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL29iajE2L3VzZWFyY2hfb2JqLmdpZiINCi0gICAgICAgICAgICAgICBoZWxwQ29udGV4dElkPSJvcmcuZWNsaXBzZS51cGRhdGUudWkubmV3VXBkYXRlcyINCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLk5ld1VwZGF0ZXNBY3Rpb24iDQotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImhlbHAvb3JnLmVjbGlwc2UudXBkYXRlLnVpLnVwZGF0ZU1lbnUvZ3JvdXAxIg0KLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUudWkubmV3VXBkYXRlcyI+DQotICAgICAgICAgPC9hY3Rpb24+DQotICAgICAgICAgPGFjdGlvbg0KLSAgICAgICAgICAgICAgIGxhYmVsPSIlYWN0aW9uU2V0cy5wZW5kaW5nQ2hhbmdlcy5sYWJlbCINCi0gICAgICAgICAgICAgICBoZWxwQ29udGV4dElkPSJvcmcuZWNsaXBzZS51cGRhdGUudWkucGVuZGluZ0NoYW5nZXMiDQotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5EZWx0YVdpemFyZEFjdGlvbiINCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iaGVscC9vcmcuZWNsaXBzZS51cGRhdGUudWkudXBkYXRlTWVudS9ncm91cDIiDQotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS51aS5wZW5kaW5nQ2hhbmdlcyI+DQotICAgICAgICAgPC9hY3Rpb24+DQotICAgICAgICAgPGFjdGlvbg0KLSAgICAgICAgICAgICAgIGxhYmVsPSIlYWN0aW9uU2V0cy51cGRhdGVNYW5hZ2VyLmxhYmVsIg0KLSAgICAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvY3ZpZXcxNi91cGRhdGVfcGVycy5naWYiDQotICAgICAgICAgICAgICAgaGVscENvbnRleHRJZD0ib3JnLmVjbGlwc2UudXBkYXRlLnVpLnVwZGF0ZU1hbmFnZXIiDQotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVNYW5hZ2VyQWN0aW9uIg0KLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJoZWxwL29yZy5lY2xpcHNlLnVwZGF0ZS51aS51cGRhdGVNZW51L2dyb3VwMiINCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLnVpLnVwZGF0ZU1hbmFnZXIiPg0KLSAgICAgICAgIDwvYWN0aW9uPg0KLSAgICAgIDwvYWN0aW9uU2V0Pg0KLSAgIDwvZXh0ZW5zaW9uPg0KLSAgIDxleHRlbnNpb24NCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkudmlld3MiPg0KLSAgICAgIDxjYXRlZ29yeQ0KLSAgICAgICAgICAgIG5hbWU9IiV2aWV3cy5jYXRlZ29yeS5sYWJlbCINCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLnVpIj4NCi0gICAgICA8L2NhdGVnb3J5Pg0KLSAgICAgIDx2aWV3DQotICAgICAgICAgICAgbmFtZT0iJXZpZXdzLnVwZGF0ZXMubGFiZWwiDQotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9jdmlldzE2L3VwZGF0ZXMuZ2lmIg0KLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS51cGRhdGUudWkiDQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS52aWV3cy5VcGRhdGVzVmlldyINCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLnVpLlVwZGF0ZXNWaWV3Ij4NCi0gICAgICA8L3ZpZXc+DQotICAgICAgPHZpZXcNCi0gICAgICAgICAgICBuYW1lPSIldmlld3MuY29uZmlndXJhdGlvbi5sYWJlbCINCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2N2aWV3MTYvY29uZmlncy5naWYiDQotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnVwZGF0ZS51aSINCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnZpZXdzLkNvbmZpZ3VyYXRpb25WaWV3Ig0KLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUudWkuQ29uZmlndXJhdGlvblZpZXciPg0KLSAgICAgIDwvdmlldz4NCi0gICAgICA8dmlldw0KLSAgICAgICAgICAgIG5hbWU9IiV2aWV3cy5wcmV2aWV3LmxhYmVsIg0KLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvY3ZpZXcxNi9wcmV2aWV3LmdpZiINCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UudXBkYXRlLnVpIg0KLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkudmlld3MuRGV0YWlsc1ZpZXciDQotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS51aS5EZXRhaWxzVmlldyI+DQotICAgICAgPC92aWV3Pg0KLSAgICAgIDx2aWV3DQotICAgICAgICAgICAgbmFtZT0iJXZpZXdzLnNlYXJjaFJlc3VsdHMubGFiZWwiDQotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9jdmlldzE2L2ZlYXR1cmVzcmNfcmVzdWx0LmdpZiINCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UudXBkYXRlLnVpIg0KLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkudmlld3MuU2VhcmNoUmVzdWx0VmlldyINCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLnVpLlNlYXJjaFJlc3VsdHNWaWV3Ij4NCi0gICAgICA8L3ZpZXc+DQotICAgICAgPHZpZXcNCi0gICAgICAgICAgICBuYW1lPSIldmlld3MudXBkYXRlSXRlbXMubGFiZWwiDQotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9jdmlldzE2L3NlbGVjdGVkX3VwZGF0ZXMuZ2lmIg0KLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS51cGRhdGUudWkiDQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS52aWV3cy5TZWxlY3RlZFVwZGF0ZXNWaWV3Ig0KLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUudWkuSXRlbXNWaWV3Ij4NCi0gICAgICA8L3ZpZXc+DQotICAgPC9leHRlbnNpb24+DQotICAgPGV4dGVuc2lvbg0KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wZXJzcGVjdGl2ZXMiPg0KLSAgICAgIDxwZXJzcGVjdGl2ZQ0KLSAgICAgICAgICAgIG5hbWU9IiVwZXJzcGVjdGl2ZS5sYWJlbCINCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2N2aWV3MTYvdXBkYXRlX3BlcnMuZ2lmIg0KLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlUGVyc3BlY3RpdmUiDQotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS51aS5VcGRhdGVQZXJzcGVjdGl2ZSI+DQotICAgICAgPC9wZXJzcGVjdGl2ZT4NCi0gICA8L2V4dGVuc2lvbj4NCi0gICA8ZXh0ZW5zaW9uDQotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByb3BlcnR5UGFnZXMiPg0KLSAgICAgIDxwYWdlDQotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbC5TaXRlQm9va21hcmsiDQotICAgICAgICAgICAgbmFtZT0iJXByb3BlcnRpZXMuc2l0ZS5sYWJlbCINCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnByb3BlcnRpZXMuU2l0ZUJvb2ttYXJrUHJvcGVydHlQYWdlIg0KLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUudWkuc2l0ZVByb3BlcnR5UGFnZSI+DQotICAgICAgPC9wYWdlPg0KLSAgICAgIDxwYWdlDQotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLklJbnN0YWxsQ29uZmlndXJhdGlvbiINCi0gICAgICAgICAgICBuYW1lPSIlcHJvcGVydGllcy5jb25maWd1cmF0aW9uLmxhYmVsIg0KLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkucHJvcGVydGllcy5Db25maWd1cmF0aW9uUHJvcGVydHlQYWdlIg0KLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUudWkuY29uZmlnUHJvcGVydHlQYWdlIj4NCi0gICAgICA8L3BhZ2U+DQotICAgICAgPHBhZ2UNCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsLlByZXNlcnZlZENvbmZpZ3VyYXRpb24iDQotICAgICAgICAgICAgbmFtZT0iJXByb3BlcnRpZXMucHJlc2VydmVkLmxhYmVsIg0KLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkucHJvcGVydGllcy5Db25maWd1cmF0aW9uUHJvcGVydHlQYWdlIg0KLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUudWkuY29uZmlnUHJvcGVydHlQYWdlIj4NCi0gICAgICA8L3BhZ2U+DQotICAgICAgPHBhZ2UNCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsLkJvb2ttYXJrRm9sZGVyIg0KLSAgICAgICAgICAgIG5hbWU9IiVwcm9wZXJ0aWVzLmZvbGRlci5sYWJlbCINCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnByb3BlcnRpZXMuTmFtZWRPYmplY3RQcm9wZXJ0eVBhZ2UiDQotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb2xkZXJQcm9wZXJ0eVBhZ2UiPg0KLSAgICAgIDwvcGFnZT4NCi0gICAgICA8cGFnZQ0KLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuc2VhcmNoLlNlYXJjaE9iamVjdCINCi0gICAgICAgICAgICBuYW1lPSIlcHJvcGVydGllcy5zZWFyY2gubGFiZWwiDQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wcm9wZXJ0aWVzLlNlYXJjaE9iamVjdFByb3BlcnR5UGFnZSINCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLnVpLnNlYXJjaFByb3BlcnR5UGFnZSI+DQotICAgICAgPC9wYWdlPg0KLSAgIDwvZXh0ZW5zaW9uPg0KLSAgIDxleHRlbnNpb24NCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudXBkYXRlLnVpLnNlYXJjaENhdGVnb3J5Ij4NCi0gICAgICA8c2VhcmNoDQotICAgICAgICAgICAgbmFtZT0iJXNlYXJjaENhdGVnb3JpZXMudXBkYXRlcyINCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL29iajE2L3VzZWFyY2hfb2JqLmdpZiINCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnNlYXJjaC5VcGRhdGVzU2VhcmNoQ2F0ZWdvcnkiDQotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS51aS51cGRhdGVzIj4NCi0gICAgICAgICA8ZGVzY3JpcHRpb24+DQotICAgICAgICAgICAgJXNlYXJjaENhdGVnb3JpZXMudXBkYXRlcy5kZXNjDQotICAgICAgICAgPC9kZXNjcmlwdGlvbj4NCi0gICAgICA8L3NlYXJjaD4NCi0gICAgICA8c2VhcmNoDQotICAgICAgICAgICAgbmFtZT0iJXNlYXJjaENhdGVnb3JpZXMuZXhwcmVzc2lvbiINCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL29iajE2L3RzZWFyY2hfb2JqLmdpZiINCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnNlYXJjaC5FeHByZXNzaW9uU2VhcmNoQ2F0ZWdvcnkiDQotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS51aS5leHByZXNzaW9uIj4NCi0gICAgICAgICA8ZGVzY3JpcHRpb24+DQotICAgICAgICAgICAgJXNlYXJjaENhdGVnb3JpZXMuZXhwcmVzc2lvbi5kZXNjDQotICAgICAgICAgPC9kZXNjcmlwdGlvbj4NCi0gICAgICA8L3NlYXJjaD4NCi0gICAgICA8c2VhcmNoDQotICAgICAgICAgICAgbmFtZT0iJXNlYXJjaENhdGVnb3JpZXMucGx1Z2luIg0KLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvb2JqMTYvcHNlYXJjaF9vYmouZ2lmIg0KLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuc2VhcmNoLlBsdWdpbnNTZWFyY2hDYXRlZ29yeSINCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLnVpLnBsdWdpbnMiPg0KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICAgICAlc2VhcmNoQ2F0ZWdvcmllcy5wbHVnaW4uZGVzYw0KLSAgICAgICAgIDwvZGVzY3JpcHRpb24+DQotICAgICAgPC9zZWFyY2g+DQotICAgPC9leHRlbnNpb24+DQotICAgPGV4dGVuc2lvbg0KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMiPg0KLSAgICAgIDxwYWdlDQotICAgICAgICAgICAgbmFtZT0iJW1haW5QcmVmZXJlbmNlLm5hbWUiDQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5NYWluUHJlZmVyZW5jZVBhZ2UiDQotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5NYWluUHJlZmVyZW5jZVBhZ2UiPg0KLSAgICAgIDwvcGFnZT4NCi0gICAgICA8cGFnZQ0KLSAgICAgICAgICAgIG5hbWU9IiVhcHBTZXJ2ZXJQcmVmZXJlbmNlLm5hbWUiDQotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5NYWluUHJlZmVyZW5jZVBhZ2UiDQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5BcHBTZXJ2ZXJQcmVmZXJlbmNlUGFnZSINCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnByZWZlcmVuY2VzLkFwcFNlcnZlclByZWZlcmVuY2VQYWdlIj4NCi0gICAgICA8L3BhZ2U+DQotICAgPC9leHRlbnNpb24+DQotICAgPGV4dGVuc2lvbg0KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5kZWx0YUhhbmRsZXIiPg0KLSAgICAgIDxkaXNwbGF5DQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzLkluc3RhbGxEZWx0YVdpemFyZCI+DQotICAgICAgPC9kaXNwbGF5Pg0KLSAgIDwvZXh0ZW5zaW9uPg0KLSAgIDxleHRlbnNpb24NCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucGVyc3BlY3RpdmVFeHRlbnNpb25zIj4NCi0gICAgICA8cGVyc3BlY3RpdmVFeHRlbnNpb24NCi0gICAgICAgICAgICB0YXJnZXRJRD0ib3JnLmVjbGlwc2UudXBkYXRlLnVpLlVwZGF0ZVBlcnNwZWN0aXZlIj4NCi0gICAgICAgICA8dmlld1Nob3J0Y3V0DQotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS51aS5VcGRhdGVzVmlldyI+DQotICAgICAgICAgPC92aWV3U2hvcnRjdXQ+DQotICAgICAgICAgPHZpZXdTaG9ydGN1dA0KLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUudWkuQ29uZmlndXJhdGlvblZpZXciPg0KLSAgICAgICAgIDwvdmlld1Nob3J0Y3V0Pg0KLSAgICAgICAgIDx2aWV3U2hvcnRjdXQNCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLnVpLkRldGFpbHNWaWV3Ij4NCi0gICAgICAgICA8L3ZpZXdTaG9ydGN1dD4NCi0gICAgICAgICA8dmlld1Nob3J0Y3V0DQotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS51aS5TZWFyY2hSZXN1bHRzVmlldyI+DQotICAgICAgICAgPC92aWV3U2hvcnRjdXQ+DQotICAgICAgICAgPHZpZXdTaG9ydGN1dA0KLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUudWkuSXRlbXNWaWV3Ij4NCi0gICAgICAgICA8L3ZpZXdTaG9ydGN1dD4NCi0gICAgICA8L3BlcnNwZWN0aXZlRXh0ZW5zaW9uPg0KLSAgIDwvZXh0ZW5zaW9uPg0KLQ0KLTwvcGx1Z2luPg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc2NoZW1hL3NlYXJjaENhdGVnb3J5LmV4c2QgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NjaGVtYS9zZWFyY2hDYXRlZ29yeS5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmQ2NjI0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc2NoZW1hL3NlYXJjaENhdGVnb3J5LmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCi08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPg0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS51cGRhdGUudWkiPg0KLTxhbm5vdGF0aW9uPg0KLSAgIDxhcHBJbmZvPg0KLSAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLnVwZGF0ZS51aSIgaWQ9InNlYXJjaENhdGVnb3J5IiBuYW1lPSJTZWFyY2ggQ2F0ZWdvcnkiLz4NCi0gICA8L2FwcEluZm8+DQotICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgJmx0O2ImZ3Q7VGhpcyBpcyBhbiBpbnRlcm5hbCBleHRlbnNpb24gcG9pbnQgYW5kIGlzIG5vdCBzdXBwb3NlZCB0byBiZSB1c2VkIGJ5IHBsdWctaW5zIG90aGVyIHRoYW4gVXBkYXRlIFVJLiZsdDsvYiZndDsNCi0gICA8L2RvY3VtZW50YXRpb24+DQotPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InNlYXJjaCIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJzZWFyY2giPg0KLSAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9Im5hbWUiIGljb249Imljb24iLz4NCi0gICAgICAgICA8L2FwcEluZm8+DQotICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJkZXNjcmlwdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhpcyBzZWFyY2ggY2F0ZWdvcnkNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICB0cmFuc2xhdGFibGUgbmFtZSBvZiB0aGlzIHNlYXJjaCBjYXRlZ29yeQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBjbGFzcyB0aGF0IGltcGxlbWVudHMgCi0mbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuc2VhcmNoLklTZWFyY2hRdWVyeSZsdDsvc2FtcCZndDsuDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuc2VhcmNoLklTZWFyY2hDYXRlZ29yeSIvPg0KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpY29uIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGEgcmVsYXRpdmUgcGF0aCB0byB0aGUgaW1hZ2UgdGhhdCB3aWxsIGJlIHVzZWQgdG8gcmVwcmVzZW50Ci1pbnN0YW5jZXMgb2YgdGhpcyBzZWFyY2ggY2F0ZWdvcnkgaW4gdGhlIFVJLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICA8YXBwSW5mbz4NCi0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0icmVzb3VyY2UiLz4NCi0gICAgICAgICAgICAgICA8L2FwcEluZm8+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIGEgc2hvcnQgZGVzY3JpcHRpb24gb2YgdGhpcyBzZWFyY2ggY2F0ZWdvcnkNCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIA0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotPC9zY2hlbWE+DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL0RlbHRhV2l6YXJkQWN0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvRGVsdGFXaXphcmRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZmN2QzNC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvRGVsdGFXaXphcmRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5TaXRlTWFuYWdlcjsKLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQHNlZSBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUKLSAqLwotcHVibGljIGNsYXNzIERlbHRhV2l6YXJkQWN0aW9uIGltcGxlbWVudHMgSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlIHsKLQlwcml2YXRlIElXb3JrYmVuY2hXaW5kb3cgd2luZG93OwotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgRGVsdGFXaXphcmRBY3Rpb24oKSB7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotCSAqIEBzZWUgSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlI3J1bgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZSh3aW5kb3cuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQlTaXRlTWFuYWdlci5oYW5kbGVOZXdDaGFuZ2VzKCk7Ci0JCQkJfQotCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJVXBkYXRlVUkubG9nRXhjZXB0aW9uKGUpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotCSAqIEBzZWUgSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYXJnMCwgSVNlbGVjdGlvbiBhcmcxKSB7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotCSAqIEBzZWUgSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlI2Rpc3Bvc2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLQkgKiBAc2VlIElXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNpbml0Ci0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQl0aGlzLndpbmRvdyA9IHdpbmRvdzsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvTmV3VXBkYXRlc0FjdGlvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL05ld1VwZGF0ZXNBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RkMGIyNy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvTmV3VXBkYXRlc0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5zZWFyY2guKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkud2l6YXJkcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzLk5ld1VwZGF0ZXNXaXphcmQ7Ci0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIEBzZWUgSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdVcGRhdGVzQWN0aW9uIGltcGxlbWVudHMgSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1RJVExFID0gIk5ld1VwZGF0ZXMubm9VcGRhdGVzLnRpdGxlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX01FU1NBR0UgPSAiTmV3VXBkYXRlcy5ub1VwZGF0ZXMubWVzc2FnZSI7Ci0JSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3c7Ci0JU2VhcmNoT2JqZWN0IHNlYXJjaE9iamVjdDsKLQlJU2VhcmNoQ2F0ZWdvcnkgY2F0ZWdvcnk7Ci0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBOZXdVcGRhdGVzQWN0aW9uKCkgewotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgewotCQlzZWFyY2hPYmplY3QgPSBuZXcgRGVmYXVsdFVwZGF0ZXNTZWFyY2hPYmplY3QoKTsKLQkJU3RyaW5nIGNhdGVnb3J5SWQgPSBzZWFyY2hPYmplY3QuZ2V0Q2F0ZWdvcnlJZCgpOwotCQlTZWFyY2hDYXRlZ29yeURlc2NyaXB0b3IgZGVzYyA9Ci0JCQlTZWFyY2hDYXRlZ29yeVJlZ2lzdHJ5UmVhZGVyLmdldERlZmF1bHQoKS5nZXREZXNjcmlwdG9yKGNhdGVnb3J5SWQpOwotCQljYXRlZ29yeSA9IGRlc2MuY3JlYXRlQ2F0ZWdvcnkoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuCi0JICogQHNlZSBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUjcnVuCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCUJ1c3lJbmRpY2F0b3IKLQkJCS5zaG93V2hpbGUod2luZG93LmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJZG9SdW4oKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRvUnVuKCkgewotCQlpbml0aWFsaXplKCk7Ci0JCVByb2dyZXNzTW9uaXRvckRpYWxvZyBwbWQgPQotCQkJbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyh3aW5kb3cuZ2V0U2hlbGwoKSk7Ci0JCXRyeSB7Ci0JCQlwbWQucnVuKHRydWUsIHRydWUsIGdldE9wZXJhdGlvbigpKTsKLQkJCXNob3dSZXN1bHRzKCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCVVwZGF0ZVVJLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlUaHJvd2FibGUgdCA9IGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7Ci0JCQlpZiAodCBpbnN0YW5jZW9mIENvcmVFeGNlcHRpb24pIHsKLQkJCQlDb3JlRXhjZXB0aW9uIGNlID0gKENvcmVFeGNlcHRpb24pdDsKLQkJCQlJU3RhdHVzIHN0YXR1cyA9IGNlLmdldFN0YXR1cygpOwotCQkJCWlmIChzdGF0dXMhPW51bGwgJiYKLQkJCQkJc3RhdHVzLmdldENvZGUoKT09SVNpdGUuU0lURV9BQ0NFU1NfRVhDRVBUSU9OKSB7Ci0JCQkJCS8vIEp1c3Qgc2hvdyB0aGlzIGJ1dCBkbyBub3QgdGhyb3cgZXhjZXB0aW9uCi0JCQkJCS8vIGJlY2F1c2UgdGhlcmUgbWF5IGJlIHJlc3VsdHMgYW55d2F5LgotCQkJCQlzaG93Q29ubmVjdGlvbkVycm9ycyhzdGF0dXMpOwotCQkJCQlzaG93UmVzdWx0cygpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJVXBkYXRlVUkubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzaG93UmVzdWx0cygpIHsKLQkJaWYgKHNlYXJjaE9iamVjdC5oYXNDaGlsZHJlbigpKQotCQkJb3Blbk5ld1VwZGF0ZXNXaXphcmQoKTsKLQkJZWxzZQotCQkJc2hvd05vVXBkYXRlc01lc3NhZ2UoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNob3dDb25uZWN0aW9uRXJyb3JzKElTdGF0dXMgc3RhdHVzKSB7Ci0JCUVycm9yRGlhbG9nLm9wZW5FcnJvcih3aW5kb3cuZ2V0U2hlbGwoKSwKLQkJCVVwZGF0ZVVJLmdldFN0cmluZyhLRVlfVElUTEUpLAotCQkJbnVsbCwgCi0JCQlzdGF0dXMpOwotCX0JCQkKLQkJCQotCi0JcHJpdmF0ZSB2b2lkIHNob3dOb1VwZGF0ZXNNZXNzYWdlKCkgewotCQlNZXNzYWdlRGlhbG9nLm9wZW5JbmZvcm1hdGlvbigKLQkJCXdpbmRvdy5nZXRTaGVsbCgpLAotCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9USVRMRSksCi0JCQlVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX01FU1NBR0UpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgb3Blbk5ld1VwZGF0ZXNXaXphcmQoKSB7Ci0JCU5ld1VwZGF0ZXNXaXphcmQgd2l6YXJkID0gbmV3IE5ld1VwZGF0ZXNXaXphcmQoc2VhcmNoT2JqZWN0KTsKLQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBSZXNpemFibGVXaXphcmREaWFsb2cod2luZG93LmdldFNoZWxsKCksIHdpemFyZCk7Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJZGlhbG9nLmdldFNoZWxsKCkuc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX1RJVExFKSk7Ci0JCWRpYWxvZy5nZXRTaGVsbCgpLnNldFNpemUoNjAwLCA1MDApOwotCQlkaWFsb2cub3BlbigpOwotCQlpZiAod2l6YXJkLmlzU3VjY2Vzc2Z1bEluc3RhbGwoKSkKLQkJCVVwZGF0ZVVJLmluZm9ybVJlc3RhcnROZWVkZWQoKTsKLQl9Ci0KLQlwcml2YXRlIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBnZXRPcGVyYXRpb24oKSB7Ci0JCXJldHVybiBzZWFyY2hPYmplY3QuZ2V0U2VhcmNoT3BlcmF0aW9uKAotCQkJd2luZG93LmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLAotCQkJY2F0ZWdvcnkuZ2V0UXVlcmllcygpKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuCi0JICogQHNlZSBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotCSAqIEBzZWUgSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlI2Rpc3Bvc2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLQkgKiBAc2VlIElXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNpbml0Ci0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQl0aGlzLndpbmRvdyA9IHdpbmRvdzsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1BhdGNoQ2xlYW5lci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1BhdGNoQ2xlYW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2E4MjVmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9QYXRjaENsZWFuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotCi0vKioKLSAqIFRoaXMgdXRpbGl0eSBjbGFzcyBhdHRhY2hlcyBhcyBhIGxpc3RlbmVkIHRvIHRoZSBwcm92aWRlZAotICogY29uZmlndXJlZCBzaXRlLCBhbmQgZm9yIGV2ZXJ5IHVuY29uZmlndXJlZCBmZWF0dXJlIAotICogaXQgdGVzdHMgaWYgaXQgaXMgYSBwYXRjaCBhbmQgY2xlYW5zIHVwIGl0cyBiYWNrdXAgY29uZmlndXJhdGlvbi4KLSAqLwotCi1wdWJsaWMgY2xhc3MgUGF0Y2hDbGVhbmVyIHsKLQlwcml2YXRlIElDb25maWd1cmVkU2l0ZSBjc2l0ZTsKLQlwcml2YXRlIElGZWF0dXJlIHJvb3Q7Ci0JcHJpdmF0ZSBTaXRlTGlzdGVuZXIgbGlzdGVuZXI7Ci0JY2xhc3MgU2l0ZUxpc3RlbmVyIGltcGxlbWVudHMgSUNvbmZpZ3VyZWRTaXRlQ2hhbmdlZExpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgZmVhdHVyZUluc3RhbGxlZChJRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgZmVhdHVyZVJlbW92ZWQoSUZlYXR1cmUgZmVhdHVyZSkgewotCQkJY2xlYW5TYXZlZENvbmZpZ3MoZmVhdHVyZSk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZmVhdHVyZUNvbmZpZ3VyZWQoSUZlYXR1cmUgZmVhdHVyZSkgewotCQl9Ci0JCXB1YmxpYyB2b2lkIGZlYXR1cmVVbmNvbmZpZ3VyZWQoSUZlYXR1cmUgZmVhdHVyZSkgewotCQkJY2xlYW5TYXZlZENvbmZpZ3MoZmVhdHVyZSk7Ci0JCX0KLQl9Ci0JcHVibGljIFBhdGNoQ2xlYW5lcihJQ29uZmlndXJlZFNpdGUgY3NpdGUsIElGZWF0dXJlIHJvb3QpIHsKLQkJdGhpcy5jc2l0ZSA9IGNzaXRlOwotCQlsaXN0ZW5lciA9IG5ldyBTaXRlTGlzdGVuZXIoKTsKLQkJY3NpdGUuYWRkQ29uZmlndXJlZFNpdGVDaGFuZ2VkTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWNzaXRlLnJlbW92ZUNvbmZpZ3VyZWRTaXRlQ2hhbmdlZExpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIGNsZWFuU2F2ZWRDb25maWdzKElGZWF0dXJlIGZlYXR1cmUpIHsKLQkJaWYgKGZlYXR1cmUuaXNQYXRjaCgpKSB7Ci0JCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gYmFja3VwQ29uZmlnID0gVXBkYXRlVUkuZ2V0QmFja3VwQ29uZmlndXJhdGlvbkZvcihmZWF0dXJlKTsKLQkJCWlmIChiYWNrdXBDb25maWchPW51bGwpIHsKLQkJCQkvLyBjbGVhbiBpdAotCQkJCXJlbW92ZShiYWNrdXBDb25maWcpOwotCQkJfQotCQl9Ci0JfQotCXByaXZhdGUgdm9pZCByZW1vdmUoSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQl0cnkgewotCQkJSUxvY2FsU2l0ZSBsb2NhbFNpdGUgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsKLQkJCWxvY2FsU2l0ZS5yZW1vdmVGcm9tUHJlc2VydmVkQ29uZmlndXJhdGlvbnMoY29uZmlnKTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVXBkYXRlTGFiZWxQcm92aWRlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VwZGF0ZUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk4ZTBjNi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVXBkYXRlTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VwZGF0ZU1hbmFnZXJBY3Rpb24uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9VcGRhdGVNYW5hZ2VyQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0MmY4NWMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VwZGF0ZU1hbmFnZXJBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS4qOwotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBAc2VlIElXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZQotICovCi1wdWJsaWMgY2xhc3MgVXBkYXRlTWFuYWdlckFjdGlvbiBpbXBsZW1lbnRzIElXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSB7Ci0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBVcGRhdGVNYW5hZ2VyQWN0aW9uKCkgewotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLQkgKiBAc2VlIElXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNydW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJSVdvcmtiZW5jaFdpbmRvdyBjdXJyZW50V2luZG93ID0KLQkJCVVwZGF0ZVVJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQlJV29ya2JlbmNoUGFnZSBjdXJyZW50UGFnZSA9IGN1cnJlbnRXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotCi0JCWlmIChjdXJyZW50UGFnZSAhPSBudWxsCi0JCQkmJiBjdXJyZW50UGFnZS5nZXRQZXJzcGVjdGl2ZSgpLmdldElkKCkuZXF1YWxzKAotCQkJCVVwZGF0ZVBlcnNwZWN0aXZlLlBFUlNQRUNUSVZFX0lEKSkgewotCQkJZW5zdXJlQ3JpdGljYWxWaWV3c1Zpc2libGUoY3VycmVudFBhZ2UpOwotCQkJcmV0dXJuOwotCQl9Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0KLQkJCWN1cnJlbnRQYWdlICE9IG51bGwKLQkJCQk/IGN1cnJlbnRQYWdlLmdldFdvcmtiZW5jaFdpbmRvdygpCi0JCQkJOiBjdXJyZW50V2luZG93OwotCi0JCXRyeSB7Ci0JCQlJV29ya2JlbmNoUGFnZSB1cGRhdGVQYWdlID0KLQkJCQl3aW5kb3cuZ2V0V29ya2JlbmNoKCkuc2hvd1BlcnNwZWN0aXZlKAotCQkJCQlVcGRhdGVQZXJzcGVjdGl2ZS5QRVJTUEVDVElWRV9JRCwKLQkJCQkJd2luZG93KTsKLQkJCWVuc3VyZUNyaXRpY2FsVmlld3NWaXNpYmxlKHVwZGF0ZVBhZ2UpOwotCQl9IGNhdGNoIChXb3JrYmVuY2hFeGNlcHRpb24gZSkgewotCQkJVXBkYXRlVUkubG9nRXhjZXB0aW9uKGUsIHRydWUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGVuc3VyZUNyaXRpY2FsVmlld3NWaXNpYmxlKElXb3JrYmVuY2hQYWdlIHBhZ2UpIHsKLQkJZW5zdXJlVmlld1Zpc2libGUocGFnZSwgVXBkYXRlUGVyc3BlY3RpdmUuSURfSVRFTVMsIGZhbHNlKTsKLQkJZW5zdXJlVmlld1Zpc2libGUocGFnZSwgVXBkYXRlUGVyc3BlY3RpdmUuSURfVVBEQVRFUywgZmFsc2UpOwotCQllbnN1cmVWaWV3VmlzaWJsZShwYWdlLCBVcGRhdGVQZXJzcGVjdGl2ZS5JRF9ERVRBSUxTLCB0cnVlKTsKLQkJZW5zdXJlVmlld1Zpc2libGUocGFnZSwgVXBkYXRlUGVyc3BlY3RpdmUuSURfQ09ORklHVVJBVElPTiwgdHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGVuc3VyZVZpZXdWaXNpYmxlKElXb3JrYmVuY2hQYWdlIHBhZ2UsIFN0cmluZyB2aWV3SWQsIGJvb2xlYW4gdG9wKSB7Ci0JCXRyeSB7Ci0JCQlJVmlld1BhcnQgdmlldyA9IHBhZ2UuZmluZFZpZXcodmlld0lkKTsKLQkJCWlmICh2aWV3ID09IG51bGwpIHsKLQkJCQlwYWdlLnNob3dWaWV3KHZpZXdJZCk7Ci0JCQl9Ci0JCQllbHNlIGlmICh0b3ApIHsKLQkJCQlwYWdlLmJyaW5nVG9Ub3Aodmlldyk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCVVwZGF0ZVVJLmxvZ0V4Y2VwdGlvbihlLCB0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLQkgKiBAc2VlIElXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFyZzAsIElTZWxlY3Rpb24gYXJnMSkgewotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLQkgKiBAc2VlIElXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNkaXNwb3NlCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuCi0JICogQHNlZSBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUjaW5pdAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaFdpbmRvdyBhcmcwKSB7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VwZGF0ZVBlcnNwZWN0aXZlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVXBkYXRlUGVyc3BlY3RpdmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVmOGQ4YS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVXBkYXRlUGVyc3BlY3RpdmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS4qOwotCi1wdWJsaWMgY2xhc3MgVXBkYXRlUGVyc3BlY3RpdmUgaW1wbGVtZW50cyBJUGVyc3BlY3RpdmVGYWN0b3J5IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYID0gIm9yZy5lY2xpcHNlLnVwZGF0ZS51aS4iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNQRUNUSVZFX0lEID0gUFJFRklYICsgIlVwZGF0ZVBlcnNwZWN0aXZlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9VUERBVEVTID0gUFJFRklYICsgIlVwZGF0ZXNWaWV3IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9DT05GSUdVUkFUSU9OID0gUFJFRklYICsgIkNvbmZpZ3VyYXRpb25WaWV3IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9ERVRBSUxTID0gUFJFRklYICsgIkRldGFpbHNWaWV3IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9CUk9XU0VSID0gUFJFRklYICsgIldlYkJyb3dzZXIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX1NFQVJDSF9SRVNVTFRTID0gUFJFRklYICsgIlNlYXJjaFJlc3VsdHNWaWV3IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9JVEVNUyA9IFBSRUZJWCArICJJdGVtc1ZpZXciOwotCi0JcHVibGljIFVwZGF0ZVBlcnNwZWN0aXZlKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUluaXRpYWxMYXlvdXQoSVBhZ2VMYXlvdXQgZmFjdG9yeSkgewotCQlmYWN0b3J5LnNldEVkaXRvckFyZWFWaXNpYmxlKGZhbHNlKTsKLQkJSUZvbGRlckxheW91dCB1cHBlckZvbGRlciA9IGZhY3RvcnkuY3JlYXRlRm9sZGVyKCJ1cHBlciIsCi0JCQlJUGFnZUxheW91dC5MRUZULAotCQkJMC4zM2YsCi0JCQlmYWN0b3J5LmdldEVkaXRvckFyZWEoKSk7Ci0JCXVwcGVyRm9sZGVyLmFkZFZpZXcoSURfQ09ORklHVVJBVElPTik7Ci0JCXVwcGVyRm9sZGVyLmFkZFZpZXcoSURfSVRFTVMpOwotCQkKLQkJZmFjdG9yeS5hZGRWaWV3KElEX1VQREFURVMsIElQYWdlTGF5b3V0LkJPVFRPTSwgMC41ZiwgInVwcGVyIik7Ci0JCUlGb2xkZXJMYXlvdXQgZGV0YWlsc0ZvbGRlciA9IGZhY3RvcnkuY3JlYXRlRm9sZGVyKCJkZXRhaWxzIiwgSVBhZ2VMYXlvdXQuVE9QLCAwLjY3ZiwgZmFjdG9yeS5nZXRFZGl0b3JBcmVhKCkpOwotCQlkZXRhaWxzRm9sZGVyLmFkZFZpZXcoSURfREVUQUlMUyk7Ci0JCWlmIChTV1QuZ2V0UGxhdGZvcm0oKS5lcXVhbHMoIndpbjMyIikpCi0JCQlkZXRhaWxzRm9sZGVyLmFkZFBsYWNlaG9sZGVyKElEX0JST1dTRVIpOwotCQlmYWN0b3J5LmFkZFBsYWNlaG9sZGVyKElEX1NFQVJDSF9SRVNVTFRTLCBJUGFnZUxheW91dC5CT1RUT00sIDAuNjdmLCBJRF9ERVRBSUxTKTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVXBkYXRlVUkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9VcGRhdGVVSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODQxYzhjLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9VcGRhdGVVSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpOwotCi0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmJvb3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmhlbHAuaW50ZXJuYWwuYXBwc2VydmVyLldlYmFwcE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm1vZGVsLlNpdGVMb2NhbE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5mb3Jtcy5VcGRhdGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkucGFydHMuQWJvdXRJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5zZWN1cml0eS5VcGRhdGVNYW5hZ2VyQXV0aGVudGljYXRvcjsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIFVwZGF0ZVVJIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLnVwZGF0ZS51aSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX0FQUF9JRCA9ICJvcmcuZWNsaXBzZS51cGRhdGUiOwotCS8vVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBVcGRhdGVVSSBwbHVnaW47Ci0JLy9SZXNvdXJjZSBidW5kbGUuCi0JcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZTsKLQlwcml2YXRlIFVwZGF0ZUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OwotCXByaXZhdGUgVXBkYXRlTW9kZWwgbW9kZWw7Ci0JcHJpdmF0ZSBVcGRhdGVNYW5hZ2VyQXV0aGVudGljYXRvciBhdXRoZW50aWNhdG9yOwotCXByaXZhdGUgQWJvdXRJbmZvIGFib3V0SW5mbzsKLQlwcml2YXRlIFN0cmluZyBhcHBTZXJ2ZXJIb3N0OwotCXByaXZhdGUgaW50IGFwcFNlcnZlclBvcnQ7Ci0JcHJpdmF0ZSBVcGRhdGVMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIFVwZGF0ZVVJKElQbHVnaW5EZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJc3VwZXIoZGVzY3JpcHRvcik7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JCXRyeSB7Ci0JCQlyZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgib3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJUGx1Z2luUmVzb3VyY2VzIik7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB4KSB7Ci0JCQlyZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBVcGRhdGVVSSBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVdvcmtiZW5jaFBhZ2UgZ2V0QWN0aXZlUGFnZSgpIHsKLQkJcmV0dXJuIGdldERlZmF1bHQoKS5pbnRlcm5hbEdldEFjdGl2ZVBhZ2UoKTsKLQl9Ci0KLQlwcml2YXRlIElXb3JrYmVuY2hQYWdlIGludGVybmFsR2V0QWN0aXZlUGFnZSgpIHsKLQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBnZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJaWYgKHdpbmRvdyAhPSBudWxsKQotCQkJcmV0dXJuIHdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU2hlbGwgZ2V0QWN0aXZlV29ya2JlbmNoU2hlbGwoKSB7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCXJldHVybiB3aW5kb3cgIT0gbnVsbCA/IHdpbmRvdy5nZXRTaGVsbCgpIDogbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElXb3JrYmVuY2hXaW5kb3cgZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkgewotCQlyZXR1cm4gZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBsdWdpbklkKCkgewotCQlyZXR1cm4gZ2V0RGVmYXVsdCgpLmdldERlc2NyaXB0b3IoKS5nZXRVbmlxdWVJZGVudGlmaWVyKCk7Ci0JfQotCi0JcHVibGljIEFib3V0SW5mbyBnZXRBYm91dEluZm8oKSB7Ci0JCXJldHVybiBhYm91dEluZm87Ci0JfQotCi0JcHVibGljIFVwZGF0ZUxhYmVsUHJvdmlkZXIgZ2V0TGFiZWxQcm92aWRlcigpIHsKLQkJaWYgKGxhYmVsUHJvdmlkZXIgPT0gbnVsbCkKLQkJCWxhYmVsUHJvdmlkZXIgPSBuZXcgVXBkYXRlTGFiZWxQcm92aWRlcigpOwotCQlyZXR1cm4gbGFiZWxQcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3b3Jrc3BhY2UgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBJV29ya3NwYWNlIGdldFdvcmtzcGFjZSgpIHsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJpbmcgZnJvbSB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotCSAqIG9yICdrZXknIGlmIG5vdCBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQkJdHJ5IHsKLQkJCXJldHVybiBidW5kbGUuZ2V0U3RyaW5nKGtleSk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Rm9ybWF0dGVkTWVzc2FnZShTdHJpbmcga2V5LCBTdHJpbmdbXSBhcmdzKSB7Ci0JCVN0cmluZyB0ZXh0ID0gZ2V0U3RyaW5nKGtleSk7Ci0JCXJldHVybiBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdC5mb3JtYXQodGV4dCwgYXJncyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Rm9ybWF0dGVkTWVzc2FnZShTdHJpbmcga2V5LCBTdHJpbmcgYXJnKSB7Ci0JCVN0cmluZyB0ZXh0ID0gZ2V0U3RyaW5nKGtleSk7Ci0JCXJldHVybiBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdC5mb3JtYXQodGV4dCwgbmV3IFN0cmluZ1tdIHsgYXJnIH0pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0JCXJldHVybiByZXNvdXJjZUJ1bmRsZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGFydHVwKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlzdXBlci5zdGFydHVwKCk7Ci0JCXJlYWRJbmZvKCk7Ci0JCW1vZGVsID0gbmV3IFVwZGF0ZU1vZGVsKCk7Ci0JCW1vZGVsLnN0YXJ0dXAoKTsKLQkJSUFkYXB0ZXJNYW5hZ2VyIG1hbmFnZXIgPSBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpOwotCQlhZGFwdGVyRmFjdG9yeSA9IG5ldyBVcGRhdGVBZGFwdGVyRmFjdG9yeSgpOwotCQltYW5hZ2VyLnJlZ2lzdGVyQWRhcHRlcnMoYWRhcHRlckZhY3RvcnksIFVJTW9kZWxPYmplY3QuY2xhc3MpOwotCQlhdXRoZW50aWNhdG9yID0gbmV3IFVwZGF0ZU1hbmFnZXJBdXRoZW50aWNhdG9yKCk7Ci0JCUF1dGhlbnRpY2F0b3Iuc2V0RGVmYXVsdChhdXRoZW50aWNhdG9yKTsKLQkJaW50IGhpc3RvcnlQcmVmID0gZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRJbnQoTWFpblByZWZlcmVuY2VQYWdlLlBfSElTVE9SWV9TSVpFKTsKLQkJaWYgKGhpc3RvcnlQcmVmID4gMCkgewotCQkJU2l0ZUxvY2FsTW9kZWwuREVGQVVMVF9ISVNUT1JZID0gaGlzdG9yeVByZWY7Ci0JCX0KLQkJaWYgKEFwcFNlcnZlclByZWZlcmVuY2VQYWdlLmdldFVzZUFwcGxpY2F0aW9uU2VydmVyKCkpIHsKLQkJCXRyeSB7Ci0JCQkJc3RhcnRXZWJBcHAoKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCWxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHN0YXJ0V2ViQXBwKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCS8vIGNvbmZpZ3VyZSB3ZWIgaW5zdGFsbCBoYW5kbGVyCi0JCXRyeSB7Ci0JCQlXZWJhcHBNYW5hZ2VyLnN0YXJ0KFdFQl9BUFBfSUQsIFBMVUdJTl9JRCwgbmV3IFBhdGgoIndlYmFwcCIpKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlVcGRhdGVVSS5sb2dFeGNlcHRpb24oZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWFwcFNlcnZlckhvc3QgPSBXZWJhcHBNYW5hZ2VyLmdldEhvc3QoKTsKLQkJYXBwU2VydmVyUG9ydCA9IFdlYmFwcE1hbmFnZXIuZ2V0UG9ydCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3BXZWJBcHAoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQkvLyB1bmNvbmZpZ3VyZSB3ZWIgaW5zdGFsbCBoYW5kbGVyCi0JCQlXZWJhcHBNYW5hZ2VyLnN0b3AoV0VCX0FQUF9JRCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlhcHBTZXJ2ZXJIb3N0ID0gbnVsbDsKLQkJCWFwcFNlcnZlclBvcnQgPSAwOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNXZWJBcHBTdGFydGVkKCkgewotCQlyZXR1cm4gYXBwU2VydmVySG9zdCAhPSBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXBwU2VydmVySG9zdCgpIHsKLQkJcmV0dXJuIGFwcFNlcnZlckhvc3Q7Ci0JfQotCi0JcHVibGljIGludCBnZXRBcHBTZXJ2ZXJQb3J0KCkgewotCQlyZXR1cm4gYXBwU2VydmVyUG9ydDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzaHV0ZG93bigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSUFkYXB0ZXJNYW5hZ2VyIG1hbmFnZXIgPSBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpOwotCQltYW5hZ2VyLnVucmVnaXN0ZXJBZGFwdGVycyhhZGFwdGVyRmFjdG9yeSk7Ci0JCW1vZGVsLnNodXRkb3duKCk7Ci0JCVVwZGF0ZUNvbG9ycy5kaXNwb3NlQ29sb3JzKCk7Ci0JCWlmIChsYWJlbFByb3ZpZGVyICE9IG51bGwpCi0JCQlsYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJc3VwZXIuc2h1dGRvd24oKTsKLQotCX0KLQotCXB1YmxpYyBVcGRhdGVNb2RlbCBnZXRVcGRhdGVNb2RlbCgpIHsKLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oVGhyb3dhYmxlIGUpIHsKLQkJbG9nRXhjZXB0aW9uKGUsIHRydWUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oVGhyb3dhYmxlIGUsIGJvb2xlYW4gc2hvd0Vycm9yRGlhbG9nKSB7Ci0JCWlmIChlIGluc3RhbmNlb2YgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbikgewotCQkJZSA9ICgoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbikgZSkuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlJU3RhdHVzIHN0YXR1cyA9IG51bGw7Ci0JCWlmIChlIGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbikgewotCQkJc3RhdHVzID0gKChDb3JlRXhjZXB0aW9uKSBlKS5nZXRTdGF0dXMoKTsKLQkJfSBlbHNlIHsKLQkJCVN0cmluZyBtZXNzYWdlID0gZS5nZXRNZXNzYWdlKCk7Ci0JCQlpZiAobWVzc2FnZSA9PSBudWxsKQotCQkJCW1lc3NhZ2UgPSBlLnRvU3RyaW5nKCk7Ci0JCQlzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIGdldFBsdWdpbklkKCksIElTdGF0dXMuT0ssIG1lc3NhZ2UsIGUpOwotCQl9Ci0JCWxvZyhzdGF0dXMsIHNob3dFcnJvckRpYWxvZyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhJU3RhdHVzIHN0YXR1cywgYm9vbGVhbiBzaG93RXJyb3JEaWFsb2cpIHsKLQkJaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpICE9IElTdGF0dXMuSU5GTykgewotCQkJaWYgKHNob3dFcnJvckRpYWxvZykKLQkJCQlFcnJvckRpYWxvZy5vcGVuRXJyb3IoZ2V0QWN0aXZlV29ya2JlbmNoU2hlbGwoKSwgbnVsbCwgbnVsbCwgc3RhdHVzKTsKLQkJCS8vUmVzb3VyY2VzUGx1Z2luLmdldFBsdWdpbigpLmdldExvZygpLmxvZyhzdGF0dXMpOwotCQkJUGxhdGZvcm0uZ2V0UGx1Z2luKCJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiKS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLQkJfSBlbHNlIHsKLQkJCU1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKGdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCksIG51bGwsIHN0YXR1cy5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJRmVhdHVyZVtdIHNlYXJjaFNpdGUoU3RyaW5nIGZlYXR1cmVJZCwgSUNvbmZpZ3VyZWRTaXRlIHNpdGUsIGJvb2xlYW4gb25seUNvbmZpZ3VyZWQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSByZWZlcmVuY2VzID0gbnVsbDsKLQotCQlpZiAob25seUNvbmZpZ3VyZWQpCi0JCQlyZWZlcmVuY2VzID0gc2l0ZS5nZXRDb25maWd1cmVkRmVhdHVyZXMoKTsKLQkJZWxzZQotCQkJcmVmZXJlbmNlcyA9IHNpdGUuZ2V0U2l0ZSgpLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCVZlY3RvciByZXN1bHQgPSBuZXcgVmVjdG9yKCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZlcmVuY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJRmVhdHVyZSBmZWF0dXJlID0gcmVmZXJlbmNlc1tpXS5nZXRGZWF0dXJlKG51bGwpOwotCQkJU3RyaW5nIGlkID0gZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0SWRlbnRpZmllcigpOwotCQkJaWYgKGZlYXR1cmVJZC5lcXVhbHMoaWQpKSB7Ci0JCQkJcmVzdWx0LmFkZChmZWF0dXJlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKElGZWF0dXJlW10pIHJlc3VsdC50b0FycmF5KG5ldyBJRmVhdHVyZVtyZXN1bHQuc2l6ZSgpXSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJRmVhdHVyZVtdIGdldEluc3RhbGxlZEZlYXR1cmVzKElGZWF0dXJlIGZlYXR1cmUpIHsKLQkJcmV0dXJuIGdldEluc3RhbGxlZEZlYXR1cmVzKGZlYXR1cmUsIHRydWUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUZlYXR1cmVbXSBnZXRJbnN0YWxsZWRGZWF0dXJlcyhJRmVhdHVyZSBmZWF0dXJlLCBib29sZWFuIG9ubHlDb25maWd1cmVkKSB7Ci0JCXJldHVybiBnZXRJbnN0YWxsZWRGZWF0dXJlcyhmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSwgb25seUNvbmZpZ3VyZWQpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElGZWF0dXJlW10gZ2V0SW5zdGFsbGVkRmVhdHVyZXMoVmVyc2lvbmVkSWRlbnRpZmllciB2aWQsIGJvb2xlYW4gb25seUNvbmZpZ3VyZWQpIHsKLQkJVmVjdG9yIGZlYXR1cmVzID0gbmV3IFZlY3RvcigpOwotCQl0cnkgewotCQkJSUxvY2FsU2l0ZSBsb2NhbFNpdGUgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsKLQkJCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcgPSBsb2NhbFNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKTsKLQkJCUlDb25maWd1cmVkU2l0ZVtdIGlzaXRlcyA9IGNvbmZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKTsKLQkJCVN0cmluZyBpZCA9IHZpZC5nZXRJZGVudGlmaWVyKCk7Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXNpdGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUNvbmZpZ3VyZWRTaXRlIGlzaXRlID0gaXNpdGVzW2ldOwotCQkJCUlGZWF0dXJlW10gcmVzdWx0ID0gVXBkYXRlVUkuc2VhcmNoU2l0ZShpZCwgaXNpdGUsIG9ubHlDb25maWd1cmVkKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHJlc3VsdC5sZW5ndGg7IGorKykgewotCQkJCQlJRmVhdHVyZSBpbnN0YWxsZWRGZWF0dXJlID0gcmVzdWx0W2pdOwotCQkJCQlmZWF0dXJlcy5hZGQoaW5zdGFsbGVkRmVhdHVyZSk7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVVwZGF0ZVVJLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQlyZXR1cm4gKElGZWF0dXJlW10pIGZlYXR1cmVzLnRvQXJyYXkobmV3IElGZWF0dXJlW2ZlYXR1cmVzLnNpemUoKV0pOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQYXRjaChJRmVhdHVyZSBjYW5kaWRhdGUpIHsKLQkJSUltcG9ydFtdIGltcG9ydHMgPSBjYW5kaWRhdGUuZ2V0SW1wb3J0cygpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW1wb3J0cy5sZW5ndGg7IGkrKykgewotCQkJSUltcG9ydCBpaW1wb3J0ID0gaW1wb3J0c1tpXTsKLQkJCWlmIChpaW1wb3J0LmlzUGF0Y2goKSkgcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1BhdGNoKElGZWF0dXJlIHRhcmdldCwgSUZlYXR1cmUgY2FuZGlkYXRlKSB7Ci0JCVZlcnNpb25lZElkZW50aWZpZXIgdmlkID0gdGFyZ2V0LmdldFZlcnNpb25lZElkZW50aWZpZXIoKTsKLQkJSUltcG9ydFtdIGltcG9ydHMgPSBjYW5kaWRhdGUuZ2V0SW1wb3J0cygpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW1wb3J0cy5sZW5ndGg7IGkrKykgewotCQkJSUltcG9ydCBpaW1wb3J0ID0gaW1wb3J0c1tpXTsKLQkJCWlmIChpaW1wb3J0LmlzUGF0Y2goKSkgewotCQkJCVZlcnNpb25lZElkZW50aWZpZXIgaXZpZCA9IGlpbXBvcnQuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOwotCQkJCWlmICh2aWQuZXF1YWxzKGl2aWQpKSB7Ci0JCQkJCS8vIEJpbmdvLgotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUluc3RhbGxDb25maWd1cmF0aW9uIGdldEJhY2t1cENvbmZpZ3VyYXRpb25Gb3IoSUZlYXR1cmUgZmVhdHVyZSkgewotCQlWZXJzaW9uZWRJZGVudGlmaWVyIHZpZCA9IGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOwotCQlTdHJpbmcga2V5ID0gIkAiICsgdmlkLmdldElkZW50aWZpZXIoKSArICJfIiArIHZpZC5nZXRWZXJzaW9uKCk7Ci0JCXRyeSB7Ci0JCQlJTG9jYWxTaXRlIGxzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7Ci0JCQlJSW5zdGFsbENvbmZpZ3VyYXRpb25bXSBjb25maWdzID0gbHNpdGUuZ2V0UHJlc2VydmVkQ29uZmlndXJhdGlvbnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlncy5sZW5ndGg7IGkrKykgewotCQkJCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcgPSBjb25maWdzW2ldOwotCQkJCWlmIChjb25maWcuZ2V0TGFiZWwoKS5zdGFydHNXaXRoKGtleSkpCi0JCQkJCXJldHVybiBjb25maWc7Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGF1dGhlbnRpY2F0b3IuCi0JICogQHJldHVybiBSZXR1cm5zIGEgVXBkYXRlTWFuYWdlckF1dGhlbnRpY2F0b3IKLQkgKi8KLQlwdWJsaWMgVXBkYXRlTWFuYWdlckF1dGhlbnRpY2F0b3IgZ2V0QXV0aGVudGljYXRvcigpIHsKLQkJcmV0dXJuIGF1dGhlbnRpY2F0b3I7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBVUkwgZ2V0T3JpZ2luYXRpbmdVUkwoU3RyaW5nIGlkKSB7Ci0JCUlEaWFsb2dTZXR0aW5ncyBzZWN0aW9uID0gZ2V0T3JpZ2luYXRpbmdVUkxTZWN0aW9uKCk7Ci0JCVN0cmluZyB2YWx1ZSA9IHNlY3Rpb24uZ2V0KGlkKTsKLQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIG5ldyBVUkwodmFsdWUpOwotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0T3JpZ2luYXRpbmdVUkwoU3RyaW5nIGlkLCBVUkwgdXJsKSB7Ci0JCUlEaWFsb2dTZXR0aW5ncyBzZWN0aW9uID0gZ2V0T3JpZ2luYXRpbmdVUkxTZWN0aW9uKCk7Ci0JCXNlY3Rpb24ucHV0KGlkLCB1cmwudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSURpYWxvZ1NldHRpbmdzIGdldE9yaWdpbmF0aW5nVVJMU2VjdGlvbigpIHsKLQkJSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzID0gZ2V0RGVmYXVsdCgpLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0JCUlEaWFsb2dTZXR0aW5ncyBzZWN0aW9uID0gc2V0dGluZ3MuZ2V0U2VjdGlvbigib3JpZ2luYXRpbmdVUkxzIik7Ci0JCWlmIChzZWN0aW9uID09IG51bGwpCi0JCQlzZWN0aW9uID0gc2V0dGluZ3MuYWRkTmV3U2VjdGlvbigib3JpZ2luYXRpbmdVUkxzIik7Ci0JCXJldHVybiBzZWN0aW9uOwotCX0KLQotCXByaXZhdGUgdm9pZCByZWFkSW5mbygpIHsKLQkJLy8gZGV0ZXJtaW5lIHRoZSBpZGVudGlmaWVyIG9mIHRoZSAiZG9taW5hbnQiIGFwcGxpY2F0aW9uIAotCQlJUGxhdGZvcm1Db25maWd1cmF0aW9uIGNvbmYgPSBCb290TG9hZGVyLmdldEN1cnJlbnRQbGF0Zm9ybUNvbmZpZ3VyYXRpb24oKTsKLQkJU3RyaW5nIHZlcnNpb25lZEZlYXR1cmVJZCA9IGNvbmYuZ2V0UHJpbWFyeUZlYXR1cmVJZGVudGlmaWVyKCk7Ci0KLQkJaWYgKHZlcnNpb25lZEZlYXR1cmVJZCA9PSBudWxsKSB7Ci0JCQlhYm91dEluZm8gPSBuZXcgQWJvdXRJbmZvKG51bGwsIG51bGwpOyAvLyBPayB0byBwYXNzIG51bGwKLQkJfSBlbHNlIHsKLQkJCWludCBpbmRleCA9IHZlcnNpb25lZEZlYXR1cmVJZC5sYXN0SW5kZXhPZigiXyIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoaW5kZXggPT0gLTEpCi0JCQkJYWJvdXRJbmZvID0gbmV3IEFib3V0SW5mbyh2ZXJzaW9uZWRGZWF0dXJlSWQsIG51bGwpOwotCQkJZWxzZSB7Ci0JCQkJU3RyaW5nIG1haW5QbHVnaW5OYW1lID0gdmVyc2lvbmVkRmVhdHVyZUlkLnN1YnN0cmluZygwLCBpbmRleCk7Ci0JCQkJUGx1Z2luVmVyc2lvbklkZW50aWZpZXIgbWFpblBsdWdpblZlcnNpb24gPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCW1haW5QbHVnaW5WZXJzaW9uID0gbmV3IFBsdWdpblZlcnNpb25JZGVudGlmaWVyKHZlcnNpb25lZEZlYXR1cmVJZC5zdWJzdHJpbmcoaW5kZXggKyAxKSk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJSVN0YXR1cyBpbmlTdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGVzY3JpcHRvcigpLmdldFVuaXF1ZUlkZW50aWZpZXIoKSwgMCwgIlVua25vd24gcGx1Z2luIHZlcnNpb24gIiArIHZlcnNpb25lZEZlYXR1cmVJZCwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJbG9nKGluaVN0YXR1cywgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJYWJvdXRJbmZvID0gbmV3IEFib3V0SW5mbyhtYWluUGx1Z2luTmFtZSwgbWFpblBsdWdpblZlcnNpb24pOwotCQkJfQotCQl9Ci0JCXRyeSB7Ci0JCQlhYm91dEluZm8ucmVhZElOSUZpbGUoKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlsb2coZS5nZXRTdGF0dXMoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5mb3JtUmVzdGFydE5lZWRlZCgpIHsKLQkJU3RyaW5nIHRpdGxlID0gVXBkYXRlVUkuZ2V0U3RyaW5nKCJSZXN0YXJ0VGl0bGUiKTsKLQkJU3RyaW5nIG1lc3NhZ2UgPSBVcGRhdGVVSS5nZXRTdHJpbmcoIlJlc3RhcnRNZXNzYWdlIik7Ci0JCWJvb2xlYW4gcmVzdGFydCA9IE1lc3NhZ2VEaWFsb2cub3BlblF1ZXN0aW9uKGdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCksIHRpdGxlLCBtZXNzYWdlKTsKLQkJaWYgKHJlc3RhcnQpCi0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLnJlc3RhcnQoKTsKLQl9Ci0JLyoqIAotCSAqIEluaXRpYWxpemVzIGEgcHJlZmVyZW5jZSBzdG9yZSB3aXRoIGRlZmF1bHQgcHJlZmVyZW5jZSB2YWx1ZXMgCi0JICogZm9yIHRoaXMgcGx1Zy1pbi4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIgdGhlIHByZWZlcmVuY2Ugc3RvcmUgaXMgaW5pdGlhbGx5IGxvYWRlZAotCSAqIChkZWZhdWx0IHZhbHVlcyBhcmUgbmV2ZXIgc3RvcmVkIGluIHByZWZlcmVuY2Ugc3RvcmVzKS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgZG9lcyBub3RoaW5nLgotCSAqIFN1YmNsYXNzZXMgc2hvdWxkIHJlaW1wbGVtZW50IHRoaXMgbWV0aG9kIGlmIHRoZSBwbHVnLWluIGhhcyBhbnkgcHJlZmVyZW5jZXMuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIEEgc3ViY2xhc3MgbWF5IHJlaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHNldCBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlIAotCSAqIHByZWZlcmVuY2Ugc3RvcmUgdXNpbmcgSkZhY2UgQVBJLiBUaGlzIGlzIHRoZSBvbGRlciB3YXkgb2YgaW5pdGlhbGl6aW5nIAotCSAqIGRlZmF1bHQgdmFsdWVzLiBJZiB0aGlzIG1ldGhvZCBpcyByZWltcGxlbWVudGVkLCBkbyBub3Qgb3ZlcnJpZGUKLQkgKiA8Y29kZT5pbml0aWFsaXplRGVmYXVsdFBsdWdpblByZWZlcmVuY2VzKCk8L2NvZGU+LgotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSBzdG9yZSB0aGUgcHJlZmVyZW5jZSBzdG9yZSB0byBmaWxsCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcyhJUHJlZmVyZW5jZVN0b3JlIHN0b3JlKSB7Ci0JCXN0b3JlLnNldERlZmF1bHQoTWFpblByZWZlcmVuY2VQYWdlLlBfQ0hFQ0tfU0lHTkFUVVJFLCB0cnVlKTsJCQotCQlzdG9yZS5zZXREZWZhdWx0KE1haW5QcmVmZXJlbmNlUGFnZS5QX0hJU1RPUllfU0laRSwgNTApOwotCQlzdG9yZS5zZXREZWZhdWx0KE1haW5QcmVmZXJlbmNlUGFnZS5QX0JST1dTRVIsIE1haW5QcmVmZXJlbmNlUGFnZS5FTUJFRERFRF9WQUxVRSk7Ci0JCXN0b3JlLnNldERlZmF1bHQoTWFpblByZWZlcmVuY2VQYWdlLlBfVVBEQVRFX1ZFUlNJT05TLCBNYWluUHJlZmVyZW5jZVBhZ2UuRVFVSVZBTEVOVF9WQUxVRSk7Ci0JCXN0b3JlLnNldERlZmF1bHQoQXBwU2VydmVyUHJlZmVyZW5jZVBhZ2UuUF9NQVNURVJfU1dJVENILCBmYWxzZSk7Ci0JCXN0b3JlLnNldERlZmF1bHQoQXBwU2VydmVyUHJlZmVyZW5jZVBhZ2UuUF9FTkNPREVfVVJMUywgdHJ1ZSk7Ci0JCVVwZGF0ZUNvbG9ycy5zZXREZWZhdWx0cyhzdG9yZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VwZGF0ZVVJSW1hZ2VzLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVXBkYXRlVUlJbWFnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBiODZlNi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVXBkYXRlVUlJbWFnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aTsKLQotaW1wb3J0IGphdmEubmV0Lio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsdWdpbkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogQnVuZGxlIG9mIGFsbCBpbWFnZXMgdXNlZCBieSB0aGUgUERFIHBsdWdpbi4KLSAqLwotcHVibGljIGNsYXNzIFVwZGF0ZVVJSW1hZ2VzIHsKLQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfUFJFRklYPSBVcGRhdGVVSS5nZXRQbHVnaW5JZCgpKyIuIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgICAgTkFNRV9QUkVGSVhfTEVOR1RIPSBOQU1FX1BSRUZJWC5sZW5ndGgoKTsKLQotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgVVJMIEJBU0VfVVJMID0gVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldERlc2NyaXB0b3IoKS5nZXRJbnN0YWxsVVJMKCk7Ci0KLQotCXByaXZhdGUgc3RhdGljIEltYWdlUmVnaXN0cnkgUExVR0lOX1JFR0lTVFJZOwotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElDT05TX1BBVEggPSAiaWNvbnMvZnVsbC8iOwotCi0JLyoqCi0JICogU2V0IG9mIHByZWRlZmluZWQgSW1hZ2UgRGVzY3JpcHRvcnMuCi0JICovCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEhfT0JKPSBJQ09OU19QQVRIKyJvYmoxNi8iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRIX1ZJRVcgPSBJQ09OU19QQVRIKyJjdmlldzE2LyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEhfTENMPSBJQ09OU19QQVRIKyJlbGNsMTYvIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSF9MQ0xfSE9WRVI9IElDT05TX1BBVEgrImNsY2wxNi8iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRIX0xDTF9ESVNBQkxFRD0gSUNPTlNfUEFUSCsiZGxjbDE2LyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEhfVE9PTCA9IElDT05TX1BBVEggKyAiZXRvb2wxNi8iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRIX1RPT0xfSE9WRVIgPSBJQ09OU19QQVRIICsgImN0b29sMTYvIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSF9UT09MX0RJU0FCTEVEID0gSUNPTlNfUEFUSCArICJkdG9vbDE2LyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEhfT1ZSID0gSUNPTlNfUEFUSCArICJvdnIxNi8iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRIX1dJWkJBTiA9IElDT05TX1BBVEggKyAid2l6YmFuLyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEhfRk9STVMgPSBJQ09OU19QQVRIICsgImZvcm1zLyI7Ci0KLQotCS8qKgotCSAqIEZyZXF1ZW50bHkgdXNlZCBpbWFnZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRk9STV9CQU5ORVIgPSBOQU1FX1BSRUZJWCsiRk9STV9CQU5ORVIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19GT1JNX1VOREVSTElORSA9IE5BTUVfUFJFRklYICsgIkZPUk1fVU5ERVJMSU5FIjsKLQotCS8qKgotCSAqIE9CSjE2Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19BUFBfT0JKID0gY3JlYXRlKFBBVEhfT0JKLCAiYXBwX29iai5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0JGT0xERVJfT0JKID0gY3JlYXRlKFBBVEhfT0JKLCAiYmZvbGRlcl9vYmouZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19DQVRFR09SWV9PQkogPSBjcmVhdGUoUEFUSF9PQkosICJjYXRlZ29yeV9vYmouZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19DRF9PQkogPSBjcmVhdGUoUEFUSF9PQkosICJjZF9vYmouZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19DT01QVVRFUl9PQkogPSBjcmVhdGUoUEFUSF9PQkosICJjb21wdXRlcl9vYmouZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19DT05GSUdfT0JKID0gY3JlYXRlKFBBVEhfT0JKLCAiY29uZmlnX29iai5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0ZFQVRVUkVfT0JKID0gY3JlYXRlKFBBVEhfT0JKLCAiZmVhdHVyZV9vYmouZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19FRklYX09CSiA9IGNyZWF0ZShQQVRIX09CSiwgImVmaXgyX29iai5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0ZMT1BQWV9PQkogPSBjcmVhdGUoUEFUSF9PQkosICJmbG9wcHlfb2JqLmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfSElTVE9SWV9PQkogPSBjcmVhdGUoUEFUSF9PQkosICJoaXN0b3J5X29iai5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0xTSVRFX09CSiA9IGNyZWF0ZShQQVRIX09CSiwgImxzaXRlX29iai5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX1BTSVRFX09CSiA9IGNyZWF0ZShQQVRIX09CSiwgInBzaXRlX29iai5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0VTSVRFX09CSiA9IGNyZWF0ZShQQVRIX09CSiwgImVzaXRlX29iai5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX1NJVEVfT0JKID0gY3JlYXRlKFBBVEhfT0JKLCAic2l0ZV9vYmouZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19XRUJfU0lURV9PQkogPSBjcmVhdGUoUEFUSF9PQkosICJ3ZWJfYmttcmtfb2JqLmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfUExBQ0VTX09CSiA9IGNyZWF0ZShQQVRIX09CSiwgInBsYWNlc19vYmouZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19TQVZFRF9PQkogPSBjcmVhdGUoUEFUSF9PQkosICJzYXZlZF9vYmouZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19VTkNPTkZfRkVBVFVSRV9PQkogPSBjcmVhdGUoUEFUSF9PQkosICJ1bmNvbmZfZmVhdHVyZV9vYmouZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19VUERBVEVTX09CSiA9IGNyZWF0ZShQQVRIX09CSiwgInVwZGF0ZXNfb2JqLmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfVkZJWEVEX09CSiA9IGNyZWF0ZShQQVRIX09CSiwgInZmaXhlZF9vYmouZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19WUkVNT1RFX09CSiA9IGNyZWF0ZShQQVRIX09CSiwgInZyZW1vdGVfb2JqLmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfVlJFTU9WQUJMRV9PQkogPSBjcmVhdGUoUEFUSF9PQkosICJ2cmVtb3ZhYmxlX29iai5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX05PVElOU1RfRkVBVFVSRV9PQkogPSBjcmVhdGUoUEFUSF9PQkosICJub3RpbnN0YWxsZWRfZmVhdHVyZV9vYmouZ2lmIik7CQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfU0hPV19TRUFSQ0ggPSBjcmVhdGUoUEFUSF9PQkosICJ0c2VhcmNoX29iai5naWYiKTsKLQotCQotCS8qKgotCSAqIE9WUjE2Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19MSU5LRURfQ08gICA9IGNyZWF0ZShQQVRIX09WUiwgImxpbmtlZF9jby5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX1VQREFURURfQ08gICA9IGNyZWF0ZShQQVRIX09WUiwgInVwZGF0ZWRfY28uZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19JTlNUQUxMQUJMRV9DTyA9IGNyZWF0ZShQQVRIX09WUiwgImluc3RhbGxhYmxlX2NvLmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfQ1VSUkVOVF9DTyA9IGNyZWF0ZShQQVRIX09WUiwgImN1cnJlbnRfY28uZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19FUlJPUl9DTyA9IGNyZWF0ZShQQVRIX09WUiwgImVycm9yX2NvLmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfV0FSTklOR19DTyA9IGNyZWF0ZShQQVRIX09WUiwgIndhcm5pbmdfY28uZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19NT0RfQ08gPSBjcmVhdGUoUEFUSF9PVlIsICJtb2RfY28uZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19BRERfQ08gPSBjcmVhdGUoUEFUSF9PVlIsICJhZGRfc3RhdC5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0RFTF9DTyA9IGNyZWF0ZShQQVRIX09WUiwgImRlbF9zdGF0LmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfVU5DT05GX0NPID0gY3JlYXRlKFBBVEhfT1ZSLCAidW5jb25maWd1cmVkX2NvLmdpZiIpOwotCi0JLyoqCi0JICogVklFVzE2Ci0JICovCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0NPTkZJR1NfVklFVyA9IGNyZWF0ZShQQVRIX1ZJRVcsICJjb25maWdzLmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfU0lURVNfVklFVyA9IGNyZWF0ZShQQVRIX1ZJRVcsICJ1cGRhdGVzLmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfU0VMRUNURURfVVBEQVRFU19WSUVXID0gY3JlYXRlKFBBVEhfVklFVywgInNlbGVjdGVkX3VwZGF0ZXMuZ2lmIik7Ci0KLQkvKioKLQkgKiBMQ0wKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0JBQ0tXQVJEX05BViA9IGNyZWF0ZShQQVRIX0xDTCwgImJhY2t3YXJkX25hdi5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0JBQ0tXQVJEX05BVl9IID0gY3JlYXRlKFBBVEhfTENMX0hPVkVSLCAiYmFja3dhcmRfbmF2LmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfQkFDS1dBUkRfTkFWX0QgPSBjcmVhdGUoUEFUSF9MQ0xfRElTQUJMRUQsICJiYWNrd2FyZF9uYXYuZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19GT1JXQVJEX05BViA9IGNyZWF0ZShQQVRIX0xDTCwgImZvcndhcmRfbmF2LmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfRk9SV0FSRF9OQVZfSCA9IGNyZWF0ZShQQVRIX0xDTF9IT1ZFUiwgImZvcndhcmRfbmF2LmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfRk9SV0FSRF9OQVZfRCA9IGNyZWF0ZShQQVRIX0xDTF9ESVNBQkxFRCwgImZvcndhcmRfbmF2LmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfSE9NRV9OQVYgPSBjcmVhdGUoUEFUSF9MQ0wsICJob21lX25hdi5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0hPTUVfTkFWX0ggPSBjcmVhdGUoUEFUSF9MQ0xfSE9WRVIsICJob21lX25hdi5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0hPTUVfTkFWX0QgPSBjcmVhdGUoUEFUSF9MQ0xfRElTQUJMRUQsICJob21lX25hdi5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX1JFRlJFU0hfTkFWID0gY3JlYXRlKFBBVEhfTENMLCAicmVmcmVzaF9uYXYuZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19SRUZSRVNIX05BVl9IID0gY3JlYXRlKFBBVEhfTENMX0hPVkVSLCAicmVmcmVzaF9uYXYuZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19SRUZSRVNIX05BVl9EID0gY3JlYXRlKFBBVEhfTENMX0RJU0FCTEVELCAicmVmcmVzaF9uYXYuZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19TVE9QX05BViA9IGNyZWF0ZShQQVRIX0xDTCwgInN0b3BfbmF2LmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfU1RPUF9OQVZfSCA9IGNyZWF0ZShQQVRIX0xDTF9IT1ZFUiwgInN0b3BfbmF2LmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfU1RPUF9OQVZfRCA9IGNyZWF0ZShQQVRIX0xDTF9ESVNBQkxFRCwgInN0b3BfbmF2LmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfR09fTkFWID0gY3JlYXRlKFBBVEhfTENMLCAiZ29fbmF2LmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfR09fTkFWX0ggPSBjcmVhdGUoUEFUSF9MQ0xfSE9WRVIsICJnb19uYXYuZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19HT19OQVZfRCA9IGNyZWF0ZShQQVRIX0xDTF9ESVNBQkxFRCwgImdvX25hdi5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX1NIT1dfVU5DT05GID0gY3JlYXRlKFBBVEhfTENMLCAic2hvd191bmNvbmYuZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19TSE9XX1VOQ09ORl9IID0gY3JlYXRlKFBBVEhfTENMX0hPVkVSLCAic2hvd191bmNvbmYuZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19TSE9XX1VOQ09ORl9EID0gY3JlYXRlKFBBVEhfTENMX0RJU0FCTEVELCAic2hvd191bmNvbmYuZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19DT0xMQVBTRV9BTEwgPSBjcmVhdGUoUEFUSF9MQ0wsICJjb2xsYXBzZWFsbC5naWYiKTsKLQotCS8qKgotCSAqIFdJWgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfSU5TVEFMTF9XSVogID0gY3JlYXRlKFBBVEhfV0laQkFOLCAiaW5zdGFsbF93aXouZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19VUERBVEVfV0laICA9IGNyZWF0ZShQQVRIX1dJWkJBTiwgInVwZGF0ZV93aXouZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19DT05GSUdfV0laICA9IGNyZWF0ZShQQVRIX1dJWkJBTiwgImNvbmZpZ193aXouZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19VTklOU1RBTExfV0laICA9IGNyZWF0ZShQQVRIX1dJWkJBTiwgInVuaW5zdGFsbF93aXouZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19JTlNUQUxMX0JBTk5FUiAgPSBjcmVhdGUoUEFUSF9XSVpCQU4sICJkZWZfd2l6YmFuLmpwZyIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfRk9STV9CQU5ORVIgID0gY3JlYXRlKFBBVEhfRk9STVMsICJmb3JtX2Jhbm5lci5qcGciKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0ZPUk1fVU5ERVJMSU5FICA9IGNyZWF0ZShQQVRIX0ZPUk1TLCAiZm9ybV91bmRlcmxpbmUuanBnIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19QUk9WSURFUiA9IGNyZWF0ZShQQVRIX0ZPUk1TLCAiZGVmX3Byb3ZpZGVyLmpwZyIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfSVRFTSA9IGNyZWF0ZShQQVRIX0ZPUk1TLCAidG9waWMuZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19ORVdfQk9PS01BUksgID0gY3JlYXRlKFBBVEhfV0laQkFOLCAibmV3X2Jvb2ttYXJrX3dpei5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX05FV19GT0xERVIgID0gY3JlYXRlKFBBVEhfV0laQkFOLCAibmV3X2ZvbGRlcl93aXouZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19ORVdfU0VBUkNIICA9IGNyZWF0ZShQQVRIX1dJWkJBTiwgIm5ld19zZWFyY2hfd2l6LmdpZiIpOwotCi0JcHJpdmF0ZSBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGNyZWF0ZShTdHJpbmcgcHJlZml4LCBTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwobWFrZUltYWdlVVJMKHByZWZpeCwgbmFtZSkpOwotCX0KLQotCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXQoU3RyaW5nIGtleSkgewotCQlpZiAoUExVR0lOX1JFR0lTVFJZPT1udWxsKSBpbml0aWFsaXplKCk7Ci0JCXJldHVybiBQTFVHSU5fUkVHSVNUUlkuZ2V0KGtleSk7Ci0JfQotCi0KLXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oCi0JSVBsdWdpbkRlc2NyaXB0b3IgcGx1Z2luRGVzY3JpcHRvciwgCi0JU3RyaW5nIHN1YmRpcmVjdG9yeUFuZEZpbGVuYW1lKSB7Ci0JVVJMIGluc3RhbGxVUkwgPSBwbHVnaW5EZXNjcmlwdG9yLmdldEluc3RhbGxVUkwoKTsKLQl0cnkgewotCQlVUkwgbmV3VVJMID0gbmV3IFVSTChpbnN0YWxsVVJMLCBzdWJkaXJlY3RvcnlBbmRGaWxlbmFtZSk7Ci0JCXJldHVybiBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTChuZXdVUkwpOwotCX0KLQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQl9Ci0JcmV0dXJuIG51bGw7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBJbWFnZSBnZXRJbWFnZUZyb21QbHVnaW4oCi0JSVBsdWdpbkRlc2NyaXB0b3IgcGx1Z2luRGVzY3JpcHRvciwKLQlTdHJpbmcgc3ViZGlyZWN0b3J5QW5kRmlsZW5hbWUpIHsKLQlVUkwgaW5zdGFsbFVSTCA9IHBsdWdpbkRlc2NyaXB0b3IuZ2V0SW5zdGFsbFVSTCgpOwotCUltYWdlIGltYWdlID0gbnVsbDsKLQl0cnkgewotCQlVUkwgbmV3VVJMID0gbmV3IFVSTChpbnN0YWxsVVJMLCBzdWJkaXJlY3RvcnlBbmRGaWxlbmFtZSk7Ci0JCVN0cmluZyBrZXkgPSBuZXdVUkwudG9TdHJpbmcoKTsKLQkJaWYgKFBMVUdJTl9SRUdJU1RSWT09bnVsbCkgaW5pdGlhbGl6ZSgpOwotCQlpbWFnZSA9IFBMVUdJTl9SRUdJU1RSWS5nZXQoa2V5KTsKLQkJaWYgKGltYWdlPT1udWxsKSB7Ci0JCQlJbWFnZURlc2NyaXB0b3IgZGVzYyA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKG5ld1VSTCk7Ci0JCQlpbWFnZSA9IGRlc2MuY3JlYXRlSW1hZ2UoKTsKLQkJCVBMVUdJTl9SRUdJU1RSWS5wdXQoa2V5LCBpbWFnZSk7Ci0JCX0KLQl9Ci0JY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JfQotCXJldHVybiBpbWFnZTsKLX0KLS8qIHBhY2thZ2UgKi8KLXByaXZhdGUgc3RhdGljIGZpbmFsIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQlQTFVHSU5fUkVHSVNUUlkgPSBuZXcgSW1hZ2VSZWdpc3RyeSgpOwotCW1hbmFnZShJTUdfRk9STV9CQU5ORVIsIERFU0NfRk9STV9CQU5ORVIpOwotCW1hbmFnZShJTUdfRk9STV9VTkRFUkxJTkUsIERFU0NfRk9STV9VTkRFUkxJTkUpOwotfQotCi0KLXByaXZhdGUgc3RhdGljIFVSTCBtYWtlSW1hZ2VVUkwoU3RyaW5nIHByZWZpeCwgU3RyaW5nIG5hbWUpIHsKLQlTdHJpbmcgcGF0aCA9IHByZWZpeCArIG5hbWU7Ci0JVVJMIHVybCA9IG51bGw7Ci0JdHJ5IHsKLQkJdXJsID0gbmV3IFVSTChCQVNFX1VSTCwgcGF0aCk7Ci0JfQotCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcmV0dXJuIHVybDsKLX0KLQotcHVibGljIHN0YXRpYyBJbWFnZSBtYW5hZ2UoU3RyaW5nIGtleSwgSW1hZ2VEZXNjcmlwdG9yIGRlc2MpIHsKLQlJbWFnZSBpbWFnZSA9IGRlc2MuY3JlYXRlSW1hZ2UoKTsKLQlQTFVHSU5fUkVHSVNUUlkucHV0KGtleSwgaW1hZ2UpOwotCXJldHVybiBpbWFnZTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VwZGF0ZVVJUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVXBkYXRlVUlQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg0NjI2Ni4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVXBkYXRlVUlQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDY5NiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSMgDQotIyBDb250cmlidXRvcnM6DQotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgDQotIw0KLSMNCi0NCi1SZXN0YXJ0VGl0bGUgPSBJbnN0YWxsL1VwZGF0ZQ0KLVJlc3RhcnRNZXNzYWdlID0gWW91IHdpbGwgbmVlZCB0byByZXN0YXJ0IHRoZSB3b3JrYmVuY2ggZm9yIHRoZSBjaGFuZ2VzIHRvIHRha2UgZWZmZWN0LiBcDQotV291bGQgeW91IGxpa2UgdG8gcmVzdGFydCBub3c/DQotDQotSW5zdGFsbENvbmZpZ3VyYXRpb25QYWdlLmNyZWF0ZWRPbiA9IENyZWF0ZWQgT24NCi1JbnN0YWxsQ29uZmlndXJhdGlvblBhZ2UuY3VycmVudENvbmZpZyA9IFxuQ3VycmVudCBDb25maWd1cmF0aW9uDQotSW5zdGFsbENvbmZpZ3VyYXRpb25QYWdlLnllcyA9IFllcw0KLUluc3RhbGxDb25maWd1cmF0aW9uUGFnZS5ubyA9IE5vDQotSW5zdGFsbENvbmZpZ3VyYXRpb25QYWdlLkFjdGl2aXR5U2VjdGlvbi50aXRsZT1BY3Rpdml0aWVzDQotSW5zdGFsbENvbmZpZ3VyYXRpb25QYWdlLkFjdGl2aXR5U2VjdGlvbi5kZXNjPVRoZSBmb2xsb3dpbmcgbGlzdCBzaG93cyBcDQotYWN0aXZpdGllcyB0aGF0IGNhdXNlZCB0aGUgY3JlYXRpb24gb2YgdGhpcyBjb25maWd1cmF0aW9uOg0KLUluc3RhbGxDb25maWd1cmF0aW9uUGFnZS5BY3Rpdml0eVNlY3Rpb24uaGVhZGVycy5kYXRlPSBEYXRlDQotSW5zdGFsbENvbmZpZ3VyYXRpb25QYWdlLkFjdGl2aXR5U2VjdGlvbi5oZWFkZXJzLnRhcmdldD0gVGFyZ2V0DQotSW5zdGFsbENvbmZpZ3VyYXRpb25QYWdlLkFjdGl2aXR5U2VjdGlvbi5oZWFkZXJzLmFjdGlvbj0gQWN0aW9uDQotSW5zdGFsbENvbmZpZ3VyYXRpb25QYWdlLkFjdGl2aXR5U2VjdGlvbi5oZWFkZXJzLnN0YXR1cz0gU3RhdHVzDQotSW5zdGFsbENvbmZpZ3VyYXRpb25QYWdlLkFjdGl2aXR5U2VjdGlvbi5hY3Rpb24uY29uZmlndXJlPSBFbmFibGVkDQotSW5zdGFsbENvbmZpZ3VyYXRpb25QYWdlLkFjdGl2aXR5U2VjdGlvbi5hY3Rpb24uZmVhdHVyZUluc3RhbGw9IEZlYXR1cmUgSW5zdGFsbGVkDQotSW5zdGFsbENvbmZpZ3VyYXRpb25QYWdlLkFjdGl2aXR5U2VjdGlvbi5hY3Rpb24uZmVhdHVyZVJlbW92ZT0gRmVhdHVyZSBSZW1vdmVkDQotSW5zdGFsbENvbmZpZ3VyYXRpb25QYWdlLkFjdGl2aXR5U2VjdGlvbi5hY3Rpb24uc2l0ZUluc3RhbGw9IFNpdGUgSW5zdGFsbGVkDQotSW5zdGFsbENvbmZpZ3VyYXRpb25QYWdlLkFjdGl2aXR5U2VjdGlvbi5hY3Rpb24uc2l0ZVJlbW92ZT0gU2l0ZSBSZW1vdmVkDQotSW5zdGFsbENvbmZpZ3VyYXRpb25QYWdlLkFjdGl2aXR5U2VjdGlvbi5hY3Rpb24udW5jb25maWd1cmU9IERpc2FibGVkDQotSW5zdGFsbENvbmZpZ3VyYXRpb25QYWdlLkFjdGl2aXR5U2VjdGlvbi5hY3Rpb24udW5rbm93bj0gVW5rbm93bg0KLUluc3RhbGxDb25maWd1cmF0aW9uUGFnZS5BY3Rpdml0eVNlY3Rpb24uc3RhdHVzLm9rID0gU3VjY2Vzcw0KLUluc3RhbGxDb25maWd1cmF0aW9uUGFnZS5BY3Rpdml0eVNlY3Rpb24uc3RhdHVzLm5vayA9IEZhaWx1cmUNCi1JbnN0YWxsQ29uZmlndXJhdGlvblBhZ2UuQWN0aXZpdHlTZWN0aW9uLmFjdGlvbi5yZXZlcnQgPSBSZXZlcnQNCi1JbnN0YWxsQ29uZmlndXJhdGlvblBhZ2UuQWN0aXZpdHlTZWN0aW9uLmFjdGlvbi5yZWNvbmNpbGUgPSBSZWNvbmNpbGUNCi1JbnN0YWxsQ29uZmlndXJhdGlvblBhZ2UuQWN0aXZpdHlTZWN0aW9uLmFjdGlvbi5hZGRwcmVzZXJ2ZWQgPSBQcmVzZXJ2ZWQNCi0NCi1JbnN0YWxsQ29uZmlndXJhdGlvblBhZ2UuUmV2ZXJ0U2VjdGlvbi50aXRsZSA9Q29uZmlndXJhdGlvbiBSZXZlcnNhbA0KLUluc3RhbGxDb25maWd1cmF0aW9uUGFnZS5SZXZlcnRTZWN0aW9uLmRlc2M9WW91IGNhbiByZXZlcnQgZnJvbSB0aGUgY3VycmVudCBcDQotdG8gYW55IG9mIHRoZSBjb21wYXRpYmxlIHByZXZpb3VzIGNvbmZpZ3VyYXRpb25zLiBDb25maWd1cmF0aW9ucyBhcmUgXA0KLWNvbXBhdGlibGUgaWYgdGhleSBhcmUgbm90IHNlcGFyYXRlZCBieSBhIGZ1bGwgc3lzdGVtIHJlY29uY2lsYXRpb24gaW4gdGhlIFwNCi10aW1lbGluZS4gTm90ZSB0aGF0IHRoZSByZXZlcnNhbCBcDQotd2lsbCBiZSBvbmx5IHBhcnRpYWwgaWYgc29tZSBvZiB0aGUgZmVhdHVyZXMgdGhhdCBhcmUgcGFydCBvZiB0aGUgXA0KLWRlc2lyZWQgY29uZmlndXJhdGlvbiBoYXZlIHNpbmNlIGJlZW4gZGVsZXRlZC4NCi0NCi1JbnN0YWxsQ29uZmlndXJhdGlvblBhZ2UuUHJlc2VydmVTZWN0aW9uLnRpdGxlID0gU2F2aW5nIHRoZSBDb25maWd1cmF0aW9uDQotSW5zdGFsbENvbmZpZ3VyYXRpb25QYWdlLlByZXNlcnZlU2VjdGlvbi50ZXh0PSA8Zm9ybT48cD5cDQotQ29uZmlndXJhdGlvbnMgY2FuIGJlIHNhdmVkIHNvIHRoYXQgdGhleSBjYW4gYmUgcmVzdG9yZWQgYXQgYSBsYXRlciBkYXRlLiBcDQotU2F2ZWQgY29uZmlndXJhdGlvbnMgYXBwZWFyIGluIDxiPlNhdmVkIENvbmZpZ3VyYXRpb25zPC9iPiBmb2xkZXIgXA0KLWluIHRoZSA8aW1nIGhyZWY9ImltYWdlIi8+IDxhIGhyZWY9ImxpbmsiPkluc3RhbGwgQ29uZmlndXJhdGlvbjwvYT4gdmlldy5cDQotPC9wPjwvZm9ybT4NCi1JbnN0YWxsQ29uZmlndXJhdGlvblBhZ2UuUHJlc2VydmVTZWN0aW9uLnByZXNlcnZlVGV4dCA9IFRvIHNhdmUgdGhpcyBjb25maWd1cmF0aW9uLCBwcmVzczoNCi1JbnN0YWxsQ29uZmlndXJhdGlvblBhZ2UuUHJlc2VydmVTZWN0aW9uLnByZXNlcnZlQnV0dG9uID0gU2F2ZQ0KLQ0KLUluc3RhbGxDb25maWd1cmF0aW9uUGFnZS5SZXZlcnRTZWN0aW9uLmN1cnJlbnRUZXh0PVRoaXMgaXMgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4NCi1JbnN0YWxsQ29uZmlndXJhdGlvblBhZ2UuUmV2ZXJ0U2VjdGlvbi5yZXZlcnRUZXh0PSBcIFRvIHJldmVydCB0byB0aGUgcHJldmlvdXMgb25lLCBwcmVzczoNCi1JbnN0YWxsQ29uZmlndXJhdGlvblBhZ2UuUmV2ZXJ0U2VjdGlvbi5yZXZlcnRCdXR0b249UmV2ZXJ0DQotSW5zdGFsbENvbmZpZ3VyYXRpb25QYWdlLlJldmVydFNlY3Rpb24ucmVzdG9yZVRleHQ9VG8gcmVzdG9yZSB0aGlzIGNvbmZpZ3VyYXRpb24sIHByZXNzOg0KLUluc3RhbGxDb25maWd1cmF0aW9uUGFnZS5SZXZlcnRTZWN0aW9uLnJlc3RvcmVCdXR0b249UmVzdG9yZQ0KLUluc3RhbGxDb25maWd1cmF0aW9uUGFnZS5SZXZlcnRTZWN0aW9uLmRpYWxvZy50aXRsZT1SZXZlcnQvUmVzdG9yZSBjb25maWd1cmF0aW9uLg0KLUluc3RhbGxDb25maWd1cmF0aW9uUGFnZS5SZXZlcnRTZWN0aW9uLmRpYWxvZy5tZXNzYWdlPVRoZSBjb25maWd1cmF0aW9uIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBcDQotcmVzdG9yZWQuIFlvdSB3aWxsIG5lZWQgdG8gcmVzdGFydCB0aGUgd29ya2JlbmNoIGZvciB0aGUgY2hhbmdlcyB0byB0YWtlIGVmZmVjdC4gIFwNCi1Xb3VsZCB5b3UgbGlrZSB0byByZXN0YXJ0IHRoZSB3b3JrYmVuY2ggbm93Pw0KLQ0KLQ0KLVJldmVydC5Qcm9ibGVtRGlhbG9nLnRpdGxlID0gUmVzdG9yZSBQcm9ibGVtcw0KLQ0KLUJhc2VWaWV3LlBvcHVwLlNob3dEZXRhaWxzID0gU2hvdyAmRGV0YWlscw0KLQ0KLU15Q29tcHV0ZXIubGFiZWwgPSBNeSBDb21wdXRlcg0KLU15Q29tcHV0ZXJQYWdlLnRpdGxlPSBNeSBDb21wdXRlciAtIHswfQ0KLU15Q29tcHV0ZXJQYWdlLmRlc2MgPSBCcm93c2UgdGhlIGZpbGUgc3lzdGVtIGluIG9yZGVyIHRvIGZpbmQgYSB2YWxpZCB1cGRhdGUgc2l0ZS4NCi0NCi1FeHRlbnNpb25Sb290UGFnZS50aXRsZSA9IFByb2R1Y3QgRXh0ZW5zaW9uIERpcmVjdG9yeQ0KLUV4dGVuc2lvblJvb3RQYWdlLmRlc2MgPSA8cD5Qcm9kdWN0IGV4dGVuc2lvbiBkaXJlY3RvcnkgaXMgYSBmaWxlIHN5c3RlbSBkaXJlY3RvcnkgXA0KLXRoYXQgaXMgbWFya2VkIGFzIDxiPmV4dGVuc2lvbiByb290LjwvYj4gRXh0ZW5zaW9uIHJvb3RzIGNvbnRhaW4gcGx1Zy1pbnMgXA0KLXRoYXQgYXJlIGRlc2lnbmVkIHRvIGF1Z21lbnQgb3RoZXIgYXBwbGljYXRpb25zIHdoZW4gdGhleSBsaW5rIFwNCi10aGVzZSBkaXJlY3RvcmllcyBpbnRvIHRoZWlyIGNvbmZpZ3VyYXRpb25zLjwvcD5cDQotPHA+WW91IGNhbiBsaW5rIHRoaXMgZXh0ZW5zaW9uIHJvb3QgdG8geW91ciBhcHBsaWNhdGlvbiBieSBzZWxlY3RpbmcgXA0KLTxiPkxpbmsgUHJvZHVjdCBFeHRlbnNpb248L2I+IGZyb20gdGhlIHBvcC11cCBtZW51IGZvciB0aGlzIG9iamVjdC48L3A+DQotDQotVm9sdW1lTGFiZWxQcm92aWRlci5jZHJvbSA9IENvbXBhY3QgRGlzYw0KLVZvbHVtZUxhYmVsUHJvdmlkZXIuZmxvcHB5MyA9IDMuNSBGbG9wcHkNCi1Wb2x1bWVMYWJlbFByb3ZpZGVyLmZsb3BweTUgPSA1LjI1IEZsb3BweQ0KLVZvbHVtZUxhYmVsUHJvdmlkZXIubG9jYWxEaXNrID0gTG9jYWwgRGlzYw0KLQ0KLUNhdGVnb3J5UGFnZS50aXRsZSA9IENhdGVnb3J5DQotQ2F0ZWdvcnlQYWdlLm1vcmVJbmZvID0gTW9yZSBJbmZvDQotDQotRmVhdHVyZVBhZ2UucHJvdmlkZXIgPSBQcm92aWRlcg0KLUZlYXR1cmVQYWdlLnZlcnNpb24gPSBcblZlcnNpb24NCi1GZWF0dXJlUGFnZS5pbnN0YWxsZWRWZXJzaW9uID0gXG5JbnN0YWxsZWQgVmVyc2lvbg0KLUZlYXR1cmVQYWdlLnBlbmRpbmdWZXJzaW9uID0gezB9IChjaGFuZ2VzIHBlbmRpbmcpDQotRmVhdHVyZVBhZ2Uuc2l6ZSA9IFxuRG93bmxvYWQgU2l6ZQ0KLUZlYXR1cmVQYWdlLmVzdGltYXRlID0gXG5Fc3RpbWF0ZSBEb3dubG9hZCBUaW1lDQotRmVhdHVyZVBhZ2Uub3MgPSBPcGVyYXRpbmcgU3lzdGVtDQotRmVhdHVyZVBhZ2Uud3MgPSBcbldpbmRvd2luZyBTeXN0ZW0NCi1GZWF0dXJlUGFnZS5ubCA9IFxuU3VwcG9ydGVkIExhbmd1YWdlcw0KLUZlYXR1cmVQYWdlLmFyY2ggPSBcblN1cHBvcnRlZCBPcGVyYXRpbmcgU3lzdGVtIEFyY2hpdGVjdHVyZQ0KLUZlYXR1cmVQYWdlLnBsYXRmb3JtcyA9IFN1cHBvcnRlZCBQbGF0Zm9ybXMNCi1GZWF0dXJlUGFnZS5hbGwgPSBBbGwNCi1GZWF0dXJlUGFnZS5kZXNjcmlwdGlvbiA9IFxuRGVzY3JpcHRpb24NCi1GZWF0dXJlUGFnZS5pbmZvTGluayA9IE1vcmUgSW5mbw0KLUZlYXR1cmVQYWdlLmxpY2Vuc2VMaW5rID0gTGljZW5zZQ0KLUZlYXR1cmVQYWdlLmNvcHlyaWdodExpbmsgPSBDb3B5cmlnaHQNCi1GZWF0dXJlUGFnZS5ub3RJbnN0YWxsZWQgPSBOb3QgSW5zdGFsbGVkDQotRmVhdHVyZVBhZ2Uuc2l6ZVZhbHVlID0gezB9IEtCDQotRmVhdHVyZVBhZ2UuZXN0aW1hdGVWYWx1ZSA9IHswfSBIb3VycyB7MX0gbWludXRlcw0KLUZlYXR1cmVQYWdlLm1pbnV0ZUVzdGltYXRlVmFsdWUgPSBMZXNzIHRoYW4gb25lIG1pbnV0ZQ0KLUZlYXR1cmVQYWdlLnVua25vd25TaXplVmFsdWUgPSBVbmtub3duIFNpemUNCi1GZWF0dXJlUGFnZS51bmtub3duRXN0aW1hdGVWYWx1ZSA9IFVua25vd24gRG93bmxvYWQgVGltZQ0KLUZlYXR1cmVQYWdlLmRvQnV0dG9uLnVuaW5zdGFsbCA9IFVuaW5zdGFsbCBOb3cNCi1GZWF0dXJlUGFnZS5kb0J1dHRvbi51bmNvbmZpZ3VyZSA9IERpc2FibGUgTm93DQotRmVhdHVyZVBhZ2UuZG9CdXR0b24uY29uZmlndXJlID0gRW5hYmxlIE5vdw0KLUZlYXR1cmVQYWdlLmRvQnV0dG9uLnVwZGF0ZSA9IFVwZGF0ZSBOb3cNCi1GZWF0dXJlUGFnZS5kb0J1dHRvbi5pbnN0YWxsID0gSW5zdGFsbCBOb3cNCi1GZWF0dXJlUGFnZS5kb0J1dHRvbi5yZXBhaXIgPSBSZXBhaXIgTm93DQotRmVhdHVyZVBhZ2UuZG9CdXR0b24uY2hhbmdlID0gQ2hhbmdlIE5vdw0KLUZlYXR1cmVQYWdlLmRpc2FibGVkVmVyc2lvbiA9IChkaXNhYmxlZCkNCi0NCi1GZWF0dXJlUGFnZS5iYXRjaEJ1dHRvbi51bmNvbmZpZ3VyZSA9IERpc2FibGUgYnkgYWRkaW5nIHRvIHRoZSBTZWxlY3RlZCBVcGRhdGVzLg0KLUZlYXR1cmVQYWdlLmJhdGNoQnV0dG9uLmNvbmZpZ3VyZSA9IEVuYWJsZSBieSBhZGRpbmcgdG8gdGhlIFNlbGVjdGVkIFVwZGF0ZXMuDQotRmVhdHVyZVBhZ2UuYmF0Y2hCdXR0b24ucmVwYWlyID0gUmVwYWlyIGJ5IGFkZGluZyB0byB0aGUgU2VsZWN0ZWQgVXBkYXRlcy4NCi1GZWF0dXJlUGFnZS5iYXRjaEJ1dHRvbi5jaGFuZ2UgPSBDaGFuZ2UgYnkgYWRkaW5nIHRvIHRoZSBTZWxlY3RlZCBVcGRhdGVzLg0KLUZlYXR1cmVQYWdlLmJhdGNoQnV0dG9uLnVwZGF0ZSA9IFVwZGF0ZSBieSBhZGRpbmcgdG8gdGhlIFNlbGVjdGVkIFVwZGF0ZXMuDQotRmVhdHVyZVBhZ2UuYmF0Y2hCdXR0b24uaW5zdGFsbCA9IEluc3RhbGwgYnkgYWRkaW5nIHRvIHRoZSBTZWxlY3RlZCBVcGRhdGVzLg0KLUZlYXR1cmVQYWdlLmJhdGNoQnV0dG9uLnVuaW5zdGFsbCA9IFVuaW5zdGFsbCBieSBhZGRpbmcgdG8gdGhlIFNlbGVjdGVkIFVwZGF0ZXMuDQotRmVhdHVyZVBhZ2UuYmF0Y2ggPSBHcm91cCBVcGRhdGVzDQotRmVhdHVyZVBhZ2Uuc2VsZWN0ZWRVcGRhdGVzID0gU2VsZWN0ZWQgVXBkYXRlcw0KLQ0KLUZlYXR1cmVQYWdlLmRpYWxvZy51dGl0bGUgPSBVbmluc3RhbGwNCi1GZWF0dXJlUGFnZS5kaWFsb2cudGl0bGUgPSBJbnN0YWxsDQotRmVhdHVyZVBhZ2UuZGlhbG9nLmN0aXRsZSA9IEVuYWJsZQ0KLUZlYXR1cmVQYWdlLmRpYWxvZy51Y3RpdGxlID0gRGlzYWJsZQ0KLQ0KLUZlYXR1cmVQYWdlLmR1cGxpY2F0ZXNFbmFibGVkLnRpdGxlID0gQ29uZmxpY3QgV2FybmluZw0KLUZlYXR1cmVQYWdlLmR1cGxpY2F0ZXNFbmFibGVkLm1lc3NhZ2UgPSBBbm90aGVyIHZlcnNpb24gb2YgdGhpcyBmZWF0dXJlIGlzIGFscmVhZHkgZW5hYmxlZC4NCi0NCi1GZWF0dXJlUGFnZS5taXNzaW5nLnRpdGxlID0gTWlzc2luZyBQbHVnLWlucw0KLUZlYXR1cmVQYWdlLm1pc3NpbmcubWVzc2FnZSA9IFRoZSBmZWF0dXJlIHlvdSB3YW50IHRvIGluc3RhbGwgcmVxdWlyZXMgcGx1Zy1pbnMgXA0KLXRoYXQgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uIFlvdSBjYW4gc2VhcmNoIGZvciBmZWF0dXJlcyB0aGF0IFwNCi1jb250YWluIHJlcXVpcmVkIHBsdWctaW5zIGFuZCBpbnN0YWxsIHRoZW0gYmVmb3JlIHRoaXMgb25lIG9yIGFib3J0Lg0KLQ0KLUZlYXR1cmVQYWdlLm1pc3Npbmcuc2VhcmNoID0gJlNlYXJjaA0KLUZlYXR1cmVQYWdlLm1pc3NpbmcuYWJvcnQgPSAmQWJvcnQNCi1GZWF0dXJlUGFnZS5taXNzaW5nLnNlYXJjaE9iamVjdE5hbWUgPSBNaXNzaW5nIHBsdWctaW5zIG9mIHswfQ0KLQ0KLUZlYXR1cmVQYWdlLm9wdGlvbmFsSW5zdGFsbC5tZXNzYWdlID0gRmVhdHVyZSBjYW5ub3QgYmUgZm91bmQgdXNpbmcgezB9Lg0KLUZlYXR1cmVQYWdlLm9wdGlvbmFsSW5zdGFsbC50aXRsZSA9IE9wdGlvbmFsIEluc3RhbGwNCi0NCi1BY3Rpdml0eUNvbnN0cmFpbnRzLnJvb3RNZXNzYWdlID0gUmVxdWVzdGVkIG9wZXJhdGlvbiBjYW5ub3QgYmUgcGVyZm9ybWVkIGJlY2F1c2UgaXQgd291bGQgaW52YWxpZGF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLiBTZWUgZGV0YWlscyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4NCi1BY3Rpdml0eUNvbnN0cmFpbnRzLnJvb3RNZXNzYWdlSW5pdGlhbCA9IEN1cnJlbnQgY29uZmlndXJhdGlvbiBjb250YWlucyBlcnJvcnMgdGhhdCBhcmUgbm90IGNvcnJlY3RlZCBieSB0aGUgcmVxdWVzdGVkIG9wZXJhdGlvbi4gU2VlIGRldGFpbHMgZm9yIG1vcmUgaW5mb3JtYXRpb24uDQotQWN0aXZpdHlDb25zdHJhaW50cy5wbGF0Zm9ybSA9IFJlc3VsdGluZyBjb25maWd1cmF0aW9uIGRvZXMgbm90IGNvbnRhaW4gdGhlIHBsYXRmb3JtLg0KLUFjdGl2aXR5Q29uc3RyYWludHMucHJpbWFyeSA9IFJlc3VsdGluZyBjb25maWd1cmF0aW9uIGRvZXMgbm90IGNvbnRhaW4gdGhlIHByaW1hcnkgZmVhdHVyZS4NCi1BY3Rpdml0eUNvbnN0YWludHMucHJlcmVxLnBsdWdpbiA9IHBsdWctaW4NCi1BY3Rpdml0eUNvbnN0YWludHMucHJlcmVxLmZlYXR1cmUgPSBmZWF0dXJlDQotQWN0aXZpdHlDb25zdHJhaW50cy5wcmVyZXEgPSBGZWF0dXJlIHJlcXVpcmVzIHswfSAiezF9Ii4NCi1BY3Rpdml0eUNvbnN0cmFpbnRzLnByZXJlcVBlcmZlY3QgPSBGZWF0dXJlIHJlcXVpcmVzIHswfSAiezF9ICh7Mn0pIi4NCi1BY3Rpdml0eUNvbnN0cmFpbnRzLnByZXJlcUVxdWl2YWxlbnQgPSBGZWF0dXJlIHJlcXVpcmVzIHswfSAiezF9ICh7Mn0pIiwgb3IgZXF1aXZhbGVudC4NCi1BY3Rpdml0eUNvbnN0cmFpbnRzLnByZXJlcUNvbXBhdGlibGUgPSBGZWF0dXJlIHJlcXVpcmVzIHswfSAiezF9ICh7Mn0pIiwgb3IgY29tcGF0aWJsZS4NCi1BY3Rpdml0eUNvbnN0cmFpbnRzLnByZXJlcUdyZWF0ZXJPckVxdWFsID0gRmVhdHVyZSByZXF1aXJlcyB7MH0gInsxfSAoezJ9KSIsIG9yIGxhdGVyIHZlcnNpb24uDQotQWN0aXZpdHlDb25zdHJhaW50cy5vcyA9IEZlYXR1cmUgb3BlcmF0aW5nIHN5c3RlbSBkb2VzIG5vdCBtYXRjaCBjdXJyZW50IGVudmlyb25tZW50Lg0KLUFjdGl2aXR5Q29uc3RyYWludHMud3MgPSBGZWF0dXJlIHdpbmRvd2luZyBzeXN0ZW0gZG9lcyBub3QgbWF0Y2ggY3VycmVudCBlbnZpcm9ubWVudC4NCi1BY3Rpdml0eUNvbnN0cmFpbnRzLmFyY2ggPSBGZWF0dXJlIHBsYXRmb3JtIGFyY2hpdGVjdHVyZSBkb2VzIG5vdCBtYXRjaCBjdXJyZW50IGVudmlyb25tZW50Lg0KLUFjdGl2aXR5Q29uc3RyYWludHMuY3ljbGUgPSBGZWF0dXJlIGRlZmluaXRpb24gY29udGFpbnMgYSBuZXN0ZWQgZmVhdHVyZXMgY3ljbGUuDQotQWN0aXZpdHlDb25zdHJhaW50cy5jb25mbGljdCA9IFVwZGF0ZSBjb25mbGljdCBkZXRlY3RlZCAoc2VlIGRldGFpbHMpLiBQbGVhc2UgZGVzZWxlY3QgdGhpcyB1cGRhdGUgYW5kIHRyeSBhZ2Fpbi4NCi1BY3Rpdml0eUNvbnN0cmFpbnRzLmNoaWxkTWVzc2FnZSA9IHswfSAoezF9KTogezJ9DQotQWN0aXZpdHlDb25zdHJhaW50cy5vcHRpb25hbENoaWxkID0gRmVhdHVyZSBpbmNsdWRlZCBpbiBhbm90aGVyIGZlYXR1cmUgY2Fubm90IGJlIGVuYWJsZWQgaWYgdGhlIHBhcmVudCBpcyBkaXNhYmxlZC4gRW5hYmxlIHRoZSBwYXJlbnQgZmlyc3QuDQotQWN0aXZpdHlDb25zdHJhaW50cy5wYXRjaFJlZ3Jlc3Npb24gPSBJbmNsdWRlZCBmZWF0dXJlICJ7MH0gKHsxfSkiIGlzIG9sZGVyIHRoYW4gdGhlIGN1cnJlbnRseSBhY3RpdmUgZmVhdHVyZS4NCi1BY3Rpdml0eUNvbnN0cmFpbnRzLnBhdGNoVW5jb25maWd1cmUgPSBUaGlzIGZlYXR1cmUgaXMgYSBwYXRjaCBhbmQgY2Fubm90IGJlIGRpcmVjdGx5IGRpc2FibGVkLiBVc2UgJ1JldmVydCcgdG8gcmVzdG9yZSBcDQotdGhlIGxhc3QgY29uZmlndXJhdGlvbiBiZWZvcmUgdGhlIHBhdGNoIHdhcyBpbnN0YWxsZWQuDQotQWN0aXZpdHlDb25zdHJhaW50cy5wYXRjaFVuY29uZmlndXJlQmFja3VwID0gVGhpcyBmZWF0dXJlIGlzIGEgcGF0Y2ggYW5kIGNhbm5vdCBiZSBkaXJlY3RseSBkaXNhYmxlZC4gVXNlICdSZXZlcnQnIHRvIHJlc3RvcmUgXA0KLWNvbmZpZ3VyYXRpb24gInswfSIgaW4gU2F2ZWQgQ29uZmlndXJhdGlvbnMuDQotQWN0aXZpdHlDb25zdHJhaW50cy5wYXRjaE1pc3NpbmdUYXJnZXQgPSBPbGRlciB2ZXJzaW9uIG9mIGZlYXR1cmUgInswfSAoezF9KSIgbXVzdCBiZSBwcmVzZW50IGZvciBhIHBhdGNoIHRvIGJlIGFwcGxpZWQuDQotQWN0aXZpdHlDb25zdHJhaW50cy50aW1lbGluZSA9IENhbm5vdCByZXZlcnQgdG8gInswfSIgYmVjYXVzZSBpdCBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uDQotQWN0aXZpdHlDb25zdHJhaW50cy5leGNsdXNpdmUgPSBUaGUgZmVhdHVyZSBtdXN0IGJlIHByb2Nlc3NlZCBzZXBhcmF0ZWx5IGZyb20gb3RoZXIgZmVhdHVyZXMuDQotQWN0aXZpdHlDb25zdHJhaW50cy5ub0xpY2Vuc2UgPSBUaGUgZmVhdHVyZSBkb2VzIG5vdCBoYXZlIGEgdmFsaWQgbGljZW5zZSBhZ3JlZW1lbnQuDQotDQotRGV0YWlsc1ZpZXcuaG9tZS5sYWJlbD1HbyBIb21lDQotRGV0YWlsc1ZpZXcuYmFja3dhcmQubGFiZWw9R28gQmFja3dhcmQNCi1EZXRhaWxzVmlldy5mb3J3YXJkLmxhYmVsPUdvIEZvcndhcmQNCi0NCi1EZXRhaWxzVmlldy5ob21lLnRvb2x0aXA9R28gdG8gdGhlIFVwZGF0ZSBNYW5hZ2VyIGhvbWUgcGFnZQ0KLURldGFpbHNWaWV3LmJhY2t3YXJkLnRvb2x0aXA9R28gQmFjaw0KLURldGFpbHNWaWV3LmZvcndhcmQudG9vbHRpcD1HbyBGb3J3YXJkDQotDQotSW5mb0dyb3VwLnBsYWluVGV4dFZlcnNpb24gPSBQbGFpbiBUZXh0IFZlcnNpb24NCi1JbmZvR3JvdXAuaHRtbFZlcnNpb24gPSBIVE1MIFZlcnNpb24NCi0NCi1JbnN0YWxsYWJsZVNpdGVQYWdlLnRpdGxlID0gSW5zdGFsbCBMb2NhdGlvbg0KLUluc3RhbGxhYmxlU2l0ZVBhZ2UuZGVzYyA9IDxmb3JtPjxwPlwNCi1JbnN0YWxsIGxvY2F0aW9uIGlzIHRoZSBwbGFjZSBvbiB5b3VyIGRpc2sgd2hlcmUgZmVhdHVyZXMgYXJlIFwNCi1pbnN0YWxsZWQuIEEgPGI+cHJvZHVjdDwvYj4gbG9jYXRpb24gaXMgYWx3YXlzIHByZXNlbnQuIDxiPkV4dGVuc2lvbjwvYj4gXA0KLWxvY2F0aW9uIGNhbiBiZSBpbnN0YWxsZWQgd2hlbiB0aGUgYmFzZSBwcm9kdWN0IGlzIGV4dGVuZGVkIGJ5IGFub3RoZXIgXA0KLXByb2R1Y3QuIFdoZW4gXA0KLWluc3RhbGxlZCB1c2luZyBVcGRhdGUgTWFuYWdlciwgZmVhdHVyZXMgY2FuIGJlIHBsYWNlZCBpbiBhIGRpZmZlcmVudCBcDQotZm9sZGVyIGluIHRoZSBmaWxlIHN5c3RlbS4gVGhlIGZvbGRlciB0aGVuIGJlY29tZXMgPGI+dXNlcjwvYj4gbG9jYXRpb24uPC9wPlwNCi08cD5JbnN0YWxsIGxvY2F0aW9uIGNhbiBiZSBlbmFibGVkIG9yIGRpc2FibGVkIGFzIGEgd2hvbGUuIFdoZW4gXA0KLWEgZGlzYWJsZWQgbG9jYXRpb24gaXMgZW5hYmxlZCwgcHJldmlvdXMgZmVhdHVyZSBzdGF0ZXMgYXJlIHJlc3RvcmVkLjwvcD5cDQotPC9mb3JtPg0KLUluc3RhbGxhYmxlU2l0ZUZvcm0udXJsID0gVVJMDQotSW5zdGFsbGFibGVTaXRlRm9ybS50eXBlID0gXG5UeXBlDQotSW5zdGFsbGFibGVTaXRlRm9ybS50eXBlLnByb2R1Y3QgPSBQcm9kdWN0DQotSW5zdGFsbGFibGVTaXRlRm9ybS50eXBlLmV4dGVuc2lvbiA9IFByb2R1Y3QgRXh0ZW5zaW9uDQotSW5zdGFsbGFibGVTaXRlRm9ybS50eXBlLnByaXZhdGUgPSBVc2VyDQotSW5zdGFsbGFibGVTaXRlRm9ybS5zdGF0ZSA9IFxuU3RhdGUNCi1JbnN0YWxsYWJsZVNpdGVGb3JtLnN0YXRlQnV0dG9uLmRpc2FibGUgPSBEaXNhYmxlDQotSW5zdGFsbGFibGVTaXRlRm9ybS5zdGF0ZUJ1dHRvbi5lbmFibGUgPSBFbmFibGUNCi1JbnN0YWxsYWJsZVNpdGVGb3JtLnN0YXRlTGFiZWwuZW5hYmxlZCA9IFRoaXMgbG9jYXRpb24gaXMgY3VycmVudGx5IGVuYWJsZWQuDQotSW5zdGFsbGFibGVTaXRlRm9ybS5zdGF0ZUxhYmVsLmRpc2FibGVkID0gVGhpcyBsb2NhdGlvbiBpcyBjdXJyZW50bHkgZGlzYWJsZWQuDQotDQotTG9jYWxTaXRlUGFnZS50aXRsZSA9IEN1cnJlbnQgQ29uZmlndXJhdGlvbg0KLUNvbmZpZ3VyYXRpb25WaWV3LmN1cnJlbnQgPSBDdXJyZW50IENvbmZpZ3VyYXRpb24NCi1Db25maWd1cmF0aW9uVmlldy5zaG93VW5jb25mRmVhdHVyZXMgPSBTaG93IERpc2FibGVkIEZlYXR1cmVzDQotQ29uZmlndXJhdGlvblZpZXcuc2hvd1VuY29uZkZlYXR1cmVzLnRvb2x0aXAgPSBTaG93IERpc2FibGVkIEZlYXR1cmVzDQotQ29uZmlndXJhdGlvblZpZXcuUG9wdXAucmVzdG9yZSA9ICZSZXN0b3JlDQotQ29uZmlndXJhdGlvblZpZXcuUG9wdXAucHJlc2VydmUgPSAmU2F2ZQ0KLUNvbmZpZ3VyYXRpb25WaWV3LlBvcHVwLnJlbW92ZVByZXNlcnZlZD0mUmVtb3ZlDQotQ29uZmlndXJhdGlvblZpZXcuUG9wdXAudW5saW5rID0gJlVubGluaw0KLUNvbmZpZ3VyYXRpb25WaWV3LlBvcHVwLnNob3dTdGF0dXMgPSBTaG8mdyBTdGF0dXMuLi4NCi1Db25maWd1cmF0aW9uVmlldy5oaXN0b3J5Rm9sZGVyID0gQ29uZmlndXJhdGlvbiBIaXN0b3J5DQotQ29uZmlndXJhdGlvblZpZXcuc2F2ZWRGb2xkZXIgPSBTYXZlZCBDb25maWd1cmF0aW9ucw0KLUNvbmZpZ3VyYXRpb25WaWV3LnN0YXR1c1RpdGxlID0gRmVhdHVyZSBTdGF0dXMNCi1Db25maWd1cmF0aW9uVmlldy5zdGF0dXNEZWZhdWx0ID0gVGhlIGZlYXR1cmUgaXMgY29uZmlndXJlZCBwcm9wZXJseS4NCi1Db25maWd1cmF0aW9uVmlldy5taXNzaW5nRmVhdHVyZSA9IHswfSAobm90IGluc3RhbGxlZCkNCi1Db25maWd1cmF0aW9uVmlldy5taXNzaW5nT3B0aW9uYWxTdGF0dXMgPSBUaGlzIG9wdGlvbmFsIGZlYXR1cmUgaXMgY3VycmVudGx5IG5vdCBpbnN0YWxsZWQuDQotQ29uZmlndXJhdGlvblZpZXcubWlzc2luZ1N0YXR1cyA9IFJlZmVyZW5jZWQgZmVhdHVyZSBub3QgZm91bmQuDQotQ29uZmlndXJhdGlvblZpZXcuc2F2aW5nRXJyb3JzID0gRXJyb3JzIHdoaWxlIHNhdmluZyB0aGUgc2VsZWN0ZWQgY29uZmlndXJhdGlvbnMuDQotQ29uZmlndXJhdGlvblZpZXcubG9hZGluZyA9IExvYWRpbmc6XCANCi0NCi1Ib21lUGFnZS50aXRsZSA9IFdlbGNvbWUgdG8gRWNsaXBzZSBVcGRhdGUNCi0NCi1Ib21lUGFnZS51cGRhdGVzLnRpdGxlPSBGZWF0dXJlIFVwZGF0ZXMNCi1Ib21lUGFnZS51cGRhdGVzLmRlc2M9PGZvcm0+PHA+VG8gY2hlY2sgZm9yIHVwZGF0ZXMgZm9yIGZlYXR1cmVzIHlvdSBcDQotaGF2ZSBpbnN0YWxsZWQsIGdvIHRvIDxpbWcgaHJlZj0iaW1hZ2UxIi8+IDxhIGhyZWY9ImFjdGlvbjEiPkZlYXR1cmUgVXBkYXRlczwvYT4gYW5kIHNlbGVjdCBcDQotPGI+QXZhaWxhYmxlIFVwZGF0ZXM8L2I+LiA8Yj5TZWFyY2g8L2I+IHBhZ2Ugd2lsbCBcDQotYmUgc2hvd24gYWxsb3dpbmcgeW91IHRvIGluaXRpYXRlIGFuZCBjdXN0b21pemUgdGhlIHNlYXJjaC48L3A+PC9mb3JtPg0KLQ0KLUhvbWVQYWdlLmluc3RhbGxzLnRpdGxlID0gSW5zdGFsbGluZyBOZXcgRmVhdHVyZXMNCi1Ib21lUGFnZS5pbnN0YWxscy5kZXNjID0gPGZvcm0+PHA+VG8gaW5zdGFsbCBuZXcgZmVhdHVyZXMsIG9wZW4gXA0KLTxpbWcgaHJlZj0iaW1hZ2UxIi8+IDxhIGhyZWY9ImFjdGlvbjEiPkZlYXR1cmUgVXBkYXRlczwvYT4gdmlldyBhbmQgZXhwYW5kIHRoZSBkZXNpcmVkIHNpdGUgXA0KLSh0aGlzIG9wZXJhdGlvbiBtYXkgdGFrZSB0aW1lKS4gU2VsZWN0IGZlYXR1cmVzIGFuZCByZWFkIGFib3V0IFwNCi10aGVtIGluIHRoZSA8Yj5QcmV2aWV3PC9iPi48L3A+XA0KLTxwPklmIHlvdSBoYXZlIGEgcmVtb3ZhYmxlIGRldmljZSAoZS5nLiBhIENELVJPTSkgdGhhdCBjb250YWlucyB1cGRhdGVzLCBcDQoteW91IGNhbiBuYXZpZ2F0ZSB0byB0aGVtIGZyb20gPGI+TXkgQ29tcHV0ZXI8L2I+IG9iamVjdC4gWW91IGNhbiBhbHNvIGNyZWF0ZSBcDQotY29uZmlndXJhYmxlIHNlYXJjaGVzIGluIG9yZGVyIHRvIGxvY2F0ZSBmZWF0dXJlcyB0aGF0IG1hdGNoIGEgc3BlY2lmaWMgcXVlcnkuIFRvIFwNCi1jcmVhdGUgYSBzZWFyY2gsIHNlbGVjdCA8Yj5OZXc8L2I+LCA8Yj5TZWFyY2guLi48L2I+IGZyb20gdGhlIHBvcC11cCBtZW51IGluIDxiPkZlYXR1cmUgVXBkYXRlczwvYj48L3A+PC9mb3JtPg0KLQ0KLUhvbWVQYWdlLnVuaW5zdGFsbHMudGl0bGUgPSBXb3JraW5nIFdpdGggSW5zdGFsbGVkIEZlYXR1cmVzDQotSG9tZVBhZ2UudW5pbnN0YWxzLmRlc2MgPSA8Zm9ybT48cD5GZWF0dXJlcyB0aGF0IGhhdmUgYmVlbiBwcmV2aW91c2x5IGluc3RhbGxlZCBjYW4gYmUgXA0KLTxiPmRpc2FibGVkPC9iPiB0byBtYWtlIHRoZW0gaW52aXNpYmxlIHRvIHlvdSBhcHBsaWNhdGlvbiwgb3IgcmUtPGI+ZW5hYmxlZDwvYj4gdG8gbWFrZSBcDQotdGhlbSB2aXNpYmxlIGFnYWluLiBEaXNhYmxlZCBmZWF0dXJlcyBhcmUgc3RpbGwgcGh5c2ljYWxseSBwcmVzZW50IG9uIHlvdXIgY29tcHV0ZXIuPC9wPlwNCi08cD5UbyB2aWV3IHRoZSBjdXJyZW50bHkgZW5hYmxlZCBmZWF0dXJlcywgZXhwYW5kIDxiPkN1cnJlbnQgQ29uZmlndXJhdGlvbjwvYj4gb2JqZWN0IGluIFwNCi08aW1nIGhyZWY9ImltYWdlMSIvPiA8YSBocmVmPSJhY3Rpb24xIj5JbnN0YWxsIENvbmZpZ3VyYXRpb25zPC9hPiB2aWV3LjwvcD48L2Zvcm0+DQotDQotSG9tZVBhZ2UuaGlzdG9yeS50aXRsZSA9IEluc3RhbGxhdGlvbiBIaXN0b3J5DQotSG9tZVBhZ2UuaGlzdG9yeS5kZXNjID0gPGZvcm0+PHA+VGhlIGhpc3Rvcnkgb2YgeW91ciBhY3Rpdml0eSBpcyBrZXB0IGluIHRoZSA8Yj5pbnN0YWxsYXRpb24gaGlzdG9yeTwvYj4uIFwNCi1Zb3UgY2FuIHJldmlldyBpdCBieSBleHBhbmRpbmcgPGI+SGlzdG9yeTwvYj4gZm9sZGVyIGluIHRoZSA8YSBocmVmPSJhY3Rpb24xIj5JbnN0YWxsIENvbmZpZ3VyYXRpb25zPC9hPiB2aWV3LiBcDQotT25seSBhIGxpbWl0ZWQgbnVtYmVyIG9mIGhpc3Rvcnkgb2JqZWN0cyBhcmUga2VwdC4gWW91IGNhbiBwcmVzZXJ2ZSBzdGFibGUgY29uZmlndXJhdGlvbnMgXA0KLWluIG9yZGVyIHRvIGJlIGFibGUgdG8gcmVjcmVhdGUgdGhlbSBhdCBhIGxhdGVyIGRhdGUuPC9wPjwvZm9ybT4NCi0NCi1OZXdTaXRlRGlhbG9nLnRpdGxlID0gTmV3IFNpdGUgQm9va21hcmsNCi1OZXdTaXRlRGlhbG9nLnVybCA9ICZTaXRlIFVSTDoNCi1OZXdTaXRlRGlhbG9nLm5hbWUgPSBTaXRlICZOYW1lOg0KLQ0KLU5ld0ZvbGRlckRpYWxvZy50aXRsZSA9IE5ldyBGb2xkZXINCi1OZXdGb2xkZXJEaWFsb2cubmFtZT0gJkZvbGRlciBOYW1lOg0KLQ0KLU5ld1NlYXJjaERpYWxvZy50aXRsZSA9IE5ldyBTZWFyY2gNCi1OZXdTZWFyY2hEaWFsb2cubmFtZSA9ICZTZWFyY2ggTmFtZToNCi1OZXdTZWFyY2hEaWFsb2cuY2F0ZWdvcnkgPSBTZWFyY2ggJkNhdGVnb3J5Og0KLQ0KLUNvbmZpcm1EZWxldGUudGl0bGUgPSBDb25maXJtIERlbGV0ZQ0KLUNvbmZpcm1EZWxldGUubXVsdGlwbGUgPSBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoZXNlIHswfSBpdGVtcz8NCi1Db25maXJtRGVsZXRlLnNpbmdsZSA9IEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgInswfSI/DQotDQotU2l0ZUJvb2ttYXJrUHJvcGVydHlQYWdlLm5hbWUgPSAmTmFtZToNCi1TaXRlQm9va21hcmtQcm9wZXJ0eVBhZ2UuYWRkcmVzcyA9IEEmZGRyZXNzOg0KLVNpdGVCb29rbWFya1Byb3BlcnR5UGFnZS51cGRhdGVTaXRlID0gJlVwZGF0ZSBzaXRlDQotU2l0ZUJvb2ttYXJrUHJvcGVydHlQYWdlLndlYlNpdGUgPSAmV2ViIHNpdGUNCi1OYW1lZE9iamVjdFByb3BlcnR5UGFnZS5uYW1lID0gJk5hbWU6DQotTmFtZWRPYmplY3RQcm9wZXJ0eVBhZ2UuZXhpc3RzID0gInswfSIgYWxyZWFkeSBleGlzdHMuDQotQ29uZmlndXJhdGlvblByb3BlcnR5UGFnZS5uYW1lID0gJkNvbmZpZ3VyYXRpb24gTmFtZToNCi1TaXRlQ2F0ZWdvcnkub3RoZXIubGFiZWwgPSBPdGhlcg0KLVNpdGVDYXRlZ29yeS5vdGhlci5kZXNjcmlwdGlvbiA9IEZlYXR1cmVzIGZvdW5kIHVuZGVyIHRoaXMgY2F0ZWdvcnkgYXJlIGVpdGhlciBub3QgY2F0ZWdvcml6ZWQgb3IgdGhlaXIgY2F0ZWdvcmllcyBjb3VsZCBub3QgYmUgZm91bmQgb24gc2VydmVyLg0KLQ0KLVNpdGVCb29rbWFya1Byb3BlcnR5U291cmNlLnVybC5sYWJlbD1TaXRlIFVSTA0KLVNpdGVCb29rbWFya1Byb3BlcnR5U291cmNlLnVybC5kZXNjPWEgVVJMIG9mIHRoZSB1cGRhdGUgc2l0ZQ0KLVNpdGVCb29rbWFya1Byb3BlcnR5U291cmNlLm5hbWUubGFiZWw9U2l0ZSBuYW1lDQotU2l0ZUJvb2ttYXJrUHJvcGVydHlTb3VyY2UubmFtZS5kZXNjPWEgZGlzcGxheSBuYW1lIG9mIHRoZSB1cGRhdGUgc2l0ZQ0KLQ0KLVNpdGVQYWdlLmRlc2MgPSA8Zm9ybT48cD5FeHBhbmQgdGhlIHNpdGUgZm9sZGVyIHRvIGJyb3dzZSB0aGUgXA0KLWZlYXR1cmVzIGF2YWlsYWJsZSBmb3IgZG93bmxvYWQuIEJ5IGRlZmF1bHQsIGZlYXR1cmVzIGFyZSBjYXRlZ29yaXplZCBpZiBcDQotY2F0ZWdvcnkgaW5mb3JtYXRpb24gZXhpc3RzIG9uIHRoZSBzaXRlLjwvcD48cD5UbyB2aWV3IGZlYXR1cmVzIGluIFwNCi1hIGZsYXQgbGlzdCwgdW5jaGVjayA8Yj5TaG93IFNpdGUgQ2F0ZWdvcmllczwvYj4gb3B0aW9uIGF2YWlsYWJsZSBvbiBcDQotdGhlIHB1bGwtZG93biBtZW51IG9mIHRoZSA8aW1nIGhyZWY9InVwZGF0ZVNpdGVzIi8+IDxiPkZlYXR1cmUgVXBkYXRlczwvYj4gdmlldy48L3A+XA0KLTxwPkZlYXR1cmVzIGNhbiBiZSBkZXNpZ25lZCB0byB3b3JrIG9uIGNlcnRhaW4gcGxhdGZvcm1zIG9ubHkuIFRoZXNlIGZlYXR1cmVzIFwNCi13aWxsIG5vdCBzaG93IHVwIGluIHRoZSA8Yj5GZWF0dXJlIFVwZGF0ZXM8L2I+IHZpZXcgdW5sZXNzIHlvdSB1bmNoZWNrIFwNCi08Yj5TaG93IE1hdGNoaW5nIEZlYXR1cmVzIE9ubHk8L2I+IG9wdGlvbiBvbiB0aGUgc2FtZSBwdWxsLWRvd24gbWVudS5cDQotPC9wPjwvZm9ybT4NCi1TaXRlUGFnZS5saW5rID0gU2l0ZSBob21lIHBhZ2UNCi0NCi1TaXRlUGFnZS53ZGVzYyA9IDxmb3JtPlwNCi08cD5UaGUgV2ViIHNpdGUgYm9va21hcmsgY2FuIGJlIHVzZWQgdG8gcHJlc2VydmUgYWRkcmVzc2VzIG9mIHJlZ3VsYXIgXA0KLVdlYiBzaXRlcy4gV2hlbiBvcGVuZWQsIFdlYiBzaXRlIGJvb2ttYXJrIHdpbGwgb3BlbiBpbnRvIHRoZSBjdXJyZW50bHkgXA0KLWNvbmZpZ3VyZWQgV2ViIGJyb3dzZXIuXA0KLTwvcD48L2Zvcm0+DQotU2l0ZVBhZ2Uud2xpbmsgPSBPcGVuIFdlYiBzaXRlDQotDQotVXBkYXRlc1ZpZXcuUG9wdXAubmV3PSZOZXcNCi1VcGRhdGVzVmlldy5Qb3B1cC5uZXdTaXRlID0gU2l0ZSAmQm9va21hcmsuLi4NCi1VcGRhdGVzVmlldy5Qb3B1cC5uZXdGb2xkZXIgPSAmRm9sZGVyLi4uDQotVXBkYXRlc1ZpZXcuUG9wdXAubmV3U2VhcmNoID0gJlNlYXJjaC4uLg0KLVVwZGF0ZXNWaWV3LlBvcHVwLm5ld0xvY2FsU2l0ZSA9IEJvb2ttYXJrICZMb2NhdGlvbi4uLg0KLVVwZGF0ZXNWaWV3LlBvcHVwLmRlbGV0ZSA9ICZEZWxldGUNCi1VcGRhdGVzVmlldy5Qb3B1cC5vcGVuV2ViID0gJk9wZW4NCi1VcGRhdGVzVmlldy5Qb3B1cC5jdXQgPSBDdSZ0DQotVXBkYXRlc1ZpZXcuUG9wdXAuY29weSA9ICZDb3B5DQotVXBkYXRlc1ZpZXcuUG9wdXAucGFzdGUgPSAmUGFzdGUNCi1VcGRhdGVzVmlldy5Qb3B1cC5yZWZyZXNoID0gJlJlZnJlc2gNCi1VcGRhdGVzVmlldy5Qb3B1cC5yZWZyZXNoLnRvb2x0aXAgPSBSZWZyZXNoDQotVXBkYXRlc1ZpZXcuUG9wdXAuc2hvd1NlYXJjaFJlc3VsdCA9ICZTaG93IFNlYXJjaCBSZXN1bHRzDQotVXBkYXRlc1ZpZXcuUG9wdXAubGlua0V4dGVuc2lvbiA9IExpbmsgUHJvZHVjdCAmRXh0ZW5zaW9uDQotVXBkYXRlc1ZpZXcubWVudS5zaG93RmlsZXMgPSAmU2hvdyBNeSBDb21wdXRlciBGaWxlcw0KLVVwZGF0ZXNWaWV3Lm1lbnUuc2hvd0NhdGVnb3JpZXMgPSBTaG93IFNpdGUgJkNhdGVnb3JpZXMNCi1VcGRhdGVzVmlldy5tZW51LmZpbHRlckVudmlyb25tZW50ID0gU2hvdyAmTWF0Y2hpbmcgRmVhdHVyZXMgT25seQ0KLVVwZGF0ZXNWaWV3Lm5ld1NlYXJjaC50aXRsZSA9IE5ldyBTZWFyY2gNCi1VcGRhdGVzVmlldy5uZXdCb29rbWFyay50aXRsZSA9IE5ldyBTaXRlIEJvb2ttYXJrDQotVXBkYXRlc1ZpZXcubmV3Rm9sZGVyLnRpdGxlID0gTmV3IEZvbGRlcg0KLVVwZGF0ZXNWaWV3LmNvbm5lY3RpbmcgPSBDb25uZWN0aW5nLi4uDQotVXBkYXRlc1ZpZXcudXBkYXRpbmcgPSBVcGRhdGluZy4uLg0KLQ0KLVNlYXJjaFJlc3VsdFZpZXcuY29sdW1uLmZlYXR1cmUgPSBGZWF0dXJlDQotU2VhcmNoUmVzdWx0Vmlldy5jb2x1bW4ucHJvdmlkZXIgPSBQcm92aWRlcg0KLVNlYXJjaFJlc3VsdFZpZXcuY29sdW1uLnNpdGUgPSBTaXRlDQotU2VhcmNoUmVzdWx0Vmlldy5jb2x1bW4udmVyc2lvbiA9IFZlcnNpb24NCi1TZWFyY2hSZXN1bHRWaWV3LmNvbHVtbi5zaXplID0gU2l6ZQ0KLVNlYXJjaFJlc3VsdFZpZXcuY29sdW1uLnNpemVVbmtub3duID0gTi9BDQotU2VhcmNoUmVzdWx0Vmlldy50aXRsZSA9IHswfSAtIHsxfSAoezJ9KQ0KLVNlYXJjaFJlc3VsdFZpZXcuc2hvd1NlYXJjaC5sYWJlbCA9ICZTaG93IFNlYXJjaCBQYWdlDQotU2VhcmNoUmVzdWx0Vmlldy5zaG93U2VhcmNoLnRvb2x0aXAgPSBTaG93IFNlYXJjaCBQYWdlDQotDQotSXRlbXNWaWV3LnRpdGxlID0gezB9ICh7MX0gdGFza3MsIHsyfSBjb21wbGV0ZWQpDQotSXRlbXNWaWV3LnBvcHVwLmRlbGV0ZSA9IEQmZWxldGUNCi1JdGVtc1ZpZXcucG9wdXAucHJvY2VzcyA9ICZQcm9jZXNzDQotSXRlbXNWaWV3LnBvcHVwLnByb2Nlc3NBbGwgPSBQcm9jZXNzICZBbGwNCi0NCi1EaXNjb3ZlcnlGb2xkZXIgPSBTaXRlcyB0byBWaXNpdA0KLURpc2NvdmVyeUZvbGRlclBhZ2UudGl0bGUgPSBTaXRlcyB0byBWaXNpdA0KLURpc2NvdmVyeUZvbGRlclBhZ2UuZGVzYyA9IFRoaXMgZm9sZGVyIGNvbnRhaW5zIGxpbmtzIHRvIHRoZSB1cGRhdGUgc2l0ZXMgcHJvdmlkZWQgYnkgZmVhdHVyZXMgXA0KLWluc3RhbGxlZCBpbiB0aGlzIGFwcGxpY2F0aW9uLiBGZWF0dXJlIHByb3ZpZGVycyBpbmNsdWRlIHRoZW0gdG8gbGV0IHlvdSBrbm93IGFib3V0IHNpdGVzIFwNCi10aGF0IGNvbnRhaW4gZmVhdHVyZXMgeW91IG1pZ2h0IHdhbnQgdG8gdHJ5IG91dC4NCi0NCi1CYXNlTmV3V2l6YXJkUGFnZS5uYW1lID0gJk5hbWU6DQotQmFzZU5ld1dpemFyZFBhZ2UuY3JlYXRlSW4gPSAmQ3JlYXRlIGluOg0KLUJhc2VOZXdXaXphcmRQYWdlLmV4aXN0aW5nID0gJkV4aXN0aW5nIGZvbGRlcnM6DQotQmFzZU5ld1dpemFyZFBhZ2UuaW52YWxpZCA9IENvbnRhaW5lciBwYXRoIGlzIGludmFsaWQNCi1CYXNlTmV3V2l6YXJkUGFnZS5taXNzaW5nTmFtZSA9IE5hbWUgbXVzdCBiZSBzcGVjaWZpZWQuDQotDQotTmV3Rm9sZGVyV2l6YXJkUGFnZS50aXRsZSA9IENyZWF0ZSBOZXcgRm9sZGVyDQotTmV3Rm9sZGVyV2l6YXJkUGFnZS5kZXNjID0gWW91IGNhbiBcDQotY2hvb3NlIGFuIGV4aXN0aW5nIGZvbGRlciBhcyBhIGNvbnRhaW5lciBvciBjcmVhdGUgYSBuZXcgcm9vdCBmb2xkZXIuDQotDQotTmV3U2VhcmNoV2l6YXJkUGFnZS50aXRsZSA9IE5ldyBGZWF0dXJlIFNlYXJjaA0KLU5ld1NlYXJjaFdpemFyZFBhZ2UuZGVzYyA9IENyZWF0ZSBhIG5ldyBzZWFyY2ggZm9yIGZlYXR1cmVzLiBVc2UgZm9sZGVycyB0byBvcmdhbml6ZSBcDQoteW91ciBzZWFyY2ggb2JqZWN0cy4NCi1OZXdTZWFyY2hXaXphcmRQYWdlLmNhdGVnb3J5ID0gQ2F0ZSZnb3J5Og0KLQ0KLU5ld1NpdGVCb29rbWFya1dpemFyZFBhZ2UudGl0bGUgPSBOZXcgVXBkYXRlIFNpdGUgQm9va21hcmsNCi1OZXdTaXRlQm9va21hcmtXaXphcmRQYWdlLmRlc2MgPSBCb29rbWFyayBhbiB1cGRhdGUgc2l0ZS4gVXNlIGZvbGRlcnMgdG8gb3JnYW5pemUgXA0KLXlvdXIgYm9va21hcmtzLg0KLU5ld1NpdGVCb29rbWFya1dpemFyZFBhZ2UudXJsID0gJlVSTDoNCi1OZXdTaXRlQm9va21hcmtXaXphcmRQYWdlLmh0dHAgPSBodHRwOi8vDQotTmV3U2l0ZUJvb2ttYXJrV2l6YXJkUGFnZS5pbnZhbGlkID0gSW52YWxpZCBVUkwgZm9ybWF0DQotTmV3U2l0ZUJvb2ttYXJrV2l6YXJkUGFnZS50eXBlID0gQm9va21hcmsgdHlwZToNCi1OZXdTaXRlQm9va21hcmtXaXphcmRQYWdlLnVwZGF0ZVR5cGUgPSBFYyZsaXBzZSB1cGRhdGUgc2l0ZQ0KLU5ld1NpdGVCb29rbWFya1dpemFyZFBhZ2Uud2ViVHlwZSA9ICZXZWIgc2l0ZQ0KLQ0KLVVwZGF0ZXNQYWdlLnRpdGxlID0gQXZhaWxhYmxlIFVwZGF0ZXMNCi1TZWFyY2hQYWdlLnRpdGxlID0gU2VhcmNoDQotU2VhcmNoUGFnZS5sYXN0U2VhcmNoID0gTGFzdCBzZWFyY2g6IHswfQ0KLVNlYXJjaFBhZ2Uubm9MYXN0U2VhcmNoID0gTGFzdCBzZWFyY2g6IG4vYQ0KLVNlYXJjaFBhZ2Uuc2VhcmNoTm93ID0gU2VhcmNoIE5vdw0KLVNlYXJjaFBhZ2UuY2FuY2VsID0gQ2FuY2VsDQotU2VhcmNoUGFnZS5kZXNjPTxmb3JtPjxwPlNlYXJjaCB0aGUgdXBkYXRlIHNpdGVzIGZvciBmZWF0dXJlcyB1c2luZyB2YXJpb3VzIHNlYXJjaCBjcml0ZXJpYS5cDQotPC9wPjwvZm9ybT4NCi1TZWFyY2hQYWdlLnF1ZXJ5LmxhYmVsPSBRdWVyeSBTZXR0aW5ncw0KLVNlYXJjaFBhZ2UucXVlcnkuY2F0ZWdvcnk9IFNlYXJjaCBDYXRlZ29yeToNCi1TZWFyY2hQYWdlLm9wdGlvbnMubGFiZWwgPSBTY29wZSBTZXR0aW5ncw0KLVNlYXJjaFBhZ2Uub3B0aW9ucy5teUNvbXB1dGVyQ2hlY2sgPSBJbmNsdWRlIE15IENvbXB1dGVyIGluIHRoZSBzZWFyY2gNCi1TZWFyY2hQYWdlLm9wdGlvbnMubXlDb21wdXRlclNldHRpbmdzLnRpdGxlID0gU2VhcmNoIFNldHRpbmdzDQotU2VhcmNoUGFnZS5vcHRpb25zLm15Q29tcHV0ZXJTZXR0aW5ncyA9IFNldHRpbmdzLi4uDQotU2VhcmNoUGFnZS5vcHRpb25zLmZ1bGxNb2RlQ2hlY2sgPSBTaG93IHJlc3VsdHMgaW4gZXh0ZW5kZWQgZm9ybQ0KLVNlYXJjaFBhZ2Uub3B0aW9ucy5ib29rbWFya0NoZWNrID0gU2VhcmNoIGJvb2ttYXJrZWQgc2l0ZXMNCi1TZWFyY2hQYWdlLm9wdGlvbnMuZGlzY292ZXJ5Q2hlY2sgPSBTZWFyY2ggc2l0ZXMgaW4gIlNpdGVzIHRvIFZpc2l0IiBmb2xkZXINCi1TZWFyY2hQYWdlLm9wdGlvbnMuZmlsdGVyQ2hlY2sgPSBPbmx5IGluY2x1ZGUgZmVhdHVyZXMgYXBwbGljYWJsZSB0byB0aGlzIGVudmlyb25tZW50DQotDQotTXlDb21wdXRlclNlYXJjaERpYWxvZy5sYWJlbCA9IFNlbGVjdCB0aGUgdm9sdW1lcyB0aGF0IHNob3VsZCBiZSBzZWFyY2hlZDoNCi0NCi1FeHByZXNzaW9uU2VhcmNoQ2F0ZWdvcnkuZXhwcmVzc2lvbiA9IEV4cHJlc3Npb246DQotRXhwcmVzc2lvblNlYXJjaENhdGVnb3J5LmNhc2UgPSBDYXNlIHNlbnNpdGl2ZQ0KLUV4cHJlc3Npb25TZWFyY2hDYXRlZ29yeS5sb29rID0gTG9vayBmb3IgZXhwcmVzc2lvbiBpbjoNCi1FeHByZXNzaW9uU2VhcmNoQ2F0ZWdvcnkubmFtZSA9IEZlYXR1cmUgbmFtZQ0KLUV4cHJlc3Npb25TZWFyY2hDYXRlZ29yeS5wcm92aWRlciA9IEZlYXR1cmUgcHJvdmlkZXINCi1FeHByZXNzaW9uU2VhcmNoQ2F0ZWdvcnkuZGVzY3JpcHRpb24gPSBGZWF0dXJlIGRlc2NyaXB0aW9uDQotDQotVXBkYXRlc1NlYXJjaENhdGVnb3J5LmN1cnJlbnRTZWFyY2ggPSBBdmFpbGFibGUgRmVhdHVyZSBVcGRhdGVzDQotUGx1Z2luU2VhcmNoQ2F0ZWdvcnkubmV3ID0gQWRkLi4uDQotUGx1Z2luU2VhcmNoQ2F0ZWdvcnkubmV3LnRpdGxlID0gTmV3IFBsdWctaW4NCi1QbHVnaW5TZWFyY2hDYXRlZ29yeS5kZWxldGUgPSBEZWxldGUNCi0NCi1BdmFpbGFibGVVcGRhdGVzLm5hbWUgPSBBdmFpbGFibGUgVXBkYXRlcw0KLVNlYXJjaC5iZWdpbiA9IFNlYXJjaGluZyBmb3IgdXBkYXRlczoNCi1TZWFyY2gubXlDb21wdXRlciA9IFNjYW5uaW5nIE15IENvbXB1dGVyOg0KLVNlYXJjaC5jb250YWN0aW5nID0gQ29udGFjdGluZyBzaXRlICJ7MH0iIC4uLg0KLVNlYXJjaC5jaGVja2luZyA9IFNlYXJjaGluZyAiezB9Ii4uLg0KLQ0KLVVwZGF0ZXNQYWdlLlNlYXJjaFJlc3VsdFNlY3Rpb24udGl0bGUgPSBTZWFyY2ggUmVzdWx0cw0KLVVwZGF0ZXNQYWdlLlNlYXJjaFJlc3VsdFNlY3Rpb24uZGVzYyA9IFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgc2F0aXNmeSB0aGUgc2VhcmNoIGNyaXRlcmlhICh7MH0pOg0KLVVwZGF0ZXNQYWdlLlNlYXJjaFJlc3VsdFNlY3Rpb24ubm9kZXNjID0gTm8gZmVhdHVyZXMgZm91bmQuDQotVXBkYXRlc1BhZ2UuU2VhcmNoUmVzdWx0U2VjdGlvbi5zdGFydGRlc2MgPSBTZWFyY2ggaW4gcHJvZ3Jlc3MgLi4uDQotVXBkYXRlc1BhZ2UuU2VhcmNoUmVzdWx0U2VjdGlvbi5yZXN1bHRFbnRyeSA9IFwNCi08Zm9ybT48cD48YSBocmVmPSJvcGVuRmVhdHVyZSI+ezB9PC9hPjwvcD5cDQotPHA+UHJvdmlkZXI6IDxiPnsxfTwvYj48L3A+XA0KLTxwIGFkZFZlcnRpY2FsU3BhY2U9ImZhbHNlIj5Gb3VuZCBhdDogPGEgaHJlZj0ib3BlblNpdGUiPnsyfTwvYT48L3A+XA0KLXszfVwNCi08L2Zvcm0+DQotDQotQnJvd3NlclBhZ2UuYWRkcmVzcyA9IEFkZHJlc3M6DQotQnJvd3NlclBhZ2Uuc3RvcCA9IFN0b3ANCi1Ccm93c2VyUGFnZS5nbyA9IEdvDQotQnJvd3NlclBhZ2UucmVmcmVzaCA9IFJlZnJlc2gNCi0NCi1XZWJCcm93c2VyVmlldy5ub3RBdmFpbGFibGUgPSBFbWJlZGRlZCBXZWIgYnJvd3NlciBpcyBub3QgYXZhaWxhYmxlLiBcDQotUmVxdWllc3RzIGZvciBvcGVuaW5nIFVSTHMgYXJlIHByb2Nlc3NlZCB1c2luZyBXZWIgYnJvd3NlciByZWdpc3RlcmVkIHRvIGhhbmRsZSBcDQotV2ViIHBhZ2VzIG9uIHlvdXIgc3lzdGVtLg0KLVdlYkJyb3dzZXJWaWV3LmFkZHJlc3MgPSBBZGRyZXNzOg0KLVdlYkJyb3dzZXJWaWV3LnN0b3AgPSBTdG9wDQotV2ViQnJvd3NlclZpZXcuZ28gPSBHbw0KLVdlYkJyb3dzZXJWaWV3LnJlZnJlc2ggPSBSZWZyZXNoDQotV2ViQnJvd3NlclZpZXcuYmFja3dhcmQgPSBHbyBCYWNrDQotV2ViQnJvd3NlclZpZXcuZm9yd2FyZCA9IEdvIEZvcndhcmQNCi0NCi0NCi1OZXdVcGRhdGVzLm5vVXBkYXRlcy50aXRsZSA9IE5ldyBVcGRhdGVzDQotTmV3VXBkYXRlcy5ub1VwZGF0ZXMubWVzc2FnZSA9IFRoZXJlIGFyZSBubyBuZXcgdXBkYXRlcyBmb3IgdGhlIGluc3RhbGxlZCBmZWF0dXJlcy4gXA0KLU5vdGUgdGhhdCB0aGUgc2V0dGluZ3MgaW4gdGhlIFByZWZlcmVuY2VzIChJbnN0YWxsL1VwZGF0ZSBwYWdlKSBhZmZlY3QgXA0KLXRoZSBzZWFyY2ggcmVzdWx0cy4NCi1OZXdVcGRhdGVzV2l6YXJkLmluc3RhbGxpbmcgPSBJbnN0YWxsaW5nIHVwZGF0ZXMuLi4NCi1OZXdVcGRhdGVzV2l6YXJkLk1haW5QYWdlLnRpdGxlID0gQXZhaWxhYmxlIFVwZGF0ZXMgDQotTmV3VXBkYXRlc1dpemFyZC5NYWluUGFnZS50YWJsZUxhYmVsID0gQXZhaWxhYmxlICZ1cGRhdGVzIChzZWUgUHJlZmVyZW5jZXMgZm9yIHNlYXJjaCBjb25zdHJhaW50cyk6DQotTmV3VXBkYXRlc1dpemFyZC5NYWluUGFnZS5kZXNjID0gTmV3IHVwZGF0ZXMgaGF2ZSBiZWVuIGZvdW5kIGZvciB0aGUgaW5zdGFsbGVkIGZlYXR1cmVzLiBcDQotU2VsZWN0IHRoZSB1cGRhdGVzIHlvdSB3YW50IHRvIGluc3RhbGwuDQotTmV3VXBkYXRlc1dpemFyZC5NYWluUGFnZS5zZWxlY3RBbGwgPSAmU2VsZWN0IEFsbA0KLU5ld1VwZGF0ZXNXaXphcmQuTWFpblBhZ2UuZGVzZWxlY3RBbGwgPSBEZXNlbGVjdCAmQWxsDQotTmV3VXBkYXRlc1dpemFyZC5NYWluUGFnZS5tb3JlSW5mbyA9ICZNb3JlIEluZm8NCi1OZXdVcGRhdGVzV2l6YXJkLk1haW5QYWdlLmNvbHVtbi5mZWF0dXJlID0gRmVhdHVyZQ0KLU5ld1VwZGF0ZXNXaXphcmQuTWFpblBhZ2UuY29sdW1uLnZlcnNpb24gPSBWZXJzaW9uDQotTmV3VXBkYXRlc1dpemFyZC5NYWluUGFnZS5jb2x1bW4ucHJvdmlkZXIgPSBQcm92aWRlcg0KLU5ld1VwZGF0ZXNXaXphcmQuTWFpblBhZ2UuY29sdW1uLnNpemUgPSBTaXplDQotTmV3VXBkYXRlc1dpemFyZC5NYWluUGFnZS5jb2x1bW4uc2l6ZVVua25vd24gPSBOL0ENCi1OZXdVcGRhdGVzV2l6YXJkLk1haW5QYWdlLmZlYXR1cmVEZXNjID0gJkRlc2NyaXB0aW9uOg0KLU5ld1VwZGF0ZXNXaXphcmQuTWFpblBhZ2UuY291bnRlciA9IHswfSBvdXQgb2YgezF9IHNlbGVjdGVkLg0KLQ0KLU5ld1VwZGF0ZXNXaXphcmQuTWFpblBhZ2UuZmlsdGVyQ2hlY2sgPSBGaWwmdGVyIGZlYXR1cmVzIGluY2x1ZGVkIGluIG90aGVyIGZlYXR1cmVzIG9uIHRoZSBsaXN0DQotTmV3VXBkYXRlc1dpemFyZC5NYWluUGFnZS5kdXBsaWNhdGVXYXJuaW5nID0gU29tZSBvZiB0aGUgc2VsZWN0ZWQgZmVhdHVyZXMgYXJlIGFscmVhZHkgY29udGFpbmVkIGluIG90aGVycy4gVXNlIGZpbHRlciBidXR0b24gdG8gYXZvaWQgZHVwbGljYXRlcy4NCi0NCi1JbnN0YWxsV2l6YXJkLnd0aXRsZSA9IEluc3RhbGwNCi1JbnN0YWxsV2l6YXJkLkxpY2Vuc2VQYWdlLnRpdGxlID0gRmVhdHVyZSBMaWNlbnNlDQotSW5zdGFsbFdpemFyZC5MaWNlbnNlUGFnZS5kZXNjID0gVGhpcyBmZWF0dXJlIGhhcyBhIGxpY2Vuc2UgXA0KLWFncmVlbWVudCB0aGF0IHlvdSBuZWVkIHRvIGFjY2VwdCBiZWZvcmUgcHJvY2VlZGluZyB3aXRoIFwNCi10aGUgaW5zdGFsbGF0aW9uLg0KLUluc3RhbGxXaXphcmQuTGljZW5zZVBhZ2UuZGVzYzIgPSBTb21lIG9mIHRoZSBmZWF0dXJlcyBoYXZlIGxpY2Vuc2UgXA0KLWFncmVlbWVudHMgdGhhdCB5b3UgbmVlZCB0byBhY2NlcHQgYmVmb3JlIHByb2NlZWRpbmcgd2l0aCBcDQotdGhlIGluc3RhbGxhdGlvbi4NCi1JbnN0YWxsV2l6YXJkLkxpY2Vuc2VQYWdlLnVwPSZQcmV2aW91cyBMaWNlbnNlDQotSW5zdGFsbFdpemFyZC5MaWNlbnNlUGFnZS5kb3duPU5leHQgJkxpY2Vuc2UNCi1JbnN0YWxsV2l6YXJkLkxpY2Vuc2VQYWdlLmhlYWRlcj17MH0gb3V0IG9mIHsxfTogezJ9ICh7M30pDQotSW5zdGFsbFdpemFyZC5MaWNlbnNlUGFnZS5hY2NlcHQgPSBJICZhY2NlcHQgdGhlIHRlcm1zIGluIHRoZSBsaWNlbnNlIGFncmVlbWVudA0KLUluc3RhbGxXaXphcmQuTGljZW5zZVBhZ2UuZGVjbGluZSA9IEkgJmRvIG5vdCBhY2NlcHQgdGhlIHRlcm1zIGluIHRoZSBsaWNlbnNlIGFncmVlbWVudA0KLUluc3RhbGxXaXphcmQuTGljZW5zZVBhZ2UuYWNjZXB0MiA9IEkgJmFjY2VwdCB0aGUgdGVybXMgaW4gdGhlIGxpY2Vuc2UgYWdyZWVtZW50cw0KLUluc3RhbGxXaXphcmQuTGljZW5zZVBhZ2UuZGVjbGluZTIgPSBJICZkbyBub3QgYWNjZXB0IHRoZSB0ZXJtcyBpbiB0aGUgbGljZW5zZSBhZ3JlZW1lbnRzDQotDQotSW5zdGFsbFdpemFyZC5SZXZpZXdQYWdlLnRpdGxlID0gRmVhdHVyZSBJbnN0YWxsDQotSW5zdGFsbFdpemFyZC5SZXZpZXdQYWdlLmRlc2MgPVRoaXMgd2l6YXJkIGhlbHBzIHlvdSBpbnN0YWxsIFwNCi1uZXcsIHVwZGF0ZSBvciB1bmluc3RhbGwgZXhpc3RpbmcgZmVhdHVyZXMgb2YgeW91ciBwcm9kdWN0Lg0KLUluc3RhbGxXaXphcmQuUmV2aWV3UGFnZS5hYm91dC5pbnN0YWxsID0gWW91IGFyZSBhYm91dCB0byBpbnN0YWxsIHRoZSBmb2xsb3dpbmcgZmVhdHVyZToNCi1JbnN0YWxsV2l6YXJkLlJldmlld1BhZ2UuYWJvdXQudW5pbnN0YWxsID0gWW91IGFyZSBhYm91dCB0byB1bmluc3RhbGwgdGhlIGZvbGxvd2luZyBmZWF0dXJlOg0KLUluc3RhbGxXaXphcmQuUmV2aWV3UGFnZS5hYm91dC51bmNvbmZpZ3VyZSA9IFlvdSBhcmUgYWJvdXQgdG8gZGlzYWJsZSB0aGUgZm9sbG93aW5nIGZlYXR1cmU6DQotSW5zdGFsbFdpemFyZC5SZXZpZXdQYWdlLmFib3V0LmNvbmZpZ3VyZSA9IFlvdSBhcmUgYWJvdXQgdG8gZW5hYmxlIHRoZSBmb2xsb3dpbmcgZmVhdHVyZToNCi1JbnN0YWxsV2l6YXJkLlJldmlld1BhZ2UubmFtZSA9IE5hbWU6DQotSW5zdGFsbFdpemFyZC5SZXZpZXdQYWdlLnByb3ZpZGVyID0gUHJvdmlkZXI6DQotSW5zdGFsbFdpemFyZC5SZXZpZXdQYWdlLnZlcnNpb24gPSBWZXJzaW9uOg0KLUluc3RhbGxXaXphcmQuUmV2aWV3UGFnZS5jb3JyZWN0Lmluc3RhbGwgPSBcbklmIHRoYXQgaXMgY29ycmVjdCwgc2VsZWN0IE5leHQgdG8gY29udGludWUuDQotSW5zdGFsbFdpemFyZC5SZXZpZXdQYWdlLmNvcnJlY3QudW5pbnN0YWxsID0gXG5JZiB0aGF0IGlzIGNvcnJlY3QsIHNlbGVjdCBGaW5pc2guDQotDQotSW5zdGFsbFdpemFyZC5UYXJnZXRQYWdlLnRpdGxlID0gSW5zdGFsbCBMb2NhdGlvbg0KLUluc3RhbGxXaXphcmQuVGFyZ2V0UGFnZS5kZXNjID0gQ2hvb3NlIHRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgZmVhdHVyZSB3aWxsIGJlIGluc3RhbGxlZC4NCi1JbnN0YWxsV2l6YXJkLlRhcmdldFBhZ2UubmV3ID0gJkFkZC4uLg0KLUluc3RhbGxXaXphcmQuVGFyZ2V0UGFnZS5kZWxldGUgPSAmUmVtb3ZlDQotSW5zdGFsbFdpemFyZC5UYXJnZXRQYWdlLnJlcXVpcmVkU3BhY2UgPSBSZXF1aXJlZCBzcGFjZToNCi1JbnN0YWxsV2l6YXJkLlRhcmdldFBhZ2UuYXZhaWxhYmxlU3BhY2UgPSBGcmVlIHNwYWNlOg0KLUluc3RhbGxXaXphcmQuVGFyZ2V0UGFnZS5sb2NhdGlvbiA9IFRhcmdldCBMb2NhdGlvbg0KLUluc3RhbGxXaXphcmQuVGFyZ2V0UGFnZS5sb2NhdGlvbi5tZXNzYWdlID0gU2VsZWN0IGEgbmV3IGluc3RhbGwgbG9jYXRpb24NCi1JbnN0YWxsV2l6YXJkLlRhcmdldFBhZ2UubG9jYXRpb24uZW1wdHkgPSBUYXJnZXQgaW5zdGFsbCBsb2NhdGlvbiBtdXN0IGJlIHNlbGVjdGVkLiBJZiBub25lIGlzIGF2YWlsYWJsZSwgY3JlYXRlIGEgbmV3IG9uZS4NCi1JbnN0YWxsV2l6YXJkLlRhcmdldFBhZ2UubG9jYXRpb24uZXhpc3RzID0gVGFyZ2V0IGxvY2F0aW9uIGFscmVhZHkgZXhpc3RzLg0KLUluc3RhbGxXaXphcmQuVGFyZ2V0UGFnZS5sb2NhdGlvbi5lcnJvci50aXRsZSA9IEludmFsaWQgTG9jYXRpb24NCi1JbnN0YWxsV2l6YXJkLlRhcmdldFBhZ2UubG9jYXRpb24uZXJyb3IubWVzc2FnZSA9IFRoZSBzZWxlY3RlZCBsb2NhdGlvbiBjYW5ub3QgYmUgdXNlZCB0byBpbnN0YWxsIGZlYXR1cmVzOiB7MH0NCi1JbnN0YWxsV2l6YXJkLlRhcmdldFBhZ2UubG9jYXRpb24uZXJyb3IucmVhc29uID0gUmVhc29uOiB7MH0NCi1JbnN0YWxsV2l6YXJkLlRhcmdldFBhZ2Uuc2l6ZSA9IHswfUtCDQotSW5zdGFsbFdpemFyZC5UYXJnZXRQYWdlLnVua25vd25TaXplID0gVW5rbm93bg0KLQ0KLUluc3RhbGxXaXphcmQuT3B0aW9uYWxGZWF0dXJlc1BhZ2UudGl0bGU9IE9wdGlvbmFsIEZlYXR1cmVzDQotSW5zdGFsbFdpemFyZC5PcHRpb25hbEZlYXR1cmVzUGFnZS5kZXNjID0gU29tZSBvZiB0aGUgZmVhdHVyZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhpcyBmZWF0dXJlIGFyZSBvcHRpb25hbC4NCi1JbnN0YWxsV2l6YXJkLk9wdGlvbmFsRmVhdHVyZXNQYWdlLnRyZWVMYWJlbCA9ICZBdmFpbGFibGUgb3B0aW9uYWwgZmVhdHVyZXM6DQotSW5zdGFsbFdpemFyZC5PcHRpb25hbEZlYXR1cmVzUGFnZS5zZWxlY3RBbGwgPSAmU2VsZWN0IEFsbA0KLUluc3RhbGxXaXphcmQuT3B0aW9uYWxGZWF0dXJlc1BhZ2UuZGVzZWxlY3RBbGwgPSAmRGVzZWxlY3QgQWxsDQotDQotSW5zdGFsbFdpemFyZC5lcnJvci51bmFibGU9VW5hYmxlIHRvIGxvY2F0ZSBjb25maWd1cmF0aW9uIHNpdGUgZm9yIHRoZSBmZWF0dXJlDQotSW5zdGFsbFdpemFyZC5lcnJvci5vbGQ9IEVycm9yIHdoaWxlIHVwZGF0aW5nIHRoZSBvbGQgZmVhdHVyZSB2ZXJzaW9uDQotSW5zdGFsbFdpemFyZC5zYXZlZENvbmZpZyA9IHswfSBiYWNrdXANCi0NCi1JbnN0YWxsRGVsdGFXaXphcmQud3RpdGxlID0gQ29uZmlndXJhdGlvbiBDaGFuZ2VzDQotSW5zdGFsbERlbHRhV2l6YXJkLnByb2Nlc3NpbmcgPSBQcm9jZXNzaW5nIHBlbmRpbmcgY2hhbmdlczoNCi1JbnN0YWxsRGVsdGFXaXphcmQudGl0bGUgPSBQZW5kaW5nIENvbmZpZ3VyYXRpb24gQ2hhbmdlcw0KLUluc3RhbGxEZWx0YVdpemFyZC5kZXNjID0gQ2hlY2sgdGhlIGNoYW5nZXMgeW91IHdpc2ggdG8gcHJvY2VzcyBub3cuIFJlbW92ZSBjaGFuZ2VzIHRoYXQgc2hvdWxkIG5ldmVyIGJlIHByb2Nlc3NlZC4NCi1JbnN0YWxsRGVsdGFXaXphcmQubGFiZWwgPSBEZXRlY3RlZCAmY2hhbmdlczoNCi1JbnN0YWxsRGVsdGFXaXphcmQuZGVsZXRlID0gJlJlbW92ZQ0KLUluc3RhbGxEZWx0YVdpemFyZC5lcnJvcnMgPSAmRXJyb3IgRGV0YWlscy4uLg0KLUluc3RhbGxEZWx0YVdpemFyZC5tZXNzYWdlID0gU2VsZWN0ZWQgdXBkYXRlIHdpbGwgcmVzdWx0IGluIGFuIGludmFsaWQgY29uZmlndXJhdGlvbi4NCi0NCi1EdXBsaWNhdGVDb25mbGljdHNEaWFsb2cudGl0bGUgPSBEdXBsaWNhdGUgQ29uZmxpY3RzDQotRHVwbGljYXRlQ29uZmxpY3RzRGlhbG9nLm1lc3NhZ2UgPSBJZiB5b3UgY29udGludWUgd2l0aCB0aGUgdXBkYXRlL2luc3RhbGwsIFwNCi10aGUgcmVzdWx0aW5nIGNvbmZpZ3VyYXRpb24gd2lsbCBjb250YWluIGR1cGxpY2F0aW9uIGNvbmZsaWN0cyBcDQotdGhhdCBtYXkgY2F1c2UgcGFydHMgb2YgdGhlIHByb2R1Y3QgdG8gYmUgdW51c2FibGUuIERvIHlvdSB3YW50IHRvIFwNCi1jb250aW51ZT8NCi1EdXBsaWNhdGVDb25mbGljdHNEaWFsb2cudHJlZUxhYmVsID0gJkRldGVjdGVkIGNvbmZsaWN0czoNCi1EdXBsaWNhdGVDb25mbGljdHNEaWFsb2cuY29uZmxpY3QgPSBWZXJzaW9uIHswfSBpbiB7MX0NCi0NCi1NYWluUHJlZmVyZW5jZVBhZ2UuZGVzY3JpcHRpb24gPSBHZW5lcmFsIHNldHRpbmdzIGZvciBJbnN0YWxsL1VwZGF0ZSBNYW5hZ2VyLg0KLU1haW5QcmVmZXJlbmNlUGFnZS5jaGVja1NpZ25hdHVyZSA9IENoZWNrIGRpZ2l0YWwgJnNpZ25hdHVyZXMgb2YgZG93bmxvYWRlZCBhcmNoaXZlcw0KLU1haW5QcmVmZXJlbmNlUGFnZS5oaXN0b3J5U2l6ZSA9ICZNYXhpbXVtIG51bWJlciBvZiAnSGlzdG9yeScgY29uZmlndXJhdGlvbnM6DQotTWFpblByZWZlcmVuY2VQYWdlLmJyb3dzZXJDaG9pY2UgPSBXZWIgYnJvd3NlciB0byB1c2UgDQotTWFpblByZWZlcmVuY2VQYWdlLmJyb3dzZXJDaG9pY2UuZW1iZWRkZWQgPSAmRW1iZWRkZWQgYnJvd3Nlcg0KLU1haW5QcmVmZXJlbmNlUGFnZS5icm93c2VyQ2hvaWNlLnN5c3RlbSA9IERlJmZhdWx0IHN5c3RlbSBicm93c2VyDQotTWFpblByZWZlcmVuY2VQYWdlLnVwZGF0ZVZlcnNpb25zID0gVmFsaWQgdXBkYXRlcw0KLU1haW5QcmVmZXJlbmNlUGFnZS51cGRhdGVWZXJzaW9ucy5lcXVpdmFsZW50ID0gZSZxdWl2YWxlbnQgKDEuMC4xIC0+IDEuMC4yIC0gb25seSBzZXJ2aWNlIGluY3JlbWVudHMpDQotTWFpblByZWZlcmVuY2VQYWdlLnVwZGF0ZVZlcnNpb25zLmNvbXBhdGlibGUgPSAmY29tcGF0aWJsZSAoMS4wLjkgLT4gMS4xLjAgLSBzZXJ2aWNlIGFuZCBtaW5vciBpbmNyZW1lbnRzKQ0KLU1haW5QcmVmZXJlbmNlUGFnZS50b3BpY0NvbG9yID0gU2VjdGlvbiAmdGl0bGUgY29sb3I6DQotTWFpblByZWZlcmVuY2VQYWdlLnByb3h5R3JvdXAgPSBQcm94eSBzZXR0aW5ncw0KLU1haW5QcmVmZXJlbmNlUGFnZS5lbmFibGVIdHRwUHJveHkgPSBFJm5hYmxlIEhUVFAgcHJveHkgY29ubmVjdGlvbg0KLU1haW5QcmVmZXJlbmNlUGFnZS5odHRwUHJveHlIb3N0ID0gJkhUVFAgcHJveHkgaG9zdCBhZGRyZXNzOg0KLU1haW5QcmVmZXJlbmNlUGFnZS5odHRwUHJveHlQb3J0ID0gIEhUVFAgJnByb3h5IGhvc3QgcG9ydDoNCi1NYWluUHJlZmVyZW5jZVBhZ2UuZGlnaXRhbFNpZ25hdHVyZS50aXRsZSA9IERpZ2l0YWwgU2lnbmF0dXJlIENoZWNrDQotTWFpblByZWZlcmVuY2VQYWdlLmRpZ2l0YWxTaWduYXR1cmUubWVzc2FnZSA9IFlvdSBoYXZlIGNob3NlbiB0byBkaXNhYmxlIGRpZ2l0YWwgc2lnbmF0dXJlIFwNCi1jaGVja3MgZm9yIGRvd25sb2FkZWQgYXJjaGl2ZXMuIE5vdGUgdGhhdCB1bnNpZ25lZCBhcmNoaXZlcyBtYXkgXA0KLWNvbnRhaW4gc29mdHdhcmUgdGhhdCBjYW4gaGFybSB5b3VyIGNvbXB1dGVyLg0KLQ0KLUFwcFNlcnZlclByZWZlcmVuY2VQYWdlLmRlc2NyaXB0aW9uID0gU2V0dGluZ3MgZm9yIFVwZGF0ZSBXZWIgc2VydmljZTogDQotQXBwU2VydmVyUHJlZmVyZW5jZVBhZ2UubWFzdGVyU3dpdGNoID0gQWNjZXB0ICZJbnRlcm5ldCBjb25uZWN0aW9ucyBmb3IgdGhlIFdlYi10cmlnZ2VyZWQgdXBkYXRlcw0KLUFwcFNlcnZlclByZWZlcmVuY2VQYWdlLmVuY29kZVVSTHMgPSAmRW5jb2RlIGxvY2FsIGhvc3QgYW5kIHBvcnQgaW4gVVJMcyBwYXNzZWQgdG8gdGhlIGJyb3dzZXINCi0NCi1KYXJWZXJpZmljYXRpb25EaWFsb2cud3RpdGxlID0gSmFyIFZlcmlmaWNhdGlvbg0KLUphclZlcmlmaWNhdGlvbkRpYWxvZy5UaXRsZT0gRmVhdHVyZSB2ZXJpZmljYXRpb24NCi1KYXJWZXJpZmljYXRpb25EaWFsb2cuVmVyaWZpY2F0aW9uPVZlcmlmaWNhdGlvbg0KLUphclZlcmlmaWNhdGlvbkRpYWxvZy5Db21wb25lbnROb3RJbnN0YWxsZWQ9VGhpcyBmZWF0dXJlIHdpbGwgbm90IGJlIGluc3RhbGxlZC4NCi0NCi1KYXJWZXJpZmljYXRpb25EaWFsb2cuQWJvdXRUb0luc3RhbGwuRmlsZT1XYXJuaW5nOiBZb3UgYXJlIGFib3V0IHRvIGluc3RhbGwgYW4gdW5zaWduZWQgZmVhdHVyZSBmaWxlLg0KLUphclZlcmlmaWNhdGlvbkRpYWxvZy5Ob3REaWdpdGFsbHlTaWduZWQuRmlsZT0gV2FybmluZzogVGhpcyBmZWF0dXJlIGZpbGUgaGFzIG5vdCBiZWVuIGRpZ2l0YWxseSBzaWduZWQuDQotSmFyVmVyaWZpY2F0aW9uRGlhbG9nLkNhbm5vdFZlcmlmeVByb3ZpZGVyLkZpbGU9VGhlIHByb3ZpZGVyIG9mIHRoaXMgZmVhdHVyZSBmaWxlIGNhbm5vdCBiZSB2ZXJpZmllZC4NCi1KYXJWZXJpZmljYXRpb25EaWFsb2cuQ29ycnVwdGVkQ29udGVudC5GaWxlPVRoZSBjb250ZW50IG9mIHRoaXMgZmVhdHVyZSBmaWxlIGhhcyBiZWVuIGNvcnJ1cHRlZA0KLUphclZlcmlmaWNhdGlvbkRpYWxvZy5TaWduZWRDb21wb25lbnQuRmlsZT1Zb3UgYXJlIGFib3V0IHRvIGluc3RhbGwgYSBzaWduZWQgZmVhdHVyZSBmaWxlLg0KLUphclZlcmlmaWNhdGlvbkRpYWxvZy5Vbmtub3duQ2VydGlmaWNhdGUuRmlsZT1UaGUgY2VydGlmaWNhdGVzIHVzZWQgdG8gYXV0aGVudGljYXRlIHRoaXMgZmVhdHVyZSBmaWxlIGFyZSBub3QgcmVjb2duaXplZC4NCi1KYXJWZXJpZmljYXRpb25EaWFsb2cuVW5hYmxlVG9WZXJpZnlQcm92aWRlci5GaWxlPVRoZSBwcm92aWRlciBvZiB0aGlzIGZlYXR1cmUgZmlsZSBjYW5ub3QgYmUgdmVyaWZpZWQuDQotSmFyVmVyaWZpY2F0aW9uRGlhbG9nLlByb3ZpZGVyS25vd24uRmlsZT1UaGUgcHJvdmlkZXIgb2YgdGhpcyBmZWF0dXJlIGZpbGUgaGFzIGJlZW4gdmFsaWRhdGVkIGJ5IGEgdHJ1c3RlZCB0aGlyZCBwYXJ0eS4NCi1KYXJWZXJpZmljYXRpb25EaWFsb2cuS25vd25DZXJ0aWZpY2F0ZS5GaWxlPU9uZSBvZiB0aGUgY2VydGlmaWNhdGVzIHVzZWQgdG8gYXV0aGVudGljYXRlIHRoaXMgZmVhdHVyZSBmaWxlIHdhcyByZWNvZ25pemVkLg0KLQ0KLUphclZlcmlmaWNhdGlvbkRpYWxvZy5BYm91dFRvSW5zdGFsbC5GZWF0dXJlPVdhcm5pbmc6IFlvdSBhcmUgYWJvdXQgdG8gaW5zdGFsbCBhbiB1bnNpZ25lZCBmZWF0dXJlLg0KLUphclZlcmlmaWNhdGlvbkRpYWxvZy5Ob3REaWdpdGFsbHlTaWduZWQuRmVhdHVyZT0gV2FybmluZzogVGhpcyBmZWF0dXJlIGhhcyBub3QgYmVlbiBkaWdpdGFsbHkgc2lnbmVkLg0KLUphclZlcmlmaWNhdGlvbkRpYWxvZy5DYW5ub3RWZXJpZnlQcm92aWRlci5GZWF0dXJlPVRoZSBwcm92aWRlciBvZiB0aGlzIGZlYXR1cmUgY2Fubm90IGJlIHZlcmlmaWVkLg0KLUphclZlcmlmaWNhdGlvbkRpYWxvZy5Db3JydXB0ZWRDb250ZW50LkZlYXR1cmU9VGhlIGNvbnRlbnQgb2YgdGhpcyBmZWF0dXJlIGhhcyBiZWVuIGNvcnJ1cHRlZA0KLUphclZlcmlmaWNhdGlvbkRpYWxvZy5TaWduZWRDb21wb25lbnQuRmVhdHVyZT1Zb3UgYXJlIGFib3V0IHRvIGluc3RhbGwgYSBzaWduZWQgZmVhdHVyZS4NCi1KYXJWZXJpZmljYXRpb25EaWFsb2cuVW5rbm93bkNlcnRpZmljYXRlLkZlYXR1cmU9VGhlIGNlcnRpZmljYXRlcyB1c2VkIHRvIGF1dGhlbnRpY2F0ZSB0aGlzIGZlYXR1cmUgYXJlIG5vdCByZWNvZ25pemVkLg0KLUphclZlcmlmaWNhdGlvbkRpYWxvZy5VbmFibGVUb1ZlcmlmeVByb3ZpZGVyLkZlYXR1cmU9VGhlIHByb3ZpZGVyIG9mIHRoaXMgZmVhdHVyZSBjYW5ub3QgYmUgdmVyaWZpZWQuDQotSmFyVmVyaWZpY2F0aW9uRGlhbG9nLlByb3ZpZGVyS25vd24uRmVhdHVyZT1UaGUgcHJvdmlkZXIgb2YgdGhpcyBmZWF0dXJlIGhhcyBiZWVuIHZhbGlkYXRlZCBieSBhIHRydXN0ZWQgdGhpcmQgcGFydHkuDQotSmFyVmVyaWZpY2F0aW9uRGlhbG9nLktub3duQ2VydGlmaWNhdGUuRmVhdHVyZT1PbmUgb2YgdGhlIGNlcnRpZmljYXRlcyB1c2VkIHRvIGF1dGhlbnRpY2F0ZSB0aGlzIGZlYXR1cmUgd2FzIHJlY29nbml6ZWQuDQotDQotSmFyVmVyaWZpY2F0aW9uRGlhbG9nLkNhdXRpb249XHJcbkNhdXRpb246IFwiezB9XCIgYXNzZXJ0cyB0aGF0IHRoZSBjb250ZW50IG9mIHRoaXMgZmVhdHVyZSBpcyBzYWZlLiBcclxuWW91IHNob3VsZCBvbmx5IGluc3RhbGwgdGhpcyBmZWF0dXJlIGlmIHlvdSB0cnVzdCBcInswfVwiIHRvIG1ha2UgdGhhdCBhc3NlcnRpb24NCi1KYXJWZXJpZmljYXRpb25EaWFsb2cuRmlsZU5hbWU9RmlsZSBJZGVudGlmaWVyOg0KLUphclZlcmlmaWNhdGlvbkRpYWxvZy5GZWF0dXJlTmFtZT1GZWF0dXJlIG5hbWU6DQotSmFyVmVyaWZpY2F0aW9uRGlhbG9nLkZlYXR1cmVJZGVudGlmaWVyPUZlYXR1cmUgSWRlbnRpZmllcjoNCi1KYXJWZXJpZmljYXRpb25EaWFsb2cuUHJvdmlkZXI9CVByb3ZpZGVyOg0KLUphclZlcmlmaWNhdGlvbkRpYWxvZy5NYXlDaG9vc2VUb0luc3RhbGw9WW91IG1heSBjaG9vc2UgdG8gaW5zdGFsbCB0aGUgZmVhdHVyZSBvciBjYW5jZWwgaXRzIGluc3RhbGxhdGlvbi4NCi1KYXJWZXJpZmljYXRpb25EaWFsb2cuTWF5Q2hvb3NlVG9Db250aW51ZT1Zb3UgbWF5IGNob29zZSB0byBjb250aW51ZSB0byBpbnN0YWxsIHRoZSBmZWF0dXJlIG9yIGNhbmNlbCBpdHMgaW5zdGFsbGF0aW9uLg0KLUphclZlcmlmaWNhdGlvbkRpYWxvZy5JbnN0YWxsPSZJbnN0YWxsDQotSmFyVmVyaWZpY2F0aW9uRGlhbG9nLkNvbnRpbnVlPUMmb250aW51ZQ0KLUphclZlcmlmaWNhdGlvbkRpYWxvZy5DYW5jZWw9JkNhbmNlbA0KLUphclZlcmlmaWNhdGlvbkRpYWxvZy5Sb290Q0E9IEFjY29yZGluZyB0bzogDQotSmFyVmVyaWZpY2F0aW9uRGlhbG9nLlN1YmplY3RDQT0gRmlsZSBzaWduZWQgYnk6IA0KLUphclZlcmlmaWNhdGlvbkRpYWxvZy5DZXJ0aWZpY2F0ZUluZm89IENlcnRpZmljYXRlOg0KLQ0KLVVzZXJWZXJpZmljYXRpb25EaWFsb2cuUGFzc3dvcmRSZXF1aXJlZD1QYXNzd29yZCBSZXF1aXJlZA0KLVVzZXJWZXJpZmljYXRpb25EaWFsb2cuRW50ZXJOYW1lQW5kUGFzc3dvcmQ9RW50ZXIgdXNlciBuYW1lIGFuZCBwYXNzd29yZCBmb3I6IA0KLVVzZXJWZXJpZmljYXRpb25EaWFsb2cuRG9tYWluPUF0IHRoZSBmb2xsb3dpbmcgZG9tYWluOiANCi1Vc2VyVmVyaWZpY2F0aW9uRGlhbG9nLlBhc3N3b3JkPVBhc3N3b3JkOg0KLVVzZXJWZXJpZmljYXRpb25EaWFsb2cuVXNlck5hbWU9VXNlciBuYW1lOg0KLQ0KLU5ld1BsdWdpbkVudHJ5RGlhbG9nLmlkPSZQbHVnLWluIElkOg0KLU5ld1BsdWdpbkVudHJ5RGlhbG9nLnZlcnNpb249UGx1Zy1pbiAmVmVyc2lvbjoNCi0NCi1JbnN0YWxsQ29uZmlndXJhdGlvblBhZ2UuUmV2ZXJ0U2VjdGlvbi5jb25maXJtLm1lc3NhZ2U9QXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHJldmVydCB0byB0aGlzIGNvbmZpZ3VyYXRpb24/DQotU2VhcmNoLm5ldHdvcmtQcm9ibGVtcz1OZXR3b3JrIGNvbm5lY3Rpb24gcHJvYmxlbXMgZW5jb3VudGVyZWQgZHVyaW5nIHNlYXJjaC4NCi1NaXNzaW5nRmVhdHVyZS5pZD11bmtub3duDQotTWlzc2luZ0ZlYXR1cmUuZGVzYy51bmtub3duPVRoaXMgZmVhdHVyZSByZWZlcmVuY2UgY2Fubm90IGJlIHJlc29sdmVkLg0KLU1pc3NpbmdGZWF0dXJlLmRlc2Mub3B0aW9uYWw9VGhpcyBmZWF0dXJlIGlzIHJlZmVyZW5jZWQgYXMgb3B0aW9uYWwgYW5kIGlzIGN1cnJlbnRseSBub3QgaW5zdGFsbGVkLg0KLU1pc3NpbmdGZWF0dXJlLnByb3ZpZGVyPVVua25vd24NCi0NCi1VcGRhdGVzRHJvcEFkYXB0ZXIubmFtZUNvbmZsaWN0ID0gTmFtZSBDb25mbGljdA0KLVJlbmFtZURpYWxvZy5sYWJlbCA9ICZFbnRlciBhIG5ldyBuYW1lIGZvciB0aGlzIG9iamVjdDoNCi1SZW5hbWVEaWFsb2cuZXhpc3RzID0gT2JqZWN0ICcnezB9JycgYWxyZWFkeSBleGlzdHMuDQotDQotTXVsdGlJbnN0YWxsV2l6YXJkLnd0aXRsZSA9IEluc3RhbGwNCi1NdWx0aUluc3RhbGxXaXphcmQuTXVsdGlSZXZpZXdQYWdlLnRpdGxlID0gVXBkYXRlIFRhc2tzDQotTXVsdGlJbnN0YWxsV2l6YXJkLk11bHRpUmV2aWV3UGFnZS5kZXNjID0gVGhpcyB3aXphcmQgaGVscHMgeW91IGluc3RhbGwgXA0KLW5ldywgdXBkYXRlIG9yIHVuaW5zdGFsbCBleGlzdGluZyBmZWF0dXJlcyBvZiB5b3VyIHByb2R1Y3QuDQotTXVsdGlJbnN0YWxsV2l6YXJkLk11bHRpUmV2aWV3UGFnZS5jLnRhc2sgPSBUYXNrDQotTXVsdGlJbnN0YWxsV2l6YXJkLk11bHRpUmV2aWV3UGFnZS5jLmZlYXR1cmUgPSBGZWF0dXJlDQotTXVsdGlJbnN0YWxsV2l6YXJkLk11bHRpUmV2aWV3UGFnZS5jLnZlcnNpb24gPSBWZXJzaW9uDQotTXVsdGlJbnN0YWxsV2l6YXJkLk11bHRpUmV2aWV3UGFnZS5jLnByb3ZpZGVyID0gUHJvdmlkZXINCi1NdWx0aUluc3RhbGxXaXphcmQuTXVsdGlSZXZpZXdQYWdlLmNvdW50ZXIgPSB7MH0gb2YgezF9IHNlbGVjdGVkLg0KLU11bHRpSW5zdGFsbFdpemFyZC5NdWx0aVJldmlld1BhZ2UuZmlsdGVyQ2hlY2sgPSAmRmlsdGVyIGZlYXR1cmVzIGluY2x1ZGVkIGluIG90aGVyIGZlYXR1cmVzIG9uIHRoZSBsaXN0DQotDQotTXVsdGlJbnN0YWxsV2l6YXJkLlRhcmdldFBhZ2UudGl0bGUgPSBJbnN0YWxsIExvY2F0aW9uDQotTXVsdGlJbnN0YWxsV2l6YXJkLlRhcmdldFBhZ2UuZGVzYyA9IENob29zZSB0aGUgbG9jYXRpb24gd2hlcmUgdGhlIGZlYXR1cmVzIHdpbGwgYmUgaW5zdGFsbGVkLg0KLU11bHRpSW5zdGFsbFdpemFyZC5UYXJnZXRQYWdlLmpvYnNMYWJlbCA9ICZGZWF0dXJlcyB0byBpbnN0YWxsOg0KLU11bHRpSW5zdGFsbFdpemFyZC5UYXJnZXRQYWdlLnNpdGVMYWJlbCA9ICZUYXJnZXQgc2l0ZXMgKHNlbGVjdGVkIHNpdGUgd2lsbCBiZSB1c2VkIGZvciB0aGUgZmVhdHVyZSBzZWxlY3RlZCBhYm92ZSk6DQotTXVsdGlJbnN0YWxsV2l6YXJkLlRhcmdldFBhZ2UubmV3ID0gJkFkZC4uLg0KLU11bHRpSW5zdGFsbFdpemFyZC5UYXJnZXRQYWdlLmRlbGV0ZSA9ICZSZW1vdmUNCi1NdWx0aUluc3RhbGxXaXphcmQuVGFyZ2V0UGFnZS5yZXF1aXJlZFNwYWNlID0gUmVxdWlyZWQgc3BhY2U6DQotTXVsdGlJbnN0YWxsV2l6YXJkLlRhcmdldFBhZ2UuYXZhaWxhYmxlU3BhY2UgPSBGcmVlIHNwYWNlOg0KLU11bHRpSW5zdGFsbFdpemFyZC5UYXJnZXRQYWdlLmxvY2F0aW9uID0gVGFyZ2V0IExvY2F0aW9uDQotTXVsdGlJbnN0YWxsV2l6YXJkLlRhcmdldFBhZ2UubG9jYXRpb24ubWVzc2FnZSA9IFNlbGVjdCBhIG5ldyBpbnN0YWxsIGxvY2F0aW9uDQotTXVsdGlJbnN0YWxsV2l6YXJkLlRhcmdldFBhZ2UubG9jYXRpb24uZW1wdHkgPSBUYXJnZXQgaW5zdGFsbCBsb2NhdGlvbiBtdXN0IGJlIHNlbGVjdGVkLiBJZiBub25lIGlzIGF2YWlsYWJsZSwgY3JlYXRlIGEgbmV3IG9uZS4NCi1NdWx0aUluc3RhbGxXaXphcmQuVGFyZ2V0UGFnZS5sb2NhdGlvbi5leGlzdHMgPSBUYXJnZXQgbG9jYXRpb24gYWxyZWFkeSBleGlzdHMuDQotTXVsdGlJbnN0YWxsV2l6YXJkLlRhcmdldFBhZ2UubG9jYXRpb24uZXJyb3IudGl0bGUgPSBJbnZhbGlkIExvY2F0aW9uDQotTXVsdGlJbnN0YWxsV2l6YXJkLlRhcmdldFBhZ2UubG9jYXRpb24uZXJyb3IubWVzc2FnZSA9IFRoZSBzZWxlY3RlZCBsb2NhdGlvbiBjYW5ub3QgYmUgdXNlZCB0byBpbnN0YWxsIGZlYXR1cmVzOiB7MH0NCi1NdWx0aUluc3RhbGxXaXphcmQuVGFyZ2V0UGFnZS5sb2NhdGlvbi5lcnJvci5yZWFzb24gPSBSZWFzb246IHswfQ0KLU11bHRpSW5zdGFsbFdpemFyZC5UYXJnZXRQYWdlLnNpemUgPSB7MH1LQg0KLU11bHRpSW5zdGFsbFdpemFyZC5UYXJnZXRQYWdlLnVua25vd25TaXplID0gVW5rbm93bg0KLQ0KLU11bHRpSW5zdGFsbFdpemFyZC5pbnN0YWxsaW5nID0gSW5pdGlhbGl6aW5nLi4uDQotTXVsdGlJbnN0YWxsV2l6YXJkLmVycm9yLnVuYWJsZT17MH06IHVuYWJsZSB0byBsb2NhdGUgY29uZmlndXJhdGlvbiBzaXRlDQotTXVsdGlJbnN0YWxsV2l6YXJkLmVycm9yLm9sZD0gezB9OiBFcnJvciB3aGlsZSB1cGRhdGluZyB0aGUgb2xkIGZlYXR1cmUgdmVyc2lvbg0KLU11bHRpSW5zdGFsbFdpemFyZC5zYXZlZENvbmZpZyA9IHswfSBiYWNrdXANCi0NCi1TaXRlU3RhdGVBY3Rpb24uZGlzYWJsZUxhYmVsPURpc2FibGUNCi1TaXRlU3RhdGVBY3Rpb24uZW5hYmxlTGFiZWw9RW5hYmxlDQotU2l0ZVN0YXRlQWN0aW9uLmVuYWJsZU1lc3NhZ2U9RG8geW91IHdhbnQgdG8gZW5hYmxlIGZlYXR1cmVzIGluICJ7MH0iPw0KLVNpdGVTdGF0ZUFjdGlvbi5kaXNhYmxlTWVzc2FnZT1EbyB5b3Ugd2FudCB0byBkaXNhYmxlIGFsbCB0aGUgZmVhdHVyZXMgaW4gInswfSI/DQotU2l0ZVN0YXRlQWN0aW9uLmRpYWxvZ1RpdGxlPVVwZGF0ZSBNYW5hZ2VyDQotDQotU2l0ZUJvb2ttYXJrLmNvbm5lY3RpbmcgPSBDb25uZWN0aW5nIHRvICJ7MH0iLi4uDQotU2l0ZUJvb2ttYXJrLmRvd25sb2FkaW5nID0gRG93bmxvYWRpbmc6XCANCi0NCi1NdWx0aXBsZVNlbGVjdGlvbkZvcm0udGl0bGUgPSBNdWx0aXBsZSBTZWxlY3Rpb24NCi1NdWx0aXBsZVNlbGVjdGlvbkZvcm0uY291bnRlciA9IHswfSBpdGVtcyBzZWxlY3RlZC4NCi1EZWx0YUZlYXR1cmVBZGFwdGVyLnNob3J0TmFtZSA9IHswfSAoezF9KQ0KLURlbHRhRmVhdHVyZUFkYXB0ZXIubG9uZ05hbWUgPSB7MH0gKHsxfSkgaW4gezJ9DQotSW5zdGFsbFNlcnZsZXQudW5rbm93blNlcnZlclVSTD1VcGRhdGUgc2VydmVyIFVSTCBpcyB1bmtub3duLg0KLUluc3RhbGxTZXJ2bGV0Lm5vRmVhdHVyZXM9Tm8gZmVhdHVyZXMgdG8gaW5zdGFsbC4NCi1JbnN0YWxsU2VydmxldC5pbmNvcnJlY3RVUkxGb3JtYXQ9VXBkYXRlIHNlcnZlciBVUkwgaGFzIGluY29ycmVjdCBmb3JtYXQ6IHswfQ0KLUluc3RhbGxTZXJ2bGV0LmNvbnRhY3RXZWJtYXN0ZXI9Q29udGFjdCBXZWIgbWFzdGVyIHRoYXQgbWFpbnRhaW5zIHRoZSBwYWdlIHRoYXQgaW5pdGlhdGVkIHRoaXMgb3BlcmF0aW9uLg0KLUluc3RhbGxTZXJ2bGV0Lm11bHRpcGxlSW5zdGFsbD1NdWx0aXBsZSBmZWF0dXJlIGluc3RhbGwgbm90IHN1cHBvcnRlZC4NCi1JbnN0YWxsU2VydmxldC5hbHJlYWR5SW5zdGFsbGVkPVRoZSBmZWF0dXJlIGlzIGFscmVhZHkgaW5zdGFsbGVkLg0KLUluc3RhbGxTZXJ2bGV0LmFscmVhZHlIYXZlSXQ9Tm90aGluZyAtIHlvdSBhbHJlYWR5IGhhdmUgaXQuDQotSW5zdGFsbFNlcnZsZXQuaW5Qcm9ncmVzcyA9IEFub3RoZXIgaW5zdGFsbCBzZXNzaW9uIGlzIGFscmVhZHkgaW4gcHJvZ3Jlc3MuDQotSW5zdGFsbFNlcnZsZXQub2xkZXJGZWF0dXJlPVRoZSBmZWF0dXJlIGlzIG9sZGVyIHRoYW4gdGhlIG9uZSBhbHJlYWR5IGluc3RhbGxlZA0KLUluc3RhbGxTZXJ2bGV0Lm5vdGhpbmcyPU5vdGhpbmcgLSB1cGRhdGUgY2FuIG9ubHkgaW5zdGFsbCBmZWF0dXJlcyB0aGF0IHlvdSBkbyBub3QgaGF2ZSBvciB0aGF0IGFyZSB1cGRhdGVzIHRvIHRoZSBvbmUgYWxyZWFkeSBpbnN0YWxsZWQuDQotRGV0YWlsc0Zvcm0ubG9jYXRpbmdGZWF0dXJlPUxvY2F0aW5nIGZlYXR1cmUgb24gdGhlIHNlcnZlci4uLg0KLURldGFpbHNGb3JtLmRvd25sb2FkaW5nSW5mbz1Eb3dubG9hZGluZyBmZWF0dXJlIGluZm9ybWF0aW9uLi4uDQotRGV0YWlsc0Zvcm0uZmVhdHVyZUFQYXRjaD1UaGlzIGZlYXR1cmUgaXMgYSBwYXRjaCBhbmQgY2Fubm90IGJlIGRpcmVjdGx5IGRpc2FibGVkLiBMb2NhdGUgYSBjb25maWd1cmF0aW9uIGJlZm9yZSBpdCB3YXMgaW5zdGFsbGVkIGFuZCByZXZlcnQgdG8gaXQgaW5zdGVhZC4NCi1EZXRhaWxzRm9ybS5kaXNhYmxlRmVhdHVyZS50aXRsZT1EaXNhYmxlIEZlYXR1cmUNCi1TZXJ2bGV0c1V0aWwucmVzcG9uc2VUaXRsZT1FY2xpcHNlIEluc3RhbGwNCi1TZXJ2bGV0c1V0aWwudXBkYXRlRmFpbGVkPVdlYiB1cGRhdGUgZmFpbGVkDQotU2VydmxldHNVdGlsLnByb2JsZW09UHJvYmxlbQ0KLVNlcnZsZXRzVXRpbC53aGF0VG9Ebz1XaGF0IHlvdSBjYW4gZG8NCi1TZXJ2bGV0c1V0aWwudXBkYXRlSW5Qcm9ncmVzcz1XZWIgVXBkYXRlIGluIHByb2dyZXNzDQotU2VydmxldHNVdGlsLnVwZGF0ZUluaXRpYXRlZD1XZWIgdXBkYXRlIGhhcyBiZWVuIGluaXRpYXRlZC4gWW91IHNob3VsZCBzZWUgaW5zdGFsbCB3aXphcmQgYmVpbmcgb3BlbiBmcm9tIHRoZSBydW5uaW5nIEVjbGlwc2Ugd2luZG93Lg0KLVNlcnZsZXRzVXRpbC5iYWNrPUJhY2sNCi1Db25maWd1cmF0aW9uUHJvcGVydHlQYWdlLmludmFsaWRDaGFyYWN0ZXI9Q29uZmlndXJhdGlvbiBsYWJlbCBjYW5ub3Qgc3RhcnQgd2l0aCBhICcnQCcnDQotRGV0YWlsc0Zvcm0uZG93bmxvYWRpbmdJbmNsdWRlZCA9IERvd25sb2FkaW5nIGNvbXBsZXRlIGZlYXR1cmUgaW5mb3JtYXRpb24uLi4NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvV2ViSW5zdGFsbEhhbmRsZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9XZWJJbnN0YWxsSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzA5Mjc2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9XZWJJbnN0YWxsSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkxFbmNvZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnByZWZlcmVuY2VzLkFwcFNlcnZlclByZWZlcmVuY2VQYWdlOwotCi0KLS8qKgotICogVGhpcyBpcyBhIHV0aWxpdHkgY2xhc3MgdXNlZCBmaW5kIGluZm9ybWF0aW9uIGFib3V0IHRoZSB1cGRhdGUKLSAqIHdlYiBhcHBsaWNhdGlvbiAoaGFuZGxpbmcgd2ViLXRyaWdnZXJlZCByZXF1ZXN0cykKLSAqIAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgV2ViSW5zdGFsbEhhbmRsZXIgewotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaG9zdCBpZGVudGlmaWVyIGZvciB0aGUgd2ViIGFwcGxpY2F0aW9uIHNlcnZlcgotCSAqIGxpc3RlbmVyIGZvciBpbnN0YWxsIHJlcXVlc3RzCi0JICogCi0JICogQHJldHVybiBob3N0IGlkZW50aWZpZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHdlYiBhcHBsaWNhdGlvbgotCSAqIHNlcnZlciBpcyBub3QgYXZhaWxhYmxlCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFdlYkFwcFNlcnZlckhvc3QoKSB7Ci0JCXJldHVybiBVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0QXBwU2VydmVySG9zdCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBvcnQgaWRlbnRpZmllciBmb3IgdGhlIHdlYiBhcHBsaWNhdGlvbiBzZXJ2ZXIKLQkgKiBsaXN0ZW5lciBmb3IgaW5zdGFsbCByZXF1ZXN0cwotCSAqIAotCSAqIEByZXR1cm4gcG9ydCBpZGVudGlmaWVyLCBvciA8Y29kZT4wPC9jb2RlPiBpZiB3ZWIgYXBwbGljYXRpb24KLQkgKiBzZXJ2ZXIgaXMgbm90IGF2YWlsYWJsZQotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXRXZWJBcHBTZXJ2ZXJQb3J0KCkgewotCQlyZXR1cm4gVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldEFwcFNlcnZlclBvcnQoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFbmNvZGVkVVJMTmFtZShTdHJpbmcgdXJsTmFtZSkgewotCQlpZiAoQXBwU2VydmVyUHJlZmVyZW5jZVBhZ2UuZ2V0VXNlQXBwbGljYXRpb25TZXJ2ZXIoKSA9PSBmYWxzZQotCQkJfHwgQXBwU2VydmVyUHJlZmVyZW5jZVBhZ2UuZ2V0RW5jb2RlVVJMcygpID09IGZhbHNlKQotCQkJcmV0dXJuIHVybE5hbWU7Ci0JCXJldHVybiBlbmNvZGUodXJsTmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGVuY29kZShTdHJpbmcgdXJsTmFtZSkgewotCQlTdHJpbmcgY2FsbGJhY2tVUkwgPSBnZXRDYWxsYmFja1VSTEFzU3RyaW5nKCk7Ci0JCWlmIChjYWxsYmFja1VSTCA9PSBudWxsKQotCQkJcmV0dXJuIHVybE5hbWU7Ci0JCVN0cmluZyBjYWxsYmFja1BhcmFtZXRlciA9ICJ1cGRhdGVVUkw9IiArIGNhbGxiYWNrVVJMOwotCQlpZiAodXJsTmFtZS5pbmRleE9mKCc/JykgIT0gLTEpCi0JCQlyZXR1cm4gdXJsTmFtZSArICImIiArIGNhbGxiYWNrUGFyYW1ldGVyOwotCQllbHNlCi0JCQlyZXR1cm4gdXJsTmFtZSArICI/IiArIGNhbGxiYWNrUGFyYW1ldGVyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNhbGxiYWNrIFVSTCAoYXMgc3RyaW5nKSB0byBiZSBwYXNzZWQgdG8gdGhlIHdlYiBwYWdlCi0JICogY29udGFpbmluZyBpbnN0YWxsIHRyaWdnZXJzLgotCSAqIAotCSAqIEByZXR1cm4gY2FsbGJhY2sgVVJMIGFzIHN0cmluZwotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDYWxsYmFja1VSTEFzU3RyaW5nKCkgewotCQlTdHJpbmcgaG9zdCA9IGdldFdlYkFwcFNlcnZlckhvc3QoKTsKLQkJaW50IHBvcnQgPSBnZXRXZWJBcHBTZXJ2ZXJQb3J0KCk7Ci0JCWlmIChob3N0ID09IG51bGwgfHwgcG9ydCA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCWVsc2UgewotCQkJU3RyaW5nIHZhbHVlID0KLQkJCQkiaHR0cDovLyIKLQkJCQkJKyBob3N0Ci0JCQkJCSsgIjoiCi0JCQkJCSsgcG9ydAotCQkJCQkrICIvIgotCQkJCQkrIFVwZGF0ZVVJLldFQl9BUFBfSUQKLQkJCQkJKyAiL2luc3RhbGwiOwotCQkJcmV0dXJuIFVSTEVuY29kZXIuZW5jb2RlKHZhbHVlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9mb3Jtcy9BY3Rpdml0eUNvbnN0cmFpbnRzLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvZm9ybXMvQWN0aXZpdHlDb25zdHJhaW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDAyMzQwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9mb3Jtcy9BY3Rpdml0eUNvbnN0cmFpbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmJvb3QuQm9vdExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbC5QZW5kaW5nQ2hhbmdlOwotCi0vKioKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eUNvbnN0cmFpbnRzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1JPT1RfTUVTU0FHRSA9Ci0JCSJBY3Rpdml0eUNvbnN0cmFpbnRzLnJvb3RNZXNzYWdlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1JPT1RfTUVTU0FHRV9JTklUID0KLQkJIkFjdGl2aXR5Q29uc3RyYWludHMucm9vdE1lc3NhZ2VJbml0aWFsIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NISUxEX01FU1NBR0UgPQotCQkiQWN0aXZpdHlDb25zdHJhaW50cy5jaGlsZE1lc3NhZ2UiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUExBVEZPUk0gPSAiQWN0aXZpdHlDb25zdHJhaW50cy5wbGF0Zm9ybSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9QUklNQVJZID0gIkFjdGl2aXR5Q29uc3RyYWludHMucHJpbWFyeSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9PUyA9ICJBY3Rpdml0eUNvbnN0cmFpbnRzLm9zIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1dTID0gIkFjdGl2aXR5Q29uc3RyYWludHMud3MiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQVJDSCA9ICJBY3Rpdml0eUNvbnN0cmFpbnRzLmFyY2giOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUFJFUkVRID0gIkFjdGl2aXR5Q29uc3RyYWludHMucHJlcmVxIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1BSRVJFUV9QTFVHSU4gPQotCQkiQWN0aXZpdHlDb25zdGFpbnRzLnByZXJlcS5wbHVnaW4iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUFJFUkVRX0ZFQVRVUkUgPQotCQkiQWN0aXZpdHlDb25zdGFpbnRzLnByZXJlcS5mZWF0dXJlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1BSRVJFUV9QRVJGRUNUID0KLQkJIkFjdGl2aXR5Q29uc3RyYWludHMucHJlcmVxUGVyZmVjdCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9QUkVSRVFfRVFVSVZBTEVOVCA9Ci0JCSJBY3Rpdml0eUNvbnN0cmFpbnRzLnByZXJlcUVxdWl2YWxlbnQiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUFJFUkVRX0NPTVBBVElCTEUgPQotCQkiQWN0aXZpdHlDb25zdHJhaW50cy5wcmVyZXFDb21wYXRpYmxlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1BSRVJFUV9HUkVBVEVSID0KLQkJIkFjdGl2aXR5Q29uc3RyYWludHMucHJlcmVxR3JlYXRlck9yRXF1YWwiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUEFUQ0hfUkVHUkVTU0lPTiA9Ci0JCSJBY3Rpdml0eUNvbnN0cmFpbnRzLnBhdGNoUmVncmVzc2lvbiI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9QQVRDSF9VTkNPTkZJR1VSRSA9Ci0JCSJBY3Rpdml0eUNvbnN0cmFpbnRzLnBhdGNoVW5jb25maWd1cmUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUEFUQ0hfVU5DT05GSUdVUkVfQkFDS1VQID0KLQkJIkFjdGl2aXR5Q29uc3RyYWludHMucGF0Y2hVbmNvbmZpZ3VyZUJhY2t1cCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9QQVRDSF9NSVNTSU5HX1RBUkdFVCA9Ci0JCSJBY3Rpdml0eUNvbnN0cmFpbnRzLnBhdGNoTWlzc2luZ1RhcmdldCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9PUFRJT05BTF9DSElMRCA9Ci0JCSJBY3Rpdml0eUNvbnN0cmFpbnRzLm9wdGlvbmFsQ2hpbGQiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ1lDTEUgPSAiQWN0aXZpdHlDb25zdHJhaW50cy5jeWNsZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DT05GTElDVCA9ICJBY3Rpdml0eUNvbnN0cmFpbnRzLmNvbmZsaWN0IjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0VYQ0xVU0lWRSA9ICJBY3Rpdml0eUNvbnN0cmFpbnRzLmV4Y2x1c2l2ZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9XUk9OR19USU1FTElORSA9Ci0JCSJBY3Rpdml0eUNvbnN0cmFpbnRzLnRpbWVsaW5lIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX05PX0xJQ0VOU0UgPQotCQkiQWN0aXZpdHlDb25zdHJhaW50cy5ub0xpY2Vuc2UiOwotCi0JLyoKLQkgKiBDYWxsZWQgYnkgVUkgYmVmb3JlIHBlcmZvcm1pbmcgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIHZhbGlkYXRlUGVuZGluZ0NoYW5nZShQZW5kaW5nQ2hhbmdlIGpvYikgewotCQkvLyBjaGVjayBpbml0aWFsIHN0YXRlCi0JCUFycmF5TGlzdCBiZWZvcmVTdGF0dXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXZhbGlkYXRlSW5pdGlhbFN0YXRlKGJlZm9yZVN0YXR1cyk7Ci0KLQkJLy8gY2hlY2sgcHJvcG9zZWQgY2hhbmdlCi0JCUFycmF5TGlzdCBzdGF0dXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXN3aXRjaCAoam9iLmdldEpvYlR5cGUoKSkgewotCQkJY2FzZSBQZW5kaW5nQ2hhbmdlLlVOQ09ORklHVVJFIDoKLQkJCQl2YWxpZGF0ZVVuY29uZmlndXJlKGpvYi5nZXRGZWF0dXJlKCksIHN0YXR1cyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFBlbmRpbmdDaGFuZ2UuQ09ORklHVVJFIDoKLQkJCQl2YWxpZGF0ZUNvbmZpZ3VyZShqb2IuZ2V0RmVhdHVyZSgpLCBzdGF0dXMpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBQZW5kaW5nQ2hhbmdlLklOU1RBTEwgOgotCQkJCXZhbGlkYXRlSW5zdGFsbChqb2IuZ2V0T2xkRmVhdHVyZSgpLCBqb2IuZ2V0RmVhdHVyZSgpLCBzdGF0dXMpOwotCQkJCWJyZWFrOwotCQl9Ci0KLQkJLy8gcmVwb3J0IHN0YXR1cwotCQlpZiAoc3RhdHVzLnNpemUoKSA+IDApIHsKLQkJCWlmIChiZWZvcmVTdGF0dXMuc2l6ZSgpID4gMCkKLQkJCQlyZXR1cm4gY3JlYXRlTXVsdGlTdGF0dXMoS0VZX1JPT1RfTUVTU0FHRV9JTklULCBiZWZvcmVTdGF0dXMpOwotCQkJZWxzZQotCQkJCXJldHVybiBjcmVhdGVNdWx0aVN0YXR1cyhLRVlfUk9PVF9NRVNTQUdFLCBzdGF0dXMpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogQ2FsbGVkIGJ5IFVJIGJlZm9yZSBwcm9jZXNzaW5nIGEgZGVsdGEKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgdmFsaWRhdGVTZXNzaW9uRGVsdGEoCi0JCUlTZXNzaW9uRGVsdGEgZGVsdGEsCi0JCUlGZWF0dXJlUmVmZXJlbmNlW10gZGVsdGFSZWZzKSB7Ci0JCS8vIGNoZWNrIGluaXRpYWwgc3RhdGUKLQkJQXJyYXlMaXN0IGJlZm9yZVN0YXR1cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJdmFsaWRhdGVJbml0aWFsU3RhdGUoYmVmb3JlU3RhdHVzKTsKLQotCQkvLyBjaGVjayBwcm9wb3NlZCBjaGFuZ2UKLQkJQXJyYXlMaXN0IHN0YXR1cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc3dpdGNoIChkZWx0YS5nZXRUeXBlKCkpIHsKLQkJCWNhc2UgSVNlc3Npb25EZWx0YS5FTkFCTEUgOgotCQkJCXZhbGlkYXRlRGVsdGFDb25maWd1cmUoZGVsdGEsIGRlbHRhUmVmcywgc3RhdHVzKTsKLQkJCQlicmVhazsKLQkJfQotCi0JCS8vIHJlcG9ydCBzdGF0dXMKLQkJaWYgKHN0YXR1cy5zaXplKCkgPiAwKSB7Ci0JCQlpZiAoYmVmb3JlU3RhdHVzLnNpemUoKSA+IDApCi0JCQkJcmV0dXJuIGNyZWF0ZU11bHRpU3RhdHVzKEtFWV9ST09UX01FU1NBR0VfSU5JVCwgYmVmb3JlU3RhdHVzKTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gY3JlYXRlTXVsdGlTdGF0dXMoS0VZX1JPT1RfTUVTU0FHRSwgc3RhdHVzKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIENhbGxlZCBieSB0aGUgVUkgYmVmb3JlIGRvaW5nIGEgcmV2ZXJ0LyByZXN0b3JlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyB2YWxpZGF0ZVBlbmRpbmdSZXZlcnQoSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQkvLyBjaGVjayBpbml0aWFsIHN0YXRlCi0JCUFycmF5TGlzdCBiZWZvcmVTdGF0dXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXZhbGlkYXRlSW5pdGlhbFN0YXRlKGJlZm9yZVN0YXR1cyk7Ci0KLQkJLy8gY2hlY2sgcHJvcG9zZWQgY2hhbmdlCi0JCUFycmF5TGlzdCBzdGF0dXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXZhbGlkYXRlUmV2ZXJ0KGNvbmZpZywgc3RhdHVzKTsKLQotCQkvLyByZXBvcnQgc3RhdHVzCi0JCWlmIChzdGF0dXMuc2l6ZSgpID4gMCkgewotCQkJaWYgKGJlZm9yZVN0YXR1cy5zaXplKCkgPiAwKQotCQkJCXJldHVybiBjcmVhdGVNdWx0aVN0YXR1cyhLRVlfUk9PVF9NRVNTQUdFX0lOSVQsIGJlZm9yZVN0YXR1cyk7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIGNyZWF0ZU11bHRpU3RhdHVzKEtFWV9ST09UX01FU1NBR0UsIHN0YXR1cyk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBDYWxsZWQgYnkgdGhlIFVJIGJlZm9yZSBkb2luZyBhIG9uZS1jbGljayB1cGRhdGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIHZhbGlkYXRlUGVuZGluZ09uZUNsaWNrVXBkYXRlKFBlbmRpbmdDaGFuZ2VbXSBqb2JzKSB7Ci0JCS8vIGNoZWNrIGluaXRpYWwgc3RhdGUKLQkJQXJyYXlMaXN0IGJlZm9yZVN0YXR1cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJdmFsaWRhdGVJbml0aWFsU3RhdGUoYmVmb3JlU3RhdHVzKTsKLQotCQkvLyBjaGVjayBwcm9wb3NlZCBjaGFuZ2UKLQkJQXJyYXlMaXN0IHN0YXR1cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkvLyByZXBvcnQgc3RhdHVzCi0JCWlmIChzdGF0dXMuc2l6ZSgpID4gMCkgewotCQkJaWYgKGJlZm9yZVN0YXR1cy5zaXplKCkgPiAwKQotCQkJCXJldHVybiBjcmVhdGVNdWx0aVN0YXR1cyhLRVlfUk9PVF9NRVNTQUdFX0lOSVQsIGJlZm9yZVN0YXR1cyk7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIGNyZWF0ZU11bHRpU3RhdHVzKEtFWV9ST09UX01FU1NBR0UsIHN0YXR1cyk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBDYWxsZWQgYnkgdGhlIFVJIGJlZm9yZSBkb2luZyBhIGJhdGNoZWQgcHJvY2Vzc2luZyBvZgotCSAqIHNldmVyYWwgcGVuZGluZyBjaGFuZ2VzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyB2YWxpZGF0ZVBlbmRpbmdDaGFuZ2VzKFBlbmRpbmdDaGFuZ2VbXSBqb2JzKSB7Ci0JCS8vIGNoZWNrIGluaXRpYWwgc3RhdGUKLQkJQXJyYXlMaXN0IGJlZm9yZVN0YXR1cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJdmFsaWRhdGVJbml0aWFsU3RhdGUoYmVmb3JlU3RhdHVzKTsKLQotCQkvLyBjaGVjayBwcm9wb3NlZCBjaGFuZ2UKLQkJQXJyYXlMaXN0IHN0YXR1cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJdmFsaWRhdGVQZW5kaW5nQ2hhbmdlcyhqb2JzLCBzdGF0dXMpOwotCi0JCS8vIHJlcG9ydCBzdGF0dXMKLQkJaWYgKHN0YXR1cy5zaXplKCkgPiAwKSB7Ci0JCQlpZiAoYmVmb3JlU3RhdHVzLnNpemUoKSA+IDApCi0JCQkJcmV0dXJuIGNyZWF0ZU11bHRpU3RhdHVzKEtFWV9ST09UX01FU1NBR0VfSU5JVCwgYmVmb3JlU3RhdHVzKTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gY3JlYXRlTXVsdGlTdGF0dXMoS0VZX1JPT1RfTUVTU0FHRSwgc3RhdHVzKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIENoZWNrIHRoZSBjdXJyZW50IHN0YXRlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyB2YWxpZGF0ZUN1cnJlbnRTdGF0ZSgpIHsKLQkJLy8gY2hlY2sgdGhlIHN0YXRlCi0JCUFycmF5TGlzdCBzdGF0dXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXZhbGlkYXRlSW5pdGlhbFN0YXRlKHN0YXR1cyk7Ci0KLQkJLy8gcmVwb3J0IHN0YXR1cwotCQlpZiAoc3RhdHVzLnNpemUoKSA+IDApCi0JCQlyZXR1cm4gY3JlYXRlTXVsdGlTdGF0dXMoS0VZX1JPT1RfTUVTU0FHRSwgc3RhdHVzKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBDaGVjayB0byBzZWUgaWYgd2UgYXJlIG5vdCBicm9rZW4gZXZlbiBiZWZvcmUgd2Ugc3RhcnQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHZhbGlkYXRlSW5pdGlhbFN0YXRlKEFycmF5TGlzdCBzdGF0dXMpIHsKLQkJdHJ5IHsKLQkJCUFycmF5TGlzdCBmZWF0dXJlcyA9IGNvbXB1dGVGZWF0dXJlcygpOwotCQkJY2hlY2tDb25zdHJhaW50cyhmZWF0dXJlcywgc3RhdHVzKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlzdGF0dXMuYWRkKGUuZ2V0U3RhdHVzKCkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBoYW5kbGUgdW5jb25maWd1cmUKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHZhbGlkYXRlVW5jb25maWd1cmUoCi0JCUlGZWF0dXJlIGZlYXR1cmUsCi0JCUFycmF5TGlzdCBzdGF0dXMpIHsKLQkJdHJ5IHsKLQkJCWlmICh2YWxpZGF0ZVVuY29uZmlndXJlUGF0Y2goZmVhdHVyZSwgc3RhdHVzKSkKLQkJCQlyZXR1cm47Ci0JCQlBcnJheUxpc3QgZmVhdHVyZXMgPSBjb21wdXRlRmVhdHVyZXMoKTsKLQkJCWZlYXR1cmVzID0gY29tcHV0ZUZlYXR1cmVzQWZ0ZXJPcGVyYXRpb24oZmVhdHVyZXMsIG51bGwsIGZlYXR1cmUpOwotCQkJY2hlY2tDb25zdHJhaW50cyhmZWF0dXJlcywgc3RhdHVzKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlzdGF0dXMuYWRkKGUuZ2V0U3RhdHVzKCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiB2YWxpZGF0ZVVuY29uZmlndXJlUGF0Y2goCi0JCUlGZWF0dXJlIGZlYXR1cmUsCi0JCUFycmF5TGlzdCBzdGF0dXMpCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGZlYXR1cmUuaXNQYXRjaCgpKSB7Ci0JCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gYmFja3VwID0KLQkJCQlVcGRhdGVVSS5nZXRCYWNrdXBDb25maWd1cmF0aW9uRm9yKGZlYXR1cmUpOwotCQkJU3RyaW5nIG1zZzsKLQkJCWlmIChiYWNrdXAgIT0gbnVsbCkKLQkJCQltc2cgPQotCQkJCQlVcGRhdGVVSS5nZXRGb3JtYXR0ZWRNZXNzYWdlKAotCQkJCQkJS0VZX1BBVENIX1VOQ09ORklHVVJFX0JBQ0tVUCwKLQkJCQkJCWJhY2t1cC5nZXRMYWJlbCgpKTsKLQkJCWVsc2UKLQkJCQltc2cgPSBVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX1BBVENIX1VOQ09ORklHVVJFKTsKLQkJCXN0YXR1cy5hZGQoY3JlYXRlU3RhdHVzKGZlYXR1cmUsIG1zZykpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogaGFuZGxlIGNvbmZpZ3VyZQotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgdmFsaWRhdGVDb25maWd1cmUoSUZlYXR1cmUgZmVhdHVyZSwgQXJyYXlMaXN0IHN0YXR1cykgewotCQl0cnkgewotCQkJQXJyYXlMaXN0IGZlYXR1cmVzID0gY29tcHV0ZUZlYXR1cmVzKCk7Ci0JCQljaGVja09wdGlvbmFsQ2hpbGRDb25maWd1cmluZyhmZWF0dXJlLCBzdGF0dXMpOwotCQkJZmVhdHVyZXMgPSBjb21wdXRlRmVhdHVyZXNBZnRlck9wZXJhdGlvbihmZWF0dXJlcywgZmVhdHVyZSwgbnVsbCk7Ci0JCQljaGVja0NvbnN0cmFpbnRzKGZlYXR1cmVzLCBzdGF0dXMpOwotCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJc3RhdHVzLmFkZChlLmdldFN0YXR1cygpKTsKLQkJfQotCX0KLQotCS8qCi0JICogaGFuZGxlIGluc3RhbGwgYW5kIHVwZGF0ZQotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgdmFsaWRhdGVJbnN0YWxsKAotCQlJRmVhdHVyZSBvbGRGZWF0dXJlLAotCQlJRmVhdHVyZSBuZXdGZWF0dXJlLAotCQlBcnJheUxpc3Qgc3RhdHVzKSB7Ci0JCXRyeSB7Ci0JCQlBcnJheUxpc3QgZmVhdHVyZXMgPSBjb21wdXRlRmVhdHVyZXMoKTsKLQkJCWlmIChvbGRGZWF0dXJlID09IG51bGwgJiYgaXNQYXRjaChuZXdGZWF0dXJlKSkKLQkJCQljaGVja1VuaXF1ZShuZXdGZWF0dXJlLCBmZWF0dXJlcywgc3RhdHVzKTsKLQkJCWZlYXR1cmVzID0KLQkJCQljb21wdXRlRmVhdHVyZXNBZnRlck9wZXJhdGlvbihmZWF0dXJlcywgbmV3RmVhdHVyZSwgb2xkRmVhdHVyZSk7Ci0JCQljaGVja0NvbnN0cmFpbnRzKGZlYXR1cmVzLCBzdGF0dXMpOwotCQkJY2hlY2tMaWNlbnNlKG5ld0ZlYXR1cmUsIHN0YXR1cyk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJc3RhdHVzLmFkZChlLmdldFN0YXR1cygpKTsKLQkJfQotCX0KLQotCS8qCi0JICogaGFuZGxlIHJldmVydCBhbmQgcmVzdG9yZQotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgdmFsaWRhdGVSZXZlcnQoCi0JCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcsCi0JCUFycmF5TGlzdCBzdGF0dXMpIHsKLQkJdHJ5IHsKLQkJCS8vIGNoZWNrIHRoZSB0aW1lbGluZSBhbmQgZG9uJ3QgYm90aGVyCi0JCQkvLyB0byBjaGVjayBhbnl0aGluZyBlbHNlIGlmIG5lZ2F0aXZlCi0JCQlpZiAoIWNoZWNrVGltZWxpbmUoY29uZmlnLCBzdGF0dXMpKQotCQkJCXJldHVybjsKLQkJCUFycmF5TGlzdCBmZWF0dXJlcyA9IGNvbXB1dGVGZWF0dXJlc0FmdGVyUmV2ZXJ0KGNvbmZpZyk7Ci0JCQljaGVja0NvbnN0cmFpbnRzKGZlYXR1cmVzLCBzdGF0dXMpOwotCQkJY2hlY2tSZXZlcnRDb25zdHJhaW50cyhmZWF0dXJlcywgc3RhdHVzKTsKLQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXN0YXR1cy5hZGQoZS5nZXRTdGF0dXMoKSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEhhbmRsZSBkZWx0YSBhZGRpdGlvbgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgdmFsaWRhdGVEZWx0YUNvbmZpZ3VyZSgKLQkJSVNlc3Npb25EZWx0YSBkZWx0YSwKLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBkZWx0YVJlZnMsCi0JCUFycmF5TGlzdCBzdGF0dXMpIHsKLQkJdHJ5IHsKLQkJCUFycmF5TGlzdCBmZWF0dXJlcyA9IGNvbXB1dGVGZWF0dXJlc0FmdGVyRGVsdGEoZGVsdGEsIGRlbHRhUmVmcyk7Ci0JCQljaGVja0NvbnN0cmFpbnRzKGZlYXR1cmVzLCBzdGF0dXMpOwotCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJc3RhdHVzLmFkZChlLmdldFN0YXR1cygpKTsKLQkJfQotCX0KLQotCS8qCi0JICogSGFuZGxlIG9uZS1jbGljayBjaGFuZ2VzIGFzIGEgYmF0Y2gKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHZhbGlkYXRlUGVuZGluZ0NoYW5nZXMoCi0JCVBlbmRpbmdDaGFuZ2VbXSBqb2JzLAotCQlBcnJheUxpc3Qgc3RhdHVzKSB7Ci0JCXRyeSB7Ci0JCQlBcnJheUxpc3QgZmVhdHVyZXMgPSBjb21wdXRlRmVhdHVyZXMoKTsKLQkJCUFycmF5TGlzdCBzYXZlZEZlYXR1cmVzID0gZmVhdHVyZXM7Ci0JCQlpbnQgbmV4Y2x1c2l2ZXMgPSAwOwotCi0JCQkvLyBwYXNzIDE6IHNlZSBpZiB3ZSBjYW4gcHJvY2VzcyB0aGUgZW50aXJlICJiYXRjaCIKLQkJCUFycmF5TGlzdCB0bXBTdGF0dXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGpvYnMubGVuZ3RoOyBpKyspIHsKLQkJCQlQZW5kaW5nQ2hhbmdlIGpvYiA9IGpvYnNbaV07Ci0JCQkJaW50IG1vZGUgPSBqb2IuZ2V0Sm9iVHlwZSgpOwotCi0JCQkJSUZlYXR1cmUgbmV3RmVhdHVyZSA9IGpvYi5nZXRGZWF0dXJlKCk7Ci0JCQkJSUZlYXR1cmUgb2xkRmVhdHVyZSA9IGpvYi5nZXRPbGRGZWF0dXJlKCk7Ci0JCQkJY2hlY2tMaWNlbnNlKG5ld0ZlYXR1cmUsIHN0YXR1cyk7Ci0JCQkJaWYgKGpvYnMubGVuZ3RoID4gMSAmJiBuZXdGZWF0dXJlLmlzRXhjbHVzaXZlKCkpIHsKLQkJCQkJbmV4Y2x1c2l2ZXMrKzsKLQkJCQkJc3RhdHVzLmFkZCgKLQkJCQkJCWNyZWF0ZVN0YXR1cygKLQkJCQkJCQluZXdGZWF0dXJlLAotCQkJCQkJCVVwZGF0ZVVJLmdldFN0cmluZyhLRVlfRVhDTFVTSVZFKSkpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJaWYgKG1vZGUgPT0gUGVuZGluZ0NoYW5nZS5VTkNPTkZJR1VSRQotCQkJCQkmJiB2YWxpZGF0ZVVuY29uZmlndXJlUGF0Y2gobmV3RmVhdHVyZSwgc3RhdHVzKSkKLQkJCQkJY29udGludWU7Ci0JCQkJc3dpdGNoIChtb2RlKSB7Ci0JCQkJCWNhc2UgUGVuZGluZ0NoYW5nZS5JTlNUQUxMIDoKLQkJCQkJCWZlYXR1cmVzID0KLQkJCQkJCQljb21wdXRlRmVhdHVyZXNBZnRlck9wZXJhdGlvbigKLQkJCQkJCQkJZmVhdHVyZXMsCi0JCQkJCQkJCW5ld0ZlYXR1cmUsCi0JCQkJCQkJCW9sZEZlYXR1cmUpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgUGVuZGluZ0NoYW5nZS5DT05GSUdVUkUgOgotCQkJCQkJZmVhdHVyZXMgPQotCQkJCQkJCWNvbXB1dGVGZWF0dXJlc0FmdGVyT3BlcmF0aW9uKAotCQkJCQkJCQlmZWF0dXJlcywKLQkJCQkJCQkJbmV3RmVhdHVyZSwKLQkJCQkJCQkJbnVsbCk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBQZW5kaW5nQ2hhbmdlLlVOQ09ORklHVVJFIDoKLQkJCQkJCWZlYXR1cmVzID0KLQkJCQkJCQljb21wdXRlRmVhdHVyZXNBZnRlck9wZXJhdGlvbigKLQkJCQkJCQkJZmVhdHVyZXMsCi0JCQkJCQkJCW51bGwsCi0JCQkJCQkJCW5ld0ZlYXR1cmUpOwotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKG5leGNsdXNpdmVzID4gMCkKLQkJCQlyZXR1cm47Ci0JCQljaGVja0NvbnN0cmFpbnRzKGZlYXR1cmVzLCB0bXBTdGF0dXMpOwotCQkJaWYgKHRtcFN0YXR1cy5zaXplKCkgPT0gMCkgLy8gdGhlIHdob2xlICJiYXRjaCIgaXMgT0sKLQkJCQlyZXR1cm47Ci0KLQkJCS8vIHBhc3MgMjogd2UgaGF2ZSBjb25mbGljdHMKLQkJCWZlYXR1cmVzID0gc2F2ZWRGZWF0dXJlczsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgam9icy5sZW5ndGg7IGkrKykgewotCQkJCVBlbmRpbmdDaGFuZ2Ugam9iID0gam9ic1tpXTsKLQkJCQlpbnQgbW9kZSA9IGpvYi5nZXRKb2JUeXBlKCk7Ci0JCQkJSUZlYXR1cmUgbmV3RmVhdHVyZSA9IGpvYi5nZXRGZWF0dXJlKCk7Ci0JCQkJSUZlYXR1cmUgb2xkRmVhdHVyZSA9IGpvYi5nZXRPbGRGZWF0dXJlKCk7Ci0JCQkJc3dpdGNoIChtb2RlKSB7Ci0JCQkJCWNhc2UgUGVuZGluZ0NoYW5nZS5JTlNUQUxMIDoKLQkJCQkJCWZlYXR1cmVzID0KLQkJCQkJCQljb21wdXRlRmVhdHVyZXNBZnRlck9wZXJhdGlvbigKLQkJCQkJCQkJZmVhdHVyZXMsCi0JCQkJCQkJCW5ld0ZlYXR1cmUsCi0JCQkJCQkJCW9sZEZlYXR1cmUpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgUGVuZGluZ0NoYW5nZS5DT05GSUdVUkUgOgotCQkJCQkJZmVhdHVyZXMgPQotCQkJCQkJCWNvbXB1dGVGZWF0dXJlc0FmdGVyT3BlcmF0aW9uKAotCQkJCQkJCQlmZWF0dXJlcywKLQkJCQkJCQkJbmV3RmVhdHVyZSwKLQkJCQkJCQkJbnVsbCk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBQZW5kaW5nQ2hhbmdlLlVOQ09ORklHVVJFIDoKLQkJCQkJCWZlYXR1cmVzID0KLQkJCQkJCQljb21wdXRlRmVhdHVyZXNBZnRlck9wZXJhdGlvbigKLQkJCQkJCQkJZmVhdHVyZXMsCi0JCQkJCQkJCW51bGwsCi0JCQkJCQkJCW5ld0ZlYXR1cmUpOwotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNoZWNrQ29uc3RyYWludHMoZmVhdHVyZXMsIHN0YXR1cyk7Ci0JCQkJaWYgKHN0YXR1cy5zaXplKCkgPiAwKSB7Ci0JCQkJCUlTdGF0dXMgY29uZmxpY3QgPQotCQkJCQkJY3JlYXRlU3RhdHVzKAotCQkJCQkJCW5ld0ZlYXR1cmUsCi0JCQkJCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9DT05GTElDVCkpOwotCQkJCQlzdGF0dXMuYWRkKDAsIGNvbmZsaWN0KTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlzdGF0dXMuYWRkKGUuZ2V0U3RhdHVzKCkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBIYW5kbGUgb25lLWNsaWNrIGNoYW5nZXMgYXMgYSBiYXRjaAotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgdmFsaWRhdGVPbmVDbGlja1VwZGF0ZSgKLQkJUGVuZGluZ0NoYW5nZVtdIGpvYnMsCi0JCUFycmF5TGlzdCBzdGF0dXMpIHsKLQkJdHJ5IHsKLQkJCUFycmF5TGlzdCBmZWF0dXJlcyA9IGNvbXB1dGVGZWF0dXJlcygpOwotCQkJQXJyYXlMaXN0IHNhdmVkRmVhdHVyZXMgPSBmZWF0dXJlczsKLQotCQkJLy8gcGFzcyAxOiBzZWUgaWYgd2UgY2FuIHByb2Nlc3MgdGhlIGVudGlyZSAiYmF0Y2giCi0JCQlBcnJheUxpc3QgdG1wU3RhdHVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBqb2JzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUZlYXR1cmUgbmV3RmVhdHVyZSA9IGpvYnNbaV0uZ2V0RmVhdHVyZSgpOwotCQkJCUlGZWF0dXJlIG9sZEZlYXR1cmUgPSBqb2JzW2ldLmdldE9sZEZlYXR1cmUoKTsKLQkJCQlmZWF0dXJlcyA9Ci0JCQkJCWNvbXB1dGVGZWF0dXJlc0FmdGVyT3BlcmF0aW9uKAotCQkJCQkJZmVhdHVyZXMsCi0JCQkJCQluZXdGZWF0dXJlLAotCQkJCQkJb2xkRmVhdHVyZSk7Ci0JCQl9Ci0JCQljaGVja0NvbnN0cmFpbnRzKGZlYXR1cmVzLCB0bXBTdGF0dXMpOwotCQkJaWYgKHRtcFN0YXR1cy5zaXplKCkgPT0gMCkgLy8gdGhlIHdob2xlICJiYXRjaCIgaXMgT0sKLQkJCQlyZXR1cm47Ci0KLQkJCS8vIHBhc3MgMjogd2UgaGF2ZSBjb25mbGljdHMKLQkJCWZlYXR1cmVzID0gc2F2ZWRGZWF0dXJlczsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgam9icy5sZW5ndGg7IGkrKykgewotCQkJCUlGZWF0dXJlIG5ld0ZlYXR1cmUgPSBqb2JzW2ldLmdldEZlYXR1cmUoKTsKLQkJCQlJRmVhdHVyZSBvbGRGZWF0dXJlID0gam9ic1tpXS5nZXRPbGRGZWF0dXJlKCk7Ci0JCQkJZmVhdHVyZXMgPQotCQkJCQljb21wdXRlRmVhdHVyZXNBZnRlck9wZXJhdGlvbigKLQkJCQkJCWZlYXR1cmVzLAotCQkJCQkJbmV3RmVhdHVyZSwKLQkJCQkJCW9sZEZlYXR1cmUpOwotCQkJCWNoZWNrQ29uc3RyYWludHMoZmVhdHVyZXMsIHN0YXR1cyk7Ci0JCQkJY2hlY2tMaWNlbnNlKG5ld0ZlYXR1cmUsIHN0YXR1cyk7Ci0JCQkJaWYgKHN0YXR1cy5zaXplKCkgPiAwKSB7Ci0JCQkJCUlTdGF0dXMgY29uZmxpY3QgPQotCQkJCQkJY3JlYXRlU3RhdHVzKAotCQkJCQkJCW5ld0ZlYXR1cmUsCi0JCQkJCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9DT05GTElDVCkpOwotCQkJCQlzdGF0dXMuYWRkKDAsIGNvbmZsaWN0KTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlzdGF0dXMuYWRkKGUuZ2V0U3RhdHVzKCkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBDb21wdXRlIGEgbGlzdCBvZiBjb25maWd1cmVkIGZlYXR1cmVzCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgQXJyYXlMaXN0IGNvbXB1dGVGZWF0dXJlcygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNvbXB1dGVGZWF0dXJlcyh0cnVlKTsKLQl9Ci0JLyoKLQkgKiBDb21wdXRlIGEgbGlzdCBvZiBjb25maWd1cmVkIGZlYXR1cmVzCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgQXJyYXlMaXN0IGNvbXB1dGVGZWF0dXJlcyhib29sZWFuIGNvbmZpZ3VyZWRPbmx5KQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUFycmF5TGlzdCBmZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSUxvY2FsU2l0ZSBsb2NhbFNpdGUgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsKLQkJSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZyA9IGxvY2FsU2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpOwotCQlJQ29uZmlndXJlZFNpdGVbXSBjc2l0ZXMgPSBjb25maWcuZ2V0Q29uZmlndXJlZFNpdGVzKCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjc2l0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlDb25maWd1cmVkU2l0ZSBjc2l0ZSA9IGNzaXRlc1tpXTsKLQotCQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBjcmVmczsKLQotCQkJaWYgKGNvbmZpZ3VyZWRPbmx5KQotCQkJCWNyZWZzID0gY3NpdGUuZ2V0Q29uZmlndXJlZEZlYXR1cmVzKCk7Ci0JCQllbHNlCi0JCQkJY3JlZnMgPSBjc2l0ZS5nZXRTaXRlKCkuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgY3JlZnMubGVuZ3RoOyBqKyspIHsKLQkJCQlJRmVhdHVyZVJlZmVyZW5jZSBjcmVmID0gY3JlZnNbal07Ci0JCQkJSUZlYXR1cmUgY2ZlYXR1cmUgPSBjcmVmLmdldEZlYXR1cmUobnVsbCk7Ci0JCQkJZmVhdHVyZXMuYWRkKGNmZWF0dXJlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBmZWF0dXJlczsKLQl9Ci0KLQkvKgotCSAqIENvbXB1dGUgdGhlIG5lc3RlZCBmZWF0dXJlIHN1YnRyZWUgc3RhcnRpbmcgYXQgdGhlIHNwZWNpZmllZCBiYXNlIGZlYXR1cmUKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBBcnJheUxpc3QgY29tcHV0ZUZlYXR1cmVTdWJ0cmVlKAotCQlJRmVhdHVyZSB0b3AsCi0JCUlGZWF0dXJlIGZlYXR1cmUsCi0JCUFycmF5TGlzdCBmZWF0dXJlcywKLQkJYm9vbGVhbiB0b2xlcmF0ZU1pc3NpbmdDaGlsZHJlbikKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gY29tcHV0ZUZlYXR1cmVTdWJ0cmVlKAotCQkJdG9wLAotCQkJZmVhdHVyZSwKLQkJCWZlYXR1cmVzLAotCQkJdG9sZXJhdGVNaXNzaW5nQ2hpbGRyZW4sCi0JCQludWxsKTsKLQl9Ci0KLQkvKgotCSAqIENvbXB1dGUgdGhlIG5lc3RlZCBmZWF0dXJlIHN1YnRyZWUgc3RhcnRpbmcgYXQgdGhlIHNwZWNpZmllZCBiYXNlIGZlYXR1cmUKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBBcnJheUxpc3QgY29tcHV0ZUZlYXR1cmVTdWJ0cmVlKAotCQlJRmVhdHVyZSB0b3AsCi0JCUlGZWF0dXJlIGZlYXR1cmUsCi0JCUFycmF5TGlzdCBmZWF0dXJlcywKLQkJYm9vbGVhbiB0b2xlcmF0ZU1pc3NpbmdDaGlsZHJlbiwKLQkJQXJyYXlMaXN0IGNvbmZpZ3VyZWRGZWF0dXJlcykKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCS8vIGNoZWNrIGFyZ3VtZW50cwotCQlpZiAoZmVhdHVyZXMgPT0gbnVsbCkKLQkJCWZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAodG9wID09IG51bGwpCi0JCQlyZXR1cm4gZmVhdHVyZXM7Ci0JCWlmIChmZWF0dXJlID09IG51bGwpCi0JCQlmZWF0dXJlID0gdG9wOwotCi0JCS8vIGNoZWNrIGZvciA8aW5jbHVkZXM+IGN5Y2xlCi0JCWlmIChmZWF0dXJlcy5jb250YWlucyhmZWF0dXJlKSkgewotCQkJSVN0YXR1cyBzdGF0dXMgPSBjcmVhdGVTdGF0dXModG9wLCBVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX0NZQ0xFKSk7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMpOwotCQl9Ci0KLQkJLy8gcmV0dXJuIHNwZWNpZmllZCBiYXNlIGZlYXR1cmUgYW5kIGFsbCBpdHMgY2hpbGRyZW4KLQkJZmVhdHVyZXMuYWRkKGZlYXR1cmUpOwotCQlJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlW10gY2hpbGRyZW4gPQotCQkJZmVhdHVyZS5nZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJSUZlYXR1cmUgY2hpbGQ7Ci0JCQkJaWYgKGNvbmZpZ3VyZWRGZWF0dXJlcyA9PSBudWxsKQotCQkJCQljaGlsZCA9IGNoaWxkcmVuW2ldLmdldEZlYXR1cmUobnVsbCk7Ci0JCQkJZWxzZQotCQkJCQljaGlsZCA9IGdldEJlc3RNYXRjaChjaGlsZHJlbltpXSwgY29uZmlndXJlZEZlYXR1cmVzKTsKLQkJCQlmZWF0dXJlcyA9Ci0JCQkJCWNvbXB1dGVGZWF0dXJlU3VidHJlZSgKLQkJCQkJCXRvcCwKLQkJCQkJCWNoaWxkLAotCQkJCQkJZmVhdHVyZXMsCi0JCQkJCQl0b2xlcmF0ZU1pc3NpbmdDaGlsZHJlbik7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoIWNoaWxkcmVuW2ldLmlzT3B0aW9uYWwoKSAmJiAhdG9sZXJhdGVNaXNzaW5nQ2hpbGRyZW4pCi0JCQkJCXRocm93IGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZlYXR1cmVzOwotCX0KLQkvKgotCSAqIFRoaXMgbWV0aG9kIGZpeGVzIHRoZSBkZWZlY3QgMzQyNDEuIEluY2x1ZGVkIGZlYXR1cmUgcmVmZXJlbmNlCi0JICogb2YgdGhlIGZlYXR1cmUgZnJvbSB0aGUgcmVtb3RlIHNlcnZlciBhbHdheXMgcmV0dXJucyAKLQkgKiBhIHBlcmZlY3QgbWF0Y2guIEhvd2V2ZXIsIHRoZSBhY3R1YWwgaW5zdGFsbCBiZWhhdmlvdXIgaXMKLQkgKiBkaWZmZXJlbnQgaWYgdGhhdCBmZWF0dXJlIGFscmVhZHkgZXhpc3RzIChhcyBkaXNhYmxlZCkgCi0JICogd2hpbGUgYSBiZXR0ZXIgb25lIGlzIGVuYWJsZWQuIFRoaXMgdHlwaWNhbGx5IGhhcHBlbnMKLQkgKiB0aHJvdWdoIGJyYW5jaCB1cGRhdGVzIG9yIHBhdGNoZXMuCi0JICogCi0JICogVG8gYXZvaWQgdGhpcyBwcm9ibGVtLCB3ZSBuZWVkIHRvIGNoZWNrIGlmIGEgYmV0dGVyIGZlYXR1cmUKLQkgKiB0aGF0IHN0aWxsIG1hdGNoZXMgdGhlIHJlZmVyZW5jZSBpcyBlbmFibGVkIGluIHRoZSBjdXJyZW50Ci0JICogY29uZmlndXJhdGlvbi4gSWYgaXQgaXMsIGl0IHdpbGwgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZQotCSAqICdwZXJmZWN0JyBtYXRjaC4gSWYgbm90LCB3ZSBzaG91bGQgZGVmYXVsdCB0byB0aGUgb2xkCi0JICogYmVoYXZpb3VyLgotCSAqLwotCi0JcHJpdmF0ZSBzdGF0aWMgSUZlYXR1cmUgZ2V0QmVzdE1hdGNoKAotCQlJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlIHJlZiwKLQkJQXJyYXlMaXN0IGNvbmZpZ3VyZWRGZWF0dXJlcykKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpbnQgbWF0Y2ggPSByZWYuZ2V0TWF0Y2goKTsKLQkJSVNpdGUgc2l0ZSA9IHJlZi5nZXRTaXRlKCk7Ci0JCUlDb25maWd1cmVkU2l0ZSBjc2l0ZSA9IHNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyZWRTaXRlKCk7Ci0JCS8vIElmIHRoZSBmZWF0dXJlIGlzIGZyb20gdGhlIHJlbW90ZSBzZXJ2ZXIgYW5kCi0JCS8vIGl0IGNhbiBoYW5kbGUgYmV0dGVyIGZlYXR1cmVzLCBzZWUgaWYgeW91IGNhbgotCQkvLyByZXNvbHZlIGxvY2FsbHkuCi0JCWlmIChjc2l0ZSA9PSBudWxsICYmIG1hdGNoICE9IElVcGRhdGVDb25zdGFudHMuUlVMRV9QRVJGRUNUKSB7Ci0JCQkvLyB0aGVyZSBpcyBhIGNoYW5jZSB0aGF0IHRoZXJlIGlzIGEgYmV0dGVyIG1hdGNoCi0JCQkvLyBpbiB0aGUgcGxhdGZvcm0KLQkJCVZlcnNpb25lZElkZW50aWZpZXIgdmlkID0gcmVmLmdldFZlcnNpb25lZElkZW50aWZpZXIoKTsKLQkJCVBsdWdpblZlcnNpb25JZGVudGlmaWVyIHZlcnNpb24gPSB2aWQuZ2V0VmVyc2lvbigpOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ3VyZWRGZWF0dXJlcy5zaXplKCk7IGkrKykgewotCQkJCUlGZWF0dXJlIGZlYXR1cmUgPSAoSUZlYXR1cmUpIGNvbmZpZ3VyZWRGZWF0dXJlcy5nZXQoaSk7Ci0JCQkJVmVyc2lvbmVkSWRlbnRpZmllciBmdmlkID0gZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7Ci0JCQkJaWYgKGZ2aWQuZ2V0SWRlbnRpZmllcigpLmVxdWFscyh2aWQuZ2V0SWRlbnRpZmllcigpKSkgewotCQkJCQkvLyBGZWF0dXJlIGZvdW5kIGluIGxvY2FsIGNvbmZpZ3VyYXRpb24uCi0JCQkJCS8vIElnbm9yZSBpZiB0aGUgc2FtZSB2ZXJzaW9uLgotCQkJCQkvLyBVc2UgaXQgaWYgYmV0dGVyCi0JCQkJCVBsdWdpblZlcnNpb25JZGVudGlmaWVyIGZ2ZXJzaW9uID0gZnZpZC5nZXRWZXJzaW9uKCk7Ci0JCQkJCWlmIChmdmVyc2lvbi5pc0dyZWF0ZXJUaGFuKHZlcnNpb24pKSB7Ci0JCQkJCQlib29sZWFuIG1hdGNoZXMgPSBmYWxzZTsKLQkJCQkJCXN3aXRjaCAobWF0Y2gpIHsKLQkJCQkJCQljYXNlIElJbXBvcnQuUlVMRV9DT01QQVRJQkxFIDoKLQkJCQkJCQkJbWF0Y2hlcyA9Ci0JCQkJCQkJCQlmdmlkLmdldFZlcnNpb24oKS5pc0NvbXBhdGlibGVXaXRoKAotCQkJCQkJCQkJCXZpZC5nZXRWZXJzaW9uKCkpOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIElJbXBvcnQuUlVMRV9FUVVJVkFMRU5UIDoKLQkJCQkJCQkJbWF0Y2hlcyA9Ci0JCQkJCQkJCQlmdmlkLmdldFZlcnNpb24oKS5pc0VxdWl2YWxlbnRUbygKLQkJCQkJCQkJCQl2aWQuZ2V0VmVyc2lvbigpKTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSBJSW1wb3J0LlJVTEVfR1JFQVRFUl9PUl9FUVVBTCA6Ci0JCQkJCQkJCW1hdGNoZXMgPQotCQkJCQkJCQkJZnZpZC5nZXRWZXJzaW9uKCkuaXNHcmVhdGVyT3JFcXVhbFRvKAotCQkJCQkJCQkJCXZpZC5nZXRWZXJzaW9uKCkpOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJCWlmIChtYXRjaGVzKQotCQkJCQkJCXJldHVybiBmZWF0dXJlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIGZhbGxiYWNrIC0ganVzdCBnZXQgdGhlIGZlYXR1cmUgZnJvbSB0aGUgcmVmZXJlbmNlLgotCQlyZXR1cm4gcmVmLmdldEZlYXR1cmUobnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja0xpY2Vuc2UoSUZlYXR1cmUgZmVhdHVyZSwgQXJyYXlMaXN0IHN0YXR1cykgewotCQlJVVJMRW50cnkgbGljZW5zZUVudHJ5ID0gZmVhdHVyZS5nZXRMaWNlbnNlKCk7Ci0JCWlmIChsaWNlbnNlRW50cnkgIT0gbnVsbCkgewotCQkJU3RyaW5nIGxpY2Vuc2UgPSBsaWNlbnNlRW50cnkuZ2V0QW5ub3RhdGlvbigpOwotCQkJaWYgKGxpY2Vuc2UgIT0gbnVsbCAmJiBsaWNlbnNlLnRyaW0oKS5sZW5ndGgoKSA+IDApCi0JCQkJcmV0dXJuOwotCQl9Ci0JCXN0YXR1cy5hZGQoY3JlYXRlU3RhdHVzKGZlYXR1cmUsIFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfTk9fTElDRU5TRSkpKTsKLQl9Ci0KLQkvKgotCSAqIENvbXB1dGUgYSBsaXN0IG9mIGZlYXR1cmVzIHRoYXQgd2lsbCBiZSBjb25maWd1cmVkIGFmdGVyIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBBcnJheUxpc3QgY29tcHV0ZUZlYXR1cmVzQWZ0ZXJPcGVyYXRpb24oCi0JCUFycmF5TGlzdCBmZWF0dXJlcywKLQkJSUZlYXR1cmUgYWRkLAotCQlJRmVhdHVyZSByZW1vdmUpCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQlBcnJheUxpc3QgYWRkVHJlZSA9Ci0JCQljb21wdXRlRmVhdHVyZVN1YnRyZWUoCi0JCQkJYWRkLAotCQkJCW51bGwsCi0JCQkJbnVsbCwKLQkJCQlmYWxzZSwKLQkJLyogZG8gbm90IHRvbGVyYXRlIG1pc3NpbmcgY2hpbGRyZW4gKi8KLQkJZmVhdHVyZXMpOwotCQlBcnJheUxpc3QgcmVtb3ZlVHJlZSA9Ci0JCQljb21wdXRlRmVhdHVyZVN1YnRyZWUoCi0JCQkJcmVtb3ZlLAotCQkJCW51bGwsCi0JCQkJbnVsbCwKLQkJCQl0cnVlIC8qIHRvbGVyYXRlIG1pc3NpbmcgY2hpbGRyZW4gKi8KLQkJKTsKLQkJaWYgKHJlbW92ZSAhPSBudWxsKSB7Ci0JCQkvLyBQYXRjaGVzIHRvIGZlYXR1cmVzIGFyZSByZW1vdmVkIHRvZ2V0aGVyIHdpdGgKLQkJCS8vIHRob3NlIGZlYXR1cmVzLiBJbmNsdWRlIHRoZW0gaW4gdGhlIGxpc3QuCi0JCQljb250cmlidXRlUGF0Y2hlc0ZvcihyZW1vdmVUcmVlLCBmZWF0dXJlcywgcmVtb3ZlVHJlZSk7Ci0JCX0KLQotCQlpZiAocmVtb3ZlICE9IG51bGwpCi0JCQlmZWF0dXJlcy5yZW1vdmVBbGwocmVtb3ZlVHJlZSk7Ci0KLQkJaWYgKGFkZCAhPSBudWxsKQotCQkJZmVhdHVyZXMuYWRkQWxsKGFkZFRyZWUpOwotCi0JCXJldHVybiBmZWF0dXJlczsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNvbnRyaWJ1dGVQYXRjaGVzRm9yKAotCQlBcnJheUxpc3QgcmVtb3ZlVHJlZSwKLQkJQXJyYXlMaXN0IGZlYXR1cmVzLAotCQlBcnJheUxpc3QgcmVzdWx0KQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZW1vdmVUcmVlLnNpemUoKTsgaSsrKSB7Ci0JCQlJRmVhdHVyZSBmZWF0dXJlID0gKElGZWF0dXJlKSByZW1vdmVUcmVlLmdldChpKTsKLQkJCWNvbnRyaWJ1dGVQYXRjaGVzRm9yKGZlYXR1cmUsIGZlYXR1cmVzLCByZXN1bHQpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb250cmlidXRlUGF0Y2hlc0ZvcigKLQkJSUZlYXR1cmUgZmVhdHVyZSwKLQkJQXJyYXlMaXN0IGZlYXR1cmVzLAotCQlBcnJheUxpc3QgcmVzdWx0KQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXMuc2l6ZSgpOyBpKyspIHsKLQkJCUlGZWF0dXJlIGNhbmRpZGF0ZSA9IChJRmVhdHVyZSkgZmVhdHVyZXMuZ2V0KGkpOwotCQkJaWYgKFVwZGF0ZVVJLmlzUGF0Y2goZmVhdHVyZSwgY2FuZGlkYXRlKSkgewotCQkJCUFycmF5TGlzdCByZW1vdmVUcmVlID0KLQkJCQkJY29tcHV0ZUZlYXR1cmVTdWJ0cmVlKGNhbmRpZGF0ZSwgbnVsbCwgbnVsbCwgdHJ1ZSk7Ci0JCQkJcmVzdWx0LmFkZEFsbChyZW1vdmVUcmVlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogQ29tcHV0ZSBhIGxpc3Qgb2YgZmVhdHVyZXMgdGhhdCB3aWxsIGJlIGNvbmZpZ3VyZWQgYWZ0ZXIgcGVyZm9ybWluZyB0aGUgcmV2ZXJ0Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgQXJyYXlMaXN0IGNvbXB1dGVGZWF0dXJlc0FmdGVyUmV2ZXJ0KElJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcpCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSUNvbmZpZ3VyZWRTaXRlW10gY3NpdGVzID0gY29uZmlnLmdldENvbmZpZ3VyZWRTaXRlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNzaXRlcy5sZW5ndGg7IGkrKykgewotCQkJSUNvbmZpZ3VyZWRTaXRlIGNzaXRlID0gY3NpdGVzW2ldOwotCQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBmZWF0dXJlcyA9IGNzaXRlLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBmZWF0dXJlcy5sZW5ndGg7IGorKykgewotCQkJCWxpc3QuYWRkKGZlYXR1cmVzW2pdLmdldEZlYXR1cmUobnVsbCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCS8qCi0JICogQ29tcHV0ZSBhIGxpc3Qgb2YgZmVhdHVyZXMgdGhhdCB3aWxsIGJlIGNvbmZpZ3VyZWQgYWZ0ZXIgYXBwbHlpbmcgdGhlCi0JICogc3BlY2lmaWVkIGRlbHRhCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgQXJyYXlMaXN0IGNvbXB1dGVGZWF0dXJlc0FmdGVyRGVsdGEoCi0JCUlTZXNzaW9uRGVsdGEgZGVsdGEsCi0JCUlGZWF0dXJlUmVmZXJlbmNlW10gZGVsdGFSZWZzKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJaWYgKGRlbHRhID09IG51bGwgfHwgZGVsdGFSZWZzID09IG51bGwpCi0JCQlkZWx0YVJlZnMgPSBuZXcgSUZlYXR1cmVSZWZlcmVuY2VbMF07Ci0JCWVsc2UgaWYgKGRlbHRhUmVmcyA9PSBudWxsKQotCQkJZGVsdGFSZWZzID0gZGVsdGEuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsKLQotCQlBcnJheUxpc3QgZmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7IC8vIGN1bXVsYXRpdmUgcmVzdWx0cyBsaXN0Ci0JCUlMb2NhbFNpdGUgbG9jYWxTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7Ci0JCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcgPSBsb2NhbFNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKTsKLQkJSUNvbmZpZ3VyZWRTaXRlW10gY3NpdGVzID0gY29uZmlnLmdldENvbmZpZ3VyZWRTaXRlcygpOwotCi0JCS8vIGNvbXB1dGUgY2hhbmdlcyBmb3IgZWFjaCBzaXRlCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY3NpdGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJQ29uZmlndXJlZFNpdGUgY3NpdGUgPSBjc2l0ZXNbaV07Ci0JCQlBcnJheUxpc3Qgc2l0ZUZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCQkvLyBjb2xsZWN0IGN1cnJlbnRseSBjb25maWd1cmVkIGZlYXR1cmVzIG9uIHNpdGUKLQkJCUlGZWF0dXJlUmVmZXJlbmNlW10gY3JlZnMgPSBjc2l0ZS5nZXRDb25maWd1cmVkRmVhdHVyZXMoKTsKLQkJCWZvciAoaW50IGogPSAwOyBjcmVmcyAhPSBudWxsICYmIGogPCBjcmVmcy5sZW5ndGg7IGorKykgewotCQkJCUlGZWF0dXJlUmVmZXJlbmNlIGNyZWYgPSBjcmVmc1tqXTsKLQkJCQlJRmVhdHVyZSBjZmVhdHVyZSA9IGNyZWYuZ2V0RmVhdHVyZShudWxsKTsKLQkJCQlzaXRlRmVhdHVyZXMuYWRkKGNmZWF0dXJlKTsKLQkJCX0KLQotCQkJLy8gYWRkIGRlbHRhcyBmb3IgdGhlIHNpdGUJCQkKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgZGVsdGFSZWZzLmxlbmd0aDsgaisrKSB7Ci0JCQkJSVNpdGUgZGVsdGFTaXRlID0gZGVsdGFSZWZzW2pdLmdldFNpdGUoKTsKLQkJCQlpZiAoZGVsdGFTaXRlLmVxdWFscyhjc2l0ZS5nZXRTaXRlKCkpKSB7Ci0JCQkJCUlGZWF0dXJlIGRmZWF0dXJlID0gZGVsdGFSZWZzW2pdLmdldEZlYXR1cmUobnVsbCk7Ci0JCQkJCWlmICghc2l0ZUZlYXR1cmVzLmNvbnRhaW5zKGRmZWF0dXJlKSkgLy8gZG9uJ3QgYWRkIGR1cHMKLQkJCQkJCXNpdGVGZWF0dXJlcy5hZGQoZGZlYXR1cmUpOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gcmVkdWNlIHRoZSBsaXN0IGlmIG5lZWRlZAkKLQkJCUlGZWF0dXJlW10gYXJyYXkgPQotCQkJCShJRmVhdHVyZVtdKSBzaXRlRmVhdHVyZXMudG9BcnJheSgKLQkJCQkJbmV3IElGZWF0dXJlW3NpdGVGZWF0dXJlcy5zaXplKCldKTsKLQkJCUFycmF5TGlzdCByZW1vdmVUcmVlID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBhcnJheS5sZW5ndGg7IGorKykgewotCQkJCVZlcnNpb25lZElkZW50aWZpZXIgaWQxID0gYXJyYXlbal0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOwotCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgYXJyYXkubGVuZ3RoOyBrKyspIHsKLQkJCQkJaWYgKGogPT0gaykKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQlWZXJzaW9uZWRJZGVudGlmaWVyIGlkMiA9IGFycmF5W2tdLmdldFZlcnNpb25lZElkZW50aWZpZXIoKTsKLQkJCQkJaWYgKGlkMS5nZXRJZGVudGlmaWVyKCkuZXF1YWxzKGlkMi5nZXRJZGVudGlmaWVyKCkpKSB7Ci0JCQkJCQlpZiAoaWQyLmdldFZlcnNpb24oKS5pc0dyZWF0ZXJUaGFuKGlkMS5nZXRWZXJzaW9uKCkpKSB7Ci0JCQkJCQkJcmVtb3ZlVHJlZS5hZGQoYXJyYXlbal0pOwotCQkJCQkJCXNpdGVGZWF0dXJlcy5yZW1vdmUoYXJyYXlbal0pOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJLy8gQ29tcHV0ZSBwYXRjaGVzIHRoYXQgd2lsbCBuZWVkIHRvIGJlIHJlbW92ZWQgdG9nZXRoZXIgd2l0aCAKLQkJCS8vIHRoZSByZW1vdmVkIGZlYXR1cmVzCi0JCQlBcnJheUxpc3QgcGF0Y2hlc1RyZWUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljb250cmlidXRlUGF0Y2hlc0ZvcihyZW1vdmVUcmVlLCBzaXRlRmVhdHVyZXMsIHBhdGNoZXNUcmVlKTsKLQkJCXNpdGVGZWF0dXJlcy5yZW1vdmVBbGwocGF0Y2hlc1RyZWUpOwotCi0JCQkvLyBhY2N1bXVsYXRlIHNpdGUgcmVzdWx0cwotCQkJZmVhdHVyZXMuYWRkQWxsKHNpdGVGZWF0dXJlcyk7Ci0JCX0KLQotCQlyZXR1cm4gZmVhdHVyZXM7Ci0JfQotCi0JLyoKLQkgKiBDb21wdXRlIGEgbGlzdCBvZiBwbHVnaW4gZW50cmllcyBmb3IgdGhlIHNwZWNpZmllZCBmZWF0dXJlcy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBBcnJheUxpc3QgY29tcHV0ZVBsdWdpbnNGb3JGZWF0dXJlcyhBcnJheUxpc3QgZmVhdHVyZXMpCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGZlYXR1cmVzID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IEFycmF5TGlzdCgpOwotCi0JCUhhc2hNYXAgcGx1Z2lucyA9IG5ldyBIYXNoTWFwKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXMuc2l6ZSgpOyBpKyspIHsKLQkJCUlGZWF0dXJlIGZlYXR1cmUgPSAoSUZlYXR1cmUpIGZlYXR1cmVzLmdldChpKTsKLQkJCUlQbHVnaW5FbnRyeVtdIGVudHJpZXMgPSBmZWF0dXJlLmdldFBsdWdpbkVudHJpZXMoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgZW50cmllcy5sZW5ndGg7IGorKykgewotCQkJCUlQbHVnaW5FbnRyeSBlbnRyeSA9IGVudHJpZXNbal07Ci0JCQkJcGx1Z2lucy5wdXQoZW50cnkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLCBlbnRyeSk7Ci0JCQl9Ci0JCX0KLQkJQXJyYXlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmVzdWx0LmFkZEFsbChwbHVnaW5zLnZhbHVlcygpKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzUGF0Y2goSUZlYXR1cmUgZmVhdHVyZSkgewotCQlJSW1wb3J0W10gaW1wb3J0cyA9IGZlYXR1cmUuZ2V0SW1wb3J0cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGltcG9ydHMubGVuZ3RoOyBpKyspIHsKLQkJCUlJbXBvcnQgaWltcG9ydCA9IGltcG9ydHNbaV07Ci0JCQlpZiAoaWltcG9ydC5pc1BhdGNoKCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrVW5pcXVlKAotCQlJRmVhdHVyZSBmZWF0dXJlLAotCQlBcnJheUxpc3QgZmVhdHVyZXMsCi0JCUFycmF5TGlzdCBzdGF0dXMpCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGZlYXR1cmVzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VbXSBpcmVmcyA9Ci0JCQlmZWF0dXJlLmdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpcmVmcy5sZW5ndGg7IGkrKykgewotCQkJSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZSBpcmVmID0gaXJlZnNbaV07Ci0JCQlJRmVhdHVyZSBpZmVhdHVyZSA9IGlyZWYuZ2V0RmVhdHVyZShudWxsKTsKLQkJCWJvb2xlYW4gcGF0Y2ggPSBpc1BhdGNoKGlmZWF0dXJlKTsKLQkJCVZlcnNpb25lZElkZW50aWZpZXIgdmlkID0gaWZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOwotCQkJU3RyaW5nIGlkID0gdmlkLmdldElkZW50aWZpZXIoKTsKLQkJCVBsdWdpblZlcnNpb25JZGVudGlmaWVyIHZlcnNpb24gPSB2aWQuZ2V0VmVyc2lvbigpOwotCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBmZWF0dXJlcy5zaXplKCk7IGorKykgewotCQkJCUlGZWF0dXJlIGNhbmRpZGF0ZSA9IChJRmVhdHVyZSkgZmVhdHVyZXMuZ2V0KGopOwotCQkJCVZlcnNpb25lZElkZW50aWZpZXIgY3ZpZCA9IGNhbmRpZGF0ZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7Ci0JCQkJU3RyaW5nIGNpZCA9IGN2aWQuZ2V0SWRlbnRpZmllcigpOwotCQkJCVBsdWdpblZlcnNpb25JZGVudGlmaWVyIGN2ZXJzaW9uID0gY3ZpZC5nZXRWZXJzaW9uKCk7Ci0JCQkJaWYgKGNpZC5lcXVhbHMoaWQpKSB7Ci0JCQkJCS8vIFRoZSBzYW1lIGlkZW50aWZpZXIgLSB0aGlzIG9uZSB3aWxsCi0JCQkJCS8vIGJlIHVuY29uZmlndXJlZC4gQ2hlY2sgaWYgaXQgaXMgbG93ZXIsCi0JCQkJCS8vIG90aGVyd2lzZSBmbGFnLgotCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCS8vIElnbm9yZSBlcXVhbCAtIHdpbGwgYmUgZmlsdGVyZWQgaW4gdGhlIGRvd25sb2FkCi0JCQkJCWlmICh2ZXJzaW9uLmVxdWFscyhjdmVyc2lvbikpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJLy8gRmxhZyBvbmx5IHRoZSBjYXNlIHdoZW4gdGhlIGluc3RhbGxlZCBvbmUgaXMKLQkJCQkJLy8gbmV3ZXIgdGhhbiB0aGUgb25lIHRoYXQgd2lsbCBiZSBpbnN0YWxsZWQuCi0JCQkJCWlmICghdmVyc2lvbi5pc0dyZWF0ZXJUaGFuKGN2ZXJzaW9uKSkgewotCQkJCQkJLy8gRG9uJ3QgYWxsb3cgdGhpcy4KLQkJCQkJCVN0cmluZyBtc2cgPQotCQkJCQkJCVVwZGF0ZVVJLmdldEZvcm1hdHRlZE1lc3NhZ2UoCi0JCQkJCQkJCUtFWV9QQVRDSF9SRUdSRVNTSU9OLAotCQkJCQkJCQluZXcgU3RyaW5nW10gewotCQkJCQkJCQkJaWZlYXR1cmUuZ2V0TGFiZWwoKSwKLQkJCQkJCQkJCXZlcnNpb24udG9TdHJpbmcoKX0pOwotCQkJCQkJc3RhdHVzLmFkZChjcmVhdGVTdGF0dXMoZmVhdHVyZSwgbXNnKSk7Ci0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmICghZm91bmQpIHsKLQkJCQkvLyBBbGwgdGhlIGZlYXR1cmVzIGNhcnJpZWQgaW4gYSBwYXRjaCBtdXN0Ci0JCQkJLy8gYWxyZWFkeSBiZSBwcmVzZW50LCB1bmxlc3MgdGhpcyBmZWF0dXJlCi0JCQkJLy8gaXMgYSBwYXRjaCBpdHNlbGYKLQotCQkJCS8vIDMwODQ5OiBvcHRpb25hbCBmZWF0dXJlIGRvZXMgbm90Ci0JCQkJLy8gbmVlZCB0byBiZSBwcmVzZW50LgotCQkJCWlmICghcGF0Y2ggJiYgaXJlZi5pc09wdGlvbmFsKCkgPT0gZmFsc2UpIHsKLQkJCQkJU3RyaW5nIG1zZyA9Ci0JCQkJCQlVcGRhdGVVSS5nZXRGb3JtYXR0ZWRNZXNzYWdlKAotCQkJCQkJCUtFWV9QQVRDSF9NSVNTSU5HX1RBUkdFVCwKLQkJCQkJCQluZXcgU3RyaW5nW10gewotCQkJCQkJCQlpZmVhdHVyZS5nZXRMYWJlbCgpLAotCQkJCQkJCQl2ZXJzaW9uLnRvU3RyaW5nKCl9KTsKLQkJCQkJc3RhdHVzLmFkZChjcmVhdGVTdGF0dXMoZmVhdHVyZSwgbXNnKSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHBhdGNoKQotCQkJCWNoZWNrVW5pcXVlKGlmZWF0dXJlLCBmZWF0dXJlcywgc3RhdHVzKTsKLQkJfQotCX0KLQotCS8qCi0JICogdmFsaWRhdGUgY29uc3RyYWludHMKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrQ29uc3RyYWludHMoQXJyYXlMaXN0IGZlYXR1cmVzLCBBcnJheUxpc3Qgc3RhdHVzKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChmZWF0dXJlcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUFycmF5TGlzdCBwbHVnaW5zID0gY29tcHV0ZVBsdWdpbnNGb3JGZWF0dXJlcyhmZWF0dXJlcyk7Ci0KLQkJY2hlY2tFbnZpcm9ubWVudChmZWF0dXJlcywgc3RhdHVzKTsKLQkJY2hlY2tQbGF0Zm9ybUZlYXR1cmUoZmVhdHVyZXMsIHBsdWdpbnMsIHN0YXR1cyk7Ci0JCWNoZWNrUHJpbWFyeUZlYXR1cmUoZmVhdHVyZXMsIHN0YXR1cyk7Ci0JCWNoZWNrUHJlcmVxcyhmZWF0dXJlcywgcGx1Z2lucywgc3RhdHVzKTsKLQl9Ci0KLQkvKgotCSAqIFZlcmlmeSBhbGwgZmVhdHVyZXMgYXJlIGVpdGhlciBwb3J0YWJsZSwgb3IgbWF0Y2ggdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrRW52aXJvbm1lbnQoCi0JCUFycmF5TGlzdCBmZWF0dXJlcywKLQkJQXJyYXlMaXN0IHN0YXR1cykgewotCi0JCVN0cmluZyBvcyA9IEJvb3RMb2FkZXIuZ2V0T1MoKTsKLQkJU3RyaW5nIHdzID0gQm9vdExvYWRlci5nZXRXUygpOwotCQlTdHJpbmcgYXJjaCA9IEJvb3RMb2FkZXIuZ2V0T1NBcmNoKCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5zaXplKCk7IGkrKykgewotCQkJSUZlYXR1cmUgZmVhdHVyZSA9IChJRmVhdHVyZSkgZmVhdHVyZXMuZ2V0KGkpOwotCQkJQXJyYXlMaXN0IGZvcyA9IGNyZWF0ZUxpc3QoZmVhdHVyZS5nZXRPUygpKTsKLQkJCUFycmF5TGlzdCBmd3MgPSBjcmVhdGVMaXN0KGZlYXR1cmUuZ2V0V1MoKSk7Ci0JCQlBcnJheUxpc3QgZmFyY2ggPSBjcmVhdGVMaXN0KGZlYXR1cmUuZ2V0T1NBcmNoKCkpOwotCi0JCQlpZiAoZm9zLnNpemUoKSA+IDApIHsKLQkJCQlpZiAoIWZvcy5jb250YWlucyhvcykpIHsKLQkJCQkJc3RhdHVzLmFkZCgKLQkJCQkJCWNyZWF0ZVN0YXR1cyhmZWF0dXJlLCBVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX09TKSkpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChmd3Muc2l6ZSgpID4gMCkgewotCQkJCWlmICghZndzLmNvbnRhaW5zKHdzKSkgewotCQkJCQlzdGF0dXMuYWRkKAotCQkJCQkJY3JlYXRlU3RhdHVzKGZlYXR1cmUsIFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfV1MpKSk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKGZhcmNoLnNpemUoKSA+IDApIHsKLQkJCQlpZiAoIWZhcmNoLmNvbnRhaW5zKGFyY2gpKSB7Ci0JCQkJCXN0YXR1cy5hZGQoCi0JCQkJCQljcmVhdGVTdGF0dXMoZmVhdHVyZSwgVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9BUkNIKSkpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFZlcmlmeSB3ZSBlbmQgdXAgd2l0aCBhIHZlcnNpb24gb2YgcGxhdGZvcm0gY29uZmlndXJlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tQbGF0Zm9ybUZlYXR1cmUoCi0JCUFycmF5TGlzdCBmZWF0dXJlcywKLQkJQXJyYXlMaXN0IHBsdWdpbnMsCi0JCUFycmF5TGlzdCBzdGF0dXMpIHsKLQotCQlTdHJpbmdbXSBib290c3RyYXBQbHVnaW5zID0KLQkJCUJvb3RMb2FkZXIKLQkJCQkuZ2V0Q3VycmVudFBsYXRmb3JtQ29uZmlndXJhdGlvbigpCi0JCQkJLmdldEJvb3RzdHJhcFBsdWdpbklkZW50aWZpZXJzKCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBib290c3RyYXBQbHVnaW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IHBsdWdpbnMuc2l6ZSgpOyBqKyspIHsKLQkJCQlJUGx1Z2luRW50cnkgcGx1Z2luID0gKElQbHVnaW5FbnRyeSkgcGx1Z2lucy5nZXQoaik7Ci0JCQkJaWYgKGJvb3RzdHJhcFBsdWdpbnNbaV0KLQkJCQkJLmVxdWFscyhwbHVnaW4uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldElkZW50aWZpZXIoKSkpIHsKLQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIWZvdW5kKSB7Ci0JCQkJc3RhdHVzLmFkZCgKLQkJCQkJY3JlYXRlU3RhdHVzKG51bGwsIFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfUExBVEZPUk0pKSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBWZXJpZnkgd2UgZW5kIHVwIHdpdGggYSB2ZXJzaW9uIG9mIHByaW1hcnkgZmVhdHVyZSBjb25maWd1cmVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja1ByaW1hcnlGZWF0dXJlKAotCQlBcnJheUxpc3QgZmVhdHVyZXMsCi0JCUFycmF5TGlzdCBzdGF0dXMpIHsKLQotCQlTdHJpbmcgZmVhdHVyZUlkID0KLQkJCUJvb3RMb2FkZXIKLQkJCQkuZ2V0Q3VycmVudFBsYXRmb3JtQ29uZmlndXJhdGlvbigpCi0JCQkJLmdldFByaW1hcnlGZWF0dXJlSWRlbnRpZmllcigpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXMuc2l6ZSgpOyBpKyspIHsKLQkJCUlGZWF0dXJlIGZlYXR1cmUgPSAoSUZlYXR1cmUpIGZlYXR1cmVzLmdldChpKTsKLQkJCWlmIChmZWF0dXJlSWQKLQkJCQkuZXF1YWxzKGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldElkZW50aWZpZXIoKSkpCi0JCQkJcmV0dXJuOwotCQl9Ci0KLQkJc3RhdHVzLmFkZChjcmVhdGVTdGF0dXMobnVsbCwgVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9QUklNQVJZKSkpOwotCX0KLQotCS8qCi0JICogVmVyaWZ5IHdlIGRvIG5vdCBicmVhayBwcmVyZXFzCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja1ByZXJlcXMoCi0JCUFycmF5TGlzdCBmZWF0dXJlcywKLQkJQXJyYXlMaXN0IHBsdWdpbnMsCi0JCUFycmF5TGlzdCBzdGF0dXMpIHsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLnNpemUoKTsgaSsrKSB7Ci0JCQlJRmVhdHVyZSBmZWF0dXJlID0gKElGZWF0dXJlKSBmZWF0dXJlcy5nZXQoaSk7Ci0JCQlJSW1wb3J0W10gaW1wb3J0cyA9IGZlYXR1cmUuZ2V0SW1wb3J0cygpOwotCi0JCQlmb3IgKGludCBqID0gMDsgaiA8IGltcG9ydHMubGVuZ3RoOyBqKyspIHsKLQkJCQlJSW1wb3J0IGlpbXBvcnQgPSBpbXBvcnRzW2pdOwotCQkJCS8vIGZvciBlYWNoIGltcG9ydCBkZXRlcm1pbmUgcGx1Z2luIG9yIGZlYXR1cmUsIHZlcnNpb24sIG1hdGNoIHdlIG5lZWQKLQkJCQlWZXJzaW9uZWRJZGVudGlmaWVyIGlpZCA9IGlpbXBvcnQuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOwotCQkJCVN0cmluZyBpZCA9IGlpZC5nZXRJZGVudGlmaWVyKCk7Ci0JCQkJUGx1Z2luVmVyc2lvbklkZW50aWZpZXIgdmVyc2lvbiA9IGlpZC5nZXRWZXJzaW9uKCk7Ci0JCQkJYm9vbGVhbiBmZWF0dXJlUHJlcmVxID0KLQkJCQkJaWltcG9ydC5nZXRLaW5kKCkgPT0gSUltcG9ydC5LSU5EX0ZFQVRVUkU7Ci0JCQkJYm9vbGVhbiBpZ25vcmVWZXJzaW9uID0KLQkJCQkJdmVyc2lvbi5nZXRNYWpvckNvbXBvbmVudCgpID09IDAKLQkJCQkJCSYmIHZlcnNpb24uZ2V0TWlub3JDb21wb25lbnQoKSA9PSAwCi0JCQkJCQkmJiB2ZXJzaW9uLmdldFNlcnZpY2VDb21wb25lbnQoKSA9PSAwOwotCQkJCWludCBydWxlID0gaWltcG9ydC5nZXRSdWxlKCk7Ci0JCQkJaWYgKHJ1bGUgPT0gSUltcG9ydC5SVUxFX05PTkUpCi0JCQkJCXJ1bGUgPSBJSW1wb3J0LlJVTEVfQ09NUEFUSUJMRTsKLQotCQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQotCQkJCUFycmF5TGlzdCBjYW5kaWRhdGVzOwotCi0JCQkJaWYgKGZlYXR1cmVQcmVyZXEpCi0JCQkJCWNhbmRpZGF0ZXMgPSBmZWF0dXJlczsKLQkJCQllbHNlCi0JCQkJCWNhbmRpZGF0ZXMgPSBwbHVnaW5zOwotCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgY2FuZGlkYXRlcy5zaXplKCk7IGsrKykgewotCQkJCQlWZXJzaW9uZWRJZGVudGlmaWVyIGNpZDsKLQkJCQkJaWYgKGZlYXR1cmVQcmVyZXEpIHsKLQkJCQkJCS8vIHRoZSBjYW5kaWRhdGUgaXMgYSBmZWF0dXJlCi0JCQkJCQlJRmVhdHVyZSBjYW5kaWRhdGUgPSAoSUZlYXR1cmUpIGNhbmRpZGF0ZXMuZ2V0KGspOwotCQkJCQkJLy8gc2tpcCBzZWxmCi0JCQkJCQlpZiAoZmVhdHVyZS5lcXVhbHMoY2FuZGlkYXRlKSkKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCWNpZCA9IGNhbmRpZGF0ZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyB0aGUgY2FuZGlkYXRlIGlzIGEgcGx1Zy1pbgotCQkJCQkJSVBsdWdpbkVudHJ5IHBsdWdpbiA9IChJUGx1Z2luRW50cnkpIGNhbmRpZGF0ZXMuZ2V0KGspOwotCQkJCQkJY2lkID0gcGx1Z2luLmdldFZlcnNpb25lZElkZW50aWZpZXIoKTsKLQkJCQkJfQotCQkJCQlQbHVnaW5WZXJzaW9uSWRlbnRpZmllciBjdmVyc2lvbiA9IGNpZC5nZXRWZXJzaW9uKCk7Ci0JCQkJCWlmIChpZC5lcXVhbHMoY2lkLmdldElkZW50aWZpZXIoKSkpIHsKLQkJCQkJCS8vIGhhdmUgYSBjYW5kaWRhdGUKLQkJCQkJCWlmIChpZ25vcmVWZXJzaW9uKQotCQkJCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJCWVsc2UgaWYgKAotCQkJCQkJCXJ1bGUgPT0gSUltcG9ydC5SVUxFX1BFUkZFQ1QKLQkJCQkJCQkJJiYgY3ZlcnNpb24uaXNQZXJmZWN0KHZlcnNpb24pKQotCQkJCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJCWVsc2UgaWYgKAotCQkJCQkJCXJ1bGUgPT0gSUltcG9ydC5SVUxFX0VRVUlWQUxFTlQKLQkJCQkJCQkJJiYgY3ZlcnNpb24uaXNFcXVpdmFsZW50VG8odmVyc2lvbikpCi0JCQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQkJZWxzZSBpZiAoCi0JCQkJCQkJcnVsZSA9PSBJSW1wb3J0LlJVTEVfQ09NUEFUSUJMRQotCQkJCQkJCQkmJiBjdmVyc2lvbi5pc0NvbXBhdGlibGVXaXRoKHZlcnNpb24pKQotCQkJCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJCWVsc2UgaWYgKAotCQkJCQkJCXJ1bGUgPT0gSUltcG9ydC5SVUxFX0dSRUFURVJfT1JfRVFVQUwKLQkJCQkJCQkJJiYgY3ZlcnNpb24uaXNHcmVhdGVyT3JFcXVhbFRvKHZlcnNpb24pKQotCQkJCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJfQotCQkJCQlpZiAoZm91bmQpCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCQlpZiAoIWZvdW5kKSB7Ci0JCQkJCS8vIHJlcG9ydCBzdGF0dXMKLQkJCQkJU3RyaW5nIHRhcmdldCA9Ci0JCQkJCQlmZWF0dXJlUHJlcmVxCi0JCQkJCQkJPyBVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX1BSRVJFUV9GRUFUVVJFKQotCQkJCQkJCTogVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9QUkVSRVFfUExVR0lOKTsKLQkJCQkJU3RyaW5nIG1zZyA9Ci0JCQkJCQlVcGRhdGVVSS5nZXRGb3JtYXR0ZWRNZXNzYWdlKAotCQkJCQkJCUtFWV9QUkVSRVEsCi0JCQkJCQkJbmV3IFN0cmluZ1tdIHsgdGFyZ2V0LCBpZCB9KTsKLQotCQkJCQlpZiAoIWlnbm9yZVZlcnNpb24pIHsKLQkJCQkJCWlmIChydWxlID09IElJbXBvcnQuUlVMRV9QRVJGRUNUKQotCQkJCQkJCW1zZyA9Ci0JCQkJCQkJCVVwZGF0ZVVJLmdldEZvcm1hdHRlZE1lc3NhZ2UoCi0JCQkJCQkJCQlLRVlfUFJFUkVRX1BFUkZFQ1QsCi0JCQkJCQkJCQluZXcgU3RyaW5nW10gewotCQkJCQkJCQkJCXRhcmdldCwKLQkJCQkJCQkJCQlpZCwKLQkJCQkJCQkJCQl2ZXJzaW9uLnRvU3RyaW5nKCl9KTsKLQkJCQkJCWVsc2UgaWYgKHJ1bGUgPT0gSUltcG9ydC5SVUxFX0VRVUlWQUxFTlQpCi0JCQkJCQkJbXNnID0KLQkJCQkJCQkJVXBkYXRlVUkuZ2V0Rm9ybWF0dGVkTWVzc2FnZSgKLQkJCQkJCQkJCUtFWV9QUkVSRVFfRVFVSVZBTEVOVCwKLQkJCQkJCQkJCW5ldyBTdHJpbmdbXSB7Ci0JCQkJCQkJCQkJdGFyZ2V0LAotCQkJCQkJCQkJCWlkLAotCQkJCQkJCQkJCXZlcnNpb24udG9TdHJpbmcoKX0pOwotCQkJCQkJZWxzZSBpZiAocnVsZSA9PSBJSW1wb3J0LlJVTEVfQ09NUEFUSUJMRSkKLQkJCQkJCQltc2cgPQotCQkJCQkJCQlVcGRhdGVVSS5nZXRGb3JtYXR0ZWRNZXNzYWdlKAotCQkJCQkJCQkJS0VZX1BSRVJFUV9DT01QQVRJQkxFLAotCQkJCQkJCQkJbmV3IFN0cmluZ1tdIHsKLQkJCQkJCQkJCQl0YXJnZXQsCi0JCQkJCQkJCQkJaWQsCi0JCQkJCQkJCQkJdmVyc2lvbi50b1N0cmluZygpfSk7Ci0JCQkJCQllbHNlIGlmIChydWxlID09IElJbXBvcnQuUlVMRV9HUkVBVEVSX09SX0VRVUFMKQotCQkJCQkJCW1zZyA9Ci0JCQkJCQkJCVVwZGF0ZVVJLmdldEZvcm1hdHRlZE1lc3NhZ2UoCi0JCQkJCQkJCQlLRVlfUFJFUkVRX0dSRUFURVIsCi0JCQkJCQkJCQluZXcgU3RyaW5nW10gewotCQkJCQkJCQkJCXRhcmdldCwKLQkJCQkJCQkJCQlpZCwKLQkJCQkJCQkJCQl2ZXJzaW9uLnRvU3RyaW5nKCl9KTsKLQkJCQkJfQotCQkJCQlzdGF0dXMuYWRkKGNyZWF0ZVN0YXR1cyhmZWF0dXJlLCBtc2cpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFZlcmlmeSB3ZSBlbmQgdXAgd2l0aCB2YWxpZCBuZXN0ZWQgZmVhdHVyZXMgYWZ0ZXIgcmV2ZXJ0Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja1JldmVydENvbnN0cmFpbnRzKAotCQlBcnJheUxpc3QgZmVhdHVyZXMsCi0JCUFycmF5TGlzdCBzdGF0dXMpIHsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLnNpemUoKTsgaSsrKSB7Ci0JCQlJRmVhdHVyZSBmZWF0dXJlID0gKElGZWF0dXJlKSBmZWF0dXJlcy5nZXQoaSk7Ci0JCQl0cnkgewotCQkJCWNvbXB1dGVGZWF0dXJlU3VidHJlZSgKLQkJCQkJZmVhdHVyZSwKLQkJCQkJbnVsbCwKLQkJCQkJbnVsbCwKLQkJCQkJZmFsc2UgLyogZG8gbm90IHRvbGVyYXRlIG1pc3NpbmcgY2hpbGRyZW4gKi8KLQkJCQkpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJc3RhdHVzLmFkZChlLmdldFN0YXR1cygpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogVmVyaWZ5IHRoYXQgYSBwYXJlbnQgb2YgYW4gb3B0aW9uYWwgY2hpbGQgaXMgY29uZmlndXJlZAotCSAqIGJlZm9yZSB3ZSBhbGxvdyB0aGUgY2hpbGQgdG8gYmUgY29uZmlndXJlZCBhcyB3ZWxsCi0JICovCi0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrT3B0aW9uYWxDaGlsZENvbmZpZ3VyaW5nKAotCQlJRmVhdHVyZSBmZWF0dXJlLAotCQlBcnJheUxpc3Qgc3RhdHVzKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlMb2NhbFNpdGUgbG9jYWxTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7Ci0JCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcgPSBsb2NhbFNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKTsKLQkJSUNvbmZpZ3VyZWRTaXRlW10gY3NpdGVzID0gY29uZmlnLmdldENvbmZpZ3VyZWRTaXRlcygpOwotCi0JCWJvb2xlYW4gaW5jbHVkZWQgPSBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjc2l0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlDb25maWd1cmVkU2l0ZSBjc2l0ZSA9IGNzaXRlc1tpXTsKLQkJCUlTaXRlRmVhdHVyZVJlZmVyZW5jZVtdIGNyZWZzID0KLQkJCQljc2l0ZS5nZXRTaXRlKCkuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgY3JlZnMubGVuZ3RoOyBqKyspIHsKLQkJCQlJRmVhdHVyZVJlZmVyZW5jZSBjcmVmID0gY3JlZnNbal07Ci0JCQkJSUZlYXR1cmUgY2ZlYXR1cmUgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCWNmZWF0dXJlID0gY3JlZi5nZXRGZWF0dXJlKG51bGwpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkvL0ZJWE1FOiBjYW5ub3QgYXNrICdpc09wdGlvbmFsJyBoZXJlCi0JCQkJCS8vIElnbm9yZSBtaXNzaW5nIG9wdGlvbmFsIGZlYXR1cmUuCi0JCQkJCS8qIGlmIChjcmVmLmlzT3B0aW9uYWwoKSkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQllbHNlICovCi0JCQkJCXRocm93IGU7Ci0JCQkJfQotCQkJCWlmIChpc1BhcmVudChjZmVhdHVyZSwgZmVhdHVyZSwgdHJ1ZSkpIHsKLQkJCQkJLy8gSW5jbHVkZWQgaW4gYXQgbGVhc3Qgb25lIGZlYXR1cmUgYXMgb3B0aW9uYWwKLQkJCQkJaW5jbHVkZWQgPSB0cnVlOwotCQkJCQlpZiAoY3NpdGUuaXNDb25maWd1cmVkKGNmZWF0dXJlKSkgewotCQkJCQkJLy8gQXQgbGVhc3Qgb25lIGZlYXR1cmUgcGFyZW50Ci0JCQkJCQkvLyBpcyBlbmFibGVkIC0gaXQgaXMgT0sgdG8KLQkJCQkJCS8vIGNvbmZpZ3VyZSBvcHRpb25hbCBjaGlsZC4KLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoaW5jbHVkZWQpIHsKLQkJCS8vIGZlYXR1cmUgaXMgaW5jbHVkZWQgYXMgb3B0aW9uYWwgYnV0Ci0JCQkvLyBubyBwYXJlbnQgaXMgY3VycmVudGx5IGNvbmZpZ3VyZWQuCi0JCQlTdHJpbmcgbXNnID0gVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9PUFRJT05BTF9DSElMRCk7Ci0JCQlzdGF0dXMuYWRkKGNyZWF0ZVN0YXR1cyhmZWF0dXJlLCBtc2cpKTsKLQkJfSBlbHNlIHsKLQkJCS8vZmVhdHVyZSBpcyByb290IC0gY2FuIGJlIGNvbmZpZ3VyZWQKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNQYXJlbnQoCi0JCUlGZWF0dXJlIGNhbmRpZGF0ZSwKLQkJSUZlYXR1cmUgZmVhdHVyZSwKLQkJYm9vbGVhbiBvcHRpb25hbE9ubHkpCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZVtdIHJlZnMgPQotCQkJY2FuZGlkYXRlLmdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlIGNoaWxkID0gcmVmc1tpXTsKLQkJCVZlcnNpb25lZElkZW50aWZpZXIgZnZpZCA9IGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOwotCQkJVmVyc2lvbmVkSWRlbnRpZmllciBjdmlkID0gY2hpbGQuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOwotCi0JCQlpZiAoZnZpZC5nZXRJZGVudGlmaWVyKCkuZXF1YWxzKGN2aWQuZ2V0SWRlbnRpZmllcigpKSA9PSBmYWxzZSkKLQkJCQljb250aW51ZTsKLQkJCS8vIHNhbWUgSUQKLQkJCVBsdWdpblZlcnNpb25JZGVudGlmaWVyIGZ2ZXJzaW9uID0gZnZpZC5nZXRWZXJzaW9uKCk7Ci0JCQlQbHVnaW5WZXJzaW9uSWRlbnRpZmllciBjdmVyc2lvbiA9IGN2aWQuZ2V0VmVyc2lvbigpOwotCi0JCQlpbnQgbWF0Y2ggPSBjaGlsZC5nZXRNYXRjaCgpOwotCQkJYm9vbGVhbiBtYXRjaGVkID0gZmFsc2U7Ci0KLQkJCXN3aXRjaCAobWF0Y2gpIHsKLQkJCQljYXNlIElVcGRhdGVDb25zdGFudHMuUlVMRV9FUVVJVkFMRU5UIDoKLQkJCQkJaWYgKGZ2ZXJzaW9uLmlzRXF1aXZhbGVudFRvKGN2ZXJzaW9uKSkKLQkJCQkJCW1hdGNoZWQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElVcGRhdGVDb25zdGFudHMuUlVMRV9DT01QQVRJQkxFIDoKLQkJCQkJaWYgKGZ2ZXJzaW9uLmlzQ29tcGF0aWJsZVdpdGgoY3ZlcnNpb24pKQotCQkJCQkJbWF0Y2hlZCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSVVwZGF0ZUNvbnN0YW50cy5SVUxFX0dSRUFURVJfT1JfRVFVQUwgOgotCQkJCQlpZiAoZnZlcnNpb24uaXNHcmVhdGVyT3JFcXVhbFRvKGN2ZXJzaW9uKSkKLQkJCQkJCW1hdGNoZWQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJaWYgKGZ2ZXJzaW9uLmVxdWFscyhjdmVyc2lvbikpCi0JCQkJCQltYXRjaGVkID0gdHJ1ZTsKLQotCQkJfQotCQkJaWYgKG1hdGNoZWQpIHsKLQkJCQkvLyBpbmNsdWRlZCBhbmQgbWF0Y2hlZDsgcmV0dXJuIHRydWUgaWYgb3B0aW9uYWxpdHkgaXMgbm90IAotCQkJCS8vIGltcG9ydGFudCBvciBpdCBpcyBhbmQgdGhlIGluY2x1c2lvbiBpcyBvcHRpb25hbAotCQkJCXJldHVybiBvcHRpb25hbE9ubHkgPT0gZmFsc2UgfHwgY2hpbGQuaXNPcHRpb25hbCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGNoZWNrVGltZWxpbmUoCi0JCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcsCi0JCUFycmF5TGlzdCBzdGF0dXMpIHsKLQkJdHJ5IHsKLQkJCUlMb2NhbFNpdGUgbHNpdGUgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsKLQkJCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjY29uZmlnID0gbHNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKTsKLQkJCWlmIChjY29uZmlnLmdldFRpbWVsaW5lKCkgIT0gY29uZmlnLmdldFRpbWVsaW5lKCkpIHsKLQkJCQkvLyBOb3QgdGhlIHNhbWUgdGltZWxpbmUgLSBjYW5ub3QgcmV2ZXJ0Ci0JCQkJU3RyaW5nIG1zZyA9Ci0JCQkJCVVwZGF0ZVVJLmdldEZvcm1hdHRlZE1lc3NhZ2UoCi0JCQkJCQlLRVlfV1JPTkdfVElNRUxJTkUsCi0JCQkJCQljb25maWcuZ2V0TGFiZWwoKSk7Ci0JCQkJc3RhdHVzLmFkZChjcmVhdGVTdGF0dXMobnVsbCwgbXNnKSk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXN0YXR1cy5hZGQoZS5nZXRTdGF0dXMoKSk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSVN0YXR1cyBjcmVhdGVNdWx0aVN0YXR1cygKLQkJU3RyaW5nIHJvb3RLZXksCi0JCUFycmF5TGlzdCBjaGlsZHJlbikgewotCQlJU3RhdHVzW10gY2FycmF5ID0KLQkJCShJU3RhdHVzW10pIGNoaWxkcmVuLnRvQXJyYXkobmV3IElTdGF0dXNbY2hpbGRyZW4uc2l6ZSgpXSk7Ci0JCVN0cmluZyBtZXNzYWdlID0gVXBkYXRlVUkuZ2V0U3RyaW5nKHJvb3RLZXkpOwotCQlyZXR1cm4gbmV3IE11bHRpU3RhdHVzKAotCQkJVXBkYXRlVUkuZ2V0UGx1Z2luSWQoKSwKLQkJCUlTdGF0dXMuRVJST1IsCi0JCQljYXJyYXksCi0JCQltZXNzYWdlLAotCQkJbnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSVN0YXR1cyBjcmVhdGVTdGF0dXMoSUZlYXR1cmUgZmVhdHVyZSwgU3RyaW5nIG1lc3NhZ2UpIHsKLQotCQlTdHJpbmcgZnVsbE1lc3NhZ2U7Ci0JCWlmIChmZWF0dXJlID09IG51bGwpCi0JCQlmdWxsTWVzc2FnZSA9IG1lc3NhZ2U7Ci0JCWVsc2UgewotCQkJUGx1Z2luVmVyc2lvbklkZW50aWZpZXIgdmVyc2lvbiA9Ci0JCQkJZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0VmVyc2lvbigpOwotCQkJZnVsbE1lc3NhZ2UgPQotCQkJCVVwZGF0ZVVJLmdldEZvcm1hdHRlZE1lc3NhZ2UoCi0JCQkJCUtFWV9DSElMRF9NRVNTQUdFLAotCQkJCQluZXcgU3RyaW5nW10gewotCQkJCQkJZmVhdHVyZS5nZXRMYWJlbCgpLAotCQkJCQkJdmVyc2lvbi50b1N0cmluZygpLAotCQkJCQkJbWVzc2FnZSB9KTsKLQkJfQotCi0JCXJldHVybiBuZXcgU3RhdHVzKAotCQkJSVN0YXR1cy5FUlJPUiwKLQkJCVVwZGF0ZVVJLmdldFBsdWdpbklkKCksCi0JCQlJU3RhdHVzLk9LLAotCQkJZnVsbE1lc3NhZ2UsCi0JCQludWxsKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBBcnJheUxpc3QgY3JlYXRlTGlzdChTdHJpbmcgY29tbWFTZXBhcmF0ZWRMaXN0KSB7Ci0JCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoY29tbWFTZXBhcmF0ZWRMaXN0ICE9IG51bGwpIHsKLQkJCVN0cmluZ1Rva2VuaXplciB0ID0KLQkJCQluZXcgU3RyaW5nVG9rZW5pemVyKGNvbW1hU2VwYXJhdGVkTGlzdC50cmltKCksICIsIik7Ci0JCQl3aGlsZSAodC5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQlTdHJpbmcgdG9rZW4gPSB0Lm5leHRUb2tlbigpLnRyaW0oKTsKLQkJCQlpZiAoIXRva2VuLmVxdWFscygiIikpCi0JCQkJCWxpc3QuYWRkKHRva2VuKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL2Zvcm1zL0FjdGl2aXR5U2VjdGlvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL2Zvcm1zL0FjdGl2aXR5U2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjI3NDlmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9mb3Jtcy9BY3Rpdml0eVNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5mb3JtczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkucGFnZXMuVXBkYXRlRm9ybVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsLkZvcm1XaWRnZXRGYWN0b3J5OwotCi0KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVNlY3Rpb24gZXh0ZW5kcyBVcGRhdGVTZWN0aW9uIHsKLS8vIE5MIHJlc291cmNlIGtleXMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1RJVExFID0gIkluc3RhbGxDb25maWd1cmF0aW9uUGFnZS5BY3Rpdml0eVNlY3Rpb24udGl0bGUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfREVTQyA9ICJJbnN0YWxsQ29uZmlndXJhdGlvblBhZ2UuQWN0aXZpdHlTZWN0aW9uLmRlc2MiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfREFURSA9ICJJbnN0YWxsQ29uZmlndXJhdGlvblBhZ2UuQWN0aXZpdHlTZWN0aW9uLmhlYWRlcnMuZGF0ZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9UQVJHRVQgPSAiSW5zdGFsbENvbmZpZ3VyYXRpb25QYWdlLkFjdGl2aXR5U2VjdGlvbi5oZWFkZXJzLnRhcmdldCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9BQ1RJT04gPSAiSW5zdGFsbENvbmZpZ3VyYXRpb25QYWdlLkFjdGl2aXR5U2VjdGlvbi5oZWFkZXJzLmFjdGlvbiI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9TVEFUVVMgPSAiSW5zdGFsbENvbmZpZ3VyYXRpb25QYWdlLkFjdGl2aXR5U2VjdGlvbi5oZWFkZXJzLnN0YXR1cyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DT05GSUdVUkUgPSAiSW5zdGFsbENvbmZpZ3VyYXRpb25QYWdlLkFjdGl2aXR5U2VjdGlvbi5hY3Rpb24uY29uZmlndXJlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0ZFQVRVUkVfSU5TVEFMTCA9ICJJbnN0YWxsQ29uZmlndXJhdGlvblBhZ2UuQWN0aXZpdHlTZWN0aW9uLmFjdGlvbi5mZWF0dXJlSW5zdGFsbCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9GRUFUVVJFX1JFTU9WRSA9ICJJbnN0YWxsQ29uZmlndXJhdGlvblBhZ2UuQWN0aXZpdHlTZWN0aW9uLmFjdGlvbi5mZWF0dXJlUmVtb3ZlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NJVEVfSU5TVEFMTCA9ICJJbnN0YWxsQ29uZmlndXJhdGlvblBhZ2UuQWN0aXZpdHlTZWN0aW9uLmFjdGlvbi5zaXRlSW5zdGFsbCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9TSVRFX1JFTU9WRSA9ICJJbnN0YWxsQ29uZmlndXJhdGlvblBhZ2UuQWN0aXZpdHlTZWN0aW9uLmFjdGlvbi5zaXRlUmVtb3ZlIjsJCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9VTkNPTkZJR1VSRSA9ICJJbnN0YWxsQ29uZmlndXJhdGlvblBhZ2UuQWN0aXZpdHlTZWN0aW9uLmFjdGlvbi51bmNvbmZpZ3VyZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9VTktOT1dOID0gIkluc3RhbGxDb25maWd1cmF0aW9uUGFnZS5BY3Rpdml0eVNlY3Rpb24uYWN0aW9uLnVua25vd24iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUkVWRVJUID0gIkluc3RhbGxDb25maWd1cmF0aW9uUGFnZS5BY3Rpdml0eVNlY3Rpb24uYWN0aW9uLnJldmVydCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9SRUNPTkNJTElBVElPTiA9ICJJbnN0YWxsQ29uZmlndXJhdGlvblBhZ2UuQWN0aXZpdHlTZWN0aW9uLmFjdGlvbi5yZWNvbmNpbGUiOwkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0FERF9QUkVTRVJWRUQgPSAiSW5zdGFsbENvbmZpZ3VyYXRpb25QYWdlLkFjdGl2aXR5U2VjdGlvbi5hY3Rpb24uYWRkcHJlc2VydmVkIjsJCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9PSyA9ICJJbnN0YWxsQ29uZmlndXJhdGlvblBhZ2UuQWN0aXZpdHlTZWN0aW9uLnN0YXR1cy5vayI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9OT0sgPSAiSW5zdGFsbENvbmZpZ3VyYXRpb25QYWdlLkFjdGl2aXR5U2VjdGlvbi5zdGF0dXMubm9rIjsKLQotCXByaXZhdGUgQ29tcG9zaXRlIGNvbnRhaW5lcjsKLQlwcml2YXRlIEZvcm1XaWRnZXRGYWN0b3J5IGZhY3Rvcnk7Ci0JcHJpdmF0ZSBDb250cm9sIFtdIGhlYWRlcnM7Ci0JcHVibGljIEFjdGl2aXR5U2VjdGlvbihVcGRhdGVGb3JtUGFnZSBwYWdlKSB7Ci0JCXN1cGVyKHBhZ2UpOwotCQlzZXRBZGRTZXBhcmF0b3IoZmFsc2UpOwotCQlzZXRIZWFkZXJUZXh0KFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfVElUTEUpKTsKLQkJc2V0RGVzY3JpcHRpb24oVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9ERVNDKSk7Ci0JfQotCi0JcHVibGljIENvbXBvc2l0ZSBjcmVhdGVDbGllbnQoQ29tcG9zaXRlIHBhcmVudCwgRm9ybVdpZGdldEZhY3RvcnkgZmFjdG9yeSkgewotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCXRoaXMuZmFjdG9yeSA9IGZhY3Rvcnk7Ci0JCS8vaGVhZGVyLnNldEZvcmVncm91bmQoZmFjdG9yeS5nZXRDb2xvcihmYWN0b3J5LkNPTE9SX0NPTVBPU0lURV9TRVBBUkFUT1IpKTsKLQkJdXBkYXRlSGVhZGVyQ29sb3IoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gMTA7Ci0JCWNvbnRhaW5lciA9IGZhY3RvcnkuY3JlYXRlQ29tcG9zaXRlKHBhcmVudCk7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXQobGF5b3V0KTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSA0OwotCQkKLQkJaGVhZGVycyA9IG5ldyBDb250cm9sIFs1XTsKLQkJCi0JCWhlYWRlcnNbMF0gPSBjcmVhdGVIZWFkZXIoY29udGFpbmVyLCBmYWN0b3J5LCBVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX0RBVEUpKTsKLQkJaGVhZGVyc1sxXSA9IGNyZWF0ZUhlYWRlcihjb250YWluZXIsIGZhY3RvcnksIFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfVEFSR0VUKSk7Ci0JCWhlYWRlcnNbMl0gPSBjcmVhdGVIZWFkZXIoY29udGFpbmVyLCBmYWN0b3J5LCBVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX0FDVElPTikpOwotCQloZWFkZXJzWzNdID0gY3JlYXRlSGVhZGVyKGNvbnRhaW5lciwgZmFjdG9yeSwgVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9TVEFUVVMpKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJaGVhZGVyc1szXS5zZXRMYXlvdXREYXRhKGdkKTsKLQkJQ29tcG9zaXRlIHNlcGFyYXRvciA9IGZhY3RvcnkuY3JlYXRlQ29tcG9zaXRlU2VwYXJhdG9yKGNvbnRhaW5lcik7Ci0JCWhlYWRlcnNbNF0gPSBzZXBhcmF0b3I7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhlaWdodEhpbnQgPSAxOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDQ7Ci0JCXNlcGFyYXRvci5zZXRMYXlvdXREYXRhKGdkKTsKLQkJc2VwYXJhdG9yLnNldEJhY2tncm91bmQoZmFjdG9yeS5nZXRCb3JkZXJDb2xvcigpKTsKLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGlzSGVhZGVyKENvbnRyb2wgYykgewotCQlmb3IgKGludCBpPTA7IGk8aGVhZGVycy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGMuZXF1YWxzKGhlYWRlcnNbaV0pKSByZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNvbmZpZ3VyYXRpb25DaGFuZ2VkKElJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJQ29udHJvbCBbXSBjaGlsZHJlbiA9IGNvbnRhaW5lci5nZXRDaGlsZHJlbigpOwotCQlmb3IgKGludCBpPTA7IGk8Y2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCUNvbnRyb2wgY2hpbGQgPSBjaGlsZHJlbltpXTsKLQkJCWlmICghaXNIZWFkZXIoY2hpbGQpKQotCQkJCWNoaWxkcmVuW2ldLmRpc3Bvc2UoKTsKLQkJfQotCQkKLQkJSUFjdGl2aXR5IFtdIGFjdGl2aXRpZXMgPSBjb25maWcuZ2V0QWN0aXZpdGllcygpOwotCQlmb3IgKGludCBpPTA7IGk8YWN0aXZpdGllcy5sZW5ndGg7IGkrKykgewotCQkJSUFjdGl2aXR5IGFjdGl2aXR5ID0gYWN0aXZpdGllc1tpXTsKLQkJCWZhY3RvcnkuY3JlYXRlTGFiZWwoY29udGFpbmVyLCBVdGlsaXRpZXMuZm9ybWF0KGFjdGl2aXR5LmdldERhdGUoKSkpOwotCQkJY3JlYXRlTGltaXRlZExhYmVsKGNvbnRhaW5lciwgYWN0aXZpdHkuZ2V0TGFiZWwoKSwgMzAwLCBmYWN0b3J5KTsKLQkJCWZhY3RvcnkuY3JlYXRlTGFiZWwoY29udGFpbmVyLCBnZXRBY3Rpb25MYWJlbChhY3Rpdml0eSkpOwotCQkJZmFjdG9yeS5jcmVhdGVMYWJlbChjb250YWluZXIsIGdldFN0YXR1c0xhYmVsKGFjdGl2aXR5KSk7Ci0JCX0KLQkJQ29tcG9zaXRlIHNlcGFyYXRvciA9IGZhY3RvcnkuY3JlYXRlQ29tcG9zaXRlU2VwYXJhdG9yKGNvbnRhaW5lcik7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhlaWdodEhpbnQgPSAxOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDQ7Ci0JCXNlcGFyYXRvci5zZXRMYXlvdXREYXRhKGdkKTsKLQkJc2VwYXJhdG9yLnNldEJhY2tncm91bmQoZmFjdG9yeS5nZXRCb3JkZXJDb2xvcigpKTsKLQkJZmFjdG9yeS5jcmVhdGVMYWJlbChjb250YWluZXIsIG51bGwpOwotCQljb250YWluZXIubGF5b3V0KHRydWUpOwotCQkvL2NvbnRhaW5lci5nZXRQYXJlbnQoKS5sYXlvdXQodHJ1ZSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVMaW1pdGVkTGFiZWwoQ29tcG9zaXRlIGNvbnRhaW5lciwgU3RyaW5nIHRleHQsIGludCBsaW1pdCwgRm9ybVdpZGdldEZhY3RvcnkgZmFjdG9yeSkgewotCQlDTGFiZWwgY2xhYmVsID0gbmV3IENMYWJlbChjb250YWluZXIsIFNXVC5OVUxMKTsKLQkJY2xhYmVsLnNldEJhY2tncm91bmQoZmFjdG9yeS5nZXRCYWNrZ3JvdW5kQ29sb3IoKSk7Ci0JCWNsYWJlbC5zZXRGb3JlZ3JvdW5kKGZhY3RvcnkuZ2V0Rm9yZWdyb3VuZENvbG9yKCkpOwotCQljbGFiZWwuc2V0VGV4dCh0ZXh0KTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2Qud2lkdGhIaW50ID0gbGltaXQ7Ci0JCWNsYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQl9Ci0JCi0JcHJpdmF0ZSBMYWJlbCBjcmVhdGVIZWFkZXIoQ29tcG9zaXRlIHBhcmVudCwgRm9ybVdpZGdldEZhY3RvcnkgZmFjdG9yeSwgU3RyaW5nIHRleHQpIHsKLQkJTGFiZWwgbGFiZWwgPSBmYWN0b3J5LmNyZWF0ZUxhYmVsKHBhcmVudCwgdGV4dCk7Ci0JCWxhYmVsLnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0QmFubmVyRm9udCgpKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRBY3Rpb25MYWJlbChJQWN0aXZpdHkgYWN0aXZpdHkpIHsKLQkJaW50IGFjdGlvbiA9IGFjdGl2aXR5LmdldEFjdGlvbigpOwotCQlzd2l0Y2ggKGFjdGlvbikgewotCQkJY2FzZSBJQWN0aXZpdHkuQUNUSU9OX0NPTkZJR1VSRToKLQkJCQlyZXR1cm4gVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9DT05GSUdVUkUpOwotCQkJY2FzZSBJQWN0aXZpdHkuQUNUSU9OX0ZFQVRVUkVfSU5TVEFMTDoKLQkJCQlyZXR1cm4gVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9GRUFUVVJFX0lOU1RBTEwpOwotCQkJY2FzZSBJQWN0aXZpdHkuQUNUSU9OX0ZFQVRVUkVfUkVNT1ZFOgotCQkJCXJldHVybiBVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX0ZFQVRVUkVfUkVNT1ZFKTsKLQkJCWNhc2UgSUFjdGl2aXR5LkFDVElPTl9TSVRFX0lOU1RBTEw6Ci0JCQkJcmV0dXJuIFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfU0lURV9JTlNUQUxMKTsKLQkJCWNhc2UgSUFjdGl2aXR5LkFDVElPTl9TSVRFX1JFTU9WRToKLQkJCQlyZXR1cm4gVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9TSVRFX1JFTU9WRSk7Ci0JCQljYXNlIElBY3Rpdml0eS5BQ1RJT05fVU5DT05GSUdVUkU6Ci0JCQkJcmV0dXJuIFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfVU5DT05GSUdVUkUpOwotCQkJY2FzZSBJQWN0aXZpdHkuQUNUSU9OX1JFVkVSVDoKLQkJCQlyZXR1cm4gVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9SRVZFUlQpOwotCQkJY2FzZSBJQWN0aXZpdHkuQUNUSU9OX1JFQ09OQ0lMSUFUSU9OOgotCQkJCXJldHVybiBVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX1JFQ09OQ0lMSUFUSU9OKTsJCQkJCi0JCQljYXNlIElBY3Rpdml0eS5BQ1RJT05fQUREX1BSRVNFUlZFRDoKLQkJCQlyZXR1cm4gVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9BRERfUFJFU0VSVkVEKTsJCQkJCQotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9VTktOT1dOKTsJCQotCQl9Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldFN0YXR1c0xhYmVsKElBY3Rpdml0eSBhY3Rpdml0eSkgewotCQlzd2l0Y2ggKGFjdGl2aXR5LmdldFN0YXR1cygpKSB7Ci0JCQljYXNlIElBY3Rpdml0eS5TVEFUVVNfT0s6Ci0JCQkJcmV0dXJuIFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfT0spOwotCQkJY2FzZSBJQWN0aXZpdHkuU1RBVFVTX05PSzoKLQkJCQlyZXR1cm4gVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9OT0spOwotCQl9Ci0JCXJldHVybiBVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX1VOS05PV04pOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9mb3Jtcy9DYXRlZ29yeUZvcm0uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9mb3Jtcy9DYXRlZ29yeUZvcm0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZiOTRmYy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvZm9ybXMvQ2F0ZWdvcnlGb3JtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuV29ya2JlbmNoSGVscDsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWwuU2l0ZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wYWdlcy5VcGRhdGVGb3JtUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkudmlld3MuRGV0YWlsc1ZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsLio7Ci0KLQotcHVibGljIGNsYXNzIENhdGVnb3J5Rm9ybSBleHRlbmRzIFVwZGF0ZVdlYkZvcm0gewotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBLRVlfVElUTEUgPSAiQ2F0ZWdvcnlQYWdlLnRpdGxlIjsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgS0VZX01PUkVfSU5GTyA9ICJDYXRlZ29yeVBhZ2UubW9yZUluZm8iOwotCVNpdGVDYXRlZ29yeSBjdXJyZW50Q2F0ZWdvcnk7Ci0JTGFiZWwgdGV4dExhYmVsOwotCVNlbGVjdGFibGVGb3JtTGFiZWwgbGluazsKLQkKLXB1YmxpYyBDYXRlZ29yeUZvcm0oVXBkYXRlRm9ybVBhZ2UgcGFnZSkgewotCXN1cGVyKHBhZ2UpOwotfQotCi1wdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCXN1cGVyLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIHZvaWQgaW5pdGlhbGl6ZShPYmplY3QgbW9kZWxPYmplY3QpIHsKLQlzZXRIZWFkaW5nVGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX1RJVExFKSk7Ci0Jc3VwZXIuaW5pdGlhbGl6ZShtb2RlbE9iamVjdCk7Ci0JLy8oKENvbXBvc2l0ZSlnZXRDb250cm9sKCkpLmxheW91dCh0cnVlKTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCUhUTUxUYWJsZUxheW91dCBsYXlvdXQgPSBuZXcgSFRNTFRhYmxlTGF5b3V0KCk7Ci0JcGFyZW50LnNldExheW91dChsYXlvdXQpOwotCWxheW91dC5sZWZ0TWFyZ2luID0gbGF5b3V0LnJpZ2h0TWFyZ2luID0gMTA7Ci0JbGF5b3V0LnRvcE1hcmdpbiA9IDEwOwotCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAyMDsKLQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JLy8gZGVmZWN0IDE3MTIzCi0JLy9sYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAwOwotCQotCUZvcm1XaWRnZXRGYWN0b3J5IGZhY3RvcnkgPSBnZXRGYWN0b3J5KCk7Ci0JdGV4dExhYmVsID0gZmFjdG9yeS5jcmVhdGVMYWJlbChwYXJlbnQsIG51bGwsIFNXVC5XUkFQKTsKLQkKLQlJSHlwZXJsaW5rTGlzdGVuZXIgbGlzdGVuZXI7Ci0KLQlsaXN0ZW5lciA9IG5ldyBIeXBlcmxpbmtBZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCBsaW5rQWN0aXZhdGVkKENvbnRyb2wgbGluaykgewotCQkJaWYgKGN1cnJlbnRDYXRlZ29yeT09bnVsbCkgcmV0dXJuOwotCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKSwKLQkJCW5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCUlDYXRlZ29yeSBjYXRlZ29yeSA9IGN1cnJlbnRDYXRlZ29yeS5nZXRDYXRlZ29yeSgpOwotCQkJCQlpZiAoY2F0ZWdvcnkhPW51bGwpIHsKLQkJCQkJCUlVUkxFbnRyeSBpbmZvID0gY2F0ZWdvcnkuZ2V0RGVzY3JpcHRpb24oKTsKLQkJCQkJCVVSTCBpbmZvVVJMID0gaW5mby5nZXRVUkwoKTsKLQkJCQkJCWlmIChpbmZvVVJMIT1udWxsKSB7Ci0JCQkJCQkJRGV0YWlsc1ZpZXcuc2hvd1VSTChpbmZvVVJMLnRvU3RyaW5nKCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9OwotCWxpbmsgPSBuZXcgU2VsZWN0YWJsZUZvcm1MYWJlbChwYXJlbnQsIFNXVC5OVUxMKTsKLQlsaW5rLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9NT1JFX0lORk8pKTsKLQlmYWN0b3J5LnR1cm5JbnRvSHlwZXJsaW5rKGxpbmssIGxpc3RlbmVyKTsKLQlsaW5rLnNldFZpc2libGUoZmFsc2UpOwotCXNldEZvY3VzQ29udHJvbChsaW5rKTsKLQlXb3JrYmVuY2hIZWxwLnNldEhlbHAocGFyZW50LCAib3JnLmVjbGlwc2UudXBkYXRlLnVpLkNhdGVnb3J5Rm9ybSIpOwotfQotCi1wdWJsaWMgdm9pZCBleHBhbmRUbyhPYmplY3Qgb2JqKSB7Ci0JaWYgKG9iaiBpbnN0YW5jZW9mIFNpdGVDYXRlZ29yeSkgewotCQlpbnB1dENoYW5nZWQoKFNpdGVDYXRlZ29yeSlvYmopOwotCX0KLX0KLS8vCi0vLyBEZWZlY3QgMTcxMjMgLSBjb21tZW50ZWQgb3V0IHRoaXMgaW1wbGVtZW50YXRpb24gb2YgaW5wdXRDaGFuZ2VkKC4uLikKLS8qcHJpdmF0ZSB2b2lkIGlucHV0Q2hhbmdlZChTaXRlQ2F0ZWdvcnkgY2F0ZWdvcnkpIHsKLQlzZXRIZWFkaW5nVGV4dChjYXRlZ29yeS5nZXRDYXRlZ29yeSgpLmdldExhYmVsKCkpOwotCUlVUkxFbnRyeSBpbmZvID0gY2F0ZWdvcnkuZ2V0Q2F0ZWdvcnkoKS5nZXREZXNjcmlwdGlvbigpOwotCWlmIChpbmZvIT1udWxsKSB7Ci0JCVN0cmluZyB0ZXh0ID0gaW5mby5nZXRBbm5vdGF0aW9uKCk7Ci0JCWlmICh0ZXh0IT1udWxsKQotCQkgICB0ZXh0TGFiZWwuc2V0VGV4dCh0ZXh0KTsKLQkJZWxzZQotCQkgICB0ZXh0TGFiZWwuc2V0VGV4dCgiIik7Ci0JCWxpbmsuc2V0VmlzaWJsZShpbmZvLmdldFVSTCgpIT1udWxsKTsKLQl9Ci0JZWxzZSB7Ci0JCXRleHRMYWJlbC5zZXRUZXh0KCIiKTsKLQkJbGluay5zZXRWaXNpYmxlKGZhbHNlKTsKLQl9Ci0JdGV4dExhYmVsLmdldFBhcmVudCgpLmxheW91dCgpOwotCSgoQ29tcG9zaXRlKWdldENvbnRyb2woKSkubGF5b3V0KCk7Ci0JZ2V0Q29udHJvbCgpLnJlZHJhdygpOwotCWN1cnJlbnRDYXRlZ29yeSA9IGNhdGVnb3J5OwotfSovCi0KLS8vIGRlZmVjdCAxNzEyMzogbmV3IGltcGxlbWVudGF0aW9uIG9mIGlucHV0Q2hhbmdlZCguLi4pCi1wcml2YXRlIHZvaWQgaW5wdXRDaGFuZ2VkKFNpdGVDYXRlZ29yeSBjYXRlZ29yeSkgewotCXNldEhlYWRpbmdUZXh0KGNhdGVnb3J5LmdldENhdGVnb3J5KCkuZ2V0TGFiZWwoKSk7Ci0JSVVSTEVudHJ5IGluZm8gPSBjYXRlZ29yeS5nZXRDYXRlZ29yeSgpLmdldERlc2NyaXB0aW9uKCk7Ci0JU3RyaW5nIHRleHQgPSBudWxsOwotCWlmIChpbmZvICE9IG51bGwpIHsKLQkJdGV4dCA9IGluZm8uZ2V0QW5ub3RhdGlvbigpOwotCQlpZiAodGV4dCAhPSBudWxsKSB7Ci0JCQlDb21wb3NpdGUgcGFyZW50ID0gdGV4dExhYmVsLmdldFBhcmVudCgpOwotCQkJdGV4dExhYmVsLmRpc3Bvc2UoKTsKLQkJCXBhcmVudC5sYXlvdXQoKTsKLQkJCXRleHRMYWJlbCA9IGdldEZhY3RvcnkoKS5jcmVhdGVMYWJlbChwYXJlbnQsdGV4dCxTV1QuV1JBUCk7Ci0JCQlsaW5rLnNldFZpc2libGUoaW5mby5nZXRVUkwoKSE9IG51bGwpOwotCQl9Ci0JfQotCWlmICh0ZXh0ID09IG51bGwpIHsKLQkgdGV4dExhYmVsLnNldFRleHQoIiIpOwotCSBsaW5rLnNldFZpc2libGUoZmFsc2UpOwotCX0KLQkKLQl0ZXh0TGFiZWwuZ2V0UGFyZW50KCkubGF5b3V0KCk7Ci0JKChDb21wb3NpdGUpZ2V0Q29udHJvbCgpKS5sYXlvdXQoKTsKLQlnZXRDb250cm9sKCkucmVkcmF3KCk7Ci0JY3VycmVudENhdGVnb3J5ID0gY2F0ZWdvcnk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9mb3Jtcy9EZXRhaWxzRm9ybS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL2Zvcm1zL0RldGFpbHNGb3JtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkZTAyMGUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL2Zvcm1zL0RldGFpbHNGb3JtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luVmVyc2lvbklkZW50aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JU3RhdHVzTGluZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuUHJvZ3Jlc3NNb25pdG9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3U2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLldvcmtiZW5jaEhlbHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uSUNvbmZpZ3VyZWRTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLklJbnN0YWxsQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi5JTG9jYWxTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuU2l0ZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuVmVyc2lvbmVkSWRlbnRpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlUGVyc3BlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSUltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWwuSUNvbmZpZ3VyZWRTaXRlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWwuSUZlYXR1cmVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbC5JVXBkYXRlTW9kZWxDaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsLk1pc3NpbmdGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbC5QZW5kaW5nQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbC5VcGRhdGVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkucGFnZXMuVXBkYXRlRm9ybVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnBhcnRzLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnByZWZlcmVuY2VzLlVwZGF0ZUNvbG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkudmlld3MuRGV0YWlsc1ZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLndpemFyZHMuSW5zdGFsbFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkud2l6YXJkcy5JbnN0YWxsV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbC5FeHBhbmRhYmxlR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsLkZvcm1XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbC5IVE1MVGFibGVMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsLkh5cGVybGlua0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsLkh5cGVybGlua0hhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsLklIeXBlcmxpbmtMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWwuU2VsZWN0YWJsZUZvcm1MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWwuVGFibGVEYXRhOwotCi1wdWJsaWMgY2xhc3MgRGV0YWlsc0Zvcm0gZXh0ZW5kcyBQcm9wZXJ0eVdlYkZvcm0gewotCS8vIE5MIGtleXMKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUFJPVklERVIgPSAiRmVhdHVyZVBhZ2UucHJvdmlkZXIiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9WRVJTSU9OID0gIkZlYXR1cmVQYWdlLnZlcnNpb24iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9JVkVSU0lPTiA9ICJGZWF0dXJlUGFnZS5pbnN0YWxsZWRWZXJzaW9uIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUEVORElOR19WRVJTSU9OID0KLQkJIkZlYXR1cmVQYWdlLnBlbmRpbmdWZXJzaW9uIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU0laRSA9ICJGZWF0dXJlUGFnZS5zaXplIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRVNUSU1BVEUgPSAiRmVhdHVyZVBhZ2UuZXN0aW1hdGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9PUyA9ICJGZWF0dXJlUGFnZS5vcyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1dTID0gIkZlYXR1cmVQYWdlLndzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTkwgPSAiRmVhdHVyZVBhZ2UubmwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9BUkNIID0gIkZlYXR1cmVQYWdlLmFyY2giOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9QTEFURk9STVMgPSAiRmVhdHVyZVBhZ2UucGxhdGZvcm1zIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfREVTQyA9ICJGZWF0dXJlUGFnZS5kZXNjcmlwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0lORk9fTElOSyA9ICJGZWF0dXJlUGFnZS5pbmZvTGluayI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0xJQ0VOU0VfTElOSyA9ICJGZWF0dXJlUGFnZS5saWNlbnNlTGluayI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPUFlSSUdIVF9MSU5LID0KLQkJIkZlYXR1cmVQYWdlLmNvcHlyaWdodExpbmsiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9OT1RfSU5TVEFMTEVEID0gIkZlYXR1cmVQYWdlLm5vdEluc3RhbGxlZCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NJWkVfVkFMVUUgPSAiRmVhdHVyZVBhZ2Uuc2l6ZVZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRVNUSU1BVEVfVkFMVUUgPQotCQkiRmVhdHVyZVBhZ2UuZXN0aW1hdGVWYWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX01JTlVURV9FU1RJTUFURV9WQUxVRSA9Ci0JCSJGZWF0dXJlUGFnZS5taW51dGVFc3RpbWF0ZVZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVU5LTk9XTl9TSVpFX1ZBTFVFID0KLQkJIkZlYXR1cmVQYWdlLnVua25vd25TaXplVmFsdWUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9VTktOT1dOX0VTVElNQVRFX1ZBTFVFID0KLQkJIkZlYXR1cmVQYWdlLnVua25vd25Fc3RpbWF0ZVZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRE9fVU5DT05GSUdVUkUgPQotCQkiRmVhdHVyZVBhZ2UuZG9CdXR0b24udW5jb25maWd1cmUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ET19DT05GSUdVUkUgPQotCQkiRmVhdHVyZVBhZ2UuZG9CdXR0b24uY29uZmlndXJlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRE9fUkVQQUlSID0gIkZlYXR1cmVQYWdlLmRvQnV0dG9uLnJlcGFpciI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RPX0NIQU5HRSA9ICJGZWF0dXJlUGFnZS5kb0J1dHRvbi5jaGFuZ2UiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ET19VUERBVEUgPSAiRmVhdHVyZVBhZ2UuZG9CdXR0b24udXBkYXRlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRE9fSU5TVEFMTCA9ICJGZWF0dXJlUGFnZS5kb0J1dHRvbi5pbnN0YWxsIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRE9fVU5JTlNUQUxMID0KLQkJIkZlYXR1cmVQYWdlLmRvQnV0dG9uLnVuaW5zdGFsbCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQkFUQ0hfVU5DT05GSUdVUkUgPQotCQkiRmVhdHVyZVBhZ2UuYmF0Y2hCdXR0b24udW5jb25maWd1cmUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9CQVRDSF9DT05GSUdVUkUgPQotCQkiRmVhdHVyZVBhZ2UuYmF0Y2hCdXR0b24uY29uZmlndXJlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQkFUQ0hfUkVQQUlSID0KLQkJIkZlYXR1cmVQYWdlLmJhdGNoQnV0dG9uLnJlcGFpciI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0JBVENIX0NIQU5HRSA9Ci0JCSJGZWF0dXJlUGFnZS5iYXRjaEJ1dHRvbi5jaGFuZ2UiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9CQVRDSF9VUERBVEUgPQotCQkiRmVhdHVyZVBhZ2UuYmF0Y2hCdXR0b24udXBkYXRlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQkFUQ0hfSU5TVEFMTCA9Ci0JCSJGZWF0dXJlUGFnZS5iYXRjaEJ1dHRvbi5pbnN0YWxsIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQkFUQ0hfVU5JTlNUQUxMID0KLQkJIkZlYXR1cmVQYWdlLmJhdGNoQnV0dG9uLnVuaW5zdGFsbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0JBVENIID0gIkZlYXR1cmVQYWdlLmJhdGNoIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU0VMRUNURURfVVBEQVRFUyA9Ci0JCSJGZWF0dXJlUGFnZS5zZWxlY3RlZFVwZGF0ZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RJQUxPR19VVElUTEUgPSAiRmVhdHVyZVBhZ2UuZGlhbG9nLnV0aXRsZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RJQUxPR19USVRMRSA9ICJGZWF0dXJlUGFnZS5kaWFsb2cudGl0bGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ESUFMT0dfQ1RJVExFID0gIkZlYXR1cmVQYWdlLmRpYWxvZy5jdGl0bGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ESUFMT0dfVUNUSVRMRSA9Ci0JCSJGZWF0dXJlUGFnZS5kaWFsb2cudWN0aXRsZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RJQUxPR19VTUVTU0FHRSA9Ci0JCSJGZWF0dXJlUGFnZS5kaWFsb2cudW1lc3NhZ2UiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ESUFMT0dfTUVTU0FHRSA9Ci0JCSJGZWF0dXJlUGFnZS5kaWFsb2cubWVzc2FnZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RJQUxPR19DTUVTU0FHRSA9Ci0JCSJGZWF0dXJlUGFnZS5kaWFsb2cuY21lc3NhZ2UiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ESUFMT0dfVUNNRVNTQUdFID0KLQkJIkZlYXR1cmVQYWdlLmRpYWxvZy51Y21lc3NhZ2UiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9NSVNTSU5HX1RJVExFID0gIkZlYXR1cmVQYWdlLm1pc3NpbmcudGl0bGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9NSVNTSU5HX01FU1NBR0UgPQotCQkiRmVhdHVyZVBhZ2UubWlzc2luZy5tZXNzYWdlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTUlTU0lOR19TRUFSQ0ggPQotCQkiRmVhdHVyZVBhZ2UubWlzc2luZy5zZWFyY2giOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9NSVNTSU5HX0FCT1JUID0gIkZlYXR1cmVQYWdlLm1pc3NpbmcuYWJvcnQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9TRUFSQ0hfT0JKRUNUX05BTUUgPQotCQkiRmVhdHVyZVBhZ2UubWlzc2luZy5zZWFyY2hPYmplY3ROYW1lIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfT1BUSU9OQUxfSU5TVEFMTF9NRVNTQUdFID0KLQkJIkZlYXR1cmVQYWdlLm9wdGlvbmFsSW5zdGFsbC5tZXNzYWdlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfT1BUSU9OQUxfSU5TVEFMTF9USVRMRSA9Ci0JCSJGZWF0dXJlUGFnZS5vcHRpb25hbEluc3RhbGwudGl0bGUiOyAvLyROT04tTkxTLTEkCi0JLy8JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFUEFJUiA9IDE7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENIQU5HRSA9IDI7Ci0JcHJpdmF0ZSBpbnQgcmVpbnN0YWxsQ29kZSA9IDA7Ci0KLQlwcml2YXRlIExhYmVsIGltYWdlTGFiZWw7Ci0JcHJpdmF0ZSBMYWJlbCBwcm92aWRlckxhYmVsOwotCXByaXZhdGUgTGFiZWwgdmVyc2lvbkxhYmVsOwotCXByaXZhdGUgTGFiZWwgaW5zdGFsbGVkVmVyc2lvbkxhYmVsOwotCXByaXZhdGUgTGFiZWwgc2l6ZUxhYmVsOwotCXByaXZhdGUgTGFiZWwgZXN0aW1hdGVkVGltZTsKLQlwcml2YXRlIExhYmVsIG9zTGFiZWw7Ci0JcHJpdmF0ZSBMYWJlbCB3c0xhYmVsOwotCXByaXZhdGUgTGFiZWwgbmxMYWJlbDsKLQlwcml2YXRlIExhYmVsIGFyY2hMYWJlbDsKLQlwcml2YXRlIExhYmVsIGRlc2NyaXB0aW9uVGV4dDsKLQlwcml2YXRlIExhYmVsIGdyb3VwVXBkYXRlc0xhYmVsOwotCXByaXZhdGUgVVJMIGluZm9MaW5rVVJMOwotCXByaXZhdGUgU2VsZWN0YWJsZUZvcm1MYWJlbCBpbmZvTGlua0xhYmVsOwotCXByaXZhdGUgU2VsZWN0YWJsZUZvcm1MYWJlbCBpdGVtc0xpbms7Ci0JcHJpdmF0ZSBJbmZvTGluayBsaWNlbnNlTGluazsKLQlwcml2YXRlIEluZm9MaW5rIGNvcHlyaWdodExpbms7Ci0JcHJpdmF0ZSBSZWZsb3dHcm91cCBzdXBwb3J0ZWRQbGF0Zm9ybXNHcm91cDsKLQlwcml2YXRlIEltYWdlIHByb3ZpZGVySW1hZ2U7Ci0JLy9wcml2YXRlIEJ1dHRvbiB1bmluc3RhbGxCdXR0b247Ci0JcHJpdmF0ZSBCdXR0b24gYWRkQnV0dG9uOwotCXByaXZhdGUgQnV0dG9uIGRvQnV0dG9uOwotCXByaXZhdGUgSUZlYXR1cmUgY3VycmVudEZlYXR1cmU7Ci0JcHJpdmF0ZSBJRmVhdHVyZUFkYXB0ZXIgY3VycmVudEFkYXB0ZXI7Ci0JcHJpdmF0ZSBNb2RlbExpc3RlbmVyIG1vZGVsTGlzdGVuZXI7Ci0JcHJpdmF0ZSBIYXNodGFibGUgaW1hZ2VDYWNoZSA9IG5ldyBIYXNodGFibGUoKTsKLQlwcml2YXRlIEh5cGVybGlua0hhbmRsZXIgc2VjdGlvbkhhbmRsZXI7Ci0JcHJpdmF0ZSBib29sZWFuIGFscmVhZHlJbnN0YWxsZWQ7Ci0JcHJpdmF0ZSBJRmVhdHVyZVtdIGluc3RhbGxlZEZlYXR1cmVzOwotCXByaXZhdGUgYm9vbGVhbiBuZXdlclZlcnNpb247Ci0JcHJpdmF0ZSBib29sZWFuIGFkZEJsb2NrOwotCXByaXZhdGUgYm9vbGVhbiBpbnB1dEJsb2NrOwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaW5Qcm9ncmVzczsKLQotCWNsYXNzIE1vZGVsTGlzdGVuZXIgaW1wbGVtZW50cyBJVXBkYXRlTW9kZWxDaGFuZ2VkTGlzdGVuZXIgewotCQkvKioKLQkJICogQHNlZSBJVXBkYXRlTW9kZWxDaGFuZ2VkTGlzdGVuZXIjb2JqZWN0QWRkZWQoT2JqZWN0LCBPYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBvYmplY3RzQWRkZWQoT2JqZWN0IHBhcmVudCwgT2JqZWN0W10gY2hpbGRyZW4pIHsKLQkJCWlmIChpc0N1cnJlbnRGZWF0dXJlKGNoaWxkcmVuKSkgewotCQkJCVNXVFV0aWwuZ2V0U3RhbmRhcmREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJcmVmcmVzaCgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0KLQotCQlib29sZWFuIGlzQ3VycmVudEZlYXR1cmUoT2JqZWN0W10gY2hpbGRyZW4pIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQlPYmplY3Qgb2JqID0gY2hpbGRyZW5baV07Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFBlbmRpbmdDaGFuZ2UpIHsKLQkJCQkJUGVuZGluZ0NoYW5nZSBqb2IgPSAoUGVuZGluZ0NoYW5nZSkgb2JqOwotCQkJCQlpZiAoam9iLmdldEZlYXR1cmUoKS5lcXVhbHMoY3VycmVudEZlYXR1cmUpKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIElVcGRhdGVNb2RlbENoYW5nZWRMaXN0ZW5lciNvYmplY3RSZW1vdmVkKE9iamVjdCwgT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIHZvaWQgb2JqZWN0c1JlbW92ZWQoT2JqZWN0IHBhcmVudCwgT2JqZWN0W10gY2hpbGRyZW4pIHsKLQkJCWlmIChpc0N1cnJlbnRGZWF0dXJlKGNoaWxkcmVuKSkgewotCQkJCVNXVFV0aWwuZ2V0U3RhbmRhcmREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJLy9kb0J1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJCQkJcmVmcmVzaCgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBJVXBkYXRlTW9kZWxDaGFuZ2VkTGlzdGVuZXIjb2JqZWN0Q2hhbmdlZChPYmplY3QsIFN0cmluZykKLQkJICovCi0JCXB1YmxpYyB2b2lkIG9iamVjdENoYW5nZWQoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCX0KLQl9Ci0KLQlhYnN0cmFjdCBjbGFzcyBMaW5rTGlzdGVuZXIgaW1wbGVtZW50cyBJSHlwZXJsaW5rTGlzdGVuZXIgewotCQlwdWJsaWMgYWJzdHJhY3QgVVJMIGdldFVSTCgpOwotCQlwdWJsaWMgdm9pZCBsaW5rQWN0aXZhdGVkKENvbnRyb2wgbGlua0xhYmVsKSB7Ci0JCQlVUkwgdXJsID0gZ2V0VVJMKCk7Ci0JCQlpZiAodXJsICE9IG51bGwpCi0JCQkJb3BlblVSTCh1cmwudG9TdHJpbmcoKSk7Ci0JCX0KLQkJcHVibGljIHZvaWQgbGlua0VudGVyZWQoQ29udHJvbCBsaW5rTGFiZWwpIHsKLQkJCVVSTCB1cmwgPSBnZXRVUkwoKTsKLQkJCWlmICh1cmwgIT0gbnVsbCkKLQkJCQlzaG93U3RhdHVzKHVybC50b1N0cmluZygpKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBsaW5rRXhpdGVkKENvbnRyb2wgbGlua0xhYmVsKSB7Ci0JCQlzaG93U3RhdHVzKG51bGwpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHNob3dTdGF0dXMoU3RyaW5nIHRleHQpIHsKLQkJCUlWaWV3U2l0ZSBzaXRlID0gZ2V0UGFnZSgpLmdldFZpZXcoKS5nZXRWaWV3U2l0ZSgpOwotCQkJSVN0YXR1c0xpbmVNYW5hZ2VyIHNtID0gc2l0ZS5nZXRBY3Rpb25CYXJzKCkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKTsKLQkJCXNtLnNldE1lc3NhZ2UodGV4dCk7Ci0JCX0KLQl9Ci0KLQlhYnN0cmFjdCBjbGFzcyBSZWZsb3dHcm91cCBleHRlbmRzIEV4cGFuZGFibGVHcm91cCB7Ci0JCXB1YmxpYyB2b2lkIGV4cGFuZGVkKCkgewotCQkJcmVmbG93KCk7Ci0JCQl1cGRhdGVTaXplKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgY29sbGFwc2VkKCkgewotCQkJcmVmbG93KCk7Ci0JCQl1cGRhdGVTaXplKCk7Ci0JCX0KLQkJcHJvdGVjdGVkIFNlbGVjdGFibGVGb3JtTGFiZWwgY3JlYXRlVGV4dExhYmVsKAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCUZvcm1XaWRnZXRGYWN0b3J5IGZhY3RvcnkpIHsKLQkJCVNlbGVjdGFibGVGb3JtTGFiZWwgbGFiZWwgPSBzdXBlci5jcmVhdGVUZXh0TGFiZWwocGFyZW50LCBmYWN0b3J5KTsKLQkJCWxhYmVsLnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0QmFubmVyRm9udCgpKTsKLQkJCXJldHVybiBsYWJlbDsKLQkJfQotCQlwcm90ZWN0ZWQgSHlwZXJsaW5rSGFuZGxlciBnZXRIeXBlcmxpbmtIYW5kbGVyKEZvcm1XaWRnZXRGYWN0b3J5IGZhY3RvcnkpIHsKLQkJCXJldHVybiBzZWN0aW9uSGFuZGxlcjsKLQkJfQotCX0KLQotCXB1YmxpYyBEZXRhaWxzRm9ybShVcGRhdGVGb3JtUGFnZSBwYWdlKSB7Ci0JCXN1cGVyKHBhZ2UpOwotCQlwcm92aWRlckltYWdlID0gVXBkYXRlVUlJbWFnZXMuREVTQ19QUk9WSURFUi5jcmVhdGVJbWFnZSgpOwotCQltb2RlbExpc3RlbmVyID0gbmV3IE1vZGVsTGlzdGVuZXIoKTsKLQkJVXBkYXRlTW9kZWwgbW9kZWwgPSBVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0VXBkYXRlTW9kZWwoKTsKLQkJbW9kZWwuYWRkVXBkYXRlTW9kZWxDaGFuZ2VkTGlzdGVuZXIobW9kZWxMaXN0ZW5lcik7Ci0JCXNlY3Rpb25IYW5kbGVyID0gbmV3IEh5cGVybGlua0hhbmRsZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlVcGRhdGVNb2RlbCBtb2RlbCA9IFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRVcGRhdGVNb2RlbCgpOwotCQltb2RlbC5yZW1vdmVVcGRhdGVNb2RlbENoYW5nZWRMaXN0ZW5lcihtb2RlbExpc3RlbmVyKTsKLQkJcHJvdmlkZXJJbWFnZS5kaXNwb3NlKCk7Ci0JCWZvciAoRW51bWVyYXRpb24gZW51bSA9IGltYWdlQ2FjaGUuZWxlbWVudHMoKTsKLQkJCWVudW0uaGFzTW9yZUVsZW1lbnRzKCk7Ci0JCQkpIHsKLQkJCUltYWdlIGltYWdlID0gKEltYWdlKSBlbnVtLm5leHRFbGVtZW50KCk7Ci0JCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCX0KLQkJaW1hZ2VDYWNoZS5jbGVhcigpOwotCQlzZWN0aW9uSGFuZGxlci5kaXNwb3NlKCk7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKE9iamVjdCBtb2RlbE9iamVjdCkgewotCQlzZXRIZWFkaW5nVGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJc3VwZXIuaW5pdGlhbGl6ZShtb2RlbE9iamVjdCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvbmZpZ3VyZVNlY3Rpb25IYW5kbGVyKAotCQlGb3JtV2lkZ2V0RmFjdG9yeSBmYWN0b3J5LAotCQlEaXNwbGF5IGRpc3BsYXkpIHsKLQkJc2VjdGlvbkhhbmRsZXIuc2V0SHlwZXJsaW5rVW5kZXJsaW5lTW9kZSgKLQkJCUh5cGVybGlua0hhbmRsZXIuVU5ERVJMSU5FX05FVkVSKTsKLQkJc2VjdGlvbkhhbmRsZXIuc2V0QmFja2dyb3VuZChmYWN0b3J5LmdldEJhY2tncm91bmRDb2xvcigpKTsKLQkJc2VjdGlvbkhhbmRsZXIuc2V0Rm9yZWdyb3VuZChVcGRhdGVDb2xvcnMuZ2V0VG9waWNDb2xvcihkaXNwbGF5KSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlSGVhZGluZ3MoKSB7Ci0JCUNvbnRyb2wgY29udHJvbCA9IGdldENvbnRyb2woKTsKLQkJaWYgKGNvbnRyb2w9PW51bGwpIHJldHVybjsKLQkJc2VjdGlvbkhhbmRsZXIuc2V0Rm9yZWdyb3VuZCgKLQkJCVVwZGF0ZUNvbG9ycy5nZXRUb3BpY0NvbG9yKGNvbnRyb2wuZ2V0RGlzcGxheSgpKSk7Ci0JCXN1cGVyLnVwZGF0ZUhlYWRpbmdzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlIVE1MVGFibGVMYXlvdXQgbGF5b3V0ID0gbmV3IEhUTUxUYWJsZUxheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXQobGF5b3V0KTsKLQkJLy9sYXlvdXQucmlnaHRNYXJnaW4gPSAwOwotCQlHcmlkRGF0YSBnZDsKLQotCQljb25maWd1cmVTZWN0aW9uSGFuZGxlcihmYWN0b3J5LCBjb250YWluZXIuZ2V0RGlzcGxheSgpKTsKLQotCQlHcmlkTGF5b3V0IGdsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlDb21wb3NpdGUgcHJvcGVydGllcyA9IGZhY3RvcnkuY3JlYXRlQ29tcG9zaXRlKGNvbnRhaW5lcik7Ci0JCXByb3BlcnRpZXMuc2V0TGF5b3V0KGdsYXlvdXQpOwotCQlnbGF5b3V0Lm1hcmdpbldpZHRoID0gZ2xheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlnbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDA7Ci0KLQkJcHJvdmlkZXJMYWJlbCA9Ci0JCQljcmVhdGVQcm9wZXJ0eShwcm9wZXJ0aWVzLCBVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX1BST1ZJREVSKSk7Ci0JCXZlcnNpb25MYWJlbCA9Ci0JCQljcmVhdGVQcm9wZXJ0eShwcm9wZXJ0aWVzLCBVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX1ZFUlNJT04pKTsKLQkJaW5zdGFsbGVkVmVyc2lvbkxhYmVsID0KLQkJCWNyZWF0ZVByb3BlcnR5KHByb3BlcnRpZXMsIFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfSVZFUlNJT04pKTsKLQkJc2l6ZUxhYmVsID0gY3JlYXRlUHJvcGVydHkocHJvcGVydGllcywgVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9TSVpFKSk7Ci0JCWVzdGltYXRlZFRpbWUgPQotCQkJY3JlYXRlUHJvcGVydHkocHJvcGVydGllcywgVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9FU1RJTUFURSkpOwotCQlzdXBwb3J0ZWRQbGF0Zm9ybXNHcm91cCA9IG5ldyBSZWZsb3dHcm91cCgpIHsKLQkJCXB1YmxpYyB2b2lkIGZpbGxFeHBhbnNpb24oCi0JCQkJQ29tcG9zaXRlIGV4cGFuc2lvbiwKLQkJCQlGb3JtV2lkZ2V0RmFjdG9yeSBmYWN0b3J5KSB7Ci0JCQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQkJCWV4cGFuc2lvbi5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQkJCW9zTGFiZWwgPSBjcmVhdGVQcm9wZXJ0eShleHBhbnNpb24sIFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfT1MpKTsKLQkJCQl3c0xhYmVsID0gY3JlYXRlUHJvcGVydHkoZXhwYW5zaW9uLCBVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX1dTKSk7Ci0JCQkJbmxMYWJlbCA9IGNyZWF0ZVByb3BlcnR5KGV4cGFuc2lvbiwgVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9OTCkpOwotCQkJCWFyY2hMYWJlbCA9Ci0JCQkJCWNyZWF0ZVByb3BlcnR5KGV4cGFuc2lvbiwgVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9BUkNIKSk7Ci0JCQl9Ci0JCX07Ci0JCXN1cHBvcnRlZFBsYXRmb3Jtc0dyb3VwLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9QTEFURk9STVMpKTsKLQkJbmV3IExhYmVsKHByb3BlcnRpZXMsIFNXVC5OVUxMKTsKLQkJc3VwcG9ydGVkUGxhdGZvcm1zR3JvdXAuY3JlYXRlQ29udHJvbChwcm9wZXJ0aWVzLCBmYWN0b3J5KTsKLQkJc2V0Rm9jdXNDb250cm9sKHN1cHBvcnRlZFBsYXRmb3Jtc0dyb3VwLmdldENvbnRyb2woKSk7Ci0KLQkJaW1hZ2VMYWJlbCA9IGZhY3RvcnkuY3JlYXRlTGFiZWwoY29udGFpbmVyLCBudWxsKTsKLQkJVGFibGVEYXRhIHRkID0gbmV3IFRhYmxlRGF0YSgpOwotCQl0ZC5hbGlnbiA9IFRhYmxlRGF0YS5DRU5URVI7Ci0JCS8vdGQudmFsaWduID0gVGFibGVEYXRhLk1JRERMRTsKLQkJaW1hZ2VMYWJlbC5zZXRMYXlvdXREYXRhKHRkKTsKLQotCQlMYWJlbCBsYWJlbCA9IGNyZWF0ZUhlYWRpbmcoY29udGFpbmVyLCBVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX0RFU0MpKTsKLQkJdGQgPSBuZXcgVGFibGVEYXRhKCk7Ci0JCXRkLmNvbHNwYW4gPSAyOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKHRkKTsKLQkJZGVzY3JpcHRpb25UZXh0ID0gZmFjdG9yeS5jcmVhdGVMYWJlbChjb250YWluZXIsIG51bGwsIFNXVC5XUkFQKTsKLQkJdGQgPSBuZXcgVGFibGVEYXRhKCk7Ci0JCXRkLmNvbHNwYW4gPSAyOwotCQl0ZC5ncmFiSG9yaXpvbnRhbCA9IHRydWU7Ci0JCWRlc2NyaXB0aW9uVGV4dC5zZXRMYXlvdXREYXRhKHRkKTsKLQotCQlnbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJZ2xheW91dC5udW1Db2x1bW5zID0gNDsKLQkJZ2xheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDIwOwotCQlnbGF5b3V0Lm1hcmdpbldpZHRoID0gMTA7Ci0KLQkJYWRkU2VwYXJhdG9yKGNvbnRhaW5lcik7Ci0KLQkJQ29tcG9zaXRlIGZvb3RlciA9IGZhY3RvcnkuY3JlYXRlQ29tcG9zaXRlKGNvbnRhaW5lcik7Ci0JCXRkID0gbmV3IFRhYmxlRGF0YSgpOwotCQl0ZC5jb2xzcGFuID0gMjsKLQkJdGQuYWxpZ24gPSBUYWJsZURhdGEuRklMTDsKLQkJZm9vdGVyLnNldExheW91dERhdGEodGQpOwotCQlmb290ZXIuc2V0TGF5b3V0KGdsYXlvdXQpOwotCi0JCUxpbmtMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaW5rTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgVVJMIGdldFVSTCgpIHsKLQkJCQlyZXR1cm4gaW5mb0xpbmtVUkw7Ci0JCQl9Ci0JCX07Ci0KLQkJaW5mb0xpbmtMYWJlbCA9IG5ldyBTZWxlY3RhYmxlRm9ybUxhYmVsKGZvb3RlciwgU1dULk5VTEwpOwotCQlpbmZvTGlua0xhYmVsLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9JTkZPX0xJTkspKTsKLQkJZmFjdG9yeS50dXJuSW50b0h5cGVybGluayhpbmZvTGlua0xhYmVsLCBsaXN0ZW5lcik7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7Ci0JCWluZm9MaW5rTGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWxpY2Vuc2VMaW5rID0gbmV3IEluZm9MaW5rKChEZXRhaWxzVmlldykgZ2V0UGFnZSgpLmdldFZpZXcoKSk7Ci0JCWxpY2Vuc2VMaW5rLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9MSUNFTlNFX0xJTkspKTsKLQkJbGljZW5zZUxpbmsuY3JlYXRlQ29udHJvbChmb290ZXIsIGZhY3RvcnkpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpOwotCQlsaWNlbnNlTGluay5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWNvcHlyaWdodExpbmsgPSBuZXcgSW5mb0xpbmsoKERldGFpbHNWaWV3KSBnZXRQYWdlKCkuZ2V0VmlldygpKTsKLQkJY29weXJpZ2h0TGluay5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfQ09QWVJJR0hUX0xJTkspKTsKLQkJY29weXJpZ2h0TGluay5jcmVhdGVDb250cm9sKGZvb3RlciwgZmFjdG9yeSk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7Ci0JCWNvcHlyaWdodExpbmsuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZ2QpOwotCi0JCWRvQnV0dG9uID0gZmFjdG9yeS5jcmVhdGVCdXR0b24oZm9vdGVyLCAiIiwgU1dULlBVU0gpOyAvLyROT04tTkxTLTEkCi0JCWRvQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWRvQnV0dG9uU2VsZWN0ZWQoKTsKLQkJCX0KLQkJfSk7Ci0JCWdkID0KLQkJCW5ldyBHcmlkRGF0YSgKLQkJCQlHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0NFTlRFUgotCQkJCQl8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7Ci0JCWdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlkb0J1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlDb21wb3NpdGUgYmF0Y2ggPSBmYWN0b3J5LmNyZWF0ZUNvbXBvc2l0ZShjb250YWluZXIpOwotCQlnbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJZ2xheW91dC5udW1Db2x1bW5zID0gMjsKLQkJZ2xheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWdsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJYmF0Y2guc2V0TGF5b3V0KGdsYXlvdXQpOwotCQl0ZCA9IG5ldyBUYWJsZURhdGEoKTsKLQkJdGQuY29sc3BhbiA9IDI7Ci0JCXRkLmFsaWduID0gVGFibGVEYXRhLkZJTEw7Ci0JCS8vdGQuZ3JhYkhvcml6b250YWwgPSB0cnVlOwotCQliYXRjaC5zZXRMYXlvdXREYXRhKHRkKTsKLQkJZ3JvdXBVcGRhdGVzTGFiZWwgPSBjcmVhdGVIZWFkaW5nKGJhdGNoLCBVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX0JBVENIKSk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJZ3JvdXBVcGRhdGVzTGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWFkZEJ1dHRvbiA9Ci0JCQlmYWN0b3J5LmNyZWF0ZUJ1dHRvbigKLQkJCQliYXRjaCwKLQkJCQlVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX0JBVENIX0lOU1RBTEwpLAotCQkJCVNXVC5DSEVDSyk7Ci0JCWFkZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpZiAoIWFkZEJsb2NrKQotCQkJCQlkb0FkZChhZGRCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQkJfQotCQl9KTsKLQkJYWRkQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUikpOwotCQlpdGVtc0xpbmsgPQotCQkJZmFjdG9yeS5jcmVhdGVTZWxlY3RhYmxlTGFiZWwoCi0JCQkJYmF0Y2gsCi0JCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9TRUxFQ1RFRF9VUERBVEVTKSk7Ci0JCWZhY3RvcnkudHVybkludG9IeXBlcmxpbmsoaXRlbXNMaW5rLCBuZXcgSHlwZXJsaW5rQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGxpbmtBY3RpdmF0ZWQoQ29udHJvbCBsaW5rKSB7Ci0JCQkJb3BlblVwZGF0ZUl0ZW1zKCk7Ci0JCQl9Ci0JCX0pOwotCQlpdGVtc0xpbmsuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSKSk7Ci0KLQkJLy9TV1RVdGlsLnNldEJ1dHRvbkRpbWVuc2lvbkhpbnQoZG9CdXR0b24pOwotCQlXb3JrYmVuY2hIZWxwLnNldEhlbHAoY29udGFpbmVyLCAib3JnLmVjbGlwc2UudXBkYXRlLnVpLkRldGFpbHNGb3JtIik7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRTZXBhcmF0b3IoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlDb21wb3NpdGUgbCA9IGZhY3RvcnkuY3JlYXRlQ29tcG9zaXRlU2VwYXJhdG9yKGNvbnRhaW5lcik7Ci0JCWwuc2V0QmFja2dyb3VuZChmYWN0b3J5LmdldEJvcmRlckNvbG9yKCkpOwotCQlUYWJsZURhdGEgdGQgPSBuZXcgVGFibGVEYXRhKCk7Ci0JCXRkLmNvbHNwYW4gPSAyOwotCQl0ZC5oZWlnaHRIaW50ID0gMTsKLQkJdGQuYWxpZ24gPSBUYWJsZURhdGEuRklMTDsKLQkJbC5zZXRMYXlvdXREYXRhKHRkKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgb3BlblVwZGF0ZUl0ZW1zKCkgewotCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShTV1RVdGlsLmdldFN0YW5kYXJkRGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IFVwZGF0ZVVJLmdldEFjdGl2ZVBhZ2UoKTsKLQkJCQkJSVZpZXdQYXJ0IHZpZXcgPSBwYWdlLmZpbmRWaWV3KFVwZGF0ZVBlcnNwZWN0aXZlLklEX0lURU1TKTsKLQkJCQkJaWYgKHZpZXcgIT0gbnVsbCkKLQkJCQkJCXBhZ2UuYnJpbmdUb1RvcCh2aWV3KTsKLQkJCQkJZWxzZSB7Ci0JCQkJCQlpbnB1dEJsb2NrID0gdHJ1ZTsKLQkJCQkJCXBhZ2Uuc2hvd1ZpZXcoVXBkYXRlUGVyc3BlY3RpdmUuSURfSVRFTVMpOwotCQkJCQkJaW5wdXRCbG9jayA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJCQlVcGRhdGVVSS5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleHBhbmRUbyhmaW5hbCBPYmplY3Qgb2JqKSB7Ci0JCWlmIChpbnB1dEJsb2NrKQotCQkJcmV0dXJuOwotCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShnZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElGZWF0dXJlKSB7Ci0JCQkJCWN1cnJlbnRBZGFwdGVyID0gbnVsbDsKLQkJCQkJY3VycmVudEZlYXR1cmUgPSAoSUZlYXR1cmUpIG9iajsKLQkJCQkJcmVmcmVzaCgpOwotCQkJCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgSUZlYXR1cmVBZGFwdGVyKSB7Ci0JCQkJCUlGZWF0dXJlQWRhcHRlciBhZGFwdGVyID0gKElGZWF0dXJlQWRhcHRlcikgb2JqOwotCQkJCQl0cnkgewotCQkJCQkJY3VycmVudEFkYXB0ZXIgPSBhZGFwdGVyOwotCQkJCQkJY3VycmVudEZlYXR1cmUgPSBhZGFwdGVyLmdldEZlYXR1cmUobnVsbCk7Ci0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJLy9VcGRhdGVVSS5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJCQljdXJyZW50RmVhdHVyZSA9Ci0JCQkJCQkJbmV3IE1pc3NpbmdGZWF0dXJlKAotCQkJCQkJCQlhZGFwdGVyLmdldFNpdGUoKSwKLQkJCQkJCQkJYWRhcHRlci5nZXRVUkwoKSk7Ci0JCQkJCX0gZmluYWxseSB7Ci0JCQkJCQlyZWZyZXNoKCk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQljdXJyZW50RmVhdHVyZSA9IG51bGw7Ci0JCQkJCWN1cnJlbnRBZGFwdGVyID0gbnVsbDsKLQkJCQkJcmVmcmVzaCgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzQ29uZmlndXJlZChJRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCUlTaXRlIHNpdGUgPSBmZWF0dXJlLmdldFNpdGUoKTsKLQkJSUNvbmZpZ3VyZWRTaXRlIGNzaXRlID0gc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJlZFNpdGUoKTsKLQkJaWYgKGNzaXRlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBjc2l0ZS5pc0NvbmZpZ3VyZWQoZmVhdHVyZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0SW5zdGFsbGVkVmVyc2lvblRleHQoSUZlYXR1cmUgZmVhdHVyZSkgewotCQlhbHJlYWR5SW5zdGFsbGVkID0gZmFsc2U7Ci0JCVZlcnNpb25lZElkZW50aWZpZXIgdmlkID0gZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7Ci0JCVBsdWdpblZlcnNpb25JZGVudGlmaWVyIHZlcnNpb24gPSB2aWQuZ2V0VmVyc2lvbigpOwotCQluZXdlclZlcnNpb24gPSBpbnN0YWxsZWRGZWF0dXJlcy5sZW5ndGggPiAwOwotCi0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW5zdGFsbGVkRmVhdHVyZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlGZWF0dXJlIGluc3RhbGxlZEZlYXR1cmUgPSBpbnN0YWxsZWRGZWF0dXJlc1tpXTsKLQkJCWJvb2xlYW4gZW5hYmxlZCA9IGlzQ29uZmlndXJlZChpbnN0YWxsZWRGZWF0dXJlKTsKLQkJCVZlcnNpb25lZElkZW50aWZpZXIgaXZpZCA9Ci0JCQkJaW5zdGFsbGVkRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7Ci0JCQlpZiAoYnVmLmxlbmd0aCgpID4gMCkKLQkJCQlidWYuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCi0JCQlQbHVnaW5WZXJzaW9uSWRlbnRpZmllciBpdmVyc2lvbiA9IGl2aWQuZ2V0VmVyc2lvbigpOwotCQkJYnVmLmFwcGVuZChpdmVyc2lvbi50b1N0cmluZygpKTsKLQkJCWlmICghZW5hYmxlZCkgewotCQkJCWJ1Zi5hcHBlbmQoIiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJ1Zi5hcHBlbmQoVXBkYXRlVUkuZ2V0U3RyaW5nKCJGZWF0dXJlUGFnZS5kaXNhYmxlZFZlcnNpb24iKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChpdmlkLmVxdWFscyh2aWQpKSB7Ci0JCQkJYWxyZWFkeUluc3RhbGxlZCA9IHRydWU7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChpdmVyc2lvbi5pc0dyZWF0ZXJPckVxdWFsVG8odmVyc2lvbikpCi0JCQkJCW5ld2VyVmVyc2lvbiA9IGZhbHNlOwotCQkJfQotCQl9Ci0JCWlmIChidWYubGVuZ3RoKCkgPiAwKSB7Ci0JCQlTdHJpbmcgdmVyc2lvblRleHQgPSBidWYudG9TdHJpbmcoKTsKLQkJCVVwZGF0ZU1vZGVsIG1vZGVsID0gVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldFVwZGF0ZU1vZGVsKCk7Ci0JCQlQZW5kaW5nQ2hhbmdlIGNoYW5nZSA9IG1vZGVsLmZpbmRSZWxhdGVkUGVuZGluZ0NoYW5nZShmZWF0dXJlKTsKLQkJCWlmIChjaGFuZ2UgIT0gbnVsbCkgewotCQkJCXJldHVybiBVcGRhdGVVSS5nZXRGb3JtYXR0ZWRNZXNzYWdlKAotCQkJCQlLRVlfUEVORElOR19WRVJTSU9OLAotCQkJCQl2ZXJzaW9uVGV4dCk7Ci0JCQl9IGVsc2UKLQkJCQlyZXR1cm4gdmVyc2lvblRleHQ7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlZnJlc2goKSB7Ci0JCUlGZWF0dXJlIGZlYXR1cmUgPSBjdXJyZW50RmVhdHVyZTsKLQotCQlpZiAoZmVhdHVyZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWluc3RhbGxlZEZlYXR1cmVzID0gVXBkYXRlVUkuZ2V0SW5zdGFsbGVkRmVhdHVyZXMoZmVhdHVyZSk7Ci0JCWlmIChpbnN0YWxsZWRGZWF0dXJlcy5sZW5ndGggPT0gMCkKLQkJCWluc3RhbGxlZEZlYXR1cmVzID0gVXBkYXRlVUkuZ2V0SW5zdGFsbGVkRmVhdHVyZXMoZmVhdHVyZSwgZmFsc2UpOwotCi0JCXNldEhlYWRpbmdUZXh0KGZlYXR1cmUuZ2V0TGFiZWwoKSk7Ci0JCXByb3ZpZGVyTGFiZWwuc2V0VGV4dChmZWF0dXJlLmdldFByb3ZpZGVyKCkpOwotCQl2ZXJzaW9uTGFiZWwuc2V0VGV4dCgKLQkJCWZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldFZlcnNpb24oKS50b1N0cmluZygpKTsKLQkJU3RyaW5nIGluc3RhbGxlZFZlcnNpb24gPSBnZXRJbnN0YWxsZWRWZXJzaW9uVGV4dChmZWF0dXJlKTsKLQkJaWYgKGluc3RhbGxlZFZlcnNpb24gPT0gbnVsbCkKLQkJCWluc3RhbGxlZFZlcnNpb24gPSBVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX05PVF9JTlNUQUxMRUQpOwotCQlpbnN0YWxsZWRWZXJzaW9uTGFiZWwuc2V0VGV4dChpbnN0YWxsZWRWZXJzaW9uKTsKLQkJbG9uZyBzaXplID0gZmVhdHVyZS5nZXREb3dubG9hZFNpemUoKTsKLQkJU3RyaW5nIHNpemVUZXh0OwotCQlpZiAoc2l6ZSAhPSAtMSkgewotCQkJU3RyaW5nIHN0ZXh0ID0gTG9uZy50b1N0cmluZyhzaXplKTsKLQkJCXNpemVUZXh0ID0gVXBkYXRlVUkuZ2V0Rm9ybWF0dGVkTWVzc2FnZShLRVlfU0laRV9WQUxVRSwgc3RleHQpOwotCQl9IGVsc2UgewotCQkJc2l6ZVRleHQgPSBVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX1VOS05PV05fU0laRV9WQUxVRSk7Ci0JCX0KLQkJc2l6ZUxhYmVsLnNldFRleHQoc2l6ZVRleHQpOwotCQllc3RpbWF0ZWRUaW1lLnNldFRleHQoZ2V0RXN0aW1hdGVkVGltZVRleHQoZmVhdHVyZSwgc2l6ZSkpOwotCi0JCWlmIChmZWF0dXJlLmdldERlc2NyaXB0aW9uKCkgIT0gbnVsbAotCQkJJiYgZmVhdHVyZS5nZXREZXNjcmlwdGlvbigpLmdldEFubm90YXRpb24oKSAhPSBudWxsKQotCQkJZGVzY3JpcHRpb25UZXh0LnNldFRleHQoZmVhdHVyZS5nZXREZXNjcmlwdGlvbigpLmdldEFubm90YXRpb24oKSk7Ci0JCWVsc2UKLQkJCWRlc2NyaXB0aW9uVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCUltYWdlIGxvZ29JbWFnZSA9IGxvYWRQcm92aWRlckltYWdlKGZlYXR1cmUpOwotCQlpZiAobG9nb0ltYWdlID09IG51bGwpCi0JCQlsb2dvSW1hZ2UgPSBwcm92aWRlckltYWdlOwotCQlpbWFnZUxhYmVsLnNldEltYWdlKGxvZ29JbWFnZSk7Ci0JCWluZm9MaW5rVVJMID0gbnVsbDsKLQkJaWYgKGZlYXR1cmUuZ2V0RGVzY3JpcHRpb24oKSAhPSBudWxsKQotCQkJaW5mb0xpbmtVUkwgPSBmZWF0dXJlLmdldERlc2NyaXB0aW9uKCkuZ2V0VVJMKCk7Ci0JCWluZm9MaW5rTGFiZWwuc2V0VmlzaWJsZShpbmZvTGlua1VSTCAhPSBudWxsKTsKLQotCQlzZXRPUyhmZWF0dXJlLmdldE9TKCkpOwotCQlzZXRXUyhmZWF0dXJlLmdldFdTKCkpOwotCQlzZXROTChmZWF0dXJlLmdldE5MKCkpOwotCQlzZXRBcmNoKGZlYXR1cmUuZ2V0T1NBcmNoKCkpOwotCi0JCWxpY2Vuc2VMaW5rLnNldEluZm8oZmVhdHVyZS5nZXRMaWNlbnNlKCkpOwotCQljb3B5cmlnaHRMaW5rLnNldEluZm8oZmVhdHVyZS5nZXRDb3B5cmlnaHQoKSk7Ci0JCXRoaXMucmVpbnN0YWxsQ29kZSA9IDA7Ci0KLQkJVXBkYXRlTW9kZWwgbW9kZWwgPSBVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0VXBkYXRlTW9kZWwoKTsKLQkJUGVuZGluZ0NoYW5nZSByZWxhdGVkSm9iID0KLQkJCW1vZGVsLmZpbmRSZWxhdGVkUGVuZGluZ0NoYW5nZShjdXJyZW50RmVhdHVyZSk7Ci0JCWRvQnV0dG9uLnNldFZpc2libGUoZ2V0RG9CdXR0b25WaXNpYmlsaXR5KGZhbHNlLCByZWxhdGVkSm9iKSk7Ci0JCWFkZEJ1dHRvbi5zZXRWaXNpYmxlKGdldERvQnV0dG9uVmlzaWJpbGl0eSh0cnVlLCByZWxhdGVkSm9iKSk7Ci0JCWl0ZW1zTGluay5zZXRWaXNpYmxlKGFkZEJ1dHRvbi5pc1Zpc2libGUoKSk7Ci0JCWdyb3VwVXBkYXRlc0xhYmVsLnNldFZpc2libGUoYWRkQnV0dG9uLmlzVmlzaWJsZSgpKTsKLQkJaWYgKGFkZEJ1dHRvbi5pc1Zpc2libGUoKSkgewotCQkJaWYgKHJlbGF0ZWRKb2IgIT0gbnVsbCkgewotCQkJCUlGZWF0dXJlIHJlbGF0ZWRGZWF0dXJlID0gcmVsYXRlZEpvYi5nZXRGZWF0dXJlKCk7Ci0JCQkJYWRkQnV0dG9uLnNldEVuYWJsZWQoCi0JCQkJCWN1cnJlbnRGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5lcXVhbHMoCi0JCQkJCQlyZWxhdGVkRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkpKTsKLQkJCX0gZWxzZQotCQkJCWFkZEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQl9Ci0JCWFkZEJsb2NrID0gdHJ1ZTsKLQkJYWRkQnV0dG9uLnNldFNlbGVjdGlvbigKLQkJCXJlbGF0ZWRKb2IgIT0gbnVsbCAmJiByZWxhdGVkSm9iLmlzUHJvY2Vzc2VkKCkgPT0gZmFsc2UpOwotCQlhZGRCbG9jayA9IGZhbHNlOwotCQl1cGRhdGVCdXR0b25UZXh0KG5ld2VyVmVyc2lvbik7Ci0JCXJlZmxvdygpOwotCQl1cGRhdGVTaXplKCk7Ci0JCSgoQ29tcG9zaXRlKSBnZXRDb250cm9sKCkpLnJlZHJhdygpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldEVzdGltYXRlZFRpbWVUZXh0KElGZWF0dXJlIGZlYXR1cmUsIGxvbmcgc2l6ZSkgewotCQlsb25nIGVzdGltYXRlID0gU2l0ZU1hbmFnZXIuZ2V0RXN0aW1hdGVkVHJhbnNmZXJSYXRlKGZlYXR1cmUuZ2V0VVJMKCkpOwotCQlTdHJpbmcgZXN0aW1hdGVGb3JtYXQgPSBudWxsOwotCQlpZiAoZXN0aW1hdGUgPj0gMCAmJiBzaXplICE9IC0xKSB7Ci0JCQlsb25nIG5ob3VycyA9IGVzdGltYXRlIC8gMzYwMDAwMDsKLQkJCWxvbmcgbm1pbnV0ZXMgPSBlc3RpbWF0ZSAlIDM2MDAwMDA7Ci0KLQkJCWlmIChuaG91cnMgPT0gMCAmJiBubWludXRlcyA9PSAwKSB7Ci0JCQkJZXN0aW1hdGVGb3JtYXQgPSBVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX01JTlVURV9FU1RJTUFURV9WQUxVRSk7Ci0JCQl9IGVsc2UgewotCQkJCVN0cmluZyBob3VycyA9IExvbmcudG9TdHJpbmcobmhvdXJzKTsKLQkJCQlTdHJpbmcgbWludXRlcyA9IExvbmcudG9TdHJpbmcobm1pbnV0ZXMpOwotCi0JCQkJZXN0aW1hdGVGb3JtYXQgPQotCQkJCQlVcGRhdGVVSS5nZXRGb3JtYXR0ZWRNZXNzYWdlKAotCQkJCQkJS0VZX0VTVElNQVRFX1ZBTFVFLAotCQkJCQkJbmV3IFN0cmluZ1tdIHsgaG91cnMsIG1pbnV0ZXMgfSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQllc3RpbWF0ZUZvcm1hdCA9IFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfVU5LTk9XTl9FU1RJTUFURV9WQUxVRSk7Ci0JCX0KLQkJcmV0dXJuIGVzdGltYXRlRm9ybWF0OwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBnZXREb0J1dHRvblZpc2liaWxpdHkoCi0JCWJvb2xlYW4gYWRkLAotCQlQZW5kaW5nQ2hhbmdlIHJlbGF0ZWRKb2IpIHsKLQkJaWYgKGN1cnJlbnRGZWF0dXJlIGluc3RhbmNlb2YgTWlzc2luZ0ZlYXR1cmUpIHsKLQkJCU1pc3NpbmdGZWF0dXJlIG1mID0gKE1pc3NpbmdGZWF0dXJlKSBjdXJyZW50RmVhdHVyZTsKLQkJCWlmIChtZi5pc09wdGlvbmFsKCkgJiYgbWYuZ2V0T3JpZ2luYXRpbmdTaXRlVVJMKCkgIT0gbnVsbCkKLQkJCQlyZXR1cm4gYWRkID8gZmFsc2UgOiB0cnVlOwotCQkJZWxzZQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChjdXJyZW50QWRhcHRlciA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWJvb2xlYW4gbG9jYWxDb250ZXh0ID0gY3VycmVudEFkYXB0ZXIgaW5zdGFuY2VvZiBJQ29uZmlndXJlZFNpdGVDb250ZXh0OwotCi0JCWlmIChjdXJyZW50QWRhcHRlci5pc0luY2x1ZGVkKCkpIHsKLQkJCWlmICghbG9jYWxDb250ZXh0KQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmICghY3VycmVudEFkYXB0ZXIuaXNPcHRpb25hbCgpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChsb2NhbENvbnRleHQpIHsKLQkJCUlDb25maWd1cmVkU2l0ZUNvbnRleHQgY29udGV4dCA9Ci0JCQkJKElDb25maWd1cmVkU2l0ZUNvbnRleHQpIGN1cnJlbnRBZGFwdGVyOwotCQkJaWYgKCFjb250ZXh0LmdldEluc3RhbGxDb25maWd1cmF0aW9uKCkuaXNDdXJyZW50KCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKGNvbnRleHQuZ2V0Q29uZmlndXJlZFNpdGUoKS5pc0VuYWJsZWQoKSA9PSBmYWxzZSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAocmVsYXRlZEpvYiAhPSBudWxsKSB7Ci0JCQkvKmlmIChhZGQpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJKi8KLQkJCWlmIChyZWxhdGVkSm9iLmlzUHJvY2Vzc2VkKCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKGxvY2FsQ29udGV4dCkgewotCQkJSUNvbmZpZ3VyZWRTaXRlQ29udGV4dCBjb250ZXh0ID0KLQkJCQkoSUNvbmZpZ3VyZWRTaXRlQ29udGV4dCkgY3VycmVudEFkYXB0ZXI7Ci0JCQlpZiAoIWNvbnRleHQuZ2V0SW5zdGFsbENvbmZpZ3VyYXRpb24oKS5pc0N1cnJlbnQoKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBmb3VuZCBvbiBhIHJlbW90ZSBzaXRlCi0JCQkvLyBDYW5ub3QgaW5zdGFsbCBmZWF0dXJlIHdpdGhvdXQgYSBsaWNlbnNlCi0JCQkvKiBDb21tZW50aW5nIC0gbGljZW5zZSBpcyBub3cgY2hlY2tlZCBpbgotCQkJICogQWN0aXZpdHlDb25zdHJhaW50cyAtIGJ1ZyAjMzM1ODIKLQotCQkJaWYgKCFVcGRhdGVNb2RlbC5oYXNMaWNlbnNlKGN1cnJlbnRGZWF0dXJlKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkqLwotCQl9Ci0JCS8vIFJhbmRvbSBzaXRlIGZlYXR1cmUKLQkJaWYgKGFscmVhZHlJbnN0YWxsZWQpIHsKLQkJCWlmIChpc0Jyb2tlbkZlYXR1cmVVcGRhdGUoKSkgewotCQkJCXJlaW5zdGFsbENvZGUgPSBSRVBBSVI7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlpZiAoaXNPcHRpb25hbEZlYXR1cmVJbnN0YWxsKCkpIHsKLQkJCQlyZWluc3RhbGxDb2RlID0gQ0hBTkdFOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCS8vIE5vdCBpbnN0YWxsZWQgLSBjaGVjayBpZiB0aGVyZSBhcmUgb3RoZXIgCi0JCS8vIGZlYXR1cmVzIHdpdGggdGhpcyBJRCB0aGF0IGFyZSBpbnN0YWxsZWQKLQkJLy8gYW5kIHRoYXQgYXJlIG5ld2VyIHRoYW4gdGhpcyBvbmUKLQkJaWYgKGluc3RhbGxlZEZlYXR1cmVzLmxlbmd0aCA+IDAgJiYgIW5ld2VyVmVyc2lvbikKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzQnJva2VuRmVhdHVyZVVwZGF0ZSgpIHsKLQkJaWYgKGluc3RhbGxlZEZlYXR1cmVzLmxlbmd0aCAhPSAxKQotCQkJcmV0dXJuIGZhbHNlOwotCQlJRmVhdHVyZSBpbnN0YWxsZWRGZWF0dXJlID0gaW5zdGFsbGVkRmVhdHVyZXNbMF07Ci0JCWlmIChpbnN0YWxsZWRGZWF0dXJlCi0JCQkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpCi0JCQkuZXF1YWxzKGN1cnJlbnRGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSkpIHsKLQkJCXJldHVybiBpc0Jyb2tlbihpbnN0YWxsZWRGZWF0dXJlKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzQnJva2VuKElGZWF0dXJlIGZlYXR1cmUpIHsKLQkJdHJ5IHsKLQkJCUlTdGF0dXMgc3RhdHVzID0KLQkJCQlTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKS5nZXRGZWF0dXJlU3RhdHVzKGZlYXR1cmUpOwotCQkJaWYgKHN0YXR1cyAhPSBudWxsICYmIHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNPcHRpb25hbEZlYXR1cmVJbnN0YWxsKCkgewotCQlyZXR1cm4gaGFzTWlzc2luZ09wdGlvbmFsRmVhdHVyZXMoaW5zdGFsbGVkRmVhdHVyZXNbMF0pOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBoYXNNaXNzaW5nT3B0aW9uYWxGZWF0dXJlcyhJRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCXRyeSB7Ci0JCQlJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlIHJlZnNbXSA9Ci0JCQkJZmVhdHVyZS5nZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZnMubGVuZ3RoOyBpKyspIHsKLQkJCQlJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlIHJlZiA9IHJlZnNbaV07Ci0KLQkJCQl0cnkgewotCQkJCQlJRmVhdHVyZSBjaGlsZCA9IHJlZi5nZXRGZWF0dXJlKG51bGwpOwotCi0JCQkJCS8vIG5vdCBtaXNzaW5nIC0gdHJ5IGNoaWxkcmVuCi0JCQkJCWlmIChoYXNNaXNzaW5nT3B0aW9uYWxGZWF0dXJlcyhjaGlsZCkpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gbWlzc2luZyAtIGlmIG9wdGlvbmFsLCByZXR1cm4gdHJ1ZQotCQkJCQlpZiAocmVmLmlzT3B0aW9uYWwoKSkKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBwcm9ibGVtIHdpdGggdGhlIGZlYXR1cmUgaXRzZWxmCi0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBnZXRVbmluc3RhbGxCdXR0b25WaXNpYmlsaXR5KCkgewotCQkvKgotCQkgKiBXZSB3aWxsIG5vdCBhbGxvdyB1bmluc3RhbGxzIGZvciBub3cuCi0JCWlmIChjdXJyZW50RmVhdHVyZSBpbnN0YW5jZW9mIE1pc3NpbmdGZWF0dXJlKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoY3VycmVudEFkYXB0ZXIgPT0gbnVsbCB8fCBjdXJyZW50QWRhcHRlci5pc0luY2x1ZGVkKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVVwZGF0ZU1vZGVsIG1vZGVsID0gVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldFVwZGF0ZU1vZGVsKCk7Ci0JCWlmIChtb2RlbC5pc1BlbmRpbmcoY3VycmVudEZlYXR1cmUpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoY3VycmVudEFkYXB0ZXIgaW5zdGFuY2VvZiBJQ29uZmlndXJlZFNpdGVDb250ZXh0KSB7Ci0JCQlib29sZWFuIGNvbmZpZ3VyZWQgPSBpc0NvbmZpZ3VyZWQoKTsKLQkJCXJldHVybiAhY29uZmlndXJlZDsKLQkJfQotCQkqLwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzQ29uZmlndXJlZCgpIHsKLQkJaWYgKGN1cnJlbnRBZGFwdGVyIGluc3RhbmNlb2YgSUNvbmZpZ3VyZWRTaXRlQ29udGV4dCkgewotCQkJSUNvbmZpZ3VyZWRTaXRlQ29udGV4dCBjb250ZXh0ID0KLQkJCQkoSUNvbmZpZ3VyZWRTaXRlQ29udGV4dCkgY3VycmVudEFkYXB0ZXI7Ci0JCQlJQ29uZmlndXJlZFNpdGUgY3NpdGUgPSBjb250ZXh0LmdldENvbmZpZ3VyZWRTaXRlKCk7Ci0JCQlJRmVhdHVyZVJlZmVyZW5jZSBmcmVmID0KLQkJCQljc2l0ZS5nZXRTaXRlKCkuZ2V0RmVhdHVyZVJlZmVyZW5jZShjdXJyZW50RmVhdHVyZSk7Ci0JCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGNmZWF0dXJlcyA9IGNzaXRlLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjZmVhdHVyZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoY2ZlYXR1cmVzW2ldLmVxdWFscyhmcmVmKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVCdXR0b25UZXh0KGJvb2xlYW4gdXBkYXRlKSB7Ci0JCWlmIChyZWluc3RhbGxDb2RlID09IFJFUEFJUikgewotCQkJZG9CdXR0b24uc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX0RPX1JFUEFJUikpOwotCQkJYWRkQnV0dG9uLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9CQVRDSF9SRVBBSVIpKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAocmVpbnN0YWxsQ29kZSA9PSBDSEFOR0UpIHsKLQkJCWRvQnV0dG9uLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9ET19DSEFOR0UpKTsKLQkJCWFkZEJ1dHRvbi5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfQkFUQ0hfQ0hBTkdFKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGN1cnJlbnRGZWF0dXJlIGluc3RhbmNlb2YgTWlzc2luZ0ZlYXR1cmUpIHsKLQkJCU1pc3NpbmdGZWF0dXJlIG1mID0gKE1pc3NpbmdGZWF0dXJlKSBjdXJyZW50RmVhdHVyZTsKLQkJCWlmIChtZi5pc09wdGlvbmFsKCkgJiYgbWYuZ2V0T3JpZ2luYXRpbmdTaXRlVVJMKCkgIT0gbnVsbCkgewotCQkJCWRvQnV0dG9uLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9ET19JTlNUQUxMKSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCWlmIChjdXJyZW50QWRhcHRlciBpbnN0YW5jZW9mIElDb25maWd1cmVkU2l0ZUNvbnRleHQpIHsKLQkJCWJvb2xlYW4gY29uZmlndXJlZCA9IGlzQ29uZmlndXJlZCgpOwotCQkJaWYgKGNvbmZpZ3VyZWQpIHsKLQkJCQlkb0J1dHRvbi5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfRE9fVU5DT05GSUdVUkUpKTsKLQkJCQlhZGRCdXR0b24uc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX0JBVENIX1VOQ09ORklHVVJFKSk7Ci0JCQl9IGVsc2UgewotCQkJCWRvQnV0dG9uLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9ET19DT05GSUdVUkUpKTsKLQkJCQlhZGRCdXR0b24uc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX0JBVENIX0NPTkZJR1VSRSkpOwotCQkJfQotCQl9IGVsc2UgaWYgKHVwZGF0ZSAmJiAhYWxyZWFkeUluc3RhbGxlZCkgewotCQkJZG9CdXR0b24uc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX0RPX1VQREFURSkpOwotCQkJYWRkQnV0dG9uLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9CQVRDSF9VUERBVEUpKTsKLQkJfSBlbHNlIHsKLQkJCWRvQnV0dG9uLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9ET19JTlNUQUxMKSk7Ci0JCQlhZGRCdXR0b24uc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX0JBVENIX0lOU1RBTEwpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgSW1hZ2UgbG9hZFByb3ZpZGVySW1hZ2UoSUZlYXR1cmUgZmVhdHVyZSkgewotCQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0JCVVSTCBpbWFnZVVSTCA9IGZlYXR1cmUuZ2V0SW1hZ2UoKTsKLQkJaWYgKGltYWdlVVJMID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJLy8gY2hlY2sgdGFibGUKLQkJaW1hZ2UgPSAoSW1hZ2UpIGltYWdlQ2FjaGUuZ2V0KGltYWdlVVJMKTsKLQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCUltYWdlRGVzY3JpcHRvciBpZCA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKGltYWdlVVJMKTsKLQkJCXRyeSB7Ci0JCQkJaW1hZ2UgPSBpZC5jcmVhdGVJbWFnZSgpOwotCQkJfSBjYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKLQkJCQlpbWFnZSA9IG51bGw7Ci0JCQl9Ci0JCQlpZiAoaW1hZ2UgIT0gbnVsbCkKLQkJCQlpbWFnZUNhY2hlLnB1dChpbWFnZVVSTCwgaW1hZ2UpOwotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVmbG93KCkgewotCQl2ZXJzaW9uTGFiZWwuZ2V0UGFyZW50KCkubGF5b3V0KHRydWUpOwotCQlkb0J1dHRvbi5nZXRQYXJlbnQoKS5sYXlvdXQodHJ1ZSk7Ci0JCWltYWdlTGFiZWwuZ2V0UGFyZW50KCkubGF5b3V0KHRydWUpOwotCQkoKENvbXBvc2l0ZSkgZ2V0Q29udHJvbCgpKS5sYXlvdXQodHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldE9TKFN0cmluZyBvcykgewotCQlpZiAob3MgPT0gbnVsbCkKLQkJCW9zTGFiZWwuc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoIkZlYXR1cmVQYWdlLmFsbCIpKTsgLy8kTk9OLU5MUy0xJAotCQllbHNlIHsKLQkJCVN0cmluZ1tdIGFycmF5ID0gZ2V0VG9rZW5zKG9zKTsKLQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGkgPiAwKQotCQkJCQlidWYuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnVmLmFwcGVuZChtYXBPUyhhcnJheVtpXSkpOwotCQkJfQotCQkJb3NMYWJlbC5zZXRUZXh0KGJ1Zi50b1N0cmluZygpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgU3RyaW5nIG1hcE9TKFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIGtleTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBtYXBXUyhTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBrZXk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgbWFwQXJjaChTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBrZXk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgbWFwTkwoU3RyaW5nIG5sKSB7Ci0JCVN0cmluZyBsYW5ndWFnZSwgY291bnRyeTsKLQotCQlpbnQgbG9jID0gbmwuaW5kZXhPZignXycpOwotCQlpZiAobG9jICE9IC0xKSB7Ci0JCQlsYW5ndWFnZSA9IG5sLnN1YnN0cmluZygwLCBsb2MpOwotCQkJY291bnRyeSA9IG5sLnN1YnN0cmluZyhsb2MgKyAxKTsKLQkJfSBlbHNlIHsKLQkJCWxhbmd1YWdlID0gbmw7Ci0JCQljb3VudHJ5ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlMb2NhbGUgbG9jYWxlID0gbmV3IExvY2FsZShsYW5ndWFnZSwgY291bnRyeSk7Ci0JCXJldHVybiBsb2NhbGUuZ2V0RGlzcGxheU5hbWUoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0V1MoU3RyaW5nIHdzKSB7Ci0JCWlmICh3cyA9PSBudWxsKQotCQkJd3NMYWJlbC5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZygiRmVhdHVyZVBhZ2UuYWxsIikpOyAvLyROT04tTkxTLTEkCi0JCWVsc2UgewotCQkJU3RyaW5nW10gYXJyYXkgPSBnZXRUb2tlbnMod3MpOwotCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoaSA+IDApCi0JCQkJCWJ1Zi5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlidWYuYXBwZW5kKG1hcFdTKGFycmF5W2ldKSk7Ci0JCQl9Ci0JCQl3c0xhYmVsLnNldFRleHQoYnVmLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldEFyY2goU3RyaW5nIGFyY2gpIHsKLQkJaWYgKGFyY2ggPT0gbnVsbCkKLQkJCWFyY2hMYWJlbC5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZygiRmVhdHVyZVBhZ2UuYWxsIikpOyAvLyROT04tTkxTLTEkCi0JCWVsc2UgewotCQkJU3RyaW5nW10gYXJyYXkgPSBnZXRUb2tlbnMoYXJjaCk7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgewotCQkJCWlmIChpID4gMCkKLQkJCQkJYnVmLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJ1Zi5hcHBlbmQobWFwQXJjaChhcnJheVtpXSkpOwotCQkJfQotCQkJYXJjaExhYmVsLnNldFRleHQoYnVmLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldE5MKFN0cmluZyBubCkgewotCQlpZiAobmwgPT0gbnVsbCkKLQkJCW5sTGFiZWwuc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoIkZlYXR1cmVQYWdlLmFsbCIpKTsgLy8kTk9OLU5MUy0xJAotCQllbHNlIHsKLQkJCVN0cmluZ1tdIGFycmF5ID0gZ2V0VG9rZW5zKG5sKTsKLQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGkgPiAwKQotCQkJCQlidWYuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnVmLmFwcGVuZChtYXBOTChhcnJheVtpXSkpOwotCQkJfQotCQkJbmxMYWJlbC5zZXRUZXh0KGJ1Zi50b1N0cmluZygpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgU3RyaW5nW10gZ2V0VG9rZW5zKFN0cmluZyBzb3VyY2UpIHsKLQkJVmVjdG9yIHJlc3VsdCA9IG5ldyBWZWN0b3IoKTsKLQkJU3RyaW5nVG9rZW5pemVyIHN0b2sgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHNvdXJjZSwgIiwiKTsgLy8kTk9OLU5MUy0xJAotCQl3aGlsZSAoc3Rvay5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCVN0cmluZyB0b2sgPSBzdG9rLm5leHRUb2tlbigpOwotCQkJcmVzdWx0LmFkZCh0b2spOwotCQl9Ci0JCXJldHVybiAoU3RyaW5nW10pIHJlc3VsdC50b0FycmF5KG5ldyBTdHJpbmdbcmVzdWx0LnNpemUoKV0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBvcGVuVVJMKGZpbmFsIFN0cmluZyB1cmwpIHsKLQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCURldGFpbHNWaWV3LnNob3dVUkwodXJsKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRvQWRkKGJvb2xlYW4gc2VsZWN0aW9uKSB7Ci0JCVVwZGF0ZU1vZGVsIG1vZGVsID0gVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldFVwZGF0ZU1vZGVsKCk7Ci0JCWlmIChzZWxlY3Rpb24pIHsKLQkJCWludCBtb2RlID0gZ2V0Q3VycmVudEpvYlR5cGUoKTsKLQkJCVBlbmRpbmdDaGFuZ2Ugam9iID0gY3JlYXRlUGVuZGluZ0NoYW5nZShtb2RlKTsKLQkJCWlmICghY2hlY2tFbmFibGVkRHVwbGljYXRlcyhqb2IpKSB7Ci0JCQkJYWRkQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJbW9kZWwuYWRkUGVuZGluZ0NoYW5nZShqb2IpOwotCQl9IGVsc2UgewotCQkJUGVuZGluZ0NoYW5nZSBqb2IgPSBtb2RlbC5maW5kUmVsYXRlZFBlbmRpbmdDaGFuZ2UoY3VycmVudEZlYXR1cmUpOwotCQkJaWYgKGpvYiAhPSBudWxsKQotCQkJCW1vZGVsLnJlbW92ZVBlbmRpbmdDaGFuZ2Uoam9iKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBkb1VuaW5zdGFsbCgpIHsKLQkJZXhlY3V0ZUpvYihQZW5kaW5nQ2hhbmdlLlVOSU5TVEFMTCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGV4ZWN1dGVKb2IoaW50IG1vZGUpIHsKLQkJaWYgKGN1cnJlbnRGZWF0dXJlICE9IG51bGwpIHsKLQkJCVBlbmRpbmdDaGFuZ2Ugam9iID0gY3JlYXRlUGVuZGluZ0NoYW5nZShtb2RlKTsKLQkJCXRvdWNoQ2hpbGRyZW4oZ2V0Q29udHJvbCgpLmdldFNoZWxsKCksIGN1cnJlbnRGZWF0dXJlKTsKLQkJCWV4ZWN1dGVKb2IoZ2V0Q29udHJvbCgpLmdldFNoZWxsKCksIGpvYiwgdHJ1ZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZXhlY3V0ZU9wdGlvbmFsSW5zdGFsbChNaXNzaW5nRmVhdHVyZSBtZikgewotCQlWZXJzaW9uZWRJZGVudGlmaWVyIHZpZCA9IG1mLmdldFZlcnNpb25lZElkZW50aWZpZXIoKTsKLQkJVVJMIHNpdGVVUkwgPSBtZi5nZXRPcmlnaW5hdGluZ1NpdGVVUkwoKTsKLQkJSUNvbmZpZ3VyZWRTaXRlIHRhcmdldFNpdGUgPSBudWxsOwotCQlpZiAobWYuZ2V0UGFyZW50KCkgIT0gbnVsbCkgewotCQkJSVNpdGUgcHNpdGUgPSBtZi5nZXRQYXJlbnQoKS5nZXRTaXRlKCk7Ci0JCQl0YXJnZXRTaXRlID0gcHNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyZWRTaXRlKCk7Ci0JCX0KLQkJSUZlYXR1cmUgZmVhdHVyZSA9Ci0JCQlmZXRjaEZlYXR1cmVGcm9tU2VydmVyKGdldENvbnRyb2woKS5nZXRTaGVsbCgpLCBzaXRlVVJMLCB2aWQpOwotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlQZW5kaW5nQ2hhbmdlIGpvYiA9IG5ldyBQZW5kaW5nQ2hhbmdlKGZlYXR1cmUsIHRhcmdldFNpdGUpOwotCQkJZXhlY3V0ZUpvYihnZXRDb250cm9sKCkuZ2V0U2hlbGwoKSwgam9iLCB0cnVlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUZlYXR1cmUgZmV0Y2hGZWF0dXJlRnJvbVNlcnZlcigKLQkJU2hlbGwgc2hlbGwsCi0JCWZpbmFsIFVSTCBzaXRlVVJMLAotCQlmaW5hbCBWZXJzaW9uZWRJZGVudGlmaWVyIHZpZCkgewotCQkvLyBMb2NhdGUgcmVtb3RlIHNpdGUsIGZpbmQgdGhlIG9wdGlvbmFsIGZlYXR1cmUKLQkJLy8gYW5kIGluc3RhbGwgaXQKLQotCQlmaW5hbCBJRmVhdHVyZVtdIHJlc3VsdCA9IG5ldyBJRmVhdHVyZVsxXTsKLQkJZmluYWwgQ29yZUV4Y2VwdGlvbltdIGV4Y2VwdGlvbiA9IG5ldyBDb3JlRXhjZXB0aW9uWzFdOwotCQlmaW5hbCBib29sZWFuIGFib3J0ZWRbXSA9IG5ldyBib29sZWFuWzFdOwotCQlhYm9ydGVkWzBdID0gZmFsc2U7Ci0JCQotCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3AgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQkJCXRyeSB7Ci0JCQkJCW1vbml0b3IuYmVnaW5UYXNrKFVwZGF0ZVVJLmdldFN0cmluZygiRGV0YWlsc0Zvcm0ubG9jYXRpbmdGZWF0dXJlIiksIDMpOyAvLyROT04tTkxTLTEkCi0JCQkJCUlTaXRlIHNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKHNpdGVVUkwsIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMSkpOwotCQkJCQlpZiAoc2l0ZT09bnVsbCB8fCBtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCQkJYWJvcnRlZFswXSA9IHRydWU7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0gCi0JCQkJCUlGZWF0dXJlUmVmZXJlbmNlW10gcmVmcyA9IHNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJCQkJcmVzdWx0WzBdID0gZmluZEZlYXR1cmUodmlkLCByZWZzLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEpKTsKLQkJCQkJaWYgKHJlc3VsdFswXSE9bnVsbCkgewotCQkJCQkJbW9uaXRvci5zZXRUYXNrTmFtZShVcGRhdGVVSS5nZXRTdHJpbmcoIkRldGFpbHNGb3JtLmRvd25sb2FkaW5nSW5mbyIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJdG91Y2hGZWF0dXJlQ2hpbGRyZW4ocmVzdWx0WzBdLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEpKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQl0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihlKTsKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJCi0JCVByb2dyZXNzTW9uaXRvckRpYWxvZyBwbWQgPSBuZXcgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKHNoZWxsKTsKLQkJdHJ5IHsKLQkJCXBtZC5ydW4odHJ1ZSwgdHJ1ZSwgb3ApOwotCQl9Ci0JCWNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQljYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlVcGRhdGVVSS5sb2dFeGNlcHRpb24oZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJU3RhdHVzIHN0YXR1cyA9IG51bGw7Ci0JCWlmIChyZXN1bHRbMF0gIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdFswXTsKLQkJfSBlbHNlIGlmICghYWJvcnRlZFswXSkgewotCQkJU3RyaW5nIG1lc3NhZ2UgPQotCQkJCVVwZGF0ZVVJLmdldEZvcm1hdHRlZE1lc3NhZ2UoCi0JCQkJCUtFWV9PUFRJT05BTF9JTlNUQUxMX01FU1NBR0UsCi0JCQkJCXNpdGVVUkwudG9TdHJpbmcoKSk7Ci0JCQlzdGF0dXMgPQotCQkJCW5ldyBTdGF0dXMoCi0JCQkJCUlTdGF0dXMuRVJST1IsCi0JCQkJCVVwZGF0ZVVJLlBMVUdJTl9JRCwKLQkJCQkJSVN0YXR1cy5PSywKLQkJCQkJbWVzc2FnZSwKLQkJCQkJbnVsbCk7Ci0JCX0KLQkJaWYgKHN0YXR1cyAhPSBudWxsKSB7Ci0JCQkvLyBTaG93IGVycm9yIGRpYWxvZwotCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKAotCQkJCXNoZWxsLAotCQkJCVVwZGF0ZVVJLmdldFN0cmluZyhLRVlfT1BUSU9OQUxfSU5TVEFMTF9USVRMRSksCi0JCQkJbnVsbCwKLQkJCQlzdGF0dXMpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgc3RhdGljIElGZWF0dXJlIGZpbmRGZWF0dXJlKAotCQlWZXJzaW9uZWRJZGVudGlmaWVyIHZpZCwKLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSByZWZzLAotCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCi0JCW1vbml0b3IuYmVnaW5UYXNrKCIiLCByZWZzLmxlbmd0aCoyKTsgLy8kTk9OLU5MUy0xJAotCQkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmcy5sZW5ndGg7IGkrKykgewotCQkJSUZlYXR1cmVSZWZlcmVuY2UgcmVmID0gcmVmc1tpXTsKLQkJCXRyeSB7Ci0JCQkJVmVyc2lvbmVkSWRlbnRpZmllciByZWZWaWQgPSByZWYuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOwotCQkJCWlmIChyZWZWaWQuZXF1YWxzKHZpZCkpIHsKLQkJCQkJcmV0dXJuIHJlZi5nZXRGZWF0dXJlKG51bGwpOwotCQkJCX0KLQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQkvLyBUcnkgY2hpbGRyZW4KLQkJCQlJRmVhdHVyZSBmZWF0dXJlID0gcmVmLmdldEZlYXR1cmUobnVsbCk7Ci0JCQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBpcmVmcyA9Ci0JCQkJCWZlYXR1cmUuZ2V0SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpOwotCQkJCUlGZWF0dXJlIHJlc3VsdCA9IGZpbmRGZWF0dXJlKHZpZCwgaXJlZnMsIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMSkpOwotCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgdG91Y2hDaGlsZHJlbihTaGVsbCBzaGVsbCwgZmluYWwgSUZlYXR1cmUgZmVhdHVyZSkgewotCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3AgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCW1vbml0b3IuYmVnaW5UYXNrKFVwZGF0ZVVJLmdldFN0cmluZygiRGV0YWlsc0Zvcm0uZG93bmxvYWRpbmdJbmNsdWRlZCIpLCAxKTsgLy8kTk9OLU5MUy0xJAotCQkJCXRyeSB7Ci0JCQkJCXRvdWNoRmVhdHVyZUNoaWxkcmVuKGZlYXR1cmUsIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMSkpOwotCQkJCX0KLQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIGlnbm9yZQotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQl0cnkgewotCQkJUHJvZ3Jlc3NNb25pdG9yRGlhbG9nIHBtZCA9IG5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2coc2hlbGwpOwotCQkJcG1kLnJ1bih0cnVlLCBmYWxzZSwgb3ApOwotCQl9Ci0JCWNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJfQotCQljYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgdG91Y2hGZWF0dXJlQ2hpbGRyZW4oSUZlYXR1cmUgZmVhdHVyZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlGZWF0dXJlUmVmZXJlbmNlW10gaXJlZnMgPQotCQkJZmVhdHVyZS5nZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCWlmIChpcmVmcy5sZW5ndGg+MCkgewotCQkJbW9uaXRvci5iZWdpblRhc2soIiIsIGlyZWZzLmxlbmd0aCoyKTsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChpbnQgaT0wOyBpPGlyZWZzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUZlYXR1cmVSZWZlcmVuY2UgaXJlZiA9IGlyZWZzW2ldOwotCQkJCUlGZWF0dXJlIGNoaWxkID0gaXJlZi5nZXRGZWF0dXJlKG51bGwpOwotCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCXRvdWNoRmVhdHVyZUNoaWxkcmVuKGNoaWxkLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEpKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCW1vbml0b3IuYmVnaW5UYXNrKCIiLCAxKTsgLy8kTk9OLU5MUy0xJAotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSW5Qcm9ncmVzcygpIHsKLQkJcmV0dXJuIGluUHJvZ3Jlc3M7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGV4ZWN1dGVKb2IoCi0JCVNoZWxsIHNoZWxsLAotCQlmaW5hbCBQZW5kaW5nQ2hhbmdlIGpvYiwKLQkJZmluYWwgYm9vbGVhbiBuZWVkTGljZW5zZVBhZ2UpIHsKLQkJaWYgKGluUHJvZ3Jlc3MpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWluUHJvZ3Jlc3MgPSB0cnVlOwotCQkKLQkJSVN0YXR1cyB2YWxpZGF0aW9uU3RhdHVzID0KLQkJCUFjdGl2aXR5Q29uc3RyYWludHMudmFsaWRhdGVQZW5kaW5nQ2hhbmdlKGpvYik7Ci0JCWlmICh2YWxpZGF0aW9uU3RhdHVzICE9IG51bGwpIHsKLQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcigKLQkJCQlVcGRhdGVVSS5nZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpLAotCQkJCW51bGwsCi0JCQkJbnVsbCwKLQkJCQl2YWxpZGF0aW9uU3RhdHVzKTsKLQkJCWluUHJvZ3Jlc3MgPSBmYWxzZTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoIWNoZWNrRW5hYmxlZER1cGxpY2F0ZXMoam9iKSkgewotCQkJaW5Qcm9ncmVzcyA9IGZhbHNlOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKGpvYi5nZXRKb2JUeXBlKCkgPT0gUGVuZGluZ0NoYW5nZS5VTkNPTkZJR1VSRQotCQkJJiYgam9iLmdldEZlYXR1cmUoKS5pc1BhdGNoKCkpIHsKLQkJCXVuY29uZmlndXJlUGF0Y2goc2hlbGwsIGpvYi5nZXRGZWF0dXJlKCkpOwotCQkJaW5Qcm9ncmVzcyA9IGZhbHNlOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKHNoZWxsLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUluc3RhbGxXaXphcmQgd2l6YXJkID0gbmV3IEluc3RhbGxXaXphcmQoam9iLCBuZWVkTGljZW5zZVBhZ2UpOwotCQkJCVdpemFyZERpYWxvZyBkaWFsb2cgPQotCQkJCQluZXcgSW5zdGFsbFdpemFyZERpYWxvZygKLQkJCQkJCVVwZGF0ZVVJLmdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCksCi0JCQkJCQl3aXphcmQpOwotCQkJCWRpYWxvZy5jcmVhdGUoKTsKLQkJCQlkaWFsb2cuZ2V0U2hlbGwoKS5zZXRTaXplKDYwMCwgNTAwKTsKLQkJCQlkaWFsb2cub3BlbigpOwotCQkJCWluUHJvZ3Jlc3MgPSBmYWxzZTsKLQkJCQlpZiAod2l6YXJkLmlzU3VjY2Vzc2Z1bEluc3RhbGwoKSkKLQkJCQkJVXBkYXRlVUkuaW5mb3JtUmVzdGFydE5lZWRlZCgpOwotCQkJfQotCQl9KTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgdW5jb25maWd1cmVQYXRjaChTaGVsbCBzaGVsbCwgSUZlYXR1cmUgZmVhdHVyZSkgewotCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnID0KLQkJCVVwZGF0ZVVJLmdldEJhY2t1cENvbmZpZ3VyYXRpb25Gb3IoZmVhdHVyZSk7Ci0JCWlmIChjb25maWcgPT0gbnVsbCkgewotCQkJU3RyaW5nIG1lc3NhZ2UgPQotCQkJCVVwZGF0ZVVJLmdldFN0cmluZygiRGV0YWlsc0Zvcm0uZmVhdHVyZUFQYXRjaCIpOyAvLyROT04tTkxTLTEkCi0JCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgVXBkYXRlVUkuZ2V0U3RyaW5nKCJEZXRhaWxzRm9ybS5kaXNhYmxlRmVhdHVyZS50aXRsZSIpLCBtZXNzYWdlKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuOwotCQl9Ci0JCXRyeSB7Ci0JCQlJTG9jYWxTaXRlIGxvY2FsU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpOwotCQkJYm9vbGVhbiBzdWNjZXNzID0gUmV2ZXJ0U2VjdGlvbi5wZXJmb3JtUmV2ZXJ0KGNvbmZpZywgZmFsc2UsIGZhbHNlKTsKLQkJCWlmIChzdWNjZXNzKSB7Ci0JCQkJbG9jYWxTaXRlLnJlbW92ZUZyb21QcmVzZXJ2ZWRDb25maWd1cmF0aW9ucyhjb25maWcpOwotCQkJCWxvY2FsU2l0ZS5zYXZlKCk7Ci0JCQkJVXBkYXRlVUkuaW5mb3JtUmVzdGFydE5lZWRlZCgpOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVVwZGF0ZVVJLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBkb0J1dHRvblNlbGVjdGVkKCkgewotCQlpZiAoY3VycmVudEZlYXR1cmUgIT0gbnVsbCkgewotCQkJaWYgKGN1cnJlbnRGZWF0dXJlIGluc3RhbmNlb2YgTWlzc2luZ0ZlYXR1cmUpIHsKLQkJCQlNaXNzaW5nRmVhdHVyZSBtZiA9IChNaXNzaW5nRmVhdHVyZSkgY3VycmVudEZlYXR1cmU7Ci0JCQkJaWYgKG1mLmlzT3B0aW9uYWwoKSAmJiBtZi5nZXRPcmlnaW5hdGluZ1NpdGVVUkwoKSAhPSBudWxsKSB7Ci0JCQkJCWV4ZWN1dGVPcHRpb25hbEluc3RhbGwobWYpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJaW50IG1vZGU7Ci0JCQlpZiAoY3VycmVudEFkYXB0ZXIgaW5zdGFuY2VvZiBJQ29uZmlndXJlZFNpdGVDb250ZXh0KSB7Ci0JCQkJYm9vbGVhbiBjb25maWd1cmVkID0gaXNDb25maWd1cmVkKCk7Ci0JCQkJaWYgKGNvbmZpZ3VyZWQpCi0JCQkJCW1vZGUgPSBQZW5kaW5nQ2hhbmdlLlVOQ09ORklHVVJFOwotCQkJCWVsc2UKLQkJCQkJbW9kZSA9IFBlbmRpbmdDaGFuZ2UuQ09ORklHVVJFOwotCQkJfSBlbHNlIHsKLQkJCQltb2RlID0gUGVuZGluZ0NoYW5nZS5JTlNUQUxMOwotCQkJfQotCQkJZXhlY3V0ZUpvYihtb2RlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgaW50IGdldEN1cnJlbnRKb2JUeXBlKCkgewotCQlpbnQgbW9kZTsKLQkJaWYgKGN1cnJlbnRBZGFwdGVyIGluc3RhbmNlb2YgSUNvbmZpZ3VyZWRTaXRlQ29udGV4dCkgewotCQkJYm9vbGVhbiBjb25maWd1cmVkID0gaXNDb25maWd1cmVkKCk7Ci0JCQlpZiAoY29uZmlndXJlZCkKLQkJCQltb2RlID0gUGVuZGluZ0NoYW5nZS5VTkNPTkZJR1VSRTsKLQkJCWVsc2UKLQkJCQltb2RlID0gUGVuZGluZ0NoYW5nZS5DT05GSUdVUkU7Ci0JCX0gZWxzZSB7Ci0JCQltb2RlID0gUGVuZGluZ0NoYW5nZS5JTlNUQUxMOwotCQl9Ci0JCXJldHVybiBtb2RlOwotCX0KLQotCXByaXZhdGUgUGVuZGluZ0NoYW5nZSBjcmVhdGVQZW5kaW5nQ2hhbmdlKGludCB0eXBlKSB7Ci0JCWlmICh0eXBlID09IFBlbmRpbmdDaGFuZ2UuSU5TVEFMTCAmJiBpbnN0YWxsZWRGZWF0dXJlcy5sZW5ndGggPiAwKSB7Ci0JCQlyZXR1cm4gbmV3IFBlbmRpbmdDaGFuZ2UoCi0JCQkJaW5zdGFsbGVkRmVhdHVyZXNbMF0sCi0JCQkJY3VycmVudEZlYXR1cmUsCi0JCQkJYWxyZWFkeUluc3RhbGxlZCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbmV3IFBlbmRpbmdDaGFuZ2UoY3VycmVudEZlYXR1cmUsIHR5cGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjaGVja0VuYWJsZWREdXBsaWNhdGVzKFBlbmRpbmdDaGFuZ2Ugam9iKSB7Ci0JCWlmIChqb2IuZ2V0Sm9iVHlwZSgpICE9IFBlbmRpbmdDaGFuZ2UuQ09ORklHVVJFKQotCQkJcmV0dXJuIHRydWU7Ci0JCUlGZWF0dXJlW10gaW5zdGFsbGVkRW5hYmxlZEZlYXR1cmVzID0KLQkJCVVwZGF0ZVVJLmdldEluc3RhbGxlZEZlYXR1cmVzKGpvYi5nZXRGZWF0dXJlKCksIHRydWUpOwotCQlpZiAoaW5zdGFsbGVkRW5hYmxlZEZlYXR1cmVzLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIHRydWU7Ci0KLQkJU3RyaW5nIHRpdGxlID0KLQkJCVVwZGF0ZVVJLmdldFN0cmluZygiRmVhdHVyZVBhZ2UuZHVwbGljYXRlc0VuYWJsZWQudGl0bGUiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgbWVzc2FnZSA9Ci0JCQlVcGRhdGVVSS5nZXRTdHJpbmcoIkZlYXR1cmVQYWdlLmR1cGxpY2F0ZXNFbmFibGVkLm1lc3NhZ2UiKTsgLy8kTk9OLU5MUy0xJAotCQkJTWVzc2FnZURpYWxvZyBkaWFsb2cgPQotCQkJCW5ldyBNZXNzYWdlRGlhbG9nKAotCQkJCQlVcGRhdGVVSS5nZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpLAotCQkJCQl0aXRsZSwKLQkJCQkJbnVsbCwKLQkJLy8gYWNjZXB0IHRoZSBkZWZhdWx0IHdpbmRvdyBpY29uCi0JbWVzc2FnZSwKLQkJTWVzc2FnZURpYWxvZy5XQVJOSU5HLAotCQluZXcgU3RyaW5nW10gewotCQkJSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwKLQkJCUlEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMIH0sCi0JCTApOwotCQkvLyBPSyBpcyB0aGUgZGVmYXVsdAotCQlyZXR1cm4gZGlhbG9nLm9wZW4oKSA9PSAwOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9mb3Jtcy9EZXRhaWxzSGlzdG9yeS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL2Zvcm1zL0RldGFpbHNIaXN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhODZiMzUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL2Zvcm1zL0RldGFpbHNIaXN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5mb3JtczsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotcHVibGljIGNsYXNzIERldGFpbHNIaXN0b3J5IHsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgTUFYX1NJWkUgPSA1MDsKLQlwcml2YXRlIExpbmtlZExpc3QgaGlzdG9yeTsKLQlwcml2YXRlIGludCBjdXJyZW50ID0gLTE7Ci0JCi0JcHVibGljIERldGFpbHNIaXN0b3J5KCkgewotCQloaXN0b3J5ID0gbmV3IExpbmtlZExpc3QoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHJlc2V0SXRlcmF0b3IoKSB7Ci0JCWN1cnJlbnQgPSBoaXN0b3J5LnNpemUoKSAtMTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkKERldGFpbHNIaXN0b3J5SXRlbSBpdGVtKSB7Ci0JCWlmIChoaXN0b3J5LmlzRW1wdHkoKSB8fAotCQkgICAgaGlzdG9yeS5nZXRMYXN0KCkuZXF1YWxzKGl0ZW0pPT1mYWxzZSkgewotCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIkl0ZW0gYWRkZWQ6ICIraXRlbSk7Ci0JCQloaXN0b3J5LmFkZExhc3QoaXRlbSk7Ci0JCQlpZiAoaGlzdG9yeS5zaXplKCkgPiBNQVhfU0laRSkKLQkJICAgCQloaXN0b3J5LnJlbW92ZUZpcnN0KCk7Ci0JCSAgICB9Ci0JCXJlc2V0SXRlcmF0b3IoKTsKLQl9Ci0JcHVibGljIHZvaWQgYWRkKFN0cmluZyBwYWdlSWQsIE9iamVjdCBpbnB1dCkgewotCQl0aGlzLmFkZChuZXcgRGV0YWlsc0hpc3RvcnlJdGVtKHBhZ2VJZCwgaW5wdXQpKTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJLy9pZiAoaXRlcmF0b3I9PW51bGwpIHJldHVybiBmYWxzZTsKLQkJLy9yZXR1cm4gaXRlcmF0b3IuaGFzTmV4dCgpOwotCQlpZiAoY3VycmVudD09IC0xKSByZXR1cm4gZmFsc2U7Ci0JCWlmIChjdXJyZW50ID09IGhpc3Rvcnkuc2l6ZSgpLTEpIHJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCXB1YmxpYyBib29sZWFuIGhhc1ByZXZpb3VzKCkgewotCQkvL2lmIChpdGVyYXRvcj09bnVsbCkgcmV0dXJuIGZhbHNlOwotCQkvL3JldHVybiBpdGVyYXRvci5oYXNQcmV2aW91cygpOwotCQlpZiAoY3VycmVudCA9PSAtMSkgcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gKGN1cnJlbnQ+MCk7Ci0JfQotCXB1YmxpYyBEZXRhaWxzSGlzdG9yeUl0ZW0gZ2V0TmV4dCgpIHsKLQkJaWYgKGhhc05leHQoKSkgewotCQkJRGV0YWlsc0hpc3RvcnlJdGVtIGl0ZW0gPSAoRGV0YWlsc0hpc3RvcnlJdGVtKWhpc3RvcnkuZ2V0KCsrY3VycmVudCk7Ci0JCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiTmV4dCByZXR1cm5lZDogIitpdGVtKTsKLQkJCXJldHVybiBpdGVtOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQlwdWJsaWMgRGV0YWlsc0hpc3RvcnlJdGVtIGdldFByZXZpb3VzKCkgewotCQlpZiAoaGFzUHJldmlvdXMoKSkgewotCQkJRGV0YWlsc0hpc3RvcnlJdGVtIGl0ZW0gPSAoRGV0YWlsc0hpc3RvcnlJdGVtKWhpc3RvcnkuZ2V0KC0tY3VycmVudCk7Ci0JCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiUHJldiByZXR1cm5lZDogIitpdGVtKTsKLQkJCXJldHVybiBpdGVtOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9mb3Jtcy9EZXRhaWxzSGlzdG9yeUl0ZW0uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9mb3Jtcy9EZXRhaWxzSGlzdG9yeUl0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVjMzNmNC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvZm9ybXMvRGV0YWlsc0hpc3RvcnlJdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5mb3JtczsKLXB1YmxpYyBjbGFzcyBEZXRhaWxzSGlzdG9yeUl0ZW0gewotCXByaXZhdGUgU3RyaW5nIHBhZ2VJZDsKLQlwcml2YXRlIE9iamVjdCBpbnB1dDsKLQkKLQlwdWJsaWMgRGV0YWlsc0hpc3RvcnlJdGVtKFN0cmluZyBwYWdlSWQsIE9iamVjdCBpbnB1dCkgewotCQl0aGlzLnBhZ2VJZCA9IHBhZ2VJZDsKLQkJdGhpcy5pbnB1dCA9IGlucHV0OwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFBhZ2VJZCgpIHsKLQkJcmV0dXJuIHBhZ2VJZDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldElucHV0KCkgewotCQlyZXR1cm4gaW5wdXQ7Ci0JfQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgaXRlbU9iaikgewotCQlpZiAoaXRlbU9iaiBpbnN0YW5jZW9mIERldGFpbHNIaXN0b3J5SXRlbSkgewotCQkJRGV0YWlsc0hpc3RvcnlJdGVtIGl0ZW0gPSAoRGV0YWlsc0hpc3RvcnlJdGVtKWl0ZW1PYmo7Ci0JCQlpZiAoIXBhZ2VJZC5lcXVhbHMoaXRlbS5nZXRQYWdlSWQoKSkpIHJldHVybiBmYWxzZTsKLQkJCWlmIChpbnB1dD09bnVsbCAmJiBpdGVtLmdldElucHV0KCk9PW51bGwpIHJldHVybiB0cnVlOwotCQkJaWYgKGlucHV0LmVxdWFscyhpdGVtLmdldElucHV0KCkpKSByZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBwYWdlSWQrIiwgIitpbnB1dDsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvZm9ybXMvRGlzY292ZXJ5Rm9sZGVyRm9ybS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL2Zvcm1zL0Rpc2NvdmVyeUZvbGRlckZvcm0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk2ZmY1Zi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvZm9ybXMvRGlzY292ZXJ5Rm9sZGVyRm9ybS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuZm9ybXM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLldvcmtiZW5jaEhlbHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbC5TaXRlQm9va21hcms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnBhZ2VzLlVwZGF0ZUZvcm1QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbC4qOwotCi0KLQotcHVibGljIGNsYXNzIERpc2NvdmVyeUZvbGRlckZvcm0gZXh0ZW5kcyBVcGRhdGVXZWJGb3JtIHsKLQlwcml2YXRlIFNpdGVCb29rbWFyayBjdXJyZW50Qm9va21hcms7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9USVRMRSA9ICJEaXNjb3ZlcnlGb2xkZXJQYWdlLnRpdGxlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RFU0MgPSAiRGlzY292ZXJ5Rm9sZGVyUGFnZS5kZXNjIjsKLQkKLXB1YmxpYyBEaXNjb3ZlcnlGb2xkZXJGb3JtKFVwZGF0ZUZvcm1QYWdlIHBhZ2UpIHsKLQlzdXBlcihwYWdlKTsKLX0KLQotcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQlzdXBlci5kaXNwb3NlKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIGluaXRpYWxpemUoT2JqZWN0IG1vZGVsT2JqZWN0KSB7Ci0Jc2V0SGVhZGluZ1RleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9USVRMRSkpOwotCXN1cGVyLmluaXRpYWxpemUobW9kZWxPYmplY3QpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JSFRNTFRhYmxlTGF5b3V0IGxheW91dCA9IG5ldyBIVE1MVGFibGVMYXlvdXQoKTsKLQlwYXJlbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0JbGF5b3V0LmxlZnRNYXJnaW4gPSBsYXlvdXQucmlnaHRNYXJnaW4gPSAxMDsKLQlsYXlvdXQudG9wTWFyZ2luID0gMTA7Ci0JbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDIwOwotCS8vIGRlZmVjdCAxMzY4NgotCS8vbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gMDsKLQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCi0JRm9ybVdpZGdldEZhY3RvcnkgZmFjdG9yeSA9IGdldEZhY3RvcnkoKTsKLQkKLQlMYWJlbCB0ZXh0ID0gZmFjdG9yeS5jcmVhdGVMYWJlbChwYXJlbnQsIG51bGwsIFNXVC5XUkFQKTsKLQl0ZXh0LnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9ERVNDKSk7Ci0JV29ya2JlbmNoSGVscC5zZXRIZWxwKHBhcmVudCwgIm9yZy5lY2xpcHNlLnVwZGF0ZS51aS5EaXNjb3ZlcnlGb2xkZXJGb3JtIik7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9mb3Jtcy9FeHRlbnNpb25Sb290Rm9ybS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL2Zvcm1zL0V4dGVuc2lvblJvb3RGb3JtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2NjA3MzAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL2Zvcm1zL0V4dGVuc2lvblJvb3RGb3JtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5mb3JtczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5Xb3JrYmVuY2hIZWxwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkucGFnZXMuVXBkYXRlRm9ybVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsLmVuZ2luZS5Gb3JtRW5naW5lOwotCi1wdWJsaWMgY2xhc3MgRXh0ZW5zaW9uUm9vdEZvcm0gZXh0ZW5kcyBVcGRhdGVXZWJGb3JtIHsKLQlwcml2YXRlIFNpdGVCb29rbWFyayBjdXJyZW50Qm9va21hcms7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9USVRMRSA9ICJFeHRlbnNpb25Sb290UGFnZS50aXRsZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ERVNDID0gIkV4dGVuc2lvblJvb3RQYWdlLmRlc2MiOwotCXByaXZhdGUgTGFiZWwgcGF0aDsKLQotCXB1YmxpYyBFeHRlbnNpb25Sb290Rm9ybShVcGRhdGVGb3JtUGFnZSBwYWdlKSB7Ci0JCXN1cGVyKHBhZ2UpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKE9iamVjdCBtb2RlbE9iamVjdCkgewotCQlzZXRIZWFkaW5nVGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX1RJVExFKSk7Ci0JCXN1cGVyLmluaXRpYWxpemUobW9kZWxPYmplY3QpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJSFRNTFRhYmxlTGF5b3V0IGxheW91dCA9IG5ldyBIVE1MVGFibGVMYXlvdXQoKTsKLQkJcGFyZW50LnNldExheW91dChsYXlvdXQpOwotCQlsYXlvdXQubGVmdE1hcmdpbiA9IGxheW91dC5yaWdodE1hcmdpbiA9IDEwOwotCQlsYXlvdXQudG9wTWFyZ2luID0gMTA7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAyMDsKLQkJLy8gZGVmZWN0IDEzNjg2Ci0JCS8vbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gMDsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCi0JCUZvcm1XaWRnZXRGYWN0b3J5IGZhY3RvcnkgPSBnZXRGYWN0b3J5KCk7Ci0KLQkJcGF0aCA9IGZhY3RvcnkuY3JlYXRlSGVhZGluZ0xhYmVsKHBhcmVudCwgIiIpOwotCQlUYWJsZURhdGEgdGQgPSBuZXcgVGFibGVEYXRhKCk7Ci0JCXRkLmNvbHNwYW4gPSAzOwotCQlwYXRoLnNldExheW91dERhdGEodGQpOwotCi0JCUZvcm1FbmdpbmUgZW5naW5lID0gZmFjdG9yeS5jcmVhdGVGb3JtRW5naW5lKHBhcmVudCk7Ci0JCVN0cmluZyBtYXJrdXAgPSBVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX0RFU0MpOwotCQltYXJrdXAgPSAiPGZvcm0+IittYXJrdXArIjwvZm9ybT4iOwotCQllbmdpbmUubG9hZChtYXJrdXAsIHRydWUsIHRydWUpOwotCQl0ZCA9IG5ldyBUYWJsZURhdGEoKTsKLQkJdGQuY29sc3BhbiA9IDM7Ci0JCXNldEZvY3VzQ29udHJvbChlbmdpbmUpOwotCQllbmdpbmUuc2V0TGF5b3V0RGF0YSh0ZCk7Ci0JCVdvcmtiZW5jaEhlbHAuc2V0SGVscChwYXJlbnQsICJvcmcuZWNsaXBzZS51cGRhdGUudWkuRXh0ZW5zaW9uUm9vdEZvcm0iKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleHBhbmRUbyhPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBFeHRlbnNpb25Sb290KSB7Ci0JCQlpbnB1dENoYW5nZWQoKEV4dGVuc2lvblJvb3QpIG9iaik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5wdXRDaGFuZ2VkKEV4dGVuc2lvblJvb3QgZXh0ZW5zaW9uUm9vdCkgewotCQlwYXRoLnNldFRleHQoZXh0ZW5zaW9uUm9vdC5nZXRJbnN0YWxsYWJsZURpcmVjdG9yeSgpLmdldFBhdGgoKSk7Ci0JCXBhdGguZ2V0UGFyZW50KCkubGF5b3V0KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL2Zvcm1zL0lVcGRhdGVGb3JtLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvZm9ybXMvSVVwZGF0ZUZvcm0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk5ZDIzYy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvZm9ybXMvSVVwZGF0ZUZvcm0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLmZvcm1zOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wYWdlcy5JVXBkYXRlRm9ybVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsLklGb3JtOwotCi1wdWJsaWMgaW50ZXJmYWNlIElVcGRhdGVGb3JtIGV4dGVuZHMgSUZvcm0gewotCXB1YmxpYyBJVXBkYXRlRm9ybVBhZ2UgZ2V0UGFnZSgpOwotCi19Ci0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9mb3Jtcy9JbmZvTGluay5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL2Zvcm1zL0luZm9MaW5rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiOTUzMmMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL2Zvcm1zL0luZm9MaW5rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5mb3JtczsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklVUkxFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkudmlld3MuRGV0YWlsc1ZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsLio7Ci0KLXB1YmxpYyBjbGFzcyBJbmZvTGluayBleHRlbmRzIEh5cGVybGlua0FkYXB0ZXIgewotCXByaXZhdGUgSVVSTEVudHJ5IGluZm87Ci0JcHJpdmF0ZSBTZWxlY3RhYmxlRm9ybUxhYmVsIGxpbmtMYWJlbDsKLQlwcml2YXRlIERldGFpbHNWaWV3IHZpZXc7Ci0JcHJpdmF0ZSBib29sZWFuIHZpc2libGUgPSB0cnVlOwotCXByaXZhdGUgU3RyaW5nIHRleHQ9IiI7Ci0KLQlwdWJsaWMgSW5mb0xpbmsoRGV0YWlsc1ZpZXcgdmlldykgewotCQl0aGlzLnZpZXcgPSB2aWV3OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBjb21wb3NpdGUsIEZvcm1XaWRnZXRGYWN0b3J5IGZhY3RvcnkpIHsKLQkJbGlua0xhYmVsID0gZmFjdG9yeS5jcmVhdGVTZWxlY3RhYmxlTGFiZWwoY29tcG9zaXRlLCB0ZXh0KTsKLQkJZmFjdG9yeS50dXJuSW50b0h5cGVybGluayhsaW5rTGFiZWwsIHRoaXMpOwotCQlsaW5rTGFiZWwuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLQl9Ci0JCi0JcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpIHsKLQkJcmV0dXJuIGxpbmtMYWJlbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsaW5rQWN0aXZhdGVkKENvbnRyb2wgbGluaykgewotCQlpZiAoaW5mbz09bnVsbCkgcmV0dXJuOwotCQlVUkwgdXJsID0gaW5mby5nZXRVUkwoKTsKLQkJaWYgKHVybCE9bnVsbCkgewotCQkJRGV0YWlsc1ZpZXcuc2hvd1VSTCh1cmwudG9TdHJpbmcoKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU3RyaW5nIGFubm90YXRpb24gPSBpbmZvLmdldEFubm90YXRpb24oKTsKLQkJaWYgKGFubm90YXRpb24gIT1udWxsICYmIGFubm90YXRpb24ubGVuZ3RoKCk+MCkgewotCQkJdmlldy5zaG93VGV4dChhbm5vdGF0aW9uKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRJbmZvKElVUkxFbnRyeSBpbmZvKSB7Ci0JCXRoaXMuaW5mbyA9IGluZm87Ci0JCWlmIChpbmZvIT1udWxsKSB7Ci0JCQlib29sZWFuIGhhc1RleHQgPSBpbmZvLmdldEFubm90YXRpb24oKSE9bnVsbCAmJiBpbmZvLmdldEFubm90YXRpb24oKS5sZW5ndGgoKT4wOwotCQkJYm9vbGVhbiBoYXNVUkwgPSBpbmZvLmdldFVSTCgpIT1udWxsOwotCQkJc2V0VmlzaWJsZShoYXNUZXh0IHx8IGhhc1VSTCk7Ci0JCX0KLQkJZWxzZSBzZXRWaXNpYmxlKGZhbHNlKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0JCXRoaXMudmlzaWJsZSA9IHZpc2libGU7Ci0JCWlmIChsaW5rTGFiZWwhPW51bGwpIHsKLQkJCWxpbmtMYWJlbC5zZXRWaXNpYmxlKHZpc2libGUpOwotCQl9Ci0JfQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQuCi0JICogQHJldHVybiBSZXR1cm5zIGEgU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB0ZXh0LgotCSAqIEBwYXJhbSB0ZXh0IFRoZSB0ZXh0IHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpIHsKLQkJdGhpcy50ZXh0ID0gdGV4dDsKLQkJaWYgKGxpbmtMYWJlbCAhPSBudWxsKSB7Ci0JCQlsaW5rTGFiZWwuc2V0VGV4dCh0ZXh0KTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL2Zvcm1zL0luc3RhbGxDb25maWd1cmF0aW9uRm9ybS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL2Zvcm1zL0luc3RhbGxDb25maWd1cmF0aW9uRm9ybS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzhkYWU1Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9mb3Jtcy9JbnN0YWxsQ29uZmlndXJhdGlvbkZvcm0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLldvcmtiZW5jaEhlbHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uSUluc3RhbGxDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnBhZ2VzLlVwZGF0ZUZvcm1QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wYXJ0cy5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbC4qOwotCi1wdWJsaWMgY2xhc3MgSW5zdGFsbENvbmZpZ3VyYXRpb25Gb3JtIGV4dGVuZHMgUHJvcGVydHlXZWJGb3JtIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NSRUFURURfT04gPQotCQkiSW5zdGFsbENvbmZpZ3VyYXRpb25QYWdlLmNyZWF0ZWRPbiI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DVVJSRU5UX0NPTkZJRyA9Ci0JCSJJbnN0YWxsQ29uZmlndXJhdGlvblBhZ2UuY3VycmVudENvbmZpZyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ZRVMgPSAiSW5zdGFsbENvbmZpZ3VyYXRpb25QYWdlLnllcyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9OTyA9ICJJbnN0YWxsQ29uZmlndXJhdGlvblBhZ2Uubm8iOwotCi0JcHJpdmF0ZSBJSW5zdGFsbENvbmZpZ3VyYXRpb24gY3VycmVudENvbmZpZ3VyYXRpb247Ci0JcHJpdmF0ZSBMYWJlbCBkYXRlTGFiZWw7Ci0JcHJpdmF0ZSBMYWJlbCBjdXJyZW50TGFiZWw7Ci0JcHJpdmF0ZSBBY3Rpdml0eVNlY3Rpb24gYWN0aXZpdHlTZWN0aW9uOwotCXByaXZhdGUgUmV2ZXJ0U2VjdGlvbiByZXZlcnRTZWN0aW9uOwotCXByaXZhdGUgUHJlc2VydmVTZWN0aW9uIHByZXNlcnZlU2VjdGlvbjsKLQlwcml2YXRlIElVcGRhdGVNb2RlbENoYW5nZWRMaXN0ZW5lciBtb2RlbExpc3RlbmVyOwotCi0JcHVibGljIEluc3RhbGxDb25maWd1cmF0aW9uRm9ybShVcGRhdGVGb3JtUGFnZSBwYWdlKSB7Ci0JCXN1cGVyKHBhZ2UpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKE9iamVjdCBtb2RlbE9iamVjdCkgewotCQlzZXRIZWFkaW5nVGV4dCgiIik7Ci0JCXN1cGVyLmluaXRpYWxpemUobW9kZWxPYmplY3QpOwotCQlVcGRhdGVNb2RlbCBtb2RlbCA9IFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRVcGRhdGVNb2RlbCgpOwotCQltb2RlbExpc3RlbmVyID0gbmV3IElVcGRhdGVNb2RlbENoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG9iamVjdHNBZGRlZChPYmplY3QgcGFyZW50LCBPYmplY3RbXSBjaGlsZHJlbikgewotCQkJfQotCQkJcHVibGljIHZvaWQgb2JqZWN0c1JlbW92ZWQoT2JqZWN0IHBhcmVudCwgT2JqZWN0W10gY2hpbGRyZW4pIHsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIG9iamVjdENoYW5nZWQoT2JqZWN0IG9iaiwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQkJZmluYWwgYm9vbGVhbiBwcmVzZXJ2ZWQ7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByZXNlcnZlZENvbmZpZ3VyYXRpb24pIHsKLQkJCQkJcHJlc2VydmVkID0gdHJ1ZTsKLQkJCQkJb2JqID0gKChQcmVzZXJ2ZWRDb25maWd1cmF0aW9uKSBvYmopLmdldENvbmZpZ3VyYXRpb24oKTsKLQkJCQl9IGVsc2UKLQkJCQkJcHJlc2VydmVkID0gZmFsc2U7Ci0JCQkJaWYgKG9iai5lcXVhbHMoY3VycmVudENvbmZpZ3VyYXRpb24pKSB7Ci0JCQkJCVNXVFV0aWwuZ2V0U3RhbmRhcmREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQlpbnB1dENoYW5nZWQoY3VycmVudENvbmZpZ3VyYXRpb24sIHByZXNlcnZlZCk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJbW9kZWwuYWRkVXBkYXRlTW9kZWxDaGFuZ2VkTGlzdGVuZXIobW9kZWxMaXN0ZW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlIVE1MVGFibGVMYXlvdXQgbGF5b3V0ID0gbmV3IEhUTUxUYWJsZUxheW91dCgpOwotCQlwYXJlbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWxheW91dC5sZWZ0TWFyZ2luID0gMTA7Ci0JCWxheW91dC5yaWdodE1hcmdpbiA9IDA7Ci0JCWxheW91dC50b3BNYXJnaW4gPSAxMDsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gMDsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDA7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMTsKLQotCQlGb3JtV2lkZ2V0RmFjdG9yeSBmYWN0b3J5ID0gZ2V0RmFjdG9yeSgpOwotCi0JCWRhdGVMYWJlbCA9Ci0JCQljcmVhdGVQcm9wZXJ0eSgKLQkJCQlwYXJlbnQsCi0JCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9DUkVBVEVEX09OKSk7Ci0JCWN1cnJlbnRMYWJlbCA9Ci0JCQljcmVhdGVQcm9wZXJ0eSgKLQkJCQlwYXJlbnQsCi0JCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9DVVJSRU5UX0NPTkZJRykpOwotCQlmYWN0b3J5LmNyZWF0ZUxhYmVsKHBhcmVudCwgbnVsbCk7Ci0KLQkJYWN0aXZpdHlTZWN0aW9uID0gbmV3IEFjdGl2aXR5U2VjdGlvbigoVXBkYXRlRm9ybVBhZ2UpIGdldFBhZ2UoKSk7Ci0JCUNvbnRyb2wgY29udHJvbCA9IGFjdGl2aXR5U2VjdGlvbi5jcmVhdGVDb250cm9sKHBhcmVudCwgZmFjdG9yeSk7Ci0JCVRhYmxlRGF0YSB0ZCA9IG5ldyBUYWJsZURhdGEoKTsKLQkJLy90ZC5hbGlnbiA9IFRhYmxlRGF0YS5GSUxMOwotCQkvL3RkLmdyYWJIb3Jpem9udGFsID0gdHJ1ZTsKLQkJdGQudmFsaWduID0gVGFibGVEYXRhLlRPUDsKLQkJLy90ZC5jb2xzcGFuID0gMjsKLQkJY29udHJvbC5zZXRMYXlvdXREYXRhKHRkKTsKLQotCQlyZXZlcnRTZWN0aW9uID0gbmV3IFJldmVydFNlY3Rpb24oKFVwZGF0ZUZvcm1QYWdlKSBnZXRQYWdlKCkpOwotCQljb250cm9sID0gcmV2ZXJ0U2VjdGlvbi5jcmVhdGVDb250cm9sKHBhcmVudCwgZmFjdG9yeSk7Ci0JCXRkID0gbmV3IFRhYmxlRGF0YSgpOwotCQl0ZC5hbGlnbiA9IFRhYmxlRGF0YS5GSUxMOwotCQl0ZC5ncmFiSG9yaXpvbnRhbCA9IHRydWU7Ci0JCXRkLnZhbGlnbiA9IFRhYmxlRGF0YS5UT1A7Ci0JCWNvbnRyb2wuc2V0TGF5b3V0RGF0YSh0ZCk7Ci0JCXNldEZvY3VzQ29udHJvbChyZXZlcnRTZWN0aW9uLmdldEZvY3VzQ29udHJvbCgpKTsKLQotCQlwcmVzZXJ2ZVNlY3Rpb24gPSBuZXcgUHJlc2VydmVTZWN0aW9uKChVcGRhdGVGb3JtUGFnZSkgZ2V0UGFnZSgpKTsKLQkJY29udHJvbCA9IHByZXNlcnZlU2VjdGlvbi5jcmVhdGVDb250cm9sKHBhcmVudCwgZmFjdG9yeSk7Ci0JCXRkID0gbmV3IFRhYmxlRGF0YSgpOwotCQl0ZC5hbGlnbiA9IFRhYmxlRGF0YS5GSUxMOwotCQl0ZC5ncmFiSG9yaXpvbnRhbCA9IHRydWU7Ci0JCXRkLnZhbGlnbiA9IFRhYmxlRGF0YS5UT1A7Ci0JCWNvbnRyb2wuc2V0TGF5b3V0RGF0YSh0ZCk7Ci0KLQkJcmVnaXN0ZXJTZWN0aW9uKGFjdGl2aXR5U2VjdGlvbik7Ci0JCXJlZ2lzdGVyU2VjdGlvbihyZXZlcnRTZWN0aW9uKTsKLQkJcmVnaXN0ZXJTZWN0aW9uKHByZXNlcnZlU2VjdGlvbik7Ci0JCVdvcmtiZW5jaEhlbHAuc2V0SGVscCgKLQkJCXBhcmVudCwKLQkJCSJvcmcuZWNsaXBzZS51cGRhdGUudWkuSW5zdGFsbENvbmZpZ3VyYXRpb25Gb3JtIik7Ci0JfQotCi0JcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVQcm9wZXJ0eUxheW91dERhdGEoKSB7Ci0JCVRhYmxlRGF0YSB0ZCA9IG5ldyBUYWJsZURhdGEoKTsKLQkJLy90ZC5pbmRlbnQgPSAxMDsKLQkJcmV0dXJuIHRkOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4cGFuZFRvKE9iamVjdCBvYmopIHsKLQkJYm9vbGVhbiBwcmVzZXJ2ZWQgPSBmYWxzZTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByZXNlcnZlZENvbmZpZ3VyYXRpb24pIHsKLQkJCXByZXNlcnZlZCA9IHRydWU7Ci0JCQlvYmogPSAoKFByZXNlcnZlZENvbmZpZ3VyYXRpb24pIG9iaikuZ2V0Q29uZmlndXJhdGlvbigpOwotCQl9Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBJSW5zdGFsbENvbmZpZ3VyYXRpb24pIHsKLQkJCWlucHV0Q2hhbmdlZCgoSUluc3RhbGxDb25maWd1cmF0aW9uKSBvYmosIHByZXNlcnZlZCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5wdXRDaGFuZ2VkKAotCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwKLQkJYm9vbGVhbiBwcmVzZXJ2ZWQpIHsKLQkJc2V0SGVhZGluZ1RleHQoY29uZmlndXJhdGlvbi5nZXRMYWJlbCgpKTsKLQkJRGF0ZSBkYXRlID0gY29uZmlndXJhdGlvbi5nZXRDcmVhdGlvbkRhdGUoKTsKLQkJZGF0ZUxhYmVsLnNldFRleHQoVXRpbGl0aWVzLmZvcm1hdChkYXRlKSk7Ci0JCVN0cmluZyBpc0N1cnJlbnQgPQotCQkJY29uZmlndXJhdGlvbi5pc0N1cnJlbnQoKQotCQkJCT8gVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9ZRVMpCi0JCQkJOiBVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX05PKTsKLQkJY3VycmVudExhYmVsLnNldFRleHQoaXNDdXJyZW50KTsKLQotCQlhY3Rpdml0eVNlY3Rpb24uY29uZmlndXJhdGlvbkNoYW5nZWQoY29uZmlndXJhdGlvbik7Ci0JCXJldmVydFNlY3Rpb24uY29uZmlndXJhdGlvbkNoYW5nZWQoY29uZmlndXJhdGlvbik7Ci0JCXByZXNlcnZlU2VjdGlvbi5jb25maWd1cmF0aW9uQ2hhbmdlZCghcHJlc2VydmVkID8gY29uZmlndXJhdGlvbiA6IG51bGwpOwotCQkvLyByZWZsb3cKLQkJZGF0ZUxhYmVsLmdldFBhcmVudCgpLmxheW91dCh0cnVlKTsKLQkJKChDb21wb3NpdGUpIGdldENvbnRyb2woKSkubGF5b3V0KHRydWUpOwotCQlnZXRDb250cm9sKCkucmVkcmF3KCk7Ci0JCXVwZGF0ZVNpemUoKTsKLQkJY3VycmVudENvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIG9iamVjdENoYW5nZWQoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCWlmIChvYmplY3QuZXF1YWxzKGN1cnJlbnRDb25maWd1cmF0aW9uKSkgewotCQkJZXhwYW5kVG8ob2JqZWN0KTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL2Zvcm1zL0luc3RhbGxhYmxlU2l0ZUZvcm0uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9mb3Jtcy9JbnN0YWxsYWJsZVNpdGVGb3JtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhMzFkOTYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL2Zvcm1zL0luc3RhbGxhYmxlU2l0ZUZvcm0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5mb3JtczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuV29ya2JlbmNoSGVscDsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi5JQ29uZmlndXJlZFNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbC5JQ29uZmlndXJlZFNpdGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wYWdlcy5VcGRhdGVGb3JtUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkudmlld3MuU2l0ZVN0YXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbC5lbmdpbmUuRm9ybUVuZ2luZTsKLQotcHVibGljIGNsYXNzIEluc3RhbGxhYmxlU2l0ZUZvcm0gZXh0ZW5kcyBQcm9wZXJ0eVdlYkZvcm0gewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVElUTEUgPSAiSW5zdGFsbGFibGVTaXRlUGFnZS50aXRsZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ERVNDID0gIkluc3RhbGxhYmxlU2l0ZVBhZ2UuZGVzYyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ORVdfTE9DID0gIkluc3RhbGxhYmxlU2l0ZVBhZ2UubmV3TG9jYXRpb24iOwotCi0JcHJpdmF0ZSBJQ29uZmlndXJlZFNpdGUgY3VycmVudFNpdGU7Ci0JcHJpdmF0ZSBMYWJlbCB1cmxMYWJlbDsKLQlwcml2YXRlIExhYmVsIHR5cGVMYWJlbDsKLQlwcml2YXRlIExhYmVsIHN0YXRlTGFiZWw7Ci0JcHJpdmF0ZSBCdXR0b24gc3RhdGVCdXR0b247Ci0JcHJpdmF0ZSBTaXRlU3RhdGVBY3Rpb24gc2l0ZVN0YXRlQWN0aW9uOwotCi0JcHVibGljIEluc3RhbGxhYmxlU2l0ZUZvcm0oVXBkYXRlRm9ybVBhZ2UgcGFnZSkgewotCQlzdXBlcihwYWdlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShPYmplY3QgbW9kZWxPYmplY3QpIHsKLQkJc2V0SGVhZGluZ1RleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9USVRMRSkpOwotCQlzdXBlci5pbml0aWFsaXplKG1vZGVsT2JqZWN0KTsKLQkJLy8oKENvbXBvc2l0ZSlnZXRDb250cm9sKCkpLmxheW91dCh0cnVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUhUTUxUYWJsZUxheW91dCBsYXlvdXQgPSBuZXcgSFRNTFRhYmxlTGF5b3V0KCk7Ci0JCXBhcmVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJbGF5b3V0LmxlZnRNYXJnaW4gPSAxMDsKLQkJbGF5b3V0LnJpZ2h0TWFyZ2luID0gMDsKLQkJbGF5b3V0LnRvcE1hcmdpbiA9IDEwOwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAwOwotCQkvL2xheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAyMDsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCi0JCUZvcm1XaWRnZXRGYWN0b3J5IGZhY3RvcnkgPSBnZXRGYWN0b3J5KCk7Ci0JCXVybExhYmVsID0KLQkJCWNyZWF0ZVByb3BlcnR5KAotCQkJCXBhcmVudCwKLQkJCQlVcGRhdGVVSS5nZXRTdHJpbmcoCi0JCQkJCSJJbnN0YWxsYWJsZVNpdGVGb3JtLnVybCIpKTsKLQkJdHlwZUxhYmVsID0KLQkJCWNyZWF0ZVByb3BlcnR5KAotCQkJCXBhcmVudCwKLQkJCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKAotCQkJCQkJIkluc3RhbGxhYmxlU2l0ZUZvcm0udHlwZSIpKTsKLQkJc3RhdGVMYWJlbCA9Ci0JCQljcmVhdGVQcm9wZXJ0eSgKLQkJCQlwYXJlbnQsCi0JCQkJCVVwZGF0ZVVJLmdldFN0cmluZygKLQkJCQkJCSJJbnN0YWxsYWJsZVNpdGVGb3JtLnN0YXRlIikpOwotCi0JCXN0YXRlQnV0dG9uID0gZmFjdG9yeS5jcmVhdGVCdXR0b24ocGFyZW50LCAiIiwgU1dULlBVU0gpOwotCQlzdGF0ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzaXRlU3RhdGVBY3Rpb24ucnVuKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWZhY3RvcnkuY3JlYXRlTGFiZWwocGFyZW50LCAiIik7Ci0KLQkJRm9ybUVuZ2luZSBkZXNjID0gZmFjdG9yeS5jcmVhdGVGb3JtRW5naW5lKHBhcmVudCk7Ci0JCWRlc2MubG9hZChVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX0RFU0MpLCB0cnVlLCB0cnVlKTsKLQkJc2V0Rm9jdXNDb250cm9sKGRlc2MpOwotCQlUYWJsZURhdGEgdGQgPSBuZXcgVGFibGVEYXRhKCk7Ci0JCXRkLmFsaWduID0gVGFibGVEYXRhLkZJTEw7Ci0JCXRkLmdyYWJIb3Jpem9udGFsID0gdHJ1ZTsKLQkJZGVzYy5zZXRMYXlvdXREYXRhKHRkKTsKLQotCQlzaXRlU3RhdGVBY3Rpb24gPSBuZXcgU2l0ZVN0YXRlQWN0aW9uKCk7Ci0KLQkJV29ya2JlbmNoSGVscC5zZXRIZWxwKAotCQkJcGFyZW50LAotCQkJIm9yZy5lY2xpcHNlLnVwZGF0ZS51aS5JbnN0YWxsYWJsZVNpdGVGb3JtIik7Ci0JfQotCi0JcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVQcm9wZXJ0eUxheW91dERhdGEoKSB7Ci0JCVRhYmxlRGF0YSB0ZCA9IG5ldyBUYWJsZURhdGEoKTsKLQkJLy90ZC5pbmRlbnQgPSAxMDsKLQkJcmV0dXJuIHRkOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4cGFuZFRvKE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIElDb25maWd1cmVkU2l0ZUFkYXB0ZXIpIHsKLQkJCWlucHV0Q2hhbmdlZCgoKElDb25maWd1cmVkU2l0ZUFkYXB0ZXIpIG9iaikuZ2V0Q29uZmlndXJlZFNpdGUoKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRTdGF0ZUJ1dHRvbkxhYmVsKGJvb2xlYW4gZW5hYmxlZCkgewotCQlyZXR1cm4gVXBkYXRlVUkuZ2V0U3RyaW5nKAotCQkJZW5hYmxlZAotCQkJCT8gIkluc3RhbGxhYmxlU2l0ZUZvcm0uc3RhdGVCdXR0b24uZGlzYWJsZSIKLQkJCQk6ICJJbnN0YWxsYWJsZVNpdGVGb3JtLnN0YXRlQnV0dG9uLmVuYWJsZSIpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFN0YXRlTGFiZWwoYm9vbGVhbiBlbmFibGVkKSB7Ci0JCXJldHVybiBVcGRhdGVVSS5nZXRTdHJpbmcoCi0JCQllbmFibGVkCi0JCQkJPyAiSW5zdGFsbGFibGVTaXRlRm9ybS5zdGF0ZUxhYmVsLmVuYWJsZWQiCi0JCQkJOiAiSW5zdGFsbGFibGVTaXRlRm9ybS5zdGF0ZUxhYmVsLmRpc2FibGVkIik7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0U2l0ZVR5cGUoSUNvbmZpZ3VyZWRTaXRlIGNzaXRlKSB7Ci0JCWlmIChjc2l0ZS5pc1Byb2R1Y3RTaXRlKCkpCi0JCQlyZXR1cm4gVXBkYXRlVUkuZ2V0U3RyaW5nKCJJbnN0YWxsYWJsZVNpdGVGb3JtLnR5cGUucHJvZHVjdCIpOwotCQlpZiAoY3NpdGUuaXNFeHRlbnNpb25TaXRlKCkpCi0JCQlyZXR1cm4gVXBkYXRlVUkuZ2V0U3RyaW5nKCJJbnN0YWxsYWJsZVNpdGVGb3JtLnR5cGUuZXh0ZW5zaW9uIik7Ci0JCXJldHVybiBVcGRhdGVVSS5nZXRTdHJpbmcoIkluc3RhbGxhYmxlU2l0ZUZvcm0udHlwZS5wcml2YXRlIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGlucHV0Q2hhbmdlZChJQ29uZmlndXJlZFNpdGUgY3NpdGUpIHsKLQkJSVNpdGUgc2l0ZSA9IGNzaXRlLmdldFNpdGUoKTsKLQkJdXJsTGFiZWwuc2V0VGV4dChzaXRlLmdldFVSTCgpLnRvU3RyaW5nKCkpOwotCQl0eXBlTGFiZWwuc2V0VGV4dChnZXRTaXRlVHlwZShjc2l0ZSkpOwotCi0JCXN0YXRlTGFiZWwuc2V0VGV4dChnZXRTdGF0ZUxhYmVsKGNzaXRlLmlzRW5hYmxlZCgpKSk7Ci0JCXN0YXRlQnV0dG9uLnNldFRleHQoZ2V0U3RhdGVCdXR0b25MYWJlbChjc2l0ZS5pc0VuYWJsZWQoKSkpOwotCQlzaXRlU3RhdGVBY3Rpb24uc2V0U2l0ZShjc2l0ZSk7Ci0JCXVybExhYmVsLmdldFBhcmVudCgpLmxheW91dCgpOwotCQkoKENvbXBvc2l0ZSkgZ2V0Q29udHJvbCgpKS5sYXlvdXQoKTsKLQkJZ2V0Q29udHJvbCgpLnJlZHJhdygpOwotCQljdXJyZW50U2l0ZSA9IGNzaXRlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9mb3Jtcy9Mb2NhbFNpdGVGb3JtLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvZm9ybXMvTG9jYWxTaXRlRm9ybS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzVlZTM1Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9mb3Jtcy9Mb2NhbFNpdGVGb3JtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuZm9ybXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5Xb3JrYmVuY2hIZWxwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLklJbnN0YWxsQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5TaXRlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsLlNpdGVCb29rbWFyazsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkucGFnZXMuVXBkYXRlRm9ybVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnBhcnRzLkFib3V0SW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkudmlld3MuRGV0YWlsc1ZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsLmVuZ2luZS4qOwotCi1wdWJsaWMgY2xhc3MgTG9jYWxTaXRlRm9ybSBleHRlbmRzIFVwZGF0ZVdlYkZvcm0gewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVElUTEUgPSAiTG9jYWxTaXRlUGFnZS50aXRsZSI7Ci0KLQlwcml2YXRlIExhYmVsIHVybDsKLQlwcml2YXRlIFNpdGVCb29rbWFyayBjdXJyZW50Qm9va21hcms7Ci0JcHJpdmF0ZSBBYm91dEluZm8gYWJvdXRJbmZvOwotCXByaXZhdGUgSW1hZ2UgaW1hZ2U7Ci0JcHJpdmF0ZSBQcmVzZXJ2ZVNlY3Rpb24gcHJlc2VydmVTZWN0aW9uOwotCi0JcHVibGljIExvY2FsU2l0ZUZvcm0oVXBkYXRlRm9ybVBhZ2UgcGFnZSkgewotCQlzdXBlcihwYWdlKTsKLQkJYWJvdXRJbmZvID0gVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldEFib3V0SW5mbygpOwotCQlJbWFnZURlc2NyaXB0b3IgZGVzYyA9IGFib3V0SW5mby5nZXRBYm91dEltYWdlKCk7Ci0JCWlmIChkZXNjICE9IG51bGwpCi0JCQlpbWFnZSA9IGRlc2MuY3JlYXRlSW1hZ2UoKTsgLy8gbWF5IGJlIG51bGwKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoaW1hZ2UgIT0gbnVsbCkKLQkJCWltYWdlLmRpc3Bvc2UoKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoT2JqZWN0IG1vZGVsT2JqZWN0KSB7Ci0JCXNldEhlYWRpbmdUZXh0KFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfVElUTEUpKTsKLQkJc3VwZXIuaW5pdGlhbGl6ZShtb2RlbE9iamVjdCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlGb3JtV2lkZ2V0RmFjdG9yeSBmYWN0b3J5ID0gZ2V0RmFjdG9yeSgpOwotCQlIVE1MVGFibGVMYXlvdXQgbGF5b3V0ID0gbmV3IEhUTUxUYWJsZUxheW91dCgpOwotCQlwYXJlbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWxheW91dC5sZWZ0TWFyZ2luID0gbGF5b3V0LnJpZ2h0TWFyZ2luID0gMTA7Ci0JCWxheW91dC50b3BNYXJnaW4gPSAxMDsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gMjA7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAyMDsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSBpbWFnZSAhPSBudWxsID8gMiA6IDE7Ci0KLQkJaWYgKGltYWdlICE9IG51bGwpIHsKLQkJCUxhYmVsIGlsYWJlbCA9IGZhY3RvcnkuY3JlYXRlTGFiZWwocGFyZW50LCBudWxsKTsKLQkJCWlsYWJlbC5zZXRJbWFnZShpbWFnZSk7Ci0JCX0KLQotCQlIVFRQQWN0aW9uIGFjdGlvbiA9IG5ldyBIVFRQQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgbGlua0FjdGl2YXRlZChJSHlwZXJsaW5rU2VnbWVudCBsaW5rKSB7Ci0JCQkJRGV0YWlsc1ZpZXcuc2hvd1VSTChsaW5rLmdldFRleHQoKSk7Ci0JCQl9Ci0JCX07Ci0JCUlBY3Rpb25CYXJzIGJhcnMgPSBnZXRQYWdlKCkuZ2V0VmlldygpLmdldFZpZXdTaXRlKCkuZ2V0QWN0aW9uQmFycygpOwotCQlhY3Rpb24uc2V0U3RhdHVzTGluZU1hbmFnZXIoYmFycy5nZXRTdGF0dXNMaW5lTWFuYWdlcigpKTsKLQkJLy8gdGV4dCBvbiB0aGUgcmlnaHQKLQkJRm9ybUVuZ2luZSBlbmdpbmUgPSBmYWN0b3J5LmNyZWF0ZUZvcm1FbmdpbmUocGFyZW50KTsKLQkJZW5naW5lLnJlZ2lzdGVyVGV4dE9iamVjdChGb3JtRW5naW5lLlVSTF9IQU5ETEVSX0lELCBhY3Rpb24pOwotCQllbmdpbmUuc2V0UGFyYWdyYXBoc1NlcGFyYXRlZChmYWxzZSk7Ci0JCWVuZ2luZS5zZXRIeXBlcmxpbmtTZXR0aW5ncyhmYWN0b3J5LmdldEh5cGVybGlua0hhbmRsZXIoKSk7Ci0JCWVuZ2luZS5tYXJnaW5XaWR0aCA9IDE7Ci0JCVRhYmxlRGF0YSBkYXRhID0gbmV3IFRhYmxlRGF0YSgpOwotCQlkYXRhLmFsaWduID0gVGFibGVEYXRhLkZJTEw7Ci0JCWVuZ2luZS5sb2FkKGdldFByb2R1Y3RUZXh0KCksIGZhbHNlLCB0cnVlKTsKLQkJZW5naW5lLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXNldEZvY3VzQ29udHJvbChlbmdpbmUpOwotCi0JCUNvbXBvc2l0ZSBzZXAgPSBmYWN0b3J5LmNyZWF0ZUNvbXBvc2l0ZVNlcGFyYXRvcihwYXJlbnQpOwotCQlkYXRhID0gbmV3IFRhYmxlRGF0YSgpOwotCQlkYXRhLmFsaWduID0gVGFibGVEYXRhLkZJTEw7Ci0JCWRhdGEuaGVpZ2h0SGludCA9IDE7Ci0JCWRhdGEuY29sc3BhbiA9IGltYWdlICE9IG51bGwgPyAyIDogMTsKLQkJc2VwLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQlwcmVzZXJ2ZVNlY3Rpb24gPSBuZXcgUHJlc2VydmVTZWN0aW9uKChVcGRhdGVGb3JtUGFnZSkgZ2V0UGFnZSgpKTsKLQkJQ29udHJvbCBjb250cm9sID0gcHJlc2VydmVTZWN0aW9uLmNyZWF0ZUNvbnRyb2wocGFyZW50LCBmYWN0b3J5KTsKLQkJZGF0YSA9IG5ldyBUYWJsZURhdGEoKTsKLQkJZGF0YS5hbGlnbiA9IFRhYmxlRGF0YS5GSUxMOwotCQlkYXRhLmdyYWJIb3Jpem9udGFsID0gdHJ1ZTsKLQkJZGF0YS5jb2xzcGFuID0gaW1hZ2UgIT0gbnVsbCA/IDIgOiAxOwotCQlkYXRhLnZhbGlnbiA9IFRhYmxlRGF0YS5UT1A7Ci0JCWNvbnRyb2wuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlyZWdpc3RlclNlY3Rpb24ocHJlc2VydmVTZWN0aW9uKTsKLQkJdHJ5IHsKLQkJCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpOwotCQkJcHJlc2VydmVTZWN0aW9uLmNvbmZpZ3VyYXRpb25DaGFuZ2VkKGNvbmZpZyk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQl9Ci0JCVdvcmtiZW5jaEhlbHAuc2V0SGVscChwYXJlbnQsICJvcmcuZWNsaXBzZS51cGRhdGUudWkuTG9jYWxTaXRlRm9ybSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4cGFuZFRvKE9iamVjdCBvYmopIHsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5wdXRDaGFuZ2VkKFNpdGVCb29rbWFyayBzaXRlKSB7Ci0JfQotCXByaXZhdGUgU3RyaW5nIGdldFByb2R1Y3RUZXh0KCkgewotCQlyZXR1cm4gYWJvdXRJbmZvLmdldEFib3V0VGV4dCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9mb3Jtcy9NYWluRm9ybS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL2Zvcm1zL01haW5Gb3JtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwYTQ4OGUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL2Zvcm1zL01haW5Gb3JtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuZm9ybXM7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLldvcmtiZW5jaEhlbHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnBhZ2VzLlVwZGF0ZUZvcm1QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5VcGRhdGVDb2xvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnZpZXdzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsLmVuZ2luZS4qOwotCi1wdWJsaWMgY2xhc3MgTWFpbkZvcm0gZXh0ZW5kcyBVcGRhdGVXZWJGb3JtIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1RJVExFID0gIkhvbWVQYWdlLnRpdGxlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1VQREFURVNfVElUTEUgPSAiSG9tZVBhZ2UudXBkYXRlcy50aXRsZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9VUERBVEVTX0RFU0MgPSAiSG9tZVBhZ2UudXBkYXRlcy5kZXNjIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0lOU1RBTExTX1RJVExFID0gIkhvbWVQYWdlLmluc3RhbGxzLnRpdGxlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0lOU1RBTExTX0RFU0MgPSAiSG9tZVBhZ2UuaW5zdGFsbHMuZGVzYyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9VTklOU1RBTExTX1RJVExFID0KLQkJIkhvbWVQYWdlLnVuaW5zdGFsbHMudGl0bGUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVU5JTlNUQUxMU19ERVNDID0gIkhvbWVQYWdlLnVuaW5zdGFscy5kZXNjIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0hJU1RPUllfVElUTEUgPSAiSG9tZVBhZ2UuaGlzdG9yeS50aXRsZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ISVNUT1JZX0RFU0MgPSAiSG9tZVBhZ2UuaGlzdG9yeS5kZXNjIjsKLQotCUltYWdlIGl0ZW1JbWFnZTsKLQlJbWFnZSBjb25maWdzSW1hZ2U7Ci0JSW1hZ2Ugc2l0ZXNJbWFnZTsKLQlBcnJheUxpc3QgdG9waWNzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHVibGljIE1haW5Gb3JtKFVwZGF0ZUZvcm1QYWdlIHBhZ2UpIHsKLQkJc3VwZXIocGFnZSk7Ci0JCWl0ZW1JbWFnZSA9IFVwZGF0ZVVJSW1hZ2VzLkRFU0NfSVRFTS5jcmVhdGVJbWFnZSgpOwotCQljb25maWdzSW1hZ2UgPSBVcGRhdGVVSUltYWdlcy5ERVNDX0NPTkZJR1NfVklFVy5jcmVhdGVJbWFnZSgpOwotCQlzaXRlc0ltYWdlID0gVXBkYXRlVUlJbWFnZXMuREVTQ19TSVRFU19WSUVXLmNyZWF0ZUltYWdlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaXRlbUltYWdlLmRpc3Bvc2UoKTsKLQkJY29uZmlnc0ltYWdlLmRpc3Bvc2UoKTsKLQkJc2l0ZXNJbWFnZS5kaXNwb3NlKCk7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKE9iamVjdCBtb2RlbE9iamVjdCkgewotCQlzZXRIZWFkaW5nVGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX1RJVExFKSk7Ci0JCXN1cGVyLmluaXRpYWxpemUobW9kZWxPYmplY3QpOwotCQlJUHJlZmVyZW5jZVN0b3JlIHBzdG9yZSA9Ci0JCQlVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCXBzdG9yZS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKG5ldyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCWlmIChlLmdldFByb3BlcnR5KCkuZXF1YWxzKFVwZGF0ZUNvbG9ycy5QX1RPUElDX0NPTE9SKSkKLQkJCQkJdXBkYXRlQ29sb3JzKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVDb2xvcnMoKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9waWNzLnNpemUoKTsgaSsrKSB7Ci0JCQlDb250cm9sIHRvcGljID0gKENvbnRyb2wpIHRvcGljcy5nZXQoaSk7Ci0JCQl0b3BpYy5zZXRGb3JlZ3JvdW5kKFVwZGF0ZUNvbG9ycy5nZXRUb3BpY0NvbG9yKHRvcGljLmdldERpc3BsYXkoKSkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGludCBnZXROdW1Db2x1bW5zKCkgewotCQlyZXR1cm4gMTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUhUTUxUYWJsZUxheW91dCBsYXlvdXQgPSBuZXcgSFRNTFRhYmxlTGF5b3V0KCk7Ci0JCXBhcmVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJbGF5b3V0LmxlZnRNYXJnaW4gPSBsYXlvdXQucmlnaHRNYXJnaW4gPSAxMDsKLQkJbGF5b3V0LnRvcE1hcmdpbiA9IDE1OwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSA1OwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMDsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCi0JCUZvcm1XaWRnZXRGYWN0b3J5IGZhY3RvcnkgPSBnZXRGYWN0b3J5KCk7Ci0KLQkJTGFiZWwgdG9waWNJbWFnZTsKLQkJTGFiZWwgdG9waWM7Ci0JCUZvcm1FbmdpbmUgdGV4dDsKLQkJSHlwZXJsaW5rQWN0aW9uIGFjdGlvbjsKLQotCQlDb2xvciB0b3BpY0NvbG9yID0gVXBkYXRlQ29sb3JzLmdldFRvcGljQ29sb3IocGFyZW50LmdldERpc3BsYXkoKSk7Ci0KLQkJYWN0aW9uID0gbmV3IEh5cGVybGlua0FjdGlvbigpIHsKLQkJCXB1YmxpYyB2b2lkIGxpbmtBY3RpdmF0ZWQoSUh5cGVybGlua1NlZ21lbnQgbGluaykgewotCQkJCVVwZGF0ZXNWaWV3IHZpZXcgPQotCQkJCQkoVXBkYXRlc1ZpZXcpIHNob3dWaWV3KFVwZGF0ZVBlcnNwZWN0aXZlLklEX1VQREFURVMpOwotCQkJCWlmICh2aWV3ICE9IG51bGwpCi0JCQkJCXZpZXcuc2VsZWN0VXBkYXRlT2JqZWN0KCk7Ci0JCQl9Ci0JCX07Ci0JCXRvcGljSW1hZ2UgPSBmYWN0b3J5LmNyZWF0ZUxhYmVsKHBhcmVudCwgbnVsbCk7Ci0JCXRvcGljSW1hZ2Uuc2V0SW1hZ2UoaXRlbUltYWdlKTsKLQkJdG9waWMgPQotCQkJZmFjdG9yeS5jcmVhdGVIZWFkaW5nTGFiZWwoCi0JCQkJcGFyZW50LAotCQkJCVVwZGF0ZVVJLmdldFN0cmluZyhLRVlfVVBEQVRFU19USVRMRSksCi0JCQkJU1dULldSQVApOwotCQl0b3BpYy5zZXRGb3JlZ3JvdW5kKHRvcGljQ29sb3IpOwotCQl0b3BpY3MuYWRkKHRvcGljKTsKLQkJZmFjdG9yeS5jcmVhdGVMYWJlbChwYXJlbnQsIG51bGwpOwotCQl0ZXh0ID0gZmFjdG9yeS5jcmVhdGVGb3JtRW5naW5lKHBhcmVudCwgdHJ1ZSk7Ci0JCXNldEZvY3VzQ29udHJvbCh0ZXh0KTsKLQkJdGV4dC5sb2FkKAotCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9VUERBVEVTX0RFU0MpLAotCQkJdHJ1ZSwKLQkJCWZhbHNlKTsKLQkJdGV4dC5yZWdpc3RlclRleHRPYmplY3QoImFjdGlvbjEiLCBhY3Rpb24pOwotCQl0ZXh0LnJlZ2lzdGVyVGV4dE9iamVjdCgiaW1hZ2UxIiwgc2l0ZXNJbWFnZSk7Ci0JCVRhYmxlRGF0YSB0ZCA9IG5ldyBUYWJsZURhdGEoKTsKLQkJdGQuZ3JhYkhvcml6b250YWwgPSB0cnVlOwotCQl0ZXh0LnNldExheW91dERhdGEodGQpOwotCi0JCWFkZFNlcGFyYXRvcihwYXJlbnQpOwotCi0JCWFjdGlvbiA9IG5ldyBIeXBlcmxpbmtBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBsaW5rQWN0aXZhdGVkKElIeXBlcmxpbmtTZWdtZW50IGxpbmspIHsKLQkJCQlzaG93VmlldyhVcGRhdGVQZXJzcGVjdGl2ZS5JRF9VUERBVEVTKTsKLQkJCX0KLQkJfTsKLQkJdG9waWNJbWFnZSA9IGZhY3RvcnkuY3JlYXRlTGFiZWwocGFyZW50LCBudWxsKTsKLQkJdG9waWNJbWFnZS5zZXRJbWFnZShpdGVtSW1hZ2UpOwotCQl0b3BpYyA9Ci0JCQlmYWN0b3J5LmNyZWF0ZUhlYWRpbmdMYWJlbCgKLQkJCQlwYXJlbnQsCi0JCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9JTlNUQUxMU19USVRMRSksCi0JCQkJU1dULldSQVApOwotCQl0b3BpYy5zZXRGb3JlZ3JvdW5kKHRvcGljQ29sb3IpOwotCQl0b3BpY3MuYWRkKHRvcGljKTsKLQkJZmFjdG9yeS5jcmVhdGVMYWJlbChwYXJlbnQsIG51bGwpOwotCQl0ZXh0ID0gZmFjdG9yeS5jcmVhdGVGb3JtRW5naW5lKHBhcmVudCwgdHJ1ZSk7Ci0JCXRleHQubG9hZCgKLQkJCVVwZGF0ZVVJLmdldFN0cmluZyhLRVlfSU5TVEFMTFNfREVTQyksCi0JCQl0cnVlLAotCQkJZmFsc2UpOwotCQl0ZXh0LnJlZ2lzdGVyVGV4dE9iamVjdCgiYWN0aW9uMSIsIGFjdGlvbik7Ci0JCXRleHQucmVnaXN0ZXJUZXh0T2JqZWN0KCJpbWFnZTEiLCBzaXRlc0ltYWdlKTsKLQkJdGQgPSBuZXcgVGFibGVEYXRhKCk7Ci0JCXRkLmdyYWJIb3Jpem9udGFsID0gdHJ1ZTsKLQkJdGV4dC5zZXRMYXlvdXREYXRhKHRkKTsKLQkJYWRkU2VwYXJhdG9yKHBhcmVudCk7Ci0KLQkJYWN0aW9uID0gbmV3IEh5cGVybGlua0FjdGlvbigpIHsKLQkJCXB1YmxpYyB2b2lkIGxpbmtBY3RpdmF0ZWQoSUh5cGVybGlua1NlZ21lbnQgbGluaykgewotCQkJCUNvbmZpZ3VyYXRpb25WaWV3IHZpZXcgPQotCQkJCQkoQ29uZmlndXJhdGlvblZpZXcpIHNob3dWaWV3KFVwZGF0ZVBlcnNwZWN0aXZlCi0JCQkJCQkuSURfQ09ORklHVVJBVElPTik7Ci0JCQkJaWYgKHZpZXcgIT0gbnVsbCkKLQkJCQkJdmlldy5zZWxlY3RDdXJyZW50Q29uZmlndXJhdGlvbigpOwotCQkJfQotCQl9OwotCQl0b3BpY0ltYWdlID0gZmFjdG9yeS5jcmVhdGVMYWJlbChwYXJlbnQsIG51bGwpOwotCQl0b3BpY0ltYWdlLnNldEltYWdlKGl0ZW1JbWFnZSk7Ci0JCXRvcGljID0KLQkJCWZhY3RvcnkuY3JlYXRlSGVhZGluZ0xhYmVsKAotCQkJCXBhcmVudCwKLQkJCQlVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX1VOSU5TVEFMTFNfVElUTEUpLAotCQkJCVNXVC5XUkFQKTsKLQkJdG9waWMuc2V0Rm9yZWdyb3VuZCh0b3BpY0NvbG9yKTsKLQkJdG9waWNzLmFkZCh0b3BpYyk7Ci0JCWZhY3RvcnkuY3JlYXRlTGFiZWwocGFyZW50LCBudWxsKTsKLQkJdGV4dCA9IGZhY3RvcnkuY3JlYXRlRm9ybUVuZ2luZShwYXJlbnQsIHRydWUpOwotCQl0ZXh0LmxvYWQoCi0JCQlVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX1VOSU5TVEFMTFNfREVTQyksCi0JCQl0cnVlLAotCQkJZmFsc2UpOwotCQl0ZXh0LnJlZ2lzdGVyVGV4dE9iamVjdCgiYWN0aW9uMSIsIGFjdGlvbik7Ci0JCXRleHQucmVnaXN0ZXJUZXh0T2JqZWN0KCJpbWFnZTEiLCBjb25maWdzSW1hZ2UpOwotCQl0ZCA9IG5ldyBUYWJsZURhdGEoKTsKLQkJdGQuZ3JhYkhvcml6b250YWwgPSB0cnVlOwotCQl0ZXh0LnNldExheW91dERhdGEodGQpOwotCi0JCWFkZFNlcGFyYXRvcihwYXJlbnQpOwotCi0JCWFjdGlvbiA9IG5ldyBIeXBlcmxpbmtBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBsaW5rQWN0aXZhdGVkKElIeXBlcmxpbmtTZWdtZW50IGxpbmspIHsKLQkJCQlDb25maWd1cmF0aW9uVmlldyB2aWV3ID0KLQkJCQkJKENvbmZpZ3VyYXRpb25WaWV3KSBzaG93VmlldyhVcGRhdGVQZXJzcGVjdGl2ZQotCQkJCQkJLklEX0NPTkZJR1VSQVRJT04pOwotCQkJCWlmICh2aWV3ICE9IG51bGwpCi0JCQkJCXZpZXcuc2VsZWN0SGlzdG9yeUZvbGRlcigpOwotCQkJfQotCQl9OwotCQl0b3BpY0ltYWdlID0gZmFjdG9yeS5jcmVhdGVMYWJlbChwYXJlbnQsIG51bGwpOwotCQl0b3BpY0ltYWdlLnNldEltYWdlKGl0ZW1JbWFnZSk7Ci0JCXRvcGljID0KLQkJCWZhY3RvcnkuY3JlYXRlSGVhZGluZ0xhYmVsKAotCQkJCXBhcmVudCwKLQkJCQlVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX0hJU1RPUllfVElUTEUpLAotCQkJCVNXVC5XUkFQKTsKLQkJdG9waWMuc2V0Rm9yZWdyb3VuZCh0b3BpY0NvbG9yKTsKLQkJdG9waWNzLmFkZCh0b3BpYyk7Ci0JCWZhY3RvcnkuY3JlYXRlTGFiZWwocGFyZW50LCBudWxsKTsKLQkJdGV4dCA9IGZhY3RvcnkuY3JlYXRlRm9ybUVuZ2luZShwYXJlbnQsIHRydWUpOwotCQl0ZXh0LmxvYWQoCi0JCQlVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX0hJU1RPUllfREVTQyksCi0JCQl0cnVlLAotCQkJZmFsc2UpOwotCQl0ZXh0LnJlZ2lzdGVyVGV4dE9iamVjdCgiYWN0aW9uMSIsIGFjdGlvbik7Ci0JCXRkID0gbmV3IFRhYmxlRGF0YSgpOwotCQl0ZC5ncmFiSG9yaXpvbnRhbCA9IHRydWU7Ci0JCXRleHQuc2V0TGF5b3V0RGF0YSh0ZCk7Ci0JCVdvcmtiZW5jaEhlbHAuc2V0SGVscChwYXJlbnQsICJvcmcuZWNsaXBzZS51cGRhdGUudWkuTWFpbkZvcm0iKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkU2VwYXJhdG9yKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTlVMTCk7Ci0JCVRhYmxlRGF0YSB0ZCA9IG5ldyBUYWJsZURhdGEoKTsKLQkJdGQuY29sc3BhbiA9IDI7Ci0JCWxhYmVsLnNldExheW91dERhdGEodGQpOwotCX0KLQotCXByaXZhdGUgSVZpZXdQYXJ0IHNob3dWaWV3KFN0cmluZyB2aWV3SWQpIHsKLQkJdHJ5IHsKLQkJCUlWaWV3UGFydCBwYXJ0ID0gVXBkYXRlVUkuZ2V0QWN0aXZlUGFnZSgpLnNob3dWaWV3KHZpZXdJZCk7Ci0JCQlyZXR1cm4gcGFydDsKLQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvZm9ybXMvTXVsdGlwbGVTZWxlY3Rpb25Gb3JtLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvZm9ybXMvTXVsdGlwbGVTZWxlY3Rpb25Gb3JtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmZjY4MGEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL2Zvcm1zL011bHRpcGxlU2VsZWN0aW9uRm9ybS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnBhZ2VzLlVwZGF0ZUZvcm1QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wYXJ0cy5EZWZhdWx0Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbC4qOwotCi1wdWJsaWMgY2xhc3MgTXVsdGlwbGVTZWxlY3Rpb25Gb3JtIGV4dGVuZHMgVXBkYXRlV2ViRm9ybSB7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb247Ci0JcHJpdmF0ZSBMYWJlbCBjb3VudGVyOwotCXByaXZhdGUgVGFibGVWaWV3ZXIgdGFibGVWaWV3ZXI7Ci0KLQljbGFzcyBWaWV3UHJvdmlkZXIKLQkJZXh0ZW5kcyBEZWZhdWx0Q29udGVudFByb3ZpZGVyCi0JCWltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQkJcmV0dXJuIHNlbGVjdGlvbi50b0FycmF5KCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgTXVsdGlwbGVTZWxlY3Rpb25Gb3JtKFVwZGF0ZUZvcm1QYWdlIHBhZ2UpIHsKLQkJc3VwZXIocGFnZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIG9iamVjdENoYW5nZWQoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCWlmIChzZWxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKG9iamVjdC5lcXVhbHMob2JqKSkgewotCQkJCWdldENvbnRyb2woKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJZXhwYW5kVG8oc2VsZWN0aW9uKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShPYmplY3QgbW9kZWxPYmplY3QpIHsKLQkJc2V0SGVhZGluZ1RleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKCJNdWx0aXBsZVNlbGVjdGlvbkZvcm0udGl0bGUiKSk7Ci0JCXN1cGVyLmluaXRpYWxpemUobW9kZWxPYmplY3QpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJSFRNTFRhYmxlTGF5b3V0IGxheW91dCA9IG5ldyBIVE1MVGFibGVMYXlvdXQoKTsKLQkJcGFyZW50LnNldExheW91dChsYXlvdXQpOwotCQlsYXlvdXQubGVmdE1hcmdpbiA9IGxheW91dC5yaWdodE1hcmdpbiA9IDEwOwotCQlsYXlvdXQudG9wTWFyZ2luID0gMTA7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDA7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAyMDsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCi0JCUZvcm1XaWRnZXRGYWN0b3J5IGZhY3RvcnkgPSBnZXRGYWN0b3J5KCk7Ci0JCWNvdW50ZXIgPSBmYWN0b3J5LmNyZWF0ZUxhYmVsKHBhcmVudCwgIiIpOwotCQlUYWJsZURhdGEgdGQgPSBuZXcgVGFibGVEYXRhKCk7Ci0JCXRkLmFsaWduID0gVGFibGVEYXRhLkZJTEw7Ci0JCWNvdW50ZXIuc2V0TGF5b3V0RGF0YSh0ZCk7Ci0JCXRhYmxlVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKGZhY3RvcnkuY3JlYXRlVGFibGUocGFyZW50LCBTV1QuTlVMTCkpOwotCQl0YWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IFZpZXdQcm92aWRlcigpKTsKLQkJdGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0TGFiZWxQcm92aWRlcigpKTsKLQkJdGQgPSBuZXcgVGFibGVEYXRhKCk7Ci0JCXRkLmFsaWduID0gVGFibGVEYXRhLkZJTEw7Ci0JCXRkLnZhbGlnbiA9IFRhYmxlRGF0YS5GSUxMOwotCQl0YWJsZVZpZXdlci5nZXRUYWJsZSgpLnNldExheW91dERhdGEodGQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4cGFuZFRvKE9iamVjdCBvYmopIHsKLQkJU3RyaW5nIG5hbWUgPSAiIjsKLQotCQlpZiAob2JqICE9IG51bGwgJiYgb2JqIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCXNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgb2JqOwotCQkJcmVmcmVzaCgpOwotCQkJdGFibGVWaWV3ZXIuZ2V0Q29udHJvbCgpLmdldFBhcmVudCgpLmxheW91dCh0cnVlKTsKLQkJCXRhYmxlVmlld2VyLmdldENvbnRyb2woKS5nZXRQYXJlbnQoKS5nZXRQYXJlbnQoKS5sYXlvdXQodHJ1ZSk7Ci0JCQl1cGRhdGVTaXplKCk7Ci0JCX0KLQl9Ci0JcHJpdmF0ZSB2b2lkIHJlZnJlc2goKSB7Ci0JCWludCBzaXplID0gc2VsZWN0aW9uLnNpemUoKTsKLQkJY291bnRlci5zZXRUZXh0KAotCQkJVXBkYXRlVUkuZ2V0Rm9ybWF0dGVkTWVzc2FnZSgKLQkJCQkiTXVsdGlwbGVTZWxlY3Rpb25Gb3JtLmNvdW50ZXIiLAotCQkJCSIiICsgc2l6ZSkpOwotCQl0YWJsZVZpZXdlci5zZXRJbnB1dChzZWxlY3Rpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9mb3Jtcy9NeUNvbXB1dGVyRm9ybS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL2Zvcm1zL015Q29tcHV0ZXJGb3JtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyMDRjYTkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL2Zvcm1zL015Q29tcHV0ZXJGb3JtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuV29ya2JlbmNoSGVscDsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnBhZ2VzLlVwZGF0ZUZvcm1QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbC4qOwotCi0KLXB1YmxpYyBjbGFzcyBNeUNvbXB1dGVyRm9ybSBleHRlbmRzIFVwZGF0ZVdlYkZvcm0gewotCXByaXZhdGUgU2l0ZUJvb2ttYXJrIGN1cnJlbnRCb29rbWFyazsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1RJVExFID0gIk15Q29tcHV0ZXJQYWdlLnRpdGxlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX05USVRMRSA9ICJNeUNvbXB1dGVyUGFnZS5udGl0bGUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfREVTQyA9ICJNeUNvbXB1dGVyUGFnZS5kZXNjIjsKLQkKLXB1YmxpYyBNeUNvbXB1dGVyRm9ybShVcGRhdGVGb3JtUGFnZSBwYWdlKSB7Ci0Jc3VwZXIocGFnZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0Jc3VwZXIuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCBpbml0aWFsaXplKE9iamVjdCBtb2RlbE9iamVjdCkgewotCXNldEhlYWRpbmdUZXh0KFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfVElUTEUpKTsKLQlzdXBlci5pbml0aWFsaXplKG1vZGVsT2JqZWN0KTsKLX0KLQotcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCUhUTUxUYWJsZUxheW91dCBsYXlvdXQgPSBuZXcgSFRNTFRhYmxlTGF5b3V0KCk7Ci0JcGFyZW50LnNldExheW91dChsYXlvdXQpOwotCWxheW91dC5sZWZ0TWFyZ2luID0gbGF5b3V0LnJpZ2h0TWFyZ2luID0gMTA7Ci0JbGF5b3V0LnRvcE1hcmdpbiA9IDEwOwotCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAyMDsKLQkvLyBkZWZlY3QgMTM2ODYKLQkvL2xheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDA7Ci0JbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQotCUZvcm1XaWRnZXRGYWN0b3J5IGZhY3RvcnkgPSBnZXRGYWN0b3J5KCk7Ci0JCi0JTGFiZWwgdGV4dCA9IGZhY3RvcnkuY3JlYXRlTGFiZWwocGFyZW50LCBudWxsLCBTV1QuV1JBUCk7Ci0JdGV4dC5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfREVTQykpOwotCVdvcmtiZW5jaEhlbHAuc2V0SGVscChwYXJlbnQsICJvcmcuZWNsaXBzZS51cGRhdGUudWkuTXlDb21wdXRlckZvcm0iKTsKLX0KLQotcHVibGljIHZvaWQgZXhwYW5kVG8oT2JqZWN0IG9iaikgewotCWlmIChvYmogaW5zdGFuY2VvZiBNeUNvbXB1dGVyKSB7Ci0JCWlucHV0Q2hhbmdlZCgoTXlDb21wdXRlcilvYmopOwotCX0KLX0KLQotcHJpdmF0ZSB2b2lkIGlucHV0Q2hhbmdlZChNeUNvbXB1dGVyIG15Q29tcHV0ZXIpIHsKLQlTdHJpbmcgcGF0dGVybiA9IFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfVElUTEUpOwotCVN0cmluZyBuYW1lID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLm5hbWUiKTsKLQlTdHJpbmcgbWVzc2FnZSA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KHBhdHRlcm4sIG5ldyBPYmplY3RbXSB7bmFtZX0pOwotCXNldEhlYWRpbmdUZXh0KG1lc3NhZ2UpOwotfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvZm9ybXMvUHJlc2VydmVTZWN0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvZm9ybXMvUHJlc2VydmVTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhOWZhMjIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL2Zvcm1zL1ByZXNlcnZlU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLmZvcm1zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlNpdGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wYWdlcy5VcGRhdGVGb3JtUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkudmlld3MuQ29uZmlndXJhdGlvblZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsLmVuZ2luZS4qOwotCi1wdWJsaWMgY2xhc3MgUHJlc2VydmVTZWN0aW9uIGV4dGVuZHMgVXBkYXRlU2VjdGlvbiB7Ci0JLy8gTkwga2V5cwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVElUTEUgPSAiSW5zdGFsbENvbmZpZ3VyYXRpb25QYWdlLlByZXNlcnZlU2VjdGlvbi50aXRsZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RFU0MgPSAiSW5zdGFsbENvbmZpZ3VyYXRpb25QYWdlLlByZXNlcnZlU2VjdGlvbi5kZXNjIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVEVYVCA9ICJJbnN0YWxsQ29uZmlndXJhdGlvblBhZ2UuUHJlc2VydmVTZWN0aW9uLnRleHQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9QUkVTRVJWRV9URVhUID0gIkluc3RhbGxDb25maWd1cmF0aW9uUGFnZS5QcmVzZXJ2ZVNlY3Rpb24ucHJlc2VydmVUZXh0IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUFJFU0VSVkVfQlVUVE9OID0gIkluc3RhbGxDb25maWd1cmF0aW9uUGFnZS5QcmVzZXJ2ZVNlY3Rpb24ucHJlc2VydmVCdXR0b24iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIENvbXBvc2l0ZSBjb250YWluZXI7Ci0JcHJpdmF0ZSBGb3JtV2lkZ2V0RmFjdG9yeSBmYWN0b3J5OwotCXByaXZhdGUgSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZzsKLQlwcml2YXRlIEZvcm1FbmdpbmUgdGV4dExhYmVsOwotCXByaXZhdGUgTGFiZWwgcHJlc2VydmVMYWJlbDsKLQlwcml2YXRlIEJ1dHRvbiBwcmVzZXJ2ZUJ1dHRvbjsKLQotCXB1YmxpYyBQcmVzZXJ2ZVNlY3Rpb24oVXBkYXRlRm9ybVBhZ2UgcGFnZSkgewotCQlzdXBlcihwYWdlKTsKLQkJc2V0QWRkU2VwYXJhdG9yKGZhbHNlKTsKLQkJc2V0SGVhZGVyVGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX1RJVExFKSk7Ci0JCVVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRMYWJlbFByb3ZpZGVyKCkuY29ubmVjdCh0aGlzKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKS5kaXNjb25uZWN0KHRoaXMpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHVibGljIENvbXBvc2l0ZSBjcmVhdGVDbGllbnQoCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCUZvcm1XaWRnZXRGYWN0b3J5IGZhY3RvcnkpIHsKLQkJSFRNTFRhYmxlTGF5b3V0IGxheW91dCA9IG5ldyBIVE1MVGFibGVMYXlvdXQoKTsKLQkJdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsKLQkJdXBkYXRlSGVhZGVyQ29sb3IoKTsKLQkJbGF5b3V0LmxlZnRNYXJnaW4gPSBsYXlvdXQucmlnaHRNYXJnaW4gPSAwOwotCQlsYXlvdXQudG9wTWFyZ2luID0gMDsKLQkJY29udGFpbmVyID0gZmFjdG9yeS5jcmVhdGVDb21wb3NpdGUocGFyZW50KTsKLQkJY29udGFpbmVyLnNldExheW91dChsYXlvdXQpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCXRleHRMYWJlbCA9IGZhY3RvcnkuY3JlYXRlRm9ybUVuZ2luZShjb250YWluZXIpOyAvLyROT04tTkxTLTEkCi0JCVRhYmxlRGF0YSB0ZCA9IG5ldyBUYWJsZURhdGEoKTsKLQkJdGQuYWxpZ24gPSBUYWJsZURhdGEuRklMTDsKLQkJdGQuZ3JhYkhvcml6b250YWwgPSB0cnVlOwotCQl0ZC5jb2xzcGFuID0gMjsKLQkJdGV4dExhYmVsLnNldExheW91dERhdGEodGQpOwotCQl0ZXh0TGFiZWwubG9hZChVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX1RFWFQpLCB0cnVlLCBmYWxzZSk7Ci0JCUltYWdlIGNvbmZpZ3NJbWFnZSA9IFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRMYWJlbFByb3ZpZGVyKCkuZ2V0KFVwZGF0ZVVJSW1hZ2VzLkRFU0NfQ09ORklHU19WSUVXKTsKLQkJSHlwZXJsaW5rQWN0aW9uIGFjdGlvbiA9IG5ldyBIeXBlcmxpbmtBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBsaW5rQWN0aXZhdGVkKElIeXBlcmxpbmtTZWdtZW50IGxpbmspIHsKLQkJCQlDb25maWd1cmF0aW9uVmlldyB2aWV3ID0KLQkJCQkJKENvbmZpZ3VyYXRpb25WaWV3KSBzaG93VmlldyhVcGRhdGVQZXJzcGVjdGl2ZQotCQkJCQkJLklEX0NPTkZJR1VSQVRJT04pOwotCQkJCWlmICh2aWV3ICE9IG51bGwpCi0JCQkJCXZpZXcuZXhwYW5kUHJlc2VydmVkQ29uZmlndXJhdGlvbnMoKTsKLQkJCX0KLQkJfTsKLQkJdGV4dExhYmVsLnJlZ2lzdGVyVGV4dE9iamVjdCgibGluayIsIGFjdGlvbik7Ci0JCXRleHRMYWJlbC5yZWdpc3RlclRleHRPYmplY3QoImltYWdlIiwgY29uZmlnc0ltYWdlKTsKLQkJcHJlc2VydmVMYWJlbCA9IGZhY3RvcnkuY3JlYXRlTGFiZWwoY29udGFpbmVyLCBVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX1BSRVNFUlZFX1RFWFQpKTsKLQkJdGQgPSBuZXcgVGFibGVEYXRhKCk7Ci0JCXRkLnZhbGlnbiA9IFRhYmxlRGF0YS5NSURETEU7Ci0JCQkJCi0JCXByZXNlcnZlQnV0dG9uID0gZmFjdG9yeS5jcmVhdGVCdXR0b24oY29udGFpbmVyLCBVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX1BSRVNFUlZFX0JVVFRPTiksIFNXVC5QVVNIKTsgLy8kTk9OLU5MUy0xJAotCQlwcmVzZXJ2ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlwZXJmb3JtUHJlc2VydmUoKTsKLQkJCX0KLQkJfSk7Ci0JCXByZXNlcnZlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBjb25maWd1cmF0aW9uQ2hhbmdlZChJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCQlwcmVzZXJ2ZUJ1dHRvbi5zZXRFbmFibGVkKGNvbmZpZyE9bnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBlcmZvcm1QcmVzZXJ2ZSgpIHsKLQkJdHJ5IHsKLQkJCUlMb2NhbFNpdGUgbG9jYWxTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7Ci0JCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gdGFyZ2V0ID0gY29uZmlnOwotCQkJbG9jYWxTaXRlLmFkZFRvUHJlc2VydmVkQ29uZmlndXJhdGlvbnMoY29uZmlnKTsKLQkJCWxvY2FsU2l0ZS5zYXZlKCk7Ci0JCQlJVmlld1BhcnQgcGFydCA9IFVwZGF0ZVVJLmdldEFjdGl2ZVBhZ2UoKS5maW5kVmlldyhVcGRhdGVQZXJzcGVjdGl2ZS5JRF9DT05GSUdVUkFUSU9OKTsKLQkJCWlmIChwYXJ0IT1udWxsKSB7Ci0JCQkJKChDb25maWd1cmF0aW9uVmlldylwYXJ0KS5leHBhbmRQcmVzZXJ2ZWRDb25maWd1cmF0aW9ucygpOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVVwZGF0ZVVJLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIElWaWV3UGFydCBzaG93VmlldyhTdHJpbmcgdmlld0lkKSB7Ci0JCXRyeSB7Ci0JCQlJVmlld1BhcnQgcGFydCA9IFVwZGF0ZVVJLmdldEFjdGl2ZVBhZ2UoKS5zaG93Vmlldyh2aWV3SWQpOwotCQkJcmV0dXJuIHBhcnQ7Ci0JCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIENvbnRyb2wgZ2V0Rm9jdXNDb250cm9sKCkgewotCQlyZXR1cm4gcHJlc2VydmVCdXR0b247Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9mb3Jtcy9Qcm9wZXJ0eVdlYkZvcm0uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9mb3Jtcy9Qcm9wZXJ0eVdlYkZvcm0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmIxY2NjOS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvZm9ybXMvUHJvcGVydHlXZWJGb3JtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5mb3JtczsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnBhZ2VzLklVcGRhdGVGb3JtUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkucHJlZmVyZW5jZXMuVXBkYXRlQ29sb3JzOwotCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlXZWJGb3JtIGV4dGVuZHMgVXBkYXRlV2ViRm9ybSB7Ci0JcHJpdmF0ZSBBcnJheUxpc3QgaGVhZGluZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgUHJvcGVydHlXZWJGb3JtLgotCSAqIEBwYXJhbSBwYWdlCi0JICovCi0JcHVibGljIFByb3BlcnR5V2ViRm9ybShJVXBkYXRlRm9ybVBhZ2UgcGFnZSkgewotCQlzdXBlcihwYWdlKTsKLQkJSVByZWZlcmVuY2VTdG9yZSBwc3RvcmUgPQotCQkJVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlwc3RvcmUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihuZXcgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlpZiAoZS5nZXRQcm9wZXJ0eSgpLmVxdWFscyhVcGRhdGVDb2xvcnMuUF9UT1BJQ19DT0xPUikpCi0JCQkJCXVwZGF0ZUhlYWRpbmdzKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUhlYWRpbmdzKCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGhlYWRpbmdzLnNpemUoKTsgaSsrKSB7Ci0JCQlDb250cm9sIGMgPSAoQ29udHJvbCkgaGVhZGluZ3MuZ2V0KGkpOwotCQkJYy5zZXRGb3JlZ3JvdW5kKFVwZGF0ZUNvbG9ycy5nZXRUb3BpY0NvbG9yKGMuZ2V0RGlzcGxheSgpKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgTGFiZWwgY3JlYXRlUHJvcGVydHkoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIG5hbWUpIHsKLQkJY3JlYXRlSGVhZGluZyhwYXJlbnQsIG5hbWUpOwotCQlMYWJlbCBsYWJlbCA9IGZhY3RvcnkuY3JlYXRlTGFiZWwocGFyZW50LCBudWxsKTsKLQkJbGFiZWwuc2V0VGV4dCgiIik7Ci0JCWxhYmVsLnNldExheW91dERhdGEoY3JlYXRlUHJvcGVydHlMYXlvdXREYXRhKCkpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVQcm9wZXJ0eUxheW91dERhdGEoKSB7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxJbmRlbnQgPSAxMDsKLQkJcmV0dXJuIGdkOwotCX0KLQotCXByb3RlY3RlZCBMYWJlbCBjcmVhdGVIZWFkaW5nKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCUxhYmVsIGwgPSBmYWN0b3J5LmNyZWF0ZUhlYWRpbmdMYWJlbChwYXJlbnQsIHRleHQpOwotCQlDb2xvciBoYyA9IFVwZGF0ZUNvbG9ycy5nZXRUb3BpY0NvbG9yKHBhcmVudC5nZXREaXNwbGF5KCkpOwotCQlsLnNldEZvcmVncm91bmQoaGMpOwotCQloZWFkaW5ncy5hZGQobCk7Ci0JCXJldHVybiBsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL2Zvcm1zL1JldmVydFNlY3Rpb24uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9mb3Jtcy9SZXZlcnRTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmZWIzZDUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL2Zvcm1zL1JldmVydFNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5mb3JtczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlByb2dyZXNzTW9uaXRvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi5JSW5zdGFsbENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uSUxvY2FsU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5TaXRlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnBhZ2VzLlVwZGF0ZUZvcm1QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbC4qOwotCi1wdWJsaWMgY2xhc3MgUmV2ZXJ0U2VjdGlvbiBleHRlbmRzIFVwZGF0ZVNlY3Rpb24gewotCS8vIE5MIGtleXMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1RJVExFID0gIkluc3RhbGxDb25maWd1cmF0aW9uUGFnZS5SZXZlcnRTZWN0aW9uLnRpdGxlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfREVTQyA9ICJJbnN0YWxsQ29uZmlndXJhdGlvblBhZ2UuUmV2ZXJ0U2VjdGlvbi5kZXNjIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ1VSUkVOVF9URVhUID0gIkluc3RhbGxDb25maWd1cmF0aW9uUGFnZS5SZXZlcnRTZWN0aW9uLmN1cnJlbnRUZXh0IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUkVWRVJUX1RFWFQgPSAiSW5zdGFsbENvbmZpZ3VyYXRpb25QYWdlLlJldmVydFNlY3Rpb24ucmV2ZXJ0VGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1JFVkVSVF9CVVRUT04gPSAiSW5zdGFsbENvbmZpZ3VyYXRpb25QYWdlLlJldmVydFNlY3Rpb24ucmV2ZXJ0QnV0dG9uIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUkVTVE9SRV9URVhUID0gIkluc3RhbGxDb25maWd1cmF0aW9uUGFnZS5SZXZlcnRTZWN0aW9uLnJlc3RvcmVUZXh0IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUkVTVE9SRV9CVVRUT04gPSAiSW5zdGFsbENvbmZpZ3VyYXRpb25QYWdlLlJldmVydFNlY3Rpb24ucmVzdG9yZUJ1dHRvbiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RJQUxPR19USVRMRSA9ICJJbnN0YWxsQ29uZmlndXJhdGlvblBhZ2UuUmV2ZXJ0U2VjdGlvbi5kaWFsb2cudGl0bGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ESUFMT0dfTUVTU0FHRSA9ICJJbnN0YWxsQ29uZmlndXJhdGlvblBhZ2UuUmV2ZXJ0U2VjdGlvbi5kaWFsb2cubWVzc2FnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgQ29tcG9zaXRlIGNvbnRhaW5lcjsKLQlwcml2YXRlIEZvcm1XaWRnZXRGYWN0b3J5IGZhY3Rvcnk7Ci0JcHJpdmF0ZSBJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnOwotCXByaXZhdGUgTGFiZWwgY3VycmVudFRleHRMYWJlbDsKLQlwcml2YXRlIExhYmVsIHRleHRMYWJlbDsKLQlwcml2YXRlIEJ1dHRvbiByZXZlcnRCdXR0b247Ci0KLQlwdWJsaWMgUmV2ZXJ0U2VjdGlvbihVcGRhdGVGb3JtUGFnZSBwYWdlKSB7Ci0JCXN1cGVyKHBhZ2UpOwotCQlzZXRBZGRTZXBhcmF0b3IoZmFsc2UpOwotCQlzZXRIZWFkZXJUZXh0KFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfVElUTEUpKTsKLQkJc2V0RGVzY3JpcHRpb24oVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9ERVNDKSk7Ci0JfQotCi0JcHVibGljIENvbXBvc2l0ZSBjcmVhdGVDbGllbnQoCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCUZvcm1XaWRnZXRGYWN0b3J5IGZhY3RvcnkpIHsKLQkJSFRNTFRhYmxlTGF5b3V0IGxheW91dCA9IG5ldyBIVE1MVGFibGVMYXlvdXQoKTsKLQkJdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsKLQkJLy9oZWFkZXIuc2V0Rm9yZWdyb3VuZChmYWN0b3J5LmdldENvbG9yKGZhY3RvcnkuQ09MT1JfQ09NUE9TSVRFX1NFUEFSQVRPUikpOwotCQl1cGRhdGVIZWFkZXJDb2xvcigpOwotCQlsYXlvdXQubGVmdE1hcmdpbiA9IGxheW91dC5yaWdodE1hcmdpbiA9IDA7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDA7Ci0JCWNvbnRhaW5lciA9IGZhY3RvcnkuY3JlYXRlQ29tcG9zaXRlKHBhcmVudCk7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXQobGF5b3V0KTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQljdXJyZW50VGV4dExhYmVsID0gZmFjdG9yeS5jcmVhdGVMYWJlbChjb250YWluZXIsICIiKTsgLy8kTk9OLU5MUy0xJAotCQljdXJyZW50VGV4dExhYmVsLnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0QmFubmVyRm9udCgpKTsKLQkJVGFibGVEYXRhIHRkID0gbmV3IFRhYmxlRGF0YSgpOwotCQl0ZC52YWxpZ24gPSBUYWJsZURhdGEuTUlERExFOwotCQljdXJyZW50VGV4dExhYmVsLnNldExheW91dERhdGEodGQpOwotCQl0ZXh0TGFiZWwgPSBmYWN0b3J5LmNyZWF0ZUxhYmVsKGNvbnRhaW5lciwgIiIsIFNXVC5XUkFQKTsgLy8kTk9OLU5MUy0xJAotCQl0ZCA9IG5ldyBUYWJsZURhdGEoKTsKLQkJdGQudmFsaWduID0gVGFibGVEYXRhLk1JRERMRTsKLQkJdGV4dExhYmVsLnNldExheW91dERhdGEodGQpOwotCQlyZXZlcnRCdXR0b24gPSBmYWN0b3J5LmNyZWF0ZUJ1dHRvbihjb250YWluZXIsICIiLCBTV1QuUFVTSCk7IC8vJE5PTi1OTFMtMSQKLQkJcmV2ZXJ0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXBlcmZvcm1SZXZlcnQoKTsKLQkJCX0KLQkJfSk7Ci0JCXRkID0gbmV3IFRhYmxlRGF0YSgpOwotCQl0ZC5pbmRlbnQgPSA1OwotCQl0ZC52YWxpZ24gPSBUYWJsZURhdGEuTUlERExFOwotCQlyZXZlcnRCdXR0b24uc2V0TGF5b3V0RGF0YSh0ZCk7Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgY29uZmlndXJhdGlvbkNoYW5nZWQoSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQl0aGlzLmNvbmZpZyA9IGNvbmZpZzsKLQkJYm9vbGVhbiBjYW5SZXZlcnQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUlMb2NhbFNpdGUgbG9jYWxTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7Ci0JCQlJSW5zdGFsbENvbmZpZ3VyYXRpb25bXSBoaXN0b3J5ID0KLQkJCQlsb2NhbFNpdGUuZ2V0Q29uZmlndXJhdGlvbkhpc3RvcnkoKTsKLQkJCWludCBsZW5ndGggPSBoaXN0b3J5Lmxlbmd0aDsKLQkJCWNhblJldmVydCA9IGxlbmd0aCA+IDE7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJVXBkYXRlVUkubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCWNvbnRhaW5lci5nZXRQYXJlbnQoKS5zZXRWaXNpYmxlKGNhblJldmVydCk7Ci0JCWlmICghY2FuUmV2ZXJ0KQotCQkJcmV0dXJuOwotCQlpZiAoY29uZmlnLmlzQ3VycmVudCgpKSB7Ci0JCQljdXJyZW50VGV4dExhYmVsLnNldFRleHQoCi0JCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9DVVJSRU5UX1RFWFQpKTsKLQkJCXRleHRMYWJlbC5zZXRUZXh0KAotCQkJCVVwZGF0ZVVJLmdldFN0cmluZyhLRVlfUkVWRVJUX1RFWFQpKTsKLQkJCXJldmVydEJ1dHRvbi5zZXRUZXh0KAotCQkJCVVwZGF0ZVVJLmdldFN0cmluZyhLRVlfUkVWRVJUX0JVVFRPTikpOwotCQl9IGVsc2UgewotCQkJY3VycmVudFRleHRMYWJlbC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJdGV4dExhYmVsLnNldFRleHQoCi0JCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9SRVNUT1JFX1RFWFQpKTsKLQkJCXJldmVydEJ1dHRvbi5zZXRUZXh0KAotCQkJCVVwZGF0ZVVJLmdldFN0cmluZyhLRVlfUkVTVE9SRV9CVVRUT04pKTsKLQkJfQotCQljb250YWluZXIubGF5b3V0KHRydWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwZXJmb3JtUmV2ZXJ0KCkgewotCQl0cnkgewotCQkJSUxvY2FsU2l0ZSBsb2NhbFNpdGUgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsKLQkJCUlJbnN0YWxsQ29uZmlndXJhdGlvbiB0YXJnZXQgPSBjb25maWc7Ci0JCQlpZiAoY29uZmlnLmlzQ3VycmVudCgpKSB7Ci0JCQkJLy8gdGFrZSB0aGUgcHJldmlvdXMgb25lCi0JCQkJSUluc3RhbGxDb25maWd1cmF0aW9uW10gaGlzdG9yeSA9Ci0JCQkJCWxvY2FsU2l0ZS5nZXRDb25maWd1cmF0aW9uSGlzdG9yeSgpOwotCQkJCXRhcmdldCA9IGhpc3RvcnlbaGlzdG9yeS5sZW5ndGggLSAyXTsKLQkJCX0KLQkJCXBlcmZvcm1SZXZlcnQodGFyZ2V0KTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlVcGRhdGVVSS5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGVyZm9ybVJldmVydChmaW5hbCBJSW5zdGFsbENvbmZpZ3VyYXRpb24gdGFyZ2V0KSB7Ci0JCXBlcmZvcm1SZXZlcnQodGFyZ2V0LCB0cnVlLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcGVyZm9ybVJldmVydCgKLQkJZmluYWwgSUluc3RhbGxDb25maWd1cmF0aW9uIHRhcmdldCwKLQkJYm9vbGVhbiBjb25maXJtLCAKLQkJZmluYWwgYm9vbGVhbiByZXN0YXJ0KSB7Ci0JCWlmIChjb25maXJtKSB7Ci0JCQkvLyBhc2sgdGhlIHVzZXIgdG8gY29uZmlybSBhbmQgYmFpbCBpZiBjYW5jZWxlZAotCQkJU3RyaW5nIHRpdGxlID0gVXBkYXRlVUkuZ2V0QWN0aXZlUGFnZSgpLmdldExhYmVsKCk7Ci0JCQlpZiAoIU1lc3NhZ2VEaWFsb2cub3BlbkNvbmZpcm0oVXBkYXRlVUkuZ2V0QWN0aXZlV29ya2JlbmNoU2hlbGwoKSwgdGl0bGUsIFVwZGF0ZVVJLmdldFN0cmluZygiSW5zdGFsbENvbmZpZ3VyYXRpb25QYWdlLlJldmVydFNlY3Rpb24uY29uZmlybS5tZXNzYWdlIikpKSAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLy8gbWFrZSBzdXJlIHdlIGNhbiBhY3R1YWxseSBkbyB0aGUgcmV2ZXJ0Ci0JCUlTdGF0dXMgc3RhdHVzID0gQWN0aXZpdHlDb25zdHJhaW50cy52YWxpZGF0ZVBlbmRpbmdSZXZlcnQodGFyZ2V0KTsKLQkJaWYgKHN0YXR1cyAhPSBudWxsKSB7Ci0JCQlFcnJvckRpYWxvZy5vcGVuRXJyb3IoCi0JCQkJVXBkYXRlVUkuZ2V0QWN0aXZlV29ya2JlbmNoU2hlbGwoKSwKLQkJCQludWxsLAotCQkJCW51bGwsCi0JCQkJc3RhdHVzKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8vIG9rIHRvIHBlcmZvcm0gdGhlIG9wZXJhdGlvbgotCQlmaW5hbCBib29sZWFuIFtdIHJlc3VsdCA9IG5ldyBib29sZWFuWzFdOwotCQlyZXN1bHRbMF0gPSBmYWxzZTsKLQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wZXJhdGlvbiA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQlib29sZWFuIHN1Y2Nlc3MgPSBmYWxzZTsKLQkJCQl0cnkgewotCQkJCQlJTG9jYWxTaXRlIGxvY2FsU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpOwotCQkJCQlsb2NhbFNpdGUucmV2ZXJ0VG8odGFyZ2V0LCBtb25pdG9yLCBuZXcgVUlQcm9ibGVtSGFuZGxlcigpKTsKLQkJCQkJc2F2ZUxvY2FsU2l0ZSgpOwotCQkJCQlzdWNjZXNzID0gdHJ1ZTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJVXBkYXRlVUkubG9nRXhjZXB0aW9uKGUpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJCQlyZXN1bHRbMF0gPSBzdWNjZXNzOwotCQkJCQlpZiAoc3VjY2VzcyAmJiByZXN0YXJ0KQotCQkJCQkJVXBkYXRlVUkuaW5mb3JtUmVzdGFydE5lZWRlZCgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJdHJ5IHsKLQkJCVByb2dyZXNzTW9uaXRvckRpYWxvZyBkaWFsb2cgPQotCQkJCW5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2coCi0JCQkJCVVwZGF0ZVVJLmdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCkuZ2V0U2hlbGwoKSk7Ci0JCQlkaWFsb2cucnVuKGZhbHNlLCB0cnVlLCBvcGVyYXRpb24pOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCVVwZGF0ZVVJLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiByZXN1bHRbMF07Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBzYXZlTG9jYWxTaXRlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJTG9jYWxTaXRlIGxvY2FsU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpOwotCQlsb2NhbFNpdGUuc2F2ZSgpOwotCX0KLQlwdWJsaWMgQ29udHJvbCBnZXRGb2N1c0NvbnRyb2woKSB7Ci0JCXJldHVybiByZXZlcnRCdXR0b247Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9mb3Jtcy9TZWFyY2hGb3JtLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvZm9ybXMvU2VhcmNoRm9ybS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWE3NWMzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9mb3Jtcy9TZWFyY2hGb3JtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLlByb2dyZXNzTW9uaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5Xb3JrYmVuY2hIZWxwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUGFnZUJvb2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wYWdlcy5VcGRhdGVGb3JtUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuc2VhcmNoLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnZpZXdzLlNlYXJjaFJlc3VsdFZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsLmVuZ2luZS5Gb3JtRW5naW5lOwotCi1wdWJsaWMgY2xhc3MgU2VhcmNoRm9ybSBleHRlbmRzIFVwZGF0ZVdlYkZvcm0gewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVElUTEUgPSAiU2VhcmNoUGFnZS50aXRsZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9MQVNUX1NFQVJDSCA9ICJTZWFyY2hQYWdlLmxhc3RTZWFyY2giOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTk9fTEFTVF9TRUFSQ0ggPSAiU2VhcmNoUGFnZS5ub0xhc3RTZWFyY2giOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU0VBUkNIX05PVyA9ICJTZWFyY2hQYWdlLnNlYXJjaE5vdyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DQU5DRUwgPSAiU2VhcmNoUGFnZS5jYW5jZWwiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfREVTQyA9ICJTZWFyY2hQYWdlLmRlc2MiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUVVFUlkgPSAiU2VhcmNoUGFnZS5xdWVyeS5sYWJlbCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DQVRFR09SWSA9ICJTZWFyY2hQYWdlLnF1ZXJ5LmNhdGVnb3J5IjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX09QVElPTlMgPSAiU2VhcmNoUGFnZS5vcHRpb25zLmxhYmVsIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX01ZX0NPTVBVVEVSX0NIRUNLID0KLQkJIlNlYXJjaFBhZ2Uub3B0aW9ucy5teUNvbXB1dGVyQ2hlY2siOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTVlfQ09NUFVURVJfVElUTEUgPQotCQkiU2VhcmNoUGFnZS5vcHRpb25zLm15Q29tcHV0ZXJTZXR0aW5ncy50aXRsZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9NWV9DT01QVVRFUl9NT1JFID0KLQkJIlNlYXJjaFBhZ2Uub3B0aW9ucy5teUNvbXB1dGVyU2V0dGluZ3MiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRlVMTF9NT0RFX0NIRUNLID0KLQkJIlNlYXJjaFBhZ2Uub3B0aW9ucy5mdWxsTW9kZUNoZWNrIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0JPT0tNQVJLX0NIRUNLID0KLQkJIlNlYXJjaFBhZ2Uub3B0aW9ucy5ib29rbWFya0NoZWNrIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RJU0NPVkVSWV9DSEVDSyA9Ci0JCSJTZWFyY2hQYWdlLm9wdGlvbnMuZGlzY292ZXJ5Q2hlY2siOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRklMVEVSX0NIRUNLID0KLQkJIlNlYXJjaFBhZ2Uub3B0aW9ucy5maWx0ZXJDaGVjayI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVQREFURVNfSU1BR0VfSUQgPSAidXBkYXRlcyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFVFRJTkdTX1NFQ1RJT04gPSAiU2VhcmNoRm9ybSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNfRlVMTF9NT0RFID0gImZ1bGxNb2RlIjsKLQotCXByaXZhdGUgRm9ybUVuZ2luZSBkZXNjTGFiZWw7Ci0JcHJpdmF0ZSBMYWJlbCBpbmZvTGFiZWw7Ci0JcHJpdmF0ZSBFeHBhbmRhYmxlR3JvdXAgcXVlcnlHcm91cDsKLQlwcml2YXRlIEV4cGFuZGFibGVHcm91cCBvcHRpb25zR3JvdXA7Ci0JcHJpdmF0ZSBDQ29tYm8gY2F0ZWdvcnlDb21ibzsKLQlwcml2YXRlIEJ1dHRvbiBteUNvbXB1dGVyQ2hlY2s7Ci0JcHJpdmF0ZSBCdXR0b24gZGlzY292ZXJ5Q2hlY2s7Ci0JcHJpdmF0ZSBCdXR0b24gYm9va21hcmtDaGVjazsKLQlwcml2YXRlIEJ1dHRvbiBmaWx0ZXJDaGVjazsKLQlwcml2YXRlIEJ1dHRvbiBteUNvbXB1dGVyU2V0dGluZ3M7Ci0JLy9wcml2YXRlIEJ1dHRvbiBmdWxsTW9kZUNoZWNrOwotCXByaXZhdGUgQnV0dG9uIHNlYXJjaEJ1dHRvbjsKLQlwcml2YXRlIFBhZ2VCb29rIHBhZ2Vib29rOwotCXByaXZhdGUgU2VhcmNoTW9uaXRvciBtb25pdG9yOwotCS8vcHJpdmF0ZSBVcGRhdGVTZWFyY2hQcm9ncmVzc01vbml0b3Igc3RhdHVzTW9uaXRvcjsKLQkvL3ByaXZhdGUgU2VhcmNoUmVzdWx0U2VjdGlvbiBzZWFyY2hSZXN1bHRTZWN0aW9uOwotCXByaXZhdGUgSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzOwotCXByaXZhdGUgU2VhcmNoT2JqZWN0IHNlYXJjaE9iamVjdDsKLQlwcml2YXRlIEFycmF5TGlzdCBjYXRlZ29yaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCXByaXZhdGUgSGFzaHRhYmxlIGRlc2NUYWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLQlwcml2YXRlIElTZWFyY2hDYXRlZ29yeSBjdXJyZW50Q2F0ZWdvcnk7Ci0KLQlhYnN0cmFjdCBjbGFzcyBPcHRpb25zR3JvdXAgZXh0ZW5kcyBFeHBhbmRhYmxlR3JvdXAgewotCQlwcm90ZWN0ZWQgU2VsZWN0YWJsZUZvcm1MYWJlbCBjcmVhdGVUZXh0TGFiZWwoCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJRm9ybVdpZGdldEZhY3RvcnkgZmFjdG9yeSkgewotCQkJU2VsZWN0YWJsZUZvcm1MYWJlbCBsYWJlbCA9IHN1cGVyLmNyZWF0ZVRleHRMYWJlbChwYXJlbnQsIGZhY3RvcnkpOwotCQkJbGFiZWwuc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXRCYW5uZXJGb250KCkpOwotCQkJcmV0dXJuIGxhYmVsOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGV4cGFuZGVkKCkgewotCQkJZ2V0Q29udHJvbCgpLmdldFBhcmVudCgpLmxheW91dCgpOwotCQkJcmVmbG93KCk7Ci0JCQl1cGRhdGVTaXplKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgY29sbGFwc2VkKCkgewotCQkJZ2V0Q29udHJvbCgpLmdldFBhcmVudCgpLmxheW91dCgpOwotCQkJcmVmbG93KCk7Ci0JCQl1cGRhdGVTaXplKCk7Ci0JCX0KLQl9Ci0KLQljbGFzcyBTZWFyY2hNb25pdG9yIGV4dGVuZHMgUHJvZ3Jlc3NNb25pdG9yUGFydCB7Ci0JCXB1YmxpYyBTZWFyY2hNb25pdG9yKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCXN1cGVyKHBhcmVudCwgbnVsbCk7Ci0JCQlzZXRCYWNrZ3JvdW5kKGZhY3RvcnkuZ2V0QmFja2dyb3VuZENvbG9yKCkpOwotCQkJZkxhYmVsLnNldEJhY2tncm91bmQoZmFjdG9yeS5nZXRCYWNrZ3JvdW5kQ29sb3IoKSk7Ci0JCQlmUHJvZ3Jlc3NJbmRpY2F0b3Iuc2V0QmFja2dyb3VuZChmYWN0b3J5LmdldEJhY2tncm91bmRDb2xvcigpKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBkb25lKCkgewotCQkJc3VwZXIuZG9uZSgpOwotCQkJdXBkYXRlQnV0dG9uVGV4dCgpOwotCQkJc2VhcmNoQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlEYXRlIGRhdGUgPSBuZXcgRGF0ZSgpOwotCQkJU3RyaW5nIHRleHQgPQotCQkJCVVwZGF0ZVVJLmdldEZvcm1hdHRlZE1lc3NhZ2UoCi0JCQkJCUtFWV9MQVNUX1NFQVJDSCwKLQkJCQkJVXRpbGl0aWVzLmZvcm1hdChkYXRlKSk7Ci0JCQlpbmZvTGFiZWwuc2V0VGV4dCh0ZXh0KTsKLQkJCWluZm9MYWJlbC5nZXRQYXJlbnQoKS5sYXlvdXQoKTsKLQkJCXJlZmxvdyh0cnVlKTsKLQkJCXNlYXJjaE9iamVjdC5kZXRhY2hQcm9ncmVzc01vbml0b3IodGhpcyk7Ci0JCQllbmFibGVPcHRpb25zKHRydWUpOwotCQkJYWN0aXZhdGVTZWFyY2hSZXN1bHRTZWxlY3Rpb24oKTsKLQkJfQotCQkKLQkJcHJpdmF0ZSB2b2lkIGFjdGl2YXRlU2VhcmNoUmVzdWx0U2VsZWN0aW9uKCkgewotCQkJU2VhcmNoUmVzdWx0VmlldyBzdmlldyA9IChTZWFyY2hSZXN1bHRWaWV3KVVwZGF0ZVVJLmdldEFjdGl2ZVBhZ2UoKS5maW5kVmlldyhVcGRhdGVQZXJzcGVjdGl2ZS5JRF9TRUFSQ0hfUkVTVUxUUyk7Ci0JCQlpZiAoc3ZpZXchPW51bGwpCi0JCQkJc3ZpZXcuc2V0U2VsZWN0aW9uQWN0aXZlKHRydWUpOwotCQl9Ci0JfQotCi0JcHVibGljIFNlYXJjaEZvcm0oVXBkYXRlRm9ybVBhZ2UgcGFnZSkgewotCQlzdXBlcihwYWdlKTsKLQkJSURpYWxvZ1NldHRpbmdzIG1hc3RlciA9Ci0JCQlVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQkJc2V0dGluZ3MgPSBtYXN0ZXIuZ2V0U2VjdGlvbihTRVRUSU5HU19TRUNUSU9OKTsKLQkJaWYgKHNldHRpbmdzID09IG51bGwpCi0JCQlzZXR0aW5ncyA9IG1hc3Rlci5hZGROZXdTZWN0aW9uKFNFVFRJTkdTX1NFQ1RJT04pOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChzZWFyY2hPYmplY3QgIT0gbnVsbCkgewotCQkJZGV0YWNoRnJvbShzZWFyY2hPYmplY3QpOwotCQl9Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGV0YWNoRnJvbShTZWFyY2hPYmplY3Qgb2JqKSB7Ci0JCW9iai5kZXRhY2hQcm9ncmVzc01vbml0b3IobW9uaXRvcik7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShPYmplY3QgbW9kZWxPYmplY3QpIHsKLQkJdXBkYXRlSGVhZGluZ1RleHQobnVsbCk7Ci0JCXN1cGVyLmluaXRpYWxpemUobW9kZWxPYmplY3QpOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVIZWFkaW5nVGV4dChTZWFyY2hPYmplY3Qgb2JqKSB7Ci0JCVN0cmluZyB0aXRsZSA9IFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfVElUTEUpOwotCQlpZiAob2JqICE9IG51bGwpCi0JCQl0aXRsZSArPSAiIC0gIiArIG9iai5nZXROYW1lKCk7Ci0JCXNldEhlYWRpbmdUZXh0KHRpdGxlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUhUTUxUYWJsZUxheW91dCBsYXlvdXQgPSBuZXcgSFRNTFRhYmxlTGF5b3V0KCk7Ci0JCXBhcmVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJbGF5b3V0LmxlZnRNYXJnaW4gPSA1OwotCQlsYXlvdXQucmlnaHRNYXJnaW4gPSA1OwotCQlsYXlvdXQudG9wTWFyZ2luID0gMDsKLQkJbGF5b3V0LmJvdHRvbU1hcmdpbiA9IDI7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDE1OwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMTA7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQotCQlGb3JtV2lkZ2V0RmFjdG9yeSBmYWN0b3J5ID0gZ2V0RmFjdG9yeSgpOwotCQlUYWJsZURhdGEgdGQ7Ci0KLQkJZGVzY0xhYmVsID0gZmFjdG9yeS5jcmVhdGVGb3JtRW5naW5lKHBhcmVudCk7Ci0JCWRlc2NMYWJlbC5sb2FkKFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfREVTQyksIHRydWUsIHRydWUpOwotCQl0ZCA9IG5ldyBUYWJsZURhdGEoKTsKLQkJdGQuY29sc3BhbiA9IDI7Ci0JCWRlc2NMYWJlbC5zZXRMYXlvdXREYXRhKHRkKTsKLQotCQlxdWVyeUdyb3VwID0gbmV3IE9wdGlvbnNHcm91cCgpIHsKLQkJCXB1YmxpYyB2b2lkIGZpbGxFeHBhbnNpb24oCi0JCQkJQ29tcG9zaXRlIGV4cGFuc2lvbiwKLQkJCQlGb3JtV2lkZ2V0RmFjdG9yeSBmYWN0b3J5KSB7Ci0JCQkJZmlsbFF1ZXJ5R3JvdXAoZXhwYW5zaW9uLCBmYWN0b3J5KTsKLQkJCX0KLQkJfTsKLQkJQ29tcG9zaXRlIG9wdGlvbkNvbnRhaW5lciA9IGZhY3RvcnkuY3JlYXRlQ29tcG9zaXRlKHBhcmVudCk7Ci0JCWxheW91dCA9IG5ldyBIVE1MVGFibGVMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlsYXlvdXQubGVmdE1hcmdpbiA9IDA7Ci0JCWxheW91dC5yaWdodE1hcmdpbiA9IDA7Ci0JCWxheW91dC5ib3R0b21NYXJnaW4gPSAwOwotCQlsYXlvdXQudG9wTWFyZ2luID0gMDsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gMTU7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAwOwotCQlvcHRpb25Db250YWluZXIuc2V0TGF5b3V0KGxheW91dCk7Ci0JCXRkID0gbmV3IFRhYmxlRGF0YSgpOwotCQl0ZC5jb2xzcGFuID0gMjsKLQkJb3B0aW9uQ29udGFpbmVyLnNldExheW91dERhdGEodGQpOwotCi0JCXF1ZXJ5R3JvdXAuc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX1FVRVJZKSk7Ci0JCXF1ZXJ5R3JvdXAuY3JlYXRlQ29udHJvbChvcHRpb25Db250YWluZXIsIGZhY3RvcnkpOwotCQlzZXRGb2N1c0NvbnRyb2wocXVlcnlHcm91cC5nZXRDb250cm9sKCkpOwotCi0JCW9wdGlvbnNHcm91cCA9IG5ldyBPcHRpb25zR3JvdXAoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmaWxsRXhwYW5zaW9uKAotCQkJCUNvbXBvc2l0ZSBleHBhbnNpb24sCi0JCQkJRm9ybVdpZGdldEZhY3RvcnkgZmFjdG9yeSkgewotCQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCQkJZXhwYW5zaW9uLnNldExheW91dChsYXlvdXQpOwotCi0JCQkJbXlDb21wdXRlckNoZWNrID0KLQkJCQkJZmFjdG9yeS5jcmVhdGVCdXR0b24oZXhwYW5zaW9uLCBudWxsLCBTV1QuQ0hFQ0spOwotCQkJCW15Q29tcHV0ZXJDaGVjay5zZXRUZXh0KAotCQkJCQlVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX01ZX0NPTVBVVEVSX0NIRUNLKSk7Ci0JCQkJbXlDb21wdXRlckNoZWNrLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlteUNvbXB1dGVyU2V0dGluZ3Muc2V0RW5hYmxlZCgKLQkJCQkJCQlteUNvbXB1dGVyQ2hlY2suZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQkJc2VhcmNoT2JqZWN0LnNldFNlYXJjaE15Q29tcHV0ZXIoCi0JCQkJCQkJbXlDb21wdXRlckNoZWNrLmdldFNlbGVjdGlvbigpKTsKLQkJCQkJfQotCQkJCX0pOwotCi0JCQkJbXlDb21wdXRlclNldHRpbmdzID0KLQkJCQkJZmFjdG9yeS5jcmVhdGVCdXR0b24oZXhwYW5zaW9uLCBudWxsLCBTV1QuUFVTSCk7Ci0JCQkJbXlDb21wdXRlclNldHRpbmdzLnNldFRleHQoCi0JCQkJCVVwZGF0ZVVJLmdldFN0cmluZyhLRVlfTVlfQ09NUFVURVJfTU9SRSkpOwotCQkJCW15Q29tcHV0ZXJTZXR0aW5ncwotCQkJCQkuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCUJ1c3lJbmRpY2F0b3IKLQkJCQkJCQkuc2hvd1doaWxlKAotCQkJCQkJCQlteUNvbXB1dGVyU2V0dGluZ3MuZ2V0RGlzcGxheSgpLAotCQkJCQkJCQluZXcgUnVubmFibGUoKSB7Ci0JCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQlNeUNvbXB1dGVyU2VhcmNoRGlhbG9nIHNkID0KLQkJCQkJCQkJCW5ldyBNeUNvbXB1dGVyU2VhcmNoRGlhbG9nKAotCQkJCQkJCQkJCW15Q29tcHV0ZXJTZXR0aW5ncy5nZXRTaGVsbCgpLAotCQkJCQkJCQkJCXNlYXJjaE9iamVjdCk7Ci0JCQkJCQkJCXNkLmNyZWF0ZSgpOwotCQkJCQkJCQlzZC5nZXRTaGVsbCgpLnNldFRleHQoCi0JCQkJCQkJCQlVcGRhdGVVSS5nZXRTdHJpbmcoCi0JCQkJCQkJCQkJS0VZX01ZX0NPTVBVVEVSX1RJVExFKSk7Ci0JCQkJCQkJCXNkLm9wZW4oKTsKLQkJCQkJCQl9Ci0JCQkJCQl9KTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCUdyaWREYXRhIGdkOwotCQkJCWRpc2NvdmVyeUNoZWNrID0KLQkJCQkJZmFjdG9yeS5jcmVhdGVCdXR0b24oZXhwYW5zaW9uLCBudWxsLCBTV1QuQ0hFQ0spOwotCQkJCWRpc2NvdmVyeUNoZWNrLnNldFRleHQoCi0JCQkJCVVwZGF0ZVVJLmdldFN0cmluZyhLRVlfRElTQ09WRVJZX0NIRUNLKSk7Ci0JCQkJZGlzY292ZXJ5Q2hlY2suYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCXNlYXJjaE9iamVjdC5zZXRTZWFyY2hEaXNjb3ZlcnkoCi0JCQkJCQkJZGlzY292ZXJ5Q2hlY2suZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQkJZGlzY292ZXJ5Q2hlY2suc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJCQlib29rbWFya0NoZWNrID0KLQkJCQkJZmFjdG9yeS5jcmVhdGVCdXR0b24oZXhwYW5zaW9uLCBudWxsLCBTV1QuQ0hFQ0spOwotCQkJCWJvb2ttYXJrQ2hlY2suc2V0VGV4dCgKLQkJCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9CT09LTUFSS19DSEVDSykpOwotCQkJCWJvb2ttYXJrQ2hlY2suYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCXNlYXJjaE9iamVjdC5zZXRTZWFyY2hCb29rbWFya3MoCi0JCQkJCQkJYm9va21hcmtDaGVjay5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQkJCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJCQlib29rbWFya0NoZWNrLnNldExheW91dERhdGEoZ2QpOwotCi0JCQkJZmlsdGVyQ2hlY2sgPSBmYWN0b3J5LmNyZWF0ZUJ1dHRvbihleHBhbnNpb24sIG51bGwsIFNXVC5DSEVDSyk7Ci0JCQkJZmlsdGVyQ2hlY2suc2V0VGV4dCgKLQkJCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9GSUxURVJfQ0hFQ0spKTsKLQkJCQlmaWx0ZXJDaGVjay5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJc2VhcmNoT2JqZWN0LnNldEZpbHRlckVudmlyb25tZW50KAotCQkJCQkJCWZpbHRlckNoZWNrLmdldFNlbGVjdGlvbigpKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCWdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJCWZpbHRlckNoZWNrLnNldExheW91dERhdGEoZ2QpOwotCQkJfQotCQl9OwotCQlvcHRpb25zR3JvdXAuc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX09QVElPTlMpKTsKLQkJb3B0aW9uc0dyb3VwLmNyZWF0ZUNvbnRyb2wob3B0aW9uQ29udGFpbmVyLCBmYWN0b3J5KTsKLQotCQlDb21wb3NpdGUgc2VwID0gZmFjdG9yeS5jcmVhdGVDb21wb3NpdGVTZXBhcmF0b3IocGFyZW50KTsKLQkJdGQgPSBuZXcgVGFibGVEYXRhKCk7Ci0JCXRkLmFsaWduID0gVGFibGVEYXRhLkZJTEw7Ci0JCXRkLmhlaWdodEhpbnQgPSAxOwotCQl0ZC5jb2xzcGFuID0gMjsKLQkJc2VwLnNldEJhY2tncm91bmQoZmFjdG9yeS5nZXRDb2xvcihGb3JtV2lkZ2V0RmFjdG9yeS5DT0xPUl9CT1JERVIpKTsKLQkJc2VwLnNldExheW91dERhdGEodGQpOwotCi0JCUNvbXBvc2l0ZSBzZWFyY2hDb250YWluZXIgPSBmYWN0b3J5LmNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQpOwotCQlHcmlkTGF5b3V0IGdsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlnbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlzZWFyY2hDb250YWluZXIuc2V0TGF5b3V0KGdsYXlvdXQpOwotCQl0ZCA9IG5ldyBUYWJsZURhdGEoKTsKLQkJdGQuYWxpZ24gPSBUYWJsZURhdGEuRklMTDsKLQkJdGQuY29sc3BhbiA9IDI7Ci0JCXNlYXJjaENvbnRhaW5lci5zZXRMYXlvdXREYXRhKHRkKTsKLQkJR3JpZERhdGEgZ2Q7Ci0KLQkJaW5mb0xhYmVsID0gZmFjdG9yeS5jcmVhdGVMYWJlbChzZWFyY2hDb250YWluZXIsIG51bGwpOwotCQlpbmZvTGFiZWwuc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX05PX0xBU1RfU0VBUkNIKSk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUik7Ci0JCWluZm9MYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlzZWFyY2hCdXR0b24gPQotCQkJZmFjdG9yeS5jcmVhdGVCdXR0b24oCi0JCQkJc2VhcmNoQ29udGFpbmVyLAotCQkJCVVwZGF0ZVVJLmdldFN0cmluZyhLRVlfU0VBUkNIX05PVyksCi0JCQkJU1dULlBVU0gpOwotCQlzZWFyY2hCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJcGVyZm9ybVNlYXJjaCgpOwotCQkJfQotCQl9KTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSKTsKLQkJZ2QuaG9yaXpvbnRhbEluZGVudCA9IDEwOwotCQlzZWFyY2hCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJbW9uaXRvciA9IG5ldyBTZWFyY2hNb25pdG9yKHBhcmVudCk7Ci0JCXRkID0gbmV3IFRhYmxlRGF0YSgpOwotCQl0ZC5hbGlnbiA9IFRhYmxlRGF0YS5GSUxMOwotCQl0ZC5jb2xzcGFuID0gMjsKLQkJbW9uaXRvci5zZXRMYXlvdXREYXRhKHRkKTsKLQkJaWYgKHNlYXJjaE9iamVjdCAhPSBudWxsICYmIHNlYXJjaE9iamVjdC5pc1NlYXJjaEluUHJvZ3Jlc3MoKSkgewotCQkJLy8gc3luYyB1cCB3aXRoIHRoZSBzZWFyY2gKLQkJCWNhdGNoVXAoKTsKLQkJfQotCQlXb3JrYmVuY2hIZWxwLnNldEhlbHAocGFyZW50LCAib3JnLmVjbGlwc2UudXBkYXRlLnVpLlNlYXJjaEZvcm0iKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZmlsbFF1ZXJ5R3JvdXAoCi0JCUNvbXBvc2l0ZSBjb250YWluZXIsCi0JCUZvcm1XaWRnZXRGYWN0b3J5IGZhY3RvcnkpIHsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDI7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAyOwotCQljb250YWluZXIuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWZhY3RvcnkuY3JlYXRlTGFiZWwoCi0JCQljb250YWluZXIsCi0JCQlVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX0NBVEVHT1JZKSk7Ci0JCWNhdGVnb3J5Q29tYm8gPSBuZXcgQ0NvbWJvKGNvbnRhaW5lciwgU1dULlJFQURfT05MWSB8IFNXVC5GTEFUKTsKLQkJY2F0ZWdvcnlDb21iby5zZXRCYWNrZ3JvdW5kKGZhY3RvcnkuZ2V0QmFja2dyb3VuZENvbG9yKCkpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQljYXRlZ29yeUNvbWJvLnNldExheW91dERhdGEoZ2QpOwotCi0JCXBhZ2Vib29rID0gbmV3IFBhZ2VCb29rKGNvbnRhaW5lciwgU1dULk5VTEwpOwotCQlwYWdlYm9vay5zZXRCYWNrZ3JvdW5kKGZhY3RvcnkuZ2V0QmFja2dyb3VuZENvbG9yKCkpOwotCQlnZCA9Ci0JCQluZXcgR3JpZERhdGEoCi0JCQkJR3JpZERhdGEuRklMTF9WRVJUSUNBTCB8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJcGFnZWJvb2suc2V0TGF5b3V0RGF0YShnZCk7Ci0JCVNlYXJjaENhdGVnb3J5RGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzID0KLQkJCVNlYXJjaENhdGVnb3J5UmVnaXN0cnlSZWFkZXIuZ2V0RGVmYXVsdCgpLmdldENhdGVnb3J5RGVzY3JpcHRvcnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotCQkJSVNlYXJjaENhdGVnb3J5IGNhdGVnb3J5ID0gZGVzY3JpcHRvcnNbaV0uY3JlYXRlQ2F0ZWdvcnkoKTsKLQkJCWlmIChjYXRlZ29yeSAhPSBudWxsKSB7Ci0JCQkJY2F0ZWdvcmllcy5hZGQoY2F0ZWdvcnkpOwotCQkJCWRlc2NUYWJsZS5wdXQoY2F0ZWdvcnksIGRlc2NyaXB0b3JzW2ldKTsKLQkJCQljYXRlZ29yeUNvbWJvLmFkZChkZXNjcmlwdG9yc1tpXS5nZXROYW1lKCkpOwotCQkJCWNhdGVnb3J5LmNyZWF0ZUNvbnRyb2wocGFnZWJvb2ssIGZhY3RvcnkpOwotCQkJfQotCQl9Ci0JCWNhdGVnb3J5Q29tYm8ucGFjaygpOwotCQljYXRlZ29yeUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWludCBpbmRleCA9IGNhdGVnb3J5Q29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJCQlJU2VhcmNoQ2F0ZWdvcnkgY2F0ZWdvcnkgPQotCQkJCQkoSVNlYXJjaENhdGVnb3J5KSBjYXRlZ29yaWVzLmdldChpbmRleCk7Ci0JCQkJc3dpdGNoVG8oY2F0ZWdvcnkpOwotCQkJCXNlYXJjaE9iamVjdC5zZXRDYXRlZ29yeUlkKGNhdGVnb3J5LmdldElkKCkpOwotCQkJfQotCQl9KTsKLQkJY2F0ZWdvcnlDb21iby5zZWxlY3QoMCk7Ci0JCWZhY3RvcnkucGFpbnRCb3JkZXJzRm9yKGNvbnRhaW5lcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN3aXRjaFRvKElTZWFyY2hDYXRlZ29yeSBjYXRlZ29yeSkgewotCQlwYWdlYm9vay5zaG93UGFnZShjYXRlZ29yeS5nZXRDb250cm9sKCkpOwotCQljdXJyZW50Q2F0ZWdvcnkgPSBjYXRlZ29yeTsKLQkJU2VhcmNoQ2F0ZWdvcnlEZXNjcmlwdG9yIGRlc2MgPQotCQkJKFNlYXJjaENhdGVnb3J5RGVzY3JpcHRvcikgZGVzY1RhYmxlLmdldChjYXRlZ29yeSk7Ci0JCWRlc2NMYWJlbC5sb2FkKGRlc2MuZ2V0RGVzY3JpcHRpb24oKSwgdHJ1ZSwgdHJ1ZSk7Ci0JCXJlZmxvdygpOwotCQl1cGRhdGVTaXplKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNlbGVjdENhdGVnb3J5KFNlYXJjaE9iamVjdCBvYmopIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYXRlZ29yaWVzLnNpemUoKTsgaSsrKSB7Ci0JCQlJU2VhcmNoQ2F0ZWdvcnkgY2F0ZWdvcnkgPSAoSVNlYXJjaENhdGVnb3J5KSBjYXRlZ29yaWVzLmdldChpKTsKLQkJCWlmIChjYXRlZ29yeS5nZXRJZCgpLmVxdWFscyhvYmouZ2V0Q2F0ZWdvcnlJZCgpKSkgewotCQkJCWNhdGVnb3J5Q29tYm8uc2VsZWN0KGkpOwotCQkJCXN3aXRjaFRvKGNhdGVnb3J5KTsKLQkJCQljYXRlZ29yeS5sb2FkKG9iai5nZXRTZXR0aW5ncygpLCAhb2JqLmlzQ2F0ZWdvcnlGaXhlZCgpKTsKLQkJCQljYXRlZ29yeUNvbWJvLnNldEVuYWJsZWQoIW9iai5pc0NhdGVnb3J5Rml4ZWQoKSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVmbG93KGJvb2xlYW4gc2VhcmNoRmluaXNoZWQpIHsKLQkJZGVzY0xhYmVsLmdldFBhcmVudCgpLmxheW91dCh0cnVlKTsKLQkJKChDb21wb3NpdGUpIGdldENvbnRyb2woKSkubGF5b3V0KHRydWUpOwotCQl1cGRhdGVTaXplKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlZmxvdygpIHsKLQkJcmVmbG93KGZhbHNlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcGVyZm9ybVNlYXJjaCgpIHsKLQkJaWYgKHNlYXJjaE9iamVjdCAhPSBudWxsKSB7Ci0JCQlpZiAoc2VhcmNoT2JqZWN0LmlzU2VhcmNoSW5Qcm9ncmVzcygpKSB7Ci0JCQkJc3RvcFNlYXJjaCgpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoIXN0YXJ0U2VhcmNoKCkpCi0JCQkJCXJldHVybjsKLQkJCX0KLQkJCXVwZGF0ZUJ1dHRvblRleHQoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBzdGFydFNlYXJjaCgpIHsKLQkJdHJ5IHsKLQkJCWlmICghc2VhcmNoT2JqZWN0LmlzQ2F0ZWdvcnlGaXhlZCgpKSB7Ci0JCQkJY3VycmVudENhdGVnb3J5LnN0b3JlKHNlYXJjaE9iamVjdC5nZXRTZXR0aW5ncygpKTsKLQkJCQlpZiAoIXNlYXJjaE9iamVjdAotCQkJCQkuZ2V0Q2F0ZWdvcnlJZCgpCi0JCQkJCS5lcXVhbHMoY3VycmVudENhdGVnb3J5LmdldElkKCkpKQotCQkJCQlzZWFyY2hPYmplY3Quc2V0Q2F0ZWdvcnlJZChjdXJyZW50Q2F0ZWdvcnkuZ2V0SWQoKSk7Ci0JCQl9Ci0JCQlzZWFyY2hPYmplY3QuYXR0YWNoUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IpOwotCQkJZW5hYmxlT3B0aW9ucyhmYWxzZSk7Ci0JCQlob29rU2VhcmNoVmlldygpOwotCQkJc2VhcmNoT2JqZWN0LnN0YXJ0U2VhcmNoKGdldENvbnRyb2woKS5nZXREaXNwbGF5KCksIGdldFF1ZXJpZXMoKSk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJVXBkYXRlVUkubG9nRXhjZXB0aW9uKGUpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlVcGRhdGVVSS5sb2dFeGNlcHRpb24oZSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhvb2tTZWFyY2hWaWV3KCkgewotCQl0cnkgewotCQkJU3RyaW5nIHZpZXdJZCA9IFVwZGF0ZVBlcnNwZWN0aXZlLklEX1NFQVJDSF9SRVNVTFRTOwotCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IFVwZGF0ZVVJLmdldEFjdGl2ZVBhZ2UoKTsKLQkJCVNlYXJjaFJlc3VsdFZpZXcgc3ZpZXcgPSAoU2VhcmNoUmVzdWx0VmlldylwYWdlLmZpbmRWaWV3KHZpZXdJZCk7Ci0KLQkJCWlmIChzdmlldyA9PSBudWxsKSB7Ci0JCQkJc3ZpZXcgPSAoU2VhcmNoUmVzdWx0VmlldylwYWdlLnNob3dWaWV3KHZpZXdJZCk7Ci0JCQkJcGFnZS5zaG93VmlldyhVcGRhdGVQZXJzcGVjdGl2ZS5JRF9ERVRBSUxTKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXN2aWV3LnNldFNlbGVjdGlvbkFjdGl2ZShmYWxzZSk7Ci0JCQkJcGFnZS5icmluZ1RvVG9wKHN2aWV3KTsKLQkJCX0KLQkJCXN2aWV3LnNldEN1cnJlbnRTZWFyY2goc2VhcmNoT2JqZWN0KTsKLQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJVXBkYXRlVUkubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJU2VhcmNoUXVlcnlbXSBnZXRRdWVyaWVzKCkgewotCQlpbnQgaW5kZXggPSBjYXRlZ29yeUNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCUlTZWFyY2hDYXRlZ29yeSBjYXRlZ29yeSA9IChJU2VhcmNoQ2F0ZWdvcnkpIGNhdGVnb3JpZXMuZ2V0KGluZGV4KTsKLQkJcmV0dXJuIGNhdGVnb3J5LmdldFF1ZXJpZXMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2F0Y2hVcCgpIHsKLQkJc2VhcmNoT2JqZWN0LmF0dGFjaFByb2dyZXNzTW9uaXRvcihtb25pdG9yKTsKLQkJZW5hYmxlT3B0aW9ucyhmYWxzZSk7Ci0JCXVwZGF0ZUJ1dHRvblRleHQoKTsKLQl9Ci0KLQlwcml2YXRlIElTdGF0dXNMaW5lTWFuYWdlciBnZXRSb290TWFuYWdlcihJU3RhdHVzTGluZU1hbmFnZXIgbWFuYWdlcikgewotCQlJQ29udHJpYnV0aW9uTWFuYWdlciBwYXJlbnQgPSBtYW5hZ2VyOwotCi0JCXdoaWxlIChwYXJlbnQgaW5zdGFuY2VvZiBTdWJTdGF0dXNMaW5lTWFuYWdlcikgewotCQkJSUNvbnRyaWJ1dGlvbk1hbmFnZXIgbmV3UGFyZW50ID0KLQkJCQkoKFN1YlN0YXR1c0xpbmVNYW5hZ2VyKSBwYXJlbnQpLmdldFBhcmVudCgpOwotCQkJaWYgKG5ld1BhcmVudCA9PSBudWxsKQotCQkJCWJyZWFrOwotCQkJcGFyZW50ID0gbmV3UGFyZW50OwotCQl9Ci0JCXJldHVybiAoSVN0YXR1c0xpbmVNYW5hZ2VyKSBwYXJlbnQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN0b3BTZWFyY2goKSB7Ci0JCXNlYXJjaEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJc2VhcmNoT2JqZWN0LnN0b3BTZWFyY2goKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZW5hYmxlT3B0aW9ucyhib29sZWFuIGVuYWJsZSkgewotCQlteUNvbXB1dGVyQ2hlY2suc2V0RW5hYmxlZChlbmFibGUpOwotCQlteUNvbXB1dGVyU2V0dGluZ3Muc2V0RW5hYmxlZChlbmFibGUpOwotCQlkaXNjb3ZlcnlDaGVjay5zZXRFbmFibGVkKGVuYWJsZSk7Ci0JCWJvb2ttYXJrQ2hlY2suc2V0RW5hYmxlZChlbmFibGUpOwotCQlmaWx0ZXJDaGVjay5zZXRFbmFibGVkKGVuYWJsZSk7Ci0JCWlmIChjdXJyZW50Q2F0ZWdvcnkuZ2V0Q29udHJvbCgpIT1udWxsKQotCQkJY3VycmVudENhdGVnb3J5LmdldENvbnRyb2woKS5zZXRFbmFibGVkKGVuYWJsZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUJ1dHRvblRleHQoKSB7Ci0JCWJvb2xlYW4gaW5TZWFyY2ggPQotCQkJc2VhcmNoT2JqZWN0ICE9IG51bGwgJiYgc2VhcmNoT2JqZWN0LmlzU2VhcmNoSW5Qcm9ncmVzcygpOwotCQlpZiAoaW5TZWFyY2gpCi0JCQlzZWFyY2hCdXR0b24uc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX0NBTkNFTCkpOwotCQllbHNlCi0JCQlzZWFyY2hCdXR0b24uc2V0VGV4dCgKLQkJCQlVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX1NFQVJDSF9OT1cpKTsKLQkJc2VhcmNoQnV0dG9uLmdldFBhcmVudCgpLmxheW91dCh0cnVlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlU2NvcGVTZXR0aW5ncyhTZWFyY2hPYmplY3Qgc29iaikgewotCQlteUNvbXB1dGVyQ2hlY2suc2V0U2VsZWN0aW9uKHNvYmouZ2V0U2VhcmNoTXlDb21wdXRlcigpKTsKLQkJbXlDb21wdXRlclNldHRpbmdzLnNldEVuYWJsZWQoc29iai5nZXRTZWFyY2hNeUNvbXB1dGVyKCkpOwotCQlkaXNjb3ZlcnlDaGVjay5zZXRTZWxlY3Rpb24oc29iai5nZXRTZWFyY2hEaXNjb3ZlcnkoKSk7Ci0JCWJvb2ttYXJrQ2hlY2suc2V0U2VsZWN0aW9uKHNvYmouZ2V0U2VhcmNoQm9va21hcmtzKCkpOwotCQlmaWx0ZXJDaGVjay5zZXRTZWxlY3Rpb24oc29iai5nZXRGaWx0ZXJFbnZpcm9ubWVudCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleHBhbmRUbyhPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBTZWFyY2hPYmplY3QpIHsKLQkJCWlucHV0Q2hhbmdlZCgoU2VhcmNoT2JqZWN0KSBvYmopOwotCQl9Ci0JfQotCXByaXZhdGUgdm9pZCBpbnB1dENoYW5nZWQoZmluYWwgU2VhcmNoT2JqZWN0IG9iaikgewotCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShnZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJaWYgKHNlYXJjaE9iamVjdCAhPSBudWxsKSB7Ci0JCQkJCWlmIChzZWFyY2hPYmplY3QgPT0gb2JqKQotCQkJCQkJcmV0dXJuOwotCQkJCQlpZiAoY3VycmVudENhdGVnb3J5ICE9IG51bGwpIHsKLQkJCQkJCWlmICghc2VhcmNoT2JqZWN0LmlzQ2F0ZWdvcnlGaXhlZCgpKQotCQkJCQkJCWN1cnJlbnRDYXRlZ29yeS5zdG9yZShzZWFyY2hPYmplY3QuZ2V0U2V0dGluZ3MoKSk7Ci0JCQkJCQlzZWFyY2hPYmplY3Quc2V0Q2F0ZWdvcnlJZChjdXJyZW50Q2F0ZWdvcnkuZ2V0SWQoKSk7Ci0JCQkJCX0KLQkJCQkJZGV0YWNoRnJvbShzZWFyY2hPYmplY3QpOwotCQkJCX0KLQkJCQlzZWFyY2hPYmplY3QgPSBvYmo7Ci0JCQkJdXBkYXRlSGVhZGluZ1RleHQoc2VhcmNoT2JqZWN0KTsKLQkJCQlzZWxlY3RDYXRlZ29yeShvYmopOwotCQkJCXVwZGF0ZVNjb3BlU2V0dGluZ3Mob2JqKTsKLQkJCQlpZiAoc2VhcmNoT2JqZWN0LmlzU2VhcmNoSW5Qcm9ncmVzcygpKSB7Ci0JCQkJCS8vIHN5bmMgdXAgd2l0aCB0aGUgc2VhcmNoCi0JCQkJCWNhdGNoVXAoKTsKLQkJCQl9IGVsc2UgaWYgKHNlYXJjaE9iamVjdC5pc0luc3RhbnRTZWFyY2goKSkgewotCQkJCQlzZWFyY2hPYmplY3Quc2V0SW5zdGFudFNlYXJjaChmYWxzZSk7Ci0JCQkJCWdldENvbnRyb2woKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQlwZXJmb3JtU2VhcmNoKCk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgb2JqZWN0Q2hhbmdlZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJaWYgKG9iamVjdC5lcXVhbHMoc2VhcmNoT2JqZWN0KSkgewotCQkJaWYgKE5hbWVkTW9kZWxPYmplY3QuUF9OQU1FLmVxdWFscyhwcm9wZXJ0eSkpCi0JCQkJdXBkYXRlSGVhZGluZ1RleHQoc2VhcmNoT2JqZWN0KTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9mb3Jtcy9TaXRlRm9ybS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL2Zvcm1zL1NpdGVGb3JtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMTJhOTQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL2Zvcm1zL1NpdGVGb3JtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLm5ldC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklTdGF0dXNMaW5lTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLldvcmtiZW5jaEhlbHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWwuSVNpdGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbC5TaXRlQm9va21hcms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnBhZ2VzLlVwZGF0ZUZvcm1QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS52aWV3cy5EZXRhaWxzVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWwuZW5naW5lLkZvcm1FbmdpbmU7Ci0KLXB1YmxpYyBjbGFzcyBTaXRlRm9ybSBleHRlbmRzIFVwZGF0ZVdlYkZvcm0gewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfREVTQyA9ICJTaXRlUGFnZS5kZXNjIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0xJTksgPSAiU2l0ZVBhZ2UubGluayI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9XREVTQyA9ICJTaXRlUGFnZS53ZGVzYyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9XTElOSyA9ICJTaXRlUGFnZS53bGluayI7Ci0JcHJpdmF0ZSBMYWJlbCB1cmw7Ci0JcHJpdmF0ZSBGb3JtRW5naW5lIGRlc2M7Ci0JcHJpdmF0ZSBTZWxlY3RhYmxlRm9ybUxhYmVsIGxpbms7Ci0JcHJpdmF0ZSBJU2l0ZUFkYXB0ZXIgY3VycmVudEFkYXB0ZXI7Ci0JcHJpdmF0ZSBJbWFnZSB1cGRhdGVTaXRlc0ltYWdlOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVVBEQVRFX1NJVEVTX0lNQUdFID0gInVwZGF0ZVNpdGVzIjsKLQotCXB1YmxpYyBTaXRlRm9ybShVcGRhdGVGb3JtUGFnZSBwYWdlKSB7Ci0JCXN1cGVyKHBhZ2UpOwotCQl1cGRhdGVTaXRlc0ltYWdlID0gVXBkYXRlVUlJbWFnZXMuREVTQ19TSVRFU19WSUVXLmNyZWF0ZUltYWdlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJdXBkYXRlU2l0ZXNJbWFnZS5kaXNwb3NlKCk7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKE9iamVjdCBtb2RlbE9iamVjdCkgewotCQlzZXRIZWFkaW5nVGV4dCgiIik7Ci0JCXN1cGVyLmluaXRpYWxpemUobW9kZWxPYmplY3QpOwotCQkvLygoQ29tcG9zaXRlKWdldENvbnRyb2woKSkubGF5b3V0KHRydWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJSFRNTFRhYmxlTGF5b3V0IGxheW91dCA9IG5ldyBIVE1MVGFibGVMYXlvdXQoKTsKLQkJcGFyZW50LnNldExheW91dChsYXlvdXQpOwotCQlsYXlvdXQubGVmdE1hcmdpbiA9IGxheW91dC5yaWdodE1hcmdpbiA9IDEwOwotCQlsYXlvdXQudG9wTWFyZ2luID0gMTA7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDA7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAyMDsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQlib29sZWFuIHdlYlNpdGVGbGFnID0gY29tcHV0ZVdlYlNpdGVGbGFnKGN1cnJlbnRBZGFwdGVyKTsKLQotCQlGb3JtV2lkZ2V0RmFjdG9yeSBmYWN0b3J5ID0gZ2V0RmFjdG9yeSgpOwotCQl1cmwgPSBmYWN0b3J5LmNyZWF0ZUhlYWRpbmdMYWJlbChwYXJlbnQsIG51bGwpOwotCi0JCWRlc2MgPSBmYWN0b3J5LmNyZWF0ZUZvcm1FbmdpbmUocGFyZW50KTsKLQkJc2V0Rm9jdXNDb250cm9sKGRlc2MpOwotCQlkZXNjLnJlZ2lzdGVyVGV4dE9iamVjdChLRVlfVVBEQVRFX1NJVEVTX0lNQUdFLCB1cGRhdGVTaXRlc0ltYWdlKTsKLQkJU3RyaW5nIHRleHQgPQotCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKAotCQkJCXdlYlNpdGVGbGFnID8gS0VZX1dERVNDIDogS0VZX0RFU0MpOwotCQlkZXNjLmxvYWQodGV4dCwgdHJ1ZSwgdHJ1ZSk7Ci0JCVRhYmxlRGF0YSB0ZCA9IG5ldyBUYWJsZURhdGEoKTsKLQkJdGQuYWxpZ24gPSBUYWJsZURhdGEuRklMTDsKLQkJdGQuZ3JhYkhvcml6b250YWwgPSB0cnVlOwotCQlkZXNjLnNldExheW91dERhdGEodGQpOwotCi0JCUlIeXBlcmxpbmtMaXN0ZW5lciBsaXN0ZW5lcjsKLQkJSUFjdGlvbkJhcnMgYmFycyA9IGdldFBhZ2UoKS5nZXRWaWV3KCkuZ2V0Vmlld1NpdGUoKS5nZXRBY3Rpb25CYXJzKCk7Ci0JCWZpbmFsIElTdGF0dXNMaW5lTWFuYWdlciBtYW5hZ2VyID0gYmFycy5nZXRTdGF0dXNMaW5lTWFuYWdlcigpOwotCi0JCWxpc3RlbmVyID0gbmV3IEh5cGVybGlua0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBsaW5rRW50ZXJlZChDb250cm9sIGxpbmspIHsKLQkJCQlVUkwgY3VycmVudFVSTCA9IGdldEN1cnJlbnRVUkwodHJ1ZSk7Ci0JCQkJaWYgKGN1cnJlbnRVUkwgIT0gbnVsbCkKLQkJCQkJbWFuYWdlci5zZXRNZXNzYWdlKGN1cnJlbnRVUkwudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaW5rRXhpdGVkKENvbnRyb2wgbGluaykgewotCQkJCW1hbmFnZXIuc2V0TWVzc2FnZShudWxsKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpbmtBY3RpdmF0ZWQoQ29udHJvbCBsaW5rKSB7Ci0JCQkJZmluYWwgVVJMIGN1cnJlbnRVUkwgPSBnZXRDdXJyZW50VVJMKGZhbHNlKTsKLQkJCQlpZiAoY3VycmVudFVSTCA9PSBudWxsKQotCQkJCQlyZXR1cm47Ci0JCQkJQnVzeUluZGljYXRvcgotCQkJCQkuc2hvd1doaWxlKGdldENvbnRyb2woKS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJRGV0YWlsc1ZpZXcuc2hvd1VSTChjdXJyZW50VVJMLnRvU3RyaW5nKCkpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX07Ci0JCWxpbmsgPSBuZXcgU2VsZWN0YWJsZUZvcm1MYWJlbChwYXJlbnQsIFNXVC5OVUxMKTsKLQkJbGluay5zZXRUZXh0KAotCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKAotCQkJCXdlYlNpdGVGbGFnID8gS0VZX1dMSU5LIDogS0VZX0xJTkspKTsKLQkJZmFjdG9yeS50dXJuSW50b0h5cGVybGluayhsaW5rLCBsaXN0ZW5lcik7Ci0JCVdvcmtiZW5jaEhlbHAuc2V0SGVscChwYXJlbnQsICJvcmcuZWNsaXBzZS51cGRhdGUudWkuU2l0ZUZvcm0iKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleHBhbmRUbyhPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBJU2l0ZUFkYXB0ZXIpIHsKLQkJCWlucHV0Q2hhbmdlZCgoSVNpdGVBZGFwdGVyKSBvYmopOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGlucHV0Q2hhbmdlZChJU2l0ZUFkYXB0ZXIgYWRhcHRlcikgewotCQlib29sZWFuIG9sZFdlYlNpdGVGbGFnID0gY29tcHV0ZVdlYlNpdGVGbGFnKGN1cnJlbnRBZGFwdGVyKTsKLQkJYm9vbGVhbiBuZXdXZWJTaXRlRmxhZyA9IGNvbXB1dGVXZWJTaXRlRmxhZyhhZGFwdGVyKTsKLQotCQlpZiAob2xkV2ViU2l0ZUZsYWcgIT0gbmV3V2ViU2l0ZUZsYWcpIHsKLQkJCVN0cmluZyB0ZXh0ID0KLQkJCQlVcGRhdGVVSS5nZXRTdHJpbmcoCi0JCQkJCW5ld1dlYlNpdGVGbGFnID8gS0VZX1dERVNDIDogS0VZX0RFU0MpOwotCQkJZGVzYy5sb2FkKHRleHQsIHRydWUsIHRydWUpOwotCQkJbGluay5zZXRUZXh0KAotCQkJCVVwZGF0ZVVJLmdldFN0cmluZygKLQkJCQkJbmV3V2ViU2l0ZUZsYWcgPyBLRVlfV0xJTksgOiBLRVlfTElOSykpOwotCQl9Ci0JCXNldEhlYWRpbmdUZXh0KGFkYXB0ZXIuZ2V0TGFiZWwoKSk7Ci0JCXVybC5zZXRUZXh0KGFkYXB0ZXIuZ2V0VVJMKCkudG9TdHJpbmcoKSk7Ci0JCXVwZGF0ZUxpbmtWaXNpYmlsaXR5KGFkYXB0ZXIpOwotCQl1cmwuZ2V0UGFyZW50KCkubGF5b3V0KCk7Ci0JCSgoQ29tcG9zaXRlKSBnZXRDb250cm9sKCkpLmxheW91dCgpOwotCQl1cGRhdGVTaXplKCk7Ci0JCWdldENvbnRyb2woKS5yZWRyYXcoKTsKLQkJY3VycmVudEFkYXB0ZXIgPSBhZGFwdGVyOwotCX0KLQotCXByaXZhdGUgVVJMIGdldEN1cnJlbnRVUkwoYm9vbGVhbiByYXdVUkwpIHsKLQkJaWYgKGN1cnJlbnRBZGFwdGVyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJYm9vbGVhbiB3ZWJTaXRlID0gY29tcHV0ZVdlYlNpdGVGbGFnKGN1cnJlbnRBZGFwdGVyKTsKLQkJaWYgKHdlYlNpdGUpCi0JCQlyZXR1cm4gY3VycmVudEFkYXB0ZXIuZ2V0VVJMKCk7Ci0JCWVsc2UgewotCQkJSVNpdGUgc2l0ZSA9IGN1cnJlbnRBZGFwdGVyLmdldFNpdGUobnVsbCk7Ci0JCQlpZiAoc2l0ZSA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJaWYgKHJhd1VSTCkKLQkJCQlyZXR1cm4gZ2V0UmF3VVJMKHNpdGUpOwotCQkJZWxzZQotCQkJCXJldHVybiBnZXRVUkxmb3JTaXRlKHNpdGUpOwotCQl9Ci0JfQotCXB1YmxpYyBVUkwgZ2V0VVJMZm9yU2l0ZShJU2l0ZSBzaXRlKSB7Ci0JCVVSTCBsaW5rID0gZ2V0UmF3VVJMKHNpdGUpOwotCQlyZXR1cm4gbGluazsKLQkJLyoKLQkJU3RyaW5nIGNhbGxiYWNrID0gV2ViSW5zdGFsbEhhbmRsZXIuZ2V0Q2FsbGJhY2tTdHJpbmcoKTsKLQkJaWYgKGNhbGxiYWNrID09IG51bGwpCi0JCQlyZXR1cm4gbGluazsKLQkJdHJ5IHsKLQkJCXJldHVybiBuZXcgVVJMKGxpbmsudG9FeHRlcm5hbEZvcm0oKSArIGNhbGxiYWNrKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBsaW5rOwotCQl9Ci0JCSovCi0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGNvbXB1dGVXZWJTaXRlRmxhZyhJU2l0ZUFkYXB0ZXIgYWRhcHRlcikgewotCQlyZXR1cm4gKAotCQkJYWRhcHRlciBpbnN0YW5jZW9mIFNpdGVCb29rbWFyawotCQkJCSYmICgoU2l0ZUJvb2ttYXJrKSBhZGFwdGVyKS5pc1dlYkJvb2ttYXJrKCkpCi0JCQk/IHRydWUKLQkJCTogZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgb2JqZWN0Q2hhbmdlZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJaWYgKG9iamVjdC5lcXVhbHMoY3VycmVudEFkYXB0ZXIpKSB7Ci0JCQlpbnB1dENoYW5nZWQoY3VycmVudEFkYXB0ZXIpOwotCQl9Ci0JfQotCi0JcHVibGljIFVSTCBnZXRSYXdVUkwoSVNpdGUgc2l0ZSkgewotCQlJVVJMRW50cnkgZW50cnkgPSBzaXRlLmdldERlc2NyaXB0aW9uKCk7Ci0JCWlmIChlbnRyeSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBlbnRyeS5nZXRVUkwoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlTGlua1Zpc2liaWxpdHkoSVNpdGVBZGFwdGVyIGFkYXB0ZXIpIHsKLQkJLyoKLQkJSVNpdGUgc2l0ZSA9IGFkYXB0ZXIuZ2V0U2l0ZSgpOwotCQlVUkwgaW5mb1VSTCA9IGdldFJhd1VSTChzaXRlKTsKLQkJbGluay5zZXRWaXNpYmxlKGluZm9VUkwhPW51bGwpOwotCQkqLwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9mb3Jtcy9VSVByb2JsZW1IYW5kbGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvZm9ybXMvVUlQcm9ibGVtSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2Q5Y2FjLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9mb3Jtcy9VSVByb2JsZW1IYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5mb3JtczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi5JUHJvYmxlbUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJOwotCi0vKioKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBVSVByb2JsZW1IYW5kbGVyIGltcGxlbWVudHMgSVByb2JsZW1IYW5kbGVyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1RJVExFID0gIlJldmVydC5Qcm9ibGVtRGlhbG9nLnRpdGxlIjsKLQotCS8qCi0JICogQHNlZSBJUHJvYmxlbUhhbmRsZXIjcmVwb3J0UHJvYmxlbShTdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVwb3J0UHJvYmxlbShTdHJpbmcgcHJvYmxlbVRleHQpIHsKLQkJU3RyaW5nIHRpdGxlID0gVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9USVRMRSk7Ci0JCXJldHVybiBNZXNzYWdlRGlhbG9nLm9wZW5RdWVzdGlvbihVcGRhdGVVSS5nZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpLCB0aXRsZSwgcHJvYmxlbVRleHQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9mb3Jtcy9Vbmtub3duT2JqZWN0Rm9ybS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL2Zvcm1zL1Vua25vd25PYmplY3RGb3JtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwMTA1YWEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL2Zvcm1zL1Vua25vd25PYmplY3RGb3JtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5mb3JtczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLldvcmtiZW5jaEhlbHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uSVZvbHVtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkucGFnZXMuVXBkYXRlRm9ybVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnBhcnRzLlZvbHVtZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsLio7Ci0KLXB1YmxpYyBjbGFzcyBVbmtub3duT2JqZWN0Rm9ybSBleHRlbmRzIFVwZGF0ZVdlYkZvcm0gewotCXByaXZhdGUgT2JqZWN0IGN1cnJlbnRPYmo7Ci0JcHJpdmF0ZSBWb2x1bWVMYWJlbFByb3ZpZGVyIHZvbHVtZVByb3ZpZGVyOwotCi0JcHVibGljIFVua25vd25PYmplY3RGb3JtKFVwZGF0ZUZvcm1QYWdlIHBhZ2UpIHsKLQkJc3VwZXIocGFnZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKHZvbHVtZVByb3ZpZGVyIT1udWxsKSB2b2x1bWVQcm92aWRlci5kaXNwb3NlKCk7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgb2JqZWN0Q2hhbmdlZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJaWYgKG9iamVjdC5lcXVhbHMoY3VycmVudE9iaikpIHsKLQkJCWV4cGFuZFRvKG9iamVjdCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKE9iamVjdCBtb2RlbE9iamVjdCkgewotCQlzZXRIZWFkaW5nVGV4dCgiIik7Ci0JCXN1cGVyLmluaXRpYWxpemUobW9kZWxPYmplY3QpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJSFRNTFRhYmxlTGF5b3V0IGxheW91dCA9IG5ldyBIVE1MVGFibGVMYXlvdXQoKTsKLQkJcGFyZW50LnNldExheW91dChsYXlvdXQpOwotCQlsYXlvdXQubGVmdE1hcmdpbiA9IGxheW91dC5yaWdodE1hcmdpbiA9IDEwOwotCQlsYXlvdXQudG9wTWFyZ2luID0gMTA7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDA7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAyMDsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCi0JCUZvcm1XaWRnZXRGYWN0b3J5IGZhY3RvcnkgPSBnZXRGYWN0b3J5KCk7Ci0JCUNvbXBvc2l0ZSBjbGllbnQgPSBmYWN0b3J5LmNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQpOwotCQlUYWJsZURhdGEgdGQgPSBuZXcgVGFibGVEYXRhKCk7Ci0JCXRkLmFsaWduID0gVGFibGVEYXRhLkZJTEw7Ci0JCVdvcmtiZW5jaEhlbHAuc2V0SGVscChjbGllbnQsICJvcmcuZWNsaXBzZS51cGRhdGUudWkuVW5rbm93bk9iamVjdEZvcm0iKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleHBhbmRUbyhPYmplY3Qgb2JqKSB7Ci0JCVN0cmluZyBuYW1lID0gIiI7Ci0KLQkJaWYgKG9iaiAhPSBudWxsICYmIG9iaiBpbnN0YW5jZW9mIFVJTW9kZWxPYmplY3QpIHsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNeUNvbXB1dGVyRGlyZWN0b3J5KSB7Ci0JCQkJTXlDb21wdXRlckRpcmVjdG9yeSBkaXIgPSAoTXlDb21wdXRlckRpcmVjdG9yeSlvYmo7Ci0JCQkJSVZvbHVtZSB2b2x1bWUgPSBkaXIuZ2V0Vm9sdW1lKCk7Ci0JCQkJaWYgKHZvbHVtZSE9bnVsbCkgbmFtZSA9IGdldFZvbHVtZU5hbWUodm9sdW1lKTsKLQkJCX0KLQkJCWlmIChuYW1lLmxlbmd0aCgpPT0wKQotCQkJCW5hbWUgPSBvYmoudG9TdHJpbmcoKTsKLQkJfQotCQlzZXRIZWFkaW5nVGV4dChuYW1lKTsKLQkJaWYgKGdldENvbnRyb2woKSAhPSBudWxsKSB7Ci0JCQkoKENvbXBvc2l0ZSkgZ2V0Q29udHJvbCgpKS5sYXlvdXQoKTsKLQkJCWdldENvbnRyb2woKS5yZWRyYXcoKTsKLQkJfQotCQljdXJyZW50T2JqID0gb2JqOwotCX0KLQlwcml2YXRlIFN0cmluZyBnZXRWb2x1bWVOYW1lKElWb2x1bWUgdm9sdW1lKSB7Ci0JCWlmICh2b2x1bWVQcm92aWRlcj09bnVsbCkKLQkJCXZvbHVtZVByb3ZpZGVyID0gbmV3IFZvbHVtZUxhYmVsUHJvdmlkZXIoKTsKLQkJcmV0dXJuIHZvbHVtZVByb3ZpZGVyLmdldFRleHQodm9sdW1lKTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvZm9ybXMvVXBkYXRlQWRhcHRlckZhY3RvcnkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9mb3Jtcy9VcGRhdGVBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTNjNDFmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9mb3Jtcy9VcGRhdGVBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuZm9ybXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wcm9wZXJ0aWVzLio7Ci0KLXB1YmxpYyBjbGFzcyBVcGRhdGVBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIElBZGFwdGVyRmFjdG9yeSB7Ci0KLXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihPYmplY3QgYWRhcHRhYmxlT2JqZWN0LCBDbGFzcyBhZGFwdGVyVHlwZSkgewotCWlmIChhZGFwdGVyVHlwZS5lcXVhbHMoSVByb3BlcnR5U291cmNlLmNsYXNzKSkgCi0JCXJldHVybiBnZXRQcm9wZXJ0aWVzKGFkYXB0YWJsZU9iamVjdCk7Ci0JcmV0dXJuIG51bGw7CQotfQotCi1wdWJsaWMgQ2xhc3NbXSBnZXRBZGFwdGVyTGlzdCgpIHsKLQlyZXR1cm4gbmV3IENsYXNzW10geyBJUHJvcGVydHlTb3VyY2UuY2xhc3MgfTsKLX0KLQotcHJpdmF0ZSBPYmplY3QgZ2V0UHJvcGVydGllcyhPYmplY3Qgb2JqZWN0KSB7Ci0JaWYgKG9iamVjdCBpbnN0YW5jZW9mIFNpdGVCb29rbWFyaykgewotCSAgIHJldHVybiBuZXcgU2l0ZUJvb2ttYXJrUHJvcGVydHlTb3VyY2UoKFNpdGVCb29rbWFyaylvYmplY3QpOwotCX0KLQlyZXR1cm4gbnVsbDsKLX0KLQotfQotCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvZm9ybXMvVXBkYXRlU2VjdGlvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL2Zvcm1zL1VwZGF0ZVNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNkM2FjMi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvZm9ybXMvVXBkYXRlU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuZm9ybXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkucGFnZXMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkucHJlZmVyZW5jZXMuVXBkYXRlQ29sb3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbC4qOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVXBkYXRlU2VjdGlvbiBleHRlbmRzIEZvcm1TZWN0aW9uIHsKLQlwcml2YXRlIFVwZGF0ZUZvcm1QYWdlIHBhZ2U7Ci0JCi0JcHVibGljIFVwZGF0ZVNlY3Rpb24oVXBkYXRlRm9ybVBhZ2UgcGFnZSkgewotCQl0aGlzLnBhZ2UgPSBwYWdlOwotCQlJUHJlZmVyZW5jZVN0b3JlIHBzdG9yZSA9IFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJcHN0b3JlLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobmV3IElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJaWYgKGUuZ2V0UHJvcGVydHkoKS5lcXVhbHMoVXBkYXRlQ29sb3JzLlBfVE9QSUNfQ09MT1IpKQotCQkJCQl1cGRhdGVIZWFkZXJDb2xvcigpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHVibGljIFVwZGF0ZUZvcm1QYWdlIGdldFBhZ2UoKSB7Ci0JCXJldHVybiBwYWdlOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVIZWFkZXJDb2xvcigpIHsKLQkJaGVhZGVyLnNldEZvcmVncm91bmQoVXBkYXRlQ29sb3JzLmdldFRvcGljQ29sb3IoaGVhZGVyLmdldERpc3BsYXkoKSkpOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL2Zvcm1zL1VwZGF0ZVdlYkZvcm0uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9mb3Jtcy9VcGRhdGVXZWJGb3JtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NDFiOTEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL2Zvcm1zL1VwZGF0ZVdlYkZvcm0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLmZvcm1zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnBhZ2VzLklVcGRhdGVGb3JtUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWwuV2ViRm9ybTsKLQotcHVibGljIGNsYXNzIFVwZGF0ZVdlYkZvcm0gZXh0ZW5kcyBXZWJGb3JtIGltcGxlbWVudHMgSVVwZGF0ZUZvcm0sIElVcGRhdGVNb2RlbENoYW5nZWRMaXN0ZW5lciB7Ci0JcHJpdmF0ZSBJVXBkYXRlRm9ybVBhZ2UgcGFnZTsKLQlwcml2YXRlIENvbnRyb2wgZm9jdXNDb250cm9sOwotCi0JcHVibGljIFVwZGF0ZVdlYkZvcm0oSVVwZGF0ZUZvcm1QYWdlIHBhZ2UpIHsKLQkJdGhpcy5wYWdlID0gcGFnZTsKLQkJVXBkYXRlTW9kZWwgbW9kZWwgPSBVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0VXBkYXRlTW9kZWwoKTsKLQkJbW9kZWwuYWRkVXBkYXRlTW9kZWxDaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCVVwZGF0ZU1vZGVsIG1vZGVsID0gVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldFVwZGF0ZU1vZGVsKCk7Ci0JCW1vZGVsLnJlbW92ZVVwZGF0ZU1vZGVsQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgb2JqZWN0c0FkZGVkKE9iamVjdCBwYXJlbnQsIE9iamVjdCBbXSBjaGlsZHJlbikgewotCX0KLQlwdWJsaWMgdm9pZCBvYmplY3RzUmVtb3ZlZChPYmplY3QgcGFyZW50LCBPYmplY3QgW10gY2hpbGRyZW4pIHsKLQl9Ci0JcHVibGljIHZvaWQgb2JqZWN0Q2hhbmdlZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpIHsKLQl9Ci0KLQlwdWJsaWMgSVVwZGF0ZUZvcm1QYWdlIGdldFBhZ2UoKSB7Ci0JCXJldHVybiBwYWdlOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoT2JqZWN0IG1vZGVsKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUobW9kZWwpOwotCQlpZiAoaXNXaGl0ZUJhY2tncm91bmQoKSkgewotCQkJc2V0SGVhZGluZ0ltYWdlKFVwZGF0ZVVJSW1hZ2VzLmdldChVcGRhdGVVSUltYWdlcy5JTUdfRk9STV9CQU5ORVIpKTsKLQkJCXNldEhlYWRpbmdVbmRlcmxpbmVJbWFnZSgKLQkJCQlVcGRhdGVVSUltYWdlcy5nZXQoVXBkYXRlVUlJbWFnZXMuSU1HX0ZPUk1fVU5ERVJMSU5FKSk7Ci0JCX0KLQkJcmVmcmVzaFNpemUoKTsKLQl9Ci0JcHJpdmF0ZSBib29sZWFuIGlzV2hpdGVCYWNrZ3JvdW5kKCkgewotCQlDb2xvciBjb2xvciA9IGdldEZhY3RvcnkoKS5nZXRCYWNrZ3JvdW5kQ29sb3IoKTsKLQkJcmV0dXJuICgKLQkJCWNvbG9yLmdldFJlZCgpID09IDI1NSAmJiBjb2xvci5nZXRHcmVlbigpID09IDI1NSAmJiBjb2xvci5nZXRCbHVlKCkgPT0gMjU1KTsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNpemUoKSB7Ci0JCSgoQ29tcG9zaXRlKSBnZXRDb250cm9sKCkpLmxheW91dCgpOwotCQl1cGRhdGVTaXplKCk7Ci0JfQotCXByb3RlY3RlZCB2b2lkIHNldEZvY3VzQ29udHJvbChDb250cm9sIGNvbnRyb2wpIHsKLQkJZm9jdXNDb250cm9sID0gY29udHJvbDsKLQl9Ci0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0JCWlmIChmb2N1c0NvbnRyb2whPW51bGwpIGZvY3VzQ29udHJvbC5zZXRGb2N1cygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9Cb29rbWFya0ZvbGRlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL0Jvb2ttYXJrRm9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ZjJiOWYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL0Jvb2ttYXJrRm9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBCb29rbWFya0ZvbGRlciBleHRlbmRzIE5hbWVkTW9kZWxPYmplY3QgewotCXByb3RlY3RlZCBBcnJheUxpc3QgY2hpbGRyZW49IG5ldyBBcnJheUxpc3QoKTsKLQlwdWJsaWMgQm9va21hcmtGb2xkZXIoKSB7Ci0JfQotCQotCXB1YmxpYyBCb29rbWFya0ZvbGRlcihTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnQpIHsKLQkJcmV0dXJuIGNoaWxkcmVuLnRvQXJyYXkoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBjaGlsZHJlbi5zaXplKCk+MDsKLQl9IAotCQotCXB1YmxpYyB2b2lkIGFkZENoaWxkKE5hbWVkTW9kZWxPYmplY3Qgb2JqZWN0KSB7Ci0JCWludGVybmFsQWRkKG9iamVjdCk7Ci0JCW5vdGlmeU9iamVjdHNBZGRlZCh0aGlzLCBuZXcgT2JqZWN0W10ge29iamVjdH0pOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZENoaWxkcmVuKE5hbWVkTW9kZWxPYmplY3QgW10gb2JqZWN0cykgewotCQlmb3IgKGludCBpPTA7IGk8b2JqZWN0cy5sZW5ndGg7IGkrKykgewotCQkJaW50ZXJuYWxBZGQob2JqZWN0c1tpXSk7Ci0JCX0KLQkJbm90aWZ5T2JqZWN0c0FkZGVkKHRoaXMsIG9iamVjdHMpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbnRlcm5hbEFkZChOYW1lZE1vZGVsT2JqZWN0IGNoaWxkKSB7Ci0JCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCWNoaWxkLnNldE1vZGVsKGdldE1vZGVsKCkpOwotCQljaGlsZC5zZXRQYXJlbnQodGhpcyk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZUNoaWxkcmVuKE5hbWVkTW9kZWxPYmplY3QgW10gb2JqZWN0cykgewotCQlmb3IgKGludCBpPTA7IGk8b2JqZWN0cy5sZW5ndGg7IGkrKykgewotCQkJY2hpbGRyZW4ucmVtb3ZlKG9iamVjdHNbaV0pOwotCQkJb2JqZWN0c1tpXS5zZXRQYXJlbnQobnVsbCk7Ci0JCX0KLQkJbm90aWZ5T2JqZWN0c1JlbW92ZWQodGhpcywgb2JqZWN0cyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9Cb29rbWFya1V0aWwuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9Cb29rbWFya1V0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI1ZGJhYS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvQm9va21hcmtVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWw7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnBhcnNlcnMuRE9NUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuc2VhcmNoLio7Ci1pbXBvcnQgb3JnLnczYy5kb20uKjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBCb29rbWFya1V0aWwgewotCXB1YmxpYyBzdGF0aWMgdm9pZCBwYXJzZShTdHJpbmcgZmlsZU5hbWUsIFZlY3RvciBib29rbWFya3MpIHsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZmlsZU5hbWUpOwotCQlpZiAoIWZpbGUuZXhpc3RzKCkpCi0JCQlyZXR1cm47Ci0JCURPTVBhcnNlciBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7Ci0JCXRyeSB7Ci0JCQlwYXJzZXIucGFyc2UoZmlsZU5hbWUpOwotCQkJRG9jdW1lbnQgZG9jID0gcGFyc2VyLmdldERvY3VtZW50KCk7Ci0JCQlOb2RlIHJvb3QgPSBkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCQlwcm9jZXNzUm9vdChyb290LCBib29rbWFya3MpOwotCQl9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotCQkJVXBkYXRlVUkubG9nRXhjZXB0aW9uKGUpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlVcGRhdGVVSS5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFNpdGVCb29rbWFya1tdIGdldEJvb2ttYXJrcyhWZWN0b3IgYm9va21hcmtzKSB7Ci0JCUFycmF5TGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYm9va21hcmtzLnNpemUoKTsgaSsrKSB7Ci0JCQlwcm9jZXNzRW50cnkoYm9va21hcmtzLmdldChpKSwgcmVzdWx0KTsKLQkJfQotCQlyZXR1cm4gKFNpdGVCb29rbWFya1tdKSByZXN1bHQudG9BcnJheShuZXcgU2l0ZUJvb2ttYXJrW3Jlc3VsdC5zaXplKCldKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEJvb2ttYXJrRm9sZGVyIGdldEZvbGRlcihWZWN0b3IgYm9va21hcmtzLCBJUGF0aCBwYXRoKSB7Ci0JCU5hbWVkTW9kZWxPYmplY3Qgb2JqZWN0ID0gZmluZChib29rbWFya3MsIHBhdGgpOwotCQlpZiAob2JqZWN0ICE9IG51bGwgJiYgb2JqZWN0IGluc3RhbmNlb2YgQm9va21hcmtGb2xkZXIpCi0JCQlyZXR1cm4gKEJvb2ttYXJrRm9sZGVyKSBvYmplY3Q7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgTmFtZWRNb2RlbE9iamVjdCBmaW5kKFZlY3RvciBib29rbWFya3MsIElQYXRoIHBhdGgpIHsKLQkJT2JqZWN0W10gYXJyYXkgPSBib29rbWFya3MudG9BcnJheSgpOwotCQlyZXR1cm4gZmluZChhcnJheSwgcGF0aCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgTmFtZWRNb2RlbE9iamVjdCBmaW5kKE9iamVjdFtdIGFycmF5LCBJUGF0aCBwYXRoKSB7Ci0JCVN0cmluZyBuYW1lID0gcGF0aC5zZWdtZW50KDApOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCQlOYW1lZE1vZGVsT2JqZWN0IG9iaiA9IChOYW1lZE1vZGVsT2JqZWN0KSBhcnJheVtpXTsKLQkJCWlmIChvYmouZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBCb29rbWFya0ZvbGRlcikgewotCQkJCQlpZiAocGF0aC5zZWdtZW50Q291bnQoKSA+IDEpIHsKLQkJCQkJCUlQYXRoIGNoaWxkUGF0aCA9IHBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cygxKTsKLQkJCQkJCUJvb2ttYXJrRm9sZGVyIGZvbGRlciA9IChCb29rbWFya0ZvbGRlcikgb2JqOwotCQkJCQkJcmV0dXJuIGZpbmQoZm9sZGVyLmdldENoaWxkcmVuKG51bGwpLCBjaGlsZFBhdGgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBvYmo7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcm9jZXNzUm9vdChOb2RlIHJvb3QsIFZlY3RvciBib29rbWFya3MpIHsKLQkJaWYgKHJvb3QuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoImJvb2ttYXJrcyIpKSB7Ci0JCQlOb2RlTGlzdCBjaGlsZHJlbiA9IHJvb3QuZ2V0Q2hpbGROb2RlcygpOwotCQkJcHJvY2Vzc0NoaWxkcmVuKGNoaWxkcmVuLCBudWxsLCBib29rbWFya3MpOwotCQl9Ci0JfQotCXByaXZhdGUgc3RhdGljIHZvaWQgcHJvY2Vzc0NoaWxkcmVuKAotCQlOb2RlTGlzdCBjaGlsZHJlbiwKLQkJQm9va21hcmtGb2xkZXIgZm9sZGVyLAotCQlWZWN0b3IgYm9va21hcmtzKSB7Ci0JCVVwZGF0ZU1vZGVsIG1vZGVsID0gVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldFVwZGF0ZU1vZGVsKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJTm9kZSBjaGlsZCA9IGNoaWxkcmVuLml0ZW0oaSk7Ci0JCQlOYW1lZE1vZGVsT2JqZWN0IG9iamVjdCA9IG51bGw7Ci0JCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCWlmIChjaGlsZC5nZXROb2RlTmFtZSgpLmVxdWFscygic2l0ZSIpKSB7Ci0JCQkJCW9iamVjdCA9IGNyZWF0ZVNpdGUoY2hpbGQpOwotCi0JCQkJfSBlbHNlIGlmIChjaGlsZC5nZXROb2RlTmFtZSgpLmVxdWFscygiZm9sZGVyIikpIHsKLQkJCQkJb2JqZWN0ID0gY3JlYXRlRm9sZGVyKGNoaWxkKTsKLQkJCQl9IGVsc2UgaWYgKGNoaWxkLmdldE5vZGVOYW1lKCkuZXF1YWxzKCJzZWFyY2giKSkgewotCQkJCQlvYmplY3QgPSBjcmVhdGVTZWFyY2goY2hpbGQpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChvYmplY3QgIT0gbnVsbCkgewotCQkJCWlmIChmb2xkZXIgIT0gbnVsbCkgewotCQkJCQlmb2xkZXIuYWRkQ2hpbGQob2JqZWN0KTsKLQkJCQl9IGVsc2UgewotCQkJCQlib29rbWFya3MuYWRkKG9iamVjdCk7Ci0JCQkJfQotCQkJCW9iamVjdC5zZXRNb2RlbChtb2RlbCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTaXRlQm9va21hcmsgY3JlYXRlU2l0ZShOb2RlIGNoaWxkKSB7Ci0JCVN0cmluZyBuYW1lID0gZ2V0QXR0cmlidXRlKGNoaWxkLCAibmFtZSIpOwotCQlVUkwgdXJsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXVybCA9IG5ldyBVUkwoZ2V0QXR0cmlidXRlKGNoaWxkLCAidXJsIikpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQl9Ci0JCWJvb2xlYW4gd2ViQm9va21hcmsgPSBmYWxzZTsKLQkJU3RyaW5nIHdlYiA9IGdldEF0dHJpYnV0ZShjaGlsZCwgIndlYiIpOwotCQlpZiAod2ViIT1udWxsICYmIHdlYi5lcXVhbHMoInRydWUiKSkKLQkJCXdlYkJvb2ttYXJrID0gdHJ1ZTsKLQkJcmV0dXJuIG5ldyBTaXRlQm9va21hcmsobmFtZSwgdXJsLCB3ZWJCb29rbWFyayk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgQm9va21hcmtGb2xkZXIgY3JlYXRlRm9sZGVyKE5vZGUgY2hpbGQpIHsKLQkJQm9va21hcmtGb2xkZXIgZm9sZGVyID0gbmV3IEJvb2ttYXJrRm9sZGVyKCk7Ci0JCVN0cmluZyBuYW1lID0gZ2V0QXR0cmlidXRlKGNoaWxkLCAibmFtZSIpOwotCQlmb2xkZXIuc2V0TmFtZShuYW1lKTsKLQkJaWYgKGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJTm9kZUxpc3QgY2hpbGRyZW4gPSBjaGlsZC5nZXRDaGlsZE5vZGVzKCk7Ci0JCQlwcm9jZXNzQ2hpbGRyZW4oY2hpbGRyZW4sIGZvbGRlciwgbnVsbCk7Ci0JCX0KLQkJcmV0dXJuIGZvbGRlcjsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgU2VhcmNoT2JqZWN0IGNyZWF0ZVNlYXJjaChOb2RlIGNoaWxkKSB7Ci0JCVN0cmluZyBuYW1lID0gZ2V0QXR0cmlidXRlKGNoaWxkLCAibmFtZSIpOwotCQlTdHJpbmcgY2F0ZWdvcnlJZCA9IGdldEF0dHJpYnV0ZShjaGlsZCwgImNhdGVnb3J5Iik7Ci0JCVN0cmluZyBmaXhlZCA9IGdldEF0dHJpYnV0ZShjaGlsZCwgImZpeGVkIik7Ci0JCWJvb2xlYW4gZml4ZWRDYXRlZ29yeSA9IGZpeGVkLmVxdWFscygidHJ1ZSIpOwotCQlTZWFyY2hDYXRlZ29yeURlc2NyaXB0b3IgZGVzYyA9Ci0JCQlTZWFyY2hDYXRlZ29yeVJlZ2lzdHJ5UmVhZGVyLmdldERlZmF1bHQoKS5nZXREZXNjcmlwdG9yKGNhdGVnb3J5SWQpOwotCQlTZWFyY2hPYmplY3Qgc2VhcmNoID0gbmV3IFNlYXJjaE9iamVjdChuYW1lLCBkZXNjLCBmaXhlZENhdGVnb3J5KTsKLQkJaWYgKGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJTm9kZUxpc3QgY2hpbGRyZW4gPSBjaGlsZC5nZXRDaGlsZE5vZGVzKCk7Ci0JCQlIYXNodGFibGUgc2V0dGluZ3MgPSBzZWFyY2guZ2V0U2V0dGluZ3MoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCU5vZGUgcGFyYW0gPSBjaGlsZHJlbi5pdGVtKGkpOwotCQkJCWlmIChwYXJhbS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFCi0JCQkJCSYmIHBhcmFtLmdldE5vZGVOYW1lKCkuZXF1YWxzKCJwYXJhbSIpKSB7Ci0JCQkJCVN0cmluZyBrZXkgPSBnZXRBdHRyaWJ1dGUocGFyYW0sICJuYW1lIik7Ci0JCQkJCVN0cmluZyB2YWx1ZSA9IGdldEF0dHJpYnV0ZShwYXJhbSwgInZhbHVlIik7Ci0JCQkJCXNldHRpbmdzLnB1dChrZXksIHZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNlYXJjaDsKLQl9Ci0JcHVibGljIHN0YXRpYyB2b2lkIHN0b3JlKFN0cmluZyBmaWxlTmFtZSwgVmVjdG9yIGJvb2ttYXJrcykgewotCQl0cnkgewotCQkJRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlTmFtZSk7Ci0JCQlPdXRwdXRTdHJlYW1Xcml0ZXIgb3N3ID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihmb3MsICJVVEY4Iik7Ci0JCQlQcmludFdyaXRlciB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIob3N3KTsKLQkJCXdyaXRlci5wcmludGxuKCI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz4iKTsKLQkJCXdyaXRlci5wcmludGxuKCI8Ym9va21hcmtzPiIpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBib29rbWFya3Muc2l6ZSgpOyBpKyspIHsKLQkJCQlPYmplY3Qgb2JqID0gYm9va21hcmtzLmdldChpKTsKLQkJCQl3cml0ZU9iamVjdCgiICAgIiwgb2JqLCB3cml0ZXIpOwotCQkJfQotCQkJd3JpdGVyLnByaW50bG4oIjwvYm9va21hcmtzPiIpOwotCQkJd3JpdGVyLmZsdXNoKCk7Ci0JCQl3cml0ZXIuY2xvc2UoKTsKLQkJCW9zdy5jbG9zZSgpOwotCQkJZm9zLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlT2JqZWN0KAotCQlTdHJpbmcgaW5kZW50LAotCQlPYmplY3Qgb2JqLAotCQlQcmludFdyaXRlciB3cml0ZXIpIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFNpdGVCb29rbWFyaykgewotCQkJU2l0ZUJvb2ttYXJrIGJvb2ttYXJrID0gKFNpdGVCb29rbWFyaykgb2JqOwotCQkJU3RyaW5nIG5hbWUgPSBib29rbWFyay5nZXROYW1lKCk7Ci0JCQlTdHJpbmcgdXJsID0gYm9va21hcmsuZ2V0VVJMKCkudG9TdHJpbmcoKTsKLQkJCVN0cmluZyB3ZWIgPSBib29rbWFyay5pc1dlYkJvb2ttYXJrKCk/InRydWUiOiJmYWxzZSI7Ci0JCQl3cml0ZXIucHJpbnRsbihpbmRlbnQgKyAiPHNpdGUgbmFtZT1cIiIgKyBuYW1lICsgIlwiIHVybD1cIiIgKyB1cmwgKyAiXCIgd2ViPVwiIiArIHdlYiArICJcIi8+Iik7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgQm9va21hcmtGb2xkZXIpIHsKLQkJCUJvb2ttYXJrRm9sZGVyIGZvbGRlciA9IChCb29rbWFya0ZvbGRlcikgb2JqOwotCQkJU3RyaW5nIG5hbWUgPSBmb2xkZXIuZ2V0TmFtZSgpOwotCQkJd3JpdGVyLnByaW50bG4oaW5kZW50ICsgIjxmb2xkZXIgbmFtZT1cIiIgKyBuYW1lICsgIlwiPiIpOwotCQkJT2JqZWN0W10gY2hpbGRyZW4gPSBmb2xkZXIuZ2V0Q2hpbGRyZW4oZm9sZGVyKTsKLQkJCVN0cmluZyBpbmRlbnQyID0gaW5kZW50ICsgIiAgICI7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQkJd3JpdGVPYmplY3QoaW5kZW50MiwgY2hpbGRyZW5baV0sIHdyaXRlcik7Ci0JCQl9Ci0JCQl3cml0ZXIucHJpbnRsbihpbmRlbnQgKyAiPC9mb2xkZXI+Iik7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgU2VhcmNoT2JqZWN0KSB7Ci0JCQlTZWFyY2hPYmplY3Qgc2VhcmNoID0gKFNlYXJjaE9iamVjdCkgb2JqOwotCQkJaWYgKHNlYXJjaC5pc1BlcnNpc3RlbnQoKSA9PSBmYWxzZSkKLQkJCQlyZXR1cm47Ci0JCQlTdHJpbmcgbmFtZSA9IHNlYXJjaC5nZXROYW1lKCk7Ci0JCQlTdHJpbmcgY2F0ZWdvcnlJZCA9IHNlYXJjaC5nZXRDYXRlZ29yeUlkKCk7Ci0JCQlTdHJpbmcgZml4ZWQgPSBzZWFyY2guaXNDYXRlZ29yeUZpeGVkKCkgPyAidHJ1ZSIgOiAiZmFsc2UiOwotCQkJd3JpdGVyLnByaW50bG4oCi0JCQkJaW5kZW50Ci0JCQkJCSsgIjxzZWFyY2ggbmFtZT1cIiIKLQkJCQkJKyBuYW1lCi0JCQkJCSsgIlwiIGNhdGVnb3J5PVwiIgotCQkJCQkrIGNhdGVnb3J5SWQKLQkJCQkJKyAiXCIgZml4ZWQ9XCIiCi0JCQkJCSsgZml4ZWQKLQkJCQkJKyAiXCI+Iik7Ci0JCQlIYXNodGFibGUgc2V0dGluZ3MgPSBzZWFyY2guZ2V0U2V0dGluZ3MoKTsKLQkJCVN0cmluZyBpbmRlbnQyID0gaW5kZW50ICsgIiAgICI7Ci0JCQlmb3IgKEVudW1lcmF0aW9uIGVudW0gPSBzZXR0aW5ncy5rZXlzKCk7IGVudW0uaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGVudW0ubmV4dEVsZW1lbnQoKTsKLQkJCQlTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSBzZXR0aW5ncy5nZXQoa2V5KTsKLQkJCQl3cml0ZXIucHJpbnRsbigKLQkJCQkJaW5kZW50MiArICI8cGFyYW0gbmFtZT1cIiIgKyBrZXkgKyAiXCIgdmFsdWU9XCIiICsgdmFsdWUgKyAiXCIvPiIpOwotCQkJfQotCQkJd3JpdGVyLnByaW50bG4oaW5kZW50ICsgIjwvc2VhcmNoPiIpOwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0QXR0cmlidXRlKE5vZGUgbm9kZSwgU3RyaW5nIG5hbWUpIHsKLQkJTmFtZWROb2RlTWFwIGF0dHMgPSBub2RlLmdldEF0dHJpYnV0ZXMoKTsKLQkJTm9kZSBhdHQgPSBhdHRzLmdldE5hbWVkSXRlbShuYW1lKTsKLQkJaWYgKGF0dCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gYXR0LmdldE5vZGVWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiAiIjsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcm9jZXNzRm9sZGVyKEJvb2ttYXJrRm9sZGVyIGZvbGRlciwgQXJyYXlMaXN0IHJlc3VsdCkgewotCQlPYmplY3RbXSBjaGlsZHJlbiA9IGZvbGRlci5nZXRDaGlsZHJlbihmb2xkZXIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQlwcm9jZXNzRW50cnkoY2hpbGRyZW5baV0sIHJlc3VsdCk7Ci0JCX0KLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcm9jZXNzRW50cnkoT2JqZWN0IG9iaiwgQXJyYXlMaXN0IHJlc3VsdCkgewotCQlpZiAob2JqIGluc3RhbmNlb2YgU2l0ZUJvb2ttYXJrKQotCQkJcmVzdWx0LmFkZChvYmopOwotCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBCb29rbWFya0ZvbGRlcikgewotCQkJcHJvY2Vzc0ZvbGRlcigoQm9va21hcmtGb2xkZXIpIG9iaiwgcmVzdWx0KTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliYTk3MTEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL0NvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpblZlcnNpb25JZGVudGlmaWVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOw0KLQ0KLS8qKg0KLSAqIEB2ZXJzaW9uIAkxLjANCi0gKiBAYXV0aG9yDQotICovDQotcHVibGljIGNsYXNzIENvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlcg0KLQlleHRlbmRzIFNpbXBsZUZlYXR1cmVBZGFwdGVyDQotCWltcGxlbWVudHMgSUNvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlciB7DQotCXByaXZhdGUgSUNvbmZpZ3VyZWRTaXRlQWRhcHRlciBhZGFwdGVyOw0KLQlwcml2YXRlIGJvb2xlYW4gY29uZmlndXJlZDsNCi0JcHJpdmF0ZSBib29sZWFuIHVwZGF0ZWQ7DQotDQotCXB1YmxpYyBDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXIoDQotCQlJQ29uZmlndXJlZFNpdGVBZGFwdGVyIGFkYXB0ZXIsDQotCQlJRmVhdHVyZSBmZWF0dXJlLA0KLQkJYm9vbGVhbiBjb25maWd1cmVkLA0KLQkJYm9vbGVhbiB1cGRhdGVkLA0KLQkJYm9vbGVhbiBvcHRpb25hbCkgew0KLQkJc3VwZXIoZmVhdHVyZSwgb3B0aW9uYWwpOw0KLQkJdGhpcy5hZGFwdGVyID0gYWRhcHRlcjsNCi0JCXRoaXMuY29uZmlndXJlZCA9IGNvbmZpZ3VyZWQ7DQotCQl0aGlzLnVwZGF0ZWQgPSB1cGRhdGVkOw0KLQl9DQotDQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7DQotCQlpZiAob2JqZWN0ID09IG51bGwpDQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJaWYgKG9iamVjdCA9PSB0aGlzKQ0KLQkJCXJldHVybiB0cnVlOw0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIENvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlcikgew0KLQkJCXRyeSB7DQotCQkJCUNvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlciBhZCA9IChDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXIpIG9iamVjdDsNCi0JCQkJcmV0dXJuIGFkLmdldENvbmZpZ3VyZWRTaXRlKCkuZXF1YWxzKGdldENvbmZpZ3VyZWRTaXRlKCkpDQotCQkJCQkmJiBhZC5nZXRGZWF0dXJlKG51bGwpLmVxdWFscyhnZXRGZWF0dXJlKG51bGwpKTsNCi0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0NCi0JcHVibGljIElDb25maWd1cmVkU2l0ZSBnZXRDb25maWd1cmVkU2l0ZSgpIHsNCi0JCXJldHVybiBhZGFwdGVyLmdldENvbmZpZ3VyZWRTaXRlKCk7DQotCX0NCi0JcHVibGljIElJbnN0YWxsQ29uZmlndXJhdGlvbiBnZXRJbnN0YWxsQ29uZmlndXJhdGlvbigpIHsNCi0JCXJldHVybiBhZGFwdGVyLmdldEluc3RhbGxDb25maWd1cmF0aW9uKCk7DQotCX0NCi0JcHVibGljIGJvb2xlYW4gaXNDb25maWd1cmVkKCkgew0KLQkJcmV0dXJuIGNvbmZpZ3VyZWQ7DQotCX0NCi0NCi0JcHVibGljIGJvb2xlYW4gaXNVcGRhdGVkKCkgew0KLQkJcmV0dXJuIHVwZGF0ZWQ7DQotCX0NCi0JcHVibGljIElGZWF0dXJlQWRhcHRlcltdIGdldEluY2x1ZGVkRmVhdHVyZXMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7DQotCQl0cnkgew0KLQkJCUlJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VbXSBpbmNsdWRlZCA9DQotCQkJCWdldEZlYXR1cmUobnVsbCkuZ2V0SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpOw0KLQkJCUNvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlcltdIHJlc3VsdCA9DQotCQkJCW5ldyBDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXJbaW5jbHVkZWQubGVuZ3RoXTsNCi0JCQlpZiAobW9uaXRvciA9PSBudWxsKQ0KLQkJCQltb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsNCi0JCQlTdWJQcm9ncmVzc01vbml0b3Igc3ViTW9uaXRvciA9IG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMSk7DQotCQkJc3ViTW9uaXRvci5iZWdpblRhc2soIiIsIGluY2x1ZGVkLmxlbmd0aCk7DQotDQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmNsdWRlZC5sZW5ndGg7IGkrKykgew0KLQkJCQlJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlIGZyZWYgPSBpbmNsdWRlZFtpXTsNCi0JCQkJSUZlYXR1cmUgZmVhdHVyZTsNCi0JCQkJYm9vbGVhbiBjaGlsZENvbmZpZ3VyZWQgPSBjb25maWd1cmVkOw0KLQkJCQlib29sZWFuIHVwZGF0ZWQgPSBmYWxzZTsNCi0JCQkJdHJ5IHsNCi0JCQkJCWZlYXR1cmUgPQ0KLQkJCQkJCWZyZWYuZ2V0RmVhdHVyZSgNCi0JCQkJCQkJIWNvbmZpZ3VyZWQsDQotCQkJCQkJCWdldENvbmZpZ3VyZWRTaXRlKCksDQotCQkJCQkJCW5ldyBTdWJQcm9ncmVzc01vbml0b3Ioc3ViTW9uaXRvciwgMSkpOw0KLQkJCQkJY2hpbGRDb25maWd1cmVkID0NCi0JCQkJCQlhZGFwdGVyLmdldENvbmZpZ3VyZWRTaXRlKCkuaXNDb25maWd1cmVkKGZlYXR1cmUpOw0KLQkJCQkJLy8vKg0KLQkJCQkJUGx1Z2luVmVyc2lvbklkZW50aWZpZXIgcmVmcGlkID0NCi0JCQkJCQlmcmVmLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRWZXJzaW9uKCk7DQotCQkJCQlQbHVnaW5WZXJzaW9uSWRlbnRpZmllciBmcGlkID0NCi0JCQkJCQlmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRWZXJzaW9uKCk7DQotCQkJCQl1cGRhdGVkID0gIXJlZnBpZC5lcXVhbHMoZnBpZCk7DQotCQkJCQkvLyovDQotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgew0KLQkJCQkJZmVhdHVyZSA9IG5ldyBNaXNzaW5nRmVhdHVyZShnZXRGZWF0dXJlKG51bGwpLCBmcmVmKTsNCi0JCQkJCWNoaWxkQ29uZmlndXJlZCA9IGZhbHNlOw0KLQkJCQl9DQotDQotCQkJCXJlc3VsdFtpXSA9DQotCQkJCQluZXcgQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyKA0KLQkJCQkJCWFkYXB0ZXIsDQotCQkJCQkJZmVhdHVyZSwNCi0JCQkJCQljaGlsZENvbmZpZ3VyZWQsDQotCQkJCQkJdXBkYXRlZCwNCi0JCQkJCQlmcmVmLmlzT3B0aW9uYWwoKSk7DQotCQkJCXJlc3VsdFtpXS5zZXRJbmNsdWRlZCh0cnVlKTsNCi0JCQl9DQotCQkJcmV0dXJuIHJlc3VsdDsNCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgew0KLQkJCXJldHVybiBuZXcgSUZlYXR1cmVBZGFwdGVyWzBdOw0KLQkJfQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9Db25maWd1cmVkU2l0ZUFkYXB0ZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9Db25maWd1cmVkU2l0ZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VjZGRlMC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvQ29uZmlndXJlZFNpdGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7Ci0KLS8qKgotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJlZFNpdGVBZGFwdGVyCi0JZXh0ZW5kcyBVSU1vZGVsT2JqZWN0Ci0JaW1wbGVtZW50cyBJQ29uZmlndXJlZFNpdGVBZGFwdGVyIHsKLQlwcml2YXRlIElJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWc7Ci0JcHJpdmF0ZSBJQ29uZmlndXJlZFNpdGUgY3NpdGU7Ci0JCQotCXB1YmxpYyBDb25maWd1cmVkU2l0ZUFkYXB0ZXIoSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZywgSUNvbmZpZ3VyZWRTaXRlIGNzaXRlKSB7Ci0JCXRoaXMuY3NpdGUgPSBjc2l0ZTsKLQkJdGhpcy5jb25maWcgPSBjb25maWc7Ci0JfQotCQotCXB1YmxpYyBJQ29uZmlndXJlZFNpdGUgZ2V0Q29uZmlndXJlZFNpdGUoKSB7Ci0JCXJldHVybiBjc2l0ZTsKLQl9Ci0KLQlwdWJsaWMgSUluc3RhbGxDb25maWd1cmF0aW9uIGdldEluc3RhbGxDb25maWd1cmF0aW9uKCkgewotCQlyZXR1cm4gY29uZmlnOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0PT1udWxsKSByZXR1cm4gZmFsc2U7Ci0JCWlmIChvYmplY3QgPT0gdGhpcykgcmV0dXJuIHRydWU7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBDb25maWd1cmVkU2l0ZUFkYXB0ZXIpIHsKLQkJCUNvbmZpZ3VyZWRTaXRlQWRhcHRlciBhZGFwdGVyID0gKENvbmZpZ3VyZWRTaXRlQWRhcHRlcilvYmplY3Q7Ci0JCQlyZXR1cm4gY3NpdGUhPW51bGwgJiYgY3NpdGUuZ2V0U2l0ZSgpLmVxdWFscyhhZGFwdGVyLmdldENvbmZpZ3VyZWRTaXRlKCkuZ2V0U2l0ZSgpKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL0Rpc2NvdmVyeUZvbGRlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL0Rpc2NvdmVyeUZvbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjBiZTNkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9EaXNjb3ZlcnlGb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBEaXNjb3ZlcnlGb2xkZXIgZXh0ZW5kcyBCb29rbWFya0ZvbGRlciB7Ci0JcHVibGljIERpc2NvdmVyeUZvbGRlcigpIHsKLQkJc3VwZXIoVXBkYXRlVUkuZ2V0U3RyaW5nKCJEaXNjb3ZlcnlGb2xkZXIiKSk7Ci0JCXNldE1vZGVsKFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRVcGRhdGVNb2RlbCgpKTsKLQl9Ci0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJY2hpbGRyZW4uY2xlYXIoKTsKLQkJdHJ5IHsKLQkJCUlMb2NhbFNpdGUgc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpOwotCQkJSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZyA9IHNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKTsKLQkJCUlDb25maWd1cmVkU2l0ZVtdIGNzaXRlcyA9IGNvbmZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY3NpdGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUNvbmZpZ3VyZWRTaXRlIGNzaXRlID0gY3NpdGVzW2ldOwotCQkJCUlGZWF0dXJlUmVmZXJlbmNlW10gcmVmcyA9IGNzaXRlLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgcmVmcy5sZW5ndGg7IGorKykgewotCQkJCQlJRmVhdHVyZVJlZmVyZW5jZSByZWYgPSByZWZzW2pdOwotCQkJCQlJRmVhdHVyZSBmZWF0dXJlID0gcmVmLmdldEZlYXR1cmUobnVsbCk7Ci0JCQkJCUlVUkxFbnRyeVtdIGVudHJpZXMgPSBmZWF0dXJlLmdldERpc2NvdmVyeVNpdGVFbnRyaWVzKCk7Ci0JCQkJCWlmIChlbnRyaWVzLmxlbmd0aCA+IDApIHsKLQkJCQkJCS8vIE9ubHkgYWRkIGRpc2NvdmVyeSBzaXRlcyBpZgotCQkJCQkJLy8gb2Ygcm9vdCBmZWF0dXJlcwotCQkJCQkJaWYgKCFpc0luY2x1ZGVkKHJlZiwgcmVmcykpCi0JCQkJCQkJYWRkQm9va21hcmtzKGVudHJpZXMpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVVwZGF0ZVVJLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQlwcml2YXRlIGJvb2xlYW4gaXNJbmNsdWRlZCgKLQkJSUZlYXR1cmVSZWZlcmVuY2UgcmVmLAotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIHJlZnMpIHsKLQkJdHJ5IHsKLQkJCVZlcnNpb25lZElkZW50aWZpZXIgdmlkID0gcmVmLmdldFZlcnNpb25lZElkZW50aWZpZXIoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmcy5sZW5ndGg7IGkrKykgewotCQkJCUlGZWF0dXJlUmVmZXJlbmNlIGNhbmRpZGF0ZSA9IHJlZnNbaV07Ci0JCQkJLy8gSWdub3JlIHNlbGYKLQkJCQlpZiAoY2FuZGlkYXRlLmVxdWFscyhyZWYpKQotCQkJCQljb250aW51ZTsKLQkJCQlJRmVhdHVyZSBjZmVhdHVyZSA9IGNhbmRpZGF0ZS5nZXRGZWF0dXJlKG51bGwpOwotCQkJCUlGZWF0dXJlUmVmZXJlbmNlW10gaXJlZnMgPQotCQkJCQljZmVhdHVyZS5nZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBpcmVmcy5sZW5ndGg7IGorKykgewotCQkJCQlJRmVhdHVyZVJlZmVyZW5jZSBpcmVmID0gaXJlZnNbal07Ci0JCQkJCVZlcnNpb25lZElkZW50aWZpZXIgaXZpZCA9IGlyZWYuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOwotCQkJCQlpZiAoaXZpZC5lcXVhbHModmlkKSkgewotCQkJCQkJLy8gYmluZ28gLSBpbmNsdWRlZCBpbiBhdCBsZWFzdCBvbmUgZmVhdHVyZQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIGFkZEJvb2ttYXJrcyhJVVJMRW50cnlbXSBlbnRyaWVzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJSVVSTEVudHJ5IGVudHJ5ID0gZW50cmllc1tpXTsKLQkJCVNpdGVCb29rbWFyayBib29rbWFyayA9Ci0JCQkJbmV3IFNpdGVCb29rbWFyaygKLQkJCQkJZW50cnkuZ2V0QW5ub3RhdGlvbigpLAotCQkJCQllbnRyeS5nZXRVUkwoKSwKLQkJCQkJZW50cnkuZ2V0VHlwZSgpID09IElVUkxFbnRyeS5XRUJfU0lURSk7Ci0JCQlpZiAoIWNvbnRhaW5zKGJvb2ttYXJrKSkKLQkJCQlpbnRlcm5hbEFkZChib29rbWFyayk7Ci0JCX0KLQl9Ci0JcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5zKFNpdGVCb29rbWFyayBib29rbWFyaykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLnNpemUoKTsgaSsrKSB7Ci0JCQlPYmplY3QgbyA9IGNoaWxkcmVuLmdldChpKTsKLQkJCWlmIChvIGluc3RhbmNlb2YgU2l0ZUJvb2ttYXJrKSB7Ci0JCQkJLy8gbm90ZTogbWF0Y2ggb24gVVJMLCBub3QgdGhlIGxhYmVsCi0JCQkJaWYgKGJvb2ttYXJrLmdldFVSTCgpLmVxdWFscygoKFNpdGVCb29rbWFyaykgbykuZ2V0VVJMKCkpKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50KSB7Ci0JCWlmIChoYXNDaGlsZHJlbigpID09IGZhbHNlKQotCQkJaW5pdGlhbGl6ZSgpOwotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRyZW4ocGFyZW50KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL0V4dGVuc2lvblJvb3QuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9FeHRlbnNpb25Sb290LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmZTI4N2UuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL0V4dGVuc2lvblJvb3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBFeHRlbnNpb25Sb290IGV4dGVuZHMgVUlNb2RlbE9iamVjdCBpbXBsZW1lbnRzIElXb3JrYmVuY2hBZGFwdGVyIHsKLQlwcml2YXRlIFVJTW9kZWxPYmplY3QgcGFyZW50OwotCXByaXZhdGUgRmlsZSByb290OwotCi0JcHVibGljIEV4dGVuc2lvblJvb3QoVUlNb2RlbE9iamVjdCBwYXJlbnQsIEZpbGUgcm9vdCkgewotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQkJdGhpcy5yb290ID0gcm9vdDsKLQl9Ci0JCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJaWYgKGFkYXB0ZXIuZXF1YWxzKElXb3JrYmVuY2hBZGFwdGVyLmNsYXNzKSkgewotCQkJcmV0dXJuIHRoaXM7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHJvb3QuZ2V0TmFtZSgpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gZ2V0TmFtZSgpOwotCX0KLQkKLQlwdWJsaWMgRmlsZSBnZXRJbnN0YWxsYWJsZURpcmVjdG9yeSgpIHsKLQkJcmV0dXJuIHJvb3Q7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgSVdvcmtiZW5jaEFkYXB0ZXIjZ2V0Q2hpbGRyZW4oT2JqZWN0KQotCSAqLwotCQotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0V4dGVuc2lvblJvb3QoRmlsZSBkaXJlY3RvcnkpIHsKLQkJRmlsZSBtYXJrZXIgPSBuZXcgRmlsZShkaXJlY3RvcnksICIuZWNsaXBzZWV4dGVuc2lvbiIpOwotCQlpZiAoIW1hcmtlci5leGlzdHMoKSB8fCBtYXJrZXIuaXNEaXJlY3RvcnkoKSkgcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBJV29ya2JlbmNoQWRhcHRlciNnZXRJbWFnZURlc2NyaXB0b3IoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RWRpdG9yUmVnaXN0cnkoKS5nZXRJbWFnZURlc2NyaXB0b3IoZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBJV29ya2JlbmNoQWRhcHRlciNnZXRMYWJlbChPYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbChPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBnZXROYW1lKCk7Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIElXb3JrYmVuY2hBZGFwdGVyI2dldFBhcmVudChPYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGFyZzApIHsKLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvRmVhdHVyZUFkYXB0ZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9GZWF0dXJlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGE4YTg1Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9GZWF0dXJlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQotDQotLyoqDQotICogQHZlcnNpb24gCTEuMA0KLSAqIEBhdXRob3INCi0gKi8NCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRmVhdHVyZUFkYXB0ZXIgZXh0ZW5kcyBVSU1vZGVsT2JqZWN0IGltcGxlbWVudHMgSUZlYXR1cmVBZGFwdGVyIHsNCi0JcHJpdmF0ZSBib29sZWFuIGluY2x1ZGVkPWZhbHNlOw0KLQ0KLQkvKg0KLQkgKiBAc2VlIElGZWF0dXJlQWRhcHRlciNnZXRJbnN0YWxsQ29uZmlndXJhdGlvbigpDQotCSAqLw0KLQlwdWJsaWMgSUluc3RhbGxDb25maWd1cmF0aW9uIGdldEluc3RhbGxDb25maWd1cmF0aW9uKCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCXB1YmxpYyBib29sZWFuIGlzSW5jbHVkZWQoKSB7DQotCQlyZXR1cm4gaW5jbHVkZWQ7DQotCX0NCi0JDQotCXByb3RlY3RlZCB2b2lkIHNldEluY2x1ZGVkKGJvb2xlYW4gaW5jbHVkZWQpIHsNCi0JCXRoaXMuaW5jbHVkZWQgPSBpbmNsdWRlZDsNCi0JfQ0KLQkNCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCi0JCXRyeSB7DQotCQkJSUZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmUobnVsbCk7DQotCQkJcmV0dXJuIGZlYXR1cmUuZ2V0TGFiZWwoKTsNCi0JCX0NCi0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsNCi0JCQlyZXR1cm4gIjxmYWlsdXJlPiI7DQotCQl9DQotCX0NCi0JcHVibGljIGJvb2xlYW4gaGFzSW5jbHVkZWRGZWF0dXJlcyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsNCi0JCXRyeSB7DQotCQkJSUZlYXR1cmVSZWZlcmVuY2UgW10gaW5jbHVkZWQgPSBnZXRGZWF0dXJlKG1vbml0b3IpLmdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKTsNCi0JCQlyZXR1cm4gaW5jbHVkZWQubGVuZ3RoPjA7DQotCQl9DQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9GZWF0dXJlUmVmZXJlbmNlQWRhcHRlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL0ZlYXR1cmVSZWZlcmVuY2VBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzODdlNjcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL0ZlYXR1cmVSZWZlcmVuY2VBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZUNvbnRleHQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSTsNCi0NCi1wdWJsaWMgY2xhc3MgRmVhdHVyZVJlZmVyZW5jZUFkYXB0ZXIgZXh0ZW5kcyBGZWF0dXJlQWRhcHRlciB7DQotCXByaXZhdGUgSUZlYXR1cmVSZWZlcmVuY2UgZmVhdHVyZVJlZjsNCi0JcHJpdmF0ZSBib29sZWFuIHRvdWNoZWQ7DQotDQotCXB1YmxpYyBGZWF0dXJlUmVmZXJlbmNlQWRhcHRlcihJRmVhdHVyZVJlZmVyZW5jZSBmZWF0dXJlUmVmKSB7DQotCQl0aGlzLmZlYXR1cmVSZWYgPSBmZWF0dXJlUmVmOw0KLQkJc2V0SW5jbHVkZWQoZmVhdHVyZVJlZiBpbnN0YW5jZW9mIElJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UpOw0KLQl9DQotCQ0KLQlwdWJsaWMgSUZlYXR1cmUgZ2V0RmVhdHVyZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCXJldHVybiBmZWF0dXJlUmVmLmdldEZlYXR1cmUobW9uaXRvcik7DQotCX0NCi0JDQotCXB1YmxpYyBTdHJpbmcgZ2V0RmFzdExhYmVsKCkgew0KLQkJcmV0dXJuIGZlYXR1cmVSZWYuZ2V0VVJMKCkudG9TdHJpbmcoKTsNCi0JfQ0KLQkNCi0JcHVibGljIElTaXRlIGdldFNpdGUoKSB7DQotCQlyZXR1cm4gZmVhdHVyZVJlZi5nZXRTaXRlKCk7DQotCX0NCi0JDQotCXB1YmxpYyBVUkwgZ2V0VVJMKCkgew0KLQkJcmV0dXJuIGZlYXR1cmVSZWYuZ2V0VVJMKCk7DQotCX0NCi0JDQotCXB1YmxpYyBib29sZWFuIGlzT3B0aW9uYWwoKSB7DQotCQlyZXR1cm4gZmVhdHVyZVJlZiBpbnN0YW5jZW9mIElJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UgPyANCi0JCQkoKElJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UpZmVhdHVyZVJlZikuaXNPcHRpb25hbCgpOmZhbHNlOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0b3VjaEluY2x1ZGVkRmVhdHVyZXMoSVJ1bm5hYmxlQ29udGV4dCBjb250ZXh0KSB7DQotCQlpZiAodG91Y2hlZCkgcmV0dXJuOw0KLQkJZmluYWwgSUZlYXR1cmVSZWZlcmVuY2UgW10gaW5jbHVkZWQ7DQotCQkNCi0JCXRyeSB7DQotCQkJaW5jbHVkZWQgPSAJZ2V0RmVhdHVyZShudWxsKS5nZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCk7DQotCQl9DQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7DQotCQkJcmV0dXJuOw0KLQkJfQ0KLQkJaWYgKGluY2x1ZGVkLmxlbmd0aCA9PSAwKSByZXR1cm47DQotCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3AgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzICgpIHsNCi0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7DQotCQkJCW1vbml0b3IuYmVnaW5UYXNrKFVwZGF0ZVVJLmdldFN0cmluZygiU2l0ZUJvb2ttYXJrLmRvd25sb2FkaW5nIiksIGluY2x1ZGVkLmxlbmd0aCk7DQotCQkJCWZvciAoaW50IGk9MDsgaTxpbmNsdWRlZC5sZW5ndGg7IGkrKykgew0KLQkJCQkJSUZlYXR1cmVSZWZlcmVuY2UgcmVmID0gaW5jbHVkZWRbaV07DQotCQkJCQl0cnkgew0KLQkJCQkJCW1vbml0b3Iuc3ViVGFzayhyZWYuZ2V0VVJMKCkudG9TdHJpbmcoKSk7DQotCQkJCQkJcmVmLmdldEZlYXR1cmUobmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxKSk7DQotCQkJCQkJLy9tb25pdG9yLndvcmtlZCgxKTsNCi0JCQkJCX0NCi0JCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCQltb25pdG9yLmRvbmUoKTsNCi0JCQl9DQotCQl9Ow0KLQkJdHJ5IHsNCi0JCQljb250ZXh0LnJ1bih0cnVlLCBmYWxzZSwgb3ApOw0KLQkJCXRvdWNoZWQ9dHJ1ZTsNCi0JCX0NCi0JCWNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsNCi0JCX0NCi0JCWNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7DQotCQl9DQotCX0NCi0NCi0JcHVibGljIElGZWF0dXJlQWRhcHRlcltdIGdldEluY2x1ZGVkRmVhdHVyZXMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7DQotCQl0cnkgew0KLQkJCUlGZWF0dXJlUmVmZXJlbmNlW10gaW5jbHVkZWQgPQ0KLQkJCQlnZXRGZWF0dXJlKG1vbml0b3IpLmdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKTsNCi0JCQlGZWF0dXJlUmVmZXJlbmNlQWRhcHRlcltdIHJlc3VsdCA9DQotCQkJCW5ldyBGZWF0dXJlUmVmZXJlbmNlQWRhcHRlcltpbmNsdWRlZC5sZW5ndGhdOw0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5jbHVkZWQubGVuZ3RoOyBpKyspIHsNCi0JCQkJcmVzdWx0W2ldID0gbmV3IEZlYXR1cmVSZWZlcmVuY2VBZGFwdGVyKGluY2x1ZGVkW2ldKTsNCi0JCQl9DQotCQkJcmV0dXJuIHJlc3VsdDsNCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgew0KLQkJCXJldHVybiBuZXcgSUZlYXR1cmVBZGFwdGVyWzBdOw0KLQkJfQ0KLQl9DQotDQotCXB1YmxpYyBJRmVhdHVyZVJlZmVyZW5jZSBnZXRGZWF0dXJlUmVmZXJlbmNlKCkgew0KLQkJcmV0dXJuIGZlYXR1cmVSZWY7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL0lDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9JQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViN2M0MmEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL0lDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbDsNCi0NCi0NCi0vKioNCi0gKiBAdmVyc2lvbiAJMS4wDQotICogQGF1dGhvcg0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlciBleHRlbmRzIElDb25maWd1cmVkU2l0ZUNvbnRleHQgew0KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbmZpZ3VyZWQoKTsNCi0JcHVibGljIGJvb2xlYW4gaXNVcGRhdGVkKCk7DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9JQ29uZmlndXJlZFNpdGVBZGFwdGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvSUNvbmZpZ3VyZWRTaXRlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWUyNzBkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9JQ29uZmlndXJlZFNpdGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbDsKLQotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29uZmlndXJlZFNpdGVBZGFwdGVyIGV4dGVuZHMgSUNvbmZpZ3VyZWRTaXRlQ29udGV4dCB7Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvSUNvbmZpZ3VyZWRTaXRlQ29udGV4dC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL0lDb25maWd1cmVkU2l0ZUNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdlMjc4Yi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvSUNvbmZpZ3VyZWRTaXRlQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOwotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29uZmlndXJlZFNpdGVDb250ZXh0IHsKLQlwdWJsaWMgSUluc3RhbGxDb25maWd1cmF0aW9uIGdldEluc3RhbGxDb25maWd1cmF0aW9uKCk7Ci0JcHVibGljIElDb25maWd1cmVkU2l0ZSBnZXRDb25maWd1cmVkU2l0ZSgpOwotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL0lGZWF0dXJlQWRhcHRlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL0lGZWF0dXJlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzgzMTI2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9JRmVhdHVyZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbDsNCi0NCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQotDQotLyoqDQotICogQHZlcnNpb24gCTEuMA0KLSAqIEBhdXRob3INCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElGZWF0dXJlQWRhcHRlciB7DQotCXB1YmxpYyBVUkwgZ2V0VVJMKCk7DQotCXB1YmxpYyBJU2l0ZSBnZXRTaXRlKCk7DQotCXB1YmxpYyBJRmVhdHVyZSBnZXRGZWF0dXJlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb247DQotCXB1YmxpYyBJRmVhdHVyZUFkYXB0ZXIgW10gZ2V0SW5jbHVkZWRGZWF0dXJlcyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOw0KLQlwdWJsaWMgYm9vbGVhbiBoYXNJbmNsdWRlZEZlYXR1cmVzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcik7DQotCXB1YmxpYyBib29sZWFuIGlzSW5jbHVkZWQoKTsNCi0JcHVibGljIGJvb2xlYW4gaXNPcHRpb25hbCgpOw0KLQlwdWJsaWMgU3RyaW5nIGdldEZhc3RMYWJlbCgpOw0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvSVNpdGVBZGFwdGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvSVNpdGVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlYmRmNmQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL0lTaXRlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVNpdGU7DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi0NCi1wdWJsaWMgaW50ZXJmYWNlIElTaXRlQWRhcHRlciB7DQotCQ0KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCk7DQotCXB1YmxpYyBVUkwgZ2V0VVJMKCk7DQotCXB1YmxpYyBJU2l0ZSBnZXRTaXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcik7DQotDQotfQ0KLQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9JVXBkYXRlTW9kZWxDaGFuZ2VkTGlzdGVuZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9JVXBkYXRlTW9kZWxDaGFuZ2VkTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc2ZmU0MC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvSVVwZGF0ZU1vZGVsQ2hhbmdlZExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWw7DQotDQotcHVibGljIGludGVyZmFjZSBJVXBkYXRlTW9kZWxDaGFuZ2VkTGlzdGVuZXIgew0KLQlwdWJsaWMgdm9pZCBvYmplY3RzQWRkZWQoT2JqZWN0IHBhcmVudCwgT2JqZWN0IFtdIGNoaWxkcmVuKTsNCi0JcHVibGljIHZvaWQgb2JqZWN0c1JlbW92ZWQoT2JqZWN0IHBhcmVudCwgT2JqZWN0IFtdIGNoaWxkcmVuKTsNCi0JcHVibGljIHZvaWQgb2JqZWN0Q2hhbmdlZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpOw0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvTWlzc2luZ0ZlYXR1cmUuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9NaXNzaW5nRmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmE4ZjYyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9NaXNzaW5nRmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbDsNCi0NCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuSW5zdGFsbEFib3J0ZWRFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSTsNCi0NCi1wdWJsaWMgY2xhc3MgTWlzc2luZ0ZlYXR1cmUgaW1wbGVtZW50cyBJRmVhdHVyZSB7DQotDQotCXByaXZhdGUgVVJMIHVybDsNCi0JcHJpdmF0ZSBJU2l0ZSBzaXRlOw0KLQlwcml2YXRlIElGZWF0dXJlUmVmZXJlbmNlIHJlZmVyZW5jZTsNCi0JcHJpdmF0ZSBJRmVhdHVyZSBwYXJlbnQ7DQotCXByaXZhdGUgSVVSTEVudHJ5IGRlc2M7DQotCXByaXZhdGUgVmVyc2lvbmVkSWRlbnRpZmllciBpZCA9IG5ldyBWZXJzaW9uZWRJZGVudGlmaWVyKFVwZGF0ZVVJLmdldFN0cmluZygiTWlzc2luZ0ZlYXR1cmUuaWQiKSwgIjAuMC4wIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQlwdWJsaWMgTWlzc2luZ0ZlYXR1cmUoSVNpdGUgc2l0ZSwgVVJMIHVybCkgew0KLQkJdGhpcy5zaXRlID0gc2l0ZTsNCi0JCXRoaXMudXJsID0gdXJsOw0KLQkJZGVzYyA9IG5ldyBJVVJMRW50cnkoKSB7DQotCQkJcHVibGljIFVSTCBnZXRVUkwoKSB7DQotCQkJCXJldHVybiBudWxsOw0KLQkJCX0NCi0JCQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb24oKSB7DQotCQkJCXJldHVybiBVcGRhdGVVSS5nZXRTdHJpbmcoIk1pc3NpbmdGZWF0dXJlLmRlc2MudW5rbm93biIpOyAvLyROT04tTkxTLTEkDQotCQkJfQ0KLQkJCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBrZXkpIHsNCi0JCQkJcmV0dXJuIG51bGw7DQotCQkJfQ0KLQkJCXB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsNCi0JCQkJcmV0dXJuIElVUkxFbnRyeS5VUERBVEVfU0lURTsNCi0JCQl9DQotCQl9Ow0KLQl9DQotCXB1YmxpYyBNaXNzaW5nRmVhdHVyZShJRmVhdHVyZVJlZmVyZW5jZSByZWYpIHsNCi0JCXRoaXMobnVsbCwgcmVmKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgTWlzc2luZ0ZlYXR1cmUoSUZlYXR1cmUgcGFyZW50LCBJRmVhdHVyZVJlZmVyZW5jZSByZWYpIHsNCi0JCXRoaXMocmVmLmdldFNpdGUoKSwgcmVmLmdldFVSTCgpKTsNCi0JCXRoaXMucmVmZXJlbmNlID0gcmVmOw0KLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7DQotDQotCQlpZiAoaXNPcHRpb25hbCgpKSB7DQotCQkJZGVzYyA9IG5ldyBJVVJMRW50cnkoKSB7DQotCQkJCXB1YmxpYyBVUkwgZ2V0VVJMKCkgew0KLQkJCQkJcmV0dXJuIG51bGw7DQotCQkJCX0NCi0JCQkJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uKCkgew0KLQkJCQkJcmV0dXJuIFVwZGF0ZVVJLmdldFN0cmluZygiTWlzc2luZ0ZlYXR1cmUuZGVzYy5vcHRpb25hbCIpOyAvLyROT04tTkxTLTEkDQotCQkJCX0NCi0JCQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGtleSkgew0KLQkJCQkJcmV0dXJuIG51bGw7DQotCQkJCX0NCi0JCQkJcHVibGljIGludCBnZXRUeXBlKCkgew0KLQkJCQkJcmV0dXJuIElVUkxFbnRyeS5VUERBVEVfU0lURTsNCi0JCQkJfQ0KLQkJCX07DQotCQl9DQotCX0NCi0NCi0JcHVibGljIGJvb2xlYW4gaXNPcHRpb25hbCgpIHsNCi0JCXJldHVybiByZWZlcmVuY2UgIT0gbnVsbA0KLQkJCSYmIHJlZmVyZW5jZSBpbnN0YW5jZW9mIElJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UNCi0JCQkmJiAoKElJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UpIHJlZmVyZW5jZSkuaXNPcHRpb25hbCgpOw0KLQl9DQotDQotCXB1YmxpYyBJRmVhdHVyZSBnZXRQYXJlbnQoKSB7DQotCQlyZXR1cm4gcGFyZW50Ow0KLQl9DQotDQotCXB1YmxpYyBVUkwgZ2V0T3JpZ2luYXRpbmdTaXRlVVJMKCkgew0KLQkJVmVyc2lvbmVkSWRlbnRpZmllciB2aWQgPSBnZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7DQotCQlpZiAodmlkID09IG51bGwpDQotCQkJcmV0dXJuIG51bGw7DQotCQlTdHJpbmcga2V5ID0gdmlkLmdldElkZW50aWZpZXIoKTsNCi0JCXJldHVybiBVcGRhdGVVSS5nZXRPcmlnaW5hdGluZ1VSTChrZXkpOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUZlYXR1cmUjZ2V0SWRlbnRpZmllcigpDQotCSAqLw0KLQlwdWJsaWMgVmVyc2lvbmVkSWRlbnRpZmllciBnZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkgew0KLQkJaWYgKHJlZmVyZW5jZSAhPSBudWxsKSB7DQotCQkJdHJ5IHsNCi0JCQkJcmV0dXJuIHJlZmVyZW5jZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7DQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIGlkOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUZlYXR1cmUjZ2V0U2l0ZSgpDQotCSAqLw0KLQlwdWJsaWMgSVNpdGUgZ2V0U2l0ZSgpIHsNCi0JCXJldHVybiBzaXRlOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUZlYXR1cmUjZ2V0TGFiZWwoKQ0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsNCi0JCWlmIChyZWZlcmVuY2UgIT0gbnVsbA0KLQkJCSYmIHJlZmVyZW5jZSBpbnN0YW5jZW9mIElJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UpIHsNCi0JCQlTdHJpbmcgbmFtZSA9ICgoSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZSkgcmVmZXJlbmNlKS5nZXROYW1lKCk7DQotCQkJaWYgKG5hbWUgIT0gbnVsbCkNCi0JCQkJcmV0dXJuIG5hbWU7DQotCQl9DQotCQlyZXR1cm4gdXJsLnRvU3RyaW5nKCk7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJRmVhdHVyZSNnZXRVUkwoKQ0KLQkgKi8NCi0JcHVibGljIFVSTCBnZXRVUkwoKSB7DQotCQlyZXR1cm4gdXJsOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUZlYXR1cmUjZ2V0VXBkYXRlSW5mbygpDQotCSAqLw0KLQlwdWJsaWMgSVVSTEVudHJ5IGdldFVwZGF0ZVNpdGVFbnRyeSgpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUZlYXR1cmUjZ2V0RGlzY292ZXJ5SW5mb3MoKQ0KLQkgKi8NCi0JcHVibGljIElVUkxFbnRyeVtdIGdldERpc2NvdmVyeVNpdGVFbnRyaWVzKCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJRmVhdHVyZSNnZXRQcm92aWRlcigpDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldFByb3ZpZGVyKCkgew0KLQkJcmV0dXJuIFVwZGF0ZVVJLmdldFN0cmluZygiTWlzc2luZ0ZlYXR1cmUucHJvdmlkZXIiKTsgLy8kTk9OLU5MUy0xJA0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUZlYXR1cmUjZ2V0RGVzY3JpcHRpb24oKQ0KLQkgKi8NCi0JcHVibGljIElVUkxFbnRyeSBnZXREZXNjcmlwdGlvbigpIHsNCi0JCXJldHVybiBkZXNjOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUZlYXR1cmUjZ2V0Q29weXJpZ2h0KCkNCi0JICovDQotCXB1YmxpYyBJVVJMRW50cnkgZ2V0Q29weXJpZ2h0KCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJRmVhdHVyZSNnZXRMaWNlbnNlKCkNCi0JICovDQotCXB1YmxpYyBJVVJMRW50cnkgZ2V0TGljZW5zZSgpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUZlYXR1cmUjZ2V0T1MoKQ0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRPUygpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUZlYXR1cmUjZ2V0V1MoKQ0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRXUygpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUZlYXR1cmUjZ2V0TkwoKQ0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXROTCgpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUZlYXR1cmUjZ2V0QXJjaCgpDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldE9TQXJjaCgpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUZlYXR1cmUjZ2V0SW1hZ2UoKQ0KLQkgKi8NCi0JcHVibGljIFVSTCBnZXRJbWFnZSgpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUZlYXR1cmUjZ2V0SW1wb3J0cygpDQotCSAqLw0KLQlwdWJsaWMgSUltcG9ydFtdIGdldEltcG9ydHMoKSB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElGZWF0dXJlI2dldEFyY2hpdmVzKCkNCi0JICovDQotCXB1YmxpYyBTdHJpbmdbXSBnZXRBcmNoaXZlcygpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUZlYXR1cmUjZ2V0RGF0YUVudHJpZXMoKQ0KLQkgKi8NCi0JcHVibGljIElOb25QbHVnaW5FbnRyeVtdIGdldE5vblBsdWdpbkVudHJpZXMoKSB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElGZWF0dXJlI2FkZERhdGFFbnRyeShJRGF0YUVudHJ5KQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgYWRkTm9uUGx1Z2luRW50cnkoSU5vblBsdWdpbkVudHJ5IGRhdGFFbnRyeSkgew0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUZlYXR1cmUjZ2V0RG93bmxvYWRTaXplKCkNCi0JICovDQotCXB1YmxpYyBsb25nIGdldERvd25sb2FkU2l6ZSgpIHsNCi0JCXJldHVybiAwOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUZlYXR1cmUjZ2V0SW5zdGFsbFNpemUoSVNpdGUpDQotCSAqLw0KLQlwdWJsaWMgbG9uZyBnZXRJbnN0YWxsU2l6ZSgpIHsNCi0JCXJldHVybiAwOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUZlYXR1cmUjaXNQcmltYXJ5KCkNCi0JICovDQotCXB1YmxpYyBib29sZWFuIGlzUHJpbWFyeSgpIHsNCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElGZWF0dXJlI2dldEFwcGxpY2F0aW9uKCkNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0QXBwbGljYXRpb24oKSB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElQbHVnaW5Db250YWluZXIjZ2V0UGx1Z2luRW50cmllcygpDQotCSAqLw0KLQlwdWJsaWMgSVBsdWdpbkVudHJ5W10gZ2V0UGx1Z2luRW50cmllcygpIHsNCi0JCXJldHVybiBuZXcgSVBsdWdpbkVudHJ5WzBdOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSVBsdWdpbkNvbnRhaW5lciNnZXRQbHVnaW5FbnRyeUNvdW50KCkNCi0JICovDQotCXB1YmxpYyBpbnQgZ2V0UGx1Z2luRW50cnlDb3VudCgpIHsNCi0JCXJldHVybiAwOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSVBsdWdpbkNvbnRhaW5lciNnZXREb3dubG9hZFNpemUoSVBsdWdpbkVudHJ5KQ0KLQkgKi8NCi0JcHVibGljIGxvbmcgZ2V0RG93bmxvYWRTaXplKElQbHVnaW5FbnRyeSBlbnRyeSkgew0KLQkJcmV0dXJuIDA7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJUGx1Z2luQ29udGFpbmVyI2dldEluc3RhbGxTaXplKElQbHVnaW5FbnRyeSkNCi0JICovDQotCXB1YmxpYyBsb25nIGdldEluc3RhbGxTaXplKElQbHVnaW5FbnRyeSBlbnRyeSkgew0KLQkJcmV0dXJuIDA7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJUGx1Z2luQ29udGFpbmVyI2FkZFBsdWdpbkVudHJ5KElQbHVnaW5FbnRyeSkNCi0JICovDQotCXB1YmxpYyB2b2lkIGFkZFBsdWdpbkVudHJ5KElQbHVnaW5FbnRyeSBwbHVnaW5FbnRyeSkgew0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSVBsdWdpbkNvbnRhaW5lciNzdG9yZShJUGx1Z2luRW50cnksIFN0cmluZywgSW5wdXRTdHJlYW0pDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzdG9yZShJUGx1Z2luRW50cnkgZW50cnksIFN0cmluZyBuYW1lLCBJbnB1dFN0cmVhbSBpblN0cmVhbSkNCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElBZGFwdGFibGUjZ2V0QWRhcHRlcihDbGFzcykNCi0JICovDQotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElQbHVnaW5Db250YWluZXIjcmVtb3ZlKElQbHVnaW5FbnRyeSkNCi0JICovDQotCXB1YmxpYyB2b2lkIHJlbW92ZShJUGx1Z2luRW50cnkgZW50cnkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElGZWF0dXJlI3NldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoSUZlYXR1cmVDb250ZW50UHJvdmlkZXIpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKElGZWF0dXJlQ29udGVudFByb3ZpZGVyIGZlYXR1cmVDb250ZW50UHJvdmlkZXIpIHsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElGZWF0dXJlI2dldEZlYXR1cmVDb250ZW50Q29uc3VtZXIoKQ0KLQkgKi8NCi0JcHVibGljIElGZWF0dXJlQ29udGVudENvbnN1bWVyIGdldEZlYXR1cmVDb250ZW50Q29uc3VtZXIoKQ0KLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJRmVhdHVyZSNzZXRTaXRlKElTaXRlKQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0U2l0ZShJU2l0ZSBzaXRlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQl0aGlzLnNpdGUgPSBzaXRlOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUZlYXR1cmUjZ2V0RmVhdHVyZUNvbnRlbnRQcm92aWRlcigpDQotCSAqLw0KLQlwdWJsaWMgSUZlYXR1cmVDb250ZW50UHJvdmlkZXIgZ2V0RmVhdHVyZUNvbnRlbnRQcm92aWRlcigpDQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElGZWF0dXJlI2luc3RhbGwoSUZlYXR1cmUsSVZlcmlmaWVyLCBJUHJvZ3Jlc3NNb25pdG9yKQ0KLQkgKi8NCi0JcHVibGljIElGZWF0dXJlUmVmZXJlbmNlIGluc3RhbGwoDQotCQlJRmVhdHVyZSB0YXJnZXRGZWF0dXJlLA0KLQkJSVZlcmlmaWNhdGlvbkxpc3RlbmVyIHZlcmlmaWNhdGlvbkxpc3RlbmVyLA0KLQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQ0KLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZSNpbnN0YWxsKElGZWF0dXJlLCBJRmVhdHVyZVJlZmVyZW5jZVtdLCBJVmVyaWZpY2F0aW9uTGlzdGVuZXIsIElQcm9ncmVzc01vbml0b3IpDQotCSAqLw0KLQlwdWJsaWMgSUZlYXR1cmVSZWZlcmVuY2UgaW5zdGFsbCgNCi0JCUlGZWF0dXJlIHRhcmdldEZlYXR1cmUsDQotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIG9wdGlvbmFsRmVhdHVyZXMsDQotCQlJVmVyaWZpY2F0aW9uTGlzdGVuZXIgdmVyaWZpY2F0aW9uTGlzdGVuZXIsDQotCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpDQotCQl0aHJvd3MgSW5zdGFsbEFib3J0ZWRFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JLyoNCi0JICogQHNlZSBJRmVhdHVyZSNyZW1vdmUoSVByb2dyZXNzTW9uaXRvcikNCi0JICovDQotCXB1YmxpYyB2b2lkIHJlbW92ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElQbHVnaW5Db250YWluZXIjcmVtb3ZlKElQbHVnaW5FbnRyeSwgSVByb2dyZXNzTW9uaXRvcikNCi0JICovDQotCXB1YmxpYyB2b2lkIHJlbW92ZShJUGx1Z2luRW50cnkgZW50cnksIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikNCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElGZWF0dXJlI2dldE5vblBsdWdpbkVudHJ5Q291bnQoKQ0KLQkgKi8NCi0JcHVibGljIGludCBnZXROb25QbHVnaW5FbnRyeUNvdW50KCkgew0KLQkJcmV0dXJuIDA7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJRmVhdHVyZSNnZXRJbnN0YWxsSGFuZGxlckVudHJ5KCkNCi0JICovDQotCXB1YmxpYyBJSW5zdGFsbEhhbmRsZXJFbnRyeSBnZXRJbnN0YWxsSGFuZGxlckVudHJ5KCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JLyoNCi0JICogQHNlZSBJRmVhdHVyZSNnZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCkNCi0JICovDQotCXB1YmxpYyBJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlW10gZ2V0SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpDQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlyZXR1cm4gbmV3IElJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VbMF07DQotCX0NCi0NCi0JLyoqDQotCSAqIEBzZWUgSUZlYXR1cmUjZ2V0QWZmaW5pdHlGZWF0dXJlKCkNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0QWZmaW5pdHlGZWF0dXJlKCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JLyoqDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmUjZ2V0UmF3SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpDQotCSAqLw0KLQlwdWJsaWMgSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZVtdIGdldFJhd0luY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKQ0KLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJcmV0dXJuIGdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZSNnZXRSYXdOb25QbHVnaW5FbnRyaWVzKCkNCi0JICovDQotCXB1YmxpYyBJTm9uUGx1Z2luRW50cnlbXSBnZXRSYXdOb25QbHVnaW5FbnRyaWVzKCkgew0KLQkJcmV0dXJuIGdldE5vblBsdWdpbkVudHJpZXMoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZSNnZXRSYXdQbHVnaW5FbnRyaWVzKCkNCi0JICovDQotCXB1YmxpYyBJUGx1Z2luRW50cnlbXSBnZXRSYXdQbHVnaW5FbnRyaWVzKCkgew0KLQkJcmV0dXJuIGdldFBsdWdpbkVudHJpZXMoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZSNnZXRQcmltYXJ5UGx1Z2luSUQoKQ0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRQcmltYXJ5UGx1Z2luSUQoKSB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZSNnZXRSYXdJbXBvcnRzKCkNCi0JICovDQotCXB1YmxpYyBJSW1wb3J0W10gZ2V0UmF3SW1wb3J0cygpIHsNCi0JCXJldHVybiBuZXcgSUltcG9ydFswXTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZSNpc1BhdGNoKCkNCi0JICovDQotCXB1YmxpYyBib29sZWFuIGlzUGF0Y2goKSB7DQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0JDQotCXB1YmxpYyBib29sZWFuIGlzRXhjbHVzaXZlKCkgew0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9Nb25pdG9yQWRhcHRlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL01vbml0b3JBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjMjZiMzQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL01vbml0b3JBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWw7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KLQ0KLXB1YmxpYyBjbGFzcyBNb25pdG9yQWRhcHRlciBpbXBsZW1lbnRzIElQcm9ncmVzc01vbml0b3Igew0KLQ0KLQkvKioNCi0JICogQHNlZSBJUHJvZ3Jlc3NNb25pdG9yI2JlZ2luVGFzayhTdHJpbmcsIGludCkNCi0JICovDQotCXB1YmxpYyB2b2lkIGJlZ2luVGFzayhTdHJpbmcgdGFza05hbWUsIGludCBjb3VudCkgew0KLQl9DQotDQotDQotCS8qKg0KLQkgKiBAc2VlIElQcm9ncmVzc01vbml0b3IjZG9uZSgpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBkb25lKCkgew0KLQl9DQotDQotDQotCS8qKg0KLQkgKiBAc2VlIElQcm9ncmVzc01vbml0b3IjaW50ZXJuYWxXb3JrZWQoZG91YmxlKQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgaW50ZXJuYWxXb3JrZWQoZG91YmxlIGFyZzApIHsNCi0JfQ0KLQ0KLQ0KLQkvKioNCi0JICogQHNlZSBJUHJvZ3Jlc3NNb25pdG9yI2lzQ2FuY2VsZWQoKQ0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gaXNDYW5jZWxlZCgpIHsNCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQ0KLQ0KLQkvKioNCi0JICogQHNlZSBJUHJvZ3Jlc3NNb25pdG9yI3NldENhbmNlbGVkKGJvb2xlYW4pDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRDYW5jZWxlZChib29sZWFuIGFyZzApIHsNCi0JfQ0KLQ0KLQ0KLQkvKioNCi0JICogQHNlZSBJUHJvZ3Jlc3NNb25pdG9yI3NldFRhc2tOYW1lKFN0cmluZykNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFRhc2tOYW1lKFN0cmluZyBhcmcwKSB7DQotCX0NCi0NCi0NCi0JLyoqDQotCSAqIEBzZWUgSVByb2dyZXNzTW9uaXRvciNzdWJUYXNrKFN0cmluZykNCi0JICovDQotCXB1YmxpYyB2b2lkIHN1YlRhc2soU3RyaW5nIGFyZzApIHsNCi0JfQ0KLQ0KLQ0KLQkvKioNCi0JICogQHNlZSBJUHJvZ3Jlc3NNb25pdG9yI3dvcmtlZChpbnQpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCB3b3JrZWQoaW50IGFyZzApIHsNCi0JfQ0KLQ0KLQ0KLX0NCi0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvTXlDb21wdXRlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL015Q29tcHV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQyZGMzNC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvTXlDb21wdXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbDsNCi0NCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLklXb3JrYmVuY2hBZGFwdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JU2l0ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5zZWFyY2guKjsNCi0NCi1wdWJsaWMgY2xhc3MgTXlDb21wdXRlciBleHRlbmRzIFVJTW9kZWxPYmplY3QgaW1wbGVtZW50cyBJV29ya2JlbmNoQWRhcHRlciB7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTEFCRUwgPSAiTXlDb21wdXRlci5sYWJlbCI7DQotCXByaXZhdGUgT2JqZWN0W10gY2hpbGRyZW47DQotCXB1YmxpYyBNeUNvbXB1dGVyKCkgew0KLQl9DQotDQotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7DQotCQlpZiAoYWRhcHRlci5lcXVhbHMoSVdvcmtiZW5jaEFkYXB0ZXIuY2xhc3MpKSB7DQotCQkJcmV0dXJuIHRoaXM7DQotCQl9DQotCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihhZGFwdGVyKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7DQotCQlyZXR1cm4gVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9MQUJFTCk7DQotCX0NCi0NCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCi0JCXJldHVybiBnZXROYW1lKCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIEBzZWUgSVdvcmtiZW5jaEFkYXB0ZXIjZ2V0Q2hpbGRyZW4oT2JqZWN0KQ0KLQkgKi8NCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnQpIHsNCi0JCUJ1c3lJbmRpY2F0b3INCi0JCQkuc2hvd1doaWxlKA0KLQkJCQlVcGRhdGVVSS5nZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpLmdldERpc3BsYXkoKSwNCi0JCQkJbmV3IFJ1bm5hYmxlKCkgew0KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCi0JCQkJSVZvbHVtZVtdIHZvbHVtZXMgPSBMb2NhbFN5c3RlbUluZm8uZ2V0Vm9sdW1lcygpOw0KLQkJCQlpZiAodm9sdW1lcyAhPSBudWxsICYmIHZvbHVtZXMubGVuZ3RoID4gMCkgew0KLQkJCQkJY2hpbGRyZW4gPSBuZXcgTXlDb21wdXRlckRpcmVjdG9yeVt2b2x1bWVzLmxlbmd0aF07DQotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7DQotCQkJCQkJY2hpbGRyZW5baV0gPQ0KLQkJCQkJCQluZXcgTXlDb21wdXRlckRpcmVjdG9yeSgNCi0JCQkJCQkJCU15Q29tcHV0ZXIudGhpcywNCi0JCQkJCQkJCXZvbHVtZXNbaV0uZ2V0RmlsZSgpLA0KLQkJCQkJCQkJdm9sdW1lc1tpXSk7DQotCQkJCQl9DQotCQkJCX0gZWxzZQ0KLQkJCQkJY2hpbGRyZW4gPSBuZXcgT2JqZWN0WzBdOw0KLQkJCX0NCi0JCX0pOw0KLQkJcmV0dXJuIGNoaWxkcmVuOw0KLQl9DQotDQotCS8qKg0KLQkgKiBAc2VlIElXb3JrYmVuY2hBZGFwdGVyI2dldEltYWdlRGVzY3JpcHRvcihPYmplY3QpDQotCSAqLw0KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihPYmplY3Qgb2JqKSB7DQotCQlyZXR1cm4gVXBkYXRlVUlJbWFnZXMuREVTQ19DT01QVVRFUl9PQko7DQotCX0NCi0NCi0JLyoqDQotCSAqIEBzZWUgSVdvcmtiZW5jaEFkYXB0ZXIjZ2V0TGFiZWwoT2JqZWN0KQ0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbChPYmplY3Qgb2JqKSB7DQotCQlyZXR1cm4gZ2V0TmFtZSgpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBAc2VlIElXb3JrYmVuY2hBZGFwdGVyI2dldFBhcmVudChPYmplY3QpDQotCSAqLw0KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgYXJnMCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgY29sbGVjdFNpdGVzKA0KLQkJVmVjdG9yIHNpdGVzLA0KLQkJTXlDb21wdXRlclNlYXJjaFNldHRpbmdzIHNldHRpbmdzLA0KLQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7DQotCQlJVm9sdW1lW10gdm9sdW1lcyA9IExvY2FsU3lzdGVtSW5mby5nZXRWb2x1bWVzKCk7DQotCQlmb3IgKGludCBpID0gMDsgaSA8IHZvbHVtZXMubGVuZ3RoOyBpKyspIHsNCi0JCQlGaWxlIGRyaXZlID0gdm9sdW1lc1tpXS5nZXRGaWxlKCk7DQotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQ0KLQkJCQlyZXR1cm47DQotCQkJRHJpdmVTZWFyY2hTZXR0aW5ncyBkcyA9IHNldHRpbmdzLmdldERyaXZlU2V0dGluZ3MoZHJpdmUuZ2V0UGF0aCgpKTsNCi0JCQlpZiAoZHMuaXNDaGVja2VkKCkpIHsNCi0JCQkJY29sbGVjdFNpdGVzKGRyaXZlLCB0cnVlLCBzaXRlcywgZHMsIG1vbml0b3IpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgY29sbGVjdFNpdGVzKA0KLQkJRmlsZSBkaXIsDQotCQlib29sZWFuIHJvb3QsDQotCQlWZWN0b3Igc2l0ZXMsDQotCQlEcml2ZVNlYXJjaFNldHRpbmdzIGRyaXZlU2V0dGluZ3MsDQotCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsNCi0JCQkNCi0JCWlmIChyb290KSB7DQotCQkJLy8gU2VlIGlmIHRoZSByb290IGl0c2VsZiBpcyB0aGUgc2l0ZS4NCi0JCQlTaXRlQm9va21hcmsgcm9vdFNpdGUgPSBNeUNvbXB1dGVyRGlyZWN0b3J5LmNyZWF0ZVNpdGUoZGlyLCB0cnVlKTsNCi0JCQlpZiAocm9vdFNpdGUhPW51bGwpIHsNCi0JCQkJc2l0ZXMuYWRkKHJvb3RTaXRlKTsNCi0JCQkJcmV0dXJuOw0KLQkJCX0NCi0JCX0NCi0NCi0JCUZpbGVbXSBjaGlsZHJlbiA9IGRpci5saXN0RmlsZXMoKTsNCi0JCWlmIChjaGlsZHJlbiA9PSBudWxsKQ0KLQkJCXJldHVybjsNCi0NCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsNCi0JCQlGaWxlIGNoaWxkID0gY2hpbGRyZW5baV07DQotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQ0KLQkJCQlyZXR1cm47DQotCQkJaWYgKGNoaWxkLmlzRGlyZWN0b3J5KCkpIHsNCi0JCQkJbW9uaXRvci5zdWJUYXNrKGNoaWxkLmdldFBhdGgoKSk7DQotCQkJCVNpdGVCb29rbWFyayBib29rbWFyayA9IE15Q29tcHV0ZXJEaXJlY3RvcnkuY3JlYXRlU2l0ZShjaGlsZCwgZmFsc2UpOw0KLQkJCQlpZiAoYm9va21hcmsgIT0gbnVsbCkgew0KLQkJCQkJSVNpdGUgc2l0ZSA9IGJvb2ttYXJrLmdldFNpdGUoZmFsc2UsIG51bGwpOw0KLQkJCQkJaWYgKHNpdGUgIT0gbnVsbCkNCi0JCQkJCQlzaXRlcy5hZGQoYm9va21hcmspOw0KLQkJCQl9IGVsc2UNCi0JCQkJCWNvbGxlY3RTaXRlcyhjaGlsZCwgZmFsc2UsIHNpdGVzLCBkcml2ZVNldHRpbmdzLCBtb25pdG9yKTsNCi0JCQl9DQotCQl9DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL015Q29tcHV0ZXJEaXJlY3RvcnkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9NeUNvbXB1dGVyRGlyZWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyMTMxMjAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL015Q29tcHV0ZXJEaXJlY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWw7DQotDQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5JV29ya2JlbmNoQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJOw0KLQ0KLXB1YmxpYyBjbGFzcyBNeUNvbXB1dGVyRGlyZWN0b3J5DQotCWV4dGVuZHMgVUlNb2RlbE9iamVjdA0KLQlpbXBsZW1lbnRzIElXb3JrYmVuY2hBZGFwdGVyIHsNCi0JcHJpdmF0ZSBVSU1vZGVsT2JqZWN0IHBhcmVudDsNCi0JcHJpdmF0ZSBGaWxlIGZpbGU7DQotCXByaXZhdGUgSVZvbHVtZSB2b2x1bWU7DQotCU9iamVjdFtdIGNoaWxkcmVuOw0KLQ0KLQlwdWJsaWMgTXlDb21wdXRlckRpcmVjdG9yeSgNCi0JCVVJTW9kZWxPYmplY3QgcGFyZW50LA0KLQkJRmlsZSBmaWxlLA0KLQkJSVZvbHVtZSB2b2x1bWUpIHsNCi0JCXRoaXMucGFyZW50ID0gcGFyZW50Ow0KLQkJdGhpcy5maWxlID0gZmlsZTsNCi0JCXRoaXMudm9sdW1lID0gdm9sdW1lOw0KLQl9DQotDQotCXB1YmxpYyBNeUNvbXB1dGVyRGlyZWN0b3J5KFVJTW9kZWxPYmplY3QgcGFyZW50LCBGaWxlIGZpbGUpIHsNCi0JCXRoaXMocGFyZW50LCBmaWxlLCBudWxsKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgew0KLQkJaWYgKGFkYXB0ZXIuZXF1YWxzKElXb3JrYmVuY2hBZGFwdGVyLmNsYXNzKSkgew0KLQkJCXJldHVybiB0aGlzOw0KLQkJfQ0KLQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoYWRhcHRlcik7DQotCX0NCi0NCi0JcHVibGljIElWb2x1bWUgZ2V0Vm9sdW1lKCkgew0KLQkJcmV0dXJuIHZvbHVtZTsNCi0JfQ0KLQkNCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgew0KLQkJcmV0dXJuIGZpbGUuZ2V0UGF0aCgpOw0KLQl9DQotDQotCXB1YmxpYyBGaWxlIGdldEZpbGUoKSB7DQotCQlyZXR1cm4gZmlsZTsNCi0JfQ0KLQ0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KLQkJcmV0dXJuIGdldE5hbWUoKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgcGFyZW50KSB7DQotCQlpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7DQotCQkJZmluYWwgYm9vbGVhbltdIHJlc3VsdCA9IG5ldyBib29sZWFuWzFdOw0KLQkJCUJ1c3lJbmRpY2F0b3INCi0JCQkJLnNob3dXaGlsZSgNCi0JCQkJCVVwZGF0ZVVJLmdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCkuZ2V0RGlzcGxheSgpLA0KLQkJCQkJbmV3IFJ1bm5hYmxlKCkgew0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7DQotCQkJCQlGaWxlW10gY2hpbGRyZW4gPSBmaWxlLmxpc3RGaWxlcygpOw0KLQkJCQkJcmVzdWx0WzBdID0gY2hpbGRyZW4gIT0gbnVsbCAmJiBjaGlsZHJlbi5sZW5ndGggPiAwOw0KLQkJCQl9DQotCQkJfSk7DQotCQkJcmV0dXJuIHJlc3VsdFswXTsNCi0JCX0NCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHNlZSBJV29ya2JlbmNoQWRhcHRlciNnZXRDaGlsZHJlbihPYmplY3QpDQotCSAqLw0KLQ0KLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudCkgew0KLQkJQnVzeUluZGljYXRvcg0KLQkJCS5zaG93V2hpbGUoDQotCQkJCVVwZGF0ZVVJLmdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCkuZ2V0RGlzcGxheSgpLA0KLQkJCQluZXcgUnVubmFibGUoKSB7DQotCQkJcHVibGljIHZvaWQgcnVuKCkgew0KLQkJCQlGaWxlW10gZmlsZXMgPSBmaWxlLmxpc3RGaWxlcygpOw0KLQkJCQlpZiAoZmlsZXM9PW51bGwpIHsNCi0JCQkJCWNoaWxkcmVuID0gbmV3IE9iamVjdFswXTsNCi0JCQkJCXJldHVybjsNCi0JCQkJfQ0KLQkJCQkNCi0JCQkJaWYgKHZvbHVtZSE9bnVsbCkgew0KLQkJCQkJLy8gVGhpcyBpcyB2b2x1bWUuDQotCQkJCQkvLyBUZXN0IGlmIHRoZSB2b2x1bWUgaXRzZWxmIGlzIGEgc2l0ZQ0KLQkJCQkJU2l0ZUJvb2ttYXJrIHJvb3RTaXRlID0gY3JlYXRlU2l0ZShnZXRGaWxlKCksIHRydWUpOw0KLQkJCQkJaWYgKHJvb3RTaXRlICE9IG51bGwpIHsNCi0JCQkJCQljaGlsZHJlbiA9IG5ldyBPYmplY3RbMV07DQotCQkJCQkJY2hpbGRyZW5bMF0gPSByb290U2l0ZTsNCi0JCQkJCQlyZXR1cm47DQotCQkJCQl9DQotCQkJCX0NCi0NCi0JCQkJY2hpbGRyZW4gPSBuZXcgT2JqZWN0W2ZpbGVzLmxlbmd0aF07DQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsNCi0JCQkJCUZpbGUgZmlsZSA9IGZpbGVzW2ldOw0KLQ0KLQkJCQkJaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgew0KLQkJCQkJCVNpdGVCb29rbWFyayBzaXRlID0gY3JlYXRlU2l0ZShmaWxlLCBmYWxzZSk7DQotCQkJCQkJaWYgKHNpdGUgIT0gbnVsbCkNCi0JCQkJCQkJY2hpbGRyZW5baV0gPSBzaXRlOw0KLQkJCQkJCWVsc2UgaWYgKEV4dGVuc2lvblJvb3QuaXNFeHRlbnNpb25Sb290KGZpbGUpKSB7DQotCQkJCQkJCWNoaWxkcmVuW2ldID0gbmV3IEV4dGVuc2lvblJvb3QoTXlDb21wdXRlckRpcmVjdG9yeS50aGlzLCBmaWxlKTsNCi0JCQkJCQl9DQotCQkJCQkJZWxzZQ0KLQkJCQkJCQljaGlsZHJlbltpXSA9DQotCQkJCQkJCQluZXcgTXlDb21wdXRlckRpcmVjdG9yeSgNCi0JCQkJCQkJCQlNeUNvbXB1dGVyRGlyZWN0b3J5LnRoaXMsDQotCQkJCQkJCQkJZmlsZSk7DQotCQkJCQkJDQotCQkJCQl9IGVsc2Ugew0KLQkJCQkJCWNoaWxkcmVuW2ldID0NCi0JCQkJCQkJbmV3IE15Q29tcHV0ZXJGaWxlKE15Q29tcHV0ZXJEaXJlY3RvcnkudGhpcywgZmlsZSk7DQotCQkJCQl9DQotCQkJCX0NCi0JCQl9DQotCQl9KTsNCi0JCXJldHVybiBjaGlsZHJlbjsNCi0JfQ0KLQ0KLQlzdGF0aWMgU2l0ZUJvb2ttYXJrIGNyZWF0ZVNpdGUoRmlsZSBmaWxlLCBib29sZWFuIHJvb3QpIHsNCi0JCXRyeSB7DQotCQkJRmlsZSBzaXRlWE1MID0gbmV3IEZpbGUoZmlsZSwgInNpdGUueG1sIik7DQotCQkJaWYgKHNpdGVYTUwuZXhpc3RzKCkgPT0gZmFsc2UpDQotCQkJCXJldHVybiBudWxsOw0KLQkJCVVSTCB1cmwgPQ0KLQkJCQluZXcgVVJMKCJmaWxlOiIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpICsgRmlsZS5zZXBhcmF0b3IpOw0KLQkJCVN0cmluZyBzaXRlTmFtZSA9IHJvb3Q/ZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTpmaWxlLmdldE5hbWUoKTsNCi0JCQlTaXRlQm9va21hcmsgc2l0ZSA9IG5ldyBTaXRlQm9va21hcmsoc2l0ZU5hbWUsIHVybCwgZmFsc2UpOw0KLQkJCXNpdGUuc2V0VHlwZShTaXRlQm9va21hcmsuTE9DQUwpOw0KLQkJCXJldHVybiBzaXRlOw0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogQHNlZSBJV29ya2JlbmNoQWRhcHRlciNnZXRJbWFnZURlc2NyaXB0b3IoT2JqZWN0KQ0KLQkgKi8NCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoT2JqZWN0IG9iaikgew0KLQkJcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKA0KLQkJCUlTaGFyZWRJbWFnZXMuSU1HX09CSl9GT0xERVIpOw0KLQl9DQotDQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3Qgb2JqKSB7DQotCQlyZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKS5nZXRJbWFnZSgNCi0JCQlJU2hhcmVkSW1hZ2VzLklNR19PQkpfRk9MREVSKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHNlZSBJV29ya2JlbmNoQWRhcHRlciNnZXRMYWJlbChPYmplY3QpDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKE9iamVjdCBvYmopIHsNCi0JCXJldHVybiBmaWxlLmdldE5hbWUoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHNlZSBJV29ya2JlbmNoQWRhcHRlciNnZXRQYXJlbnQoT2JqZWN0KQ0KLQkgKi8NCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGFyZzApIHsNCi0JCXJldHVybiBwYXJlbnQ7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL015Q29tcHV0ZXJGaWxlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvTXlDb21wdXRlckZpbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ1YWY0My4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvTXlDb21wdXRlckZpbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbDsNCi0NCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLklXb3JrYmVuY2hBZGFwdGVyOw0KLQ0KLXB1YmxpYyBjbGFzcyBNeUNvbXB1dGVyRmlsZSBleHRlbmRzIFVJTW9kZWxPYmplY3QgaW1wbGVtZW50cyBJV29ya2JlbmNoQWRhcHRlciB7DQotCXByaXZhdGUgVUlNb2RlbE9iamVjdCBwYXJlbnQ7DQotCXByaXZhdGUgRmlsZSBmaWxlOw0KLQ0KLQlwdWJsaWMgTXlDb21wdXRlckZpbGUoVUlNb2RlbE9iamVjdCBwYXJlbnQsIEZpbGUgZmlsZSkgew0KLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7DQotCQl0aGlzLmZpbGUgPSBmaWxlOw0KLQl9DQotCQ0KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgew0KLQkJaWYgKGFkYXB0ZXIuZXF1YWxzKElXb3JrYmVuY2hBZGFwdGVyLmNsYXNzKSkgew0KLQkJCXJldHVybiB0aGlzOw0KLQkJfQ0KLQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoYWRhcHRlcik7DQotCX0NCi0JDQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsNCi0JCXJldHVybiBmaWxlLmdldE5hbWUoKTsNCi0JfQ0KLQkNCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCi0JCXJldHVybiBnZXROYW1lKCk7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBAc2VlIElXb3JrYmVuY2hBZGFwdGVyI2dldENoaWxkcmVuKE9iamVjdCkNCi0JICovDQotCQ0KLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudCkgew0KLQkJcmV0dXJuIG5ldyBPYmplY3RbMF07DQotCX0NCi0NCi0NCi0JLyoqDQotCSAqIEBzZWUgSVdvcmtiZW5jaEFkYXB0ZXIjZ2V0SW1hZ2VEZXNjcmlwdG9yKE9iamVjdCkNCi0JICovDQotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKE9iamVjdCBvYmopIHsNCi0JCXJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEVkaXRvclJlZ2lzdHJ5KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKGdldE5hbWUoKSk7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBAc2VlIElXb3JrYmVuY2hBZGFwdGVyI2dldExhYmVsKE9iamVjdCkNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoT2JqZWN0IG9iaikgew0KLQkJcmV0dXJuIGdldE5hbWUoKTsNCi0JfQ0KLQ0KLQ0KLQkvKioNCi0JICogQHNlZSBJV29ya2JlbmNoQWRhcHRlciNnZXRQYXJlbnQoT2JqZWN0KQ0KLQkgKi8NCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGFyZzApIHsNCi0JCXJldHVybiBwYXJlbnQ7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL05hbWVkTW9kZWxPYmplY3QuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9OYW1lZE1vZGVsT2JqZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkNGVkNjMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL05hbWVkTW9kZWxPYmplY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBOYW1lZE1vZGVsT2JqZWN0IGV4dGVuZHMgVUlNb2RlbE9iamVjdCAKLQkJCQkJCQlpbXBsZW1lbnRzIElXb3JrYmVuY2hBZGFwdGVyLCBTZXJpYWxpemFibGUgIHsKLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCXRyYW5zaWVudCBwcml2YXRlIE5hbWVkTW9kZWxPYmplY3QgcGFyZW50OwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBfTkFNRT0icF9uYW1lIjsKLQkKLQlwdWJsaWMgTmFtZWRNb2RlbE9iamVjdCgpIHsKLQl9Ci0JCi0JcHVibGljIE5hbWVkTW9kZWxPYmplY3QoU3RyaW5nIG5hbWUpIHsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci0JCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJaWYgKGFkYXB0ZXIuZXF1YWxzKElXb3JrYmVuY2hBZGFwdGVyLmNsYXNzKSkgewotCQkJcmV0dXJuIHRoaXM7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCQotCXB1YmxpYyBJUGF0aCBnZXRQYXRoKCkgewotCQlPYmplY3QgcGFyZW50ID0gZ2V0UGFyZW50KG51bGwpOwotCQlpZiAocGFyZW50IT1udWxsICYmIHBhcmVudCBpbnN0YW5jZW9mIE5hbWVkTW9kZWxPYmplY3QpCi0JCQlyZXR1cm4gKChOYW1lZE1vZGVsT2JqZWN0KXBhcmVudCkuZ2V0UGF0aCgpLmFwcGVuZChnZXROYW1lKCkpOwotCQllbHNlCi0JCQlyZXR1cm4gbmV3IFBhdGgoZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGdldE5hbWUoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQlub3RpZnlPYmplY3RDaGFuZ2VkKFBfTkFNRSk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgSVdvcmtiZW5jaEFkYXB0ZXIjZ2V0Q2hpbGRyZW4oT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBJV29ya2JlbmNoQWRhcHRlciNnZXRJbWFnZURlc2NyaXB0b3IoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIElXb3JrYmVuY2hBZGFwdGVyI2dldExhYmVsKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIGdldE5hbWUoKTsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgSVdvcmtiZW5jaEFkYXB0ZXIjZ2V0UGFyZW50KE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgYXJnMCkgewotCQlyZXR1cm4gcGFyZW50OwotCX0KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoTmFtZWRNb2RlbE9iamVjdCBwYXJlbnQpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL1BlbmRpbmdDaGFuZ2UuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9QZW5kaW5nQ2hhbmdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3YTllYzkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL1BlbmRpbmdDaGFuZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uSUNvbmZpZ3VyZWRTaXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZTsNCi0NCi0NCi1wdWJsaWMgY2xhc3MgUGVuZGluZ0NoYW5nZSBleHRlbmRzIFNpbXBsZUZlYXR1cmVBZGFwdGVyIHsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5TVEFMTCA9IDB4MTsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5JTlNUQUxMID0gMHgyOw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05GSUdVUkUgPSAweDM7DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOQ09ORklHVVJFID0gMHg0Ow0KLQlwcml2YXRlIGludCBqb2JUeXBlOw0KLQlwcml2YXRlIElGZWF0dXJlIG9sZEZlYXR1cmU7DQotCXByaXZhdGUgYm9vbGVhbiBvcHRpb25hbERlbHRhOw0KLQlwcml2YXRlIElDb25maWd1cmVkU2l0ZSBkZWZhdWx0VGFyZ2V0U2l0ZTsNCi0JcHJpdmF0ZSBib29sZWFuIHByb2Nlc3NlZDsNCi0JDQotCXB1YmxpYyBQZW5kaW5nQ2hhbmdlKElGZWF0dXJlIGZlYXR1cmUsIGludCBqb2JUeXBlKSB7DQotCQlzdXBlcihmZWF0dXJlKTsNCi0JCXRoaXMuam9iVHlwZSA9IGpvYlR5cGU7DQotCX0NCi0JDQotCXB1YmxpYyBQZW5kaW5nQ2hhbmdlKElGZWF0dXJlIGZlYXR1cmUsIElDb25maWd1cmVkU2l0ZSB0YXJnZXRTaXRlKSB7DQotCQl0aGlzKGZlYXR1cmUsIElOU1RBTEwpOw0KLQkJdGhpcy5kZWZhdWx0VGFyZ2V0U2l0ZSA9IHRhcmdldFNpdGU7DQotCX0NCi0JDQotCXB1YmxpYyBQZW5kaW5nQ2hhbmdlKElGZWF0dXJlIG9sZEZlYXR1cmUsIElGZWF0dXJlIG5ld0ZlYXR1cmUpIHsNCi0JCXRoaXMobmV3RmVhdHVyZSwgSU5TVEFMTCk7DQotCQl0aGlzLm9sZEZlYXR1cmUgPSBvbGRGZWF0dXJlOw0KLQl9DQotCQ0KLQlwdWJsaWMgUGVuZGluZ0NoYW5nZShJRmVhdHVyZSBvbGRGZWF0dXJlLCBJRmVhdHVyZSBuZXdGZWF0dXJlLCBib29sZWFuIG9wdGlvbmFsRGVsdGEpIHsNCi0JCXRoaXMob2xkRmVhdHVyZSwgbmV3RmVhdHVyZSk7DQotCQl0aGlzLm9wdGlvbmFsRGVsdGEgPSBvcHRpb25hbERlbHRhOw0KLQl9DQotDQotCXB1YmxpYyBpbnQgZ2V0Sm9iVHlwZSgpIHsNCi0JCXJldHVybiBqb2JUeXBlOw0KLQl9DQotCQ0KLQlwdWJsaWMgSUZlYXR1cmUgZ2V0RmVhdHVyZSgpIHsNCi0JCXJldHVybiBmZWF0dXJlOw0KLQl9DQotCQ0KLQlwdWJsaWMgSUZlYXR1cmUgZ2V0T2xkRmVhdHVyZSgpIHsNCi0JCXJldHVybiBvbGRGZWF0dXJlOw0KLQl9DQotCXB1YmxpYyBib29sZWFuIGlzT3B0aW9uYWxEZWx0YSgpIHsNCi0JCXJldHVybiBvcHRpb25hbERlbHRhOw0KLQl9DQotCQ0KLQlwdWJsaWMgSUNvbmZpZ3VyZWRTaXRlIGdldERlZmF1bHRUYXJnZXRTaXRlKCkgew0KLQkJcmV0dXJuIGRlZmF1bHRUYXJnZXRTaXRlOw0KLQl9DQotCQ0KLQlwdWJsaWMgYm9vbGVhbiBpc1Byb2Nlc3NlZCgpIHsNCi0JCXJldHVybiBwcm9jZXNzZWQ7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIG1hcmtQcm9jZXNzZWQoKSB7DQotCQlwcm9jZXNzZWQgPSB0cnVlOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9QcmVzZXJ2ZWRDb25maWd1cmF0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvUHJlc2VydmVkQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDY2NjlkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9QcmVzZXJ2ZWRDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLklJbnN0YWxsQ29uZmlndXJhdGlvbjsNCi0NCi1wdWJsaWMgY2xhc3MgUHJlc2VydmVkQ29uZmlndXJhdGlvbiBleHRlbmRzIFVJTW9kZWxPYmplY3Qgew0KLQlwcml2YXRlIElJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWc7DQotCQ0KLQlwdWJsaWMgUHJlc2VydmVkQ29uZmlndXJhdGlvbihJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnKSB7DQotCQl0aGlzLmNvbmZpZyA9IGNvbmZpZzsNCi0JfQ0KLQkNCi0JcHVibGljIElJbnN0YWxsQ29uZmlndXJhdGlvbiBnZXRDb25maWd1cmF0aW9uKCkgew0KLQkJcmV0dXJuIGNvbmZpZzsNCi0JfQ0KLQkNCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCi0JCXJldHVybiBjb25maWcuZ2V0TGFiZWwoKTsNCi0JfQ0KLQkNCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsNCi0JCWlmIChvYmplY3Q9PW51bGwpIHJldHVybiBmYWxzZTsNCi0JCWlmIChvYmplY3Q9PXRoaXMpIHJldHVybiB0cnVlOw0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFByZXNlcnZlZENvbmZpZ3VyYXRpb24pIHsNCi0JCQlyZXR1cm4gKChQcmVzZXJ2ZWRDb25maWd1cmF0aW9uKW9iamVjdCkuZ2V0Q29uZmlndXJhdGlvbigpLmVxdWFscyhjb25maWcpOw0KLQkJfQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9TaW1wbGVGZWF0dXJlQWRhcHRlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL1NpbXBsZUZlYXR1cmVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWUxY2IuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL1NpbXBsZUZlYXR1cmVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWw7DQotDQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KLQ0KLS8qKg0KLSAqIEB2ZXJzaW9uIAkxLjANCi0gKiBAYXV0aG9yDQotICovDQotcHVibGljIGNsYXNzIFNpbXBsZUZlYXR1cmVBZGFwdGVyIGV4dGVuZHMgRmVhdHVyZUFkYXB0ZXIgew0KLQlwcm90ZWN0ZWQgSUZlYXR1cmUgZmVhdHVyZTsNCi0JcHJpdmF0ZSBib29sZWFuIG9wdGlvbmFsOw0KLQlwdWJsaWMgU2ltcGxlRmVhdHVyZUFkYXB0ZXIoSUZlYXR1cmUgZmVhdHVyZSkgew0KLQkJdGhpcyhmZWF0dXJlLCBmYWxzZSk7DQotCX0NCi0JcHVibGljIFNpbXBsZUZlYXR1cmVBZGFwdGVyKElGZWF0dXJlIGZlYXR1cmUsIGJvb2xlYW4gb3B0aW9uYWwpIHsNCi0JCXRoaXMuZmVhdHVyZSA9IGZlYXR1cmU7DQotCQl0aGlzLm9wdGlvbmFsID0gb3B0aW9uYWw7DQotCX0NCi0JDQotCXB1YmxpYyBJRmVhdHVyZSBnZXRGZWF0dXJlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJcmV0dXJuIGZlYXR1cmU7DQotCX0NCi0JDQotCXB1YmxpYyBTdHJpbmcgZ2V0RmFzdExhYmVsKCkgew0KLQkJcmV0dXJuIGZlYXR1cmUuZ2V0TGFiZWwoKTsNCi0JfQ0KLQkNCi0JcHVibGljIFVSTCBnZXRVUkwoKSB7DQotCQlyZXR1cm4gZmVhdHVyZS5nZXRVUkwoKTsNCi0JfQ0KLQkNCi0JcHVibGljIElTaXRlIGdldFNpdGUoKSB7DQotCQlyZXR1cm4gZmVhdHVyZS5nZXRTaXRlKCk7DQotCX0NCi0JDQotCXB1YmxpYyBJRmVhdHVyZUFkYXB0ZXJbXSBnZXRJbmNsdWRlZEZlYXR1cmVzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgew0KLQkJdHJ5IHsNCi0JCQlJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlW10gaW5jbHVkZWQgPSBnZXRGZWF0dXJlKG1vbml0b3IpLmdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKTsNCi0JCQlTaW1wbGVGZWF0dXJlQWRhcHRlcltdIHJlc3VsdCA9DQotCQkJCW5ldyBTaW1wbGVGZWF0dXJlQWRhcHRlcltpbmNsdWRlZC5sZW5ndGhdOw0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5jbHVkZWQubGVuZ3RoOyBpKyspIHsNCi0JCQkJcmVzdWx0W2ldID0NCi0JCQkJCW5ldyBTaW1wbGVGZWF0dXJlQWRhcHRlcihpbmNsdWRlZFtpXS5nZXRGZWF0dXJlKG51bGwpLCBpbmNsdWRlZFtpXS5pc09wdGlvbmFsKCkpOw0KLQkJCQlyZXN1bHRbaV0uc2V0SW5jbHVkZWQodHJ1ZSk7DQotCQkJfQ0KLQkJCXJldHVybiByZXN1bHQ7DQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsNCi0JCQlyZXR1cm4gbmV3IElGZWF0dXJlQWRhcHRlclswXTsNCi0JCX0NCi0JfQ0KLQlwdWJsaWMgYm9vbGVhbiBpc09wdGlvbmFsKCkgew0KLQkJcmV0dXJuIG9wdGlvbmFsOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9TaXRlQm9va21hcmsuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9TaXRlQm9va21hcmsuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU3MzhiNy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvU2l0ZUJvb2ttYXJrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsOw0KLQ0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUk7DQotDQotcHVibGljIGNsYXNzIFNpdGVCb29rbWFyayBleHRlbmRzIE5hbWVkTW9kZWxPYmplY3QgDQotCQkJCQkJCWltcGxlbWVudHMgSVNpdGVBZGFwdGVyIHsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVVNFUiA9IDA7DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPQ0FMID0gMTsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9DQUxfQk9PS01BUksgPSAyOw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX1VSTD0icF91cmwiOw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX1RZUEU9InBfdHlwZSI7DQotCQ0KLQlwcml2YXRlIFVSTCB1cmw7DQotCXRyYW5zaWVudCBwcml2YXRlIElTaXRlIHNpdGU7DQotCXRyYW5zaWVudCBwcml2YXRlIFZlY3RvciBjYXRhbG9nOw0KLQl0cmFuc2llbnQgcHJpdmF0ZSBTaXRlQ2F0ZWdvcnkgb3RoZXJDYXRlZ29yeTsNCi0JcHJpdmF0ZSBpbnQgdHlwZTsNCi0JcHJpdmF0ZSBib29sZWFuIHdlYkJvb2ttYXJrOw0KLQ0KLQ0KLQkNCi0JcHVibGljIFNpdGVCb29rbWFyaygpIHsNCi0JfQ0KLQkNCi0JcHVibGljIFNpdGVCb29rbWFyayhTdHJpbmcgbmFtZSwgVVJMIHVybCwgYm9vbGVhbiB3ZWJCb29rbWFyaykgew0KLQkJc3VwZXIobmFtZSk7DQotCQl0aGlzLnVybCA9IHVybDsNCi0JCXRoaXMud2ViQm9va21hcmsgPSB3ZWJCb29rbWFyazsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgc2V0VHlwZShpbnQgdHlwZSkgew0KLQkJdGhpcy50eXBlID0gdHlwZTsNCi0JfQ0KLQkNCi0JcHVibGljIGludCBnZXRUeXBlKCkgew0KLQkJcmV0dXJuIHR5cGU7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHNldFdlYkJvb2ttYXJrKGJvb2xlYW4gdmFsdWUpIHsNCi0JCWlmICh0eXBlPT1MT0NBTF9CT09LTUFSSykgcmV0dXJuOw0KLQkJdGhpcy53ZWJCb29rbWFyayA9IHZhbHVlOw0KLQkJbm90aWZ5T2JqZWN0Q2hhbmdlZChQX1RZUEUpOw0KLQl9DQotCQ0KLQlwdWJsaWMgYm9vbGVhbiBpc1dlYkJvb2ttYXJrKCkgew0KLQkJcmV0dXJuIHdlYkJvb2ttYXJrOw0KLQl9DQotCQ0KLQlwdWJsaWMgVVJMIGdldFVSTCgpIHsNCi0JCXJldHVybiB1cmw7DQotCX0NCi0NCi0NCi0JcHVibGljIHZvaWQgc2V0VVJMKFVSTCB1cmwpIHsNCi0JCXRoaXMudXJsID0gdXJsOw0KLQkJc2l0ZSA9IG51bGw7DQotCQlub3RpZnlPYmplY3RDaGFuZ2VkKFBfVVJMKTsNCi0JfQ0KLQkNCi0JcHVibGljIElTaXRlIGdldFNpdGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7DQotCQlyZXR1cm4gZ2V0U2l0ZSh0cnVlLCBtb25pdG9yKTsNCi0JfQ0KLQkNCi0JcHVibGljIElTaXRlIGdldFNpdGUoYm9vbGVhbiBzaG93RGlhbG9nSWZGYWlsZWQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgew0KLQkJaWYgKHNpdGU9PW51bGwpIHsNCi0JCQl0cnkgew0KLQkJCQljb25uZWN0KG1vbml0b3IpOw0KLQkJCX0NCi0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7DQotCQkJCVVwZGF0ZVVJLmxvZ0V4Y2VwdGlvbihlLCBzaG93RGlhbG9nSWZGYWlsZWQpOw0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBzaXRlOw0KLQl9DQotCQ0KLQlwdWJsaWMgYm9vbGVhbiBpc1NpdGVDb25uZWN0ZWQoKSB7DQotCQlyZXR1cm4gc2l0ZSE9bnVsbDsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgY29ubmVjdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCWNvbm5lY3QodHJ1ZSwgbW9uaXRvcik7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIGNvbm5lY3QoYm9vbGVhbiB1c2VDYWNoZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlpZiAobW9uaXRvcj09bnVsbCkgbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7DQotCQltb25pdG9yLmJlZ2luVGFzaygiIiwgMik7DQotCQltb25pdG9yLnN1YlRhc2soVXBkYXRlVUkuZ2V0Rm9ybWF0dGVkTWVzc2FnZSgiU2l0ZUJvb2ttYXJrLmNvbm5lY3RpbmciLCB1cmwudG9TdHJpbmcoKSkpOw0KLQkJc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUodXJsLCB1c2VDYWNoZSwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxKSk7DQotCQlpZiAoc2l0ZSE9bnVsbCkgY3JlYXRlQ2F0YWxvZyhuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEpKTsNCi0JCWVsc2UNCi0JCQljYXRhbG9nID0gbmV3IFZlY3RvcigpOw0KLQl9DQotCQ0KLQlwcml2YXRlIHZvaWQgY3JlYXRlQ2F0YWxvZyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsNCi0JCWNhdGFsb2cgPSBuZXcgVmVjdG9yKCk7DQotCQlvdGhlckNhdGVnb3J5ID0gbmV3IFNpdGVDYXRlZ29yeShudWxsLCBudWxsKTsNCi0JCS8vIEFkZCBhbGwgdGhlIGNhdGVnb3JpZXMNCi0JCUlDYXRlZ29yeSBbXSBjYXRlZ29yaWVzOw0KLQkJY2F0ZWdvcmllcyA9IHNpdGUuZ2V0Q2F0ZWdvcmllcygpOw0KLQkJDQotCQlJU2l0ZUZlYXR1cmVSZWZlcmVuY2UgW10gZmVhdHVyZVJlZnM7DQotCQlmZWF0dXJlUmVmcyA9IHNpdGUuZ2V0UmF3RmVhdHVyZVJlZmVyZW5jZXMoKTsNCi0JCQ0KLQkJbW9uaXRvci5iZWdpblRhc2soIiIsIGZlYXR1cmVSZWZzLmxlbmd0aCArIGNhdGVnb3JpZXMubGVuZ3RoKTsNCi0NCi0JCWZvciAoaW50IGk9MDsgaTxjYXRlZ29yaWVzLmxlbmd0aDsgaSsrKSB7DQotCQkJSUNhdGVnb3J5IGNhdGVnb3J5ID0gY2F0ZWdvcmllc1tpXTsNCi0JCQlhZGRDYXRlZ29yeVRvQ2F0YWxvZyhjYXRlZ29yeSk7DQotCQkJbW9uaXRvci53b3JrZWQoMSk7DQotCQl9DQotCQkvLyBBZGQgZmVhdHVyZXMgdG8gY2F0ZWdvcmllcw0KLQ0KLQkJZm9yIChpbnQgaT0wOyBpPGZlYXR1cmVSZWZzLmxlbmd0aDsgaSsrKSB7DQotCQkJSVNpdGVGZWF0dXJlUmVmZXJlbmNlIGZlYXR1cmVSZWYgPSBmZWF0dXJlUmVmc1tpXTsNCi0JCQlhZGRGZWF0dXJlVG9DYXRhbG9nKGZlYXR1cmVSZWYpOw0KLQkJCW1vbml0b3Iud29ya2VkKDEpOw0KLQkJfQ0KLQkJaWYgKG90aGVyQ2F0ZWdvcnkuZ2V0Q2hpbGRDb3VudCgpPjApDQotCQkgICBjYXRhbG9nLmFkZChvdGhlckNhdGVnb3J5KTsNCi0JfQ0KLQ0KLQlwdWJsaWMgT2JqZWN0IFtdIGdldENhdGFsb2coYm9vbGVhbiB3aXRoQ2F0ZWdvcmllcywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7DQotCQlpZiAod2l0aENhdGVnb3JpZXMpDQotCQkJcmV0dXJuIGNhdGFsb2cudG9BcnJheSgpOw0KLQkJZWxzZSB7DQotCQkJLy8gTWFrZSBhIGZsYXQgY2F0YWxvZw0KLQkJCVZlY3RvciBmbGF0Q2F0YWxvZyA9IG5ldyBWZWN0b3IoKTsNCi0JCQlmb3IgKGludCBpPTA7IGk8Y2F0YWxvZy5zaXplKCk7IGkrKykgew0KLQkJCQlTaXRlQ2F0ZWdvcnkgY2F0ZWdvcnkgPSAoU2l0ZUNhdGVnb3J5KWNhdGFsb2cuZ2V0KGkpOw0KLQkJCQljYXRlZ29yeS5hZGRGZWF0dXJlc1RvKGZsYXRDYXRhbG9nKTsNCi0JCQl9DQotCQkJcmV0dXJuIGZsYXRDYXRhbG9nLnRvQXJyYXkoKTsNCi0JCX0NCi0JfQ0KLQkNCi0JcHJpdmF0ZSB2b2lkIGFkZENhdGVnb3J5VG9DYXRhbG9nKElDYXRlZ29yeSBjYXRlZ29yeSkgew0KLQkJU3RyaW5nIG5hbWUgPSBjYXRlZ29yeS5nZXROYW1lKCk7DQotCQlpbnQgbG9jID0gbmFtZS5pbmRleE9mKCcvJyk7DQotCQlpZiAobG9jID09IC0xKSB7DQotCQkJLy8gZmlyc3QgbGV2ZWwNCi0JCQljYXRhbG9nLmFkZChuZXcgU2l0ZUNhdGVnb3J5KG5hbWUsIGNhdGVnb3J5KSk7DQotCQl9DQotCQllbHNlIHsNCi0JCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgobmFtZSk7DQotCQkJbmFtZSA9IHBhdGgubGFzdFNlZ21lbnQoKS50b1N0cmluZygpOw0KLQkJCXBhdGggPSBwYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKTsNCi0JCQlTaXRlQ2F0ZWdvcnkgcGFyZW50Q2F0ZWdvcnkgPSBmaW5kQ2F0ZWdvcnkocGF0aCwgY2F0YWxvZy50b0FycmF5KCkpOw0KLQkJCWlmIChwYXJlbnRDYXRlZ29yeSE9bnVsbCkgew0KLQkJCQlwYXJlbnRDYXRlZ29yeS5hZGQobmV3IFNpdGVDYXRlZ29yeShuYW1lLCBjYXRlZ29yeSkpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQlwcml2YXRlIHZvaWQgYWRkRmVhdHVyZVRvQ2F0YWxvZyhJU2l0ZUZlYXR1cmVSZWZlcmVuY2UgZmVhdHVyZSkgew0KLQkJSUNhdGVnb3J5IFtdIGNhdGVnb3JpZXMgPSBmZWF0dXJlLmdldENhdGVnb3JpZXMoKTsNCi0JCWJvb2xlYW4gb3JwaGFuID0gdHJ1ZTsNCi0NCi0JCWZvciAoaW50IGk9MDsgaTxjYXRlZ29yaWVzLmxlbmd0aDsgaSsrKSB7DQotCQkJSUNhdGVnb3J5IGNhdGVnb3J5ID0gY2F0ZWdvcmllc1tpXTsNCi0JCQlTdHJpbmcgbmFtZSA9IGNhdGVnb3J5LmdldE5hbWUoKTsNCi0JCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgobmFtZSk7DQotCQkJU2l0ZUNhdGVnb3J5IHBhcmVudENhdGVnb3J5ID0gZmluZENhdGVnb3J5KHBhdGgsIGNhdGFsb2cudG9BcnJheSgpKTsNCi0JCQlpZiAocGFyZW50Q2F0ZWdvcnkhPW51bGwpIHsNCi0JCSAgIAkJcGFyZW50Q2F0ZWdvcnkuYWRkKG5ldyBGZWF0dXJlUmVmZXJlbmNlQWRhcHRlcihmZWF0dXJlKSk7DQotCQkgICAJCW9ycGhhbiA9IGZhbHNlOw0KLQkJCX0NCi0JCX0NCi0JCWlmIChvcnBoYW4pDQotCQkJb3RoZXJDYXRlZ29yeS5hZGQobmV3IEZlYXR1cmVSZWZlcmVuY2VBZGFwdGVyKGZlYXR1cmUpKTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBTaXRlQ2F0ZWdvcnkgZmluZENhdGVnb3J5KElQYXRoIHBhdGgsIE9iamVjdCBbXSBjaGlsZHJlbikgew0KLQkJZm9yIChpbnQgaT0wOyBpPGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7DQotCQkJT2JqZWN0IGNoaWxkID0gY2hpbGRyZW5baV07DQotCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgU2l0ZUNhdGVnb3J5KSB7DQotCQkJCVNpdGVDYXRlZ29yeSBzYyA9IChTaXRlQ2F0ZWdvcnkpY2hpbGQ7DQotCQkJCWlmIChzYy5nZXROYW1lKCkuZXF1YWxzKHBhdGguc2VnbWVudCgwKSkpIHsNCi0JCQkJICAgaWYgKHBhdGguc2VnbWVudENvdW50KCk9PTEpIHJldHVybiBzYzsNCi0JCQkJCWVsc2Ugew0KLQkJCQkJCXBhdGggPSBwYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoMSk7DQotCQkJCQkJcmV0dXJuIGZpbmRDYXRlZ29yeShwYXRoLCBzYy5nZXRDaGlsZHJlbigpKTsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotCS8qKg0KLQkgKiBAc2VlIElTaXRlQWRhcHRlciNnZXRMYWJlbCgpDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgew0KLQkJcmV0dXJuIGdldE5hbWUoKTsNCi0JfQ0KLQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvU2l0ZUNhdGVnb3J5LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvU2l0ZUNhdGVnb3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3ZmJjYmIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL1NpdGVDYXRlZ29yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbDsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSTsNCi0NCi1wdWJsaWMgY2xhc3MgU2l0ZUNhdGVnb3J5IGV4dGVuZHMgVUlNb2RlbE9iamVjdCB7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfT1RIRVJfTEFCRUwgPSAiU2l0ZUNhdGVnb3J5Lm90aGVyLmxhYmVsIjsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9PVEhFUl9ERVNDUklQVElPTiA9DQotCQkiU2l0ZUNhdGVnb3J5Lm90aGVyLmRlc2NyaXB0aW9uIjsNCi0NCi0JVmVjdG9yIGNoaWxkcmVuOw0KLQlwcml2YXRlIElDYXRlZ29yeSBjYXRlZ29yeTsNCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsNCi0JcHJpdmF0ZSBib29sZWFuIHRvdWNoZWQ7DQotCXByaXZhdGUgaW50IGZlYXR1cmVDb3VudDsNCi0JcHJpdmF0ZSBib29sZWFuIGNhbmNlbGVkOw0KLQ0KLQljbGFzcyBPdGhlckNhdGVnb3J5IGltcGxlbWVudHMgSUNhdGVnb3J5IHsNCi0JCUlVUkxFbnRyeSBlbnRyeTsNCi0JCXB1YmxpYyBPdGhlckNhdGVnb3J5KCkgew0KLQkJCWVudHJ5ID0gbmV3IElVUkxFbnRyeSgpIHsNCi0JCQkJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uKCkgew0KLQkJCQkJcmV0dXJuIFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfT1RIRVJfREVTQ1JJUFRJT04pOw0KLQkJCQl9DQotCQkJCXB1YmxpYyBVUkwgZ2V0VVJMKCkgew0KLQkJCQkJcmV0dXJuIG51bGw7DQotCQkJCX0NCi0JCQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGNsYXp6KSB7DQotCQkJCQlyZXR1cm4gbnVsbDsNCi0JCQkJfQ0KLQkJCQlwdWJsaWMgaW50IGdldFR5cGUoKSB7DQotCQkJCQlyZXR1cm4gSVVSTEVudHJ5LlVQREFURV9TSVRFOw0KLQkJCQl9DQotCQkJfTsNCi0JCX0NCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsNCi0JCQlyZXR1cm4gU2l0ZUNhdGVnb3J5LnRoaXMuZ2V0TmFtZSgpOw0KLQkJfQ0KLQkJcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsNCi0JCQlyZXR1cm4gU2l0ZUNhdGVnb3J5LnRoaXMuZ2V0TmFtZSgpOw0KLQkJfQ0KLQkJcHVibGljIElVUkxFbnRyeSBnZXREZXNjcmlwdGlvbigpIHsNCi0JCQlyZXR1cm4gZW50cnk7DQotCQl9DQotCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgY2xhenopIHsNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCX0NCi0JfQ0KLQ0KLQlwdWJsaWMgU2l0ZUNhdGVnb3J5KFN0cmluZyBuYW1lLCBJQ2F0ZWdvcnkgY2F0ZWdvcnkpIHsNCi0JCWlmIChjYXRlZ29yeSA9PSBudWxsKSB7DQotCQkJdGhpcy5uYW1lID0gVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9PVEhFUl9MQUJFTCk7DQotCQkJdGhpcy5jYXRlZ29yeSA9IG5ldyBPdGhlckNhdGVnb3J5KCk7DQotCQl9IGVsc2Ugew0KLQkJCXRoaXMubmFtZSA9IG5hbWU7DQotCQkJdGhpcy5jYXRlZ29yeSA9IGNhdGVnb3J5Ow0KLQkJfQ0KLQkJY2hpbGRyZW4gPSBuZXcgVmVjdG9yKCk7DQotCX0NCi0NCi0JcHVibGljIGJvb2xlYW4gaXNPdGhlckNhdGVnb3J5KCkgew0KLQkJcmV0dXJuIGNhdGVnb3J5IGluc3RhbmNlb2YgT3RoZXJDYXRlZ29yeTsNCi0JfQ0KLQ0KLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oKSB7DQotCQlyZXR1cm4gY2FuY2VsZWQgPyBuZXcgT2JqZWN0WzBdIDogY2hpbGRyZW4udG9BcnJheSgpOw0KLQl9DQotDQotCXB1YmxpYyBpbnQgZ2V0Q2hpbGRDb3VudCgpIHsNCi0JCXJldHVybiBjYW5jZWxlZCA/IDAgOiBjaGlsZHJlbi5zaXplKCk7DQotCX0NCi0NCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgew0KLQkJcmV0dXJuIG5hbWU7DQotCX0NCi0JcHVibGljIFN0cmluZyBnZXRGdWxsTmFtZSgpIHsNCi0JCXJldHVybiBjYXRlZ29yeS5nZXROYW1lKCk7DQotCX0NCi0NCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCi0JCXJldHVybiBjYXRlZ29yeS5nZXRMYWJlbCgpOw0KLQl9DQotDQotCXB1YmxpYyBJQ2F0ZWdvcnkgZ2V0Q2F0ZWdvcnkoKSB7DQotCQlyZXR1cm4gY2F0ZWdvcnk7DQotCX0NCi0NCi0Jdm9pZCBhZGQoT2JqZWN0IGNoaWxkKSB7DQotCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBJRmVhdHVyZUFkYXB0ZXIpDQotCQkJZmVhdHVyZUNvdW50Kys7DQotCQljaGlsZHJlbi5hZGQoY2hpbGQpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRvdWNoRmVhdHVyZXMoSVJ1bm5hYmxlQ29udGV4dCBjb250ZXh0KSB7DQotCQlpZiAoY2hpbGRyZW4uc2l6ZSgpID09IDAgfHwgdG91Y2hlZCB8fCBmZWF0dXJlQ291bnQgPT0gMCkNCi0JCQlyZXR1cm47DQotDQotCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3AgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgew0KLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsNCi0JCQkJbW9uaXRvci5iZWdpblRhc2soDQotCQkJCQlVcGRhdGVVSS5nZXRTdHJpbmcoIlNpdGVCb29rbWFyay5kb3dubG9hZGluZyIpLA0KLQkJCQkJZmVhdHVyZUNvdW50KTsNCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5zaXplKCk7IGkrKykgew0KLQkJCQkJT2JqZWN0IGNoaWxkID0gY2hpbGRyZW4uZ2V0KGkpOw0KLQkJCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQ0KLQkJCQkJCWJyZWFrOw0KLQkJCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgSUZlYXR1cmVBZGFwdGVyKSB7DQotCQkJCQkJSUZlYXR1cmVBZGFwdGVyIGFkYXB0ZXIgPSAoSUZlYXR1cmVBZGFwdGVyKSBjaGlsZDsNCi0JCQkJCQltb25pdG9yLnN1YlRhc2soYWRhcHRlci5nZXRGYXN0TGFiZWwoKSk7DQotCQkJCQkJdHJ5IHsNCi0JCQkJCQkJYWRhcHRlci5nZXRGZWF0dXJlKA0KLQkJCQkJCQkJbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxKSk7DQotCQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7DQotCQkJCQkJfQ0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJCW1vbml0b3IuZG9uZSgpOw0KLQkJCX0NCi0JCX07DQotDQotCQl0cnkgew0KLQkJCWNvbnRleHQucnVuKHRydWUsIHRydWUsIG9wKTsNCi0JCQl0b3VjaGVkID0gdHJ1ZTsNCi0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsNCi0JCQljYW5jZWxlZCA9IHRydWU7DQotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsNCi0JCX0NCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBhZGRGZWF0dXJlc1RvKFZlY3RvciBmbGF0TGlzdCkgew0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5zaXplKCk7IGkrKykgew0KLQkJCU9iamVjdCBjaGlsZCA9IGNoaWxkcmVuLmdldChpKTsNCi0JCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBGZWF0dXJlUmVmZXJlbmNlQWRhcHRlcikgew0KLQkJCQlGZWF0dXJlUmVmZXJlbmNlQWRhcHRlciBjZmVhdHVyZSA9DQotCQkJCQkoRmVhdHVyZVJlZmVyZW5jZUFkYXB0ZXIpIGNoaWxkOw0KLQkJCQkvLyBEb24ndCBhZGQgZHVwbGljYXRlcyAtIHRoZXJlIG1heSBiZSB0aGUgc2FtZQ0KLQkJCQkvLyBmZWF0dXJlIHByZXNlbnQgaW4gc2V2ZXJhbCBjYXRlZ29yaWVzDQotCQkJCWlmIChmaW5kRmVhdHVyZShmbGF0TGlzdCwgY2ZlYXR1cmUuZ2V0RmVhdHVyZVJlZmVyZW5jZSgpKQ0KLQkJCQkJPT0gbnVsbCkgew0KLQkJCQkJZmxhdExpc3QuYWRkKGNoaWxkKTsNCi0JCQkJfQ0KLQkJCX0gZWxzZSBpZiAoY2hpbGQgaW5zdGFuY2VvZiBTaXRlQ2F0ZWdvcnkpIHsNCi0JCQkJKChTaXRlQ2F0ZWdvcnkpIGNoaWxkKS5hZGRGZWF0dXJlc1RvKGZsYXRMaXN0KTsNCi0JCQl9DQotCQl9DQotCX0NCi0NCi0JcHJpdmF0ZSBGZWF0dXJlUmVmZXJlbmNlQWRhcHRlciBmaW5kRmVhdHVyZSgNCi0JCVZlY3RvciBmbGF0TGlzdCwNCi0JCUlGZWF0dXJlUmVmZXJlbmNlIGZlYXR1cmVSZWYpIHsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmxhdExpc3Quc2l6ZSgpOyBpKyspIHsNCi0JCQlGZWF0dXJlUmVmZXJlbmNlQWRhcHRlciBjZmVhdHVyZSA9DQotCQkJCShGZWF0dXJlUmVmZXJlbmNlQWRhcHRlcikgZmxhdExpc3QuZ2V0KGkpOw0KLQkJCWlmIChjZmVhdHVyZS5nZXRGZWF0dXJlUmVmZXJlbmNlKCkuZXF1YWxzKGZlYXR1cmVSZWYpKQ0KLQkJCQlyZXR1cm4gY2ZlYXR1cmU7DQotCQl9DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvVUlNb2RlbE9iamVjdC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL1VJTW9kZWxPYmplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmEwZjdjNi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvVUlNb2RlbE9iamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5JV29ya2JlbmNoQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci0KLQotcHVibGljIGNsYXNzIFVJTW9kZWxPYmplY3QgZXh0ZW5kcyBQbGF0Zm9ybU9iamVjdCBpbXBsZW1lbnRzIElXb3JrYmVuY2hBZGFwdGVyIHsKLQlVcGRhdGVNb2RlbCBtb2RlbDsKLQkKLQlwdWJsaWMgdm9pZCBzZXRNb2RlbChVcGRhdGVNb2RlbCBtb2RlbCkgewotCQl0aGlzLm1vZGVsID0gbW9kZWw7Ci0JfQotCQotCXB1YmxpYyBVcGRhdGVNb2RlbCBnZXRNb2RlbCgpIHsKLQkJcmV0dXJuIG1vZGVsOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlPYmplY3RDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eSkgewotCQlpZiAobW9kZWw9PW51bGwpIHJldHVybjsKLQkJbW9kZWwuZmlyZU9iamVjdENoYW5nZWQodGhpcywgcHJvcGVydHkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlPYmplY3RzQWRkZWQoT2JqZWN0IHBhcmVudCwgT2JqZWN0IFtdIG9iamVjdHMpIHsKLQkJaWYgKG1vZGVsPT1udWxsKSByZXR1cm47Ci0JCW1vZGVsLmZpcmVPYmplY3RzQWRkZWQocGFyZW50LCBvYmplY3RzKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5T2JqZWN0c1JlbW92ZWQoT2JqZWN0IHBhcmVudCwgT2JqZWN0IFtdIG9iamVjdHMpIHsKLQkJaWYgKG1vZGVsPT1udWxsKSByZXR1cm47Ci0JCW1vZGVsLmZpcmVPYmplY3RzUmVtb3ZlZChwYXJlbnQsIG9iamVjdHMpOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IFtdIGdldENoaWxkcmVuKE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gdG9TdHJpbmcoKTsKLQl9Ci0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvVXBkYXRlTW9kZWwuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9VcGRhdGVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGVkNzhjLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9VcGRhdGVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbDsNCi0NCi1pbXBvcnQgamF2YS51dGlsLio7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJOw0KLQ0KLXB1YmxpYyBjbGFzcyBVcGRhdGVNb2RlbCBpbXBsZW1lbnRzIElBZGFwdGFibGUgew0KLQlwcml2YXRlIFZlY3RvciBjaGFuZ2VzID0gbmV3IFZlY3RvcigpOw0KLQlwcml2YXRlIFZlY3RvciBib29rbWFya3MgPSBuZXcgVmVjdG9yKCk7DQotCXByaXZhdGUgVmVjdG9yIGxpc3RlbmVycyA9IG5ldyBWZWN0b3IoKTsNCi0JcHJpdmF0ZSBJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3M7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCT09LTUFSS19GSUxFID0gImJvb2ttYXJrcy54bWwiOw0KLQkNCi0JcHVibGljIFVwZGF0ZU1vZGVsKCkgew0KLQkJc2V0dGluZ3MgPSBVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0RGlhbG9nU2V0dGluZ3MoKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgc3RhcnR1cCgpIHsNCi0JCS8vIGxvYWQgYm9va21hcmtzDQotCQlCb29rbWFya1V0aWwucGFyc2UoZ2V0Qm9va21hcmtzRmlsZU5hbWUoKSwgYm9va21hcmtzKTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0Qm9va21hcmtzRmlsZU5hbWUoKSB7DQotCQlJUGF0aCBwYXRoID0gVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldFN0YXRlTG9jYXRpb24oKTsNCi0JCXBhdGggPSBwYXRoLmFwcGVuZChCT09LTUFSS19GSUxFKTsNCi0JCXJldHVybiBwYXRoLnRvT1NTdHJpbmcoKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgc2h1dGRvd24oKSB7DQotCQlzYXZlQm9va21hcmtzKCk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHNhdmVCb29rbWFya3MoKSB7DQotCQlCb29rbWFya1V0aWwuc3RvcmUoZ2V0Qm9va21hcmtzRmlsZU5hbWUoKSwgYm9va21hcmtzKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgUGVuZGluZ0NoYW5nZSBbXSBnZXRQZW5kaW5nQ2hhbmdlcygpIHsNCi0JCXJldHVybiAoUGVuZGluZ0NoYW5nZVtdKQ0KLQkJCWNoYW5nZXMudG9BcnJheShuZXcgUGVuZGluZ0NoYW5nZVtjaGFuZ2VzLnNpemUoKV0pOw0KLQl9DQotCQ0KLQlwdWJsaWMgUGVuZGluZ0NoYW5nZSBbXSBnZXRQZW5kaW5nQ2hhbmdlcyhpbnQgdHlwZSkgew0KLQkJVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7DQotCQlmb3IgKGludCBpPTA7IGk8Y2hhbmdlcy5zaXplKCk7IGkrKykgew0KLQkJCVBlbmRpbmdDaGFuZ2Ugam9iID0gKFBlbmRpbmdDaGFuZ2UpY2hhbmdlcy5lbGVtZW50QXQoaSk7DQotCQkJaWYgKGpvYi5nZXRKb2JUeXBlKCkgPT0gdHlwZSkNCi0JCQkgICB2LmFkZChqb2IpOw0KLQkJfQ0KLQkJcmV0dXJuIChQZW5kaW5nQ2hhbmdlW10pDQotCQkJdi50b0FycmF5KG5ldyBQZW5kaW5nQ2hhbmdlW3Yuc2l6ZSgpXSk7DQotCX0NCi0JDQotCXB1YmxpYyBQZW5kaW5nQ2hhbmdlIGZpbmRQZW5kaW5nQ2hhbmdlKElGZWF0dXJlIGZlYXR1cmUpIHsNCi0JCWZvciAoaW50IGk9MDsgaTxjaGFuZ2VzLnNpemUoKTsgaSsrKSB7DQotCQkJUGVuZGluZ0NoYW5nZSBqb2IgPSAoUGVuZGluZ0NoYW5nZSljaGFuZ2VzLmVsZW1lbnRBdChpKTsNCi0JCQlpZiAoam9iLmdldEZlYXR1cmUoKS5lcXVhbHMoZmVhdHVyZSkpDQotCQkJICAgcmV0dXJuIGpvYjsNCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCXB1YmxpYyBQZW5kaW5nQ2hhbmdlIGZpbmRSZWxhdGVkUGVuZGluZ0NoYW5nZShJRmVhdHVyZSBmZWF0dXJlKSB7DQotCQlmb3IgKGludCBpPTA7IGk8Y2hhbmdlcy5zaXplKCk7IGkrKykgew0KLQkJCVBlbmRpbmdDaGFuZ2Ugam9iID0gKFBlbmRpbmdDaGFuZ2UpY2hhbmdlcy5lbGVtZW50QXQoaSk7DQotCQkJDQotCQkJU3RyaW5nIGpvYklkID0gam9iLmdldEZlYXR1cmUoKS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0SWRlbnRpZmllcigpOw0KLQkJCVN0cmluZyBpZCA9IGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldElkZW50aWZpZXIoKTsNCi0JCQlpZiAoaWQuZXF1YWxzKGpvYklkKSkgcmV0dXJuIGpvYjsNCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQkJDQotCQ0KLQlwdWJsaWMgYm9vbGVhbiBpc1BlbmRpbmcoSUZlYXR1cmUgZmVhdHVyZSkgew0KLQkJcmV0dXJuIGZpbmRQZW5kaW5nQ2hhbmdlKGZlYXR1cmUpIT1udWxsOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCBhZGRQZW5kaW5nQ2hhbmdlKFBlbmRpbmdDaGFuZ2UgY2hhbmdlKSB7DQotCQljaGFuZ2VzLmFkZChjaGFuZ2UpOw0KLQkJY2hhbmdlLnNldE1vZGVsKHRoaXMpOw0KLQkJZmlyZU9iamVjdHNBZGRlZCh0aGlzLCBuZXcgT2JqZWN0W10ge2NoYW5nZX0pOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCByZW1vdmVQZW5kaW5nQ2hhbmdlKFBlbmRpbmdDaGFuZ2UgY2hhbmdlKSB7DQotCQljaGFuZ2VzLnJlbW92ZShjaGFuZ2UpOw0KLQkJY2hhbmdlLnNldE1vZGVsKG51bGwpOw0KLQkJZmlyZU9iamVjdHNSZW1vdmVkKHRoaXMsIG5ldyBPYmplY3RbXSB7Y2hhbmdlfSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHJlbW92ZVBlbmRpbmdDaGFuZ2UoSUZlYXR1cmUgc2NoZWR1bGVkRmVhdHVyZSkgew0KLQkJUGVuZGluZ0NoYW5nZSBjaGFuZ2UgPSBmaW5kUGVuZGluZ0NoYW5nZShzY2hlZHVsZWRGZWF0dXJlKTsNCi0JCWlmIChjaGFuZ2UhPW51bGwpDQotCQkgICByZW1vdmVQZW5kaW5nQ2hhbmdlKGNoYW5nZSk7DQotCX0JDQotCQ0KLQlwdWJsaWMgdm9pZCBhZGRCb29rbWFyayhOYW1lZE1vZGVsT2JqZWN0IGJvb2ttYXJrKSB7DQotCQlib29rbWFya3MuYWRkKGJvb2ttYXJrKTsNCi0JCWJvb2ttYXJrLnNldE1vZGVsKHRoaXMpOw0KLQkJZmlyZU9iamVjdHNBZGRlZChudWxsLCBuZXcgT2JqZWN0IFtde2Jvb2ttYXJrfSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHJlbW92ZUJvb2ttYXJrKE5hbWVkTW9kZWxPYmplY3QgYm9va21hcmspIHsNCi0JCWJvb2ttYXJrcy5yZW1vdmUoYm9va21hcmspOw0KLQkJYm9va21hcmsuc2V0TW9kZWwobnVsbCk7DQotCQlmaXJlT2JqZWN0c1JlbW92ZWQobnVsbCwgbmV3IE9iamVjdCBbXXtib29rbWFya30pOw0KLQl9DQotCQ0KLQlwdWJsaWMgTmFtZWRNb2RlbE9iamVjdCBbXSBnZXRCb29rbWFya3MoKSB7DQotCQlyZXR1cm4gKE5hbWVkTW9kZWxPYmplY3RbXSlib29rbWFya3MudG9BcnJheShuZXcgTmFtZWRNb2RlbE9iamVjdFtib29rbWFya3Muc2l6ZSgpXSk7DQotCX0NCi0JDQotCXB1YmxpYyBTaXRlQm9va21hcmsgW10gZ2V0Qm9va21hcmtMZWFmcygpIHsNCi0JCXJldHVybiBCb29rbWFya1V0aWwuZ2V0Qm9va21hcmtzKGJvb2ttYXJrcyk7DQotCX0NCi0JDQotCXB1YmxpYyBCb29rbWFya0ZvbGRlciBnZXRGb2xkZXIoSVBhdGggcGF0aCkgew0KLQkJcmV0dXJuIEJvb2ttYXJrVXRpbC5nZXRGb2xkZXIoYm9va21hcmtzLCBwYXRoKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgYWRkVXBkYXRlTW9kZWxDaGFuZ2VkTGlzdGVuZXIoSVVwZGF0ZU1vZGVsQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7DQotCQlpZiAoIWxpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpIA0KLQkJICAgbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7DQotCX0NCi0NCi0NCi0JcHVibGljIHZvaWQgcmVtb3ZlVXBkYXRlTW9kZWxDaGFuZ2VkTGlzdGVuZXIoSVVwZGF0ZU1vZGVsQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7DQotCQlpZiAobGlzdGVuZXJzLmNvbnRhaW5zKGxpc3RlbmVyKSkNCi0JCQlsaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgZmlyZU9iamVjdHNBZGRlZChPYmplY3QgcGFyZW50LCBPYmplY3QgW10gY2hpbGRyZW4pIHsNCi0JCWZvciAoSXRlcmF0b3IgaXRlcj1saXN0ZW5lcnMuaXRlcmF0b3IoKTsNCi0JCQkJaXRlci5oYXNOZXh0KCk7KSB7DQotCQkJSVVwZGF0ZU1vZGVsQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyID0gKElVcGRhdGVNb2RlbENoYW5nZWRMaXN0ZW5lcilpdGVyLm5leHQoKTsNCi0JCQlsaXN0ZW5lci5vYmplY3RzQWRkZWQocGFyZW50LCBjaGlsZHJlbik7DQotCQl9DQotCX0NCi0NCi0NCi0JcHVibGljIHZvaWQgZmlyZU9iamVjdHNSZW1vdmVkKE9iamVjdCBwYXJlbnQsIE9iamVjdCBbXSBjaGlsZHJlbikgew0KLQkJZm9yIChJdGVyYXRvciBpdGVyPWxpc3RlbmVycy5pdGVyYXRvcigpOw0KLQkJCQlpdGVyLmhhc05leHQoKTspIHsNCi0JCQlJVXBkYXRlTW9kZWxDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIgPSAoSVVwZGF0ZU1vZGVsQ2hhbmdlZExpc3RlbmVyKWl0ZXIubmV4dCgpOw0KLQkJCWxpc3RlbmVyLm9iamVjdHNSZW1vdmVkKHBhcmVudCwgY2hpbGRyZW4pOw0KLQkJfQ0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCBmaXJlT2JqZWN0Q2hhbmdlZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpIHsNCi0JCWZvciAoSXRlcmF0b3IgaXRlcj1saXN0ZW5lcnMuaXRlcmF0b3IoKTsNCi0JCQlpdGVyLmhhc05leHQoKTspIHsNCi0JCQlJVXBkYXRlTW9kZWxDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIgPSAoSVVwZGF0ZU1vZGVsQ2hhbmdlZExpc3RlbmVyKWl0ZXIubmV4dCgpOw0KLQkJCWxpc3RlbmVyLm9iamVjdENoYW5nZWQob2JqZWN0LCBwcm9wZXJ0eSk7DQotCQl9DQotCX0NCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGtleSkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNMaWNlbnNlKFBlbmRpbmdDaGFuZ2Ugam9iKSB7DQotCQlJRmVhdHVyZSBmZWF0dXJlID0gam9iLmdldEZlYXR1cmUoKTsNCi0JCXJldHVybiBoYXNMaWNlbnNlKGZlYXR1cmUpOw0KLQl9DQotCQ0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzTGljZW5zZShJRmVhdHVyZSBmZWF0dXJlKSB7DQotCQlJVVJMRW50cnkgaW5mbyA9IGZlYXR1cmUuZ2V0TGljZW5zZSgpOw0KLQkJaWYgKGluZm8gPT0gbnVsbCkNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQlTdHJpbmcgbGljZW5zZVR4dCA9IGluZm8uZ2V0QW5ub3RhdGlvbigpOw0KLQkJaWYgKGxpY2Vuc2VUeHQgPT0gbnVsbCkNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQlyZXR1cm4gbGljZW5zZVR4dC50cmltKCkubGVuZ3RoKCkgPiAwOw0KLQl9DQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNPcHRpb25hbEZlYXR1cmVzKElGZWF0dXJlUmVmZXJlbmNlIGZyZWYpIHsNCi0JCXRyeSB7DQotCQkJcmV0dXJuIGhhc09wdGlvbmFsRmVhdHVyZXMoZnJlZi5nZXRGZWF0dXJlKG51bGwpKTsNCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0JfQ0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzT3B0aW9uYWxGZWF0dXJlcyhJRmVhdHVyZSBmZWF0dXJlKSB7DQotCQl0cnkgew0KLQkJCUlJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VbXSBpcmVmcyA9IGZlYXR1cmUuZ2V0SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpOw0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXJlZnMubGVuZ3RoOyBpKyspIHsNCi0JCQkJSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZSBpcmVmID0gaXJlZnNbaV07DQotCQkJCWlmIChpcmVmLmlzT3B0aW9uYWwoKSkNCi0JCQkJCXJldHVybiB0cnVlOw0KLQkJCQkvLyBzZWUgaWYgaXQgaGFzIG9wdGlvbmFsIGNoaWxkcmVuDQotCQkJCUlGZWF0dXJlIGNoaWxkID0gaXJlZi5nZXRGZWF0dXJlKG51bGwpOw0KLQkJCQlpZiAoaGFzT3B0aW9uYWxGZWF0dXJlcyhjaGlsZCkpDQotCQkJCQlyZXR1cm4gdHJ1ZTsNCi0JCQl9DQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsNCi0JCX0NCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcGFnZXMvQ2F0ZWdvcnlQYWdlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcGFnZXMvQ2F0ZWdvcnlQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllYWU3MmQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3BhZ2VzL0NhdGVnb3J5UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkucGFnZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuZm9ybXMuQ2F0ZWdvcnlGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS52aWV3cy5EZXRhaWxzVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWwuKjsKLQotCi1wdWJsaWMgY2xhc3MgQ2F0ZWdvcnlQYWdlIGV4dGVuZHMgVXBkYXRlRm9ybVBhZ2UgewotCQotCXB1YmxpYyBDYXRlZ29yeVBhZ2UoRGV0YWlsc1ZpZXcgdmlldywgU3RyaW5nIHRpdGxlKSB7Ci0JCXN1cGVyKHZpZXcsIHRpdGxlKTsKLQl9Ci0JCi0JcHVibGljIElGb3JtIGNyZWF0ZUZvcm0oKSB7Ci0JCXJldHVybiBuZXcgQ2F0ZWdvcnlGb3JtKHRoaXMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wYWdlcy9EZXRhaWxzUGFnZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3BhZ2VzL0RldGFpbHNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyMjA0NTQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3BhZ2VzL0RldGFpbHNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wYWdlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5mb3Jtcy5EZXRhaWxzRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkudmlld3MuRGV0YWlsc1ZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsLio7Ci0KLQotcHVibGljIGNsYXNzIERldGFpbHNQYWdlIGV4dGVuZHMgVXBkYXRlRm9ybVBhZ2UgewotCQotCXB1YmxpYyBEZXRhaWxzUGFnZShEZXRhaWxzVmlldyB2aWV3LCBTdHJpbmcgdGl0bGUpIHsKLQkJc3VwZXIodmlldywgdGl0bGUpOwotCX0KLQkKLQlwdWJsaWMgSUZvcm0gY3JlYXRlRm9ybSgpIHsKLQkJcmV0dXJuIG5ldyBEZXRhaWxzRm9ybSh0aGlzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcGFnZXMvRGlzY292ZXJ5Rm9sZGVyUGFnZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3BhZ2VzL0Rpc2NvdmVyeUZvbGRlclBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg2Y2NkMy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcGFnZXMvRGlzY292ZXJ5Rm9sZGVyUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkucGFnZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuZm9ybXMuRGlzY292ZXJ5Rm9sZGVyRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkudmlld3MuRGV0YWlsc1ZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsLio7Ci0KLQotcHVibGljIGNsYXNzIERpc2NvdmVyeUZvbGRlclBhZ2UgZXh0ZW5kcyBVcGRhdGVGb3JtUGFnZSB7Ci0JCi0JcHVibGljIERpc2NvdmVyeUZvbGRlclBhZ2UoRGV0YWlsc1ZpZXcgdmlldywgU3RyaW5nIHRpdGxlKSB7Ci0JCXN1cGVyKHZpZXcsIHRpdGxlKTsKLQl9Ci0JCi0JcHVibGljIElGb3JtIGNyZWF0ZUZvcm0oKSB7Ci0JCXJldHVybiBuZXcgRGlzY292ZXJ5Rm9sZGVyRm9ybSh0aGlzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcGFnZXMvRXh0ZW5zaW9uUm9vdFBhZ2UuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wYWdlcy9FeHRlbnNpb25Sb290UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjgzNmY0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wYWdlcy9FeHRlbnNpb25Sb290UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkucGFnZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuZm9ybXMuRXh0ZW5zaW9uUm9vdEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnZpZXdzLkRldGFpbHNWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbC5JRm9ybTsKLQotCi1wdWJsaWMgY2xhc3MgRXh0ZW5zaW9uUm9vdFBhZ2UgZXh0ZW5kcyBVcGRhdGVGb3JtUGFnZSB7Ci0JCi0JcHVibGljIEV4dGVuc2lvblJvb3RQYWdlKERldGFpbHNWaWV3IHZpZXcsIFN0cmluZyB0aXRsZSkgewotCQlzdXBlcih2aWV3LCB0aXRsZSk7Ci0JfQotCQotCXB1YmxpYyBJRm9ybSBjcmVhdGVGb3JtKCkgewotCQlyZXR1cm4gbmV3IEV4dGVuc2lvblJvb3RGb3JtKHRoaXMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wYWdlcy9JVXBkYXRlRm9ybVBhZ2UuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wYWdlcy9JVXBkYXRlRm9ybVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM1YTQ4MS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcGFnZXMvSVVwZGF0ZUZvcm1QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkudmlld3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWwuSUZvcm1QYWdlOwotCi1wdWJsaWMgaW50ZXJmYWNlIElVcGRhdGVGb3JtUGFnZSBleHRlbmRzIElGb3JtUGFnZSB7Ci0JYm9vbGVhbiBjb250ZXh0TWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtYW5hZ2VyKTsKLQlJQWN0aW9uIGdldEFjdGlvbihTdHJpbmcgaWQpOwotCXZvaWQgb3BlblRvKE9iamVjdCBvYmplY3QpOwotCXZvaWQgcGVyZm9ybUdsb2JhbEFjdGlvbihTdHJpbmcgaWQpOwotCXZvaWQgdXBkYXRlKCk7Ci0Jdm9pZCBkaXNwb3NlKCk7Ci0Jdm9pZCBzZXRGb2N1cygpOwotCU11bHRpUGFnZVZpZXcgZ2V0VmlldygpOwotfQotCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcGFnZXMvSW5zdGFsbENvbmZpZ3VyYXRpb25QYWdlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcGFnZXMvSW5zdGFsbENvbmZpZ3VyYXRpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwMDBiMGYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3BhZ2VzL0luc3RhbGxDb25maWd1cmF0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkucGFnZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuZm9ybXMuSW5zdGFsbENvbmZpZ3VyYXRpb25Gb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS52aWV3cy5EZXRhaWxzVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWwuKjsKLQotCi1wdWJsaWMgY2xhc3MgSW5zdGFsbENvbmZpZ3VyYXRpb25QYWdlIGV4dGVuZHMgVXBkYXRlRm9ybVBhZ2UgewotCQotCXB1YmxpYyBJbnN0YWxsQ29uZmlndXJhdGlvblBhZ2UoRGV0YWlsc1ZpZXcgdmlldywgU3RyaW5nIHRpdGxlKSB7Ci0JCXN1cGVyKHZpZXcsIHRpdGxlKTsKLQl9Ci0JCi0JcHVibGljIElGb3JtIGNyZWF0ZUZvcm0oKSB7Ci0JCXJldHVybiBuZXcgSW5zdGFsbENvbmZpZ3VyYXRpb25Gb3JtKHRoaXMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wYWdlcy9JbnN0YWxsYWJsZVNpdGVQYWdlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcGFnZXMvSW5zdGFsbGFibGVTaXRlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDEzYWE0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wYWdlcy9JbnN0YWxsYWJsZVNpdGVQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wYWdlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5mb3Jtcy5JbnN0YWxsYWJsZVNpdGVGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS52aWV3cy5EZXRhaWxzVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWwuKjsKLQotCi1wdWJsaWMgY2xhc3MgSW5zdGFsbGFibGVTaXRlUGFnZSBleHRlbmRzIFVwZGF0ZUZvcm1QYWdlIHsKLQkKLQlwdWJsaWMgSW5zdGFsbGFibGVTaXRlUGFnZShEZXRhaWxzVmlldyB2aWV3LCBTdHJpbmcgdGl0bGUpIHsKLQkJc3VwZXIodmlldywgdGl0bGUpOwotCX0KLQkKLQlwdWJsaWMgSUZvcm0gY3JlYXRlRm9ybSgpIHsKLQkJcmV0dXJuIG5ldyBJbnN0YWxsYWJsZVNpdGVGb3JtKHRoaXMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wYWdlcy9Mb2NhbFNpdGVQYWdlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcGFnZXMvTG9jYWxTaXRlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2RhMjYxLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wYWdlcy9Mb2NhbFNpdGVQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wYWdlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5mb3Jtcy5Mb2NhbFNpdGVGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS52aWV3cy5EZXRhaWxzVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWwuKjsKLQotCi1wdWJsaWMgY2xhc3MgTG9jYWxTaXRlUGFnZSBleHRlbmRzIFVwZGF0ZUZvcm1QYWdlIHsKLQkKLQlwdWJsaWMgTG9jYWxTaXRlUGFnZShEZXRhaWxzVmlldyB2aWV3LCBTdHJpbmcgdGl0bGUpIHsKLQkJc3VwZXIodmlldywgdGl0bGUpOwotCX0KLQkKLQlwdWJsaWMgSUZvcm0gY3JlYXRlRm9ybSgpIHsKLQkJcmV0dXJuIG5ldyBMb2NhbFNpdGVGb3JtKHRoaXMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wYWdlcy9NYWluUGFnZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3BhZ2VzL01haW5QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4NjlmODguLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3BhZ2VzL01haW5QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wYWdlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5mb3Jtcy5NYWluRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkudmlld3MuRGV0YWlsc1ZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsLio7Ci0KLQotcHVibGljIGNsYXNzIE1haW5QYWdlIGV4dGVuZHMgVXBkYXRlRm9ybVBhZ2UgewotCQotCXB1YmxpYyBNYWluUGFnZShEZXRhaWxzVmlldyB2aWV3LCBTdHJpbmcgdGl0bGUpIHsKLQkJc3VwZXIodmlldywgdGl0bGUpOwotCX0KLQkKLQlwdWJsaWMgSUZvcm0gY3JlYXRlRm9ybSgpIHsKLQkJcmV0dXJuIG5ldyBNYWluRm9ybSh0aGlzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcGFnZXMvTXVsdGlwbGVTZWxlY3Rpb25QYWdlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcGFnZXMvTXVsdGlwbGVTZWxlY3Rpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjZThhMGUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3BhZ2VzL011bHRpcGxlU2VsZWN0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkucGFnZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuZm9ybXMuTXVsdGlwbGVTZWxlY3Rpb25Gb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS52aWV3cy5EZXRhaWxzVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWwuSUZvcm07Ci0KLQotcHVibGljIGNsYXNzIE11bHRpcGxlU2VsZWN0aW9uUGFnZSBleHRlbmRzIFVwZGF0ZUZvcm1QYWdlIHsKLQkKLQlwdWJsaWMgTXVsdGlwbGVTZWxlY3Rpb25QYWdlKERldGFpbHNWaWV3IHZpZXcsIFN0cmluZyB0aXRsZSkgewotCQlzdXBlcih2aWV3LCB0aXRsZSk7Ci0JfQotCQotCXB1YmxpYyBJRm9ybSBjcmVhdGVGb3JtKCkgewotCQlyZXR1cm4gbmV3IE11bHRpcGxlU2VsZWN0aW9uRm9ybSh0aGlzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcGFnZXMvTXlDb21wdXRlclBhZ2UuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wYWdlcy9NeUNvbXB1dGVyUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjQwNjJmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wYWdlcy9NeUNvbXB1dGVyUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkucGFnZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuZm9ybXMuTXlDb21wdXRlckZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnZpZXdzLkRldGFpbHNWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbC4qOwotCi0KLXB1YmxpYyBjbGFzcyBNeUNvbXB1dGVyUGFnZSBleHRlbmRzIFVwZGF0ZUZvcm1QYWdlIHsKLQkKLQlwdWJsaWMgTXlDb21wdXRlclBhZ2UoRGV0YWlsc1ZpZXcgdmlldywgU3RyaW5nIHRpdGxlKSB7Ci0JCXN1cGVyKHZpZXcsIHRpdGxlKTsKLQl9Ci0JCi0JcHVibGljIElGb3JtIGNyZWF0ZUZvcm0oKSB7Ci0JCXJldHVybiBuZXcgTXlDb21wdXRlckZvcm0odGhpcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3BhZ2VzL1NlYXJjaFBhZ2UuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wYWdlcy9TZWFyY2hQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyODk1YmUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3BhZ2VzL1NlYXJjaFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnBhZ2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLmZvcm1zLlNlYXJjaEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnZpZXdzLkRldGFpbHNWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbC4qOwotCi0KLXB1YmxpYyBjbGFzcyBTZWFyY2hQYWdlIGV4dGVuZHMgVXBkYXRlRm9ybVBhZ2UgewotCQotCXB1YmxpYyBTZWFyY2hQYWdlKERldGFpbHNWaWV3IHZpZXcsIFN0cmluZyB0aXRsZSkgewotCQlzdXBlcih2aWV3LCB0aXRsZSk7Ci0JfQotCQotCXB1YmxpYyBJRm9ybSBjcmVhdGVGb3JtKCkgewotCQlyZXR1cm4gbmV3IFNlYXJjaEZvcm0odGhpcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3BhZ2VzL1NpdGVQYWdlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcGFnZXMvU2l0ZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThlYTgzYS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcGFnZXMvU2l0ZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnBhZ2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLmZvcm1zLlNpdGVGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS52aWV3cy5EZXRhaWxzVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWwuKjsKLQotCi1wdWJsaWMgY2xhc3MgU2l0ZVBhZ2UgZXh0ZW5kcyBVcGRhdGVGb3JtUGFnZSB7Ci0JCi0JcHVibGljIFNpdGVQYWdlKERldGFpbHNWaWV3IHZpZXcsIFN0cmluZyB0aXRsZSkgewotCQlzdXBlcih2aWV3LCB0aXRsZSk7Ci0JfQotCQotCXB1YmxpYyBJRm9ybSBjcmVhdGVGb3JtKCkgewotCQlyZXR1cm4gbmV3IFNpdGVGb3JtKHRoaXMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wYWdlcy9Vbmtub3duT2JqZWN0UGFnZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3BhZ2VzL1Vua25vd25PYmplY3RQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4MDZkZGQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3BhZ2VzL1Vua25vd25PYmplY3RQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wYWdlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5mb3Jtcy5Vbmtub3duT2JqZWN0Rm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkudmlld3MuRGV0YWlsc1ZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsLio7Ci0KLQotcHVibGljIGNsYXNzIFVua25vd25PYmplY3RQYWdlIGV4dGVuZHMgVXBkYXRlRm9ybVBhZ2UgewotCQotCXB1YmxpYyBVbmtub3duT2JqZWN0UGFnZShEZXRhaWxzVmlldyB2aWV3LCBTdHJpbmcgdGl0bGUpIHsKLQkJc3VwZXIodmlldywgdGl0bGUpOwotCX0KLQkKLQlwdWJsaWMgSUZvcm0gY3JlYXRlRm9ybSgpIHsKLQkJcmV0dXJuIG5ldyBVbmtub3duT2JqZWN0Rm9ybSh0aGlzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcGFnZXMvVXBkYXRlRm9ybVBhZ2UuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wYWdlcy9VcGRhdGVGb3JtUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjkxNGRiLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wYWdlcy9VcGRhdGVGb3JtUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnBhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS52aWV3cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLio7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFVwZGF0ZUZvcm1QYWdlIGltcGxlbWVudHMgSVVwZGF0ZUZvcm1QYWdlIHsKLQlwcml2YXRlIElGb3JtIGZvcm07Ci0JcHJpdmF0ZSBNdWx0aVBhZ2VWaWV3IHZpZXc7Ci0JcHJpdmF0ZSBTdHJpbmcgdGl0bGU7Ci0JcHJpdmF0ZSBDb250cm9sIGNvbnRyb2w7Ci0KLXB1YmxpYyBVcGRhdGVGb3JtUGFnZShNdWx0aVBhZ2VWaWV3IHZpZXcsIFN0cmluZyB0aXRsZSkgewotCXRoaXMudmlldyA9IHZpZXc7Ci0JZm9ybSA9IGNyZWF0ZUZvcm0oKTsKLQl0aGlzLnRpdGxlID0gdGl0bGU7Ci19Ci0KLXB1YmxpYyBib29sZWFuIGJlY29tZXNJbnZpc2libGUoSUZvcm1QYWdlIG5ld1BhZ2UpIHsKLQlyZXR1cm4gdHJ1ZTsKLX0KLQotcHVibGljIHZvaWQgYmVjb21lc1Zpc2libGUoSUZvcm1QYWdlIG9sZFBhZ2UpIHsKLQl1cGRhdGUoKTsKLQkvL3NldEZvY3VzKCk7Ci19Ci0KLXB1YmxpYyBib29sZWFuIGNvbnRleHRNZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1hbmFnZXIpIHsKLQlyZXR1cm4gdHJ1ZTsKLX0KLQotcHJvdGVjdGVkIGFic3RyYWN0IElGb3JtIGNyZWF0ZUZvcm0oKTsKLQotcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JY29udHJvbCA9IGZvcm0uY3JlYXRlQ29udHJvbChwYXJlbnQpOwotCWNvbnRyb2wuc2V0TWVudSh2aWV3LmdldENvbnRleHRNZW51KCkpOwotCWZvcm0uaW5pdGlhbGl6ZShudWxsKTsKLX0KLQotcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQlmb3JtLmRpc3Bvc2UoKTsKLX0KLQotcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpIHsKLQlyZXR1cm4gY29udHJvbDsKLX0KLQotcHVibGljIE11bHRpUGFnZVZpZXcgZ2V0VmlldygpIHsKLQlyZXR1cm4gdmlldzsKLX0KLQotcHVibGljIElGb3JtIGdldEZvcm0oKSB7Ci0JcmV0dXJuIGZvcm07Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JcmV0dXJuIHRpdGxlOwotfQotCi1wdWJsaWMgU3RyaW5nIGdldFRpdGxlKCkgewotCXJldHVybiB0aXRsZTsKLX0KLQotcHVibGljIGJvb2xlYW4gaXNTb3VyY2UoKSB7Ci0JcmV0dXJuIGZhbHNlOwotfQotCi1wdWJsaWMgYm9vbGVhbiBpc1Zpc2libGUoKSB7Ci0JcmV0dXJuIGdldFZpZXcoKS5nZXRDdXJyZW50UGFnZSgpPT10aGlzOwotfQotCi1wdWJsaWMgdm9pZCBvcGVuVG8oT2JqZWN0IG9iamVjdCkgewotCWdldEZvcm0oKS5leHBhbmRUbyhvYmplY3QpOwotfQotCi1wdWJsaWMgSUFjdGlvbiBnZXRBY3Rpb24oU3RyaW5nIGlkKSB7Ci0JcmV0dXJuIHZpZXcuZ2V0QWN0aW9uKGlkKTsKLX0KLQotcHVibGljIHZvaWQgcGVyZm9ybUdsb2JhbEFjdGlvbihTdHJpbmcgaWQpIHsKLQlnZXRGb3JtKCkuZG9HbG9iYWxBY3Rpb24oaWQpOwotfQotCi1wdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQlnZXRGb3JtKCkuc2V0Rm9jdXMoKTsKLX0KLQotcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQlyZXR1cm4gdGl0bGU7Ci19Ci0KLXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQlmb3JtLnVwZGF0ZSgpOwotfQotCi19Ci0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wYXJ0cy9BYm91dEluZm8uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wYXJ0cy9BYm91dEluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE0NGNmNy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcGFydHMvQWJvdXRJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkucGFydHM7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydHlSZXNvdXJjZUJ1bmRsZTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLkNSQzMyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQbHVnaW5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW5WZXJzaW9uSWRlbnRpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuTmV3Q29uZmlndXJhdGlvbkluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuV29ya2JlbmNoTWVzc2FnZXM7Ci0KLS8qKgotICogVGhlIGFib3V0IGluZm8gY2xhc3M7Ci0gKiA8cD4KLSAqIFRoZSBpbmZvcm1hdGlvbiB3aXRoaW4gdGhpcyBvYmplY3QgaXMgb2J0YWluZWQgZnJvbSB0aGUgYWJvdXQgImluaSIgZmlsZSIuCi0gKiBUaGlzIGZpbGUgcmVzaWRlcyB3aXRoaW4gYW4gaW5zdGFsbCBjb25maWd1cmF0aW9ucyBkaXJlY3RvcnkgYW5kIG11c3QgYmUgYSAKLSAqIHN0YW5kYXJkIGphdmEgcHJvcGVydHkgZmlsZS4gIAotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgQWJvdXRJbmZvIGV4dGVuZHMgTmV3Q29uZmlndXJhdGlvbkluZm8gewotCi0JcHJpdmF0ZSBTdHJpbmcgYXBwTmFtZTsKLQlwcml2YXRlIEltYWdlRGVzY3JpcHRvciB3aW5kb3dJbWFnZTsKLQlwcml2YXRlIEltYWdlRGVzY3JpcHRvciBhYm91dEltYWdlOwotCXByaXZhdGUgSW1hZ2VEZXNjcmlwdG9yIGZlYXR1cmVJbWFnZTsKLQlwcml2YXRlIFN0cmluZyBhYm91dFRleHQ7Ci0JcHJpdmF0ZSBVUkwgd2VsY29tZVBhZ2VVUkw7Ci0JcHJpdmF0ZSBTdHJpbmcgd2VsY29tZVBlcnNwZWN0aXZlOwotCXByaXZhdGUgU3RyaW5nIHRpcHNBbmRUcmlja3NIcmVmOwotCXByaXZhdGUgU3RyaW5nIGZlYXR1cmVJbWFnZU5hbWU7Ci0JcHJpdmF0ZSBMb25nIGZlYXR1cmVJbWFnZUNSQzsKLQlwcml2YXRlIGJvb2xlYW4gY2FsY3VsYXRlZEltYWdlQ1JDID0gZmFsc2U7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IEJZVEVfQVJSQVlfU0laRSA9IDIwNDg7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBhYm91dCBpbmZvLgotCSAqLwotCXB1YmxpYyBBYm91dEluZm8oU3RyaW5nIGZlYXR1cmVJZCwgUGx1Z2luVmVyc2lvbklkZW50aWZpZXIgdmVyc2lvbklkKSB7Ci0JCXN1cGVyKGZlYXR1cmVJZCwgdmVyc2lvbklkLCAiYWJvdXQuaW5pIiwgImFib3V0LnByb3BlcnRpZXMiLCAiYWJvdXQubWFwcGluZ3MiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkZXNjcmlwdG9yIGZvciBhbiBpbWFnZSB3aGljaCBjYW4gYmUgc2hvd24gaW4gYW4gImFib3V0IiBkaWFsb2cgCi0JICogZm9yIHRoaXMgcHJvZHVjdC4KLQkgKiBQcm9kdWN0cyBkZXNpZ25lZCB0byBydW4gImhlYWRsZXNzIiB0eXBpY2FsbHkgd291bGQgbm90IGhhdmUgc3VjaCBhbiBpbWFnZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBkZXNjcmlwdG9yIGZvciBhbiBhYm91dCBpbWFnZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqLwotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0QWJvdXRJbWFnZSgpIHsKLQkJcmV0dXJuIGFib3V0SW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVzY3JpcHRvciBmb3IgYW4gaW1hZ2Ugd2hpY2ggY2FuIGJlIHNob3duIGluIGFuICJhYm91dCBmZWF0dXJlcyIgCi0JICogZGlhbG9nLgotCSAqIFByb2R1Y3RzIGRlc2lnbmVkIHRvIHJ1biAiaGVhZGxlc3MiIHR5cGljYWxseSB3b3VsZCBub3QgaGF2ZSBzdWNoIGFuIGltYWdlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGRlc2NyaXB0b3IgZm9yIGEgZmVhdHVyZSBpbWFnZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqLwotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0RmVhdHVyZUltYWdlKCkgewotCQlyZXR1cm4gZmVhdHVyZUltYWdlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGZlYXR1cmUgaW1hZ2UgYXMgc3VwcGxpZWQgaW4gdGhlIHByb3BlcnRpZXMgZmlsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBmZWF0dXJlIGltYWdlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGZWF0dXJlSW1hZ2VOYW1lKCkgewotCQlyZXR1cm4gZmVhdHVyZUltYWdlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBDUkMgb2YgdGhlIGZlYXR1cmUgaW1hZ2UgYXMgc3VwcGxpZWQgaW4gdGhlIHByb3BlcnRpZXMgZmlsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBDUkMgb2YgdGhlIGZlYXR1cmUgaW1hZ2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKi8KLQlwdWJsaWMgTG9uZyBnZXRGZWF0dXJlSW1hZ2VDUkMoKSB7Ci0JCWlmICghY2FsY3VsYXRlZEltYWdlQ1JDICYmIGZlYXR1cmVJbWFnZU5hbWUgIT0gbnVsbCkgewotCQkJZmVhdHVyZUltYWdlQ1JDID0gY2FsY3VsYXRlRmVhdHVyZUltYWdlQ1JDKCk7Ci0JCQljYWxjdWxhdGVkSW1hZ2VDUkMgPSB0cnVlOwotCQl9Ci0JCXJldHVybiBmZWF0dXJlSW1hZ2VDUkM7Ci0JfQotCi0JLyoqCi0JICogQ2FsY3VsYXRlIGEgQ1JDIGZvciB0aGUgZmVhdHVyZSBpbWFnZQotCSAqLwotCXByaXZhdGUgTG9uZyBjYWxjdWxhdGVGZWF0dXJlSW1hZ2VDUkMoKSB7Ci0JCVVSTCB1cmwgPSBudWxsOwotCQlpZiAoZmVhdHVyZUltYWdlTmFtZSAhPSBudWxsKSB7Ci0JCQlJUGx1Z2luRGVzY3JpcHRvciBkZXNjID0gZ2V0RGVzY3JpcHRvcigpOwotCQkJaWYoZGVzYyA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJdXJsID0gZGVzYy5maW5kKG5ldyBQYXRoKCIkbmwkIikuYXBwZW5kKGZlYXR1cmVJbWFnZU5hbWUpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmICh1cmwgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkvLyBHZXQgdGhlIGltYWdlIGJ5dGVzCi0JCUlucHV0U3RyZWFtIGluID0gbnVsbDsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpbiA9IHVybC5vcGVuU3RyZWFtKCk7CQotCQkJb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQkJYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlW0JZVEVfQVJSQVlfU0laRV07Ci0JCQlpbnQgcmVhZFJlc3VsdCA9IEJZVEVfQVJSQVlfU0laRTsKLQkJCXdoaWxlIChyZWFkUmVzdWx0ID09IEJZVEVfQVJSQVlfU0laRSkgewotCQkJCXJlYWRSZXN1bHQgPSBpbi5yZWFkKGJ1ZmZlcik7Ci0JCQkJaWYgKHJlYWRSZXN1bHQgPiAwKSAKLQkJCQkJb3V0LndyaXRlKGJ1ZmZlciwgMCwgcmVhZFJlc3VsdCk7Ci0JCQl9Ci0JCQlieXRlW10gY29udGVudHMgPSBvdXQudG9CeXRlQXJyYXkoKTsKLQkJCS8vIENhbGN1bGF0ZSB0aGUgY3JjCi0JCQlDUkMzMiBjcmMgPSBuZXcgQ1JDMzIoKTsKLQkJCWNyYy51cGRhdGUoY29udGVudHMpOwotCQkJcmV0dXJuIG5ldyBMb25nKGNyYy5nZXRWYWx1ZSgpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoaW4gIT0gbnVsbCkKLQkJCQl0cnkgewotCQkJCQlpbi5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQlpZiAob3V0ICE9IG51bGwpCi0JCQkJdHJ5IHsKLQkJCQkJb3V0LmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCX0KLQkJfQotCX0JCi0JCQotCi0JLyoqCi0JICogUmV0dXJucyBhIGxhYmVsIGZvciB0aGUgZmVhdHVyZSwgd2UgdXNlIHRoZSBkZXNjcmlwdG9yIGxhYmVsCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGZWF0dXJlTGFiZWwoKSB7Ci0JCWlmIChnZXREZXNjcmlwdG9yKCkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gZ2V0RGVzY3JpcHRvcigpLmdldExhYmVsKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGV4dCB0byBzaG93IGluIGFuICJhYm91dCIgZGlhbG9nIGZvciB0aGlzIHByb2R1Y3QuCi0JICogUHJvZHVjdHMgZGVzaWduZWQgdG8gcnVuICJoZWFkbGVzcyIgdHlwaWNhbGx5IHdvdWxkIG5vdCBoYXZlIHN1Y2ggdGV4dC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhYm91dCB0ZXh0LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBYm91dFRleHQoKSB7Ci0JCXJldHVybiBhYm91dFRleHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYXBwIG5hbWUgb3IgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogTm90ZSB0aGlzIGlzIG5ldmVyIHNob3duIHRvIHRoZSB1c2VyLgotCSAqIEl0IGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgU1dUIERpc3BsYXkuCi0JICogPHA+Ci0JICogT24gTW90aWYsIGZvciBleGFtcGxlLCB0aGlzIGNhbiBiZSB1c2VkCi0JICogdG8gc2V0IHRoZSBuYW1lIHVzZWQgZm9yIHJlc291cmNlIGxvb2t1cC4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcmV0dXJuIHRoZSBhcHAgbmFtZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXkjc2V0QXBwTmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXBwTmFtZSgpIHsKLQkJcmV0dXJuIGFwcE5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcHJvZHVjdCBuYW1lIG9yIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIFRoaXMgaXMgc2hvd24gaW4gdGhlIHdpbmRvdyB0aXRsZSBhbmQgdGhlIEFib3V0IGFjdGlvbi4KLQkgKgotCSAqIEByZXR1cm4gdGhlIHByb2R1Y3QgbmFtZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb2R1Y3ROYW1lKCkgewotCQlJUGx1Z2luRGVzY3JpcHRvciBkZXNjID0gZ2V0RGVzY3JpcHRvcigpOwotCQlpZiAoZGVzYyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBkZXNjLmdldExhYmVsKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcHJvdmlkZXIgbmFtZSBvciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKgotCSAqIEByZXR1cm4gdGhlIHByb3ZpZGVyIG5hbWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm92aWRlck5hbWUoKSB7Ci0JCUlQbHVnaW5EZXNjcmlwdG9yIGRlc2MgPSBnZXREZXNjcmlwdG9yKCk7Ci0JCWlmIChkZXNjID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGRlc2MuZ2V0UHJvdmlkZXJOYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmVyc2lvbiBvciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKgotCSAqIEByZXR1cm4gdGhlIHZlcnNpb24sIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgewotCQlQbHVnaW5WZXJzaW9uSWRlbnRpZmllciB2ZXJzaW9uSWQgPSBnZXRWZXJzaW9uSWQoKTsKLQkJaWYgKHZlcnNpb25JZCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiB2ZXJzaW9uSWQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgPGNvZGU+VVJMPC9jb2RlPiBmb3IgdGhlIHdlbGNvbWUgcGFnZS4KLQkgKiBQcm9kdWN0cyBkZXNpZ25lZCB0byBydW4gImhlYWRsZXNzIiB0eXBpY2FsbHkgd291bGQgbm90IGhhdmUgc3VjaCBhbiBwYWdlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHdlbGNvbWUgcGFnZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqLwotCXB1YmxpYyBVUkwgZ2V0V2VsY29tZVBhZ2VVUkwoKSB7Ci0JCXJldHVybiB3ZWxjb21lUGFnZVVSTDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpZCBvZiBhIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRvIHNob3cgdGhlIHdlbGNvbWUgcGFnZS4KLQkgKiBNYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogCi0JICogQHJldHVybiB0aGUgd2VsY29tZSBwYWdlIHBlcnNwZWN0aXZlIGlkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRXZWxjb21lUGVyc3BlY3RpdmUoKSB7Ci0JCXJldHVybiB3ZWxjb21lUGVyc3BlY3RpdmU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIDxjb2RlPlN0cmluZzwvY29kZT4gZm9yIHRoZSB0aXBzIGFuZCB0cmljayBocmVmLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRpcHMgYW5kIHRyaWNrcyBocmVmLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUaXBzQW5kVHJpY2tzSHJlZigpIHsKLQkJcmV0dXJuIHRpcHNBbmRUcmlja3NIcmVmOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGltYWdlIGRlc2NyaXB0b3IgZm9yIHRoZSB3aW5kb3cgaW1hZ2UgdG8gdXNlIGZvciB0aGlzIHByb2R1Y3QuCi0JICogUHJvZHVjdHMgZGVzaWduZWQgdG8gcnVuICJoZWFkbGVzcyIgdHlwaWNhbGx5IHdvdWxkIG5vdCBoYXZlIHN1Y2ggYW4gaW1hZ2UuCi0JICogCi0JICogQHJldHVybiB0aGUgaW1hZ2UgZGVzY3JpcHRvciBmb3IgdGhlIHdpbmRvdyBpbWFnZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqLwotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0V2luZG93SW1hZ2UoKSB7Ci0JCXJldHVybiB3aW5kb3dJbWFnZTsKLQl9Ci0JCi0JLyoqCi0JICogUmVhZHMgdGhlIGluaSBmaWxlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlYWRJTklGaWxlKFVSTCBpbmlVUkwsIFVSTCBwcm9wZXJ0aWVzVVJMLCBVUkwgbWFwcGluZ3NVUkwpCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQlQcm9wZXJ0aWVzIGluaSA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCUlucHV0U3RyZWFtIGlzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlzID0gaW5pVVJMLm9wZW5TdHJlYW0oKTsKLQkJCWluaS5sb2FkKGlzKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJcmVwb3J0SU5JRmFpbHVyZShlLCAiQ2Fubm90IHJlYWQgYWJvdXQgaW5mbyBmaWxlICIgKyBpbmlVUkwpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWlmIChpcyAhPSBudWxsKQotCQkJCQlpcy5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0KLQkJUHJvcGVydHlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBudWxsOwotCi0JCWlmIChwcm9wZXJ0aWVzVVJMICE9IG51bGwpIHsKLQkJCUlucHV0U3RyZWFtIGJ1bmRsZVN0cmVhbSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWJ1bmRsZVN0cmVhbSA9IHByb3BlcnRpZXNVUkwub3BlblN0cmVhbSgpOwotCQkJCWJ1bmRsZSA9IG5ldyBQcm9wZXJ0eVJlc291cmNlQnVuZGxlKGJ1bmRsZVN0cmVhbSk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJcmVwb3J0SU5JRmFpbHVyZShlLCAiQ2Fubm90IHJlYWQgYWJvdXQgcHJvcGVydGllcyBmaWxlICIgKyBwcm9wZXJ0aWVzVVJMKTsgIC8vJE5PTi1OTFMtMSQKLQkJCQlidW5kbGUgPSBudWxsOwotCQkJfSBmaW5hbGx5IHsKLQkJCQl0cnkgewotCQkJCQlpZiAoYnVuZGxlU3RyZWFtICE9IG51bGwpCi0JCQkJCQlidW5kbGVTdHJlYW0uY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJUHJvcGVydHlSZXNvdXJjZUJ1bmRsZSBtYXBwaW5nc0J1bmRsZSA9IG51bGw7Ci0KLQkJaWYgKG1hcHBpbmdzVVJMICE9IG51bGwpIHsKLQkJCUlucHV0U3RyZWFtIGJ1bmRsZVN0cmVhbSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWJ1bmRsZVN0cmVhbSA9IG1hcHBpbmdzVVJMLm9wZW5TdHJlYW0oKTsKLQkJCQltYXBwaW5nc0J1bmRsZSA9IG5ldyBQcm9wZXJ0eVJlc291cmNlQnVuZGxlKGJ1bmRsZVN0cmVhbSk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJcmVwb3J0SU5JRmFpbHVyZShlLCAiQ2Fubm90IHJlYWQgYWJvdXQgbWFwcGluZ3MgZmlsZSAiICsgbWFwcGluZ3NVUkwpOyAgLy8kTk9OLU5MUy0xJAotCQkJCW1hcHBpbmdzQnVuZGxlID0gbnVsbDsKLQkJCX0gZmluYWxseSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKGJ1bmRsZVN0cmVhbSAhPSBudWxsKQotCQkJCQkJYnVuZGxlU3RyZWFtLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIENyZWF0ZSB0aGUgbWFwcGluZ3MgYXJyYXkKLQkJQXJyYXlMaXN0IG1hcHBpbmdzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKG1hcHBpbmdzQnVuZGxlICE9IG51bGwpIHsKLQkJCWJvb2xlYW4gZm91bmQgPSB0cnVlOwotCQkJU3RyaW5nIHJlYWRWYWx1ZTsKLQkJCWludCBpID0gMDsKLQkJCXdoaWxlIChmb3VuZCkgewotCQkJCXRyeSB7Ci0JCQkJCS8vIFN1YnN0aXR1dGUgJGZlYXR1cmVWZXJzaW9uIGlmIEFwcGxpY2FibGUKLQkJCQkJcmVhZFZhbHVlID0gbWFwcGluZ3NCdW5kbGUuZ2V0U3RyaW5nKEludGVnZXIudG9TdHJpbmcoaSkpOwotCQkJCQlpZigiJGZlYXR1cmVWZXJzaW9uIi5lcXVhbHMocmVhZFZhbHVlKSkgeyAgLy8kTk9OLU5MUy0xJAotCQkJCQkJcmVhZFZhbHVlID0gZ2V0VmVyc2lvbigpOwotCQkJCQkJaWYgKHJlYWRWYWx1ZSA9PSBudWxsKQotCQkJCQkJCXJlYWRWYWx1ZSA9IFdvcmtiZW5jaE1lc3NhZ2VzLmdldFN0cmluZygiQWJvdXREaWFsb2cubm90U3BlY2lmaWVkIik7IC8vJE5PTi1OTFMtMSQJCQkJCQkKLQkJCQkJfQotCQkJCQltYXBwaW5nc0xpc3QuYWRkKHJlYWRWYWx1ZSk7Ci0JCQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCQkJZm91bmQgPSBmYWxzZTsKLQkJCQl9Ci0JCQkJaSsrOwotCQkJfQotCQl9Ci0JCVN0cmluZ1tdIG1hcHBpbmdzQXJyYXkgPSAoU3RyaW5nW10pbWFwcGluZ3NMaXN0LnRvQXJyYXkobmV3IFN0cmluZ1ttYXBwaW5nc0xpc3Quc2l6ZSgpXSk7Ci0KLQkJSGFzaHRhYmxlIHJ1bnRpbWVNYXBwaW5ncyAgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCVN0cmluZyBmZWF0dXJlVmVyc2lvbiA9IGdldFZlcnNpb24oKTsKLQkJaWYgKGZlYXR1cmVWZXJzaW9uPT1udWxsKQotCQkJZmVhdHVyZVZlcnNpb249V29ya2JlbmNoTWVzc2FnZXMuZ2V0U3RyaW5nKCJBYm91dERpYWxvZy5ub3RTcGVjaWZpZWQiKTsgLy8kTk9OLU5MUy0xJAotCQlydW50aW1lTWFwcGluZ3MucHV0KCJ7ZmVhdHVyZVZlcnNpb259IiwgZmVhdHVyZVZlcnNpb24pOyAvLyROT04tTkxTLTEkCi0KLQkJd2luZG93SW1hZ2UgPSBnZXRJbWFnZShpbmksICJ3aW5kb3dJbWFnZSIpOyAvLyROT04tTkxTLTEkCi0KLQkJYWJvdXRUZXh0ID0gKFN0cmluZykgaW5pLmdldCgiYWJvdXRUZXh0Iik7IC8vJE5PTi1OTFMtMSQKLQkJYWJvdXRUZXh0ID0gZ2V0UmVzb3VyY2VTdHJpbmcoYWJvdXRUZXh0LCBidW5kbGUsIG1hcHBpbmdzQXJyYXksIHJ1bnRpbWVNYXBwaW5ncyk7Ci0JCQotCQlhYm91dEltYWdlID0gZ2V0SW1hZ2UoaW5pLCAiYWJvdXRJbWFnZSIpOyAvLyROT04tTkxTLTEkCi0KLQkJZmVhdHVyZUltYWdlTmFtZSA9IChTdHJpbmcpIGluaS5nZXQoImZlYXR1cmVJbWFnZSIpOyAvLyROT04tTkxTLTEkCi0JCWZlYXR1cmVJbWFnZSA9IGdldEltYWdlKGluaSwgImZlYXR1cmVJbWFnZSIpOyAvLyROT04tTkxTLTEkCi0KLQkJd2VsY29tZVBhZ2VVUkwgPSBnZXRVUkwoaW5pLCAid2VsY29tZVBhZ2UiKTsgLy8kTk9OLU5MUy0xJAotCQl3ZWxjb21lUGVyc3BlY3RpdmUgPSAoU3RyaW5nKSBpbmkuZ2V0KCJ3ZWxjb21lUGVyc3BlY3RpdmUiKTsgLy8kTk9OLU5MUy0xJAotCi0JCXRpcHNBbmRUcmlja3NIcmVmID0gKFN0cmluZykgaW5pLmdldCgidGlwc0FuZFRyaWNrc0hyZWYiKTsgLy8kTk9OLU5MUy0xJAotCi0JCWFwcE5hbWUgPSAoU3RyaW5nKSBpbmkuZ2V0KCJhcHBOYW1lIik7IC8vJE5PTi1OTFMtMSQKLQkJYXBwTmFtZSA9IGdldFJlc291cmNlU3RyaW5nKGFwcE5hbWUsIGJ1bmRsZSwgbWFwcGluZ3NBcnJheSwgbnVsbCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgVVJMIGZvciB0aGUgZ2l2ZW4ga2V5LCBvciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgVVJMIGZvciB0aGUgZ2l2ZW4ga2V5LCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXByaXZhdGUgVVJMIGdldFVSTChQcm9wZXJ0aWVzIGluaSwgU3RyaW5nIGtleSkgewotCQlVUkwgdXJsID0gbnVsbDsKLQkJU3RyaW5nIGZpbGVOYW1lID0gKFN0cmluZykgaW5pLmdldChrZXkpOwotCQlpZiAoZmlsZU5hbWUgIT0gbnVsbCkgewotCQkJSVBsdWdpbkRlc2NyaXB0b3IgZGVzYyA9IGdldERlc2NyaXB0b3IoKTsKLQkJCWlmKGRlc2MgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXVybCA9IGRlc2MuZmluZChuZXcgUGF0aChmaWxlTmFtZSkpOwotCQl9Ci0JCXJldHVybiB1cmw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBpbWFnZSBkZXNjcmlwdG9yIGZvciB0aGUgZ2l2ZW4ga2V5LCBvciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGltYWdlIGRlc2NyaXB0b3IgZm9yIHRoZSBnaXZlbiBrZXksIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2UoUHJvcGVydGllcyBpbmksIFN0cmluZyBrZXkpIHsKLQkJVVJMIHVybCA9IGdldFVSTChpbmksIGtleSk7Ci0JCWlmICh1cmwgIT0gbnVsbCkgewotCQkJcmV0dXJuIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKHVybCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3BhcnRzL0Fic3RyYWN0T3ZlcmxheUljb24uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wYXJ0cy9BYnN0cmFjdE92ZXJsYXlJY29uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4YTNlZGIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3BhcnRzL0Fic3RyYWN0T3ZlcmxheUljb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuQ29tcG9zaXRlSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLQotLyoqCi0gKiBBbiBPdmVybGF5SWNvbiBjb25zaXN0cyBvZiBhIG1haW4gaWNvbiBhbmQgc2V2ZXJhbCBhZG9ybm1lbnRzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RPdmVybGF5SWNvbiBleHRlbmRzIENvbXBvc2l0ZUltYWdlRGVzY3JpcHRvciB7Ci0KLQlzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfV0lEVEggPSAxNjsKLQlzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfSEVJR0hUID0gMTY7Ci0KLQlwcml2YXRlIFBvaW50IGZTaXplID0gbnVsbDsKLQotCXByaXZhdGUgSW1hZ2VEZXNjcmlwdG9yIGZPdmVybGF5c1tdW107Ci0KLQlwdWJsaWMgQWJzdHJhY3RPdmVybGF5SWNvbihJbWFnZURlc2NyaXB0b3JbXVtdIG92ZXJsYXlzKSB7Ci0JCXRoaXMob3ZlcmxheXMsIG51bGwpOwotCX0KLQotCXB1YmxpYyBBYnN0cmFjdE92ZXJsYXlJY29uKEltYWdlRGVzY3JpcHRvcltdW10gb3ZlcmxheXMsIFBvaW50IHNpemUpIHsKLQkJZk92ZXJsYXlzID0gb3ZlcmxheXM7Ci0JCWlmIChzaXplICE9IG51bGwpCi0JCQlmU2l6ZSA9IHNpemU7Ci0JCWVsc2UKLQkJCWZTaXplID0gbmV3IFBvaW50KERFRkFVTFRfV0lEVEgsIERFRkFVTFRfSEVJR0hUKTsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgZHJhd0JvdHRvbUxlZnQoSW1hZ2VEZXNjcmlwdG9yW10gb3ZlcmxheXMpIHsKLQkJaWYgKG92ZXJsYXlzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWludCBsZW5ndGggPSBvdmVybGF5cy5sZW5ndGg7Ci0JCWludCB4ID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJCWlmIChpIDwgbGVuZ3RoICYmIG92ZXJsYXlzW2ldICE9IG51bGwpIHsKLQkJCQlJbWFnZURhdGEgaWQgPSBvdmVybGF5c1tpXS5nZXRJbWFnZURhdGEoKTsKLQkJCQlkcmF3SW1hZ2UoaWQsIHgsIGdldFNpemUoKS55IC0gaWQuaGVpZ2h0KTsKLQkJCQl4ICs9IGlkLndpZHRoOwotCQkJfQotCQl9Ci0JfQotCXByb3RlY3RlZCB2b2lkIGRyYXdCb3R0b21SaWdodChJbWFnZURlc2NyaXB0b3JbXSBvdmVybGF5cykgewotCQlpZiAob3ZlcmxheXMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaW50IGxlbmd0aCA9IG92ZXJsYXlzLmxlbmd0aDsKLQkJaW50IHggPSBnZXRTaXplKCkueDsKLQkJZm9yIChpbnQgaSA9IDI7IGkgPj0gMDsgaS0tKSB7Ci0JCQlpZiAoaSA8IGxlbmd0aCAmJiBvdmVybGF5c1tpXSAhPSBudWxsKSB7Ci0JCQkJSW1hZ2VEYXRhIGlkID0gb3ZlcmxheXNbaV0uZ2V0SW1hZ2VEYXRhKCk7Ci0JCQkJeCAtPSBpZC53aWR0aDsKLQkJCQlkcmF3SW1hZ2UoaWQsIHgsIGdldFNpemUoKS55IC0gaWQuaGVpZ2h0KTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBJbWFnZURhdGEgZ2V0QmFzZUltYWdlRGF0YSgpOwotCi0JcHJvdGVjdGVkIHZvaWQgZHJhd0NvbXBvc2l0ZUltYWdlKGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCQlJbWFnZURhdGEgYmFzZSA9IGdldEJhc2VJbWFnZURhdGEoKTsKLQkJZHJhd0ltYWdlKGJhc2UsIDAsIDApOwotCQlpZiAoZk92ZXJsYXlzICE9IG51bGwpIHsKLQkJCWlmIChmT3ZlcmxheXMubGVuZ3RoID4gMCkKLQkJCQlkcmF3VG9wUmlnaHQoZk92ZXJsYXlzWzBdKTsKLQotCQkJaWYgKGZPdmVybGF5cy5sZW5ndGggPiAxKQotCQkJCWRyYXdCb3R0b21SaWdodChmT3ZlcmxheXNbMV0pOwotCi0JCQlpZiAoZk92ZXJsYXlzLmxlbmd0aCA+IDIpCi0JCQkJZHJhd0JvdHRvbUxlZnQoZk92ZXJsYXlzWzJdKTsKLQotCQkJaWYgKGZPdmVybGF5cy5sZW5ndGggPiAzKQotCQkJCWRyYXdUb3BMZWZ0KGZPdmVybGF5c1szXSk7Ci0JCX0KLQl9Ci0JcHJvdGVjdGVkIHZvaWQgZHJhd1RvcExlZnQoSW1hZ2VEZXNjcmlwdG9yW10gb3ZlcmxheXMpIHsKLQkJaWYgKG92ZXJsYXlzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWludCBsZW5ndGggPSBvdmVybGF5cy5sZW5ndGg7Ci0JCWludCB4ID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJCWlmIChpIDwgbGVuZ3RoICYmIG92ZXJsYXlzW2ldICE9IG51bGwpIHsKLQkJCQlJbWFnZURhdGEgaWQgPSBvdmVybGF5c1tpXS5nZXRJbWFnZURhdGEoKTsKLQkJCQlkcmF3SW1hZ2UoaWQsIHgsIDApOwotCQkJCXggKz0gaWQud2lkdGg7Ci0JCQl9Ci0JCX0KLQl9Ci0JcHJvdGVjdGVkIHZvaWQgZHJhd1RvcFJpZ2h0KEltYWdlRGVzY3JpcHRvcltdIG92ZXJsYXlzKSB7Ci0JCWlmIChvdmVybGF5cyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpbnQgbGVuZ3RoID0gb3ZlcmxheXMubGVuZ3RoOwotCQlpbnQgeCA9IGdldFNpemUoKS54OwotCQlmb3IgKGludCBpID0gMjsgaSA+PSAwOyBpLS0pIHsKLQkJCWlmIChpIDwgbGVuZ3RoICYmIG92ZXJsYXlzW2ldICE9IG51bGwpIHsKLQkJCQlJbWFnZURhdGEgaWQgPSBvdmVybGF5c1tpXS5nZXRJbWFnZURhdGEoKTsKLQkJCQl4IC09IGlkLndpZHRoOwotCQkJCWRyYXdJbWFnZShpZCwgeCwgMCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgUG9pbnQgZ2V0U2l6ZSgpIHsKLQkJcmV0dXJuIGZTaXplOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wYXJ0cy9Db25maWd1cmF0aW9uSW5mby5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3BhcnRzL0NvbmZpZ3VyYXRpb25JbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1NzA2MjIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3BhcnRzL0NvbmZpZ3VyYXRpb25JbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkucGFydHM7Ci0KLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuYm9vdC5Cb290TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuYm9vdC5JUGxhdGZvcm1Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGx1Z2luRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsdWdpblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luVmVyc2lvbklkZW50aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2hQbHVnaW47Ci0KLS8qKgotICogQ29uZmlndWF0aW9uIGluZm8gY2xhc3M7Ci0gKiA8cD4KLSAqIFRoZSBpbmZvcm1hdGlvbiB3aXRoaW4gc3ViY2xhc3NlcyBvZiB0aGlzIG9iamVjdCBpcyBvYnRhaW5lZCBmcm9tIGEgY29uZmlndXJhdGlvbgotICogImluaSIgZmlsZSIuIFRoaXMgZmlsZSByZXNpZGVzIHdpdGhpbiBhbiBpbnN0YWxsIGNvbmZpZ3VyYXRpb25zIGRpcmVjdG9yeSBhbmQgbXVzdAotICogYmUgYSBzdGFuZGFyZCBqYXZhIHByb3BlcnR5IGZpbGUuIEEgcHJvcGVydGllcyBmaWxlIG1heSBhbHNvIGJlIHVzZWQgdG8gTkwgdmFsdWVzCi0gKiBpbiB0aGUgaW5pIGZpbGUuIAotICogPC9wPgotICovCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb25maWd1cmF0aW9uSW5mbyB7Ci0KLQlwcml2YXRlIElQbHVnaW5EZXNjcmlwdG9yIGRlc2M7Ci0JcHJpdmF0ZSBVUkwgYmFzZVVSTDsKLQlwcml2YXRlIFN0cmluZyBpbmlGaWxlbmFtZTsKLQlwcml2YXRlIFN0cmluZyBwcm9wZXJ0aWVzRmlsZW5hbWU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1BSRUZJWCA9ICIlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRE9VQkxFX1BSRUZJWCA9ICIlJSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcm90ZWN0ZWQgQ29uZmlndXJhdGlvbkluZm8oU3RyaW5nIGluaSwgU3RyaW5nIHByb3BlcnRpZXMpIHsKLQkJaW5pRmlsZW5hbWUgPSBpbmk7Ci0JCXByb3BlcnRpZXNGaWxlbmFtZSA9IHByb3BlcnRpZXM7Ci0JfQotCi0JLyoqCi0JICogUjEuMCBwbGF0Zm9ybS5pbmkgaGFuZGxpbmcgdXNpbmcgIm1haW4iIHBsdWdpbiBhbmQgZnJhZ21lbnRzIGZvciBOTAotCSAqLwotCXB1YmxpYyB2b2lkIHJlYWRJTklGaWxlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBkZXRlcm1pbmUgdGhlIGlkZW50aWZpZXIgb2YgdGhlICJkb21pbmFudCIgYXBwbGljYXRpb24gCi0JCUlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24gY29uZiA9IEJvb3RMb2FkZXIuZ2V0Q3VycmVudFBsYXRmb3JtQ29uZmlndXJhdGlvbigpOwotCQlTdHJpbmcgY29uZmlnTmFtZSA9IGNvbmYuZ2V0UHJpbWFyeUZlYXR1cmVJZGVudGlmaWVyKCk7Ci0JCWlmIChjb25maWdOYW1lID09IG51bGwpIHsKLQkJCXJlcG9ydElOSUZhaWx1cmUobnVsbCwgIlVua25vd24gY29uZmlndXJhdGlvbiBpZGVudGlmaWVyIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIGF0dGVtcHQgdG8gbG9jYXRlIGl0cyBjb3JyZXNwb25kaW5nICJtYWluIiBwbHVnaW4KLQkJSVBsdWdpblJlZ2lzdHJ5IHJlZyA9IFBsYXRmb3JtLmdldFBsdWdpblJlZ2lzdHJ5KCk7Ci0JCWlmIChyZWcgPT0gbnVsbCkgewotCQkJcmVwb3J0SU5JRmFpbHVyZShudWxsLCAiUGx1Z2luIHJlZ2lzdHJ5IGlzIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuOwotCQl9Ci0JCWludCBpbmRleCA9IGNvbmZpZ05hbWUubGFzdEluZGV4T2YoIl8iKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoaW5kZXggPT0gLTEpCi0JCQl0aGlzLmRlc2MgPSByZWcuZ2V0UGx1Z2luRGVzY3JpcHRvcihjb25maWdOYW1lKTsKLQkJZWxzZSB7Ci0JCQlTdHJpbmcgbWFpblBsdWdpbk5hbWUgPSBjb25maWdOYW1lLnN1YnN0cmluZygwLCBpbmRleCk7Ci0JCQlQbHVnaW5WZXJzaW9uSWRlbnRpZmllciBtYWluUGx1Z2luVmVyc2lvbiA9IG51bGw7Ci0JCQl0cnkgewotCQkJCW1haW5QbHVnaW5WZXJzaW9uID0KLQkJCQkJbmV3IFBsdWdpblZlcnNpb25JZGVudGlmaWVyKGNvbmZpZ05hbWUuc3Vic3RyaW5nKGluZGV4ICsgMSkpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXBvcnRJTklGYWlsdXJlKGUsICJVbmtub3duIHBsdWdpbiB2ZXJzaW9uICIgKyBjb25maWdOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybjsKLQkJCX0KLQkJCXRoaXMuZGVzYyA9IHJlZy5nZXRQbHVnaW5EZXNjcmlwdG9yKG1haW5QbHVnaW5OYW1lLCBtYWluUGx1Z2luVmVyc2lvbik7Ci0JCX0KLQkJaWYgKHRoaXMuZGVzYyA9PSBudWxsKSB7Ci0JCQlyZXBvcnRJTklGYWlsdXJlKG51bGwsICJNaXNzaW5nIHBsdWdpbiBkZXNjcmlwdG9yIGZvciAiICsgY29uZmlnTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJfQotCQl0aGlzLmJhc2VVUkwgPSBkZXNjLmdldEluc3RhbGxVUkwoKTsKLQotCQkvLyBsb2FkIHRoZSBwbGF0Zm9ybS5pbmkgYW5kIHBsYXRmb3JtLnByb3BlcnRpZXMgZmlsZQkKLQkJVVJMIGluaVVSTCA9IGRlc2MuZmluZChuZXcgUGF0aChpbmlGaWxlbmFtZSkpOwotCQlpZiAoaW5pVVJMID09IG51bGwpIHsKLQkJCXJlcG9ydElOSUZhaWx1cmUobnVsbCwgIlVuYWJsZSB0byBsb2FkIHBsdWdpbiBmaWxlOiAiICsgaW5pRmlsZW5hbWUpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCVVSTCBwcm9wZXJ0aWVzVVJMID0gZGVzYy5maW5kKG5ldyBQYXRoKHByb3BlcnRpZXNGaWxlbmFtZSkpOwotCQkvLyBPSyB0byBwYXNzIG51bGwgcHJvcGVydGllcyBmaWxlCi0JCXJlYWRJTklGaWxlKGluaVVSTCwgcHJvcGVydGllc1VSTCk7Ci0JfQotCQkKLQkvKioKLQkgKiBHZXRzIHRoZSBkZXNjcmlwdG9yCi0JICogQHJldHVybiBSZXR1cm5zIGEgSVBsdWdpbkRlc2NyaXB0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgSVBsdWdpbkRlc2NyaXB0b3IgZ2V0RGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIGRlc2M7Ci0JfQotCS8qKgotCSAqIEdldHMgdGhlIGJhc2VVUkwKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBVUkwKLQkgKi8KLQlwcm90ZWN0ZWQgVVJMIGdldEJhc2VVUkwoKSB7Ci0JCXJldHVybiBiYXNlVVJMOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIGEgcmVzb3VyY2Ugc3RyaW5nIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGFyZ3VtZW50IAotCSAqIHZhbHVlIGFuZCBidW5kbGUuCi0JICogSWYgdGhlIGFyZ3VtZW50IHZhbHVlIHNwZWNpZmllcyBhIHJlc291cmNlIGtleSwgdGhlIHN0cmluZwotCSAqIGlzIGxvb2tlZCB1cCBpbiB0aGUgZ2l2ZW4gcmVzb3VyY2UgYnVuZGxlLiBJZiB0aGUgYXJndW1lbnQgZG9lcyBub3QKLQkgKiBzcGVjaWZ5IGEgdmFsaWQga2V5LCB0aGUgYXJndW1lbnQgaXRzZWxmIGlzIHJldHVybmVkIGFzIHRoZQotCSAqIHJlc291cmNlIHN0cmluZy4gVGhlIGtleSBsb29rdXAgaXMgcGVyZm9ybWVkIGFnYWluc3QgdGhlCi0JICogc3BlY2lmaWVkIHJlc291cmNlIGJ1bmRsZS4gSWYgYSByZXNvdXJjZSBzdHJpbmcgCi0JICogY29ycmVzcG9uZGluZyB0byB0aGUga2V5IGlzIG5vdCBmb3VuZCBpbiB0aGUgcmVzb3VyY2UgYnVuZGxlCi0JICogdGhlIGtleSB2YWx1ZSwgb3IgYW55IGRlZmF1bHQgdGV4dCBmb2xsb3dpbmcgdGhlIGtleSBpbiB0aGUKLQkgKiBhcmd1bWVudCB2YWx1ZSBpcyByZXR1cm5lZCBhcyB0aGUgcmVzb3VyY2Ugc3RyaW5nLgotCSAqIEEga2V5IGlzIGlkZW50aWZpZWQgYXMgYSBzdHJpbmcgYmVnaW5pbmcgd2l0aCB0aGUgIiUiIGNoYXJhY3Rlci4KLQkgKiBOb3RlIHRoYXQgdGhlICIlIiBjaGFyYWN0ZXIgaXMgc3RyaXBwZWQgb2ZmIHByaW9yIHRvIGxvb2t1cAotCSAqIGluIHRoZSByZXNvdXJjZSBidW5kbGUuCi0JICogPHA+Ci0JICogRm9yIGV4YW1wbGUsIGFzc3VtZSByZXNvdXJjZSBidW5kbGUgcGx1Z2luLnByb3BlcnRpZXMgY29udGFpbnMKLQkgKiBuYW1lID0gUHJvamVjdCBOYW1lCi0JICogPHByZT4KLQkgKiAgICAgPGxpPmdldFJlc291cmNlU3RyaW5nKCJIZWxsbyBXb3JsZCIpIHJldHVybnMgIkhlbGxvIFdvcmxkIjwvbGk+Ci0JICogICAgIDxsaT5nZXRSZXNvdXJjZVN0cmluZygiJW5hbWUiKSByZXR1cm5zICJQcm9qZWN0IE5hbWUiPC9saT4KLQkgKiAgICAgPGxpPmdldFJlc291cmNlU3RyaW5nKCIlbmFtZSBIZWxsbyBXb3JsZCIpIHJldHVybnMgIlByb2plY3QgTmFtZSI8L2xpPgotCSAqICAgICA8bGk+Z2V0UmVzb3VyY2VTdHJpbmcoIiVhYmNkIEhlbGxvIFdvcmxkIikgcmV0dXJucyAiSGVsbG8gV29ybGQiPC9saT4KLQkgKiAgICAgPGxpPmdldFJlc291cmNlU3RyaW5nKCIlYWJjZCIpIHJldHVybnMgIiVhYmNkIjwvbGk+Ci0JICogICAgIDxsaT5nZXRSZXNvdXJjZVN0cmluZygiJSVuYW1lIikgcmV0dXJucyAiJW5hbWUiPC9saT4KLQkgKiAgICAgPGxpPmdldFJlc291cmNlU3RyaW5nKDxjb2RlPm51bGw8L2NvZGU+KSByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+PC9saT4KLQkgKiA8L3ByZT4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHBhcmFtIGIgdGhlIHJlc291cmNlIGJ1bmRsZSBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEByZXR1cm4gdGhlIHJlc291cmNlIHN0cmluZwotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIHZhbHVlLCBSZXNvdXJjZUJ1bmRsZSBiKSB7Ci0JCQotCQlpZih2YWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZyBzID0gdmFsdWUudHJpbSgpOwotCi0JCWlmICghcy5zdGFydHNXaXRoKEtFWV9QUkVGSVgpKQotCQkJcmV0dXJuIHM7Ci0KLQkJaWYgKHMuc3RhcnRzV2l0aChLRVlfRE9VQkxFX1BSRUZJWCkpCi0JCQlyZXR1cm4gcy5zdWJzdHJpbmcoMSk7Ci0KLQkJaW50IGl4ID0gcy5pbmRleE9mKCIgIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGtleSA9IGl4ID09IC0xID8gcyA6IHMuc3Vic3RyaW5nKDAsIGl4KTsKLQkJU3RyaW5nIGRmbHQgPSBpeCA9PSAtMSA/IHMgOiBzLnN1YnN0cmluZyhpeCArIDEpOwotCi0JCWlmIChiID09IG51bGwpCi0JCQlyZXR1cm4gZGZsdDsKLQotCQl0cnkgewotCQkJcmV0dXJuIGIuZ2V0U3RyaW5nKGtleS5zdWJzdHJpbmcoMSkpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmVwb3J0SU5JRmFpbHVyZShlLCAiUHJvcGVydHkgXCIiICsga2V5ICsgIlwiIG5vdCBmb3VuZCIpOy8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJcmV0dXJuIGRmbHQ7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZWFkIHRoZSBpbmkgZmlsZS4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCByZWFkSU5JRmlsZShVUkwgaW5pVVJMLCBVUkwgcHJvcGVydGllc1VSTCkKLQkJdGhyb3dzIENvcmVFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogUmVwb3J0IGFuIGluaSBmYWlsdXJlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVwb3J0SU5JRmFpbHVyZShFeGNlcHRpb24gZSwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJaWYgKCFXb3JrYmVuY2hQbHVnaW4uREVCVUcpIHsKLQkJCS8vIG9ubHkgcmVwb3J0IGluaSBwcm9ibGVtcyBpZiB0aGUgLWRlYnVnIGNvbW1hbmQgbGluZSBhcmd1bWVudCBpcyB1c2VkCi0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUlTdGF0dXMgaW5pU3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERlc2NyaXB0b3IoKS5nZXRVbmlxdWVJZGVudGlmaWVyKCksCi0JCQkJCQkJCQkJMCwgbWVzc2FnZSwgZSk7Ci0JCVdvcmtiZW5jaFBsdWdpbi5sb2coIlByb2JsZW0gcmVhZGluZyBjb25maWd1cmF0aW9uIGluZm8uIiwgaW5pU3RhdHVzKTsvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3BhcnRzL0RlZmF1bHRDb250ZW50UHJvdmlkZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wYXJ0cy9EZWZhdWx0Q29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhNjdhN2IuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3BhcnRzL0RlZmF1bHRDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wYXJ0czsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy4qOw0KLQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0Q29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSUNvbnRlbnRQcm92aWRlciB7DQotDQotcHVibGljIERlZmF1bHRDb250ZW50UHJvdmlkZXIoKSB7DQotCXN1cGVyKCk7DQotfQ0KLXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7fQ0KLXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkge30NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3BhcnRzL0ltYWdlT3ZlcmxheUljb24uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wYXJ0cy9JbWFnZU92ZXJsYXlJY29uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjNjFhYjQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3BhcnRzL0ltYWdlT3ZlcmxheUljb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi0vKioKLSAqIEFuIE92ZXJsYXlJY29uIGNvbnNpc3RzIG9mIGEgbWFpbiBpY29uIGFuZCBzZXZlcmFsIGFkb3JubWVudHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBJbWFnZU92ZXJsYXlJY29uIGV4dGVuZHMgQWJzdHJhY3RPdmVybGF5SWNvbiB7Ci0JcHJpdmF0ZSBJbWFnZSBiYXNlOwotCi0JcHVibGljIEltYWdlT3ZlcmxheUljb24oSW1hZ2UgYmFzZSwgSW1hZ2VEZXNjcmlwdG9yW11bXSBvdmVybGF5cykgewotCQl0aGlzKGJhc2UsIG92ZXJsYXlzLCBudWxsKTsKLQl9Ci0JCi0JcHVibGljIEltYWdlT3ZlcmxheUljb24oSW1hZ2UgYmFzZSwgSW1hZ2VEZXNjcmlwdG9yW11bXSBvdmVybGF5cywgUG9pbnQgc2l6ZSkgewotCQlzdXBlcihvdmVybGF5cywgc2l6ZSk7Ci0JCXRoaXMuYmFzZSA9IGJhc2U7Ci0JfQotCQotCXByb3RlY3RlZCBJbWFnZURhdGEgZ2V0QmFzZUltYWdlRGF0YSgpIHsKLQkJcmV0dXJuIGJhc2UuZ2V0SW1hZ2VEYXRhKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3BhcnRzL092ZXJsYXlJY29uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcGFydHMvT3ZlcmxheUljb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU0MTM1MS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcGFydHMvT3ZlcmxheUljb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkucGFydHM7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZURhdGE7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuQ29tcG9zaXRlSW1hZ2VEZXNjcmlwdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7DQotDQotLyoqDQotICogQW4gT3ZlcmxheUljb24gY29uc2lzdHMgb2YgYSBtYWluIGljb24gYW5kIHNldmVyYWwgYWRvcm5tZW50cy4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgT3ZlcmxheUljb24gZXh0ZW5kcyBDb21wb3NpdGVJbWFnZURlc2NyaXB0b3Igew0KLQkNCi0Jc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1dJRFRIPSAxNjsNCi0Jc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0hFSUdIVD0gMTY7DQotCQ0KLQlwcml2YXRlIFBvaW50IGZTaXplPSBudWxsOw0KLQkJDQotCXByaXZhdGUgSW1hZ2VEZXNjcmlwdG9yIGZCYXNlOw0KLQlwcml2YXRlIEltYWdlRGVzY3JpcHRvciBmT3ZlcmxheXNbXVtdOw0KLQ0KLQlwdWJsaWMgT3ZlcmxheUljb24oSW1hZ2VEZXNjcmlwdG9yIGJhc2UsIEltYWdlRGVzY3JpcHRvcltdW10gb3ZlcmxheXMpIHsNCi0JCWZCYXNlPSBiYXNlOw0KLQkJaWYgKGZCYXNlID09IG51bGwpDQotCQkJZkJhc2U9IEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7DQotCQlmT3ZlcmxheXM9IG92ZXJsYXlzOw0KLQkJZlNpemU9IG5ldyBQb2ludChERUZBVUxUX1dJRFRILCBERUZBVUxUX0hFSUdIVCk7DQotCX0NCi0JcHVibGljIE92ZXJsYXlJY29uKEltYWdlRGVzY3JpcHRvciBiYXNlLCBJbWFnZURlc2NyaXB0b3JbXVtdIG92ZXJsYXlzLCBQb2ludCBzaXplKSB7DQotCQlmQmFzZT0gYmFzZTsNCi0JCWlmIChmQmFzZSA9PSBudWxsKQ0KLQkJCWZCYXNlPSBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpOw0KLQkJZk92ZXJsYXlzPSBvdmVybGF5czsNCi0JCWZTaXplPSBzaXplOw0KLQl9DQotCXByb3RlY3RlZCB2b2lkIGRyYXdCb3R0b21MZWZ0KEltYWdlRGVzY3JpcHRvcltdIG92ZXJsYXlzKSB7DQotCQlpZiAob3ZlcmxheXMgPT0gbnVsbCkNCi0JCQlyZXR1cm47DQotCQlpbnQgbGVuZ3RoPSBvdmVybGF5cy5sZW5ndGg7DQotCQlpbnQgeD0gMDsNCi0JCWZvciAoaW50IGk9IDA7IGkgPCAzOyBpKyspIHsNCi0JCQlpZiAoaSA8IGxlbmd0aCAmJiBvdmVybGF5c1tpXSAhPSBudWxsKSB7DQotCQkJCUltYWdlRGF0YSBpZD0gb3ZlcmxheXNbaV0uZ2V0SW1hZ2VEYXRhKCk7DQotCQkJCWRyYXdJbWFnZShpZCwgeCwgZ2V0U2l6ZSgpLnktaWQuaGVpZ2h0KTsNCi0JCQkJeCs9IGlkLndpZHRoOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQlwcm90ZWN0ZWQgdm9pZCBkcmF3Qm90dG9tUmlnaHQoSW1hZ2VEZXNjcmlwdG9yW10gb3ZlcmxheXMpIHsNCi0JCWlmIChvdmVybGF5cyA9PSBudWxsKQ0KLQkJCXJldHVybjsNCi0JCWludCBsZW5ndGg9IG92ZXJsYXlzLmxlbmd0aDsNCi0JCWludCB4PSBnZXRTaXplKCkueDsNCi0JCWZvciAoaW50IGk9IDI7IGkgPj0gMDsgaS0tKSB7DQotCQkJaWYgKGkgPCBsZW5ndGggJiYgb3ZlcmxheXNbaV0gIT0gbnVsbCkgew0KLQkJCQlJbWFnZURhdGEgaWQ9IG92ZXJsYXlzW2ldLmdldEltYWdlRGF0YSgpOw0KLQkJCQl4LT0gaWQud2lkdGg7DQotCQkJCWRyYXdJbWFnZShpZCwgeCwgZ2V0U2l6ZSgpLnktaWQuaGVpZ2h0KTsNCi0JCQl9DQotCQl9DQotCX0NCi0JcHJvdGVjdGVkIHZvaWQgZHJhd0NvbXBvc2l0ZUltYWdlKGludCB3aWR0aCwgaW50IGhlaWdodCkgew0KLQkJSW1hZ2VEYXRhIGJnPSBmQmFzZS5nZXRJbWFnZURhdGEoKTsNCi0JCWRyYXdJbWFnZShiZywgMCwgMCk7DQotCQkNCi0JCWlmIChmT3ZlcmxheXMgIT0gbnVsbCkgew0KLQkJCWlmIChmT3ZlcmxheXMubGVuZ3RoID4gMCkNCi0JCQkJZHJhd1RvcFJpZ2h0KCBmT3ZlcmxheXNbMF0pOw0KLQkJCQkNCi0JCQlpZiAoZk92ZXJsYXlzLmxlbmd0aCA+IDEpDQotCQkJCWRyYXdCb3R0b21SaWdodChmT3ZlcmxheXNbMV0pOw0KLQkJCQkNCi0JCQlpZiAoZk92ZXJsYXlzLmxlbmd0aCA+IDIpDQotCQkJCWRyYXdCb3R0b21MZWZ0KGZPdmVybGF5c1syXSk7DQotCQkJCQ0KLQkJCWlmIChmT3ZlcmxheXMubGVuZ3RoID4gMykNCi0JCQkJZHJhd1RvcExlZnQoZk92ZXJsYXlzWzNdKTsNCi0JCX0JDQotCX0NCi0JcHJvdGVjdGVkIHZvaWQgZHJhd1RvcExlZnQoSW1hZ2VEZXNjcmlwdG9yW10gb3ZlcmxheXMpIHsNCi0JCWlmIChvdmVybGF5cyA9PSBudWxsKQ0KLQkJCXJldHVybjsNCi0JCWludCBsZW5ndGg9IG92ZXJsYXlzLmxlbmd0aDsNCi0JCWludCB4PSAwOw0KLQkJZm9yIChpbnQgaT0gMDsgaSA8IDM7IGkrKykgew0KLQkJCWlmIChpIDwgbGVuZ3RoICYmIG92ZXJsYXlzW2ldICE9IG51bGwpIHsNCi0JCQkJSW1hZ2VEYXRhIGlkPSBvdmVybGF5c1tpXS5nZXRJbWFnZURhdGEoKTsNCi0JCQkJZHJhd0ltYWdlKGlkLCB4LCAwKTsNCi0JCQkJeCs9IGlkLndpZHRoOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQlwcm90ZWN0ZWQgdm9pZCBkcmF3VG9wUmlnaHQoSW1hZ2VEZXNjcmlwdG9yW10gb3ZlcmxheXMpIHsNCi0JCWlmIChvdmVybGF5cyA9PSBudWxsKQ0KLQkJCXJldHVybjsNCi0JCWludCBsZW5ndGg9IG92ZXJsYXlzLmxlbmd0aDsNCi0JCWludCB4PSBnZXRTaXplKCkueDsNCi0JCWZvciAoaW50IGk9IDI7IGkgPj0gMDsgaS0tKSB7DQotCQkJaWYgKGkgPCBsZW5ndGggJiYgb3ZlcmxheXNbaV0gIT0gbnVsbCkgew0KLQkJCQlJbWFnZURhdGEgaWQ9IG92ZXJsYXlzW2ldLmdldEltYWdlRGF0YSgpOw0KLQkJCQl4LT0gaWQud2lkdGg7DQotCQkJCWRyYXdJbWFnZShpZCwgeCwgMCk7DQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotCXByb3RlY3RlZCBQb2ludCBnZXRTaXplKCkgew0KLQkJcmV0dXJuIGZTaXplOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wYXJ0cy9QaXhlbENvbnZlcnRlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3BhcnRzL1BpeGVsQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NGU5YjUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3BhcnRzL1BpeGVsQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wYXJ0czsKLS8qKgotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnRNZXRyaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci0KLXB1YmxpYyBjbGFzcyBQaXhlbENvbnZlcnRlciB7Ci0JCi0JcHJpdmF0ZSBGb250TWV0cmljcyBmRm9udE1ldHJpY3M7Ci0JCi0JcHVibGljIFBpeGVsQ29udmVydGVyKENvbnRyb2wgY29udHJvbCkgewotCQlHQyBnYyA9IG5ldyBHQyhjb250cm9sKTsKLQkJZ2Muc2V0Rm9udChjb250cm9sLmdldEZvbnQoKSk7Ci0JCWZGb250TWV0cmljcz0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKLQkJZ2MuZGlzcG9zZSgpOwotCX0KLQkKLQlwcml2YXRlIEZvbnRNZXRyaWNzIGZnRm9udE1ldHJpY3M7Ci0JCQotCS8qKgotCSAqIEBzZWUgRGlhbG9nUGFnZSNjb252ZXJ0SGVpZ2h0SW5DaGFyc1RvUGl4ZWxzCi0JICovCi0JcHVibGljIGludCBjb252ZXJ0SGVpZ2h0SW5DaGFyc1RvUGl4ZWxzKGludCBjaGFycykgewotCQlyZXR1cm4gRGlhbG9nLmNvbnZlcnRIZWlnaHRJbkNoYXJzVG9QaXhlbHMoZkZvbnRNZXRyaWNzLCBjaGFycyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBEaWFsb2dQYWdlI2NvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzCi0JICovCi0JcHVibGljIGludCBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhpbnQgZGx1cykgewotCQlyZXR1cm4gRGlhbG9nLmNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKGZGb250TWV0cmljcywgZGx1cyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBEaWFsb2dQYWdlI2NvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscwotCSAqLwotCXB1YmxpYyBpbnQgY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKGludCBkbHVzKSB7Ci0JCXJldHVybiBEaWFsb2cuY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKGZGb250TWV0cmljcywgZGx1cyk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgRGlhbG9nUGFnZSNjb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHMKLQkgKi8KLQlwdWJsaWMgaW50IGNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscyhpbnQgY2hhcnMpIHsKLQkJcmV0dXJuIERpYWxvZy5jb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHMoZkZvbnRNZXRyaWNzLCBjaGFycyk7Ci0JfQkKLQotfQotCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcGFydHMvU1dUVXRpbC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3BhcnRzL1NXVFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzkwNTI4Ny4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcGFydHMvU1dUVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnBhcnRzOwotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyYWdTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNhcmV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNjcm9sbEJhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyB0byBzaW1wbGlmeSBhY2Nlc3MgdG8gc29tZSBTV1QgcmVzb3VyY2VzLiAKLSAqLwotcHVibGljIGNsYXNzIFNXVFV0aWwgewotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0YW5kYXJkIGRpc3BsYXkgdG8gYmUgdXNlZC4gVGhlIG1ldGhvZCBmaXJzdCBjaGVja3MsIGlmCi0JICogdGhlIHRocmVhZCBjYWxsaW5nIHRoaXMgbWV0aG9kIGhhcyBhbiBhc3NvY2lhdGVkIGRpc2FwbHkuIElmIHNvLCB0aGlzCi0JICogZGlzcGxheSBpcyByZXR1cm5lZC4gT3RoZXJ3aXNlIHRoZSBtZXRob2QgcmV0dXJucyB0aGUgZGVmYXVsdCBkaXNwbGF5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRGlzcGxheSBnZXRTdGFuZGFyZERpc3BsYXkoKSB7Ci0JCURpc3BsYXkgZGlzcGxheTsKLQkJZGlzcGxheT0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JCWlmIChkaXNwbGF5ID09IG51bGwpCi0JCQlkaXNwbGF5PSBEaXNwbGF5LmdldERlZmF1bHQoKTsKLQkJcmV0dXJuIGRpc3BsYXk7CQkKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hlbGwgZm9yIHRoZSBnaXZlbiB3aWRnZXQuIElmIHRoZSB3aWRnZXQgZG9lc24ndCByZXByZXNlbnQKLQkgKiBhIFNXVCBvYmplY3QgdGhhdCBtYW5hZ2UgYSBzaGVsbCwgPGNvZGU+bnVsbDwvY29kZT4gaXMgcmV0dXJuZWQuCi0JICogCi0JICogQHJldHVybiB0aGUgc2hlbGwgZm9yIHRoZSBnaXZlbiB3aWRnZXQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFNoZWxsIGdldFNoZWxsKFdpZGdldCB3aWRnZXQpIHsKLQkJaWYgKHdpZGdldCBpbnN0YW5jZW9mIENvbnRyb2wpCi0JCQlyZXR1cm4gKChDb250cm9sKXdpZGdldCkuZ2V0U2hlbGwoKTsKLQkJaWYgKHdpZGdldCBpbnN0YW5jZW9mIENhcmV0KQotCQkJcmV0dXJuICgoQ2FyZXQpd2lkZ2V0KS5nZXRQYXJlbnQoKS5nZXRTaGVsbCgpOwotCQlpZiAod2lkZ2V0IGluc3RhbmNlb2YgRHJhZ1NvdXJjZSkKLQkJCXJldHVybiAoKERyYWdTb3VyY2Upd2lkZ2V0KS5nZXRDb250cm9sKCkuZ2V0U2hlbGwoKTsKLQkJaWYgKHdpZGdldCBpbnN0YW5jZW9mIERyb3BUYXJnZXQpCi0JCQlyZXR1cm4gKChEcm9wVGFyZ2V0KXdpZGdldCkuZ2V0Q29udHJvbCgpLmdldFNoZWxsKCk7Ci0JCWlmICh3aWRnZXQgaW5zdGFuY2VvZiBNZW51KQotCQkJcmV0dXJuICgoTWVudSl3aWRnZXQpLmdldFBhcmVudCgpLmdldFNoZWxsKCk7Ci0JCWlmICh3aWRnZXQgaW5zdGFuY2VvZiBTY3JvbGxCYXIpCi0JCQlyZXR1cm4gKChTY3JvbGxCYXIpd2lkZ2V0KS5nZXRQYXJlbnQoKS5nZXRTaGVsbCgpOwotCQkJCQkJCQotCQlyZXR1cm4gbnVsbDsJCi0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIGEgd2lkdGggaGludCBmb3IgYSBidXR0b24gY29udHJvbC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXRCdXR0b25XaWR0aEhpbnQoQnV0dG9uIGJ1dHRvbikgewotCQlQaXhlbENvbnZlcnRlciBjb252ZXJ0ZXI9IG5ldyBQaXhlbENvbnZlcnRlcihidXR0b24pOwotCQlpbnQgd2lkdGhIaW50PSBjb252ZXJ0ZXIuY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5CVVRUT05fV0lEVEgpOwotCQlyZXR1cm4gTWF0aC5tYXgod2lkdGhIaW50LCBidXR0b24uY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCB0cnVlKS54KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgaGVpZ2h0IGhpbnQgZm9yIGEgYnV0dG9uIGNvbnRyb2wuCi0JICovCQkKLQlwdWJsaWMgc3RhdGljIGludCBnZXRCdXR0b25IZWlndGhIaW50KEJ1dHRvbiBidXR0b24pIHsKLQkJUGl4ZWxDb252ZXJ0ZXIgY29udmVydGVyPSBuZXcgUGl4ZWxDb252ZXJ0ZXIoYnV0dG9uKTsKLQkJcmV0dXJuIGNvbnZlcnRlci5jb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5CVVRUT05fSEVJR0hUKTsKLQl9CQotCi0JCi0JLyoqCi0JICogU2V0cyB3aWR0aCBhbmQgaGVpZ2h0IGhpbnQgZm9yIHRoZSBidXR0b24gY29udHJvbC4KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBpcyBhIE5PUCBpZiB0aGUgYnV0dG9uJ3MgbGF5b3V0IGRhdGEgaXMgbm90Ci0JICogYW4gaW5zdGFuY2Ugb2YgPGNvZGU+R3JpZERhdGE8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbQl0aGUgYnV0dG9uIGZvciB3aGljaCB0byBzZXQgdGhlIGRpbWVuc2lvbiBoaW50Ci0JICovCQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0QnV0dG9uRGltZW5zaW9uSGludChCdXR0b24gYnV0dG9uKSB7Ci0JCUFzc2VydC5pc05vdE51bGwoYnV0dG9uKTsKLQkJT2JqZWN0IGdkPSBidXR0b24uZ2V0TGF5b3V0RGF0YSgpOwotCQlpZiAoZ2QgaW5zdGFuY2VvZiBHcmlkRGF0YSkgewotCQkJKChHcmlkRGF0YSlnZCkuaGVpZ2h0SGludD0gZ2V0QnV0dG9uSGVpZ3RoSGludChidXR0b24pOwotCQkJKChHcmlkRGF0YSlnZCkud2lkdGhIaW50PSBnZXRCdXR0b25XaWR0aEhpbnQoYnV0dG9uKTsJCSAKLQkJfQotCX0JCQotCQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcGFydHMvU2hhcmVkTGFiZWxQcm92aWRlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3BhcnRzL1NoYXJlZExhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQzOTQ2Yy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcGFydHMvU2hhcmVkTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnBhcnRzOwotCi1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGx1Z2luRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSUltYWdlczsKLQotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBTaGFyZWRMYWJlbFByb3ZpZGVyCi0JZXh0ZW5kcyBMYWJlbFByb3ZpZGVyCi0JaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGX0VSUk9SID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGX1dBUk5JTkcgPSAyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZfQ1VSUkVOVCA9IDQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRl9JTlNUQUxMQUJMRSA9IDg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRl9MSU5LRUQgPSAxNjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGX01PRCA9IDMyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZfVVBEQVRFRCA9IDY0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZfVU5DT05GSUdVUkVEID0gMTI4OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZfQUREID0gMjU2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZfREVMID0gNTEyOwotCi0JSGFzaHRhYmxlIGltYWdlcyA9IG5ldyBIYXNodGFibGUoKTsKLQlBcnJheUxpc3QgY29uc3VtZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHVibGljIFNoYXJlZExhYmVsUHJvdmlkZXIoKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgY29ubmVjdChPYmplY3QgY29uc3VtZXIpIHsKLQkJaWYgKCFjb25zdW1lcnMuY29udGFpbnMoY29uc3VtZXIpKQotCQkJY29uc3VtZXJzLmFkZChjb25zdW1lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzY29ubmVjdChPYmplY3QgY29uc3VtZXIpIHsKLQkJY29uc3VtZXJzLnJlbW92ZShjb25zdW1lcik7Ci0JCWlmIChjb25zdW1lcnMuc2l6ZSgpID09IDApIHsKLQkJCXJlc2V0KCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJcmVzZXQoKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZXNldCgpIHsKLQkJZm9yIChFbnVtZXJhdGlvbiBlbnVtID0gaW1hZ2VzLmVsZW1lbnRzKCk7IGVudW0uaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JCQlJbWFnZSBpbWFnZSA9IChJbWFnZSkgZW51bS5uZXh0RWxlbWVudCgpOwotCQkJaW1hZ2UuZGlzcG9zZSgpOwotCQl9Ci0JCWltYWdlcy5jbGVhcigpOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXQoSW1hZ2VEZXNjcmlwdG9yIGRlc2MpIHsKLQkJcmV0dXJuIGdldChkZXNjLCAwKTsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0KEltYWdlRGVzY3JpcHRvciBkZXNjLCBpbnQgZmxhZ3MpIHsKLQkJT2JqZWN0IGtleSA9IGRlc2M7Ci0KLQkJaWYgKGZsYWdzICE9IDApIHsKLQkJCWtleSA9IGdldEtleShkZXNjLmhhc2hDb2RlKCksIGZsYWdzKTsKLQkJfQotCQlJbWFnZSBpbWFnZSA9IChJbWFnZSkgaW1hZ2VzLmdldChrZXkpOwotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJaW1hZ2UgPSBjcmVhdGVJbWFnZShkZXNjLCBmbGFncyk7Ci0JCQlpbWFnZXMucHV0KGtleSwgaW1hZ2UpOwotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0JCi0JcHVibGljIEltYWdlIGdldChJbWFnZSBpbWFnZSwgaW50IGZsYWdzKSB7Ci0JCWlmIChmbGFncz09MCkgcmV0dXJuIGltYWdlOwotCQlTdHJpbmcga2V5ID0gZ2V0S2V5KGltYWdlLmhhc2hDb2RlKCksIGZsYWdzKTsKLQkJSW1hZ2UgcmVzdWx0SW1hZ2UgPSAoSW1hZ2UpaW1hZ2VzLmdldChrZXkpOwotCQlpZiAocmVzdWx0SW1hZ2UgPT0gbnVsbCkgewotCQkJcmVzdWx0SW1hZ2UgPSBjcmVhdGVJbWFnZShpbWFnZSwgZmxhZ3MpOwotCQkJaW1hZ2VzLnB1dChrZXksIHJlc3VsdEltYWdlKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0SW1hZ2U7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0S2V5KGxvbmcgaGFzaENvZGUsIGludCBmbGFncykgewotCQlyZXR1cm4gKCIiK2hhc2hDb2RlKSArICI6IitmbGFnczsKLQl9Ci0KLQlwcml2YXRlIEltYWdlIGNyZWF0ZUltYWdlKEltYWdlRGVzY3JpcHRvciBiYXNlRGVzYywgaW50IGZsYWdzKSB7Ci0JCWlmIChmbGFncyA9PSAwKSB7Ci0JCQlyZXR1cm4gYmFzZURlc2MuY3JlYXRlSW1hZ2UoKTsKLQkJfQotCQlJbWFnZURlc2NyaXB0b3JbXSBsb3dlckxlZnQgPSBnZXRMb3dlckxlZnRPdmVybGF5cyhmbGFncyk7Ci0JCUltYWdlRGVzY3JpcHRvcltdIHVwcGVyUmlnaHQgPSBnZXRVcHBlclJpZ2h0T3ZlcmxheXMoZmxhZ3MpOwotCQlJbWFnZURlc2NyaXB0b3JbXSBsb3dlclJpZ2h0ID0gZ2V0TG93ZXJSaWdodE92ZXJsYXlzKGZsYWdzKTsKLQkJSW1hZ2VEZXNjcmlwdG9yW10gdXBwZXJMZWZ0ID0gZ2V0VXBwZXJMZWZ0T3ZlcmxheXMoZmxhZ3MpOwotCQlPdmVybGF5SWNvbiBjb21wRGVzYyA9Ci0JCQluZXcgT3ZlcmxheUljb24oCi0JCQkJYmFzZURlc2MsCi0JCQkJbmV3IEltYWdlRGVzY3JpcHRvcltdW10geyB1cHBlclJpZ2h0LCBsb3dlclJpZ2h0LCBsb3dlckxlZnQsIHVwcGVyTGVmdCB9KTsKLQkJcmV0dXJuIGNvbXBEZXNjLmNyZWF0ZUltYWdlKCk7Ci0JfQotCQotCXByaXZhdGUgSW1hZ2UgY3JlYXRlSW1hZ2UoSW1hZ2UgYmFzZUltYWdlLCBpbnQgZmxhZ3MpIHsKLQkJaWYgKGZsYWdzID09IDApIHsKLQkJCXJldHVybiBiYXNlSW1hZ2U7Ci0JCX0KLQkJSW1hZ2VEZXNjcmlwdG9yW10gbG93ZXJMZWZ0ID0gZ2V0TG93ZXJMZWZ0T3ZlcmxheXMoZmxhZ3MpOwotCQlJbWFnZURlc2NyaXB0b3JbXSB1cHBlclJpZ2h0ID0gZ2V0VXBwZXJSaWdodE92ZXJsYXlzKGZsYWdzKTsKLQkJSW1hZ2VEZXNjcmlwdG9yW10gbG93ZXJSaWdodCA9IGdldExvd2VyUmlnaHRPdmVybGF5cyhmbGFncyk7Ci0JCUltYWdlRGVzY3JpcHRvcltdIHVwcGVyTGVmdCA9IGdldFVwcGVyTGVmdE92ZXJsYXlzKGZsYWdzKTsKLQkJSW1hZ2VPdmVybGF5SWNvbiBjb21wRGVzYyA9Ci0JCQluZXcgSW1hZ2VPdmVybGF5SWNvbigKLQkJCQliYXNlSW1hZ2UsCi0JCQkJbmV3IEltYWdlRGVzY3JpcHRvcltdW10geyB1cHBlclJpZ2h0LCBsb3dlclJpZ2h0LCBsb3dlckxlZnQsIHVwcGVyTGVmdCB9KTsKLQkJcmV0dXJuIGNvbXBEZXNjLmNyZWF0ZUltYWdlKCk7Ci0JfQotCi0JcHJpdmF0ZSBJbWFnZURlc2NyaXB0b3JbXSBnZXRMb3dlckxlZnRPdmVybGF5cyhpbnQgZmxhZ3MpIHsKLQkJaWYgKChmbGFncyAmIEZfRVJST1IpICE9IDApCi0JCQlyZXR1cm4gbmV3IEltYWdlRGVzY3JpcHRvcltdIHsgVXBkYXRlVUlJbWFnZXMuREVTQ19FUlJPUl9DTyB9OwotCQlpZiAoKGZsYWdzICYgRl9XQVJOSU5HKSAhPSAwKQotCQkJcmV0dXJuIG5ldyBJbWFnZURlc2NyaXB0b3JbXSB7IFVwZGF0ZVVJSW1hZ2VzLkRFU0NfV0FSTklOR19DTyB9OwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIEltYWdlRGVzY3JpcHRvcltdIGdldFVwcGVyUmlnaHRPdmVybGF5cyhpbnQgZmxhZ3MpIHsKLQkJaWYgKChmbGFncyAmIEZfQUREKSAhPSAwKQotCQkJcmV0dXJuIG5ldyBJbWFnZURlc2NyaXB0b3JbXSB7IFVwZGF0ZVVJSW1hZ2VzLkRFU0NfQUREX0NPIH07Ci0JCWlmICgoZmxhZ3MgJiBGX0RFTCkgIT0gMCkKLQkJCXJldHVybiBuZXcgSW1hZ2VEZXNjcmlwdG9yW10geyBVcGRhdGVVSUltYWdlcy5ERVNDX0RFTF9DTyB9OwotCQlpZiAoKGZsYWdzICYgRl9VTkNPTkZJR1VSRUQpICE9IDApCi0JCQlyZXR1cm4gbmV3IEltYWdlRGVzY3JpcHRvcltdIHsgVXBkYXRlVUlJbWFnZXMuREVTQ19VTkNPTkZfQ08gfTsKLQkJaWYgKChmbGFncyAmIEZfTElOS0VEKSAhPSAwKQotCQkJcmV0dXJuIG5ldyBJbWFnZURlc2NyaXB0b3JbXSB7IFVwZGF0ZVVJSW1hZ2VzLkRFU0NfTElOS0VEX0NPIH07Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIEltYWdlRGVzY3JpcHRvcltdIGdldExvd2VyUmlnaHRPdmVybGF5cyhpbnQgZmxhZ3MpIHsKLQkJaWYgKChmbGFncyAmIEZfQ1VSUkVOVCkgIT0gMCkKLQkJCXJldHVybiBuZXcgSW1hZ2VEZXNjcmlwdG9yW10geyBVcGRhdGVVSUltYWdlcy5ERVNDX0NVUlJFTlRfQ08gfTsKLQkJaWYgKChmbGFncyAmIEZfTU9EKSAhPSAwKQotCQkJcmV0dXJuIG5ldyBJbWFnZURlc2NyaXB0b3JbXSB7IFVwZGF0ZVVJSW1hZ2VzLkRFU0NfTU9EX0NPIH07Ci0JCS8qCi0JCWlmICgoZmxhZ3MgJiBGX0FERCkgIT0gMCkKLQkJCXJldHVybiBuZXcgSW1hZ2VEZXNjcmlwdG9yW10geyBVcGRhdGVVSUltYWdlcy5ERVNDX0FERF9DTyB9OwotCQlpZiAoKGZsYWdzICYgRl9ERUwpICE9IDApCi0JCQlyZXR1cm4gbmV3IEltYWdlRGVzY3JpcHRvcltdIHsgVXBkYXRlVUlJbWFnZXMuREVTQ19ERUxfQ08gfTsKLQkJaWYgKChmbGFncyAmIEZfVU5DT05GSUdVUkVEKSAhPSAwKQotCQkJcmV0dXJuIG5ldyBJbWFnZURlc2NyaXB0b3JbXSB7IFVwZGF0ZVVJSW1hZ2VzLkRFU0NfVU5DT05GX0NPIH07Ci0JCSovCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIEltYWdlRGVzY3JpcHRvcltdIGdldFVwcGVyTGVmdE92ZXJsYXlzKGludCBmbGFncykgewotCQlpZiAoKGZsYWdzICYgRl9VUERBVEVEKSAhPSAwKQotCQkJcmV0dXJuIG5ldyBJbWFnZURlc2NyaXB0b3JbXSB7IFVwZGF0ZVVJSW1hZ2VzLkRFU0NfVVBEQVRFRF9DTyB9OwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iaiwgaW50IGluZGV4KSB7Ci0JCXJldHVybiBnZXRUZXh0KG9iaik7Ci0JfQotCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3Qgb2JqLCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIGdldEltYWdlKG9iaik7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlRnJvbVBsdWdpbigKLQkJSVBsdWdpbkRlc2NyaXB0b3IgcGx1Z2luRGVzY3JpcHRvciwKLQkJU3RyaW5nIHN1YmRpcmVjdG9yeUFuZEZpbGVuYW1lKSB7Ci0JCVVSTCBpbnN0YWxsVVJMID0gcGx1Z2luRGVzY3JpcHRvci5nZXRJbnN0YWxsVVJMKCk7Ci0JCXJldHVybiBnZXRJbWFnZUZyb21VUkwoaW5zdGFsbFVSTCwgc3ViZGlyZWN0b3J5QW5kRmlsZW5hbWUpOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZUZyb21VUkwoCi0JCVVSTCBpbnN0YWxsVVJMLAotCQlTdHJpbmcgc3ViZGlyZWN0b3J5QW5kRmlsZW5hbWUpIHsKLQkJSW1hZ2UgaW1hZ2UgPSBudWxsOwotCQl0cnkgewotCQkJVVJMIG5ld1VSTCA9IG5ldyBVUkwoaW5zdGFsbFVSTCwgc3ViZGlyZWN0b3J5QW5kRmlsZW5hbWUpOwotCQkJU3RyaW5nIGtleSA9IG5ld1VSTC50b1N0cmluZygpOwotCQkJaW1hZ2UgPSAoSW1hZ2UpaW1hZ2VzLmdldChrZXkpOwotCQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCQlJbWFnZURlc2NyaXB0b3IgZGVzYyA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKG5ld1VSTCk7Ci0JCQkJaW1hZ2UgPSBkZXNjLmNyZWF0ZUltYWdlKCk7Ci0JCQkJaW1hZ2VzLnB1dChrZXksIGltYWdlKTsKLQkJCX0KLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJfSBjYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3BhcnRzL1NvcnRlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3BhcnRzL1NvcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGUzMDkwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wYXJ0cy9Tb3J0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnBhcnRzOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTb3J0ZXIgewotCi1wdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBjb21wYXJlKE9iamVjdCBlbGVtZW50T25lLCBPYmplY3QgZWxlbWVudFR3byk7Ci0KLXByaXZhdGUgT2JqZWN0W10gcXVpY2tTb3J0KE9iamVjdFtdIHNvcnRlZENvbGxlY3Rpb24sIGludCBsZWZ0LCBpbnQgcmlnaHQpIHsKLQlpbnQgb3JpZ2luYWxMZWZ0ID0gbGVmdDsKLQlpbnQgb3JpZ2luYWxSaWdodCA9IHJpZ2h0OwotCU9iamVjdCBtaWQgPSBzb3J0ZWRDb2xsZWN0aW9uWyAobGVmdCArIHJpZ2h0KSAvIDJdOwotCWRvIHsKLQkJd2hpbGUgKGNvbXBhcmUoc29ydGVkQ29sbGVjdGlvbltsZWZ0XSwgbWlkKSkKLQkJCWxlZnQrKzsKLQkJd2hpbGUgKGNvbXBhcmUobWlkLCBzb3J0ZWRDb2xsZWN0aW9uW3JpZ2h0XSkpCi0JCQlyaWdodC0tOwotCQlpZiAobGVmdCA8PSByaWdodCkgewotCQkJT2JqZWN0IHRtcCA9IHNvcnRlZENvbGxlY3Rpb25bbGVmdF07Ci0JCQlzb3J0ZWRDb2xsZWN0aW9uW2xlZnRdID0gc29ydGVkQ29sbGVjdGlvbltyaWdodF07Ci0JCQlzb3J0ZWRDb2xsZWN0aW9uW3JpZ2h0XSA9IHRtcDsKLQkJCWxlZnQrKzsKLQkJCXJpZ2h0LS07Ci0JCX0KLQl9IHdoaWxlIChsZWZ0IDw9IHJpZ2h0KTsKLQlpZiAob3JpZ2luYWxMZWZ0IDwgcmlnaHQpCi0JCXNvcnRlZENvbGxlY3Rpb24gPSBxdWlja1NvcnQoc29ydGVkQ29sbGVjdGlvbiwgb3JpZ2luYWxMZWZ0LCByaWdodCk7Ci0JaWYgKGxlZnQgPCBvcmlnaW5hbFJpZ2h0KQotCQlzb3J0ZWRDb2xsZWN0aW9uID0gcXVpY2tTb3J0KHNvcnRlZENvbGxlY3Rpb24sIGxlZnQsIG9yaWdpbmFsUmlnaHQpOwotCXJldHVybiBzb3J0ZWRDb2xsZWN0aW9uOwotfQotCi1wdWJsaWMgT2JqZWN0W10gc29ydChPYmplY3RbXSB1blNvcnRlZENvbGxlY3Rpb24pIHsKLQlpbnQgc2l6ZSA9IHVuU29ydGVkQ29sbGVjdGlvbi5sZW5ndGg7Ci0JT2JqZWN0W10gc29ydGVkQ29sbGVjdGlvbiA9IG5ldyBPYmplY3Rbc2l6ZV07Ci0JLy9jb3B5IHRoZSBhcnJheSBzbyBjYW4gcmV0dXJuIGEgbmV3IHNvcnRlZCBjb2xsZWN0aW9uCQotCVN5c3RlbS5hcnJheWNvcHkodW5Tb3J0ZWRDb2xsZWN0aW9uLCAwLCBzb3J0ZWRDb2xsZWN0aW9uLCAwLCBzaXplKTsKLQlpZiAoc2l6ZSA+IDEpCi0JCXF1aWNrU29ydChzb3J0ZWRDb2xsZWN0aW9uLCAwLCBzaXplIC0gMSk7Ci0JcmV0dXJuIHNvcnRlZENvbGxlY3Rpb247Ci19Ci0KLXB1YmxpYyB2b2lkIHNvcnRJblBsYWNlKE9iamVjdFtdIHVuU29ydGVkQ29sbGVjdGlvbikgewotCWludCBzaXplID0gdW5Tb3J0ZWRDb2xsZWN0aW9uLmxlbmd0aDsKLQlpZiAoc2l6ZSA+IDEpCi0JCXF1aWNrU29ydCh1blNvcnRlZENvbGxlY3Rpb24sIDAsIHNpemUgLSAxKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3BhcnRzL1ZvbHVtZUxhYmVsUHJvdmlkZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wYXJ0cy9Wb2x1bWVMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhNDU5NzMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3BhcnRzL1ZvbHVtZUxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wYXJ0czsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuKjsKLQotcHVibGljIGNsYXNzIFZvbHVtZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1ZPTFVNRV9DRFJPTSA9ICJWb2x1bWVMYWJlbFByb3ZpZGVyLmNkcm9tIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1ZPTFVNRV9GTE9QUFlfMyA9Ci0JCSJWb2x1bWVMYWJlbFByb3ZpZGVyLmZsb3BweTMiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVk9MVU1FX0ZMT1BQWV81ID0KLQkJIlZvbHVtZUxhYmVsUHJvdmlkZXIuZmxvcHB5NSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9MT0NBTF9ESVNLID0KLQkJIlZvbHVtZUxhYmVsUHJvdmlkZXIubG9jYWxEaXNrIjsKLQlwcml2YXRlIEltYWdlIGNkSW1hZ2U7Ci0JcHJpdmF0ZSBJbWFnZSB2Zml4ZWRJbWFnZTsKLQlwcml2YXRlIEltYWdlIGZsb3BweUltYWdlOwotCXByaXZhdGUgSW1hZ2UgdnJlbW92YWJsZUltYWdlOwotCXByaXZhdGUgSW1hZ2UgdnJlbW90ZUltYWdlOwotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBWb2x1bWVMYWJlbFByb3ZpZGVyLgotCSAqLwotCXB1YmxpYyBWb2x1bWVMYWJlbFByb3ZpZGVyKCkgewotCQlmbG9wcHlJbWFnZSA9IFVwZGF0ZVVJSW1hZ2VzLkRFU0NfRkxPUFBZX09CSi5jcmVhdGVJbWFnZSgpOwotCQljZEltYWdlID0gVXBkYXRlVUlJbWFnZXMuREVTQ19DRF9PQkouY3JlYXRlSW1hZ2UoKTsKLQkJdmZpeGVkSW1hZ2UgPSBVcGRhdGVVSUltYWdlcy5ERVNDX1ZGSVhFRF9PQkouY3JlYXRlSW1hZ2UoKTsKLQkJdnJlbW90ZUltYWdlID0gVXBkYXRlVUlJbWFnZXMuREVTQ19WUkVNT1RFX09CSi5jcmVhdGVJbWFnZSgpOwotCQl2cmVtb3ZhYmxlSW1hZ2UgPQotCQkJVXBkYXRlVUlJbWFnZXMuREVTQ19WUkVNT1ZBQkxFX09CSi5jcmVhdGVJbWFnZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBJVm9sdW1lKSB7Ci0JCQlyZXR1cm4gZ2V0Vm9sdW1lVGV4dCgoSVZvbHVtZSkgb2JqKTsKLQkJfQotCQlyZXR1cm4gb2JqLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0Vm9sdW1lVGV4dChJVm9sdW1lIHZvbHVtZSkgewotCQlTdHJpbmcgZmlsZU5hbWUgPSBnZXRWb2x1bWVOYW1lKHZvbHVtZSk7Ci0JCVN0cmluZyBuYXRpdmVMYWJlbCA9IHZvbHVtZS5nZXRMYWJlbCgpOwotCQlpZiAobmF0aXZlTGFiZWwgPT0gbnVsbCB8fCBuYXRpdmVMYWJlbC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkvLyBzZXQgd2VsbC1rbm93biBuYW1lcyBmb3IgdHlwZXMKLQkJCWludCB0eXBlID0gdm9sdW1lLmdldFR5cGUoKTsKLQkJCXN3aXRjaCAodHlwZSkgewotCQkJCWNhc2UgTG9jYWxTeXN0ZW1JbmZvLlZPTFVNRV9DRFJPTSA6Ci0JCQkJCW5hdGl2ZUxhYmVsID0KLQkJCQkJCVVwZGF0ZVVJLmdldFN0cmluZyhLRVlfVk9MVU1FX0NEUk9NKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBMb2NhbFN5c3RlbUluZm8uVk9MVU1FX0ZMT1BQWV8zIDoKLQkJCQkJbmF0aXZlTGFiZWwgPQotCQkJCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9WT0xVTUVfRkxPUFBZXzMpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIExvY2FsU3lzdGVtSW5mby5WT0xVTUVfRkxPUFBZXzUgOgotCQkJCQluYXRpdmVMYWJlbCA9Ci0JCQkJCQlVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX1ZPTFVNRV9GTE9QUFlfNSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTG9jYWxTeXN0ZW1JbmZvLlZPTFVNRV9GSVhFRDoKLQkJCQkJbmF0aXZlTGFiZWwgPSAKLQkJCQkJCVVwZGF0ZVVJLmdldFN0cmluZyhLRVlfTE9DQUxfRElTSyk7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChuYXRpdmVMYWJlbCAhPSBudWxsICYmIG5hdGl2ZUxhYmVsLmxlbmd0aCgpID4gMCkgewotCQkJcmV0dXJuIG5hdGl2ZUxhYmVsICsgIiAoIiArIGZpbGVOYW1lICsgIikiOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGZpbGVOYW1lOwotCQl9Ci0JfQotCXByaXZhdGUgU3RyaW5nIGdldFZvbHVtZU5hbWUoSVZvbHVtZSB2b2x1bWUpIHsKLQkJU3RyaW5nIG5hbWUgPSB2b2x1bWUuZ2V0RmlsZSgpLmdldFBhdGgoKTsKLQkJaWYgKG5hbWUuZW5kc1dpdGgoRmlsZS5zZXBhcmF0b3IpICYmIG5hbWUubGVuZ3RoKCk+MSkgewotCQkJbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDAsIG5hbWUubGVuZ3RoKCktMSk7Ci0JCX0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIElWb2x1bWUpIHsKLQkJCXJldHVybiBnZXRWb2x1bWVJbWFnZSgoSVZvbHVtZSkgb2JqKTsKLQkJfQotCQlyZXR1cm4gdmZpeGVkSW1hZ2U7Ci0JfQotCXByaXZhdGUgSW1hZ2UgZ2V0Vm9sdW1lSW1hZ2UoSVZvbHVtZSB2b2x1bWUpIHsKLQkJc3dpdGNoICh2b2x1bWUuZ2V0VHlwZSgpKSB7Ci0JCQljYXNlIExvY2FsU3lzdGVtSW5mby5WT0xVTUVfQ0RST00gOgotCQkJCXJldHVybiBjZEltYWdlOwotCQkJY2FzZSBMb2NhbFN5c3RlbUluZm8uVk9MVU1FX0ZJWEVEIDoKLQkJCQlyZXR1cm4gdmZpeGVkSW1hZ2U7Ci0JCQljYXNlIExvY2FsU3lzdGVtSW5mby5WT0xVTUVfRkxPUFBZXzMgOgotCQkJY2FzZSBMb2NhbFN5c3RlbUluZm8uVk9MVU1FX0ZMT1BQWV81IDoKLQkJCQlyZXR1cm4gZmxvcHB5SW1hZ2U7Ci0JCQljYXNlIExvY2FsU3lzdGVtSW5mby5WT0xVTUVfUkFNRElTSyA6Ci0JCQljYXNlIExvY2FsU3lzdGVtSW5mby5WT0xVTUVfUkVNT1ZBQkxFIDoKLQkJCQlyZXR1cm4gdnJlbW92YWJsZUltYWdlOwotCQkJY2FzZSBMb2NhbFN5c3RlbUluZm8uVk9MVU1FX1JFTU9URSA6Ci0JCQkJcmV0dXJuIHZyZW1vdGVJbWFnZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL0FwcFNlcnZlclByZWZlcmVuY2VQYWdlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvQXBwU2VydmVyUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZjMTdmNS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvQXBwU2VydmVyUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLldvcmtiZW5jaEhlbHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBAc2VlIFByZWZlcmVuY2VQYWdlCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHBTZXJ2ZXJQcmVmZXJlbmNlUGFnZQotCWV4dGVuZHMgRmllbGRFZGl0b3JQcmVmZXJlbmNlUGFnZQotCWltcGxlbWVudHMgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RFU0NSSVBUSU9OID0KLQkJIkFwcFNlcnZlclByZWZlcmVuY2VQYWdlLmRlc2NyaXB0aW9uIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYID0gVXBkYXRlVUkuZ2V0UGx1Z2luSWQoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX01BU1RFUl9TV0lUQ0ggPSBQUkVGSVggKyAiLmFwcFNlcnZlciI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUF9FTkNPREVfVVJMUyA9IFBSRUZJWCArICIuZW5jb2RlVVJMcyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9NQVNURVJfU1dJVENIID0KLQkJIkFwcFNlcnZlclByZWZlcmVuY2VQYWdlLm1hc3RlclN3aXRjaCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9FTkNPREVfVVJMUyA9Ci0JCSJBcHBTZXJ2ZXJQcmVmZXJlbmNlUGFnZS5lbmNvZGVVUkxzIjsKLQkvL3ByaXZhdGUgTWFzdGVyRmllbGQgbWFzdGVyRmllbGQ7Ci0JcHJpdmF0ZSBCb29sZWFuRmllbGRFZGl0b3IgbWFzdGVyRmllbGQ7Ci0KLS8qCi0JY2xhc3MgTWFzdGVyRmllbGQgZXh0ZW5kcyBCb29sZWFuRmllbGRFZGl0b3IgewotCQlCb29sZWFuRmllbGRFZGl0b3Igc2xhdmU7Ci0JCXB1YmxpYyBNYXN0ZXJGaWVsZChTdHJpbmcgcHJvcGVydHksIFN0cmluZyBrZXksIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCXN1cGVyKHByb3BlcnR5LCBrZXksIHBhcmVudCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCB2YWx1ZUNoYW5nZWQoYm9vbGVhbiBvbGRWYWx1ZSwgYm9vbGVhbiBuZXdWYWx1ZSkgewotCQkJc3VwZXIudmFsdWVDaGFuZ2VkKG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JCQlzbGF2ZS5zZXRFbmFibGVkKG5ld1ZhbHVlLCBnZXRGaWVsZEVkaXRvclBhcmVudCgpKTsKLQkJfQotCi0JCXZvaWQgdXBkYXRlKCkgewotCQkJc2xhdmUuc2V0RW5hYmxlZChnZXRCb29sZWFuVmFsdWUoKSwgZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRTbGF2ZShCb29sZWFuRmllbGRFZGl0b3Igc2xhdmUpIHsKLQkJCXRoaXMuc2xhdmUgPSBzbGF2ZTsKLQkJfQotCX0KLSovCi0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIEFwcFNlcnZlclByZWZlcmVuY2VQYWdlKCkgewotCQlzdXBlcihHUklEKTsKLQkJc2V0UHJlZmVyZW5jZVN0b3JlKFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0JCXNldERlc2NyaXB0aW9uKFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfREVTQ1JJUFRJT04pKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuCi0JICogQHNlZSBQcmVmZXJlbmNlUGFnZSNpbml0Ci0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgewotCX0KLQlwdWJsaWMgdm9pZCBjcmVhdGVGaWVsZEVkaXRvcnMoKSB7Ci0JCVdvcmtiZW5jaEhlbHAuc2V0SGVscCgKLQkJCWdldEZpZWxkRWRpdG9yUGFyZW50KCksCi0JCQkib3JnLmVjbGlwc2UudXBkYXRlLnVpLkFwcFNlcnZlclByZWZlcmVuY2VQYWdlIik7Ci0JCW1hc3RlckZpZWxkID0KLQkJCW5ldyBCb29sZWFuRmllbGRFZGl0b3IoCi0JCQkJUF9NQVNURVJfU1dJVENILAotCQkJCVVwZGF0ZVVJLmdldFN0cmluZyhLRVlfTUFTVEVSX1NXSVRDSCksCi0JCQkJZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSk7Ci0JCWFkZEZpZWxkKG1hc3RlckZpZWxkKTsKLQkJLyoKLQkJQm9vbGVhbkZpZWxkRWRpdG9yIGVuY29kZVVSTHMgPQotCQkJbmV3IEJvb2xlYW5GaWVsZEVkaXRvcigKLQkJCQlQX0VOQ09ERV9VUkxTLAotCQkJCVVwZGF0ZVVJLmdldFN0cmluZyhLRVlfRU5DT0RFX1VSTFMpLAotCQkJCWdldEZpZWxkRWRpdG9yUGFyZW50KCkpOwotCQlhZGRGaWVsZChlbmNvZGVVUkxzKTsKLQkJbWFzdGVyRmllbGQuc2V0U2xhdmUoZW5jb2RlVVJMcyk7Ci0JCSovCi0JfQotCQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlci5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQoZ2V0Q29udHJvbCgpKTsKLQkJV29ya2JlbmNoSGVscC5zZXRIZWxwKAotCQkJcGFyZW50LCJvcmcuZWNsaXBzZS51cGRhdGUudWkuQXBwU2VydmVyUHJlZmVyZW5jZVBhZ2UiKTsKLQl9CQotLyoKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQlzdXBlci5pbml0aWFsaXplKCk7Ci0JCW1hc3RlckZpZWxkLnVwZGF0ZSgpOwotCX0KLSovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlU3BhY2VyKENvbXBvc2l0ZSBjb21wb3NpdGUsIGludCBjb2x1bW5TcGFuKSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IGNvbHVtblNwYW47Ci0JCWxhYmVsLnNldExheW91dERhdGEoZ2QpOwotCX0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0VXNlQXBwbGljYXRpb25TZXJ2ZXIoKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPQotCQkJVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlyZXR1cm4gc3RvcmUuZ2V0Qm9vbGVhbihQX01BU1RFUl9TV0lUQ0gpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRFbmNvZGVVUkxzKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQkJLyoKLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9Ci0JCQlVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCXJldHVybiBzdG9yZS5nZXRCb29sZWFuKFBfRU5DT0RFX1VSTFMpOwotCQkqLwotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBzdXBlci5wZXJmb3JtT2soKTsKLQkJaWYgKHJlc3VsdCkgewotCQkJZmluYWwgYm9vbGVhbiBiYWdbXSA9IG5ldyBib29sZWFuWzFdOwotCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWhhbmRsZVNlcnZlckFjdGl2YXRpb24oKTsKLQkJCQkJCWJhZ1swXSA9IHRydWU7Ci0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJVXBkYXRlVUkubG9nRXhjZXB0aW9uKGUpOwotCQkJCQkJYmFnWzBdID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJCXJlc3VsdCA9IGJhZ1swXTsKLQkJfQotCQlpZiAocmVzdWx0KQotCQkJVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVTZXJ2ZXJBY3RpdmF0aW9uKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlib29sZWFuIG1hc3RlclN3aXRjaCA9IGdldFVzZUFwcGxpY2F0aW9uU2VydmVyKCk7Ci0JCWJvb2xlYW4gd2ViQXBwUnVubmluZyA9IFVwZGF0ZVVJLmdldERlZmF1bHQoKS5pc1dlYkFwcFN0YXJ0ZWQoKTsKLQotCQlpZiAoIW1hc3RlclN3aXRjaCAmJiB3ZWJBcHBSdW5uaW5nKSB7Ci0JCQkvLyByZW1vdmUgV2ViIGFwcAotCQkJVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLnN0b3BXZWJBcHAoKTsKLQkJfSBlbHNlIGlmIChtYXN0ZXJTd2l0Y2ggJiYgIXdlYkFwcFJ1bm5pbmcpIHsKLQkJCS8vIGFkZCBXZWIgYXBwCi0JCQlVcGRhdGVVSS5nZXREZWZhdWx0KCkuc3RhcnRXZWJBcHAoKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvTWFpblByZWZlcmVuY2VQYWdlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvTWFpblByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0YmJkODIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL01haW5QcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5Xb3JrYmVuY2hIZWxwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlNpdGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQHNlZSBQcmVmZXJlbmNlUGFnZQotICovCi1wdWJsaWMgY2xhc3MgTWFpblByZWZlcmVuY2VQYWdlCi0JZXh0ZW5kcyBGaWVsZEVkaXRvclByZWZlcmVuY2VQYWdlCi0JaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfREVTQ1JJUFRJT04gPQotCQkiTWFpblByZWZlcmVuY2VQYWdlLmRlc2NyaXB0aW9uIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYID0gVXBkYXRlVUkuZ2V0UGx1Z2luSWQoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX0hJU1RPUllfU0laRSA9IFBSRUZJWCArICIuaGlzdG9yeVNpemUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBfQ0hFQ0tfU0lHTkFUVVJFID0gUFJFRklYICsgIi5jaGVja1NpZ25hdHVyZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUF9CUk9XU0VSID0gUFJFRklYICsgIi5icm93c2VyIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTUJFRERFRF9WQUxVRSA9ICJlbWJlZGRlZCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNZU1RFTV9WQUxVRSA9ICJzeXN0ZW0iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ0hFQ0tfU0lHTkFUVVJFID0KLQkJIk1haW5QcmVmZXJlbmNlUGFnZS5jaGVja1NpZ25hdHVyZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ISVNUT1JZX1NJWkUgPQotCQkiTWFpblByZWZlcmVuY2VQYWdlLmhpc3RvcnlTaXplIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1RPUElDX0NPTE9SID0KLQkJIk1haW5QcmVmZXJlbmNlUGFnZS50b3BpY0NvbG9yIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0JST1dTRVJfQ0hPSUNFID0KLQkJIk1haW5QcmVmZXJlbmNlUGFnZS5icm93c2VyQ2hvaWNlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0JST1dTRVJfQ0hPSUNFX0VNQkVEREVEID0KLQkJIk1haW5QcmVmZXJlbmNlUGFnZS5icm93c2VyQ2hvaWNlLmVtYmVkZGVkIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0JST1dTRVJfQ0hPSUNFX1NZU1RFTSA9Ci0JCSJNYWluUHJlZmVyZW5jZVBhZ2UuYnJvd3NlckNob2ljZS5zeXN0ZW0iOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUF9VUERBVEVfVkVSU0lPTlMgPSBQUkVGSVggKyAiLnVwZGF0ZVZlcnNpb25zIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1VQREFURV9WRVJTSU9OUyA9Ci0JCSJNYWluUHJlZmVyZW5jZVBhZ2UudXBkYXRlVmVyc2lvbnMiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVVBEQVRFX1ZFUlNJT05TX0VRVUlWQUxFTlQgPQotCQkiTWFpblByZWZlcmVuY2VQYWdlLnVwZGF0ZVZlcnNpb25zLmVxdWl2YWxlbnQiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVVBEQVRFX1ZFUlNJT05TX0NPTVBBVElCTEUgPQotCQkiTWFpblByZWZlcmVuY2VQYWdlLnVwZGF0ZVZlcnNpb25zLmNvbXBhdGlibGUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVRVUlWQUxFTlRfVkFMVUUgPSAiZXF1aXZhbGVudCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUEFUSUJMRV9WQUxVRSA9ICJjb21wYXRpYmxlIjsKLQotCXByaXZhdGUgQm9vbGVhbkZpZWxkRWRpdG9yIGNoZWNrU2lnbmF0dXJlRWRpdG9yOwotCXByaXZhdGUgTGFiZWwgaHR0cFByb3h5SG9zdExhYmVsOwotCXByaXZhdGUgTGFiZWwgaHR0cFByb3h5UG9ydExhYmVsOwotCXByaXZhdGUgVGV4dCBodHRwUHJveHlIb3N0VGV4dDsKLQlwcml2YXRlIFRleHQgaHR0cFByb3h5UG9ydFRleHQ7Ci0JcHJpdmF0ZSBCdXR0b24gZW5hYmxlSHR0cFByb3h5OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRU5BQkxFX0hUVFBfUFJPWFkgPQotCQkiTWFpblByZWZlcmVuY2VQYWdlLmVuYWJsZUh0dHBQcm94eSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9IVFRQX1BST1hZX1NFUlZFUiA9Ci0JCSJNYWluUHJlZmVyZW5jZVBhZ2UuaHR0cFByb3h5SG9zdCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9IVFRQX1BST1hZX1BPUlQgPQotCQkiTWFpblByZWZlcmVuY2VQYWdlLmh0dHBQcm94eVBvcnQiOwotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBNYWluUHJlZmVyZW5jZVBhZ2UoKSB7Ci0JCXN1cGVyKEdSSUQpOwotCQlzZXRQcmVmZXJlbmNlU3RvcmUoVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQkJc2V0RGVzY3JpcHRpb24oVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9ERVNDUklQVElPTikpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLQkgKiBAc2VlIFByZWZlcmVuY2VQYWdlI2luaXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0JfQotCXB1YmxpYyB2b2lkIGNyZWF0ZUZpZWxkRWRpdG9ycygpIHsKLQkJV29ya2JlbmNoSGVscC5zZXRIZWxwKAotCQkJZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSwKLQkJCSJvcmcuZWNsaXBzZS51cGRhdGUudWkuTWFpblByZWZlcmVuY2VQYWdlIik7Ci0JCUludGVnZXJGaWVsZEVkaXRvciBtYXhMZXZlbCA9Ci0JCQluZXcgSW50ZWdlckZpZWxkRWRpdG9yKAotCQkJCVBfSElTVE9SWV9TSVpFLAotCQkJCVVwZGF0ZVVJLmdldFN0cmluZyhLRVlfSElTVE9SWV9TSVpFKSwKLQkJCQlnZXRGaWVsZEVkaXRvclBhcmVudCgpKTsKLQkJbWF4TGV2ZWwuc2V0VmFsaWRSYW5nZSgxLCBJbnRlZ2VyLk1BWF9WQUxVRSk7Ci0JCWFkZEZpZWxkKG1heExldmVsKTsKLQkJY2hlY2tTaWduYXR1cmVFZGl0b3IgPQotCQkJbmV3IEJvb2xlYW5GaWVsZEVkaXRvcigKLQkJCQlQX0NIRUNLX1NJR05BVFVSRSwKLQkJCQlVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX0NIRUNLX1NJR05BVFVSRSksCi0JCQkJZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSk7Ci0JCWFkZEZpZWxkKGNoZWNrU2lnbmF0dXJlRWRpdG9yKTsKLQkJaWYgKCJ3aW4zMiIuZXF1YWxzKFNXVC5nZXRQbGF0Zm9ybSgpKSkgewotCQkJUmFkaW9Hcm91cEZpZWxkRWRpdG9yIGJyb3dzZXIgPQotCQkJCW5ldyBSYWRpb0dyb3VwRmllbGRFZGl0b3IoCi0JCQkJCVBfQlJPV1NFUiwKLQkJCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9CUk9XU0VSX0NIT0lDRSksCi0JCQkJCTEsCi0JCQkJCW5ldyBTdHJpbmdbXVtdIHsKLQkJCQkJCXsKLQkJCQkJCQlVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX0JST1dTRVJfQ0hPSUNFX0VNQkVEREVEKSwKLQkJCQkJCQlFTUJFRERFRF9WQUxVRSB9LAotCQkJCQkJewotCQkJCQlVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX0JST1dTRVJfQ0hPSUNFX1NZU1RFTSksCi0JCQkJCQlTWVNURU1fVkFMVUUgfQotCQkJfSwgZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSwgdHJ1ZSk7Ci0JCQlhZGRGaWVsZChicm93c2VyKTsKLQkJfQotCQljcmVhdGVTcGFjZXIoZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSwgMik7Ci0KLQkJUmFkaW9Hcm91cEZpZWxkRWRpdG9yIHVwZGF0ZVZlcnNpb25zID0KLQkJCW5ldyBSYWRpb0dyb3VwRmllbGRFZGl0b3IoCi0JCQkJUF9VUERBVEVfVkVSU0lPTlMsCi0JCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9VUERBVEVfVkVSU0lPTlMpLAotCQkJCTEsCi0JCQkJbmV3IFN0cmluZ1tdW10gewotCQkJCQl7Ci0JCQkJCQlVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX1VQREFURV9WRVJTSU9OU19FUVVJVkFMRU5UKSwKLQkJCQkJCUVRVUlWQUxFTlRfVkFMVUUgfSwKLQkJCQkJewotCQkJCVVwZGF0ZVVJLmdldFN0cmluZyhLRVlfVVBEQVRFX1ZFUlNJT05TX0NPTVBBVElCTEUpLAotCQkJCQlDT01QQVRJQkxFX1ZBTFVFIH0KLQkJfSwgZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSwgdHJ1ZSk7Ci0JCWFkZEZpZWxkKHVwZGF0ZVZlcnNpb25zKTsKLQotCQljcmVhdGVTcGFjZXIoZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSwgMik7Ci0KLQkJQ29sb3JGaWVsZEVkaXRvciB0b3BpY0NvbG9yID0KLQkJCW5ldyBDb2xvckZpZWxkRWRpdG9yKAotCQkJCVVwZGF0ZUNvbG9ycy5QX1RPUElDX0NPTE9SLAotCQkJCVVwZGF0ZVVJLmdldFN0cmluZyhLRVlfVE9QSUNfQ09MT1IpLAotCQkJCWdldEZpZWxkRWRpdG9yUGFyZW50KCkpOwotCQlhZGRGaWVsZCh0b3BpY0NvbG9yKTsKLQotCQljcmVhdGVTcGFjZXIoZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSwgMik7Ci0JCWNyZWF0ZUh0dHBQcm94eShnZXRGaWVsZEVkaXRvclBhcmVudCgpLCAyKTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlci5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQoZ2V0Q29udHJvbCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVTcGFjZXIoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgaW50IGNvbHVtblNwYW4pIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gY29sdW1uU3BhbjsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0JfQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUh0dHBQcm94eShDb21wb3NpdGUgY29tcG9zaXRlLCBpbnQgY29sdW1uU3BhbikgewotCQlHcm91cCBncm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZ3JvdXAuc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoIk1haW5QcmVmZXJlbmNlUGFnZS5wcm94eUdyb3VwIikpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJZ3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gY29sdW1uU3BhbjsKLQkJZ2QuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyb3VwLnNldExheW91dERhdGEoZ2QpOwotCQlncm91cC5zZXRGb250KGNvbXBvc2l0ZS5nZXRGb250KCkpOwotCi0JCWVuYWJsZUh0dHBQcm94eSA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWVuYWJsZUh0dHBQcm94eS5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfRU5BQkxFX0hUVFBfUFJPWFkpKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQllbmFibGVIdHRwUHJveHkuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJaHR0cFByb3h5SG9zdExhYmVsID0gbmV3IExhYmVsKGdyb3VwLCBTV1QuTk9ORSk7Ci0JCWh0dHBQcm94eUhvc3RMYWJlbC5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfSFRUUF9QUk9YWV9TRVJWRVIpKTsKLQotCQlodHRwUHJveHlIb3N0VGV4dCA9IG5ldyBUZXh0KGdyb3VwLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCWh0dHBQcm94eUhvc3RUZXh0LnNldEZvbnQoZ3JvdXAuZ2V0Rm9udCgpKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJaHR0cFByb3h5SG9zdFRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJaHR0cFByb3h5UG9ydExhYmVsID0gbmV3IExhYmVsKGdyb3VwLCBTV1QuTk9ORSk7Ci0JCWh0dHBQcm94eVBvcnRMYWJlbC5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfSFRUUF9QUk9YWV9QT1JUKSk7Ci0KLQkJaHR0cFByb3h5UG9ydFRleHQgPSBuZXcgVGV4dChncm91cCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlodHRwUHJveHlQb3J0VGV4dC5zZXRGb250KGdyb3VwLmdldEZvbnQoKSk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWh0dHBQcm94eVBvcnRUZXh0LnNldExheW91dERhdGEoZ2QpOwotCi0JCXBlcmZvcm1EZWZhdWx0cygpOwotCi0JCWVuYWJsZUh0dHBQcm94eS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJYm9vbGVhbiBlbmFibGUgPSBlbmFibGVIdHRwUHJveHkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaHR0cFByb3h5UG9ydExhYmVsLnNldEVuYWJsZWQoZW5hYmxlKTsKLQkJCQlodHRwUHJveHlIb3N0TGFiZWwuc2V0RW5hYmxlZChlbmFibGUpOwotCQkJCWh0dHBQcm94eVBvcnRUZXh0LnNldEVuYWJsZWQoZW5hYmxlKTsKLQkJCQlodHRwUHJveHlIb3N0VGV4dC5zZXRFbmFibGVkKGVuYWJsZSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQotCX0KLQlwcml2YXRlIGludCBnZXRIaXN0b3J5U2l6ZSgpIHsKLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJcmV0dXJuIHN0b3JlLmdldEludChQX0hJU1RPUllfU0laRSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldENoZWNrRGlnaXRhbFNpZ25hdHVyZSgpIHsKLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJcmV0dXJuIHN0b3JlLmdldEJvb2xlYW4oUF9DSEVDS19TSUdOQVRVUkUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRVc2VFbWJlZGRlZEJyb3dzZXIoKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCXJldHVybiBzdG9yZS5nZXRTdHJpbmcoUF9CUk9XU0VSKS5lcXVhbHMoRU1CRURERURfVkFMVUUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFVwZGF0ZVZlcnNpb25zTW9kZSgpIHsKLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJcmV0dXJuIHN0b3JlLmdldFN0cmluZyhQX1VQREFURV9WRVJTSU9OUyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlib29sZWFuIHJlc3VsdCA9IHN1cGVyLnBlcmZvcm1PaygpOwotCQlpZiAocmVzdWx0KSB7Ci0JCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShnZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQl0cnkgewotCQkJCQkJU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkuc2V0TWF4aW11bUhpc3RvcnlDb3VudCgKLQkJCQkJCQlnZXRIaXN0b3J5U2l6ZSgpKTsKLQkJCQkJCVNpdGVNYW5hZ2VyLnNldEh0dHBQcm94eUluZm8oCi0JCQkJCQkJZW5hYmxlSHR0cFByb3h5LmdldFNlbGVjdGlvbigpLAotCQkJCQkJCWh0dHBQcm94eUhvc3RUZXh0LmdldFRleHQoKSwKLQkJCQkJCQlodHRwUHJveHlQb3J0VGV4dC5nZXRUZXh0KCkpOwotCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCVVwZGF0ZVVJLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCVVwZGF0ZVVJLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JcHVibGljIHZvaWQgcGVyZm9ybUFwcGx5KCkgewotCQlzdXBlci5wZXJmb3JtQXBwbHkoKTsKLQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVNpdGVNYW5hZ2VyLnNldEh0dHBQcm94eUluZm8oCi0JCQkJCWVuYWJsZUh0dHBQcm94eS5nZXRTZWxlY3Rpb24oKSwKLQkJCQkJaHR0cFByb3h5SG9zdFRleHQuZ2V0VGV4dCgpLAotCQkJCQlodHRwUHJveHlQb3J0VGV4dC5nZXRUZXh0KCkpOwotCQkJfQotCQl9KTsKLQl9Ci0JcHVibGljIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQotCQllbmFibGVIdHRwUHJveHkuc2V0U2VsZWN0aW9uKFNpdGVNYW5hZ2VyLmlzSHR0cFByb3h5RW5hYmxlKCkpOwotCQlTdHJpbmcgc2VydmVyVmFsdWUgPSBTaXRlTWFuYWdlci5nZXRIdHRwUHJveHlTZXJ2ZXIoKTsKLQkJaWYgKHNlcnZlclZhbHVlICE9IG51bGwpCi0JCQlodHRwUHJveHlIb3N0VGV4dC5zZXRUZXh0KHNlcnZlclZhbHVlKTsKLQkJU3RyaW5nIHBvcnRWYWx1ZSA9IFNpdGVNYW5hZ2VyLmdldEh0dHBQcm94eVBvcnQoKTsKLQkJaWYgKHBvcnRWYWx1ZSAhPSBudWxsKQotCQkJaHR0cFByb3h5UG9ydFRleHQuc2V0VGV4dChwb3J0VmFsdWUpOwotCi0JCWh0dHBQcm94eVBvcnRMYWJlbC5zZXRFbmFibGVkKGVuYWJsZUh0dHBQcm94eS5nZXRTZWxlY3Rpb24oKSk7Ci0JCWh0dHBQcm94eUhvc3RMYWJlbC5zZXRFbmFibGVkKGVuYWJsZUh0dHBQcm94eS5nZXRTZWxlY3Rpb24oKSk7Ci0JCWh0dHBQcm94eVBvcnRUZXh0LnNldEVuYWJsZWQoZW5hYmxlSHR0cFByb3h5LmdldFNlbGVjdGlvbigpKTsKLQkJaHR0cFByb3h5SG9zdFRleHQuc2V0RW5hYmxlZChlbmFibGVIdHRwUHJveHkuZ2V0U2VsZWN0aW9uKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXN1cGVyLnByb3BlcnR5Q2hhbmdlKGV2ZW50KTsKLQkJaWYgKGV2ZW50LmdldFNvdXJjZSgpLmVxdWFscyhjaGVja1NpZ25hdHVyZUVkaXRvcikpIHsKLQkJCWlmIChldmVudC5nZXROZXdWYWx1ZSgpLmVxdWFscyhCb29sZWFuLkZBTFNFKSkgewotCQkJCXdhcm5TaWduYXR1cmVDaGVjayhnZXRTaGVsbCgpKTsKLQkJCX0KLQkJfQotCX0JCi0KLQlwcml2YXRlIHZvaWQgd2FyblNpZ25hdHVyZUNoZWNrKFNoZWxsIHNoZWxsKSB7Ci0JCU1lc3NhZ2VEaWFsb2cub3Blbldhcm5pbmcoCi0JCQlzaGVsbCwKLQkJCVVwZGF0ZVVJLmdldFN0cmluZygiTWFpblByZWZlcmVuY2VQYWdlLmRpZ2l0YWxTaWduYXR1cmUudGl0bGUiKSwKLQkJCVVwZGF0ZVVJLmdldFN0cmluZygiTWFpblByZWZlcmVuY2VQYWdlLmRpZ2l0YWxTaWduYXR1cmUubWVzc2FnZSIpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL1VwZGF0ZUNvbG9ycy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL1VwZGF0ZUNvbG9ycy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODQwYzFiLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9VcGRhdGVDb2xvcnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJOwotCi1wdWJsaWMgY2xhc3MgVXBkYXRlQ29sb3JzIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX1RPUElDX0NPTE9SID0gIlVwZGF0ZUNvbG9ycy50b3BpY0NvbG9yIjsKLQotCXByaXZhdGUgc3RhdGljIEhhc2h0YWJsZSBjb2xvclRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotCS8vS2VlcCBhIGxpc3Qgb2YgdGhlIENvbG9ycyB3ZSBoYXZlIGFsbG9jYXRlZCBzZXBlcmF0ZWx5Ci0JLy9hcyBzeXN0ZW0gY29sb3JzIGRvIG5vdCBuZWVkIHRvIGJlIGRpc3Bvc2VkLgotCXByaXZhdGUgc3RhdGljIEFycmF5TGlzdCBhbGxvY2F0ZWRDb2xvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIENvbG9yIHVzZWQgZm9yIGJhbm5lciBiYWNrZ3JvdW5kcwotCSAqLwotCi0JcHVibGljIHN0YXRpYyBDb2xvciBnZXRUb3BpY0NvbG9yKERpc3BsYXkgZGlzcGxheSkgewotCQlyZXR1cm4gZ2V0Q29sb3JTZXR0aW5nKGRpc3BsYXksIFBfVE9QSUNfQ09MT1IpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjbGVhckNvbG9yKFN0cmluZyBjb2xvck5hbWUpIHsKLQkJY29sb3JUYWJsZS5yZW1vdmUoY29sb3JOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGNvbG9yIHNldHRpbmcgZm9yIHRoZSBuYW1lLgotCSAqLwotCXByaXZhdGUgc3RhdGljIENvbG9yIGdldENvbG9yU2V0dGluZygKLQkJRGlzcGxheSBkaXNwbGF5LAotCQlTdHJpbmcgcHJlZmVyZW5jZU5hbWUpIHsKLQkJaWYgKGNvbG9yVGFibGUuY29udGFpbnMocHJlZmVyZW5jZU5hbWUpKQotCQkJcmV0dXJuIChDb2xvcikgY29sb3JUYWJsZS5nZXQocHJlZmVyZW5jZU5hbWUpOwotCi0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPQotCQkJVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlpZiAoc3RvcmUgPT0gbnVsbCkgewotCQkJQ29sb3IgY29sb3IgPSBnZXREZWZhdWx0Q29sb3IoZGlzcGxheSwgcHJlZmVyZW5jZU5hbWUpOwotCQkJY29sb3JUYWJsZS5wdXQocHJlZmVyZW5jZU5hbWUsIGNvbG9yKTsKLQkJCXJldHVybiBjb2xvcjsKLQkJfSBlbHNlIHsKLQkJCXNldERlZmF1bHRzKHN0b3JlKTsKLQkJCUNvbG9yIGNvbG9yID0KLQkJCQluZXcgQ29sb3IoCi0JCQkJCWRpc3BsYXksCi0JCQkJCVByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3Ioc3RvcmUsIHByZWZlcmVuY2VOYW1lKSk7Ci0JCQlhbGxvY2F0ZWRDb2xvcnMuYWRkKGNvbG9yKTsKLQkJCWNvbG9yVGFibGUucHV0KHByZWZlcmVuY2VOYW1lLCBjb2xvcik7Ci0JCQlyZXR1cm4gY29sb3I7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldERlZmF1bHRzKElQcmVmZXJlbmNlU3RvcmUgc3RvcmUpIHsKLQkJUHJlZmVyZW5jZUNvbnZlcnRlci5zZXREZWZhdWx0KHN0b3JlLCBQX1RPUElDX0NPTE9SLCBuZXcgUkdCKDkxLCAxMjAsIDE3MikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVmYXVsdCBjb2xvciBmb3IgdGhlIHByZWZlcmVuY2VOYW1lLiBJZiB0aGVyZSBpcwotCSAqIG5vIHNldHRpbmcgcmV0dXJuIHRoZSBzeXN0ZW0gYmxhY2suCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgQ29sb3IgZ2V0RGVmYXVsdENvbG9yKAotCQlEaXNwbGF5IGRpc3BsYXksCi0JCVN0cmluZyBwcmVmZXJlbmNlTmFtZSkgewotCi0JCWlmIChwcmVmZXJlbmNlTmFtZS5lcXVhbHMoUF9UT1BJQ19DT0xPUikpIHsKLQkJCUNvbG9yIGNvbG9yID0gbmV3IENvbG9yKGRpc3BsYXksIDkxLCAxMjAsIDE3Mik7Ci0JCQlhbGxvY2F0ZWRDb2xvcnMuYWRkKGNvbG9yKTsKLQkJCXJldHVybiBjb2xvcjsKLQkJfQotCQlyZXR1cm4gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxBQ0spOwotCX0KLQotCS8qKgotCSAqIERpc3Bvc2Ugb2YgYWxsIGFsbG9jYXRlZCBjb2xvcnMuIENhbGxlZCBvbiB3b3JrYmVuY2gKLQkgKiBzaHV0ZG93bi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGlzcG9zZUNvbG9ycygpIHsKLQkJSXRlcmF0b3IgY29sb3JzID0gYWxsb2NhdGVkQ29sb3JzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChjb2xvcnMuaGFzTmV4dCgpKSB7Ci0JCQkoKENvbG9yKSBjb2xvcnMubmV4dCgpKS5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3Byb3BlcnRpZXMvQ29uZmlndXJhdGlvblByb3BlcnR5UGFnZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3Byb3BlcnRpZXMvQ29uZmlndXJhdGlvblByb3BlcnR5UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmZlYjZkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wcm9wZXJ0aWVzL0NvbmZpZ3VyYXRpb25Qcm9wZXJ0eVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5Qcm9wZXJ0eVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5Xb3JrYmVuY2hIZWxwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcm9wZXJ0eVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBAc2VlIFByb3BlcnR5UGFnZQotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvblByb3BlcnR5UGFnZSBleHRlbmRzIFByb3BlcnR5UGFnZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hQcm9wZXJ0eVBhZ2UgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTkFNRSA9ICJDb25maWd1cmF0aW9uUHJvcGVydHlQYWdlLm5hbWUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBUZXh0IG5hbWVUZXh0OwotCXByaXZhdGUgYm9vbGVhbiBjaGFuZ2VkOwotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvblByb3BlcnR5UGFnZSgpIHsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuCi0JICogQHNlZSBQcm9wZXJ0eVBhZ2UjY3JlYXRlQ29udGVudHMKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSAgewotCQlDb21wb3NpdGUgY29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbnRhaW5lciwgU1dULk5VTEwpOwotCQlsYWJlbC5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfTkFNRSkpOwotCQluYW1lVGV4dCA9IG5ldyBUZXh0KGNvbnRhaW5lciwgU1dULlNJTkdMRXxTV1QuQk9SREVSKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJbmFtZVRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWluaXRpYWxpemVGaWVsZHMoKTsKLQkJV29ya2JlbmNoSGVscC5zZXRIZWxwKGNvbnRhaW5lciwgIm9yZy5lY2xpcHNlLnVwZGF0ZS51aS5Db25maWd1cmF0aW9uUHJvcGVydHlQYWdlIik7Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZyA9IGdldENvbmZpZ3VyYXRpb24oKTsKLQkJbmFtZVRleHQuc2V0VGV4dChjb25maWcuZ2V0TGFiZWwoKSk7Ci0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCWlmIChjaGFuZ2VkKSB7Ci0JCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnID0gZ2V0Q29uZmlndXJhdGlvbigpOwotCQkJY29uZmlnLnNldExhYmVsKG5hbWVUZXh0LmdldFRleHQoKSk7Ci0JCQlVcGRhdGVNb2RlbCBtb2RlbCA9IFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRVcGRhdGVNb2RlbCgpOwotCQkJbW9kZWwuZmlyZU9iamVjdENoYW5nZWQoZ2V0RWxlbWVudCgpLCBudWxsKTsKLQkJCXRyeSB7Ci0JCQkJU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkuc2F2ZSgpOwotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCVVwZGF0ZVVJLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHJpdmF0ZSBJSW5zdGFsbENvbmZpZ3VyYXRpb24gZ2V0Q29uZmlndXJhdGlvbigpIHsKLQkJT2JqZWN0IG9iaiA9IGdldEVsZW1lbnQoKTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByZXNlcnZlZENvbmZpZ3VyYXRpb24pCi0JCSAgIHJldHVybiAoKFByZXNlcnZlZENvbmZpZ3VyYXRpb24pb2JqKS5nZXRDb25maWd1cmF0aW9uKCk7Ci0JCXJldHVybiAoSUluc3RhbGxDb25maWd1cmF0aW9uKW9iajsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVGaWVsZHMoKSB7Ci0JCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcgPSBnZXRDb25maWd1cmF0aW9uKCk7Ci0JCW5hbWVUZXh0LnNldFRleHQoY29uZmlnLmdldExhYmVsKCkpOwotCQluYW1lVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQljaGVja0ZpZWxkcygpOwotCQkJfQotCQl9KTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIGNoZWNrRmllbGRzKCkgewotCQlib29sZWFuIHZhbGlkID0gdHJ1ZTsKLQkJU3RyaW5nIGVycm9yID0gbnVsbDsKLQkJLy8gY2hlY2sgdGhlIHZhbHVlCi0JCVN0cmluZyB0ZXh0ID0gbmFtZVRleHQuZ2V0VGV4dCgpOwotCQlpZiAodGV4dC5sZW5ndGgoKT09MCkgdmFsaWQgPSBmYWxzZTsKLQkJZWxzZSBpZiAodGV4dC5jaGFyQXQoMCk9PSdAJykgewotCQkJZXJyb3IgPSBVcGRhdGVVSS5nZXRTdHJpbmcoIkNvbmZpZ3VyYXRpb25Qcm9wZXJ0eVBhZ2UuaW52YWxpZENoYXJhY3RlciIpOyAvLyROT04tTkxTLTEkCi0JCQl2YWxpZD1mYWxzZTsKLQkJfQotCQlzZXRWYWxpZCh2YWxpZCk7CQkKLQkJc2V0RXJyb3JNZXNzYWdlKGVycm9yKTsKLQkJY2hhbmdlZD10cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wcm9wZXJ0aWVzL05hbWVkT2JqZWN0UHJvcGVydHlQYWdlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcHJvcGVydGllcy9OYW1lZE9iamVjdFByb3BlcnR5UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTlmNTUzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wcm9wZXJ0aWVzL05hbWVkT2JqZWN0UHJvcGVydHlQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkucHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJvcGVydHlQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJvcGVydHlQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuV29ya2JlbmNoSGVscDsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsLio7Ci0KLS8qKgotICogQHNlZSBQcm9wZXJ0eVBhZ2UKLSAqLwotcHVibGljIGNsYXNzIE5hbWVkT2JqZWN0UHJvcGVydHlQYWdlCi0JZXh0ZW5kcyBQcm9wZXJ0eVBhZ2UKLQlpbXBsZW1lbnRzIElXb3JrYmVuY2hQcm9wZXJ0eVBhZ2UgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTkFNRSA9ICJOYW1lZE9iamVjdFByb3BlcnR5UGFnZS5uYW1lIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0VYSVNUUyA9ICJOYW1lZE9iamVjdFByb3BlcnR5UGFnZS5leGlzdHMiOwotCXByb3RlY3RlZCBUZXh0IG9iamVjdE5hbWU7Ci0JcHJpdmF0ZSBib29sZWFuIGNoYW5nZWQ7Ci0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIE5hbWVkT2JqZWN0UHJvcGVydHlQYWdlKCkgewotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLQkgKiBAc2VlIFByb3BlcnR5UGFnZSNjcmVhdGVDb250ZW50cwotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQljb250YWluZXIuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29udGFpbmVyLCBTV1QuTlVMTCk7Ci0JCWxhYmVsLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9OQU1FKSk7Ci0JCW9iamVjdE5hbWUgPSBuZXcgVGV4dChjb250YWluZXIsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJb2JqZWN0TmFtZS5zZXRMYXlvdXREYXRhKGdkKTsKLQkJaW5pdGlhbGl6ZUZpZWxkcygpOwotCQlXb3JrYmVuY2hIZWxwLnNldEhlbHAoY29udGFpbmVyLCAib3JnLmVjbGlwc2UudXBkYXRlLnVpLk5hbWVkT2JqZWN0UHJvcGVydHlQYWdlIik7Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJTmFtZWRNb2RlbE9iamVjdCBvYmplY3QgPSAoTmFtZWRNb2RlbE9iamVjdCkgZ2V0RWxlbWVudCgpOwotCQlvYmplY3ROYW1lLnNldFRleHQob2JqZWN0LmdldE5hbWUoKSk7Ci0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJaWYgKGNoYW5nZWQpIHsKLQkJCU5hbWVkTW9kZWxPYmplY3Qgb2JqZWN0ID0gKE5hbWVkTW9kZWxPYmplY3QpIGdldEVsZW1lbnQoKTsKLQkJCW9iamVjdC5zZXROYW1lKG9iamVjdE5hbWUuZ2V0VGV4dCgpKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUZpZWxkcygpIHsKLQkJTmFtZWRNb2RlbE9iamVjdCBvYmplY3QgPSAoTmFtZWRNb2RlbE9iamVjdCkgZ2V0RWxlbWVudCgpOwotCQlvYmplY3ROYW1lLnNldFRleHQob2JqZWN0LmdldE5hbWUoKSk7Ci0KLQkJb2JqZWN0TmFtZS5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQljaGVja0ZpZWxkcygpOwotCQkJfQotCQl9KTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIGNoZWNrRmllbGRzKCkgewotCQlib29sZWFuIHZhbGlkID0gdHJ1ZTsKLQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IG51bGw7Ci0JCVN0cmluZyBuZXdOYW1lID0gb2JqZWN0TmFtZS5nZXRUZXh0KCk7Ci0JCWlmIChuZXdOYW1lLmxlbmd0aCgpID09IDApCi0JCQl2YWxpZCA9IGZhbHNlOwotCQllbHNlIHsKLQkJCXZhbGlkID0gIWV4aXN0cyhuZXdOYW1lKTsKLQkJCWlmICghdmFsaWQpCi0JCQkJZXJyb3JNZXNzYWdlID0KLQkJCQkJVXBkYXRlVUkuZ2V0Rm9ybWF0dGVkTWVzc2FnZShLRVlfRVhJU1RTLCBuZXdOYW1lKTsKLQkJfQotCQlzZXRWYWxpZCh2YWxpZCk7Ci0JCXNldEVycm9yTWVzc2FnZShlcnJvck1lc3NhZ2UpOwotCQljaGFuZ2VkID0gdHJ1ZTsKLQl9Ci0JcHJpdmF0ZSBib29sZWFuIGV4aXN0cyhTdHJpbmcgbmFtZSkgewotCQlOYW1lZE1vZGVsT2JqZWN0IG9iamVjdCA9IChOYW1lZE1vZGVsT2JqZWN0KSBnZXRFbGVtZW50KCk7Ci0JCU5hbWVkTW9kZWxPYmplY3QgcGFyZW50ID0gKE5hbWVkTW9kZWxPYmplY3QpIG9iamVjdC5nZXRQYXJlbnQobnVsbCk7Ci0JCU9iamVjdFtdIGNhbmRpZGF0ZXMgPSBudWxsOwotCQlpZiAocGFyZW50ID09IG51bGwpIHsKLQkJCS8vIHJvb3QgbGV2ZWwKLQkJCVVwZGF0ZU1vZGVsIG1vZGVsID0gb2JqZWN0LmdldE1vZGVsKCk7Ci0JCQljYW5kaWRhdGVzID0gbW9kZWwuZ2V0Qm9va21hcmtzKCk7Ci0JCX0gZWxzZSB7Ci0JCQljYW5kaWRhdGVzID0gcGFyZW50LmdldENoaWxkcmVuKHBhcmVudCk7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYW5kaWRhdGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlOYW1lZE1vZGVsT2JqZWN0IGNhbmRpZGF0ZSA9IChOYW1lZE1vZGVsT2JqZWN0KSBjYW5kaWRhdGVzW2ldOwotCQkJaWYgKGNhbmRpZGF0ZS5lcXVhbHMob2JqZWN0KSkKLQkJCQljb250aW51ZTsKLQkJCWlmIChjYW5kaWRhdGUuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3Byb3BlcnRpZXMvU2VhcmNoT2JqZWN0UHJvcGVydHlQYWdlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcHJvcGVydGllcy9TZWFyY2hPYmplY3RQcm9wZXJ0eVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JkNmFhNS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcHJvcGVydGllcy9TZWFyY2hPYmplY3RQcm9wZXJ0eVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5zZWFyY2guU2VhcmNoT2JqZWN0OwotCi1wdWJsaWMgY2xhc3MgU2VhcmNoT2JqZWN0UHJvcGVydHlQYWdlIGV4dGVuZHMgTmFtZWRPYmplY3RQcm9wZXJ0eVBhZ2UgewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFNlYXJjaE9iamVjdFByb3BlcnR5UGFnZS4KLQkgKi8KLQlwdWJsaWMgU2VhcmNoT2JqZWN0UHJvcGVydHlQYWdlKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbnRyb2wgY29udHJvbCA9IHN1cGVyLmNyZWF0ZUNvbnRlbnRzKHBhcmVudCk7Ci0JCVNlYXJjaE9iamVjdCBzZWFyY2hPYmplY3QgPSAoU2VhcmNoT2JqZWN0KWdldEVsZW1lbnQoKTsKLQkJb2JqZWN0TmFtZS5zZXRFZGl0YWJsZSghc2VhcmNoT2JqZWN0LmlzQ2F0ZWdvcnlGaXhlZCgpKTsKLQkJcmV0dXJuIGNvbnRyb2w7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3Byb3BlcnRpZXMvU2l0ZUJvb2ttYXJrUHJvcGVydHlQYWdlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcHJvcGVydGllcy9TaXRlQm9va21hcmtQcm9wZXJ0eVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNjZGQzYi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcHJvcGVydGllcy9TaXRlQm9va21hcmtQcm9wZXJ0eVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5Qcm9wZXJ0eVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5Xb3JrYmVuY2hIZWxwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcm9wZXJ0eVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSTsKLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQHNlZSBQcm9wZXJ0eVBhZ2UKLSAqLwotcHVibGljIGNsYXNzIFNpdGVCb29rbWFya1Byb3BlcnR5UGFnZQotCWV4dGVuZHMgUHJvcGVydHlQYWdlCi0JaW1wbGVtZW50cyBJV29ya2JlbmNoUHJvcGVydHlQYWdlIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX05BTUUgPSAiU2l0ZUJvb2ttYXJrUHJvcGVydHlQYWdlLm5hbWUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQUREUkVTUyA9ICJTaXRlQm9va21hcmtQcm9wZXJ0eVBhZ2UuYWRkcmVzcyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9VUERBVEVfU0lURSA9ICJTaXRlQm9va21hcmtQcm9wZXJ0eVBhZ2UudXBkYXRlU2l0ZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9XRUJfU0lURSA9ICJTaXRlQm9va21hcmtQcm9wZXJ0eVBhZ2Uud2ViU2l0ZSI7Ci0JcHJpdmF0ZSBUZXh0IHNpdGVOYW1lOwotCXByaXZhdGUgVGV4dCBzaXRlVVJMOwotCXByaXZhdGUgQnV0dG9uIHVwZGF0ZUJ1dHRvbjsKLQlwcml2YXRlIEJ1dHRvbiB3ZWJCdXR0b247Ci0JcHJpdmF0ZSBib29sZWFuIGNoYW5nZWQ7Ci0JcHJpdmF0ZSBib29sZWFuIHVybENoYW5nZWQ7Ci0JcHJpdmF0ZSBib29sZWFuIHR5cGVDaGFuZ2VkOwotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgU2l0ZUJvb2ttYXJrUHJvcGVydHlQYWdlKCkgewotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLQkgKiBAc2VlIFByb3BlcnR5UGFnZSNjcmVhdGVDb250ZW50cwotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQljb250YWluZXIuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29udGFpbmVyLCBTV1QuTlVMTCk7Ci0JCWxhYmVsLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9OQU1FKSk7Ci0JCXNpdGVOYW1lID0gbmV3IFRleHQoY29udGFpbmVyLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCXNpdGVOYW1lLnNldExheW91dERhdGEoZ2QpOwotCQlsYWJlbCA9IG5ldyBMYWJlbChjb250YWluZXIsIFNXVC5OVUxMKTsKLQkJbGFiZWwuc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX0FERFJFU1MpKTsKLQkJc2l0ZVVSTCA9IG5ldyBUZXh0KGNvbnRhaW5lciwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlzaXRlVVJMLnNldExheW91dERhdGEoZ2QpOwotCQkKLQkJdXBkYXRlQnV0dG9uID0gbmV3IEJ1dHRvbihjb250YWluZXIsIFNXVC5SQURJTyk7Ci0JCXVwZGF0ZUJ1dHRvbi5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfVVBEQVRFX1NJVEUpKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQl1cGRhdGVCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQotCQl3ZWJCdXR0b24gPSBuZXcgQnV0dG9uKGNvbnRhaW5lciwgU1dULlJBRElPKTsKLQkJd2ViQnV0dG9uLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9XRUJfU0lURSkpOwotCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXdlYkJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCi0JCWluaXRpYWxpemVGaWVsZHMoKTsKLQkJV29ya2JlbmNoSGVscC5zZXRIZWxwKGNvbnRhaW5lciwgIm9yZy5lY2xpcHNlLnVwZGF0ZS51aS5TaXRlQm9va21hcmtQcm9wZXJ0eVBhZ2UiKTsKLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCWlmIChjaGFuZ2VkKSB7Ci0JCQlTaXRlQm9va21hcmsgc2l0ZSA9IChTaXRlQm9va21hcmspIGdldEVsZW1lbnQoKTsKLQkJCXNpdGUuc2V0TmFtZShzaXRlTmFtZS5nZXRUZXh0KCkpOwotCi0JCQlpZiAodXJsQ2hhbmdlZCkgewotCi0JCQkJdHJ5IHsKLQkJCQkJVVJMIHVybCA9IG5ldyBVUkwoc2l0ZVVSTC5nZXRUZXh0KCkpOwotCQkJCQlzaXRlLnNldFVSTCh1cmwpOwotCQkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHR5cGVDaGFuZ2VkKSB7Ci0JCQkJc2l0ZS5zZXRXZWJCb29rbWFyayh3ZWJCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCWRvSW5pdGlhbGl6ZSgpOwotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGRvSW5pdGlhbGl6ZSgpIHsKLQkJU2l0ZUJvb2ttYXJrIHNpdGUgPSAoU2l0ZUJvb2ttYXJrKSBnZXRFbGVtZW50KCk7Ci0JCXNpdGVOYW1lLnNldFRleHQoc2l0ZS5nZXROYW1lKCkpOwotCQlzaXRlVVJMLnNldFRleHQoc2l0ZS5nZXRVUkwoKS50b1N0cmluZygpKTsKLQkJc2l0ZU5hbWUuc2V0RW5hYmxlZChzaXRlLmdldFR5cGUoKSAhPSBTaXRlQm9va21hcmsuTE9DQUwpOwotCQlzaXRlVVJMLnNldEVuYWJsZWQoc2l0ZS5nZXRUeXBlKCkgPT0gU2l0ZUJvb2ttYXJrLlVTRVIpOwotCQl1cGRhdGVCdXR0b24uc2V0U2VsZWN0aW9uKHNpdGUuaXNXZWJCb29rbWFyaygpPT1mYWxzZSk7Ci0JCXVwZGF0ZUJ1dHRvbi5zZXRFbmFibGVkKHNpdGVVUkwuaXNFbmFibGVkKCkpOwotCQl3ZWJCdXR0b24uc2V0U2VsZWN0aW9uKHNpdGUuaXNXZWJCb29rbWFyaygpKTsKLQkJd2ViQnV0dG9uLnNldEVuYWJsZWQodXBkYXRlQnV0dG9uLmlzRW5hYmxlZCgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUZpZWxkcygpIHsKLQkJZG9Jbml0aWFsaXplKCk7Ci0KLQkJc2l0ZU5hbWUuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJY2hlY2tGaWVsZHMoKTsKLQkJCX0KLQkJfSk7Ci0JCXNpdGVVUkwuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJdXJsQ2hhbmdlZCA9IHRydWU7Ci0JCQkJY2hlY2tGaWVsZHMoKTsKLQkJCX0KLQkJfSk7Ci0JCXVwZGF0ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl0eXBlQ2hhbmdlZCA9IHRydWU7Ci0JCQkJY2hlY2tGaWVsZHMoKTsKLQkJCX0KLQkJfSk7Ci0JCXdlYkJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl0eXBlQ2hhbmdlZCA9IHRydWU7Ci0JCQkJY2hlY2tGaWVsZHMoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjaGVja0ZpZWxkcygpIHsKLQkJYm9vbGVhbiB2YWxpZCA9IHRydWU7Ci0JCWlmIChzaXRlTmFtZS5nZXRUZXh0KCkubGVuZ3RoKCkgPT0gMCkKLQkJCXZhbGlkID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQluZXcgVVJMKHNpdGVVUkwuZ2V0VGV4dCgpKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCXZhbGlkID0gZmFsc2U7Ci0JCX0KLQkJc2V0VmFsaWQodmFsaWQpOwotCQljaGFuZ2VkID0gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcHJvcGVydGllcy9TaXRlQm9va21hcmtQcm9wZXJ0eVNvdXJjZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3Byb3BlcnRpZXMvU2l0ZUJvb2ttYXJrUHJvcGVydHlTb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU3OTk2MS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcHJvcGVydGllcy9TaXRlQm9va21hcmtQcm9wZXJ0eVNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnByb3BlcnRpZXM7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsLlNpdGVCb29rbWFyazsKLQotcHVibGljIGNsYXNzIFNpdGVCb29rbWFya1Byb3BlcnR5U291cmNlIGltcGxlbWVudHMgSVByb3BlcnR5U291cmNlIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1VSTF9MQUJFTCA9Ci0JCSJTaXRlQm9va21hcmtQcm9wZXJ0eVNvdXJjZS51cmwubGFiZWwiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVVJMX0RFU0MgPQotCQkiU2l0ZUJvb2ttYXJrUHJvcGVydHlTb3VyY2UudXJsLmRlc2MiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTkFNRV9MQUJFTCA9Ci0JCSJTaXRlQm9va21hcmtQcm9wZXJ0eVNvdXJjZS5uYW1lLmxhYmVsIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX05BTUVfREVTQyA9Ci0JCSJTaXRlQm9va21hcmtQcm9wZXJ0eVNvdXJjZS5uYW1lLmRlc2MiOwotCi0JcHJpdmF0ZSBTaXRlQm9va21hcmsgYm9va21hcms7Ci0KLQlwdWJsaWMgU2l0ZUJvb2ttYXJrUHJvcGVydHlTb3VyY2UoU2l0ZUJvb2ttYXJrIGJvb2ttYXJrKSB7Ci0JCXRoaXMuYm9va21hcmsgPSBib29rbWFyazsKLQl9Ci0JLyoqCi0JICogQHNlZSBJUHJvcGVydHlTb3VyY2UjZ2V0RWRpdGFibGVWYWx1ZSgpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRFZGl0YWJsZVZhbHVlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElQcm9wZXJ0eVNvdXJjZSNnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCkKLQkgKi8KLQlwdWJsaWMgSVByb3BlcnR5RGVzY3JpcHRvcltdIGdldFByb3BlcnR5RGVzY3JpcHRvcnMoKSB7Ci0JCUlQcm9wZXJ0eURlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyA9IG5ldyBJUHJvcGVydHlEZXNjcmlwdG9yWzJdOwotCQlQcm9wZXJ0eURlc2NyaXB0b3IgZGVzYzsKLQkJaWYgKGJvb2ttYXJrLmdldFR5cGUoKSAhPSBTaXRlQm9va21hcmsuTE9DQUwpCi0JCQlkZXNjID0KLQkJCQluZXcgVGV4dFByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJU2l0ZUJvb2ttYXJrLlBfVVJMLAotCQkJCQlVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX1VSTF9MQUJFTCkpOwotCQllbHNlCi0JCQlkZXNjID0KLQkJCQluZXcgUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQlTaXRlQm9va21hcmsuUF9VUkwsCi0JCQkJCVVwZGF0ZVVJLmdldFN0cmluZyhLRVlfVVJMX0xBQkVMKSk7Ci0JCWRlc2Muc2V0RGVzY3JpcHRpb24oVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9VUkxfREVTQykpOwotCQlkZXNjcmlwdG9yc1swXSA9IGRlc2M7Ci0KLQkJaWYgKGJvb2ttYXJrLmdldFR5cGUoKSA9PSBTaXRlQm9va21hcmsuVVNFUikKLQkJCWRlc2MgPQotCQkJCW5ldyBUZXh0UHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQlTaXRlQm9va21hcmsuUF9OQU1FLAotCQkJCQlVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX05BTUVfTEFCRUwpKTsKLQkJZWxzZQotCQkJZGVzYyA9Ci0JCQkJbmV3IFByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJU2l0ZUJvb2ttYXJrLlBfTkFNRSwKLQkJCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9OQU1FX0xBQkVMKSk7Ci0JCWRlc2Muc2V0RGVzY3JpcHRpb24oVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9OQU1FX0RFU0MpKTsKLQkJZGVzY3JpcHRvcnNbMV0gPSBkZXNjOwotCQlyZXR1cm4gZGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJUHJvcGVydHlTb3VyY2UjZ2V0UHJvcGVydHlWYWx1ZShPYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBwcm9wZXJ0eSkgewotCQlpZiAocHJvcGVydHkuZXF1YWxzKFNpdGVCb29rbWFyay5QX05BTUUpKQotCQkJcmV0dXJuIGJvb2ttYXJrLmdldE5hbWUoKTsKLQkJaWYgKHByb3BlcnR5LmVxdWFscyhTaXRlQm9va21hcmsuUF9VUkwpKQotCQkJcmV0dXJuIGJvb2ttYXJrLmdldFVSTCgpLnRvU3RyaW5nKCk7Ci0JCXJldHVybiAiIjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElQcm9wZXJ0eVNvdXJjZSNpc1Byb3BlcnR5U2V0KE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Byb3BlcnR5U2V0KE9iamVjdCBhcmcwKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElQcm9wZXJ0eVNvdXJjZSNyZXNldFByb3BlcnR5VmFsdWUoT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0UHJvcGVydHlWYWx1ZShPYmplY3QgYXJnMCkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgSVByb3BlcnR5U291cmNlI3NldFByb3BlcnR5VmFsdWUoT2JqZWN0LCBPYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvcGVydHlWYWx1ZShPYmplY3QgcHJvcGVydHksIE9iamVjdCB2YWx1ZSkgewotCQlpZiAocHJvcGVydHkuZXF1YWxzKFNpdGVCb29rbWFyay5QX05BTUUpKQotCQkJYm9va21hcmsuc2V0TmFtZSh2YWx1ZS50b1N0cmluZygpKTsKLQkJaWYgKHByb3BlcnR5LmVxdWFscyhTaXRlQm9va21hcmsuUF9VUkwpKSB7Ci0JCQl0cnkgewotCQkJCVVSTCB1cmwgPSBuZXcgVVJMKHZhbHVlLnRvU3RyaW5nKCkpOwotCQkJCWJvb2ttYXJrLnNldFVSTCh1cmwpOwotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9zZWFyY2gvQmFja2dyb3VuZFByb2dyZXNzTW9uaXRvci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3NlYXJjaC9CYWNrZ3JvdW5kUHJvZ3Jlc3NNb25pdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxZjg5YWUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3NlYXJjaC9CYWNrZ3JvdW5kUHJvZ3Jlc3NNb25pdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuc2VhcmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi1wdWJsaWMgY2xhc3MgQmFja2dyb3VuZFByb2dyZXNzTW9uaXRvciBpbXBsZW1lbnRzIElQcm9ncmVzc01vbml0b3IsIFNlcmlhbGl6YWJsZSB7Ci0JcHJpdmF0ZSBWZWN0b3IgbW9uaXRvcnM7Ci0JcHJpdmF0ZSB0cmFuc2llbnQgYm9vbGVhbiBjYW5jZWxlZDsKLQlwcml2YXRlIHRyYW5zaWVudCBTdHJpbmcgdGFza05hbWU7Ci0JcHJpdmF0ZSB0cmFuc2llbnQgU3RyaW5nIHN1YlRhc2tOYW1lOwotCXByaXZhdGUgdHJhbnNpZW50IGRvdWJsZSB0b3RhbFdvcmtlZD0wLjA7Ci0JcHJpdmF0ZSB0cmFuc2llbnQgaW50IHRhc2tDb3VudDsKLQlwcml2YXRlIHRyYW5zaWVudCBib29sZWFuIGluUHJvZ3Jlc3M7Ci0JcHJpdmF0ZSB0cmFuc2llbnQgRGlzcGxheSBkaXNwbGF5OwotCQotCXB1YmxpYyBCYWNrZ3JvdW5kUHJvZ3Jlc3NNb25pdG9yKCkgewotCQltb25pdG9ycyA9bmV3IFZlY3RvcigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXREaXNwbGF5KERpc3BsYXkgZGlzcGxheSkgewotCQl0aGlzLmRpc3BsYXkgPSBkaXNwbGF5OwotCX0KLQkKLQlwdWJsaWMgRGlzcGxheSBnZXREaXNwbGF5KCkgewotCQlyZXR1cm4gZGlzcGxheTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkUHJvZ3Jlc3NNb25pdG9yKGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAobW9uaXRvcnMuY29udGFpbnMobW9uaXRvcik9PWZhbHNlKSB7Ci0JCSAgIG1vbml0b3JzLmFkZChtb25pdG9yKTsKLQkJICAgaWYgKGluUHJvZ3Jlc3MgJiYgZGlzcGxheSE9bnVsbCkgewotCQkgICAJICAJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkgICAJICAJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJICAgCSAgCQkvLyB3ZSBhcmUgbGF0ZSAtIGNhdGNoIHVwCi0JCSAgICAgIAkJCW1vbml0b3IuYmVnaW5UYXNrKHRhc2tOYW1lLCB0YXNrQ291bnQpOwotCQkgICAgICAJCQltb25pdG9yLmludGVybmFsV29ya2VkKHRvdGFsV29ya2VkKTsKLQkJICAgICAgCQkJaWYgKHN1YlRhc2tOYW1lIT1udWxsKQotCQkgICAgICAgICAJCQltb25pdG9yLnN1YlRhc2soc3ViVGFza05hbWUpOwotCQkgICAJICAJCX0KLQkJICAgCSAgCX0pOwotCQkgICB9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIElQcm9ncmVzc01vbml0b3IgW10gZ2V0UHJvZ3Jlc3NNb25pdG9ycygpIHsKLQkJc3luY2hyb25pemVkIChtb25pdG9ycykgewotCQkJcmV0dXJuIChJUHJvZ3Jlc3NNb25pdG9yIFtdKW1vbml0b3JzLnRvQXJyYXkobmV3IElQcm9ncmVzc01vbml0b3JbbW9uaXRvcnMuc2l6ZSgpXSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlUHJvZ3Jlc3NNb25pdG9yKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAobW9uaXRvcnMuY29udGFpbnMobW9uaXRvcikpCi0JCSAgIG1vbml0b3JzLnJlbW92ZShtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElQcm9ncmVzc01vbml0b3IjYmVnaW5UYXNrKFN0cmluZywgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGJlZ2luVGFzayhmaW5hbCBTdHJpbmcgdGFza05hbWUsIGZpbmFsIGludCBjb3VudCkgewotCQl0b3RhbFdvcmtlZCA9IDAuMDsKLQkJdGFza0NvdW50ID0gY291bnQ7Ci0JCXRoaXMudGFza05hbWUgPSB0YXNrTmFtZTsKLQkJc3ViVGFza05hbWUgPSBudWxsOwotCQljYW5jZWxlZCA9IGZhbHNlOwotCQlpblByb2dyZXNzID0gdHJ1ZTsKLQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlcj1tb25pdG9ycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJSVByb2dyZXNzTW9uaXRvciBtID0gKElQcm9ncmVzc01vbml0b3IpaXRlci5uZXh0KCk7Ci0JCQkJCW0uYmVnaW5UYXNrKHRhc2tOYW1lLCBjb3VudCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgSVByb2dyZXNzTW9uaXRvciNkb25lKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb25lKCkgewotCQlpZiAoaW5Qcm9ncmVzcz09ZmFsc2UpIHJldHVybjsKLQkJZWxzZSBpblByb2dyZXNzID0gZmFsc2U7Ci0JCXRvdGFsV29ya2VkID0gMC4wOwotCQlmaW5hbCBWZWN0b3Igc2FmZU1vbml0b3JzID0gKFZlY3Rvciltb25pdG9ycy5jbG9uZSgpOwotCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyPXNhZmVNb25pdG9ycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJSVByb2dyZXNzTW9uaXRvciBtID0gKElQcm9ncmVzc01vbml0b3IpaXRlci5uZXh0KCk7Ci0JCQkJCW0uZG9uZSgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIElQcm9ncmVzc01vbml0b3IjaXNDYW5jZWxlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDYW5jZWxlZCgpIHsKLQkJcmV0dXJuIGNhbmNlbGVkOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBJUHJvZ3Jlc3NNb25pdG9yI3NldENhbmNlbGVkKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2FuY2VsZWQoZmluYWwgYm9vbGVhbiBjYW5jZWxlZCkgewotCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyPW1vbml0b3JzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlJUHJvZ3Jlc3NNb25pdG9yIG0gPSAoSVByb2dyZXNzTW9uaXRvcilpdGVyLm5leHQoKTsKLQkJCQkJbS5zZXRDYW5jZWxlZChjYW5jZWxlZCk7Ci0JCQkJfQotCQkJCUJhY2tncm91bmRQcm9ncmVzc01vbml0b3IudGhpcy5jYW5jZWxlZCA9IGNhbmNlbGVkOwotCQkJfQotCQl9KTsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgSVByb2dyZXNzTW9uaXRvciNzZXRUYXNrTmFtZShTdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGFza05hbWUoZmluYWwgU3RyaW5nIG5hbWUpIHsKLQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlcj1tb25pdG9ycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJSVByb2dyZXNzTW9uaXRvciBtID0gKElQcm9ncmVzc01vbml0b3IpaXRlci5uZXh0KCk7Ci0JCQkJCW0uc2V0VGFza05hbWUobmFtZSk7Ci0JCQkJfQotCQkJCUJhY2tncm91bmRQcm9ncmVzc01vbml0b3IudGhpcy50YXNrTmFtZSA9IG5hbWU7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBJUHJvZ3Jlc3NNb25pdG9yI3N1YlRhc2soU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHN1YlRhc2soZmluYWwgU3RyaW5nIG5hbWUpIHsKLQkJc3ViVGFza05hbWUgPSBuYW1lOwotCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyPW1vbml0b3JzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlJUHJvZ3Jlc3NNb25pdG9yIG0gPSAoSVByb2dyZXNzTW9uaXRvcilpdGVyLm5leHQoKTsKLQkJCQkJbS5zdWJUYXNrKG5hbWUpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgSVByb2dyZXNzTW9uaXRvciNpbnRlcm5hbFdvcmtlZChkb3VibGUpCi0JICovCi0JcHVibGljIHZvaWQgaW50ZXJuYWxXb3JrZWQoZmluYWwgZG91YmxlIGFtb3VudCkgewotCQl0b3RhbFdvcmtlZCArPSBhbW91bnQ7Ci0JCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXI9bW9uaXRvcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCUlQcm9ncmVzc01vbml0b3IgbSA9IChJUHJvZ3Jlc3NNb25pdG9yKWl0ZXIubmV4dCgpOwotCQkJCQltLmludGVybmFsV29ya2VkKGFtb3VudCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElQcm9ncmVzc01vbml0b3Ijd29ya2VkKGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB3b3JrZWQoZmluYWwgaW50IGFtb3VudCkgewotCQlpbnRlcm5hbFdvcmtlZChhbW91bnQpOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3NlYXJjaC9CYWNrZ3JvdW5kVGhyZWFkLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvc2VhcmNoL0JhY2tncm91bmRUaHJlYWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJiNzJmMS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvc2VhcmNoL0JhY2tncm91bmRUaHJlYWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci0KLXB1YmxpYyBjbGFzcyBCYWNrZ3JvdW5kVGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKLQkvKioKLQkgKiBUaGUgb3BlcmF0aW9uIHRvIGJlIHJ1bi4KLQkgKi8KLQlwcml2YXRlIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZTsKLQkJCi0JLyoqIAotCSAqIFRoZSBleGNlcHRpb24gdGhyb3duIGJ5IHRoZSBvcGVyYXRpb24gc3RhcnRlci4KLQkgKi8KLQlwcml2YXRlIFRocm93YWJsZSB0aHJvd2FibGU7Ci0JCQotCS8qKgotCSAqIFRoZSBwcm9ncmVzcyBtb25pdG9yIHVzZWQgZm9yIHByb2dyZXNzIGFuZCBjYW5jZWxhdGlvbi4KLQkgKi8KLQlwcml2YXRlIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yOwotCQkKLQkvKioKLQkgKiBUaGUgZGlzcGxheSB1c2VkIGZvciBldmVudCBkaXNwYXRjaGluZy4KLQkgKi8KLQlwcml2YXRlIERpc3BsYXkgZGlzcGxheTsKLQkJCi0JLyoqCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgdG8gY29udGludWUgZXZlbnQgcXVldWUgZGlzcGF0Y2hpbmcuCi0JICovCi0JcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIGNvbnRpbnVlRXZlbnREaXNwYXRjaGluZyA9IHRydWU7Ci0KLQlwdWJsaWMgQmFja2dyb3VuZFRocmVhZChJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3BlcmF0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIERpc3BsYXkgZGlzcGxheSkgewotCQlzdXBlcigiQmFja2dyb3VuZFRocmVhZCIpOyAvLyROT04tTkxTLTEkCi0JCUFzc2VydC5pc1RydWUobW9uaXRvciAhPSBudWxsICYmIGRpc3BsYXkgIT0gbnVsbCk7Ci0JCXJ1bm5hYmxlID0gb3BlcmF0aW9uOwotCQl0aGlzLnByb2dyZXNzTW9uaXRvciA9IG1vbml0b3I7Ci0JCXRoaXMuZGlzcGxheSA9IGRpc3BsYXk7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBNZXRob2QgZGVjbGFyZWQgb24gVGhyZWFkLgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJdHJ5IHsKLQkJCWlmIChydW5uYWJsZSAhPSBudWxsKQotCQkJCXJ1bm5hYmxlLnJ1bihwcm9ncmVzc01vbml0b3IpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCXRocm93YWJsZT0gZTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJdGhyb3dhYmxlPSBlOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCS8vdGhyb3dhYmxlPSBlOwotCQkJdGhyb3cgZTsKLQkJfSBjYXRjaCAoVGhyZWFkRGVhdGggZSkgewotCQkJLy8gTWFrZSBzdXJlIHRvIHByb3BhZ2F0ZSBUaHJlYWREZWF0aCwgb3IgdGhyZWFkcyB3aWxsIG5ldmVyIGZ1bGx5IHRlcm1pbmF0ZQotCQkJdGhyb3cgZTsKLQkJfSBjYXRjaCAoRXJyb3IgZSkgewotCQkJdGhyb3dhYmxlPSBlOwotCQl9IGZpbmFsbHkgewotCQkJLy8gTWFrZSBzdXJlIHRoYXQgYWxsIGV2ZW50cyBpbiB0aGUgYXN5bmNocm9ub3VzIGV2ZW50IHF1ZXVlCi0JCQkvLyBhcmUgZGlzcGF0Y2hlZC4KLQkJCWRpc3BsYXkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJLy8gZG8gbm90aGluZwotCQkJCX0KLQkJCX0pOwotCQkJCQotCQkJLy8gU3RvcCBldmVudCBkaXNwYXRjaGluZwotCQkJY29udGludWVFdmVudERpc3BhdGNoaW5nPSBmYWxzZTsKLQkJCQkKLQkJCS8vIEZvcmNlIHRoZSBldmVudCBsb29wIHRvIHJldHVybiBmcm9tIHNsZWVwICgpIHNvIHRoYXQKLQkJCS8vIGl0IHN0b3BzIGV2ZW50IGRpc3BhdGNoaW5nLgotCQkJZGlzcGxheS5hc3luY0V4ZWMobnVsbCk7Ci0JCQlpZiAodGhyb3dhYmxlIT1udWxsKSB7Ci0JCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlVcGRhdGVVSS5sb2dFeGNlcHRpb24odGhyb3dhYmxlKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9CQotCX0KLQlwdWJsaWMgVGhyb3dhYmxlIGdldFRocm93YWJsZSgpIHsKLQkJcmV0dXJuIHRocm93YWJsZTsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9zZWFyY2gvRGVmYXVsdFVwZGF0ZXNTZWFyY2hPYmplY3QuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9zZWFyY2gvRGVmYXVsdFVwZGF0ZXNTZWFyY2hPYmplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU5YjFiYi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvc2VhcmNoL0RlZmF1bHRVcGRhdGVzU2VhcmNoT2JqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7Ci0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0VXBkYXRlc1NlYXJjaE9iamVjdCBleHRlbmRzIFNlYXJjaE9iamVjdCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9OQU1FID0gIkF2YWlsYWJsZVVwZGF0ZXMubmFtZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFQ1RJT05fSUQgPSAiZGVmYXVsdFVwZGF0ZVNlYXJjaCI7Ci0KLQlwdWJsaWMgRGVmYXVsdFVwZGF0ZXNTZWFyY2hPYmplY3QoKSB7Ci0JCXN1cGVyKAotCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9OQU1FKSwKLQkJCVNlYXJjaENhdGVnb3J5UmVnaXN0cnlSZWFkZXIuZ2V0RGVmYXVsdCgpLmdldERlc2NyaXB0b3IoCi0JCQkJIm9yZy5lY2xpcHNlLnVwZGF0ZS51aS51cGRhdGVzIiksCi0JCQl0cnVlKTsKLQkJc2V0TW9kZWwoVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldFVwZGF0ZU1vZGVsKCkpOwotCX0KLQlwcml2YXRlIElEaWFsb2dTZXR0aW5ncyBnZXRTZWN0aW9uKCkgewotCQlJRGlhbG9nU2V0dGluZ3MgbWFzdGVyID0gVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0JCUlEaWFsb2dTZXR0aW5ncyBzZWN0aW9uID0gbWFzdGVyLmdldFNlY3Rpb24oU0VDVElPTl9JRCk7Ci0JCWlmIChzZWN0aW9uID09IG51bGwpIHsKLQkJCXNlY3Rpb24gPSBtYXN0ZXIuYWRkTmV3U2VjdGlvbihTRUNUSU9OX0lEKTsKLQkJfQotCQlyZXR1cm4gc2VjdGlvbjsKLQl9Ci0JcHVibGljIGJvb2xlYW4gZ2V0U2VhcmNoTXlDb21wdXRlcigpIHsKLQkJcmV0dXJuIGdldFNlY3Rpb24oKS5nZXRCb29sZWFuKFNfTVlfQ09NUFVURVIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNlYXJjaE15Q29tcHV0ZXIoYm9vbGVhbiB2YWx1ZSkgewotCQlnZXRTZWN0aW9uKCkucHV0KFNfTVlfQ09NUFVURVIsIHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTZWFyY2hCb29rbWFya3MoYm9vbGVhbiB2YWx1ZSkgewotCQlnZXRTZWN0aW9uKCkucHV0KFNfQk9PS01BUktTLCB2YWx1ZSk7Ci0JfQotCXB1YmxpYyBib29sZWFuIGdldFNlYXJjaEJvb2ttYXJrcygpIHsKLQkJcmV0dXJuIGdldFNlY3Rpb24oKS5nZXRCb29sZWFuKFNfQk9PS01BUktTKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTZWFyY2hEaXNjb3ZlcnkoYm9vbGVhbiB2YWx1ZSkgewotCQlnZXRTZWN0aW9uKCkucHV0KFNfRElTQ09WRVJZLCB2YWx1ZSk7Ci0JfQotCXB1YmxpYyBib29sZWFuIGdldFNlYXJjaERpc2NvdmVyeSgpIHsKLQkJcmV0dXJuIGdldFNlY3Rpb24oKS5nZXRCb29sZWFuKFNfRElTQ09WRVJZKTsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXREcml2ZVNldHRpbmdzKCkgewotCQlyZXR1cm4gZ2V0U2VjdGlvbigpLmdldChTX0RSSVZFUyk7Ci0JfQotCXB1YmxpYyB2b2lkIHNldERyaXZlU2V0dGluZ3MoU3RyaW5nIGRyaXZlcykgewotCQlnZXRTZWN0aW9uKCkucHV0KFNfRFJJVkVTLCBkcml2ZXMpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvc2VhcmNoL0RyaXZlU2VhcmNoU2V0dGluZ3MuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9zZWFyY2gvRHJpdmVTZWFyY2hTZXR0aW5ncy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWRiOWRmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9zZWFyY2gvRHJpdmVTZWFyY2hTZXR0aW5ncy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnNlYXJjaDsKLQotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBEcml2ZVNlYXJjaFNldHRpbmdzIHsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJU0FCTEVEID0gMDsKLXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRVAgPSAtIDE7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSEFMTE9XID0gLTI7Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludCBDVVNUT00gPSAtMzsKLQotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JcHJpdmF0ZSBib29sZWFuIGNoZWNrZWQgPSBmYWxzZTsKLQlwcml2YXRlIGludCBzZWFyY2hEZXB0aCA9IERFRVA7Ci0JcHJpdmF0ZSBpbnQgbnVtYmVyT2ZMZXZlbHMgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKLQkKLQlwdWJsaWMgRHJpdmVTZWFyY2hTZXR0aW5ncygpIHsKLQl9Ci0JCi0JcHVibGljIERyaXZlU2VhcmNoU2V0dGluZ3MoU3RyaW5nIG5hbWUpIHsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgbmFtZS4KLQkgKiBAcmV0dXJuIFJldHVybnMgYSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG5hbWUuCi0JICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGNoZWNrZWQuCi0JICogQHJldHVybiBSZXR1cm5zIGEgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ2hlY2tlZCgpIHsKLQkJcmV0dXJuIGNoZWNrZWQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgY2hlY2tlZC4KLQkgKiBAcGFyYW0gY2hlY2tlZCBUaGUgY2hlY2tlZCB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDaGVja2VkKGJvb2xlYW4gY2hlY2tlZCkgewotCQl0aGlzLmNoZWNrZWQgPSBjaGVja2VkOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHNlYXJjaERlcHRoLgotCSAqIEByZXR1cm4gUmV0dXJucyBhIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U2VhcmNoRGVwdGgoKSB7Ci0JCXJldHVybiBzZWFyY2hEZXB0aDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzZWFyY2hEZXB0aC4KLQkgKiBAcGFyYW0gc2VhcmNoRGVwdGggVGhlIHNlYXJjaERlcHRoIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlYXJjaERlcHRoKGludCBzZWFyY2hEZXB0aCkgewotCQl0aGlzLnNlYXJjaERlcHRoID0gc2VhcmNoRGVwdGg7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbnVtYmVyT2ZMZXZlbHMuCi0JICogQHJldHVybiBSZXR1cm5zIGEgaW50Ci0JICovCi0JcHVibGljIGludCBnZXROdW1iZXJPZkxldmVscygpIHsKLQkJcmV0dXJuIG51bWJlck9mTGV2ZWxzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG51bWJlck9mTGV2ZWxzLgotCSAqIEBwYXJhbSBudW1iZXJPZkxldmVscyBUaGUgbnVtYmVyT2ZMZXZlbHMgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TnVtYmVyT2ZMZXZlbHMoaW50IG51bWJlck9mTGV2ZWxzKSB7Ci0JCXRoaXMubnVtYmVyT2ZMZXZlbHMgPSBudW1iZXJPZkxldmVsczsKLQl9Ci0KLQl2b2lkIGxvYWQoU3RyaW5nIHZhbHVlKSB7Ci0JCWludCBsb2MgPSB2YWx1ZS5pbmRleE9mKCcsJyk7Ci0JCW5hbWUgPSB2YWx1ZS5zdWJzdHJpbmcoMCwgbG9jKTsKLQkJY2hlY2tlZCA9IHRydWU7Ci0JCVN0cmluZyBkZXB0aCA9IHZhbHVlLnN1YnN0cmluZyhsb2MrMSk7Ci0JCWludCBpZGVwdGggPSBERUVQOwotCi0JCXRyeSB7Ci0JCQlpZGVwdGggPSBJbnRlZ2VyLnBhcnNlSW50KGRlcHRoKTsKLQkJCWlmIChpZGVwdGg+MCkgewotCQkJCXNlYXJjaERlcHRoID0gQ1VTVE9NOwotCQkJCW51bWJlck9mTGV2ZWxzID0gaWRlcHRoOwotCQkJfQotCQkJZWxzZSBpZiAoaWRlcHRoPDApIHsKLQkJCQlzZWFyY2hEZXB0aCA9IGlkZXB0aDsKLQkJCX0gCi0JCQllbHNlIGNoZWNrZWQgPSBmYWxzZTsKLQkJfQotCQljYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KLQkKLQlTdHJpbmcgZW5jb2RlKCkgewotCQlpbnQgaWRlcHRoPURJU0FCTEVEOwotCQkKLQkJaWYgKGNoZWNrZWQpCi0JCSAgIGlkZXB0aCA9IHNlYXJjaERlcHRoID09IENVU1RPTSA/IG51bWJlck9mTGV2ZWxzOnNlYXJjaERlcHRoOwotCQlTdHJpbmcgcmVzdWx0ID0gbmFtZSArICIsIitpZGVwdGg7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBnZXROYW1lKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3NlYXJjaC9FeHByZXNzaW9uU2VhcmNoQ2F0ZWdvcnkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9zZWFyY2gvRXhwcmVzc2lvblNlYXJjaENhdGVnb3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyMmIzODYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3NlYXJjaC9FeHByZXNzaW9uU2VhcmNoQ2F0ZWdvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5zZWFyY2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWwuSVNpdGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbC5Gb3JtV2lkZ2V0RmFjdG9yeTsKLQotcHVibGljIGNsYXNzIEV4cHJlc3Npb25TZWFyY2hDYXRlZ29yeSBleHRlbmRzIFNlYXJjaENhdGVnb3J5IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0VYUFJFU1NJT04gPSAiRXhwcmVzc2lvblNlYXJjaENhdGVnb3J5LmV4cHJlc3Npb24iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ0FTRSA9ICJFeHByZXNzaW9uU2VhcmNoQ2F0ZWdvcnkuY2FzZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9MT09LID0gIkV4cHJlc3Npb25TZWFyY2hDYXRlZ29yeS5sb29rIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX05BTUUgPSAiRXhwcmVzc2lvblNlYXJjaENhdGVnb3J5Lm5hbWUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUFJPVklERVIgPSAiRXhwcmVzc2lvblNlYXJjaENhdGVnb3J5LnByb3ZpZGVyIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RFU0NSSVBUSU9OID0gIkV4cHJlc3Npb25TZWFyY2hDYXRlZ29yeS5kZXNjcmlwdGlvbiI7Ci0KLQlwcml2YXRlIFRleHQgZXhwcmVzc2lvblRleHQ7Ci0JcHJpdmF0ZSBCdXR0b24gY2FzZUNoZWNrOwotCXByaXZhdGUgQnV0dG9uIG5hbWVDaGVjazsKLQlwcml2YXRlIEJ1dHRvbiBwcm92aWRlckNoZWNrOwotCXByaXZhdGUgQnV0dG9uIGRlc2NyaXB0aW9uQ2hlY2s7Ci0JcHJpdmF0ZSBib29sZWFuIGNhc2VTZW5zaXRpdmUgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gc2VhcmNoTmFtZSA9IHRydWU7Ci0JcHJpdmF0ZSBib29sZWFuIHNlYXJjaFByb3ZpZGVyID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIHNlYXJjaERlc2MgPSBmYWxzZTsKLQlwcml2YXRlIFN0cmluZyBleHByZXNzaW9uPSIiOwotCXByaXZhdGUgU3RyaW5nIG5vQ2FzZUV4cHJlc3Npb247Ci0JCi0JcHVibGljIEV4cHJlc3Npb25TZWFyY2hDYXRlZ29yeSgpIHsKLQl9Ci0JCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50LCBGb3JtV2lkZ2V0RmFjdG9yeSBmYWN0b3J5KSB7CQkKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IGZhY3RvcnkuY3JlYXRlQ29tcG9zaXRlKHBhcmVudCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMjsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQljb250YWluZXIuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWZhY3RvcnkuY3JlYXRlTGFiZWwoY29udGFpbmVyLCBVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX0VYUFJFU1NJT04pKTsKLQkJZXhwcmVzc2lvblRleHQgPSBmYWN0b3J5LmNyZWF0ZVRleHQoY29udGFpbmVyLCAiIik7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWV4cHJlc3Npb25UZXh0LnNldExheW91dERhdGEoZ2QpOwotCQljYXNlQ2hlY2sgPSBmYWN0b3J5LmNyZWF0ZUJ1dHRvbihjb250YWluZXIsIFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfQ0FTRSksIFNXVC5DSEVDSyk7Ci0JCWZpbGxIb3Jpem9udGFsKGNhc2VDaGVjaywgMCk7Ci0JCUxhYmVsIGxhYmVsID0gZmFjdG9yeS5jcmVhdGVMYWJlbChjb250YWluZXIsIFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfTE9PSykpOwotCQlmaWxsSG9yaXpvbnRhbChsYWJlbCwgMCk7Ci0JCW5hbWVDaGVjayA9IGZhY3RvcnkuY3JlYXRlQnV0dG9uKGNvbnRhaW5lciwgVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9OQU1FKSwgU1dULkNIRUNLKTsKLQkJZmlsbEhvcml6b250YWwobmFtZUNoZWNrLCAxMCk7Ci0JCXByb3ZpZGVyQ2hlY2sgPSBmYWN0b3J5LmNyZWF0ZUJ1dHRvbihjb250YWluZXIsIFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfUFJPVklERVIpLCBTV1QuQ0hFQ0spOwotCQlmaWxsSG9yaXpvbnRhbChwcm92aWRlckNoZWNrLCAxMCk7Ci0JCWRlc2NyaXB0aW9uQ2hlY2sgPSBmYWN0b3J5LmNyZWF0ZUJ1dHRvbihjb250YWluZXIsIFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfREVTQ1JJUFRJT04pLCBTV1QuQ0hFQ0spOwotCQlmaWxsSG9yaXpvbnRhbChkZXNjcmlwdGlvbkNoZWNrLCAxMCk7Ci0JCWZhY3RvcnkucGFpbnRCb3JkZXJzRm9yKGNvbnRhaW5lcik7Ci0JCWluaXRpYWxpemVXaWRnZXRzKGZhbHNlKTsKLQkJc2V0Q29udHJvbChjb250YWluZXIpOwotCX0KLQlwcml2YXRlIHZvaWQgZmlsbEhvcml6b250YWwoQ29udHJvbCBjb250cm9sLCBpbnQgaW5kZW50KSB7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJZ2QuaG9yaXpvbnRhbEluZGVudCA9IGluZGVudDsKLQkJY29udHJvbC5zZXRMYXlvdXREYXRhKGdkKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElTZWFyY2hDYXRlZ29yeSNtYXRjaGVzKElGZWF0dXJlKQotCSAqLwotCXB1YmxpYyBJU2VhcmNoUXVlcnkgW10gZ2V0UXVlcmllcygpIHsKLQkJc3RvcmVTZXR0aW5nc0Zyb21XaWRnZXRzKCk7Ci0JCUlTZWFyY2hRdWVyeSBxdWVyeSA9IG5ldyBJU2VhcmNoUXVlcnkoKSB7Ci0JCQlwdWJsaWMgSVNpdGVBZGFwdGVyIGdldFNlYXJjaFNpdGUoKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlwdWJsaWMgSUZlYXR1cmUgW10gZ2V0TWF0Y2hpbmdGZWF0dXJlcyhJU2l0ZSBzaXRlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQlBcnJheUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCUFycmF5TGlzdCBjYW5kaWRhdGVzID0gZ2V0Q2FuZGlkYXRlcyhzaXRlLCBtb25pdG9yKTsKLQkJCQlmb3IgKGludCBpPTA7IGk8Y2FuZGlkYXRlcy5zaXplKCk7IGkrKykgewotCQkJCQlpZiAoaW50ZXJuYWxNYXRjaGVzKChJRmVhdHVyZSljYW5kaWRhdGVzLmdldChpKSkpCi0JCQkJCQlyZXN1bHQuYWRkKGNhbmRpZGF0ZXMuZ2V0KGkpKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIChJRmVhdHVyZVtdKXJlc3VsdC50b0FycmF5KG5ldyBJRmVhdHVyZVtyZXN1bHQuc2l6ZSgpXSk7Ci0JCQl9Ci0JCX07Ci0JCXJldHVybiBuZXcgSVNlYXJjaFF1ZXJ5IFtdIHsgcXVlcnkgfTsKLQl9Ci0JCi0JcHJpdmF0ZSBBcnJheUxpc3QgZ2V0Q2FuZGlkYXRlcyhJU2l0ZSBzaXRlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJSUZlYXR1cmVSZWZlcmVuY2UgW10gcmVmZXJlbmNlcyA9IHNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJQXJyYXlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJbW9uaXRvci5iZWdpblRhc2soIiIsIHJlZmVyZW5jZXMubGVuZ3RoKTsKLQkJZm9yIChpbnQgaT0wOyBpPHJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJSUZlYXR1cmUgZmVhdHVyZSA9IHJlZmVyZW5jZXNbaV0uZ2V0RmVhdHVyZShuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEpKTsKLQkJCQlyZXN1bHQuYWRkKGZlYXR1cmUpOwotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JCW1vbml0b3IuZG9uZSgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc3RvcmVTZXR0aW5nc0Zyb21XaWRnZXRzKCkgewotCQljYXNlU2Vuc2l0aXZlID0gY2FzZUNoZWNrLmdldFNlbGVjdGlvbigpOwotCQlzZWFyY2hOYW1lID0gbmFtZUNoZWNrLmdldFNlbGVjdGlvbigpOwotCQlzZWFyY2hQcm92aWRlciA9IHByb3ZpZGVyQ2hlY2suZ2V0U2VsZWN0aW9uKCk7Ci0JCXNlYXJjaERlc2MgPSBkZXNjcmlwdGlvbkNoZWNrLmdldFNlbGVjdGlvbigpOwotCQlleHByZXNzaW9uID0gZXhwcmVzc2lvblRleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLQkJbm9DYXNlRXhwcmVzc2lvbiA9IGV4cHJlc3Npb24udG9Mb3dlckNhc2UoKTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVXaWRnZXRzKGJvb2xlYW4gZWRpdGFibGUpIHsKLQkJY2FzZUNoZWNrLnNldFNlbGVjdGlvbihjYXNlU2Vuc2l0aXZlKTsKLQkJbmFtZUNoZWNrLnNldFNlbGVjdGlvbihzZWFyY2hOYW1lKTsKLQkJcHJvdmlkZXJDaGVjay5zZXRTZWxlY3Rpb24oc2VhcmNoUHJvdmlkZXIpOwotCQlkZXNjcmlwdGlvbkNoZWNrLnNldFNlbGVjdGlvbihzZWFyY2hEZXNjKTsKLQkJZXhwcmVzc2lvblRleHQuc2V0VGV4dChleHByZXNzaW9uKTsKLQotCQljYXNlQ2hlY2suc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCW5hbWVDaGVjay5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJcHJvdmlkZXJDaGVjay5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJZGVzY3JpcHRpb25DaGVjay5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJZXhwcmVzc2lvblRleHQuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0Q3VycmVudFNlYXJjaCgpIHsKLQkJcmV0dXJuICJcIiIrZXhwcmVzc2lvblRleHQuZ2V0VGV4dCgpKyJcIiI7Ci0JfQotCXByaXZhdGUgYm9vbGVhbiBpbnRlcm5hbE1hdGNoZXMoSUZlYXR1cmUgZmVhdHVyZSkgewotCQlpZiAoc2VhcmNoTmFtZSkgewotCQkJaWYgKG1hdGNoZXMoZmVhdHVyZS5nZXRMYWJlbCgpKSkgcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKHNlYXJjaFByb3ZpZGVyKSB7Ci0JCQlpZiAobWF0Y2hlcyhmZWF0dXJlLmdldFByb3ZpZGVyKCkpKSByZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoc2VhcmNoRGVzYykgewotCQkJU3RyaW5nIGFubm90YXRpb24gPSBudWxsOwotCQkJaWYgKGZlYXR1cmUuZ2V0RGVzY3JpcHRpb24oKSE9bnVsbCkKLQkJCQlhbm5vdGF0aW9uID0gZmVhdHVyZS5nZXREZXNjcmlwdGlvbigpLmdldEFubm90YXRpb24oKTsKLQkJCWlmIChhbm5vdGF0aW9uIT1udWxsKSB7Ci0JCQkJaWYgKG1hdGNoZXMoYW5ub3RhdGlvbikpIHJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JcHJpdmF0ZSBib29sZWFuIG1hdGNoZXMoU3RyaW5nIHRleHQpIHsKLQkJaWYgKCFjYXNlU2Vuc2l0aXZlKSB7Ci0JCQlTdHJpbmcgbm9DYXNlVGV4dCA9IHRleHQudG9Mb3dlckNhc2UoKTsKLQkJCXJldHVybiBub0Nhc2VUZXh0LmluZGV4T2Yobm9DYXNlRXhwcmVzc2lvbikhPSAtMTsKLQkJfQotCQlyZXR1cm4gdGV4dC5pbmRleE9mKGV4cHJlc3Npb24pIT0gLTE7Ci0JfQotCXB1YmxpYyB2b2lkIGxvYWQoTWFwIG1hcCwgYm9vbGVhbiBlZGl0YWJsZSkgewotCQljYXNlU2Vuc2l0aXZlID0gZ2V0Qm9vbGVhbigiY2FzZSIsIG1hcCk7Ci0JCXNlYXJjaE5hbWUgPSBnZXRCb29sZWFuKCJuYW1lIiwgbWFwKTsKLQkJc2VhcmNoUHJvdmlkZXIgPSBnZXRCb29sZWFuKCJwcm92aWRlciIsIG1hcCk7Ci0JCXNlYXJjaERlc2MgPSBnZXRCb29sZWFuKCJkZXNjIiwgbWFwKTsKLQkJZXhwcmVzc2lvbiA9IGdldFN0cmluZygiZXhwcmVzc2lvbiIsIG1hcCk7Ci0JCWlmIChjYXNlQ2hlY2shPW51bGwpCi0JCQlpbml0aWFsaXplV2lkZ2V0cyhlZGl0YWJsZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RvcmUoTWFwIG1hcCkgewotCQlzdG9yZVNldHRpbmdzRnJvbVdpZGdldHMoKTsKLQkJbWFwLnB1dCgiY2FzZSIsIGNhc2VTZW5zaXRpdmU/InRydWUiOiJmYWxzZSIpOwotCQltYXAucHV0KCJuYW1lIiwgc2VhcmNoTmFtZT8idHJ1ZSI6ImZhbHNlIik7Ci0JCW1hcC5wdXQoInByb3ZpZGVyIiwgc2VhcmNoUHJvdmlkZXI/InRydWUiOiJmYWxzZSIpOwotCQltYXAucHV0KCJkZXNjIiwgc2VhcmNoRGVzYz8idHJ1ZSI6ImZhbHNlIik7Ci0JCW1hcC5wdXQoImV4cHJlc3Npb24iLCBleHByZXNzaW9uKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3NlYXJjaC9JU2VhcmNoQ2F0ZWdvcnkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9zZWFyY2gvSVNlYXJjaENhdGVnb3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ZGU1NWIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3NlYXJjaC9JU2VhcmNoQ2F0ZWdvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnNlYXJjaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsLkZvcm1XaWRnZXRGYWN0b3J5OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVNlYXJjaENhdGVnb3J5IHsKLS8qKgotICogUmV0dXJucyB0aGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhpcyBzZWFyY2ggY2F0ZWdvcnkuCi0gKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCk7Ci0vKioKLSAqIEFjY2VwdHMgdGhlIGlkZW50aWZpZXIgYXNzaWduZWQgdG8gdGhpcyBjYXRlZ29yeSBkdXJpbmcKLSAqIHRoZSByZWdpc3RyeSByZWFkaW5nLgotICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIGlkKTsKLS8qKgotICogUmV0dXJucyBhbiBhcnJheSBvZiBxdWVyaWVzIHRoYXQgbmVlZCB0byBiZSBleGVjdXRlZAotICogd2hlbiBzZWFyY2ggb2YgdGhpcyBjYXRlZ29yeSBpcyBpbml0aWF0ZWQuCi0gKi8KLQlwdWJsaWMgSVNlYXJjaFF1ZXJ5IFtdIGdldFF1ZXJpZXMoKTsKLS8qKgotICogQ3JlYXRlcyBhIGNvbnRyb2wgdGhhdCBjb250YWlucyB3aWRnZXRzIHVzZXJzIGNhbiB1c2UgdG8KLSAqIGN1c3RvbWl6ZSBjYXRlZ29yeSBzZXR0aW5ncy4KLSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCwgRm9ybVdpZGdldEZhY3RvcnkgZmFjdG9yeSk7Ci0vKioKLSAqIFJldHVybnMgdGhlIGNvbnRyb2wgdGhhdCBob3N0cyB3aWRnZXRzIHVzZXJzIGNhbiB1c2UgdG8gCi0gKiBjdXN0b21pemUgY2F0ZWdvcnkgc2V0dGluZ3MuCi0gKi8JCi0JcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpOwotLyoqCi0gKiBSZXR1cm5zIGEgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgY3VycmVudCBzZWFyY2guIFRoaXMKLSAqIHRleHQgd2lsbCBiZSB1c2VkIGluIHRoZSBVSSAKLSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q3VycmVudFNlYXJjaCgpOwotLyoqCi0gKiBMb2FkIHRoZSBjYXRlZ29yeSBzZXR0aW5ncyBmcm9tIHRoZSBwcm92aWRlZCBvYmplY3QuCi0gKi8JCi0JcHVibGljIHZvaWQgbG9hZChNYXAgc2V0dGluZ3MsIGJvb2xlYW4gZWRpdGFibGUpOwotLyoqCi0gKiBTYXZlIHRoZSBjYXRlZ29yeSBzZXR0aW5ncyBpbnRvIHRoZSBwcm92aWRlZCBvYmplY3QuCi0gKi8KLQlwdWJsaWMgdm9pZCBzdG9yZShNYXAgc2V0dGluZ3MpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9zZWFyY2gvSVNlYXJjaE9iamVjdEFkYXB0ZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9zZWFyY2gvSVNlYXJjaE9iamVjdEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ4NTcwMS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvc2VhcmNoL0lTZWFyY2hPYmplY3RBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5zZWFyY2g7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVNlYXJjaE9iamVjdEFkYXB0ZXIgewotCXZvaWQgc2V0U2VhcmNoT2JqZWN0KFNlYXJjaE9iamVjdCBzb2JqKTsKLQlTZWFyY2hPYmplY3QgZ2V0U2VhcmNoT2JqZWN0KCk7Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvc2VhcmNoL0lTZWFyY2hRdWVyeS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3NlYXJjaC9JU2VhcmNoUXVlcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY4YTExNy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvc2VhcmNoL0lTZWFyY2hRdWVyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuc2VhcmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsLklTaXRlQWRhcHRlcjsKLQotcHVibGljIGludGVyZmFjZSBJU2VhcmNoUXVlcnkgewotLyoqCi0gKiBSZXR1cm5zIGEgVVJMIG9mIGFuIGV4cGxpY2l0IHNpdGUgdGhhdCBuZWVkcyB0byAKLSAqIGJlIHVzZWQgZm9yIHRoaXMgcXVlcnkuIFRoaXMgc2l0ZSBpcyBzZWFyY2hlZCBmaXJzdC4KLSAqIEluIGFkZGl0aW9uLCBsb2NhbCBmaWxlIHN5c3RlbSBhbmQgYm9va21hcmtlZCBzaXRlcwotICogY2FuIGJlIHNlYXJjaGVkIGFzIHdlbGwgaWYgc2VsZWN0ZWQgaW4gc2VhcmNoIG9wdGlvbnMuCi0gKiBAcmV0dXJuIGEgdXJsIG9mIGEgc2l0ZSB0aGF0IG5lZWRzIHRvIGJlIHNlYXJjaGVkIGZvcgotICogdGhpcyBxdWVyeSBvciA8c2FtcD5udWxsPC9zYW1wPiBpZiBhIGdlbmVyYWwgc2NhbiAKLSAqIHNob3VsZCBiZSB1c2VkLgotICovCi0JcHVibGljIElTaXRlQWRhcHRlciBnZXRTZWFyY2hTaXRlKCk7Ci0JCi0vKioKLSAqIFJldHVybnMgYW4gYXJyYXkgb2YgZmVhdHVyZXMgdGhhdCBtYXRjaCB0aGUgc2VhcmNoIHF1ZXJ5Ci0gKiB1c2luZyB0aGUgcHJvdmlkZWQgc2l0ZSBhcyBhIHNvdXJjZS4KLSAqLwotCXB1YmxpYyBJRmVhdHVyZSBbXSBnZXRNYXRjaGluZ0ZlYXR1cmVzKElTaXRlIHNpdGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcik7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3NlYXJjaC9NeUNvbXB1dGVyU2VhcmNoRGlhbG9nLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvc2VhcmNoL015Q29tcHV0ZXJTZWFyY2hEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTkwY2IxYi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvc2VhcmNoL015Q29tcHV0ZXJTZWFyY2hEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5zZWFyY2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5Xb3JrYmVuY2hIZWxwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wYXJ0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGNsYXNzIE15Q29tcHV0ZXJTZWFyY2hEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTEFCRUwgPSAiTXlDb21wdXRlclNlYXJjaERpYWxvZy5sYWJlbCI7Ci0JcHJpdmF0ZSBNeUNvbXB1dGVyU2VhcmNoU2V0dGluZ3Mgc2V0dGluZ3M7Ci0JcHJpdmF0ZSBCdXR0b24gb2tCdXR0b247Ci0JcHJpdmF0ZSBWb2x1bWVMYWJlbFByb3ZpZGVyIHZvbHVtZUxhYmVsUHJvdmlkZXI7Ci0JcHJpdmF0ZSBDaGVja2JveFRhYmxlVmlld2VyIHZpZXdlcjsKLQlwcml2YXRlIGJvb2xlYW4gbG9hZGVkID0gZmFsc2U7Ci0JcHJpdmF0ZSBTZWFyY2hPYmplY3Qgc2VhcmNoOwotCXByaXZhdGUgSGFzaHRhYmxlIGRyaXZlTWFwID0gbmV3IEhhc2h0YWJsZSgpOwotCi0JY2xhc3MgRHJpdmVDb250ZW50UHJvdmlkZXIKLQkJZXh0ZW5kcyBEZWZhdWx0Q29udGVudFByb3ZpZGVyCi0JCWltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0KSB7Ci0JCQlpZiAoIWxvYWRlZCkKLQkJCQlpbml0aWFsaXplRHJpdmVzKCk7Ci0JCQlyZXR1cm4gc2V0dGluZ3MuZ2V0RHJpdmVTZXR0aW5ncygpOwotCQl9Ci0JfQotCi0JY2xhc3MgRHJpdmVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciB7Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqKSB7Ci0JCQlJVm9sdW1lIHZvbHVtZSA9IChJVm9sdW1lKWRyaXZlTWFwLmdldChvYmopOwotCQkJaWYgKHZvbHVtZSE9bnVsbCkgcmV0dXJuIHZvbHVtZUxhYmVsUHJvdmlkZXIuZ2V0VGV4dCh2b2x1bWUpOwotCQkJcmV0dXJuICgoRHJpdmVTZWFyY2hTZXR0aW5ncykgb2JqKS5nZXROYW1lKCk7Ci0JCX0KLQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBvYmopIHsKLQkJCUlWb2x1bWUgdm9sdW1lID0gKElWb2x1bWUpZHJpdmVNYXAuZ2V0KG9iaik7Ci0JCQlyZXR1cm4gdm9sdW1lTGFiZWxQcm92aWRlci5nZXRJbWFnZSh2b2x1bWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIE15Q29tcHV0ZXJTZWFyY2hEaWFsb2cuCi0JICogQHBhcmFtIHBhcmVudFNoZWxsCi0JICovCi0JcHVibGljIE15Q29tcHV0ZXJTZWFyY2hEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFNlYXJjaE9iamVjdCBzZWFyY2gpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCQlzZXR0aW5ncyA9IG5ldyBNeUNvbXB1dGVyU2VhcmNoU2V0dGluZ3Moc2VhcmNoKTsKLQkJdm9sdW1lTGFiZWxQcm92aWRlciA9IG5ldyBWb2x1bWVMYWJlbFByb3ZpZGVyKCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGNsb3NlKCkgewotCQlib29sZWFuIHZhbHVlID0gc3VwZXIuY2xvc2UoKTsKLQkJdm9sdW1lTGFiZWxQcm92aWRlci5kaXNwb3NlKCk7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgaWQpIHsKLQkJaWYgKGlkID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQpIHsKLQkJCXN0b3JlU2V0dGluZ3MoKTsKLQkJfQotCQlzdXBlci5idXR0b25QcmVzc2VkKGlkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gY3JlYXRlIE9LIGFuZCBDYW5jZWwgYnV0dG9ucyBieSBkZWZhdWx0Ci0JCW9rQnV0dG9uID0KLQkJCWNyZWF0ZUJ1dHRvbigKLQkJCQlwYXJlbnQsCi0JCQkJSURpYWxvZ0NvbnN0YW50cy5PS19JRCwKLQkJCQlJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLAotCQkJCXRydWUpOwotCQljcmVhdGVCdXR0b24oCi0JCQlwYXJlbnQsCi0JCQlJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCwKLQkJCUlEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMLAotCQkJZmFsc2UpOwotCX0KLQotCXB1YmxpYyBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAxMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMTA7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY29udGFpbmVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbnRhaW5lciwgU1dULk5VTEwpOwotCQlsYWJlbC5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfTEFCRUwpKTsKLQotCQl2aWV3ZXIgPSBDaGVja2JveFRhYmxlVmlld2VyLm5ld0NoZWNrTGlzdChjb250YWluZXIsIFNXVC5CT1JERVIpOwotCQl2aWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBEcml2ZUNvbnRlbnRQcm92aWRlcigpKTsKLQkJdmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IERyaXZlTGFiZWxQcm92aWRlcigpKTsKLQkJdmlld2VyLmFkZENoZWNrU3RhdGVMaXN0ZW5lcihuZXcgSUNoZWNrU3RhdGVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoZWNrU3RhdGVDaGFuZ2VkKENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQloYW5kbGVEcml2ZUNoZWNrZWQoCi0JCQkJCShEcml2ZVNlYXJjaFNldHRpbmdzKSBldmVudC5nZXRFbGVtZW50KCksCi0JCQkJCWV2ZW50LmdldENoZWNrZWQoKSk7Ci0JCQl9Ci0JCX0pOwotCQl2aWV3ZXIuc2V0SW5wdXQoVXBkYXRlVUkuZ2V0RGVmYXVsdCgpKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZ2Qud2lkdGhIaW50ID0gMjAwOwotCQlnZC5oZWlnaHRIaW50ID0gMzAwOwotCQl2aWV3ZXIuZ2V0VGFibGUoKS5zZXRMYXlvdXREYXRhKGdkKTsKLQkJbG9hZFNldHRpbmdzKCk7Ci0JCVdvcmtiZW5jaEhlbHAuc2V0SGVscChjb250YWluZXIsICJvcmcuZWNsaXBzZS51cGRhdGUudWkuTXlDb21wdXRlclNlYXJjaERpYWxvZyIpOwotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotCXByaXZhdGUgdm9pZCBsb2FkU2V0dGluZ3MoKSB7Ci0JCVZlY3RvciBzZWxlY3RlZCA9IG5ldyBWZWN0b3IoKTsKLQkJRHJpdmVTZWFyY2hTZXR0aW5nc1tdIGRyaXZlcyA9IHNldHRpbmdzLmdldERyaXZlU2V0dGluZ3MoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkcml2ZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChkcml2ZXNbaV0uaXNDaGVja2VkKCkpCi0JCQkJc2VsZWN0ZWQuYWRkKGRyaXZlc1tpXSk7Ci0JCX0KLQkJdmlld2VyLnNldENoZWNrZWRFbGVtZW50cyhzZWxlY3RlZC50b0FycmF5KCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplRHJpdmVzKCkgewotCQlJVm9sdW1lW10gdm9sdW1lcyA9IExvY2FsU3lzdGVtSW5mby5nZXRWb2x1bWVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdm9sdW1lcy5sZW5ndGg7IGkrKykgewotCQkJLy8gRW5zdXJlIHNldHRpbmdzIGV4aXN0cwotCQkJU3RyaW5nIGxhYmVsID0gdm9sdW1lc1tpXS5nZXRMYWJlbCgpOwotCQkJaWYgKGxhYmVsID09IG51bGwgfHwgIiIuZXF1YWxzKGxhYmVsKSkKLQkJCQlsYWJlbCA9IHZvbHVtZXNbaV0uZ2V0RmlsZSgpLmdldFBhdGgoKTsKLQkJCWVsc2UKLQkJCQlsYWJlbCA9IGxhYmVsICsgIiAoIiArIHZvbHVtZXNbaV0uZ2V0RmlsZSgpLmdldFBhdGgoKSArICIpIjsKLQkJCURyaXZlU2VhcmNoU2V0dGluZ3MgZHJpdmUgPSBzZXR0aW5ncy5nZXREcml2ZVNldHRpbmdzKGxhYmVsKTsKLQkJCWRyaXZlTWFwLnB1dChkcml2ZSwgdm9sdW1lc1tpXSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlRHJpdmVDaGVja2VkKAotCQlEcml2ZVNlYXJjaFNldHRpbmdzIGRyaXZlLAotCQlib29sZWFuIGNoZWNrZWQpIHsKLQkJZHJpdmUuc2V0Q2hlY2tlZChjaGVja2VkKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3RvcmVTZXR0aW5ncygpIHsKLQkJc2V0dGluZ3Muc3RvcmUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvc2VhcmNoL015Q29tcHV0ZXJTZWFyY2hTZXR0aW5ncy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3NlYXJjaC9NeUNvbXB1dGVyU2VhcmNoU2V0dGluZ3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIxYmRkOC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvc2VhcmNoL015Q29tcHV0ZXJTZWFyY2hTZXR0aW5ncy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuc2VhcmNoOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC4qOwotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBNeUNvbXB1dGVyU2VhcmNoU2V0dGluZ3MgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRUNUSU9OID0gIm15Q29tcHV0ZXJTZWFyY2hTZXR0aW5ncyI7Ci0JU2VhcmNoT2JqZWN0IHNlYXJjaDsKLQlwcml2YXRlIFZlY3RvciBkcml2ZXMgPSBuZXcgVmVjdG9yKCk7Ci0JcHJpdmF0ZSBib29sZWFuIG1hc3RlclNldHRpbmdzPWZhbHNlOwotCQotCXB1YmxpYyBib29sZWFuIGlzTXlDb21wdXRlclNlYXJjaGVkKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIE15Q29tcHV0ZXJTZWFyY2hTZXR0aW5ncyhTZWFyY2hPYmplY3Qgc2VhcmNoKSB7Ci0JCXRoaXMuc2VhcmNoID0gc2VhcmNoOwotCQlsb2FkKCk7Ci0JfQotCi0JcHVibGljIERyaXZlU2VhcmNoU2V0dGluZ3NbXSBnZXREcml2ZVNldHRpbmdzKCkgewotCQlyZXR1cm4gKERyaXZlU2VhcmNoU2V0dGluZ3NbXSkgZHJpdmVzLnRvQXJyYXkoCi0JCQluZXcgRHJpdmVTZWFyY2hTZXR0aW5nc1tkcml2ZXMuc2l6ZSgpXSk7Ci0JfQotCi0JcHVibGljIERyaXZlU2VhcmNoU2V0dGluZ3MgZ2V0RHJpdmVTZXR0aW5ncyhTdHJpbmcgZHJpdmVOYW1lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZHJpdmVzLnNpemUoKTsgaSsrKSB7Ci0JCQlEcml2ZVNlYXJjaFNldHRpbmdzIGRyaXZlID0gKERyaXZlU2VhcmNoU2V0dGluZ3MpIGRyaXZlcy5nZXQoaSk7Ci0JCQlpZiAoZHJpdmUuZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoZHJpdmVOYW1lKSkgewotCQkJCXJldHVybiBkcml2ZTsKLQkJCX0KLQkJfQotCQlEcml2ZVNlYXJjaFNldHRpbmdzIGRyaXZlID0gbmV3IERyaXZlU2VhcmNoU2V0dGluZ3MoZHJpdmVOYW1lKTsKLQkJZHJpdmVzLmFkZChkcml2ZSk7Ci0JCXJldHVybiBkcml2ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbG9hZCgpIHsKLQkJU3RyaW5nIGRyaXZlc1N0cmluZyA9IHNlYXJjaC5nZXREcml2ZVNldHRpbmdzKCk7Ci0JCWlmIChkcml2ZXNTdHJpbmcgIT0gbnVsbCkgewotCQkJU3RyaW5nVG9rZW5pemVyIHN0b2sgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGRyaXZlc1N0cmluZywgRmlsZS5wYXRoU2VwYXJhdG9yKTsKLQkJCXdoaWxlIChzdG9rLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCVN0cmluZyBkcml2ZVN0cmluZyA9IHN0b2submV4dFRva2VuKCk7Ci0JCQkJRHJpdmVTZWFyY2hTZXR0aW5ncyBkcml2ZSA9IG5ldyBEcml2ZVNlYXJjaFNldHRpbmdzKCk7Ci0JCQkJZHJpdmUubG9hZChkcml2ZVN0cmluZyk7Ci0JCQkJZHJpdmVzLmFkZChkcml2ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdG9yZSgpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkcml2ZXMuc2l6ZSgpOyBpKyspIHsKLQkJCURyaXZlU2VhcmNoU2V0dGluZ3MgZHJpdmUgPSAoRHJpdmVTZWFyY2hTZXR0aW5ncykgZHJpdmVzLmdldChpKTsKLQkJCWJ1Zi5hcHBlbmQoZHJpdmUuZW5jb2RlKCkpOwotCQkJYnVmLmFwcGVuZChGaWxlLnBhdGhTZXBhcmF0b3IpOwotCQl9Ci0JCXNlYXJjaC5zZXREcml2ZVNldHRpbmdzKGJ1Zi50b1N0cmluZygpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvc2VhcmNoL05ld1BsdWdpbkVudHJ5RGlhbG9nLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvc2VhcmNoL05ld1BsdWdpbkVudHJ5RGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyN2ZkNWUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3NlYXJjaC9OZXdQbHVnaW5FbnRyeURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuc2VhcmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5Xb3JrYmVuY2hIZWxwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkltcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUk7Ci0KLS8qKgotICogQGF1dGhvciBkZWphbgotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGVkaXQgdGhlIHRlbXBsYXRlIHZhcmlhYmxlICJ0eXBlY29tbWVudCI6Ci0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5UZW1wbGF0ZXMuCi0gKiBUbyBlbmFibGUgYW5kIGRpc2FibGUgdGhlIGNyZWF0aW9uIG9mIHR5cGUgY29tbWVudHMgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIE5ld1BsdWdpbkVudHJ5RGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLQlwcml2YXRlIFRleHQgaWRUZXh0OwotCXByaXZhdGUgVGV4dCB2ZXJzaW9uVGV4dDsKLQlwcml2YXRlIEltcG9ydCBpaW1wb3J0OwotCQotCXB1YmxpYyBOZXdQbHVnaW5FbnRyeURpYWxvZyhTaGVsbCBzaGVsbCkgewotCQlzdXBlcihzaGVsbCk7Ci0JfQotCQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJY29udGFpbmVyLnNldExheW91dERhdGEoZ2QpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJY29udGFpbmVyLnNldExheW91dChsYXlvdXQpOwotCQkKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29udGFpbmVyLCBTV1QuTlVMTCk7Ci0JCWxhYmVsLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKCJOZXdQbHVnaW5FbnRyeURpYWxvZy5pZCIpKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJaWRUZXh0ID0gbmV3IFRleHQoY29udGFpbmVyLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWlkVGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJaWRUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCWRpYWxvZ0NoYW5nZWQoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlsYWJlbCA9IG5ldyBMYWJlbChjb250YWluZXIsIFNXVC5OVUxMKTsKLQkJbGFiZWwuc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoIk5ld1BsdWdpbkVudHJ5RGlhbG9nLnZlcnNpb24iKSk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCXZlcnNpb25UZXh0ID0gbmV3IFRleHQoY29udGFpbmVyLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLndpZHRoSGludCA9IDIwMDsKLQkJdmVyc2lvblRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCVdvcmtiZW5jaEhlbHAuc2V0SGVscChjb250YWluZXIsICJvcmcuZWNsaXBzZS51cGRhdGUudWkuTmV3UGx1Z2luRW50cnlEaWFsb2ciKTsKLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgY3JlYXRlKCkgewotCQlzdXBlci5jcmVhdGUoKTsKLQkJZGlhbG9nQ2hhbmdlZCgpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgZGlhbG9nQ2hhbmdlZCgpIHsKLQkJZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpLnNldEVuYWJsZWQoaWRUZXh0LmdldFRleHQoKS5sZW5ndGgoKT4wKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotCQlpaW1wb3J0ID0gbmV3IEltcG9ydCgpOwotCQlpaW1wb3J0LnNldElkZW50aWZpZXIoaWRUZXh0LmdldFRleHQoKSk7Ci0JCWlpbXBvcnQuc2V0VmVyc2lvbih2ZXJzaW9uVGV4dC5nZXRUZXh0KCkpOwotCQlzdXBlci5va1ByZXNzZWQoKTsKLQl9Ci0JcHVibGljIEltcG9ydCBnZXRJbXBvcnQoKSB7Ci0JCXJldHVybiBpaW1wb3J0OwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3NlYXJjaC9QbHVnaW5zU2VhcmNoQ2F0ZWdvcnkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9zZWFyY2gvUGx1Z2luc1NlYXJjaENhdGVnb3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwNDBmMDkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3NlYXJjaC9QbHVnaW5zU2VhcmNoQ2F0ZWdvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5zZWFyY2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWwuSVNpdGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wYXJ0cy5EZWZhdWx0Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbC5Gb3JtV2lkZ2V0RmFjdG9yeTsKLQotcHVibGljIGNsYXNzIFBsdWdpbnNTZWFyY2hDYXRlZ29yeSBleHRlbmRzIFNlYXJjaENhdGVnb3J5IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX05FVyA9ICJQbHVnaW5TZWFyY2hDYXRlZ29yeS5uZXciOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTkVXX1RJVExFID0KLQkJIlBsdWdpblNlYXJjaENhdGVnb3J5Lm5ldy50aXRsZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ERUxFVEUgPSAiUGx1Z2luU2VhcmNoQ2F0ZWdvcnkuZGVsZXRlIjsKLQlwcml2YXRlIEFycmF5TGlzdCBpbXBvcnRzOwotCXByaXZhdGUgVGFibGVWaWV3ZXIgdGFibGVWaWV3ZXI7Ci0JcHJpdmF0ZSBCdXR0b24gbmV3QnV0dG9uOwotCXByaXZhdGUgQnV0dG9uIGRlbGV0ZUJ1dHRvbjsKLQotCWNsYXNzIEltcG9ydENvbnRlbnRQcm92aWRlcgotCQlleHRlbmRzIERlZmF1bHRDb250ZW50UHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB7Ci0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgcGFyZW50KSB7Ci0JCQlpZiAoaW1wb3J0cyA9PSBudWxsKQotCQkJCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCQkJcmV0dXJuIGltcG9ydHMudG9BcnJheSgpOwotCQl9Ci0JfQotCi0JY2xhc3MgSW1wb3J0TGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgewotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iaikgewotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElJbXBvcnQpIHsKLQkJCQlJSW1wb3J0IGlpbXBvcnQgPSAoSUltcG9ydCkgb2JqOwotCQkJCXJldHVybiBpaW1wb3J0LmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpOwotCQkJfQotCQkJcmV0dXJuIG9iai50b1N0cmluZygpOwotCQl9Ci0JfQotCi0JcHVibGljIFBsdWdpbnNTZWFyY2hDYXRlZ29yeSgpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKCkgewotCQlpZiAoaW1wb3J0cyA9PSBudWxsKQotCQkJaW1wb3J0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQl9Ci0JcHVibGljIElTZWFyY2hRdWVyeVtdIGdldFF1ZXJpZXMoKSB7Ci0JCWluaXRpYWxpemUoKTsKLQkJSVNlYXJjaFF1ZXJ5IHF1ZXJ5ID0gbmV3IElTZWFyY2hRdWVyeSgpIHsKLQkJCXB1YmxpYyBJU2l0ZUFkYXB0ZXIgZ2V0U2VhcmNoU2l0ZSgpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcHVibGljIElGZWF0dXJlW10gZ2V0TWF0Y2hpbmdGZWF0dXJlcygKLQkJCQlJU2l0ZSBzaXRlLAotCQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCUFycmF5TGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJSUZlYXR1cmVSZWZlcmVuY2VbXSByZWZzID0gc2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpOwotCQkJCWFkZE1hdGNoaW5nRmVhdHVyZXMocmVmcywgcmVzdWx0LCBtb25pdG9yKTsKLQkJCQlyZXR1cm4gKElGZWF0dXJlW10pIHJlc3VsdC50b0FycmF5KG5ldyBJRmVhdHVyZVtyZXN1bHQuc2l6ZSgpXSk7Ci0JCQl9Ci0JCQlwcml2YXRlIHZvaWQgYWRkTWF0Y2hpbmdGZWF0dXJlcygKLQkJCQlJRmVhdHVyZVJlZmVyZW5jZVtdIHJlZnMsCi0JCQkJQXJyYXlMaXN0IHJlc3VsdCwKLQkJCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQltb25pdG9yLmJlZ2luVGFzaygiIiwgcmVmcy5sZW5ndGggKiAyKTsKLQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmcy5sZW5ndGg7IGkrKykgewotCQkJCQl0cnkgewotCQkJCQkJSUZlYXR1cmUgZmVhdHVyZSA9Ci0JCQkJCQkJcmVmc1tpXS5nZXRGZWF0dXJlKAotCQkJCQkJCQluZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEpKTsKLQkJCQkJCWlmIChtYXRjaGVzKGZlYXR1cmUpKQotCQkJCQkJCXJlc3VsdC5hZGQoZmVhdHVyZSk7Ci0JCQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJCQkJYnJlYWs7Ci0JCQkJCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGluY2x1ZGVkID0KLQkJCQkJCQlmZWF0dXJlLmdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJCQkJCWFkZE1hdGNoaW5nRmVhdHVyZXMoCi0JCQkJCQkJaW5jbHVkZWQsCi0JCQkJCQkJcmVzdWx0LAotCQkJCQkJCW5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMSkpOwotCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJfQotCQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXByaXZhdGUgYm9vbGVhbiBtYXRjaGVzKElGZWF0dXJlIGZlYXR1cmUpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGltcG9ydHMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJSUltcG9ydCBpaW1wb3J0ID0gKElJbXBvcnQpIGltcG9ydHMuZ2V0KGkpOwotCQkJCQlpZiAoIWNvbnRhaW5zKGZlYXR1cmUsIGlpbXBvcnQpKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfTsKLQkJcmV0dXJuIG5ldyBJU2VhcmNoUXVlcnlbXSB7IHF1ZXJ5IH07Ci0JfQotCXByaXZhdGUgYm9vbGVhbiBjb250YWlucyhJRmVhdHVyZSBmZWF0dXJlLCBJSW1wb3J0IGlpbXBvcnQpIHsKLQkJSVBsdWdpbkVudHJ5W10gZW50cmllcyA9IGZlYXR1cmUuZ2V0UGx1Z2luRW50cmllcygpOwotCQlWZXJzaW9uZWRJZGVudGlmaWVyIGltcG9ydElkID0gaWltcG9ydC5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7Ci0JCVBsdWdpblZlcnNpb25JZGVudGlmaWVyIGltcG9ydFZlcnNpb24gPSBpbXBvcnRJZC5nZXRWZXJzaW9uKCk7Ci0JCWJvb2xlYW4gaWdub3JlVmVyc2lvbiA9Ci0JCQkoaW1wb3J0VmVyc2lvbi5nZXRNYWpvckNvbXBvbmVudCgpID09IDAKLQkJCQkmJiBpbXBvcnRWZXJzaW9uLmdldE1pbm9yQ29tcG9uZW50KCkgPT0gMAotCQkJCSYmIGltcG9ydFZlcnNpb24uZ2V0U2VydmljZUNvbXBvbmVudCgpID09IDApOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlQbHVnaW5FbnRyeSBlbnRyeSA9IGVudHJpZXNbaV07Ci0JCQlWZXJzaW9uZWRJZGVudGlmaWVyIGVudHJ5SWQgPSBlbnRyeS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7Ci0JCQlpZiAoaWdub3JlVmVyc2lvbikgewotCQkJCWlmIChlbnRyeUlkLmdldElkZW50aWZpZXIoKS5lcXVhbHMoaW1wb3J0SWQuZ2V0SWRlbnRpZmllcigpKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGVsc2UgaWYgKGVudHJ5SWQuZXF1YWxzKGltcG9ydElkKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDdXJyZW50U2VhcmNoKCkgewotCQlyZXR1cm4gZW5jb2RlSW1wb3J0cyhpbXBvcnRzKTsKLQl9Ci0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50LCBGb3JtV2lkZ2V0RmFjdG9yeSBmYWN0b3J5KSB7Ci0JCUNvbXBvc2l0ZSBjb250YWluZXIgPSBmYWN0b3J5LmNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMjsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDI7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXQobGF5b3V0KTsKLQkJdGFibGVWaWV3ZXIgPQotCQkJbmV3IFRhYmxlVmlld2VyKGNvbnRhaW5lciwgU1dULk1VTFRJIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQkJdGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBJbXBvcnRDb250ZW50UHJvdmlkZXIoKSk7Ci0JCXRhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEltcG9ydExhYmVsUHJvdmlkZXIoKSk7Ci0JCXRhYmxlVmlld2VyCi0JCQkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZSkgewotCQkJCVBsdWdpbnNTZWFyY2hDYXRlZ29yeS50aGlzLnNlbGVjdGlvbkNoYW5nZWQoCi0JCQkJCShJU3RydWN0dXJlZFNlbGVjdGlvbikgZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCQl9Ci0JCX0pOwotCQl0YWJsZVZpZXdlci5zZXRJbnB1dCh0aGlzKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZ2QuaGVpZ2h0SGludCA9IDEwMDsKLQkJZ2QudmVydGljYWxTcGFuID0gMjsKLQkJdGFibGVWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZ2QpOwotCQluZXdCdXR0b24gPQotCQkJZmFjdG9yeS5jcmVhdGVCdXR0b24oCi0JCQkJY29udGFpbmVyLAotCQkJCVVwZGF0ZVVJLmdldFN0cmluZyhLRVlfTkVXKSwKLQkJCQlTV1QuUFVTSCk7Ci0JCW5ld0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQloYW5kbGVOZXcoKTsKLQkJCX0KLQkJfSk7Ci0JCWdkID0KLQkJCW5ldyBHcmlkRGF0YSgKLQkJCQlHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwKLQkJCQkJfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpOwotCQluZXdCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWRlbGV0ZUJ1dHRvbiA9Ci0JCQlmYWN0b3J5LmNyZWF0ZUJ1dHRvbigKLQkJCQljb250YWluZXIsCi0JCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9ERUxFVEUpLAotCQkJCVNXVC5QVVNIKTsKLQkJZGVsZXRlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWhhbmRsZURlbGV0ZSgpOwotCQkJfQotCQl9KTsKLQkJZ2QgPQotCQkJbmV3IEdyaWREYXRhKAotCQkJCUdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTAotCQkJCQl8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7Ci0JCWRlbGV0ZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJZGVsZXRlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7Ci0JCW5ld0J1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJZmFjdG9yeS5wYWludEJvcmRlcnNGb3IoY29udGFpbmVyKTsKLQkJc2V0Q29udHJvbChjb250YWluZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVOZXcoKSB7Ci0JCU5ld1BsdWdpbkVudHJ5RGlhbG9nIGRpYWxvZyA9Ci0JCQluZXcgTmV3UGx1Z2luRW50cnlEaWFsb2codGFibGVWaWV3ZXIuZ2V0Q29udHJvbCgpLmdldFNoZWxsKCkpOwotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWRpYWxvZy5nZXRTaGVsbCgpLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9ORVdfVElUTEUpKTsKLQkJZGlhbG9nLmdldFNoZWxsKCkucGFjaygpOwotCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBOZXdQbHVnaW5FbnRyeURpYWxvZy5PSykgewotCQkJaWYgKGltcG9ydHMgPT0gbnVsbCkKLQkJCQlpbXBvcnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJaW1wb3J0cy5hZGQoZGlhbG9nLmdldEltcG9ydCgpKTsKLQkJCXRhYmxlVmlld2VyLnJlZnJlc2goKTsKLQkJfQotCX0KLQlwcml2YXRlIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJZGVsZXRlQnV0dG9uLnNldEVuYWJsZWQoc2VsZWN0aW9uLmlzRW1wdHkoKSA9PSBmYWxzZSk7Ci0JfQotCXByaXZhdGUgdm9pZCBoYW5kbGVEZWxldGUoKSB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9Ci0JCQkoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlpbXBvcnRzLnJlbW92ZShpdGVyLm5leHQoKSk7Ci0JCX0KLQkJdGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCX0KLQlwdWJsaWMgdm9pZCBsb2FkKE1hcCBtYXAsIGJvb2xlYW4gZWRpdGFibGUpIHsKLQkJU3RyaW5nIGtleSA9ICJpbXBvcnRzIjsKLQkJU3RyaW5nIHZhbHVlID0gKFN0cmluZykgbWFwLmdldChrZXkpOwotCQlpbXBvcnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAodmFsdWUgIT0gbnVsbCkKLQkJCWRlY29kZUltcG9ydHModmFsdWUsIGltcG9ydHMpOwotCQl0YWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JCW5ld0J1dHRvbi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJZGVsZXRlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCX0KLQlwdWJsaWMgdm9pZCBzdG9yZShNYXAgbWFwKSB7Ci0JCVN0cmluZyB2YWx1ZSA9IGVuY29kZUltcG9ydHMoaW1wb3J0cyk7Ci0JCW1hcC5wdXQoImltcG9ydHMiLCB2YWx1ZSk7Ci0JfQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVuY29kZUltcG9ydHMoQXJyYXlMaXN0IGltcG9ydHMpIHsKLQkJaWYgKGltcG9ydHMgPT0gbnVsbCkKLQkJCXJldHVybiAiIjsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbXBvcnRzLnNpemUoKTsgaSsrKSB7Ci0JCQlJSW1wb3J0IGlpbXBvcnQgPSAoSUltcG9ydCkgaW1wb3J0cy5nZXQoaSk7Ci0JCQlTdHJpbmcgZW50cnkgPSBpaW1wb3J0LmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpOwotCQkJaWYgKGkgPiAwKQotCQkJCWJ1Zi5hcHBlbmQoIiwiKTsKLQkJCWJ1Zi5hcHBlbmQoZW50cnkpOwotCQl9Ci0JCXJldHVybiBidWYudG9TdHJpbmcoKTsKLQl9Ci0JcHVibGljIHN0YXRpYyB2b2lkIGRlY29kZUltcG9ydHMoU3RyaW5nIHRleHQsIEFycmF5TGlzdCByZXN1bHQpIHsKLQkJU3RyaW5nVG9rZW5pemVyIHN0b2sgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHRleHQsICIsIik7Ci0JCXdoaWxlIChzdG9rLmhhc01vcmVUb2tlbnMoKSkgewotCQkJU3RyaW5nIHRva2VuID0gc3Rvay5uZXh0VG9rZW4oKTsKLQkJCWludCB1bG9jID0gdG9rZW4ubGFzdEluZGV4T2YoJ18nKTsKLQkJCVN0cmluZyBpZCA9IHRva2VuLnN1YnN0cmluZygwLCB1bG9jKTsKLQkJCVN0cmluZyB2ZXJzaW9uID0gdG9rZW4uc3Vic3RyaW5nKHVsb2MgKyAxKTsKLQkJCUltcG9ydCBpaW1wb3J0ID0gbmV3IEltcG9ydCgpOwotCQkJaWltcG9ydC5zZXRJZGVudGlmaWVyKGlkKTsKLQkJCWlpbXBvcnQuc2V0VmVyc2lvbih2ZXJzaW9uKTsKLQkJCXJlc3VsdC5hZGQoaWltcG9ydCk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3NlYXJjaC9TZWFyY2hDYXRlZ29yeS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3NlYXJjaC9TZWFyY2hDYXRlZ29yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmYzYzU1Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9zZWFyY2gvU2VhcmNoQ2F0ZWdvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnNlYXJjaDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2VhcmNoQ2F0ZWdvcnkgaW1wbGVtZW50cyBJU2VhcmNoQ2F0ZWdvcnkgewotCXByaXZhdGUgQ29udHJvbCBjb250cm9sOwotCXByaXZhdGUgU3RyaW5nIGlkOwotCQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIGlkKSB7Ci0JCXRoaXMuaWQgPSBpZDsKLQl9Ci0JcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpIHsKLQkJcmV0dXJuIGNvbnRyb2w7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldENvbnRyb2woQ29udHJvbCBjb250cm9sKSB7Ci0JCXRoaXMuY29udHJvbCA9IGNvbnRyb2w7Ci0JfQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE1hcCBtYXApIHsKLQkJT2JqZWN0IG9iaiA9IG1hcC5nZXQoa2V5KTsKLQkJaWYgKG9iaiE9bnVsbCkgcmV0dXJuIG9iai50b1N0cmluZygpOwotCQlyZXR1cm4gIiI7Ci0JfQotCXByb3RlY3RlZCBib29sZWFuIGdldEJvb2xlYW4oU3RyaW5nIGtleSwgTWFwIG1hcCkgewotCQlyZXR1cm4gZ2V0U3RyaW5nKGtleSwgbWFwKS5lcXVhbHMoInRydWUiKTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvc2VhcmNoL1NlYXJjaENhdGVnb3J5RGVzY3JpcHRvci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3NlYXJjaC9TZWFyY2hDYXRlZ29yeURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE3ZmE2Zi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvc2VhcmNoL1NlYXJjaENhdGVnb3J5RGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuc2VhcmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotcHVibGljIGNsYXNzIFNlYXJjaENhdGVnb3J5RGVzY3JpcHRvciB7Ci0JcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnOwotCXByaXZhdGUgSVNlYXJjaENhdGVnb3J5IGNhdGVnb3J5OwotCXB1YmxpYyBTZWFyY2hDYXRlZ29yeURlc2NyaXB0b3IoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZykgewotCQl0aGlzLmNvbmZpZyA9IGNvbmZpZzsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGNvbmZpZy5nZXRBdHRyaWJ1dGUoImlkIik7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIGNvbmZpZy5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsKLQl9Ci0JCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoKSB7Ci0JCVN0cmluZyBpbWFnZU5hbWUgPSBjb25maWcuZ2V0QXR0cmlidXRlKCJpY29uIik7Ci0JCWlmIChpbWFnZU5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gVXBkYXRlVUlJbWFnZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbigKLQkJCWNvbmZpZy5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXREZWNsYXJpbmdQbHVnaW5EZXNjcmlwdG9yKCksCi0JCQlpbWFnZU5hbWUpOwotCX0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCVN0cmluZyBpbWFnZU5hbWUgPSBjb25maWcuZ2V0QXR0cmlidXRlKCJpY29uIik7Ci0JCWlmIChpbWFnZU5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gVXBkYXRlVUlJbWFnZXMuZ2V0SW1hZ2VGcm9tUGx1Z2luKAotCQkJY29uZmlnLmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldERlY2xhcmluZ1BsdWdpbkRlc2NyaXB0b3IoKSwKLQkJCWltYWdlTmFtZSk7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudCBjaGlsZHJlbiBbXSA9IGNvbmZpZy5nZXRDaGlsZHJlbigiZGVzY3JpcHRpb24iKTsKLQkJaWYgKGNoaWxkcmVuLmxlbmd0aD09MSkgewotCQkJcmV0dXJuIGNoaWxkcmVuWzBdLmdldFZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuICI8Zm9ybT48L2Zvcm0+IjsKLQl9Ci0JcHVibGljIElTZWFyY2hDYXRlZ29yeSBjcmVhdGVDYXRlZ29yeSgpIHsKLQkJaWYgKGNhdGVnb3J5IT1udWxsKSByZXR1cm4gY2F0ZWdvcnk7Ci0JCXRyeSB7Ci0JCQlPYmplY3Qgb2JqID0gY29uZmlnLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgSVNlYXJjaENhdGVnb3J5KSB7Ci0JCQkJSVNlYXJjaENhdGVnb3J5IGNhdGVnb3J5ID0gKElTZWFyY2hDYXRlZ29yeSlvYmo7Ci0JCQkJY2F0ZWdvcnkuc2V0SWQoZ2V0SWQoKSk7Ci0JCQkJdGhpcy5jYXRlZ29yeSA9IGNhdGVnb3J5OwotCQkJCXJldHVybiBjYXRlZ29yeTsKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlVcGRhdGVVSS5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9zZWFyY2gvU2VhcmNoQ2F0ZWdvcnlSZWdpc3RyeVJlYWRlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3NlYXJjaC9TZWFyY2hDYXRlZ29yeVJlZ2lzdHJ5UmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3ZWQzNWIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3NlYXJjaC9TZWFyY2hDYXRlZ29yeVJlZ2lzdHJ5UmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5zZWFyY2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotCi1wdWJsaWMgY2xhc3MgU2VhcmNoQ2F0ZWdvcnlSZWdpc3RyeVJlYWRlciB7Ci0JcHJpdmF0ZSBBcnJheUxpc3QgZGVzY3JpcHRvcnM7Ci0KLQlzdGF0aWMgU2VhcmNoQ2F0ZWdvcnlSZWdpc3RyeVJlYWRlciBpbnN0YW5jZTsKLQotCVNlYXJjaENhdGVnb3J5UmVnaXN0cnlSZWFkZXIoKSB7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTZWFyY2hDYXRlZ29yeVJlZ2lzdHJ5UmVhZGVyIGdldERlZmF1bHQoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgU2VhcmNoQ2F0ZWdvcnlSZWdpc3RyeVJlYWRlcigpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JcHVibGljIFNlYXJjaENhdGVnb3J5RGVzY3JpcHRvcltdIGdldENhdGVnb3J5RGVzY3JpcHRvcnMoKSB7Ci0JCWlmIChkZXNjcmlwdG9ycyA9PSBudWxsKQotCQkJbG9hZCgpOwotCQlyZXR1cm4gKFNlYXJjaENhdGVnb3J5RGVzY3JpcHRvcltdKSBkZXNjcmlwdG9ycy50b0FycmF5KAotCQkJbmV3IFNlYXJjaENhdGVnb3J5RGVzY3JpcHRvcltkZXNjcmlwdG9ycy5zaXplKCldKTsKLQl9Ci0KLQlwdWJsaWMgU2VhcmNoQ2F0ZWdvcnlEZXNjcmlwdG9yIGdldERlc2NyaXB0b3IoU3RyaW5nIGNhdGVnb3J5SWQpIHsKLQkJaWYgKGRlc2NyaXB0b3JzID09IG51bGwpCi0JCQlsb2FkKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcnMuc2l6ZSgpOyBpKyspIHsKLQkJCVNlYXJjaENhdGVnb3J5RGVzY3JpcHRvciBkZXNjID0gKFNlYXJjaENhdGVnb3J5RGVzY3JpcHRvcikgZGVzY3JpcHRvcnMuZ2V0KGkpOwotCQkJaWYgKGRlc2MuZ2V0SWQoKS5lcXVhbHMoY2F0ZWdvcnlJZCkpCi0JCQkJcmV0dXJuIGRlc2M7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxvYWQoKSB7Ci0JCWRlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJUGx1Z2luUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRQbHVnaW5SZWdpc3RyeSgpOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9Ci0JCQlyZWdpc3RyeS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoIm9yZy5lY2xpcHNlLnVwZGF0ZS51aS5zZWFyY2hDYXRlZ29yeSIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCA9IGVsZW1lbnRzW2ldOwotCQkJaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscygic2VhcmNoIikpCi0JCQkJZGVzY3JpcHRvcnMuYWRkKG5ldyBTZWFyY2hDYXRlZ29yeURlc2NyaXB0b3IoZWxlbWVudCkpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9zZWFyY2gvU2VhcmNoT2JqZWN0LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvc2VhcmNoL1NlYXJjaE9iamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjNlMTY5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9zZWFyY2gvU2VhcmNoT2JqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuc2VhcmNoOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5VcGRhdGVNYW5hZ2VyVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbC4qOwotCi1wdWJsaWMgY2xhc3MgU2VhcmNoT2JqZWN0IGV4dGVuZHMgTmFtZWRNb2RlbE9iamVjdCB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUF9SRUZSRVNIID0gInBfcmVmcmVzaCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX0NBVEVHT1JZID0gInBfY2F0ZWdvcnkiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX05BTUUgPSAiU2VhcmNoLm5hbWUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9CRUdJTiA9ICJTZWFyY2guYmVnaW4iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9NWV9DT01QVVRFUiA9ICJTZWFyY2gubXlDb21wdXRlciI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPTlRBQ1RJTkcgPSAiU2VhcmNoLmNvbnRhY3RpbmciOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DSEVDS0lORyA9ICJTZWFyY2guY2hlY2tpbmciOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU19NWV9DT01QVVRFUiA9ICJzZWFyY2hNeUNvbXB1dGVyIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNfQk9PS01BUktTID0gInNlYXJjaEJvb2ttYXJrcyI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTX0RJU0NPVkVSWSA9ICJzZWFyY2hEaXNjb3ZlcnkiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU19GSUxURVIgPSAic2VhcmNoRmlsdGVyIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNfRFJJVkVTID0gInNlYXJjaERyaXZlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXRyYW5zaWVudCBwcml2YXRlIFZlY3RvciByZXN1bHQ7Ci0JdHJhbnNpZW50IHByaXZhdGUgYm9vbGVhbiBzZWFyY2hJblByb2dyZXNzOwotCXByaXZhdGUgQmFja2dyb3VuZFByb2dyZXNzTW9uaXRvciBiYWNrZ3JvdW5kUHJvZ3Jlc3M7Ci0JdHJhbnNpZW50IHByaXZhdGUgQmFja2dyb3VuZFRocmVhZCBzZWFyY2hUaHJlYWQ7Ci0JdHJhbnNpZW50IHByaXZhdGUgU2l0ZUJvb2ttYXJrW10gbXlDb21wdXRlclNpdGVzID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBjYXRlZ29yeUlkOwotCXByaXZhdGUgYm9vbGVhbiBjYXRlZ29yeUZpeGVkOwotCXByaXZhdGUgSGFzaHRhYmxlIHNldHRpbmdzID0gbmV3IEhhc2h0YWJsZSgpOwotCXByaXZhdGUgYm9vbGVhbiBwZXJzaXN0ZW50ID0gdHJ1ZTsKLQlwcml2YXRlIGJvb2xlYW4gaW5zdGFudFNlYXJjaCA9IGZhbHNlOwotCi0JY2xhc3MgU2VhcmNoQWRhcHRlciBleHRlbmRzIE1vbml0b3JBZGFwdGVyIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKLQkJcHVibGljIHZvaWQgZG9uZSgpIHsKLQkJCXNlYXJjaEluUHJvZ3Jlc3MgPSBmYWxzZTsKLQkJfQotCX0KLQotCXB1YmxpYyBTZWFyY2hPYmplY3QoKSB7Ci0JCXRoaXMoIiIsIG51bGwsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQlwdWJsaWMgU2VhcmNoT2JqZWN0KFN0cmluZyBuYW1lLCBTZWFyY2hDYXRlZ29yeURlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQl0aGlzKG5hbWUsIGRlc2NyaXB0b3IsIGZhbHNlKTsKLQl9Ci0JcHVibGljIFNlYXJjaE9iamVjdCgKLQkJU3RyaW5nIG5hbWUsCi0JCVNlYXJjaENhdGVnb3J5RGVzY3JpcHRvciBkZXNjcmlwdG9yLAotCQlib29sZWFuIGNhdGVnb3J5Rml4ZWQpIHsKLQkJc3VwZXIobmFtZSk7Ci0JCXRoaXMuY2F0ZWdvcnlJZCA9IGRlc2NyaXB0b3IuZ2V0SWQoKTsKLQkJdGhpcy5jYXRlZ29yeUZpeGVkID0gY2F0ZWdvcnlGaXhlZDsKLQkJYmFja2dyb3VuZFByb2dyZXNzID0gbmV3IEJhY2tncm91bmRQcm9ncmVzc01vbml0b3IoKTsKLQkJYmFja2dyb3VuZFByb2dyZXNzLmFkZFByb2dyZXNzTW9uaXRvcihuZXcgU2VhcmNoQWRhcHRlcigpKTsKLQkJcmVzdWx0ID0gbmV3IFZlY3RvcigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQ2F0ZWdvcnlGaXhlZCgpIHsKLQkJcmV0dXJuIGNhdGVnb3J5Rml4ZWQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNQZXJzaXN0ZW50KCkgewotCQlyZXR1cm4gcGVyc2lzdGVudDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQZXJzaXN0ZW50KGJvb2xlYW4gdmFsdWUpIHsKLQkJdGhpcy5wZXJzaXN0ZW50ID0gdmFsdWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNJbnN0YW50U2VhcmNoKCkgewotCQlyZXR1cm4gaW5zdGFudFNlYXJjaDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbnN0YW50U2VhcmNoKGJvb2xlYW4gdmFsdWUpIHsKLQkJdGhpcy5pbnN0YW50U2VhcmNoID0gdmFsdWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDYXRlZ29yeUlkKCkgewotCQlyZXR1cm4gY2F0ZWdvcnlJZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDYXRlZ29yeUlkKFN0cmluZyBpZCkgewotCQlpZiAoY2F0ZWdvcnlJZCAhPSBudWxsICYmICFjYXRlZ29yeUlkLmVxdWFscyhpZCkpIHsKLQkJCXNldHRpbmdzLmNsZWFyKCk7Ci0JCX0KLQkJdGhpcy5jYXRlZ29yeUlkID0gaWQ7Ci0JCW5vdGlmeU9iamVjdENoYW5nZWQoUF9DQVRFR09SWSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGlzcGxheShEaXNwbGF5IGRpc3BsYXkpIHsKLQkJYmFja2dyb3VuZFByb2dyZXNzLnNldERpc3BsYXkoZGlzcGxheSk7Ci0JfQotCi0JcHVibGljIEhhc2h0YWJsZSBnZXRTZXR0aW5ncygpIHsKLQkJcmV0dXJuIHNldHRpbmdzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldFNlYXJjaE15Q29tcHV0ZXIoKSB7Ci0JCXJldHVybiBnZXRCb29sZWFuVmFsdWUoU19NWV9DT01QVVRFUik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2VhcmNoTXlDb21wdXRlcihib29sZWFuIHZhbHVlKSB7Ci0JCXNldHRpbmdzLnB1dChTX01ZX0NPTVBVVEVSLCB2YWx1ZSA/ICJ0cnVlIiA6ICJmYWxzZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTZWFyY2hCb29rbWFya3MoYm9vbGVhbiB2YWx1ZSkgewotCQlzZXRCb29sZWFuVmFsdWUoU19CT09LTUFSS1MsIHZhbHVlKTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gZ2V0U2VhcmNoQm9va21hcmtzKCkgewotCQlyZXR1cm4gZ2V0Qm9vbGVhblZhbHVlKFNfQk9PS01BUktTKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTZWFyY2hEaXNjb3ZlcnkoYm9vbGVhbiB2YWx1ZSkgewotCQlzZXRCb29sZWFuVmFsdWUoU19ESVNDT1ZFUlksIHZhbHVlKTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gZ2V0U2VhcmNoRGlzY292ZXJ5KCkgewotCQlyZXR1cm4gZ2V0Qm9vbGVhblZhbHVlKFNfRElTQ09WRVJZKTsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXREcml2ZVNldHRpbmdzKCkgewotCQlyZXR1cm4gKFN0cmluZykgc2V0dGluZ3MuZ2V0KFNfRFJJVkVTKTsKLQl9Ci0JcHVibGljIHZvaWQgc2V0RHJpdmVTZXR0aW5ncyhTdHJpbmcgZHJpdmVzKSB7Ci0JCXNldHRpbmdzLnB1dChTX0RSSVZFUywgZHJpdmVzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXJFbnZpcm9ubWVudChib29sZWFuIHZhbHVlKSB7Ci0JCXNldEJvb2xlYW5WYWx1ZShTX0ZJTFRFUiwgIXZhbHVlKTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gZ2V0RmlsdGVyRW52aXJvbm1lbnQoKSB7Ci0JCXJldHVybiAhZ2V0Qm9vbGVhblZhbHVlKFNfRklMVEVSKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZ2V0Qm9vbGVhblZhbHVlKFN0cmluZyBrZXkpIHsKLQkJU3RyaW5nIHZhbHVlID0gKFN0cmluZykgc2V0dGluZ3MuZ2V0KGtleSk7Ci0JCWlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmVxdWFscygidHJ1ZSIpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQlwcml2YXRlIHZvaWQgc2V0Qm9vbGVhblZhbHVlKFN0cmluZyBrZXksIGJvb2xlYW4gdmFsdWUpIHsKLQkJc2V0dGluZ3MucHV0KGtleSwgdmFsdWUgPyAidHJ1ZSIgOiAiZmFsc2UiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogQHNlZSBJV29ya2JlbmNoQWRhcHRlciNnZXRDaGlsZHJlbihPYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnQpIHsKLQkJcmV0dXJuIHJlc3VsdC50b0FycmF5KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiByZXN1bHQuc2l6ZSgpID4gMDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWNvbm5lY3QoKSB7Ci0JCUlQcm9ncmVzc01vbml0b3IgW10gbW9uaXRvcnMgPSBiYWNrZ3JvdW5kUHJvZ3Jlc3MuZ2V0UHJvZ3Jlc3NNb25pdG9ycygpOwotCQlmb3IgKGludCBpPTA7IGk8bW9uaXRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciA9IG1vbml0b3JzW2ldOwotCQkJaWYgKG1vbml0b3IgaW5zdGFuY2VvZiBJU2VhcmNoT2JqZWN0QWRhcHRlcikgewotCQkJCSgoSVNlYXJjaE9iamVjdEFkYXB0ZXIpbW9uaXRvcikuc2V0U2VhcmNoT2JqZWN0KHRoaXMpOwotCQkJfQotCQl9Ci0JCXJlc3VsdCA9IG5ldyBWZWN0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhdHRhY2hQcm9ncmVzc01vbml0b3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWJhY2tncm91bmRQcm9ncmVzcy5hZGRQcm9ncmVzc01vbml0b3IobW9uaXRvcik7Ci0JfQotCXB1YmxpYyB2b2lkIGRldGFjaFByb2dyZXNzTW9uaXRvcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJYmFja2dyb3VuZFByb2dyZXNzLnJlbW92ZVByb2dyZXNzTW9uaXRvcihtb25pdG9yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGFydFNlYXJjaChEaXNwbGF5IGRpc3BsYXksIElTZWFyY2hRdWVyeVtdIHF1ZXJpZXMpCi0JCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCWlmIChzZWFyY2hJblByb2dyZXNzKQotCQkJcmV0dXJuOwotCQliYWNrZ3JvdW5kUHJvZ3Jlc3Muc2V0RGlzcGxheShkaXNwbGF5KTsKLQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wZXJhdGlvbiA9IGdldFNlYXJjaE9wZXJhdGlvbihkaXNwbGF5LCBxdWVyaWVzKTsKLQkJc2VhcmNoVGhyZWFkID0KLQkJCW5ldyBCYWNrZ3JvdW5kVGhyZWFkKG9wZXJhdGlvbiwgYmFja2dyb3VuZFByb2dyZXNzLCBkaXNwbGF5KTsKLQkJc2VhcmNoSW5Qcm9ncmVzcyA9IHRydWU7Ci0JCXNlYXJjaFRocmVhZC5zdGFydCgpOwotCQlUaHJvd2FibGUgdGhyb3dhYmxlID0gc2VhcmNoVGhyZWFkLmdldFRocm93YWJsZSgpOwotCQlpZiAodGhyb3dhYmxlICE9IG51bGwpIHsKLQkJCVVwZGF0ZVVJLmxvZ0V4Y2VwdGlvbih0aHJvd2FibGUpOwotCQkJaWYgKHRocm93YWJsZSBpbnN0YW5jZW9mIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pIHsKLQkJCQl0aHJvdyAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbikgdGhyb3dhYmxlOwotCQkJfSBlbHNlIGlmICh0aHJvd2FibGUgaW5zdGFuY2VvZiBJbnRlcnJ1cHRlZEV4Y2VwdGlvbikgewotCQkJCXRocm93IChJbnRlcnJ1cHRlZEV4Y2VwdGlvbikgdGhyb3dhYmxlOwotCQkJfSBlbHNlIGlmICh0aHJvd2FibGUgaW5zdGFuY2VvZiBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbikgewotCQkJCS8vIFNlZSAxR0FOM0w1OiBJVFBVSTpXSU4yMDAwIC0gTW9kYWxDb250ZXh0IGNvbnZlcnRzIE9wZXJhdGlvbkNhbmNlbEV4Y2VwdGlvbiBpbnRvIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24KLQkJCQl0aHJvdyBuZXcgSW50ZXJydXB0ZWRFeGNlcHRpb24odGhyb3dhYmxlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9IGVsc2UgewotCQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKHRocm93YWJsZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1NlYXJjaEluUHJvZ3Jlc3MoKSB7Ci0JCXJldHVybiBzZWFyY2hJblByb2dyZXNzOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3BTZWFyY2goKSB7Ci0JCWlmICghc2VhcmNoSW5Qcm9ncmVzcyB8fCBzZWFyY2hUaHJlYWQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJYmFja2dyb3VuZFByb2dyZXNzLnNldENhbmNlbGVkKHRydWUpOwotCX0KLQotCXB1YmxpYyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgZ2V0U2VhcmNoT3BlcmF0aW9uKAotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXksCi0JCWZpbmFsIElTZWFyY2hRdWVyeVtdIHF1ZXJpZXMpIHsKLQkJcmV0dXJuIG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJCQl0cnkgewotCQkJCQlkb1NlYXJjaChkaXNwbGF5LCBxdWVyaWVzLCBtb25pdG9yKTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oZSk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCBkb1NlYXJjaCgKLQkJRGlzcGxheSBkaXNwbGF5LAotCQlJU2VhcmNoUXVlcnlbXSBxdWVyaWVzLAotCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmVzdWx0LmNsZWFyKCk7Ci0JCWFzeW5jRmlyZU9iamVjdENoYW5nZWQoZGlzcGxheSwgdGhpcywgUF9SRUZSRVNIKTsKLQotCQlBcnJheUxpc3QgY2FuZGlkYXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQltb25pdG9yLmJlZ2luVGFzaygKLQkJCVVwZGF0ZVVJLmdldFN0cmluZyhLRVlfQkVHSU4pLAotCQkJSVByb2dyZXNzTW9uaXRvci5VTktOT1dOKTsKLQotCQlpZiAoZ2V0U2VhcmNoTXlDb21wdXRlcigpKSB7Ci0JCQltb25pdG9yLnNldFRhc2tOYW1lKAotCQkJCVVwZGF0ZVVJLmdldFN0cmluZyhLRVlfTVlfQ09NUFVURVIpKTsKLQkJCWluaXRpYWxpemVNeUNvbXB1dGVyU2l0ZXMobW9uaXRvcik7Ci0JCX0KLQkJQXJyYXlMaXN0IHN0YXR1c0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmICghbW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCWNvbXB1dGVTZWFyY2hTb3VyY2VzKGNhbmRpZGF0ZXMpOwotCQkJaW50IG50YXNrcyA9IHF1ZXJpZXMubGVuZ3RoICogKDEgKyBjYW5kaWRhdGVzLnNpemUoKSk7Ci0KLQkJCW1vbml0b3IuYmVnaW5UYXNrKAotCQkJCVVwZGF0ZVVJLmdldFN0cmluZyhLRVlfQkVHSU4pLAotCQkJCW50YXNrcyk7Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcXVlcmllcy5sZW5ndGg7IGkrKykgewotCQkJCUlTZWFyY2hRdWVyeSBxdWVyeSA9IHF1ZXJpZXNbaV07Ci0JCQkJSVNpdGVBZGFwdGVyIHNpdGUgPSBxdWVyeS5nZXRTZWFyY2hTaXRlKCk7Ci0JCQkJaWYgKHNpdGUgIT0gbnVsbCkgewotCQkJCQlTdWJQcm9ncmVzc01vbml0b3Igc3ViTW9uaXRvciA9Ci0JCQkJCQluZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEpOwotCQkJCQlVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX0NIRUNLSU5HKTsKLQkJCQkJSVN0YXR1cyBzdGF0dXMgPQotCQkJCQkJc2VhcmNoT25lU2l0ZShkaXNwbGF5LCBzaXRlLCBxdWVyeSwgc3ViTW9uaXRvcik7Ci0JCQkJCWlmIChzdGF0dXMgIT0gbnVsbCkKLQkJCQkJCXN0YXR1c0xpc3QuYWRkKHN0YXR1cyk7Ci0JCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNhbmRpZGF0ZXMuc2l6ZSgpOyBqKyspIHsKLQkJCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQlPYmplY3Qgc291cmNlID0gY2FuZGlkYXRlcy5nZXQoaik7Ci0JCQkJCVN1YlByb2dyZXNzTW9uaXRvciBzdWJNb25pdG9yID0KLQkJCQkJCW5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMSk7Ci0JCQkJCUlTdGF0dXMgc3RhdHVzID0KLQkJCQkJCXNlYXJjaE9uZVNpdGUoCi0JCQkJCQkJZGlzcGxheSwKLQkJCQkJCQkoSVNpdGVBZGFwdGVyKSBzb3VyY2UsCi0JCQkJCQkJcXVlcnksCi0JCQkJCQkJc3ViTW9uaXRvcik7Ci0JCQkJCWlmIChzdGF0dXMgIT0gbnVsbCkKLQkJCQkJCXN0YXR1c0xpc3QuYWRkKHN0YXR1cyk7Ci0JCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCX0KLQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXNlYXJjaEluUHJvZ3Jlc3MgPSBmYWxzZTsKLQkJbW9uaXRvci5kb25lKCk7Ci0JCWFzeW5jRmlyZU9iamVjdENoYW5nZWQoZGlzcGxheSwgdGhpcywgUF9SRUZSRVNIKTsKLQkJaWYgKHN0YXR1c0xpc3Quc2l6ZSgpID4gMCkgewotCQkJSVN0YXR1c1tdIGNoaWxkcmVuID0KLQkJCQkoSVN0YXR1c1tdKSBzdGF0dXNMaXN0LnRvQXJyYXkobmV3IElTdGF0dXNbc3RhdHVzTGlzdC5zaXplKCldKTsKLQkJCQlNdWx0aVN0YXR1cyBtdWx0aVN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cyhVcGRhdGVVSS5nZXRQbHVnaW5JZCgpLCBJU2l0ZS5TSVRFX0FDQ0VTU19FWENFUFRJT04sIGNoaWxkcmVuLCBVcGRhdGVVSS5nZXRTdHJpbmcoIlNlYXJjaC5uZXR3b3JrUHJvYmxlbXMiKSwgLy8kTk9OLU5MUy0xJAotCW51bGwpOwotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obXVsdGlTdGF0dXMpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgY29tcHV0ZVNlYXJjaFNvdXJjZXMoQXJyYXlMaXN0IHNvdXJjZXMpIHsKLQkJYWRkTXlDb21wdXRlclNpdGVzKHNvdXJjZXMpOwotCQlhZGREaXNjb3ZlcnlTaXRlcyhzb3VyY2VzKTsKLQkJYWRkQm9va21hcmtzKHNvdXJjZXMpOwotCX0KLQotCXByaXZhdGUgSVN0YXR1cyBzZWFyY2hPbmVTaXRlKAotCQlEaXNwbGF5IGRpc3BsYXksCi0JCUlTaXRlQWRhcHRlciBzaXRlQWRhcHRlciwKLQkJSVNlYXJjaFF1ZXJ5IHF1ZXJ5LAotCQlTdWJQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTdHJpbmcgdGV4dCA9Ci0JCQlVcGRhdGVVSS5nZXRGb3JtYXR0ZWRNZXNzYWdlKEtFWV9DT05UQUNUSU5HLCBzaXRlQWRhcHRlci5nZXRMYWJlbCgpKTsKLQkJbW9uaXRvci5zdWJUYXNrKHRleHQpOwotCQlVUkwgc2l0ZVVSTCA9IHNpdGVBZGFwdGVyLmdldFVSTCgpOwotCi0JCUlTaXRlIHNpdGU7Ci0JCXRyeSB7Ci0JCQlzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShzaXRlVVJMLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEpKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUZXN0IHRoZSBleGNlcHRpb24uIElmIHRoZSBleGNlcHRpb24gaXMKLQkJCS8vIGR1ZSB0byB0aGUgc2l0ZSBjb25uZWN0aW9uIHByb2JsZW1zLAotCQkJLy8gYWxsb3cgdGhlIHNlYXJjaCB0byBtb3ZlIG9uIHRvIAotCQkJLy8gdGhlIG5leHQgc2l0ZS4gT3RoZXJ3aXNlLAotCQkJLy8gcmV0aHJvdyB0aGUgZXhjZXB0aW9uLCBjYXVzaW5nIHRoZSBzZWFyY2gKLQkJCS8vIHRvIHRlcm1pbmF0ZS4KLQkJCUlTdGF0dXMgc3RhdHVzID0gZS5nZXRTdGF0dXMoKTsKLQkJCWlmIChzdGF0dXMgPT0gbnVsbAotCQkJCXx8IHN0YXR1cy5nZXRDb2RlKCkgIT0gSVNpdGUuU0lURV9BQ0NFU1NfRVhDRVBUSU9OKQotCQkJCXRocm93IGU7Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCXJldHVybiBzdGF0dXM7Ci0JCX0KLQkJLy8gSWYgZnJvemVuIGNvbm5lY3Rpb24gd2FzIGNhbmNlbGVkLCB0aGVyZSB3aWxsIGJlIG5vIHNpdGUuCi0JCWlmIChzaXRlPT1udWxsKSByZXR1cm4gbnVsbDsKLQkJdGV4dCA9IFVwZGF0ZVVJLmdldEZvcm1hdHRlZE1lc3NhZ2UoS0VZX0NIRUNLSU5HLCAKLQkJCQkJc2l0ZUFkYXB0ZXIuZ2V0TGFiZWwoKSk7Ci0JCW1vbml0b3IuZ2V0V3JhcHBlZFByb2dyZXNzTW9uaXRvcigpLnN1YlRhc2sodGV4dCk7Ci0KLQkJbW9uaXRvci5iZWdpblRhc2soIiIsIDIpOyAvLyROT04tTkxTLTEkCi0KLQkJSUZlYXR1cmVbXSBtYXRjaGVzID0KLQkJCXF1ZXJ5LmdldE1hdGNoaW5nRmVhdHVyZXMoc2l0ZSwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxKSk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXRjaGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlpZiAoZ2V0RmlsdGVyRW52aXJvbm1lbnQoKSAmJiAhaXNWYWxpZEVudmlyb25tZW50KG1hdGNoZXNbaV0pKQotCQkJCWNvbnRpbnVlOwotCQkJLy8gYmluZ28gLSBhZGQgdGhpcwotCQkJU2VhcmNoUmVzdWx0U2l0ZSBzZWFyY2hTaXRlID0gZmluZFJlc3VsdFNpdGUoc2l0ZSk7Ci0JCQlpZiAoc2VhcmNoU2l0ZSA9PSBudWxsKSB7Ci0JCQkJc2VhcmNoU2l0ZSA9Ci0JCQkJCW5ldyBTZWFyY2hSZXN1bHRTaXRlKHRoaXMsIHNpdGVBZGFwdGVyLmdldExhYmVsKCksIHNpdGUpOwotCQkJCXJlc3VsdC5hZGQoc2VhcmNoU2l0ZSk7Ci0JCQkJYXN5bmNGaXJlT2JqZWN0QWRkZWQoZGlzcGxheSwgdGhpcywgc2VhcmNoU2l0ZSk7Ci0JCQl9Ci0JCQlTaW1wbGVGZWF0dXJlQWRhcHRlciBmZWF0dXJlQWRhcHRlciA9Ci0JCQkJbmV3IFNpbXBsZUZlYXR1cmVBZGFwdGVyKG1hdGNoZXNbaV0pOwotCQkJc2VhcmNoU2l0ZS5hZGRDYW5kaWRhdGUoZmVhdHVyZUFkYXB0ZXIpOwotCQkJYXN5bmNGaXJlT2JqZWN0QWRkZWQoZGlzcGxheSwgc2VhcmNoU2l0ZSwgZmVhdHVyZUFkYXB0ZXIpOwotCQl9Ci0JCW1vbml0b3Iud29ya2VkKDEpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIFNlYXJjaFJlc3VsdFNpdGUgZmluZFJlc3VsdFNpdGUoSVNpdGUgc2l0ZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5zaXplKCk7IGkrKykgewotCQkJU2VhcmNoUmVzdWx0U2l0ZSByZXN1bHRTaXRlID0gKFNlYXJjaFJlc3VsdFNpdGUpIHJlc3VsdC5nZXQoaSk7Ci0JCQlpZiAocmVzdWx0U2l0ZS5nZXRTaXRlKG51bGwpLmVxdWFscyhzaXRlKSkKLQkJCQlyZXR1cm4gcmVzdWx0U2l0ZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNWYWxpZEVudmlyb25tZW50KElGZWF0dXJlIGNhbmRpZGF0ZSkgewotCQlyZXR1cm4gVXBkYXRlTWFuYWdlclV0aWxzLmlzVmFsaWRFbnZpcm9ubWVudChjYW5kaWRhdGUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhc3luY0ZpcmVPYmplY3RBZGRlZCgKLQkJRGlzcGxheSBkaXNwbGF5LAotCQlmaW5hbCBPYmplY3QgcGFyZW50LAotCQlmaW5hbCBPYmplY3QgY2hpbGQpIHsKLQkJZmluYWwgVXBkYXRlTW9kZWwgbW9kZWwgPSBnZXRNb2RlbCgpOwotCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJbW9kZWwuZmlyZU9iamVjdHNBZGRlZChwYXJlbnQsIG5ldyBPYmplY3RbXSB7IGNoaWxkIH0pOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYXN5bmNGaXJlT2JqZWN0Q2hhbmdlZCgKLQkJRGlzcGxheSBkaXNwbGF5LAotCQlmaW5hbCBPYmplY3Qgb2JqLAotCQlmaW5hbCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJZmluYWwgVXBkYXRlTW9kZWwgbW9kZWwgPSBnZXRNb2RlbCgpOwotCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJbW9kZWwuZmlyZU9iamVjdENoYW5nZWQob2JqLCBwcm9wZXJ0eSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplTXlDb21wdXRlclNpdGVzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlWZWN0b3Igc2l0ZXMgPSBuZXcgVmVjdG9yKCk7Ci0JCU15Q29tcHV0ZXIgbXlDb21wdXRlciA9IG5ldyBNeUNvbXB1dGVyKCk7Ci0JCU15Q29tcHV0ZXJTZWFyY2hTZXR0aW5ncyBzZXR0aW5ncyA9IG5ldyBNeUNvbXB1dGVyU2VhcmNoU2V0dGluZ3ModGhpcyk7Ci0JCW15Q29tcHV0ZXIuY29sbGVjdFNpdGVzKHNpdGVzLCBzZXR0aW5ncywgbW9uaXRvcik7Ci0JCWlmIChzaXRlcy5zaXplKCkgPiAwKSB7Ci0JCQlteUNvbXB1dGVyU2l0ZXMgPQotCQkJCShTaXRlQm9va21hcmtbXSkgc2l0ZXMudG9BcnJheShuZXcgU2l0ZUJvb2ttYXJrW3NpdGVzLnNpemUoKV0pOwotCQl9IGVsc2UKLQkJCW15Q29tcHV0ZXJTaXRlcyA9IG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZE15Q29tcHV0ZXJTaXRlcyhBcnJheUxpc3QgcmVzdWx0KSB7Ci0JCWlmIChteUNvbXB1dGVyU2l0ZXMgIT0gbnVsbCAmJiBnZXRTZWFyY2hNeUNvbXB1dGVyKCkpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbXlDb21wdXRlclNpdGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJcmVzdWx0LmFkZChteUNvbXB1dGVyU2l0ZXNbaV0pOwotCQkJfQotCQl9Ci0JfQotCXByaXZhdGUgdm9pZCBhZGRCb29rbWFya3MoQXJyYXlMaXN0IHJlc3VsdCkgewotCQlpZiAoZ2V0U2VhcmNoQm9va21hcmtzKCkgPT0gZmFsc2UpCi0JCQlyZXR1cm47Ci0JCVVwZGF0ZU1vZGVsIG1vZGVsID0gVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldFVwZGF0ZU1vZGVsKCk7Ci0JCVNpdGVCb29rbWFya1tdIGJvb2ttYXJrcyA9IG1vZGVsLmdldEJvb2ttYXJrTGVhZnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBib29rbWFya3MubGVuZ3RoOyBpKyspIHsKLQkJCVNpdGVCb29rbWFyayBib29rbWFyayA9IGJvb2ttYXJrc1tpXTsKLQkJCXJlc3VsdC5hZGQoYm9va21hcmspOwotCQl9Ci0JfQotCXByaXZhdGUgdm9pZCBhZGREaXNjb3ZlcnlTaXRlcyhBcnJheUxpc3QgcmVzdWx0KSB7Ci0JCWlmIChnZXRTZWFyY2hEaXNjb3ZlcnkoKSA9PSBmYWxzZSkKLQkJCXJldHVybjsKLQkJRGlzY292ZXJ5Rm9sZGVyIGRmb2xkZXIgPSBuZXcgRGlzY292ZXJ5Rm9sZGVyKCk7Ci0JCU9iamVjdFtdIGNoaWxkcmVuID0gZGZvbGRlci5nZXRDaGlsZHJlbihkZm9sZGVyKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJU2l0ZUJvb2ttYXJrIGJvb2ttYXJrID0gKFNpdGVCb29rbWFyaykgY2hpbGRyZW5baV07Ci0JCQlyZXN1bHQuYWRkKGJvb2ttYXJrKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9zZWFyY2gvU2VhcmNoUmVzdWx0U2l0ZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3NlYXJjaC9TZWFyY2hSZXN1bHRTaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkNmY3ZGEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3NlYXJjaC9TZWFyY2hSZXN1bHRTaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuc2VhcmNoOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsLio7Ci0KLXB1YmxpYyBjbGFzcyBTZWFyY2hSZXN1bHRTaXRlCi0JZXh0ZW5kcyBVSU1vZGVsT2JqZWN0Ci0JaW1wbGVtZW50cyBJV29ya2JlbmNoQWRhcHRlciwgSVNpdGVBZGFwdGVyIHsKLQlwcml2YXRlIElTaXRlIHNpdGU7Ci0JcHJpdmF0ZSBWZWN0b3IgY2FuZGlkYXRlczsKLQlwcml2YXRlIFN0cmluZyBsYWJlbDsKLQlwcml2YXRlIFNlYXJjaE9iamVjdCBzZWFyY2g7Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQlpZiAoYWRhcHRlci5lcXVhbHMoSVdvcmtiZW5jaEFkYXB0ZXIuY2xhc3MpKSB7Ci0JCQlyZXR1cm4gdGhpczsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihhZGFwdGVyKTsKLQl9Ci0KLQlwdWJsaWMgU2VhcmNoUmVzdWx0U2l0ZShTZWFyY2hPYmplY3Qgc2VhcmNoLCBTdHJpbmcgbGFiZWwsIElTaXRlIHNpdGUpIHsKLQkJdGhpcy5zZWFyY2ggPSBzZWFyY2g7Ci0JCXRoaXMubGFiZWwgPSBsYWJlbDsKLQkJdGhpcy5zaXRlID0gc2l0ZTsKLQkJY2FuZGlkYXRlcyA9IG5ldyBWZWN0b3IoKTsKLQl9Ci0JCi0JcHVibGljIFNlYXJjaE9iamVjdCBnZXRTZWFyY2goKSB7Ci0JCXJldHVybiBzZWFyY2g7Ci0JfQotCi0JcHVibGljIElTaXRlIGdldFNpdGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXJldHVybiBzaXRlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gZ2V0TGFiZWwoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElXb3JrYmVuY2hBZGFwdGVyI2dldENoaWxkcmVuKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudCkgewotCQlyZXR1cm4gY2FuZGlkYXRlcy50b0FycmF5KCk7Ci0JfQotCXB1YmxpYyBpbnQgZ2V0Q2hpbGRDb3VudCgpIHsKLQkJcmV0dXJuIGNhbmRpZGF0ZXMuc2l6ZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVdvcmtiZW5jaEFkYXB0ZXIjZ2V0SW1hZ2VEZXNjcmlwdG9yKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVdvcmtiZW5jaEFkYXB0ZXIjZ2V0TGFiZWwoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gZ2V0TGFiZWwoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElXb3JrYmVuY2hBZGFwdGVyI2dldFBhcmVudChPYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGFyZzApIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkQ2FuZGlkYXRlKElGZWF0dXJlQWRhcHRlciBjYW5kaWRhdGUpIHsKLQkJY2FuZGlkYXRlcy5hZGQoY2FuZGlkYXRlKTsKLQl9Ci0JLyoqCi0JICogQHNlZSBJU2l0ZUFkYXB0ZXIjZ2V0VVJMKCkKLQkgKi8KLQlwdWJsaWMgVVJMIGdldFVSTCgpIHsKLQkJcmV0dXJuIHNpdGUuZ2V0VVJMKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvc2VhcmNoL1VwZGF0ZXNTZWFyY2hDYXRlZ29yeS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3NlYXJjaC9VcGRhdGVzU2VhcmNoQ2F0ZWdvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY3MGQ5Yy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvc2VhcmNoL1VwZGF0ZXNTZWFyY2hDYXRlZ29yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnNlYXJjaDsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuZm9ybXMuQWN0aXZpdHlDb25zdHJhaW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkucGFydHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkucHJlZmVyZW5jZXMuTWFpblByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzLkZlYXR1cmVIaWVyYXJjaHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbC5Gb3JtV2lkZ2V0RmFjdG9yeTsKLQotcHVibGljIGNsYXNzIFVwZGF0ZXNTZWFyY2hDYXRlZ29yeSBleHRlbmRzIFNlYXJjaENhdGVnb3J5IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NVUlJFTlRfU0VBUkNIID0KLQkJIlVwZGF0ZXNTZWFyY2hDYXRlZ29yeS5jdXJyZW50U2VhcmNoIjsKLQlwcml2YXRlIENoZWNrYm94VGFibGVWaWV3ZXIgdGFibGVWaWV3ZXI7Ci0KLQljbGFzcyBDYW5kaWRhdGUgewotCQlBcnJheUxpc3QgY2hpbGRyZW47Ci0JCUNhbmRpZGF0ZSBwYXJlbnQ7Ci0JCUlGZWF0dXJlUmVmZXJlbmNlIHJlZjsKLQkJcHVibGljIENhbmRpZGF0ZShJRmVhdHVyZVJlZmVyZW5jZSByZWYpIHsKLQkJCXRoaXMucmVmID0gcmVmOwotCQl9Ci0JCXB1YmxpYyBDYW5kaWRhdGUoSUZlYXR1cmVSZWZlcmVuY2UgcmVmLCBDYW5kaWRhdGUgcGFyZW50KSB7Ci0JCQl0aGlzKHJlZik7Ci0JCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQkJfQotCQlwdWJsaWMgdm9pZCBhZGQoQ2FuZGlkYXRlIGNoaWxkKSB7Ci0JCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCkKLQkJCQljaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNoaWxkLnNldFBhcmVudCh0aGlzKTsKLQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCX0KLQkJcHVibGljIENhbmRpZGF0ZVtdIGdldENoaWxkcmVuKCkgewotCQkJaWYgKGNoaWxkcmVuID09IG51bGwpCi0JCQkJcmV0dXJuIG5ldyBDYW5kaWRhdGVbMF07Ci0JCQlyZXR1cm4gKENhbmRpZGF0ZVtdKSBjaGlsZHJlbi50b0FycmF5KAotCQkJCW5ldyBDYW5kaWRhdGVbY2hpbGRyZW4uc2l6ZSgpXSk7Ci0JCX0KLQkJdm9pZCBzZXRQYXJlbnQoQ2FuZGlkYXRlIHBhcmVudCkgewotCQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCX0KLQkJcHVibGljIElGZWF0dXJlUmVmZXJlbmNlIGdldFJlZmVyZW5jZSgpIHsKLQkJCXJldHVybiByZWY7Ci0JCX0KLQkJdm9pZCBzZXRSZWZlcmVuY2UoSUZlYXR1cmVSZWZlcmVuY2UgcmVmKSB7Ci0JCQl0aGlzLnJlZiA9IHJlZjsKLQkJfQotCQlwdWJsaWMgVmVyc2lvbmVkSWRlbnRpZmllciBnZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gcmVmLmdldFZlcnNpb25lZElkZW50aWZpZXIoKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBuZXcgVmVyc2lvbmVkSWRlbnRpZmllcigidW5rbm93biIsICIwLjAuMCIpOwotCQkJfQotCQl9Ci0JCXB1YmxpYyBJRmVhdHVyZSBnZXRGZWF0dXJlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gcmVmLmdldEZlYXR1cmUobW9uaXRvcik7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCQlwdWJsaWMgQ2FuZGlkYXRlIGdldFBhcmVudCgpIHsKLQkJCXJldHVybiBwYXJlbnQ7Ci0JCX0KLQkJcHVibGljIENhbmRpZGF0ZSBnZXRSb290KCkgewotCQkJQ2FuZGlkYXRlIHJvb3QgPSB0aGlzOwotCi0JCQl3aGlsZSAocm9vdC5nZXRQYXJlbnQoKSAhPSBudWxsKSB7Ci0JCQkJcm9vdCA9IHJvb3QuZ2V0UGFyZW50KCk7Ci0JCQl9Ci0JCQlyZXR1cm4gcm9vdDsKLQkJfQotCQlwdWJsaWMgSVVSTEVudHJ5IGdldFVwZGF0ZUVudHJ5KCkgewotCQkJaW50IGxvY2F0aW9uID0gSVVwZGF0ZUNvbnN0YW50cy5TRUFSQ0hfUk9PVDsKLQotCQkJaWYgKHJlZiBpbnN0YW5jZW9mIElJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UpCi0JCQkJbG9jYXRpb24gPQotCQkJCQkoKElJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UpIHJlZikuZ2V0U2VhcmNoTG9jYXRpb24oKTsKLQkJCWlmIChwYXJlbnQgPT0gbnVsbCB8fCBsb2NhdGlvbiA9PSBJVXBkYXRlQ29uc3RhbnRzLlNFQVJDSF9TRUxGKSB7Ci0JCQkJcmV0dXJuIGdldEZlYXR1cmUobnVsbCkuZ2V0VXBkYXRlU2l0ZUVudHJ5KCk7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0Um9vdCgpLmdldFVwZGF0ZUVudHJ5KCk7Ci0JCX0KLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiByZWYudG9TdHJpbmcoKTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IHNvdXJjZSkgewotCQkJaWYgKHNvdXJjZSBpbnN0YW5jZW9mIENhbmRpZGF0ZSkgewotCQkJCXJldHVybiB0aGlzLnJlZi5lcXVhbHMoKChDYW5kaWRhdGUpIHNvdXJjZSkuZ2V0UmVmZXJlbmNlKCkpOwotCQkJfQotCQkJaWYgKHNvdXJjZSBpbnN0YW5jZW9mIElGZWF0dXJlUmVmZXJlbmNlKSB7Ci0JCQkJcmV0dXJuIHRoaXMucmVmLmVxdWFscyhzb3VyY2UpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGFkZFRvRmxhdExpc3QoQXJyYXlMaXN0IGxpc3QsIGJvb2xlYW4gdXBkYXRhYmxlT25seSkgewotCQkJLy8gYWRkIGl0c2VsZgotCQkJaWYgKCF1cGRhdGFibGVPbmx5IHx8IGlzVXBkYXRhYmxlKCkpCi0JCQkJbGlzdC5hZGQodGhpcyk7Ci0JCQkvLyBhZGQgY2hpbGRyZW4KLQkJCWlmIChjaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5zaXplKCk7IGkrKykgewotCQkJCQlDYW5kaWRhdGUgY2hpbGQgPSAoQ2FuZGlkYXRlKSBjaGlsZHJlbi5nZXQoaSk7Ci0JCQkJCWNoaWxkLmFkZFRvRmxhdExpc3QobGlzdCwgdXBkYXRhYmxlT25seSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXB1YmxpYyBib29sZWFuIGlzVXBkYXRhYmxlKCkgewotCQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKHJlZiBpbnN0YW5jZW9mIElJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UpIHsKLQkJCQlyZXR1cm4gKChJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlKSByZWYpLmdldE1hdGNoKCkKLQkJCQkJIT0gSVVwZGF0ZUNvbnN0YW50cy5SVUxFX1BFUkZFQ1Q7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldE1hdGNoKCkgewotCQkJaWYgKHJlZiBpbnN0YW5jZW9mIElJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UpCi0JCQkJcmV0dXJuICgoSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZSkgcmVmKS5nZXRNYXRjaCgpOwotCQkJcmV0dXJuIElVcGRhdGVDb25zdGFudHMuUlVMRV9QRVJGRUNUOwotCQl9Ci0JfQotCi0JY2xhc3MgRmVhdHVyZUNvbnRlbnRQcm92aWRlcgotCQlleHRlbmRzIERlZmF1bHRDb250ZW50UHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB7Ci0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgcGFyZW50KSB7Ci0JCQlpZiAoY2FuZGlkYXRlcyA9PSBudWxsKQotCQkJCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCQkJcmV0dXJuIGdldEFsbENhbmRpZGF0ZXMoKS50b0FycmF5KCk7Ci0JCX0KLQl9Ci0KLQljbGFzcyBGZWF0dXJlTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgewotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iaikgewotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENhbmRpZGF0ZSkgewotCQkJCUNhbmRpZGF0ZSBjID0gKENhbmRpZGF0ZSkgb2JqOwotCQkJCXRyeSB7Ci0JCQkJCXJldHVybiBjLnJlZi5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gb2JqLnRvU3RyaW5nKCk7Ci0JCX0KLQl9Ci0KLQljbGFzcyBIaXQgewotCQlJRmVhdHVyZSBjYW5kaWRhdGU7Ci0JCUlGZWF0dXJlUmVmZXJlbmNlIHJlZjsKLQkJYm9vbGVhbiBwYXRjaDsKLQkJcHVibGljIEhpdChJRmVhdHVyZSBjYW5kaWRhdGUsIElGZWF0dXJlUmVmZXJlbmNlIHJlZikgewotCQkJdGhpcy5jYW5kaWRhdGUgPSBjYW5kaWRhdGU7Ci0JCQl0aGlzLnJlZiA9IHJlZjsKLQkJfQotCQlwdWJsaWMgSGl0KElGZWF0dXJlIGNhbmRpZGF0ZSwgSUZlYXR1cmVSZWZlcmVuY2UgcmVmLCBib29sZWFuIHBhdGNoKSB7Ci0JCQl0aGlzKGNhbmRpZGF0ZSwgcmVmKTsKLQkJCXRoaXMucGF0Y2ggPSBwYXRjaDsKLQkJfQotCi0JCXB1YmxpYyBQZW5kaW5nQ2hhbmdlIGdldEpvYigpIHsKLQkJCXRyeSB7Ci0JCQkJSUZlYXR1cmUgZmVhdHVyZSA9IHJlZi5nZXRGZWF0dXJlKG51bGwpOwotCQkJCXJldHVybiBuZXcgUGVuZGluZ0NoYW5nZShwYXRjaCA/IG51bGwgOiBjYW5kaWRhdGUsIGZlYXR1cmUpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc1BhdGNoKCkgewotCQkJcmV0dXJuIHBhdGNoOwotCQl9Ci0JfQotCi0JY2xhc3MgU2l0ZUFkYXB0ZXIgaW1wbGVtZW50cyBJU2l0ZUFkYXB0ZXIgewotCQlJVVJMRW50cnkgZW50cnk7Ci0JCVNpdGVBZGFwdGVyKElVUkxFbnRyeSBlbnRyeSkgewotCQkJdGhpcy5lbnRyeSA9IGVudHJ5OwotCQl9Ci0JCXB1YmxpYyBVUkwgZ2V0VVJMKCkgewotCQkJcmV0dXJuIGVudHJ5LmdldFVSTCgpOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCQlTdHJpbmcgbGFiZWwgPSBlbnRyeS5nZXRBbm5vdGF0aW9uKCk7Ci0JCQlpZiAobGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwKQotCQkJCWxhYmVsID0gZ2V0VVJMKCkudG9TdHJpbmcoKTsKLQkJCXJldHVybiBsYWJlbDsKLQkJfQotCQlwdWJsaWMgSVNpdGUgZ2V0U2l0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIFNpdGVNYW5hZ2VyLmdldFNpdGUoZ2V0VVJMKCksIG1vbml0b3IpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQljbGFzcyBIaXRTb3J0ZXIgZXh0ZW5kcyBTb3J0ZXIgewotCQlwdWJsaWMgYm9vbGVhbiBjb21wYXJlKE9iamVjdCBsZWZ0LCBPYmplY3QgcmlnaHQpIHsKLQkJCUhpdCBoaXQxID0gKEhpdCkgbGVmdDsKLQkJCUhpdCBoaXQyID0gKEhpdCkgcmlnaHQ7Ci0JCQl0cnkgewotCQkJCVZlcnNpb25lZElkZW50aWZpZXIgaHYxID0gaGl0MS5yZWYuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOwotCQkJCVZlcnNpb25lZElkZW50aWZpZXIgaHYyID0gaGl0Mi5yZWYuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOwotCQkJCXJldHVybiBpc05ld2VyVmVyc2lvbihodjIsIGh2MSk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQljbGFzcyBVcGRhdGVRdWVyeSBpbXBsZW1lbnRzIElTZWFyY2hRdWVyeSB7Ci0JCUlGZWF0dXJlIGNhbmRpZGF0ZTsKLQkJSVNpdGVBZGFwdGVyIGFkYXB0ZXI7Ci0JCWludCBtYXRjaCA9IElJbXBvcnQuUlVMRV9QRVJGRUNUOwotCi0JCXB1YmxpYyBVcGRhdGVRdWVyeSgKLQkJCUlGZWF0dXJlIGNhbmRpZGF0ZSwKLQkJCWludCBtYXRjaCwKLQkJCUlVUkxFbnRyeSB1cGRhdGVFbnRyeSkgewotCQkJdGhpcy5jYW5kaWRhdGUgPSBjYW5kaWRhdGU7Ci0JCQl0aGlzLm1hdGNoID0gbWF0Y2g7Ci0JCQlpZiAodXBkYXRlRW50cnkgIT0gbnVsbCAmJiB1cGRhdGVFbnRyeS5nZXRVUkwoKSAhPSBudWxsKQotCQkJCWFkYXB0ZXIgPSBuZXcgU2l0ZUFkYXB0ZXIodXBkYXRlRW50cnkpOwotCQl9Ci0KLQkJcHVibGljIElTaXRlQWRhcHRlciBnZXRTZWFyY2hTaXRlKCkgewotCQkJcmV0dXJuIGFkYXB0ZXI7Ci0JCX0KLQkJcHJpdmF0ZSBib29sZWFuIGlzQnJva2VuKCkgewotCQkJdHJ5IHsKLQkJCQlJU3RhdHVzIHN0YXR1cyA9Ci0JCQkJCVNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpLmdldEZlYXR1cmVTdGF0dXMoY2FuZGlkYXRlKTsKLQkJCQlyZXR1cm4gc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUjsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlwcml2YXRlIGJvb2xlYW4gaXNNaXNzaW5nT3B0aW9uYWxDaGlsZHJlbihJRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCQl0cnkgewotCQkJCUlJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VbXSBjaGlsZHJlbiA9Ci0JCQkJCWZlYXR1cmUuZ2V0SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQkJSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZSByZWYgPSBjaGlsZHJlbltpXTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlGZWF0dXJlIGNoaWxkID0gcmVmLmdldEZlYXR1cmUobnVsbCk7Ci0JCQkJCQkvLyBJZiB3ZSBhcmUgaGVyZSwgdGhlIGNoaWxkIGlzIG5vdCBtaXNzaW5nLgotCQkJCQkJLy8gQ2hlY2sgaXQncyBjaGlsZHJlbiByZWN1cnNpdmVseS4KLQkJCQkJCWlmIChpc01pc3NpbmdPcHRpb25hbENoaWxkcmVuKGNoaWxkKSkKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBNaXNzaW5nIGNoaWxkLiBSZXR1cm4gdHJ1ZSBpZiBvcHRpb25hbCwKLQkJCQkJCS8vIG90aGVyd2lzZSBpdCBpcyBhIGJyb2tlbiBmZWF0dXJlIHRoYXQgd2UgCi0JCQkJCQkvLyBkbyBub3QgY2FyZSBhYm91dC4KLQkJCQkJCS8vIERlZmVjdCAjMzgzNTU6IHJldHVybmluZyB0cnVlIGNhdXNlcwotCQkJCQkJLy8gcHJvYmxlbXMgZm9yIG9wdGlvbmFsIGZlYXR1cmVzIHRoYXQKLQkJCQkJCS8vIG5vdCBpbnN0YWxsZWQuIFNob3VsZCByZXR1cm4gdHJ1ZQotCQkJCQkJLy8gb25seSBpZiBtaXNzaW5nIEFORCBoYXMgb2xkZXIKLQkJCQkJCS8vIHZlcnNpb25zIGluc3RhbGxlZCAoZm9yIHJlLXVwZ3JhZGluZwotCQkJCQkJLy8gbmF0aXZlIGluc3RhbGwgYWZ0ZXIgdXBkYXRlKS4KLQkJCQkJCWlmIChyZWYuaXNPcHRpb25hbCgpKSB7Ci0JCQkJCQkJcmV0dXJuIEZlYXR1cmVIaWVyYXJjaHlFbGVtZW50Lmhhc09sZGVyVmVyc2lvbihyZWYpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcHVibGljIElGZWF0dXJlW10gZ2V0TWF0Y2hpbmdGZWF0dXJlcygKLQkJCUlTaXRlIHNpdGUsCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCUFycmF5TGlzdCBoaXRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJYm9vbGVhbiBicm9rZW4gPSBpc0Jyb2tlbigpOwotCQkJYm9vbGVhbiBtaXNzaW5nT3B0aW9uYWxDaGlsZHJlbiA9IGZhbHNlOwotCi0JCQkvLyBEb24ndCBib3RoZXIgdG8gY29tcHV0ZSBtaXNzaW5nIG9wdGlvbmFsIGNoaWxkcmVuCi0JCQkvLyBpZiB0aGUgZmVhdHVyZSBpcyBicm9rZW4gLSBhbGwgd2Ugd2FudCBpcyB0byAKLQkJCS8vIHNlZSBpZiB3ZSBzaG91bGQgYWxsb3cgc2FtZS12ZXJzaW9uIHJlLWluc3RhbGwuCi0JCQlpZiAoIWJyb2tlbikKLQkJCQltaXNzaW5nT3B0aW9uYWxDaGlsZHJlbiA9IGlzTWlzc2luZ09wdGlvbmFsQ2hpbGRyZW4oY2FuZGlkYXRlKTsKLQkJCUlTaXRlRmVhdHVyZVJlZmVyZW5jZVtdIHJlZnMgPSBzaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCQltb25pdG9yLmJlZ2luVGFzaygiIiwgcmVmcy5sZW5ndGggKyAxKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmcy5sZW5ndGg7IGkrKykgewotCQkJCUlTaXRlRmVhdHVyZVJlZmVyZW5jZSByZWYgPSByZWZzW2ldOwotCQkJCXRyeSB7Ci0JCQkJCWlmIChpc05ld2VyVmVyc2lvbihjYW5kaWRhdGUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLAotCQkJCQkJcmVmLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSwKLQkJCQkJCW1hdGNoKSkgewotCQkJCQkJaGl0cy5hZGQobmV3IEhpdChjYW5kaWRhdGUsIHJlZikpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJLy8gYWNjZXB0IHRoZSBzYW1lIGZlYXR1cmUgaWYgdGhlIGluc3RhbGxlZAotCQkJCQkJLy8gZmVhdHVyZSBpcyBicm9rZW4KLQkJCQkJCWlmICgoYnJva2VuIHx8IG1pc3NpbmdPcHRpb25hbENoaWxkcmVuKQotCQkJCQkJCSYmIGNhbmRpZGF0ZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZXF1YWxzKAotCQkJCQkJCQlyZWYuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpKSkKLQkJCQkJCQloaXRzLmFkZChuZXcgSGl0KGNhbmRpZGF0ZSwgcmVmKSk7Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQkvLyBjaGVjayBmb3IgcGF0Y2hlcwotCQkJCQkJCWlmIChpc1BhdGNoKGNhbmRpZGF0ZSwgcmVmKSkKLQkJCQkJCQkJaGl0cy5hZGQobmV3IEhpdChjYW5kaWRhdGUsIHJlZiwgdHJ1ZSkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQkJcmV0dXJuIG5ldyBJRmVhdHVyZVswXTsKLQkJCX0KLQkJCUlGZWF0dXJlW10gcmVzdWx0OwotCQkJaWYgKGhpdHMuc2l6ZSgpID09IDApCi0JCQkJcmVzdWx0ID0gbmV3IElGZWF0dXJlWzBdOwotCQkJZWxzZSB7Ci0JCQkJLyoKLQkJCQlJRmVhdHVyZSB0b3BIaXQgPSBnZXRGaXJzdFZhbGlkKGhpdHMpOwotCQkJCWlmICh0b3BIaXQgPT0gbnVsbCkKLQkJCQkJcmVzdWx0ID0gbmV3IElGZWF0dXJlWzBdOwotCQkJCWVsc2UKLQkJCQkJcmVzdWx0ID0gbmV3IElGZWF0dXJlW10geyB0b3BIaXQgfTsKLQkJCQkqLwotCQkJCXJlc3VsdCA9IGdldFZhbGlkSGl0cyhoaXRzKTsKLQkJCX0KLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJbW9uaXRvci5kb25lKCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBBcnJheUxpc3QgY2FuZGlkYXRlczsKLQotCXB1YmxpYyBVcGRhdGVzU2VhcmNoQ2F0ZWdvcnkoKSB7Ci0JfQotCi0JcHJpdmF0ZSBJRmVhdHVyZSBnZXRGaXJzdFZhbGlkKEFycmF5TGlzdCBoaXRzKSB7Ci0JCU9iamVjdFtdIGFycmF5ID0gaGl0cy50b0FycmF5KCk7Ci0JCUhpdFNvcnRlciBzb3J0ZXIgPSBuZXcgSGl0U29ydGVyKCk7Ci0JCXNvcnRlci5zb3J0SW5QbGFjZShhcnJheSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJCUhpdCBoaXQgPSAoSGl0KSBhcnJheVtpXTsKLQkJCVBlbmRpbmdDaGFuZ2Ugam9iID0gaGl0LmdldEpvYigpOwotCQkJaWYgKGpvYiA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJLy8gZG8gbm90IGFjY2VwdCB1cGRhdGVzIHdpdGhvdXQgYSBsaWNlbnNlCi0JCQlpZiAoIVVwZGF0ZU1vZGVsLmhhc0xpY2Vuc2Uoam9iKSkKLQkJCQljb250aW51ZTsKLQkJCUlTdGF0dXMgc3RhdHVzID0gQWN0aXZpdHlDb25zdHJhaW50cy52YWxpZGF0ZVBlbmRpbmdDaGFuZ2Uoam9iKTsKLQkJCWlmIChzdGF0dXMgPT0gbnVsbCkKLQkJCQlyZXR1cm4gam9iLmdldEZlYXR1cmUoKTsKLQkJfQotCQkvLyBubyB2YWxpZCBoaXRzCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgSUZlYXR1cmVbXSBnZXRWYWxpZEhpdHMoQXJyYXlMaXN0IGhpdHMpIHsKLQkJT2JqZWN0W10gYXJyYXkgPSBoaXRzLnRvQXJyYXkoKTsKLQkJSGl0U29ydGVyIHNvcnRlciA9IG5ldyBIaXRTb3J0ZXIoKTsKLQkJc29ydGVyLnNvcnRJblBsYWNlKGFycmF5KTsKLQkJSUZlYXR1cmUgdG9wSGl0ID0gbnVsbDsKLQkJQXJyYXlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgewotCQkJSGl0IGhpdCA9IChIaXQpIGFycmF5W2ldOwotCQkJUGVuZGluZ0NoYW5nZSBqb2IgPSBoaXQuZ2V0Sm9iKCk7Ci0JCQlpZiAoam9iID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQkvLyBkbyBub3QgYWNjZXB0IHVwZGF0ZXMgd2l0aG91dCBhIGxpY2Vuc2UKLQkJCWlmICghVXBkYXRlTW9kZWwuaGFzTGljZW5zZShqb2IpKQotCQkJCWNvbnRpbnVlOwotCQkJSVN0YXR1cyBzdGF0dXMgPSBBY3Rpdml0eUNvbnN0cmFpbnRzLnZhbGlkYXRlUGVuZGluZ0NoYW5nZShqb2IpOwotCQkJaWYgKHN0YXR1cyA9PSBudWxsKSB7Ci0JCQkJaWYgKGhpdC5pc1BhdGNoKCkpIHsKLQkJCQkJLy8gRG8gbm90IGFkZCB0aGUgcGF0Y2ggaWYgYWxyZWFkeSBpbnN0YWxsZWQKLQkJCQkJSUZlYXR1cmVbXSBzYW1lSWQgPQotCQkJCQkJVXBkYXRlVUkuZ2V0SW5zdGFsbGVkRmVhdHVyZXMoam9iLmdldEZlYXR1cmUoKSwgZmFsc2UpOwotCQkJCQlpZiAoc2FtZUlkLmxlbmd0aCA9PSAwKQotCQkJCQkJcmVzdWx0LmFkZChqb2IuZ2V0RmVhdHVyZSgpKTsKLQkJCQl9IGVsc2UgaWYgKHRvcEhpdCA9PSBudWxsKSB7Ci0JCQkJCXRvcEhpdCA9IGpvYi5nZXRGZWF0dXJlKCk7Ci0JCQkJCXJlc3VsdC5hZGQodG9wSGl0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChJRmVhdHVyZVtdKSByZXN1bHQudG9BcnJheShuZXcgSUZlYXR1cmVbcmVzdWx0LnNpemUoKV0pOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCWNhbmRpZGF0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRyeSB7Ci0JCQlJTG9jYWxTaXRlIGxvY2FsU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpOwotCQkJSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZyA9IGxvY2FsU2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpOwotCQkJSUNvbmZpZ3VyZWRTaXRlW10gaXNpdGVzID0gY29uZmlnLmdldENvbmZpZ3VyZWRTaXRlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpc2l0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCQljb250cmlidXRlQ2FuZGlkYXRlcyhpc2l0ZXNbaV0pOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVVwZGF0ZVVJLmxvZ0V4Y2VwdGlvbihlLCBmYWxzZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY29udHJpYnV0ZUNhbmRpZGF0ZXMoSUNvbmZpZ3VyZWRTaXRlIGlzaXRlKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlGZWF0dXJlUmVmZXJlbmNlW10gcmVmcyA9IGlzaXRlLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpOwotCQlBcnJheUxpc3QgY2FuZGlkYXRlc1BlclNpdGUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmcy5sZW5ndGg7IGkrKykgewotCQkJSUZlYXR1cmVSZWZlcmVuY2UgcmVmID0gcmVmc1tpXTsKLQkJCS8vIERvbid0IHdhc3RlIHRpbWUgc2VhcmNoaW5nIGZvciB1cGRhdGVzIHRvIAotCQkJLy8gcGF0Y2hlcy4KLQkJCXRyeSB7Ci0JCQkJaWYgKFVwZGF0ZVVJLmlzUGF0Y2gocmVmLmdldEZlYXR1cmUobnVsbCkpKQotCQkJCQljb250aW51ZTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJQ2FuZGlkYXRlIGMgPSBuZXcgQ2FuZGlkYXRlKHJlZik7Ci0JCQljYW5kaWRhdGVzUGVyU2l0ZS5hZGQoYyk7Ci0JCX0KLQkJLy8gQ3JlYXRlIGEgdHJlZSBmcm9tIGEgZmxhdCBsaXN0Ci0JCWJ1aWxkSGllcmFyY2h5KGNhbmRpZGF0ZXNQZXJTaXRlKTsKLQkJLy8gQWRkIHRoZSByZW1haW5pbmcgcm9vdCBjYW5kaWRhdGVzIHRvIAotCQkvLyB0aGUgZ2xvYmFsIGxpc3Qgb2YgY2FuZGlkYXRlcy4KLQkJY2FuZGlkYXRlcy5hZGRBbGwoY2FuZGlkYXRlc1BlclNpdGUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZEhpZXJhcmNoeShBcnJheUxpc3QgY2FuZGlkYXRlcykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlDYW5kaWRhdGVbXSBhcnJheSA9Ci0JCQkoQ2FuZGlkYXRlW10pIGNhbmRpZGF0ZXMudG9BcnJheShuZXcgQ2FuZGlkYXRlW2NhbmRpZGF0ZXMuc2l6ZSgpXSk7Ci0JCS8vIGZpbHRlciBvdXQgaW5jbHVkZWQgZmVhdHVyZXMgc28gdGhhdCBvbmx5IHRvcC1sZXZlbCBmZWF0dXJlcyByZW1haW4gb24gdGhlIGxpc3QKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgewotCQkJQ2FuZGlkYXRlIHBhcmVudCA9IGFycmF5W2ldOwotCQkJSUZlYXR1cmUgZmVhdHVyZSA9IHBhcmVudC5nZXRGZWF0dXJlKG51bGwpOwotCQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBpbmNsdWRlZCA9Ci0JCQkJZmVhdHVyZS5nZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGluY2x1ZGVkLmxlbmd0aDsgaisrKSB7Ci0JCQkJSUZlYXR1cmVSZWZlcmVuY2UgZnJlZiA9IGluY2x1ZGVkW2pdOwotCQkJCUNhbmRpZGF0ZSBjaGlsZCA9IGZpbmRDYW5kaWRhdGUoY2FuZGlkYXRlcywgZnJlZik7Ci0JCQkJaWYgKGNoaWxkICE9IG51bGwpIHsKLQkJCQkJcGFyZW50LmFkZChjaGlsZCk7Ci0JCQkJCWNoaWxkLnNldFJlZmVyZW5jZShmcmVmKTsKLQkJCQkJY2FuZGlkYXRlcy5yZW1vdmUoY2hpbGQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQlwcml2YXRlIENhbmRpZGF0ZSBmaW5kQ2FuZGlkYXRlKEFycmF5TGlzdCBsaXN0LCBJRmVhdHVyZVJlZmVyZW5jZSByZWYpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlDYW5kaWRhdGUgYyA9IChDYW5kaWRhdGUpIGxpc3QuZ2V0KGkpOwotCQkJaWYgKGMucmVmLmVxdWFscyhyZWYpKQotCQkJCXJldHVybiBjOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJU2VhcmNoUXVlcnlbXSBnZXRRdWVyaWVzKCkgewotCQlpbml0aWFsaXplKCk7Ci0JCUFycmF5TGlzdCBzZWxlY3RlZCA9IGdldFNlbGVjdGVkQ2FuZGlkYXRlcygpOwotCQlJU2VhcmNoUXVlcnlbXSBxdWVyaWVzID0gbmV3IElTZWFyY2hRdWVyeVtzZWxlY3RlZC5zaXplKCldOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGVkLnNpemUoKTsgaSsrKSB7Ci0JCQlDYW5kaWRhdGUgY2FuZGlkYXRlID0gKENhbmRpZGF0ZSkgc2VsZWN0ZWQuZ2V0KGkpOwotCQkJSUZlYXR1cmUgZmVhdHVyZSA9IGNhbmRpZGF0ZS5nZXRGZWF0dXJlKG51bGwpOwotCQkJaW50IG1hdGNoID0gY2FuZGlkYXRlLmdldE1hdGNoKCk7Ci0JCQlJVVJMRW50cnkgdXBkYXRlRW50cnkgPSBjYW5kaWRhdGUuZ2V0VXBkYXRlRW50cnkoKTsKLQkJCWlmIChmZWF0dXJlID09IG51bGwpIHsKLQkJCQlxdWVyaWVzW2ldID0gbnVsbDsKLQkJCX0gZWxzZSB7Ci0JCQkJcXVlcmllc1tpXSA9IG5ldyBVcGRhdGVRdWVyeShmZWF0dXJlLCBtYXRjaCwgdXBkYXRlRW50cnkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBxdWVyaWVzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q3VycmVudFNlYXJjaCgpIHsKLQkJcmV0dXJuIFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfQ1VSUkVOVF9TRUFSQ0gpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc05ld2VyVmVyc2lvbigKLQkJVmVyc2lvbmVkSWRlbnRpZmllciBmdmksCi0JCVZlcnNpb25lZElkZW50aWZpZXIgY3ZpKSB7Ci0JCWlmICghZnZpLmdldElkZW50aWZpZXIoKS5lcXVhbHMoY3ZpLmdldElkZW50aWZpZXIoKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVBsdWdpblZlcnNpb25JZGVudGlmaWVyIGZ2ID0gZnZpLmdldFZlcnNpb24oKTsKLQkJUGx1Z2luVmVyc2lvbklkZW50aWZpZXIgY3YgPSBjdmkuZ2V0VmVyc2lvbigpOwotCQlTdHJpbmcgbW9kZSA9IE1haW5QcmVmZXJlbmNlUGFnZS5nZXRVcGRhdGVWZXJzaW9uc01vZGUoKTsKLQkJYm9vbGVhbiBncmVhdGVyID0gY3YuaXNHcmVhdGVyVGhhbihmdik7Ci0JCWlmICghZ3JlYXRlcikKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKG1vZGUuZXF1YWxzKE1haW5QcmVmZXJlbmNlUGFnZS5FUVVJVkFMRU5UX1ZBTFVFKSkKLQkJCXJldHVybiBjdi5pc0VxdWl2YWxlbnRUbyhmdik7Ci0JCWVsc2UgaWYgKG1vZGUuZXF1YWxzKE1haW5QcmVmZXJlbmNlUGFnZS5DT01QQVRJQkxFX1ZBTFVFKSkKLQkJCXJldHVybiBjdi5pc0NvbXBhdGlibGVXaXRoKGZ2KTsKLQkJZWxzZQotCQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc05ld2VyVmVyc2lvbigKLQkJVmVyc2lvbmVkSWRlbnRpZmllciBmdmksCi0JCVZlcnNpb25lZElkZW50aWZpZXIgY3ZpLAotCQlpbnQgbWF0Y2gpIHsKLQkJaWYgKCFmdmkuZ2V0SWRlbnRpZmllcigpLmVxdWFscyhjdmkuZ2V0SWRlbnRpZmllcigpKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJUGx1Z2luVmVyc2lvbklkZW50aWZpZXIgZnYgPSBmdmkuZ2V0VmVyc2lvbigpOwotCQlQbHVnaW5WZXJzaW9uSWRlbnRpZmllciBjdiA9IGN2aS5nZXRWZXJzaW9uKCk7Ci0JCVN0cmluZyBtb2RlID0gTWFpblByZWZlcmVuY2VQYWdlLmdldFVwZGF0ZVZlcnNpb25zTW9kZSgpOwotCQlib29sZWFuIGdyZWF0ZXIgPSBjdi5pc0dyZWF0ZXJUaGFuKGZ2KTsKLQkJaWYgKCFncmVhdGVyKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpbnQgdXNlck1hdGNoID0gSUltcG9ydC5SVUxFX0dSRUFURVJfT1JfRVFVQUw7Ci0JCWlmIChtb2RlLmVxdWFscyhNYWluUHJlZmVyZW5jZVBhZ2UuRVFVSVZBTEVOVF9WQUxVRSkpCi0JCQl1c2VyTWF0Y2ggPSBJSW1wb3J0LlJVTEVfRVFVSVZBTEVOVDsKLQkJZWxzZSBpZiAobW9kZS5lcXVhbHMoTWFpblByZWZlcmVuY2VQYWdlLkNPTVBBVElCTEVfVkFMVUUpKQotCQkJdXNlck1hdGNoID0gSUltcG9ydC5SVUxFX0NPTVBBVElCTEU7Ci0JCS8vIEJ5IGRlZmF1bHQsIHVzZSBtYXRjaCBydWxlIGRlZmluZWQgaW4gdGhlIHByZWZlcmVuY2VzCi0JCWludCByZXN1bHRpbmdNYXRjaCA9IHVzZXJNYXRjaDsKLQkJLy9JZiBtYXRjaCBoYXMgYmVlbiBlbmNvZGVkIGluIHRoZSBmZWF0dXJlIHJlZmVyZW5jZSwKLQkJLy8gcGljayB0aGUgbW9zdCBjb25zZXJ2YXRpdmUgb2YgdGhlIHR3byB2YWx1ZXMuCi0JCWlmIChtYXRjaCAhPSBJSW1wb3J0LlJVTEVfUEVSRkVDVCkgewotCQkJaWYgKG1hdGNoID09IElJbXBvcnQuUlVMRV9FUVVJVkFMRU5UCi0JCQkJfHwgdXNlck1hdGNoID09IElJbXBvcnQuUlVMRV9FUVVJVkFMRU5UKQotCQkJCXJlc3VsdGluZ01hdGNoID0gSUltcG9ydC5SVUxFX0VRVUlWQUxFTlQ7Ci0JCQllbHNlCi0JCQkJcmVzdWx0aW5nTWF0Y2ggPSBJSW1wb3J0LlJVTEVfQ09NUEFUSUJMRTsKLQkJfQotCi0JCWlmIChyZXN1bHRpbmdNYXRjaCA9PSBJSW1wb3J0LlJVTEVfRVFVSVZBTEVOVCkKLQkJCXJldHVybiBjdi5pc0VxdWl2YWxlbnRUbyhmdik7Ci0JCWVsc2UgaWYgKHJlc3VsdGluZ01hdGNoID09IElJbXBvcnQuUlVMRV9DT01QQVRJQkxFKQotCQkJcmV0dXJuIGN2LmlzQ29tcGF0aWJsZVdpdGgoZnYpOwotCQllbHNlCi0JCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzUGF0Y2goSUZlYXR1cmUgY2FuZGlkYXRlLCBJU2l0ZUZlYXR1cmVSZWZlcmVuY2UgcmVmKSB7Ci0JCWlmIChyZWYuaXNQYXRjaCgpID09IGZhbHNlKQotCQkJcmV0dXJuIGZhbHNlOwotCQl0cnkgewotCQkJSUZlYXR1cmUgZmVhdHVyZSA9IHJlZi5nZXRGZWF0dXJlKG51bGwpOwotCQkJcmV0dXJuIFVwZGF0ZVVJLmlzUGF0Y2goY2FuZGlkYXRlLCBmZWF0dXJlKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQsIEZvcm1XaWRnZXRGYWN0b3J5IGZhY3RvcnkpIHsKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IGZhY3RvcnkuY3JlYXRlQ29tcG9zaXRlKHBhcmVudCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJLy9sYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDI7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAyOwotCQljb250YWluZXIuc2V0TGF5b3V0KGxheW91dCk7Ci0JCXRhYmxlVmlld2VyID0KLQkJCUNoZWNrYm94VGFibGVWaWV3ZXIubmV3Q2hlY2tMaXN0KAotCQkJCWNvbnRhaW5lciwKLQkJCQlTV1QuTVVMVEkgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCQl0YWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEZlYXR1cmVDb250ZW50UHJvdmlkZXIoKSk7Ci0JCXRhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEZlYXR1cmVMYWJlbFByb3ZpZGVyKCkpOwotCQl0YWJsZVZpZXdlci5zZXRJbnB1dCh0aGlzKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZ2QuaGVpZ2h0SGludCA9IDEwMDsKLQkJdGFibGVWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZ2QpOwotCQlmYWN0b3J5LnBhaW50Qm9yZGVyc0Zvcihjb250YWluZXIpOwotCQlzZXRDb250cm9sKGNvbnRhaW5lcik7Ci0JfQotCXB1YmxpYyB2b2lkIGxvYWQoTWFwIG1hcCwgYm9vbGVhbiBlZGl0YWJsZSkgewotCQlpbml0aWFsaXplKCk7Ci0JCXRhYmxlVmlld2VyLnJlZnJlc2goKTsKLQkJdGFibGVWaWV3ZXIuc2V0QWxsQ2hlY2tlZCh0cnVlKTsKLQkJU3RyaW5nIHZhbHVlID0gKFN0cmluZykgbWFwLmdldCgidW5jaGVja2VkIik7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlTdHJpbmdUb2tlbml6ZXIgc3RvayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodmFsdWUsICI6Iik7Ci0JCXdoaWxlIChzdG9rLmhhc01vcmVUb2tlbnMoKSkgewotCQkJU3RyaW5nIHRva2VuID0gc3Rvay5uZXh0VG9rZW4oKTsKLQkJCWludCBsb2MgPSB0b2tlbi5sYXN0SW5kZXhPZignXycpOwotCQkJU3RyaW5nIGlkOwotCQkJU3RyaW5nIHZlcnNpb24gPSBudWxsOwotCQkJaWYgKGxvYyAhPSAtMSkgewotCQkJCWlkID0gdG9rZW4uc3Vic3RyaW5nKDAsIGxvYyk7Ci0JCQkJdmVyc2lvbiA9IHRva2VuLnN1YnN0cmluZyhsb2MgKyAxKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWQgPSB0b2tlbjsKLQkJCQl2ZXJzaW9uID0gIjAuMC4wIjsKLQkJCX0KLQkJCUNhbmRpZGF0ZSBjID0gZmluZENhbmRpZGF0ZShuZXcgVmVyc2lvbmVkSWRlbnRpZmllcihpZCwgdmVyc2lvbikpOwotCQkJaWYgKGMgIT0gbnVsbCkKLQkJCQl0YWJsZVZpZXdlci5zZXRDaGVja2VkKGMsIGZhbHNlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgQ2FuZGlkYXRlIGZpbmRDYW5kaWRhdGUoVmVyc2lvbmVkSWRlbnRpZmllciB2aWQpIHsKLQkJaWYgKGNhbmRpZGF0ZXMgPT0gbnVsbCkKLQkJCWluaXRpYWxpemUoKTsKLQkJQXJyYXlMaXN0IGxpc3QgPSBnZXRBbGxDYW5kaWRhdGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotCQkJQ2FuZGlkYXRlIGNhbmRpZGF0ZSA9IChDYW5kaWRhdGUpIGNhbmRpZGF0ZXMuZ2V0KGkpOwotCQkJaWYgKGNhbmRpZGF0ZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZXF1YWxzKHZpZCkpCi0JCQkJcmV0dXJuIGNhbmRpZGF0ZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIHZvaWQgc3RvcmUoTWFwIG1hcCkgewotCQlpZiAoY2FuZGlkYXRlcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpbnQgY291bnRlciA9IDA7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCUFycmF5TGlzdCBsaXN0ID0gZ2V0QWxsQ2FuZGlkYXRlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCUNhbmRpZGF0ZSBjYW5kaWRhdGUgPSAoQ2FuZGlkYXRlKSBsaXN0LmdldChpKTsKLQkJCWlmICh0YWJsZVZpZXdlci5nZXRDaGVja2VkKGNhbmRpZGF0ZSkgPT0gZmFsc2UpIHsKLQkJCQlpZiAoY291bnRlciA+IDApCi0JCQkJCWJ1Zi5hcHBlbmQoIjoiKTsKLQkJCQlidWYuYXBwZW5kKGNhbmRpZGF0ZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQkJbWFwLnB1dCgidW5jaGVja2VkIiwgYnVmLnRvU3RyaW5nKCkpOwotCX0KLQotCXByaXZhdGUgQXJyYXlMaXN0IGdldEFsbENhbmRpZGF0ZXMoKSB7Ci0JCUFycmF5TGlzdCBzZWxlY3RlZCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYW5kaWRhdGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlDYW5kaWRhdGUgYyA9IChDYW5kaWRhdGUpIGNhbmRpZGF0ZXMuZ2V0KGkpOwotCQkJYy5hZGRUb0ZsYXRMaXN0KHNlbGVjdGVkLCB0cnVlKTsKLQkJfQotCQlyZXR1cm4gc2VsZWN0ZWQ7Ci0JfQotCXByaXZhdGUgQXJyYXlMaXN0IGdldFNlbGVjdGVkQ2FuZGlkYXRlcygpIHsKLQkJaWYgKHRhYmxlVmlld2VyID09IG51bGwKLQkJCXx8IHRhYmxlVmlld2VyLmdldENvbnRyb2woKSA9PSBudWxsCi0JCQl8fCB0YWJsZVZpZXdlci5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm4gZ2V0QWxsQ2FuZGlkYXRlcygpOwotCQl9IGVsc2UgewotCQkJQXJyYXlMaXN0IHNlbGVjdGVkID0gbmV3IEFycmF5TGlzdCgpOwotCQkJT2JqZWN0W10gc2VsID0gdGFibGVWaWV3ZXIuZ2V0Q2hlY2tlZEVsZW1lbnRzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNlbC5sZW5ndGg7IGkrKykKLQkJCQlzZWxlY3RlZC5hZGQoc2VsW2ldKTsKLQkJCXJldHVybiBzZWxlY3RlZDsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvc2VjdXJpdHkvQmFubmVyUGFnZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3NlY3VyaXR5L0Jhbm5lclBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNlNDg5Mi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvc2VjdXJpdHkvQmFubmVyUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuc2VjdXJpdHk7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2dQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSUltYWdlczsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhbm5lclBhZ2UgZXh0ZW5kcyBEaWFsb2dQYWdlIHsKLQlwcml2YXRlIEltYWdlIGJhbm5lckltYWdlOwotCXB1YmxpYyBCYW5uZXJQYWdlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkvKioKLQkgKiBAc2VlIERpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjbGllbnQgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gMTA7Ci0JCWNsaWVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJQ29tcG9zaXRlIGJhbm5lclBhcmVudCA9IG5ldyBDb21wb3NpdGUoY2xpZW50LCBTV1QuQk9SREVSKTsKLQkJYmFubmVyUGFyZW50LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfVkVSVElDQUwpKTsKLQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWJhbm5lclBhcmVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGJhbm5lclBhcmVudCwgU1dULk5VTEwpOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJbGFiZWwuc2V0SW1hZ2UoZ2V0QmFubmVySW1hZ2UoKSk7Ci0JCQotCQlDb250cm9sIGNvbnRlbnRzID0gY3JlYXRlQ29udGVudHMoY2xpZW50KTsKLQkJY29udGVudHMuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCXNldENvbnRyb2woY2xpZW50KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFVSTCBnZXRCYW5uZXJJbWFnZVVSTCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCXByaXZhdGUgSW1hZ2UgZ2V0QmFubmVySW1hZ2UoKSB7Ci0JCVVSTCBpbWFnZVVSTCA9IGdldEJhbm5lckltYWdlVVJMKCk7Ci0JCUltYWdlIGltYWdlPW51bGw7Ci0JCWlmIChpbWFnZVVSTD09bnVsbCkgewotCQkJLy8gdXNlIGRlZmF1bHQKLQkJCWJhbm5lckltYWdlID0gVXBkYXRlVUlJbWFnZXMuREVTQ19JTlNUQUxMX0JBTk5FUi5jcmVhdGVJbWFnZSgpOwotCQkJaW1hZ2UgPSBiYW5uZXJJbWFnZTsKLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChiYW5uZXJJbWFnZSE9bnVsbCkgewotCQkJYmFubmVySW1hZ2UuZGlzcG9zZSgpOwotCQl9Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCk7Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvc2VjdXJpdHkvSmFyVmVyaWZpY2F0aW9uRGlhbG9nLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvc2VjdXJpdHkvSmFyVmVyaWZpY2F0aW9uRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlNmU3MTYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3NlY3VyaXR5L0phclZlcmlmaWNhdGlvbkRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnNlY3VyaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklWZXJpZmljYXRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSUltYWdlczsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEphclZlcmlmaWNhdGlvbkRpYWxvZyBleHRlbmRzIFRpdGxlQXJlYURpYWxvZyB7Ci0KLQlwcml2YXRlIElWZXJpZmljYXRpb25SZXN1bHQgX1ZlcmlmaWNhdGlvblJlc3VsdCA9IG51bGw7Ci0JcHJpdmF0ZSBJRGlhbG9nUGFnZSBfRGlhbG9nUGFnZTsKLQlwcml2YXRlIENvbXBvc2l0ZSBwYWdlQ29udGFpbmVyOwotCXByaXZhdGUgSW1hZ2UgZGVmYXVsdEltYWdlID0gbnVsbDsKLQlwcml2YXRlIEltYWdlRGVzY3JpcHRvciBkZWZhdWx0SW1hZ2VEZXNjcmlwdG9yID0KLQkJVXBkYXRlVUlJbWFnZXMuREVTQ19JTlNUQUxMX1dJWjsKLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgSmFyVmVyaWZpY2F0aW9uRGlhbG9nLgotCSAqIEBwYXJhbSBwYXJlbnRTaGVsbAotCSAqIEBwYXJhbSBuZXdXaXphcmQKLQkgKi8KLQlwdWJsaWMgSmFyVmVyaWZpY2F0aW9uRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLElEaWFsb2dQYWdlIGRpYWxvZ1BhZ2UsIElWZXJpZmljYXRpb25SZXN1bHQgdmVyaWZpY2F0aW9uUmVzdWx0KSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQkJc2V0U2hlbGxTdHlsZShTV1QuVElUTEUgfCBTV1QuQk9SREVSIHwgU1dULkFQUExJQ0FUSU9OX01PREFMKTsJCQotCQlfVmVyaWZpY2F0aW9uUmVzdWx0ID0gdmVyaWZpY2F0aW9uUmVzdWx0OwotCQlfRGlhbG9nUGFnZSA9IGRpYWxvZ1BhZ2U7Ci0JCWlmIChkaWFsb2dQYWdlIGluc3RhbmNlb2YgSmFyVmVyaWZpY2F0aW9uUGFnZSl7Ci0JCQkoKEphclZlcmlmaWNhdGlvblBhZ2UpX0RpYWxvZ1BhZ2UpLnNldFRpdGxlQXJlYURpYWxvZyh0aGlzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZCBidXR0b25zIHRvIHRoZSBkaWFsb2cncyBidXR0b24gYmFyLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlpZiAoX1ZlcmlmaWNhdGlvblJlc3VsdC5nZXRWZXJpZmljYXRpb25Db2RlKCkKLQkJCSE9IElWZXJpZmljYXRpb25SZXN1bHQuVFlQRV9FTlRSWV9DT1JSVVBURUQpIHsKLQotCQkJaWYgKF9WZXJpZmljYXRpb25SZXN1bHQuaXNGZWF0dXJlVmVyaWZpY2F0aW9uKCkpIHsKLQkJCQljcmVhdGVCdXR0b24oCi0JCQkJCXBhcmVudCwKLQkJCQkJSURpYWxvZ0NvbnN0YW50cy5PS19JRCwKLQkJCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKCJKYXJWZXJpZmljYXRpb25EaWFsb2cuSW5zdGFsbCIpLAotCQkJCQlmYWxzZSk7Ci0JCQkJLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIHsKLQkJCQljcmVhdGVCdXR0b24oCi0JCQkJCXBhcmVudCwKLQkJCQkJSURpYWxvZ0NvbnN0YW50cy5PS19JRCwKLQkJCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKCJKYXJWZXJpZmljYXRpb25EaWFsb2cuQ29udGludWUiKSwKLQkJCQkJZmFsc2UpOwotCQkJCS8vJE5PTi1OTFMtMSQJCQkJCi0JCQl9Ci0KLQkJCS8vIFJhZGlvIGJ1dHRvbjogQ2FuY2VsIGluc3RhbGxhdGlvbgotCQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCQljcmVhdGVCdXR0b24oCi0JCQkJcGFyZW50LAotCQkJCUlEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lELAotCQkJCVVwZGF0ZVVJLmdldFN0cmluZygiSmFyVmVyaWZpY2F0aW9uRGlhbG9nLkNhbmNlbCIpLAotCQkJCXRydWUpOwotCQkJLy8kTk9OLU5MUy0xJAkJCQkJCQkKLQkJfSBlbHNlIHsKLQkJCWNyZWF0ZUJ1dHRvbigKLQkJCQlwYXJlbnQsCi0JCQkJSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsCi0JCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKCJKYXJWZXJpZmljYXRpb25EaWFsb2cuQ2FuY2VsIiksCi0JCQkJdHJ1ZSk7Ci0JCX0KLQkJZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lEKS5zZXRGb2N1cygpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogTWV0aG9kIGRlY2xhcmVkIG9uIERpYWxvZy4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZVBhcmVudCA9IChDb21wb3NpdGUpc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQlzZXRUaXRsZUltYWdlKHRoaXMuZ2V0SW1hZ2UoKSk7Ci0JCXNldFRpdGxlKFVwZGF0ZVVJLmdldFN0cmluZygiSmFyVmVyaWZpY2F0aW9uRGlhbG9nLlRpdGxlIikpOwotCQkKLQkJX0RpYWxvZ1BhZ2UuY3JlYXRlQ29udHJvbChjb21wb3NpdGVQYXJlbnQpOwotCQlwYWdlQ29udGFpbmVyPShDb21wb3NpdGUpX0RpYWxvZ1BhZ2UuZ2V0Q29udHJvbCgpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlwYWdlQ29udGFpbmVyLnNldExheW91dERhdGEoZ2QpOwotCQlwYWdlQ29udGFpbmVyLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7CQkKLQkJCi0JCS8vIEJ1aWxkIHRoZSBzZXBhcmF0b3IgbGluZQotCQlMYWJlbCBzZXBhcmF0b3I9IG5ldyBMYWJlbChjb21wb3NpdGVQYXJlbnQsIFNXVC5IT1JJWk9OVEFMIHwgU1dULlNFUEFSQVRPUik7Ci0JCXNlcGFyYXRvci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCi0JCXJldHVybiBjb21wb3NpdGVQYXJlbnQ7Ci0JfQotCQotCQkvKioKLQkgKiBAc2VlIElEaWFsb2dQYWdlI2dldEltYWdlKCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCWlmIChkZWZhdWx0SW1hZ2UgPT0gbnVsbCkKLQkJCWRlZmF1bHRJbWFnZSA9IGRlZmF1bHRJbWFnZURlc2NyaXB0b3IuY3JlYXRlSW1hZ2UoKTsKLQotCQlyZXR1cm4gZGVmYXVsdEltYWdlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNsb3NlKCkgewotCQkvLyBkaXNwb3NlIG9mIGltYWdlCi0JCWlmIChkZWZhdWx0SW1hZ2UgIT0gbnVsbCkgewotCQkJZGVmYXVsdEltYWdlLmRpc3Bvc2UoKTsKLQkJCWRlZmF1bHRJbWFnZSA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmNsb3NlKCk7CQkKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvc2VjdXJpdHkvSmFyVmVyaWZpY2F0aW9uUGFnZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3NlY3VyaXR5L0phclZlcmlmaWNhdGlvblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRhNzcxMC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvc2VjdXJpdHkvSmFyVmVyaWZpY2F0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnNlY3VyaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuVGl0bGVBcmVhRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5Xb3JrYmVuY2hIZWxwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklWZXJpZmljYXRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgSmFyVmVyaWZpY2F0aW9uUGFnZSBleHRlbmRzIEJhbm5lclBhZ2UgewotCi0JcHJpdmF0ZSBJVmVyaWZpY2F0aW9uUmVzdWx0IF9WZXJpZmljYXRpb25SZXN1bHQgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIF9maWxlTmFtZSA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgX3N0ckZlYXR1cmVOYW1lID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBfc3RySWQgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIF9zdHJQcm92aWRlck5hbWUgPSBudWxsOwotCXByaXZhdGUgVGl0bGVBcmVhRGlhbG9nIF9EaWFsb2c7Ci0JcHJpdmF0ZSBib29sZWFuIG9rVG9JbnN0YWxsID0gZmFsc2U7Ci0JcHJpdmF0ZSBTdHJpbmcgY29tcG9uZW50VmVyaWZpZWQ7Ci0KLQkvKgotCSAqIENvbnN0cnVjdG9yIGZvciBKYXJWZXJpZmljYXRpb25QYWdlLgotCSAqLwotCXB1YmxpYyBKYXJWZXJpZmljYXRpb25QYWdlKElWZXJpZmljYXRpb25SZXN1bHQgdmVyaWZpY2F0aW9uUmVzdWx0KSB7Ci0JCXN1cGVyKFVwZGF0ZVVJLmdldFN0cmluZygiSmFyVmVyaWZpY2F0aW9uRGlhbG9nLlZlcmlmaWNhdGlvbiIpKTsKLQkJX2ZpbGVOYW1lID0gdmVyaWZpY2F0aW9uUmVzdWx0LmdldENvbnRlbnRSZWZlcmVuY2UoKS5nZXRJZGVudGlmaWVyKCk7Ci0JCV9WZXJpZmljYXRpb25SZXN1bHQgPSB2ZXJpZmljYXRpb25SZXN1bHQ7Ci0JCV9zdHJJZCA9IHZlcmlmaWNhdGlvblJlc3VsdC5nZXRGZWF0dXJlKCkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCk7Ci0JCV9zdHJGZWF0dXJlTmFtZSA9IHZlcmlmaWNhdGlvblJlc3VsdC5nZXRGZWF0dXJlKCkuZ2V0TGFiZWwoKTsKLQkJX3N0clByb3ZpZGVyTmFtZSA9IHZlcmlmaWNhdGlvblJlc3VsdC5nZXRGZWF0dXJlKCkuZ2V0UHJvdmlkZXIoKTsKLQkJY29tcG9uZW50VmVyaWZpZWQgPQkodmVyaWZpY2F0aW9uUmVzdWx0LmlzRmVhdHVyZVZlcmlmaWNhdGlvbigpKSA/ICIuRmVhdHVyZSIgOiAiLkZpbGUiOwotCQlva1RvSW5zdGFsbCA9IGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBNZXRob2QgZGVjbGFyZWQgb24gRGlhbG9nLgotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBjb21wb3NpdGVQYXJlbnQpIHsKLQkJV29ya2JlbmNoSGVscC5zZXRIZWxwKGNvbXBvc2l0ZVBhcmVudCwgIm9yZy5lY2xpcHNlLnVwZGF0ZS51aS5KYXJWZXJpZmljYXRpb25QYWdlIik7Ci0JCS8vIENvbXBvc2l0ZTogQ2xpZW50Ci0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGVDbGllbnQgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZVBhcmVudCwgU1dULk5VTEwpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSBsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQljb21wb3NpdGVDbGllbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWNvbXBvc2l0ZUNsaWVudC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQkvLyBUZXh0IEluZm9ybWF0aW9uCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tCQkKLQkJY3JlYXRlVGV4dEFyZWEoY29tcG9zaXRlQ2xpZW50KTsKLQotCQkvLyBDZXJ0aWZpY2F0ZSBBcmVhCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tCi0JCWNyZWF0ZUNlcnRpZmljYXRlQXJlYShjb21wb3NpdGVDbGllbnQpOwotCi0JCS8vIEZpbGUgYW5kIEZlYXR1cmUgSW5mb3JtYXRpb24KLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQkJCi0JCWNyZWF0ZUluZm9ybWF0aW9uQXJlYShjb21wb3NpdGVDbGllbnQpOwotCi0JCS8vIENob2ljZSBBcmVhCi0JCS8vLS0tLS0tLS0tLS0tCQkKLQkJLy9jcmVhdGVDaG9pY2VBcmVhKGNvbXBvc2l0ZUNsaWVudCk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZUNsaWVudDsKLQotCX0KLQotCS8qCi0JICogQ29udGludWUgaW5zdGFsbCBvciBjYW5jZWwgaW5zdGFsbAotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVDaG9pY2VBcmVhKENvbXBvc2l0ZSBjb21wb3NpdGVDbGllbnQpIHsKLQkJaWYgKF9WZXJpZmljYXRpb25SZXN1bHQuZ2V0VmVyaWZpY2F0aW9uQ29kZSgpCi0JCQkhPSBJVmVyaWZpY2F0aW9uUmVzdWx0LlRZUEVfRU5UUllfQ09SUlVQVEVEKSB7Ci0KLQkJCS8vIExhYmVsOiBJbnN0cnVjdGlvbgotCQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0KLQkJCUxhYmVsIGxhYmVsSW5zdHJ1Y3Rpb24gPSBuZXcgTGFiZWwoY29tcG9zaXRlQ2xpZW50LCBTV1QuTlVMTCk7Ci0JCQlsYWJlbEluc3RydWN0aW9uLnNldExheW91dERhdGEoCi0JCQkJbmV3IEdyaWREYXRhKAotCQkJCQlHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcKLQkJCQkJCXwgR3JpZERhdGEuR1JBQl9WRVJUSUNBTAotCQkJCQkJfCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCWlmIChfVmVyaWZpY2F0aW9uUmVzdWx0LmlzRmVhdHVyZVZlcmlmaWNhdGlvbigpKSB7Ci0JCQkJbGFiZWxJbnN0cnVjdGlvbi5zZXRUZXh0KAotCQkJCQlVcGRhdGVVSS5nZXRTdHJpbmcoIkphclZlcmlmaWNhdGlvbkRpYWxvZy5NYXlDaG9vc2VUb0luc3RhbGwiKSk7Ci0JCQkJLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIHsKLQkJCQlsYWJlbEluc3RydWN0aW9uLnNldFRleHQoCi0JCQkJCVVwZGF0ZVVJLmdldFN0cmluZygiSmFyVmVyaWZpY2F0aW9uRGlhbG9nLk1heUNob29zZVRvQ29udGludWUiKSk7Ci0JCQkJLy8kTk9OLU5MUy0xJCAJCQkJCQotCQkJfQotCQkJLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoKLQkgKiBDcmVhdGVzIHRoZSBJbmZvcm1hdGlvbiB0ZXh0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRleHRBcmVhKENvbXBvc2l0ZSBjb21wb3NpdGVDbGllbnQpIHsKLQotCQkvLyBMYWJlbDogSW5mb3JtYXRpb24KLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0KLQkJTGFiZWwgbGFiZWxJbmZvcm1hdGlvbiA9Ci0JCQluZXcgTGFiZWwoY29tcG9zaXRlQ2xpZW50LCBTV1QuV1JBUCk7Ci0JCWxhYmVsSW5mb3JtYXRpb24uc2V0TGF5b3V0RGF0YSgKLQkJCW5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcgfCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQlTdHJpbmdCdWZmZXIgc3RyYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJc3dpdGNoIChfVmVyaWZpY2F0aW9uUmVzdWx0LmdldFZlcmlmaWNhdGlvbkNvZGUoKSkgewotCi0JCQljYXNlIElWZXJpZmljYXRpb25SZXN1bHQuVFlQRV9FTlRSWV9OT1RfU0lHTkVEIDoKLQkJCQlTdHJpbmcgbXNnID0KLQkJCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKAotCQkJCQkJIkphclZlcmlmaWNhdGlvbkRpYWxvZy5BYm91dFRvSW5zdGFsbCIrCi0JCQkJCQljb21wb25lbnRWZXJpZmllZCk7Ci0JCQkJc2V0TWVzc2FnZShtc2csIFdBUk5JTkcpOwotCQkJCXN0cmIuYXBwZW5kKAotCQkJCQlVcGRhdGVVSS5nZXRTdHJpbmcoCi0JCQkJCQkiSmFyVmVyaWZpY2F0aW9uRGlhbG9nLk5vdERpZ2l0YWxseVNpZ25lZCIrCi0JCQkJCQljb21wb25lbnRWZXJpZmllZCkpOwotCQkJCS8vJE5PTi1OTFMtMSQKLQkJCQlzdHJiLmFwcGVuZCgiXHJcbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJc3RyYi5hcHBlbmQoCi0JCQkJCVVwZGF0ZVVJLmdldFN0cmluZygKLQkJCQkJCSJKYXJWZXJpZmljYXRpb25EaWFsb2cuQ2Fubm90VmVyaWZ5UHJvdmlkZXIiKwotCQkJCQkJY29tcG9uZW50VmVyaWZpZWQpKTsKLQkJCQkvLyROT04tTkxTLTEkCi0vKgkJCQlzdHJiLmFwcGVuZCgiXHJcbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKF9WZXJpZmljYXRpb25SZXN1bHQuaXNGZWF0dXJlVmVyaWZpY2F0aW9uKCkpIHsKLQkJCQkJc3RyYi5hcHBlbmQoCi0JCQkJCQlVcGRhdGVVSS5nZXRSZXNvdXJjZVN0cmluZygiSmFyVmVyaWZpY2F0aW9uRGlhbG9nLkluc3RhbGxNYXlDb3JydXB0IikpOwotCQkJCQkvLyROT04tTkxTLTEkCi0JCQkJfSBlbHNlIHsKLQkJCQkJc3RyYi5hcHBlbmQoCi0JCQkJCQlVcGRhdGVVSS5nZXRSZXNvdXJjZVN0cmluZygiSmFyVmVyaWZpY2F0aW9uRGlhbG9nLkNvbnRpbnVlTWF5Q29ycnVwdCIpKTsKLQkJCQkJLy8kTk9OLU5MUy0xJCAJCQkJCQotCQkJCX0KLQkJCQkqLwotCQkJCWxhYmVsSW5mb3JtYXRpb24uc2V0VGV4dChzdHJiLnRvU3RyaW5nKCkpOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIElWZXJpZmljYXRpb25SZXN1bHQuVFlQRV9FTlRSWV9DT1JSVVBURUQgOgotCQkJCW1zZyA9Ci0JCQkJCVVwZGF0ZVVJLmdldFN0cmluZygKLQkJCQkJCSJKYXJWZXJpZmljYXRpb25EaWFsb2cuQ29ycnVwdGVkQ29udGVudCIrCi0JCQkJCQljb21wb25lbnRWZXJpZmllZCk7Ci0JCQkJc2V0TWVzc2FnZShtc2csIEVSUk9SKTsKLQkJCQkvLyROT04tTkxTLTEkCi0JCQkJc3RyYi5hcHBlbmQoCi0JCQkJCVVwZGF0ZVVJLmdldFN0cmluZygKLQkJCQkJCSJKYXJWZXJpZmljYXRpb25EaWFsb2cuQ29tcG9uZW50Tm90SW5zdGFsbGVkIikpOwotCQkJCS8vJE5PTi1OTFMtMSQKLQkJCQlsYWJlbEluZm9ybWF0aW9uLnNldFRleHQoc3RyYi50b1N0cmluZygpKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBJVmVyaWZpY2F0aW9uUmVzdWx0LlRZUEVfRU5UUllfU0lHTkVEX1VOUkVDT0dOSVpFRCA6Ci0JCQkJbXNnID0KLQkJCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKAotCQkJCQkJIkphclZlcmlmaWNhdGlvbkRpYWxvZy5TaWduZWRDb21wb25lbnQiKwotCQkJCQkJY29tcG9uZW50VmVyaWZpZWQpOwotCQkJCS8vJE5PTi1OTFMtMSQKLQkJCQlzZXRNZXNzYWdlKG1zZywgV0FSTklORyk7Ci0JCQkJc3RyYi5hcHBlbmQoCi0JCQkJCVVwZGF0ZVVJLmdldFN0cmluZygKLQkJCQkJCSJKYXJWZXJpZmljYXRpb25EaWFsb2cuVW5rbm93bkNlcnRpZmljYXRlIisKLQkJCQkJCWNvbXBvbmVudFZlcmlmaWVkKSk7Ci0JCQkJLy8kTk9OLU5MUy0xJAotCQkJCXN0cmIuYXBwZW5kKCJcclxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlzdHJiLmFwcGVuZCgKLQkJCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKAotCQkJCQkJIkphclZlcmlmaWNhdGlvbkRpYWxvZy5VbmFibGVUb1ZlcmlmeVByb3ZpZGVyIisKLQkJCQkJCWNvbXBvbmVudFZlcmlmaWVkKSk7Ci0JCQkJLy8kTk9OLU5MUy0xJAotLyoJCQkJc3RyYi5hcHBlbmQoIlxyXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChfVmVyaWZpY2F0aW9uUmVzdWx0LmlzRmVhdHVyZVZlcmlmaWNhdGlvbigpKSB7Ci0JCQkJCXN0cmIuYXBwZW5kKAotCQkJCQkJVXBkYXRlVUkuZ2V0UmVzb3VyY2VTdHJpbmcoIkphclZlcmlmaWNhdGlvbkRpYWxvZy5JbnN0YWxsTWF5Q29ycnVwdCIpKTsKLQkJCQkJLy8kTk9OLU5MUy0xJAotCQkJCX0gZWxzZSB7Ci0JCQkJCXN0cmIuYXBwZW5kKAotCQkJCQkJVXBkYXRlVUkuZ2V0UmVzb3VyY2VTdHJpbmcoIkphclZlcmlmaWNhdGlvbkRpYWxvZy5Db250aW51ZU1heUNvcnJ1cHQiKSk7Ci0JCQkJCS8vJE5PTi1OTFMtMSQgCQkJCQkKLQkJCQl9Ci0JCQkJKi8KLQkJCQlsYWJlbEluZm9ybWF0aW9uLnNldFRleHQoc3RyYi50b1N0cmluZygpKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBJVmVyaWZpY2F0aW9uUmVzdWx0LlRZUEVfRU5UUllfU0lHTkVEX1JFQ09HTklaRUQgOgotCQkJCW1zZyA9Ci0JCQkJCVVwZGF0ZVVJLmdldFN0cmluZygKLQkJCQkJCSJKYXJWZXJpZmljYXRpb25EaWFsb2cuU2lnbmVkQ29tcG9uZW50IisKLQkJCQkJCWNvbXBvbmVudFZlcmlmaWVkKTsKLQkJCQkvLyROT04tTkxTLTEkCi0JCQkJc2V0TWVzc2FnZShtc2csIFdBUk5JTkcpOwotCQkJCXN0cmIuYXBwZW5kKAotCQkJCQlVcGRhdGVVSS5nZXRTdHJpbmcoCi0JCQkJCQkiSmFyVmVyaWZpY2F0aW9uRGlhbG9nLktub3duQ2VydGlmaWNhdGUiKwotCQkJCQkJY29tcG9uZW50VmVyaWZpZWQpKTsKLQkJCQkvLyROT04tTkxTLTEkCi0JCQkJc3RyYi5hcHBlbmQoIlxyXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCXN0cmIuYXBwZW5kKAotCQkJCQlVcGRhdGVVSS5nZXRTdHJpbmcoCi0JCQkJCQkiSmFyVmVyaWZpY2F0aW9uRGlhbG9nLlByb3ZpZGVyS25vd24iKwotCQkJCQkJY29tcG9uZW50VmVyaWZpZWQpKTsKLQkJCQkvLyROT04tTkxTLTEkCi0JCQkJc3RyYi5hcHBlbmQoIlxyXG4iKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkJbGFiZWxJbmZvcm1hdGlvbi5zZXRUZXh0KHN0cmIudG9TdHJpbmcoKSk7Ci0KLS8vCQkJCWNyZWF0ZUNhdXRpb25BcmVhKGNvbXBvc2l0ZUNsaWVudCk7Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBDYXV0aW9uIExhYmVsIGFuZCB0ZXh0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUNhdXRpb25BcmVhKENvbXBvc2l0ZSBjb21wb3NpdGVDbGllbnQpIHsKLQkJLy8gQ29tcG9zaXRlOiBDYXV0aW9uCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGVDYXV0aW9uID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGVDbGllbnQsIFNXVC5OVUxMKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IGxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQljb21wb3NpdGVDYXV0aW9uLnNldExheW91dChsYXlvdXQpOwotCQljb21wb3NpdGVDYXV0aW9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkKLQkJLy8gSWNvbgotCQkvLy0tLS0tCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZUNhdXRpb24sU1dULkxFRlQpOwotCQlsYWJlbC5zZXRJbWFnZShKRmFjZVJlc291cmNlcy5nZXRJbWFnZShUaXRsZUFyZWFEaWFsb2cuRExHX0lNR19NRVNTQUdFX1dBUk5JTkcpKTsKLQkJCi0JCS8vIFRleHQKLQkJLy8tLS0tLQotCQlMYWJlbCBsYWJlbEluZm9ybWF0aW9uQ2F1dGlvbiA9Ci0JCQluZXcgTGFiZWwoY29tcG9zaXRlQ2F1dGlvbiwgU1dULldSQVApOwotCQlsYWJlbEluZm9ybWF0aW9uQ2F1dGlvbi5zZXRUZXh0KAotCQkJVXBkYXRlVUkuZ2V0Rm9ybWF0dGVkTWVzc2FnZSgKLQkJCQkiSmFyVmVyaWZpY2F0aW9uRGlhbG9nLkNhdXRpb24iLAotCQkJCV9zdHJQcm92aWRlck5hbWUpKTsKLQkJLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogUHJlc2VudHMgRmlsZSAmIEZlYXR1cmUgaW5mb3JtYXRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlSW5mb3JtYXRpb25BcmVhKENvbXBvc2l0ZSBjb21wb3NpdGVDbGllbnQpIHsKLQotCQkvLyBDb21wb3NpdGU6IEluZm9ybWF0aW9uIGxhYmVscwotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQlDb21wb3NpdGUgY29tcG9zaXRlSW5mb3JtYXRpb24gPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZUNsaWVudCwgU1dULk5VTEwpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWNvbXBvc2l0ZUluZm9ybWF0aW9uLnNldExheW91dChsYXlvdXQpOwotCQljb21wb3NpdGVJbmZvcm1hdGlvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQkvLyBGZWF0dXJlIG5hbWUKLQkJLy8tLS0tLS0tLS0tLS0tLS0KLQkJTGFiZWwga2V5TGFiZWwgPSBudWxsOwotCQlDTGFiZWwgdmFsdWVMYWJlbCA9IG51bGw7Ci0JCWlmIChfc3RyRmVhdHVyZU5hbWUgIT0gbnVsbCAmJiBfc3RyRmVhdHVyZU5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQlrZXlMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGVJbmZvcm1hdGlvbiwgU1dULk5VTEwpOwotCQkJa2V5TGFiZWwuc2V0VGV4dCgKLQkJCQlVcGRhdGVVSS5nZXRTdHJpbmcoIkphclZlcmlmaWNhdGlvbkRpYWxvZy5GZWF0dXJlTmFtZSIpKTsKLQkJCS8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlTGFiZWwgPSBuZXcgQ0xhYmVsKGNvbXBvc2l0ZUluZm9ybWF0aW9uLCBTV1QuTlVMTCk7Ci0JCQl2YWx1ZUxhYmVsLnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0QmFubmVyRm9udCgpKTsKLQkJCXZhbHVlTGFiZWwuc2V0VGV4dChfc3RyRmVhdHVyZU5hbWUpOwotCQkJdmFsdWVMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJfQotCQkvLyBGZWF0dXJlIGlkZW50aWZpZXIKLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJaWYgKF9zdHJJZCAhPSBudWxsICYmIF9zdHJJZC5sZW5ndGgoKSA+IDApIHsKLQkJCWtleUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZUluZm9ybWF0aW9uLCBTV1QuTlVMTCk7Ci0JCQlrZXlMYWJlbC5zZXRUZXh0KAotCQkJCVVwZGF0ZVVJLmdldFN0cmluZygiSmFyVmVyaWZpY2F0aW9uRGlhbG9nLkZlYXR1cmVJZGVudGlmaWVyIikpOwotCQkJLy8kTk9OLU5MUy0xJAotCQkJdmFsdWVMYWJlbCA9IG5ldyBDTGFiZWwoY29tcG9zaXRlSW5mb3JtYXRpb24sIFNXVC5OVUxMKTsKLQkJCXZhbHVlTGFiZWwuc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXRCYW5uZXJGb250KCkpOwotCQkJdmFsdWVMYWJlbC5zZXRUZXh0KF9zdHJJZCk7Ci0JCQl2YWx1ZUxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQl9Ci0JCS8vIFByb3ZpZGVyIG5hbWUKLQkJLy8tLS0tLS0tLS0tLS0tLQotCQlpZiAoX3N0clByb3ZpZGVyTmFtZSAhPSBudWxsICYmIF9zdHJQcm92aWRlck5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQlrZXlMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGVJbmZvcm1hdGlvbiwgU1dULk5VTEwpOwotCQkJa2V5TGFiZWwuc2V0VGV4dCgKLQkJCQlVcGRhdGVVSS5nZXRTdHJpbmcoIkphclZlcmlmaWNhdGlvbkRpYWxvZy5Qcm92aWRlciIpKTsKLQkJCS8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlTGFiZWwgPSBuZXcgQ0xhYmVsKGNvbXBvc2l0ZUluZm9ybWF0aW9uLCBTV1QuTlVMTCk7Ci0JCQl2YWx1ZUxhYmVsLnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0QmFubmVyRm9udCgpKTsKLQkJCXZhbHVlTGFiZWwuc2V0VGV4dChfc3RyUHJvdmlkZXJOYW1lKTsKLQkJCXZhbHVlTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCX0KLQkJLy8gTGFiZWw6IEZpbGUgbmFtZQotCQkvLy0tLS0tLS0tLS0tLS0tLS0tCi0JCWtleUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZUluZm9ybWF0aW9uLCBTV1QuTlVMTCk7Ci0JCWtleUxhYmVsLnNldFRleHQoCi0JCQlVcGRhdGVVSS5nZXRTdHJpbmcoIkphclZlcmlmaWNhdGlvbkRpYWxvZy5GaWxlTmFtZSIpKTsKLQkJLy8kTk9OLU5MUy0xJAotCQl2YWx1ZUxhYmVsID0gbmV3IENMYWJlbChjb21wb3NpdGVJbmZvcm1hdGlvbiwgU1dULk5VTEwpOwotCQl2YWx1ZUxhYmVsLnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0QmFubmVyRm9udCgpKTsKLQkJdmFsdWVMYWJlbC5zZXRUZXh0KF9maWxlTmFtZSk7Ci0JCXZhbHVlTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JfQotCi0JLyoKLQkgKiBTaG93IGNlcnRpZmljYXRlIGluZm9ybWF0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUNlcnRpZmljYXRlQXJlYShDb21wb3NpdGUgY29tcG9zaXRlQ2xpZW50KSB7Ci0KLQkJaWYgKF9WZXJpZmljYXRpb25SZXN1bHQuZ2V0VmVyaWZpY2F0aW9uQ29kZSgpCi0JCQk9PSBJVmVyaWZpY2F0aW9uUmVzdWx0LlRZUEVfRU5UUllfU0lHTkVEX1VOUkVDT0dOSVpFRAotCQkJfHwgX1ZlcmlmaWNhdGlvblJlc3VsdC5nZXRWZXJpZmljYXRpb25Db2RlKCkKLQkJCQk9PSBJVmVyaWZpY2F0aW9uUmVzdWx0LlRZUEVfRU5UUllfU0lHTkVEX1JFQ09HTklaRUQpIHsKLQkJCS8vIEdyb3VwIGJveAotCQkJLy8tLS0tLS0tLS0tCi0JCQlHcm91cCBncm91cCA9IG5ldyBHcm91cChjb21wb3NpdGVDbGllbnQsIFNXVC5TSEFET1dfRVRDSEVEX0lOKTsKLQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJCWxheW91dC5tYXJnaW5XaWR0aCA9IGxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQkJZ3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQlncm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCWdyb3VwLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKCJKYXJWZXJpZmljYXRpb25EaWFsb2cuQ2VydGlmaWNhdGVJbmZvIikpOwotCi0JCQkvLyBTaWduZXIKLQkJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkJTGFiZWwga2V5TGFiZWwgPSBudWxsOwotCQkJVGV4dCB2YWx1ZVRleHQgPSBudWxsOwotCQkJLy9kYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQkvL2RhdGEuaG9yaXpvbnRhbEluZGVudCA9IDA7Ci0JCQkvL3RleHRJbmZvcm1hdGlvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwkJCQotCQkJaWYgKF9WZXJpZmljYXRpb25SZXN1bHQuZ2V0U2lnbmVySW5mbygpICE9IG51bGwpIHsKLQkJCQlrZXlMYWJlbCA9IG5ldyBMYWJlbChncm91cCwgU1dULk5VTEwpOwotCQkJCWtleUxhYmVsLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKCJKYXJWZXJpZmljYXRpb25EaWFsb2cuU3ViamVjdENBIikpOwotCQkJCWtleUxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORykpOwotCQkJCS8vJE5PTi1OTFMtMSQKLQkJCQl2YWx1ZVRleHQgPSBuZXcgVGV4dChncm91cCwgU1dULk1VTFRJfFNXVC5CT1JERVJ8U1dULldSQVB8U1dULlZfU0NST0xMKTsKLQkJCQl2YWx1ZVRleHQuc2V0VGV4dChfVmVyaWZpY2F0aW9uUmVzdWx0LmdldFNpZ25lckluZm8oKSk7Ci0JCQkJdmFsdWVUZXh0LnNldEVkaXRhYmxlKGZhbHNlKTsKLQkJCQl2YWx1ZVRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQl9Ci0JCQkKLQkJCS8vIEF1dGhlbnRpY2F0b3IKLQkJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCQlpZiAoX1ZlcmlmaWNhdGlvblJlc3VsdC5nZXRWZXJpZmllckluZm8oKSAhPSBudWxsKSB7Ci0JCQkJa2V5TGFiZWwgPSBuZXcgTGFiZWwoZ3JvdXAsIFNXVC5OVUxMKTsKLQkJCQlrZXlMYWJlbC5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZygiSmFyVmVyaWZpY2F0aW9uRGlhbG9nLlJvb3RDQSIpKTsKLQkJCQlrZXlMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpKTsJCQkJCi0JCQkJLy8kTk9OLU5MUy0xJAotCQkJCXZhbHVlVGV4dCA9IG5ldyBUZXh0KGdyb3VwLCBTV1QuTVVMVEl8U1dULkJPUkRFUnxTV1QuV1JBUHxTV1QuVl9TQ1JPTEwpOwotCQkJCXZhbHVlVGV4dC5zZXRUZXh0KF9WZXJpZmljYXRpb25SZXN1bHQuZ2V0VmVyaWZpZXJJbmZvKCkpOwotCQkJCXZhbHVlVGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCQkJdmFsdWVUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBTZXRzIHRoZSBEaWFsb2cKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUaXRsZUFyZWFEaWFsb2coVGl0bGVBcmVhRGlhbG9nIGRpYWxvZykgewotCQlfRGlhbG9nID0gZGlhbG9nOwotCX07Ci0KLQkvKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoU3RyaW5nIG5ld01lc3NhZ2UsIGludCBuZXdUeXBlKSB7Ci0JCXN1cGVyLnNldE1lc3NhZ2UobmV3TWVzc2FnZSwgbmV3VHlwZSk7Ci0JCWlmIChfRGlhbG9nICE9IG51bGwpIHsKLQkJCV9EaWFsb2cuc2V0TWVzc2FnZShuZXdNZXNzYWdlLCBuZXdUeXBlKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3NlY3VyaXR5L0phclZlcmlmaWNhdGlvblNlcnZpY2UuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9zZWN1cml0eS9KYXJWZXJpZmljYXRpb25TZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkNTE4Y2MuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3NlY3VyaXR5L0phclZlcmlmaWNhdGlvblNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5zZWN1cml0eTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnNlY3VyaXR5LkphclZlcmlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkucHJlZmVyZW5jZXMuTWFpblByZWZlcmVuY2VQYWdlOwotLyoqCi0gKgotICovCi1wdWJsaWMgY2xhc3MgSmFyVmVyaWZpY2F0aW9uU2VydmljZSBpbXBsZW1lbnRzIElWZXJpZmljYXRpb25MaXN0ZW5lciB7Ci0KLQkvKgotCSAqIFRoZSBKYXJWZXJpZmllciBpcyBhIGluc3RhbmNlIHZhcmlhYmxlCi0JICogYmFjYXVzZSB3ZSB3YW50IHRvIHJldXNlIGl0IHVwb24gbXVsdGlwbGUgY2FsbHMKLQkgKi8KLQlwcml2YXRlIEphclZlcmlmaWVyIGphclZlcmlmaWVyOwotCi0JLyoKLQkgKiB0aGUgU2hlbGwKLQkgKi8KLQlwcml2YXRlIFNoZWxsIHNoZWxsOwotCi0JLyoKLQkgKiBJZiBubyBzaGVsbCwgY3JlYXRlIGEgbmV3IHNoZWxsIAotCSAqLwotCXB1YmxpYyBKYXJWZXJpZmljYXRpb25TZXJ2aWNlKCkgewotCQl0aGlzKG51bGwpOwotCX0KLQkKLQkvKgotCSAqIAotCSAqLwotCXB1YmxpYyBKYXJWZXJpZmljYXRpb25TZXJ2aWNlKFNoZWxsIGFTaGVsbCkgewotCQlqYXJWZXJpZmllciA9IG5ldyBKYXJWZXJpZmllcigpOwotCQlzaGVsbCA9IGFTaGVsbDsKLQotCQkvLyBmaW5kIHRoZSBkZWZhdWx0IGRpc3BsYXkgYW5kIGdldCB0aGUgYWN0aXZlIHNoZWxsCi0JCWlmIChzaGVsbCA9PSBudWxsKSB7Ci0JCQlmaW5hbCBEaXNwbGF5IGRpc3AgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKLQkJCWlmIChkaXNwID09IG51bGwpIHsKLQkJCQlzaGVsbCA9IG5ldyBTaGVsbChuZXcgRGlzcGxheSgpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZGlzcC5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCXNoZWxsID0gZGlzcC5nZXRBY3RpdmVTaGVsbCgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIAotCSAqLwotCXByaXZhdGUgaW50IG9wZW5XaXphcmQoSVZlcmlmaWNhdGlvblJlc3VsdCByZXN1bHQpIHsKLQkJaW50IGNvZGU7Ci0JCUlEaWFsb2dQYWdlIHBhZ2UgPSBuZXcgSmFyVmVyaWZpY2F0aW9uUGFnZShyZXN1bHQpOwotCQlKYXJWZXJpZmljYXRpb25EaWFsb2cgZGlhbG9nID0KLQkJCQluZXcgSmFyVmVyaWZpY2F0aW9uRGlhbG9nKHNoZWxsLHBhZ2UscmVzdWx0KTsKLQkJZGlhbG9nLmNyZWF0ZSgpOwotCQlkaWFsb2cuZ2V0U2hlbGwoKS5zZXRTaXplKDYwMCwgNTAwKTsKLQkJZGlhbG9nLmdldFNoZWxsKCkuc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoIkphclZlcmlmaWNhdGlvbkRpYWxvZy53dGl0bGUiKSk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JCWlmIChkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpID09IEphclZlcmlmaWNhdGlvbkRpYWxvZy5PSykKLQkJCWNvZGUgPSBDSE9JQ0VfSU5TVEFMTF9UUlVTVF9BTFdBWVM7Ci0JCWVsc2UKLQkJCWNvZGUgPSBDSE9JQ0VfQUJPUlQ7Ci0KLQkJcmV0dXJuIGNvZGU7Ci0KLQl9Ci0KLQkvKgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgcHJvbXB0KGZpbmFsIElWZXJpZmljYXRpb25SZXN1bHQgdmVyaWZpY2F0aW9uUmVzdWx0KXsKLQkJaWYgKE1haW5QcmVmZXJlbmNlUGFnZS5nZXRDaGVja0RpZ2l0YWxTaWduYXR1cmUoKT09ZmFsc2UpIAotCQkJcmV0dXJuIENIT0lDRV9JTlNUQUxMX1RSVVNUX0FMV0FZUzsKLQotCQlpZiAodmVyaWZpY2F0aW9uUmVzdWx0LmFscmVhZHlTZWVuKCkpIHJldHVybiBDSE9JQ0VfSU5TVEFMTF9UUlVTVF9BTFdBWVM7Ci0KLQkJc3dpdGNoICh2ZXJpZmljYXRpb25SZXN1bHQuZ2V0VmVyaWZpY2F0aW9uQ29kZSgpKSB7Ci0JCQljYXNlIElWZXJpZmljYXRpb25SZXN1bHQuVU5LTk9XTl9FUlJPUiA6Ci0JCQkJCXJldHVybiBDSE9JQ0VfRVJST1I7Ci0KLQkJCWNhc2UgSVZlcmlmaWNhdGlvblJlc3VsdC5WRVJJRklDQVRJT05fQ0FOQ0VMTEVEOgotCQkJCQlyZXR1cm4gQ0hPSUNFX0FCT1JUOwotCi0JCQkvLyBjYW5ub3QgdmVyaWZ5IGl0OiBkbyBub3QgcHJvbXB0IHVzZXIuCi0JCQljYXNlIElWZXJpZmljYXRpb25SZXN1bHQuVFlQRV9FTlRSWV9VTlJFQ09HTklaRUQ6IAotCQkJCXJldHVybiBDSE9JQ0VfSU5TVEFMTF9UUlVTVF9BTFdBWVM7CQkJCQotCQkJCi0JCQlkZWZhdWx0IDoKLQkJCQl7Ci0JCQkJCWZpbmFsIGludFtdIHdpemFyZFJlc3VsdCA9IG5ldyBpbnRbMV07CQkJCQkKLQkJCQkJc2hlbGwuZ2V0RGlzcGxheSgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQl3aXphcmRSZXN1bHRbMF0gPSBvcGVuV2l6YXJkKHZlcmlmaWNhdGlvblJlc3VsdCk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCQlyZXR1cm4gd2l6YXJkUmVzdWx0WzBdOwotCQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9zZWN1cml0eS9VcGRhdGVNYW5hZ2VyQXV0aGVudGljYXRvci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3NlY3VyaXR5L1VwZGF0ZU1hbmFnZXJBdXRoZW50aWNhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1ZjJmN2QuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3NlY3VyaXR5L1VwZGF0ZU1hbmFnZXJBdXRoZW50aWNhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuc2VjdXJpdHk7Ci0KLQotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUk7Ci0KLS8qKgotICogQSB0cmFuc2llbnQgZGF0YWJhc2UgdGhhdCByZW1lbWJlcnMgaW5mb3JtYXRpb24sIHN1Y2ggYXMgdXNlcm5hbWVzIGFuZAotICogcGFzc3dvcmRzLiAgVGhlIGluZm9ybWF0aW9uIGlzIHN0b3JlZCBpbiBtZW1vcnkgb25seSBhbmQgaXMgZGlzY2FydGVkCi0gKiB3aGVuIHRoZSBQbGFmb3JtIHNodXRzIGRvd24uCi0gKi8KLXB1YmxpYyBjbGFzcyBVcGRhdGVNYW5hZ2VyQXV0aGVudGljYXRvciBleHRlbmRzIEF1dGhlbnRpY2F0b3IgewotCi0JLy8gZmllbGRzIG5lZWRlZCBmb3IgY2FjaGluZyB0aGUgcGFzc3dvcmQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkZPX1BBU1NXT1JEID0gInBhc3N3b3JkIjsgLy8kTk9OLU5MUy0xJCAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkZPX1VTRVJOQU1FID0gInVzZXJuYW1lIjsgLy8kTk9OLU5MUy0xJCAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRIX1NDSEVNRSA9ICIiOyAvLyROT04tTkxTLTEkIAotCi0JcHJpdmF0ZSBJbmV0QWRkcmVzcyByZXF1ZXN0aW5nU2l0ZTsKLQlwcml2YXRlIGludCByZXF1ZXN0aW5nUG9ydDsKLQlwcml2YXRlIFN0cmluZyByZXF1ZXN0aW5nUHJvdG9jb2w7Ci0JcHJpdmF0ZSBTdHJpbmcgcmVxdWVzdGluZ1Byb21wdDsKLQlwcml2YXRlIFN0cmluZyByZXF1ZXN0aW5nU2NoZW1lOwotCXByaXZhdGUgTWFwIHNhdmVkUGFzc3dvcmRBdXRoZW50aWNhdGlvbjsKLQotCS8qKgotCSAqIFRoZSBNYXAgY29udGFpbmluZyB0aGUgdXNlcmlkIGFuZCBwYXNzd29yZAotCSAqIEhhc2hNYXAgYWxsb3dzIDxjb2RlPm51bGw8L2NvZGU+IGFzIHRoZSB2YWx1ZQotCSAqLwotCXByaXZhdGUgTWFwIHJlc3VsdCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIHZvaWQgYWRkQXV0aGVudGljYXRpb25JbmZvKFVSTCBzZXJ2ZXJVcmwsIFN0cmluZyByZWFsbSwgU3RyaW5nIHNjaGVtZSwgTWFwIGluZm8pIHsKLQkJdHJ5IHsKLQkJCVBsYXRmb3JtLmFkZEF1dGhvcml6YXRpb25JbmZvKHNlcnZlclVybCwgcmVhbG0sIHNjaGVtZSwgaW5mbyk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJVXBkYXRlVUkubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICoKLQkgKi8KLQlwdWJsaWMgTWFwIGdldEF1dGhlbnRpY2F0aW9uSW5mbyhVUkwgc2VydmVyVXJsLCBTdHJpbmcgcmVhbG0sIFN0cmluZyBzY2hlbWUpIHsKLQkJcmV0dXJuIFBsYXRmb3JtLmdldEF1dGhvcml6YXRpb25JbmZvKHNlcnZlclVybCwgcmVhbG0sIHNjaGVtZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIE1hcCByZXF1ZXN0QXV0aGVudGljYXRpb25JbmZvKFVSTCByZXNvdXJjZVVybCwgU3RyaW5nIHJlYWxtLCBTdHJpbmcgc2NoZW1lKSB7Ci0JCS8vIGFscmVhZHkgY2FsbGVkIGJ5IHJldHJpZXZlCi0JCS8vaWYgKCFlcXVhbHNQcmV2aW91c1JlcXVlc3QocmVzb3VyY2VVcmwsIHJlYWxtLCBzY2hlbWUpKSB7Ci0JCQkvLyBzYXZlIHN0YXRlCi0JCQlJbmV0QWRkcmVzcyBpcCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWlwID0gSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKHJlc291cmNlVXJsLmdldEhvc3QoKSk7Ci0JCQl9IGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJVXBkYXRlVUkubG9nRXhjZXB0aW9uKGUsIGZhbHNlKTsKLQkJCX0KLQotCQkJdGhpcy5yZXF1ZXN0aW5nUG9ydCA9IHJlc291cmNlVXJsLmdldFBvcnQoKTsKLQkJCXRoaXMucmVxdWVzdGluZ1Byb21wdCA9IHJlYWxtOwotCQkJdGhpcy5yZXF1ZXN0aW5nUHJvdG9jb2wgPSByZXNvdXJjZVVybC5nZXRQcm90b2NvbCgpOwotCQkJdGhpcy5yZXF1ZXN0aW5nU2NoZW1lID0gc2NoZW1lOwotCQkJdGhpcy5yZXF1ZXN0aW5nU2l0ZSA9IGlwOwotCi0JCQkvLyB0cnkgdG8gZ2V0IHRoZSBwYXNzd29yZCBpbmZvIGZyb20gdGhlIGluLW1lbW9yeSBkYXRhYmFzZSBmaXJzdAotCQkJTWFwIG1hcCA9IFBsYXRmb3JtLmdldEF1dGhvcml6YXRpb25JbmZvKHJlc291cmNlVXJsLCByZXF1ZXN0aW5nUHJvbXB0LCByZXF1ZXN0aW5nU2NoZW1lKTsKLQkJCWlmIChtYXAgPT0gbnVsbCkgewotCQkJCW1hcCA9IHJldHJpZXZlUGFzc3dvcmRBdXRoZW50aWNhdGlvbihyZXNvdXJjZVVybCwgcmVxdWVzdGluZ1Byb21wdCwgcmVxdWVzdGluZ1NjaGVtZSk7Ci0JCQl9Ci0JCQlzYXZlZFBhc3N3b3JkQXV0aGVudGljYXRpb24gPSBtYXA7Ci0JCS8vfQotCi0JCS8vIHdlIG11c3QgcmV0dXJuIGEgdmFsaWQgTWFwIHdoaWxlIHdlIGludGVybmFsbHkgbWFuYWdlIENhbmNlbCBkaWFsb2cgKG1hcD09bnVsbCAtPiBkaWFsb2cgY2FuY2VsbGVkKQotCQlyZXR1cm4gc2F2ZWRQYXNzd29yZEF1dGhlbnRpY2F0aW9uOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUubmV0Lmh0dHAuY2xpZW50LklBdXRoZW50aWNhdG9yI2FkZFByb3RlY3Rpb25TcGFjZShVUkwsIFN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQcm90ZWN0aW9uU3BhY2UoVVJMIHJlc291cmNlVXJsLCBTdHJpbmcgcmVhbG0pIHsKLQkJdHJ5IHsKLQkJCVBsYXRmb3JtLmFkZFByb3RlY3Rpb25TcGFjZShyZXNvdXJjZVVybCwgcmVhbG0pOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVVwZGF0ZVVJLmxvZ0V4Y2VwdGlvbihlLCBmYWxzZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLm5ldC5odHRwLmNsaWVudC5JQXV0aGVudGljYXRvciNnZXRQcm90ZWN0aW9uU3BhY2UoVVJMKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvdGVjdGlvblNwYWNlKFVSTCByZXNvdXJjZVVybCkgewotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0UHJvdGVjdGlvblNwYWNlKHJlc291cmNlVXJsKTsKLQl9Ci0KLQkvKgotCSAqIGZvcmNlcyBhIHJlZnJlc2gKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldCgpIHsKLQkJcmVxdWVzdGluZ1BvcnQgPSAwOwotCQlyZXF1ZXN0aW5nUHJvbXB0ID0gbnVsbDsKLQkJcmVxdWVzdGluZ1Byb3RvY29sID0gbnVsbDsKLQkJcmVxdWVzdGluZ1NjaGVtZSA9IG51bGw7Ci0JCXJlcXVlc3RpbmdTaXRlID0gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIHJldHVybnMgYSBtYXAgdGhhdCBjb250YWlucyB0aGUgdXNlcmlkIGFuZCB0aGUgcGFzc3dvcmQKLQkgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgZGlhbG9nIGhhcyBiZWVuIGNhbmNlbGxlZAotCSAqLwotCXByaXZhdGUgTWFwIHJldHJpZXZlUGFzc3dvcmRBdXRoZW50aWNhdGlvbihmaW5hbCBVUkwgcmVzb3VyY2VVcmwsIGZpbmFsIFN0cmluZyByZWFsbSwgZmluYWwgU3RyaW5nIHNjaGVtZSkgewotCQlyZXN1bHQgPSBuZXcgSGFzaE1hcCgpOwotCQlpZiAoIkJhc2ljIi5lcXVhbHNJZ25vcmVDYXNlKHNjaGVtZSkpIHsKLQkJCURpc3BsYXkgZGlzcCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotCQkJaWYgKGRpc3AgIT0gbnVsbCkgewotCQkJCXJlc3VsdCA9IHByb21wdEZvclBhc3N3b3JkKHJlc291cmNlVXJsLCByZWFsbSk7Ci0JCQl9IGVsc2UgewotCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJcmVzdWx0ID0gcHJvbXB0Rm9yUGFzc3dvcmQocmVzb3VyY2VVcmwsIHJlYWxtKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qCi0JICogcmV0dXJucyB0cnVlIGlmIHRoaXMgcmVxdWVzdCBpcyB0aGUgc2FtZSBhcyB0aGUgc2F2ZWQgb25lCi0JICogdXNlZCB0byBwcmV2ZW50IGRvdWJsZSBkaWFsb2cgaWYgdXNlciBjYW5jZWxsZWQgb3IgZW50ZXJlZCB3cm9uZyB1c2VyaWQvcGFzc3dvcmQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gZXF1YWxzUHJldmlvdXNSZXF1ZXN0KFVSTCB1cmwsIFN0cmluZyByZWFsbSwgU3RyaW5nIHNjaGVtZSkgewotCi0JCWlmIChyZXF1ZXN0aW5nUG9ydCAhPSB1cmwuZ2V0UG9ydCgpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWlmIChyZXF1ZXN0aW5nUHJvbXB0ICE9IG51bGwgJiYgIXJlcXVlc3RpbmdQcm9tcHQuZXF1YWxzKHJlYWxtKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKHJlcXVlc3RpbmdQcm9tcHQgPT0gbnVsbCAmJiByZWFsbSAhPSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWlmIChyZXF1ZXN0aW5nUHJvdG9jb2wgIT0gbnVsbCAmJiAhcmVxdWVzdGluZ1Byb3RvY29sLmVxdWFscyh1cmwuZ2V0UHJvdG9jb2woKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChyZXF1ZXN0aW5nUHJvdG9jb2wgPT0gbnVsbCAmJiB1cmwuZ2V0UHJvdG9jb2woKSAhPSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWlmIChyZXF1ZXN0aW5nU2NoZW1lICE9IG51bGwgJiYgIXJlcXVlc3RpbmdTY2hlbWUuZXF1YWxzKHNjaGVtZSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChyZXF1ZXN0aW5nU2NoZW1lID09IG51bGwgJiYgc2NoZW1lICE9IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJSW5ldEFkZHJlc3MgaXAgPSBudWxsOwotCQl0cnkgewotCQkJaXAgPSBJbmV0QWRkcmVzcy5nZXRCeU5hbWUodXJsLmdldEhvc3QoKSk7Ci0JCX0gY2F0Y2ggKFVua25vd25Ib3N0RXhjZXB0aW9uIGUpIHsKLQkJCVVwZGF0ZVVJLmxvZ0V4Y2VwdGlvbihlLCBmYWxzZSk7Ci0JCX0KLQotCQlpZiAocmVxdWVzdGluZ1NpdGUgIT0gbnVsbCAmJiAhcmVxdWVzdGluZ1NpdGUuZXF1YWxzKGlwKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKHJlcXVlc3RpbmdTaXRlID09IG51bGwgJiYgaXAgIT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIHJldHVybnMgYSBtYXAgdGhhdCBjb250YWlucyB0aGUgdXNlcmlkIGFuZCB0aGUgcGFzc3dvcmQKLQkgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgZGlhbG9nIGhhcyBiZWVuIGNhbmNlbGxlZAotCSAqLwotCXByaXZhdGUgTWFwIHByb21wdEZvclBhc3N3b3JkKFVSTCByZXNvdXJjZVVybCwgU3RyaW5nIHJlYWxtKSB7Ci0KLQkJTWFwIHJlc3VsdCA9IG51bGw7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKCk7Ci0JCVVzZXJWYWxpZGF0aW9uRGlhbG9nIHVpID0gbmV3IFVzZXJWYWxpZGF0aW9uRGlhbG9nKHNoZWxsLCByZXNvdXJjZVVybCwgcmVhbG0sICIiKTsgLy8kTk9OLU5MUy0xJAotCQl1aS5zZXRVc2VybmFtZU11dGFibGUodHJ1ZSk7Ci0JCXVpLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQl1aS5vcGVuKCk7Ci0KLQkJYm9vbGVhbiBpc0NhbmNlbGxlZCA9IHVpLmdldFJldHVybkNvZGUoKSA9PSBVc2VyVmFsaWRhdGlvbkRpYWxvZy5DQU5DRUw7Ci0JCWlmICghaXNDYW5jZWxsZWQpIHsKLQkJCXJlc3VsdCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlyZXN1bHQucHV0KElORk9fVVNFUk5BTUUsIHVpLmdldFVzZXJpZCgpKTsKLQkJCXJlc3VsdC5wdXQoSU5GT19QQVNTV09SRCwgdWkuZ2V0UGFzc3dvcmQoKSk7Ci0JCX0KLQkJc2hlbGwuZGlzcG9zZSgpOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIEF1dGhlbnRpY2F0b3IjZ2V0UGFzc3dvcmRBdXRoZW50aWNhdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIFBhc3N3b3JkQXV0aGVudGljYXRpb24gZ2V0UGFzc3dvcmRBdXRoZW50aWNhdGlvbigpIHsKLQotCQl0cnkgewotCQkJVVJMIHVybCA9IG5ldyBVUkwoZ2V0UmVxdWVzdGluZ1Byb3RvY29sKCksIGdldFJlcXVlc3RpbmdTaXRlKCkuZ2V0SG9zdE5hbWUoKSwgZ2V0UmVxdWVzdGluZ1BvcnQoKSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQlNYXAgbWFwID0gcmV0cmlldmVQYXNzd29yZEF1dGhlbnRpY2F0aW9uKHVybCk7Ci0KLQkJCVN0cmluZyB1c2VybmFtZSA9IG51bGw7Ci0JCQlTdHJpbmcgcGFzc3dvcmQgPSBudWxsOwotCi0JCQlpZiAobWFwICE9IG51bGwpIHsKLQkJCQl1c2VybmFtZSA9IChTdHJpbmcpIG1hcC5nZXQoSU5GT19VU0VSTkFNRSk7Ci0JCQkJcGFzc3dvcmQgPSAoU3RyaW5nKSBtYXAuZ2V0KElORk9fUEFTU1dPUkQpOwotCQkJfQotCi0JCQlpZiAodXNlcm5hbWUgIT0gbnVsbCAmJiBwYXNzd29yZCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIG5ldyBQYXNzd29yZEF1dGhlbnRpY2F0aW9uKHVzZXJuYW1lLCBwYXNzd29yZC50b0NoYXJBcnJheSgpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCUlTdGF0dXMgc3RhdHVzID0gVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oIiIsIGUpLmdldFN0YXR1cygpOwotCQkJVXBkYXRlVUkubG9nKHN0YXR1cywgZmFsc2UpOwotCQl9Ci0JCXJldHVybiBuZXcgUGFzc3dvcmRBdXRoZW50aWNhdGlvbigiIiwgbmV3IGNoYXJbXSB7ICcgJyB9KTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogCi0JICovCi0JcHJpdmF0ZSBNYXAgcmV0cmlldmVQYXNzd29yZEF1dGhlbnRpY2F0aW9uKFVSTCB1cmwpIHsKLQotCQlpZiAoZXF1YWxzUHJldmlvdXNSZXF1ZXN0KHVybCxnZXRSZXF1ZXN0aW5nUHJvbXB0KCksZ2V0UmVxdWVzdGluZ1NjaGVtZSgpKSkgewotCQkJLy8gc2FtZSByZXF1ZXN0LCB0aGUgdXNlcmlkL3Bhc3N3b3JkIHdhcyB3cm9uZwotCQkJLy8gb3IgdXNlciBjYW5jZWxsZWQuIGZvcmNlIGEgcmVmcmVzaAotCQkJaWYgKHNhdmVkUGFzc3dvcmRBdXRoZW50aWNhdGlvbiAhPSBudWxsKQotCQkJCS8vIG9ubHkgcHJvbXB0IGlmIHRoZSB1c2VyIGRpZG4ndCBjYW5jZWwKLQkJCQlzYXZlZFBhc3N3b3JkQXV0aGVudGljYXRpb24gPSByZXF1ZXN0QXV0aGVudGljYXRpb25JbmZvKHVybCwgcmVxdWVzdGluZ1Byb21wdCwgcmVxdWVzdGluZ1NjaGVtZSk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBzYXZlIHN0YXRlCi0JCQlyZXF1ZXN0aW5nUG9ydCA9IGdldFJlcXVlc3RpbmdQb3J0KCk7Ci0JCQlyZXF1ZXN0aW5nUHJvbXB0ID0gZ2V0UmVxdWVzdGluZ1Byb21wdCgpOwotCQkJcmVxdWVzdGluZ1Byb3RvY29sID0gZ2V0UmVxdWVzdGluZ1Byb3RvY29sKCk7Ci0JCQlyZXF1ZXN0aW5nU2NoZW1lID0gZ2V0UmVxdWVzdGluZ1NjaGVtZSgpOwotCQkJcmVxdWVzdGluZ1NpdGUgPSBnZXRSZXF1ZXN0aW5nU2l0ZSgpOwotCQkJc2F2ZWRQYXNzd29yZEF1dGhlbnRpY2F0aW9uID0gUGxhdGZvcm0uZ2V0QXV0aG9yaXphdGlvbkluZm8odXJsLCByZXF1ZXN0aW5nUHJvbXB0LCByZXF1ZXN0aW5nU2NoZW1lKTsKLQkJCWlmIChzYXZlZFBhc3N3b3JkQXV0aGVudGljYXRpb24gPT0gbnVsbCkgewotCQkJCXNhdmVkUGFzc3dvcmRBdXRoZW50aWNhdGlvbiA9IHJlcXVlc3RBdXRoZW50aWNhdGlvbkluZm8odXJsLCByZXF1ZXN0aW5nUHJvbXB0LCByZXF1ZXN0aW5nU2NoZW1lKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc2F2ZWRQYXNzd29yZEF1dGhlbnRpY2F0aW9uOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3NlY3VyaXR5L1VzZXJWYWxpZGF0aW9uRGlhbG9nLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvc2VjdXJpdHkvVXNlclZhbGlkYXRpb25EaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM2MjViYy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvc2VjdXJpdHkvVXNlclZhbGlkYXRpb25EaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5zZWN1cml0eTsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5Xb3JrYmVuY2hIZWxwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSTsKLQotCi0vKioKLSAqIFVzZXIgYXV0aGVudGljYXRpb24gZGlhbG9nCi0gKi8KLXB1YmxpYyBjbGFzcyBVc2VyVmFsaWRhdGlvbkRpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0JcHJvdGVjdGVkIFRleHQgdXNlcm5hbWVGaWVsZDsKLQlwcm90ZWN0ZWQgVGV4dCBwYXNzd29yZEZpZWxkOwotCi0JcHJvdGVjdGVkIFN0cmluZyBkb21haW47Ci0JcHJvdGVjdGVkIFN0cmluZyByZWFsbTsKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRVc2VybmFtZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIHBhc3N3b3JkID0gbnVsbDsKLQlwcm90ZWN0ZWQgU3RyaW5nIHVzZXJpZCA9IG51bGw7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaXNVc2VybmFtZU11dGFibGUgPSB0cnVlOwotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgVXNlclZhbGlkYXRpb25EaWFsb2cuCi0JICovCi0JcHVibGljIFVzZXJWYWxpZGF0aW9uRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBVUkwgbG9jYXRpb24sIFN0cmluZyByZWFsbSwgU3RyaW5nIGRlZmF1bHROYW1lKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQkJdGhpcy5kZWZhdWx0VXNlcm5hbWUgPSBkZWZhdWx0TmFtZTsKLQkJdGhpcy5kb21haW4gPSBsb2NhdGlvbi5nZXRIb3N0KCk7Ci0JCXRoaXMucmVhbG0gPSByZWFsbTsKLQl9Ci0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgbmV3U2hlbGwpIHsKLQkJc3VwZXIuY29uZmlndXJlU2hlbGwobmV3U2hlbGwpOwotCQluZXdTaGVsbC5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZygiVXNlclZlcmlmaWNhdGlvbkRpYWxvZy5QYXNzd29yZFJlcXVpcmVkIikpOyAvLyROT04tTkxTLTEkCi0JfQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZSgpIHsKLQkJc3VwZXIuY3JlYXRlKCk7Ci0JCS8vYWRkIHNvbWUgZGVmYXVsdCB2YWx1ZXMKLQkJdXNlcm5hbWVGaWVsZC5zZXRUZXh0KGRlZmF1bHRVc2VybmFtZSk7Ci0KLQkJaWYgKGlzVXNlcm5hbWVNdXRhYmxlKSB7Ci0JCQkvL2dpdmUgZm9jdXMgdG8gdXNlcm5hbWUgZmllbGQKLQkJCXVzZXJuYW1lRmllbGQuc2VsZWN0QWxsKCk7Ci0JCQl1c2VybmFtZUZpZWxkLnNldEZvY3VzKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl1c2VybmFtZUZpZWxkLnNldEVkaXRhYmxlKGZhbHNlKTsKLQkJCXBhc3N3b3JkRmllbGQuc2V0Rm9jdXMoKTsKLQkJfQotCX0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIG1haW4gPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMzsKLQkJbWFpbi5zZXRMYXlvdXQobGF5b3V0KTsKLQkJbWFpbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChtYWluLCBTV1QuV1JBUCk7Ci0JCVN0cmluZyB0ZXh0ID0gVXBkYXRlVUkuZ2V0U3RyaW5nKCJVc2VyVmVyaWZpY2F0aW9uRGlhbG9nLkVudGVyTmFtZUFuZFBhc3N3b3JkIikrIHJlYWxtOyAvLyROT04tTkxTLTEkCi0JCXRleHQgKz0gIlxuIiArIFVwZGF0ZVVJLmdldFN0cmluZygiVXNlclZlcmlmaWNhdGlvbkRpYWxvZy5Eb21haW4iKStkb21haW47IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlsYWJlbC5zZXRUZXh0KHRleHQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCWNyZWF0ZVVzZXJuYW1lRmllbGRzKG1haW4pOwotCQljcmVhdGVQYXNzd29yZEZpZWxkcyhtYWluKTsKLQkJV29ya2JlbmNoSGVscC5zZXRIZWxwKG1haW4sICJvcmcuZWNsaXBzZS51cGRhdGUudWkuVXNlclZhbGlkYXRpb25EaWFsb2ciKTsKLQkJcmV0dXJuIG1haW47Ci0JfQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHRocmVlIHdpZGdldHMgdGhhdCByZXByZXNlbnQgdGhlIHVzZXIgbmFtZSBlbnRyeQotCSAqIGFyZWEuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlUGFzc3dvcmRGaWVsZHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQluZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSkuc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoIlVzZXJWZXJpZmljYXRpb25EaWFsb2cuUGFzc3dvcmQiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlwYXNzd29yZEZpZWxkID0gbmV3IFRleHQocGFyZW50LCBTV1QuQk9SREVSKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLndpZHRoSGludCA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuRU5UUllfRklFTERfV0lEVEgpOwotCQlwYXNzd29yZEZpZWxkLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXBhc3N3b3JkRmllbGQuc2V0RWNob0NoYXIoJyonKTsKLQotCQluZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7IC8vc3BhY2VyCi0JfQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHRocmVlIHdpZGdldHMgdGhhdCByZXByZXNlbnQgdGhlIHVzZXIgbmFtZSBlbnRyeQotCSAqIGFyZWEuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlVXNlcm5hbWVGaWVsZHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQluZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSkuc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoIlVzZXJWZXJpZmljYXRpb25EaWFsb2cuVXNlck5hbWUiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQl1c2VybmFtZUZpZWxkID0gbmV3IFRleHQocGFyZW50LCBTV1QuQk9SREVSKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLndpZHRoSGludCA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuRU5UUllfRklFTERfV0lEVEgpOwotCQl1c2VybmFtZUZpZWxkLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOyAvL3NwYWNlcgotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXNzd29yZCBlbnRlcmVkIGJ5IHRoZSB1c2VyLCBvciBudWxsCi0JICogaWYgdGhlIHVzZXIgY2FuY2VsZWQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYXNzd29yZCgpIHsKLQkJcmV0dXJuIHBhc3N3b3JkOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB1c2VybmFtZSBlbnRlcmVkIGJ5IHRoZSB1c2VyLCBvciBudWxsCi0JICogaWYgdGhlIHVzZXIgY2FuY2VsZWQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRVc2VyaWQoKSB7Ci0JCXJldHVybiB1c2VyaWQ7Ci0JfQotCS8qKgotCSAqIE5vdGlmaWVzIHRoYXQgdGhlIG9rIGJ1dHRvbiBvZiB0aGlzIGRpYWxvZyBoYXMgYmVlbiBwcmVzc2VkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLQkJcGFzc3dvcmQgPSBwYXNzd29yZEZpZWxkLmdldFRleHQoKTsKLQkJdXNlcmlkID0gdXNlcm5hbWVGaWVsZC5nZXRUZXh0KCk7Ci0JCXN1cGVyLm9rUHJlc3NlZCgpOwotCX0KLQkvKioKLQkgKiBTZXRzIHdoZXRoZXIgb3Igbm90IHRoZSB1c2VybmFtZSBmaWVsZCBzaG91bGQgYmUgbXV0YWJsZS4KLQkgKiBUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgY3JlYXRlKCksIG90aGVyd2lzZSBpdAotCSAqIHdpbGwgYmUgaWdub3JlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVc2VybmFtZU11dGFibGUoYm9vbGVhbiB2YWx1ZSkgewotCQlpc1VzZXJuYW1lTXV0YWJsZSA9IHZhbHVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9CYXNlVGFibGVWaWV3LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvQmFzZVRhYmxlVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzNjNDZmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9CYXNlVGFibGVWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS52aWV3czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAKLSAqLwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZVRhYmxlVmlldyBleHRlbmRzIEJhc2VWaWV3IHsKLQlwcml2YXRlIFRhYmxlVmlld2VyIHZpZXdlcjsKLQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgQmFzZVRhYmxlVmlldygpIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RydWN0dXJlZFZpZXdlciBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCXJldHVybiB2aWV3ZXIgPQotCQkJbmV3IFRhYmxlVmlld2VyKAotCQkJCXBhcmVudCwKLQkJCQlTV1QuTVVMVEkKLQkJCQkJfCBTV1QuSF9TQ1JPTEwKLQkJCQkJfCBTV1QuVl9TQ1JPTEwKLQkJCQkJfCBTV1QuRlVMTF9TRUxFQ1RJT04KLQkJCQkJfCBzdHlsZSk7Ci0JfQotCQotCXB1YmxpYyBUYWJsZVZpZXdlciBnZXRUYWJsZVZpZXdlcigpIHsKLQkJcmV0dXJuIChUYWJsZVZpZXdlcilnZXRWaWV3ZXIoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL0Jhc2VUcmVlVmlldy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL0Jhc2VUcmVlVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzUwNzMzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9CYXNlVHJlZVZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnZpZXdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkRyaWxsRG93bkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJSW1hZ2VzOwotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBAc2VlIFZpZXdQYXJ0Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlVHJlZVZpZXcgZXh0ZW5kcyBCYXNlVmlldyB7Ci0JcHJpdmF0ZSBEcmlsbERvd25BZGFwdGVyIGRyaWxsRG93bkFkYXB0ZXI7Ci0JcHJvdGVjdGVkIEFjdGlvbiBjb2xsYXBzZUFsbEFjdGlvbjsKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIEJhc2VUcmVlVmlldygpIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RydWN0dXJlZFZpZXdlciBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlcykgewotCQlUcmVlVmlld2VyIHZpZXdlciA9IG5ldyBUcmVlVmlld2VyKHBhcmVudCwgU1dULk1VTFRJIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgc3R5bGVzKTsKLQkJcmV0dXJuIHZpZXdlcjsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdERyaWxsRG93bigpIHsKLQkJZHJpbGxEb3duQWRhcHRlciA9IG5ldyBEcmlsbERvd25BZGFwdGVyKGdldFRyZWVWaWV3ZXIoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRHJpbGxEb3duQWRhcHRlcihJQWN0aW9uQmFycyBiYXJzKSB7Ci0JCWRyaWxsRG93bkFkYXB0ZXIuYWRkTmF2aWdhdGlvbkFjdGlvbnMoYmFycy5nZXRUb29sQmFyTWFuYWdlcigpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkRHJpbGxEb3duQWRhcHRlcihJTWVudU1hbmFnZXIgbWVudSkgewotCQlkcmlsbERvd25BZGFwdGVyLmFkZE5hdmlnYXRpb25BY3Rpb25zKG1lbnUpOyAKLQl9Ci0JCi0JcHVibGljIFRyZWVWaWV3ZXIgZ2V0VHJlZVZpZXdlcigpIHsKLQkJcmV0dXJuIChUcmVlVmlld2VyKWdldFZpZXdlcigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBtYWtlQWN0aW9ucygpIHsKLQkJc3VwZXIubWFrZUFjdGlvbnMoKTsKLQkJY29sbGFwc2VBbGxBY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVRyZWVWaWV3ZXIgdHJlZVZpZXdlciA9IGdldFRyZWVWaWV3ZXIoKTsKLQkJCQl0cmVlVmlld2VyLmdldENvbnRyb2woKS5zZXRSZWRyYXcoZmFsc2UpOwkJCi0JCQkJdHJlZVZpZXdlci5jb2xsYXBzZVRvTGV2ZWwodHJlZVZpZXdlci5nZXRJbnB1dCgpLCBUcmVlVmlld2VyLkFMTF9MRVZFTFMpOwotCQkJCXRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldFJlZHJhdyh0cnVlKTsKLQkJCX0KLQkJfTsKLQkJY29sbGFwc2VBbGxBY3Rpb24uc2V0VGV4dCgiQ29sbGFwc2UgQWxsIik7Ci0JCWNvbGxhcHNlQWxsQWN0aW9uLnNldFRvb2xUaXBUZXh0KCJDb2xsYXBzZSBBbGwiKTsKLQkJY29sbGFwc2VBbGxBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKFVwZGF0ZVVJSW1hZ2VzLkRFU0NfQ09MTEFQU0VfQUxMKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IE9iamVjdCBnZXRSb290T2JqZWN0KCk7Ci0JCi0Jdm9pZCB1cGRhdGVUaXRsZShPYmplY3QgbmV3SW5wdXQpIHsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZyA9IGdldENvbmZpZ3VyYXRpb25FbGVtZW50KCk7Ci0JCWlmIChjb25maWcgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJU3RyaW5nIHZpZXdOYW1lID0gY29uZmlnLmdldEF0dHJpYnV0ZSgibmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChuZXdJbnB1dCA9PSBudWxsCi0JCQl8fCBuZXdJbnB1dC5lcXVhbHMoZ2V0Um9vdE9iamVjdCgpKSkgewotCQkJLy8gcmVzdG9yZSBvbGQKLQkJCXNldFRpdGxlKHZpZXdOYW1lKTsKLQkJCXNldFRpdGxlVG9vbFRpcChnZXRUaXRsZSgpKTsKLQkJfSBlbHNlIHsKLQkJCVN0cmluZyBuYW1lID0KLQkJCQkoKExhYmVsUHJvdmlkZXIpIGdldFZpZXdlcigpLmdldExhYmVsUHJvdmlkZXIoKSkuZ2V0VGV4dCgKLQkJCQkJbmV3SW5wdXQpOwotCQkJc2V0VGl0bGUodmlld05hbWUgKyAiOiAiICsgbmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCXNldFRpdGxlVG9vbFRpcChnZXRUaXRsZSgpKTsKLQkJfQotCX0JCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvQmFzZVZpZXcuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9CYXNlVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGFhYzU2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9CYXNlVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnZpZXdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuV29ya2JlbmNoSGVscDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS4qOwotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBAc2VlIFZpZXdQYXJ0Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlVmlldyBleHRlbmRzIFZpZXdQYXJ0IHsKLQlwcml2YXRlIEFjdGlvbiBzaG93RGV0YWlsc0FjdGlvbjsKLQlwcml2YXRlIFN0cnVjdHVyZWRWaWV3ZXIgdmlld2VyOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU0hPV19ERVRBSUxTID0KLQkJIkJhc2VWaWV3LlBvcHVwLlNob3dEZXRhaWxzIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09ORklSTV9ERUxFVEUgPSAiQ29uZmlybURlbGV0ZS50aXRsZSI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPTkZJUk1fREVMRVRFX01VTFRJUExFID0KLQkJIkNvbmZpcm1EZWxldGUubXVsdGlwbGUiOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DT05GSVJNX0RFTEVURV9TSU5HTEUgPQotCQkiQ29uZmlybURlbGV0ZS5zaW5nbGUiOwotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgQmFzZVZpZXcoKSB7Ci0JfQotCi0JcHVibGljIGFic3RyYWN0IHZvaWQgaW5pdFByb3ZpZGVycygpOwotCQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJ1Y3R1cmVkVmlld2VyIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGVzKTsKLQkKLQlwdWJsaWMgU3RydWN0dXJlZFZpZXdlciBnZXRWaWV3ZXIoKSB7Ci0JCXJldHVybiB2aWV3ZXI7Ci0JfQotCQotCXB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKSB7Ci0JCXJldHVybiB2aWV3ZXIhPW51bGw/dmlld2VyLmdldENvbnRyb2woKTpudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdmlld2VyID0gY3JlYXRlVmlld2VyKHBhcmVudCwgU1dULk5VTEwpOwotCQl2aWV3ZXIuc2V0VXNlSGFzaGxvb2t1cCh0cnVlKTsKLQkJaW5pdFByb3ZpZGVycygpOwotCQlpbml0RHJhZ0FuZERyb3AoKTsKLQkJLy9pbml0UmVmcmVzaEtleSgpOwotCQkvL2luaXRSZW5hbWVLZXkoKTsKLQkJLy91cGRhdGVUaXRsZSgpOwotCi0JCU1lbnVNYW5hZ2VyIG1lbnVNZ3IgPSBuZXcgTWVudU1hbmFnZXIoIiNQb3B1cE1lbnUiKTsgLy8kTk9OLU5MUy0xJAotCQltZW51TWdyLnNldFJlbW92ZUFsbFdoZW5TaG93bih0cnVlKTsKLQkJbWVudU1nci5hZGRNZW51TGlzdGVuZXIobmV3IElNZW51TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJCQltYW5hZ2VyLmFkZChuZXcgR3JvdXBNYXJrZXIoImFkZGl0aW9ucyIpKTsKLQkJCQlCYXNlVmlldy50aGlzLmZpbGxDb250ZXh0TWVudShtYW5hZ2VyKTsKLQkJCX0KLQkJfSk7Ci0JCU1lbnUgbWVudSA9IG1lbnVNZ3IuY3JlYXRlQ29udGV4dE1lbnUodmlld2VyLmdldENvbnRyb2woKSk7Ci0JCXZpZXdlci5nZXRDb250cm9sKCkuc2V0TWVudShtZW51KTsKLQkJZ2V0U2l0ZSgpLnJlZ2lzdGVyQ29udGV4dE1lbnUobWVudU1nciwgdmlld2VyKTsKLQkJbWFrZUFjdGlvbnMoKTsKLQotCQl2aWV3ZXIuZ2V0Q29udHJvbCgpLmFkZEtleUxpc3RlbmVyKG5ldyBLZXlBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBldmVudCkgewotCQkJCWlmIChldmVudC5jaGFyYWN0ZXIgPT0gU1dULkRFTCAmJiBldmVudC5zdGF0ZU1hc2sgPT0gMCkgewotCQkJCQlkZWxldGVLZXlQcmVzc2VkKGV2ZW50LndpZGdldCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQl2aWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQloYW5kbGVTZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJfSk7Ci0JCXZpZXdlci5hZGREb3VibGVDbGlja0xpc3RlbmVyKG5ldyBJRG91YmxlQ2xpY2tMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGRvdWJsZUNsaWNrKERvdWJsZUNsaWNrRXZlbnQgZXZlbnQpIHsKLQkJCQloYW5kbGVEb3VibGVDbGljayhldmVudCk7Ci0JCQl9Ci0JCX0pOwotCQl2aWV3ZXIuZ2V0Q29udHJvbCgpLmFkZEtleUxpc3RlbmVyKG5ldyBLZXlBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSB7Ci0JCQkJaGFuZGxlS2V5UHJlc3NlZChlKTsKLQkJCX0KLQkJfSk7Ci0KLQkJZmlsbEFjdGlvbkJhcnMoZ2V0Vmlld1NpdGUoKS5nZXRBY3Rpb25CYXJzKCkpOwotCi0JCWdldFNpdGUoKS5zZXRTZWxlY3Rpb25Qcm92aWRlcih2aWV3ZXIpOwotCQlwYXJ0Q29udHJvbENyZWF0ZWQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwYXJ0Q29udHJvbENyZWF0ZWQoKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0JCXZpZXdlci5nZXRDb250cm9sKCkuc2V0Rm9jdXMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmaWxsQ29udGV4dE1lbnUoSU1lbnVNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJbWFuYWdlci5hZGQoc2hvd0RldGFpbHNBY3Rpb24pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIG1ha2VBY3Rpb25zKCkgewotCQlzaG93RGV0YWlsc0FjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IFVwZGF0ZVVJLmdldEFjdGl2ZVBhZ2UoKTsKLQkJCQl0cnkgewotCQkJCQlJVmlld1BhcnQgcGFydCA9Ci0JCQkJCQlwYWdlLnNob3dWaWV3KFVwZGF0ZVBlcnNwZWN0aXZlLklEX0RFVEFJTFMpOwotCQkJCQkoKERldGFpbHNWaWV3KSBwYXJ0KS5zZWxlY3Rpb25DaGFuZ2VkKAotCQkJCQkJQmFzZVZpZXcudGhpcywKLQkJCQkJCXZpZXdlci5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJCQlVcGRhdGVVSS5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQlXb3JrYmVuY2hIZWxwLnNldEhlbHAoCi0JCQlzaG93RGV0YWlsc0FjdGlvbiwKLQkJCSJvcmcuZWNsaXBzZS51cGRhdGUudWkuQmFzZVZpZXdlcl9zaG93RGV0YWlsc0FjdGlvbiIpOwotCQlzaG93RGV0YWlsc0FjdGlvbi5zZXRUZXh0KAotCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9TSE9XX0RFVEFJTFMpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0RHJhZ0FuZERyb3AoKSB7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGRlbGV0ZUtleVByZXNzZWQoV2lkZ2V0IHdpZGdldCkgewotCX0KLQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGUpIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVEb3VibGVDbGljayhEb3VibGVDbGlja0V2ZW50IGUpIHsKLQkJc2hvd0RldGFpbHNBY3Rpb24ucnVuKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlS2V5UHJlc3NlZChLZXlFdmVudCBlKSB7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZmlsbEFjdGlvbkJhcnMoSUFjdGlvbkJhcnMgYmFycykgewotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNvbmZpcm1EZWxldGlvbigpIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3NlbCA9Ci0JCQkoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJU3RyaW5nIHRpdGxlID0gVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9DT05GSVJNX0RFTEVURSk7Ci0JCVN0cmluZyBtZXNzYWdlOwotCi0JCWlmIChzc2VsLnNpemUoKSA+IDEpIHsKLQkJCW1lc3NhZ2UgPQotCQkJCVVwZGF0ZVVJLmdldEZvcm1hdHRlZE1lc3NhZ2UoCi0JCQkJCUtFWV9DT05GSVJNX0RFTEVURV9NVUxUSVBMRSwKLQkJCQkJIiIgKyBzc2VsLnNpemUoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlPYmplY3Qgb2JqID0gc3NlbC5nZXRGaXJzdEVsZW1lbnQoKS50b1N0cmluZygpOwotCQkJbWVzc2FnZSA9Ci0JCQkJVXBkYXRlVUkuZ2V0Rm9ybWF0dGVkTWVzc2FnZSgKLQkJCQkJS0VZX0NPTkZJUk1fREVMRVRFX1NJTkdMRSwKLQkJCQkJb2JqLnRvU3RyaW5nKCkpOwotCQl9Ci0JCXJldHVybiBNZXNzYWdlRGlhbG9nLm9wZW5Db25maXJtKAotCQkJdmlld2VyLmdldENvbnRyb2woKS5nZXRTaGVsbCgpLAotCQkJdGl0bGUsCi0JCQltZXNzYWdlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvQ29uZmlndXJhdGlvblZpZXcuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9Db25maWd1cmF0aW9uVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGI1Zjc4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9Db25maWd1cmF0aW9uVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS52aWV3czsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByb3BlcnR5RGlhbG9nQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuV29ya2JlbmNoSGVscDsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLmZvcm1zLlJldmVydFNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnBhcnRzLio7Ci0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIEBzZWUgVmlld1BhcnQKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25WaWV3Ci0JZXh0ZW5kcyBCYXNlVHJlZVZpZXcKLQlpbXBsZW1lbnRzCi0JCUlJbnN0YWxsQ29uZmlndXJhdGlvbkNoYW5nZWRMaXN0ZW5lciwKLQkJSUNvbmZpZ3VyZWRTaXRlQ2hhbmdlZExpc3RlbmVyLAotCQlJTG9jYWxTaXRlQ2hhbmdlZExpc3RlbmVyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NVUlJFTlQgPSAiQ29uZmlndXJhdGlvblZpZXcuY3VycmVudCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9TSE9XX1VOQ09ORl9GRUFUVVJFUyA9Ci0JCSJDb25maWd1cmF0aW9uVmlldy5zaG93VW5jb25mRmVhdHVyZXMiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU0hPV19VTkNPTkZfRkVBVFVSRVNfVE9PTFRJUCA9Ci0JCSJDb25maWd1cmF0aW9uVmlldy5zaG93VW5jb25mRmVhdHVyZXMudG9vbHRpcCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9NSVNTSU5HX09QVElPTkFMX1NUQVRVUyA9Ci0JCSJDb25maWd1cmF0aW9uVmlldy5taXNzaW5nT3B0aW9uYWxTdGF0dXMiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTUlTU0lOR19TVEFUVVMgPQotCQkiQ29uZmlndXJhdGlvblZpZXcubWlzc2luZ1N0YXR1cyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRFX1NIT1dfVU5DT05GID0KLQkJIkNvbmZpZ3VyYXRpb25WaWV3LnNob3dVbmNvbmYiOwotCXByaXZhdGUgSW1hZ2UgZWNsaXBzZUltYWdlOwotCXByaXZhdGUgYm9vbGVhbiBpbml0aWFsaXplZDsKLQlwcml2YXRlIFNhdmVkRm9sZGVyIHNhdmVkRm9sZGVyOwotCXByaXZhdGUgSGlzdG9yeUZvbGRlciBoaXN0b3J5Rm9sZGVyOwotCXByaXZhdGUgQWN0aW9uIHNob3dVbmNvbmZGZWF0dXJlc0FjdGlvbjsKLQlwcml2YXRlIEFjdGlvbiByZXZlcnRBY3Rpb247Ci0JcHJpdmF0ZSBBY3Rpb24gcHJlc2VydmVBY3Rpb247Ci0JcHJpdmF0ZSBBY3Rpb24gdW5saW5rQWN0aW9uOwotCXByaXZhdGUgQWN0aW9uIHJlbW92ZVByZXNlcnZlZEFjdGlvbjsKLQlwcml2YXRlIEFjdGlvbiBwcm9wZXJ0aWVzQWN0aW9uOwotCXByaXZhdGUgQWN0aW9uIHNob3dTdGF0dXNBY3Rpb247Ci0JcHJpdmF0ZSBTaXRlU3RhdGVBY3Rpb24gc2l0ZVN0YXRlQWN0aW9uOwotCXByaXZhdGUgSVVwZGF0ZU1vZGVsQ2hhbmdlZExpc3RlbmVyIG1vZGVsTGlzdGVuZXI7Ci0JcHJpdmF0ZSBib29sZWFuIHJlZnJlc2hMb2NrPWZhbHNlOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUkVTVE9SRSA9ICJDb25maWd1cmF0aW9uVmlldy5Qb3B1cC5yZXN0b3JlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1BSRVNFUlZFID0KLQkJIkNvbmZpZ3VyYXRpb25WaWV3LlBvcHVwLnByZXNlcnZlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1VOTElOSyA9ICJDb25maWd1cmF0aW9uVmlldy5Qb3B1cC51bmxpbmsiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUkVNT1ZFX1BSRVNFUlZFRCA9Ci0JCSJDb25maWd1cmF0aW9uVmlldy5Qb3B1cC5yZW1vdmVQcmVzZXJ2ZWQiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU0hPV19TVEFUVVMgPQotCQkiQ29uZmlndXJhdGlvblZpZXcuUG9wdXAuc2hvd1N0YXR1cyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ISVNUT1JZX0ZPTERFUiA9Ci0JCSJDb25maWd1cmF0aW9uVmlldy5oaXN0b3J5Rm9sZGVyIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NBVkVEX0ZPTERFUiA9Ci0JCSJDb25maWd1cmF0aW9uVmlldy5zYXZlZEZvbGRlciI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9TVEFUVVNfVElUTEUgPQotCQkiQ29uZmlndXJhdGlvblZpZXcuc3RhdHVzVGl0bGUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU1RBVFVTX0RFRkFVTFQgPQotCQkiQ29uZmlndXJhdGlvblZpZXcuc3RhdHVzRGVmYXVsdCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9NSVNTSU5HX0ZFQVRVUkUgPQotCQkiQ29uZmlndXJhdGlvblZpZXcubWlzc2luZ0ZlYXR1cmUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU0FWSU5HX0VSUk9SUyA9Ci0JCSJDb25maWd1cmF0aW9uVmlldy5zYXZpbmdFcnJvcnMiOwotCi0JYWJzdHJhY3QgY2xhc3MgVmlld0ZvbGRlciBleHRlbmRzIFVJTW9kZWxPYmplY3QgewotCQlwcml2YXRlIFN0cmluZyBsYWJlbDsKLQkJcHJpdmF0ZSBJbWFnZSBpbWFnZTsKLQotCQlwdWJsaWMgVmlld0ZvbGRlcihTdHJpbmcgbGFiZWwpIHsKLQkJCXRoaXMubGFiZWwgPSBsYWJlbDsKLQkJCVN0cmluZyBpbWFnZUtleSA9IElTaGFyZWRJbWFnZXMuSU1HX09CSl9GT0xERVI7Ci0JCQlpbWFnZSA9Ci0JCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKS5nZXRJbWFnZShpbWFnZUtleSk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3Mga2V5KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJCXJldHVybiBpbWFnZTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gbGFiZWw7Ci0JCX0KLQkJcHVibGljIGFic3RyYWN0IE9iamVjdFtdIGdldENoaWxkcmVuKCk7Ci0JfQotCi0JY2xhc3MgU2F2ZWRGb2xkZXIgZXh0ZW5kcyBWaWV3Rm9sZGVyIHsKLQkJcHVibGljIFNhdmVkRm9sZGVyKCkgewotCQkJc3VwZXIoVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9TQVZFRF9GT0xERVIpKTsKLQkJfQotCQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oKSB7Ci0JCQl0cnkgewotCQkJCUlMb2NhbFNpdGUgbG9jYWxTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7Ci0JCQkJcmV0dXJuIGludmVydEFycmF5KAotCQkJCQltYWtlQ2hpbGRyZW4obG9jYWxTaXRlLmdldFByZXNlcnZlZENvbmZpZ3VyYXRpb25zKCkpKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSBPYmplY3RbXSBtYWtlQ2hpbGRyZW4oSUluc3RhbGxDb25maWd1cmF0aW9uW10gcHJlc2VydmVkKSB7Ci0JCQlPYmplY3RbXSBjaGlsZHJlbiA9IG5ldyBPYmplY3RbcHJlc2VydmVkLmxlbmd0aF07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHByZXNlcnZlZC5sZW5ndGg7IGkrKykgewotCQkJCWNoaWxkcmVuW2ldID0gbmV3IFByZXNlcnZlZENvbmZpZ3VyYXRpb24ocHJlc2VydmVkW2ldKTsKLQkJCX0KLQkJCXJldHVybiBjaGlsZHJlbjsKLQkJfQotCX0KLQotCWNsYXNzIEhpc3RvcnlGb2xkZXIgZXh0ZW5kcyBWaWV3Rm9sZGVyIHsKLQkJcHVibGljIEhpc3RvcnlGb2xkZXIoKSB7Ci0JCQlzdXBlcihVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX0hJU1RPUllfRk9MREVSKSk7Ci0JCX0KLQkJcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKCkgewotCQkJdHJ5IHsKLQkJCQlJTG9jYWxTaXRlIGxvY2FsU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpOwotCQkJCXJldHVybiBpbnZlcnRBcnJheShsb2NhbFNpdGUuZ2V0Q29uZmlndXJhdGlvbkhpc3RvcnkoKSk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQkJCX0KLQkJfQotCX0KLQotCWNsYXNzIENvbmZpZ3VyYXRpb25Tb3J0ZXIgZXh0ZW5kcyBWaWV3ZXJTb3J0ZXIgewotCQlwdWJsaWMgaW50IGNhdGVnb3J5KE9iamVjdCBvYmopIHsKLQkJCS8vIFRvcCBsZXZlbAotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElMb2NhbFNpdGUpCi0JCQkJcmV0dXJuIDE7Ci0JCQlpZiAob2JqLmVxdWFscyhoaXN0b3J5Rm9sZGVyKSkKLQkJCQlyZXR1cm4gMjsKLQkJCWlmIChvYmouZXF1YWxzKHNhdmVkRm9sZGVyKSkKLQkJCQlyZXR1cm4gMzsKLQkJCQotCQkJLy8gc2l0ZXMKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBJQ29uZmlndXJlZFNpdGVBZGFwdGVyKSB7Ci0JCQkJSUNvbmZpZ3VyZWRTaXRlQWRhcHRlciBhZGFwdGVyID0gKElDb25maWd1cmVkU2l0ZUFkYXB0ZXIpb2JqOwotCQkJCUlDb25maWd1cmVkU2l0ZSBjc2l0ZSA9IGFkYXB0ZXIuZ2V0Q29uZmlndXJlZFNpdGUoKTsKLQkJCQlpZiAoY3NpdGUuaXNQcm9kdWN0U2l0ZSgpKSByZXR1cm4gMTsKLQkJCQlpZiAoY3NpdGUuaXNFeHRlbnNpb25TaXRlKCkpIHJldHVybiAyOwotCQkJCXJldHVybiAzOwotCQkJfQotCi0JCQlyZXR1cm4gc3VwZXIuY2F0ZWdvcnkob2JqKTsKLQkJfQotCQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IGUxLCBPYmplY3QgZTIpIHsKLQkJCWlmIChlMSBpbnN0YW5jZW9mIElJbnN0YWxsQ29uZmlndXJhdGlvbgotCQkJCSYmIGUyIGluc3RhbmNlb2YgSUluc3RhbGxDb25maWd1cmF0aW9uKSB7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VwZXIuY29tcGFyZSh2aWV3ZXIsIGUxLCBlMik7Ci0JCX0KLQl9Ci0KLQljbGFzcyBMb2NhbFNpdGVQcm92aWRlcgotCQlleHRlbmRzIERlZmF1bHRDb250ZW50UHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJVHJlZUNvbnRlbnRQcm92aWRlciB7Ci0JCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZCgKLQkJCVZpZXdlciB2aWV3ZXIsCi0JCQlPYmplY3Qgb2xkSW5wdXQsCi0JCQlPYmplY3QgbmV3SW5wdXQpIHsKLQkJCWlmIChuZXdJbnB1dCA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCXVwZGF0ZVRpdGxlKG5ld0lucHV0KTsKLQkJfQotCQkvKioKLQkJICogQHNlZSBJVHJlZUNvbnRlbnRQcm92aWRlciNnZXRDaGlsZHJlbihPYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudCkgewotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIFVwZGF0ZU1vZGVsKSB7Ci0JCQkJSUxvY2FsU2l0ZSBsb2NhbFNpdGUgPSBnZXRMb2NhbFNpdGUoKTsKLQkJCQlpZiAobG9jYWxTaXRlICE9IG51bGwpCi0JCQkJCXJldHVybiBuZXcgT2JqZWN0W10gewotCQkJCQkJbG9jYWxTaXRlLAotCQkJCQkJaGlzdG9yeUZvbGRlciwKLQkJCQkJCXNhdmVkRm9sZGVyIH07Ci0JCQkJZWxzZQotCQkJCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQkJCX0KLQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBJTG9jYWxTaXRlKSB7Ci0JCQkJcmV0dXJuIG9wZW5Mb2NhbFNpdGUoKTsKLQkJCX0KLQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBWaWV3Rm9sZGVyKSB7Ci0JCQkJcmV0dXJuICgoVmlld0ZvbGRlcikgcGFyZW50KS5nZXRDaGlsZHJlbigpOwotCQkJfQotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIFByZXNlcnZlZENvbmZpZ3VyYXRpb24pIHsKLQkJCQkvLyByZXNvbHZlIHRoZSBhZGFwdGVyCi0JCQkJcGFyZW50ID0gKChQcmVzZXJ2ZWRDb25maWd1cmF0aW9uKSBwYXJlbnQpLmdldENvbmZpZ3VyYXRpb24oKTsKLQkJCX0KLQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBJSW5zdGFsbENvbmZpZ3VyYXRpb24pIHsKLQkJCQlyZXR1cm4gZ2V0Q29uZmlndXJhdGlvblNpdGVzKChJSW5zdGFsbENvbmZpZ3VyYXRpb24pIHBhcmVudCk7Ci0JCQl9Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgSUNvbmZpZ3VyZWRTaXRlQWRhcHRlcikgewotCQkJCUlDb25maWd1cmVkU2l0ZUFkYXB0ZXIgYWRhcHRlciA9Ci0JCQkJCShJQ29uZmlndXJlZFNpdGVBZGFwdGVyKSBwYXJlbnQ7Ci0JCQkJYm9vbGVhbiBzaG93VW5jb25mID0gc2hvd1VuY29uZkZlYXR1cmVzQWN0aW9uLmlzQ2hlY2tlZCgpOwotCQkJCXJldHVybiBnZXRGZWF0dXJlcyhhZGFwdGVyLCAhc2hvd1VuY29uZik7Ci0JCQl9Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyKSB7Ci0JCQkJcmV0dXJuICgoQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyKSBwYXJlbnQpLmdldEluY2x1ZGVkRmVhdHVyZXMoCi0JCQkJCW51bGwpOwotCQkJfQotCQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JCX0KLQotCQlwcml2YXRlIE9iamVjdFtdIGdldENvbmZpZ3VyYXRpb25TaXRlcyhmaW5hbCBJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCQlmaW5hbCBPYmplY3RbXVtdIGJhZyA9IG5ldyBPYmplY3RbMV1bXTsKLQkJCUJ1c3lJbmRpY2F0b3IKLQkJCQkuc2hvd1doaWxlKAotCQkJCQlnZXRWaWV3ZXIoKS5nZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpLAotCQkJCQluZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlJQ29uZmlndXJlZFNpdGVbXSBzaXRlcyA9IGNvbmZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKTsKLQkJCQkJT2JqZWN0W10gYWRhcHRlcnMgPSBuZXcgT2JqZWN0W3NpdGVzLmxlbmd0aF07Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWFkYXB0ZXJzW2ldID0KLQkJCQkJCQluZXcgQ29uZmlndXJlZFNpdGVBZGFwdGVyKGNvbmZpZywgc2l0ZXNbaV0pOwotCQkJCQl9Ci0JCQkJCWJhZ1swXSA9IGFkYXB0ZXJzOwotCQkJCX0KLQkJCX0pOwotCQkJcmV0dXJuIGJhZ1swXTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBjaGlsZCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IHBhcmVudCkgewotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIENvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlcikgewotCQkJCXJldHVybiAoKENvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlcikgcGFyZW50KS5oYXNJbmNsdWRlZEZlYXR1cmVzKAotCQkJCQludWxsKTsKLQkJCX0KLQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBDb25maWd1cmVkU2l0ZUFkYXB0ZXIpIHsKLQkJCQlJQ29uZmlndXJlZFNpdGUgc2l0ZSA9Ci0JCQkJCSgoQ29uZmlndXJlZFNpdGVBZGFwdGVyKSBwYXJlbnQpLmdldENvbmZpZ3VyZWRTaXRlKCk7Ci0JCQkJYm9vbGVhbiBzaG93VW5jb25mID0gc2hvd1VuY29uZkZlYXR1cmVzQWN0aW9uLmlzQ2hlY2tlZCgpOwotCQkJCWlmICghc2hvd1VuY29uZiAmJiBzaXRlLmlzRW5hYmxlZCgpID09IGZhbHNlKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0KSB7Ci0JCQlyZXR1cm4gZ2V0Q2hpbGRyZW4oaW5wdXQpOwotCQl9Ci0JfQotCi0JY2xhc3MgTG9jYWxTaXRlTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgewotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iaikgewotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElMb2NhbFNpdGUpIHsKLQkJCQlBYm91dEluZm8gaW5mbyA9IFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRBYm91dEluZm8oKTsKLQkJCQlTdHJpbmcgcHJvZHVjdE5hbWUgPSBpbmZvLmdldFByb2R1Y3ROYW1lKCk7Ci0JCQkJaWYgKHByb2R1Y3ROYW1lICE9IG51bGwpCi0JCQkJCXJldHVybiBwcm9kdWN0TmFtZTsKLQkJCQlyZXR1cm4gVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9DVVJSRU5UKTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBJSW5zdGFsbENvbmZpZ3VyYXRpb24pIHsKLQkJCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnID0gKElJbnN0YWxsQ29uZmlndXJhdGlvbikgb2JqOwotCQkJCXJldHVybiBjb25maWcuZ2V0TGFiZWwoKTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBJQ29uZmlndXJlZFNpdGVBZGFwdGVyKSB7Ci0JCQkJSUNvbmZpZ3VyZWRTaXRlIGNzaXRlID0KLQkJCQkJKChJQ29uZmlndXJlZFNpdGVBZGFwdGVyKSBvYmopLmdldENvbmZpZ3VyZWRTaXRlKCk7Ci0JCQkJSVNpdGUgc2l0ZSA9IGNzaXRlLmdldFNpdGUoKTsKLQkJCQlyZXR1cm4gc2l0ZS5nZXRVUkwoKS50b1N0cmluZygpOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElGZWF0dXJlQWRhcHRlcikgewotCQkJCXRyeSB7Ci0JCQkJCUlGZWF0dXJlIGZlYXR1cmUgPSAoKElGZWF0dXJlQWRhcHRlcikgb2JqKS5nZXRGZWF0dXJlKG51bGwpOwotCQkJCQlpZiAoZmVhdHVyZSBpbnN0YW5jZW9mIE1pc3NpbmdGZWF0dXJlKSB7Ci0JCQkJCQlyZXR1cm4gVXBkYXRlVUkuZ2V0Rm9ybWF0dGVkTWVzc2FnZSgKLQkJCQkJCQlLRVlfTUlTU0lOR19GRUFUVVJFLAotCQkJCQkJCWZlYXR1cmUuZ2V0TGFiZWwoKSk7Ci0JCQkJCX0KLQkJCQkJU3RyaW5nIHZlcnNpb24gPQotCQkJCQkJZmVhdHVyZQotCQkJCQkJCS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkKLQkJCQkJCQkuZ2V0VmVyc2lvbigpCi0JCQkJCQkJLnRvU3RyaW5nKCk7Ci0JCQkJCXJldHVybiBmZWF0dXJlLmdldExhYmVsKCkgKyAiICIgKyB2ZXJzaW9uOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlyZXR1cm4gIkVycm9yIjsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChvYmopOwotCQl9Ci0JCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3Qgb2JqKSB7Ci0JCQlVcGRhdGVMYWJlbFByb3ZpZGVyIHByb3ZpZGVyID0KLQkJCQlVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0TGFiZWxQcm92aWRlcigpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElMb2NhbFNpdGUpCi0JCQkJcmV0dXJuIGVjbGlwc2VJbWFnZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBJRmVhdHVyZUFkYXB0ZXIpIHsKLQkJCQlyZXR1cm4gZ2V0RmVhdHVyZUltYWdlKHByb3ZpZGVyLCAoSUZlYXR1cmVBZGFwdGVyKSBvYmopOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElDb25maWd1cmVkU2l0ZUFkYXB0ZXIpIHsKLQkJCQlJQ29uZmlndXJlZFNpdGUgY3NpdGUgPQotCQkJCQkoKElDb25maWd1cmVkU2l0ZUFkYXB0ZXIpIG9iaikuZ2V0Q29uZmlndXJlZFNpdGUoKTsKLQkJCQlpbnQgZmxhZ3MgPQotCQkJCQljc2l0ZS5pc1VwZGF0YWJsZSgpID8gMCA6IFVwZGF0ZUxhYmVsUHJvdmlkZXIuRl9MSU5LRUQ7Ci0JCQkJaWYgKGNzaXRlLmlzRW5hYmxlZCgpID09IGZhbHNlKQotCQkJCQlmbGFncyB8PSBVcGRhdGVMYWJlbFByb3ZpZGVyLkZfVU5DT05GSUdVUkVEOwotCQkJCUltYWdlRGVzY3JpcHRvciBkZXNjID0gcHJvdmlkZXIuZ2V0TG9jYWxTaXRlRGVzY3JpcHRvcihjc2l0ZSk7Ci0JCQkJcmV0dXJuIHByb3ZpZGVyLmdldChkZXNjLCBmbGFncyk7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgU2F2ZWRGb2xkZXIpIHsKLQkJCQlyZXR1cm4gcHJvdmlkZXIuZ2V0KFVwZGF0ZVVJSW1hZ2VzLkRFU0NfU0FWRURfT0JKKTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBIaXN0b3J5Rm9sZGVyKSB7Ci0JCQkJcmV0dXJuIHByb3ZpZGVyLmdldChVcGRhdGVVSUltYWdlcy5ERVNDX0hJU1RPUllfT0JKKTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBQcmVzZXJ2ZWRDb25maWd1cmF0aW9uKSB7Ci0JCQkJb2JqID0gKChQcmVzZXJ2ZWRDb25maWd1cmF0aW9uKSBvYmopLmdldENvbmZpZ3VyYXRpb24oKTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBJSW5zdGFsbENvbmZpZ3VyYXRpb24pIHsKLQkJCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnID0gKElJbnN0YWxsQ29uZmlndXJhdGlvbikgb2JqOwotCQkJCWludCBmbGFncyA9Ci0JCQkJCWNvbmZpZy5pc0N1cnJlbnQoKSA/IFNoYXJlZExhYmVsUHJvdmlkZXIuRl9DVVJSRU5UIDogMDsKLQotCQkJCWJvb2xlYW4gY3VycmVudFRpbWVsaW5lID0gaXNDdXJyZW50VGltZWxpbmUoY29uZmlnKTsKLQkJCQlpZiAoIWN1cnJlbnRUaW1lbGluZSkKLQkJCQkJZmxhZ3MgfD0gU2hhcmVkTGFiZWxQcm92aWRlci5GX01PRDsKLQkJCQlyZXR1cm4gcHJvdmlkZXIuZ2V0KFVwZGF0ZVVJSW1hZ2VzLkRFU0NfQ09ORklHX09CSiwgZmxhZ3MpOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwcml2YXRlIGJvb2xlYW4gaXNDdXJyZW50VGltZWxpbmUoSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQkJSUxvY2FsU2l0ZSBsb2NhbFNpdGUgPSBnZXRMb2NhbFNpdGUoKTsKLQkJCWlmIChsb2NhbFNpdGUgPT0gbnVsbCkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjY29uZmlnID0gbG9jYWxTaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCk7Ci0JCQlyZXR1cm4gY29uZmlnLmdldFRpbWVsaW5lKCkgPT0gY2NvbmZpZy5nZXRUaW1lbGluZSgpOwotCQl9Ci0KLQkJcHJpdmF0ZSBJbWFnZSBnZXRGZWF0dXJlSW1hZ2UoCi0JCQlVcGRhdGVMYWJlbFByb3ZpZGVyIHByb3ZpZGVyLAotCQkJSUZlYXR1cmVBZGFwdGVyIGFkYXB0ZXIpIHsKLQkJCWJvb2xlYW4gY29uZmlndXJlZCA9IHRydWU7Ci0JCQlib29sZWFuIHVwZGF0ZWQgPSBmYWxzZTsKLQkJCWJvb2xlYW4gY3VycmVudCA9IHRydWU7Ci0JCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXIpIHsKLQkJCQlJQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyIGNhZGFwdGVyID0KLQkJCQkJKElDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXIpIGFkYXB0ZXI7Ci0JCQkJY29uZmlndXJlZCA9IGNhZGFwdGVyLmlzQ29uZmlndXJlZCgpOwotCQkJCXVwZGF0ZWQgPSBjYWRhcHRlci5pc1VwZGF0ZWQoKTsKLQkJCQljdXJyZW50ID0gY2FkYXB0ZXIuZ2V0SW5zdGFsbENvbmZpZ3VyYXRpb24oKS5pc0N1cnJlbnQoKTsKLQkJCX0KLQkJCUlMb2NhbFNpdGUgbG9jYWxTaXRlID0gZ2V0TG9jYWxTaXRlKCk7Ci0JCQl0cnkgewotCQkJCUlGZWF0dXJlIGZlYXR1cmUgPSBhZGFwdGVyLmdldEZlYXR1cmUobnVsbCk7Ci0JCQkJaWYgKGZlYXR1cmUgaW5zdGFuY2VvZiBNaXNzaW5nRmVhdHVyZSkgewotCQkJCQlNaXNzaW5nRmVhdHVyZSBtZmVhdHVyZSA9IChNaXNzaW5nRmVhdHVyZSkgZmVhdHVyZTsKLQkJCQkJaWYgKG1mZWF0dXJlLmlzT3B0aW9uYWwoKSA9PSBmYWxzZSkKLQkJCQkJCXJldHVybiBwcm92aWRlci5nZXQoCi0JCQkJCQkJVXBkYXRlVUlJbWFnZXMuREVTQ19GRUFUVVJFX09CSiwKLQkJCQkJCQlVcGRhdGVMYWJlbFByb3ZpZGVyLkZfRVJST1IpOwotCQkJCQlyZXR1cm4gcHJvdmlkZXIuZ2V0KAotCQkJCQkJVXBkYXRlVUlJbWFnZXMuREVTQ19OT1RJTlNUX0ZFQVRVUkVfT0JKKTsKLQkJCQl9Ci0JCQkJaW50IGNvZGUgPSBJRmVhdHVyZS5TVEFUVVNfSEFQUFk7Ci0JCQkJSW1hZ2VEZXNjcmlwdG9yIGJhc2VEZXNjOwotCQkJCWludCBmbGFncyA9IDA7Ci0JCQkJaWYgKGN1cnJlbnQpIHsKLQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBsb2NhbFNpdGUuZ2V0RmVhdHVyZVN0YXR1cyhmZWF0dXJlKTsKLQkJCQkJY29kZSA9IGdldFN0YXR1c0NvZGUoZmVhdHVyZSwgc3RhdHVzKTsKLQkJCQl9Ci0JCQkJYm9vbGVhbiBlZml4ID0gZmVhdHVyZS5pc1BhdGNoKCk7Ci0JCQkJYmFzZURlc2MgPQotCQkJCQllZml4Ci0JCQkJCQk/IFVwZGF0ZVVJSW1hZ2VzLkRFU0NfRUZJWF9PQkoKLQkJCQkJCTogKGNvbmZpZ3VyZWQKLQkJCQkJCQk/IFVwZGF0ZVVJSW1hZ2VzLkRFU0NfRkVBVFVSRV9PQkoKLQkJCQkJCQk6IFVwZGF0ZVVJSW1hZ2VzLkRFU0NfVU5DT05GX0ZFQVRVUkVfT0JKKTsKLQkJCQlpZiAoZWZpeCAmJiAhY29uZmlndXJlZCkKLQkJCQkJZmxhZ3MgfD0gVXBkYXRlTGFiZWxQcm92aWRlci5GX1VOQ09ORklHVVJFRDsKLQkJCQlzd2l0Y2ggKGNvZGUpIHsKLQkJCQkJY2FzZSBJRmVhdHVyZS5TVEFUVVNfVU5IQVBQWSA6Ci0JCQkJCQlmbGFncyB8PSBVcGRhdGVMYWJlbFByb3ZpZGVyLkZfRVJST1I7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJRmVhdHVyZS5TVEFUVVNfQU1CSUdVT1VTIDoKLQkJCQkJCWZsYWdzIHw9IFVwZGF0ZUxhYmVsUHJvdmlkZXIuRl9XQVJOSU5HOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWRlZmF1bHQgOgotCQkJCQkJaWYgKGNvbmZpZ3VyZWQgJiYgdXBkYXRlZCkKLQkJCQkJCQlmbGFncyB8PSBVcGRhdGVMYWJlbFByb3ZpZGVyLkZfVVBEQVRFRDsKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlyZXR1cm4gcHJvdmlkZXIuZ2V0KGJhc2VEZXNjLCBmbGFncyk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gcHJvdmlkZXIuZ2V0KAotCQkJCQlVcGRhdGVVSUltYWdlcy5ERVNDX0ZFQVRVUkVfT0JKLAotCQkJCQlVcGRhdGVMYWJlbFByb3ZpZGVyLkZfRVJST1IpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIENvbmZpZ3VyYXRpb25WaWV3KCkgewotCQlVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0TGFiZWxQcm92aWRlcigpLmNvbm5lY3QodGhpcyk7Ci0JCWluaXRpYWxpemVJbWFnZXMoKTsKLQkJc2F2ZWRGb2xkZXIgPSBuZXcgU2F2ZWRGb2xkZXIoKTsKLQkJaGlzdG9yeUZvbGRlciA9IG5ldyBIaXN0b3J5Rm9sZGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVJbWFnZXMoKSB7Ci0JCUltYWdlRGVzY3JpcHRvciBlZGVzYyA9IFVwZGF0ZVVJSW1hZ2VzLkRFU0NfQVBQX09CSjsKLQkJQWJvdXRJbmZvIGluZm8gPSBVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0QWJvdXRJbmZvKCk7Ci0JCWlmIChpbmZvLmdldFdpbmRvd0ltYWdlKCkgIT0gbnVsbCkKLQkJCWVkZXNjID0gaW5mby5nZXRXaW5kb3dJbWFnZSgpOwotCQllY2xpcHNlSW1hZ2UgPSBVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0TGFiZWxQcm92aWRlcigpLmdldChlZGVzYyk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdFByb3ZpZGVycygpIHsKLQkJZmluYWwgVHJlZVZpZXdlciB0cmVlVmlld2VyID0gZ2V0VHJlZVZpZXdlcigpOwotCQl0cmVlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgTG9jYWxTaXRlUHJvdmlkZXIoKSk7Ci0JCXRyZWVWaWV3ZXIuc2V0SW5wdXQoVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldFVwZGF0ZU1vZGVsKCkpOwotCQl0cmVlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IExvY2FsU2l0ZUxhYmVsUHJvdmlkZXIoKSk7Ci0JCXRyZWVWaWV3ZXIuc2V0U29ydGVyKG5ldyBDb25maWd1cmF0aW9uU29ydGVyKCkpOwotCQl0cmVlVmlld2VyLmFkZEZpbHRlcihuZXcgVmlld2VyRmlsdGVyKCkgewotCQkJcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2LCBPYmplY3QgcGFyZW50LCBPYmplY3QgZWxlbWVudCkgewotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUNvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlcikgewotCQkJCQlJQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyIGFkYXB0ZXIgPQotCQkJCQkJKElDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXIpIGVsZW1lbnQ7Ci0JCQkJCWlmIChhZGFwdGVyLmlzQ29uZmlndXJlZCgpKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCWJvb2xlYW4gc2hvd1VuY29uZiA9IHNob3dVbmNvbmZGZWF0dXJlc0FjdGlvbi5pc0NoZWNrZWQoKTsKLQkJCQkJcmV0dXJuIHNob3dVbmNvbmY7Ci0JCQkJfQotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9KTsKLQkJdHJ5IHsKLQkJCUlMb2NhbFNpdGUgbG9jYWxTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7Ci0JCQlsb2NhbFNpdGUuYWRkTG9jYWxTaXRlQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVVwZGF0ZVVJLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQlVcGRhdGVNb2RlbCBtb2RlbCA9IFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRVcGRhdGVNb2RlbCgpOwotCQltb2RlbExpc3RlbmVyID0gbmV3IElVcGRhdGVNb2RlbENoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG9iamVjdHNBZGRlZChPYmplY3QgcGFyZW50LCBPYmplY3RbXSBjaGlsZHJlbikgewotCQkJfQotCQkJcHVibGljIHZvaWQgb2JqZWN0c1JlbW92ZWQoT2JqZWN0IHBhcmVudCwgT2JqZWN0W10gY2hpbGRyZW4pIHsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIG9iamVjdENoYW5nZWQoZmluYWwgT2JqZWN0IG9iaiwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQkJaWYgKHJlZnJlc2hMb2NrKSByZXR1cm47Ci0JCQkJZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQl0cmVlVmlld2VyLnJlZnJlc2goKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9OwotCQltb2RlbC5hZGRVcGRhdGVNb2RlbENoYW5nZWRMaXN0ZW5lcihtb2RlbExpc3RlbmVyKTsKLQkJV29ya2JlbmNoSGVscC5zZXRIZWxwKAotCQkJZ2V0Q29udHJvbCgpLAotCQkJIm9yZy5lY2xpcHNlLnVwZGF0ZS51aS5Db25maWd1cmF0aW9uVmlldyIpOwotCX0KLQotCXByaXZhdGUgSUxvY2FsU2l0ZSBnZXRMb2NhbFNpdGUoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJVXBkYXRlVUkubG9nRXhjZXB0aW9uKGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIE9iamVjdFtdIG9wZW5Mb2NhbFNpdGUoKSB7Ci0JCWZpbmFsIE9iamVjdFtdW10gYmFnID0gbmV3IE9iamVjdFsxXVtdOwotCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShnZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJSUxvY2FsU2l0ZSBsb2NhbFNpdGUgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsKLQkJCQkJSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZyA9Ci0JCQkJCQlsb2NhbFNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKTsKLQkJCQkJSUNvbmZpZ3VyZWRTaXRlW10gc2l0ZXMgPSBjb25maWcuZ2V0Q29uZmlndXJlZFNpdGVzKCk7Ci0JCQkJCU9iamVjdFtdIHJlc3VsdCA9IG5ldyBPYmplY3Rbc2l0ZXMubGVuZ3RoXTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXRlcy5sZW5ndGg7IGkrKykgewotCQkJCQkJcmVzdWx0W2ldID0KLQkJCQkJCQluZXcgQ29uZmlndXJlZFNpdGVBZGFwdGVyKGNvbmZpZywgc2l0ZXNbaV0pOwotCQkJCQl9Ci0JCQkJCWlmICghaW5pdGlhbGl6ZWQpIHsKLQkJCQkJCWNvbmZpZy5hZGRJbnN0YWxsQ29uZmlndXJhdGlvbkNoYW5nZWRMaXN0ZW5lcigKLQkJCQkJCQlDb25maWd1cmF0aW9uVmlldy50aGlzKTsKLQkJCQkJCWluaXRpYWxpemVkID0gdHJ1ZTsKLQkJCQkJfQotCQkJCQliYWdbMF0gPSByZXN1bHQ7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVVwZGF0ZVVJLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQkJYmFnWzBdID0gbmV3IE9iamVjdFswXTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gYmFnWzBdOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCVVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRMYWJlbFByb3ZpZGVyKCkuZGlzY29ubmVjdCh0aGlzKTsKLQkJaWYgKGluaXRpYWxpemVkKSB7Ci0JCQl0cnkgewotCQkJCUlMb2NhbFNpdGUgbG9jYWxTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7Ci0JCQkJbG9jYWxTaXRlLnJlbW92ZUxvY2FsU2l0ZUNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQkJCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnID0KLQkJCQkJbG9jYWxTaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCk7Ci0JCQkJY29uZmlnLnJlbW92ZUluc3RhbGxDb25maWd1cmF0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJVXBkYXRlVUkubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQkJaW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQkJfQotCQlVcGRhdGVNb2RlbCBtb2RlbCA9IFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRVcGRhdGVNb2RlbCgpOwotCQltb2RlbC5yZW1vdmVVcGRhdGVNb2RlbENoYW5nZWRMaXN0ZW5lcihtb2RlbExpc3RlbmVyKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQlwcml2YXRlIE9iamVjdCBnZXRTZWxlY3RlZE9iamVjdCgpIHsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBnZXRUcmVlVmlld2VyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbgotCQkJJiYgIXNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCWlmIChzc2VsLnNpemUoKSA9PSAxKSB7Ci0JCQkJcmV0dXJuIHNzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2VsZWN0SGlzdG9yeUZvbGRlcigpIHsKLQkJZ2V0VHJlZVZpZXdlcigpLnNldEV4cGFuZGVkU3RhdGUoaGlzdG9yeUZvbGRlciwgdHJ1ZSk7Ci0JCWdldFRyZWVWaWV3ZXIoKS5zZXRTZWxlY3Rpb24oCi0JCQluZXcgU3RydWN0dXJlZFNlbGVjdGlvbihoaXN0b3J5Rm9sZGVyKSwKLQkJCXRydWUpOwotCX0KLQlwdWJsaWMgdm9pZCBzZWxlY3RDdXJyZW50Q29uZmlndXJhdGlvbigpIHsKLQkJZ2V0VHJlZVZpZXdlcigpLnNldFNlbGVjdGlvbigKLQkJCW5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGdldExvY2FsU2l0ZSgpKSwKLQkJCXRydWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4cGFuZFByZXNlcnZlZENvbmZpZ3VyYXRpb25zKCkgewotCQlnZXRUcmVlVmlld2VyKCkucmVmcmVzaChzYXZlZEZvbGRlcik7Ci0JCWdldFRyZWVWaWV3ZXIoKS5zZXRFeHBhbmRlZFN0YXRlKHNhdmVkRm9sZGVyLCB0cnVlKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2FuUHJlc2VydmUoKSB7Ci0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZ2V0VHJlZVZpZXdlcigpLmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCWlmIChzc2VsLmlzRW1wdHkoKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzc2VsLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoIShvYmogaW5zdGFuY2VvZiBJSW5zdGFsbENvbmZpZ3VyYXRpb24KLQkJCQkJfHwgb2JqIGluc3RhbmNlb2YgSUxvY2FsU2l0ZSkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZG9QcmVzZXJ2ZSgpIHsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBnZXRUcmVlVmlld2VyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCUlMb2NhbFNpdGUgbG9jYWxTaXRlOwotCQlBcnJheUxpc3QgZXJyb3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQlpbnQgbnNhdmVkID0gMDsKLQkJdHJ5IHsKLQkJCWxvY2FsU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVVwZGF0ZVVJLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCWlmIChzc2VsLmlzRW1wdHkoKSkKLQkJCQlyZXR1cm47Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzc2VsLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLQkJCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gdGFyZ2V0ID0KLQkJCQkJZ2V0U2VsZWN0ZWRDb25maWd1cmF0aW9uKG9iaiwgZmFsc2UpOwotCQkJCWlmICh0YXJnZXQgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJdHJ5IHsKLQkJCQkJbG9jYWxTaXRlLmFkZFRvUHJlc2VydmVkQ29uZmlndXJhdGlvbnModGFyZ2V0KTsKLQkJCQkJbnNhdmVkKys7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWVycm9ycy5hZGQoCi0JCQkJCQluZXcgU3RhdHVzKAotCQkJCQkJCUlTdGF0dXMuRVJST1IsCi0JCQkJCQkJVXBkYXRlVUkuZ2V0UGx1Z2luSWQoKSwKLQkJCQkJCQlJU3RhdHVzLk9LLAotCQkJCQkJCW51bGwsCi0JCQkJCQkJZSkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAobnNhdmVkID4gMCkgewotCQkJdHJ5IHsKLQkJCQlsb2NhbFNpdGUuc2F2ZSgpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJVXBkYXRlVUkubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQkJZ2V0VHJlZVZpZXdlcigpLnJlZnJlc2goc2F2ZWRGb2xkZXIpOwotCQkJZ2V0VHJlZVZpZXdlcigpLmV4cGFuZFRvTGV2ZWwoc2F2ZWRGb2xkZXIsIDEpOwotCQl9Ci0JCWlmIChlcnJvcnMuc2l6ZSgpID4gMCkgewotCQkJSVN0YXR1c1tdIGNoaWxkcmVuID0KLQkJCQkoSVN0YXR1c1tdKSBlcnJvcnMudG9BcnJheShuZXcgSVN0YXR1c1tlcnJvcnMuc2l6ZSgpXSk7Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfU0FWSU5HX0VSUk9SUyk7Ci0JCQlNdWx0aVN0YXR1cyBzdGF0dXMgPQotCQkJCW5ldyBNdWx0aVN0YXR1cygKLQkJCQkJVXBkYXRlVUkuZ2V0UGx1Z2luSWQoKSwKLQkJCQkJSVN0YXR1cy5PSywKLQkJCQkJY2hpbGRyZW4sCi0JCQkJCW1lc3NhZ2UsCi0JCQkJCW51bGwpOwotCQkJQ29yZUV4Y2VwdGlvbiBlID0gbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzKTsKLQkJCVVwZGF0ZVVJLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjYW5EZWxldGUoKSB7Ci0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZ2V0VHJlZVZpZXdlcigpLmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCWlmIChzc2VsLmlzRW1wdHkoKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzc2VsLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoIShvYmogaW5zdGFuY2VvZiBQcmVzZXJ2ZWRDb25maWd1cmF0aW9uKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgdm9pZCBkb0RlbGV0ZSgpIHsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBnZXRUcmVlVmlld2VyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCUlMb2NhbFNpdGUgbG9jYWxTaXRlOwotCi0JCWlmICghY29uZmlybURlbGV0aW9uKCkpCi0JCQlyZXR1cm47Ci0KLQkJaW50IG5yZW1vdmVkID0gMDsKLQkJdHJ5IHsKLQkJCWxvY2FsU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVVwZGF0ZVVJLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCWlmIChzc2VsLmlzRW1wdHkoKSkKLQkJCQlyZXR1cm47Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzc2VsLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLQkJCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gdGFyZ2V0ID0gbnVsbDsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgUHJlc2VydmVkQ29uZmlndXJhdGlvbikKLQkJCQkJdGFyZ2V0ID0gKChQcmVzZXJ2ZWRDb25maWd1cmF0aW9uKSBvYmopLmdldENvbmZpZ3VyYXRpb24oKTsKLQkJCQlpZiAodGFyZ2V0ID09IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWxvY2FsU2l0ZS5yZW1vdmVGcm9tUHJlc2VydmVkQ29uZmlndXJhdGlvbnModGFyZ2V0KTsKLQkJCQlucmVtb3ZlZCsrOwotCQkJfQotCQl9Ci0JCWlmIChucmVtb3ZlZCA+IDApIHsKLQkJCXRyeSB7Ci0JCQkJbG9jYWxTaXRlLnNhdmUoKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCVVwZGF0ZVVJLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJCWdldFRyZWVWaWV3ZXIoKS5yZWZyZXNoKHNhdmVkRm9sZGVyKTsKLQkJfQotCX0KLQotCXByaXZhdGUgSUluc3RhbGxDb25maWd1cmF0aW9uIGdldFNlbGVjdGVkQ29uZmlndXJhdGlvbigKLQkJT2JqZWN0IG9iaiwKLQkJYm9vbGVhbiBvbmx5UHJlc2VydmVkKSB7Ci0JCWlmICghb25seVByZXNlcnZlZCkgewotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElJbnN0YWxsQ29uZmlndXJhdGlvbikKLQkJCQlyZXR1cm4gKElJbnN0YWxsQ29uZmlndXJhdGlvbikgb2JqOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElMb2NhbFNpdGUpCi0JCQkJcmV0dXJuICgoSUxvY2FsU2l0ZSkgb2JqKS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpOwotCQl9Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBQcmVzZXJ2ZWRDb25maWd1cmF0aW9uKQotCQkJcmV0dXJuICgoUHJlc2VydmVkQ29uZmlndXJhdGlvbikgb2JqKS5nZXRDb25maWd1cmF0aW9uKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1ByZXNlcnZlZChJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCXRyeSB7Ci0JCQlJTG9jYWxTaXRlIGxvY2FsU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpOwotCQkJSUluc3RhbGxDb25maWd1cmF0aW9uW10gcHJlc2VydmVkQ29uZmlncyA9Ci0JCQkJbG9jYWxTaXRlLmdldFByZXNlcnZlZENvbmZpZ3VyYXRpb25zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHByZXNlcnZlZENvbmZpZ3MubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAocHJlc2VydmVkQ29uZmlnc1tpXS5lcXVhbHMoY29uZmlnKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbWFrZUFjdGlvbnMoKSB7Ci0JCXN1cGVyLm1ha2VBY3Rpb25zKCk7Ci0JCWluaXREcmlsbERvd24oKTsKLQkJZmluYWwgSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzID0KLQkJCVVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXREaWFsb2dTZXR0aW5ncygpOwotCQlib29sZWFuIHNob3dVbmNvbmZTdGF0ZSA9IHNldHRpbmdzLmdldEJvb2xlYW4oU1RBVEVfU0hPV19VTkNPTkYpOwotCQlzaG93VW5jb25mRmVhdHVyZXNBY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWdldFRyZWVWaWV3ZXIoKS5yZWZyZXNoKCk7Ci0JCQkJLy9nZXRUcmVlVmlld2VyKCkucmVmcmVzaCgpOwotCQkJCXNldHRpbmdzLnB1dCgKLQkJCQkJU1RBVEVfU0hPV19VTkNPTkYsCi0JCQkJCXNob3dVbmNvbmZGZWF0dXJlc0FjdGlvbi5pc0NoZWNrZWQoKSk7Ci0JCQl9Ci0JCX07Ci0JCVdvcmtiZW5jaEhlbHAuc2V0SGVscCgKLQkJCXNob3dVbmNvbmZGZWF0dXJlc0FjdGlvbiwKLQkJCSJvcmcuZWNsaXBzZS51cGRhdGUudWkuQ29maWd1cmF0aW9uVmlld19zaG93VW5jb25mRmVhdHVyZXNBY3Rpb24iKTsKLQkJc2hvd1VuY29uZkZlYXR1cmVzQWN0aW9uLnNldFRleHQoCi0JCQlVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX1NIT1dfVU5DT05GX0ZFQVRVUkVTKSk7Ci0JCXNob3dVbmNvbmZGZWF0dXJlc0FjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoCi0JCQlVcGRhdGVVSUltYWdlcy5ERVNDX1VOQ09ORl9GRUFUVVJFX09CSik7Ci0JCXNob3dVbmNvbmZGZWF0dXJlc0FjdGlvbi5zZXRDaGVja2VkKHNob3dVbmNvbmZTdGF0ZSk7Ci0JCXNob3dVbmNvbmZGZWF0dXJlc0FjdGlvbi5zZXRUb29sVGlwVGV4dCgKLQkJCVVwZGF0ZVVJLmdldFN0cmluZyhLRVlfU0hPV19VTkNPTkZfRkVBVFVSRVNfVE9PTFRJUCkpOwotCQlzdXBlci5tYWtlQWN0aW9ucygpOwotCQlpbml0RHJpbGxEb3duKCk7Ci0JCXJldmVydEFjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGdldFNlbGVjdGVkT2JqZWN0KCk7Ci0JCQkJSUluc3RhbGxDb25maWd1cmF0aW9uIHRhcmdldCA9Ci0JCQkJCWdldFNlbGVjdGVkQ29uZmlndXJhdGlvbihvYmosIGZhbHNlKTsKLQkJCQlpZiAodGFyZ2V0ICE9IG51bGwpCi0JCQkJCVJldmVydFNlY3Rpb24ucGVyZm9ybVJldmVydCh0YXJnZXQpOwotCQkJfQotCQl9OwotCQlyZXZlcnRBY3Rpb24uc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX1JFU1RPUkUpKTsKLQkJV29ya2JlbmNoSGVscC5zZXRIZWxwKAotCQkJcmV2ZXJ0QWN0aW9uLAotCQkJIm9yZy5lY2xpcHNlLnVwZGF0ZS51aS5Db2ZpZ3VyYXRpb25WaWV3X3JldmVydEFjdGlvbiIpOwotCi0JCXNob3dTdGF0dXNBY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCU9iamVjdCBvYmogPSBnZXRTZWxlY3RlZE9iamVjdCgpOwotCQkJCXRyeSB7Ci0JCQkJCWlmIChvYmogaW5zdGFuY2VvZiBJRmVhdHVyZUFkYXB0ZXIpIHsKLQkJCQkJCUlGZWF0dXJlIGZlYXR1cmUgPQotCQkJCQkJCSgoSUZlYXR1cmVBZGFwdGVyKSBvYmopLmdldEZlYXR1cmUobnVsbCk7Ci0JCQkJCQlzaG93RmVhdHVyZVN0YXR1cyhmZWF0dXJlKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlVcGRhdGVVSS5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQlXb3JrYmVuY2hIZWxwLnNldEhlbHAoCi0JCQlzaG93U3RhdHVzQWN0aW9uLAotCQkJIm9yZy5lY2xpcHNlLnVwZGF0ZS51aS5Db2ZpZ3VyYXRpb25WaWV3X3Nob3dTdGF0dXNBY3Rpb24iKTsKLQkJc2hvd1N0YXR1c0FjdGlvbi5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfU0hPV19TVEFUVVMpKTsKLQotCQlwcmVzZXJ2ZUFjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJZG9QcmVzZXJ2ZSgpOwotCQkJfQotCQl9OwotCQlXb3JrYmVuY2hIZWxwLnNldEhlbHAoCi0JCQlwcmVzZXJ2ZUFjdGlvbiwKLQkJCSJvcmcuZWNsaXBzZS51cGRhdGUudWkuQ29maWd1cmF0aW9uVmlld19wcmVzZXJ2ZUFjdGlvbiIpOwotCQlwcmVzZXJ2ZUFjdGlvbi5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfUFJFU0VSVkUpKTsKLQkJcmVtb3ZlUHJlc2VydmVkQWN0aW9uID0gbmV3IEFjdGlvbigpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlkb0RlbGV0ZSgpOwotCQkJfQotCQl9OwotCQlXb3JrYmVuY2hIZWxwLnNldEhlbHAoCi0JCQlyZW1vdmVQcmVzZXJ2ZWRBY3Rpb24sCi0JCQkib3JnLmVjbGlwc2UudXBkYXRlLnVpLkNvZmlndXJhdGlvblZpZXdfcmVtb3ZlUHJlc2VydmVkQWN0aW9uIik7Ci0JCXJlbW92ZVByZXNlcnZlZEFjdGlvbi5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfUkVNT1ZFX1BSRVNFUlZFRCkpOwotCi0JCXVubGlua0FjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJcGVyZm9ybVVubGluaygpOwotCQkJfQotCQl9OwotCQlXb3JrYmVuY2hIZWxwLnNldEhlbHAoCi0JCQl1bmxpbmtBY3Rpb24sCi0JCQkib3JnLmVjbGlwc2UudXBkYXRlLnVpLkNvZmlndXJhdGlvblZpZXdfdW5saW5rQWN0aW9uIik7Ci0JCXVubGlua0FjdGlvbi5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfVU5MSU5LKSk7Ci0KLQkJc2l0ZVN0YXRlQWN0aW9uID0gbmV3IFNpdGVTdGF0ZUFjdGlvbigpOwotCi0JCXByb3BlcnRpZXNBY3Rpb24gPQotCQkJbmV3IFByb3BlcnR5RGlhbG9nQWN0aW9uKAotCQkJCVVwZGF0ZVVJLmdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCksCi0JCQkJZ2V0VHJlZVZpZXdlcigpKTsKLQkJV29ya2JlbmNoSGVscC5zZXRIZWxwKAotCQkJcHJvcGVydGllc0FjdGlvbiwKLQkJCSJvcmcuZWNsaXBzZS51cGRhdGUudWkuQ29maWd1cmF0aW9uVmlld19wcm9wZXJ0aWVzQWN0aW9uIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNob3dGZWF0dXJlU3RhdHVzKElGZWF0dXJlIGZlYXR1cmUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVN0YXR1cyBzdGF0dXM7Ci0JCWlmIChmZWF0dXJlIGluc3RhbmNlb2YgTWlzc2luZ0ZlYXR1cmUpIHsKLQkJCU1pc3NpbmdGZWF0dXJlIG1pc3NpbmdGZWF0dXJlID0gKE1pc3NpbmdGZWF0dXJlKSBmZWF0dXJlOwotCQkJU3RyaW5nIG1zZzsKLQkJCWludCBzZXZlcml0eTsKLQotCQkJaWYgKG1pc3NpbmdGZWF0dXJlLmlzT3B0aW9uYWwoKSkgewotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5JTkZPOwotCQkJCW1zZyA9IFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfTUlTU0lOR19PUFRJT05BTF9TVEFUVVMpOwotCQkJfSBlbHNlIHsKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuRVJST1I7Ci0JCQkJbXNnID0gVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9NSVNTSU5HX1NUQVRVUyk7Ci0JCQl9Ci0JCQlzdGF0dXMgPQotCQkJCW5ldyBTdGF0dXMoc2V2ZXJpdHksIFVwZGF0ZVVJLlBMVUdJTl9JRCwgSVN0YXR1cy5PSywgbXNnLCBudWxsKTsKLQkJfSBlbHNlIHsKLQkJCXN0YXR1cyA9IGdldExvY2FsU2l0ZSgpLmdldEZlYXR1cmVTdGF0dXMoZmVhdHVyZSk7Ci0JCX0KLQkJU3RyaW5nIHRpdGxlID0gVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9TVEFUVVNfVElUTEUpOwotCQlpbnQgc2V2ZXJpdHkgPSBzdGF0dXMuZ2V0U2V2ZXJpdHkoKTsKLQkJU3RyaW5nIG1lc3NhZ2UgPSBzdGF0dXMuZ2V0TWVzc2FnZSgpOwotCi0JCWlmIChzZXZlcml0eSA9PSBJU3RhdHVzLkVSUk9SCi0JCQkmJiBzdGF0dXMuZ2V0Q29kZSgpID09IElGZWF0dXJlLlNUQVRVU19VTkhBUFBZKSB7Ci0JCQkvL3NlZSBpZiB0aGlzIGlzIGEgZmFsc2UgYWxhcm0KLQkJCWludCBjb2RlID0gZ2V0U3RhdHVzQ29kZShmZWF0dXJlLCBzdGF0dXMpOwotCQkJaWYgKGNvZGUgPT0gSUZlYXR1cmUuU1RBVFVTX0hBUFBZKSB7Ci0JCQkJLy8gVGhpcyB3YXMgYSBwYXRjaCByZWZlcmVuY2luZyBhCi0JCQkJLy8gc3Vic3VtZWQgcGF0Y2ggLSBjaGFuZ2UgdG8gaGFwcHkuCi0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLklORk87Ci0JCQkJbWVzc2FnZSA9IG51bGw7Ci0JCQl9Ci0JCX0KLQotCQlzd2l0Y2ggKHNldmVyaXR5KSB7Ci0JCQljYXNlIElTdGF0dXMuRVJST1IgOgotCQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcigKLQkJCQkJZ2V0Q29udHJvbCgpLmdldFNoZWxsKCksCi0JCQkJCXRpdGxlLAotCQkJCQludWxsLAotCQkJCQlzdGF0dXMpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJU3RhdHVzLldBUk5JTkcgOgotCQkJCU1lc3NhZ2VEaWFsb2cub3Blbldhcm5pbmcoCi0JCQkJCWdldENvbnRyb2woKS5nZXRTaGVsbCgpLAotCQkJCQl0aXRsZSwKLQkJCQkJc3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElTdGF0dXMuSU5GTyA6Ci0JCQlkZWZhdWx0IDoKLQkJCQlpZiAobWVzc2FnZSA9PSBudWxsIHx8IG1lc3NhZ2UubGVuZ3RoKCkgPT0gMCkKLQkJCQkJbWVzc2FnZSA9IFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfU1RBVFVTX0RFRkFVTFQpOwotCQkJCU1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKAotCQkJCQlnZXRDb250cm9sKCkuZ2V0U2hlbGwoKSwKLQkJCQkJdGl0bGUsCi0JCQkJCW1lc3NhZ2UpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZmlsbEFjdGlvbkJhcnMoSUFjdGlvbkJhcnMgYmFycykgewotCQlJVG9vbEJhck1hbmFnZXIgdGJtID0gYmFycy5nZXRUb29sQmFyTWFuYWdlcigpOwotCQl0Ym0uYWRkKHNob3dVbmNvbmZGZWF0dXJlc0FjdGlvbik7Ci0JCXRibS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJYWRkRHJpbGxEb3duQWRhcHRlcihiYXJzKTsKLQkJdGJtLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQl0Ym0uYWRkKGNvbGxhcHNlQWxsQWN0aW9uKTsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgZmlsbENvbnRleHRNZW51KElNZW51TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCU9iamVjdCBvYmogPSBnZXRTZWxlY3RlZE9iamVjdCgpOwotCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnID0gZ2V0U2VsZWN0ZWRDb25maWd1cmF0aW9uKG9iaiwgZmFsc2UpOwotCQlpZiAoY29uZmlnICE9IG51bGwgJiYgIWNvbmZpZy5pc0N1cnJlbnQoKSkgewotCQkJbWFuYWdlci5hZGQocmV2ZXJ0QWN0aW9uKTsKLQkJCW1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCX0KLQkJaWYgKGNhblByZXNlcnZlKCkpCi0JCQltYW5hZ2VyLmFkZChwcmVzZXJ2ZUFjdGlvbik7Ci0JCWlmIChjYW5EZWxldGUoKSkKLQkJCW1hbmFnZXIuYWRkKHJlbW92ZVByZXNlcnZlZEFjdGlvbik7Ci0KLQkJSUNvbmZpZ3VyZWRTaXRlIHNpdGUgPSBnZXRTZWxlY3RlZFNpdGUob2JqKTsKLQkJaWYgKHNpdGUgIT0gbnVsbCkgewotCQkJSUluc3RhbGxDb25maWd1cmF0aW9uIGNmZyA9IHNpdGUuZ2V0SW5zdGFsbENvbmZpZ3VyYXRpb24oKTsKLQkJCWlmIChjZmcgIT0gbnVsbCAmJiBjZmcuaXNDdXJyZW50KCkpIHsKLQkJCQl0cnkgewotCQkJCQlpZiAoc2l0ZS5pc0V4dGVuc2lvblNpdGUoKSAmJiAhc2l0ZS5pc05hdGl2ZWx5TGlua2VkKCkpIHsKLQkJCQkJCW1hbmFnZXIuYWRkKHVubGlua0FjdGlvbik7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJVXBkYXRlVUkubG9nRXhjZXB0aW9uKGUpOwotCQkJCX0KLQkJCX0KLQkJCXNpdGVTdGF0ZUFjdGlvbi5zZXRTaXRlKHNpdGUpOwotCQkJbWFuYWdlci5hZGQoc2l0ZVN0YXRlQWN0aW9uKTsKLQkJfQotCQltYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQlhZGREcmlsbERvd25BZGFwdGVyKG1hbmFnZXIpOwotCQltYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQlpZiAob2JqIGluc3RhbmNlb2YgSUNvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlcikgewotCQkJSUNvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlciBhZGFwdGVyID0gKElDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXIpIG9iajsKLQkJCWlmIChhZGFwdGVyLmdldEluc3RhbGxDb25maWd1cmF0aW9uKCkuaXNDdXJyZW50KCkpCi0JCQkJbWFuYWdlci5hZGQoc2hvd1N0YXR1c0FjdGlvbik7Ci0JCX0KLQkJc3VwZXIuZmlsbENvbnRleHRNZW51KG1hbmFnZXIpOwotCQlpZiAob2JqIGluc3RhbmNlb2YgUHJlc2VydmVkQ29uZmlndXJhdGlvbgotCQkJfHwgb2JqIGluc3RhbmNlb2YgSUluc3RhbGxDb25maWd1cmF0aW9uKQotCQkJbWFuYWdlci5hZGQocHJvcGVydGllc0FjdGlvbik7Ci0KLQkJLy9kZWZlY3QgMTQ2ODQKLQkJLy9zdXBlci5maWxsQ29udGV4dE1lbnUobWFuYWdlcik7Ci0JfQotCi0JcHJpdmF0ZSBJQ29uZmlndXJlZFNpdGUgZ2V0U2VsZWN0ZWRTaXRlKE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbmZpZ3VyZWRTaXRlQWRhcHRlcikgewotCQkJcmV0dXJuICgoQ29uZmlndXJlZFNpdGVBZGFwdGVyKSBvYmopLmdldENvbmZpZ3VyZWRTaXRlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBlcmZvcm1VbmxpbmsoKSB7Ci0JCUlDb25maWd1cmVkU2l0ZSBzaXRlID0gZ2V0U2VsZWN0ZWRTaXRlKGdldFNlbGVjdGVkT2JqZWN0KCkpOwotCQlpZiAoc2l0ZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnID0gc2l0ZS5nZXRJbnN0YWxsQ29uZmlndXJhdGlvbigpOwotCQljb25maWcucmVtb3ZlQ29uZmlndXJlZFNpdGUoc2l0ZSk7Ci0JCXRyeSB7Ci0JCQlnZXRMb2NhbFNpdGUoKS5zYXZlKCk7Ci0JCQlVcGRhdGVVSS5pbmZvcm1SZXN0YXJ0TmVlZGVkKCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJVXBkYXRlVUkubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyTGlzdGVuZXJzKCkgewotCQl0cnkgewotCQkJSUxvY2FsU2l0ZSBsb2NhbFNpdGUgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsKLQkJCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcgPSBsb2NhbFNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKTsKLQkJCWNvbmZpZy5hZGRJbnN0YWxsQ29uZmlndXJhdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQkJCUlDb25maWd1cmVkU2l0ZVtdIGlzaXRlcyA9IGNvbmZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXNpdGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaXNpdGVzW2ldLmFkZENvbmZpZ3VyZWRTaXRlQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVVwZGF0ZVVJLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB1bnJlZ2lzdGVyTGlzdGVuZXJzKCkgewotCQl0cnkgewotCQkJSUxvY2FsU2l0ZSBsb2NhbFNpdGUgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsKLQkJCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcgPSBsb2NhbFNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKTsKLQkJCWNvbmZpZy5yZW1vdmVJbnN0YWxsQ29uZmlndXJhdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQkJCUlDb25maWd1cmVkU2l0ZVtdIGlzaXRlcyA9IGNvbmZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXNpdGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaXNpdGVzW2ldLnJlbW92ZUNvbmZpZ3VyZWRTaXRlQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVVwZGF0ZVVJLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCX0gLyoqCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICogQHNlZSBJSW5zdGFsbENvbmZpZ3VyYXRpb25DaGFuZ2VkTGlzdGVuZXIjaW5zdGFsbFNpdGVBZGRlZChJU2l0ZSkKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgKi8KLQlwdWJsaWMgdm9pZCBpbnN0YWxsU2l0ZUFkZGVkKElDb25maWd1cmVkU2l0ZSBjc2l0ZSkgewotCQlhc3luY1JlZnJlc2goKTsKLQl9IC8qKgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAqIEBzZWUgSUluc3RhbGxDb25maWd1cmF0aW9uQ2hhbmdlZExpc3RlbmVyI2luc3RhbGxTaXRlUmVtb3ZlZChJU2l0ZSkKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgKi8KLQlwdWJsaWMgdm9pZCBpbnN0YWxsU2l0ZVJlbW92ZWQoSUNvbmZpZ3VyZWRTaXRlIHNpdGUpIHsKLQkJYXN5bmNSZWZyZXNoKCk7Ci0JfSAvKioKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgKiBAc2VlIElDb25maWd1cmVkU2l0ZUNoYW5nZWRMaXN0ZW5lciNmZWF0dXJlSW5zdGFsbGVkKElGZWF0dXJlKQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAqLwotCXB1YmxpYyB2b2lkIGZlYXR1cmVJbnN0YWxsZWQoSUZlYXR1cmUgZmVhdHVyZSkgewotCQlhc3luY1JlZnJlc2goKTsKLQl9IC8qKgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAqIEBzZWUgSUNvbmZpZ3VyZWRTaXRlQ2hhbmdlZExpc3RlbmVyI2ZlYXR1cmVVbmluc3RhbGxlZChJRmVhdHVyZSkKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgKi8KLQlwdWJsaWMgdm9pZCBmZWF0dXJlUmVtb3ZlZChJRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCWFzeW5jUmVmcmVzaCgpOwotCX0gLyoqCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJICogQHNlZSBJQ29uZmlndXJlZFNpdGVDaGFuZ2VkTGlzdGVuZXIjZmVhdHVyZVVDb25maWd1cmVkKElGZWF0dXJlKQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAqLwotCXB1YmxpYyB2b2lkIGZlYXR1cmVDb25maWd1cmVkKElGZWF0dXJlIGZlYXR1cmUpIHsKLQl9OwotCS8qKgotCSAqIEBzZWUgSUNvbmZpZ3VyZWRTaXRlQ2hhbmdlZExpc3RlbmVyI2ZlYXR1cmVVQ29uZmlndXJlZChJRmVhdHVyZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBmZWF0dXJlVW5jb25maWd1cmVkKElGZWF0dXJlIGZlYXR1cmUpIHsKLQl9OwotCXB1YmxpYyB2b2lkIGN1cnJlbnRJbnN0YWxsQ29uZmlndXJhdGlvbkNoYW5nZWQoSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKLQkJYXN5bmNSZWZyZXNoKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5zdGFsbENvbmZpZ3VyYXRpb25SZW1vdmVkKElJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7Ci0JCWFzeW5jUmVmcmVzaCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhc3luY1JlZnJlc2goKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IFNXVFV0aWwuZ2V0U3RhbmRhcmREaXNwbGF5KCk7Ci0JCWlmIChkaXNwbGF5ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChnZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKQotCQkJcmV0dXJuOwotCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJaWYgKCFnZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKQotCQkJCQlnZXRUcmVlVmlld2VyKCkucmVmcmVzaCgpOwotCQkJfQotCQl9KTsKLQl9Ci0JcHJpdmF0ZSBPYmplY3RbXSBpbnZlcnRBcnJheShPYmplY3RbXSBhcnJheSkgewotCQlPYmplY3RbXSBpbnZlcnRlZEFycmF5ID0gbmV3IE9iamVjdFthcnJheS5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCQlpbnZlcnRlZEFycmF5W2ldID0gYXJyYXlbYXJyYXkubGVuZ3RoIC0gMSAtIGldOwotCQl9Ci0JCXJldHVybiBpbnZlcnRlZEFycmF5OwotCX0KLQlwcml2YXRlIGludCBnZXRTdGF0dXNDb2RlKElGZWF0dXJlIGZlYXR1cmUsIElTdGF0dXMgc3RhdHVzKSB7Ci0JCWludCBjb2RlID0gc3RhdHVzLmdldENvZGUoKTsKLQkJaWYgKGNvZGUgPT0gSUZlYXR1cmUuU1RBVFVTX1VOSEFQUFkpIHsKLQkJCWlmIChzdGF0dXMuaXNNdWx0aVN0YXR1cygpKSB7Ci0JCQkJSVN0YXR1c1tdIGNoaWxkcmVuID0gc3RhdHVzLmdldENoaWxkcmVuKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCQlJU3RhdHVzIGNoaWxkID0gY2hpbGRyZW5baV07Ci0JCQkJCWlmIChjaGlsZC5pc011bHRpU3RhdHVzKCkpCi0JCQkJCQlyZXR1cm4gY29kZTsKLQkJCQkJaWYgKGNoaWxkLmdldENvZGUoKSAhPSBJRmVhdHVyZS5TVEFUVVNfRElTQUJMRUQpCi0JCQkJCQlyZXR1cm4gY29kZTsKLQkJCQl9Ci0JCQkJLy8gSWYgd2UgYXJlIGhlcmUsIGdsb2JhbCBzdGF0dXMgaXMgdW5oYXBweQotCQkJCS8vIGJlY2F1c2Ugb25lIG9yIG1vcmUgaW5jbHVkZWQgZmVhdHVyZXMKLQkJCQkvLyBpcyBkaXNhYmxlZC4KLQkJCQlpZiAoYXJlUGF0Y2hlc09ic29sZXRlKGZlYXR1cmUpKSB7Ci0JCQkJCS8vIFRoZSBkaXNhYmxlZCBpbmNsdWRlZCBmZWF0dXJlcwotCQkJCQkvLyBhcmUgb2xkIHBhdGNoZXMgdGhhdCBhcmUgbm93Ci0JCQkJCS8vIHN1YnN1bWVkIGJ5IGJldHRlciB2ZXJzaW9ucyBvZgotCQkJCQkvLyB0aGUgZmVhdHVyZXMgdGhleSB3ZXJlIGRlc2lnbmVkIHRvCi0JCQkJCS8vIHBhdGNoLgotCQkJCQlyZXR1cm4gSUZlYXR1cmUuU1RBVFVTX0hBUFBZOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gY29kZTsKLQl9Ci0JcHJpdmF0ZSBib29sZWFuIGFyZVBhdGNoZXNPYnNvbGV0ZShJRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCS8vIENoZWNrIGFsbCB0aGUgaW5jbHVkZWQgZmVhdHVyZXMgdGhhdAotCQkvLyBhcmUgdW5jb25maWd1cmVkLCBhbmQgc2VlIGlmIHRoZWlyIHBhdGNoIAotCQkvLyByZWZlcmVuY2VzIGFyZSBiZXR0ZXIgdGhhbiB0aGUgb3JpZ2luYWwuCi0JCXRyeSB7Ci0JCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGlyZWZzID0gZmVhdHVyZS5nZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGlyZWZzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUZlYXR1cmVSZWZlcmVuY2UgaXJlZiA9IGlyZWZzW2ldOwotCQkJCUlGZWF0dXJlIGlmZWF0dXJlID0gaXJlZi5nZXRGZWF0dXJlKG51bGwpOwotCQkJCUlDb25maWd1cmVkU2l0ZSBjc2l0ZSA9Ci0JCQkJCWlmZWF0dXJlLmdldFNpdGUoKS5nZXRDdXJyZW50Q29uZmlndXJlZFNpdGUoKTsKLQkJCQlpZiAoIWNzaXRlLmlzQ29uZmlndXJlZChpZmVhdHVyZSkpIHsKLQkJCQkJaWYgKCFpc1BhdGNoSGFwcHkoaWZlYXR1cmUpKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJLy8gQWxsIGNoZWNrcyB3ZW50IHdlbGwKLQkJcmV0dXJuIHRydWU7Ci0JfQotCXByaXZhdGUgYm9vbGVhbiBpc1BhdGNoSGFwcHkoSUZlYXR1cmUgZmVhdHVyZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBJZiB0aGlzIGlzIGEgcGF0Y2ggYW5kIGl0IGluY2x1ZGVzIAotCQkvLyBhbm90aGVyIHBhdGNoIGFuZCB0aGUgaW5jbHVkZWQgcGF0Y2gKLQkJLy8gaXMgZGlzYWJsZWQgYnV0IHRoZSBmZWF0dXJlIGl0IHdhcyBkZWNsYXJlZAotCQkvLyB0byBwYXRjaCBpcyBub3cgbmV3ZXIgKGFuZCBpcyBwcmVzdW1lZCB0bwotCQkvLyBjb250YWluIHRoZSBub3cgZGlzYWJsZWQgcGF0Y2gpLCBhbmQKLQkJLy8gdGhlIG5ld2VyIHBhdGNoZWQgZmVhdHVyZSBpcyBlbmFibGVkLAotCQkvLyBhICdsZWFwIG9mIGZhaXRoJyBhc3N1bXB0aW9uIGNhbiBiZQotCQkvLyBtYWRlOgotCi0JCS8vIEFsdGhvdWdoIHRoZSBpbmNsdWRlZCBwYXRjaCBpcyBkaXNhYmxlZCwKLQkJLy8gdGhlIGZlYXR1cmUgaXQgd2FzIGRlc2lnbmVkIHRvIHBhdGNoCi0JCS8vIGlzIG5vdyBuZXdlciBhbmQgbW9zdCBsaWtlbHkgY29udGFpbnMKLQkJLy8gdGhlIGVxdWl2YWxlbnQgZml4IGFuZCBtb3JlLiBDb25zZXF1ZW50bHksCi0JCS8vIHdlIGNhbiBjbGFpbSB0aGF0IHRoZSBzdGF0dXMgYW5kIHRoZSBlcnJvcgotCQkvLyBpY29uIG92ZXJsYXkgYXJlIG1pc2xlYWRpbmcgYmVjYXVzZQotCQkvLyBhbGwgdGhlIHJpZ2h0IHBsdWctaW5zIGFyZSBjb25maWd1cmVkLgotCQlJSW1wb3J0W10gaW1wb3J0cyA9IGZlYXR1cmUuZ2V0SW1wb3J0cygpOwotCQlJSW1wb3J0IHBhdGNoUmVmZXJlbmNlID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbXBvcnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJSW1wb3J0IGlpbXBvcnQgPSBpbXBvcnRzW2ldOwotCQkJaWYgKGlpbXBvcnQuaXNQYXRjaCgpKSB7Ci0JCQkJcGF0Y2hSZWZlcmVuY2UgPSBpaW1wb3J0OwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChwYXRjaFJlZmVyZW5jZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlWZXJzaW9uZWRJZGVudGlmaWVyIHJlZlZpZCA9IHBhdGNoUmVmZXJlbmNlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKTsKLQotCQkvLyBGaW5kIHRoZSBwYXRjaGVkIGZlYXR1cmUgYW5kIAotCQlJQ29uZmlndXJlZFNpdGUgY3NpdGUgPSBmZWF0dXJlLmdldFNpdGUoKS5nZXRDdXJyZW50Q29uZmlndXJlZFNpdGUoKTsKLQkJaWYgKGNzaXRlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBjcmVmcyA9IGNzaXRlLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNyZWZzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJRmVhdHVyZVJlZmVyZW5jZSBjcmVmID0gY3JlZnNbaV07Ci0JCQlWZXJzaW9uZWRJZGVudGlmaWVyIGN2aWQgPSBjcmVmLmdldFZlcnNpb25lZElkZW50aWZpZXIoKTsKLQkJCWlmIChjdmlkLmdldElkZW50aWZpZXIoKS5lcXVhbHMocmVmVmlkLmdldElkZW50aWZpZXIoKSkpIHsKLQkJCQkvLyBUaGlzIGlzIHRoZSBvbmUuCi0JCQkJaWYgKGN2aWQuZ2V0VmVyc2lvbigpLmlzR3JlYXRlclRoYW4ocmVmVmlkLmdldFZlcnNpb24oKSkpIHsKLQkJCQkJLy8gQmluZ286IHdlIGZvdW5kIHRoZSByZWZlcmVuY2VkIGZlYXR1cmUKLQkJCQkJLy8gYW5kIGl0cyB2ZXJzaW9uIGlzIGdyZWF0ZXIgLSAKLQkJCQkJLy8gd2UgY2FuIGFzc3VtZSB0aGF0IGl0IGNvbnRhaW5zIGJldHRlciBjb2RlCi0JCQkJCS8vIHRoYW4gdGhlIHBhdGNoIHRoYXQgcmVmZXJlbmNlZCB0aGUKLQkJCQkJLy8gb2xkZXIgdmVyc2lvbi4KLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIE9iamVjdFtdIGdldEZlYXR1cmVzKAotCQlmaW5hbCBJQ29uZmlndXJlZFNpdGVBZGFwdGVyIHNpdGVBZGFwdGVyLAotCQlmaW5hbCBib29sZWFuIGNvbmZpZ3VyZWRPbmx5KSB7Ci0JCWZpbmFsIElDb25maWd1cmVkU2l0ZSBjc2l0ZSA9IHNpdGVBZGFwdGVyLmdldENvbmZpZ3VyZWRTaXRlKCk7Ci0JCWZpbmFsIE9iamVjdFtdW10gYmFnID0gbmV3IE9iamVjdFsxXVtdOwotCQlyZWZyZXNoTG9jaz10cnVlOwotCi0JCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBvcCA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJQXJyYXlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlJRmVhdHVyZVJlZmVyZW5jZVtdIHJlZnM7Ci0KLQkJCQlpZiAoY29uZmlndXJlZE9ubHkpCi0JCQkJCXJlZnMgPSBjc2l0ZS5nZXRDb25maWd1cmVkRmVhdHVyZXMoKTsKLQkJCQllbHNlIHsKLQkJCQkJSVNpdGUgc2l0ZSA9IGNzaXRlLmdldFNpdGUoKTsKLQkJCQkJcmVmcyA9IHNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJCQl9Ci0JCQkJbW9uaXRvci5iZWdpblRhc2soCi0JCQkJCVVwZGF0ZVVJLmdldFN0cmluZygiQ29uZmlndXJhdGlvblZpZXcubG9hZGluZyIpLAotCQkJCQlyZWZzLmxlbmd0aCk7Ci0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJSUZlYXR1cmVSZWZlcmVuY2UgcmVmID0gcmVmc1tpXTsKLQkJCQkJSUZlYXR1cmUgZmVhdHVyZTsKLQkJCQkJdHJ5IHsKLQkJCQkJCW1vbml0b3Iuc3ViVGFzayhyZWYuZ2V0VVJMKCkudG9TdHJpbmcoKSk7Ci0JCQkJCQlmZWF0dXJlID0gcmVmLmdldEZlYXR1cmUobnVsbCk7Ci0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJZmVhdHVyZSA9Ci0JCQkJCQkJbmV3IE1pc3NpbmdGZWF0dXJlKHJlZi5nZXRTaXRlKCksIHJlZi5nZXRVUkwoKSk7Ci0JCQkJCX0KLQkJCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkJCXJlc3VsdC5hZGQoCi0JCQkJCQluZXcgQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyKAotCQkJCQkJCXNpdGVBZGFwdGVyLAotCQkJCQkJCWZlYXR1cmUsCi0JCQkJCQkJY3NpdGUuaXNDb25maWd1cmVkKGZlYXR1cmUpLAotCQkJCQkJCWZhbHNlLAotCQkJCQkJCWZhbHNlKSk7Ci0JCQkJfQotCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJCWJhZ1swXSA9IGdldFJvb3RGZWF0dXJlcyhyZXN1bHQpOwotCQkJfQotCQl9OwotCQl0cnkgewotCQkJZ2V0Vmlld1NpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5ydW4odHJ1ZSwgZmFsc2UsIG9wKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCXJlZnJlc2hMb2NrID0gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIGJhZ1swXTsKLQl9Ci0KLQlwcml2YXRlIE9iamVjdFtdIGdldFJvb3RGZWF0dXJlcyhBcnJheUxpc3QgbGlzdCkgewotCQlBcnJheUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUFycmF5TGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRyeSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQlDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXIgY2YgPQotCQkJCQkoQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyKSBsaXN0LmdldChpKTsKLQkJCQlJRmVhdHVyZSBmZWF0dXJlID0gY2YuZ2V0RmVhdHVyZShudWxsKTsKLQkJCQlpZiAoZmVhdHVyZSAhPSBudWxsKQotCQkJCQlhZGRDaGlsZEZlYXR1cmVzKAotCQkJCQkJZmVhdHVyZSwKLQkJCQkJCWNmLmdldENvbmZpZ3VyZWRTaXRlKCksCi0JCQkJCQljaGlsZHJlbiwKLQkJCQkJCWNmLmlzQ29uZmlndXJlZCgpKTsKLQkJCX0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotCQkJCUNvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlciBjZiA9Ci0JCQkJCShDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXIpIGxpc3QuZ2V0KGkpOwotCQkJCUlGZWF0dXJlIGZlYXR1cmUgPSBjZi5nZXRGZWF0dXJlKG51bGwpOwotCQkJCWlmIChmZWF0dXJlICE9IG51bGwKLQkJCQkJJiYgaXNDaGlsZEZlYXR1cmUoZmVhdHVyZSwgY2hpbGRyZW4pID09IGZhbHNlKQotCQkJCQlyZXN1bHQuYWRkKGNmKTsKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbGlzdC50b0FycmF5KCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdC50b0FycmF5KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZENoaWxkRmVhdHVyZXMoCi0JCUlGZWF0dXJlIGZlYXR1cmUsCi0JCUlDb25maWd1cmVkU2l0ZSBjc2l0ZSwKLQkJQXJyYXlMaXN0IGNoaWxkcmVuLAotCQlib29sZWFuIGNvbmZpZ3VyZWQpIHsKLQkJdHJ5IHsKLQkJCUlJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VbXSBpbmNsdWRlZCA9Ci0JCQkJZmVhdHVyZS5nZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGluY2x1ZGVkLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUZlYXR1cmUgY2hpbGRGZWF0dXJlOwotCQkJCXRyeSB7Ci0JCQkJCWNoaWxkRmVhdHVyZSA9Ci0JCQkJCQlpbmNsdWRlZFtpXS5nZXRGZWF0dXJlKCFjb25maWd1cmVkLCBjc2l0ZSwgbnVsbCk7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWNoaWxkRmVhdHVyZSA9IG5ldyBNaXNzaW5nRmVhdHVyZShpbmNsdWRlZFtpXSk7Ci0JCQkJfQotCQkJCWNoaWxkcmVuLmFkZChjaGlsZEZlYXR1cmUpOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVVwZGF0ZVVJLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0NoaWxkRmVhdHVyZShJRmVhdHVyZSBmZWF0dXJlLCBBcnJheUxpc3QgY2hpbGRyZW4pIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5zaXplKCk7IGkrKykgewotCQkJSUZlYXR1cmUgY2hpbGQgPSAoSUZlYXR1cmUpIGNoaWxkcmVuLmdldChpKTsKLQkJCWlmIChmZWF0dXJlCi0JCQkJLmdldFZlcnNpb25lZElkZW50aWZpZXIoKQotCQkJCS5lcXVhbHMoY2hpbGQuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCXByb3RlY3RlZCBPYmplY3QgZ2V0Um9vdE9iamVjdCgpIHsKLQkJcmV0dXJuIFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRVcGRhdGVNb2RlbCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9EZXRhaWxzVmlldy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL0RldGFpbHNWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzOWQ4ZmUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL0RldGFpbHNWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkudmlld3M7Ci1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5oZWxwLmJyb3dzZXIuSUJyb3dzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuaGVscC5pbnRlcm5hbC5icm93c2VyLkJyb3dzZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QucHJvZ3JhbS5Qcm9ncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLldvcmtiZW5jaEhlbHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVXBkYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuTW9kZWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLmZvcm1zLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnBhZ2VzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnByZWZlcmVuY2VzLk1haW5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuc2VhcmNoLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsLmVuZ2luZS5Gb3JtRW5naW5lOwotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBAc2VlIFZpZXdQYXJ0Ci0gKi8KLXB1YmxpYyBjbGFzcyBEZXRhaWxzVmlldyBleHRlbmRzIE11bHRpUGFnZVZpZXcgewotCi0JLy8gTkwga2V5cwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfSE9NRSA9ICJEZXRhaWxzVmlldy5ob21lLmxhYmVsIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0JBQ0tXQVJEID0gIkRldGFpbHNWaWV3LmJhY2t3YXJkLmxhYmVsIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0ZPUldBUkQgPSAiRGV0YWlsc1ZpZXcuZm9yd2FyZC5sYWJlbCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9UX0hPTUUgPSAiRGV0YWlsc1ZpZXcuaG9tZS50b29sdGlwIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1RfQkFDS1dBUkQgPSAiRGV0YWlsc1ZpZXcuYmFja3dhcmQudG9vbHRpcCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9UX0ZPUldBUkQgPSAiRGV0YWlsc1ZpZXcuZm9yd2FyZC50b29sdGlwIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhPTUVfUEFHRSA9ICJIb21lIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSVRFX1BBR0UgPSAiU2l0ZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FURUdPUllfUEFHRSA9ICJDYXRlZ29yeSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVUQUlMU19QQUdFID0gIkRldGFpbHMiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJST1dTRVJfUEFHRSA9ICJCcm93c2VyIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdfUEFHRSA9ICJDb25maWciOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOU1RBTExfQ09ORklHVVJBVElPTl9QQUdFID0KLQkJIkluc3RhbGxDb25maWd1cmF0aW9uIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlNUQUxMX1NJVEVfUEFHRSA9ICJJbnN0YWxsU2l0ZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVlfQ09NUFVURVJfUEFHRSA9ICJNeUNvbXB1dGVyIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUk9PVF9QQUdFID0gIkV4dGVuc2lvblJvb3QiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFQVJDSF9QQUdFID0gIlNlYXJjaCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQ09WRVJZX1BBR0UgPSAiRGlzY292ZXJ5IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTktOT1dOX1BBR0UgPSAiVW5rbm93biI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVVMVElQTEVfU0VMRUNUSU9OX1BBR0UgPSAiTXVsdGlwbGVTZWxlY3Rpb24iOwotCi0JcHJpdmF0ZSBBY3Rpb24gaG9tZUFjdGlvbjsKLQlwcml2YXRlIFVwZGF0ZUFjdGlvbiBiYWNrQWN0aW9uOwotCXByaXZhdGUgVXBkYXRlQWN0aW9uIGZvcndhcmRBY3Rpb247Ci0JcHJpdmF0ZSBEZXRhaWxzSGlzdG9yeSBoaXN0b3J5ID0gbmV3IERldGFpbHNIaXN0b3J5KCk7Ci0JcHJpdmF0ZSBWZWN0b3IgdG1wRmlsZXM7Ci0KLQlwcml2YXRlIGJvb2xlYW4gaW5IaXN0b3J5ID0gZmFsc2U7Ci0KLQlhYnN0cmFjdCBjbGFzcyBVcGRhdGVBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gaW1wbGVtZW50cyBJVXBkYXRlIHsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIERldGFpbHNWaWV3KCkgewotCQloaXN0b3J5ID0gbmV3IERldGFpbHNIaXN0b3J5KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlUGFnZXMoKSB7Ci0JCWZpcnN0UGFnZUlkID0gSE9NRV9QQUdFOwotCQlmb3JtV29ya2Jvb2suc2V0Rmlyc3RQYWdlU2VsZWN0ZWQoZmFsc2UpOwotCQlNYWluUGFnZSBtYWluUGFnZSA9IG5ldyBNYWluUGFnZSh0aGlzLCAiVXBkYXRlIEhvbWUiKTsKLQkJYWRkUGFnZShIT01FX1BBR0UsIG1haW5QYWdlKTsKLQkJRGV0YWlsc1BhZ2UgZGV0YWlsc1BhZ2UgPSBuZXcgRGV0YWlsc1BhZ2UodGhpcywgIkRldGFpbHMiKTsKLQkJYWRkUGFnZShERVRBSUxTX1BBR0UsIGRldGFpbHNQYWdlKTsKLQkJU2l0ZVBhZ2Ugc2l0ZVBhZ2UgPSBuZXcgU2l0ZVBhZ2UodGhpcywgIlNpdGUiKTsKLQkJYWRkUGFnZShTSVRFX1BBR0UsIHNpdGVQYWdlKTsKLQkJYWRkUGFnZShDQVRFR09SWV9QQUdFLCBuZXcgQ2F0ZWdvcnlQYWdlKHRoaXMsICJDYXRlZ29yeSIpKTsKLQkJYWRkUGFnZShDT05GSUdfUEFHRSwgbmV3IExvY2FsU2l0ZVBhZ2UodGhpcywgIkNvbmZpZ3VyYXRpb24iKSk7Ci0JCWFkZFBhZ2UoCi0JCQlJTlNUQUxMX0NPTkZJR1VSQVRJT05fUEFHRSwKLQkJCW5ldyBJbnN0YWxsQ29uZmlndXJhdGlvblBhZ2UodGhpcywgIlNuYXBzaG90IikpOwotCQlhZGRQYWdlKAotCQkJSU5TVEFMTF9TSVRFX1BBR0UsCi0JCQluZXcgSW5zdGFsbGFibGVTaXRlUGFnZSh0aGlzLCAiSW5zdGFsbCBMb2NhdGlvbiIpKTsKLQkJYWRkUGFnZShNWV9DT01QVVRFUl9QQUdFLCBuZXcgTXlDb21wdXRlclBhZ2UodGhpcywgIk15Q29tcHV0ZXIiKSk7Ci0JCWFkZFBhZ2UoCi0JCQlFWFRFTlNJT05fUk9PVF9QQUdFLAotCQkJbmV3IEV4dGVuc2lvblJvb3RQYWdlKHRoaXMsICJFeHRlbnNpb25Sb290IikpOwotCQlhZGRQYWdlKFNFQVJDSF9QQUdFLCBuZXcgU2VhcmNoUGFnZSh0aGlzLCAiU2VhcmNoIikpOwotCQlhZGRQYWdlKAotCQkJRElTQ09WRVJZX1BBR0UsCi0JCQluZXcgRGlzY292ZXJ5Rm9sZGVyUGFnZSh0aGlzLCAiRGlzY292ZXJ5IFNpdGVzIikpOwotCQlhZGRQYWdlKE1VTFRJUExFX1NFTEVDVElPTl9QQUdFLCBuZXcgTXVsdGlwbGVTZWxlY3Rpb25QYWdlKHRoaXMsICJNdWx0aXBsZSBTZWxlY3Rpb24iKSk7Ci0JCWFkZFBhZ2UoVU5LTk9XTl9QQUdFLCBuZXcgVW5rbm93bk9iamVjdFBhZ2UodGhpcywgIlVua25vd24gT2JqZWN0IikpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2hvd1VSTChTdHJpbmcgdXJsKSB7Ci0JCXJldHVybiBzaG93VVJMKHVybCwgdHJ1ZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHNob3dVUkwoU3RyaW5nIHVybCwgYm9vbGVhbiBjb25zaWRlckVtYmVkZGVkKSB7Ci0JCWJvb2xlYW4gdXNlRW1iZWRkZWQgPSBmYWxzZTsKLQkJYm9vbGVhbiBmb2N1c0dyYWJiZWQgPSBmYWxzZTsKLQkJYm9vbGVhbiB3aW4zMiA9IFNXVC5nZXRQbGF0Zm9ybSgpLmVxdWFscygid2luMzIiKTsKLQkJCi0JCXVybCA9IFdlYkluc3RhbGxIYW5kbGVyLmdldEVuY29kZWRVUkxOYW1lKHVybCk7Ci0JCWlmICh3aW4zMiAmJiBjb25zaWRlckVtYmVkZGVkKSB7Ci0JCQl1c2VFbWJlZGRlZCA9IE1haW5QcmVmZXJlbmNlUGFnZS5nZXRVc2VFbWJlZGRlZEJyb3dzZXIoKTsKLQkJfQotCQlpZiAodXNlRW1iZWRkZWQpIHsKLQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBVcGRhdGVVSS5nZXRBY3RpdmVQYWdlKCk7Ci0JCQl0cnkgewotCQkJCS8vSVZpZXdQYXJ0IHBhcnQgPSBwYWdlLmZpbmRWaWV3KFVwZGF0ZVBlcnNwZWN0aXZlLklEX0JST1dTRVIpOwotCQkJCS8vaWYgKHBhcnQgPT0gbnVsbCkgewotCQkJCQlJVmlld1BhcnQgcGFydCA9IHBhZ2Uuc2hvd1ZpZXcoVXBkYXRlUGVyc3BlY3RpdmUuSURfQlJPV1NFUik7Ci0JCQkJCWZvY3VzR3JhYmJlZCA9IHRydWU7Ci0JCQkJLy99IGVsc2UKLQkJCQkJLy9wYWdlLmJyaW5nVG9Ub3AocGFydCk7Ci0JCQkJKChJRW1iZWRkZWRXZWJCcm93c2VyKSBwYXJ0KS5vcGVuVG8odXJsKTsKLQkJCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCQlVcGRhdGVVSS5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAod2luMzIpIHsKLQkJCQlQcm9ncmFtLmxhdW5jaCh1cmwpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBkZWZlY3QgMTE0ODMKLQkJCQlJQnJvd3NlciBicm93c2VyID0gQnJvd3Nlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5jcmVhdGVCcm93c2VyKCk7Ci0JCQkJdHJ5IHsKLQkJCQkJYnJvd3Nlci5kaXNwbGF5VVJMKHVybCk7Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlVcGRhdGVVSS5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmb2N1c0dyYWJiZWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2hvd1RleHQoU3RyaW5nIHRleHQpIHsKLQkJdHJ5IHsKLQkJCUZpbGUgZmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoIkZlYXR1cmVMaWNlbnNlIiwgIi50eHQiKTsKLQkJCU91dHB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlKTsKLQkJCVByaW50V3JpdGVyIHdyaXRlciA9IG5ldyBQcmludFdyaXRlcihzdHJlYW0pOwotCQkJd3JpdGVyLnByaW50bG4odGV4dCk7Ci0JCQl3cml0ZXIuZmx1c2goKTsKLQkJCXN0cmVhbS5jbG9zZSgpOwotCQkJaWYgKHRtcEZpbGVzID09IG51bGwpCi0JCQkJdG1wRmlsZXMgPSBuZXcgVmVjdG9yKCk7Ci0JCQl0bXBGaWxlcy5hZGQoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQlzaG93VVJMKCJmaWxlOi8vLyIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJVXBkYXRlVUkubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKHRtcEZpbGVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdG1wRmlsZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlTdHJpbmcgZmlsZU5hbWUgPSB0bXBGaWxlcy5nZXQoaSkudG9TdHJpbmcoKTsKLQkJCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShmaWxlTmFtZSk7Ci0JCQkJZmlsZS5kZWxldGUoKTsKLQkJCX0KLQkJCXRtcEZpbGVzID0gbnVsbDsKLQkJfQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlci5jcmVhdGVQYXJ0Q29udHJvbChwYXJlbnQpOwotCQloaXN0b3J5LmFkZChIT01FX1BBR0UsIG51bGwpOwotCQltYWtlQWN0aW9ucygpOwotCQlmaWxsQWN0aW9uQmFycygpOwotCQlXb3JrYmVuY2hIZWxwLnNldEhlbHAoCi0JCQlmb3JtV29ya2Jvb2suZ2V0Q29udHJvbCgpLAotCQkJIm9yZy5lY2xpcHNlLnVwZGF0ZS51aS5EZXRhaWxzVmlldyIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNob3dQYWdlV2l0aElucHV0KElXb3JrYmVuY2hQYXJ0IHBhcnQsIFN0cmluZyBwYWdlSWQsIE9iamVjdCBpbnB1dCkgewotCQlpZiAocGFnZUlkLmVxdWFscyhIT01FX1BBR0UpID09IGZhbHNlKSB7Ci0JCQlpZiAoaW5wdXQhPW51bGwgJiYgIShpbnB1dCBpbnN0YW5jZW9mIFVJTW9kZWxPYmplY3QKLQkJCQl8fCBpbnB1dCBpbnN0YW5jZW9mIE1vZGVsT2JqZWN0IAotCQkJCXx8IGlucHV0IGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pKQotCQkJCXJldHVybjsKLQkJfQotCQlzaG93UGFnZShwYWdlSWQsIGlucHV0KTsKLQkJaWYgKGlucHV0ICE9IG51bGwpCi0JCQloaXN0b3J5LmFkZChwYWdlSWQsIGlucHV0KTsKLQkJYmFja0FjdGlvbi51cGRhdGUoKTsKLQkJZm9yd2FyZEFjdGlvbi51cGRhdGUoKTsKLQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IFVwZGF0ZVVJLmdldEFjdGl2ZVBhZ2UoKTsKLQkJaWYgKHBhZ2UgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSVBlcnNwZWN0aXZlRGVzY3JpcHRvciBkZXNjID0gcGFnZS5nZXRQZXJzcGVjdGl2ZSgpOwotCQlpZiAoZGVzYyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlTdHJpbmcgcGlkID0gZGVzYy5nZXRJZCgpOwotCQlpZiAocGlkLmVxdWFscygib3JnLmVjbGlwc2UudXBkYXRlLnVpLlVwZGF0ZVBlcnNwZWN0aXZlIikpIHsKLQkJCUlWaWV3UGFydCB2aWV3ID0gcGFnZS5maW5kVmlldyhVcGRhdGVQZXJzcGVjdGl2ZS5JRF9ERVRBSUxTKTsKLQkJCWlmICh2aWV3ICE9IG51bGwpCi0JCQkJcGFnZS5icmluZ1RvVG9wKHZpZXcpOwotCQkJZWxzZSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcGFnZS5zaG93VmlldyhVcGRhdGVQZXJzcGVjdGl2ZS5JRF9ERVRBSUxTKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCQkJVXBkYXRlVUkubG9nRXhjZXB0aW9uKGUpOwotCQkJCX0KLQkJCQkvLyBSZXN0b3JlIGZvY3VzIHRvIHRoZSBzZWxlY3Rpb24gcHJvdmlkZXIKLQkJCQlpZiAocGFydCE9bnVsbCkgcGFydC5zZXRGb2N1cygpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNob3dXZWJCb29rbWFyayhmaW5hbCBJV29ya2JlbmNoUGFydCBwYXJ0LCBmaW5hbCBTaXRlQm9va21hcmsgYm9va21hcmspIHsKLQkJQnVzeUluZGljYXRvcgotCQkJLnNob3dXaGlsZShmb3JtV29ya2Jvb2suZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWJvb2xlYW4gZm9jdXNHcmFiYmVkID0gc2hvd1VSTChib29rbWFyay5nZXRVUkwoKS50b1N0cmluZygpKTsKLQkJCQlpZiAoZm9jdXNHcmFiYmVkKQotCQkJCQlwYXJ0LnNldEZvY3VzKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWwpIHsKLQkJaWYgKHBhcnQgPT0gdGhpcykKLQkJCXJldHVybjsKLQkJaWYgKHBhcnQuZ2V0U2l0ZSgpLmdldElkKCkuZXF1YWxzKFVwZGF0ZVBlcnNwZWN0aXZlLklEX0JST1dTRVIpKQotCQkJcmV0dXJuOwotCQlpZiAocGFydCBpbnN0YW5jZW9mIFNlYXJjaFJlc3VsdFZpZXcpIHsKLQkJCVNlYXJjaFJlc3VsdFZpZXcgc2VhcmNoUmVzdWx0ID0gKFNlYXJjaFJlc3VsdFZpZXcpcGFydDsKLQkJCWlmIChzZWFyY2hSZXN1bHQuaXNTZWxlY3Rpb25BY3RpdmUoKT09ZmFsc2UpCi0JCQkJcmV0dXJuOwotCQl9Ci0JCU9iamVjdCBlbCA9IG51bGw7Ci0JCWlmIChzZWwgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3NlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsOwotCQkJaWYgKHNzZWwuc2l6ZSgpID09IDEpIHsKLQkJCQllbCA9IHNzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJaWYgKGVsIGluc3RhbmNlb2YgSUZlYXR1cmUgfHwgZWwgaW5zdGFuY2VvZiBJRmVhdHVyZUFkYXB0ZXIpIHsKLQkJCQkJc2hvd1BhZ2VXaXRoSW5wdXQocGFydCwgREVUQUlMU19QQUdFLCBlbCk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJaWYgKGVsIGluc3RhbmNlb2YgU2l0ZUJvb2ttYXJrKSB7Ci0JCQkJCS8vU2l0ZUJvb2ttYXJrIGJvb2ttYXJrID0gKFNpdGVCb29rbWFyaykgZWw7Ci0JCQkJCS8vaWYgKCFib29rbWFyay5pc1dlYkJvb2ttYXJrKCkpCi0JCQkJCQlzaG93UGFnZVdpdGhJbnB1dChwYXJ0LCBTSVRFX1BBR0UsIGVsKTsKLQkJCQkJLy9lbHNlCi0JCQkJCQkvL3Nob3dXZWJCb29rbWFyayhwYXJ0LCBib29rbWFyayk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJaWYgKGVsIGluc3RhbmNlb2YgU2l0ZUNhdGVnb3J5KSB7Ci0JCQkJCXNob3dQYWdlV2l0aElucHV0KHBhcnQsIENBVEVHT1JZX1BBR0UsIGVsKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlpZiAoZWwgaW5zdGFuY2VvZiBJTG9jYWxTaXRlKSB7Ci0JCQkJCXNob3dQYWdlV2l0aElucHV0KHBhcnQsIENPTkZJR19QQUdFLCBlbCk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJaWYgKGVsIGluc3RhbmNlb2YgSUluc3RhbGxDb25maWd1cmF0aW9uCi0JCQkJCXx8IGVsIGluc3RhbmNlb2YgUHJlc2VydmVkQ29uZmlndXJhdGlvbikgewotCQkJCQlzaG93UGFnZVdpdGhJbnB1dChwYXJ0LCBJTlNUQUxMX0NPTkZJR1VSQVRJT05fUEFHRSwgZWwpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWlmIChlbCBpbnN0YW5jZW9mIElDb25maWd1cmVkU2l0ZUFkYXB0ZXIpIHsKLQkJCQkJc2hvd1BhZ2VXaXRoSW5wdXQocGFydCwgSU5TVEFMTF9TSVRFX1BBR0UsIGVsKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlpZiAoZWwgaW5zdGFuY2VvZiBNeUNvbXB1dGVyKSB7Ci0JCQkJCXNob3dQYWdlV2l0aElucHV0KHBhcnQsIE1ZX0NPTVBVVEVSX1BBR0UsIGVsKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlpZiAoZWwgaW5zdGFuY2VvZiBFeHRlbnNpb25Sb290KSB7Ci0JCQkJCXNob3dQYWdlV2l0aElucHV0KHBhcnQsIEVYVEVOU0lPTl9ST09UX1BBR0UsIGVsKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlpZiAoZWwgaW5zdGFuY2VvZiBEaXNjb3ZlcnlGb2xkZXIpIHsKLQkJCQkJc2hvd1BhZ2VXaXRoSW5wdXQocGFydCwgRElTQ09WRVJZX1BBR0UsIGVsKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlpZiAoZWwgaW5zdGFuY2VvZiBTZWFyY2hPYmplY3QpIHsKLQkJCQkJc2hvd1BhZ2VXaXRoSW5wdXQocGFydCwgU0VBUkNIX1BBR0UsIGVsKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlpZiAoZWwgaW5zdGFuY2VvZiBTZWFyY2hSZXN1bHRTaXRlKSB7Ci0JCQkJCXNob3dQYWdlV2l0aElucHV0KHBhcnQsIFNJVEVfUEFHRSwgZWwpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCS8vZmFsbGJhY2sgLSBzaG93IGVtcHR5IHBhZ2UKLQkJCQlzaG93UGFnZVdpdGhJbnB1dChwYXJ0LCBVTktOT1dOX1BBR0UsIGVsKTsKLQkJCX0gZWxzZSBpZiAoc3NlbC5zaXplKCk+MSkgewotCQkJCXNob3dQYWdlV2l0aElucHV0KHBhcnQsIE1VTFRJUExFX1NFTEVDVElPTl9QQUdFLCBzc2VsKTsKLQkJCX0gZWxzZQotCQkJCS8vIGRlZmVjdCAxNDY5MgotCQkJCXNob3dQYWdlV2l0aElucHV0KHBhcnQsIAotCQkJCQkvKihob21lQWN0aW9uICE9IG51bGwpID8gSE9NRV9QQUdFIDoqLyBVTktOT1dOX1BBR0UsCi0JCQkJCW51bGwpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG1ha2VBY3Rpb25zKCkgewotCQlob21lQWN0aW9uID0gbmV3IEFjdGlvbigpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlwZXJmb3JtSG9tZSgpOwotCQkJfQotCQl9OwotCQlob21lQWN0aW9uLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9IT01FKSk7Ci0JCWhvbWVBY3Rpb24uc2V0VG9vbFRpcFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9UX0hPTUUpKTsKLQkJaG9tZUFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoVXBkYXRlVUlJbWFnZXMuREVTQ19IT01FX05BVik7Ci0JCWhvbWVBY3Rpb24uc2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoCi0JCQlVcGRhdGVVSUltYWdlcy5ERVNDX0hPTUVfTkFWX0gpOwotCQlob21lQWN0aW9uLnNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKAotCQkJVXBkYXRlVUlJbWFnZXMuREVTQ19IT01FX05BVl9EKTsKLQkJV29ya2JlbmNoSGVscC5zZXRIZWxwKAotCQkJaG9tZUFjdGlvbiwKLQkJCSJvcmcuZWNsaXBzZS51cGRhdGUudWkuRGV0YWlsc1ZpZXdfaG9tZUFjdGlvbiIpOwotCi0JCWJhY2tBY3Rpb24gPSBuZXcgVXBkYXRlQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXBlcmZvcm1CYWNrd2FyZCgpOwotCQkJfQotCQkJcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQkJCXNldEVuYWJsZWQoY2FuUGVyZm9ybUJhY2t3YXJkKCkpOwotCQkJfQotCQl9OwotCQliYWNrQWN0aW9uLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9CQUNLV0FSRCkpOwotCQliYWNrQWN0aW9uLnNldFRvb2xUaXBUZXh0KAotCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9UX0JBQ0tXQVJEKSk7Ci0JCWJhY2tBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKFVwZGF0ZVVJSW1hZ2VzLkRFU0NfQkFDS1dBUkRfTkFWKTsKLQkJYmFja0FjdGlvbi5zZXRIb3ZlckltYWdlRGVzY3JpcHRvcigKLQkJCVVwZGF0ZVVJSW1hZ2VzLkRFU0NfQkFDS1dBUkRfTkFWX0gpOwotCQliYWNrQWN0aW9uLnNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKAotCQkJVXBkYXRlVUlJbWFnZXMuREVTQ19CQUNLV0FSRF9OQVZfRCk7Ci0JCWJhY2tBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCVdvcmtiZW5jaEhlbHAuc2V0SGVscCgKLQkJCWJhY2tBY3Rpb24sCi0JCQkib3JnLmVjbGlwc2UudXBkYXRlLnVpLkRldGFpbHNWaWV3X2JhY2tBY3Rpb24iKTsKLQotCQlmb3J3YXJkQWN0aW9uID0gbmV3IFVwZGF0ZUFjdGlvbigpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlwZXJmb3JtRm9yd2FyZCgpOwotCQkJfQotCQkJcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQkJCXNldEVuYWJsZWQoY2FuUGVyZm9ybUZvcndhcmQoKSk7Ci0JCQl9Ci0JCX07Ci0JCWZvcndhcmRBY3Rpb24uc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX0ZPUldBUkQpKTsKLQkJZm9yd2FyZEFjdGlvbi5zZXRUb29sVGlwVGV4dCgKLQkJCVVwZGF0ZVVJLmdldFN0cmluZyhLRVlfVF9GT1JXQVJEKSk7Ci0JCWZvcndhcmRBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKFVwZGF0ZVVJSW1hZ2VzLkRFU0NfRk9SV0FSRF9OQVYpOwotCQlmb3J3YXJkQWN0aW9uLnNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKAotCQkJVXBkYXRlVUlJbWFnZXMuREVTQ19GT1JXQVJEX05BVl9IKTsKLQkJZm9yd2FyZEFjdGlvbi5zZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcigKLQkJCVVwZGF0ZVVJSW1hZ2VzLkRFU0NfRk9SV0FSRF9OQVZfRCk7Ci0JCWZvcndhcmRBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCVdvcmtiZW5jaEhlbHAuc2V0SGVscCgKLQkJCWZvcndhcmRBY3Rpb24sCi0JCQkib3JnLmVjbGlwc2UudXBkYXRlLnVpLkRldGFpbHNWaWV3X2ZvcndhcmRBY3Rpb24iKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZmlsbEFjdGlvbkJhcnMoKSB7Ci0JCUlBY3Rpb25CYXJzIGJhcnMgPSBnZXRWaWV3U2l0ZSgpLmdldEFjdGlvbkJhcnMoKTsKLQkJSVRvb2xCYXJNYW5hZ2VyIG1uZyA9IGJhcnMuZ2V0VG9vbEJhck1hbmFnZXIoKTsKLQkJbW5nLmFkZChob21lQWN0aW9uKTsKLQkJbW5nLmFkZChiYWNrQWN0aW9uKTsKLQkJbW5nLmFkZChmb3J3YXJkQWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb250ZXh0TWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZW51KSB7Ci0JCUNvbnRyb2wgY29udHJvbCA9Ci0JCQlmb3JtV29ya2Jvb2suZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKS5nZXRGb2N1c0NvbnRyb2woKTsKLQkJaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtRW5naW5lKSB7Ci0JCQkoKEZvcm1FbmdpbmUpIGNvbnRyb2wpLmNvbnRleHRNZW51QWJvdXRUb1Nob3cobWVudSk7Ci0JCX0KLQotCQltZW51LmFkZChiYWNrQWN0aW9uKTsKLQkJbWVudS5hZGQoZm9yd2FyZEFjdGlvbik7Ci0JCW1lbnUuYWRkKGhvbWVBY3Rpb24pOwotCX0KLQotCXByaXZhdGUgdm9pZCBwZXJmb3JtSG9tZSgpIHsKLQkJc2hvd1BhZ2VXaXRoSW5wdXQobnVsbCwgSE9NRV9QQUdFLCBudWxsKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2FuUGVyZm9ybUJhY2t3YXJkKCkgewotCQlyZXR1cm4gaGlzdG9yeS5oYXNQcmV2aW91cygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwZXJmb3JtQmFja3dhcmQoKSB7Ci0JCURldGFpbHNIaXN0b3J5SXRlbSBpdGVtID0gaGlzdG9yeS5nZXRQcmV2aW91cygpOwotCQlpZiAoaXRlbSAhPSBudWxsKSB7Ci0JCQlpbkhpc3RvcnkgPSB0cnVlOwotCQkJc2hvd1BhZ2UoaXRlbS5nZXRQYWdlSWQoKSwgaXRlbS5nZXRJbnB1dCgpKTsKLQkJCS8vaW5IaXN0b3J5ID0gZmFsc2U7Ci0JCQlpZiAoaXRlbS5nZXRQYWdlSWQoKSAhPSBCUk9XU0VSX1BBR0UpIHsKLQkJCQliYWNrQWN0aW9uLnVwZGF0ZSgpOwotCQkJCWZvcndhcmRBY3Rpb24udXBkYXRlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcGVyZm9ybUZvcndhcmQoKSB7Ci0JCURldGFpbHNIaXN0b3J5SXRlbSBpdGVtID0gaGlzdG9yeS5nZXROZXh0KCk7Ci0JCWlmIChpdGVtICE9IG51bGwpIHsKLQkJCWluSGlzdG9yeSA9IHRydWU7Ci0JCQlzaG93UGFnZShpdGVtLmdldFBhZ2VJZCgpLCBpdGVtLmdldElucHV0KCkpOwotCQkJLy9pbkhpc3RvcnkgPSBmYWxzZTsKLQkJCWlmIChpdGVtLmdldFBhZ2VJZCgpICE9IEJST1dTRVJfUEFHRSkgewotCQkJCWJhY2tBY3Rpb24udXBkYXRlKCk7Ci0JCQkJZm9yd2FyZEFjdGlvbi51cGRhdGUoKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjYW5QZXJmb3JtRm9yd2FyZCgpIHsKLQkJcmV0dXJuIGhpc3RvcnkuaGFzTmV4dCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL0ZlYXR1cmVTb3J0ZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9GZWF0dXJlU29ydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzZGNlZTMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL0ZlYXR1cmVTb3J0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnZpZXdzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpblZlcnNpb25JZGVudGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlZlcnNpb25lZElkZW50aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsLklGZWF0dXJlQWRhcHRlcjsKLQotLyoqCi0gKiBAYXV0aG9yIGRlamFuCi0gKgotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZWRpdCB0aGUgdGVtcGxhdGUgdmFyaWFibGUgInR5cGVjb21tZW50IjoKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPlRlbXBsYXRlcy4KLSAqIFRvIGVuYWJsZSBhbmQgZGlzYWJsZSB0aGUgY3JlYXRpb24gb2YgdHlwZSBjb21tZW50cyBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgRmVhdHVyZVNvcnRlciBleHRlbmRzIFZpZXdlclNvcnRlciB7Ci0KLQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IGUxLCBPYmplY3QgZTIpIHsKLQkJaW50IGNhdDEgPSBjYXRlZ29yeShlMSk7Ci0JCWludCBjYXQyID0gY2F0ZWdvcnkoZTIpOwotCi0JCWlmIChjYXQxICE9IGNhdDIpCi0JCQlyZXR1cm4gY2F0MSAtIGNhdDI7Ci0KLQkJaWYgKCEoZTEgaW5zdGFuY2VvZiBJRmVhdHVyZUFkYXB0ZXIgJiYgZTIgaW5zdGFuY2VvZiBJRmVhdHVyZUFkYXB0ZXIpKQotCQkJcmV0dXJuIHN1cGVyLmNvbXBhcmUodmlld2VyLCBlMSwgZTIpOwotCi0JCUlGZWF0dXJlQWRhcHRlciBhMSA9IChJRmVhdHVyZUFkYXB0ZXIpIGUxOwotCQlJRmVhdHVyZUFkYXB0ZXIgYTIgPSAoSUZlYXR1cmVBZGFwdGVyKSBlMjsKLQotCQlJRmVhdHVyZSBmMSwgZjI7Ci0KLQkJdHJ5IHsKLQkJCWYxID0gYTEuZ2V0RmVhdHVyZShudWxsKTsKLQkJCWYyID0gYTIuZ2V0RmVhdHVyZShudWxsKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gc3VwZXIuY29tcGFyZSh2aWV3ZXIsIGUxLCBlMik7Ci0JCX0KLQotCQlWZXJzaW9uZWRJZGVudGlmaWVyIHZpZDEgPSBmMS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7Ci0JCVZlcnNpb25lZElkZW50aWZpZXIgdmlkMiA9IGYyLmdldFZlcnNpb25lZElkZW50aWZpZXIoKTsKLQotCQlTdHJpbmcgbmFtZTE7Ci0JCVN0cmluZyBuYW1lMjsKLQotCQluYW1lMSA9IGYxLmdldExhYmVsKCk7Ci0JCW5hbWUyID0gZjIuZ2V0TGFiZWwoKTsKLQotCQlpZiAobmFtZTEgPT0gbnVsbCkKLQkJCW5hbWUxID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG5hbWUyID09IG51bGwpCi0JCQluYW1lMiA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWludCByZXN1bHQgPSBjb2xsYXRvci5jb21wYXJlKG5hbWUxLCBuYW1lMik7Ci0JCWlmIChyZXN1bHQgIT0gMCkKLQkJCXJldHVybiByZXN1bHQ7Ci0JCS8vIENvbXBhcmUgdmVyc2lvbnMKLQkJUGx1Z2luVmVyc2lvbklkZW50aWZpZXIgdjEgPSB2aWQxLmdldFZlcnNpb24oKTsKLQkJUGx1Z2luVmVyc2lvbklkZW50aWZpZXIgdjIgPSB2aWQyLmdldFZlcnNpb24oKTsKLQkJaWYgKHYxLmVxdWFscyh2MikpCi0JCQlyZXR1cm4gMDsKLQkJaWYgKHYyLmlzR3JlYXRlclRoYW4odjEpKQotCQkJcmV0dXJuIC0xOwotCQlyZXR1cm4gMTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvSUVtYmVkZGVkV2ViQnJvd3Nlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL0lFbWJlZGRlZFdlYkJyb3dzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY2MzExOS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvSUVtYmVkZGVkV2ViQnJvd3Nlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkudmlld3M7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUVtYmVkZGVkV2ViQnJvd3NlciB7Ci0JcHVibGljIHZvaWQgb3BlblRvKFN0cmluZyB1cmwpOwotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL011bHRpUGFnZVZpZXcuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9NdWx0aVBhZ2VWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczN2JjN2MuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL011bHRpUGFnZVZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS52aWV3czsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wYWdlcy5JVXBkYXRlRm9ybVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsLio7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBNdWx0aVBhZ2VWaWV3IGV4dGVuZHMgVmlld1BhcnQgaW1wbGVtZW50cyBJU2VsZWN0aW9uTGlzdGVuZXIgewotCXByb3RlY3RlZCBJRm9ybVdvcmtib29rIGZvcm1Xb3JrYm9vazsKLQlwcml2YXRlIFZlY3RvciBwYWdlczsKLQlwcm90ZWN0ZWQgU3RyaW5nIGZpcnN0UGFnZUlkOwotCXByaXZhdGUgSGFzaHRhYmxlIHRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotCXByaXZhdGUgTWVudSBjb250ZXh0TWVudTsKLQkKLQlwdWJsaWMgTXVsdGlQYWdlVmlldyAoKSB7Ci0JCWZvcm1Xb3JrYm9vayA9IG5ldyBOb1RhYnNXb3JrYm9vaygpOwotCQlmb3JtV29ya2Jvb2suc2V0Rmlyc3RQYWdlU2VsZWN0ZWQoZmFsc2UpOwotCQlwYWdlcyA9IG5ldyBWZWN0b3IoKTsKLQkJY3JlYXRlUGFnZXMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQYWdlKFN0cmluZyBpZCwgSVVwZGF0ZUZvcm1QYWdlIHBhZ2UpIHsKLQkJdGFibGUucHV0KGlkLCBwYWdlKTsKLQkJcGFnZXMuYWRkRWxlbWVudChwYWdlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlUGFnZShJVXBkYXRlRm9ybVBhZ2UgcGFnZSkgewotCQl0YWJsZS5yZW1vdmUocGFnZSk7Ci0JCXBhZ2VzLnJlbW92ZUVsZW1lbnQocGFnZSk7Ci0JfQotCQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGNyZWF0ZVBhZ2VzKCk7Ci0KLQkvKioKLQkgKiBAc2VlIFdvcmtiZW5jaFBhcnQjc2V0Rm9jdXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCQlnZXRDdXJyZW50UGFnZSgpLnNldEZvY3VzKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBXb3JrYmVuY2hQYXJ0I2NyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLXB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQlmb3JtV29ya2Jvb2suY3JlYXRlQ29udHJvbChwYXJlbnQpOwotCWZvcm1Xb3JrYm9vay5hZGRGb3JtU2VsZWN0aW9uTGlzdGVuZXIobmV3IElGb3JtU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGZvcm1TZWxlY3RlZChJRm9ybVBhZ2UgcGFnZSwgYm9vbGVhbiBzZXRGb2N1cykgewotCQkJLy91cGRhdGVTeW5jaHJvbml6ZWRWaWV3cygoSVBERUVkaXRvclBhZ2UpIHBhZ2UpOwotCQkJLy9nZXRDb250cmlidXRvcigpLnNldEFjdGl2ZVBhZ2UoKElQREVFZGl0b3JQYWdlKSBwYWdlKTsKLQkJfQotCX0pOwotCU1lbnVNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoKTsKLQlJTWVudUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IElNZW51TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWFuYWdlcikgewotCQkJY29udGV4dE1lbnVBYm91dFRvU2hvdyhtYW5hZ2VyKTsKLQkJfQotCX07Ci0JbWFuYWdlci5zZXRSZW1vdmVBbGxXaGVuU2hvd24odHJ1ZSk7Ci0JbWFuYWdlci5hZGRNZW51TGlzdGVuZXIobGlzdGVuZXIpOwotCWNvbnRleHRNZW51ID0gbWFuYWdlci5jcmVhdGVDb250ZXh0TWVudShmb3JtV29ya2Jvb2suZ2V0Q29udHJvbCgpKTsKLQlmb3JtV29ya2Jvb2suZ2V0Q29udHJvbCgpLnNldE1lbnUoY29udGV4dE1lbnUpOwotCi0JZm9yIChJdGVyYXRvciBpdGVyID0gcGFnZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCUlGb3JtUGFnZSBwYWdlID0gKElGb3JtUGFnZSkgaXRlci5uZXh0KCk7Ci0JCWZvcm1Xb3JrYm9vay5hZGRQYWdlKHBhZ2UpOwotCX0KLSAgICBpZiAoZmlyc3RQYWdlSWQgIT0gbnVsbCkKLQkgICAgc2hvd1BhZ2UoZmlyc3RQYWdlSWQpOwotfQotCi1wdWJsaWMgdm9pZCBjb250ZXh0TWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZW51KSB7Ci0vKgotCVBERUVkaXRvckNvbnRyaWJ1dG9yIGNvbnRyaWJ1dG9yID0gZ2V0Q29udHJpYnV0b3IoKTsKLQlnZXRDdXJyZW50UGFnZSgpLmNvbnRleHRNZW51QWJvdXRUb1Nob3cobWVudSk7Ci0JaWYgKGNvbnRyaWJ1dG9yIT1udWxsKSBjb250cmlidXRvci5jb250ZXh0TWVudUFib3V0VG9TaG93KG1lbnUpOwotKi8KLX0KLQotcHVibGljIElVcGRhdGVGb3JtUGFnZSBnZXRQYWdlKFN0cmluZyBwYWdlSWQpIHsKLQlyZXR1cm4gKElVcGRhdGVGb3JtUGFnZSl0YWJsZS5nZXQocGFnZUlkKTsKLX0KLQotcHVibGljIElVcGRhdGVGb3JtUGFnZSBnZXRDdXJyZW50UGFnZSgpIHsKLQlyZXR1cm4gKElVcGRhdGVGb3JtUGFnZSlmb3JtV29ya2Jvb2suZ2V0Q3VycmVudFBhZ2UoKTsKLX0KLQotcHVibGljIE1lbnUgZ2V0Q29udGV4dE1lbnUoKSB7Ci0JcmV0dXJuIGNvbnRleHRNZW51OwotfQotCi1wdWJsaWMgSUFjdGlvbiBnZXRBY3Rpb24oU3RyaW5nIGlkKSB7Ci0JLy9yZXR1cm4gZ2V0Q29udHJpYnV0b3IoKS5nZXRHbG9iYWxBY3Rpb24oaWQpOwotCXJldHVybiBudWxsOwotfQotCi1wdWJsaWMgSUZvcm1QYWdlIHNob3dQYWdlKFN0cmluZyBpZCkgewotCXJldHVybiBzaG93UGFnZShnZXRQYWdlKGlkKSk7Ci19Ci0KLXB1YmxpYyB2b2lkIHNob3dQYWdlKFN0cmluZyBpZCwgT2JqZWN0IG9wZW5Ub09iamVjdCkgewotCUlVcGRhdGVGb3JtUGFnZSBwYWdlID0gc2hvd1BhZ2UoZ2V0UGFnZShpZCkpOwotCWlmIChwYWdlICE9IG51bGwpCi0JCXBhZ2Uub3BlblRvKG9wZW5Ub09iamVjdCk7Ci19Ci0KLXB1YmxpYyBJVXBkYXRlRm9ybVBhZ2Ugc2hvd1BhZ2UoZmluYWwgSVVwZGF0ZUZvcm1QYWdlIHBhZ2UpIHsKLQlmb3JtV29ya2Jvb2suc2VsZWN0UGFnZShwYWdlLCB0cnVlKTsKLQlyZXR1cm4gcGFnZTsKLX0KLQotcHVibGljIHZvaWQgaW5pdChJVmlld1NpdGUgc2l0ZSkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLQlzZXRTaXRlKHNpdGUpOwotCXNpdGUuZ2V0UGFnZSgpLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotfQotCQotCi1wdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCS8vIHJlbW92ZSBvdXJzZWx2ZXMgYXMgYSBzZWxlY3Rpb24gbGlzdGVuZXIKLQlnZXRTaXRlKCkuZ2V0UGFnZSgpLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgcGFnZXMuc2l6ZSgpOyBpKyspIHsKLQkJSVVwZGF0ZUZvcm1QYWdlIHBhZ2UgPSAoSVVwZGF0ZUZvcm1QYWdlKSBwYWdlcy5lbGVtZW50QXQoaSk7Ci0JCXBhZ2UuZGlzcG9zZSgpOwotCX0KLQkvLyBydW4gc3VwZXIuCi0Jc3VwZXIuZGlzcG9zZSgpOwotfQotCi1wdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsKSB7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9SZW5hbWVEaWFsb2cuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9SZW5hbWVEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg2ZjgxMC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvUmVuYW1lRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkudmlld3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuV29ya2JlbmNoSGVscDsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsLk5hbWVkTW9kZWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlQ29sb3JzOwotCi0vKioKLSAqIEBhdXRob3IgZGVqYW4KLSAqCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBlZGl0IHRoZSB0ZW1wbGF0ZSB2YXJpYWJsZSAidHlwZWNvbW1lbnQiOgotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+VGVtcGxhdGVzLgotICogVG8gZW5hYmxlIGFuZCBkaXNhYmxlIHRoZSBjcmVhdGlvbiBvZiB0eXBlIGNvbW1lbnRzIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBSZW5hbWVEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTEFCRUwgPSAiUmVuYW1lRGlhbG9nLmxhYmVsIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0VYSVNUUyA9ICJSZW5hbWVEaWFsb2cuZXhpc3RzIjsKLQlwcml2YXRlIFRleHQgdGV4dDsKLQlwcml2YXRlIENMYWJlbCBzdGF0dXM7Ci0JcHJpdmF0ZSBOYW1lZE1vZGVsT2JqZWN0IG9iamVjdDsKLQlwcml2YXRlIE9iamVjdCBbXSBzaWJsaW5nczsKLQlwcml2YXRlIEJ1dHRvbiBva0J1dHRvbjsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBSZW5hbWVEaWFsb2cuCi0JICogQHBhcmFtIHBhcmVudFNoZWxsCi0JICovCi0JcHVibGljIFJlbmFtZURpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgTmFtZWRNb2RlbE9iamVjdCBvYmplY3QsIE9iamVjdCBbXSBzaWJsaW5ncykgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCS8vc2V0U2hlbGxTdHlsZShnZXRTaGVsbFN0eWxlKCl8U1dULlJFU0laRSk7Ci0JCXRoaXMub2JqZWN0ID0gb2JqZWN0OwotCQl0aGlzLnNpYmxpbmdzID0gc2libGluZ3M7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIGNyZWF0ZSBPSyBhbmQgQ2FuY2VsIGJ1dHRvbnMgYnkgZGVmYXVsdAotCQlva0J1dHRvbiA9Ci0JCQljcmVhdGVCdXR0b24oCi0JCQkJcGFyZW50LAotCQkJCUlEaWFsb2dDb25zdGFudHMuT0tfSUQsCi0JCQkJSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwKLQkJCQl0cnVlKTsKLQkJY3JlYXRlQnV0dG9uKAotCQkJcGFyZW50LAotCQkJSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsCi0JCQlJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwKLQkJCWZhbHNlKTsKLQkJdmVyaWZ5TmFtZSgpOwotCX0KLQotCXB1YmxpYyBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMTA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDEwOwotCQljb250YWluZXIuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb250YWluZXIsIFNXVC5OVUxMKTsKLQkJbGFiZWwuc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX0xBQkVMKSk7Ci0KLQkJdGV4dCA9IG5ldyBUZXh0KGNvbnRhaW5lciwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQl0ZXh0LnNldExheW91dERhdGEoZ2QpOwotCi0JCXN0YXR1cyA9IG5ldyBDTGFiZWwoY29udGFpbmVyLCBTV1QuTlVMTCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCXN0YXR1cy5zZXRMYXlvdXREYXRhKGdkKTsKLQkJc3RhdHVzLnNldEZvcmVncm91bmQoSkZhY2VDb2xvcnMuZ2V0RXJyb3JUZXh0KHN0YXR1cy5nZXREaXNwbGF5KCkpKTsKLQkJc3RhdHVzLnNldEJhY2tncm91bmQoSkZhY2VDb2xvcnMuZ2V0RXJyb3JCYWNrZ3JvdW5kKHN0YXR1cy5nZXREaXNwbGF5KCkpKTsKLQotCQl0ZXh0LnNldFRleHQob2JqZWN0LmdldE5hbWUoKSk7Ci0JCXRleHQuc2VsZWN0QWxsKCk7Ci0JCXRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJdmVyaWZ5TmFtZSgpOwotCQkJfQotCQl9KTsKLQkJV29ya2JlbmNoSGVscC5zZXRIZWxwKGNvbnRhaW5lciwgIm9yZy5lY2xpcHNlLnVwZGF0ZS51aS5SZW5hbWVEaWFsb2ciKTsKLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5TmFtZSgpIHsKLQkJU3RyaW5nIG5hbWUgPSB0ZXh0LmdldFRleHQoKS50cmltKCk7Ci0JCWJvb2xlYW4gZHVwbGljYXRlID0gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2libGluZ3MubGVuZ3RoOyBpKyspIHsKLQkJCWlmICgoKE5hbWVkTW9kZWxPYmplY3Qpc2libGluZ3NbaV0pLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlkdXBsaWNhdGUgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXN0YXR1cy5zZXRUZXh0KAotCQkJZHVwbGljYXRlCi0JCQkJPyBVcGRhdGVVSS5nZXRGb3JtYXR0ZWRNZXNzYWdlKEtFWV9FWElTVFMsIG5hbWUpCi0JCQkJOiAiIik7Ci0JCW9rQnV0dG9uLnNldEVuYWJsZWQoIWR1cGxpY2F0ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgaWQpIHsKLQkJaWYgKGlkID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQpIHsKLQkJCW9iamVjdC5zZXROYW1lKHRleHQuZ2V0VGV4dCgpKTsKLQkJfQotCQlzdXBlci5idXR0b25QcmVzc2VkKGlkKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9TZWFyY2hNb25pdG9yTWFuYWdlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL1NlYXJjaE1vbml0b3JNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwMTNmMDUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL1NlYXJjaE1vbml0b3JNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkudmlld3M7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbC5VcGRhdGVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuc2VhcmNoLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnNlYXJjaC5TZWFyY2hPYmplY3Q7Ci0KLS8qKgotICogQGF1dGhvciBkZWphbgotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGVkaXQgdGhlIHRlbXBsYXRlIHZhcmlhYmxlICJ0eXBlY29tbWVudCI6Ci0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5UZW1wbGF0ZXMuCi0gKiBUbyBlbmFibGUgYW5kIGRpc2FibGUgdGhlIGNyZWF0aW9uIG9mIHR5cGUgY29tbWVudHMgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFNlYXJjaE1vbml0b3JNYW5hZ2VyIHsKLQlIYXNodGFibGUgbW9uaXRvcnM7Ci0KLQlzdGF0aWMgY2xhc3MgU2VhcmNoTW9uaXRvciBpbXBsZW1lbnRzIElQcm9ncmVzc01vbml0b3IsIElTZWFyY2hPYmplY3RBZGFwdGVyLCBTZXJpYWxpemFibGUgewotCQl0cmFuc2llbnQgcHJpdmF0ZSBTZWFyY2hPYmplY3Qgc29iajsKLQkJcHJpdmF0ZSBpbnQgdG90YWxXb3JrOwotCQlwcml2YXRlIGRvdWJsZSB3b3JrZWQ7Ci0JCXByaXZhdGUgYm9vbGVhbiBhY3RpdmU7Ci0KLQkJcHVibGljIFNlYXJjaE1vbml0b3IoU2VhcmNoT2JqZWN0IHNvYmopIHsKLQkJCXNldFNlYXJjaE9iamVjdChzb2JqKTsKLQkJCWlmIChzb2JqIT1udWxsKSBzb2JqLmF0dGFjaFByb2dyZXNzTW9uaXRvcih0aGlzKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgc2V0U2VhcmNoT2JqZWN0KFNlYXJjaE9iamVjdCBzb2JqKSB7Ci0JCQl0aGlzLnNvYmogPSBzb2JqOwotCQl9Ci0JCQotCQlwdWJsaWMgU2VhcmNoT2JqZWN0IGdldFNlYXJjaE9iamVjdCgpIHsKLQkJCXJldHVybiBzb2JqOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCWlmIChzb2JqIT1udWxsKSBzb2JqLmRldGFjaFByb2dyZXNzTW9uaXRvcih0aGlzKTsKLQkJCXNvYmogPSBudWxsOwotCQl9Ci0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yI2JlZ2luVGFzayhqYXZhLmxhbmcuU3RyaW5nLCBpbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBiZWdpblRhc2soU3RyaW5nIG5hbWUsIGludCB0b3RhbFdvcmspIHsKLQkJCXRoaXMudG90YWxXb3JrID0gdG90YWxXb3JrOwotCQkJd29ya2VkID0gMDsKLQkJCWFjdGl2ZSA9IHRydWU7Ci0JCQl1cGRhdGUoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yI2RvbmUoKQotCQkgKi8KLQkJcHVibGljIHZvaWQgZG9uZSgpIHsKLQkJCWFjdGl2ZSA9IGZhbHNlOwotCQkJdXBkYXRlKCk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgdXBkYXRlKCkgewotCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IFVwZGF0ZVVJLmdldEFjdGl2ZVBhZ2UoKTsKLQkJCVVwZGF0ZXNWaWV3IHVwZGF0ZXNWaWV3ID0gKFVwZGF0ZXNWaWV3KXBhZ2UuZmluZFZpZXcoVXBkYXRlUGVyc3BlY3RpdmUuSURfVVBEQVRFUyk7Ci0JCQlpZiAodXBkYXRlc1ZpZXchPW51bGwpIHsKLQkJCQl1cGRhdGVzVmlldy5vYmplY3RDaGFuZ2VkKHNvYmosIE5hbWVkTW9kZWxPYmplY3QuUF9OQU1FKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCQlpZiAoYWN0aXZlKSB7Ci0JCQkJLy9pbnQgcGVyYyA9ICh3b3JrZWQgKiAxMDApIC8gdG90YWxXb3JrOwotCQkJCWludCBwZXJjID0gKGludCkod29ya2VkICogMTAwKS90b3RhbFdvcms7Ci0JCQkJcmV0dXJuIHNvYmouZ2V0TmFtZSgpICsgIiAtICIgKyBwZXJjICsgIiUiOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gc29iai5nZXROYW1lKCk7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciNpbnRlcm5hbFdvcmtlZChkb3VibGUpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBpbnRlcm5hbFdvcmtlZChkb3VibGUgd29yaykgewotCQkJd29ya2VkICs9IHdvcms7Ci0JCQl1cGRhdGUoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yI2lzQ2FuY2VsZWQoKQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gaXNDYW5jZWxlZCgpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yI3NldENhbmNlbGVkKGJvb2xlYW4pCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRDYW5jZWxlZChib29sZWFuIHZhbHVlKSB7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciNzZXRUYXNrTmFtZShqYXZhLmxhbmcuU3RyaW5nKQotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0VGFza05hbWUoU3RyaW5nIG5hbWUpIHsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yI3N1YlRhc2soamF2YS5sYW5nLlN0cmluZykKLQkJICovCi0JCXB1YmxpYyB2b2lkIHN1YlRhc2soU3RyaW5nIG5hbWUpIHsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yI3dvcmtlZChpbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCB3b3JrZWQoaW50IHdvcmspIHsKLQkJCWludGVybmFsV29ya2VkKHdvcmspOwotCQl9Ci0KLQl9Ci0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFNlYXJjaE1vbml0b3JNYW5hZ2VyLgotCSAqLwotCXB1YmxpYyBTZWFyY2hNb25pdG9yTWFuYWdlcigpIHsKLQkJbW9uaXRvcnMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2h1dGRvd24oKSB7Ci0JCWZvciAoRW51bWVyYXRpb24gZW51bT1tb25pdG9ycy5lbGVtZW50cygpOyBlbnVtLmhhc01vcmVFbGVtZW50cygpOykgewotCQkJU2VhcmNoTW9uaXRvciBtb25pdG9yID0gKFNlYXJjaE1vbml0b3IpZW51bS5uZXh0RWxlbWVudCgpOwotCQkJbW9uaXRvci5kaXNwb3NlKCk7Ci0JCX0KLQkJbW9uaXRvcnMuY2xlYXIoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCVVwZGF0ZU1vZGVsIG1vZGVsID0gVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldFVwZGF0ZU1vZGVsKCk7Ci0JCU5hbWVkTW9kZWxPYmplY3QgW10gYm9va21hcmtzID0gbW9kZWwuZ2V0Qm9va21hcmtzKCk7Ci0JCWZvciAoaW50IGk9MDsgaTxib29rbWFya3MubGVuZ3RoOyBpKyspIHsKLQkJCXByb2Nlc3NCb29rbWFyayhib29rbWFya3NbaV0pOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBwcm9jZXNzRm9sZGVyKEJvb2ttYXJrRm9sZGVyIGZvbGRlcikgewotCQlPYmplY3QgW10gY2hpbGRyZW4gPSBmb2xkZXIuZ2V0Q2hpbGRyZW4obnVsbCk7Ci0JCWZvciAoaW50IGk9MDsgaTxjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJcHJvY2Vzc0Jvb2ttYXJrKChOYW1lZE1vZGVsT2JqZWN0KWNoaWxkcmVuW2ldKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgcHJvY2Vzc0Jvb2ttYXJrKE5hbWVkTW9kZWxPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBTZWFyY2hPYmplY3QpIHsKLQkJCXJlZ2lzdGVyKChTZWFyY2hPYmplY3Qpb2JqKTsKLQkJfQotCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBCb29rbWFya0ZvbGRlcikgewotCQkJcHJvY2Vzc0ZvbGRlcigoQm9va21hcmtGb2xkZXIpb2JqKTsKLQkJfQotCX0KLQkJCi0KLQlwdWJsaWMgdm9pZCByZWdpc3RlcihTZWFyY2hPYmplY3Qgb2JqKSB7Ci0JCWlmIChtb25pdG9ycy5nZXQob2JqKSA9PSBudWxsKQotCQkJbW9uaXRvcnMucHV0KG9iaiwgbmV3IFNlYXJjaE1vbml0b3Iob2JqKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5yZWdpc3RlcihTZWFyY2hPYmplY3Qgb2JqKSB7Ci0JCVNlYXJjaE1vbml0b3IgbW9uaXRvciA9IChTZWFyY2hNb25pdG9yKSBtb25pdG9ycy5nZXQob2JqKTsKLQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgewotCQkJbW9uaXRvci5kaXNwb3NlKCk7Ci0JCQltb25pdG9ycy5yZW1vdmUob2JqKTsKLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoU2VhcmNoT2JqZWN0IG9iaikgewotCQlTZWFyY2hNb25pdG9yIG1vbml0b3IgPSAoU2VhcmNoTW9uaXRvcikgbW9uaXRvcnMuZ2V0KG9iaik7Ci0JCWlmIChtb25pdG9yID09IG51bGwpCi0JCQlyZXR1cm4gb2JqLmdldE5hbWUoKTsKLQkJZWxzZQotCQkJcmV0dXJuIG1vbml0b3IuZ2V0TGFiZWwoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL1NlYXJjaFJlc3VsdFZpZXcuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9TZWFyY2hSZXN1bHRWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5ZGFlYjAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL1NlYXJjaFJlc3VsdFZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS52aWV3czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLldvcmtiZW5jaEhlbHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuc2VhcmNoLio7Ci0KLS8qKgotICogCi0gKi8KLQotcHVibGljIGNsYXNzIFNlYXJjaFJlc3VsdFZpZXcKLQlleHRlbmRzIEJhc2VUYWJsZVZpZXcKLQlpbXBsZW1lbnRzIElTZWxlY3Rpb25MaXN0ZW5lciB7Ci0JcHJpdmF0ZSBBY3Rpb24gc2hvd1NlYXJjaEFjdGlvbjsKLQlwcml2YXRlIE1vZGVsTGlzdGVuZXIgbW9kZWxMaXN0ZW5lcjsKLQlwcml2YXRlIFNlYXJjaE9iamVjdCBjdXJyZW50U2VhcmNoOwotCXByaXZhdGUgYm9vbGVhbiBzZWxlY3Rpb25BY3RpdmU9ZmFsc2U7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DX0ZFQVRVUkUgPQotCQkiU2VhcmNoUmVzdWx0Vmlldy5jb2x1bW4uZmVhdHVyZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DX1BST1ZJREVSID0KLQkJIlNlYXJjaFJlc3VsdFZpZXcuY29sdW1uLnByb3ZpZGVyIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NfU0lURSA9ICJTZWFyY2hSZXN1bHRWaWV3LmNvbHVtbi5zaXRlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NfVkVSU0lPTiA9Ci0JCSJTZWFyY2hSZXN1bHRWaWV3LmNvbHVtbi52ZXJzaW9uIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NfU0laRSA9ICJTZWFyY2hSZXN1bHRWaWV3LmNvbHVtbi5zaXplIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1VOS05PV05fU0laRSA9Ci0JCSJTZWFyY2hSZXN1bHRWaWV3LmNvbHVtbi5zaXplVW5rbm93biI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9USVRMRSA9ICJTZWFyY2hSZXN1bHRWaWV3LnRpdGxlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NIT1dfU0VBUkNIX0xBQkVMID0KLQkJIlNlYXJjaFJlc3VsdFZpZXcuc2hvd1NlYXJjaC5sYWJlbCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9TSE9XX1NFQVJDSF9UT09MVElQID0KLQkJIlNlYXJjaFJlc3VsdFZpZXcuc2hvd1NlYXJjaC50b29sdGlwIjsKLQotCS8qCi0JICogVGhlIGNvbnRlbnQgcHJvdmlkZXIgY2xhc3MgaXMgcmVzcG9uc2libGUgZm9yCi0JICogcHJvdmlkaW5nIG9iamVjdHMgdG8gdGhlIHZpZXcuIEl0IGNhbiB3cmFwCi0JICogZXhpc3Rpbmcgb2JqZWN0cyBpbiBhZGFwdGVycyBvciBzaW1wbHkgcmV0dXJuCi0JICogb2JqZWN0cyBhcy1pcy4gVGhlc2Ugb2JqZWN0cyBtYXkgYmUgc2Vuc2l0aXZlCi0JICogdG8gdGhlIGN1cnJlbnQgaW5wdXQgb2YgdGhlIHZpZXcsIG9yIGlnbm9yZQotCSAqIGl0IGFuZCBhbHdheXMgc2hvdyB0aGUgc2FtZSBjb250ZW50IAotCSAqIChsaWtlIFRhc2sgTGlzdCwgZm9yIGV4YW1wbGUpLgotCSAqLwotCi0JY2xhc3MgVmlld0NvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHsKLQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2LCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQl9Ci0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCX0KLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBwYXJlbnQpIHsKLQkJCWlmIChjdXJyZW50U2VhcmNoID09IG51bGwpCi0JCQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JCQlBcnJheUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJT2JqZWN0W10gc2l0ZXMgPSBjdXJyZW50U2VhcmNoLmdldENoaWxkcmVuKGN1cnJlbnRTZWFyY2gpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXRlcy5sZW5ndGg7IGkrKykgewotCQkJCVNlYXJjaFJlc3VsdFNpdGUgc2l0ZSA9IChTZWFyY2hSZXN1bHRTaXRlKSBzaXRlc1tpXTsKLQkJCQlPYmplY3RbXSByZXN1bHRzID0gc2l0ZS5nZXRDaGlsZHJlbihzaXRlKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHJlc3VsdHMubGVuZ3RoOyBqKyspIHsKLQkJCQkJcmVzdWx0LmFkZChyZXN1bHRzW2pdKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0LnRvQXJyYXkoKTsKLQkJfQotCX0KLQljbGFzcyBWaWV3TGFiZWxQcm92aWRlcgotCQlleHRlbmRzIExhYmVsUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyIHsKLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmosIGludCBjb2wpIHsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBJRmVhdHVyZUFkYXB0ZXIpIHsKLQkJCQlJRmVhdHVyZSBmZWF0dXJlOwotCQkJCXRyeSB7Ci0JCQkJCWZlYXR1cmUgPSAoKElGZWF0dXJlQWRhcHRlcikgb2JqKS5nZXRGZWF0dXJlKG51bGwpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlpZiAoY29sID09IDApCi0JCQkJCQlyZXR1cm4gZ2V0VGV4dChvYmopOwotCQkJCQlyZXR1cm4gIiI7Ci0JCQkJfQotCQkJCUlTaXRlIHNpdGUgPSAoKElGZWF0dXJlQWRhcHRlcikgb2JqKS5nZXRTaXRlKCk7Ci0JCQkJc3dpdGNoIChjb2wpIHsKLQkJCQkJY2FzZSAwIDoKLQkJCQkJCXJldHVybiBmZWF0dXJlLmdldExhYmVsKCk7Ci0JCQkJCWNhc2UgMSA6Ci0JCQkJCQlyZXR1cm4gZmVhdHVyZQotCQkJCQkJCS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkKLQkJCQkJCQkuZ2V0VmVyc2lvbigpCi0JCQkJCQkJLnRvU3RyaW5nKCk7Ci0JCQkJCWNhc2UgMiA6Ci0JCQkJCQlyZXR1cm4gZmVhdHVyZS5nZXRQcm92aWRlcigpOwotCQkJCQljYXNlIDMgOgotCQkJCQkJcmV0dXJuIHNpdGUuZ2V0VVJMKCkudG9TdHJpbmcoKTsKLQkJCQkJY2FzZSA0IDoKLQkJCQkJCWxvbmcgc2l6ZSA9IGZlYXR1cmUuZ2V0RG93bmxvYWRTaXplKCk7Ci0JCQkJCQlpZiAoc2l6ZSA9PSAtMSkKLQkJCQkJCQlyZXR1cm4gVXBkYXRlVUkuZ2V0U3RyaW5nKAotCQkJCQkJCQlLRVlfVU5LTk9XTl9TSVpFKTsKLQkJCQkJCWVsc2UKLQkJCQkJCQlyZXR1cm4gZmVhdHVyZS5nZXREb3dubG9hZFNpemUoKSArICJLQiI7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGdldFRleHQob2JqKTsKLQkJfQotCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IG9iaiwgaW50IGluZGV4KSB7Ci0JCQlpZiAoaW5kZXggPT0gMCkKLQkJCQlyZXR1cm4gZ2V0SW1hZ2Uob2JqKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3Qgb2JqKSB7Ci0JCQlyZXR1cm4gVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKS5nZXQoCi0JCQkJVXBkYXRlVUlJbWFnZXMuREVTQ19GRUFUVVJFX09CSik7Ci0JCX0KLQl9Ci0JY2xhc3MgTmFtZVNvcnRlciBleHRlbmRzIFZpZXdlclNvcnRlciB7Ci0JfQotCi0JY2xhc3MgTW9kZWxMaXN0ZW5lciBpbXBsZW1lbnRzIElVcGRhdGVNb2RlbENoYW5nZWRMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIG9iamVjdHNBZGRlZChPYmplY3QgcGFyZW50LCBPYmplY3RbXSBjaGlsZHJlbikgewotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIFNlYXJjaFJlc3VsdFNpdGUpIHsKLQkJCQlnZXRUYWJsZVZpZXdlcigpLmFkZChjaGlsZHJlbik7Ci0JCQkJdXBkYXRlVGl0bGUoKTsKLQkJCX0KLQkJfQotCQlwdWJsaWMgdm9pZCBvYmplY3RzUmVtb3ZlZChPYmplY3QgcGFyZW50LCBPYmplY3RbXSBjaGlsZHJlbikgewotCQl9Ci0JCXB1YmxpYyB2b2lkIG9iamVjdENoYW5nZWQoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgU2VhcmNoT2JqZWN0KSB7Ci0JCQkJaWYgKFNlYXJjaE9iamVjdC5QX1JFRlJFU0guZXF1YWxzKHByb3BlcnR5KSkgewotCQkJCQlnZXRWaWV3ZXIoKS5yZWZyZXNoKCk7Ci0JCQkJCXVwZGF0ZVRpdGxlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBTZWFyY2hSZXN1bHRWaWV3KCkgewotCQlVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0TGFiZWxQcm92aWRlcigpLmNvbm5lY3QodGhpcyk7Ci0JCW1vZGVsTGlzdGVuZXIgPSBuZXcgTW9kZWxMaXN0ZW5lcigpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgYSBjYWxsYmFjayB0aGF0IHdpbGwgYWxsb3cgdXMKLQkgKiB0byBjcmVhdGUgdGhlIHZpZXdlciBhbmQgaW5pdGlhbGl6ZSBpdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0UHJvdmlkZXJzKCkgewotCQlUYWJsZVZpZXdlciB2aWV3ZXIgPSBnZXRUYWJsZVZpZXdlcigpOwotCQljcmVhdGVDb2x1bW5zKCk7Ci0JCXZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IFZpZXdDb250ZW50UHJvdmlkZXIoKSk7Ci0JCXZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBWaWV3TGFiZWxQcm92aWRlcigpKTsKLQkJdmlld2VyLnNldFNvcnRlcihuZXcgTmFtZVNvcnRlcigpKTsKLQkJdmlld2VyLnNldElucHV0KFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKSk7Ci0JCVdvcmtiZW5jaEhlbHAuc2V0SGVscCgKLQkJCWdldENvbnRyb2woKSwKLQkJCSJvcmcuZWNsaXBzZS51cGRhdGUudWkuU2VhcmNoUmVzdWx0VmlldyIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBhcnRDb250cm9sQ3JlYXRlZCgpIHsKLQkJc3VwZXIucGFydENvbnRyb2xDcmVhdGVkKCk7Ci0JCVVwZGF0ZU1vZGVsIG1vZGVsID0gVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldFVwZGF0ZU1vZGVsKCk7Ci0JCW1vZGVsLmFkZFVwZGF0ZU1vZGVsQ2hhbmdlZExpc3RlbmVyKG1vZGVsTGlzdGVuZXIpOwotCQlob29rU2VsZWN0aW9uTGlzdGVuZXIodHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhvb2tTZWxlY3Rpb25MaXN0ZW5lcihib29sZWFuIGFkZCkgewotCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gVXBkYXRlVUkuZ2V0QWN0aXZlUGFnZSgpOwotCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQlpZiAoYWRkKQotCQkJCXBhZ2UuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCQllbHNlCi0JCQkJcGFnZS5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVDb2x1bW5zKCkgewotCQlUYWJsZSB0YWJsZSA9IGdldFRhYmxlVmlld2VyKCkuZ2V0VGFibGUoKTsKLQkJdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQotCQlUYWJsZUNvbHVtbiBjb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OVUxMKTsKLQkJY29sdW1uLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9DX0ZFQVRVUkUpKTsKLQotCQljb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OVUxMKTsKLQkJY29sdW1uLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9DX1ZFUlNJT04pKTsKLQotCQljb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OVUxMKTsKLQkJY29sdW1uLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9DX1BST1ZJREVSKSk7Ci0KLQkJY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTlVMTCk7Ci0JCWNvbHVtbi5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfQ19TSVRFKSk7Ci0KLQkJY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTlVMTCk7Ci0JCWNvbHVtbi5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfQ19TSVpFKSk7Ci0KLQkJVGFibGVMYXlvdXQgbGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0JCWxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDEwMCwgMjAwLCB0cnVlKSk7Ci0JCWxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDEwMCwgNTAsIHRydWUpKTsKLQkJbGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoMTAwLCAxMDAsIHRydWUpKTsKLQkJbGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoMTAwLCAxMDAsIHRydWUpKTsKLQkJbGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoNTAsIHRydWUpKTsKLQkJdGFibGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKS5kaXNjb25uZWN0KHRoaXMpOwotCQlVcGRhdGVNb2RlbCBtb2RlbCA9IFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRVcGRhdGVNb2RlbCgpOwotCQltb2RlbC5yZW1vdmVVcGRhdGVNb2RlbENoYW5nZWRMaXN0ZW5lcihtb2RlbExpc3RlbmVyKTsKLQkJaG9va1NlbGVjdGlvbkxpc3RlbmVyKGZhbHNlKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGZpbGxDb250ZXh0TWVudShJTWVudU1hbmFnZXIgbWFuYWdlcikgewotCQltYW5hZ2VyLmFkZChzaG93U2VhcmNoQWN0aW9uKTsKLQkJbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiYWRkaXRpb25zIikpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGZpbGxBY3Rpb25CYXJzKElBY3Rpb25CYXJzIGJhcnMpIHsKLQkJSVRvb2xCYXJNYW5hZ2VyIG1hbmFnZXIgPSBiYXJzLmdldFRvb2xCYXJNYW5hZ2VyKCk7Ci0JCW1hbmFnZXIuYWRkKHNob3dTZWFyY2hBY3Rpb24pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIG1ha2VBY3Rpb25zKCkgewotCQlzaG93U2VhcmNoQWN0aW9uID0gbmV3IEFjdGlvbigpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gVXBkYXRlVUkuZ2V0QWN0aXZlUGFnZSgpOwotCQkJCQlEZXRhaWxzVmlldyBkdmlldyA9Ci0JCQkJCQkoRGV0YWlsc1ZpZXcpIHBhZ2Uuc2hvd1ZpZXcoCi0JCQkJCQkJVXBkYXRlUGVyc3BlY3RpdmUuSURfREVUQUlMUyk7Ci0JCQkJCWR2aWV3LnNob3dQYWdlKERldGFpbHNWaWV3LlNFQVJDSF9QQUdFLCBjdXJyZW50U2VhcmNoKTsKLQkJCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVVwZGF0ZVVJLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCXNob3dTZWFyY2hBY3Rpb24uc2V0VGV4dCgKLQkJCVVwZGF0ZVVJLmdldFN0cmluZyhLRVlfU0hPV19TRUFSQ0hfTEFCRUwpKTsKLQkJc2hvd1NlYXJjaEFjdGlvbi5zZXRUb29sVGlwVGV4dCgKLQkJCVVwZGF0ZVVJLmdldFN0cmluZyhLRVlfU0hPV19TRUFSQ0hfVE9PTFRJUCkpOwotCQlzaG93U2VhcmNoQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcigKLQkJCVVwZGF0ZVVJSW1hZ2VzLkRFU0NfU0hPV19TRUFSQ0gpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEN1cnJlbnRTZWFyY2goU2VhcmNoT2JqZWN0IGN1cnJlbnRTZWFyY2gpIHsKLQkJdGhpcy5jdXJyZW50U2VhcmNoID0gY3VycmVudFNlYXJjaDsKLQkJZ2V0Vmlld2VyKCkuc2V0SW5wdXQoY3VycmVudFNlYXJjaCk7Ci0JCXVwZGF0ZVRpdGxlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVRpdGxlKCkgewotCQlpZiAoY3VycmVudFNlYXJjaCA9PSBudWxsKQotCQkJc2V0VGl0bGUoZ2V0U2l0ZSgpLmdldFJlZ2lzdGVyZWROYW1lKCkpOwotCQllbHNlIHsKLQkJCWludCBjb3VudCA9IGdldFRhYmxlVmlld2VyKCkuZ2V0VGFibGUoKS5nZXRJdGVtQ291bnQoKTsKLQkJCVN0cmluZyB0aXRsZSA9Ci0JCQkJVXBkYXRlVUkuZ2V0Rm9ybWF0dGVkTWVzc2FnZSgKLQkJCQkJS0VZX1RJVExFLAotCQkJCQluZXcgU3RyaW5nW10gewotCQkJCQkJZ2V0U2l0ZSgpLmdldFJlZ2lzdGVyZWROYW1lKCksCi0JCQkJCQlnZXRTZWFyY2hMYWJlbChjdXJyZW50U2VhcmNoKSwKLQkJCQkJCSIiICsgY291bnQgfSk7Ci0JCQlzZXRUaXRsZSh0aXRsZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRTZWFyY2hMYWJlbChTZWFyY2hPYmplY3Qgc2VhcmNoT2JqZWN0KSB7Ci0JCVNlYXJjaENhdGVnb3J5RGVzY3JpcHRvciBzZGVzYyA9Ci0JCQlTZWFyY2hDYXRlZ29yeVJlZ2lzdHJ5UmVhZGVyLmdldERlZmF1bHQoKS5nZXREZXNjcmlwdG9yKAotCQkJCXNlYXJjaE9iamVjdC5nZXRDYXRlZ29yeUlkKCkpOwotCQlJU2VhcmNoQ2F0ZWdvcnkgY2F0ZWdvcnkgPSBzZGVzYy5jcmVhdGVDYXRlZ29yeSgpOwotCQlpZiAoY2F0ZWdvcnkgIT0gbnVsbCkKLQkJCXJldHVybiBjYXRlZ29yeS5nZXRDdXJyZW50U2VhcmNoKCk7Ci0JCWVsc2UKLQkJCXJldHVybiBzZWFyY2hPYmplY3QuZ2V0TmFtZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbkFjdGl2ZShib29sZWFuIGFjdGl2ZSkgewotCQlpZiAoYWN0aXZlKQotCQkJZ2V0U2l0ZSgpLnNldFNlbGVjdGlvblByb3ZpZGVyKGdldFZpZXdlcigpKTsKLQkJZWxzZQotCQkJZ2V0U2l0ZSgpLnNldFNlbGVjdGlvblByb3ZpZGVyKG51bGwpOwotCQl1cGRhdGVUaXRsZSgpOwotCQl0aGlzLnNlbGVjdGlvbkFjdGl2ZSA9IGFjdGl2ZTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gaXNTZWxlY3Rpb25BY3RpdmUoKSB7Ci0JCXJldHVybiBzZWxlY3Rpb25BY3RpdmU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCWlmIChzc2VsLnNpemUoKSA9PSAxKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IHNzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFNlYXJjaE9iamVjdCkKLQkJCQkJc2V0Q3VycmVudFNlYXJjaCgoU2VhcmNoT2JqZWN0KSBvYmopOwotCQkJfQotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9TZWxlY3RlZFVwZGF0ZXNWaWV3LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvU2VsZWN0ZWRVcGRhdGVzVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWQ5NWU4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9TZWxlY3RlZFVwZGF0ZXNWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkudmlld3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLldvcmtiZW5jaEhlbHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkucGFydHMuU2hhcmVkTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkud2l6YXJkcy4qOwotCi0vKioKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWxlY3RlZFVwZGF0ZXNWaWV3IGV4dGVuZHMgQmFzZVRhYmxlVmlldyB7Ci0JcHJpdmF0ZSBVcGRhdGVNb2RlbENoYW5nZWRMaXN0ZW5lciBtb2RlbExpc3RlbmVyOwotCXByaXZhdGUgQWN0aW9uIGRlbGV0ZUFjdGlvbjsKLQlwcml2YXRlIEFjdGlvbiBwcm9jZXNzQWN0aW9uOwotCXByaXZhdGUgQWN0aW9uIHByb2Nlc3NBbGxBY3Rpb247Ci0KLQljbGFzcyBWaWV3Q29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewotCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHYsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJfQotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IHBhcmVudCkgewotCQkJcmV0dXJuIFVwZGF0ZVVJCi0JCQkJLmdldERlZmF1bHQoKQotCQkJCS5nZXRVcGRhdGVNb2RlbCgpCi0JCQkJLmdldFBlbmRpbmdDaGFuZ2VzKCk7Ci0JCX0KLQl9Ci0KLQljbGFzcyBWaWV3TGFiZWxQcm92aWRlcgotCQlleHRlbmRzIExhYmVsUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyIHsKLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmosIGludCBjb2wpIHsKLQkJCXJldHVybiBnZXRUZXh0KG9iaik7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmopIHsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBJRmVhdHVyZUFkYXB0ZXIpIHsKLQkJCQl0cnkgewotCQkJCQlJRmVhdHVyZSBmZWF0dXJlID0gKChJRmVhdHVyZUFkYXB0ZXIpIG9iaikuZ2V0RmVhdHVyZShudWxsKTsKLQkJCQkJVmVyc2lvbmVkSWRlbnRpZmllciB2ZXJzaW9uZWRJZGVudGlmaWVyID0KLQkJCQkJCShmZWF0dXJlICE9IG51bGwpCi0JCQkJCQkJPyBmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKQotCQkJCQkJCTogbnVsbDsKLQkJCQkJU3RyaW5nIHZlcnNpb24gPSAiIjsKLQkJCQkJaWYgKHZlcnNpb25lZElkZW50aWZpZXIgIT0gbnVsbCkKLQkJCQkJCXZlcnNpb24gPSB2ZXJzaW9uZWRJZGVudGlmaWVyLmdldFZlcnNpb24oKS50b1N0cmluZygpOwotCQkJCQlTdHJpbmcgbGFiZWwgPSAoZmVhdHVyZSAhPSBudWxsKSA/IGZlYXR1cmUuZ2V0TGFiZWwoKSA6ICIiOwotCQkJCQlyZXR1cm4gbGFiZWwgKyAiICIgKyB2ZXJzaW9uOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBzdXBlci5nZXRUZXh0KG9iaik7Ci0JCX0KLQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBvYmosIGludCBpbmRleCkgewotCQkJUGVuZGluZ0NoYW5nZSBqb2IgPSAoUGVuZGluZ0NoYW5nZSkgb2JqOwotCQkJaW50IGZsYWdzID0gMDsKLQkJCXN3aXRjaCAoam9iLmdldEpvYlR5cGUoKSkgewotCQkJCWNhc2UgUGVuZGluZ0NoYW5nZS5JTlNUQUxMIDoKLQkJCQkJZmxhZ3MgPSBTaGFyZWRMYWJlbFByb3ZpZGVyLkZfQUREOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFBlbmRpbmdDaGFuZ2UuVU5JTlNUQUxMIDoKLQkJCQkJZmxhZ3MgPSBTaGFyZWRMYWJlbFByb3ZpZGVyLkZfREVMOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFBlbmRpbmdDaGFuZ2UuQ09ORklHVVJFIDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBQZW5kaW5nQ2hhbmdlLlVOQ09ORklHVVJFIDoKLQkJCQkJZmxhZ3MgPSBTaGFyZWRMYWJlbFByb3ZpZGVyLkZfVU5DT05GSUdVUkVEOwotCQkJCQlicmVhazsKLQkJCX0KLQkJCWJvb2xlYW4gcGF0Y2ggPSBqb2IuZ2V0RmVhdHVyZSgpLmlzUGF0Y2goKTsKLQkJCUltYWdlRGVzY3JpcHRvciBkZXNjID0gcGF0Y2g/VXBkYXRlVUlJbWFnZXMuREVTQ19FRklYX09CSjoKLQkJCVVwZGF0ZVVJSW1hZ2VzLkRFU0NfRkVBVFVSRV9PQko7Ci0JCQlyZXR1cm4gVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKS5nZXQoCi0JCQkJZGVzYywKLQkJCQlmbGFncyk7Ci0JCX0KLQl9Ci0KLQljbGFzcyBVcGRhdGVNb2RlbENoYW5nZWRMaXN0ZW5lciBpbXBsZW1lbnRzIElVcGRhdGVNb2RlbENoYW5nZWRMaXN0ZW5lciB7Ci0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbC5JVXBkYXRlTW9kZWxDaGFuZ2VkTGlzdGVuZXIjb2JqZWN0Q2hhbmdlZChqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nKQotCQkgKi8KLQkJcHVibGljIHZvaWQgb2JqZWN0Q2hhbmdlZChmaW5hbCBPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBQZW5kaW5nQ2hhbmdlKSB7Ci0JCQkJZ2V0VGFibGVWaWV3ZXIoKQotCQkJCQkuZ2V0Q29udHJvbCgpCi0JCQkJCS5nZXREaXNwbGF5KCkKLQkJCQkJLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWdldFRhYmxlVmlld2VyKCkudXBkYXRlKG9iamVjdCwgbnVsbCk7Ci0JCQkJCQl1cGRhdGVUaXRsZSgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWwuSVVwZGF0ZU1vZGVsQ2hhbmdlZExpc3RlbmVyI29iamVjdHNBZGRlZChqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIHZvaWQgb2JqZWN0c0FkZGVkKE9iamVjdCBwYXJlbnQsIGZpbmFsIE9iamVjdFtdIGNoaWxkcmVuKSB7Ci0JCQlpZiAoY2hpbGRyZW5bMF0gaW5zdGFuY2VvZiBQZW5kaW5nQ2hhbmdlKSB7Ci0JCQkJZ2V0VGFibGVWaWV3ZXIoKQotCQkJCQkuZ2V0Q29udHJvbCgpCi0JCQkJCS5nZXREaXNwbGF5KCkKLQkJCQkJLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWdldFRhYmxlVmlld2VyKCkuYWRkKGNoaWxkcmVuKTsKLQkJCQkJCXVwZGF0ZVRpdGxlKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbC5JVXBkYXRlTW9kZWxDaGFuZ2VkTGlzdGVuZXIjb2JqZWN0c1JlbW92ZWQoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIG9iamVjdHNSZW1vdmVkKE9iamVjdCBwYXJlbnQsIGZpbmFsIE9iamVjdFtdIGNoaWxkcmVuKSB7Ci0JCQlpZiAoY2hpbGRyZW5bMF0gaW5zdGFuY2VvZiBQZW5kaW5nQ2hhbmdlKSB7Ci0JCQkJZ2V0VGFibGVWaWV3ZXIoKQotCQkJCQkuZ2V0Q29udHJvbCgpCi0JCQkJCS5nZXREaXNwbGF5KCkKLQkJCQkJLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWdldFRhYmxlVmlld2VyKCkucmVtb3ZlKGNoaWxkcmVuKTsKLQkJCQkJCXVwZGF0ZVRpdGxlKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBTZWxlY3RlZFVwZGF0ZXNWaWV3KCkgewotCQltb2RlbExpc3RlbmVyID0gbmV3IFVwZGF0ZU1vZGVsQ2hhbmdlZExpc3RlbmVyKCk7Ci0JCVVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRMYWJlbFByb3ZpZGVyKCkuY29ubmVjdCh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS52aWV3cy5CYXNlVmlldyNpbml0UHJvdmlkZXJzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0UHJvdmlkZXJzKCkgewotCQlUYWJsZVZpZXdlciB2aWV3ZXIgPSBnZXRUYWJsZVZpZXdlcigpOwotCQl2aWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBWaWV3Q29udGVudFByb3ZpZGVyKCkpOwotCQl2aWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgVmlld0xhYmVsUHJvdmlkZXIoKSk7Ci0JCXZpZXdlci5zZXRJbnB1dChVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0VXBkYXRlTW9kZWwoKSk7Ci0JCVdvcmtiZW5jaEhlbHAuc2V0SGVscCh2aWV3ZXIuZ2V0Q29udHJvbCgpLCAib3JnLmVjbGlwc2UudXBkYXRlLnVpLlNlbGVjdGVkVXBkYXRlc1ZpZXciKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmaWxsQ29udGV4dE1lbnUoSU1lbnVNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJcHJvY2Vzc0FjdGlvbi5zZXRFbmFibGVkKGNhblByb2Nlc3MoKSk7Ci0JCW1hbmFnZXIuYWRkKHByb2Nlc3NBY3Rpb24pOwotCQltYW5hZ2VyLmFkZChwcm9jZXNzQWxsQWN0aW9uKTsKLQkJbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJZGVsZXRlQWN0aW9uLnNldEVuYWJsZWQoY2FuRGVsZXRlKCkpOwotCQltYW5hZ2VyLmFkZChkZWxldGVBY3Rpb24pOwotCQltYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQlzdXBlci5maWxsQ29udGV4dE1lbnUobWFuYWdlcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbWFrZUFjdGlvbnMoKSB7Ci0JCWRlbGV0ZUFjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJZG9EZWxldGUoKTsKLQkJCX0KLQkJfTsKLQkJZGVsZXRlQWN0aW9uLnNldFRleHQoCi0JCQlVcGRhdGVVSS5nZXRTdHJpbmcoIkl0ZW1zVmlldy5wb3B1cC5kZWxldGUiKSk7Ci0JCQkKLQkJcHJvY2Vzc0FjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJZG9Qcm9jZXNzKCk7Ci0JCQl9Ci0JCX07Ci0JCXByb2Nlc3NBY3Rpb24uc2V0VGV4dCgKLQkJCVVwZGF0ZVVJLmdldFN0cmluZygiSXRlbXNWaWV3LnBvcHVwLnByb2Nlc3MiKSk7Ci0KLQkJcHJvY2Vzc0FsbEFjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJZG9Qcm9jZXNzQWxsKCk7Ci0JCQl9Ci0JCX07Ci0JCXByb2Nlc3NBbGxBY3Rpb24uc2V0VGV4dCgKLQkJCVVwZGF0ZVVJLmdldFN0cmluZygiSXRlbXNWaWV3LnBvcHVwLnByb2Nlc3NBbGwiKSk7Ci0KLQkJc3VwZXIubWFrZUFjdGlvbnMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlob29rTGlzdGVuZXJzKGZhbHNlKTsKLQkJVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKS5kaXNjb25uZWN0KHRoaXMpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGFydENvbnRyb2xDcmVhdGVkKCkgewotCQlVcGRhdGVNb2RlbCBtb2RlbCA9IFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRVcGRhdGVNb2RlbCgpOwotCQlob29rTGlzdGVuZXJzKHRydWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGhvb2tMaXN0ZW5lcnMoYm9vbGVhbiBhZGQpIHsKLQkJVXBkYXRlTW9kZWwgbW9kZWwgPSBVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0VXBkYXRlTW9kZWwoKTsKLQkJaWYgKGFkZCkKLQkJCW1vZGVsLmFkZFVwZGF0ZU1vZGVsQ2hhbmdlZExpc3RlbmVyKG1vZGVsTGlzdGVuZXIpOwotCQllbHNlCi0JCQltb2RlbC5yZW1vdmVVcGRhdGVNb2RlbENoYW5nZWRMaXN0ZW5lcihtb2RlbExpc3RlbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkZWxldGVLZXlQcmVzc2VkKFdpZGdldCB3aWRnZXQpIHsKLQkJaWYgKGNhbkRlbGV0ZSgpKQotCQkJZG9EZWxldGUoKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2FuUHJvY2VzcygpIHsKLQkJcmV0dXJuIGNhbkRlbGV0ZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkb1Byb2Nlc3MoKSB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNzZWwgPQotCQkJKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRWaWV3ZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJQXJyYXlMaXN0IGpvYnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHNzZWwuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlQZW5kaW5nQ2hhbmdlIGpvYiA9IChQZW5kaW5nQ2hhbmdlKSBpdGVyLm5leHQoKTsKLQkJCWlmIChqb2IuaXNQcm9jZXNzZWQoKSA9PSBmYWxzZSkKLQkJCQlqb2JzLmFkZChqb2IpOwotCQl9Ci0JCVBlbmRpbmdDaGFuZ2VbXSByZXN1bHQgPQotCQkJKFBlbmRpbmdDaGFuZ2VbXSkgam9icy50b0FycmF5KG5ldyBQZW5kaW5nQ2hhbmdlW2pvYnMuc2l6ZSgpXSk7Ci0JCWRvUHJvY2VzcyhyZXN1bHQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkb1Byb2Nlc3NBbGwoKSB7Ci0JCVVwZGF0ZU1vZGVsIG1vZGVsID0gVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldFVwZGF0ZU1vZGVsKCk7Ci0JCVBlbmRpbmdDaGFuZ2VbXSBqb2JzID0gbW9kZWwuZ2V0UGVuZGluZ0NoYW5nZXMoKTsKLQkJZG9Qcm9jZXNzKGpvYnMpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkb1Byb2Nlc3MoZmluYWwgUGVuZGluZ0NoYW5nZVtdIGpvYnMpIHsKLQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCU11bHRpSW5zdGFsbFdpemFyZCB3aXphcmQgPSBuZXcgTXVsdGlJbnN0YWxsV2l6YXJkKGpvYnMpOwotCQkJCVdpemFyZERpYWxvZyBkaWFsb2cgPQotCQkJCQluZXcgSW5zdGFsbFdpemFyZERpYWxvZygKLQkJCQkJCWdldENvbnRyb2woKS5nZXRTaGVsbCgpLAotCQkJCQkJd2l6YXJkKTsKLQkJCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCQkJZGlhbG9nLmdldFNoZWxsKCkuc2V0U2l6ZSg2MDAsIDUwMCk7Ci0JCQkJZGlhbG9nLm9wZW4oKTsKLQkJCQlpZiAod2l6YXJkLmlzU3VjY2Vzc2Z1bEluc3RhbGwoKSkKLQkJCQkJVXBkYXRlVUkuaW5mb3JtUmVzdGFydE5lZWRlZCgpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZG9EZWxldGUoKSB7Ci0JCWlmICghY29uZmlybURlbGV0aW9uKCkpCi0JCQlyZXR1cm47Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNzZWwgPQotCQkJKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRWaWV3ZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJVXBkYXRlTW9kZWwgbW9kZWwgPSBVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0VXBkYXRlTW9kZWwoKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzc2VsLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJbW9kZWwucmVtb3ZlUGVuZGluZ0NoYW5nZSgoUGVuZGluZ0NoYW5nZSkgaXRlci5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGNhbkRlbGV0ZSgpIHsKLQkJcmV0dXJuIGdldFZpZXdlcigpLmdldFNlbGVjdGlvbigpLmlzRW1wdHkoKSA9PSBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlVGl0bGUoKSB7Ci0JCVVwZGF0ZU1vZGVsIG1vZGVsID0gVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldFVwZGF0ZU1vZGVsKCk7Ci0JCVBlbmRpbmdDaGFuZ2VbXSBjaGFuZ2VzID0gbW9kZWwuZ2V0UGVuZGluZ0NoYW5nZXMoKTsKLQotCQlpbnQgdG90YWwgPSBjaGFuZ2VzLmxlbmd0aDsKLQkJaW50IGNvbXBsZXRlZCA9IDA7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFuZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlQZW5kaW5nQ2hhbmdlIGpvYiA9IGNoYW5nZXNbaV07Ci0JCQlpZiAoam9iLmlzUHJvY2Vzc2VkKCkpCi0JCQkJY29tcGxldGVkKys7Ci0JCX0KLQkJU3RyaW5nIGJhc2VOYW1lID0gZ2V0U2l0ZSgpLmdldFJlZ2lzdGVyZWROYW1lKCk7Ci0JCVN0cmluZyB0aXRsZSA9Ci0JCQlVcGRhdGVVSS5nZXRGb3JtYXR0ZWRNZXNzYWdlKAotCQkJCSJJdGVtc1ZpZXcudGl0bGUiLAotCQkJCW5ldyBTdHJpbmdbXSB7Ci0JCQkJCWdldFNpdGUoKS5nZXRSZWdpc3RlcmVkTmFtZSgpLAotCQkJCQkiIiArIHRvdGFsLAotCQkJCQkiIiArIGNvbXBsZXRlZCB9KTsKLQkJc2V0VGl0bGUodGl0bGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9TaXRlU3RhdGVBY3Rpb24uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9TaXRlU3RhdGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZkYWM3YS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvU2l0ZVN0YXRlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS52aWV3czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uSUNvbmZpZ3VyZWRTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlNpdGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuZm9ybXMuQWN0aXZpdHlDb25zdHJhaW50czsKLQotLyoqCi0gKiBAYXV0aG9yIGRlamFuCi0gKgotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZWRpdCB0aGUgdGVtcGxhdGUgdmFyaWFibGUgInR5cGVjb21tZW50IjoKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPlRlbXBsYXRlcy4KLSAqIFRvIGVuYWJsZSBhbmQgZGlzYWJsZSB0aGUgY3JlYXRpb24gb2YgdHlwZSBjb21tZW50cyBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uLgotICovCi0KLXB1YmxpYyBjbGFzcyBTaXRlU3RhdGVBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCXByaXZhdGUgSUNvbmZpZ3VyZWRTaXRlIHNpdGU7Ci0KLQlwdWJsaWMgU2l0ZVN0YXRlQWN0aW9uKCkgewotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNpdGUoSUNvbmZpZ3VyZWRTaXRlIHNpdGUpIHsKLQkJdGhpcy5zaXRlID0gc2l0ZTsKLQkJYm9vbGVhbiBzdGF0ZSA9IHNpdGUuaXNFbmFibGVkKCk7Ci0JCXNldFRleHQoc3RhdGUgPyBVcGRhdGVVSS5nZXRTdHJpbmcoIlNpdGVTdGF0ZUFjdGlvbi5kaXNhYmxlTGFiZWwiKSA6IFVwZGF0ZVVJLmdldFN0cmluZygiU2l0ZVN0YXRlQWN0aW9uLmVuYWJsZUxhYmVsIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWlmIChzaXRlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWJvb2xlYW4gb2xkVmFsdWUgPSBzaXRlLmlzRW5hYmxlZCgpOwotCQlib29sZWFuIG5ld1ZhbHVlID0gIW9sZFZhbHVlOwotCQlpZiAoIWNvbmZpcm0obmV3VmFsdWUpKQotCQkJcmV0dXJuOwotCQlzaXRlLnNldEVuYWJsZWQobmV3VmFsdWUpOwotCQlJU3RhdHVzIHN0YXR1cyA9IEFjdGl2aXR5Q29uc3RyYWludHMudmFsaWRhdGVDdXJyZW50U3RhdGUoKTsKLQkJaWYgKHN0YXR1cyAhPSBudWxsKSB7Ci0JCQlFcnJvckRpYWxvZy5vcGVuRXJyb3IoCi0JCQkJVXBkYXRlVUkuZ2V0QWN0aXZlV29ya2JlbmNoU2hlbGwoKSwKLQkJCQludWxsLAotCQkJCW51bGwsCi0JCQkJc3RhdHVzKTsKLQkJCXNpdGUuc2V0RW5hYmxlZChvbGRWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0gZWxzZSB7Ci0JCQkvLyBkbyBhIHJlc3RhcnQKLQkJCXRyeSB7Ci0JCQkJU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkuc2F2ZSgpOwotCQkJCVVwZGF0ZVVJLmluZm9ybVJlc3RhcnROZWVkZWQoKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCXNpdGUuc2V0RW5hYmxlZChvbGRWYWx1ZSk7Ci0JCQkJVXBkYXRlVUkubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGNvbmZpcm0oYm9vbGVhbiBuZXdTdGF0ZSkgewotCQlTdHJpbmcgbmFtZSA9IHNpdGUuZ2V0U2l0ZSgpLmdldFVSTCgpLnRvU3RyaW5nKCk7Ci0JCVN0cmluZyBlbmFibGVNZXNzYWdlID0gVXBkYXRlVUkuZ2V0Rm9ybWF0dGVkTWVzc2FnZSgiU2l0ZVN0YXRlQWN0aW9uLmVuYWJsZU1lc3NhZ2UiLCBuYW1lKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCVN0cmluZyBkaXNhYmxlTWVzc2FnZSA9IFVwZGF0ZVVJLmdldEZvcm1hdHRlZE1lc3NhZ2UoIlNpdGVTdGF0ZUFjdGlvbi5kaXNhYmxlTWVzc2FnZSIsIG5hbWUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlTdHJpbmcgbWVzc2FnZSA9IG5ld1N0YXRlID8gZW5hYmxlTWVzc2FnZSA6IGRpc2FibGVNZXNzYWdlOwotCQlyZXR1cm4gTWVzc2FnZURpYWxvZy5vcGVuQ29uZmlybShVcGRhdGVVSS5nZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpLCBVcGRhdGVVSS5nZXRTdHJpbmcoIlNpdGVTdGF0ZUFjdGlvbi5kaWFsb2dUaXRsZSIpLCBtZXNzYWdlKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9VcGRhdGVNb2RlbERhdGFUcmFuc2Zlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL1VwZGF0ZU1vZGVsRGF0YVRyYW5zZmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzYjYzNDUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL1VwZGF0ZU1vZGVsRGF0YVRyYW5zZmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkudmlld3M7Ci0KLQotaW1wb3J0IGphdmEuaW8uKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuKjsKLQotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBVcGRhdGVNb2RlbERhdGFUcmFuc2ZlciBleHRlbmRzIEJ5dGVBcnJheVRyYW5zZmVyIHsKLQkvKioKLQkgKiBTaW5nbGV0b24gaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVXBkYXRlTW9kZWxEYXRhVHJhbnNmZXIgaW5zdGFuY2UgPQotCQluZXcgVXBkYXRlTW9kZWxEYXRhVHJhbnNmZXIoKTsKLQkvLyBDcmVhdGUgYSB1bmlxdWUgSUQgdG8gbWFrZSBzdXJlIHRoYXQgZGlmZmVyZW50IEVjbGlwc2UKLQkvLyBhcHBsaWNhdGlvbnMgdXNlIGRpZmZlcmVudCAidHlwZXMiIG9mIDxjb2RlPlVwZGF0ZU1vZGVsRGF0YVRyYW5zZmVyPC9jb2RlPgotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfUFJFRklYID0gInVwZGF0ZS1tb2RlbC10cmFuc2Zlci1mb3JtYXQiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX05BTUUgPQotCQlUWVBFX1BSRUZJWCArICI6IgotCQkJKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKQotCQkJKyAiOiIKLQkJCSsgaW5zdGFuY2UuaGFzaENvZGUoKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUWVBFSUQgPSByZWdpc3RlclR5cGUoVFlQRV9OQU1FKTsKLQkKLQlwdWJsaWMgc3RhdGljIFVwZGF0ZU1vZGVsRGF0YVRyYW5zZmVyIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIE1vZGVsRGF0YVRyYW5zZmVyLgotCSAqLwotCXB1YmxpYyBVcGRhdGVNb2RlbERhdGFUcmFuc2ZlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogTWV0aG9kIGRlY2xhcmVkIG9uIFRyYW5zZmVyLgotCSAqLwotCXByb3RlY3RlZCBpbnRbXSBnZXRUeXBlSWRzKCkgewotCQlyZXR1cm4gbmV3IGludFtdIHsgVFlQRUlEIH07Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBSZXR1cm5zIHRoZSB0eXBlIG5hbWVzLgotCSAqCi0JICogQHJldHVybiB0aGUgbGlzdCBvZiB0eXBlIG5hbWVzCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFR5cGVOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7IFRZUEVfTkFNRSB9OwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JCSogTWV0aG9kIGRlY2xhcmVkIG9uIFRyYW5zZmVyLgotCQkqLwotCXByb3RlY3RlZCB2b2lkIGphdmFUb05hdGl2ZShPYmplY3QgZGF0YSwgVHJhbnNmZXJEYXRhIHRyYW5zZmVyRGF0YSkgewotCQlpZiAoIShkYXRhIGluc3RhbmNlb2YgT2JqZWN0W10pKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJT2JqZWN0W10gb2JqZWN0cyA9IChPYmplY3RbXSkgZGF0YTsKLQkJaW50IGNvdW50ID0gb2JqZWN0cy5sZW5ndGg7Ci0JCQotCQl0cnkgewotCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJCU9iamVjdE91dHB1dFN0cmVhbSBvYmplY3RPdXQgPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKG91dCk7Ci0KLQkJCS8vd3JpdGUgdGhlIG51bWJlciBvZiByZXNvdXJjZXMKLQkJCW9iamVjdE91dC53cml0ZUludChjb3VudCk7Ci0KLQkJCS8vd3JpdGUgZWFjaCBvYmplY3QKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb2JqZWN0cy5sZW5ndGg7IGkrKykgewotCQkJCW9iamVjdE91dC53cml0ZU9iamVjdChvYmplY3RzW2ldKTsKLQkJCX0KLQotCQkJLy9jbGVhbnVwCi0JCQlvYmplY3RPdXQuY2xvc2UoKTsKLQkJCW91dC5jbG9zZSgpOwotCQkJYnl0ZVtdIGJ5dGVzID0gb3V0LnRvQnl0ZUFycmF5KCk7Ci0JCQlzdXBlci5qYXZhVG9OYXRpdmUoYnl0ZXMsIHRyYW5zZmVyRGF0YSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vaXQncyBiZXN0IHRvIHNlbmQgbm90aGluZyBpZiB0aGVyZSB3ZXJlIHByb2JsZW1zCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oZSk7Ci0JCX0KLQkJCQotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogTWV0aG9kIGRlY2xhcmVkIG9uIFRyYW5zZmVyLgotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgbmF0aXZlVG9KYXZhKFRyYW5zZmVyRGF0YSB0cmFuc2ZlckRhdGEpIHsKLQkJYnl0ZVtdIGJ5dGVzID0gKGJ5dGVbXSkgc3VwZXIubmF0aXZlVG9KYXZhKHRyYW5zZmVyRGF0YSk7Ci0JCWlmIChieXRlcyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXRyeSB7Ci0JCQlPYmplY3RJbnB1dFN0cmVhbSBpbiA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpKTsKLQotCQkJaW50IGNvdW50ID0gaW4ucmVhZEludCgpOwotCQkJT2JqZWN0W10gb2JqZWN0cyA9IG5ldyBPYmplY3RbY291bnRdOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJb2JqZWN0c1tpXSA9IGluLnJlYWRPYmplY3QoKTsKLQkJCX0KLQkJCWluLmNsb3NlKCk7Ci0JCQlyZXR1cm4gb2JqZWN0czsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvVXBkYXRlc0RyYWdBZGFwdGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvVXBkYXRlc0RyYWdBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5NjFlMzYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL1VwZGF0ZXNEcmFnQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnZpZXdzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWwuQm9va21hcmtGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsLk5hbWVkTW9kZWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsLlVwZGF0ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5zZWFyY2guU2VhcmNoT2JqZWN0OwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLXB1YmxpYyBjbGFzcyBVcGRhdGVzRHJhZ0FkYXB0ZXIgZXh0ZW5kcyBEcmFnU291cmNlQWRhcHRlciB7Ci0JSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyOwotCU9iamVjdCBkcmFnRGF0YTsKLQotCS8qKgotCSAqIE5hdmlnYXRvckRyYWdBY3Rpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgVXBkYXRlc0RyYWdBZGFwdGVyKElTZWxlY3Rpb25Qcm92aWRlciBwcm92aWRlcikgewotCQlzZWxlY3Rpb25Qcm92aWRlciA9IHByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRhdGEgdG8gYmUgdHJhbnNmZXJyZWQgaW4gYSBkcmFnIGFuZCBkcm9wCi0JICogb3BlcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGRyYWdTZXREYXRhKERyYWdTb3VyY2VFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQuZG9pdCA9PSBmYWxzZSkKLQkJCXJldHVybjsKLQkJaWYgKFVwZGF0ZU1vZGVsRGF0YVRyYW5zZmVyCi0JCQkuZ2V0SW5zdGFuY2UoKQotCQkJLmlzU3VwcG9ydGVkVHlwZShldmVudC5kYXRhVHlwZSkpIHsKLQkJCWV2ZW50LmRhdGEgPSBnZXRTZWxlY3RlZE1vZGVsT2JqZWN0cygpOwotCQkJZHJhZ0RhdGEgPSBldmVudC5kYXRhOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUoZXZlbnQuZGF0YVR5cGUpKSB7Ci0JCQlldmVudC5kYXRhID0gY3JlYXRlVGV4dHVhbFJlcHJlc2VudGF0aW9uKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uUHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCkpOwotCQkJZHJhZ0RhdGEgPSBudWxsOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCQotCXN0YXRpYyBTdHJpbmcgY3JlYXRlVGV4dHVhbFJlcHJlc2VudGF0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCkgewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXI9c2VsLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJU3RyaW5nIG5hbWUgPSBpdGVyLm5leHQoKS50b1N0cmluZygpOwotCQkJYnVmLmFwcGVuZChuYW1lKTsKLQkJCWJ1Zi5hcHBlbmQoIiAiKTsKLQkJfQotCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0JfQotCS8qKgotCSAqIEFsbCBzZWxlY3Rpb24gbXVzdCBiZSBuYW1lZCBtb2RlbCBvYmplY3RzLgotCSAqLwotCXB1YmxpYyB2b2lkIGRyYWdTdGFydChEcmFnU291cmNlRXZlbnQgZXZlbnQpIHsKLQotCQkvLyBXb3JrYXJvdW5kIGZvciAxR0VVUzlWCi0JCURyYWdTb3VyY2UgZHJhZ1NvdXJjZSA9IChEcmFnU291cmNlKSBldmVudC53aWRnZXQ7Ci0JCUNvbnRyb2wgY29udHJvbCA9IGRyYWdTb3VyY2UuZ2V0Q29udHJvbCgpOwotCQlpZiAoY29udHJvbCAhPSBjb250cm9sLmdldERpc3BsYXkoKS5nZXRGb2N1c0NvbnRyb2woKSkgewotCQkJZXZlbnQuZG9pdCA9IGZhbHNlOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJZXZlbnQuZG9pdCA9IGNhbkRyYWcoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkcmFnRmluaXNoZWQoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC5kb2l0ID09IGZhbHNlIHx8IGRyYWdEYXRhID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChldmVudC5kZXRhaWwgPT0gRE5ELkRST1BfTU9WRSkgewotCQkJTmFtZWRNb2RlbE9iamVjdFtdIG9iamVjdHMgPSAoTmFtZWRNb2RlbE9iamVjdFtdKSBkcmFnRGF0YTsKLQkJCVVwZGF0ZU1vZGVsIG1vZGVsID0gVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldFVwZGF0ZU1vZGVsKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG9iamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCQlOYW1lZE1vZGVsT2JqZWN0IG9iaiA9IG9iamVjdHNbaV07Ci0JCQkJT2JqZWN0IHBhcmVudCA9IG9iai5nZXRQYXJlbnQob2JqKTsKLQkJCQlpZiAocGFyZW50IGluc3RhbmNlb2YgRGlzY292ZXJ5Rm9sZGVyKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAocGFyZW50ID09IG51bGwpIHsKLQkJCQkJbW9kZWwucmVtb3ZlQm9va21hcmsob2JqKTsKLQkJCQl9IGVsc2UgewotCQkJCQkoKEJvb2ttYXJrRm9sZGVyKSBwYXJlbnQpLnJlbW92ZUNoaWxkcmVuKAotCQkJCQkJbmV3IE5hbWVkTW9kZWxPYmplY3RbXSB7IG9iaiB9KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZHJhZ0RhdGEgPSBudWxsOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gY2FuRHJhZygpIHsKLQkJcmV0dXJuIGNhbkNvcHkoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigpKTsKLQl9Ci0JCi0Jc3RhdGljIGJvb2xlYW4gY2FuQ29weShJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKCEob2JqIGluc3RhbmNlb2YgTmFtZWRNb2RlbE9iamVjdCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFNlYXJjaE9iamVjdCkgewotCQkJCVNlYXJjaE9iamVjdCBzb2JqID0gKFNlYXJjaE9iamVjdCkgb2JqOwotCQkJCWlmIChzb2JqLmlzQ2F0ZWdvcnlGaXhlZCgpCi0JCQkJCXx8IHNvYmouaXNQZXJzaXN0ZW50KCkgPT0gZmFsc2UpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBEaXNjb3ZlcnlGb2xkZXIpIHJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHJpdmF0ZSBOYW1lZE1vZGVsT2JqZWN0W10gZ2V0U2VsZWN0ZWRNb2RlbE9iamVjdHMoKSB7Ci0JCXJldHVybiBjcmVhdGVPYmplY3RSZXByZXNlbnRhdGlvbigoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uUHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCkpOwotCX0KLQotCXN0YXRpYyBOYW1lZE1vZGVsT2JqZWN0W10gY3JlYXRlT2JqZWN0UmVwcmVzZW50YXRpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCUFycmF5TGlzdCBvYmplY3RzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTmFtZWRNb2RlbE9iamVjdCkKLQkJCQlvYmplY3RzLmFkZChvYmopOwotCQkJZWxzZQotCQkJCXJldHVybiBuZXcgTmFtZWRNb2RlbE9iamVjdFswXTsKLQkJfQotCQlyZXR1cm4gKE5hbWVkTW9kZWxPYmplY3RbXSkgb2JqZWN0cy50b0FycmF5KAotCQkJbmV3IE5hbWVkTW9kZWxPYmplY3Rbb2JqZWN0cy5zaXplKCldKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL1VwZGF0ZXNEcm9wQWRhcHRlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL1VwZGF0ZXNEcm9wQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTJhMTYzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9VcGRhdGVzRHJvcEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS52aWV3czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnNlYXJjaC5TZWFyY2hPYmplY3Q7Ci0KLS8qKgotICogQGF1dGhvciBkZWphbgotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGVkaXQgdGhlIHRlbXBsYXRlIHZhcmlhYmxlICJ0eXBlY29tbWVudCI6Ci0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5UZW1wbGF0ZXMuCi0gKiBUbyBlbmFibGUgYW5kIGRpc2FibGUgdGhlIGNyZWF0aW9uIG9mIHR5cGUgY29tbWVudHMgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFVwZGF0ZXNEcm9wQWRhcHRlciBleHRlbmRzIFZpZXdlckRyb3BBZGFwdGVyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPTkZMSUNUID0KLQkJIlVwZGF0ZXNEcm9wQWRhcHRlci5uYW1lQ29uZmxpY3QiOwotCXByaXZhdGUgVHJhbnNmZXJEYXRhIGN1cnJlbnRUcmFuc2ZlcjsKLQotCXB1YmxpYyBVcGRhdGVzRHJvcEFkYXB0ZXIoVmlld2VyIHZpZXdlcikgewotCQlzdXBlcih2aWV3ZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJEcm9wQWRhcHRlciNwZXJmb3JtRHJvcChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1Ecm9wKE9iamVjdCBkYXRhKSB7Ci0JCWlmIChkYXRhIGluc3RhbmNlb2YgT2JqZWN0W10pIHsKLQkJCU9iamVjdFtdIG9iamVjdHMgPSAoT2JqZWN0W10pIGRhdGE7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG9iamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCQlPYmplY3Qgb2JqID0gb2JqZWN0c1tpXTsKLQkJCQlpZiAoIWRyb3BPYmplY3Qob2JqKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJc2F2ZU1vZGVsKCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGRyb3BPYmplY3QoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgTmFtZWRNb2RlbE9iamVjdCkKLQkJCXJldHVybiBkcm9wTmFtZWRNb2RlbE9iamVjdCgoTmFtZWRNb2RlbE9iamVjdCkgb2JqZWN0KTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBkcm9wTmFtZWRNb2RlbE9iamVjdChOYW1lZE1vZGVsT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gYWRkVG9Nb2RlbChvYmplY3QpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzYXZlTW9kZWwoKSB7Ci0JCVVwZGF0ZU1vZGVsIG1vZGVsID0gVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldFVwZGF0ZU1vZGVsKCk7Ci0JCW1vZGVsLnNhdmVCb29rbWFya3MoKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gYWRkVG9Nb2RlbChOYW1lZE1vZGVsT2JqZWN0IG9iamVjdCkgewotCQlCb29rbWFya0ZvbGRlciBwYXJlbnRGb2xkZXIgPQotCQkJKEJvb2ttYXJrRm9sZGVyKSBnZXRSZWFsVGFyZ2V0KGdldEN1cnJlbnRUYXJnZXQoKSk7Ci0JCXJldHVybiBhZGRUb01vZGVsKAotCQkJZ2V0Vmlld2VyKCkuZ2V0Q29udHJvbCgpLmdldFNoZWxsKCksCi0JCQlwYXJlbnRGb2xkZXIsCi0JCQlvYmplY3QpOwotCX0KLQotCXN0YXRpYyBib29sZWFuIGFkZFRvTW9kZWwoCi0JCVNoZWxsIHNoZWxsLAotCQlCb29rbWFya0ZvbGRlciBwYXJlbnRGb2xkZXIsCi0JCU5hbWVkTW9kZWxPYmplY3Qgb2JqZWN0KSB7Ci0JCVVwZGF0ZU1vZGVsIG1vZGVsID0gVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldFVwZGF0ZU1vZGVsKCk7Ci0KLQkJT2JqZWN0W10gc2libGluZ3MgPQotCQkJcGFyZW50Rm9sZGVyICE9IG51bGwKLQkJCQk/IHBhcmVudEZvbGRlci5nZXRDaGlsZHJlbihwYXJlbnRGb2xkZXIpCi0JCQkJOiBtb2RlbC5nZXRCb29rbWFya3MoKTsKLQotCQlib29sZWFuIG11c3RSZW5hbWUgPSBmYWxzZTsKLQkJCi0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBTZWFyY2hPYmplY3QpIHsKLQkJCSgoU2VhcmNoT2JqZWN0KW9iamVjdCkucmVjb25uZWN0KCk7Ci0JCX0KLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpYmxpbmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQlOYW1lZE1vZGVsT2JqZWN0IHNpYmxpbmcgPSAoTmFtZWRNb2RlbE9iamVjdCkgc2libGluZ3NbaV07Ci0JCQlpZiAoc2libGluZy5nZXROYW1lKCkuZXF1YWxzKG9iamVjdC5nZXROYW1lKCkpKSB7Ci0JCQkJbXVzdFJlbmFtZSA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKG11c3RSZW5hbWUpIHsKLQkJCVJlbmFtZURpYWxvZyBkaWFsb2cgPSBuZXcgUmVuYW1lRGlhbG9nKHNoZWxsLCBvYmplY3QsIHNpYmxpbmdzKTsKLQkJCWRpYWxvZy5jcmVhdGUoKTsKLQkJCWRpYWxvZy5nZXRTaGVsbCgpLnNldFNpemUoNDAwLCAxNTApOwotCQkJZGlhbG9nLmdldFNoZWxsKCkuc2V0VGV4dCgKLQkJCQlVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX0NPTkZMSUNUKSk7Ci0JCQlpZiAoZGlhbG9nLm9wZW4oKSAhPSBSZW5hbWVEaWFsb2cuT0spCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChwYXJlbnRGb2xkZXIgIT0gbnVsbCkKLQkJCXBhcmVudEZvbGRlci5hZGRDaGlsZChvYmplY3QpOwotCQllbHNlIHsKLQkJCW1vZGVsLmFkZEJvb2ttYXJrKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0Jc3RhdGljIE9iamVjdCBnZXRSZWFsVGFyZ2V0KE9iamVjdCB0YXJnZXQpIHsKLQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIE5hbWVkTW9kZWxPYmplY3QKLQkJCSYmICEodGFyZ2V0IGluc3RhbmNlb2YgQm9va21hcmtGb2xkZXIpKSB7Ci0JCQlOYW1lZE1vZGVsT2JqZWN0IHNpYmxpbmcgPSAoTmFtZWRNb2RlbE9iamVjdCkgdGFyZ2V0OwotCQkJcmV0dXJuIHNpYmxpbmcuZ2V0UGFyZW50KHNpYmxpbmcpOwotCQl9Ci0JCXJldHVybiB0YXJnZXQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckRyb3BBZGFwdGVyI3ZhbGlkYXRlRHJvcChqYXZhLmxhbmcuT2JqZWN0LCBpbnQsIG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXJEYXRhKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRHJvcCgKLQkJT2JqZWN0IHRhcmdldCwKLQkJaW50IG9wZXJhdGlvbiwKLQkJVHJhbnNmZXJEYXRhIHRyYW5zZmVyVHlwZSkgewotCQljdXJyZW50VHJhbnNmZXIgPSB0cmFuc2ZlclR5cGU7Ci0JCWlmIChjdXJyZW50VHJhbnNmZXIgIT0gbnVsbAotCQkJJiYgVXBkYXRlTW9kZWxEYXRhVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUoCi0JCQkJY3VycmVudFRyYW5zZmVyKSkgewotCQkJcmV0dXJuIHZhbGlkYXRlVGFyZ2V0KCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZVRhcmdldCgpIHsKLQkJT2JqZWN0IHRhcmdldCA9IGdldEN1cnJlbnRUYXJnZXQoKTsKLQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIERpc2NvdmVyeUZvbGRlcikgcmV0dXJuIGZhbHNlOwotCQlpZiAodGFyZ2V0ID09IG51bGwgfHwgdGFyZ2V0IGluc3RhbmNlb2YgTmFtZWRNb2RlbE9iamVjdCkKLQkJCXJldHVybiB0cnVlOwotCQllbHNlCi0JCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvVXBkYXRlc1ZpZXcuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9VcGRhdGVzVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzg0MzRiLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9VcGRhdGVzVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS52aWV3czsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dURXJyb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByb3BlcnR5RGlhbG9nQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuV29ya2JlbmNoSGVscDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklVcGRhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLlVwZGF0ZU1hbmFnZXJVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkucGFydHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuc2VhcmNoLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnNlY3VyaXR5LlVwZGF0ZU1hbmFnZXJBdXRoZW50aWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzLio7Ci0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIEBzZWUgVmlld1BhcnQKLSAqLwotcHVibGljIGNsYXNzIFVwZGF0ZXNWaWV3Ci0JZXh0ZW5kcyBCYXNlVHJlZVZpZXcKLQlpbXBsZW1lbnRzIElVcGRhdGVNb2RlbENoYW5nZWRMaXN0ZW5lciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ORVcgPSAiVXBkYXRlc1ZpZXcuUG9wdXAubmV3IjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX05FV19TSVRFID0gIlVwZGF0ZXNWaWV3LlBvcHVwLm5ld1NpdGUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTkVXX0ZPTERFUiA9ICJVcGRhdGVzVmlldy5Qb3B1cC5uZXdGb2xkZXIiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTkVXX1NFQVJDSCA9ICJVcGRhdGVzVmlldy5Qb3B1cC5uZXdTZWFyY2giOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTkVXX0xPQ0FMX1NJVEUgPQotCQkiVXBkYXRlc1ZpZXcuUG9wdXAubmV3TG9jYWxTaXRlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NIT1dfU0VBUkNIX1JFU1VMVCA9Ci0JCSJVcGRhdGVzVmlldy5Qb3B1cC5zaG93U2VhcmNoUmVzdWx0IjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RFTEVURSA9ICJVcGRhdGVzVmlldy5Qb3B1cC5kZWxldGUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfT1BFTl9XRUIgPSAiVXBkYXRlc1ZpZXcuUG9wdXAub3BlbldlYiI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DVVQgPSAiVXBkYXRlc1ZpZXcuUG9wdXAuY3V0IjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPUFkgPSAiVXBkYXRlc1ZpZXcuUG9wdXAuY29weSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9QQVNURSA9ICJVcGRhdGVzVmlldy5Qb3B1cC5wYXN0ZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9SRUZSRVNIID0gIlVwZGF0ZXNWaWV3LlBvcHVwLnJlZnJlc2giOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUkVGUkVTSF9UT09MVElQID0KLQkJIlVwZGF0ZXNWaWV3LlBvcHVwLnJlZnJlc2gudG9vbHRpcCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9MSU5LX0VYVEVOU0lPTiA9Ci0JCSJVcGRhdGVzVmlldy5Qb3B1cC5saW5rRXh0ZW5zaW9uIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0ZJTFRFUl9GSUxFUyA9ICJVcGRhdGVzVmlldy5tZW51LnNob3dGaWxlcyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9GSUxURVJfRU5WSVJPTk1FTlQgPQotCQkiVXBkYXRlc1ZpZXcubWVudS5maWx0ZXJFbnZpcm9ubWVudCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9TSE9XX0NBVEVHT1JJRVMgPQotCQkiVXBkYXRlc1ZpZXcubWVudS5zaG93Q2F0ZWdvcmllcyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ORVdfU0VBUkNIX1RJVExFID0KLQkJIlVwZGF0ZXNWaWV3Lm5ld1NlYXJjaC50aXRsZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ORVdfQk9PS01BUktfVElUTEUgPQotCQkiVXBkYXRlc1ZpZXcubmV3Qm9va21hcmsudGl0bGUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTkVXX0ZPTERFUl9USVRMRSA9Ci0JCSJVcGRhdGVzVmlldy5uZXdGb2xkZXIudGl0bGUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUkVTVEFSVF9USVRMRSA9ICJVcGRhdGVzVmlldy5yZXN0YXJ0LnRpdGxlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1JFU1RBUlRfTUVTU0FHRSA9Ci0JCSJVcGRhdGVzVmlldy5yZXN0YXJ0Lm1lc3NhZ2UiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQX0ZJTFRFUiA9ICJVcGRhdGVzVmlldy5tYXRjaGluZ0ZpbHRlciI7Ci0KLQlwcml2YXRlIEFjdGlvbiBwcm9wZXJ0aWVzQWN0aW9uOwotCXByaXZhdGUgQWN0aW9uIG5ld0FjdGlvbjsKLQlwcml2YXRlIEFjdGlvbiBuZXdGb2xkZXJBY3Rpb247Ci0JcHJpdmF0ZSBBY3Rpb24gbmV3U2VhcmNoQWN0aW9uOwotCXByaXZhdGUgQWN0aW9uIG5ld0xvY2FsQWN0aW9uOwotCXByaXZhdGUgQWN0aW9uIG9wZW5XZWJBY3Rpb247Ci0JcHJpdmF0ZSBBY3Rpb24gY3V0QWN0aW9uOwotCXByaXZhdGUgQWN0aW9uIGNvcHlBY3Rpb247Ci0JcHJpdmF0ZSBBY3Rpb24gcGFzdGVBY3Rpb247Ci0JcHJpdmF0ZSBEZWxldGVBY3Rpb24gZGVsZXRlQWN0aW9uOwotCXByaXZhdGUgQWN0aW9uIGZpbGVGaWx0ZXJBY3Rpb247Ci0JcHJpdmF0ZSBBY3Rpb24gZmlsdGVyRW52aXJvbm1lbnRBY3Rpb247Ci0JcHJpdmF0ZSBBY3Rpb24gc2hvd0NhdGVnb3JpZXNBY3Rpb247Ci0JcHJpdmF0ZSBBY3Rpb24gbGlua0V4dGVuc2lvbkFjdGlvbjsKLQlwcml2YXRlIFZvbHVtZUxhYmVsUHJvdmlkZXIgdm9sdW1lTGFiZWxQcm92aWRlcjsKLQlwcml2YXRlIEFjdGlvbiByZWZyZXNoQWN0aW9uOwotCXByaXZhdGUgQWN0aW9uIHNob3dTZWFyY2hSZXN1bHRBY3Rpb247Ci0JcHJpdmF0ZSBTZWFyY2hPYmplY3QgdXBkYXRlU2VhcmNoT2JqZWN0OwotCXByaXZhdGUgU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHNlbGVjdGlvbkxpc3RlbmVyOwotCXByaXZhdGUgSGFzaHRhYmxlIGZpbGVJbWFnZXMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JcHJpdmF0ZSBGaWxlRmlsdGVyIGZpbGVGaWx0ZXIgPSBuZXcgRmlsZUZpbHRlcigpOwotCXByaXZhdGUgRW52aXJvbm1lbnRGaWx0ZXIgZW52aXJvbm1lbnRGaWx0ZXIgPSBuZXcgRW52aXJvbm1lbnRGaWx0ZXIoKTsKLQlwcml2YXRlIEN1cnNvciBoYW5kQ3Vyc29yOwotCXByaXZhdGUgQ2xpcGJvYXJkIGNsaXBib2FyZDsKLQlwcml2YXRlIFNlYXJjaE1vbml0b3JNYW5hZ2VyIHNlYXJjaE1vbml0b3JNYW5hZ2VyOwotCi0JY2xhc3MgRGVsZXRlQWN0aW9uIGV4dGVuZHMgQWN0aW9uIGltcGxlbWVudHMgSVVwZGF0ZSB7Ci0JCXB1YmxpYyBEZWxldGVBY3Rpb24oKSB7Ci0JCQlzdXBlcigiZGVsZXRlIik7Ci0JCX0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJcGVyZm9ybURlbGV0ZSgpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJCWJvb2xlYW4gZW5hYmxlZCA9IHRydWU7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPQotCQkJCShJU3RydWN0dXJlZFNlbGVjdGlvbikgVXBkYXRlc1ZpZXcKLQkJCQkJLnRoaXMKLQkJCQkJLmdldFZpZXdlcigpCi0JCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE5hbWVkTW9kZWxPYmplY3QpIHsKLQkJCQkJaWYgKCEob2JqIGluc3RhbmNlb2YgRGlzY292ZXJ5Rm9sZGVyKSkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQllbmFibGVkID0gZmFsc2U7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlzZXRFbmFibGVkKGVuYWJsZWQpOwotCQl9Ci0JfQotCi0JY2xhc3MgRmlsZUZpbHRlciBleHRlbmRzIFZpZXdlckZpbHRlciB7Ci0JCXB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50LCBPYmplY3QgY2hpbGQpIHsKLQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIE15Q29tcHV0ZXJGaWxlKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0KLQljbGFzcyBFbnZpcm9ubWVudEZpbHRlciBleHRlbmRzIFZpZXdlckZpbHRlciB7Ci0JCXB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50LCBPYmplY3QgY2hpbGQpIHsKLQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIElGZWF0dXJlQWRhcHRlcikgewotCQkJCWNoaWxkID0gZ2V0RmVhdHVyZSgoSUZlYXR1cmVBZGFwdGVyKSBjaGlsZCk7Ci0JCQl9Ci0JCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBJUGxhdGZvcm1FbnZpcm9ubWVudCkgewotCQkJCXJldHVybiBVcGRhdGVNYW5hZ2VyVXRpbHMuaXNWYWxpZEVudmlyb25tZW50KAotCQkJCQkoSVBsYXRmb3JtRW52aXJvbm1lbnQpIGNoaWxkKTsKLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JfQotCi0JY2xhc3MgU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQl1cGRhdGVGb3JTZWxlY3Rpb24oKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKSk7Ci0JCX0KLQl9Ci0KLQljbGFzcyBVcGRhdGVzVmlld1NvcnRlciBleHRlbmRzIEZlYXR1cmVTb3J0ZXIgewotCQlwdWJsaWMgaW50IGNhdGVnb3J5KE9iamVjdCBvYmopIHsKLQkJCS8vIExldmVsIDAKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBEaXNjb3ZlcnlGb2xkZXIpCi0JCQkJcmV0dXJuIDE7Ci0JCQlpZiAob2JqLmVxdWFscyh1cGRhdGVTZWFyY2hPYmplY3QpKQotCQkJCXJldHVybiAyOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE15Q29tcHV0ZXIpCi0JCQkJcmV0dXJuIDM7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgU2l0ZUJvb2ttYXJrCi0JCQkJfHwgb2JqIGluc3RhbmNlb2YgQm9va21hcmtGb2xkZXIKLQkJCQl8fCBvYmogaW5zdGFuY2VvZiBTZWFyY2hPYmplY3QpCi0JCQkJcmV0dXJuIDQ7Ci0JCQlyZXR1cm4gc3VwZXIuY2F0ZWdvcnkob2JqKTsKLQkJfQotCX0KLQotCWNsYXNzIFNpdGVQcm92aWRlcgotCQlleHRlbmRzIERlZmF1bHRDb250ZW50UHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJVHJlZUNvbnRlbnRQcm92aWRlciB7Ci0JCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZCgKLQkJCVZpZXdlciB2aWV3ZXIsCi0JCQlPYmplY3Qgb2xkSW5wdXQsCi0JCQlPYmplY3QgbmV3SW5wdXQpIHsKLQkJCWlmIChuZXdJbnB1dCA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCXVwZGF0ZVRpdGxlKG5ld0lucHV0KTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50KSB7Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgVXBkYXRlTW9kZWwpIHsKLQkJCQlyZXR1cm4gZ2V0Um9vdEVsZW1lbnRzKChVcGRhdGVNb2RlbCkgcGFyZW50KTsKLQkJCX0KLQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBCb29rbWFya0ZvbGRlcikgewotCQkJCXJldHVybiAoKEJvb2ttYXJrRm9sZGVyKSBwYXJlbnQpLmdldENoaWxkcmVuKHBhcmVudCk7Ci0JCQl9Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgU2l0ZUJvb2ttYXJrKSB7Ci0JCQkJcmV0dXJuIGdldFNpdGVDYXRhbG9nKChTaXRlQm9va21hcmspIHBhcmVudCk7Ci0JCQl9Ci0JCQkvKgotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIFNlYXJjaE9iamVjdCkgewotCQkJCXJldHVybiAoKFNlYXJjaE9iamVjdCkgcGFyZW50KS5nZXRDaGlsZHJlbihudWxsKTsKLQkJCX0KLQkJCSovCi0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgU2VhcmNoUmVzdWx0U2l0ZSkgewotCQkJCXJldHVybiAoKFNlYXJjaFJlc3VsdFNpdGUpIHBhcmVudCkuZ2V0Q2hpbGRyZW4obnVsbCk7Ci0JCQl9Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgTXlDb21wdXRlcikgewotCQkJCXJldHVybiAoKE15Q29tcHV0ZXIpIHBhcmVudCkuZ2V0Q2hpbGRyZW4ocGFyZW50KTsKLQkJCX0KLQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBNeUNvbXB1dGVyRGlyZWN0b3J5KSB7Ci0JCQkJcmV0dXJuICgoTXlDb21wdXRlckRpcmVjdG9yeSkgcGFyZW50KS5nZXRDaGlsZHJlbihwYXJlbnQpOwotCQkJfQotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIFNpdGVDYXRlZ29yeSkgewotCQkJCWZpbmFsIFNpdGVDYXRlZ29yeSBjYXRlZ29yeSA9IChTaXRlQ2F0ZWdvcnkpIHBhcmVudDsKLQkJCQljYXRlZ29yeS50b3VjaEZlYXR1cmVzKGdldFZpZXdTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkpOwotCQkJCXJldHVybiBjYXRlZ29yeS5nZXRDaGlsZHJlbigpOwotCQkJfQotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIElGZWF0dXJlQWRhcHRlcikgewotCQkJCXJldHVybiBnZXRJbmNsdWRlZEZlYXR1cmVzKChJRmVhdHVyZUFkYXB0ZXIpIHBhcmVudCk7Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBjaGlsZCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgcGFyZW50KSB7Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgU2l0ZUJvb2ttYXJrKSB7Ci0JCQkJU2l0ZUJvb2ttYXJrIGJvb2ttYXJrID0gKFNpdGVCb29rbWFyaykgcGFyZW50OwotCQkJCXJldHVybiBib29rbWFyay5pc1dlYkJvb2ttYXJrKCkgPT0gZmFsc2U7Ci0JCQl9Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgTXlDb21wdXRlcikgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIERpc2NvdmVyeUZvbGRlcikgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEJvb2ttYXJrRm9sZGVyKSB7Ci0JCQkJcmV0dXJuICgoQm9va21hcmtGb2xkZXIpIHBhcmVudCkuaGFzQ2hpbGRyZW4oKTsKLQkJCX0KLQkJCS8qCi0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgU2VhcmNoT2JqZWN0KSB7Ci0JCQkJcmV0dXJuICgoU2VhcmNoT2JqZWN0KSBwYXJlbnQpLmhhc0NoaWxkcmVuKCk7Ci0JCQl9Ci0JCQkqLwotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIE15Q29tcHV0ZXJEaXJlY3RvcnkpIHsKLQkJCQlyZXR1cm4gKChNeUNvbXB1dGVyRGlyZWN0b3J5KSBwYXJlbnQpLmhhc0NoaWxkcmVuKHBhcmVudCk7Ci0JCQl9Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgU2l0ZUNhdGVnb3J5KSB7Ci0JCQkJcmV0dXJuICgoU2l0ZUNhdGVnb3J5KSBwYXJlbnQpLmdldENoaWxkQ291bnQoKSA+IDA7Ci0JCQl9Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgU2VhcmNoUmVzdWx0U2l0ZSkgewotCQkJCXJldHVybiAoKFNlYXJjaFJlc3VsdFNpdGUpIHBhcmVudCkuZ2V0Q2hpbGRDb3VudCgpID4gMDsKLQkJCX0KLQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBJRmVhdHVyZUFkYXB0ZXIpIHsKLQkJCQlyZXR1cm4gKChJRmVhdHVyZUFkYXB0ZXIpIHBhcmVudCkuaGFzSW5jbHVkZWRGZWF0dXJlcyhudWxsKTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqKSB7Ci0JCQlyZXR1cm4gZ2V0Q2hpbGRyZW4ob2JqKTsKLQkJfQotCX0KLQotCWNsYXNzIFNpdGVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciB7Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqKSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgSUZlYXR1cmUpIHsKLQkJCQlJRmVhdHVyZSBmZWF0dXJlID0gKElGZWF0dXJlKSBvYmo7Ci0JCQkJcmV0dXJuIGZlYXR1cmUuZ2V0TGFiZWwoKTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBGZWF0dXJlUmVmZXJlbmNlQWRhcHRlcikgewotCQkJCUlGZWF0dXJlUmVmZXJlbmNlIGZlYXR1cmUgPQotCQkJCQkoKEZlYXR1cmVSZWZlcmVuY2VBZGFwdGVyKSBvYmopLmdldEZlYXR1cmVSZWZlcmVuY2UoKTsKLQkJCQlWZXJzaW9uZWRJZGVudGlmaWVyIHZlcnNpb25lZElkZW50aWZpZXIgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCXZlcnNpb25lZElkZW50aWZpZXIgPQotCQkJCQkJKGZlYXR1cmUgIT0gbnVsbCkKLQkJCQkJCQk/IGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpCi0JCQkJCQkJOiBudWxsOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCQlTdHJpbmcgdmVyc2lvbiA9ICIiOwotCQkJCWlmICh2ZXJzaW9uZWRJZGVudGlmaWVyICE9IG51bGwpCi0JCQkJCXZlcnNpb24gPSB2ZXJzaW9uZWRJZGVudGlmaWVyLmdldFZlcnNpb24oKS50b1N0cmluZygpOwotCQkJCVN0cmluZyBsYWJlbCA9IChmZWF0dXJlICE9IG51bGwpID8gZmVhdHVyZS5nZXROYW1lKCkgOiAiIjsKLQkJCQlyZXR1cm4gbGFiZWwgKyAiICIgKyB2ZXJzaW9uOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElGZWF0dXJlQWRhcHRlcikgewotCQkJCUlGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlKChJRmVhdHVyZUFkYXB0ZXIpIG9iaik7Ci0JCQkJVmVyc2lvbmVkSWRlbnRpZmllciB2ZXJzaW9uZWRJZGVudGlmaWVyID0gbnVsbDsKLQkJCQl2ZXJzaW9uZWRJZGVudGlmaWVyID0KLQkJCQkJKGZlYXR1cmUgIT0gbnVsbCkgPyBmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSA6IG51bGw7Ci0JCQkJU3RyaW5nIHZlcnNpb24gPSAiIjsKLQkJCQlpZiAodmVyc2lvbmVkSWRlbnRpZmllciAhPSBudWxsKQotCQkJCQl2ZXJzaW9uID0gdmVyc2lvbmVkSWRlbnRpZmllci5nZXRWZXJzaW9uKCkudG9TdHJpbmcoKTsKLQkJCQlTdHJpbmcgbGFiZWwgPSAoZmVhdHVyZSAhPSBudWxsKSA/IGZlYXR1cmUuZ2V0TGFiZWwoKSA6ICIiOwotCQkJCXJldHVybiBsYWJlbCArICIgIiArIHZlcnNpb247Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTXlDb21wdXRlckRpcmVjdG9yeSkgewotCQkJCU15Q29tcHV0ZXJEaXJlY3RvcnkgZGlyID0gKE15Q29tcHV0ZXJEaXJlY3RvcnkpIG9iajsKLQkJCQlJVm9sdW1lIHZvbHVtZSA9IGRpci5nZXRWb2x1bWUoKTsKLQkJCQlpZiAodm9sdW1lICE9IG51bGwpCi0JCQkJCXJldHVybiB2b2x1bWVMYWJlbFByb3ZpZGVyLmdldFRleHQodm9sdW1lKTsKLQkJCQllbHNlCi0JCQkJCXJldHVybiBkaXIuZ2V0TGFiZWwoZGlyKTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBTZWFyY2hPYmplY3QpIHsKLQkJCQlyZXR1cm4gc2VhcmNoTW9uaXRvck1hbmFnZXIuZ2V0TGFiZWwoKFNlYXJjaE9iamVjdCkgb2JqKTsKLQkJCX0KLQkJCXJldHVybiBzdXBlci5nZXRUZXh0KG9iaik7Ci0JCX0KLQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBvYmopIHsKLQkJCVVwZGF0ZUxhYmVsUHJvdmlkZXIgcHJvdmlkZXIgPQotCQkJCVVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRMYWJlbFByb3ZpZGVyKCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgU2l0ZUJvb2ttYXJrKSB7Ci0JCQkJU2l0ZUJvb2ttYXJrIGJvb2ttYXJrID0gKFNpdGVCb29rbWFyaykgb2JqOwotCQkJCXJldHVybiBwcm92aWRlci5nZXQoCi0JCQkJCWJvb2ttYXJrLmlzV2ViQm9va21hcmsoKQotCQkJCQkJPyBVcGRhdGVVSUltYWdlcy5ERVNDX1dFQl9TSVRFX09CSgotCQkJCQkJOiBVcGRhdGVVSUltYWdlcy5ERVNDX1NJVEVfT0JKKTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNeUNvbXB1dGVyKSB7Ci0JCQkJcmV0dXJuIHByb3ZpZGVyLmdldChVcGRhdGVVSUltYWdlcy5ERVNDX0NPTVBVVEVSX09CSik7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgRGlzY292ZXJ5Rm9sZGVyKSB7Ci0JCQkJcmV0dXJuIHByb3ZpZGVyLmdldChVcGRhdGVVSUltYWdlcy5ERVNDX1BMQUNFU19PQkopOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE15Q29tcHV0ZXJEaXJlY3RvcnkpIHsKLQkJCQlJVm9sdW1lIHZvbHVtZSA9ICgoTXlDb21wdXRlckRpcmVjdG9yeSkgb2JqKS5nZXRWb2x1bWUoKTsKLQkJCQlpZiAodm9sdW1lICE9IG51bGwpIHsKLQkJCQkJSW1hZ2UgaW1hZ2UgPSB2b2x1bWVMYWJlbFByb3ZpZGVyLmdldEltYWdlKHZvbHVtZSk7Ci0JCQkJCWlmIChpbWFnZSAhPSBudWxsKQotCQkJCQkJcmV0dXJuIGltYWdlOwotCQkJCX0KLQkJCQlyZXR1cm4gKChNeUNvbXB1dGVyRGlyZWN0b3J5KSBvYmopLmdldEltYWdlKG9iaik7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgRXh0ZW5zaW9uUm9vdCkgewotCQkJCXJldHVybiBwcm92aWRlci5nZXQoVXBkYXRlVUlJbWFnZXMuREVTQ19FU0lURV9PQkopOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE15Q29tcHV0ZXJGaWxlKSB7Ci0JCQkJSW1hZ2VEZXNjcmlwdG9yIGRlc2MgPQotCQkJCQkoKE15Q29tcHV0ZXJGaWxlKSBvYmopLmdldEltYWdlRGVzY3JpcHRvcihvYmopOwotCQkJCXJldHVybiBwcm92aWRlci5nZXQoZGVzYyk7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgU2l0ZUNhdGVnb3J5KSB7Ci0JCQkJcmV0dXJuIHByb3ZpZGVyLmdldChVcGRhdGVVSUltYWdlcy5ERVNDX0NBVEVHT1JZX09CSik7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQm9va21hcmtGb2xkZXIpIHsKLQkJCQlyZXR1cm4gcHJvdmlkZXIuZ2V0KFVwZGF0ZVVJSW1hZ2VzLkRFU0NfQkZPTERFUl9PQkopOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFNlYXJjaE9iamVjdCkgewotCQkJCXJldHVybiBnZXRTZWFyY2hPYmplY3RJbWFnZSgoU2VhcmNoT2JqZWN0KSBvYmopOwotCQkJfQotCi0JCQlpZiAob2JqIGluc3RhbmNlb2YgSUZlYXR1cmVBZGFwdGVyKSB7Ci0JCQkJSUZlYXR1cmVBZGFwdGVyIGFkYXB0ZXIgPSAoSUZlYXR1cmVBZGFwdGVyKSBvYmo7Ci0JCQkJb2JqID0gZ2V0RmVhdHVyZShhZGFwdGVyKTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBJRmVhdHVyZSkgewotCQkJCWludCBmbGFncyA9IDA7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1pc3NpbmdGZWF0dXJlKQotCQkJCQlmbGFncyA9IFVwZGF0ZUxhYmVsUHJvdmlkZXIuRl9FUlJPUjsKLQkJCQlib29sZWFuIGVmaXggPSBmYWxzZTsKLQkJCQlpZiAoZmxhZ3MgPT0gMCkKLQkJCQkJZWZpeCA9ICgoSUZlYXR1cmUpIG9iaikuaXNQYXRjaCgpOwotCQkJCXJldHVybiBwcm92aWRlci5nZXQoCi0JCQkJCWVmaXgKLQkJCQkJCT8gVXBkYXRlVUlJbWFnZXMuREVTQ19FRklYX09CSgotCQkJCQkJOiBVcGRhdGVVSUltYWdlcy5ERVNDX0ZFQVRVUkVfT0JKLAotCQkJCQlmbGFncyk7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0SW1hZ2Uob2JqKTsKLQkJfQotCQlwcml2YXRlIEltYWdlIGdldFNlYXJjaE9iamVjdEltYWdlKFNlYXJjaE9iamVjdCBvYmopIHsKLQkJCVN0cmluZyBjYXRlZ29yeUlkID0gb2JqLmdldENhdGVnb3J5SWQoKTsKLQkJCVNlYXJjaENhdGVnb3J5RGVzY3JpcHRvciBkZXNjID0KLQkJCQlTZWFyY2hDYXRlZ29yeVJlZ2lzdHJ5UmVhZGVyLmdldERlZmF1bHQoKS5nZXREZXNjcmlwdG9yKAotCQkJCQljYXRlZ29yeUlkKTsKLQkJCWlmIChkZXNjICE9IG51bGwpIHsKLQkJCQlpbnQgZmxhZ3MgPQotCQkJCQlvYmouaXNTZWFyY2hJblByb2dyZXNzKCkKLQkJCQkJCT8gVXBkYXRlTGFiZWxQcm92aWRlci5GX0NVUlJFTlQKLQkJCQkJCTogMDsKLQkJCQlyZXR1cm4gVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKS5nZXQoCi0JCQkJCWRlc2MuZ2V0SW1hZ2VEZXNjcmlwdG9yKCksCi0JCQkJCWZsYWdzKTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JY2xhc3MgVXBkYXRlVHJlZVZpZXdlciBleHRlbmRzIFRyZWVWaWV3ZXIgewotCQlwcml2YXRlIE9iamVjdCBsYXN0RWxlbWVudDsKLQkJcHVibGljIFVwZGF0ZVRyZWVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlcykgewotCQkJc3VwZXIocGFyZW50LCBzdHlsZXMpOwotCQkJLyoKLQkJCWdldFRyZWUoKS5hZGRNb3VzZU1vdmVMaXN0ZW5lcihuZXcgTW91c2VNb3ZlTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgbW91c2VNb3ZlKE1vdXNlRXZlbnQgZSkgewotCQkJCQlwcm9jZXNzSXRlbShnZXRUcmVlKCkuZ2V0SXRlbShuZXcgUG9pbnQoZS54LCBlLnkpKSk7Ci0JCQkJfQotCQkJfSk7Ci0JCQloYW5kQ3Vyc29yID0gbmV3IEN1cnNvcihnZXRUcmVlKCkuZ2V0RGlzcGxheSgpLCBTV1QuQ1VSU09SX0hBTkQpOwotCQkJKi8KLQkJfQotCQlwcml2YXRlIHZvaWQgcHJvY2Vzc0l0ZW0oSXRlbSBpdGVtKSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZW0gIT0gbnVsbCA/IGl0ZW0uZ2V0RGF0YSgpIDogbnVsbDsKLQkJCWlmIChlbGVtZW50ID09IGxhc3RFbGVtZW50KQotCQkJCXJldHVybjsKLQkJCUN1cnNvciBjdXJzb3IgPSBudWxsOwotCQkJU3RyaW5nIHRvb2x0aXAgPSBudWxsOwotCi0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFNpdGVCb29rbWFyaykgewotCQkJCVNpdGVCb29rbWFyayBib29rbWFyayA9IChTaXRlQm9va21hcmspIGVsZW1lbnQ7Ci0JCQkJaWYgKGJvb2ttYXJrLmlzV2ViQm9va21hcmsoKSkgewotCQkJCQljdXJzb3IgPSBoYW5kQ3Vyc29yOwotCQkJCQl0b29sdGlwID0gYm9va21hcmsuZ2V0VVJMKCkudG9TdHJpbmcoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlsYXN0RWxlbWVudCA9IGVsZW1lbnQ7Ci0JCQlnZXRUcmVlKCkuc2V0Q3Vyc29yKGN1cnNvcik7Ci0JCQlnZXRUcmVlKCkuc2V0VG9vbFRpcFRleHQodG9vbHRpcCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIFVwZGF0ZXNWaWV3KCkgewotCQlVcGRhdGVNb2RlbCBtb2RlbCA9IFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRVcGRhdGVNb2RlbCgpOwotCQltb2RlbC5hZGRVcGRhdGVNb2RlbENoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQkJc2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCk7Ci0JCXVwZGF0ZVNlYXJjaE9iamVjdCA9IG5ldyBEZWZhdWx0VXBkYXRlc1NlYXJjaE9iamVjdCgpOwotCQlVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0TGFiZWxQcm92aWRlcigpLmNvbm5lY3QodGhpcyk7Ci0JCXZvbHVtZUxhYmVsUHJvdmlkZXIgPSBuZXcgVm9sdW1lTGFiZWxQcm92aWRlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCVVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRMYWJlbFByb3ZpZGVyKCkuZGlzY29ubmVjdCh0aGlzKTsKLQkJdm9sdW1lTGFiZWxQcm92aWRlci5kaXNwb3NlKCk7Ci0JCVVwZGF0ZU1vZGVsIG1vZGVsID0gVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldFVwZGF0ZU1vZGVsKCk7Ci0JCW1vZGVsLnJlbW92ZVVwZGF0ZU1vZGVsQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCQlpZiAoaGFuZEN1cnNvciAhPSBudWxsKQotCQkJaGFuZEN1cnNvci5kaXNwb3NlKCk7Ci0JCWlmIChjbGlwYm9hcmQgIT0gbnVsbCkgewotCQkJY2xpcGJvYXJkLmRpc3Bvc2UoKTsKLQkJCWNsaXBib2FyZCA9IG51bGw7Ci0JCX0KLQkJc2VhcmNoTW9uaXRvck1hbmFnZXIuc2h1dGRvd24oKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRQcm92aWRlcnMoKSB7Ci0JCXNlYXJjaE1vbml0b3JNYW5hZ2VyID0gbmV3IFNlYXJjaE1vbml0b3JNYW5hZ2VyKCk7Ci0JCXNlYXJjaE1vbml0b3JNYW5hZ2VyLnJlZ2lzdGVyKHVwZGF0ZVNlYXJjaE9iamVjdCk7Ci0JCWdldFRyZWVWaWV3ZXIoKS5zZXRDb250ZW50UHJvdmlkZXIobmV3IFNpdGVQcm92aWRlcigpKTsKLQkJZ2V0VHJlZVZpZXdlcigpLnNldExhYmVsUHJvdmlkZXIobmV3IFNpdGVMYWJlbFByb3ZpZGVyKCkpOwotCQlnZXRUcmVlVmlld2VyKCkuc2V0SW5wdXQoVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldFVwZGF0ZU1vZGVsKCkpOwotCQlXb3JrYmVuY2hIZWxwLnNldEhlbHAoCi0JCQlnZXRDb250cm9sKCksCi0JCQkib3JnLmVjbGlwc2UudXBkYXRlLnVpLlVwZGF0ZXNWaWV3Iik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdERyYWdBbmREcm9wKCkgewotCQljbGlwYm9hcmQgPSBuZXcgQ2xpcGJvYXJkKGdldENvbnRyb2woKS5nZXREaXNwbGF5KCkpOwotCQlpbnQgb3BzID0gRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX01PVkU7Ci0JCVRyYW5zZmVyW10gdHJhbnNmZXJzID0KLQkJCW5ldyBUcmFuc2ZlcltdIHsKLQkJCQlVcGRhdGVNb2RlbERhdGFUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLAotCQkJCVRleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpfTsKLQkJZ2V0VHJlZVZpZXdlcigpLmFkZERyYWdTdXBwb3J0KAotCQkJb3BzLAotCQkJdHJhbnNmZXJzLAotCQkJbmV3IFVwZGF0ZXNEcmFnQWRhcHRlcigoSVNlbGVjdGlvblByb3ZpZGVyKSBnZXRWaWV3ZXIoKSkpOwotCQlnZXRUcmVlVmlld2VyKCkuYWRkRHJvcFN1cHBvcnQoCi0JCQlvcHMgfCBETkQuRFJPUF9ERUZBVUxULAotCQkJdHJhbnNmZXJzLAotCQkJbmV3IFVwZGF0ZXNEcm9wQWRhcHRlcihnZXRUcmVlVmlld2VyKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtYWtlQWN0aW9ucygpIHsKLQkJc3VwZXIubWFrZUFjdGlvbnMoKTsKLQkJaW5pdERyaWxsRG93bigpOwotCQlwcm9wZXJ0aWVzQWN0aW9uID0KLQkJCW5ldyBQcm9wZXJ0eURpYWxvZ0FjdGlvbigKLQkJCQlVcGRhdGVVSS5nZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpLAotCQkJCWdldFRyZWVWaWV3ZXIoKSk7Ci0JCW5ld0FjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJcGVyZm9ybU5ld0Jvb2ttYXJrKCk7Ci0JCQl9Ci0JCX07Ci0JCVdvcmtiZW5jaEhlbHAuc2V0SGVscCgKLQkJCW5ld0FjdGlvbiwKLQkJCSJvcmcuZWNsaXBzZS51cGRhdGUudWkuVXBkYXRlc1ZpZXdfbmV3QWN0aW9uIik7Ci0JCW5ld0FjdGlvbi5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfTkVXX1NJVEUpKTsKLQotCQluZXdGb2xkZXJBY3Rpb24gPSBuZXcgQWN0aW9uKCJuZXdGb2xkZXIiKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJcGVyZm9ybU5ld0Jvb2ttYXJrRm9sZGVyKCk7Ci0JCQl9Ci0JCX07Ci0JCVdvcmtiZW5jaEhlbHAuc2V0SGVscCgKLQkJCW5ld0ZvbGRlckFjdGlvbiwKLQkJCSJvcmcuZWNsaXBzZS51cGRhdGUudWkuVXBkYXRlc1ZpZXdfbmV3Rm9sZGVyQWN0aW9uIik7Ci0JCW5ld0ZvbGRlckFjdGlvbi5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfTkVXX0ZPTERFUikpOwotCi0JCW5ld1NlYXJjaEFjdGlvbiA9IG5ldyBBY3Rpb24oIm5ld1NlYXJjaCIpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlwZXJmb3JtTmV3U2VhcmNoKCk7Ci0JCQl9Ci0JCX07Ci0JCVdvcmtiZW5jaEhlbHAuc2V0SGVscCgKLQkJCW5ld1NlYXJjaEFjdGlvbiwKLQkJCSJvcmcuZWNsaXBzZS51cGRhdGUudWkuVXBkYXRlc1ZpZXdfbmV3U2VhcmNoQWN0aW9uIik7Ci0JCW5ld1NlYXJjaEFjdGlvbi5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfTkVXX1NFQVJDSCkpOwotCi0JCW5ld0xvY2FsQWN0aW9uID0gbmV3IEFjdGlvbigibmV3TG9jYWwiKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJcGVyZm9ybU5ld0xvY2FsKCk7Ci0JCQl9Ci0JCX07Ci0KLQkJV29ya2JlbmNoSGVscC5zZXRIZWxwKAotCQkJbmV3TG9jYWxBY3Rpb24sCi0JCQkib3JnLmVjbGlwc2UudXBkYXRlLnVpLlVwZGF0ZXNWaWV3X25ld0xvY2FsQWN0aW9uIik7Ci0JCW5ld0xvY2FsQWN0aW9uLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9ORVdfTE9DQUxfU0lURSkpOwotCi0JCXNob3dTZWFyY2hSZXN1bHRBY3Rpb24gPSBuZXcgQWN0aW9uKCJzaG93U2VhcmNoIikgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXBlcmZvcm1TaG93U2VhcmNoUmVzdWx0KCk7Ci0JCQl9Ci0JCX07Ci0JCVdvcmtiZW5jaEhlbHAuc2V0SGVscCgKLQkJCW5ld0xvY2FsQWN0aW9uLAotCQkJIm9yZy5lY2xpcHNlLnVwZGF0ZS51aS5VcGRhdGVzVmlld19zaG93U2VhcmNoUmVzdWx0QWN0aW9uIik7Ci0JCXNob3dTZWFyY2hSZXN1bHRBY3Rpb24uc2V0VGV4dCgKLQkJCVVwZGF0ZVVJLmdldFN0cmluZyhLRVlfU0hPV19TRUFSQ0hfUkVTVUxUKSk7Ci0KLQkJZGVsZXRlQWN0aW9uID0gbmV3IERlbGV0ZUFjdGlvbigpOwotCQlXb3JrYmVuY2hIZWxwLnNldEhlbHAoCi0JCQlkZWxldGVBY3Rpb24sCi0JCQkib3JnLmVjbGlwc2UudXBkYXRlLnVpLlVwZGF0ZXNWaWV3X2RlbGV0ZUFjdGlvbiIpOwotCQlkZWxldGVBY3Rpb24uc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX0RFTEVURSkpOwotCi0JCW9wZW5XZWJBY3Rpb24gPSBuZXcgQWN0aW9uKCJvcGVuV2ViIikgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXBlcmZvcm1PcGVuV2ViKCk7Ci0JCQl9Ci0JCX07Ci0JCW9wZW5XZWJBY3Rpb24uc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX09QRU5fV0VCKSk7Ci0KLQkJY3V0QWN0aW9uID0gbmV3IEFjdGlvbigiY3V0IikgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXBlcmZvcm1DdXQoKTsKLQkJCX0KLQkJfTsKLQkJY3V0QWN0aW9uLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9DVVQpKTsKLQotCQljb3B5QWN0aW9uID0gbmV3IEFjdGlvbigiY29weSIpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlwZXJmb3JtQ29weSgpOwotCQkJfQotCQl9OwotCQljb3B5QWN0aW9uLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9DT1BZKSk7Ci0KLQkJcGFzdGVBY3Rpb24gPSBuZXcgQWN0aW9uKCJwYXN0ZSIpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlwZXJmb3JtUGFzdGUoKTsKLQkJCX0KLQkJfTsKLQkJcGFzdGVBY3Rpb24uc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX1BBU1RFKSk7Ci0KLQkJcmVmcmVzaEFjdGlvbiA9IG5ldyBBY3Rpb24oInJlZnJlc2giKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJcGVyZm9ybVJlZnJlc2goKTsKLQkJCX0KLQkJfTsKLQkJV29ya2JlbmNoSGVscC5zZXRIZWxwKAotCQkJcmVmcmVzaEFjdGlvbiwKLQkJCSJvcmcuZWNsaXBzZS51cGRhdGUudWkuVXBkYXRlc1ZpZXdfcmVmcmVzaEFjdGlvbiIpOwotCQlyZWZyZXNoQWN0aW9uLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9SRUZSRVNIKSk7Ci0JCXJlZnJlc2hBY3Rpb24uc2V0VG9vbFRpcFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9SRUZSRVNIX1RPT0xUSVApKTsKLQkJcmVmcmVzaEFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoVXBkYXRlVUlJbWFnZXMuREVTQ19SRUZSRVNIX05BVik7Ci0JCXJlZnJlc2hBY3Rpb24uc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoCi0JCQlVcGRhdGVVSUltYWdlcy5ERVNDX1JFRlJFU0hfTkFWX0QpOwotCQlyZWZyZXNoQWN0aW9uLnNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKAotCQkJVXBkYXRlVUlJbWFnZXMuREVTQ19SRUZSRVNIX05BVl9IKTsKLQotCQlmaWxlRmlsdGVyQWN0aW9uID0gbmV3IEFjdGlvbigpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlpZiAoZmlsZUZpbHRlckFjdGlvbi5pc0NoZWNrZWQoKSkgewotCQkJCQlnZXRUcmVlVmlld2VyKCkucmVtb3ZlRmlsdGVyKGZpbGVGaWx0ZXIpOwotCQkJCX0gZWxzZQotCQkJCQlnZXRUcmVlVmlld2VyKCkuYWRkRmlsdGVyKGZpbGVGaWx0ZXIpOwotCQkJfQotCQl9OwotCQlXb3JrYmVuY2hIZWxwLnNldEhlbHAoCi0JCQlmaWxlRmlsdGVyQWN0aW9uLAotCQkJIm9yZy5lY2xpcHNlLnVwZGF0ZS51aS5VcGRhdGVzVmlld19maWxlRmlsdGVyQWN0aW9uIik7Ci0JCWZpbGVGaWx0ZXJBY3Rpb24uc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX0ZJTFRFUl9GSUxFUykpOwotCQlmaWxlRmlsdGVyQWN0aW9uLnNldENoZWNrZWQoZmFsc2UpOwotCi0JCWdldFRyZWVWaWV3ZXIoKS5hZGRGaWx0ZXIoZmlsZUZpbHRlcik7Ci0KLQkJZmlsdGVyRW52aXJvbm1lbnRBY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWJvb2xlYW4gY2hlY2tlZCA9IGZpbHRlckVudmlyb25tZW50QWN0aW9uLmlzQ2hlY2tlZCgpOwotCQkJCWlmIChjaGVja2VkKSB7Ci0JCQkJCWdldFRyZWVWaWV3ZXIoKS5hZGRGaWx0ZXIoZW52aXJvbm1lbnRGaWx0ZXIpOwotCQkJCX0gZWxzZQotCQkJCQlnZXRUcmVlVmlld2VyKCkucmVtb3ZlRmlsdGVyKGVudmlyb25tZW50RmlsdGVyKTsKLQkJCQlzZXRTdG9yZWRFbnZpcm9ubWVudFZhbHVlKGNoZWNrZWQpOwotCQkJfQotCQl9OwotCQlXb3JrYmVuY2hIZWxwLnNldEhlbHAoCi0JCQlmaWx0ZXJFbnZpcm9ubWVudEFjdGlvbiwKLQkJCSJvcmcuZWNsaXBzZS51cGRhdGUudWkuVXBkYXRlc1ZpZXdfZmlsdGVyRW52aXJvbm1lbnRBY3Rpb24iKTsKLQkJZmlsdGVyRW52aXJvbm1lbnRBY3Rpb24uc2V0VGV4dCgKLQkJCVVwZGF0ZVVJLmdldFN0cmluZyhLRVlfRklMVEVSX0VOVklST05NRU5UKSk7Ci0JCWJvb2xlYW4gZW52VmFsdWUgPSBnZXRTdG9yZWRFbnZpcm9ubWVudFZhbHVlKCk7Ci0JCWZpbHRlckVudmlyb25tZW50QWN0aW9uLnNldENoZWNrZWQoZW52VmFsdWUpOwotCi0JCWdldFRyZWVWaWV3ZXIoKS5hZGRGaWx0ZXIoZW52aXJvbm1lbnRGaWx0ZXIpOwotCQlnZXRUcmVlVmlld2VyKCkuc2V0U29ydGVyKG5ldyBVcGRhdGVzVmlld1NvcnRlcigpKTsKLQotCQlzaG93Q2F0ZWdvcmllc0FjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJc2hvd0NhdGVnb3JpZXMoIXNob3dDYXRlZ29yaWVzQWN0aW9uLmlzQ2hlY2tlZCgpKTsKLQkJCX0KLQkJfTsKLQkJV29ya2JlbmNoSGVscC5zZXRIZWxwKAotCQkJc2hvd0NhdGVnb3JpZXNBY3Rpb24sCi0JCQkib3JnLmVjbGlwc2UudXBkYXRlLnVpLlVwZGF0ZXNWaWV3X3Nob3dDYXRlZ29yaWVzQWN0aW9uIik7Ci0JCXNob3dDYXRlZ29yaWVzQWN0aW9uLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9TSE9XX0NBVEVHT1JJRVMpKTsKLQkJc2hvd0NhdGVnb3JpZXNBY3Rpb24uc2V0Q2hlY2tlZCh0cnVlKTsKLQotCQlsaW5rRXh0ZW5zaW9uQWN0aW9uID0gbmV3IEFjdGlvbigibGluayIpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlsaW5rUHJvZHVjdEV4dGVuc2lvbigpOwotCQkJfQotCQl9OwotCQlXb3JrYmVuY2hIZWxwLnNldEhlbHAoCi0JCQlsaW5rRXh0ZW5zaW9uQWN0aW9uLAotCQkJIm9yZy5lY2xpcHNlLnVwZGF0ZS51aS5VcGRhdGVzVmlld19saW5rRXh0ZW5zaW9uQWN0aW9uIik7Ci0JCWxpbmtFeHRlbnNpb25BY3Rpb24uc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX0xJTktfRVhURU5TSU9OKSk7Ci0KLQkJZ2V0VHJlZVZpZXdlcigpLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCWhvb2tHbG9iYWxBY3Rpb25zKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhvb2tHbG9iYWxBY3Rpb25zKCkgewotCQlJVmlld1NpdGUgc2l0ZSA9IGdldFZpZXdTaXRlKCk7Ci0JCUlBY3Rpb25CYXJzIGJhcnMgPSBzaXRlLmdldEFjdGlvbkJhcnMoKTsKLQkJYmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuQ1VULCBjdXRBY3Rpb24pOwotCQliYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5DT1BZLCBjb3B5QWN0aW9uKTsKLQkJYmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKAotCQkJSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5QQVNURSwKLQkJCXBhc3RlQWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZ2V0U3RvcmVkRW52aXJvbm1lbnRWYWx1ZSgpIHsKLQkJSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzID0gVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0JCXJldHVybiAhc2V0dGluZ3MuZ2V0Qm9vbGVhbihQX0ZJTFRFUik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFN0b3JlZEVudmlyb25tZW50VmFsdWUoYm9vbGVhbiB2YWx1ZSkgewotCQlJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MgPSBVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQkJc2V0dGluZ3MucHV0KFBfRklMVEVSLCAhdmFsdWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVGb3JTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXJlZnJlc2hBY3Rpb24uc2V0RW5hYmxlZChzZWxlY3Rpb24uc2l6ZSgpID09IDEpOwotCX0KLQotCXB1YmxpYyB2b2lkIGZpbGxBY3Rpb25CYXJzKElBY3Rpb25CYXJzIGJhcnMpIHsKLQkJSVRvb2xCYXJNYW5hZ2VyIHRvb2xCYXJNYW5hZ2VyID0gYmFycy5nZXRUb29sQmFyTWFuYWdlcigpOwotCQl0b29sQmFyTWFuYWdlci5hZGQocmVmcmVzaEFjdGlvbik7Ci0JCXRvb2xCYXJNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQlhZGREcmlsbERvd25BZGFwdGVyKGJhcnMpOwotCQl0b29sQmFyTWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJdG9vbEJhck1hbmFnZXIuYWRkKGNvbGxhcHNlQWxsQWN0aW9uKTsKLQkJSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyID0gYmFycy5nZXRNZW51TWFuYWdlcigpOwotCQltZW51TWFuYWdlci5hZGQoZmlsZUZpbHRlckFjdGlvbik7Ci0JCW1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQltZW51TWFuYWdlci5hZGQoc2hvd0NhdGVnb3JpZXNBY3Rpb24pOwotCQltZW51TWFuYWdlci5hZGQoZmlsdGVyRW52aXJvbm1lbnRBY3Rpb24pOwotCQliYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoCi0JCQlJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLkRFTEVURSwKLQkJCWRlbGV0ZUFjdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgZmlsbENvbnRleHRNZW51KElNZW51TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCU9iamVjdCBvYmogPSBnZXRTZWxlY3RlZE9iamVjdCgpOwotCQlpZiAob2JqIGluc3RhbmNlb2YgU2l0ZUJvb2ttYXJrKSB7Ci0JCQlTaXRlQm9va21hcmsgc2l0ZSA9IChTaXRlQm9va21hcmspIG9iajsKLQkJCWlmIChzaXRlLmlzV2ViQm9va21hcmsoKSkKLQkJCQltYW5hZ2VyLmFkZChvcGVuV2ViQWN0aW9uKTsKLQkJfQotCQltYW5hZ2VyLmFkZChyZWZyZXNoQWN0aW9uKTsKLQkJbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJTWVudU1hbmFnZXIgbmV3TWVudSA9IG5ldyBNZW51TWFuYWdlcihVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX05FVykpOwotCQluZXdNZW51LmFkZChuZXdBY3Rpb24pOwotCQluZXdNZW51LmFkZChuZXdGb2xkZXJBY3Rpb24pOwotCQluZXdNZW51LmFkZChuZXdTZWFyY2hBY3Rpb24pOwotCQltYW5hZ2VyLmFkZChuZXdNZW51KTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFNpdGVCb29rbWFyaykgewotCQkJU2l0ZUJvb2ttYXJrIHNpdGUgPSAoU2l0ZUJvb2ttYXJrKSBvYmo7Ci0JCQlpZiAoc2l0ZS5nZXRUeXBlKCkgPT0gU2l0ZUJvb2ttYXJrLkxPQ0FMKQotCQkJCW1hbmFnZXIuYWRkKG5ld0xvY2FsQWN0aW9uKTsKLQkJfQotCQlpZiAob2JqIGluc3RhbmNlb2YgRXh0ZW5zaW9uUm9vdCkgewotCQkJbWFuYWdlci5hZGQobGlua0V4dGVuc2lvbkFjdGlvbik7Ci0JCX0KLQkJbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJY3V0QWN0aW9uLnNldEVuYWJsZWQoY2FuQ29weSgpKTsKLQkJY29weUFjdGlvbi5zZXRFbmFibGVkKGN1dEFjdGlvbi5pc0VuYWJsZWQoKSk7Ci0JCXBhc3RlQWN0aW9uLnNldEVuYWJsZWQoY2FuUGFzdGUoKSk7Ci0JCWRlbGV0ZUFjdGlvbi5zZXRFbmFibGVkKGNhbkRlbGV0ZSgpKTsKLQkJbWFuYWdlci5hZGQoY3V0QWN0aW9uKTsKLQkJbWFuYWdlci5hZGQoY29weUFjdGlvbik7Ci0JCW1hbmFnZXIuYWRkKHBhc3RlQWN0aW9uKTsKLQkJbWFuYWdlci5hZGQoZGVsZXRlQWN0aW9uKTsKLQkJbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFNlYXJjaE9iamVjdCkgewotCQkJbWFuYWdlci5hZGQoc2hvd1NlYXJjaFJlc3VsdEFjdGlvbik7Ci0JCQltYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQl9Ci0JCWFkZERyaWxsRG93bkFkYXB0ZXIobWFuYWdlcik7Ci0JCW1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0KLQkJc3VwZXIuZmlsbENvbnRleHRNZW51KG1hbmFnZXIpOwotCQlpZiAob2JqIGluc3RhbmNlb2YgTmFtZWRNb2RlbE9iamVjdCkKLQkJCW1hbmFnZXIuYWRkKHByb3BlcnRpZXNBY3Rpb24pOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjYW5EZWxldGUoKSB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9Ci0JCQkoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldFRyZWVWaWV3ZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbC5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLQkJCWlmICghY2FuRGVsZXRlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjYW5EZWxldGUoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgU2l0ZUJvb2ttYXJrKSB7Ci0JCQlTaXRlQm9va21hcmsgc2l0ZSA9IChTaXRlQm9va21hcmspIG9iajsKLQkJCXJldHVybiAoc2l0ZS5nZXRUeXBlKCkgIT0gU2l0ZUJvb2ttYXJrLkxPQ0FMKTsKLQkJfQotCQlpZiAob2JqIGluc3RhbmNlb2YgQm9va21hcmtGb2xkZXIKLQkJCSYmICEob2JqIGluc3RhbmNlb2YgRGlzY292ZXJ5Rm9sZGVyKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFNlYXJjaE9iamVjdAotCQkJJiYgIShvYmogaW5zdGFuY2VvZiBEZWZhdWx0VXBkYXRlc1NlYXJjaE9iamVjdCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIE9iamVjdCBnZXRTZWxlY3RlZE9iamVjdCgpIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0KLQkJCShJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0Vmlld2VyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWwuaXNFbXB0eSgpIHx8IHNlbC5zaXplKCkgPiAxKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBlcmZvcm1OZXdCb29rbWFyaygpIHsKLQkJLy9VcGRhdGVNb2RlbCBtb2RlbCA9IFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRVcGRhdGVNb2RlbCgpOwotCQlTaGVsbCBzaGVsbCA9IFVwZGF0ZVVJLmdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCk7Ci0JCU5ld1NpdGVCb29rbWFya1dpemFyZFBhZ2UgcGFnZSA9Ci0JCQluZXcgTmV3U2l0ZUJvb2ttYXJrV2l6YXJkUGFnZShnZXRTZWxlY3RlZEZvbGRlcigpKTsKLQkJTmV3V2l6YXJkIHdpemFyZCA9Ci0JCQluZXcgTmV3V2l6YXJkKHBhZ2UsIFVwZGF0ZVVJSW1hZ2VzLkRFU0NfTkVXX0JPT0tNQVJLKTsKLQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coc2hlbGwsIHdpemFyZCk7Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJZGlhbG9nLmdldFNoZWxsKCkuc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX05FV19CT09LTUFSS19USVRMRSkpOwotCQkvL2RpYWxvZy5nZXRTaGVsbCgpLnNldFNpemUoNDAwLCA0MDApOwotCQlkaWFsb2cub3BlbigpOwotCX0KLQotCXByaXZhdGUgQm9va21hcmtGb2xkZXIgZ2V0U2VsZWN0ZWRGb2xkZXIoKSB7Ci0JCU9iamVjdCBzZWwgPSBnZXRTZWxlY3RlZE9iamVjdCgpOwotCQlpZiAoc2VsIGluc3RhbmNlb2YgQm9va21hcmtGb2xkZXIKLQkJCSYmICEoc2VsIGluc3RhbmNlb2YgRGlzY292ZXJ5Rm9sZGVyKSkgewotCQkJQm9va21hcmtGb2xkZXIgZm9sZGVyID0gKEJvb2ttYXJrRm9sZGVyKSBzZWw7Ci0JCQlyZXR1cm4gZm9sZGVyOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCBwZXJmb3JtTmV3Qm9va21hcmtGb2xkZXIoKSB7Ci0JCS8vVXBkYXRlTW9kZWwgbW9kZWwgPSBVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0VXBkYXRlTW9kZWwoKTsKLQkJU2hlbGwgc2hlbGwgPSBVcGRhdGVVSS5nZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpOwotCQlOZXdGb2xkZXJXaXphcmRQYWdlIHBhZ2UgPSBuZXcgTmV3Rm9sZGVyV2l6YXJkUGFnZShnZXRTZWxlY3RlZEZvbGRlcigpKTsKLQkJTmV3V2l6YXJkIHdpemFyZCA9IG5ldyBOZXdXaXphcmQocGFnZSwgVXBkYXRlVUlJbWFnZXMuREVTQ19ORVdfRk9MREVSKTsKLQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coc2hlbGwsIHdpemFyZCk7Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJZGlhbG9nLmdldFNoZWxsKCkuc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX05FV19GT0xERVJfVElUTEUpKTsKLQkJLy9kaWFsb2cuZ2V0U2hlbGwoKS5zZXRTaXplKDQwMCwgMzUwKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcGVyZm9ybU5ld1NlYXJjaCgpIHsKLQkJLy9VcGRhdGVNb2RlbCBtb2RlbCA9IFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRVcGRhdGVNb2RlbCgpOwotCQlTaGVsbCBzaGVsbCA9IFVwZGF0ZVVJLmdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCk7Ci0JCU5ld1NlYXJjaFdpemFyZFBhZ2UgcGFnZSA9IG5ldyBOZXdTZWFyY2hXaXphcmRQYWdlKGdldFNlbGVjdGVkRm9sZGVyKCkpOwotCQlOZXdXaXphcmQgd2l6YXJkID0gbmV3IE5ld1dpemFyZChwYWdlLCBVcGRhdGVVSUltYWdlcy5ERVNDX05FV19TRUFSQ0gpOwotCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhzaGVsbCwgd2l6YXJkKTsKLQkJZGlhbG9nLmNyZWF0ZSgpOwotCQlkaWFsb2cuZ2V0U2hlbGwoKS5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfTkVXX1NFQVJDSF9USVRMRSkpOwotCQkvL2RpYWxvZy5nZXRTaGVsbCgpLnNldFNpemUoNDAwLCAzNTApOwotCQlkaWFsb2cub3BlbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwZXJmb3JtTmV3TG9jYWwoKSB7Ci0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZ2V0Vmlld2VyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3NlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkJT2JqZWN0IG9iaiA9IHNzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgU2l0ZUJvb2ttYXJrKSB7Ci0JCQkJU2l0ZUJvb2ttYXJrIGJvb2ttYXJrID0gKFNpdGVCb29rbWFyaykgb2JqOwotCQkJCWlmIChib29rbWFyay5nZXRUeXBlKCkgPT0gU2l0ZUJvb2ttYXJrLkxPQ0FMKSB7Ci0JCQkJCS8vVXBkYXRlTW9kZWwgbW9kZWwgPQotCQkJCQkvLwlVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0VXBkYXRlTW9kZWwoKTsKLQkJCQkJU2hlbGwgc2hlbGwgPSBVcGRhdGVVSS5nZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpOwotCQkJCQlOZXdTaXRlQm9va21hcmtXaXphcmRQYWdlIHBhZ2UgPQotCQkJCQkJbmV3IE5ld1NpdGVCb29rbWFya1dpemFyZFBhZ2UoCi0JCQkJCQkJZ2V0U2VsZWN0ZWRGb2xkZXIoKSwKLQkJCQkJCQlib29rbWFyayk7Ci0JCQkJCU5ld1dpemFyZCB3aXphcmQgPQotCQkJCQkJbmV3IE5ld1dpemFyZChwYWdlLCBVcGRhdGVVSUltYWdlcy5ERVNDX05FV19CT09LTUFSSyk7Ci0JCQkJCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHNoZWxsLCB3aXphcmQpOwotCQkJCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCQkJCWRpYWxvZy5nZXRTaGVsbCgpLnNldFRleHQoCi0JCQkJCQlVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX05FV19CT09LTUFSS19USVRMRSkpOwotCQkJCQlkaWFsb2cub3BlbigpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwZXJmb3JtRGVsZXRlKCkgewotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGdldFZpZXdlcigpLmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCWlmICghY29uZmlybURlbGV0aW9uKCkpCi0JCQkJcmV0dXJuOwotCQkJZG9EZWxldGUoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRvRGVsZXRlKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlVcGRhdGVNb2RlbCBtb2RlbCA9IFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRVcGRhdGVNb2RlbCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTmFtZWRNb2RlbE9iamVjdCkgewotCQkJCU5hbWVkTW9kZWxPYmplY3QgY2hpbGQgPSAoTmFtZWRNb2RlbE9iamVjdCkgb2JqOwotCQkJCUJvb2ttYXJrRm9sZGVyIGZvbGRlciA9IChCb29rbWFya0ZvbGRlcikgY2hpbGQuZ2V0UGFyZW50KGNoaWxkKTsKLQkJCQlpZiAoZm9sZGVyICE9IG51bGwpCi0JCQkJCWZvbGRlci5yZW1vdmVDaGlsZHJlbihuZXcgTmFtZWRNb2RlbE9iamVjdFtdIHsgY2hpbGQgfSk7Ci0JCQkJZWxzZQotCQkJCQltb2RlbC5yZW1vdmVCb29rbWFyayhjaGlsZCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcGVyZm9ybU9wZW5XZWIoKSB7Ci0JCVNpdGVCb29rbWFyayBib29rbWFyayA9IChTaXRlQm9va21hcmspIGdldFNlbGVjdGVkT2JqZWN0KCk7Ci0JCVVSTCB1cmwgPSBib29rbWFyay5nZXRVUkwoKTsKLQkJaWYgKHVybCAhPSBudWxsKSB7Ci0JCQlEZXRhaWxzVmlldy5zaG93VVJMKHVybC50b1N0cmluZygpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZURvdWJsZUNsaWNrKERvdWJsZUNsaWNrRXZlbnQgZSkgewotCQlPYmplY3Qgb2JqID0gZ2V0U2VsZWN0ZWRPYmplY3QoKTsKLQkJaWYgKG9iaiAhPSBudWxsICYmIG9iaiBpbnN0YW5jZW9mIFNpdGVCb29rbWFyaykgewotCQkJU2l0ZUJvb2ttYXJrIGJvb2ttYXJrID0gKFNpdGVCb29rbWFyaykgb2JqOwotCQkJaWYgKGJvb2ttYXJrLmlzV2ViQm9va21hcmsoKSkgewotCQkJCXBlcmZvcm1PcGVuV2ViKCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLmhhbmRsZURvdWJsZUNsaWNrKGUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwZXJmb3JtQ3V0KCkgewotCQlpZiAoIWNhbkRlbGV0ZSgpKQotCQkJcmV0dXJuOwotCQlpZiAoIXBlcmZvcm1Db3B5KCkpCi0JCQlyZXR1cm47Ci0JCWRvRGVsZXRlKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0Vmlld2VyKCkuZ2V0U2VsZWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjYW5Db3B5KCkgewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPQotCQkJKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRWaWV3ZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJcmV0dXJuIFVwZGF0ZXNEcmFnQWRhcHRlci5jYW5Db3B5KHNlbGVjdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHBlcmZvcm1Db3B5KCkgewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPQotCQkJKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRWaWV3ZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKCFVcGRhdGVzRHJhZ0FkYXB0ZXIuY2FuQ29weShzZWxlY3Rpb24pKQotCQkJcmV0dXJuIGZhbHNlOwotCQlOYW1lZE1vZGVsT2JqZWN0W10gb2JqZWN0cyA9Ci0JCQlVcGRhdGVzRHJhZ0FkYXB0ZXIuY3JlYXRlT2JqZWN0UmVwcmVzZW50YXRpb24oc2VsZWN0aW9uKTsKLQkJU3RyaW5nIHRleHQgPSBVcGRhdGVzRHJhZ0FkYXB0ZXIuY3JlYXRlVGV4dHVhbFJlcHJlc2VudGF0aW9uKHNlbGVjdGlvbik7Ci0JCXJldHVybiBzZXRDbGlwYm9hcmRDb250ZW50KG9iamVjdHMsIHRleHQpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBzZXRDbGlwYm9hcmRDb250ZW50KAotCQlOYW1lZE1vZGVsT2JqZWN0W10gb2JqZWN0cywKLQkJU3RyaW5nIG5hbWVzKSB7Ci0JCXRyeSB7Ci0JCQkvLyBzZXQgdGhlIGNsaXBib2FyZCBjb250ZW50cwotCQkJY2xpcGJvYXJkLnNldENvbnRlbnRzKAotCQkJCW5ldyBPYmplY3RbXSB7IG9iamVjdHMsIG5hbWVzIH0sCi0JCQkJbmV3IFRyYW5zZmVyW10gewotCQkJCQlVcGRhdGVNb2RlbERhdGFUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLAotCQkJCQlUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKX0pOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0gY2F0Y2ggKFNXVEVycm9yIGUpIHsKLQkJCVVwZGF0ZVVJLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjYW5QYXN0ZSgpIHsKLQkJLy8gdHJ5IGEgZGF0YSB0cmFuc2ZlcgotCQlVcGRhdGVNb2RlbERhdGFUcmFuc2ZlciBkYXRhVHJhbnNmZXIgPQotCQkJVXBkYXRlTW9kZWxEYXRhVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKTsKLQkJcmV0dXJuIGNsaXBib2FyZC5nZXRDb250ZW50cyhkYXRhVHJhbnNmZXIpICE9IG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBlcmZvcm1QYXN0ZSgpIHsKLQkJLy8gdHJ5IGEgZGF0YSB0cmFuc2ZlcgotCQlVcGRhdGVNb2RlbERhdGFUcmFuc2ZlciBkYXRhVHJhbnNmZXIgPQotCQkJVXBkYXRlTW9kZWxEYXRhVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKTsKLQkJT2JqZWN0W10gb2JqZWN0cyA9IChPYmplY3RbXSkgY2xpcGJvYXJkLmdldENvbnRlbnRzKGRhdGFUcmFuc2Zlcik7Ci0KLQkJaWYgKG9iamVjdHMgIT0gbnVsbCkgewotCQkJQm9va21hcmtGb2xkZXIgcGFyZW50Rm9sZGVyID0KLQkJCQkoQm9va21hcmtGb2xkZXIpIFVwZGF0ZXNEcm9wQWRhcHRlci5nZXRSZWFsVGFyZ2V0KAotCQkJCQlnZXRTZWxlY3RlZE9iamVjdCgpKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb2JqZWN0cy5sZW5ndGg7IGkrKykgewotCQkJCU5hbWVkTW9kZWxPYmplY3Qgb2JqZWN0ID0gKE5hbWVkTW9kZWxPYmplY3QpIG9iamVjdHNbaV07Ci0JCQkJaWYgKCFVcGRhdGVzRHJvcEFkYXB0ZXIKLQkJCQkJLmFkZFRvTW9kZWwoZ2V0Q29udHJvbCgpLmdldFNoZWxsKCksIHBhcmVudEZvbGRlciwgb2JqZWN0KSkKLQkJCQkJcmV0dXJuOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JCS8vIHRyeSBhIHRleHQgdHJhbnNmZXIKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcGVyZm9ybVNob3dTZWFyY2hSZXN1bHQoKSB7Ci0JCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBVcGRhdGVVSS5nZXRBY3RpdmVQYWdlKCk7Ci0JCVNlYXJjaFJlc3VsdFZpZXcgdmlldyA9Ci0JCQkoU2VhcmNoUmVzdWx0VmlldykgcGFnZS5maW5kVmlldygKLQkJCQlVcGRhdGVQZXJzcGVjdGl2ZS5JRF9TRUFSQ0hfUkVTVUxUUyk7Ci0JCWlmICh2aWV3ICE9IG51bGwpIHsKLQkJCXBhZ2UuYnJpbmdUb1RvcCh2aWV3KTsKLQkJfSBlbHNlIHsKLQkJCXRyeSB7Ci0JCQkJdmlldyA9Ci0JCQkJCShTZWFyY2hSZXN1bHRWaWV3KSBwYWdlLnNob3dWaWV3KAotCQkJCQkJVXBkYXRlUGVyc3BlY3RpdmUuSURfU0VBUkNIX1JFU1VMVFMpOwotCQkJCXZpZXcuc2V0U2VsZWN0aW9uQWN0aXZlKHRydWUpOwotCQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJCVVwZGF0ZVVJLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCQlpZiAodmlldyAhPSBudWxsKQotCQkJdmlldy5zZXRDdXJyZW50U2VhcmNoKChTZWFyY2hPYmplY3QpIGdldFNlbGVjdGVkT2JqZWN0KCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwZXJmb3JtUmVmcmVzaCgpIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0KLQkJCShJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0Vmlld2VyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWZpbmFsIE9iamVjdCBvYmogPSBzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0KLQkJaWYgKG9iaiAhPSBudWxsKSB7Ci0JCQkvKgotCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCS8vIHJlaW5pdGlhbGl6ZSB0aGUgYXV0aGVudGljYXRvciAgCi0JCQkJCQlVcGRhdGVNYW5hZ2VyQXV0aGVudGljYXRvciBhdXRoID0KLQkJCQkJCQlVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0QXV0aGVudGljYXRvcigpOwotCQkJCQkJaWYgKGF1dGggIT0gbnVsbCkKLQkJCQkJCQlhdXRoLnJlc2V0KCk7Ci0JCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgU2l0ZUJvb2ttYXJrKQotCQkJCQkJCSAoKFNpdGVCb29rbWFyaykgb2JqKS5jb25uZWN0KGZhbHNlLCBudWxsKTsKLQkJCQkJCWdldFZpZXdlcigpLnJlZnJlc2gob2JqKTsKLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlVcGRhdGVVSS5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJCSovCi0JCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3AgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCW1vbml0b3IuYmVnaW5UYXNrKCIiLCAzKTsKLQkJCQkJCS8vIHJlaW5pdGlhbGl6ZSB0aGUgYXV0aGVudGljYXRvciAgCi0JCQkJCQlVcGRhdGVNYW5hZ2VyQXV0aGVudGljYXRvciBhdXRoID0KLQkJCQkJCQlVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0QXV0aGVudGljYXRvcigpOwotCQkJCQkJaWYgKGF1dGggIT0gbnVsbCkKLQkJCQkJCQlhdXRoLnJlc2V0KCk7Ci0JCQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQkJCWlmIChvYmogaW5zdGFuY2VvZiBTaXRlQm9va21hcmspIHsKLQkJCQkJCQlTaXRlQm9va21hcmsgYm9va21hcmsgPSAoU2l0ZUJvb2ttYXJrKSBvYmo7Ci0JCQkJCQkJaWYgKGJvb2ttYXJrLmlzV2ViQm9va21hcmsoKSkKLQkJCQkJCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkJCQkJZWxzZQotCQkJCQkJCQlib29rbWFyay5jb25uZWN0KAotCQkJCQkJCQkJZmFsc2UsCi0JCQkJCQkJCQluZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEpKTsKLQkJCQkJCX0gZWxzZQotCQkJCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCQkJbW9uaXRvci5zZXRUYXNrTmFtZSgKLQkJCQkJCQlVcGRhdGVVSS5nZXRTdHJpbmcoIlVwZGF0ZXNWaWV3LnVwZGF0aW5nIikpOwotCQkJCQkJZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQlnZXRWaWV3ZXIoKS5yZWZyZXNoKG9iaik7Ci0JCQkJCQkJfQotCQkJCQkJfSk7Ci0JCQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQl0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihlKTsKLQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfTsKLQkJCXRyeSB7Ci0JCQkJZ2V0Vmlld1NpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5ydW4odHJ1ZSwgdHJ1ZSwgb3ApOwotCQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQkJVXBkYXRlVUkubG9nRXhjZXB0aW9uKGUpOwotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxpbmtQcm9kdWN0RXh0ZW5zaW9uKCkgewotCQlPYmplY3Qgb2JqID0gZ2V0U2VsZWN0ZWRPYmplY3QoKTsKLQkJRXh0ZW5zaW9uUm9vdCBleHRlbnNpb24gPSAoRXh0ZW5zaW9uUm9vdCkgb2JqOwotCQlGaWxlIGRpciA9IGV4dGVuc2lvbi5nZXRJbnN0YWxsYWJsZURpcmVjdG9yeSgpOwotCQl0cnkgewotCQkJSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZyA9Ci0JCQkJSW5zdGFsbFdpemFyZC5jcmVhdGVJbnN0YWxsQ29uZmlndXJhdGlvbigpOwotCQkJaWYgKFRhcmdldFBhZ2UKLQkJCQkuYWRkQ29uZmlndXJlZFNpdGUoZ2V0Q29udHJvbCgpLmdldFNoZWxsKCksIGNvbmZpZywgZGlyLCB0cnVlKQotCQkJCSE9IG51bGwpIHsKLQkJCQlJbnN0YWxsV2l6YXJkLm1ha2VDb25maWd1cmF0aW9uQ3VycmVudChjb25maWcsIG51bGwpOwotCQkJCUluc3RhbGxXaXphcmQuc2F2ZUxvY2FsU2l0ZSgpOwotCQkJCVVwZGF0ZVVJLmluZm9ybVJlc3RhcnROZWVkZWQoKTsKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlVcGRhdGVVSS5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIE9iamVjdFtdIGdldFJvb3RFbGVtZW50cyhVcGRhdGVNb2RlbCBtb2RlbCkgewotCQlOYW1lZE1vZGVsT2JqZWN0W10gYm9va21hcmtzID0gbW9kZWwuZ2V0Qm9va21hcmtzKCk7Ci0JCU9iamVjdFtdIGFycmF5ID0gbmV3IE9iamVjdFszICsgYm9va21hcmtzLmxlbmd0aF07Ci0KLQkJYXJyYXlbMF0gPSBuZXcgRGlzY292ZXJ5Rm9sZGVyKCk7Ci0JCWFycmF5WzFdID0gdXBkYXRlU2VhcmNoT2JqZWN0OwotCQlhcnJheVsyXSA9IG5ldyBNeUNvbXB1dGVyKCk7Ci0JCWZvciAoaW50IGkgPSAzOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJCWFycmF5W2ldID0gYm9va21hcmtzW2kgLSAzXTsKLQkJfQotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCXB1YmxpYyB2b2lkIHNlbGVjdFVwZGF0ZU9iamVjdCgpIHsKLQkJZ2V0Vmlld2VyKCkuc2V0U2VsZWN0aW9uKAotCQkJbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24odXBkYXRlU2VhcmNoT2JqZWN0KSwKLQkJCXRydWUpOwotCX0KLQotCWNsYXNzIENhdGFsb2dCYWcgewotCQlPYmplY3RbXSBjYXRhbG9nOwotCX0KLQotCXByaXZhdGUgT2JqZWN0W10gZ2V0U2l0ZUNhdGFsb2coZmluYWwgU2l0ZUJvb2ttYXJrIGJvb2ttYXJrKSB7Ci0JCWlmIChib29rbWFyay5pc1dlYkJvb2ttYXJrKCkpCi0JCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQkJT2JqZWN0W10gcmVzdWx0ID0KLQkJCWdldFNpdGVDYXRhbG9nV2l0aEluZGljYXRvcihib29rbWFyaywgIWJvb2ttYXJrLmlzU2l0ZUNvbm5lY3RlZCgpKTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsKQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJZWxzZQotCQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JfQotCi0JcHJpdmF0ZSBPYmplY3RbXSBnZXRTaXRlQ2F0YWxvZ1dpdGhJbmRpY2F0b3IoCi0JCWZpbmFsIFNpdGVCb29rbWFyayBib29rbWFyaywKLQkJZmluYWwgYm9vbGVhbiBjb25uZWN0KSB7Ci0JCWZpbmFsIENhdGFsb2dCYWcgYmFnID0gbmV3IENhdGFsb2dCYWcoKTsKLQotCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3AgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCQkJdHJ5IHsKLQkJCQkJbW9uaXRvci5iZWdpblRhc2soCi0JCQkJCQlVcGRhdGVVSS5nZXRTdHJpbmcoIlVwZGF0ZXNWaWV3LmNvbm5lY3RpbmciKSwKLQkJCQkJCTMpOwotCQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQotCQkJCQlpZiAoY29ubmVjdCkKLQkJCQkJCWJvb2ttYXJrLmNvbm5lY3QobmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxKSk7Ci0JCQkJCWVsc2UKLQkJCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCQliYWcuY2F0YWxvZyA9Ci0JCQkJCQlib29rbWFyay5nZXRDYXRhbG9nKAotCQkJCQkJCXNob3dDYXRlZ29yaWVzQWN0aW9uLmlzQ2hlY2tlZCgpLAotCQkJCQkJCW5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMSkpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQl0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihlKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCXRyeSB7Ci0JCQlnZXRWaWV3U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpLnJ1bih0cnVlLCB0cnVlLCBvcCk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJVXBkYXRlVUkubG9nRXhjZXB0aW9uKGUpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIGJhZy5jYXRhbG9nOwotCX0KLQotCXByaXZhdGUgdm9pZCBzaG93Q2F0ZWdvcmllcyhib29sZWFuIHNob3cpIHsKLQkJT2JqZWN0W10gZXhwYW5kZWQgPSBnZXRUcmVlVmlld2VyKCkuZ2V0RXhwYW5kZWRFbGVtZW50cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4cGFuZGVkLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZXhwYW5kZWRbaV0gaW5zdGFuY2VvZiBTaXRlQm9va21hcmspIHsKLQkJCQlnZXRWaWV3ZXIoKS5yZWZyZXNoKGV4cGFuZGVkW2ldKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGUpIHsKLQkJZGVsZXRlQWN0aW9uLnVwZGF0ZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRlbGV0ZUtleVByZXNzZWQoV2lkZ2V0IHdpZGdldCkgewotCQlpZiAoY2FuRGVsZXRlKCkpCi0JCQlkZWxldGVBY3Rpb24ucnVuKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgb2JqZWN0c0FkZGVkKE9iamVjdCBwYXJlbnQsIE9iamVjdFtdIGNoaWxkcmVuKSB7Ci0JCU9iamVjdCBjaGlsZCA9IGNoaWxkcmVuWzBdOwotCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBQZW5kaW5nQ2hhbmdlKQotCQkJcmV0dXJuOwotCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBOYW1lZE1vZGVsT2JqZWN0KSB7Ci0JCQlVcGRhdGVNb2RlbCBtb2RlbCA9IFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRVcGRhdGVNb2RlbCgpOwotCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgU2VhcmNoT2JqZWN0KSB7Ci0JCQkJc2VhcmNoTW9uaXRvck1hbmFnZXIucmVnaXN0ZXIoKFNlYXJjaE9iamVjdCkgY2hpbGQpOwotCQkJfQotCQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJCXBhcmVudCA9IG1vZGVsOwotCQkJZ2V0VHJlZVZpZXdlcigpLmFkZChwYXJlbnQsIGNoaWxkcmVuKTsKLQkJCWlmIChwYXJlbnQgIT0gbW9kZWwpCi0JCQkJZ2V0VHJlZVZpZXdlcigpLnNldEV4cGFuZGVkU3RhdGUocGFyZW50LCB0cnVlKTsKLQkJCWdldFZpZXdlcigpLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihjaGlsZHJlbiksIHRydWUpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgb2JqZWN0c1JlbW92ZWQoT2JqZWN0IHBhcmVudCwgT2JqZWN0W10gY2hpbGRyZW4pIHsKLQkJaWYgKGNoaWxkcmVuWzBdIGluc3RhbmNlb2YgUGVuZGluZ0NoYW5nZSkKLQkJCXJldHVybjsKLQkJaWYgKGNoaWxkcmVuWzBdIGluc3RhbmNlb2YgTmFtZWRNb2RlbE9iamVjdCkgewotCQkJZ2V0VHJlZVZpZXdlcigpLnJlbW92ZShjaGlsZHJlbik7Ci0JCQlnZXRUcmVlVmlld2VyKCkuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKCkpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCWlmIChjaGlsZHJlbltpXSBpbnN0YW5jZW9mIFNlYXJjaE9iamVjdCkKLQkJCQkJc2VhcmNoTW9uaXRvck1hbmFnZXIudW5yZWdpc3RlcigoU2VhcmNoT2JqZWN0KSBjaGlsZHJlbltpXSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBvYmplY3RDaGFuZ2VkKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgTmFtZWRNb2RlbE9iamVjdCkgewotCQkJaWYgKHByb3BlcnR5LmVxdWFscyhOYW1lZE1vZGVsT2JqZWN0LlBfTkFNRSkpIHsKLQkJCQlnZXRUcmVlVmlld2VyKCkudXBkYXRlKG9iamVjdCwgbnVsbCk7Ci0JCQl9Ci0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgU2l0ZUJvb2ttYXJrKSB7Ci0JCQkJaWYgKHByb3BlcnR5LmVxdWFscyhTaXRlQm9va21hcmsuUF9VUkwpIHx8IHByb3BlcnR5LmVxdWFscyhTaXRlQm9va21hcmsuUF9UWVBFKSkgewotCQkJCQlnZXRUcmVlVmlld2VyKCkucmVmcmVzaChvYmplY3QpOwotCQkJCX0KLQkJCX0KLQkJCS8vdmlld2VyLnNldFNlbGVjdGlvbih2aWV3ZXIuZ2V0U2VsZWN0aW9uKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlnZXRWaWV3ZXIoKS5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uLCB0cnVlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGlzcG9zZUltYWdlcygpIHsKLQkJdm9sdW1lTGFiZWxQcm92aWRlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHJpdmF0ZSBJRmVhdHVyZSBnZXRGZWF0dXJlKGZpbmFsIElGZWF0dXJlQWRhcHRlciBhZGFwdGVyKSB7Ci0JCWZpbmFsIElGZWF0dXJlW10gcmVzdWx0ID0gbmV3IElGZWF0dXJlWzFdOwotCi0JCXRyeSB7Ci0JCQlyZXN1bHRbMF0gPSBhZGFwdGVyLmdldEZlYXR1cmUobnVsbCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJcmVzdWx0WzBdID0gbmV3IE1pc3NpbmdGZWF0dXJlKGFkYXB0ZXIuZ2V0U2l0ZSgpLCBhZGFwdGVyLmdldFVSTCgpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0WzBdOwotCX0KLQotCXByaXZhdGUgT2JqZWN0W10gZ2V0SW5jbHVkZWRGZWF0dXJlcyhJRmVhdHVyZUFkYXB0ZXIgYWRhcHRlcikgewotCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIEZlYXR1cmVSZWZlcmVuY2VBZGFwdGVyKSB7Ci0JCQkoKEZlYXR1cmVSZWZlcmVuY2VBZGFwdGVyKSBhZGFwdGVyKS50b3VjaEluY2x1ZGVkRmVhdHVyZXMoCi0JCQkJZ2V0Vmlld1NpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKSk7Ci0JCX0KLQkJcmV0dXJuIGFkYXB0ZXIuZ2V0SW5jbHVkZWRGZWF0dXJlcyhudWxsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFJvb3RPYmplY3QoKSB7Ci0JCXJldHVybiBVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0VXBkYXRlTW9kZWwoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9CYW5uZXJQYWdlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9CYW5uZXJQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjNTBlNGQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvQmFubmVyUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkud2l6YXJkczsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUlJbWFnZXM7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYW5uZXJQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSB7Ci0JcHJpdmF0ZSBJbWFnZSBiYW5uZXJJbWFnZTsKLQlwcml2YXRlIGJvb2xlYW4gYmFubmVyVmlzaWJsZSA9IHRydWU7Ci0JcHVibGljIEJhbm5lclBhZ2UoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCS8qKgotCSAqIEBzZWUgRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNsaWVudCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAxMDsKLQkJY2xpZW50LnNldExheW91dChsYXlvdXQpOwotCi0JCWlmIChiYW5uZXJWaXNpYmxlKSB7Ci0JCQlDb21wb3NpdGUgYmFubmVyUGFyZW50ID0KLQkJCQluZXcgQ29tcG9zaXRlKGNsaWVudCwgU1dULk5VTEwgLypTV1QuQk9SREVSICovCi0JCQkpOwotCQkJYmFubmVyUGFyZW50LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfVkVSVElDQUwpKTsKLQkJCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCQlsYXlvdXQubWFyZ2luV2lkdGggPSBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJCWJhbm5lclBhcmVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoYmFubmVyUGFyZW50LCBTV1QuTlVMTCk7Ci0JCQlsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJCWxhYmVsLnNldEltYWdlKGdldEJhbm5lckltYWdlKCkpOwotCQl9Ci0KLQkJQ29udHJvbCBjb250ZW50cyA9IGNyZWF0ZUNvbnRlbnRzKGNsaWVudCk7Ci0JCWNvbnRlbnRzLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQlzZXRDb250cm9sKGNsaWVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QmFubmVyVmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLQkJdGhpcy5iYW5uZXJWaXNpYmxlID0gdmlzaWJsZTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gaXNCYW5uZWRWaXNpYmxlKCkgewotCQlyZXR1cm4gYmFubmVyVmlzaWJsZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVVJMIGdldEJhbm5lckltYWdlVVJMKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHJpdmF0ZSBJbWFnZSBnZXRCYW5uZXJJbWFnZSgpIHsKLQkJVVJMIGltYWdlVVJMID0gZ2V0QmFubmVySW1hZ2VVUkwoKTsKLQkJSW1hZ2UgaW1hZ2UgPSBudWxsOwotCQlpZiAoaW1hZ2VVUkwgPT0gbnVsbCkgewotCQkJLy8gdXNlIGRlZmF1bHQKLQkJCWJhbm5lckltYWdlID0KLQkJCQlVcGRhdGVVSUltYWdlcy5ERVNDX0lOU1RBTExfQkFOTkVSLmNyZWF0ZUltYWdlKCk7Ci0JCQlpbWFnZSA9IGJhbm5lckltYWdlOwotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoYmFubmVySW1hZ2UgIT0gbnVsbCkgewotCQkJYmFubmVySW1hZ2UuZGlzcG9zZSgpOwotCQl9Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KTsKLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL0Jhc2VOZXdXaXphcmRQYWdlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9CYXNlTmV3V2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGQzOTExLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL0Jhc2VOZXdXaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnBhcnRzLkRlZmF1bHRDb250ZW50UHJvdmlkZXI7Ci0KLS8qKgotICogQGF1dGhvciBkZWphbgotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGVkaXQgdGhlIHRlbXBsYXRlIHZhcmlhYmxlICJ0eXBlY29tbWVudCI6Ci0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5UZW1wbGF0ZXMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlTmV3V2l6YXJkUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTkFNRSA9ICJCYXNlTmV3V2l6YXJkUGFnZS5uYW1lIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NSRUFURV9JTiA9ICJCYXNlTmV3V2l6YXJkUGFnZS5jcmVhdGVJbiI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9FWElTVElORyA9ICJCYXNlTmV3V2l6YXJkUGFnZS5leGlzdGluZyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9JTlZBTElEID0gIkJhc2VOZXdXaXphcmRQYWdlLmludmFsaWQiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTUlTU0lOR19OQU1FID0gIkJhc2VOZXdXaXphcmRQYWdlLm1pc3NpbmdOYW1lIjsKLQlwcml2YXRlIEJvb2ttYXJrRm9sZGVyIGZvbGRlcjsKLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCXByaXZhdGUgVHJlZVZpZXdlciB0cmVlOwotCXByaXZhdGUgVGV4dCBuYW1lVGV4dDsKLQlwcml2YXRlIFRleHQgY29udGFpbmVyVGV4dDsKLQlwcml2YXRlIGJvb2xlYW4gc2hvd0Vycm9yPWZhbHNlOwotCi0JY2xhc3MgQ29udGFpbmVyQ29udGVudFByb3ZpZGVyCi0JCWV4dGVuZHMgRGVmYXVsdENvbnRlbnRQcm92aWRlcgotCQlpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyIHsKLQotCQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudCkgewotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIFVwZGF0ZU1vZGVsKSB7Ci0JCQkJcmV0dXJuICgoVXBkYXRlTW9kZWwpIHBhcmVudCkuZ2V0Qm9va21hcmtzKCk7Ci0JCQl9Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQm9va21hcmtGb2xkZXIpIHsKLQkJCQlyZXR1cm4gKChCb29rbWFya0ZvbGRlcikgcGFyZW50KS5nZXRDaGlsZHJlbihwYXJlbnQpOwotCQkJfQotCQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgY2hpbGQpIHsKLQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIE5hbWVkTW9kZWxPYmplY3QpCi0JCQkJcmV0dXJuICgoTmFtZWRNb2RlbE9iamVjdCkgY2hpbGQpLmdldFBhcmVudChudWxsKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IHBhcmVudCkgewotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEJvb2ttYXJrRm9sZGVyKSB7Ci0JCQkJcmV0dXJuICgoQm9va21hcmtGb2xkZXIpIHBhcmVudCkuaGFzQ2hpbGRyZW4oKTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqKSB7Ci0JCQlyZXR1cm4gZ2V0Q2hpbGRyZW4ob2JqKTsKLQkJfQotCX0KLQotCWNsYXNzIENvbnRhaW5lckxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIHsKLQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBvYmopIHsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBCb29rbWFya0ZvbGRlcikKLQkJCQlyZXR1cm4gVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKS5nZXQoVXBkYXRlVUlJbWFnZXMuREVTQ19CRk9MREVSX09CSik7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0SW1hZ2Uob2JqKTsKLQkJfQotCX0KLQotCXB1YmxpYyBCYXNlTmV3V2l6YXJkUGFnZShCb29rbWFya0ZvbGRlciBmb2xkZXIpIHsKLQkJc3VwZXIoIiIpOwotCQl0aGlzLmZvbGRlciA9IGZvbGRlcjsKLQkJVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKS5jb25uZWN0KHRoaXMpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0TGFiZWxQcm92aWRlcigpLmRpc2Nvbm5lY3QodGhpcyk7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXQobGF5b3V0KTsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29udGFpbmVyLCBTV1QuTlVMTCk7Ci0JCWxhYmVsLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9OQU1FKSk7Ci0JCW5hbWVUZXh0ID0gbmV3IFRleHQoY29udGFpbmVyLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCW5hbWVUZXh0LnNldExheW91dERhdGEoZ2QpOwotCQluYW1lVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQl2YWxpZGF0ZVBhZ2UoKTsKLQkJCX0KLQkJfSk7Ci0JCWNyZWF0ZUNsaWVudENvbnRyb2woY29udGFpbmVyLCBsYXlvdXQubnVtQ29sdW1ucyk7Ci0JCWxhYmVsID0gbmV3IExhYmVsKGNvbnRhaW5lciwgU1dULk5VTEwpOwotCQlsYWJlbC5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfQ1JFQVRFX0lOKSk7Ci0JCWNvbnRhaW5lclRleHQgPSBuZXcgVGV4dChjb250YWluZXIsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJY29udGFpbmVyVGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJaWYgKGZvbGRlciAhPSBudWxsKQotCQkJY29udGFpbmVyVGV4dC5zZXRUZXh0KGZvbGRlci5nZXRQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCWNvbnRhaW5lclRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJdmFsaWRhdGVQYWdlKCk7Ci0JCQl9Ci0JCX0pOwotCQlsYWJlbCA9IG5ldyBMYWJlbChjb250YWluZXIsIFNXVC5OVUxMKTsKLQkJbGFiZWwuc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX0VYSVNUSU5HKSk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXRyZWUgPSBuZXcgVHJlZVZpZXdlcihjb250YWluZXIpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMIHwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlnZC53aWR0aEhpbnQgPSAyNTA7Ci0JCWdkLmhlaWdodEhpbnQgPSAyMDA7Ci0JCXRyZWUuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZ2QpOwotCQl0cmVlLnNldENvbnRlbnRQcm92aWRlcihuZXcgQ29udGFpbmVyQ29udGVudFByb3ZpZGVyKCkpOwotCQl0cmVlLnNldExhYmVsUHJvdmlkZXIobmV3IENvbnRhaW5lckxhYmVsUHJvdmlkZXIoKSk7Ci0JCXRyZWUuYWRkRmlsdGVyKG5ldyBWaWV3ZXJGaWx0ZXIoKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBzZWxlY3QoVmlld2VyIHYsIE9iamVjdCBwYXJlbnQsIE9iamVjdCBjaGlsZCkgewotCQkJCXJldHVybiAoY2hpbGQgaW5zdGFuY2VvZiBCb29rbWFya0ZvbGRlcik7Ci0JCQl9Ci0JCX0pOwotCQl0cmVlLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGUpIHsKLQkJCQloYW5kbGVTZWxlY3Rpb25DaGFuZ2VkKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCQl9Ci0JCX0pOwotCQl0cmVlLnNldElucHV0KFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRVcGRhdGVNb2RlbCgpKTsKLQkJaWYgKGZvbGRlciAhPSBudWxsKQotCQkJdHJlZS5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZm9sZGVyKSwgdHJ1ZSk7Ci0JCXZhbGlkYXRlUGFnZSgpOwotCQlzZXRDb250cm9sKGNvbnRhaW5lcik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldERlbGF5ZWRFcnJvck1lc3NhZ2UoU3RyaW5nIHRleHQpIHsKLQkJaWYgKHNob3dFcnJvcikKLQkJCXNldEVycm9yTWVzc2FnZSh0ZXh0KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLQkJc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLQkJaWYgKHZpc2libGUpIHsKLQkJCW5hbWVUZXh0LnNldEZvY3VzKCk7Ci0JCQlzaG93RXJyb3I9dHJ1ZTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGNyZWF0ZUNsaWVudENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCwgaW50IHNwYW4pOwotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVQYWdlKCkgewotCQlTdHJpbmcgbWVzc2FnZSA9IG51bGw7Ci0JCWJvb2xlYW4gY29tcGxldGUgPSB0cnVlOwotCQlpZiAoY29udGFpbmVyVGV4dC5nZXRUZXh0KCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQlmb2xkZXIgPSBnZXRGb2xkZXJGcm9tUGF0aChjb250YWluZXJUZXh0LmdldFRleHQoKSk7Ci0JCQlpZiAoZm9sZGVyID09IG51bGwpIHsKLQkJCQltZXNzYWdlID0gVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9JTlZBTElEKTsKLQkJCX0KLQkJfSBlbHNlCi0JCQlmb2xkZXIgPSBudWxsOwotCQlTdHJpbmcgbmFtZSA9IG5hbWVUZXh0LmdldFRleHQoKS50cmltKCk7Ci0JCWlmIChuYW1lLmxlbmd0aCgpID09IDApIHsKLQkJCWNvbXBsZXRlID0gZmFsc2U7Ci0JCQltZXNzYWdlID0gVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9NSVNTSU5HX05BTUUpOwotCQl9Ci0JCXNldERlbGF5ZWRFcnJvck1lc3NhZ2UobWVzc2FnZSk7Ci0JCXNldFBhZ2VDb21wbGV0ZShtZXNzYWdlID09IG51bGwgJiYgY29tcGxldGUpOwotCX0KLQlwcml2YXRlIEJvb2ttYXJrRm9sZGVyIGdldEZvbGRlckZyb21QYXRoKFN0cmluZyBwYXRoKSB7Ci0JCVVwZGF0ZU1vZGVsIG1vZGVsID0gVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldFVwZGF0ZU1vZGVsKCk7Ci0JCXJldHVybiBtb2RlbC5nZXRGb2xkZXIobmV3IFBhdGgocGF0aCkpOwotCX0KLQlwcml2YXRlIHZvaWQgaGFuZGxlU2VsZWN0aW9uQ2hhbmdlZChJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJZm9sZGVyID0gKEJvb2ttYXJrRm9sZGVyKSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCWlmIChmb2xkZXIgIT0gbnVsbCkKLQkJCWNvbnRhaW5lclRleHQuc2V0VGV4dChmb2xkZXIuZ2V0UGF0aCgpLnRvU3RyaW5nKCkpOwotCQllbHNlCi0JCQljb250YWluZXJUZXh0LnNldFRleHQoIiIpOwotCX0KLQlwdWJsaWMgQm9va21hcmtGb2xkZXIgZ2V0Rm9sZGVyKCkgewotCQlyZXR1cm4gZm9sZGVyOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lVGV4dC5nZXRUZXh0KCkudHJpbSgpOwotCX0KLQlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBmaW5pc2goKTsKLQotCXByb3RlY3RlZCB2b2lkIGFkZFRvTW9kZWwoTmFtZWRNb2RlbE9iamVjdCBvYmplY3QpIHsKLQkJVXBkYXRlTW9kZWwgbW9kZWwgPSBVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0VXBkYXRlTW9kZWwoKTsKLQkJQm9va21hcmtGb2xkZXIgcGFyZW50Rm9sZGVyID0gZ2V0Rm9sZGVyKCk7Ci0JCWlmIChwYXJlbnRGb2xkZXIgIT0gbnVsbCkKLQkJCXBhcmVudEZvbGRlci5hZGRDaGlsZChvYmplY3QpOwotCQllbHNlIHsKLQkJCW1vZGVsLmFkZEJvb2ttYXJrKG9iamVjdCk7Ci0JCX0KLQkJbW9kZWwuc2F2ZUJvb2ttYXJrcygpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9EZWx0YUFkYXB0ZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL0RlbHRhQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2E2YjkxLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL0RlbHRhQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uSVNlc3Npb25EZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5mb3Jtcy5BY3Rpdml0eUNvbnN0cmFpbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbC5NaXNzaW5nRmVhdHVyZTsKLQotLyoqCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRGVsdGFBZGFwdGVyIHsKLQlwcml2YXRlIElTZXNzaW9uRGVsdGEgZGVsdGE7Ci0JcHJpdmF0ZSBEZWx0YUZlYXR1cmVBZGFwdGVyW10gZGZlYXR1cmVzOwotCXByaXZhdGUgYm9vbGVhbiByZW1vdmVkOwotCXByaXZhdGUgSVN0YXR1cyBzdGF0dXM7Ci0JcHJpdmF0ZSBib29sZWFuIHN0YXR1c0NvbXB1dGVkOwotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JcHJpdmF0ZSBib29sZWFuIHNlbGVjdGlvbkJsb2NrZWQ7Ci0KLQlwdWJsaWMgRGVsdGFBZGFwdGVyKElTZXNzaW9uRGVsdGEgZGVsdGEpIHsKLQkJdGhpcy5kZWx0YSA9IGRlbHRhOwotCQluYW1lID0gVXRpbGl0aWVzLmZvcm1hdChkZWx0YS5nZXREYXRlKCkpOwotCX0KLQotCXB1YmxpYyBJU2Vzc2lvbkRlbHRhIGdldERlbHRhKCkgewotCQlyZXR1cm4gZGVsdGE7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JcHVibGljIERlbHRhRmVhdHVyZUFkYXB0ZXJbXSBnZXRGZWF0dXJlcygpIHsKLQkJaWYgKGRmZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQlpbml0aWFsaXplRmVhdHVyZXMoKTsKLQkJfQotCQlyZXR1cm4gZGZlYXR1cmVzOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRGZWF0dXJlc1RvKEFycmF5TGlzdCBsaXN0KSB7Ci0JCURlbHRhRmVhdHVyZUFkYXB0ZXIgW10gYXJyYXkgPSBnZXRGZWF0dXJlcygpOwotCQlmb3IgKGludCBpPTA7IGk8YXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJCWxpc3QuYWRkKGFycmF5W2ldKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkKGJvb2xlYW4gdmFsdWUpIHsKLQkJRGVsdGFGZWF0dXJlQWRhcHRlcltdIGFkYXB0ZXJzID0gZ2V0RmVhdHVyZXMoKTsKLQotCQlib29sZWFuIHN0YXRlQ2hhbmdlID0gZmFsc2U7Ci0JCXNlbGVjdGlvbkJsb2NrZWQgPSB0cnVlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFkYXB0ZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlEZWx0YUZlYXR1cmVBZGFwdGVyIGFkYXB0ZXIgPSBhZGFwdGVyc1tpXTsKLQkJCWlmIChhZGFwdGVyLmlzU2VsZWN0ZWQoKSAhPSB2YWx1ZSkgewotCQkJCWFkYXB0ZXIuc2V0U2VsZWN0ZWQodmFsdWUpOwotCQkJCXN0YXRlQ2hhbmdlID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlzZWxlY3Rpb25CbG9ja2VkID0gZmFsc2U7Ci0JCWlmICh2YWx1ZSAmJiBzdGF0ZUNoYW5nZSkgewotCQkJLy8gc2VsZWN0aW5nIHRoZSBkZWx0YSwgd2UgY2F1c2VkIHRoZQotCQkJLy8gbGlzdCBvZiBmZWF0dXJlcyB0byBjaGFuZ2UgYW5kIHRoYXQKLQkJCS8vIG1heSBhZmZlY3QgdGhlIHN0YXR1cy4gUmVzZXQgc3RhdHVzLgotCQkJcmVzZXRTdGF0dXMoKTsKLQkJfQotCX0KLQotCXZvaWQgZmVhdHVyZVNlbGVjdGVkKGJvb2xlYW4gc2VsZWN0ZWQpIHsKLQkJaWYgKHNlbGVjdGlvbkJsb2NrZWQpCi0JCQlyZXR1cm47Ci0JCWludCBjb3VudCA9IGdldFNlbGVjdGlvbkNvdW50KCk7Ci0JCXNlbGVjdGVkID0gKGNvdW50ID4gMCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRTZWxlY3Rpb25Db3VudCgpIHsKLQkJRGVsdGFGZWF0dXJlQWRhcHRlcltdIGFkYXB0ZXJzID0gZ2V0RmVhdHVyZXMoKTsKLQkJaW50IGNvdW50ID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhZGFwdGVycy5sZW5ndGg7IGkrKykgewotCQkJRGVsdGFGZWF0dXJlQWRhcHRlciBhZGFwdGVyID0gYWRhcHRlcnNbaV07Ci0JCQlpZiAoYWRhcHRlci5pc1NlbGVjdGVkKCkpCi0JCQkJY291bnQrKzsKLQkJfQotCQlyZXR1cm4gY291bnQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNNaXhlZFNlbGVjdGlvbigpIHsKLQkJaW50IGNvdW50ID0gZ2V0U2VsZWN0aW9uQ291bnQoKTsKLQkJcmV0dXJuIGNvdW50ID4gMCAmJiBjb3VudCA8IGdldEZlYXR1cmVzKCkubGVuZ3RoOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlbW92ZWQoYm9vbGVhbiByZW1vdmVkKSB7Ci0JCXRoaXMucmVtb3ZlZCA9IHJlbW92ZWQ7Ci0JCXNldFNlbGVjdGVkKGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGVkKCkgewotCQlyZXR1cm4gZ2V0U2VsZWN0aW9uQ291bnQoKT4wOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUmVtb3ZlZCgpIHsKLQkJcmV0dXJuIHJlbW92ZWQ7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgZ2V0U3RhdHVzKCkgewotCQlpZiAoIXN0YXR1c0NvbXB1dGVkKQotCQkJY29tcHV0ZVN0YXR1cygpOwotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCXB1YmxpYyBJRmVhdHVyZVJlZmVyZW5jZVtdIGdldFNlbGVjdGVkUmVmZXJlbmNlcygpIHsKLQkJQXJyYXlMaXN0IHJlZnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCURlbHRhRmVhdHVyZUFkYXB0ZXJbXSBhZGFwdGVycyA9IGdldEZlYXR1cmVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYWRhcHRlcnMubGVuZ3RoOyBpKyspIHsKLQkJCURlbHRhRmVhdHVyZUFkYXB0ZXIgYWRhcHRlciA9IGFkYXB0ZXJzW2ldOwotCQkJaWYgKGFkYXB0ZXIuaXNTZWxlY3RlZCgpKQotCQkJCXJlZnMuYWRkKGFkYXB0ZXIuZ2V0RmVhdHVyZVJlZmVyZW5jZSgpKTsKLQkJfQotCQlyZXR1cm4gKElGZWF0dXJlUmVmZXJlbmNlW10pIHJlZnMudG9BcnJheSgKLQkJCW5ldyBJRmVhdHVyZVJlZmVyZW5jZVtyZWZzLnNpemUoKV0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc2V0U3RhdHVzKCkgewotCQlzdGF0dXNDb21wdXRlZCA9IGZhbHNlOwotCX0KLQotCXByaXZhdGUgdm9pZCBjb21wdXRlU3RhdHVzKCkgewotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIHJlZnMgPSBnZXRTZWxlY3RlZFJlZmVyZW5jZXMoKTsKLQkJc3RhdHVzID0gQWN0aXZpdHlDb25zdHJhaW50cy52YWxpZGF0ZVNlc3Npb25EZWx0YShkZWx0YSwgcmVmcyk7Ci0JCXN0YXR1c0NvbXB1dGVkID0gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgewotCQlyZXR1cm4gZ2V0U3RhdHVzKCkgPT0gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUZlYXR1cmVzKCkgewotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIHJlZmVyZW5jZXMgPSBkZWx0YS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpOwotCQlkZmVhdHVyZXMgPSBuZXcgRGVsdGFGZWF0dXJlQWRhcHRlcltyZWZlcmVuY2VzLmxlbmd0aF07Ci0JCXNlbGVjdGlvbkJsb2NrZWQgPSB0cnVlOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmZXJlbmNlcy5sZW5ndGg7IGkrKykgewotCQkJSUZlYXR1cmVSZWZlcmVuY2UgcmVmZXJlbmNlID0gcmVmZXJlbmNlc1tpXTsKLQkJCURlbHRhRmVhdHVyZUFkYXB0ZXIgZGZlYXR1cmUgPSBudWxsOwotCQkJRGVsdGFGZWF0dXJlQWRhcHRlciBkdXBsaWNhdGUgPSBmaW5kRHVwbGljYXRlKHJlZmVyZW5jZSwgZGZlYXR1cmVzKTsKLQkJCXRyeSB7Ci0JCQkJSUZlYXR1cmUgZmVhdHVyZSA9IHJlZmVyZW5jZS5nZXRGZWF0dXJlKG51bGwpOwotCQkJCWRmZWF0dXJlID0gbmV3IERlbHRhRmVhdHVyZUFkYXB0ZXIodGhpcywgcmVmZXJlbmNlLCBmZWF0dXJlKTsKLQkJCQlkZmVhdHVyZS5zZXRTZWxlY3RlZCh0cnVlKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUlGZWF0dXJlIGZlYXR1cmUgPQotCQkJCQluZXcgTWlzc2luZ0ZlYXR1cmUocmVmZXJlbmNlLmdldFNpdGUoKSwgcmVmZXJlbmNlLmdldFVSTCgpKTsKLQkJCQlkZmVhdHVyZSA9IG5ldyBEZWx0YUZlYXR1cmVBZGFwdGVyKHRoaXMsIHJlZmVyZW5jZSwgZmVhdHVyZSk7Ci0JCQl9Ci0JCQlpZiAoZHVwbGljYXRlICE9IG51bGwpIHsKLQkJCQlkZmVhdHVyZS5zZXREdXBsaWNhdGUodHJ1ZSk7Ci0JCQkJZHVwbGljYXRlLnNldER1cGxpY2F0ZSh0cnVlKTsKLQkJCX0KLQkJCWRmZWF0dXJlc1tpXSA9IGRmZWF0dXJlOwotCQl9Ci0JCXNlbGVjdGlvbkJsb2NrZWQgPSBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIERlbHRhRmVhdHVyZUFkYXB0ZXIgZmluZER1cGxpY2F0ZSgKLQkJSUZlYXR1cmVSZWZlcmVuY2UgcmVmZXJlbmNlLAotCQlEZWx0YUZlYXR1cmVBZGFwdGVyW10gZGZlYXR1cmVzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlEZWx0YUZlYXR1cmVBZGFwdGVyIHByZXYgPSBkZmVhdHVyZXNbaV07Ci0JCQlpZiAocHJldiA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJdHJ5IHsKLQkJCQlpZiAocmVmZXJlbmNlCi0JCQkJCS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkKLQkJCQkJLmVxdWFscygKLQkJCQkJCXByZXYuZ2V0RmVhdHVyZVJlZmVyZW5jZSgpLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSkpIHsKLQkJCQkJcmV0dXJuIHByZXY7Ci0JCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvRGVsdGFGZWF0dXJlQWRhcHRlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvRGVsdGFGZWF0dXJlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTI2MTAwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL0RlbHRhRmVhdHVyZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi5JU2Vzc2lvbkRlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJOwotCi0vKioKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWx0YUZlYXR1cmVBZGFwdGVyIHsKLQlwcml2YXRlIElGZWF0dXJlUmVmZXJlbmNlIHJlZjsKLQlwcml2YXRlIElGZWF0dXJlIGZlYXR1cmU7Ci0JcHJpdmF0ZSBEZWx0YUFkYXB0ZXIgZGVsdGFBZGFwdGVyOwotCXByaXZhdGUgYm9vbGVhbiBzZWxlY3RlZDsKLQlwcml2YXRlIGJvb2xlYW4gZHVwbGljYXRlOwotCQotCXB1YmxpYyBEZWx0YUZlYXR1cmVBZGFwdGVyKERlbHRhQWRhcHRlciBkZWx0YUFkYXB0ZXIsIElGZWF0dXJlUmVmZXJlbmNlIHJlZiwgSUZlYXR1cmUgZmVhdHVyZSkgewotCQl0aGlzLnJlZiA9IHJlZjsKLQkJdGhpcy5mZWF0dXJlID0gZmVhdHVyZTsKLQkJdGhpcy5kZWx0YUFkYXB0ZXIgPSBkZWx0YUFkYXB0ZXI7Ci0JfQotCQotCXB1YmxpYyBEZWx0YUFkYXB0ZXIgZ2V0RGVsdGFBZGFwdGVyKCkgewotCQlyZXR1cm4gZGVsdGFBZGFwdGVyOwotCX0KLQkKLQlwdWJsaWMgSVNlc3Npb25EZWx0YSBnZXREZWx0YSgpIHsKLQkJcmV0dXJuIGRlbHRhQWRhcHRlci5nZXREZWx0YSgpOwotCX0KLQkKLQlwdWJsaWMgSUZlYXR1cmVSZWZlcmVuY2UgZ2V0RmVhdHVyZVJlZmVyZW5jZSgpIHsKLQkJcmV0dXJuIHJlZjsKLQl9Ci0JCi0JcHVibGljIElGZWF0dXJlIGdldEZlYXR1cmUoKSB7Ci0JCXJldHVybiBmZWF0dXJlOwotCX0KLQkJCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0ZWQoYm9vbGVhbiBzZWxlY3RlZCkgewotCQl0aGlzLnNlbGVjdGVkID0gc2VsZWN0ZWQ7Ci0JCWRlbHRhQWRhcHRlci5mZWF0dXJlU2VsZWN0ZWQoc2VsZWN0ZWQpOwotCX0KLQkJCi0JcHVibGljIGJvb2xlYW4gaXNTZWxlY3RlZCgpIHsKLQkJcmV0dXJuIHNlbGVjdGVkOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXREdXBsaWNhdGUoYm9vbGVhbiBkdXBsaWNhdGUpIHsKLQkJdGhpcy5kdXBsaWNhdGUgPSBkdXBsaWNhdGU7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzRHVwbGljYXRlKCkgewotCQlyZXR1cm4gZHVwbGljYXRlOwotCX0KLQkJCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGR1cGxpY2F0ZSkgewotCQkJcmV0dXJuIFVwZGF0ZVVJLmdldEZvcm1hdHRlZE1lc3NhZ2UoIkRlbHRhRmVhdHVyZUFkYXB0ZXIubG9uZ05hbWUiLAotCQkJCW5ldyBTdHJpbmcgW10geyBmZWF0dXJlLmdldExhYmVsKCksIAotCQkJCQkJCQlmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRWZXJzaW9uKCkudG9TdHJpbmcoKSwKLQkJCQkJCQkJZmVhdHVyZS5nZXRTaXRlKCkuZ2V0VVJMKCkudG9TdHJpbmcoKX0pOwotCQl9Ci0JCWVsc2UgewotCQlyZXR1cm4gVXBkYXRlVUkuZ2V0Rm9ybWF0dGVkTWVzc2FnZSgiRGVsdGFGZWF0dXJlQWRhcHRlci5zaG9ydE5hbWUiLAotCQkJbmV3IFN0cmluZyBbXSB7IGZlYXR1cmUuZ2V0TGFiZWwoKSwgCi0JCQkJCQkJZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCkgfSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9EdXBsaWNhdGVDb25mbGljdHNEaWFsb2cuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL0R1cGxpY2F0ZUNvbmZsaWN0c0RpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWNmMWRlLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL0R1cGxpY2F0ZUNvbmZsaWN0c0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbC5QZW5kaW5nQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wYXJ0cy5EZWZhdWx0Q29udGVudFByb3ZpZGVyOwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBEdXBsaWNhdGVDb25mbGljdHNEaWFsb2cgZXh0ZW5kcyBNZXNzYWdlRGlhbG9nIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1RJVExFID0gIkR1cGxpY2F0ZUNvbmZsaWN0c0RpYWxvZy50aXRsZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9NRVNTQUdFID0KLQkJIkR1cGxpY2F0ZUNvbmZsaWN0c0RpYWxvZy5tZXNzYWdlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1RSRUVfTEFCRUwgPQotCQkiRHVwbGljYXRlQ29uZmxpY3RzRGlhbG9nLnRyZWVMYWJlbCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DT05GTElDVCA9Ci0JCSJEdXBsaWNhdGVDb25mbGljdHNEaWFsb2cuY29uZmxpY3QiOwotCi0JcHJpdmF0ZSBUcmVlVmlld2VyIHRyZWVWaWV3ZXI7Ci0JcHJpdmF0ZSBBcnJheUxpc3QgY29uZmxpY3RzOwotCi0Jc3RhdGljIGNsYXNzIElkRW50cnkgewotCQlJQ29uZmlndXJlZFNpdGUgY3NpdGU7Ci0JCUlGZWF0dXJlIGZlYXR1cmU7Ci0KLQkJcHVibGljIElkRW50cnkoSUZlYXR1cmUgZmVhdHVyZSwgSUNvbmZpZ3VyZWRTaXRlIGNzaXRlKSB7Ci0JCQl0aGlzLmZlYXR1cmUgPSBmZWF0dXJlOwotCQkJdGhpcy5jc2l0ZSA9IGNzaXRlOwotCQkJaWYgKGNzaXRlID09IG51bGwpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImNzaXRlIG51bGwiKTsKLQkJCX0KLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBpc0luc3RhbGxDYW5kaWRhdGUoKSB7Ci0JCQlyZXR1cm4gY3NpdGUgIT0gbnVsbDsKLQkJfQotCQlwdWJsaWMgSUZlYXR1cmUgZ2V0RmVhdHVyZSgpIHsKLQkJCXJldHVybiBmZWF0dXJlOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRJZGVudGlmaWVyKCkgewotCQkJcmV0dXJuIGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldElkZW50aWZpZXIoKTsKLQkJfQotCQlwdWJsaWMgSUNvbmZpZ3VyZWRTaXRlIGdldENvbmZpZ3VyZWRTaXRlKCkgewotCQkJaWYgKGNzaXRlICE9IG51bGwpCi0JCQkJcmV0dXJuIGNzaXRlOwotCQkJcmV0dXJuIGZlYXR1cmUuZ2V0U2l0ZSgpLmdldEN1cnJlbnRDb25maWd1cmVkU2l0ZSgpOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIHNhbWVMZXZlbChJZEVudHJ5IGVudHJ5KSB7Ci0JCQlWZXJzaW9uZWRJZGVudGlmaWVyIHZpZCA9IGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOwotCQkJVmVyc2lvbmVkSWRlbnRpZmllciBldmlkID0KLQkJCQllbnRyeS5nZXRGZWF0dXJlKCkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOwotCQkJcmV0dXJuIHZpZC5lcXVhbHMoZXZpZCk7Ci0JCX0KLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCUlDb25maWd1cmVkU2l0ZSBjb25maWdTaXRlID0gZ2V0Q29uZmlndXJlZFNpdGUoKTsKLQkJCVN0cmluZyB2ZXJzaW9uID0KLQkJCQlmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRWZXJzaW9uKCkudG9TdHJpbmcoKTsKLQkJCVN0cmluZyBsb2NhdGlvbiA9IGNvbmZpZ1NpdGUuZ2V0U2l0ZSgpLmdldFVSTCgpLmdldEZpbGUoKTsKLQkJCXJldHVybiBVcGRhdGVVSS5nZXRGb3JtYXR0ZWRNZXNzYWdlKAotCQkJCUtFWV9DT05GTElDVCwKLQkJCQluZXcgU3RyaW5nW10geyB2ZXJzaW9uLCBsb2NhdGlvbiB9KTsKLQkJfQotCX0KLQotCWNsYXNzIENvbmZsaWN0Q29udGVudFByb3ZpZGVyCi0JCWV4dGVuZHMgRGVmYXVsdENvbnRlbnRQcm92aWRlcgotCQlpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyLCBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB7Ci0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXQpIHsKLQkJCXJldHVybiBnZXRDaGlsZHJlbihpbnB1dCk7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGNoaWxkKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgcGFyZW50KSB7Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQXJyYXlMaXN0KQotCQkJCXJldHVybiB0cnVlOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50KSB7Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQXJyYXlMaXN0KQotCQkJCXJldHVybiAoKEFycmF5TGlzdCkgcGFyZW50KS50b0FycmF5KCk7Ci0JCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQkJfQotCX0KLQotCWNsYXNzIENvbmZsaWN0TGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgewotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iaikgewotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFycmF5TGlzdCkgewotCQkJCUFycmF5TGlzdCBsaXN0ID0gKEFycmF5TGlzdCkgb2JqOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotCQkJCQlJZEVudHJ5IGVudHJ5ID0gKElkRW50cnkpIChsaXN0KS5nZXQoaSk7Ci0JCQkJCWlmIChlbnRyeS5pc0luc3RhbGxDYW5kaWRhdGUoKSkKLQkJCQkJCXJldHVybiBlbnRyeS5nZXRGZWF0dXJlKCkuZ2V0TGFiZWwoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChvYmopOwotCQl9Ci0JCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3Qgb2JqKSB7Ci0JCQlpbnQgZmxhZ3MgPSAwOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFycmF5TGlzdCkKLQkJCQlmbGFncyA9IFVwZGF0ZUxhYmVsUHJvdmlkZXIuRl9XQVJOSU5HOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElkRW50cnkgfHwgb2JqIGluc3RhbmNlb2YgQXJyYXlMaXN0KQotCQkJCXJldHVybiBVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0TGFiZWxQcm92aWRlcigpLmdldCgKLQkJCQkJVXBkYXRlVUlJbWFnZXMuREVTQ19GRUFUVVJFX09CSiwKLQkJCQkJZmxhZ3MpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgRHVwbGljYXRlQ29uZmxpY3RzRGlhbG9nKFNoZWxsIHNoZWxsLCBBcnJheUxpc3QgY29uZmxpY3RzKSB7Ci0JCXN1cGVyKAotCQkJc2hlbGwsCi0JCQlVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX1RJVExFKSwKLQkJCW51bGwsCi0JCQlVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX01FU1NBR0UpLAotCQkJV0FSTklORywKLQkJCW5ldyBTdHJpbmdbXSB7Ci0JCQkJSURpYWxvZ0NvbnN0YW50cy5ZRVNfTEFCRUwsCi0JCQkJSURpYWxvZ0NvbnN0YW50cy5OT19MQUJFTCB9LAotCQkJMCk7Ci0JCXRoaXMuY29uZmxpY3RzID0gY29uZmxpY3RzOwotCQlVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0TGFiZWxQcm92aWRlcigpLmNvbm5lY3QodGhpcyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2xvc2UoKSB7Ci0JCVVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRMYWJlbFByb3ZpZGVyKCkuZGlzY29ubmVjdCh0aGlzKTsKLQkJcmV0dXJuIHN1cGVyLmNsb3NlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ3VzdG9tQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjbGllbnQgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQljbGllbnQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJY2xpZW50LnNldExheW91dChsYXlvdXQpOwotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNsaWVudCwgU1dULk5VTEwpOwotCQlsYWJlbC5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfVFJFRV9MQUJFTCkpOwotCi0JCXRyZWVWaWV3ZXIgPSBuZXcgVHJlZVZpZXdlcihjbGllbnQsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZ2QuaGVpZ2h0SGludCA9IDIwMDsKLQkJZ2Qud2lkdGhIaW50ID0gMzAwOwotCQl0cmVlVmlld2VyLmdldFRyZWUoKS5zZXRMYXlvdXREYXRhKGdkKTsKLQkJdHJlZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IENvbmZsaWN0Q29udGVudFByb3ZpZGVyKCkpOwotCQl0cmVlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IENvbmZsaWN0TGFiZWxQcm92aWRlcigpKTsKLQkJdHJlZVZpZXdlci5zZXRBdXRvRXhwYW5kTGV2ZWwoMTApOwotCQl0cmVlVmlld2VyLnNldFNvcnRlcihuZXcgVmlld2VyU29ydGVyKCkgewotCQl9KTsKLQkJdHJlZVZpZXdlci5zZXRJbnB1dChjb25mbGljdHMpOwotCQlyZXR1cm4gY2xpZW50OwotCX0KLQotCXN0YXRpYyBBcnJheUxpc3QgY29tcHV0ZUR1cGxpY2F0ZUNvbmZsaWN0cygKLQkJUGVuZGluZ0NoYW5nZSBqb2IsCi0JCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcsCi0JCUlDb25maWd1cmVkU2l0ZSB0YXJnZXRTaXRlLAotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIG9wdGlvbmFsRmVhdHVyZXMpIHsKLQkJSGFzaHRhYmxlIGZlYXR1cmVUYWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLQkJdHJ5IHsKLQkJCWNvbXB1dGVQcmVzZW50U3RhdGUoZmVhdHVyZVRhYmxlLCBjb25maWcpOwotCQkJY29tcHV0ZU5ld0ZlYXR1cmUoCi0JCQkJam9iLmdldEZlYXR1cmUoKSwKLQkJCQl0YXJnZXRTaXRlLAotCQkJCWZlYXR1cmVUYWJsZSwKLQkJCQlvcHRpb25hbEZlYXR1cmVzKTsKLQkJCXJldHVybiBjb21wdXRlQ29uZmxpY3RzKGZlYXR1cmVUYWJsZSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgQXJyYXlMaXN0IGNvbXB1dGVEdXBsaWNhdGVDb25mbGljdHMoCi0JCVBlbmRpbmdDaGFuZ2VbXSBqb2JzLAotCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCUhhc2h0YWJsZSBmZWF0dXJlVGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCWNvbXB1dGVQcmVzZW50U3RhdGUoZmVhdHVyZVRhYmxlLCBjb25maWcpOwotCQljb21wdXRlTmV3RmVhdHVyZXMoam9icywgY29uZmlnLCBmZWF0dXJlVGFibGUpOwotCQlyZXR1cm4gY29tcHV0ZUNvbmZsaWN0cyhmZWF0dXJlVGFibGUpOwotCX0KLQotCXN0YXRpYyBBcnJheUxpc3QgY29tcHV0ZUR1cGxpY2F0ZUNvbmZsaWN0cygKLQkJTXVsdGlUYXJnZXRQYWdlLkpvYlRhcmdldFNpdGVbXSBqb2JTaXRlcywKLQkJSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlIYXNodGFibGUgZmVhdHVyZVRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotCQljb21wdXRlUHJlc2VudFN0YXRlKGZlYXR1cmVUYWJsZSwgY29uZmlnKTsKLQkJY29tcHV0ZU5ld0ZlYXR1cmVzKGpvYlNpdGVzLCBjb25maWcsIGZlYXR1cmVUYWJsZSk7Ci0JCXJldHVybiBjb21wdXRlQ29uZmxpY3RzKGZlYXR1cmVUYWJsZSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgQXJyYXlMaXN0IGNvbXB1dGVDb25mbGljdHMoSGFzaHRhYmxlIGZlYXR1cmVUYWJsZSkgewotCQlBcnJheUxpc3QgcmVzdWx0ID0gbnVsbDsKLQkJZm9yIChFbnVtZXJhdGlvbiBlbnVtID0gZmVhdHVyZVRhYmxlLmVsZW1lbnRzKCk7Ci0JCQllbnVtLmhhc01vcmVFbGVtZW50cygpOwotCQkJKSB7Ci0JCQlBcnJheUxpc3QgY2FuZGlkYXRlID0gKEFycmF5TGlzdCkgZW51bS5uZXh0RWxlbWVudCgpOwotCQkJaWYgKGNhbmRpZGF0ZS5zaXplKCkgPT0gMSkKLQkJCQljb250aW51ZTsKLQkJCUFycmF5TGlzdCBjb25mbGljdCA9IGNoZWNrRm9yQ29uZmxpY3QoY2FuZGlkYXRlKTsKLQkJCWlmIChjb25mbGljdCAhPSBudWxsKSB7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQlyZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJcmVzdWx0LmFkZChjb25mbGljdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBBcnJheUxpc3QgY2hlY2tGb3JDb25mbGljdChBcnJheUxpc3QgY2FuZGlkYXRlKSB7Ci0JCUlkRW50cnkgZmlyc3RFbnRyeSA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2FuZGlkYXRlLnNpemUoKTsgaSsrKSB7Ci0JCQlJZEVudHJ5IGVudHJ5ID0gKElkRW50cnkpIGNhbmRpZGF0ZS5nZXQoaSk7Ci0JCQlpZiAoZmlyc3RFbnRyeSA9PSBudWxsKQotCQkJCWZpcnN0RW50cnkgPSBlbnRyeTsKLQkJCWVsc2UgaWYgKCFlbnRyeS5zYW1lTGV2ZWwoZmlyc3RFbnRyeSkpCi0JCQkJcmV0dXJuIGNhbmRpZGF0ZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNvbXB1dGVQcmVzZW50U3RhdGUoCi0JCUhhc2h0YWJsZSB0YWJsZSwKLQkJSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlJQ29uZmlndXJlZFNpdGVbXSBjc2l0ZXMgPSBjb25maWcuZ2V0Q29uZmlndXJlZFNpdGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY3NpdGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJQ29uZmlndXJlZFNpdGUgY3NpdGUgPSBjc2l0ZXNbaV07Ci0JCQlJRmVhdHVyZVJlZmVyZW5jZVtdIHJlZnMgPSBjc2l0ZS5nZXRDb25maWd1cmVkRmVhdHVyZXMoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgcmVmcy5sZW5ndGg7IGorKykgewotCQkJCXRyeSB7Ci0JCQkJCWFkZEVudHJ5KHJlZnNbal0uZ2V0RmVhdHVyZShudWxsKSwgY3NpdGUsIHRhYmxlKTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gZG9uJ3QgbGV0IG9uZSBiYWQgZmVhdHVyZSBzdG9wIHRoZSBsb29wCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb21wdXRlTmV3RmVhdHVyZXMoCi0JCVBlbmRpbmdDaGFuZ2VbXSBqb2JzLAotCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnLAotCQlIYXNodGFibGUgZmVhdHVyZVRhYmxlKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgam9icy5sZW5ndGg7IGkrKykgewotCQkJUGVuZGluZ0NoYW5nZSBqb2IgPSBqb2JzW2ldOwotCQkJSUNvbmZpZ3VyZWRTaXRlIHRhcmdldFNpdGUgPQotCQkJCVRhcmdldFBhZ2UuZ2V0RGVmYXVsdFRhcmdldFNpdGUoY29uZmlnLCBqb2IpOwotCQkJSUZlYXR1cmUgbmV3RmVhdHVyZSA9IGpvYi5nZXRGZWF0dXJlKCk7Ci0JCQl0cnkgewotCQkJCWNvbXB1dGVOZXdGZWF0dXJlKG5ld0ZlYXR1cmUsIHRhcmdldFNpdGUsIGZlYXR1cmVUYWJsZSwgbnVsbCk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgY29tcHV0ZU5ld0ZlYXR1cmVzKAotCQlNdWx0aVRhcmdldFBhZ2UuSm9iVGFyZ2V0U2l0ZVtdIGpvYlNpdGVzLAotCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnLAotCQlIYXNodGFibGUgZmVhdHVyZVRhYmxlKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgam9iU2l0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCU11bHRpVGFyZ2V0UGFnZS5Kb2JUYXJnZXRTaXRlIGpvYlNpdGUgPSBqb2JTaXRlc1tpXTsKLQkJCVBlbmRpbmdDaGFuZ2Ugam9iID0gam9iU2l0ZS5qb2I7Ci0JCQlJQ29uZmlndXJlZFNpdGUgdGFyZ2V0U2l0ZSA9IGpvYlNpdGUudGFyZ2V0U2l0ZTsKLQkJCUlGZWF0dXJlIG5ld0ZlYXR1cmUgPSBqb2IuZ2V0RmVhdHVyZSgpOwotCQkJdHJ5IHsKLQkJCQljb21wdXRlTmV3RmVhdHVyZShuZXdGZWF0dXJlLCB0YXJnZXRTaXRlLCBmZWF0dXJlVGFibGUsIG51bGwpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNvbXB1dGVOZXdGZWF0dXJlKAotCQlJRmVhdHVyZSBmZWF0dXJlLAotCQlJQ29uZmlndXJlZFNpdGUgY3NpdGUsCi0JCUhhc2h0YWJsZSB0YWJsZSwKLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBvcHRpb25hbEZlYXR1cmVzKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWFkZEVudHJ5KGZlYXR1cmUsIGNzaXRlLCB0YWJsZSk7Ci0JCUlJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VbXSBpcmVmcyA9Ci0JCQlmZWF0dXJlLmdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpcmVmcy5sZW5ndGg7IGkrKykgewotCQkJSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZSBpcmVmID0gaXJlZnNbaV07Ci0JCQlib29sZWFuIGFkZCA9IHRydWU7Ci0KLQkJCWlmIChpcmVmLmlzT3B0aW9uYWwoKSAmJiBvcHRpb25hbEZlYXR1cmVzICE9IG51bGwpIHsKLQkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBvcHRpb25hbEZlYXR1cmVzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCUlGZWF0dXJlUmVmZXJlbmNlIGNoZWNrZWQgPSBvcHRpb25hbEZlYXR1cmVzW2pdOwotCQkJCQlpZiAoY2hlY2tlZC5lcXVhbHMoaXJlZikpIHsKLQkJCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCWFkZCA9IGZvdW5kOwotCQkJfQotCQkJaWYgKGFkZCkKLQkJCQljb21wdXRlTmV3RmVhdHVyZSgKLQkJCQkJaXJlZi5nZXRGZWF0dXJlKG51bGwpLAotCQkJCQljc2l0ZSwKLQkJCQkJdGFibGUsCi0JCQkJCW9wdGlvbmFsRmVhdHVyZXMpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRFbnRyeSgKLQkJSUZlYXR1cmUgZmVhdHVyZSwKLQkJSUNvbmZpZ3VyZWRTaXRlIGNzaXRlLAotCQlIYXNodGFibGUgZmVhdHVyZVRhYmxlKSB7Ci0JCVN0cmluZyBpZCA9IGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldElkZW50aWZpZXIoKTsKLQkJQXJyYXlMaXN0IGVudHJpZXMgPSAoQXJyYXlMaXN0KSBmZWF0dXJlVGFibGUuZ2V0KGlkKTsKLQkJaWYgKGVudHJpZXMgPT0gbnVsbCkgewotCQkJZW50cmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZlYXR1cmVUYWJsZS5wdXQoaWQsIGVudHJpZXMpOwotCQl9Ci0JCUlkRW50cnkgZW50cnkgPSBuZXcgSWRFbnRyeShmZWF0dXJlLCBjc2l0ZSk7Ci0JCWJvb2xlYW4gcmVwbGFjZWQgPSBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLnNpemUoKTsgaSsrKSB7Ci0JCQlJZEVudHJ5IGV4aXN0aW5nRW50cnkgPSAoSWRFbnRyeSkgZW50cmllcy5nZXQoaSk7Ci0JCQlJQ29uZmlndXJlZFNpdGUgZXhpc3RpbmdTaXRlID0gZXhpc3RpbmdFbnRyeS5nZXRDb25maWd1cmVkU2l0ZSgpOwotCQkJaWYgKGV4aXN0aW5nU2l0ZS5lcXVhbHMoZW50cnkuZ2V0Q29uZmlndXJlZFNpdGUoKSkpIHsKLQkJCQkvLyBzYW1lIHNpdGUgLSByZXBsYWNlIGl0IGlmIG5vdCBuZXcKLQkJCQlpZiAoZW50cnkuaXNJbnN0YWxsQ2FuZGlkYXRlKCkpIHsKLQkJCQkJZW50cmllcy5zZXQoaSwgZW50cnkpOwotCQkJCQllbnRyaWVzLnJlbW92ZShleGlzdGluZ0VudHJ5KTsKLQkJCQl9Ci0JCQkJcmVwbGFjZWQgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmICghcmVwbGFjZWQpCi0JCQllbnRyaWVzLmFkZChlbnRyeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvRmVhdHVyZUhpZXJhcmNoeUVsZW1lbnQuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL0ZlYXR1cmVIaWVyYXJjaHlFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhYWRiYTcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvRmVhdHVyZUhpZXJhcmNoeUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5NYWluUHJlZmVyZW5jZVBhZ2U7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGNvbnN0cnVjdCBhIGpvaW50IGZlYXR1cmUgaGllYXJjaHkuCi0gKiBPbGQgZmVhdHVyZSByZWZlcmVuY2UgcmVwcmVzZW50cyBmZWF0dXJlIHRoYXQgaXMKLSAqIGZvdW5kIG9uIGluIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uIE5ldyBmZWF0dXJlCi0gKiByZWZlcmVuY2UgaXMgZm91bmQgaW4gdGhlIGZlYXR1cmUgdGhhdCBpcyBhbiBpbnN0YWxsL3VwZGF0ZQotICogY2FuZGlkYXRlLiBUaGUgZWxlbWVudCBpcyB1c2VkIHRvIGpvaW4gbm9kZXMgb2YgdGhlCi0gKiBoaWVhcmNoeSBmb3JtZWQgYnkgaW5jbHVkaW5nIGZlYXR1cmVzIHNvIHRoYXQKLSAqIGVhY2ggbm9kZSBpbiB0aGUgaGllYXJjaHkgY29udGFpbnMgcmVmZXJlbmNlcyB0byB0aGUKLSAqIG9sZCBhbmQgdGhlIG5ldyBmZWF0dXJlLiBPbGQgYW5kIG5ldyBmZWF0dXJlcyBoYXZlCi0gKiB0aGUgc2FtZSBJRHMgYnV0IGRpZmZlcmVudCB2ZXJzaW9ucywgZXhjZXB0IGluIAotICogdGhlIGNhc2Ugb2Ygb3B0aW9uYWwgZmVhdHVyZXMsIHdoZXJlIHRoZSB0cmVlIG1heQotICogYmUgY29uc3RydWN0ZWQgdG8gYnJpbmcgaW4gYW4gb3B0aW9uYWwgZmVhdHVyZQotICogdGhhdCB3YXMgbm90IGluc3RhbGxlZCBpbml0aWFsbHkuIEluIHRoYXQgY2FzZSwKLSAqIHNvbWUgbm9kZXMgbWF5IGhhdmUgb2xkIGFuIG5ldyByZWZlcmVuY2VzIHdpdGggdGhlCi0gKiBzYW1lIElEIGFuZCB2ZXJzaW9uLiAKLSAqIDxwPgotICogT2xkIGZlYXR1cmUgcmVmZXJlbmNlIG1heSBiZSBudWxsLiBUaGF0IG1lYW5zCi0gKiB0aGF0IHRoZSBvbGRlciBmZWF0dXJlIHdpdGggdGhlIHNhbWUgSUQgYnV0IGxvd2VyCi0gKiB2ZXJzaW9uIHdhcyBub3QgZm91bmQgaW4gdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIEZlYXR1cmVIaWVyYXJjaHlFbGVtZW50IHsKLQlwcml2YXRlIE9iamVjdCByb290OwotCXByaXZhdGUgQXJyYXlMaXN0IGNoaWxkcmVuOwotCXByaXZhdGUgSUZlYXR1cmVSZWZlcmVuY2Ugb2xkRmVhdHVyZVJlZjsKLQlwcml2YXRlIElGZWF0dXJlUmVmZXJlbmNlIG5ld0ZlYXR1cmVSZWY7Ci0JcHJpdmF0ZSBib29sZWFuIGNoZWNrZWQ7Ci0JcHJpdmF0ZSBib29sZWFuIG9wdGlvbmFsQ2hpbGRyZW47Ci0JcHJpdmF0ZSBib29sZWFuIG5hdGl2ZVVwZ3JhZGUgPSBmYWxzZTsKLQotCXB1YmxpYyBGZWF0dXJlSGllcmFyY2h5RWxlbWVudCgKLQkJSUZlYXR1cmVSZWZlcmVuY2Ugb2xkUmVmLAotCQlJRmVhdHVyZVJlZmVyZW5jZSBuZXdSZWYpIHsKLQkJb2xkRmVhdHVyZVJlZiA9IG9sZFJlZjsKLQkJbmV3RmVhdHVyZVJlZiA9IG5ld1JlZjsKLQl9Ci0KLQl2b2lkIHNldFJvb3QoT2JqZWN0IHJvb3QpIHsKLQkJdGhpcy5yb290ID0gcm9vdDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFJvb3QoKSB7Ci0JCXJldHVybiByb290OwotCX0KLQotCS8qCi0JICogUmV0dXJuIHRydWUgaWYgZWxlbWVudCBjYW4gYmUgY2hlY2tlZCwgZmFsc2Ugb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRWRpdGFibGUoKSB7Ci0JCS8vIGNhbm5vdCB1bmNoZWNrIG5vbi1vcHRpb25hbCBmZWF0dXJlcwotCQlpZiAoaXNPcHRpb25hbCgpID09IGZhbHNlKQotCQkJcmV0dXJuIGZhbHNlOwotCQkvLyBjYW5ub3QgdW5jaGVjayBvcHRpb25hbCBmZWF0dXJlIHRoYXQKLQkJLy8gaGFzIGFscmVhZHkgYmVlbiBpbnN0YWxsZWQKLQkJaWYgKG9sZEZlYXR1cmVSZWYgIT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQSBoaXJlYXJjaHkgbm9kZSByZXByZXNlbnRzIGEgJ2ZhbHNlIHVwZGF0ZScgaWYKLQkgKiBib3RoIG9sZCBhbmQgbmV3IHJlZmVyZW5jZXMgZXhpc3QgYW5kIGJvdGgKLQkgKiBwb2ludCB0byB0aGUgZmVhdHVyZSB3aXRoIHRoZSBzYW1lIElEIGFuZCB2ZXJzaW9uLgotCSAqIFRoZXNlIG5vZGVzIHdpbGwgbm90IGFueSBieXRlcyB0byBiZSBkb3dubG9hZGVkIC0gCi0JICogdGhleSBzaW1wbHkgZXhpc3QgdG8gYWxsb3cgdGhlIGhpcmFyY2h5IHRvCi0JICogcmVhY2ggdGhlIG9wdGlvbmFsIGNoaWxkcmVuIHRoYXQgYXJlIG1pc3NpbmcKLQkgKiBhbmQgd2lsbCBiZSBpbnN0YWxsZWQuCi0JICovCi0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhbHNlVXBkYXRlKCkgewotCQlpZiAob2xkRmVhdHVyZVJlZiAhPSBudWxsICYmIG5ld0ZlYXR1cmVSZWYgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gb2xkRmVhdHVyZVJlZi5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZXF1YWxzKAotCQkJCQluZXdGZWF0dXJlUmVmLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiBmZWF0dXJlIGlzIGluY2x1ZGVkIGFzIG9wdGlvbmFsLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzT3B0aW9uYWwoKSB7Ci0JCXJldHVybiBuZXdGZWF0dXJlUmVmIGluc3RhbmNlb2YgSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZQotCQkJJiYgKChJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlKSBuZXdGZWF0dXJlUmVmKS5pc09wdGlvbmFsKCk7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIG9wdGlvbmFsIGZlYXR1cmUgaXMgc2VsZWN0ZWQKLQkgKiBmb3IgaW5zdGFsbGF0aW9uLiBOb24tb3B0aW9uYWwgZmVhdHVyZXMgb3Igbm9uLWVkaXRhYmxlCi0JICogZmVhdHVyZXMgYXJlIGFsd2F5cyBjaGVja2VkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ2hlY2tlZCgpIHsKLQkJcmV0dXJuIGNoZWNrZWQ7Ci0JfQotCi0Jdm9pZCBzZXROYXRpdmVVcGdyYWRlKGJvb2xlYW4gbmF0aXZlVXBncmFkZSkgewotCQl0aGlzLm5hdGl2ZVVwZ3JhZGUgPSBuYXRpdmVVcGdyYWRlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIG9wdGlvbmFsIGZlYXR1cmUgc2hvdWxkCi0JICogYmUgZW5hYmxlZCB3aGVuIGluc3RhbGxlZC4gQnkgZGVmYXVsdCwgYWxsCi0JICogZmVhdHVyZXMgaW4gdGhlIGhpZWFyY2h5IHNob3VsZCBiZSBlbmFibGVkLgotCSAqIFRoZSBleGNlcHRpb24gaXMgZm9yIG9wdGlvbmFsIGZlYXR1cmVzIHRoYXQKLQkgKiBhcmUgdXBkYXRlZCB0byBhIG5ldyB2ZXJzaW9uIGluIGNhc2Ugd2hlcmUKLQkgKiB0aGUgb2xkZXIgdmVyc2lvbiBvZiB0aGUgb3B0aW9uYWwgZmVhdHVyZQotCSAqIGlzIGRpc2FibGVkIGluIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uLiAKLQkgKiBJbiB0aGlzIGNhc2UsIHRoZSBmZWF0dXJlIGlzCi0JICogdXBkYXRlZCBhbmQgZGlzYWJsZWQgaW4gb3JkZXIgdG8gbWFpbnRhaW4KLQkgKiBpdHMgc3RhdGUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKElJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJaWYgKG5hdGl2ZVVwZ3JhZGUpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKGlzT3B0aW9uYWwoKSAmJiBvbGRGZWF0dXJlUmVmICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJSUZlYXR1cmUgb2xkRmVhdHVyZSA9IG9sZEZlYXR1cmVSZWYuZ2V0RmVhdHVyZShudWxsKTsKLQkJCQlJQ29uZmlndXJlZFNpdGUgY3NpdGUgPQotCQkJCQlJbnN0YWxsV2l6YXJkLmZpbmRDb25maWdTaXRlKG9sZEZlYXR1cmUsIGNvbmZpZyk7Ci0JCQkJcmV0dXJuIGNzaXRlLmlzQ29uZmlndXJlZChvbGRGZWF0dXJlKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBJRmVhdHVyZSBnZXRGZWF0dXJlKCkgewotCQl0cnkgewotCQkJSUZlYXR1cmUgZmVhdHVyZSA9IG5ld0ZlYXR1cmVSZWYuZ2V0RmVhdHVyZShudWxsKTsKLQkJCXJldHVybiBmZWF0dXJlOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2VsZWN0cyBhbiBlZGl0YWJsZSBmZWF0dXJlIGZvciBpbnN0YWxsYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2hlY2tlZChib29sZWFuIGNoZWNrZWQpIHsKLQkJdGhpcy5jaGVja2VkID0gY2hlY2tlZDsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyBsYWJlbCBmb3IgVUkgcHJlc2VudGF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0RmVhdHVyZUxhYmVsKG5ld0ZlYXR1cmVSZWYpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChuZXdGZWF0dXJlUmVmIGluc3RhbmNlb2YgSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZSkgewotCQkJCVN0cmluZyBpbmFtZSA9Ci0JCQkJCSgoSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZSkgbmV3RmVhdHVyZVJlZikuZ2V0TmFtZSgpOwotCQkJCWlmIChpbmFtZSAhPSBudWxsKQotCQkJCQlyZXR1cm4gaW5hbWU7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCVZlcnNpb25lZElkZW50aWZpZXIgdmlkID0KLQkJCQkJbmV3RmVhdHVyZVJlZi5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7Ci0JCQkJcmV0dXJuIHZpZC50b1N0cmluZygpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlMikgewotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkvKioKLQkgKiBDb21wdXRlcyBsYWJlbCBmcm9tIHRoZSBmZWF0dXJlLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldEZlYXR1cmVMYWJlbChJRmVhdHVyZVJlZmVyZW5jZSBmZWF0dXJlUmVmKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlGZWF0dXJlIGZlYXR1cmUgPSBmZWF0dXJlUmVmLmdldEZlYXR1cmUobnVsbCk7Ci0JCXJldHVybiBmZWF0dXJlLmdldExhYmVsKCkKLQkJCSsgIiAiCi0JCQkrIGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldFZlcnNpb24oKS50b1N0cmluZygpOwotCX0KLQkvKioKLQkgKiBDb21wdXRlcyBjaGlsZHJlbiBieSBsaW5raW5nIG1hdGNoaW5nIGZlYXR1cmVzIGZyb20gdGhlCi0JICogb2xkIGZlYXR1cmUncyBhbmQgbmV3IGZlYXR1cmUncyBoaWVyYXJjaHkuCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKGJvb2xlYW4gdXBkYXRlLCBib29sZWFuIHBhdGNoLCBJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCWNvbXB1dGVDaGlsZHJlbih1cGRhdGUsIHBhdGNoLCBjb25maWcpOwotCQlyZXR1cm4gY2hpbGRyZW4udG9BcnJheSgpOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IFtdIGdldENoaWxkcmVuKCkgewotCQlpZiAoY2hpbGRyZW4hPW51bGwpIHJldHVybiBjaGlsZHJlbi50b0FycmF5KCk7Ci0JCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCX0KLQkvKioKLQkgKiBDb21wdXRlcyBjaGlsZHJlbiBvZiB0aGlzIG5vZGUuCi0JICogQHJldHVybiB0cnVlIGlmIHNvbWUgb2YgdGhlIGNoaWxkcmVuIGFyZSBvcHRpb25hbCwgZmFsc2Ugb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyB2b2lkIGNvbXB1dGVDaGlsZHJlbihib29sZWFuIHVwZGF0ZSwgYm9vbGVhbiBwYXRjaCwgSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCkgewotCQkJY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQl0cnkgewotCQkJCUlGZWF0dXJlIG9sZEZlYXR1cmUgPSBudWxsOwotCQkJCUlGZWF0dXJlIG5ld0ZlYXR1cmUgPSBudWxsOwotCQkJCW5ld0ZlYXR1cmUgPSBuZXdGZWF0dXJlUmVmLmdldEZlYXR1cmUobnVsbCk7Ci0JCQkJaWYgKG9sZEZlYXR1cmVSZWYgIT0gbnVsbCkKLQkJCQkJb2xkRmVhdHVyZSA9IG9sZEZlYXR1cmVSZWYuZ2V0RmVhdHVyZShudWxsKTsKLQkJCQlvcHRpb25hbENoaWxkcmVuID0KLQkJCQkJY29tcHV0ZUVsZW1lbnRzKG9sZEZlYXR1cmUsIG5ld0ZlYXR1cmUsIHVwZGF0ZSwgcGF0Y2gsIGNvbmZpZywgY2hpbGRyZW4pOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKLQkJCQkJRmVhdHVyZUhpZXJhcmNoeUVsZW1lbnQgZWxlbWVudCA9Ci0JCQkJCQkoRmVhdHVyZUhpZXJhcmNoeUVsZW1lbnQpIGNoaWxkcmVuLmdldChpKTsKLQkJCQkJZWxlbWVudC5zZXRSb290KGdldFJvb3QoKSk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQl9Ci0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzT3B0aW9uYWxDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG9wdGlvbmFsQ2hpbGRyZW47Ci0JfQotCS8qKgotCSAqIEFkZHMgY2hlY2tlZCBvcHRpb25hbCBmZWF0dXJlcyB0byB0aGUgcHJvdmlkZWQgc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENoZWNrZWRPcHRpb25hbEZlYXR1cmVzKGJvb2xlYW4gdXBkYXRlLCBib29sZWFuIHBhdGNoLCBJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnLCBTZXQgc2V0KSB7Ci0JCWlmIChpc09wdGlvbmFsKCkgJiYgaXNDaGVja2VkKCkpIHsKLQkJCS8vIERvIG5vdCBhZGQgY2hlY2tlZCBvcHRpb25hbCBmZWF0dXJlcwotCQkJLy8gaWYgdGhpcyBpcyBhbiB1cGRhdGUgY2FzZSBidXQKLQkJCS8vIHRoZSBub2RlIGlzIG5vdCBhICd0cnVlJyB1cGRhdGUKLQkJCS8vIChvbGQgYW5kIG5ldyBmZWF0dXJlIGFyZSB0aGUgZXF1YWwpCi0JCQlpZiAoIXVwZGF0ZSB8fCAhaXNGYWxzZVVwZGF0ZSgpKQotCQkJCXNldC5hZGQobmV3RmVhdHVyZVJlZik7Ci0JCX0KLQkJT2JqZWN0W10gbGlzdCA9IGdldENoaWxkcmVuKHVwZGF0ZSwgcGF0Y2gsIGNvbmZpZyk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewotCQkJRmVhdHVyZUhpZXJhcmNoeUVsZW1lbnQgZWxlbWVudCA9IChGZWF0dXJlSGllcmFyY2h5RWxlbWVudCkgbGlzdFtpXTsKLQkJCWVsZW1lbnQuYWRkQ2hlY2tlZE9wdGlvbmFsRmVhdHVyZXModXBkYXRlLCBwYXRjaCwgY29uZmlnLCBzZXQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29tcHV0ZXMgZmlyc3QtbGV2ZWwgY2hpbGRyZW4gb2YgdGhlIGxpbmtlZCBoaWVyYXJjaHkKLQkgKiBmb3IgdGhlIHByb3ZpZGVkIG9sZCBhbmQgbmV3IGZlYXR1cmVzIChzYW1lIElELCBkaWZmZXJlbnQgdmVyc2lvbgotCSAqIHdoZXJlIG5ldyB2ZXJzaW9uIGlzIGdyZWF0ZXIgb3IgZXF1YWwgdGhlIG9sZCB2ZXJzaW9uKS4KLQkgKiBPbGQgZmVhdHVyZSBtYXkgYmUgbnVsbC4gCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbXB1dGVFbGVtZW50cygKLQkJSUZlYXR1cmUgb2xkRmVhdHVyZSwKLQkJSUZlYXR1cmUgbmV3RmVhdHVyZSwKLQkJYm9vbGVhbiB1cGRhdGUsCi0JCWJvb2xlYW4gcGF0Y2gsCi0JCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcsCi0JCUFycmF5TGlzdCBsaXN0KSB7Ci0JCU9iamVjdFtdIG9sZENoaWxkcmVuID0gbnVsbDsKLQkJT2JqZWN0W10gbmV3Q2hpbGRyZW4gPSBnZXRJbmNsdWRlZEZlYXR1cmVzKG5ld0ZlYXR1cmUpOwotCQlib29sZWFuIG9wdGlvbmFsQ2hpbGRyZW4gPSBmYWxzZTsKLQotCQl0cnkgewotCQkJaWYgKG9sZEZlYXR1cmUgIT0gbnVsbCkgewotCQkJCW9sZENoaWxkcmVuID0gZ2V0SW5jbHVkZWRGZWF0dXJlcyhvbGRGZWF0dXJlKTsKLQkJCX0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmV3Q2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQlJRmVhdHVyZVJlZmVyZW5jZSBvbGRSZWYgPSBudWxsOwotCQkJCUlGZWF0dXJlUmVmZXJlbmNlIG5ld1JlZiA9IChJRmVhdHVyZVJlZmVyZW5jZSkgbmV3Q2hpbGRyZW5baV07Ci0JCQkJaWYgKG9sZENoaWxkcmVuICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIG5ld0lkID0KLQkJCQkJCW5ld1JlZi5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0SWRlbnRpZmllcigpOwotCi0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgb2xkQ2hpbGRyZW4ubGVuZ3RoOyBqKyspIHsKLQkJCQkJCUlGZWF0dXJlUmVmZXJlbmNlIGNyZWYgPQotCQkJCQkJCShJRmVhdHVyZVJlZmVyZW5jZSkgb2xkQ2hpbGRyZW5bal07Ci0JCQkJCQl0cnkgewotCQkJCQkJCWlmIChjcmVmCi0JCQkJCQkJCS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkKLQkJCQkJCQkJLmdldElkZW50aWZpZXIoKQotCQkJCQkJCQkuZXF1YWxzKG5ld0lkKSkgewotCQkJCQkJCQlvbGRSZWYgPSBjcmVmOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKHBhdGNoKSB7Ci0JCQkJCS8vIDMwODQ5IC0gZmluZCB0aGUgb2xkIHJlZmVyZW5jZSBpbiB0aGUKLQkJCQkJLy8gY29uZmlndXJhdGlvbi4KLQkJCQkJaWYgKCFVcGRhdGVVSS5pc1BhdGNoKG5ld0ZlYXR1cmUpKSB7Ci0JCQkJCQlvbGRSZWYgPSBmaW5kUGF0Y2hlZFJlZmVyZW5jZShuZXdSZWYsIGNvbmZpZyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gdGVzdCBpZiB0aGUgb2xkIG9wdGlvbmFsIGZlYXR1cmUgZXhpc3RzCi0JCQkJaWYgKG9sZFJlZiAhPSBudWxsCi0JCQkJCSYmICgob2xkUmVmIGluc3RhbmNlb2YgSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZQotCQkJCQkJJiYgKChJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlKSBvbGRSZWYpLmlzT3B0aW9uYWwoKSkKLQkJCQkJfHwgcGF0Y2gpKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJRmVhdHVyZSBmID0gb2xkUmVmLmdldEZlYXR1cmUobnVsbCk7Ci0JCQkJCQlpZiAoZj09bnVsbCkgb2xkUmVmID0gbnVsbDsKLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBtaXNzaW5nCi0JCQkJCQlvbGRSZWYgPSBudWxsOwotCQkJCQl9Ci0JCQkJfQotCQkJCUZlYXR1cmVIaWVyYXJjaHlFbGVtZW50IGVsZW1lbnQgPQotCQkJCQluZXcgRmVhdHVyZUhpZXJhcmNoeUVsZW1lbnQob2xkUmVmLCBuZXdSZWYpOwotCQkJCS8vIElmIHRoaXMgaXMgYW4gdXBkYXRlIChvbGQgZmVhdHVyZSBleGlzdHMpLCAKLQkJCQkvLyBvbmx5IGNoZWNrIHRoZSBuZXcgb3B0aW9uYWwgZmVhdHVyZSBpZiB0aGUgb2xkIGV4aXN0cy4KLQkJCQkvLyBPdGhlcndpc2UsIGFsd2F5cyBjaGVjay4KLQkJCQlpZiAoZWxlbWVudC5pc09wdGlvbmFsKCkgJiYgKHVwZGF0ZSB8fCBwYXRjaCkpIHsKLQkJCQkJZWxlbWVudC5zZXRDaGVja2VkKG9sZFJlZiAhPSBudWxsKTsKLQkJCQkJaWYgKG9sZFJlZiA9PSBudWxsKSB7Ci0JCQkJCQkvLyBEb2VzIG5vdCBoYXZlIGFuIG9sZCByZWZlcmVuY2UsCi0JCQkJCQkvLyBidXQgaXQgbWF5IGNvbnRhaW4gYW4gb2xkZXIKLQkJCQkJCS8vIGZlYXR1cmUgdGhhdCBtYXkgc3RpbGwgcXVhbGlmeQotCQkJCQkJLy8gZm9yIHVwZGF0ZS4gRm9yIGV4YW1wbGUsCi0JCQkJCQkvLyBhbiBvbGRlciB2ZXJzaW9uIG1heSBoYXZlIGJlZW4KLQkJCQkJCS8vIGluc3RhbGxlZCBuYXRpdmVseSBmcm9tIHRoZSBDRC1ST00uCi0JCQkJCQlpZiAoaGFzT2xkZXJWZXJzaW9uKG5ld1JlZikpIHsKLQkJCQkJCQllbGVtZW50LnNldE5hdGl2ZVVwZ3JhZGUodHJ1ZSk7Ci0JCQkJCQkJZWxlbWVudC5zZXRDaGVja2VkKHRydWUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlCi0JCQkJCWVsZW1lbnQuc2V0Q2hlY2tlZCh0cnVlKTsKLQkJCQlsaXN0LmFkZChlbGVtZW50KTsKLQkJCQllbGVtZW50LmNvbXB1dGVDaGlsZHJlbih1cGRhdGUsIHBhdGNoLCBjb25maWcpOwotCQkJCWlmIChlbGVtZW50LmlzT3B0aW9uYWwoKSB8fCBlbGVtZW50Lmhhc09wdGlvbmFsQ2hpbGRyZW4oKSkKLQkJCQkJb3B0aW9uYWxDaGlsZHJlbiA9IHRydWU7Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBvcHRpb25hbENoaWxkcmVuOwotCX0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzT2xkZXJWZXJzaW9uKElGZWF0dXJlUmVmZXJlbmNlIG5ld1JlZikgewotCQl0cnkgewotCQkJVmVyc2lvbmVkSWRlbnRpZmllciB2aWQgPSBuZXdSZWYuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOwotCQkJUGx1Z2luVmVyc2lvbklkZW50aWZpZXIgdmVyc2lvbiA9IHZpZC5nZXRWZXJzaW9uKCk7Ci0JCQlTdHJpbmcgbW9kZSA9IE1haW5QcmVmZXJlbmNlUGFnZS5nZXRVcGRhdGVWZXJzaW9uc01vZGUoKTsKLQotCQkJSUZlYXR1cmVbXSBhbGxJbnN0YWxsZWQgPQotCQkJCVVwZGF0ZVVJLmdldEluc3RhbGxlZEZlYXR1cmVzKHZpZCwgZmFsc2UpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxJbnN0YWxsZWQubGVuZ3RoOyBpKyspIHsKLQkJCQlJRmVhdHVyZSBjYW5kaWRhdGUgPSBhbGxJbnN0YWxsZWRbaV07Ci0JCQkJUGx1Z2luVmVyc2lvbklkZW50aWZpZXIgY3ZlcnNpb24gPQotCQkJCQljYW5kaWRhdGUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldFZlcnNpb24oKTsKLQkJCQkvLyBWZXJpZnkgdGhhdCB0aGUgZGlmZmVyZW5jZSBxdWFsaWZpZXMgYXMKLQkJCQkvLyBhbiB1cGRhdGUuCi0JCQkJaWYgKG1vZGUuZXF1YWxzKE1haW5QcmVmZXJlbmNlUGFnZS5FUVVJVkFMRU5UX1ZBTFVFKSkgewotCQkJCQlpZiAodmVyc2lvbi5pc0VxdWl2YWxlbnRUbyhjdmVyc2lvbikpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9IGVsc2UgaWYgKG1vZGUuZXF1YWxzKE1haW5QcmVmZXJlbmNlUGFnZS5DT01QQVRJQkxFX1ZBTFVFKSkgewotCQkJCQlpZiAodmVyc2lvbi5pc0NvbXBhdGlibGVXaXRoKGN2ZXJzaW9uKSkKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIElGZWF0dXJlUmVmZXJlbmNlIGZpbmRQYXRjaGVkUmVmZXJlbmNlKAotCQlJRmVhdHVyZVJlZmVyZW5jZSBuZXdSZWYsCi0JCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcpCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJVmVyc2lvbmVkSWRlbnRpZmllciB2aWQgPSBuZXdSZWYuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOwotCQlJQ29uZmlndXJlZFNpdGVbXSBjc2l0ZXMgPSBjb25maWcuZ2V0Q29uZmlndXJlZFNpdGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY3NpdGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJQ29uZmlndXJlZFNpdGUgY3NpdGUgPSBjc2l0ZXNbaV07Ci0JCQlJRmVhdHVyZVJlZmVyZW5jZVtdIHJlZnMgPSBjc2l0ZS5nZXRDb25maWd1cmVkRmVhdHVyZXMoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgcmVmcy5sZW5ndGg7IGorKykgewotCQkJCUlGZWF0dXJlUmVmZXJlbmNlIHJlZiA9IHJlZnNbal07Ci0JCQkJVmVyc2lvbmVkSWRlbnRpZmllciByZWZWaWQgPSByZWYuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOwotCQkJCWlmICh2aWQuZ2V0SWRlbnRpZmllcigpLmVxdWFscyhyZWZWaWQuZ2V0SWRlbnRpZmllcigpKSkKLQkJCQkJcmV0dXJuIHJlZjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGluY2x1ZGVkIGZlYXR1cmUgcmVmZXJlbmNlcyBmb3IgdGhlIGdpdmVuIHJlZmVyZW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdFtdIGdldEluY2x1ZGVkRmVhdHVyZXMoSUZlYXR1cmVSZWZlcmVuY2UgcmVmKSB7Ci0JCXRyeSB7Ci0JCQlJRmVhdHVyZSBmZWF0dXJlID0gcmVmLmdldEZlYXR1cmUobnVsbCk7Ci0JCQlyZXR1cm4gZ2V0SW5jbHVkZWRGZWF0dXJlcyhmZWF0dXJlKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBpbmNsdWRlZCBmZWF0dXJlIHJlZmVyZW5jZXMgZm9yIHRoZSBnaXZlbiBmZWF0dXJlLgotCSAqLwotCi0JcHVibGljIHN0YXRpYyBPYmplY3RbXSBnZXRJbmNsdWRlZEZlYXR1cmVzKElGZWF0dXJlIGZlYXR1cmUpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBmZWF0dXJlLmdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvSUR5bmFtaWNQYWdlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9JRHluYW1pY1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQyNzRlZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9JRHluYW1pY1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWwuUGVuZGluZ0NoYW5nZTsKLQotLyoqCi0gKiBAYXV0aG9yIGRlamFuCi0gKgotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZWRpdCB0aGUgdGVtcGxhdGUgdmFyaWFibGUgInR5cGVjb21tZW50IjoKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPlRlbXBsYXRlcy4KLSAqIFRvIGVuYWJsZSBhbmQgZGlzYWJsZSB0aGUgY3JlYXRpb24gb2YgdHlwZSBjb21tZW50cyBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElEeW5hbWljUGFnZSB7Ci0JcHVibGljIHZvaWQgc2V0Sm9icyhQZW5kaW5nQ2hhbmdlIFtdIGpvYnMpOwotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9JbnN0YWxsRGVsdGFXaXphcmQuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL0luc3RhbGxEZWx0YVdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmY3ZjUwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL0luc3RhbGxEZWx0YVdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wYXJ0cy5TV1RVdGlsOwotCi1wdWJsaWMgY2xhc3MgSW5zdGFsbERlbHRhV2l6YXJkCi0JZXh0ZW5kcyBXaXphcmQKLQlpbXBsZW1lbnRzIElJbnN0YWxsRGVsdGFIYW5kbGVyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1dUSVRMRSA9ICJJbnN0YWxsRGVsdGFXaXphcmQud3RpdGxlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1BST0NFU1NJTkcgPQotCQkiSW5zdGFsbERlbHRhV2l6YXJkLnByb2Nlc3NpbmciOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUkVTVEFSVF9NRVNTQUdFID0KLQkJIkluc3RhbGxEZWx0YVdpemFyZC5yZXN0YXJ0Lm1lc3NhZ2UiOwotCXByaXZhdGUgSVNlc3Npb25EZWx0YVtdIGRlbHRhczsKLQlwcml2YXRlIEluc3RhbGxEZWx0YVdpemFyZFBhZ2UgcGFnZTsKLQlwcml2YXRlIGludCBwcm9jZXNzZWQgPSAwOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEluc3RhbGxEZWx0YVdpemFyZC4KLQkgKi8KLQlwdWJsaWMgSW5zdGFsbERlbHRhV2l6YXJkKCkgewotCQlzZXROZWVkc1Byb2dyZXNzTW9uaXRvcih0cnVlKTsKLQkJc2V0V2luZG93VGl0bGUoVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9XVElUTEUpKTsKLQkJc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoVXBkYXRlVUlJbWFnZXMuREVTQ19VUERBVEVfV0laKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJcGFnZSA9IG5ldyBJbnN0YWxsRGVsdGFXaXphcmRQYWdlKGRlbHRhcyk7Ci0JCWFkZFBhZ2UocGFnZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJV2l6YXJkI3BlcmZvcm1GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCWZpbmFsIERlbHRhQWRhcHRlcltdIGFkYXB0ZXJzID0gcGFnZS5nZXREZWx0YUFkYXB0ZXJzKCk7Ci0KLQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQkJCXRyeSB7Ci0JCQkJCWRvRmluaXNoKGFkYXB0ZXJzLCBtb25pdG9yKTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oZSk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQl0cnkgewotCQkJZ2V0Q29udGFpbmVyKCkucnVuKHRydWUsIHRydWUsIG9wKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlVcGRhdGVVSS5sb2dFeGNlcHRpb24oZSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFuYWx5emVBZGFwdGVycyhEZWx0YUFkYXB0ZXJbXSBhZGFwdGVycywgQXJyYXlMaXN0IHNlbGVjdGVkLCBBcnJheUxpc3QgcmVtb3ZlZCkgewotCQlmb3IgKGludCBpPTA7IGk8YWRhcHRlcnMubGVuZ3RoOyBpKyspIHsKLQkJCURlbHRhQWRhcHRlciBhZGFwdGVyID0gYWRhcHRlcnNbaV07Ci0JCQlpZiAoYWRhcHRlci5pc1JlbW92ZWQoKSkKLQkJCQlyZW1vdmVkLmFkZChhZGFwdGVyKTsKLQkJCWVsc2UgaWYgKGFkYXB0ZXIuaXNTZWxlY3RlZCgpKQotCQkJCXNlbGVjdGVkLmFkZChhZGFwdGVyKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBkb0ZpbmlzaCgKLQkJRGVsdGFBZGFwdGVyIFtdIGFkYXB0ZXJzLAotCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQotCQlBcnJheUxpc3Qgc2VsZWN0ZWREZWx0YXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUFycmF5TGlzdCByZW1vdmVkRGVsdGFzID0gbmV3IEFycmF5TGlzdCgpOwotCQlhbmFseXplQWRhcHRlcnMoYWRhcHRlcnMsIHNlbGVjdGVkRGVsdGFzLCByZW1vdmVkRGVsdGFzKTsKLQkJCQotCQltb25pdG9yLmJlZ2luVGFzaygKLQkJCVVwZGF0ZVVJLmdldFN0cmluZyhLRVlfUFJPQ0VTU0lORyksCi0JCQlzZWxlY3RlZERlbHRhcy5zaXplKCkgKyByZW1vdmVkRGVsdGFzLnNpemUoKSk7Ci0JCXByb2Nlc3NlZCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVtb3ZlZERlbHRhcy5zaXplKCk7IGkrKykgewotCQkJRGVsdGFBZGFwdGVyIGFkYXB0ZXIgPSAoRGVsdGFBZGFwdGVyKXJlbW92ZWREZWx0YXMuZ2V0KGkpOwotCQkJSVNlc3Npb25EZWx0YSBkZWx0YSA9IGFkYXB0ZXIuZ2V0RGVsdGEoKTsKLQkJCWRlbHRhLmRlbGV0ZSgpOwotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJcmV0dXJuOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0ZWREZWx0YXMuc2l6ZSgpOyBpKyspIHsKLQkJCURlbHRhQWRhcHRlciBhZGFwdGVyID0gKERlbHRhQWRhcHRlcilzZWxlY3RlZERlbHRhcy5nZXQoaSk7Ci0JCQlJU2Vzc2lvbkRlbHRhIGRlbHRhID0gYWRhcHRlci5nZXREZWx0YSgpOwotCQkJSUZlYXR1cmVSZWZlcmVuY2UgW10gcmVmcyA9IGRlbHRhLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCQlkZWx0YS5wcm9jZXNzKHJlZnMsIG1vbml0b3IpOwotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQlwcm9jZXNzZWQrKzsKLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElJbnN0YWxsRGVsdGFIYW5kbGVyI2luaXQoSVNlc3Npb25EZWx0YVtdKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVNlc3Npb25EZWx0YVtdIGRlbHRhcykgewotCQl0aGlzLmRlbHRhcyA9IGRlbHRhczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElJbnN0YWxsRGVsdGFIYW5kbGVyI29wZW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIG9wZW4oKSB7Ci0JCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKFNXVFV0aWwuZ2V0U3RhbmRhcmREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlXaXphcmREaWFsb2cgZGlhbG9nID0KLQkJCQkJbmV3IFdpemFyZERpYWxvZygKLQkJCQkJCVVwZGF0ZVVJLmdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCksCi0JCQkJCQlJbnN0YWxsRGVsdGFXaXphcmQudGhpcyk7Ci0JCQkJZGlhbG9nLmNyZWF0ZSgpOwotCQkJCWRpYWxvZy5nZXRTaGVsbCgpLnNldFNpemUoNTAwLCA1MDApOwotCQkJCWRpYWxvZy5vcGVuKCk7Ci0JCQkJaWYgKHByb2Nlc3NlZCA+IDApCi0JCQkJCVVwZGF0ZVVJLmluZm9ybVJlc3RhcnROZWVkZWQoKTsKLQkJCX0KLQkJfSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL0luc3RhbGxEZWx0YVdpemFyZFBhZ2UuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL0luc3RhbGxEZWx0YVdpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjAyNzA0NC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9JbnN0YWxsRGVsdGFXaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuV29ya2JlbmNoSGVscDsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi5JU2Vzc2lvbkRlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wYXJ0cy4qOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgSW5zdGFsbERlbHRhV2l6YXJkUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgewotCXByaXZhdGUgSVNlc3Npb25EZWx0YVtdIGRlbHRhczsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1RJVExFID0gIkluc3RhbGxEZWx0YVdpemFyZC50aXRsZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ERVNDID0gIkluc3RhbGxEZWx0YVdpemFyZC5kZXNjIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0xBQkVMID0gIkluc3RhbGxEZWx0YVdpemFyZC5sYWJlbCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ERUxFVEUgPSAiSW5zdGFsbERlbHRhV2l6YXJkLmRlbGV0ZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9FUlJPUlMgPSAiSW5zdGFsbERlbHRhV2l6YXJkLmVycm9ycyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9NRVNTQUdFID0gIkluc3RhbGxEZWx0YVdpemFyZC5tZXNzYWdlIjsKLQlwcml2YXRlIENoZWNrYm94VHJlZVZpZXdlciBkZWx0YVZpZXdlcjsKLQlwcml2YXRlIEJ1dHRvbiBkZWxldGVCdXR0b247Ci0JcHJpdmF0ZSBCdXR0b24gZXJyb3JzQnV0dG9uOwotCXByaXZhdGUgQXJyYXlMaXN0IGZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JY2xhc3MgRGVsdGFDb250ZW50UHJvdmlkZXIKLQkJZXh0ZW5kcyBEZWZhdWx0Q29udGVudFByb3ZpZGVyCi0JCWltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIgewotCQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgcGFyZW50KSB7Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgRGVsdGFBZGFwdGVyKQotCQkJCXJldHVybiB0cnVlOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50KSB7Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgRGVsdGFBZGFwdGVyKSB7Ci0JCQkJcmV0dXJuICgoRGVsdGFBZGFwdGVyKSBwYXJlbnQpLmdldEZlYXR1cmVzKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQkJfQotCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgY2hpbGQpIHsKLQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIERlbHRhRmVhdHVyZUFkYXB0ZXIpIHsKLQkJCQlyZXR1cm4gKChEZWx0YUZlYXR1cmVBZGFwdGVyKSBjaGlsZCkuZ2V0RGVsdGFBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0KSB7Ci0JCQlyZXR1cm4gZmVhdHVyZXMudG9BcnJheSgpOwotCQl9Ci0JfQotCi0JY2xhc3MgRGVsdGFMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciB7Ci0JCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3Qgb2JqKSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgRGVsdGFBZGFwdGVyKSB7Ci0JCQkJaW50IGZsYWdzID0gMDsKLQkJCQlEZWx0YUFkYXB0ZXIgYWRhcHRlciA9IChEZWx0YUFkYXB0ZXIpIG9iajsKLQkJCQlpZiAoYWRhcHRlci5nZXRTdGF0dXMoKSAhPSBudWxsKQotCQkJCQlmbGFncyA9IFVwZGF0ZUxhYmVsUHJvdmlkZXIuRl9FUlJPUjsKLQkJCQlyZXR1cm4gVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKS5nZXQoCi0JCQkJCVVwZGF0ZVVJSW1hZ2VzLkRFU0NfVVBEQVRFU19PQkosCi0JCQkJCWZsYWdzKTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBEZWx0YUZlYXR1cmVBZGFwdGVyKSB7Ci0JCQkJcmV0dXJuIFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRMYWJlbFByb3ZpZGVyKCkuZ2V0KAotCQkJCQlVcGRhdGVVSUltYWdlcy5ERVNDX0ZFQVRVUkVfT0JKKTsKLQkJCX0KLQkJCXJldHVybiBzdXBlci5nZXRJbWFnZShvYmopOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEluc3RhbGxEZWx0YVdpemFyZFBhZ2UuCi0JICogQHBhcmFtIHBhZ2VOYW1lCi0JICovCi0JcHVibGljIEluc3RhbGxEZWx0YVdpemFyZFBhZ2UoSVNlc3Npb25EZWx0YVtdIGRlbHRhcykgewotCQlzdXBlcigiaW5zdGFsbERlbHRhUGFnZSIpOwotCQl0aGlzLmRlbHRhcyA9IGRlbHRhczsKLQkJc2V0VGl0bGUoVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9USVRMRSkpOwotCQlzZXREZXNjcmlwdGlvbihVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX0RFU0MpKTsKLQkJVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKS5jb25uZWN0KHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCVVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRMYWJlbFByb3ZpZGVyKCkuZGlzY29ubmVjdCh0aGlzKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCXByaXZhdGUgT2JqZWN0IFtdIGluaXRpYWxpemVGZWF0dXJlcygpIHsKLQkJQXJyYXlMaXN0IHNlbGVjdGlvbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGVsdGFzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJU2Vzc2lvbkRlbHRhIGRlbHRhID0gZGVsdGFzW2ldOwotCQkJRGVsdGFBZGFwdGVyIGFkYXB0ZXIgPSBuZXcgRGVsdGFBZGFwdGVyKGRlbHRhKTsKLQkJCWZlYXR1cmVzLmFkZChhZGFwdGVyKTsKLQkJCXNlbGVjdGlvbi5hZGQoYWRhcHRlcik7Ci0JCQlhZGFwdGVyLmFkZEZlYXR1cmVzVG8oc2VsZWN0aW9uKTsKLQkJfQotCQlyZXR1cm4gc2VsZWN0aW9uLnRvQXJyYXkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXQobGF5b3V0KTsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29udGFpbmVyLCBTV1QuTlVMTCk7Ci0JCWxhYmVsLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9MQUJFTCkpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZ2QpOwotCQlkZWx0YVZpZXdlciA9IG5ldyBDaGVja2JveFRyZWVWaWV3ZXIoY29udGFpbmVyLCBTV1QuQk9SREVSKTsKLQkJZGVsdGFWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBEZWx0YUNvbnRlbnRQcm92aWRlcigpKTsKLQkJZGVsdGFWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgRGVsdGFMYWJlbFByb3ZpZGVyKCkpOwotCQlkZWx0YVZpZXdlci5hZGRDaGVja1N0YXRlTGlzdGVuZXIobmV3IElDaGVja1N0YXRlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJaGFuZGxlQ2hlY2tTdGF0ZUNoYW5nZWQoZXZlbnQuZ2V0RWxlbWVudCgpLCBldmVudC5nZXRDaGVja2VkKCkpOwotCQkJfQotCQl9KTsKLQkJZGVsdGFWaWV3ZXIKLQkJCS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBlKSB7Ci0JCQkJdXBkYXRlQnV0dG9ucygoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGUuZ2V0U2VsZWN0aW9uKCkpOwotCQkJfQotCQl9KTsKLQkJZGVsdGFWaWV3ZXIuYWRkRmlsdGVyKG5ldyBWaWV3ZXJGaWx0ZXIoKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBzZWxlY3QoVmlld2VyIHZpZXdlciwgT2JqZWN0IHBhcmVudCwgT2JqZWN0IGNoaWxkKSB7Ci0JCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgRGVsdGFBZGFwdGVyKSB7Ci0JCQkJCXJldHVybiAhKChEZWx0YUFkYXB0ZXIpIGNoaWxkKS5pc1JlbW92ZWQoKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0pOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkZWx0YVZpZXdlci5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJQ29tcG9zaXRlIGJ1dHRvbkNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUoY29udGFpbmVyLCBTV1QuTlVMTCk7Ci0JCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IGxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMKTsKLQkJYnV0dG9uQ29udGFpbmVyLnNldExheW91dERhdGEoZ2QpOwotCQlidXR0b25Db250YWluZXIuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJZGVsZXRlQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db250YWluZXIsIFNXVC5QVVNIKTsKLQkJZGVsZXRlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQlkZWxldGVCdXR0b24uc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX0RFTEVURSkpOwotCQlnZCA9Ci0JCQluZXcgR3JpZERhdGEoCi0JCQkJR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkJZGVsZXRlQnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQlkZWxldGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaGFuZGxlRGVsZXRlKCk7Ci0JCQl9Ci0JCX0pOwotCQlTV1RVdGlsLnNldEJ1dHRvbkRpbWVuc2lvbkhpbnQoZGVsZXRlQnV0dG9uKTsKLQotCQllcnJvcnNCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbnRhaW5lciwgU1dULlBVU0gpOwotCQllcnJvcnNCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWVycm9yc0J1dHRvbi5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfRVJST1JTKSk7Ci0JCWdkID0KLQkJCW5ldyBHcmlkRGF0YSgKLQkJCQlHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpOwotCQllcnJvcnNCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWVycm9yc0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQloYW5kbGVTaG93RXJyb3JzKCk7Ci0JCQl9Ci0JCX0pOwotCQlTV1RVdGlsLnNldEJ1dHRvbkRpbWVuc2lvbkhpbnQoZXJyb3JzQnV0dG9uKTsKLQotCQlPYmplY3RbXSBjaGVja2VkID0gaW5pdGlhbGl6ZUZlYXR1cmVzKCk7Ci0JCWRlbHRhVmlld2VyLnNldElucHV0KHRoaXMpOwotCQlkZWx0YVZpZXdlci5zZXRDaGVja2VkRWxlbWVudHMoY2hlY2tlZCk7Ci0JCQotCQlkaWFsb2dDaGFuZ2VkKCk7Ci0JCVdvcmtiZW5jaEhlbHAuc2V0SGVscCgKLQkJCWNvbnRhaW5lciwKLQkJCSJvcmcuZWNsaXBzZS51cGRhdGUudWkuSW5zdGFsbERlbHRhV2l6YXJkUGFnZSIpOwotCQlzZXRDb250cm9sKGNvbnRhaW5lcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUJ1dHRvbnMoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWJvb2xlYW4gZW5hYmxlU2hvd0Vycm9ycyA9IGZhbHNlOwotCQlib29sZWFuIGVuYWJsZURlbGV0ZSA9IHNlbGVjdGlvbi5zaXplKCkgPiAwOwotCi0JCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCU9iamVjdCBvYmogPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgRGVsdGFBZGFwdGVyKSB7Ci0JCQkJZW5hYmxlU2hvd0Vycm9ycyA9ICEoKERlbHRhQWRhcHRlcikgb2JqKS5pc1ZhbGlkKCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVuYWJsZURlbGV0ZSkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoIShvYmogaW5zdGFuY2VvZiBEZWx0YUFkYXB0ZXIpKSB7Ci0JCQkJCWVuYWJsZURlbGV0ZSA9IGZhbHNlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZGVsZXRlQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlRGVsZXRlKTsKLQkJZXJyb3JzQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlU2hvd0Vycm9ycyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZURlbGV0ZSgpIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0KLQkJCShJU3RydWN0dXJlZFNlbGVjdGlvbikgZGVsdGFWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBEZWx0YUFkYXB0ZXIpIHsKLQkJCQkoKERlbHRhQWRhcHRlcikgb2JqKS5zZXRSZW1vdmVkKHRydWUpOwotCQkJfQotCQl9Ci0JCWRlbHRhVmlld2VyLnJlZnJlc2goKTsKLQkJZGlhbG9nQ2hhbmdlZCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVTaG93RXJyb3JzKCkgewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPQotCQkJKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBkZWx0YVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJRGVsdGFBZGFwdGVyIGFkYXB0ZXIgPSAoRGVsdGFBZGFwdGVyKSBzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCUlTdGF0dXMgc3RhdHVzID0gYWRhcHRlci5nZXRTdGF0dXMoKTsKLQotCQlpZiAoc3RhdHVzICE9IG51bGwpIHsKLQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihnZXRTaGVsbCgpLCBudWxsLCBudWxsLCBzdGF0dXMpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUNoZWNrU3RhdGVDaGFuZ2VkKE9iamVjdCBvYmosIGJvb2xlYW4gY2hlY2tlZCkgewotCQlpZiAob2JqIGluc3RhbmNlb2YgRGVsdGFGZWF0dXJlQWRhcHRlcikgewotCQkJRGVsdGFGZWF0dXJlQWRhcHRlciBkZmVhdHVyZSA9IChEZWx0YUZlYXR1cmVBZGFwdGVyKSBvYmo7Ci0JCQlkZmVhdHVyZS5zZXRTZWxlY3RlZChjaGVja2VkKTsKLQkJCURlbHRhQWRhcHRlciBhZGFwdGVyID0gZGZlYXR1cmUuZ2V0RGVsdGFBZGFwdGVyKCk7Ci0JCQlkZWx0YVZpZXdlci5zZXRHcmF5ZWQoYWRhcHRlciwgYWRhcHRlci5pc01peGVkU2VsZWN0aW9uKCkpOwotCQkJZGVsdGFWaWV3ZXIuc2V0Q2hlY2tlZChhZGFwdGVyLCBhZGFwdGVyLmlzU2VsZWN0ZWQoKSk7Ci0JCQlhZGFwdGVyLnJlc2V0U3RhdHVzKCk7Ci0JCQlkZWx0YVZpZXdlci51cGRhdGUoYWRhcHRlciwgbnVsbCk7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRGVsdGFBZGFwdGVyKSB7Ci0JCQlEZWx0YUFkYXB0ZXIgYWRhcHRlciA9IChEZWx0YUFkYXB0ZXIpIG9iajsKLQkJCWFkYXB0ZXIuc2V0U2VsZWN0ZWQoY2hlY2tlZCk7Ci0JCQlkZWx0YVZpZXdlci5zZXRHcmF5ZWQoYWRhcHRlciwgZmFsc2UpOwotCQkJY29tcHV0ZUNoZWNrZWRFbGVtZW50cygpOwotCQl9Ci0JCWRpYWxvZ0NoYW5nZWQoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY29tcHV0ZUNoZWNrZWRFbGVtZW50cygpIHsKLQkJQXJyYXlMaXN0IGNoZWNrZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXMuc2l6ZSgpOyBpKyspIHsKLQkJCURlbHRhQWRhcHRlciBhZGFwdGVyID0gKERlbHRhQWRhcHRlcikgZmVhdHVyZXMuZ2V0KGkpOwotCQkJaWYgKGFkYXB0ZXIuaXNSZW1vdmVkKCkpCi0JCQkJY29udGludWU7Ci0JCQlpZiAoYWRhcHRlci5pc1NlbGVjdGVkKCkpIHsKLQkJCQljaGVja2VkLmFkZChhZGFwdGVyKTsKLQkJCQlEZWx0YUZlYXR1cmVBZGFwdGVyIGRmW10gPSBhZGFwdGVyLmdldEZlYXR1cmVzKCk7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBkZi5sZW5ndGg7IGorKykgewotCQkJCQlpZiAoZGZbal0uaXNTZWxlY3RlZCgpKQotCQkJCQkJY2hlY2tlZC5hZGQoZGZbal0pOwotCQkJCX0KLQkJCX0KLQkJfQotCQlkZWx0YVZpZXdlci5zZXRDaGVja2VkRWxlbWVudHMoY2hlY2tlZC50b0FycmF5KCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkaWFsb2dDaGFuZ2VkKCkgewotCQlpbnQgbnJlbW92ZWQgPSAwOwotCQlpbnQgbnNlbGVjdGVkID0gMDsKLQkJaW50IGVycm9ycyA9IDA7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5zaXplKCk7IGkrKykgewotCQkJRGVsdGFBZGFwdGVyIGFkYXB0ZXIgPSAoRGVsdGFBZGFwdGVyKSBmZWF0dXJlcy5nZXQoaSk7Ci0JCQlpZiAoYWRhcHRlci5pc1JlbW92ZWQoKSkKLQkJCQlucmVtb3ZlZCsrOwotCQkJZWxzZSBpZiAoYWRhcHRlci5pc1NlbGVjdGVkKCkpIHsKLQkJCQluc2VsZWN0ZWQrKzsKLQkJCQlpZiAoYWRhcHRlci5nZXRTdGF0dXMoKSAhPSBudWxsKQotCQkJCQllcnJvcnMrKzsKLQkJCX0KLQkJfQotCQlzZXRQYWdlQ29tcGxldGUoZXJyb3JzID09IDAgJiYgKG5yZW1vdmVkID4gMCB8fCBuc2VsZWN0ZWQgPiAwKSk7Ci0JCVN0cmluZyBtZXNzYWdlID0gbnVsbDsKLQkJaWYgKGVycm9ycyA+IDApCi0JCQltZXNzYWdlID0gVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9NRVNTQUdFKTsKLQkJc2V0RXJyb3JNZXNzYWdlKG1lc3NhZ2UpOwotCX0KLQotCXB1YmxpYyBEZWx0YUFkYXB0ZXJbXSBnZXREZWx0YUFkYXB0ZXJzKCkgewotCQlyZXR1cm4gKERlbHRhQWRhcHRlcltdKSBmZWF0dXJlcy50b0FycmF5KAotCQkJbmV3IERlbHRhQWRhcHRlcltmZWF0dXJlcy5zaXplKCldKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvSW5zdGFsbFdpemFyZC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvSW5zdGFsbFdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODViMjMzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL0luc3RhbGxXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkud2l6YXJkczsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLkluc3RhbGxBYm9ydGVkRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5zZWN1cml0eS5KYXJWZXJpZmljYXRpb25TZXJ2aWNlOw0KLQ0KLXB1YmxpYyBjbGFzcyBJbnN0YWxsV2l6YXJkIGV4dGVuZHMgV2l6YXJkIHsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9VTkFCTEUgPSAiSW5zdGFsbFdpemFyZC5lcnJvci51bmFibGUiOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX09MRCA9ICJJbnN0YWxsV2l6YXJkLmVycm9yLm9sZCI7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU0FWRURfQ09ORklHID0gIkluc3RhbGxXaXphcmQuc2F2ZWRDb25maWciOw0KLQlwcml2YXRlIFJldmlld1BhZ2UgcmV2aWV3UGFnZTsNCi0JcHJpdmF0ZSBPcHRpb25hbEZlYXR1cmVzUGFnZSBvcHRpb25hbEZlYXR1cmVzUGFnZTsNCi0JcHJpdmF0ZSBUYXJnZXRQYWdlIHRhcmdldFBhZ2U7DQotCXByaXZhdGUgUGVuZGluZ0NoYW5nZSBqb2I7DQotCXByaXZhdGUgYm9vbGVhbiBzdWNjZXNzZnVsSW5zdGFsbCA9IGZhbHNlOw0KLQlwcml2YXRlIElJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWc7DQotCXByaXZhdGUgYm9vbGVhbiBuZWVkTGljZW5zZVBhZ2U7DQotCXByaXZhdGUgYm9vbGVhbiBwYXRjaDsNCi0JDQotCXB1YmxpYyBJbnN0YWxsV2l6YXJkKFBlbmRpbmdDaGFuZ2Ugam9iKSB7DQotCQl0aGlzKGpvYiwgdHJ1ZSk7DQotCX0NCi0NCi0JcHVibGljIEluc3RhbGxXaXphcmQoUGVuZGluZ0NoYW5nZSBqb2IsIGJvb2xlYW4gbmVlZExpY2Vuc2VQYWdlKSB7DQotCQlzZXREaWFsb2dTZXR0aW5ncyhVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0RGlhbG9nU2V0dGluZ3MoKSk7DQotCQlzZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihVcGRhdGVVSUltYWdlcy5ERVNDX0lOU1RBTExfV0laKTsNCi0JCXNldEZvcmNlUHJldmlvdXNBbmROZXh0QnV0dG9ucyh0cnVlKTsNCi0JCXNldE5lZWRzUHJvZ3Jlc3NNb25pdG9yKHRydWUpOw0KLQkJc2V0V2luZG93VGl0bGUoVXBkYXRlVUkuZ2V0U3RyaW5nKCJJbnN0YWxsV2l6YXJkLnd0aXRsZSIpKTsNCi0JCXRoaXMuam9iID0gam9iOw0KLQkJdGhpcy5uZWVkTGljZW5zZVBhZ2UgPSBuZWVkTGljZW5zZVBhZ2U7DQotCQlJRmVhdHVyZSBmZWF0dXJlID0gam9iLmdldEZlYXR1cmUoKTsNCi0JCXBhdGNoID0gVXBkYXRlVUkuaXNQYXRjaChmZWF0dXJlKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgYm9vbGVhbiBpc1N1Y2Nlc3NmdWxJbnN0YWxsKCkgew0KLQkJcmV0dXJuIHN1Y2Nlc3NmdWxJbnN0YWxsOw0KLQl9DQotDQotCS8qKg0KLQkgKiBAc2VlIFdpemFyZCNwZXJmb3JtRmluaXNoKCkNCi0JICovDQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7DQotCQlmaW5hbCBJQ29uZmlndXJlZFNpdGUgdGFyZ2V0U2l0ZSA9DQotCQkJKHRhcmdldFBhZ2UgPT0gbnVsbCkgPyBudWxsIDogdGFyZ2V0UGFnZS5nZXRUYXJnZXRTaXRlKCk7DQotCQlmaW5hbCBJRmVhdHVyZVJlZmVyZW5jZVtdIG9wdGlvbmFsRmVhdHVyZXMgPQ0KLQkJCShvcHRpb25hbEZlYXR1cmVzUGFnZSA9PSBudWxsKQ0KLQkJCQk/IG51bGwNCi0JCQkJOiBvcHRpb25hbEZlYXR1cmVzUGFnZS5nZXRDaGVja2VkT3B0aW9uYWxGZWF0dXJlcygpOw0KLQkJZmluYWwgT2JqZWN0W10gb3B0aW9uYWxFbGVtZW50cyA9DQotCQkJKG9wdGlvbmFsRmVhdHVyZXNQYWdlID09IG51bGwpDQotCQkJCT8gbnVsbA0KLQkJCQk6IG9wdGlvbmFsRmVhdHVyZXNQYWdlLmdldE9wdGlvbmFsRWxlbWVudHMoKTsNCi0JCWlmIChqb2IuZ2V0Sm9iVHlwZSgpID09IFBlbmRpbmdDaGFuZ2UuSU5TVEFMTCkgew0KLQkJCUFycmF5TGlzdCBjb25mbGljdHMgPQ0KLQkJCQlEdXBsaWNhdGVDb25mbGljdHNEaWFsb2cuY29tcHV0ZUR1cGxpY2F0ZUNvbmZsaWN0cygNCi0JCQkJCWpvYiwNCi0JCQkJCWNvbmZpZywNCi0JCQkJCXRhcmdldFNpdGUsDQotCQkJCQlvcHRpb25hbEZlYXR1cmVzKTsNCi0JCQlpZiAoY29uZmxpY3RzICE9IG51bGwpIHsNCi0JCQkJRHVwbGljYXRlQ29uZmxpY3RzRGlhbG9nIGRpYWxvZyA9DQotCQkJCQluZXcgRHVwbGljYXRlQ29uZmxpY3RzRGlhbG9nKGdldFNoZWxsKCksIGNvbmZsaWN0cyk7DQotCQkJCWlmIChkaWFsb2cub3BlbigpICE9IDApDQotCQkJCQlyZXR1cm4gZmFsc2U7DQotCQkJfQ0KLQkJfQ0KLQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wZXJhdGlvbiA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7DQotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikNCi0JCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gew0KLQkJCQl0cnkgew0KLQkJCQkJc3VjY2Vzc2Z1bEluc3RhbGwgPSBmYWxzZTsNCi0JCQkJCW1ha2VDb25maWd1cmF0aW9uQ3VycmVudChjb25maWcsIGpvYik7DQotCQkJCQlleGVjdXRlKA0KLQkJCQkJCXRhcmdldFNpdGUsDQotCQkJCQkJb3B0aW9uYWxFbGVtZW50cywNCi0JCQkJCQlvcHRpb25hbEZlYXR1cmVzLA0KLQkJCQkJCW1vbml0b3IpOw0KLQkJCQkJc2F2ZUxvY2FsU2l0ZSgpOw0KLQkJCQkJc3VjY2Vzc2Z1bEluc3RhbGwgPSB0cnVlOw0KLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsNCi0JCQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGUpOw0KLQkJCQl9IGZpbmFsbHkgew0KLQkJCQkJbW9uaXRvci5kb25lKCk7DQotCQkJCX0NCi0JCQl9DQotCQl9Ow0KLQkJdHJ5IHsNCi0JCQlnZXRDb250YWluZXIoKS5ydW4odHJ1ZSwgdHJ1ZSwgb3BlcmF0aW9uKTsNCi0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgew0KLQkJCVRocm93YWJsZSB0YXJnZXQgPSBlLmdldFRhcmdldEV4Y2VwdGlvbigpOw0KLQkJCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBJbnN0YWxsQWJvcnRlZEV4Y2VwdGlvbikgew0KLQkJCQkvLyBzaG91bGQgd2UgcmV2ZXJ0IHRvIHRoZSBwcmV2aW91cyBjb25maWd1cmF0aW9uPw0KLQkJCX0gZWxzZSB7DQotCQkJCVVwZGF0ZVVJLmxvZ0V4Y2VwdGlvbihlKTsNCi0JCQl9DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0JCXJldHVybiB0cnVlOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgew0KLQkJcmV2aWV3UGFnZSA9IG5ldyBSZXZpZXdQYWdlKGpvYik7DQotCQlhZGRQYWdlKHJldmlld1BhZ2UpOw0KLQ0KLQkJY29uZmlnID0gY3JlYXRlSW5zdGFsbENvbmZpZ3VyYXRpb24oKTsNCi0NCi0JCWlmIChqb2IuZ2V0Sm9iVHlwZSgpID09IFBlbmRpbmdDaGFuZ2UuSU5TVEFMTCkgew0KLQkJCWlmIChuZWVkTGljZW5zZVBhZ2UgJiYgVXBkYXRlTW9kZWwuaGFzTGljZW5zZShqb2IpKSB7DQotCQkJCWFkZFBhZ2UobmV3IExpY2Vuc2VQYWdlKGpvYikpOw0KLQkJCX0NCi0JCQlpZiAoVXBkYXRlTW9kZWwuaGFzT3B0aW9uYWxGZWF0dXJlcyhqb2IuZ2V0RmVhdHVyZSgpKSkgew0KLQkJCQlvcHRpb25hbEZlYXR1cmVzUGFnZSA9IG5ldyBPcHRpb25hbEZlYXR1cmVzUGFnZShqb2IsIGNvbmZpZyk7DQotCQkJCWFkZFBhZ2Uob3B0aW9uYWxGZWF0dXJlc1BhZ2UpOw0KLQkJCX0NCi0JCQl0YXJnZXRQYWdlID0gbmV3IFRhcmdldFBhZ2Uoam9iLCBjb25maWcpOw0KLQkJCWFkZFBhZ2UodGFyZ2V0UGFnZSk7DQotCQl9DQotCX0NCi0NCi0JcHVibGljIHN0YXRpYyBJSW5zdGFsbENvbmZpZ3VyYXRpb24gY3JlYXRlSW5zdGFsbENvbmZpZ3VyYXRpb24oKSB7DQotCQl0cnkgew0KLQkJCUlMb2NhbFNpdGUgbG9jYWxTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7DQotCQkJSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZyA9DQotCQkJCWxvY2FsU2l0ZS5jbG9uZUN1cnJlbnRDb25maWd1cmF0aW9uKCk7DQotCQkJY29uZmlnLnNldExhYmVsKFV0aWxpdGllcy5mb3JtYXQoY29uZmlnLmdldENyZWF0aW9uRGF0ZSgpKSk7DQotCQkJcmV0dXJuIGNvbmZpZzsNCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgew0KLQkJCVVwZGF0ZVVJLmxvZ0V4Y2VwdGlvbihlKTsNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCX0NCi0JfQ0KLQ0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFrZUNvbmZpZ3VyYXRpb25DdXJyZW50KElJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcsIFBlbmRpbmdDaGFuZ2Ugam9iKQ0KLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJSUxvY2FsU2l0ZSBsb2NhbFNpdGUgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsNCi0JCWlmIChqb2IhPW51bGwgJiYgam9iLmdldEpvYlR5cGUoKT09UGVuZGluZ0NoYW5nZS5JTlNUQUxMKSB7DQotCQkJaWYgKGpvYi5nZXRGZWF0dXJlKCkuaXNQYXRjaCgpKSB7DQotCQkJCS8vIEluc3RhbGxpbmcgYSBwYXRjaCAtIHByZXNlcnZlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24NCi0JCQkJSUluc3RhbGxDb25maWd1cmF0aW9uIGNjb25maWcgPSBsb2NhbFNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKTsNCi0JCQkJSUluc3RhbGxDb25maWd1cmF0aW9uIHNhdmVkQ29uZmlnID0gbG9jYWxTaXRlLmFkZFRvUHJlc2VydmVkQ29uZmlndXJhdGlvbnMoY2NvbmZpZyk7DQotCQkJCVZlcnNpb25lZElkZW50aWZpZXIgdmlkID0gam9iLmdldEZlYXR1cmUoKS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7DQotCQkJCVN0cmluZyBrZXkgPSAiQCIrdmlkLmdldElkZW50aWZpZXIoKSsiXyIrdmlkLmdldFZlcnNpb24oKTsNCi0JCQkJU3RyaW5nIG5ld0xhYmVsID0gVXBkYXRlVUkuZ2V0Rm9ybWF0dGVkTWVzc2FnZShLRVlfU0FWRURfQ09ORklHLCBrZXkpOw0KLQkJCQlzYXZlZENvbmZpZy5zZXRMYWJlbChuZXdMYWJlbCk7DQotCQkJCVVwZGF0ZU1vZGVsIG1vZGVsID0gVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldFVwZGF0ZU1vZGVsKCk7DQotCQkJCW1vZGVsLmZpcmVPYmplY3RDaGFuZ2VkKHNhdmVkQ29uZmlnLCBudWxsKTsNCi0JCQl9DQotCQl9DQotCQlsb2NhbFNpdGUuYWRkQ29uZmlndXJhdGlvbihjb25maWcpOw0KLQl9DQotDQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzYXZlTG9jYWxTaXRlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJSUxvY2FsU2l0ZSBsb2NhbFNpdGUgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsNCi0JCWxvY2FsU2l0ZS5zYXZlKCk7DQotCX0NCi0NCi0JcHVibGljIGJvb2xlYW4gY2FuRmluaXNoKCkgew0KLQkJSVdpemFyZFBhZ2UgcGFnZSA9IGdldENvbnRhaW5lcigpLmdldEN1cnJlbnRQYWdlKCk7DQotCQlyZXR1cm4gcGFnZS5nZXROZXh0UGFnZSgpID09IG51bGwgJiYgc3VwZXIuY2FuRmluaXNoKCk7DQotCX0NCi0NCi0JcHVibGljIElXaXphcmRQYWdlIGdldFByZXZpb3VzUGFnZShJV2l6YXJkUGFnZSBwYWdlKSB7DQotCQlyZXR1cm4gc3VwZXIuZ2V0UHJldmlvdXNQYWdlKHBhZ2UpOw0KLQl9DQotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZShJV2l6YXJkUGFnZSBwYWdlKSB7DQotCQlyZXR1cm4gc3VwZXIuZ2V0TmV4dFBhZ2UocGFnZSk7DQotCX0NCi0JLyoNCi0JICogV2hlbiB3ZSBhcmUgdW5pbnN0YWxsaW5nLCB0aGVyZSBpcyBubyB0YXJnZXRTaXRlDQotCSAqLw0KLQlwcml2YXRlIHZvaWQgZXhlY3V0ZSgNCi0JCUlDb25maWd1cmVkU2l0ZSB0YXJnZXRTaXRlLA0KLQkJT2JqZWN0W10gb3B0aW9uYWxFbGVtZW50cywNCi0JCUlGZWF0dXJlUmVmZXJlbmNlW10gb3B0aW9uYWxGZWF0dXJlcywNCi0JCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikNCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCUlGZWF0dXJlIGZlYXR1cmUgPSBqb2IuZ2V0RmVhdHVyZSgpOw0KLQkJaWYgKGpvYi5nZXRKb2JUeXBlKCkgPT0gUGVuZGluZ0NoYW5nZS5VTklOU1RBTEwpIHsNCi0JCQkvL2ZpbmQgdGhlICBjb25maWcgc2l0ZSBvZiB0aGlzIGZlYXR1cmUNCi0JCQlJQ29uZmlndXJlZFNpdGUgc2l0ZSA9IGZpbmRDb25maWdTaXRlKGZlYXR1cmUsIGNvbmZpZyk7DQotCQkJaWYgKHNpdGUgIT0gbnVsbCkgew0KLQkJCQlzaXRlLnJlbW92ZShmZWF0dXJlLCBtb25pdG9yKTsNCi0JCQl9IGVsc2Ugew0KLQkJCQkvLyB3ZSBzaG91bGQgZG8gc29tZXRoaW5nIGhlcmUNCi0JCQkJdGhyb3dFcnJvcihVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX1VOQUJMRSkpOw0KLQkJCX0NCi0JCX0gZWxzZSBpZiAoam9iLmdldEpvYlR5cGUoKSA9PSBQZW5kaW5nQ2hhbmdlLklOU1RBTEwpIHsNCi0JCQlpZiAob3B0aW9uYWxGZWF0dXJlcyA9PSBudWxsKQ0KLQkJCQl0YXJnZXRTaXRlLmluc3RhbGwoZmVhdHVyZSwgZ2V0VmVyaWZpY2F0aW9uTGlzdGVuZXIoKSwgbW9uaXRvcik7DQotCQkJZWxzZQ0KLQkJCQl0YXJnZXRTaXRlLmluc3RhbGwoDQotCQkJCQlmZWF0dXJlLA0KLQkJCQkJb3B0aW9uYWxGZWF0dXJlcywNCi0JCQkJCWdldFZlcmlmaWNhdGlvbkxpc3RlbmVyKCksDQotCQkJCQltb25pdG9yKTsNCi0JCQlJRmVhdHVyZSBvbGRGZWF0dXJlID0gam9iLmdldE9sZEZlYXR1cmUoKTsNCi0JCQlpZiAob2xkRmVhdHVyZSAhPSBudWxsICYmICFqb2IuaXNPcHRpb25hbERlbHRhKCkpIHsNCi0JCQkJaWYgKG9wdGlvbmFsRWxlbWVudHMgIT0gbnVsbCkNCi0JCQkJCXByZXNlcnZlT3B0aW9uYWxTdGF0ZShjb25maWcsIHRhcmdldFNpdGUsIHBhdGNoLCBvcHRpb25hbEVsZW1lbnRzKTsNCi0JCQkJYm9vbGVhbiBvbGRTdWNjZXNzID0gdW5jb25maWd1cmUoY29uZmlnLCBvbGRGZWF0dXJlKTsNCi0JCQkJaWYgKCFvbGRTdWNjZXNzKSB7DQotCQkJCQlpZiAoIWlzTmVzdGVkQ2hpbGQob2xkRmVhdHVyZSkpDQotCQkJCQkJLy8gImVhdCIgdGhlIGVycm9yIGlmIG5lc3RlZCBjaGlsZA0KLQkJCQkJCXRocm93RXJyb3IoVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9PTEQpKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCQlpZiAob2xkRmVhdHVyZSA9PSBudWxsKSB7DQotCQkJCWVuc3VyZVVuaXF1ZShjb25maWcsIGZlYXR1cmUsIHRhcmdldFNpdGUpOw0KLQkJCQlpZiAob3B0aW9uYWxGZWF0dXJlcyAhPSBudWxsKSB7DQotCQkJCQlwcmVzZXJ2ZU9yaWdpbmF0aW5nVVJMcyhmZWF0dXJlLCBvcHRpb25hbEZlYXR1cmVzKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0gZWxzZSBpZiAoam9iLmdldEpvYlR5cGUoKSA9PSBQZW5kaW5nQ2hhbmdlLkNPTkZJR1VSRSkgew0KLQkJCWNvbmZpZ3VyZShmZWF0dXJlKTsNCi0JCQllbnN1cmVVbmlxdWUoY29uZmlnLCBmZWF0dXJlLCB0YXJnZXRTaXRlKTsNCi0JCX0gZWxzZSBpZiAoam9iLmdldEpvYlR5cGUoKSA9PSBQZW5kaW5nQ2hhbmdlLlVOQ09ORklHVVJFKSB7DQotCQkJdW5jb25maWd1cmUoY29uZmlnLCBqb2IuZ2V0RmVhdHVyZSgpKTsNCi0JCX0gZWxzZSB7DQotCQkJLy8gc2hvdWxkIG5vdCBiZSBoZXJlDQotCQkJcmV0dXJuOw0KLQkJfQ0KLQkJVXBkYXRlTW9kZWwgbW9kZWwgPSBVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0VXBkYXRlTW9kZWwoKTsNCi0JCW1vZGVsLmFkZFBlbmRpbmdDaGFuZ2Uoam9iKTsNCi0JfQ0KLQ0KLQlzdGF0aWMgdm9pZCBlbnN1cmVVbmlxdWUoDQotCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnLA0KLQkJSUZlYXR1cmUgZmVhdHVyZSwNCi0JCUlDb25maWd1cmVkU2l0ZSB0YXJnZXRTaXRlKQ0KLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJYm9vbGVhbiBwYXRjaCA9IGZhbHNlOw0KLQkJaWYgKHRhcmdldFNpdGU9PW51bGwpDQotCQkJdGFyZ2V0U2l0ZSA9IGZlYXR1cmUuZ2V0U2l0ZSgpLmdldEN1cnJlbnRDb25maWd1cmVkU2l0ZSgpOw0KLQkJSUltcG9ydFtdIGltcG9ydHMgPSBmZWF0dXJlLmdldEltcG9ydHMoKTsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW1wb3J0cy5sZW5ndGg7IGkrKykgew0KLQkJCUlJbXBvcnQgaWltcG9ydCA9IGltcG9ydHNbaV07DQotCQkJaWYgKGlpbXBvcnQuaXNQYXRjaCgpKSB7DQotCQkJCXBhdGNoID0gdHJ1ZTsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJfQ0KLQkJLy8gT25seSBuZWVkIHRvIGNoZWNrIGZlYXR1cmVzIHRoYXQgcGF0Y2ggb3RoZXIgZmVhdHVyZXMuDQotCQlpZiAoIXBhdGNoKQ0KLQkJCXJldHVybjsNCi0JCUlGZWF0dXJlIGxvY2FsRmVhdHVyZSA9IGZpbmRMb2NhbEZlYXR1cmUodGFyZ2V0U2l0ZSwgZmVhdHVyZSk7DQotCQlBcnJheUxpc3Qgb2xkRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7DQotCQkvLyBGaXJzdCBjb2xsZWN0IGFsbCBvbGRlciBhY3RpdmUgZmVhdHVyZXMgdGhhdA0KLQkJLy8gaGF2ZSB0aGUgc2FtZSBJRCBhcyBuZXcgZmVhdHVyZXMgbWFya2VkIGFzICd1bmlxdWUnLg0KLQkJY29sbGVjdE9sZEZlYXR1cmVzKGxvY2FsRmVhdHVyZSwgdGFyZ2V0U2l0ZSwgb2xkRmVhdHVyZXMpOw0KLQkJLy8gTm93IHVuY29uZmlndXJlIG9sZCBmZWF0dXJlcyB0byBlbmZvcmNlIHVuaXF1ZW5lc3MNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgb2xkRmVhdHVyZXMuc2l6ZSgpOyBpKyspIHsNCi0JCQlJRmVhdHVyZSBvbGRGZWF0dXJlID0gKElGZWF0dXJlKSBvbGRGZWF0dXJlcy5nZXQoaSk7DQotCQkJdW5jb25maWd1cmUoY29uZmlnLCBvbGRGZWF0dXJlKTsNCi0JCX0NCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgdGhyb3dFcnJvcihTdHJpbmcgbWVzc2FnZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJSVN0YXR1cyBzdGF0dXMgPQ0KLQkJCW5ldyBTdGF0dXMoDQotCQkJCUlTdGF0dXMuRVJST1IsDQotCQkJCVVwZGF0ZVVJLmdldFBsdWdpbklkKCksDQotCQkJCUlTdGF0dXMuT0ssDQotCQkJCW1lc3NhZ2UsDQotCQkJCW51bGwpOw0KLQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzKTsNCi0JfQ0KLQ0KLQlzdGF0aWMgSUNvbmZpZ3VyZWRTaXRlIGZpbmRDb25maWdTaXRlKA0KLQkJSUZlYXR1cmUgZmVhdHVyZSwNCi0JCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcpDQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlJQ29uZmlndXJlZFNpdGVbXSBjb25maWdTaXRlcyA9IGNvbmZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKTsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlnU2l0ZXMubGVuZ3RoOyBpKyspIHsNCi0JCQlJQ29uZmlndXJlZFNpdGUgc2l0ZSA9IGNvbmZpZ1NpdGVzW2ldOw0KLQkJCWlmIChzaXRlLmdldFNpdGUoKS5lcXVhbHMoZmVhdHVyZS5nZXRTaXRlKCkpKSB7DQotCQkJCXJldHVybiBzaXRlOw0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gdW5jb25maWd1cmUoDQotCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnLA0KLQkJSUZlYXR1cmUgZmVhdHVyZSkNCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCUlDb25maWd1cmVkU2l0ZSBzaXRlID0gZmluZENvbmZpZ1NpdGUoZmVhdHVyZSwgY29uZmlnKTsNCi0JCWlmIChzaXRlICE9IG51bGwpIHsNCi0JCQlQYXRjaENsZWFuZXIgY2xlYW5lciA9IG5ldyBQYXRjaENsZWFuZXIoc2l0ZSwgZmVhdHVyZSk7DQotCQkJYm9vbGVhbiByZXN1bHQgPSBzaXRlLnVuY29uZmlndXJlKGZlYXR1cmUpOw0KLQkJCWNsZWFuZXIuZGlzcG9zZSgpOw0KLQkJCXJldHVybiByZXN1bHQ7DQotCQl9DQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIGNvbmZpZ3VyZShJRmVhdHVyZSBmZWF0dXJlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlJQ29uZmlndXJlZFNpdGUgc2l0ZSA9IGZpbmRDb25maWdTaXRlKGZlYXR1cmUsIGNvbmZpZyk7DQotCQlpZiAoc2l0ZSAhPSBudWxsKSB7DQotCQkJc2l0ZS5jb25maWd1cmUoZmVhdHVyZSk7DQotCQl9DQotCX0NCi0NCi0JcHJpdmF0ZSBJVmVyaWZpY2F0aW9uTGlzdGVuZXIgZ2V0VmVyaWZpY2F0aW9uTGlzdGVuZXIoKSB7DQotCQlyZXR1cm4gbmV3IEphclZlcmlmaWNhdGlvblNlcnZpY2UodGhpcy5nZXRTaGVsbCgpKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIGJvb2xlYW4gaXNOZXN0ZWRDaGlsZChJRmVhdHVyZSBmZWF0dXJlKSB7DQotCQlJQ29uZmlndXJlZFNpdGVbXSBjc2l0ZXMgPSBjb25maWcuZ2V0Q29uZmlndXJlZFNpdGVzKCk7DQotCQl0cnkgew0KLQkJCWZvciAoaW50IGkgPSAwOyBjc2l0ZXMgIT0gbnVsbCAmJiBpIDwgY3NpdGVzLmxlbmd0aDsgaSsrKSB7DQotCQkJCUlGZWF0dXJlUmVmZXJlbmNlW10gcmVmcyA9IGNzaXRlc1tpXS5nZXRDb25maWd1cmVkRmVhdHVyZXMoKTsNCi0JCQkJZm9yIChpbnQgaiA9IDA7IHJlZnMgIT0gbnVsbCAmJiBqIDwgcmVmcy5sZW5ndGg7IGorKykgew0KLQkJCQkJSUZlYXR1cmUgcGFyZW50ID0gcmVmc1tqXS5nZXRGZWF0dXJlKG51bGwpOw0KLQkJCQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBjaGlsZHJlbiA9DQotCQkJCQkJcGFyZW50LmdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKTsNCi0JCQkJCWZvciAoaW50IGsgPSAwOw0KLQkJCQkJCWNoaWxkcmVuICE9IG51bGwgJiYgayA8IGNoaWxkcmVuLmxlbmd0aDsNCi0JCQkJCQlrKyspIHsNCi0JCQkJCQlJRmVhdHVyZSBjaGlsZCA9IGNoaWxkcmVuW2tdLmdldEZlYXR1cmUobnVsbCk7DQotCQkJCQkJaWYgKGZlYXR1cmUuZXF1YWxzKGNoaWxkKSkNCi0JCQkJCQkJcmV0dXJuIHRydWU7DQotCQkJCQl9DQotCQkJCX0NCi0JCQl9DQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsNCi0JCQkvLyB3aWxsIHJldHVybiBmYWxzZQ0KLQkJfQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotDQotCXN0YXRpYyB2b2lkIHByZXNlcnZlT3B0aW9uYWxTdGF0ZSgNCi0JCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcsDQotCQlJQ29uZmlndXJlZFNpdGUgdGFyZ2V0U2l0ZSwNCi0JCWJvb2xlYW4gcGF0Y2gsDQotCQlPYmplY3RbXSBvcHRpb25hbEVsZW1lbnRzKSB7DQotCQlmb3IgKGludCBpID0gMDsgaSA8IG9wdGlvbmFsRWxlbWVudHMubGVuZ3RoOyBpKyspIHsNCi0JCQlGZWF0dXJlSGllcmFyY2h5RWxlbWVudCBmZSA9DQotCQkJCShGZWF0dXJlSGllcmFyY2h5RWxlbWVudCkgb3B0aW9uYWxFbGVtZW50c1tpXTsNCi0JCQlPYmplY3RbXSBjaGlsZHJlbiA9IGZlLmdldENoaWxkcmVuKHRydWUsIHBhdGNoLCBjb25maWcpOw0KLQkJCXByZXNlcnZlT3B0aW9uYWxTdGF0ZShjb25maWcsIHRhcmdldFNpdGUsIHBhdGNoLCBjaGlsZHJlbik7DQotCQkJaWYgKCFmZS5pc0VuYWJsZWQoY29uZmlnKSkgew0KLQkJCQlJRmVhdHVyZSBuZXdGZWF0dXJlID0gZmUuZ2V0RmVhdHVyZSgpOw0KLQkJCQl0cnkgew0KLQkJCQkJSUZlYXR1cmUgbG9jYWxGZWF0dXJlID0NCi0JCQkJCQlmaW5kTG9jYWxGZWF0dXJlKHRhcmdldFNpdGUsIG5ld0ZlYXR1cmUpOw0KLQkJCQkJaWYgKGxvY2FsRmVhdHVyZSAhPSBudWxsKQ0KLQkJCQkJCXRhcmdldFNpdGUudW5jb25maWd1cmUobG9jYWxGZWF0dXJlKTsNCi0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7DQotCQkJCQkvLyBFYXQgdGhpcyAtIHdlIHdpbGwgbGVhdmUgd2l0aCBpdA0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotCXN0YXRpYyB2b2lkIGNvbGxlY3RPbGRGZWF0dXJlcygNCi0JCUlGZWF0dXJlIGZlYXR1cmUsDQotCQlJQ29uZmlndXJlZFNpdGUgdGFyZ2V0U2l0ZSwNCi0JCUFycmF5TGlzdCByZXN1bHQpDQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlW10gaW5jbHVkZWQgPSBmZWF0dXJlLmdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKTsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW5jbHVkZWQubGVuZ3RoOyBpKyspIHsNCi0JCQlJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlIGlyZWYgPSBpbmNsdWRlZFtpXTsNCi0JCQkNCi0JCQlJRmVhdHVyZSBpZmVhdHVyZTsNCi0JCQkNCi0JCQl0cnkgew0KLQkJCQlpZmVhdHVyZSA9IGlyZWYuZ2V0RmVhdHVyZShudWxsKTsNCi0JCQl9DQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgew0KLQkJCQlpZiAoaXJlZi5pc09wdGlvbmFsKCkpIGNvbnRpbnVlOw0KLQkJCQl0aHJvdyBlOw0KLQkJCX0NCi0JCQkvLyBmaW5kIG90aGVyIGZlYXR1cmVzIGFuZCB1bmNvbmZpZ3VyZQ0KLQkJCVN0cmluZyBpZCA9IGlyZWYuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldElkZW50aWZpZXIoKTsNCi0JCQlJRmVhdHVyZVtdIHNhbWVJZHMgPQ0KLQkJCQlVcGRhdGVVSS5zZWFyY2hTaXRlKGlkLCB0YXJnZXRTaXRlLCB0cnVlKTsNCi0JCQlmb3IgKGludCBqID0gMDsgaiA8IHNhbWVJZHMubGVuZ3RoOyBqKyspIHsNCi0JCQkJSUZlYXR1cmUgc2FtZUlkID0gc2FtZUlkc1tqXTsNCi0JCQkJLy8gSWdub3JlIHNlbGYuDQotCQkJCWlmIChzYW1lSWQuZXF1YWxzKGlmZWF0dXJlKSkNCi0JCQkJCWNvbnRpbnVlOw0KLQkJCQlyZXN1bHQuYWRkKHNhbWVJZCk7DQotCQkJfQ0KLQkJCWNvbGxlY3RPbGRGZWF0dXJlcyhpZmVhdHVyZSwgdGFyZ2V0U2l0ZSwgcmVzdWx0KTsNCi0JCX0NCi0JfQ0KLQ0KLQlwcml2YXRlIHN0YXRpYyBJRmVhdHVyZSBmaW5kTG9jYWxGZWF0dXJlKA0KLQkJSUNvbmZpZ3VyZWRTaXRlIGNzaXRlLA0KLQkJSUZlYXR1cmUgZmVhdHVyZSkNCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCUlGZWF0dXJlUmVmZXJlbmNlW10gcmVmcyA9IGNzaXRlLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpOw0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZzLmxlbmd0aDsgaSsrKSB7DQotCQkJSUZlYXR1cmVSZWZlcmVuY2UgcmVmID0gcmVmc1tpXTsNCi0JCQlWZXJzaW9uZWRJZGVudGlmaWVyIHJlZlZpZCA9IHJlZi5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7DQotCQkJaWYgKGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmVxdWFscyhyZWZWaWQpKQ0KLQkJCQlyZXR1cm4gcmVmLmdldEZlYXR1cmUobnVsbCk7DQotCQl9DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgcHJlc2VydmVPcmlnaW5hdGluZ1VSTHMoDQotCQlJRmVhdHVyZSBmZWF0dXJlLA0KLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBvcHRpb25hbEZlYXR1cmVzKSB7DQotCQkvLyB3YWxrIHRoZSBoaWVhcmFyY2h5IGFuZCBwcmVzZXJ2ZSB0aGUgb3JpZ2luYXRpbmcgVVJMDQotCQkvLyBmb3IgYWxsIHRoZSBvcHRpb25hbCBmZWF0dXJlcyB0aGF0IGFyZSBub3QgY2hvc2VuIHRvDQotCQkvLyBiZSBpbnN0YWxsZWQuDQotCQlVUkwgdXJsID0gZmVhdHVyZS5nZXRTaXRlKCkuZ2V0VVJMKCk7DQotCQl0cnkgew0KLQkJCUlJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VbXSBpcmVmcyA9IGZlYXR1cmUuZ2V0SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpOw0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXJlZnMubGVuZ3RoOyBpKyspIHsNCi0JCQkJSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZSBpcmVmID0gaXJlZnNbaV07DQotCQkJCWJvb2xlYW4gcHJlc2VydmUgPSBmYWxzZTsNCi0JCQkJaWYgKGlyZWYuaXNPcHRpb25hbCgpKSB7DQotCQkJCQlib29sZWFuIG9uVGhlTGlzdCA9IGZhbHNlOw0KLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBvcHRpb25hbEZlYXR1cmVzLmxlbmd0aDsgaisrKSB7DQotCQkJCQkJaWYgKG9wdGlvbmFsRmVhdHVyZXNbal0uZXF1YWxzKGlyZWYpKSB7DQotCQkJCQkJCS8vd2FzIG9uIHRoZSBsaXN0DQotCQkJCQkJCW9uVGhlTGlzdCA9IHRydWU7DQotCQkJCQkJCWJyZWFrOw0KLQkJCQkJCX0NCi0JCQkJCX0NCi0JCQkJCWlmICghb25UaGVMaXN0KQ0KLQkJCQkJCXByZXNlcnZlID0gdHJ1ZTsNCi0JCQkJfQ0KLQkJCQlpZiAocHJlc2VydmUpIHsNCi0JCQkJCQlTdHJpbmcgaWQgPQ0KLQkJCQkJCQlpcmVmLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRJZGVudGlmaWVyKCk7DQotCQkJCQkJVXBkYXRlVUkuc2V0T3JpZ2luYXRpbmdVUkwoaWQsIHVybCk7DQotCQkJCX0gZWxzZSB7DQotCQkJCQl0cnkgew0KLQkJCQkJCUlGZWF0dXJlIGlmZWF0dXJlID0gaXJlZi5nZXRGZWF0dXJlKG51bGwpOw0KLQkJCQkJCXByZXNlcnZlT3JpZ2luYXRpbmdVUkxzKGlmZWF0dXJlLCBvcHRpb25hbEZlYXR1cmVzKTsNCi0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgew0KLQkJCQkJCS8vIFNpbGVudGx5IGlnbm9yZQ0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJfQ0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7DQotCQkJLy8gU2lsZW50bHkgaWdub3JlDQotCQl9DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvSW5zdGFsbFdpemFyZERpYWxvZy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvSW5zdGFsbFdpemFyZERpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGZhYzY4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL0luc3RhbGxXaXphcmREaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLio7DQotDQotcHVibGljIGNsYXNzIEluc3RhbGxXaXphcmREaWFsb2cgZXh0ZW5kcyBXaXphcmREaWFsb2cgew0KLQkNCi0JcHVibGljIEluc3RhbGxXaXphcmREaWFsb2coU2hlbGwgc2hlbGwsIElXaXphcmQgd2l6YXJkKSB7DQotCQlzdXBlcihzaGVsbCwgd2l6YXJkKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgY2FuY2VsKCkgew0KLQkJY2FuY2VsUHJlc3NlZCgpOw0KLQl9DQotfQ0KLQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL0xpY2Vuc2VQYWdlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9MaWNlbnNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGRmZjFhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL0xpY2Vuc2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLndpemFyZHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5Xb3JrYmVuY2hIZWxwOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbC5QZW5kaW5nQ2hhbmdlOw0KLQ0KLXB1YmxpYyBjbGFzcyBMaWNlbnNlUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgaW1wbGVtZW50cyBJRHluYW1pY1BhZ2Ugew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1RJVExFID0gIkluc3RhbGxXaXphcmQuTGljZW5zZVBhZ2UudGl0bGUiOyAvLyROT04tTkxTLTEkDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfREVTQyA9ICJJbnN0YWxsV2l6YXJkLkxpY2Vuc2VQYWdlLmRlc2MiOyAvLyROT04tTkxTLTEkDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfREVTQzIgPSAiSW5zdGFsbFdpemFyZC5MaWNlbnNlUGFnZS5kZXNjMiI7IC8vJE5PTi1OTFMtMSQNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9IRUFERVIgPSAiSW5zdGFsbFdpemFyZC5MaWNlbnNlUGFnZS5oZWFkZXIiOyAvLyROT04tTkxTLTEkDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQUNDRVBUID0gIkluc3RhbGxXaXphcmQuTGljZW5zZVBhZ2UuYWNjZXB0IjsgLy8kTk9OLU5MUy0xJA0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RFQ0xJTkUgPSAiSW5zdGFsbFdpemFyZC5MaWNlbnNlUGFnZS5kZWNsaW5lIjsgLy8kTk9OLU5MUy0xJA0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0FDQ0VQVDIgPSAiSW5zdGFsbFdpemFyZC5MaWNlbnNlUGFnZS5hY2NlcHQyIjsgLy8kTk9OLU5MUy0xJA0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RFQ0xJTkUyID0gIkluc3RhbGxXaXphcmQuTGljZW5zZVBhZ2UuZGVjbGluZTIiOyAvLyROT04tTkxTLTEkDQotCXByaXZhdGUgYm9vbGVhbiBtdWx0aUxpY2Vuc2VNb2RlID0gZmFsc2U7DQotCXByaXZhdGUgUGVuZGluZ0NoYW5nZVtdIGpvYnM7DQotCXByaXZhdGUgVGV4dCB0ZXh0Ow0KLQlwcml2YXRlIFRhYmxlIHRhYmxlOw0KLQ0KLQkvKioNCi0JICogQ29uc3RydWN0b3IgZm9yIExpY2Vuc2VQYWdlDQotCSAqLw0KLQlwdWJsaWMgTGljZW5zZVBhZ2UoYm9vbGVhbiBtdWx0aUxpY2Vuc2VNb2RlKSB7DQotCQlzdXBlcigiTGljZW5zZSIpOyAvLyROT04tTkxTLTEkDQotCQlzZXRUaXRsZShVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX1RJVExFKSk7DQotCQlzZXRQYWdlQ29tcGxldGUoZmFsc2UpOw0KLQkJdGhpcy5tdWx0aUxpY2Vuc2VNb2RlID0gbXVsdGlMaWNlbnNlTW9kZTsNCi0JCVVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRMYWJlbFByb3ZpZGVyKCkuY29ubmVjdCh0aGlzKTsNCi0JCXNldERlc2NyaXB0aW9uKA0KLQkJCVVwZGF0ZVVJLmdldFN0cmluZygNCi0JCQkJbXVsdGlMaWNlbnNlTW9kZSA/IEtFWV9ERVNDMiA6IEtFWV9ERVNDKSk7DQotCX0NCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsNCi0JCVVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRMYWJlbFByb3ZpZGVyKCkuZGlzY29ubmVjdCh0aGlzKTsNCi0JCXN1cGVyLmRpc3Bvc2UoKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgTGljZW5zZVBhZ2UoUGVuZGluZ0NoYW5nZSBqb2IpIHsNCi0JCXRoaXMoZmFsc2UpOw0KLQkJc2V0Sm9icyhuZXcgUGVuZGluZ0NoYW5nZVtdIHsgam9iIH0pOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHNldEpvYnMoUGVuZGluZ0NoYW5nZVtdIGpvYnMpIHsNCi0JCXRoaXMuam9icyA9IGpvYnM7DQotCX0NCi0NCi0JLyoqDQotCSAqIEBzZWUgRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkNCi0JICovDQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgew0KLQkJQ29tcG9zaXRlIGNsaWVudCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7DQotCQljbGllbnQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7DQotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7DQotCQljbGllbnQuc2V0TGF5b3V0KGxheW91dCk7DQotCQkNCi0JCVdvcmtiZW5jaEhlbHAuc2V0SGVscChjbGllbnQsICJvcmcuZWNsaXBzZS51cGRhdGUudWkuTGljZW5zZVBhZ2UiKTsNCi0NCi0JCWlmIChtdWx0aUxpY2Vuc2VNb2RlKSB7DQotCQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOw0KLQkJCWxheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSB0cnVlOw0KLQ0KLQkJCXRhYmxlID0gbmV3IFRhYmxlKGNsaWVudCwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7DQotDQotCQkJdGFibGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7DQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsNCi0JCQkJCWlmIChlLml0ZW0gIT0gbnVsbCkgew0KLQkJCQkJCU9iamVjdCBkYXRhID0gZS5pdGVtLmdldERhdGEoKTsNCi0JCQkJCQlpZiAoZGF0YSA9PSBudWxsKSB7DQotCQkJCQkJCXRleHQuc2V0VGV4dCgiIik7DQotCQkJCQkJfSBlbHNlIHsNCi0JCQkJCQkJdGV4dC5zZXRUZXh0KChTdHJpbmcpIGRhdGEpOw0KLQkJCQkJCX0NCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCX0pOw0KLQkJCUdyaWREYXRhIHRkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7DQotCQkJdGFibGUuc2V0TGF5b3V0RGF0YSh0ZCk7DQotCQl9DQotCQl0ZXh0ID0NCi0JCQluZXcgVGV4dCgNCi0JCQkJY2xpZW50LA0KLQkJCQlTV1QuTVVMVEkNCi0JCQkJCXwgU1dULkJPUkRFUg0KLQkJCQkJfCBTV1QuVl9TQ1JPTEwNCi0JCQkJCXwgU1dULkhfU0NST0xMDQotCQkJCQl8IFNXVC5SRUFEX09OTFkpOw0KLQ0KLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsNCi0JCWlmIChtdWx0aUxpY2Vuc2VNb2RlKQ0KLQkJCWdkLmhvcml6b250YWxTcGFuID0gMjsNCi0JCXRleHQuc2V0TGF5b3V0RGF0YShnZCk7DQotCQl0ZXh0LnNldEJhY2tncm91bmQoDQotCQkJdGV4dC5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfQkFDS0dST1VORCkpOw0KLQ0KLQkJQ29tcG9zaXRlIGJ1dHRvbkNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUoY2xpZW50LCBTV1QuTlVMTCk7DQotCQlHcmlkTGF5b3V0IGJ1dHRvbkxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7DQotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOw0KLQkJaWYgKG11bHRpTGljZW5zZU1vZGUpDQotCQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOw0KLQkJYnV0dG9uQ29udGFpbmVyLnNldExheW91dChidXR0b25MYXlvdXQpOw0KLQkJYnV0dG9uQ29udGFpbmVyLnNldExheW91dERhdGEoZ2QpOw0KLQ0KLQkJZmluYWwgQnV0dG9uIGFjY2VwdEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29udGFpbmVyLCBTV1QuUkFESU8pOw0KLQkJYWNjZXB0QnV0dG9uLnNldFRleHQoDQotCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKA0KLQkJCQltdWx0aUxpY2Vuc2VNb2RlID8gS0VZX0FDQ0VQVDIgOiBLRVlfQUNDRVBUKSk7DQotCQlhY2NlcHRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7DQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgew0KLQkJCQlzZXRQYWdlQ29tcGxldGUoYWNjZXB0QnV0dG9uLmdldFNlbGVjdGlvbigpKTsNCi0JCQl9DQotCQl9KTsNCi0JCUJ1dHRvbiBkZWNsaW5lQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db250YWluZXIsIFNXVC5SQURJTyk7DQotCQlkZWNsaW5lQnV0dG9uLnNldFRleHQoDQotCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKA0KLQkJCQltdWx0aUxpY2Vuc2VNb2RlID8gS0VZX0RFQ0xJTkUyIDogS0VZX0RFQ0xJTkUpKTsNCi0JCWRlY2xpbmVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7DQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgew0KLQkJCQlzZXRQYWdlQ29tcGxldGUoYWNjZXB0QnV0dG9uLmdldFNlbGVjdGlvbigpKTsNCi0JCQl9DQotCQl9KTsNCi0JCXNldENvbnRyb2woY2xpZW50KTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgeyAvLyBUTyBETzogT3B0aW1pemUgb3V0IHRoZSBjYXNlIHdoZXJlIGEgZmVhdHVyZSBkb2VzIG5vdCBoYXZlIGEgbGljZW5zZT8NCi0JCWlmICh2aXNpYmxlKSB7DQotCQkJaWYgKG11bHRpTGljZW5zZU1vZGUpIHsNCi0JCQkJVGFibGVJdGVtIGl0ZW07DQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgam9icy5sZW5ndGg7IGkrKykgew0KLQkJCQkJSUZlYXR1cmUgZmVhdHVyZSA9IGpvYnNbaV0uZ2V0RmVhdHVyZSgpOw0KLQkJCQkJaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsNCi0JCQkJCVN0cmluZyBsYWJlbCA9DQotCQkJCQkJZmVhdHVyZS5nZXRMYWJlbCgpDQotCQkJCQkJCSsgIiAiDQotCQkJCQkJCSsgZmVhdHVyZQ0KLQkJCQkJCQkJLmdldFZlcnNpb25lZElkZW50aWZpZXIoKQ0KLQkJCQkJCQkJLmdldFZlcnNpb24oKQ0KLQkJCQkJCQkJLnRvU3RyaW5nKCk7DQotCQkJCQlpdGVtLnNldFRleHQobGFiZWwpOw0KLQkJCQkJYm9vbGVhbiBlZml4ID0gZmVhdHVyZS5pc1BhdGNoKCk7DQotCQkJCQlpdGVtLnNldEltYWdlKA0KLQkJCQkJCVVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRMYWJlbFByb3ZpZGVyKCkuZ2V0KA0KLQkJCQkJCQllZml4DQotCQkJCQkJCQk/IFVwZGF0ZVVJSW1hZ2VzLkRFU0NfRUZJWF9PQkoNCi0JCQkJCQkJCTogVXBkYXRlVUlJbWFnZXMuREVTQ19GRUFUVVJFX09CSikpOw0KLQkJCQkJU3RyaW5nIGxpY2Vuc2UgPSBmZWF0dXJlLmdldExpY2Vuc2UoKS5nZXRBbm5vdGF0aW9uKCk7DQotCQkJCQkvLyBRdWVzdGlvbjogQ2FuIHRoaXMgZXZlciBiZSBudWxsPyBXaGF0IGlzIHRoZSBydW50aW1lIGNvc3Q/DQotCQkJCQlpdGVtLnNldERhdGEobGljZW5zZSk7DQotCQkJCX0NCi0NCi0JCQkJdGFibGUuc2V0U2VsZWN0aW9uKDApOw0KLQkJCX0NCi0JCQlzaG93TGljZW5zZVRleHQoKTsNCi0JCX0gZWxzZSB7DQotCQkJaWYgKG11bHRpTGljZW5zZU1vZGUpIHsNCi0JCQkJVGFibGVJdGVtIGl0ZW1zW10gPSB0YWJsZS5nZXRJdGVtcygpOw0KLQkJCQlmb3IgKGludCBpID0gaXRlbXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsNCi0JCQkJCXRhYmxlLmdldEl0ZW0oaSkuZGlzcG9zZSgpOw0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQkJc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgc2hvd0xpY2Vuc2VUZXh0KCkgew0KLQkJaWYgKCFtdWx0aUxpY2Vuc2VNb2RlKSB7DQotCQkJU3RyaW5nIGxpY2Vuc2UgPSBqb2JzWzBdLmdldEZlYXR1cmUoKS5nZXRMaWNlbnNlKCkuZ2V0QW5ub3RhdGlvbigpOw0KLQkJCXRleHQuc2V0VGV4dChsaWNlbnNlKTsNCi0JCQlyZXR1cm47DQotCQl9DQotCQlUYWJsZUl0ZW1bXSBzZWxlY3RlZEl0ZW1zID0gdGFibGUuZ2V0U2VsZWN0aW9uKCk7DQotCQlpZiAoc2VsZWN0ZWRJdGVtcy5sZW5ndGggPT0gMCkgew0KLQkJCXRleHQuc2V0VGV4dCgiIik7DQotCQl9IGVsc2Ugew0KLQkJCU9iamVjdCBkYXRhID0gc2VsZWN0ZWRJdGVtc1swXS5nZXREYXRhKCk7DQotCQkJaWYgKGRhdGEgPT0gbnVsbCkgew0KLQkJCQl0ZXh0LnNldFRleHQoIiIpOw0KLQkJCX0gZWxzZSB7DQotCQkJCXRleHQuc2V0VGV4dCgoU3RyaW5nKSBkYXRhKTsNCi0JCQl9DQotCQl9DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvTXVsdGlJbnN0YWxsV2l6YXJkLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9NdWx0aUluc3RhbGxXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY0Y2Q2ZS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9NdWx0aUluc3RhbGxXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC5JbnN0YWxsQWJvcnRlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuc2VjdXJpdHkuSmFyVmVyaWZpY2F0aW9uU2VydmljZTsKLQotcHVibGljIGNsYXNzIE11bHRpSW5zdGFsbFdpemFyZCBleHRlbmRzIFdpemFyZCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9VTkFCTEUgPSAiTXVsdGlJbnN0YWxsV2l6YXJkLmVycm9yLnVuYWJsZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9PTEQgPSAiTXVsdGlJbnN0YWxsV2l6YXJkLmVycm9yLm9sZCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9TQVZFRF9DT05GSUcgPQotCQkiTXVsdGlJbnN0YWxsV2l6YXJkLnNhdmVkQ29uZmlnIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0lOU1RBTExJTkcgPQotCQkiTXVsdGlJbnN0YWxsV2l6YXJkLmluc3RhbGxpbmciOwotCXByaXZhdGUgTXVsdGlSZXZpZXdQYWdlIHJldmlld1BhZ2U7Ci0JcHJpdmF0ZSBMaWNlbnNlUGFnZSBsaWNlbnNlUGFnZTsKLQlwcml2YXRlIE11bHRpT3B0aW9uYWxGZWF0dXJlc1BhZ2Ugb3B0aW9uYWxGZWF0dXJlc1BhZ2U7Ci0JcHJpdmF0ZSBNdWx0aVRhcmdldFBhZ2UgdGFyZ2V0UGFnZTsKLQlwcml2YXRlIFBlbmRpbmdDaGFuZ2VbXSBqb2JzOwotCXByaXZhdGUgSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZzsKLQlwcml2YXRlIGJvb2xlYW4gbmVlZExpY2Vuc2VQYWdlOwotCXByaXZhdGUgaW50IGluc3RhbGxDb3VudCA9IDA7Ci0KLQlwdWJsaWMgTXVsdGlJbnN0YWxsV2l6YXJkKFBlbmRpbmdDaGFuZ2VbXSBqb2JzKSB7Ci0JCXRoaXMoam9icywgdHJ1ZSk7Ci0JfQotCi0JcHVibGljIE11bHRpSW5zdGFsbFdpemFyZChQZW5kaW5nQ2hhbmdlW10gam9icywgYm9vbGVhbiBuZWVkTGljZW5zZVBhZ2UpIHsKLQkJc2V0RGlhbG9nU2V0dGluZ3MoVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldERpYWxvZ1NldHRpbmdzKCkpOwotCQlzZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihVcGRhdGVVSUltYWdlcy5ERVNDX0lOU1RBTExfV0laKTsKLQkJc2V0Rm9yY2VQcmV2aW91c0FuZE5leHRCdXR0b25zKHRydWUpOwotCQlzZXROZWVkc1Byb2dyZXNzTW9uaXRvcih0cnVlKTsKLQkJc2V0V2luZG93VGl0bGUoCi0JCQlVcGRhdGVVSS5nZXRTdHJpbmcoIk11bHRpSW5zdGFsbFdpemFyZC53dGl0bGUiKSk7Ci0JCXRoaXMuam9icyA9IGpvYnM7Ci0JCXRoaXMubmVlZExpY2Vuc2VQYWdlID0gbmVlZExpY2Vuc2VQYWdlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU3VjY2Vzc2Z1bEluc3RhbGwoKSB7Ci0JCXJldHVybiBpbnN0YWxsQ291bnQgPiAwOwotCX0KLQotCS8qKgotCSAqIEBzZWUgV2l6YXJkI3BlcmZvcm1GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCWZpbmFsIFBlbmRpbmdDaGFuZ2VbXSBzZWxlY3RlZEpvYnMgPSByZXZpZXdQYWdlLmdldFNlbGVjdGVkSm9icygpOwotCQlpbnN0YWxsQ291bnQgPSAwOwotCi0JCWlmICh0YXJnZXRQYWdlICE9IG51bGwpIHsKLQkJCS8vIENoZWNrIGZvciBkdXBsaWNhdGlvbiBjb25mbGljdHMKLQkJCUFycmF5TGlzdCBjb25mbGljdHMgPQotCQkJCUR1cGxpY2F0ZUNvbmZsaWN0c0RpYWxvZy5jb21wdXRlRHVwbGljYXRlQ29uZmxpY3RzKAotCQkJCQl0YXJnZXRQYWdlLmdldFRhcmdldFNpdGVzKCksCi0JCQkJCWNvbmZpZyk7Ci0JCQlpZiAoY29uZmxpY3RzICE9IG51bGwpIHsKLQkJCQlEdXBsaWNhdGVDb25mbGljdHNEaWFsb2cgZGlhbG9nID0KLQkJCQkJbmV3IER1cGxpY2F0ZUNvbmZsaWN0c0RpYWxvZyhnZXRTaGVsbCgpLCBjb25mbGljdHMpOwotCQkJCWlmIChkaWFsb2cub3BlbigpICE9IDApCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCS8vIG9rIHRvIGNvbnRpbnVlCQkKLQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wZXJhdGlvbiA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJCQl0cnkgewotCQkJCQlNdWx0aUluc3RhbGxXaXphcmQubWFrZUNvbmZpZ3VyYXRpb25DdXJyZW50KGNvbmZpZywgbnVsbCk7Ci0JCQkJCWV4ZWN1dGUoc2VsZWN0ZWRKb2JzLCBtb25pdG9yKTsKLQkJCQl9IGNhdGNoIChJbnN0YWxsQWJvcnRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGUpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQl0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihlKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCXRyeSB7Ci0JCQlnZXRDb250YWluZXIoKS5ydW4odHJ1ZSwgdHJ1ZSwgb3BlcmF0aW9uKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlUaHJvd2FibGUgdGFyZ2V0RXhjZXB0aW9uID0gZS5nZXRUYXJnZXRFeGNlcHRpb24oKTsKLQkJCWlmICh0YXJnZXRFeGNlcHRpb24gaW5zdGFuY2VvZiBJbnN0YWxsQWJvcnRlZEV4Y2VwdGlvbikgewotCQkJCXJldHVybiB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQlVcGRhdGVVSS5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIFdoZW4gd2UgYXJlIHVuaW5zdGFsbGluZywgdGhlcmUgaXMgbm90IHRhcmdldFNpdGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgZXhlY3V0ZSgKLQkJUGVuZGluZ0NoYW5nZVtdIHNlbGVjdGVkSm9icywKLQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQl0aHJvd3MgSW5zdGFsbEFib3J0ZWRFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQltb25pdG9yLmJlZ2luVGFzaygKLQkJCVVwZGF0ZVVJLmdldFN0cmluZyhLRVlfSU5TVEFMTElORyksCi0JCQlqb2JzLmxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0ZWRKb2JzLmxlbmd0aDsgaSsrKSB7Ci0JCQlQZW5kaW5nQ2hhbmdlIGpvYiA9IHNlbGVjdGVkSm9ic1tpXTsKLQkJCVN1YlByb2dyZXNzTW9uaXRvciBzdWJNb25pdG9yID0KLQkJCQluZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKAotCQkJCQltb25pdG9yLAotCQkJCQkxLAotCQkJCQlTdWJQcm9ncmVzc01vbml0b3IuUFJFUEVORF9NQUlOX0xBQkVMX1RPX1NVQlRBU0spOwotCQkJZXhlY3V0ZU9uZUpvYihqb2IsIHN1Yk1vbml0b3IpOwotCQkJLy9tb25pdG9yLndvcmtlZCgxKTsKLQkJCUluc3RhbGxXaXphcmQuc2F2ZUxvY2FsU2l0ZSgpOwotCQkJaW5zdGFsbENvdW50Kys7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJcmV2aWV3UGFnZSA9IG5ldyBNdWx0aVJldmlld1BhZ2Uoam9icyk7Ci0JCWFkZFBhZ2UocmV2aWV3UGFnZSk7Ci0KLQkJY29uZmlnID0gY3JlYXRlSW5zdGFsbENvbmZpZ3VyYXRpb24oKTsKLQkJYm9vbGVhbiBhZGRMaWNlbnNlUGFnZSA9IGZhbHNlOwotCQlib29sZWFuIGFkZE9wdGlvbmFsRmVhdHVyZXNQYWdlID0gZmFsc2U7Ci0JCWJvb2xlYW4gYWRkVGFyZ2V0UGFnZSA9IGZhbHNlOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgam9icy5sZW5ndGg7IGkrKykgewotCQkJUGVuZGluZ0NoYW5nZSBqb2IgPSBqb2JzW2ldOwotCi0JCQlpZiAoam9iLmdldEpvYlR5cGUoKSA9PSBQZW5kaW5nQ2hhbmdlLklOU1RBTEwpIHsKLQkJCQlpZiAobmVlZExpY2Vuc2VQYWdlICYmIFVwZGF0ZU1vZGVsLmhhc0xpY2Vuc2Uoam9iKSkgewotCQkJCQlhZGRMaWNlbnNlUGFnZSA9IHRydWU7Ci0JCQkJfQotCQkJCWlmIChVcGRhdGVNb2RlbC5oYXNPcHRpb25hbEZlYXR1cmVzKGpvYi5nZXRGZWF0dXJlKCkpKSB7Ci0JCQkJCWFkZE9wdGlvbmFsRmVhdHVyZXNQYWdlID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJYWRkVGFyZ2V0UGFnZSA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJaWYgKGFkZExpY2Vuc2VQYWdlKSB7Ci0JCQlsaWNlbnNlUGFnZSA9IG5ldyBMaWNlbnNlUGFnZSh0cnVlKTsKLQkJCWFkZFBhZ2UobGljZW5zZVBhZ2UpOwotCQl9Ci0JCWlmIChhZGRPcHRpb25hbEZlYXR1cmVzUGFnZSkgewotCQkJb3B0aW9uYWxGZWF0dXJlc1BhZ2UgPSBuZXcgTXVsdGlPcHRpb25hbEZlYXR1cmVzUGFnZShjb25maWcpOwotCQkJYWRkUGFnZShvcHRpb25hbEZlYXR1cmVzUGFnZSk7Ci0JCX0KLQkJaWYgKGFkZFRhcmdldFBhZ2UpIHsKLQkJCXRhcmdldFBhZ2UgPSBuZXcgTXVsdGlUYXJnZXRQYWdlKGNvbmZpZyk7Ci0JCQlhZGRQYWdlKHRhcmdldFBhZ2UpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzUGFnZVJlcXVpcmVkKElXaXphcmRQYWdlIHBhZ2UpIHsKLQkJaWYgKHBhZ2UuZXF1YWxzKGxpY2Vuc2VQYWdlKSkgewotCQkJcmV0dXJuIHJldmlld1BhZ2UuaGFzU2VsZWN0ZWRKb2JzV2l0aExpY2Vuc2VzKCk7Ci0JCX0KLQkJaWYgKHBhZ2UuZXF1YWxzKG9wdGlvbmFsRmVhdHVyZXNQYWdlKSkgewotCQkJcmV0dXJuIHJldmlld1BhZ2UuaGFzU2VsZWN0ZWRKb2JzV2l0aE9wdGlvbmFsRmVhdHVyZXMoKTsKLQkJfQotCQlpZiAocGFnZS5lcXVhbHModGFyZ2V0UGFnZSkpIHsKLQkJCXJldHVybiByZXZpZXdQYWdlLmhhc1NlbGVjdGVkSW5zdGFsbEpvYnMoKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0TmV4dFBhZ2UoSVdpemFyZFBhZ2UgcGFnZSkgewotCQlJV2l6YXJkUGFnZVtdIHBhZ2VzID0gZ2V0UGFnZXMoKTsKLQkJYm9vbGVhbiBzdGFydCA9IGZhbHNlOwotCQlJV2l6YXJkUGFnZSBuZXh0UGFnZSA9IG51bGw7Ci0KLQkJaWYgKHBhZ2UuZXF1YWxzKHJldmlld1BhZ2UpKSB7Ci0JCQl1cGRhdGVEeW5hbWljUGFnZXMoKTsKLQkJfQotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFnZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChwYWdlc1tpXS5lcXVhbHMocGFnZSkpIHsKLQkJCQlzdGFydCA9IHRydWU7Ci0JCQl9IGVsc2UgaWYgKHN0YXJ0KSB7Ci0JCQkJaWYgKGlzUGFnZVJlcXVpcmVkKHBhZ2VzW2ldKSkgewotCQkJCQluZXh0UGFnZSA9IHBhZ2VzW2ldOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5leHRQYWdlOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVEeW5hbWljUGFnZXMoKSB7Ci0JCWlmIChsaWNlbnNlUGFnZSAhPSBudWxsKSB7Ci0JCQlQZW5kaW5nQ2hhbmdlW10gbGljZW5zZUpvYnMgPQotCQkJCXJldmlld1BhZ2UuZ2V0U2VsZWN0ZWRKb2JzV2l0aExpY2Vuc2VzKCk7Ci0JCQlsaWNlbnNlUGFnZS5zZXRKb2JzKGxpY2Vuc2VKb2JzKTsKLQkJfQotCQlpZiAob3B0aW9uYWxGZWF0dXJlc1BhZ2UgIT0gbnVsbCkgewotCQkJUGVuZGluZ0NoYW5nZVtdIG9wdGlvbmFsSm9icyA9Ci0JCQkJcmV2aWV3UGFnZS5nZXRTZWxlY3RlZEpvYnNXaXRoT3B0aW9uYWxGZWF0dXJlcygpOwotCQkJb3B0aW9uYWxGZWF0dXJlc1BhZ2Uuc2V0Sm9icyhvcHRpb25hbEpvYnMpOwotCQl9Ci0JCWlmICh0YXJnZXRQYWdlICE9IG51bGwpIHsKLQkJCVBlbmRpbmdDaGFuZ2VbXSBpbnN0YWxsSm9icyA9IHJldmlld1BhZ2UuZ2V0U2VsZWN0ZWRJbnN0YWxsSm9icygpOwotCQkJdGFyZ2V0UGFnZS5zZXRKb2JzKGluc3RhbGxKb2JzKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUluc3RhbGxDb25maWd1cmF0aW9uIGNyZWF0ZUluc3RhbGxDb25maWd1cmF0aW9uKCkgewotCQl0cnkgewotCQkJSUxvY2FsU2l0ZSBsb2NhbFNpdGUgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsKLQkJCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcgPQotCQkJCWxvY2FsU2l0ZS5jbG9uZUN1cnJlbnRDb25maWd1cmF0aW9uKCk7Ci0JCQljb25maWcuc2V0TGFiZWwoVXRpbGl0aWVzLmZvcm1hdChjb25maWcuZ2V0Q3JlYXRpb25EYXRlKCkpKTsKLQkJCXJldHVybiBjb25maWc7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJVXBkYXRlVUkubG9nRXhjZXB0aW9uKGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFrZUNvbmZpZ3VyYXRpb25DdXJyZW50KAotCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnLAotCQlQZW5kaW5nQ2hhbmdlIGpvYikKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJTG9jYWxTaXRlIGxvY2FsU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpOwotCQlpZiAoam9iICE9IG51bGwgJiYgam9iLmdldEpvYlR5cGUoKSA9PSBQZW5kaW5nQ2hhbmdlLklOU1RBTEwpIHsKLQkJCWlmIChqb2IuZ2V0RmVhdHVyZSgpLmlzUGF0Y2goKSkgewotCQkJCS8vIEluc3RhbGxpbmcgYSBwYXRjaCAtIHByZXNlcnZlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24KLQkJCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY2NvbmZpZyA9Ci0JCQkJCWxvY2FsU2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpOwotCQkJCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBzYXZlZENvbmZpZyA9Ci0JCQkJCWxvY2FsU2l0ZS5hZGRUb1ByZXNlcnZlZENvbmZpZ3VyYXRpb25zKGNjb25maWcpOwotCQkJCVZlcnNpb25lZElkZW50aWZpZXIgdmlkID0KLQkJCQkJam9iLmdldEZlYXR1cmUoKS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7Ci0JCQkJU3RyaW5nIGtleSA9ICJAIiArIHZpZC5nZXRJZGVudGlmaWVyKCkgKyAiXyIgKyB2aWQuZ2V0VmVyc2lvbigpOwotCQkJCVN0cmluZyBuZXdMYWJlbCA9Ci0JCQkJCVVwZGF0ZVVJLmdldEZvcm1hdHRlZE1lc3NhZ2UoS0VZX1NBVkVEX0NPTkZJRywga2V5KTsKLQkJCQlzYXZlZENvbmZpZy5zZXRMYWJlbChuZXdMYWJlbCk7Ci0JCQkJVXBkYXRlTW9kZWwgbW9kZWwgPQotCQkJCQlVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0VXBkYXRlTW9kZWwoKTsKLQkJCQltb2RlbC5maXJlT2JqZWN0Q2hhbmdlZChzYXZlZENvbmZpZywgbnVsbCk7Ci0JCQl9Ci0JCX0KLQkJbG9jYWxTaXRlLmFkZENvbmZpZ3VyYXRpb24oY29uZmlnKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2F2ZUxvY2FsU2l0ZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSUxvY2FsU2l0ZSBsb2NhbFNpdGUgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsKLQkJbG9jYWxTaXRlLnNhdmUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5GaW5pc2goKSB7Ci0JCUlXaXphcmRQYWdlIHBhZ2UgPSBnZXRDb250YWluZXIoKS5nZXRDdXJyZW50UGFnZSgpOwotCQlyZXR1cm4gcGFnZS5nZXROZXh0UGFnZSgpID09IG51bGwgJiYgc3VwZXIuY2FuRmluaXNoKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGV4ZWN1dGVPbmVKb2IoUGVuZGluZ0NoYW5nZSBqb2IsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJQ29uZmlndXJlZFNpdGUgdGFyZ2V0U2l0ZSA9IG51bGw7Ci0JCU9iamVjdFtdIG9wdGlvbmFsRWxlbWVudHMgPSBudWxsOwotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIG9wdGlvbmFsRmVhdHVyZXMgPSBudWxsOwotCQlpZiAoam9iLmdldEpvYlR5cGUoKSA9PSBQZW5kaW5nQ2hhbmdlLklOU1RBTEwpIHsKLQkJCWlmIChvcHRpb25hbEZlYXR1cmVzUGFnZSAhPSBudWxsKSB7Ci0JCQkJb3B0aW9uYWxFbGVtZW50cyA9Ci0JCQkJCW9wdGlvbmFsRmVhdHVyZXNQYWdlLmdldE9wdGlvbmFsRWxlbWVudHMoam9iKTsKLQkJCQlvcHRpb25hbEZlYXR1cmVzID0KLQkJCQkJb3B0aW9uYWxGZWF0dXJlc1BhZ2UuZ2V0Q2hlY2tlZE9wdGlvbmFsRmVhdHVyZXMoam9iKTsKLQkJCX0KLQkJCWlmICh0YXJnZXRQYWdlICE9IG51bGwpIHsKLQkJCQl0YXJnZXRTaXRlID0gdGFyZ2V0UGFnZS5nZXRUYXJnZXRTaXRlKGpvYik7Ci0JCQl9Ci0JCX0KLQkJZXhlY3V0ZU9uZUpvYigKLQkJCWpvYiwKLQkJCXRhcmdldFNpdGUsCi0JCQlvcHRpb25hbEVsZW1lbnRzLAotCQkJb3B0aW9uYWxGZWF0dXJlcywKLQkJCW1vbml0b3IpOwotCX0KLQotCXByaXZhdGUgdm9pZCBleGVjdXRlT25lSm9iKAotCQlQZW5kaW5nQ2hhbmdlIGpvYiwKLQkJSUNvbmZpZ3VyZWRTaXRlIHRhcmdldFNpdGUsCi0JCU9iamVjdFtdIG9wdGlvbmFsRWxlbWVudHMsCi0JCUlGZWF0dXJlUmVmZXJlbmNlW10gb3B0aW9uYWxGZWF0dXJlcywKLQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJSUZlYXR1cmUgZmVhdHVyZSA9IGpvYi5nZXRGZWF0dXJlKCk7Ci0JCWlmIChqb2IuZ2V0Sm9iVHlwZSgpID09IFBlbmRpbmdDaGFuZ2UuVU5JTlNUQUxMKSB7Ci0JCQkvL2ZpbmQgdGhlICBjb25maWcgc2l0ZSBvZiB0aGlzIGZlYXR1cmUKLQkJCUlDb25maWd1cmVkU2l0ZSBzaXRlID0gZmluZENvbmZpZ1NpdGUoZmVhdHVyZSwgY29uZmlnKTsKLQkJCWlmIChzaXRlICE9IG51bGwpIHsKLQkJCQlzaXRlLnJlbW92ZShmZWF0dXJlLCBtb25pdG9yKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gd2Ugc2hvdWxkIGRvIHNvbWV0aGluZyBoZXJlCi0JCQkJdGhyb3dFcnJvcigKLQkJCQkJVXBkYXRlVUkuZ2V0Rm9ybWF0dGVkTWVzc2FnZSgKLQkJCQkJCUtFWV9VTkFCTEUsCi0JCQkJCQlmZWF0dXJlLmdldExhYmVsKCkpKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChqb2IuZ2V0Sm9iVHlwZSgpID09IFBlbmRpbmdDaGFuZ2UuSU5TVEFMTCkgewotCQkJaWYgKG9wdGlvbmFsRmVhdHVyZXMgPT0gbnVsbCkKLQkJCQl0YXJnZXRTaXRlLmluc3RhbGwoZmVhdHVyZSwgZ2V0VmVyaWZpY2F0aW9uTGlzdGVuZXIoKSwgbW9uaXRvcik7Ci0JCQllbHNlCi0JCQkJdGFyZ2V0U2l0ZS5pbnN0YWxsKAotCQkJCQlmZWF0dXJlLAotCQkJCQlvcHRpb25hbEZlYXR1cmVzLAotCQkJCQlnZXRWZXJpZmljYXRpb25MaXN0ZW5lcigpLAotCQkJCQltb25pdG9yKTsKLQkJCUlGZWF0dXJlIG9sZEZlYXR1cmUgPSBqb2IuZ2V0T2xkRmVhdHVyZSgpOwotCQkJaWYgKG9sZEZlYXR1cmUgIT0gbnVsbCAmJiAham9iLmlzT3B0aW9uYWxEZWx0YSgpKSB7Ci0JCQkJaWYgKG9wdGlvbmFsRWxlbWVudHMgIT0gbnVsbCkgewotCQkJCQlib29sZWFuIHBhdGNoID0gVXBkYXRlVUkuaXNQYXRjaChmZWF0dXJlKTsKLQkJCQkJcHJlc2VydmVPcHRpb25hbFN0YXRlKGNvbmZpZywgdGFyZ2V0U2l0ZSwgcGF0Y2gsIG9wdGlvbmFsRWxlbWVudHMpOwotCQkJCX0KLQkJCQlib29sZWFuIG9sZFN1Y2Nlc3MgPSB1bmNvbmZpZ3VyZShjb25maWcsIG9sZEZlYXR1cmUpOwotCQkJCWlmICghb2xkU3VjY2VzcykgewotCQkJCQlpZiAoIWlzTmVzdGVkQ2hpbGQob2xkRmVhdHVyZSkpCi0JCQkJCQkvLyAiZWF0IiB0aGUgZXJyb3IgaWYgbmVzdGVkIGNoaWxkCi0JCQkJCQl0aHJvd0Vycm9yKAotCQkJCQkJCVVwZGF0ZVVJLmdldEZvcm1hdHRlZE1lc3NhZ2UoCi0JCQkJCQkJCUtFWV9PTEQsCi0JCQkJCQkJCW9sZEZlYXR1cmUuZ2V0TGFiZWwoKSkpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChvbGRGZWF0dXJlID09IG51bGwpIHsKLQkJCQllbnN1cmVVbmlxdWUoY29uZmlnLCBmZWF0dXJlLCB0YXJnZXRTaXRlKTsKLQkJCQlpZiAob3B0aW9uYWxGZWF0dXJlcyAhPSBudWxsKSB7Ci0JCQkJCXByZXNlcnZlT3JpZ2luYXRpbmdVUkxzKGZlYXR1cmUsIG9wdGlvbmFsRmVhdHVyZXMpOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIGlmIChqb2IuZ2V0Sm9iVHlwZSgpID09IFBlbmRpbmdDaGFuZ2UuQ09ORklHVVJFKSB7Ci0JCQljb25maWd1cmUoZmVhdHVyZSk7Ci0JCQllbnN1cmVVbmlxdWUoY29uZmlnLCBmZWF0dXJlLCB0YXJnZXRTaXRlKTsKLQkJfSBlbHNlIGlmIChqb2IuZ2V0Sm9iVHlwZSgpID09IFBlbmRpbmdDaGFuZ2UuVU5DT05GSUdVUkUpIHsKLQkJCXVuY29uZmlndXJlKGNvbmZpZywgam9iLmdldEZlYXR1cmUoKSk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBzaG91bGQgbm90IGJlIGhlcmUKLQkJCXJldHVybjsKLQkJfQotCQlVcGRhdGVNb2RlbCBtb2RlbCA9IFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRVcGRhdGVNb2RlbCgpOwotCQlqb2IubWFya1Byb2Nlc3NlZCgpOwotCQltb2RlbC5maXJlT2JqZWN0Q2hhbmdlZChqb2IsIG51bGwpOwotCX0KLQotCXN0YXRpYyB2b2lkIGVuc3VyZVVuaXF1ZSgKLQkJSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZywKLQkJSUZlYXR1cmUgZmVhdHVyZSwKLQkJSUNvbmZpZ3VyZWRTaXRlIHRhcmdldFNpdGUpCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBwYXRjaCA9IGZhbHNlOwotCQlpZiAodGFyZ2V0U2l0ZSA9PSBudWxsKQotCQkJdGFyZ2V0U2l0ZSA9IGZlYXR1cmUuZ2V0U2l0ZSgpLmdldEN1cnJlbnRDb25maWd1cmVkU2l0ZSgpOwotCQlJSW1wb3J0W10gaW1wb3J0cyA9IGZlYXR1cmUuZ2V0SW1wb3J0cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGltcG9ydHMubGVuZ3RoOyBpKyspIHsKLQkJCUlJbXBvcnQgaWltcG9ydCA9IGltcG9ydHNbaV07Ci0JCQlpZiAoaWltcG9ydC5pc1BhdGNoKCkpIHsKLQkJCQlwYXRjaCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJLy8gT25seSBuZWVkIHRvIGNoZWNrIGZlYXR1cmVzIHRoYXQgcGF0Y2ggb3RoZXIgZmVhdHVyZXMuCi0JCWlmICghcGF0Y2gpCi0JCQlyZXR1cm47Ci0JCUlGZWF0dXJlIGxvY2FsRmVhdHVyZSA9IGZpbmRMb2NhbEZlYXR1cmUodGFyZ2V0U2l0ZSwgZmVhdHVyZSk7Ci0JCUFycmF5TGlzdCBvbGRGZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy8gRmlyc3QgY29sbGVjdCBhbGwgb2xkZXIgYWN0aXZlIGZlYXR1cmVzIHRoYXQKLQkJLy8gaGF2ZSB0aGUgc2FtZSBJRCBhcyBuZXcgZmVhdHVyZXMgbWFya2VkIGFzICd1bmlxdWUnLgotCQljb2xsZWN0T2xkRmVhdHVyZXMobG9jYWxGZWF0dXJlLCB0YXJnZXRTaXRlLCBvbGRGZWF0dXJlcyk7Ci0JCS8vIE5vdyB1bmNvbmZpZ3VyZSBvbGQgZmVhdHVyZXMgdG8gZW5mb3JjZSB1bmlxdWVuZXNzCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgb2xkRmVhdHVyZXMuc2l6ZSgpOyBpKyspIHsKLQkJCUlGZWF0dXJlIG9sZEZlYXR1cmUgPSAoSUZlYXR1cmUpIG9sZEZlYXR1cmVzLmdldChpKTsKLQkJCXVuY29uZmlndXJlKGNvbmZpZywgb2xkRmVhdHVyZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdGhyb3dFcnJvcihTdHJpbmcgbWVzc2FnZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJU3RhdHVzIHN0YXR1cyA9Ci0JCQluZXcgU3RhdHVzKAotCQkJCUlTdGF0dXMuRVJST1IsCi0JCQkJVXBkYXRlVUkuZ2V0UGx1Z2luSWQoKSwKLQkJCQlJU3RhdHVzLk9LLAotCQkJCW1lc3NhZ2UsCi0JCQkJbnVsbCk7Ci0JCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1cyk7Ci0JfQotCi0Jc3RhdGljIElDb25maWd1cmVkU2l0ZSBmaW5kQ29uZmlnU2l0ZSgKLQkJSUZlYXR1cmUgZmVhdHVyZSwKLQkJSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZykKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJQ29uZmlndXJlZFNpdGVbXSBjb25maWdTaXRlcyA9IGNvbmZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWdTaXRlcy5sZW5ndGg7IGkrKykgewotCQkJSUNvbmZpZ3VyZWRTaXRlIHNpdGUgPSBjb25maWdTaXRlc1tpXTsKLQkJCWlmIChzaXRlLmdldFNpdGUoKS5lcXVhbHMoZmVhdHVyZS5nZXRTaXRlKCkpKSB7Ci0JCQkJcmV0dXJuIHNpdGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiB1bmNvbmZpZ3VyZSgKLQkJSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZywKLQkJSUZlYXR1cmUgZmVhdHVyZSkKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJQ29uZmlndXJlZFNpdGUgc2l0ZSA9IGZpbmRDb25maWdTaXRlKGZlYXR1cmUsIGNvbmZpZyk7Ci0JCWlmIChzaXRlICE9IG51bGwpIHsKLQkJCVBhdGNoQ2xlYW5lciBjbGVhbmVyID0gbmV3IFBhdGNoQ2xlYW5lcihzaXRlLCBmZWF0dXJlKTsKLQkJCWJvb2xlYW4gcmVzdWx0ID0gc2l0ZS51bmNvbmZpZ3VyZShmZWF0dXJlKTsKLQkJCWNsZWFuZXIuZGlzcG9zZSgpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvbmZpZ3VyZShJRmVhdHVyZSBmZWF0dXJlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlDb25maWd1cmVkU2l0ZSBzaXRlID0gZmluZENvbmZpZ1NpdGUoZmVhdHVyZSwgY29uZmlnKTsKLQkJaWYgKHNpdGUgIT0gbnVsbCkgewotCQkJc2l0ZS5jb25maWd1cmUoZmVhdHVyZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIElWZXJpZmljYXRpb25MaXN0ZW5lciBnZXRWZXJpZmljYXRpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBKYXJWZXJpZmljYXRpb25TZXJ2aWNlKHRoaXMuZ2V0U2hlbGwoKSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzTmVzdGVkQ2hpbGQoSUZlYXR1cmUgZmVhdHVyZSkgewotCQlJQ29uZmlndXJlZFNpdGVbXSBjc2l0ZXMgPSBjb25maWcuZ2V0Q29uZmlndXJlZFNpdGVzKCk7Ci0JCXRyeSB7Ci0JCQlmb3IgKGludCBpID0gMDsgY3NpdGVzICE9IG51bGwgJiYgaSA8IGNzaXRlcy5sZW5ndGg7IGkrKykgewotCQkJCUlGZWF0dXJlUmVmZXJlbmNlW10gcmVmcyA9IGNzaXRlc1tpXS5nZXRDb25maWd1cmVkRmVhdHVyZXMoKTsKLQkJCQlmb3IgKGludCBqID0gMDsgcmVmcyAhPSBudWxsICYmIGogPCByZWZzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCUlGZWF0dXJlIHBhcmVudCA9IHJlZnNbal0uZ2V0RmVhdHVyZShudWxsKTsKLQkJCQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBjaGlsZHJlbiA9Ci0JCQkJCQlwYXJlbnQuZ2V0SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpOwotCQkJCQlmb3IgKGludCBrID0gMDsKLQkJCQkJCWNoaWxkcmVuICE9IG51bGwgJiYgayA8IGNoaWxkcmVuLmxlbmd0aDsKLQkJCQkJCWsrKykgewotCQkJCQkJSUZlYXR1cmUgY2hpbGQgPSBjaGlsZHJlbltrXS5nZXRGZWF0dXJlKG51bGwpOwotCQkJCQkJaWYgKGZlYXR1cmUuZXF1YWxzKGNoaWxkKSkKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyB3aWxsIHJldHVybiBmYWxzZQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlzdGF0aWMgdm9pZCBwcmVzZXJ2ZU9wdGlvbmFsU3RhdGUoCi0JCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcsCi0JCUlDb25maWd1cmVkU2l0ZSB0YXJnZXRTaXRlLAotCQlib29sZWFuIHBhdGNoLAotCQlPYmplY3RbXSBvcHRpb25hbEVsZW1lbnRzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgb3B0aW9uYWxFbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJRmVhdHVyZUhpZXJhcmNoeUVsZW1lbnQgZmUgPQotCQkJCShGZWF0dXJlSGllcmFyY2h5RWxlbWVudCkgb3B0aW9uYWxFbGVtZW50c1tpXTsKLQkJCU9iamVjdFtdIGNoaWxkcmVuID0gZmUuZ2V0Q2hpbGRyZW4odHJ1ZSwgcGF0Y2gsIGNvbmZpZyk7Ci0JCQlwcmVzZXJ2ZU9wdGlvbmFsU3RhdGUoY29uZmlnLCB0YXJnZXRTaXRlLCBwYXRjaCwgY2hpbGRyZW4pOwotCQkJaWYgKCFmZS5pc0VuYWJsZWQoY29uZmlnKSkgewotCQkJCUlGZWF0dXJlIG5ld0ZlYXR1cmUgPSBmZS5nZXRGZWF0dXJlKCk7Ci0JCQkJdHJ5IHsKLQkJCQkJSUZlYXR1cmUgbG9jYWxGZWF0dXJlID0KLQkJCQkJCWZpbmRMb2NhbEZlYXR1cmUodGFyZ2V0U2l0ZSwgbmV3RmVhdHVyZSk7Ci0JCQkJCWlmIChsb2NhbEZlYXR1cmUgIT0gbnVsbCkKLQkJCQkJCXRhcmdldFNpdGUudW5jb25maWd1cmUobG9jYWxGZWF0dXJlKTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gRWF0IHRoaXMgLSB3ZSB3aWxsIGxlYXZlIHdpdGggaXQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgdm9pZCBjb2xsZWN0T2xkRmVhdHVyZXMoCi0JCUlGZWF0dXJlIGZlYXR1cmUsCi0JCUlDb25maWd1cmVkU2l0ZSB0YXJnZXRTaXRlLAotCQlBcnJheUxpc3QgcmVzdWx0KQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VbXSBpbmNsdWRlZCA9IGZlYXR1cmUuZ2V0SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGluY2x1ZGVkLmxlbmd0aDsgaSsrKSB7Ci0JCQlJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlIGlyZWYgPSBpbmNsdWRlZFtpXTsKLQkJCQotCQkJSUZlYXR1cmUgaWZlYXR1cmU7Ci0JCQkKLQkJCXRyeSB7Ci0JCQkJaWZlYXR1cmUgPSBpcmVmLmdldEZlYXR1cmUobnVsbCk7Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJaWYgKGlyZWYuaXNPcHRpb25hbCgpKSBjb250aW51ZTsKLQkJCQl0aHJvdyBlOwotCQkJfQotCQkJLy8gZmluZCBvdGhlciBmZWF0dXJlcyBhbmQgdW5jb25maWd1cmUKLQkJCVN0cmluZyBpZCA9IGlyZWYuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldElkZW50aWZpZXIoKTsKLQkJCUlGZWF0dXJlW10gc2FtZUlkcyA9Ci0JCQkJVXBkYXRlVUkuc2VhcmNoU2l0ZShpZCwgdGFyZ2V0U2l0ZSwgdHJ1ZSk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IHNhbWVJZHMubGVuZ3RoOyBqKyspIHsKLQkJCQlJRmVhdHVyZSBzYW1lSWQgPSBzYW1lSWRzW2pdOwotCQkJCS8vIElnbm9yZSBzZWxmLgotCQkJCWlmIChzYW1lSWQuZXF1YWxzKGlmZWF0dXJlKSkKLQkJCQkJY29udGludWU7Ci0JCQkJcmVzdWx0LmFkZChzYW1lSWQpOwotCQkJfQotCQkJY29sbGVjdE9sZEZlYXR1cmVzKGlmZWF0dXJlLCB0YXJnZXRTaXRlLCByZXN1bHQpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSUZlYXR1cmUgZmluZExvY2FsRmVhdHVyZSgKLQkJSUNvbmZpZ3VyZWRTaXRlIGNzaXRlLAotCQlJRmVhdHVyZSBmZWF0dXJlKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlGZWF0dXJlUmVmZXJlbmNlW10gcmVmcyA9IGNzaXRlLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZnMubGVuZ3RoOyBpKyspIHsKLQkJCUlGZWF0dXJlUmVmZXJlbmNlIHJlZiA9IHJlZnNbaV07Ci0JCQlWZXJzaW9uZWRJZGVudGlmaWVyIHJlZlZpZCA9IHJlZi5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7Ci0JCQlpZiAoZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZXF1YWxzKHJlZlZpZCkpCi0JCQkJcmV0dXJuIHJlZi5nZXRGZWF0dXJlKG51bGwpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmVzZXJ2ZU9yaWdpbmF0aW5nVVJMcygKLQkJSUZlYXR1cmUgZmVhdHVyZSwKLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBvcHRpb25hbEZlYXR1cmVzKSB7Ci0JCS8vIHdhbGsgdGhlIGhpZWFyYXJjaHkgYW5kIHByZXNlcnZlIHRoZSBvcmlnaW5hdGluZyBVUkwKLQkJLy8gZm9yIGFsbCB0aGUgb3B0aW9uYWwgZmVhdHVyZXMgdGhhdCBhcmUgbm90IGNob3NlbiB0bwotCQkvLyBiZSBpbnN0YWxsZWQuCi0JCVVSTCB1cmwgPSBmZWF0dXJlLmdldFNpdGUoKS5nZXRVUkwoKTsKLQkJdHJ5IHsKLQkJCUlJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VbXSBpcmVmcyA9Ci0JCQkJZmVhdHVyZS5nZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGlyZWZzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZSBpcmVmID0gaXJlZnNbaV07Ci0JCQkJYm9vbGVhbiBwcmVzZXJ2ZSA9IGZhbHNlOwotCQkJCWlmIChpcmVmLmlzT3B0aW9uYWwoKSkgewotCQkJCQlib29sZWFuIG9uVGhlTGlzdCA9IGZhbHNlOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IG9wdGlvbmFsRmVhdHVyZXMubGVuZ3RoOyBqKyspIHsKLQkJCQkJCWlmIChvcHRpb25hbEZlYXR1cmVzW2pdLmVxdWFscyhpcmVmKSkgewotCQkJCQkJCS8vd2FzIG9uIHRoZSBsaXN0Ci0JCQkJCQkJb25UaGVMaXN0ID0gdHJ1ZTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoIW9uVGhlTGlzdCkKLQkJCQkJCXByZXNlcnZlID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJaWYgKHByZXNlcnZlKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlTdHJpbmcgaWQgPQotCQkJCQkJCWlyZWYuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldElkZW50aWZpZXIoKTsKLQkJCQkJCVVwZGF0ZVVJLnNldE9yaWdpbmF0aW5nVVJMKGlkLCB1cmwpOwotCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIFNpbGVudGx5IGlnbm9yZQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlGZWF0dXJlIGlmZWF0dXJlID0gaXJlZi5nZXRGZWF0dXJlKG51bGwpOwotCQkJCQkJcHJlc2VydmVPcmlnaW5hdGluZ1VSTHMoaWZlYXR1cmUsIG9wdGlvbmFsRmVhdHVyZXMpOwotCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIFNpbGVudGx5IGlnbm9yZQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFNpbGVudGx5IGlnbm9yZQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvTXVsdGlPcHRpb25hbEZlYXR1cmVzUGFnZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvTXVsdGlPcHRpb25hbEZlYXR1cmVzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjVhN2I0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL011bHRpT3B0aW9uYWxGZWF0dXJlc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLldvcmtiZW5jaEhlbHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uSUluc3RhbGxDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsLlBlbmRpbmdDaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnBhcnRzLio7Ci0KLXB1YmxpYyBjbGFzcyBNdWx0aU9wdGlvbmFsRmVhdHVyZXNQYWdlIGV4dGVuZHMgQmFubmVyUGFnZSBpbXBsZW1lbnRzIElEeW5hbWljUGFnZSB7Ci0JLy8gTkwga2V5cwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVElUTEUgPQotCQkiSW5zdGFsbFdpemFyZC5PcHRpb25hbEZlYXR1cmVzUGFnZS50aXRsZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ERVNDID0KLQkJIkluc3RhbGxXaXphcmQuT3B0aW9uYWxGZWF0dXJlc1BhZ2UuZGVzYyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9UUkVFX0xBQkVMID0KLQkJIkluc3RhbGxXaXphcmQuT3B0aW9uYWxGZWF0dXJlc1BhZ2UudHJlZUxhYmVsIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NFTEVDVF9BTEwgPQotCQkiSW5zdGFsbFdpemFyZC5PcHRpb25hbEZlYXR1cmVzUGFnZS5zZWxlY3RBbGwiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfREVTRUxFQ1RfQUxMID0KLQkJIkluc3RhbGxXaXphcmQuT3B0aW9uYWxGZWF0dXJlc1BhZ2UuZGVzZWxlY3RBbGwiOwotCXByaXZhdGUgQ2hlY2tib3hUcmVlVmlld2VyIHRyZWVWaWV3ZXI7Ci0JcHJpdmF0ZSBJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnOwotCXByaXZhdGUgSm9iUm9vdFtdIGpvYlJvb3RzOwotCXByaXZhdGUgSGFzaHRhYmxlIGVsZW1lbnRUYWJsZTsKLQotCWNsYXNzIEpvYlJvb3QgewotCQlwcml2YXRlIFBlbmRpbmdDaGFuZ2Ugam9iOwotCQlwcml2YXRlIE9iamVjdFtdIGVsZW1lbnRzOwotCQlwdWJsaWMgSm9iUm9vdChQZW5kaW5nQ2hhbmdlIGpvYikgewotCQkJdGhpcy5qb2IgPSBqb2I7Ci0JCX0KLQotCQlwdWJsaWMgUGVuZGluZ0NoYW5nZSBnZXRKb2IoKSB7Ci0JCQlyZXR1cm4gam9iOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKCkgewotCQkJaWYgKGVsZW1lbnRzID09IG51bGwpCi0JCQkJY29tcHV0ZUVsZW1lbnRzKCk7Ci0JCQlyZXR1cm4gZWxlbWVudHM7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgY29tcHV0ZUVsZW1lbnRzKCkgewotCQkJSUZlYXR1cmUgb2xkRmVhdHVyZSA9IGpvYi5nZXRPbGRGZWF0dXJlKCk7Ci0JCQlJRmVhdHVyZSBuZXdGZWF0dXJlID0gam9iLmdldEZlYXR1cmUoKTsKLQkJCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJYm9vbGVhbiBwYXRjaCA9IFVwZGF0ZVVJLmlzUGF0Y2gobmV3RmVhdHVyZSk7Ci0JCQlGZWF0dXJlSGllcmFyY2h5RWxlbWVudC5jb21wdXRlRWxlbWVudHMoCi0JCQkJb2xkRmVhdHVyZSwKLQkJCQluZXdGZWF0dXJlLAotCQkJCW9sZEZlYXR1cmUgIT0gbnVsbCwKLQkJCQlwYXRjaCwKLQkJCQljb25maWcsCi0JCQkJbGlzdCk7Ci0JCQllbGVtZW50cyA9IGxpc3QudG9BcnJheSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCUZlYXR1cmVIaWVyYXJjaHlFbGVtZW50IGVsZW1lbnQgPQotCQkJCQkoRmVhdHVyZUhpZXJhcmNoeUVsZW1lbnQpIGVsZW1lbnRzW2ldOwotCQkJCWVsZW1lbnQuc2V0Um9vdCh0aGlzKTsKLQkJCX0KLQkJfQotCX0KLQotCWNsYXNzIFRyZWVDb250ZW50UHJvdmlkZXIKLQkJZXh0ZW5kcyBEZWZhdWx0Q29udGVudFByb3ZpZGVyCi0JCWltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIgewotCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50KSB7Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgSm9iUm9vdCkgewotCQkJCXJldHVybiAoKEpvYlJvb3QpIHBhcmVudCkuZ2V0RWxlbWVudHMoKTsKLQkJCX0KLQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBGZWF0dXJlSGllcmFyY2h5RWxlbWVudCkgewotCQkJCUZlYXR1cmVIaWVyYXJjaHlFbGVtZW50IGZlID0gKEZlYXR1cmVIaWVyYXJjaHlFbGVtZW50KSBwYXJlbnQ7Ci0JCQkJT2JqZWN0IHJvb3QgPSBmZS5nZXRSb290KCk7Ci0JCQkJYm9vbGVhbiBvbGRGZWF0dXJlID0gZmFsc2U7Ci0JCQkJaWYgKHJvb3QgaW5zdGFuY2VvZiBKb2JSb290KSB7Ci0JCQkJCVBlbmRpbmdDaGFuZ2Ugam9iID0gKChKb2JSb290KXJvb3QpLmdldEpvYigpOwotCQkJCQlib29sZWFuIHBhdGNoID0gVXBkYXRlVUkuaXNQYXRjaChqb2IuZ2V0RmVhdHVyZSgpKTsKLQkJCQkJb2xkRmVhdHVyZSA9IGpvYi5nZXRPbGRGZWF0dXJlKCkgIT0gbnVsbDsKLQkJCQkJcmV0dXJuIGZlLmdldENoaWxkcmVuKG9sZEZlYXR1cmUsIHBhdGNoLCBjb25maWcpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGNoaWxkKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBwYXJlbnQpIHsKLQkJCXJldHVybiBnZXRDaGlsZHJlbihwYXJlbnQpLmxlbmd0aCA+IDA7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0KSB7Ci0JCQlpZiAoam9iUm9vdHMgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQkJCXJldHVybiBqb2JSb290czsKLQkJfQotCX0KLQotCWNsYXNzIFRyZWVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciB7Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqKSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgSm9iUm9vdCkgewotCQkJCUlGZWF0dXJlIGZlYXR1cmUgPSAoKEpvYlJvb3QpIG9iaikuZ2V0Sm9iKCkuZ2V0RmVhdHVyZSgpOwotCQkJCXJldHVybiBmZWF0dXJlLmdldExhYmVsKCkKLQkJCQkJKyAiICIKLQkJCQkJKyBmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRWZXJzaW9uKCkudG9TdHJpbmcoKTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBGZWF0dXJlSGllcmFyY2h5RWxlbWVudCkgewotCQkJCUZlYXR1cmVIaWVyYXJjaHlFbGVtZW50IGZlID0gKEZlYXR1cmVIaWVyYXJjaHlFbGVtZW50KSBvYmo7Ci0JCQkJU3RyaW5nIG5hbWUgPSBmZS5nZXRMYWJlbCgpOwotCQkJCWlmIChuYW1lICE9IG51bGwpCi0JCQkJCXJldHVybiBuYW1lOwotCQkJfQotCi0JCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChvYmopOwotCQl9Ci0JCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3Qgb2JqKSB7Ci0JCQlyZXR1cm4gVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKS5nZXQoCi0JCQkJVXBkYXRlVUlJbWFnZXMuREVTQ19GRUFUVVJFX09CSik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgUmV2aWV3UGFnZQotCSAqLwotCXB1YmxpYyBNdWx0aU9wdGlvbmFsRmVhdHVyZXNQYWdlKElJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJc3VwZXIoIk9wdGlvbmFsRmVhdHVyZXMiKTsKLQkJc2V0VGl0bGUoVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9USVRMRSkpOwotCQlzZXREZXNjcmlwdGlvbihVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX0RFU0MpKTsKLQkJdGhpcy5jb25maWcgPSBjb25maWc7Ci0JCVVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRMYWJlbFByb3ZpZGVyKCkuY29ubmVjdCh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRKb2JzKFBlbmRpbmdDaGFuZ2VbXSBqb2JzKSB7Ci0JCWpvYlJvb3RzID0gbmV3IEpvYlJvb3Rbam9icy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGpvYnMubGVuZ3RoOyBpKyspIHsKLQkJCWpvYlJvb3RzW2ldID0gbmV3IEpvYlJvb3Qoam9ic1tpXSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0TGFiZWxQcm92aWRlcigpLmRpc2Nvbm5lY3QodGhpcyk7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIERpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY2xpZW50ID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IGxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQljbGllbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWNyZWF0ZUNoZWNrYm94VHJlZVZpZXdlcihjbGllbnQpOwotCQlCdXR0b24gc2VsZWN0QWxsQnV0dG9uID0gbmV3IEJ1dHRvbihjbGllbnQsIFNXVC5QVVNIKTsKLQkJc2VsZWN0QWxsQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXNlbGVjdEFsbCh0cnVlKTsKLQkJCX0KLQkJfSk7Ci0JCXNlbGVjdEFsbEJ1dHRvbi5zZXRUZXh0KAotCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9TRUxFQ1RfQUxMKSk7Ci0JCUdyaWREYXRhIGdkID0KLQkJCW5ldyBHcmlkRGF0YSgKLQkJCQlHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwKLQkJCQkJfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpOwotCQlzZWxlY3RBbGxCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCVNXVFV0aWwuc2V0QnV0dG9uRGltZW5zaW9uSGludChzZWxlY3RBbGxCdXR0b24pOwotCi0JCUJ1dHRvbiBkZXNlbGVjdEFsbEJ1dHRvbiA9IG5ldyBCdXR0b24oY2xpZW50LCBTV1QuUFVTSCk7Ci0JCWRlc2VsZWN0QWxsQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXNlbGVjdEFsbChmYWxzZSk7Ci0JCQl9Ci0JCX0pOwotCQlkZXNlbGVjdEFsbEJ1dHRvbi5zZXRUZXh0KAotCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9ERVNFTEVDVF9BTEwpKTsKLQkJZ2QgPQotCQkJbmV3IEdyaWREYXRhKAotCQkJCUdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTAotCQkJCQl8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7Ci0JCWRlc2VsZWN0QWxsQnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQlTV1RVdGlsLnNldEJ1dHRvbkRpbWVuc2lvbkhpbnQoZGVzZWxlY3RBbGxCdXR0b24pOwotCQlXb3JrYmVuY2hIZWxwLnNldEhlbHAoY2xpZW50LCAib3JnLmVjbGlwc2UudXBkYXRlLnVpLk11bHRpT3B0aW9uYWxGZWF0dXJlc1BhZ2UiKTsKLQkJcmV0dXJuIGNsaWVudDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlQ2hlY2tib3hUcmVlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWxhYmVsLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9UUkVFX0xBQkVMKSk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXRyZWVWaWV3ZXIgPQotCQkJbmV3IENoZWNrYm94VHJlZVZpZXdlcigKLQkJCQlwYXJlbnQsCi0JCQkJU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWdkLnZlcnRpY2FsU3BhbiA9IDI7Ci0JCVRyZWUgdHJlZSA9IHRyZWVWaWV3ZXIuZ2V0VHJlZSgpOwotCQl0cmVlLnNldExheW91dERhdGEoZ2QpOwotCQl0cmVlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgVHJlZUNvbnRlbnRQcm92aWRlcigpKTsKLQkJdHJlZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBUcmVlTGFiZWxQcm92aWRlcigpKTsKLQkJdHJlZVZpZXdlci5hZGRDaGVja1N0YXRlTGlzdGVuZXIobmV3IElDaGVja1N0YXRlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGUpIHsKLQkJCQloYW5kbGVDaGVja2VkKGUuZ2V0RWxlbWVudCgpLCBlLmdldENoZWNrZWQoKSk7Ci0JCQl9Ci0JCX0pOwotCQl0cmVlVmlld2VyLnNldEF1dG9FeHBhbmRMZXZlbChBYnN0cmFjdFRyZWVWaWV3ZXIuQUxMX0xFVkVMUyk7Ci0JCXRyZWVWaWV3ZXIuc2V0SW5wdXQodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLQkJaWYgKHZpc2libGUpIHsKLQkJCXRyZWVWaWV3ZXIuc2V0SW5wdXQoam9iUm9vdHMpOwotCQkJaW5pdGlhbGl6ZVN0YXRlcygpOwotCQl9Ci0JCXN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7Ci0JCWlmICh2aXNpYmxlKSB7Ci0JCQl0cmVlVmlld2VyLmdldFRyZWUoKS5zZXRGb2N1cygpOwotCQl9CQkKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVN0YXRlcygpIHsKLQkJQXJyYXlMaXN0IGNoZWNrZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUFycmF5TGlzdCBncmF5ZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBqb2JSb290cy5sZW5ndGg7IGkrKykgewotCQkJSm9iUm9vdCBqb2JSb290ID0gam9iUm9vdHNbaV07Ci0JCQlQZW5kaW5nQ2hhbmdlIGpvYiA9IGpvYlJvb3QuZ2V0Sm9iKCk7Ci0JCQljaGVja2VkLmFkZChqb2JSb290KTsKLQkJCWdyYXllZC5hZGQoam9iUm9vdCk7Ci0JCQlib29sZWFuIHVwZGF0ZSA9IGpvYi5nZXRPbGRGZWF0dXJlKCkgIT0gbnVsbDsKLQkJCWluaXRpYWxpemVTdGF0ZXModXBkYXRlLCBqb2JSb290LmdldEVsZW1lbnRzKCksIGNoZWNrZWQsIGdyYXllZCk7Ci0JCX0KLQkJdHJlZVZpZXdlci5zZXRDaGVja2VkRWxlbWVudHMoY2hlY2tlZC50b0FycmF5KCkpOwotCQl0cmVlVmlld2VyLnNldEdyYXllZEVsZW1lbnRzKGdyYXllZC50b0FycmF5KCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplU3RhdGVzKAotCQlib29sZWFuIHVwZGF0ZSwKLQkJT2JqZWN0W10gZWxlbWVudHMsCi0JCUFycmF5TGlzdCBjaGVja2VkLAotCQlBcnJheUxpc3QgZ3JheWVkKSB7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJRmVhdHVyZUhpZXJhcmNoeUVsZW1lbnQgZWxlbWVudCA9Ci0JCQkJKEZlYXR1cmVIaWVyYXJjaHlFbGVtZW50KSBlbGVtZW50c1tpXTsKLQkJCWlmIChlbGVtZW50LmlzQ2hlY2tlZCgpKQotCQkJCWNoZWNrZWQuYWRkKGVsZW1lbnQpOwotCQkJaWYgKCFlbGVtZW50LmlzRWRpdGFibGUoKSkKLQkJCQlncmF5ZWQuYWRkKGVsZW1lbnQpOwotCQkJT2JqZWN0W10gY2hpbGRyZW4gPSBlbGVtZW50LmdldENoaWxkcmVuKCk7Ci0JCQlpbml0aWFsaXplU3RhdGVzKHVwZGF0ZSwgY2hpbGRyZW4sIGNoZWNrZWQsIGdyYXllZCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2VsZWN0QWxsKGJvb2xlYW4gdmFsdWUpIHsKLQkJQXJyYXlMaXN0IHNlbGVjdGVkID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgam9iUm9vdHMubGVuZ3RoOyBpKyspIHsKLQkJCUpvYlJvb3Qgam9iUm9vdCA9IGpvYlJvb3RzW2ldOwotCQkJUGVuZGluZ0NoYW5nZSBqb2IgPSBqb2JSb290LmdldEpvYigpOwotCQkJc2VsZWN0ZWQuYWRkKGpvYik7Ci0JCQlPYmplY3RbXSBlbGVtZW50cyA9IGpvYlJvb3QuZ2V0RWxlbWVudHMoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgZWxlbWVudHMubGVuZ3RoOyBqKyspIHsKLQkJCQlGZWF0dXJlSGllcmFyY2h5RWxlbWVudCBlbGVtZW50ID0KLQkJCQkJKEZlYXR1cmVIaWVyYXJjaHlFbGVtZW50KSBlbGVtZW50c1tqXTsKLQkJCQlzZWxlY3RBbGwoCi0JCQkJCWpvYi5nZXRPbGRGZWF0dXJlKCkgIT0gbnVsbCwKLQkJCQkJZWxlbWVudCwKLQkJCQkJc2VsZWN0ZWQsCi0JCQkJCXZhbHVlKTsKLQkJCX0KLQkJfQotCQl0cmVlVmlld2VyLnNldENoZWNrZWRFbGVtZW50cyhzZWxlY3RlZC50b0FycmF5KCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZWxlY3RBbGwoCi0JCWJvb2xlYW4gdXBkYXRlLAotCQlGZWF0dXJlSGllcmFyY2h5RWxlbWVudCByZWYsCi0JCUFycmF5TGlzdCBzZWxlY3RlZCwKLQkJYm9vbGVhbiB2YWx1ZSkgewotCi0JCWlmIChyZWYuaXNPcHRpb25hbCgpID09IGZhbHNlKQotCQkJc2VsZWN0ZWQuYWRkKHJlZik7Ci0JCWVsc2UgewotCQkJaWYgKHJlZi5pc0VkaXRhYmxlKCkpIHsKLQkJCQlyZWYuc2V0Q2hlY2tlZCh2YWx1ZSk7Ci0JCQkJaWYgKHZhbHVlKQotCQkJCQlzZWxlY3RlZC5hZGQocmVmKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHJlZi5pc0NoZWNrZWQoKSkKLQkJCQkJc2VsZWN0ZWQuYWRkKHJlZik7Ci0JCQl9Ci0JCX0KLQkJT2JqZWN0W10gaW5jbHVkZWQgPSByZWYuZ2V0Q2hpbGRyZW4oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmNsdWRlZC5sZW5ndGg7IGkrKykgewotCQkJRmVhdHVyZUhpZXJhcmNoeUVsZW1lbnQgZmUgPSAoRmVhdHVyZUhpZXJhcmNoeUVsZW1lbnQpIGluY2x1ZGVkW2ldOwotCQkJc2VsZWN0QWxsKHVwZGF0ZSwgZmUsIHNlbGVjdGVkLCB2YWx1ZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlQ2hlY2tlZChPYmplY3QgZWxlbWVudCwgYm9vbGVhbiBjaGVja2VkKSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSm9iUm9vdCkgewotCQkJdHJlZVZpZXdlci5zZXRDaGVja2VkKGVsZW1lbnQsICFjaGVja2VkKTsKLQkJCXJldHVybjsKLQkJfQotCQlGZWF0dXJlSGllcmFyY2h5RWxlbWVudCBmZSA9IChGZWF0dXJlSGllcmFyY2h5RWxlbWVudCkgZWxlbWVudDsKLQotCQlpZiAoIWZlLmlzRWRpdGFibGUoKSkKLQkJCXRyZWVWaWV3ZXIuc2V0Q2hlY2tlZChlbGVtZW50LCAhY2hlY2tlZCk7Ci0JCWVsc2UgewotCQkJLy8gdXBkYXRlIHRoZSByZXN1bHQKLQkJCWZlLnNldENoZWNrZWQoY2hlY2tlZCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIE9iamVjdCBbXSBnZXRPcHRpb25hbEVsZW1lbnRzKFBlbmRpbmdDaGFuZ2Ugam9iKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgam9iUm9vdHMubGVuZ3RoOyBpKyspIHsKLQkJCUpvYlJvb3Qgcm9vdCA9IGpvYlJvb3RzW2ldOwotCQkJUGVuZGluZ0NoYW5nZSBjdXJyID0gcm9vdC5nZXRKb2IoKTsKLQkJCWlmIChqb2IuZXF1YWxzKGN1cnIpKSB7Ci0JCQkJcmV0dXJuIHJvb3QuZ2V0RWxlbWVudHMoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIElGZWF0dXJlUmVmZXJlbmNlW10gZ2V0Q2hlY2tlZE9wdGlvbmFsRmVhdHVyZXMoUGVuZGluZ0NoYW5nZSBjdXJyZW50Sm9iKSB7Ci0JCUhhc2hTZXQgc2V0ID0gbmV3IEhhc2hTZXQoKTsKLQkJSm9iUm9vdCBqb2JSb290ID0gbnVsbDsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGpvYlJvb3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlKb2JSb290IHJvb3QgPSBqb2JSb290c1tpXTsKLQkJCVBlbmRpbmdDaGFuZ2Ugam9iID0gcm9vdC5nZXRKb2IoKTsKLQkJCWlmIChjdXJyZW50Sm9iLmVxdWFscyhqb2IpKSB7Ci0JCQkJam9iUm9vdCA9IHJvb3Q7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKGpvYlJvb3QgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgSUZlYXR1cmVSZWZlcmVuY2VbMF07Ci0KLQkJUGVuZGluZ0NoYW5nZSBqb2IgPSBqb2JSb290LmdldEpvYigpOwotCQlib29sZWFuIHVwZGF0ZSA9IGpvYi5nZXRPbGRGZWF0dXJlKCkgIT0gbnVsbDsKLQkJYm9vbGVhbiBwYXRjaCA9IFVwZGF0ZVVJLmlzUGF0Y2goam9iLmdldEZlYXR1cmUoKSk7Ci0JCU9iamVjdFtdIGVsZW1lbnRzID0gam9iUm9vdC5nZXRFbGVtZW50cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlGZWF0dXJlSGllcmFyY2h5RWxlbWVudCBlbGVtZW50ID0KLQkJCQkoRmVhdHVyZUhpZXJhcmNoeUVsZW1lbnQpIGVsZW1lbnRzW2ldOwotCQkJZWxlbWVudC5hZGRDaGVja2VkT3B0aW9uYWxGZWF0dXJlcyh1cGRhdGUsIHBhdGNoLCBjb25maWcsIHNldCk7Ci0JCX0KLQkJcmV0dXJuIChJRmVhdHVyZVJlZmVyZW5jZVtdKSBzZXQudG9BcnJheSgKLQkJCW5ldyBJRmVhdHVyZVJlZmVyZW5jZVtzZXQuc2l6ZSgpXSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvTXVsdGlSZXZpZXdQYWdlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9NdWx0aVJldmlld1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThiNzgxMC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9NdWx0aVJldmlld1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5Xb3JrYmVuY2hIZWxwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLmZvcm1zLkFjdGl2aXR5Q29uc3RyYWludHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnBhcnRzLio7Ci0KLXB1YmxpYyBjbGFzcyBNdWx0aVJldmlld1BhZ2UgZXh0ZW5kcyBCYW5uZXJQYWdlIHsKLQkvLyBOTCBrZXlzCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9USVRMRSA9Ci0JCSJNdWx0aUluc3RhbGxXaXphcmQuTXVsdGlSZXZpZXdQYWdlLnRpdGxlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RFU0MgPQotCQkiTXVsdGlJbnN0YWxsV2l6YXJkLk11bHRpUmV2aWV3UGFnZS5kZXNjIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NfVEFTSyA9Ci0JCSJNdWx0aUluc3RhbGxXaXphcmQuTXVsdGlSZXZpZXdQYWdlLmMudGFzayI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DX0ZFQVRVUkUgPQotCQkiTXVsdGlJbnN0YWxsV2l6YXJkLk11bHRpUmV2aWV3UGFnZS5jLmZlYXR1cmUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ19WRVJTSU9OID0KLQkJIk11bHRpSW5zdGFsbFdpemFyZC5NdWx0aVJldmlld1BhZ2UuYy52ZXJzaW9uIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NfUFJPVklERVIgPQotCQkiTXVsdGlJbnN0YWxsV2l6YXJkLk11bHRpUmV2aWV3UGFnZS5jLnByb3ZpZGVyIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPVU5URVIgPQotCQkiTXVsdGlJbnN0YWxsV2l6YXJkLk11bHRpUmV2aWV3UGFnZS5jb3VudGVyIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0ZJTFRFUl9DSEVDSyA9Ci0JCSJNdWx0aUluc3RhbGxXaXphcmQuTXVsdGlSZXZpZXdQYWdlLmZpbHRlckNoZWNrIjsKLQotCXByaXZhdGUgUGVuZGluZ0NoYW5nZVtdIGpvYnM7Ci0JcHJpdmF0ZSBMYWJlbCBjb3VudGVyTGFiZWw7Ci0JcHJpdmF0ZSBDaGVja2JveFRhYmxlVmlld2VyIHRhYmxlVmlld2VyOwotCXByaXZhdGUgSVN0YXR1cyB2YWxpZGF0aW9uU3RhdHVzOwotCXByaXZhdGUgQnV0dG9uIHN0YXR1c0J1dHRvbjsKLQlwcml2YXRlIEJ1dHRvbiBmaWx0ZXJDaGVjazsKLQlwcml2YXRlIENvbnRhaW5tZW50RmlsdGVyIGZpbHRlciA9IG5ldyBDb250YWlubWVudEZpbHRlcigpOwotCi0JY2xhc3MgSm9ic0NvbnRlbnRQcm92aWRlcgotCQlleHRlbmRzIERlZmF1bHRDb250ZW50UHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB7Ci0KLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCXJldHVybiBqb2JzOwotCQl9Ci0JfQotCi0JY2xhc3MgSm9ic0xhYmVsUHJvdmlkZXIKLQkJZXh0ZW5kcyBMYWJlbFByb3ZpZGVyCi0JCWltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqLCBpbnQgY29sdW1uKSB7Ci0JCQlQZW5kaW5nQ2hhbmdlIGpvYiA9IChQZW5kaW5nQ2hhbmdlKSBvYmo7Ci0JCQlJRmVhdHVyZSBmZWF0dXJlID0gam9iLmdldEZlYXR1cmUoKTsKLQotCQkJc3dpdGNoIChjb2x1bW4pIHsKLQkJCQljYXNlIDEgOgotCQkJCQlyZXR1cm4gZmVhdHVyZS5nZXRMYWJlbCgpOwotCQkJCWNhc2UgMiA6Ci0JCQkJCXJldHVybiBmZWF0dXJlCi0JCQkJCQkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpCi0JCQkJCQkuZ2V0VmVyc2lvbigpCi0JCQkJCQkudG9TdHJpbmcoKTsKLQkJCQljYXNlIDMgOgotCQkJCQlyZXR1cm4gZmVhdHVyZS5nZXRQcm92aWRlcigpOwotCQkJCWNhc2UgMCA6Ci0JCQkJCXJldHVybiBnZXRKb2JOYW1lKGpvYik7Ci0JCQl9Ci0JCQlyZXR1cm4gIiI7Ci0JCX0KLQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBvYmosIGludCBjb2x1bW4pIHsKLQkJCWlmIChjb2x1bW4gPT0gMSkgewotCQkJCVBlbmRpbmdDaGFuZ2Ugam9iID0gKFBlbmRpbmdDaGFuZ2UpIG9iajsKLQkJCQlJRmVhdHVyZSBmZWF0dXJlID0gam9iLmdldEZlYXR1cmUoKTsKLQkJCQlib29sZWFuIHBhdGNoID0gZmVhdHVyZS5pc1BhdGNoKCk7Ci0JCQkJVXBkYXRlTGFiZWxQcm92aWRlciBwcm92aWRlciA9Ci0JCQkJCVVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRMYWJlbFByb3ZpZGVyKCk7Ci0JCQkJaWYgKHBhdGNoKQotCQkJCQlyZXR1cm4gcHJvdmlkZXIuZ2V0KFVwZGF0ZVVJSW1hZ2VzLkRFU0NfRUZJWF9PQkopOwotCQkJCWVsc2UKLQkJCQkJcmV0dXJuIHByb3ZpZGVyLmdldChVcGRhdGVVSUltYWdlcy5ERVNDX0ZFQVRVUkVfT0JKKTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JY2xhc3MgQ29udGFpbm1lbnRGaWx0ZXIgZXh0ZW5kcyBWaWV3ZXJGaWx0ZXIgewotCQlwdWJsaWMgYm9vbGVhbiBzZWxlY3QoVmlld2VyIHYsIE9iamVjdCBwYXJlbnQsIE9iamVjdCBjaGlsZCkgewotCQkJcmV0dXJuICFpc0NvbnRhaW5lZCgoUGVuZGluZ0NoYW5nZSkgY2hpbGQpOwotCQl9Ci0JCXByaXZhdGUgYm9vbGVhbiBpc0NvbnRhaW5lZChQZW5kaW5nQ2hhbmdlIGpvYikgewotCQkJaWYgKGpvYi5nZXRKb2JUeXBlKCkgIT0gUGVuZGluZ0NoYW5nZS5JTlNUQUxMKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCVZlcnNpb25lZElkZW50aWZpZXIgdmlkID0gam9iLmdldEZlYXR1cmUoKS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7Ci0JCQlPYmplY3RbXSBzZWxlY3RlZCA9IHRhYmxlVmlld2VyLmdldENoZWNrZWRFbGVtZW50cygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3RlZC5sZW5ndGg7IGkrKykgewotCQkJCVBlbmRpbmdDaGFuZ2UgY2FuZGlkYXRlID0gKFBlbmRpbmdDaGFuZ2UpIHNlbGVjdGVkW2ldOwotCQkJCWlmIChjYW5kaWRhdGUuZXF1YWxzKGpvYikpCi0JCQkJCWNvbnRpbnVlOwotCQkJCUlGZWF0dXJlIGZlYXR1cmUgPSBjYW5kaWRhdGUuZ2V0RmVhdHVyZSgpOwotCQkJCWlmIChpbmNsdWRlcyhmZWF0dXJlLCB2aWQpKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlwcml2YXRlIGJvb2xlYW4gaW5jbHVkZXMoSUZlYXR1cmUgZmVhdHVyZSwgVmVyc2lvbmVkSWRlbnRpZmllciB2aWQpIHsKLQkJCXRyeSB7Ci0JCQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBpcmVmcyA9Ci0JCQkJCWZlYXR1cmUuZ2V0SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXJlZnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJSUZlYXR1cmVSZWZlcmVuY2UgaXJlZiA9IGlyZWZzW2ldOwotCQkJCQlJRmVhdHVyZSBpZmVhdHVyZSA9IGlyZWYuZ2V0RmVhdHVyZShudWxsKTsKLQkJCQkJVmVyc2lvbmVkSWRlbnRpZmllciBpdmlkID0KLQkJCQkJCWlmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKTsKLQkJCQkJaWYgKGl2aWQuZXF1YWxzKHZpZCkpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJaWYgKGluY2x1ZGVzKGlmZWF0dXJlLCB2aWQpKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgUmV2aWV3UGFnZQotCSAqLwotCXB1YmxpYyBNdWx0aVJldmlld1BhZ2UoUGVuZGluZ0NoYW5nZVtdIGpvYnMpIHsKLQkJc3VwZXIoIk11bHRpUmV2aWV3Iik7Ci0JCXNldFRpdGxlKFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfVElUTEUpKTsKLQkJc2V0RGVzY3JpcHRpb24oVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9ERVNDKSk7Ci0JCXRoaXMuam9icyA9IG9yZGVySm9icyhqb2JzKTsKLQkJVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKS5jb25uZWN0KHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCVVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRMYWJlbFByb3ZpZGVyKCkuZGlzY29ubmVjdCh0aGlzKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjbGllbnQgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWNsaWVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY2xpZW50LCBTV1QuTlVMTCk7Ci0JCWxhYmVsLnNldFRleHQoIiZZb3UgYXJlIGFib3V0IHRvIGV4ZWN1dGUgdGhlIGZvbGxvd2luZyB0YXNrczoiKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlDb250cm9sIHRhYmxlID0gY3JlYXRlVGFibGUoY2xpZW50KTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJQ29tcG9zaXRlIGJ1dHRvbkNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUoY2xpZW50LCBTV1QuTlVMTCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfVkVSVElDQUwpOwotCQlidXR0b25Db250YWluZXIuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlidXR0b25Db250YWluZXIuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29udGFpbmVyLCBTV1QuUFVTSCk7Ci0JCWJ1dHRvbi5zZXRUZXh0KCImU2VsZWN0IEFsbCIpOwotCQlnZCA9Ci0JCQluZXcgR3JpZERhdGEoCi0JCQkJR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMCi0JCQkJCXwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkJYnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQlTV1RVdGlsLnNldEJ1dHRvbkRpbWVuc2lvbkhpbnQoYnV0dG9uKTsKLQkJYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWhhbmRsZVNlbGVjdEFsbCh0cnVlKTsKLQkJCX0KLQkJfSk7Ci0KLQkJYnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db250YWluZXIsIFNXVC5QVVNIKTsKLQkJYnV0dG9uLnNldFRleHQoIiZEZXNlbGVjdCBBbGwiKTsKLQkJZ2QgPQotCQkJbmV3IEdyaWREYXRhKAotCQkJCUdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTAotCQkJCQl8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7Ci0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJU1dUVXRpbC5zZXRCdXR0b25EaW1lbnNpb25IaW50KGJ1dHRvbik7Ci0JCWJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQloYW5kbGVTZWxlY3RBbGwoZmFsc2UpOwotCQkJfQotCQl9KTsKLQotCQlzdGF0dXNCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbnRhaW5lciwgU1dULlBVU0gpOwotCQlzdGF0dXNCdXR0b24uc2V0VGV4dCgiJlNob3cgU3RhdHVzLi4uIik7Ci0JCWdkID0KLQkJCW5ldyBHcmlkRGF0YSgKLQkJCQlHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwKLQkJCQkJfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpOwotCQlzdGF0dXNCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCVNXVFV0aWwuc2V0QnV0dG9uRGltZW5zaW9uSGludChzdGF0dXNCdXR0b24pOwotCQlzdGF0dXNCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc2hvd1N0YXR1cygpOwotCQkJfQotCQl9KTsKLQotCQljb3VudGVyTGFiZWwgPSBuZXcgTGFiZWwoY2xpZW50LCBTV1QuTlVMTCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJY291bnRlckxhYmVsLnNldExheW91dERhdGEoZ2QpOwotCi0JCWZpbHRlckNoZWNrID0gbmV3IEJ1dHRvbihjbGllbnQsIFNXVC5DSEVDSyk7Ci0JCWZpbHRlckNoZWNrLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9GSUxURVJfQ0hFQ0spKTsKLQkJZmlsdGVyQ2hlY2suc2V0U2VsZWN0aW9uKHRydWUpOwotCQl0YWJsZVZpZXdlci5hZGRGaWx0ZXIoZmlsdGVyKTsKLQkJZmlsdGVyQ2hlY2suYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKGZpbHRlckNoZWNrLmdldFNlbGVjdGlvbigpKQotCQkJCQl0YWJsZVZpZXdlci5hZGRGaWx0ZXIoZmlsdGVyKTsKLQkJCQllbHNlCi0JCQkJCXRhYmxlVmlld2VyLnJlbW92ZUZpbHRlcihmaWx0ZXIpOwotCQkJCXBhZ2VDaGFuZ2VkKCk7Ci0JCQl9Ci0JCX0pOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWZpbHRlckNoZWNrLnNldExheW91dERhdGEoZ2QpOwotCQlwYWdlQ2hhbmdlZCgpOwotCi0JCVdvcmtiZW5jaEhlbHAuc2V0SGVscChjbGllbnQsICJvcmcuZWNsaXBzZS51cGRhdGUudWkuTXVsdGlSZXZpZXdQYWdlIik7Ci0JCXJldHVybiBjbGllbnQ7Ci0JfQotCi0JcHJpdmF0ZSBDb250cm9sIGNyZWF0ZVRhYmxlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGFibGVWaWV3ZXIgPQotCQkJQ2hlY2tib3hUYWJsZVZpZXdlci5uZXdDaGVja0xpc3QoCi0JCQkJcGFyZW50LAotCQkJCVNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQlUYWJsZSB0YWJsZSA9IHRhYmxlVmlld2VyLmdldFRhYmxlKCk7Ci0JCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0KLQkJVGFibGVDb2x1bW4gY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTlVMTCk7Ci0JCWNvbHVtbi5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfQ19UQVNLKSk7Ci0KLQkJY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTlVMTCk7Ci0JCWNvbHVtbi5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfQ19GRUFUVVJFKSk7Ci0KLQkJY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTlVMTCk7Ci0JCWNvbHVtbi5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfQ19WRVJTSU9OKSk7Ci0KLQkJY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTlVMTCk7Ci0JCWNvbHVtbi5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfQ19QUk9WSURFUikpOwotCi0JCVRhYmxlTGF5b3V0IGxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOwotCQlsYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSgzMCkpOwotCQlsYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSg4MCwgdHJ1ZSkpOwotCQlsYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSgzMCkpOwotCQlsYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSgxMDAsIHRydWUpKTsKLQotCQl0YWJsZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQl0YWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEpvYnNDb250ZW50UHJvdmlkZXIoKSk7Ci0JCXRhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEpvYnNMYWJlbFByb3ZpZGVyKCkpOwotCQl0YWJsZVZpZXdlci5hZGRDaGVja1N0YXRlTGlzdGVuZXIobmV3IElDaGVja1N0YXRlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJcGFnZUNoYW5nZWQoKTsKLQkJCX0KLQkJfSk7Ci0JCXRhYmxlVmlld2VyLnNldElucHV0KFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRVcGRhdGVNb2RlbCgpKTsKLQkJdGFibGVWaWV3ZXIuc2V0QWxsQ2hlY2tlZCh0cnVlKTsKLQkJcmV0dXJuIHRhYmxlOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldEpvYk5hbWUoUGVuZGluZ0NoYW5nZSBqb2IpIHsKLQkJc3dpdGNoIChqb2IuZ2V0Sm9iVHlwZSgpKSB7Ci0JCQljYXNlIFBlbmRpbmdDaGFuZ2UuSU5TVEFMTCA6Ci0JCQkJcmV0dXJuICJJbnN0YWxsIjsKLQkJCWNhc2UgUGVuZGluZ0NoYW5nZS5DT05GSUdVUkUgOgotCQkJCXJldHVybiAiRW5hYmxlIjsKLQkJCWNhc2UgUGVuZGluZ0NoYW5nZS5VTkNPTkZJR1VSRSA6Ci0JCQkJcmV0dXJuICJEaXNhYmxlIjsKLQkJCWNhc2UgUGVuZGluZ0NoYW5nZS5VTklOU1RBTEwgOgotCQkJCXJldHVybiAiVW5pbnN0YWxsIjsKLQkJfQotCQlyZXR1cm4gIj8iOwotCX0KLQotCXByaXZhdGUgdm9pZCBwYWdlQ2hhbmdlZCgpIHsKLQkJT2JqZWN0W10gY2hlY2tlZCA9IHRhYmxlVmlld2VyLmdldENoZWNrZWRFbGVtZW50cygpOwotCQlpbnQgdG90YWxDb3VudCA9IHRhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0SXRlbUNvdW50KCk7Ci0JCVN0cmluZyB0b3RhbCA9ICIiICsgdG90YWxDb3VudDsKLQkJU3RyaW5nIHNlbGVjdGVkID0gIiIgKyBjaGVja2VkLmxlbmd0aDsKLQkJY291bnRlckxhYmVsLnNldFRleHQoCi0JCQlVcGRhdGVVSS5nZXRGb3JtYXR0ZWRNZXNzYWdlKAotCQkJCUtFWV9DT1VOVEVSLAotCQkJCW5ldyBTdHJpbmdbXSB7IHNlbGVjdGVkLCB0b3RhbCB9KSk7Ci0JCWlmIChjaGVja2VkLmxlbmd0aCA+IDApIHsKLQkJCXZhbGlkYXRlU2VsZWN0aW9uKCk7Ci0JCX0gZWxzZSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQlzZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotCQkJdmFsaWRhdGlvblN0YXR1cyA9IG51bGw7Ci0JCX0KLQkJc3RhdHVzQnV0dG9uLnNldEVuYWJsZWQodmFsaWRhdGlvblN0YXR1cyAhPSBudWxsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlU2VsZWN0QWxsKGJvb2xlYW4gc2VsZWN0KSB7Ci0JCXRhYmxlVmlld2VyLnNldEFsbENoZWNrZWQoc2VsZWN0KTsKLQkJcGFnZUNoYW5nZWQoKTsKLQl9Ci0JCi0JUGVuZGluZ0NoYW5nZSBbXSBvcmRlckpvYnMoUGVuZGluZ0NoYW5nZSBbXSBqb2JzKSB7Ci0JCUFycmF5TGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCVBlbmRpbmdDaGFuZ2UgW10gaW5wdXQgPSBuZXcgUGVuZGluZ0NoYW5nZSBbam9icy5sZW5ndGhdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGpvYnMsIDAsIGlucHV0LCAwLCBqb2JzLmxlbmd0aCk7Ci0JCS8vQWRkIGpvYnMgdG8gdW5jb25maWd1cmUuCi0JCWFkZEpvYnMoaW5wdXQsIHJlc3VsdCwgUGVuZGluZ0NoYW5nZS5VTkNPTkZJR1VSRSwgZmFsc2UpOwotCQkvL0FkZCBqb2JzIHRvIGNvbmZpZ3VyZS4KLQkJYWRkSm9icyhpbnB1dCwgcmVzdWx0LCBQZW5kaW5nQ2hhbmdlLkNPTkZJR1VSRSwgZmFsc2UpOwotCQkvL0FkZCByZWd1bGFyIGZlYXR1cmUgaW5zdGFsbHMKLQkJYWRkSm9icyhpbnB1dCwgcmVzdWx0LCBQZW5kaW5nQ2hhbmdlLklOU1RBTEwsIGZhbHNlKTsKLQkJLy9BZGQgcGF0Y2ggaW5zdGFsbHMKLQkJYWRkSm9icyhpbnB1dCwgcmVzdWx0LCBQZW5kaW5nQ2hhbmdlLklOU1RBTEwsIHRydWUpOwotCQkvL0FkZCB0aGUgcmVtYWluZGVyIChvbmx5IHVuaW5zdGFsbHMpCi0JCWFkZEpvYnMoaW5wdXQsIHJlc3VsdCwgLTEsIGZhbHNlKTsKLQkJcmV0dXJuIChQZW5kaW5nQ2hhbmdlW10pcmVzdWx0LnRvQXJyYXkobmV3IFBlbmRpbmdDaGFuZ2VbcmVzdWx0LnNpemUoKV0pOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkSm9icyhQZW5kaW5nQ2hhbmdlIFtdIGlucHV0LCBBcnJheUxpc3QgcmVzdWx0LCBpbnQgdHlwZSwgYm9vbGVhbiBwYXRjaCkgewotCQlmb3IgKGludCBpPTA7IGk8aW5wdXQubGVuZ3RoOyBpKyspIHsKLQkJCVBlbmRpbmdDaGFuZ2Ugam9iID0gaW5wdXRbaV07Ci0JCQlpZiAoam9iPT1udWxsKSBjb250aW51ZTsKLQkJCWJvb2xlYW4gbWF0Y2g9ZmFsc2U7Ci0JCQlpZiAodHlwZSA9PSAtMSkgbWF0Y2ggPSB0cnVlOwotCQkJZWxzZSB7Ci0JCQkJaWYgKHR5cGU9PWpvYi5nZXRKb2JUeXBlKCkpIHsKLQkJCQkJaWYgKHR5cGU9PVBlbmRpbmdDaGFuZ2UuSU5TVEFMTCkgewotCQkJCQkJaWYgKGpvYi5nZXRGZWF0dXJlKCkuaXNQYXRjaCgpPT1wYXRjaCkKLQkJCQkJCQltYXRjaD10cnVlOwotCQkJCQl9Ci0JCQkJCWVsc2UgbWF0Y2g9dHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAobWF0Y2gpIHsKLQkJCQlyZXN1bHQuYWRkKGpvYik7Ci0JCQkJaW5wdXRbaV0gPSBudWxsOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIFBlbmRpbmdDaGFuZ2VbXSBnZXRTZWxlY3RlZEpvYnMoKSB7Ci0JCU9iamVjdFtdIHNlbGVjdGVkID0gdGFibGVWaWV3ZXIuZ2V0Q2hlY2tlZEVsZW1lbnRzKCk7Ci0JCVBlbmRpbmdDaGFuZ2VbXSBqb2JzID0gbmV3IFBlbmRpbmdDaGFuZ2Vbc2VsZWN0ZWQubGVuZ3RoXTsKLQkJU3lzdGVtLmFycmF5Y29weShzZWxlY3RlZCwgMCwgam9icywgMCwgc2VsZWN0ZWQubGVuZ3RoKTsKLQkJcmV0dXJuIGpvYnM7Ci0JfQotCi0JcHVibGljIHZvaWQgdmFsaWRhdGVTZWxlY3Rpb24oKSB7Ci0JCVBlbmRpbmdDaGFuZ2VbXSBqb2JzID0gZ2V0U2VsZWN0ZWRKb2JzKCk7Ci0JCXZhbGlkYXRpb25TdGF0dXMgPSBBY3Rpdml0eUNvbnN0cmFpbnRzLnZhbGlkYXRlUGVuZGluZ0NoYW5nZXMoam9icyk7Ci0JCXNldFBhZ2VDb21wbGV0ZSh2YWxpZGF0aW9uU3RhdHVzID09IG51bGwpOwotCQlTdHJpbmcgZXJyb3JNZXNzYWdlID0gbnVsbDsKLQotCQlpZiAodmFsaWRhdGlvblN0YXR1cyAhPSBudWxsKSB7Ci0JCQllcnJvck1lc3NhZ2UgPQotCQkJCSJJbnZhbGlkIGNvbWJpbmF0aW9uIC0gc2VsZWN0IFwiU2hvdyBTdGF0dXMuLi5cIiBmb3IgZGV0YWlscy4iOwotCQl9Ci0JCXNldEVycm9yTWVzc2FnZShlcnJvck1lc3NhZ2UpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzaG93U3RhdHVzKCkgewotCQlpZiAodmFsaWRhdGlvblN0YXR1cyAhPSBudWxsKSB7Ci0JCQlFcnJvckRpYWxvZy5vcGVuRXJyb3IoCi0JCQkJVXBkYXRlVUkuZ2V0QWN0aXZlV29ya2JlbmNoU2hlbGwoKSwKLQkJCQludWxsLAotCQkJCW51bGwsCi0JCQkJdmFsaWRhdGlvblN0YXR1cyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNTZWxlY3RlZEpvYnNXaXRoTGljZW5zZXMoKSB7Ci0JCU9iamVjdFtdIHNlbGVjdGVkID0gdGFibGVWaWV3ZXIuZ2V0Q2hlY2tlZEVsZW1lbnRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0ZWQubGVuZ3RoOyBpKyspIHsKLQkJCVBlbmRpbmdDaGFuZ2Ugam9iID0gKFBlbmRpbmdDaGFuZ2UpIHNlbGVjdGVkW2ldOwotCQkJaWYgKGpvYi5nZXRKb2JUeXBlKCkgIT0gUGVuZGluZ0NoYW5nZS5JTlNUQUxMKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKFVwZGF0ZU1vZGVsLmhhc0xpY2Vuc2Uoam9iKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzU2VsZWN0ZWRKb2JzV2l0aE9wdGlvbmFsRmVhdHVyZXMoKSB7Ci0JCU9iamVjdFtdIHNlbGVjdGVkID0gdGFibGVWaWV3ZXIuZ2V0Q2hlY2tlZEVsZW1lbnRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0ZWQubGVuZ3RoOyBpKyspIHsKLQkJCVBlbmRpbmdDaGFuZ2Ugam9iID0gKFBlbmRpbmdDaGFuZ2UpIHNlbGVjdGVkW2ldOwotCQkJaWYgKGpvYi5nZXRKb2JUeXBlKCkgIT0gUGVuZGluZ0NoYW5nZS5JTlNUQUxMKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKFVwZGF0ZU1vZGVsLmhhc09wdGlvbmFsRmVhdHVyZXMoam9iLmdldEZlYXR1cmUoKSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc1NlbGVjdGVkSW5zdGFsbEpvYnMoKSB7Ci0JCU9iamVjdFtdIHNlbGVjdGVkID0gdGFibGVWaWV3ZXIuZ2V0Q2hlY2tlZEVsZW1lbnRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0ZWQubGVuZ3RoOyBpKyspIHsKLQkJCVBlbmRpbmdDaGFuZ2Ugam9iID0gKFBlbmRpbmdDaGFuZ2UpIHNlbGVjdGVkW2ldOwotCQkJaWYgKGpvYi5nZXRKb2JUeXBlKCkgPT0gUGVuZGluZ0NoYW5nZS5JTlNUQUxMKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgUGVuZGluZ0NoYW5nZVtdIGdldFNlbGVjdGVkSm9ic1dpdGhMaWNlbnNlcygpIHsKLQkJT2JqZWN0W10gc2VsZWN0ZWQgPSB0YWJsZVZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKTsKLQkJQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0ZWQubGVuZ3RoOyBpKyspIHsKLQkJCVBlbmRpbmdDaGFuZ2Ugam9iID0gKFBlbmRpbmdDaGFuZ2UpIHNlbGVjdGVkW2ldOwotCQkJaWYgKGpvYi5nZXRKb2JUeXBlKCkgIT0gUGVuZGluZ0NoYW5nZS5JTlNUQUxMKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKFVwZGF0ZU1vZGVsLmhhc0xpY2Vuc2Uoam9iKSkKLQkJCQlsaXN0LmFkZChqb2IpOwotCQl9Ci0JCXJldHVybiAoUGVuZGluZ0NoYW5nZVtdKSBsaXN0LnRvQXJyYXkobmV3IFBlbmRpbmdDaGFuZ2VbbGlzdC5zaXplKCldKTsKLQl9Ci0KLQlwdWJsaWMgUGVuZGluZ0NoYW5nZVtdIGdldFNlbGVjdGVkSm9ic1dpdGhPcHRpb25hbEZlYXR1cmVzKCkgewotCQlPYmplY3RbXSBzZWxlY3RlZCA9IHRhYmxlVmlld2VyLmdldENoZWNrZWRFbGVtZW50cygpOwotCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3RlZC5sZW5ndGg7IGkrKykgewotCQkJUGVuZGluZ0NoYW5nZSBqb2IgPSAoUGVuZGluZ0NoYW5nZSkgc2VsZWN0ZWRbaV07Ci0JCQlpZiAoam9iLmdldEpvYlR5cGUoKSAhPSBQZW5kaW5nQ2hhbmdlLklOU1RBTEwpCi0JCQkJY29udGludWU7Ci0JCQlpZiAoVXBkYXRlTW9kZWwuaGFzT3B0aW9uYWxGZWF0dXJlcyhqb2IuZ2V0RmVhdHVyZSgpKSkKLQkJCQlsaXN0LmFkZChqb2IpOwotCQl9Ci0JCXJldHVybiAoUGVuZGluZ0NoYW5nZVtdKSBsaXN0LnRvQXJyYXkobmV3IFBlbmRpbmdDaGFuZ2VbbGlzdC5zaXplKCldKTsKLQl9Ci0KLQlwdWJsaWMgUGVuZGluZ0NoYW5nZVtdIGdldFNlbGVjdGVkSW5zdGFsbEpvYnMoKSB7Ci0JCU9iamVjdFtdIHNlbGVjdGVkID0gdGFibGVWaWV3ZXIuZ2V0Q2hlY2tlZEVsZW1lbnRzKCk7Ci0JCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGVkLmxlbmd0aDsgaSsrKSB7Ci0JCQlQZW5kaW5nQ2hhbmdlIGpvYiA9IChQZW5kaW5nQ2hhbmdlKSBzZWxlY3RlZFtpXTsKLQkJCWlmIChqb2IuZ2V0Sm9iVHlwZSgpID09IFBlbmRpbmdDaGFuZ2UuSU5TVEFMTCkKLQkJCQlsaXN0LmFkZChqb2IpOwotCQl9Ci0JCXJldHVybiAoUGVuZGluZ0NoYW5nZVtdKSBsaXN0LnRvQXJyYXkobmV3IFBlbmRpbmdDaGFuZ2VbbGlzdC5zaXplKCldKTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9NdWx0aVRhcmdldFBhZ2UuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL011bHRpVGFyZ2V0UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTBkNWRiLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL011bHRpVGFyZ2V0UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLndpemFyZHM7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5Xb3JrYmVuY2hIZWxwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5VcGRhdGVNYW5hZ2VyVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsLlBlbmRpbmdDaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnBhcnRzLio7Ci0KLXB1YmxpYyBjbGFzcyBNdWx0aVRhcmdldFBhZ2UgZXh0ZW5kcyBCYW5uZXJQYWdlIGltcGxlbWVudHMgSUR5bmFtaWNQYWdlIHsKLQkvLyBOTCBrZXlzCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9USVRMRSA9Ci0JCSJNdWx0aUluc3RhbGxXaXphcmQuVGFyZ2V0UGFnZS50aXRsZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ERVNDID0gIk11bHRpSW5zdGFsbFdpemFyZC5UYXJnZXRQYWdlLmRlc2MiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfSk9CU19MQUJFTCA9Ci0JCSJNdWx0aUluc3RhbGxXaXphcmQuVGFyZ2V0UGFnZS5qb2JzTGFiZWwiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU0lURV9MQUJFTCA9Ci0JCSJNdWx0aUluc3RhbGxXaXphcmQuVGFyZ2V0UGFnZS5zaXRlTGFiZWwiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTkVXID0gIk11bHRpSW5zdGFsbFdpemFyZC5UYXJnZXRQYWdlLm5ldyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ERUxFVEUgPSAiTXVsdGlJbnN0YWxsV2l6YXJkLlRhcmdldFBhZ2UuZGVsZXRlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1JFUVVJUkVEX0ZSRUVfU1BBQ0UgPQotCQkiTXVsdGlJbnN0YWxsV2l6YXJkLlRhcmdldFBhZ2UucmVxdWlyZWRTcGFjZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9BVkFJTEFCTEVfRlJFRV9TUEFDRSA9Ci0JCSJNdWx0aUluc3RhbGxXaXphcmQuVGFyZ2V0UGFnZS5hdmFpbGFibGVTcGFjZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9MT0NBVElPTiA9Ci0JCSJNdWx0aUluc3RhbGxXaXphcmQuVGFyZ2V0UGFnZS5sb2NhdGlvbiI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9MT0NBVElPTl9NRVNTQUdFID0KLQkJIk11bHRpSW5zdGFsbFdpemFyZC5UYXJnZXRQYWdlLmxvY2F0aW9uLm1lc3NhZ2UiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTE9DQVRJT05fRU1QVFkgPQotCQkiTXVsdGlJbnN0YWxsV2l6YXJkLlRhcmdldFBhZ2UubG9jYXRpb24uZW1wdHkiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTE9DQVRJT05fRVhJU1RTID0KLQkJIk11bHRpSW5zdGFsbFdpemFyZC5UYXJnZXRQYWdlLmxvY2F0aW9uLmV4aXN0cyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9MT0NBVElPTl9FUlJPUl9USVRMRSA9Ci0JCSJNdWx0aUluc3RhbGxXaXphcmQuVGFyZ2V0UGFnZS5sb2NhdGlvbi5lcnJvci50aXRsZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9MT0NBVElPTl9FUlJPUl9NRVNTQUdFID0KLQkJIk11bHRpSW5zdGFsbFdpemFyZC5UYXJnZXRQYWdlLmxvY2F0aW9uLmVycm9yLm1lc3NhZ2UiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRVJST1JfUkVBU09OID0KLQkJIk11bHRpSW5zdGFsbFdpemFyZC5UYXJnZXRQYWdlLmxvY2F0aW9uLmVycm9yLnJlYXNvbiI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9TSVpFID0gIk11bHRpSW5zdGFsbFdpemFyZC5UYXJnZXRQYWdlLnNpemUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU0laRV9VTktOT1dOID0KLQkJIk11bHRpSW5zdGFsbFdpemFyZC5UYXJnZXRQYWdlLnVua25vd25TaXplIjsKLQlwcml2YXRlIFRhYmxlVmlld2VyIGpvYlZpZXdlcjsKLQlwcml2YXRlIFRhYmxlVmlld2VyIHNpdGVWaWV3ZXI7Ci0JcHJpdmF0ZSBJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnOwotCXByaXZhdGUgQ29uZmlnTGlzdGVuZXIgY29uZmlnTGlzdGVuZXI7Ci0JcHJpdmF0ZSBMYWJlbCByZXF1aXJlZFNwYWNlTGFiZWw7Ci0JcHJpdmF0ZSBMYWJlbCBhdmFpbGFibGVTcGFjZUxhYmVsOwotCXByaXZhdGUgUGVuZGluZ0NoYW5nZVtdIGpvYnM7Ci0JcHJpdmF0ZSBIYXNodGFibGUgdGFyZ2V0U2l0ZXM7Ci0JcHJpdmF0ZSBCdXR0b24gYWRkQnV0dG9uOwotCXByaXZhdGUgQnV0dG9uIGRlbGV0ZUJ1dHRvbjsKLQlwcml2YXRlIEhhc2hTZXQgYWRkZWQ7Ci0KLQlzdGF0aWMgY2xhc3MgSm9iVGFyZ2V0U2l0ZSB7Ci0JCVBlbmRpbmdDaGFuZ2Ugam9iOwotCQlJQ29uZmlndXJlZFNpdGUgYWZmaW5pdHlTaXRlOwotCQlJQ29uZmlndXJlZFNpdGUgZGVmYXVsdFNpdGU7Ci0JCUlDb25maWd1cmVkU2l0ZSB0YXJnZXRTaXRlOwotCX0KLQotCWNsYXNzIEpvYnNDb250ZW50UHJvdmlkZXIKLQkJZXh0ZW5kcyBEZWZhdWx0Q29udGVudFByb3ZpZGVyCi0JCWltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IHBhcmVudCkgewotCQkJcmV0dXJuIGpvYnM7Ci0JCX0KLQl9Ci0KLQljbGFzcyBUYWJsZUNvbnRlbnRQcm92aWRlcgotCQlleHRlbmRzIERlZmF1bHRDb250ZW50UHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB7Ci0KLQkJLyoqCi0JCSAqIEBzZWUgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBwYXJlbnQpIHsKLQkJCXJldHVybiBjb25maWcuZ2V0Q29uZmlndXJlZFNpdGVzKCk7Ci0JCX0KLQl9Ci0KLQljbGFzcyBUYWJsZUxhYmVsUHJvdmlkZXIKLQkJZXh0ZW5kcyBMYWJlbFByb3ZpZGVyCi0JCWltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0JCS8qKgotCQkqIEBzZWUgSVRhYmxlTGFiZWxQcm92aWRlciNnZXRDb2x1bW5JbWFnZShPYmplY3QsIGludCkKLQkJKi8KLQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBvYmosIGludCBjb2wpIHsKLQkJCVVwZGF0ZUxhYmVsUHJvdmlkZXIgcHJvdmlkZXIgPQotCQkJCVVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRMYWJlbFByb3ZpZGVyKCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgSUNvbmZpZ3VyZWRTaXRlKQotCQkJCXJldHVybiBwcm92aWRlci5nZXRMb2NhbFNpdGVJbWFnZSgoSUNvbmZpZ3VyZWRTaXRlKSBvYmopOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFBlbmRpbmdDaGFuZ2UpIHsKLQkJCQlQZW5kaW5nQ2hhbmdlIGpvYiA9IChQZW5kaW5nQ2hhbmdlKSBvYmo7Ci0JCQkJYm9vbGVhbiBwYXRjaCA9IGpvYi5nZXRGZWF0dXJlKCkuaXNQYXRjaCgpOwotCQkJCUltYWdlRGVzY3JpcHRvciBiYXNlID0KLQkJCQkJcGF0Y2gKLQkJCQkJCT8gVXBkYXRlVUlJbWFnZXMuREVTQ19FRklYX09CSgotCQkJCQkJOiBVcGRhdGVVSUltYWdlcy5ERVNDX0ZFQVRVUkVfT0JKOwotCQkJCWludCBmbGFncyA9IDA7Ci0JCQkJSm9iVGFyZ2V0U2l0ZSBqb2JTaXRlID0gKEpvYlRhcmdldFNpdGUpIHRhcmdldFNpdGVzLmdldChqb2IpOwotCQkJCWlmIChqb2JTaXRlID09IG51bGwgfHwgam9iU2l0ZS50YXJnZXRTaXRlID09IG51bGwpCi0JCQkJCWZsYWdzID0gVXBkYXRlTGFiZWxQcm92aWRlci5GX0VSUk9SOwotCQkJCXJldHVybiBwcm92aWRlci5nZXQoYmFzZSwgZmxhZ3MpOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBJVGFibGVMYWJlbFByb3ZpZGVyI2dldENvbHVtblRleHQoT2JqZWN0LCBpbnQpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iaiwgaW50IGNvbCkgewotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFBlbmRpbmdDaGFuZ2UgJiYgY29sID09IDApIHsKLQkJCQlQZW5kaW5nQ2hhbmdlIGpvYiA9IChQZW5kaW5nQ2hhbmdlKSBvYmo7Ci0JCQkJSUZlYXR1cmUgZmVhdHVyZSA9IGpvYi5nZXRGZWF0dXJlKCk7Ci0JCQkJcmV0dXJuIGZlYXR1cmUuZ2V0TGFiZWwoKQotCQkJCQkrICIgIgotCQkJCQkrIGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldFZlcnNpb24oKS50b1N0cmluZygpOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElDb25maWd1cmVkU2l0ZSAmJiBjb2wgPT0gMCkgewotCQkJCUlDb25maWd1cmVkU2l0ZSBjc2l0ZSA9IChJQ29uZmlndXJlZFNpdGUpIG9iajsKLQkJCQlJU2l0ZSBzaXRlID0gY3NpdGUuZ2V0U2l0ZSgpOwotCQkJCVVSTCB1cmwgPSBzaXRlLmdldFVSTCgpOwotCQkJCXJldHVybiB1cmwuZ2V0RmlsZSgpOwotCi0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCWNsYXNzIENvbmZpZ0xpc3RlbmVyIGltcGxlbWVudHMgSUluc3RhbGxDb25maWd1cmF0aW9uQ2hhbmdlZExpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgaW5zdGFsbFNpdGVBZGRlZChJQ29uZmlndXJlZFNpdGUgY3NpdGUpIHsKLQkJCXNpdGVWaWV3ZXIuYWRkKGNzaXRlKTsKLQkJCWlmIChhZGRlZD09bnVsbCkgYWRkZWQgPSBuZXcgSGFzaFNldCgpOwotCQkJYWRkZWQuYWRkKGNzaXRlKTsKLQkJCXNpdGVWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGNzaXRlKSk7Ci0JCQlzaXRlVmlld2VyLmdldENvbnRyb2woKS5zZXRGb2N1cygpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgaW5zdGFsbFNpdGVSZW1vdmVkKElDb25maWd1cmVkU2l0ZSBjc2l0ZSkgewotCQkJc2l0ZVZpZXdlci5yZW1vdmUoY3NpdGUpOwotCQkJaWYgKGFkZGVkIT1udWxsKSBhZGRlZC5yZW1vdmUoY3NpdGUpOwotCQkJUGVuZGluZ0NoYW5nZSBqb2IgPSAoUGVuZGluZ0NoYW5nZSlzaXRlVmlld2VyLmdldElucHV0KCk7Ci0JCQlpZiAoam9iIT1udWxsKSB7Ci0JCQkJSm9iVGFyZ2V0U2l0ZSBqb2JTaXRlID0gKEpvYlRhcmdldFNpdGUpIHRhcmdldFNpdGVzLmdldChqb2IpOwotCQkJCUlDb25maWd1cmVkU2l0ZSBkZWZhdWx0U2l0ZSA9IGNvbXB1dGVUYXJnZXRTaXRlKGpvYlNpdGUpOwotCQkJCWlmIChkZWZhdWx0U2l0ZSE9bnVsbCkKLQkJCQkJc2l0ZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZGVmYXVsdFNpdGUpKTsKLQkJCX0KLQkJCXNpdGVWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldEZvY3VzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgUmV2aWV3UGFnZQotCSAqLwotCXB1YmxpYyBNdWx0aVRhcmdldFBhZ2UoSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlzdXBlcigiTXVsdGlUYXJnZXQiKTsKLQkJc2V0VGl0bGUoVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9USVRMRSkpOwotCQlzZXREZXNjcmlwdGlvbihVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX0RFU0MpKTsKLQkJdGhpcy5jb25maWcgPSBjb25maWc7Ci0JCVVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRMYWJlbFByb3ZpZGVyKCkuY29ubmVjdCh0aGlzKTsKLQkJY29uZmlnTGlzdGVuZXIgPSBuZXcgQ29uZmlnTGlzdGVuZXIoKTsKLQkJdGFyZ2V0U2l0ZXMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Sm9icyhQZW5kaW5nQ2hhbmdlW10gam9icykgewotCQl0aGlzLmpvYnMgPSBqb2JzOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUNvbmZpZ3VyZWRTaXRlIGdldERlZmF1bHRUYXJnZXRTaXRlKAotCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnLAotCQlQZW5kaW5nQ2hhbmdlIHBlbmRpbmdDaGFuZ2UpIHsKLQkJcmV0dXJuIGdldERlZmF1bHRUYXJnZXRTaXRlKGNvbmZpZywgcGVuZGluZ0NoYW5nZSwgdHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSUNvbmZpZ3VyZWRTaXRlIGdldERlZmF1bHRUYXJnZXRTaXRlKAotCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnLAotCQlQZW5kaW5nQ2hhbmdlIHBlbmRpbmdDaGFuZ2UsCi0JCWJvb2xlYW4gY2hlY2tBZmZpbml0eUZlYXR1cmUpIHsKLQkJSUZlYXR1cmUgb2xkRmVhdHVyZSA9IHBlbmRpbmdDaGFuZ2UuZ2V0T2xkRmVhdHVyZSgpOwotCQlJRmVhdHVyZSBuZXdGZWF0dXJlID0gcGVuZGluZ0NoYW5nZS5nZXRGZWF0dXJlKCk7Ci0JCWlmIChvbGRGZWF0dXJlICE9IG51bGwpIHsKLQkJCS8vIFdlIHNob3VsZCBpbnN0YWxsIGludG8gdGhlIHNhbWUgc2l0ZSBhcwotCQkJLy8gdGhlIG9sZCBmZWF0dXJlCi0JCQl0cnkgewotCQkJCXJldHVybiBJbnN0YWxsV2l6YXJkLmZpbmRDb25maWdTaXRlKG9sZEZlYXR1cmUsIGNvbmZpZyk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlVcGRhdGVVSS5sb2dFeGNlcHRpb24oZSwgZmFsc2UpOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0KLQkJLy8gVGhpcyBpcyBhIG5ldyBpbnN0YWxsLiBDaGVjayBpZiB0aGVyZSBpcyAKLQkJLy8gYSBkaXNhYmxlZCBmZWF0dXJlIHdpdGggdGhlIHNhbWUgSUQKLQkJU3RyaW5nIG5ld0ZlYXR1cmVJRCA9Ci0JCQluZXdGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRJZGVudGlmaWVyKCk7Ci0JCUlDb25maWd1cmVkU2l0ZSBzYW1lU2l0ZSA9IGZpbmRTYW1lSWRGZWF0dXJlU2l0ZShjb25maWcsIG5ld0ZlYXR1cmVJRCk7Ci0JCWlmIChzYW1lU2l0ZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gc2FtZVNpdGU7Ci0JCX0KLQotCQlpZiAoY2hlY2tBZmZpbml0eUZlYXR1cmUpIHsKLQkJCXJldHVybiBnZXRBZmZpbml0eVNpdGUoY29uZmlnLCBuZXdGZWF0dXJlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJQ29uZmlndXJlZFNpdGUgZ2V0QWZmaW5pdHlTaXRlKAotCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnLAotCQlJRmVhdHVyZSBuZXdGZWF0dXJlKSB7Ci0JCS8vIGNoZWNrIGlmIHRoZSBhZmZpbml0eSBmZWF0dXJlIGlzIGluc3RhbGxlZAotCQlTdHJpbmcgYWZmaW5pdHlJRCA9IG5ld0ZlYXR1cmUuZ2V0QWZmaW5pdHlGZWF0dXJlKCk7Ci0JCWlmIChhZmZpbml0eUlEICE9IG51bGwpIHsKLQkJCUlDb25maWd1cmVkU2l0ZSBhZmZpbml0eVNpdGUgPQotCQkJCWZpbmRTYW1lSWRGZWF0dXJlU2l0ZShjb25maWcsIGFmZmluaXR5SUQpOwotCQkJaWYgKGFmZmluaXR5U2l0ZSAhPSBudWxsKQotCQkJCXJldHVybiBhZmZpbml0eVNpdGU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSUNvbmZpZ3VyZWRTaXRlIGZpbmRTYW1lSWRGZWF0dXJlU2l0ZSgKLQkJSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZywKLQkJU3RyaW5nIGZlYXR1cmVJRCkgewotCQlpZiAoZmVhdHVyZUlEID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSUNvbmZpZ3VyZWRTaXRlW10gc2l0ZXMgPSBjb25maWcuZ2V0Q29uZmlndXJlZFNpdGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlDb25maWd1cmVkU2l0ZSBzaXRlID0gc2l0ZXNbaV07Ci0JCQlJRmVhdHVyZVJlZmVyZW5jZVtdIHJlZnMgPSBzaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IHJlZnMubGVuZ3RoOyBqKyspIHsKLQkJCQlJRmVhdHVyZVJlZmVyZW5jZSByZWYgPSByZWZzW2pdOwotCQkJCXRyeSB7Ci0JCQkJCUlGZWF0dXJlIGZlYXR1cmUgPSByZWYuZ2V0RmVhdHVyZShudWxsKTsKLQkJCQkJaWYgKGZlYXR1cmVJRAotCQkJCQkJLmVxdWFscygKLQkJCQkJCQlmZWF0dXJlCi0JCQkJCQkJCS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkKLQkJCQkJCQkJLmdldElkZW50aWZpZXIoKSkpIHsKLQkJCQkJCS8vIGZvdW5kIGl0Ci0JCQkJCQlyZXR1cm4gc2l0ZTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlVcGRhdGVVSS5sb2dFeGNlcHRpb24oZSwgZmFsc2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0TGFiZWxQcm92aWRlcigpLmRpc2Nvbm5lY3QodGhpcyk7Ci0JCWNvbmZpZy5yZW1vdmVJbnN0YWxsQ29uZmlndXJhdGlvbkNoYW5nZWRMaXN0ZW5lcihjb25maWdMaXN0ZW5lcik7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIERpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY2xpZW50ID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IGxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQljbGllbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY2xpZW50LCBTV1QuTlVMTCk7Ci0JCWxhYmVsLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9KT0JTX0xBQkVMKSk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJY3JlYXRlSm9iVmlld2VyKGNsaWVudCk7Ci0KLQkJbmV3IExhYmVsKGNsaWVudCwgU1dULk5VTEwpOwotCi0JCWxhYmVsID0gbmV3IExhYmVsKGNsaWVudCwgU1dULk5VTEwpOwotCQlsYWJlbC5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfU0lURV9MQUJFTCkpOwotCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZ2QpOwotCi0JCWNyZWF0ZVNpdGVWaWV3ZXIoY2xpZW50KTsKLQotCQlDb21wb3NpdGUgYnV0dG9uQ29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShjbGllbnQsIFNXVC5OVUxMKTsKLQkJR3JpZExheW91dCBibGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJYmxheW91dC5tYXJnaW5XaWR0aCA9IGJsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJYnV0dG9uQ29udGFpbmVyLnNldExheW91dChibGF5b3V0KTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9WRVJUSUNBTCk7Ci0JCWJ1dHRvbkNvbnRhaW5lci5zZXRMYXlvdXREYXRhKGdkKTsKLQkJYWRkQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db250YWluZXIsIFNXVC5QVVNIKTsKLQkJYWRkQnV0dG9uLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9ORVcpKTsKLQkJYWRkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWFkZFRhcmdldExvY2F0aW9uKCk7Ci0JCQl9Ci0JCX0pOwotCQlhZGRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQ0VOVEVSKTsKLQkJYWRkQnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQlTV1RVdGlsLnNldEJ1dHRvbkRpbWVuc2lvbkhpbnQoYWRkQnV0dG9uKTsKLQkJCi0JCWRlbGV0ZUJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29udGFpbmVyLCBTV1QuUFVTSCk7Ci0JCWRlbGV0ZUJ1dHRvbi5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfREVMRVRFKSk7Ci0JCWRlbGV0ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl0cnkgewotCQkJCQlyZW1vdmVTZWxlY3Rpb24oKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCQkJVXBkYXRlVUkubG9nRXhjZXB0aW9uKGV4KTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlkZWxldGVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQ0VOVEVSKTsKLQkJZGVsZXRlQnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQlTV1RVdGlsLnNldEJ1dHRvbkRpbWVuc2lvbkhpbnQoZGVsZXRlQnV0dG9uKTsJCQotCQkKLQkJCi0JCQotCQlDb21wb3NpdGUgc3RhdHVzID0gbmV3IENvbXBvc2l0ZShjbGllbnQsIFNXVC5OVUxMKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlzdGF0dXMuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJc3RhdHVzLnNldExheW91dChsYXlvdXQpOwotCQlsYWJlbCA9IG5ldyBMYWJlbChzdGF0dXMsIFNXVC5OVUxMKTsKLQkJbGFiZWwuc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX1JFUVVJUkVEX0ZSRUVfU1BBQ0UpKTsKLQkJcmVxdWlyZWRTcGFjZUxhYmVsID0gbmV3IExhYmVsKHN0YXR1cywgU1dULk5VTEwpOwotCQlyZXF1aXJlZFNwYWNlTGFiZWwuc2V0TGF5b3V0RGF0YSgKLQkJCW5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJbGFiZWwgPSBuZXcgTGFiZWwoc3RhdHVzLCBTV1QuTlVMTCk7Ci0JCWxhYmVsLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9BVkFJTEFCTEVfRlJFRV9TUEFDRSkpOwotCQlhdmFpbGFibGVTcGFjZUxhYmVsID0gbmV3IExhYmVsKHN0YXR1cywgU1dULk5VTEwpOwotCQlhdmFpbGFibGVTcGFjZUxhYmVsLnNldExheW91dERhdGEoCi0JCQluZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJV29ya2JlbmNoSGVscC5zZXRIZWxwKGNsaWVudCwgIm9yZy5lY2xpcHNlLnVwZGF0ZS51aS5NdWx0aVRhcmdldFBhZ2UiKTsKLQkJcmV0dXJuIGNsaWVudDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlSm9iVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJam9iVmlld2VyID0KLQkJCW5ldyBUYWJsZVZpZXdlcihwYXJlbnQsIFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlUYWJsZSB0YWJsZSA9IGpvYlZpZXdlci5nZXRUYWJsZSgpOwotCQl0YWJsZS5zZXRMYXlvdXREYXRhKGdkKTsKLQkJam9iVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgSm9ic0NvbnRlbnRQcm92aWRlcigpKTsKLQkJam9iVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IFRhYmxlTGFiZWxQcm92aWRlcigpKTsKLQotCQlqb2JWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQloYW5kbGVKb2JzU2VsZWN0ZWQoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVKb2JzU2VsZWN0ZWQoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCVBlbmRpbmdDaGFuZ2Ugam9iID0gKFBlbmRpbmdDaGFuZ2UpIHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJc2l0ZVZpZXdlci5zZXRJbnB1dChqb2IpOwotCQlKb2JUYXJnZXRTaXRlIGpvYlNpdGUgPSAoSm9iVGFyZ2V0U2l0ZSkgdGFyZ2V0U2l0ZXMuZ2V0KGpvYik7Ci0JCWFkZEJ1dHRvbi5zZXRFbmFibGVkKGpvYlNpdGUuYWZmaW5pdHlTaXRlID09IG51bGwpOwotCQlpZiAoam9iU2l0ZS50YXJnZXRTaXRlICE9IG51bGwpIHsKLQkJCXNpdGVWaWV3ZXIuc2V0U2VsZWN0aW9uKAotCQkJCW5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGpvYlNpdGUudGFyZ2V0U2l0ZSkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvbXB1dGVEZWZhdWx0VGFyZ2V0U2l0ZXMoKSB7Ci0JCXRhcmdldFNpdGVzLmNsZWFyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgam9icy5sZW5ndGg7IGkrKykgewotCQkJUGVuZGluZ0NoYW5nZSBqb2IgPSBqb2JzW2ldOwotCQkJSm9iVGFyZ2V0U2l0ZSBqb2JTaXRlID0gbmV3IEpvYlRhcmdldFNpdGUoKTsKLQkJCWpvYlNpdGUuam9iID0gam9iOwotCQkJam9iU2l0ZS5kZWZhdWx0U2l0ZSA9IGdldERlZmF1bHRUYXJnZXRTaXRlKGNvbmZpZywgam9iLCBmYWxzZSk7Ci0JCQlqb2JTaXRlLmFmZmluaXR5U2l0ZSA9IGdldEFmZmluaXR5U2l0ZShjb25maWcsIGpvYi5nZXRGZWF0dXJlKCkpOwotCQkJaWYgKGpvYlNpdGUuYWZmaW5pdHlTaXRlID09IG51bGwpCi0JCQkJam9iU2l0ZS5hZmZpbml0eVNpdGUgPSBqb2IuZ2V0RGVmYXVsdFRhcmdldFNpdGUoKTsKLQkJCWpvYlNpdGUudGFyZ2V0U2l0ZSA9IGNvbXB1dGVUYXJnZXRTaXRlKGpvYlNpdGUpOwotCQkJdGFyZ2V0U2l0ZXMucHV0KGpvYiwgam9iU2l0ZSk7Ci0JCX0KLQl9Ci0JCi0JSUNvbmZpZ3VyZWRTaXRlIGNvbXB1dGVUYXJnZXRTaXRlKEpvYlRhcmdldFNpdGUgam9iU2l0ZSkgewotCQlJQ29uZmlndXJlZFNpdGUgY3NpdGUgPSBqb2JTaXRlLmFmZmluaXR5U2l0ZSAhPSBudWxsCi0JCQk/IGpvYlNpdGUuYWZmaW5pdHlTaXRlCi0JCQk6IGpvYlNpdGUuZGVmYXVsdFNpdGU7Ci0JCWlmIChjc2l0ZSA9PSBudWxsKQotCQkJY3NpdGUgPSBnZXRGaXJzdFRhcmdldChqb2JTaXRlKTsKLQkJcmV0dXJuIGNzaXRlOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVTaXRlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc2l0ZVZpZXdlciA9Ci0JCQluZXcgVGFibGVWaWV3ZXIocGFyZW50LCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJVGFibGUgdGFibGUgPSBzaXRlVmlld2VyLmdldFRhYmxlKCk7Ci0JCXRhYmxlLnNldExheW91dERhdGEoZ2QpOwotCQlzaXRlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgVGFibGVDb250ZW50UHJvdmlkZXIoKSk7Ci0JCXNpdGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgVGFibGVMYWJlbFByb3ZpZGVyKCkpOwotCQlzaXRlVmlld2VyLmFkZEZpbHRlcihuZXcgVmlld2VyRmlsdGVyKCkgewotCQkJcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2LCBPYmplY3QgcGFyZW50LCBPYmplY3Qgb2JqKSB7Ci0JCQkJSUNvbmZpZ3VyZWRTaXRlIHNpdGUgPSAoSUNvbmZpZ3VyZWRTaXRlKSBvYmo7Ci0JCQkJUGVuZGluZ0NoYW5nZSBqb2IgPSAoUGVuZGluZ0NoYW5nZSkgc2l0ZVZpZXdlci5nZXRJbnB1dCgpOwotCQkJCUpvYlRhcmdldFNpdGUgam9iU2l0ZSA9IChKb2JUYXJnZXRTaXRlKSB0YXJnZXRTaXRlcy5nZXQoam9iKTsKLQkJCQlyZXR1cm4gZ2V0U2l0ZVZpc2liaWxpdHkoc2l0ZSwgam9iU2l0ZSk7Ci0JCQl9Ci0JCX0pOwotCQlzaXRlVmlld2VyCi0JCQkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGV2ZW50LmdldFNlbGVjdGlvbigpOwotCQkJCXNlbGVjdFRhcmdldFNpdGUoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pOwotCQkJCXVwZGF0ZURlbGV0ZUJ1dHRvbigoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbik7Ci0JCQl9Ci0JCX0pOwotCi0JCWlmIChjb25maWcgIT0gbnVsbCkKLQkJCWNvbmZpZy5hZGRJbnN0YWxsQ29uZmlndXJhdGlvbkNoYW5nZWRMaXN0ZW5lcihjb25maWdMaXN0ZW5lcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCB1cGRhdGVEZWxldGVCdXR0b24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWJvb2xlYW4gaGFzVXNlclNpdGVzID0gYWRkZWQhPW51bGwgJiYgIWFkZGVkLmlzRW1wdHkoKTsKLQkJYm9vbGVhbiBlbmFibGUgPSAhc2VsZWN0aW9uLmlzRW1wdHkoKSAmJiBoYXNVc2VyU2l0ZXM7Ci0KLQkJaWYgKGhhc1VzZXJTaXRlcykgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoYWRkZWQuY29udGFpbnMob2JqKSA9PSBmYWxzZSkgewotCQkJCQllbmFibGUgPSBmYWxzZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWRlbGV0ZUJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLQkJaWYgKHZpc2libGUpIHsKLQkJCWNvbXB1dGVEZWZhdWx0VGFyZ2V0U2l0ZXMoKTsKLQkJCWpvYlZpZXdlci5zZXRJbnB1dChqb2JzKTsKLQkJfQotCQlzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotCQlpZiAodmlzaWJsZSkgewotCQkJam9iVmlld2VyLmdldFRhYmxlKCkuc2V0Rm9jdXMoKTsKLQkJCWlmIChqb2JzLmxlbmd0aD4wKQotCQkJCWpvYlZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oam9ic1swXSkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGdldFNpdGVWaXNpYmlsaXR5KAotCQlJQ29uZmlndXJlZFNpdGUgc2l0ZSwKLQkJSm9iVGFyZ2V0U2l0ZSBqb2JTaXRlKSB7Ci0JCS8vIElmIGFmZmluaXR5IHNpdGUgaXMga25vd24sIG9ubHkgaXQgc2hvdWxkIGJlIHNob3duCi0JCWlmIChqb2JTaXRlLmFmZmluaXR5U2l0ZSAhPSBudWxsKSB7Ci0JCQkvLyBNdXN0IGNvbXBhcmUgcmVmZXJlbmNlZCBzaXRlcyBiZWNhdXNlCi0JCQkvLyBjb25maWd1cmVkIHNpdGVzIHRoZW1zZWx2ZXMgbWF5IGNvbWUgZnJvbSAKLQkJCS8vIGRpZmZlcmVudCBjb25maWd1cmF0aW9ucwotCQkJcmV0dXJuIHNpdGUuZ2V0U2l0ZSgpLmVxdWFscyhqb2JTaXRlLmFmZmluaXR5U2l0ZS5nZXRTaXRlKCkpOwotCQl9Ci0KLQkJLy8gSWYgdGhpcyBpcyB0aGUgZGVmYXVsdCB0YXJnZXQgc2l0ZSwgbGV0IGl0IHNob3cKLQkJaWYgKHNpdGUuZXF1YWxzKGpvYlNpdGUuZGVmYXVsdFNpdGUpKQotCQkJcmV0dXJuIHRydWU7Ci0JCS8vIE5vdCB0aGUgZGVmYXVsdC4gSWYgdXBkYXRlLCBzaG93IG9ubHkgcHJpdmF0ZSBzaXRlcy4KLQkJLy8gSWYgaW5zdGFsbCwgYWxsb3cgcHJvZHVjdCBzaXRlICsgcHJpdmF0ZSBzaXRlcy4KLQkJaWYgKHNpdGUuaXNQcml2YXRlU2l0ZSgpICYmIHNpdGUuaXNVcGRhdGFibGUoKSkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoam9iU2l0ZS5qb2IuZ2V0T2xkRmVhdHVyZSgpID09IG51bGwgJiYgc2l0ZS5pc1Byb2R1Y3RTaXRlKCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlOb3RFbXB0eShib29sZWFuIGVtcHR5KSB7Ci0JCVN0cmluZyBlcnJvck1lc3NhZ2UgPSBudWxsOwotCQlpZiAoZW1wdHkpCi0JCQllcnJvck1lc3NhZ2UgPSBVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX0xPQ0FUSU9OX0VNUFRZKTsKLQkJc2V0RXJyb3JNZXNzYWdlKGVycm9yTWVzc2FnZSk7Ci0JCXNldFBhZ2VDb21wbGV0ZSghZW1wdHkpOwotCX0KLQotCXByaXZhdGUgSUNvbmZpZ3VyZWRTaXRlIGdldEZpcnN0VGFyZ2V0KEpvYlRhcmdldFNpdGUgam9iU2l0ZSkgewotCQlJQ29uZmlndXJlZFNpdGUgZmlyc3RTaXRlID0gam9iU2l0ZS50YXJnZXRTaXRlOwotCQlpZiAoZmlyc3RTaXRlID09IG51bGwpIHsKLQkJCUlDb25maWd1cmVkU2l0ZVtdIHNpdGVzID0gY29uZmlnLmdldENvbmZpZ3VyZWRTaXRlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXRlcy5sZW5ndGg7IGkrKykgewotCQkJCUlDb25maWd1cmVkU2l0ZSBjc2l0ZSA9IHNpdGVzW2ldOwotCQkJCWlmIChnZXRTaXRlVmlzaWJpbGl0eShjc2l0ZSwgam9iU2l0ZSkpIHsKLQkJCQkJZmlyc3RTaXRlID0gY3NpdGU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmlyc3RTaXRlOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZWxlY3RUYXJnZXRTaXRlKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlJQ29uZmlndXJlZFNpdGUgc2l0ZSA9IChJQ29uZmlndXJlZFNpdGUpIHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJUGVuZGluZ0NoYW5nZSBqb2IgPSAoUGVuZGluZ0NoYW5nZSkgc2l0ZVZpZXdlci5nZXRJbnB1dCgpOwotCQlpZiAoam9iICE9IG51bGwpIHsKLQkJCUpvYlRhcmdldFNpdGUgam9iU2l0ZSA9IChKb2JUYXJnZXRTaXRlKSB0YXJnZXRTaXRlcy5nZXQoam9iKTsKLQkJCWpvYlNpdGUudGFyZ2V0U2l0ZSA9IHNpdGU7Ci0JCQlwYWdlQ2hhbmdlZCgpOwotCQl9Ci0JCXVwZGF0ZVN0YXR1cyhzaXRlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkVGFyZ2V0TG9jYXRpb24oKSB7Ci0JCURpcmVjdG9yeURpYWxvZyBkZCA9IG5ldyBEaXJlY3RvcnlEaWFsb2coZ2V0Q29udGFpbmVyKCkuZ2V0U2hlbGwoKSk7Ci0JCWRkLnNldE1lc3NhZ2UoVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9MT0NBVElPTl9NRVNTQUdFKSk7Ci0JCVN0cmluZyBwYXRoID0gZGQub3BlbigpOwotCQlpZiAocGF0aCAhPSBudWxsKSB7Ci0JCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShwYXRoKTsKLQkJCWFkZENvbmZpZ3VyZWRTaXRlKGdldENvbnRhaW5lcigpLmdldFNoZWxsKCksIGNvbmZpZywgZmlsZSwgZmFsc2UpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCByZW1vdmVTZWxlY3Rpb24oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9Ci0JCQkoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNpdGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLQkJCUlDb25maWd1cmVkU2l0ZSBjc2l0ZSA9IChJQ29uZmlndXJlZFNpdGUpb2JqOwotCQkJY29uZmlnLnJlbW92ZUNvbmZpZ3VyZWRTaXRlKGNzaXRlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUNvbmZpZ3VyZWRTaXRlIGFkZENvbmZpZ3VyZWRTaXRlKAotCQlTaGVsbCBzaGVsbCwKLQkJSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZywKLQkJRmlsZSBmaWxlLAotCQlib29sZWFuIGxpbmtlZCkgewotCQl0cnkgewotCQkJSUNvbmZpZ3VyZWRTaXRlIGNzaXRlID0gbnVsbDsKLQkJCWlmIChsaW5rZWQpIHsKLQkJCQljc2l0ZSA9IGNvbmZpZy5jcmVhdGVMaW5rZWRDb25maWd1cmVkU2l0ZShmaWxlKTsKLQkJCQljb25maWcuYWRkQ29uZmlndXJlZFNpdGUoY3NpdGUpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoIWVuc3VyZVVuaXF1ZShmaWxlLCBjb25maWcpKSB7Ci0JCQkJCVN0cmluZyB0aXRsZSA9IFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfTE9DQVRJT05fRVJST1JfVElUTEUpOwotCQkJCQlTdHJpbmcgbWVzc2FnZSA9IFVwZGF0ZVVJLmdldEZvcm1hdHRlZE1lc3NhZ2UoCi0JCQkJCQkJCUtFWV9MT0NBVElPTl9FWElTVFMsCi0JCQkJCQkJCWZpbGUuZ2V0UGF0aCgpKTsKLQkJCQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3Ioc2hlbGwsIHRpdGxlLCBtZXNzYWdlKTsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCWNzaXRlID0gY29uZmlnLmNyZWF0ZUNvbmZpZ3VyZWRTaXRlKGZpbGUpOwotCQkJCUlTdGF0dXMgc3RhdHVzID0gY3NpdGUudmVyaWZ5VXBkYXRhYmxlU3RhdHVzKCk7Ci0JCQkJaWYgKHN0YXR1cy5pc09LKCkpCi0JCQkJCWNvbmZpZy5hZGRDb25maWd1cmVkU2l0ZShjc2l0ZSk7Ci0JCQkJZWxzZSB7Ci0JCQkJCVN0cmluZyB0aXRsZSA9Ci0JCQkJCQlVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX0xPQ0FUSU9OX0VSUk9SX1RJVExFKTsKLQkJCQkJU3RyaW5nIG1lc3NhZ2UgPQotCQkJCQkJVXBkYXRlVUkuZ2V0Rm9ybWF0dGVkTWVzc2FnZSgKLQkJCQkJCQlLRVlfTE9DQVRJT05fRVJST1JfTUVTU0FHRSwKLQkJCQkJCQlmaWxlLmdldFBhdGgoKSk7Ci0JCQkJCVN0cmluZyBtZXNzYWdlMiA9Ci0JCQkJCQlVcGRhdGVVSS5nZXRGb3JtYXR0ZWRNZXNzYWdlKAotCQkJCQkJCUtFWV9FUlJPUl9SRUFTT04sCi0JCQkJCQkJc3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0JCQkJCW1lc3NhZ2UgPSBtZXNzYWdlICsgIlxyXG4iICsgbWVzc2FnZTI7Ci0JCQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgdGl0bGUsIG1lc3NhZ2UsIHN0YXR1cyk7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBjc2l0ZTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlVcGRhdGVVSS5sb2dFeGNlcHRpb24oZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVTdGF0dXMoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmVxdWlyZWRTcGFjZUxhYmVsLnNldFRleHQoIiIpOwotCQkJYXZhaWxhYmxlU3BhY2VMYWJlbC5zZXRUZXh0KCIiKTsKLQkJCXJldHVybjsKLQkJfQotCQlJQ29uZmlndXJlZFNpdGUgc2l0ZSA9IChJQ29uZmlndXJlZFNpdGUpIGVsZW1lbnQ7Ci0JCVVSTCB1cmwgPSBzaXRlLmdldFNpdGUoKS5nZXRVUkwoKTsKLQkJU3RyaW5nIGZpbGVOYW1lID0gdXJsLmdldEZpbGUoKTsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZmlsZU5hbWUpOwotCQlsb25nIGF2YWlsYWJsZSA9IExvY2FsU3lzdGVtSW5mby5nZXRGcmVlU3BhY2UoZmlsZSk7Ci0JCWxvbmcgcmVxdWlyZWQgPSBjb21wdXRlUmVxdWlyZWRTaXplRm9yKHNpdGUpOwotCQlpZiAocmVxdWlyZWQgPT0gLTEpCi0JCQlyZXF1aXJlZFNwYWNlTGFiZWwuc2V0VGV4dCgKLQkJCQlVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX1NJWkVfVU5LTk9XTikpOwotCQllbHNlCi0JCQlyZXF1aXJlZFNwYWNlTGFiZWwuc2V0VGV4dCgKLQkJCQlVcGRhdGVVSS5nZXRGb3JtYXR0ZWRNZXNzYWdlKEtFWV9TSVpFLCAiIiArIHJlcXVpcmVkKSk7Ci0KLQkJaWYgKGF2YWlsYWJsZSA9PSBMb2NhbFN5c3RlbUluZm8uU0laRV9VTktOT1dOKQotCQkJYXZhaWxhYmxlU3BhY2VMYWJlbC5zZXRUZXh0KAotCQkJCVVwZGF0ZVVJLmdldFN0cmluZyhLRVlfU0laRV9VTktOT1dOKSk7Ci0JCWVsc2UKLQkJCWF2YWlsYWJsZVNwYWNlTGFiZWwuc2V0VGV4dCgKLQkJCQlVcGRhdGVVSS5nZXRGb3JtYXR0ZWRNZXNzYWdlKEtFWV9TSVpFLCAiIiArIGF2YWlsYWJsZSkpOwotCX0KLQotCXByaXZhdGUgbG9uZyBjb21wdXRlUmVxdWlyZWRTaXplRm9yKElDb25maWd1cmVkU2l0ZSBzaXRlKSB7Ci0JCWxvbmcgdG90YWxTaXplID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBqb2JzLmxlbmd0aDsgaSsrKSB7Ci0JCQlQZW5kaW5nQ2hhbmdlIGpvYiA9IGpvYnNbaV07Ci0JCQlKb2JUYXJnZXRTaXRlIGpvYlNpdGUgPSAoSm9iVGFyZ2V0U2l0ZSkgdGFyZ2V0U2l0ZXMuZ2V0KGpvYik7Ci0JCQlpZiAoc2l0ZS5lcXVhbHMoam9iU2l0ZS50YXJnZXRTaXRlKSkgewotCQkJCWxvbmcgam9iU2l6ZSA9Ci0JCQkJCXNpdGUuZ2V0U2l0ZSgpLmdldEluc3RhbGxTaXplRm9yKGpvYi5nZXRGZWF0dXJlKCkpOwotCQkJCWlmIChqb2JTaXplID09IC0xKQotCQkJCQlyZXR1cm4gLTE7Ci0JCQkJdG90YWxTaXplICs9IGpvYlNpemU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRvdGFsU2l6ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcGFnZUNoYW5nZWQoKSB7Ci0JCWJvb2xlYW4gZW1wdHkgPSBmYWxzZTsKLQkJZm9yIChFbnVtZXJhdGlvbiBlbnVtID0gdGFyZ2V0U2l0ZXMuZWxlbWVudHMoKTsKLQkJCWVudW0uaGFzTW9yZUVsZW1lbnRzKCk7Ci0JCQkpIHsKLQkJCUpvYlRhcmdldFNpdGUgam9iU2l0ZSA9IChKb2JUYXJnZXRTaXRlKSBlbnVtLm5leHRFbGVtZW50KCk7Ci0JCQlpZiAoam9iU2l0ZS50YXJnZXRTaXRlID09IG51bGwpIHsKLQkJCQllbXB0eSA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlJRmVhdHVyZSBmZWF0dXJlID0gam9iU2l0ZS5qb2IuZ2V0RmVhdHVyZSgpOwotCQkJaWYgKGZlYXR1cmUuaXNQYXRjaCgpKSB7Ci0JCQkJLy8gUGF0Y2hlcyBtdXN0IGdvIHRvZ2V0aGVyIHdpdGggdGhlIGZlYXR1cmVzCi0JCQkJLy8gdGhleSBhcmUgcGF0Y2hpbmcuCi0JCQkJSm9iVGFyZ2V0U2l0ZSBwYXRjaGVkU2l0ZSA9IGZpbmRQYXRjaGVkRmVhdHVyZShmZWF0dXJlKTsKLQkJCQlpZiAocGF0Y2hlZFNpdGUgIT0gbnVsbAotCQkJCQkmJiBqb2JTaXRlLnRhcmdldFNpdGUgIT0gbnVsbAotCQkJCQkmJiBwYXRjaGVkU2l0ZS50YXJnZXRTaXRlICE9IG51bGwKLQkJCQkJJiYgam9iU2l0ZS50YXJnZXRTaXRlLmVxdWFscyhwYXRjaGVkU2l0ZS50YXJnZXRTaXRlKQotCQkJCQkJPT0gZmFsc2UpIHsKLQkJCQkJc2V0RXJyb3JNZXNzYWdlKAotCQkJCQkJIlBhdGNoICciCi0JCQkJCQkJKyBmZWF0dXJlLmdldExhYmVsKCkKLQkJCQkJCQkrICInIG11c3QgYmUgaW5zdGFsbGVkIGluIHRoZSBzYW1lIHNpdGUgYXMgJyIKLQkJCQkJCQkrIHBhdGNoZWRTaXRlLmpvYi5nZXRGZWF0dXJlKCkuZ2V0TGFiZWwoKQotCQkJCQkJCSsgIiciKTsKLQkJCQkJc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfQotCQl2ZXJpZnlOb3RFbXB0eShlbXB0eSk7Ci0JfQotCi0JcHJpdmF0ZSBKb2JUYXJnZXRTaXRlIGZpbmRQYXRjaGVkRmVhdHVyZShJRmVhdHVyZSBwYXRjaCkgewotCi0JCWZvciAoRW51bWVyYXRpb24gZW51bSA9IHRhcmdldFNpdGVzLmVsZW1lbnRzKCk7Ci0JCQllbnVtLmhhc01vcmVFbGVtZW50cygpOwotCQkJKSB7Ci0JCQlKb2JUYXJnZXRTaXRlIGpvYlNpdGUgPSAoSm9iVGFyZ2V0U2l0ZSkgZW51bS5uZXh0RWxlbWVudCgpOwotCQkJSUZlYXR1cmUgdGFyZ2V0ID0gam9iU2l0ZS5qb2IuZ2V0RmVhdHVyZSgpOwotCQkJaWYgKHRhcmdldC5lcXVhbHMocGF0Y2gpKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKFVwZGF0ZVVJLmlzUGF0Y2godGFyZ2V0LCBwYXRjaCkpCi0JCQkJcmV0dXJuIGpvYlNpdGU7Ci0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSm9iVGFyZ2V0U2l0ZVtdIGdldFRhcmdldFNpdGVzKCkgewotCQlKb2JUYXJnZXRTaXRlW10gc2l0ZXMgPSBuZXcgSm9iVGFyZ2V0U2l0ZVtqb2JzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgam9icy5sZW5ndGg7IGkrKykgewotCQkJUGVuZGluZ0NoYW5nZSBqb2IgPSBqb2JzW2ldOwotCQkJSm9iVGFyZ2V0U2l0ZSBqb2JTaXRlID0gKEpvYlRhcmdldFNpdGUpIHRhcmdldFNpdGVzLmdldChqb2IpOwotCQkJc2l0ZXNbaV0gPSBqb2JTaXRlOwotCQl9Ci0JCXJldHVybiBzaXRlczsKLQl9Ci0KLQlwdWJsaWMgSUNvbmZpZ3VyZWRTaXRlIGdldFRhcmdldFNpdGUoUGVuZGluZ0NoYW5nZSBqb2IpIHsKLQkJSm9iVGFyZ2V0U2l0ZSBqb2JTaXRlID0gKEpvYlRhcmdldFNpdGUpIHRhcmdldFNpdGVzLmdldChqb2IpOwotCQlpZiAoam9iU2l0ZSAhPSBudWxsKQotCQkJcmV0dXJuIGpvYlNpdGUudGFyZ2V0U2l0ZTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBlbnN1cmVVbmlxdWUoRmlsZSBmaWxlLCBJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCUlDb25maWd1cmVkU2l0ZSBbXSBzaXRlcyA9IGNvbmZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKTsKLQkJVVJMIGZpbGVVUkw7Ci0JCXRyeSB7Ci0JCQlmaWxlVVJMID0gbmV3IFVSTCgiZmlsZToiK2ZpbGUuZ2V0UGF0aCgpKTsKLQkJfQotCQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWZvciAoaW50IGk9MDsgaTxzaXRlcy5sZW5ndGg7IGkrKykgewotCQkJSUNvbmZpZ3VyZWRTaXRlIGNzaXRlID0gc2l0ZXNbaV07Ci0JCQlVUkwgdXJsID0gY3NpdGUuZ2V0U2l0ZSgpLmdldFVSTCgpOwotCQkJaWYgKFVwZGF0ZU1hbmFnZXJVdGlscy5zYW1lVVJMKGZpbGVVUkwsIHVybCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL05ld0ZvbGRlcldpemFyZFBhZ2UuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL05ld0ZvbGRlcldpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIzODUzOC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9OZXdGb2xkZXJXaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuV29ya2JlbmNoSGVscDsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsLio7Ci0KLS8qKgotICogQGF1dGhvciBkZWphbgotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGVkaXQgdGhlIHRlbXBsYXRlIHZhcmlhYmxlICJ0eXBlY29tbWVudCI6Ci0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5UZW1wbGF0ZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdGb2xkZXJXaXphcmRQYWdlIGV4dGVuZHMgQmFzZU5ld1dpemFyZFBhZ2UgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVElUTEUgPSAiTmV3Rm9sZGVyV2l6YXJkUGFnZS50aXRsZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ERVNDID0gIk5ld0ZvbGRlcldpemFyZFBhZ2UuZGVzYyI7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgTmV3Rm9sZGVyV2l6YXJkUGFnZS4KLQkgKiBAcGFyYW0gZm9sZGVyCi0JICovCi0JcHVibGljIE5ld0ZvbGRlcldpemFyZFBhZ2UoQm9va21hcmtGb2xkZXIgZm9sZGVyKSB7Ci0JCXN1cGVyKGZvbGRlcik7Ci0JCXNldFRpdGxlKFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfVElUTEUpKTsKLQkJc2V0RGVzY3JpcHRpb24oVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9ERVNDKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBCYXNlTmV3V2l6YXJkUGFnZSNjcmVhdGVDbGllbnRDb250cm9sKENvbXBvc2l0ZSwgaW50KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNsaWVudENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCwgaW50IHNwYW4pIHsKLQkJV29ya2JlbmNoSGVscC5zZXRIZWxwKHBhcmVudCwgIm9yZy5lY2xpcHNlLnVwZGF0ZS51aS5OZXdGb2xkZXJXaXphcmRQYWdlIik7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZmluaXNoKCkgewotCQlCb29rbWFya0ZvbGRlciBuZXdGb2xkZXIgPSBuZXcgQm9va21hcmtGb2xkZXIoZ2V0TmFtZSgpKTsKLQkJYWRkVG9Nb2RlbChuZXdGb2xkZXIpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9OZXdTZWFyY2hXaXphcmRQYWdlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9OZXdTZWFyY2hXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiYTE2YTkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvTmV3U2VhcmNoV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLldvcmtiZW5jaEhlbHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5zZWFyY2guKjsKLQotLyoqCi0gKiBAYXV0aG9yIGRlamFuCi0gKgotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZWRpdCB0aGUgdGVtcGxhdGUgdmFyaWFibGUgInR5cGVjb21tZW50IjoKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPlRlbXBsYXRlcy4KLSAqLwotcHVibGljIGNsYXNzIE5ld1NlYXJjaFdpemFyZFBhZ2UgZXh0ZW5kcyBCYXNlTmV3V2l6YXJkUGFnZSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9USVRMRSA9ICJOZXdTZWFyY2hXaXphcmRQYWdlLnRpdGxlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RFU0MgPSAiTmV3U2VhcmNoV2l6YXJkUGFnZS5kZXNjIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NBVEVHT1JZID0gIk5ld1NlYXJjaFdpemFyZFBhZ2UuY2F0ZWdvcnkiOwotCXByaXZhdGUgQ29tYm8gY2F0ZWdvcnlDb21ibzsKLQlwcml2YXRlIFNlYXJjaENhdGVnb3J5RGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzOwotCXByaXZhdGUgU2VhcmNoQ2F0ZWdvcnlEZXNjcmlwdG9yIGRlc2NyaXB0b3I7Ci0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIE5ld0ZvbGRlcldpemFyZFBhZ2UuCi0JICogQHBhcmFtIGZvbGRlcgotCSAqLwotCXB1YmxpYyBOZXdTZWFyY2hXaXphcmRQYWdlKEJvb2ttYXJrRm9sZGVyIGZvbGRlcikgewotCQlzdXBlcihmb2xkZXIpOwotCQlzZXRUaXRsZShVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX1RJVExFKSk7Ci0JCXNldERlc2NyaXB0aW9uKFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfREVTQykpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQmFzZU5ld1dpemFyZFBhZ2UjY3JlYXRlQ2xpZW50Q29udHJvbChDb21wb3NpdGUsIGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDbGllbnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzcGFuKSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOwotCQlsYWJlbC5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfQ0FURUdPUlkpKTsKLQkJY2F0ZWdvcnlDb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5SRUFEX09OTFkpOwotCQlkZXNjcmlwdG9ycyA9Ci0JCQlTZWFyY2hDYXRlZ29yeVJlZ2lzdHJ5UmVhZGVyLmdldERlZmF1bHQoKS5nZXRDYXRlZ29yeURlc2NyaXB0b3JzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCWNhdGVnb3J5Q29tYm8uYWRkKGRlc2NyaXB0b3JzW2ldLmdldE5hbWUoKSk7Ci0JCX0KLQkJY2F0ZWdvcnlDb21iby5zZWxlY3QoMCk7Ci0JCWRlc2NyaXB0b3IgPSBkZXNjcmlwdG9yc1swXTsKLQkJY2F0ZWdvcnlDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlkZXNjcmlwdG9yID0gZGVzY3JpcHRvcnNbY2F0ZWdvcnlDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpXTsKLQkJCQl2YWxpZGF0ZVBhZ2UoKTsKLQkJCX0KLQkJfSk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWNhdGVnb3J5Q29tYm8uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCVdvcmtiZW5jaEhlbHAuc2V0SGVscChwYXJlbnQsICJvcmcuZWNsaXBzZS51cGRhdGUudWkuTmV3U2VhcmNoV2l6YXJkUGFnZSIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlUGFnZSgpIHsKLQkJc3VwZXIudmFsaWRhdGVQYWdlKCk7Ci0JCWlmIChpc1BhZ2VDb21wbGV0ZSgpKQotCQkJc2V0UGFnZUNvbXBsZXRlKGRlc2NyaXB0b3IgIT0gbnVsbCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZmluaXNoKCkgewotCQkvL1VwZGF0ZU1vZGVsIG1vZGVsID0gVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldFVwZGF0ZU1vZGVsKCk7Ci0JCVNlYXJjaE9iamVjdCBzZWFyY2ggPSBuZXcgU2VhcmNoT2JqZWN0KGdldE5hbWUoKSwgZGVzY3JpcHRvcik7Ci0JCWFkZFRvTW9kZWwoc2VhcmNoKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL05ld1NpdGVCb29rbWFya1dpemFyZFBhZ2UuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL05ld1NpdGVCb29rbWFya1dpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI5NzYzZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9OZXdTaXRlQm9va21hcmtXaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkud2l6YXJkczsKLQotaW1wb3J0IGphdmEubmV0Lio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5Xb3JrYmVuY2hIZWxwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWwuKjsKLQotLyoqCi0gKiBAYXV0aG9yIGRlamFuCi0gKgotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZWRpdCB0aGUgdGVtcGxhdGUgdmFyaWFibGUgInR5cGVjb21tZW50IjoKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPlRlbXBsYXRlcy4KLSAqLwotcHVibGljIGNsYXNzIE5ld1NpdGVCb29rbWFya1dpemFyZFBhZ2UgZXh0ZW5kcyBCYXNlTmV3V2l6YXJkUGFnZSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9USVRMRSA9ICJOZXdTaXRlQm9va21hcmtXaXphcmRQYWdlLnRpdGxlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RFU0MgPSAiTmV3U2l0ZUJvb2ttYXJrV2l6YXJkUGFnZS5kZXNjIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1VSTCA9ICJOZXdTaXRlQm9va21hcmtXaXphcmRQYWdlLnVybCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9IVFRQID0gIk5ld1NpdGVCb29rbWFya1dpemFyZFBhZ2UuaHR0cCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9JTlZBTElEID0KLQkJIk5ld1NpdGVCb29rbWFya1dpemFyZFBhZ2UuaW52YWxpZCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9UWVBFID0gIk5ld1NpdGVCb29rbWFya1dpemFyZFBhZ2UudHlwZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9VUERBVEVfVFlQRSA9Ci0JCSJOZXdTaXRlQm9va21hcmtXaXphcmRQYWdlLnVwZGF0ZVR5cGUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfV0VCX1RZUEUgPQotCQkiTmV3U2l0ZUJvb2ttYXJrV2l6YXJkUGFnZS53ZWJUeXBlIjsKLQlwcml2YXRlIFRleHQgdXJsVGV4dDsKLQlwcml2YXRlIFVSTCB1cmw7Ci0JcHJpdmF0ZSBTaXRlQm9va21hcmsgbG9jYWxCb29rbWFyazsKLQlwcml2YXRlIEJ1dHRvbiB1cGRhdGVCdXR0b247Ci0JcHJpdmF0ZSBCdXR0b24gd2ViQnV0dG9uOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIE5ld0ZvbGRlcldpemFyZFBhZ2UuCi0JICogQHBhcmFtIGZvbGRlcgotCSAqLwotCXB1YmxpYyBOZXdTaXRlQm9va21hcmtXaXphcmRQYWdlKEJvb2ttYXJrRm9sZGVyIGZvbGRlcikgewotCQlzdXBlcihmb2xkZXIpOwotCQlzZXRUaXRsZShVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX1RJVExFKSk7Ci0JCXNldERlc2NyaXB0aW9uKFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfREVTQykpOwotCX0KLQotCXB1YmxpYyBOZXdTaXRlQm9va21hcmtXaXphcmRQYWdlKAotCQlCb29rbWFya0ZvbGRlciBmb2xkZXIsCi0JCVNpdGVCb29rbWFyayBsb2NhbEJvb2ttYXJrKSB7Ci0JCXRoaXMoZm9sZGVyKTsKLQkJdGhpcy5sb2NhbEJvb2ttYXJrID0gbG9jYWxCb29rbWFyazsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEJhc2VOZXdXaXphcmRQYWdlI2NyZWF0ZUNsaWVudENvbnRyb2woQ29tcG9zaXRlLCBpbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ2xpZW50Q29udHJvbChDb21wb3NpdGUgcGFyZW50LCBpbnQgc3BhbikgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OVUxMKTsKLQkJbGFiZWwuc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX1VSTCkpOwotCQl1cmxUZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCXVybFRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWlmIChsb2NhbEJvb2ttYXJrICE9IG51bGwpIHsKLQkJCXVybCA9IGxvY2FsQm9va21hcmsuZ2V0VVJMKCk7Ci0JCQl1cmxUZXh0LnNldFRleHQodXJsLnRvU3RyaW5nKCkpOwotCQkJdXJsVGV4dC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfSBlbHNlCi0JCQl1cmxUZXh0LnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9IVFRQKSk7Ci0JCXVybFRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJdmFsaWRhdGVQYWdlKCk7Ci0JCQl9Ci0JCX0pOwotCQlpZiAobG9jYWxCb29rbWFyayA9PSBudWxsKSB7Ci0JCQlsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OVUxMKTsKLQkJCWxhYmVsLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9UWVBFKSk7Ci0JCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSBzcGFuOwotCQkJbGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQl1cGRhdGVCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlJBRElPKTsKLQkJCXVwZGF0ZUJ1dHRvbi5zZXRUZXh0KAotCQkJCVVwZGF0ZVVJLmdldFN0cmluZyhLRVlfVVBEQVRFX1RZUEUpKTsKLQkJCWdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCQlnZC5ob3Jpem9udGFsU3BhbiA9IHNwYW47Ci0JCQlnZC5ob3Jpem9udGFsSW5kZW50ID0gMTA7Ci0JCQl1cGRhdGVCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQl1cGRhdGVCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCi0JCQl3ZWJCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlJBRElPKTsKLQkJCXdlYkJ1dHRvbi5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfV0VCX1RZUEUpKTsKLQkJCWdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCQlnZC5ob3Jpem9udGFsU3BhbiA9IHNwYW47Ci0JCQlnZC5ob3Jpem9udGFsSW5kZW50ID0gMTA7Ci0JCQl3ZWJCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCX0KLQotCQlXb3JrYmVuY2hIZWxwLnNldEhlbHAoCi0JCQlwYXJlbnQsCi0JCQkib3JnLmVjbGlwc2UudXBkYXRlLnVpLk5ld1NpdGVCb29rbWFya1dpemFyZFBhZ2UiKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVBhZ2UoKSB7Ci0JCXN1cGVyLnZhbGlkYXRlUGFnZSgpOwotCQlpZiAoaXNQYWdlQ29tcGxldGUoKSAmJiBsb2NhbEJvb2ttYXJrID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIGRlY29kZWRUZXh0ID0gVVJMRGVjb2Rlci5kZWNvZGUodXJsVGV4dC5nZXRUZXh0KCkudHJpbSgpKTsKLQkJCQl1cmwgPSBuZXcgVVJMKGRlY29kZWRUZXh0KTsKLQkJCQlzdXBlci52YWxpZGF0ZVBhZ2UoKTsKLQkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkJaGFuZGxlSW52YWxpZFVSTCgpOwotCQkJfSBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQkJCQkvLzMzMTU5Ci0JCQkJaGFuZGxlSW52YWxpZFVSTCgpOwotCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCQkvLyAzMzE1OQotCQkJCWhhbmRsZUludmFsaWRVUkwoKTsKLQkJCX0KLQkJfQotCX0KLQlwcml2YXRlIHZvaWQgaGFuZGxlSW52YWxpZFVSTCgpIHsKLQkJc2V0RGVsYXllZEVycm9yTWVzc2FnZShVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX0lOVkFMSUQpKTsKLQkJc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBmaW5pc2goKSB7Ci0JCS8vVXBkYXRlTW9kZWwgbW9kZWwgPSBVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0VXBkYXRlTW9kZWwoKTsKLQkJLy9Cb29rbWFya0ZvbGRlciBwYXJlbnRGb2xkZXIgPSBnZXRGb2xkZXIoKTsKLQkJYm9vbGVhbiB3ZWJCb29rbWFyayA9IGZhbHNlOwotCQlpZiAobG9jYWxCb29rbWFyayA9PSBudWxsKQotCQkJd2ViQm9va21hcmsgPSB3ZWJCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JCVNpdGVCb29rbWFyayBuZXdCb29rbWFyayA9Ci0JCQluZXcgU2l0ZUJvb2ttYXJrKGdldE5hbWUoKSwgdXJsLCB3ZWJCb29rbWFyayk7Ci0JCWFkZFRvTW9kZWwobmV3Qm9va21hcmspOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvTmV3VXBkYXRlc1dpemFyZC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvTmV3VXBkYXRlc1dpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODRlMWQ2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL05ld1VwZGF0ZXNXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi5JQ29uZmlndXJlZFNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uSUluc3RhbGxDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuSW5zdGFsbEFib3J0ZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSUltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuZm9ybXMuQWN0aXZpdHlDb25zdHJhaW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuc2VhcmNoLlNlYXJjaE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuc2VhcmNoLlNlYXJjaFJlc3VsdFNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnNlY3VyaXR5LkphclZlcmlmaWNhdGlvblNlcnZpY2U7Ci0KLXB1YmxpYyBjbGFzcyBOZXdVcGRhdGVzV2l6YXJkIGV4dGVuZHMgV2l6YXJkIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0lOU1RBTExJTkcgPSAiTmV3VXBkYXRlc1dpemFyZC5pbnN0YWxsaW5nIjsKLQlwcml2YXRlIElJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWc7Ci0JcHJpdmF0ZSBOZXdVcGRhdGVzV2l6YXJkUGFnZSBtYWluUGFnZTsKLQlwcml2YXRlIExpY2Vuc2VQYWdlIGxpY2Vuc2VQYWdlOwotCXByaXZhdGUgUGVuZGluZ0NoYW5nZVtdIGpvYnM7Ci0JcHJpdmF0ZSBpbnQgaW5zdGFsbENvdW50ID0gMDsKLQotCXB1YmxpYyBOZXdVcGRhdGVzV2l6YXJkKFNlYXJjaE9iamVjdCBzZWFyY2hPYmplY3QpIHsKLQkJc2V0RGlhbG9nU2V0dGluZ3MoVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldERpYWxvZ1NldHRpbmdzKCkpOwotCQlzZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihVcGRhdGVVSUltYWdlcy5ERVNDX1VQREFURV9XSVopOwotCQlzZXRGb3JjZVByZXZpb3VzQW5kTmV4dEJ1dHRvbnModHJ1ZSk7Ci0JCXNldE5lZWRzUHJvZ3Jlc3NNb25pdG9yKHRydWUpOwotCQljcmVhdGVQZW5kaW5nQ2hhbmdlcyhzZWFyY2hPYmplY3QpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU3VjY2Vzc2Z1bEluc3RhbGwoKSB7Ci0JCXJldHVybiBpbnN0YWxsQ291bnQgPiAwOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVQZW5kaW5nQ2hhbmdlcyhTZWFyY2hPYmplY3Qgc2VhcmNoT2JqZWN0KSB7Ci0JCUFycmF5TGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCU9iamVjdFtdIHNpdGVzID0gc2VhcmNoT2JqZWN0LmdldENoaWxkcmVuKG51bGwpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpdGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTZWFyY2hSZXN1bHRTaXRlIHNpdGUgPSAoU2VhcmNoUmVzdWx0U2l0ZSkgc2l0ZXNbaV07Ci0JCQljcmVhdGVQZW5kaW5nQ2hhbmdlcyhzaXRlLCByZXN1bHQpOwotCQl9Ci0JCWpvYnMgPQotCQkJKFBlbmRpbmdDaGFuZ2VbXSkgcmVzdWx0LnRvQXJyYXkobmV3IFBlbmRpbmdDaGFuZ2VbcmVzdWx0LnNpemUoKV0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVQZW5kaW5nQ2hhbmdlcygKLQkJU2VhcmNoUmVzdWx0U2l0ZSBzaXRlLAotCQlBcnJheUxpc3QgcmVzdWx0KSB7Ci0JCU9iamVjdFtdIGNhbmRpZGF0ZXMgPSBzaXRlLmdldENoaWxkcmVuKG51bGwpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNhbmRpZGF0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCVNpbXBsZUZlYXR1cmVBZGFwdGVyIGFkYXB0ZXIgPSAoU2ltcGxlRmVhdHVyZUFkYXB0ZXIpIGNhbmRpZGF0ZXNbaV07Ci0JCQl0cnkgewotCQkJCUlGZWF0dXJlIGZlYXR1cmUgPSBhZGFwdGVyLmdldEZlYXR1cmUobnVsbCk7Ci0JCQkJSUZlYXR1cmVbXSBpbnN0YWxsZWQgPQotCQkJCQlVcGRhdGVVSS5nZXRJbnN0YWxsZWRGZWF0dXJlcyhmZWF0dXJlKTsKLQkJCQlQZW5kaW5nQ2hhbmdlIGNoYW5nZSA9IG5ldyBQZW5kaW5nQ2hhbmdlKGluc3RhbGxlZC5sZW5ndGg+MD9pbnN0YWxsZWRbMF06bnVsbCwgZmVhdHVyZSk7Ci0JCQkJcmVzdWx0LmFkZChjaGFuZ2UpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJVXBkYXRlVUkubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJRmVhdHVyZVtdIGdldEZlYXR1cmVzV2l0aExpY2Vuc2VzKCkgewotCQlBcnJheUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGpvYnMubGVuZ3RoOyBpKyspIHsKLQkJCVBlbmRpbmdDaGFuZ2Ugam9iID0gam9ic1tpXTsKLQkJCUlGZWF0dXJlIGZlYXR1cmUgPSBqb2IuZ2V0RmVhdHVyZSgpOwotCQkJSVVSTEVudHJ5IGluZm8gPSBmZWF0dXJlLmdldExpY2Vuc2UoKTsKLQkJCWlmIChpbmZvID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQlpZiAoaW5mby5nZXRBbm5vdGF0aW9uKCkgIT0gbnVsbAotCQkJCSYmIGluZm8uZ2V0QW5ub3RhdGlvbigpLmxlbmd0aCgpID4gMCkKLQkJCQlyZXN1bHQuYWRkKGZlYXR1cmUpOwotCQl9Ci0JCXJldHVybiAoSUZlYXR1cmVbXSkgcmVzdWx0LnRvQXJyYXkobmV3IElGZWF0dXJlW3Jlc3VsdC5zaXplKCldKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFdpemFyZCNwZXJmb3JtRmluaXNoKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQlmaW5hbCBQZW5kaW5nQ2hhbmdlW10gc2VsZWN0ZWRKb2JzID0gbWFpblBhZ2UuZ2V0U2VsZWN0ZWRKb2JzKCk7Ci0JCQotCQkvLyBtYWtlIHN1cmUgd2UgY2FuIGFjdHVhbGx5IGFwcGx5IHRoZSBlbnRpcmUgYmF0Y2ggb2YgdXBkYXRlcwotCQlJU3RhdHVzIHN0YXR1cyA9IEFjdGl2aXR5Q29uc3RyYWludHMudmFsaWRhdGVQZW5kaW5nT25lQ2xpY2tVcGRhdGUoc2VsZWN0ZWRKb2JzKTsKLQkJaWYgKHN0YXR1cyAhPSBudWxsKSB7Ci0JCQlFcnJvckRpYWxvZy5vcGVuRXJyb3IoCi0JCQkJVXBkYXRlVUkuZ2V0QWN0aXZlV29ya2JlbmNoU2hlbGwoKSwKLQkJCQludWxsLAotCQkJCW51bGwsCi0JCQkJc3RhdHVzKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJLy8gQ2hlY2sgZm9yIGR1cGxpY2F0aW9uIGNvbmZsaWN0cwotCQlBcnJheUxpc3QgY29uZmxpY3RzID0gRHVwbGljYXRlQ29uZmxpY3RzRGlhbG9nLmNvbXB1dGVEdXBsaWNhdGVDb25mbGljdHMoc2VsZWN0ZWRKb2JzLCBjb25maWcpOwotCQlpZiAoY29uZmxpY3RzIT1udWxsKSB7Ci0JCQlEdXBsaWNhdGVDb25mbGljdHNEaWFsb2cgZGlhbG9nID0gbmV3IER1cGxpY2F0ZUNvbmZsaWN0c0RpYWxvZyhnZXRTaGVsbCgpLCBjb25mbGljdHMpOwotCQkJaWYgKGRpYWxvZy5vcGVuKCkhPTApIHJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJLy8gb2sgdG8gY29udGludWUJCQotCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3BlcmF0aW9uID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQkJCXRyeSB7Ci0JCQkJCWluc3RhbGxDb3VudCA9IDA7Ci0JCQkJCUluc3RhbGxXaXphcmQubWFrZUNvbmZpZ3VyYXRpb25DdXJyZW50KGNvbmZpZywgbnVsbCk7Ci0JCQkJCWV4ZWN1dGUoc2VsZWN0ZWRKb2JzLCBtb25pdG9yKTsKLQkJCQl9IGNhdGNoIChJbnN0YWxsQWJvcnRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGUpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQl0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihlKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCXRyeSB7Ci0JCQlnZXRDb250YWluZXIoKS5ydW4odHJ1ZSwgdHJ1ZSwgb3BlcmF0aW9uKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlUaHJvd2FibGUgdGFyZ2V0RXhjZXB0aW9uID0gZS5nZXRUYXJnZXRFeGNlcHRpb24oKTsKLQkJCWlmICh0YXJnZXRFeGNlcHRpb24gaW5zdGFuY2VvZiBJbnN0YWxsQWJvcnRlZEV4Y2VwdGlvbikgewotCQkJCXJldHVybiB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQlVcGRhdGVVSS5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJY29uZmlnID0gSW5zdGFsbFdpemFyZC5jcmVhdGVJbnN0YWxsQ29uZmlndXJhdGlvbigpOwotCQlpZiAoY29uZmlnICE9IG51bGwpIHsKLQkJCW1haW5QYWdlID0gbmV3IE5ld1VwZGF0ZXNXaXphcmRQYWdlKGpvYnMsIGNvbmZpZyk7Ci0JCQlhZGRQYWdlKG1haW5QYWdlKTsKLQkJCWxpY2Vuc2VQYWdlID0gbmV3IExpY2Vuc2VQYWdlKHRydWUpOwotCQkJYWRkUGFnZShsaWNlbnNlUGFnZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0TmV4dFBhZ2UoSVdpemFyZFBhZ2UgcGFnZSkgewotCQlpZiAocGFnZSBpbnN0YW5jZW9mIExpY2Vuc2VQYWdlKQotCQkJcmV0dXJuIG51bGw7Ci0JCVBlbmRpbmdDaGFuZ2VbXSBsaWNlbnNlSm9icyA9IG1haW5QYWdlLmdldFNlbGVjdGVkSm9ic1dpdGhMaWNlbnNlcygpOwotCQlpZiAobGljZW5zZUpvYnMubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJbGljZW5zZVBhZ2Uuc2V0Sm9icyhsaWNlbnNlSm9icyk7Ci0JCXJldHVybiBsaWNlbnNlUGFnZTsKLQl9Ci0JcHVibGljIElXaXphcmRQYWdlIGdldFByZXZpb3VzUGFnZShJV2l6YXJkUGFnZSBwYWdlKSB7Ci0JCWlmIChwYWdlIGluc3RhbmNlb2YgTGljZW5zZVBhZ2UpCi0JCQlyZXR1cm4gbWFpblBhZ2U7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkZpbmlzaCgpIHsKLQkJSVdpemFyZFBhZ2UgcGFnZSA9IGdldENvbnRhaW5lcigpLmdldEN1cnJlbnRQYWdlKCk7Ci0JCXJldHVybiBwYWdlLmdldE5leHRQYWdlKCkgPT0gbnVsbCAmJiBzdXBlci5jYW5GaW5pc2goKTsKLQl9Ci0KLQkvKgotCSAqIFdoZW4gd2UgYXJlIHVuaW5zdGFsbGluZywgdGhlcmUgaXMgbm90IHRhcmdldFNpdGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgZXhlY3V0ZSgKLQkJUGVuZGluZ0NoYW5nZVtdIHNlbGVjdGVkSm9icywKLQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQl0aHJvd3MgSW5zdGFsbEFib3J0ZWRFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQltb25pdG9yLmJlZ2luVGFzaygKLQkJCVVwZGF0ZVVJLmdldFN0cmluZyhLRVlfSU5TVEFMTElORyksCi0JCQlqb2JzLmxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0ZWRKb2JzLmxlbmd0aDsgaSsrKSB7Ci0JCQlQZW5kaW5nQ2hhbmdlIGpvYiA9IHNlbGVjdGVkSm9ic1tpXTsKLQkJCVN1YlByb2dyZXNzTW9uaXRvciBzdWJNb25pdG9yID0KLQkJCQluZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKAotCQkJCQltb25pdG9yLAotCQkJCQkxLAotCQkJCQlTdWJQcm9ncmVzc01vbml0b3IuUFJFUEVORF9NQUlOX0xBQkVMX1RPX1NVQlRBU0spOwotCQkJZXhlY3V0ZU9uZUpvYihqb2IsIHN1Yk1vbml0b3IpOwotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQlJbnN0YWxsV2l6YXJkLnNhdmVMb2NhbFNpdGUoKTsKLQkJCWluc3RhbGxDb3VudCsrOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGV4ZWN1dGVPbmVKb2IoUGVuZGluZ0NoYW5nZSBqb2IsIFN1YlByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQl0aHJvd3MgSW5zdGFsbEFib3J0ZWRFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlJRmVhdHVyZSBmZWF0dXJlID0gam9iLmdldEZlYXR1cmUoKTsKLQkJSUZlYXR1cmUgb2xkRmVhdHVyZSA9IGpvYi5nZXRPbGRGZWF0dXJlKCk7Ci0JCWJvb2xlYW4gcmVpbnN0YWxsPWZhbHNlOwotCQlJRmVhdHVyZVJlZmVyZW5jZSBbXSBvcHRpb25hbEZlYXR1cmVzPW51bGw7Ci0JCWlmIChvbGRGZWF0dXJlIT1udWxsICYmIGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmVxdWFscyhvbGRGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSkpIHsKLQkJCXJlaW5zdGFsbD10cnVlOwotCQl9Ci0JCUFycmF5TGlzdCBvcHRpb25hbEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlib29sZWFuIHBhdGNoID0gVXBkYXRlVUkuaXNQYXRjaChmZWF0dXJlKTsKLQkJYm9vbGVhbiBoYXNPcHRpb25hbEZlYXR1cmVzID0gRmVhdHVyZUhpZXJhcmNoeUVsZW1lbnQuY29tcHV0ZUVsZW1lbnRzKAotCQkJb2xkRmVhdHVyZSwKLQkJCWZlYXR1cmUsCi0JCQlvbGRGZWF0dXJlICE9IG51bGwsCi0JCQlwYXRjaCwKLQkJCWNvbmZpZywKLQkJCW9wdGlvbmFsRWxlbWVudHMpOwotCQlpZiAoaGFzT3B0aW9uYWxGZWF0dXJlcykKLQkJCW9wdGlvbmFsRmVhdHVyZXMgPSBjb21wdXRlT3B0aW9uYWxGZWF0dXJlcyhvcHRpb25hbEVsZW1lbnRzLCBvbGRGZWF0dXJlIT1udWxsKTsKLQkJSUNvbmZpZ3VyZWRTaXRlIHRhcmdldFNpdGUgPQotCQkJVGFyZ2V0UGFnZS5nZXREZWZhdWx0VGFyZ2V0U2l0ZShjb25maWcsIGpvYik7Ci0JCWlmIChvcHRpb25hbEZlYXR1cmVzIT1udWxsKQotCQkJdGFyZ2V0U2l0ZS5pbnN0YWxsKGZlYXR1cmUsIG9wdGlvbmFsRmVhdHVyZXMsIGdldFZlcmlmaWNhdGlvbkxpc3RlbmVyKCksIG1vbml0b3IpOwotCQllbHNlCi0JCQl0YXJnZXRTaXRlLmluc3RhbGwoZmVhdHVyZSwgZ2V0VmVyaWZpY2F0aW9uTGlzdGVuZXIoKSwgbW9uaXRvcik7Ci0JCWlmICghcmVpbnN0YWxsKSB7Ci0JCQlpZiAob3B0aW9uYWxGZWF0dXJlcyE9bnVsbCkgewotCQkJCUluc3RhbGxXaXphcmQucHJlc2VydmVPcHRpb25hbFN0YXRlKGNvbmZpZywgdGFyZ2V0U2l0ZSwgZmFsc2UsIG9wdGlvbmFsRWxlbWVudHMudG9BcnJheSgpKTsKLQkJCX0KLQkJCWlmIChvbGRGZWF0dXJlIT1udWxsKSB1bmNvbmZpZ3VyZShvbGRGZWF0dXJlKTsKLQkJCWVsc2UgewotCQkJCU11bHRpSW5zdGFsbFdpemFyZC5lbnN1cmVVbmlxdWUoY29uZmlnLCBmZWF0dXJlLCB0YXJnZXRTaXRlKTsKLQkJCX0KLQkJfQotCQlVcGRhdGVNb2RlbCBtb2RlbCA9IFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRVcGRhdGVNb2RlbCgpOwotCQltb2RlbC5hZGRQZW5kaW5nQ2hhbmdlKGpvYik7Ci0JfQotCi0JcHJpdmF0ZSBJRmVhdHVyZVJlZmVyZW5jZVtdIGNvbXB1dGVPcHRpb25hbEZlYXR1cmVzKEFycmF5TGlzdCBlbGVtZW50cywgYm9vbGVhbiB1cGRhdGUpIHsKLQkJSGFzaFNldCBzZXQgPSBuZXcgSGFzaFNldCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQlGZWF0dXJlSGllcmFyY2h5RWxlbWVudCBlbGVtZW50ID0KLQkJCQkoRmVhdHVyZUhpZXJhcmNoeUVsZW1lbnQpIGVsZW1lbnRzLmdldChpKTsKLQkJCWVsZW1lbnQuYWRkQ2hlY2tlZE9wdGlvbmFsRmVhdHVyZXMoCi0JCQkJdXBkYXRlLAotCQkJCWZhbHNlLAotCQkJCWNvbmZpZywKLQkJCQlzZXQpOwotCQl9Ci0JCXJldHVybiAoSUZlYXR1cmVSZWZlcmVuY2VbXSkgc2V0LnRvQXJyYXkoCi0JCQluZXcgSUZlYXR1cmVSZWZlcmVuY2Vbc2V0LnNpemUoKV0pOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgdGhyb3dFcnJvcihTdHJpbmcgbWVzc2FnZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJU3RhdHVzIHN0YXR1cyA9Ci0JCQluZXcgU3RhdHVzKAotCQkJCUlTdGF0dXMuRVJST1IsCi0JCQkJVXBkYXRlVUkuZ2V0UGx1Z2luSWQoKSwKLQkJCQlJU3RhdHVzLk9LLAotCQkJCW1lc3NhZ2UsCi0JCQkJbnVsbCk7Ci0JCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1cyk7Ci0JfQotCi0Jc3RhdGljIElDb25maWd1cmVkU2l0ZSBmaW5kQ29uZmlnU2l0ZSgKLQkJSUZlYXR1cmUgZmVhdHVyZSwKLQkJSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZykKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJQ29uZmlndXJlZFNpdGVbXSBjb25maWdTaXRlcyA9IGNvbmZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWdTaXRlcy5sZW5ndGg7IGkrKykgewotCQkJSUNvbmZpZ3VyZWRTaXRlIHNpdGUgPSBjb25maWdTaXRlc1tpXTsKLQkJCWlmIChzaXRlLmdldFNpdGUoKS5lcXVhbHMoZmVhdHVyZS5nZXRTaXRlKCkpKSB7Ci0JCQkJcmV0dXJuIHNpdGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHVuY29uZmlndXJlKElGZWF0dXJlIGZlYXR1cmUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSUNvbmZpZ3VyZWRTaXRlIHNpdGUgPSBmaW5kQ29uZmlnU2l0ZShmZWF0dXJlLCBjb25maWcpOwotCQlpZiAoc2l0ZSAhPSBudWxsKSB7Ci0JCQlQYXRjaENsZWFuZXIgY2xlYW5lciA9IG5ldyBQYXRjaENsZWFuZXIoc2l0ZSwgZmVhdHVyZSk7Ci0JCQlib29sZWFuIHJlc3VsdCA9IHNpdGUudW5jb25maWd1cmUoZmVhdHVyZSk7Ci0JCQljbGVhbmVyLmRpc3Bvc2UoKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQlwcml2YXRlIHZvaWQgY29uZmlndXJlKElGZWF0dXJlIGZlYXR1cmUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSUNvbmZpZ3VyZWRTaXRlIHNpdGUgPSBmaW5kQ29uZmlnU2l0ZShmZWF0dXJlLCBjb25maWcpOwotCQlpZiAoc2l0ZSAhPSBudWxsKSB7Ci0JCQlzaXRlLmNvbmZpZ3VyZShmZWF0dXJlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgSVZlcmlmaWNhdGlvbkxpc3RlbmVyIGdldFZlcmlmaWNhdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IEphclZlcmlmaWNhdGlvblNlcnZpY2UodGhpcy5nZXRTaGVsbCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9OZXdVcGRhdGVzV2l6YXJkUGFnZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvTmV3VXBkYXRlc1dpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDIzYTUyYS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9OZXdVcGRhdGVzV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLndpemFyZHM7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuV29ya2JlbmNoSGVscDsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi5JSW5zdGFsbENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkucGFydHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkudmlld3MuRGV0YWlsc1ZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnZpZXdzLkZlYXR1cmVTb3J0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBOZXdVcGRhdGVzV2l6YXJkUGFnZSBleHRlbmRzIEJhbm5lclBhZ2UgewotCS8vIE5MIGtleXMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1RJVExFID0gIk5ld1VwZGF0ZXNXaXphcmQuTWFpblBhZ2UudGl0bGUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfREVTQyA9ICJOZXdVcGRhdGVzV2l6YXJkLk1haW5QYWdlLmRlc2MiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVEFCTEVfTEFCRUwgPQotCQkiTmV3VXBkYXRlc1dpemFyZC5NYWluUGFnZS50YWJsZUxhYmVsIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NFTEVDVF9BTEwgPQotCQkiTmV3VXBkYXRlc1dpemFyZC5NYWluUGFnZS5zZWxlY3RBbGwiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfREVTRUxFQ1RfQUxMID0KLQkJIk5ld1VwZGF0ZXNXaXphcmQuTWFpblBhZ2UuZGVzZWxlY3RBbGwiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTU9SRV9JTkZPID0KLQkJIk5ld1VwZGF0ZXNXaXphcmQuTWFpblBhZ2UubW9yZUluZm8iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRkVBVFVSRV9ERVNDID0KLQkJIk5ld1VwZGF0ZXNXaXphcmQuTWFpblBhZ2UuZmVhdHVyZURlc2MiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09VTlRFUiA9Ci0JCSJOZXdVcGRhdGVzV2l6YXJkLk1haW5QYWdlLmNvdW50ZXIiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ19GRUFUVVJFID0KLQkJIk5ld1VwZGF0ZXNXaXphcmQuTWFpblBhZ2UuY29sdW1uLmZlYXR1cmUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ19QUk9WSURFUiA9Ci0JCSJOZXdVcGRhdGVzV2l6YXJkLk1haW5QYWdlLmNvbHVtbi5wcm92aWRlciI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DX1ZFUlNJT04gPQotCQkiTmV3VXBkYXRlc1dpemFyZC5NYWluUGFnZS5jb2x1bW4udmVyc2lvbiI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DX1NJWkUgPQotCQkiTmV3VXBkYXRlc1dpemFyZC5NYWluUGFnZS5jb2x1bW4uc2l6ZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9VTktOT1dOX1NJWkUgPQotCQkiTmV3VXBkYXRlc1dpemFyZC5NYWluUGFnZS5jb2x1bW4uc2l6ZVVua25vd24iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRklMVEVSX0NIRUNLID0KLQkJIk5ld1VwZGF0ZXNXaXphcmQuTWFpblBhZ2UuZmlsdGVyQ2hlY2siOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRFVQTElDQVRFX1dBUk5JTkcgPQotCQkiTmV3VXBkYXRlc1dpemFyZC5NYWluUGFnZS5kdXBsaWNhdGVXYXJuaW5nIjsKLQlwcml2YXRlIENoZWNrYm94VGFibGVWaWV3ZXIgdGFibGVWaWV3ZXI7Ci0JcHJpdmF0ZSBJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnOwotCXByaXZhdGUgUGVuZGluZ0NoYW5nZVtdIHBlbmRpbmdDaGFuZ2VzOwotCXByaXZhdGUgTGFiZWwgY291bnRlckxhYmVsOwotCXByaXZhdGUgQnV0dG9uIGZpbHRlckNoZWNrOwotCXByaXZhdGUgQnV0dG9uIG1vcmVJbmZvQnV0dG9uOwotCXByaXZhdGUgVGV4dCBkZXNjcmlwdGlvbkFyZWE7Ci0JcHJpdmF0ZSBDb250YWlubWVudEZpbHRlciBmaWx0ZXIgPSBuZXcgQ29udGFpbm1lbnRGaWx0ZXIoKTsKLQotCWNsYXNzIFRhYmxlQ29udGVudFByb3ZpZGVyCi0JCWV4dGVuZHMgRGVmYXVsdENvbnRlbnRQcm92aWRlcgotCQlpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHsKLQotCQkvKioKLQkJICogQHNlZSBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciNnZXRFbGVtZW50cyhPYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IHBhcmVudCkgewotCQkJcmV0dXJuIHBlbmRpbmdDaGFuZ2VzOwotCQl9Ci0JfQotCi0JY2xhc3MgVGFibGVMYWJlbFByb3ZpZGVyCi0JCWV4dGVuZHMgTGFiZWxQcm92aWRlcgotCQlpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCQkvKioKLQkJKiBAc2VlIElUYWJsZUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0LCBpbnQpCi0JCSovCi0JCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3Qgb2JqLCBpbnQgY29sKSB7Ci0JCQlpZiAoY29sID09IDApIHsKLQkJCQl0cnkgewotCQkJCQlJRmVhdHVyZSBmZWF0dXJlID0gKChJRmVhdHVyZUFkYXB0ZXIpIG9iaikuZ2V0RmVhdHVyZShudWxsKTsKLQkJCQkJYm9vbGVhbiBwYXRjaCA9IGZlYXR1cmUuaXNQYXRjaCgpOwotCQkJCQlyZXR1cm4gVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKS5nZXQoCi0JCQkJCQlwYXRjaAotCQkJCQkJCT8gVXBkYXRlVUlJbWFnZXMuREVTQ19FRklYX09CSgotCQkJCQkJCTogVXBkYXRlVUlJbWFnZXMuREVTQ19GRUFUVVJFX09CSik7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXJldHVybiBVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0TGFiZWxQcm92aWRlcigpLmdldCgKLQkJCQkJCVVwZGF0ZVVJSW1hZ2VzLkRFU0NfRkVBVFVSRV9PQkosCi0JCQkJCQlVcGRhdGVMYWJlbFByb3ZpZGVyLkZfRVJST1IpOwotCQkJCX0KLQkJCX0gZWxzZQotCQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgSVRhYmxlTGFiZWxQcm92aWRlciNnZXRDb2x1bW5UZXh0KE9iamVjdCwgaW50KQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmosIGludCBjb2wpIHsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBJRmVhdHVyZUFkYXB0ZXIpIHsKLQotCQkJCXRyeSB7Ci0JCQkJCUlGZWF0dXJlIGZlYXR1cmUgPSAoKElGZWF0dXJlQWRhcHRlcikgb2JqKS5nZXRGZWF0dXJlKG51bGwpOwotCi0JCQkJCXN3aXRjaCAoY29sKSB7Ci0JCQkJCQljYXNlIDAgOgotCQkJCQkJCXJldHVybiBmZWF0dXJlLmdldExhYmVsKCk7Ci0JCQkJCQljYXNlIDEgOgotCQkJCQkJCXJldHVybiBmZWF0dXJlCi0JCQkJCQkJCS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkKLQkJCQkJCQkJLmdldFZlcnNpb24oKQotCQkJCQkJCQkudG9TdHJpbmcoKTsKLQkJCQkJCWNhc2UgMiA6Ci0JCQkJCQkJcmV0dXJuIGZlYXR1cmUuZ2V0UHJvdmlkZXIoKTsKLQkJCQkJCWNhc2UgMyA6Ci0JCQkJCQkJbG9uZyBzaXplID0gZmVhdHVyZS5nZXREb3dubG9hZFNpemUoKTsKLQkJCQkJCQlpZiAoc2l6ZSA9PSAtMSkKLQkJCQkJCQkJcmV0dXJuIFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfVU5LTk9XTl9TSVpFKTsKLQkJCQkJCQllbHNlCi0JCQkJCQkJCXJldHVybiBmZWF0dXJlLmdldERvd25sb2FkU2l6ZSgpICsgIktCIjsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlVcGRhdGVVSS5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJCXJldHVybiAiPz8iOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiAiIjsKLQkJfQotCX0KLQotCWNsYXNzIENvbnRhaW5tZW50RmlsdGVyIGV4dGVuZHMgVmlld2VyRmlsdGVyIHsKLQkJcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2LCBPYmplY3QgcGFyZW50LCBPYmplY3QgY2hpbGQpIHsKLQkJCXJldHVybiAhaXNDb250YWluZWQoKFBlbmRpbmdDaGFuZ2UpIGNoaWxkKTsKLQkJfQotCQlwcml2YXRlIGJvb2xlYW4gaXNDb250YWluZWQoUGVuZGluZ0NoYW5nZSBqb2IpIHsKLQkJCVZlcnNpb25lZElkZW50aWZpZXIgdmlkID0gam9iLmdldEZlYXR1cmUoKS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7Ci0JCQkvL09iamVjdFtdIHNlbGVjdGVkID0gdGFibGVWaWV3ZXIuZ2V0Q2hlY2tlZEVsZW1lbnRzKCk7Ci0JCQlPYmplY3QgW10gc2VsZWN0ZWQgPSBwZW5kaW5nQ2hhbmdlczsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0ZWQubGVuZ3RoOyBpKyspIHsKLQkJCQlQZW5kaW5nQ2hhbmdlIGNhbmRpZGF0ZSA9IChQZW5kaW5nQ2hhbmdlKSBzZWxlY3RlZFtpXTsKLQkJCQlpZiAoY2FuZGlkYXRlLmVxdWFscyhqb2IpKQotCQkJCQljb250aW51ZTsKLQkJCQlJRmVhdHVyZSBmZWF0dXJlID0gY2FuZGlkYXRlLmdldEZlYXR1cmUoKTsKLQkJCQlpZiAoaW5jbHVkZXMoZmVhdHVyZSwgdmlkKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcHJpdmF0ZSBib29sZWFuIGluY2x1ZGVzKElGZWF0dXJlIGZlYXR1cmUsIFZlcnNpb25lZElkZW50aWZpZXIgdmlkKSB7Ci0JCQl0cnkgewotCQkJCUlGZWF0dXJlUmVmZXJlbmNlW10gaXJlZnMgPQotCQkJCQlmZWF0dXJlLmdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGlyZWZzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlGZWF0dXJlUmVmZXJlbmNlIGlyZWYgPSBpcmVmc1tpXTsKLQkJCQkJSUZlYXR1cmUgaWZlYXR1cmUgPSBpcmVmLmdldEZlYXR1cmUobnVsbCk7Ci0JCQkJCVZlcnNpb25lZElkZW50aWZpZXIgaXZpZCA9Ci0JCQkJCQlpZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7Ci0JCQkJCWlmIChpdmlkLmVxdWFscyh2aWQpKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCWlmIChpbmNsdWRlcyhpZmVhdHVyZSwgdmlkKSkKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFJldmlld1BhZ2UKLQkgKi8KLQlwdWJsaWMgTmV3VXBkYXRlc1dpemFyZFBhZ2UoCi0JCVBlbmRpbmdDaGFuZ2VbXSBjaGFuZ2VzLAotCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCXN1cGVyKCJUYXJnZXQiKTsKLQkJc2V0VGl0bGUoVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9USVRMRSkpOwotCQlzZXREZXNjcmlwdGlvbihVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX0RFU0MpKTsKLQkJdGhpcy5jb25maWcgPSBjb25maWc7Ci0JCXRoaXMucGVuZGluZ0NoYW5nZXMgPSBjaGFuZ2VzOwotCQlVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0TGFiZWxQcm92aWRlcigpLmNvbm5lY3QodGhpcyk7Ci0JCXNldEJhbm5lclZpc2libGUoZmFsc2UpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCVVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRMYWJlbFByb3ZpZGVyKCkuZGlzY29ubmVjdCh0aGlzKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjbGllbnQgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWNsaWVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY3JlYXRlVGFibGVWaWV3ZXIoY2xpZW50KTsKLQkJQ29tcG9zaXRlIGJ1dHRvbkNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUoY2xpZW50LCBTV1QuTlVMTCk7Ci0JCUdyaWRMYXlvdXQgYmxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWJsYXlvdXQubWFyZ2luV2lkdGggPSBibGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWJ1dHRvbkNvbnRhaW5lci5zZXRMYXlvdXQoYmxheW91dCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfVkVSVElDQUwpOwotCQlidXR0b25Db250YWluZXIuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29udGFpbmVyLCBTV1QuUFVTSCk7Ci0JCWJ1dHRvbi5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfU0VMRUNUX0FMTCkpOwotCQlidXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc2VsZWN0QWxsKHRydWUpOwotCQkJfQotCQl9KTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJYnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQlTV1RVdGlsLnNldEJ1dHRvbkRpbWVuc2lvbkhpbnQoYnV0dG9uKTsKLQotCQlidXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbnRhaW5lciwgU1dULlBVU0gpOwotCQlidXR0b24uc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX0RFU0VMRUNUX0FMTCkpOwotCQlidXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc2VsZWN0QWxsKGZhbHNlKTsKLQkJCX0KLQkJfSk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJU1dUVXRpbC5zZXRCdXR0b25EaW1lbnNpb25IaW50KGJ1dHRvbik7Ci0KLQkJbW9yZUluZm9CdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbnRhaW5lciwgU1dULlBVU0gpOwotCQltb3JlSW5mb0J1dHRvbi5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfTU9SRV9JTkZPKSk7Ci0JCW1vcmVJbmZvQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWRvTW9yZUluZm8oKTsKLQkJCX0KLQkJfSk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCW1vcmVJbmZvQnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQlTV1RVdGlsLnNldEJ1dHRvbkRpbWVuc2lvbkhpbnQobW9yZUluZm9CdXR0b24pOwotCi0JCXRhYmxlVmlld2VyLnNldElucHV0KFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRVcGRhdGVNb2RlbCgpKTsKLQkJLy90YWJsZVZpZXdlci5zZXRDaGVja2VkRWxlbWVudHMocGVuZGluZ0NoYW5nZXMpOwotCQlzZWxlY3RUcnVlVXBkYXRlcygpOwotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNsaWVudCwgU1dULk5VTEwpOwotCQlsYWJlbC5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfRkVBVFVSRV9ERVNDKSk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJZGVzY3JpcHRpb25BcmVhID0KLQkJCW5ldyBUZXh0KGNsaWVudCwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSB8IFNXVC5XUkFQIHwgU1dULlJFQURfT05MWSk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWdkLmhlaWdodEhpbnQgPSA2NDsKLQkJZGVzY3JpcHRpb25BcmVhLnNldExheW91dERhdGEoZ2QpOwotCi0JCW5ldyBMYWJlbChjbGllbnQsIFNXVC5OVUxMKTsKLQotCQljb3VudGVyTGFiZWwgPSBuZXcgTGFiZWwoY2xpZW50LCBTV1QuTlVMTCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJY291bnRlckxhYmVsLnNldExheW91dERhdGEoZ2QpOwotCQlmaWx0ZXJDaGVjayA9IG5ldyBCdXR0b24oY2xpZW50LCBTV1QuQ0hFQ0spOwotCQlmaWx0ZXJDaGVjay5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfRklMVEVSX0NIRUNLKSk7Ci0JCWZpbHRlckNoZWNrLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJdGFibGVWaWV3ZXIuYWRkRmlsdGVyKGZpbHRlcik7Ci0JCWZpbHRlckNoZWNrLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWlmIChmaWx0ZXJDaGVjay5nZXRTZWxlY3Rpb24oKSkKLQkJCQkJdGFibGVWaWV3ZXIuYWRkRmlsdGVyKGZpbHRlcik7Ci0JCQkJZWxzZQotCQkJCQl0YWJsZVZpZXdlci5yZW1vdmVGaWx0ZXIoZmlsdGVyKTsKLQkJCQlwYWdlQ2hhbmdlZCgpOwotCQkJfQotCQl9KTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlmaWx0ZXJDaGVjay5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlwYWdlQ2hhbmdlZCgpOwotCQlXb3JrYmVuY2hIZWxwLnNldEhlbHAoCi0JCQljbGllbnQsCi0JCQkib3JnLmVjbGlwc2UudXBkYXRlLnVpLk5ld1VwZGF0ZXNXaXphcmRQYWdlIik7Ci0JCXJldHVybiBjbGllbnQ7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzZWxlY3RUcnVlVXBkYXRlcygpIHsKLQkJQXJyYXlMaXN0IHRydWVVcGRhdGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpPTA7IGk8cGVuZGluZ0NoYW5nZXMubGVuZ3RoOyBpKyspIHsKLQkJCVBlbmRpbmdDaGFuZ2Ugam9iID0gcGVuZGluZ0NoYW5nZXNbaV07Ci0JCQlpZiAoIVVwZGF0ZVVJLmlzUGF0Y2goam9iLmdldEZlYXR1cmUoKSkpCi0JCQkJdHJ1ZVVwZGF0ZXMuYWRkKGpvYik7Ci0JCX0KLQkJdGFibGVWaWV3ZXIuc2V0Q2hlY2tlZEVsZW1lbnRzKHRydWVVcGRhdGVzLnRvQXJyYXkoKSk7IAotCX0KLQotCXByaXZhdGUgdm9pZCBzZWxlY3RBbGwoYm9vbGVhbiBzdGF0ZSkgewotCQl0YWJsZVZpZXdlci5zZXRBbGxDaGVja2VkKHN0YXRlKTsKLQkJcGFnZUNoYW5nZWQoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcGFnZUNoYW5nZWQoKSB7Ci0JCU9iamVjdFtdIGNoZWNrZWQgPSB0YWJsZVZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKTsKLQkJaW50IHRvdGFsQ291bnQgPSB0YWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW1Db3VudCgpOwotCQlzZXRQYWdlQ29tcGxldGUoY2hlY2tlZC5sZW5ndGggPiAwKTsKLQkJU3RyaW5nIHRvdGFsID0gIiIgKyB0b3RhbENvdW50OwotCQlTdHJpbmcgc2VsZWN0ZWQgPSAiIiArIGNoZWNrZWQubGVuZ3RoOwotCQljb3VudGVyTGFiZWwuc2V0VGV4dCgKLQkJCVVwZGF0ZVVJLmdldEZvcm1hdHRlZE1lc3NhZ2UoCi0JCQkJS0VZX0NPVU5URVIsCi0JCQkJbmV3IFN0cmluZ1tdIHsgc2VsZWN0ZWQsIHRvdGFsIH0pKTsKLQkJYm9vbGVhbiBkdXBsaWNhdGVzID0gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hlY2tlZC5sZW5ndGg7IGkrKykgewotCQkJUGVuZGluZ0NoYW5nZSBqb2IgPSAoUGVuZGluZ0NoYW5nZSkgY2hlY2tlZFtpXTsKLQkJCWlmIChmaWx0ZXIuaXNDb250YWluZWQoam9iKSkgewotCQkJCWR1cGxpY2F0ZXMgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmICghZHVwbGljYXRlcykKLQkJCXNldE1lc3NhZ2UobnVsbCk7Ci0JCWVsc2UKLQkJCXNldE1lc3NhZ2UoVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9EVVBMSUNBVEVfV0FSTklORyksIFdBUk5JTkcpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUYWJsZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOwotCQlsYWJlbC5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfVEFCTEVfTEFCRUwpKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQl0YWJsZVZpZXdlciA9Ci0JCQlDaGVja2JveFRhYmxlVmlld2VyLm5ld0NoZWNrTGlzdCgKLQkJCQlwYXJlbnQsCi0JCQkJU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUiB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCVRhYmxlIHRhYmxlID0gdGFibGVWaWV3ZXIuZ2V0VGFibGUoKTsKLQkJdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQotCQlUYWJsZUNvbHVtbiBjb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OVUxMKTsKLQkJY29sdW1uLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9DX0ZFQVRVUkUpKTsKLQotCQljb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OVUxMKTsKLQkJY29sdW1uLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9DX1ZFUlNJT04pKTsKLQotCQljb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OVUxMKTsKLQkJY29sdW1uLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9DX1BST1ZJREVSKSk7Ci0KLQkJY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTlVMTCk7Ci0JCWNvbHVtbi5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfQ19TSVpFKSk7Ci0KLQkJVGFibGVMYXlvdXQgbGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0JCWxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDEwMCwgMjAwLCB0cnVlKSk7Ci0JCWxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDEwMCwgNTAsIHRydWUpKTsKLQkJbGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoMTAwLCAxMDAsIHRydWUpKTsKLQkJbGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoMTAwLCB0cnVlKSk7Ci0JCXRhYmxlLnNldExheW91dChsYXlvdXQpOwotCi0JCXRhYmxlLnNldExheW91dERhdGEoZ2QpOwotCQl0YWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IFRhYmxlQ29udGVudFByb3ZpZGVyKCkpOwotCQl0YWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBUYWJsZUxhYmVsUHJvdmlkZXIoKSk7Ci0JCXRhYmxlVmlld2VyLmFkZENoZWNrU3RhdGVMaXN0ZW5lcihuZXcgSUNoZWNrU3RhdGVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoZWNrU3RhdGVDaGFuZ2VkKENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlwYWdlQ2hhbmdlZCgpOwotCQkJfQotCQl9KTsKLQkJdGFibGVWaWV3ZXIKLQkJCS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBlKSB7Ci0JCQkJdGFibGVTZWxlY3Rpb25DaGFuZ2VkKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCQl9Ci0JCX0pOwotCQl0YWJsZVZpZXdlci5zZXRTb3J0ZXIobmV3IEZlYXR1cmVTb3J0ZXIoKSB7Ci0JCQlwdWJsaWMgaW50IGNhdGVnb3J5KE9iamVjdCBvYmopIHsKLQkJCQlQZW5kaW5nQ2hhbmdlIGpvYiA9IChQZW5kaW5nQ2hhbmdlKW9iajsKLQkJCQlpZiAoVXBkYXRlVUkuaXNQYXRjaChqb2IuZ2V0RmVhdHVyZSgpKSkKLQkJCQkJcmV0dXJuIDE7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgdm9pZCB0YWJsZVNlbGVjdGlvbkNoYW5nZWQoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCVBlbmRpbmdDaGFuZ2Ugc2VsZWN0ZWRKb2IgPSAoUGVuZGluZ0NoYW5nZSkgc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQlJRmVhdHVyZSBmZWF0dXJlID0KLQkJCXNlbGVjdGVkSm9iICE9IG51bGwgPyBzZWxlY3RlZEpvYi5nZXRGZWF0dXJlKCkgOiBudWxsOwotCQlJVVJMRW50cnkgZGVzY0VudHJ5ID0gbnVsbDsKLQotCQlpZiAoZmVhdHVyZSAhPSBudWxsKQotCQkJZGVzY0VudHJ5ID0gZmVhdHVyZS5nZXREZXNjcmlwdGlvbigpOwotCi0JCW1vcmVJbmZvQnV0dG9uLnNldEVuYWJsZWQoCi0JCQlkZXNjRW50cnkgIT0gbnVsbCAmJiBkZXNjRW50cnkuZ2V0VVJMKCkgIT0gbnVsbCk7Ci0JCVN0cmluZyB0ZXh0ID0gZGVzY0VudHJ5ICE9IG51bGwgPyBkZXNjRW50cnkuZ2V0QW5ub3RhdGlvbigpIDogbnVsbDsKLQkJZGVzY3JpcHRpb25BcmVhLnNldFRleHQodGV4dCAhPSBudWxsID8gdGV4dCA6ICIiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZG9Nb3JlSW5mbygpIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0KLQkJCShJU3RydWN0dXJlZFNlbGVjdGlvbikgdGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCVBlbmRpbmdDaGFuZ2Ugc2VsZWN0ZWRKb2IgPSAoUGVuZGluZ0NoYW5nZSkgc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQlJRmVhdHVyZSBmZWF0dXJlID0KLQkJCXNlbGVjdGVkSm9iICE9IG51bGwgPyBzZWxlY3RlZEpvYi5nZXRGZWF0dXJlKCkgOiBudWxsOwotCQlVUkwgdXJsID0gbnVsbDsKLQotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlJVVJMRW50cnkgZGVzY0VudHJ5ID0gZmVhdHVyZS5nZXREZXNjcmlwdGlvbigpOwotCQkJaWYgKGRlc2NFbnRyeSAhPSBudWxsKQotCQkJCXVybCA9IGRlc2NFbnRyeS5nZXRVUkwoKTsKLQkJfQotCQlpZiAodXJsICE9IG51bGwpCi0JCQlEZXRhaWxzVmlldy5zaG93VVJMKHVybC50b1N0cmluZygpLCBmYWxzZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLQkJc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLQkJaWYgKHZpc2libGUpIHsKLQkJCXRhYmxlVmlld2VyLmdldFRhYmxlKCkuc2V0Rm9jdXMoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBQZW5kaW5nQ2hhbmdlW10gZ2V0U2VsZWN0ZWRKb2JzKCkgewotCQlPYmplY3RbXSBzZWxlY3RlZCA9IHRhYmxlVmlld2VyLmdldENoZWNrZWRFbGVtZW50cygpOwotCQlQZW5kaW5nQ2hhbmdlW10gam9icyA9IG5ldyBQZW5kaW5nQ2hhbmdlW3NlbGVjdGVkLmxlbmd0aF07Ci0JCVN5c3RlbS5hcnJheWNvcHkoc2VsZWN0ZWQsIDAsIGpvYnMsIDAsIHNlbGVjdGVkLmxlbmd0aCk7Ci0JCXJldHVybiBqb2JzOwotCX0KLQotCXB1YmxpYyBQZW5kaW5nQ2hhbmdlW10gZ2V0U2VsZWN0ZWRKb2JzV2l0aExpY2Vuc2VzKCkgewotCQlPYmplY3RbXSBzZWxlY3RlZCA9IHRhYmxlVmlld2VyLmdldENoZWNrZWRFbGVtZW50cygpOwotCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3RlZC5sZW5ndGg7IGkrKykgewotCQkJUGVuZGluZ0NoYW5nZSBqb2IgPSAoUGVuZGluZ0NoYW5nZSkgc2VsZWN0ZWRbaV07Ci0JCQlpZiAoVXBkYXRlTW9kZWwuaGFzTGljZW5zZShqb2IpKQotCQkJCWxpc3QuYWRkKGpvYik7Ci0JCX0KLQkJcmV0dXJuIChQZW5kaW5nQ2hhbmdlW10pIGxpc3QudG9BcnJheShuZXcgUGVuZGluZ0NoYW5nZVtsaXN0LnNpemUoKV0pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvTmV3V2l6YXJkLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9OZXdXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU1N2Q3NC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9OZXdXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLQotcHVibGljIGNsYXNzIE5ld1dpemFyZCBleHRlbmRzIFdpemFyZCB7Ci0JcHJvdGVjdGVkIEJhc2VOZXdXaXphcmRQYWdlIHBhZ2U7Ci0KLQlwdWJsaWMgTmV3V2l6YXJkKEJhc2VOZXdXaXphcmRQYWdlIHBhZ2UsIEltYWdlRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCXRoaXMucGFnZSA9IHBhZ2U7Ci0JCXNldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKGRlc2NyaXB0b3IpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJYWRkUGFnZShwYWdlKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQlyZXR1cm4gcGFnZS5maW5pc2goKTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9PcHRpb25hbEZlYXR1cmVzUGFnZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvT3B0aW9uYWxGZWF0dXJlc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYxOTEyNi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9PcHRpb25hbEZlYXR1cmVzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLndpemFyZHM7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuV29ya2JlbmNoSGVscDsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi5JSW5zdGFsbENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWwuUGVuZGluZ0NoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkucGFydHMuKjsKLQotcHVibGljIGNsYXNzIE9wdGlvbmFsRmVhdHVyZXNQYWdlIGV4dGVuZHMgQmFubmVyUGFnZSB7Ci0JLy8gTkwga2V5cwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVElUTEUgPQotCQkiSW5zdGFsbFdpemFyZC5PcHRpb25hbEZlYXR1cmVzUGFnZS50aXRsZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ERVNDID0KLQkJIkluc3RhbGxXaXphcmQuT3B0aW9uYWxGZWF0dXJlc1BhZ2UuZGVzYyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9UUkVFX0xBQkVMID0KLQkJIkluc3RhbGxXaXphcmQuT3B0aW9uYWxGZWF0dXJlc1BhZ2UudHJlZUxhYmVsIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NFTEVDVF9BTEwgPQotCQkiSW5zdGFsbFdpemFyZC5PcHRpb25hbEZlYXR1cmVzUGFnZS5zZWxlY3RBbGwiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfREVTRUxFQ1RfQUxMID0KLQkJIkluc3RhbGxXaXphcmQuT3B0aW9uYWxGZWF0dXJlc1BhZ2UuZGVzZWxlY3RBbGwiOwotCXByaXZhdGUgQ2hlY2tib3hUcmVlVmlld2VyIHRyZWVWaWV3ZXI7Ci0JcHJpdmF0ZSBJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnOwotCXByaXZhdGUgUGVuZGluZ0NoYW5nZSBwZW5kaW5nQ2hhbmdlOwotCXByaXZhdGUgT2JqZWN0W10gZWxlbWVudHM7Ci0JcHJpdmF0ZSBib29sZWFuIHBhdGNoOwotCi0JY2xhc3MgVHJlZUNvbnRlbnRQcm92aWRlcgotCQlleHRlbmRzIERlZmF1bHRDb250ZW50UHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJVHJlZUNvbnRlbnRQcm92aWRlciB7Ci0KLQkJcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnQpIHsKLQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBGZWF0dXJlSGllcmFyY2h5RWxlbWVudCkgewotCQkJCUZlYXR1cmVIaWVyYXJjaHlFbGVtZW50IGZlID0gKEZlYXR1cmVIaWVyYXJjaHlFbGVtZW50KSBwYXJlbnQ7Ci0JCQkJcmV0dXJuIGZlLmdldENoaWxkcmVuKHBlbmRpbmdDaGFuZ2UuZ2V0T2xkRmVhdHVyZSgpICE9IG51bGwsIHBhdGNoLCBjb25maWcpOwotCQkJfQotCQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgY2hpbGQpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IHBhcmVudCkgewotCQkJcmV0dXJuIGdldENoaWxkcmVuKHBhcmVudCkubGVuZ3RoID4gMDsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXQpIHsKLQkJCWlmIChlbGVtZW50cyA9PSBudWxsKQotCQkJCWNvbXB1dGVFbGVtZW50cygpOwotCQkJcmV0dXJuIGVsZW1lbnRzOwotCQl9Ci0JfQotCi0JY2xhc3MgVHJlZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIHsKLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmopIHsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBGZWF0dXJlSGllcmFyY2h5RWxlbWVudCkgewotCQkJCUZlYXR1cmVIaWVyYXJjaHlFbGVtZW50IGZlID0gKEZlYXR1cmVIaWVyYXJjaHlFbGVtZW50KSBvYmo7Ci0JCQkJU3RyaW5nIG5hbWUgPSBmZS5nZXRMYWJlbCgpOwotCQkJCWlmIChuYW1lICE9IG51bGwpCi0JCQkJCXJldHVybiBuYW1lOwotCQkJfQotCQkJcmV0dXJuIHN1cGVyLmdldFRleHQob2JqKTsKLQkJfQotCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IG9iaikgewotCQkJcmV0dXJuIFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRMYWJlbFByb3ZpZGVyKCkuZ2V0KAotCQkJCVVwZGF0ZVVJSW1hZ2VzLkRFU0NfRkVBVFVSRV9PQkopOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFJldmlld1BhZ2UKLQkgKi8KLQlwdWJsaWMgT3B0aW9uYWxGZWF0dXJlc1BhZ2UoCi0JCVBlbmRpbmdDaGFuZ2UgcGVuZGluZ0NoYW5nZSwKLQkJSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlzdXBlcigiT3B0aW9uYWxGZWF0dXJlcyIpOwotCQlzZXRUaXRsZShVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX1RJVExFKSk7Ci0JCXNldERlc2NyaXB0aW9uKFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfREVTQykpOwotCQl0aGlzLmNvbmZpZyA9IGNvbmZpZzsKLQkJdGhpcy5wZW5kaW5nQ2hhbmdlID0gcGVuZGluZ0NoYW5nZTsKLQkJVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKS5jb25uZWN0KHRoaXMpOwotCQlwYXRjaCA9IFVwZGF0ZVVJLmlzUGF0Y2gocGVuZGluZ0NoYW5nZS5nZXRGZWF0dXJlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCVVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRMYWJlbFByb3ZpZGVyKCkuZGlzY29ubmVjdCh0aGlzKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjbGllbnQgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWNsaWVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY3JlYXRlQ2hlY2tib3hUcmVlVmlld2VyKGNsaWVudCk7Ci0JCUJ1dHRvbiBzZWxlY3RBbGxCdXR0b24gPSBuZXcgQnV0dG9uKGNsaWVudCwgU1dULlBVU0gpOwotCQlzZWxlY3RBbGxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc2VsZWN0QWxsKHRydWUpOwotCQkJfQotCQl9KTsKLQkJc2VsZWN0QWxsQnV0dG9uLnNldFRleHQoCi0JCQlVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX1NFTEVDVF9BTEwpKTsKLQkJR3JpZERhdGEgZ2QgPQotCQkJbmV3IEdyaWREYXRhKAotCQkJCUdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTAotCQkJCQl8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7Ci0JCXNlbGVjdEFsbEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJU1dUVXRpbC5zZXRCdXR0b25EaW1lbnNpb25IaW50KHNlbGVjdEFsbEJ1dHRvbik7Ci0KLQkJQnV0dG9uIGRlc2VsZWN0QWxsQnV0dG9uID0gbmV3IEJ1dHRvbihjbGllbnQsIFNXVC5QVVNIKTsKLQkJZGVzZWxlY3RBbGxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc2VsZWN0QWxsKGZhbHNlKTsKLQkJCX0KLQkJfSk7Ci0JCWRlc2VsZWN0QWxsQnV0dG9uLnNldFRleHQoCi0JCQlVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX0RFU0VMRUNUX0FMTCkpOwotCQlnZCA9Ci0JCQluZXcgR3JpZERhdGEoCi0JCQkJR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMCi0JCQkJCXwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkJZGVzZWxlY3RBbGxCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCVNXVFV0aWwuc2V0QnV0dG9uRGltZW5zaW9uSGludChkZXNlbGVjdEFsbEJ1dHRvbik7Ci0JCVdvcmtiZW5jaEhlbHAuc2V0SGVscChjbGllbnQsICJvcmcuZWNsaXBzZS51cGRhdGUudWkuT3B0aW9uYWxGZWF0dXJlc1BhZ2UiKTsKLQkJcmV0dXJuIGNsaWVudDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlQ2hlY2tib3hUcmVlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWxhYmVsLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9UUkVFX0xBQkVMKSk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXRyZWVWaWV3ZXIgPQotCQkJbmV3IENoZWNrYm94VHJlZVZpZXdlcigKLQkJCQlwYXJlbnQsCi0JCQkJU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWdkLnZlcnRpY2FsU3BhbiA9IDI7Ci0JCVRyZWUgdHJlZSA9IHRyZWVWaWV3ZXIuZ2V0VHJlZSgpOwotCQl0cmVlLnNldExheW91dERhdGEoZ2QpOwotCQl0cmVlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgVHJlZUNvbnRlbnRQcm92aWRlcigpKTsKLQkJdHJlZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBUcmVlTGFiZWxQcm92aWRlcigpKTsKLQkJdHJlZVZpZXdlci5hZGRDaGVja1N0YXRlTGlzdGVuZXIobmV3IElDaGVja1N0YXRlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGUpIHsKLQkJCQloYW5kbGVDaGVja2VkKGUuZ2V0RWxlbWVudCgpLCBlLmdldENoZWNrZWQoKSk7Ci0JCQl9Ci0JCX0pOwotCQl0cmVlVmlld2VyLnNldEF1dG9FeHBhbmRMZXZlbChBYnN0cmFjdFRyZWVWaWV3ZXIuQUxMX0xFVkVMUyk7Ci0JCS8qCi0JCXRyZWVWaWV3ZXIuYWRkRmlsdGVyKG5ldyBWaWV3ZXJGaWx0ZXIoKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBzZWxlY3QoVmlld2VyIHYsIE9iamVjdCBwYXJlbnQsIE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJSUZlYXR1cmVSZWZlcmVuY2UgcmVmZXJlbmNlID0gKElGZWF0dXJlUmVmZXJlbmNlKWVsZW1lbnQ7Ci0JCQkJaWYgKHJlZmVyZW5jZS5pc09wdGlvbmFsKCkpIHJldHVybiB0cnVlOwotCQkJCXJldHVybiBJbnN0YWxsV2l6YXJkLmhhc09wdGlvbmFsRmVhdHVyZXMocmVmZXJlbmNlKTsKLQkJCX0KLQkJfSk7Ci0JCSovCi0JCXRyZWVWaWV3ZXIuc2V0SW5wdXQocGVuZGluZ0NoYW5nZSk7Ci0JCWluaXRpYWxpemVTdGF0ZXMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotCQlzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotCQlpZiAodmlzaWJsZSkgewotCQkJdHJlZVZpZXdlci5nZXRUcmVlKCkuc2V0Rm9jdXMoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjb21wdXRlRWxlbWVudHMoKSB7Ci0JCUlGZWF0dXJlIG9sZEZlYXR1cmUgPSBwZW5kaW5nQ2hhbmdlLmdldE9sZEZlYXR1cmUoKTsKLQkJSUZlYXR1cmUgbmV3RmVhdHVyZSA9IHBlbmRpbmdDaGFuZ2UuZ2V0RmVhdHVyZSgpOwotCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJRmVhdHVyZUhpZXJhcmNoeUVsZW1lbnQuY29tcHV0ZUVsZW1lbnRzKAotCQkJb2xkRmVhdHVyZSwKLQkJCW5ld0ZlYXR1cmUsCi0JCQlvbGRGZWF0dXJlICE9IG51bGwsCi0JCQlwYXRjaCwgCi0JCQljb25maWcsCi0JCQlsaXN0KTsKLQkJZWxlbWVudHMgPSBsaXN0LnRvQXJyYXkoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVN0YXRlcygpIHsKLQkJaWYgKGVsZW1lbnRzID09IG51bGwpCi0JCQljb21wdXRlRWxlbWVudHMoKTsKLQkJQXJyYXlMaXN0IGNoZWNrZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUFycmF5TGlzdCBncmF5ZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWluaXRpYWxpemVTdGF0ZXMoZWxlbWVudHMsIGNoZWNrZWQsIGdyYXllZCk7Ci0JCXRyZWVWaWV3ZXIuc2V0Q2hlY2tlZEVsZW1lbnRzKGNoZWNrZWQudG9BcnJheSgpKTsKLQkJdHJlZVZpZXdlci5zZXRHcmF5ZWRFbGVtZW50cyhncmF5ZWQudG9BcnJheSgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVN0YXRlcygKLQkJT2JqZWN0W10gZWxlbWVudHMsCi0JCUFycmF5TGlzdCBjaGVja2VkLAotCQlBcnJheUxpc3QgZ3JheWVkKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCUZlYXR1cmVIaWVyYXJjaHlFbGVtZW50IGVsZW1lbnQgPQotCQkJCShGZWF0dXJlSGllcmFyY2h5RWxlbWVudCkgZWxlbWVudHNbaV07Ci0JCQlpZiAoZWxlbWVudC5pc0NoZWNrZWQoKSkKLQkJCQljaGVja2VkLmFkZChlbGVtZW50KTsKLQkJCWlmICghZWxlbWVudC5pc0VkaXRhYmxlKCkpCi0JCQkJZ3JheWVkLmFkZChlbGVtZW50KTsKLQkJCU9iamVjdFtdIGNoaWxkcmVuID0KLQkJCQllbGVtZW50LmdldENoaWxkcmVuKHBlbmRpbmdDaGFuZ2UuZ2V0T2xkRmVhdHVyZSgpICE9IG51bGwsIHBhdGNoLCBjb25maWcpOwotCQkJaW5pdGlhbGl6ZVN0YXRlcyhjaGlsZHJlbiwgY2hlY2tlZCwgZ3JheWVkKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzZWxlY3RBbGwoYm9vbGVhbiB2YWx1ZSkgewotCQlBcnJheUxpc3Qgc2VsZWN0ZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJRmVhdHVyZUhpZXJhcmNoeUVsZW1lbnQgZWxlbWVudCA9Ci0JCQkJKEZlYXR1cmVIaWVyYXJjaHlFbGVtZW50KSBlbGVtZW50c1tpXTsKLQkJCXNlbGVjdEFsbChlbGVtZW50LCBzZWxlY3RlZCwgdmFsdWUpOwotCQl9Ci0JCXRyZWVWaWV3ZXIuc2V0Q2hlY2tlZEVsZW1lbnRzKHNlbGVjdGVkLnRvQXJyYXkoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNlbGVjdEFsbCgKLQkJRmVhdHVyZUhpZXJhcmNoeUVsZW1lbnQgcmVmLAotCQlBcnJheUxpc3Qgc2VsZWN0ZWQsCi0JCWJvb2xlYW4gdmFsdWUpIHsKLQotCQlpZiAocmVmLmlzT3B0aW9uYWwoKSA9PSBmYWxzZSkKLQkJCXNlbGVjdGVkLmFkZChyZWYpOwotCQllbHNlIHsKLQkJCWlmIChyZWYuaXNFZGl0YWJsZSgpKSB7Ci0JCQkJcmVmLnNldENoZWNrZWQodmFsdWUpOwotCQkJCWlmICh2YWx1ZSkKLQkJCQkJc2VsZWN0ZWQuYWRkKHJlZik7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChyZWYuaXNDaGVja2VkKCkpCi0JCQkJCXNlbGVjdGVkLmFkZChyZWYpOwotCQkJfQotCQl9Ci0JCU9iamVjdFtdIGluY2x1ZGVkID0KLQkJCXJlZi5nZXRDaGlsZHJlbihwZW5kaW5nQ2hhbmdlLmdldE9sZEZlYXR1cmUoKSAhPSBudWxsLCBwYXRjaCwgY29uZmlnKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmNsdWRlZC5sZW5ndGg7IGkrKykgewotCQkJRmVhdHVyZUhpZXJhcmNoeUVsZW1lbnQgZmUgPSAoRmVhdHVyZUhpZXJhcmNoeUVsZW1lbnQpIGluY2x1ZGVkW2ldOwotCQkJc2VsZWN0QWxsKGZlLCBzZWxlY3RlZCwgdmFsdWUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUNoZWNrZWQoT2JqZWN0IGVsZW1lbnQsIGJvb2xlYW4gY2hlY2tlZCkgewotCQlGZWF0dXJlSGllcmFyY2h5RWxlbWVudCBmZSA9IChGZWF0dXJlSGllcmFyY2h5RWxlbWVudCkgZWxlbWVudDsKLQotCQlpZiAoIWZlLmlzRWRpdGFibGUoKSkKLQkJCXRyZWVWaWV3ZXIuc2V0Q2hlY2tlZChlbGVtZW50LCAhY2hlY2tlZCk7Ci0JCWVsc2UgewotCQkJLy8gdXBkYXRlIHRoZSByZXN1bHQKLQkJCWZlLnNldENoZWNrZWQoY2hlY2tlZCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gZ2V0T3B0aW9uYWxFbGVtZW50cygpIHsKLQkJcmV0dXJuIGVsZW1lbnRzOwotCX0KLQotCXB1YmxpYyBJRmVhdHVyZVJlZmVyZW5jZVtdIGdldENoZWNrZWRPcHRpb25hbEZlYXR1cmVzKCkgewotCQlIYXNoU2V0IHNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCUZlYXR1cmVIaWVyYXJjaHlFbGVtZW50IGVsZW1lbnQgPQotCQkJCShGZWF0dXJlSGllcmFyY2h5RWxlbWVudCkgZWxlbWVudHNbaV07Ci0JCQllbGVtZW50LmFkZENoZWNrZWRPcHRpb25hbEZlYXR1cmVzKAotCQkJCXBlbmRpbmdDaGFuZ2UuZ2V0T2xkRmVhdHVyZSgpICE9IG51bGwsCi0JCQkJcGF0Y2gsIAotCQkJCWNvbmZpZywKLQkJCQlzZXQpOwotCQl9Ci0JCXJldHVybiAoSUZlYXR1cmVSZWZlcmVuY2VbXSkgc2V0LnRvQXJyYXkoCi0JCQluZXcgSUZlYXR1cmVSZWZlcmVuY2Vbc2V0LnNpemUoKV0pOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL1Jlc2l6YWJsZVdpemFyZERpYWxvZy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvUmVzaXphYmxlV2l6YXJkRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxYjI0MWQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvUmVzaXphYmxlV2l6YXJkRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi1wdWJsaWMgY2xhc3MgUmVzaXphYmxlV2l6YXJkRGlhbG9nIGV4dGVuZHMgV2l6YXJkRGlhbG9nIHsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHJlc2l6YWJsZSB3aXphcmQgZGlhbG9nLgotCSAqLwotCXB1YmxpYyBSZXNpemFibGVXaXphcmREaWFsb2coU2hlbGwgcGFyZW50LCBJV2l6YXJkIHdpemFyZCkgewotCQlzdXBlcihwYXJlbnQsIHdpemFyZCk7Ci0JCXNldFNoZWxsU3R5bGUoZ2V0U2hlbGxTdHlsZSgpIHwgU1dULlJFU0laRSk7Ci0JfQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9SZXZpZXdQYWdlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9SZXZpZXdQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhZGVmNjkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvUmV2aWV3UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLldvcmtiZW5jaEhlbHA7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsLlBlbmRpbmdDaGFuZ2U7DQotDQotcHVibGljIGNsYXNzIFJldmlld1BhZ2UgZXh0ZW5kcyBCYW5uZXJQYWdlIHsNCi0vLyBOTCBrZXlzDQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9USVRMRSA9ICJJbnN0YWxsV2l6YXJkLlJldmlld1BhZ2UudGl0bGUiOw0KLXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfREVTQyA9ICJJbnN0YWxsV2l6YXJkLlJldmlld1BhZ2UuZGVzYyI7DQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9BQk9VVF9JTlNUQUxMID0gIkluc3RhbGxXaXphcmQuUmV2aWV3UGFnZS5hYm91dC5pbnN0YWxsIjsNCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0FCT1VUX1VOSU5TVEFMTCA9ICJJbnN0YWxsV2l6YXJkLlJldmlld1BhZ2UuYWJvdXQudW5pbnN0YWxsIjsNCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0FCT1VUX1VOQ09ORklHVVJFID0gIkluc3RhbGxXaXphcmQuUmV2aWV3UGFnZS5hYm91dC51bmNvbmZpZ3VyZSI7DQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9BQk9VVF9DT05GSUdVUkUgPSAiSW5zdGFsbFdpemFyZC5SZXZpZXdQYWdlLmFib3V0LmNvbmZpZ3VyZSI7DQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9OQU1FID0gIkluc3RhbGxXaXphcmQuUmV2aWV3UGFnZS5uYW1lIjsNCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1BST1ZJREVSID0gIkluc3RhbGxXaXphcmQuUmV2aWV3UGFnZS5wcm92aWRlciI7DQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9WRVJTSU9OID0gIkluc3RhbGxXaXphcmQuUmV2aWV3UGFnZS52ZXJzaW9uIjsNCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPUlJFQ1RfSU5TVEFMTCA9ICJJbnN0YWxsV2l6YXJkLlJldmlld1BhZ2UuY29ycmVjdC5pbnN0YWxsIjsgDQotcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DT1JSRUNUX1VOSU5TVEFMTCA9ICJJbnN0YWxsV2l6YXJkLlJldmlld1BhZ2UuY29ycmVjdC51bmluc3RhbGwiOw0KLQ0KLQlwcml2YXRlIFBlbmRpbmdDaGFuZ2Ugam9iOw0KLQkvKioNCi0JICogQ29uc3RydWN0b3IgZm9yIFJldmlld1BhZ2UNCi0JICovDQotCXB1YmxpYyBSZXZpZXdQYWdlKFBlbmRpbmdDaGFuZ2Ugam9iKSB7DQotCQlzdXBlcigiUmV2aWV3Iik7DQotCQlzZXRUaXRsZShVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX1RJVExFKSk7DQotCQlzZXREZXNjcmlwdGlvbihVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX0RFU0MpKTsNCi0JCXRoaXMuam9iID0gam9iOw0KLQl9DQotCQ0KLQkNCi0NCi0JLyoqDQotCSAqIEBzZWUgRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkNCi0JICovDQotCXB1YmxpYyBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsNCi0JCUNvbXBvc2l0ZSBjbGllbnQgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOw0KLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOw0KLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOw0KLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7DQotCQljbGllbnQuc2V0TGF5b3V0KGxheW91dCk7DQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjbGllbnQsIFNXVC5OVUxMKTsNCi0JCXN3aXRjaCAoam9iLmdldEpvYlR5cGUoKSkgew0KLQkJCWNhc2UgUGVuZGluZ0NoYW5nZS5VTklOU1RBTEwgOg0KLQkJCQlsYWJlbC5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfQUJPVVRfVU5JTlNUQUxMKSk7CQkJCQ0KLQkJCQlicmVhazsNCi0JCQljYXNlIFBlbmRpbmdDaGFuZ2UuSU5TVEFMTCA6DQotCQkJCWxhYmVsLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9BQk9VVF9JTlNUQUxMKSk7CQkJCQ0KLQkJCQlicmVhazsJDQotCQkJY2FzZSBQZW5kaW5nQ2hhbmdlLlVOQ09ORklHVVJFOg0KLQkJCQlsYWJlbC5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfQUJPVVRfVU5DT05GSUdVUkUpKTsJCQ0KLQkJCQlicmVhazsNCi0JCQljYXNlIFBlbmRpbmdDaGFuZ2UuQ09ORklHVVJFOg0KLQkJCQlsYWJlbC5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfQUJPVVRfQ09ORklHVVJFKSk7CQkNCi0JCQkJYnJlYWs7DQotCQl9DQotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOw0KLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOw0KLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7DQotCQkNCi0JCWxhYmVsID0gbmV3IExhYmVsKGNsaWVudCwgU1dULk5VTEwpOw0KLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsNCi0JCWdkLmhvcml6b250YWxTcGFuID0gMjsNCi0JCWxhYmVsLnNldExheW91dERhdGEoZ2QpOw0KLQkJDQotCQlsYWJlbCA9IG5ldyBMYWJlbChjbGllbnQsIFNXVC5OVUxMKTsNCi0JCWxhYmVsLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9OQU1FKSk7DQotCQkNCi0JCWxhYmVsID0gbmV3IExhYmVsKGNsaWVudCwgU1dULk5VTEwpOw0KLQkJbGFiZWwuc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXRCYW5uZXJGb250KCkpOw0KLQkJbGFiZWwuc2V0VGV4dChqb2IuZ2V0RmVhdHVyZSgpLmdldExhYmVsKCkpOw0KLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsNCi0JCWxhYmVsLnNldExheW91dERhdGEoZ2QpOw0KLQkJbGFiZWwgPSBuZXcgTGFiZWwoY2xpZW50LCBTV1QuTlVMTCk7DQotCQlsYWJlbC5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfUFJPVklERVIpKTsNCi0JCWxhYmVsID0gbmV3IExhYmVsKGNsaWVudCwgU1dULk5VTEwpOw0KLQkJbGFiZWwuc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXRCYW5uZXJGb250KCkpOw0KLQkJbGFiZWwuc2V0VGV4dChqb2IuZ2V0RmVhdHVyZSgpLmdldFByb3ZpZGVyKCkpOw0KLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsNCi0JCWxhYmVsLnNldExheW91dERhdGEoZ2QpOw0KLQkJbGFiZWwgPSBuZXcgTGFiZWwoY2xpZW50LCBTV1QuTlVMTCk7DQotCQlsYWJlbC5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfVkVSU0lPTikpOw0KLQkJbGFiZWwgPSBuZXcgTGFiZWwoY2xpZW50LCBTV1QuTlVMTCk7DQotCQlsYWJlbC5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldEJhbm5lckZvbnQoKSk7DQotCQlsYWJlbC5zZXRUZXh0KGpvYi5nZXRGZWF0dXJlKCkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldFZlcnNpb24oKS50b1N0cmluZygpKTsNCi0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7DQotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsNCi0NCi0JCWxhYmVsID0gbmV3IExhYmVsKGNsaWVudCwgU1dULk5VTEwpOw0KLQkJaWYgKGpvYi5nZXRKb2JUeXBlKCk9PVBlbmRpbmdDaGFuZ2UuSU5TVEFMTCkNCi0JCQlsYWJlbC5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfQ09SUkVDVF9JTlNUQUxMKSk7DQotCQllbHNlDQotCQkJbGFiZWwuc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX0NPUlJFQ1RfVU5JTlNUQUxMKSk7DQotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOw0KLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOw0KLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7DQotCQlXb3JrYmVuY2hIZWxwLnNldEhlbHAoY2xpZW50LCAib3JnLmVjbGlwc2UudXBkYXRlLnVpLlJldmlld1BhZ2UiKTsNCi0JCXJldHVybiBjbGllbnQ7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvVGFyZ2V0UGFnZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvVGFyZ2V0UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2QzMzIwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL1RhcmdldFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkud2l6YXJkczsNCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLm5ldC4qOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotaW1wb3J0IGphdmEudXRpbC4qOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLldvcmtiZW5jaEhlbHA7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLlVwZGF0ZU1hbmFnZXJVdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbC5QZW5kaW5nQ2hhbmdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkucGFydHMuKjsNCi0NCi1wdWJsaWMgY2xhc3MgVGFyZ2V0UGFnZSBleHRlbmRzIEJhbm5lclBhZ2Ugew0KLQkvLyBOTCBrZXlzDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVElUTEUgPSAiSW5zdGFsbFdpemFyZC5UYXJnZXRQYWdlLnRpdGxlIjsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ERVNDID0gIkluc3RhbGxXaXphcmQuVGFyZ2V0UGFnZS5kZXNjIjsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ORVcgPSAiSW5zdGFsbFdpemFyZC5UYXJnZXRQYWdlLm5ldyI7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfREVMRVRFID0gIkluc3RhbGxXaXphcmQuVGFyZ2V0UGFnZS5kZWxldGUiOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1JFUVVJUkVEX0ZSRUVfU1BBQ0UgPQ0KLQkJIkluc3RhbGxXaXphcmQuVGFyZ2V0UGFnZS5yZXF1aXJlZFNwYWNlIjsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9BVkFJTEFCTEVfRlJFRV9TUEFDRSA9DQotCQkiSW5zdGFsbFdpemFyZC5UYXJnZXRQYWdlLmF2YWlsYWJsZVNwYWNlIjsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9MT0NBVElPTiA9DQotCQkiSW5zdGFsbFdpemFyZC5UYXJnZXRQYWdlLmxvY2F0aW9uIjsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9MT0NBVElPTl9NRVNTQUdFID0NCi0JCSJJbnN0YWxsV2l6YXJkLlRhcmdldFBhZ2UubG9jYXRpb24ubWVzc2FnZSI7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTE9DQVRJT05fRU1QVFkgPQ0KLQkJIkluc3RhbGxXaXphcmQuVGFyZ2V0UGFnZS5sb2NhdGlvbi5lbXB0eSI7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTE9DQVRJT05fRVhJU1RTID0NCi0JCSJJbnN0YWxsV2l6YXJkLlRhcmdldFBhZ2UubG9jYXRpb24uZXhpc3RzIjsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9MT0NBVElPTl9FUlJPUl9USVRMRSA9DQotCQkiSW5zdGFsbFdpemFyZC5UYXJnZXRQYWdlLmxvY2F0aW9uLmVycm9yLnRpdGxlIjsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9MT0NBVElPTl9FUlJPUl9NRVNTQUdFID0NCi0JCSJJbnN0YWxsV2l6YXJkLlRhcmdldFBhZ2UubG9jYXRpb24uZXJyb3IubWVzc2FnZSI7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRVJST1JfUkVBU09OID0NCi0JCSJJbnN0YWxsV2l6YXJkLlRhcmdldFBhZ2UubG9jYXRpb24uZXJyb3IucmVhc29uIjsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9TSVpFID0gIkluc3RhbGxXaXphcmQuVGFyZ2V0UGFnZS5zaXplIjsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9TSVpFX1VOS05PV04gPQ0KLQkJIkluc3RhbGxXaXphcmQuVGFyZ2V0UGFnZS51bmtub3duU2l6ZSI7DQotCXByaXZhdGUgVGFibGVWaWV3ZXIgdGFibGVWaWV3ZXI7DQotCXByaXZhdGUgSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZzsNCi0JcHJpdmF0ZSBDb25maWdMaXN0ZW5lciBjb25maWdMaXN0ZW5lcjsNCi0JcHJpdmF0ZSBMYWJlbCByZXF1aXJlZFNwYWNlTGFiZWw7DQotCXByaXZhdGUgTGFiZWwgYXZhaWxhYmxlU3BhY2VMYWJlbDsNCi0JcHJpdmF0ZSBQZW5kaW5nQ2hhbmdlIHBlbmRpbmdDaGFuZ2U7DQotCXByaXZhdGUgSUNvbmZpZ3VyZWRTaXRlIGRlZmF1bHRUYXJnZXRTaXRlOw0KLQlwcml2YXRlIElDb25maWd1cmVkU2l0ZSBhZmZpbml0eVNpdGU7DQotCXByaXZhdGUgQnV0dG9uIGRlbGV0ZUJ1dHRvbjsNCi0JcHJpdmF0ZSBIYXNoU2V0IGFkZGVkOw0KLQ0KLQljbGFzcyBUYWJsZUNvbnRlbnRQcm92aWRlcg0KLQkJZXh0ZW5kcyBEZWZhdWx0Q29udGVudFByb3ZpZGVyDQotCQlpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHsNCi0NCi0JCS8qKg0KLQkJICogQHNlZSBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciNnZXRFbGVtZW50cyhPYmplY3QpDQotCQkgKi8NCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgcGFyZW50KSB7DQotCQkJcmV0dXJuIGNvbmZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKTsNCi0JCX0NCi0JfQ0KLQ0KLQljbGFzcyBUYWJsZUxhYmVsUHJvdmlkZXINCi0JCWV4dGVuZHMgTGFiZWxQcm92aWRlcg0KLQkJaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyIHsNCi0JCS8qKg0KLQkJKiBAc2VlIElUYWJsZUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0LCBpbnQpDQotCQkqLw0KLQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBvYmosIGludCBjb2wpIHsNCi0JCQlpZiAob2JqIGluc3RhbmNlb2YgSUNvbmZpZ3VyZWRTaXRlKQ0KLQkJCQlyZXR1cm4gVXBkYXRlVUkNCi0JCQkJCS5nZXREZWZhdWx0KCkNCi0JCQkJCS5nZXRMYWJlbFByb3ZpZGVyKCkNCi0JCQkJCS5nZXRMb2NhbFNpdGVJbWFnZSgNCi0JCQkJCShJQ29uZmlndXJlZFNpdGUpIG9iaik7DQotCQkJcmV0dXJuIG51bGw7DQotCQl9DQotDQotCQkvKioNCi0JCSAqIEBzZWUgSVRhYmxlTGFiZWxQcm92aWRlciNnZXRDb2x1bW5UZXh0KE9iamVjdCwgaW50KQ0KLQkJICovDQotCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iaiwgaW50IGNvbCkgew0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBJQ29uZmlndXJlZFNpdGUgJiYgY29sID09IDApIHsNCi0JCQkJSUNvbmZpZ3VyZWRTaXRlIGNzaXRlID0gKElDb25maWd1cmVkU2l0ZSkgb2JqOw0KLQkJCQlJU2l0ZSBzaXRlID0gY3NpdGUuZ2V0U2l0ZSgpOw0KLQkJCQlVUkwgdXJsID0gc2l0ZS5nZXRVUkwoKTsNCi0JCQkJcmV0dXJuIHVybC5nZXRGaWxlKCk7DQotCQkJfQ0KLQkJCXJldHVybiBudWxsOw0KLQkJfQ0KLQ0KLQl9DQotDQotCWNsYXNzIENvbmZpZ0xpc3RlbmVyIGltcGxlbWVudHMgSUluc3RhbGxDb25maWd1cmF0aW9uQ2hhbmdlZExpc3RlbmVyIHsNCi0JCXB1YmxpYyB2b2lkIGluc3RhbGxTaXRlQWRkZWQoSUNvbmZpZ3VyZWRTaXRlIGNzaXRlKSB7DQotCQkJdGFibGVWaWV3ZXIuYWRkKGNzaXRlKTsNCi0JCQlpZiAoYWRkZWQ9PW51bGwpIGFkZGVkID0gbmV3IEhhc2hTZXQoKTsNCi0JCQlhZGRlZC5hZGQoY3NpdGUpOw0KLQkJCXRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihjc2l0ZSkpOw0KLQkJCXRhYmxlVmlld2VyLmdldENvbnRyb2woKS5zZXRGb2N1cygpOw0KLQkJfQ0KLQ0KLQkJcHVibGljIHZvaWQgaW5zdGFsbFNpdGVSZW1vdmVkKElDb25maWd1cmVkU2l0ZSBjc2l0ZSkgew0KLQkJCXRhYmxlVmlld2VyLnJlbW92ZShjc2l0ZSk7DQotCQkJaWYgKGFkZGVkIT1udWxsKSBhZGRlZC5yZW1vdmUoY3NpdGUpOw0KLQkJCXNlbGVjdEZpcnN0VGFyZ2V0KCk7DQotCQkJdGFibGVWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldEZvY3VzKCk7DQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yIGZvciBSZXZpZXdQYWdlDQotCSAqLw0KLQlwdWJsaWMgVGFyZ2V0UGFnZSgNCi0JCVBlbmRpbmdDaGFuZ2UgcGVuZGluZ0NoYW5nZSwNCi0JCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcpIHsNCi0JCXN1cGVyKCJUYXJnZXQiKTsNCi0JCXNldFRpdGxlKFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfVElUTEUpKTsNCi0JCXNldERlc2NyaXB0aW9uKFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfREVTQykpOw0KLQkJdGhpcy5jb25maWcgPSBjb25maWc7DQotCQl0aGlzLnBlbmRpbmdDaGFuZ2UgPSBwZW5kaW5nQ2hhbmdlOw0KLQkJVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKS5jb25uZWN0KHRoaXMpOw0KLQkJY29uZmlnTGlzdGVuZXIgPSBuZXcgQ29uZmlnTGlzdGVuZXIoKTsNCi0JCWRlZmF1bHRUYXJnZXRTaXRlID0gZ2V0RGVmYXVsdFRhcmdldFNpdGUoY29uZmlnLCBwZW5kaW5nQ2hhbmdlLCBmYWxzZSk7DQotCQlhZmZpbml0eVNpdGUgPSBnZXRBZmZpbml0eVNpdGUoY29uZmlnLCBwZW5kaW5nQ2hhbmdlLmdldEZlYXR1cmUoKSk7DQotCQlpZiAoYWZmaW5pdHlTaXRlID09IG51bGwpDQotCQkJYWZmaW5pdHlTaXRlID0gcGVuZGluZ0NoYW5nZS5nZXREZWZhdWx0VGFyZ2V0U2l0ZSgpOw0KLQl9DQotDQotCXB1YmxpYyBzdGF0aWMgSUNvbmZpZ3VyZWRTaXRlIGdldERlZmF1bHRUYXJnZXRTaXRlKA0KLQkJSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZywNCi0JCVBlbmRpbmdDaGFuZ2UgcGVuZGluZ0NoYW5nZSkgew0KLQkJcmV0dXJuIGdldERlZmF1bHRUYXJnZXRTaXRlKGNvbmZpZywgcGVuZGluZ0NoYW5nZSwgdHJ1ZSk7DQotCX0NCi0NCi0JcHJpdmF0ZSBzdGF0aWMgSUNvbmZpZ3VyZWRTaXRlIGdldERlZmF1bHRUYXJnZXRTaXRlKA0KLQkJSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZywNCi0JCVBlbmRpbmdDaGFuZ2UgcGVuZGluZ0NoYW5nZSwNCi0JCWJvb2xlYW4gY2hlY2tBZmZpbml0eUZlYXR1cmUpIHsNCi0JCUlGZWF0dXJlIG9sZEZlYXR1cmUgPSBwZW5kaW5nQ2hhbmdlLmdldE9sZEZlYXR1cmUoKTsNCi0JCUlGZWF0dXJlIG5ld0ZlYXR1cmUgPSBwZW5kaW5nQ2hhbmdlLmdldEZlYXR1cmUoKTsNCi0JCWlmIChvbGRGZWF0dXJlICE9IG51bGwpIHsNCi0JCQkvLyBXZSBzaG91bGQgaW5zdGFsbCBpbnRvIHRoZSBzYW1lIHNpdGUgYXMNCi0JCQkvLyB0aGUgb2xkIGZlYXR1cmUNCi0JCQl0cnkgew0KLQkJCQlyZXR1cm4gSW5zdGFsbFdpemFyZC5maW5kQ29uZmlnU2l0ZShvbGRGZWF0dXJlLCBjb25maWcpOw0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgew0KLQkJCQlVcGRhdGVVSS5sb2dFeGNlcHRpb24oZSwgZmFsc2UpOw0KLQkJCQlyZXR1cm4gbnVsbDsNCi0JCQl9DQotCQl9DQotDQotCQkvLyBUaGlzIGlzIGEgbmV3IGluc3RhbGwuIENoZWNrIGlmIHRoZXJlIGlzIA0KLQkJLy8gYSBkaXNhYmxlZCBmZWF0dXJlIHdpdGggdGhlIHNhbWUgSUQNCi0JCVN0cmluZyBuZXdGZWF0dXJlSUQgPQ0KLQkJCW5ld0ZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldElkZW50aWZpZXIoKTsNCi0JCUlDb25maWd1cmVkU2l0ZSBzYW1lU2l0ZSA9IGZpbmRTYW1lSWRGZWF0dXJlU2l0ZShjb25maWcsIG5ld0ZlYXR1cmVJRCk7DQotCQlpZiAoc2FtZVNpdGUgIT0gbnVsbCkgew0KLQkJCXJldHVybiBzYW1lU2l0ZTsNCi0JCX0NCi0NCi0JCWlmIChjaGVja0FmZmluaXR5RmVhdHVyZSkgew0KLQkJCXJldHVybiBnZXRBZmZpbml0eVNpdGUoY29uZmlnLCBuZXdGZWF0dXJlKTsNCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCXByaXZhdGUgc3RhdGljIElDb25maWd1cmVkU2l0ZSBnZXRBZmZpbml0eVNpdGUoDQotCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnLA0KLQkJSUZlYXR1cmUgbmV3RmVhdHVyZSkgew0KLQkJLy8gY2hlY2sgaWYgdGhlIGFmZmluaXR5IGZlYXR1cmUgaXMgaW5zdGFsbGVkDQotCQlTdHJpbmcgYWZmaW5pdHlJRCA9IG5ld0ZlYXR1cmUuZ2V0QWZmaW5pdHlGZWF0dXJlKCk7DQotCQlpZiAoYWZmaW5pdHlJRCAhPSBudWxsKSB7DQotCQkJSUNvbmZpZ3VyZWRTaXRlIGFmZmluaXR5U2l0ZSA9DQotCQkJCWZpbmRTYW1lSWRGZWF0dXJlU2l0ZShjb25maWcsIGFmZmluaXR5SUQpOw0KLQkJCWlmIChhZmZpbml0eVNpdGUgIT0gbnVsbCkNCi0JCQkJcmV0dXJuIGFmZmluaXR5U2l0ZTsNCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCXByaXZhdGUgc3RhdGljIElDb25maWd1cmVkU2l0ZSBmaW5kU2FtZUlkRmVhdHVyZVNpdGUoDQotCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnLA0KLQkJU3RyaW5nIGZlYXR1cmVJRCkgew0KLQkJaWYgKGZlYXR1cmVJRCA9PSBudWxsKQ0KLQkJCXJldHVybiBudWxsOw0KLQkJSUNvbmZpZ3VyZWRTaXRlW10gc2l0ZXMgPSBjb25maWcuZ2V0Q29uZmlndXJlZFNpdGVzKCk7DQotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpdGVzLmxlbmd0aDsgaSsrKSB7DQotCQkJSUNvbmZpZ3VyZWRTaXRlIHNpdGUgPSBzaXRlc1tpXTsNCi0JCQlJRmVhdHVyZVJlZmVyZW5jZVtdIHJlZnMgPSBzaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7DQotCQkJZm9yIChpbnQgaiA9IDA7IGogPCByZWZzLmxlbmd0aDsgaisrKSB7DQotCQkJCUlGZWF0dXJlUmVmZXJlbmNlIHJlZiA9IHJlZnNbal07DQotCQkJCXRyeSB7DQotCQkJCQlJRmVhdHVyZSBmZWF0dXJlID0gcmVmLmdldEZlYXR1cmUobnVsbCk7DQotCQkJCQlpZiAoZmVhdHVyZUlEDQotCQkJCQkJLmVxdWFscygNCi0JCQkJCQkJZmVhdHVyZQ0KLQkJCQkJCQkJLmdldFZlcnNpb25lZElkZW50aWZpZXIoKQ0KLQkJCQkJCQkJLmdldElkZW50aWZpZXIoKSkpIHsNCi0JCQkJCQkvLyBmb3VuZCBpdA0KLQkJCQkJCXJldHVybiBzaXRlOw0KLQkJCQkJfQ0KLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsNCi0JCQkJCVVwZGF0ZVVJLmxvZ0V4Y2VwdGlvbihlLCBmYWxzZSk7DQotCQkJCX0NCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgew0KLQkJVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKS5kaXNjb25uZWN0KHRoaXMpOw0KLQkJY29uZmlnLnJlbW92ZUluc3RhbGxDb25maWd1cmF0aW9uQ2hhbmdlZExpc3RlbmVyKGNvbmZpZ0xpc3RlbmVyKTsNCi0JCXN1cGVyLmRpc3Bvc2UoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHNlZSBEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQ0KLQkgKi8NCi0JcHVibGljIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgew0KLQkJQ29tcG9zaXRlIGNsaWVudCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7DQotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7DQotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7DQotCQlsYXlvdXQubWFyZ2luV2lkdGggPSBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsNCi0JCWNsaWVudC5zZXRMYXlvdXQobGF5b3V0KTsNCi0JCWNyZWF0ZVRhYmxlVmlld2VyKGNsaWVudCk7DQotCQlDb21wb3NpdGUgYnV0dG9uQ29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShjbGllbnQsIFNXVC5OVUxMKTsNCi0JCUdyaWRMYXlvdXQgYmxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7DQotCQlibGF5b3V0Lm1hcmdpbldpZHRoID0gYmxheW91dC5tYXJnaW5IZWlnaHQgPSAwOw0KLQkJYnV0dG9uQ29udGFpbmVyLnNldExheW91dChibGF5b3V0KTsNCi0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfVkVSVElDQUwpOw0KLQkJYnV0dG9uQ29udGFpbmVyLnNldExheW91dERhdGEoZ2QpOw0KLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29udGFpbmVyLCBTV1QuUFVTSCk7DQotCQlidXR0b24uc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX05FVykpOw0KLQkJYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgew0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsNCi0JCQkJYWRkVGFyZ2V0TG9jYXRpb24oKTsNCi0JCQl9DQotCQl9KTsNCi0JCWJ1dHRvbi5zZXRFbmFibGVkKGFmZmluaXR5U2l0ZSA9PSBudWxsKTsNCi0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQ0VOVEVSKTsNCi0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsNCi0JCVNXVFV0aWwuc2V0QnV0dG9uRGltZW5zaW9uSGludChidXR0b24pOw0KLQ0KLQkJZGVsZXRlQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db250YWluZXIsIFNXVC5QVVNIKTsNCi0JCWRlbGV0ZUJ1dHRvbi5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfREVMRVRFKSk7DQotCQlkZWxldGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7DQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgew0KLQkJCQl0cnkgew0KLQkJCQkJcmVtb3ZlU2VsZWN0aW9uKCk7DQotCQkJCX0NCi0JCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsNCi0JCQkJCVVwZGF0ZVVJLmxvZ0V4Y2VwdGlvbihleCk7DQotCQkJCX0NCi0JCQl9DQotCQl9KTsNCi0JCWRlbGV0ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsNCi0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQ0VOVEVSKTsNCi0JCWRlbGV0ZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsNCi0JCVNXVFV0aWwuc2V0QnV0dG9uRGltZW5zaW9uSGludChkZWxldGVCdXR0b24pOw0KLQ0KLQkJQ29tcG9zaXRlIHN0YXR1cyA9IG5ldyBDb21wb3NpdGUoY2xpZW50LCBTV1QuTlVMTCk7DQotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOw0KLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOw0KLQkJc3RhdHVzLnNldExheW91dERhdGEoZ2QpOw0KLQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsNCi0JCWxheW91dC5udW1Db2x1bW5zID0gMjsNCi0JCXN0YXR1cy5zZXRMYXlvdXQobGF5b3V0KTsNCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHN0YXR1cywgU1dULk5VTEwpOw0KLQkJbGFiZWwuc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX1JFUVVJUkVEX0ZSRUVfU1BBQ0UpKTsNCi0JCXJlcXVpcmVkU3BhY2VMYWJlbCA9IG5ldyBMYWJlbChzdGF0dXMsIFNXVC5OVUxMKTsNCi0JCXJlcXVpcmVkU3BhY2VMYWJlbC5zZXRMYXlvdXREYXRhKA0KLQkJCW5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsNCi0JCWxhYmVsID0gbmV3IExhYmVsKHN0YXR1cywgU1dULk5VTEwpOw0KLQkJbGFiZWwuc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX0FWQUlMQUJMRV9GUkVFX1NQQUNFKSk7DQotCQlhdmFpbGFibGVTcGFjZUxhYmVsID0gbmV3IExhYmVsKHN0YXR1cywgU1dULk5VTEwpOw0KLQkJYXZhaWxhYmxlU3BhY2VMYWJlbC5zZXRMYXlvdXREYXRhKA0KLQkJCW5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsNCi0NCi0JCXRhYmxlVmlld2VyLnNldElucHV0KFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRVcGRhdGVNb2RlbCgpKTsNCi0JCXNlbGVjdEZpcnN0VGFyZ2V0KCk7DQotCQlXb3JrYmVuY2hIZWxwLnNldEhlbHAoY2xpZW50LCAib3JnLmVjbGlwc2UudXBkYXRlLnVpLlRhcmdldFBhZ2UiKTsNCi0JCXJldHVybiBjbGllbnQ7DQotCX0NCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRhYmxlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsNCi0JCXRhYmxlVmlld2VyID0NCi0JCQluZXcgVGFibGVWaWV3ZXIocGFyZW50LCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsNCi0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7DQotCQlUYWJsZSB0YWJsZSA9IHRhYmxlVmlld2VyLmdldFRhYmxlKCk7DQotCQl0YWJsZS5zZXRMYXlvdXREYXRhKGdkKTsNCi0JCXRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgVGFibGVDb250ZW50UHJvdmlkZXIoKSk7DQotCQl0YWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBUYWJsZUxhYmVsUHJvdmlkZXIoKSk7DQotCQl0YWJsZVZpZXdlci5hZGRGaWx0ZXIobmV3IFZpZXdlckZpbHRlcigpIHsNCi0JCQlwdWJsaWMgYm9vbGVhbiBzZWxlY3QoVmlld2VyIHYsIE9iamVjdCBwYXJlbnQsIE9iamVjdCBvYmopIHsNCi0JCQkJSUNvbmZpZ3VyZWRTaXRlIHNpdGUgPSAoSUNvbmZpZ3VyZWRTaXRlKSBvYmo7DQotCQkJCXJldHVybiBnZXRTaXRlVmlzaWJpbGl0eShzaXRlKTsNCi0JCQl9DQotCQl9KTsNCi0JCXRhYmxlVmlld2VyDQotCQkJLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsNCi0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgew0KLQkJCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGV2ZW50LmdldFNlbGVjdGlvbigpOw0KLQkJCQl1cGRhdGVEZWxldGVCdXR0b24oKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pOw0KLQkJCQlib29sZWFuIGVtcHR5ID0gc2VsZWN0aW9uLmlzRW1wdHkoKTsNCi0JCQkJdmVyaWZ5Tm90RW1wdHkoZW1wdHkpOw0KLQkJCQl1cGRhdGVTdGF0dXMoDQotCQkJCQkoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpKTsNCi0JCQl9DQotCQl9KTsNCi0NCi0JCWlmIChjb25maWcgIT0gbnVsbCkNCi0JCQljb25maWcuYWRkSW5zdGFsbENvbmZpZ3VyYXRpb25DaGFuZ2VkTGlzdGVuZXIoY29uZmlnTGlzdGVuZXIpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7DQotCQlzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOw0KLQkJaWYgKHZpc2libGUpIHsNCi0JCQl0YWJsZVZpZXdlci5nZXRUYWJsZSgpLnNldEZvY3VzKCk7DQotCQl9DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZURlbGV0ZUJ1dHRvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsNCi0JCWJvb2xlYW4gaGFzVXNlclNpdGVzID0gYWRkZWQhPW51bGwgJiYgIWFkZGVkLmlzRW1wdHkoKTsNCi0JCWJvb2xlYW4gZW5hYmxlID0gIXNlbGVjdGlvbi5pc0VtcHR5KCkgJiYgaGFzVXNlclNpdGVzOw0KLQ0KLQkJaWYgKGhhc1VzZXJTaXRlcykgew0KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsNCi0JCQkJT2JqZWN0IG9iaiA9IGl0ZXIubmV4dCgpOw0KLQkJCQlpZiAoYWRkZWQuY29udGFpbnMob2JqKSA9PSBmYWxzZSkgew0KLQkJCQkJZW5hYmxlID0gZmFsc2U7DQotCQkJCQlicmVhazsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0JCWRlbGV0ZUJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZSk7DQotCX0NCi0NCi0JcHJpdmF0ZSBib29sZWFuIGdldFNpdGVWaXNpYmlsaXR5KElDb25maWd1cmVkU2l0ZSBzaXRlKSB7DQotCQkvLyBJZiBhZmZpbml0eSBzaXRlIGlzIGtub3duLCBvbmx5IGl0IHNob3VsZCBiZSBzaG93bg0KLQkJaWYgKGFmZmluaXR5U2l0ZSAhPSBudWxsKSB7DQotCQkJLy8gTXVzdCBjb21wYXJlIHJlZmVyZW5jZWQgc2l0ZXMgYmVjYXVzZQ0KLQkJCS8vIGNvbmZpZ3VyZWQgc2l0ZXMgdGhlbXNlbHZlcyBtYXkgY29tZSBmcm9tIA0KLQkJCS8vIGRpZmZlcmVudCBjb25maWd1cmF0aW9ucw0KLQkJCXJldHVybiBzaXRlLmdldFNpdGUoKS5lcXVhbHMoYWZmaW5pdHlTaXRlLmdldFNpdGUoKSk7DQotCQl9DQotDQotCQkvLyBJZiB0aGlzIGlzIHRoZSBkZWZhdWx0IHRhcmdldCBzaXRlLCBsZXQgaXQgc2hvdw0KLQkJaWYgKHNpdGUuZXF1YWxzKGRlZmF1bHRUYXJnZXRTaXRlKSkNCi0JCQlyZXR1cm4gdHJ1ZTsNCi0JCS8vIE5vdCB0aGUgZGVmYXVsdC4gSWYgdXBkYXRlLCBzaG93IG9ubHkgcHJpdmF0ZSBzaXRlcy4NCi0JCS8vIElmIGluc3RhbGwsIGFsbG93IHByb2R1Y3Qgc2l0ZSArIHByaXZhdGUgc2l0ZXMuDQotCQlpZiAoc2l0ZS5pc1ByaXZhdGVTaXRlKCkgJiYgc2l0ZS5pc1VwZGF0YWJsZSgpKQ0KLQkJCXJldHVybiB0cnVlOw0KLQkJaWYgKHBlbmRpbmdDaGFuZ2UuZ2V0T2xkRmVhdHVyZSgpID09IG51bGwgJiYgc2l0ZS5pc1Byb2R1Y3RTaXRlKCkpDQotCQkJcmV0dXJuIHRydWU7DQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeU5vdEVtcHR5KGJvb2xlYW4gZW1wdHkpIHsNCi0JCVN0cmluZyBlcnJvck1lc3NhZ2UgPSBudWxsOw0KLQkJaWYgKGVtcHR5KQ0KLQkJCWVycm9yTWVzc2FnZSA9IFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfTE9DQVRJT05fRU1QVFkpOw0KLQkJc2V0RXJyb3JNZXNzYWdlKGVycm9yTWVzc2FnZSk7DQotCQlzZXRQYWdlQ29tcGxldGUoIWVtcHR5KTsNCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgc2VsZWN0Rmlyc3RUYXJnZXQoKSB7DQotCQlJQ29uZmlndXJlZFNpdGUgZmlyc3RTaXRlID0gZGVmYXVsdFRhcmdldFNpdGU7DQotCQlpZiAoZmlyc3RTaXRlID09IG51bGwpIHsNCi0JCQlJQ29uZmlndXJlZFNpdGVbXSBzaXRlcyA9IGNvbmZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKTsNCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpdGVzLmxlbmd0aDsgaSsrKSB7DQotCQkJCUlDb25maWd1cmVkU2l0ZSBjc2l0ZSA9IHNpdGVzW2ldOw0KLQkJCQlpZiAoZ2V0U2l0ZVZpc2liaWxpdHkoY3NpdGUpKSB7DQotCQkJCQlmaXJzdFNpdGUgPSBjc2l0ZTsNCi0JCQkJCWJyZWFrOw0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQkJaWYgKGZpcnN0U2l0ZSAhPSBudWxsKSB7DQotCQkJdGFibGVWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGZpcnN0U2l0ZSkpOw0KLQkJfQ0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBhZGRUYXJnZXRMb2NhdGlvbigpIHsNCi0JCURpcmVjdG9yeURpYWxvZyBkZCA9IG5ldyBEaXJlY3RvcnlEaWFsb2coZ2V0Q29udGFpbmVyKCkuZ2V0U2hlbGwoKSk7DQotCQlkZC5zZXRNZXNzYWdlKFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfTE9DQVRJT05fTUVTU0FHRSkpOw0KLQkJU3RyaW5nIHBhdGggPSBkZC5vcGVuKCk7DQotCQlpZiAocGF0aCAhPSBudWxsKSB7DQotCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUocGF0aCk7DQotCQkJYWRkQ29uZmlndXJlZFNpdGUoZ2V0Q29udGFpbmVyKCkuZ2V0U2hlbGwoKSwgY29uZmlnLCBmaWxlLCBmYWxzZSk7DQotCQl9DQotCX0NCi0JDQotCXByaXZhdGUgdm9pZCByZW1vdmVTZWxlY3Rpb24oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPQ0KLQkJCShJU3RydWN0dXJlZFNlbGVjdGlvbikgdGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7DQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7DQotCQkJT2JqZWN0IG9iaiA9IGl0ZXIubmV4dCgpOw0KLQkJCUlDb25maWd1cmVkU2l0ZSBjc2l0ZSA9IChJQ29uZmlndXJlZFNpdGUpb2JqOw0KLQkJCWNvbmZpZy5yZW1vdmVDb25maWd1cmVkU2l0ZShjc2l0ZSk7DQotCQl9DQotCX0NCi0NCi0JcHVibGljIHN0YXRpYyBJQ29uZmlndXJlZFNpdGUgYWRkQ29uZmlndXJlZFNpdGUoDQotCQlTaGVsbCBzaGVsbCwNCi0JCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcsDQotCQlGaWxlIGZpbGUsDQotCQlib29sZWFuIGxpbmtlZCkgew0KLQkJdHJ5IHsNCi0JCQlJQ29uZmlndXJlZFNpdGUgY3NpdGUgPSBudWxsOw0KLQkJCWlmIChsaW5rZWQpIHsNCi0JCQkJY3NpdGUgPSBjb25maWcuY3JlYXRlTGlua2VkQ29uZmlndXJlZFNpdGUoZmlsZSk7DQotCQkJCWNvbmZpZy5hZGRDb25maWd1cmVkU2l0ZShjc2l0ZSk7DQotCQkJfSBlbHNlIHsNCi0JCQkJaWYgKCFlbnN1cmVVbmlxdWUoZmlsZSwgY29uZmlnKSkgew0KLQkJCQkJU3RyaW5nIHRpdGxlID0gVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9MT0NBVElPTl9FUlJPUl9USVRMRSk7DQotCQkJCQlTdHJpbmcgbWVzc2FnZSA9IFVwZGF0ZVVJLmdldEZvcm1hdHRlZE1lc3NhZ2UoDQotCQkJCQkJCQlLRVlfTE9DQVRJT05fRVhJU1RTLA0KLQkJCQkJCQkJZmlsZS5nZXRQYXRoKCkpOw0KLQkJCQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3Ioc2hlbGwsIHRpdGxlLCBtZXNzYWdlKTsNCi0JCQkJCXJldHVybiBudWxsOw0KLQkJCQl9DQotCQkJCWNzaXRlID0gY29uZmlnLmNyZWF0ZUNvbmZpZ3VyZWRTaXRlKGZpbGUpOw0KLQkJCQlJU3RhdHVzIHN0YXR1cyA9IGNzaXRlLnZlcmlmeVVwZGF0YWJsZVN0YXR1cygpOw0KLQkJCQlpZiAoc3RhdHVzLmlzT0soKSkNCi0JCQkJCWNvbmZpZy5hZGRDb25maWd1cmVkU2l0ZShjc2l0ZSk7DQotCQkJCWVsc2Ugew0KLQkJCQkJU3RyaW5nIHRpdGxlID0gVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9MT0NBVElPTl9FUlJPUl9USVRMRSk7DQotCQkJCQlTdHJpbmcgbWVzc2FnZSA9DQotCQkJCQkJVXBkYXRlVUkuZ2V0Rm9ybWF0dGVkTWVzc2FnZSgNCi0JCQkJCQkJS0VZX0xPQ0FUSU9OX0VSUk9SX01FU1NBR0UsDQotCQkJCQkJCWZpbGUuZ2V0UGF0aCgpKTsNCi0JCQkJCVN0cmluZyBtZXNzYWdlMiA9DQotCQkJCQkJVXBkYXRlVUkuZ2V0Rm9ybWF0dGVkTWVzc2FnZSgNCi0JCQkJCQkJS0VZX0VSUk9SX1JFQVNPTiwNCi0JCQkJCQkJc3RhdHVzLmdldE1lc3NhZ2UoKSk7DQotCQkJCQltZXNzYWdlID0gbWVzc2FnZSArICJcclxuIiArIG1lc3NhZ2UyOw0KLQkJCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKHNoZWxsLCB0aXRsZSwgbWVzc2FnZSwgc3RhdHVzKTsNCi0JCQkJCXJldHVybiBudWxsOw0KLQkJCQl9DQotCQkJfQ0KLQkJCXJldHVybiBjc2l0ZTsNCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgew0KLQkJCVVwZGF0ZVVJLmxvZ0V4Y2VwdGlvbihlKTsNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCX0NCi0JfQ0KLQkNCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBlbnN1cmVVbmlxdWUoRmlsZSBmaWxlLCBJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnKSB7DQotCQlJQ29uZmlndXJlZFNpdGUgW10gc2l0ZXMgPSBjb25maWcuZ2V0Q29uZmlndXJlZFNpdGVzKCk7DQotCQlVUkwgZmlsZVVSTDsNCi0JCXRyeSB7DQotCQkJZmlsZVVSTCA9IG5ldyBVUkwoImZpbGU6IitmaWxlLmdldFBhdGgoKSk7DQotCQl9DQotCQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsNCi0JCQlyZXR1cm4gdHJ1ZTsNCi0JCX0NCi0JCWZvciAoaW50IGk9MDsgaTxzaXRlcy5sZW5ndGg7IGkrKykgew0KLQkJCUlDb25maWd1cmVkU2l0ZSBjc2l0ZSA9IHNpdGVzW2ldOw0KLQkJCVVSTCB1cmwgPSBjc2l0ZS5nZXRTaXRlKCkuZ2V0VVJMKCk7DQotCQkJaWYgKFVwZGF0ZU1hbmFnZXJVdGlscy5zYW1lVVJMKGZpbGVVUkwsIHVybCkpDQotCQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0JCXJldHVybiB0cnVlOw0KLQl9DQotDQotCXByaXZhdGUgdm9pZCB1cGRhdGVTdGF0dXMoT2JqZWN0IGVsZW1lbnQpIHsNCi0JCWlmIChlbGVtZW50ID09IG51bGwpIHsNCi0JCQlyZXF1aXJlZFNwYWNlTGFiZWwuc2V0VGV4dCgiIik7DQotCQkJYXZhaWxhYmxlU3BhY2VMYWJlbC5zZXRUZXh0KCIiKTsNCi0JCQlyZXR1cm47DQotCQl9DQotCQlJQ29uZmlndXJlZFNpdGUgc2l0ZSA9IChJQ29uZmlndXJlZFNpdGUpIGVsZW1lbnQ7DQotCQlVUkwgdXJsID0gc2l0ZS5nZXRTaXRlKCkuZ2V0VVJMKCk7DQotCQlTdHJpbmcgZmlsZU5hbWUgPSB1cmwuZ2V0RmlsZSgpOw0KLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZmlsZU5hbWUpOw0KLQkJbG9uZyBhdmFpbGFibGUgPSBMb2NhbFN5c3RlbUluZm8uZ2V0RnJlZVNwYWNlKGZpbGUpOw0KLQkJbG9uZyByZXF1aXJlZCA9DQotCQkJc2l0ZS5nZXRTaXRlKCkuZ2V0SW5zdGFsbFNpemVGb3IocGVuZGluZ0NoYW5nZS5nZXRGZWF0dXJlKCkpOw0KLQkJaWYgKHJlcXVpcmVkID09IC0xKQ0KLQkJCXJlcXVpcmVkU3BhY2VMYWJlbC5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfU0laRV9VTktOT1dOKSk7DQotCQllbHNlDQotCQkJcmVxdWlyZWRTcGFjZUxhYmVsLnNldFRleHQoDQotCQkJCVVwZGF0ZVVJLmdldEZvcm1hdHRlZE1lc3NhZ2UoS0VZX1NJWkUsICIiICsgcmVxdWlyZWQpKTsNCi0NCi0JCWlmIChhdmFpbGFibGUgPT0gTG9jYWxTeXN0ZW1JbmZvLlNJWkVfVU5LTk9XTikNCi0JCQlhdmFpbGFibGVTcGFjZUxhYmVsLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9TSVpFX1VOS05PV04pKTsNCi0JCWVsc2UNCi0JCQlhdmFpbGFibGVTcGFjZUxhYmVsLnNldFRleHQoDQotCQkJCVVwZGF0ZVVJLmdldEZvcm1hdHRlZE1lc3NhZ2UoS0VZX1NJWkUsICIiICsgYXZhaWxhYmxlKSk7DQotCX0NCi0NCi0JcHVibGljIElDb25maWd1cmVkU2l0ZSBnZXRUYXJnZXRTaXRlKCkgew0KLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0NCi0JCQkoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpOw0KLQkJaWYgKHNlbC5pc0VtcHR5KCkpDQotCQkJcmV0dXJuIG51bGw7DQotCQlyZXR1cm4gKElDb25maWd1cmVkU2l0ZSkgc2VsLmdldEZpcnN0RWxlbWVudCgpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjX3dlYmFwcC9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvc2VydmxldHMvSW5zdGFsbFNlcnZsZXQuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjX3dlYmFwcC9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvc2VydmxldHMvSW5zdGFsbFNlcnZsZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhlYmMzYS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyY193ZWJhcHAvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3NlcnZsZXRzL0luc3RhbGxTZXJ2bGV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuc2VydmxldHM7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgamF2YXguc2VydmxldC4qOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLmZvcm1zLkRldGFpbHNGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbC5QZW5kaW5nQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wYXJ0cy5TV1RVdGlsOwotCi0vKioKLSAqIEBhdXRob3IgZGVqYW4KLSAqCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBlZGl0IHRoZSB0ZW1wbGF0ZSB2YXJpYWJsZSAidHlwZWNvbW1lbnQiOgotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+VGVtcGxhdGVzLgotICogVG8gZW5hYmxlIGFuZCBkaXNhYmxlIHRoZSBjcmVhdGlvbiBvZiB0eXBlIGNvbW1lbnRzIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBJbnN0YWxsU2VydmxldCBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKLQlwcml2YXRlIFNlcnZsZXRDb25maWcgc2VydmxldENvbmZpZzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWTEVUX05BTUUgPSAiL0luc3RhbGxTZXJ2bGV0IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHZvaWQgaW5pdChTZXJ2bGV0Q29uZmlnIGNvbmZpZykgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24gewotCQl0aGlzLnNlcnZsZXRDb25maWcgPSBjb25maWc7Ci0JfQotCi0JcHVibGljIHZvaWQgZGVzdHJveSgpIHsKLQl9Ci0KLQlwdWJsaWMgU2VydmxldENvbmZpZyBnZXRTZXJ2bGV0Q29uZmlnKCkgewotCQlyZXR1cm4gc2VydmxldENvbmZpZzsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNlcnZsZXRJbmZvKCkgewotCQlyZXR1cm4gIkVjbGlwc2UgSW5zdGFsbCBzZXJ2bGV0IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHNlcnZpY2UoCi0JCUh0dHBTZXJ2bGV0UmVxdWVzdCBzZXJ2bGV0UmVxdWVzdCwKLQkJSHR0cFNlcnZsZXRSZXNwb25zZSBzZXJ2bGV0UmVzcG9uc2UpCi0JCXRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCVByaW50V3JpdGVyIHdyaXRlciA9Ci0JCQlTZXJ2bGV0c1V0aWwuY3JlYXRlUmVzcG9uc2VQcm9sb2d1ZShzZXJ2bGV0UmVzcG9uc2UpOwotCQlleGVjdXRlKHdyaXRlciwgc2VydmxldFJlcXVlc3QpOwotCQlTZXJ2bGV0c1V0aWwuY3JlYXRlUmVzcG9uc2VFcGlsb2d1ZSgKLQkJCXNlcnZsZXRSZXF1ZXN0LAotCQkJc2VydmxldFJlc3BvbnNlLAotCQkJd3JpdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgZXhlY3V0ZS4KLQkgKiBAcGFyYW0gc2VydmxldFJlcXVlc3QKLQkgKi8KLQlwcml2YXRlIHZvaWQgZXhlY3V0ZSgKLQkJUHJpbnRXcml0ZXIgd3JpdGVyLAotCQlIdHRwU2VydmxldFJlcXVlc3Qgc2VydmxldFJlcXVlc3QpIHsKLQkJU3RyaW5nIHNlcnZlclVSTCA9IHNlcnZsZXRSZXF1ZXN0LmdldFBhcmFtZXRlcigic2VydmVyIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGxpY2Vuc2UgPSBzZXJ2bGV0UmVxdWVzdC5nZXRQYXJhbWV0ZXIoImxpY2Vuc2UiKTsgLy8kTk9OLU5MUy0xJAotCQlib29sZWFuIG5lZWRMaWNlbnNlUGFnZSA9IHRydWU7Ci0JCWlmIChsaWNlbnNlICE9IG51bGwgJiYgbGljZW5zZS5lcXVhbHNJZ25vcmVDYXNlKCJmYWxzZSIpKSAvLyROT04tTkxTLTEkCi0JCQluZWVkTGljZW5zZVBhZ2UgPSBmYWxzZTsKLQotCQlTdHJpbmdbXSB2ZXJzaW9uZWRJZHMgPSBzZXJ2bGV0UmVxdWVzdC5nZXRQYXJhbWV0ZXJWYWx1ZXMoImZlYXR1cmUiKTsgLy8kTk9OLU5MUy0xJAotCi0JCWlmIChzZXJ2ZXJVUkwgPT0gbnVsbCkgewotCQkJY3JlYXRlUGFnZUVycm9yKHdyaXRlciwgVXBkYXRlVUkuZ2V0U3RyaW5nKCJJbnN0YWxsU2VydmxldC51bmtub3duU2VydmVyVVJMIikpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKHZlcnNpb25lZElkcyA9PSBudWxsKSB7Ci0JCQljcmVhdGVQYWdlRXJyb3Iod3JpdGVyLCBVcGRhdGVVSS5nZXRTdHJpbmcoIkluc3RhbGxTZXJ2bGV0Lm5vRmVhdHVyZXMiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoRGV0YWlsc0Zvcm0uaXNJblByb2dyZXNzKCkpIHsKLQkJCVNlcnZsZXRzVXRpbC5jcmVhdGVFcnJvcih3cml0ZXIsIFVwZGF0ZVVJLmdldFN0cmluZygiSW5zdGFsbFNlcnZsZXQuaW5Qcm9ncmVzcyIpLCBudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCQl0cnkgewotCQkJVVJMIHVybCA9IG5ldyBVUkwoc2VydmVyVVJMKTsKLQkJCVZlcnNpb25lZElkZW50aWZpZXJbXSB2aWRzID0KLQkJCQljb21wdXRlVmVyc2lvbmVkSWRlbnRpZmllcnModmVyc2lvbmVkSWRzKTsKLQkJCWJvb2xlYW4gc3VjY2VzcyA9Ci0JCQkJZXhlY3V0ZUluc3RhbGwod3JpdGVyLCB1cmwsIHZpZHMsIG5lZWRMaWNlbnNlUGFnZSk7Ci0JCQlpZiAoc3VjY2VzcykKLQkJCQlTZXJ2bGV0c1V0aWwuY3JlYXRlSW5mbyh3cml0ZXIpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJY3JlYXRlUGFnZUVycm9yKHdyaXRlciwgVXBkYXRlVUkuZ2V0Rm9ybWF0dGVkTWVzc2FnZSgiSW5zdGFsbFNlcnZsZXQuaW5jb3JyZWN0VVJMRm9ybWF0IiwgLy8kTk9OLU5MUy0xJAotCQkJc2VydmVyVVJMLnRvU3RyaW5nKCkpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVQYWdlRXJyb3IoUHJpbnRXcml0ZXIgd3JpdGVyLCBTdHJpbmcgcHJvYmxlbSkgewotCQlTZXJ2bGV0c1V0aWwuY3JlYXRlRXJyb3Iod3JpdGVyLCBwcm9ibGVtLCBVcGRhdGVVSS5nZXRTdHJpbmcoIkluc3RhbGxTZXJ2bGV0LmNvbnRhY3RXZWJtYXN0ZXIiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIFZlcnNpb25lZElkZW50aWZpZXJbXSBjb21wdXRlVmVyc2lvbmVkSWRlbnRpZmllcnMoU3RyaW5nW10gYXJyYXkpIHsKLQkJQXJyYXlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIGlkX3ZlcnNpb24gPSBhcnJheVtpXTsKLQkJCWludCBzZXAgPSBpZF92ZXJzaW9uLmxhc3RJbmRleE9mKCdfJyk7Ci0JCQlpZiAoc2VwID09IC0xKQotCQkJCWNvbnRpbnVlOwotCQkJU3RyaW5nIGlkID0gaWRfdmVyc2lvbi5zdWJzdHJpbmcoMCwgc2VwKTsKLQkJCVN0cmluZyB2ZXJzaW9uID0gaWRfdmVyc2lvbi5zdWJzdHJpbmcoc2VwICsgMSk7Ci0JCQlWZXJzaW9uZWRJZGVudGlmaWVyIHZpZCA9IG5ldyBWZXJzaW9uZWRJZGVudGlmaWVyKGlkLCB2ZXJzaW9uKTsKLQkJCXJlc3VsdC5hZGQodmlkKTsKLQkJfQotCQlyZXR1cm4gKFZlcnNpb25lZElkZW50aWZpZXJbXSkgcmVzdWx0LnRvQXJyYXkoCi0JCQluZXcgVmVyc2lvbmVkSWRlbnRpZmllcltyZXN1bHQuc2l6ZSgpXSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGV4ZWN1dGVJbnN0YWxsKAotCQlQcmludFdyaXRlciB3cml0ZXIsCi0JCVVSTCBzaXRlVVJMLAotCQlWZXJzaW9uZWRJZGVudGlmaWVyW10gdmlkcywKLQkJYm9vbGVhbiBuZWVkTGljZW5zZVBhZ2UpIHsKLQkJaWYgKHZpZHMubGVuZ3RoID09IDEpIHsKLQkJCXJldHVybiBleGVjdXRlSW5zdGFsbCh3cml0ZXIsIHNpdGVVUkwsIHZpZHNbMF0sIG5lZWRMaWNlbnNlUGFnZSk7Ci0JCX0gZWxzZSB7Ci0JCQlTZXJ2bGV0c1V0aWwuY3JlYXRlRXJyb3Iod3JpdGVyLCBVcGRhdGVVSS5nZXRTdHJpbmcoIkluc3RhbGxTZXJ2bGV0Lm11bHRpcGxlSW5zdGFsbCIpLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGV4ZWN1dGVJbnN0YWxsKAotCQlmaW5hbCBQcmludFdyaXRlciB3cml0ZXIsCi0JCWZpbmFsIFVSTCBzaXRlVVJMLAotCQlmaW5hbCBWZXJzaW9uZWRJZGVudGlmaWVyIHZpZCwKLQkJZmluYWwgYm9vbGVhbiBuZWVkTGljZW5zZVBhZ2UpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gU1dUVXRpbC5nZXRTdGFuZGFyZERpc3BsYXkoKTsKLQkJZmluYWwgYm9vbGVhbltdIHJlc3VsdCA9IG5ldyBib29sZWFuW10geyBmYWxzZSB9OwotCi0JCWRpc3BsYXkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWZpbmFsIFNoZWxsIHNoZWxsID0gVXBkYXRlVUkuZ2V0QWN0aXZlV29ya2JlbmNoU2hlbGwoKTsKLQkJCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShzaGVsbC5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJcmVzdWx0WzBdID0KLQkJCQkJCQlkb0V4ZWN1dGVJbnN0YWxsKAotCQkJCQkJCQl3cml0ZXIsCi0JCQkJCQkJCXNoZWxsLAotCQkJCQkJCQlzaXRlVVJMLAotCQkJCQkJCQl2aWQsCi0JCQkJCQkJCW5lZWRMaWNlbnNlUGFnZSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfSk7Ci0JCXJldHVybiByZXN1bHRbMF07Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGRvRXhlY3V0ZUluc3RhbGwoCi0JCVByaW50V3JpdGVyIHdyaXRlciwKLQkJZmluYWwgU2hlbGwgc2hlbGwsCi0JCVVSTCBzaXRlVVJMLAotCQlWZXJzaW9uZWRJZGVudGlmaWVyIHZpZCwKLQkJZmluYWwgYm9vbGVhbiBuZWVkTGljZW5zZVBhZ2UpIHsKLQkJc2hlbGwuZm9yY2VBY3RpdmUoKTsKLQkJSUZlYXR1cmUgZmVhdHVyZSA9Ci0JCQlEZXRhaWxzRm9ybS5mZXRjaEZlYXR1cmVGcm9tU2VydmVyKHNoZWxsLCBzaXRlVVJMLCB2aWQpOwotCQlpZiAoZmVhdHVyZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlJRmVhdHVyZSBsYXRlc3RPbGRGZWF0dXJlID0gZmluZExhdGVzdE9sZEZlYXR1cmUoZmVhdHVyZSk7Ci0KLQkJaWYgKGxhdGVzdE9sZEZlYXR1cmUgIT0gbnVsbCkgewotCQkJaWYgKGxhdGVzdE9sZEZlYXR1cmUKLQkJCQkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpCi0JCQkJLmVxdWFscyhmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSkpIHsKLQkJCQkvLyBBbHJlYWR5IGluc3RhbGxlZC4KLQkJCQlTZXJ2bGV0c1V0aWwuY3JlYXRlRXJyb3Iod3JpdGVyLCBVcGRhdGVVSS5nZXRTdHJpbmcoIkluc3RhbGxTZXJ2bGV0LmFscmVhZHlJbnN0YWxsZWQiKSwgLy8kTk9OLU5MUy0xJAotCQkJCVVwZGF0ZVVJLmdldFN0cmluZygiSW5zdGFsbFNlcnZsZXQuYWxyZWFkeUhhdmVJdCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWlmIChsYXRlc3RPbGRGZWF0dXJlCi0JCQkJLmdldFZlcnNpb25lZElkZW50aWZpZXIoKQotCQkJCS5nZXRWZXJzaW9uKCkKLQkJCQkuaXNHcmVhdGVyVGhhbihmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRWZXJzaW9uKCkpKSB7Ci0JCQkJU2VydmxldHNVdGlsLmNyZWF0ZUVycm9yKHdyaXRlciwgVXBkYXRlVUkuZ2V0U3RyaW5nKCJJbnN0YWxsU2VydmxldC5vbGRlckZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCVVwZGF0ZVVJLmdldFN0cmluZygiSW5zdGFsbFNlcnZsZXQubm90aGluZzIiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJZmluYWwgUGVuZGluZ0NoYW5nZSBqb2I7Ci0KLQotCQlpZiAobGF0ZXN0T2xkRmVhdHVyZSAhPSBudWxsKQotCQkJam9iID0gbmV3IFBlbmRpbmdDaGFuZ2UobGF0ZXN0T2xkRmVhdHVyZSwgZmVhdHVyZSk7Ci0JCWVsc2UKLQkJCWpvYiA9IG5ldyBQZW5kaW5nQ2hhbmdlKGZlYXR1cmUsIFBlbmRpbmdDaGFuZ2UuSU5TVEFMTCk7Ci0KLQkJc2hlbGwuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJRGV0YWlsc0Zvcm0uZXhlY3V0ZUpvYihzaGVsbCwgam9iLCBuZWVkTGljZW5zZVBhZ2UpOwotCQkJfQotCQl9KTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSBJRmVhdHVyZSBmaW5kTGF0ZXN0T2xkRmVhdHVyZShJRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCUlGZWF0dXJlW10gb2xkRmVhdHVyZXMgPSBVcGRhdGVVSS5nZXRJbnN0YWxsZWRGZWF0dXJlcyhmZWF0dXJlKTsKLQkJaWYgKG9sZEZlYXR1cmVzLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSUZlYXR1cmUgbGF0ZXN0ID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvbGRGZWF0dXJlcy5sZW5ndGg7IGkrKykgewotCQkJSUZlYXR1cmUgY3VyciA9IG9sZEZlYXR1cmVzW2ldOwotCQkJaWYgKGxhdGVzdCA9PSBudWxsCi0JCQkJfHwgY3Vyci5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0VmVyc2lvbigpLmlzR3JlYXRlclRoYW4oCi0JCQkJCWxhdGVzdC5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0VmVyc2lvbigpKSkgewotCQkJCWxhdGVzdCA9IGN1cnI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxhdGVzdDsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyY193ZWJhcHAvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3NlcnZsZXRzL1NlcnZsZXRzVXRpbC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmNfd2ViYXBwL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9zZXJ2bGV0cy9TZXJ2bGV0c1V0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIwZjVjOS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyY193ZWJhcHAvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3NlcnZsZXRzL1NlcnZsZXRzVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnNlcnZsZXRzOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ib290LkJvb3RMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJOwotCi0vKioKLSAqIEBhdXRob3IgZGVqYW4KLSAqCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBlZGl0IHRoZSB0ZW1wbGF0ZSB2YXJpYWJsZSAidHlwZWNvbW1lbnQiOgotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+VGVtcGxhdGVzLgotICogVG8gZW5hYmxlIGFuZCBkaXNhYmxlIHRoZSBjcmVhdGlvbiBvZiB0eXBlIGNvbW1lbnRzIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2bGV0c1V0aWwgewotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2VydmVySW5mbyhIdHRwU2VydmxldFJlcXVlc3Qgc2VydmxldFJlcXVlc3QpIHsKLQkJU3RyaW5nIGhvc3QgPSBzZXJ2bGV0UmVxdWVzdC5nZXRTZXJ2ZXJOYW1lKCk7Ci0JCWludCBwb3J0ID0gc2VydmxldFJlcXVlc3QuZ2V0U2VydmVyUG9ydCgpOwotCQlTdHJpbmcgY29udGV4dCA9IHNlcnZsZXRSZXF1ZXN0LmdldENvbnRleHRQYXRoKCk7Ci0KLQkJRW51bWVyYXRpb24gYXR0cyA9IHNlcnZsZXRSZXF1ZXN0LmdldFBhcmFtZXRlck5hbWVzKCk7Ci0JCVN0cmluZ0J1ZmZlciBidWZmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKDsgYXR0cy5oYXNNb3JlRWxlbWVudHMoKTspIHsKLQkJCVN0cmluZyBhdHROYW1lID0gKFN0cmluZykgYXR0cy5uZXh0RWxlbWVudCgpOwotCQkJT2JqZWN0IGF0dFZhbHVlID0gc2VydmxldFJlcXVlc3QuZ2V0UGFyYW1ldGVyKGF0dE5hbWUpOwotCQkJYnVmZi5hcHBlbmQoYXR0TmFtZSArICI9IiArICJcIiIgKyBhdHRWYWx1ZSArICJcIisiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJfQotCQlyZXR1cm4gaG9zdCArICI6IiArIHBvcnQgKyBjb250ZXh0ICsgIj8iICsgYnVmZi50b1N0cmluZygpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFByaW50V3JpdGVyIGNyZWF0ZVJlc3BvbnNlUHJvbG9ndWUoSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKLQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvaHRtbCIpOyAvLyROT04tTkxTLTEkCi0JCVByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOwotCQlTdHJpbmcgdGl0bGUgPSBVcGRhdGVVSS5nZXRTdHJpbmcoIlNlcnZsZXRzVXRpbC5yZXNwb25zZVRpdGxlIik7IC8vJE5PTi1OTFMtMSQKLQkJd3JpdGVyLnByaW50bG4oCi0JCQkiIiAvLyROT04tTkxTLTEkCi0JCQkJKyAiPCFET0NUWVBFIEhUTUwgUFVCTElDIFwiIC0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU5cIj4iIC8vJE5PTi1OTFMtMSQKLQkJCQkrICJcbiA8SFRNTD4gXG4gPEhFQUQ+IFxuIiAvLyROT04tTkxTLTEkCi0JCQkJKyAiPFRJVExFPiIrdGl0bGUrIjwvVElUTEU+XG4iIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCSsgIjxNRVRBIGh0dHAtZXF1aXY9XCJDb250ZW50LVR5cGVcIiBjb250ZW50PVwidGV4dC9odG1sOyBjaGFyc2V0PVVURi04XCI+XG4iIC8vJE5PTi1OTFMtMSQKLQkJCQkrICI8L0hFQUQ+Iik7IC8vJE5PTi1OTFMtMSQKLQkJd3JpdGVyLnByaW50bG4oIiA8Qk9EWSB0b3BtYXJnaW49XCIwXCIgbGVmdG1hcmdpbj1cIjBcIj4iKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gd3JpdGVyOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVFcnJvcigKLQkJUHJpbnRXcml0ZXIgd3JpdGVyLAotCQlTdHJpbmcgcHJvYmxlbSwKLQkJU3RyaW5nIHJlc29sdXRpb24pIHsKLQkJY3JlYXRlSGVhZGluZyh3cml0ZXIsIFVwZGF0ZVVJLmdldFN0cmluZygiU2VydmxldHNVdGlsLnVwZGF0ZUZhaWxlZCIpKTsgLy8kTk9OLU5MUy0xJAotCQlzdGFydFRleHRBcmVhKHdyaXRlcik7Ci0JCWNyZWF0ZVBhcmFncmFwaCh3cml0ZXIsIFVwZGF0ZVVJLmdldFN0cmluZygiU2VydmxldHNVdGlsLnByb2JsZW0iKSwgcHJvYmxlbSk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHJlc29sdXRpb24gIT0gbnVsbCkgewotCQkJd3JpdGVyLnByaW50bG4oIjxwPiIpOyAvLyROT04tTkxTLTEkCi0JCQljcmVhdGVQYXJhZ3JhcGgod3JpdGVyLCBVcGRhdGVVSS5nZXRTdHJpbmcoIlNlcnZsZXRzVXRpbC53aGF0VG9EbyIpLCByZXNvbHV0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVuZFRleHRBcmVhKHdyaXRlcik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZVBhcmFncmFwaCgKLQkJUHJpbnRXcml0ZXIgd3JpdGVyLAotCQlTdHJpbmcgaGVhZGluZywKLQkJU3RyaW5nIHRleHQpIHsKLQkJd3JpdGVyLnByaW50KCI8Yj48Zm9udCBjb2xvcj1cIiM1Qjc4QUNcIj4iKTsgLy8kTk9OLU5MUy0xJAotCQl3cml0ZXIucHJpbnQoaGVhZGluZyk7Ci0JCXdyaXRlci5wcmludGxuKCI8L2I+PC9mb250Pjxicj4iKTsgLy8kTk9OLU5MUy0xJAotCQl3cml0ZXIucHJpbnRsbih0ZXh0KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlSW5mbyhQcmludFdyaXRlciB3cml0ZXIpIHsKLQkJY3JlYXRlSGVhZGluZyh3cml0ZXIsIFVwZGF0ZVVJLmdldFN0cmluZygiU2VydmxldHNVdGlsLnVwZGF0ZUluUHJvZ3Jlc3MiKSk7IC8vJE5PTi1OTFMtMSQKLQkJc3RhcnRUZXh0QXJlYSh3cml0ZXIpOwotCQl3cml0ZXIucHJpbnRsbigKLQkJCVVwZGF0ZVVJLmdldFN0cmluZygiU2VydmxldHNVdGlsLnVwZGF0ZUluaXRpYXRlZCIpKTsgLy8kTk9OLU5MUy0xJAotCQllbmRUZXh0QXJlYSh3cml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzV2luMzIoKSB7Ci0JCXJldHVybiBCb290TG9hZGVyLmdldFdTKCkuZXF1YWxzKCJ3aW4zMiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBzdGFydFRleHRBcmVhKFByaW50V3JpdGVyIHdyaXRlcikgewotCQl3cml0ZXIucHJpbnRsbigKLQkJCSI8dGFibGUgYm9yZGVyPVwiMFwiIHdpZHRoPVwiMTAwJVwiIGNlbGxzcGFjaW5nPVwiNVwiIGNlbGxwYWRkaW5nPVwiNVwiPiIpOyAvLyROT04tTkxTLTEkCi0JCXdyaXRlci5wcmludGxuKCI8dHI+Iik7IC8vJE5PTi1OTFMtMSQKLQkJd3JpdGVyLnByaW50KCI8dGQgd2lkdGg9XCIxMDAlXCI+Iik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGlzV2luMzIoKSkKLQkJCXdyaXRlci5wcmludGxuKCI8Zm9udCBmYWNlPVwiTVMgU2FucyBTZXJpZlwiIHNpemU9XCIxXCI+Iik7IC8vJE5PTi1OTFMtMSQKLQkJZWxzZQotCQkJd3JpdGVyLnByaW50bG4oIiIpOyAvLyROT04tTkxTLTEkCi0JfQotCXByaXZhdGUgc3RhdGljIHZvaWQgZW5kVGV4dEFyZWEoUHJpbnRXcml0ZXIgd3JpdGVyKSB7Ci0JCWlmIChpc1dpbjMyKCkpCi0JCQl3cml0ZXIucHJpbnRsbigiPC9mb250PiIpOyAvLyROT04tTkxTLTEkCi0JCXdyaXRlci5wcmludGxuKCI8L3RkPiIpOyAvLyROT04tTkxTLTEkCi0JCXdyaXRlci5wcmludGxuKCI8L3RyPiIpOyAvLyROT04tTkxTLTEkCi0JCXdyaXRlci5wcmludGxuKCI8L3RhYmxlPiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZUhlYWRpbmcoUHJpbnRXcml0ZXIgd3JpdGVyLCBTdHJpbmcgdGl0bGUpIHsKLQkJd3JpdGVyLnByaW50bG4oCi0JCQkiPHRhYmxlIGNvbHM9MSB3aWR0aD1cIjU4OFwiIGNlbGxzcGFjaW5nPVwiMFwiIGNlbGxwYWRkaW5nPVwiMFwiPiIpOyAvLyROT04tTkxTLTEkCi0JCXdyaXRlci5wcmludGxuKCI8dHI+Iik7IC8vJE5PTi1OTFMtMSQKLQkJd3JpdGVyLnByaW50bG4oCi0JCQkiPHRkIGJhY2tncm91bmQ9XCJpbWFnZXMvZm9ybV9iYW5uZXIuanBnXCIgd2lkdGg9XCI1ODBcIiBoZWlnaHQ9XCIzMFwiPiIpOyAvLyROT04tTkxTLTEkCi0JCXdyaXRlci5wcmludCgiPHA+PGI+PGZvbnQgc2l6ZT1cIjNcIiBmYWNlPVwiVGFob21hXCI+Jm5ic3A7Iik7IC8vJE5PTi1OTFMtMSQKLQkJd3JpdGVyLnByaW50KHRpdGxlKTsKLQkJd3JpdGVyLnByaW50bG4oIjwvZm9udD48L2I+PC9wPiIpOyAvLyROT04tTkxTLTEkCi0JCXdyaXRlci5wcmludGxuKCI8L3RkPiIpOyAvLyROT04tTkxTLTEkCi0JCXdyaXRlci5wcmludGxuKCI8L3RyPiIpOyAvLyROT04tTkxTLTEkCi0KLQkJd3JpdGVyLnByaW50bG4oIjx0cj4iKTsgLy8kTk9OLU5MUy0xJAotCQl3cml0ZXIucHJpbnRsbigKLQkJCSI8dGQgd2lkdGg9XCI1ODBcIj48aW1nIGJvcmRlcj1cIjBcIiBzcmM9XCJpbWFnZXMvZm9ybV91bmRlcmxpbmUuanBnXCIgd2lkdGg9XCI2MDBcIiBoZWlnaHQ9XCIxNVwiPjwvdGQ+Iik7IC8vJE5PTi1OTFMtMSQKLQkJd3JpdGVyLnByaW50bG4oIjwvdGQ+Iik7IC8vJE5PTi1OTFMtMSQKLQkJd3JpdGVyLnByaW50bG4oIjwvdHI+Iik7IC8vJE5PTi1OTFMtMSQKLQkJd3JpdGVyLnByaW50bG4oIjwvdGFibGU+Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlUmVzcG9uc2VFcGlsb2d1ZSgKLQkJSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCi0JCUh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsCi0JCVByaW50V3JpdGVyIHdyaXRlcikgewotCi0JCVN0cmluZyBiYWNrVVJMID0gZ2V0T3JpZ2luYXRpbmdVUkwocmVxdWVzdCk7Ci0JCWlmIChiYWNrVVJMICE9IG51bGwpIHsKLQkJCXN0YXJ0VGV4dEFyZWEod3JpdGVyKTsKLQkJCVN0cmluZyBiYWNrVGV4dCA9IFVwZGF0ZVVJLmdldFN0cmluZygiU2VydmxldHNVdGlsLmJhY2siKTsgLy8kTk9OLU5MUy0xJAotCQkJd3JpdGVyLnByaW50KCI8aW1nIGJvcmRlcj1cIjBcIiBzcmM9XCJpbWFnZXMvYmFja3dhcmRfbmF2LmdpZlwiLz48YSBocmVmPVwiIik7IC8vJE5PTi1OTFMtMSQKLQkJCXdyaXRlci5wcmludChnZXRPcmlnaW5hdGluZ1VSTChyZXF1ZXN0KSk7Ci0JCQl3cml0ZXIucHJpbnQoIlwiPiIrYmFja1RleHQrIjwvYT4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQllbmRUZXh0QXJlYSh3cml0ZXIpOwotCQl9Ci0JCXdyaXRlci5wcmludGxuKCIgPC9CT0RZPiAiKTsgLy8kTk9OLU5MUy0xJAotCQl3cml0ZXIucHJpbnRsbigiPC9IVE1MPiIpOyAvLyROT04tTkxTLTEkCi0JCXdyaXRlci5jbG9zZSgpOwotCX0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0T3JpZ2luYXRpbmdVUkwoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJcmV0dXJuIHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJiYWNrVVJMIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS93ZWJhcHAvV0VCLUlORi8uY3ZzaWdub3JlIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS93ZWJhcHAvV0VCLUlORi8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGIwN2U5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvd2ViYXBwL1dFQi1JTkYvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWNsYXNzZXMKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvd2ViYXBwL1dFQi1JTkYvbGliLy5jdnNpZ25vcmUgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3dlYmFwcC9XRUItSU5GL2xpYi8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDI5MmEzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvd2ViYXBwL1dFQi1JTkYvbGliLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi11cGRhdGUtc2VydmxldHMuamFyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmODQ3NzQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS93ZWJhcHAvV0VCLUlORi93ZWIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgotCi0KLTwhRE9DVFlQRSB3ZWItYXBwCi0gICAgUFVCTElDICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgV2ViIEFwcGxpY2F0aW9uIDIuMi8vRU4iCi0gICAgImh0dHA6Ly9qYXZhLnN1bi5jb20vajJlZS9kdGRzL3dlYi1hcHBfMi4yLmR0ZCI+Ci0KLTx3ZWItYXBwPgotCi0gICAgPHNlcnZsZXQ+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+aW5zdGFsbDwvc2VydmxldC1uYW1lPgotICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuc2VydmxldHMuSW5zdGFsbFNlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+Ci0gICAgPC9zZXJ2bGV0PgotICAgIAotCTxzZXJ2bGV0LW1hcHBpbmc+Ci0JCTxzZXJ2bGV0LW5hbWU+aW5zdGFsbDwvc2VydmxldC1uYW1lPgotCQk8dXJsLXBhdHRlcm4+L2luc3RhbGw8L3VybC1wYXR0ZXJuPgotCTwvc2VydmxldC1tYXBwaW5nPgotCi08L3dlYi1hcHA+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS93ZWJhcHAvaW1hZ2VzL2JhY2t3YXJkX25hdi5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3dlYmFwcC9pbWFnZXMvYmFja3dhcmRfbmF2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODUxODhiNy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3dlYmFwcC9pbWFnZXMvYmFja3dhcmRfbmF2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvd2ViYXBwL2ltYWdlcy9mb3JtX2Jhbm5lci5qcGcgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3dlYmFwcC9pbWFnZXMvZm9ybV9iYW5uZXIuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTNlMmQyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvd2ViYXBwL2ltYWdlcy9mb3JtX2Jhbm5lci5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3dlYmFwcC9pbWFnZXMvZm9ybV91bmRlcmxpbmUuanBnIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS93ZWJhcHAvaW1hZ2VzL2Zvcm1fdW5kZXJsaW5lLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZmM2QwYi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3dlYmFwcC9pbWFnZXMvZm9ybV91bmRlcmxpbmUuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgo=