ZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuYW50LnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0LmFudC50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GCmluZGV4IGM2NDQwMWEuLjI2OGJhZWUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuYW50LnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5hbnQudGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtNCwxMyArNCwxMyBAQAogQnVuZGxlLU5hbWU6ICVwbHVnaW5fbmFtZQogQXV0b21hdGljLU1vZHVsZS1OYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LmFudC50ZXN0CiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LmFudC50ZXN0Ci1CdW5kbGUtVmVyc2lvbjogNC4xMS44LnF1YWxpZmllcgorQnVuZGxlLVZlcnNpb246IDUuMC40LnF1YWxpZmllcgogQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKYXZhU0UtMS44CiBJbXBvcnQtUGFja2FnZTogb3JnLmFwYWNoZS50b29scy5hbnQsCi0gb3JnLmVjbGlwc2UuamdpdC5hbnQudGFza3M7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0O3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmFudC50YXNrczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0O3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKICBvcmcuaGFtY3Jlc3QuY29yZTt2ZXJzaW9uPSJbMS4xLjAsMi4wLjApIiwKICBvcmcuanVuaXQ7dmVyc2lvbj0iWzQuMTIsNS4wLjApIgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5hbnQudGVzdC9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5hbnQudGVzdC9wb20ueG1sCmluZGV4IDY0YjhmODEuLjRiZmJjOWUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuYW50LnRlc3QvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LmFudC50ZXN0L3BvbS54bWwKQEAgLTUwLDcgKzUwLDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjQuMTEuOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj41LjAuNC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC5hbnQudGVzdDwvYXJ0aWZhY3RJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuYW50L01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5hbnQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggMDA0MDBiYy4uNmRmMzA5MSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5hbnQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5hbnQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTMsMTEgKzMsMTEgQEAKIEJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUKIEF1dG9tYXRpYy1Nb2R1bGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC5hbnQKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpnaXQuYW50Ci1CdW5kbGUtVmVyc2lvbjogNC4xMS44LnF1YWxpZmllcgorQnVuZGxlLVZlcnNpb246IDUuMC40LnF1YWxpZmllcgogQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEphdmFTRS0xLjgKIEltcG9ydC1QYWNrYWdlOiBvcmcuYXBhY2hlLnRvb2xzLmFudCwKLSAgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIgorICBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIgogQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCiBCdW5kbGUtVmVuZG9yOiAlUHJvdmlkZXItTmFtZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQuYW50LnRhc2tzO3ZlcnNpb249IjQuMTEuOCI7CitFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5hbnQudGFza3M7dmVyc2lvbj0iNS4wLjQiOwogIHVzZXM6PSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcyxvcmcuYXBhY2hlLnRvb2xzLmFudCIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuYW50L3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LmFudC9wb20ueG1sCmluZGV4IDdkODY3MTguLmEyODgzNjAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuYW50L3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5hbnQvcG9tLnhtbApAQCAtNDgsNyArNDgsNyBAQAogCTxwYXJlbnQ+CiAJCTxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAJCTxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQtcGFyZW50PC9hcnRpZmFjdElkPgotCQk8dmVyc2lvbj40LjExLjgtU05BUFNIT1Q8L3ZlcnNpb24+CisJCTx2ZXJzaW9uPjUuMC40LVNOQVBTSE9UPC92ZXJzaW9uPgogCTwvcGFyZW50PgogCiAJPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC5hbnQ8L2FydGlmYWN0SWQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggMDVkMTZhYi4uMzI4NWVlNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMyw3ICszLDcgQEAKIEJ1bmRsZS1OYW1lOiAlcGx1Z2luX25hbWUKIEF1dG9tYXRpYy1Nb2R1bGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlCiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUKLUJ1bmRsZS1WZXJzaW9uOiA0LjExLjgucXVhbGlmaWVyCitCdW5kbGUtVmVyc2lvbjogNS4wLjQucXVhbGlmaWVyCiBCdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJfbmFtZQogQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCiBCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSmF2YVNFLTEuOApAQCAtMTMsMTUgKzEzLDE1IEBACiAgb3JnLmFwYWNoZS5jb21tb25zLmNvbXByZXNzLmNvbXByZXNzb3JzLmJ6aXAyO3ZlcnNpb249IlsxLjQsMi4wKSIsCiAgb3JnLmFwYWNoZS5jb21tb25zLmNvbXByZXNzLmNvbXByZXNzb3JzLmd6aXA7dmVyc2lvbj0iWzEuNCwyLjApIiwKICBvcmcuYXBhY2hlLmNvbW1vbnMuY29tcHJlc3MuY29tcHJlc3NvcnMueHo7dmVyc2lvbj0iWzEuNCwyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmFwaTt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5ubHM7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmFwaTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmxpYjt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lm5sczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAogIG9yZy5vc2dpLmZyYW1ld29yazt2ZXJzaW9uPSJbMS4zLjAsMi4wLjApIgogQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKIEJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZS5Gb3JtYXRBY3RpdmF0b3IKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmU7dmVyc2lvbj0iNC4xMS44IjsKK0V4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmU7dmVyc2lvbj0iNS4wLjQiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5saWIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LmFwaSwKICAgIG9yZy5hcGFjaGUuY29tbW9ucy5jb21wcmVzcy5hcmNoaXZlcnMsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRgppbmRleCA1MDBjOWM5Li5mODU1NTFlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZS9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYKQEAgLTMsNSArMyw1IEBACiBCdW5kbGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlIC0gU291cmNlcwogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlLnNvdXJjZQogQnVuZGxlLVZlbmRvcjogRWNsaXBzZS5vcmcgLSBKR2l0Ci1CdW5kbGUtVmVyc2lvbjogNC4xMS44LnF1YWxpZmllcgotRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IG9yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZTt2ZXJzaW9uPSI0LjExLjgucXVhbGlmaWVyIjtyb290cz0iLiIKK0J1bmRsZS1WZXJzaW9uOiA1LjAuNC5xdWFsaWZpZXIKK0VjbGlwc2UtU291cmNlQnVuZGxlOiBvcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmU7dmVyc2lvbj0iNS4wLjQucXVhbGlmaWVyIjtyb290cz0iLiIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZS9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL3BvbS54bWwKaW5kZXggNGI4YjdlZC4uNGJmYTE3NiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL3BvbS54bWwKQEAgLTUwLDcgKzUwLDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjQuMTEuOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj41LjAuNC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlPC9hcnRpZmFjdElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FyY2hpdmUvVGFyRm9ybWF0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXJjaGl2ZS9UYXJGb3JtYXQuamF2YQppbmRleCA3NTU5YWRhLi45ZWQ2MGQ5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXJjaGl2ZS9UYXJGb3JtYXQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXJjaGl2ZS9UYXJGb3JtYXQuamF2YQpAQCAtNDIsNiArNDIsOCBAQAogICovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZTsKIAoraW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUkFDVEVSX0VOQ09ESU5HOworCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKQEAgLTgyLDIyICs4NCwxNCBAQCBwdWJsaWMgQXJjaGl2ZU91dHB1dFN0cmVhbSBjcmVhdGVBcmNoaXZlT3V0cHV0U3RyZWFtKE91dHB1dFN0cmVhbSBzKQogCUBPdmVycmlkZQogCXB1YmxpYyBBcmNoaXZlT3V0cHV0U3RyZWFtIGNyZWF0ZUFyY2hpdmVPdXRwdXRTdHJlYW0oT3V0cHV0U3RyZWFtIHMsCiAJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IG8pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVRhckFyY2hpdmVPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IFRhckFyY2hpdmVPdXRwdXRTdHJlYW0ocywgIlVURi04Iik7IC8vJE5PTi1OTFMtMSQKKwkJVGFyQXJjaGl2ZU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgVGFyQXJjaGl2ZU91dHB1dFN0cmVhbShzLAorCQkJCUNIQVJBQ1RFUl9FTkNPRElORyk7CiAJCW91dC5zZXRMb25nRmlsZU1vZGUoVGFyQXJjaGl2ZU91dHB1dFN0cmVhbS5MT05HRklMRV9QT1NJWCk7CiAJCW91dC5zZXRCaWdOdW1iZXJNb2RlKFRhckFyY2hpdmVPdXRwdXRTdHJlYW0uQklHTlVNQkVSX1BPU0lYKTsKIAkJcmV0dXJuIGFwcGx5Rm9ybWF0T3B0aW9ucyhvdXQsIG8pOwogCX0KIAogCS8qKiB7QGluaGVyaXREb2N9ICovCi0JQERlcHJlY2F0ZWQKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBwdXRFbnRyeShBcmNoaXZlT3V0cHV0U3RyZWFtIG91dCwKLQkJCVN0cmluZyBwYXRoLCBGaWxlTW9kZSBtb2RlLCBPYmplY3RMb2FkZXIgbG9hZGVyKQotCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcHV0RW50cnkob3V0LCBudWxsLCBwYXRoLCBtb2RlLGxvYWRlcik7Ci0JfQotCi0JLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBwdXRFbnRyeShBcmNoaXZlT3V0cHV0U3RyZWFtIG91dCwKIAkJCU9iamVjdElkIHRyZWUsIFN0cmluZyBwYXRoLCBGaWxlTW9kZSBtb2RlLCBPYmplY3RMb2FkZXIgbG9hZGVyKQpAQCAtMTA2LDcgKzEwMCw3IEBAIHB1YmxpYyB2b2lkIHB1dEVudHJ5KEFyY2hpdmVPdXRwdXRTdHJlYW0gb3V0LAogCQkJZmluYWwgVGFyQXJjaGl2ZUVudHJ5IGVudHJ5ID0gbmV3IFRhckFyY2hpdmVFbnRyeSgKIAkJCQkJcGF0aCwgVGFyQ29uc3RhbnRzLkxGX1NZTUxJTkspOwogCQkJZW50cnkuc2V0TGlua05hbWUobmV3IFN0cmluZygKLQkJCQkJbG9hZGVyLmdldENhY2hlZEJ5dGVzKDEwMCksICJVVEYtOCIpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlsb2FkZXIuZ2V0Q2FjaGVkQnl0ZXMoMTAwKSwgQ0hBUkFDVEVSX0VOQ09ESU5HKSk7CiAJCQlvdXQucHV0QXJjaGl2ZUVudHJ5KGVudHJ5KTsKIAkJCW91dC5jbG9zZUFyY2hpdmVFbnRyeSgpOwogCQkJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FyY2hpdmUvVGJ6MkZvcm1hdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FyY2hpdmUvVGJ6MkZvcm1hdC5qYXZhCmluZGV4IDJmOTVmNmQuLmZhNmE3YjAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZS9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcmNoaXZlL1RiejJGb3JtYXQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXJjaGl2ZS9UYnoyRm9ybWF0LmphdmEKQEAgLTgzLDE1ICs4Myw2IEBAIHB1YmxpYyBBcmNoaXZlT3V0cHV0U3RyZWFtIGNyZWF0ZUFyY2hpdmVPdXRwdXRTdHJlYW0oT3V0cHV0U3RyZWFtIHMsCiAJfQogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KLQlARGVwcmVjYXRlZAotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHB1dEVudHJ5KEFyY2hpdmVPdXRwdXRTdHJlYW0gb3V0LAotCQkJU3RyaW5nIHBhdGgsIEZpbGVNb2RlIG1vZGUsIE9iamVjdExvYWRlciBsb2FkZXIpCi0JCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQlwdXRFbnRyeShvdXQsIG51bGwsIHBhdGgsIG1vZGUsbG9hZGVyKTsKLQl9Ci0KLQkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHB1dEVudHJ5KEFyY2hpdmVPdXRwdXRTdHJlYW0gb3V0LAogCQkJT2JqZWN0SWQgdHJlZSwgU3RyaW5nIHBhdGgsIEZpbGVNb2RlIG1vZGUsIE9iamVjdExvYWRlciBsb2FkZXIpCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXJjaGl2ZS9UZ3pGb3JtYXQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZS9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcmNoaXZlL1RnekZvcm1hdC5qYXZhCmluZGV4IGIyMmE2MmQuLjM2OGI0ZjIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZS9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcmNoaXZlL1RnekZvcm1hdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZS9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcmNoaXZlL1RnekZvcm1hdC5qYXZhCkBAIC04MywxNSArODMsNiBAQCBwdWJsaWMgQXJjaGl2ZU91dHB1dFN0cmVhbSBjcmVhdGVBcmNoaXZlT3V0cHV0U3RyZWFtKE91dHB1dFN0cmVhbSBzLAogCX0KIAogCS8qKiB7QGluaGVyaXREb2N9ICovCi0JQERlcHJlY2F0ZWQKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBwdXRFbnRyeShBcmNoaXZlT3V0cHV0U3RyZWFtIG91dCwKLQkJCVN0cmluZyBwYXRoLCBGaWxlTW9kZSBtb2RlLCBPYmplY3RMb2FkZXIgbG9hZGVyKQotCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcHV0RW50cnkob3V0LCBudWxsLCBwYXRoLCBtb2RlLGxvYWRlcik7Ci0JfQotCi0JLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBwdXRFbnRyeShBcmNoaXZlT3V0cHV0U3RyZWFtIG91dCwKIAkJCU9iamVjdElkIHRyZWUsIFN0cmluZyBwYXRoLCBGaWxlTW9kZSBtb2RlLCBPYmplY3RMb2FkZXIgbG9hZGVyKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FyY2hpdmUvVHh6Rm9ybWF0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXJjaGl2ZS9UeHpGb3JtYXQuamF2YQppbmRleCBkMjNkMmI2Li4zNjYxNmVkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXJjaGl2ZS9UeHpGb3JtYXQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXJjaGl2ZS9UeHpGb3JtYXQuamF2YQpAQCAtODMsMTUgKzgzLDYgQEAgcHVibGljIEFyY2hpdmVPdXRwdXRTdHJlYW0gY3JlYXRlQXJjaGl2ZU91dHB1dFN0cmVhbShPdXRwdXRTdHJlYW0gcywKIAl9CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwotCUBEZXByZWNhdGVkCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcHV0RW50cnkoQXJjaGl2ZU91dHB1dFN0cmVhbSBvdXQsCi0JCQlTdHJpbmcgcGF0aCwgRmlsZU1vZGUgbW9kZSwgT2JqZWN0TG9hZGVyIGxvYWRlcikKLQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXB1dEVudHJ5KG91dCwgbnVsbCwgcGF0aCwgbW9kZSxsb2FkZXIpOwotCX0KLQotCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgcHV0RW50cnkoQXJjaGl2ZU91dHB1dFN0cmVhbSBvdXQsCiAJCQlPYmplY3RJZCB0cmVlLCBTdHJpbmcgcGF0aCwgRmlsZU1vZGUgbW9kZSwgT2JqZWN0TG9hZGVyIGxvYWRlcikKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZS9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcmNoaXZlL1ppcEZvcm1hdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FyY2hpdmUvWmlwRm9ybWF0LmphdmEKaW5kZXggZGM4ZmI0NC4uODQ4MzgwMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FyY2hpdmUvWmlwRm9ybWF0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FyY2hpdmUvWmlwRm9ybWF0LmphdmEKQEAgLTg0LDE1ICs4NCw2IEBAIHB1YmxpYyBBcmNoaXZlT3V0cHV0U3RyZWFtIGNyZWF0ZUFyY2hpdmVPdXRwdXRTdHJlYW0oT3V0cHV0U3RyZWFtIHMsCiAJfQogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KLQlARGVwcmVjYXRlZAotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHB1dEVudHJ5KEFyY2hpdmVPdXRwdXRTdHJlYW0gb3V0LAotCQkJU3RyaW5nIHBhdGgsIEZpbGVNb2RlIG1vZGUsIE9iamVjdExvYWRlciBsb2FkZXIpCi0JCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQlwdXRFbnRyeShvdXQsIG51bGwsIHBhdGgsIG1vZGUsbG9hZGVyKTsKLQl9Ci0KLQkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHB1dEVudHJ5KEFyY2hpdmVPdXRwdXRTdHJlYW0gb3V0LAogCQkJT2JqZWN0SWQgdHJlZSwgU3RyaW5nIHBhdGgsIEZpbGVNb2RlIG1vZGUsIE9iamVjdExvYWRlciBsb2FkZXIpCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlL01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZS9NRVRBLUlORi9NQU5JRkVTVC5NRgppbmRleCA2NzVhMjcyLi42OWZiNDdjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTMsNyArMyw3IEBACiBCdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lCiBBdXRvbWF0aWMtTW9kdWxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUKLUJ1bmRsZS1WZXJzaW9uOiA0LjExLjgucXVhbGlmaWVyCitCdW5kbGUtVmVyc2lvbjogNS4wLjQucXVhbGlmaWVyCiBCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSmF2YVNFLTEuOAogQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCiBCdW5kbGUtVmVuZG9yOiAlUHJvdmlkZXItTmFtZQpAQCAtMjMsMTAgKzIzLDEwIEBACiAgb3JnLmFwYWNoZS5odHRwLmltcGwuY2xpZW50O3ZlcnNpb249Ils0LjMuMCw1LjAuMCkiLAogIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNvbm47dmVyc2lvbj0iWzQuMy4wLDUuMC4wKSIsCiAgb3JnLmFwYWNoZS5odHRwLnBhcmFtczt2ZXJzaW9uPSJbNC4zLjAsNS4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lm5sczt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHA7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHAuYXBhY2hlO3ZlcnNpb249IjQuMTEuOCI7Cisgb3JnLmVjbGlwc2UuamdpdC5ubHM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cDt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIKK0V4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5odHRwLmFwYWNoZTt2ZXJzaW9uPSI1LjAuNCI7CiAgIHVzZXM6PSJvcmcuYXBhY2hlLmh0dHAuY2xpZW50LAogICAgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cCwKICAgIG9yZy5hcGFjaGUuaHR0cC5lbnRpdHksCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlL3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlL3BvbS54bWwKaW5kZXggMjc2NzYyNy4uYmM3MWZhYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZS9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUvcG9tLnhtbApAQCAtNDgsNyArNDgsNyBAQAogCTxwYXJlbnQ+CiAJCTxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAJCTxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQtcGFyZW50PC9hcnRpZmFjdElkPgotCQk8dmVyc2lvbj40LjExLjgtU05BUFNIT1Q8L3ZlcnNpb24+CisJCTx2ZXJzaW9uPjUuMC40LVNOQVBTSE9UPC92ZXJzaW9uPgogCTwvcGFyZW50PgogCiAJPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZTwvYXJ0aWZhY3RJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L2h0dHAvYXBhY2hlL0h0dHBDbGllbnRDb25uZWN0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9odHRwL2FwYWNoZS9IdHRwQ2xpZW50Q29ubmVjdGlvbi5qYXZhCmluZGV4IDI4MTkzMDAuLjdmMWZlY2IgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L2h0dHAvYXBhY2hlL0h0dHBDbGllbnRDb25uZWN0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZS9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvaHR0cC9hcGFjaGUvSHR0cENsaWVudENvbm5lY3Rpb24uamF2YQpAQCAtNDIxLDcgKzQyMSw3IEBAIHB1YmxpYyB2b2lkIGNvbm5lY3QoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRIb3N0bmFtZVZlcmlmaWVyKGZpbmFsIEhvc3RuYW1lVmVyaWZpZXIgaG9zdG5hbWV2ZXJpZmllcikgeworCXB1YmxpYyB2b2lkIHNldEhvc3RuYW1lVmVyaWZpZXIoSG9zdG5hbWVWZXJpZmllciBob3N0bmFtZXZlcmlmaWVyKSB7CiAJCXRoaXMuaG9zdG5hbWV2ZXJpZmllciA9IGhvc3RuYW1ldmVyaWZpZXI7CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9NRVRBLUlORi9NQU5JRkVTVC5NRgppbmRleCA2ODg4MTgzLi5jOTdiOTI3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL01FVEEtSU5GL01BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTMsMTMgKzMsMTMgQEAKIEJ1bmRsZS1OYW1lOiAlcGx1Z2luX25hbWUKIEF1dG9tYXRpYy1Nb2R1bGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlcgogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlcgotQnVuZGxlLVZlcnNpb246IDQuMTEuOC5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiA1LjAuNC5xdWFsaWZpZXIKIEJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgogQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyX25hbWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyO3ZlcnNpb249IjQuMTEuOCIsCi0gb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci5nbHVlO3ZlcnNpb249IjQuMTEuOCI7CitFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlcjt2ZXJzaW9uPSI1LjAuNCIsCisgb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci5nbHVlO3ZlcnNpb249IjUuMC40IjsKICAgdXNlczo9ImphdmF4LnNlcnZsZXQsamF2YXguc2VydmxldC5odHRwIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyLnJlc29sdmVyO3ZlcnNpb249IjQuMTEuOCI7Cisgb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci5yZXNvbHZlcjt2ZXJzaW9uPSI1LjAuNCI7CiAgIHVzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5yZXNvbHZlciwKICAgIG9yZy5lY2xpcHNlLmpnaXQubGliLAogICAgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQsCkBAIC0xOCwxMiArMTgsMTIgQEAKIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKYXZhU0UtMS44CiBJbXBvcnQtUGFja2FnZTogamF2YXguc2VydmxldDt2ZXJzaW9uPSJbMi41LjAsMy4yLjApIiwKICBqYXZheC5zZXJ2bGV0Lmh0dHA7dmVyc2lvbj0iWzIuNS4wLDMuMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5lcnJvcnM7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZGZzO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmxpYjt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubmxzO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5yZXNvbHZlcjt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiCisgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmRmczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmxpYjt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lm5sczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQucmVzb2x2ZXI7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3BvbS54bWwKaW5kZXggM2EyMjU3ZC4uNmY3MDA4MSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvcG9tLnhtbApAQCAtNTIsNyArNTIsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+NC4xMS44LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjUuMC40LVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyPC9hcnRpZmFjdElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9Bc0lzRmlsZUZpbHRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9Bc0lzRmlsZUZpbHRlci5qYXZhCmluZGV4IDdmODI2ZDQuLjllOWYyNWUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvQXNJc0ZpbGVGaWx0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL0FzSXNGaWxlRmlsdGVyLmphdmEKQEAgLTY2LDcgKzY2LDcgQEAKIGNsYXNzIEFzSXNGaWxlRmlsdGVyIGltcGxlbWVudHMgRmlsdGVyIHsKIAlwcml2YXRlIGZpbmFsIEFzSXNGaWxlU2VydmljZSBhc0lzOwogCi0JQXNJc0ZpbGVGaWx0ZXIoZmluYWwgQXNJc0ZpbGVTZXJ2aWNlIGdldEFueUZpbGUpIHsKKwlBc0lzRmlsZUZpbHRlcihBc0lzRmlsZVNlcnZpY2UgZ2V0QW55RmlsZSkgewogCQl0aGlzLmFzSXMgPSBnZXRBbnlGaWxlOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9GaWxlU2VuZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL0ZpbGVTZW5kZXIuamF2YQppbmRleCAwZDkzNWZjLi4wNTUxMGEwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL0ZpbGVTZW5kZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL0ZpbGVTZW5kZXIuamF2YQpAQCAtODQsNyArODQsNyBAQCBmaW5hbCBjbGFzcyBGaWxlU2VuZGVyIHsKIAogCXByaXZhdGUgbG9uZyBlbmQ7CiAKLQlGaWxlU2VuZGVyKGZpbmFsIEZpbGUgcGF0aCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisJRmlsZVNlbmRlcihGaWxlIHBhdGgpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gewogCQl0aGlzLnBhdGggPSBwYXRoOwogCQl0aGlzLnNvdXJjZSA9IG5ldyBSYW5kb21BY2Nlc3NGaWxlKHBhdGgsICJyIik7CiAKQEAgLTIxNyw3ICsyMTcsNyBAQCBwcml2YXRlIGJvb2xlYW4gaW5pdFJhbmdlUmVxdWVzdChmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxLAogCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBFbnVtZXJhdGlvbjxTdHJpbmc+IGdldFJhbmdlKGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpIHsKKwlwcml2YXRlIHN0YXRpYyBFbnVtZXJhdGlvbjxTdHJpbmc+IGdldFJhbmdlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpIHsKIAkJcmV0dXJuIHJlcS5nZXRIZWFkZXJzKEhEUl9SQU5HRSk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9HaXRTZXJ2bGV0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL0dpdFNlcnZsZXQuamF2YQppbmRleCBlZTIzNjc3Li5kMGVhN2I2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL0dpdFNlcnZsZXQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL0dpdFNlcnZsZXQuamF2YQpAQCAtMTgzLDcgKzE4Myw3IEBAIHB1YmxpYyB2b2lkIGFkZFJlY2VpdmVQYWNrRmlsdGVyKEZpbHRlciBmaWx0ZXIpIHsKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdChmaW5hbCBTZXJ2bGV0Q29uZmlnIGNvbmZpZykgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24geworCXB1YmxpYyB2b2lkIGluaXQoU2VydmxldENvbmZpZyBjb25maWcpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKIAkJZ2l0RmlsdGVyLmluaXQobmV3IEZpbHRlckNvbmZpZygpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIFN0cmluZyBnZXRGaWx0ZXJOYW1lKCkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9JbmZvUGFja3NTZXJ2bGV0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL0luZm9QYWNrc1NlcnZsZXQuamF2YQppbmRleCA4MzBlMDYxLi41MmFhZjUxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL0luZm9QYWNrc1NlcnZsZXQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL0luZm9QYWNrc1NlcnZsZXQuamF2YQpAQCAtNjcsNyArNjcsNyBAQCBwdWJsaWMgdm9pZCBkb0dldChmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxLAogCQlzZW5kUGxhaW5UZXh0KHBhY2tMaXN0KHJlcSksIHJlcSwgcnNwKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgcGFja0xpc3QoZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgeworCXByaXZhdGUgc3RhdGljIFN0cmluZyBwYWNrTGlzdChIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB7CiAJCWZpbmFsIFN0cmluZ0J1aWxkZXIgb3V0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKIAkJZmluYWwgT2JqZWN0RGF0YWJhc2UgZGIgPSBnZXRSZXBvc2l0b3J5KHJlcSkuZ2V0T2JqZWN0RGF0YWJhc2UoKTsKIAkJaWYgKGRiIGluc3RhbmNlb2YgT2JqZWN0RGlyZWN0b3J5KSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL0luZm9SZWZzU2VydmxldC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9JbmZvUmVmc1NlcnZsZXQuamF2YQppbmRleCA0ZjcwY2Y3Li4wZjQ2MzNiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL0luZm9SZWZzU2VydmxldC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvSW5mb1JlZnNTZXJ2bGV0LmphdmEKQEAgLTQ0LDE4ICs0NCwxNSBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyOwogCiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIuU2VydmxldFV0aWxzLmdldFJlcG9zaXRvcnk7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZkRhdGFiYXNlLkFMTDsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKIAogaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldDsKIGltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwogaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlJlZkFkdmVydGlzZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLkh0dHBTdXBwb3J0OwpAQCAtNzksNyArNzYsNyBAQCBwdWJsaWMgdm9pZCBkb0dldChmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxLAogCQkJCUNvbnN0YW50cy5DSEFSU0VUKSkgewogCQkJZmluYWwgUmVmQWR2ZXJ0aXNlciBhZHYgPSBuZXcgUmVmQWR2ZXJ0aXNlcigpIHsKIAkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCB3cml0ZU9uZShmaW5hbCBDaGFyU2VxdWVuY2UgbGluZSkKKwkJCQlwcm90ZWN0ZWQgdm9pZCB3cml0ZU9uZShDaGFyU2VxdWVuY2UgbGluZSkKIAkJCQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQkJCS8vIFdob2V2ZXIgZGVjaWRlZCB0aGF0IGluZm8vcmVmcyBzaG91bGQgdXNlIGEgZGlmZmVyZW50CiAJCQkJCS8vIGRlbGltaXRlciB0aGFuIHRoZSBuYXRpdmUgZ2l0Oi8vIHByb3RvY29sIHNob3VsZG4ndApAQCAtOTQsMTAgKzkxLDcgQEAgcHJvdGVjdGVkIHZvaWQgZW5kKCkgewogCQkJfTsKIAkJCWFkdi5pbml0KGRiKTsKIAkJCWFkdi5zZXREZXJlZlRhZ3ModHJ1ZSk7Ci0KLQkJCU1hcDxTdHJpbmcsIFJlZj4gcmVmcyA9IGRiLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcyhBTEwpOwotCQkJcmVmcy5yZW1vdmUoQ29uc3RhbnRzLkhFQUQpOwotCQkJYWR2LnNlbmQocmVmcyk7CisJCQlhZHYuc2VuZChkYi5nZXRSZWZEYXRhYmFzZSgpLmdldFJlZnNCeVByZWZpeChDb25zdGFudHMuUl9SRUZTKSk7CiAJCX0KIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL0lzTG9jYWxGaWx0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvSXNMb2NhbEZpbHRlci5qYXZhCmluZGV4IGIwYjgzMWYuLmIzNzk5ODMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvSXNMb2NhbEZpbHRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvSXNMb2NhbEZpbHRlci5qYXZhCkBAIC04OCw3ICs4OCw3IEBAIHB1YmxpYyB2b2lkIGRvRmlsdGVyKFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSwKIAkJCSgoSHR0cFNlcnZsZXRSZXNwb25zZSkgcmVzcG9uc2UpLnNlbmRFcnJvcihTQ19GT1JCSURERU4pOwogCX0KIAotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNMb2NhbChmaW5hbCBSZXBvc2l0b3J5IGRiKSB7CisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0xvY2FsKFJlcG9zaXRvcnkgZGIpIHsKIAkJcmV0dXJuIGRiLmdldE9iamVjdERhdGFiYXNlKCkgaW5zdGFuY2VvZiBPYmplY3REaXJlY3Rvcnk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9PYmplY3RGaWxlU2VydmxldC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9PYmplY3RGaWxlU2VydmxldC5qYXZhCmluZGV4IDUwZGM2OGYuLjYyZjA3NWMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvT2JqZWN0RmlsZVNlcnZsZXQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL09iamVjdEZpbGVTZXJ2bGV0LmphdmEKQEAgLTc1LDcgKzc1LDcgQEAgc3RhdGljIGNsYXNzIExvb3NlIGV4dGVuZHMgT2JqZWN0RmlsZVNlcnZsZXQgewogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCVN0cmluZyBldGFnKGZpbmFsIEZpbGVTZW5kZXIgc2VuZGVyKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlTdHJpbmcgZXRhZyhGaWxlU2VuZGVyIHNlbmRlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCXJldHVybiBMb25nLnRvSGV4U3RyaW5nKHNlbmRlci5nZXRMYXN0TW9kaWZpZWQoKSk7CiAJCX0KIAl9CkBAIC04OCw3ICs4OCw3IEBAIHByaXZhdGUgc3RhdGljIGFic3RyYWN0IGNsYXNzIFBhY2tEYXRhIGV4dGVuZHMgT2JqZWN0RmlsZVNlcnZsZXQgewogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCVN0cmluZyBldGFnKGZpbmFsIEZpbGVTZW5kZXIgc2VuZGVyKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlTdHJpbmcgZXRhZyhGaWxlU2VuZGVyIHNlbmRlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCXJldHVybiBzZW5kZXIuZ2V0VGFpbENoZWNrc3VtKCk7CiAJCX0KIAl9CkBAIC0xMTEsNyArMTExLDcgQEAgc3RhdGljIGNsYXNzIFBhY2tJZHggZXh0ZW5kcyBQYWNrRGF0YSB7CiAKIAlwcml2YXRlIGZpbmFsIFN0cmluZyBjb250ZW50VHlwZTsKIAotCU9iamVjdEZpbGVTZXJ2bGV0KGZpbmFsIFN0cmluZyBjb250ZW50VHlwZSkgeworCU9iamVjdEZpbGVTZXJ2bGV0KFN0cmluZyBjb250ZW50VHlwZSkgewogCQl0aGlzLmNvbnRlbnRUeXBlID0gY29udGVudFR5cGU7CiAJfQogCkBAIC0xNzAsNyArMTcwLDcgQEAgcHJpdmF0ZSB2b2lkIHNlcnZlKGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsCiAJCX0KIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBGaWxlIG9iamVjdHMoZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgeworCXByaXZhdGUgc3RhdGljIEZpbGUgb2JqZWN0cyhIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB7CiAJCWZpbmFsIFJlcG9zaXRvcnkgZGIgPSBnZXRSZXBvc2l0b3J5KHJlcSk7CiAJCXJldHVybiAoKE9iamVjdERpcmVjdG9yeSkgZGIuZ2V0T2JqZWN0RGF0YWJhc2UoKSkuZ2V0RGlyZWN0b3J5KCk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9SZXBvc2l0b3J5RmlsdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL1JlcG9zaXRvcnlGaWx0ZXIuamF2YQppbmRleCBjODlhNWQ3Li4wMjBiZTRmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL1JlcG9zaXRvcnlGaWx0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL1JlcG9zaXRvcnlGaWx0ZXIuamF2YQpAQCAtMTAwLDEzICsxMDAsMTMgQEAgcHVibGljIGNsYXNzIFJlcG9zaXRvcnlGaWx0ZXIgaW1wbGVtZW50cyBGaWx0ZXIgewogCSAqICAgICAgICAgICAge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnl9IGluc3RhbmNlIGZvciB0aGUKIAkgKiAgICAgICAgICAgIGN1cnJlbnQgd2ViIHJlcXVlc3QuCiAJICovCi0JcHVibGljIFJlcG9zaXRvcnlGaWx0ZXIoZmluYWwgUmVwb3NpdG9yeVJlc29sdmVyPEh0dHBTZXJ2bGV0UmVxdWVzdD4gcmVzb2x2ZXIpIHsKKwlwdWJsaWMgUmVwb3NpdG9yeUZpbHRlcihSZXBvc2l0b3J5UmVzb2x2ZXI8SHR0cFNlcnZsZXRSZXF1ZXN0PiByZXNvbHZlcikgewogCQl0aGlzLnJlc29sdmVyID0gcmVzb2x2ZXI7CiAJfQogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0KGZpbmFsIEZpbHRlckNvbmZpZyBjb25maWcpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKKwlwdWJsaWMgdm9pZCBpbml0KEZpbHRlckNvbmZpZyBjb25maWcpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKIAkJY29udGV4dCA9IGNvbmZpZy5nZXRTZXJ2bGV0Q29udGV4dCgpOwogCX0KIApAQCAtMTQwLDkgKzE0MCw5IEBAIHB1YmxpYyB2b2lkIGRvRmlsdGVyKGZpbmFsIFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCiAJCQlyZXR1cm47CiAJCX0KIAotCQlmaW5hbCBSZXBvc2l0b3J5IGRiOwotCQl0cnkgewotCQkJZGIgPSByZXNvbHZlci5vcGVuKHJlcSwgbmFtZSk7CisJCXRyeSAoUmVwb3NpdG9yeSBkYiA9IHJlc29sdmVyLm9wZW4ocmVxLCBuYW1lKSkgeworCQkJcmVxdWVzdC5zZXRBdHRyaWJ1dGUoQVRUUklCVVRFX1JFUE9TSVRPUlksIGRiKTsKKwkJCWNoYWluLmRvRmlsdGVyKHJlcXVlc3QsIHJlc3BvbnNlKTsKIAkJfSBjYXRjaCAoUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKIAkJCXNlbmRFcnJvcihyZXEsIHJlcywgU0NfTk9UX0ZPVU5EKTsKIAkJCXJldHVybjsKQEAgLTE1NSwxMyArMTU1LDggQEAgcHVibGljIHZvaWQgZG9GaWx0ZXIoZmluYWwgU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKIAkJfSBjYXRjaCAoU2VydmljZU1heU5vdENvbnRpbnVlRXhjZXB0aW9uIGUpIHsKIAkJCXNlbmRFcnJvcihyZXEsIHJlcywgZS5nZXRTdGF0dXNDb2RlKCksIGUuZ2V0TWVzc2FnZSgpKTsKIAkJCXJldHVybjsKLQkJfQotCQl0cnkgewotCQkJcmVxdWVzdC5zZXRBdHRyaWJ1dGUoQVRUUklCVVRFX1JFUE9TSVRPUlksIGRiKTsKLQkJCWNoYWluLmRvRmlsdGVyKHJlcXVlc3QsIHJlc3BvbnNlKTsKIAkJfSBmaW5hbGx5IHsKIAkJCXJlcXVlc3QucmVtb3ZlQXR0cmlidXRlKEFUVFJJQlVURV9SRVBPU0lUT1JZKTsKLQkJCWRiLmNsb3NlKCk7CiAJCX0KIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL1NlcnZsZXRVdGlscy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9TZXJ2bGV0VXRpbHMuamF2YQppbmRleCBmMWZmNTQ3Li45NjAxYzhjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL1NlcnZsZXRVdGlscy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvU2VydmxldFV0aWxzLmphdmEKQEAgLTkwLDcgKzkwLDcgQEAgcHVibGljIGZpbmFsIGNsYXNzIFNlcnZsZXRVdGlscyB7CiAJICogICAgICAgICAgICAgdGhlIGZpbHRlciBydW5zIGJlZm9yZSB0aGUgc2VydmxldC4KIAkgKiBAc2VlICNBVFRSSUJVVEVfUkVQT1NJVE9SWQogCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVwb3NpdG9yeSBnZXRSZXBvc2l0b3J5KGZpbmFsIFNlcnZsZXRSZXF1ZXN0IHJlcSkgeworCXB1YmxpYyBzdGF0aWMgUmVwb3NpdG9yeSBnZXRSZXBvc2l0b3J5KFNlcnZsZXRSZXF1ZXN0IHJlcSkgewogCQlSZXBvc2l0b3J5IGRiID0gKFJlcG9zaXRvcnkpIHJlcS5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX1JFUE9TSVRPUlkpOwogCQlpZiAoZGIgPT0gbnVsbCkKIAkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oSHR0cFNlcnZlclRleHQuZ2V0KCkuZXhwZWN0ZWRSZXBvc2l0b3J5QXR0cmlidXRlKTsKQEAgLTExMCw3ICsxMTAsNyBAQCBwdWJsaWMgc3RhdGljIFJlcG9zaXRvcnkgZ2V0UmVwb3NpdG9yeShmaW5hbCBTZXJ2bGV0UmVxdWVzdCByZXEpIHsKIAkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgaWYgYW4gaW5wdXQgb3Igb3V0cHV0IGV4Y2VwdGlvbiBvY2N1cnJlZC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpCisJcHVibGljIHN0YXRpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbShIdHRwU2VydmxldFJlcXVlc3QgcmVxKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJSW5wdXRTdHJlYW0gaW4gPSByZXEuZ2V0SW5wdXRTdHJlYW0oKTsKIAkJZmluYWwgU3RyaW5nIGVuYyA9IHJlcS5nZXRIZWFkZXIoSERSX0NPTlRFTlRfRU5DT0RJTkcpOwpAQCAtMjIwLDEyICsyMjAsOSBAQCBwdWJsaWMgc3RhdGljIHZvaWQgc2VuZFBsYWluVGV4dChmaW5hbCBTdHJpbmcgY29udGVudCwKIAlwdWJsaWMgc3RhdGljIHZvaWQgc2VuZChieXRlW10gY29udGVudCwgZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwKIAkJCWZpbmFsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcnNwKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQljb250ZW50ID0gc2VuZEluaXQoY29udGVudCwgcmVxLCByc3ApOwotCQlmaW5hbCBPdXRwdXRTdHJlYW0gb3V0ID0gcnNwLmdldE91dHB1dFN0cmVhbSgpOwotCQl0cnkgeworCQl0cnkgKE91dHB1dFN0cmVhbSBvdXQgPSByc3AuZ2V0T3V0cHV0U3RyZWFtKCkpIHsKIAkJCW91dC53cml0ZShjb250ZW50KTsKIAkJCW91dC5mbHVzaCgpOwotCQl9IGZpbmFsbHkgewotCQkJb3V0LmNsb3NlKCk7CiAJCX0KIAl9CiAKQEAgLTI0MSw3ICsyMzgsNyBAQCBwdWJsaWMgc3RhdGljIHZvaWQgc2VuZChieXRlW10gY29udGVudCwgZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwKIAkJcmV0dXJuIGNvbnRlbnQ7CiAJfQogCi0Jc3RhdGljIGJvb2xlYW4gYWNjZXB0c0d6aXBFbmNvZGluZyhmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB7CisJc3RhdGljIGJvb2xlYW4gYWNjZXB0c0d6aXBFbmNvZGluZyhIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB7CiAJCXJldHVybiBhY2NlcHRzR3ppcEVuY29kaW5nKHJlcS5nZXRIZWFkZXIoSERSX0FDQ0VQVF9FTkNPRElORykpOwogCX0KIApAQCAtMjYxLDcgKzI1OCw3IEBAIHN0YXRpYyBib29sZWFuIGFjY2VwdHNHemlwRW5jb2RpbmcoU3RyaW5nIGFjY2VwdHMpIHsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIAotCXByaXZhdGUgc3RhdGljIGJ5dGVbXSBjb21wcmVzcyhmaW5hbCBieXRlW10gcmF3KSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByaXZhdGUgc3RhdGljIGJ5dGVbXSBjb21wcmVzcyhieXRlW10gcmF3KSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBpbnQgbWF4TGVuID0gcmF3Lmxlbmd0aCArIDMyOwogCQlmaW5hbCBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbShtYXhMZW4pOwogCQlmaW5hbCBHWklQT3V0cHV0U3RyZWFtIGd6ID0gbmV3IEdaSVBPdXRwdXRTdHJlYW0ob3V0KTsKQEAgLTI3MSw3ICsyNjgsNyBAQCBzdGF0aWMgYm9vbGVhbiBhY2NlcHRzR3ppcEVuY29kaW5nKFN0cmluZyBhY2NlcHRzKSB7CiAJCXJldHVybiBvdXQudG9CeXRlQXJyYXkoKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZXRhZyhmaW5hbCBieXRlW10gY29udGVudCkgeworCXByaXZhdGUgc3RhdGljIFN0cmluZyBldGFnKGJ5dGVbXSBjb250ZW50KSB7CiAJCWZpbmFsIE1lc3NhZ2VEaWdlc3QgbWQgPSBDb25zdGFudHMubmV3TWVzc2FnZURpZ2VzdCgpOwogCQltZC51cGRhdGUoY29udGVudCk7CiAJCXJldHVybiBPYmplY3RJZC5mcm9tUmF3KG1kLmRpZ2VzdCgpKS5nZXROYW1lKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL1NtYXJ0T3V0cHV0U3RyZWFtLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL1NtYXJ0T3V0cHV0U3RyZWFtLmphdmEKaW5kZXggNGViOTRhMy4uYWQ1ZThkNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9TbWFydE91dHB1dFN0cmVhbS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvU21hcnRPdXRwdXRTdHJlYW0uamF2YQpAQCAtMTEwLDExICsxMTAsOCBAQCBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQlpZiAoMjU2IDwgb3V0Lmxlbmd0aCgpICYmIGFjY2VwdHNHemlwRW5jb2RpbmcocmVxKSkgewogCQkJCVRlbXBvcmFyeUJ1ZmZlciBnemJ1ZiA9IG5ldyBUZW1wb3JhcnlCdWZmZXIuSGVhcChMSU1JVCk7CiAJCQkJdHJ5IHsKLQkJCQkJR1pJUE91dHB1dFN0cmVhbSBnemlwID0gbmV3IEdaSVBPdXRwdXRTdHJlYW0oZ3pidWYpOwotCQkJCQl0cnkgeworCQkJCQl0cnkgKEdaSVBPdXRwdXRTdHJlYW0gZ3ppcCA9IG5ldyBHWklQT3V0cHV0U3RyZWFtKGd6YnVmKSkgewogCQkJCQkJb3V0LndyaXRlVG8oZ3ppcCwgbnVsbCk7Ci0JCQkJCX0gZmluYWxseSB7Ci0JCQkJCQlnemlwLmNsb3NlKCk7CiAJCQkJCX0KIAkJCQkJaWYgKGd6YnVmLmxlbmd0aCgpIDwgb3V0Lmxlbmd0aCgpKSB7CiAJCQkJCQlvdXQgPSBnemJ1ZjsKQEAgLTEzMSwxMiArMTI4LDkgQEAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJLy8gaGFyZGNvZGVkIExJTUlUIGNvbnN0YW50IGFib3ZlIGFzc3VyZXMgdXMgd2Ugd291bGRuJ3Qgc3RvcmUKIAkJCS8vIG1vcmUgdGhhbiAyIEdpQiBvZiBjb250ZW50IGluIG1lbW9yeS4KIAkJCXJzcC5zZXRDb250ZW50TGVuZ3RoKChpbnQpIG91dC5sZW5ndGgoKSk7Ci0JCQlmaW5hbCBPdXRwdXRTdHJlYW0gb3MgPSByc3AuZ2V0T3V0cHV0U3RyZWFtKCk7Ci0JCQl0cnkgeworCQkJdHJ5IChPdXRwdXRTdHJlYW0gb3MgPSByc3AuZ2V0T3V0cHV0U3RyZWFtKCkpIHsKIAkJCQlvdXQud3JpdGVUbyhvcywgbnVsbCk7CiAJCQkJb3MuZmx1c2goKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJb3MuY2xvc2UoKTsKIAkJCX0KIAkJfQogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvU21hcnRTZXJ2aWNlSW5mb1JlZnMuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvU21hcnRTZXJ2aWNlSW5mb1JlZnMuamF2YQppbmRleCA2NDE3ODc3Li4xOTVkZmY5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL1NtYXJ0U2VydmljZUluZm9SZWZzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9TbWFydFNlcnZpY2VJbmZvUmVmcy5qYXZhCkBAIC03NSw3ICs3NSw3IEBAIGFic3RyYWN0IGNsYXNzIFNtYXJ0U2VydmljZUluZm9SZWZzIGltcGxlbWVudHMgRmlsdGVyIHsKIAogCXByaXZhdGUgZmluYWwgRmlsdGVyW10gZmlsdGVyczsKIAotCVNtYXJ0U2VydmljZUluZm9SZWZzKGZpbmFsIFN0cmluZyBzZXJ2aWNlLCBmaW5hbCBMaXN0PEZpbHRlcj4gZmlsdGVycykgeworCVNtYXJ0U2VydmljZUluZm9SZWZzKFN0cmluZyBzZXJ2aWNlLCBMaXN0PEZpbHRlcj4gZmlsdGVycykgewogCQl0aGlzLnN2YyA9IHNlcnZpY2U7CiAJCXRoaXMuZmlsdGVycyA9IGZpbHRlcnMudG9BcnJheShuZXcgRmlsdGVyW2ZpbHRlcnMuc2l6ZSgpXSk7CiAJfQpAQCAtMTMzLDkgKzEzMyw3IEBAIHByaXZhdGUgdm9pZCBzZXJ2aWNlKFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKIAkJCXJlcy5zZXRDb250ZW50VHlwZShpbmZvUmVmc1Jlc3VsdFR5cGUoc3ZjKSk7CiAKIAkJCWZpbmFsIFBhY2tldExpbmVPdXQgb3V0ID0gbmV3IFBhY2tldExpbmVPdXQoYnVmKTsKLQkJCW91dC53cml0ZVN0cmluZygiIyBzZXJ2aWNlPSIgKyBzdmMgKyAiXG4iKTsKLQkJCW91dC5lbmQoKTsKLQkJCWFkdmVydGlzZShyZXEsIG5ldyBQYWNrZXRMaW5lT3V0UmVmQWR2ZXJ0aXNlcihvdXQpKTsKKwkJCXJlc3BvbmQocmVxLCBvdXQsIHN2Yyk7CiAJCQlidWYuY2xvc2UoKTsKIAkJfSBjYXRjaCAoU2VydmljZU5vdEF1dGhvcml6ZWRFeGNlcHRpb24gZSkgewogCQkJcmVzLnNlbmRFcnJvcihTQ19VTkFVVEhPUklaRUQsIGUuZ2V0TWVzc2FnZSgpKTsKQEAgLTE3OCw2ICsxNzYsMzcgQEAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgYWR2ZXJ0aXNlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsCiAJCQlQYWNrZXRMaW5lT3V0UmVmQWR2ZXJ0aXNlciBwY2spIHRocm93cyBJT0V4Y2VwdGlvbiwKIAkJCVNlcnZpY2VOb3RFbmFibGVkRXhjZXB0aW9uLCBTZXJ2aWNlTm90QXV0aG9yaXplZEV4Y2VwdGlvbjsKIAorCS8qKgorCSAqIFdyaXRlcyB0aGUgYXBwcm9wcmlhdGUgcmVzcG9uc2UgdG8gYW4gaW5mby9yZWZzIHJlcXVlc3QgcmVjZWl2ZWQgYnkKKwkgKiBhIHNtYXJ0IHNlcnZpY2UuIEluIHByb3RvY29sIHYwLCB0aGlzIHN0YXJ0cyB3aXRoICIjCisJICogc2VydmljZT1zZXJ2aWNlTmFtZSIgZm9sbG93ZWQgYnkgYSBmbHVzaCBwYWNrZXQsIGJ1dCB0aGlzIGlzIG5vdAorCSAqIG5lY2Vzc2FyaWx5IHRoZSBjYXNlIGluIG90aGVyIHByb3RvY29sIHZlcnNpb25zLgorCSAqIDxwPgorCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHdyaXRlcyAiIyBzZXJ2aWNlPXNlcnZpY2VOYW1lIiBhbmQgYQorCSAqIGZsdXNoIHBhY2tldCwgdGhlbiBjYWxscyB7QGxpbmsgI2FkdmVydGlzZX0uIFN1YmNsYXNzZXMgc2hvdWxkCisJICogb3ZlcnJpZGUgdGhpcyBtZXRob2QgaWYgdGhleSBzdXBwb3J0IHByb3RvY29sIHZlcnNpb25zIG90aGVyIHRoYW4KKwkgKiBwcm90b2NvbCB2MC4KKwkgKgorCSAqIEBwYXJhbSByZXEKKwkgKiAgICAgICAgICAgIHJlcXVlc3QKKwkgKiBAcGFyYW0gcGNrT3V0CisJICogICAgICAgICAgICBkZXN0aW5hdGlvbiBvZiByZXNwb25zZQorCSAqIEBwYXJhbSBzZXJ2aWNlTmFtZQorCSAqICAgICAgICAgICAgc2VydmljZSBuYW1lIHRvIGJlIHdyaXR0ZW4gb3V0IGluIHByb3RvY29sIHYwOyBtYXkgb3IgbWF5CisJICogICAgICAgICAgICBub3QgYmUgdXNlZCBpbiBvdGhlciB2ZXJzaW9ucworCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKwkgKiBAdGhyb3dzIFNlcnZpY2VOb3RFbmFibGVkRXhjZXB0aW9uCisJICogQHRocm93cyBTZXJ2aWNlTm90QXV0aG9yaXplZEV4Y2VwdGlvbgorCSAqLworCXByb3RlY3RlZCB2b2lkIHJlc3BvbmQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwKKwkJCVBhY2tldExpbmVPdXQgcGNrT3V0LCBTdHJpbmcgc2VydmljZU5hbWUpCisJCQl0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZpY2VOb3RFbmFibGVkRXhjZXB0aW9uLAorCQkJU2VydmljZU5vdEF1dGhvcml6ZWRFeGNlcHRpb24geworCQlwY2tPdXQud3JpdGVTdHJpbmcoIiMgc2VydmljZT0iICsgc3ZjICsgJ1xuJyk7IC8vJE5PTi1OTFMtMSQKKwkJcGNrT3V0LmVuZCgpOworCQlhZHZlcnRpc2UocmVxLCBuZXcgUGFja2V0TGluZU91dFJlZkFkdmVydGlzZXIocGNrT3V0KSk7CisJfQorCiAJcHJpdmF0ZSBjbGFzcyBDaGFpbiBpbXBsZW1lbnRzIEZpbHRlckNoYWluIHsKIAkJcHJpdmF0ZSBpbnQgZmlsdGVySWR4OwogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL1RleHRGaWxlU2VydmxldC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9UZXh0RmlsZVNlcnZsZXQuamF2YQppbmRleCAwMDg1MWNmLi5iMjQ2NmQwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL1RleHRGaWxlU2VydmxldC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvVGV4dEZpbGVTZXJ2bGV0LmphdmEKQEAgLTY0LDcgKzY0LDcgQEAgY2xhc3MgVGV4dEZpbGVTZXJ2bGV0IGV4dGVuZHMgSHR0cFNlcnZsZXQgewogCiAJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZmlsZU5hbWU7CiAKLQlUZXh0RmlsZVNlcnZsZXQoZmluYWwgU3RyaW5nIG5hbWUpIHsKKwlUZXh0RmlsZVNlcnZsZXQoU3RyaW5nIG5hbWUpIHsKIAkJdGhpcy5maWxlTmFtZSA9IG5hbWU7CiAJfQogCkBAIC04MCw3ICs4MCw3IEBAIHB1YmxpYyB2b2lkIGRvR2V0KGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsCiAJCX0KIAl9CiAKLQlwcml2YXRlIGJ5dGVbXSByZWFkKGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJpdmF0ZSBieXRlW10gcmVhZChIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBGaWxlIGdpdGRpciA9IGdldFJlcG9zaXRvcnkocmVxKS5nZXREaXJlY3RvcnkoKTsKIAkJaWYgKGdpdGRpciA9PSBudWxsKQogCQkJdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbihmaWxlTmFtZSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL1VwbG9hZFBhY2tTZXJ2bGV0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL1VwbG9hZFBhY2tTZXJ2bGV0LmphdmEKaW5kZXggM2U5YzFmZS4uY2E2Yjc0OSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9VcGxvYWRQYWNrU2VydmxldC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvVXBsb2FkUGFja1NlcnZsZXQuamF2YQpAQCAtNzYsNiArNzYsNyBAQAogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5JbnRlcm5hbEh0dHBTZXJ2ZXJHbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlBhY2tldExpbmVPdXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuUmVmQWR2ZXJ0aXNlci5QYWNrZXRMaW5lT3V0UmVmQWR2ZXJ0aXNlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5TZXJ2aWNlTWF5Tm90Q29udGludWVFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuVXBsb2FkUGFjazsKQEAgLTExNyw2ICsxMTgsMjUgQEAgcHJvdGVjdGVkIHZvaWQgYWR2ZXJ0aXNlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsCiAJCQkJdXAuc2V0QmlEaXJlY3Rpb25hbFBpcGUoZmFsc2UpOwogCQkJCXVwLnNlbmRBZHZlcnRpc2VkUmVmcyhwY2spOwogCQkJfSBmaW5hbGx5IHsKKwkJCQkvLyBUT0RPKGpvbmF0aGFudGFubXkpOiBNb3ZlIHJlc3BvbnNpYmlsaXR5IGZvciBjbG9zaW5nIHRoZQorCQkJCS8vIFJldldhbGsgdG8gVXBsb2FkUGFjaywgZWl0aGVyIGJ5IG1ha2luZyBpdCBBdXRvQ2xvc2VhYmxlCisJCQkJLy8gb3IgYnkgbWFraW5nIHNlbmRBZHZlcnRpc2VkUmVmcyBjbGVhbiB1cCBhZnRlciBpdHNlbGYuCisJCQkJdXAuZ2V0UmV2V2FsaygpLmNsb3NlKCk7CisJCQl9CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIHZvaWQgcmVzcG9uZChIdHRwU2VydmxldFJlcXVlc3QgcmVxLAorCQkJCVBhY2tldExpbmVPdXQgcGNrT3V0LCBTdHJpbmcgc2VydmljZU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiwKKwkJCQlTZXJ2aWNlTm90RW5hYmxlZEV4Y2VwdGlvbiwgU2VydmljZU5vdEF1dGhvcml6ZWRFeGNlcHRpb24geworCQkJVXBsb2FkUGFjayB1cCA9IChVcGxvYWRQYWNrKSByZXEuZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9IQU5ETEVSKTsKKwkJCXRyeSB7CisJCQkJdXAuc2V0QmlEaXJlY3Rpb25hbFBpcGUoZmFsc2UpOworCQkJCXVwLnNlbmRBZHZlcnRpc2VkUmVmcyhuZXcgUGFja2V0TGluZU91dFJlZkFkdmVydGlzZXIocGNrT3V0KSwgc2VydmljZU5hbWUpOworCQkJfSBmaW5hbGx5IHsKKwkJCQkvLyBUT0RPKGpvbmF0aGFudGFubXkpOiBNb3ZlIHJlc3BvbnNpYmlsaXR5IGZvciBjbG9zaW5nIHRoZQorCQkJCS8vIFJldldhbGsgdG8gVXBsb2FkUGFjaywgZWl0aGVyIGJ5IG1ha2luZyBpdCBBdXRvQ2xvc2VhYmxlCisJCQkJLy8gb3IgYnkgbWFraW5nIHNlbmRBZHZlcnRpc2VkUmVmcyBjbGVhbiB1cCBhZnRlciBpdHNlbGYuCiAJCQkJdXAuZ2V0UmV2V2FsaygpLmNsb3NlKCk7CiAJCQl9CiAJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvZ2x1ZS9FcnJvclNlcnZsZXQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvZ2x1ZS9FcnJvclNlcnZsZXQuamF2YQppbmRleCA1N2ZkZGRhLi42ZjI3YjI4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL2dsdWUvRXJyb3JTZXJ2bGV0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9nbHVlL0Vycm9yU2VydmxldC5qYXZhCkBAIC02NCw3ICs2NCw3IEBAIHB1YmxpYyBjbGFzcyBFcnJvclNlcnZsZXQgZXh0ZW5kcyBIdHRwU2VydmxldCB7CiAJICogQHBhcmFtIHN0YXR1cwogCSAqICAgICAgICAgICAgdGhlIEhUVFAgc3RhdHVzIGNvZGUgdG8gYWx3YXlzIHNlbmQuCiAJICovCi0JcHVibGljIEVycm9yU2VydmxldChmaW5hbCBpbnQgc3RhdHVzKSB7CisJcHVibGljIEVycm9yU2VydmxldChpbnQgc3RhdHVzKSB7CiAJCXRoaXMuc3RhdHVzID0gc3RhdHVzOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9nbHVlL1JlZ2V4R3JvdXBGaWx0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvZ2x1ZS9SZWdleEdyb3VwRmlsdGVyLmphdmEKaW5kZXggYTNkYzZjMy4uZjI2ZWJjMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9nbHVlL1JlZ2V4R3JvdXBGaWx0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL2dsdWUvUmVnZXhHcm91cEZpbHRlci5qYXZhCkBAIC03NSw3ICs3NSw3IEBAIHB1YmxpYyBjbGFzcyBSZWdleEdyb3VwRmlsdGVyIGltcGxlbWVudHMgRmlsdGVyIHsKIAkgKiBAcGFyYW0gZ3JvdXBJZHgKIAkgKiAgICAgICAgICAgIGNhcHR1cmUgZ3JvdXAgbnVtYmVyLCAxIHRocm91Z2ggdGhlIG51bWJlciBvZiBncm91cHMuCiAJICovCi0JcHVibGljIFJlZ2V4R3JvdXBGaWx0ZXIoZmluYWwgaW50IGdyb3VwSWR4KSB7CisJcHVibGljIFJlZ2V4R3JvdXBGaWx0ZXIoaW50IGdyb3VwSWR4KSB7CiAJCWlmIChncm91cElkeCA8IDEpCiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAogCQkJCQlIdHRwU2VydmVyVGV4dC5nZXQoKS5pbnZhbGlkSW5kZXgsIHZhbHVlT2YoZ3JvdXBJZHgpKSk7CkBAIC0xMDgsNyArMTA4LDcgQEAgcHVibGljIHZvaWQgZG9GaWx0ZXIoZmluYWwgU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKIAkJCQkJdmFsdWVPZihncm91cElkeCArIDEpKSk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgV3JhcHBlZFJlcXVlc3RbXSBncm91cHNGb3IoZmluYWwgU2VydmxldFJlcXVlc3QgcikgeworCXByaXZhdGUgc3RhdGljIFdyYXBwZWRSZXF1ZXN0W10gZ3JvdXBzRm9yKFNlcnZsZXRSZXF1ZXN0IHIpIHsKIAkJcmV0dXJuIChXcmFwcGVkUmVxdWVzdFtdKSByLmdldEF0dHJpYnV0ZShNZXRhRmlsdGVyLlJFR0VYX0dST1VQUyk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9nbHVlL1JlZ2V4UGlwZWxpbmUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvZ2x1ZS9SZWdleFBpcGVsaW5lLmphdmEKaW5kZXggYmYyZDZkYi4uMDEwODEwNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9nbHVlL1JlZ2V4UGlwZWxpbmUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL2dsdWUvUmVnZXhQaXBlbGluZS5qYXZhCkBAIC04NywxMSArODcsMTEgQEAgY2xhc3MgUmVnZXhQaXBlbGluZSBleHRlbmRzIFVybFBpcGVsaW5lIHsKIAlzdGF0aWMgY2xhc3MgQmluZGVyIGV4dGVuZHMgU2VydmxldEJpbmRlckltcGwgewogCQlwcml2YXRlIGZpbmFsIFBhdHRlcm4gcGF0dGVybjsKIAotCQlCaW5kZXIoZmluYWwgU3RyaW5nIHApIHsKKwkJQmluZGVyKFN0cmluZyBwKSB7CiAJCQlwYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKHApOwogCQl9CiAKLQkJQmluZGVyKGZpbmFsIFBhdHRlcm4gcCkgeworCQlCaW5kZXIoUGF0dGVybiBwKSB7CiAJCQlwYXR0ZXJuID0gcDsKIAkJfQogCkBAIC0xMTAsNyArMTEwLDcgQEAgVXJsUGlwZWxpbmUgY3JlYXRlKCkgewogCX0KIAogCUBPdmVycmlkZQotCWJvb2xlYW4gbWF0Y2goZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgeworCWJvb2xlYW4gbWF0Y2goSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgewogCQlmaW5hbCBTdHJpbmcgcGF0aEluZm8gPSByZXEuZ2V0UGF0aEluZm8oKTsKIAkJcmV0dXJuIHBhdGhJbmZvICE9IG51bGwgJiYgcGF0dGVybi5tYXRjaGVyKHBhdGhJbmZvKS5tYXRjaGVzKCk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9nbHVlL1N1ZmZpeFBpcGVsaW5lLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL2dsdWUvU3VmZml4UGlwZWxpbmUuamF2YQppbmRleCA2NzQyYzlmLi40ZmQ5OWM2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL2dsdWUvU3VmZml4UGlwZWxpbmUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL2dsdWUvU3VmZml4UGlwZWxpbmUuamF2YQpAQCAtNjcsNyArNjcsNyBAQCBjbGFzcyBTdWZmaXhQaXBlbGluZSBleHRlbmRzIFVybFBpcGVsaW5lIHsKIAlzdGF0aWMgY2xhc3MgQmluZGVyIGV4dGVuZHMgU2VydmxldEJpbmRlckltcGwgewogCQlwcml2YXRlIGZpbmFsIFN0cmluZyBzdWZmaXg7CiAKLQkJQmluZGVyKGZpbmFsIFN0cmluZyBzdWZmaXgpIHsKKwkJQmluZGVyKFN0cmluZyBzdWZmaXgpIHsKIAkJCXRoaXMuc3VmZml4ID0gc3VmZml4OwogCQl9CiAKQEAgLTg5LDcgKzg5LDcgQEAgVXJsUGlwZWxpbmUgY3JlYXRlKCkgewogCX0KIAogCUBPdmVycmlkZQotCWJvb2xlYW4gbWF0Y2goZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgeworCWJvb2xlYW4gbWF0Y2goSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgewogCQlmaW5hbCBTdHJpbmcgcGF0aEluZm8gPSByZXEuZ2V0UGF0aEluZm8oKTsKIAkJcmV0dXJuIHBhdGhJbmZvICE9IG51bGwgJiYgcGF0aEluZm8uZW5kc1dpdGgoc3VmZml4KTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL2dsdWUvVXJsUGlwZWxpbmUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvZ2x1ZS9VcmxQaXBlbGluZS5qYXZhCmluZGV4IDU2ZTRlMjIuLmMwMjM5OWEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvZ2x1ZS9VcmxQaXBlbGluZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvZ2x1ZS9VcmxQaXBlbGluZS5qYXZhCkBAIC03OSw3ICs3OSw3IEBAIGFic3RyYWN0IGNsYXNzIFVybFBpcGVsaW5lIHsKIAkvKiogSW5zdGFuY2UgdGhhdCBtdXN0IGdlbmVyYXRlIHRoZSByZXNwb25zZTsgbmV2ZXIgbnVsbC4gKi8KIAlwcml2YXRlIGZpbmFsIEh0dHBTZXJ2bGV0IHNlcnZsZXQ7CiAKLQlVcmxQaXBlbGluZShmaW5hbCBGaWx0ZXJbXSBmaWx0ZXJzLCBmaW5hbCBIdHRwU2VydmxldCBzZXJ2bGV0KSB7CisJVXJsUGlwZWxpbmUoRmlsdGVyW10gZmlsdGVycywgSHR0cFNlcnZsZXQgc2VydmxldCkgewogCQl0aGlzLmZpbHRlcnMgPSBmaWx0ZXJzOwogCQl0aGlzLnNlcnZsZXQgPSBzZXJ2bGV0OwogCX0KQEAgLTk5LDcgKzk5LDcgQEAgYWJzdHJhY3QgY2xhc3MgVXJsUGlwZWxpbmUgewogCSAqIEB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIGEgZmlsdGVyIG9yIHNlcnZsZXQgaXMgdW5hYmxlIHRvIGluaXRpYWxpemUuCiAJICovCi0Jdm9pZCBpbml0KGZpbmFsIFNlcnZsZXRDb250ZXh0IGNvbnRleHQsIGZpbmFsIFNldDxPYmplY3Q+IGluaXRlZCkKKwl2b2lkIGluaXQoU2VydmxldENvbnRleHQgY29udGV4dCwgU2V0PE9iamVjdD4gaW5pdGVkKQogCQkJdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24gewogCQlmb3IgKEZpbHRlciByZWYgOiBmaWx0ZXJzKQogCQkJaW5pdEZpbHRlcihyZWYsIGNvbnRleHQsIGluaXRlZCk7CkBAIC0xNjUsNyArMTY1LDcgQEAgcHVibGljIFN0cmluZyBnZXRTZXJ2bGV0TmFtZSgpIHsKIAkgKiAgICAgICAgICAgIGRlc3Ryb3llZCBhIHNlY29uZCB0aW1lLiBGaWx0ZXJzIGFuZCBzZXJ2bGV0cyB0aGF0IGFyZSBmaXJzdAogCSAqICAgICAgICAgICAgZGVzdHJveWVkIGJ5IHRoaXMgcGlwZWxpbmUgd2lsbCBiZSBhZGRlZCB0byB0aGlzIHNldC4KIAkgKi8KLQl2b2lkIGRlc3Ryb3koZmluYWwgU2V0PE9iamVjdD4gZGVzdHJveWVkKSB7CisJdm9pZCBkZXN0cm95KFNldDxPYmplY3Q+IGRlc3Ryb3llZCkgewogCQlmb3IgKEZpbHRlciByZWYgOiBmaWx0ZXJzKQogCQkJZGVzdHJveUZpbHRlcihyZWYsIGRlc3Ryb3llZCk7CiAJCWRlc3Ryb3lTZXJ2bGV0KHNlcnZsZXQsIGRlc3Ryb3llZCk7CkBAIC0yMzAsNyArMjMwLDcgQEAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ2hhaW4gaW1wbGVtZW50cyBGaWx0ZXJDaGFpbiB7CiAKIAkJcHJpdmF0ZSBpbnQgZmlsdGVySWR4OwogCi0JCUNoYWluKGZpbmFsIEZpbHRlcltdIGZpbHRlcnMsIGZpbmFsIEh0dHBTZXJ2bGV0IHNlcnZsZXQpIHsKKwkJQ2hhaW4oRmlsdGVyW10gZmlsdGVycywgSHR0cFNlcnZsZXQgc2VydmxldCkgewogCQkJdGhpcy5maWx0ZXJzID0gZmlsdGVyczsKIAkJCXRoaXMuc2VydmxldCA9IHNlcnZsZXQ7CiAJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvcmVzb2x2ZXIvQXNJc0ZpbGVTZXJ2aWNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL3Jlc29sdmVyL0FzSXNGaWxlU2VydmljZS5qYXZhCmluZGV4IDExYWQ1ZTAuLjlhOTI4YjEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvcmVzb2x2ZXIvQXNJc0ZpbGVTZXJ2aWNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9yZXNvbHZlci9Bc0lzRmlsZVNlcnZpY2UuamF2YQpAQCAtNzMsNyArNzMsNyBAQCBwdWJsaWMgdm9pZCBhY2Nlc3MoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgUmVwb3NpdG9yeSBkYikKIAlwcml2YXRlIHN0YXRpYyBjbGFzcyBTZXJ2aWNlQ29uZmlnIHsKIAkJZmluYWwgYm9vbGVhbiBlbmFibGVkOwogCi0JCVNlcnZpY2VDb25maWcoZmluYWwgQ29uZmlnIGNmZykgeworCQlTZXJ2aWNlQ29uZmlnKENvbmZpZyBjZmcpIHsKIAkJCWVuYWJsZWQgPSBjZmcuZ2V0Qm9vbGVhbigiaHR0cCIsICJnZXRhbnlmaWxlIiwgdHJ1ZSk7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL3Jlc29sdmVyL0RlZmF1bHRSZWNlaXZlUGFja0ZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvcmVzb2x2ZXIvRGVmYXVsdFJlY2VpdmVQYWNrRmFjdG9yeS5qYXZhCmluZGV4IDk1ZWI4ZDUuLjA2YThmNWUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvcmVzb2x2ZXIvRGVmYXVsdFJlY2VpdmVQYWNrRmFjdG9yeS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvcmVzb2x2ZXIvRGVmYXVsdFJlY2VpdmVQYWNrRmFjdG9yeS5qYXZhCkBAIC03NCw3ICs3NCw3IEBAIHByaXZhdGUgc3RhdGljIGNsYXNzIFNlcnZpY2VDb25maWcgewogCiAJCWZpbmFsIGJvb2xlYW4gZW5hYmxlZDsKIAotCQlTZXJ2aWNlQ29uZmlnKGZpbmFsIENvbmZpZyBjZmcpIHsKKwkJU2VydmljZUNvbmZpZyhDb25maWcgY2ZnKSB7CiAJCQlzZXQgPSBjZmcuZ2V0U3RyaW5nKCJodHRwIiwgbnVsbCwgInJlY2VpdmVwYWNrIikgIT0gbnVsbDsKIAkJCWVuYWJsZWQgPSBjZmcuZ2V0Qm9vbGVhbigiaHR0cCIsICJyZWNlaXZlcGFjayIsIGZhbHNlKTsKIAkJfQpAQCAtODIsNyArODIsNyBAQCBwcml2YXRlIHN0YXRpYyBjbGFzcyBTZXJ2aWNlQ29uZmlnIHsKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIFJlY2VpdmVQYWNrIGNyZWF0ZShmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBmaW5hbCBSZXBvc2l0b3J5IGRiKQorCXB1YmxpYyBSZWNlaXZlUGFjayBjcmVhdGUoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgUmVwb3NpdG9yeSBkYikKIAkJCXRocm93cyBTZXJ2aWNlTm90RW5hYmxlZEV4Y2VwdGlvbiwgU2VydmljZU5vdEF1dGhvcml6ZWRFeGNlcHRpb24gewogCQlmaW5hbCBTZXJ2aWNlQ29uZmlnIGNmZyA9IGRiLmdldENvbmZpZygpLmdldChTZXJ2aWNlQ29uZmlnOjpuZXcpOwogCQlTdHJpbmcgdXNlciA9IHJlcS5nZXRSZW1vdGVVc2VyKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL3Jlc29sdmVyL0RlZmF1bHRVcGxvYWRQYWNrRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9yZXNvbHZlci9EZWZhdWx0VXBsb2FkUGFja0ZhY3RvcnkuamF2YQppbmRleCBmNWFmYTFlLi5hNjlmYWIwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL3Jlc29sdmVyL0RlZmF1bHRVcGxvYWRQYWNrRmFjdG9yeS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvcmVzb2x2ZXIvRGVmYXVsdFVwbG9hZFBhY2tGYWN0b3J5LmphdmEKQEAgLTQzLDYgKzQzLDggQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyLnJlc29sdmVyOwogCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKwogaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWc7CkBAIC02NCwxOCArNjYsMjUgQEAgcHVibGljIGNsYXNzIERlZmF1bHRVcGxvYWRQYWNrRmFjdG9yeSBpbXBsZW1lbnRzCiAJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU2VydmljZUNvbmZpZyB7CiAJCWZpbmFsIGJvb2xlYW4gZW5hYmxlZDsKIAotCQlTZXJ2aWNlQ29uZmlnKGZpbmFsIENvbmZpZyBjZmcpIHsKKwkJU2VydmljZUNvbmZpZyhDb25maWcgY2ZnKSB7CiAJCQllbmFibGVkID0gY2ZnLmdldEJvb2xlYW4oImh0dHAiLCAidXBsb2FkcGFjayIsIHRydWUpOwogCQl9CiAJfQogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgVXBsb2FkUGFjayBjcmVhdGUoZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgZmluYWwgUmVwb3NpdG9yeSBkYikKKwlwdWJsaWMgVXBsb2FkUGFjayBjcmVhdGUoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgUmVwb3NpdG9yeSBkYikKIAkJCXRocm93cyBTZXJ2aWNlTm90RW5hYmxlZEV4Y2VwdGlvbiwgU2VydmljZU5vdEF1dGhvcml6ZWRFeGNlcHRpb24gewotCQlpZiAoZGIuZ2V0Q29uZmlnKCkuZ2V0KFNlcnZpY2VDb25maWc6Om5ldykuZW5hYmxlZCkKLQkJCXJldHVybiBuZXcgVXBsb2FkUGFjayhkYik7Ci0JCWVsc2UKKwkJaWYgKGRiLmdldENvbmZpZygpLmdldChTZXJ2aWNlQ29uZmlnOjpuZXcpLmVuYWJsZWQpIHsKKwkJCVVwbG9hZFBhY2sgdXAgPSBuZXcgVXBsb2FkUGFjayhkYik7CisJCQlTdHJpbmcgaGVhZGVyID0gcmVxLmdldEhlYWRlcigiR2l0LVByb3RvY29sIik7IC8vJE5PTi1OTFMtMSQKKwkJCWlmIChoZWFkZXIgIT0gbnVsbCkgeworCQkJCVN0cmluZ1tdIHBhcmFtcyA9IGhlYWRlci5zcGxpdCgiOiIpOyAvLyROT04tTkxTLTEkCisJCQkJdXAuc2V0RXh0cmFQYXJhbWV0ZXJzKEFycmF5cy5hc0xpc3QocGFyYW1zKSk7CisJCQl9CisJCQlyZXR1cm4gdXA7CisJCX0gZWxzZSB7CiAJCQl0aHJvdyBuZXcgU2VydmljZU5vdEVuYWJsZWRFeGNlcHRpb24oKTsKKwkJfQogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggZjMzODYwNy4uZmVkNjMyZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTMsNyArMyw3IEBACiBCdW5kbGUtTmFtZTogJXBsdWdpbl9uYW1lCiBBdXRvbWF0aWMtTW9kdWxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0CiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdAotQnVuZGxlLVZlcnNpb246IDQuMTEuOC5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiA1LjAuNC5xdWFsaWZpZXIKIEJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlcl9uYW1lCiBCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKYXZhU0UtMS44CkBAIC0yNSwyNSArMjUsMjYgQEAKICBvcmcuZWNsaXBzZS5qZXR0eS51dGlsLmxvZzt2ZXJzaW9uPSJbOS40LjUsMTAuMC4wKSIsCiAgb3JnLmVjbGlwc2UuamV0dHkudXRpbC5zZWN1cml0eTt2ZXJzaW9uPSJbOS40LjUsMTAuMC4wKSIsCiAgb3JnLmVjbGlwc2UuamV0dHkudXRpbC50aHJlYWQ7dmVyc2lvbj0iWzkuNC41LDEwLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlcjt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIuZ2x1ZTt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIucmVzb2x2ZXI7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmRmczt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnJlZnRhYmxlO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5qdW5pdDt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cDt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5ubHM7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cDt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHAuYXBhY2hlO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQucmVzb2x2ZXI7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmVycm9yczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIuZ2x1ZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyLnJlc29sdmVyO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWw7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmRmczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucmVmdGFibGU7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5qdW5pdDt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Lmh0dHA7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5ubHM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHA7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cC5hcGFjaGU7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQucmVzb2x2ZXI7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5oYW1jcmVzdDt2ZXJzaW9uPSJbMS4xLjAsMi4wLjApIiwKICBvcmcuaGFtY3Jlc3QuY29yZTt2ZXJzaW9uPSJbMS4xLjAsMi4wLjApIiwKICBvcmcuanVuaXQ7dmVyc2lvbj0iWzQuMTIsNS4wLjApIiwKICBvcmcuanVuaXQucnVsZXM7dmVyc2lvbj0iWzQuMTIsNS4wLjApIiwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC9wb20ueG1sCmluZGV4IDQyMjM5OGMuLjg3ZTJmNGMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvcG9tLnhtbApAQCAtNTEsNyArNTEsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+NC4xMS44LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjUuMC40LVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdDwvYXJ0aWZhY3RJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvdGVzdC9Bc0lzU2VydmljZVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvdGVzdC9Bc0lzU2VydmljZVRlc3QuamF2YQppbmRleCBlOTRhNzkyLi4yOThiZjIxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9odHRwL3Rlc3QvQXNJc1NlcnZpY2VUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L0FzSXNTZXJ2aWNlVGVzdC5qYXZhCkBAIC0xMzMsNyArMTMzLDcgQEAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUiBleHRlbmRzIEh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIgewogCiAJCXByaXZhdGUgZmluYWwgU3RyaW5nIGhvc3Q7CiAKLQkJUihmaW5hbCBTdHJpbmcgdXNlciwgZmluYWwgU3RyaW5nIGhvc3QpIHsKKwkJUihTdHJpbmcgdXNlciwgU3RyaW5nIGhvc3QpIHsKIAkJCXN1cGVyKG5ldyBSZXF1ZXN0KG51bGwsIG51bGwpIC8qIGNhbid0IHBhc3MgbnVsbCwgc2lnaCAqLyk7CiAJCQl0aGlzLnVzZXIgPSB1c2VyOwogCQkJdGhpcy5ob3N0ID0gaG9zdDsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvdGVzdC9EZWZhdWx0UmVjZWl2ZVBhY2tGYWN0b3J5VGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L0RlZmF1bHRSZWNlaXZlUGFja0ZhY3RvcnlUZXN0LmphdmEKaW5kZXggYjI0ZTJkZi4uYWRlMWUxZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L0RlZmF1bHRSZWNlaXZlUGFja0ZhY3RvcnlUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L0RlZmF1bHRSZWNlaXZlUGFja0ZhY3RvcnlUZXN0LmphdmEKQEAgLTIwNSw3ICsyMDUsNyBAQCBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBSIGV4dGVuZHMgSHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlciB7CiAKIAkJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgaG9zdDsKIAotCQlSKGZpbmFsIFN0cmluZyB1c2VyLCBmaW5hbCBTdHJpbmcgaG9zdCkgeworCQlSKFN0cmluZyB1c2VyLCBTdHJpbmcgaG9zdCkgewogCQkJc3VwZXIobmV3IFJlcXVlc3QobnVsbCwgbnVsbCkgLyogY2FuJ3QgcGFzcyBudWxsLCBzaWdoICovKTsKIAkJCXRoaXMudXNlciA9IHVzZXI7CiAJCQl0aGlzLmhvc3QgPSBob3N0OwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L0RlZmF1bHRVcGxvYWRQYWNrRmFjdG9yeVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvdGVzdC9EZWZhdWx0VXBsb2FkUGFja0ZhY3RvcnlUZXN0LmphdmEKaW5kZXggY2UyNGQ2NC4uMjY4YzI4MSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L0RlZmF1bHRVcGxvYWRQYWNrRmFjdG9yeVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9odHRwL3Rlc3QvRGVmYXVsdFVwbG9hZFBhY2tGYWN0b3J5VGVzdC5qYXZhCkBAIC0xNjEsNyArMTYxLDcgQEAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUiBleHRlbmRzIEh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIgewogCiAJCXByaXZhdGUgZmluYWwgU3RyaW5nIGhvc3Q7CiAKLQkJUihmaW5hbCBTdHJpbmcgdXNlciwgZmluYWwgU3RyaW5nIGhvc3QpIHsKKwkJUihTdHJpbmcgdXNlciwgU3RyaW5nIGhvc3QpIHsKIAkJCXN1cGVyKG5ldyBSZXF1ZXN0KG51bGwsIG51bGwpIC8qIGNhbid0IHBhc3MgbnVsbCwgc2lnaCAqLyk7CiAJCQl0aGlzLnVzZXIgPSB1c2VyOwogCQkJdGhpcy5ob3N0ID0gaG9zdDsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvdGVzdC9IdHRwQ2xpZW50VGVzdHMuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvdGVzdC9IdHRwQ2xpZW50VGVzdHMuamF2YQppbmRleCA2ZGJlMGUzLi5lZjA1OWJmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9odHRwL3Rlc3QvSHR0cENsaWVudFRlc3RzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L0h0dHBDbGllbnRUZXN0cy5qYXZhCkBAIC00MywxNSArNDMsMjAgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdDsKIAoraW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuaXM7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy50aGVJbnN0YW5jZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIGltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwpAQCAtNzUsOSArODAsMTMgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5TdG9yZWRDb25maWc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldkNvbW1pdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5GZXRjaENvbm5lY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuUGFja2V0TGluZUluOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlBhY2tldExpbmVPdXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuVHJhbnNwb3J0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlVSSWlzaDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5Vc2VybmFtZVBhc3N3b3JkQ3JlZGVudGlhbHNQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5odHRwLkh0dHBDb25uZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHAuSkRLSHR0cENvbm5lY3Rpb25GYWN0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnJlc29sdmVyLlJlcG9zaXRvcnlSZXNvbHZlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5yZXNvbHZlci5TZXJ2aWNlTm90RW5hYmxlZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwpAQCAtMTE4LDcgKzEyNyw3IEBAIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXNtYXJ0QXV0aEJhc2ljVVJJID0gdG9VUklpc2goc0Jhc2ljLCBzcmNOYW1lKTsKIAl9CiAKLQlwcml2YXRlIFNlcnZsZXRDb250ZXh0SGFuZGxlciBkdW1iKGZpbmFsIFN0cmluZyBwYXRoKSB7CisJcHJpdmF0ZSBTZXJ2bGV0Q29udGV4dEhhbmRsZXIgZHVtYihTdHJpbmcgcGF0aCkgewogCQlmaW5hbCBGaWxlIHNyY0dpdCA9IHJlbW90ZVJlcG9zaXRvcnkuZ2V0UmVwb3NpdG9yeSgpLmdldERpcmVjdG9yeSgpOwogCQlmaW5hbCBVUkkgYmFzZSA9IHNyY0dpdC5nZXRQYXJlbnRGaWxlKCkudG9VUkkoKTsKIApAQCAtMTMwLDcgKzEzOSw3IEBAIHByaXZhdGUgU2VydmxldENvbnRleHRIYW5kbGVyIGR1bWIoZmluYWwgU3RyaW5nIHBhdGgpIHsKIAkJcmV0dXJuIGN0eDsKIAl9CiAKLQlwcml2YXRlIFNlcnZsZXRDb250ZXh0SGFuZGxlciBzbWFydChmaW5hbCBTdHJpbmcgcGF0aCkgeworCXByaXZhdGUgU2VydmxldENvbnRleHRIYW5kbGVyIHNtYXJ0KFN0cmluZyBwYXRoKSB7CiAJCUdpdFNlcnZsZXQgZ3MgPSBuZXcgR2l0U2VydmxldCgpOwogCQlncy5zZXRSZXBvc2l0b3J5UmVzb2x2ZXIobmV3IFJlcG9zaXRvcnlSZXNvbHZlcjxIdHRwU2VydmxldFJlcXVlc3Q+KCkgewogCQkJQE92ZXJyaWRlCkBAIC0xNTEsNyArMTYwLDcgQEAgcHVibGljIFJlcG9zaXRvcnkgb3BlbihIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBTdHJpbmcgbmFtZSkKIAkJcmV0dXJuIGN0eDsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgbmFtZU9mKGZpbmFsIFJlcG9zaXRvcnkgZGIpIHsKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgbmFtZU9mKFJlcG9zaXRvcnkgZGIpIHsKIAkJcmV0dXJuIGRiLmdldERpcmVjdG9yeSgpLmdldE5hbWUoKTsKIAl9CiAKQEAgLTM0NSw0ICszNTQsODIgQEAgcHVibGljIHZvaWQgdGVzdExpc3RSZW1vdGVXaXRob3V0TG9jYWxSZXBvc2l0b3J5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCQlhc3NlcnROb3ROdWxsKGhlYWQpOwogCQl9CiAJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0SHR0cENsaWVudFdhbnRzVjJCdXRTZXJ2ZXJOb3RDb25maWd1cmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUpES0h0dHBDb25uZWN0aW9uRmFjdG9yeSBmID0gbmV3IEpES0h0dHBDb25uZWN0aW9uRmFjdG9yeSgpOworCQlTdHJpbmcgdXJsID0gc21hcnRBdXRoTm9uZVVSSS50b1N0cmluZygpICsgIi9pbmZvL3JlZnM/c2VydmljZT1naXQtdXBsb2FkLXBhY2siOworCQlIdHRwQ29ubmVjdGlvbiBjID0gZi5jcmVhdGUobmV3IFVSTCh1cmwpKTsKKwkJYy5zZXRSZXF1ZXN0TWV0aG9kKCJHRVQiKTsKKwkJYy5zZXRSZXF1ZXN0UHJvcGVydHkoIkdpdC1Qcm90b2NvbCIsICJ2ZXJzaW9uPTIiKTsKKwkJYy5jb25uZWN0KCk7CisJCWFzc2VydFRoYXQoYy5nZXRSZXNwb25zZUNvZGUoKSwgaXMoMjAwKSk7CisKKwkJUGFja2V0TGluZUluIHBja0luID0gbmV3IFBhY2tldExpbmVJbihjLmdldElucHV0U3RyZWFtKCkpOworCisJCS8vIENoZWNrIHRoYXQgd2UgZ2V0IGEgdjAgcmVzcG9uc2UuCisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcygiIyBzZXJ2aWNlPWdpdC11cGxvYWQtcGFjayIpKTsKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIHRoZUluc3RhbmNlKFBhY2tldExpbmVJbi5FTkQpKTsKKwkJYXNzZXJ0VHJ1ZShwY2tJbi5yZWFkU3RyaW5nKCkubWF0Y2hlcygiWzAtOWEtZl17NDB9IEhFQUQuKiIpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RWMkh0dHBGaXJzdFJlc3BvbnNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJlbW90ZVJlcG9zaXRvcnkuZ2V0UmVwb3NpdG9yeSgpLmdldENvbmZpZygpLnNldEludCgKKwkJCQkicHJvdG9jb2wiLCBudWxsLCAidmVyc2lvbiIsIDIpOworCisJCUpES0h0dHBDb25uZWN0aW9uRmFjdG9yeSBmID0gbmV3IEpES0h0dHBDb25uZWN0aW9uRmFjdG9yeSgpOworCQlTdHJpbmcgdXJsID0gc21hcnRBdXRoTm9uZVVSSS50b1N0cmluZygpICsgIi9pbmZvL3JlZnM/c2VydmljZT1naXQtdXBsb2FkLXBhY2siOworCQlIdHRwQ29ubmVjdGlvbiBjID0gZi5jcmVhdGUobmV3IFVSTCh1cmwpKTsKKwkJYy5zZXRSZXF1ZXN0TWV0aG9kKCJHRVQiKTsKKwkJYy5zZXRSZXF1ZXN0UHJvcGVydHkoIkdpdC1Qcm90b2NvbCIsICJ2ZXJzaW9uPTIiKTsKKwkJYy5jb25uZWN0KCk7CisJCWFzc2VydFRoYXQoYy5nZXRSZXNwb25zZUNvZGUoKSwgaXMoMjAwKSk7CisKKwkJUGFja2V0TGluZUluIHBja0luID0gbmV3IFBhY2tldExpbmVJbihjLmdldElucHV0U3RyZWFtKCkpOworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXMoInZlcnNpb24gMiIpKTsKKworCQkvLyBXaGF0IHJlbWFpbnMgYXJlIGNhcGFiaWxpdGllcyAtIGVuc3VyZSB0aGF0IGFsbCBvZiB0aGVtIGFyZQorCQkvLyBub24tZW1wdHkgc3RyaW5ncywgYW5kIHRoYXQgd2Ugc2VlIEVORCBhdCB0aGUgZW5kLgorCQlTdHJpbmcgczsKKwkJd2hpbGUgKChzID0gcGNrSW4ucmVhZFN0cmluZygpKSAhPSBQYWNrZXRMaW5lSW4uRU5EKSB7CisJCQlhc3NlcnRUcnVlKCFzLmlzRW1wdHkoKSk7CisJCX0KKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RWMkh0dHBTdWJzZXF1ZW50UmVzcG9uc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmVtb3RlUmVwb3NpdG9yeS5nZXRSZXBvc2l0b3J5KCkuZ2V0Q29uZmlnKCkuc2V0SW50KAorCQkJCSJwcm90b2NvbCIsIG51bGwsICJ2ZXJzaW9uIiwgMik7CisKKwkJSkRLSHR0cENvbm5lY3Rpb25GYWN0b3J5IGYgPSBuZXcgSkRLSHR0cENvbm5lY3Rpb25GYWN0b3J5KCk7CisJCVN0cmluZyB1cmwgPSBzbWFydEF1dGhOb25lVVJJLnRvU3RyaW5nKCkgKyAiL2dpdC11cGxvYWQtcGFjayI7CisJCUh0dHBDb25uZWN0aW9uIGMgPSBmLmNyZWF0ZShuZXcgVVJMKHVybCkpOworCQljLnNldFJlcXVlc3RNZXRob2QoIlBPU1QiKTsKKwkJYy5zZXRSZXF1ZXN0UHJvcGVydHkoIkNvbnRlbnQtVHlwZSIsICJhcHBsaWNhdGlvbi94LWdpdC11cGxvYWQtcGFjay1yZXF1ZXN0Iik7CisJCWMuc2V0UmVxdWVzdFByb3BlcnR5KCJHaXQtUHJvdG9jb2wiLCAidmVyc2lvbj0yIik7CisJCWMuc2V0RG9PdXRwdXQodHJ1ZSk7CisJCWMuY29ubmVjdCgpOworCisJCS8vIFRlc3QgbHMtcmVmcyB0byB2ZXJpZnkgdGhhdCBldmVyeXRoaW5nIGlzIGNvbm5lY3RlZAorCQkvLyBwcm9wZXJseS4gVGVzdHMgZm9yIG90aGVyIGNvbW1hbmRzIGdvIGluCisJCS8vIFVwbG9hZFBhY2tUZXN0LmphdmEuCisKKwkJT3V0cHV0U3RyZWFtIG9zID0gYy5nZXRPdXRwdXRTdHJlYW0oKTsKKwkJUGFja2V0TGluZU91dCBwY2tPdXQgPSBuZXcgUGFja2V0TGluZU91dChvcyk7CisJCXBja091dC53cml0ZVN0cmluZygiY29tbWFuZD1scy1yZWZzIik7CisJCXBja091dC53cml0ZURlbGltKCk7CisJCXBja091dC5lbmQoKTsKKwkJb3MuY2xvc2UoKTsKKworCQlQYWNrZXRMaW5lSW4gcGNrSW4gPSBuZXcgUGFja2V0TGluZUluKGMuZ2V0SW5wdXRTdHJlYW0oKSk7CisKKwkJLy8gSnVzdCBjaGVjayB0aGF0IHdlIGdldCB3aGF0IGxvb2tzIGxpa2UgYSByZWYgYWR2ZXJ0aXNlbWVudC4KKwkJU3RyaW5nIHM7CisJCXdoaWxlICgocyA9IHBja0luLnJlYWRTdHJpbmcoKSkgIT0gUGFja2V0TGluZUluLkVORCkgeworCQkJYXNzZXJ0VHJ1ZShzLm1hdGNoZXMoIlswLTlhLWZdezQwfSBbQS1aYS16L10qIikpOworCQl9CisKKwkJYXNzZXJ0VGhhdChjLmdldFJlc3BvbnNlQ29kZSgpLCBpcygyMDApKTsKKwl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9odHRwL3Rlc3QvUHJvdG9jb2xFcnJvclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvdGVzdC9Qcm90b2NvbEVycm9yVGVzdC5qYXZhCmluZGV4IDg3ZDBiYWQuLmExYmFhZTMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvdGVzdC9Qcm90b2NvbEVycm9yVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvdGVzdC9Qcm90b2NvbEVycm9yVGVzdC5qYXZhCkBAIC0xNDksMTkgKzE0OSwxNSBAQCBwdWJsaWMgdm9pZCB0ZXN0UHVzaF9VbnBhY2tFcnJvcl9UcnVuY2F0ZWRQYWNrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCQljLnNldFJlcXVlc3RQcm9wZXJ0eSgiQ29udGVudC1UeXBlIiwKIAkJCQkJR2l0U21hcnRIdHRwVG9vbHMuUkVDRUlWRV9QQUNLX1JFUVVFU1RfVFlQRSk7CiAJCQljLnNldEZpeGVkTGVuZ3RoU3RyZWFtaW5nTW9kZShyZXFiaW4ubGVuZ3RoKTsKLQkJCU91dHB1dFN0cmVhbSBvdXQgPSBjLmdldE91dHB1dFN0cmVhbSgpOwotCQkJdHJ5IHsKKwkJCXRyeSAoT3V0cHV0U3RyZWFtIG91dCA9IGMuZ2V0T3V0cHV0U3RyZWFtKCkpIHsKIAkJCQlvdXQud3JpdGUocmVxYmluKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJb3V0LmNsb3NlKCk7CiAJCQl9CiAKIAkJCWFzc2VydEVxdWFscygyMDAsIGMuZ2V0UmVzcG9uc2VDb2RlKCkpOwogCQkJYXNzZXJ0RXF1YWxzKEdpdFNtYXJ0SHR0cFRvb2xzLlJFQ0VJVkVfUEFDS19SRVNVTFRfVFlQRSwKIAkJCQkJYy5nZXRDb250ZW50VHlwZSgpKTsKIAotCQkJSW5wdXRTdHJlYW0gcmF3aW4gPSBjLmdldElucHV0U3RyZWFtKCk7Ci0JCQl0cnkgeworCQkJdHJ5IChJbnB1dFN0cmVhbSByYXdpbiA9IGMuZ2V0SW5wdXRTdHJlYW0oKSkgewogCQkJCVBhY2tldExpbmVJbiBwY2tpbiA9IG5ldyBQYWNrZXRMaW5lSW4ocmF3aW4pOwogCQkJCWFzc2VydEVxdWFscygidW5wYWNrIGVycm9yICIKIAkJCQkJCSsgSkdpdFRleHQuZ2V0KCkucGFja2ZpbGVJc1RydW5jYXRlZE5vUGFyYW0sCkBAIC0xNjksOCArMTY1LDYgQEAgcHVibGljIHZvaWQgdGVzdFB1c2hfVW5wYWNrRXJyb3JfVHJ1bmNhdGVkUGFjaygpIHRocm93cyBFeGNlcHRpb24gewogCQkJCWFzc2VydEVxdWFscygibmcgcmVmcy9vYmplY3RzL0Egbi9hICh1bnBhY2tlciBlcnJvcikiLAogCQkJCQkJcGNraW4ucmVhZFN0cmluZygpKTsKIAkJCQlhc3NlcnRTYW1lKFBhY2tldExpbmVJbi5FTkQsIHBja2luLnJlYWRTdHJpbmcoKSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCXJhd2luLmNsb3NlKCk7CiAJCQl9CiAJCX0gZmluYWxseSB7CiAJCQljLmRpc2Nvbm5lY3QoKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvdGVzdC9TZXRBZGRpdGlvbmFsSGVhZGVyc1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvdGVzdC9TZXRBZGRpdGlvbmFsSGVhZGVyc1Rlc3QuamF2YQppbmRleCBlZjhkYWVjLi5mYmM1NGYzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9odHRwL3Rlc3QvU2V0QWRkaXRpb25hbEhlYWRlcnNUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L1NldEFkZGl0aW9uYWxIZWFkZXJzVGVzdC5qYXZhCkBAIC0xMDcsOCArMTA3LDcgQEAgcHVibGljIHZvaWQgdGVzdFNldEhlYWRlcnMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCiAJCWFzc2VydEVxdWFscygiaHR0cCIsIHJlbW90ZVVSSS5nZXRTY2hlbWUoKSk7CiAKLQkJVHJhbnNwb3J0IHQgPSBUcmFuc3BvcnQub3Blbihkc3QsIHJlbW90ZVVSSSk7Ci0JCXRyeSB7CisJCXRyeSAoVHJhbnNwb3J0IHQgPSBUcmFuc3BvcnQub3Blbihkc3QsIHJlbW90ZVVSSSkpIHsKIAkJCWFzc2VydFRydWUoImlzYSBUcmFuc3BvcnRIdHRwIiwgdCBpbnN0YW5jZW9mIFRyYW5zcG9ydEh0dHApOwogCQkJYXNzZXJ0VHJ1ZSgiaXNhIEh0dHBUcmFuc3BvcnQiLCB0IGluc3RhbmNlb2YgSHR0cFRyYW5zcG9ydCk7CiAKQEAgLTExNyw4ICsxMTYsNiBAQCBwdWJsaWMgdm9pZCB0ZXN0U2V0SGVhZGVycygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQloZWFkZXJzLnB1dCgiQW5vdGhlcktleSIsICJzb21lVmFsdWUiKTsKIAkJCSgoVHJhbnNwb3J0SHR0cCkgdCkuc2V0QWRkaXRpb25hbEhlYWRlcnMoaGVhZGVycyk7CiAJCQl0Lm9wZW5GZXRjaCgpOwotCQl9IGZpbmFsbHkgewotCQkJdC5jbG9zZSgpOwogCQl9CiAKIAkJTGlzdDxBY2Nlc3NFdmVudD4gcmVxdWVzdHMgPSBnZXRSZXF1ZXN0cygpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L1NtYXJ0Q2xpZW50U21hcnRTZXJ2ZXJUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9odHRwL3Rlc3QvU21hcnRDbGllbnRTbWFydFNlcnZlclRlc3QuamF2YQppbmRleCAzMTgzMmU3Li42NTIxMGQxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9odHRwL3Rlc3QvU21hcnRDbGllbnRTbWFydFNlcnZlclRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9odHRwL3Rlc3QvU21hcnRDbGllbnRTbWFydFNlcnZlclRlc3QuamF2YQpAQCAtNDMsNyArNDMsNyBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0OwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5IdHRwU3VwcG9ydC5IRFJfQ09OVEVOVF9FTkNPRElORzsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC51dGlsLkh0dHBTdXBwb3J0LkhEUl9DT05URU5UX0xFTkdUSDsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC51dGlsLkh0dHBTdXBwb3J0LkhEUl9DT05URU5UX1RZUEU7CkBAIC0yOTgsMTAgKzI5OCwxMCBAQCBwdWJsaWMgdm9pZCBkb0ZpbHRlcihTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAogCQkJCQl0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24gewogCQkJCWZpbmFsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgciA9IChIdHRwU2VydmxldFJlc3BvbnNlKSByZXNwb25zZTsKIAkJCQlyLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7Ci0JCQkJci5zZXRDaGFyYWN0ZXJFbmNvZGluZygiVVRGLTgiKTsKLQkJCQlQcmludFdyaXRlciB3ID0gci5nZXRXcml0ZXIoKTsKLQkJCQl3LnByaW50KCJPSyIpOwotCQkJCXcuY2xvc2UoKTsKKwkJCQlyLnNldENoYXJhY3RlckVuY29kaW5nKENvbnN0YW50cy5DSEFSQUNURVJfRU5DT0RJTkcpOworCQkJCXRyeSAoUHJpbnRXcml0ZXIgdyA9IHIuZ2V0V3JpdGVyKCkpIHsKKwkJCQkJdy5wcmludCgiT0siKTsKKwkJCQl9CiAJCQl9CiAKIAkJCUBPdmVycmlkZQpAQCAtNDI5LDExICs0MjksOCBAQCBwdWJsaWMgdm9pZCB0ZXN0TGlzdFJlbW90ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQlhc3NlcnRUcnVlKCJpc2EgVHJhbnNwb3J0SHR0cCIsIHQgaW5zdGFuY2VvZiBUcmFuc3BvcnRIdHRwKTsKIAkJCWFzc2VydFRydWUoImlzYSBIdHRwVHJhbnNwb3J0IiwgdCBpbnN0YW5jZW9mIEh0dHBUcmFuc3BvcnQpOwogCi0JCQlGZXRjaENvbm5lY3Rpb24gYyA9IHQub3BlbkZldGNoKCk7Ci0JCQl0cnkgeworCQkJdHJ5IChGZXRjaENvbm5lY3Rpb24gYyA9IHQub3BlbkZldGNoKCkpIHsKIAkJCQltYXAgPSBjLmdldFJlZnNNYXAoKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJYy5jbG9zZSgpOwogCQkJfQogCQl9CiAKQEAgLTExNjYsNyArMTE2Myw3IEBAIHB1YmxpYyB2b2lkIHRlc3RJbml0aWFsQ2xvbmVfQnJva2VuU2VydmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJcHVibGljIHZvaWQgdGVzdEludmFsaWRXYW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpCiAJCU9iamVjdElkIGlkID0gbmV3IE9iamVjdEluc2VydGVyLkZvcm1hdHRlcigpLmlkRm9yKENvbnN0YW50cy5PQkpfQkxPQiwKLQkJCQkidGVzdEludmFsaWRXYW50Ii5nZXRCeXRlcyhVVEZfOCkpOworCQkJCSJ0ZXN0SW52YWxpZFdhbnQiLmdldEJ5dGVzKENIQVJTRVQpKTsKIAogCQlSZXBvc2l0b3J5IGRzdCA9IGNyZWF0ZUJhcmVSZXBvc2l0b3J5KCk7CiAJCXRyeSAoVHJhbnNwb3J0IHQgPSBUcmFuc3BvcnQub3Blbihkc3QsIHJlbW90ZVVSSSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Lmh0dHAvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Lmh0dHAvTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggZDc5MjBmYS4uYTY4ZDE1MiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwL01FVEEtSU5GL01BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cC9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMyw3ICszLDcgQEAKIEJ1bmRsZS1OYW1lOiAlcGx1Z2luX25hbWUKIEF1dG9tYXRpYy1Nb2R1bGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwCiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Lmh0dHAKLUJ1bmRsZS1WZXJzaW9uOiA0LjExLjgucXVhbGlmaWVyCitCdW5kbGUtVmVyc2lvbjogNS4wLjQucXVhbGlmaWVyCiBCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KIEJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlcl9uYW1lCiBCdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQpAQCAtMjIsMTYgKzIyLDE2IEBACiAgb3JnLmVjbGlwc2UuamV0dHkudXRpbC5sb2c7dmVyc2lvbj0iWzkuNC41LDEwLjAuMCkiLAogIG9yZy5lY2xpcHNlLmpldHR5LnV0aWwuc2VjdXJpdHk7dmVyc2lvbj0iWzkuNC41LDEwLjAuMCkiLAogIG9yZy5lY2xpcHNlLmpldHR5LnV0aWwuc3NsO3ZlcnNpb249Ils5LjQuNSwxMC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmVycm9yczt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXI7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQ7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmxpYjt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQucmVzb2x2ZXI7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmVycm9yczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQ7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnJlc29sdmVyO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAogIG9yZy5qdW5pdDt2ZXJzaW9uPSJbNC4xMiw1LjAuMCkiCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwO3ZlcnNpb249IjQuMTEuOCI7CitFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwO3ZlcnNpb249IjUuMC40IjsKICAgdXNlczo9Im9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LAogICAgb3JnLmVjbGlwc2UuamdpdC5qdW5pdCwKICAgIGphdmF4LnNlcnZsZXQuaHR0cCwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cC9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwL3BvbS54bWwKaW5kZXggNWQ5MmExYS4uZWI3ZDAyZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwL3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwL3BvbS54bWwKQEAgLTUwLDcgKzUwLDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjQuMTEuOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj41LjAuNC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwPC9hcnRpZmFjdElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L2h0dHAvQWNjZXNzRXZlbnQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9odHRwL0FjY2Vzc0V2ZW50LmphdmEKaW5kZXggMDFjNDM2MC4uODI0NzZkZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L2h0dHAvQWNjZXNzRXZlbnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Lmh0dHAvc3JjL29yZy9lY2xpcHNlL2pnaXQvanVuaXQvaHR0cC9BY2Nlc3NFdmVudC5qYXZhCkBAIC02Nyw3ICs2Nyw3IEBAIHB1YmxpYyBjbGFzcyBBY2Nlc3NFdmVudCB7CiAKIAlwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gcmVzcG9uc2VIZWFkZXJzOwogCi0JQWNjZXNzRXZlbnQoZmluYWwgUmVxdWVzdCByZXEsIGZpbmFsIFJlc3BvbnNlIHJzcCkgeworCUFjY2Vzc0V2ZW50KFJlcXVlc3QgcmVxLCBSZXNwb25zZSByc3ApIHsKIAkJbWV0aG9kID0gcmVxLmdldE1ldGhvZCgpOwogCQl1cmkgPSByZXEuZ2V0UmVxdWVzdFVSSSgpOwogCQlyZXF1ZXN0SGVhZGVycyA9IGNsb25lSGVhZGVycyhyZXEpOwpAQCAtNzcsNyArNzcsNyBAQCBwdWJsaWMgY2xhc3MgQWNjZXNzRXZlbnQgewogCQlyZXNwb25zZUhlYWRlcnMgPSBjbG9uZUhlYWRlcnMocnNwKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGNsb25lSGVhZGVycyhmaW5hbCBSZXF1ZXN0IHJlcSkgeworCXByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIFN0cmluZz4gY2xvbmVIZWFkZXJzKFJlcXVlc3QgcmVxKSB7CiAJCU1hcDxTdHJpbmcsIFN0cmluZz4gciA9IG5ldyBUcmVlTWFwPD4oKTsKIAkJRW51bWVyYXRpb24gaG4gPSByZXEuZ2V0SGVhZGVyTmFtZXMoKTsKIAkJd2hpbGUgKGhuLmhhc01vcmVFbGVtZW50cygpKSB7CkBAIC04OSw3ICs4OSw3IEBAIHByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIFN0cmluZz4gY2xvbmVIZWFkZXJzKGZpbmFsIFJlcXVlc3QgcmVxKSB7CiAJCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAocik7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgU3RyaW5nPiBjbG9uZUhlYWRlcnMoZmluYWwgUmVzcG9uc2UgcnNwKSB7CisJcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgU3RyaW5nPiBjbG9uZUhlYWRlcnMoUmVzcG9uc2UgcnNwKSB7CiAJCU1hcDxTdHJpbmcsIFN0cmluZz4gciA9IG5ldyBUcmVlTWFwPD4oKTsKIAkJRW51bWVyYXRpb248U3RyaW5nPiBobiA9IHJzcC5nZXRIdHRwRmllbGRzKCkuZ2V0RmllbGROYW1lcygpOwogCQl3aGlsZSAoaG4uaGFzTW9yZUVsZW1lbnRzKCkpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9odHRwL1JlY29yZGluZ0xvZ2dlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L2h0dHAvUmVjb3JkaW5nTG9nZ2VyLmphdmEKaW5kZXggZmVkMDYzYS4uYTcxNGViMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L2h0dHAvUmVjb3JkaW5nTG9nZ2VyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L2h0dHAvUmVjb3JkaW5nTG9nZ2VyLmphdmEKQEAgLTEwNyw3ICsxMDcsNyBAQCBwdWJsaWMgUmVjb3JkaW5nTG9nZ2VyKCkgewogCSAqCiAJICogQHBhcmFtIG5hbWUKIAkgKi8KLQlwdWJsaWMgUmVjb3JkaW5nTG9nZ2VyKGZpbmFsIFN0cmluZyBuYW1lKSB7CisJcHVibGljIFJlY29yZGluZ0xvZ2dlcihTdHJpbmcgbmFtZSkgewogCQl0aGlzLm5hbWUgPSBuYW1lOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L2h0dHAvU2ltcGxlSHR0cFNlcnZlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L2h0dHAvU2ltcGxlSHR0cFNlcnZlci5qYXZhCmluZGV4IGM1NTc2ZjkuLjI0NWI1MTAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9odHRwL1NpbXBsZUh0dHBTZXJ2ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Lmh0dHAvc3JjL29yZy9lY2xpcHNlL2pnaXQvanVuaXQvaHR0cC9TaW1wbGVIdHRwU2VydmVyLmphdmEKQEAgLTEzNCw3ICsxMzQsNyBAQCBwdWJsaWMgVVJJaXNoIGdldFNlY3VyZVVyaSgpIHsKIAkJcmV0dXJuIHNlY3VyZVVyaTsKIAl9CiAKLQlwcml2YXRlIFNlcnZsZXRDb250ZXh0SGFuZGxlciBzbWFydChmaW5hbCBTdHJpbmcgcGF0aCkgeworCXByaXZhdGUgU2VydmxldENvbnRleHRIYW5kbGVyIHNtYXJ0KFN0cmluZyBwYXRoKSB7CiAJCUdpdFNlcnZsZXQgZ3MgPSBuZXcgR2l0U2VydmxldCgpOwogCQlncy5zZXRSZXBvc2l0b3J5UmVzb2x2ZXIobmV3IFJlcG9zaXRvcnlSZXNvbHZlcjxIdHRwU2VydmxldFJlcXVlc3Q+KCkgewogCQkJQE92ZXJyaWRlCkBAIC0xNTQsNyArMTU0LDcgQEAgcHVibGljIFJlcG9zaXRvcnkgb3BlbihIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBTdHJpbmcgbmFtZSkKIAkJcmV0dXJuIGN0eDsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgbmFtZU9mKGZpbmFsIFJlcG9zaXRvcnkgZGIpIHsKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgbmFtZU9mKFJlcG9zaXRvcnkgZGIpIHsKIAkJcmV0dXJuIGRiLmdldERpcmVjdG9yeSgpLmdldE5hbWUoKTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvLnNldHRpbmdzLy5hcGlfZmlsdGVycyBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvLnNldHRpbmdzLy5hcGlfZmlsdGVycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWRlNzg3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC8uc2V0dGluZ3MvLmFwaV9maWx0ZXJzCkBAIC0wLDAgKzEsMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgorPGNvbXBvbmVudCBpZD0ib3JnLmVjbGlwc2UuamdpdC5qdW5pdCIgdmVyc2lvbj0iMiI+CisgICAgPHJlc291cmNlIHBhdGg9InNyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L0xvY2FsRGlza1JlcG9zaXRvcnlUZXN0Q2FzZS5qYXZhIiB0eXBlPSJvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LkxvY2FsRGlza1JlcG9zaXRvcnlUZXN0Q2FzZSI+CisgICAgICAgIDxmaWx0ZXIgY29tbWVudD0iRG9uJ3QgY2FyZSBhYm91dCBub24tQVBJIGluIHRlc3RzLiIgaWQ9IjY0Mzg0MjA2NCI+CisgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IkZpbGVSZXBvc2l0b3J5Ii8+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IkxvY2FsRGlza1JlcG9zaXRvcnlUZXN0Q2FzZSIvPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJjcmVhdGVCYXJlUmVwb3NpdG9yeSgpIi8+CisgICAgICAgICAgICA8L21lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICA8L2ZpbHRlcj4KKyAgICAgICAgPGZpbHRlciBjb21tZW50PSJEb24ndCBjYXJlIGFib3V0IG5vbi1BUEkgaW4gdGVzdHMuIiBpZD0iNjQzODQyMDY0Ij4KKyAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iRmlsZVJlcG9zaXRvcnkiLz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iTG9jYWxEaXNrUmVwb3NpdG9yeVRlc3RDYXNlIi8+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9ImNyZWF0ZVJlcG9zaXRvcnkoYm9vbGVhbiwgYm9vbGVhbikiLz4KKyAgICAgICAgICAgIDwvbWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgIDwvZmlsdGVyPgorICAgICAgICA8ZmlsdGVyIGNvbW1lbnQ9IkRvbid0IGNhcmUgYWJvdXQgbm9uLUFQSSBpbiB0ZXN0cy4iIGlkPSI2NDM4NDIwNjQiPgorICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJGaWxlUmVwb3NpdG9yeSIvPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJMb2NhbERpc2tSZXBvc2l0b3J5VGVzdENhc2UiLz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iY3JlYXRlV29ya1JlcG9zaXRvcnkoKSIvPgorICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgPC9maWx0ZXI+CisgICAgPC9yZXNvdXJjZT4KKyAgICA8cmVzb3VyY2UgcGF0aD0ic3JjL29yZy9lY2xpcHNlL2pnaXQvanVuaXQvUmVwb3NpdG9yeVRlc3RDYXNlLmphdmEiIHR5cGU9Im9yZy5lY2xpcHNlLmpnaXQuanVuaXQuUmVwb3NpdG9yeVRlc3RDYXNlIj4KKyAgICAgICAgPGZpbHRlciBjb21tZW50PSJEb24ndCBjYXJlIGFib3V0IG5vbi1BUEkgaW4gdGVzdHMuIiBpZD0iNjI3MDYwNzUxIj4KKyAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iRmlsZVJlcG9zaXRvcnkiLz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iUmVwb3NpdG9yeVRlc3RDYXNlIi8+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9ImRiIi8+CisgICAgICAgICAgICA8L21lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICA8L2ZpbHRlcj4KKyAgICA8L3Jlc291cmNlPgorPC9jb21wb25lbnQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9NRVRBLUlORi9NQU5JRkVTVC5NRgppbmRleCBmOWUxMmQ1Li43NDlmOGZlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L01FVEEtSU5GL01BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTMsMzEgKzMsMzEgQEAKIEJ1bmRsZS1OYW1lOiAlcGx1Z2luX25hbWUKIEF1dG9tYXRpYy1Nb2R1bGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC5qdW5pdAogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamdpdC5qdW5pdAotQnVuZGxlLVZlcnNpb246IDQuMTEuOC5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiA1LjAuNC5xdWFsaWZpZXIKIEJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgogQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyX25hbWUKIEJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CiBCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSmF2YVNFLTEuOAotSW1wb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQuYXBpO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5kaXJjYWNoZTt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucGFjazt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5tZXJnZTt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsazt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsLnRpbWU7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKK0ltcG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0LmFwaTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5kaXJjYWNoZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmVycm9yczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucGFjazt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmxpYjt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lm1lcmdlO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuaW87dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsLnRpbWU7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCiAgb3JnLmp1bml0O3ZlcnNpb249Ils0LjEyLDUuMC4wKSIsCiAgb3JnLmp1bml0LnJ1bGVzO3ZlcnNpb249Ils0LjEyLDUuMC4wKSIsCiAgb3JnLmp1bml0LnJ1bm5lcjt2ZXJzaW9uPSJbNC4xMiw1LjAuMCkiLAogIG9yZy5qdW5pdC5ydW5uZXJzLm1vZGVsO3ZlcnNpb249Ils0LjEyLDUuMC4wKSIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0O3ZlcnNpb249IjQuMTEuOCI7CitFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5qdW5pdDt2ZXJzaW9uPSI1LjAuNCI7CiAgIHVzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LmRpcmNhY2hlLAogICAgb3JnLmVjbGlwc2UuamdpdC5saWIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGssCkBAIC0zNiw0ICszNiw0IEBACiAgICBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZSwKICAgIG9yZy5lY2xpcHNlLmpnaXQuYXBpIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LnRpbWU7dmVyc2lvbj0iNC4xMS44IgorIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQudGltZTt2ZXJzaW9uPSI1LjAuNCIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvcG9tLnhtbAppbmRleCBkMjUxYjk3Li4zMGNlMGIzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9wb20ueG1sCkBAIC01Miw3ICs1Miw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj40LjExLjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+NS4wLjQtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQuanVuaXQ8L2FydGlmYWN0SWQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L0pHaXRUZXN0VXRpbC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9KR2l0VGVzdFV0aWwuamF2YQppbmRleCBjZWY4MWEwLi5hMTAyZGExIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L0pHaXRUZXN0VXRpbC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvanVuaXQvSkdpdFRlc3RVdGlsLmphdmEKQEAgLTQ1LDcgKzQ1LDcgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0OwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CkBAIC0xNDIsNyArMTQyLDcgQEAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHMoYnl0ZVtdIHJhdykgewogCSAqIEBwYXJhbSBmaWxlTmFtZQogCSAqIEByZXR1cm4gdGhlIHRlc3QgcmVzb3VyY2UgZmlsZQogCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSBnZXRUZXN0UmVzb3VyY2VGaWxlKGZpbmFsIFN0cmluZyBmaWxlTmFtZSkgeworCXB1YmxpYyBzdGF0aWMgRmlsZSBnZXRUZXN0UmVzb3VyY2VGaWxlKFN0cmluZyBmaWxlTmFtZSkgewogCQlpZiAoZmlsZU5hbWUgPT0gbnVsbCB8fCBmaWxlTmFtZS5sZW5ndGgoKSA8PSAwKSB7CiAJCQlyZXR1cm4gbnVsbDsKIAkJfQpAQCAtMjQyLDExICsyNDIsMTEgQEAgcHVibGljIHN0YXRpYyBGaWxlIHdyaXRlVHJhc2hGaWxlKGZpbmFsIFJlcG9zaXRvcnkgZGIsCiAJICogQHRocm93cyBJT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHRoZSBmaWxlIGNvdWxkIG5vdCBiZSB3cml0dGVuLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZShmaW5hbCBGaWxlIGYsIGZpbmFsIFN0cmluZyBib2R5KQorCXB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZShGaWxlIGYsIFN0cmluZyBib2R5KQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJRmlsZVV0aWxzLm1rZGlycyhmLmdldFBhcmVudEZpbGUoKSwgdHJ1ZSk7CiAJCXRyeSAoV3JpdGVyIHcgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGYpLAotCQkJCVVURl84KSkgeworCQkJCUNIQVJTRVQpKSB7CiAJCQl3LndyaXRlKGJvZHkpOwogCQl9CiAJfQpAQCAtMjYxLDkgKzI2MSw5IEBAIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZShmaW5hbCBGaWxlIGYsIGZpbmFsIFN0cmluZyBib2R5KQogCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCwgb3IgY291bGQgbm90IGJlIHJlYWQuCiAJICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVhZChmaW5hbCBGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgcmVhZChGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIGJ5dGVbXSBib2R5ID0gSU8ucmVhZEZ1bGx5KGZpbGUpOwotCQlyZXR1cm4gbmV3IFN0cmluZyhib2R5LCAwLCBib2R5Lmxlbmd0aCwgVVRGXzgpOworCQlyZXR1cm4gbmV3IFN0cmluZyhib2R5LCAwLCBib2R5Lmxlbmd0aCwgQ0hBUlNFVCk7CiAJfQogCiAJLyoqCkBAIC0yNzQsNyArMjc0LDcgQEAgcHVibGljIHN0YXRpYyBTdHJpbmcgcmVhZChmaW5hbCBGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJICogQHJldHVybiB0aGUgY29udGVudCBvZiB0aGUgZmlsZQogCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KIAkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZWFkKGZpbmFsIFJlcG9zaXRvcnkgZGIsIGZpbmFsIFN0cmluZyBuYW1lKQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlYWQoUmVwb3NpdG9yeSBkYiwgU3RyaW5nIG5hbWUpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShkYi5nZXRXb3JrVHJlZSgpLCBuYW1lKTsKIAkJcmV0dXJuIHJlYWQoZmlsZSk7CkBAIC0yODgsNyArMjg4LDcgQEAgcHVibGljIHN0YXRpYyBTdHJpbmcgcmVhZChmaW5hbCBSZXBvc2l0b3J5IGRiLCBmaW5hbCBTdHJpbmcgbmFtZSkKIAkgKiAgICAgICAgICAgIG5hbWUgb2YgdGhlIGZpbGUKIAkgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgZmlsZSBleGlzdHMKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2hlY2soZmluYWwgUmVwb3NpdG9yeSBkYiwgZmluYWwgU3RyaW5nIG5hbWUpIHsKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2hlY2soUmVwb3NpdG9yeSBkYiwgU3RyaW5nIG5hbWUpIHsKIAkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZGIuZ2V0V29ya1RyZWUoKSwgbmFtZSk7CiAJCXJldHVybiBmaWxlLmV4aXN0cygpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvanVuaXQvTG9jYWxEaXNrUmVwb3NpdG9yeVRlc3RDYXNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L0xvY2FsRGlza1JlcG9zaXRvcnlUZXN0Q2FzZS5qYXZhCmluZGV4IDU2OGJjM2IuLjZjZGQwZWIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvanVuaXQvTG9jYWxEaXNrUmVwb3NpdG9yeVRlc3RDYXNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9Mb2NhbERpc2tSZXBvc2l0b3J5VGVzdENhc2UuamF2YQpAQCAtNDUsNyArNDUsNyBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQ7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwogCkBAIC0yMjUsNyArMjI1LDcgQEAgcHJvdGVjdGVkIHZvaWQgdGljaygpIHsKIAkgKiBAcGFyYW0gZGlyCiAJICogICAgICAgICAgICB0aGUgcmVjdXJzaXZlbHkgZGlyZWN0b3J5IHRvIGRlbGV0ZSwgaWYgcHJlc2VudC4KIAkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWN1cnNpdmVEZWxldGUoZmluYWwgRmlsZSBkaXIpIHsKKwlwcm90ZWN0ZWQgdm9pZCByZWN1cnNpdmVEZWxldGUoRmlsZSBkaXIpIHsKIAkJcmVjdXJzaXZlRGVsZXRlKGRpciwgZmFsc2UsIHRydWUpOwogCX0KIApAQCAtMzUyLDcgKzM1Miw3IEBAIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGluZGV4U3RhdGUoUmVwb3NpdG9yeSByZXBvLCBpbnQgaW5jbHVkZWRPcHRpb25zKQogCQkJaWYgKDAgIT0gKGluY2x1ZGVkT3B0aW9ucyAmIENPTlRFTlQpKSB7CiAJCQkJc2IuYXBwZW5kKCIsIGNvbnRlbnQ6IgogCQkJCQkJKyBuZXcgU3RyaW5nKHJlcG8ub3BlbihlbnRyeS5nZXRPYmplY3RJZCgpLAotCQkJCQkJQ29uc3RhbnRzLk9CSl9CTE9CKS5nZXRDYWNoZWRCeXRlcygpLCBVVEZfOCkpOworCQkJCQkJQ29uc3RhbnRzLk9CSl9CTE9CKS5nZXRDYWNoZWRCeXRlcygpLCBDSEFSU0VUKSk7CiAJCQl9CiAJCQlpZiAoMCAhPSAoaW5jbHVkZWRPcHRpb25zICYgQVNTVU1FX1VOQ0hBTkdFRCkpCiAJCQkJc2IuYXBwZW5kKCIsIGFzc3VtZS11bmNoYW5nZWQ6IgpAQCAtNTQwLDcgKzU0MCw3IEBAIHByaXZhdGUgc3RhdGljIHZvaWQgcHV0UGVyc29uSWRlbnQoZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBlbnYsCiAJICogQHRocm93cyBJT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHRoZSBmaWxlIGNvdWxkIG5vdCBiZSB3cml0dGVuLgogCSAqLwotCXByb3RlY3RlZCBGaWxlIHdyaXRlKGZpbmFsIFN0cmluZyBib2R5KSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByb3RlY3RlZCBGaWxlIHdyaXRlKFN0cmluZyBib2R5KSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBGaWxlIGYgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJ0ZW1wIiwgInR4dCIsIHRtcCk7CiAJCXRyeSB7CiAJCQl3cml0ZShmLCBib2R5KTsKQEAgLTU3MSw3ICs1NzEsNyBAQCBwcm90ZWN0ZWQgRmlsZSB3cml0ZShmaW5hbCBTdHJpbmcgYm9keSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgdGhlIGZpbGUgY291bGQgbm90IGJlIHdyaXR0ZW4uCiAJICovCi0JcHJvdGVjdGVkIHZvaWQgd3JpdGUoZmluYWwgRmlsZSBmLCBmaW5hbCBTdHJpbmcgYm9keSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwcm90ZWN0ZWQgdm9pZCB3cml0ZShGaWxlIGYsIFN0cmluZyBib2R5KSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlKR2l0VGVzdFV0aWwud3JpdGUoZiwgYm9keSk7CiAJfQogCkBAIC01ODMsMTEgKzU4MywxMSBAQCBwcm90ZWN0ZWQgdm9pZCB3cml0ZShmaW5hbCBGaWxlIGYsIGZpbmFsIFN0cmluZyBib2R5KSB0aHJvd3MgSU9FeGNlcHRpb24gewogCSAqIEByZXR1cm4gdGhlIGNvbnRlbnQgb2YgdGhlIGZpbGUKIAkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAJICovCi0JcHJvdGVjdGVkIFN0cmluZyByZWFkKGZpbmFsIEZpbGUgZikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwcm90ZWN0ZWQgU3RyaW5nIHJlYWQoRmlsZSBmKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlyZXR1cm4gSkdpdFRlc3RVdGlsLnJlYWQoZik7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gdG9FbnZBcnJheShmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IGVudikgeworCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHRvRW52QXJyYXkoTWFwPFN0cmluZywgU3RyaW5nPiBlbnYpIHsKIAkJZmluYWwgU3RyaW5nW10gZW52cCA9IG5ldyBTdHJpbmdbZW52LnNpemUoKV07CiAJCWludCBpID0gMDsKIAkJZm9yIChNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+IGUgOiBlbnYuZW50cnlTZXQoKSkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvanVuaXQvTW9ja1N5c3RlbVJlYWRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9Nb2NrU3lzdGVtUmVhZGVyLmphdmEKaW5kZXggMDVkMTUyMi4uZDNkN2Q2OCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9Nb2NrU3lzdGVtUmVhZGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9Nb2NrU3lzdGVtUmVhZGVyLmphdmEKQEAgLTEwOSw3ICsxMDksNyBAQCBwdWJsaWMgTW9ja1N5c3RlbVJlYWRlcigpIHsKIAkJc2V0Q3VycmVudFBsYXRmb3JtKCk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGluaXQoZmluYWwgU3RyaW5nIG4pIHsKKwlwcml2YXRlIHZvaWQgaW5pdChTdHJpbmcgbikgewogCQlzZXRQcm9wZXJ0eShuLCBuKTsKIAl9CiAKQEAgLTE5Nyw3ICsxOTcsNyBAQCBwdWJsaWMgdm9pZCBibG9ja1VudGlsKER1cmF0aW9uIG1heFdhaXQpIHsKIAkgKiAgICAgICAgICAgIG51bWJlciBvZiBzZWNvbmRzIHRvIGFkZCB0byB0aGUgY3VycmVudCB0aW1lLgogCSAqIEBzaW5jZSA0LjIKIAkgKi8KLQlwdWJsaWMgdm9pZCB0aWNrKGZpbmFsIGludCBzZWNEZWx0YSkgeworCXB1YmxpYyB2b2lkIHRpY2soaW50IHNlY0RlbHRhKSB7CiAJCW5vdyArPSBzZWNEZWx0YSAqIDEwMDBMOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9SZXBvc2l0b3J5VGVzdENhc2UuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvanVuaXQvUmVwb3NpdG9yeVRlc3RDYXNlLmphdmEKaW5kZXggYWZjMmM0NC4uZTk4M2U1ZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9SZXBvc2l0b3J5VGVzdENhc2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L1JlcG9zaXRvcnlUZXN0Q2FzZS5qYXZhCkBAIC00Niw3ICs0Niw3IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5qdW5pdDsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKQEAgLTkyLDIyICs5MiwxNSBAQCBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmVwb3NpdG9yeVRlc3RDYXNlIGV4dGVuZHMgTG9jYWxEaXNrUmVwb3NpdG9yeVRlc3RDYXNlIHsKIAkgKiBAcGFyYW0gZHN0CiAJICogQHRocm93cyBJT0V4Y2VwdGlvbgogCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBjb3B5RmlsZShmaW5hbCBGaWxlIHNyYywgZmluYWwgRmlsZSBkc3QpCisJcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGNvcHlGaWxlKEZpbGUgc3JjLCBGaWxlIGRzdCkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZpbmFsIEZpbGVJbnB1dFN0cmVhbSBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHNyYyk7Ci0JCXRyeSB7Ci0JCQlmaW5hbCBGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGRzdCk7Ci0JCQl0cnkgewotCQkJCWZpbmFsIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVs0MDk2XTsKLQkJCQlpbnQgcjsKLQkJCQl3aGlsZSAoKHIgPSBmaXMucmVhZChidWYpKSA+IDApIHsKLQkJCQkJZm9zLndyaXRlKGJ1ZiwgMCwgcik7Ci0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQlmb3MuY2xvc2UoKTsKKwkJdHJ5IChGaWxlSW5wdXRTdHJlYW0gZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShzcmMpOworCQkJCUZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZHN0KSkgeworCQkJZmluYWwgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzQwOTZdOworCQkJaW50IHI7CisJCQl3aGlsZSAoKHIgPSBmaXMucmVhZChidWYpKSA+IDApIHsKKwkJCQlmb3Mud3JpdGUoYnVmLCAwLCByKTsKIAkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWZpcy5jbG9zZSgpOwogCQl9CiAJfQogCkBAIC0xMTksNyArMTEyLDcgQEAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGNvcHlGaWxlKGZpbmFsIEZpbGUgc3JjLCBmaW5hbCBGaWxlIGRzdCkKIAkgKiBAcmV0dXJuIHRoZSB0cmFzaCBmaWxlCiAJICogQHRocm93cyBJT0V4Y2VwdGlvbgogCSAqLwotCXByb3RlY3RlZCBGaWxlIHdyaXRlVHJhc2hGaWxlKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBTdHJpbmcgZGF0YSkKKwlwcm90ZWN0ZWQgRmlsZSB3cml0ZVRyYXNoRmlsZShTdHJpbmcgbmFtZSwgU3RyaW5nIGRhdGEpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlyZXR1cm4gSkdpdFRlc3RVdGlsLndyaXRlVHJhc2hGaWxlKGRiLCBuYW1lLCBkYXRhKTsKIAl9CkBAIC0xMzUsNyArMTI4LDcgQEAgcHJvdGVjdGVkIEZpbGUgd3JpdGVUcmFzaEZpbGUoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIFN0cmluZyBkYXRhKQogCSAqIEB0aHJvd3MgRXhjZXB0aW9uCiAJICogQHNpbmNlIDQuMgogCSAqLwotCXByb3RlY3RlZCBQYXRoIHdyaXRlTGluayhmaW5hbCBTdHJpbmcgbGluaywgZmluYWwgU3RyaW5nIHRhcmdldCkKKwlwcm90ZWN0ZWQgUGF0aCB3cml0ZUxpbmsoU3RyaW5nIGxpbmssIFN0cmluZyB0YXJnZXQpCiAJCQl0aHJvd3MgRXhjZXB0aW9uIHsKIAkJcmV0dXJuIEpHaXRUZXN0VXRpbC53cml0ZUxpbmsoZGIsIGxpbmssIHRhcmdldCk7CiAJfQpAQCAtMTYyLDcgKzE1NSw3IEBAIHByb3RlY3RlZCBGaWxlIHdyaXRlVHJhc2hGaWxlKGZpbmFsIFN0cmluZyBzdWJkaXIsIGZpbmFsIFN0cmluZyBuYW1lLAogCSAqIEByZXR1cm4gdGhlIGZpbGUncyBjb250ZW50CiAJICogQHRocm93cyBJT0V4Y2VwdGlvbgogCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcmVhZChmaW5hbCBTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwcm90ZWN0ZWQgU3RyaW5nIHJlYWQoU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXJldHVybiBKR2l0VGVzdFV0aWwucmVhZChkYiwgbmFtZSk7CiAJfQogCkBAIC0xNzMsNyArMTY2LDcgQEAgcHJvdGVjdGVkIFN0cmluZyByZWFkKGZpbmFsIFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCSAqICAgICAgICAgICAgZmlsZSBuYW1lCiAJICogQHJldHVybiBpZiB0aGUgZmlsZSBleGlzdHMKIAkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGVjayhmaW5hbCBTdHJpbmcgbmFtZSkgeworCXByb3RlY3RlZCBib29sZWFuIGNoZWNrKFN0cmluZyBuYW1lKSB7CiAJCXJldHVybiBKR2l0VGVzdFV0aWwuY2hlY2soZGIsIG5hbWUpOwogCX0KIApAQCAtMTg0LDcgKzE3Nyw3IEBAIHByb3RlY3RlZCBib29sZWFuIGNoZWNrKGZpbmFsIFN0cmluZyBuYW1lKSB7CiAJICogICAgICAgICAgICBmaWxlIG5hbWUKIAkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAJICovCi0JcHJvdGVjdGVkIHZvaWQgZGVsZXRlVHJhc2hGaWxlKGZpbmFsIFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByb3RlY3RlZCB2b2lkIGRlbGV0ZVRyYXNoRmlsZShTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJSkdpdFRlc3RVdGlsLmRlbGV0ZVRyYXNoRmlsZShkYiwgbmFtZSk7CiAJfQogCkBAIC0xOTYsMTAgKzE4OSwxMCBAQCBwcm90ZWN0ZWQgdm9pZCBkZWxldGVUcmFzaEZpbGUoZmluYWwgU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJICogICAgICAgICAgICBleHBlY3RlZCBjb250ZW50CiAJICogQHRocm93cyBJT0V4Y2VwdGlvbgogCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBjaGVja0ZpbGUoRmlsZSBmLCBmaW5hbCBTdHJpbmcgY2hlY2tEYXRhKQorCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBjaGVja0ZpbGUoRmlsZSBmLCBTdHJpbmcgY2hlY2tEYXRhKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJdHJ5IChSZWFkZXIgciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihuZXcgRmlsZUlucHV0U3RyZWFtKGYpLAotCQkJCVVURl84KSkgeworCQkJCUNIQVJTRVQpKSB7CiAJCQlpZiAoY2hlY2tEYXRhLmxlbmd0aCgpID4gMCkgewogCQkJCWNoYXJbXSBkYXRhID0gbmV3IGNoYXJbY2hlY2tEYXRhLmxlbmd0aCgpXTsKIAkJCQlhc3NlcnRFcXVhbHMoZGF0YS5sZW5ndGgsIHIucmVhZChkYXRhKSk7CkBAIC0yOTMsMTAgKzI4NiwxMSBAQCBwcm90ZWN0ZWQgdm9pZCByZXNldEluZGV4KEZpbGVUcmVlSXRlcmF0b3IgdHJlZUl0cikKIAkJCQlkY2Uuc2V0RmlsZU1vZGUodHJlZUl0ci5nZXRFbnRyeUZpbGVNb2RlKCkpOwogCQkJCWRjZS5zZXRMYXN0TW9kaWZpZWQodHJlZUl0ci5nZXRFbnRyeUxhc3RNb2RpZmllZCgpKTsKIAkJCQlkY2Uuc2V0TGVuZ3RoKChpbnQpIGxlbik7Ci0JCQkJRmlsZUlucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbSgKLQkJCQkJCXRyZWVJdHIuZ2V0RW50cnlGaWxlKCkpOwotCQkJCWRjZS5zZXRPYmplY3RJZChpbnNlcnRlci5pbnNlcnQoQ29uc3RhbnRzLk9CSl9CTE9CLCBsZW4sIGluKSk7Ci0JCQkJaW4uY2xvc2UoKTsKKwkJCQl0cnkgKEZpbGVJbnB1dFN0cmVhbSBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oCisJCQkJCQl0cmVlSXRyLmdldEVudHJ5RmlsZSgpKSkgeworCQkJCQlkY2Uuc2V0T2JqZWN0SWQoCisJCQkJCQkJaW5zZXJ0ZXIuaW5zZXJ0KENvbnN0YW50cy5PQkpfQkxPQiwgbGVuLCBpbikpOworCQkJCX0KIAkJCQlidWlsZGVyLmFkZChkY2UpOwogCQkJCXRyZWVJdHIubmV4dCgxKTsKIAkJCX0KQEAgLTM4MCw4ICszNzQsOSBAQCBwdWJsaWMgc3RhdGljIGxvbmcgZnNUaWNrKEZpbGUgbGFzdEZpbGUpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwKIAkJCXdoaWxlIChhY3RUaW1lIDw9IHN0YXJ0VGltZSkgewogCQkJCVRocmVhZC5zbGVlcChzbGVlcFRpbWUpOwogCQkJCXNsZWVwVGltZSAqPSAyOwotCQkJCUZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odG1wKTsKLQkJCQlmb3MuY2xvc2UoKTsKKwkJCQl0cnkgKEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odG1wKSkgeworCQkJCQkvLyBEbyBub3RoaW5nCisJCQkJfQogCQkJCWFjdFRpbWUgPSBmcy5sYXN0TW9kaWZpZWQodG1wKTsKIAkJCX0KIAkJCXJldHVybiBhY3RUaW1lOwpAQCAtNTA1LDcgKzUwMCw3IEBAIGVsc2UgaWYgKGVtcHR5KQogCSAqIEBwYXJhbSBtb2RlCiAJICogQHJldHVybiB0aGUgRGlyQ2FjaGVFbnRyeQogCSAqLwotCXByb3RlY3RlZCBEaXJDYWNoZUVudHJ5IGNyZWF0ZUVudHJ5KGZpbmFsIFN0cmluZyBwYXRoLCBmaW5hbCBGaWxlTW9kZSBtb2RlKSB7CisJcHJvdGVjdGVkIERpckNhY2hlRW50cnkgY3JlYXRlRW50cnkoU3RyaW5nIHBhdGgsIEZpbGVNb2RlIG1vZGUpIHsKIAkJcmV0dXJuIGNyZWF0ZUVudHJ5KHBhdGgsIG1vZGUsIERpckNhY2hlRW50cnkuU1RBR0VfMCwgcGF0aCk7CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L1Rlc3RSZXBvc2l0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L1Rlc3RSZXBvc2l0b3J5LmphdmEKaW5kZXggNDE2MzRlNy4uZDIzYzBkMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9UZXN0UmVwb3NpdG9yeS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvanVuaXQvVGVzdFJlcG9zaXRvcnkuamF2YQpAQCAtNDMsNyArNDMsNyBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQ7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKIApAQCAtMjQ0LDcgKzI0NCw3IEBAIHB1YmxpYyBUaW1lWm9uZSBnZXRUaW1lWm9uZSgpIHsKIAkgKiBAcGFyYW0gc2VjRGVsdGEKIAkgKiAgICAgICAgICAgIG51bWJlciBvZiBzZWNvbmRzIHRvIGFkZCB0byB0aGUgY3VycmVudCB0aW1lLgogCSAqLwotCXB1YmxpYyB2b2lkIHRpY2soZmluYWwgaW50IHNlY0RlbHRhKSB7CisJcHVibGljIHZvaWQgdGljayhpbnQgc2VjRGVsdGEpIHsKIAkJbW9ja1N5c3RlbVJlYWRlci50aWNrKHNlY0RlbHRhKTsKIAl9CiAKQEAgLTI2Nyw4ICsyNjcsOCBAQCBwdWJsaWMgdm9pZCBzZXRBdXRob3JBbmRDb21taXR0ZXIob3JnLmVjbGlwc2UuamdpdC5saWIuQ29tbWl0QnVpbGRlciBjKSB7CiAJICogQHJldHVybiByZWZlcmVuY2UgdG8gdGhlIGJsb2IuCiAJICogQHRocm93cyBFeGNlcHRpb24KIAkgKi8KLQlwdWJsaWMgUmV2QmxvYiBibG9iKGZpbmFsIFN0cmluZyBjb250ZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGJsb2IoY29udGVudC5nZXRCeXRlcyhVVEZfOCkpOworCXB1YmxpYyBSZXZCbG9iIGJsb2IoU3RyaW5nIGNvbnRlbnQpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gYmxvYihjb250ZW50LmdldEJ5dGVzKENIQVJTRVQpKTsKIAl9CiAKIAkvKioKQEAgLTI3OSw3ICsyNzksNyBAQCBwdWJsaWMgUmV2QmxvYiBibG9iKGZpbmFsIFN0cmluZyBjb250ZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkgKiBAcmV0dXJuIHJlZmVyZW5jZSB0byB0aGUgYmxvYi4KIAkgKiBAdGhyb3dzIEV4Y2VwdGlvbgogCSAqLwotCXB1YmxpYyBSZXZCbG9iIGJsb2IoZmluYWwgYnl0ZVtdIGNvbnRlbnQpIHRocm93cyBFeGNlcHRpb24geworCXB1YmxpYyBSZXZCbG9iIGJsb2IoYnl0ZVtdIGNvbnRlbnQpIHRocm93cyBFeGNlcHRpb24gewogCQlPYmplY3RJZCBpZDsKIAkJdHJ5IChPYmplY3RJbnNlcnRlciBpbnMgPSBpbnNlcnRlcikgewogCQkJaWQgPSBpbnMuaW5zZXJ0KENvbnN0YW50cy5PQkpfQkxPQiwgY29udGVudCk7CkBAIC0yOTgsNyArMjk4LDcgQEAgcHVibGljIFJldkJsb2IgYmxvYihmaW5hbCBieXRlW10gY29udGVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJICogQHJldHVybiB0aGUgZW50cnkuCiAJICogQHRocm93cyBFeGNlcHRpb24KIAkgKi8KLQlwdWJsaWMgRGlyQ2FjaGVFbnRyeSBmaWxlKGZpbmFsIFN0cmluZyBwYXRoLCBmaW5hbCBSZXZCbG9iIGJsb2IpCisJcHVibGljIERpckNhY2hlRW50cnkgZmlsZShTdHJpbmcgcGF0aCwgUmV2QmxvYiBibG9iKQogCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWZpbmFsIERpckNhY2hlRW50cnkgZSA9IG5ldyBEaXJDYWNoZUVudHJ5KHBhdGgpOwogCQllLnNldEZpbGVNb2RlKEZpbGVNb2RlLlJFR1VMQVJfRklMRSk7CkBAIC0zMTUsMTAgKzMxNSwxMCBAQCBwdWJsaWMgRGlyQ2FjaGVFbnRyeSBmaWxlKGZpbmFsIFN0cmluZyBwYXRoLCBmaW5hbCBSZXZCbG9iIGJsb2IpCiAJICogQHJldHVybiByZWZlcmVuY2UgdG8gdGhlIHRyZWUgc3BlY2lmaWVkIGJ5IHRoZSBlbnRyeSBsaXN0LgogCSAqIEB0aHJvd3MgRXhjZXB0aW9uCiAJICovCi0JcHVibGljIFJldlRyZWUgdHJlZShmaW5hbCBEaXJDYWNoZUVudHJ5Li4uIGVudHJpZXMpIHRocm93cyBFeGNlcHRpb24geworCXB1YmxpYyBSZXZUcmVlIHRyZWUoRGlyQ2FjaGVFbnRyeS4uLiBlbnRyaWVzKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJZmluYWwgRGlyQ2FjaGUgZGMgPSBEaXJDYWNoZS5uZXdJbkNvcmUoKTsKIAkJZmluYWwgRGlyQ2FjaGVCdWlsZGVyIGIgPSBkYy5idWlsZGVyKCk7Ci0JCWZvciAoZmluYWwgRGlyQ2FjaGVFbnRyeSBlIDogZW50cmllcykKKwkJZm9yIChEaXJDYWNoZUVudHJ5IGUgOiBlbnRyaWVzKQogCQkJYi5hZGQoZSk7CiAJCWIuZmluaXNoKCk7CiAJCU9iamVjdElkIHJvb3Q7CkBAIC0zMzksNyArMzM5LDcgQEAgcHVibGljIFJldlRyZWUgdHJlZShmaW5hbCBEaXJDYWNoZUVudHJ5Li4uIGVudHJpZXMpIHRocm93cyBFeGNlcHRpb24gewogCSAqIEByZXR1cm4gdGhlIHBhcnNlZCBvYmplY3QgZW50cnkgYXQgdGhpcyBwYXRoLCBuZXZlciBudWxsLgogCSAqIEB0aHJvd3MgRXhjZXB0aW9uCiAJICovCi0JcHVibGljIFJldk9iamVjdCBnZXQoZmluYWwgUmV2VHJlZSB0cmVlLCBmaW5hbCBTdHJpbmcgcGF0aCkKKwlwdWJsaWMgUmV2T2JqZWN0IGdldChSZXZUcmVlIHRyZWUsIFN0cmluZyBwYXRoKQogCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXRyeSAoVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsocG9vbC5nZXRPYmplY3RSZWFkZXIoKSkpIHsKIAkJCXR3LnNldEZpbHRlcihQYXRoRmlsdGVyR3JvdXAuY3JlYXRlRnJvbVN0cmluZ3MoQ29sbGVjdGlvbnMKQEAgLTM3MCw3ICszNzAsNyBAQCBwdWJsaWMgUmV2T2JqZWN0IGdldChmaW5hbCBSZXZUcmVlIHRyZWUsIGZpbmFsIFN0cmluZyBwYXRoKQogCSAqIEByZXR1cm4gdGhlIG5ldyBjb21taXQuCiAJICogQHRocm93cyBFeGNlcHRpb24KIAkgKi8KLQlwdWJsaWMgUmV2Q29tbWl0IGNvbW1pdChmaW5hbCBSZXZDb21taXQuLi4gcGFyZW50cykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHVibGljIFJldkNvbW1pdCBjb21taXQoUmV2Q29tbWl0Li4uIHBhcmVudHMpIHRocm93cyBFeGNlcHRpb24gewogCQlyZXR1cm4gY29tbWl0KDEsIHRyZWUoKSwgcGFyZW50cyk7CiAJfQogCkBAIC0zODYsNyArMzg2LDcgQEAgcHVibGljIFJldkNvbW1pdCBjb21taXQoZmluYWwgUmV2Q29tbWl0Li4uIHBhcmVudHMpIHRocm93cyBFeGNlcHRpb24gewogCSAqIEByZXR1cm4gdGhlIG5ldyBjb21taXQuCiAJICogQHRocm93cyBFeGNlcHRpb24KIAkgKi8KLQlwdWJsaWMgUmV2Q29tbWl0IGNvbW1pdChmaW5hbCBSZXZUcmVlIHRyZWUsIGZpbmFsIFJldkNvbW1pdC4uLiBwYXJlbnRzKQorCXB1YmxpYyBSZXZDb21taXQgY29tbWl0KFJldlRyZWUgdHJlZSwgUmV2Q29tbWl0Li4uIHBhcmVudHMpCiAJCQl0aHJvd3MgRXhjZXB0aW9uIHsKIAkJcmV0dXJuIGNvbW1pdCgxLCB0cmVlLCBwYXJlbnRzKTsKIAl9CkBAIC00MDQsNyArNDA0LDcgQEAgcHVibGljIFJldkNvbW1pdCBjb21taXQoZmluYWwgUmV2VHJlZSB0cmVlLCBmaW5hbCBSZXZDb21taXQuLi4gcGFyZW50cykKIAkgKiBAcmV0dXJuIHRoZSBuZXcgY29tbWl0LgogCSAqIEB0aHJvd3MgRXhjZXB0aW9uCiAJICovCi0JcHVibGljIFJldkNvbW1pdCBjb21taXQoZmluYWwgaW50IHNlY0RlbHRhLCBmaW5hbCBSZXZDb21taXQuLi4gcGFyZW50cykKKwlwdWJsaWMgUmV2Q29tbWl0IGNvbW1pdChpbnQgc2VjRGVsdGEsIFJldkNvbW1pdC4uLiBwYXJlbnRzKQogCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXJldHVybiBjb21taXQoc2VjRGVsdGEsIHRyZWUoKSwgcGFyZW50cyk7CiAJfQpAQCAtNDcwLDcgKzQ3MCw3IEBAIHB1YmxpYyBDb21taXRCdWlsZGVyIGNvbW1pdCgpIHsKIAkgKiBAcmV0dXJuIHRoZSBhbm5vdGF0ZWQgdGFnIG9iamVjdC4KIAkgKiBAdGhyb3dzIEV4Y2VwdGlvbgogCSAqLwotCXB1YmxpYyBSZXZUYWcgdGFnKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBSZXZPYmplY3QgZHN0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwdWJsaWMgUmV2VGFnIHRhZyhTdHJpbmcgbmFtZSwgUmV2T2JqZWN0IGRzdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWZpbmFsIFRhZ0J1aWxkZXIgdCA9IG5ldyBUYWdCdWlsZGVyKCk7CiAJCXQuc2V0T2JqZWN0SWQoZHN0KTsKIAkJdC5zZXRUYWcobmFtZSk7CkBAIC03NTksNyArNzU5LDcgQEAgcHVibGljIHZvaWQgdXBkYXRlU2VydmVySW5mbygpIHRocm93cyBFeGNlcHRpb24gewogCQkJZmluYWwgRmlsZVJlcG9zaXRvcnkgZnIgPSAoRmlsZVJlcG9zaXRvcnkpIGRiOwogCQkJUmVmV3JpdGVyIHJ3ID0gbmV3IFJlZldyaXRlcihmci5nZXRBbGxSZWZzKCkudmFsdWVzKCkpIHsKIAkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCB3cml0ZUZpbGUoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIGJ5dGVbXSBiaW4pCisJCQkJcHJvdGVjdGVkIHZvaWQgd3JpdGVGaWxlKFN0cmluZyBuYW1lLCBieXRlW10gYmluKQogCQkJCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCQkJRmlsZSBwYXRoID0gbmV3IEZpbGUoZnIuZ2V0RGlyZWN0b3J5KCksIG5hbWUpOwogCQkJCQlUZXN0UmVwb3NpdG9yeS50aGlzLndyaXRlRmlsZShwYXRoLCBiaW4pOwpAQCAtNzkxLDcgKzc5MSw3IEBAIHByb3RlY3RlZCB2b2lkIHdyaXRlRmlsZShmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgYnl0ZVtdIGJpbikKIAkgKiBAcmV0dXJuIHtAY29kZSBvYmplY3R9CiAJICogQHRocm93cyBFeGNlcHRpb24KIAkgKi8KLQlwdWJsaWMgPFQgZXh0ZW5kcyBSZXZPYmplY3Q+IFQgcGFyc2VCb2R5KGZpbmFsIFQgb2JqZWN0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwdWJsaWMgPFQgZXh0ZW5kcyBSZXZPYmplY3Q+IFQgcGFyc2VCb2R5KFQgb2JqZWN0KSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJcG9vbC5wYXJzZUJvZHkob2JqZWN0KTsKIAkJcmV0dXJuIG9iamVjdDsKIAl9CkBAIC05NDQsNyArOTQ0LDcgQEAgcHJpdmF0ZSBzdGF0aWMgRmlsZSBuYW1lRm9yKE9iamVjdERpcmVjdG9yeSBvZGIsIE9iamVjdElkIG5hbWUsIFN0cmluZyB0KSB7CiAJCXJldHVybiBuZXcgRmlsZShwYWNrZGlyLCAicGFjay0iICsgbmFtZS5uYW1lKCkgKyB0KTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgd3JpdGVGaWxlKGZpbmFsIEZpbGUgcCwgZmluYWwgYnl0ZVtdIGJpbikgdGhyb3dzIElPRXhjZXB0aW9uLAorCXByaXZhdGUgdm9pZCB3cml0ZUZpbGUoRmlsZSBwLCBieXRlW10gYmluKSB0aHJvd3MgSU9FeGNlcHRpb24sCiAJCQlPYmplY3RXcml0aW5nRXhjZXB0aW9uIHsKIAkJZmluYWwgTG9ja0ZpbGUgbGNrID0gbmV3IExvY2tGaWxlKHApOwogCQlpZiAoIWxjay5sb2NrKCkpCkBAIC05NjIsNyArOTYyLDcgQEAgcHJpdmF0ZSB2b2lkIHdyaXRlRmlsZShmaW5hbCBGaWxlIHAsIGZpbmFsIGJ5dGVbXSBiaW4pIHRocm93cyBJT0V4Y2VwdGlvbiwKIAlwdWJsaWMgY2xhc3MgQnJhbmNoQnVpbGRlciB7CiAJCXByaXZhdGUgZmluYWwgU3RyaW5nIHJlZjsKIAotCQlCcmFuY2hCdWlsZGVyKGZpbmFsIFN0cmluZyByZWYpIHsKKwkJQnJhbmNoQnVpbGRlcihTdHJpbmcgcmVmKSB7CiAJCQl0aGlzLnJlZiA9IHJlZjsKIAkJfQogCkBAIC0xMDkzLDcgKzEwOTMsNyBAQCBwdWJsaWMgQ29tbWl0QnVpbGRlciBhZGQoU3RyaW5nIHBhdGgsIFN0cmluZyBjb250ZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCXJldHVybiBhZGQocGF0aCwgYmxvYihjb250ZW50KSk7CiAJCX0KIAotCQlwdWJsaWMgQ29tbWl0QnVpbGRlciBhZGQoU3RyaW5nIHBhdGgsIGZpbmFsIFJldkJsb2IgaWQpCisJCXB1YmxpYyBDb21taXRCdWlsZGVyIGFkZChTdHJpbmcgcGF0aCwgUmV2QmxvYiBpZCkKIAkJCQl0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCXJldHVybiBlZGl0KG5ldyBQYXRoRWRpdChwYXRoKSB7CiAJCQkJQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L1Rlc3RSbmcuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvanVuaXQvVGVzdFJuZy5qYXZhCmluZGV4IDU0YzgxZjIuLmY3YWYzNmEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvanVuaXQvVGVzdFJuZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvanVuaXQvVGVzdFJuZy5qYXZhCkBAIC01NSw3ICs1NSw3IEBAIHB1YmxpYyBjbGFzcyBUZXN0Um5nIHsKIAkgKiBAcGFyYW0gc2VlZAogCSAqICAgICAgICAgICAgc2VlZCB0byBib290c3RyYXAsIHVzdWFsbHkgdGhpcyBpcyB0aGUgdGVzdCBtZXRob2QgbmFtZS4KIAkgKi8KLQlwdWJsaWMgVGVzdFJuZyhmaW5hbCBTdHJpbmcgc2VlZCkgeworCXB1YmxpYyBUZXN0Um5nKFN0cmluZyBzZWVkKSB7CiAJCW5leHQgPSAwOwogCQlmb3IgKGludCBpID0gMDsgaSA8IHNlZWQubGVuZ3RoKCk7IGkrKykKIAkJCW5leHQgPSBuZXh0ICogMTEgKyBzZWVkLmNoYXJBdChpKTsKQEAgLTY4LDcgKzY4LDcgQEAgcHVibGljIFRlc3RSbmcoZmluYWwgU3RyaW5nIHNlZWQpIHsKIAkgKiAgICAgICAgICAgIG51bWJlciBvZiByYW5kb20gYnl0ZXMgdG8gcHJvZHVjZS4KIAkgKiBAcmV0dXJuIGFycmF5IG9mIHtAY29kZSBjbnR9IHJhbmRvbWx5IGdlbmVyYXRlZCBieXRlcy4KIAkgKi8KLQlwdWJsaWMgYnl0ZVtdIG5leHRCeXRlcyhmaW5hbCBpbnQgY250KSB7CisJcHVibGljIGJ5dGVbXSBuZXh0Qnl0ZXMoaW50IGNudCkgewogCQlmaW5hbCBieXRlW10gciA9IG5ldyBieXRlW2NudF07CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgY250OyBpKyspCiAJCQlyW2ldID0gKGJ5dGUpIG5leHRJbnQoKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggNDU0YmQxZC4uYzgwNWY3NSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTMsNyArMyw3IEBACiBCdW5kbGUtTmFtZTogJXBsdWdpbl9uYW1lCiBBdXRvbWF0aWMtTW9kdWxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci50ZXN0CiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIudGVzdAotQnVuZGxlLVZlcnNpb246IDQuMTEuOC5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiA1LjAuNC5xdWFsaWZpZXIKIEJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlcl9uYW1lCiBCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKYXZhU0UtMS44CkBAIC0yOCwyNCArMjgsMjQgQEAKICBvcmcuZWNsaXBzZS5qZXR0eS51dGlsLmxvZzt2ZXJzaW9uPSJbOS40LjUsMTAuMC4wKSIsCiAgb3JnLmVjbGlwc2UuamV0dHkudXRpbC5zZWN1cml0eTt2ZXJzaW9uPSJbOS40LjUsMTAuMC4wKSIsCiAgb3JnLmVjbGlwc2UuamV0dHkudXRpbC50aHJlYWQ7dmVyc2lvbj0iWzkuNC41LDEwLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuYXBpO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0O3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5sZnM7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5lcnJvcnM7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5saWI7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXI7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIuZnM7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0O3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsazt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5hcGk7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQ7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGZzO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGZzLmVycm9yczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5saWI7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci5mczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0O3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKICBvcmcuaGFtY3Jlc3QuY29yZTt2ZXJzaW9uPSJbMS4xLjAsMi4wLjApIiwKICBvcmcuanVuaXQ7dmVyc2lvbj0iWzQuMTIsNS4wLjApIiwKICBvcmcuanVuaXQucnVsZXM7dmVyc2lvbj0iWzQuMTIsNS4wLjApIiwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci50ZXN0L3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIudGVzdC9wb20ueG1sCmluZGV4IGMwOGJmNmIuLmRlZTMxOTkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci50ZXN0L3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnRlc3QvcG9tLnhtbApAQCAtNTAsNyArNTAsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+NC4xMS44LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjUuMC40LVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIudGVzdDwvYXJ0aWZhY3RJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9zZXJ2ZXIvZnMvTGZzU2VydmVyVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGZzL3NlcnZlci9mcy9MZnNTZXJ2ZXJUZXN0LmphdmEKaW5kZXggOTBmZTExNi4uNTBhMDZmOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGZzL3NlcnZlci9mcy9MZnNTZXJ2ZXJUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGZzL3NlcnZlci9mcy9MZnNTZXJ2ZXJUZXN0LmphdmEKQEAgLTQyLDcgKzQyLDcgQEAKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIuZnM7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiAKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07CkBAIC0xMzEsMTIgKzEzMSw2IEBAIHB1YmxpYyB2b2lkIHNldHVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKIAkJCUBPdmVycmlkZQogCQkJcHJvdGVjdGVkIExhcmdlRmlsZVJlcG9zaXRvcnkgZ2V0TGFyZ2VGaWxlUmVwb3NpdG9yeSgKLQkJCQkJTGZzUmVxdWVzdCByZXF1ZXN0LCBTdHJpbmcgcGF0aCkgewotCQkJCXJldHVybiByZXBvc2l0b3J5OwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMYXJnZUZpbGVSZXBvc2l0b3J5IGdldExhcmdlRmlsZVJlcG9zaXRvcnkoCiAJCQkJCUxmc1JlcXVlc3QgcmVxdWVzdCwgU3RyaW5nIHBhdGgsIFN0cmluZyBhdXRoKQogCQkJCQl0aHJvd3MgTGZzRXhjZXB0aW9uIHsKIAkJCQlyZXR1cm4gcmVwb3NpdG9yeTsKQEAgLTIxNywxMSArMjExLDExIEBAIHByaXZhdGUgdm9pZCBjaGVja1Jlc3BvbnNlU3RhdHVzKEh0dHBSZXNwb25zZSByZXNwb25zZSkgewogCQkJCWlmIChidWYuaGFzQXJyYXkoKSkgewogCQkJCQllcnJvciA9IG5ldyBTdHJpbmcoYnVmLmFycmF5KCksCiAJCQkJCQkJYnVmLmFycmF5T2Zmc2V0KCkgKyBidWYucG9zaXRpb24oKSwgYnVmLnJlbWFpbmluZygpLAotCQkJCQkJCVVURl84KTsKKwkJCQkJCQlDSEFSU0VUKTsKIAkJCQl9IGVsc2UgewogCQkJCQlmaW5hbCBieXRlW10gYiA9IG5ldyBieXRlW2J1Zi5yZW1haW5pbmcoKV07CiAJCQkJCWJ1Zi5kdXBsaWNhdGUoKS5nZXQoYik7Ci0JCQkJCWVycm9yID0gbmV3IFN0cmluZyhiLCBVVEZfOCk7CisJCQkJCWVycm9yID0gbmV3IFN0cmluZyhiLCBDSEFSU0VUKTsKIAkJCQl9CiAJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAJCQkJZXJyb3IgPSBzdGF0dXNMaW5lLmdldFJlYXNvblBocmFzZSgpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGZzL3NlcnZlci9mcy9VcGxvYWRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9sZnMvc2VydmVyL2ZzL1VwbG9hZFRlc3QuamF2YQppbmRleCA4YThmNDljLi4wOWY4ZDBhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9sZnMvc2VydmVyL2ZzL1VwbG9hZFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9sZnMvc2VydmVyL2ZzL1VwbG9hZFRlc3QuamF2YQpAQCAtMTIyLDcgKzEyMiw3IEBAIHB1YmxpYyB2b2lkIHRlc3RQYXJhbGxlbFVwbG9hZHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogCQlFeGVjdXRvclNlcnZpY2UgZSA9IEV4ZWN1dG9ycy5uZXdGaXhlZFRocmVhZFBvb2woY291bnQpOwogCQl0cnkgewotCQkJZm9yIChmaW5hbCBQYXRoIHAgOiBwYXRocykgeworCQkJZm9yIChQYXRoIHAgOiBwYXRocykgewogCQkJCWUuc3VibWl0KG5ldyBDYWxsYWJsZTxWb2lkPigpIHsKIAkJCQkJQE92ZXJyaWRlCiAJCQkJCXB1YmxpYyBWb2lkIGNhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci9NRVRBLUlORi9NQU5JRkVTVC5NRgppbmRleCA2ODU1NWI4Li4xNGQzYWI4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0zLDE5ICszLDE5IEBACiBCdW5kbGUtTmFtZTogJXBsdWdpbl9uYW1lCiBBdXRvbWF0aWMtTW9kdWxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlcgogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyCi1CdW5kbGUtVmVyc2lvbjogNC4xMS44LnF1YWxpZmllcgorQnVuZGxlLVZlcnNpb246IDUuMC40LnF1YWxpZmllcgogQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCiBCdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJfbmFtZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlcjt2ZXJzaW9uPSI0LjExLjgiOworRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlcjt2ZXJzaW9uPSI1LjAuNCI7CiAgIHVzZXM6PSJqYXZheC5zZXJ2bGV0Lmh0dHAsCiAgICBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5saWIiLAotIG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci5mczt2ZXJzaW9uPSI0LjExLjgiOworIG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci5mczt2ZXJzaW9uPSI1LjAuNCI7CiAgIHVzZXM6PSJqYXZheC5zZXJ2bGV0LAogICAgamF2YXguc2VydmxldC5odHRwLAogICAgb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLAogICAgb3JnLmVjbGlwc2UuamdpdC5sZnMubGliIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIuaW50ZXJuYWw7dmVyc2lvbj0iNC4xMS44Ijt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci5zMzt2ZXJzaW9uPSI0LjExLjgiOworIG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci5pbnRlcm5hbDt2ZXJzaW9uPSI1LjAuNCI7eC1pbnRlcm5hbDo9dHJ1ZSwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIuczM7dmVyc2lvbj0iNS4wLjQiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLAogICAgb3JnLmVjbGlwc2UuamdpdC5sZnMubGliIgogQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEphdmFTRS0xLjgKQEAgLTI1LDE0ICsyNSwxNSBAQAogIGphdmF4LnNlcnZsZXQuaHR0cDt2ZXJzaW9uPSJbMy4xLjAsNC4wLjApIiwKICBvcmcuYXBhY2hlLmh0dHA7dmVyc2lvbj0iWzQuMy4wLDUuMC4wKSIsCiAgb3JnLmFwYWNoZS5odHRwLmNsaWVudDt2ZXJzaW9uPSJbNC4zLjAsNS4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbDt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5sZnMuZXJyb3JzO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5sZnMuaW50ZXJuYWw7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5saWI7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lm5sczt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHA7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5odHRwLmFwYWNoZTt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuYW5ub3RhdGlvbnM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbDt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5lcnJvcnM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5sZnMuaW50ZXJuYWw7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5sZnMubGliO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubmxzO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHA7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cC5hcGFjaGU7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAogIG9yZy5zbGY0ajt2ZXJzaW9uPSJbMS43LjAsMi4wLjApIgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyL3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIvcG9tLnhtbAppbmRleCBlNzNhZDJmLi43YzgxYzFhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIvcG9tLnhtbApAQCAtNTAsNyArNTAsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+NC4xMS44LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjUuMC40LVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXI8L2FydGlmYWN0SWQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL3NlcnZlci9MZnNQcm90b2NvbFNlcnZsZXQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvc2VydmVyL0xmc1Byb3RvY29sU2VydmxldC5qYXZhCmluZGV4IDY5NjhkNzUuLmQyMmQ0NTkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvc2VydmVyL0xmc1Byb3RvY29sU2VydmxldC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvc2VydmVyL0xmc1Byb3RvY29sU2VydmxldC5qYXZhCkBAIC00Miw3ICs0Miw3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuaHR0cC5IdHRwU3RhdHVzLlNDX0ZPUkJJRERFTjsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5odHRwLkh0dHBTdGF0dXMuU0NfSU5TVUZGSUNJRU5UX1NUT1JBR0U7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuaHR0cC5IdHRwU3RhdHVzLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKQEAgLTExMiw0OCArMTEyLDYgQEAgcHVibGljIGFic3RyYWN0IGNsYXNzIExmc1Byb3RvY29sU2VydmxldCBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKIAkgKiAgICAgICAgICAgIHRoZSByZXF1ZXN0CiAJICogQHBhcmFtIHBhdGgKIAkgKiAgICAgICAgICAgIHRoZSBwYXRoCi0JICogQHJldHVybiB0aGUgbGFyZ2UgZmlsZSByZXBvc2l0b3J5IHN0b3JpbmcgbGFyZ2UgZmlsZXMuCi0JICogQHRocm93cyBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5lcnJvcnMuTGZzRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaW1wbGVtZW50YXRpb25zIHNob3VsZCB0aHJvdyBtb3JlIHNwZWNpZmljIGV4Y2VwdGlvbnMgdG8KLQkgKiAgICAgICAgICAgICBzaWduYWwgd2hpY2ggdHlwZSBvZiBlcnJvciBvY2N1cnJlZDoKLQkgKiAgICAgICAgICAgICA8ZGw+Ci0JICogICAgICAgICAgICAgPGR0PntAbGluayBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5lcnJvcnMuTGZzVmFsaWRhdGlvbkVycm9yfTwvZHQ+Ci0JICogICAgICAgICAgICAgPGRkPndoZW4gdGhlcmUgaXMgYSB2YWxpZGF0aW9uIGVycm9yIHdpdGggb25lIG9yIG1vcmUgb2YgdGhlCi0JICogICAgICAgICAgICAgb2JqZWN0cyBpbiB0aGUgcmVxdWVzdDwvZGQ+Ci0JICogICAgICAgICAgICAgPGR0PntAbGluayBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5lcnJvcnMuTGZzUmVwb3NpdG9yeU5vdEZvdW5kfTwvZHQ+Ci0JICogICAgICAgICAgICAgPGRkPndoZW4gdGhlIHJlcG9zaXRvcnkgZG9lcyBub3QgZXhpc3QgZm9yIHRoZSB1c2VyPC9kZD4KLQkgKiAgICAgICAgICAgICA8ZHQ+e0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQubGZzLmVycm9ycy5MZnNSZXBvc2l0b3J5UmVhZE9ubHl9PC9kdD4KLQkgKiAgICAgICAgICAgICA8ZGQ+d2hlbiB0aGUgdXNlciBoYXMgcmVhZCwgYnV0IG5vdCB3cml0ZSBhY2Nlc3MuIE9ubHkKLQkgKiAgICAgICAgICAgICBhcHBsaWNhYmxlIHdoZW4gdGhlIG9wZXJhdGlvbiBpbiB0aGUgcmVxdWVzdCBpcyAidXBsb2FkIjwvZGQ+Ci0JICogICAgICAgICAgICAgPGR0PntAbGluayBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5lcnJvcnMuTGZzUmF0ZUxpbWl0RXhjZWVkZWR9PC9kdD4KLQkgKiAgICAgICAgICAgICA8ZGQ+d2hlbiB0aGUgdXNlciBoYXMgaGl0IGEgcmF0ZSBsaW1pdCB3aXRoIHRoZSBzZXJ2ZXI8L2RkPgotCSAqICAgICAgICAgICAgIDxkdD57QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5sZnMuZXJyb3JzLkxmc0JhbmR3aWR0aExpbWl0RXhjZWVkZWR9PC9kdD4KLQkgKiAgICAgICAgICAgICA8ZGQ+d2hlbiB0aGUgYmFuZHdpZHRoIGxpbWl0IGZvciB0aGUgdXNlciBvciByZXBvc2l0b3J5IGhhcwotCSAqICAgICAgICAgICAgIGJlZW4gZXhjZWVkZWQ8L2RkPgotCSAqICAgICAgICAgICAgIDxkdD57QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5sZnMuZXJyb3JzLkxmc0luc3VmZmljaWVudFN0b3JhZ2V9PC9kdD4KLQkgKiAgICAgICAgICAgICA8ZGQ+d2hlbiB0aGVyZSBpcyBpbnN1ZmZpY2llbnQgc3RvcmFnZSBvbiB0aGUgc2VydmVyPC9kZD4KLQkgKiAgICAgICAgICAgICA8ZHQ+e0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQubGZzLmVycm9ycy5MZnNVbmF2YWlsYWJsZX08L2R0PgotCSAqICAgICAgICAgICAgIDxkZD53aGVuIExGUyBpcyBub3QgYXZhaWxhYmxlPC9kZD4KLQkgKiAgICAgICAgICAgICA8ZHQ+e0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQubGZzLmVycm9ycy5MZnNFeGNlcHRpb259PC9kdD4KLQkgKiAgICAgICAgICAgICA8ZGQ+d2hlbiBhbiB1bmV4cGVjdGVkIGludGVybmFsIHNlcnZlciBlcnJvciBvY2N1cnJlZDwvZGQ+Ci0JICogICAgICAgICAgICAgPC9kbD4KLQkgKiBAc2luY2UgNC41Ci0JICogQGRlcHJlY2F0ZWQgdXNlCi0JICogICAgICAgICAgICAge0BsaW5rICNnZXRMYXJnZUZpbGVSZXBvc2l0b3J5KExmc1JlcXVlc3QsIFN0cmluZywgU3RyaW5nKX0KLQkgKi8KLQlARGVwcmVjYXRlZAotCXByb3RlY3RlZCBMYXJnZUZpbGVSZXBvc2l0b3J5IGdldExhcmdlRmlsZVJlcG9zaXRvcnkoTGZzUmVxdWVzdCByZXF1ZXN0LAotCQkJU3RyaW5nIHBhdGgpIHRocm93cyBMZnNFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0TGFyZ2VGaWxlUmVwb3NpdG9yeShyZXF1ZXN0LCBwYXRoLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGxhcmdlIGZpbGUgcmVwb3NpdG9yeSBmb3IgdGhlIGdpdmVuIHJlcXVlc3QgYW5kIHBhdGguCi0JICoKLQkgKiBAcGFyYW0gcmVxdWVzdAotCSAqICAgICAgICAgICAgdGhlIHJlcXVlc3QKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgdGhlIHBhdGgKIAkgKiBAcGFyYW0gYXV0aAogCSAqICAgICAgICAgICAgdGhlIEF1dGhvcml6YXRpb24gSFRUUCBoZWFkZXIKIAkgKiBAcmV0dXJuIHRoZSBsYXJnZSBmaWxlIHJlcG9zaXRvcnkgc3RvcmluZyBsYXJnZSBmaWxlcy4KQEAgLTI0NCwxMCArMjAyLDEwIEBAIHB1YmxpYyBib29sZWFuIGlzVmVyaWZ5KCkgewogCXByb3RlY3RlZCB2b2lkIGRvUG9zdChIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcykKIAkJCXRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCVdyaXRlciB3ID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKAotCQkJCW5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIocmVzLmdldE91dHB1dFN0cmVhbSgpLCBVVEZfOCkpOworCQkJCW5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIocmVzLmdldE91dHB1dFN0cmVhbSgpLCBDSEFSU0VUKSk7CiAKIAkJUmVhZGVyIHIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoCi0JCQkJbmV3IElucHV0U3RyZWFtUmVhZGVyKHJlcS5nZXRJbnB1dFN0cmVhbSgpLCBVVEZfOCkpOworCQkJCW5ldyBJbnB1dFN0cmVhbVJlYWRlcihyZXEuZ2V0SW5wdXRTdHJlYW0oKSwgQ0hBUlNFVCkpOwogCQlMZnNSZXF1ZXN0IHJlcXVlc3QgPSBMZnNHc29uLmZyb21Kc29uKHIsIExmc1JlcXVlc3QuY2xhc3MpOwogCQlTdHJpbmcgcGF0aCA9IHJlcS5nZXRQYXRoSW5mbygpOwogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL3NlcnZlci9mcy9GaWxlTGZzUmVwb3NpdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9zZXJ2ZXIvZnMvRmlsZUxmc1JlcG9zaXRvcnkuamF2YQppbmRleCA2ODhhZWYyLi41NWQ5MDkzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL3NlcnZlci9mcy9GaWxlTGZzUmVwb3NpdG9yeS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvc2VydmVyL2ZzL0ZpbGVMZnNSZXBvc2l0b3J5LmphdmEKQEAgLTE3MCw3ICsxNzAsNyBAQCBBdG9taWNPYmplY3RPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKEFueUxvbmdPYmplY3RJZCBpZCkKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gaGV4Y2hhciA9IHsgJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLAogCQkJJzcnLCAnOCcsICc5JywgJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJyB9OwogCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBmb3JtYXRIZXhDaGFyKGZpbmFsIGNoYXJbXSBkc3QsIGZpbmFsIGludCBwLCBpbnQgYikgeworCXByaXZhdGUgc3RhdGljIHZvaWQgZm9ybWF0SGV4Q2hhcihjaGFyW10gZHN0LCBpbnQgcCwgaW50IGIpIHsKIAkJaW50IG8gPSBwICsgMTsKIAkJd2hpbGUgKG8gPj0gcCAmJiBiICE9IDApIHsKIAkJCWRzdFtvLS1dID0gaGV4Y2hhcltiICYgMHhmXTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvc2VydmVyL3MzL1NpZ25lclY0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL3NlcnZlci9zMy9TaWduZXJWNC5qYXZhCmluZGV4IGIyMWM5NGUuLjM3NGE1NjAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvc2VydmVyL3MzL1NpZ25lclY0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9zZXJ2ZXIvczMvU2lnbmVyVjQuamF2YQpAQCAtNDMsNyArNDMsNyBAQAogICovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci5zMzsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuSHR0cFN1cHBvcnQuSERSX0FVVEhPUklaQVRJT047CiAKIGltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CkBAIC0zNTksMTMgKzM1OSwxMyBAQCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgY2Fub25pY2FsaXplUmVzb3VyY2VQYXRoKFVSTCBlbmRwb2ludCkgewogCiAJcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIGhhc2goU3RyaW5nIHMpIHsKIAkJTWVzc2FnZURpZ2VzdCBtZCA9IENvbnN0YW50cy5uZXdNZXNzYWdlRGlnZXN0KCk7Ci0JCW1kLnVwZGF0ZShzLmdldEJ5dGVzKFVURl84KSk7CisJCW1kLnVwZGF0ZShzLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJcmV0dXJuIG1kLmRpZ2VzdCgpOwogCX0KIAogCXByaXZhdGUgc3RhdGljIGJ5dGVbXSBzaWduKFN0cmluZyBzdHJpbmdEYXRhLCBieXRlW10ga2V5KSB7CiAJCXRyeSB7Ci0JCQlieXRlW10gZGF0YSA9IHN0cmluZ0RhdGEuZ2V0Qnl0ZXMoVVRGXzgpOworCQkJYnl0ZVtdIGRhdGEgPSBzdHJpbmdEYXRhLmdldEJ5dGVzKENIQVJTRVQpOwogCQkJTWFjIG1hYyA9IE1hYy5nZXRJbnN0YW5jZShITUFDU0hBMjU2KTsKIAkJCW1hYy5pbml0KG5ldyBTZWNyZXRLZXlTcGVjKGtleSwgSE1BQ1NIQTI1NikpOwogCQkJcmV0dXJuIG1hYy5kb0ZpbmFsKGRhdGEpOwpAQCAtMzk1LDcgKzM5NSw3IEBAIHByaXZhdGUgc3RhdGljIFN0cmluZyB0b0hleChieXRlW10gYnl0ZXMpIHsKIAlwcml2YXRlIHN0YXRpYyBTdHJpbmcgdXJsRW5jb2RlKFN0cmluZyB1cmwsIGJvb2xlYW4ga2VlcFBhdGhTbGFzaCkgewogCQlTdHJpbmcgZW5jb2RlZDsKIAkJdHJ5IHsKLQkJCWVuY29kZWQgPSBVUkxFbmNvZGVyLmVuY29kZSh1cmwsIFVURl84Lm5hbWUoKSk7CisJCQllbmNvZGVkID0gVVJMRW5jb2Rlci5lbmNvZGUodXJsLCBDSEFSU0VULm5hbWUoKSk7CiAJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewogCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oTGZzU2VydmVyVGV4dC5nZXQoKS51bnN1cHBvcnRlZFV0ZjgsIGUpOwogCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRgppbmRleCBkNjRlMmUyLi5kODM3NmNlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTMsMjMgKzMsMjMgQEAKIEJ1bmRsZS1OYW1lOiAlcGx1Z2luX25hbWUKIEF1dG9tYXRpYy1Nb2R1bGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdAogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdAotQnVuZGxlLVZlcnNpb246IDQuMTEuOC5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiA1LjAuNC5xdWFsaWZpZXIKIEJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlcl9uYW1lCiBCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKYXZhU0UtMS44Ci1JbXBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmRmczt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQ7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmczt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGZzLmVycm9yczt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGZzLmxpYjt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsazt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCitJbXBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmRmczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0O3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGZzO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGZzLmVycm9yczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5saWI7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGs7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5maWx0ZXI7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAogIG9yZy5oYW1jcmVzdC5jb3JlO3ZlcnNpb249IlsxLjEuMCwyLjAuMCkiLAogIG9yZy5qdW5pdDt2ZXJzaW9uPSJbNC4xMiw1LjAuMCkiLAogIG9yZy5qdW5pdC5ydW5uZXI7dmVyc2lvbj0iWzQuMTIsNS4wLjApIiwKICBvcmcuanVuaXQucnVubmVyczt2ZXJzaW9uPSJbNC4xMiw1LjAuMCkiCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdDt2ZXJzaW9uPSI0LjExLjgiO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci50ZXN0IgorRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3Q7dmVyc2lvbj0iNS4wLjQiO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci50ZXN0IgogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0L3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0L3BvbS54bWwKaW5kZXggMGI3MzAwZS4uYTU1Y2VjZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdC9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3QvcG9tLnhtbApAQCAtNTAsNyArNTAsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+NC4xMS44LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjUuMC40LVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0PC9hcnRpZmFjdElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvdGVzdC9Mb25nT2JqZWN0SWRUZXN0VXRpbHMuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3Qvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL3Rlc3QvTG9uZ09iamVjdElkVGVzdFV0aWxzLmphdmEKaW5kZXggYzNjMzg1OS4uZTNjNmVmOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvdGVzdC9Mb25nT2JqZWN0SWRUZXN0VXRpbHMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy90ZXN0L0xvbmdPYmplY3RJZFRlc3RVdGlscy5qYXZhCkBAIC00Miw3ICs0Miw3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdDsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogCiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwpAQCAtNjYsNyArNjYsNyBAQCBwdWJsaWMgY2xhc3MgTG9uZ09iamVjdElkVGVzdFV0aWxzIHsKIAkgKi8KIAlwdWJsaWMgc3RhdGljIExvbmdPYmplY3RJZCBoYXNoKFN0cmluZyBzKSB7CiAJCU1lc3NhZ2VEaWdlc3QgbWQgPSBDb25zdGFudHMubmV3TWVzc2FnZURpZ2VzdCgpOwotCQltZC51cGRhdGUocy5nZXRCeXRlcyhVVEZfOCkpOworCQltZC51cGRhdGUocy5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCXJldHVybiBMb25nT2JqZWN0SWQuZnJvbVJhdyhtZC5kaWdlc3QoKSk7CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9saWIvTEZTUG9pbnRlclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGZzL2xpYi9MRlNQb2ludGVyVGVzdC5qYXZhCmluZGV4IDE0NmEyNWUuLmExMjgzZGQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGZzL2xpYi9MRlNQb2ludGVyVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGZzL2xpYi9MRlNQb2ludGVyVGVzdC5qYXZhCkBAIC00Myw3ICs0Myw3IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5sZnMubGliOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJBQ1RFUl9FTkNPRElORzsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiAKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKQEAgLTY2LDcgKzY2LDcgQEAgcHVibGljIHZvaWQgdGVzdEVuY29kaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCWFzc2VydEVxdWFscygKIAkJCQkJInZlcnNpb24gaHR0cHM6Ly9naXQtbGZzLmdpdGh1Yi5jb20vc3BlYy92MVxub2lkIHNoYTI1NjoiCiAJCQkJCQkJKyBzICsgIlxuc2l6ZSA0XG4iLAotCQkJCQliYW9zLnRvU3RyaW5nKFVURl84Lm5hbWUoKSkpOworCQkJCQliYW9zLnRvU3RyaW5nKENIQVJBQ1RFUl9FTkNPRElORykpOwogCQl9CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9NRVRBLUlORi9NQU5JRkVTVC5NRgppbmRleCA0NGFjODU2Li4zZTFlMjIxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMywzMyArMywzNCBAQAogQnVuZGxlLU5hbWU6ICVwbHVnaW5fbmFtZQogQXV0b21hdGljLU1vZHVsZS1OYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LmxmcwogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamdpdC5sZnMKLUJ1bmRsZS1WZXJzaW9uOiA0LjExLjgucXVhbGlmaWVyCitCdW5kbGUtVmVyc2lvbjogNS4wLjQucXVhbGlmaWVyCiBCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KIEJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlcl9uYW1lCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5sZnM7dmVyc2lvbj0iNC4xMS44IiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5lcnJvcnM7dmVyc2lvbj0iNC4xMS44IiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5pbnRlcm5hbDt2ZXJzaW9uPSI0LjExLjgiO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3Qsb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLmZzLG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlciIsCi0gb3JnLmVjbGlwc2UuamdpdC5sZnMubGliO3ZlcnNpb249IjQuMTEuOCIKK0V4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0Lmxmczt2ZXJzaW9uPSI1LjAuNCIsCisgb3JnLmVjbGlwc2UuamdpdC5sZnMuZXJyb3JzO3ZlcnNpb249IjUuMC40IiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5pbnRlcm5hbDt2ZXJzaW9uPSI1LjAuNCI7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdCxvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIuZnMsb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5saWI7dmVyc2lvbj0iNS4wLjQiCiBCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSmF2YVNFLTEuOAogSW1wb3J0LVBhY2thZ2U6IGNvbS5nb29nbGUuZ3Nvbjt2ZXJzaW9uPSJbMi44LjIsMy4wLjApIiwKICBjb20uZ29vZ2xlLmdzb24uc3RyZWFtO3ZlcnNpb249IlsyLjguMiwzLjAuMCkiLAogIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNsaWVudDt2ZXJzaW9uPSJbNC4yLjYsNS4wLjApIiwKICBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jb25uO3ZlcnNpb249Ils0LjIuNiw1LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuYW5ub3RhdGlvbnM7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIjtyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnM7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmF0dHJpYnV0ZXM7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmRpZmY7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmVycm9yczt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaG9va3M7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5ubHM7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5wYWNrO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5odHRwO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsazt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIKKyBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiO3Jlc29sdXRpb246PW9wdGlvbmFsLAorIG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9yczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmF0dHJpYnV0ZXM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5kaWZmO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaG9va3M7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5ubHM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5wYWNrO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHA7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsazt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLmZpbHRlcjt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5zbGY0ajt2ZXJzaW9uPSJbMS43LjAsMi4wLjApIgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQubGZzL3BvbS54bWwKaW5kZXggYmVjMDllZS4uYzIzMTY5MiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9wb20ueG1sCkBAIC01MCw3ICs1MCw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj40LjExLjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+NS4wLjQtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQubGZzPC9hcnRpZmFjdElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL0xmcy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL0xmcy5qYXZhCmluZGV4IDQwZDgzNDIuLjRjNDZiYmQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9MZnMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvTGZzLmphdmEKQEAgLTY1LDE5ICs2NSw2IEBAIHB1YmxpYyBjbGFzcyBMZnMgewogCS8qKgogCSAqIENvbnN0cnVjdG9yIGZvciBMZnMuCiAJICoKLQkgKiBAcGFyYW0gcm9vdAotCSAqICAgICAgICAgICAgdGhlIHBhdGggdG8gdGhlIExGUyBtZWRpYSBkaXJlY3RvcnkuIFdpbGwgYmUKLQkgKiAgICAgICAgICAgIHtAY29kZSAiPHJlcG8+Ly5naXQvbGZzIn0KLQkgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNMZnMoUmVwb3NpdG9yeSl9IGluc3RlYWQuCi0JICovCi0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgTGZzKFBhdGggcm9vdCkgewotCQl0aGlzLnJvb3QgPSByb290OwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBMZnMuCi0JICoKIAkgKiBAcGFyYW0gZGIKIAkgKiAgICAgICAgICAgIHRoZSBhc3NvY2lhdGVkIHJlcG8KIAkgKgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL0xmc1BvaW50ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9MZnNQb2ludGVyLmphdmEKaW5kZXggMGUzODMwYy4uNGY5NTk0MCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL0xmc1BvaW50ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvTGZzUG9pbnRlci5qYXZhCkBAIC00Miw3ICs0Miw3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5sZnM7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIAogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKQEAgLTEzNCw3ICsxMzQsNyBAQCBwdWJsaWMgbG9uZyBnZXRTaXplKCkgewogCSAqLwogCXB1YmxpYyB2b2lkIGVuY29kZShPdXRwdXRTdHJlYW0gb3V0KSB7CiAJCXRyeSAoUHJpbnRTdHJlYW0gcHMgPSBuZXcgUHJpbnRTdHJlYW0ob3V0LCBmYWxzZSwKLQkJCQlVVEZfOC5uYW1lKCkpKSB7CisJCQkJQ0hBUlNFVC5uYW1lKCkpKSB7CiAJCQlwcy5wcmludCgidmVyc2lvbiAiKTsgLy8kTk9OLU5MUy0xJAogCQkJcHMucHJpbnQoVkVSU0lPTiArICJcbiIpOyAvLyROT04tTkxTLTEkCiAJCQlwcy5wcmludCgib2lkICIgKyBIQVNIX0ZVTkNUSU9OX05BTUUgKyAiOiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKQEAgLTE0Myw3ICsxNDMsNyBAQCBwdWJsaWMgdm9pZCBlbmNvZGUoT3V0cHV0U3RyZWFtIG91dCkgewogCQkJcHMucHJpbnQoc2l6ZSArICJcbiIpOyAvLyROT04tTkxTLTEkCiAJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewogCQkJLy8gc2hvdWxkIG5vdCBoYXBwZW4sIHdlIGFyZSB1c2luZyBhIHN0YW5kYXJkIGNoYXJzZXQKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb24oVVRGXzgubmFtZSgpKTsKKwkJCXRocm93IG5ldyBVbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb24oQ0hBUlNFVC5uYW1lKCkpOwogCQl9CiAJfQogCkBAIC0xNjUsNyArMTY1LDcgQEAgcHVibGljIHN0YXRpYyBMZnNQb2ludGVyIHBhcnNlTGZzUG9pbnRlcihJbnB1dFN0cmVhbSBpbikKIAkJbG9uZyBzeiA9IC0xOwogCiAJCXRyeSAoQnVmZmVyZWRSZWFkZXIgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoCi0JCQkJbmV3IElucHV0U3RyZWFtUmVhZGVyKGluLCBVVEZfOCkpKSB7CisJCQkJbmV3IElucHV0U3RyZWFtUmVhZGVyKGluLCBDSEFSU0VUKSkpIHsKIAkJCWZvciAoU3RyaW5nIHMgPSBici5yZWFkTGluZSgpOyBzICE9IG51bGw7IHMgPSBici5yZWFkTGluZSgpKSB7CiAJCQkJaWYgKHMuc3RhcnRzV2l0aCgiIyIpIHx8IHMubGVuZ3RoKCkgPT0gMCkgeyAvLyROT04tTkxTLTEkCiAJCQkJCWNvbnRpbnVlOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL0xmc1ByZVB1c2hIb29rLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvTGZzUHJlUHVzaEhvb2suamF2YQppbmRleCA2MTE1ZTM5Li5kZTQ0NDlmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvTGZzUHJlUHVzaEhvb2suamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvTGZzUHJlUHVzaEhvb2suamF2YQpAQCAtNDIsNyArNDIsNyBAQAogICovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQubGZzOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGZzLlByb3RvY29sLk9QRVJBVElPTl9VUExPQUQ7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGZzLmludGVybmFsLkxmc0Nvbm5lY3Rpb25GYWN0b3J5LnRvUmVxdWVzdDsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cC5IdHRwQ29ubmVjdGlvbi5IVFRQX09LOwpAQCAtMTc0LDggKzE3NCw4IEBAIHByaXZhdGUgc3RhdGljIExmc1BvaW50ZXIgbG9hZExmc1BvaW50ZXIoT2JqZWN0UmVhZGVyIHIsIEFueU9iamVjdElkIG9iaikKIAogCXByaXZhdGUgdm9pZCBleGNsdWRlUmVtb3RlUmVmcyhPYmplY3RXYWxrIHdhbGspIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCVJlZkRhdGFiYXNlIHJlZkRhdGFiYXNlID0gZ2V0UmVwb3NpdG9yeSgpLmdldFJlZkRhdGFiYXNlKCk7Ci0JCU1hcDxTdHJpbmcsIFJlZj4gcmVtb3RlUmVmcyA9IHJlZkRhdGFiYXNlLmdldFJlZnMocmVtb3RlKCkpOwotCQlmb3IgKFJlZiByIDogcmVtb3RlUmVmcy52YWx1ZXMoKSkgeworCQlMaXN0PFJlZj4gcmVtb3RlUmVmcyA9IHJlZkRhdGFiYXNlLmdldFJlZnNCeVByZWZpeChyZW1vdGUoKSk7CisJCWZvciAoUmVmIHIgOiByZW1vdGVSZWZzKSB7CiAJCQlPYmplY3RJZCBvaWQgPSByLmdldFBlZWxlZE9iamVjdElkKCk7CiAJCQlpZiAob2lkID09IG51bGwpIHsKIAkJCQlvaWQgPSByLmdldE9iamVjdElkKCk7CkBAIC0yMDgsNyArMjA4LDcgQEAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBMZnNQb2ludGVyPiByZXF1ZXN0QmF0Y2hVcGxvYWQoSHR0cENvbm5lY3Rpb24gYXBpLAogCQl9CiAJCUdzb24gZ3NvbiA9IFByb3RvY29sLmdzb24oKTsKIAkJYXBpLmdldE91dHB1dFN0cmVhbSgpLndyaXRlKAotCQkJCWdzb24udG9Kc29uKHRvUmVxdWVzdChPUEVSQVRJT05fVVBMT0FELCByZXMpKS5nZXRCeXRlcyhVVEZfOCkpOworCQkJCWdzb24udG9Kc29uKHRvUmVxdWVzdChPUEVSQVRJT05fVVBMT0FELCByZXMpKS5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCWludCByZXNwb25zZUNvZGUgPSBhcGkuZ2V0UmVzcG9uc2VDb2RlKCk7CiAJCWlmIChyZXNwb25zZUNvZGUgIT0gSFRUUF9PSykgewogCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL1NtdWRnZUZpbHRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL1NtdWRnZUZpbHRlci5qYXZhCmluZGV4IGUyYWIzMDkuLjZiZmYxMmYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9TbXVkZ2VGaWx0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvU211ZGdlRmlsdGVyLmphdmEKQEAgLTQyLDExICs0MiwxMiBAQAogICovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQubGZzOwogCitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOworCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOwogaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CiBpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoOwogaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwpAQCAtMTY5LDcgKzE3MCw3IEBAIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxQYXRoPiBkb3dubG9hZExmc1Jlc291cmNlKExmcyBsZnMsIFJlcG9zaXRvcnkgZGIsCiAJCQkJLndyaXRlKGdzb24KIAkJCQkJCS50b0pzb24oTGZzQ29ubmVjdGlvbkZhY3RvcnkKIAkJCQkJCQkJLnRvUmVxdWVzdChQcm90b2NvbC5PUEVSQVRJT05fRE9XTkxPQUQsIHJlcykpCi0JCQkJCQkuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCkpOworCQkJCQkJLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJaW50IHJlc3BvbnNlQ29kZSA9IGxmc1NlcnZlckNvbm4uZ2V0UmVzcG9uc2VDb2RlKCk7CiAJCWlmIChyZXNwb25zZUNvZGUgIT0gSHR0cENvbm5lY3Rpb24uSFRUUF9PSykgewogCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL2Vycm9ycy9MZnNDb25maWdJbnZhbGlkRXhjZXB0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvZXJyb3JzL0xmc0NvbmZpZ0ludmFsaWRFeGNlcHRpb24uamF2YQppbmRleCA1MzIwYWYwLi5mOTBhMDAzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvZXJyb3JzL0xmc0NvbmZpZ0ludmFsaWRFeGNlcHRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvZXJyb3JzL0xmc0NvbmZpZ0ludmFsaWRFeGNlcHRpb24uamF2YQpAQCAtNjMsNCArNjMsMTcgQEAgcHVibGljIExmc0NvbmZpZ0ludmFsaWRFeGNlcHRpb24oU3RyaW5nIG1zZykgewogCQlzdXBlcihtc2cpOwogCX0KIAorCS8qKgorCSAqIENvbnN0cnVjdG9yIGZvciBMZnNDb25maWdJbnZhbGlkRXhjZXB0aW9uLgorCSAqCisJICogQHBhcmFtIG1zZworCSAqICAgICAgICAgICAgdGhlIGVycm9yIGRlc2NyaXB0aW9uCisJICogQHBhcmFtIGUKKwkgKiAgICAgICAgICAgIGNhdXNlIG9mIHRoaXMgZXhjZXB0aW9uCisJICogQHNpbmNlIDUuMAorCSAqLworCXB1YmxpYyBMZnNDb25maWdJbnZhbGlkRXhjZXB0aW9uKFN0cmluZyBtc2csIEV4Y2VwdGlvbiBlKSB7CisJCXN1cGVyKG1zZywgZSk7CisJfQorCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvaW50ZXJuYWwvTGZzQ29ubmVjdGlvbkZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9pbnRlcm5hbC9MZnNDb25uZWN0aW9uRmFjdG9yeS5qYXZhCmluZGV4IDVkODI2OGIuLjk1NWVjYTAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9pbnRlcm5hbC9MZnNDb25uZWN0aW9uRmFjdG9yeS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9pbnRlcm5hbC9MZnNDb25uZWN0aW9uRmFjdG9yeS5qYXZhCkBAIC00NywxMCArNDcsOSBAQAogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuSHR0cFN1cHBvcnQuSERSX0FDQ0VQVF9FTkNPRElORzsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC51dGlsLkh0dHBTdXBwb3J0LkhEUl9DT05URU5UX1RZUEU7CiAKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKIGltcG9ydCBqYXZhLm5ldC5Qcm94eVNlbGVjdG9yOworaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5ldC5VUkw7CiBpbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CiBpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CkBAIC01OCw2ICs1Nyw3IEBACiBpbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zLk5vbk51bGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuQ29tbWFuZEZhaWxlZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5MZnNQb2ludGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGZzLlByb3RvY29sOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGZzLmVycm9ycy5MZnNDb25maWdJbnZhbGlkRXhjZXB0aW9uOwpAQCAtNjYsMjAgKzY2LDE3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuU3RvcmVkQ29uZmlnOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lkh0dHBDb25maWc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuSHR0cFRyYW5zcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5SZW1vdGVTZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlNzaFNlc3Npb25GYWN0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlVSSWlzaDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5odHRwLkh0dHBDb25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5GUzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuSHR0cFN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvLk1lc3NhZ2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvLlN0cmVhbUNvcHlUaHJlYWQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLlNzaFN1cHBvcnQ7CiAKIC8qKgogICogUHJvdmlkZXMgbWVhbnMgdG8gZ2V0IGEgdmFsaWQgTEZTIGNvbm5lY3Rpb24gZm9yIGEgZ2l2ZW4gcmVwb3NpdG9yeS4KICAqLwogcHVibGljIGNsYXNzIExmc0Nvbm5lY3Rpb25GYWN0b3J5IHsKIAorCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTU0hfQVVUSF9USU1FT1VUX1NFQ09ORFMgPSAzMDsKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NIRU1FX0hUVFBTID0gImh0dHBzIjsgLy8kTk9OLU5MUy0xJAogCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0hFTUVfU1NIID0gInNzaCI7IC8vJE5PTi1OTFMtMSQKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBBdXRoQ2FjaGU+IHNzaEF1dGhDYWNoZSA9IG5ldyBUcmVlTWFwPD4oKTsKQEAgLTEzMyw2ICsxMzAsNyBAQCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0TGZzVXJsKFJlcG9zaXRvcnkgZGIsIFN0cmluZyBwdXJwb3NlLAogCQlTdHJpbmcgbGZzVXJsID0gY29uZmlnLmdldFN0cmluZyhDb25maWdDb25zdGFudHMuQ09ORklHX1NFQ1RJT05fTEZTLAogCQkJCW51bGwsCiAJCQkJQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfVVJMKTsKKwkJRXhjZXB0aW9uIGV4ID0gbnVsbDsKIAkJaWYgKGxmc1VybCA9PSBudWxsKSB7CiAJCQlTdHJpbmcgcmVtb3RlVXJsID0gbnVsbDsKIAkJCWZvciAoU3RyaW5nIHJlbW90ZSA6IGRiLmdldFJlbW90ZU5hbWVzKCkpIHsKQEAgLTE1MSwzOCArMTQ5LDQ0IEBAIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRMZnNVcmwoUmVwb3NpdG9yeSBkYiwgU3RyaW5nIHB1cnBvc2UsCiAJCQkJYnJlYWs7CiAJCQl9CiAJCQlpZiAobGZzVXJsID09IG51bGwgJiYgcmVtb3RlVXJsICE9IG51bGwpIHsKLQkJCQlsZnNVcmwgPSBkaXNjb3Zlckxmc1VybChkYiwgcHVycG9zZSwgYWRkaXRpb25hbEhlYWRlcnMsCi0JCQkJCQlyZW1vdGVVcmwpOworCQkJCXRyeSB7CisJCQkJCWxmc1VybCA9IGRpc2NvdmVyTGZzVXJsKGRiLCBwdXJwb3NlLCBhZGRpdGlvbmFsSGVhZGVycywKKwkJCQkJCQlyZW1vdGVVcmwpOworCQkJCX0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiB8IElPRXhjZXB0aW9uCisJCQkJCQl8IENvbW1hbmRGYWlsZWRFeGNlcHRpb24gZSkgeworCQkJCQlleCA9IGU7CisJCQkJfQogCQkJfSBlbHNlIHsKIAkJCQlsZnNVcmwgPSBsZnNVcmwgKyBQcm90b2NvbC5JTkZPX0xGU19FTkRQT0lOVDsKIAkJCX0KIAkJfQogCQlpZiAobGZzVXJsID09IG51bGwpIHsKKwkJCWlmIChleCAhPSBudWxsKSB7CisJCQkJdGhyb3cgbmV3IExmc0NvbmZpZ0ludmFsaWRFeGNlcHRpb24oCisJCQkJCQlMZnNUZXh0LmdldCgpLmxmc05vRG93bmxvYWRVcmwsIGV4KTsKKwkJCX0KIAkJCXRocm93IG5ldyBMZnNDb25maWdJbnZhbGlkRXhjZXB0aW9uKExmc1RleHQuZ2V0KCkubGZzTm9Eb3dubG9hZFVybCk7CiAJCX0KIAkJcmV0dXJuIGxmc1VybDsKIAl9CiAKIAlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGlzY292ZXJMZnNVcmwoUmVwb3NpdG9yeSBkYiwgU3RyaW5nIHB1cnBvc2UsCi0JCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGFkZGl0aW9uYWxIZWFkZXJzLCBTdHJpbmcgcmVtb3RlVXJsKSB7Ci0JCXRyeSB7Ci0JCQlVUklpc2ggdSA9IG5ldyBVUklpc2gocmVtb3RlVXJsKTsKLQkJCWlmIChTQ0hFTUVfU1NILmVxdWFscyh1LmdldFNjaGVtZSgpKSkgewotCQkJCVByb3RvY29sLkV4cGlyaW5nQWN0aW9uIGFjdGlvbiA9IGdldFNzaEF1dGhlbnRpY2F0aW9uKAotCQkJCQkJZGIsIHB1cnBvc2UsIHJlbW90ZVVybCwgdSk7Ci0JCQkJYWRkaXRpb25hbEhlYWRlcnMucHV0QWxsKGFjdGlvbi5oZWFkZXIpOwotCQkJCXJldHVybiBhY3Rpb24uaHJlZjsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIHJlbW90ZVVybCArIFByb3RvY29sLklORk9fTEZTX0VORFBPSU5UOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7IC8vIGNvdWxkIG5vdCBkaXNjb3ZlcgorCQkJTWFwPFN0cmluZywgU3RyaW5nPiBhZGRpdGlvbmFsSGVhZGVycywgU3RyaW5nIHJlbW90ZVVybCkKKwkJCXRocm93cyBVUklTeW50YXhFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBDb21tYW5kRmFpbGVkRXhjZXB0aW9uIHsKKwkJVVJJaXNoIHUgPSBuZXcgVVJJaXNoKHJlbW90ZVVybCk7CisJCWlmICh1LmdldFNjaGVtZSgpID09IG51bGwgfHwgU0NIRU1FX1NTSC5lcXVhbHModS5nZXRTY2hlbWUoKSkpIHsKKwkJCVByb3RvY29sLkV4cGlyaW5nQWN0aW9uIGFjdGlvbiA9IGdldFNzaEF1dGhlbnRpY2F0aW9uKGRiLCBwdXJwb3NlLAorCQkJCQlyZW1vdGVVcmwsIHUpOworCQkJYWRkaXRpb25hbEhlYWRlcnMucHV0QWxsKGFjdGlvbi5oZWFkZXIpOworCQkJcmV0dXJuIGFjdGlvbi5ocmVmOworCQl9IGVsc2UgeworCQkJcmV0dXJuIHJlbW90ZVVybCArIFByb3RvY29sLklORk9fTEZTX0VORFBPSU5UOwogCQl9CiAJfQogCiAJcHJpdmF0ZSBzdGF0aWMgUHJvdG9jb2wuRXhwaXJpbmdBY3Rpb24gZ2V0U3NoQXV0aGVudGljYXRpb24oCiAJCQlSZXBvc2l0b3J5IGRiLCBTdHJpbmcgcHVycG9zZSwgU3RyaW5nIHJlbW90ZVVybCwgVVJJaXNoIHUpCi0JCQl0aHJvd3MgSU9FeGNlcHRpb24geworCQkJdGhyb3dzIElPRXhjZXB0aW9uLCBDb21tYW5kRmFpbGVkRXhjZXB0aW9uIHsKIAkJQXV0aENhY2hlIGNhY2hlZCA9IHNzaEF1dGhDYWNoZS5nZXQocmVtb3RlVXJsKTsKIAkJUHJvdG9jb2wuRXhwaXJpbmdBY3Rpb24gYWN0aW9uID0gbnVsbDsKIAkJaWYgKGNhY2hlZCAhPSBudWxsICYmIGNhY2hlZC52YWxpZFVudGlsID4gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpIHsKQEAgLTE5MywxMCArMTk3LDExIEBAIHByaXZhdGUgc3RhdGljIFByb3RvY29sLkV4cGlyaW5nQWN0aW9uIGdldFNzaEF1dGhlbnRpY2F0aW9uKAogCQkJLy8gZGlzY292ZXIgYW5kIGF1dGhlbnRpY2F0ZTsgZ2l0LWxmcyBkb2VzICJzc2gKIAkJCS8vIC1wIDxwb3J0PiAtLSA8aG9zdD4gZ2l0LWxmcy1hdXRoZW50aWNhdGUKIAkJCS8vIDxwcm9qZWN0PiA8dXBsb2FkL2Rvd25sb2FkPiIKLQkJCVN0cmluZyBqc29uID0gcnVuU3NoQ29tbWFuZCh1LnNldFBhdGgoIiIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWRiLmdldEZTKCksCisJCQlTdHJpbmcganNvbiA9IFNzaFN1cHBvcnQucnVuU3NoQ29tbWFuZCh1LnNldFBhdGgoIiIpLCAvLyROT04tTkxTLTEkCisJCQkJCW51bGwsIGRiLmdldEZTKCksCiAJCQkJCSJnaXQtbGZzLWF1dGhlbnRpY2F0ZSAiICsgZXh0cmFjdFByb2plY3ROYW1lKHUpICsgIiAiIC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCQkJCQkJKyBwdXJwb3NlKTsKKwkJCQkJCQkrIHB1cnBvc2UsCisJCQkJCVNTSF9BVVRIX1RJTUVPVVRfU0VDT05EUyk7CiAKIAkJCWFjdGlvbiA9IFByb3RvY29sLmdzb24oKS5mcm9tSnNvbihqc29uLAogCQkJCQlQcm90b2NvbC5FeHBpcmluZ0FjdGlvbi5jbGFzcyk7CkBAIC0yMzAsOCArMjM1LDEwIEBAIHByaXZhdGUgc3RhdGljIFByb3RvY29sLkV4cGlyaW5nQWN0aW9uIGdldFNzaEF1dGhlbnRpY2F0aW9uKAogCQkJCS5jcmVhdGUoY29udGVudFVybCwgSHR0cFN1cHBvcnQKIAkJCQkJCS5wcm94eUZvcihQcm94eVNlbGVjdG9yLmdldERlZmF1bHQoKSwgY29udGVudFVybCkpOwogCQljb250ZW50U2VydmVyQ29ubi5zZXRSZXF1ZXN0TWV0aG9kKG1ldGhvZCk7Ci0JCWFjdGlvbi5oZWFkZXIKLQkJCQkuZm9yRWFjaCgoaywgdikgLT4gY29udGVudFNlcnZlckNvbm4uc2V0UmVxdWVzdFByb3BlcnR5KGssIHYpKTsKKwkJaWYgKGFjdGlvbi5oZWFkZXIgIT0gbnVsbCkgeworCQkJYWN0aW9uLmhlYWRlci5mb3JFYWNoKAorCQkJCQkoaywgdikgLT4gY29udGVudFNlcnZlckNvbm4uc2V0UmVxdWVzdFByb3BlcnR5KGssIHYpKTsKKwkJfQogCQlpZiAoY29udGVudFVybC5nZXRQcm90b2NvbCgpLmVxdWFscyhTQ0hFTUVfSFRUUFMpCiAJCQkJJiYgIXJlcG8uZ2V0Q29uZmlnKCkuZ2V0Qm9vbGVhbihIdHRwQ29uZmlnLkhUVFAsCiAJCQkJCQlIdHRwQ29uZmlnLlNTTF9WRVJJRllfS0VZLCB0cnVlKSkgewpAQCAtMjQ1LDcgKzI1MiwxMyBAQCBwcml2YXRlIHN0YXRpYyBQcm90b2NvbC5FeHBpcmluZ0FjdGlvbiBnZXRTc2hBdXRoZW50aWNhdGlvbigKIAl9CiAKIAlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZXh0cmFjdFByb2plY3ROYW1lKFVSSWlzaCB1KSB7Ci0JCVN0cmluZyBwYXRoID0gdS5nZXRQYXRoKCkuc3Vic3RyaW5nKDEpOworCQlTdHJpbmcgcGF0aCA9IHUuZ2V0UGF0aCgpOworCisJCS8vIGJlZ2lucyB3aXRoIGEgc2xhc2ggaWYgdGhlIHVybCBjb250YWlucyBhIHBvcnQgKGdlcnJpdCB2cy4gZ2l0aHViKS4KKwkJaWYgKHBhdGguc3RhcnRzV2l0aCgiLyIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCXBhdGggPSBwYXRoLnN1YnN0cmluZygxKTsKKwkJfQorCiAJCWlmIChwYXRoLmVuZHNXaXRoKG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5ET1RfR0lUKSkgewogCQkJcmV0dXJuIHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGVuZ3RoKCkgLSA0KTsKIAkJfSBlbHNlIHsKQEAgLTI1Myw0MiArMjY2LDYgQEAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGV4dHJhY3RQcm9qZWN0TmFtZShVUklpc2ggdSkgewogCQl9CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHJ1blNzaENvbW1hbmQoVVJJaXNoIHNzaFVyaSwgRlMgZnMsIFN0cmluZyBjb21tYW5kKQotCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJUmVtb3RlU2Vzc2lvbiBzZXNzaW9uID0gbnVsbDsKLQkJUHJvY2VzcyBwcm9jZXNzID0gbnVsbDsKLQkJU3RyZWFtQ29weVRocmVhZCBlcnJvclRocmVhZCA9IG51bGw7Ci0JCXRyeSAoTWVzc2FnZVdyaXRlciBzdGRlcnIgPSBuZXcgTWVzc2FnZVdyaXRlcigpKSB7Ci0JCQlzZXNzaW9uID0gU3NoU2Vzc2lvbkZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRTZXNzaW9uKHNzaFVyaSwgbnVsbCwKLQkJCQkJZnMsIDVfMDAwKTsKLQkJCXByb2Nlc3MgPSBzZXNzaW9uLmV4ZWMoY29tbWFuZCwgMCk7Ci0JCQllcnJvclRocmVhZCA9IG5ldyBTdHJlYW1Db3B5VGhyZWFkKHByb2Nlc3MuZ2V0RXJyb3JTdHJlYW0oKSwKLQkJCQkJc3RkZXJyLmdldFJhd1N0cmVhbSgpKTsKLQkJCWVycm9yVGhyZWFkLnN0YXJ0KCk7Ci0JCQl0cnkgKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcigKLQkJCQkJbmV3IElucHV0U3RyZWFtUmVhZGVyKHByb2Nlc3MuZ2V0SW5wdXRTdHJlYW0oKSwKLQkJCQkJCQlvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVCkpKSB7Ci0JCQkJcmV0dXJuIHJlYWRlci5yZWFkTGluZSgpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKHByb2Nlc3MgIT0gbnVsbCkgewotCQkJCXByb2Nlc3MuZGVzdHJveSgpOwotCQkJfQotCQkJaWYgKGVycm9yVGhyZWFkICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQllcnJvclRocmVhZC5oYWx0KCk7Ci0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCQkvLyBTdG9wIHdhaXRpbmcgYW5kIHJldHVybiBhbnl3YXkuCi0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJZXJyb3JUaHJlYWQgPSBudWxsOwotCQkJCX0KLQkJCX0KLQkJCWlmIChzZXNzaW9uICE9IG51bGwpIHsKLQkJCQlTc2hTZXNzaW9uRmFjdG9yeS5nZXRJbnN0YW5jZSgpLnJlbGVhc2VTZXNzaW9uKHNlc3Npb24pOwotCQkJfQotCQl9Ci0JfQotCiAJLyoqCiAJICogQHBhcmFtIG9wZXJhdGlvbgogCSAqICAgICAgICAgICAgdGhlIG9wZXJhdGlvbiB0byBwZXJmb3JtLCBlLmcuIFByb3RvY29sLk9QRVJBVElPTl9ET1dOTE9BRApAQCAtMzEzLDcgKzI5MCw3IEBAIHB1YmxpYyBzdGF0aWMgUHJvdG9jb2wuUmVxdWVzdCB0b1JlcXVlc3QoU3RyaW5nIG9wZXJhdGlvbiwKIAl9CiAKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBBdXRoQ2FjaGUgewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIEFVVEhfQ0FDSEVfRUFHRVJfVElNRU9VVCA9IDEwMDsKKwkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBBVVRIX0NBQ0hFX0VBR0VSX1RJTUVPVVQgPSA1MDA7CiAKIAkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2ltcGxlRGF0ZUZvcm1hdCBJU09fRk9STUFUID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoCiAJCQkJInl5eXktTU0tZGQnVCdISDptbTpzcy5TU1NYIik7IC8vJE5PTi1OTFMtMSQKQEAgLTMzMCw4ICszMDcsOSBAQCBwdWJsaWMgQXV0aENhY2hlKFByb3RvY29sLkV4cGlyaW5nQWN0aW9uIGFjdGlvbikgewogCQkJdGhpcy5jYWNoZWRBY3Rpb24gPSBhY3Rpb247CiAJCQl0cnkgewogCQkJCWlmIChhY3Rpb24uZXhwaXJlc0luICE9IG51bGwgJiYgIWFjdGlvbi5leHBpcmVzSW4uaXNFbXB0eSgpKSB7Ci0JCQkJCXRoaXMudmFsaWRVbnRpbCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpCi0JCQkJCQkJKyBMb25nLnBhcnNlTG9uZyhhY3Rpb24uZXhwaXJlc0luKTsKKwkJCQkJdGhpcy52YWxpZFVudGlsID0gKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpCisJCQkJCQkJKyBMb25nLnBhcnNlTG9uZyhhY3Rpb24uZXhwaXJlc0luKSkKKwkJCQkJCQktIEFVVEhfQ0FDSEVfRUFHRVJfVElNRU9VVDsKIAkJCQl9IGVsc2UgaWYgKGFjdGlvbi5leHBpcmVzQXQgIT0gbnVsbAogCQkJCQkJJiYgIWFjdGlvbi5leHBpcmVzQXQuaXNFbXB0eSgpKSB7CiAJCQkJCXRoaXMudmFsaWRVbnRpbCA9IElTT19GT1JNQVQucGFyc2UoYWN0aW9uLmV4cGlyZXNBdCkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9saWIvQWJicmV2aWF0ZWRMb25nT2JqZWN0SWQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9saWIvQWJicmV2aWF0ZWRMb25nT2JqZWN0SWQuamF2YQppbmRleCA0NTI5YTI1Li5iZGQxYjM5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvbGliL0FiYnJldmlhdGVkTG9uZ09iamVjdElkLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL2xpYi9BYmJyZXZpYXRlZExvbmdPYmplY3RJZC5qYXZhCkBAIC03OCw3ICs3OCw3IEBAIHB1YmxpYyBmaW5hbCBjbGFzcyBBYmJyZXZpYXRlZExvbmdPYmplY3RJZCBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CiAJICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIHRlc3QuCiAJICogQHJldHVybiB0cnVlIGlmIHRoZSBzdHJpbmcgY2FuIGNvbnZlcnRlZCBpbnRvIGFuIEFiYnJldmlhdGVkT2JqZWN0SWQuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzSWQoZmluYWwgU3RyaW5nIGlkKSB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzSWQoU3RyaW5nIGlkKSB7CiAJCWlmIChpZC5sZW5ndGgoKSA8IDIKIAkJCQl8fCBDb25zdGFudHMuTE9OR19PQkpFQ1RfSURfU1RSSU5HX0xFTkdUSCA8IGlkLmxlbmd0aCgpKQogCQkJcmV0dXJuIGZhbHNlOwpAQCAtMTM4LDcgKzEzOCw3IEBAIHB1YmxpYyBzdGF0aWMgZmluYWwgQWJicmV2aWF0ZWRMb25nT2JqZWN0SWQgZnJvbUxvbmdPYmplY3RJZCgKIAkgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gcmVhZCBmcm9tLiBNdXN0IGJlICZsdDs9IDY0IGNoYXJhY3RlcnMuCiAJICogQHJldHVybiB0aGUgY29udmVydGVkIG9iamVjdCBpZC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEFiYnJldmlhdGVkTG9uZ09iamVjdElkIGZyb21TdHJpbmcoZmluYWwgU3RyaW5nIHN0cikgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgQWJicmV2aWF0ZWRMb25nT2JqZWN0SWQgZnJvbVN0cmluZyhTdHJpbmcgc3RyKSB7CiAJCWlmIChzdHIubGVuZ3RoKCkgPiBDb25zdGFudHMuTE9OR19PQkpFQ1RfSURfU1RSSU5HX0xFTkdUSCkKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCiAJCQkJCU1lc3NhZ2VGb3JtYXQuZm9ybWF0KExmc1RleHQuZ2V0KCkuaW52YWxpZExvbmdJZCwgc3RyKSk7CkBAIC0xNzMsNyArMTczLDcgQEAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBoZXhVSW50NjQoZmluYWwgYnl0ZVtdIGJzLCBpbnQgcCwgZmluYWwgaW50IGVuZCkgewogCQlyZXR1cm4gciA8PCAoMTYgLSBuKSAqIDQ7CiAJfQogCi0Jc3RhdGljIGxvbmcgbWFzayhmaW5hbCBpbnQgbmliYmxlcywgZmluYWwgbG9uZyB3b3JkLCBmaW5hbCBsb25nIHYpIHsKKwlzdGF0aWMgbG9uZyBtYXNrKGludCBuaWJibGVzLCBsb25nIHdvcmQsIGxvbmcgdikgewogCQlmaW5hbCBsb25nIGIgPSAod29yZCAtIDEpICogMTY7CiAJCWlmIChiICsgMTYgPD0gbmliYmxlcykgewogCQkJLy8gV2UgaGF2ZSBhbGwgb2YgdGhlIGJpdHMgcmVxdWlyZWQgZm9yIHRoaXMgd29yZC4KQEAgLTI0OSw3ICsyNDksNyBAQCBwdWJsaWMgTG9uZ09iamVjdElkIHRvTG9uZ09iamVjdElkKCkgewogCSAqICAgICAgICAgJmd0OzAgaWYgdGhpcyBhYmJyZXZpYXRpb24gbmFtZXMgYW4gb2JqZWN0IHRoYXQgaXMgYWZ0ZXIKIAkgKiAgICAgICAgIDxjb2RlPm90aGVyPC9jb2RlPi4KIAkgKi8KLQlwdWJsaWMgZmluYWwgaW50IHByZWZpeENvbXBhcmUoZmluYWwgQW55TG9uZ09iamVjdElkIG90aGVyKSB7CisJcHVibGljIGZpbmFsIGludCBwcmVmaXhDb21wYXJlKEFueUxvbmdPYmplY3RJZCBvdGhlcikgewogCQlpbnQgY21wOwogCiAJCWNtcCA9IE5CLmNvbXBhcmVVSW50NjQodzEsIG1hc2soMSwgb3RoZXIudzEpKTsKQEAgLTI4MSw3ICsyODEsNyBAQCBwdWJsaWMgZmluYWwgaW50IHByZWZpeENvbXBhcmUoZmluYWwgQW55TG9uZ09iamVjdElkIG90aGVyKSB7CiAJICogICAgICAgICAmZ3Q7MCBpZiB0aGlzIGFiYnJldmlhdGlvbiBuYW1lcyBhbiBvYmplY3QgdGhhdCBpcyBhZnRlcgogCSAqICAgICAgICAgPGNvZGU+b3RoZXI8L2NvZGU+LgogCSAqLwotCXB1YmxpYyBmaW5hbCBpbnQgcHJlZml4Q29tcGFyZShmaW5hbCBieXRlW10gYnMsIGZpbmFsIGludCBwKSB7CisJcHVibGljIGZpbmFsIGludCBwcmVmaXhDb21wYXJlKGJ5dGVbXSBicywgaW50IHApIHsKIAkJaW50IGNtcDsKIAogCQljbXAgPSBOQi5jb21wYXJlVUludDY0KHcxLCBtYXNrKDEsIE5CLmRlY29kZUludDY0KGJzLCBwKSkpOwpAQCAtMzEzLDcgKzMxMyw3IEBAIHB1YmxpYyBmaW5hbCBpbnQgcHJlZml4Q29tcGFyZShmaW5hbCBieXRlW10gYnMsIGZpbmFsIGludCBwKSB7CiAJICogICAgICAgICAmZ3Q7MCBpZiB0aGlzIGFiYnJldmlhdGlvbiBuYW1lcyBhbiBvYmplY3QgdGhhdCBpcyBhZnRlcgogCSAqICAgICAgICAgPGNvZGU+b3RoZXI8L2NvZGU+LgogCSAqLwotCXB1YmxpYyBmaW5hbCBpbnQgcHJlZml4Q29tcGFyZShmaW5hbCBsb25nW10gYnMsIGZpbmFsIGludCBwKSB7CisJcHVibGljIGZpbmFsIGludCBwcmVmaXhDb21wYXJlKGxvbmdbXSBicywgaW50IHApIHsKIAkJaW50IGNtcDsKIAogCQljbXAgPSBOQi5jb21wYXJlVUludDY0KHcxLCBtYXNrKDEsIGJzW3BdKSk7CkBAIC0zNDAsNyArMzQwLDcgQEAgcHVibGljIGZpbmFsIGludCBnZXRGaXJzdEJ5dGUoKSB7CiAJCXJldHVybiAoaW50KSAodzEgPj4+IDU2KTsKIAl9CiAKLQlwcml2YXRlIGxvbmcgbWFzayhmaW5hbCBsb25nIHdvcmQsIGZpbmFsIGxvbmcgdikgeworCXByaXZhdGUgbG9uZyBtYXNrKGxvbmcgd29yZCwgbG9uZyB2KSB7CiAJCXJldHVybiBtYXNrKG5pYmJsZXMsIHdvcmQsIHYpOwogCX0KIApAQCAtMzUyLDcgKzM1Miw3IEBAIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhmaW5hbCBPYmplY3QgbykgeworCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewogCQlpZiAobyBpbnN0YW5jZW9mIEFiYnJldmlhdGVkTG9uZ09iamVjdElkKSB7CiAJCQlmaW5hbCBBYmJyZXZpYXRlZExvbmdPYmplY3RJZCBiID0gKEFiYnJldmlhdGVkTG9uZ09iamVjdElkKSBvOwogCQkJcmV0dXJuIG5pYmJsZXMgPT0gYi5uaWJibGVzICYmIHcxID09IGIudzEgJiYgdzIgPT0gYi53MgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL2xpYi9BbnlMb25nT2JqZWN0SWQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9saWIvQW55TG9uZ09iamVjdElkLmphdmEKaW5kZXggOTZkNjkzOC4uMDc4ODkyMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL2xpYi9BbnlMb25nT2JqZWN0SWQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvbGliL0FueUxvbmdPYmplY3RJZC5qYXZhCkBAIC0xNzAsNyArMTcwLDcgQEAgcHVibGljIGZpbmFsIGludCBnZXRCeXRlKGludCBpbmRleCkgewogCSAqIENvbXBhcmUgdGhpcyBMb25nT2JqZWN0SWQgdG8gYW5vdGhlciBhbmQgb2J0YWluIGEgc29ydCBvcmRlcmluZy4KIAkgKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgZmluYWwgaW50IGNvbXBhcmVUbyhmaW5hbCBBbnlMb25nT2JqZWN0SWQgb3RoZXIpIHsKKwlwdWJsaWMgZmluYWwgaW50IGNvbXBhcmVUbyhBbnlMb25nT2JqZWN0SWQgb3RoZXIpIHsKIAkJaWYgKHRoaXMgPT0gb3RoZXIpCiAJCQlyZXR1cm4gMDsKIApAQCAtMjAyLDcgKzIwMiw3IEBAIHB1YmxpYyBmaW5hbCBpbnQgY29tcGFyZVRvKGZpbmFsIEFueUxvbmdPYmplY3RJZCBvdGhlcikgewogCSAqIEByZXR1cm4gYSBuZWdhdGl2ZSBpbnRlZ2VyLCB6ZXJvLCBvciBhIHBvc2l0aXZlIGludGVnZXIgYXMgdGhpcyBvYmplY3QgaXMKIAkgKiAgICAgICAgIGxlc3MgdGhhbiwgZXF1YWwgdG8sIG9yIGdyZWF0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIG9iamVjdC4KIAkgKi8KLQlwdWJsaWMgZmluYWwgaW50IGNvbXBhcmVUbyhmaW5hbCBieXRlW10gYnMsIGZpbmFsIGludCBwKSB7CisJcHVibGljIGZpbmFsIGludCBjb21wYXJlVG8oYnl0ZVtdIGJzLCBpbnQgcCkgewogCQlpbnQgY21wOwogCiAJCWNtcCA9IE5CLmNvbXBhcmVVSW50NjQodzEsIE5CLmRlY29kZUludDY0KGJzLCBwKSk7CkBAIC0yMzEsNyArMjMxLDcgQEAgcHVibGljIGZpbmFsIGludCBjb21wYXJlVG8oZmluYWwgYnl0ZVtdIGJzLCBmaW5hbCBpbnQgcCkgewogCSAqIEByZXR1cm4gYSBuZWdhdGl2ZSBpbnRlZ2VyLCB6ZXJvLCBvciBhIHBvc2l0aXZlIGludGVnZXIgYXMgdGhpcyBvYmplY3QgaXMKIAkgKiAgICAgICAgIGxlc3MgdGhhbiwgZXF1YWwgdG8sIG9yIGdyZWF0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIG9iamVjdC4KIAkgKi8KLQlwdWJsaWMgZmluYWwgaW50IGNvbXBhcmVUbyhmaW5hbCBsb25nW10gYnMsIGZpbmFsIGludCBwKSB7CisJcHVibGljIGZpbmFsIGludCBjb21wYXJlVG8obG9uZ1tdIGJzLCBpbnQgcCkgewogCQlpbnQgY21wOwogCiAJCWNtcCA9IE5CLmNvbXBhcmVVSW50NjQodzEsIGJzW3BdKTsKQEAgLTI1Nyw3ICsyNTcsNyBAQCBwdWJsaWMgZmluYWwgaW50IGNvbXBhcmVUbyhmaW5hbCBsb25nW10gYnMsIGZpbmFsIGludCBwKSB7CiAJICogQHJldHVybiB0cnVlIGlmIHRoaXMgTG9uZ09iamVjdElkIGJlZ2lucyB3aXRoIHRoZSBhYmJyZXZpYXRpb247IGVsc2UKIAkgKiAgICAgICAgIGZhbHNlLgogCSAqLwotCXB1YmxpYyBib29sZWFuIHN0YXJ0c1dpdGgoZmluYWwgQWJicmV2aWF0ZWRMb25nT2JqZWN0SWQgYWJicikgeworCXB1YmxpYyBib29sZWFuIHN0YXJ0c1dpdGgoQWJicmV2aWF0ZWRMb25nT2JqZWN0SWQgYWJicikgewogCQlyZXR1cm4gYWJici5wcmVmaXhDb21wYXJlKHRoaXMpID09IDA7CiAJfQogCkBAIC0yNzQsMTMgKzI3NCwxMyBAQCBwdWJsaWMgZmluYWwgaW50IGhhc2hDb2RlKCkgewogCSAqICAgICAgICAgICAgdGhlIG90aGVyIGlkIHRvIGNvbXBhcmUgdG8uIE1heSBiZSBudWxsLgogCSAqIEByZXR1cm4gdHJ1ZSBvbmx5IGlmIGJvdGggTG9uZ09iamVjdElkcyBoYXZlIGlkZW50aWNhbCBiaXRzLgogCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGVxdWFscyhmaW5hbCBBbnlMb25nT2JqZWN0SWQgb3RoZXIpIHsKKwlwdWJsaWMgZmluYWwgYm9vbGVhbiBlcXVhbHMoQW55TG9uZ09iamVjdElkIG90aGVyKSB7CiAJCXJldHVybiBvdGhlciAhPSBudWxsID8gZXF1YWxzKHRoaXMsIG90aGVyKSA6IGZhbHNlOwogCX0KIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gZXF1YWxzKGZpbmFsIE9iamVjdCBvKSB7CisJcHVibGljIGZpbmFsIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CiAJCWlmIChvIGluc3RhbmNlb2YgQW55TG9uZ09iamVjdElkKQogCQkJcmV0dXJuIGVxdWFscygoQW55TG9uZ09iamVjdElkKSBvKTsKIAkJZWxzZQpAQCAtMjkzLDcgKzI5Myw3IEBAIHB1YmxpYyBmaW5hbCBib29sZWFuIGVxdWFscyhmaW5hbCBPYmplY3QgbykgewogCSAqIEBwYXJhbSB3CiAJICogICAgICAgICAgICB0aGUgYnVmZmVyIHRvIGNvcHkgdG8uIE11c3QgYmUgaW4gYmlnIGVuZGlhbiBvcmRlci4KIAkgKi8KLQlwdWJsaWMgdm9pZCBjb3B5UmF3VG8oZmluYWwgQnl0ZUJ1ZmZlciB3KSB7CisJcHVibGljIHZvaWQgY29weVJhd1RvKEJ5dGVCdWZmZXIgdykgewogCQl3LnB1dExvbmcodzEpOwogCQl3LnB1dExvbmcodzIpOwogCQl3LnB1dExvbmcodzMpOwpAQCAtMzA4LDcgKzMwOCw3IEBAIHB1YmxpYyB2b2lkIGNvcHlSYXdUbyhmaW5hbCBCeXRlQnVmZmVyIHcpIHsKIAkgKiBAcGFyYW0gbwogCSAqICAgICAgICAgICAgdGhlIG9mZnNldCB3aXRoaW4gYiB0byB3cml0ZSBhdC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBjb3B5UmF3VG8oZmluYWwgYnl0ZVtdIGIsIGZpbmFsIGludCBvKSB7CisJcHVibGljIHZvaWQgY29weVJhd1RvKGJ5dGVbXSBiLCBpbnQgbykgewogCQlOQi5lbmNvZGVJbnQ2NChiLCBvLCB3MSk7CiAJCU5CLmVuY29kZUludDY0KGIsIG8gKyA4LCB3Mik7CiAJCU5CLmVuY29kZUludDY0KGIsIG8gKyAxNiwgdzMpOwpAQCAtMzIzLDcgKzMyMyw3IEBAIHB1YmxpYyB2b2lkIGNvcHlSYXdUbyhmaW5hbCBieXRlW10gYiwgZmluYWwgaW50IG8pIHsKIAkgKiBAcGFyYW0gbwogCSAqICAgICAgICAgICAgdGhlIG9mZnNldCB3aXRoaW4gYiB0byB3cml0ZSBhdC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBjb3B5UmF3VG8oZmluYWwgbG9uZ1tdIGIsIGZpbmFsIGludCBvKSB7CisJcHVibGljIHZvaWQgY29weVJhd1RvKGxvbmdbXSBiLCBpbnQgbykgewogCQliW29dID0gdzE7CiAJCWJbbyArIDFdID0gdzI7CiAJCWJbbyArIDJdID0gdzM7CkBAIC0zMzgsMTQgKzMzOCwxNCBAQCBwdWJsaWMgdm9pZCBjb3B5UmF3VG8oZmluYWwgbG9uZ1tdIGIsIGZpbmFsIGludCBvKSB7CiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgdGhlIHN0cmVhbSB3cml0aW5nIGZhaWxlZC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBjb3B5UmF3VG8oZmluYWwgT3V0cHV0U3RyZWFtIHcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIHZvaWQgY29weVJhd1RvKE91dHB1dFN0cmVhbSB3KSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl3cml0ZVJhd0xvbmcodywgdzEpOwogCQl3cml0ZVJhd0xvbmcodywgdzIpOwogCQl3cml0ZVJhd0xvbmcodywgdzMpOwogCQl3cml0ZVJhd0xvbmcodywgdzQpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVSYXdMb25nKGZpbmFsIE91dHB1dFN0cmVhbSB3LCBsb25nIHYpCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZVJhd0xvbmcoT3V0cHV0U3RyZWFtIHcsIGxvbmcgdikKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXcud3JpdGUoKGludCkgKHYgPj4+IDU2KSk7CiAJCXcud3JpdGUoKGludCkgKHYgPj4+IDQ4KSk7CkBAIC0zNjUsNyArMzY1LDcgQEAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZVJhd0xvbmcoZmluYWwgT3V0cHV0U3RyZWFtIHcsIGxvbmcgdikKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0aGUgc3RyZWFtIHdyaXRpbmcgZmFpbGVkLgogCSAqLwotCXB1YmxpYyB2b2lkIGNvcHlUbyhmaW5hbCBPdXRwdXRTdHJlYW0gdykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgdm9pZCBjb3B5VG8oT3V0cHV0U3RyZWFtIHcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXcud3JpdGUodG9IZXhCeXRlQXJyYXkoKSk7CiAJfQogCkBAIC00MDYsNyArNDA2LDcgQEAgcHVibGljIHZvaWQgY29weVRvKEJ5dGVCdWZmZXIgYikgewogCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBoZXhieXRlID0geyAnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsCiAJCQknNycsICc4JywgJzknLCAnYScsICdiJywgJ2MnLCAnZCcsICdlJywgJ2YnIH07CiAKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGZvcm1hdEhleEJ5dGUoZmluYWwgYnl0ZVtdIGRzdCwgZmluYWwgaW50IHAsIGxvbmcgdykgeworCXByaXZhdGUgc3RhdGljIHZvaWQgZm9ybWF0SGV4Qnl0ZShieXRlW10gZHN0LCBpbnQgcCwgbG9uZyB3KSB7CiAJCWludCBvID0gcCArIDE1OwogCQl3aGlsZSAobyA+PSBwICYmIHcgIT0gMCkgewogCQkJZHN0W28tLV0gPSBoZXhieXRlWyhpbnQpICh3ICYgMHhmKV07CkBAIC00MjQsNyArNDI0LDcgQEAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBmb3JtYXRIZXhCeXRlKGZpbmFsIGJ5dGVbXSBkc3QsIGZpbmFsIGludCBwLCBsb25nIHcpIHsKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0aGUgc3RyZWFtIHdyaXRpbmcgZmFpbGVkLgogCSAqLwotCXB1YmxpYyB2b2lkIGNvcHlUbyhmaW5hbCBXcml0ZXIgdykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgdm9pZCBjb3B5VG8oV3JpdGVyIHcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXcud3JpdGUodG9IZXhDaGFyQXJyYXkoKSk7CiAJfQogCkBAIC00NDAsNyArNDQwLDcgQEAgcHVibGljIHZvaWQgY29weVRvKGZpbmFsIFdyaXRlciB3KSB0aHJvd3MgSU9FeGNlcHRpb24gewogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHRoZSBzdHJlYW0gd3JpdGluZyBmYWlsZWQuCiAJICovCi0JcHVibGljIHZvaWQgY29weVRvKGZpbmFsIGNoYXJbXSB0bXAsIGZpbmFsIFdyaXRlciB3KSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyB2b2lkIGNvcHlUbyhjaGFyW10gdG1wLCBXcml0ZXIgdykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJdG9IZXhDaGFyQXJyYXkodG1wKTsKIAkJdy53cml0ZSh0bXAsIDAsIENvbnN0YW50cy5MT05HX09CSkVDVF9JRF9TVFJJTkdfTEVOR1RIKTsKIAl9CkBAIC00NTUsNyArNDU1LDcgQEAgcHVibGljIHZvaWQgY29weVRvKGZpbmFsIGNoYXJbXSB0bXAsIGZpbmFsIFdyaXRlciB3KSB0aHJvd3MgSU9FeGNlcHRpb24gewogCSAqIEBwYXJhbSB3CiAJICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIGFwcGVuZCBvbnRvLgogCSAqLwotCXB1YmxpYyB2b2lkIGNvcHlUbyhmaW5hbCBjaGFyW10gdG1wLCBmaW5hbCBTdHJpbmdCdWlsZGVyIHcpIHsKKwlwdWJsaWMgdm9pZCBjb3B5VG8oY2hhcltdIHRtcCwgU3RyaW5nQnVpbGRlciB3KSB7CiAJCXRvSGV4Q2hhckFycmF5KHRtcCk7CiAJCXcuYXBwZW5kKHRtcCwgMCwgQ29uc3RhbnRzLkxPTkdfT0JKRUNUX0lEX1NUUklOR19MRU5HVEgpOwogCX0KQEAgLTQ2Niw3ICs0NjYsNyBAQCBwdWJsaWMgdm9pZCBjb3B5VG8oZmluYWwgY2hhcltdIHRtcCwgZmluYWwgU3RyaW5nQnVpbGRlciB3KSB7CiAJCXJldHVybiBkc3Q7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHRvSGV4Q2hhckFycmF5KGZpbmFsIGNoYXJbXSBkc3QpIHsKKwlwcml2YXRlIHZvaWQgdG9IZXhDaGFyQXJyYXkoY2hhcltdIGRzdCkgewogCQlmb3JtYXRIZXhDaGFyKGRzdCwgMCwgdzEpOwogCQlmb3JtYXRIZXhDaGFyKGRzdCwgMTYsIHcyKTsKIAkJZm9ybWF0SGV4Q2hhcihkc3QsIDMyLCB3Myk7CkBAIC00NzYsNyArNDc2LDcgQEAgcHJpdmF0ZSB2b2lkIHRvSGV4Q2hhckFycmF5KGZpbmFsIGNoYXJbXSBkc3QpIHsKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gaGV4Y2hhciA9IHsgJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLAogCQkJJzcnLCAnOCcsICc5JywgJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJyB9OwogCi0Jc3RhdGljIHZvaWQgZm9ybWF0SGV4Q2hhcihmaW5hbCBjaGFyW10gZHN0LCBmaW5hbCBpbnQgcCwgbG9uZyB3KSB7CisJc3RhdGljIHZvaWQgZm9ybWF0SGV4Q2hhcihjaGFyW10gZHN0LCBpbnQgcCwgbG9uZyB3KSB7CiAJCWludCBvID0gcCArIDE1OwogCQl3aGlsZSAobyA+PSBwICYmIHcgIT0gMCkgewogCQkJZHN0W28tLV0gPSBoZXhjaGFyWyhpbnQpICh3ICYgMHhmKV07CkBAIC01MjQsNyArNTI0LDcgQEAgcHVibGljIGZpbmFsIFN0cmluZyBnZXROYW1lKCkgewogCSAqICAgICAgICAgICAgbGVuZ3RoIG9mIHRoZSBhYmJyZXZpYXRlZCBzdHJpbmcuCiAJICogQHJldHVybiBTSEEtMjU2IGFiYnJldmlhdGlvbi4KIAkgKi8KLQlwdWJsaWMgQWJicmV2aWF0ZWRMb25nT2JqZWN0SWQgYWJicmV2aWF0ZShmaW5hbCBpbnQgbGVuKSB7CisJcHVibGljIEFiYnJldmlhdGVkTG9uZ09iamVjdElkIGFiYnJldmlhdGUoaW50IGxlbikgewogCQlmaW5hbCBsb25nIGEgPSBBYmJyZXZpYXRlZExvbmdPYmplY3RJZC5tYXNrKGxlbiwgMSwgdzEpOwogCQlmaW5hbCBsb25nIGIgPSBBYmJyZXZpYXRlZExvbmdPYmplY3RJZC5tYXNrKGxlbiwgMiwgdzIpOwogCQlmaW5hbCBsb25nIGMgPSBBYmJyZXZpYXRlZExvbmdPYmplY3RJZC5tYXNrKGxlbiwgMywgdzMpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL2xpYi9Mb25nT2JqZWN0SWQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9saWIvTG9uZ09iamVjdElkLmphdmEKaW5kZXggZWMxZTE3OS4uODE1OTU3NiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL2xpYi9Mb25nT2JqZWN0SWQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvbGliL0xvbmdPYmplY3RJZC5qYXZhCkBAIC05MCw3ICs5MCw3IEBAIHB1YmxpYyBzdGF0aWMgZmluYWwgTG9uZ09iamVjdElkIHplcm9JZCgpIHsKIAkgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gdGVzdC4KIAkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHN0cmluZyBjYW4gY29udmVydGVkIGludG8gYW4gTG9uZ09iamVjdElkLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc0lkKGZpbmFsIFN0cmluZyBpZCkgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc0lkKFN0cmluZyBpZCkgewogCQlpZiAoaWQubGVuZ3RoKCkgIT0gQ29uc3RhbnRzLkxPTkdfT0JKRUNUX0lEX1NUUklOR19MRU5HVEgpCiAJCQlyZXR1cm4gZmFsc2U7CiAJCXRyeSB7CkBAIC0xMTAsNyArMTEwLDcgQEAgcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzSWQoZmluYWwgU3RyaW5nIGlkKSB7CiAJICogICAgICAgICAgICB0aGUgaWQgdG8gY29udmVydC4gTWF5IGJlIG51bGwuCiAJICogQHJldHVybiB0aGUgaGV4IHN0cmluZyBjb252ZXJzaW9uIG9mIHRoaXMgaWQncyBjb250ZW50LgogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIHRvU3RyaW5nKGZpbmFsIExvbmdPYmplY3RJZCBpKSB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgdG9TdHJpbmcoTG9uZ09iamVjdElkIGkpIHsKIAkJcmV0dXJuIGkgIT0gbnVsbCA/IGkubmFtZSgpIDogWkVST0lEX1NUUjsKIAl9CiAKQEAgLTE3Myw3ICsxNzMsNyBAQCBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIGJ5dGVbXSBmaXJzdEJ1ZmZlciwgZmluYWwgaW50IGZpLAogCSAqICAgICAgICAgICAgYXZhaWxhYmxlIHdpdGhpbiB0aGlzIGJ5dGUgYXJyYXkuCiAJICogQHJldHVybiB0aGUgY29udmVydGVkIG9iamVjdCBpZC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExvbmdPYmplY3RJZCBmcm9tUmF3KGZpbmFsIGJ5dGVbXSBicykgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgTG9uZ09iamVjdElkIGZyb21SYXcoYnl0ZVtdIGJzKSB7CiAJCXJldHVybiBmcm9tUmF3KGJzLCAwKTsKIAl9CiAKQEAgLTE4Nyw3ICsxODcsNyBAQCBwdWJsaWMgc3RhdGljIGZpbmFsIExvbmdPYmplY3RJZCBmcm9tUmF3KGZpbmFsIGJ5dGVbXSBicykgewogCSAqICAgICAgICAgICAgcG9zaXRpb24gdG8gcmVhZCB0aGUgZmlyc3QgYnl0ZSBvZiBkYXRhIGZyb20uCiAJICogQHJldHVybiB0aGUgY29udmVydGVkIG9iamVjdCBpZC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExvbmdPYmplY3RJZCBmcm9tUmF3KGZpbmFsIGJ5dGVbXSBicywgZmluYWwgaW50IHApIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIExvbmdPYmplY3RJZCBmcm9tUmF3KGJ5dGVbXSBicywgaW50IHApIHsKIAkJZmluYWwgbG9uZyBhID0gTkIuZGVjb2RlSW50NjQoYnMsIHApOwogCQlmaW5hbCBsb25nIGIgPSBOQi5kZWNvZGVJbnQ2NChicywgcCArIDgpOwogCQlmaW5hbCBsb25nIGMgPSBOQi5kZWNvZGVJbnQ2NChicywgcCArIDE2KTsKQEAgLTIwMyw3ICsyMDMsNyBAQCBwdWJsaWMgc3RhdGljIGZpbmFsIExvbmdPYmplY3RJZCBmcm9tUmF3KGZpbmFsIGJ5dGVbXSBicywgZmluYWwgaW50IHApIHsKIAkgKiAgICAgICAgICAgIGF2YWlsYWJsZSB3aXRoaW4gdGhpcyBsb25nIGFycmF5LgogCSAqIEByZXR1cm4gdGhlIGNvbnZlcnRlZCBvYmplY3QgaWQuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMb25nT2JqZWN0SWQgZnJvbVJhdyhmaW5hbCBsb25nW10gaXMpIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIExvbmdPYmplY3RJZCBmcm9tUmF3KGxvbmdbXSBpcykgewogCQlyZXR1cm4gZnJvbVJhdyhpcywgMCk7CiAJfQogCkBAIC0yMTcsNyArMjE3LDcgQEAgcHVibGljIHN0YXRpYyBmaW5hbCBMb25nT2JqZWN0SWQgZnJvbVJhdyhmaW5hbCBsb25nW10gaXMpIHsKIAkgKiAgICAgICAgICAgIHBvc2l0aW9uIHRvIHJlYWQgdGhlIGZpcnN0IGxvbmcgb2YgZGF0YSBmcm9tLgogCSAqIEByZXR1cm4gdGhlIGNvbnZlcnRlZCBvYmplY3QgaWQuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMb25nT2JqZWN0SWQgZnJvbVJhdyhmaW5hbCBsb25nW10gaXMsIGZpbmFsIGludCBwKSB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBMb25nT2JqZWN0SWQgZnJvbVJhdyhsb25nW10gaXMsIGludCBwKSB7CiAJCXJldHVybiBuZXcgTG9uZ09iamVjdElkKGlzW3BdLCBpc1twICsgMV0sIGlzW3AgKyAyXSwgaXNbcCArIDNdKTsKIAl9CiAKQEAgLTIzMSw3ICsyMzEsNyBAQCBwdWJsaWMgc3RhdGljIGZpbmFsIExvbmdPYmplY3RJZCBmcm9tUmF3KGZpbmFsIGxvbmdbXSBpcywgZmluYWwgaW50IHApIHsKIAkgKiAgICAgICAgICAgIHBvc2l0aW9uIHRvIHJlYWQgdGhlIGZpcnN0IGNoYXJhY3RlciBmcm9tLgogCSAqIEByZXR1cm4gdGhlIGNvbnZlcnRlZCBvYmplY3QgaWQuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMb25nT2JqZWN0SWQgZnJvbVN0cmluZyhmaW5hbCBieXRlW10gYnVmLCBmaW5hbCBpbnQgb2Zmc2V0KSB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBMb25nT2JqZWN0SWQgZnJvbVN0cmluZyhieXRlW10gYnVmLCBpbnQgb2Zmc2V0KSB7CiAJCXJldHVybiBmcm9tSGV4U3RyaW5nKGJ1Ziwgb2Zmc2V0KTsKIAl9CiAKQEAgLTI0MiwxNCArMjQyLDE0IEBAIHB1YmxpYyBzdGF0aWMgZmluYWwgTG9uZ09iamVjdElkIGZyb21TdHJpbmcoZmluYWwgYnl0ZVtdIGJ1ZiwgZmluYWwgaW50IG9mZnNldCkKIAkgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gcmVhZCBmcm9tLiBNdXN0IGJlIDY0IGNoYXJhY3RlcnMgbG9uZy4KIAkgKiBAcmV0dXJuIHRoZSBjb252ZXJ0ZWQgb2JqZWN0IGlkLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgTG9uZ09iamVjdElkIGZyb21TdHJpbmcoZmluYWwgU3RyaW5nIHN0cikgeworCXB1YmxpYyBzdGF0aWMgTG9uZ09iamVjdElkIGZyb21TdHJpbmcoU3RyaW5nIHN0cikgewogCQlpZiAoc3RyLmxlbmd0aCgpICE9IENvbnN0YW50cy5MT05HX09CSkVDVF9JRF9TVFJJTkdfTEVOR1RIKQogCQkJdGhyb3cgbmV3IEludmFsaWRMb25nT2JqZWN0SWRFeGNlcHRpb24oc3RyKTsKIAkJcmV0dXJuIGZyb21IZXhTdHJpbmcob3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLmVuY29kZUFTQ0lJKHN0ciksCiAJCQkJMCk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9uZ09iamVjdElkIGZyb21IZXhTdHJpbmcoZmluYWwgYnl0ZVtdIGJzLCBpbnQgcCkgeworCXByaXZhdGUgc3RhdGljIGZpbmFsIExvbmdPYmplY3RJZCBmcm9tSGV4U3RyaW5nKGJ5dGVbXSBicywgaW50IHApIHsKIAkJdHJ5IHsKIAkJCWZpbmFsIGxvbmcgYSA9IFJhd1BhcnNlVXRpbHMucGFyc2VIZXhJbnQ2NChicywgcCk7CiAJCQlmaW5hbCBsb25nIGIgPSBSYXdQYXJzZVV0aWxzLnBhcnNlSGV4SW50NjQoYnMsIHAgKyAxNik7CkBAIC0yODAsNyArMjgwLDcgQEAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9uZ09iamVjdElkIGZyb21IZXhTdHJpbmcoZmluYWwgYnl0ZVtdIGJzLCBpbnQgcCkgewogCSAqIEBwYXJhbSBzcmMKIAkgKiAgICAgICAgICAgIGFub3RoZXIgYWxyZWFkeSBwYXJzZWQgTG9uZ09iamVjdElkIHRvIGNvcHkgdGhlIHZhbHVlIG91dCBvZi4KIAkgKi8KLQlwcm90ZWN0ZWQgTG9uZ09iamVjdElkKGZpbmFsIEFueUxvbmdPYmplY3RJZCBzcmMpIHsKKwlwcm90ZWN0ZWQgTG9uZ09iamVjdElkKEFueUxvbmdPYmplY3RJZCBzcmMpIHsKIAkJdzEgPSBzcmMudzE7CiAJCXcyID0gc3JjLncyOwogCQl3MyA9IHNyYy53MzsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9saWIvTXV0YWJsZUxvbmdPYmplY3RJZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL2xpYi9NdXRhYmxlTG9uZ09iamVjdElkLmphdmEKaW5kZXggN2IwYzQ5NC4uM2Q2MjQ5MCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL2xpYi9NdXRhYmxlTG9uZ09iamVjdElkLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL2xpYi9NdXRhYmxlTG9uZ09iamVjdElkLmphdmEKQEAgLTE2Nyw3ICsxNjcsNyBAQCBwdWJsaWMgdm9pZCBmcm9tT2JqZWN0SWQoQW55TG9uZ09iamVjdElkIHNyYykgewogCSAqICAgICAgICAgICAgdGhlIHJhdyBieXRlIGJ1ZmZlciB0byByZWFkIGZyb20uIEF0IGxlYXN0IDMyIGJ5dGVzIG11c3QgYmUKIAkgKiAgICAgICAgICAgIGF2YWlsYWJsZSB3aXRoaW4gdGhpcyBieXRlIGFycmF5LgogCSAqLwotCXB1YmxpYyB2b2lkIGZyb21SYXcoZmluYWwgYnl0ZVtdIGJzKSB7CisJcHVibGljIHZvaWQgZnJvbVJhdyhieXRlW10gYnMpIHsKIAkJZnJvbVJhdyhicywgMCk7CiAJfQogCkBAIC0xODAsNyArMTgwLDcgQEAgcHVibGljIHZvaWQgZnJvbVJhdyhmaW5hbCBieXRlW10gYnMpIHsKIAkgKiBAcGFyYW0gcAogCSAqICAgICAgICAgICAgcG9zaXRpb24gdG8gcmVhZCB0aGUgZmlyc3QgYnl0ZSBvZiBkYXRhIGZyb20uCiAJICovCi0JcHVibGljIHZvaWQgZnJvbVJhdyhmaW5hbCBieXRlW10gYnMsIGZpbmFsIGludCBwKSB7CisJcHVibGljIHZvaWQgZnJvbVJhdyhieXRlW10gYnMsIGludCBwKSB7CiAJCXcxID0gTkIuZGVjb2RlSW50NjQoYnMsIHApOwogCQl3MiA9IE5CLmRlY29kZUludDY0KGJzLCBwICsgOCk7CiAJCXczID0gTkIuZGVjb2RlSW50NjQoYnMsIHAgKyAxNik7CkBAIC0xOTQsNyArMTk0LDcgQEAgcHVibGljIHZvaWQgZnJvbVJhdyhmaW5hbCBieXRlW10gYnMsIGZpbmFsIGludCBwKSB7CiAJICogICAgICAgICAgICB0aGUgcmF3IGxvbmcgYnVmZmVyIHRvIHJlYWQgZnJvbS4gQXQgbGVhc3QgNCBsb25ncyBtdXN0IGJlCiAJICogICAgICAgICAgICBhdmFpbGFibGUgd2l0aGluIHRoaXMgbG9uZ3MgYXJyYXkuCiAJICovCi0JcHVibGljIHZvaWQgZnJvbVJhdyhmaW5hbCBsb25nW10gbG9uZ3MpIHsKKwlwdWJsaWMgdm9pZCBmcm9tUmF3KGxvbmdbXSBsb25ncykgewogCQlmcm9tUmF3KGxvbmdzLCAwKTsKIAl9CiAKQEAgLTIwNyw3ICsyMDcsNyBAQCBwdWJsaWMgdm9pZCBmcm9tUmF3KGZpbmFsIGxvbmdbXSBsb25ncykgewogCSAqIEBwYXJhbSBwCiAJICogICAgICAgICAgICBwb3NpdGlvbiB0byByZWFkIHRoZSBmaXJzdCBpbnRlZ2VyIG9mIGRhdGEgZnJvbS4KIAkgKi8KLQlwdWJsaWMgdm9pZCBmcm9tUmF3KGZpbmFsIGxvbmdbXSBsb25ncywgZmluYWwgaW50IHApIHsKKwlwdWJsaWMgdm9pZCBmcm9tUmF3KGxvbmdbXSBsb25ncywgaW50IHApIHsKIAkJdzEgPSBsb25nc1twXTsKIAkJdzIgPSBsb25nc1twICsgMV07CiAJCXczID0gbG9uZ3NbcCArIDJdOwpAQCAtMjIzLDcgKzIyMyw3IEBAIHB1YmxpYyB2b2lkIGZyb21SYXcoZmluYWwgbG9uZ1tdIGxvbmdzLCBmaW5hbCBpbnQgcCkgewogCSAqIEBwYXJhbSBvZmZzZXQKIAkgKiAgICAgICAgICAgIHBvc2l0aW9uIHRvIHJlYWQgdGhlIGZpcnN0IGNoYXJhY3RlciBmcm9tLgogCSAqLwotCXB1YmxpYyB2b2lkIGZyb21TdHJpbmcoZmluYWwgYnl0ZVtdIGJ1ZiwgZmluYWwgaW50IG9mZnNldCkgeworCXB1YmxpYyB2b2lkIGZyb21TdHJpbmcoYnl0ZVtdIGJ1ZiwgaW50IG9mZnNldCkgewogCQlmcm9tSGV4U3RyaW5nKGJ1Ziwgb2Zmc2V0KTsKIAl9CiAKQEAgLTIzMywxNCArMjMzLDE0IEBAIHB1YmxpYyB2b2lkIGZyb21TdHJpbmcoZmluYWwgYnl0ZVtdIGJ1ZiwgZmluYWwgaW50IG9mZnNldCkgewogCSAqIEBwYXJhbSBzdHIKIAkgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gcmVhZCBmcm9tLiBNdXN0IGJlIDY0IGNoYXJhY3RlcnMgbG9uZy4KIAkgKi8KLQlwdWJsaWMgdm9pZCBmcm9tU3RyaW5nKGZpbmFsIFN0cmluZyBzdHIpIHsKKwlwdWJsaWMgdm9pZCBmcm9tU3RyaW5nKFN0cmluZyBzdHIpIHsKIAkJaWYgKHN0ci5sZW5ndGgoKSAhPSBDb25zdGFudHMuTE9OR19PQkpFQ1RfSURfU1RSSU5HX0xFTkdUSCkKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCiAJCQkJCU1lc3NhZ2VGb3JtYXQuZm9ybWF0KExmc1RleHQuZ2V0KCkuaW52YWxpZExvbmdJZCwgc3RyKSk7CiAJCWZyb21IZXhTdHJpbmcob3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLmVuY29kZUFTQ0lJKHN0ciksIDApOwogCX0KIAotCXByaXZhdGUgdm9pZCBmcm9tSGV4U3RyaW5nKGZpbmFsIGJ5dGVbXSBicywgaW50IHApIHsKKwlwcml2YXRlIHZvaWQgZnJvbUhleFN0cmluZyhieXRlW10gYnMsIGludCBwKSB7CiAJCXRyeSB7CiAJCQl3MSA9IFJhd1BhcnNlVXRpbHMucGFyc2VIZXhJbnQ2NChicywgcCk7CiAJCQl3MiA9IFJhd1BhcnNlVXRpbHMucGFyc2VIZXhJbnQ2NChicywgcCArIDE2KTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmluZGV4IDM2OWUzMDcuLjE2OWVmN2UgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpAQCAtMzUsMTI1ICszNSwxNDMgQEAKICMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgogbGljZW5zZT1cCiBFY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnRcblwKLUFwcmlsIDksIDIwMTRcblwKK1xuXAorTm92ZW1iZXIgMjIsIDIwMTdcblwKIFxuXAogVXNhZ2UgT2YgQ29udGVudFxuXAogXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKK1RIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTlxuXAorQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiBVU0UgT0ZcblwKK1RIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFXG5cCitURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAorQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRFxuXAorQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFXG5cCitBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCitURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWVxuXAorQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1VcblwKK01BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAogXG5cCiBBcHBsaWNhYmxlIExpY2Vuc2VzXG5cCiBcblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGVcblwKLUVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mXG5cCi10aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpc1xuXAotcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCitVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAoraXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZVxuXAorVmVyc2lvbiAyLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc29cblwKK2F2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLFxuXAorIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKIFxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGVcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gc29mdHdhcmUgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAorQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb25cblwKK2FuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGUgcmVwb3NpdG9yeVxuXAorKCJSZXBvc2l0b3J5IikgaW4gc29mdHdhcmUgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGUgYXNcblwKK2Rvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAogXG5cCi0gICAgICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgICAgICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YShUTSkgQVJjaGl2ZSlcblwKLSAgICAgICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgICAgICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgICAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKKy0gICBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZVxuXAorICAgIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heVxuXAorICAgIGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmRcblwKKyAgICBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCistICAgRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSXG5cCisgICAgKEphdmHihKIgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAorLSAgIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZFxuXAorICAgIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGFcblwKKyAgICBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXlcblwKKyAgICBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yXG5cCisgICAgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCistICAgRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhXG5cCisgICAgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZFxuXAorICAgIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKIFxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCitUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpblxuXAorZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXNcblwKK2FuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiXG5cCisoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueVxuXAorZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmdcblwKK2xvY2F0aW9uczpcblwKIFxuXAotICAgICAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAgICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgICAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgICAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgICAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAorLSAgIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAorLSAgIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCistICAgSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAorLSAgIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKKy0gICBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCiBcblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLVByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBcblwKLVVwZGF0ZSBMaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIiBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLlxuXAotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZVxuXAotdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdFxuXAotZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCitOb3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmdcblwKK3RoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZVxuXAorKCJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmVcblwKK2NvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCit3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3VcblwKK3doZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiXG5cCitwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIiBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLiBTdWNoXG5cCitBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKK2NvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2ZcblwKK3RoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCiBcblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAorVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMXG5cCitPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0VcblwKK09USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCiBcblwKLSAgICAgICAtIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MS4wLmh0bWwpXG5cCi0gICAgICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKKy0gICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbClcblwKKy0gICBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MS4wLmh0bWwpXG5cCistICAgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKKy0gICBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdFxuXAorICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAorLSAgIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAorLSAgIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdFxuXAorICAgIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKIFxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAorSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUT1xuXAorVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzXG5cCitwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmRcblwKK2NvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAogXG5cCi1cblxVc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKK1VzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAogXG5cCi1UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzIG9mIHdoaWNoIGluY2x1ZGUsXG5cCi1idXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIgKCJQcm92aXNpb25pbmcgVGVjaG5vbG9neSIpIGZvclxuXAotdGhlIHB1cnBvc2Ugb2YgYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yXG5cCi1vdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAiSW5zdGFsbGFibGUgU29mdHdhcmUiKS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGhcblwKLXRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0byBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLlxuXAotSW5mb3JtYXRpb24gYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdFxuXAorVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaFxuXAoraW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyXG5cCisoIlByb3Zpc2lvbmluZyBUZWNobm9sb2d5IikgZm9yIHRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGxcblwKK3NvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHlcblwKKyJJbnN0YWxsYWJsZSBTb2Z0d2FyZSIpLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nXG5cCitzdWNoIHVzZXJzIHRvIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuIEluZm9ybWF0aW9uXG5cCithYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0XG5cCiBodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sICgiU3BlY2lmaWNhdGlvbiIpLlxuXAogXG5cCi1Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCi1Zb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZSBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGVcblwKLUluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCi1pbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kXG5cCi1tYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91clxuXAotYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOlxuXAorWW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsXG5cCitJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUgYXBwbGljYWJsZVxuXAorbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZFxuXAorYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZVxuXAorU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmQgbWFraW5nIGl0XG5cCithdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyXG5cCithZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZVxuXAorZm9sbG93aW5nOlxuXAogXG5cCi0gICAgICAgMS4gQSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCJQcm92aXNpb25pbmcgUHJvY2VzcyIpIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZVxuXAotICAgICAgICAgIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBvbiBhIG1hY2hpbmUgKCJUYXJnZXQgTWFjaGluZSIpIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLFxuXAotICAgICAgICAgIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbiBFY2xpcHNlLWJhc2VkIHByb2R1Y3QuXG5cCi0gICAgICAgMi4gRHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZCBwYXJ0eVxuXAotICAgICAgICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLlxuXAotICAgICAgIDMuIFB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0XG5cCi0gICAgICAgICAgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlICgiSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IikgYW5kIHN1Y2hcblwKLSAgICAgICAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0IE1hY2hpbmUgaW4gYWNjb3JkYW5jZVxuXAotICAgICAgICAgIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZVxuXAotICAgICAgICAgIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnlcblwKLSAgICAgICAgICB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2hcblwKLSAgICAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uXG5cCi0gICAgICAgICAgb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAorMS4gIEEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgiUHJvdmlzaW9uaW5nIFByb2Nlc3MiKSBpbiB3aGljaCBhIHVzZXIgbWF5XG5cCisgICAgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgb24gYSBtYWNoaW5lICgiVGFyZ2V0IE1hY2hpbmUiKSB3aXRoIHRoZVxuXAorICAgIGludGVudCBvZiBpbnN0YWxsaW5nLCBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW5cblwKKyAgICBFY2xpcHNlLWJhc2VkIHByb2R1Y3QuXG5cCisyLiAgRHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZFxuXAorICAgIHBhcnR5IEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG9cblwKKyAgICB0aGUgVGFyZ2V0IE1hY2hpbmUuXG5cCiszLiAgUHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZFxuXAorICAgIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgKCJJbnN0YWxsYWJsZVxuXAorICAgIFNvZnR3YXJlIEFncmVlbWVudCIpIGFuZCBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZVxuXAorICAgIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldCBNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaFxuXAorICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGUgdGVybXMgYW5kXG5cCisgICAgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlXG5cCisgICAgYnkgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlXG5cCisgICAgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2ggaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZVxuXAorICAgIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uIG9mIHRoZVxuXAorICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAogXG5cCiBDcnlwdG9ncmFwaHlcblwKIFxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kXG5cCi1yZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAorQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseVxuXAorbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG9cblwKK2Fub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLFxuXAorcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCxcblwKK3Bvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpc1xuXAorcGVybWl0dGVkLlxuXAogXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitKYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGVcblwKK1VuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgorIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LmZlYXR1cmUvZmVhdHVyZS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LmZlYXR1cmUvZmVhdHVyZS54bWwKaW5kZXggYzVlMzE0MS4uZDA5ODUyYiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuZmVhdHVyZS9mZWF0dXJlLnhtbApAQCAtMiw3ICsyLDcgQEAKIDxmZWF0dXJlCiAgICAgICBpZD0ib3JnLmVjbGlwc2UuamdpdCIKICAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSI0LjExLjgucXVhbGlmaWVyIgorICAgICAgdmVyc2lvbj0iNS4wLjQucXVhbGlmaWVyIgogICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+CiAKICAgIDxkZXNjcmlwdGlvbiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvamdpdC8iPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuZmVhdHVyZS9saWNlbnNlLmh0bWwKaW5kZXggOTVhZDk1ZS4uMDA4YjgwMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LmZlYXR1cmUvbGljZW5zZS5odG1sCkBAIC0xLDEwNiArMSwxODkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiID8+CiA8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08IS0tIHNhdmVkIGZyb20gdXJsPSgwMDQ0KWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsL25vdGljZS5odG1sIC0tPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotCis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiIC8+CiA8dGl0bGU+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KIDwvaGVhZD4KIAogPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5BcHJpbCA5LCAyMDE0PC9wPgorCTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgorCTxwPk5vdmVtYmVyIDIyLCAyMDE3PC9wPgogCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+CisJPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgogCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KKwk8cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwKKwkJSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKKwkJKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZCisJCVRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAorCQlDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VECisJCUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMKKwkJR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkKKwkJQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRAorCQlCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUworCQlBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFCisJCUFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVAorCQlVU0UgVEhFIENPTlRFTlQuPC9wPgogCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+CisJPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPgogCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoIkVQTCIpLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CisJPHA+CisJCVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZQorCQlGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCisJCUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjAgKCZxdW90O0VQTCZxdW90OykuIEEgY29weSBvZiB0aGUKKwkJRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjA8L2E+LgorCQlGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuCisJPC9wPgogCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlCi0gICByZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvcD4KKwk8cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QKKwkJY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZQorCQlGb3VuZGF0aW9uIHNvdXJjZSBjb2RlIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIHNvZnR3YXJlCisJCW1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUKKwkJYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgogCi08dWw+Ci0gICAgICAgPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuPC9saT4KLSAgICAgICA8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhmSBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuPC9saT4KLSAgICAgICA8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPgorCTx1bD4KKwkJPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0bworCQkJZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwKKwkJCW1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbgorCQkJZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMKKwkJCSgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KKwkJPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5CisJCQlvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkCisJCQkmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+CisJCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yCisJCQlGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYQorCQkJc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gV2l0aGluIGEKKwkJCUZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZgorCQkJdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMKKwkJCWFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KKwkJPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkCisJCQlGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkCisJCQkmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uCisJCQludW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+CisJPC91bD4KIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KKwk8cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkCisJCWJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7CisJCSgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAorCQlJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkCisJCSZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuIEFib3V0cyBhbmQKKwkJRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IKKwkJTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KIAotPHVsPgotICAgICAgIDxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotICAgICAgIDxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0gICAgICAgPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotICAgICAgIDxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgorCTx1bD4KKwkJPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+CisJCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+CisJCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KKwkJPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZgorCQkJY2VydGFpbiBQbHVnLWluczwvbGk+CisJCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KKwk8L3VsPgogCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgorCTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzCisJCWluc3RhbGxlZCB1c2luZyB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UKKwkJbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZworCQl0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLAorCQl0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zCisJCWFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdSB3aGVyZSB5b3UKKwkJY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlCisJCSZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQKKwkJJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuIFN1Y2ggQWJvdXRzLAorCQlGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kCisJCWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4KKwkJeW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS48L3A+CiAKLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KKwk8cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZCisJCVJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORAorCQlDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUCisJCUFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgogCi08dWw+Ci0gICAgICAgPGxpPkVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLSAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0gICAgICAgPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+CisJPHVsPgorCQk8bGk+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+KQorCQk8L2xpPgorCQk8bGk+RWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sPC9hPikKKwkJPC9saT4KKwkJPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KQorCQk8L2xpPgorCQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pCisJCTwvbGk+CisJCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KQorCQk8L2xpPgorCQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pCisJCTwvbGk+CisJPC91bD4KIAotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgorCTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5ECisJCUNPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLAorCQlvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZQorCQlGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0CisJCXBhcnRpY3VsYXIgQ29udGVudC48L3A+CiAKIAotPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+CisJPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+CiAKLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlCi0gICBVcGRhdGUgTWFuYWdlciAoIlByb3Zpc2lvbmluZyBUZWNobm9sb2d5IikgZm9yIHRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vcgotICAgb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoIHRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0bwotICAgaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy4gSW5mb3JtYXRpb24gYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sIj5odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sPC9hPgotICAgKCJTcGVjaWZpY2F0aW9uIikuPC9wPgorCTxwPgorCQlUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzCisJCW9mIHdoaWNoIGluY2x1ZGUsIGJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZSBVcGRhdGUKKwkJTWFuYWdlciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kmcXVvdDspIGZvciB0aGUgcHVycG9zZSBvZgorCQlhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3IKKwkJb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUmcXVvdDspLiBUaGlzCisJCWNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8KKwkJaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy4gSW5mb3JtYXRpb24gYWJvdXQKKwkJcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCI+aHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbDwvYT4KKwkJKCZxdW90O1NwZWNpZmljYXRpb24mcXVvdDspLgorCTwvcD4KIAotPHA+WW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLiBZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZQotICAgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5Ci0gICBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZQotICAgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91ciBhZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6PC9wPgorCTxwPllvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8KKwkJaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZworCQl0aGUgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlCisJCXRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZworCQlUZWNobm9sb2d5IGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nCisJCVRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmQgbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGgKKwkJdGhlIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXIgYWdyZWVtZW50IHRvLCBhbmQgdGhlCisJCWFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOjwvcD4KIAotPG9sPgotICAgICAgIDxsaT5BIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgICAgIG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbiBFY2xpcHNlLWJhc2VkCi0gICAgICAgcHJvZHVjdC48L2xpPgotICAgICAgIDxsaT5EdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkIHBhcnR5IEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlCi0gICAgICAgYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuPC9saT4KLSAgICAgICA8bGk+UHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlCi0gICAgICAgU29mdHdhcmUgKCJJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0Ci0gICAgICAgTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybgotICAgICAgIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnkgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoCi0gICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuPC9saT4KLTwvb2w+CisJPG9sPgorCQk8bGk+QSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCZxdW90O1Byb3Zpc2lvbmluZworCQkJUHJvY2VzcyZxdW90OykgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcKKwkJCVRlY2hub2xvZ3kgb24gYSBtYWNoaW5lICgmcXVvdDtUYXJnZXQgTWFjaGluZSZxdW90Oykgd2l0aCB0aGUgaW50ZW50CisJCQlvZiBpbnN0YWxsaW5nLCBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4KKwkJCUVjbGlwc2UtYmFzZWQgcHJvZHVjdC48L2xpPgorCQk8bGk+RHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5CisJCQltYXkgY2F1c2UgdGhpcmQgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUKKwkJCWFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLjwvbGk+CisJCTxsaT5QdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlcgorCQkJdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlCisJCQlTb2Z0d2FyZSAoJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50JnF1b3Q7KSBhbmQgc3VjaAorCQkJSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldAorCQkJTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUKKwkJCVNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKwkJCXRoYXQgZ292ZXJuIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnkKKwkJCXRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZQorCQkJQWdyZWVtZW50LiBVcG9uIHN1Y2ggaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZQorCQkJcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb24gb2YgdGhlIEluc3RhbGxhYmxlCisJCQlTb2Z0d2FyZS48L2xpPgorCTwvb2w+CiAKLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgorCTxoMz5DcnlwdG9ncmFwaHk8L2gzPgogCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgorCTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2gKKwkJeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZAorCQl1c2UsIGFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLgorCQlCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsCisJCXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwKKwkJYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgogCi08cD48c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPjwvcD4KLQotCi08L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKwk8cD4KKwkJPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YKKwkJCU9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+CisJPC9wPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5mZWF0dXJlL3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LmZlYXR1cmUvcG9tLnhtbAppbmRleCAxY2M2Y2ViLi5hOWE1OGFmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LmZlYXR1cmUvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LmZlYXR1cmUvcG9tLnhtbApAQCAtNTAsNyArNTAsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+amdpdC50eWNoby5wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+NC4xMS44LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjUuMC40LVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0LmZlYXR1cmU8L2dyb3VwSWQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwppbmRleCBiOWI1Y2NlLi40ODBlOWMzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKQEAgLTM1LDEyNSArMzUsMTQzIEBACiAjIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKIGxpY2Vuc2U9XAogRWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50XG5cCi1BcHJpbCA5LCAyMDE0XG5cCitcblwKK05vdmVtYmVyIDIyLCAyMDE3XG5cCiBcblwKIFVzYWdlIE9mIENvbnRlbnRcblwKIFxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCitUSEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT05cblwKK0FORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GXG5cCitUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRVxuXAorVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKK0JFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORURcblwKK0JZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRVxuXAorQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAorVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTllcblwKK0FQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VXG5cCitNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKIFxuXAogQXBwbGljYWJsZSBMaWNlbnNlc1xuXAogXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlXG5cCi1FY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZlxuXAotdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXNcblwKLXByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAorVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKK2lzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2VcblwKK1ZlcnNpb24gMi4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvXG5cCithdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLiBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCxcblwKKyJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCiBcblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKK0NvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uXG5cCithbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlIHJlcG9zaXRvcnlcblwKKygiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzXG5cCitkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKIFxuXAotICAgICAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAgICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEoVE0pIEFSY2hpdmUpXG5cCi0gICAgICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAgICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgICAgICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCistICAgQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGVcblwKKyAgICBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXlcblwKKyAgICBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kXG5cCisgICAgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAorLSAgIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUlxuXAorICAgIChKYXZh4oSiIEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKKy0gICBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmRcblwKKyAgICBhc3NvY2lhdGVkIG1hdGVyaWFsLiBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhXG5cCisgICAgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5XG5cCisgICAgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vclxuXAorICAgIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAorLSAgIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYVxuXAorICAgIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmRcblwKKyAgICB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCiBcblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAorVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW5cblwKK2ZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzXG5cCithbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIlxuXAorKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnlcblwKK2RpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nXG5cCitsb2NhdGlvbnM6XG5cCiBcblwKLSAgICAgICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgICAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgICAgICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgICAgICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgICAgICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKKy0gICBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKKy0gICBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAorLSAgIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKKy0gICBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCistICAgRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAogXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1Qcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgXG5cCi1VcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgZm91bmQgd2l0aGluIGEgRmVhdHVyZS5cblwKLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGVcblwKLXRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXRcblwKLWdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAorTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nXG5cCit0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2VcblwKKygiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlXG5cCitjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAord2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91XG5cCit3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIlxuXAorcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4gU3VjaFxuXAorQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCitjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mXG5cCit0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAogXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKK1RIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTFxuXAorT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFXG5cCitPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAogXG5cCi0gICAgICAgLSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sKVxuXAotICAgICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCistICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwpXG5cCistICAgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sKVxuXAorLSAgIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCistICAgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKKy0gICBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdFxuXAorICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKKy0gICBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCiBcblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKK0lUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE9cblwKK1VTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpc1xuXAorcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kXG5cCitjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKIFxuXAotXG5cVXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCitVc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKIFxuXAotVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLFxuXAotYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyICgiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3JcblwKLXRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vclxuXAotb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoXG5cCi10aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8gaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy5cblwKLUluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXRcblwKK1RoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2hcblwKK2luY2x1ZGUsIGJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlclxuXAorKCJQcm92aXNpb25pbmcgVGVjaG5vbG9neSIpIGZvciB0aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsXG5cCitzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5XG5cCisiSW5zdGFsbGFibGUgU29mdHdhcmUiKS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZ1xuXAorc3VjaCB1c2VycyB0byBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvblxuXAorYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdFxuXAogaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCAoIlNwZWNpZmljYXRpb24iKS5cblwKIFxuXAotWW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAotWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlXG5cCi1JbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAotaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZFxuXAotbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXJcblwKLWFncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzpcblwKK1lvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbFxuXAorSW5zdGFsbGFibGUgU29mdHdhcmUuIFlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlIGFwcGxpY2FibGVcblwKK2xpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmRcblwKK2FjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIGFjY29yZGFuY2Ugd2l0aCB0aGVcblwKK1NwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdFxuXAorYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91clxuXAorYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGVcblwKK2ZvbGxvd2luZzpcblwKIFxuXAotICAgICAgIDEuIEEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgiUHJvdmlzaW9uaW5nIFByb2Nlc3MiKSBpbiB3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGVcblwKLSAgICAgICAgICB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgb24gYSBtYWNoaW5lICgiVGFyZ2V0IE1hY2hpbmUiKSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZyxcblwKLSAgICAgICAgICBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZCBwcm9kdWN0LlxuXAotICAgICAgIDIuIER1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHlcblwKLSAgICAgICAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZSBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS5cblwKLSAgICAgICAzLiBQdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdFxuXAotICAgICAgICAgIGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSAoIkluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCIpIGFuZCBzdWNoXG5cCi0gICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldCBNYWNoaW5lIGluIGFjY29yZGFuY2VcblwKLSAgICAgICAgICB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGVcblwKLSAgICAgICAgICB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5XG5cCi0gICAgICAgICAgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoXG5cCi0gICAgICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvblxuXAotICAgICAgICAgIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKKzEuICBBIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gd2hpY2ggYSB1c2VyIG1heVxuXAorICAgIGV4ZWN1dGUgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGVcblwKKyAgICBpbnRlbnQgb2YgaW5zdGFsbGluZywgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuXG5cCisgICAgRWNsaXBzZS1iYXNlZCBwcm9kdWN0LlxuXAorMi4gIER1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmRcblwKKyAgICBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZSBhY2Nlc3NlZCBhbmQgY29waWVkIHRvXG5cCisgICAgdGhlIFRhcmdldCBNYWNoaW5lLlxuXAorMy4gIFB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmRcblwKKyAgICBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlICgiSW5zdGFsbGFibGVcblwKKyAgICBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmVcblwKKyAgICBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQgTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2hcblwKKyAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlIHRlcm1zIGFuZFxuXAorICAgIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZVxuXAorICAgIGJ5IHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZVxuXAorICAgIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGVcblwKKyAgICBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGVcblwKKyAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKIFxuXAogQ3J5cHRvZ3JhcGh5XG5cCiBcblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZFxuXAotcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKK0NvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHlcblwKK21heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvXG5cCithbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSxcblwKK3BsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsXG5cCitwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXNcblwKK3Blcm1pdHRlZC5cblwKIFxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlXG5cCitVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KKyMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZS5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZS5mZWF0dXJlL2ZlYXR1cmUueG1sCmluZGV4IDBlZGFlMWUuLjQ4NWZkNmIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlLmZlYXR1cmUvZmVhdHVyZS54bWwKQEAgLTIsNyArMiw3IEBACiA8ZmVhdHVyZQogICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUiCiAgICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iNC4xMS44LnF1YWxpZmllciIKKyAgICAgIHZlcnNpb249IjUuMC40LnF1YWxpZmllciIKICAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgogCiAgICA8ZGVzY3JpcHRpb24gdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2pnaXQvIj4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlLmZlYXR1cmUvbGljZW5zZS5odG1sCmluZGV4IDk1YWQ5NWUuLjAwOGI4MDEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZS5mZWF0dXJlL2xpY2Vuc2UuaHRtbApAQCAtMSwxMDYgKzEsMTg5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/PgogPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLQorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIiAvPgogPHRpdGxlPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+CiA8L2hlYWQ+CiAKIDxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+QXByaWwgOSwgMjAxNDwvcD4KKwk8aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KKwk8cD5Ob3ZlbWJlciAyMiwgMjAxNzwvcD4KIAotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgorCTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KIAotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICJDT05URU5UIikuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+CisJPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sCisJCUlORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCisJCShDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWQorCQlUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKKwkJQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRAorCQlCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTCisJCUdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZCisJCUFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQKKwkJQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMKKwkJQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRQorCQlBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QKKwkJVVNFIFRIRSBDT05URU5ULjwvcD4KIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPgorCTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4KIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCJFUEwiKS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgorCTxwPgorCQlVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UKKwkJRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQorCQlFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4wICgmcXVvdDtFUEwmcXVvdDspLiBBIGNvcHkgb2YgdGhlCisJCUVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wPC9hPi4KKwkJRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LgorCTwvcD4KIAotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZQotICAgcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS48L3A+CisJPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0CisJCWNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UKKwkJRm91bmRhdGlvbiBzb3VyY2UgY29kZSByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBzb2Z0d2FyZQorCQltb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlCisJCWFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KIAotPHVsPgotICAgICAgIDxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLjwvbGk+Ci0gICAgICAgPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YZkgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLjwvbGk+Ci0gICAgICAgPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4KKwk8dWw+CisJCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8KKwkJCWZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsCisJCQltb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4KKwkJCWZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzCisJCQkoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+CisJCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeQorCQkJb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZAorCQkJJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgorCQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vcgorCQkJRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEKKwkJCXN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuIFdpdGhpbiBhCisJCQlGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YKKwkJCXRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzCisJCQlhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+CisJCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZAorCQkJRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZAorCQkJJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbgorCQkJbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgorCTwvdWw+CiAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+CisJPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZAorCQliZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OworCQkoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKKwkJSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZAorCQkmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiBBYm91dHMgYW5kCisJCUZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yCisJCU1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+CiAKLTx1bD4KLSAgICAgICA8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLSAgICAgICA8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotICAgICAgIDxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLSAgICAgICA8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KKwk8dWw+CisJCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgorCQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgorCQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+CisJCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YKKwkJCWNlcnRhaW4gUGx1Zy1pbnM8L2xpPgorCQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+CisJPC91bD4KIAotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiKSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiIGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KKwk8cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcworCQlpbnN0YWxsZWQgdXNpbmcgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91CisJCW11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcKKwkJdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywKKwkJdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcworCQlhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91CisJCWNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZQorCQkmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkCisJCSZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLiBTdWNoIEFib3V0cywKKwkJRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZAorCQljb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuCisJCXlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuPC9wPgogCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+CisJPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWQorCQlSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQKKwkJQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVAorCQlBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KIAotPHVsPgotICAgICAgIDxsaT5FY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxLjAuaHRtbDwvYT4pPC9saT4KLSAgICAgICA8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotICAgICAgIDxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgorCTx1bD4KKwkJPGxpPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPikKKwkJPC9saT4KKwkJPGxpPkVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxLjAuaHRtbDwvYT4pCisJCTwvbGk+CisJCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPikKKwkJPC9saT4KKwkJPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KQorCQk8L2xpPgorCQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPikKKwkJPC9saT4KKwkJPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KQorCQk8L2xpPgorCTwvdWw+CiAKLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KKwk8cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORAorCQlDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwKKwkJb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UKKwkJRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdAorCQlwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgogCiAKLTxoMz5Vc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3k8L2gzPgorCTxoMz5Vc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3k8L2gzPgogCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzIG9mIHdoaWNoIGluY2x1ZGUsIGJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZQotICAgVXBkYXRlIE1hbmFnZXIgKCJQcm92aXNpb25pbmcgVGVjaG5vbG9neSIpIGZvciB0aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3IKLSAgIG90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICJJbnN0YWxsYWJsZSBTb2Z0d2FyZSIpLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8KLSAgIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuIEluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCI+aHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbDwvYT4KLSAgICgiU3BlY2lmaWNhdGlvbiIpLjwvcD4KKwk8cD4KKwkJVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcworCQlvZiB3aGljaCBpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UgVXBkYXRlCisJCU1hbmFnZXIgKCZxdW90O1Byb3Zpc2lvbmluZyBUZWNobm9sb2d5JnF1b3Q7KSBmb3IgdGhlIHB1cnBvc2Ugb2YKKwkJYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yCisJCW90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlJnF1b3Q7KS4gVGhpcworCQljYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvCisJCWluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuIEluZm9ybWF0aW9uIGFib3V0CisJCXBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwiPmh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWw8L2E+CisJCSgmcXVvdDtTcGVjaWZpY2F0aW9uJnF1b3Q7KS4KKwk8L3A+CiAKLTxwPllvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUKLSAgIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUKLSAgIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXIgYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOjwvcD4KKwk8cD5Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvCisJCWluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuIFlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcKKwkJdGhlIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZQorCQl0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcKKwkJVGVjaG5vbG9neSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZworCQlUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoCisJCXRoZSBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyIGFncmVlbWVudCB0bywgYW5kIHRoZQorCQlhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzo8L3A+CiAKLTxvbD4KLSAgICAgICA8bGk+QSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCJQcm92aXNpb25pbmcgUHJvY2VzcyIpIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKLSAgICAgICBvbiBhIG1hY2hpbmUgKCJUYXJnZXQgTWFjaGluZSIpIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLCBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZAotICAgICAgIHByb2R1Y3QuPC9saT4KLSAgICAgICA8bGk+RHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZCBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZQotICAgICAgIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLjwvbGk+Ci0gICAgICAgPGxpPlB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZQotICAgICAgIFNvZnR3YXJlICgiSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IikgYW5kIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldAotICAgICAgIE1hY2hpbmUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4KLSAgICAgICB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5IHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaAotICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb24gb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlLjwvbGk+Ci08L29sPgorCTxvbD4KKwkJPGxpPkEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgmcXVvdDtQcm92aXNpb25pbmcKKwkJCVByb2Nlc3MmcXVvdDspIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nCisJCQlUZWNobm9sb2d5IG9uIGEgbWFjaGluZSAoJnF1b3Q7VGFyZ2V0IE1hY2hpbmUmcXVvdDspIHdpdGggdGhlIGludGVudAorCQkJb2YgaW5zdGFsbGluZywgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuCisJCQlFY2xpcHNlLWJhc2VkIHByb2R1Y3QuPC9saT4KKwkJPGxpPkR1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQorCQkJbWF5IGNhdXNlIHRoaXJkIHBhcnR5IEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlCisJCQlhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS48L2xpPgorCQk8bGk+UHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIKKwkJCXRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZQorCQkJU29mdHdhcmUgKCZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCZxdW90OykgYW5kIHN1Y2gKKwkJCUluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQKKwkJCU1hY2hpbmUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlCisJCQlTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisJCQl0aGF0IGdvdmVybiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5CisJCQl0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUKKwkJCUFncmVlbWVudC4gVXBvbiBzdWNoIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUKKwkJCXByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uIG9mIHRoZSBJbnN0YWxsYWJsZQorCQkJU29mdHdhcmUuPC9saT4KKwk8L29sPgogCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KKwk8aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KIAotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KKwk8cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoCisJCXlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQKKwkJdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4KKwkJQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLAorCQlyZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsCisJCWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KIAotPHA+PHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD48L3A+Ci0KLQotPC9ib2R5PjwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisJPHA+CisJCTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mCisJCQlPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPgorCTwvcD4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUuZmVhdHVyZS9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZS5mZWF0dXJlL3BvbS54bWwKaW5kZXggODhjYzBkZC4uZDE0OGFjMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZS5mZWF0dXJlL3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZS5mZWF0dXJlL3BvbS54bWwKQEAgLTUwLDcgKzUwLDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPmpnaXQudHljaG8ucGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjQuMTEuOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj41LjAuNC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdC5mZWF0dXJlPC9ncm91cElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKaW5kZXggNDQ1MGJiYi4uMjkxYjI5ZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCkBAIC0zNiwxMjUgKzM2LDE0MyBAQAogIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCiBsaWNlbnNlPVwKIEVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudFxuXAotQXByaWwgOSwgMjAxNFxuXAorXG5cCitOb3ZlbWJlciAyMiwgMjAxN1xuXAogXG5cCiBVc2FnZSBPZiBDb250ZW50XG5cCiBcblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAorVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OXG5cCitBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuIFVTRSBPRlxuXAorVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEVcblwKK1RFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCitCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEXG5cCitCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0VcblwKK0FHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKK1RFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZXG5cCitBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVVxuXAorTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCiBcblwKIEFwcGxpY2FibGUgTGljZW5zZXNcblwKIFxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZVxuXAotRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2ZcblwKLXRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzXG5cCi1wcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKK1VubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCitpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlXG5cCitWZXJzaW9uIDIuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzb1xuXAorYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4gRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsXG5cCisiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAogXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZVxuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCitDb250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvblxuXAorYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZSByZXBvc2l0b3J5XG5cCisoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhc1xuXAorZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCiBcblwKLSAgICAgICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgICAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhKFRNKSBBUmNoaXZlKVxuXAotICAgICAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgICAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAgICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAorLSAgIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlXG5cCisgICAgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5XG5cCisgICAgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZFxuXAorICAgIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKKy0gICBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVJcblwKKyAgICAoSmF2YeKEoiBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCistICAgQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kXG5cCisgICAgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYVxuXAorICAgIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heVxuXAorICAgIGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3JcblwKKyAgICBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKKy0gICBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGFcblwKKyAgICBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kXG5cCisgICAgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAogXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKK1RoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluXG5cCitmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlc1xuXAorYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCJcblwKKygiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55XG5cCitkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZ1xuXAorbG9jYXRpb25zOlxuXAogXG5cCi0gICAgICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgICAgICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAgICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAgICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAgICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCistICAgVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCistICAgUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKKy0gICBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCistICAgU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAorLSAgIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKIFxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFxuXAotVXBkYXRlIExpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiIGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuXG5cCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlXG5cCi10ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0XG5cCi1nb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKK05vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZ1xuXAordGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlXG5cCisoIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZVxuXAorY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKK3dpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdVxuXAord2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSJcblwKK3Byb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiIGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuIFN1Y2hcblwKK0Fib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAorY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZlxuXAordGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKIFxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCitUSEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUExcblwKK09SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRVxuXAorT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKIFxuXAotICAgICAgIC0gRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxLjAuaHRtbClcblwKLSAgICAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAorLSAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdFxuXAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sKVxuXAorLSAgIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdFxuXAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxLjAuaHRtbClcblwKKy0gICBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdFxuXAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAorLSAgIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCistICAgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCistICAgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAogXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCitJVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPXG5cCitVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXNcblwKK3Byb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZFxuXAorY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCiBcblwKLVxuXFVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAorVXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCiBcblwKLVRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSxcblwKLWJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciAoIlByb3Zpc2lvbmluZyBUZWNobm9sb2d5IikgZm9yXG5cCi10aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3JcblwKLW90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICJJbnN0YWxsYWJsZSBTb2Z0d2FyZSIpLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aFxuXAotdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuXG5cCi1JbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0XG5cCitUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzIG9mIHdoaWNoXG5cCitpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXJcblwKKygiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3IgdGhlIHB1cnBvc2Ugb2YgYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbFxuXAorc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseVxuXAorIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoIHRoZSBpbnRlbnQgb2YgYWxsb3dpbmdcblwKK3N1Y2ggdXNlcnMgdG8gaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy4gSW5mb3JtYXRpb25cblwKK2Fib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXRcblwKIGh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwgKCJTcGVjaWZpY2F0aW9uIikuXG5cCiBcblwKLVlvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKLVlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZVxuXAotSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKLWluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmRcblwKLW1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyXG5cCi1hZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6XG5cCitZb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGxcblwKK0luc3RhbGxhYmxlIFNvZnR3YXJlLiBZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZSBhcHBsaWNhYmxlXG5cCitsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kXG5cCithY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlXG5cCitTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXRcblwKK2F2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXJcblwKK2FncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlXG5cCitmb2xsb3dpbmc6XG5cCiBcblwKLSAgICAgICAxLiBBIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlXG5cCi0gICAgICAgICAgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsXG5cCi0gICAgICAgICAgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQgcHJvZHVjdC5cblwKLSAgICAgICAyLiBEdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkIHBhcnR5XG5cCi0gICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUgYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuXG5cCi0gICAgICAgMy4gUHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXRcblwKLSAgICAgICAgICBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgKCJJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaFxuXAotICAgICAgICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQgTWFjaGluZSBpbiBhY2NvcmRhbmNlXG5cCi0gICAgICAgICAgd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlXG5cCi0gICAgICAgICAgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieVxuXAotICAgICAgICAgIHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaFxuXAotICAgICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb25cblwKLSAgICAgICAgICBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCisxLiAgQSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCJQcm92aXNpb25pbmcgUHJvY2VzcyIpIGluIHdoaWNoIGEgdXNlciBtYXlcblwKKyAgICBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBvbiBhIG1hY2hpbmUgKCJUYXJnZXQgTWFjaGluZSIpIHdpdGggdGhlXG5cCisgICAgaW50ZW50IG9mIGluc3RhbGxpbmcsIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhblxuXAorICAgIEVjbGlwc2UtYmFzZWQgcHJvZHVjdC5cblwKKzIuICBEdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkXG5cCisgICAgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUgYWNjZXNzZWQgYW5kIGNvcGllZCB0b1xuXAorICAgIHRoZSBUYXJnZXQgTWFjaGluZS5cblwKKzMuICBQdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kXG5cCisgICAgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSAoIkluc3RhbGxhYmxlXG5cCisgICAgU29mdHdhcmUgQWdyZWVtZW50IikgYW5kIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlXG5cCisgICAgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0IE1hY2hpbmUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoXG5cCisgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmRcblwKKyAgICBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2VcblwKKyAgICBieSB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGVcblwKKyAgICBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaCBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlXG5cCisgICAgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb24gb2YgdGhlXG5cCisgICAgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCiBcblwKIENyeXB0b2dyYXBoeVxuXAogXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmRcblwKLXJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCitDb250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5XG5cCittYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0b1xuXAorYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsXG5cCitwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LFxuXAorcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzXG5cCitwZXJtaXR0ZWQuXG5cCiBcblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK0phdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZVxuXAorVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCisjIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuZmVhdHVyZS9mZWF0dXJlLnhtbAppbmRleCBjOGUxYTQyLi42NTUxMzMwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5mZWF0dXJlL2ZlYXR1cmUueG1sCkBAIC0yLDcgKzIsNyBAQAogPGZlYXR1cmUKICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0IgogICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjQuMTEuOC5xdWFsaWZpZXIiCisgICAgICB2ZXJzaW9uPSI1LjAuNC5xdWFsaWZpZXIiCiAgICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KIAogICAgPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9qZ2l0LyI+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LmZlYXR1cmUvbGljZW5zZS5odG1sIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5mZWF0dXJlL2xpY2Vuc2UuaHRtbAppbmRleCA5NWFkOTVlLi4wMDhiODAxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuZmVhdHVyZS9saWNlbnNlLmh0bWwKQEAgLTEsMTA2ICsxLDE4OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSIgPz4KIDwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwNDQpaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwvbm90aWNlLmh0bWwgLS0+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci0KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIgLz4KIDx0aXRsZT5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgogPC9oZWFkPgogCiA8Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPkFwcmlsIDksIDIwMTQ8L3A+CisJPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+CisJPHA+Tm92ZW1iZXIgMjIsIDIwMTc8L3A+CiAKLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KKwk8aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+CiAKLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgorCTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLAorCQlJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUworCQkoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkKKwkJVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECisJCUNPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQKKwkJQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUworCQlHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWQorCQlBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VECisJCUJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTCisJCUFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UKKwkJQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UCisJCVVTRSBUSEUgQ09OVEVOVC48L3A+CiAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4KKwk8aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+CiAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgiRVBMIikuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KKwk8cD4KKwkJVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlCisJCUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKKwkJRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gQSBjb3B5IG9mIHRoZQorCQlFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMDwvYT4uCisJCUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC4KKwk8L3A+CiAKLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGUKLSAgIHJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gc29mdHdhcmUgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuPC9wPgorCTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdAorCQljb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlCisJCUZvdW5kYXRpb24gc291cmNlIGNvZGUgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gc29mdHdhcmUKKwkJbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZQorCQlhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+CiAKLTx1bD4KLSAgICAgICA8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS48L2xpPgotICAgICAgIDxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmGZIEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi48L2xpPgotICAgICAgIDxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotICAgICAgIDxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+CisJPHVsPgorCQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvCisJCQlmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbAorCQkJbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluCisJCQlmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcworCQkJKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgorCQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkKKwkJCW9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQKKwkJCSZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KKwkJPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IKKwkJCUZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhCisJCQlzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiBXaXRoaW4gYQorCQkJRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mCisJCQl0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cworCQkJYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgorCQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQKKwkJCUZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQKKwkJCSZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24KKwkJCW51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KKwk8L3VsPgogCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgorCTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQKKwkJYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsKKwkJKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCisJCUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQKKwkJJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gQWJvdXRzIGFuZAorCQlGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvcgorCQlNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgogCi08dWw+Ci0gICAgICAgPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0gICAgICAgPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLSAgICAgICA8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0gICAgICAgPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotICAgICAgIDxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+CisJPHVsPgorCQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KKwkJPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KKwkJPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgorCQk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mCisJCQljZXJ0YWluIFBsdWctaW5zPC9saT4KKwkJPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgorCTwvdWw+CiAKLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIikgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIiBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+CisJPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMKKwkJaW5zdGFsbGVkIHVzaW5nIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdQorCQltdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nCisJCXRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsCisJCXRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMKKwkJYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91IHdoZXJlIHlvdQorCQljYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUKKwkJJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZAorCQkmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4gU3VjaCBBYm91dHMsCisJCUZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQKKwkJY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybgorCQl5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LjwvcD4KIAotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgorCTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkKKwkJUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5ECisJCUNPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQKKwkJQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+CiAKLTx1bD4KLSAgICAgICA8bGk+RWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MS4wLmh0bWw8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLSAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLSAgICAgICA8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KKwk8dWw+CisJCTxsaT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4pCisJCTwvbGk+CisJCTxsaT5FY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MS4wLmh0bWw8L2E+KQorCQk8L2xpPgorCQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pCisJCTwvbGk+CisJCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPikKKwkJPC9saT4KKwkJPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pCisJCTwvbGk+CisJCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPikKKwkJPC9saT4KKwk8L3VsPgogCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+CisJPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQKKwkJQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsCisJCW9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlCisJCUZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQKKwkJcGFydGljdWxhciBDb250ZW50LjwvcD4KIAogCi08aDM+VXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5PC9oMz4KKwk8aDM+VXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5PC9oMz4KIAotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UKLSAgIFVwZGF0ZSBNYW5hZ2VyICgiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3IgdGhlIHB1cnBvc2Ugb2YgYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yCi0gICBvdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAiSW5zdGFsbGFibGUgU29mdHdhcmUiKS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvCi0gICBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwiPmh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWw8L2E+Ci0gICAoIlNwZWNpZmljYXRpb24iKS48L3A+CisJPHA+CisJCVRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMKKwkJb2Ygd2hpY2ggaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlIFVwZGF0ZQorCQlNYW5hZ2VyICgmcXVvdDtQcm92aXNpb25pbmcgVGVjaG5vbG9neSZxdW90OykgZm9yIHRoZSBwdXJwb3NlIG9mCisJCWFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vcgorCQlvdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAmcXVvdDtJbnN0YWxsYWJsZSBTb2Z0d2FyZSZxdW90OykuIFRoaXMKKwkJY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoIHRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0bworCQlpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvbiBhYm91dAorCQlwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sIj5odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sPC9hPgorCQkoJnF1b3Q7U3BlY2lmaWNhdGlvbiZxdW90OykuCisJPC9wPgogCi08cD5Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuIFlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlCi0gICBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKLSAgIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmQgbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlCi0gICBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyIGFncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzo8L3A+CisJPHA+WW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0bworCQlpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLiBZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nCisJCXRoZSBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUKKwkJdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nCisJCVRlY2hub2xvZ3kgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcKKwkJVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aAorCQl0aGUgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91ciBhZ3JlZW1lbnQgdG8sIGFuZCB0aGUKKwkJYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6PC9wPgogCi08b2w+Ci0gICAgICAgPGxpPkEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgiUHJvdmlzaW9uaW5nIFByb2Nlc3MiKSBpbiB3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGUgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5Ci0gICAgICAgb24gYSBtYWNoaW5lICgiVGFyZ2V0IE1hY2hpbmUiKSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZywgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQKLSAgICAgICBwcm9kdWN0LjwvbGk+Ci0gICAgICAgPGxpPkR1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUKLSAgICAgICBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS48L2xpPgotICAgICAgIDxsaT5QdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUKLSAgICAgICBTb2Z0d2FyZSAoIkluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCIpIGFuZCBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQKLSAgICAgICBNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuCi0gICAgICAgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieSB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2gKLSAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS48L2xpPgotPC9vbD4KKwk8b2w+CisJCTxsaT5BIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoJnF1b3Q7UHJvdmlzaW9uaW5nCisJCQlQcm9jZXNzJnF1b3Q7KSBpbiB3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGUgdGhlIFByb3Zpc2lvbmluZworCQkJVGVjaG5vbG9neSBvbiBhIG1hY2hpbmUgKCZxdW90O1RhcmdldCBNYWNoaW5lJnF1b3Q7KSB3aXRoIHRoZSBpbnRlbnQKKwkJCW9mIGluc3RhbGxpbmcsIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbgorCQkJRWNsaXBzZS1iYXNlZCBwcm9kdWN0LjwvbGk+CisJCTxsaT5EdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKKwkJCW1heSBjYXVzZSB0aGlyZCBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZQorCQkJYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuPC9saT4KKwkJPGxpPlB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyCisJCQl0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUKKwkJCVNvZnR3YXJlICgmcXVvdDtJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQmcXVvdDspIGFuZCBzdWNoCisJCQlJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0CisJCQlNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZQorCQkJU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworCQkJdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieQorCQkJdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlCisJCQlBZ3JlZW1lbnQuIFVwb24gc3VjaCBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlCisJCQlwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUgSW5zdGFsbGFibGUKKwkJCVNvZnR3YXJlLjwvbGk+CisJPC9vbD4KIAotPGgzPkNyeXB0b2dyYXBoeTwvaDM+CisJPGgzPkNyeXB0b2dyYXBoeTwvaDM+CiAKLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+CisJPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaAorCQl5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kCisJCXVzZSwgYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuCisJCUJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywKKwkJcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLAorCQlhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+CiAKLTxwPjxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+PC9wPgotCi0KLTwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorCTxwPgorCQk8c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZgorCQkJT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4KKwk8L3A+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LmZlYXR1cmUvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuZmVhdHVyZS9wb20ueG1sCmluZGV4IDc1ODY1NzAuLmY2NTMyNmUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuZmVhdHVyZS9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuZmVhdHVyZS9wb20ueG1sCkBAIC01MCw3ICs1MCw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5qZ2l0LnR5Y2hvLnBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj40LjExLjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+NS4wLjQtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQuZmVhdHVyZTwvZ3JvdXBJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQubGZzLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5sZnMuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKaW5kZXggYzViZmZhOC4uODM4NzU4NSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5sZnMuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5sZnMuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKQEAgLTM1LDEyNSArMzUsMTQzIEBACiAjIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKIGxpY2Vuc2U9XAogRWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50XG5cCi1BcHJpbCA5LCAyMDE0XG5cCitcblwKK05vdmVtYmVyIDIyLCAyMDE3XG5cCiBcblwKIFVzYWdlIE9mIENvbnRlbnRcblwKIFxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCitUSEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT05cblwKK0FORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GXG5cCitUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRVxuXAorVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKK0JFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORURcblwKK0JZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRVxuXAorQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAorVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTllcblwKK0FQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VXG5cCitNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKIFxuXAogQXBwbGljYWJsZSBMaWNlbnNlc1xuXAogXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlXG5cCi1FY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZlxuXAotdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXNcblwKLXByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAorVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKK2lzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2VcblwKK1ZlcnNpb24gMi4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvXG5cCithdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLiBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCxcblwKKyJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCiBcblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKK0NvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uXG5cCithbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlIHJlcG9zaXRvcnlcblwKKygiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzXG5cCitkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKIFxuXAotICAgICAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAgICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEoVE0pIEFSY2hpdmUpXG5cCi0gICAgICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAgICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgICAgICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCistICAgQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGVcblwKKyAgICBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXlcblwKKyAgICBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kXG5cCisgICAgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAorLSAgIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUlxuXAorICAgIChKYXZh4oSiIEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKKy0gICBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmRcblwKKyAgICBhc3NvY2lhdGVkIG1hdGVyaWFsLiBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhXG5cCisgICAgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5XG5cCisgICAgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vclxuXAorICAgIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAorLSAgIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYVxuXAorICAgIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmRcblwKKyAgICB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCiBcblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAorVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW5cblwKK2ZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzXG5cCithbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIlxuXAorKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnlcblwKK2RpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nXG5cCitsb2NhdGlvbnM6XG5cCiBcblwKLSAgICAgICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgICAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgICAgICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgICAgICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgICAgICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKKy0gICBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKKy0gICBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAorLSAgIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKKy0gICBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCistICAgRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAogXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1Qcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgXG5cCi1VcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgZm91bmQgd2l0aGluIGEgRmVhdHVyZS5cblwKLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGVcblwKLXRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXRcblwKLWdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAorTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nXG5cCit0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2VcblwKKygiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlXG5cCitjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAord2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91XG5cCit3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIlxuXAorcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4gU3VjaFxuXAorQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCitjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mXG5cCit0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAogXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKK1RIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTFxuXAorT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFXG5cCitPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAogXG5cCi0gICAgICAgLSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sKVxuXAotICAgICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCistICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwpXG5cCistICAgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sKVxuXAorLSAgIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCistICAgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKKy0gICBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdFxuXAorICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKKy0gICBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCiBcblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKK0lUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE9cblwKK1VTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpc1xuXAorcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kXG5cCitjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKIFxuXAotXG5cVXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCitVc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKIFxuXAotVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLFxuXAotYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyICgiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3JcblwKLXRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vclxuXAotb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoXG5cCi10aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8gaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy5cblwKLUluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXRcblwKK1RoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2hcblwKK2luY2x1ZGUsIGJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlclxuXAorKCJQcm92aXNpb25pbmcgVGVjaG5vbG9neSIpIGZvciB0aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsXG5cCitzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5XG5cCisiSW5zdGFsbGFibGUgU29mdHdhcmUiKS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZ1xuXAorc3VjaCB1c2VycyB0byBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvblxuXAorYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdFxuXAogaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCAoIlNwZWNpZmljYXRpb24iKS5cblwKIFxuXAotWW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAotWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlXG5cCi1JbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAotaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZFxuXAotbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXJcblwKLWFncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzpcblwKK1lvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbFxuXAorSW5zdGFsbGFibGUgU29mdHdhcmUuIFlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlIGFwcGxpY2FibGVcblwKK2xpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmRcblwKK2FjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIGFjY29yZGFuY2Ugd2l0aCB0aGVcblwKK1NwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdFxuXAorYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91clxuXAorYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGVcblwKK2ZvbGxvd2luZzpcblwKIFxuXAotICAgICAgIDEuIEEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgiUHJvdmlzaW9uaW5nIFByb2Nlc3MiKSBpbiB3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGVcblwKLSAgICAgICAgICB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgb24gYSBtYWNoaW5lICgiVGFyZ2V0IE1hY2hpbmUiKSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZyxcblwKLSAgICAgICAgICBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZCBwcm9kdWN0LlxuXAotICAgICAgIDIuIER1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHlcblwKLSAgICAgICAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZSBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS5cblwKLSAgICAgICAzLiBQdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdFxuXAotICAgICAgICAgIGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSAoIkluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCIpIGFuZCBzdWNoXG5cCi0gICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldCBNYWNoaW5lIGluIGFjY29yZGFuY2VcblwKLSAgICAgICAgICB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGVcblwKLSAgICAgICAgICB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5XG5cCi0gICAgICAgICAgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoXG5cCi0gICAgICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvblxuXAotICAgICAgICAgIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKKzEuICBBIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gd2hpY2ggYSB1c2VyIG1heVxuXAorICAgIGV4ZWN1dGUgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGVcblwKKyAgICBpbnRlbnQgb2YgaW5zdGFsbGluZywgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuXG5cCisgICAgRWNsaXBzZS1iYXNlZCBwcm9kdWN0LlxuXAorMi4gIER1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmRcblwKKyAgICBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZSBhY2Nlc3NlZCBhbmQgY29waWVkIHRvXG5cCisgICAgdGhlIFRhcmdldCBNYWNoaW5lLlxuXAorMy4gIFB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmRcblwKKyAgICBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlICgiSW5zdGFsbGFibGVcblwKKyAgICBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmVcblwKKyAgICBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQgTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2hcblwKKyAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlIHRlcm1zIGFuZFxuXAorICAgIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZVxuXAorICAgIGJ5IHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZVxuXAorICAgIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGVcblwKKyAgICBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGVcblwKKyAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKIFxuXAogQ3J5cHRvZ3JhcGh5XG5cCiBcblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZFxuXAotcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKK0NvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHlcblwKK21heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvXG5cCithbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSxcblwKK3BsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsXG5cCitwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXNcblwKK3Blcm1pdHRlZC5cblwKIFxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgorSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlXG5cCitVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KICMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5sZnMuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQubGZzLmZlYXR1cmUvZmVhdHVyZS54bWwKaW5kZXggNzhhMmU4OS4uNzJlMTVkYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5sZnMuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5mZWF0dXJlL2ZlYXR1cmUueG1sCkBAIC0yLDcgKzIsNyBAQAogPGZlYXR1cmUKICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZ2l0LmxmcyIKICAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSI0LjExLjgucXVhbGlmaWVyIgorICAgICAgdmVyc2lvbj0iNS4wLjQucXVhbGlmaWVyIgogICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+CiAKICAgIDxkZXNjcmlwdGlvbiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvamdpdC8iPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5sZnMuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5mZWF0dXJlL2xpY2Vuc2UuaHRtbAppbmRleCA5NWFkOTVlLi4wMDhiODAxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5mZWF0dXJlL2xpY2Vuc2UuaHRtbApAQCAtMSwxMDYgKzEsMTg5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/PgogPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLQorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIiAvPgogPHRpdGxlPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+CiA8L2hlYWQ+CiAKIDxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+QXByaWwgOSwgMjAxNDwvcD4KKwk8aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KKwk8cD5Ob3ZlbWJlciAyMiwgMjAxNzwvcD4KIAotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgorCTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KIAotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICJDT05URU5UIikuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+CisJPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sCisJCUlORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCisJCShDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWQorCQlUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKKwkJQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRAorCQlCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTCisJCUdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZCisJCUFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQKKwkJQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMKKwkJQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRQorCQlBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QKKwkJVVNFIFRIRSBDT05URU5ULjwvcD4KIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPgorCTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4KIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCJFUEwiKS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgorCTxwPgorCQlVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UKKwkJRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQorCQlFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4wICgmcXVvdDtFUEwmcXVvdDspLiBBIGNvcHkgb2YgdGhlCisJCUVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wPC9hPi4KKwkJRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LgorCTwvcD4KIAotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZQotICAgcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS48L3A+CisJPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0CisJCWNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UKKwkJRm91bmRhdGlvbiBzb3VyY2UgY29kZSByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBzb2Z0d2FyZQorCQltb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlCisJCWFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KIAotPHVsPgotICAgICAgIDxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLjwvbGk+Ci0gICAgICAgPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YZkgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLjwvbGk+Ci0gICAgICAgPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4KKwk8dWw+CisJCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8KKwkJCWZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsCisJCQltb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4KKwkJCWZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzCisJCQkoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+CisJCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeQorCQkJb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZAorCQkJJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgorCQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vcgorCQkJRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEKKwkJCXN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuIFdpdGhpbiBhCisJCQlGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YKKwkJCXRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzCisJCQlhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+CisJCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZAorCQkJRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZAorCQkJJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbgorCQkJbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgorCTwvdWw+CiAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+CisJPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZAorCQliZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OworCQkoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKKwkJSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZAorCQkmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiBBYm91dHMgYW5kCisJCUZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yCisJCU1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+CiAKLTx1bD4KLSAgICAgICA8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLSAgICAgICA8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotICAgICAgIDxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLSAgICAgICA8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KKwk8dWw+CisJCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgorCQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgorCQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+CisJCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YKKwkJCWNlcnRhaW4gUGx1Zy1pbnM8L2xpPgorCQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+CisJPC91bD4KIAotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiKSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiIGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KKwk8cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcworCQlpbnN0YWxsZWQgdXNpbmcgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91CisJCW11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcKKwkJdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywKKwkJdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcworCQlhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91CisJCWNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZQorCQkmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkCisJCSZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLiBTdWNoIEFib3V0cywKKwkJRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZAorCQljb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuCisJCXlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuPC9wPgogCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+CisJPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWQorCQlSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQKKwkJQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVAorCQlBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KIAotPHVsPgotICAgICAgIDxsaT5FY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxLjAuaHRtbDwvYT4pPC9saT4KLSAgICAgICA8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotICAgICAgIDxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgorCTx1bD4KKwkJPGxpPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPikKKwkJPC9saT4KKwkJPGxpPkVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxLjAuaHRtbDwvYT4pCisJCTwvbGk+CisJCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPikKKwkJPC9saT4KKwkJPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KQorCQk8L2xpPgorCQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPikKKwkJPC9saT4KKwkJPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KQorCQk8L2xpPgorCTwvdWw+CiAKLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KKwk8cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORAorCQlDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwKKwkJb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UKKwkJRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdAorCQlwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgogCiAKLTxoMz5Vc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3k8L2gzPgorCTxoMz5Vc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3k8L2gzPgogCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzIG9mIHdoaWNoIGluY2x1ZGUsIGJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZQotICAgVXBkYXRlIE1hbmFnZXIgKCJQcm92aXNpb25pbmcgVGVjaG5vbG9neSIpIGZvciB0aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3IKLSAgIG90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICJJbnN0YWxsYWJsZSBTb2Z0d2FyZSIpLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8KLSAgIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuIEluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCI+aHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbDwvYT4KLSAgICgiU3BlY2lmaWNhdGlvbiIpLjwvcD4KKwk8cD4KKwkJVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcworCQlvZiB3aGljaCBpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UgVXBkYXRlCisJCU1hbmFnZXIgKCZxdW90O1Byb3Zpc2lvbmluZyBUZWNobm9sb2d5JnF1b3Q7KSBmb3IgdGhlIHB1cnBvc2Ugb2YKKwkJYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yCisJCW90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlJnF1b3Q7KS4gVGhpcworCQljYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvCisJCWluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuIEluZm9ybWF0aW9uIGFib3V0CisJCXBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwiPmh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWw8L2E+CisJCSgmcXVvdDtTcGVjaWZpY2F0aW9uJnF1b3Q7KS4KKwk8L3A+CiAKLTxwPllvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUKLSAgIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUKLSAgIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXIgYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOjwvcD4KKwk8cD5Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvCisJCWluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuIFlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcKKwkJdGhlIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZQorCQl0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcKKwkJVGVjaG5vbG9neSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZworCQlUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoCisJCXRoZSBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyIGFncmVlbWVudCB0bywgYW5kIHRoZQorCQlhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzo8L3A+CiAKLTxvbD4KLSAgICAgICA8bGk+QSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCJQcm92aXNpb25pbmcgUHJvY2VzcyIpIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKLSAgICAgICBvbiBhIG1hY2hpbmUgKCJUYXJnZXQgTWFjaGluZSIpIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLCBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZAotICAgICAgIHByb2R1Y3QuPC9saT4KLSAgICAgICA8bGk+RHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZCBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZQotICAgICAgIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLjwvbGk+Ci0gICAgICAgPGxpPlB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZQotICAgICAgIFNvZnR3YXJlICgiSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IikgYW5kIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldAotICAgICAgIE1hY2hpbmUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4KLSAgICAgICB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5IHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaAotICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb24gb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlLjwvbGk+Ci08L29sPgorCTxvbD4KKwkJPGxpPkEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgmcXVvdDtQcm92aXNpb25pbmcKKwkJCVByb2Nlc3MmcXVvdDspIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nCisJCQlUZWNobm9sb2d5IG9uIGEgbWFjaGluZSAoJnF1b3Q7VGFyZ2V0IE1hY2hpbmUmcXVvdDspIHdpdGggdGhlIGludGVudAorCQkJb2YgaW5zdGFsbGluZywgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuCisJCQlFY2xpcHNlLWJhc2VkIHByb2R1Y3QuPC9saT4KKwkJPGxpPkR1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQorCQkJbWF5IGNhdXNlIHRoaXJkIHBhcnR5IEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlCisJCQlhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS48L2xpPgorCQk8bGk+UHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIKKwkJCXRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZQorCQkJU29mdHdhcmUgKCZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCZxdW90OykgYW5kIHN1Y2gKKwkJCUluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQKKwkJCU1hY2hpbmUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlCisJCQlTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisJCQl0aGF0IGdvdmVybiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5CisJCQl0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUKKwkJCUFncmVlbWVudC4gVXBvbiBzdWNoIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUKKwkJCXByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uIG9mIHRoZSBJbnN0YWxsYWJsZQorCQkJU29mdHdhcmUuPC9saT4KKwk8L29sPgogCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KKwk8aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KIAotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KKwk8cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoCisJCXlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQKKwkJdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4KKwkJQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLAorCQlyZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsCisJCWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KIAotPHA+PHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD48L3A+Ci0KLQotPC9ib2R5PjwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisJPHA+CisJCTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mCisJCQlPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPgorCTwvcD4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQubGZzLmZlYXR1cmUvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQubGZzLmZlYXR1cmUvcG9tLnhtbAppbmRleCA1YzliY2M2Li4zNWE0ZmRhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5mZWF0dXJlL3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5sZnMuZmVhdHVyZS9wb20ueG1sCkBAIC01MCw3ICs1MCw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5qZ2l0LnR5Y2hvLnBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj40LjExLjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+NS4wLjQtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQuZmVhdHVyZTwvZ3JvdXBJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucGdtLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5wZ20uZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKaW5kZXggODk5MmFkMy4uZWY5MDMxZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5wZ20uZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5wZ20uZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKQEAgLTM1LDEyNSArMzUsMTQzIEBACiAjIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKIGxpY2Vuc2U9XAogRWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50XG5cCi1BcHJpbCA5LCAyMDE0XG5cCitcblwKK05vdmVtYmVyIDIyLCAyMDE3XG5cCiBcblwKIFVzYWdlIE9mIENvbnRlbnRcblwKIFxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCitUSEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT05cblwKK0FORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GXG5cCitUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRVxuXAorVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKK0JFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORURcblwKK0JZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRVxuXAorQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAorVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTllcblwKK0FQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VXG5cCitNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKIFxuXAogQXBwbGljYWJsZSBMaWNlbnNlc1xuXAogXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlXG5cCi1FY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZlxuXAotdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXNcblwKLXByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAorVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKK2lzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2VcblwKK1ZlcnNpb24gMi4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvXG5cCithdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLiBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCxcblwKKyJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCiBcblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKK0NvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uXG5cCithbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlIHJlcG9zaXRvcnlcblwKKygiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzXG5cCitkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKIFxuXAotICAgICAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAgICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEoVE0pIEFSY2hpdmUpXG5cCi0gICAgICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAgICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgICAgICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCistICAgQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGVcblwKKyAgICBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXlcblwKKyAgICBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kXG5cCisgICAgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAorLSAgIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUlxuXAorICAgIChKYXZh4oSiIEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKKy0gICBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmRcblwKKyAgICBhc3NvY2lhdGVkIG1hdGVyaWFsLiBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhXG5cCisgICAgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5XG5cCisgICAgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vclxuXAorICAgIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAorLSAgIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYVxuXAorICAgIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmRcblwKKyAgICB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCiBcblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAorVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW5cblwKK2ZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzXG5cCithbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIlxuXAorKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnlcblwKK2RpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nXG5cCitsb2NhdGlvbnM6XG5cCiBcblwKLSAgICAgICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgICAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgICAgICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgICAgICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgICAgICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKKy0gICBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKKy0gICBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAorLSAgIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKKy0gICBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCistICAgRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAogXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1Qcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgXG5cCi1VcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgZm91bmQgd2l0aGluIGEgRmVhdHVyZS5cblwKLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGVcblwKLXRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXRcblwKLWdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAorTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nXG5cCit0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2VcblwKKygiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlXG5cCitjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAord2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91XG5cCit3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIlxuXAorcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4gU3VjaFxuXAorQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCitjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mXG5cCit0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAogXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKK1RIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTFxuXAorT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFXG5cCitPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAogXG5cCi0gICAgICAgLSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sKVxuXAotICAgICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCistICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwpXG5cCistICAgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sKVxuXAorLSAgIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCistICAgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKKy0gICBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdFxuXAorICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKKy0gICBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCiBcblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKK0lUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE9cblwKK1VTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpc1xuXAorcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kXG5cCitjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKIFxuXAotXG5cVXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCitVc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKIFxuXAotVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLFxuXAotYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyICgiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3JcblwKLXRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vclxuXAotb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoXG5cCi10aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8gaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy5cblwKLUluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXRcblwKK1RoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2hcblwKK2luY2x1ZGUsIGJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlclxuXAorKCJQcm92aXNpb25pbmcgVGVjaG5vbG9neSIpIGZvciB0aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsXG5cCitzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5XG5cCisiSW5zdGFsbGFibGUgU29mdHdhcmUiKS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZ1xuXAorc3VjaCB1c2VycyB0byBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvblxuXAorYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdFxuXAogaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCAoIlNwZWNpZmljYXRpb24iKS5cblwKIFxuXAotWW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAotWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlXG5cCi1JbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAotaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZFxuXAotbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXJcblwKLWFncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzpcblwKK1lvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbFxuXAorSW5zdGFsbGFibGUgU29mdHdhcmUuIFlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlIGFwcGxpY2FibGVcblwKK2xpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmRcblwKK2FjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIGFjY29yZGFuY2Ugd2l0aCB0aGVcblwKK1NwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdFxuXAorYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91clxuXAorYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGVcblwKK2ZvbGxvd2luZzpcblwKIFxuXAotICAgICAgIDEuIEEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgiUHJvdmlzaW9uaW5nIFByb2Nlc3MiKSBpbiB3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGVcblwKLSAgICAgICAgICB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgb24gYSBtYWNoaW5lICgiVGFyZ2V0IE1hY2hpbmUiKSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZyxcblwKLSAgICAgICAgICBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZCBwcm9kdWN0LlxuXAotICAgICAgIDIuIER1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHlcblwKLSAgICAgICAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZSBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS5cblwKLSAgICAgICAzLiBQdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdFxuXAotICAgICAgICAgIGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSAoIkluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCIpIGFuZCBzdWNoXG5cCi0gICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldCBNYWNoaW5lIGluIGFjY29yZGFuY2VcblwKLSAgICAgICAgICB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGVcblwKLSAgICAgICAgICB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5XG5cCi0gICAgICAgICAgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoXG5cCi0gICAgICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvblxuXAotICAgICAgICAgIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKKzEuICBBIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gd2hpY2ggYSB1c2VyIG1heVxuXAorICAgIGV4ZWN1dGUgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGVcblwKKyAgICBpbnRlbnQgb2YgaW5zdGFsbGluZywgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuXG5cCisgICAgRWNsaXBzZS1iYXNlZCBwcm9kdWN0LlxuXAorMi4gIER1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmRcblwKKyAgICBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZSBhY2Nlc3NlZCBhbmQgY29waWVkIHRvXG5cCisgICAgdGhlIFRhcmdldCBNYWNoaW5lLlxuXAorMy4gIFB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmRcblwKKyAgICBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlICgiSW5zdGFsbGFibGVcblwKKyAgICBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmVcblwKKyAgICBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQgTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2hcblwKKyAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlIHRlcm1zIGFuZFxuXAorICAgIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZVxuXAorICAgIGJ5IHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZVxuXAorICAgIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGVcblwKKyAgICBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGVcblwKKyAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKIFxuXAogQ3J5cHRvZ3JhcGh5XG5cCiBcblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZFxuXAotcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKK0NvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHlcblwKK21heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvXG5cCithbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSxcblwKK3BsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsXG5cCitwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXNcblwKK3Blcm1pdHRlZC5cblwKIFxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlXG5cCitVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KKyMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5wZ20uZmVhdHVyZS9mZWF0dXJlLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucGdtLmZlYXR1cmUvZmVhdHVyZS54bWwKaW5kZXggZjI3ODBhNC4uMThhN2QxYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5wZ20uZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnBnbS5mZWF0dXJlL2ZlYXR1cmUueG1sCkBAIC0yLDcgKzIsNyBAQAogPGZlYXR1cmUKICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZ2l0LnBnbSIKICAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSI0LjExLjgucXVhbGlmaWVyIgorICAgICAgdmVyc2lvbj0iNS4wLjQucXVhbGlmaWVyIgogICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+CiAKICAgIDxkZXNjcmlwdGlvbiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvamdpdC8iPgpAQCAtMzEsOCArMzEsOCBAQAogICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KIAogICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5qZ2l0IiB2ZXJzaW9uPSI0LjExLjgiIG1hdGNoPSJlcXVpdmFsZW50Ii8+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLmpnaXQubGZzIiB2ZXJzaW9uPSI0LjExLjgiIG1hdGNoPSJlcXVpdmFsZW50Ii8+CisgICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLmpnaXQiIHZlcnNpb249IjUuMC40IiBtYXRjaD0iZXF1aXZhbGVudCIvPgorICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5qZ2l0LmxmcyIgdmVyc2lvbj0iNS4wLjQiIG1hdGNoPSJlcXVpdmFsZW50Ii8+CiAgICA8L3JlcXVpcmVzPgogCiAgICA8cGx1Z2luCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnBnbS5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucGdtLmZlYXR1cmUvbGljZW5zZS5odG1sCmluZGV4IDk1YWQ5NWUuLjAwOGI4MDEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucGdtLmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucGdtLmZlYXR1cmUvbGljZW5zZS5odG1sCkBAIC0xLDEwNiArMSwxODkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiID8+CiA8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08IS0tIHNhdmVkIGZyb20gdXJsPSgwMDQ0KWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsL25vdGljZS5odG1sIC0tPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotCis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiIC8+CiA8dGl0bGU+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KIDwvaGVhZD4KIAogPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5BcHJpbCA5LCAyMDE0PC9wPgorCTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgorCTxwPk5vdmVtYmVyIDIyLCAyMDE3PC9wPgogCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+CisJPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgogCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KKwk8cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwKKwkJSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKKwkJKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZCisJCVRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAorCQlDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VECisJCUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMKKwkJR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkKKwkJQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRAorCQlCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUworCQlBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFCisJCUFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVAorCQlVU0UgVEhFIENPTlRFTlQuPC9wPgogCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+CisJPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPgogCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoIkVQTCIpLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CisJPHA+CisJCVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZQorCQlGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCisJCUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjAgKCZxdW90O0VQTCZxdW90OykuIEEgY29weSBvZiB0aGUKKwkJRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjA8L2E+LgorCQlGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuCisJPC9wPgogCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlCi0gICByZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvcD4KKwk8cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QKKwkJY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZQorCQlGb3VuZGF0aW9uIHNvdXJjZSBjb2RlIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIHNvZnR3YXJlCisJCW1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUKKwkJYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgogCi08dWw+Ci0gICAgICAgPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuPC9saT4KLSAgICAgICA8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhmSBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuPC9saT4KLSAgICAgICA8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPgorCTx1bD4KKwkJPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0bworCQkJZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwKKwkJCW1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbgorCQkJZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMKKwkJCSgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KKwkJPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5CisJCQlvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkCisJCQkmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+CisJCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yCisJCQlGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYQorCQkJc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gV2l0aGluIGEKKwkJCUZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZgorCQkJdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMKKwkJCWFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KKwkJPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkCisJCQlGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkCisJCQkmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uCisJCQludW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+CisJPC91bD4KIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KKwk8cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkCisJCWJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7CisJCSgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAorCQlJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkCisJCSZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuIEFib3V0cyBhbmQKKwkJRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IKKwkJTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KIAotPHVsPgotICAgICAgIDxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotICAgICAgIDxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0gICAgICAgPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotICAgICAgIDxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgorCTx1bD4KKwkJPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+CisJCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+CisJCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KKwkJPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZgorCQkJY2VydGFpbiBQbHVnLWluczwvbGk+CisJCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KKwk8L3VsPgogCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgorCTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzCisJCWluc3RhbGxlZCB1c2luZyB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UKKwkJbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZworCQl0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLAorCQl0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zCisJCWFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdSB3aGVyZSB5b3UKKwkJY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlCisJCSZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQKKwkJJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuIFN1Y2ggQWJvdXRzLAorCQlGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kCisJCWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4KKwkJeW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS48L3A+CiAKLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KKwk8cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZCisJCVJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORAorCQlDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUCisJCUFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgogCi08dWw+Ci0gICAgICAgPGxpPkVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLSAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0gICAgICAgPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+CisJPHVsPgorCQk8bGk+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+KQorCQk8L2xpPgorCQk8bGk+RWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sPC9hPikKKwkJPC9saT4KKwkJPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KQorCQk8L2xpPgorCQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pCisJCTwvbGk+CisJCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KQorCQk8L2xpPgorCQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pCisJCTwvbGk+CisJPC91bD4KIAotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgorCTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5ECisJCUNPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLAorCQlvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZQorCQlGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0CisJCXBhcnRpY3VsYXIgQ29udGVudC48L3A+CiAKIAotPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+CisJPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+CiAKLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlCi0gICBVcGRhdGUgTWFuYWdlciAoIlByb3Zpc2lvbmluZyBUZWNobm9sb2d5IikgZm9yIHRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vcgotICAgb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoIHRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0bwotICAgaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy4gSW5mb3JtYXRpb24gYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sIj5odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sPC9hPgotICAgKCJTcGVjaWZpY2F0aW9uIikuPC9wPgorCTxwPgorCQlUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzCisJCW9mIHdoaWNoIGluY2x1ZGUsIGJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZSBVcGRhdGUKKwkJTWFuYWdlciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kmcXVvdDspIGZvciB0aGUgcHVycG9zZSBvZgorCQlhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3IKKwkJb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUmcXVvdDspLiBUaGlzCisJCWNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8KKwkJaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy4gSW5mb3JtYXRpb24gYWJvdXQKKwkJcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCI+aHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbDwvYT4KKwkJKCZxdW90O1NwZWNpZmljYXRpb24mcXVvdDspLgorCTwvcD4KIAotPHA+WW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLiBZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZQotICAgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5Ci0gICBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZQotICAgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91ciBhZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6PC9wPgorCTxwPllvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8KKwkJaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZworCQl0aGUgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlCisJCXRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZworCQlUZWNobm9sb2d5IGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nCisJCVRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmQgbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGgKKwkJdGhlIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXIgYWdyZWVtZW50IHRvLCBhbmQgdGhlCisJCWFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOjwvcD4KIAotPG9sPgotICAgICAgIDxsaT5BIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgICAgIG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbiBFY2xpcHNlLWJhc2VkCi0gICAgICAgcHJvZHVjdC48L2xpPgotICAgICAgIDxsaT5EdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkIHBhcnR5IEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlCi0gICAgICAgYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuPC9saT4KLSAgICAgICA8bGk+UHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlCi0gICAgICAgU29mdHdhcmUgKCJJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0Ci0gICAgICAgTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybgotICAgICAgIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnkgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoCi0gICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuPC9saT4KLTwvb2w+CisJPG9sPgorCQk8bGk+QSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCZxdW90O1Byb3Zpc2lvbmluZworCQkJUHJvY2VzcyZxdW90OykgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcKKwkJCVRlY2hub2xvZ3kgb24gYSBtYWNoaW5lICgmcXVvdDtUYXJnZXQgTWFjaGluZSZxdW90Oykgd2l0aCB0aGUgaW50ZW50CisJCQlvZiBpbnN0YWxsaW5nLCBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4KKwkJCUVjbGlwc2UtYmFzZWQgcHJvZHVjdC48L2xpPgorCQk8bGk+RHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5CisJCQltYXkgY2F1c2UgdGhpcmQgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUKKwkJCWFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLjwvbGk+CisJCTxsaT5QdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlcgorCQkJdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlCisJCQlTb2Z0d2FyZSAoJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50JnF1b3Q7KSBhbmQgc3VjaAorCQkJSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldAorCQkJTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUKKwkJCVNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKwkJCXRoYXQgZ292ZXJuIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnkKKwkJCXRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZQorCQkJQWdyZWVtZW50LiBVcG9uIHN1Y2ggaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZQorCQkJcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb24gb2YgdGhlIEluc3RhbGxhYmxlCisJCQlTb2Z0d2FyZS48L2xpPgorCTwvb2w+CiAKLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgorCTxoMz5DcnlwdG9ncmFwaHk8L2gzPgogCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgorCTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2gKKwkJeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZAorCQl1c2UsIGFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLgorCQlCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsCisJCXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwKKwkJYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgogCi08cD48c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPjwvcD4KLQotCi08L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKwk8cD4KKwkJPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YKKwkJCU9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+CisJPC9wPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5wZ20uZmVhdHVyZS9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5wZ20uZmVhdHVyZS9wb20ueG1sCmluZGV4IDQ0NzkzZjguLjczYTdkM2YgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucGdtLmZlYXR1cmUvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnBnbS5mZWF0dXJlL3BvbS54bWwKQEAgLTUwLDcgKzUwLDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPmpnaXQudHljaG8ucGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjQuMTEuOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj41LjAuNC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdC5mZWF0dXJlPC9ncm91cElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5wZ20uc291cmNlLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5wZ20uc291cmNlLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmluZGV4IDAxMmMyMTcuLjczNzAxYjIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucGdtLnNvdXJjZS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnBnbS5zb3VyY2UuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKQEAgLTE2LDcgKzE2LDcgQEAKICMgZGVzY3JpcHRpb24gcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBEZXNjcmlwdGlvbiIKIGRlc2NyaXB0aW9uPVwKIERvIG5vdCBpbnN0YWxsIGluIHlvdXIgSURFOiB0aGlzIGZlYXR1cmUgaXMgbWVhbnQgdG8gcHJvdmlzaW9uIFRhcmdldCBQbGF0Zm9ybXMuXG5cCi1Tb3VyY2UgY29kZSBmb3IgdGhlIHN1cHBvcnQgZm9yIFBERSdzIEpVbml0IHJ1bm5lciBmb3IgYSBUYXJnZXQgUGxhdGZvcm1cblwKK1NvdXJjZSBjb2RlIGZvciB0aGUgc3VwcG9ydCBmb3IgUERFJ3MgSlVuaXQgcnVubmVyIGZvciBhIFRhcmdldCBQbGF0Zm9ybVxuCiAjIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBkZXNjcmlwdGlvbiBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKICMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgpAQCAtMzYsMTI1ICszNiwxNDMgQEAKICMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgogbGljZW5zZT1cCiBFY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnRcblwKLUFwcmlsIDksIDIwMTRcblwKK1xuXAorTm92ZW1iZXIgMjIsIDIwMTdcblwKIFxuXAogVXNhZ2UgT2YgQ29udGVudFxuXAogXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKK1RIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTlxuXAorQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiBVU0UgT0ZcblwKK1RIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFXG5cCitURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAorQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRFxuXAorQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFXG5cCitBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCitURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWVxuXAorQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1VcblwKK01BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAogXG5cCiBBcHBsaWNhYmxlIExpY2Vuc2VzXG5cCiBcblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGVcblwKLUVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mXG5cCi10aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpc1xuXAotcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCitVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAoraXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZVxuXAorVmVyc2lvbiAyLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc29cblwKK2F2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLFxuXAorIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKIFxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGVcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gc29mdHdhcmUgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAorQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb25cblwKK2FuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGUgcmVwb3NpdG9yeVxuXAorKCJSZXBvc2l0b3J5IikgaW4gc29mdHdhcmUgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGUgYXNcblwKK2Rvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAogXG5cCi0gICAgICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgICAgICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YShUTSkgQVJjaGl2ZSlcblwKLSAgICAgICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgICAgICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgICAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKKy0gICBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZVxuXAorICAgIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heVxuXAorICAgIGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmRcblwKKyAgICBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCistICAgRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSXG5cCisgICAgKEphdmHihKIgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAorLSAgIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZFxuXAorICAgIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGFcblwKKyAgICBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXlcblwKKyAgICBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yXG5cCisgICAgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCistICAgRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhXG5cCisgICAgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZFxuXAorICAgIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKIFxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCitUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpblxuXAorZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXNcblwKK2FuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiXG5cCisoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueVxuXAorZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmdcblwKK2xvY2F0aW9uczpcblwKIFxuXAotICAgICAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAgICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgICAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgICAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgICAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAorLSAgIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAorLSAgIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCistICAgSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAorLSAgIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKKy0gICBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCiBcblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLVByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBcblwKLVVwZGF0ZSBMaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIiBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLlxuXAotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZVxuXAotdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdFxuXAotZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCitOb3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmdcblwKK3RoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZVxuXAorKCJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmVcblwKK2NvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCit3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3VcblwKK3doZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiXG5cCitwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIiBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLiBTdWNoXG5cCitBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKK2NvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2ZcblwKK3RoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCiBcblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAorVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMXG5cCitPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0VcblwKK09USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCiBcblwKLSAgICAgICAtIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MS4wLmh0bWwpXG5cCi0gICAgICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKKy0gICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbClcblwKKy0gICBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MS4wLmh0bWwpXG5cCistICAgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKKy0gICBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdFxuXAorICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAorLSAgIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAorLSAgIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdFxuXAorICAgIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKIFxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAorSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUT1xuXAorVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzXG5cCitwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmRcblwKK2NvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAogXG5cCi1cblxVc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKK1VzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAogXG5cCi1UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzIG9mIHdoaWNoIGluY2x1ZGUsXG5cCi1idXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIgKCJQcm92aXNpb25pbmcgVGVjaG5vbG9neSIpIGZvclxuXAotdGhlIHB1cnBvc2Ugb2YgYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yXG5cCi1vdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAiSW5zdGFsbGFibGUgU29mdHdhcmUiKS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGhcblwKLXRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0byBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLlxuXAotSW5mb3JtYXRpb24gYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdFxuXAorVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaFxuXAoraW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyXG5cCisoIlByb3Zpc2lvbmluZyBUZWNobm9sb2d5IikgZm9yIHRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGxcblwKK3NvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHlcblwKKyJJbnN0YWxsYWJsZSBTb2Z0d2FyZSIpLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nXG5cCitzdWNoIHVzZXJzIHRvIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuIEluZm9ybWF0aW9uXG5cCithYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0XG5cCiBodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sICgiU3BlY2lmaWNhdGlvbiIpLlxuXAogXG5cCi1Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCi1Zb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZSBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGVcblwKLUluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCi1pbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kXG5cCi1tYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91clxuXAotYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOlxuXAorWW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsXG5cCitJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUgYXBwbGljYWJsZVxuXAorbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZFxuXAorYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZVxuXAorU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmQgbWFraW5nIGl0XG5cCithdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyXG5cCithZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZVxuXAorZm9sbG93aW5nOlxuXAogXG5cCi0gICAgICAgMS4gQSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCJQcm92aXNpb25pbmcgUHJvY2VzcyIpIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZVxuXAotICAgICAgICAgIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBvbiBhIG1hY2hpbmUgKCJUYXJnZXQgTWFjaGluZSIpIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLFxuXAotICAgICAgICAgIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbiBFY2xpcHNlLWJhc2VkIHByb2R1Y3QuXG5cCi0gICAgICAgMi4gRHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZCBwYXJ0eVxuXAotICAgICAgICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLlxuXAotICAgICAgIDMuIFB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0XG5cCi0gICAgICAgICAgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlICgiSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IikgYW5kIHN1Y2hcblwKLSAgICAgICAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0IE1hY2hpbmUgaW4gYWNjb3JkYW5jZVxuXAotICAgICAgICAgIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZVxuXAotICAgICAgICAgIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnlcblwKLSAgICAgICAgICB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2hcblwKLSAgICAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uXG5cCi0gICAgICAgICAgb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAorMS4gIEEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgiUHJvdmlzaW9uaW5nIFByb2Nlc3MiKSBpbiB3aGljaCBhIHVzZXIgbWF5XG5cCisgICAgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgb24gYSBtYWNoaW5lICgiVGFyZ2V0IE1hY2hpbmUiKSB3aXRoIHRoZVxuXAorICAgIGludGVudCBvZiBpbnN0YWxsaW5nLCBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW5cblwKKyAgICBFY2xpcHNlLWJhc2VkIHByb2R1Y3QuXG5cCisyLiAgRHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZFxuXAorICAgIHBhcnR5IEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG9cblwKKyAgICB0aGUgVGFyZ2V0IE1hY2hpbmUuXG5cCiszLiAgUHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZFxuXAorICAgIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgKCJJbnN0YWxsYWJsZVxuXAorICAgIFNvZnR3YXJlIEFncmVlbWVudCIpIGFuZCBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZVxuXAorICAgIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldCBNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaFxuXAorICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGUgdGVybXMgYW5kXG5cCisgICAgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlXG5cCisgICAgYnkgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlXG5cCisgICAgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2ggaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZVxuXAorICAgIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uIG9mIHRoZVxuXAorICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAogXG5cCiBDcnlwdG9ncmFwaHlcblwKIFxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kXG5cCi1yZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAorQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseVxuXAorbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG9cblwKK2Fub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLFxuXAorcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCxcblwKK3Bvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpc1xuXAorcGVybWl0dGVkLlxuXAogXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitKYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGVcblwKK1VuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgorIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnBnbS5zb3VyY2UuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucGdtLnNvdXJjZS5mZWF0dXJlL2ZlYXR1cmUueG1sCmluZGV4IDk3YTZhMTcuLjgxMGQwMTggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucGdtLnNvdXJjZS5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucGdtLnNvdXJjZS5mZWF0dXJlL2ZlYXR1cmUueG1sCkBAIC0yLDcgKzIsNyBAQAogPGZlYXR1cmUKICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZ2l0LnBnbS5zb3VyY2UiCiAgICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iNC4xMS44LnF1YWxpZmllciIKKyAgICAgIHZlcnNpb249IjUuMC40LnF1YWxpZmllciIKICAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgogCiAgICA8ZGVzY3JpcHRpb24gdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2pnaXQvIj4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucGdtLnNvdXJjZS5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucGdtLnNvdXJjZS5mZWF0dXJlL2xpY2Vuc2UuaHRtbAppbmRleCA5NWFkOTVlLi4wMDhiODAxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnBnbS5zb3VyY2UuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5wZ20uc291cmNlLmZlYXR1cmUvbGljZW5zZS5odG1sCkBAIC0xLDEwNiArMSwxODkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiID8+CiA8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08IS0tIHNhdmVkIGZyb20gdXJsPSgwMDQ0KWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsL25vdGljZS5odG1sIC0tPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotCis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiIC8+CiA8dGl0bGU+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KIDwvaGVhZD4KIAogPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5BcHJpbCA5LCAyMDE0PC9wPgorCTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgorCTxwPk5vdmVtYmVyIDIyLCAyMDE3PC9wPgogCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+CisJPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgogCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KKwk8cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwKKwkJSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKKwkJKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZCisJCVRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAorCQlDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VECisJCUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMKKwkJR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkKKwkJQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRAorCQlCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUworCQlBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFCisJCUFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVAorCQlVU0UgVEhFIENPTlRFTlQuPC9wPgogCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+CisJPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPgogCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoIkVQTCIpLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CisJPHA+CisJCVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZQorCQlGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCisJCUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjAgKCZxdW90O0VQTCZxdW90OykuIEEgY29weSBvZiB0aGUKKwkJRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjA8L2E+LgorCQlGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuCisJPC9wPgogCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlCi0gICByZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvcD4KKwk8cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QKKwkJY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZQorCQlGb3VuZGF0aW9uIHNvdXJjZSBjb2RlIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIHNvZnR3YXJlCisJCW1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUKKwkJYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgogCi08dWw+Ci0gICAgICAgPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuPC9saT4KLSAgICAgICA8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhmSBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuPC9saT4KLSAgICAgICA8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPgorCTx1bD4KKwkJPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0bworCQkJZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwKKwkJCW1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbgorCQkJZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMKKwkJCSgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KKwkJPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5CisJCQlvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkCisJCQkmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+CisJCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yCisJCQlGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYQorCQkJc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gV2l0aGluIGEKKwkJCUZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZgorCQkJdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMKKwkJCWFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KKwkJPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkCisJCQlGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkCisJCQkmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uCisJCQludW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+CisJPC91bD4KIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KKwk8cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkCisJCWJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7CisJCSgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAorCQlJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkCisJCSZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuIEFib3V0cyBhbmQKKwkJRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IKKwkJTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KIAotPHVsPgotICAgICAgIDxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotICAgICAgIDxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0gICAgICAgPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotICAgICAgIDxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgorCTx1bD4KKwkJPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+CisJCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+CisJCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KKwkJPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZgorCQkJY2VydGFpbiBQbHVnLWluczwvbGk+CisJCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KKwk8L3VsPgogCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgorCTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzCisJCWluc3RhbGxlZCB1c2luZyB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UKKwkJbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZworCQl0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLAorCQl0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zCisJCWFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdSB3aGVyZSB5b3UKKwkJY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlCisJCSZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQKKwkJJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuIFN1Y2ggQWJvdXRzLAorCQlGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kCisJCWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4KKwkJeW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS48L3A+CiAKLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KKwk8cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZCisJCVJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORAorCQlDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUCisJCUFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgogCi08dWw+Ci0gICAgICAgPGxpPkVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLSAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0gICAgICAgPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+CisJPHVsPgorCQk8bGk+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+KQorCQk8L2xpPgorCQk8bGk+RWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sPC9hPikKKwkJPC9saT4KKwkJPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KQorCQk8L2xpPgorCQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pCisJCTwvbGk+CisJCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KQorCQk8L2xpPgorCQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pCisJCTwvbGk+CisJPC91bD4KIAotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgorCTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5ECisJCUNPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLAorCQlvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZQorCQlGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0CisJCXBhcnRpY3VsYXIgQ29udGVudC48L3A+CiAKIAotPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+CisJPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+CiAKLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlCi0gICBVcGRhdGUgTWFuYWdlciAoIlByb3Zpc2lvbmluZyBUZWNobm9sb2d5IikgZm9yIHRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vcgotICAgb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoIHRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0bwotICAgaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy4gSW5mb3JtYXRpb24gYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sIj5odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sPC9hPgotICAgKCJTcGVjaWZpY2F0aW9uIikuPC9wPgorCTxwPgorCQlUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzCisJCW9mIHdoaWNoIGluY2x1ZGUsIGJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZSBVcGRhdGUKKwkJTWFuYWdlciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kmcXVvdDspIGZvciB0aGUgcHVycG9zZSBvZgorCQlhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3IKKwkJb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUmcXVvdDspLiBUaGlzCisJCWNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8KKwkJaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy4gSW5mb3JtYXRpb24gYWJvdXQKKwkJcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCI+aHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbDwvYT4KKwkJKCZxdW90O1NwZWNpZmljYXRpb24mcXVvdDspLgorCTwvcD4KIAotPHA+WW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLiBZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZQotICAgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5Ci0gICBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZQotICAgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91ciBhZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6PC9wPgorCTxwPllvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8KKwkJaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZworCQl0aGUgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlCisJCXRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZworCQlUZWNobm9sb2d5IGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nCisJCVRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmQgbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGgKKwkJdGhlIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXIgYWdyZWVtZW50IHRvLCBhbmQgdGhlCisJCWFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOjwvcD4KIAotPG9sPgotICAgICAgIDxsaT5BIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgICAgIG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbiBFY2xpcHNlLWJhc2VkCi0gICAgICAgcHJvZHVjdC48L2xpPgotICAgICAgIDxsaT5EdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkIHBhcnR5IEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlCi0gICAgICAgYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuPC9saT4KLSAgICAgICA8bGk+UHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlCi0gICAgICAgU29mdHdhcmUgKCJJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0Ci0gICAgICAgTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybgotICAgICAgIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnkgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoCi0gICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuPC9saT4KLTwvb2w+CisJPG9sPgorCQk8bGk+QSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCZxdW90O1Byb3Zpc2lvbmluZworCQkJUHJvY2VzcyZxdW90OykgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcKKwkJCVRlY2hub2xvZ3kgb24gYSBtYWNoaW5lICgmcXVvdDtUYXJnZXQgTWFjaGluZSZxdW90Oykgd2l0aCB0aGUgaW50ZW50CisJCQlvZiBpbnN0YWxsaW5nLCBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4KKwkJCUVjbGlwc2UtYmFzZWQgcHJvZHVjdC48L2xpPgorCQk8bGk+RHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5CisJCQltYXkgY2F1c2UgdGhpcmQgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUKKwkJCWFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLjwvbGk+CisJCTxsaT5QdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlcgorCQkJdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlCisJCQlTb2Z0d2FyZSAoJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50JnF1b3Q7KSBhbmQgc3VjaAorCQkJSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldAorCQkJTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUKKwkJCVNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKwkJCXRoYXQgZ292ZXJuIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnkKKwkJCXRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZQorCQkJQWdyZWVtZW50LiBVcG9uIHN1Y2ggaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZQorCQkJcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb24gb2YgdGhlIEluc3RhbGxhYmxlCisJCQlTb2Z0d2FyZS48L2xpPgorCTwvb2w+CiAKLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgorCTxoMz5DcnlwdG9ncmFwaHk8L2gzPgogCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgorCTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2gKKwkJeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZAorCQl1c2UsIGFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLgorCQlCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsCisJCXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwKKwkJYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgogCi08cD48c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPjwvcD4KLQotCi08L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKwk8cD4KKwkJPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YKKwkJCU9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+CisJPC9wPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5wZ20uc291cmNlLmZlYXR1cmUvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucGdtLnNvdXJjZS5mZWF0dXJlL3BvbS54bWwKaW5kZXggYmM4OWVlYi4uODhiOGNlOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5wZ20uc291cmNlLmZlYXR1cmUvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnBnbS5zb3VyY2UuZmVhdHVyZS9wb20ueG1sCkBAIC01MCw3ICs1MCw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5qZ2l0LnR5Y2hvLnBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj40LjExLjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+NS4wLjQtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQuZmVhdHVyZTwvZ3JvdXBJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucmVwb3NpdG9yeS9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5yZXBvc2l0b3J5L3BvbS54bWwKaW5kZXggY2E3NDE2Zi4uYzhjM2I1MSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5yZXBvc2l0b3J5L3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5yZXBvc2l0b3J5L3BvbS54bWwKQEAgLTUwLDcgKzUwLDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPmpnaXQudHljaG8ucGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjQuMTEuOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj41LjAuNC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC5yZXBvc2l0b3J5PC9hcnRpZmFjdElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5zb3VyY2UuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnNvdXJjZS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwppbmRleCA5ODQzZTIzLi5jMDRkYzYzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnNvdXJjZS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnNvdXJjZS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpAQCAtMzYsMTI1ICszNiwxNDMgQEAKICMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgogbGljZW5zZT1cCiBFY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnRcblwKLUFwcmlsIDksIDIwMTRcblwKK1xuXAorTm92ZW1iZXIgMjIsIDIwMTdcblwKIFxuXAogVXNhZ2UgT2YgQ29udGVudFxuXAogXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKK1RIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTlxuXAorQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiBVU0UgT0ZcblwKK1RIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFXG5cCitURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAorQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRFxuXAorQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFXG5cCitBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCitURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWVxuXAorQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1VcblwKK01BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAogXG5cCiBBcHBsaWNhYmxlIExpY2Vuc2VzXG5cCiBcblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGVcblwKLUVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mXG5cCi10aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpc1xuXAotcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCitVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAoraXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZVxuXAorVmVyc2lvbiAyLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc29cblwKK2F2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLFxuXAorIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKIFxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGVcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gc29mdHdhcmUgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAorQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb25cblwKK2FuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGUgcmVwb3NpdG9yeVxuXAorKCJSZXBvc2l0b3J5IikgaW4gc29mdHdhcmUgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGUgYXNcblwKK2Rvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAogXG5cCi0gICAgICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgICAgICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YShUTSkgQVJjaGl2ZSlcblwKLSAgICAgICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgICAgICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgICAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKKy0gICBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZVxuXAorICAgIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heVxuXAorICAgIGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmRcblwKKyAgICBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCistICAgRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSXG5cCisgICAgKEphdmHihKIgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAorLSAgIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZFxuXAorICAgIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGFcblwKKyAgICBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXlcblwKKyAgICBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yXG5cCisgICAgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCistICAgRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhXG5cCisgICAgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZFxuXAorICAgIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKIFxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCitUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpblxuXAorZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXNcblwKK2FuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiXG5cCisoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueVxuXAorZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmdcblwKK2xvY2F0aW9uczpcblwKIFxuXAotICAgICAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAgICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgICAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgICAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgICAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAorLSAgIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAorLSAgIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCistICAgSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAorLSAgIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKKy0gICBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCiBcblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLVByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBcblwKLVVwZGF0ZSBMaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIiBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLlxuXAotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZVxuXAotdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdFxuXAotZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCitOb3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmdcblwKK3RoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZVxuXAorKCJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmVcblwKK2NvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCit3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3VcblwKK3doZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiXG5cCitwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIiBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLiBTdWNoXG5cCitBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKK2NvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2ZcblwKK3RoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCiBcblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAorVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMXG5cCitPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0VcblwKK09USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCiBcblwKLSAgICAgICAtIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MS4wLmh0bWwpXG5cCi0gICAgICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKKy0gICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbClcblwKKy0gICBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MS4wLmh0bWwpXG5cCistICAgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKKy0gICBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdFxuXAorICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAorLSAgIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAorLSAgIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdFxuXAorICAgIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKIFxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAorSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUT1xuXAorVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzXG5cCitwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmRcblwKK2NvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAogXG5cCi1cblxVc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKK1VzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAogXG5cCi1UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzIG9mIHdoaWNoIGluY2x1ZGUsXG5cCi1idXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIgKCJQcm92aXNpb25pbmcgVGVjaG5vbG9neSIpIGZvclxuXAotdGhlIHB1cnBvc2Ugb2YgYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yXG5cCi1vdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAiSW5zdGFsbGFibGUgU29mdHdhcmUiKS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGhcblwKLXRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0byBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLlxuXAotSW5mb3JtYXRpb24gYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdFxuXAorVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaFxuXAoraW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyXG5cCisoIlByb3Zpc2lvbmluZyBUZWNobm9sb2d5IikgZm9yIHRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGxcblwKK3NvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHlcblwKKyJJbnN0YWxsYWJsZSBTb2Z0d2FyZSIpLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nXG5cCitzdWNoIHVzZXJzIHRvIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuIEluZm9ybWF0aW9uXG5cCithYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0XG5cCiBodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sICgiU3BlY2lmaWNhdGlvbiIpLlxuXAogXG5cCi1Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCi1Zb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZSBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGVcblwKLUluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCi1pbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kXG5cCi1tYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91clxuXAotYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOlxuXAorWW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsXG5cCitJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUgYXBwbGljYWJsZVxuXAorbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZFxuXAorYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZVxuXAorU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmQgbWFraW5nIGl0XG5cCithdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyXG5cCithZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZVxuXAorZm9sbG93aW5nOlxuXAogXG5cCi0gICAgICAgMS4gQSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCJQcm92aXNpb25pbmcgUHJvY2VzcyIpIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZVxuXAotICAgICAgICAgIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBvbiBhIG1hY2hpbmUgKCJUYXJnZXQgTWFjaGluZSIpIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLFxuXAotICAgICAgICAgIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbiBFY2xpcHNlLWJhc2VkIHByb2R1Y3QuXG5cCi0gICAgICAgMi4gRHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZCBwYXJ0eVxuXAotICAgICAgICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLlxuXAotICAgICAgIDMuIFB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0XG5cCi0gICAgICAgICAgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlICgiSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IikgYW5kIHN1Y2hcblwKLSAgICAgICAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0IE1hY2hpbmUgaW4gYWNjb3JkYW5jZVxuXAotICAgICAgICAgIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZVxuXAotICAgICAgICAgIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnlcblwKLSAgICAgICAgICB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2hcblwKLSAgICAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uXG5cCi0gICAgICAgICAgb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAorMS4gIEEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgiUHJvdmlzaW9uaW5nIFByb2Nlc3MiKSBpbiB3aGljaCBhIHVzZXIgbWF5XG5cCisgICAgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgb24gYSBtYWNoaW5lICgiVGFyZ2V0IE1hY2hpbmUiKSB3aXRoIHRoZVxuXAorICAgIGludGVudCBvZiBpbnN0YWxsaW5nLCBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW5cblwKKyAgICBFY2xpcHNlLWJhc2VkIHByb2R1Y3QuXG5cCisyLiAgRHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZFxuXAorICAgIHBhcnR5IEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG9cblwKKyAgICB0aGUgVGFyZ2V0IE1hY2hpbmUuXG5cCiszLiAgUHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZFxuXAorICAgIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgKCJJbnN0YWxsYWJsZVxuXAorICAgIFNvZnR3YXJlIEFncmVlbWVudCIpIGFuZCBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZVxuXAorICAgIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldCBNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaFxuXAorICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGUgdGVybXMgYW5kXG5cCisgICAgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlXG5cCisgICAgYnkgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlXG5cCisgICAgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2ggaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZVxuXAorICAgIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uIG9mIHRoZVxuXAorICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAogXG5cCiBDcnlwdG9ncmFwaHlcblwKIFxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kXG5cCi1yZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAorQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseVxuXAorbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG9cblwKK2Fub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLFxuXAorcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCxcblwKK3Bvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpc1xuXAorcGVybWl0dGVkLlxuXAogXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitKYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGVcblwKK1VuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgorIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnNvdXJjZS5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5zb3VyY2UuZmVhdHVyZS9mZWF0dXJlLnhtbAppbmRleCBmM2M3ZTkzLi4xMmQ2ZmUzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnNvdXJjZS5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuc291cmNlLmZlYXR1cmUvZmVhdHVyZS54bWwKQEAgLTIsNyArMiw3IEBACiA8ZmVhdHVyZQogICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpnaXQuc291cmNlIgogICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjQuMTEuOC5xdWFsaWZpZXIiCisgICAgICB2ZXJzaW9uPSI1LjAuNC5xdWFsaWZpZXIiCiAgICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KIAogICAgPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9qZ2l0LyI+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnNvdXJjZS5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuc291cmNlLmZlYXR1cmUvbGljZW5zZS5odG1sCmluZGV4IDk1YWQ5NWUuLjAwOGI4MDEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuc291cmNlLmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuc291cmNlLmZlYXR1cmUvbGljZW5zZS5odG1sCkBAIC0xLDEwNiArMSwxODkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiID8+CiA8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08IS0tIHNhdmVkIGZyb20gdXJsPSgwMDQ0KWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsL25vdGljZS5odG1sIC0tPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotCis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiIC8+CiA8dGl0bGU+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KIDwvaGVhZD4KIAogPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5BcHJpbCA5LCAyMDE0PC9wPgorCTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgorCTxwPk5vdmVtYmVyIDIyLCAyMDE3PC9wPgogCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+CisJPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgogCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KKwk8cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwKKwkJSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKKwkJKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZCisJCVRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAorCQlDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VECisJCUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMKKwkJR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkKKwkJQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRAorCQlCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUworCQlBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFCisJCUFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVAorCQlVU0UgVEhFIENPTlRFTlQuPC9wPgogCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+CisJPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPgogCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoIkVQTCIpLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CisJPHA+CisJCVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZQorCQlGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCisJCUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjAgKCZxdW90O0VQTCZxdW90OykuIEEgY29weSBvZiB0aGUKKwkJRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjA8L2E+LgorCQlGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuCisJPC9wPgogCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlCi0gICByZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvcD4KKwk8cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QKKwkJY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZQorCQlGb3VuZGF0aW9uIHNvdXJjZSBjb2RlIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIHNvZnR3YXJlCisJCW1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUKKwkJYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgogCi08dWw+Ci0gICAgICAgPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuPC9saT4KLSAgICAgICA8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhmSBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuPC9saT4KLSAgICAgICA8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPgorCTx1bD4KKwkJPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0bworCQkJZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwKKwkJCW1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbgorCQkJZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMKKwkJCSgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KKwkJPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5CisJCQlvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkCisJCQkmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+CisJCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yCisJCQlGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYQorCQkJc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gV2l0aGluIGEKKwkJCUZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZgorCQkJdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMKKwkJCWFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KKwkJPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkCisJCQlGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkCisJCQkmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uCisJCQludW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+CisJPC91bD4KIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KKwk8cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkCisJCWJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7CisJCSgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAorCQlJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkCisJCSZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuIEFib3V0cyBhbmQKKwkJRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IKKwkJTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KIAotPHVsPgotICAgICAgIDxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotICAgICAgIDxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0gICAgICAgPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotICAgICAgIDxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgorCTx1bD4KKwkJPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+CisJCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+CisJCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KKwkJPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZgorCQkJY2VydGFpbiBQbHVnLWluczwvbGk+CisJCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KKwk8L3VsPgogCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgorCTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzCisJCWluc3RhbGxlZCB1c2luZyB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UKKwkJbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZworCQl0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLAorCQl0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zCisJCWFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdSB3aGVyZSB5b3UKKwkJY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlCisJCSZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQKKwkJJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuIFN1Y2ggQWJvdXRzLAorCQlGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kCisJCWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4KKwkJeW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS48L3A+CiAKLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KKwk8cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZCisJCVJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORAorCQlDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUCisJCUFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgogCi08dWw+Ci0gICAgICAgPGxpPkVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLSAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0gICAgICAgPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+CisJPHVsPgorCQk8bGk+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+KQorCQk8L2xpPgorCQk8bGk+RWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sPC9hPikKKwkJPC9saT4KKwkJPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KQorCQk8L2xpPgorCQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pCisJCTwvbGk+CisJCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KQorCQk8L2xpPgorCQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pCisJCTwvbGk+CisJPC91bD4KIAotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgorCTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5ECisJCUNPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLAorCQlvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZQorCQlGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0CisJCXBhcnRpY3VsYXIgQ29udGVudC48L3A+CiAKIAotPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+CisJPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+CiAKLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlCi0gICBVcGRhdGUgTWFuYWdlciAoIlByb3Zpc2lvbmluZyBUZWNobm9sb2d5IikgZm9yIHRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vcgotICAgb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoIHRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0bwotICAgaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy4gSW5mb3JtYXRpb24gYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sIj5odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sPC9hPgotICAgKCJTcGVjaWZpY2F0aW9uIikuPC9wPgorCTxwPgorCQlUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzCisJCW9mIHdoaWNoIGluY2x1ZGUsIGJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZSBVcGRhdGUKKwkJTWFuYWdlciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kmcXVvdDspIGZvciB0aGUgcHVycG9zZSBvZgorCQlhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3IKKwkJb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUmcXVvdDspLiBUaGlzCisJCWNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8KKwkJaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy4gSW5mb3JtYXRpb24gYWJvdXQKKwkJcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCI+aHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbDwvYT4KKwkJKCZxdW90O1NwZWNpZmljYXRpb24mcXVvdDspLgorCTwvcD4KIAotPHA+WW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLiBZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZQotICAgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5Ci0gICBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZQotICAgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91ciBhZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6PC9wPgorCTxwPllvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8KKwkJaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZworCQl0aGUgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlCisJCXRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZworCQlUZWNobm9sb2d5IGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nCisJCVRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmQgbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGgKKwkJdGhlIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXIgYWdyZWVtZW50IHRvLCBhbmQgdGhlCisJCWFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOjwvcD4KIAotPG9sPgotICAgICAgIDxsaT5BIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgICAgIG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbiBFY2xpcHNlLWJhc2VkCi0gICAgICAgcHJvZHVjdC48L2xpPgotICAgICAgIDxsaT5EdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkIHBhcnR5IEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlCi0gICAgICAgYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuPC9saT4KLSAgICAgICA8bGk+UHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlCi0gICAgICAgU29mdHdhcmUgKCJJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0Ci0gICAgICAgTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybgotICAgICAgIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnkgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoCi0gICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuPC9saT4KLTwvb2w+CisJPG9sPgorCQk8bGk+QSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCZxdW90O1Byb3Zpc2lvbmluZworCQkJUHJvY2VzcyZxdW90OykgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcKKwkJCVRlY2hub2xvZ3kgb24gYSBtYWNoaW5lICgmcXVvdDtUYXJnZXQgTWFjaGluZSZxdW90Oykgd2l0aCB0aGUgaW50ZW50CisJCQlvZiBpbnN0YWxsaW5nLCBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4KKwkJCUVjbGlwc2UtYmFzZWQgcHJvZHVjdC48L2xpPgorCQk8bGk+RHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5CisJCQltYXkgY2F1c2UgdGhpcmQgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUKKwkJCWFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLjwvbGk+CisJCTxsaT5QdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlcgorCQkJdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlCisJCQlTb2Z0d2FyZSAoJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50JnF1b3Q7KSBhbmQgc3VjaAorCQkJSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldAorCQkJTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUKKwkJCVNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKwkJCXRoYXQgZ292ZXJuIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnkKKwkJCXRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZQorCQkJQWdyZWVtZW50LiBVcG9uIHN1Y2ggaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZQorCQkJcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb24gb2YgdGhlIEluc3RhbGxhYmxlCisJCQlTb2Z0d2FyZS48L2xpPgorCTwvb2w+CiAKLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgorCTxoMz5DcnlwdG9ncmFwaHk8L2gzPgogCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgorCTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2gKKwkJeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZAorCQl1c2UsIGFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLgorCQlCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsCisJCXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwKKwkJYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgogCi08cD48c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPjwvcD4KLQotCi08L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKwk8cD4KKwkJPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YKKwkJCU9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+CisJPC9wPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5zb3VyY2UuZmVhdHVyZS9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5zb3VyY2UuZmVhdHVyZS9wb20ueG1sCmluZGV4IDhhYzg5NzQuLjdjODMyNDEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuc291cmNlLmZlYXR1cmUvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnNvdXJjZS5mZWF0dXJlL3BvbS54bWwKQEAgLTUwLDcgKzUwLDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPmpnaXQudHljaG8ucGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjQuMTEuOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj41LjAuNC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdC5mZWF0dXJlPC9ncm91cElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9NRVRBLUlORi9NQU5JRkVTVC5NRgppbmRleCAwNzQ2OTIwLi5mYzdkZmE2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMiw0ICsyLDQgQEAKIEJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKIEJ1bmRsZS1OYW1lOiBKR2l0IFRhcmdldCBQbGF0Zm9ybSBCdW5kbGUKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpnaXQudGFyZ2V0Ci1CdW5kbGUtVmVyc2lvbjogNC4xMS44LnF1YWxpZmllcgorQnVuZGxlLVZlcnNpb246IDUuMC40LnF1YWxpZmllcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjUudGFyZ2V0IGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjUudGFyZ2V0CmluZGV4IDBjMWQ1YmIuLmRmYjVhOGYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC41LnRhcmdldAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuNS50YXJnZXQKQEAgLTEsNyArMSw3IEBACiA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KIDw/cGRlPz4KIDwhLS0gZ2VuZXJhdGVkIHdpdGggaHR0cHM6Ly9naXRodWIuY29tL21iYXJiZXJvL2ZyLm9iZW8ucmVsZW5nLnRhcmdldHBsYXRmb3JtIC0tPgotPHRhcmdldCBuYW1lPSJqZ2l0LTQuNSIgc2VxdWVuY2VOdW1iZXI9IjE1MzUxNzYzNDciPgorPHRhcmdldCBuYW1lPSJqZ2l0LTQuNSIgc2VxdWVuY2VOdW1iZXI9IjE1MzUxNzkyNTQiPgogICA8bG9jYXRpb25zPgogICAgIDxsb2NhdGlvbiBpbmNsdWRlTW9kZT0ic2xpY2VyIiBpbmNsdWRlQWxsUGxhdGZvcm1zPSJmYWxzZSIgaW5jbHVkZVNvdXJjZT0idHJ1ZSIgaW5jbHVkZUNvbmZpZ3VyZVBoYXNlPSJ0cnVlIiB0eXBlPSJJbnN0YWxsYWJsZVVuaXQiPgogICAgICAgPHVuaXQgaWQ9Im9yZy5lY2xpcHNlLmpldHR5LmNsaWVudCIgdmVyc2lvbj0iOS40LjgudjIwMTcxMTIxIi8+CkBAIC0zOSw2ICszOSw3IEBACiAgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5sb2c0ai5zb3VyY2UiIHZlcnNpb249IjEuMi4xNS52MjAxMDEyMDcwODE1Ii8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmtvaHN1a2UuYXJnczRqIiB2ZXJzaW9uPSIyLjMzLjAudjIwMTYwMzIzLTIyMTgiLz4KICAgICAgIDx1bml0IGlkPSJvcmcua29oc3VrZS5hcmdzNGouc291cmNlIiB2ZXJzaW9uPSIyLjMzLjAudjIwMTYwMzIzLTIyMTgiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuaGFtY3Jlc3QiIHZlcnNpb249IjEuMS4wLnYyMDA5MDUwMTA3MTAwMCIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5oYW1jcmVzdC5jb3JlIiB2ZXJzaW9uPSIxLjMuMC52MjAxODA0MjAtMTUxOSIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5oYW1jcmVzdC5jb3JlLnNvdXJjZSIgdmVyc2lvbj0iMS4zLjAudjIwMTgwNDIwLTE1MTkiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuaGFtY3Jlc3QubGlicmFyeSIgdmVyc2lvbj0iMS4zLjAudjIwMTgwNTI0LTIyNDYiLz4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC42LnRhcmdldCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC42LnRhcmdldAppbmRleCBlMDVjNDEwLi5kYmZkNjk0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuNi50YXJnZXQKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjYudGFyZ2V0CkBAIC0xLDcgKzEsNyBAQAogPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CiA8P3BkZT8+CiA8IS0tIGdlbmVyYXRlZCB3aXRoIGh0dHBzOi8vZ2l0aHViLmNvbS9tYmFyYmVyby9mci5vYmVvLnJlbGVuZy50YXJnZXRwbGF0Zm9ybSAtLT4KLTx0YXJnZXQgbmFtZT0iamdpdC00LjYiIHNlcXVlbmNlTnVtYmVyPSIxNTM1MTc2MzM1Ij4KKzx0YXJnZXQgbmFtZT0iamdpdC00LjYiIHNlcXVlbmNlTnVtYmVyPSIxNTM1MTc5MjQxIj4KICAgPGxvY2F0aW9ucz4KICAgICA8bG9jYXRpb24gaW5jbHVkZU1vZGU9InNsaWNlciIgaW5jbHVkZUFsbFBsYXRmb3Jtcz0iZmFsc2UiIGluY2x1ZGVTb3VyY2U9InRydWUiIGluY2x1ZGVDb25maWd1cmVQaGFzZT0idHJ1ZSIgdHlwZT0iSW5zdGFsbGFibGVVbml0Ij4KICAgICAgIDx1bml0IGlkPSJvcmcuZWNsaXBzZS5qZXR0eS5jbGllbnQiIHZlcnNpb249IjkuNC44LnYyMDE3MTEyMSIvPgpAQCAtMzksNiArMzksNyBAQAogICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUubG9nNGouc291cmNlIiB2ZXJzaW9uPSIxLjIuMTUudjIwMTAxMjA3MDgxNSIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5rb2hzdWtlLmFyZ3M0aiIgdmVyc2lvbj0iMi4zMy4wLnYyMDE2MDMyMy0yMjE4Ii8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmtvaHN1a2UuYXJnczRqLnNvdXJjZSIgdmVyc2lvbj0iMi4zMy4wLnYyMDE2MDMyMy0yMjE4Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmhhbWNyZXN0IiB2ZXJzaW9uPSIxLjEuMC52MjAwOTA1MDEwNzEwMDAiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuaGFtY3Jlc3QuY29yZSIgdmVyc2lvbj0iMS4zLjAudjIwMTgwNDIwLTE1MTkiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuaGFtY3Jlc3QuY29yZS5zb3VyY2UiIHZlcnNpb249IjEuMy4wLnYyMDE4MDQyMC0xNTE5Ii8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmhhbWNyZXN0LmxpYnJhcnkiIHZlcnNpb249IjEuMy4wLnYyMDE4MDUyNC0yMjQ2Ii8+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuNy50YXJnZXQgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuNy50YXJnZXQKaW5kZXggMjBiMGEyOS4uYmU3NzE5ZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjcudGFyZ2V0CisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC43LnRhcmdldApAQCAtMSw3ICsxLDcgQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgogPD9wZGU/PgogPCEtLSBnZW5lcmF0ZWQgd2l0aCBodHRwczovL2dpdGh1Yi5jb20vbWJhcmJlcm8vZnIub2Jlby5yZWxlbmcudGFyZ2V0cGxhdGZvcm0gLS0+Ci08dGFyZ2V0IG5hbWU9ImpnaXQtNC43IiBzZXF1ZW5jZU51bWJlcj0iMTUzNTE3NjMxNCI+Cis8dGFyZ2V0IG5hbWU9ImpnaXQtNC43IiBzZXF1ZW5jZU51bWJlcj0iMTUzNTE3OTIyMSI+CiAgIDxsb2NhdGlvbnM+CiAgICAgPGxvY2F0aW9uIGluY2x1ZGVNb2RlPSJzbGljZXIiIGluY2x1ZGVBbGxQbGF0Zm9ybXM9ImZhbHNlIiBpbmNsdWRlU291cmNlPSJ0cnVlIiBpbmNsdWRlQ29uZmlndXJlUGhhc2U9InRydWUiIHR5cGU9Ikluc3RhbGxhYmxlVW5pdCI+CiAgICAgICA8dW5pdCBpZD0ib3JnLmVjbGlwc2UuamV0dHkuY2xpZW50IiB2ZXJzaW9uPSI5LjQuOC52MjAxNzExMjEiLz4KQEAgLTM5LDYgKzM5LDcgQEAKICAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmxvZzRqLnNvdXJjZSIgdmVyc2lvbj0iMS4yLjE1LnYyMDEwMTIwNzA4MTUiLz4KICAgICAgIDx1bml0IGlkPSJvcmcua29oc3VrZS5hcmdzNGoiIHZlcnNpb249IjIuMzMuMC52MjAxNjAzMjMtMjIxOCIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5rb2hzdWtlLmFyZ3M0ai5zb3VyY2UiIHZlcnNpb249IjIuMzMuMC52MjAxNjAzMjMtMjIxOCIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5oYW1jcmVzdCIgdmVyc2lvbj0iMS4xLjAudjIwMDkwNTAxMDcxMDAwIi8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmhhbWNyZXN0LmNvcmUiIHZlcnNpb249IjEuMy4wLnYyMDE4MDQyMC0xNTE5Ii8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmhhbWNyZXN0LmNvcmUuc291cmNlIiB2ZXJzaW9uPSIxLjMuMC52MjAxODA0MjAtMTUxOSIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5oYW1jcmVzdC5saWJyYXJ5IiB2ZXJzaW9uPSIxLjMuMC52MjAxODA1MjQtMjI0NiIvPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjgudGFyZ2V0IGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjgudGFyZ2V0CmluZGV4IGI4NGZjMjAuLjNkZTE3MmIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC44LnRhcmdldAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuOC50YXJnZXQKQEAgLTEsNyArMSw3IEBACiA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KIDw/cGRlPz4KIDwhLS0gZ2VuZXJhdGVkIHdpdGggaHR0cHM6Ly9naXRodWIuY29tL21iYXJiZXJvL2ZyLm9iZW8ucmVsZW5nLnRhcmdldHBsYXRmb3JtIC0tPgotPHRhcmdldCBuYW1lPSJqZ2l0LTQuOCIgc2VxdWVuY2VOdW1iZXI9IjE1MzUxNzYzMDEiPgorPHRhcmdldCBuYW1lPSJqZ2l0LTQuOCIgc2VxdWVuY2VOdW1iZXI9IjE1MzUxNzkyMDUiPgogICA8bG9jYXRpb25zPgogICAgIDxsb2NhdGlvbiBpbmNsdWRlTW9kZT0ic2xpY2VyIiBpbmNsdWRlQWxsUGxhdGZvcm1zPSJmYWxzZSIgaW5jbHVkZVNvdXJjZT0idHJ1ZSIgaW5jbHVkZUNvbmZpZ3VyZVBoYXNlPSJ0cnVlIiB0eXBlPSJJbnN0YWxsYWJsZVVuaXQiPgogICAgICAgPHVuaXQgaWQ9Im9yZy5lY2xpcHNlLmpldHR5LmNsaWVudCIgdmVyc2lvbj0iOS40LjgudjIwMTcxMTIxIi8+CkBAIC0zOSw2ICszOSw3IEBACiAgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5sb2c0ai5zb3VyY2UiIHZlcnNpb249IjEuMi4xNS52MjAxMDEyMDcwODE1Ii8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmtvaHN1a2UuYXJnczRqIiB2ZXJzaW9uPSIyLjMzLjAudjIwMTYwMzIzLTIyMTgiLz4KICAgICAgIDx1bml0IGlkPSJvcmcua29oc3VrZS5hcmdzNGouc291cmNlIiB2ZXJzaW9uPSIyLjMzLjAudjIwMTYwMzIzLTIyMTgiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuaGFtY3Jlc3QiIHZlcnNpb249IjEuMS4wLnYyMDA5MDUwMTA3MTAwMCIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5oYW1jcmVzdC5jb3JlIiB2ZXJzaW9uPSIxLjMuMC52MjAxODA0MjAtMTUxOSIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5oYW1jcmVzdC5jb3JlLnNvdXJjZSIgdmVyc2lvbj0iMS4zLjAudjIwMTgwNDIwLTE1MTkiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuaGFtY3Jlc3QubGlicmFyeSIgdmVyc2lvbj0iMS4zLjAudjIwMTgwNTI0LTIyNDYiLz4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L29yYml0L1IyMDE4MDYwNjE0NTEyNC1QaG90b24udHBkIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvb3JiaXQvUjIwMTgwNjA2MTQ1MTI0LVBob3Rvbi50cGQKaW5kZXggZjRlYzUwZC4uZWNlYzQxZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvb3JiaXQvUjIwMTgwNjA2MTQ1MTI0LVBob3Rvbi50cGQKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvb3JiaXQvUjIwMTgwNjA2MTQ1MTI0LVBob3Rvbi50cGQKQEAgLTE4LDYgKzE4LDcgQEAKIAlvcmcuYXBhY2hlLmxvZzRqLnNvdXJjZSBbMS4yLjE1LnYyMDEwMTIwNzA4MTUsMS4yLjE1LnYyMDEwMTIwNzA4MTVdCiAJb3JnLmtvaHN1a2UuYXJnczRqIFsyLjMzLjAudjIwMTYwMzIzLTIyMTgsMi4zMy4wLnYyMDE2MDMyMy0yMjE4XQogCW9yZy5rb2hzdWtlLmFyZ3M0ai5zb3VyY2UgWzIuMzMuMC52MjAxNjAzMjMtMjIxOCwyLjMzLjAudjIwMTYwMzIzLTIyMThdCisJb3JnLmhhbWNyZXN0IFsxLjEuMC52MjAwOTA1MDEwNzEwMDAsMS4xLjAudjIwMDkwNTAxMDcxMDAwXQogCW9yZy5oYW1jcmVzdC5jb3JlIFsxLjMuMC52MjAxODA0MjAtMTUxOSwxLjMuMC52MjAxODA0MjAtMTUxOV0KIAlvcmcuaGFtY3Jlc3QuY29yZS5zb3VyY2UgWzEuMy4wLnYyMDE4MDQyMC0xNTE5LDEuMy4wLnYyMDE4MDQyMC0xNTE5XQogCW9yZy5oYW1jcmVzdC5saWJyYXJ5IFsxLjMuMC52MjAxODA1MjQtMjI0NiwxLjMuMC52MjAxODA1MjQtMjI0Nl0KQEAgLTQ0LDQgKzQ1LDQgQEAKIAlvcmcuc2xmNGouaW1wbC5sb2c0ajEyLnNvdXJjZSBbMS43LjIudjIwMTMxMTA1LTIyMDAsMS43LjIudjIwMTMxMTA1LTIyMDBdCiAJY29tLmpjcmFmdC5qemxpYiBbMS4xLjEudjIwMTIwNTEwMjMwNSwxLjEuMS52MjAxMjA1MTAyMzA1XQogCWNvbS5qY3JhZnQuanpsaWIuc291cmNlIFsxLjEuMS52MjAxMjA1MTAyMzA1LDEuMS4xLnYyMDEyMDUxMDIzMDVdCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L3BvbS54bWwKaW5kZXggMjRjNDhlZC4uM2M2MGE4MyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9wb20ueG1sCkBAIC00OSw3ICs0OSw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5qZ2l0LnR5Y2hvLnBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj40LjExLjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+NS4wLjQtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQudGFyZ2V0PC9hcnRpZmFjdElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL3BvbS54bWwKaW5kZXggZDNkODVjMy4uM2NiMjFjMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9wb20ueG1sCkBAIC01Myw3ICs1Myw3IEBACiAKICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgPGFydGlmYWN0SWQ+amdpdC50eWNoby5wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gIDx2ZXJzaW9uPjQuMTEuOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgPHZlcnNpb24+NS4wLjQtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+CiAKICAgPG5hbWU+SkdpdCBUeWNobyBQYXJlbnQ8L25hbWU+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRgppbmRleCAyODMwNjUxLi4zOTkxMGNlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTMsMjggKzMsMjggQEAKIEJ1bmRsZS1OYW1lOiAlcGx1Z2luX25hbWUKIEF1dG9tYXRpYy1Nb2R1bGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdAogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdAotQnVuZGxlLVZlcnNpb246IDQuMTEuOC5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiA1LjAuNC5xdWFsaWZpZXIKIEJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlcl9uYW1lCiBCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KIEJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CiBCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSmF2YVNFLTEuOAotSW1wb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQuYXBpO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5kaWZmO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5kaXJjYWNoZTt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlO3ZlcnNpb249IjQuMTEuOCIsCi0gb3JnLmVjbGlwc2UuamdpdC5qdW5pdDt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5tZXJnZTt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQucGdtO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5wZ20uaW50ZXJuYWw7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnBnbS5vcHQ7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsazt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5pbzt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAorSW1wb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQuYXBpO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9yczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmRpZmY7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5kaXJjYWNoZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSI1LjAuNCIsCisgb3JnLmVjbGlwc2UuamdpdC5qdW5pdDt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmxpYjt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lm1lcmdlO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQucGdtO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQucGdtLmludGVybmFsO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQucGdtLm9wdDt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsazt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAogIG9yZy5oYW1jcmVzdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMi4wLjApIiwKICBvcmcuanVuaXQ7dmVyc2lvbj0iWzQuMTIsNS4wLjApIiwKICBvcmcuanVuaXQucnVsZXM7dmVyc2lvbj0iWzQuMTIsNS4wLjApIiwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvcG9tLnhtbAppbmRleCBlOWI3NzdmLi4zMGMzMmVkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC9wb20ueG1sCkBAIC01MCw3ICs1MCw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj40LjExLjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+NS4wLjQtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3Q8L2FydGlmYWN0SWQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9DTElSZXBvc2l0b3J5VGVzdENhc2UuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3Qvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0NMSVJlcG9zaXRvcnlUZXN0Q2FzZS5qYXZhCmluZGV4IDBlZWFiYWIuLjBkMTg5NGIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3Qvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0NMSVJlcG9zaXRvcnlUZXN0Q2FzZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3Qvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0NMSVJlcG9zaXRvcnlUZXN0Q2FzZS5qYXZhCkBAIC0xMjIsMTcgKzEyMiwxNyBAQCBwcm90ZWN0ZWQgUGF0aCB3cml0ZUxpbmsoU3RyaW5nIGxpbmssIFN0cmluZyB0YXJnZXQpIHRocm93cyBFeGNlcHRpb24gewogCQlyZXR1cm4gSkdpdFRlc3RVdGlsLndyaXRlTGluayhkYiwgbGluaywgdGFyZ2V0KTsKIAl9CiAKLQlwcm90ZWN0ZWQgRmlsZSB3cml0ZVRyYXNoRmlsZShmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgU3RyaW5nIGRhdGEpCisJcHJvdGVjdGVkIEZpbGUgd3JpdGVUcmFzaEZpbGUoU3RyaW5nIG5hbWUsIFN0cmluZyBkYXRhKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJcmV0dXJuIEpHaXRUZXN0VXRpbC53cml0ZVRyYXNoRmlsZShkYiwgbmFtZSwgZGF0YSk7CiAJfQogCiAJQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyByZWFkKGZpbmFsIEZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwcm90ZWN0ZWQgU3RyaW5nIHJlYWQoRmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlyZXR1cm4gSkdpdFRlc3RVdGlsLnJlYWQoZmlsZSk7CiAJfQogCi0JcHJvdGVjdGVkIHZvaWQgZGVsZXRlVHJhc2hGaWxlKGZpbmFsIFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByb3RlY3RlZCB2b2lkIGRlbGV0ZVRyYXNoRmlsZShTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJSkdpdFRlc3RVdGlsLmRlbGV0ZVRyYXNoRmlsZShkYiwgbmFtZSk7CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9DTElHaXRDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9DTElHaXRDb21tYW5kLmphdmEKaW5kZXggNjllYjE5OC4uNDRhZDc5ZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vQ0xJR2l0Q29tbWFuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3Qvc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0NMSUdpdENvbW1hbmQuamF2YQpAQCAtMTU3LDcgKzE1Nyw3IEBAIFByaW50V3JpdGVyIGNyZWF0ZUVycm9yV3JpdGVyKCkgewogCX0KIAogCUBPdmVycmlkZQotCXZvaWQgaW5pdChmaW5hbCBUZXh0QnVpbHRpbiBjbWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJdm9pZCBpbml0KFRleHRCdWlsdGluIGNtZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJY21kLm91dHMgPSByZXN1bHQub3V0OwogCQljbWQuZXJycyA9IHJlc3VsdC5lcnI7CiAJCXN1cGVyLmluaXQoY21kKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGdtL0FyY2hpdmVUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9BcmNoaXZlVGVzdC5qYXZhCmluZGV4IGU1Yzg1ZWIuLmFmZWI1ZWYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGdtL0FyY2hpdmVUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wZ20vQXJjaGl2ZVRlc3QuamF2YQpAQCAtNDIsNyArNDIsNyBAQAogICovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQucGdtOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0QXJyYXlFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CkBAIC02MTIsNyArNjEyLDcgQEAgcHJpdmF0ZSBQcm9jZXNzIHNwYXduQXNzdW1pbmdDb21tYW5kUHJlc2VudChTdHJpbmcuLi4gY21kbGluZSkgewogCiAJcHJpdmF0ZSBCdWZmZXJlZFJlYWRlciByZWFkRnJvbVByb2Nlc3MoUHJvY2VzcyBwcm9jKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJcmV0dXJuIG5ldyBCdWZmZXJlZFJlYWRlcigKLQkJCQluZXcgSW5wdXRTdHJlYW1SZWFkZXIocHJvYy5nZXRJbnB1dFN0cmVhbSgpLCBVVEZfOCkpOworCQkJCW5ldyBJbnB1dFN0cmVhbVJlYWRlcihwcm9jLmdldElucHV0U3RyZWFtKCksIENIQVJTRVQpKTsKIAl9CiAKIAlwcml2YXRlIHZvaWQgZ3JlcEZvckVudHJ5KFN0cmluZyBuYW1lLCBTdHJpbmcgbW9kZSwgU3RyaW5nLi4uIGNtZGxpbmUpCkBAIC03MDAsNyArNzAwLDcgQEAgcHJpdmF0ZSB2b2lkIHdyaXRlUmF3KFN0cmluZyBmaWxlbmFtZSwgYnl0ZVtdIGRhdGEpCiAJCXJldHVybiBsLnRvQXJyYXkobmV3IFN0cmluZ1tsLnNpemUoKV0pOwogCX0KIAotCXByaXZhdGUgc3RhdGljIEZ1dHVyZTxPYmplY3Q+IHdyaXRlQXN5bmMoZmluYWwgT3V0cHV0U3RyZWFtIHN0cmVhbSwgZmluYWwgYnl0ZVtdIGRhdGEpIHsKKwlwcml2YXRlIHN0YXRpYyBGdXR1cmU8T2JqZWN0PiB3cml0ZUFzeW5jKE91dHB1dFN0cmVhbSBzdHJlYW0sIGJ5dGVbXSBkYXRhKSB7CiAJCUV4ZWN1dG9yU2VydmljZSBleGVjdXRvciA9IEV4ZWN1dG9ycy5uZXdTaW5nbGVUaHJlYWRFeGVjdXRvcigpOwogCiAJCXJldHVybiBleGVjdXRvci5zdWJtaXQobmV3IENhbGxhYmxlPE9iamVjdD4oKSB7CkBAIC03NTAsNyArNzUwLDcgQEAgcHVibGljIE9iamVjdCBjYWxsKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCS8vIGZvdW5kIQogCQkJTGlzdDxTdHJpbmc+IGwgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAkJCUJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcigKLQkJCQkJbmV3IElucHV0U3RyZWFtUmVhZGVyKGluLCBVVEZfOCkpOworCQkJCQluZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW4sIENIQVJTRVQpKTsKIAkJCVN0cmluZyBsaW5lOwogCQkJd2hpbGUgKChsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpCiAJCQkJbC5hZGQobGluZSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9GZXRjaFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGdtL0ZldGNoVGVzdC5qYXZhCmluZGV4IDk2ODVkNDUuLmRkZTFhMzMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGdtL0ZldGNoVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGdtL0ZldGNoVGVzdC5qYXZhCkBAIC05Miw2ICs5MiwxOSBAQCBwdWJsaWMgdm9pZCB0ZXN0RmV0Y2hEZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJfQogCiAJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0RmV0Y2hGb3JjZVVwZGF0ZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmdbXSByZXN1bHQgPSBleGVjdXRlKAorCQkJCSJnaXQgZmV0Y2ggdGVzdCByZWZzL2hlYWRzL21hc3RlcjpyZWZzL3JlbW90ZXMvb3JpZ2luL21hc3RlciIpOworCQlhc3NlcnRFcXVhbHMoIiAqIFtuZXcgYnJhbmNoXSAgICAgIG1hc3RlciAgICAgLT4gb3JpZ2luL21hc3RlciIsCisJCQkJcmVzdWx0WzFdKTsKKwkJYXNzZXJ0RXF1YWxzKCIgKiBbbmV3IHRhZ10gICAgICAgICB0YWcgICAgICAgIC0+IHRhZyIsIHJlc3VsdFsyXSk7CisJCXJlbW90ZUdpdC5jb21taXQoKS5zZXRBbWVuZCh0cnVlKS5zZXRNZXNzYWdlKCJhbWVuZGVkIikuY2FsbCgpOworCQlyZXN1bHQgPSBleGVjdXRlKAorCQkJCSJnaXQgZmV0Y2ggLWYgdGVzdCByZWZzL2hlYWRzL21hc3RlcjpyZWZzL3JlbW90ZXMvb3JpZ2luL21hc3RlciIpOworCQlhc3NlcnRFcXVhbHMoIiIsIHJlc3VsdFswXSk7CisJfQorCisJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0RmV0Y2hOb1RhZ3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJU3RyaW5nW10gcmVzdWx0ID0gZXhlY3V0ZSgiZ2l0IGZldGNoIC0tbm8tdGFncyB0ZXN0IHJlZnMvaGVhZHMvbWFzdGVyOnJlZnMvcmVtb3Rlcy9vcmlnaW4vbWFzdGVyIik7CiAJCWFzc2VydEVxdWFscygiICogW25ldyBicmFuY2hdICAgICAgbWFzdGVyICAgICAtPiBvcmlnaW4vbWFzdGVyIiwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGdtL1Byb3h5Q29uZmlnVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wZ20vUHJveHlDb25maWdUZXN0LmphdmEKaW5kZXggMDZlN2ExZC4uNDBhMjIzZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wZ20vUHJveHlDb25maWdUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wZ20vUHJveHlDb25maWdUZXN0LmphdmEKQEAgLTQ3LDYgKzQ3LDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKQEAgLTIwMyw3ICsyMDQsNyBAQCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0T3V0cHV0KFByb2Nlc3MgcCkKIAkJCXdoaWxlICgobGVuZ3RoID0gaW5wdXRTdHJlYW0ucmVhZChidWZmZXIpKSAhPSAtMSkgewogCQkJCXJlc3VsdC53cml0ZShidWZmZXIsIDAsIGxlbmd0aCk7CiAJCQl9Ci0JCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCJVVEYtOCIpOworCQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZyhDb25zdGFudHMuQ0hBUkFDVEVSX0VOQ09ESU5HKTsKIAkJfQogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGdtL1RhZ1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGdtL1RhZ1Rlc3QuamF2YQppbmRleCAwMzM5MWEwLi5kMzhhNDFkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9UYWdUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wZ20vVGFnVGVzdC5qYXZhCkBAIC00MywxMCArNDMsMTEgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5wZ207CiAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuR2l0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNMSVJlcG9zaXRvcnlUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWY7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIApAQCAtNzUsMTMgKzc2LDkgQEAgcHVibGljIHZvaWQgdGVzdFRhZ1R3aWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0VGFnRGVsZXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWdpdC50YWcoKS5zZXROYW1lKCJ0ZXN0IikuY2FsbCgpOwotCi0JCVJlZiByZWYgPSBnaXQuZ2V0UmVwb3NpdG9yeSgpLmdldFRhZ3MoKS5nZXQoInRlc3QiKTsKLQkJYXNzZXJ0RXF1YWxzKCJyZWZzL3RhZ3MvdGVzdCIsIHJlZi5nZXROYW1lKCkpOwotCisJCWFzc2VydE5vdE51bGwoZ2l0LmdldFJlcG9zaXRvcnkoKS5leGFjdFJlZigicmVmcy90YWdzL3Rlc3QiKSk7CiAJCWFzc2VydEVxdWFscygiIiwgZXhlY3V0ZVVuY2hlY2tlZCgiZ2l0IHRhZyAtZCB0ZXN0IilbMF0pOwotCQlSZWYgZGVsZXRlZFJlZiA9IGdpdC5nZXRSZXBvc2l0b3J5KCkuZ2V0VGFncygpLmdldCgidGVzdCIpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgZGVsZXRlZFJlZik7CisJCWFzc2VydE51bGwoZ2l0LmdldFJlcG9zaXRvcnkoKS5leGFjdFJlZigicmVmcy90YWdzL3Rlc3QiKSk7CiAJfQogCiAJQFRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL0JVSUxEIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vQlVJTEQKaW5kZXggMDc5MjI2OC4uZGRjODRiZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vQlVJTEQKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vQlVJTEQKQEAgLTI1LDYgKzI1LDEyIEBACiAgICAgXSwKICkKIAoramF2YV9iaW5hcnkoCisgICAgbmFtZSA9ICJqZ2l0IiwKKyAgICBtYWluX2NsYXNzID0gIm9yZy5lY2xpcHNlLmpnaXQucGdtLk1haW4iLAorICAgIHJ1bnRpbWVfZGVwcyA9IFsiOnBnbSJdLAorKQorCiBqYXZhX2ltcG9ydCgKICAgICBuYW1lID0gInNlcnZpY2VzIiwKICAgICBqYXJzID0gWyI6c2VydmljZXNfamFyIl0sCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmpnaXQucGdtL01FVEEtSU5GL01BTklGRVNULk1GCmluZGV4IDVlMmRlZjEuLmY4YWEwOTUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL01FVEEtSU5GL01BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0zLDcgKzMsNyBAQAogQnVuZGxlLU5hbWU6ICVwbHVnaW5fbmFtZQogQXV0b21hdGljLU1vZHVsZS1OYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LnBnbQogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamdpdC5wZ20KLUJ1bmRsZS1WZXJzaW9uOiA0LjExLjgucXVhbGlmaWVyCitCdW5kbGUtVmVyc2lvbjogNS4wLjQucXVhbGlmaWVyCiBCdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJfbmFtZQogQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKIEJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgpAQCAtMjgsNDkgKzI4LDQ5IEBACiAgb3JnLmVjbGlwc2UuamV0dHkudXRpbC5sb2c7dmVyc2lvbj0iWzkuNC41LDEwLjAuMCkiLAogIG9yZy5lY2xpcHNlLmpldHR5LnV0aWwuc2VjdXJpdHk7dmVyc2lvbj0iWzkuNC41LDEwLjAuMCkiLAogIG9yZy5lY2xpcHNlLmpldHR5LnV0aWwudGhyZWFkO3ZlcnNpb249Ils5LjQuNSwxMC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmFwaTt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9yczt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZTt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuYXd0dWk7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmJsYW1lO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5kaWZmO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5kaXJjYWNoZTt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5naXRyZXBvO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5rZXRjaDt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5kZnM7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5pbzt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5wYWNrO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnJlZnRhYmxlO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnJlZnRyZWU7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmczt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGZzLmxpYjt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlcjt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci5mczt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci5zMzt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5tZXJnZTt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubmxzO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5ub3Rlczt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQucmV2cGxvdDt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5maWx0ZXI7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5wYWNrO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5odHRwLmFwYWNoZTt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnJlc29sdmVyO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsazt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5hcGk7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmF3dHVpO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuYmxhbWU7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5kaWZmO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuZGlyY2FjaGU7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5naXRyZXBvO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwua2V0Y2g7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmRmczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuaW87dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnBhY2s7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnJlZnRhYmxlO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5yZWZ0cmVlO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGZzO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGZzLmxpYjt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXI7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLmZzO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci5zMzt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmxpYjt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lm1lcmdlO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubmxzO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubm90ZXM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5yZXZwbG90O3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuZmlsdGVyO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5wYWNrO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHAuYXBhY2hlO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnJlc29sdmVyO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGs7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5maWx0ZXI7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5pbzt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKICBvcmcua29oc3VrZS5hcmdzNGo7dmVyc2lvbj0iWzIuMzMuMCwzLjAuMCkiLAogIG9yZy5rb2hzdWtlLmFyZ3M0ai5zcGk7dmVyc2lvbj0iWzIuMzMuMCwzLjAuMCkiCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5jb25zb2xlO3ZlcnNpb249IjQuMTEuOCI7CitFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5jb25zb2xlO3ZlcnNpb249IjUuMC40IjsKICAgdXNlczo9Im9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LAogICAgb3JnLmVjbGlwc2UuamdpdC51dGlsIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnBnbTt2ZXJzaW9uPSI0LjExLjgiOworIG9yZy5lY2xpcHNlLmpnaXQucGdtO3ZlcnNpb249IjUuMC40IjsKICAgdXNlczo9Im9yZy5lY2xpcHNlLmpnaXQucmV2d2FsaywKICAgIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyLAogICAgb3JnLmVjbGlwc2UuamdpdC5wZ20ub3B0LApAQCAtODEsMTEgKzgxLDExIEBACiAgICBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLAogICAgamF2YXguc3dpbmcsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydCIsCi0gb3JnLmVjbGlwc2UuamdpdC5wZ20uZGVidWc7dmVyc2lvbj0iNC4xMS44IjsKKyBvcmcuZWNsaXBzZS5qZ2l0LnBnbS5kZWJ1Zzt2ZXJzaW9uPSI1LjAuNCI7CiAgIHVzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuaW8sCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnBnbSIsCi0gb3JnLmVjbGlwc2UuamdpdC5wZ20uaW50ZXJuYWw7dmVyc2lvbj0iNC4xMS44Ijt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0LG9yZy5lY2xpcHNlLmpnaXQudGVzdCIsCi0gb3JnLmVjbGlwc2UuamdpdC5wZ20ub3B0O3ZlcnNpb249IjQuMTEuOCI7Cisgb3JnLmVjbGlwc2UuamdpdC5wZ20uaW50ZXJuYWw7dmVyc2lvbj0iNS4wLjQiO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3Qsb3JnLmVjbGlwc2UuamdpdC50ZXN0IiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnBnbS5vcHQ7dmVyc2lvbj0iNS4wLjQiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5saWIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGssCiAgICBvcmcua29oc3VrZS5hcmdzNGouc3BpLApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GCmluZGV4IGVkYzk0NWMuLjFkNDU3NWUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYKQEAgLTMsNSArMyw1IEBACiBCdW5kbGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC5wZ20gLSBTb3VyY2VzCiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LnBnbS5zb3VyY2UKIEJ1bmRsZS1WZW5kb3I6IEVjbGlwc2Uub3JnIC0gSkdpdAotQnVuZGxlLVZlcnNpb246IDQuMTEuOC5xdWFsaWZpZXIKLUVjbGlwc2UtU291cmNlQnVuZGxlOiBvcmcuZWNsaXBzZS5qZ2l0LnBnbTt2ZXJzaW9uPSI0LjExLjgucXVhbGlmaWVyIjtyb290cz0iLiIKK0J1bmRsZS1WZXJzaW9uOiA1LjAuNC5xdWFsaWZpZXIKK0VjbGlwc2UtU291cmNlQnVuZGxlOiBvcmcuZWNsaXBzZS5qZ2l0LnBnbTt2ZXJzaW9uPSI1LjAuNC5xdWFsaWZpZXIiO3Jvb3RzPSIuIgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3BvbS54bWwKaW5kZXggN2QyMTg0Zi4uZGI2NzQ1ZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9wb20ueG1sCkBAIC01MCw3ICs1MCw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj40LjExLjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+NS4wLjQtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQucGdtPC9hcnRpZmFjdElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vcmVzb3VyY2VzL29yZy9lY2xpcHNlL2pnaXQvcGdtL2ludGVybmFsL0NMSVRleHQucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3Jlc291cmNlcy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9pbnRlcm5hbC9DTElUZXh0LnByb3BlcnRpZXMKaW5kZXggY2IwZWExYi4uZTkzNzA5MyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vcmVzb3VyY2VzL29yZy9lY2xpcHNlL2pnaXQvcGdtL2ludGVybmFsL0NMSVRleHQucHJvcGVydGllcworKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9yZXNvdXJjZXMvb3JnL2VjbGlwc2UvamdpdC9wZ20vaW50ZXJuYWwvQ0xJVGV4dC5wcm9wZXJ0aWVzCkBAIC0zNDMsNiArMzQzLDcgQEAKIHVzYWdlX2ZvcmNlQ2hlY2tvdXQ9d2hlbiBzd2l0Y2hpbmcgYnJhbmNoZXMsIHByb2NlZWQgZXZlbiBpZiB0aGUgaW5kZXggb3IgdGhlIHdvcmtpbmcgdHJlZSBkaWZmZXJzIGZyb20gSEVBRAogdXNhZ2VfZm9yY2VDbGVhbj1yZXF1aXJlZCB0byBkZWxldGUgZmlsZXMgb3IgZGlyZWN0b3JpZXMKIHVzYWdlX2ZvcmNlQ3JlYXRlQnJhbmNoRXZlbkV4aXN0cz1mb3JjZSBjcmVhdGUgYnJhbmNoIGV2ZW4gZXhpc3RzCit1c2FnZV9mb3JjZWRGZXRjaD1mb3JjZSByZWYgdXBkYXRlIGZldGNoIG9wdGlvbgogdXNhZ2VfZm9yY2VSZXBsYWNpbmdBbkV4aXN0aW5nVGFnPWZvcmNlIHJlcGxhY2luZyBhbiBleGlzdGluZyB0YWcKIHVzYWdlX2dldEFuZFNldE9wdGlvbnM9R2V0IGFuZCBzZXQgcmVwb3NpdG9yeSBvciBnbG9iYWwgb3B0aW9ucwogdXNhZ2VfZ3JvdXBzPVJlc3RyaWN0IG1hbmlmZXN0IHByb2plY3RzIHRvIG9uZXMgd2l0aCBzcGVjaWZpZWQgZ3JvdXAocyksIHVzZSAiLSIgZm9yIGV4Y2x1ZGluZyBbZGVmYXVsdHxhbGx8RzEsRzIsRzN8RzQsLUc1LC1HNl0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9BYnN0cmFjdEZldGNoQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0Fic3RyYWN0RmV0Y2hDb21tYW5kLmphdmEKaW5kZXggZjA3NTRiMS4uOTIyM2UwZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0Fic3RyYWN0RmV0Y2hDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0Fic3RyYWN0RmV0Y2hDb21tYW5kLmphdmEKQEAgLTc0LDEwICs3NCwxMCBAQCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEZldGNoQ29tbWFuZCBleHRlbmRzIFRleHRCdWlsdGluIHsKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICBpZiBhbnkuCiAJICovCi0JcHJvdGVjdGVkIHZvaWQgc2hvd0ZldGNoUmVzdWx0KGZpbmFsIEZldGNoUmVzdWx0IHIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJvdGVjdGVkIHZvaWQgc2hvd0ZldGNoUmVzdWx0KEZldGNoUmVzdWx0IHIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXRyeSAoT2JqZWN0UmVhZGVyIHJlYWRlciA9IGRiLm5ld09iamVjdFJlYWRlcigpKSB7CiAJCQlib29sZWFuIHNob3duVVJJID0gZmFsc2U7Ci0JCQlmb3IgKGZpbmFsIFRyYWNraW5nUmVmVXBkYXRlIHUgOiByLmdldFRyYWNraW5nUmVmVXBkYXRlcygpKSB7CisJCQlmb3IgKFRyYWNraW5nUmVmVXBkYXRlIHUgOiByLmdldFRyYWNraW5nUmVmVXBkYXRlcygpKSB7CiAJCQkJaWYgKCF2ZXJib3NlICYmIHUuZ2V0UmVzdWx0KCkgPT0gUmVmVXBkYXRlLlJlc3VsdC5OT19DSEFOR0UpCiAJCQkJCWNvbnRpbnVlOwogCkBAIC0xODEsNyArMTgxLDcgQEAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHNhZmVBYmJyZXZpYXRlKE9iamVjdFJlYWRlciByZWFkZXIsIE9iamVjdElkIGlkKSB7CiAJCX0KIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBjaGFyIHNob3J0VHlwZU9mKGZpbmFsIFJlZlVwZGF0ZS5SZXN1bHQgcikgeworCXByaXZhdGUgc3RhdGljIGNoYXIgc2hvcnRUeXBlT2YoUmVmVXBkYXRlLlJlc3VsdCByKSB7CiAJCWlmIChyID09IFJlZlVwZGF0ZS5SZXN1bHQuTE9DS19GQUlMVVJFKQogCQkJcmV0dXJuICchJzsKIAkJaWYgKHIgPT0gUmVmVXBkYXRlLlJlc3VsdC5JT19GQUlMVVJFKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0FtYXpvblMzQ2xpZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vQW1hem9uUzNDbGllbnQuamF2YQppbmRleCBjY2U4ODliLi5mNGY4ZDhmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vQW1hem9uUzNDbGllbnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vQW1hem9uUzNDbGllbnQuamF2YQpAQCAtMTA1LDcgKzEwNSw3IEBAIHByb3RlY3RlZCB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24gewogCQkJfQogCiAJCX0gZWxzZSBpZiAoImxzIi5lcXVhbHMob3ApIHx8ICJsaXN0Ii5lcXVhbHMob3ApKSB7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCQlmb3IgKGZpbmFsIFN0cmluZyBrIDogczMubGlzdChidWNrZXQsIGtleSkpCisJCQlmb3IgKFN0cmluZyBrIDogczMubGlzdChidWNrZXQsIGtleSkpCiAJCQkJb3V0dy5wcmludGxuKGspOwogCiAJCX0gZWxzZSBpZiAoInJtIi5lcXVhbHMob3ApIHx8ICJkZWxldGUiLmVxdWFscyhvcCkpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vQnJhbmNoLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vQnJhbmNoLmphdmEKaW5kZXggZTY2ODVjMi4uYTg4MzU0ZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0JyYW5jaC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9CcmFuY2guamF2YQpAQCAtMjkyLDcgKzI5Miw3IEBAIGVsc2UgaWYgKHJlbW90ZSkKIAkJCQlhZGRSZWZzKHJlZnMsIENvbnN0YW50cy5SX1JFTU9URVMpOwogCiAJCQkJdHJ5IChPYmplY3RSZWFkZXIgcmVhZGVyID0gZGIubmV3T2JqZWN0UmVhZGVyKCkpIHsKLQkJCQkJZm9yIChmaW5hbCBFbnRyeTxTdHJpbmcsIFJlZj4gZSA6IHByaW50UmVmcy5lbnRyeVNldCgpKSB7CisJCQkJCWZvciAoRW50cnk8U3RyaW5nLCBSZWY+IGUgOiBwcmludFJlZnMuZW50cnlTZXQoKSkgewogCQkJCQkJZmluYWwgUmVmIHJlZiA9IGUuZ2V0VmFsdWUoKTsKIAkJCQkJCXByaW50SGVhZChyZWFkZXIsIGUuZ2V0S2V5KCksCiAJCQkJCQkJCWN1cnJlbnQuZXF1YWxzKHJlZi5nZXROYW1lKCkpLCByZWYpOwpAQCAtMzAyLDE1ICszMDIsMTUgQEAgZWxzZSBpZiAocmVtb3RlKQogCQl9CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGFkZFJlZnMoZmluYWwgQ29sbGVjdGlvbjxSZWY+IHJlZnMsIGZpbmFsIFN0cmluZyBwcmVmaXgpIHsKLQkJZm9yIChmaW5hbCBSZWYgcmVmIDogUmVmQ29tcGFyYXRvci5zb3J0KHJlZnMpKSB7CisJcHJpdmF0ZSB2b2lkIGFkZFJlZnMoQ29sbGVjdGlvbjxSZWY+IHJlZnMsIFN0cmluZyBwcmVmaXgpIHsKKwkJZm9yIChSZWYgcmVmIDogUmVmQ29tcGFyYXRvci5zb3J0KHJlZnMpKSB7CiAJCQlmaW5hbCBTdHJpbmcgbmFtZSA9IHJlZi5nZXROYW1lKCk7CiAJCQlpZiAobmFtZS5zdGFydHNXaXRoKHByZWZpeCkpCiAJCQkJYWRkUmVmKG5hbWUuc3Vic3RyaW5nKG5hbWUuaW5kZXhPZignLycsIDUpICsgMSksIHJlZik7CiAJCX0KIAl9CiAKLQlwcml2YXRlIHZvaWQgYWRkUmVmKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBSZWYgcmVmKSB7CisJcHJpdmF0ZSB2b2lkIGFkZFJlZihTdHJpbmcgbmFtZSwgUmVmIHJlZikgewogCQlwcmludFJlZnMucHV0KG5hbWUsIHJlZik7CiAJCW1heE5hbWVMZW5ndGggPSBNYXRoLm1heChtYXhOYW1lTGVuZ3RoLCBuYW1lLmxlbmd0aCgpKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vQ29tbWFuZENhdGFsb2cuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9Db21tYW5kQ2F0YWxvZy5qYXZhCmluZGV4IDgxYWVlZjguLjU3NTRkN2MgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9Db21tYW5kQ2F0YWxvZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9Db21tYW5kQ2F0YWxvZy5qYXZhCkBAIC00MywxMSArNDMsMTAgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnBnbTsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogCiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKIGltcG9ydCBqYXZhLm5ldC5VUkw7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKQEAgLTg4LDcgKzg3LDcgQEAgcHVibGljIGNsYXNzIENvbW1hbmRDYXRhbG9nIHsKIAkgKiAgICAgICAgICAgIHdhcyBkZXJpdmVkIGZyb20gdGhlIERhc2hMb3dlckNhc2VGb3JtIGNsYXNzIG5hbWUuCiAJICogQHJldHVybiB0aGUgY29tbWFuZCBpbnN0YW5jZTsgbnVsbCBpZiBubyBjb21tYW5kIGV4aXN0cyBieSB0aGF0IG5hbWUuCiAJICovCi0JcHVibGljIHN0YXRpYyBDb21tYW5kUmVmIGdldChmaW5hbCBTdHJpbmcgbmFtZSkgeworCXB1YmxpYyBzdGF0aWMgQ29tbWFuZFJlZiBnZXQoU3RyaW5nIG5hbWUpIHsKIAkJcmV0dXJuIElOU1RBTkNFLmNvbW1hbmRzLmdldChuYW1lKTsKIAl9CiAKQEAgLTEwOCwxNyArMTA3LDE3IEBAIHB1YmxpYyBzdGF0aWMgQ29tbWFuZFJlZiBnZXQoZmluYWwgU3RyaW5nIG5hbWUpIHsKIAkgKi8KIAlwdWJsaWMgc3RhdGljIENvbW1hbmRSZWZbXSBjb21tb24oKSB7CiAJCWZpbmFsIEFycmF5TGlzdDxDb21tYW5kUmVmPiBjb21tb24gPSBuZXcgQXJyYXlMaXN0PD4oKTsKLQkJZm9yIChmaW5hbCBDb21tYW5kUmVmIGMgOiBJTlNUQU5DRS5jb21tYW5kcy52YWx1ZXMoKSkKKwkJZm9yIChDb21tYW5kUmVmIGMgOiBJTlNUQU5DRS5jb21tYW5kcy52YWx1ZXMoKSkKIAkJCWlmIChjLmlzQ29tbW9uKCkpCiAJCQkJY29tbW9uLmFkZChjKTsKIAkJcmV0dXJuIHRvU29ydGVkQXJyYXkoY29tbW9uKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBDb21tYW5kUmVmW10gdG9Tb3J0ZWRBcnJheShmaW5hbCBDb2xsZWN0aW9uPENvbW1hbmRSZWY+IGMpIHsKKwlwcml2YXRlIHN0YXRpYyBDb21tYW5kUmVmW10gdG9Tb3J0ZWRBcnJheShDb2xsZWN0aW9uPENvbW1hbmRSZWY+IGMpIHsKIAkJZmluYWwgQ29tbWFuZFJlZltdIHIgPSBjLnRvQXJyYXkobmV3IENvbW1hbmRSZWZbYy5zaXplKCldKTsKIAkJQXJyYXlzLnNvcnQociwgbmV3IENvbXBhcmF0b3I8Q29tbWFuZFJlZj4oKSB7CiAJCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShmaW5hbCBDb21tYW5kUmVmIG8xLCBmaW5hbCBDb21tYW5kUmVmIG8yKSB7CisJCQlwdWJsaWMgaW50IGNvbXBhcmUoQ29tbWFuZFJlZiBvMSwgQ29tbWFuZFJlZiBvMikgewogCQkJCXJldHVybiBvMS5nZXROYW1lKCkuY29tcGFyZVRvKG8yLmdldE5hbWUoKSk7CiAJCQl9CiAJCX0pOwpAQCAtMTQ3LDM2ICsxNDYsMjAgQEAgcHJpdmF0ZSBFbnVtZXJhdGlvbjxVUkw+IGNhdGFsb2dzKCkgewogCQl9CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHNjYW4oZmluYWwgVVJMIGNVcmwpIHsKLQkJZmluYWwgQnVmZmVyZWRSZWFkZXIgY0luOwotCQl0cnkgewotCQkJZmluYWwgSW5wdXRTdHJlYW0gaW4gPSBjVXJsLm9wZW5TdHJlYW0oKTsKLQkJCWNJbiA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW4sIFVURl84KSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGVycikgewotCQkJLy8gSWYgd2UgY2Fubm90IHJlYWQgZnJvbSB0aGUgc2VydmljZSBsaXN0LCBnbyB0byB0aGUgbmV4dC4KLQkJCS8vCi0JCQlyZXR1cm47Ci0JCX0KLQotCQl0cnkgeworCXByaXZhdGUgdm9pZCBzY2FuKFVSTCBjVXJsKSB7CisJCXRyeSAoQnVmZmVyZWRSZWFkZXIgY0luID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKAorCQkJCW5ldyBJbnB1dFN0cmVhbVJlYWRlcihjVXJsLm9wZW5TdHJlYW0oKSwgQ0hBUlNFVCkpKSB7CiAJCQlTdHJpbmcgbGluZTsKIAkJCXdoaWxlICgobGluZSA9IGNJbi5yZWFkTGluZSgpKSAhPSBudWxsKSB7CiAJCQkJaWYgKGxpbmUubGVuZ3RoKCkgPiAwICYmICFsaW5lLnN0YXJ0c1dpdGgoIiMiKSkgLy8kTk9OLU5MUy0xJAogCQkJCQlsb2FkKGxpbmUpOwogCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlcnIpIHsKLQkJCS8vIElmIHdlIGZhaWxlZCBkdXJpbmcgYSByZWFkLCBpZ25vcmUgdGhlIGVycm9yLgotCQkJLy8KLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJY0luLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gSWdub3JlIHRoZSBjbG9zZSBlcnJvcjsgd2UgYXJlIG9ubHkgcmVhZGluZy4KLQkJCX0KKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJLy8gSWdub3JlIGVycm9ycwogCQl9CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGxvYWQoZmluYWwgU3RyaW5nIGNuKSB7CisJcHJpdmF0ZSB2b2lkIGxvYWQoU3RyaW5nIGNuKSB7CiAJCWZpbmFsIENsYXNzPD8gZXh0ZW5kcyBUZXh0QnVpbHRpbj4gY2xheno7CiAJCXRyeSB7CiAJCQljbGF6eiA9IENsYXNzLmZvck5hbWUoY24sIGZhbHNlLCBsZHIpLmFzU3ViY2xhc3MoVGV4dEJ1aWx0aW4uY2xhc3MpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0NvbW1hbmRSZWYuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9Db21tYW5kUmVmLmphdmEKaW5kZXggMmM5YmMwZC4uMTc3M2RlNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0NvbW1hbmRSZWYuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vQ29tbWFuZFJlZi5qYXZhCkBAIC02NiwyOSArNjYsMjkgQEAgcHVibGljIGNsYXNzIENvbW1hbmRSZWYgewogCiAJYm9vbGVhbiBjb21tb247CiAKLQlDb21tYW5kUmVmKGZpbmFsIENsYXNzPD8gZXh0ZW5kcyBUZXh0QnVpbHRpbj4gY2xhenopIHsKKwlDb21tYW5kUmVmKENsYXNzPD8gZXh0ZW5kcyBUZXh0QnVpbHRpbj4gY2xhenopIHsKIAkJdGhpcyhjbGF6eiwgZ3Vlc3NOYW1lKGNsYXp6KSk7CiAJfQogCi0JQ29tbWFuZFJlZihmaW5hbCBDbGFzczw/IGV4dGVuZHMgVGV4dEJ1aWx0aW4+IGNsYXp6LCBmaW5hbCBDb21tYW5kIGNtZCkgeworCUNvbW1hbmRSZWYoQ2xhc3M8PyBleHRlbmRzIFRleHRCdWlsdGluPiBjbGF6eiwgQ29tbWFuZCBjbWQpIHsKIAkJdGhpcyhjbGF6eiwgY21kLm5hbWUoKS5sZW5ndGgoKSA+IDAgPyBjbWQubmFtZSgpIDogZ3Vlc3NOYW1lKGNsYXp6KSk7CiAJCXVzYWdlID0gY21kLnVzYWdlKCk7CiAJCWNvbW1vbiA9IGNtZC5jb21tb24oKTsKIAl9CiAKLQlwcml2YXRlIENvbW1hbmRSZWYoZmluYWwgQ2xhc3M8PyBleHRlbmRzIFRleHRCdWlsdGluPiBjbGF6eiwgZmluYWwgU3RyaW5nIGNuKSB7CisJcHJpdmF0ZSBDb21tYW5kUmVmKENsYXNzPD8gZXh0ZW5kcyBUZXh0QnVpbHRpbj4gY2xhenosIFN0cmluZyBjbikgewogCQlpbXBsID0gY2xheno7CiAJCW5hbWUgPSBjbjsKIAkJdXNhZ2UgPSAiIjsgLy8kTk9OLU5MUy0xJAogCX0KIAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBndWVzc05hbWUoZmluYWwgQ2xhc3M8PyBleHRlbmRzIFRleHRCdWlsdGluPiBjbGF6eikgeworCXByaXZhdGUgc3RhdGljIFN0cmluZyBndWVzc05hbWUoQ2xhc3M8PyBleHRlbmRzIFRleHRCdWlsdGluPiBjbGF6eikgewogCQlmaW5hbCBTdHJpbmdCdWlsZGVyIHMgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogCQlpZiAoY2xhenouZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoIm9yZy5lY2xpcHNlLmpnaXQucGdtLmRlYnVnLiIpKSAvLyROT04tTkxTLTEkCiAJCQlzLmFwcGVuZCgiZGVidWctIik7IC8vJE5PTi1OTFMtMSQKIAogCQlib29sZWFuIGxhc3RXYXNEYXNoID0gdHJ1ZTsKLQkJZm9yIChmaW5hbCBjaGFyIGMgOiBjbGF6ei5nZXRTaW1wbGVOYW1lKCkudG9DaGFyQXJyYXkoKSkgeworCQlmb3IgKGNoYXIgYyA6IGNsYXp6LmdldFNpbXBsZU5hbWUoKS50b0NoYXJBcnJheSgpKSB7CiAJCQlpZiAoQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKGMpKSB7CiAJCQkJaWYgKCFsYXN0V2FzRGFzaCkKIAkJCQkJcy5hcHBlbmQoJy0nKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9EYWVtb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9EYWVtb24uamF2YQppbmRleCBkMGFkYTY3Li4zMTliNWUzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vRGFlbW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0RhZW1vbi5qYXZhCkBAIC0xNDIsNyArMTQyLDcgQEAgcHJvdGVjdGVkIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCQlwYWNrQ29uZmlnLnNldEV4ZWN1dG9yKEV4ZWN1dG9ycy5uZXdGaXhlZFRocmVhZFBvb2wodGhyZWFkcykpOwogCiAJCWZpbmFsIEZpbGVSZXNvbHZlcjxEYWVtb25DbGllbnQ+IHJlc29sdmVyID0gbmV3IEZpbGVSZXNvbHZlcjw+KCk7Ci0JCWZvciAoZmluYWwgRmlsZSBmIDogZGlyZWN0b3J5KSB7CisJCWZvciAoRmlsZSBmIDogZGlyZWN0b3J5KSB7CiAJCQlvdXR3LnByaW50bG4oTWVzc2FnZUZvcm1hdC5mb3JtYXQoQ0xJVGV4dC5nZXQoKS5leHBvcnRpbmcsIGYuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKIAkJCXJlc29sdmVyLmV4cG9ydERpcmVjdG9yeShmKTsKIAkJfQpAQCAtMTU3LDE0ICsxNTcsMTQgQEAgcHJvdGVjdGVkIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWlmICgwIDw9IHRpbWVvdXQpCiAJCQlkLnNldFRpbWVvdXQodGltZW91dCk7CiAKLQkJZm9yIChmaW5hbCBTdHJpbmcgbiA6IGVuYWJsZSkKKwkJZm9yIChTdHJpbmcgbiA6IGVuYWJsZSkKIAkJCXNlcnZpY2UoZCwgbikuc2V0RW5hYmxlZCh0cnVlKTsKLQkJZm9yIChmaW5hbCBTdHJpbmcgbiA6IGRpc2FibGUpCisJCWZvciAoU3RyaW5nIG4gOiBkaXNhYmxlKQogCQkJc2VydmljZShkLCBuKS5zZXRFbmFibGVkKGZhbHNlKTsKIAotCQlmb3IgKGZpbmFsIFN0cmluZyBuIDogY2FuT3ZlcnJpZGUpCisJCWZvciAoU3RyaW5nIG4gOiBjYW5PdmVycmlkZSkKIAkJCXNlcnZpY2UoZCwgbikuc2V0T3ZlcnJpZGFibGUodHJ1ZSk7Ci0JCWZvciAoZmluYWwgU3RyaW5nIG4gOiBmb3JiaWRPdmVycmlkZSkKKwkJZm9yIChTdHJpbmcgbiA6IGZvcmJpZE92ZXJyaWRlKQogCQkJc2VydmljZShkLCBuKS5zZXRPdmVycmlkYWJsZShmYWxzZSk7CiAJCWlmIChrZXRjaFNlcnZlclR5cGUgPT0gS2V0Y2hTZXJ2ZXJUeXBlLkxFQURFUikgewogCQkJc3RhcnRLZXRjaExlYWRlcihkKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9EaWUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9EaWUuamF2YQppbmRleCA1OWRlODBjLi40ZWM1ZjA0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vRGllLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0RpZS5qYXZhCkBAIC02Myw3ICs2Myw3IEBAIHB1YmxpYyBjbGFzcyBEaWUgZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKIAkgKiBAcGFyYW0gd2h5CiAJICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBzaG93IHRvIHRoZSBlbmQtdXNlci4KIAkgKi8KLQlwdWJsaWMgRGllKGZpbmFsIFN0cmluZyB3aHkpIHsKKwlwdWJsaWMgRGllKFN0cmluZyB3aHkpIHsKIAkJc3VwZXIod2h5KTsKIAl9CiAKQEAgLTc1LDcgKzc1LDcgQEAgcHVibGljIERpZShmaW5hbCBTdHJpbmcgd2h5KSB7CiAJICogQHBhcmFtIGNhdXNlCiAJICogICAgICAgICAgICB3aHkgdGhlIGNvbW1hbmQgaGFzIGZhaWxlZC4KIAkgKi8KLQlwdWJsaWMgRGllKGZpbmFsIFN0cmluZyB3aHksIGZpbmFsIFRocm93YWJsZSBjYXVzZSkgeworCXB1YmxpYyBEaWUoU3RyaW5nIHdoeSwgVGhyb3dhYmxlIGNhdXNlKSB7CiAJCXN1cGVyKHdoeSwgY2F1c2UpOwogCX0KIApAQCAtMTAwLDcgKzEwMCw3IEBAIHB1YmxpYyBEaWUoYm9vbGVhbiBhYm9ydGVkKSB7CiAJICogICAgICAgICAgICBjYW4gYmUgbnVsbAogCSAqIEBzaW5jZSA0LjIKIAkgKi8KLQlwdWJsaWMgRGllKGJvb2xlYW4gYWJvcnRlZCwgZmluYWwgVGhyb3dhYmxlIGNhdXNlKSB7CisJcHVibGljIERpZShib29sZWFuIGFib3J0ZWQsIFRocm93YWJsZSBjYXVzZSkgewogCQlzdXBlcihjYXVzZSAhPSBudWxsID8gY2F1c2UuZ2V0TWVzc2FnZSgpIDogbnVsbCwgY2F1c2UpOwogCQl0aGlzLmFib3J0ZWQgPSBhYm9ydGVkOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9EaWZmLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vRGlmZi5qYXZhCmluZGV4IGVkNmY3YjQuLjk3ZTNkZjMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9EaWZmLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0RpZmYuamF2YQpAQCAtMTcwLDcgKzE3MCw3IEBAIHZvaWQgbm9QcmVmaXgoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIGJvb2xlYW4gb24pIHsKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdChmaW5hbCBSZXBvc2l0b3J5IHJlcG9zaXRvcnksIGZpbmFsIFN0cmluZyBnaXREaXIpIHsKKwlwcm90ZWN0ZWQgdm9pZCBpbml0KFJlcG9zaXRvcnkgcmVwb3NpdG9yeSwgU3RyaW5nIGdpdERpcikgewogCQlzdXBlci5pbml0KHJlcG9zaXRvcnksIGdpdERpcik7CiAJCWRpZmZGbXQgPSBuZXcgRGlmZkZvcm1hdHRlcihuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0ob3V0cykpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9EaWZmVHJlZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0RpZmZUcmVlLmphdmEKaW5kZXggNTEwNDA2My4uNDJhYWJjMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0RpZmZUcmVlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0RpZmZUcmVlLmphdmEKQEAgLTc1LDkgKzc1LDkgQEAgdm9pZCB0cmVlXzAoZmluYWwgQWJzdHJhY3RUcmVlSXRlcmF0b3IgYykgewogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRyeSAoZmluYWwgVHJlZVdhbGsgd2FsayA9IG5ldyBUcmVlV2FsayhkYikpIHsKKwkJdHJ5IChUcmVlV2FsayB3YWxrID0gbmV3IFRyZWVXYWxrKGRiKSkgewogCQkJd2Fsay5zZXRSZWN1cnNpdmUocmVjdXJzaXZlKTsKLQkJCWZvciAoZmluYWwgQWJzdHJhY3RUcmVlSXRlcmF0b3IgaSA6IHRyZWVzKQorCQkJZm9yIChBYnN0cmFjdFRyZWVJdGVyYXRvciBpIDogdHJlZXMpCiAJCQkJd2Fsay5hZGRUcmVlKGkpOwogCQkJd2Fsay5zZXRGaWx0ZXIoQW5kVHJlZUZpbHRlci5jcmVhdGUoVHJlZUZpbHRlci5BTllfRElGRiwgcGF0aEZpbHRlcikpOwogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vRmV0Y2guamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9GZXRjaC5qYXZhCmluZGV4IGJjNzYzNzIuLjYxZmQ1MjEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9GZXRjaC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9GZXRjaC5qYXZhCkBAIC0xMDAsNiArMTAwLDkgQEAgdm9pZCBub3RhZ3MoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCiAJCXRhZ3MgPSBCb29sZWFuLkZBTFNFOwogCX0KIAorCUBPcHRpb24obmFtZSA9ICItLWZvcmNlIiwgdXNhZ2UgPSAidXNhZ2VfZm9yY2VkRmV0Y2giLCBhbGlhc2VzID0geyAiLWYiIH0pCisJcHJpdmF0ZSBCb29sZWFuIGZvcmNlOworCiAJcHJpdmF0ZSBGZXRjaFJlY3Vyc2VTdWJtb2R1bGVzTW9kZSByZWN1cnNlU3VibW9kdWxlczsKIAogCUBPcHRpb24obmFtZSA9ICItLXJlY3Vyc2Utc3VibW9kdWxlcyIsIHVzYWdlID0gInVzYWdlX3JlY3Vyc2VTdWJtb2R1bGVzIikKQEAgLTE1NSw2ICsxNTgsOSBAQCBwcm90ZWN0ZWQgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCWlmIChxdWlldCA9PSBudWxsIHx8ICFxdWlldC5ib29sZWFuVmFsdWUoKSkKIAkJCQlmZXRjaC5zZXRQcm9ncmVzc01vbml0b3IobmV3IFRleHRQcm9ncmVzc01vbml0b3IoZXJydykpOwogCQkJZmV0Y2guc2V0UmVjdXJzZVN1Ym1vZHVsZXMocmVjdXJzZVN1Ym1vZHVsZXMpLnNldENhbGxiYWNrKHRoaXMpOworCQkJaWYgKGZvcmNlICE9IG51bGwpIHsKKwkJCQlmZXRjaC5zZXRGb3JjZVVwZGF0ZShmb3JjZS5ib29sZWFuVmFsdWUoKSk7CisJCQl9CiAKIAkJCUZldGNoUmVzdWx0IHJlc3VsdCA9IGZldGNoLmNhbGwoKTsKIAkJCWlmIChyZXN1bHQuZ2V0VHJhY2tpbmdSZWZVcGRhdGVzKCkuaXNFbXB0eSgpCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vR2xvZy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0dsb2cuamF2YQppbmRleCBhMDgxYjc4Li4yYjVhZjVkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vR2xvZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9HbG9nLmphdmEKQEAgLTc1LDcgKzc1LDcgQEAgY2xhc3MgR2xvZyBleHRlbmRzIFJldldhbGtUZXh0QnVpbHRpbiB7CiAJCWZyYW1lID0gbmV3IEpGcmFtZSgpOwogCQlmcmFtZS5hZGRXaW5kb3dMaXN0ZW5lcihuZXcgV2luZG93QWRhcHRlcigpIHsKIAkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2luZG93Q2xvc2luZyhmaW5hbCBXaW5kb3dFdmVudCBlKSB7CisJCQlwdWJsaWMgdm9pZCB3aW5kb3dDbG9zaW5nKFdpbmRvd0V2ZW50IGUpIHsKIAkJCQlmcmFtZS5kaXNwb3NlKCk7CiAJCQl9CiAJCX0pOwpAQCAtMTE2LDcgKzExNiw3IEBAIHByb3RlY3RlZCBpbnQgd2Fsa0xvb3AoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2hvdyhmaW5hbCBSZXZDb21taXQgYykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHJvdGVjdGVkIHZvaWQgc2hvdyhSZXZDb21taXQgYykgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0xvZy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0xvZy5qYXZhCmluZGV4IDc1NTQyZDQuLmFkOTJhNzggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9Mb2cuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vTG9nLmphdmEKQEAgLTE4Niw3ICsxODYsNyBAQCB2b2lkIG5vUHJlZml4KEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBib29sZWFuIG9uKSB7CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXQoZmluYWwgUmVwb3NpdG9yeSByZXBvc2l0b3J5LCBmaW5hbCBTdHJpbmcgZ2l0RGlyKSB7CisJcHJvdGVjdGVkIHZvaWQgaW5pdChSZXBvc2l0b3J5IHJlcG9zaXRvcnksIFN0cmluZyBnaXREaXIpIHsKIAkJc3VwZXIuaW5pdChyZXBvc2l0b3J5LCBnaXREaXIpOwogCQlkaWZmRm10ID0gbmV3IERpZmZGb3JtYXR0ZXIobmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG91dHMpKTsKIAl9CkBAIC0yNDEsNyArMjQxLDcgQEAgcHJpdmF0ZSB2b2lkIGFkZE5vdGVNYXAoU3RyaW5nIG5vdGVzUmVmKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzaG93KGZpbmFsIFJldkNvbW1pdCBjKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwcm90ZWN0ZWQgdm9pZCBzaG93KFJldkNvbW1pdCBjKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJb3V0dy5wcmludChDTElUZXh0LmdldCgpLmNvbW1pdExhYmVsKTsKIAkJb3V0dy5wcmludCgiICIpOyAvLyROT04tTkxTLTEkCiAJCWMuZ2V0SWQoKS5jb3B5VG8ob3V0YnVmZmVyLCBvdXR3KTsKQEAgLTI2Niw3ICsyNjYsNyBAQCBwcm90ZWN0ZWQgdm9pZCBzaG93KGZpbmFsIFJldkNvbW1pdCBjKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogCQlvdXR3LnByaW50bG4oKTsKIAkJZmluYWwgU3RyaW5nW10gbGluZXMgPSBjLmdldEZ1bGxNZXNzYWdlKCkuc3BsaXQoIlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJZm9yIChmaW5hbCBTdHJpbmcgcyA6IGxpbmVzKSB7CisJCWZvciAoU3RyaW5nIHMgOiBsaW5lcykgewogCQkJb3V0dy5wcmludCgiICAgICIpOyAvLyROT04tTkxTLTEkCiAJCQlvdXR3LnByaW50KHMpOwogCQkJb3V0dy5wcmludGxuKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vTHNSZW1vdGUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9Mc1JlbW90ZS5qYXZhCmluZGV4IDkwMTNmZjYuLjI3MTFjMTUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9Mc1JlbW90ZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9Mc1JlbW90ZS5qYXZhCkBAIC04Myw3ICs4Myw3IEBAIHB1YmxpYyBpbnQgY29tcGFyZShSZWYgcjEsIFJlZiByMikgewogCQkJfQogCQl9KTsKIAkJcmVmcy5hZGRBbGwoY29tbWFuZC5jYWxsKCkpOwotCQlmb3IgKGZpbmFsIFJlZiByIDogcmVmcykgeworCQlmb3IgKFJlZiByIDogcmVmcykgewogCQkJc2hvdyhyLmdldE9iamVjdElkKCksIHIuZ2V0TmFtZSgpKTsKIAkJCWlmIChyLmdldFBlZWxlZE9iamVjdElkKCkgIT0gbnVsbCkKIAkJCQlzaG93KHIuZ2V0UGVlbGVkT2JqZWN0SWQoKSwgci5nZXROYW1lKCkgKyAiXnt9Iik7IC8vJE5PTi1OTFMtMSQKQEAgLTk2LDcgKzk2LDcgQEAgcHJvdGVjdGVkIGJvb2xlYW4gcmVxdWlyZXNSZXBvc2l0b3J5KCkgewogCQlyZXR1cm4gZmFsc2U7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHNob3coZmluYWwgQW55T2JqZWN0SWQgaWQsIGZpbmFsIFN0cmluZyBuYW1lKQorCXByaXZhdGUgdm9pZCBzaG93KEFueU9iamVjdElkIGlkLCBTdHJpbmcgbmFtZSkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCW91dHcucHJpbnQoaWQubmFtZSgpKTsKIAkJb3V0dy5wcmludCgnXHQnKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9Mc1RyZWUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9Mc1RyZWUuamF2YQppbmRleCBjNTdmOWYyLi4wMWZhN2VlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vTHNUcmVlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0xzVHJlZS5qYXZhCkBAIC03Myw3ICs3Myw3IEBAIGNsYXNzIExzVHJlZSBleHRlbmRzIFRleHRCdWlsdGluIHsKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQogCXByb3RlY3RlZCB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24gewotCQl0cnkgKGZpbmFsIFRyZWVXYWxrIHdhbGsgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CisJCXRyeSAoVHJlZVdhbGsgd2FsayA9IG5ldyBUcmVlV2FsayhkYikpIHsKIAkJCXdhbGsucmVzZXQoKTsgLy8gZHJvcCB0aGUgZmlyc3QgZW1wdHkgdHJlZSwgd2hpY2ggd2UgZG8gbm90IG5lZWQgaGVyZQogCQkJaWYgKHBhdGhzLnNpemUoKSA+IDApCiAJCQkJd2Fsay5zZXRGaWx0ZXIoUGF0aEZpbHRlckdyb3VwLmNyZWF0ZUZyb21TdHJpbmdzKHBhdGhzKSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vTWFpbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL01haW4uamF2YQppbmRleCBhMzc2YmMwLi5hYzUzZGU5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vTWFpbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9NYWluLmphdmEKQEAgLTQ0LDcgKzQ0LDcgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnBnbTsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CkBAIC03MSw2ICs3MSw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5wZ20uaW50ZXJuYWwuQ0xJVGV4dDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnBnbS5vcHQuQ21kTGluZVBhcnNlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnBnbS5vcHQuU3ViY29tbWFuZEhhbmRsZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmZpbGUuV2luZG93Q2FjaGVDb25maWc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuSHR0cFRyYW5zcG9ydDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5odHRwLmFwYWNoZS5IdHRwQ2xpZW50Q29ubmVjdGlvbkZhY3Rvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLkNhY2hlZEF1dGhlbnRpY2F0b3I7CkBAIC0xMDUsMTAgKzEwNiwxOSBAQCBwdWJsaWMgY2xhc3MgTWFpbiB7CiAKIAlwcml2YXRlIEV4ZWN1dG9yU2VydmljZSBnY0V4ZWN1dG9yOwogCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1CID0gMTAyNCAqIDEwMjQ7CisKIAkvKioKIAkgKiA8cD5Db25zdHJ1Y3RvciBmb3IgTWFpbi48L3A+CiAJICovCiAJcHVibGljIE1haW4oKSB7CisJCWZpbmFsIFdpbmRvd0NhY2hlQ29uZmlnIGMgPSBuZXcgV2luZG93Q2FjaGVDb25maWcoKTsKKwkJYy5zZXRQYWNrZWRHaXRNTUFQKHRydWUpOworCQljLnNldFBhY2tlZEdpdFdpbmRvd1NpemUoOCAqIDEwMjQpOworCQljLnNldFBhY2tlZEdpdExpbWl0KDEwICogTUIpOworCQljLnNldERlbHRhQmFzZUNhY2hlTGltaXQoMTAgKiBNQik7CisJCWMuc2V0U3RyZWFtRmlsZVRocmVzaG9sZCg1MCAqIE1CKTsKKwkJYy5pbnN0YWxsKCk7CiAJCUh0dHBUcmFuc3BvcnQuc2V0Q29ubmVjdGlvbkZhY3RvcnkobmV3IEh0dHBDbGllbnRDb25uZWN0aW9uRmFjdG9yeSgpKTsKIAkJQnVpbHRpbkxGUy5yZWdpc3RlcigpOwogCQlnY0V4ZWN1dG9yID0gRXhlY3V0b3JzLm5ld1NpbmdsZVRocmVhZEV4ZWN1dG9yKG5ldyBUaHJlYWRGYWN0b3J5KCkgewpAQCAtMTMxLDcgKzE0MSw3IEBAIHB1YmxpYyBUaHJlYWQgbmV3VGhyZWFkKFJ1bm5hYmxlIHRhc2tCb2R5KSB7CiAJICogICAgICAgICAgICBhcmd1bWVudHMuCiAJICogQHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uCiAJICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oZmluYWwgU3RyaW5nW10gYXJndikgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJndikgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCS8vIG1ha2Ugc3VyZSBidWlsdC1pbiBmaWx0ZXJzIGFyZSByZWdpc3RlcmVkCiAJCUJ1aWx0aW5MRlMucmVnaXN0ZXIoKTsKIApAQCAtMTU1LDcgKzE2NSw3IEBAIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKGZpbmFsIFN0cmluZ1tdIGFyZ3YpIHRocm93cyBFeGNlcHRpb24gewogCSAqICAgICAgICAgICAgYXJndW1lbnRzLgogCSAqIEB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbgogCSAqLwotCXByb3RlY3RlZCB2b2lkIHJ1bihmaW5hbCBTdHJpbmdbXSBhcmd2KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwcm90ZWN0ZWQgdm9pZCBydW4oU3RyaW5nW10gYXJndikgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXdyaXRlciA9IGNyZWF0ZUVycm9yV3JpdGVyKCk7CiAJCXRyeSB7CiAJCQlpZiAoIWluc3RhbGxDb25zb2xlKCkpIHsKQEAgLTIxNywxMCArMjI3LDEwIEBAIHByb3RlY3RlZCB2b2lkIHJ1bihmaW5hbCBTdHJpbmdbXSBhcmd2KSB0aHJvd3MgRXhjZXB0aW9uIHsKIAl9CiAKIAlQcmludFdyaXRlciBjcmVhdGVFcnJvcldyaXRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcmludFdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKFN5c3RlbS5lcnIsIFVURl84KSk7CisJCXJldHVybiBuZXcgUHJpbnRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihTeXN0ZW0uZXJyLCBDSEFSU0VUKSk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGV4ZWN1dGUoZmluYWwgU3RyaW5nW10gYXJndikgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHJpdmF0ZSB2b2lkIGV4ZWN1dGUoU3RyaW5nW10gYXJndikgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWZpbmFsIENtZExpbmVQYXJzZXIgY2xwID0gbmV3IFN1YmNvbW1hbmRMaW5lUGFyc2VyKHRoaXMpOwogCiAJCXRyeSB7CkBAIC0yNDYsMTIgKzI1NiwxMiBAQCBwcml2YXRlIHZvaWQgZXhlY3V0ZShmaW5hbCBTdHJpbmdbXSBhcmd2KSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCQl3cml0ZXIucHJpbnRsbihDTElUZXh0LmdldCgpLm1vc3RDb21tb25seVVzZWRDb21tYW5kc0FyZSk7CiAJCQkJZmluYWwgQ29tbWFuZFJlZltdIGNvbW1vbiA9IENvbW1hbmRDYXRhbG9nLmNvbW1vbigpOwogCQkJCWludCB3aWR0aCA9IDA7Ci0JCQkJZm9yIChmaW5hbCBDb21tYW5kUmVmIGMgOiBjb21tb24pIHsKKwkJCQlmb3IgKENvbW1hbmRSZWYgYyA6IGNvbW1vbikgewogCQkJCQl3aWR0aCA9IE1hdGgubWF4KHdpZHRoLCBjLmdldE5hbWUoKS5sZW5ndGgoKSk7CiAJCQkJfQogCQkJCXdpZHRoICs9IDI7CiAKLQkJCQlmb3IgKGZpbmFsIENvbW1hbmRSZWYgYyA6IGNvbW1vbikgeworCQkJCWZvciAoQ29tbWFuZFJlZiBjIDogY29tbW9uKSB7CiAJCQkJCXdyaXRlci5wcmludCgnICcpOwogCQkJCQl3cml0ZXIucHJpbnQoYy5nZXROYW1lKCkpOwogCQkJCQlmb3IgKGludCBpID0gYy5nZXROYW1lKCkubGVuZ3RoKCk7IGkgPCB3aWR0aDsgaSsrKSB7CkBAIC0yODYsNyArMjk2LDcgQEAgcHJpdmF0ZSB2b2lkIGV4ZWN1dGUoZmluYWwgU3RyaW5nW10gYXJndikgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCX0KIAl9CiAKLQl2b2lkIGluaXQoZmluYWwgVGV4dEJ1aWx0aW4gY21kKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXZvaWQgaW5pdChUZXh0QnVpbHRpbiBjbWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWlmIChjbWQucmVxdWlyZXNSZXBvc2l0b3J5KCkpIHsKIAkJCWNtZC5pbml0KG9wZW5HaXREaXIoZ2l0ZGlyKSwgbnVsbCk7CiAJCX0gZWxzZSB7CkBAIC0zNTAsNyArMzYwLDcgQEAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpbnN0YWxsQ29uc29sZSgpIHsKIAkJfQogCX0KIAotCXByaXZhdGUgc3RhdGljIHZvaWQgaW5zdGFsbChmaW5hbCBTdHJpbmcgbmFtZSkKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGluc3RhbGwoU3RyaW5nIG5hbWUpCiAJCQl0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwKIAkJCU5vU3VjaE1ldGhvZEV4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CiAJCXRyeSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vTWVyZ2VCYXNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vTWVyZ2VCYXNlLmphdmEKaW5kZXggNjJhODhhZS4uNjg0MmQ4ZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL01lcmdlQmFzZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9NZXJnZUJhc2UuamF2YQpAQCAtNjgsNyArNjgsNyBAQCB2b2lkIGNvbW1pdF8wKGZpbmFsIFJldkNvbW1pdCBjKSB7CiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZm9yIChmaW5hbCBSZXZDb21taXQgYyA6IGNvbW1pdHMpCisJCWZvciAoUmV2Q29tbWl0IGMgOiBjb21taXRzKQogCQkJYXJnV2Fsay5tYXJrU3RhcnQoYyk7CiAJCWFyZ1dhbGsuc2V0UmV2RmlsdGVyKFJldkZpbHRlci5NRVJHRV9CQVNFKTsKIAkJaW50IG1heCA9IGFsbCA/IEludGVnZXIuTUFYX1ZBTFVFIDogMTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9QdXNoLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vUHVzaC5qYXZhCmluZGV4IDMwOWRjYTIuLmJlOGFkMzcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9QdXNoLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL1B1c2guamF2YQpAQCAtMTQ5LDcgKzE0OSw3IEBAIHByaXZhdGUgdm9pZCBwcmludFB1c2hSZXN1bHQoZmluYWwgT2JqZWN0UmVhZGVyIHJlYWRlciwgZmluYWwgVVJJaXNoIHVyaSwKIAkJYm9vbGVhbiBldmVyeXRoaW5nVXBUb0RhdGUgPSB0cnVlOwogCiAJCS8vIGF0IGZpcnN0LCBwcmludCB1cC10by1kYXRlIG9uZXMuLi4KLQkJZm9yIChmaW5hbCBSZW1vdGVSZWZVcGRhdGUgcnJ1IDogcmVzdWx0LmdldFJlbW90ZVVwZGF0ZXMoKSkgeworCQlmb3IgKFJlbW90ZVJlZlVwZGF0ZSBycnUgOiByZXN1bHQuZ2V0UmVtb3RlVXBkYXRlcygpKSB7CiAJCQlpZiAocnJ1LmdldFN0YXR1cygpID09IFN0YXR1cy5VUF9UT19EQVRFKSB7CiAJCQkJaWYgKHZlcmJvc2UpCiAJCQkJCXByaW50UmVmVXBkYXRlUmVzdWx0KHJlYWRlciwgdXJpLCByZXN1bHQsIHJydSk7CkBAIC0xNTcsMTMgKzE1NywxMyBAQCBwcml2YXRlIHZvaWQgcHJpbnRQdXNoUmVzdWx0KGZpbmFsIE9iamVjdFJlYWRlciByZWFkZXIsIGZpbmFsIFVSSWlzaCB1cmksCiAJCQkJZXZlcnl0aGluZ1VwVG9EYXRlID0gZmFsc2U7CiAJCX0KIAotCQlmb3IgKGZpbmFsIFJlbW90ZVJlZlVwZGF0ZSBycnUgOiByZXN1bHQuZ2V0UmVtb3RlVXBkYXRlcygpKSB7CisJCWZvciAoUmVtb3RlUmVmVXBkYXRlIHJydSA6IHJlc3VsdC5nZXRSZW1vdGVVcGRhdGVzKCkpIHsKIAkJCS8vIC4uLnRoZW4gc3VjY2Vzc2Z1bCB1cGRhdGVzLi4uCiAJCQlpZiAocnJ1LmdldFN0YXR1cygpID09IFN0YXR1cy5PSykKIAkJCQlwcmludFJlZlVwZGF0ZVJlc3VsdChyZWFkZXIsIHVyaSwgcmVzdWx0LCBycnUpOwogCQl9CiAKLQkJZm9yIChmaW5hbCBSZW1vdGVSZWZVcGRhdGUgcnJ1IDogcmVzdWx0LmdldFJlbW90ZVVwZGF0ZXMoKSkgeworCQlmb3IgKFJlbW90ZVJlZlVwZGF0ZSBycnUgOiByZXN1bHQuZ2V0UmVtb3RlVXBkYXRlcygpKSB7CiAJCQkvLyAuLi5maW5hbGx5LCBvdGhlcnMgKHByb2JsZW1hdGljKQogCQkJaWYgKHJydS5nZXRTdGF0dXMoKSAhPSBTdGF0dXMuT0sKIAkJCQkJJiYgcnJ1LmdldFN0YXR1cygpICE9IFN0YXR1cy5VUF9UT19EQVRFKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL1JlbW90ZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL1JlbW90ZS5qYXZhCmluZGV4IDk0OGNiYzUuLjMzMDhlMTggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9SZW1vdGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vUmVtb3RlLmphdmEKQEAgLTE0Niw3ICsxNDYsNyBAQCBwcm90ZWN0ZWQgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcHJpbnRVc2FnZShmaW5hbCBTdHJpbmcgbWVzc2FnZSwgZmluYWwgQ21kTGluZVBhcnNlciBjbHApCisJcHVibGljIHZvaWQgcHJpbnRVc2FnZShTdHJpbmcgbWVzc2FnZSwgQ21kTGluZVBhcnNlciBjbHApCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQllcnJ3LnByaW50bG4obWVzc2FnZSk7CiAJCWVycncucHJpbnRsbigiamdpdCByZW1vdGUgWy0tdmVyYm9zZSAoLXYpXSBbLS1oZWxwICgtaCldIik7IC8vJE5PTi1OTFMtMSQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9SZXZMaXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vUmV2TGlzdC5qYXZhCmluZGV4IDhjODhhNWMuLjEwMWZiYjIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9SZXZMaXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL1Jldkxpc3QuamF2YQpAQCAtNTMsNyArNTMsNyBAQAogY2xhc3MgUmV2TGlzdCBleHRlbmRzIFJldldhbGtUZXh0QnVpbHRpbiB7CiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzaG93KGZpbmFsIFJldkNvbW1pdCBjKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwcm90ZWN0ZWQgdm9pZCBzaG93KFJldkNvbW1pdCBjKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJaWYgKGMuaGFzKFJldkZsYWcuVU5JTlRFUkVTVElORykpCiAJCQlvdXR3LnByaW50KCctJyk7CiAJCWMuZ2V0SWQoKS5jb3B5VG8ob3V0YnVmZmVyLCBvdXR3KTsKQEAgLTY3LDcgKzY3LDcgQEAgcHJvdGVjdGVkIHZvaWQgc2hvdyhmaW5hbCBSZXZDb21taXQgYykgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNob3coZmluYWwgT2JqZWN0V2FsayBvdywgZmluYWwgUmV2T2JqZWN0IG9iaikKKwlwcm90ZWN0ZWQgdm9pZCBzaG93KE9iamVjdFdhbGsgb3csIFJldk9iamVjdCBvYmopCiAJCQl0aHJvd3MgRXhjZXB0aW9uIHsKIAkJaWYgKG9iai5oYXMoUmV2RmxhZy5VTklOVEVSRVNUSU5HKSkKIAkJCW91dHcucHJpbnQoJy0nKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9SZXZQYXJzZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL1JldlBhcnNlLmphdmEKaW5kZXggMjFhZGY3My4uYWMwOGNkNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL1JldlBhcnNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL1JldlBhcnNlLmphdmEKQEAgLTQ1LDExICs0NSw4IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5wZ207CiAKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmRGF0YWJhc2UuQUxMOwotCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmOwpAQCAtNzQsOCArNzEsNyBAQCBjbGFzcyBSZXZQYXJzZSBleHRlbmRzIFRleHRCdWlsdGluIHsKIAlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJaWYgKGFsbCkgewotCQkJTWFwPFN0cmluZywgUmVmPiBhbGxSZWZzID0gZGIuZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzKEFMTCk7Ci0JCQlmb3IgKGZpbmFsIFJlZiByIDogYWxsUmVmcy52YWx1ZXMoKSkgeworCQkJZm9yIChSZWYgciA6IGRiLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcygpKSB7CiAJCQkJT2JqZWN0SWQgb2JqZWN0SWQgPSByLmdldE9iamVjdElkKCk7CiAJCQkJLy8gZ2V0UmVmcyBza2lwcyBkYW5nbGluZyBzeW1yZWZzLCBzbyBvYmplY3RJZCBzaG91bGQgbmV2ZXIgYmUKIAkJCQkvLyBudWxsLgpAQCAtOTEsNyArODcsNyBAQCBwcm90ZWN0ZWQgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCQkJCUNMSVRleHQuZm9ybWF0KENMSVRleHQuZ2V0KCkubmVlZFNpbmdsZVJldmlzaW9uKSk7CiAJCQl9CiAKLQkJCWZvciAoZmluYWwgT2JqZWN0SWQgbyA6IGNvbW1pdHMpIHsKKwkJCWZvciAoT2JqZWN0SWQgbyA6IGNvbW1pdHMpIHsKIAkJCQlvdXR3LnByaW50bG4oby5uYW1lKCkpOwogCQkJfQogCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vUmV2V2Fsa1RleHRCdWlsdGluLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vUmV2V2Fsa1RleHRCdWlsdGluLmphdmEKaW5kZXggM2ZjOTEwMS4uMTVhYmVhYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL1JldldhbGtUZXh0QnVpbHRpbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9SZXZXYWxrVGV4dEJ1aWx0aW4uamF2YQpAQCAtNDcsMTQgKzQ3LDEyIEBACiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuRW51bVNldDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5kaWZmLkRpZmZDb25maWc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZkRhdGFiYXNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucGdtLmludGVybmFsLkNMSVRleHQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5wZ20ub3B0LlBhdGhUcmVlRmlsdGVySGFuZGxlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuRm9sbG93RmlsdGVyOwpAQCAtOTMsNyArOTEsNyBAQCBhYnN0cmFjdCBjbGFzcyBSZXZXYWxrVGV4dEJ1aWx0aW4gZXh0ZW5kcyBUZXh0QnVpbHRpbiB7CiAKIAlwcml2YXRlIGZpbmFsIEVudW1TZXQ8UmV2U29ydD4gc29ydGluZyA9IEVudW1TZXQubm9uZU9mKFJldlNvcnQuY2xhc3MpOwogCi0JcHJpdmF0ZSB2b2lkIGVuYWJsZVJldlNvcnQoZmluYWwgUmV2U29ydCB0eXBlLCBmaW5hbCBib29sZWFuIG9uKSB7CisJcHJpdmF0ZSB2b2lkIGVuYWJsZVJldlNvcnQoUmV2U29ydCB0eXBlLCBib29sZWFuIG9uKSB7CiAJCWlmIChvbikKIAkJCXNvcnRpbmcuYWRkKHR5cGUpOwogCQllbHNlCkBAIC0xMDEsMjIgKzk5LDIyIEBAIHByaXZhdGUgdm9pZCBlbmFibGVSZXZTb3J0KGZpbmFsIFJldlNvcnQgdHlwZSwgZmluYWwgYm9vbGVhbiBvbikgewogCX0KIAogCUBPcHRpb24obmFtZSA9ICItLWRhdGUtb3JkZXIiKQotCXZvaWQgZW5hYmxlRGF0ZU9yZGVyKGZpbmFsIGJvb2xlYW4gb24pIHsKKwl2b2lkIGVuYWJsZURhdGVPcmRlcihib29sZWFuIG9uKSB7CiAJCWVuYWJsZVJldlNvcnQoUmV2U29ydC5DT01NSVRfVElNRV9ERVNDLCBvbik7CiAJfQogCiAJQE9wdGlvbihuYW1lID0gIi0tdG9wby1vcmRlciIpCi0Jdm9pZCBlbmFibGVUb3BvT3JkZXIoZmluYWwgYm9vbGVhbiBvbikgeworCXZvaWQgZW5hYmxlVG9wb09yZGVyKGJvb2xlYW4gb24pIHsKIAkJZW5hYmxlUmV2U29ydChSZXZTb3J0LlRPUE8sIG9uKTsKIAl9CiAKIAlAT3B0aW9uKG5hbWUgPSAiLS1yZXZlcnNlIikKLQl2b2lkIGVuYWJsZVJldmVyc2UoZmluYWwgYm9vbGVhbiBvbikgeworCXZvaWQgZW5hYmxlUmV2ZXJzZShib29sZWFuIG9uKSB7CiAJCWVuYWJsZVJldlNvcnQoUmV2U29ydC5SRVZFUlNFLCBvbik7CiAJfQogCiAJQE9wdGlvbihuYW1lID0gIi0tYm91bmRhcnkiKQotCXZvaWQgZW5hYmxlQm91bmRhcnkoZmluYWwgYm9vbGVhbiBvbikgeworCXZvaWQgZW5hYmxlQm91bmRhcnkoYm9vbGVhbiBvbikgewogCQllbmFibGVSZXZTb3J0KFJldlNvcnQuQk9VTkRBUlksIG9uKTsKIAl9CiAKQEAgLTEzMiwxNyArMTMwLDE3IEBAIHZvaWQgZW5hYmxlQm91bmRhcnkoZmluYWwgYm9vbGVhbiBvbikgewogCXByaXZhdGUgZmluYWwgTGlzdDxSZXZGaWx0ZXI+IHJldkxpbWl0ZXIgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAogCUBPcHRpb24obmFtZSA9ICItLWF1dGhvciIpCi0Jdm9pZCBhZGRBdXRob3JSZXZGaWx0ZXIoZmluYWwgU3RyaW5nIHdobykgeworCXZvaWQgYWRkQXV0aG9yUmV2RmlsdGVyKFN0cmluZyB3aG8pIHsKIAkJcmV2TGltaXRlci5hZGQoQXV0aG9yUmV2RmlsdGVyLmNyZWF0ZSh3aG8pKTsKIAl9CiAKIAlAT3B0aW9uKG5hbWUgPSAiLS1jb21taXR0ZXIiKQotCXZvaWQgYWRkQ29tbWl0dGVyUmV2RmlsdGVyKGZpbmFsIFN0cmluZyB3aG8pIHsKKwl2b2lkIGFkZENvbW1pdHRlclJldkZpbHRlcihTdHJpbmcgd2hvKSB7CiAJCXJldkxpbWl0ZXIuYWRkKENvbW1pdHRlclJldkZpbHRlci5jcmVhdGUod2hvKSk7CiAJfQogCiAJQE9wdGlvbihuYW1lID0gIi0tZ3JlcCIpCi0Jdm9pZCBhZGRDTWVzc2FnZVJldkZpbHRlcihmaW5hbCBTdHJpbmcgbXNnKSB7CisJdm9pZCBhZGRDTWVzc2FnZVJldkZpbHRlcihTdHJpbmcgbXNnKSB7CiAJCXJldkxpbWl0ZXIuYWRkKE1lc3NhZ2VSZXZGaWx0ZXIuY3JlYXRlKG1zZykpOwogCX0KIApAQCAtMTUzLDcgKzE1MSw3IEBAIHZvaWQgYWRkQ01lc3NhZ2VSZXZGaWx0ZXIoZmluYWwgU3RyaW5nIG1zZykgewogCUBPdmVycmlkZQogCXByb3RlY3RlZCB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24gewogCQl3YWxrID0gY3JlYXRlV2FsaygpOwotCQlmb3IgKGZpbmFsIFJldlNvcnQgcyA6IHNvcnRpbmcpCisJCWZvciAoUmV2U29ydCBzIDogc29ydGluZykKIAkJCXdhbGsuc29ydChzLCB0cnVlKTsKIAogCQlpZiAocGF0aEZpbHRlciA9PSBUcmVlRmlsdGVyLkFMTCkgewpAQCAtMTcxLDkgKzE2OSw3IEBAIGVsc2UgaWYgKHJldkxpbWl0ZXIuc2l6ZSgpID4gMSkKIAkJCXdhbGsuc2V0UmV2RmlsdGVyKEFuZFJldkZpbHRlci5jcmVhdGUocmV2TGltaXRlcikpOwogCiAJCWlmIChhbGwpIHsKLQkJCU1hcDxTdHJpbmcsIFJlZj4gcmVmcyA9Ci0JCQkJZGIuZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzKFJlZkRhdGFiYXNlLkFMTCk7Ci0JCQlmb3IgKFJlZiBhIDogcmVmcy52YWx1ZXMoKSkgeworCQkJZm9yIChSZWYgYSA6IGRiLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcygpKSB7CiAJCQkJT2JqZWN0SWQgb2lkID0gYS5nZXRQZWVsZWRPYmplY3RJZCgpOwogCQkJCWlmIChvaWQgPT0gbnVsbCkKIAkJCQkJb2lkID0gYS5nZXRPYmplY3RJZCgpOwpAQCAtMTkxLDcgKzE4Nyw3IEBAIGVsc2UgaWYgKHJldkxpbWl0ZXIuc2l6ZSgpID4gMSkKIAkJCQl0aHJvdyBkaWUoTWVzc2FnZUZvcm1hdC5mb3JtYXQoQ0xJVGV4dC5nZXQoKS5jYW5ub3RSZXNvbHZlLCBDb25zdGFudHMuSEVBRCkpOwogCQkJY29tbWl0cy5hZGQod2Fsay5wYXJzZUNvbW1pdChoZWFkKSk7CiAJCX0KLQkJZm9yIChmaW5hbCBSZXZDb21taXQgYyA6IGNvbW1pdHMpIHsKKwkJZm9yIChSZXZDb21taXQgYyA6IGNvbW1pdHMpIHsKIAkJCWZpbmFsIFJldkNvbW1pdCByZWFsID0gYXJnV2FsayA9PSB3YWxrID8gYyA6IHdhbGsucGFyc2VDb21taXQoYyk7CiAJCQlpZiAoYy5oYXMoUmV2RmxhZy5VTklOVEVSRVNUSU5HKSkKIAkJCQl3YWxrLm1hcmtVbmludGVyZXN0aW5nKHJlYWwpOwpAQCAtMjM3LDcgKzIzMyw3IEBAIGVsc2UgaWYgKGFyZ1dhbGsgIT0gbnVsbCkKIAkgKi8KIAlwcm90ZWN0ZWQgaW50IHdhbGtMb29wKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWludCBuID0gMDsKLQkJZm9yIChmaW5hbCBSZXZDb21taXQgYyA6IHdhbGspIHsKKwkJZm9yIChSZXZDb21taXQgYyA6IHdhbGspIHsKIAkJCWlmICgrK24gPiBtYXhDb3VudCAmJiBtYXhDb3VudCA+PSAwKQogCQkJCWJyZWFrOwogCQkJc2hvdyhjKTsKQEAgLTI2NCw3ICsyNjAsNyBAQCBwcm90ZWN0ZWQgaW50IHdhbGtMb29wKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJICogICAgICAgICAgICBUaGUgY3VycmVudCB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldkNvbW1pdH0KIAkgKiBAdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24KIAkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBzaG93KGZpbmFsIFJldkNvbW1pdCBjKSB0aHJvd3MgRXhjZXB0aW9uOworCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHNob3coUmV2Q29tbWl0IGMpIHRocm93cyBFeGNlcHRpb247CiAKIAkvKioKIAkgKiAiU2hvdyIgdGhlIGN1cnJlbnQgUmV2Q29tbWl0IHdoZW4gY2FsbGVkIGZyb20gdGhlIG1haW4gcHJvY2Vzc2luZyBsb29wLgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL1Nob3cuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9TaG93LmphdmEKaW5kZXggZGUwNDA0NS4uODlhMTVmZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL1Nob3cuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vU2hvdy5qYXZhCkBAIC0xNjcsNyArMTY3LDcgQEAgdm9pZCBub1ByZWZpeChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgYm9vbGVhbiBvbikgewogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0KGZpbmFsIFJlcG9zaXRvcnkgcmVwb3NpdG9yeSwgZmluYWwgU3RyaW5nIGdpdERpcikgeworCXByb3RlY3RlZCB2b2lkIGluaXQoUmVwb3NpdG9yeSByZXBvc2l0b3J5LCBTdHJpbmcgZ2l0RGlyKSB7CiAJCXN1cGVyLmluaXQocmVwb3NpdG9yeSwgZ2l0RGlyKTsKIAkJZGlmZkZtdCA9IG5ldyBEaWZmRm9ybWF0dGVyKG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShvdXRzKSk7CiAJfQpAQCAtMjQ4LDcgKzI0OCw3IEBAIHByaXZhdGUgdm9pZCBzaG93KFJldlRhZyB0YWcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAKIAkJb3V0dy5wcmludGxuKCk7CiAJCWZpbmFsIFN0cmluZ1tdIGxpbmVzID0gdGFnLmdldEZ1bGxNZXNzYWdlKCkuc3BsaXQoIlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJZm9yIChmaW5hbCBTdHJpbmcgcyA6IGxpbmVzKSB7CisJCWZvciAoU3RyaW5nIHMgOiBsaW5lcykgewogCQkJb3V0dy5wcmludCgiICAgICIpOyAvLyROT04tTkxTLTEkCiAJCQlvdXR3LnByaW50KHMpOwogCQkJb3V0dy5wcmludGxuKCk7CkBAIC0yNTksNyArMjU5LDcgQEAgcHJpdmF0ZSB2b2lkIHNob3coUmV2VGFnIHRhZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAogCXByaXZhdGUgdm9pZCBzaG93KFJldlRyZWUgb2JqKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKIAkJCUluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sIENvcnJ1cHRPYmplY3RFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJdHJ5IChmaW5hbCBUcmVlV2FsayB3YWxrID0gbmV3IFRyZWVXYWxrKGRiKSkgeworCQl0cnkgKFRyZWVXYWxrIHdhbGsgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CiAJCQl3YWxrLnJlc2V0KCk7CiAJCQl3YWxrLmFkZFRyZWUob2JqKTsKIApAQCAtMjczLDcgKzI3Myw3IEBAIHByaXZhdGUgdm9pZCBzaG93KFJldlRyZWUgb2JqKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKIAkJfQogCX0KIAotCXByaXZhdGUgdm9pZCBzaG93KFJldldhbGsgcncsIGZpbmFsIFJldkNvbW1pdCBjKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwcml2YXRlIHZvaWQgc2hvdyhSZXZXYWxrIHJ3LCBSZXZDb21taXQgYykgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNoYXJbXSBvdXRidWZmZXIgPSBuZXcgY2hhcltDb25zdGFudHMuT0JKRUNUX0lEX0xFTkdUSCAqIDJdOwogCiAJCW91dHcucHJpbnQoQ0xJVGV4dC5nZXQoKS5jb21taXRMYWJlbCk7CkBAIC0yOTIsNyArMjkyLDcgQEAgcHJpdmF0ZSB2b2lkIHNob3coUmV2V2FsayBydywgZmluYWwgUmV2Q29tbWl0IGMpIHRocm93cyBFeGNlcHRpb24gewogCiAJCW91dHcucHJpbnRsbigpOwogCQlmaW5hbCBTdHJpbmdbXSBsaW5lcyA9IGMuZ2V0RnVsbE1lc3NhZ2UoKS5zcGxpdCgiXG4iKTsgLy8kTk9OLU5MUy0xJAotCQlmb3IgKGZpbmFsIFN0cmluZyBzIDogbGluZXMpIHsKKwkJZm9yIChTdHJpbmcgcyA6IGxpbmVzKSB7CiAJCQlvdXR3LnByaW50KCIgICAgIik7IC8vJE5PTi1OTFMtMSQKIAkJCW91dHcucHJpbnQocyk7CiAJCQlvdXR3LnByaW50bG4oKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9TaG93UmVmLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vU2hvd1JlZi5qYXZhCmluZGV4IDdiNTlkNDMuLjYzMThhNjMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9TaG93UmVmLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL1Nob3dSZWYuamF2YQpAQCAtNDUsMjMgKzQ1LDE5IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5wZ207CiAKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmRGF0YWJhc2UuQUxMOwotCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5BbnlPYmplY3RJZDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWY7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmQ29tcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuUmVmTWFwOwogCiBAQ29tbWFuZCh1c2FnZSA9ICJ1c2FnZV9TaG93UmVmIikKIGNsYXNzIFNob3dSZWYgZXh0ZW5kcyBUZXh0QnVpbHRpbiB7CiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZm9yIChmaW5hbCBSZWYgciA6IGdldFNvcnRlZFJlZnMoKSkgeworCQlmb3IgKFJlZiByIDogZ2V0U29ydGVkUmVmcygpKSB7CiAJCQlzaG93KHIuZ2V0T2JqZWN0SWQoKSwgci5nZXROYW1lKCkpOwogCQkJaWYgKHIuZ2V0UGVlbGVkT2JqZWN0SWQoKSAhPSBudWxsKQogCQkJCXNob3coci5nZXRQZWVsZWRPYmplY3RJZCgpLCByLmdldE5hbWUoKSArICJee30iKTsgLy8kTk9OLU5MUy0xJApAQCAtNjksMTQgKzY1LDEzIEBAIHByb3RlY3RlZCB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24gewogCX0KIAogCXByaXZhdGUgSXRlcmFibGU8UmVmPiBnZXRTb3J0ZWRSZWZzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU1hcDxTdHJpbmcsIFJlZj4gYWxsID0gZGIuZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzKEFMTCk7Ci0JCWlmIChhbGwgaW5zdGFuY2VvZiBSZWZNYXAKLQkJCQl8fCAoYWxsIGluc3RhbmNlb2YgU29ydGVkTWFwICYmICgoU29ydGVkTWFwKSBhbGwpLmNvbXBhcmF0b3IoKSA9PSBudWxsKSkKLQkJCXJldHVybiBhbGwudmFsdWVzKCk7Ci0JCXJldHVybiBSZWZDb21wYXJhdG9yLnNvcnQoYWxsLnZhbHVlcygpKTsKKwkJTGlzdDxSZWY+IGFsbCA9IGRiLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcygpOworCQkvLyBUT0RPKGpybikgY2hlY2sgaWYgd2UgY2FuIHJlaW50cm9kdWNlIGZhc3QtcGF0aCBieSBlLmcuIGltcGxlbWVudGluZworCQkvLyBTb3J0ZWRMaXN0CisJCXJldHVybiBSZWZDb21wYXJhdG9yLnNvcnQoYWxsKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgc2hvdyhmaW5hbCBBbnlPYmplY3RJZCBpZCwgZmluYWwgU3RyaW5nIG5hbWUpCisJcHJpdmF0ZSB2b2lkIHNob3coQW55T2JqZWN0SWQgaWQsIFN0cmluZyBuYW1lKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJb3V0dy5wcmludChpZC5uYW1lKCkpOwogCQlvdXR3LnByaW50KCdcdCcpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL1RleHRCdWlsdGluLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vVGV4dEJ1aWx0aW4uamF2YQppbmRleCBiYzM3NTVkLi43ZTViNTQ1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vVGV4dEJ1aWx0aW4uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vVGV4dEJ1aWx0aW4uamF2YQpAQCAtMTI5LDcgKzEyOSw3IEBAIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUZXh0QnVpbHRpbiB7CiAJLyoqIFJldldhbGsgdXNlZCBkdXJpbmcgY29tbWFuZCBsaW5lIHBhcnNpbmcsIGlmIGl0IHdhcyByZXF1aXJlZC4gKi8KIAlwcm90ZWN0ZWQgUmV2V2FsayBhcmdXYWxrOwogCi0JZmluYWwgdm9pZCBzZXRDb21tYW5kTmFtZShmaW5hbCBTdHJpbmcgbmFtZSkgeworCWZpbmFsIHZvaWQgc2V0Q29tbWFuZE5hbWUoU3RyaW5nIG5hbWUpIHsKIAkJY29tbWFuZE5hbWUgPSBuYW1lOwogCX0KIApAQCAtMTc2LDcgKzE3Niw3IEBAIHB1YmxpYyB2b2lkIGluaXRSYXcoZmluYWwgUmVwb3NpdG9yeSByZXBvc2l0b3J5LCBmaW5hbCBTdHJpbmcgZ2l0RGlyLAogCSAqICAgICAgICAgICAgdmFsdWUgb2YgdGhlIHtAY29kZSAtLWdpdC1kaXJ9IGNvbW1hbmQgbGluZSBvcHRpb24sIGlmCiAJICogICAgICAgICAgICB7QGNvZGUgcmVwb3NpdG9yeX0gaXMgbnVsbC4KIAkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KGZpbmFsIFJlcG9zaXRvcnkgcmVwb3NpdG9yeSwgZmluYWwgU3RyaW5nIGdpdERpcikgeworCXByb3RlY3RlZCB2b2lkIGluaXQoUmVwb3NpdG9yeSByZXBvc2l0b3J5LCBTdHJpbmcgZ2l0RGlyKSB7CiAJCXRyeSB7CiAJCQlmaW5hbCBTdHJpbmcgb3V0cHV0RW5jb2RpbmcgPSByZXBvc2l0b3J5ICE9IG51bGwgPyByZXBvc2l0b3J5CiAJCQkJCS5nZXRDb25maWcoKS5nZXRTdHJpbmcoImkxOG4iLCBudWxsLCAibG9nT3V0cHV0RW5jb2RpbmciKSA6IG51bGw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJApAQCAtMjM5LDcgKzIzOSw3IEBAIHB1YmxpYyBmaW5hbCB2b2lkIGV4ZWN1dGUoU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJICogICAgICAgICAgICB0aGUgYXJndW1lbnRzIHN1cHBsaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUsIGlmIGFueS4KIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwYXJzZUFyZ3VtZW50cyhmaW5hbCBTdHJpbmdbXSBhcmdzKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByb3RlY3RlZCB2b2lkIHBhcnNlQXJndW1lbnRzKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIENtZExpbmVQYXJzZXIgY2xwID0gbmV3IENtZExpbmVQYXJzZXIodGhpcyk7CiAJCWhlbHAgPSBjb250YWluc0hlbHAoYXJncyk7CiAJCXRyeSB7CkBAIC0yNjcsNyArMjY3LDcgQEAgcHJvdGVjdGVkIHZvaWQgcGFyc2VBcmd1bWVudHMoZmluYWwgU3RyaW5nW10gYXJncykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkgKiAgICAgICAgICAgIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQucGdtLm9wdC5DbWRMaW5lUGFyc2VyfSBvYmplY3QuCiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICovCi0JcHVibGljIHZvaWQgcHJpbnRVc2FnZUFuZEV4aXQoZmluYWwgQ21kTGluZVBhcnNlciBjbHApIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIHZvaWQgcHJpbnRVc2FnZUFuZEV4aXQoQ21kTGluZVBhcnNlciBjbHApIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXByaW50VXNhZ2VBbmRFeGl0KCIiLCBjbHApOyAvLyROT04tTkxTLTEkCiAJfQogCkBAIC0yODAsNyArMjgwLDcgQEAgcHVibGljIHZvaWQgcHJpbnRVc2FnZUFuZEV4aXQoZmluYWwgQ21kTGluZVBhcnNlciBjbHApIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJICogICAgICAgICAgICBhIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LnBnbS5vcHQuQ21kTGluZVBhcnNlcn0gb2JqZWN0LgogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqLwotCXB1YmxpYyB2b2lkIHByaW50VXNhZ2VBbmRFeGl0KGZpbmFsIFN0cmluZyBtZXNzYWdlLCBmaW5hbCBDbWRMaW5lUGFyc2VyIGNscCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgdm9pZCBwcmludFVzYWdlQW5kRXhpdChTdHJpbmcgbWVzc2FnZSwgQ21kTGluZVBhcnNlciBjbHApIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXByaW50VXNhZ2UobWVzc2FnZSwgY2xwKTsKIAkJdGhyb3cgZGllKHRydWUpOwogCX0KQEAgLTI5NSw3ICsyOTUsNyBAQCBwdWJsaWMgdm9pZCBwcmludFVzYWdlQW5kRXhpdChmaW5hbCBTdHJpbmcgbWVzc2FnZSwgZmluYWwgQ21kTGluZVBhcnNlciBjbHApIHRocgogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqIEBzaW5jZSA0LjIKIAkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmludFVzYWdlKGZpbmFsIFN0cmluZyBtZXNzYWdlLCBmaW5hbCBDbWRMaW5lUGFyc2VyIGNscCkKKwlwcm90ZWN0ZWQgdm9pZCBwcmludFVzYWdlKFN0cmluZyBtZXNzYWdlLCBDbWRMaW5lUGFyc2VyIGNscCkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWVycncucHJpbnRsbihtZXNzYWdlKTsKIAkJZXJydy5wcmludCgiamdpdCAiKTsgLy8kTk9OLU5MUy0xJApAQCAtMzYxLDcgKzM2MSw3IEBAIHB1YmxpYyBSZXBvc2l0b3J5IGdldFJlcG9zaXRvcnkoKSB7CiAJCXJldHVybiBkYjsKIAl9CiAKLQlPYmplY3RJZCByZXNvbHZlKGZpbmFsIFN0cmluZyBzKSB0aHJvd3MgSU9FeGNlcHRpb24geworCU9iamVjdElkIHJlc29sdmUoU3RyaW5nIHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIE9iamVjdElkIHIgPSBkYi5yZXNvbHZlKHMpOwogCQlpZiAociA9PSBudWxsKQogCQkJdGhyb3cgZGllKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KENMSVRleHQuZ2V0KCkubm90QVJldmlzaW9uLCBzKSk7CkBAIC0zNzUsNyArMzc1LDcgQEAgT2JqZWN0SWQgcmVzb2x2ZShmaW5hbCBTdHJpbmcgcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkgKiAgICAgICAgICAgIHRleHR1YWwgZXhwbGFuYXRpb24KIAkgKiBAcmV0dXJuIGEgcnVudGltZSBleGNlcHRpb24gdGhlIGNhbGxlciBpcyBleHBlY3RlZCB0byB0aHJvdwogCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgRGllIGRpZShmaW5hbCBTdHJpbmcgd2h5KSB7CisJcHJvdGVjdGVkIHN0YXRpYyBEaWUgZGllKFN0cmluZyB3aHkpIHsKIAkJcmV0dXJuIG5ldyBEaWUod2h5KTsKIAl9CiAKQEAgLTM4OCw3ICszODgsNyBAQCBwcm90ZWN0ZWQgc3RhdGljIERpZSBkaWUoZmluYWwgU3RyaW5nIHdoeSkgewogCSAqICAgICAgICAgICAgd2h5IHRoZSBjb21tYW5kIGhhcyBmYWlsZWQuCiAJICogQHJldHVybiBhIHJ1bnRpbWUgZXhjZXB0aW9uIHRoZSBjYWxsZXIgaXMgZXhwZWN0ZWQgdG8gdGhyb3cKIAkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIERpZSBkaWUoZmluYWwgU3RyaW5nIHdoeSwgZmluYWwgVGhyb3dhYmxlIGNhdXNlKSB7CisJcHJvdGVjdGVkIHN0YXRpYyBEaWUgZGllKFN0cmluZyB3aHksIFRocm93YWJsZSBjYXVzZSkgewogCQlyZXR1cm4gbmV3IERpZSh3aHksIGNhdXNlKTsKIAl9CiAKQEAgLTQxNiw3ICs0MTYsNyBAQCBwcm90ZWN0ZWQgc3RhdGljIERpZSBkaWUoYm9vbGVhbiBhYm9ydGVkKSB7CiAJICogQHJldHVybiBhIHJ1bnRpbWUgZXhjZXB0aW9uIHRoZSBjYWxsZXIgaXMgZXhwZWN0ZWQgdG8gdGhyb3cKIAkgKiBAc2luY2UgNC4yCiAJICovCi0JcHJvdGVjdGVkIHN0YXRpYyBEaWUgZGllKGJvb2xlYW4gYWJvcnRlZCwgZmluYWwgVGhyb3dhYmxlIGNhdXNlKSB7CisJcHJvdGVjdGVkIHN0YXRpYyBEaWUgZGllKGJvb2xlYW4gYWJvcnRlZCwgVGhyb3dhYmxlIGNhdXNlKSB7CiAJCXJldHVybiBuZXcgRGllKGFib3J0ZWQsIGNhdXNlKTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9WZXJzaW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vVmVyc2lvbi5qYXZhCmluZGV4IDVlZmMwM2IuLjU4YWNjNWMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9WZXJzaW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL1ZlcnNpb24uamF2YQpAQCAtOTYsMTQgKzk2LDkgQEAgcHJpdmF0ZSBTdHJpbmcgZ2V0QnVuZGxlVmVyc2lvbigpIHsKIAl9CiAKIAlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0QnVuZGxlVmVyc2lvbihVUkwgdXJsKSB7Ci0JCXRyeSB7Ci0JCQlJbnB1dFN0cmVhbSBpcyA9IHVybC5vcGVuU3RyZWFtKCk7Ci0JCQl0cnkgewotCQkJCU1hbmlmZXN0IG1hbmlmZXN0ID0gbmV3IE1hbmlmZXN0KGlzKTsKLQkJCQlyZXR1cm4gbWFuaWZlc3QuZ2V0TWFpbkF0dHJpYnV0ZXMoKS5nZXRWYWx1ZSgiQnVuZGxlLVZlcnNpb24iKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBmaW5hbGx5IHsKLQkJCQlpcy5jbG9zZSgpOwotCQkJfQorCQl0cnkgKElucHV0U3RyZWFtIGlzID0gdXJsLm9wZW5TdHJlYW0oKSkgeworCQkJTWFuaWZlc3QgbWFuaWZlc3QgPSBuZXcgTWFuaWZlc3QoaXMpOworCQkJcmV0dXJuIG1hbmlmZXN0LmdldE1haW5BdHRyaWJ1dGVzKCkuZ2V0VmFsdWUoIkJ1bmRsZS1WZXJzaW9uIik7IC8vJE5PTi1OTFMtMSQKIAkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogCQkJLy8gZG8gbm90aGluZyAtIHdpbGwgcmV0dXJuIG51bGwKIAkJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL2RlYnVnL0JlbmNobWFya1JlZnRhYmxlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vZGVidWcvQmVuY2htYXJrUmVmdGFibGUuamF2YQppbmRleCAyNDhlYWFjLi41NzVhMTIyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vZGVidWcvQmVuY2htYXJrUmVmdGFibGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vZGVidWcvQmVuY2htYXJrUmVmdGFibGUuamF2YQpAQCAtNDMsNyArNDMsNyBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQucGdtLmRlYnVnOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5IRUFEOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuTUFTVEVSOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuUl9IRUFEUzsKQEAgLTE1NCw3ICsxNTQsNyBAQCBwcml2YXRlIFJlZkxpc3Q8UmVmPiByZWFkTHNSZW1vdGUoKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24gewogCQlSZWZMaXN0LkJ1aWxkZXI8UmVmPiBsaXN0ID0gbmV3IFJlZkxpc3QuQnVpbGRlcjw+KCk7CiAJCXRyeSAoQnVmZmVyZWRSZWFkZXIgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKAotCQkJCW5ldyBGaWxlSW5wdXRTdHJlYW0obHNSZW1vdGVQYXRoKSwgVVRGXzgpKSkgeworCQkJCW5ldyBGaWxlSW5wdXRTdHJlYW0obHNSZW1vdGVQYXRoKSwgQ0hBUlNFVCkpKSB7CiAJCQlSZWYgbGFzdCA9IG51bGw7CiAJCQlTdHJpbmcgbGluZTsKIAkJCXdoaWxlICgobGluZSA9IGJyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9kZWJ1Zy9NYWtlQ2FjaGVUcmVlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vZGVidWcvTWFrZUNhY2hlVHJlZS5qYXZhCmluZGV4IDEyN2U1NDEuLjJhMTMyNmQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9kZWJ1Zy9NYWtlQ2FjaGVUcmVlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL2RlYnVnL01ha2VDYWNoZVRyZWUuamF2YQpAQCAtNjUsNyArNjUsNyBAQCBwcm90ZWN0ZWQgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJc2hvdyh0cmVlKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgc2hvdyhmaW5hbCBEaXJDYWNoZVRyZWUgdHJlZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwcml2YXRlIHZvaWQgc2hvdyhEaXJDYWNoZVRyZWUgdHJlZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJb3V0dy5wcmludGxuKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KENMSVRleHQuZ2V0KCkuY2FjaGVUcmVlUGF0aEluZm8sCiAJCQkJdHJlZS5nZXRQYXRoU3RyaW5nKCksIHZhbHVlT2YodHJlZS5nZXRFbnRyeVNwYW4oKSksCiAJCQkJdmFsdWVPZih0cmVlLmdldENoaWxkQ291bnQoKSkpKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9kZWJ1Zy9SZWJ1aWxkQ29tbWl0R3JhcGguamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9kZWJ1Zy9SZWJ1aWxkQ29tbWl0R3JhcGguamF2YQppbmRleCAyZTQxZWVjLi4yZDE2ZmVmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vZGVidWcvUmVidWlsZENvbW1pdEdyYXBoLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL2RlYnVnL1JlYnVpbGRDb21taXRHcmFwaC5qYXZhCkBAIC00Myw4ICs0Myw2IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5wZ20uZGVidWc7CiAKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmRGF0YWJhc2UuQUxMOwotCiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CkBAIC0xMTcsNyArMTE1LDcgQEAgY2xhc3MgUmVidWlsZENvbW1pdEdyYXBoIGV4dGVuZHMgVGV4dEJ1aWx0aW4gewogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmICghcmVhbGx5ICYmICFkYi5nZXRSZWZEYXRhYmFzZSgpLmdldFJlZnMoQUxMKS5pc0VtcHR5KCkpIHsKKwkJaWYgKCFyZWFsbHkgJiYgZGIuZ2V0UmVmRGF0YWJhc2UoKS5oYXNSZWZzKCkpIHsKIAkJCUZpbGUgZGlyZWN0b3J5ID0gZGIuZ2V0RGlyZWN0b3J5KCk7CiAJCQlTdHJpbmcgYWJzb2x1dGVQYXRoID0gZGlyZWN0b3J5ID09IG51bGwgPyAibnVsbCIgLy8kTk9OLU5MUy0xJAogCQkJCQk6IGRpcmVjdG9yeS5nZXRBYnNvbHV0ZVBhdGgoKTsKQEAgLTIyNCw3ICsyMjIsNyBAQCBwcml2YXRlIHN0YXRpYyBjbGFzcyBUb1Jld3JpdGUgewogCiAJCU9iamVjdElkIG5ld0lkOwogCi0JCVRvUmV3cml0ZShmaW5hbCBPYmplY3RJZCBvLCBmaW5hbCBsb25nIHQsIGZpbmFsIE9iamVjdElkW10gcCkgeworCQlUb1Jld3JpdGUoT2JqZWN0SWQgbywgbG9uZyB0LCBPYmplY3RJZFtdIHApIHsKIAkJCW9sZElkID0gbzsKIAkJCWNvbW1pdFRpbWUgPSB0OwogCQkJb2xkUGFyZW50cyA9IHA7CkBAIC0yNDcsOCArMjQ1LDcgQEAgcHJpdmF0ZSB2b2lkIGRldGFjaEhlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCiAJcHJpdmF0ZSB2b2lkIGRlbGV0ZUFsbFJlZnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJZmluYWwgUmV2V2FsayBydyA9IG5ldyBSZXZXYWxrKGRiKTsKLQkJTWFwPFN0cmluZywgUmVmPiByZWZzID0gZGIuZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzKEFMTCk7Ci0JCWZvciAoZmluYWwgUmVmIHIgOiByZWZzLnZhbHVlcygpKSB7CisJCWZvciAoUmVmIHIgOiBkYi5nZXRSZWZEYXRhYmFzZSgpLmdldFJlZnMoKSkgewogCQkJaWYgKENvbnN0YW50cy5IRUFELmVxdWFscyhyLmdldE5hbWUoKSkpCiAJCQkJY29udGludWU7CiAJCQlmaW5hbCBSZWZVcGRhdGUgdSA9IGRiLnVwZGF0ZVJlZihyLmdldE5hbWUoKSk7CkBAIC0yNjEsNyArMjU4LDcgQEAgcHJpdmF0ZSB2b2lkIHJlY3JlYXRlUmVmcygpIHRocm93cyBFeGNlcHRpb24gewogCQlmaW5hbCBNYXA8U3RyaW5nLCBSZWY+IHJlZnMgPSBjb21wdXRlTmV3UmVmcygpOwogCQluZXcgUmVmV3JpdGVyKHJlZnMudmFsdWVzKCkpIHsKIAkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgd3JpdGVGaWxlKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBieXRlW10gY29udGVudCkKKwkJCXByb3RlY3RlZCB2b2lkIHdyaXRlRmlsZShTdHJpbmcgbmFtZSwgYnl0ZVtdIGNvbnRlbnQpCiAJCQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQkJZmluYWwgRmlsZSBmaWxlID0gbmV3IEZpbGUoZGIuZ2V0RGlyZWN0b3J5KCksIG5hbWUpOwogCQkJCWZpbmFsIExvY2tGaWxlIGxjayA9IG5ldyBMb2NrRmlsZShmaWxlKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9kZWJ1Zy9SZWJ1aWxkUmVmVHJlZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL2RlYnVnL1JlYnVpbGRSZWZUcmVlLmphdmEKaW5kZXggMzE3MjQ4My4uMDYzNjAwZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL2RlYnVnL1JlYnVpbGRSZWZUcmVlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL2RlYnVnL1JlYnVpbGRSZWZUcmVlLmphdmEKQEAgLTE1NCwxNCArMTU0LDE0IEBAIHByaXZhdGUgUmVmVHJlZSByZWJ1aWxkKFJlZkRhdGFiYXNlIHJlZmRiKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJCQloZWFkKSk7CiAJCX0KIAotCQlmb3IgKFJlZiByIDogcmVmZGIuZ2V0UmVmcyhSZWZEYXRhYmFzZS5BTEwpLnZhbHVlcygpKSB7CisJCWZvciAoUmVmIHIgOiByZWZkYi5nZXRSZWZzKCkpIHsKIAkJCWlmIChyLmdldE5hbWUoKS5lcXVhbHModHhuQ29tbWl0dGVkKSB8fCByLmdldE5hbWUoKS5lcXVhbHMoSEVBRCkKIAkJCQkJfHwgci5nZXROYW1lKCkuc3RhcnRzV2l0aCh0eG5OYW1lc3BhY2UpKSB7CiAJCQkJY29udGludWU7CiAJCQl9CiAJCQljbWRzLmFkZChuZXcgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnJlZnRyZWUuQ29tbWFuZCgKIAkJCQkJbnVsbCwKLQkJCQkJZGIucGVlbChyKSkpOworCQkJCQlkYi5nZXRSZWZEYXRhYmFzZSgpLnBlZWwocikpKTsKIAkJfQogCQl0cmVlLmFwcGx5KGNtZHMpOwogCQlyZXR1cm4gdHJlZTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9kZWJ1Zy9TaG93Q2FjaGVUcmVlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vZGVidWcvU2hvd0NhY2hlVHJlZS5qYXZhCmluZGV4IDIwZmE0YTMuLjZiOTdlMDggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9kZWJ1Zy9TaG93Q2FjaGVUcmVlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL2RlYnVnL1Nob3dDYWNoZVRyZWUuamF2YQpAQCAtNjcsNyArNjcsNyBAQCBwcm90ZWN0ZWQgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJc2hvdyh0cmVlKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgc2hvdyhmaW5hbCBEaXJDYWNoZVRyZWUgdHJlZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwcml2YXRlIHZvaWQgc2hvdyhEaXJDYWNoZVRyZWUgdHJlZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJb3V0dy5wcmludGxuKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KENMSVRleHQuZ2V0KCkuY2FjaGVUcmVlUGF0aEluZm8sCiAJCQkJdHJlZS5nZXRQYXRoU3RyaW5nKCksIHZhbHVlT2YodHJlZS5nZXRFbnRyeVNwYW4oKSksCiAJCQkJdmFsdWVPZih0cmVlLmdldENoaWxkQ291bnQoKSkpKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9kZWJ1Zy9TaG93Q29tbWFuZHMuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9kZWJ1Zy9TaG93Q29tbWFuZHMuamF2YQppbmRleCBhOTYwZWM2Li5hZjU2ZDY1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vZGVidWcvU2hvd0NvbW1hbmRzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL2RlYnVnL1Nob3dDb21tYW5kcy5qYXZhCkBAIC02NSwxMSArNjUsMTEgQEAgcHJvdGVjdGVkIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWZpbmFsIENvbW1hbmRSZWZbXSBsaXN0ID0gQ29tbWFuZENhdGFsb2cuYWxsKCk7CiAKIAkJaW50IHdpZHRoID0gMDsKLQkJZm9yIChmaW5hbCBDb21tYW5kUmVmIGMgOiBsaXN0KQorCQlmb3IgKENvbW1hbmRSZWYgYyA6IGxpc3QpCiAJCQl3aWR0aCA9IE1hdGgubWF4KHdpZHRoLCBjLmdldE5hbWUoKS5sZW5ndGgoKSk7CiAJCXdpZHRoICs9IDI7CiAKLQkJZm9yIChmaW5hbCBDb21tYW5kUmVmIGMgOiBsaXN0KSB7CisJCWZvciAoQ29tbWFuZFJlZiBjIDogbGlzdCkgewogCQkJZXJydy5wcmludChjLmlzQ29tbW9uKCkgPyAnKicgOiAnICcpOwogCQkJZXJydy5wcmludCgnICcpOwogCkBAIC04Nyw3ICs4Nyw3IEBAIHN0YXRpYyBlbnVtIEZvcm1hdCB7CiAJCS8qKiAqLwogCQlVU0FHRSB7CiAJCQlAT3ZlcnJpZGUKLQkJCXZvaWQgcHJpbnQoVGhyb3dpbmdQcmludFdyaXRlciBlcnIsIGZpbmFsIENvbW1hbmRSZWYgYykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJCXZvaWQgcHJpbnQoVGhyb3dpbmdQcmludFdyaXRlciBlcnIsIENvbW1hbmRSZWYgYykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCQlTdHJpbmcgdXNhZ2UgPSBjLmdldFVzYWdlKCk7CiAJCQkJaWYgKHVzYWdlICE9IG51bGwgJiYgdXNhZ2UubGVuZ3RoKCkgPiAwKQogCQkJCQllcnIucHJpbnQoQ0xJVGV4dC5nZXQoKS5yZXNvdXJjZUJ1bmRsZSgpLmdldFN0cmluZyh1c2FnZSkpOwpAQCAtOTcsNyArOTcsNyBAQCB2b2lkIHByaW50KFRocm93aW5nUHJpbnRXcml0ZXIgZXJyLCBmaW5hbCBDb21tYW5kUmVmIGMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCS8qKiAqLwogCQlDTEFTU0VTIHsKIAkJCUBPdmVycmlkZQotCQkJdm9pZCBwcmludChUaHJvd2luZ1ByaW50V3JpdGVyIGVyciwgZmluYWwgQ29tbWFuZFJlZiBjKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQkJdm9pZCBwcmludChUaHJvd2luZ1ByaW50V3JpdGVyIGVyciwgQ29tbWFuZFJlZiBjKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJCWVyci5wcmludChjLmdldEltcGxlbWVudGF0aW9uQ2xhc3NOYW1lKCkpOwogCQkJfQogCQl9LApAQCAtMTA1LDcgKzEwNSw3IEBAIHZvaWQgcHJpbnQoVGhyb3dpbmdQcmludFdyaXRlciBlcnIsIGZpbmFsIENvbW1hbmRSZWYgYykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJLyoqICovCiAJCVVSTFMgewogCQkJQE92ZXJyaWRlCi0JCQl2b2lkIHByaW50KFRocm93aW5nUHJpbnRXcml0ZXIgZXJyLCBmaW5hbCBDb21tYW5kUmVmIGMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCQl2b2lkIHByaW50KFRocm93aW5nUHJpbnRXcml0ZXIgZXJyLCBDb21tYW5kUmVmIGMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQkJZmluYWwgQ2xhc3NMb2FkZXIgbGRyID0gYy5nZXRJbXBsZW1lbnRhdGlvbkNsYXNzTG9hZGVyKCk7CiAKIAkJCQlTdHJpbmcgY24gPSBjLmdldEltcGxlbWVudGF0aW9uQ2xhc3NOYW1lKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vZGVidWcvU2hvd1BhY2tEZWx0YS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL2RlYnVnL1Nob3dQYWNrRGVsdGEuamF2YQppbmRleCBiYmMxYjBmLi5mMzllY2JlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vZGVidWcvU2hvd1BhY2tEZWx0YS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9kZWJ1Zy9TaG93UGFja0RlbHRhLmphdmEKQEAgLTEyNSwxMiArMTI1LDEzIEBAIHB1YmxpYyB2b2lkIHNlbGVjdChPYmplY3RUb1BhY2sgb3RwLCBTdG9yZWRPYmplY3RSZXByZXNlbnRhdGlvbiBuZXh0KSB7CiAJCQlwdHIrKzsKIAkJcHRyKys7CiAKLQkJQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIiAvKiBqYXZhIDcgKi8pCi0JCVRlbXBvcmFyeUJ1ZmZlci5IZWFwIHJhdyA9IG5ldyBUZW1wb3JhcnlCdWZmZXIuSGVhcChidWZBcnJheS5sZW5ndGgpOwotCQlJbmZsYXRlcklucHV0U3RyZWFtIGluZiA9IG5ldyBJbmZsYXRlcklucHV0U3RyZWFtKAotCQkJCW5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShidWZBcnJheSwgcHRyLCBidWZBcnJheS5sZW5ndGgpKTsKLQkJcmF3LmNvcHkoaW5mKTsKLQkJaW5mLmNsb3NlKCk7Ci0JCXJldHVybiByYXcudG9CeXRlQXJyYXkoKTsKKwkJdHJ5IChUZW1wb3JhcnlCdWZmZXIuSGVhcCByYXcgPSBuZXcgVGVtcG9yYXJ5QnVmZmVyLkhlYXAoCisJCQkJYnVmQXJyYXkubGVuZ3RoKTsKKwkJCQlJbmZsYXRlcklucHV0U3RyZWFtIGluZiA9IG5ldyBJbmZsYXRlcklucHV0U3RyZWFtKAorCQkJCQkJbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ1ZkFycmF5LCBwdHIsCisJCQkJCQkJCWJ1ZkFycmF5Lmxlbmd0aCkpKSB7CisJCQlyYXcuY29weShpbmYpOworCQkJcmV0dXJuIHJhdy50b0J5dGVBcnJheSgpOworCQl9CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL2RlYnVnL1RleHRIYXNoRnVuY3Rpb25zLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vZGVidWcvVGV4dEhhc2hGdW5jdGlvbnMuamF2YQppbmRleCA4M2I3YmNlLi5iYjUxYjUwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vZGVidWcvVGV4dEhhc2hGdW5jdGlvbnMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vZGVidWcvVGV4dEhhc2hGdW5jdGlvbnMuamF2YQpAQCAtMjg4LDExICsyODgsOCBAQCBwcm90ZWN0ZWQgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCWVsc2UKIAkJCQlyYi5maW5kR2l0RGlyKGRpcik7CiAKLQkJCVJlcG9zaXRvcnkgcmVwbyA9IHJiLmJ1aWxkKCk7Ci0JCQl0cnkgeworCQkJdHJ5IChSZXBvc2l0b3J5IHJlcG8gPSByYi5idWlsZCgpKSB7CiAJCQkJcnVuKHJlcG8pOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlyZXBvLmNsb3NlKCk7CiAJCQl9CiAJCX0KIAl9CkBAIC01MDIsNyArNDk5LDcgQEAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKIAkJfQogCX0KIAotCXByaXZhdGUgc3RhdGljIGludCB0YWJsZUJpdHMoZmluYWwgaW50IHN6KSB7CisJcHJpdmF0ZSBzdGF0aWMgaW50IHRhYmxlQml0cyhpbnQgc3opIHsKIAkJaW50IGJpdHMgPSAzMSAtIEludGVnZXIubnVtYmVyT2ZMZWFkaW5nWmVyb3Moc3opOwogCQlpZiAoYml0cyA9PSAwKQogCQkJYml0cyA9IDE7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vZGVidWcvV3JpdGVSZWZ0YWJsZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL2RlYnVnL1dyaXRlUmVmdGFibGUuamF2YQppbmRleCA2Y2JjMWIwLi5jNWVhMDI4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vZGVidWcvV3JpdGVSZWZ0YWJsZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9kZWJ1Zy9Xcml0ZVJlZnRhYmxlLmphdmEKQEAgLTQzLDcgKzQzLDcgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnBnbS5kZWJ1ZzsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuSEVBRDsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLk1BU1RFUjsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLlJfSEVBRFM7CkBAIC0xOTIsNyArMTkyLDcgQEAgcHJpdmF0ZSB2b2lkIHByaW50ZihTdHJpbmcgZm10LCBPYmplY3QuLi4gYXJncykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAlzdGF0aWMgTGlzdDxSZWY+IHJlYWRSZWZzKFN0cmluZyBpbnB1dEZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCUxpc3Q8UmVmPiByZWZzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAJCXRyeSAoQnVmZmVyZWRSZWFkZXIgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoCi0JCQkJbmV3IElucHV0U3RyZWFtUmVhZGVyKG5ldyBGaWxlSW5wdXRTdHJlYW0oaW5wdXRGaWxlKSwgVVRGXzgpKSkgeworCQkJCW5ldyBJbnB1dFN0cmVhbVJlYWRlcihuZXcgRmlsZUlucHV0U3RyZWFtKGlucHV0RmlsZSksIENIQVJTRVQpKSkgewogCQkJU3RyaW5nIGxpbmU7CiAJCQl3aGlsZSAoKGxpbmUgPSBici5yZWFkTGluZSgpKSAhPSBudWxsKSB7CiAJCQkJT2JqZWN0SWQgaWQgPSBPYmplY3RJZC5mcm9tU3RyaW5nKGxpbmUuc3Vic3RyaW5nKDAsIDQwKSk7CkBAIC0yMjcsNyArMjI3LDcgQEAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxMb2dFbnRyeT4gcmVhZExvZyhTdHJpbmcgbG9nUGF0aCkKIAogCQlMaXN0PExvZ0VudHJ5PiBsb2cgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAkJdHJ5IChCdWZmZXJlZFJlYWRlciBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcigKLQkJCQluZXcgSW5wdXRTdHJlYW1SZWFkZXIobmV3IEZpbGVJbnB1dFN0cmVhbShsb2dQYXRoKSwgVVRGXzgpKSkgeworCQkJCW5ldyBJbnB1dFN0cmVhbVJlYWRlcihuZXcgRmlsZUlucHV0U3RyZWFtKGxvZ1BhdGgpLCBDSEFSU0VUKSkpIHsKIAkJCUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQogCQkJUGF0dGVybiBwYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKCIoW14sXSspIiAvLyAxOiByZWYKIAkJCQkJKyAiLChbMC05XSsoPzpbLl1bMC05XSspPykiIC8vIDI6IHRpbWUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9vcHQvQWJzdHJhY3RUcmVlSXRlcmF0b3JIYW5kbGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vb3B0L0Fic3RyYWN0VHJlZUl0ZXJhdG9ySGFuZGxlci5qYXZhCmluZGV4IDZmZTc5MjcuLmExNGY2NTEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9vcHQvQWJzdHJhY3RUcmVlSXRlcmF0b3JIYW5kbGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL29wdC9BYnN0cmFjdFRyZWVJdGVyYXRvckhhbmRsZXIuamF2YQpAQCAtOTgsNyArOTgsNyBAQCBwdWJsaWMgQWJzdHJhY3RUcmVlSXRlcmF0b3JIYW5kbGVyKGZpbmFsIENtZExpbmVQYXJzZXIgcGFyc2VyLAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IHBhcnNlQXJndW1lbnRzKGZpbmFsIFBhcmFtZXRlcnMgcGFyYW1zKSB0aHJvd3MgQ21kTGluZUV4Y2VwdGlvbiB7CisJcHVibGljIGludCBwYXJzZUFyZ3VtZW50cyhQYXJhbWV0ZXJzIHBhcmFtcykgdGhyb3dzIENtZExpbmVFeGNlcHRpb24gewogCQlmaW5hbCBTdHJpbmcgbmFtZSA9IHBhcmFtcy5nZXRQYXJhbWV0ZXIoMCk7CiAKIAkJaWYgKG5ldyBGaWxlKG5hbWUpLmlzRGlyZWN0b3J5KCkpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9vcHQvQ21kTGluZVBhcnNlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL29wdC9DbWRMaW5lUGFyc2VyLmphdmEKaW5kZXggZTA3MWJkZi4uNWNjOThjYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL29wdC9DbWRMaW5lUGFyc2VyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL29wdC9DbWRMaW5lUGFyc2VyLmphdmEKQEAgLTExMSw3ICsxMTEsNyBAQCBwdWJsaWMgY2xhc3MgQ21kTGluZVBhcnNlciBleHRlbmRzIG9yZy5rb2hzdWtlLmFyZ3M0ai5DbWRMaW5lUGFyc2VyIHsKIAkgKiAgICAgICAgICAgICBpZiB0aGUgb3B0aW9uIGJlYW4gY2xhc3MgaXMgdXNpbmcgYXJnczRqIGFubm90YXRpb25zCiAJICogICAgICAgICAgICAgaW5jb3JyZWN0bHkuCiAJICovCi0JcHVibGljIENtZExpbmVQYXJzZXIoZmluYWwgT2JqZWN0IGJlYW4pIHsKKwlwdWJsaWMgQ21kTGluZVBhcnNlcihPYmplY3QgYmVhbikgewogCQl0aGlzKGJlYW4sIG51bGwpOwogCX0KIApAQCAtMTMwLDcgKzEzMCw3IEBAIHB1YmxpYyBDbWRMaW5lUGFyc2VyKGZpbmFsIE9iamVjdCBiZWFuKSB7CiAJICogICAgICAgICAgICAgaWYgdGhlIG9wdGlvbiBiZWFuIGNsYXNzIGlzIHVzaW5nIGFyZ3M0aiBhbm5vdGF0aW9ucwogCSAqICAgICAgICAgICAgIGluY29ycmVjdGx5LgogCSAqLwotCXB1YmxpYyBDbWRMaW5lUGFyc2VyKGZpbmFsIE9iamVjdCBiZWFuLCBSZXBvc2l0b3J5IHJlcG8pIHsKKwlwdWJsaWMgQ21kTGluZVBhcnNlcihPYmplY3QgYmVhbiwgUmVwb3NpdG9yeSByZXBvKSB7CiAJCXN1cGVyKGJlYW4pOwogCQlpZiAoYmVhbiBpbnN0YW5jZW9mIFRleHRCdWlsdGluKSB7CiAJCQljbWQgPSAoVGV4dEJ1aWx0aW4pIGJlYW47CkBAIC0xNDMsNyArMTQzLDcgQEAgcHVibGljIENtZExpbmVQYXJzZXIoZmluYWwgT2JqZWN0IGJlYW4sIFJlcG9zaXRvcnkgcmVwbykgewogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBwYXJzZUFyZ3VtZW50KGZpbmFsIFN0cmluZy4uLiBhcmdzKSB0aHJvd3MgQ21kTGluZUV4Y2VwdGlvbiB7CisJcHVibGljIHZvaWQgcGFyc2VBcmd1bWVudChTdHJpbmcuLi4gYXJncykgdGhyb3dzIENtZExpbmVFeGNlcHRpb24gewogCQlmaW5hbCBBcnJheUxpc3Q8U3RyaW5nPiB0bXAgPSBuZXcgQXJyYXlMaXN0PD4oYXJncy5sZW5ndGgpOwogCQlmb3IgKGludCBhcmdpID0gMDsgYXJnaSA8IGFyZ3MubGVuZ3RoOyBhcmdpKyspIHsKIAkJCWZpbmFsIFN0cmluZyBzdHIgPSBhcmdzW2FyZ2ldOwpAQCAtMjMyLDcgKzIzMiw3IEBAIHByaXZhdGUgdm9pZCByZXN0b3JlUmVxdWlyZWRPcHRpb25zKExpc3Q8T3B0aW9uSGFuZGxlcj4gYmFja3VwKSB7CiAJICogQHJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBhcnJheSBjb250YWlucyBoZWxwIG9wdGlvbgogCSAqIEBzaW5jZSA0LjIKIAkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb250YWluc0hlbHAoZmluYWwgU3RyaW5nLi4uIGFyZ3MpIHsKKwlwcm90ZWN0ZWQgYm9vbGVhbiBjb250YWluc0hlbHAoU3RyaW5nLi4uIGFyZ3MpIHsKIAkJcmV0dXJuIFRleHRCdWlsdGluLmNvbnRhaW5zSGVscChhcmdzKTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9vcHQvT2JqZWN0SWRIYW5kbGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vb3B0L09iamVjdElkSGFuZGxlci5qYXZhCmluZGV4IDBlNWIwZjUuLjVmN2U4MWUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9vcHQvT2JqZWN0SWRIYW5kbGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL29wdC9PYmplY3RJZEhhbmRsZXIuamF2YQpAQCAtODQsNyArODQsNyBAQCBwdWJsaWMgT2JqZWN0SWRIYW5kbGVyKGZpbmFsIENtZExpbmVQYXJzZXIgcGFyc2VyLCBmaW5hbCBPcHRpb25EZWYgb3B0aW9uLAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IHBhcnNlQXJndW1lbnRzKGZpbmFsIFBhcmFtZXRlcnMgcGFyYW1zKSB0aHJvd3MgQ21kTGluZUV4Y2VwdGlvbiB7CisJcHVibGljIGludCBwYXJzZUFyZ3VtZW50cyhQYXJhbWV0ZXJzIHBhcmFtcykgdGhyb3dzIENtZExpbmVFeGNlcHRpb24gewogCQlmaW5hbCBTdHJpbmcgbmFtZSA9IHBhcmFtcy5nZXRQYXJhbWV0ZXIoMCk7CiAJCWZpbmFsIE9iamVjdElkIGlkOwogCQl0cnkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL29wdC9QYXRoVHJlZUZpbHRlckhhbmRsZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9vcHQvUGF0aFRyZWVGaWx0ZXJIYW5kbGVyLmphdmEKaW5kZXggMzNkNjY5Yy4uZDk5Zjg4ZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL29wdC9QYXRoVHJlZUZpbHRlckhhbmRsZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vb3B0L1BhdGhUcmVlRmlsdGVySGFuZGxlci5qYXZhCkBAIC04NCw3ICs4NCw3IEBAIHB1YmxpYyBQYXRoVHJlZUZpbHRlckhhbmRsZXIoZmluYWwgQ21kTGluZVBhcnNlciBwYXJzZXIsCiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgcGFyc2VBcmd1bWVudHMoZmluYWwgUGFyYW1ldGVycyBwYXJhbXMpIHRocm93cyBDbWRMaW5lRXhjZXB0aW9uIHsKKwlwdWJsaWMgaW50IHBhcnNlQXJndW1lbnRzKFBhcmFtZXRlcnMgcGFyYW1zKSB0aHJvd3MgQ21kTGluZUV4Y2VwdGlvbiB7CiAJCWZpbmFsIExpc3Q8UGF0aEZpbHRlcj4gZmlsdGVycyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCQlmb3IgKGludCBpZHggPSAwOzsgaWR4KyspIHsKIAkJCWZpbmFsIFN0cmluZyBwYXRoOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL29wdC9SZWZTcGVjSGFuZGxlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL29wdC9SZWZTcGVjSGFuZGxlci5qYXZhCmluZGV4IGRkODUyMGEuLjI5NTc3ZWQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9vcHQvUmVmU3BlY0hhbmRsZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vb3B0L1JlZlNwZWNIYW5kbGVyLmphdmEKQEAgLTc4LDcgKzc4LDcgQEAgcHVibGljIFJlZlNwZWNIYW5kbGVyKGZpbmFsIENtZExpbmVQYXJzZXIgcGFyc2VyLCBmaW5hbCBPcHRpb25EZWYgb3B0aW9uLAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IHBhcnNlQXJndW1lbnRzKGZpbmFsIFBhcmFtZXRlcnMgcGFyYW1zKSB0aHJvd3MgQ21kTGluZUV4Y2VwdGlvbiB7CisJcHVibGljIGludCBwYXJzZUFyZ3VtZW50cyhQYXJhbWV0ZXJzIHBhcmFtcykgdGhyb3dzIENtZExpbmVFeGNlcHRpb24gewogCQlzZXR0ZXIuYWRkVmFsdWUobmV3IFJlZlNwZWMocGFyYW1zLmdldFBhcmFtZXRlcigwKSkpOwogCQlyZXR1cm4gMTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vb3B0L1JldkNvbW1pdEhhbmRsZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9vcHQvUmV2Q29tbWl0SGFuZGxlci5qYXZhCmluZGV4IGQyZmE3NjQuLmI5MjVlMzEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9vcHQvUmV2Q29tbWl0SGFuZGxlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9vcHQvUmV2Q29tbWl0SGFuZGxlci5qYXZhCkBAIC04OCw3ICs4OCw3IEBAIHB1YmxpYyBSZXZDb21taXRIYW5kbGVyKGZpbmFsIENtZExpbmVQYXJzZXIgcGFyc2VyLCBmaW5hbCBPcHRpb25EZWYgb3B0aW9uLAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IHBhcnNlQXJndW1lbnRzKGZpbmFsIFBhcmFtZXRlcnMgcGFyYW1zKSB0aHJvd3MgQ21kTGluZUV4Y2VwdGlvbiB7CisJcHVibGljIGludCBwYXJzZUFyZ3VtZW50cyhQYXJhbWV0ZXJzIHBhcmFtcykgdGhyb3dzIENtZExpbmVFeGNlcHRpb24gewogCQlTdHJpbmcgbmFtZSA9IHBhcmFtcy5nZXRQYXJhbWV0ZXIoMCk7CiAKIAkJYm9vbGVhbiBpbnRlcmVzdGluZyA9IHRydWU7CkBAIC0xMTUsNyArMTE1LDcgQEAgcHVibGljIGludCBwYXJzZUFyZ3VtZW50cyhmaW5hbCBQYXJhbWV0ZXJzIHBhcmFtcykgdGhyb3dzIENtZExpbmVFeGNlcHRpb24gewogCQlyZXR1cm4gMTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgYWRkT25lKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBib29sZWFuIGludGVyZXN0aW5nKQorCXByaXZhdGUgdm9pZCBhZGRPbmUoU3RyaW5nIG5hbWUsIGJvb2xlYW4gaW50ZXJlc3RpbmcpCiAJCQl0aHJvd3MgQ21kTGluZUV4Y2VwdGlvbiB7CiAJCWZpbmFsIE9iamVjdElkIGlkOwogCQl0cnkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL29wdC9SZXZUcmVlSGFuZGxlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL29wdC9SZXZUcmVlSGFuZGxlci5qYXZhCmluZGV4IDk0NDQzNjMuLjg1OTIyYTIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9vcHQvUmV2VHJlZUhhbmRsZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vb3B0L1JldlRyZWVIYW5kbGVyLmphdmEKQEAgLTg3LDcgKzg3LDcgQEAgcHVibGljIFJldlRyZWVIYW5kbGVyKGZpbmFsIENtZExpbmVQYXJzZXIgcGFyc2VyLCBmaW5hbCBPcHRpb25EZWYgb3B0aW9uLAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IHBhcnNlQXJndW1lbnRzKGZpbmFsIFBhcmFtZXRlcnMgcGFyYW1zKSB0aHJvd3MgQ21kTGluZUV4Y2VwdGlvbiB7CisJcHVibGljIGludCBwYXJzZUFyZ3VtZW50cyhQYXJhbWV0ZXJzIHBhcmFtcykgdGhyb3dzIENtZExpbmVFeGNlcHRpb24gewogCQlmaW5hbCBTdHJpbmcgbmFtZSA9IHBhcmFtcy5nZXRQYXJhbWV0ZXIoMCk7CiAJCWZpbmFsIE9iamVjdElkIGlkOwogCQl0cnkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL29wdC9TdWJjb21tYW5kSGFuZGxlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL29wdC9TdWJjb21tYW5kSGFuZGxlci5qYXZhCmluZGV4IGQ2MDA3MWYuLjkyZWViZjQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9vcHQvU3ViY29tbWFuZEhhbmRsZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vb3B0L1N1YmNvbW1hbmRIYW5kbGVyLmphdmEKQEAgLTg0LDcgKzg0LDcgQEAgcHVibGljIFN1YmNvbW1hbmRIYW5kbGVyKGZpbmFsIENtZExpbmVQYXJzZXIgcGFyc2VyLAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IHBhcnNlQXJndW1lbnRzKGZpbmFsIFBhcmFtZXRlcnMgcGFyYW1zKSB0aHJvd3MgQ21kTGluZUV4Y2VwdGlvbiB7CisJcHVibGljIGludCBwYXJzZUFyZ3VtZW50cyhQYXJhbWV0ZXJzIHBhcmFtcykgdGhyb3dzIENtZExpbmVFeGNlcHRpb24gewogCQlmaW5hbCBTdHJpbmcgbmFtZSA9IHBhcmFtcy5nZXRQYXJhbWV0ZXIoMCk7CiAJCWZpbmFsIENvbW1hbmRSZWYgY3IgPSBDb21tYW5kQ2F0YWxvZy5nZXQobmFtZSk7CiAJCWlmIChjciA9PSBudWxsKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GCmluZGV4IDg1NWNkYTUuLjRiODNmYjAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTMsNTggKzMsNTggQEAKIEJ1bmRsZS1OYW1lOiAlcGx1Z2luX25hbWUKIEF1dG9tYXRpYy1Nb2R1bGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC50ZXN0CiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LnRlc3QKLUJ1bmRsZS1WZXJzaW9uOiA0LjExLjgucXVhbGlmaWVyCitCdW5kbGUtVmVyc2lvbjogNS4wLjQucXVhbGlmaWVyCiBCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KIEJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlcl9uYW1lCiBCdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQogQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEphdmFTRS0xLjgKIEltcG9ydC1QYWNrYWdlOiBjb20uZ29vZ2xlY29kZS5qYXZhZXdhaDt2ZXJzaW9uPSJbMS4xLjYsMi4wLjApIiwKICBjb20uamNyYWZ0LmpzY2g7dmVyc2lvbj0iWzAuMS41NCwwLjIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuYXBpO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5hdHRyaWJ1dGVzO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5hd3R1aTt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuYmxhbWU7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmRpZmY7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmRpcmNhY2hlO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5lcnJvcnM7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmV2ZW50czt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuZm5tYXRjaDt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuZ2l0cmVwbzt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaG9va3M7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmlnbm9yZTt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaWdub3JlLmludGVybmFsO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbDt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuZnNjazt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5kZnM7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5pbzt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5wYWNrO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnJlZnRhYmxlO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnJlZnRyZWU7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0O3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5sZnM7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmxpYjt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubWVyZ2U7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lm5sczt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubm90ZXM7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnBhdGNoO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5wZ207dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnBnbS5pbnRlcm5hbDt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQucmV2cGxvdDt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5maWx0ZXI7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5wYWNrO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5zdWJtb2R1bGU7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHA7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5yZXNvbHZlcjt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGs7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLmZpbHRlcjt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5pbzt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5zaGExO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5hcGk7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuYXR0cmlidXRlczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmF3dHVpO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuYmxhbWU7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5kaWZmO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuZGlyY2FjaGU7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5ldmVudHM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5mbm1hdGNoO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuZ2l0cmVwbzt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmhvb2tzO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaWdub3JlO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaWdub3JlLmludGVybmFsO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWw7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5mc2NrO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5kZnM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmlvO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5wYWNrO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5yZWZ0YWJsZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucmVmdHJlZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0O3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGZzO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubWVyZ2U7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5ubHM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5ub3Rlczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnBhdGNoO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQucGdtO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQucGdtLmludGVybmFsO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQucmV2cGxvdDt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLmZpbHRlcjt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UucGFjazt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnN1Ym1vZHVsZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5odHRwO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnJlc29sdmVyO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGs7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5maWx0ZXI7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5pbzt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuc2hhMTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKICBvcmcuanVuaXQ7dmVyc2lvbj0iWzQuMTIsNS4wLjApIiwKICBvcmcuanVuaXQuZXhwZXJpbWVudGFsLnRoZW9yaWVzO3ZlcnNpb249Ils0LjEyLDUuMC4wKSIsCiAgb3JnLmp1bml0LnJ1bGVzO3ZlcnNpb249Ils0LjEyLDUuMC4wKSIsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvZXh0dHN0L29yZy9lY2xpcHNlL2pnaXQvaWdub3JlL0NHaXRWc0pHaXRSYW5kb21JZ25vcmVQYXR0ZXJuVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L2V4dHRzdC9vcmcvZWNsaXBzZS9qZ2l0L2lnbm9yZS9DR2l0VnNKR2l0UmFuZG9tSWdub3JlUGF0dGVyblRlc3QuamF2YQppbmRleCA0MzhkMmQ2Li40ZDllODY0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvZXh0dHN0L29yZy9lY2xpcHNlL2pnaXQvaWdub3JlL0NHaXRWc0pHaXRSYW5kb21JZ25vcmVQYXR0ZXJuVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC9leHR0c3Qvb3JnL2VjbGlwc2UvamdpdC9pZ25vcmUvQ0dpdFZzSkdpdFJhbmRvbUlnbm9yZVBhdHRlcm5UZXN0LmphdmEKQEAgLTQyLDcgKzQyLDcgQEAKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0Lmlnbm9yZTsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogCiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKIGltcG9ydCBqYXZhLmlvLkZpbGU7CkBAIC0xNTgsNyArMTU4LDcgQEAgcHVibGljIENHaXRJZ25vcmVSdWxlKEZpbGUgZ2l0RGlyLCBTdHJpbmcgcGF0dGVybikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCXRoaXMuZ2l0RGlyID0gZ2l0RGlyOwogCQkJdGhpcy5wYXR0ZXJuID0gcGF0dGVybjsKIAkJCUZpbGVzLndyaXRlKEZpbGVVdGlscy50b1BhdGgobmV3IEZpbGUoZ2l0RGlyLCAiLmdpdGlnbm9yZSIpKSwKLQkJCQkJKHBhdHRlcm4gKyAiXG4iKS5nZXRCeXRlcyhVVEZfOCksIFN0YW5kYXJkT3Blbk9wdGlvbi5DUkVBVEUsCisJCQkJCShwYXR0ZXJuICsgIlxuIikuZ2V0Qnl0ZXMoQ0hBUlNFVCksIFN0YW5kYXJkT3Blbk9wdGlvbi5DUkVBVEUsCiAJCQkJCVN0YW5kYXJkT3Blbk9wdGlvbi5UUlVOQ0FURV9FWElTVElORywKIAkJCQkJU3RhbmRhcmRPcGVuT3B0aW9uLldSSVRFKTsKIAkJfQpAQCAtMTg4LDcgKzE4OCw3IEBAIHByaXZhdGUgUHJvY2VzcyBzdGFydENnaXRDaGVja0lnbm9yZShTdHJpbmcgcGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCVByb2Nlc3MgcHJvYyA9IFJ1bnRpbWUuZ2V0UnVudGltZSgpLmV4ZWMoY29tbWFuZCwgbmV3IFN0cmluZ1swXSwKIAkJCQkJZ2l0RGlyKTsKIAkJCXRyeSAoT3V0cHV0U3RyZWFtIG91dCA9IHByb2MuZ2V0T3V0cHV0U3RyZWFtKCkpIHsKLQkJCQlvdXQud3JpdGUoKHBhdGggKyAiXG4iKS5nZXRCeXRlcyhVVEZfOCkpOworCQkJCW91dC53cml0ZSgocGF0aCArICJcbiIpLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJCQlvdXQuZmx1c2goKTsKIAkJCX0KIAkJCXJldHVybiBwcm9jOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L2V4dHRzdC9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL0VHaXRQYXRjaEhpc3RvcnlUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvZXh0dHN0L29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvRUdpdFBhdGNoSGlzdG9yeVRlc3QuamF2YQppbmRleCAzZjllZjEyLi43OWQ4ZDBlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvZXh0dHN0L29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvRUdpdFBhdGNoSGlzdG9yeVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvZXh0dHN0L29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvRUdpdFBhdGNoSGlzdG9yeVRlc3QuamF2YQpAQCAtODUsNyArODUsNyBAQCBzdGF0aWMgY2xhc3MgUGF0Y2hSZWFkZXIgZXh0ZW5kcyBDb21taXRSZWFkZXIgewogCiAJCWludCBlcnJvcnM7CiAKLQkJUGF0Y2hSZWFkZXIoZmluYWwgSGFzaE1hcDxTdHJpbmcsIEhhc2hNYXA8U3RyaW5nLCBTdGF0SW5mbz4+IHMpCisJCVBhdGNoUmVhZGVyKEhhc2hNYXA8U3RyaW5nLCBIYXNoTWFwPFN0cmluZywgU3RhdEluZm8+PiBzKQogCQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQlzdXBlcihuZXcgU3RyaW5nW10geyAiLXAiIH0pOwogCQkJc3RhdHMgPSBzOwpAQCAtMTAzLDcgKzEwMyw3IEBAIHZvaWQgb25Db21taXQoU3RyaW5nIGNpZCwgYnl0ZVtdIGJ1ZikgewogCQkJcC5wYXJzZShidWYsIDAsIGJ1Zi5sZW5ndGggLSAxKTsKIAkJCWFzc2VydEVxdWFscygiRmlsZSBjb3VudCAiICsgY2lkLCBmaWxlcy5zaXplKCksIHAuZ2V0RmlsZXMoKS5zaXplKCkpOwogCQkJaWYgKCFwLmdldEVycm9ycygpLmlzRW1wdHkoKSkgewotCQkJCWZvciAoZmluYWwgRm9ybWF0RXJyb3IgZSA6IHAuZ2V0RXJyb3JzKCkpIHsKKwkJCQlmb3IgKEZvcm1hdEVycm9yIGUgOiBwLmdldEVycm9ycygpKSB7CiAJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZXJyb3IgIiArIGUuZ2V0TWVzc2FnZSgpKTsKIAkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgIGF0ICIgKyBlLmdldExpbmVUZXh0KCkpOwogCQkJCX0KQEAgLTExMSw3ICsxMTEsNyBAQCB2b2lkIG9uQ29tbWl0KFN0cmluZyBjaWQsIGJ5dGVbXSBidWYpIHsKIAkJCQlmYWlsKCJVbmV4cGVjdGVkIGVycm9yIGluICIgKyBjaWQpOwogCQkJfQogCi0JCQlmb3IgKGZpbmFsIEZpbGVIZWFkZXIgZmggOiBwLmdldEZpbGVzKCkpIHsKKwkJCWZvciAoRmlsZUhlYWRlciBmaCA6IHAuZ2V0RmlsZXMoKSkgewogCQkJCWZpbmFsIFN0cmluZyBmaWxlTmFtZTsKIAkJCQlpZiAoZmguZ2V0Q2hhbmdlVHlwZSgpICE9IEZpbGVIZWFkZXIuQ2hhbmdlVHlwZS5ERUxFVEUpCiAJCQkJCWZpbGVOYW1lID0gZmguZ2V0TmV3UGF0aCgpOwpAQCAtMTIxLDcgKzEyMSw3IEBAIHZvaWQgb25Db21taXQoU3RyaW5nIGNpZCwgYnl0ZVtdIGJ1ZikgewogCQkJCWZpbmFsIFN0cmluZyBuaWQgPSBmaWxlTmFtZSArICIgaW4gIiArIGNpZDsKIAkJCQlhc3NlcnROb3ROdWxsKCJObyAiICsgbmlkLCBzKTsKIAkJCQlpbnQgYWRkZWQgPSAwLCBkZWxldGVkID0gMDsKLQkJCQlmb3IgKGZpbmFsIEh1bmtIZWFkZXIgaCA6IGZoLmdldEh1bmtzKCkpIHsKKwkJCQlmb3IgKEh1bmtIZWFkZXIgaCA6IGZoLmdldEh1bmtzKCkpIHsKIAkJCQkJYWRkZWQgKz0gaC5nZXRPbGRJbWFnZSgpLmdldExpbmVzQWRkZWQoKTsKIAkJCQkJZGVsZXRlZCArPSBoLmdldE9sZEltYWdlKCkuZ2V0TGluZXNEZWxldGVkKCk7CiAJCQkJfQpAQCAtMTQ3LDcgKzE0Nyw3IEBAIHZvaWQgb25Db21taXQoU3RyaW5nIGNpZCwgYnl0ZVtdIGJ1ZikgewogCQkJYXNzZXJ0VHJ1ZSgiTWlzc2VkIGZpbGVzIGluICIgKyBjaWQsIGZpbGVzLmlzRW1wdHkoKSk7CiAJCX0KIAotCQlwcml2YXRlIHN0YXRpYyB2b2lkIGR1bXAoZmluYWwgYnl0ZVtdIGJ1ZikgeworCQlwcml2YXRlIHN0YXRpYyB2b2lkIGR1bXAoYnl0ZVtdIGJ1ZikgewogCQkJU3RyaW5nIHN0cjsKIAkJCXRyeSB7CiAJCQkJc3RyID0gbmV3IFN0cmluZyhidWYsIDAsIGJ1Zi5sZW5ndGggLSAxLCAiSVNPLTg4NTktMSIpOwpAQCAtMTg4LDcgKzE4OCw3IEBAIHZvaWQgb25Db21taXQoU3RyaW5nIGNvbW1pdElkLCBieXRlW10gYnVmKSB7CiAJc3RhdGljIGFic3RyYWN0IGNsYXNzIENvbW1pdFJlYWRlciB7CiAJCXByaXZhdGUgUHJvY2VzcyBwcm9jOwogCi0JCUNvbW1pdFJlYWRlcihmaW5hbCBTdHJpbmdbXSBhcmdzKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlDb21taXRSZWFkZXIoU3RyaW5nW10gYXJncykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCWZpbmFsIFN0cmluZ1tdIHJlYWxBcmdzID0gbmV3IFN0cmluZ1szICsgYXJncy5sZW5ndGggKyAxXTsKIAkJCXJlYWxBcmdzWzBdID0gImdpdCI7CiAJCQlyZWFsQXJnc1sxXSA9ICJsb2ciOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L2V4dHRzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL0ZpbGVUcmVlSXRlcmF0b3JQZXJmb3JtYW5jZVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC9leHR0c3Qvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9GaWxlVHJlZUl0ZXJhdG9yUGVyZm9ybWFuY2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjIzODM4OQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC9leHR0c3Qvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9GaWxlVHJlZUl0ZXJhdG9yUGVyZm9ybWFuY2VUZXN0LmphdmEKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCwgVGhvbWFzIFdvbGYgPHRob21hcy53b2xmQHBhcmFub3IuY2g+CisgKiBhbmQgb3RoZXIgY29weXJpZ2h0IG93bmVycyBhcyBkb2N1bWVudGVkIGluIHRoZSBwcm9qZWN0J3MgSVAgbG9nLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlCisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgdjEuMCB3aGljaAorICogYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGlzIHJlcHJvZHVjZWQgYmVsb3csIGFuZCBpcworICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocAorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgorICogd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCisgKiBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorICogICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogLSBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIEluYy4gbm9yIHRoZQorICogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICogICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiAgIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQKKyAqIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCisgKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRgorICogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC50cmVld2FsazsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5HaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5SZXBvc2l0b3J5VGVzdENhc2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5maWx0ZXIuUGF0aEZpbHRlcjsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBTaW1wbGUgcGVyZm9ybWFuY2UgdGVzdCBmb3IgZ2l0IGFkZCAvIEZpbGVUcmVlSXRlcmF0b3IuCisgKi8KK3B1YmxpYyBjbGFzcyBGaWxlVHJlZUl0ZXJhdG9yUGVyZm9ybWFuY2VUZXN0IGV4dGVuZHMgUmVwb3NpdG9yeVRlc3RDYXNlIHsKKworCXByaXZhdGUgc3RhdGljIGludCBOX09GX0ZJTEVTID0gNTAxOworCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0UGVyZm9ybWFuY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdHJ5IChHaXQgZ2l0ID0gbmV3IEdpdChkYikpIHsKKwkJCWxvbmcgdGltZXNbXSA9IG5ldyBsb25nW05fT0ZfRklMRVNdOworCQkJbG9uZyBzdW0gPSAwOworCQkJU3RyaW5nIGxhc3ROYW1lID0gbnVsbDsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgTl9PRl9GSUxFUzsgaSsrKSB7CisJCQkJbGFzdE5hbWUgPSAiYSIgKyAoaSArIDEwMDAwMCkgKyAiLnR4dCI7CisJCQkJd3JpdGVUcmFzaEZpbGUobGFzdE5hbWUsICIiKTsKKwkJCQlsb25nIHN0YXJ0ID0gU3lzdGVtLm5hbm9UaW1lKCk7CisJCQkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKGxhc3ROYW1lKS5jYWxsKCk7CisJCQkJbG9uZyBlbGFwc2VkID0gU3lzdGVtLm5hbm9UaW1lKCkgLSBzdGFydDsKKwkJCQl0aW1lc1tpXSA9IGVsYXBzZWQ7CisJCQkJc3VtICs9IGVsYXBzZWQ7CisJCQl9CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRvdGFsICjCtXMpICIgKyBzdW0gLyAxMDAwLjApOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aW1lcy5sZW5ndGg7IGkrKykgeworCQkJCVN5c3RlbS5vdXQKKwkJCQkJCS5wcmludGxuKCJUaW1lICIgKyBpICsgIiAowrVzKSA9ICIgKyB0aW1lc1tpXSAvIDEwMDAuMCk7CisJCQl9CisJCQlGaWxlVHJlZUl0ZXJhdG9yIGl0ZXIgPSBuZXcgRmlsZVRyZWVJdGVyYXRvcihkYik7CisJCQl0cnkgKFRyZWVXYWxrIHdhbGsgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CisJCQkJd2Fsay5zZXRGaWx0ZXIoUGF0aEZpbHRlci5jcmVhdGUobGFzdE5hbWUpKTsKKwkJCQl3YWxrLmFkZFRyZWUoaXRlcik7CisJCQkJbG9uZyBzdGFydCA9IFN5c3RlbS5uYW5vVGltZSgpOworCQkJCWlmICh3YWxrLm5leHQoKSkgeworCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIldhbGsgdGltZSAowrVzKSA9ICIKKwkJCQkJCQkrIChTeXN0ZW0ubmFub1RpbWUoKSAtIHN0YXJ0KSAvIDEwMDAuMCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJZmFpbCgiRmlsZSBub3QgZm91bmQiKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC9wb20ueG1sCmluZGV4IDQzZjQwMzcuLmU2YzcxMjggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC9wb20ueG1sCkBAIC01Miw3ICs1Miw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj40LjExLjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+NS4wLjQtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQudGVzdDwvYXJ0aWZhY3RJZD4KQEAgLTYyLDYgKzYyLDEwIEBACiAgICAgSlVuaXQgdGVzdHMgZm9yIHRoZSBjb3JlIGxpYnJhcnkuCiAgIDwvZGVzY3JpcHRpb24+CiAKKyAgPHByb3BlcnRpZXM+CisgICAgPG1hdmVuLmphdmFkb2Muc2tpcD50cnVlPC9tYXZlbi5qYXZhZG9jLnNraXA+CisgIDwvcHJvcGVydGllcz4KKwogICA8ZGVwZW5kZW5jaWVzPgogICAgIDxkZXBlbmRlbmN5PgogICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdGVzdHMuYnpsIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3Rlc3RzLmJ6bAppbmRleCBjNzVhYjc2Li5mMzY4MDAwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdGVzdHMuYnpsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90ZXN0cy5iemwKQEAgLTE5LDYgKzE5LDEwIEBACiAgICAgICAgIGlmICJsaWIiIG5vdCBpbiBsYWJlbHM6CiAgICAgICAgICAgICBsYWJlbHMuYXBwZW5kKCJsaWIiKQogCisgICAgICAgICMgVE9ETyhodHRwOi8vZWNsaXAuc2UvNTM0Mjg1KTogTWFrZSB0aGlzIHRlc3QgcGFzcyByZWxpYWJseQorICAgICAgICAjIGFuZCByZW1vdmUgdGhlIGZsYWt5IGF0dHJpYnV0ZS4KKyAgICAgICAgZmxha3kgPSBzcmMuZW5kc3dpdGgoIkNyaXNzQ3Jvc3NNZXJnZVRlc3QuamF2YSIpCisKICAgICAgICAgYWRkaXRpb25hbF9kZXBzID0gW10KICAgICAgICAgaWYgc3JjLmVuZHN3aXRoKCJSb290TG9jYWxlVGVzdC5qYXZhIik6CiAgICAgICAgICAgICBhZGRpdGlvbmFsX2RlcHMgPSBbCkBAIC01Miw1ICs1Niw2IEBACiAgICAgICAgICAgICAgICAgIi8vb3JnLmVjbGlwc2UuamdpdC5qdW5pdDpqdW5pdCIsCiAgICAgICAgICAgICAgICAgIi8vb3JnLmVjbGlwc2UuamdpdC5sZnM6amdpdC1sZnMiLAogICAgICAgICAgICAgXSwKKyAgICAgICAgICAgIGZsYWt5ID0gZmxha3ksCiAgICAgICAgICAgICBqdm1fZmxhZ3MgPSBbIi1YbXgyNTZtIiwgIi1EZmlsZS5lbmNvZGluZz1VVEYtOCJdLAogICAgICAgICApCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0FwcGx5Q29tbWFuZFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQXBwbHlDb21tYW5kVGVzdC5qYXZhCmluZGV4IDE3MjgwN2MuLjFkZDMyOWEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQXBwbHlDb21tYW5kVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQXBwbHlDb21tYW5kVGVzdC5qYXZhCkBAIC02NCw3ICs2NCw3IEBAIHB1YmxpYyBjbGFzcyBBcHBseUNvbW1hbmRUZXN0IGV4dGVuZHMgUmVwb3NpdG9yeVRlc3RDYXNlIHsKIAogCXByaXZhdGUgUmF3VGV4dCBiOwogCi0JcHJpdmF0ZSBBcHBseVJlc3VsdCBpbml0KGZpbmFsIFN0cmluZyBuYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwcml2YXRlIEFwcGx5UmVzdWx0IGluaXQoU3RyaW5nIG5hbWUpIHRocm93cyBFeGNlcHRpb24gewogCQlyZXR1cm4gaW5pdChuYW1lLCB0cnVlLCB0cnVlKTsKIAl9CiAKQEAgLTI3Myw3ICsyNzMsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0Tm9uQVNDSUlEZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJYXNzZXJ0RmFsc2UobmV3IEZpbGUoZGIuZ2V0V29ya1RyZWUoKSwgIk5vbkFTQ0lJRGVsIikuZXhpc3RzKCkpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIGJ5dGVbXSByZWFkRmlsZShmaW5hbCBTdHJpbmcgcGF0Y2hGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByaXZhdGUgc3RhdGljIGJ5dGVbXSByZWFkRmlsZShTdHJpbmcgcGF0Y2hGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBJbnB1dFN0cmVhbSBpbiA9IGdldFRlc3RSZXNvdXJjZShwYXRjaEZpbGUpOwogCQlpZiAoaW4gPT0gbnVsbCkgewogCQkJZmFpbCgiTm8gIiArIHBhdGNoRmlsZSArICIgdGVzdCB2ZWN0b3IiKTsKQEAgLTI5MSw3ICsyOTEsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0Tm9uQVNDSUlEZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJfQogCX0KIAotCXByaXZhdGUgc3RhdGljIElucHV0U3RyZWFtIGdldFRlc3RSZXNvdXJjZShmaW5hbCBTdHJpbmcgcGF0Y2hGaWxlKSB7CisJcHJpdmF0ZSBzdGF0aWMgSW5wdXRTdHJlYW0gZ2V0VGVzdFJlc291cmNlKFN0cmluZyBwYXRjaEZpbGUpIHsKIAkJcmV0dXJuIEFwcGx5Q29tbWFuZFRlc3QuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKQogCQkJCS5nZXRSZXNvdXJjZUFzU3RyZWFtKCJvcmcvZWNsaXBzZS9qZ2l0L2RpZmYvIiArIHBhdGNoRmlsZSk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9BcmNoaXZlQ29tbWFuZFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQXJjaGl2ZUNvbW1hbmRUZXN0LmphdmEKaW5kZXggZWRhYjk2Yi4uMTMwMGY5OCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9BcmNoaXZlQ29tbWFuZFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0FyY2hpdmVDb21tYW5kVGVzdC5qYXZhCkBAIC0yMjksMTEgKzIyOSw2IEBAIHB1YmxpYyBNb2NrT3V0cHV0U3RyZWFtIGNyZWF0ZUFyY2hpdmVPdXRwdXRTdHJlYW0oT3V0cHV0U3RyZWFtIHMsCiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgcHV0RW50cnkoTW9ja091dHB1dFN0cmVhbSBvdXQsIFN0cmluZyBwYXRoLCBGaWxlTW9kZSBtb2RlLCBPYmplY3RMb2FkZXIgbG9hZGVyKSB7Ci0JCQlwdXRFbnRyeShvdXQsIG51bGwsIHBhdGgsIG1vZGUsIGxvYWRlcik7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKIAkJcHVibGljIHZvaWQgcHV0RW50cnkoTW9ja091dHB1dFN0cmVhbSBvdXQsIE9iamVjdElkIHRyZWUsIFN0cmluZyBwYXRoLCBGaWxlTW9kZSBtb2RlLCBPYmplY3RMb2FkZXIgbG9hZGVyKSB7CiAJCQlTdHJpbmcgY29udGVudCA9IG1vZGUgIT0gRmlsZU1vZGUuVFJFRSA/IG5ldyBTdHJpbmcobG9hZGVyLmdldEJ5dGVzKCkpIDogbnVsbDsKIAkJCWVudHJpZXMucHV0KHBhdGgsIGNvbnRlbnQpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9CbGFtZUNvbW1hbmRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0JsYW1lQ29tbWFuZFRlc3QuamF2YQppbmRleCBmMzdhYTEzLi43YTFkMjIyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0JsYW1lQ29tbWFuZFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0JsYW1lQ29tbWFuZFRlc3QuamF2YQpAQCAtMTM2LDcgKzEzNiw3IEBAIHB1YmxpYyB2b2lkIHRlc3RNb3ZlVG9PdGhlckRpcigpIHRocm93cyBFeGNlcHRpb24gewogCQl0ZXN0UmVuYW1lKCJzdWJkaXIvZmlsZTEudHh0IiwgIm90aGVyZGlyL2ZpbGUxLnR4dCIpOwogCX0KIAotCXByaXZhdGUgdm9pZCB0ZXN0UmVuYW1lKGZpbmFsIFN0cmluZyBzb3VyY2VQYXRoLCBmaW5hbCBTdHJpbmcgZGVzdFBhdGgpCisJcHJpdmF0ZSB2b2lkIHRlc3RSZW5hbWUoU3RyaW5nIHNvdXJjZVBhdGgsIFN0cmluZyBkZXN0UGF0aCkKIAkJCXRocm93cyBFeGNlcHRpb24gewogCQl0cnkgKEdpdCBnaXQgPSBuZXcgR2l0KGRiKSkgewogCQkJU3RyaW5nW10gY29udGVudDEgPSBuZXcgU3RyaW5nW10geyAiYSIsICJiIiwgImMiIH07CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0JyYW5jaENvbW1hbmRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0JyYW5jaENvbW1hbmRUZXN0LmphdmEKaW5kZXggMmZlNDBiOS4uMDhmMWZkZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9CcmFuY2hDb21tYW5kVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQnJhbmNoQ29tbWFuZFRlc3QuamF2YQpAQCAtMTkxLDYgKzE5MSwxOCBAQCBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlQW5kTGlzdCgpIHRocm93cyBFeGNlcHRpb24gewogCQkJCS0gYWxsQmVmb3JlKTsKIAl9CiAKKwlAVGVzdChleHBlY3RlZCA9IEludmFsaWRSZWZOYW1lRXhjZXB0aW9uLmNsYXNzKQorCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQnJhbmNoSEVBRCgpIHRocm93cyBFeGNlcHRpb24geworCQlnaXQuYnJhbmNoQ3JlYXRlKCkuc2V0TmFtZSgiSEVBRCIpLmNhbGwoKTsKKwkJZmFpbCgiQ3JlYXRlIGJyYW5jaCB3aXRoIGludmFsaWQgcmVmIG5hbWUgc2hvdWxkIGZhaWwiKTsKKwl9CisKKwlAVGVzdChleHBlY3RlZCA9IEludmFsaWRSZWZOYW1lRXhjZXB0aW9uLmNsYXNzKQorCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQnJhbmNoRGFzaCgpIHRocm93cyBFeGNlcHRpb24geworCQlnaXQuYnJhbmNoQ3JlYXRlKCkuc2V0TmFtZSgiLXgiKS5jYWxsKCk7CisJCWZhaWwoIkNyZWF0ZSBicmFuY2ggd2l0aCBpbnZhbGlkIHJlZiBuYW1lIHNob3VsZCBmYWlsIik7CisJfQorCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0TGlzdEFsbEJyYW5jaGVzU2hvdWxkTm90RGllKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXNldFVwUmVwb1dpdGhSZW1vdGUoKS5icmFuY2hMaXN0KCkuc2V0TGlzdE1vZGUoTGlzdE1vZGUuQUxMKS5jYWxsKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0NoZXJyeVBpY2tDb21tYW5kVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9DaGVycnlQaWNrQ29tbWFuZFRlc3QuamF2YQppbmRleCAzNTRiOWM2Li5mYmMyY2Y2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0NoZXJyeVBpY2tDb21tYW5kVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQ2hlcnJ5UGlja0NvbW1hbmRUZXN0LmphdmEKQEAgLTMzOCw3ICszMzgsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0Q2hlcnJ5UGlja091ckNvbW1pdE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJfQogCX0KIAotCXByaXZhdGUgUmV2Q29tbWl0IHByZXBhcmVDaGVycnlQaWNrKGZpbmFsIEdpdCBnaXQpIHRocm93cyBFeGNlcHRpb24geworCXByaXZhdGUgUmV2Q29tbWl0IHByZXBhcmVDaGVycnlQaWNrKEdpdCBnaXQpIHRocm93cyBFeGNlcHRpb24gewogCQkvLyBjcmVhdGUsIGFkZCBhbmQgY29tbWl0IGZpbGUgYQogCQl3cml0ZVRyYXNoRmlsZSgiYSIsICJhIik7CiAJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiYSIpLmNhbGwoKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQ29tbWl0Q29tbWFuZFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQ29tbWl0Q29tbWFuZFRlc3QuamF2YQppbmRleCAwZGQzNzQ5Li4zYTEzYWE1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0NvbW1pdENvbW1hbmRUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9Db21taXRDb21tYW5kVGVzdC5qYXZhCkBAIC01NCw3ICs1NCw3IEBACiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLlRpbWVab25lOwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkVtdHB5Q29tbWl0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5FbXB0eUNvbW1pdEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnMuV3JvbmdSZXBvc2l0b3J5U3RhdGVFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5kaWZmLkRpZmZFbnRyeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmRpcmNhY2hlLkRpckNhY2hlOwpAQCAtNTUzLDggKzU1Myw4IEBAIHB1YmxpYyB2b2lkIGNvbW1pdEVtcHR5Q29tbWl0cygpIHRocm93cyBFeGNlcHRpb24gewogCQkJCWdpdC5jb21taXQoKS5zZXRBdXRob3IoIk5ldyBBdXRob3IiLCAibmV3YXV0aG9yQGV4YW1wbGUub3JnIikKIAkJCQkJCS5zZXRNZXNzYWdlKCJhZ2FpbiBubyBjaGFuZ2UiKS5zZXRBbGxvd0VtcHR5KGZhbHNlKQogCQkJCQkJLmNhbGwoKTsKLQkJCQlmYWlsKCJEaWRuJ3QgZ2V0IHRoZSBleHBlY3RlZCBFbXRweUNvbW1pdEV4Y2VwdGlvbiIpOwotCQkJfSBjYXRjaCAoRW10cHlDb21taXRFeGNlcHRpb24gZSkgeworCQkJCWZhaWwoIkRpZG4ndCBnZXQgdGhlIGV4cGVjdGVkIEVtcHR5Q29tbWl0RXhjZXB0aW9uIik7CisJCQl9IGNhdGNoIChFbXB0eUNvbW1pdEV4Y2VwdGlvbiBlKSB7CiAJCQkJLy8gZXhwZWN0IHRoaXMgZXhjZXB0aW9uCiAJCQl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQ29tbWl0T25seVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQ29tbWl0T25seVRlc3QuamF2YQppbmRleCBjYzIxYjQ3Li5iYmQ2ZWMwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0NvbW1pdE9ubHlUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9Db21taXRPbmx5VGVzdC5qYXZhCkBAIC0xMjg5LDcgKzEyODksNyBAQCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZXhwZWN0ZWRfZjNfaWR4KGZpbmFsIGludCBzdGF0ZSkgewogCQlyZXR1cm4gbnVsbDsKIAl9CiAKLQlzdGF0aWMgcHJpdmF0ZSBTdHJpbmcgZ2V0SGVhZChmaW5hbCBHaXQgZ2l0LCBmaW5hbCBTdHJpbmcgcGF0aCkKKwlzdGF0aWMgcHJpdmF0ZSBTdHJpbmcgZ2V0SGVhZChHaXQgZ2l0LCBTdHJpbmcgcGF0aCkKIAkJCXRocm93cyBFeGNlcHRpb24gewogCQl0cnkgewogCQkJZmluYWwgUmVwb3NpdG9yeSByZXBvID0gZ2l0LmdldFJlcG9zaXRvcnkoKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvRGVzY3JpYmVDb21tYW5kVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9EZXNjcmliZUNvbW1hbmRUZXN0LmphdmEKaW5kZXggYmU2Nzg5My4uZjIwOTNlMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9EZXNjcmliZUNvbW1hbmRUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9EZXNjcmliZUNvbW1hbmRUZXN0LmphdmEKQEAgLTU1LDcgKzU1LDYgQEAKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5HaXRBUElFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLlJlZk5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLkludmFsaWRQYXR0ZXJuRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuUmVwb3NpdG9yeVRlc3RDYXNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdElkOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwpAQCAtNjksMTMgKzY4LDE4IEBAIHB1YmxpYyBjbGFzcyBEZXNjcmliZUNvbW1hbmRUZXN0IGV4dGVuZHMgUmVwb3NpdG9yeVRlc3RDYXNlIHsKIAogCXByaXZhdGUgR2l0IGdpdDsKIAotCUBQYXJhbWV0ZXIKKwlAUGFyYW1ldGVyKDApCiAJcHVibGljIGJvb2xlYW4gdXNlQW5ub3RhdGVkVGFnczsKIAotCUBQYXJhbWV0ZXJzCisJQFBhcmFtZXRlcigxKQorCXB1YmxpYyBib29sZWFuIGRlc2NyaWJlVXNlQWxsVGFnczsKKworCUBQYXJhbWV0ZXJzKG5hbWUgPSAiZ2l0IHRhZyAtYSB7MH0/LWE6IHdpdGggZ2l0IGRlc2NyaWJlIHsxfT8tLXRhZ3M6IikKIAlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248Qm9vbGVhbltdPiBnZXRVc2VBbm5vdGF0ZWRUYWdzVmFsdWVzKCkgewotCQlyZXR1cm4gQXJyYXlzLmFzTGlzdChuZXcgQm9vbGVhbltdW10geyB7IEJvb2xlYW4uVFJVRSB9LAotCQkJCXsgQm9vbGVhbi5GQUxTRSB9IH0pOworCQlyZXR1cm4gQXJyYXlzLmFzTGlzdChuZXcgQm9vbGVhbltdW10geyB7IEJvb2xlYW4uVFJVRSwgQm9vbGVhbi5GQUxTRSB9LAorCQkJCXsgQm9vbGVhbi5GQUxTRSwgQm9vbGVhbi5GQUxTRSB9LAorCQkJCXsgQm9vbGVhbi5UUlVFLCBCb29sZWFuLlRSVUUgfSwKKwkJCQl7IEJvb2xlYW4uRkFMU0UsIEJvb2xlYW4uVFJVRSB9IH0pOwogCX0KIAogCUBPdmVycmlkZQpAQCAtMTAwLDM1ICsxMDQsNTIgQEAgcHVibGljIHZvaWQgdGVzdERlc2NyaWJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXRhZygiYm9iLXQyIik7CiAKIAkJT2JqZWN0SWQgYzQgPSBtb2RpZnkoImRkZCIpOworCQlhc3NlcnROYW1lU3RhcnRzV2l0aChjNCwgIjNlNTYzYzUiKTsKIAogCQlhc3NlcnROdWxsKGRlc2NyaWJlKGMxKSk7CiAJCWFzc2VydE51bGwoZGVzY3JpYmUoYzEsIHRydWUpKTsKIAkJYXNzZXJ0TnVsbChkZXNjcmliZShjMSwgImEqIiwgImIqIiwgImMqIikpOwotCi0JCWFzc2VydEVxdWFscygiYWxpY2UtdDEiLCBkZXNjcmliZShjMikpOwotCQlhc3NlcnRFcXVhbHMoImFsaWNlLXQxIiwgZGVzY3JpYmUoYzIsICJhbGljZSoiKSk7CiAJCWFzc2VydE51bGwoZGVzY3JpYmUoYzIsICJib2IqIikpOwogCQlhc3NlcnROdWxsKGRlc2NyaWJlKGMyLCAiP29iKiIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhbGljZS10MSIsIGRlc2NyaWJlKGMyLCAiYSoiLCAiYioiLCAiYyoiKSk7CiAKLQkJYXNzZXJ0RXF1YWxzKCJib2ItdDIiLCBkZXNjcmliZShjMykpOwotCQlhc3NlcnRFcXVhbHMoImJvYi10Mi0wLWc0NDU3OWViIiwgZGVzY3JpYmUoYzMsIHRydWUpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhbGljZS10MS0xLWc0NDU3OWViIiwgZGVzY3JpYmUoYzMsICJhbGljZSoiKSk7Ci0JCWFzc2VydEVxdWFscygiYWxpY2UtdDEtMS1nNDQ1NzllYiIsIGRlc2NyaWJlKGMzLCAiYT8/Yz8tdCoiKSk7Ci0JCWFzc2VydEVxdWFscygiYm9iLXQyIiwgZGVzY3JpYmUoYzMsICJib2IqIikpOwotCQlhc3NlcnRFcXVhbHMoImJvYi10MiIsIGRlc2NyaWJlKGMzLCAiP29iKiIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJib2ItdDIiLCBkZXNjcmliZShjMywgImEqIiwgImIqIiwgImMqIikpOworCQlpZiAodXNlQW5ub3RhdGVkVGFncyB8fCBkZXNjcmliZVVzZUFsbFRhZ3MpIHsKKwkJCWFzc2VydEVxdWFscygiYWxpY2UtdDEiLCBkZXNjcmliZShjMikpOworCQkJYXNzZXJ0RXF1YWxzKCJhbGljZS10MSIsIGRlc2NyaWJlKGMyLCAiYWxpY2UqIikpOworCQkJYXNzZXJ0RXF1YWxzKCJhbGljZS10MSIsIGRlc2NyaWJlKGMyLCAiYSoiLCAiYioiLCAiYyoiKSk7CiAKLQkJYXNzZXJ0TmFtZVN0YXJ0c1dpdGgoYzQsICIzZTU2M2M1Iik7Ci0JCS8vIHRoZSB2YWx1ZSB2ZXJpZmllZCB3aXRoIGdpdC1kZXNjcmliZSgxKQotCQlhc3NlcnRFcXVhbHMoImJvYi10Mi0xLWczZTU2M2M1IiwgZGVzY3JpYmUoYzQpKTsKLQkJYXNzZXJ0RXF1YWxzKCJib2ItdDItMS1nM2U1NjNjNSIsIGRlc2NyaWJlKGM0LCB0cnVlKSk7Ci0JCWFzc2VydEVxdWFscygiYWxpY2UtdDEtMi1nM2U1NjNjNSIsIGRlc2NyaWJlKGM0LCAiYWxpY2UqIikpOwotCQlhc3NlcnRFcXVhbHMoImJvYi10Mi0xLWczZTU2M2M1IiwgZGVzY3JpYmUoYzQsICJib2IqIikpOwotCQlhc3NlcnRFcXVhbHMoImJvYi10Mi0xLWczZTU2M2M1IiwgZGVzY3JpYmUoYzQsICJhKiIsICJiKiIsICJjKiIpKTsKKwkJCWFzc2VydEVxdWFscygiYm9iLXQyIiwgZGVzY3JpYmUoYzMpKTsKKwkJCWFzc2VydEVxdWFscygiYm9iLXQyLTAtZzQ0NTc5ZWIiLCBkZXNjcmliZShjMywgdHJ1ZSkpOworCQkJYXNzZXJ0RXF1YWxzKCJhbGljZS10MS0xLWc0NDU3OWViIiwgZGVzY3JpYmUoYzMsICJhbGljZSoiKSk7CisJCQlhc3NlcnRFcXVhbHMoImFsaWNlLXQxLTEtZzQ0NTc5ZWIiLCBkZXNjcmliZShjMywgImE/P2M/LXQqIikpOworCQkJYXNzZXJ0RXF1YWxzKCJib2ItdDIiLCBkZXNjcmliZShjMywgImJvYioiKSk7CisJCQlhc3NlcnRFcXVhbHMoImJvYi10MiIsIGRlc2NyaWJlKGMzLCAiP29iKiIpKTsKKwkJCWFzc2VydEVxdWFscygiYm9iLXQyIiwgZGVzY3JpYmUoYzMsICJhKiIsICJiKiIsICJjKiIpKTsKKworCQkJLy8gdGhlIHZhbHVlIHZlcmlmaWVkIHdpdGggZ2l0LWRlc2NyaWJlKDEpCisJCQlhc3NlcnRFcXVhbHMoImJvYi10Mi0xLWczZTU2M2M1IiwgZGVzY3JpYmUoYzQpKTsKKwkJCWFzc2VydEVxdWFscygiYm9iLXQyLTEtZzNlNTYzYzUiLCBkZXNjcmliZShjNCwgdHJ1ZSkpOworCQkJYXNzZXJ0RXF1YWxzKCJhbGljZS10MS0yLWczZTU2M2M1IiwgZGVzY3JpYmUoYzQsICJhbGljZSoiKSk7CisJCQlhc3NlcnRFcXVhbHMoImJvYi10Mi0xLWczZTU2M2M1IiwgZGVzY3JpYmUoYzQsICJib2IqIikpOworCQkJYXNzZXJ0RXF1YWxzKCJib2ItdDItMS1nM2U1NjNjNSIsIGRlc2NyaWJlKGM0LCAiYSoiLCAiYioiLCAiYyoiKSk7CisJCX0gZWxzZSB7CisJCQlhc3NlcnRFcXVhbHMobnVsbCwgZGVzY3JpYmUoYzIpKTsKKwkJCWFzc2VydEVxdWFscyhudWxsLCBkZXNjcmliZShjMykpOworCQkJYXNzZXJ0RXF1YWxzKG51bGwsIGRlc2NyaWJlKGM0KSk7CisJCX0KIAogCQkvLyB0ZXN0IGRlZmF1bHQgdGFyZ2V0Ci0JCWFzc2VydEVxdWFscygiYm9iLXQyLTEtZzNlNTYzYzUiLCBnaXQuZGVzY3JpYmUoKS5jYWxsKCkpOworCQlpZiAodXNlQW5ub3RhdGVkVGFncykgeworCQkJYXNzZXJ0RXF1YWxzKCJib2ItdDItMS1nM2U1NjNjNSIsIGdpdC5kZXNjcmliZSgpLmNhbGwoKSk7CisJCQlhc3NlcnRFcXVhbHMoImJvYi10Mi0xLWczZTU2M2M1IiwKKwkJCQkJZ2l0LmRlc2NyaWJlKCkuc2V0VGFncyhmYWxzZSkuY2FsbCgpKTsKKwkJCWFzc2VydEVxdWFscygiYm9iLXQyLTEtZzNlNTYzYzUiLAorCQkJCQlnaXQuZGVzY3JpYmUoKS5zZXRUYWdzKHRydWUpLmNhbGwoKSk7CisJCX0gZWxzZSB7CisJCQlhc3NlcnRFcXVhbHMobnVsbCwgZ2l0LmRlc2NyaWJlKCkuY2FsbCgpKTsKKwkJCWFzc2VydEVxdWFscyhudWxsLCBnaXQuZGVzY3JpYmUoKS5zZXRUYWdzKGZhbHNlKS5jYWxsKCkpOworCQkJYXNzZXJ0RXF1YWxzKCJib2ItdDItMS1nM2U1NjNjNSIsCisJCQkJCWdpdC5kZXNjcmliZSgpLnNldFRhZ3ModHJ1ZSkuY2FsbCgpKTsKKwkJfQogCX0KIAogCUBUZXN0CkBAIC0xNDMsMTIgKzE2NCwxNyBAQCBwdWJsaWMgdm9pZCB0ZXN0RGVzY3JpYmVNdWx0aU1hdGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXRhZygidjEuMS4xIik7CiAJCU9iamVjdElkIGMyID0gbW9kaWZ5KCJiYmIiKTsKIAorCQlpZiAoIXVzZUFubm90YXRlZFRhZ3MgJiYgIWRlc2NyaWJlVXNlQWxsVGFncykgeworCQkJYXNzZXJ0RXF1YWxzKG51bGwsIGRlc2NyaWJlKGMxKSk7CisJCQlhc3NlcnRFcXVhbHMobnVsbCwgZGVzY3JpYmUoYzIpKTsKKwkJCXJldHVybjsKKwkJfQorCiAJCS8vIEVuc3VyZSB0aGF0IGlmIHdlJ3JlIGludGVyZXN0ZWQgaW4gYW55IHRhZ3MsIHdlIGdldCB0aGUgbW9zdCByZWNlbnQgdGFnCiAJCS8vIGFzIHBlciBHaXQgYmVoYXZpb3VyIHNpbmNlIDEuNy4xLjEKIAkJaWYgKHVzZUFubm90YXRlZFRhZ3MpIHsKIAkJCWFzc2VydEVxdWFscygidjEuMS4xIiwgZGVzY3JpYmUoYzEpKTsKIAkJCWFzc2VydEVxdWFscygidjEuMS4xLTEtZ2I4OWRlYWQiLCBkZXNjcmliZShjMikpOwotCiAJCQkvLyBFbnN1cmUgdGhhdCBpZiB3ZSdyZSBvbmx5IGludGVyZXN0ZWQgaW4gb25lIG9mIG11bHRpcGxlIHRhZ3MsIHdlIGdldCB0aGUgcmlnaHQgbWF0Y2gKIAkJCWFzc2VydEVxdWFscygidjEuMC4xIiwgZGVzY3JpYmUoYzEsICJ2MS4wKiIpKTsKIAkJCWFzc2VydEVxdWFscygidjEuMS4xIiwgZGVzY3JpYmUoYzEsICJ2MS4xKiIpKTsKQEAgLTIwNCw3ICsyMzAsMTEgQEAgcHVibGljIHZvaWQgdGVzdERlc2NyaWJlQnJhbmNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCU9iamVjdElkIGM0ID0gbWVyZ2UoYzIpOwogCiAJCWFzc2VydE5hbWVTdGFydHNXaXRoKGM0LCAiMTE5ODkyYiIpOwotCQlhc3NlcnRFcXVhbHMoInQtMi1nMTE5ODkyYiIsIGRlc2NyaWJlKGM0KSk7IC8vIDIgY29tbWl0czogYzQgYW5kIGMzCisJCWlmICh1c2VBbm5vdGF0ZWRUYWdzIHx8IGRlc2NyaWJlVXNlQWxsVGFncykgeworCQkJYXNzZXJ0RXF1YWxzKCIyIGNvbW1pdHM6IGM0IGFuZCBjMyIsICJ0LTItZzExOTg5MmIiLCBkZXNjcmliZShjNCkpOworCQl9IGVsc2UgeworCQkJYXNzZXJ0RXF1YWxzKG51bGwsIGRlc2NyaWJlKGM0KSk7CisJCX0KIAkJYXNzZXJ0TnVsbChkZXNjcmliZShjMykpOwogCQlhc3NlcnROdWxsKGRlc2NyaWJlKGMzLCB0cnVlKSk7CiAJfQpAQCAtMjM2LDE0ICsyNjYsNzYgQEAgcHVibGljIHZvaWQgdDFEb21pbmF0ZXNUMigpIHRocm93cyBFeGNlcHRpb24gewogCQlicmFuY2goImIiLCBjMSk7CiAKIAkJT2JqZWN0SWQgYzMgPSBtb2RpZnkoImNjYyIpOworCQlhc3NlcnROYW1lU3RhcnRzV2l0aChjMywgIjAyNDRlN2YiKTsKIAogCQlPYmplY3RJZCBjNCA9IG1lcmdlKGMyKTsKIAogCQlhc3NlcnROYW1lU3RhcnRzV2l0aChjNCwgIjExOTg5MmIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0Mi0yLWcxMTk4OTJiIiwgZGVzY3JpYmUoYzQpKTsgLy8gMiBjb21taXRzOiBjNCBhbmQgYzMKKworCQlpZiAodXNlQW5ub3RhdGVkVGFncyB8fCBkZXNjcmliZVVzZUFsbFRhZ3MpIHsKKwkJCWFzc2VydEVxdWFscygidDItMi1nMTE5ODkyYiIsIGRlc2NyaWJlKGM0KSk7IC8vIDIgY29tbWl0czogYzQgYW5kIGMzCisJCQlhc3NlcnRFcXVhbHMoInQxLTEtZzAyNDRlN2YiLCBkZXNjcmliZShjMykpOworCQl9IGVsc2UgeworCQkJYXNzZXJ0RXF1YWxzKG51bGwsIGRlc2NyaWJlKGM0KSk7CisJCQlhc3NlcnRFcXVhbHMobnVsbCwgZGVzY3JpYmUoYzMpKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFdoZW4gdDEgYW5ub3RhdGVkIGRvbWluYXRlcyB0MiBsaWdodHdlaWdodCB0YWcKKwkgKgorCSAqIDxwcmU+CisJICogdDEgLSstPiB0MiAgLQorCSAqICAgICB8ICAgICAgIHwKKwkgKiAgICAgKy0+IGMzIC0rLT4gYzQKKwkgKiA8L3ByZT4KKwkgKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0MUFubm90YXRlZERvbWluYXRlc1QybGlnaHR3ZWlnaHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJT2JqZWN0SWQgYzEgPSBtb2RpZnkoImFhYSIpOworCQl0YWcoInQxIiwgdXNlQW5ub3RhdGVkVGFncyk7CisKKwkJT2JqZWN0SWQgYzIgPSBtb2RpZnkoImJiYiIpOworCQl0YWcoInQyIiwgZmFsc2UpOworCisJCWFzc2VydE5hbWVTdGFydHNXaXRoKGMyLCAiMzc0N2RiMyIpOworCQlpZiAodXNlQW5ub3RhdGVkVGFncyAmJiAhZGVzY3JpYmVVc2VBbGxUYWdzKSB7CisJCQlhc3NlcnRFcXVhbHMoCisJCQkJCSJvbmx5IGFubm90YXRlZCB0YWcgdDEgZXhwZWN0ZWQgdG8gYmUgdXNlZCBmb3IgZGVzY3JpYmUiLAorCQkJCQkidDEtMS1nMzc0N2RiMyIsIGRlc2NyaWJlKGMyKSk7IC8vIDEgY29tbWl0czogdDIgb3ZlcnJpZGRlbgorCQkJCQkJCQkJCQkJCS8vIGJ5IHQxCisJCX0gZWxzZSBpZiAoIXVzZUFubm90YXRlZFRhZ3MgJiYgIWRlc2NyaWJlVXNlQWxsVGFncykgeworCQkJYXNzZXJ0RXF1YWxzKCJubyBjb21taXRzIHRvIGRlc2NyaWJlIGV4cGVjdGVkIiwgbnVsbCwgZGVzY3JpYmUoYzIpKTsKKwkJfSBlbHNlIHsKKwkJCWFzc2VydEVxdWFscygibGlnaHR3ZWlnaHQgdGFnIHQyIGV4cGVjdGVkIGluIGRlc2NyaWJlIiwgInQyIiwKKwkJCQkJZGVzY3JpYmUoYzIpKTsKKwkJfQorCisJCWJyYW5jaCgiYiIsIGMxKTsKKworCQlPYmplY3RJZCBjMyA9IG1vZGlmeSgiY2NjIik7CiAKIAkJYXNzZXJ0TmFtZVN0YXJ0c1dpdGgoYzMsICIwMjQ0ZTdmIik7Ci0JCWFzc2VydEVxdWFscygidDEtMS1nMDI0NGU3ZiIsIGRlc2NyaWJlKGMzKSk7CisJCWlmICh1c2VBbm5vdGF0ZWRUYWdzIHx8IGRlc2NyaWJlVXNlQWxsVGFncykgeworCQkJYXNzZXJ0RXF1YWxzKCJ0MS0xLWcwMjQ0ZTdmIiwgZGVzY3JpYmUoYzMpKTsKKwkJfQorCisJCU9iamVjdElkIGM0ID0gbWVyZ2UoYzIpOworCisJCWFzc2VydE5hbWVTdGFydHNXaXRoKGM0LCAiMTE5ODkyYiIpOworCQlpZiAoZGVzY3JpYmVVc2VBbGxUYWdzKSB7CisJCQlhc3NlcnRFcXVhbHMoCisJCQkJCSIyIGNvbW1pdHMgZm9yIGRlc2NyaWJlIGNvbW1pdCBpbmNyZW1lbnQgZXhwZWN0ZWQgc2luY2UgbGlnaHR3ZWlnaHQgdGFnOiBjNCBhbmQgYzMiLAorCQkJCQkidDItMi1nMTE5ODkyYiIsIGRlc2NyaWJlKGM0KSk7IC8vIDIgY29tbWl0czogYzQgYW5kIGMzCisJCX0gZWxzZSBpZiAoIXVzZUFubm90YXRlZFRhZ3MgJiYgIWRlc2NyaWJlVXNlQWxsVGFncykgeworCQkJYXNzZXJ0RXF1YWxzKCJubyBtYXRjaGluZyBjb21taXRzIGV4cGVjdGVkIiwgbnVsbCwgZGVzY3JpYmUoYzQpKTsKKwkJfSBlbHNlIHsKKwkJCWFzc2VydEVxdWFscygKKwkJCQkJIjMgY29tbWl0cyBmb3IgZGVzY3JpYmUgY29tbWl0IGluY3JlbWVudCBleHBlY3RlZCBzaW5jZSBhbm5vdGF0ZWQgdGFnOiBjNCBhbmQgYzMgYW5kIGMyIiwKKwkJCQkJInQxLTMtZzExOTg5MmIiLCBkZXNjcmliZShjNCkpOyAvLworCQl9CiAJfQogCiAJLyoqCkBAIC0yNzEsNyArMzYzLDExIEBAIHB1YmxpYyB2b2lkIHQxbmVhcmVyVDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJT2JqZWN0SWQgYzQgPSBtZXJnZSh0MSk7CiAKIAkJYXNzZXJ0TmFtZVN0YXJ0c1dpdGgoYzQsICJiYjM4OWE0Iik7Ci0JCWFzc2VydEVxdWFscygidDEtMy1nYmIzODlhNCIsIGRlc2NyaWJlKGM0KSk7CisJCWlmICh1c2VBbm5vdGF0ZWRUYWdzIHx8IGRlc2NyaWJlVXNlQWxsVGFncykgeworCQkJYXNzZXJ0RXF1YWxzKCJ0MS0zLWdiYjM4OWE0IiwgZGVzY3JpYmUoYzQpKTsKKwkJfSBlbHNlIHsKKwkJCWFzc2VydEVxdWFscyhudWxsLCBkZXNjcmliZShjNCkpOworCQl9CiAJfQogCiAJLyoqCkBAIC0zMDAsNyArMzk2LDExIEBAIHB1YmxpYyB2b2lkIHQxc2FtZURlcHRoVDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJT2JqZWN0SWQgYzQgPSBtZXJnZShjMik7CiAKIAkJYXNzZXJ0TmFtZVN0YXJ0c1dpdGgoYzQsICJiYjM4OWE0Iik7Ci0JCWFzc2VydEVxdWFscygidDItNC1nYmIzODlhNCIsIGRlc2NyaWJlKGM0KSk7CisJCWlmICh1c2VBbm5vdGF0ZWRUYWdzIHx8IGRlc2NyaWJlVXNlQWxsVGFncykgeworCQkJYXNzZXJ0RXF1YWxzKCJ0Mi00LWdiYjM4OWE0IiwgZGVzY3JpYmUoYzQpKTsKKwkJfSBlbHNlIHsKKwkJCWFzc2VydEVxdWFscyhudWxsLCBkZXNjcmliZShjNCkpOworCQl9CiAJfQogCiAJcHJpdmF0ZSBPYmplY3RJZCBtZXJnZShPYmplY3RJZCBjMikgdGhyb3dzIEdpdEFQSUV4Y2VwdGlvbiB7CkBAIC0zMTQsMTAgKzQxNCwxNSBAQCBwcml2YXRlIE9iamVjdElkIG1vZGlmeShTdHJpbmcgY29udGVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJfQogCiAJcHJpdmF0ZSB2b2lkIHRhZyhTdHJpbmcgdGFnKSB0aHJvd3MgR2l0QVBJRXhjZXB0aW9uIHsKKwkJdGFnKHRhZywgdGhpcy51c2VBbm5vdGF0ZWRUYWdzKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgdGFnKFN0cmluZyB0YWcsIGJvb2xlYW4gYW5ub3RhdGVkVGFnKSB0aHJvd3MgR2l0QVBJRXhjZXB0aW9uIHsKIAkJVGFnQ29tbWFuZCB0YWdDb21tYW5kID0gZ2l0LnRhZygpLnNldE5hbWUodGFnKQotCQkJCS5zZXRBbm5vdGF0ZWQodXNlQW5ub3RhdGVkVGFncyk7Ci0JCWlmICh1c2VBbm5vdGF0ZWRUYWdzKQorCQkJCS5zZXRBbm5vdGF0ZWQoYW5ub3RhdGVkVGFnKTsKKwkJaWYgKGFubm90YXRlZFRhZykgewogCQkJdGFnQ29tbWFuZC5zZXRNZXNzYWdlKHRhZyk7CisJCX0KIAkJdGFnQ29tbWFuZC5jYWxsKCk7CiAJfQogCkBAIC0zMjksMTUgKzQzNCwxNyBAQCBwcml2YXRlIHN0YXRpYyB2b2lkIHRvdWNoKEZpbGUgZiwgU3RyaW5nIGNvbnRlbnRzKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogCXByaXZhdGUgU3RyaW5nIGRlc2NyaWJlKE9iamVjdElkIGMxLCBib29sZWFuIGxvbmdEZXNjKQogCQkJdGhyb3dzIEdpdEFQSUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gZ2l0LmRlc2NyaWJlKCkuc2V0VGFyZ2V0KGMxKS5zZXRMb25nKGxvbmdEZXNjKS5jYWxsKCk7CisJCXJldHVybiBnaXQuZGVzY3JpYmUoKS5zZXRUYXJnZXQoYzEpLnNldFRhZ3MoZGVzY3JpYmVVc2VBbGxUYWdzKQorCQkJCS5zZXRMb25nKGxvbmdEZXNjKS5jYWxsKCk7CiAJfQogCiAJcHJpdmF0ZSBTdHJpbmcgZGVzY3JpYmUoT2JqZWN0SWQgYzEpIHRocm93cyBHaXRBUElFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJcmV0dXJuIGRlc2NyaWJlKGMxLCBmYWxzZSk7CiAJfQogCi0JcHJpdmF0ZSBTdHJpbmcgZGVzY3JpYmUoT2JqZWN0SWQgYzEsIFN0cmluZy4uLiBwYXR0ZXJucykgdGhyb3dzIEdpdEFQSUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIEludmFsaWRQYXR0ZXJuRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdpdC5kZXNjcmliZSgpLnNldFRhcmdldChjMSkuc2V0TWF0Y2gocGF0dGVybnMpLmNhbGwoKTsKKwlwcml2YXRlIFN0cmluZyBkZXNjcmliZShPYmplY3RJZCBjMSwgU3RyaW5nLi4uIHBhdHRlcm5zKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGdpdC5kZXNjcmliZSgpLnNldFRhcmdldChjMSkuc2V0VGFncyhkZXNjcmliZVVzZUFsbFRhZ3MpCisJCQkJLnNldE1hdGNoKHBhdHRlcm5zKS5jYWxsKCk7CiAJfQogCiAJcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnROYW1lU3RhcnRzV2l0aChPYmplY3RJZCBjNCwgU3RyaW5nIHByZWZpeCkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9Fb2xTdHJlYW1UeXBlVXRpbFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvRW9sU3RyZWFtVHlwZVV0aWxUZXN0LmphdmEKaW5kZXggMWUzYTM5YS4uYmIzMDNjYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9Fb2xTdHJlYW1UeXBlVXRpbFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0VvbFN0cmVhbVR5cGVVdGlsVGVzdC5qYXZhCkBAIC00Miw3ICs0Miw3IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5hcGk7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29yZUNvbmZpZy5Fb2xTdHJlYW1UeXBlLkFVVE9fQ1JMRjsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29yZUNvbmZpZy5Fb2xTdHJlYW1UeXBlLkFVVE9fTEY7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvcmVDb25maWcuRW9sU3RyZWFtVHlwZS5ESVJFQ1Q7CkBAIC0xNTAsOCArMTUwLDggQEAgcHJpdmF0ZSB2b2lkIHRlc3RDaGVja291dChFb2xTdHJlYW1UeXBlIHN0cmVhbVR5cGVUZXh0LAogCQkJRW9sU3RyZWFtVHlwZSBzdHJlYW1UeXBlV2l0aEJpbmFyeUNoZWNrLCBTdHJpbmcgb3V0cHV0LAogCQkJU3RyaW5nIGV4cGVjdGVkQ29udmVyc2lvbikgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBiOwotCQlieXRlW10gb3V0cHV0Qnl0ZXMgPSBvdXRwdXQuZ2V0Qnl0ZXMoVVRGXzgpOwotCQlieXRlW10gZXhwZWN0ZWRDb252ZXJzaW9uQnl0ZXMgPSBleHBlY3RlZENvbnZlcnNpb24uZ2V0Qnl0ZXMoVVRGXzgpOworCQlieXRlW10gb3V0cHV0Qnl0ZXMgPSBvdXRwdXQuZ2V0Qnl0ZXMoQ0hBUlNFVCk7CisJCWJ5dGVbXSBleHBlY3RlZENvbnZlcnNpb25CeXRlcyA9IGV4cGVjdGVkQ29udmVyc2lvbi5nZXRCeXRlcyhDSEFSU0VUKTsKIAogCQkvLyB0ZXN0IHVzaW5nIG91dHB1dCB0ZXh0IGFuZCBhc3N1bWluZyBpdCB3YXMgZGVjbGFyZWQgVEVYVAogCQliID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwpAQCAtMjc3LDggKzI3Nyw4IEBAIHB1YmxpYyB2b2lkIHRlc3RDaGVja2luQ1JMRigpIHRocm93cyBFeGNlcHRpb24gewogCXByaXZhdGUgdm9pZCB0ZXN0Q2hlY2tpbihFb2xTdHJlYW1UeXBlIHN0cmVhbVR5cGVUZXh0LAogCQkJRW9sU3RyZWFtVHlwZSBzdHJlYW1UeXBlV2l0aEJpbmFyeUNoZWNrLCBTdHJpbmcgaW5wdXQsCiAJCQlTdHJpbmcgZXhwZWN0ZWRDb252ZXJzaW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYnl0ZVtdIGlucHV0Qnl0ZXMgPSBpbnB1dC5nZXRCeXRlcyhVVEZfOCk7Ci0JCWJ5dGVbXSBleHBlY3RlZENvbnZlcnNpb25CeXRlcyA9IGV4cGVjdGVkQ29udmVyc2lvbi5nZXRCeXRlcyhVVEZfOCk7CisJCWJ5dGVbXSBpbnB1dEJ5dGVzID0gaW5wdXQuZ2V0Qnl0ZXMoQ0hBUlNFVCk7CisJCWJ5dGVbXSBleHBlY3RlZENvbnZlcnNpb25CeXRlcyA9IGV4cGVjdGVkQ29udmVyc2lvbi5nZXRCeXRlcyhDSEFSU0VUKTsKIAogCQkvLyB0ZXN0IHVzaW5nIGlucHV0IHRleHQgYW5kIGFzc3VtaW5nIGl0IHdhcyBkZWNsYXJlZCBURVhUCiAJCXRyeSAoSW5wdXRTdHJlYW0gaW4gPSBFb2xTdHJlYW1UeXBlVXRpbC53cmFwSW5wdXRTdHJlYW0oCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0ZldGNoQ29tbWFuZFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvRmV0Y2hDb21tYW5kVGVzdC5qYXZhCmluZGV4IDUzMGZiMWIuLmFkYzRkOTggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvRmV0Y2hDb21tYW5kVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvRmV0Y2hDb21tYW5kVGVzdC5qYXZhCkBAIC00MywxMiArNDMsMTcgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5hcGk7CiAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogCitpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LkpHaXRUZXN0VXRpbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LlJlcG9zaXRvcnlUZXN0Q2FzZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWQ7CkBAIC0xMDUsNiArMTEwLDI1IEBAIHB1YmxpYyB2b2lkIHRlc3RGZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewogCX0KIAogCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEZvcmNlZEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJlbW90ZUdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJjb21taXQiKS5jYWxsKCk7CisJCXJlbW90ZUdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJjb21taXQyIikuY2FsbCgpOworCQlnaXQuZmV0Y2goKS5zZXRSZW1vdGUoInRlc3QiKQorCQkJCS5zZXRSZWZTcGVjcygicmVmcy9oZWFkcy9tYXN0ZXI6cmVmcy9oZWFkcy9tYXN0ZXIiKS5jYWxsKCk7CisKKwkJcmVtb3RlR2l0LmNvbW1pdCgpLnNldEFtZW5kKHRydWUpLnNldE1lc3NhZ2UoImFtZW5kZWQiKS5jYWxsKCk7CisJCUZldGNoUmVzdWx0IHJlcyA9IGdpdC5mZXRjaCgpLnNldFJlbW90ZSgidGVzdCIpCisJCQkJLnNldFJlZlNwZWNzKCJyZWZzL2hlYWRzL21hc3RlcjpyZWZzL2hlYWRzL21hc3RlciIpLmNhbGwoKTsKKwkJYXNzZXJ0RXF1YWxzKFJlZlVwZGF0ZS5SZXN1bHQuUkVKRUNURUQsCisJCQkJcmVzLmdldFRyYWNraW5nUmVmVXBkYXRlKCJyZWZzL2hlYWRzL21hc3RlciIpLmdldFJlc3VsdCgpKTsKKwkJcmVzID0gZ2l0LmZldGNoKCkuc2V0UmVtb3RlKCJ0ZXN0IikKKwkJCQkuc2V0UmVmU3BlY3MoInJlZnMvaGVhZHMvbWFzdGVyOnJlZnMvaGVhZHMvbWFzdGVyIikKKwkJCQkuc2V0Rm9yY2VVcGRhdGUodHJ1ZSkuY2FsbCgpOworCQlhc3NlcnRFcXVhbHMoUmVmVXBkYXRlLlJlc3VsdC5GT1JDRUQsCisJCQkJcmVzLmdldFRyYWNraW5nUmVmVXBkYXRlKCJyZWZzL2hlYWRzL21hc3RlciIpLmdldFJlc3VsdCgpKTsKKwl9CisKKwlAVGVzdAogCXB1YmxpYyB2b2lkIGZldGNoQWRkc0JyYW5jaGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWZpbmFsIFN0cmluZyBicmFuY2gxID0gImIxIjsKIAkJZmluYWwgU3RyaW5nIGJyYW5jaDIgPSAiYjIiOwpAQCAtMjc1LDYgKzI5OSw0NSBAQCBwdWJsaWMgdm9pZCBmZXRjaFdpdGhFeHBsaWNpdFRhZ3NTaG91bGRVcGRhdGVMb2NhbCgpIHRocm93cyBFeGNlcHRpb24gewogCX0KIAogCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEZldGNoV2l0aFBydW5lU2hvdWxkS2VlcE9yaWdpbkhlYWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gQ3JlYXRlIGEgY29tbWl0IGluIHRoZSB0ZXN0IHJlcG8uCisJCWNvbW1pdEZpbGUoImZvbyIsICJmb28iLCAibWFzdGVyIik7CisJCS8vIFByb2R1Y2UgYSByZWFsIGNsb25lIG9mIHRoZSBnaXQgcmVwbworCQlHaXQgY2xvbmVkID0gR2l0LmNsb25lUmVwb3NpdG9yeSgpCisJCQkJLnNldERpcmVjdG9yeShjcmVhdGVUZW1wRGlyZWN0b3J5KCJ0ZXN0Q2xvbmVSZXBvc2l0b3J5IikpCisJCQkJLnNldFVSSSgiZmlsZTovLyIKKwkJCQkJCSsgZ2l0LmdldFJlcG9zaXRvcnkoKS5nZXRXb3JrVHJlZSgpLmdldEFic29sdXRlUGF0aCgpKQorCQkJCS5jYWxsKCk7CisJCWFzc2VydE5vdE51bGwoY2xvbmVkKTsKKwkJUmVwb3NpdG9yeSBjbG9uZWRSZXBvID0gY2xvbmVkLmdldFJlcG9zaXRvcnkoKTsKKwkJYWRkUmVwb1RvQ2xvc2UoY2xvbmVkUmVwbyk7CisJCU9iamVjdElkIG9yaWdpbk1hc3RlcklkID0gY2xvbmVkUmVwbworCQkJCS5yZXNvbHZlKCJyZWZzL3JlbW90ZXMvb3JpZ2luL21hc3RlciIpOworCQlhc3NlcnROb3ROdWxsKCJTaG91bGQgaGF2ZSBvcmlnaW4vbWFzdGVyIiwgb3JpZ2luTWFzdGVySWQpOworCQlhc3NlcnROb3RFcXVhbHMoIm9yaWdpbi9tYXN0ZXIgc2hvdWxkIG5vdCBiZSB6ZXJvIElEIiwKKwkJCQlPYmplY3RJZC56ZXJvSWQoKSwgb3JpZ2luTWFzdGVySWQpOworCQkvLyBDYW5vbmljYWwgZ2l0IGNyZWF0ZXMgb3JpZ2luL0hFQUQ7IEpHaXQgKGZvciBub3cpIGRvZXNuJ3QuIExldCdzCisJCS8vIHByZXRlbmQgd2UgZGlkIHRoZSBjbG9uZSB2aWEgY29tbWFuZC1saW5lIGdpdC4KKwkJT2JqZWN0SWQgb3JpZ2luSGVhZElkID0gY2xvbmVkUmVwby5yZXNvbHZlKCJyZWZzL3JlbW90ZXMvb3JpZ2luL0hFQUQiKTsKKwkJaWYgKG9yaWdpbkhlYWRJZCA9PSBudWxsKSB7CisJCQlKR2l0VGVzdFV0aWwud3JpdGUoCisJCQkJCW5ldyBGaWxlKGNsb25lZFJlcG8uZ2V0RGlyZWN0b3J5KCksCisJCQkJCQkJInJlZnMvcmVtb3Rlcy9vcmlnaW4vSEVBRCIpLAorCQkJCQkicmVmOiByZWZzL3JlbW90ZXMvb3JpZ2luL21hc3RlclxuIik7CisJCQlvcmlnaW5IZWFkSWQgPSBjbG9uZWRSZXBvLnJlc29sdmUoInJlZnMvcmVtb3Rlcy9vcmlnaW4vSEVBRCIpOworCQl9CisJCWFzc2VydEVxdWFscygiU2hvdWxkIGhhdmUgb3JpZ2luL0hFQUQiLCBvcmlnaW5NYXN0ZXJJZCwgb3JpZ2luSGVhZElkKTsKKwkJRmV0Y2hSZXN1bHQgcmVzdWx0ID0gY2xvbmVkLmZldGNoKCkuc2V0UmVtb3RlKCJvcmlnaW4iKQorCQkJCS5zZXRSZW1vdmVEZWxldGVkUmVmcyh0cnVlKS5jYWxsKCk7CisJCWFzc2VydFRydWUoIkZldGNoIGFmdGVyIGNsb25lIHNob3VsZCBiZSB1cC10by1kYXRlIiwKKwkJCQlyZXN1bHQuZ2V0VHJhY2tpbmdSZWZVcGRhdGVzKCkuaXNFbXB0eSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJvcmlnaW4vbWFzdGVyIHNob3VsZCBzdGlsbCBleGlzdCIsIG9yaWdpbk1hc3RlcklkLAorCQkJCWNsb25lZFJlcG8ucmVzb2x2ZSgicmVmcy9yZW1vdGVzL29yaWdpbi9tYXN0ZXIiKSk7CisJCWFzc2VydEVxdWFscygib3JpZ2luL0hFQUQgc2hvdWxkIGJlIHVuY2hhbmdlZCIsIG9yaWdpbkhlYWRJZCwKKwkJCQljbG9uZWRSZXBvLnJlc29sdmUoInJlZnMvcmVtb3Rlcy9vcmlnaW4vSEVBRCIpKTsKKwl9CisKKwlAVGVzdAogCXB1YmxpYyB2b2lkIGZldGNoQWRkUmVmc1dpdGhEdXBsaWNhdGVSZWZzcGVjKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWZpbmFsIFN0cmluZyBicmFuY2hOYW1lID0gImJyYW5jaCI7CiAJCWZpbmFsIFN0cmluZyByZW1vdGVCcmFuY2hOYW1lID0gInRlc3QvIiArIGJyYW5jaE5hbWU7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0xvZ0NvbW1hbmRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0xvZ0NvbW1hbmRUZXN0LmphdmEKaW5kZXggYmQwZWZhZC4uNGVmNTExZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9Mb2dDb21tYW5kVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvTG9nQ29tbWFuZFRlc3QuamF2YQpAQCAtMTE2LDcgKzExNiw3IEBAIHB1YmxpYyB2b2lkIGxvZ0FsbENvbW1pdHNXaXRoVGFnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCUl0ZXJhdG9yPFJldkNvbW1pdD4gbG9nID0gZ2l0LmxvZygpLmFsbCgpLmNhbGwoKS5pdGVyYXRvcigpOwogCQlhc3NlcnRUcnVlKGxvZy5oYXNOZXh0KCkpOwogCQlSZXZDb21taXQgY29tbWl0ID0gbG9nLm5leHQoKTsKLQkJdGFnID0gZGIucGVlbCh0YWcpOworCQl0YWcgPSBkYi5nZXRSZWZEYXRhYmFzZSgpLnBlZWwodGFnKTsKIAogCQlhc3NlcnRFcXVhbHMoY29tbWl0LmdldE5hbWUoKSwgdGFnLmdldFBlZWxlZE9iamVjdElkKCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0VHJ1ZShjb21taXRzLmNvbnRhaW5zKGNvbW1pdCkpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9NZXJnZUNvbW1hbmRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL01lcmdlQ29tbWFuZFRlc3QuamF2YQppbmRleCA0YjIzMzQ5Li45YWYwMDNkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL01lcmdlQ29tbWFuZFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL01lcmdlQ29tbWFuZFRlc3QuamF2YQpAQCAtNTQsNiArNTQsNyBAQAogCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLk1lcmdlQ29tbWFuZC5GYXN0Rm9yd2FyZE1vZGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuTWVyZ2VSZXN1bHQuTWVyZ2VTdGF0dXM7CkBAIC0xNTg0LDI3ICsxNTg1LDMxIEBAIHB1YmxpYyB2b2lkIHRlc3RSZWN1cnNpdmVNZXJnZVdpdGhDb25mbGljdCgpIHRocm93cyBFeGNlcHRpb24gewogCQlhc3NlcnRFcXVhbHMoTWVyZ2VTdGF0dXMuQ09ORkxJQ1RJTkcsIHJlc3VsdC5nZXRNZXJnZVN0YXR1cygpKTsKIAl9CiAKKwlwcml2YXRlIFJlZiBwcmVwYXJlU3VjY2Vzc2Z1bE1lcmdlKEdpdCBnaXQpIHRocm93cyBFeGNlcHRpb24geworCQl3cml0ZVRyYXNoRmlsZSgiYSIsICIxXG5hXG4zXG4iKTsKKwkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJhIikuY2FsbCgpOworCQlSZXZDb21taXQgaW5pdGlhbENvbW1pdCA9IGdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJpbml0aWFsIikuY2FsbCgpOworCisJCWNyZWF0ZUJyYW5jaChpbml0aWFsQ29tbWl0LCAicmVmcy9oZWFkcy9zaWRlIik7CisJCWNoZWNrb3V0QnJhbmNoKCJyZWZzL2hlYWRzL3NpZGUiKTsKKworCQl3cml0ZVRyYXNoRmlsZSgiYiIsICIxXG5iXG4zXG4iKTsKKwkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJiIikuY2FsbCgpOworCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgic2lkZSIpLmNhbGwoKTsKKworCQljaGVja291dEJyYW5jaCgicmVmcy9oZWFkcy9tYXN0ZXIiKTsKKworCQl3cml0ZVRyYXNoRmlsZSgiYyIsICIxXG5jXG4zXG4iKTsKKwkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJjIikuY2FsbCgpOworCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgibWFpbiIpLmNhbGwoKTsKKworCQlyZXR1cm4gZGIuZXhhY3RSZWYoInJlZnMvaGVhZHMvc2lkZSIpOworCX0KKwogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdE1lcmdlV2l0aE1lc3NhZ2VPcHRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJdHJ5IChHaXQgZ2l0ID0gbmV3IEdpdChkYikpIHsKLQkJCXdyaXRlVHJhc2hGaWxlKCJhIiwgIjFcbmFcbjNcbiIpOwotCQkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJhIikuY2FsbCgpOwotCQkJUmV2Q29tbWl0IGluaXRpYWxDb21taXQgPSBnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiaW5pdGlhbCIpLmNhbGwoKTsKLQotCQkJY3JlYXRlQnJhbmNoKGluaXRpYWxDb21taXQsICJyZWZzL2hlYWRzL3NpZGUiKTsKLQkJCWNoZWNrb3V0QnJhbmNoKCJyZWZzL2hlYWRzL3NpZGUiKTsKLQotCQkJd3JpdGVUcmFzaEZpbGUoImIiLCAiMVxuYlxuM1xuIik7Ci0JCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oImIiKS5jYWxsKCk7Ci0JCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgic2lkZSIpLmNhbGwoKTsKLQotCQkJY2hlY2tvdXRCcmFuY2goInJlZnMvaGVhZHMvbWFzdGVyIik7Ci0KLQkJCXdyaXRlVHJhc2hGaWxlKCJjIiwgIjFcbmNcbjNcbiIpOwotCQkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJjIikuY2FsbCgpOwotCQkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoIm1haW4iKS5jYWxsKCk7Ci0KLQkJCVJlZiBzaWRlQnJhbmNoID0gZGIuZXhhY3RSZWYoInJlZnMvaGVhZHMvc2lkZSIpOworCQkJUmVmIHNpZGVCcmFuY2ggPSBwcmVwYXJlU3VjY2Vzc2Z1bE1lcmdlKGdpdCk7CiAKIAkJCWdpdC5tZXJnZSgpLmluY2x1ZGUoc2lkZUJyYW5jaCkuc2V0U3RyYXRlZ3koTWVyZ2VTdHJhdGVneS5SRVNPTFZFKQogCQkJCQkuc2V0TWVzc2FnZSgidXNlciBtZXNzYWdlIikuY2FsbCgpOwpAQCAtMTYxOCw2ICsxNjIzLDQzIEBAIHB1YmxpYyB2b2lkIHRlc3RNZXJnZVdpdGhNZXNzYWdlT3B0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJfQogCiAJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0TWVyZ2VXaXRoQ2hhbmdlSWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdHJ5IChHaXQgZ2l0ID0gbmV3IEdpdChkYikpIHsKKwkJCVJlZiBzaWRlQnJhbmNoID0gcHJlcGFyZVN1Y2Nlc3NmdWxNZXJnZShnaXQpOworCisJCQlnaXQubWVyZ2UoKS5pbmNsdWRlKHNpZGVCcmFuY2gpLnNldFN0cmF0ZWd5KE1lcmdlU3RyYXRlZ3kuUkVTT0xWRSkKKwkJCQkJLnNldEluc2VydENoYW5nZUlkKHRydWUpLmNhbGwoKTsKKworCQkJYXNzZXJ0TnVsbChkYi5yZWFkTWVyZ2VDb21taXRNc2coKSk7CisKKwkJCUl0ZXJhdG9yPFJldkNvbW1pdD4gaXQgPSBnaXQubG9nKCkuY2FsbCgpLml0ZXJhdG9yKCk7CisJCQlSZXZDb21taXQgbmV3SGVhZCA9IGl0Lm5leHQoKTsKKwkJCVN0cmluZyBjb21taXRNZXNzYWdlID0gbmV3SGVhZC5nZXRGdWxsTWVzc2FnZSgpOworCQkJYXNzZXJ0VHJ1ZShQYXR0ZXJuLmNvbXBpbGUoIlxuQ2hhbmdlLUlkOiBJWzAtOWEtZkEtRl17NDB9XG4iKQorCQkJCQkubWF0Y2hlcihjb21taXRNZXNzYWdlKS5maW5kKCkpOworCQl9CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0TWVyZ2VXaXRoTWVzc2FnZUFuZENoYW5nZUlkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRyeSAoR2l0IGdpdCA9IG5ldyBHaXQoZGIpKSB7CisJCQlSZWYgc2lkZUJyYW5jaCA9IHByZXBhcmVTdWNjZXNzZnVsTWVyZ2UoZ2l0KTsKKworCQkJZ2l0Lm1lcmdlKCkuaW5jbHVkZShzaWRlQnJhbmNoKS5zZXRTdHJhdGVneShNZXJnZVN0cmF0ZWd5LlJFU09MVkUpCisJCQkJCS5zZXRNZXNzYWdlKCJ1c2VyIG1lc3NhZ2UiKS5zZXRJbnNlcnRDaGFuZ2VJZCh0cnVlKS5jYWxsKCk7CisKKwkJCWFzc2VydE51bGwoZGIucmVhZE1lcmdlQ29tbWl0TXNnKCkpOworCisJCQlJdGVyYXRvcjxSZXZDb21taXQ+IGl0ID0gZ2l0LmxvZygpLmNhbGwoKS5pdGVyYXRvcigpOworCQkJUmV2Q29tbWl0IG5ld0hlYWQgPSBpdC5uZXh0KCk7CisJCQlTdHJpbmcgY29tbWl0TWVzc2FnZSA9IG5ld0hlYWQuZ2V0RnVsbE1lc3NhZ2UoKTsKKwkJCWFzc2VydFRydWUoY29tbWl0TWVzc2FnZS5zdGFydHNXaXRoKCJ1c2VyIG1lc3NhZ2VcblxuIikpOworCQkJYXNzZXJ0VHJ1ZShQYXR0ZXJuLmNvbXBpbGUoIlxuQ2hhbmdlLUlkOiBJWzAtOWEtZkEtRl17NDB9XG4iKQorCQkJCQkubWF0Y2hlcihjb21taXRNZXNzYWdlKS5maW5kKCkpOworCQl9CisJfQorCisJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0TWVyZ2VDb25mbGljdFdpdGhNZXNzYWdlT3B0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXRyeSAoR2l0IGdpdCA9IG5ldyBHaXQoZGIpKSB7CiAJCQl3cml0ZVRyYXNoRmlsZSgiYSIsICIxXG5hXG4zXG4iKTsKQEAgLTE2NTcsNyArMTY5OSw3IEBAIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gY2FuRXhlY3V0ZShHaXQgZ2l0LCBTdHJpbmcgcGF0aCkgewogCQkJCS5nZXRXb3JrVHJlZSgpLCBwYXRoKSk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgUmV2Q29tbWl0IGFkZEFsbEFuZENvbW1pdChmaW5hbCBHaXQgZ2l0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwcml2YXRlIHN0YXRpYyBSZXZDb21taXQgYWRkQWxsQW5kQ29tbWl0KEdpdCBnaXQpIHRocm93cyBFeGNlcHRpb24gewogCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oIi4iKS5jYWxsKCk7CiAJCXJldHVybiBnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgibWVzc2FnZSIpLmNhbGwoKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL05vdGVzQ29tbWFuZFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvTm90ZXNDb21tYW5kVGVzdC5qYXZhCmluZGV4IDZlMDZlOTUuLmUyMzRhYTMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvTm90ZXNDb21tYW5kVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvTm90ZXNDb21tYW5kVGVzdC5qYXZhCkBAIC00Miw3ICs0Miw3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5hcGk7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKQEAgLTg4LDcgKzg4LDcgQEAgcHVibGljIHZvaWQgdGVzdEFkZEFuZFJlbW92ZU5vdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJZ2l0Lm5vdGVzQWRkKCkuc2V0T2JqZWN0SWQoY29tbWl0Mikuc2V0TWVzc2FnZSgiZGF0YSIpLmNhbGwoKTsKIAkJTm90ZSBub3RlID0gZ2l0Lm5vdGVzU2hvdygpLnNldE9iamVjdElkKGNvbW1pdDIpLmNhbGwoKTsKIAkJU3RyaW5nIGNvbnRlbnQgPSBuZXcgU3RyaW5nKGRiLm9wZW4obm90ZS5nZXREYXRhKCkpLmdldENhY2hlZEJ5dGVzKCksCi0JCQkJVVRGXzgpOworCQkJCUNIQVJTRVQpOwogCQlhc3NlcnRFcXVhbHMoY29udGVudCwgImRhdGEiKTsKIAogCQlnaXQubm90ZXNSZW1vdmUoKS5zZXRPYmplY3RJZChjb21taXQyKS5jYWxsKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1B1bGxDb21tYW5kVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9QdWxsQ29tbWFuZFRlc3QuamF2YQppbmRleCA5NDYxYzQyLi4wYjBlM2JmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1B1bGxDb21tYW5kVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvUHVsbENvbW1hbmRUZXN0LmphdmEKQEAgLTQyLDcgKzQyLDcgQEAKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmFwaTsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwpAQCAtNTkyLDcgKzU5Miw3IEBAIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZVRvRmlsZShGaWxlIGFjdEZpbGUsIFN0cmluZyBzdHJpbmcpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQl0cnkgKEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oYWN0RmlsZSkpIHsKLQkJCWZvcy53cml0ZShzdHJpbmcuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJCWZvcy53cml0ZShzdHJpbmcuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQl9CiAJfQogCkBAIC02MDYsNyArNjA2LDcgQEAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRGaWxlQ29udGVudHNFcXVhbChGaWxlIGFjdEZpbGUsIFN0cmluZyBzdHJpbmcpCiAJCQkJYm9zLndyaXRlKGJ1ZmZlciwgMCwgcmVhZCk7CiAJCQkJcmVhZCA9IGZpcy5yZWFkKGJ1ZmZlcik7CiAJCQl9Ci0JCQlTdHJpbmcgY29udGVudCA9IG5ldyBTdHJpbmcoYm9zLnRvQnl0ZUFycmF5KCksIFVURl84KTsKKwkJCVN0cmluZyBjb250ZW50ID0gbmV3IFN0cmluZyhib3MudG9CeXRlQXJyYXkoKSwgQ0hBUlNFVCk7CiAJCQlhc3NlcnRFcXVhbHMoc3RyaW5nLCBjb250ZW50KTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvUHVsbENvbW1hbmRXaXRoUmViYXNlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9QdWxsQ29tbWFuZFdpdGhSZWJhc2VUZXN0LmphdmEKaW5kZXggOTEzYjRhYy4uYjM0OWM2NiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9QdWxsQ29tbWFuZFdpdGhSZWJhc2VUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9QdWxsQ29tbWFuZFdpdGhSZWJhc2VUZXN0LmphdmEKQEAgLTQyLDcgKzQyLDcgQEAKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmFwaTsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwpAQCAtMzk2LDcgKzM5Niw3IEBAIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZVRvRmlsZShGaWxlIGFjdEZpbGUsIFN0cmluZyBzdHJpbmcpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQl0cnkgKEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oYWN0RmlsZSkpIHsKLQkJCWZvcy53cml0ZShzdHJpbmcuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJCWZvcy53cml0ZShzdHJpbmcuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQl9CiAJfQogCkBAIC00MTAsNyArNDEwLDcgQEAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRGaWxlQ29udGVudHNFcXVhbChGaWxlIGFjdEZpbGUsIFN0cmluZyBzdHJpbmcpCiAJCQkJYm9zLndyaXRlKGJ1ZmZlciwgMCwgcmVhZCk7CiAJCQkJcmVhZCA9IGZpcy5yZWFkKGJ1ZmZlcik7CiAJCQl9Ci0JCQlTdHJpbmcgY29udGVudCA9IG5ldyBTdHJpbmcoYm9zLnRvQnl0ZUFycmF5KCksIFVURl84KTsKKwkJCVN0cmluZyBjb250ZW50ID0gbmV3IFN0cmluZyhib3MudG9CeXRlQXJyYXkoKSwgQ0hBUlNFVCk7CiAJCQlhc3NlcnRFcXVhbHMoc3RyaW5nLCBjb250ZW50KTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvUHVzaENvbW1hbmRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1B1c2hDb21tYW5kVGVzdC5qYXZhCmluZGV4IGUwYzE0OTkuLjFhZjM3ZTIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvUHVzaENvbW1hbmRUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9QdXNoQ29tbWFuZFRlc3QuamF2YQpAQCAtMTUyLDcgKzE1Miw3IEBAIHB1YmxpYyB2b2lkIHRlc3RQcmVQdXNoSG9vaygpIHRocm93cyBKR2l0SW50ZXJuYWxFeGNlcHRpb24sIElPRXhjZXB0aW9uLAogCQl9CiAJfQogCi0JcHJpdmF0ZSBGaWxlIHdyaXRlSG9va0ZpbGUoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIFN0cmluZyBkYXRhKQorCXByaXZhdGUgRmlsZSB3cml0ZUhvb2tGaWxlKFN0cmluZyBuYW1lLCBTdHJpbmcgZGF0YSkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCUZpbGUgcGF0aCA9IG5ldyBGaWxlKGRiLmdldFdvcmtUcmVlKCkgKyAiLy5naXQvaG9va3MvIiwgbmFtZSk7CiAJCUpHaXRUZXN0VXRpbC53cml0ZShwYXRoLCBkYXRhKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvUmViYXNlQ29tbWFuZFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvUmViYXNlQ29tbWFuZFRlc3QuamF2YQppbmRleCAyYmY5MWFlLi45NmU3MDkxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1JlYmFzZUNvbW1hbmRUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9SZWJhc2VDb21tYW5kVGVzdC5qYXZhCkBAIC00Miw3ICs0Miw3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5hcGk7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIGltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5lcXVhbFRvOwogaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLm5vdDsKIGltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJBc3NlcnQuYXNzZXJ0VGhhdDsKQEAgLTE0NjQsNyArMTQ2NCw3IEBAIHB1YmxpYyB2b2lkIHRlc3RBdXRob3JTY3JpcHRDb252ZXJ0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJYXNzZXJ0RXF1YWxzKCJHSVRfQVVUSE9SX0RBVEU9J0AxMjM0NTY3ODkgLTAxMDAnIiwgbGluZXNbMl0pOwogCiAJCVBlcnNvbklkZW50IHBhcnNlZElkZW50ID0gZ2l0LnJlYmFzZSgpLnBhcnNlQXV0aG9yKAotCQkJCWNvbnZlcnRlZEF1dGhvci5nZXRCeXRlcyhVVEZfOCkpOworCQkJCWNvbnZlcnRlZEF1dGhvci5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCWFzc2VydEVxdWFscyhpZGVudC5nZXROYW1lKCksIHBhcnNlZElkZW50LmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscyhpZGVudC5nZXRFbWFpbEFkZHJlc3MoKSwgcGFyc2VkSWRlbnQuZ2V0RW1haWxBZGRyZXNzKCkpOwogCQkvLyB0aGlzIGlzIHJvdW5kZWQgdG8gdGhlIGxhc3Qgc2Vjb25kCkBAIC0xNDgxLDcgKzE0ODEsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0QXV0aG9yU2NyaXB0Q29udmVydGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWFzc2VydEVxdWFscygiR0lUX0FVVEhPUl9EQVRFPSdAMTIzNDU2Nzg5ICswOTMwJyIsIGxpbmVzWzJdKTsKIAogCQlwYXJzZWRJZGVudCA9IGdpdC5yZWJhc2UoKS5wYXJzZUF1dGhvcigKLQkJCQljb252ZXJ0ZWRBdXRob3IuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJCQljb252ZXJ0ZWRBdXRob3IuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQlhc3NlcnRFcXVhbHMoaWRlbnQuZ2V0TmFtZSgpLCBwYXJzZWRJZGVudC5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoaWRlbnQuZ2V0RW1haWxBZGRyZXNzKCksIHBhcnNlZElkZW50LmdldEVtYWlsQWRkcmVzcygpKTsKIAkJYXNzZXJ0RXF1YWxzKDEyMzQ1Njc4OTAwMEwsIHBhcnNlZElkZW50LmdldFdoZW4oKS5nZXRUaW1lKCkpOwpAQCAtMjEwNCw3ICsyMTA0LDcgQEAgcHJpdmF0ZSBpbnQgY291bnRQaWNrcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWludCBjb3VudCA9IDA7CiAJCUZpbGUgdG9kb0ZpbGUgPSBnZXRUb2RvRmlsZSgpOwogCQl0cnkgKEJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcigKLQkJCQluZXcgRmlsZUlucHV0U3RyZWFtKHRvZG9GaWxlKSwgVVRGXzgpKSkgeworCQkJCW5ldyBGaWxlSW5wdXRTdHJlYW0odG9kb0ZpbGUpLCBDSEFSU0VUKSkpIHsKIAkJCVN0cmluZyBsaW5lID0gYnIucmVhZExpbmUoKTsKIAkJCXdoaWxlIChsaW5lICE9IG51bGwpIHsKIAkJCQlpbnQgZmlyc3RCbGFuayA9IGxpbmUuaW5kZXhPZignICcpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9SZXNldENvbW1hbmRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1Jlc2V0Q29tbWFuZFRlc3QuamF2YQppbmRleCBiYTUxODgxLi44ZjU2YTkyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1Jlc2V0Q29tbWFuZFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1Jlc2V0Q29tbWFuZFRlc3QuamF2YQpAQCAtMTAwLDM5ICsxMDAsMzkgQEAgcHVibGljIHZvaWQgc2V0dXBSZXBvc2l0b3J5KCkgdGhyb3dzIElPRXhjZXB0aW9uLCBKR2l0SW50ZXJuYWxFeGNlcHRpb24sCiAJCUZpbGUgbmVzdGVkRmlsZSA9IG5ldyBGaWxlKGRpciwgImIudHh0Iik7CiAJCUZpbGVVdGlscy5jcmVhdGVOZXdGaWxlKG5lc3RlZEZpbGUpOwogCi0JCVByaW50V3JpdGVyIG5lc3RlckZpbGVXcml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIobmVzdGVkRmlsZSk7Ci0JCW5lc3RlckZpbGVXcml0ZXIucHJpbnQoImNvbnRlbnQiKTsKLQkJbmVzdGVyRmlsZVdyaXRlci5mbHVzaCgpOworCQl0cnkgKFByaW50V3JpdGVyIG5lc3RlZEZpbGVXcml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIobmVzdGVkRmlsZSkpIHsKKwkJCW5lc3RlZEZpbGVXcml0ZXIucHJpbnQoImNvbnRlbnQiKTsKKwkJCW5lc3RlZEZpbGVXcml0ZXIuZmx1c2goKTsKIAotCQkvLyBjcmVhdGUgZmlsZQotCQlpbmRleEZpbGUgPSBuZXcgRmlsZShkYi5nZXRXb3JrVHJlZSgpLCAiYS50eHQiKTsKLQkJRmlsZVV0aWxzLmNyZWF0ZU5ld0ZpbGUoaW5kZXhGaWxlKTsKLQkJUHJpbnRXcml0ZXIgd3JpdGVyID0gbmV3IFByaW50V3JpdGVyKGluZGV4RmlsZSk7Ci0JCXdyaXRlci5wcmludCgiY29udGVudCIpOwotCQl3cml0ZXIuZmx1c2goKTsKKwkJCS8vIGNyZWF0ZSBmaWxlCisJCQlpbmRleEZpbGUgPSBuZXcgRmlsZShkYi5nZXRXb3JrVHJlZSgpLCAiYS50eHQiKTsKKwkJCUZpbGVVdGlscy5jcmVhdGVOZXdGaWxlKGluZGV4RmlsZSk7CisJCQl0cnkgKFByaW50V3JpdGVyIHdyaXRlciA9IG5ldyBQcmludFdyaXRlcihpbmRleEZpbGUpKSB7CisJCQkJd3JpdGVyLnByaW50KCJjb250ZW50Iik7CisJCQkJd3JpdGVyLmZsdXNoKCk7CiAKLQkJLy8gYWRkIGZpbGUgYW5kIGNvbW1pdCBpdAotCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oImRpciIpLmFkZEZpbGVwYXR0ZXJuKCJhLnR4dCIpLmNhbGwoKTsKLQkJc2Vjb25kQ29tbWl0ID0gZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoImFkZGluZyBhLnR4dCBhbmQgZGlyL2IudHh0IikKLQkJCQkuY2FsbCgpOworCQkJCS8vIGFkZCBmaWxlIGFuZCBjb21taXQgaXQKKwkJCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oImRpciIpLmFkZEZpbGVwYXR0ZXJuKCJhLnR4dCIpLmNhbGwoKTsKKwkJCQlzZWNvbmRDb21taXQgPSBnaXQuY29tbWl0KCkKKwkJCQkJCS5zZXRNZXNzYWdlKCJhZGRpbmcgYS50eHQgYW5kIGRpci9iLnR4dCIpLmNhbGwoKTsKIAotCQlwcmVzdGFnZSA9IERpckNhY2hlLnJlYWQoZGIuZ2V0SW5kZXhGaWxlKCksIGRiLmdldEZTKCkpLmdldEVudHJ5KAotCQkJCWluZGV4RmlsZS5nZXROYW1lKCkpOworCQkJCXByZXN0YWdlID0gRGlyQ2FjaGUucmVhZChkYi5nZXRJbmRleEZpbGUoKSwgZGIuZ2V0RlMoKSkKKwkJCQkJCS5nZXRFbnRyeShpbmRleEZpbGUuZ2V0TmFtZSgpKTsKIAotCQkvLyBtb2RpZnkgZmlsZSBhbmQgYWRkIHRvIGluZGV4Ci0JCXdyaXRlci5wcmludCgibmV3IGNvbnRlbnQiKTsKLQkJd3JpdGVyLmNsb3NlKCk7Ci0JCW5lc3RlckZpbGVXcml0ZXIucHJpbnQoIm5ldyBjb250ZW50Iik7Ci0JCW5lc3RlckZpbGVXcml0ZXIuY2xvc2UoKTsKKwkJCQkvLyBtb2RpZnkgZmlsZSBhbmQgYWRkIHRvIGluZGV4CisJCQkJd3JpdGVyLnByaW50KCJuZXcgY29udGVudCIpOworCQkJfQorCQkJbmVzdGVkRmlsZVdyaXRlci5wcmludCgibmV3IGNvbnRlbnQiKTsKKwkJfQogCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oImEudHh0IikuYWRkRmlsZXBhdHRlcm4oImRpciIpLmNhbGwoKTsKIAogCQkvLyBjcmVhdGUgYSBmaWxlIG5vdCBhZGRlZCB0byB0aGUgaW5kZXgKIAkJdW50cmFja2VkRmlsZSA9IG5ldyBGaWxlKGRiLmdldFdvcmtUcmVlKCksCiAJCQkJIm5vdEFkZGVkVG9JbmRleC50eHQiKTsKIAkJRmlsZVV0aWxzLmNyZWF0ZU5ld0ZpbGUodW50cmFja2VkRmlsZSk7Ci0JCVByaW50V3JpdGVyIHdyaXRlcjIgPSBuZXcgUHJpbnRXcml0ZXIodW50cmFja2VkRmlsZSk7Ci0JCXdyaXRlcjIucHJpbnQoImNvbnRlbnQiKTsKLQkJd3JpdGVyMi5jbG9zZSgpOworCQl0cnkgKFByaW50V3JpdGVyIHdyaXRlcjIgPSBuZXcgUHJpbnRXcml0ZXIodW50cmFja2VkRmlsZSkpIHsKKwkJCXdyaXRlcjIucHJpbnQoImNvbnRlbnQiKTsKKwkJfQogCX0KIAogCUBUZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1JldmVydENvbW1hbmRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1JldmVydENvbW1hbmRUZXN0LmphdmEKaW5kZXggZWE2MzEwNC4uZDc3YzRlMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9SZXZlcnRDb21tYW5kVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvUmV2ZXJ0Q29tbWFuZFRlc3QuamF2YQpAQCAtMzc5LDcgKzM3OSw3IEBAIHB1YmxpYyB2b2lkIHRlc3RSZXZlcnRPdXJDb21taXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCX0KIAl9CiAKLQlwcml2YXRlIFJldkNvbW1pdCBwcmVwYXJlUmV2ZXJ0KGZpbmFsIEdpdCBnaXQpIHRocm93cyBFeGNlcHRpb24geworCXByaXZhdGUgUmV2Q29tbWl0IHByZXBhcmVSZXZlcnQoR2l0IGdpdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCS8vIGNyZWF0ZSwgYWRkIGFuZCBjb21taXQgZmlsZSBhCiAJCXdyaXRlVHJhc2hGaWxlKCJhIiwgImEiKTsKIAkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJhIikuY2FsbCgpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TdGFzaENyZWF0ZUNvbW1hbmRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1N0YXNoQ3JlYXRlQ29tbWFuZFRlc3QuamF2YQppbmRleCBiOWY5ZjViLi4zYjU4MmQ3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1N0YXNoQ3JlYXRlQ29tbWFuZFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1N0YXNoQ3JlYXRlQ29tbWFuZFRlc3QuamF2YQpAQCAtOTQsNyArOTQsNyBAQCBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewogCQl1bnRyYWNrZWRGaWxlID0gd3JpdGVUcmFzaEZpbGUoInVudHJhY2tlZC50eHQiLCAiY29udGVudCIpOwogCX0KIAotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZVN0YXNoZWRDb21taXQoZmluYWwgUmV2Q29tbWl0IGNvbW1pdCkKKwlwcml2YXRlIHZvaWQgdmFsaWRhdGVTdGFzaGVkQ29tbWl0KFJldkNvbW1pdCBjb21taXQpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQl2YWxpZGF0ZVN0YXNoZWRDb21taXQoY29tbWl0LCAyKTsKIAl9CkBAIC0xNDAsNyArMTQwLDcgQEAgcHJpdmF0ZSBUcmVlV2FsayBjcmVhdGVUcmVlV2FsaygpIHsKIAkJcmV0dXJuIHdhbGs7CiAJfQogCi0JcHJpdmF0ZSBMaXN0PERpZmZFbnRyeT4gZGlmZldvcmtpbmdBZ2FpbnN0SGVhZChmaW5hbCBSZXZDb21taXQgY29tbWl0KQorCXByaXZhdGUgTGlzdDxEaWZmRW50cnk+IGRpZmZXb3JraW5nQWdhaW5zdEhlYWQoUmV2Q29tbWl0IGNvbW1pdCkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXRyeSAoVHJlZVdhbGsgd2FsayA9IGNyZWF0ZVRyZWVXYWxrKCkpIHsKIAkJCXdhbGsuYWRkVHJlZShjb21taXQuZ2V0UGFyZW50KDApLmdldFRyZWUoKSk7CkBAIC0xNDksNyArMTQ5LDcgQEAgcHJpdmF0ZSBMaXN0PERpZmZFbnRyeT4gZGlmZldvcmtpbmdBZ2FpbnN0SGVhZChmaW5hbCBSZXZDb21taXQgY29tbWl0KQogCQl9CiAJfQogCi0JcHJpdmF0ZSBMaXN0PERpZmZFbnRyeT4gZGlmZkluZGV4QWdhaW5zdEhlYWQoZmluYWwgUmV2Q29tbWl0IGNvbW1pdCkKKwlwcml2YXRlIExpc3Q8RGlmZkVudHJ5PiBkaWZmSW5kZXhBZ2FpbnN0SGVhZChSZXZDb21taXQgY29tbWl0KQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJdHJ5IChUcmVlV2FsayB3YWxrID0gY3JlYXRlVHJlZVdhbGsoKSkgewogCQkJd2Fsay5hZGRUcmVlKGNvbW1pdC5nZXRQYXJlbnQoMCkuZ2V0VHJlZSgpKTsKQEAgLTE1OCw3ICsxNTgsNyBAQCBwcml2YXRlIExpc3Q8RGlmZkVudHJ5PiBkaWZmSW5kZXhBZ2FpbnN0SGVhZChmaW5hbCBSZXZDb21taXQgY29tbWl0KQogCQl9CiAJfQogCi0JcHJpdmF0ZSBMaXN0PERpZmZFbnRyeT4gZGlmZkluZGV4QWdhaW5zdFdvcmtpbmcoZmluYWwgUmV2Q29tbWl0IGNvbW1pdCkKKwlwcml2YXRlIExpc3Q8RGlmZkVudHJ5PiBkaWZmSW5kZXhBZ2FpbnN0V29ya2luZyhSZXZDb21taXQgY29tbWl0KQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJdHJ5IChUcmVlV2FsayB3YWxrID0gY3JlYXRlVHJlZVdhbGsoKSkgewogCQkJd2Fsay5hZGRUcmVlKGNvbW1pdC5nZXRQYXJlbnQoMSkuZ2V0VHJlZSgpKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvVGFnQ29tbWFuZFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvVGFnQ29tbWFuZFRlc3QuamF2YQppbmRleCA4NzA5OGI2Li5hMjIwZTc3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1RhZ0NvbW1hbmRUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9UYWdDb21tYW5kVGVzdC5qYXZhCkBAIC00Miw2ICs0Miw3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5hcGk7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLlJfVEFHUzsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKIApAQCAtNjYsMTkgKzY3LDIyIEBAIHB1YmxpYyB2b2lkIHRlc3RUYWdnaW5nT25IZWFkKCkgdGhyb3dzIEdpdEFQSUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQkJCVJldldhbGsgd2FsayA9IG5ldyBSZXZXYWxrKGRiKSkgewogCQkJUmV2Q29tbWl0IGNvbW1pdCA9IGdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJpbml0aWFsIGNvbW1pdCIpLmNhbGwoKTsKIAkJCVJlZiB0YWdSZWYgPSBnaXQudGFnKCkuc2V0TmFtZSgidGFnIikuY2FsbCgpOwotCQkJYXNzZXJ0RXF1YWxzKGNvbW1pdC5nZXRJZCgpLCBkYi5wZWVsKHRhZ1JlZikuZ2V0UGVlbGVkT2JqZWN0SWQoKSk7CisJCQlhc3NlcnRFcXVhbHMoY29tbWl0LmdldElkKCksCisJCQkJCWRiLmdldFJlZkRhdGFiYXNlKCkucGVlbCh0YWdSZWYpLmdldFBlZWxlZE9iamVjdElkKCkpOwogCQkJYXNzZXJ0RXF1YWxzKCJ0YWciLCB3YWxrLnBhcnNlVGFnKHRhZ1JlZi5nZXRPYmplY3RJZCgpKS5nZXRUYWdOYW1lKCkpOwogCQl9CiAJfQogCiAJQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0VGFnZ2luZygpIHRocm93cyBHaXRBUElFeGNlcHRpb24sIEpHaXRJbnRlcm5hbEV4Y2VwdGlvbiB7CisJcHVibGljIHZvaWQgdGVzdFRhZ2dpbmcoKQorCQkJdGhyb3dzIEdpdEFQSUV4Y2VwdGlvbiwgSkdpdEludGVybmFsRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCXRyeSAoR2l0IGdpdCA9IG5ldyBHaXQoZGIpKSB7CiAJCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiaW5pdGlhbCBjb21taXQiKS5jYWxsKCk7CiAJCQlSZXZDb21taXQgY29tbWl0ID0gZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoInNlY29uZCBjb21taXQiKS5jYWxsKCk7CiAJCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgidGhpcmQgY29tbWl0IikuY2FsbCgpOwogCQkJUmVmIHRhZ1JlZiA9IGdpdC50YWcoKS5zZXRPYmplY3RJZChjb21taXQpLnNldE5hbWUoInRhZyIpLmNhbGwoKTsKLQkJCWFzc2VydEVxdWFscyhjb21taXQuZ2V0SWQoKSwgZGIucGVlbCh0YWdSZWYpLmdldFBlZWxlZE9iamVjdElkKCkpOworCQkJYXNzZXJ0RXF1YWxzKGNvbW1pdC5nZXRJZCgpLAorCQkJCQlkYi5nZXRSZWZEYXRhYmFzZSgpLnBlZWwodGFnUmVmKS5nZXRQZWVsZWRPYmplY3RJZCgpKTsKIAkJfQogCX0KIApAQCAtMTM1LDI2ICsxMzksMzAgQEAgcHVibGljIHZvaWQgdGVzdEZhaWx1cmVPblNpZ25lZFRhZ3MoKSB0aHJvd3MgR2l0QVBJRXhjZXB0aW9uIHsKIAkJfQogCX0KIAorCXByaXZhdGUgTGlzdDxSZWY+IGdldFRhZ3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGRiLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmc0J5UHJlZml4KFJfVEFHUyk7CisJfQorCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0RGVsZXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXRyeSAoR2l0IGdpdCA9IG5ldyBHaXQoZGIpKSB7CiAJCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiaW5pdGlhbCBjb21taXQiKS5jYWxsKCk7CiAJCQlSZWYgdGFnUmVmID0gZ2l0LnRhZygpLnNldE5hbWUoInRhZyIpLmNhbGwoKTsKLQkJCWFzc2VydEVxdWFscygxLCBkYi5nZXRUYWdzKCkuc2l6ZSgpKTsKKwkJCWFzc2VydEVxdWFscygxLCBnZXRUYWdzKCkuc2l6ZSgpKTsKIAogCQkJTGlzdDxTdHJpbmc+IGRlbGV0ZWQgPSBnaXQudGFnRGVsZXRlKCkuc2V0VGFncyh0YWdSZWYuZ2V0TmFtZSgpKQogCQkJCQkuY2FsbCgpOwogCQkJYXNzZXJ0RXF1YWxzKDEsIGRlbGV0ZWQuc2l6ZSgpKTsKIAkJCWFzc2VydEVxdWFscyh0YWdSZWYuZ2V0TmFtZSgpLCBkZWxldGVkLmdldCgwKSk7Ci0JCQlhc3NlcnRFcXVhbHMoMCwgZGIuZ2V0VGFncygpLnNpemUoKSk7CisJCQlhc3NlcnRFcXVhbHMoMCwgZ2V0VGFncygpLnNpemUoKSk7CiAKIAkJCVJlZiB0YWdSZWYxID0gZ2l0LnRhZygpLnNldE5hbWUoInRhZzEiKS5jYWxsKCk7CiAJCQlSZWYgdGFnUmVmMiA9IGdpdC50YWcoKS5zZXROYW1lKCJ0YWcyIikuY2FsbCgpOwotCQkJYXNzZXJ0RXF1YWxzKDIsIGRiLmdldFRhZ3MoKS5zaXplKCkpOworCQkJYXNzZXJ0RXF1YWxzKDIsIGdldFRhZ3MoKS5zaXplKCkpOwogCQkJZGVsZXRlZCA9IGdpdC50YWdEZWxldGUoKS5zZXRUYWdzKHRhZ1JlZjEuZ2V0TmFtZSgpLCB0YWdSZWYyLmdldE5hbWUoKSkKIAkJCQkJLmNhbGwoKTsKIAkJCWFzc2VydEVxdWFscygyLCBkZWxldGVkLnNpemUoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoMCwgZGIuZ2V0VGFncygpLnNpemUoKSk7CisJCQlhc3NlcnRFcXVhbHMoMCwgZ2V0VGFncygpLnNpemUoKSk7CiAJCX0KIAl9CiAKQEAgLTE2MywxMyArMTcxLDEzIEBAIHB1YmxpYyB2b2lkIHRlc3REZWxldGVGdWxsTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewogCQl0cnkgKEdpdCBnaXQgPSBuZXcgR2l0KGRiKSkgewogCQkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoImluaXRpYWwgY29tbWl0IikuY2FsbCgpOwogCQkJUmVmIHRhZ1JlZiA9IGdpdC50YWcoKS5zZXROYW1lKCJ0YWciKS5jYWxsKCk7Ci0JCQlhc3NlcnRFcXVhbHMoMSwgZGIuZ2V0VGFncygpLnNpemUoKSk7CisJCQlhc3NlcnRFcXVhbHMoMSwgZ2V0VGFncygpLnNpemUoKSk7CiAKIAkJCUxpc3Q8U3RyaW5nPiBkZWxldGVkID0gZ2l0LnRhZ0RlbGV0ZSgpCiAJCQkJCS5zZXRUYWdzKFJlcG9zaXRvcnkuc2hvcnRlblJlZk5hbWUodGFnUmVmLmdldE5hbWUoKSkpLmNhbGwoKTsKIAkJCWFzc2VydEVxdWFscygxLCBkZWxldGVkLnNpemUoKSk7CiAJCQlhc3NlcnRFcXVhbHModGFnUmVmLmdldE5hbWUoKSwgZGVsZXRlZC5nZXQoMCkpOwotCQkJYXNzZXJ0RXF1YWxzKDAsIGRiLmdldFRhZ3MoKS5zaXplKCkpOworCQkJYXNzZXJ0RXF1YWxzKDAsIGdldFRhZ3MoKS5zaXplKCkpOwogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZGlmZi9BYnN0cmFjdERpZmZUZXN0Q2FzZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvQWJzdHJhY3REaWZmVGVzdENhc2UuamF2YQppbmRleCAwZjEzYTY4Li4zMmYzNDIxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZGlmZi9BYnN0cmFjdERpZmZUZXN0Q2FzZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9kaWZmL0Fic3RyYWN0RGlmZlRlc3RDYXNlLmphdmEKQEAgLTQzLDcgKzQzLDcgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmRpZmY7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIApAQCAtMjQwLDYgKzI0MCw2IEBAIHB1YmxpYyBzdGF0aWMgUmF3VGV4dCB0KFN0cmluZyB0ZXh0KSB7CiAJCQlyLmFwcGVuZCh0ZXh0LmNoYXJBdChpKSk7CiAJCQlyLmFwcGVuZCgnXG4nKTsKIAkJfQotCQlyZXR1cm4gbmV3IFJhd1RleHQoci50b1N0cmluZygpLmdldEJ5dGVzKFVURl84KSk7CisJCXJldHVybiBuZXcgUmF3VGV4dChyLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9kaWZmL0RpZmZGb3JtYXR0ZXJSZWZsb3dUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZGlmZi9EaWZmRm9ybWF0dGVyUmVmbG93VGVzdC5qYXZhCmluZGV4IDQ5ZTVkMWIuLjBlMzQ0ZjUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9kaWZmL0RpZmZGb3JtYXR0ZXJSZWZsb3dUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvRGlmZkZvcm1hdHRlclJlZmxvd1Rlc3QuamF2YQpAQCAtMTQ2LDcgKzE0Niw3IEBAIHB1YmxpYyB2b2lkIHRlc3ROb05ld0xpbmUyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJYXNzZXJ0Rm9ybWF0dGVkKCJaLnBhdGNoIik7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGluaXQoZmluYWwgU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJpdmF0ZSB2b2lkIGluaXQoU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWEgPSBuZXcgUmF3VGV4dChyZWFkRmlsZShuYW1lICsgIl9QcmVJbWFnZSIpKTsKIAkJYiA9IG5ldyBSYXdUZXh0KHJlYWRGaWxlKG5hbWUgKyAiX1Bvc3RJbWFnZSIpKTsKIAkJZmlsZSA9IHBhcnNlVGVzdFBhdGNoRmlsZShuYW1lICsgIi5wYXRjaCIpLmdldEZpbGVzKCkuZ2V0KDApOwpAQCAtMTU2LDEzICsxNTYsMTMgQEAgcHJpdmF0ZSB2b2lkIGFzc2VydEZvcm1hdHRlZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWFzc2VydEZvcm1hdHRlZChKR2l0VGVzdFV0aWwuZ2V0TmFtZSgpICsgIi5vdXQiKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgYXNzZXJ0Rm9ybWF0dGVkKGZpbmFsIFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByaXZhdGUgdm9pZCBhc3NlcnRGb3JtYXR0ZWQoU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZtdC5mb3JtYXQoZmlsZSwgYSwgYik7CiAJCWZpbmFsIFN0cmluZyBleHAgPSBSYXdQYXJzZVV0aWxzLmRlY29kZShyZWFkRmlsZShuYW1lKSk7CiAJCWFzc2VydEVxdWFscyhleHAsIFJhd1BhcnNlVXRpbHMuZGVjb2RlKG91dC50b0J5dGVBcnJheSgpKSk7CiAJfQogCi0JcHJpdmF0ZSBieXRlW10gcmVhZEZpbGUoZmluYWwgU3RyaW5nIHBhdGNoRmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwcml2YXRlIGJ5dGVbXSByZWFkRmlsZShTdHJpbmcgcGF0Y2hGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBJbnB1dFN0cmVhbSBpbiA9IGdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbShwYXRjaEZpbGUpOwogCQlpZiAoaW4gPT0gbnVsbCkgewogCQkJZmFpbCgiTm8gIiArIHBhdGNoRmlsZSArICIgdGVzdCB2ZWN0b3IiKTsKQEAgLTE4MCw3ICsxODAsNyBAQCBwcml2YXRlIHZvaWQgYXNzZXJ0Rm9ybWF0dGVkKGZpbmFsIFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl9CiAJfQogCi0JcHJpdmF0ZSBQYXRjaCBwYXJzZVRlc3RQYXRjaEZpbGUoZmluYWwgU3RyaW5nIHBhdGNoRmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwcml2YXRlIFBhdGNoIHBhcnNlVGVzdFBhdGNoRmlsZShTdHJpbmcgcGF0Y2hGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl0cnkgKElucHV0U3RyZWFtIGluID0gZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKHBhdGNoRmlsZSkpIHsKIAkJCWlmIChpbiA9PSBudWxsKSB7CiAJCQkJZmFpbCgiTm8gIiArIHBhdGNoRmlsZSArICIgdGVzdCB2ZWN0b3IiKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9kaWZmL1Jhd1RleHRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZGlmZi9SYXdUZXh0VGVzdC5qYXZhCmluZGV4IDZhZDU5YjkuLjU4YThiMmQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9kaWZmL1Jhd1RleHRUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvUmF3VGV4dFRlc3QuamF2YQpAQCAtNDQsNyArNDQsOCBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuZGlmZjsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEFycmF5RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOwpAQCAtNjUsNiArNjYsMTYgQEAgcHVibGljIHZvaWQgdGVzdEVtcHR5KCkgewogCX0KIAogCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEJpbmFyeSgpIHsKKwkJU3RyaW5nIGlucHV0ID0gImZvby1hXG5mXDBvLWJcbiI7CisJCWJ5dGVbXSBkYXRhID0gQ29uc3RhbnRzLmVuY29kZUFTQ0lJKGlucHV0KTsKKwkJZmluYWwgUmF3VGV4dCBhID0gbmV3IFJhd1RleHQoZGF0YSk7CisJCWFzc2VydEFycmF5RXF1YWxzKGEuY29udGVudCwgZGF0YSk7CisJCWFzc2VydEVxdWFscyhhLnNpemUoKSwgMSk7CisJCWFzc2VydEVxdWFscyhhLmdldFN0cmluZygwLCAxLCBmYWxzZSksIGlucHV0KTsKKwl9CisKKwlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHMoKSB7CiAJCWZpbmFsIFJhd1RleHQgYSA9IG5ldyBSYXdUZXh0KENvbnN0YW50cy5lbmNvZGVBU0NJSSgiZm9vLWFcbmZvby1iXG4iKSk7CiAJCWZpbmFsIFJhd1RleHQgYiA9IG5ldyBSYXdUZXh0KENvbnN0YW50cy5lbmNvZGVBU0NJSSgiZm9vLWJcbmZvby1jXG4iKSk7CkBAIC0xMzYsOCArMTQ3LDggQEAgcHVibGljIHZvaWQgdGVzdENvbXBhcmF0b3JSZWR1Y2VDb21tb25TdGFydEVuZCgpIHsKIAkJZSA9IGMucmVkdWNlQ29tbW9uU3RhcnRFbmQodCgiYWJReHkiKSwgdCgiYWJSeHkiKSwgZSk7CiAJCWFzc2VydEVxdWFscyhuZXcgRWRpdCgyLCAzLCAyLCAzKSwgZSk7CiAKLQkJUmF3VGV4dCBhID0gbmV3IFJhd1RleHQoInBcbmEgYlxuUVxuYyBkXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCVJhd1RleHQgYiA9IG5ldyBSYXdUZXh0KCJwXG5hICBiIFxuUlxuIGMgIGQgXG4iLmdldEJ5dGVzKFVURl84KSk7CisJCVJhd1RleHQgYSA9IG5ldyBSYXdUZXh0KCJwXG5hIGJcblFcbmMgZFxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCVJhd1RleHQgYiA9IG5ldyBSYXdUZXh0KCJwXG5hICBiIFxuUlxuIGMgIGQgXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJZSA9IG5ldyBFZGl0KDAsIDQsIDAsIDQpOwogCQllID0gUmF3VGV4dENvbXBhcmF0b3IuV1NfSUdOT1JFX0FMTC5yZWR1Y2VDb21tb25TdGFydEVuZChhLCBiLCBlKTsKIAkJYXNzZXJ0RXF1YWxzKG5ldyBFZGl0KDIsIDMsIDIsIDMpLCBlKTsKQEAgLTE0OSwxNCArMTYwLDE0IEBAIHB1YmxpYyB2b2lkIHRlc3RDb21wYXJhdG9yUmVkdWNlQ29tbW9uU3RhcnRFbmRfRW1wdHlMaW5lKCkgewogCQlSYXdUZXh0IGI7CiAJCUVkaXQgZTsKIAotCQlhID0gbmV3IFJhd1RleHQoIlJcbiB5XG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIgPSBuZXcgUmF3VGV4dCgiU1xuXG4geVxuIi5nZXRCeXRlcyhVVEZfOCkpOworCQlhID0gbmV3IFJhd1RleHQoIlJcbiB5XG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYiA9IG5ldyBSYXdUZXh0KCJTXG5cbiB5XG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJZSA9IG5ldyBFZGl0KDAsIDIsIDAsIDMpOwogCQllID0gUmF3VGV4dENvbXBhcmF0b3IuREVGQVVMVC5yZWR1Y2VDb21tb25TdGFydEVuZChhLCBiLCBlKTsKIAkJYXNzZXJ0RXF1YWxzKG5ldyBFZGl0KDAsIDEsIDAsIDIpLCBlKTsKIAotCQlhID0gbmV3IFJhd1RleHQoIlNcblxuIHlcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYiA9IG5ldyBSYXdUZXh0KCJSXG4geVxuIi5nZXRCeXRlcyhVVEZfOCkpOworCQlhID0gbmV3IFJhd1RleHQoIlNcblxuIHlcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliID0gbmV3IFJhd1RleHQoIlJcbiB5XG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJZSA9IG5ldyBFZGl0KDAsIDMsIDAsIDIpOwogCQllID0gUmF3VGV4dENvbXBhcmF0b3IuREVGQVVMVC5yZWR1Y2VDb21tb25TdGFydEVuZChhLCBiLCBlKTsKIAkJYXNzZXJ0RXF1YWxzKG5ldyBFZGl0KDAsIDIsIDAsIDEpLCBlKTsKQEAgLTE2Nyw4ICsxNzgsOCBAQCBwdWJsaWMgdm9pZCB0ZXN0Q29tcGFyYXRvclJlZHVjZUNvbW1vblN0YXJ0QnV0TGFzdExpbmVOb0VvbCgpIHsKIAkJUmF3VGV4dCBhOwogCQlSYXdUZXh0IGI7CiAJCUVkaXQgZTsKLQkJYSA9IG5ldyBSYXdUZXh0KCJzdGFydCIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYiA9IG5ldyBSYXdUZXh0KCJzdGFydCBvZiBsaW5lIi5nZXRCeXRlcyhVVEZfOCkpOworCQlhID0gbmV3IFJhd1RleHQoInN0YXJ0Ii5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIgPSBuZXcgUmF3VGV4dCgic3RhcnQgb2YgbGluZSIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQllID0gbmV3IEVkaXQoMCwgMSwgMCwgMSk7CiAJCWUgPSBSYXdUZXh0Q29tcGFyYXRvci5ERUZBVUxULnJlZHVjZUNvbW1vblN0YXJ0RW5kKGEsIGIsIGUpOwogCQlhc3NlcnRFcXVhbHMobmV3IEVkaXQoMCwgMSwgMCwgMSksIGUpOwpAQCAtMTc5LDggKzE5MCw4IEBAIHB1YmxpYyB2b2lkIHRlc3RDb21wYXJhdG9yUmVkdWNlQ29tbW9uU3RhcnRCdXRMYXN0TGluZU5vRW9sXzIoKSB7CiAJCVJhd1RleHQgYTsKIAkJUmF3VGV4dCBiOwogCQlFZGl0IGU7Ci0JCWEgPSBuZXcgUmF3VGV4dCgic3RhcnQiLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIgPSBuZXcgUmF3VGV4dCgic3RhcnQgb2Zcbmxhc3RsaW5lIi5nZXRCeXRlcyhVVEZfOCkpOworCQlhID0gbmV3IFJhd1RleHQoInN0YXJ0Ii5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIgPSBuZXcgUmF3VGV4dCgic3RhcnQgb2Zcbmxhc3RsaW5lIi5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCWUgPSBuZXcgRWRpdCgwLCAxLCAwLCAyKTsKIAkJZSA9IFJhd1RleHRDb21wYXJhdG9yLkRFRkFVTFQucmVkdWNlQ29tbW9uU3RhcnRFbmQoYSwgYiwgZSk7CiAJCWFzc2VydEVxdWFscyhuZXcgRWRpdCgwLCAxLCAwLCAyKSwgZSk7CkBAIC0yMzksNiArMjUwLDYgQEAgcHJpdmF0ZSBzdGF0aWMgUmF3VGV4dCB0KFN0cmluZyB0ZXh0KSB7CiAJCQlyLmFwcGVuZCh0ZXh0LmNoYXJBdChpKSk7CiAJCQlyLmFwcGVuZCgnXG4nKTsKIAkJfQotCQlyZXR1cm4gbmV3IFJhd1RleHQoci50b1N0cmluZygpLmdldEJ5dGVzKFVURl84KSk7CisJCXJldHVybiBuZXcgUmF3VGV4dChyLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9kaWZmL1NpbWlsYXJpdHlJbmRleFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9kaWZmL1NpbWlsYXJpdHlJbmRleFRlc3QuamF2YQppbmRleCBmMTY4ZTgzLi41MWE2ZjgxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZGlmZi9TaW1pbGFyaXR5SW5kZXhUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvU2ltaWxhcml0eUluZGV4VGVzdC5qYXZhCkBAIC00Myw3ICs0Myw3IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5kaWZmOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiAKQEAgLTgyLDcgKzgyLDcgQEAgcHVibGljIHZvaWQgdGVzdEluZGV4aW5nTGFyZ2VPYmplY3QoKSB0aHJvd3MgSU9FeGNlcHRpb24sCiAJCQkJKyAiQVxuIiAvLwogCQkJCSsgIkJcbiIgLy8KIAkJCQkrICJCXG4iIC8vCi0JCQkJKyAiQlxuIikuZ2V0Qnl0ZXMoVVRGXzgpOworCQkJCSsgIkJcbiIpLmdldEJ5dGVzKENIQVJTRVQpOwogCQlTaW1pbGFyaXR5SW5kZXggc2kgPSBuZXcgU2ltaWxhcml0eUluZGV4KCk7CiAJCXNpLmhhc2gobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGluKSwgaW4ubGVuZ3RoLCBmYWxzZSk7CiAJCWFzc2VydEVxdWFscygyLCBzaS5zaXplKCkpOwpAQCAtMTMwLDEyICsxMzAsMTIgQEAgcHVibGljIHZvaWQgdGVzdENvbW1vblNjb3JlTGFyZ2VPYmplY3RfU2FtZUZpbGVzX0NSX2Nhbm9uaWNhbGl6YXRpb24oKQogCQkJCSsgIkRcclxuIiAvLwogCQkJCSsgIkJcclxuIjsKIAkJU2ltaWxhcml0eUluZGV4IHNyYyA9IG5ldyBTaW1pbGFyaXR5SW5kZXgoKTsKLQkJYnl0ZVtdIGJ5dGVzMSA9IHRleHQuZ2V0Qnl0ZXMoVVRGXzgpOworCQlieXRlW10gYnl0ZXMxID0gdGV4dC5nZXRCeXRlcyhDSEFSU0VUKTsKIAkJc3JjLmhhc2gobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzMSksIGJ5dGVzMS5sZW5ndGgsIHRydWUpOwogCQlzcmMuc29ydCgpOwogCiAJCVNpbWlsYXJpdHlJbmRleCBkc3QgPSBuZXcgU2ltaWxhcml0eUluZGV4KCk7Ci0JCWJ5dGVbXSBieXRlczIgPSB0ZXh0LnJlcGxhY2UoIlxyIiwgIiIpLmdldEJ5dGVzKFVURl84KTsKKwkJYnl0ZVtdIGJ5dGVzMiA9IHRleHQucmVwbGFjZSgiXHIiLCAiIikuZ2V0Qnl0ZXMoQ0hBUlNFVCk7CiAJCWRzdC5oYXNoKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlczIpLCBieXRlczIubGVuZ3RoLCB0cnVlKTsKIAkJZHN0LnNvcnQoKTsKIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlQnVpbGRlckl0ZXJhdG9yVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlQnVpbGRlckl0ZXJhdG9yVGVzdC5qYXZhCmluZGV4IDJiMTA4ODcuLjM1OThmM2EgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZUJ1aWxkZXJJdGVyYXRvclRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVCdWlsZGVySXRlcmF0b3JUZXN0LmphdmEKQEAgLTc4LDcgKzc4LDcgQEAgcHVibGljIHZvaWQgdGVzdFBhdGhGaWx0ZXJHcm91cF9Eb2VzTm90U2tpcFRhaWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogCQlmaW5hbCBpbnQgZXhwSWR4ID0gMjsKIAkJZmluYWwgRGlyQ2FjaGVCdWlsZGVyIGIgPSBkYy5idWlsZGVyKCk7Ci0JCXRyeSAoZmluYWwgVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CisJCXRyeSAoVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CiAJCQl0dy5hZGRUcmVlKG5ldyBEaXJDYWNoZUJ1aWxkSXRlcmF0b3IoYikpOwogCQkJdHcuc2V0UmVjdXJzaXZlKHRydWUpOwogCQkJdHcuc2V0RmlsdGVyKFBhdGhGaWx0ZXJHcm91cC5jcmVhdGVGcm9tU3RyaW5ncyhDb2xsZWN0aW9ucwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlQ0dpdENvbXBhdGFiaWxpdHlUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVDR2l0Q29tcGF0YWJpbGl0eVRlc3QuamF2YQppbmRleCBkZWMxNzYyLi5jMzYyZTc0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVDR2l0Q29tcGF0YWJpbGl0eVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVDR2l0Q29tcGF0YWJpbGl0eVRlc3QuamF2YQpAQCAtNDMsNyArNDMsNyBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuZGlyY2FjaGU7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEFycmF5RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKQEAgLTk5LDcgKzk5LDcgQEAgcHVibGljIHZvaWQgdGVzdFRyZWVXYWxrX0xzRmlsZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJYXNzZXJ0RXF1YWxzKGxzLnNpemUoKSwgZGMuZ2V0RW50cnlDb3VudCgpKTsKIAkJewogCQkJZmluYWwgSXRlcmF0b3I8Q0dpdEluZGV4UmVjb3JkPiBySXRyID0gbHMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJCXRyeSAoZmluYWwgVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CisJCQl0cnkgKFRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKGRiKSkgewogCQkJCXR3LnNldFJlY3Vyc2l2ZSh0cnVlKTsKIAkJCQl0dy5hZGRUcmVlKG5ldyBEaXJDYWNoZUl0ZXJhdG9yKGRjKSk7CiAJCQkJd2hpbGUgKHJJdHIuaGFzTmV4dCgpKSB7CkBAIC0xODAsNyArMTgwLDcgQEAgcHVibGljIHZvaWQgdGVzdFJlYWRJbmRleF9EaXJDYWNoZVRyZWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJYXNzZXJ0RXF1YWxzKGNMaXN0LnNpemUoKSwgalRyZWUuZ2V0RW50cnlTcGFuKCkpOwogCiAJCWZpbmFsIEFycmF5TGlzdDxDR2l0THNUcmVlUmVjb3JkPiBzdWJ0cmVlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotCQlmb3IgKGZpbmFsIENHaXRMc1RyZWVSZWNvcmQgciA6IGNUcmVlLnZhbHVlcygpKSB7CisJCWZvciAoQ0dpdExzVHJlZVJlY29yZCByIDogY1RyZWUudmFsdWVzKCkpIHsKIAkJCWlmIChGaWxlTW9kZS5UUkVFLmVxdWFscyhyLm1vZGUpKQogCQkJCXN1YnRyZWVzLmFkZChyKTsKIAkJfQpAQCAtMjI5LDE0ICsyMjksMTQgQEAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRWM1RyZWVFbnRyeShpbnQgaW5kZXhQb3NpdGlvbiwgU3RyaW5nIHBhdGgsCiAJCWFzc2VydEVxdWFscyhpbnRlbnRUb0FkZCwgZW50cnkuaXNJbnRlbnRUb0FkZCgpKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBGaWxlIHBhdGhPZihmaW5hbCBTdHJpbmcgbmFtZSkgeworCXByaXZhdGUgc3RhdGljIEZpbGUgcGF0aE9mKFN0cmluZyBuYW1lKSB7CiAJCXJldHVybiBKR2l0VGVzdFV0aWwuZ2V0VGVzdFJlc291cmNlRmlsZShuYW1lKTsKIAl9CiAKIAlwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBDR2l0SW5kZXhSZWNvcmQ+IHJlYWRMc0ZpbGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWZpbmFsIExpbmtlZEhhc2hNYXA8U3RyaW5nLCBDR2l0SW5kZXhSZWNvcmQ+IHIgPSBuZXcgTGlua2VkSGFzaE1hcDw+KCk7CiAJCXRyeSAoQnVmZmVyZWRSZWFkZXIgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKAotCQkJCW5ldyBGaWxlSW5wdXRTdHJlYW0ocGF0aE9mKCJnaXRnaXQubHNmaWxlcyIpKSwgVVRGXzgpKSkgeworCQkJCW5ldyBGaWxlSW5wdXRTdHJlYW0ocGF0aE9mKCJnaXRnaXQubHNmaWxlcyIpKSwgQ0hBUlNFVCkpKSB7CiAJCQlTdHJpbmcgbGluZTsKIAkJCXdoaWxlICgobGluZSA9IGJyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKIAkJCQlmaW5hbCBDR2l0SW5kZXhSZWNvcmQgY3IgPSBuZXcgQ0dpdEluZGV4UmVjb3JkKGxpbmUpOwpAQCAtMjQ5LDcgKzI0OSw3IEBAIHByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIENHaXRJbmRleFJlY29yZD4gcmVhZExzRmlsZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAlwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBDR2l0THNUcmVlUmVjb3JkPiByZWFkTHNUcmVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWZpbmFsIExpbmtlZEhhc2hNYXA8U3RyaW5nLCBDR2l0THNUcmVlUmVjb3JkPiByID0gbmV3IExpbmtlZEhhc2hNYXA8PigpOwogCQl0cnkgKEJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcigKLQkJCQluZXcgRmlsZUlucHV0U3RyZWFtKHBhdGhPZigiZ2l0Z2l0LmxzdHJlZSIpKSwgVVRGXzgpKSkgeworCQkJCW5ldyBGaWxlSW5wdXRTdHJlYW0ocGF0aE9mKCJnaXRnaXQubHN0cmVlIikpLCBDSEFSU0VUKSkpIHsKIAkJCVN0cmluZyBsaW5lOwogCQkJd2hpbGUgKChsaW5lID0gYnIucmVhZExpbmUoKSkgIT0gbnVsbCkgewogCQkJCWZpbmFsIENHaXRMc1RyZWVSZWNvcmQgY3IgPSBuZXcgQ0dpdExzVHJlZVJlY29yZChsaW5lKTsKQEAgLTI2OCw3ICsyNjgsNyBAQCBwcml2YXRlIHN0YXRpYyBjbGFzcyBDR2l0SW5kZXhSZWNvcmQgewogCiAJCWZpbmFsIFN0cmluZyBwYXRoOwogCi0JCUNHaXRJbmRleFJlY29yZChmaW5hbCBTdHJpbmcgbGluZSkgeworCQlDR2l0SW5kZXhSZWNvcmQoU3RyaW5nIGxpbmUpIHsKIAkJCWZpbmFsIGludCB0YWIgPSBsaW5lLmluZGV4T2YoJ1x0Jyk7CiAJCQlmaW5hbCBpbnQgc3AxID0gbGluZS5pbmRleE9mKCcgJyk7CiAJCQlmaW5hbCBpbnQgc3AyID0gbGluZS5pbmRleE9mKCcgJywgc3AxICsgMSk7CkBAIC0yODYsNyArMjg2LDcgQEAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ0dpdExzVHJlZVJlY29yZCB7CiAKIAkJZmluYWwgU3RyaW5nIHBhdGg7CiAKLQkJQ0dpdExzVHJlZVJlY29yZChmaW5hbCBTdHJpbmcgbGluZSkgeworCQlDR2l0THNUcmVlUmVjb3JkKFN0cmluZyBsaW5lKSB7CiAJCQlmaW5hbCBpbnQgdGFiID0gbGluZS5pbmRleE9mKCdcdCcpOwogCQkJZmluYWwgaW50IHNwMSA9IGxpbmUuaW5kZXhPZignICcpOwogCQkJZmluYWwgaW50IHNwMiA9IGxpbmUuaW5kZXhPZignICcsIHNwMSArIDEpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlRW50cnlUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVFbnRyeVRlc3QuamF2YQppbmRleCAwNWZhMDA3Li44NmUyODUyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVFbnRyeVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVFbnRyeVRlc3QuamF2YQpAQCAtMTgzLDcgKzE4Myw3IEBAIHB1YmxpYyB2b2lkIHRlc3RDb3B5TWV0YURhdGFXaXRob3V0U3RhZ2UoKSB7CiAJCWNvcHlNZXRhRGF0YUhlbHBlcih0cnVlKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNvcHlNZXRhRGF0YUhlbHBlcihmaW5hbCBib29sZWFuIGtlZXBTdGFnZSkgeworCXByaXZhdGUgc3RhdGljIHZvaWQgY29weU1ldGFEYXRhSGVscGVyKGJvb2xlYW4ga2VlcFN0YWdlKSB7CiAJCURpckNhY2hlRW50cnkgZSA9IG5ldyBEaXJDYWNoZUVudHJ5KCJzb21lL3BhdGgiLCBEaXJDYWNoZUVudHJ5LlNUQUdFXzIpOwogCQllLnNldEFzc3VtZVZhbGlkKGZhbHNlKTsKIAkJZS5zZXRDcmVhdGlvblRpbWUoMkwpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlSXRlcmF0b3JUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVJdGVyYXRvclRlc3QuamF2YQppbmRleCBkZDI0MmU1Li44MjU2NWZjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVJdGVyYXRvclRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVJdGVyYXRvclRlc3QuamF2YQpAQCAtNzYsNyArNzYsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlUcmVlX1dpdGhUcmVlV2FsaygpIHRocm93cyBFeGNlcHRpb24gewogCQlmaW5hbCBEaXJDYWNoZSBkYyA9IERpckNhY2hlLm5ld0luQ29yZSgpOwogCQlhc3NlcnRFcXVhbHMoMCwgZGMuZ2V0RW50cnlDb3VudCgpKTsKIAotCQl0cnkgKGZpbmFsIFRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKGRiKSkgeworCQl0cnkgKFRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKGRiKSkgewogCQkJdHcuYWRkVHJlZShuZXcgRGlyQ2FjaGVJdGVyYXRvcihkYykpOwogCQkJYXNzZXJ0RmFsc2UodHcubmV4dCgpKTsKIAkJfQpAQCAtMTI2LDcgKzEyNiw3IEBAIHB1YmxpYyB2b2lkIHRlc3ROb1N1YnRyZWVfV2l0aFRyZWVXYWxrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWIuZmluaXNoKCk7CiAKIAkJZmluYWwgRGlyQ2FjaGVJdGVyYXRvciBpID0gbmV3IERpckNhY2hlSXRlcmF0b3IoZGMpOwotCQl0cnkgKGZpbmFsIFRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKGRiKSkgeworCQl0cnkgKFRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKGRiKSkgewogCQkJdHcuYWRkVHJlZShpKTsKIAkJCWludCBwYXRoSWR4ID0gMDsKIAkJCXdoaWxlICh0dy5uZXh0KCkpIHsKQEAgLTE2NCw3ICsxNjQsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlU3VidHJlZV9Ob1JlY3Vyc2lvbigpIHRocm93cyBFeGNlcHRpb24gewogCQlmaW5hbCBpbnQgZXhwUG9zW10gPSB7IDAsIC0xLCA0IH07CiAKIAkJZmluYWwgRGlyQ2FjaGVJdGVyYXRvciBpID0gbmV3IERpckNhY2hlSXRlcmF0b3IoZGMpOwotCQl0cnkgKGZpbmFsIFRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKGRiKSkgeworCQl0cnkgKFRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKGRiKSkgewogCQkJdHcuYWRkVHJlZShpKTsKIAkJCXR3LnNldFJlY3Vyc2l2ZShmYWxzZSk7CiAJCQlpbnQgcGF0aElkeCA9IDA7CkBAIC0yMDUsNyArMjA1LDcgQEAgcHVibGljIHZvaWQgdGVzdFNpbmdsZVN1YnRyZWVfUmVjdXJzaXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWIuZmluaXNoKCk7CiAKIAkJZmluYWwgRGlyQ2FjaGVJdGVyYXRvciBpID0gbmV3IERpckNhY2hlSXRlcmF0b3IoZGMpOwotCQl0cnkgKGZpbmFsIFRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKGRiKSkgeworCQl0cnkgKFRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKGRiKSkgewogCQkJdHcuYWRkVHJlZShpKTsKIAkJCXR3LnNldFJlY3Vyc2l2ZSh0cnVlKTsKIAkJCWludCBwYXRoSWR4ID0gMDsKQEAgLTI0MCw3ICsyNDAsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0VHdvTGV2ZWxTdWJ0cmVlX1JlY3Vyc2l2ZSgpIHRocm93cyBFeGNlcHRpb24gewogCQkJYi5hZGQoZW50c1tpXSk7CiAJCWIuZmluaXNoKCk7CiAKLQkJdHJ5IChmaW5hbCBUcmVlV2FsayB0dyA9IG5ldyBUcmVlV2FsayhkYikpIHsKKwkJdHJ5IChUcmVlV2FsayB0dyA9IG5ldyBUcmVlV2FsayhkYikpIHsKIAkJCXR3LmFkZFRyZWUobmV3IERpckNhY2hlSXRlcmF0b3IoZGMpKTsKIAkJCXR3LnNldFJlY3Vyc2l2ZSh0cnVlKTsKIAkJCWludCBwYXRoSWR4ID0gMDsKQEAgLTQwMiw3ICs0MDIsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0VHdvTGV2ZWxTdWJ0cmVlX0ZpbHRlclBhdGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCWIuYWRkKGVudHNbaV0pOwogCQliLmZpbmlzaCgpOwogCi0JCXRyeSAoZmluYWwgVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CisJCXRyeSAoVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CiAJCQlmb3IgKGludCB2aWN0aW1JZHggPSAwOyB2aWN0aW1JZHggPCBwYXRocy5sZW5ndGg7IHZpY3RpbUlkeCsrKSB7CiAJCQkJdHcucmVzZXQoKTsKIAkJCQl0dy5hZGRUcmVlKG5ldyBEaXJDYWNoZUl0ZXJhdG9yKGRjKSk7CkBAIC00MzAsNyArNDMwLDcgQEAgcHVibGljIHZvaWQgdGVzdFJlbW92ZWRTdWJ0cmVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWZpbmFsIERpckNhY2hlIGRjID0gRGlyQ2FjaGUucmVhZChwYXRoLCBGUy5ERVRFQ1RFRCk7CiAJCWFzc2VydEVxdWFscygyLCBkYy5nZXRFbnRyeUNvdW50KCkpOwogCi0JCXRyeSAoZmluYWwgVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CisJCXRyeSAoVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CiAJCQl0dy5zZXRSZWN1cnNpdmUodHJ1ZSk7CiAJCQl0dy5hZGRUcmVlKG5ldyBEaXJDYWNoZUl0ZXJhdG9yKGRjKSk7CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZUxhcmdlUGF0aFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZUxhcmdlUGF0aFRlc3QuamF2YQppbmRleCBlZjNlNjExLi5kZmMxMzZjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVMYXJnZVBhdGhUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlTGFyZ2VQYXRoVGVzdC5qYXZhCkBAIC04MSw3ICs4MSw3IEBAIHB1YmxpYyB2b2lkIHRlc3RQYXRoXzE2Mzg0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXRlc3RMb25nUGF0aCgxNjM4NCk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHRlc3RMb25nUGF0aChmaW5hbCBpbnQgbGVuKSB0aHJvd3MgQ29ycnVwdE9iamVjdEV4Y2VwdGlvbiwKKwlwcml2YXRlIHZvaWQgdGVzdExvbmdQYXRoKGludCBsZW4pIHRocm93cyBDb3JydXB0T2JqZWN0RXhjZXB0aW9uLAogCQkJSU9FeGNlcHRpb24gewogCQlmaW5hbCBTdHJpbmcgbG9uZ1BhdGggPSBtYWtlTG9uZ1BhdGgobGVuKTsKIAkJZmluYWwgU3RyaW5nIHNob3J0UGF0aCA9ICJ+fn4gc2hvcnRlci1wYXRoIjsKQEAgLTExOSw3ICsxMTksNyBAQCBwcml2YXRlIHZvaWQgdGVzdExvbmdQYXRoKGZpbmFsIGludCBsZW4pIHRocm93cyBDb3JydXB0T2JqZWN0RXhjZXB0aW9uLAogCQl9CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG1ha2VMb25nUGF0aChmaW5hbCBpbnQgbGVuKSB7CisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG1ha2VMb25nUGF0aChpbnQgbGVuKSB7CiAJCWZpbmFsIFN0cmluZ0J1aWxkZXIgciA9IG5ldyBTdHJpbmdCdWlsZGVyKGxlbik7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspCiAJCQlyLmFwcGVuZCgnYScgKyAoaSAlIDI2KSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZ2l0cmVwby9NYW5pZmVzdFBhcnNlclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9naXRyZXBvL01hbmlmZXN0UGFyc2VyVGVzdC5qYXZhCmluZGV4IGM5NjczYTYuLjY5YTQ4Y2MgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9naXRyZXBvL01hbmlmZXN0UGFyc2VyVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9naXRyZXBvL01hbmlmZXN0UGFyc2VyVGVzdC5qYXZhCkBAIC00Miw3ICs0Miw3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5naXRyZXBvOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwogCkBAIC04Miw3ICs4Miw3IEBAIHB1YmxpYyB2b2lkIHRlc3RNYW5pZmVzdFBhcnNlcigpIHRocm93cyBFeGNlcHRpb24gewogCiAJCU1hbmlmZXN0UGFyc2VyIHBhcnNlciA9IG5ldyBNYW5pZmVzdFBhcnNlcigKIAkJCQludWxsLCBudWxsLCAibWFzdGVyIiwgYmFzZVVybCwgbnVsbCwgbnVsbCk7Ci0JCXBhcnNlci5yZWFkKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh4bWxDb250ZW50LnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoVVRGXzgpKSk7CisJCXBhcnNlci5yZWFkKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh4bWxDb250ZW50LnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoQ0hBUlNFVCkpKTsKIAkJLy8gVW5maWx0ZXJlZCBwcm9qZWN0cyBzaG91bGQgaGF2ZSB0aGVtIGFsbC4KIAkJcmVzdWx0cy5jbGVhcigpOwogCQlyZXN1bHRzLmFkZCgiZm9vIik7CkBAIC0xMzYsNyArMTM2LDcgQEAgcHVibGljIHZvaWQgdGVzdE1hbmlmZXN0UGFyc2VyV2l0aE1pc3NpbmdGZXRjaE9uUmVtb3RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCQkJYmFzZVVybCwgbnVsbCwgbnVsbCk7CiAJCXRyeSB7CiAJCQlwYXJzZXIucmVhZChuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oCi0JCQkJCXhtbENvbnRlbnQudG9TdHJpbmcoKS5nZXRCeXRlcyhVVEZfOCkpKTsKKwkJCQkJeG1sQ29udGVudC50b1N0cmluZygpLmdldEJ5dGVzKENIQVJTRVQpKSk7CiAJCQlmYWlsKCJNYW5pZmVzdFBhcnNlciBkaWQgbm90IHRocm93IGV4Y2VwdGlvbiBmb3IgbWlzc2luZyBmZXRjaCIpOwogCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAJCQlhc3NlcnRUcnVlKGUuZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIFNBWEV4Y2VwdGlvbik7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZ2l0cmVwby9SZXBvQ29tbWFuZFN5bWxpbmtUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZ2l0cmVwby9SZXBvQ29tbWFuZFN5bWxpbmtUZXN0LmphdmEKaW5kZXggMzQxY2M0Zi4uNTQ4YjkwMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2dpdHJlcG8vUmVwb0NvbW1hbmRTeW1saW5rVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9naXRyZXBvL1JlcG9Db21tYW5kU3ltbGlua1Rlc3QuamF2YQpAQCAtMTE5LDQ1ICsxMTksNDcgQEAgcHVibGljIHZvaWQgdGVzdExpbmtGaWxlQmFyZSgpIHRocm93cyBFeGNlcHRpb24gewogCQkJCQkuc2V0VVJJKHJvb3RVcmkpLmNhbGwoKTsKIAkJCS8vIENsb25lIGl0CiAJCQlGaWxlIGRpcmVjdG9yeSA9IGNyZWF0ZVRlbXBEaXJlY3RvcnkoInRlc3RDb3B5RmlsZUJhcmUiKTsKLQkJCVJlcG9zaXRvcnkgbG9jYWxEYiA9IEdpdC5jbG9uZVJlcG9zaXRvcnkoKS5zZXREaXJlY3RvcnkoZGlyZWN0b3J5KQorCQkJdHJ5IChSZXBvc2l0b3J5IGxvY2FsRGIgPSBHaXQuY2xvbmVSZXBvc2l0b3J5KCkKKwkJCQkJLnNldERpcmVjdG9yeShkaXJlY3RvcnkpCiAJCQkJCS5zZXRVUkkocmVtb3RlRGIuZ2V0RGlyZWN0b3J5KCkudG9VUkkoKS50b1N0cmluZygpKS5jYWxsKCkKLQkJCQkJLmdldFJlcG9zaXRvcnkoKTsKKwkJCQkJLmdldFJlcG9zaXRvcnkoKSkgewogCi0JCQkvLyBUaGUgTGlua2VkSGVsbG8gc3ltbGluayBzaG91bGQgZXhpc3QuCi0JCQlGaWxlIGxpbmtlZGhlbGxvID0gbmV3IEZpbGUobG9jYWxEYi5nZXRXb3JrVHJlZSgpLCAiTGlua2VkSGVsbG8iKTsKLQkJCWFzc2VydFRydWUoIlRoZSBMaW5rZWRIZWxsbyBmaWxlIHNob3VsZCBleGlzdCIsCi0JCQkJCWxvY2FsRGIuZ2V0RlMoKS5leGlzdHMobGlua2VkaGVsbG8pKTsKLQkJCWFzc2VydFRydWUoIlRoZSBMaW5rZWRIZWxsbyBmaWxlIHNob3VsZCBiZSBhIHN5bWxpbmsiLAotCQkJCQlsb2NhbERiLmdldEZTKCkuaXNTeW1MaW5rKGxpbmtlZGhlbGxvKSk7Ci0JCQlhc3NlcnRFcXVhbHMoImZvby9oZWxsby50eHQiLAotCQkJCQlsb2NhbERiLmdldEZTKCkucmVhZFN5bUxpbmsobGlua2VkaGVsbG8pKTsKKwkJCQkvLyBUaGUgTGlua2VkSGVsbG8gc3ltbGluayBzaG91bGQgZXhpc3QuCisJCQkJRmlsZSBsaW5rZWRoZWxsbyA9IG5ldyBGaWxlKGxvY2FsRGIuZ2V0V29ya1RyZWUoKSwKKwkJCQkJCSJMaW5rZWRIZWxsbyIpOworCQkJCWFzc2VydFRydWUoIlRoZSBMaW5rZWRIZWxsbyBmaWxlIHNob3VsZCBleGlzdCIsCisJCQkJCQlsb2NhbERiLmdldEZTKCkuZXhpc3RzKGxpbmtlZGhlbGxvKSk7CisJCQkJYXNzZXJ0VHJ1ZSgiVGhlIExpbmtlZEhlbGxvIGZpbGUgc2hvdWxkIGJlIGEgc3ltbGluayIsCisJCQkJCQlsb2NhbERiLmdldEZTKCkuaXNTeW1MaW5rKGxpbmtlZGhlbGxvKSk7CisJCQkJYXNzZXJ0RXF1YWxzKCJmb28vaGVsbG8udHh0IiwKKwkJCQkJCWxvY2FsRGIuZ2V0RlMoKS5yZWFkU3ltTGluayhsaW5rZWRoZWxsbykpOwogCi0JCQkvLyBUaGUgZm9vL0xpbmtlZEhlbGxvIGZpbGUgc2hvdWxkIGJlIHNraXBwZWQuCi0JCQlGaWxlIGxpbmtlZGZvb2hlbGxvID0gbmV3IEZpbGUobG9jYWxEYi5nZXRXb3JrVHJlZSgpLCAiZm9vL0xpbmtlZEhlbGxvIik7Ci0JCQlhc3NlcnRGYWxzZSgiVGhlIGZvby9MaW5rZWRIZWxsbyBmaWxlIHNob3VsZCBiZSBza2lwcGVkIiwKLQkJCQkJbG9jYWxEYi5nZXRGUygpLmV4aXN0cyhsaW5rZWRmb29oZWxsbykpOworCQkJCS8vIFRoZSBmb28vTGlua2VkSGVsbG8gZmlsZSBzaG91bGQgYmUgc2tpcHBlZC4KKwkJCQlGaWxlIGxpbmtlZGZvb2hlbGxvID0gbmV3IEZpbGUobG9jYWxEYi5nZXRXb3JrVHJlZSgpLAorCQkJCQkJImZvby9MaW5rZWRIZWxsbyIpOworCQkJCWFzc2VydEZhbHNlKCJUaGUgZm9vL0xpbmtlZEhlbGxvIGZpbGUgc2hvdWxkIGJlIHNraXBwZWQiLAorCQkJCQkJbG9jYWxEYi5nZXRGUygpLmV4aXN0cyhsaW5rZWRmb29oZWxsbykpOwogCi0JCQkvLyBUaGUgc3ViZGlyL0xpbmtlZEhlbGxvIGZpbGUgc2hvdWxkIHVzZSBhIHJlbGF0aXZlIC4uLwotCQkJRmlsZSBsaW5rZWRzdWJkaXJoZWxsbyA9IG5ldyBGaWxlKGxvY2FsRGIuZ2V0V29ya1RyZWUoKSwKLQkJCQkJInN1YmRpci9MaW5rZWRIZWxsbyIpOwotCQkJYXNzZXJ0VHJ1ZSgiVGhlIHN1YmRpci9MaW5rZWRIZWxsbyBmaWxlIHNob3VsZCBleGlzdCIsCi0JCQkJCWxvY2FsRGIuZ2V0RlMoKS5leGlzdHMobGlua2Vkc3ViZGlyaGVsbG8pKTsKLQkJCWFzc2VydFRydWUoIlRoZSBzdWJkaXIvTGlua2VkSGVsbG8gZmlsZSBzaG91bGQgYmUgYSBzeW1saW5rIiwKLQkJCQkJbG9jYWxEYi5nZXRGUygpLmlzU3ltTGluayhsaW5rZWRzdWJkaXJoZWxsbykpOwotCQkJYXNzZXJ0RXF1YWxzKCIuLi9mb28vaGVsbG8udHh0IiwKLQkJCQkJbG9jYWxEYi5nZXRGUygpLnJlYWRTeW1MaW5rKGxpbmtlZHN1YmRpcmhlbGxvKSk7CisJCQkJLy8gVGhlIHN1YmRpci9MaW5rZWRIZWxsbyBmaWxlIHNob3VsZCB1c2UgYSByZWxhdGl2ZSAuLi8KKwkJCQlGaWxlIGxpbmtlZHN1YmRpcmhlbGxvID0gbmV3IEZpbGUobG9jYWxEYi5nZXRXb3JrVHJlZSgpLAorCQkJCQkJInN1YmRpci9MaW5rZWRIZWxsbyIpOworCQkJCWFzc2VydFRydWUoIlRoZSBzdWJkaXIvTGlua2VkSGVsbG8gZmlsZSBzaG91bGQgZXhpc3QiLAorCQkJCQkJbG9jYWxEYi5nZXRGUygpLmV4aXN0cyhsaW5rZWRzdWJkaXJoZWxsbykpOworCQkJCWFzc2VydFRydWUoIlRoZSBzdWJkaXIvTGlua2VkSGVsbG8gZmlsZSBzaG91bGQgYmUgYSBzeW1saW5rIiwKKwkJCQkJCWxvY2FsRGIuZ2V0RlMoKS5pc1N5bUxpbmsobGlua2Vkc3ViZGlyaGVsbG8pKTsKKwkJCQlhc3NlcnRFcXVhbHMoIi4uL2Zvby9oZWxsby50eHQiLAorCQkJCQkJbG9jYWxEYi5nZXRGUygpLnJlYWRTeW1MaW5rKGxpbmtlZHN1YmRpcmhlbGxvKSk7CiAKLQkJCS8vIFRoZSBiYXIvZm9vL0xpbmtlZEhlbGxvIGZpbGUgc2hvdWxkIHVzZSBhIHNpbmdsZSByZWxhdGl2ZSAuLi8KLQkJCUZpbGUgbGlua2VkYmFyZm9vaGVsbG8gPSBuZXcgRmlsZShsb2NhbERiLmdldFdvcmtUcmVlKCksCi0JCQkJCSJiYXIvZm9vL0xpbmtlZEhlbGxvIik7Ci0JCQlhc3NlcnRUcnVlKCJUaGUgYmFyL2Zvby9MaW5rZWRIZWxsbyBmaWxlIHNob3VsZCBleGlzdCIsCi0JCQkJCWxvY2FsRGIuZ2V0RlMoKS5leGlzdHMobGlua2VkYmFyZm9vaGVsbG8pKTsKLQkJCWFzc2VydFRydWUoIlRoZSBiYXIvZm9vL0xpbmtlZEhlbGxvIGZpbGUgc2hvdWxkIGJlIGEgc3ltbGluayIsCi0JCQkJCWxvY2FsRGIuZ2V0RlMoKS5pc1N5bUxpbmsobGlua2VkYmFyZm9vaGVsbG8pKTsKLQkJCWFzc2VydEVxdWFscygiLi4vYmF6L2hlbGxvLnR4dCIsCi0JCQkJCWxvY2FsRGIuZ2V0RlMoKS5yZWFkU3ltTGluayhsaW5rZWRiYXJmb29oZWxsbykpOwotCi0JCQlsb2NhbERiLmNsb3NlKCk7CisJCQkJLy8gVGhlIGJhci9mb28vTGlua2VkSGVsbG8gZmlsZSBzaG91bGQgdXNlIGEgc2luZ2xlIHJlbGF0aXZlIC4uLworCQkJCUZpbGUgbGlua2VkYmFyZm9vaGVsbG8gPSBuZXcgRmlsZShsb2NhbERiLmdldFdvcmtUcmVlKCksCisJCQkJCQkiYmFyL2Zvby9MaW5rZWRIZWxsbyIpOworCQkJCWFzc2VydFRydWUoIlRoZSBiYXIvZm9vL0xpbmtlZEhlbGxvIGZpbGUgc2hvdWxkIGV4aXN0IiwKKwkJCQkJCWxvY2FsRGIuZ2V0RlMoKS5leGlzdHMobGlua2VkYmFyZm9vaGVsbG8pKTsKKwkJCQlhc3NlcnRUcnVlKCJUaGUgYmFyL2Zvby9MaW5rZWRIZWxsbyBmaWxlIHNob3VsZCBiZSBhIHN5bWxpbmsiLAorCQkJCQkJbG9jYWxEYi5nZXRGUygpLmlzU3ltTGluayhsaW5rZWRiYXJmb29oZWxsbykpOworCQkJCWFzc2VydEVxdWFscygiLi4vYmF6L2hlbGxvLnR4dCIsCisJCQkJCQlsb2NhbERiLmdldEZTKCkucmVhZFN5bUxpbmsobGlua2VkYmFyZm9vaGVsbG8pKTsKKwkJCX0KIAkJfQogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9naXRyZXBvL1JlcG9Db21tYW5kVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2dpdHJlcG8vUmVwb0NvbW1hbmRUZXN0LmphdmEKaW5kZXggMjI1M2EwNC4uZGYzMWFiMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2dpdHJlcG8vUmVwb0NvbW1hbmRUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2dpdHJlcG8vUmVwb0NvbW1hbmRUZXN0LmphdmEKQEAgLTQyLDcgKzQyLDcgQEAKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmdpdHJlcG87CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKQEAgLTE2MCw3ICsxNjAsNyBAQCBwdWJsaWMgT2JqZWN0SWQgc2hhMShTdHJpbmcgdXJpLCBTdHJpbmcgcmVmbmFtZSkgdGhyb3dzIEdpdEFQSUV4Y2VwdGlvbiB7CiAJCQkJUmVmIHJlZiA9IHIuZmluZFJlZihyZWZuYW1lKTsKIAkJCQlpZiAocmVmID09IG51bGwpIHJldHVybiBudWxsOwogCi0JCQkJcmVmID0gci5wZWVsKHJlZik7CisJCQkJcmVmID0gci5nZXRSZWZEYXRhYmFzZSgpLnBlZWwocmVmKTsKIAkJCQlPYmplY3RJZCBpZCA9IHJlZi5nZXRPYmplY3RJZCgpOwogCQkJCXJldHVybiBpZDsKIAkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKQEAgLTE4NSwxMDggKzE4NSw5MyBAQCBwdWJsaWMgT2JqZWN0SWQgc2hhMShTdHJpbmcgdXJpLCBTdHJpbmcgcmVmbmFtZSkgdGhyb3dzIEdpdEFQSUV4Y2VwdGlvbiB7CiAJCX0KIAl9CiAKKwlwcml2YXRlIFJlcG9zaXRvcnkgY2xvbmVSZXBvc2l0b3J5KFJlcG9zaXRvcnkgcmVwbywgYm9vbGVhbiBiYXJlKQorCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlcG9zaXRvcnkgciA9IEdpdC5jbG9uZVJlcG9zaXRvcnkoKQorCQkJCS5zZXRVUkkocmVwby5nZXREaXJlY3RvcnkoKS50b1VSSSgpLnRvU3RyaW5nKCkpCisJCQkJLnNldERpcmVjdG9yeShjcmVhdGVVbmlxdWVUZXN0R2l0RGlyKHRydWUpKS5zZXRCYXJlKGJhcmUpLmNhbGwoKQorCQkJCS5nZXRSZXBvc2l0b3J5KCk7CisJCWlmIChiYXJlKSB7CisJCQlhc3NlcnRUcnVlKHIuaXNCYXJlKCkpOworCQl9IGVsc2UgeworCQkJYXNzZXJ0RmFsc2Uoci5pc0JhcmUoKSk7CisJCX0KKwkJcmV0dXJuIHI7CisJfQorCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCBydW5Ud2ljZUlzTk9QKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVJlcG9zaXRvcnkgY2hpbGQgPSBHaXQuY2xvbmVSZXBvc2l0b3J5KCkKLQkJCS5zZXRVUkkoZ3JvdXBBRGIuZ2V0RGlyZWN0b3J5KCkudG9VUkkoKS50b1N0cmluZygpKQotCQkJLnNldERpcmVjdG9yeShjcmVhdGVVbmlxdWVUZXN0R2l0RGlyKHRydWUpKS5zZXRCYXJlKHRydWUpLmNhbGwoKQotCQkJLmdldFJlcG9zaXRvcnkoKTsKKwkJdHJ5IChSZXBvc2l0b3J5IGNoaWxkID0gY2xvbmVSZXBvc2l0b3J5KGdyb3VwQURiLCB0cnVlKTsKKwkJCQlSZXBvc2l0b3J5IGRlc3QgPSBjbG9uZVJlcG9zaXRvcnkoZGIsIHRydWUpKSB7CisJCQlTdHJpbmdCdWlsZGVyIHhtbENvbnRlbnQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCQkJeG1sQ29udGVudC5hcHBlbmQoIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuIikKKwkJCQkJLmFwcGVuZCgiPG1hbmlmZXN0PiIpCisJCQkJCS5hcHBlbmQoIjxyZW1vdGUgbmFtZT1cInJlbW90ZTFcIiBmZXRjaD1cIi4uXCIgLz4iKQorCQkJCQkuYXBwZW5kKCI8ZGVmYXVsdCByZXZpc2lvbj1cIm1hc3RlclwiIHJlbW90ZT1cInJlbW90ZTFcIiAvPiIpCisJCQkJCS5hcHBlbmQoIjxwcm9qZWN0IHBhdGg9XCJiYXNlXCIgbmFtZT1cInBsYXRmb3JtL2Jhc2VcIiAvPiIpCisJCQkJCS5hcHBlbmQoIjwvbWFuaWZlc3Q+Iik7CisJCQlSZXBvQ29tbWFuZCBjbWQgPSBuZXcgUmVwb0NvbW1hbmQoZGVzdCk7CiAKLQkJUmVwb3NpdG9yeSBkZXN0ID0gR2l0LmNsb25lUmVwb3NpdG9yeSgpCi0JCQkuc2V0VVJJKGRiLmdldERpcmVjdG9yeSgpLnRvVVJJKCkudG9TdHJpbmcoKSkKLQkJCS5zZXREaXJlY3RvcnkoY3JlYXRlVW5pcXVlVGVzdEdpdERpcih0cnVlKSkuc2V0QmFyZSh0cnVlKS5jYWxsKCkKLQkJCS5nZXRSZXBvc2l0b3J5KCk7CisJCQlJbmRleGVkUmVwb3MgcmVwb3MgPSBuZXcgSW5kZXhlZFJlcG9zKCk7CisJCQlyZXBvcy5wdXQoInBsYXRmb3JtL2Jhc2UiLCBjaGlsZCk7CiAKLQkJYXNzZXJ0VHJ1ZShkZXN0LmlzQmFyZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjaGlsZC5pc0JhcmUoKSk7CisJCQlSZXZDb21taXQgY29tbWl0ID0gY21kCisJCQkJCS5zZXRJbnB1dFN0cmVhbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oCisJCQkJCQkJeG1sQ29udGVudC50b1N0cmluZygpLmdldEJ5dGVzKENIQVJTRVQpKSkKKwkJCQkJLnNldFJlbW90ZVJlYWRlcihyZXBvcykuc2V0VVJJKCJwbGF0Zm9ybS8iKQorCQkJCQkuc2V0VGFyZ2V0VVJJKCJwbGF0Zm9ybS9zdXBlcnByb2plY3QiKQorCQkJCQkuc2V0UmVjb3JkUmVtb3RlQnJhbmNoKHRydWUpLnNldFJlY29yZFN1Ym1vZHVsZUxhYmVscyh0cnVlKQorCQkJCQkuY2FsbCgpOwogCi0JCVN0cmluZ0J1aWxkZXIgeG1sQ29udGVudCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCXhtbENvbnRlbnQuYXBwZW5kKCI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbiIpCi0JCQkuYXBwZW5kKCI8bWFuaWZlc3Q+IikKLQkJCS5hcHBlbmQoIjxyZW1vdGUgbmFtZT1cInJlbW90ZTFcIiBmZXRjaD1cIi4uXCIgLz4iKQotCQkJLmFwcGVuZCgiPGRlZmF1bHQgcmV2aXNpb249XCJtYXN0ZXJcIiByZW1vdGU9XCJyZW1vdGUxXCIgLz4iKQotCQkJLmFwcGVuZCgiPHByb2plY3QgcGF0aD1cImJhc2VcIiBuYW1lPVwicGxhdGZvcm0vYmFzZVwiIC8+IikKLQkJCS5hcHBlbmQoIjwvbWFuaWZlc3Q+Iik7Ci0JCVJlcG9Db21tYW5kIGNtZCA9IG5ldyBSZXBvQ29tbWFuZChkZXN0KTsKLQotCQlJbmRleGVkUmVwb3MgcmVwb3MgPSBuZXcgSW5kZXhlZFJlcG9zKCk7Ci0JCXJlcG9zLnB1dCgicGxhdGZvcm0vYmFzZSIsIGNoaWxkKTsKLQotCQlSZXZDb21taXQgY29tbWl0ID0gY21kCi0JCQkuc2V0SW5wdXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKAotCQkJCXhtbENvbnRlbnQudG9TdHJpbmcoKS5nZXRCeXRlcyhVVEZfOCkpKQotCQkJLnNldFJlbW90ZVJlYWRlcihyZXBvcykKLQkJCS5zZXRVUkkoInBsYXRmb3JtLyIpCi0JCQkuc2V0VGFyZ2V0VVJJKCJwbGF0Zm9ybS9zdXBlcnByb2plY3QiKQotCQkJLnNldFJlY29yZFJlbW90ZUJyYW5jaCh0cnVlKQotCQkJLnNldFJlY29yZFN1Ym1vZHVsZUxhYmVscyh0cnVlKQotCQkJLmNhbGwoKTsKLQotCQlTdHJpbmcgZmlyc3RJZFN0ciA9IGNvbW1pdC5nZXRJZCgpLm5hbWUoKSArICI6IiArICIuZ2l0bW9kdWxlcyI7Ci0JCWNvbW1pdCA9IG5ldyBSZXBvQ29tbWFuZChkZXN0KQotCQkJLnNldElucHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgKLQkJCQl4bWxDb250ZW50LnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoVVRGXzgpKSkKLQkJCS5zZXRSZW1vdGVSZWFkZXIocmVwb3MpCi0JCQkuc2V0VVJJKCJwbGF0Zm9ybS8iKQotCQkJLnNldFRhcmdldFVSSSgicGxhdGZvcm0vc3VwZXJwcm9qZWN0IikKLQkJCS5zZXRSZWNvcmRSZW1vdGVCcmFuY2godHJ1ZSkKLQkJCS5zZXRSZWNvcmRTdWJtb2R1bGVMYWJlbHModHJ1ZSkKLQkJCS5jYWxsKCk7Ci0JCVN0cmluZyBpZFN0ciA9IGNvbW1pdC5nZXRJZCgpLm5hbWUoKSArICI6IiArICIuZ2l0bW9kdWxlcyI7Ci0JCWFzc2VydEVxdWFscyhmaXJzdElkU3RyLCBpZFN0cik7Ci0JCWNoaWxkLmNsb3NlKCk7Ci0JCWRlc3QuY2xvc2UoKTsKKwkJCVN0cmluZyBmaXJzdElkU3RyID0gY29tbWl0LmdldElkKCkubmFtZSgpICsgIjoiICsgIi5naXRtb2R1bGVzIjsKKwkJCWNvbW1pdCA9IG5ldyBSZXBvQ29tbWFuZChkZXN0KQorCQkJCQkuc2V0SW5wdXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKAorCQkJCQkJCXhtbENvbnRlbnQudG9TdHJpbmcoKS5nZXRCeXRlcyhDSEFSU0VUKSkpCisJCQkJCS5zZXRSZW1vdGVSZWFkZXIocmVwb3MpLnNldFVSSSgicGxhdGZvcm0vIikKKwkJCQkJLnNldFRhcmdldFVSSSgicGxhdGZvcm0vc3VwZXJwcm9qZWN0IikKKwkJCQkJLnNldFJlY29yZFJlbW90ZUJyYW5jaCh0cnVlKS5zZXRSZWNvcmRTdWJtb2R1bGVMYWJlbHModHJ1ZSkKKwkJCQkJLmNhbGwoKTsKKwkJCVN0cmluZyBpZFN0ciA9IGNvbW1pdC5nZXRJZCgpLm5hbWUoKSArICI6IiArICIuZ2l0bW9kdWxlcyI7CisJCQlhc3NlcnRFcXVhbHMoZmlyc3RJZFN0ciwgaWRTdHIpOworCQl9CiAJfQogCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCBhbmRyb2lkU2V0dXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUmVwb3NpdG9yeSBjaGlsZCA9IEdpdC5jbG9uZVJlcG9zaXRvcnkoKQotCQkJCS5zZXRVUkkoZ3JvdXBBRGIuZ2V0RGlyZWN0b3J5KCkudG9VUkkoKS50b1N0cmluZygpKQotCQkJCS5zZXREaXJlY3RvcnkoY3JlYXRlVW5pcXVlVGVzdEdpdERpcih0cnVlKSkuc2V0QmFyZSh0cnVlKS5jYWxsKCkKLQkJCQkuZ2V0UmVwb3NpdG9yeSgpOworCQl0cnkgKFJlcG9zaXRvcnkgY2hpbGQgPSBjbG9uZVJlcG9zaXRvcnkoZ3JvdXBBRGIsIHRydWUpOworCQkJCVJlcG9zaXRvcnkgZGVzdCA9IGNsb25lUmVwb3NpdG9yeShkYiwgdHJ1ZSkpIHsKKwkJCVN0cmluZ0J1aWxkZXIgeG1sQ29udGVudCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisJCQl4bWxDb250ZW50LmFwcGVuZCgiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG4iKQorCQkJCQkuYXBwZW5kKCI8bWFuaWZlc3Q+IikKKwkJCQkJLmFwcGVuZCgiPHJlbW90ZSBuYW1lPVwicmVtb3RlMVwiIGZldGNoPVwiLi5cIiAvPiIpCisJCQkJCS5hcHBlbmQoIjxkZWZhdWx0IHJldmlzaW9uPVwibWFzdGVyXCIgcmVtb3RlPVwicmVtb3RlMVwiIC8+IikKKwkJCQkJLmFwcGVuZCgiPHByb2plY3QgcGF0aD1cImJhc2VcIiBuYW1lPVwicGxhdGZvcm0vYmFzZVwiIC8+IikKKwkJCQkJLmFwcGVuZCgiPC9tYW5pZmVzdD4iKTsKKwkJCVJlcG9Db21tYW5kIGNtZCA9IG5ldyBSZXBvQ29tbWFuZChkZXN0KTsKIAotCQlSZXBvc2l0b3J5IGRlc3QgPSBHaXQuY2xvbmVSZXBvc2l0b3J5KCkKLQkJCQkuc2V0VVJJKGRiLmdldERpcmVjdG9yeSgpLnRvVVJJKCkudG9TdHJpbmcoKSkKLQkJCQkuc2V0RGlyZWN0b3J5KGNyZWF0ZVVuaXF1ZVRlc3RHaXREaXIodHJ1ZSkpLnNldEJhcmUodHJ1ZSkuY2FsbCgpCi0JCQkJLmdldFJlcG9zaXRvcnkoKTsKKwkJCUluZGV4ZWRSZXBvcyByZXBvcyA9IG5ldyBJbmRleGVkUmVwb3MoKTsKKwkJCXJlcG9zLnB1dCgicGxhdGZvcm0vYmFzZSIsIGNoaWxkKTsKIAotCQlhc3NlcnRUcnVlKGRlc3QuaXNCYXJlKCkpOwotCQlhc3NlcnRUcnVlKGNoaWxkLmlzQmFyZSgpKTsKKwkJCVJldkNvbW1pdCBjb21taXQgPSBjbWQKKwkJCQkJLnNldElucHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgKKwkJCQkJCQl4bWxDb250ZW50LnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoQ0hBUlNFVCkpKQorCQkJCQkuc2V0UmVtb3RlUmVhZGVyKHJlcG9zKS5zZXRVUkkoInBsYXRmb3JtLyIpCisJCQkJCS5zZXRUYXJnZXRVUkkoInBsYXRmb3JtL3N1cGVycHJvamVjdCIpCisJCQkJCS5zZXRSZWNvcmRSZW1vdGVCcmFuY2godHJ1ZSkuc2V0UmVjb3JkU3VibW9kdWxlTGFiZWxzKHRydWUpCisJCQkJCS5jYWxsKCk7CiAKLQkJU3RyaW5nQnVpbGRlciB4bWxDb250ZW50ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJeG1sQ29udGVudC5hcHBlbmQoIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuIikKLQkJCS5hcHBlbmQoIjxtYW5pZmVzdD4iKQotCQkJLmFwcGVuZCgiPHJlbW90ZSBuYW1lPVwicmVtb3RlMVwiIGZldGNoPVwiLi5cIiAvPiIpCi0JCQkuYXBwZW5kKCI8ZGVmYXVsdCByZXZpc2lvbj1cIm1hc3RlclwiIHJlbW90ZT1cInJlbW90ZTFcIiAvPiIpCi0JCQkuYXBwZW5kKCI8cHJvamVjdCBwYXRoPVwiYmFzZVwiIG5hbWU9XCJwbGF0Zm9ybS9iYXNlXCIgLz4iKQotCQkJLmFwcGVuZCgiPC9tYW5pZmVzdD4iKTsKLQkJUmVwb0NvbW1hbmQgY21kID0gbmV3IFJlcG9Db21tYW5kKGRlc3QpOworCQkJU3RyaW5nIGlkU3RyID0gY29tbWl0LmdldElkKCkubmFtZSgpICsgIjoiICsgIi5naXRtb2R1bGVzIjsKKwkJCU9iamVjdElkIG1vZElkID0gZGVzdC5yZXNvbHZlKGlkU3RyKTsKIAotCQlJbmRleGVkUmVwb3MgcmVwb3MgPSBuZXcgSW5kZXhlZFJlcG9zKCk7Ci0JCXJlcG9zLnB1dCgicGxhdGZvcm0vYmFzZSIsIGNoaWxkKTsKLQotCQlSZXZDb21taXQgY29tbWl0ID0gY21kCi0JCQkuc2V0SW5wdXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHhtbENvbnRlbnQudG9TdHJpbmcoKS5nZXRCeXRlcyhVVEZfOCkpKQotCQkJLnNldFJlbW90ZVJlYWRlcihyZXBvcykKLQkJCS5zZXRVUkkoInBsYXRmb3JtLyIpCi0JCQkuc2V0VGFyZ2V0VVJJKCJwbGF0Zm9ybS9zdXBlcnByb2plY3QiKQotCQkJLnNldFJlY29yZFJlbW90ZUJyYW5jaCh0cnVlKQotCQkJLnNldFJlY29yZFN1Ym1vZHVsZUxhYmVscyh0cnVlKQotCQkJLmNhbGwoKTsKLQotCQlTdHJpbmcgaWRTdHIgPSBjb21taXQuZ2V0SWQoKS5uYW1lKCkgKyAiOiIgKyAiLmdpdG1vZHVsZXMiOwotCQlPYmplY3RJZCBtb2RJZCA9IGRlc3QucmVzb2x2ZShpZFN0cik7Ci0KLQkJdHJ5IChPYmplY3RSZWFkZXIgcmVhZGVyID0gZGVzdC5uZXdPYmplY3RSZWFkZXIoKSkgewotCQkJYnl0ZVtdIGJ5dGVzID0gcmVhZGVyLm9wZW4obW9kSWQpLmdldENhY2hlZEJ5dGVzKEludGVnZXIuTUFYX1ZBTFVFKTsKLQkJCUNvbmZpZyBiYXNlID0gbmV3IENvbmZpZygpOwotCQkJQmxvYkJhc2VkQ29uZmlnIGNmZyA9IG5ldyBCbG9iQmFzZWRDb25maWcoYmFzZSwgYnl0ZXMpOwotCQkJU3RyaW5nIHN1YlVybCA9IGNmZy5nZXRTdHJpbmcoInN1Ym1vZHVsZSIsICJiYXNlIiwgInVybCIpOwotCQkJYXNzZXJ0RXF1YWxzKHN1YlVybCwgIi4uL2Jhc2UiKTsKKwkJCXRyeSAoT2JqZWN0UmVhZGVyIHJlYWRlciA9IGRlc3QubmV3T2JqZWN0UmVhZGVyKCkpIHsKKwkJCQlieXRlW10gYnl0ZXMgPSByZWFkZXIub3Blbihtb2RJZCkKKwkJCQkJCS5nZXRDYWNoZWRCeXRlcyhJbnRlZ2VyLk1BWF9WQUxVRSk7CisJCQkJQ29uZmlnIGJhc2UgPSBuZXcgQ29uZmlnKCk7CisJCQkJQmxvYkJhc2VkQ29uZmlnIGNmZyA9IG5ldyBCbG9iQmFzZWRDb25maWcoYmFzZSwgYnl0ZXMpOworCQkJCVN0cmluZyBzdWJVcmwgPSBjZmcuZ2V0U3RyaW5nKCJzdWJtb2R1bGUiLCAiYmFzZSIsICJ1cmwiKTsKKwkJCQlhc3NlcnRFcXVhbHMoc3ViVXJsLCAiLi4vYmFzZSIpOworCQkJfQogCQl9Ci0KLQkJY2hpbGQuY2xvc2UoKTsKLQkJZGVzdC5jbG9zZSgpOwogCX0KIAogCUBUZXN0CkBAIC0yOTksMjAwICsyODQsMTc0IEBAIHB1YmxpYyB2b2lkIHJlY29yZFVucmVhY2hhYmxlUmVtb3RlcygpIHRocm93cyBFeGNlcHRpb24gewogCQkJLmFwcGVuZCgiPHByb2plY3QgcGF0aD1cImJhc2VcIiBuYW1lPVwicGxhdGZvcm0vYmFzZVwiIC8+IikKIAkJCS5hcHBlbmQoIjwvbWFuaWZlc3Q+Iik7CiAKLQkJUmVwb3NpdG9yeSBkZXN0ID0gR2l0LmNsb25lUmVwb3NpdG9yeSgpCi0JCQkJLnNldFVSSShkYi5nZXREaXJlY3RvcnkoKS50b1VSSSgpLnRvU3RyaW5nKCkpCi0JCQkJLnNldERpcmVjdG9yeShjcmVhdGVVbmlxdWVUZXN0R2l0RGlyKHRydWUpKS5zZXRCYXJlKHRydWUpLmNhbGwoKQotCQkJCS5nZXRSZXBvc2l0b3J5KCk7CisJCXRyeSAoUmVwb3NpdG9yeSBkZXN0ID0gY2xvbmVSZXBvc2l0b3J5KGRiLCB0cnVlKSkgeworCQkJUmV2Q29tbWl0IGNvbW1pdCA9IG5ldyBSZXBvQ29tbWFuZChkZXN0KQorCQkJCQkuc2V0SW5wdXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKAorCQkJCQkJCXhtbENvbnRlbnQudG9TdHJpbmcoKS5nZXRCeXRlcyhDSEFSU0VUKSkpCisJCQkJCS5zZXRSZW1vdGVSZWFkZXIobmV3IEluZGV4ZWRSZXBvcygpKS5zZXRVUkkoInBsYXRmb3JtLyIpCisJCQkJCS5zZXRUYXJnZXRVUkkoInBsYXRmb3JtL3N1cGVycHJvamVjdCIpCisJCQkJCS5zZXRSZWNvcmRSZW1vdGVCcmFuY2godHJ1ZSkuc2V0SWdub3JlUmVtb3RlRmFpbHVyZXModHJ1ZSkKKwkJCQkJLnNldFJlY29yZFN1Ym1vZHVsZUxhYmVscyh0cnVlKS5jYWxsKCk7CiAKLQkJYXNzZXJ0VHJ1ZShkZXN0LmlzQmFyZSgpKTsKKwkJCVN0cmluZyBpZFN0ciA9IGNvbW1pdC5nZXRJZCgpLm5hbWUoKSArICI6IiArICIuZ2l0bW9kdWxlcyI7CisJCQlPYmplY3RJZCBtb2RJZCA9IGRlc3QucmVzb2x2ZShpZFN0cik7CiAKLQkJUmV2Q29tbWl0IGNvbW1pdCA9IG5ldyBSZXBvQ29tbWFuZChkZXN0KQotCQkJLnNldElucHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgKLQkJCQl4bWxDb250ZW50LnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoVVRGXzgpKSkKLQkJCS5zZXRSZW1vdGVSZWFkZXIobmV3IEluZGV4ZWRSZXBvcygpKQotCQkJLnNldFVSSSgicGxhdGZvcm0vIikKLQkJCS5zZXRUYXJnZXRVUkkoInBsYXRmb3JtL3N1cGVycHJvamVjdCIpCi0JCQkuc2V0UmVjb3JkUmVtb3RlQnJhbmNoKHRydWUpCi0JCQkuc2V0SWdub3JlUmVtb3RlRmFpbHVyZXModHJ1ZSkKLQkJCS5zZXRSZWNvcmRTdWJtb2R1bGVMYWJlbHModHJ1ZSkKLQkJCS5jYWxsKCk7Ci0KLQkJU3RyaW5nIGlkU3RyID0gY29tbWl0LmdldElkKCkubmFtZSgpICsgIjoiICsgIi5naXRtb2R1bGVzIjsKLQkJT2JqZWN0SWQgbW9kSWQgPSBkZXN0LnJlc29sdmUoaWRTdHIpOwotCi0JCXRyeSAoT2JqZWN0UmVhZGVyIHJlYWRlciA9IGRlc3QubmV3T2JqZWN0UmVhZGVyKCkpIHsKLQkJCWJ5dGVbXSBieXRlcyA9IHJlYWRlci5vcGVuKG1vZElkKS5nZXRDYWNoZWRCeXRlcyhJbnRlZ2VyLk1BWF9WQUxVRSk7Ci0JCQlDb25maWcgYmFzZSA9IG5ldyBDb25maWcoKTsKLQkJCUJsb2JCYXNlZENvbmZpZyBjZmcgPSBuZXcgQmxvYkJhc2VkQ29uZmlnKGJhc2UsIGJ5dGVzKTsKLQkJCVN0cmluZyBzdWJVcmwgPSBjZmcuZ2V0U3RyaW5nKCJzdWJtb2R1bGUiLCAiYmFzZSIsICJ1cmwiKTsKLQkJCWFzc2VydEVxdWFscyhzdWJVcmwsICJodHRwczovL2hvc3QuY29tL3BsYXRmb3JtL2Jhc2UiKTsKKwkJCXRyeSAoT2JqZWN0UmVhZGVyIHJlYWRlciA9IGRlc3QubmV3T2JqZWN0UmVhZGVyKCkpIHsKKwkJCQlieXRlW10gYnl0ZXMgPSByZWFkZXIub3Blbihtb2RJZCkKKwkJCQkJCS5nZXRDYWNoZWRCeXRlcyhJbnRlZ2VyLk1BWF9WQUxVRSk7CisJCQkJQ29uZmlnIGJhc2UgPSBuZXcgQ29uZmlnKCk7CisJCQkJQmxvYkJhc2VkQ29uZmlnIGNmZyA9IG5ldyBCbG9iQmFzZWRDb25maWcoYmFzZSwgYnl0ZXMpOworCQkJCVN0cmluZyBzdWJVcmwgPSBjZmcuZ2V0U3RyaW5nKCJzdWJtb2R1bGUiLCAiYmFzZSIsICJ1cmwiKTsKKwkJCQlhc3NlcnRFcXVhbHMoc3ViVXJsLCAiaHR0cHM6Ly9ob3N0LmNvbS9wbGF0Zm9ybS9iYXNlIik7CisJCQl9CiAJCX0KLQotCQlkZXN0LmNsb3NlKCk7CiAJfQogCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCBnZXJyaXRTZXR1cCgpIHRocm93cyBFeGNlcHRpb24gewotCQlSZXBvc2l0b3J5IGNoaWxkID0KLQkJCUdpdC5jbG9uZVJlcG9zaXRvcnkoKS5zZXRVUkkoZ3JvdXBBRGIuZ2V0RGlyZWN0b3J5KCkudG9VUkkoKS50b1N0cmluZygpKQotCQkJCS5zZXREaXJlY3RvcnkoY3JlYXRlVW5pcXVlVGVzdEdpdERpcih0cnVlKSkKLQkJCQkuc2V0QmFyZSh0cnVlKS5jYWxsKCkuZ2V0UmVwb3NpdG9yeSgpOworCQl0cnkgKFJlcG9zaXRvcnkgY2hpbGQgPSBjbG9uZVJlcG9zaXRvcnkoZ3JvdXBBRGIsIHRydWUpOworCQkJCVJlcG9zaXRvcnkgZGVzdCA9IGNsb25lUmVwb3NpdG9yeShkYiwgdHJ1ZSkpIHsKKwkJCVN0cmluZ0J1aWxkZXIgeG1sQ29udGVudCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisJCQl4bWxDb250ZW50LmFwcGVuZCgiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG4iKQorCQkJCQkuYXBwZW5kKCI8bWFuaWZlc3Q+IikKKwkJCQkJLmFwcGVuZCgiPHJlbW90ZSBuYW1lPVwicmVtb3RlMVwiIGZldGNoPVwiLlwiIC8+IikKKwkJCQkJLmFwcGVuZCgiPGRlZmF1bHQgcmV2aXNpb249XCJtYXN0ZXJcIiByZW1vdGU9XCJyZW1vdGUxXCIgLz4iKQorCQkJCQkuYXBwZW5kKCI8cHJvamVjdCBwYXRoPVwicGx1Z2lucy9jb29rYm9va1wiIG5hbWU9XCJwbHVnaW5zL2Nvb2tib29rXCIgLz4iKQorCQkJCQkuYXBwZW5kKCI8L21hbmlmZXN0PiIpOworCQkJUmVwb0NvbW1hbmQgY21kID0gbmV3IFJlcG9Db21tYW5kKGRlc3QpOwogCi0JCVJlcG9zaXRvcnkgZGVzdCA9IEdpdC5jbG9uZVJlcG9zaXRvcnkoKQotCQkJLnNldFVSSShkYi5nZXREaXJlY3RvcnkoKS50b1VSSSgpLnRvU3RyaW5nKCkpLnNldERpcmVjdG9yeShjcmVhdGVVbmlxdWVUZXN0R2l0RGlyKHRydWUpKQotCQkJLnNldEJhcmUodHJ1ZSkuY2FsbCgpLmdldFJlcG9zaXRvcnkoKTsKKwkJCUluZGV4ZWRSZXBvcyByZXBvcyA9IG5ldyBJbmRleGVkUmVwb3MoKTsKKwkJCXJlcG9zLnB1dCgicGx1Z2lucy9jb29rYm9vayIsIGNoaWxkKTsKIAotCQlhc3NlcnRUcnVlKGRlc3QuaXNCYXJlKCkpOwotCQlhc3NlcnRUcnVlKGNoaWxkLmlzQmFyZSgpKTsKKwkJCVJldkNvbW1pdCBjb21taXQgPSBjbWQKKwkJCQkJLnNldElucHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgKKwkJCQkJCQl4bWxDb250ZW50LnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoQ0hBUlNFVCkpKQorCQkJCQkuc2V0UmVtb3RlUmVhZGVyKHJlcG9zKS5zZXRVUkkoIiIpLnNldFRhcmdldFVSSSgiZ2Vycml0IikKKwkJCQkJLnNldFJlY29yZFJlbW90ZUJyYW5jaCh0cnVlKS5zZXRSZWNvcmRTdWJtb2R1bGVMYWJlbHModHJ1ZSkKKwkJCQkJLmNhbGwoKTsKIAotCQlTdHJpbmdCdWlsZGVyIHhtbENvbnRlbnQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQl4bWxDb250ZW50LmFwcGVuZCgiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG4iKQotCQkJLmFwcGVuZCgiPG1hbmlmZXN0PiIpCi0JCQkuYXBwZW5kKCI8cmVtb3RlIG5hbWU9XCJyZW1vdGUxXCIgZmV0Y2g9XCIuXCIgLz4iKQotCQkJLmFwcGVuZCgiPGRlZmF1bHQgcmV2aXNpb249XCJtYXN0ZXJcIiByZW1vdGU9XCJyZW1vdGUxXCIgLz4iKQotCQkJLmFwcGVuZCgiPHByb2plY3QgcGF0aD1cInBsdWdpbnMvY29va2Jvb2tcIiBuYW1lPVwicGx1Z2lucy9jb29rYm9va1wiIC8+IikKLQkJCS5hcHBlbmQoIjwvbWFuaWZlc3Q+Iik7Ci0JCVJlcG9Db21tYW5kIGNtZCA9IG5ldyBSZXBvQ29tbWFuZChkZXN0KTsKKwkJCVN0cmluZyBpZFN0ciA9IGNvbW1pdC5nZXRJZCgpLm5hbWUoKSArICI6IiArICIuZ2l0bW9kdWxlcyI7CisJCQlPYmplY3RJZCBtb2RJZCA9IGRlc3QucmVzb2x2ZShpZFN0cik7CiAKLQkJSW5kZXhlZFJlcG9zIHJlcG9zID0gbmV3IEluZGV4ZWRSZXBvcygpOwotCQlyZXBvcy5wdXQoInBsdWdpbnMvY29va2Jvb2siLCBjaGlsZCk7Ci0KLQkJUmV2Q29tbWl0IGNvbW1pdCA9IGNtZAotCQkJLnNldElucHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh4bWxDb250ZW50LnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoVVRGXzgpKSkKLQkJCS5zZXRSZW1vdGVSZWFkZXIocmVwb3MpCi0JCQkuc2V0VVJJKCIiKQotCQkJLnNldFRhcmdldFVSSSgiZ2Vycml0IikKLQkJCS5zZXRSZWNvcmRSZW1vdGVCcmFuY2godHJ1ZSkKLQkJCS5zZXRSZWNvcmRTdWJtb2R1bGVMYWJlbHModHJ1ZSkKLQkJCS5jYWxsKCk7Ci0KLQkJU3RyaW5nIGlkU3RyID0gY29tbWl0LmdldElkKCkubmFtZSgpICsgIjoiICsgIi5naXRtb2R1bGVzIjsKLQkJT2JqZWN0SWQgbW9kSWQgPSBkZXN0LnJlc29sdmUoaWRTdHIpOwotCi0JCXRyeSAoT2JqZWN0UmVhZGVyIHJlYWRlciA9IGRlc3QubmV3T2JqZWN0UmVhZGVyKCkpIHsKLQkJCWJ5dGVbXSBieXRlcyA9IHJlYWRlci5vcGVuKG1vZElkKS5nZXRDYWNoZWRCeXRlcyhJbnRlZ2VyLk1BWF9WQUxVRSk7Ci0JCQlDb25maWcgYmFzZSA9IG5ldyBDb25maWcoKTsKLQkJCUJsb2JCYXNlZENvbmZpZyBjZmcgPSBuZXcgQmxvYkJhc2VkQ29uZmlnKGJhc2UsIGJ5dGVzKTsKLQkJCVN0cmluZyBzdWJVcmwgPSBjZmcuZ2V0U3RyaW5nKCJzdWJtb2R1bGUiLCAicGx1Z2lucy9jb29rYm9vayIsICJ1cmwiKTsKLQkJCWFzc2VydEVxdWFscyhzdWJVcmwsICIuLi9wbHVnaW5zL2Nvb2tib29rIik7CisJCQl0cnkgKE9iamVjdFJlYWRlciByZWFkZXIgPSBkZXN0Lm5ld09iamVjdFJlYWRlcigpKSB7CisJCQkJYnl0ZVtdIGJ5dGVzID0gcmVhZGVyLm9wZW4obW9kSWQpCisJCQkJCQkuZ2V0Q2FjaGVkQnl0ZXMoSW50ZWdlci5NQVhfVkFMVUUpOworCQkJCUNvbmZpZyBiYXNlID0gbmV3IENvbmZpZygpOworCQkJCUJsb2JCYXNlZENvbmZpZyBjZmcgPSBuZXcgQmxvYkJhc2VkQ29uZmlnKGJhc2UsIGJ5dGVzKTsKKwkJCQlTdHJpbmcgc3ViVXJsID0gY2ZnLmdldFN0cmluZygic3VibW9kdWxlIiwgInBsdWdpbnMvY29va2Jvb2siLAorCQkJCQkJInVybCIpOworCQkJCWFzc2VydEVxdWFscyhzdWJVcmwsICIuLi9wbHVnaW5zL2Nvb2tib29rIik7CisJCQl9CiAJCX0KLQotCQljaGlsZC5jbG9zZSgpOwotCQlkZXN0LmNsb3NlKCk7CiAJfQogCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCBhYnNvbHV0ZVJlbW90ZVVSTCgpIHRocm93cyBFeGNlcHRpb24gewotCQlSZXBvc2l0b3J5IGNoaWxkID0KLQkJCUdpdC5jbG9uZVJlcG9zaXRvcnkoKS5zZXRVUkkoZ3JvdXBBRGIuZ2V0RGlyZWN0b3J5KCkudG9VUkkoKS50b1N0cmluZygpKQotCQkJCS5zZXREaXJlY3RvcnkoY3JlYXRlVW5pcXVlVGVzdEdpdERpcih0cnVlKSkKLQkJCQkuc2V0QmFyZSh0cnVlKS5jYWxsKCkuZ2V0UmVwb3NpdG9yeSgpOwotCQlSZXBvc2l0b3J5IGRlc3QgPSBHaXQuY2xvbmVSZXBvc2l0b3J5KCkKLQkJCS5zZXRVUkkoZGIuZ2V0RGlyZWN0b3J5KCkudG9VUkkoKS50b1N0cmluZygpKS5zZXREaXJlY3RvcnkoY3JlYXRlVW5pcXVlVGVzdEdpdERpcih0cnVlKSkKLQkJCS5zZXRCYXJlKHRydWUpLmNhbGwoKS5nZXRSZXBvc2l0b3J5KCk7Ci0JCVN0cmluZyBhYnMgPSAiaHR0cHM6Ly9jaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tIjsKLQkJU3RyaW5nIHJlcG9VcmwgPSAiaHR0cHM6Ly9jaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL2Nocm9taXVtL3NyYyI7Ci0JCWJvb2xlYW4gZmV0Y2hTbGFzaCA9IGZhbHNlOwotCQlib29sZWFuIGJhc2VTbGFzaCA9IGZhbHNlOwotCQlkbyB7CisJCXRyeSAoUmVwb3NpdG9yeSBjaGlsZCA9IGNsb25lUmVwb3NpdG9yeShncm91cEFEYiwgdHJ1ZSk7CisJCQkJUmVwb3NpdG9yeSBkZXN0ID0gY2xvbmVSZXBvc2l0b3J5KGRiLCB0cnVlKSkgeworCQkJU3RyaW5nIGFicyA9ICJodHRwczovL2Nocm9taXVtLmdvb2dsZXNvdXJjZS5jb20iOworCQkJU3RyaW5nIHJlcG9VcmwgPSAiaHR0cHM6Ly9jaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL2Nocm9taXVtL3NyYyI7CisJCQlib29sZWFuIGZldGNoU2xhc2ggPSBmYWxzZTsKKwkJCWJvb2xlYW4gYmFzZVNsYXNoID0gZmFsc2U7CiAJCQlkbyB7Ci0JCQkJU3RyaW5nIGZldGNoVXJsID0gZmV0Y2hTbGFzaCA/IGFicyArICIvIiA6IGFiczsKLQkJCQlTdHJpbmcgYmFzZVVybCA9IGJhc2VTbGFzaCA/IGFicyArICIvIiA6IGFiczsKKwkJCQlkbyB7CisJCQkJCVN0cmluZyBmZXRjaFVybCA9IGZldGNoU2xhc2ggPyBhYnMgKyAiLyIgOiBhYnM7CisJCQkJCVN0cmluZyBiYXNlVXJsID0gYmFzZVNsYXNoID8gYWJzICsgIi8iIDogYWJzOwogCi0JCQkJU3RyaW5nQnVpbGRlciB4bWxDb250ZW50ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJCQl4bWxDb250ZW50LmFwcGVuZCgiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG4iKQotCQkJCQkuYXBwZW5kKCI8bWFuaWZlc3Q+IikKLQkJCQkJLmFwcGVuZCgiPHJlbW90ZSBuYW1lPVwib3JpZ2luXCIgZmV0Y2g9XCIiICsgZmV0Y2hVcmwgKyAiXCIgLz4iKQotCQkJCQkuYXBwZW5kKCI8ZGVmYXVsdCByZXZpc2lvbj1cIm1hc3RlclwiIHJlbW90ZT1cIm9yaWdpblwiIC8+IikKLQkJCQkJLmFwcGVuZCgiPHByb2plY3QgcGF0aD1cInNyY1wiIG5hbWU9XCJjaHJvbWl1bS9zcmNcIiAvPiIpCi0JCQkJCS5hcHBlbmQoIjwvbWFuaWZlc3Q+Iik7Ci0JCQkJUmVwb0NvbW1hbmQgY21kID0gbmV3IFJlcG9Db21tYW5kKGRlc3QpOworCQkJCQlTdHJpbmdCdWlsZGVyIHhtbENvbnRlbnQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCQkJCQl4bWxDb250ZW50LmFwcGVuZCgKKwkJCQkJCQkiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG4iKQorCQkJCQkJCS5hcHBlbmQoIjxtYW5pZmVzdD4iKQorCQkJCQkJCS5hcHBlbmQoIjxyZW1vdGUgbmFtZT1cIm9yaWdpblwiIGZldGNoPVwiIgorCQkJCQkJCQkJKyBmZXRjaFVybCArICJcIiAvPiIpCisJCQkJCQkJLmFwcGVuZCgiPGRlZmF1bHQgcmV2aXNpb249XCJtYXN0ZXJcIiByZW1vdGU9XCJvcmlnaW5cIiAvPiIpCisJCQkJCQkJLmFwcGVuZCgiPHByb2plY3QgcGF0aD1cInNyY1wiIG5hbWU9XCJjaHJvbWl1bS9zcmNcIiAvPiIpCisJCQkJCQkJLmFwcGVuZCgiPC9tYW5pZmVzdD4iKTsKKwkJCQkJUmVwb0NvbW1hbmQgY21kID0gbmV3IFJlcG9Db21tYW5kKGRlc3QpOwogCi0JCQkJSW5kZXhlZFJlcG9zIHJlcG9zID0gbmV3IEluZGV4ZWRSZXBvcygpOwotCQkJCXJlcG9zLnB1dChyZXBvVXJsLCBjaGlsZCk7CisJCQkJCUluZGV4ZWRSZXBvcyByZXBvcyA9IG5ldyBJbmRleGVkUmVwb3MoKTsKKwkJCQkJcmVwb3MucHV0KHJlcG9VcmwsIGNoaWxkKTsKIAotCQkJCVJldkNvbW1pdCBjb21taXQgPSBjbWQKLQkJCQkJLnNldElucHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh4bWxDb250ZW50LnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoVVRGXzgpKSkKLQkJCQkJLnNldFJlbW90ZVJlYWRlcihyZXBvcykKLQkJCQkJLnNldFVSSShiYXNlVXJsKQotCQkJCQkuc2V0VGFyZ2V0VVJJKCJnZXJyaXQiKQotCQkJCQkuc2V0UmVjb3JkUmVtb3RlQnJhbmNoKHRydWUpCi0JCQkJCS5zZXRSZWNvcmRTdWJtb2R1bGVMYWJlbHModHJ1ZSkKLQkJCQkJLmNhbGwoKTsKKwkJCQkJUmV2Q29tbWl0IGNvbW1pdCA9IGNtZAorCQkJCQkJCS5zZXRJbnB1dFN0cmVhbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oCisJCQkJCQkJCQl4bWxDb250ZW50LnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoQ0hBUlNFVCkpKQorCQkJCQkJCS5zZXRSZW1vdGVSZWFkZXIocmVwb3MpLnNldFVSSShiYXNlVXJsKQorCQkJCQkJCS5zZXRUYXJnZXRVUkkoImdlcnJpdCIpLnNldFJlY29yZFJlbW90ZUJyYW5jaCh0cnVlKQorCQkJCQkJCS5zZXRSZWNvcmRTdWJtb2R1bGVMYWJlbHModHJ1ZSkuY2FsbCgpOwogCi0JCQkJU3RyaW5nIGlkU3RyID0gY29tbWl0LmdldElkKCkubmFtZSgpICsgIjoiICsgIi5naXRtb2R1bGVzIjsKLQkJCQlPYmplY3RJZCBtb2RJZCA9IGRlc3QucmVzb2x2ZShpZFN0cik7CisJCQkJCVN0cmluZyBpZFN0ciA9IGNvbW1pdC5nZXRJZCgpLm5hbWUoKSArICI6IiArICIuZ2l0bW9kdWxlcyI7CisJCQkJCU9iamVjdElkIG1vZElkID0gZGVzdC5yZXNvbHZlKGlkU3RyKTsKIAotCQkJCXRyeSAoT2JqZWN0UmVhZGVyIHJlYWRlciA9IGRlc3QubmV3T2JqZWN0UmVhZGVyKCkpIHsKLQkJCQkJYnl0ZVtdIGJ5dGVzID0gcmVhZGVyLm9wZW4obW9kSWQpLmdldENhY2hlZEJ5dGVzKEludGVnZXIuTUFYX1ZBTFVFKTsKLQkJCQkJQ29uZmlnIGJhc2UgPSBuZXcgQ29uZmlnKCk7Ci0JCQkJCUJsb2JCYXNlZENvbmZpZyBjZmcgPSBuZXcgQmxvYkJhc2VkQ29uZmlnKGJhc2UsIGJ5dGVzKTsKLQkJCQkJU3RyaW5nIHN1YlVybCA9IGNmZy5nZXRTdHJpbmcoInN1Ym1vZHVsZSIsICJzcmMiLCAidXJsIik7Ci0JCQkJCWFzc2VydEVxdWFscygiaHR0cHM6Ly9jaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL2Nocm9taXVtL3NyYyIsIHN1YlVybCk7Ci0JCQkJfQotCQkJCWZldGNoU2xhc2ggPSAhZmV0Y2hTbGFzaDsKLQkJCX0gd2hpbGUgKGZldGNoU2xhc2gpOwotCQkJYmFzZVNsYXNoID0gIWJhc2VTbGFzaDsKLQkJfSB3aGlsZSAoYmFzZVNsYXNoKTsKLQkJY2hpbGQuY2xvc2UoKTsKLQkJZGVzdC5jbG9zZSgpOworCQkJCQl0cnkgKE9iamVjdFJlYWRlciByZWFkZXIgPSBkZXN0Lm5ld09iamVjdFJlYWRlcigpKSB7CisJCQkJCQlieXRlW10gYnl0ZXMgPSByZWFkZXIub3Blbihtb2RJZCkKKwkJCQkJCQkJLmdldENhY2hlZEJ5dGVzKEludGVnZXIuTUFYX1ZBTFVFKTsKKwkJCQkJCUNvbmZpZyBiYXNlID0gbmV3IENvbmZpZygpOworCQkJCQkJQmxvYkJhc2VkQ29uZmlnIGNmZyA9IG5ldyBCbG9iQmFzZWRDb25maWcoYmFzZSwgYnl0ZXMpOworCQkJCQkJU3RyaW5nIHN1YlVybCA9IGNmZy5nZXRTdHJpbmcoInN1Ym1vZHVsZSIsICJzcmMiLAorCQkJCQkJCQkidXJsIik7CisJCQkJCQlhc3NlcnRFcXVhbHMoCisJCQkJCQkJCSJodHRwczovL2Nocm9taXVtLmdvb2dsZXNvdXJjZS5jb20vY2hyb21pdW0vc3JjIiwKKwkJCQkJCQkJc3ViVXJsKTsKKwkJCQkJfQorCQkJCQlmZXRjaFNsYXNoID0gIWZldGNoU2xhc2g7CisJCQkJfSB3aGlsZSAoZmV0Y2hTbGFzaCk7CisJCQkJYmFzZVNsYXNoID0gIWJhc2VTbGFzaDsKKwkJCX0gd2hpbGUgKGJhc2VTbGFzaCk7CisJCX0KIAl9CiAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIGFic29sdXRlUmVtb3RlVVJMQWJzb2x1dGVUYXJnZXRVUkwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUmVwb3NpdG9yeSBjaGlsZCA9Ci0JCQlHaXQuY2xvbmVSZXBvc2l0b3J5KCkuc2V0VVJJKGdyb3VwQURiLmdldERpcmVjdG9yeSgpLnRvVVJJKCkudG9TdHJpbmcoKSkKLQkJCQkuc2V0RGlyZWN0b3J5KGNyZWF0ZVVuaXF1ZVRlc3RHaXREaXIodHJ1ZSkpCi0JCQkJLnNldEJhcmUodHJ1ZSkuY2FsbCgpLmdldFJlcG9zaXRvcnkoKTsKLQkJUmVwb3NpdG9yeSBkZXN0ID0gR2l0LmNsb25lUmVwb3NpdG9yeSgpCi0JCQkuc2V0VVJJKGRiLmdldERpcmVjdG9yeSgpLnRvVVJJKCkudG9TdHJpbmcoKSkuc2V0RGlyZWN0b3J5KGNyZWF0ZVVuaXF1ZVRlc3RHaXREaXIodHJ1ZSkpCi0JCQkuc2V0QmFyZSh0cnVlKS5jYWxsKCkuZ2V0UmVwb3NpdG9yeSgpOwotCQlTdHJpbmcgYWJzID0gImh0dHBzOi8vY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbSI7Ci0JCVN0cmluZyByZXBvVXJsID0gImh0dHBzOi8vY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9jaHJvbWl1bS9zcmMiOwotCQlib29sZWFuIGZldGNoU2xhc2ggPSBmYWxzZTsKLQkJYm9vbGVhbiBiYXNlU2xhc2ggPSBmYWxzZTsKLQkJZG8geworCQl0cnkgKFJlcG9zaXRvcnkgY2hpbGQgPSBjbG9uZVJlcG9zaXRvcnkoZ3JvdXBBRGIsIHRydWUpOworCQkJCVJlcG9zaXRvcnkgZGVzdCA9IGNsb25lUmVwb3NpdG9yeShkYiwgdHJ1ZSkpIHsKKwkJCVN0cmluZyBhYnMgPSAiaHR0cHM6Ly9jaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tIjsKKwkJCVN0cmluZyByZXBvVXJsID0gImh0dHBzOi8vY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9jaHJvbWl1bS9zcmMiOworCQkJYm9vbGVhbiBmZXRjaFNsYXNoID0gZmFsc2U7CisJCQlib29sZWFuIGJhc2VTbGFzaCA9IGZhbHNlOwogCQkJZG8gewotCQkJCVN0cmluZyBmZXRjaFVybCA9IGZldGNoU2xhc2ggPyBhYnMgKyAiLyIgOiBhYnM7Ci0JCQkJU3RyaW5nIGJhc2VVcmwgPSBiYXNlU2xhc2ggPyBhYnMgKyAiLyIgOiBhYnM7CisJCQkJZG8geworCQkJCQlTdHJpbmcgZmV0Y2hVcmwgPSBmZXRjaFNsYXNoID8gYWJzICsgIi8iIDogYWJzOworCQkJCQlTdHJpbmcgYmFzZVVybCA9IGJhc2VTbGFzaCA/IGFicyArICIvIiA6IGFiczsKIAotCQkJCVN0cmluZ0J1aWxkZXIgeG1sQ29udGVudCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCQkJeG1sQ29udGVudC5hcHBlbmQoIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuIikKLQkJCQkJLmFwcGVuZCgiPG1hbmlmZXN0PiIpCi0JCQkJCS5hcHBlbmQoIjxyZW1vdGUgbmFtZT1cIm9yaWdpblwiIGZldGNoPVwiIiArIGZldGNoVXJsICsgIlwiIC8+IikKLQkJCQkJLmFwcGVuZCgiPGRlZmF1bHQgcmV2aXNpb249XCJtYXN0ZXJcIiByZW1vdGU9XCJvcmlnaW5cIiAvPiIpCi0JCQkJCS5hcHBlbmQoIjxwcm9qZWN0IHBhdGg9XCJzcmNcIiBuYW1lPVwiY2hyb21pdW0vc3JjXCIgLz4iKQotCQkJCQkuYXBwZW5kKCI8L21hbmlmZXN0PiIpOwotCQkJCVJlcG9Db21tYW5kIGNtZCA9IG5ldyBSZXBvQ29tbWFuZChkZXN0KTsKKwkJCQkJU3RyaW5nQnVpbGRlciB4bWxDb250ZW50ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKwkJCQkJeG1sQ29udGVudC5hcHBlbmQoCisJCQkJCQkJIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuIikKKwkJCQkJCQkuYXBwZW5kKCI8bWFuaWZlc3Q+IikKKwkJCQkJCQkuYXBwZW5kKCI8cmVtb3RlIG5hbWU9XCJvcmlnaW5cIiBmZXRjaD1cIiIKKwkJCQkJCQkJCSsgZmV0Y2hVcmwgKyAiXCIgLz4iKQorCQkJCQkJCS5hcHBlbmQoIjxkZWZhdWx0IHJldmlzaW9uPVwibWFzdGVyXCIgcmVtb3RlPVwib3JpZ2luXCIgLz4iKQorCQkJCQkJCS5hcHBlbmQoIjxwcm9qZWN0IHBhdGg9XCJzcmNcIiBuYW1lPVwiY2hyb21pdW0vc3JjXCIgLz4iKQorCQkJCQkJCS5hcHBlbmQoIjwvbWFuaWZlc3Q+Iik7CisJCQkJCVJlcG9Db21tYW5kIGNtZCA9IG5ldyBSZXBvQ29tbWFuZChkZXN0KTsKIAotCQkJCUluZGV4ZWRSZXBvcyByZXBvcyA9IG5ldyBJbmRleGVkUmVwb3MoKTsKLQkJCQlyZXBvcy5wdXQocmVwb1VybCwgY2hpbGQpOworCQkJCQlJbmRleGVkUmVwb3MgcmVwb3MgPSBuZXcgSW5kZXhlZFJlcG9zKCk7CisJCQkJCXJlcG9zLnB1dChyZXBvVXJsLCBjaGlsZCk7CiAKLQkJCQlSZXZDb21taXQgY29tbWl0ID0gY21kCi0JCQkJCS5zZXRJbnB1dFN0cmVhbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oeG1sQ29udGVudC50b1N0cmluZygpLmdldEJ5dGVzKFVURl84KSkpCi0JCQkJCS5zZXRSZW1vdGVSZWFkZXIocmVwb3MpCi0JCQkJCS5zZXRVUkkoYmFzZVVybCkKLQkJCQkJLnNldFRhcmdldFVSSShhYnMgKyAiL3N1cGVycHJvamVjdCIpCi0JCQkJCS5zZXRSZWNvcmRSZW1vdGVCcmFuY2godHJ1ZSkKLQkJCQkJLnNldFJlY29yZFN1Ym1vZHVsZUxhYmVscyh0cnVlKQotCQkJCQkuY2FsbCgpOworCQkJCQlSZXZDb21taXQgY29tbWl0ID0gY21kCisJCQkJCQkJLnNldElucHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgKKwkJCQkJCQkJCXhtbENvbnRlbnQudG9TdHJpbmcoKS5nZXRCeXRlcyhDSEFSU0VUKSkpCisJCQkJCQkJLnNldFJlbW90ZVJlYWRlcihyZXBvcykuc2V0VVJJKGJhc2VVcmwpCisJCQkJCQkJLnNldFRhcmdldFVSSShhYnMgKyAiL3N1cGVycHJvamVjdCIpCisJCQkJCQkJLnNldFJlY29yZFJlbW90ZUJyYW5jaCh0cnVlKQorCQkJCQkJCS5zZXRSZWNvcmRTdWJtb2R1bGVMYWJlbHModHJ1ZSkuY2FsbCgpOwogCi0JCQkJU3RyaW5nIGlkU3RyID0gY29tbWl0LmdldElkKCkubmFtZSgpICsgIjoiICsgIi5naXRtb2R1bGVzIjsKLQkJCQlPYmplY3RJZCBtb2RJZCA9IGRlc3QucmVzb2x2ZShpZFN0cik7CisJCQkJCVN0cmluZyBpZFN0ciA9IGNvbW1pdC5nZXRJZCgpLm5hbWUoKSArICI6IiArICIuZ2l0bW9kdWxlcyI7CisJCQkJCU9iamVjdElkIG1vZElkID0gZGVzdC5yZXNvbHZlKGlkU3RyKTsKIAotCQkJCXRyeSAoT2JqZWN0UmVhZGVyIHJlYWRlciA9IGRlc3QubmV3T2JqZWN0UmVhZGVyKCkpIHsKLQkJCQkJYnl0ZVtdIGJ5dGVzID0gcmVhZGVyLm9wZW4obW9kSWQpLmdldENhY2hlZEJ5dGVzKEludGVnZXIuTUFYX1ZBTFVFKTsKLQkJCQkJQ29uZmlnIGJhc2UgPSBuZXcgQ29uZmlnKCk7Ci0JCQkJCUJsb2JCYXNlZENvbmZpZyBjZmcgPSBuZXcgQmxvYkJhc2VkQ29uZmlnKGJhc2UsIGJ5dGVzKTsKLQkJCQkJU3RyaW5nIHN1YlVybCA9IGNmZy5nZXRTdHJpbmcoInN1Ym1vZHVsZSIsICJzcmMiLCAidXJsIik7Ci0JCQkJCWFzc2VydEVxdWFscygiLi4vY2hyb21pdW0vc3JjIiwgc3ViVXJsKTsKLQkJCQl9Ci0JCQkJZmV0Y2hTbGFzaCA9ICFmZXRjaFNsYXNoOwotCQkJfSB3aGlsZSAoZmV0Y2hTbGFzaCk7Ci0JCQliYXNlU2xhc2ggPSAhYmFzZVNsYXNoOwotCQl9IHdoaWxlIChiYXNlU2xhc2gpOwotCQljaGlsZC5jbG9zZSgpOwotCQlkZXN0LmNsb3NlKCk7CisJCQkJCXRyeSAoT2JqZWN0UmVhZGVyIHJlYWRlciA9IGRlc3QubmV3T2JqZWN0UmVhZGVyKCkpIHsKKwkJCQkJCWJ5dGVbXSBieXRlcyA9IHJlYWRlci5vcGVuKG1vZElkKQorCQkJCQkJCQkuZ2V0Q2FjaGVkQnl0ZXMoSW50ZWdlci5NQVhfVkFMVUUpOworCQkJCQkJQ29uZmlnIGJhc2UgPSBuZXcgQ29uZmlnKCk7CisJCQkJCQlCbG9iQmFzZWRDb25maWcgY2ZnID0gbmV3IEJsb2JCYXNlZENvbmZpZyhiYXNlLCBieXRlcyk7CisJCQkJCQlTdHJpbmcgc3ViVXJsID0gY2ZnLmdldFN0cmluZygic3VibW9kdWxlIiwgInNyYyIsCisJCQkJCQkJCSJ1cmwiKTsKKwkJCQkJCWFzc2VydEVxdWFscygiLi4vY2hyb21pdW0vc3JjIiwgc3ViVXJsKTsKKwkJCQkJfQorCQkJCQlmZXRjaFNsYXNoID0gIWZldGNoU2xhc2g7CisJCQkJfSB3aGlsZSAoZmV0Y2hTbGFzaCk7CisJCQkJYmFzZVNsYXNoID0gIWJhc2VTbGFzaDsKKwkJCX0gd2hpbGUgKGJhc2VTbGFzaCk7CisJCX0KIAl9CiAKIAlAVGVzdApAQCAtNTEzLDExICs0NzIsMTIgQEAgcHVibGljIHZvaWQgdGVzdEFkZFJlcG9NYW5pZmVzdCgpIHRocm93cyBFeGNlcHRpb24gewogCQkJLmNhbGwoKTsKIAkJRmlsZSBoZWxsbyA9IG5ldyBGaWxlKGRiLmdldFdvcmtUcmVlKCksICJmb28vaGVsbG8udHh0Iik7CiAJCWFzc2VydFRydWUoInN1Ym1vZHVsZSBzaG91bGQgYmUgY2hlY2tlZCBvdXQiLCBoZWxsby5leGlzdHMoKSk7Ci0JCUJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihoZWxsbykpOwotCQlTdHJpbmcgY29udGVudCA9IHJlYWRlci5yZWFkTGluZSgpOwotCQlyZWFkZXIuY2xvc2UoKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdWJtb2R1bGUgY29udGVudCBzaG91bGQgYmUgYXMgZXhwZWN0ZWQiLAotCQkJCSJtYXN0ZXIgd29ybGQiLCBjb250ZW50KTsKKwkJdHJ5IChCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoCisJCQkJbmV3IEZpbGVSZWFkZXIoaGVsbG8pKSkgeworCQkJU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIucmVhZExpbmUoKTsKKwkJCWFzc2VydEVxdWFscygic3VibW9kdWxlIGNvbnRlbnQgc2hvdWxkIGJlIGFzIGV4cGVjdGVkIiwKKwkJCQkJIm1hc3RlciB3b3JsZCIsIGNvbnRlbnQpOworCQl9CiAJfQogCiAJQFRlc3QKQEAgLTYwMywxOSArNTYzLDIxIEBAIHB1YmxpYyB2b2lkIHRlc3RSZXBvTWFuaWZlc3RDb3B5RmlsZSgpIHRocm93cyBFeGNlcHRpb24gewogCQkvLyBUaGUgb3JpZ2luYWwgZmlsZSBzaG91bGQgZXhpc3QKIAkJRmlsZSBoZWxsbyA9IG5ldyBGaWxlKGxvY2FsRGIuZ2V0V29ya1RyZWUoKSwgImZvby9oZWxsby50eHQiKTsKIAkJYXNzZXJ0VHJ1ZSgiVGhlIG9yaWdpbmFsIGZpbGUgc2hvdWxkIGV4aXN0IiwgaGVsbG8uZXhpc3RzKCkpOwotCQlCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoaGVsbG8pKTsKLQkJU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIucmVhZExpbmUoKTsKLQkJcmVhZGVyLmNsb3NlKCk7Ci0JCWFzc2VydEVxdWFscygiVGhlIG9yaWdpbmFsIGZpbGUgc2hvdWxkIGhhdmUgZXhwZWN0ZWQgY29udGVudCIsCi0JCQkJIm1hc3RlciB3b3JsZCIsIGNvbnRlbnQpOworCQl0cnkgKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcigKKwkJCQluZXcgRmlsZVJlYWRlcihoZWxsbykpKSB7CisJCQlTdHJpbmcgY29udGVudCA9IHJlYWRlci5yZWFkTGluZSgpOworCQkJYXNzZXJ0RXF1YWxzKCJUaGUgb3JpZ2luYWwgZmlsZSBzaG91bGQgaGF2ZSBleHBlY3RlZCBjb250ZW50IiwKKwkJCQkJIm1hc3RlciB3b3JsZCIsIGNvbnRlbnQpOworCQl9CiAJCS8vIFRoZSBkZXN0IGZpbGUgc2hvdWxkIGFsc28gZXhpc3QKIAkJaGVsbG8gPSBuZXcgRmlsZShsb2NhbERiLmdldFdvcmtUcmVlKCksICJIZWxsbyIpOwogCQlhc3NlcnRUcnVlKCJUaGUgZGVzdGluYXRpb24gZmlsZSBzaG91bGQgZXhpc3QiLCBoZWxsby5leGlzdHMoKSk7Ci0JCXJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihoZWxsbykpOwotCQljb250ZW50ID0gcmVhZGVyLnJlYWRMaW5lKCk7Ci0JCXJlYWRlci5jbG9zZSgpOwotCQlhc3NlcnRFcXVhbHMoIlRoZSBkZXN0aW5hdGlvbiBmaWxlIHNob3VsZCBoYXZlIGV4cGVjdGVkIGNvbnRlbnQiLAotCQkJCSJtYXN0ZXIgd29ybGQiLCBjb250ZW50KTsKKwkJdHJ5IChCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoCisJCQkJbmV3IEZpbGVSZWFkZXIoaGVsbG8pKSkgeworCQkJU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIucmVhZExpbmUoKTsKKwkJCWFzc2VydEVxdWFscygiVGhlIGRlc3RpbmF0aW9uIGZpbGUgc2hvdWxkIGhhdmUgZXhwZWN0ZWQgY29udGVudCIsCisJCQkJCSJtYXN0ZXIgd29ybGQiLCBjb250ZW50KTsKKwkJfQogCX0KIAogCUBUZXN0CkBAIC02MzgsMjQgKzYwMCwyNyBAQCBwdWJsaWMgdm9pZCB0ZXN0QmFyZVJlcG8oKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCQkuc2V0VVJJKHJvb3RVcmkpLmNhbGwoKTsKIAkJLy8gQ2xvbmUgaXQKIAkJRmlsZSBkaXJlY3RvcnkgPSBjcmVhdGVUZW1wRGlyZWN0b3J5KCJ0ZXN0QmFyZVJlcG8iKTsKLQkJUmVwb3NpdG9yeSBsb2NhbERiID0gR2l0LmNsb25lUmVwb3NpdG9yeSgpLnNldERpcmVjdG9yeShkaXJlY3RvcnkpCisJCXRyeSAoUmVwb3NpdG9yeSBsb2NhbERiID0gR2l0LmNsb25lUmVwb3NpdG9yeSgpLnNldERpcmVjdG9yeShkaXJlY3RvcnkpCiAJCQkJLnNldFVSSShyZW1vdGVEYi5nZXREaXJlY3RvcnkoKS50b1VSSSgpLnRvU3RyaW5nKCkpLmNhbGwoKQotCQkJCS5nZXRSZXBvc2l0b3J5KCk7Ci0JCS8vIFRoZSAuZ2l0bW9kdWxlcyBmaWxlIHNob3VsZCBleGlzdAotCQlGaWxlIGdpdG1vZHVsZXMgPSBuZXcgRmlsZShsb2NhbERiLmdldFdvcmtUcmVlKCksICIuZ2l0bW9kdWxlcyIpOwotCQlhc3NlcnRUcnVlKCJUaGUgLmdpdG1vZHVsZXMgZmlsZSBzaG91bGQgZXhpc3QiLCBnaXRtb2R1bGVzLmV4aXN0cygpKTsKLQkJLy8gVGhlIGZpcnN0IGxpbmUgb2YgLmdpdG1vZHVsZXMgZmlsZSBzaG91bGQgYmUgZXhwZWN0ZWQKLQkJQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGdpdG1vZHVsZXMpKTsKLQkJU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIucmVhZExpbmUoKTsKLQkJcmVhZGVyLmNsb3NlKCk7Ci0JCWFzc2VydEVxdWFscygiVGhlIGZpcnN0IGxpbmUgb2YgLmdpdG1vZHVsZXMgZmlsZSBzaG91bGQgYmUgYXMgZXhwZWN0ZWQiLAotCQkJCSJbc3VibW9kdWxlIFwiZm9vXCJdIiwgY29udGVudCk7Ci0JCS8vIFRoZSBnaXRsaW5rIHNob3VsZCBiZSB0aGUgc2FtZSBhcyByZW1vdGUgaGVhZCBzaGExCi0JCVN0cmluZyBnaXRsaW5rID0gbG9jYWxEYi5yZXNvbHZlKENvbnN0YW50cy5IRUFEICsgIjpmb28iKS5uYW1lKCk7Ci0JCWxvY2FsRGIuY2xvc2UoKTsKLQkJU3RyaW5nIHJlbW90ZSA9IGRlZmF1bHREYi5yZXNvbHZlKENvbnN0YW50cy5IRUFEKS5uYW1lKCk7Ci0JCWFzc2VydEVxdWFscygiVGhlIGdpdGxpbmsgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHJlbW90ZSBoZWFkIiwgcmVtb3RlLAotCQkJCWdpdGxpbmspOworCQkJCS5nZXRSZXBvc2l0b3J5KCkpIHsKKwkJCS8vIFRoZSAuZ2l0bW9kdWxlcyBmaWxlIHNob3VsZCBleGlzdAorCQkJRmlsZSBnaXRtb2R1bGVzID0gbmV3IEZpbGUobG9jYWxEYi5nZXRXb3JrVHJlZSgpLCAiLmdpdG1vZHVsZXMiKTsKKwkJCWFzc2VydFRydWUoIlRoZSAuZ2l0bW9kdWxlcyBmaWxlIHNob3VsZCBleGlzdCIsCisJCQkJCWdpdG1vZHVsZXMuZXhpc3RzKCkpOworCQkJLy8gVGhlIGZpcnN0IGxpbmUgb2YgLmdpdG1vZHVsZXMgZmlsZSBzaG91bGQgYmUgZXhwZWN0ZWQKKwkJCXRyeSAoQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKAorCQkJCQluZXcgRmlsZVJlYWRlcihnaXRtb2R1bGVzKSkpIHsKKwkJCQlTdHJpbmcgY29udGVudCA9IHJlYWRlci5yZWFkTGluZSgpOworCQkJCWFzc2VydEVxdWFscygKKwkJCQkJCSJUaGUgZmlyc3QgbGluZSBvZiAuZ2l0bW9kdWxlcyBmaWxlIHNob3VsZCBiZSBhcyBleHBlY3RlZCIsCisJCQkJCQkiW3N1Ym1vZHVsZSBcImZvb1wiXSIsIGNvbnRlbnQpOworCQkJfQorCQkJLy8gVGhlIGdpdGxpbmsgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHJlbW90ZSBoZWFkIHNoYTEKKwkJCVN0cmluZyBnaXRsaW5rID0gbG9jYWxEYi5yZXNvbHZlKENvbnN0YW50cy5IRUFEICsgIjpmb28iKS5uYW1lKCk7CisJCQlTdHJpbmcgcmVtb3RlID0gZGVmYXVsdERiLnJlc29sdmUoQ29uc3RhbnRzLkhFQUQpLm5hbWUoKTsKKwkJCWFzc2VydEVxdWFscygiVGhlIGdpdGxpbmsgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHJlbW90ZSBoZWFkIiwKKwkJCQkJcmVtb3RlLCBnaXRsaW5rKTsKKwkJfQogCX0KIAogCUBUZXN0CkBAIC02NzcsMTEgKzY0MiwxMiBAQCBwdWJsaWMgdm9pZCB0ZXN0UmV2aXNpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCS5zZXRVUkkocm9vdFVyaSkKIAkJCS5jYWxsKCk7CiAJCUZpbGUgaGVsbG8gPSBuZXcgRmlsZShkYi5nZXRXb3JrVHJlZSgpLCAiZm9vL2hlbGxvLnR4dCIpOwotCQlCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoaGVsbG8pKTsKLQkJU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIucmVhZExpbmUoKTsKLQkJcmVhZGVyLmNsb3NlKCk7Ci0JCWFzc2VydEVxdWFscygic3VibW9kdWxlIGNvbnRlbnQgc2hvdWxkIGJlIGFzIGV4cGVjdGVkIiwKLQkJCQkiYnJhbmNoIHdvcmxkIiwgY29udGVudCk7CisJCXRyeSAoQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKAorCQkJCW5ldyBGaWxlUmVhZGVyKGhlbGxvKSkpIHsKKwkJCVN0cmluZyBjb250ZW50ID0gcmVhZGVyLnJlYWRMaW5lKCk7CisJCQlhc3NlcnRFcXVhbHMoInN1Ym1vZHVsZSBjb250ZW50IHNob3VsZCBiZSBhcyBleHBlY3RlZCIsCisJCQkJCSJicmFuY2ggd29ybGQiLCBjb250ZW50KTsKKwkJfQogCX0KIAogCUBUZXN0CkBAIC03MDMsMTEgKzY2OSwxMiBAQCBwdWJsaWMgdm9pZCB0ZXN0UmV2aXNpb25CcmFuY2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCS5zZXRVUkkocm9vdFVyaSkKIAkJCS5jYWxsKCk7CiAJCUZpbGUgaGVsbG8gPSBuZXcgRmlsZShkYi5nZXRXb3JrVHJlZSgpLCAiZm9vL2hlbGxvLnR4dCIpOwotCQlCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoaGVsbG8pKTsKLQkJU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIucmVhZExpbmUoKTsKLQkJcmVhZGVyLmNsb3NlKCk7Ci0JCWFzc2VydEVxdWFscygic3VibW9kdWxlIGNvbnRlbnQgc2hvdWxkIGJlIGFzIGV4cGVjdGVkIiwKLQkJCQkiYnJhbmNoIHdvcmxkIiwgY29udGVudCk7CisJCXRyeSAoQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKAorCQkJCW5ldyBGaWxlUmVhZGVyKGhlbGxvKSkpIHsKKwkJCVN0cmluZyBjb250ZW50ID0gcmVhZGVyLnJlYWRMaW5lKCk7CisJCQlhc3NlcnRFcXVhbHMoInN1Ym1vZHVsZSBjb250ZW50IHNob3VsZCBiZSBhcyBleHBlY3RlZCIsCisJCQkJCSJicmFuY2ggd29ybGQiLCBjb250ZW50KTsKKwkJfQogCX0KIAogCUBUZXN0CkBAIC03MjksMTEgKzY5NiwxMiBAQCBwdWJsaWMgdm9pZCB0ZXN0UmV2aXNpb25UYWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCS5zZXRVUkkocm9vdFVyaSkKIAkJCS5jYWxsKCk7CiAJCUZpbGUgaGVsbG8gPSBuZXcgRmlsZShkYi5nZXRXb3JrVHJlZSgpLCAiZm9vL2hlbGxvLnR4dCIpOwotCQlCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoaGVsbG8pKTsKLQkJU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIucmVhZExpbmUoKTsKLQkJcmVhZGVyLmNsb3NlKCk7Ci0JCWFzc2VydEVxdWFscygic3VibW9kdWxlIGNvbnRlbnQgc2hvdWxkIGJlIGFzIGV4cGVjdGVkIiwKLQkJCQkiYnJhbmNoIHdvcmxkIiwgY29udGVudCk7CisJCXRyeSAoQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKAorCQkJCW5ldyBGaWxlUmVhZGVyKGhlbGxvKSkpIHsKKwkJCVN0cmluZyBjb250ZW50ID0gcmVhZGVyLnJlYWRMaW5lKCk7CisJCQlhc3NlcnRFcXVhbHMoInN1Ym1vZHVsZSBjb250ZW50IHNob3VsZCBiZSBhcyBleHBlY3RlZCIsCisJCQkJCSJicmFuY2ggd29ybGQiLCBjb250ZW50KTsKKwkJfQogCX0KIAogCUBUZXN0CkBAIC03NTcsMTQgKzcyNSwxNCBAQCBwdWJsaWMgdm9pZCB0ZXN0UmV2aXNpb25CYXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCQkJLnNldFVSSShyb290VXJpKS5jYWxsKCk7CiAJCS8vIENsb25lIGl0CiAJCUZpbGUgZGlyZWN0b3J5ID0gY3JlYXRlVGVtcERpcmVjdG9yeSgidGVzdFJldmlzaW9uQmFyZSIpOwotCQlSZXBvc2l0b3J5IGxvY2FsRGIgPSBHaXQuY2xvbmVSZXBvc2l0b3J5KCkuc2V0RGlyZWN0b3J5KGRpcmVjdG9yeSkKKwkJdHJ5IChSZXBvc2l0b3J5IGxvY2FsRGIgPSBHaXQuY2xvbmVSZXBvc2l0b3J5KCkuc2V0RGlyZWN0b3J5KGRpcmVjdG9yeSkKIAkJCQkuc2V0VVJJKHJlbW90ZURiLmdldERpcmVjdG9yeSgpLnRvVVJJKCkudG9TdHJpbmcoKSkuY2FsbCgpCi0JCQkJLmdldFJlcG9zaXRvcnkoKTsKLQkJLy8gVGhlIGdpdGxpbmsgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIG9sZENvbW1pdElkCi0JCVN0cmluZyBnaXRsaW5rID0gbG9jYWxEYi5yZXNvbHZlKENvbnN0YW50cy5IRUFEICsgIjpmb28iKS5uYW1lKCk7Ci0JCWxvY2FsRGIuY2xvc2UoKTsKLQkJYXNzZXJ0RXF1YWxzKCJUaGUgZ2l0bGluayBpcyBzYW1lIGFzIHJlbW90ZSBoZWFkIiwgb2xkQ29tbWl0SWQubmFtZSgpLAotCQkJCWdpdGxpbmspOworCQkJCS5nZXRSZXBvc2l0b3J5KCkpIHsKKwkJCS8vIFRoZSBnaXRsaW5rIHNob3VsZCBiZSB0aGUgc2FtZSBhcyBvbGRDb21taXRJZAorCQkJU3RyaW5nIGdpdGxpbmsgPSBsb2NhbERiLnJlc29sdmUoQ29uc3RhbnRzLkhFQUQgKyAiOmZvbyIpLm5hbWUoKTsKKwkJCWFzc2VydEVxdWFscygiVGhlIGdpdGxpbmsgaXMgc2FtZSBhcyByZW1vdGUgaGVhZCIsCisJCQkJCW9sZENvbW1pdElkLm5hbWUoKSwgZ2l0bGluayk7CisJCX0KIAl9CiAKIAlAVGVzdApAQCAtNzkwLDIyICs3NTgsMjQgQEAgcHVibGljIHZvaWQgdGVzdENvcHlGaWxlQmFyZSgpIHRocm93cyBFeGNlcHRpb24gewogCQkJCS5zZXRVUkkocm9vdFVyaSkuY2FsbCgpOwogCQkvLyBDbG9uZSBpdAogCQlGaWxlIGRpcmVjdG9yeSA9IGNyZWF0ZVRlbXBEaXJlY3RvcnkoInRlc3RDb3B5RmlsZUJhcmUiKTsKLQkJUmVwb3NpdG9yeSBsb2NhbERiID0gR2l0LmNsb25lUmVwb3NpdG9yeSgpLnNldERpcmVjdG9yeShkaXJlY3RvcnkpCisJCXRyeSAoUmVwb3NpdG9yeSBsb2NhbERiID0gR2l0LmNsb25lUmVwb3NpdG9yeSgpLnNldERpcmVjdG9yeShkaXJlY3RvcnkpCiAJCQkJLnNldFVSSShyZW1vdGVEYi5nZXREaXJlY3RvcnkoKS50b1VSSSgpLnRvU3RyaW5nKCkpLmNhbGwoKQotCQkJCS5nZXRSZXBvc2l0b3J5KCk7Ci0JCS8vIFRoZSBIZWxsbyBmaWxlIHNob3VsZCBleGlzdAotCQlGaWxlIGhlbGxvID0gbmV3IEZpbGUobG9jYWxEYi5nZXRXb3JrVHJlZSgpLCAiSGVsbG8iKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIEhlbGxvIGZpbGUgc2hvdWxkIGV4aXN0IiwgaGVsbG8uZXhpc3RzKCkpOwotCQkvLyBUaGUgZm9vL0hlbGxvIGZpbGUgc2hvdWxkIGJlIHNraXBwZWQuCi0JCUZpbGUgZm9vaGVsbG8gPSBuZXcgRmlsZShsb2NhbERiLmdldFdvcmtUcmVlKCksICJmb28vSGVsbG8iKTsKLQkJYXNzZXJ0RmFsc2UoIlRoZSBmb28vSGVsbG8gZmlsZSBzaG91bGQgYmUgc2tpcHBlZCIsIGZvb2hlbGxvLmV4aXN0cygpKTsKLQkJbG9jYWxEYi5jbG9zZSgpOwotCQkvLyBUaGUgY29udGVudCBvZiBIZWxsbyBmaWxlIHNob3VsZCBiZSBleHBlY3RlZAotCQlCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoaGVsbG8pKTsKLQkJU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIucmVhZExpbmUoKTsKLQkJcmVhZGVyLmNsb3NlKCk7Ci0JCWFzc2VydEVxdWFscygiVGhlIEhlbGxvIGZpbGUgc2hvdWxkIGhhdmUgZXhwZWN0ZWQgY29udGVudCIsCi0JCQkJImJyYW5jaCB3b3JsZCIsIGNvbnRlbnQpOworCQkJCS5nZXRSZXBvc2l0b3J5KCkpIHsKKwkJCS8vIFRoZSBIZWxsbyBmaWxlIHNob3VsZCBleGlzdAorCQkJRmlsZSBoZWxsbyA9IG5ldyBGaWxlKGxvY2FsRGIuZ2V0V29ya1RyZWUoKSwgIkhlbGxvIik7CisJCQlhc3NlcnRUcnVlKCJUaGUgSGVsbG8gZmlsZSBzaG91bGQgZXhpc3QiLCBoZWxsby5leGlzdHMoKSk7CisJCQkvLyBUaGUgZm9vL0hlbGxvIGZpbGUgc2hvdWxkIGJlIHNraXBwZWQuCisJCQlGaWxlIGZvb2hlbGxvID0gbmV3IEZpbGUobG9jYWxEYi5nZXRXb3JrVHJlZSgpLCAiZm9vL0hlbGxvIik7CisJCQlhc3NlcnRGYWxzZSgiVGhlIGZvby9IZWxsbyBmaWxlIHNob3VsZCBiZSBza2lwcGVkIiwKKwkJCQkJZm9vaGVsbG8uZXhpc3RzKCkpOworCQkJLy8gVGhlIGNvbnRlbnQgb2YgSGVsbG8gZmlsZSBzaG91bGQgYmUgZXhwZWN0ZWQKKwkJCXRyeSAoQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKAorCQkJCQluZXcgRmlsZVJlYWRlcihoZWxsbykpKSB7CisJCQkJU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIucmVhZExpbmUoKTsKKwkJCQlhc3NlcnRFcXVhbHMoIlRoZSBIZWxsbyBmaWxlIHNob3VsZCBoYXZlIGV4cGVjdGVkIGNvbnRlbnQiLAorCQkJCQkJImJyYW5jaCB3b3JsZCIsIGNvbnRlbnQpOworCQkJfQorCQl9CiAJfQogCiAJQFRlc3QKQEAgLTg0MSwzNiArODExLDM4IEBAIHB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlTWFuaWZlc3RCYXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCQkJLnNldFVSSShyb290VXJpKS5jYWxsKCk7CiAJCS8vIENsb25lIGl0CiAJCUZpbGUgZGlyZWN0b3J5ID0gY3JlYXRlVGVtcERpcmVjdG9yeSgidGVzdFJlcGxhY2VNYW5pZmVzdEJhcmUiKTsKLQkJUmVwb3NpdG9yeSBsb2NhbERiID0gR2l0LmNsb25lUmVwb3NpdG9yeSgpLnNldERpcmVjdG9yeShkaXJlY3RvcnkpCisJCUZpbGUgZG90bW9kdWxlczsKKwkJdHJ5IChSZXBvc2l0b3J5IGxvY2FsRGIgPSBHaXQuY2xvbmVSZXBvc2l0b3J5KCkuc2V0RGlyZWN0b3J5KGRpcmVjdG9yeSkKIAkJCQkuc2V0VVJJKHJlbW90ZURiLmdldERpcmVjdG9yeSgpLnRvVVJJKCkudG9TdHJpbmcoKSkuY2FsbCgpCi0JCQkJLmdldFJlcG9zaXRvcnkoKTsKLQkJLy8gVGhlIEhlbGxvIGZpbGUgc2hvdWxkIG5vdCBleGlzdAotCQlGaWxlIGhlbGxvID0gbmV3IEZpbGUobG9jYWxEYi5nZXRXb3JrVHJlZSgpLCAiSGVsbG8iKTsKLQkJYXNzZXJ0RmFsc2UoIlRoZSBIZWxsbyBmaWxlIHNob3VsZG4ndCBleGlzdCIsIGhlbGxvLmV4aXN0cygpKTsKLQkJLy8gVGhlIEhlbGxvLnR4dCBmaWxlIHNob3VsZCBleGlzdAotCQlGaWxlIGhlbGxvdHh0ID0gbmV3IEZpbGUobG9jYWxEYi5nZXRXb3JrVHJlZSgpLCAiSGVsbG8udHh0Iik7Ci0JCWFzc2VydFRydWUoIlRoZSBIZWxsby50eHQgZmlsZSBzaG91bGQgZXhpc3QiLCBoZWxsb3R4dC5leGlzdHMoKSk7CisJCQkJLmdldFJlcG9zaXRvcnkoKSkgeworCQkJLy8gVGhlIEhlbGxvIGZpbGUgc2hvdWxkIG5vdCBleGlzdAorCQkJRmlsZSBoZWxsbyA9IG5ldyBGaWxlKGxvY2FsRGIuZ2V0V29ya1RyZWUoKSwgIkhlbGxvIik7CisJCQlhc3NlcnRGYWxzZSgiVGhlIEhlbGxvIGZpbGUgc2hvdWxkbid0IGV4aXN0IiwgaGVsbG8uZXhpc3RzKCkpOworCQkJLy8gVGhlIEhlbGxvLnR4dCBmaWxlIHNob3VsZCBleGlzdAorCQkJRmlsZSBoZWxsb3R4dCA9IG5ldyBGaWxlKGxvY2FsRGIuZ2V0V29ya1RyZWUoKSwgIkhlbGxvLnR4dCIpOworCQkJYXNzZXJ0VHJ1ZSgiVGhlIEhlbGxvLnR4dCBmaWxlIHNob3VsZCBleGlzdCIsIGhlbGxvdHh0LmV4aXN0cygpKTsKKwkJCWRvdG1vZHVsZXMgPSBuZXcgRmlsZShsb2NhbERiLmdldFdvcmtUcmVlKCksCisJCQkJCUNvbnN0YW50cy5ET1RfR0lUX01PRFVMRVMpOworCQl9CiAJCS8vIFRoZSAuZ2l0bW9kdWxlcyBmaWxlIHNob3VsZCBoYXZlICdzdWJtb2R1bGUgImJhciInIGFuZCBzaG91bGRuJ3QKIAkJLy8gaGF2ZQogCQkvLyAnc3VibW9kdWxlICJmb28iJyBsaW5lcy4KLQkJRmlsZSBkb3Rtb2R1bGVzID0gbmV3IEZpbGUobG9jYWxEYi5nZXRXb3JrVHJlZSgpLAotCQkJCUNvbnN0YW50cy5ET1RfR0lUX01PRFVMRVMpOwotCQlsb2NhbERiLmNsb3NlKCk7Ci0JCUJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihkb3Rtb2R1bGVzKSk7Ci0JCWJvb2xlYW4gZm9vID0gZmFsc2U7Ci0JCWJvb2xlYW4gYmFyID0gZmFsc2U7Ci0JCXdoaWxlICh0cnVlKSB7Ci0JCQlTdHJpbmcgbGluZSA9IHJlYWRlci5yZWFkTGluZSgpOwotCQkJaWYgKGxpbmUgPT0gbnVsbCkKLQkJCQlicmVhazsKLQkJCWlmIChsaW5lLmNvbnRhaW5zKCJzdWJtb2R1bGUgXCJmb29cIiIpKQotCQkJCWZvbyA9IHRydWU7Ci0JCQlpZiAobGluZS5jb250YWlucygic3VibW9kdWxlIFwiYmFyXCIiKSkKLQkJCQliYXIgPSB0cnVlOworCQl0cnkgKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcigKKwkJCQluZXcgRmlsZVJlYWRlcihkb3Rtb2R1bGVzKSkpIHsKKwkJCWJvb2xlYW4gZm9vID0gZmFsc2U7CisJCQlib29sZWFuIGJhciA9IGZhbHNlOworCQkJd2hpbGUgKHRydWUpIHsKKwkJCQlTdHJpbmcgbGluZSA9IHJlYWRlci5yZWFkTGluZSgpOworCQkJCWlmIChsaW5lID09IG51bGwpCisJCQkJCWJyZWFrOworCQkJCWlmIChsaW5lLmNvbnRhaW5zKCJzdWJtb2R1bGUgXCJmb29cIiIpKQorCQkJCQlmb28gPSB0cnVlOworCQkJCWlmIChsaW5lLmNvbnRhaW5zKCJzdWJtb2R1bGUgXCJiYXJcIiIpKQorCQkJCQliYXIgPSB0cnVlOworCQkJfQorCQkJYXNzZXJ0VHJ1ZSgiVGhlIGJhciBzdWJtb2R1bGUgc2hvdWxkIGV4aXN0IiwgYmFyKTsKKwkJCWFzc2VydEZhbHNlKCJUaGUgZm9vIHN1Ym1vZHVsZSBzaG91bGRuJ3QgZXhpc3QiLCBmb28pOwogCQl9Ci0JCXJlYWRlci5jbG9zZSgpOwotCQlhc3NlcnRUcnVlKCJUaGUgYmFyIHN1Ym1vZHVsZSBzaG91bGQgZXhpc3QiLCBiYXIpOwotCQlhc3NlcnRGYWxzZSgiVGhlIGZvbyBzdWJtb2R1bGUgc2hvdWxkbid0IGV4aXN0IiwgZm9vKTsKIAl9CiAKIAlAVGVzdApAQCAtODk2LDM0ICs4NjgsMzcgQEAgcHVibGljIHZvaWQgdGVzdFJlbW92ZU92ZXJsYXBwaW5nQmFyZSgpIHRocm93cyBFeGNlcHRpb24gewogCQkJCS5zZXRVUkkocm9vdFVyaSkuY2FsbCgpOwogCQkvLyBDbG9uZSBpdAogCQlGaWxlIGRpcmVjdG9yeSA9IGNyZWF0ZVRlbXBEaXJlY3RvcnkoInRlc3RSZW1vdmVPdmVybGFwcGluZ0JhcmUiKTsKLQkJUmVwb3NpdG9yeSBsb2NhbERiID0gR2l0LmNsb25lUmVwb3NpdG9yeSgpLnNldERpcmVjdG9yeShkaXJlY3RvcnkpCisJCUZpbGUgZG90bW9kdWxlczsKKwkJdHJ5IChSZXBvc2l0b3J5IGxvY2FsRGIgPSBHaXQuY2xvbmVSZXBvc2l0b3J5KCkuc2V0RGlyZWN0b3J5KGRpcmVjdG9yeSkKIAkJCQkuc2V0VVJJKHJlbW90ZURiLmdldERpcmVjdG9yeSgpLnRvVVJJKCkudG9TdHJpbmcoKSkuY2FsbCgpCi0JCQkJLmdldFJlcG9zaXRvcnkoKTsKKwkJCQkuZ2V0UmVwb3NpdG9yeSgpKSB7CisJCQlkb3Rtb2R1bGVzID0gbmV3IEZpbGUobG9jYWxEYi5nZXRXb3JrVHJlZSgpLAorCQkJCUNvbnN0YW50cy5ET1RfR0lUX01PRFVMRVMpOworCQl9CisKIAkJLy8gVGhlIC5naXRtb2R1bGVzIGZpbGUgc2hvdWxkIGhhdmUgJ3N1Ym1vZHVsZSAiZm9vIicgYW5kIHNob3VsZG4ndAogCQkvLyBoYXZlCiAJCS8vICdzdWJtb2R1bGUgImZvby9iYXIiJyBsaW5lcy4KLQkJRmlsZSBkb3Rtb2R1bGVzID0gbmV3IEZpbGUobG9jYWxEYi5nZXRXb3JrVHJlZSgpLAotCQkJCUNvbnN0YW50cy5ET1RfR0lUX01PRFVMRVMpOwotCQlsb2NhbERiLmNsb3NlKCk7Ci0JCUJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihkb3Rtb2R1bGVzKSk7Ci0JCWJvb2xlYW4gZm9vID0gZmFsc2U7Ci0JCWJvb2xlYW4gZm9vYmFyID0gZmFsc2U7Ci0JCWJvb2xlYW4gYSA9IGZhbHNlOwotCQl3aGlsZSAodHJ1ZSkgewotCQkJU3RyaW5nIGxpbmUgPSByZWFkZXIucmVhZExpbmUoKTsKLQkJCWlmIChsaW5lID09IG51bGwpCi0JCQkJYnJlYWs7Ci0JCQlpZiAobGluZS5jb250YWlucygic3VibW9kdWxlIFwiZm9vXCIiKSkKLQkJCQlmb28gPSB0cnVlOwotCQkJaWYgKGxpbmUuY29udGFpbnMoInN1Ym1vZHVsZSBcImZvby9iYXJcIiIpKQotCQkJCWZvb2JhciA9IHRydWU7Ci0JCQlpZiAobGluZS5jb250YWlucygic3VibW9kdWxlIFwiYVwiIikpCi0JCQkJYSA9IHRydWU7CisJCXRyeSAoQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKAorCQkJCW5ldyBGaWxlUmVhZGVyKGRvdG1vZHVsZXMpKSkgeworCQkJYm9vbGVhbiBmb28gPSBmYWxzZTsKKwkJCWJvb2xlYW4gZm9vYmFyID0gZmFsc2U7CisJCQlib29sZWFuIGEgPSBmYWxzZTsKKwkJCXdoaWxlICh0cnVlKSB7CisJCQkJU3RyaW5nIGxpbmUgPSByZWFkZXIucmVhZExpbmUoKTsKKwkJCQlpZiAobGluZSA9PSBudWxsKQorCQkJCQlicmVhazsKKwkJCQlpZiAobGluZS5jb250YWlucygic3VibW9kdWxlIFwiZm9vXCIiKSkKKwkJCQkJZm9vID0gdHJ1ZTsKKwkJCQlpZiAobGluZS5jb250YWlucygic3VibW9kdWxlIFwiZm9vL2JhclwiIikpCisJCQkJCWZvb2JhciA9IHRydWU7CisJCQkJaWYgKGxpbmUuY29udGFpbnMoInN1Ym1vZHVsZSBcImFcIiIpKQorCQkJCQlhID0gdHJ1ZTsKKwkJCX0KKwkJCWFzc2VydFRydWUoIlRoZSBmb28gc3VibW9kdWxlIHNob3VsZCBleGlzdCIsIGZvbyk7CisJCQlhc3NlcnRGYWxzZSgiVGhlIGZvby9iYXIgc3VibW9kdWxlIHNob3VsZG4ndCBleGlzdCIsIGZvb2Jhcik7CisJCQlhc3NlcnRUcnVlKCJUaGUgYSBzdWJtb2R1bGUgc2hvdWxkIGV4aXN0IiwgYSk7CiAJCX0KLQkJcmVhZGVyLmNsb3NlKCk7Ci0JCWFzc2VydFRydWUoIlRoZSBmb28gc3VibW9kdWxlIHNob3VsZCBleGlzdCIsIGZvbyk7Ci0JCWFzc2VydEZhbHNlKCJUaGUgZm9vL2JhciBzdWJtb2R1bGUgc2hvdWxkbid0IGV4aXN0IiwgZm9vYmFyKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIGEgc3VibW9kdWxlIHNob3VsZCBleGlzdCIsIGEpOwogCX0KIAogCUBUZXN0CkBAIC05NTksMTEgKzkzNCwxMiBAQCBwdWJsaWMgdm9pZCB0ZXN0SW5jbHVkZVRhZygpIHRocm93cyBFeGNlcHRpb24gewogCQkJLmNhbGwoKTsKIAkJRmlsZSBoZWxsbyA9IG5ldyBGaWxlKGxvY2FsRGIuZ2V0V29ya1RyZWUoKSwgImZvby9oZWxsby50eHQiKTsKIAkJYXNzZXJ0VHJ1ZSgic3VibW9kdWxlIHNob3VsZCBiZSBjaGVja2VkIG91dCIsIGhlbGxvLmV4aXN0cygpKTsKLQkJQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGhlbGxvKSk7Ci0JCVN0cmluZyBjb250ZW50ID0gcmVhZGVyLnJlYWRMaW5lKCk7Ci0JCXJlYWRlci5jbG9zZSgpOwotCQlhc3NlcnRFcXVhbHMoInN1Ym1vZHVsZSBjb250ZW50IHNob3VsZCBiZSBhcyBleHBlY3RlZCIsCi0JCQkJIm1hc3RlciB3b3JsZCIsIGNvbnRlbnQpOworCQl0cnkgKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcigKKwkJCQluZXcgRmlsZVJlYWRlcihoZWxsbykpKSB7CisJCQlTdHJpbmcgY29udGVudCA9IHJlYWRlci5yZWFkTGluZSgpOworCQkJYXNzZXJ0RXF1YWxzKCJzdWJtb2R1bGUgY29udGVudCBzaG91bGQgYmUgYXMgZXhwZWN0ZWQiLAorCQkJCQkibWFzdGVyIHdvcmxkIiwgY29udGVudCk7CisJCX0KIAl9CiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0UmVtb3RlQWxpYXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTExNjUsMTEgKzExNDEsMTIgQEAgcHVibGljIHZvaWQgdGVzdFJlbW90ZVJldmlzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCQkuc2V0VVJJKHJvb3RVcmkpCiAJCQkuY2FsbCgpOwogCQlGaWxlIGhlbGxvID0gbmV3IEZpbGUoZGIuZ2V0V29ya1RyZWUoKSwgImZvby9oZWxsby50eHQiKTsKLQkJQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGhlbGxvKSk7Ci0JCVN0cmluZyBjb250ZW50ID0gcmVhZGVyLnJlYWRMaW5lKCk7Ci0JCXJlYWRlci5jbG9zZSgpOwotCQlhc3NlcnRFcXVhbHMoInN1Ym1vZHVsZSBjb250ZW50IHNob3VsZCBiZSBhcyBleHBlY3RlZCIsCi0JCQkJImJyYW5jaCB3b3JsZCIsIGNvbnRlbnQpOworCQl0cnkgKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcigKKwkJCQluZXcgRmlsZVJlYWRlcihoZWxsbykpKSB7CisJCQlTdHJpbmcgY29udGVudCA9IHJlYWRlci5yZWFkTGluZSgpOworCQkJYXNzZXJ0RXF1YWxzKCJzdWJtb2R1bGUgY29udGVudCBzaG91bGQgYmUgYXMgZXhwZWN0ZWQiLAorCQkJCQkiYnJhbmNoIHdvcmxkIiwgY29udGVudCk7CisJCX0KIAl9CiAKIAlAVGVzdApAQCAtMTE5MSwxMSArMTE2OCwxMiBAQCBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFJlbW90ZVJldmlzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCQkuc2V0VVJJKHJvb3RVcmkpCiAJCQkuY2FsbCgpOwogCQlGaWxlIGhlbGxvID0gbmV3IEZpbGUoZGIuZ2V0V29ya1RyZWUoKSwgImZvby9oZWxsby50eHQiKTsKLQkJQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGhlbGxvKSk7Ci0JCVN0cmluZyBjb250ZW50ID0gcmVhZGVyLnJlYWRMaW5lKCk7Ci0JCXJlYWRlci5jbG9zZSgpOwotCQlhc3NlcnRFcXVhbHMoInN1Ym1vZHVsZSBjb250ZW50IHNob3VsZCBiZSBhcyBleHBlY3RlZCIsCi0JCQkJImJyYW5jaCB3b3JsZCIsIGNvbnRlbnQpOworCQl0cnkgKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcigKKwkJCQluZXcgRmlsZVJlYWRlcihoZWxsbykpKSB7CisJCQlTdHJpbmcgY29udGVudCA9IHJlYWRlci5yZWFkTGluZSgpOworCQkJYXNzZXJ0RXF1YWxzKCJzdWJtb2R1bGUgY29udGVudCBzaG91bGQgYmUgYXMgZXhwZWN0ZWQiLAorCQkJCQkiYnJhbmNoIHdvcmxkIiwgY29udGVudCk7CisJCX0KIAl9CiAKIAlwcml2YXRlIHZvaWQgcmVzb2x2ZVJlbGF0aXZlVXJpcygpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pZ25vcmUvQ0dpdElnbm9yZVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pZ25vcmUvQ0dpdElnbm9yZVRlc3QuamF2YQppbmRleCAzYjExNjE2Li4wYzZlZDBjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaWdub3JlL0NHaXRJZ25vcmVUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2lnbm9yZS9DR2l0SWdub3JlVGVzdC5qYXZhCkBAIC0xNDEsNyArMTQxLDkgQEAgcHJpdmF0ZSB2b2lkIGpnaXRJZ25vcmVkQW5kVW50cmFja2VkKExpbmtlZEhhc2hTZXQ8U3RyaW5nPiBpZ25vcmVkLAogCQkvLyBEbyBhIHRyZWUgd2FsayB0aGF0IGRvZXMgZGVzY2VuZCBpbnRvIGlnbm9yZWQgZGlyZWN0b3JpZXMgYW5kIHJldHVybgogCQkvLyBhIGxpc3Qgb2YgYWxsIGlnbm9yZWQgZmlsZXMKIAkJdHJ5IChUcmVlV2FsayB3YWxrID0gbmV3IFRyZWVXYWxrKGRiKSkgewotCQkJd2Fsay5hZGRUcmVlKG5ldyBGaWxlVHJlZUl0ZXJhdG9yKGRiKSk7CisJCQlGaWxlVHJlZUl0ZXJhdG9yIGl0ZXIgPSBuZXcgRmlsZVRyZWVJdGVyYXRvcihkYik7CisJCQlpdGVyLnNldFdhbGtJZ25vcmVkRGlyZWN0b3JpZXModHJ1ZSk7CisJCQl3YWxrLmFkZFRyZWUoaXRlcik7CiAJCQl3YWxrLnNldFJlY3Vyc2l2ZSh0cnVlKTsKIAkJCXdoaWxlICh3YWxrLm5leHQoKSkgewogCQkJCWlmICh3YWxrLmdldFRyZWUoV29ya2luZ1RyZWVJdGVyYXRvci5jbGFzcykuaXNFbnRyeUlnbm9yZWQoKSkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2lnbm9yZS9JZ25vcmVOb2RlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2lnbm9yZS9JZ25vcmVOb2RlVGVzdC5qYXZhCmluZGV4IGNjYzY0ZmIuLjc4ZDlhODIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pZ25vcmUvSWdub3JlTm9kZVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaWdub3JlL0lnbm9yZU5vZGVUZXN0LmphdmEKQEAgLTQyLDcgKzQyLDcgQEAKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0Lmlnbm9yZTsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwpAQCAtNTYsNyArNTYsNiBAQAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaWdub3JlLklnbm9yZU5vZGUuTWF0Y2hSZXN1bHQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5SZXBvc2l0b3J5VGVzdENhc2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuRmlsZU1vZGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5GaWxlVHJlZUl0ZXJhdG9yOwpAQCAtNTQ2LDE5ICs1NDUsNiBAQCBwdWJsaWMgdm9pZCB0ZXN0SW5lZmZlY3RpdmVOZWdhdGlvbkRpZmZlcmVudExldmVsczUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQllbmRXYWxrKCk7CiAJfQogCi0JQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eUlnbm9yZU5vZGUoKSB7Ci0JCS8vIFJ1bGVzIGFyZSBuZXZlciBlbXB0eTogV29ya2luZ1RyZWVJdGVyYXRvciBvcHRpbWl6ZXMgZW1wdHkgZmlsZXMgYXdheQotCQkvLyBTbyB3ZSBoYXZlIHRvIHRlc3QgaXQgbWFudWFsbHkgaW4gY2FzZSB0aGlyZCBwYXJ0eSBjbGllbnRzIHVzZQotCQkvLyBJZ25vcmVOb2RlIGRpcmVjdGx5LgotCQlJZ25vcmVOb2RlIG5vZGUgPSBuZXcgSWdub3JlTm9kZSgpOwotCQlhc3NlcnRFcXVhbHMoTWF0Y2hSZXN1bHQuQ0hFQ0tfUEFSRU5ULCBub2RlLmlzSWdub3JlZCgiIiwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hdGNoUmVzdWx0LkNIRUNLX1BBUkVOVCwgbm9kZS5pc0lnbm9yZWQoIiIsIGZhbHNlLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoTWF0Y2hSZXN1bHQuQ0hFQ0tfUEFSRU5UX05FR0FURV9GSVJTVF9NQVRDSCwKLQkJCQlub2RlLmlzSWdub3JlZCgiIiwgZmFsc2UsIHRydWUpKTsKLQl9Ci0KIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RFbXB0eUlnbm9yZVJ1bGVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJSWdub3JlTm9kZSBub2RlID0gbmV3IElnbm9yZU5vZGUoKTsKQEAgLTc0Niw3ICs3MzIsOSBAQCBwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogCXByaXZhdGUgdm9pZCBiZWdpbldhbGsoKSB7CiAJCXdhbGsgPSBuZXcgVHJlZVdhbGsoZGIpOwotCQl3YWxrLmFkZFRyZWUobmV3IEZpbGVUcmVlSXRlcmF0b3IoZGIpKTsKKwkJRmlsZVRyZWVJdGVyYXRvciBpdGVyID0gbmV3IEZpbGVUcmVlSXRlcmF0b3IoZGIpOworCQlpdGVyLnNldFdhbGtJZ25vcmVkRGlyZWN0b3JpZXModHJ1ZSk7CisJCXdhbGsuYWRkVHJlZShpdGVyKTsKIAl9CiAKIAlwcml2YXRlIHZvaWQgZW5kV2FsaygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC03NzksNiArNzY3LDYgQEAgcHJpdmF0ZSBJbnB1dFN0cmVhbSB3cml0ZVRvU3RyaW5nKFN0cmluZy4uLiBydWxlcykgewogCQlmb3IgKFN0cmluZyBsaW5lIDogcnVsZXMpIHsKIAkJCWRhdGEuYXBwZW5kKGxpbmUgKyAiXG4iKTsKIAkJfQotCQlyZXR1cm4gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGRhdGEudG9TdHJpbmcoKS5nZXRCeXRlcyhVVEZfOCkpOworCQlyZXR1cm4gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGRhdGEudG9TdHJpbmcoKS5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2luZGV4ZGlmZi9JbmRleERpZmZXaXRoU3ltbGlua1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbmRleGRpZmYvSW5kZXhEaWZmV2l0aFN5bWxpbmtUZXN0LmphdmEKaW5kZXggZDVkMzg1Ny4uMjZjMTFjNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2luZGV4ZGlmZi9JbmRleERpZmZXaXRoU3ltbGlua1Rlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW5kZXhkaWZmL0luZGV4RGlmZldpdGhTeW1saW5rVGVzdC5qYXZhCkBAIC00MSw3ICs0MSw3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5pbmRleGRpZmY7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRBcnJheUVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKQEAgLTEyOCw3ICsxMjgsNyBAQCBwcml2YXRlIEZpbGUgcmVzdG9yZUdpdFJlcG8oSW5wdXRTdHJlYW0gaW4sIEZpbGUgdGVzdERpciwgU3RyaW5nIG5hbWUpCiAJCUZpbGUgcmVzdG9yZVNjcmlwdCA9IG5ldyBGaWxlKHRlc3REaXIsIG5hbWUgKyAiLnNoIik7CiAJCXRyeSAoT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbSgKIAkJCQluZXcgRmlsZU91dHB1dFN0cmVhbShyZXN0b3JlU2NyaXB0KSk7Ci0JCQkJV3JpdGVyIHdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0LCBVVEZfOCkpIHsKKwkJCQlXcml0ZXIgd3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihvdXQsIENIQVJTRVQpKSB7CiAJCQl3cml0ZXIud3JpdGUoImVjaG8gYHdoaWNoIGdpdGAgMT4mMlxuIik7CiAJCQl3cml0ZXIud3JpdGUoImVjaG8gYGdpdCAtLXZlcnNpb25gIDE+JjJcbiIpOwogCQkJd3JpdGVyLndyaXRlKCJnaXQgaW5pdCAiICsgbmFtZSArICIgJiYgXFxcbiIpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9Db25jdXJyZW50UmVwYWNrVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9Db25jdXJyZW50UmVwYWNrVGVzdC5qYXZhCmluZGV4IDQ4MTNkMjguLjY0M2RhYTUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvQ29uY3VycmVudFJlcGFja1Rlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0NvbmN1cnJlbnRSZXBhY2tUZXN0LmphdmEKQEAgLTIxMCwxNyArMjEwLDE3IEBAIHByaXZhdGUgc3RhdGljIHZvaWQgd2hhY2tDYWNoZSgpIHsKIAkJY29uZmlnLmluc3RhbGwoKTsKIAl9CiAKLQlwcml2YXRlIFJldk9iamVjdCBwYXJzZShmaW5hbCBBbnlPYmplY3RJZCBpZCkKKwlwcml2YXRlIFJldk9iamVjdCBwYXJzZShBbnlPYmplY3RJZCBpZCkKIAkJCXRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCXRyeSAoUmV2V2FsayBydyA9IG5ldyBSZXZXYWxrKGRiKSkgewogCQkJcmV0dXJuIHJ3LnBhcnNlQW55KGlkKTsKIAkJfQogCX0KIAotCXByaXZhdGUgRmlsZVtdIHBhY2soZmluYWwgUmVwb3NpdG9yeSBzcmMsIGZpbmFsIFJldk9iamVjdC4uLiBsaXN0KQorCXByaXZhdGUgRmlsZVtdIHBhY2soUmVwb3NpdG9yeSBzcmMsIFJldk9iamVjdC4uLiBsaXN0KQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJdHJ5IChQYWNrV3JpdGVyIHB3ID0gbmV3IFBhY2tXcml0ZXIoc3JjKSkgewotCQkJZm9yIChmaW5hbCBSZXZPYmplY3QgbyA6IGxpc3QpIHsKKwkJCWZvciAoUmV2T2JqZWN0IG8gOiBsaXN0KSB7CiAJCQkJcHcuYWRkT2JqZWN0KG8pOwogCQkJfQogCkBAIC0yMzMsNyArMjMzLDcgQEAgcHJpdmF0ZSBSZXZPYmplY3QgcGFyc2UoZmluYWwgQW55T2JqZWN0SWQgaWQpCiAJCX0KIAl9CiAKLQlwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlKGZpbmFsIEZpbGVbXSBmaWxlcywgZmluYWwgUGFja1dyaXRlciBwdykKKwlwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlKEZpbGVbXSBmaWxlcywgUGFja1dyaXRlciBwdykKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIGxvbmcgYmVnaW4gPSBmaWxlc1swXS5nZXRQYXJlbnRGaWxlKCkubGFzdE1vZGlmaWVkKCk7CiAJCU51bGxQcm9ncmVzc01vbml0b3IgbSA9IE51bGxQcm9ncmVzc01vbml0b3IuSU5TVEFOQ0U7CkBAIC0yNTEsMTYgKzI1MSwxNiBAQCBwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlKGZpbmFsIEZpbGVbXSBmaWxlcywgZmluYWwgUGFja1dyaXRlciBwdykKIAkJdG91Y2goYmVnaW4sIGZpbGVzWzBdLmdldFBhcmVudEZpbGUoKSk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBkZWxldGUoZmluYWwgRmlsZVtdIGxpc3QpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBkZWxldGUoRmlsZVtdIGxpc3QpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIGxvbmcgYmVnaW4gPSBsaXN0WzBdLmdldFBhcmVudEZpbGUoKS5sYXN0TW9kaWZpZWQoKTsKLQkJZm9yIChmaW5hbCBGaWxlIGYgOiBsaXN0KSB7CisJCWZvciAoRmlsZSBmIDogbGlzdCkgewogCQkJRmlsZVV0aWxzLmRlbGV0ZShmKTsKIAkJCWFzc2VydEZhbHNlKGYgKyAiIHdhcyByZW1vdmVkIiwgZi5leGlzdHMoKSk7CiAJCX0KIAkJdG91Y2goYmVnaW4sIGxpc3RbMF0uZ2V0UGFyZW50RmlsZSgpKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyB2b2lkIHRvdWNoKGZpbmFsIGxvbmcgYmVnaW4sIGZpbmFsIEZpbGUgZGlyKSB7CisJcHJpdmF0ZSBzdGF0aWMgdm9pZCB0b3VjaChsb25nIGJlZ2luLCBGaWxlIGRpcikgewogCQl3aGlsZSAoYmVnaW4gPj0gZGlyLmxhc3RNb2RpZmllZCgpKSB7CiAJCQl0cnkgewogCQkJCVRocmVhZC5zbGVlcCgyNSk7CkBAIC0yNzEsMTIgKzI3MSwxMiBAQCBwcml2YXRlIHN0YXRpYyB2b2lkIHRvdWNoKGZpbmFsIGxvbmcgYmVnaW4sIGZpbmFsIEZpbGUgZGlyKSB7CiAJCX0KIAl9CiAKLQlwcml2YXRlIEZpbGUgZnVsbFBhY2tGaWxlTmFtZShmaW5hbCBPYmplY3RJZCBuYW1lLCBmaW5hbCBTdHJpbmcgc3VmZml4KSB7CisJcHJpdmF0ZSBGaWxlIGZ1bGxQYWNrRmlsZU5hbWUoT2JqZWN0SWQgbmFtZSwgU3RyaW5nIHN1ZmZpeCkgewogCQlmaW5hbCBGaWxlIHBhY2tkaXIgPSBkYi5nZXRPYmplY3REYXRhYmFzZSgpLmdldFBhY2tEaXJlY3RvcnkoKTsKIAkJcmV0dXJuIG5ldyBGaWxlKHBhY2tkaXIsICJwYWNrLSIgKyBuYW1lLm5hbWUoKSArIHN1ZmZpeCk7CiAJfQogCi0JcHJpdmF0ZSBSZXZPYmplY3Qgd3JpdGVCbG9iKGZpbmFsIFJlcG9zaXRvcnkgcmVwbywgZmluYWwgU3RyaW5nIGRhdGEpCisJcHJpdmF0ZSBSZXZPYmplY3Qgd3JpdGVCbG9iKFJlcG9zaXRvcnkgcmVwbywgU3RyaW5nIGRhdGEpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBieXRlW10gYnl0ZXMgPSBDb25zdGFudHMuZW5jb2RlKGRhdGEpOwogCQlmaW5hbCBPYmplY3RJZCBpZDsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0ZpbGVUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tGaWxlVGVzdC5qYXZhCmluZGV4IDkxYmQ1MjMuLjA0ZmNjZjMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0ZpbGVUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrRmlsZVRlc3QuamF2YQpAQCAtMTQ2LDE1ICsxNDYsMTUgQEAgcHVibGljIHZvaWQgdGVzdFdob2xlX1NtYWxsT2JqZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWFzc2VydEZhbHNlKCJpcyBub3QgbGFyZ2UiLCBvbC5pc0xhcmdlKCkpOwogCQlhc3NlcnRUcnVlKCJzYW1lIGNvbnRlbnQiLCBBcnJheXMuZXF1YWxzKGRhdGEsIG9sLmdldENhY2hlZEJ5dGVzKCkpKTsKIAotCQlPYmplY3RTdHJlYW0gaW4gPSBvbC5vcGVuU3RyZWFtKCk7Ci0JCWFzc2VydE5vdE51bGwoImhhdmUgc3RyZWFtIiwgaW4pOwotCQlhc3NlcnRFcXVhbHModHlwZSwgaW4uZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGRhdGEubGVuZ3RoLCBpbi5nZXRTaXplKCkpOwotCQlieXRlW10gZGF0YTIgPSBuZXcgYnl0ZVtkYXRhLmxlbmd0aF07Ci0JCUlPLnJlYWRGdWxseShpbiwgZGF0YTIsIDAsIGRhdGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZSgic2FtZSBjb250ZW50IiwgQXJyYXlzLmVxdWFscyhkYXRhMiwgZGF0YSkpOwotCQlhc3NlcnRFcXVhbHMoInN0cmVhbSBhdCBFT0YiLCAtMSwgaW4ucmVhZCgpKTsKLQkJaW4uY2xvc2UoKTsKKwkJdHJ5IChPYmplY3RTdHJlYW0gaW4gPSBvbC5vcGVuU3RyZWFtKCkpIHsKKwkJCWFzc2VydE5vdE51bGwoImhhdmUgc3RyZWFtIiwgaW4pOworCQkJYXNzZXJ0RXF1YWxzKHR5cGUsIGluLmdldFR5cGUoKSk7CisJCQlhc3NlcnRFcXVhbHMoZGF0YS5sZW5ndGgsIGluLmdldFNpemUoKSk7CisJCQlieXRlW10gZGF0YTIgPSBuZXcgYnl0ZVtkYXRhLmxlbmd0aF07CisJCQlJTy5yZWFkRnVsbHkoaW4sIGRhdGEyLCAwLCBkYXRhLmxlbmd0aCk7CisJCQlhc3NlcnRUcnVlKCJzYW1lIGNvbnRlbnQiLCBBcnJheXMuZXF1YWxzKGRhdGEyLCBkYXRhKSk7CisJCQlhc3NlcnRFcXVhbHMoInN0cmVhbSBhdCBFT0YiLCAtMSwgaW4ucmVhZCgpKTsKKwkJfQogCX0KIAogCUBUZXN0CkBAIC0xODAsMTUgKzE4MCwxNSBAQCBwdWJsaWMgdm9pZCB0ZXN0V2hvbGVfTGFyZ2VPYmplY3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCQkJLmdldE1lc3NhZ2UoKSk7CiAJCX0KIAotCQlPYmplY3RTdHJlYW0gaW4gPSBvbC5vcGVuU3RyZWFtKCk7Ci0JCWFzc2VydE5vdE51bGwoImhhdmUgc3RyZWFtIiwgaW4pOwotCQlhc3NlcnRFcXVhbHModHlwZSwgaW4uZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGRhdGEubGVuZ3RoLCBpbi5nZXRTaXplKCkpOwotCQlieXRlW10gZGF0YTIgPSBuZXcgYnl0ZVtkYXRhLmxlbmd0aF07Ci0JCUlPLnJlYWRGdWxseShpbiwgZGF0YTIsIDAsIGRhdGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZSgic2FtZSBjb250ZW50IiwgQXJyYXlzLmVxdWFscyhkYXRhMiwgZGF0YSkpOwotCQlhc3NlcnRFcXVhbHMoInN0cmVhbSBhdCBFT0YiLCAtMSwgaW4ucmVhZCgpKTsKLQkJaW4uY2xvc2UoKTsKKwkJdHJ5IChPYmplY3RTdHJlYW0gaW4gPSBvbC5vcGVuU3RyZWFtKCkpIHsKKwkJCWFzc2VydE5vdE51bGwoImhhdmUgc3RyZWFtIiwgaW4pOworCQkJYXNzZXJ0RXF1YWxzKHR5cGUsIGluLmdldFR5cGUoKSk7CisJCQlhc3NlcnRFcXVhbHMoZGF0YS5sZW5ndGgsIGluLmdldFNpemUoKSk7CisJCQlieXRlW10gZGF0YTIgPSBuZXcgYnl0ZVtkYXRhLmxlbmd0aF07CisJCQlJTy5yZWFkRnVsbHkoaW4sIGRhdGEyLCAwLCBkYXRhLmxlbmd0aCk7CisJCQlhc3NlcnRUcnVlKCJzYW1lIGNvbnRlbnQiLCBBcnJheXMuZXF1YWxzKGRhdGEyLCBkYXRhKSk7CisJCQlhc3NlcnRFcXVhbHMoInN0cmVhbSBhdCBFT0YiLCAtMSwgaW4ucmVhZCgpKTsKKwkJfQogCX0KIAogCUBUZXN0CkBAIC0yMzksMTUgKzIzOSwxNSBAQCBwdWJsaWMgdm9pZCB0ZXN0RGVsdGFfU21hbGxPYmplY3RDaGFpbigpIHRocm93cyBFeGNlcHRpb24gewogCQkJYXNzZXJ0Tm90TnVsbChvbC5nZXRDYWNoZWRCeXRlcygpKTsKIAkJCWFzc2VydEFycmF5RXF1YWxzKGRhdGEzLCBvbC5nZXRDYWNoZWRCeXRlcygpKTsKIAotCQkJT2JqZWN0U3RyZWFtIGluID0gb2wub3BlblN0cmVhbSgpOwotCQkJYXNzZXJ0Tm90TnVsbCgiaGF2ZSBzdHJlYW0iLCBpbik7Ci0JCQlhc3NlcnRFcXVhbHMoQ29uc3RhbnRzLk9CSl9CTE9CLCBpbi5nZXRUeXBlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKGRhdGEzLmxlbmd0aCwgaW4uZ2V0U2l6ZSgpKTsKLQkJCWJ5dGVbXSBhY3QgPSBuZXcgYnl0ZVtkYXRhMy5sZW5ndGhdOwotCQkJSU8ucmVhZEZ1bGx5KGluLCBhY3QsIDAsIGRhdGEzLmxlbmd0aCk7Ci0JCQlhc3NlcnRUcnVlKCJzYW1lIGNvbnRlbnQiLCBBcnJheXMuZXF1YWxzKGFjdCwgZGF0YTMpKTsKLQkJCWFzc2VydEVxdWFscygic3RyZWFtIGF0IEVPRiIsIC0xLCBpbi5yZWFkKCkpOwotCQkJaW4uY2xvc2UoKTsKKwkJCXRyeSAoT2JqZWN0U3RyZWFtIGluID0gb2wub3BlblN0cmVhbSgpKSB7CisJCQkJYXNzZXJ0Tm90TnVsbCgiaGF2ZSBzdHJlYW0iLCBpbik7CisJCQkJYXNzZXJ0RXF1YWxzKENvbnN0YW50cy5PQkpfQkxPQiwgaW4uZ2V0VHlwZSgpKTsKKwkJCQlhc3NlcnRFcXVhbHMoZGF0YTMubGVuZ3RoLCBpbi5nZXRTaXplKCkpOworCQkJCWJ5dGVbXSBhY3QgPSBuZXcgYnl0ZVtkYXRhMy5sZW5ndGhdOworCQkJCUlPLnJlYWRGdWxseShpbiwgYWN0LCAwLCBkYXRhMy5sZW5ndGgpOworCQkJCWFzc2VydFRydWUoInNhbWUgY29udGVudCIsIEFycmF5cy5lcXVhbHMoYWN0LCBkYXRhMykpOworCQkJCWFzc2VydEVxdWFscygic3RyZWFtIGF0IEVPRiIsIC0xLCBpbi5yZWFkKCkpOworCQkJfQogCQl9CiAJfQogCkBAIC0yODIsMjIgKzI4MiwxNiBAQCBwdWJsaWMgdm9pZCB0ZXN0RGVsdGFfRmFpbHNPdmVyMkdpQigpIHRocm93cyBFeGNlcHRpb24gewogCQkJRmlsZSBwYWNrTmFtZSA9IG5ldyBGaWxlKGRpciwgaWRBLm5hbWUoKSArICIucGFjayIpOwogCQkJRmlsZSBpZHhOYW1lID0gbmV3IEZpbGUoZGlyLCBpZEEubmFtZSgpICsgIi5pZHgiKTsKIAotCQkJRmlsZU91dHB1dFN0cmVhbSBmID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0ocGFja05hbWUpOwotCQkJdHJ5IHsKKwkJCXRyeSAoRmlsZU91dHB1dFN0cmVhbSBmID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0ocGFja05hbWUpKSB7CiAJCQkJZi53cml0ZShwYWNrLnRvQnl0ZUFycmF5KCkpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlmLmNsb3NlKCk7CiAJCQl9CiAKLQkJCWYgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShpZHhOYW1lKTsKLQkJCXRyeSB7CisJCQl0cnkgKEZpbGVPdXRwdXRTdHJlYW0gZiA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGlkeE5hbWUpKSB7CiAJCQkJTGlzdDxQYWNrZWRPYmplY3RJbmZvPiBsaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CiAJCQkJbGlzdC5hZGQoYSk7CiAJCQkJbGlzdC5hZGQoYik7CiAJCQkJQ29sbGVjdGlvbnMuc29ydChsaXN0KTsKIAkJCQluZXcgUGFja0luZGV4V3JpdGVyVjEoZikud3JpdGUobGlzdCwgZm9vdGVyKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJZi5jbG9zZSgpOwogCQkJfQogCiAJCQlQYWNrRmlsZSBwYWNrRmlsZSA9IG5ldyBQYWNrRmlsZShwYWNrTmFtZSwgUGFja0V4dC5JTkRFWC5nZXRCaXQoKSk7CkBAIC0zMjEsMTYgKzMxNSwxNyBAQCBwdWJsaWMgdm9pZCB0ZXN0Q29uZmlndXJhYmxlU3RyZWFtRmlsZVRocmVzaG9sZCgpIHRocm93cyBFeGNlcHRpb24gewogCQlhc3NlcnRUcnVlKCJoYXMgYmxvYiIsIHdjLmhhcyhpZCkpOwogCiAJCU9iamVjdExvYWRlciBvbCA9IHdjLm9wZW4oaWQpOwotCQlPYmplY3RTdHJlYW0gaW4gPSBvbC5vcGVuU3RyZWFtKCk7Ci0JCWFzc2VydFRydWUoaW4gaW5zdGFuY2VvZiBPYmplY3RTdHJlYW0uU21hbGxTdHJlYW0pOwotCQlhc3NlcnRFcXVhbHMoMzAwLCBpbi5hdmFpbGFibGUoKSk7Ci0JCWluLmNsb3NlKCk7CisJCXRyeSAoT2JqZWN0U3RyZWFtIGluID0gb2wub3BlblN0cmVhbSgpKSB7CisJCQlhc3NlcnRUcnVlKGluIGluc3RhbmNlb2YgT2JqZWN0U3RyZWFtLlNtYWxsU3RyZWFtKTsKKwkJCWFzc2VydEVxdWFscygzMDAsIGluLmF2YWlsYWJsZSgpKTsKKwkJfQogCiAJCXdjLnNldFN0cmVhbUZpbGVUaHJlc2hvbGQoMjk5KTsKIAkJb2wgPSB3Yy5vcGVuKGlkKTsKLQkJaW4gPSBvbC5vcGVuU3RyZWFtKCk7Ci0JCWFzc2VydFRydWUoaW4gaW5zdGFuY2VvZiBPYmplY3RTdHJlYW0uRmlsdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGluLmF2YWlsYWJsZSgpKTsKKwkJdHJ5IChPYmplY3RTdHJlYW0gaW4gPSBvbC5vcGVuU3RyZWFtKCkpIHsKKwkJCWFzc2VydFRydWUoaW4gaW5zdGFuY2VvZiBPYmplY3RTdHJlYW0uRmlsdGVyKTsKKwkJCWFzc2VydEVxdWFscygxLCBpbi5hdmFpbGFibGUoKSk7CisJCX0KIAl9CiAKIAlwcml2YXRlIHN0YXRpYyBieXRlW10gY2xvbmUoaW50IGZpcnN0LCBieXRlW10gYmFzZSkgewpAQCAtMzcyLDcgKzM2Nyw3IEBAIHByaXZhdGUgc3RhdGljIHZvaWQgb2JqZWN0SGVhZGVyKFRlbXBvcmFyeUJ1ZmZlci5IZWFwIHBhY2ssIGludCB0eXBlLCBpbnQgc3opCiAJCXBhY2sud3JpdGUoYnVmLCAwLCBuKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGRlZmxhdGUoVGVtcG9yYXJ5QnVmZmVyLkhlYXAgcGFjaywgZmluYWwgYnl0ZVtdIGNvbnRlbnQpCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBkZWZsYXRlKFRlbXBvcmFyeUJ1ZmZlci5IZWFwIHBhY2ssIGJ5dGVbXSBjb250ZW50KQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgRGVmbGF0ZXIgZGVmbGF0ZXIgPSBuZXcgRGVmbGF0ZXIoKTsKIAkJZmluYWwgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzEyOF07CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tXcml0ZXJUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tXcml0ZXJUZXN0LmphdmEKaW5kZXggMzc5NDMyZC4uMDRiZWQwOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrV3JpdGVyVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja1dyaXRlclRlc3QuamF2YQpAQCAtMzY4LDcgKzM2OCw3IEBAIHB1YmxpYyB2b2lkIHRlc3RXcml0ZVBhY2szKCkgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJCQlPYmplY3RJZC5mcm9tU3RyaW5nKCI5MDJkNTQ3NmZhMjQ5YjdhYmM5ZDg0YzYxMTU3N2E4MTM4MWYwMzI3IiksCiAJCQkJT2JqZWN0SWQuZnJvbVN0cmluZygiNmZmODdjNDY2NDk4MWU0Mzk3NjI1NzkxYzhlYTNiYmI1ZjIyNzlhMyIpICwKIAkJCQlPYmplY3RJZC5mcm9tU3RyaW5nKCI1YjZlN2M2NmMyNzZlNzYxMGQ0YTczYzcwZWMxYTFmN2MxMDAzMjU5IikgfTsKLQkJdHJ5IChmaW5hbCBSZXZXYWxrIHBhcnNlciA9IG5ldyBSZXZXYWxrKGRiKSkgeworCQl0cnkgKFJldldhbGsgcGFyc2VyID0gbmV3IFJldldhbGsoZGIpKSB7CiAJCQlmaW5hbCBSZXZPYmplY3QgZm9yY2VkT3JkZXJSZXZzW10gPSBuZXcgUmV2T2JqZWN0W2ZvcmNlZE9yZGVyLmxlbmd0aF07CiAJCQlmb3IgKGludCBpID0gMDsgaSA8IGZvcmNlZE9yZGVyLmxlbmd0aDsgaSsrKQogCQkJCWZvcmNlZE9yZGVyUmV2c1tpXSA9IHBhcnNlci5wYXJzZUFueShmb3JjZWRPcmRlcltpXSk7CkBAIC01MTUsMTEgKzUxNSw4IEBAIHB1YmxpYyB2b2lkIHRlc3RXcml0ZUluZGV4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKIAkJLy8gVmFsaWRhdGUgdGhhdCBhbiBpbmRleCB3cml0dGVuIGJ5IFBhY2tXcml0ZXIgaXMgdGhlIHNhbWUuCiAJCWZpbmFsIEZpbGUgaWR4MkZpbGUgPSBuZXcgRmlsZShpbmRleEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiLjIiKTsKLQkJZmluYWwgRmlsZU91dHB1dFN0cmVhbSBpcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGlkeDJGaWxlKTsKLQkJdHJ5IHsKKwkJdHJ5IChGaWxlT3V0cHV0U3RyZWFtIGlzID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oaWR4MkZpbGUpKSB7CiAJCQl3cml0ZXIud3JpdGVJbmRleChpcyk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpcy5jbG9zZSgpOwogCQl9CiAJCWZpbmFsIFBhY2tJbmRleCBpZHgyID0gUGFja0luZGV4Lm9wZW4oaWR4MkZpbGUpOwogCQlhc3NlcnRUcnVlKGlkeDIgaW5zdGFuY2VvZiBQYWNrSW5kZXhWMik7CkBAIC03MTUsMTQgKzcxMiwxNCBAQCBwcml2YXRlIHN0YXRpYyBQYWNrSW5kZXggd3JpdGVQYWNrKEZpbGVSZXBvc2l0b3J5IHJlcG8sIFJldldhbGsgd2FsaywKIAkJCVN0cmluZyBpZCA9IHB3LmNvbXB1dGVOYW1lKCkuZ2V0TmFtZSgpOwogCQkJRmlsZSBwYWNrZGlyID0gcmVwby5nZXRPYmplY3REYXRhYmFzZSgpLmdldFBhY2tEaXJlY3RvcnkoKTsKIAkJCUZpbGUgcGFja0ZpbGUgPSBuZXcgRmlsZShwYWNrZGlyLCAicGFjay0iICsgaWQgKyAiLnBhY2siKTsKLQkJCUZpbGVPdXRwdXRTdHJlYW0gcGFja09TID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0ocGFja0ZpbGUpOwotCQkJcHcud3JpdGVQYWNrKE51bGxQcm9ncmVzc01vbml0b3IuSU5TVEFOQ0UsCi0JCQkJCU51bGxQcm9ncmVzc01vbml0b3IuSU5TVEFOQ0UsIHBhY2tPUyk7Ci0JCQlwYWNrT1MuY2xvc2UoKTsKKwkJCXRyeSAoRmlsZU91dHB1dFN0cmVhbSBwYWNrT1MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShwYWNrRmlsZSkpIHsKKwkJCQlwdy53cml0ZVBhY2soTnVsbFByb2dyZXNzTW9uaXRvci5JTlNUQU5DRSwKKwkJCQkJCU51bGxQcm9ncmVzc01vbml0b3IuSU5TVEFOQ0UsIHBhY2tPUyk7CisJCQl9CiAJCQlGaWxlIGlkeEZpbGUgPSBuZXcgRmlsZShwYWNrZGlyLCAicGFjay0iICsgaWQgKyAiLmlkeCIpOwotCQkJRmlsZU91dHB1dFN0cmVhbSBpZHhPUyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGlkeEZpbGUpOwotCQkJcHcud3JpdGVJbmRleChpZHhPUyk7Ci0JCQlpZHhPUy5jbG9zZSgpOworCQkJdHJ5IChGaWxlT3V0cHV0U3RyZWFtIGlkeE9TID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oaWR4RmlsZSkpIHsKKwkJCQlwdy53cml0ZUluZGV4KGlkeE9TKTsKKwkJCX0KIAkJCXJldHVybiBQYWNrSW5kZXgub3BlbihpZHhGaWxlKTsKIAkJfQogCX0KQEAgLTgzOCw3ICs4MzUsNyBAQCBwcml2YXRlIHZvaWQgY3JlYXRlVmVyaWZ5T3BlblBhY2soZmluYWwgU2V0PE9iamVjdElkPiBpbnRlcmVzdGluZ3MsCiAJCXZlcmlmeU9wZW5QYWNrKHRoaW4pOwogCX0KIAotCXByaXZhdGUgdm9pZCBjcmVhdGVWZXJpZnlPcGVuUGFjayhmaW5hbCBMaXN0PFJldk9iamVjdD4gb2JqZWN0U291cmNlKQorCXByaXZhdGUgdm9pZCBjcmVhdGVWZXJpZnlPcGVuUGFjayhMaXN0PFJldk9iamVjdD4gb2JqZWN0U291cmNlKQogCQkJdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJTnVsbFByb2dyZXNzTW9uaXRvciBtID0gTnVsbFByb2dyZXNzTW9uaXRvci5JTlNUQU5DRTsKIAkJd3JpdGVyID0gbmV3IFBhY2tXcml0ZXIoY29uZmlnLCBkYi5uZXdPYmplY3RSZWFkZXIoKSk7CkBAIC04NDksNyArODQ2LDcgQEAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVZlcmlmeU9wZW5QYWNrKGZpbmFsIExpc3Q8UmV2T2JqZWN0PiBvYmplY3RTb3VyY2UpCiAJCXZlcmlmeU9wZW5QYWNrKGZhbHNlKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgdmVyaWZ5T3BlblBhY2soZmluYWwgYm9vbGVhbiB0aGluKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByaXZhdGUgdm9pZCB2ZXJpZnlPcGVuUGFjayhib29sZWFuIHRoaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIGJ5dGVbXSBwYWNrRGF0YSA9IG9zLnRvQnl0ZUFycmF5KCk7CiAKIAkJaWYgKHRoaW4pIHsKQEAgLTg3MSwxMyArODY4LDEzIEBAIHByaXZhdGUgdm9pZCB2ZXJpZnlPcGVuUGFjayhmaW5hbCBib29sZWFuIHRoaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWFzc2VydE5vdE51bGwoImhhdmUgUGFja0ZpbGUgYWZ0ZXIgcGFyc2luZyIsIHBhY2spOwogCX0KIAotCXByaXZhdGUgUGFja1BhcnNlciBpbmRleChmaW5hbCBieXRlW10gcGFja0RhdGEpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJpdmF0ZSBQYWNrUGFyc2VyIGluZGV4KGJ5dGVbXSBwYWNrRGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJaWYgKGluc2VydGVyID09IG51bGwpCiAJCQlpbnNlcnRlciA9IGRzdC5uZXdPYmplY3RJbnNlcnRlcigpOwogCQlyZXR1cm4gaW5zZXJ0ZXIubmV3UGFja1BhcnNlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocGFja0RhdGEpKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgdmVyaWZ5T2JqZWN0c09yZGVyKGZpbmFsIE9iamVjdElkIG9iamVjdHNPcmRlcltdKSB7CisJcHJpdmF0ZSB2b2lkIHZlcmlmeU9iamVjdHNPcmRlcihPYmplY3RJZCBvYmplY3RzT3JkZXJbXSkgewogCQlmaW5hbCBMaXN0PFBhY2tJbmRleC5NdXRhYmxlRW50cnk+IGVudHJpZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAogCQlmb3IgKE11dGFibGVFbnRyeSBtZSA6IHBhY2spIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUmVmRGlyZWN0b3J5VGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9SZWZEaXJlY3RvcnlUZXN0LmphdmEKaW5kZXggZmVmY2NmMy4uNWEyYmQ5YyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9SZWZEaXJlY3RvcnlUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9SZWZEaXJlY3RvcnlUZXN0LmphdmEKQEAgLTEyNzEsNyArMTI3MSw3IEBAIHB1YmxpYyB2b2lkIHRlc3RSZWZzQ2hhbmdlZFN0YWNrT3ZlcmZsb3coKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCQkJQE92ZXJyaWRlCiAJCQkJCXB1YmxpYyB2b2lkIG9uUmVmc0NoYW5nZWQoUmVmc0NoYW5nZWRFdmVudCBldmVudCkgewogCQkJCQkJdHJ5IHsKLQkJCQkJCQlyZWZEYi5nZXRSZWZzKCJyZWYiKTsKKwkJCQkJCQlyZWZEYi5nZXRSZWZzQnlQcmVmaXgoInJlZiIpOwogCQkJCQkJCWNoYW5nZUNvdW50LmluY3JlbWVudEFuZEdldCgpOwogCQkJCQkJfSBjYXRjaCAoU3RhY2tPdmVyZmxvd0Vycm9yIHNvZSkgewogCQkJCQkJCWVycm9yLnNldChzb2UpOwpAQCAtMTI4MCw4ICsxMjgwLDggQEAgcHVibGljIHZvaWQgb25SZWZzQ2hhbmdlZChSZWZzQ2hhbmdlZEV2ZW50IGV2ZW50KSB7CiAJCQkJCQl9CiAJCQkJCX0KIAkJCQl9KTsKLQkJcmVmRGIuZ2V0UmVmcygicmVmIik7Ci0JCXJlZkRiLmdldFJlZnMoInJlZiIpOworCQlyZWZEYi5nZXRSZWZzQnlQcmVmaXgoInJlZiIpOworCQlyZWZEYi5nZXRSZWZzQnlQcmVmaXgoInJlZiIpOwogCQlhc3NlcnROdWxsKGVycm9yLmdldCgpKTsKIAkJYXNzZXJ0TnVsbChleGNlcHRpb24uZ2V0KCkpOwogCQlhc3NlcnRFcXVhbHMoMSwgY2hhbmdlQ291bnQuZ2V0KCkpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9SZWZVcGRhdGVUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1JlZlVwZGF0ZVRlc3QuamF2YQppbmRleCBkOGQ0NWE4Li5lMWFkZWVkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1JlZlVwZGF0ZVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1JlZlVwZGF0ZVRlc3QuamF2YQpAQCAtNDUsOCArNDUsOCBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkxPQ0tfU1VGRklYOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKQEAgLTYyLDYgKzYyLDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQW55T2JqZWN0SWQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzOwpAQCAtOTQsMTMgKzk1LDEzIEBAIHByaXZhdGUgdm9pZCB3cml0ZVN5bXJlZihTdHJpbmcgc3JjLCBTdHJpbmcgZHN0KSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl9CiAJfQogCi0JcHJpdmF0ZSBSZWZVcGRhdGUgdXBkYXRlUmVmKGZpbmFsIFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByaXZhdGUgUmVmVXBkYXRlIHVwZGF0ZVJlZihTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgUmVmVXBkYXRlIHJlZiA9IGRiLnVwZGF0ZVJlZihuYW1lKTsKIAkJcmVmLnNldE5ld09iamVjdElkKGRiLnJlc29sdmUoQ29uc3RhbnRzLkhFQUQpKTsKIAkJcmV0dXJuIHJlZjsKIAl9CiAKLQlwcml2YXRlIHZvaWQgZGVsZXRlKGZpbmFsIFJlZlVwZGF0ZSByZWYsIGZpbmFsIFJlc3VsdCBleHBlY3RlZCkKKwlwcml2YXRlIHZvaWQgZGVsZXRlKFJlZlVwZGF0ZSByZWYsIFJlc3VsdCBleHBlY3RlZCkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWRlbGV0ZShyZWYsIGV4cGVjdGVkLCB0cnVlLCB0cnVlKTsKIAl9CkBAIC0xMTAsMTEgKzExMSwyMSBAQCBwcml2YXRlIHZvaWQgZGVsZXRlKGZpbmFsIFJlZlVwZGF0ZSByZWYsIGZpbmFsIFJlc3VsdCBleHBlY3RlZCwKIAkJZGVsZXRlKGRiLCByZWYsIGV4cGVjdGVkLCBleGlzdHMsIHJlbW92ZWQpOwogCX0KIAotCXByaXZhdGUgdm9pZCBkZWxldGUoUmVwb3NpdG9yeSByZXBvLCBmaW5hbCBSZWZVcGRhdGUgcmVmLCBmaW5hbCBSZXN1bHQgZXhwZWN0ZWQsCi0JCQlmaW5hbCBib29sZWFuIGV4aXN0cywgZmluYWwgYm9vbGVhbiByZW1vdmVkKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoZXhpc3RzLCByZXBvLmdldEFsbFJlZnMoKS5jb250YWluc0tleShyZWYuZ2V0TmFtZSgpKSk7CisJcHJpdmF0ZSB2b2lkIGRlbGV0ZShSZXBvc2l0b3J5IHJlcG8sIGZpbmFsIFJlZlVwZGF0ZSByZWYsCisJCQlmaW5hbCBSZXN1bHQgZXhwZWN0ZWQsIGZpbmFsIGJvb2xlYW4gZXhpc3RzLCBmaW5hbCBib29sZWFuIHJlbW92ZWQpCisJCQl0aHJvd3MgSU9FeGNlcHRpb24geworCQlhc3NlcnRFcXVhbHMoZXhpc3RzLCBnZXRSZWYocmVwbywgcmVmLmdldE5hbWUoKSkuaXNQcmVzZW50KCkpOwogCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHJlZi5kZWxldGUoKSk7Ci0JCWFzc2VydEVxdWFscyghcmVtb3ZlZCwgcmVwby5nZXRBbGxSZWZzKCkuY29udGFpbnNLZXkocmVmLmdldE5hbWUoKSkpOworCQlhc3NlcnRFcXVhbHMoIXJlbW92ZWQsIGdldFJlZihyZXBvLCByZWYuZ2V0TmFtZSgpKS5pc1ByZXNlbnQoKSk7CisJfQorCisJcHJpdmF0ZSBPcHRpb25hbDxSZWY+IGdldFJlZihSZXBvc2l0b3J5IHJlcG8sIFN0cmluZyBuYW1lKQorCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGdldFJlZihyZXBvLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcygpLCBuYW1lKTsKKwl9CisKKwlwcml2YXRlIE9wdGlvbmFsPFJlZj4gZ2V0UmVmKExpc3Q8UmVmPiByZWZzLCBTdHJpbmcgbmFtZSkgeworCQlyZXR1cm4gcmVmcy5zdHJlYW0oKS5maWx0ZXIociAtPiByLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpLmZpbmRBbnkoKTsKIAl9CiAKIAlAVGVzdApAQCAtMTI1LDggKzEzNiw3IEBAIHB1YmxpYyB2b2lkIHRlc3ROb0NhY2hlT2JqZWN0SWRTdWJjbGFzcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXJ1LnNldE5ld09iamVjdElkKG5ld2lkKTsKIAkJUmVzdWx0IHVwZGF0ZSA9IHJ1LnVwZGF0ZSgpOwogCQlhc3NlcnRFcXVhbHMoUmVzdWx0Lk5FVywgdXBkYXRlKTsKLQkJZmluYWwgUmVmIHIgPSBkYi5nZXRBbGxSZWZzKCkuZ2V0KG5ld1JlZik7Ci0JCWFzc2VydE5vdE51bGwocik7CisJCWZpbmFsIFJlZiByID0gZ2V0UmVmKGRiLCBuZXdSZWYpLmdldCgpOwogCQlhc3NlcnRFcXVhbHMobmV3UmVmLCByLmdldE5hbWUoKSk7CiAJCWFzc2VydE5vdE51bGwoci5nZXRPYmplY3RJZCgpKTsKIAkJYXNzZXJ0Tm90U2FtZShuZXdpZCwgci5nZXRPYmplY3RJZCgpKTsKQEAgLTI1Myw3ICsyNjMsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0RGVsZXRlSGVhZEluQmFyZVJlcG8oKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCiAJCU9iamVjdElkIGJsb2JJZDsKIAkJdHJ5IChPYmplY3RJbnNlcnRlciBpbnMgPSBiYXJlUmVwby5uZXdPYmplY3RJbnNlcnRlcigpKSB7Ci0JCQlibG9iSWQgPSBpbnMuaW5zZXJ0KENvbnN0YW50cy5PQkpfQkxPQiwgImNvbnRlbnRzIi5nZXRCeXRlcyhVVEZfOCkpOworCQkJYmxvYklkID0gaW5zLmluc2VydChDb25zdGFudHMuT0JKX0JMT0IsICJjb250ZW50cyIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQkJaW5zLmZsdXNoKCk7CiAJCX0KIApAQCAtMzc4LDEwICszODgsMTAgQEAgcHVibGljIHZvaWQgdGVzdERlbGV0ZVdpdGhvdXRIZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdFJlZktleVNhbWVBc05hbWUoKSB7CisJCUBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCiAJCU1hcDxTdHJpbmcsIFJlZj4gYWxsUmVmcyA9IGRiLmdldEFsbFJlZnMoKTsKIAkJZm9yIChFbnRyeTxTdHJpbmcsIFJlZj4gZSA6IGFsbFJlZnMuZW50cnlTZXQoKSkgewogCQkJYXNzZXJ0RXF1YWxzKGUuZ2V0S2V5KCksIGUuZ2V0VmFsdWUoKS5nZXROYW1lKCkpOwotCiAJCX0KIAl9CiAKQEAgLTUyMCw4ICs1MzAsOCBAQCBwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUmVmTm9DaGFuZ2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCSAqLwogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdFJlZnNDYWNoZUFmdGVyVXBkYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIERvIG5vdCB1c2UgdGhlIGRlZmFsdCByZXBvIGZvciB0aGlzIGNhc2UuCi0JCU1hcDxTdHJpbmcsIFJlZj4gYWxsUmVmcyA9IGRiLmdldEFsbFJlZnMoKTsKKwkJLy8gRG8gbm90IHVzZSB0aGUgZGVmYXVsdCByZXBvIGZvciB0aGlzIGNhc2UuCisJCUxpc3Q8UmVmPiBhbGxSZWZzID0gZGIuZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzKCk7CiAJCU9iamVjdElkIG9sZFZhbHVlID0gZGIucmVzb2x2ZSgiSEVBRCIpOwogCQlPYmplY3RJZCBuZXdWYWx1ZSA9IGRiLnJlc29sdmUoIkhFQUReIik7CiAJCS8vIGZpcnN0IG1ha2UgSEVBRCByZWZlciB0byBsb29zZSByZWYKQEAgLTUzNyw5ICs1NDcsOSBAQCBwdWJsaWMgdm9pZCB0ZXN0UmVmc0NhY2hlQWZ0ZXJVcGRhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJdXBkYXRlID0gdXBkYXRlUmVmLnVwZGF0ZSgpOwogCQlhc3NlcnRFcXVhbHMoUmVzdWx0LkZBU1RfRk9SV0FSRCwgdXBkYXRlKTsKIAotCQlhbGxSZWZzID0gZGIuZ2V0QWxsUmVmcygpOwotCQlSZWYgbWFzdGVyID0gYWxsUmVmcy5nZXQoInJlZnMvaGVhZHMvbWFzdGVyIik7Ci0JCVJlZiBoZWFkID0gYWxsUmVmcy5nZXQoIkhFQUQiKTsKKwkJYWxsUmVmcyA9IGRiLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcygpOworCQlSZWYgbWFzdGVyID0gZ2V0UmVmKGFsbFJlZnMsICJyZWZzL2hlYWRzL21hc3RlciIpLmdldCgpOworCQlSZWYgaGVhZCA9IGdldFJlZihhbGxSZWZzLCAiSEVBRCIpLmdldCgpOwogCQlhc3NlcnRFcXVhbHMoInJlZnMvaGVhZHMvbWFzdGVyIiwgbWFzdGVyLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiSEVBRCIsIGhlYWQuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0VHJ1ZSgiaXMgc3ltYm9saWMgcmVmZXJlbmNlIiwgaGVhZC5pc1N5bWJvbGljKCkpOwpAQCAtNTU3LDggKzU2Nyw4IEBAIHB1YmxpYyB2b2lkIHRlc3RSZWZzQ2FjaGVBZnRlclVwZGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewogCSAqLwogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdFJlZnNDYWNoZUFmdGVyVXBkYXRlTG9vc2VPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIERvIG5vdCB1c2UgdGhlIGRlZmFsdCByZXBvIGZvciB0aGlzIGNhc2UuCi0JCU1hcDxTdHJpbmcsIFJlZj4gYWxsUmVmcyA9IGRiLmdldEFsbFJlZnMoKTsKKwkJLy8gRG8gbm90IHVzZSB0aGUgZGVmYXVsdCByZXBvIGZvciB0aGlzIGNhc2UuCisJCUxpc3Q8UmVmPiBhbGxSZWZzID0gZGIuZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzKCk7CiAJCU9iamVjdElkIG9sZFZhbHVlID0gZGIucmVzb2x2ZSgiSEVBRCIpOwogCQl3cml0ZVN5bXJlZihDb25zdGFudHMuSEVBRCwgInJlZnMvaGVhZHMvbmV3cmVmIik7CiAJCVJlZlVwZGF0ZSB1cGRhdGVSZWYgPSBkYi51cGRhdGVSZWYoQ29uc3RhbnRzLkhFQUQpOwpAQCAtNTY3LDkgKzU3Nyw5IEBAIHB1YmxpYyB2b2lkIHRlc3RSZWZzQ2FjaGVBZnRlclVwZGF0ZUxvb3NlT25seSgpIHRocm93cyBFeGNlcHRpb24gewogCQlSZXN1bHQgdXBkYXRlID0gdXBkYXRlUmVmLnVwZGF0ZSgpOwogCQlhc3NlcnRFcXVhbHMoUmVzdWx0Lk5FVywgdXBkYXRlKTsKIAotCQlhbGxSZWZzID0gZGIuZ2V0QWxsUmVmcygpOwotCQlSZWYgaGVhZCA9IGFsbFJlZnMuZ2V0KCJIRUFEIik7Ci0JCVJlZiBuZXdyZWYgPSBhbGxSZWZzLmdldCgicmVmcy9oZWFkcy9uZXdyZWYiKTsKKwkJYWxsUmVmcyA9IGRiLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcygpOworCQlSZWYgaGVhZCA9IGdldFJlZihhbGxSZWZzLCAiSEVBRCIpLmdldCgpOworCQlSZWYgbmV3cmVmID0gZ2V0UmVmKGFsbFJlZnMsICJyZWZzL2hlYWRzL25ld3JlZiIpLmdldCgpOwogCQlhc3NlcnRFcXVhbHMoInJlZnMvaGVhZHMvbmV3cmVmIiwgbmV3cmVmLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiSEVBRCIsIGhlYWQuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0VHJ1ZSgiaXMgc3ltYm9saWMgcmVmZXJlbmNlIiwgaGVhZC5pc1N5bWJvbGljKCkpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9UMDAwM19CYXNpY1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvVDAwMDNfQmFzaWNUZXN0LmphdmEKaW5kZXggZDc1MDVhZi4uZTExM2RiMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9UMDAwM19CYXNpY1Rlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1QwMDAzX0Jhc2ljVGVzdC5qYXZhCkBAIC00Nyw3ICs0Nyw3IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlOwogCiBpbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5JU09fODg1OV8xOwotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwpAQCAtMTM3LDEwICsxMzcsMTAgQEAgcHVibGljIHZvaWQgdGVzdDAwMF9vcGVuUmVwb0JhZEFyZ3MoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdDAwMF9vcGVucmVwb19kZWZhdWx0X2dpdERpclNldCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCUZpbGUgcmVwbzFQYXJlbnQgPSBuZXcgRmlsZSh0cmFzaC5nZXRQYXJlbnRGaWxlKCksICJyMSIpOwotCQlSZXBvc2l0b3J5IHJlcG8xaW5pdGlhbCA9IG5ldyBGaWxlUmVwb3NpdG9yeShuZXcgRmlsZShyZXBvMVBhcmVudCwKLQkJCQlDb25zdGFudHMuRE9UX0dJVCkpOwotCQlyZXBvMWluaXRpYWwuY3JlYXRlKCk7Ci0JCXJlcG8xaW5pdGlhbC5jbG9zZSgpOworCQl0cnkgKFJlcG9zaXRvcnkgcmVwbzFpbml0aWFsID0gbmV3IEZpbGVSZXBvc2l0b3J5KAorCQkJCW5ldyBGaWxlKHJlcG8xUGFyZW50LCBDb25zdGFudHMuRE9UX0dJVCkpKSB7CisJCQlyZXBvMWluaXRpYWwuY3JlYXRlKCk7CisJCX0KIAogCQlGaWxlIHRoZURpciA9IG5ldyBGaWxlKHJlcG8xUGFyZW50LCBDb25zdGFudHMuRE9UX0dJVCk7CiAJCUZpbGVSZXBvc2l0b3J5IHIgPSAoRmlsZVJlcG9zaXRvcnkpIG5ldyBGaWxlUmVwb3NpdG9yeUJ1aWxkZXIoKQpAQCAtMTYyLDEwICsxNjIsMTAgQEAgcHVibGljIHZvaWQgdGVzdDAwMF9vcGVucmVwb19kZWZhdWx0X2dpdERpclNldCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJcHVibGljIHZvaWQgdGVzdDAwMF9vcGVucmVwb19kZWZhdWx0X2dpdERpckFuZFdvcmtUcmVlU2V0KCkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCUZpbGUgcmVwbzFQYXJlbnQgPSBuZXcgRmlsZSh0cmFzaC5nZXRQYXJlbnRGaWxlKCksICJyMSIpOwotCQlSZXBvc2l0b3J5IHJlcG8xaW5pdGlhbCA9IG5ldyBGaWxlUmVwb3NpdG9yeShuZXcgRmlsZShyZXBvMVBhcmVudCwKLQkJCQlDb25zdGFudHMuRE9UX0dJVCkpOwotCQlyZXBvMWluaXRpYWwuY3JlYXRlKCk7Ci0JCXJlcG8xaW5pdGlhbC5jbG9zZSgpOworCQl0cnkgKFJlcG9zaXRvcnkgcmVwbzFpbml0aWFsID0gbmV3IEZpbGVSZXBvc2l0b3J5KAorCQkJCW5ldyBGaWxlKHJlcG8xUGFyZW50LCBDb25zdGFudHMuRE9UX0dJVCkpKSB7CisJCQlyZXBvMWluaXRpYWwuY3JlYXRlKCk7CisJCX0KIAogCQlGaWxlIHRoZURpciA9IG5ldyBGaWxlKHJlcG8xUGFyZW50LCBDb25zdGFudHMuRE9UX0dJVCk7CiAJCUZpbGVSZXBvc2l0b3J5IHIgPSAoRmlsZVJlcG9zaXRvcnkpIG5ldyBGaWxlUmVwb3NpdG9yeUJ1aWxkZXIoKQpAQCAtMTg3LDEwICsxODcsMTAgQEAgcHVibGljIHZvaWQgdGVzdDAwMF9vcGVucmVwb19kZWZhdWx0X2dpdERpckFuZFdvcmtUcmVlU2V0KCkKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3QwMDBfb3BlbnJlcG9fZGVmYXVsdF93b3JrRGlyU2V0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJRmlsZSByZXBvMVBhcmVudCA9IG5ldyBGaWxlKHRyYXNoLmdldFBhcmVudEZpbGUoKSwgInIxIik7Ci0JCVJlcG9zaXRvcnkgcmVwbzFpbml0aWFsID0gbmV3IEZpbGVSZXBvc2l0b3J5KG5ldyBGaWxlKHJlcG8xUGFyZW50LAotCQkJCUNvbnN0YW50cy5ET1RfR0lUKSk7Ci0JCXJlcG8xaW5pdGlhbC5jcmVhdGUoKTsKLQkJcmVwbzFpbml0aWFsLmNsb3NlKCk7CisJCXRyeSAoUmVwb3NpdG9yeSByZXBvMWluaXRpYWwgPSBuZXcgRmlsZVJlcG9zaXRvcnkoCisJCQkJbmV3IEZpbGUocmVwbzFQYXJlbnQsIENvbnN0YW50cy5ET1RfR0lUKSkpIHsKKwkJCXJlcG8xaW5pdGlhbC5jcmVhdGUoKTsKKwkJfQogCiAJCUZpbGUgdGhlRGlyID0gbmV3IEZpbGUocmVwbzFQYXJlbnQsIENvbnN0YW50cy5ET1RfR0lUKTsKIAkJRmlsZVJlcG9zaXRvcnkgciA9IChGaWxlUmVwb3NpdG9yeSkgbmV3IEZpbGVSZXBvc2l0b3J5QnVpbGRlcigpCkBAIC0yMTMsMTMgKzIxMywxMyBAQCBwdWJsaWMgdm9pZCB0ZXN0MDAwX29wZW5yZXBvX2RlZmF1bHRfYWJzb2x1dGVfd29ya2RpcmNvbmZpZygpCiAJCUZpbGUgcmVwbzFQYXJlbnQgPSBuZXcgRmlsZSh0cmFzaC5nZXRQYXJlbnRGaWxlKCksICJyMSIpOwogCQlGaWxlIHdvcmtkaXIgPSBuZXcgRmlsZSh0cmFzaC5nZXRQYXJlbnRGaWxlKCksICJydyIpOwogCQlGaWxlVXRpbHMubWtkaXIod29ya2Rpcik7Ci0JCUZpbGVSZXBvc2l0b3J5IHJlcG8xaW5pdGlhbCA9IG5ldyBGaWxlUmVwb3NpdG9yeShuZXcgRmlsZShyZXBvMVBhcmVudCwKLQkJCQlDb25zdGFudHMuRE9UX0dJVCkpOwotCQlyZXBvMWluaXRpYWwuY3JlYXRlKCk7Ci0JCWZpbmFsIEZpbGVCYXNlZENvbmZpZyBjZmcgPSByZXBvMWluaXRpYWwuZ2V0Q29uZmlnKCk7Ci0JCWNmZy5zZXRTdHJpbmcoImNvcmUiLCBudWxsLCAid29ya3RyZWUiLCB3b3JrZGlyLmdldEFic29sdXRlUGF0aCgpKTsKLQkJY2ZnLnNhdmUoKTsKLQkJcmVwbzFpbml0aWFsLmNsb3NlKCk7CisJCXRyeSAoRmlsZVJlcG9zaXRvcnkgcmVwbzFpbml0aWFsID0gbmV3IEZpbGVSZXBvc2l0b3J5KAorCQkJCW5ldyBGaWxlKHJlcG8xUGFyZW50LCBDb25zdGFudHMuRE9UX0dJVCkpKSB7CisJCQlyZXBvMWluaXRpYWwuY3JlYXRlKCk7CisJCQlmaW5hbCBGaWxlQmFzZWRDb25maWcgY2ZnID0gcmVwbzFpbml0aWFsLmdldENvbmZpZygpOworCQkJY2ZnLnNldFN0cmluZygiY29yZSIsIG51bGwsICJ3b3JrdHJlZSIsIHdvcmtkaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOworCQkJY2ZnLnNhdmUoKTsKKwkJfQogCiAJCUZpbGUgdGhlRGlyID0gbmV3IEZpbGUocmVwbzFQYXJlbnQsIENvbnN0YW50cy5ET1RfR0lUKTsKIAkJRmlsZVJlcG9zaXRvcnkgciA9IChGaWxlUmVwb3NpdG9yeSkgbmV3IEZpbGVSZXBvc2l0b3J5QnVpbGRlcigpCkBAIC0yNDIsMTMgKzI0MiwxMyBAQCBwdWJsaWMgdm9pZCB0ZXN0MDAwX29wZW5yZXBvX2RlZmF1bHRfcmVsYXRpdmVfd29ya2RpcmNvbmZpZygpCiAJCUZpbGUgcmVwbzFQYXJlbnQgPSBuZXcgRmlsZSh0cmFzaC5nZXRQYXJlbnRGaWxlKCksICJyMSIpOwogCQlGaWxlIHdvcmtkaXIgPSBuZXcgRmlsZSh0cmFzaC5nZXRQYXJlbnRGaWxlKCksICJydyIpOwogCQlGaWxlVXRpbHMubWtkaXIod29ya2Rpcik7Ci0JCUZpbGVSZXBvc2l0b3J5IHJlcG8xaW5pdGlhbCA9IG5ldyBGaWxlUmVwb3NpdG9yeShuZXcgRmlsZShyZXBvMVBhcmVudCwKLQkJCQlDb25zdGFudHMuRE9UX0dJVCkpOwotCQlyZXBvMWluaXRpYWwuY3JlYXRlKCk7Ci0JCWZpbmFsIEZpbGVCYXNlZENvbmZpZyBjZmcgPSByZXBvMWluaXRpYWwuZ2V0Q29uZmlnKCk7Ci0JCWNmZy5zZXRTdHJpbmcoImNvcmUiLCBudWxsLCAid29ya3RyZWUiLCAiLi4vLi4vcnciKTsKLQkJY2ZnLnNhdmUoKTsKLQkJcmVwbzFpbml0aWFsLmNsb3NlKCk7CisJCXRyeSAoRmlsZVJlcG9zaXRvcnkgcmVwbzFpbml0aWFsID0gbmV3IEZpbGVSZXBvc2l0b3J5KAorCQkJCW5ldyBGaWxlKHJlcG8xUGFyZW50LCBDb25zdGFudHMuRE9UX0dJVCkpKSB7CisJCQlyZXBvMWluaXRpYWwuY3JlYXRlKCk7CisJCQlmaW5hbCBGaWxlQmFzZWRDb25maWcgY2ZnID0gcmVwbzFpbml0aWFsLmdldENvbmZpZygpOworCQkJY2ZnLnNldFN0cmluZygiY29yZSIsIG51bGwsICJ3b3JrdHJlZSIsICIuLi8uLi9ydyIpOworCQkJY2ZnLnNhdmUoKTsKKwkJfQogCiAJCUZpbGUgdGhlRGlyID0gbmV3IEZpbGUocmVwbzFQYXJlbnQsIENvbnN0YW50cy5ET1RfR0lUKTsKIAkJRmlsZVJlcG9zaXRvcnkgciA9IChGaWxlUmVwb3NpdG9yeSkgbmV3IEZpbGVSZXBvc2l0b3J5QnVpbGRlcigpCkBAIC0yNzMsMjYgKzI3MywyNCBAQCBwdWJsaWMgdm9pZCB0ZXN0MDAwX29wZW5yZXBvX2FsdGVybmF0ZV9pbmRleF9maWxlX2FuZF9vYmpkaXJzKCkKIAkJRmlsZSBpbmRleEZpbGUgPSBuZXcgRmlsZSh0cmFzaCwgImlkeCIpOwogCQlGaWxlIG9iakRpciA9IG5ldyBGaWxlKHRyYXNoLCAiLi4vb2JqIik7CiAJCUZpbGUgYWx0T2JqRGlyID0gZGIuZ2V0T2JqZWN0RGF0YWJhc2UoKS5nZXREaXJlY3RvcnkoKTsKLQkJUmVwb3NpdG9yeSByZXBvMWluaXRpYWwgPSBuZXcgRmlsZVJlcG9zaXRvcnkobmV3IEZpbGUocmVwbzFQYXJlbnQsCi0JCQkJQ29uc3RhbnRzLkRPVF9HSVQpKTsKLQkJcmVwbzFpbml0aWFsLmNyZWF0ZSgpOwotCQlyZXBvMWluaXRpYWwuY2xvc2UoKTsKKwkJdHJ5IChSZXBvc2l0b3J5IHJlcG8xaW5pdGlhbCA9IG5ldyBGaWxlUmVwb3NpdG9yeSgKKwkJCQluZXcgRmlsZShyZXBvMVBhcmVudCwgQ29uc3RhbnRzLkRPVF9HSVQpKSkgeworCQkJcmVwbzFpbml0aWFsLmNyZWF0ZSgpOworCQl9CiAKIAkJRmlsZSB0aGVEaXIgPSBuZXcgRmlsZShyZXBvMVBhcmVudCwgQ29uc3RhbnRzLkRPVF9HSVQpOwotCQlGaWxlUmVwb3NpdG9yeSByID0gKEZpbGVSZXBvc2l0b3J5KSBuZXcgRmlsZVJlcG9zaXRvcnlCdWlsZGVyKCkgLy8KKwkJdHJ5IChGaWxlUmVwb3NpdG9yeSByID0gKEZpbGVSZXBvc2l0b3J5KSBuZXcgRmlsZVJlcG9zaXRvcnlCdWlsZGVyKCkgLy8KIAkJCQkuc2V0R2l0RGlyKHRoZURpcikuc2V0T2JqZWN0RGlyZWN0b3J5KG9iakRpcikgLy8KIAkJCQkuYWRkQWx0ZXJuYXRlT2JqZWN0RGlyZWN0b3J5KGFsdE9iakRpcikgLy8KIAkJCQkuc2V0SW5kZXhGaWxlKGluZGV4RmlsZSkgLy8KLQkJCQkuYnVpbGQoKTsKLQkJYXNzZXJ0RXF1YWxzUGF0aCh0aGVEaXIsIHIuZ2V0RGlyZWN0b3J5KCkpOwotCQlhc3NlcnRFcXVhbHNQYXRoKHRoZURpci5nZXRQYXJlbnRGaWxlKCksIHIuZ2V0V29ya1RyZWUoKSk7Ci0JCWFzc2VydEVxdWFsc1BhdGgoaW5kZXhGaWxlLCByLmdldEluZGV4RmlsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzUGF0aChvYmpEaXIsIHIuZ2V0T2JqZWN0RGF0YWJhc2UoKS5nZXREaXJlY3RvcnkoKSk7Ci0JCWFzc2VydE5vdE51bGwoci5vcGVuKE9iamVjdElkCi0JCQkJLmZyb21TdHJpbmcoIjZkYjljMmViZjc1NTkwZWVmOTczMDgxNzM2NzMwYTllYTE2OWEwYzQiKSkpOwotCQkvLyBNdXN0IGNsb3NlIG9yIHRoZSBkZWZhdWx0IHJlcG8gcGFjayBmaWxlcyBjcmVhdGVkIGJ5IHRoaXMgdGVzdCBnZXRzCi0JCS8vIGxvY2tlZCB2aWEgdGhlIGFsdGVybmF0ZSBvYmplY3QgZGlyZWN0b3JpZXMgb24gV2luZG93cy4KLQkJci5jbG9zZSgpOworCQkJCS5idWlsZCgpKSB7CisJCQlhc3NlcnRFcXVhbHNQYXRoKHRoZURpciwgci5nZXREaXJlY3RvcnkoKSk7CisJCQlhc3NlcnRFcXVhbHNQYXRoKHRoZURpci5nZXRQYXJlbnRGaWxlKCksIHIuZ2V0V29ya1RyZWUoKSk7CisJCQlhc3NlcnRFcXVhbHNQYXRoKGluZGV4RmlsZSwgci5nZXRJbmRleEZpbGUoKSk7CisJCQlhc3NlcnRFcXVhbHNQYXRoKG9iakRpciwgci5nZXRPYmplY3REYXRhYmFzZSgpLmdldERpcmVjdG9yeSgpKTsKKwkJCWFzc2VydE5vdE51bGwoci5vcGVuKE9iamVjdElkCisJCQkJCS5mcm9tU3RyaW5nKCI2ZGI5YzJlYmY3NTU5MGVlZjk3MzA4MTczNjczMGE5ZWExNjlhMGM0IikpKTsKKwkJfQogCX0KIAogCXByb3RlY3RlZCB2b2lkIGFzc2VydEVxdWFsc1BhdGgoRmlsZSBleHBlY3RlZCwgRmlsZSBhY3R1YWwpCkBAIC0zMDcsNyArMzA1LDcgQEAgcHVibGljIHZvaWQgdGVzdDAwMl9Xcml0ZUVtcHR5VHJlZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCS8vIG9iamVjdCAoYXMgaXQgYWxyZWFkeSBleGlzdHMgaW4gdGhlIHBhY2spLgogCQkvLwogCQlmaW5hbCBSZXBvc2l0b3J5IG5ld2RiID0gY3JlYXRlQmFyZVJlcG9zaXRvcnkoKTsKLQkJdHJ5IChmaW5hbCBPYmplY3RJbnNlcnRlciBvaSA9IG5ld2RiLm5ld09iamVjdEluc2VydGVyKCkpIHsKKwkJdHJ5IChPYmplY3RJbnNlcnRlciBvaSA9IG5ld2RiLm5ld09iamVjdEluc2VydGVyKCkpIHsKIAkJCWZpbmFsIE9iamVjdElkIHRyZWVJZCA9IG9pLmluc2VydChuZXcgVHJlZUZvcm1hdHRlcigpKTsKIAkJCWFzc2VydEVxdWFscygiNGI4MjVkYzY0MmNiNmViOWEwNjBlNTRiZjhkNjkyODhmYmVlNDkwNCIsCiAJCQkJCXRyZWVJZC5uYW1lKCkpOwpAQCAtMzc1LDcgKzM3Myw3IEBAIHB1YmxpYyB2b2lkIHRlc3QwMDZfUmVhZFVnbHlDb25maWcoKSB0aHJvd3MgSU9FeGNlcHRpb24sCiAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3QwMDdfT3BlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXRyeSAoZmluYWwgRmlsZVJlcG9zaXRvcnkgZGIyID0gbmV3IEZpbGVSZXBvc2l0b3J5KGRiLmdldERpcmVjdG9yeSgpKSkgeworCQl0cnkgKEZpbGVSZXBvc2l0b3J5IGRiMiA9IG5ldyBGaWxlUmVwb3NpdG9yeShkYi5nZXREaXJlY3RvcnkoKSkpIHsKIAkJCWFzc2VydEVxdWFscyhkYi5nZXREaXJlY3RvcnkoKSwgZGIyLmdldERpcmVjdG9yeSgpKTsKIAkJCWFzc2VydEVxdWFscyhkYi5nZXRPYmplY3REYXRhYmFzZSgpLmdldERpcmVjdG9yeSgpLCBkYjIKIAkJCQkJLmdldE9iamVjdERhdGFiYXNlKCkuZ2V0RGlyZWN0b3J5KCkpOwpAQCAtNDE3LDE0ICs0MTUsMTEgQEAgcHVibGljIHZvaWQgdGVzdDAwOV9DcmVhdGVDb21taXRPbGRGb3JtYXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkvLyBWZXJpZnkgdGhlIGNvbW1pdCB3ZSBqdXN0IHdyb3RlIGlzIGluIHRoZSBjb3JyZWN0IGZvcm1hdC4KIAkJT2JqZWN0RGF0YWJhc2Ugb2RiID0gZGIuZ2V0T2JqZWN0RGF0YWJhc2UoKTsKIAkJYXNzZXJ0VHJ1ZSgiaXMgT2JqZWN0RGlyZWN0b3J5Iiwgb2RiIGluc3RhbmNlb2YgT2JqZWN0RGlyZWN0b3J5KTsKLQkJZmluYWwgWElucHV0U3RyZWFtIHhpcyA9IG5ldyBYSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbSgKLQkJCQkoKE9iamVjdERpcmVjdG9yeSkgb2RiKS5maWxlRm9yKGNtdGlkKSkpOwotCQl0cnkgeworCQl0cnkgKFhJbnB1dFN0cmVhbSB4aXMgPSBuZXcgWElucHV0U3RyZWFtKAorCQkJCW5ldyBGaWxlSW5wdXRTdHJlYW0oKChPYmplY3REaXJlY3RvcnkpIG9kYikuZmlsZUZvcihjbXRpZCkpKSkgewogCQkJYXNzZXJ0RXF1YWxzKDB4NzgsIHhpcy5yZWFkVUludDgoKSk7CiAJCQlhc3NlcnRFcXVhbHMoMHg5YywgeGlzLnJlYWRVSW50OCgpKTsKIAkJCWFzc2VydEVxdWFscygwLCAweDc4OWMgJSAzMSk7Ci0JCX0gZmluYWxseSB7Ci0JCQl4aXMuY2xvc2UoKTsKIAkJfQogCiAJCS8vIFZlcmlmeSB3ZSBjYW4gcmVhZCBpdC4KQEAgLTUyMiw3ICs1MTcsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0MDIzX2NyZWF0ZUNvbW1pdE5vbkFudWxsaWkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJCTQyOTQ5NjcyOTUwMDBMLCA2MCkpOwogCQljb21taXQuc2V0Q29tbWl0dGVyKG5ldyBQZXJzb25JZGVudCgiSm9lIEhhY2tlciIsICJqb2UyQGV4YW1wbGUuY29tIiwKIAkJCQk0Mjk0OTY3Mjk1MDAwTCwgNjApKTsKLQkJY29tbWl0LnNldEVuY29kaW5nKFVURl84KTsKKwkJY29tbWl0LnNldEVuY29kaW5nKENIQVJTRVQpOwogCQljb21taXQuc2V0TWVzc2FnZSgiXHUwMGRjYmVyZ2Vla3MiKTsKIAkJT2JqZWN0SWQgY2lkID0gaW5zZXJ0Q29tbWl0KGNvbW1pdCk7CiAJCWFzc2VydEVxdWFscygiNDY4MDkwODExMjc3ODcxOGYzN2U2ODZjYmViY2M5MTI3MzBiMzE1NCIsIGNpZC5uYW1lKCkpOwpAQCAtNTYyLDcgKzU1Nyw3IEBAIHB1YmxpYyB2b2lkIHRlc3QwMjVfY29tcHV0ZVNoYTFOb1N0b3JlKCkgewogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdDAyNl9DcmVhdGVDb21taXRNdWx0aXBsZXBhcmVudHMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBPYmplY3RJZCB0cmVlSWQ7Ci0JCXRyeSAoZmluYWwgT2JqZWN0SW5zZXJ0ZXIgb2kgPSBkYi5uZXdPYmplY3RJbnNlcnRlcigpKSB7CisJCXRyeSAoT2JqZWN0SW5zZXJ0ZXIgb2kgPSBkYi5uZXdPYmplY3RJbnNlcnRlcigpKSB7CiAJCQlmaW5hbCBPYmplY3RJZCBibG9iSWQgPSBvaS5pbnNlcnQoQ29uc3RhbnRzLk9CSl9CTE9CLAogCQkJCQkiYW5kIHRoaXMgaXMgdGhlIGRhdGEgaW4gbWVcbiIuZ2V0Qnl0ZXMoQ29uc3RhbnRzLkNIQVJTRVQKIAkJCQkJCQkubmFtZSgpKSk7CkBAIC03NTIsNyArNzQ3LDcgQEAgcHJpdmF0ZSBPYmplY3RJZCBpbnNlcnRUcmVlKFRyZWVGb3JtYXR0ZXIgdHJlZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJfQogCX0KIAotCXByaXZhdGUgT2JqZWN0SWQgaW5zZXJ0Q29tbWl0KGZpbmFsIENvbW1pdEJ1aWxkZXIgYnVpbGRlcikKKwlwcml2YXRlIE9iamVjdElkIGluc2VydENvbW1pdChDb21taXRCdWlsZGVyIGJ1aWxkZXIpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24sIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gewogCQl0cnkgKE9iamVjdEluc2VydGVyIG9pID0gZGIubmV3T2JqZWN0SW5zZXJ0ZXIoKSkgewogCQkJT2JqZWN0SWQgaWQgPSBvaS5pbnNlcnQoYnVpbGRlcik7CkBAIC03NjksNyArNzY0LDcgQEAgcHJpdmF0ZSBSZXZDb21taXQgcGFyc2VDb21taXQoQW55T2JqZWN0SWQgaWQpCiAJCX0KIAl9CiAKLQlwcml2YXRlIE9iamVjdElkIGluc2VydFRhZyhmaW5hbCBUYWdCdWlsZGVyIHRhZykgdGhyb3dzIElPRXhjZXB0aW9uLAorCXByaXZhdGUgT2JqZWN0SWQgaW5zZXJ0VGFnKFRhZ0J1aWxkZXIgdGFnKSB0aHJvd3MgSU9FeGNlcHRpb24sCiAJCQlVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKIAkJdHJ5IChPYmplY3RJbnNlcnRlciBvaSA9IGRiLm5ld09iamVjdEluc2VydGVyKCkpIHsKIAkJCU9iamVjdElkIGlkID0gb2kuaW5zZXJ0KHRhZyk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1VucGFja2VkT2JqZWN0VGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9VbnBhY2tlZE9iamVjdFRlc3QuamF2YQppbmRleCBjNWFiNzY2Li45OGZmMDRlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1VucGFja2VkT2JqZWN0VGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvVW5wYWNrZWRPYmplY3RUZXN0LmphdmEKQEAgLTEzMCwxNSArMTMwLDE1IEBAIHB1YmxpYyB2b2lkIHRlc3RTdGFuZGFyZEZvcm1hdF9TbWFsbE9iamVjdCgpIHRocm93cyBFeGNlcHRpb24gewogCQlhc3NlcnRGYWxzZSgiaXMgbm90IGxhcmdlIiwgb2wuaXNMYXJnZSgpKTsKIAkJYXNzZXJ0VHJ1ZSgic2FtZSBjb250ZW50IiwgQXJyYXlzLmVxdWFscyhkYXRhLCBvbC5nZXRDYWNoZWRCeXRlcygpKSk7CiAKLQkJT2JqZWN0U3RyZWFtIGluID0gb2wub3BlblN0cmVhbSgpOwotCQlhc3NlcnROb3ROdWxsKCJoYXZlIHN0cmVhbSIsIGluKTsKLQkJYXNzZXJ0RXF1YWxzKHR5cGUsIGluLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhkYXRhLmxlbmd0aCwgaW4uZ2V0U2l6ZSgpKTsKLQkJYnl0ZVtdIGRhdGEyID0gbmV3IGJ5dGVbZGF0YS5sZW5ndGhdOwotCQlJTy5yZWFkRnVsbHkoaW4sIGRhdGEyLCAwLCBkYXRhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoInNhbWUgY29udGVudCIsIEFycmF5cy5lcXVhbHMoZGF0YTIsIGRhdGEpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdHJlYW0gYXQgRU9GIiwgLTEsIGluLnJlYWQoKSk7Ci0JCWluLmNsb3NlKCk7CisJCXRyeSAoT2JqZWN0U3RyZWFtIGluID0gb2wub3BlblN0cmVhbSgpKSB7CisJCQlhc3NlcnROb3ROdWxsKCJoYXZlIHN0cmVhbSIsIGluKTsKKwkJCWFzc2VydEVxdWFscyh0eXBlLCBpbi5nZXRUeXBlKCkpOworCQkJYXNzZXJ0RXF1YWxzKGRhdGEubGVuZ3RoLCBpbi5nZXRTaXplKCkpOworCQkJYnl0ZVtdIGRhdGEyID0gbmV3IGJ5dGVbZGF0YS5sZW5ndGhdOworCQkJSU8ucmVhZEZ1bGx5KGluLCBkYXRhMiwgMCwgZGF0YS5sZW5ndGgpOworCQkJYXNzZXJ0VHJ1ZSgic2FtZSBjb250ZW50IiwgQXJyYXlzLmVxdWFscyhkYXRhMiwgZGF0YSkpOworCQkJYXNzZXJ0RXF1YWxzKCJzdHJlYW0gYXQgRU9GIiwgLTEsIGluLnJlYWQoKSk7CisJCX0KIAl9CiAKIAlAVGVzdApAQCAtMTUwLDExICsxNTAsOCBAQCBwdWJsaWMgdm9pZCB0ZXN0U3RhbmRhcmRGb3JtYXRfTGFyZ2VPYmplY3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogCQlPYmplY3RMb2FkZXIgb2w7CiAJCXsKLQkJCUZpbGVJbnB1dFN0cmVhbSBmcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ocGF0aChpZCkpOwotCQkJdHJ5IHsKKwkJCXRyeSAoRmlsZUlucHV0U3RyZWFtIGZzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShwYXRoKGlkKSkpIHsKIAkJCQlvbCA9IFVucGFja2VkT2JqZWN0Lm9wZW4oZnMsIHBhdGgoaWQpLCBpZCwgd2MpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlmcy5jbG9zZSgpOwogCQkJfQogCQl9CiAKQEAgLTE3MSwxNSArMTY4LDE1IEBAIHB1YmxpYyB2b2lkIHRlc3RTdGFuZGFyZEZvcm1hdF9MYXJnZU9iamVjdCgpIHRocm93cyBFeGNlcHRpb24gewogCQkJCQkuZ2V0TWVzc2FnZSgpKTsKIAkJfQogCi0JCU9iamVjdFN0cmVhbSBpbiA9IG9sLm9wZW5TdHJlYW0oKTsKLQkJYXNzZXJ0Tm90TnVsbCgiaGF2ZSBzdHJlYW0iLCBpbik7Ci0JCWFzc2VydEVxdWFscyh0eXBlLCBpbi5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoZGF0YS5sZW5ndGgsIGluLmdldFNpemUoKSk7Ci0JCWJ5dGVbXSBkYXRhMiA9IG5ldyBieXRlW2RhdGEubGVuZ3RoXTsKLQkJSU8ucmVhZEZ1bGx5KGluLCBkYXRhMiwgMCwgZGF0YS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKCJzYW1lIGNvbnRlbnQiLCBBcnJheXMuZXF1YWxzKGRhdGEyLCBkYXRhKSk7Ci0JCWFzc2VydEVxdWFscygic3RyZWFtIGF0IEVPRiIsIC0xLCBpbi5yZWFkKCkpOwotCQlpbi5jbG9zZSgpOworCQl0cnkgKE9iamVjdFN0cmVhbSBpbiA9IG9sLm9wZW5TdHJlYW0oKSkgeworCQkJYXNzZXJ0Tm90TnVsbCgiaGF2ZSBzdHJlYW0iLCBpbik7CisJCQlhc3NlcnRFcXVhbHModHlwZSwgaW4uZ2V0VHlwZSgpKTsKKwkJCWFzc2VydEVxdWFscyhkYXRhLmxlbmd0aCwgaW4uZ2V0U2l6ZSgpKTsKKwkJCWJ5dGVbXSBkYXRhMiA9IG5ldyBieXRlW2RhdGEubGVuZ3RoXTsKKwkJCUlPLnJlYWRGdWxseShpbiwgZGF0YTIsIDAsIGRhdGEubGVuZ3RoKTsKKwkJCWFzc2VydFRydWUoInNhbWUgY29udGVudCIsIEFycmF5cy5lcXVhbHMoZGF0YTIsIGRhdGEpKTsKKwkJCWFzc2VydEVxdWFscygic3RyZWFtIGF0IEVPRiIsIC0xLCBpbi5yZWFkKCkpOworCQl9CiAJfQogCiAJQFRlc3QKQEAgLTMxNiwyMyArMzEzLDEzIEBAIHB1YmxpYyB2b2lkIHRlc3RTdGFuZGFyZEZvcm1hdF9MYXJnZU9iamVjdF9Db3JydXB0WkxpYlN0cmVhbSgpCiAJCXdyaXRlKGlkLCBneik7CiAKIAkJT2JqZWN0TG9hZGVyIG9sOwotCQl7Ci0JCQlGaWxlSW5wdXRTdHJlYW0gZnMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHBhdGgoaWQpKTsKLQkJCXRyeSB7Ci0JCQkJb2wgPSBVbnBhY2tlZE9iamVjdC5vcGVuKGZzLCBwYXRoKGlkKSwgaWQsIHdjKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJZnMuY2xvc2UoKTsKLQkJCX0KKwkJdHJ5IChGaWxlSW5wdXRTdHJlYW0gZnMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHBhdGgoaWQpKSkgeworCQkJb2wgPSBVbnBhY2tlZE9iamVjdC5vcGVuKGZzLCBwYXRoKGlkKSwgaWQsIHdjKTsKIAkJfQogCi0JCXRyeSB7Ci0JCQlieXRlW10gdG1wID0gbmV3IGJ5dGVbZGF0YS5sZW5ndGhdOwotCQkJSW5wdXRTdHJlYW0gaW4gPSBvbC5vcGVuU3RyZWFtKCk7Ci0JCQl0cnkgewotCQkJCUlPLnJlYWRGdWxseShpbiwgdG1wLCAwLCB0bXAubGVuZ3RoKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaW4uY2xvc2UoKTsKLQkJCX0KKwkJYnl0ZVtdIHRtcCA9IG5ldyBieXRlW2RhdGEubGVuZ3RoXTsKKwkJdHJ5IChJbnB1dFN0cmVhbSBpbiA9IG9sLm9wZW5TdHJlYW0oKSkgeworCQkJSU8ucmVhZEZ1bGx5KGluLCB0bXAsIDAsIHRtcC5sZW5ndGgpOwogCQkJZmFpbCgiRGlkIG5vdCB0aHJvdyBDb3JydXB0T2JqZWN0RXhjZXB0aW9uIik7CiAJCX0gY2F0Y2ggKENvcnJ1cHRPYmplY3RFeGNlcHRpb24gY29lKSB7CiAJCQlhc3NlcnRFcXVhbHMoTWVzc2FnZUZvcm1hdC5mb3JtYXQoSkdpdFRleHQuZ2V0KCkub2JqZWN0SXNDb3JydXB0LApAQCAtMzU0LDE2ICszNDEsMTIgQEAgcHVibGljIHZvaWQgdGVzdFN0YW5kYXJkRm9ybWF0X0xhcmdlT2JqZWN0X1RydW5jYXRlZFpMaWJTdHJlYW0oKQogCQl3cml0ZShpZCwgdHIpOwogCiAJCU9iamVjdExvYWRlciBvbDsKLQkJewotCQkJRmlsZUlucHV0U3RyZWFtIGZzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShwYXRoKGlkKSk7Ci0JCQl0cnkgewotCQkJCW9sID0gVW5wYWNrZWRPYmplY3Qub3BlbihmcywgcGF0aChpZCksIGlkLCB3Yyk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWZzLmNsb3NlKCk7Ci0JCQl9CisJCXRyeSAoRmlsZUlucHV0U3RyZWFtIGZzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShwYXRoKGlkKSkpIHsKKwkJCW9sID0gVW5wYWNrZWRPYmplY3Qub3BlbihmcywgcGF0aChpZCksIGlkLCB3Yyk7CiAJCX0KIAogCQlieXRlW10gdG1wID0gbmV3IGJ5dGVbZGF0YS5sZW5ndGhdOworCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBXZSBhcmUgdGVzdGluZyB0aGF0IHRoZSBjbG9zZSgpIG1ldGhvZCB0aHJvd3MKIAkJSW5wdXRTdHJlYW0gaW4gPSBvbC5vcGVuU3RyZWFtKCk7CiAJCUlPLnJlYWRGdWxseShpbiwgdG1wLCAwLCB0bXAubGVuZ3RoKTsKIAkJdHJ5IHsKQEAgLTM4OSwxNiArMzcyLDEyIEBAIHB1YmxpYyB2b2lkIHRlc3RTdGFuZGFyZEZvcm1hdF9MYXJnZU9iamVjdF9UcmFpbGluZ0dhcmJhZ2UoKQogCQl3cml0ZShpZCwgdHIpOwogCiAJCU9iamVjdExvYWRlciBvbDsKLQkJewotCQkJRmlsZUlucHV0U3RyZWFtIGZzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShwYXRoKGlkKSk7Ci0JCQl0cnkgewotCQkJCW9sID0gVW5wYWNrZWRPYmplY3Qub3BlbihmcywgcGF0aChpZCksIGlkLCB3Yyk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWZzLmNsb3NlKCk7Ci0JCQl9CisJCXRyeSAoRmlsZUlucHV0U3RyZWFtIGZzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShwYXRoKGlkKSkpIHsKKwkJCW9sID0gVW5wYWNrZWRPYmplY3Qub3BlbihmcywgcGF0aChpZCksIGlkLCB3Yyk7CiAJCX0KIAogCQlieXRlW10gdG1wID0gbmV3IGJ5dGVbZGF0YS5sZW5ndGhdOworCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBXZSBhcmUgdGVzdGluZyB0aGF0IHRoZSBjbG9zZSgpIG1ldGhvZCB0aHJvd3MKIAkJSW5wdXRTdHJlYW0gaW4gPSBvbC5vcGVuU3RyZWFtKCk7CiAJCUlPLnJlYWRGdWxseShpbiwgdG1wLCAwLCB0bXAubGVuZ3RoKTsKIAkJdHJ5IHsKQEAgLTQyNiwxNCArNDA1LDE1IEBAIHB1YmxpYyB2b2lkIHRlc3RQYWNrRm9ybWF0X1NtYWxsT2JqZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWFzc2VydEZhbHNlKCJpcyBub3QgbGFyZ2UiLCBvbC5pc0xhcmdlKCkpOwogCQlhc3NlcnRUcnVlKCJzYW1lIGNvbnRlbnQiLCBBcnJheXMuZXF1YWxzKGRhdGEsIG9sLmdldENhY2hlZEJ5dGVzKCkpKTsKIAotCQlPYmplY3RTdHJlYW0gaW4gPSBvbC5vcGVuU3RyZWFtKCk7Ci0JCWFzc2VydE5vdE51bGwoImhhdmUgc3RyZWFtIiwgaW4pOwotCQlhc3NlcnRFcXVhbHModHlwZSwgaW4uZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGRhdGEubGVuZ3RoLCBpbi5nZXRTaXplKCkpOwotCQlieXRlW10gZGF0YTIgPSBuZXcgYnl0ZVtkYXRhLmxlbmd0aF07Ci0JCUlPLnJlYWRGdWxseShpbiwgZGF0YTIsIDAsIGRhdGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZSgic2FtZSBjb250ZW50IiwgQXJyYXlzLmVxdWFscyhkYXRhLCBvbC5nZXRDYWNoZWRCeXRlcygpKSk7Ci0JCWluLmNsb3NlKCk7CisJCXRyeSAoT2JqZWN0U3RyZWFtIGluID0gb2wub3BlblN0cmVhbSgpKSB7CisJCQlhc3NlcnROb3ROdWxsKCJoYXZlIHN0cmVhbSIsIGluKTsKKwkJCWFzc2VydEVxdWFscyh0eXBlLCBpbi5nZXRUeXBlKCkpOworCQkJYXNzZXJ0RXF1YWxzKGRhdGEubGVuZ3RoLCBpbi5nZXRTaXplKCkpOworCQkJYnl0ZVtdIGRhdGEyID0gbmV3IGJ5dGVbZGF0YS5sZW5ndGhdOworCQkJSU8ucmVhZEZ1bGx5KGluLCBkYXRhMiwgMCwgZGF0YS5sZW5ndGgpOworCQkJYXNzZXJ0VHJ1ZSgic2FtZSBjb250ZW50IiwKKwkJCQkJQXJyYXlzLmVxdWFscyhkYXRhLCBvbC5nZXRDYWNoZWRCeXRlcygpKSk7CisJCX0KIAl9CiAKIAlAVGVzdApAQCAtNDQ0LDEzICs0MjQsOCBAQCBwdWJsaWMgdm9pZCB0ZXN0UGFja0Zvcm1hdF9MYXJnZU9iamVjdCgpIHRocm93cyBFeGNlcHRpb24gewogCQl3cml0ZShpZCwgY29tcHJlc3NQYWNrRm9ybWF0KHR5cGUsIGRhdGEpKTsKIAogCQlPYmplY3RMb2FkZXIgb2w7Ci0JCXsKLQkJCUZpbGVJbnB1dFN0cmVhbSBmcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ocGF0aChpZCkpOwotCQkJdHJ5IHsKLQkJCQlvbCA9IFVucGFja2VkT2JqZWN0Lm9wZW4oZnMsIHBhdGgoaWQpLCBpZCwgd2MpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlmcy5jbG9zZSgpOwotCQkJfQorCQl0cnkgKEZpbGVJbnB1dFN0cmVhbSBmcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ocGF0aChpZCkpKSB7CisJCQlvbCA9IFVucGFja2VkT2JqZWN0Lm9wZW4oZnMsIHBhdGgoaWQpLCBpZCwgd2MpOwogCQl9CiAKIAkJYXNzZXJ0Tm90TnVsbCgiY3JlYXRlZCBsb2FkZXIiLCBvbCk7CkBAIC00NjYsMTUgKzQ0MSwxNSBAQCBwdWJsaWMgdm9pZCB0ZXN0UGFja0Zvcm1hdF9MYXJnZU9iamVjdCgpIHRocm93cyBFeGNlcHRpb24gewogCQkJCQkuZ2V0TWVzc2FnZSgpKTsKIAkJfQogCi0JCU9iamVjdFN0cmVhbSBpbiA9IG9sLm9wZW5TdHJlYW0oKTsKLQkJYXNzZXJ0Tm90TnVsbCgiaGF2ZSBzdHJlYW0iLCBpbik7Ci0JCWFzc2VydEVxdWFscyh0eXBlLCBpbi5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoZGF0YS5sZW5ndGgsIGluLmdldFNpemUoKSk7Ci0JCWJ5dGVbXSBkYXRhMiA9IG5ldyBieXRlW2RhdGEubGVuZ3RoXTsKLQkJSU8ucmVhZEZ1bGx5KGluLCBkYXRhMiwgMCwgZGF0YS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKCJzYW1lIGNvbnRlbnQiLCBBcnJheXMuZXF1YWxzKGRhdGEyLCBkYXRhKSk7Ci0JCWFzc2VydEVxdWFscygic3RyZWFtIGF0IEVPRiIsIC0xLCBpbi5yZWFkKCkpOwotCQlpbi5jbG9zZSgpOworCQl0cnkgKE9iamVjdFN0cmVhbSBpbiA9IG9sLm9wZW5TdHJlYW0oKSkgeworCQkJYXNzZXJ0Tm90TnVsbCgiaGF2ZSBzdHJlYW0iLCBpbik7CisJCQlhc3NlcnRFcXVhbHModHlwZSwgaW4uZ2V0VHlwZSgpKTsKKwkJCWFzc2VydEVxdWFscyhkYXRhLmxlbmd0aCwgaW4uZ2V0U2l6ZSgpKTsKKwkJCWJ5dGVbXSBkYXRhMiA9IG5ldyBieXRlW2RhdGEubGVuZ3RoXTsKKwkJCUlPLnJlYWRGdWxseShpbiwgZGF0YTIsIDAsIGRhdGEubGVuZ3RoKTsKKwkJCWFzc2VydFRydWUoInNhbWUgY29udGVudCIsIEFycmF5cy5lcXVhbHMoZGF0YTIsIGRhdGEpKTsKKwkJCWFzc2VydEVxdWFscygic3RyZWFtIGF0IEVPRiIsIC0xLCBpbi5yZWFkKCkpOworCQl9CiAJfQogCiAJQFRlc3QKQEAgLTU3MywxMSArNTQ4LDggQEAgcHJpdmF0ZSBGaWxlIHBhdGgoT2JqZWN0SWQgaWQpIHsKIAlwcml2YXRlIHZvaWQgd3JpdGUoT2JqZWN0SWQgaWQsIGJ5dGVbXSBkYXRhKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlGaWxlIHBhdGggPSBwYXRoKGlkKTsKIAkJRmlsZVV0aWxzLm1rZGlycyhwYXRoLmdldFBhcmVudEZpbGUoKSk7Ci0JCUZpbGVPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0ocGF0aCk7Ci0JCXRyeSB7CisJCXRyeSAoRmlsZU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShwYXRoKSkgewogCQkJb3V0LndyaXRlKGRhdGEpOwotCQl9IGZpbmFsbHkgewotCQkJb3V0LmNsb3NlKCk7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvV2luZG93Q2FjaGVHZXRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1dpbmRvd0NhY2hlR2V0VGVzdC5qYXZhCmluZGV4IGNjMzQ4MzguLjgyYWQyOGUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvV2luZG93Q2FjaGVHZXRUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9XaW5kb3dDYWNoZUdldFRlc3QuamF2YQpAQCAtNzQsMTEgKzc0LDEwIEBAIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXN1cGVyLnNldFVwKCk7CiAKIAkJdG9Mb2FkID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0JCWZpbmFsIEJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcigKKwkJdHJ5IChCdWZmZXJlZFJlYWRlciBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoCiAJCQkJbmV3IEZpbGVJbnB1dFN0cmVhbShKR2l0VGVzdFV0aWwKIAkJCQkJCS5nZXRUZXN0UmVzb3VyY2VGaWxlKCJhbGxfcGFja2VkX29iamVjdHMudHh0IikpLAotCQkJCUNvbnN0YW50cy5DSEFSU0VUKSk7Ci0JCXRyeSB7CisJCQkJQ29uc3RhbnRzLkNIQVJTRVQpKSkgewogCQkJU3RyaW5nIGxpbmU7CiAJCQl3aGlsZSAoKGxpbmUgPSBici5yZWFkTGluZSgpKSAhPSBudWxsKSB7CiAJCQkJZmluYWwgU3RyaW5nW10gcGFydHMgPSBsaW5lLnNwbGl0KCIgezEsfSIpOwpAQCAtOTAsOCArODksNiBAQCBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewogCQkJCS8vIHBhcnRzWzRdIGlzIHRoZSBvZmZzZXQgaW4gdGhlIHBhY2sKIAkJCQl0b0xvYWQuYWRkKG8pOwogCQkJfQotCQl9IGZpbmFsbHkgewotCQkJYnIuY2xvc2UoKTsKIAkJfQogCQlhc3NlcnRFcXVhbHMoOTYsIHRvTG9hZC5zaXplKCkpOwogCX0KQEAgLTEyNyw3ICsxMjQsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0Q2FjaGVfVG9vU21hbGxMaW1pdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWNoZWNrTGltaXRzKGNmZyk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja0xpbWl0cyhmaW5hbCBXaW5kb3dDYWNoZUNvbmZpZyBjZmcpIHsKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrTGltaXRzKFdpbmRvd0NhY2hlQ29uZmlnIGNmZykgewogCQlmaW5hbCBXaW5kb3dDYWNoZSBjYWNoZSA9IFdpbmRvd0NhY2hlLmdldEluc3RhbmNlKCk7CiAJCWFzc2VydFRydWUoY2FjaGUuZ2V0T3BlbkZpbGVzKCkgPD0gY2ZnLmdldFBhY2tlZEdpdE9wZW5GaWxlcygpKTsKIAkJYXNzZXJ0VHJ1ZShjYWNoZS5nZXRPcGVuQnl0ZXMoKSA8PSBjZmcuZ2V0UGFja2VkR2l0TGltaXQoKSk7CkBAIC0xMzYsNyArMTMzLDcgQEAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja0xpbWl0cyhmaW5hbCBXaW5kb3dDYWNoZUNvbmZpZyBjZmcpIHsKIAl9CiAKIAlwcml2YXRlIHZvaWQgZG9DYWNoZVRlc3RzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZm9yIChmaW5hbCBUZXN0T2JqZWN0IG8gOiB0b0xvYWQpIHsKKwkJZm9yIChUZXN0T2JqZWN0IG8gOiB0b0xvYWQpIHsKIAkJCWZpbmFsIE9iamVjdExvYWRlciBvciA9IGRiLm9wZW4oby5pZCwgby50eXBlKTsKIAkJCWFzc2VydE5vdE51bGwob3IpOwogCQkJYXNzZXJ0RXF1YWxzKG8udHlwZSwgb3IuZ2V0VHlwZSgpKTsKQEAgLTE0OCw3ICsxNDUsNyBAQCBwcml2YXRlIGNsYXNzIFRlc3RPYmplY3QgewogCiAJCWludCB0eXBlOwogCi0JCXZvaWQgc2V0VHlwZShmaW5hbCBTdHJpbmcgdHlwZVN0cikgdGhyb3dzIENvcnJ1cHRPYmplY3RFeGNlcHRpb24geworCQl2b2lkIHNldFR5cGUoU3RyaW5nIHR5cGVTdHIpIHRocm93cyBDb3JydXB0T2JqZWN0RXhjZXB0aW9uIHsKIAkJCWZpbmFsIGJ5dGVbXSB0eXBlUmF3ID0gQ29uc3RhbnRzLmVuY29kZSh0eXBlU3RyICsgIiAiKTsKIAkJCWZpbmFsIE11dGFibGVJbnRlZ2VyIHB0ciA9IG5ldyBNdXRhYmxlSW50ZWdlcigpOwogCQkJdHlwZSA9IENvbnN0YW50cy5kZWNvZGVUeXBlU3RyaW5nKGlkLCB0eXBlUmF3LCAoYnl0ZSkgJyAnLCBwdHIpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9YSW5wdXRTdHJlYW0uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvWElucHV0U3RyZWFtLmphdmEKaW5kZXggNDZmOWVlMy4uOTEwOTk5YyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9YSW5wdXRTdHJlYW0uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1hJbnB1dFN0cmVhbS5qYXZhCkBAIC01Myw3ICs1Myw3IEBACiBjbGFzcyBYSW5wdXRTdHJlYW0gZXh0ZW5kcyBCdWZmZXJlZElucHV0U3RyZWFtIHsKIAlwcml2YXRlIGZpbmFsIGJ5dGVbXSBpbnRidWYgPSBuZXcgYnl0ZVs4XTsKIAotCVhJbnB1dFN0cmVhbShmaW5hbCBJbnB1dFN0cmVhbSBzKSB7CisJWElucHV0U3RyZWFtKElucHV0U3RyZWFtIHMpIHsKIAkJc3VwZXIocyk7CiAJfQogCkBAIC02Myw3ICs2Myw3IEBAIGNsYXNzIFhJbnB1dFN0cmVhbSBleHRlbmRzIEJ1ZmZlcmVkSW5wdXRTdHJlYW0gewogCQlyZXR1cm4gYjsKIAl9CiAKLQlzeW5jaHJvbml6ZWQgdm9pZCByZWFkRnVsbHkoZmluYWwgYnl0ZVtdIGIsIGludCBvLCBpbnQgbGVuKQorCXN5bmNocm9uaXplZCB2b2lkIHJlYWRGdWxseShieXRlW10gYiwgaW50IG8sIGludCBsZW4pCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlpbnQgcjsKIAkJd2hpbGUgKGxlbiA+IDAgJiYgKHIgPSByZWFkKGIsIG8sIGxlbikpID4gMCkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcmVmdHJlZS9SZWZUcmVlRGF0YWJhc2VUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9yZWZ0cmVlL1JlZlRyZWVEYXRhYmFzZVRlc3QuamF2YQppbmRleCAxNjg0YWZhLi5hZTUyYWQ1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9yZWZ0cmVlL1JlZlRyZWVEYXRhYmFzZVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9yZWZ0cmVlL1JlZlRyZWVEYXRhYmFzZVRlc3QuamF2YQpAQCAtNjMxLDcgKzYzMSw3IEBAIHByaXZhdGUgc3RhdGljIFJlY2VpdmVDb21tYW5kIGNvbW1hbmQoQW55T2JqZWN0SWQgYSwgQW55T2JqZWN0SWQgYiwKIAkJCQluYW1lKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgc3ltcmVmKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBTdHJpbmcgZHN0KQorCXByaXZhdGUgdm9pZCBzeW1yZWYoU3RyaW5nIG5hbWUsIFN0cmluZyBkc3QpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQljb21taXQobmV3IEZ1bmN0aW9uKCkgewogCQkJQE92ZXJyaWRlCkBAIC02NDgsNyArNjQ4LDcgQEAgcHVibGljIGJvb2xlYW4gYXBwbHkoT2JqZWN0UmVhZGVyIHJlYWRlciwgUmVmVHJlZSB0cmVlKQogCQl9KTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgdXBkYXRlKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBPYmplY3RJZCBpZCkKKwlwcml2YXRlIHZvaWQgdXBkYXRlKFN0cmluZyBuYW1lLCBPYmplY3RJZCBpZCkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWNvbW1pdChuZXcgRnVuY3Rpb24oKSB7CiAJCQlAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9UZXN0UmVwb3NpdG9yeVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9UZXN0UmVwb3NpdG9yeVRlc3QuamF2YQppbmRleCBiNzAyN2YzLi45NjU4OTllIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvanVuaXQvVGVzdFJlcG9zaXRvcnlUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L1Rlc3RSZXBvc2l0b3J5VGVzdC5qYXZhCkBAIC00Myw3ICs0Myw3IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5qdW5pdDsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3RFcXVhbHM7CkBAIC00MTgsNiArNDE4LDYgQEAgcHJpdmF0ZSBTdHJpbmcgYmxvYkFzU3RyaW5nKEFueU9iamVjdElkIHRyZWVpc2gsIFN0cmluZyBwYXRoKQogCQlSZXZPYmplY3Qgb2JqID0gdHIuZ2V0KHJ3LnBhcnNlVHJlZSh0cmVlaXNoKSwgcGF0aCk7CiAJCWFzc2VydFNhbWUoUmV2QmxvYi5jbGFzcywgb2JqLmdldENsYXNzKCkpOwogCQlPYmplY3RMb2FkZXIgbG9hZGVyID0gcncuZ2V0T2JqZWN0UmVhZGVyKCkub3BlbihvYmopOwotCQlyZXR1cm4gbmV3IFN0cmluZyhsb2FkZXIuZ2V0Q2FjaGVkQnl0ZXMoKSwgVVRGXzgpOworCQlyZXR1cm4gbmV3IFN0cmluZyhsb2FkZXIuZ2V0Q2FjaGVkQnl0ZXMoKSwgQ0hBUlNFVCk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9CcmFuY2hDb25maWdUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL0JyYW5jaENvbmZpZ1Rlc3QuamF2YQppbmRleCA4N2JiMDgyLi4xZWNkZjIxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL0JyYW5jaENvbmZpZ1Rlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL0JyYW5jaENvbmZpZ1Rlc3QuamF2YQpAQCAtMTYwLDcgKzE2MCw3IEBAIHB1YmxpYyB2b2lkIGlzUmViYXNlKCkgewogCQlhc3NlcnRUcnVlKG5ldyBCcmFuY2hDb25maWcoYywgInRydWUiKS5pc1JlYmFzZSgpKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBDb25maWcgcGFyc2UoZmluYWwgU3RyaW5nIGNvbnRlbnQpIHsKKwlwcml2YXRlIHN0YXRpYyBDb25maWcgcGFyc2UoU3RyaW5nIGNvbnRlbnQpIHsKIAkJZmluYWwgQ29uZmlnIGMgPSBuZXcgQ29uZmlnKG51bGwpOwogCQl0cnkgewogCQkJYy5mcm9tVGV4dChjb250ZW50KTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29uZmlnVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db25maWdUZXN0LmphdmEKaW5kZXggNzg2MjAwNS4uYzRjNGRhOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db25maWdUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db25maWdUZXN0LmphdmEKQEAgLTkxNCwxMiArOTE0LDEyIEBAIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0UmVhZExvbmcobG9uZyBleHAsIFN0cmluZyBhY3QpCiAJCWFzc2VydEVxdWFscyhleHAsIGMuZ2V0TG9uZygicyIsIG51bGwsICJhIiwgMEwpKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBDb25maWcgcGFyc2UoZmluYWwgU3RyaW5nIGNvbnRlbnQpCisJcHJpdmF0ZSBzdGF0aWMgQ29uZmlnIHBhcnNlKFN0cmluZyBjb250ZW50KQogCQkJdGhyb3dzIENvbmZpZ0ludmFsaWRFeGNlcHRpb24gewogCQlyZXR1cm4gcGFyc2UoY29udGVudCwgbnVsbCk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgQ29uZmlnIHBhcnNlKGZpbmFsIFN0cmluZyBjb250ZW50LCBDb25maWcgYmFzZUNvbmZpZykKKwlwcml2YXRlIHN0YXRpYyBDb25maWcgcGFyc2UoU3RyaW5nIGNvbnRlbnQsIENvbmZpZyBiYXNlQ29uZmlnKQogCQkJdGhyb3dzIENvbmZpZ0ludmFsaWRFeGNlcHRpb24gewogCQlmaW5hbCBDb25maWcgYyA9IG5ldyBDb25maWcoYmFzZUNvbmZpZyk7CiAJCWMuZnJvbVRleHQoY29udGVudCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL0RpckNhY2hlQ2hlY2tvdXRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL0RpckNhY2hlQ2hlY2tvdXRUZXN0LmphdmEKaW5kZXggMDQxMjI0Mi4uZWI4NzgyNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9EaXJDYWNoZUNoZWNrb3V0VGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvRGlyQ2FjaGVDaGVja291dFRlc3QuamF2YQpAQCAtNzgsOCArNzgsMTAgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LlRlc3RSZXBvc2l0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuVGVzdFJlcG9zaXRvcnkuQnJhbmNoQnVpbGRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2Q29tbWl0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuQWJzdHJhY3RUcmVlSXRlcmF0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5GaWxlVHJlZUl0ZXJhdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuVHJlZVdhbGs7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5Xb3JraW5nVHJlZUl0ZXJhdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5GUzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuRmlsZVV0aWxzOwogaW1wb3J0IG9yZy5qdW5pdC5Bc3N1bWU7CkBAIC0xOTA0LDYgKzE5MDYsMTE3IEBAIHB1YmxpYyB2b2lkIHRlc3RMb25nRmlsZW5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJYXNzZXJ0VXBkYXRlZChsb25nRmlsZU5hbWUpOwogCX0KIAorCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdElnbm9yZWREaXJlY3RvcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJd3JpdGVUcmFzaEZpbGUoIi5naXRpZ25vcmUiLCAic3JjL2lnbm9yZWQiKTsKKwkJd3JpdGVUcmFzaEZpbGUoInNyYy9pZ25vcmVkL3N1Yi9mb28udHh0IiwgIjEiKTsKKwkJdHJ5IChHaXQgZ2l0ID0gbmV3IEdpdChkYikpIHsKKwkJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiLiIpLmNhbGwoKTsKKwkJCVJldkNvbW1pdCBjb21taXQgPSBnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiYWRkaW5nIC5naXRpZ25vcmUiKQorCQkJCQkuY2FsbCgpOworCQkJd3JpdGVUcmFzaEZpbGUoImZvby50eHQiLCAiMiIpOworCQkJd3JpdGVUcmFzaEZpbGUoInp6ei50eHQiLCAiMyIpOworCQkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJmb28udHh0IikuY2FsbCgpOworCQkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoImFkZCBmaWxlIikuY2FsbCgpOworCQkJYXNzZXJ0RXF1YWxzKCJTaG91bGQgbm90IGhhdmUgZW50ZXJlZCBpZ25vcmVkIGRpcmVjdG9yeSIsIDEsCisJCQkJCXJlc2V0SGFyZEFuZENvdW50KGNvbW1pdCkpOworCQl9CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0SWdub3JlZERpcmVjdG9yeVdpdGhUcmFja2VkQ29udGVudCgpIHRocm93cyBFeGNlcHRpb24geworCQl3cml0ZVRyYXNoRmlsZSgic3JjL2lnbm9yZWQvc3ViL2Zvby50eHQiLCAiMSIpOworCQl0cnkgKEdpdCBnaXQgPSBuZXcgR2l0KGRiKSkgeworCQkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCIuIikuY2FsbCgpOworCQkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoImFkZGluZyBmb28udHh0IikuY2FsbCgpOworCQkJd3JpdGVUcmFzaEZpbGUoIi5naXRpZ25vcmUiLCAic3JjL2lnbm9yZWQiKTsKKwkJCXdyaXRlVHJhc2hGaWxlKCJzcmMvaWdub3JlZC9zdWIvZm9vLnR4dCIsICIyIik7CisJCQl3cml0ZVRyYXNoRmlsZSgic3JjL2lnbm9yZWQvb3RoZXIvYmFyLnR4dCIsICIzIik7CisJCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oIi4iKS5jYWxsKCk7CisJCQlSZXZDb21taXQgY29tbWl0ID0gZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoImFkZGluZyAuZ2l0aWdub3JlIikKKwkJCQkJLmNhbGwoKTsKKwkJCXdyaXRlVHJhc2hGaWxlKCJmb28udHh0IiwgIjIiKTsKKwkJCXdyaXRlVHJhc2hGaWxlKCJ6enoudHh0IiwgIjMiKTsKKwkJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiZm9vLnR4dCIpLmNhbGwoKTsKKwkJCWdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJhZGQgZmlsZSIpLmNhbGwoKTsKKwkJCUZpbGUgZmlsZSA9IHdyaXRlVHJhc2hGaWxlKCJzcmMvaWdub3JlZC9zdWIvZm9vLnR4dCIsICIzIik7CisJCQlhc3NlcnRFcXVhbHMoIlNob3VsZCBoYXZlIGVudGVyZWQgaWdub3JlZCBkaXJlY3RvcnkiLCAzLAorCQkJCQlyZXNldEhhcmRBbmRDb3VudChjb21taXQpKTsKKwkJCWNoZWNrRmlsZShmaWxlLCAiMiIpOworCQl9CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0UmVzZXRXaXRoQ2hhbmdlSW5HaXRpZ25vcmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJd3JpdGVUcmFzaEZpbGUoIi5naXRpZ25vcmUiLCAic3JjL2lnbm9yZWQiKTsKKwkJd3JpdGVUcmFzaEZpbGUoInNyYy9pZ25vcmVkL3N1Yi9mb28udHh0IiwgIjEiKTsKKwkJdHJ5IChHaXQgZ2l0ID0gbmV3IEdpdChkYikpIHsKKwkJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiLiIpLmNhbGwoKTsKKwkJCVJldkNvbW1pdCBpbml0aWFsID0gZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoImluaXRpYWwiKS5jYWxsKCk7CisJCQl3cml0ZVRyYXNoRmlsZSgic3JjL25ld2lnbm9yZWQvZm9vLnR4dCIsICIyIik7CisJCQl3cml0ZVRyYXNoRmlsZSgic3JjLy5naXRpZ25vcmUiLCAibmV3aWdub3JlZCIpOworCQkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCIuIikuY2FsbCgpOworCQkJUmV2Q29tbWl0IGNvbW1pdCA9IGdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJuZXdpZ25vcmVkIikuY2FsbCgpOworCQkJYXNzZXJ0RXF1YWxzKCJTaG91bGQgbm90IGhhdmUgZW50ZXJlZCBzcmMvbmV3aWdub3JlZCBkaXJlY3RvcnkiLCAxLAorCQkJCQlyZXNldEhhcmRBbmRDb3VudChpbml0aWFsKSk7CisJCQlhc3NlcnRFcXVhbHMoIlNob3VsZCBoYXZlIGVudGVyZWQgc3JjL25ld2lnbm9yZWQgZGlyZWN0b3J5IiwgMiwKKwkJCQkJcmVzZXRIYXJkQW5kQ291bnQoY29tbWl0KSk7CisJCQlkZWxldGVUcmFzaEZpbGUoInNyYy8uZ2l0aWdub3JlIik7CisJCQlnaXQucm0oKS5hZGRGaWxlcGF0dGVybigic3JjLy5naXRpZ25vcmUiKS5jYWxsKCk7CisJCQlSZXZDb21taXQgdG9wID0gZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoIlVuaWdub3JlIG5ld2lnbm9yZSIpCisJCQkJCS5jYWxsKCk7CisJCQlhc3NlcnRFcXVhbHMoIlNob3VsZCBoYXZlIGVudGVyZWQgc3JjL25ld2lnbm9yZWQgZGlyZWN0b3J5IiwgMiwKKwkJCQkJcmVzZXRIYXJkQW5kQ291bnQoaW5pdGlhbCkpOworCQkJYXNzZXJ0RXF1YWxzKCJTaG91bGQgaGF2ZSBlbnRlcmVkIHNyYy9uZXdpZ25vcmVkIGRpcmVjdG9yeSIsIDIsCisJCQkJCXJlc2V0SGFyZEFuZENvdW50KGNvbW1pdCkpOworCQkJYXNzZXJ0RXF1YWxzKCJTaG91bGQgbm90IGhhdmUgZW50ZXJlZCBzcmMvbmV3aWdub3JlZCBkaXJlY3RvcnkiLCAxLAorCQkJCQlyZXNldEhhcmRBbmRDb3VudCh0b3ApKTsKKworCQl9CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVGVzdEZpbGVUcmVlSXRlcmF0b3IgZXh0ZW5kcyBGaWxlVHJlZUl0ZXJhdG9yIHsKKworCQkvLyBGb3IgYXNzZXJ0aW9ucyBvbmx5CisJCXByaXZhdGUgZmluYWwgaW50W10gY291bnQ7CisKKwkJcHVibGljIFRlc3RGaWxlVHJlZUl0ZXJhdG9yKFJlcG9zaXRvcnkgcmVwbywgaW50W10gY291bnQpIHsKKwkJCXN1cGVyKHJlcG8pOworCQkJdGhpcy5jb3VudCA9IGNvdW50OworCQl9CisKKwkJcHJvdGVjdGVkIFRlc3RGaWxlVHJlZUl0ZXJhdG9yKGZpbmFsIFdvcmtpbmdUcmVlSXRlcmF0b3IgcCwKKwkJCQlmaW5hbCBGaWxlIHJvb3QsIEZTIGZzLCBGaWxlTW9kZVN0cmF0ZWd5IGZpbGVNb2RlU3RyYXRlZ3ksCisJCQkJaW50W10gY291bnQpIHsKKwkJCXN1cGVyKHAsIHJvb3QsIGZzLCBmaWxlTW9kZVN0cmF0ZWd5KTsKKwkJCXRoaXMuY291bnQgPSBjb3VudDsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgQWJzdHJhY3RUcmVlSXRlcmF0b3IgZW50ZXJTdWJ0cmVlKCkgeworCQkJY291bnRbMF0gKz0gMTsKKwkJCXJldHVybiBuZXcgVGVzdEZpbGVUcmVlSXRlcmF0b3IodGhpcywKKwkJCQkJKChGaWxlRW50cnkpIGN1cnJlbnQoKSkuZ2V0RmlsZSgpLCBmcywgZmlsZU1vZGVTdHJhdGVneSwKKwkJCQkJY291bnQpOworCQl9CisJfQorCisJcHJpdmF0ZSBpbnQgcmVzZXRIYXJkQW5kQ291bnQoUmV2Q29tbWl0IGNvbW1pdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWludFtdIGNhbGxDb3VudCA9IHsgMCB9OworCQlEaXJDYWNoZSBjYWNoZSA9IGRiLmxvY2tEaXJDYWNoZSgpOworCQlGaWxlVHJlZUl0ZXJhdG9yIHdvcmtpbmdUcmVlSXRlcmF0b3IgPSBuZXcgVGVzdEZpbGVUcmVlSXRlcmF0b3IoZGIsCisJCQkJY2FsbENvdW50KTsKKwkJdHJ5IHsKKwkJCURpckNhY2hlQ2hlY2tvdXQgY2hlY2tvdXQgPSBuZXcgRGlyQ2FjaGVDaGVja291dChkYiwgbnVsbCwgY2FjaGUsCisJCQkJCWNvbW1pdC5nZXRUcmVlKCkuZ2V0SWQoKSwgd29ya2luZ1RyZWVJdGVyYXRvcik7CisJCQljaGVja291dC5zZXRGYWlsT25Db25mbGljdChmYWxzZSk7CisJCQljaGVja291dC5jaGVja291dCgpOworCQl9IGZpbmFsbHkgeworCQkJY2FjaGUudW5sb2NrKCk7CisJCX0KKwkJcmV0dXJuIGNhbGxDb3VudFswXTsKKwl9CisKIAlwdWJsaWMgdm9pZCBhc3NlcnRXb3JrRGlyKE1hcDxTdHJpbmcsIFN0cmluZz4gaSkKIAkJCXRocm93cyBDb3JydXB0T2JqZWN0RXhjZXB0aW9uLAogCQkJSU9FeGNlcHRpb24gewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9JbmRleERpZmZUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL0luZGV4RGlmZlRlc3QuamF2YQppbmRleCAyY2I4Zjg2Li41ODBiMDhiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL0luZGV4RGlmZlRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL0luZGV4RGlmZlRlc3QuamF2YQpAQCAtNDcwLDcgKzQ3MCw4IEBAIHB1YmxpYyB2b2lkIHRlc3RVbnRyYWNrZWRGb2xkZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJfQogCiAJLyoqCi0JICogVGVzdCB0aGF0IGlnbm9yZWQgZm9sZGVycyBhcmVuJ3QgbGlzdGVkIGFzIHVudHJhY2tlZAorCSAqIFRlc3QgdGhhdCBpZ25vcmVkIGZvbGRlcnMgYXJlbid0IGxpc3RlZCBhcyB1bnRyYWNrZWQsIGJ1dCBhcmUgbGlzdGVkIGFzCisJICogaWdub3JlZC4KIAkgKgogCSAqIEB0aHJvd3MgRXhjZXB0aW9uCiAJICovCkBAIC00OTksNiArNTAwLDggQEAgcHVibGljIHZvaWQgdGVzdFVudHJhY2tlZE5vdElnbm9yZWRGb2xkZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCQlkaWZmLmRpZmYoKTsKIAkJCWFzc2VydEVxdWFscyhuZXcgSGFzaFNldDw+KEFycmF5cy5hc0xpc3QoInNyYyIpKSwKIAkJCQkJZGlmZi5nZXRVbnRyYWNrZWRGb2xkZXJzKCkpOworCQkJYXNzZXJ0RXF1YWxzKG5ldyBIYXNoU2V0PD4oQXJyYXlzLmFzTGlzdCgic3IiLCAidGFyZ2V0IikpLAorCQkJCQlkaWZmLmdldElnbm9yZWROb3RJbkluZGV4KCkpOwogCiAJCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oInNyYyIpLmNhbGwoKTsKIAkJCXdyaXRlVHJhc2hGaWxlKCJzci9jb20vWDEuamF2YSIsICIiKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvT2JqZWN0Q2hlY2tlclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvT2JqZWN0Q2hlY2tlclRlc3QuamF2YQppbmRleCBmNjg3OWI5Li4xYWIzNmYwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL09iamVjdENoZWNrZXJUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9PYmplY3RDaGVja2VyVGVzdC5qYXZhCkBAIC00NSw3ICs0NSw3IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQubGliOwogCiBpbXBvcnQgc3RhdGljIGphdmEubGFuZy5JbnRlZ2VyLnZhbHVlT2Y7Ci1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuSkdpdFRlc3RVdGlsLmNvbmNhdDsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLk9CSkVDVF9JRF9MRU5HVEg7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5PQkpfQkFEOwpAQCAtMTU2MCw3ICsxNTYwLDcgQEAgcHVibGljIHZvaWQgdGVzdEludmFsaWRUcmVlRHVwbGljYXRlTmFtZXM1KCkKIAkJU3RyaW5nQnVpbGRlciBiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKIAkJZW50cnkoYiwgIjEwMDY0NCBBIik7CiAJCWVudHJ5KGIsICIxMDA2NDQgYSIpOwotCQlieXRlW10gZGF0YSA9IGIudG9TdHJpbmcoKS5nZXRCeXRlcyhVVEZfOCk7CisJCWJ5dGVbXSBkYXRhID0gYi50b1N0cmluZygpLmdldEJ5dGVzKENIQVJTRVQpOwogCQljaGVja2VyLnNldFNhZmVGb3JXaW5kb3dzKHRydWUpOwogCQlhc3NlcnRDb3JydXB0KCJkdXBsaWNhdGUgZW50cnkgbmFtZXMiLCBPQkpfVFJFRSwgZGF0YSk7CiAJCWFzc2VydFNraXBMaXN0QWNjZXB0cyhPQkpfVFJFRSwgZGF0YSk7CkBAIC0xNTc0LDcgKzE1NzQsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFRyZWVEdXBsaWNhdGVOYW1lczYoKQogCQlTdHJpbmdCdWlsZGVyIGIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogCQllbnRyeShiLCAiMTAwNjQ0IEEiKTsKIAkJZW50cnkoYiwgIjEwMDY0NCBhIik7Ci0JCWJ5dGVbXSBkYXRhID0gYi50b1N0cmluZygpLmdldEJ5dGVzKFVURl84KTsKKwkJYnl0ZVtdIGRhdGEgPSBiLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoQ0hBUlNFVCk7CiAJCWNoZWNrZXIuc2V0U2FmZUZvck1hY09TKHRydWUpOwogCQlhc3NlcnRDb3JydXB0KCJkdXBsaWNhdGUgZW50cnkgbmFtZXMiLCBPQkpfVFJFRSwgZGF0YSk7CiAJCWFzc2VydFNraXBMaXN0QWNjZXB0cyhPQkpfVFJFRSwgZGF0YSk7CkBAIC0xNTg4LDcgKzE1ODgsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFRyZWVEdXBsaWNhdGVOYW1lczcoKQogCQlTdHJpbmdCdWlsZGVyIGIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogCQllbnRyeShiLCAiMTAwNjQ0IFx1MDA2NVx1MDMwMSIpOwogCQllbnRyeShiLCAiMTAwNjQ0IFx1MDBlOSIpOwotCQlieXRlW10gZGF0YSA9IGIudG9TdHJpbmcoKS5nZXRCeXRlcyhVVEZfOCk7CisJCWJ5dGVbXSBkYXRhID0gYi50b1N0cmluZygpLmdldEJ5dGVzKENIQVJTRVQpOwogCQljaGVja2VyLnNldFNhZmVGb3JNYWNPUyh0cnVlKTsKIAkJYXNzZXJ0Q29ycnVwdCgiZHVwbGljYXRlIGVudHJ5IG5hbWVzIiwgT0JKX1RSRUUsIGRhdGEpOwogCQlhc3NlcnRTa2lwTGlzdEFjY2VwdHMoT0JKX1RSRUUsIGRhdGEpOwpAQCAtMTYwMiw3ICsxNjAyLDcgQEAgcHVibGljIHZvaWQgdGVzdEludmFsaWRUcmVlRHVwbGljYXRlTmFtZXM4KCkKIAkJU3RyaW5nQnVpbGRlciBiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKIAkJZW50cnkoYiwgIjEwMDY0NCBBIik7CiAJCWNoZWNrZXIuc2V0U2FmZUZvck1hY09TKHRydWUpOwotCQljaGVja2VyLmNoZWNrVHJlZShiLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJY2hlY2tlci5jaGVja1RyZWUoYi50b1N0cmluZygpLmdldEJ5dGVzKENIQVJTRVQpKTsKIAl9CiAKIAlAVGVzdApAQCAtMTc2Miw3ICsxNzYyLDcgQEAgcHJpdmF0ZSB2b2lkIGFzc2VydFNraXBMaXN0UmVqZWN0cyhTdHJpbmcgbXNnLCBpbnQgdHlwZSwgYnl0ZVtdIGRhdGEpIHsKIAkJY2hlY2tlci5zZXRTa2lwTGlzdChudWxsKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBPYmplY3RJZFNldCBzZXQoZmluYWwgT2JqZWN0SWQuLi4gaWRzKSB7CisJcHJpdmF0ZSBzdGF0aWMgT2JqZWN0SWRTZXQgc2V0KE9iamVjdElkLi4uIGlkcykgewogCQlyZXR1cm4gbmV3IE9iamVjdElkU2V0KCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhBbnlPYmplY3RJZCBvYmplY3RJZCkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SYWN5R2l0VGVzdHMuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvUmFjeUdpdFRlc3RzLmphdmEKaW5kZXggOTIzNmI0ZS4uOGQ5Y2NhYiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SYWN5R2l0VGVzdHMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL1JhY3lHaXRUZXN0cy5qYXZhCkBAIC0xNzYsMTIgKzE3Niw5IEBAIHB1YmxpYyB2b2lkIHRlc3RSYWN5R2l0RGV0ZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKIAlwcml2YXRlIEZpbGUgYWRkVG9Xb3JrRGlyKFN0cmluZyBwYXRoLCBTdHJpbmcgY29udGVudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJRmlsZSBmID0gbmV3IEZpbGUoZGIuZ2V0V29ya1RyZWUoKSwgcGF0aCk7Ci0JCUZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZik7Ci0JCXRyeSB7CisJCXRyeSAoRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmKSkgewogCQkJZm9zLndyaXRlKGNvbnRlbnQuZ2V0Qnl0ZXMoQ29uc3RhbnRzLkNIQVJBQ1RFUl9FTkNPRElORykpOwogCQkJcmV0dXJuIGY7Ci0JCX0gZmluYWxseSB7Ci0JCQlmb3MuY2xvc2UoKTsKIAkJfQogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvUmVmVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZWZUZXN0LmphdmEKaW5kZXggN2ZiMzMwOS4uMjQ4MWU2NCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZWZUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZWZUZXN0LmphdmEKQEAgLTU3LDYgKzU3LDcgQEAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKIApAQCAtMjUzLDExICsyNTQsMTEgQEAgcHVibGljIHZvaWQgdGVzdFJlYWRMb29zZVBhY2tlZFJlZigpIHRocm93cyBJT0V4Y2VwdGlvbiwKIAkJCUludGVycnVwdGVkRXhjZXB0aW9uIHsKIAkJUmVmIHJlZiA9IGRiLmV4YWN0UmVmKCJyZWZzL2hlYWRzL21hc3RlciIpOwogCQlhc3NlcnRFcXVhbHMoU3RvcmFnZS5QQUNLRUQsIHJlZi5nZXRTdG9yYWdlKCkpOwotCQlGaWxlT3V0cHV0U3RyZWFtIG9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0obmV3IEZpbGUoZGIuZ2V0RGlyZWN0b3J5KCksCi0JCQkJInJlZnMvaGVhZHMvbWFzdGVyIikpOwotCQlvcy53cml0ZShyZWYuZ2V0T2JqZWN0SWQoKS5uYW1lKCkuZ2V0Qnl0ZXMoKSk7Ci0JCW9zLndyaXRlKCdcbicpOwotCQlvcy5jbG9zZSgpOworCQl0cnkgKEZpbGVPdXRwdXRTdHJlYW0gb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSgKKwkJCQluZXcgRmlsZShkYi5nZXREaXJlY3RvcnkoKSwgInJlZnMvaGVhZHMvbWFzdGVyIikpKSB7CisJCQlvcy53cml0ZShyZWYuZ2V0T2JqZWN0SWQoKS5uYW1lKCkuZ2V0Qnl0ZXMoKSk7CisJCQlvcy53cml0ZSgnXG4nKTsKKwkJfQogCiAJCXJlZiA9IGRiLmV4YWN0UmVmKCJyZWZzL2hlYWRzL21hc3RlciIpOwogCQlhc3NlcnRFcXVhbHMoU3RvcmFnZS5MT09TRSwgcmVmLmdldFN0b3JhZ2UoKSk7CkBAIC0zMDUsNCArMzA2LDI2IEBAIHB1YmxpYyB2b2lkIHRlc3RSZXNvbHZlZFN5bVJlZigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWFzc2VydFNhbWUoZHN0LmdldFBlZWxlZE9iamVjdElkKCksIHJlZi5nZXRQZWVsZWRPYmplY3RJZCgpKTsKIAkJYXNzZXJ0RXF1YWxzKGRzdC5pc1BlZWxlZCgpLCByZWYuaXNQZWVsZWQoKSk7CiAJfQorCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja0NvbnRhaW5zUmVmKExpc3Q8UmVmPiBoYXlzdGFjaywgUmVmIG5lZWRsZSkgeworCQlmb3IgKFJlZiByZWYgOiBoYXlzdGFjaykgeworCQkJaWYgKHJlZi5nZXROYW1lKCkuZXF1YWxzKG5lZWRsZS5nZXROYW1lKCkpICYmCisJCQkJCXJlZi5nZXRPYmplY3RJZCgpLmVxdWFscyhuZWVkbGUuZ2V0T2JqZWN0SWQoKSkpIHsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwkJZmFpbCgibGlzdCAiICsgaGF5c3RhY2sgKyAiIGRvZXMgbm90IGNvbnRhaW4gcmVmICIgKyBuZWVkbGUpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEdldFJlZnNCeVByZWZpeCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUxpc3Q8UmVmPiByZWZzID0gZGIuZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzQnlQcmVmaXgoInJlZnMvaGVhZHMvZyIpOworCQlhc3NlcnRFcXVhbHMoMiwgcmVmcy5zaXplKCkpOworCQljaGVja0NvbnRhaW5zUmVmKHJlZnMsIGRiLmV4YWN0UmVmKCJyZWZzL2hlYWRzL2ciKSk7CisJCWNoZWNrQ29udGFpbnNSZWYocmVmcywgZGIuZXhhY3RSZWYoInJlZnMvaGVhZHMvZ2l0bGluayIpKTsKKworCQlyZWZzID0gZGIuZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzQnlQcmVmaXgoInJlZnMvaGVhZHMvcHJlZml4LyIpOworCQlhc3NlcnRFcXVhbHMoMSwgcmVmcy5zaXplKCkpOworCQljaGVja0NvbnRhaW5zUmVmKHJlZnMsIGRiLmV4YWN0UmVmKCJyZWZzL2hlYWRzL3ByZWZpeC9hIikpOworCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvUmVwb3NpdG9yeUNhY2hlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZXBvc2l0b3J5Q2FjaGVUZXN0LmphdmEKaW5kZXggMTEwN2MyYy4uNThiMDA1YyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZXBvc2l0b3J5Q2FjaGVUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZXBvc2l0b3J5Q2FjaGVUZXN0LmphdmEKQEAgLTk0LDI0ICs5NCwyNSBAQCBwdWJsaWMgdm9pZCB0ZXN0QmFyZUZpbGVLZXkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0RmlsZUtleU9wZW5FeGlzdGluZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVJlcG9zaXRvcnkgcjsKKwkJdHJ5IChSZXBvc2l0b3J5IHIgPSBuZXcgRmlsZUtleShkYi5nZXREaXJlY3RvcnkoKSwgZGIuZ2V0RlMoKSkKKwkJCQkub3Blbih0cnVlKSkgeworCQkJYXNzZXJ0Tm90TnVsbChyKTsKKwkJCWFzc2VydEVxdWFsc0ZpbGUoZGIuZ2V0RGlyZWN0b3J5KCksIHIuZ2V0RGlyZWN0b3J5KCkpOworCQl9CiAKLQkJciA9IG5ldyBGaWxlS2V5KGRiLmdldERpcmVjdG9yeSgpLCBkYi5nZXRGUygpKS5vcGVuKHRydWUpOwotCQlhc3NlcnROb3ROdWxsKHIpOwotCQlhc3NlcnRFcXVhbHNGaWxlKGRiLmdldERpcmVjdG9yeSgpLCByLmdldERpcmVjdG9yeSgpKTsKLQkJci5jbG9zZSgpOwotCi0JCXIgPSBuZXcgRmlsZUtleShkYi5nZXREaXJlY3RvcnkoKSwgZGIuZ2V0RlMoKSkub3BlbihmYWxzZSk7Ci0JCWFzc2VydE5vdE51bGwocik7Ci0JCWFzc2VydEVxdWFsc0ZpbGUoZGIuZ2V0RGlyZWN0b3J5KCksIHIuZ2V0RGlyZWN0b3J5KCkpOwotCQlyLmNsb3NlKCk7CisJCXRyeSAoUmVwb3NpdG9yeSByID0gbmV3IEZpbGVLZXkoZGIuZ2V0RGlyZWN0b3J5KCksIGRiLmdldEZTKCkpCisJCQkJLm9wZW4oZmFsc2UpKSB7CisJCQlhc3NlcnROb3ROdWxsKHIpOworCQkJYXNzZXJ0RXF1YWxzRmlsZShkYi5nZXREaXJlY3RvcnkoKSwgci5nZXREaXJlY3RvcnkoKSk7CisJCX0KIAl9CiAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RGaWxlS2V5T3Blbk5ldygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZpbmFsIFJlcG9zaXRvcnkgbiA9IGNyZWF0ZVJlcG9zaXRvcnkodHJ1ZSwgZmFsc2UpOwotCQlmaW5hbCBGaWxlIGdpdGRpciA9IG4uZ2V0RGlyZWN0b3J5KCk7Ci0JCW4uY2xvc2UoKTsKKwkJRmlsZSBnaXRkaXI7CisJCXRyeSAoUmVwb3NpdG9yeSBuID0gY3JlYXRlUmVwb3NpdG9yeSh0cnVlLCBmYWxzZSkpIHsKKwkJCWdpdGRpciA9IG4uZ2V0RGlyZWN0b3J5KCk7CisJCX0KIAkJcmVjdXJzaXZlRGVsZXRlKGdpdGRpcik7CiAJCWFzc2VydEZhbHNlKGdpdGRpci5leGlzdHMoKSk7CiAKQEAgLTE0Myw2ICsxNDQsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0Q2FjaGVSZWdpc3Rlck9wZW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RDYWNoZU9wZW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJZmluYWwgRmlsZUtleSBsb2MgPSBGaWxlS2V5LmV4YWN0KGRiLmdldERpcmVjdG9yeSgpLCBkYi5nZXRGUygpKTsKKwkJQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikgLy8gV2UgYXJlIHRlc3RpbmcgdGhlIGNsb3NlKCkgbWV0aG9kCiAJCWZpbmFsIFJlcG9zaXRvcnkgZDIgPSBSZXBvc2l0b3J5Q2FjaGUub3Blbihsb2MpOwogCQlhc3NlcnROb3RTYW1lKGRiLCBkMik7CiAJCWFzc2VydFNhbWUoZDIsIFJlcG9zaXRvcnlDYWNoZS5vcGVuKEZpbGVLZXkuZXhhY3QobG9jLmdldEZpbGUoKSwgZGIuZ2V0RlMoKSkpKTsKQEAgLTE3Niw2ICsxNzgsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0VW5yZWdpc3RlcigpIHsKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RSZXBvc2l0b3J5VXNhZ2VDb3VudCgpIHRocm93cyBFeGNlcHRpb24gewogCQlGaWxlS2V5IGxvYyA9IEZpbGVLZXkuZXhhY3QoZGIuZ2V0RGlyZWN0b3J5KCksIGRiLmdldEZTKCkpOworCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBXZSBhcmUgdGVzdGluZyB0aGUgY2xvc2UoKSBtZXRob2QKIAkJUmVwb3NpdG9yeSBkMiA9IFJlcG9zaXRvcnlDYWNoZS5vcGVuKGxvYyk7CiAJCWFzc2VydEVxdWFscygxLCBkMi51c2VDbnQuZ2V0KCkpOwogCQlSZXBvc2l0b3J5Q2FjaGUub3BlbihGaWxlS2V5LmV4YWN0KGxvYy5nZXRGaWxlKCksIGRiLmdldEZTKCkpKTsKQEAgLTE4OSw2ICsxOTIsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0UmVwb3NpdG9yeVVzYWdlQ291bnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RSZXBvc2l0b3J5VXNhZ2VDb3VudFdpdGhSZWdpc3RlcmVkUmVwb3NpdG9yeSgpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24geworCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBXZSBhcmUgdGVzdGluZyB0aGUgY2xvc2UoKSBtZXRob2QKIAkJUmVwb3NpdG9yeSByZXBvID0gY3JlYXRlUmVwb3NpdG9yeShmYWxzZSwgZmFsc2UpOwogCQlhc3NlcnRFcXVhbHMoMSwgcmVwby51c2VDbnQuZ2V0KCkpOwogCQlSZXBvc2l0b3J5Q2FjaGUucmVnaXN0ZXIocmVwbyk7CkBAIC0yMDAsNiArMjA0LDcgQEAgcHVibGljIHZvaWQgdGVzdFJlcG9zaXRvcnlVc2FnZUNvdW50V2l0aFJlZ2lzdGVyZWRSZXBvc2l0b3J5KCkKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RSZXBvc2l0b3J5Tm90VW5yZWdpc3RlcmluZ1doZW5DbG9zaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCUZpbGVLZXkgbG9jID0gRmlsZUtleS5leGFjdChkYi5nZXREaXJlY3RvcnkoKSwgZGIuZ2V0RlMoKSk7CisJCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpIC8vIFdlIGFyZSB0ZXN0aW5nIHRoZSBjbG9zZSgpIG1ldGhvZAogCQlSZXBvc2l0b3J5IGQyID0gUmVwb3NpdG9yeUNhY2hlLm9wZW4obG9jKTsKIAkJYXNzZXJ0RXF1YWxzKDEsIGQyLnVzZUNudC5nZXQoKSk7CiAJCWFzc2VydFRoYXQoUmVwb3NpdG9yeUNhY2hlLmdldFJlZ2lzdGVyZWRLZXlzKCksCkBAIC0yMTQsNiArMjE5LDcgQEAgcHVibGljIHZvaWQgdGVzdFJlcG9zaXRvcnlOb3RVbnJlZ2lzdGVyaW5nV2hlbkNsb3NpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RSZXBvc2l0b3J5VW5yZWdpc3RlcmluZ1doZW5FeHBpcmVkQW5kVXNhZ2VDb3VudE5lZ2F0aXZlKCkKIAkJCXRocm93cyBFeGNlcHRpb24geworCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBXZSBhcmUgdGVzdGluZyB0aGUgY2xvc2UoKSBtZXRob2QKIAkJUmVwb3NpdG9yeSByZXBvQSA9IGNyZWF0ZUJhcmVSZXBvc2l0b3J5KCk7CiAJCVJlcG9zaXRvcnlDYWNoZS5yZWdpc3RlcihyZXBvQSk7CiAKQEAgLTIzNCw3ICsyNDAsOSBAQCBwdWJsaWMgdm9pZCB0ZXN0UmVwb3NpdG9yeVVucmVnaXN0ZXJpbmdXaGVuRXhwaXJlZEFuZFVzYWdlQ291bnROZWdhdGl2ZSgpCiAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RSZXBvc2l0b3J5VW5yZWdpc3RlcmluZ1doZW5FeHBpcmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpIC8vIFdlIGFyZSB0ZXN0aW5nIHRoZSBjbG9zZSgpIG1ldGhvZAogCQlSZXBvc2l0b3J5IHJlcG9BID0gY3JlYXRlUmVwb3NpdG9yeSh0cnVlLCBmYWxzZSk7CisJCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpIC8vIFdlIGFyZSB0ZXN0aW5nIHRoZSBjbG9zZSgpIG1ldGhvZAogCQlSZXBvc2l0b3J5IHJlcG9CID0gY3JlYXRlUmVwb3NpdG9yeSh0cnVlLCBmYWxzZSk7CiAJCVJlcG9zaXRvcnkgcmVwb0MgPSBjcmVhdGVCYXJlUmVwb3NpdG9yeSgpOwogCQlSZXBvc2l0b3J5Q2FjaGUucmVnaXN0ZXIocmVwb0EpOwpAQCAtMjY4LDYgKzI3Niw3IEBAIHB1YmxpYyB2b2lkIHRlc3RSZXBvc2l0b3J5VW5yZWdpc3RlcmluZ1doZW5FeHBpcmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RSZWNvbmZpZ3VyZSgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBXZSBhcmUgdGVzdGluZyB0aGUgY2xvc2UoKSBtZXRob2QKIAkJUmVwb3NpdG9yeSByZXBvID0gY3JlYXRlUmVwb3NpdG9yeShmYWxzZSwgZmFsc2UpOwogCQlSZXBvc2l0b3J5Q2FjaGUucmVnaXN0ZXIocmVwbyk7CiAJCWFzc2VydFRydWUoUmVwb3NpdG9yeUNhY2hlLmlzQ2FjaGVkKHJlcG8pKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvUmVwb3NpdG9yeVJlc29sdmVUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL1JlcG9zaXRvcnlSZXNvbHZlVGVzdC5qYXZhCmluZGV4IDFkMmE0ZTkuLjA1Yjc4ZWEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvUmVwb3NpdG9yeVJlc29sdmVUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZXBvc2l0b3J5UmVzb2x2ZVRlc3QuamF2YQpAQCAtMzI0LDYgKzMyNCw4IEBAIHB1YmxpYyB2b2lkIGludmFsaWROYW1lcygpIHRocm93cyBBbWJpZ3VvdXNPYmplY3RFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJYXNzZXJ0RmFsc2UoUmVwb3NpdG9yeS5pc1ZhbGlkUmVmTmFtZSgieC9hXFxiIikpOwogCQlhc3NlcnRGYWxzZShSZXBvc2l0b3J5LmlzVmFsaWRSZWZOYW1lKCJ4L2FcdTAwMDAiKSk7CiAKKwkJZGIucmVzb2x2ZSgieC9hQCIpOworCiAJCWFzc2VydFVucGFyc2VhYmxlKCIuIik7CiAJCWFzc2VydFVucGFyc2VhYmxlKCJ4QHszIik7CiAJCWFzc2VydFVucGFyc2VhYmxlKCJ4W2IiKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvU3F1YXNoQ29tbWl0TXNnVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9TcXVhc2hDb21taXRNc2dUZXN0LmphdmEKaW5kZXggM2JjZDc4Ny4uMjAzYzAwZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9TcXVhc2hDb21taXRNc2dUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9TcXVhc2hDb21taXRNc2dUZXN0LmphdmEKQEAgLTY2LDEyICs2Niw5IEBAIHB1YmxpYyB2b2lkIHRlc3RSZWFkV3JpdGVNZXJnZU1zZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWRiLndyaXRlU3F1YXNoQ29tbWl0TXNnKG51bGwpOwogCQlhc3NlcnRFcXVhbHMoZGIucmVhZFNxdWFzaENvbW1pdE1zZygpLCBudWxsKTsKIAkJYXNzZXJ0RmFsc2UobmV3IEZpbGUoZGIuZ2V0RGlyZWN0b3J5KCksIENvbnN0YW50cy5TUVVBU0hfTVNHKS5leGlzdHMoKSk7Ci0JCUZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0obmV3IEZpbGUoZGIuZ2V0RGlyZWN0b3J5KCksCi0JCQkJQ29uc3RhbnRzLlNRVUFTSF9NU0cpKTsKLQkJdHJ5IHsKKwkJdHJ5IChGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKAorCQkJCW5ldyBGaWxlKGRiLmdldERpcmVjdG9yeSgpLCBDb25zdGFudHMuU1FVQVNIX01TRykpKSB7CiAJCQlmb3Mud3JpdGUoc3F1YXNoTXNnLmdldEJ5dGVzKENvbnN0YW50cy5DSEFSQUNURVJfRU5DT0RJTkcpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWZvcy5jbG9zZSgpOwogCQl9CiAJCWFzc2VydEVxdWFscyhkYi5yZWFkU3F1YXNoQ29tbWl0TXNnKCksIHNxdWFzaE1zZyk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9WYWxpZFJlZk5hbWVUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL1ZhbGlkUmVmTmFtZVRlc3QuamF2YQppbmRleCBkNDMxYTg5Li44N2U5MDFmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL1ZhbGlkUmVmTmFtZVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL1ZhbGlkUmVmTmFtZVRlc3QuamF2YQpAQCAtNTEsNyArNTEsNyBAQAogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCiBwdWJsaWMgY2xhc3MgVmFsaWRSZWZOYW1lVGVzdCB7Ci0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRWYWxpZChmaW5hbCBib29sZWFuIGV4cCwgZmluYWwgU3RyaW5nIG5hbWUpIHsKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydFZhbGlkKGJvb2xlYW4gZXhwLCBTdHJpbmcgbmFtZSkgewogCQlTeXN0ZW1SZWFkZXIgaW5zdGFuY2UgPSBTeXN0ZW1SZWFkZXIuZ2V0SW5zdGFuY2UoKTsKIAkJdHJ5IHsKIAkJCXNldFVuaXhTeXN0ZW1SZWFkZXIoKTsKQEAgLTgxLDcgKzgxLDcgQEAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRVbml4U3lzdGVtUmVhZGVyKCkgewogCQl9KTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydEludmFsaWRPbldpbmRvd3MoZmluYWwgU3RyaW5nIG5hbWUpIHsKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydEludmFsaWRPbldpbmRvd3MoU3RyaW5nIG5hbWUpIHsKIAkJU3lzdGVtUmVhZGVyIGluc3RhbmNlID0gU3lzdGVtUmVhZGVyLmdldEluc3RhbmNlKCk7CiAJCXRyeSB7CiAJCQlzZXRVbml4U3lzdGVtUmVhZGVyKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvQ2hlcnJ5UGlja1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9DaGVycnlQaWNrVGVzdC5qYXZhCmluZGV4IDQ5NDhiMzcuLjE5ZjZkY2IgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9DaGVycnlQaWNrVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9DaGVycnlQaWNrVGVzdC5qYXZhCkBAIC0xODMsNyArMTgzLDcgQEAgcHVibGljIHZvaWQgdGVzdFJldmVydCgpIHRocm93cyBFeGNlcHRpb24gewogCQlhc3NlcnRGYWxzZSh0dy5uZXh0KCkpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0Q29ycmVjdElkKGZpbmFsIERpckNhY2hlIHRyZWVULCBmaW5hbCBUcmVlV2FsayB0dykgeworCXByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0Q29ycmVjdElkKERpckNhY2hlIHRyZWVULCBUcmVlV2FsayB0dykgewogCQlhc3NlcnRFcXVhbHModHJlZVQuZ2V0RW50cnkodHcuZ2V0UGF0aFN0cmluZygpKS5nZXRPYmplY3RJZCgpLCB0dwogCQkJCS5nZXRPYmplY3RJZCgwKSk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL1JlY3Vyc2l2ZU1lcmdlclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9Dcmlzc0Nyb3NzTWVyZ2VUZXN0LmphdmEKc2ltaWxhcml0eSBpbmRleCA5OSUKcmVuYW1lIGZyb20gb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL1JlY3Vyc2l2ZU1lcmdlclRlc3QuamF2YQpyZW5hbWUgdG8gb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL0NyaXNzQ3Jvc3NNZXJnZVRlc3QuamF2YQppbmRleCAxOTAyMjRhLi5hYWEwOGE5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvUmVjdXJzaXZlTWVyZ2VyVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9Dcmlzc0Nyb3NzTWVyZ2VUZXN0LmphdmEKQEAgLTgzLDcgKzgzLDcgQEAKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKIEBSdW5XaXRoKFRoZW9yaWVzLmNsYXNzKQotcHVibGljIGNsYXNzIFJlY3Vyc2l2ZU1lcmdlclRlc3QgZXh0ZW5kcyBSZXBvc2l0b3J5VGVzdENhc2UgeworcHVibGljIGNsYXNzIENyaXNzQ3Jvc3NNZXJnZVRlc3QgZXh0ZW5kcyBSZXBvc2l0b3J5VGVzdENhc2UgewogCXN0YXRpYyBpbnQgY291bnRlciA9IDA7CiAKIAlARGF0YVBvaW50cwpAQCAtNzgzLDcgKzc4Myw3IEBAIHZvaWQgbW9kaWZ5SW5kZXgoSW5kZXhTdGF0ZSBpbmRleFN0YXRlLCBTdHJpbmcgcGF0aCwgU3RyaW5nIG90aGVyKQogCQl9CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHNldEluZGV4KGZpbmFsIE9iamVjdElkIGlkLCBTdHJpbmcgcGF0aCkKKwlwcml2YXRlIHZvaWQgc2V0SW5kZXgoT2JqZWN0SWQgaWQsIFN0cmluZyBwYXRoKQogCQkJdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJRGlyQ2FjaGUgbG9ja2VkRGlyY2FjaGU7CiAJCURpckNhY2hlRWRpdG9yIGRjZWRpdDsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9SZXNvbHZlTWVyZ2VyVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL01lcmdlclRlc3QuamF2YQpzaW1pbGFyaXR5IGluZGV4IDk3JQpyZW5hbWUgZnJvbSBvcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvUmVzb2x2ZU1lcmdlclRlc3QuamF2YQpyZW5hbWUgdG8gb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL01lcmdlclRlc3QuamF2YQppbmRleCA5MzIyYTQ3Li41ODA5M2EzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvUmVzb2x2ZU1lcmdlclRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvTWVyZ2VyVGVzdC5qYXZhCkBAIC00Miw3ICs0Miw3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5tZXJnZTsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuT0JKX0JMT0I7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwpAQCAtOTEsMTkgKzkxLDE3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLkZTOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5GaWxlVXRpbHM7CiBpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKLWltcG9ydCBvcmcuanVuaXQuZXhwZXJpbWVudGFsLnRoZW9yaWVzLkRhdGFQb2ludDsKK2ltcG9ydCBvcmcuanVuaXQuZXhwZXJpbWVudGFsLnRoZW9yaWVzLkRhdGFQb2ludHM7CiBpbXBvcnQgb3JnLmp1bml0LmV4cGVyaW1lbnRhbC50aGVvcmllcy5UaGVvcmllczsKIGltcG9ydCBvcmcuanVuaXQuZXhwZXJpbWVudGFsLnRoZW9yaWVzLlRoZW9yeTsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKIEBSdW5XaXRoKFRoZW9yaWVzLmNsYXNzKQotcHVibGljIGNsYXNzIFJlc29sdmVNZXJnZXJUZXN0IGV4dGVuZHMgUmVwb3NpdG9yeVRlc3RDYXNlIHsKK3B1YmxpYyBjbGFzcyBNZXJnZXJUZXN0IGV4dGVuZHMgUmVwb3NpdG9yeVRlc3RDYXNlIHsKIAotCUBEYXRhUG9pbnQKLQlwdWJsaWMgc3RhdGljIE1lcmdlU3RyYXRlZ3kgcmVzb2x2ZSA9IE1lcmdlU3RyYXRlZ3kuUkVTT0xWRTsKLQotCUBEYXRhUG9pbnQKLQlwdWJsaWMgc3RhdGljIE1lcmdlU3RyYXRlZ3kgcmVjdXJzaXZlID0gTWVyZ2VTdHJhdGVneS5SRUNVUlNJVkU7CisJQERhdGFQb2ludHMKKwlwdWJsaWMgc3RhdGljIE1lcmdlU3RyYXRlZ3lbXSBzdHJhdGVnaWVzVW5kZXJUZXN0ID0gbmV3IE1lcmdlU3RyYXRlZ3lbXSB7CisJCQlNZXJnZVN0cmF0ZWd5LlJFQ1VSU0lWRSwgTWVyZ2VTdHJhdGVneS5SRVNPTFZFIH07CiAKIAlAVGhlb3J5CiAJcHVibGljIHZvaWQgZmFpbGluZ0RlbGV0ZU9mRGlyZWN0b3J5V2l0aFVudHJhY2tlZENvbnRlbnQoCkBAIC03NTYsNyArNzU0LDcgQEAgcHVibGljIHZvaWQgY2hlY2tDb250ZW50TWVyZ2VMYXJnZUJpbmFyaWVzKE1lcmdlU3RyYXRlZ3kgc3RyYXRlZ3kpIHRocm93cyBFeGNlcHQKIAkJfQogCQliaW5hcnlbNTBdID0gJ1wwJzsKIAotCQl3cml0ZVRyYXNoRmlsZSgiZmlsZSIsIG5ldyBTdHJpbmcoYmluYXJ5LCBVVEZfOCkpOworCQl3cml0ZVRyYXNoRmlsZSgiZmlsZSIsIG5ldyBTdHJpbmcoYmluYXJ5LCBDSEFSU0VUKSk7CiAJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiZmlsZSIpLmNhbGwoKTsKIAkJUmV2Q29tbWl0IGZpcnN0ID0gZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoImFkZGVkIGZpbGUiKS5jYWxsKCk7CiAKQEAgLTc2NCw3ICs3NjIsNyBAQCBwdWJsaWMgdm9pZCBjaGVja0NvbnRlbnRNZXJnZUxhcmdlQmluYXJpZXMoTWVyZ2VTdHJhdGVneSBzdHJhdGVneSkgdGhyb3dzIEV4Y2VwdAogCQlpbnQgaWR4ID0gTElORUxFTiAqIDEyMDAgKyAxOwogCQlieXRlIHNhdmUgPSBiaW5hcnlbaWR4XTsKIAkJYmluYXJ5W2lkeF0gPSAnQCc7Ci0JCXdyaXRlVHJhc2hGaWxlKCJmaWxlIiwgbmV3IFN0cmluZyhiaW5hcnksIFVURl84KSk7CisJCXdyaXRlVHJhc2hGaWxlKCJmaWxlIiwgbmV3IFN0cmluZyhiaW5hcnksIENIQVJTRVQpKTsKIAogCQliaW5hcnlbaWR4XSA9IHNhdmU7CiAJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiZmlsZSIpLmNhbGwoKTsKQEAgLTc3Myw3ICs3NzEsNyBAQCBwdWJsaWMgdm9pZCBjaGVja0NvbnRlbnRNZXJnZUxhcmdlQmluYXJpZXMoTWVyZ2VTdHJhdGVneSBzdHJhdGVneSkgdGhyb3dzIEV4Y2VwdAogCiAJCWdpdC5jaGVja291dCgpLnNldENyZWF0ZUJyYW5jaCh0cnVlKS5zZXRTdGFydFBvaW50KGZpcnN0KS5zZXROYW1lKCJzaWRlIikuY2FsbCgpOwogCQliaW5hcnlbTElORUxFTiAqIDE1MDAgKyAxXSA9ICchJzsKLQkJd3JpdGVUcmFzaEZpbGUoImZpbGUiLCBuZXcgU3RyaW5nKGJpbmFyeSwgVVRGXzgpKTsKKwkJd3JpdGVUcmFzaEZpbGUoImZpbGUiLCBuZXcgU3RyaW5nKGJpbmFyeSwgQ0hBUlNFVCkpOwogCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oImZpbGUiKS5jYWxsKCk7CiAJCVJldkNvbW1pdCBzaWRlQ29tbWl0ID0gZ2l0LmNvbW1pdCgpLnNldEFsbCh0cnVlKQogCQkJLnNldE1lc3NhZ2UoIm1vZGlmaWVkIGZpbGUgbCAxNTAwIikuY2FsbCgpOwpAQCAtOTM1LDcgKzkzMyw3IEBAIHB1YmxpYyB2b2lkIGNoZWNrQ29udGVudE1lcmdlQ29uZmxpY3Rfbm9UcmVlKE1lcmdlU3RyYXRlZ3kgc3RyYXRlZ3kpCiAJCQltZXJnZXIuZ2V0TWVyZ2VSZXN1bHRzKCkuZ2V0KCJmaWxlIik7CiAJCQl0cnkgKEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCkpIHsKIAkJCQlmbXQuZm9ybWF0TWVyZ2Uob3V0LCBtZXJnZXIuZ2V0TWVyZ2VSZXN1bHRzKCkuZ2V0KCJmaWxlIiksCi0JCQkJCQkiQkFTRSIsICJPVVJTIiwgIlRIRUlSUyIsIFVURl84Lm5hbWUoKSk7CisJCQkJCQkiQkFTRSIsICJPVVJTIiwgIlRIRUlSUyIsIENIQVJTRVQubmFtZSgpKTsKIAkJCQlTdHJpbmcgZXhwZWN0ZWQgPSAiPDw8PDw8PCBPVVJTXG4iCiAJCQkJCQkrICIxbWFzdGVyXG4iCiAJCQkJCQkrICI9PT09PT09XG4iCkBAIC05NDMsNyArOTQxLDcgQEAgcHVibGljIHZvaWQgY2hlY2tDb250ZW50TWVyZ2VDb25mbGljdF9ub1RyZWUoTWVyZ2VTdHJhdGVneSBzdHJhdGVneSkKIAkJCQkJCSsgIj4+Pj4+Pj4gVEhFSVJTXG4iCiAJCQkJCQkrICIyXG4iCiAJCQkJCQkrICIzIjsKLQkJCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIG5ldyBTdHJpbmcob3V0LnRvQnl0ZUFycmF5KCksIFVURl84KSk7CisJCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBuZXcgU3RyaW5nKG91dC50b0J5dGVBcnJheSgpLCBDSEFSU0VUKSk7CiAJCQl9CiAJCX0KIAl9CkBAIC0xMDMzLDE5ICsxMDMxLDIxIEBAIHB1YmxpYyB2b2lkIGNoZWNrTG9ja2VkRmlsZXNUb0JlRGVsZXRlZChNZXJnZVN0cmF0ZWd5IHN0cmF0ZWd5KQogCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiYWRkZWQgYy50eHQiKS5jYWxsKCk7CiAKIAkJLy8gR2V0IGEgaGFuZGxlIHRvIHRoZSB0aGUgZmlsZSBzbyBvbiB3aW5kb3dzIGl0IGNhbid0IGJlIGRlbGV0ZWQuCi0JCUZpbGVJbnB1dFN0cmVhbSBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKG5ldyBGaWxlKGRiLmdldFdvcmtUcmVlKCksCi0JCQkJImIudHh0IikpOwotCQlNZXJnZVJlc3VsdCBtZXJnZVJlcyA9IGdpdC5tZXJnZSgpLnNldFN0cmF0ZWd5KHN0cmF0ZWd5KQotCQkJCS5pbmNsdWRlKG1hc3RlckNvbW1pdCkuY2FsbCgpOwotCQlpZiAobWVyZ2VSZXMuZ2V0TWVyZ2VTdGF0dXMoKS5lcXVhbHMoTWVyZ2VTdGF0dXMuRkFJTEVEKSkgewotCQkJLy8gcHJvYmFibHkgd2luZG93cwotCQkJYXNzZXJ0RXF1YWxzKDEsIG1lcmdlUmVzLmdldEZhaWxpbmdQYXRocygpLnNpemUoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoTWVyZ2VGYWlsdXJlUmVhc29uLkNPVUxEX05PVF9ERUxFVEUsIG1lcmdlUmVzCi0JCQkJCS5nZXRGYWlsaW5nUGF0aHMoKS5nZXQoImIudHh0IikpOworCQl0cnkgKEZpbGVJbnB1dFN0cmVhbSBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKAorCQkJCW5ldyBGaWxlKGRiLmdldFdvcmtUcmVlKCksICJiLnR4dCIpKSkgeworCQkJTWVyZ2VSZXN1bHQgbWVyZ2VSZXMgPSBnaXQubWVyZ2UoKS5zZXRTdHJhdGVneShzdHJhdGVneSkKKwkJCQkJLmluY2x1ZGUobWFzdGVyQ29tbWl0KS5jYWxsKCk7CisJCQlpZiAobWVyZ2VSZXMuZ2V0TWVyZ2VTdGF0dXMoKS5lcXVhbHMoTWVyZ2VTdGF0dXMuRkFJTEVEKSkgeworCQkJCS8vIHByb2JhYmx5IHdpbmRvd3MKKwkJCQlhc3NlcnRFcXVhbHMoMSwgbWVyZ2VSZXMuZ2V0RmFpbGluZ1BhdGhzKCkuc2l6ZSgpKTsKKwkJCQlhc3NlcnRFcXVhbHMoTWVyZ2VGYWlsdXJlUmVhc29uLkNPVUxEX05PVF9ERUxFVEUsCisJCQkJCQltZXJnZVJlcy5nZXRGYWlsaW5nUGF0aHMoKS5nZXQoImIudHh0IikpOworCQkJfQorCQkJYXNzZXJ0RXF1YWxzKAorCQkJCQkiW2EudHh0LCBtb2RlOjEwMDY0NCwgY29udGVudDptYXN0ZXJdIgorCQkJCQkJCSsgIltjLnR4dCwgbW9kZToxMDA2NDQsIGNvbnRlbnQ6c2lkZV0iLAorCQkJCQlpbmRleFN0YXRlKENPTlRFTlQpKTsKIAkJfQotCQlhc3NlcnRFcXVhbHMoIlthLnR4dCwgbW9kZToxMDA2NDQsIGNvbnRlbnQ6bWFzdGVyXSIKLQkJCQkrICJbYy50eHQsIG1vZGU6MTAwNjQ0LCBjb250ZW50OnNpZGVdIiwgaW5kZXhTdGF0ZShDT05URU5UKSk7Ci0JCWZpcy5jbG9zZSgpOwogCX0KIAogCUBUaGVvcnkKQEAgLTEzMjgsNiArMTMyOCw2IEBAIHByaXZhdGUgU3RyaW5nIHJlYWRCbG9iKE9iamVjdElkIHRyZWVpc2gsIFN0cmluZyBwYXRoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJaWYgKG9iaiA9PSBudWxsKSB7CiAJCQlyZXR1cm4gbnVsbDsKIAkJfQotCQlyZXR1cm4gbmV3IFN0cmluZyhydy5nZXRPYmplY3RSZWFkZXIoKS5vcGVuKG9iaiwgT0JKX0JMT0IpLmdldEJ5dGVzKCksIFVURl84KTsKKwkJcmV0dXJuIG5ldyBTdHJpbmcocncuZ2V0T2JqZWN0UmVhZGVyKCkub3BlbihvYmosIE9CSl9CTE9CKS5nZXRCeXRlcygpLCBDSEFSU0VUKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvU2ltcGxlTWVyZ2VUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvU2ltcGxlTWVyZ2VUZXN0LmphdmEKaW5kZXggOTUxNTY4ZS4uZGQyYzJlOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL1NpbXBsZU1lcmdlVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9TaW1wbGVNZXJnZVRlc3QuamF2YQpAQCAtNDAzLDcgKzQwMyw3IEBAIHB1YmxpYyB2b2lkIHRlc3RUcml2aWFsVHdvV2F5X3JpZ2h0REZjb25mbGljdDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJYXNzZXJ0RmFsc2UobWVyZ2UpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0Q29ycmVjdElkKGZpbmFsIERpckNhY2hlIHRyZWVULCBmaW5hbCBUcmVlV2FsayB0dykgeworCXByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0Q29ycmVjdElkKERpckNhY2hlIHRyZWVULCBUcmVlV2FsayB0dykgewogCQlhc3NlcnRFcXVhbHModHJlZVQuZ2V0RW50cnkodHcuZ2V0UGF0aFN0cmluZygpKS5nZXRPYmplY3RJZCgpLCB0dwogCQkJCS5nZXRPYmplY3RJZCgwKSk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL0VkaXRMaXN0VGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL0VkaXRMaXN0VGVzdC5qYXZhCmluZGV4IDYwMjdhZmYuLjZjMTA3ZjkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9FZGl0TGlzdFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvRWRpdExpc3RUZXN0LmphdmEKQEAgLTg5LDcgKzg5LDcgQEAgcHVibGljIHZvaWQgdGVzdFR5cGVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJYXNzZXJ0RXF1YWxzKG5ldyBFZGl0KDIzIC0gMSwgMjUgLSAxLCAyMiAtIDEsIDI4IC0gMSksIGUuZ2V0KDIpKTsKIAl9CiAKLQlwcml2YXRlIFBhdGNoIHBhcnNlVGVzdFBhdGNoRmlsZShmaW5hbCBTdHJpbmcgcGF0Y2hGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByaXZhdGUgUGF0Y2ggcGFyc2VUZXN0UGF0Y2hGaWxlKFN0cmluZyBwYXRjaEZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXRyeSAoSW5wdXRTdHJlYW0gaW4gPSBnZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0ocGF0Y2hGaWxlKSkgewogCQkJaWYgKGluID09IG51bGwpIHsKIAkJCQlmYWlsKCJObyAiICsgcGF0Y2hGaWxlICsgIiB0ZXN0IHZlY3RvciIpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL0ZpbGVIZWFkZXJUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvRmlsZUhlYWRlclRlc3QuamF2YQppbmRleCA3YjRlMDE0Li4yNGZiZGExIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvRmlsZUhlYWRlclRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvRmlsZUhlYWRlclRlc3QuamF2YQpAQCAtNDMzLDMwICs0MzMsMzAgQEAgcHVibGljIHZvaWQgdGVzdFBhcnNlQWJickluZGV4TGluZV9Ob01vZGUoKSB7CiAJCWFzc2VydFRydWUoT2JqZWN0SWQuZnJvbVN0cmluZyhuaWQpLnN0YXJ0c1dpdGgoZmguZ2V0TmV3SWQoKSkpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0UGFyc2UoZmluYWwgRmlsZUhlYWRlciBmaCkgeworCXByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0UGFyc2UoRmlsZUhlYWRlciBmaCkgewogCQlpbnQgcHRyID0gZmgucGFyc2VHaXRGaWxlTmFtZSgwLCBmaC5idWYubGVuZ3RoKTsKIAkJYXNzZXJ0VHJ1ZShwdHIgPiAwKTsKIAkJcHRyID0gZmgucGFyc2VHaXRIZWFkZXJzKHB0ciwgZmguYnVmLmxlbmd0aCk7CiAJCWFzc2VydFRydWUocHRyID4gMCk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgRmlsZUhlYWRlciBkYXRhKGZpbmFsIFN0cmluZyBpbikgeworCXByaXZhdGUgc3RhdGljIEZpbGVIZWFkZXIgZGF0YShTdHJpbmcgaW4pIHsKIAkJcmV0dXJuIG5ldyBGaWxlSGVhZGVyKENvbnN0YW50cy5lbmNvZGVBU0NJSShpbiksIDApOwogCX0KIAotCXByaXZhdGUgc3RhdGljIEZpbGVIZWFkZXIgaGVhZGVyKGZpbmFsIFN0cmluZyBwYXRoKSB7CisJcHJpdmF0ZSBzdGF0aWMgRmlsZUhlYWRlciBoZWFkZXIoU3RyaW5nIHBhdGgpIHsKIAkJcmV0dXJuIGRhdGEoZ2l0TGluZShwYXRoKSArICItLS0gIiArIHBhdGggKyAiXG4iKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2l0TGluZShmaW5hbCBTdHJpbmcgcGF0aCkgeworCXByaXZhdGUgc3RhdGljIFN0cmluZyBnaXRMaW5lKFN0cmluZyBwYXRoKSB7CiAJCXJldHVybiAiYS8iICsgcGF0aCArICIgYi8iICsgcGF0aCArICJcbiI7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgRmlsZUhlYWRlciBkcUhlYWRlcihmaW5hbCBTdHJpbmcgcGF0aCkgeworCXByaXZhdGUgc3RhdGljIEZpbGVIZWFkZXIgZHFIZWFkZXIoU3RyaW5nIHBhdGgpIHsKIAkJcmV0dXJuIGRhdGEoZHFHaXRMaW5lKHBhdGgpICsgIi0tLSAiICsgcGF0aCArICJcbiIpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBkcUdpdExpbmUoZmluYWwgU3RyaW5nIHBhdGgpIHsKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZHFHaXRMaW5lKFN0cmluZyBwYXRoKSB7CiAJCXJldHVybiAiXCJhLyIgKyBwYXRoICsgIlwiIFwiYi8iICsgcGF0aCArICJcIlxuIjsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvR2V0VGV4dFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9HZXRUZXh0VGVzdC5qYXZhCmluZGV4IDY1Mzc1YzcuLjdiNTg2OGEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9HZXRUZXh0VGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9HZXRUZXh0VGVzdC5qYXZhCkBAIC00NCw3ICs0NCw3IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQucGF0Y2g7CiAKIGltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLklTT184ODU5XzE7Ci1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKQEAgLTgzLDcgKzgzLDcgQEAgcHVibGljIHZvaWQgdGVzdEdldFRleHRfTm9CaW5hcnkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdEdldFRleHRfQ29udmVydCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIENoYXJzZXQgY3NPbGQgPSBJU09fODg1OV8xOwotCQlmaW5hbCBDaGFyc2V0IGNzTmV3ID0gVVRGXzg7CisJCWZpbmFsIENoYXJzZXQgY3NOZXcgPSBDSEFSU0VUOwogCQlmaW5hbCBQYXRjaCBwID0gcGFyc2VUZXN0UGF0Y2hGaWxlKCk7CiAJCWFzc2VydFRydWUocC5nZXRFcnJvcnMoKS5pc0VtcHR5KCkpOwogCQlhc3NlcnRFcXVhbHMoMSwgcC5nZXRGaWxlcygpLnNpemUoKSk7CkBAIC0xMDMsNyArMTAzLDcgQEAgcHVibGljIHZvaWQgdGVzdEdldFRleHRfQ29udmVydCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0R2V0VGV4dF9EaWZmQ2MoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBDaGFyc2V0IGNzT2xkID0gSVNPXzg4NTlfMTsKLQkJZmluYWwgQ2hhcnNldCBjc05ldyA9IFVURl84OworCQlmaW5hbCBDaGFyc2V0IGNzTmV3ID0gQ0hBUlNFVDsKIAkJZmluYWwgUGF0Y2ggcCA9IHBhcnNlVGVzdFBhdGNoRmlsZSgpOwogCQlhc3NlcnRUcnVlKHAuZ2V0RXJyb3JzKCkuaXNFbXB0eSgpKTsKIAkJYXNzZXJ0RXF1YWxzKDEsIHAuZ2V0RmlsZXMoKS5zaXplKCkpOwpAQCAtMTM0LDcgKzEzNCw3IEBAIHByaXZhdGUgUGF0Y2ggcGFyc2VUZXN0UGF0Y2hGaWxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJfQogCX0KIAotCXByaXZhdGUgU3RyaW5nIHJlYWRUZXN0UGF0Y2hGaWxlKGZpbmFsIENoYXJzZXQgY3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJpdmF0ZSBTdHJpbmcgcmVhZFRlc3RQYXRjaEZpbGUoQ2hhcnNldCBjcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgU3RyaW5nIHBhdGNoRmlsZSA9IEpHaXRUZXN0VXRpbC5nZXROYW1lKCkgKyAiLnBhdGNoIjsKIAkJdHJ5IChJbnB1dFN0cmVhbSBpbiA9IGdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbShwYXRjaEZpbGUpKSB7CiAJCQlpZiAoaW4gPT0gbnVsbCkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL1BhdGNoQ2NFcnJvclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9QYXRjaENjRXJyb3JUZXN0LmphdmEKaW5kZXggZTRiNDMxNy4uNjk4OTM0MyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL1BhdGNoQ2NFcnJvclRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvUGF0Y2hDY0Vycm9yVGVzdC5qYXZhCkBAIC05NiwxNyArOTYsMTQgQEAgcHVibGljIHZvaWQgdGVzdEVycm9yX0NjVHJ1bmNhdGVkT2xkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAogCXByaXZhdGUgUGF0Y2ggcGFyc2VUZXN0UGF0Y2hGaWxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgU3RyaW5nIHBhdGNoRmlsZSA9IEpHaXRUZXN0VXRpbC5nZXROYW1lKCkgKyAiLnBhdGNoIjsKLQkJZmluYWwgSW5wdXRTdHJlYW0gaW4gPSBnZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0ocGF0Y2hGaWxlKTsKLQkJaWYgKGluID09IG51bGwpIHsKLQkJCWZhaWwoIk5vICIgKyBwYXRjaEZpbGUgKyAiIHRlc3QgdmVjdG9yIik7Ci0JCQlyZXR1cm4gbnVsbDsgLy8gTmV2ZXIgaGFwcGVucwotCQl9Ci0JCXRyeSB7CisJCXRyeSAoSW5wdXRTdHJlYW0gaW4gPSBnZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0ocGF0Y2hGaWxlKSkgeworCQkJaWYgKGluID09IG51bGwpIHsKKwkJCQlmYWlsKCJObyAiICsgcGF0Y2hGaWxlICsgIiB0ZXN0IHZlY3RvciIpOworCQkJCXJldHVybiBudWxsOyAvLyBOZXZlciBoYXBwZW5zCisJCQl9CiAJCQlmaW5hbCBQYXRjaCBwID0gbmV3IFBhdGNoKCk7CiAJCQlwLnBhcnNlKGluKTsKIAkJCXJldHVybiBwOwotCQl9IGZpbmFsbHkgewotCQkJaW4uY2xvc2UoKTsKIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL1BhdGNoQ2NUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvUGF0Y2hDY1Rlc3QuamF2YQppbmRleCA4Mzc0MTRiLi40YTI2ZDUwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvUGF0Y2hDY1Rlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvUGF0Y2hDY1Rlc3QuamF2YQpAQCAtMTk5LDE3ICsxOTksMTQgQEAgcHVibGljIHZvaWQgdGVzdFBhcnNlX0NjRGVsZXRlRmlsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAKIAlwcml2YXRlIFBhdGNoIHBhcnNlVGVzdFBhdGNoRmlsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIFN0cmluZyBwYXRjaEZpbGUgPSBKR2l0VGVzdFV0aWwuZ2V0TmFtZSgpICsgIi5wYXRjaCI7Ci0JCWZpbmFsIElucHV0U3RyZWFtIGluID0gZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKHBhdGNoRmlsZSk7Ci0JCWlmIChpbiA9PSBudWxsKSB7Ci0JCQlmYWlsKCJObyAiICsgcGF0Y2hGaWxlICsgIiB0ZXN0IHZlY3RvciIpOwotCQkJcmV0dXJuIG51bGw7IC8vIE5ldmVyIGhhcHBlbnMKLQkJfQotCQl0cnkgeworCQl0cnkgKElucHV0U3RyZWFtIGluID0gZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKHBhdGNoRmlsZSkpIHsKKwkJCWlmIChpbiA9PSBudWxsKSB7CisJCQkJZmFpbCgiTm8gIiArIHBhdGNoRmlsZSArICIgdGVzdCB2ZWN0b3IiKTsKKwkJCQlyZXR1cm4gbnVsbDsgLy8gTmV2ZXIgaGFwcGVucworCQkJfQogCQkJZmluYWwgUGF0Y2ggcCA9IG5ldyBQYXRjaCgpOwogCQkJcC5wYXJzZShpbik7CiAJCQlyZXR1cm4gcDsKLQkJfSBmaW5hbGx5IHsKLQkJCWluLmNsb3NlKCk7CiAJCX0KIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvUGF0Y2hFcnJvclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9QYXRjaEVycm9yVGVzdC5qYXZhCmluZGV4IDUyZTM4NzQuLjNiZGY4NTIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9QYXRjaEVycm9yVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9QYXRjaEVycm9yVGVzdC5qYXZhCkBAIC0xNzcsMTcgKzE3NywxNCBAQCBwdWJsaWMgdm9pZCB0ZXN0RXJyb3JfR2l0QmluYXJ5Tm9Gb3J3YXJkSHVuaygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAKIAlwcml2YXRlIFBhdGNoIHBhcnNlVGVzdFBhdGNoRmlsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIFN0cmluZyBwYXRjaEZpbGUgPSBKR2l0VGVzdFV0aWwuZ2V0TmFtZSgpICsgIi5wYXRjaCI7Ci0JCWZpbmFsIElucHV0U3RyZWFtIGluID0gZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKHBhdGNoRmlsZSk7Ci0JCWlmIChpbiA9PSBudWxsKSB7Ci0JCQlmYWlsKCJObyAiICsgcGF0Y2hGaWxlICsgIiB0ZXN0IHZlY3RvciIpOwotCQkJcmV0dXJuIG51bGw7IC8vIE5ldmVyIGhhcHBlbnMKLQkJfQotCQl0cnkgeworCQl0cnkgKElucHV0U3RyZWFtIGluID0gZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKHBhdGNoRmlsZSkpIHsKKwkJCWlmIChpbiA9PSBudWxsKSB7CisJCQkJZmFpbCgiTm8gIiArIHBhdGNoRmlsZSArICIgdGVzdCB2ZWN0b3IiKTsKKwkJCQlyZXR1cm4gbnVsbDsgLy8gTmV2ZXIgaGFwcGVucworCQkJfQogCQkJZmluYWwgUGF0Y2ggcCA9IG5ldyBQYXRjaCgpOwogCQkJcC5wYXJzZShpbik7CiAJCQlyZXR1cm4gcDsKLQkJfSBmaW5hbGx5IHsKLQkJCWluLmNsb3NlKCk7CiAJCX0KIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvUGF0Y2hUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvUGF0Y2hUZXN0LmphdmEKaW5kZXggOWY1N2FiOS4uNmEwOWE0OSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL1BhdGNoVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9QYXRjaFRlc3QuamF2YQpAQCAtMzU3LDE3ICszNTcsMTQgQEAgcHVibGljIHZvaWQgdGVzdFBhcnNlX0FkZE5vTmV3bGluZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAKIAlwcml2YXRlIFBhdGNoIHBhcnNlVGVzdFBhdGNoRmlsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIFN0cmluZyBwYXRjaEZpbGUgPSBKR2l0VGVzdFV0aWwuZ2V0TmFtZSgpICsgIi5wYXRjaCI7Ci0JCWZpbmFsIElucHV0U3RyZWFtIGluID0gZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKHBhdGNoRmlsZSk7Ci0JCWlmIChpbiA9PSBudWxsKSB7Ci0JCQlmYWlsKCJObyAiICsgcGF0Y2hGaWxlICsgIiB0ZXN0IHZlY3RvciIpOwotCQkJcmV0dXJuIG51bGw7IC8vIE5ldmVyIGhhcHBlbnMKLQkJfQotCQl0cnkgeworCQl0cnkgKElucHV0U3RyZWFtIGluID0gZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKHBhdGNoRmlsZSkpIHsKKwkJCWlmIChpbiA9PSBudWxsKSB7CisJCQkJZmFpbCgiTm8gIiArIHBhdGNoRmlsZSArICIgdGVzdCB2ZWN0b3IiKTsKKwkJCQlyZXR1cm4gbnVsbDsgLy8gTmV2ZXIgaGFwcGVucworCQkJfQogCQkJZmluYWwgUGF0Y2ggcCA9IG5ldyBQYXRjaCgpOwogCQkJcC5wYXJzZShpbik7CiAJCQlyZXR1cm4gcDsKLQkJfSBmaW5hbGx5IHsKLQkJCWluLmNsb3NlKCk7CiAJCX0KIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9Gb290ZXJMaW5lVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvRm9vdGVyTGluZVRlc3QuamF2YQppbmRleCA4N2M4NTQ3Li5hZDgzMjdmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9Gb290ZXJMaW5lVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0Zvb3RlckxpbmVUZXN0LmphdmEKQEAgLTM1Myw3ICszNTMsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0TWF0Y2hlc0J1Z0lkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJYXNzZXJ0RmFsc2UoIm5vdCBDQyIsIGxpbmUubWF0Y2hlcyhGb290ZXJLZXkuQ0MpKTsKIAl9CiAKLQlwcml2YXRlIFJldkNvbW1pdCBwYXJzZShmaW5hbCBTdHJpbmcgbXNnKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByaXZhdGUgUmV2Q29tbWl0IHBhcnNlKFN0cmluZyBtc2cpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIFN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKIAkJYnVmLmFwcGVuZCgidHJlZSAiICsgT2JqZWN0SWQuemVyb0lkKCkubmFtZSgpICsgIlxuIik7CiAJCWJ1Zi5hcHBlbmQoImF1dGhvciBBLiBVLiBUaG9yIDxhQGV4YW1wbGUuY29tPiAxICswMDAwXG4iKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldkNvbW1pdFBhcnNlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2Q29tbWl0UGFyc2VUZXN0LmphdmEKaW5kZXggODhmMjQwYi4uY2ZlZmFjMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2Q29tbWl0UGFyc2VUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2Q29tbWl0UGFyc2VUZXN0LmphdmEKQEAgLTQ0LDcgKzQ0LDcgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrOwogCiBpbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5JU09fODg1OV8xOwotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CkBAIC0xMTQsNyArMTE0LDcgQEAgcHVibGljIHZvaWQgdGVzdFBhcnNlX05vUGFyZW50cygpIHRocm93cyBFeGNlcHRpb24gewogCQlhc3NlcnROdWxsKGMuZ2V0VHJlZSgpKTsKIAkJYXNzZXJ0TnVsbChjLnBhcmVudHMpOwogCi0JCWMucGFyc2VDYW5vbmljYWwocncsIGJvZHkudG9TdHJpbmcoKS5nZXRCeXRlcyhVVEZfOCkpOworCQljLnBhcnNlQ2Fub25pY2FsKHJ3LCBib2R5LnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQlhc3NlcnROb3ROdWxsKGMuZ2V0VHJlZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKHRyZWVJZCwgYy5nZXRUcmVlKCkuZ2V0SWQoKSk7CiAJCWFzc2VydFNhbWUocncubG9va3VwVHJlZSh0cmVlSWQpLCBjLmdldFRyZWUoKSk7CkBAIC0xMzgsNyArMTM4LDcgQEAgcHVibGljIHZvaWQgdGVzdFBhcnNlX05vUGFyZW50cygpIHRocm93cyBFeGNlcHRpb24gewogCQlhc3NlcnRFcXVhbHMoVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVCIgKyBjb21taXR0ZXJUaW1lWm9uZSksIGNDb21taXR0ZXIuZ2V0VGltZVpvbmUoKSk7CiAJfQogCi0JcHJpdmF0ZSBSZXZDb21taXQgY3JlYXRlKGZpbmFsIFN0cmluZyBtc2cpIHRocm93cyBFeGNlcHRpb24geworCXByaXZhdGUgUmV2Q29tbWl0IGNyZWF0ZShTdHJpbmcgbXNnKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJZmluYWwgU3RyaW5nQnVpbGRlciBiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKIAkJYi5hcHBlbmQoInRyZWUgOTc4ODY2OWFkOTE4YjZmY2NlNjRhZjg4ODJmYzlhODFjYjZhYmE2N1xuIik7CiAJCWIuYXBwZW5kKCJhdXRob3IgQSBVLiBUaG9yIDxhX3VfdGhvckBleGFtcGxlLmNvbT4gMTIxODEyMzM4NyArMDcwMFxuIik7CkBAIC0xNDgsNyArMTQ4LDcgQEAgcHJpdmF0ZSBSZXZDb21taXQgY3JlYXRlKGZpbmFsIFN0cmluZyBtc2cpIHRocm93cyBFeGNlcHRpb24gewogCiAJCWZpbmFsIFJldkNvbW1pdCBjOwogCQljID0gbmV3IFJldkNvbW1pdChpZCgiOTQ3MzA5NWM0Y2IyZjEyYWVmZTFkYjhhMzU1ZmUzZmFmYmE0MmY2NyIpKTsKLQkJYy5wYXJzZUNhbm9uaWNhbChuZXcgUmV2V2FsayhkYiksIGIudG9TdHJpbmcoKS5nZXRCeXRlcyhVVEZfOCkpOworCQljLnBhcnNlQ2Fub25pY2FsKG5ldyBSZXZXYWxrKGRiKSwgYi50b1N0cmluZygpLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJcmV0dXJuIGM7CiAJfQogCkBAIC0xNjEsNyArMTYxLDcgQEAgcHVibGljIHZvaWQgdGVzdFBhcnNlX1dlaXJkSGVhZGVyT25seUNvbW1pdCgpIHRocm93cyBFeGNlcHRpb24gewogCiAJCWZpbmFsIFJldkNvbW1pdCBjOwogCQljID0gbmV3IFJldkNvbW1pdChpZCgiOTQ3MzA5NWM0Y2IyZjEyYWVmZTFkYjhhMzU1ZmUzZmFmYmE0MmY2NyIpKTsKLQkJYy5wYXJzZUNhbm9uaWNhbChuZXcgUmV2V2FsayhkYiksIGIudG9TdHJpbmcoKS5nZXRCeXRlcyhVVEZfOCkpOworCQljLnBhcnNlQ2Fub25pY2FsKG5ldyBSZXZXYWxrKGRiKSwgYi50b1N0cmluZygpLmdldEJ5dGVzKENIQVJTRVQpKTsKIAogCQlhc3NlcnRFcXVhbHMoIiIsIGMuZ2V0RnVsbE1lc3NhZ2UoKSk7CiAJCWFzc2VydEVxdWFscygiIiwgYy5nZXRTaG9ydE1lc3NhZ2UoKSk7CkBAIC0xNzYsNyArMTc2LDcgQEAgcHVibGljIHZvaWQgdGVzdFBhcnNlX2luY29tcGxldGVBdXRob3JBbmRDb21taXR0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogCQlmaW5hbCBSZXZDb21taXQgYzsKIAkJYyA9IG5ldyBSZXZDb21taXQoaWQoIjk0NzMwOTVjNGNiMmYxMmFlZmUxZGI4YTM1NWZlM2ZhZmJhNDJmNjciKSk7Ci0JCWMucGFyc2VDYW5vbmljYWwobmV3IFJldldhbGsoZGIpLCBiLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJYy5wYXJzZUNhbm9uaWNhbChuZXcgUmV2V2FsayhkYiksIGIudG9TdHJpbmcoKS5nZXRCeXRlcyhDSEFSU0VUKSk7CiAKIAkJYXNzZXJ0RXF1YWxzKG5ldyBQZXJzb25JZGVudCgiIiwgImFfdV90aG9yQGV4YW1wbGUuY29tIiwgMTIxODEyMzM4NzAwMGwsIDcpLCBjLmdldEF1dGhvcklkZW50KCkpOwogCQlhc3NlcnRFcXVhbHMobmV3IFBlcnNvbklkZW50KCIiLCAiIiwgMTIxODEyMzM5MDAwMGwsIC01KSwgYy5nZXRDb21taXR0ZXJJZGVudCgpKTsKQEAgLTE4NSwxMyArMTg1LDEzIEBAIHB1YmxpYyB2b2lkIHRlc3RQYXJzZV9pbmNvbXBsZXRlQXV0aG9yQW5kQ29tbWl0dGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0UGFyc2VfaW1wbGljaXRfVVRGOF9lbmNvZGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQliLndyaXRlKCJ0cmVlIDk3ODg2NjlhZDkxOGI2ZmNjZTY0YWY4ODgyZmM5YTgxY2I2YWJhNjdcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiYXV0aG9yIEZcdTAwZjZyIGZhdHRhcmUgPGFfdV90aG9yQGV4YW1wbGUuY29tPiAxMjE4MTIzMzg3ICswNzAwXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoImNvbW1pdHRlciBDIE8uIE1pdGVyIDxjQGV4YW1wbGUuY29tPiAxMjE4MTIzMzkwIC0wNTAwXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoIlxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJTbVx1MDBmNnJnXHUwMGU1c2JvcmRcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoIlx1MzA0ZFx1MzA4Y1x1MzA0NFxuIi5nZXRCeXRlcyhVVEZfOCkpOworCQliLndyaXRlKCJ0cmVlIDk3ODg2NjlhZDkxOGI2ZmNjZTY0YWY4ODgyZmM5YTgxY2I2YWJhNjdcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJhdXRob3IgRlx1MDBmNnIgZmF0dGFyZSA8YV91X3Rob3JAZXhhbXBsZS5jb20+IDEyMTgxMjMzODcgKzA3MDBcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJjb21taXR0ZXIgQyBPLiBNaXRlciA8Y0BleGFtcGxlLmNvbT4gMTIxODEyMzM5MCAtMDUwMFxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoIlxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoIlNtXHUwMGY2cmdcdTAwZTVzYm9yZFxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoIlxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoIlx1MzA0ZFx1MzA4Y1x1MzA0NFxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCWZpbmFsIFJldkNvbW1pdCBjOwogCQljID0gbmV3IFJldkNvbW1pdChpZCgiOTQ3MzA5NWM0Y2IyZjEyYWVmZTFkYjhhMzU1ZmUzZmFmYmE0MmY2NyIpKTsgLy8gYm9ndXMgaWQKIAkJYy5wYXJzZUNhbm9uaWNhbChuZXcgUmV2V2FsayhkYiksIGIudG9CeXRlQXJyYXkoKSk7CkBAIC0yMDUsMTMgKzIwNSwxMyBAQCBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VfaW1wbGljaXRfVVRGOF9lbmNvZGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0UGFyc2VfaW1wbGljaXRfbWl4ZWRfZW5jb2RlZCgpIHRocm93cyBFeGNlcHRpb24gewogCQlmaW5hbCBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYiA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJYi53cml0ZSgidHJlZSA5Nzg4NjY5YWQ5MThiNmZjY2U2NGFmODg4MmZjOWE4MWNiNmFiYTY3XG4iLmdldEJ5dGVzKFVURl84KSk7CisJCWIud3JpdGUoInRyZWUgOTc4ODY2OWFkOTE4YjZmY2NlNjRhZjg4ODJmYzlhODFjYjZhYmE2N1xuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCWIud3JpdGUoImF1dGhvciBGXHUwMGY2ciBmYXR0YXJlIDxhX3VfdGhvckBleGFtcGxlLmNvbT4gMTIxODEyMzM4NyArMDcwMFxuIi5nZXRCeXRlcyhJU09fODg1OV8xKSk7Ci0JCWIud3JpdGUoImNvbW1pdHRlciBDIE8uIE1pdGVyIDxjQGV4YW1wbGUuY29tPiAxMjE4MTIzMzkwIC0wNTAwXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoIlxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJTbVx1MDBmNnJnXHUwMGU1c2JvcmRcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoIlx1MzA0ZFx1MzA4Y1x1MzA0NFxuIi5nZXRCeXRlcyhVVEZfOCkpOworCQliLndyaXRlKCJjb21taXR0ZXIgQyBPLiBNaXRlciA8Y0BleGFtcGxlLmNvbT4gMTIxODEyMzM5MCAtMDUwMFxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoIlxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoIlNtXHUwMGY2cmdcdTAwZTVzYm9yZFxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoIlxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoIlx1MzA0ZFx1MzA4Y1x1MzA0NFxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCWZpbmFsIFJldkNvbW1pdCBjOwogCQljID0gbmV3IFJldkNvbW1pdChpZCgiOTQ3MzA5NWM0Y2IyZjEyYWVmZTFkYjhhMzU1ZmUzZmFmYmE0MmY2NyIpKTsgLy8gYm9ndXMgaWQKIAkJYy5wYXJzZUNhbm9uaWNhbChuZXcgUmV2V2FsayhkYiksIGIudG9CeXRlQXJyYXkoKSk7CkBAIC0yNjAsMTQgKzI2MCwxNCBAQCBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VfZXhwbGljaXRfZW5jb2RlZCgpIHRocm93cyBFeGNlcHRpb24gewogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdFBhcnNlX2V4cGxpY2l0X2JhZF9lbmNvZGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQliLndyaXRlKCJ0cmVlIDk3ODg2NjlhZDkxOGI2ZmNjZTY0YWY4ODgyZmM5YTgxY2I2YWJhNjdcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJYi53cml0ZSgidHJlZSA5Nzg4NjY5YWQ5MThiNmZjY2U2NGFmODg4MmZjOWE4MWNiNmFiYTY3XG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJYi53cml0ZSgiYXV0aG9yIEZcdTAwZjZyIGZhdHRhcmUgPGFfdV90aG9yQGV4YW1wbGUuY29tPiAxMjE4MTIzMzg3ICswNzAwXG4iLmdldEJ5dGVzKElTT184ODU5XzEpKTsKLQkJYi53cml0ZSgiY29tbWl0dGVyIEMgTy4gTWl0ZXIgPGNAZXhhbXBsZS5jb20+IDEyMTgxMjMzOTAgLTA1MDBcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiZW5jb2RpbmcgRVVDLUpQXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoIlxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJcdTMwNGRcdTMwOGNcdTMwNDRcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoIkhpXG4iLmdldEJ5dGVzKFVURl84KSk7CisJCWIud3JpdGUoImNvbW1pdHRlciBDIE8uIE1pdGVyIDxjQGV4YW1wbGUuY29tPiAxMjE4MTIzMzkwIC0wNTAwXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiZW5jb2RpbmcgRVVDLUpQXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiXHUzMDRkXHUzMDhjXHUzMDQ0XG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiSGlcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQlmaW5hbCBSZXZDb21taXQgYzsKIAkJYyA9IG5ldyBSZXZDb21taXQoaWQoIjk0NzMwOTVjNGNiMmYxMmFlZmUxZGI4YTM1NWZlM2ZhZmJhNDJmNjciKSk7IC8vIGJvZ3VzIGlkCiAJCWMucGFyc2VDYW5vbmljYWwobmV3IFJldldhbGsoZGIpLCBiLnRvQnl0ZUFycmF5KCkpOwpAQCAtMjkxLDE0ICsyOTEsMTQgQEAgcHVibGljIHZvaWQgdGVzdFBhcnNlX2V4cGxpY2l0X2JhZF9lbmNvZGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0UGFyc2VfZXhwbGljaXRfYmFkX2VuY29kZWQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQliLndyaXRlKCJ0cmVlIDk3ODg2NjlhZDkxOGI2ZmNjZTY0YWY4ODgyZmM5YTgxY2I2YWJhNjdcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiYXV0aG9yIEZcdTAwZjZyIGZhdHRhcmUgPGFfdV90aG9yQGV4YW1wbGUuY29tPiAxMjE4MTIzMzg3ICswNzAwXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoImNvbW1pdHRlciBDIE8uIE1pdGVyIDxjQGV4YW1wbGUuY29tPiAxMjE4MTIzMzkwIC0wNTAwXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoImVuY29kaW5nIElTTy04ODU5LTFcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoIlx1MzA0ZFx1MzA4Y1x1MzA0NFxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiSGlcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJYi53cml0ZSgidHJlZSA5Nzg4NjY5YWQ5MThiNmZjY2U2NGFmODg4MmZjOWE4MWNiNmFiYTY3XG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiYXV0aG9yIEZcdTAwZjZyIGZhdHRhcmUgPGFfdV90aG9yQGV4YW1wbGUuY29tPiAxMjE4MTIzMzg3ICswNzAwXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiY29tbWl0dGVyIEMgTy4gTWl0ZXIgPGNAZXhhbXBsZS5jb20+IDEyMTgxMjMzOTAgLTA1MDBcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJlbmNvZGluZyBJU08tODg1OS0xXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiXHUzMDRkXHUzMDhjXHUzMDQ0XG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiSGlcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQlmaW5hbCBSZXZDb21taXQgYzsKIAkJYyA9IG5ldyBSZXZDb21taXQoaWQoIjk0NzMwOTVjNGNiMmYxMmFlZmUxZGI4YTM1NWZlM2ZhZmJhNDJmNjciKSk7IC8vIGJvZ3VzIGlkCiAJCWMucGFyc2VDYW5vbmljYWwobmV3IFJldldhbGsoZGIpLCBiLnRvQnl0ZUFycmF5KCkpOwpAQCAtMzEzLDEzICszMTMsMTMgQEAgcHVibGljIHZvaWQgdGVzdFBhcnNlX2V4cGxpY2l0X2JhZF9lbmNvZGVkMigpIHRocm93cyBFeGNlcHRpb24gewogCXB1YmxpYyB2b2lkIHRlc3RQYXJzZV9pbmNvcnJlY3RVdGY4TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewogCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYiA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKIAkJYi53cml0ZSgidHJlZSA5Nzg4NjY5YWQ5MThiNmZjY2U2NGFmODg4MmZjOWE4MWNiNmFiYTY3XG4iCi0JCQkJLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoImF1dGhvciBhdSA8YUBleGFtcGxlLmNvbT4gMTIxODEyMzM4NyArMDcwMFxuIi5nZXRCeXRlcyhVVEZfOCkpOworCQkJCS5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoImF1dGhvciBhdSA8YUBleGFtcGxlLmNvbT4gMTIxODEyMzM4NyArMDcwMFxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCWIud3JpdGUoImNvbW1pdHRlciBjbyA8Y0BleGFtcGxlLmNvbT4gMTIxODEyMzM5MCAtMDUwMFxuIgotCQkJCS5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJlbmNvZGluZyAndXRmOCdcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoIlNtXHUwMGY2cmdcdTAwZTVzYm9yZFxuIi5nZXRCeXRlcyhVVEZfOCkpOworCQkJCS5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoImVuY29kaW5nICd1dGY4J1xuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoIlxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoIlNtXHUwMGY2cmdcdTAwZTVzYm9yZFxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CiAKIAkJUmV2Q29tbWl0IGMgPSBuZXcgUmV2Q29tbWl0KAogCQkJCWlkKCI5NDczMDk1YzRjYjJmMTJhZWZlMWRiOGEzNTVmZTNmYWZiYTQyZjY3IikpOwpAQCAtMzM4LDEyICszMzgsMTIgQEAgcHVibGljIHZvaWQgdGVzdFBhcnNlX2luY29ycmVjdFV0ZjhOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0UGFyc2VfaWxsZWdhbEVuY29kaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBiID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQliLndyaXRlKCJ0cmVlIDk3ODg2NjlhZDkxOGI2ZmNjZTY0YWY4ODgyZmM5YTgxY2I2YWJhNjdcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiYXV0aG9yIGF1IDxhQGV4YW1wbGUuY29tPiAxMjE4MTIzMzg3ICswNzAwXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoImNvbW1pdHRlciBjbyA8Y0BleGFtcGxlLmNvbT4gMTIxODEyMzM5MCAtMDUwMFxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJlbmNvZGluZyB1dGYtOGxvZ291dHB1dGVuY29kaW5nPWdia1xuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgibWVzc2FnZVxuIi5nZXRCeXRlcyhVVEZfOCkpOworCQliLndyaXRlKCJ0cmVlIDk3ODg2NjlhZDkxOGI2ZmNjZTY0YWY4ODgyZmM5YTgxY2I2YWJhNjdcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJhdXRob3IgYXUgPGFAZXhhbXBsZS5jb20+IDEyMTgxMjMzODcgKzA3MDBcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJjb21taXR0ZXIgY28gPGNAZXhhbXBsZS5jb20+IDEyMTgxMjMzOTAgLTA1MDBcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJlbmNvZGluZyB1dGYtOGxvZ291dHB1dGVuY29kaW5nPWdia1xuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoIlxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoIm1lc3NhZ2VcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCiAJCVJldkNvbW1pdCBjID0gbmV3IFJldkNvbW1pdCgKIAkJCQlpZCgiOTQ3MzA5NWM0Y2IyZjEyYWVmZTFkYjhhMzU1ZmUzZmFmYmE0MmY2NyIpKTsKQEAgLTM2NSwxMiArMzY1LDEyIEBAIHB1YmxpYyB2b2lkIHRlc3RQYXJzZV9pbGxlZ2FsRW5jb2RpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RQYXJzZV91bnN1cHBvcnRlZEVuY29kaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBiID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQliLndyaXRlKCJ0cmVlIDk3ODg2NjlhZDkxOGI2ZmNjZTY0YWY4ODgyZmM5YTgxY2I2YWJhNjdcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiYXV0aG9yIGF1IDxhQGV4YW1wbGUuY29tPiAxMjE4MTIzMzg3ICswNzAwXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoImNvbW1pdHRlciBjbyA8Y0BleGFtcGxlLmNvbT4gMTIxODEyMzM5MCAtMDUwMFxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJlbmNvZGluZyBpdF9JVC5VVEY4XG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoIlxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJtZXNzYWdlXG4iLmdldEJ5dGVzKFVURl84KSk7CisJCWIud3JpdGUoInRyZWUgOTc4ODY2OWFkOTE4YjZmY2NlNjRhZjg4ODJmYzlhODFjYjZhYmE2N1xuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoImF1dGhvciBhdSA8YUBleGFtcGxlLmNvbT4gMTIxODEyMzM4NyArMDcwMFxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoImNvbW1pdHRlciBjbyA8Y0BleGFtcGxlLmNvbT4gMTIxODEyMzM5MCAtMDUwMFxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoImVuY29kaW5nIGl0X0lULlVURjhcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJtZXNzYWdlXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKIAogCQlSZXZDb21taXQgYyA9IG5ldyBSZXZDb21taXQoCiAJCQkJaWQoIjk0NzMwOTVjNGNiMmYxMmFlZmUxZGI4YTM1NWZlM2ZhZmJhNDJmNjciKSk7CkBAIC00ODMsNyArNDgzLDcgQEAgcHVibGljIHZvaWQgdGVzdFBhcnNlX0dpdFN0eWxlTWVzc2FnZVdpdGhDUkxGKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWFzc2VydEVxdWFscyhzaG9ydE1zZywgYy5nZXRTaG9ydE1lc3NhZ2UoKSk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgT2JqZWN0SWQgaWQoZmluYWwgU3RyaW5nIHN0cikgeworCXByaXZhdGUgc3RhdGljIE9iamVjdElkIGlkKFN0cmluZyBzdHIpIHsKIAkJcmV0dXJuIE9iamVjdElkLmZyb21TdHJpbmcoc3RyKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZPYmplY3RUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZPYmplY3RUZXN0LmphdmEKaW5kZXggMTIyYTM5Ny4uOGUzODlhZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2T2JqZWN0VGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1Jldk9iamVjdFRlc3QuamF2YQpAQCAtNzYsNyArNzYsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKIAkJZmluYWwgUmV2Q29tbWl0IGEyOwogCQlmaW5hbCBSZXZDb21taXQgYjI7Ci0JCXRyeSAoZmluYWwgUmV2V2FsayBydzIgPSBuZXcgUmV2V2FsayhkYikpIHsKKwkJdHJ5IChSZXZXYWxrIHJ3MiA9IG5ldyBSZXZXYWxrKGRiKSkgewogCQkJYTIgPSBydzIucGFyc2VDb21taXQoYTEpOwogCQkJYjIgPSBydzIucGFyc2VDb21taXQoYjEpOwogCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZUYWdQYXJzZVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldlRhZ1BhcnNlVGVzdC5qYXZhCmluZGV4IDM4YmQzNzEuLmUxMWNlZjcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldlRhZ1BhcnNlVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldlRhZ1BhcnNlVGVzdC5qYXZhCkBAIC00NCw3ICs0NCw3IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQucmV2d2FsazsKIAogaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuSVNPXzg4NTlfMTsKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOwpAQCAtODIsNyArODIsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0VGFnVGFnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXRlc3RPbmVUeXBlKENvbnN0YW50cy5PQkpfVEFHKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgdGVzdE9uZVR5cGUoZmluYWwgaW50IHR5cGVDb2RlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwcml2YXRlIHZvaWQgdGVzdE9uZVR5cGUoaW50IHR5cGVDb2RlKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJZmluYWwgT2JqZWN0SWQgaWQgPSBpZCgiOTc4ODY2OWFkOTE4YjZmY2NlNjRhZjg4ODJmYzlhODFjYjZhYmE2NyIpOwogCQlmaW5hbCBTdHJpbmdCdWlsZGVyIGIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogCQliLmFwcGVuZCgib2JqZWN0ICIgKyBpZC5uYW1lKCkgKyAiXG4iKTsKQEAgLTk4LDcgKzk4LDcgQEAgcHJpdmF0ZSB2b2lkIHRlc3RPbmVUeXBlKGZpbmFsIGludCB0eXBlQ29kZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWFzc2VydE51bGwoYy5nZXRPYmplY3QoKSk7CiAJCWFzc2VydE51bGwoYy5nZXRUYWdOYW1lKCkpOwogCi0JCWMucGFyc2VDYW5vbmljYWwocncsIGIudG9TdHJpbmcoKS5nZXRCeXRlcyhVVEZfOCkpOworCQljLnBhcnNlQ2Fub25pY2FsKHJ3LCBiLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQlhc3NlcnROb3ROdWxsKGMuZ2V0T2JqZWN0KCkpOwogCQlhc3NlcnRFcXVhbHMoaWQsIGMuZ2V0T2JqZWN0KCkuZ2V0SWQoKSk7CiAJCWFzc2VydFNhbWUocncubG9va3VwQW55KGlkLCB0eXBlQ29kZSksIGMuZ2V0T2JqZWN0KCkpOwpAQCAtMTQxLDcgKzE0MSw3IEBAIHB1YmxpYyB2b2lkIHRlc3RQYXJzZUFsbEZpZWxkcygpIHRocm93cyBFeGNlcHRpb24gewogCQlhc3NlcnROdWxsKGMuZ2V0T2JqZWN0KCkpOwogCQlhc3NlcnROdWxsKGMuZ2V0VGFnTmFtZSgpKTsKIAotCQljLnBhcnNlQ2Fub25pY2FsKHJ3LCBib2R5LnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJYy5wYXJzZUNhbm9uaWNhbChydywgYm9keS50b1N0cmluZygpLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJYXNzZXJ0Tm90TnVsbChjLmdldE9iamVjdCgpKTsKIAkJYXNzZXJ0RXF1YWxzKHRyZWVJZCwgYy5nZXRPYmplY3QoKS5nZXRJZCgpKTsKIAkJYXNzZXJ0U2FtZShydy5sb29rdXBUcmVlKHRyZWVJZCksIGMuZ2V0T2JqZWN0KCkpOwpAQCAtMTg5LDcgKzE4OSw3IEBAIHB1YmxpYyB2b2lkIHRlc3RQYXJzZU9sZFN0eWxlTm9UYWdnZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJYXNzZXJ0TnVsbChjLmdldE9iamVjdCgpKTsKIAkJYXNzZXJ0TnVsbChjLmdldFRhZ05hbWUoKSk7CiAKLQkJYy5wYXJzZUNhbm9uaWNhbChydywgYm9keS50b1N0cmluZygpLmdldEJ5dGVzKFVURl84KSk7CisJCWMucGFyc2VDYW5vbmljYWwocncsIGJvZHkudG9TdHJpbmcoKS5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCWFzc2VydE5vdE51bGwoYy5nZXRPYmplY3QoKSk7CiAJCWFzc2VydEVxdWFscyh0cmVlSWQsIGMuZ2V0T2JqZWN0KCkuZ2V0SWQoKSk7CiAJCWFzc2VydFNhbWUocncubG9va3VwVHJlZSh0cmVlSWQpLCBjLmdldE9iamVjdCgpKTsKQEAgLTIwMiw3ICsyMDIsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VPbGRTdHlsZU5vVGFnZ2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWFzc2VydE51bGwoYy5nZXRUYWdnZXJJZGVudCgpKTsKIAl9CiAKLQlwcml2YXRlIFJldlRhZyBjcmVhdGUoZmluYWwgU3RyaW5nIG1zZykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHJpdmF0ZSBSZXZUYWcgY3JlYXRlKFN0cmluZyBtc2cpIHRocm93cyBFeGNlcHRpb24gewogCQlmaW5hbCBTdHJpbmdCdWlsZGVyIGIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogCQliLmFwcGVuZCgib2JqZWN0IDk3ODg2NjlhZDkxOGI2ZmNjZTY0YWY4ODgyZmM5YTgxY2I2YWJhNjdcbiIpOwogCQliLmFwcGVuZCgidHlwZSB0cmVlXG4iKTsKQEAgLTIxMyw3ICsyMTMsNyBAQCBwcml2YXRlIFJldlRhZyBjcmVhdGUoZmluYWwgU3RyaW5nIG1zZykgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKIAkJZmluYWwgUmV2VGFnIGM7CiAJCWMgPSBuZXcgUmV2VGFnKGlkKCI5NDczMDk1YzRjYjJmMTJhZWZlMWRiOGEzNTVmZTNmYWZiYTQyZjY3IikpOwotCQljLnBhcnNlQ2Fub25pY2FsKG5ldyBSZXZXYWxrKGRiKSwgYi50b1N0cmluZygpLmdldEJ5dGVzKFVURl84KSk7CisJCWMucGFyc2VDYW5vbmljYWwobmV3IFJldldhbGsoZGIpLCBiLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQlyZXR1cm4gYzsKIAl9CiAKQEAgLTIyMSwxNyArMjIxLDE3IEBAIHByaXZhdGUgUmV2VGFnIGNyZWF0ZShmaW5hbCBTdHJpbmcgbXNnKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAlwdWJsaWMgdm9pZCB0ZXN0UGFyc2VfaW1wbGljaXRfVVRGOF9lbmNvZGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogCQliLndyaXRlKCJvYmplY3QgOTc4ODY2OWFkOTE4YjZmY2NlNjRhZjg4ODJmYzlhODFjYjZhYmE2N1xuIgotCQkJCS5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJ0eXBlIHRyZWVcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgidGFnIHYxLjIuMy40LjVcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJCQkuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJ0eXBlIHRyZWVcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJ0YWcgdjEuMi4zLjQuNVxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CiAKIAkJYgogCQkJCS53cml0ZSgidGFnZ2VyIEZcdTAwZjZyIGZhdHRhcmUgPGFfdV90aG9yQGV4YW1wbGUuY29tPiAxMjE4MTIzMzg3ICswNzAwXG4iCi0JCQkJCQkuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoIlNtXHUwMGY2cmdcdTAwZTVzYm9yZFxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiXHUzMDRkXHUzMDhjXHUzMDQ0XG4iLmdldEJ5dGVzKFVURl84KSk7CisJCQkJCQkuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJTbVx1MDBmNnJnXHUwMGU1c2JvcmRcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJcdTMwNGRcdTMwOGNcdTMwNDRcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQlmaW5hbCBSZXZUYWcgYzsKIAkJYyA9IG5ldyBSZXZUYWcoaWQoIjk0NzMwOTVjNGNiMmYxMmFlZmUxZGI4YTM1NWZlM2ZhZmJhNDJmNjciKSk7CiAJCWMucGFyc2VDYW5vbmljYWwobmV3IFJldldhbGsoZGIpLCBiLnRvQnl0ZUFycmF5KCkpOwpAQCAtMjQ2LDE1ICsyNDYsMTUgQEAgcHVibGljIHZvaWQgdGVzdFBhcnNlX2ltcGxpY2l0X1VURjhfZW5jb2RlZCgpIHRocm93cyBFeGNlcHRpb24gewogCXB1YmxpYyB2b2lkIHRlc3RQYXJzZV9pbXBsaWNpdF9taXhlZF9lbmNvZGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogCQliLndyaXRlKCJvYmplY3QgOTc4ODY2OWFkOTE4YjZmY2NlNjRhZjg4ODJmYzlhODFjYjZhYmE2N1xuIgotCQkJCS5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJ0eXBlIHRyZWVcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgidGFnIHYxLjIuMy40LjVcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJCQkuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJ0eXBlIHRyZWVcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJ0YWcgdjEuMi4zLjQuNVxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCWIud3JpdGUoInRhZ2dlciBGXHUwMGY2ciBmYXR0YXJlIDxhX3VfdGhvckBleGFtcGxlLmNvbT4gMTIxODEyMzM4NyArMDcwMFxuIgogCQkJCS5nZXRCeXRlcyhJU09fODg1OV8xKSk7Ci0JCWIud3JpdGUoIlxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJTbVx1MDBmNnJnXHUwMGU1c2JvcmRcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoIlx1MzA0ZFx1MzA4Y1x1MzA0NFxuIi5nZXRCeXRlcyhVVEZfOCkpOworCQliLndyaXRlKCJcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJTbVx1MDBmNnJnXHUwMGU1c2JvcmRcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJcdTMwNGRcdTMwOGNcdTMwNDRcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQlmaW5hbCBSZXZUYWcgYzsKIAkJYyA9IG5ldyBSZXZUYWcoaWQoIjk0NzMwOTVjNGNiMmYxMmFlZmUxZGI4YTM1NWZlM2ZhZmJhNDJmNjciKSk7CiAJCWMucGFyc2VDYW5vbmljYWwobmV3IFJldldhbGsoZGIpLCBiLnRvQnl0ZUFycmF5KCkpOwpAQCAtMzA3LDE3ICszMDcsMTcgQEAgcHVibGljIHZvaWQgdGVzdFBhcnNlX2V4cGxpY2l0X2VuY29kZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAlwdWJsaWMgdm9pZCB0ZXN0UGFyc2VfZXhwbGljaXRfYmFkX2VuY29kZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJZmluYWwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGIgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAJCWIud3JpdGUoIm9iamVjdCA5Nzg4NjY5YWQ5MThiNmZjY2U2NGFmODg4MmZjOWE4MWNiNmFiYTY3XG4iCi0JCQkJLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoInR5cGUgdHJlZVxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJ0YWcgdjEuMi4zLjQuNVxuIi5nZXRCeXRlcyhVVEZfOCkpOworCQkJCS5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoInR5cGUgdHJlZVxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoInRhZyB2MS4yLjMuNC41XG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJYgogCQkJCS53cml0ZSgidGFnZ2VyIEZcdTAwZjZyIGZhdHRhcmUgPGFfdV90aG9yQGV4YW1wbGUuY29tPiAxMjE4MTIzMzg3ICswNzAwXG4iCiAJCQkJCQkuZ2V0Qnl0ZXMoSVNPXzg4NTlfMSkpOwotCQliLndyaXRlKCJlbmNvZGluZyBFVUMtSlBcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoIlx1MzA0ZFx1MzA4Y1x1MzA0NFxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiSGlcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJYi53cml0ZSgiZW5jb2RpbmcgRVVDLUpQXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiXHUzMDRkXHUzMDhjXHUzMDQ0XG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiSGlcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQlmaW5hbCBSZXZUYWcgYzsKIAkJYyA9IG5ldyBSZXZUYWcoaWQoIjk0NzMwOTVjNGNiMmYxMmFlZmUxZGI4YTM1NWZlM2ZhZmJhNDJmNjciKSk7CiAJCWMucGFyc2VDYW5vbmljYWwobmV3IFJldldhbGsoZGIpLCBiLnRvQnl0ZUFycmF5KCkpOwpAQCAtMzQyLDE3ICszNDIsMTcgQEAgcHVibGljIHZvaWQgdGVzdFBhcnNlX2V4cGxpY2l0X2JhZF9lbmNvZGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJcHVibGljIHZvaWQgdGVzdFBhcnNlX2V4cGxpY2l0X2JhZF9lbmNvZGVkMigpIHRocm93cyBFeGNlcHRpb24gewogCQlmaW5hbCBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYiA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKIAkJYi53cml0ZSgib2JqZWN0IDk3ODg2NjlhZDkxOGI2ZmNjZTY0YWY4ODgyZmM5YTgxY2I2YWJhNjdcbiIKLQkJCQkuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgidHlwZSB0cmVlXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoInRhZyB2MS4yLjMuNC41XG4iLmdldEJ5dGVzKFVURl84KSk7CisJCQkJLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgidHlwZSB0cmVlXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgidGFnIHYxLjIuMy40LjVcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQliCiAJCQkJLndyaXRlKCJ0YWdnZXIgRlx1MDBmNnIgZmF0dGFyZSA8YV91X3Rob3JAZXhhbXBsZS5jb20+IDEyMTgxMjMzODcgKzA3MDBcbiIKLQkJCQkJCS5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJlbmNvZGluZyBJU08tODg1OS0xXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoIlxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJcdTMwNGRcdTMwOGNcdTMwNDRcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoIkhpXG4iLmdldEJ5dGVzKFVURl84KSk7CisJCQkJCQkuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJlbmNvZGluZyBJU08tODg1OS0xXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiXHUzMDRkXHUzMDhjXHUzMDQ0XG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiSGlcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQlmaW5hbCBSZXZUYWcgYzsKIAkJYyA9IG5ldyBSZXZUYWcoaWQoIjk0NzMwOTVjNGNiMmYxMmFlZmUxZGI4YTM1NWZlM2ZhZmJhNDJmNjciKSk7CiAJCWMucGFyc2VDYW5vbmljYWwobmV3IFJldldhbGsoZGIpLCBiLnRvQnl0ZUFycmF5KCkpOwpAQCAtMzY1LDEzICszNjUsMTMgQEAgcHVibGljIHZvaWQgdGVzdFBhcnNlX2V4cGxpY2l0X2JhZF9lbmNvZGVkMigpIHRocm93cyBFeGNlcHRpb24gewogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdFBhcnNlX2lsbGVnYWxFbmNvZGluZygpIHRocm93cyBFeGNlcHRpb24gewogCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYiA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJYi53cml0ZSgib2JqZWN0IDk3ODg2NjlhZDkxOGI2ZmNjZTY0YWY4ODgyZmM5YTgxY2I2YWJhNjdcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgidHlwZSB0cmVlXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoInRhZyB2MS4wXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoInRhZ2dlciB0IDx0QGV4YW1wbGUuY29tPiAxMjE4MTIzMzg3ICswNzAwXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoImVuY29kaW5nIHV0Zi04bG9nb3V0cHV0ZW5jb2Rpbmc9Z2JrXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoIlxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJtZXNzYWdlXG4iLmdldEJ5dGVzKFVURl84KSk7CisJCWIud3JpdGUoIm9iamVjdCA5Nzg4NjY5YWQ5MThiNmZjY2U2NGFmODg4MmZjOWE4MWNiNmFiYTY3XG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgidHlwZSB0cmVlXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgidGFnIHYxLjBcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJ0YWdnZXIgdCA8dEBleGFtcGxlLmNvbT4gMTIxODEyMzM4NyArMDcwMFxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoImVuY29kaW5nIHV0Zi04bG9nb3V0cHV0ZW5jb2Rpbmc9Z2JrXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgibWVzc2FnZVxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CiAKIAkJUmV2VGFnIHQgPSBuZXcgUmV2VGFnKGlkKCI5NDczMDk1YzRjYjJmMTJhZWZlMWRiOGEzNTVmZTNmYWZiYTQyZjY3IikpOwogCQl0LnBhcnNlQ2Fub25pY2FsKG5ldyBSZXZXYWxrKGRiKSwgYi50b0J5dGVBcnJheSgpKTsKQEAgLTM4NCwxMyArMzg0LDEzIEBAIHB1YmxpYyB2b2lkIHRlc3RQYXJzZV9pbGxlZ2FsRW5jb2RpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RQYXJzZV91bnN1cHBvcnRlZEVuY29kaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBiID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQliLndyaXRlKCJvYmplY3QgOTc4ODY2OWFkOTE4YjZmY2NlNjRhZjg4ODJmYzlhODFjYjZhYmE2N1xuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJ0eXBlIHRyZWVcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgidGFnIHYxLjBcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgidGFnZ2VyIHQgPHRAZXhhbXBsZS5jb20+IDEyMTgxMjMzODcgKzA3MDBcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiZW5jb2RpbmcgaXRfSVQuVVRGOFxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgibWVzc2FnZVxuIi5nZXRCeXRlcyhVVEZfOCkpOworCQliLndyaXRlKCJvYmplY3QgOTc4ODY2OWFkOTE4YjZmY2NlNjRhZjg4ODJmYzlhODFjYjZhYmE2N1xuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoInR5cGUgdHJlZVxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoInRhZyB2MS4wXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgidGFnZ2VyIHQgPHRAZXhhbXBsZS5jb20+IDEyMTgxMjMzODcgKzA3MDBcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJlbmNvZGluZyBpdF9JVC5VVEY4XG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgibWVzc2FnZVxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CiAKIAkJUmV2VGFnIHQgPSBuZXcgUmV2VGFnKGlkKCI5NDczMDk1YzRjYjJmMTJhZWZlMWRiOGEzNTVmZTNmYWZiYTQyZjY3IikpOwogCQl0LnBhcnNlQ2Fub25pY2FsKG5ldyBSZXZXYWxrKGRiKSwgYi50b0J5dGVBcnJheSgpKTsKQEAgLTQ4MCw3ICs0ODAsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VfUHVibGljUGFyc2VNZXRob2QoKSB0aHJvd3MgQ29ycnVwdE9iamVjdEV4Y2VwdGlvbiB7CiAJCWFzc2VydEVxdWFscyhzcmMuZ2V0TWVzc2FnZSgpLCBwLmdldEZ1bGxNZXNzYWdlKCkpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIE9iamVjdElkIGlkKGZpbmFsIFN0cmluZyBzdHIpIHsKKwlwcml2YXRlIHN0YXRpYyBPYmplY3RJZCBpZChTdHJpbmcgc3RyKSB7CiAJCXJldHVybiBPYmplY3RJZC5mcm9tU3RyaW5nKHN0cik7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2V2Fsa0ZvbGxvd0ZpbHRlclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldldhbGtGb2xsb3dGaWx0ZXJUZXN0LmphdmEKaW5kZXggYWIyNzA1Yy4uNzAwNTAyNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2V2Fsa0ZvbGxvd0ZpbHRlclRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZXYWxrRm9sbG93RmlsdGVyVGVzdC5qYXZhCkBAIC03NSw3ICs3NSw3IEBAIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWRpZmZDb2xsZWN0b3IgPSBuZXcgRGlmZkNvbGxlY3RvcigpOwogCX0KIAotCXByb3RlY3RlZCBGb2xsb3dGaWx0ZXIgZm9sbG93KGZpbmFsIFN0cmluZyBmb2xsb3dQYXRoKSB7CisJcHJvdGVjdGVkIEZvbGxvd0ZpbHRlciBmb2xsb3coU3RyaW5nIGZvbGxvd1BhdGgpIHsKIAkJRm9sbG93RmlsdGVyIGZvbGxvd0ZpbHRlciA9CiAJCQlGb2xsb3dGaWx0ZXIuY3JlYXRlKGZvbGxvd1BhdGgsIG5ldyBDb25maWcoKS5nZXQoRGlmZkNvbmZpZy5LRVkpKTsKIAkJZm9sbG93RmlsdGVyLnNldFJlbmFtZUNhbGxiYWNrKGRpZmZDb2xsZWN0b3IpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2V2Fsa1BhdGhGaWx0ZXIxVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2V2Fsa1BhdGhGaWx0ZXIxVGVzdC5qYXZhCmluZGV4IDZlYzUyOWMuLmI1NWE0NWEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldldhbGtQYXRoRmlsdGVyMVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZXYWxrUGF0aEZpbHRlcjFUZXN0LmphdmEKQEAgLTU0LDcgKzU0LDcgQEAKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAogcHVibGljIGNsYXNzIFJldldhbGtQYXRoRmlsdGVyMVRlc3QgZXh0ZW5kcyBSZXZXYWxrVGVzdENhc2UgewotCXByb3RlY3RlZCB2b2lkIGZpbHRlcihmaW5hbCBTdHJpbmcgcGF0aCkgeworCXByb3RlY3RlZCB2b2lkIGZpbHRlcihTdHJpbmcgcGF0aCkgewogCQlydy5zZXRUcmVlRmlsdGVyKEFuZFRyZWVGaWx0ZXIuY3JlYXRlKFBhdGhGaWx0ZXJHcm91cAogCQkJCS5jcmVhdGVGcm9tU3RyaW5ncyhDb2xsZWN0aW9ucy5zaW5nbGV0b24ocGF0aCkpLAogCQkJCVRyZWVGaWx0ZXIuQU5ZX0RJRkYpKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldldhbGtQYXRoRmlsdGVyNjAxMlRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldldhbGtQYXRoRmlsdGVyNjAxMlRlc3QuamF2YQppbmRleCA2MzFlMzk1Li5jZWY1NTIxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZXYWxrUGF0aEZpbHRlcjYwMTJUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2V2Fsa1BhdGhGaWx0ZXI2MDEyVGVzdC5qYXZhCkBAIC0xMDIsMTcgKzEwMiwxNyBAQCBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewogCQl9CiAJfQogCi0JcHJvdGVjdGVkIHZvaWQgY2hlY2soZmluYWwgUmV2Q29tbWl0Li4uIG9yZGVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwcm90ZWN0ZWQgdm9pZCBjaGVjayhSZXZDb21taXQuLi4gb3JkZXIpIHRocm93cyBFeGNlcHRpb24gewogCQltYXJrU3RhcnQoaSk7CiAJCWZpbmFsIFN0cmluZ0J1aWxkZXIgYWN0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJZm9yIChmaW5hbCBSZXZDb21taXQgeiA6IHJ3KSB7CisJCWZvciAoUmV2Q29tbWl0IHogOiBydykgewogCQkJZmluYWwgU3RyaW5nIG5hbWUgPSBieU5hbWUuZ2V0KHopOwogCQkJYXNzZXJ0Tm90TnVsbChuYW1lKTsKIAkJCWFjdC5hcHBlbmQobmFtZSk7CiAJCQlhY3QuYXBwZW5kKCcgJyk7CiAJCX0KIAkJZmluYWwgU3RyaW5nQnVpbGRlciBleHAgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlmb3IgKGZpbmFsIFJldkNvbW1pdCB6IDogb3JkZXIpIHsKKwkJZm9yIChSZXZDb21taXQgeiA6IG9yZGVyKSB7CiAJCQlmaW5hbCBTdHJpbmcgbmFtZSA9IGJ5TmFtZS5nZXQoeik7CiAJCQlhc3NlcnROb3ROdWxsKG5hbWUpOwogCQkJZXhwLmFwcGVuZChuYW1lKTsKQEAgLTEyMSw3ICsxMjEsNyBAQCBwcm90ZWN0ZWQgdm9pZCBjaGVjayhmaW5hbCBSZXZDb21taXQuLi4gb3JkZXIpIHRocm93cyBFeGNlcHRpb24gewogCQlhc3NlcnRFcXVhbHMoZXhwLnRvU3RyaW5nKCksIGFjdC50b1N0cmluZygpKTsKIAl9CiAKLQlwcm90ZWN0ZWQgdm9pZCBmaWx0ZXIoZmluYWwgU3RyaW5nIHBhdGgpIHsKKwlwcm90ZWN0ZWQgdm9pZCBmaWx0ZXIoU3RyaW5nIHBhdGgpIHsKIAkJcncuc2V0VHJlZUZpbHRlcihBbmRUcmVlRmlsdGVyLmNyZWF0ZShQYXRoRmlsdGVyR3JvdXAKIAkJCQkuY3JlYXRlRnJvbVN0cmluZ3MoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHBhdGgpKSwKIAkJCQlUcmVlRmlsdGVyLkFOWV9ESUZGKSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZXYWxrVGVzdENhc2UuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldldhbGtUZXN0Q2FzZS5qYXZhCmluZGV4IGYxMmNjMDguLjU0NDM5ODIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldldhbGtUZXN0Q2FzZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldldhbGtUZXN0Q2FzZS5qYXZhCkBAIC03NCwzOCArNzQsMzggQEAgcHJvdGVjdGVkIERhdGUgZ2V0RGF0ZSgpIHsKIAkJcmV0dXJuIHV0aWwuZ2V0RGF0ZSgpOwogCX0KIAotCXByb3RlY3RlZCB2b2lkIHRpY2soZmluYWwgaW50IHNlY0RlbHRhKSB7CisJcHJvdGVjdGVkIHZvaWQgdGljayhpbnQgc2VjRGVsdGEpIHsKIAkJdXRpbC50aWNrKHNlY0RlbHRhKTsKIAl9CiAKLQlwcm90ZWN0ZWQgUmV2QmxvYiBibG9iKGZpbmFsIFN0cmluZyBjb250ZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwcm90ZWN0ZWQgUmV2QmxvYiBibG9iKFN0cmluZyBjb250ZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJcmV0dXJuIHV0aWwuYmxvYihjb250ZW50KTsKIAl9CiAKLQlwcm90ZWN0ZWQgRGlyQ2FjaGVFbnRyeSBmaWxlKGZpbmFsIFN0cmluZyBwYXRoLCBmaW5hbCBSZXZCbG9iIGJsb2IpCisJcHJvdGVjdGVkIERpckNhY2hlRW50cnkgZmlsZShTdHJpbmcgcGF0aCwgUmV2QmxvYiBibG9iKQogCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXJldHVybiB1dGlsLmZpbGUocGF0aCwgYmxvYik7CiAJfQogCi0JcHJvdGVjdGVkIFJldlRyZWUgdHJlZShmaW5hbCBEaXJDYWNoZUVudHJ5Li4uIGVudHJpZXMpIHRocm93cyBFeGNlcHRpb24geworCXByb3RlY3RlZCBSZXZUcmVlIHRyZWUoRGlyQ2FjaGVFbnRyeS4uLiBlbnRyaWVzKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJcmV0dXJuIHV0aWwudHJlZShlbnRyaWVzKTsKIAl9CiAKLQlwcm90ZWN0ZWQgUmV2T2JqZWN0IGdldChmaW5hbCBSZXZUcmVlIHRyZWUsIGZpbmFsIFN0cmluZyBwYXRoKQorCXByb3RlY3RlZCBSZXZPYmplY3QgZ2V0KFJldlRyZWUgdHJlZSwgU3RyaW5nIHBhdGgpCiAJCQl0aHJvd3MgRXhjZXB0aW9uIHsKIAkJcmV0dXJuIHV0aWwuZ2V0KHRyZWUsIHBhdGgpOwogCX0KIAotCXByb3RlY3RlZCBSZXZDb21taXQgY29tbWl0KGZpbmFsIFJldkNvbW1pdC4uLiBwYXJlbnRzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwcm90ZWN0ZWQgUmV2Q29tbWl0IGNvbW1pdChSZXZDb21taXQuLi4gcGFyZW50cykgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXJldHVybiB1dGlsLmNvbW1pdChwYXJlbnRzKTsKIAl9CiAKLQlwcm90ZWN0ZWQgUmV2Q29tbWl0IGNvbW1pdChmaW5hbCBSZXZUcmVlIHRyZWUsIGZpbmFsIFJldkNvbW1pdC4uLiBwYXJlbnRzKQorCXByb3RlY3RlZCBSZXZDb21taXQgY29tbWl0KFJldlRyZWUgdHJlZSwgUmV2Q29tbWl0Li4uIHBhcmVudHMpCiAJCQl0aHJvd3MgRXhjZXB0aW9uIHsKIAkJcmV0dXJuIHV0aWwuY29tbWl0KHRyZWUsIHBhcmVudHMpOwogCX0KIAotCXByb3RlY3RlZCBSZXZDb21taXQgY29tbWl0KGZpbmFsIGludCBzZWNEZWx0YSwgZmluYWwgUmV2Q29tbWl0Li4uIHBhcmVudHMpCisJcHJvdGVjdGVkIFJldkNvbW1pdCBjb21taXQoaW50IHNlY0RlbHRhLCBSZXZDb21taXQuLi4gcGFyZW50cykKIAkJCXRocm93cyBFeGNlcHRpb24gewogCQlyZXR1cm4gdXRpbC5jb21taXQoc2VjRGVsdGEsIHBhcmVudHMpOwogCX0KQEAgLTExNSw3ICsxMTUsNyBAQCBwcm90ZWN0ZWQgUmV2Q29tbWl0IGNvbW1pdChmaW5hbCBpbnQgc2VjRGVsdGEsIGZpbmFsIFJldlRyZWUgdHJlZSwKIAkJcmV0dXJuIHV0aWwuY29tbWl0KHNlY0RlbHRhLCB0cmVlLCBwYXJlbnRzKTsKIAl9CiAKLQlwcm90ZWN0ZWQgUmV2VGFnIHRhZyhmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgUmV2T2JqZWN0IGRzdCkKKwlwcm90ZWN0ZWQgUmV2VGFnIHRhZyhTdHJpbmcgbmFtZSwgUmV2T2JqZWN0IGRzdCkKIAkJCXRocm93cyBFeGNlcHRpb24gewogCQlyZXR1cm4gdXRpbC50YWcobmFtZSwgZHN0KTsKIAl9CkBAIC0xMjUsMTkgKzEyNSwxOSBAQCBwcm90ZWN0ZWQgQ29tbWl0QnVpbGRlciBjb21taXRCdWlsZGVyKCkKIAkJcmV0dXJuIHV0aWwuY29tbWl0KCk7CiAJfQogCi0JcHJvdGVjdGVkIDxUIGV4dGVuZHMgUmV2T2JqZWN0PiBUIHBhcnNlQm9keShmaW5hbCBUIHQpIHRocm93cyBFeGNlcHRpb24geworCXByb3RlY3RlZCA8VCBleHRlbmRzIFJldk9iamVjdD4gVCBwYXJzZUJvZHkoVCB0KSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJcmV0dXJuIHV0aWwucGFyc2VCb2R5KHQpOwogCX0KIAotCXByb3RlY3RlZCB2b2lkIG1hcmtTdGFydChmaW5hbCBSZXZDb21taXQgY29tbWl0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwcm90ZWN0ZWQgdm9pZCBtYXJrU3RhcnQoUmV2Q29tbWl0IGNvbW1pdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXJ3Lm1hcmtTdGFydChjb21taXQpOwogCX0KIAotCXByb3RlY3RlZCB2b2lkIG1hcmtVbmludGVyZXN0aW5nKGZpbmFsIFJldkNvbW1pdCBjb21taXQpIHRocm93cyBFeGNlcHRpb24geworCXByb3RlY3RlZCB2b2lkIG1hcmtVbmludGVyZXN0aW5nKFJldkNvbW1pdCBjb21taXQpIHRocm93cyBFeGNlcHRpb24gewogCQlydy5tYXJrVW5pbnRlcmVzdGluZyhjb21taXQpOwogCX0KIAotCXByb3RlY3RlZCB2b2lkIGFzc2VydENvbW1pdChmaW5hbCBSZXZDb21taXQgZXhwLCBmaW5hbCBSZXZDb21taXQgYWN0KSB7CisJcHJvdGVjdGVkIHZvaWQgYXNzZXJ0Q29tbWl0KFJldkNvbW1pdCBleHAsIFJldkNvbW1pdCBhY3QpIHsKIAkJYXNzZXJ0U2FtZShleHAsIGFjdCk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2V2Fsa1V0aWxzUmVhY2hhYmxlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2V2Fsa1V0aWxzUmVhY2hhYmxlVGVzdC5qYXZhCmluZGV4IDEwYmVhMGEuLmEyNmFlMTAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldldhbGtVdGlsc1JlYWNoYWJsZVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZXYWxrVXRpbHNSZWFjaGFibGVUZXN0LmphdmEKQEAgLTEwOSw3ICsxMDksNyBAQCBwdWJsaWMgdm9pZCB3aXRoQ29tbWl0TG9hZGVkQnlEaWZmZXJlbnRSZXZXYWxrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCX0KIAl9CiAKLQlwcml2YXRlIFJlZiBicmFuY2goZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIFJldkNvbW1pdCBkc3QpIHRocm93cyBFeGNlcHRpb24geworCXByaXZhdGUgUmVmIGJyYW5jaChTdHJpbmcgbmFtZSwgUmV2Q29tbWl0IGRzdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXJldHVybiBHaXQud3JhcChkYikuYnJhbmNoQ3JlYXRlKCkuc2V0TmFtZShuYW1lKQogCQkJCS5zZXRTdGFydFBvaW50KGRzdC5uYW1lKCkpLmNhbGwoKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvc3RvcmFnZS9maWxlL0ZpbGVCYXNlZENvbmZpZ1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9zdG9yYWdlL2ZpbGUvRmlsZUJhc2VkQ29uZmlnVGVzdC5qYXZhCmluZGV4IDdmMGQ2MDIuLjBkZWE1Y2UgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9zdG9yYWdlL2ZpbGUvRmlsZUJhc2VkQ29uZmlnVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9zdG9yYWdlL2ZpbGUvRmlsZUJhc2VkQ29uZmlnVGVzdC5qYXZhCkBAIC00Miw3ICs0Miw3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmZpbGU7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC51dGlsLkZpbGVVdGlscy5wYXRoVG9TdHJpbmc7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0QXJyYXlFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwpAQCAtMTA1LDcgKzEwNSw3IEBAIHB1YmxpYyB2b2lkIHRlc3RTeXN0ZW1FbmNvZGluZygpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29uZmlnSW52YWxpZEV4Y2VwdGlvbiB7CiAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RVVEY4d2l0aG91dEJPTSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29uZmlnSW52YWxpZEV4Y2VwdGlvbiB7Ci0JCWZpbmFsIEZpbGUgZmlsZSA9IGNyZWF0ZUZpbGUoQ09OVEVOVDEuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJZmluYWwgRmlsZSBmaWxlID0gY3JlYXRlRmlsZShDT05URU5UMS5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCWZpbmFsIEZpbGVCYXNlZENvbmZpZyBjb25maWcgPSBuZXcgRmlsZUJhc2VkQ29uZmlnKGZpbGUsIEZTLkRFVEVDVEVEKTsKIAkJY29uZmlnLmxvYWQoKTsKIAkJYXNzZXJ0RXF1YWxzKEFMSUNFLCBjb25maWcuZ2V0U3RyaW5nKFVTRVIsIG51bGwsIE5BTUUpKTsKQEAgLTEyMSw3ICsxMjEsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0VVRGOHdpdGhCT00oKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvbmZpZ0ludmFsaWRFeGNlcHRpb24gewogCQlib3MxLndyaXRlKDB4RUYpOwogCQlib3MxLndyaXRlKDB4QkIpOwogCQlib3MxLndyaXRlKDB4QkYpOwotCQlib3MxLndyaXRlKENPTlRFTlQxLmdldEJ5dGVzKFVURl84KSk7CisJCWJvczEud3JpdGUoQ09OVEVOVDEuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCiAJCWZpbmFsIEZpbGUgZmlsZSA9IGNyZWF0ZUZpbGUoYm9zMS50b0J5dGVBcnJheSgpKTsKIAkJZmluYWwgRmlsZUJhc2VkQ29uZmlnIGNvbmZpZyA9IG5ldyBGaWxlQmFzZWRDb25maWcoZmlsZSwgRlMuREVURUNURUQpOwpAQCAtMTM1LDcgKzEzNSw3IEBAIHB1YmxpYyB2b2lkIHRlc3RVVEY4d2l0aEJPTSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29uZmlnSW52YWxpZEV4Y2VwdGlvbiB7CiAJCWJvczIud3JpdGUoMHhFRik7CiAJCWJvczIud3JpdGUoMHhCQik7CiAJCWJvczIud3JpdGUoMHhCRik7Ci0JCWJvczIud3JpdGUoQ09OVEVOVDIuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJYm9zMi53cml0ZShDT05URU5UMi5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCWFzc2VydEFycmF5RXF1YWxzKGJvczIudG9CeXRlQXJyYXkoKSwgSU8ucmVhZEZ1bGx5KGZpbGUpKTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9zdWJtb2R1bGUvU3VibW9kdWxlQWRkVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3N1Ym1vZHVsZS9TdWJtb2R1bGVBZGRUZXN0LmphdmEKaW5kZXggOTNmNDcwOS4uNTc4MDk3MyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3N1Ym1vZHVsZS9TdWJtb2R1bGVBZGRUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3N1Ym1vZHVsZS9TdWJtb2R1bGVBZGRUZXN0LmphdmEKQEAgLTEyOSwxMCArMTI5LDExIEBAIHB1YmxpYyB2b2lkIGFkZFN1Ym1vZHVsZSgpIHRocm93cyBFeGNlcHRpb24gewogCQkJY29tbWFuZC5zZXRQYXRoKHBhdGgpOwogCQkJU3RyaW5nIHVyaSA9IGRiLmdldERpcmVjdG9yeSgpLnRvVVJJKCkudG9TdHJpbmcoKTsKIAkJCWNvbW1hbmQuc2V0VVJJKHVyaSk7Ci0JCQlSZXBvc2l0b3J5IHJlcG8gPSBjb21tYW5kLmNhbGwoKTsKLQkJCWFzc2VydE5vdE51bGwocmVwbyk7Ci0JCQlPYmplY3RJZCBzdWJDb21taXQgPSByZXBvLnJlc29sdmUoQ29uc3RhbnRzLkhFQUQpOwotCQkJcmVwby5jbG9zZSgpOworCQkJT2JqZWN0SWQgc3ViQ29tbWl0OworCQkJdHJ5IChSZXBvc2l0b3J5IHJlcG8gPSBjb21tYW5kLmNhbGwoKSkgeworCQkJCWFzc2VydE5vdE51bGwocmVwbyk7CisJCQkJc3ViQ29tbWl0ID0gcmVwby5yZXNvbHZlKENvbnN0YW50cy5IRUFEKTsKKwkJCX0KIAogCQkJU3VibW9kdWxlV2FsayBnZW5lcmF0b3IgPSBTdWJtb2R1bGVXYWxrLmZvckluZGV4KGRiKTsKIAkJCWFzc2VydFRydWUoZ2VuZXJhdG9yLm5leHQoKSk7CkBAIC0xNDEsMTAgKzE0MiwxMCBAQCBwdWJsaWMgdm9pZCBhZGRTdWJtb2R1bGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCWFzc2VydEVxdWFscyh1cmksIGdlbmVyYXRvci5nZXRNb2R1bGVzVXJsKCkpOwogCQkJYXNzZXJ0RXF1YWxzKHBhdGgsIGdlbmVyYXRvci5nZXRNb2R1bGVzUGF0aCgpKTsKIAkJCWFzc2VydEVxdWFscyh1cmksIGdlbmVyYXRvci5nZXRDb25maWdVcmwoKSk7Ci0JCQlSZXBvc2l0b3J5IHN1Yk1vZFJlcG8gPSBnZW5lcmF0b3IuZ2V0UmVwb3NpdG9yeSgpOwotCQkJYXNzZXJ0Tm90TnVsbChzdWJNb2RSZXBvKTsKLQkJCWFzc2VydEVxdWFscyhzdWJDb21taXQsIGNvbW1pdCk7Ci0JCQlzdWJNb2RSZXBvLmNsb3NlKCk7CisJCQl0cnkgKFJlcG9zaXRvcnkgc3ViTW9kUmVwbyA9IGdlbmVyYXRvci5nZXRSZXBvc2l0b3J5KCkpIHsKKwkJCQlhc3NlcnROb3ROdWxsKHN1Yk1vZFJlcG8pOworCQkJCWFzc2VydEVxdWFscyhzdWJDb21taXQsIGNvbW1pdCk7CisJCQl9CiAKIAkJCVN0YXR1cyBzdGF0dXMgPSBHaXQud3JhcChkYikuc3RhdHVzKCkuY2FsbCgpOwogCQkJYXNzZXJ0VHJ1ZShzdGF0dXMuZ2V0QWRkZWQoKS5jb250YWlucyhDb25zdGFudHMuRE9UX0dJVF9NT0RVTEVTKSk7CkBAIC0yNDAsMTYgKzI0MSwxNCBAQCBwdWJsaWMgdm9pZCBhZGRTdWJtb2R1bGVXaXRoUmVsYXRpdmVVcmkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCQlmdWxsVXJpID0gZnVsbFVyaS5yZXBsYWNlKCdcXCcsICcvJyk7CiAJCQl9CiAJCQlhc3NlcnRFcXVhbHMoZnVsbFVyaSwgZ2VuZXJhdG9yLmdldENvbmZpZ1VybCgpKTsKLQkJCVJlcG9zaXRvcnkgc3ViTW9kUmVwbyA9IGdlbmVyYXRvci5nZXRSZXBvc2l0b3J5KCk7Ci0JCQlhc3NlcnROb3ROdWxsKHN1Yk1vZFJlcG8pOwotCQkJYXNzZXJ0RXF1YWxzKAotCQkJCQlmdWxsVXJpLAotCQkJCQlzdWJNb2RSZXBvCi0JCQkJCQkJLmdldENvbmZpZygpCi0JCQkJCQkJLmdldFN0cmluZyhDb25maWdDb25zdGFudHMuQ09ORklHX1JFTU9URV9TRUNUSU9OLAotCQkJCQkJCQkJQ29uc3RhbnRzLkRFRkFVTFRfUkVNT1RFX05BTUUsCi0JCQkJCQkJCQlDb25maWdDb25zdGFudHMuQ09ORklHX0tFWV9VUkwpKTsKLQkJCXN1Yk1vZFJlcG8uY2xvc2UoKTsKKwkJCXRyeSAoUmVwb3NpdG9yeSBzdWJNb2RSZXBvID0gZ2VuZXJhdG9yLmdldFJlcG9zaXRvcnkoKSkgeworCQkJCWFzc2VydE5vdE51bGwoc3ViTW9kUmVwbyk7CisJCQkJYXNzZXJ0RXF1YWxzKGZ1bGxVcmksCisJCQkJCQlzdWJNb2RSZXBvLmdldENvbmZpZygpLmdldFN0cmluZygKKwkJCQkJCQkJQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19SRU1PVEVfU0VDVElPTiwKKwkJCQkJCQkJQ29uc3RhbnRzLkRFRkFVTFRfUkVNT1RFX05BTUUsCisJCQkJCQkJCUNvbmZpZ0NvbnN0YW50cy5DT05GSUdfS0VZX1VSTCkpOworCQkJfQogCQkJYXNzZXJ0RXF1YWxzKGNvbW1pdCwgcmVwby5yZXNvbHZlKENvbnN0YW50cy5IRUFEKSk7CiAKIAkJCVN0YXR1cyBzdGF0dXMgPSBHaXQud3JhcChkYikuc3RhdHVzKCkuY2FsbCgpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3N1Ym1vZHVsZS9TdWJtb2R1bGVTeW5jVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3N1Ym1vZHVsZS9TdWJtb2R1bGVTeW5jVGVzdC5qYXZhCmluZGV4IDEzZGI0NGEuLjZmM2I1MmYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9zdWJtb2R1bGUvU3VibW9kdWxlU3luY1Rlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvc3VibW9kdWxlL1N1Ym1vZHVsZVN5bmNUZXN0LmphdmEKQEAgLTEzNSwxMiArMTM1LDE0IEBAIHB1YmxpYyB2b2lkIGFwcGx5KERpckNhY2hlRW50cnkgZW50KSB7CiAJCWdlbmVyYXRvciA9IFN1Ym1vZHVsZVdhbGsuZm9ySW5kZXgoZGIpOwogCQlhc3NlcnRUcnVlKGdlbmVyYXRvci5uZXh0KCkpOwogCQlhc3NlcnRFcXVhbHModXJsLCBnZW5lcmF0b3IuZ2V0Q29uZmlnVXJsKCkpOwotCQlSZXBvc2l0b3J5IHN1Yk1vZFJlcG9zaXRvcnkgPSBnZW5lcmF0b3IuZ2V0UmVwb3NpdG9yeSgpOwotCQlTdG9yZWRDb25maWcgc3VibW9kdWxlQ29uZmlnID0gc3ViTW9kUmVwb3NpdG9yeS5nZXRDb25maWcoKTsKLQkJc3ViTW9kUmVwb3NpdG9yeS5jbG9zZSgpOwotCQlhc3NlcnRFcXVhbHModXJsLCBzdWJtb2R1bGVDb25maWcuZ2V0U3RyaW5nKAotCQkJCUNvbmZpZ0NvbnN0YW50cy5DT05GSUdfUkVNT1RFX1NFQ1RJT04sCi0JCQkJQ29uc3RhbnRzLkRFRkFVTFRfUkVNT1RFX05BTUUsIENvbmZpZ0NvbnN0YW50cy5DT05GSUdfS0VZX1VSTCkpOworCQl0cnkgKFJlcG9zaXRvcnkgc3ViTW9kUmVwb3NpdG9yeSA9IGdlbmVyYXRvci5nZXRSZXBvc2l0b3J5KCkpIHsKKwkJCVN0b3JlZENvbmZpZyBzdWJtb2R1bGVDb25maWcgPSBzdWJNb2RSZXBvc2l0b3J5LmdldENvbmZpZygpOworCQkJYXNzZXJ0RXF1YWxzKHVybCwKKwkJCQkJc3VibW9kdWxlQ29uZmlnLmdldFN0cmluZygKKwkJCQkJCQlDb25maWdDb25zdGFudHMuQ09ORklHX1JFTU9URV9TRUNUSU9OLAorCQkJCQkJCUNvbnN0YW50cy5ERUZBVUxUX1JFTU9URV9OQU1FLAorCQkJCQkJCUNvbmZpZ0NvbnN0YW50cy5DT05GSUdfS0VZX1VSTCkpOworCQl9CiAJfQogCiAJQFRlc3QKQEAgLTIwOCwxMSArMjEwLDEzIEBAIHB1YmxpYyB2b2lkIGFwcGx5KERpckNhY2hlRW50cnkgZW50KSB7CiAJCWdlbmVyYXRvciA9IFN1Ym1vZHVsZVdhbGsuZm9ySW5kZXgoZGIpOwogCQlhc3NlcnRUcnVlKGdlbmVyYXRvci5uZXh0KCkpOwogCQlhc3NlcnRFcXVhbHMoImdpdDovL3NlcnZlci9zdWIuZ2l0IiwgZ2VuZXJhdG9yLmdldENvbmZpZ1VybCgpKTsKLQkJUmVwb3NpdG9yeSBzdWJNb2RSZXBvc2l0b3J5MSA9IGdlbmVyYXRvci5nZXRSZXBvc2l0b3J5KCk7Ci0JCVN0b3JlZENvbmZpZyBzdWJtb2R1bGVDb25maWcgPSBzdWJNb2RSZXBvc2l0b3J5MS5nZXRDb25maWcoKTsKLQkJc3ViTW9kUmVwb3NpdG9yeTEuY2xvc2UoKTsKLQkJYXNzZXJ0RXF1YWxzKCJnaXQ6Ly9zZXJ2ZXIvc3ViLmdpdCIsIHN1Ym1vZHVsZUNvbmZpZy5nZXRTdHJpbmcoCi0JCQkJQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19SRU1PVEVfU0VDVElPTiwKLQkJCQlDb25zdGFudHMuREVGQVVMVF9SRU1PVEVfTkFNRSwgQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfVVJMKSk7CisJCXRyeSAoUmVwb3NpdG9yeSBzdWJNb2RSZXBvc2l0b3J5MSA9IGdlbmVyYXRvci5nZXRSZXBvc2l0b3J5KCkpIHsKKwkJCVN0b3JlZENvbmZpZyBzdWJtb2R1bGVDb25maWcgPSBzdWJNb2RSZXBvc2l0b3J5MS5nZXRDb25maWcoKTsKKwkJCWFzc2VydEVxdWFscygiZ2l0Oi8vc2VydmVyL3N1Yi5naXQiLAorCQkJCQlzdWJtb2R1bGVDb25maWcuZ2V0U3RyaW5nKAorCQkJCQkJCUNvbmZpZ0NvbnN0YW50cy5DT05GSUdfUkVNT1RFX1NFQ1RJT04sCisJCQkJCQkJQ29uc3RhbnRzLkRFRkFVTFRfUkVNT1RFX05BTUUsCisJCQkJCQkJQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfVVJMKSk7CisJCX0KIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvc3VibW9kdWxlL1N1Ym1vZHVsZVVwZGF0ZVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9zdWJtb2R1bGUvU3VibW9kdWxlVXBkYXRlVGVzdC5qYXZhCmluZGV4IDcwNjRmNjAuLmJiY2U0MTMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9zdWJtb2R1bGUvU3VibW9kdWxlVXBkYXRlVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9zdWJtb2R1bGUvU3VibW9kdWxlVXBkYXRlVGVzdC5qYXZhCkBAIC0xMjEsMTAgKzEyMSwxMCBAQCBwdWJsaWMgdm9pZCBhcHBseShEaXJDYWNoZUVudHJ5IGVudCkgewogCiAJCVN1Ym1vZHVsZVdhbGsgZ2VuZXJhdG9yID0gU3VibW9kdWxlV2Fsay5mb3JJbmRleChkYik7CiAJCWFzc2VydFRydWUoZ2VuZXJhdG9yLm5leHQoKSk7Ci0JCVJlcG9zaXRvcnkgc3ViUmVwbyA9IGdlbmVyYXRvci5nZXRSZXBvc2l0b3J5KCk7Ci0JCWFzc2VydE5vdE51bGwoc3ViUmVwbyk7Ci0JCWFzc2VydEVxdWFscyhjb21taXQsIHN1YlJlcG8ucmVzb2x2ZShDb25zdGFudHMuSEVBRCkpOwotCQlzdWJSZXBvLmNsb3NlKCk7CisJCXRyeSAoUmVwb3NpdG9yeSBzdWJSZXBvID0gZ2VuZXJhdG9yLmdldFJlcG9zaXRvcnkoKSkgeworCQkJYXNzZXJ0Tm90TnVsbChzdWJSZXBvKTsKKwkJCWFzc2VydEVxdWFscyhjb21taXQsIHN1YlJlcG8ucmVzb2x2ZShDb25zdGFudHMuSEVBRCkpOworCQl9CiAJfQogCiAJQFRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvQnVuZGxlV3JpdGVyVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CdW5kbGVXcml0ZXJUZXN0LmphdmEKaW5kZXggNjU4Yjk3MS4uZDMwYWM4NCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CdW5kbGVXcml0ZXJUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CdW5kbGVXcml0ZXJUZXN0LmphdmEKQEAgLTQ1LDcgKzQ1LDcgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuT0JKX0JMT0I7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CkBAIC0xOTksNyArMTk5LDcgQEAgcHVibGljIHZvaWQgdGVzdEN1c3RvbU9iamVjdFJlYWRlcigpIHRocm93cyBFeGNlcHRpb24gewogCQkJUmVmIHJlZiA9IHJlcG8uZXhhY3RSZWYocmVmTmFtZSk7CiAJCQlhc3NlcnROb3ROdWxsKHJlZik7CiAJCQlhc3NlcnRFcXVhbHMoaWQsIHJlZi5nZXRPYmplY3RJZCgpKTsKLQkJCWFzc2VydEVxdWFscyhkYXRhLCBuZXcgU3RyaW5nKHJlcG8ub3BlbihpZCwgT0JKX0JMT0IpLmdldEJ5dGVzKCksIFVURl84KSk7CisJCQlhc3NlcnRFcXVhbHMoZGF0YSwgbmV3IFN0cmluZyhyZXBvLm9wZW4oaWQsIE9CSl9CTE9CKS5nZXRCeXRlcygpLCBDSEFSU0VUKSk7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvTmV0UkNUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L05ldFJDVGVzdC5qYXZhCmluZGV4IDJmZWE4YTkuLjRlNWQ1NmEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvTmV0UkNUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9OZXRSQ1Rlc3QuamF2YQpAQCAtNDIsNiArNDIsNyBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0OwogCitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOwogCkBAIC03MywxMSArNzQsMTEgQEAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY29uZmlnRmlsZSA9IG5ldyBGaWxlKGhvbWUsICIubmV0cmMiKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgY29uZmlnKGZpbmFsIFN0cmluZyBkYXRhKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmaW5hbCBPdXRwdXRTdHJlYW1Xcml0ZXIgZncgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKAotCQkJCW5ldyBGaWxlT3V0cHV0U3RyZWFtKGNvbmZpZ0ZpbGUpLCAiVVRGLTgiKTsKLQkJZncud3JpdGUoZGF0YSk7Ci0JCWZ3LmNsb3NlKCk7CisJcHJpdmF0ZSB2b2lkIGNvbmZpZyhTdHJpbmcgZGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJdHJ5IChPdXRwdXRTdHJlYW1Xcml0ZXIgZncgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKAorCQkJCW5ldyBGaWxlT3V0cHV0U3RyZWFtKGNvbmZpZ0ZpbGUpLCBDSEFSU0VUKSkgeworCQkJZncud3JpdGUoZGF0YSk7CisJCX0KIAl9CiAKIAlAVGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9PcGVuU3NoQ29uZmlnVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9PcGVuU3NoQ29uZmlnVGVzdC5qYXZhCmluZGV4IGQ2MDQ3NTEuLmFiZjgwZWMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvT3BlblNzaENvbmZpZ1Rlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L09wZW5Tc2hDb25maWdUZXN0LmphdmEKQEAgLTQzLDYgKzQzLDcgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDsKIAoraW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRBcnJheUVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CkBAIC04OSwxMSArOTAsMTEgQEAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJb3NjID0gbmV3IE9wZW5Tc2hDb25maWcoaG9tZSwgY29uZmlnRmlsZSk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGNvbmZpZyhmaW5hbCBTdHJpbmcgZGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwcml2YXRlIHZvaWQgY29uZmlnKFN0cmluZyBkYXRhKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlsb25nIGxhc3RNdGltZSA9IGNvbmZpZ0ZpbGUubGFzdE1vZGlmaWVkKCk7CiAJCWRvIHsKIAkJCXRyeSAoZmluYWwgT3V0cHV0U3RyZWFtV3JpdGVyIGZ3ID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcigKLQkJCQkJbmV3IEZpbGVPdXRwdXRTdHJlYW0oY29uZmlnRmlsZSksICJVVEYtOCIpKSB7CisJCQkJCW5ldyBGaWxlT3V0cHV0U3RyZWFtKGNvbmZpZ0ZpbGUpLCBDSEFSU0VUKSkgewogCQkJCWZ3LndyaXRlKGRhdGEpOwogCQkJfQogCQl9IHdoaWxlIChsYXN0TXRpbWUgPT0gY29uZmlnRmlsZS5sYXN0TW9kaWZpZWQoKSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1BhY2tQYXJzZXJUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1BhY2tQYXJzZXJUZXN0LmphdmEKaW5kZXggNWQ5YmRiZC4uYjZkMDYxMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QYWNrUGFyc2VyVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUGFja1BhcnNlclRlc3QuamF2YQpAQCAtOTMsOCArOTMsNyBAQCBwdWJsaWMgY2xhc3MgUGFja1BhcnNlclRlc3QgZXh0ZW5kcyBSZXBvc2l0b3J5VGVzdENhc2UgewogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdDEoKSB0aHJvd3MgIElPRXhjZXB0aW9uIHsKIAkJRmlsZSBwYWNrRmlsZSA9IEpHaXRUZXN0VXRpbC5nZXRUZXN0UmVzb3VyY2VGaWxlKCJwYWNrLTM0YmU5MDMyYWMyODJiMTFmYTliYWJkYzJiMmE5M2NhOTk2YzljMmYucGFjayIpOwotCQlmaW5hbCBJbnB1dFN0cmVhbSBpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ocGFja0ZpbGUpOwotCQl0cnkgeworCQl0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShwYWNrRmlsZSkpIHsKIAkJCU9iamVjdERpcmVjdG9yeVBhY2tQYXJzZXIgcCA9IChPYmplY3REaXJlY3RvcnlQYWNrUGFyc2VyKSBpbmRleChpcyk7CiAJCQlwLnBhcnNlKE51bGxQcm9ncmVzc01vbml0b3IuSU5TVEFOQ0UpOwogCQkJUGFja0ZpbGUgZmlsZSA9IHAuZ2V0UGFja0ZpbGUoKTsKQEAgLTEwNyw4ICsxMDYsNiBAQCBwdWJsaWMgdm9pZCB0ZXN0MSgpIHRocm93cyAgSU9FeGNlcHRpb24gewogCQkJYXNzZXJ0VHJ1ZShmaWxlLmhhc09iamVjdChPYmplY3RJZC5mcm9tU3RyaW5nKCI5MDJkNTQ3NmZhMjQ5YjdhYmM5ZDg0YzYxMTU3N2E4MTM4MWYwMzI3IikpKTsKIAkJCWFzc2VydFRydWUoZmlsZS5oYXNPYmplY3QoT2JqZWN0SWQuZnJvbVN0cmluZygiYWFiZjJmZmFlYzliNDk3ZjA5NTAzNTJiM2U1ODJkNzMwMzVjMjAzNSIpKSk7CiAJCQlhc3NlcnRUcnVlKGZpbGUuaGFzT2JqZWN0KE9iamVjdElkLmZyb21TdHJpbmcoImM1OTc1OWYxNDNmYjFmZTIxYzE5Nzk4MWRmNzVhN2VlMDAyOTA3OTkiKSkpOwotCQl9IGZpbmFsbHkgewotCQkJaXMuY2xvc2UoKTsKIAkJfQogCX0KIApAQCAtMTIxLDggKzExOCw3IEBAIHB1YmxpYyB2b2lkIHRlc3QxKCkgdGhyb3dzICBJT0V4Y2VwdGlvbiB7CiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0MigpIHRocm93cyAgSU9FeGNlcHRpb24gewogCQlGaWxlIHBhY2tGaWxlID0gSkdpdFRlc3RVdGlsLmdldFRlc3RSZXNvdXJjZUZpbGUoInBhY2stZGYyOTgyZjI4NGJiYWJiNmJkYjU5ZWUzZmNjNmViMDk4M2UyMDM3MS5wYWNrIik7Ci0JCWZpbmFsIElucHV0U3RyZWFtIGlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShwYWNrRmlsZSk7Ci0JCXRyeSB7CisJCXRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHBhY2tGaWxlKSkgewogCQkJT2JqZWN0RGlyZWN0b3J5UGFja1BhcnNlciBwID0gKE9iamVjdERpcmVjdG9yeVBhY2tQYXJzZXIpIGluZGV4KGlzKTsKIAkJCXAucGFyc2UoTnVsbFByb2dyZXNzTW9uaXRvci5JTlNUQU5DRSk7CiAJCQlQYWNrRmlsZSBmaWxlID0gcC5nZXRQYWNrRmlsZSgpOwpAQCAtMTQwLDggKzEzNiw2IEBAIHB1YmxpYyB2b2lkIHRlc3QyKCkgdGhyb3dzICBJT0V4Y2VwdGlvbiB7CiAJCQlhc3NlcnRUcnVlKGZpbGUuaGFzT2JqZWN0KE9iamVjdElkLmZyb21TdHJpbmcoIjIwYThhZGU3NzYzOTQ5MWVhMGJkNjY3YmY5NWRlOGFiZjNhNDM0YzgiKSkpOwogCQkJYXNzZXJ0VHJ1ZShmaWxlLmhhc09iamVjdChPYmplY3RJZC5mcm9tU3RyaW5nKCIyNjc1MTg4ZmQ4Njk3OGQ1YmM0ZDcyMTE2OThiMjExOGFlM2JmNjU4IikpKTsKIAkJCS8vIGFuZCBsb3RzIG1vcmUuLi4KLQkJfSBmaW5hbGx5IHsKLQkJCWlzLmNsb3NlKCk7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUGFja2V0TGluZUluVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QYWNrZXRMaW5lSW5UZXN0LmphdmEKaW5kZXggMTNmYzY4ZC4uOGIxZDg2MCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QYWNrZXRMaW5lSW5UZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QYWNrZXRMaW5lSW5UZXN0LmphdmEKQEAgLTExNiwxNyArMTE2LDYgQEAgcHVibGljIHZvaWQgdGVzdFJlYWRTdHJpbmdfTGVuSEVMTygpIHsKIAl9CiAKIAlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RSZWFkU3RyaW5nX0xlbjAwMDEoKSB7Ci0JCWluaXQoIjAwMDEiKTsKLQkJdHJ5IHsKLQkJCWluLnJlYWRTdHJpbmcoKTsKLQkJCWZhaWwoImluY29ycmVjdGx5IGFjY2VwdGVkIGludmFsaWQgcGFja2V0IGhlYWRlciIpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIkludmFsaWQgcGFja2V0IGxpbmUgaGVhZGVyOiAwMDAxIiwgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQotCi0JQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0UmVhZFN0cmluZ19MZW4wMDAyKCkgewogCQlpbml0KCIwMDAyIik7CiAJCXRyeSB7CkBAIC0xNjQsNiArMTUzLDEzIEBAIHB1YmxpYyB2b2lkIHRlc3RSZWFkU3RyaW5nX0VuZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWFzc2VydEVPRigpOwogCX0KIAorCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFJlYWRTdHJpbmdfRGVsaW0oKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlpbml0KCIwMDAxIik7CisJCWFzc2VydFNhbWUoUGFja2V0TGluZUluLkRFTElNLCBpbi5yZWFkU3RyaW5nKCkpOworCQlhc3NlcnRFT0YoKTsKKwl9CisKIAkvLyByZWFkU3RyaW5nTm9MRgogCiAJQFRlc3QKQEAgLTMzMCw3ICszMjYsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0UmVhZEFDS19FUlIoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCiAJLy8gdGVzdCBzdXBwb3J0CiAKLQlwcml2YXRlIHZvaWQgaW5pdChmaW5hbCBTdHJpbmcgbXNnKSB7CisJcHJpdmF0ZSB2b2lkIGluaXQoU3RyaW5nIG1zZykgewogCQlyYXdJbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShDb25zdGFudHMuZW5jb2RlQVNDSUkobXNnKSk7CiAJCWluID0gbmV3IFBhY2tldExpbmVJbihyYXdJbik7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QYWNrZXRMaW5lT3V0VGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QYWNrZXRMaW5lT3V0VGVzdC5qYXZhCmluZGV4IGVjYTU0NzUuLjM5MWE3MDEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUGFja2V0TGluZU91dFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1BhY2tldExpbmVPdXRUZXN0LmphdmEKQEAgLTExMyw2ICsxMTMsMTIgQEAgcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlhc3NlcnRFcXVhbHMoMSwgZmx1c2hDbnRbMF0pOwogCX0KIAorCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFdyaXRlRGVsaW0oKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlvdXQud3JpdGVEZWxpbSgpOworCQlhc3NlcnRCdWZmZXIoIjAwMDEiKTsKKwl9CisKIAkvLyB3cml0ZVBhY2tldAogCiAJQFRlc3QKQEAgLTE2Nyw3ICsxNzMsNyBAQCBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWFzc2VydEVxdWFscygxLCBmbHVzaENudFswXSk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGFzc2VydEJ1ZmZlcihmaW5hbCBTdHJpbmcgZXhwKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByaXZhdGUgdm9pZCBhc3NlcnRCdWZmZXIoU3RyaW5nIGV4cCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJYXNzZXJ0RXF1YWxzKGV4cCwgbmV3IFN0cmluZyhyYXdPdXQudG9CeXRlQXJyYXkoKSwKIAkJCQlDb25zdGFudHMuQ0hBUkFDVEVSX0VOQ09ESU5HKSk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QdXNoQ29ubmVjdGlvblRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUHVzaENvbm5lY3Rpb25UZXN0LmphdmEKaW5kZXggYzE2YzFiMi4uNjM0NzhmNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QdXNoQ29ubmVjdGlvblRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1B1c2hDb25uZWN0aW9uVGVzdC5qYXZhCkBAIC01MSwxMiArNTEsMTYgQEAKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuVHJhbnNwb3J0RXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5kZnMuRGZzUmVwb3NpdG9yeURlc2NyaXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5kZnMuSW5NZW1vcnlSZXBvc2l0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuVGVzdFJlcG9zaXRvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk51bGxQcm9ncmVzc01vbml0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWQ7CkBAIC03Niw2ICs4MCw3IEBAIHB1YmxpYyBjbGFzcyBQdXNoQ29ubmVjdGlvblRlc3QgewogCXByaXZhdGUgT2JqZWN0IGN0eCA9IG5ldyBPYmplY3QoKTsKIAlwcml2YXRlIEluTWVtb3J5UmVwb3NpdG9yeSBzZXJ2ZXI7CiAJcHJpdmF0ZSBJbk1lbW9yeVJlcG9zaXRvcnkgY2xpZW50OworCXByaXZhdGUgTGlzdDxTdHJpbmc+IHByb2Nlc3NlZFJlZnM7CiAJcHJpdmF0ZSBPYmplY3RJZCBvYmoxOwogCXByaXZhdGUgT2JqZWN0SWQgb2JqMjsKIAlwcml2YXRlIE9iamVjdElkIG9iajM7CkBAIC04NSw2ICs5MCw3IEBAIHB1YmxpYyBjbGFzcyBQdXNoQ29ubmVjdGlvblRlc3QgewogCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXNlcnZlciA9IG5ld1JlcG8oInNlcnZlciIpOwogCQljbGllbnQgPSBuZXdSZXBvKCJjbGllbnQiKTsKKwkJcHJvY2Vzc2VkUmVmcyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCQl0ZXN0UHJvdG9jb2wgPSBuZXcgVGVzdFByb3RvY29sPD4oCiAJCQkJbnVsbCwKIAkJCQluZXcgUmVjZWl2ZVBhY2tGYWN0b3J5PE9iamVjdD4oKSB7CkBAIC05Miw3ICs5OCwxOCBAQCBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewogCQkJCQlwdWJsaWMgUmVjZWl2ZVBhY2sgY3JlYXRlKE9iamVjdCByZXEsIFJlcG9zaXRvcnkgZGIpCiAJCQkJCQkJdGhyb3dzIFNlcnZpY2VOb3RFbmFibGVkRXhjZXB0aW9uLAogCQkJCQkJCVNlcnZpY2VOb3RBdXRob3JpemVkRXhjZXB0aW9uIHsKLQkJCQkJCXJldHVybiBuZXcgUmVjZWl2ZVBhY2soZGIpOworCQkJCQkJUmVjZWl2ZVBhY2sgcnAgPSBuZXcgUmVjZWl2ZVBhY2soZGIpOworCQkJCQkJcnAuc2V0UHJlUmVjZWl2ZUhvb2soCisJCQkJCQkJCW5ldyBQcmVSZWNlaXZlSG9vaygpIHsKKwkJCQkJCQkJCUBPdmVycmlkZQorCQkJCQkJCQkJcHVibGljIHZvaWQgb25QcmVSZWNlaXZlKFJlY2VpdmVQYWNrIHJlY2VpdmVQYWNrLAorCQkJCQkJCQkJCQlDb2xsZWN0aW9uPFJlY2VpdmVDb21tYW5kPiBjbWRzKSB7CisJCQkJCQkJCQkJZm9yIChSZWNlaXZlQ29tbWFuZCBjbWQgOiBjbWRzKSB7CisJCQkJCQkJCQkJCXByb2Nlc3NlZFJlZnMuYWRkKGNtZC5nZXRSZWZOYW1lKCkpOworCQkJCQkJCQkJCX0KKwkJCQkJCQkJCX0KKwkJCQkJCQkJfSk7CisJCQkJCQlyZXR1cm4gcnA7CiAJCQkJCX0KIAkJCQl9KTsKIAkJdXJpID0gdGVzdFByb3RvY29sLnJlZ2lzdGVyKGN0eCwgc2VydmVyKTsKQEAgLTE5Niw0ICsyMTMsNDUgQEAgcHVibGljIHZvaWQgbGltaXRDb21tYW5kQnl0ZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJfQogCQl9CiAJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjb21tYW5kT3JkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJVGVzdFJlcG9zaXRvcnk8Pz4gdHIgPSBuZXcgVGVzdFJlcG9zaXRvcnk8PihjbGllbnQpOworCQlMaXN0PFJlbW90ZVJlZlVwZGF0ZT4gdXBkYXRlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQkvLyBBcmJpdHJhcnkgbm9uLXNvcnRlZCBvcmRlci4KKwkJZm9yIChpbnQgaSA9IDk7IGkgPj0gMDsgaS0tKSB7CisJCQlTdHJpbmcgbmFtZSA9ICJyZWZzL2hlYWRzL2IiICsgaTsKKwkJCXRyLmJyYW5jaChuYW1lKS5jb21taXQoKS5jcmVhdGUoKTsKKwkJCVJlbW90ZVJlZlVwZGF0ZSBycnUgPSBuZXcgUmVtb3RlUmVmVXBkYXRlKGNsaWVudCwgbmFtZSwgbmFtZSwgZmFsc2UsIG51bGwsCisJCQkJCU9iamVjdElkLnplcm9JZCgpKTsKKwkJCXVwZGF0ZXMuYWRkKHJydSk7CisJCX0KKworCQlQdXNoUmVzdWx0IHJlc3VsdDsKKwkJdHJ5IChUcmFuc3BvcnQgdG4gPSB0ZXN0UHJvdG9jb2wub3Blbih1cmksIGNsaWVudCwgInNlcnZlciIpKSB7CisJCQlyZXN1bHQgPSB0bi5wdXNoKE51bGxQcm9ncmVzc01vbml0b3IuSU5TVEFOQ0UsIHVwZGF0ZXMpOworCQl9CisKKwkJZm9yIChSZW1vdGVSZWZVcGRhdGUgcmVtb3RlVXBkYXRlIDogcmVzdWx0LmdldFJlbW90ZVVwZGF0ZXMoKSkgeworCQkJYXNzZXJ0RXF1YWxzKAorCQkJCQkidXBkYXRlIHNob3VsZCBzdWNjZWVkIG9uICIgKyByZW1vdGVVcGRhdGUuZ2V0UmVtb3RlTmFtZSgpLAorCQkJCQlSZW1vdGVSZWZVcGRhdGUuU3RhdHVzLk9LLCByZW1vdGVVcGRhdGUuZ2V0U3RhdHVzKCkpOworCQl9CisKKwkJTGlzdDxTdHJpbmc+IGV4cGVjdGVkID0gcmVtb3RlUmVmTmFtZXModXBkYXRlcyk7CisJCWFzc2VydEVxdWFscygKKwkJCQkicmVmIG5hbWVzIHByb2Nlc3NlZCBieSBSZWNlaXZlUGFjayBzaG91bGQgbWF0Y2ggaW5wdXQgcmVmIG5hbWVzIGluIG9yZGVyIiwKKwkJCQlleHBlY3RlZCwgcHJvY2Vzc2VkUmVmcyk7CisJCWFzc2VydEVxdWFscygKKwkJCQkicmVtb3RlIHJlZiBuYW1lcyBzaG91bGQgbWF0Y2ggaW5wdXQgcmVmIG5hbWVzIGluIG9yZGVyIiwKKwkJCQlleHBlY3RlZCwgcmVtb3RlUmVmTmFtZXMocmVzdWx0LmdldFJlbW90ZVVwZGF0ZXMoKSkpOworCX0KKworCXByaXZhdGUgc3RhdGljIExpc3Q8U3RyaW5nPiByZW1vdGVSZWZOYW1lcyhDb2xsZWN0aW9uPFJlbW90ZVJlZlVwZGF0ZT4gdXBkYXRlcykgeworCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCWZvciAoUmVtb3RlUmVmVXBkYXRlIHUgOiB1cGRhdGVzKSB7CisJCQlyZXN1bHQuYWRkKHUuZ2V0UmVtb3RlTmFtZSgpKTsKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUHVzaFByb2Nlc3NUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1B1c2hQcm9jZXNzVGVzdC5qYXZhCmluZGV4IDEwNGE2OWMuLjYxMWNkMGMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUHVzaFByb2Nlc3NUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QdXNoUHJvY2Vzc1Rlc3QuamF2YQpAQCAtNDIyLDcgKzQyMiw3IEBAIHByaXZhdGUgY2xhc3MgTW9ja1B1c2hDb25uZWN0aW9uIGV4dGVuZHMgQmFzZUNvbm5lY3Rpb24gaW1wbGVtZW50cwogCQkJUHVzaENvbm5lY3Rpb24gewogCQlNb2NrUHVzaENvbm5lY3Rpb24oKSB7CiAJCQlmaW5hbCBNYXA8U3RyaW5nLCBSZWY+IHJlZnNNYXAgPSBuZXcgSGFzaE1hcDw+KCk7Ci0JCQlmb3IgKGZpbmFsIFJlZiByIDogYWR2ZXJ0aXNlZFJlZnMpCisJCQlmb3IgKFJlZiByIDogYWR2ZXJ0aXNlZFJlZnMpCiAJCQkJcmVmc01hcC5wdXQoci5nZXROYW1lKCksIHIpOwogCQkJYXZhaWxhYmxlKHJlZnNNYXApOwogCQl9CkBAIC00NDMsNyArNDQzLDcgQEAgcHVibGljIHZvaWQgcHVzaChQcm9ncmVzc01vbml0b3IgbW9uaXRvciwKIAkJcHVibGljIHZvaWQgcHVzaChQcm9ncmVzc01vbml0b3IgbW9uaXRvciwKIAkJCQlNYXA8U3RyaW5nLCBSZW1vdGVSZWZVcGRhdGU+IHJlZnNUb1VwZGF0ZSkKIAkJCQl0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKLQkJCWZvciAoZmluYWwgUmVtb3RlUmVmVXBkYXRlIHJydSA6IHJlZnNUb1VwZGF0ZS52YWx1ZXMoKSkgeworCQkJZm9yIChSZW1vdGVSZWZVcGRhdGUgcnJ1IDogcmVmc1RvVXBkYXRlLnZhbHVlcygpKSB7CiAJCQkJYXNzZXJ0RXF1YWxzKFN0YXR1cy5OT1RfQVRURU1QVEVELCBycnUuZ2V0U3RhdHVzKCkpOwogCQkJCXJydS5zZXRTdGF0dXMoY29ubmVjdGlvblVwZGF0ZVN0YXR1cyk7CiAJCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlY2VpdmVQYWNrQWR2ZXJ0aXNlUmVmc0hvb2tUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlY2VpdmVQYWNrQWR2ZXJ0aXNlUmVmc0hvb2tUZXN0LmphdmEKaW5kZXggMzgzNmI3ZC4uMGZmYmU2NSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9SZWNlaXZlUGFja0FkdmVydGlzZVJlZnNIb29rVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVjZWl2ZVBhY2tBZHZlcnRpc2VSZWZzSG9va1Rlc3QuamF2YQpAQCAtMTM2LDcgKzEzNiw3IEBAIHB1YmxpYyB2b2lkIHRlc3RGaWx0ZXJIaWRlc1ByaXZhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJdHJ5IChUcmFuc3BvcnRMb2NhbCB0ID0gbmV3IFRyYW5zcG9ydExvY2FsKHNyYywgdXJpT2YoZHN0KSwKIAkJCQlkc3QuZ2V0RGlyZWN0b3J5KCkpIHsKIAkJCUBPdmVycmlkZQotCQkJUmVjZWl2ZVBhY2sgY3JlYXRlUmVjZWl2ZVBhY2soZmluYWwgUmVwb3NpdG9yeSBkYikgeworCQkJUmVjZWl2ZVBhY2sgY3JlYXRlUmVjZWl2ZVBhY2soUmVwb3NpdG9yeSBkYikgewogCQkJCWRiLmNsb3NlKCk7CiAJCQkJZHN0LmluY3JlbWVudE9wZW4oKTsKIApAQCAtMTk5LDYgKzE5OSwyMyBAQCBwdWJsaWMgdm9pZCBhZHZlcnRpc2VSZWZzKFVwbG9hZFBhY2sgdXBsb2FkUGFjaykKIAkJYXNzZXJ0RmFsc2UoaGF2ZXMuZ2V0KCkuY29udGFpbnMoUCkpOwogCX0KIAorCXByaXZhdGUgVHJhbnNwb3J0TG9jYWwgbmV3VHJhbnNwb3J0TG9jYWxXaXRoU3RyaWN0VmFsaWRhdGlvbigpCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIG5ldyBUcmFuc3BvcnRMb2NhbChzcmMsIHVyaU9mKGRzdCksIGRzdC5nZXREaXJlY3RvcnkoKSkgeworCQkJQE92ZXJyaWRlCisJCQlSZWNlaXZlUGFjayBjcmVhdGVSZWNlaXZlUGFjayhSZXBvc2l0b3J5IGRiKSB7CisJCQkJZGIuY2xvc2UoKTsKKwkJCQlkc3QuaW5jcmVtZW50T3BlbigpOworCisJCQkJZmluYWwgUmVjZWl2ZVBhY2sgcnAgPSBzdXBlci5jcmVhdGVSZWNlaXZlUGFjayhkc3QpOworCQkJCXJwLnNldENoZWNrUmVjZWl2ZWRPYmplY3RzKHRydWUpOworCQkJCXJwLnNldENoZWNrUmVmZXJlbmNlZE9iamVjdHNBcmVSZWFjaGFibGUodHJ1ZSk7CisJCQkJcnAuc2V0QWR2ZXJ0aXNlUmVmc0hvb2sobmV3IEhpZGVQcml2YXRlSG9vaygpKTsKKwkJCQlyZXR1cm4gcnA7CisJCQl9CisJCX07CisJfQorCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0U3VjY2VzcygpIHRocm93cyBFeGNlcHRpb24gewogCQkvLyBNYW51YWxseSBmb3JjZSBhIGRlbHRhIG9mIGFuIG9iamVjdCBzbyB3ZSByZXVzZSBpdCBsYXRlci4KQEAgLTIzMCwxOSArMjQ3LDcgQEAgcHVibGljIHZvaWQgdGVzdFN1Y2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogCQkvLyBQdXNoIHRoaXMgbmV3IGNvbnRlbnQgdG8gdGhlIHJlbW90ZSwgZG9pbmcgc3RyaWN0IHZhbGlkYXRpb24uCiAJCS8vCi0JCVRyYW5zcG9ydExvY2FsIHQgPSBuZXcgVHJhbnNwb3J0TG9jYWwoc3JjLCB1cmlPZihkc3QpLCBkc3QuZ2V0RGlyZWN0b3J5KCkpIHsKLQkJCUBPdmVycmlkZQotCQkJUmVjZWl2ZVBhY2sgY3JlYXRlUmVjZWl2ZVBhY2soZmluYWwgUmVwb3NpdG9yeSBkYikgewotCQkJCWRiLmNsb3NlKCk7Ci0JCQkJZHN0LmluY3JlbWVudE9wZW4oKTsKLQotCQkJCWZpbmFsIFJlY2VpdmVQYWNrIHJwID0gc3VwZXIuY3JlYXRlUmVjZWl2ZVBhY2soZHN0KTsKLQkJCQlycC5zZXRDaGVja1JlY2VpdmVkT2JqZWN0cyh0cnVlKTsKLQkJCQlycC5zZXRDaGVja1JlZmVyZW5jZWRPYmplY3RzQXJlUmVhY2hhYmxlKHRydWUpOwotCQkJCXJwLnNldEFkdmVydGlzZVJlZnNIb29rKG5ldyBIaWRlUHJpdmF0ZUhvb2soKSk7Ci0JCQkJcmV0dXJuIHJwOwotCQkJfQotCQl9OworCQlQdXNoUmVzdWx0IHI7CiAJCVJlbW90ZVJlZlVwZGF0ZSB1ID0gbmV3IFJlbW90ZVJlZlVwZGF0ZSggLy8KIAkJCQlzcmMsIC8vCiAJCQkJUl9NQVNURVIsIC8vIHNyYyBuYW1lCkBAIC0yNTEsMTIgKzI1Niw5IEBAIFJlY2VpdmVQYWNrIGNyZWF0ZVJlY2VpdmVQYWNrKGZpbmFsIFJlcG9zaXRvcnkgZGIpIHsKIAkJCQludWxsLCAvLyBsb2NhbCB0cmFja2luZyBicmFuY2gKIAkJCQludWxsIC8vIGV4cGVjdGVkIGlkCiAJCSk7Ci0JCVB1c2hSZXN1bHQgcjsKLQkJdHJ5IHsKKwkJdHJ5IChUcmFuc3BvcnRMb2NhbCB0ID0gbmV3VHJhbnNwb3J0TG9jYWxXaXRoU3RyaWN0VmFsaWRhdGlvbigpKSB7CiAJCQl0LnNldFB1c2hUaGluKHRydWUpOwogCQkJciA9IHQucHVzaChQTSwgQ29sbGVjdGlvbnMuc2luZ2xldG9uKHUpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXQuY2xvc2UoKTsKIAkJfQogCiAJCWFzc2VydE5vdE51bGwoImhhdmUgcmVzdWx0Iiwgcik7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlbW90ZUNvbmZpZ1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVtb3RlQ29uZmlnVGVzdC5qYXZhCmluZGV4IGEwY2YwZDIuLjlhYWJkNzEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVtb3RlQ29uZmlnVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVtb3RlQ29uZmlnVGVzdC5qYXZhCkBAIC02NywxMiArNjcsMTIgQEAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY29uZmlnID0gbmV3IENvbmZpZygpOwogCX0KIAotCXByaXZhdGUgdm9pZCByZWFkQ29uZmlnKGZpbmFsIFN0cmluZyBkYXQpIHRocm93cyBDb25maWdJbnZhbGlkRXhjZXB0aW9uIHsKKwlwcml2YXRlIHZvaWQgcmVhZENvbmZpZyhTdHJpbmcgZGF0KSB0aHJvd3MgQ29uZmlnSW52YWxpZEV4Y2VwdGlvbiB7CiAJCWNvbmZpZyA9IG5ldyBDb25maWcoKTsKIAkJY29uZmlnLmZyb21UZXh0KGRhdCk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGNoZWNrQ29uZmlnKGZpbmFsIFN0cmluZyBleHApIHsKKwlwcml2YXRlIHZvaWQgY2hlY2tDb25maWcoU3RyaW5nIGV4cCkgewogCQlhc3NlcnRFcXVhbHMoZXhwLCBjb25maWcudG9UZXh0KCkpOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9TaWRlQmFuZE91dHB1dFN0cmVhbVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvU2lkZUJhbmRPdXRwdXRTdHJlYW1UZXN0LmphdmEKaW5kZXggNDU3MTYxOS4uNGQzZTE2MiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9TaWRlQmFuZE91dHB1dFN0cmVhbVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1NpZGVCYW5kT3V0cHV0U3RyZWFtVGVzdC5qYXZhCkBAIC0yNTksNyArMjU5LDcgQEAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yX1JlamVjdHNCYWRCdWZmZXJTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCX0KIAl9CiAKLQlwcml2YXRlIHZvaWQgYXNzZXJ0QnVmZmVyKGZpbmFsIFN0cmluZyBleHApIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJpdmF0ZSB2b2lkIGFzc2VydEJ1ZmZlcihTdHJpbmcgZXhwKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlhc3NlcnRFcXVhbHMoZXhwLCBuZXcgU3RyaW5nKHJhd091dC50b0J5dGVBcnJheSgpLAogCQkJCUNvbnN0YW50cy5DSEFSQUNURVJfRU5DT0RJTkcpKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RyYW5zcG9ydFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVHJhbnNwb3J0VGVzdC5qYXZhCmluZGV4IGQ0YzQ3ZDMuLmMyMzk5MjIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVHJhbnNwb3J0VGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVHJhbnNwb3J0VGVzdC5qYXZhCkBAIC0xNDIsNyArMTQyLDcgQEAgcHVibGljIHZvaWQgdGVzdEZpbmRSZW1vdGVSZWZVcGRhdGVzV2lsZGNhcmROb1RyYWNraW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJYXNzZXJ0RXF1YWxzKDEyLCByZXN1bHQuc2l6ZSgpKTsKIAkJYm9vbGVhbiBmb3VuZEEgPSBmYWxzZTsKIAkJYm9vbGVhbiBmb3VuZEIgPSBmYWxzZTsKLQkJZm9yIChmaW5hbCBSZW1vdGVSZWZVcGRhdGUgcnJ1IDogcmVzdWx0KSB7CisJCWZvciAoUmVtb3RlUmVmVXBkYXRlIHJydSA6IHJlc3VsdCkgewogCQkJaWYgKCJyZWZzL2hlYWRzL2EiLmVxdWFscyhycnUuZ2V0U3JjUmVmKCkpCiAJCQkJCSYmICJyZWZzL2hlYWRzL3Rlc3QvYSIuZXF1YWxzKHJydS5nZXRSZW1vdGVOYW1lKCkpKQogCQkJCWZvdW5kQSA9IHRydWU7CkBAIC0xNzQsNyArMTc0LDcgQEAgcHVibGljIHZvaWQgdGVzdEZpbmRSZW1vdGVSZWZVcGRhdGVzVHdvUmVmU3BlY3MoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlhc3NlcnRFcXVhbHMoMiwgcmVzdWx0LnNpemUoKSk7CiAJCWJvb2xlYW4gZm91bmRBID0gZmFsc2U7CiAJCWJvb2xlYW4gZm91bmRDID0gZmFsc2U7Ci0JCWZvciAoZmluYWwgUmVtb3RlUmVmVXBkYXRlIHJydSA6IHJlc3VsdCkgeworCQlmb3IgKFJlbW90ZVJlZlVwZGF0ZSBycnUgOiByZXN1bHQpIHsKIAkJCWlmICgicmVmcy9oZWFkcy9hIi5lcXVhbHMocnJ1LmdldFNyY1JlZigpKQogCQkJCQkmJiAicmVmcy9oZWFkcy9iIi5lcXVhbHMocnJ1LmdldFJlbW90ZU5hbWUoKSkpCiAJCQkJZm91bmRBID0gdHJ1ZTsKQEAgLTIzMyw3ICsyMzMsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0RmluZFJlbW90ZVJlZlVwZGF0ZXNXaXRoTGVhc2VzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJYXNzZXJ0RXF1YWxzKDIsIHJlc3VsdC5zaXplKCkpOwogCQlib29sZWFuIGZvdW5kQSA9IGZhbHNlOwogCQlib29sZWFuIGZvdW5kQyA9IGZhbHNlOwotCQlmb3IgKGZpbmFsIFJlbW90ZVJlZlVwZGF0ZSBycnUgOiByZXN1bHQpIHsKKwkJZm9yIChSZW1vdGVSZWZVcGRhdGUgcnJ1IDogcmVzdWx0KSB7CiAJCQlpZiAoInJlZnMvaGVhZHMvYSIuZXF1YWxzKHJydS5nZXRTcmNSZWYoKSkKIAkJCQkJJiYgInJlZnMvaGVhZHMvYiIuZXF1YWxzKHJydS5nZXRSZW1vdGVOYW1lKCkpKSB7CiAJCQkJZm91bmRBID0gdHJ1ZTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVXBsb2FkUGFja1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVXBsb2FkUGFja1Rlc3QuamF2YQppbmRleCBhODEyN2FiLi5lZjA4M2RhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1VwbG9hZFBhY2tUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9VcGxvYWRQYWNrVGVzdC5qYXZhCkBAIC0xLDIyICsxLDQxIEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0OwogCitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5oYXNJdGVtczsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmlzOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMudGhlSW5zdGFuY2U7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuUGFja1Byb3RvY29sRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLlRyYW5zcG9ydEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZGZzLkRmc0dhcmJhZ2VDb2xsZWN0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmRmcy5EZnNSZXBvc2l0b3J5RGVzY3JpcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmRmcy5Jbk1lbW9yeVJlcG9zaXRvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5UZXN0UmVwb3NpdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5OdWxsUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWY7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5TZXRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlRleHRQcm9ncmVzc01vbml0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldkJsb2I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldkNvbW1pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2VHJlZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2VGFnOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlVwbG9hZFBhY2suUmVxdWVzdFBvbGljeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5yZXNvbHZlci5TZXJ2aWNlTm90QXV0aG9yaXplZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5yZXNvbHZlci5TZXJ2aWNlTm90RW5hYmxlZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5yZXNvbHZlci5VcGxvYWRQYWNrRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuaW8uTnVsbE91dHB1dFN0cmVhbTsKIGltcG9ydCBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnM7CiBpbXBvcnQgb3JnLmp1bml0LkFmdGVyOwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CkBAIC0xNzAsNCArMTg5LDg5OSBAQCBwdWJsaWMgdm9pZCB0ZXN0RmV0Y2hSZWFjaGFibGVCbG9iV2l0aG91dEJpdG1hcCgpIHRocm93cyBFeGNlcHRpb24gewogCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KG5ldyBSZWZTcGVjKGJsb2IubmFtZSgpKSkpOwogCQl9CiAJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0RmV0Y2hXaXRoQmxvYk5vbmVGaWx0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSW5NZW1vcnlSZXBvc2l0b3J5IHNlcnZlcjIgPSBuZXdSZXBvKCJzZXJ2ZXIyIik7CisJCVRlc3RSZXBvc2l0b3J5PEluTWVtb3J5UmVwb3NpdG9yeT4gcmVtb3RlMiA9CisJCQkJbmV3IFRlc3RSZXBvc2l0b3J5PD4oc2VydmVyMik7CisJCVJldkJsb2IgYmxvYjEgPSByZW1vdGUyLmJsb2IoImZvb2JhciIpOworCQlSZXZCbG9iIGJsb2IyID0gcmVtb3RlMi5ibG9iKCJmb29iYSIpOworCQlSZXZUcmVlIHRyZWUgPSByZW1vdGUyLnRyZWUocmVtb3RlMi5maWxlKCIxIiwgYmxvYjEpLAorCQkJCXJlbW90ZTIuZmlsZSgiMiIsIGJsb2IyKSk7CisJCVJldkNvbW1pdCBjb21taXQgPSByZW1vdGUyLmNvbW1pdCh0cmVlKTsKKwkJcmVtb3RlMi51cGRhdGUoIm1hc3RlciIsIGNvbW1pdCk7CisKKwkJc2VydmVyMi5nZXRDb25maWcoKS5zZXRCb29sZWFuKCJ1cGxvYWRwYWNrIiwgbnVsbCwgImFsbG93ZmlsdGVyIiwgdHJ1ZSk7CisKKwkJdGVzdFByb3RvY29sID0gbmV3IFRlc3RQcm90b2NvbDw+KAorCQkJCW5ldyBVcGxvYWRQYWNrRmFjdG9yeTxPYmplY3Q+KCkgeworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHVibGljIFVwbG9hZFBhY2sgY3JlYXRlKE9iamVjdCByZXEsIFJlcG9zaXRvcnkgZGIpCisJCQkJCQkJdGhyb3dzIFNlcnZpY2VOb3RFbmFibGVkRXhjZXB0aW9uLAorCQkJCQkJCVNlcnZpY2VOb3RBdXRob3JpemVkRXhjZXB0aW9uIHsKKwkJCQkJCVVwbG9hZFBhY2sgdXAgPSBuZXcgVXBsb2FkUGFjayhkYik7CisJCQkJCQlyZXR1cm4gdXA7CisJCQkJCX0KKwkJCQl9LCBudWxsKTsKKwkJdXJpID0gdGVzdFByb3RvY29sLnJlZ2lzdGVyKGN0eCwgc2VydmVyMik7CisKKwkJdHJ5IChUcmFuc3BvcnQgdG4gPSB0ZXN0UHJvdG9jb2wub3Blbih1cmksIGNsaWVudCwgInNlcnZlcjIiKSkgeworCQkJdG4uc2V0RmlsdGVyQmxvYkxpbWl0KDApOworCQkJdG4uZmV0Y2goTnVsbFByb2dyZXNzTW9uaXRvci5JTlNUQU5DRSwKKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChuZXcgUmVmU3BlYyhjb21taXQubmFtZSgpKSkpOworCQkJYXNzZXJ0VHJ1ZShjbGllbnQuaGFzT2JqZWN0KHRyZWUudG9PYmplY3RJZCgpKSk7CisJCQlhc3NlcnRGYWxzZShjbGllbnQuaGFzT2JqZWN0KGJsb2IxLnRvT2JqZWN0SWQoKSkpOworCQkJYXNzZXJ0RmFsc2UoY2xpZW50Lmhhc09iamVjdChibG9iMi50b09iamVjdElkKCkpKTsKKwkJfQorCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEZldGNoV2l0aEJsb2JMaW1pdEZpbHRlcigpIHRocm93cyBFeGNlcHRpb24geworCQlJbk1lbW9yeVJlcG9zaXRvcnkgc2VydmVyMiA9IG5ld1JlcG8oInNlcnZlcjIiKTsKKwkJVGVzdFJlcG9zaXRvcnk8SW5NZW1vcnlSZXBvc2l0b3J5PiByZW1vdGUyID0KKwkJCQluZXcgVGVzdFJlcG9zaXRvcnk8PihzZXJ2ZXIyKTsKKwkJUmV2QmxvYiBsb25nQmxvYiA9IHJlbW90ZTIuYmxvYigiZm9vYmFyIik7CisJCVJldkJsb2Igc2hvcnRCbG9iID0gcmVtb3RlMi5ibG9iKCJmb29iYSIpOworCQlSZXZUcmVlIHRyZWUgPSByZW1vdGUyLnRyZWUocmVtb3RlMi5maWxlKCIxIiwgbG9uZ0Jsb2IpLAorCQkJCXJlbW90ZTIuZmlsZSgiMiIsIHNob3J0QmxvYikpOworCQlSZXZDb21taXQgY29tbWl0ID0gcmVtb3RlMi5jb21taXQodHJlZSk7CisJCXJlbW90ZTIudXBkYXRlKCJtYXN0ZXIiLCBjb21taXQpOworCisJCXNlcnZlcjIuZ2V0Q29uZmlnKCkuc2V0Qm9vbGVhbigidXBsb2FkcGFjayIsIG51bGwsICJhbGxvd2ZpbHRlciIsIHRydWUpOworCisJCXRlc3RQcm90b2NvbCA9IG5ldyBUZXN0UHJvdG9jb2w8PigKKwkJCQluZXcgVXBsb2FkUGFja0ZhY3Rvcnk8T2JqZWN0PigpIHsKKwkJCQkJQE92ZXJyaWRlCisJCQkJCXB1YmxpYyBVcGxvYWRQYWNrIGNyZWF0ZShPYmplY3QgcmVxLCBSZXBvc2l0b3J5IGRiKQorCQkJCQkJCXRocm93cyBTZXJ2aWNlTm90RW5hYmxlZEV4Y2VwdGlvbiwKKwkJCQkJCQlTZXJ2aWNlTm90QXV0aG9yaXplZEV4Y2VwdGlvbiB7CisJCQkJCQlVcGxvYWRQYWNrIHVwID0gbmV3IFVwbG9hZFBhY2soZGIpOworCQkJCQkJcmV0dXJuIHVwOworCQkJCQl9CisJCQkJfSwgbnVsbCk7CisJCXVyaSA9IHRlc3RQcm90b2NvbC5yZWdpc3RlcihjdHgsIHNlcnZlcjIpOworCisJCXRyeSAoVHJhbnNwb3J0IHRuID0gdGVzdFByb3RvY29sLm9wZW4odXJpLCBjbGllbnQsICJzZXJ2ZXIyIikpIHsKKwkJCXRuLnNldEZpbHRlckJsb2JMaW1pdCg1KTsKKwkJCXRuLmZldGNoKE51bGxQcm9ncmVzc01vbml0b3IuSU5TVEFOQ0UsCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QobmV3IFJlZlNwZWMoY29tbWl0Lm5hbWUoKSkpKTsKKwkJCWFzc2VydEZhbHNlKGNsaWVudC5oYXNPYmplY3QobG9uZ0Jsb2IudG9PYmplY3RJZCgpKSk7CisJCQlhc3NlcnRUcnVlKGNsaWVudC5oYXNPYmplY3Qoc2hvcnRCbG9iLnRvT2JqZWN0SWQoKSkpOworCQl9CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0RmV0Y2hXaXRoQmxvYkxpbWl0RmlsdGVyQW5kQml0bWFwcygpIHRocm93cyBFeGNlcHRpb24geworCQlJbk1lbW9yeVJlcG9zaXRvcnkgc2VydmVyMiA9IG5ld1JlcG8oInNlcnZlcjIiKTsKKwkJVGVzdFJlcG9zaXRvcnk8SW5NZW1vcnlSZXBvc2l0b3J5PiByZW1vdGUyID0KKwkJCQluZXcgVGVzdFJlcG9zaXRvcnk8PihzZXJ2ZXIyKTsKKwkJUmV2QmxvYiBsb25nQmxvYiA9IHJlbW90ZTIuYmxvYigiZm9vYmFyIik7CisJCVJldkJsb2Igc2hvcnRCbG9iID0gcmVtb3RlMi5ibG9iKCJmb29iYSIpOworCQlSZXZUcmVlIHRyZWUgPSByZW1vdGUyLnRyZWUocmVtb3RlMi5maWxlKCIxIiwgbG9uZ0Jsb2IpLAorCQkJCXJlbW90ZTIuZmlsZSgiMiIsIHNob3J0QmxvYikpOworCQlSZXZDb21taXQgY29tbWl0ID0gcmVtb3RlMi5jb21taXQodHJlZSk7CisJCXJlbW90ZTIudXBkYXRlKCJtYXN0ZXIiLCBjb21taXQpOworCisJCXNlcnZlcjIuZ2V0Q29uZmlnKCkuc2V0Qm9vbGVhbigidXBsb2FkcGFjayIsIG51bGwsICJhbGxvd2ZpbHRlciIsIHRydWUpOworCisJCS8vIGdlbmVyYXRlIGJpdG1hcHMKKwkJbmV3IERmc0dhcmJhZ2VDb2xsZWN0b3Ioc2VydmVyMikucGFjayhudWxsKTsKKwkJc2VydmVyMi5zY2FuRm9yUmVwb0NoYW5nZXMoKTsKKworCQl0ZXN0UHJvdG9jb2wgPSBuZXcgVGVzdFByb3RvY29sPD4oCisJCQkJbmV3IFVwbG9hZFBhY2tGYWN0b3J5PE9iamVjdD4oKSB7CisJCQkJCUBPdmVycmlkZQorCQkJCQlwdWJsaWMgVXBsb2FkUGFjayBjcmVhdGUoT2JqZWN0IHJlcSwgUmVwb3NpdG9yeSBkYikKKwkJCQkJCQl0aHJvd3MgU2VydmljZU5vdEVuYWJsZWRFeGNlcHRpb24sCisJCQkJCQkJU2VydmljZU5vdEF1dGhvcml6ZWRFeGNlcHRpb24geworCQkJCQkJVXBsb2FkUGFjayB1cCA9IG5ldyBVcGxvYWRQYWNrKGRiKTsKKwkJCQkJCXJldHVybiB1cDsKKwkJCQkJfQorCQkJCX0sIG51bGwpOworCQl1cmkgPSB0ZXN0UHJvdG9jb2wucmVnaXN0ZXIoY3R4LCBzZXJ2ZXIyKTsKKworCQl0cnkgKFRyYW5zcG9ydCB0biA9IHRlc3RQcm90b2NvbC5vcGVuKHVyaSwgY2xpZW50LCAic2VydmVyMiIpKSB7CisJCQl0bi5zZXRGaWx0ZXJCbG9iTGltaXQoNSk7CisJCQl0bi5mZXRjaChOdWxsUHJvZ3Jlc3NNb25pdG9yLklOU1RBTkNFLAorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KG5ldyBSZWZTcGVjKGNvbW1pdC5uYW1lKCkpKSk7CisJCQlhc3NlcnRGYWxzZShjbGllbnQuaGFzT2JqZWN0KGxvbmdCbG9iLnRvT2JqZWN0SWQoKSkpOworCQkJYXNzZXJ0VHJ1ZShjbGllbnQuaGFzT2JqZWN0KHNob3J0QmxvYi50b09iamVjdElkKCkpKTsKKwkJfQorCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEZldGNoV2l0aE5vblN1cHBvcnRpbmdTZXJ2ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSW5NZW1vcnlSZXBvc2l0b3J5IHNlcnZlcjIgPSBuZXdSZXBvKCJzZXJ2ZXIyIik7CisJCVRlc3RSZXBvc2l0b3J5PEluTWVtb3J5UmVwb3NpdG9yeT4gcmVtb3RlMiA9CisJCQkJbmV3IFRlc3RSZXBvc2l0b3J5PD4oc2VydmVyMik7CisJCVJldkJsb2IgYmxvYiA9IHJlbW90ZTIuYmxvYigiZm9vIik7CisJCVJldlRyZWUgdHJlZSA9IHJlbW90ZTIudHJlZShyZW1vdGUyLmZpbGUoIjEiLCBibG9iKSk7CisJCVJldkNvbW1pdCBjb21taXQgPSByZW1vdGUyLmNvbW1pdCh0cmVlKTsKKwkJcmVtb3RlMi51cGRhdGUoIm1hc3RlciIsIGNvbW1pdCk7CisKKwkJc2VydmVyMi5nZXRDb25maWcoKS5zZXRCb29sZWFuKCJ1cGxvYWRwYWNrIiwgbnVsbCwgImFsbG93ZmlsdGVyIiwgZmFsc2UpOworCisJCXRlc3RQcm90b2NvbCA9IG5ldyBUZXN0UHJvdG9jb2w8PigKKwkJCQluZXcgVXBsb2FkUGFja0ZhY3Rvcnk8T2JqZWN0PigpIHsKKwkJCQkJQE92ZXJyaWRlCisJCQkJCXB1YmxpYyBVcGxvYWRQYWNrIGNyZWF0ZShPYmplY3QgcmVxLCBSZXBvc2l0b3J5IGRiKQorCQkJCQkJCXRocm93cyBTZXJ2aWNlTm90RW5hYmxlZEV4Y2VwdGlvbiwKKwkJCQkJCQlTZXJ2aWNlTm90QXV0aG9yaXplZEV4Y2VwdGlvbiB7CisJCQkJCQlVcGxvYWRQYWNrIHVwID0gbmV3IFVwbG9hZFBhY2soZGIpOworCQkJCQkJcmV0dXJuIHVwOworCQkJCQl9CisJCQkJfSwgbnVsbCk7CisJCXVyaSA9IHRlc3RQcm90b2NvbC5yZWdpc3RlcihjdHgsIHNlcnZlcjIpOworCisJCXRyeSAoVHJhbnNwb3J0IHRuID0gdGVzdFByb3RvY29sLm9wZW4odXJpLCBjbGllbnQsICJzZXJ2ZXIyIikpIHsKKwkJCXRuLnNldEZpbHRlckJsb2JMaW1pdCgwKTsKKworCQkJdGhyb3duLmV4cGVjdChUcmFuc3BvcnRFeGNlcHRpb24uY2xhc3MpOworCQkJdGhyb3duLmV4cGVjdE1lc3NhZ2UoImZpbHRlciByZXF1aXJlcyBzZXJ2ZXIgdG8gYWR2ZXJ0aXNlIHRoYXQgY2FwYWJpbGl0eSIpOworCisJCQl0bi5mZXRjaChOdWxsUHJvZ3Jlc3NNb25pdG9yLklOU1RBTkNFLAorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KG5ldyBSZWZTcGVjKGNvbW1pdC5uYW1lKCkpKSk7CisJCX0KKwl9CisKKwkvKgorCSAqIEludm9rZXMgVXBsb2FkUGFjayB3aXRoIHByb3RvY29sIHYyIGFuZCBzZW5kcyBpdCB0aGUgZ2l2ZW4gbGluZXMsCisJICogYW5kIHJldHVybnMgVXBsb2FkUGFjaydzIG91dHB1dCBzdHJlYW0uCisJICovCisJcHJpdmF0ZSBCeXRlQXJyYXlJbnB1dFN0cmVhbSB1cGxvYWRQYWNrVjJTZXR1cChSZXF1ZXN0UG9saWN5IHJlcXVlc3RQb2xpY3ksCisJCQlSZWZGaWx0ZXIgcmVmRmlsdGVyLCBTdHJpbmcuLi4gaW5wdXRMaW5lcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHNlbmQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisJCVBhY2tldExpbmVPdXQgcGNrT3V0ID0gbmV3IFBhY2tldExpbmVPdXQoc2VuZCk7CisJCWZvciAoU3RyaW5nIGxpbmUgOiBpbnB1dExpbmVzKSB7CisJCQlpZiAobGluZSA9PSBQYWNrZXRMaW5lSW4uRU5EKSB7CisJCQkJcGNrT3V0LmVuZCgpOworCQkJfSBlbHNlIGlmIChsaW5lID09IFBhY2tldExpbmVJbi5ERUxJTSkgeworCQkJCXBja091dC53cml0ZURlbGltKCk7CisJCQl9IGVsc2UgeworCQkJCXBja091dC53cml0ZVN0cmluZyhsaW5lKTsKKwkJCX0KKwkJfQorCisJCXNlcnZlci5nZXRDb25maWcoKS5zZXRTdHJpbmcoInByb3RvY29sIiwgbnVsbCwgInZlcnNpb24iLCAiMiIpOworCQlVcGxvYWRQYWNrIHVwID0gbmV3IFVwbG9hZFBhY2soc2VydmVyKTsKKwkJaWYgKHJlcXVlc3RQb2xpY3kgIT0gbnVsbCkKKwkJCXVwLnNldFJlcXVlc3RQb2xpY3kocmVxdWVzdFBvbGljeSk7CisJCWlmIChyZWZGaWx0ZXIgIT0gbnVsbCkKKwkJCXVwLnNldFJlZkZpbHRlcihyZWZGaWx0ZXIpOworCQl1cC5zZXRFeHRyYVBhcmFtZXRlcnMoU2V0cy5vZigidmVyc2lvbj0yIikpOworCisJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSByZWN2ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworCQl1cC51cGxvYWQobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHNlbmQudG9CeXRlQXJyYXkoKSksIHJlY3YsIG51bGwpOworCisJCXJldHVybiBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocmVjdi50b0J5dGVBcnJheSgpKTsKKwl9CisKKwkvKgorCSAqIEludm9rZXMgVXBsb2FkUGFjayB3aXRoIHByb3RvY29sIHYyIGFuZCBzZW5kcyBpdCB0aGUgZ2l2ZW4gbGluZXMuCisJICogUmV0dXJucyBVcGxvYWRQYWNrJ3Mgb3V0cHV0IHN0cmVhbSwgbm90IGluY2x1ZGluZyB0aGUgY2FwYWJpbGl0eQorCSAqIGFkdmVydGlzZW1lbnQgYnkgdGhlIHNlcnZlci4KKwkgKi8KKwlwcml2YXRlIEJ5dGVBcnJheUlucHV0U3RyZWFtIHVwbG9hZFBhY2tWMihSZXF1ZXN0UG9saWN5IHJlcXVlc3RQb2xpY3ksCisJCQlSZWZGaWx0ZXIgcmVmRmlsdGVyLCBTdHJpbmcuLi4gaW5wdXRMaW5lcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUJ5dGVBcnJheUlucHV0U3RyZWFtIHJlY3ZTdHJlYW0gPQorCQkJdXBsb2FkUGFja1YyU2V0dXAocmVxdWVzdFBvbGljeSwgcmVmRmlsdGVyLCBpbnB1dExpbmVzKTsKKwkJUGFja2V0TGluZUluIHBja0luID0gbmV3IFBhY2tldExpbmVJbihyZWN2U3RyZWFtKTsKKworCQkvLyBkcmFpbiBjYXBhYmlsaXRpZXMKKwkJd2hpbGUgKHBja0luLnJlYWRTdHJpbmcoKSAhPSBQYWNrZXRMaW5lSW4uRU5EKSB7CisJCQkvLyBkbyBub3RoaW5nCisJCX0KKwkJcmV0dXJuIHJlY3ZTdHJlYW07CisJfQorCisJcHJpdmF0ZSBCeXRlQXJyYXlJbnB1dFN0cmVhbSB1cGxvYWRQYWNrVjIoU3RyaW5nLi4uIGlucHV0TGluZXMpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdXBsb2FkUGFja1YyKG51bGwsIG51bGwsIGlucHV0TGluZXMpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFYyQ2FwYWJpbGl0aWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUJ5dGVBcnJheUlucHV0U3RyZWFtIHJlY3ZTdHJlYW0gPQorCQkJdXBsb2FkUGFja1YyU2V0dXAobnVsbCwgbnVsbCwgUGFja2V0TGluZUluLkVORCk7CisJCVBhY2tldExpbmVJbiBwY2tJbiA9IG5ldyBQYWNrZXRMaW5lSW4ocmVjdlN0cmVhbSk7CisKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKCJ2ZXJzaW9uIDIiKSk7CisJCWFzc2VydFRoYXQoCisJCQlBcnJheXMuYXNMaXN0KHBja0luLnJlYWRTdHJpbmcoKSwgcGNrSW4ucmVhZFN0cmluZygpKSwKKwkJCS8vIFRPRE8oam9uYXRoYW50YW5teSkgVGhpcyBjaGVjayBpcyB3cml0dGVuIHRoaXMgd2F5CisJCQkvLyB0byBtYWtlIGl0IHNpbXBsZSB0byBzZWUgdGhhdCB3ZSBleHBlY3QgdGhpcyBsaXN0IG9mCisJCQkvLyBjYXBhYmlsaXRpZXMsIGJ1dCBwcm9iYWJseSBzaG91bGQgYmUgbG9vc2VuZWQgdG8KKwkJCS8vIGFsbG93IGFkZGl0aW9uYWwgY29tbWFuZHMgdG8gYmUgYWRkZWQgdG8gdGhlIGxpc3QsCisJCQkvLyBhbmQgYWRkaXRpb25hbCBjYXBhYmlsaXRpZXMgdG8gYmUgYWRkZWQgdG8gZXhpc3RpbmcKKwkJCS8vIGNvbW1hbmRzIHdpdGhvdXQgcmVxdWlyaW5nIHRlc3QgY2hhbmdlcy4KKwkJCWhhc0l0ZW1zKCJscy1yZWZzIiwgImZldGNoPXNoYWxsb3ciKSk7CisJCWFzc2VydFRydWUocGNrSW4ucmVhZFN0cmluZygpID09IFBhY2tldExpbmVJbi5FTkQpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFYyQ2FwYWJpbGl0aWVzQWxsb3dGaWx0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2VydmVyLmdldENvbmZpZygpLnNldEJvb2xlYW4oInVwbG9hZHBhY2siLCBudWxsLCAiYWxsb3dmaWx0ZXIiLCB0cnVlKTsKKwkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gcmVjdlN0cmVhbSA9CisJCQl1cGxvYWRQYWNrVjJTZXR1cChudWxsLCBudWxsLCBQYWNrZXRMaW5lSW4uRU5EKTsKKwkJUGFja2V0TGluZUluIHBja0luID0gbmV3IFBhY2tldExpbmVJbihyZWN2U3RyZWFtKTsKKworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXMoInZlcnNpb24gMiIpKTsKKwkJYXNzZXJ0VGhhdCgKKwkJCUFycmF5cy5hc0xpc3QocGNrSW4ucmVhZFN0cmluZygpLCBwY2tJbi5yZWFkU3RyaW5nKCkpLAorCQkJLy8gVE9ETyhqb25hdGhhbnRhbm15KSBUaGlzIGNoZWNrIG92ZXJzcGVjaWZpZXMgdGhlCisJCQkvLyBvcmRlciBvZiB0aGUgY2FwYWJpbGl0aWVzIG9mICJmZXRjaCIuCisJCQloYXNJdGVtcygibHMtcmVmcyIsICJmZXRjaD1maWx0ZXIgc2hhbGxvdyIpKTsKKwkJYXNzZXJ0VHJ1ZShwY2tJbi5yZWFkU3RyaW5nKCkgPT0gUGFja2V0TGluZUluLkVORCk7CisJfQorCisJQFRlc3QKKwlAU3VwcHJlc3NXYXJuaW5ncygiYm94aW5nIikKKwlwdWJsaWMgdm9pZCB0ZXN0VjJFbXB0eVJlcXVlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gcmVjdlN0cmVhbSA9IHVwbG9hZFBhY2tWMihQYWNrZXRMaW5lSW4uRU5EKTsKKwkJLy8gVmVyaWZ5IHRoYXQgdGhlcmUgaXMgbm90aGluZyBtb3JlIGFmdGVyIHRoZSBjYXBhYmlsaXR5CisJCS8vIGFkdmVydGlzZW1lbnQuCisJCWFzc2VydFRoYXQocmVjdlN0cmVhbS5hdmFpbGFibGUoKSwgaXMoMCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFYyTHNSZWZzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJldkNvbW1pdCB0aXAgPSByZW1vdGUuY29tbWl0KCkubWVzc2FnZSgibWVzc2FnZSIpLmNyZWF0ZSgpOworCQlyZW1vdGUudXBkYXRlKCJtYXN0ZXIiLCB0aXApOworCQlzZXJ2ZXIudXBkYXRlUmVmKCJIRUFEIikubGluaygicmVmcy9oZWFkcy9tYXN0ZXIiKTsKKwkJUmV2VGFnIHRhZyA9IHJlbW90ZS50YWcoInRhZyIsIHRpcCk7CisJCXJlbW90ZS51cGRhdGUoInJlZnMvdGFncy90YWciLCB0YWcpOworCisJCUJ5dGVBcnJheUlucHV0U3RyZWFtIHJlY3ZTdHJlYW0gPSB1cGxvYWRQYWNrVjIoImNvbW1hbmQ9bHMtcmVmc1xuIiwgUGFja2V0TGluZUluLkVORCk7CisJCVBhY2tldExpbmVJbiBwY2tJbiA9IG5ldyBQYWNrZXRMaW5lSW4ocmVjdlN0cmVhbSk7CisKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKHRpcC50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIiBIRUFEIikpOworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXModGlwLnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiIHJlZnMvaGVhZHMvbWFzdGVyIikpOworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXModGFnLnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiIHJlZnMvdGFncy90YWciKSk7CisJCWFzc2VydFRydWUocGNrSW4ucmVhZFN0cmluZygpID09IFBhY2tldExpbmVJbi5FTkQpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFYyTHNSZWZzU3ltcmVmcygpIHRocm93cyBFeGNlcHRpb24geworCQlSZXZDb21taXQgdGlwID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoIm1lc3NhZ2UiKS5jcmVhdGUoKTsKKwkJcmVtb3RlLnVwZGF0ZSgibWFzdGVyIiwgdGlwKTsKKwkJc2VydmVyLnVwZGF0ZVJlZigiSEVBRCIpLmxpbmsoInJlZnMvaGVhZHMvbWFzdGVyIik7CisJCVJldlRhZyB0YWcgPSByZW1vdGUudGFnKCJ0YWciLCB0aXApOworCQlyZW1vdGUudXBkYXRlKCJyZWZzL3RhZ3MvdGFnIiwgdGFnKTsKKworCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSByZWN2U3RyZWFtID0gdXBsb2FkUGFja1YyKCJjb21tYW5kPWxzLXJlZnNcbiIsIFBhY2tldExpbmVJbi5ERUxJTSwgInN5bXJlZnMiLCBQYWNrZXRMaW5lSW4uRU5EKTsKKwkJUGFja2V0TGluZUluIHBja0luID0gbmV3IFBhY2tldExpbmVJbihyZWN2U3RyZWFtKTsKKworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXModGlwLnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiIEhFQUQgc3ltcmVmLXRhcmdldDpyZWZzL2hlYWRzL21hc3RlciIpKTsKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKHRpcC50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIiByZWZzL2hlYWRzL21hc3RlciIpKTsKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKHRhZy50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIiByZWZzL3RhZ3MvdGFnIikpOworCQlhc3NlcnRUcnVlKHBja0luLnJlYWRTdHJpbmcoKSA9PSBQYWNrZXRMaW5lSW4uRU5EKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RWMkxzUmVmc1BlZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmV2Q29tbWl0IHRpcCA9IHJlbW90ZS5jb21taXQoKS5tZXNzYWdlKCJtZXNzYWdlIikuY3JlYXRlKCk7CisJCXJlbW90ZS51cGRhdGUoIm1hc3RlciIsIHRpcCk7CisJCXNlcnZlci51cGRhdGVSZWYoIkhFQUQiKS5saW5rKCJyZWZzL2hlYWRzL21hc3RlciIpOworCQlSZXZUYWcgdGFnID0gcmVtb3RlLnRhZygidGFnIiwgdGlwKTsKKwkJcmVtb3RlLnVwZGF0ZSgicmVmcy90YWdzL3RhZyIsIHRhZyk7CisKKwkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gcmVjdlN0cmVhbSA9IHVwbG9hZFBhY2tWMigiY29tbWFuZD1scy1yZWZzXG4iLCBQYWNrZXRMaW5lSW4uREVMSU0sICJwZWVsIiwgUGFja2V0TGluZUluLkVORCk7CisJCVBhY2tldExpbmVJbiBwY2tJbiA9IG5ldyBQYWNrZXRMaW5lSW4ocmVjdlN0cmVhbSk7CisKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKHRpcC50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIiBIRUFEIikpOworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXModGlwLnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiIHJlZnMvaGVhZHMvbWFzdGVyIikpOworCQlhc3NlcnRUaGF0KAorCQkJcGNrSW4ucmVhZFN0cmluZygpLAorCQkJaXModGFnLnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiIHJlZnMvdGFncy90YWcgcGVlbGVkOiIKKwkJCQkrIHRpcC50b09iamVjdElkKCkuZ2V0TmFtZSgpKSk7CisJCWFzc2VydFRydWUocGNrSW4ucmVhZFN0cmluZygpID09IFBhY2tldExpbmVJbi5FTkQpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFYyTHNSZWZzTXVsdGlwbGVDb21tYW5kcygpIHRocm93cyBFeGNlcHRpb24geworCQlSZXZDb21taXQgdGlwID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoIm1lc3NhZ2UiKS5jcmVhdGUoKTsKKwkJcmVtb3RlLnVwZGF0ZSgibWFzdGVyIiwgdGlwKTsKKwkJc2VydmVyLnVwZGF0ZVJlZigiSEVBRCIpLmxpbmsoInJlZnMvaGVhZHMvbWFzdGVyIik7CisJCVJldlRhZyB0YWcgPSByZW1vdGUudGFnKCJ0YWciLCB0aXApOworCQlyZW1vdGUudXBkYXRlKCJyZWZzL3RhZ3MvdGFnIiwgdGFnKTsKKworCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSByZWN2U3RyZWFtID0gdXBsb2FkUGFja1YyKAorCQkJImNvbW1hbmQ9bHMtcmVmc1xuIiwgUGFja2V0TGluZUluLkRFTElNLCAic3ltcmVmcyIsICJwZWVsIiwgUGFja2V0TGluZUluLkVORCwKKwkJCSJjb21tYW5kPWxzLXJlZnNcbiIsIFBhY2tldExpbmVJbi5ERUxJTSwgUGFja2V0TGluZUluLkVORCk7CisJCVBhY2tldExpbmVJbiBwY2tJbiA9IG5ldyBQYWNrZXRMaW5lSW4ocmVjdlN0cmVhbSk7CisKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKHRpcC50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIiBIRUFEIHN5bXJlZi10YXJnZXQ6cmVmcy9oZWFkcy9tYXN0ZXIiKSk7CisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcyh0aXAudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICIgcmVmcy9oZWFkcy9tYXN0ZXIiKSk7CisJCWFzc2VydFRoYXQoCisJCQlwY2tJbi5yZWFkU3RyaW5nKCksCisJCQlpcyh0YWcudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICIgcmVmcy90YWdzL3RhZyBwZWVsZWQ6IgorCQkJCSsgdGlwLnRvT2JqZWN0SWQoKS5nZXROYW1lKCkpKTsKKwkJYXNzZXJ0VHJ1ZShwY2tJbi5yZWFkU3RyaW5nKCkgPT0gUGFja2V0TGluZUluLkVORCk7CisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcyh0aXAudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICIgSEVBRCIpKTsKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKHRpcC50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIiByZWZzL2hlYWRzL21hc3RlciIpKTsKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKHRhZy50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIiByZWZzL3RhZ3MvdGFnIikpOworCQlhc3NlcnRUcnVlKHBja0luLnJlYWRTdHJpbmcoKSA9PSBQYWNrZXRMaW5lSW4uRU5EKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RWMkxzUmVmc1JlZlByZWZpeCgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXZDb21taXQgdGlwID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoIm1lc3NhZ2UiKS5jcmVhdGUoKTsKKwkJcmVtb3RlLnVwZGF0ZSgibWFzdGVyIiwgdGlwKTsKKwkJcmVtb3RlLnVwZGF0ZSgib3RoZXIiLCB0aXApOworCQlyZW1vdGUudXBkYXRlKCJ5ZXRBbm90aGVyIiwgdGlwKTsKKworCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSByZWN2U3RyZWFtID0gdXBsb2FkUGFja1YyKAorCQkJImNvbW1hbmQ9bHMtcmVmc1xuIiwKKwkJCVBhY2tldExpbmVJbi5ERUxJTSwKKwkJCSJyZWYtcHJlZml4IHJlZnMvaGVhZHMvbWFzdGUiLAorCQkJInJlZi1wcmVmaXggcmVmcy9oZWFkcy9vdGhlciIsCisJCQlQYWNrZXRMaW5lSW4uRU5EKTsKKwkJUGFja2V0TGluZUluIHBja0luID0gbmV3IFBhY2tldExpbmVJbihyZWN2U3RyZWFtKTsKKworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXModGlwLnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiIHJlZnMvaGVhZHMvbWFzdGVyIikpOworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXModGlwLnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiIHJlZnMvaGVhZHMvb3RoZXIiKSk7CisJCWFzc2VydFRydWUocGNrSW4ucmVhZFN0cmluZygpID09IFBhY2tldExpbmVJbi5FTkQpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFYyTHNSZWZzUmVmUHJlZml4Tm9TbGFzaCgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXZDb21taXQgdGlwID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoIm1lc3NhZ2UiKS5jcmVhdGUoKTsKKwkJcmVtb3RlLnVwZGF0ZSgibWFzdGVyIiwgdGlwKTsKKwkJcmVtb3RlLnVwZGF0ZSgib3RoZXIiLCB0aXApOworCisJCUJ5dGVBcnJheUlucHV0U3RyZWFtIHJlY3ZTdHJlYW0gPSB1cGxvYWRQYWNrVjIoCisJCQkiY29tbWFuZD1scy1yZWZzXG4iLAorCQkJUGFja2V0TGluZUluLkRFTElNLAorCQkJInJlZi1wcmVmaXggcmVmcy9oZWFkcy9tYXN0ZSIsCisJCQkicmVmLXByZWZpeCByIiwKKwkJCVBhY2tldExpbmVJbi5FTkQpOworCQlQYWNrZXRMaW5lSW4gcGNrSW4gPSBuZXcgUGFja2V0TGluZUluKHJlY3ZTdHJlYW0pOworCisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcyh0aXAudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICIgcmVmcy9oZWFkcy9tYXN0ZXIiKSk7CisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcyh0aXAudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICIgcmVmcy9oZWFkcy9vdGhlciIpKTsKKwkJYXNzZXJ0VHJ1ZShwY2tJbi5yZWFkU3RyaW5nKCkgPT0gUGFja2V0TGluZUluLkVORCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VjJMc1JlZnNVbnJlY29nbml6ZWRBcmd1bWVudCgpIHRocm93cyBFeGNlcHRpb24geworCQl0aHJvd24uZXhwZWN0KFBhY2tQcm90b2NvbEV4Y2VwdGlvbi5jbGFzcyk7CisJCXRocm93bi5leHBlY3RNZXNzYWdlKCJ1bmV4cGVjdGVkIGludmFsaWQtYXJndW1lbnQiKTsKKwkJdXBsb2FkUGFja1YyKAorCQkJImNvbW1hbmQ9bHMtcmVmc1xuIiwKKwkJCVBhY2tldExpbmVJbi5ERUxJTSwKKwkJCSJpbnZhbGlkLWFyZ3VtZW50XG4iLAorCQkJUGFja2V0TGluZUluLkVORCk7CisJfQorCisJLyoKKwkgKiBQYXJzZSBtdWx0aXBsZXhlZCBwYWNrZmlsZSBvdXRwdXQgZnJvbSB1cGxvYWQtcGFjayB1c2luZyBwcm90b2NvbCBWMgorCSAqIGludG8gdGhlIGNsaWVudCByZXBvc2l0b3J5LgorCSAqLworCXByaXZhdGUgUmVjZWl2ZWRQYWNrU3RhdGlzdGljcyBwYXJzZVBhY2soQnl0ZUFycmF5SW5wdXRTdHJlYW0gcmVjdlN0cmVhbSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiBwYXJzZVBhY2socmVjdlN0cmVhbSwgTnVsbFByb2dyZXNzTW9uaXRvci5JTlNUQU5DRSk7CisJfQorCisJcHJpdmF0ZSBSZWNlaXZlZFBhY2tTdGF0aXN0aWNzIHBhcnNlUGFjayhCeXRlQXJyYXlJbnB1dFN0cmVhbSByZWN2U3RyZWFtLCBQcm9ncmVzc01vbml0b3IgcG0pCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU2lkZUJhbmRJbnB1dFN0cmVhbSBzYiA9IG5ldyBTaWRlQmFuZElucHV0U3RyZWFtKAorCQkJCXJlY3ZTdHJlYW0sIHBtLAorCQkJCW5ldyBTdHJpbmdXcml0ZXIoKSwgTnVsbE91dHB1dFN0cmVhbS5JTlNUQU5DRSk7CisJCVBhY2tQYXJzZXIgcHAgPSBjbGllbnQubmV3T2JqZWN0SW5zZXJ0ZXIoKS5uZXdQYWNrUGFyc2VyKHNiKTsKKwkJcHAucGFyc2UoTnVsbFByb2dyZXNzTW9uaXRvci5JTlNUQU5DRSk7CisJCXJldHVybiBwcC5nZXRSZWNlaXZlZFBhY2tTdGF0aXN0aWNzKCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VjJGZXRjaFJlcXVlc3RQb2xpY3lBZHZlcnRpc2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJldkNvbW1pdCBhZHZlcnRpemVkID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoIngiKS5jcmVhdGUoKTsKKwkJUmV2Q29tbWl0IHVuYWR2ZXJ0aXplZCA9IHJlbW90ZS5jb21taXQoKS5tZXNzYWdlKCJ5IikuY3JlYXRlKCk7CisJCXJlbW90ZS51cGRhdGUoImJyYW5jaDEiLCBhZHZlcnRpemVkKTsKKworCQkvLyBUaGlzIHdvcmtzCisJCXVwbG9hZFBhY2tWMigKKwkJCVJlcXVlc3RQb2xpY3kuQURWRVJUSVNFRCwKKwkJCW51bGwsCisJCQkiY29tbWFuZD1mZXRjaFxuIiwKKwkJCVBhY2tldExpbmVJbi5ERUxJTSwKKwkJCSJ3YW50ICIgKyBhZHZlcnRpemVkLm5hbWUoKSArICJcbiIsCisJCQlQYWNrZXRMaW5lSW4uRU5EKTsKKworCQkvLyBUaGlzIGRvZXNuJ3QKKwkJdGhyb3duLmV4cGVjdChUcmFuc3BvcnRFeGNlcHRpb24uY2xhc3MpOworCQl0aHJvd24uZXhwZWN0TWVzc2FnZShNYXRjaGVycy5jb250YWluc1N0cmluZygKKwkJCQkJIndhbnQgIiArIHVuYWR2ZXJ0aXplZC5uYW1lKCkgKyAiIG5vdCB2YWxpZCIpKTsKKwkJdXBsb2FkUGFja1YyKAorCQkJUmVxdWVzdFBvbGljeS5BRFZFUlRJU0VELAorCQkJbnVsbCwKKwkJCSJjb21tYW5kPWZldGNoXG4iLAorCQkJUGFja2V0TGluZUluLkRFTElNLAorCQkJIndhbnQgIiArIHVuYWR2ZXJ0aXplZC5uYW1lKCkgKyAiXG4iLAorCQkJUGFja2V0TGluZUluLkVORCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VjJGZXRjaFJlcXVlc3RQb2xpY3lSZWFjaGFibGVDb21taXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmV2Q29tbWl0IHJlYWNoYWJsZSA9IHJlbW90ZS5jb21taXQoKS5tZXNzYWdlKCJ4IikuY3JlYXRlKCk7CisJCVJldkNvbW1pdCBhZHZlcnRpemVkID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoIngiKS5wYXJlbnQocmVhY2hhYmxlKS5jcmVhdGUoKTsKKwkJUmV2Q29tbWl0IHVucmVhY2hhYmxlID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoInkiKS5jcmVhdGUoKTsKKwkJcmVtb3RlLnVwZGF0ZSgiYnJhbmNoMSIsIGFkdmVydGl6ZWQpOworCisJCS8vIFRoaXMgd29ya3MKKwkJdXBsb2FkUGFja1YyKAorCQkJUmVxdWVzdFBvbGljeS5SRUFDSEFCTEVfQ09NTUlULAorCQkJbnVsbCwKKwkJCSJjb21tYW5kPWZldGNoXG4iLAorCQkJUGFja2V0TGluZUluLkRFTElNLAorCQkJIndhbnQgIiArIHJlYWNoYWJsZS5uYW1lKCkgKyAiXG4iLAorCQkJUGFja2V0TGluZUluLkVORCk7CisKKwkJLy8gVGhpcyBkb2Vzbid0CisJCXRocm93bi5leHBlY3QoVHJhbnNwb3J0RXhjZXB0aW9uLmNsYXNzKTsKKwkJdGhyb3duLmV4cGVjdE1lc3NhZ2UoTWF0Y2hlcnMuY29udGFpbnNTdHJpbmcoCisJCQkJCSJ3YW50ICIgKyB1bnJlYWNoYWJsZS5uYW1lKCkgKyAiIG5vdCB2YWxpZCIpKTsKKwkJdXBsb2FkUGFja1YyKAorCQkJUmVxdWVzdFBvbGljeS5SRUFDSEFCTEVfQ09NTUlULAorCQkJbnVsbCwKKwkJCSJjb21tYW5kPWZldGNoXG4iLAorCQkJUGFja2V0TGluZUluLkRFTElNLAorCQkJIndhbnQgIiArIHVucmVhY2hhYmxlLm5hbWUoKSArICJcbiIsCisJCQlQYWNrZXRMaW5lSW4uRU5EKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RWMkZldGNoUmVxdWVzdFBvbGljeVRpcCgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXZDb21taXQgcGFyZW50T2ZUaXAgPSByZW1vdGUuY29tbWl0KCkubWVzc2FnZSgieCIpLmNyZWF0ZSgpOworCQlSZXZDb21taXQgdGlwID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoInkiKS5wYXJlbnQocGFyZW50T2ZUaXApLmNyZWF0ZSgpOworCQlyZW1vdGUudXBkYXRlKCJzZWNyZXQiLCB0aXApOworCisJCS8vIFRoaXMgd29ya3MKKwkJdXBsb2FkUGFja1YyKAorCQkJUmVxdWVzdFBvbGljeS5USVAsCisJCQluZXcgUmVqZWN0QWxsUmVmRmlsdGVyKCksCisJCQkiY29tbWFuZD1mZXRjaFxuIiwKKwkJCVBhY2tldExpbmVJbi5ERUxJTSwKKwkJCSJ3YW50ICIgKyB0aXAubmFtZSgpICsgIlxuIiwKKwkJCVBhY2tldExpbmVJbi5FTkQpOworCisJCS8vIFRoaXMgZG9lc24ndAorCQl0aHJvd24uZXhwZWN0KFRyYW5zcG9ydEV4Y2VwdGlvbi5jbGFzcyk7CisJCXRocm93bi5leHBlY3RNZXNzYWdlKE1hdGNoZXJzLmNvbnRhaW5zU3RyaW5nKAorCQkJCQkid2FudCAiICsgcGFyZW50T2ZUaXAubmFtZSgpICsgIiBub3QgdmFsaWQiKSk7CisJCXVwbG9hZFBhY2tWMigKKwkJCVJlcXVlc3RQb2xpY3kuVElQLAorCQkJbmV3IFJlamVjdEFsbFJlZkZpbHRlcigpLAorCQkJImNvbW1hbmQ9ZmV0Y2hcbiIsCisJCQlQYWNrZXRMaW5lSW4uREVMSU0sCisJCQkid2FudCAiICsgcGFyZW50T2ZUaXAubmFtZSgpICsgIlxuIiwKKwkJCVBhY2tldExpbmVJbi5FTkQpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFYyRmV0Y2hSZXF1ZXN0UG9saWN5UmVhY2hhYmxlQ29tbWl0VGlwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJldkNvbW1pdCBwYXJlbnRPZlRpcCA9IHJlbW90ZS5jb21taXQoKS5tZXNzYWdlKCJ4IikuY3JlYXRlKCk7CisJCVJldkNvbW1pdCB0aXAgPSByZW1vdGUuY29tbWl0KCkubWVzc2FnZSgieSIpLnBhcmVudChwYXJlbnRPZlRpcCkuY3JlYXRlKCk7CisJCVJldkNvbW1pdCB1bnJlYWNoYWJsZSA9IHJlbW90ZS5jb21taXQoKS5tZXNzYWdlKCJ5IikuY3JlYXRlKCk7CisJCXJlbW90ZS51cGRhdGUoInNlY3JldCIsIHRpcCk7CisKKwkJLy8gVGhpcyB3b3JrcworCQl1cGxvYWRQYWNrVjIoCisJCQlSZXF1ZXN0UG9saWN5LlJFQUNIQUJMRV9DT01NSVRfVElQLAorCQkJbmV3IFJlamVjdEFsbFJlZkZpbHRlcigpLAorCQkJImNvbW1hbmQ9ZmV0Y2hcbiIsCisJCQlQYWNrZXRMaW5lSW4uREVMSU0sCisJCQkid2FudCAiICsgcGFyZW50T2ZUaXAubmFtZSgpICsgIlxuIiwKKwkJCVBhY2tldExpbmVJbi5FTkQpOworCisJCS8vIFRoaXMgZG9lc24ndAorCQl0aHJvd24uZXhwZWN0KFRyYW5zcG9ydEV4Y2VwdGlvbi5jbGFzcyk7CisJCXRocm93bi5leHBlY3RNZXNzYWdlKE1hdGNoZXJzLmNvbnRhaW5zU3RyaW5nKAorCQkJCQkid2FudCAiICsgdW5yZWFjaGFibGUubmFtZSgpICsgIiBub3QgdmFsaWQiKSk7CisJCXVwbG9hZFBhY2tWMigKKwkJCVJlcXVlc3RQb2xpY3kuUkVBQ0hBQkxFX0NPTU1JVF9USVAsCisJCQluZXcgUmVqZWN0QWxsUmVmRmlsdGVyKCksCisJCQkiY29tbWFuZD1mZXRjaFxuIiwKKwkJCVBhY2tldExpbmVJbi5ERUxJTSwKKwkJCSJ3YW50ICIgKyB1bnJlYWNoYWJsZS5uYW1lKCkgKyAiXG4iLAorCQkJUGFja2V0TGluZUluLkVORCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VjJGZXRjaFJlcXVlc3RQb2xpY3lBbnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmV2Q29tbWl0IHVucmVhY2hhYmxlID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoInkiKS5jcmVhdGUoKTsKKworCQkvLyBFeGVyY2lzZSB0byBtYWtlIHN1cmUgdGhhdCBldmVuIHVucmVhY2hhYmxlIGNvbW1pdHMgY2FuIGJlIGZldGNoZWQKKwkJdXBsb2FkUGFja1YyKAorCQkJUmVxdWVzdFBvbGljeS5BTlksCisJCQludWxsLAorCQkJImNvbW1hbmQ9ZmV0Y2hcbiIsCisJCQlQYWNrZXRMaW5lSW4uREVMSU0sCisJCQkid2FudCAiICsgdW5yZWFjaGFibGUubmFtZSgpICsgIlxuIiwKKwkJCVBhY2tldExpbmVJbi5FTkQpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFYyRmV0Y2hTZXJ2ZXJEb2VzTm90U3RvcE5lZ290aWF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJldkNvbW1pdCBmb29QYXJlbnQgPSByZW1vdGUuY29tbWl0KCkubWVzc2FnZSgieCIpLmNyZWF0ZSgpOworCQlSZXZDb21taXQgZm9vQ2hpbGQgPSByZW1vdGUuY29tbWl0KCkubWVzc2FnZSgieCIpLnBhcmVudChmb29QYXJlbnQpLmNyZWF0ZSgpOworCQlSZXZDb21taXQgYmFyUGFyZW50ID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoInkiKS5jcmVhdGUoKTsKKwkJUmV2Q29tbWl0IGJhckNoaWxkID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoInkiKS5wYXJlbnQoYmFyUGFyZW50KS5jcmVhdGUoKTsKKwkJcmVtb3RlLnVwZGF0ZSgiYnJhbmNoMSIsIGZvb0NoaWxkKTsKKwkJcmVtb3RlLnVwZGF0ZSgiYnJhbmNoMiIsIGJhckNoaWxkKTsKKworCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSByZWN2U3RyZWFtID0gdXBsb2FkUGFja1YyKAorCQkJImNvbW1hbmQ9ZmV0Y2hcbiIsCisJCQlQYWNrZXRMaW5lSW4uREVMSU0sCisJCQkid2FudCAiICsgZm9vQ2hpbGQudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICJcbiIsCisJCQkid2FudCAiICsgYmFyQ2hpbGQudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICJcbiIsCisJCQkiaGF2ZSAiICsgZm9vUGFyZW50LnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiXG4iLAorCQkJUGFja2V0TGluZUluLkVORCk7CisJCVBhY2tldExpbmVJbiBwY2tJbiA9IG5ldyBQYWNrZXRMaW5lSW4ocmVjdlN0cmVhbSk7CisKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKCJhY2tub3dsZWRnbWVudHMiKSk7CisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcygiQUNLICIgKyBmb29QYXJlbnQudG9PYmplY3RJZCgpLmdldE5hbWUoKSkpOworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgdGhlSW5zdGFuY2UoUGFja2V0TGluZUluLkVORCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFYyRmV0Y2hTZXJ2ZXJTdG9wc05lZ290aWF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJldkNvbW1pdCBmb29QYXJlbnQgPSByZW1vdGUuY29tbWl0KCkubWVzc2FnZSgieCIpLmNyZWF0ZSgpOworCQlSZXZDb21taXQgZm9vQ2hpbGQgPSByZW1vdGUuY29tbWl0KCkubWVzc2FnZSgieCIpLnBhcmVudChmb29QYXJlbnQpLmNyZWF0ZSgpOworCQlSZXZDb21taXQgYmFyUGFyZW50ID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoInkiKS5jcmVhdGUoKTsKKwkJUmV2Q29tbWl0IGJhckNoaWxkID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoInkiKS5wYXJlbnQoYmFyUGFyZW50KS5jcmVhdGUoKTsKKwkJcmVtb3RlLnVwZGF0ZSgiYnJhbmNoMSIsIGZvb0NoaWxkKTsKKwkJcmVtb3RlLnVwZGF0ZSgiYnJhbmNoMiIsIGJhckNoaWxkKTsKKworCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSByZWN2U3RyZWFtID0gdXBsb2FkUGFja1YyKAorCQkJImNvbW1hbmQ9ZmV0Y2hcbiIsCisJCQlQYWNrZXRMaW5lSW4uREVMSU0sCisJCQkid2FudCAiICsgZm9vQ2hpbGQudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICJcbiIsCisJCQkid2FudCAiICsgYmFyQ2hpbGQudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICJcbiIsCisJCQkiaGF2ZSAiICsgZm9vUGFyZW50LnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiXG4iLAorCQkJImhhdmUgIiArIGJhclBhcmVudC50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIlxuIiwKKwkJCVBhY2tldExpbmVJbi5FTkQpOworCQlQYWNrZXRMaW5lSW4gcGNrSW4gPSBuZXcgUGFja2V0TGluZUluKHJlY3ZTdHJlYW0pOworCisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcygiYWNrbm93bGVkZ21lbnRzIikpOworCQlhc3NlcnRUaGF0KAorCQkJQXJyYXlzLmFzTGlzdChwY2tJbi5yZWFkU3RyaW5nKCksIHBja0luLnJlYWRTdHJpbmcoKSksCisJCQloYXNJdGVtcygKKwkJCQkiQUNLICIgKyBmb29QYXJlbnQudG9PYmplY3RJZCgpLmdldE5hbWUoKSwKKwkJCQkiQUNLICIgKyBiYXJQYXJlbnQudG9PYmplY3RJZCgpLmdldE5hbWUoKSkpOworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXMoInJlYWR5IikpOworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgdGhlSW5zdGFuY2UoUGFja2V0TGluZUluLkRFTElNKSk7CisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcygicGFja2ZpbGUiKSk7CisJCXBhcnNlUGFjayhyZWN2U3RyZWFtKTsKKwkJYXNzZXJ0RmFsc2UoY2xpZW50Lmhhc09iamVjdChmb29QYXJlbnQudG9PYmplY3RJZCgpKSk7CisJCWFzc2VydFRydWUoY2xpZW50Lmhhc09iamVjdChmb29DaGlsZC50b09iamVjdElkKCkpKTsKKwkJYXNzZXJ0RmFsc2UoY2xpZW50Lmhhc09iamVjdChiYXJQYXJlbnQudG9PYmplY3RJZCgpKSk7CisJCWFzc2VydFRydWUoY2xpZW50Lmhhc09iamVjdChiYXJDaGlsZC50b09iamVjdElkKCkpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RWMkZldGNoQ2xpZW50U3RvcHNOZWdvdGlhdGlvbigpIHRocm93cyBFeGNlcHRpb24geworCQlSZXZDb21taXQgZm9vUGFyZW50ID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoIngiKS5jcmVhdGUoKTsKKwkJUmV2Q29tbWl0IGZvb0NoaWxkID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoIngiKS5wYXJlbnQoZm9vUGFyZW50KS5jcmVhdGUoKTsKKwkJUmV2Q29tbWl0IGJhclBhcmVudCA9IHJlbW90ZS5jb21taXQoKS5tZXNzYWdlKCJ5IikuY3JlYXRlKCk7CisJCVJldkNvbW1pdCBiYXJDaGlsZCA9IHJlbW90ZS5jb21taXQoKS5tZXNzYWdlKCJ5IikucGFyZW50KGJhclBhcmVudCkuY3JlYXRlKCk7CisJCXJlbW90ZS51cGRhdGUoImJyYW5jaDEiLCBmb29DaGlsZCk7CisJCXJlbW90ZS51cGRhdGUoImJyYW5jaDIiLCBiYXJDaGlsZCk7CisKKwkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gcmVjdlN0cmVhbSA9IHVwbG9hZFBhY2tWMigKKwkJCSJjb21tYW5kPWZldGNoXG4iLAorCQkJUGFja2V0TGluZUluLkRFTElNLAorCQkJIndhbnQgIiArIGZvb0NoaWxkLnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiXG4iLAorCQkJIndhbnQgIiArIGJhckNoaWxkLnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiXG4iLAorCQkJImhhdmUgIiArIGZvb1BhcmVudC50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIlxuIiwKKwkJCSJkb25lXG4iLAorCQkJUGFja2V0TGluZUluLkVORCk7CisJCVBhY2tldExpbmVJbiBwY2tJbiA9IG5ldyBQYWNrZXRMaW5lSW4ocmVjdlN0cmVhbSk7CisKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKCJwYWNrZmlsZSIpKTsKKwkJcGFyc2VQYWNrKHJlY3ZTdHJlYW0pOworCQlhc3NlcnRGYWxzZShjbGllbnQuaGFzT2JqZWN0KGZvb1BhcmVudC50b09iamVjdElkKCkpKTsKKwkJYXNzZXJ0VHJ1ZShjbGllbnQuaGFzT2JqZWN0KGZvb0NoaWxkLnRvT2JqZWN0SWQoKSkpOworCQlhc3NlcnRUcnVlKGNsaWVudC5oYXNPYmplY3QoYmFyUGFyZW50LnRvT2JqZWN0SWQoKSkpOworCQlhc3NlcnRUcnVlKGNsaWVudC5oYXNPYmplY3QoYmFyQ2hpbGQudG9PYmplY3RJZCgpKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VjJGZXRjaFRoaW5QYWNrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBjb21tb25JbkJsb2IgPSAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiOworCisJCVJldkJsb2IgcGFyZW50QmxvYiA9IHJlbW90ZS5ibG9iKGNvbW1vbkluQmxvYiArICJhIik7CisJCVJldkNvbW1pdCBwYXJlbnQgPSByZW1vdGUuY29tbWl0KHJlbW90ZS50cmVlKHJlbW90ZS5maWxlKCJmb28iLCBwYXJlbnRCbG9iKSkpOworCQlSZXZCbG9iIGNoaWxkQmxvYiA9IHJlbW90ZS5ibG9iKGNvbW1vbkluQmxvYiArICJiIik7CisJCVJldkNvbW1pdCBjaGlsZCA9IHJlbW90ZS5jb21taXQocmVtb3RlLnRyZWUocmVtb3RlLmZpbGUoImZvbyIsIGNoaWxkQmxvYikpLCBwYXJlbnQpOworCQlyZW1vdGUudXBkYXRlKCJicmFuY2gxIiwgY2hpbGQpOworCisJCS8vIFByZXRlbmQgdGhhdCB3ZSBoYXZlIHBhcmVudCB0byBnZXQgYSB0aGluIHBhY2sgYmFzZWQgb24gaXQuCisJCUJ5dGVBcnJheUlucHV0U3RyZWFtIHJlY3ZTdHJlYW0gPSB1cGxvYWRQYWNrVjIoCisJCQkiY29tbWFuZD1mZXRjaFxuIiwKKwkJCVBhY2tldExpbmVJbi5ERUxJTSwKKwkJCSJ3YW50ICIgKyBjaGlsZC50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIlxuIiwKKwkJCSJoYXZlICIgKyBwYXJlbnQudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICJcbiIsCisJCQkidGhpbi1wYWNrXG4iLAorCQkJImRvbmVcbiIsCisJCQlQYWNrZXRMaW5lSW4uRU5EKTsKKwkJUGFja2V0TGluZUluIHBja0luID0gbmV3IFBhY2tldExpbmVJbihyZWN2U3RyZWFtKTsKKworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXMoInBhY2tmaWxlIikpOworCisJCS8vIFZlcmlmeSB0aGF0IHdlIHJlY2VpdmVkIGEgdGhpbiBwYWNrIGJ5IHRyeWluZyB0byBhcHBseSBpdAorCQkvLyBhZ2FpbnN0IHRoZSBjbGllbnQgcmVwbywgd2hpY2ggZG9lcyBub3QgaGF2ZSBwYXJlbnQuCisJCXRocm93bi5leHBlY3QoSU9FeGNlcHRpb24uY2xhc3MpOworCQl0aHJvd24uZXhwZWN0TWVzc2FnZSgicGFjayBoYXMgdW5yZXNvbHZlZCBkZWx0YXMiKTsKKwkJcGFyc2VQYWNrKHJlY3ZTdHJlYW0pOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFYyRmV0Y2hOb1Byb2dyZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJldkNvbW1pdCBjb21taXQgPSByZW1vdGUuY29tbWl0KCkubWVzc2FnZSgieCIpLmNyZWF0ZSgpOworCQlyZW1vdGUudXBkYXRlKCJicmFuY2gxIiwgY29tbWl0KTsKKworCQkvLyBXaXRob3V0IG5vLXByb2dyZXNzLCBwcm9ncmVzcyBpcyByZXBvcnRlZC4KKwkJU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOworCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSByZWN2U3RyZWFtID0gdXBsb2FkUGFja1YyKAorCQkJImNvbW1hbmQ9ZmV0Y2hcbiIsCisJCQlQYWNrZXRMaW5lSW4uREVMSU0sCisJCQkid2FudCAiICsgY29tbWl0LnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiXG4iLAorCQkJImRvbmVcbiIsCisJCQlQYWNrZXRMaW5lSW4uRU5EKTsKKwkJUGFja2V0TGluZUluIHBja0luID0gbmV3IFBhY2tldExpbmVJbihyZWN2U3RyZWFtKTsKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKCJwYWNrZmlsZSIpKTsKKwkJcGFyc2VQYWNrKHJlY3ZTdHJlYW0sIG5ldyBUZXh0UHJvZ3Jlc3NNb25pdG9yKHN3KSk7CisJCWFzc2VydEZhbHNlKHN3LnRvU3RyaW5nKCkuaXNFbXB0eSgpKTsKKworCQkvLyBXaXRoIG5vLXByb2dyZXNzLCBwcm9ncmVzcyBpcyBub3QgcmVwb3J0ZWQuCisJCXN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOworCQlyZWN2U3RyZWFtID0gdXBsb2FkUGFja1YyKAorCQkJImNvbW1hbmQ9ZmV0Y2hcbiIsCisJCQlQYWNrZXRMaW5lSW4uREVMSU0sCisJCQkid2FudCAiICsgY29tbWl0LnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiXG4iLAorCQkJIm5vLXByb2dyZXNzXG4iLAorCQkJImRvbmVcbiIsCisJCQlQYWNrZXRMaW5lSW4uRU5EKTsKKwkJcGNrSW4gPSBuZXcgUGFja2V0TGluZUluKHJlY3ZTdHJlYW0pOworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXMoInBhY2tmaWxlIikpOworCQlwYXJzZVBhY2socmVjdlN0cmVhbSwgbmV3IFRleHRQcm9ncmVzc01vbml0b3Ioc3cpKTsKKwkJYXNzZXJ0VHJ1ZShzdy50b1N0cmluZygpLmlzRW1wdHkoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VjJGZXRjaEluY2x1ZGVUYWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmV2Q29tbWl0IGNvbW1pdCA9IHJlbW90ZS5jb21taXQoKS5tZXNzYWdlKCJ4IikuY3JlYXRlKCk7CisJCVJldlRhZyB0YWcgPSByZW1vdGUudGFnKCJ0YWciLCBjb21taXQpOworCQlyZW1vdGUudXBkYXRlKCJicmFuY2gxIiwgY29tbWl0KTsKKwkJcmVtb3RlLnVwZGF0ZSgicmVmcy90YWdzL3RhZyIsIHRhZyk7CisKKwkJLy8gV2l0aG91dCBpbmNsdWRlLXRhZy4KKwkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gcmVjdlN0cmVhbSA9IHVwbG9hZFBhY2tWMigKKwkJCSJjb21tYW5kPWZldGNoXG4iLAorCQkJUGFja2V0TGluZUluLkRFTElNLAorCQkJIndhbnQgIiArIGNvbW1pdC50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIlxuIiwKKwkJCSJkb25lXG4iLAorCQkJUGFja2V0TGluZUluLkVORCk7CisJCVBhY2tldExpbmVJbiBwY2tJbiA9IG5ldyBQYWNrZXRMaW5lSW4ocmVjdlN0cmVhbSk7CisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcygicGFja2ZpbGUiKSk7CisJCXBhcnNlUGFjayhyZWN2U3RyZWFtKTsKKwkJYXNzZXJ0RmFsc2UoY2xpZW50Lmhhc09iamVjdCh0YWcudG9PYmplY3RJZCgpKSk7CisKKwkJLy8gV2l0aCB0YWcuCisJCXJlY3ZTdHJlYW0gPSB1cGxvYWRQYWNrVjIoCisJCQkiY29tbWFuZD1mZXRjaFxuIiwKKwkJCVBhY2tldExpbmVJbi5ERUxJTSwKKwkJCSJ3YW50ICIgKyBjb21taXQudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICJcbiIsCisJCQkiaW5jbHVkZS10YWdcbiIsCisJCQkiZG9uZVxuIiwKKwkJCVBhY2tldExpbmVJbi5FTkQpOworCQlwY2tJbiA9IG5ldyBQYWNrZXRMaW5lSW4ocmVjdlN0cmVhbSk7CisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcygicGFja2ZpbGUiKSk7CisJCXBhcnNlUGFjayhyZWN2U3RyZWFtKTsKKwkJYXNzZXJ0VHJ1ZShjbGllbnQuaGFzT2JqZWN0KHRhZy50b09iamVjdElkKCkpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RWMkZldGNoT2ZzRGVsdGEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGNvbW1vbkluQmxvYiA9ICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiI7CisKKwkJUmV2QmxvYiBwYXJlbnRCbG9iID0gcmVtb3RlLmJsb2IoY29tbW9uSW5CbG9iICsgImEiKTsKKwkJUmV2Q29tbWl0IHBhcmVudCA9IHJlbW90ZS5jb21taXQocmVtb3RlLnRyZWUocmVtb3RlLmZpbGUoImZvbyIsIHBhcmVudEJsb2IpKSk7CisJCVJldkJsb2IgY2hpbGRCbG9iID0gcmVtb3RlLmJsb2IoY29tbW9uSW5CbG9iICsgImIiKTsKKwkJUmV2Q29tbWl0IGNoaWxkID0gcmVtb3RlLmNvbW1pdChyZW1vdGUudHJlZShyZW1vdGUuZmlsZSgiZm9vIiwgY2hpbGRCbG9iKSksIHBhcmVudCk7CisJCXJlbW90ZS51cGRhdGUoImJyYW5jaDEiLCBjaGlsZCk7CisKKwkJLy8gV2l0aG91dCBvZnMtZGVsdGEuCisJCUJ5dGVBcnJheUlucHV0U3RyZWFtIHJlY3ZTdHJlYW0gPSB1cGxvYWRQYWNrVjIoCisJCQkiY29tbWFuZD1mZXRjaFxuIiwKKwkJCVBhY2tldExpbmVJbi5ERUxJTSwKKwkJCSJ3YW50ICIgKyBjaGlsZC50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIlxuIiwKKwkJCSJkb25lXG4iLAorCQkJUGFja2V0TGluZUluLkVORCk7CisJCVBhY2tldExpbmVJbiBwY2tJbiA9IG5ldyBQYWNrZXRMaW5lSW4ocmVjdlN0cmVhbSk7CisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcygicGFja2ZpbGUiKSk7CisJCVJlY2VpdmVkUGFja1N0YXRpc3RpY3Mgc3RhdHMgPSBwYXJzZVBhY2socmVjdlN0cmVhbSk7CisJCWFzc2VydFRydWUoc3RhdHMuZ2V0TnVtT2ZzRGVsdGEoKSA9PSAwKTsKKworCQkvLyBXaXRoIG9mcy1kZWx0YS4KKwkJcmVjdlN0cmVhbSA9IHVwbG9hZFBhY2tWMigKKwkJCSJjb21tYW5kPWZldGNoXG4iLAorCQkJUGFja2V0TGluZUluLkRFTElNLAorCQkJIndhbnQgIiArIGNoaWxkLnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiXG4iLAorCQkJIm9mcy1kZWx0YVxuIiwKKwkJCSJkb25lXG4iLAorCQkJUGFja2V0TGluZUluLkVORCk7CisJCXBja0luID0gbmV3IFBhY2tldExpbmVJbihyZWN2U3RyZWFtKTsKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKCJwYWNrZmlsZSIpKTsKKwkJc3RhdHMgPSBwYXJzZVBhY2socmVjdlN0cmVhbSk7CisJCWFzc2VydFRydWUoc3RhdHMuZ2V0TnVtT2ZzRGVsdGEoKSAhPSAwKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RWMkZldGNoU2hhbGxvdygpIHRocm93cyBFeGNlcHRpb24geworCQlSZXZDb21taXQgY29tbW9uUGFyZW50ID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoInBhcmVudCIpLmNyZWF0ZSgpOworCQlSZXZDb21taXQgZm9vQ2hpbGQgPSByZW1vdGUuY29tbWl0KCkubWVzc2FnZSgieCIpLnBhcmVudChjb21tb25QYXJlbnQpLmNyZWF0ZSgpOworCQlSZXZDb21taXQgYmFyQ2hpbGQgPSByZW1vdGUuY29tbWl0KCkubWVzc2FnZSgieSIpLnBhcmVudChjb21tb25QYXJlbnQpLmNyZWF0ZSgpOworCQlyZW1vdGUudXBkYXRlKCJicmFuY2gxIiwgYmFyQ2hpbGQpOworCisJCS8vIFdpdGhvdXQgc2hhbGxvdywgdGhlIHNlcnZlciB0aGlua3MgdGhhdCB3ZSBoYXZlCisJCS8vIGNvbW1vblBhcmVudCwgc28gaXQgZG9lc24ndCBzZW5kIGl0LgorCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSByZWN2U3RyZWFtID0gdXBsb2FkUGFja1YyKAorCQkJImNvbW1hbmQ9ZmV0Y2hcbiIsCisJCQlQYWNrZXRMaW5lSW4uREVMSU0sCisJCQkid2FudCAiICsgYmFyQ2hpbGQudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICJcbiIsCisJCQkiaGF2ZSAiICsgZm9vQ2hpbGQudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICJcbiIsCisJCQkiZG9uZVxuIiwKKwkJCVBhY2tldExpbmVJbi5FTkQpOworCQlQYWNrZXRMaW5lSW4gcGNrSW4gPSBuZXcgUGFja2V0TGluZUluKHJlY3ZTdHJlYW0pOworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXMoInBhY2tmaWxlIikpOworCQlwYXJzZVBhY2socmVjdlN0cmVhbSk7CisJCWFzc2VydFRydWUoY2xpZW50Lmhhc09iamVjdChiYXJDaGlsZC50b09iamVjdElkKCkpKTsKKwkJYXNzZXJ0RmFsc2UoY2xpZW50Lmhhc09iamVjdChjb21tb25QYXJlbnQudG9PYmplY3RJZCgpKSk7CisKKwkJLy8gV2l0aCBzaGFsbG93LCB0aGUgc2VydmVyIGtub3dzIHRoYXQgd2UgZG9uJ3QgaGF2ZQorCQkvLyBjb21tb25QYXJlbnQsIHNvIGl0IHNlbmRzIGl0LgorCQlyZWN2U3RyZWFtID0gdXBsb2FkUGFja1YyKAorCQkJImNvbW1hbmQ9ZmV0Y2hcbiIsCisJCQlQYWNrZXRMaW5lSW4uREVMSU0sCisJCQkid2FudCAiICsgYmFyQ2hpbGQudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICJcbiIsCisJCQkiaGF2ZSAiICsgZm9vQ2hpbGQudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICJcbiIsCisJCQkic2hhbGxvdyAiICsgZm9vQ2hpbGQudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICJcbiIsCisJCQkiZG9uZVxuIiwKKwkJCVBhY2tldExpbmVJbi5FTkQpOworCQlwY2tJbiA9IG5ldyBQYWNrZXRMaW5lSW4ocmVjdlN0cmVhbSk7CisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcygicGFja2ZpbGUiKSk7CisJCXBhcnNlUGFjayhyZWN2U3RyZWFtKTsKKwkJYXNzZXJ0VHJ1ZShjbGllbnQuaGFzT2JqZWN0KGNvbW1vblBhcmVudC50b09iamVjdElkKCkpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RWMkZldGNoRGVlcGVuQW5kRG9uZSgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXZDb21taXQgcGFyZW50ID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoInBhcmVudCIpLmNyZWF0ZSgpOworCQlSZXZDb21taXQgY2hpbGQgPSByZW1vdGUuY29tbWl0KCkubWVzc2FnZSgieCIpLnBhcmVudChwYXJlbnQpLmNyZWF0ZSgpOworCQlyZW1vdGUudXBkYXRlKCJicmFuY2gxIiwgY2hpbGQpOworCisJCS8vICJkZWVwZW4gMSIgc2VuZHMgb25seSB0aGUgY2hpbGQuCisJCUJ5dGVBcnJheUlucHV0U3RyZWFtIHJlY3ZTdHJlYW0gPSB1cGxvYWRQYWNrVjIoCisJCQkiY29tbWFuZD1mZXRjaFxuIiwKKwkJCVBhY2tldExpbmVJbi5ERUxJTSwKKwkJCSJ3YW50ICIgKyBjaGlsZC50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIlxuIiwKKwkJCSJkZWVwZW4gMVxuIiwKKwkJCSJkb25lXG4iLAorCQkJUGFja2V0TGluZUluLkVORCk7CisJCVBhY2tldExpbmVJbiBwY2tJbiA9IG5ldyBQYWNrZXRMaW5lSW4ocmVjdlN0cmVhbSk7CisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcygic2hhbGxvdy1pbmZvIikpOworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXMoInNoYWxsb3cgIiArIGNoaWxkLnRvT2JqZWN0SWQoKS5nZXROYW1lKCkpKTsKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIHRoZUluc3RhbmNlKFBhY2tldExpbmVJbi5ERUxJTSkpOworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXMoInBhY2tmaWxlIikpOworCQlwYXJzZVBhY2socmVjdlN0cmVhbSk7CisJCWFzc2VydFRydWUoY2xpZW50Lmhhc09iamVjdChjaGlsZC50b09iamVjdElkKCkpKTsKKwkJYXNzZXJ0RmFsc2UoY2xpZW50Lmhhc09iamVjdChwYXJlbnQudG9PYmplY3RJZCgpKSk7CisKKwkJLy8gV2l0aG91dCB0aGF0LCB0aGUgcGFyZW50IGlzIHNlbnQgdG9vLgorCQlyZWN2U3RyZWFtID0gdXBsb2FkUGFja1YyKAorCQkJImNvbW1hbmQ9ZmV0Y2hcbiIsCisJCQlQYWNrZXRMaW5lSW4uREVMSU0sCisJCQkid2FudCAiICsgY2hpbGQudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICJcbiIsCisJCQkiZG9uZVxuIiwKKwkJCVBhY2tldExpbmVJbi5FTkQpOworCQlwY2tJbiA9IG5ldyBQYWNrZXRMaW5lSW4ocmVjdlN0cmVhbSk7CisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcygicGFja2ZpbGUiKSk7CisJCXBhcnNlUGFjayhyZWN2U3RyZWFtKTsKKwkJYXNzZXJ0VHJ1ZShjbGllbnQuaGFzT2JqZWN0KHBhcmVudC50b09iamVjdElkKCkpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RWMkZldGNoRGVlcGVuV2l0aG91dERvbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmV2Q29tbWl0IHBhcmVudCA9IHJlbW90ZS5jb21taXQoKS5tZXNzYWdlKCJwYXJlbnQiKS5jcmVhdGUoKTsKKwkJUmV2Q29tbWl0IGNoaWxkID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoIngiKS5wYXJlbnQocGFyZW50KS5jcmVhdGUoKTsKKwkJcmVtb3RlLnVwZGF0ZSgiYnJhbmNoMSIsIGNoaWxkKTsKKworCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSByZWN2U3RyZWFtID0gdXBsb2FkUGFja1YyKAorCQkJImNvbW1hbmQ9ZmV0Y2hcbiIsCisJCQlQYWNrZXRMaW5lSW4uREVMSU0sCisJCQkid2FudCAiICsgY2hpbGQudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICJcbiIsCisJCQkiZGVlcGVuIDFcbiIsCisJCQlQYWNrZXRMaW5lSW4uRU5EKTsKKwkJUGFja2V0TGluZUluIHBja0luID0gbmV3IFBhY2tldExpbmVJbihyZWN2U3RyZWFtKTsKKworCQkvLyBWZXJpZnkgdGhhdCBvbmx5IHRoZSBjb3JyZWN0IHNlY3Rpb24gaXMgc2VudC4gInNoYWxsb3ctaW5mbyIKKwkJLy8gaXMgbm90IHNlbnQgYmVjYXVzZSwgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpY2F0aW9uLCBpdCBpcworCQkvLyBzZW50IG9ubHkgaWYgYSBwYWNrZmlsZSBpcyBzZW50LgorCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXMoImFja25vd2xlZGdtZW50cyIpKTsKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKCJOQUsiKSk7CisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCB0aGVJbnN0YW5jZShQYWNrZXRMaW5lSW4uRU5EKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VjJGZXRjaFVucmVjb2duaXplZEFyZ3VtZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRocm93bi5leHBlY3QoUGFja1Byb3RvY29sRXhjZXB0aW9uLmNsYXNzKTsKKwkJdGhyb3duLmV4cGVjdE1lc3NhZ2UoInVuZXhwZWN0ZWQgaW52YWxpZC1hcmd1bWVudCIpOworCQl1cGxvYWRQYWNrVjIoCisJCQkiY29tbWFuZD1mZXRjaFxuIiwKKwkJCVBhY2tldExpbmVJbi5ERUxJTSwKKwkJCSJpbnZhbGlkLWFyZ3VtZW50XG4iLAorCQkJUGFja2V0TGluZUluLkVORCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VjJGZXRjaEZpbHRlcigpIHRocm93cyBFeGNlcHRpb24geworCQlSZXZCbG9iIGJpZyA9IHJlbW90ZS5ibG9iKCJmb29iYXIiKTsKKwkJUmV2QmxvYiBzbWFsbCA9IHJlbW90ZS5ibG9iKCJmb29iYSIpOworCQlSZXZUcmVlIHRyZWUgPSByZW1vdGUudHJlZShyZW1vdGUuZmlsZSgiMSIsIGJpZyksCisJCQkJcmVtb3RlLmZpbGUoIjIiLCBzbWFsbCkpOworCQlSZXZDb21taXQgY29tbWl0ID0gcmVtb3RlLmNvbW1pdCh0cmVlKTsKKwkJcmVtb3RlLnVwZGF0ZSgibWFzdGVyIiwgY29tbWl0KTsKKworCQlzZXJ2ZXIuZ2V0Q29uZmlnKCkuc2V0Qm9vbGVhbigidXBsb2FkcGFjayIsIG51bGwsICJhbGxvd2ZpbHRlciIsIHRydWUpOworCisJCUJ5dGVBcnJheUlucHV0U3RyZWFtIHJlY3ZTdHJlYW0gPSB1cGxvYWRQYWNrVjIoCisJCQkiY29tbWFuZD1mZXRjaFxuIiwKKwkJCVBhY2tldExpbmVJbi5ERUxJTSwKKwkJCSJ3YW50ICIgKyBjb21taXQudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICJcbiIsCisJCQkiZmlsdGVyIGJsb2I6bGltaXQ9NVxuIiwKKwkJCSJkb25lXG4iLAorCQkJUGFja2V0TGluZUluLkVORCk7CisJCVBhY2tldExpbmVJbiBwY2tJbiA9IG5ldyBQYWNrZXRMaW5lSW4ocmVjdlN0cmVhbSk7CisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcygicGFja2ZpbGUiKSk7CisJCXBhcnNlUGFjayhyZWN2U3RyZWFtKTsKKworCQlhc3NlcnRGYWxzZShjbGllbnQuaGFzT2JqZWN0KGJpZy50b09iamVjdElkKCkpKTsKKwkJYXNzZXJ0VHJ1ZShjbGllbnQuaGFzT2JqZWN0KHNtYWxsLnRvT2JqZWN0SWQoKSkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFYyRmV0Y2hGaWx0ZXJXaGVuTm90QWxsb3dlZCgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXZDb21taXQgY29tbWl0ID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoIjAiKS5jcmVhdGUoKTsKKwkJcmVtb3RlLnVwZGF0ZSgibWFzdGVyIiwgY29tbWl0KTsKKworCQlzZXJ2ZXIuZ2V0Q29uZmlnKCkuc2V0Qm9vbGVhbigidXBsb2FkcGFjayIsIG51bGwsICJhbGxvd2ZpbHRlciIsIGZhbHNlKTsKKworCQl0aHJvd24uZXhwZWN0KFBhY2tQcm90b2NvbEV4Y2VwdGlvbi5jbGFzcyk7CisJCXRocm93bi5leHBlY3RNZXNzYWdlKCJ1bmV4cGVjdGVkIGZpbHRlciBibG9iOmxpbWl0PTUiKTsKKwkJdXBsb2FkUGFja1YyKAorCQkJImNvbW1hbmQ9ZmV0Y2hcbiIsCisJCQlQYWNrZXRMaW5lSW4uREVMSU0sCisJCQkid2FudCAiICsgY29tbWl0LnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiXG4iLAorCQkJImZpbHRlciBibG9iOmxpbWl0PTVcbiIsCisJCQkiZG9uZVxuIiwKKwkJCVBhY2tldExpbmVJbi5FTkQpOworCX0KKworCXByaXZhdGUgc3RhdGljIGNsYXNzIFJlamVjdEFsbFJlZkZpbHRlciBpbXBsZW1lbnRzIFJlZkZpbHRlciB7CisJCUBPdmVycmlkZQorCQlwdWJsaWMgTWFwPFN0cmluZywgUmVmPiBmaWx0ZXIoTWFwPFN0cmluZywgUmVmPiByZWZzKSB7CisJCQlyZXR1cm4gbmV3IEhhc2hNYXA8PigpOworCQl9CisJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9XYWxrRW5jcnlwdGlvblRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvV2Fsa0VuY3J5cHRpb25UZXN0LmphdmEKaW5kZXggY2IwNGY4My4uMzNlMjUyOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9XYWxrRW5jcnlwdGlvblRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1dhbGtFbmNyeXB0aW9uVGVzdC5qYXZhCkBAIC00Myw3ICs0Myw3IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuV2Fsa0VuY3J5cHRpb25UZXN0LlV0aWwuY3J5cHRvQ2lwaGVyTGlzdFBCRTsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuV2Fsa0VuY3J5cHRpb25UZXN0LlV0aWwuY3J5cHRvQ2lwaGVyTGlzdFRyYW5zOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5XYWxrRW5jcnlwdGlvblRlc3QuVXRpbC5mb2xkZXJEZWxldGU7CkBAIC0zNjAsNyArMzYwLDcgQEAgc3RhdGljIGNsYXNzIFV0aWwgewogCQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgogCQkgKi8KIAkJc3RhdGljIFN0cmluZyB0ZXh0UmVhZChGaWxlIGZpbGUpIHRocm93cyBFeGNlcHRpb24gewotCQkJcmV0dXJuIG5ldyBTdHJpbmcoRmlsZXMucmVhZEFsbEJ5dGVzKGZpbGUudG9QYXRoKCkpLCBVVEZfOCk7CisJCQlyZXR1cm4gbmV3IFN0cmluZyhGaWxlcy5yZWFkQWxsQnl0ZXMoZmlsZS50b1BhdGgoKSksIENIQVJTRVQpOwogCQl9CiAKIAkJLyoqCkBAIC0zNzEsNyArMzcxLDcgQEAgc3RhdGljIFN0cmluZyB0ZXh0UmVhZChGaWxlIGZpbGUpIHRocm93cyBFeGNlcHRpb24gewogCQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgogCQkgKi8KIAkJc3RhdGljIHZvaWQgdGV4dFdyaXRlKEZpbGUgZmlsZSwgU3RyaW5nIHRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQkJRmlsZXMud3JpdGUoZmlsZS50b1BhdGgoKSwgdGV4dC5nZXRCeXRlcyhVVEZfOCkpOworCQkJRmlsZXMud3JpdGUoZmlsZS50b1BhdGgoKSwgdGV4dC5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCX0KIAogCQlzdGF0aWMgdm9pZCB2ZXJpZnlGaWxlQ29udGVudChGaWxlIGZpbGVPbmUsIEZpbGUgZmlsZVR3bykKQEAgLTQxOSwxMiArNDE5LDkgQEAgc3RhdGljIFN0cmluZyBwdWJsaWNBZGRyZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCQkJVVJMQ29ubmVjdGlvbiBjID0gdXJsLm9wZW5Db25uZWN0aW9uKCk7CiAJCQkJYy5zZXRDb25uZWN0VGltZW91dCg1MDApOwogCQkJCWMuc2V0UmVhZFRpbWVvdXQoNTAwKTsKLQkJCQlCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoCi0JCQkJCQluZXcgSW5wdXRTdHJlYW1SZWFkZXIoYy5nZXRJbnB1dFN0cmVhbSgpKSk7Ci0JCQkJdHJ5IHsKKwkJCQl0cnkgKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcigKKwkJCQkJCW5ldyBJbnB1dFN0cmVhbVJlYWRlcihjLmdldElucHV0U3RyZWFtKCkpKSkgewogCQkJCQlyZXR1cm4gcmVhZGVyLnJlYWRMaW5lKCk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJcmVhZGVyLmNsb3NlKCk7CiAJCQkJfQogCQkJfSBjYXRjaCAoVW5rbm93bkhvc3RFeGNlcHRpb24gfCBTb2NrZXRUaW1lb3V0RXhjZXB0aW9uIGUpIHsKIAkJCQlyZXR1cm4gIkNhbid0IHJlYWNoIGh0dHA6Ly9jaGVja2lwLmFtYXpvbmF3cy5jb20gdG8iCkBAIC02NTQsOSArNjUxLDkgQEAgc3RhdGljIHZvaWQgY29uZmlnQ3JlYXRlKFN0cmluZyBhbGdvcml0aG0pIHRocm93cyBFeGNlcHRpb24gewogCQkJUHJvcGVydGllcyBwcm9wcyA9IFByb3BzLmRpc2NvdmVyKCk7CiAJCQlwcm9wcy5wdXQoQW1hem9uUzMuS2V5cy5QQVNTV09SRCwgSkdJVF9QQVNTKTsKIAkJCXByb3BzLnB1dChBbWF6b25TMy5LZXlzLkNSWVBUT19BTEcsIGFsZ29yaXRobSk7Ci0JCQlQcmludFdyaXRlciB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoSkdJVF9DT05GX0ZJTEUpOwotCQkJcHJvcHMuc3RvcmUod3JpdGVyLCAiSkdJVCBTMyBjb25uZWN0aW9uIGNvbmZpZ3VyYXRpb24gZmlsZS4iKTsKLQkJCXdyaXRlci5jbG9zZSgpOworCQkJdHJ5IChQcmludFdyaXRlciB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoSkdJVF9DT05GX0ZJTEUpKSB7CisJCQkJcHJvcHMuc3RvcmUod3JpdGVyLCAiSkdJVCBTMyBjb25uZWN0aW9uIGNvbmZpZ3VyYXRpb24gZmlsZS4iKTsKKwkJCX0KIAkJfQogCiAJCS8qKgpAQCAtNjY4LDkgKzY2NSw5IEBAIHN0YXRpYyB2b2lkIGNvbmZpZ0NyZWF0ZShTdHJpbmcgYWxnb3JpdGhtKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJc3RhdGljIHZvaWQgY29uZmlnQ3JlYXRlKFByb3BlcnRpZXMgc291cmNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCVByb3BlcnRpZXMgdGFyZ2V0ID0gUHJvcHMuZGlzY292ZXIoKTsKIAkJCXRhcmdldC5wdXRBbGwoc291cmNlKTsKLQkJCVByaW50V3JpdGVyIHdyaXRlciA9IG5ldyBQcmludFdyaXRlcihKR0lUX0NPTkZfRklMRSk7Ci0JCQl0YXJnZXQuc3RvcmUod3JpdGVyLCAiSkdJVCBTMyBjb25uZWN0aW9uIGNvbmZpZ3VyYXRpb24gZmlsZS4iKTsKLQkJCXdyaXRlci5jbG9zZSgpOworCQkJdHJ5IChQcmludFdyaXRlciB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoSkdJVF9DT05GX0ZJTEUpKSB7CisJCQkJdGFyZ2V0LnN0b3JlKHdyaXRlciwgIkpHSVQgUzMgY29ubmVjdGlvbiBjb25maWd1cmF0aW9uIGZpbGUuIik7CisJCQl9CiAJCX0KIAogCQkvKioKQEAgLTc0MSw3ICs3MzgsNyBAQCBzdGF0aWMgdm9pZCByZW1vdGVWZXJpZnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCUFtYXpvblMzIHMzID0gbmV3IEFtYXpvblMzKHByb3BzKTsKIAkJCVN0cmluZyBmaWxlID0gSkdJVF9VU0VSICsgIi0iICsgVVVJRC5yYW5kb21VVUlEKCkudG9TdHJpbmcoKTsKIAkJCVN0cmluZyBwYXRoID0gSkdJVF9SRU1PVEVfRElSICsgIi8iICsgZmlsZTsKLQkJCXMzLnB1dChidWNrZXQsIHBhdGgsIGZpbGUuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJCXMzLnB1dChidWNrZXQsIHBhdGgsIGZpbGUuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQkJczMuZGVsZXRlKGJ1Y2tldCwgcGF0aCk7CiAJCX0KIApAQCAtODM2LDEwICs4MzMsMTAgQEAgc3RhdGljIHZvaWQgdmVyaWZ5Q3J5cHRvKFdhbGtFbmNyeXB0aW9uIGNyeXB0bykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCXsKIAkJCQlieXRlW10gb3JpZ2luID0gc291cmNlVGV4dC5nZXRCeXRlcyhjaGFyc2V0KTsKIAkJCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gdGFyZ2V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQkJCU91dHB1dFN0cmVhbSBzb3VyY2UgPSBjcnlwdG8uZW5jcnlwdCh0YXJnZXQpOwotCQkJCXNvdXJjZS53cml0ZShvcmlnaW4pOwotCQkJCXNvdXJjZS5mbHVzaCgpOwotCQkJCXNvdXJjZS5jbG9zZSgpOworCQkJCXRyeSAoT3V0cHV0U3RyZWFtIHNvdXJjZSA9IGNyeXB0by5lbmNyeXB0KHRhcmdldCkpIHsKKwkJCQkJc291cmNlLndyaXRlKG9yaWdpbik7CisJCQkJCXNvdXJjZS5mbHVzaCgpOworCQkJCX0KIAkJCQljaXBoZXJUZXh0ID0gdGFyZ2V0LnRvQnl0ZUFycmF5KCk7CiAJCQl9CiAJCQl7CkBAIC0xMDc0LDEwICsxMDcxLDEwIEBAIHZvaWQgY3J5cHRvVGVzdChQcm9wZXJ0aWVzIHByb3BzKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCQlyZW1vdGVDb25maWcudXBkYXRlKGNvbmZpZyk7CiAJCQkJY29uZmlnLnNhdmUoKTsKIAotCQkJCUdpdCBnaXQgPSBHaXQub3BlbihkaXJPbmUpOwotCQkJCWdpdC5jaGVja291dCgpLnNldE5hbWUoIm1hc3RlciIpLmNhbGwoKTsKLQkJCQlnaXQucHVzaCgpLnNldFJlbW90ZShyZW1vdGUpLnNldFJlZlNwZWNzKHNwZWNzKS5jYWxsKCk7Ci0JCQkJZ2l0LmNsb3NlKCk7CisJCQkJdHJ5IChHaXQgZ2l0ID0gR2l0Lm9wZW4oZGlyT25lKSkgeworCQkJCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJtYXN0ZXIiKS5jYWxsKCk7CisJCQkJCWdpdC5wdXNoKCkuc2V0UmVtb3RlKHJlbW90ZSkuc2V0UmVmU3BlY3Moc3BlY3MpLmNhbGwoKTsKKwkJCQl9CiAKIAkJCQlGaWxlIGZpbGVTdGF0aWMgPSBuZXcgRmlsZShkaXJPbmUsIG5hbWVTdGF0aWMpOwogCQkJCWFzc2VydFRydWUoIlByb3ZpZGVkIGJ5IHNldHVwIiwgZmlsZVN0YXRpYy5leGlzdHMoKSk7CkBAIC0xMDg5LDExICsxMDg2LDExIEBAIHZvaWQgY3J5cHRvVGVzdChQcm9wZXJ0aWVzIHByb3BzKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCQlGaWxlIGZpbGVTdGF0aWMgPSBuZXcgRmlsZShkaXJUd28sIG5hbWVTdGF0aWMpOwogCQkJCWFzc2VydEZhbHNlKCJOb3QgUHJvdmlkZWQgYnkgc2V0dXAiLCBmaWxlU3RhdGljLmV4aXN0cygpKTsKIAotCQkJCUdpdCBnaXQgPSBHaXQuY2xvbmVSZXBvc2l0b3J5KCkuc2V0VVJJKHVyaSkuc2V0RGlyZWN0b3J5KGRpclR3bykKLQkJCQkJCS5jYWxsKCk7Ci0JCQkJZ2l0LmNsb3NlKCk7CisJCQkJdHJ5IChHaXQgZ2l0ID0gR2l0LmNsb25lUmVwb3NpdG9yeSgpLnNldFVSSSh1cmkpCisJCQkJCQkuc2V0RGlyZWN0b3J5KGRpclR3bykuY2FsbCgpKSB7CisJCQkJCWFzc2VydFRydWUoIlByb3ZpZGVkIGJ5IGNsb25lIiwgZmlsZVN0YXRpYy5leGlzdHMoKSk7CisJCQkJfQogCi0JCQkJYXNzZXJ0VHJ1ZSgiUHJvdmlkZWQgYnkgY2xvbmUiLCBmaWxlU3RhdGljLmV4aXN0cygpKTsKIAkJCX0KIAogCQkJeyAvLyBWZXJpZnkgc3RhdGljIGZpbGUgY29udGVudC4KQEAgLTExMTEsMTEgKzExMDgsMTEgQEAgdm9pZCBjcnlwdG9UZXN0KFByb3BlcnRpZXMgcHJvcHMpIHRocm93cyBFeGNlcHRpb24gewogCQkJCWFzc2VydFRydWUoIlByb3ZpZGVkIGJ5IGNyZWF0ZSIsIGZpbGVEeW5hbWljLmV4aXN0cygpKTsKIAkJCQlhc3NlcnRUcnVlKCJOZWVkIGNvbnRlbnQgdG8gZW5jcnlwdCIsIGZpbGVEeW5hbWljLmxlbmd0aCgpID4gMCk7CiAKLQkJCQlHaXQgZ2l0ID0gR2l0Lm9wZW4oZGlyT25lKTsKLQkJCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4obmFtZUR5bmFtaWMpLmNhbGwoKTsKLQkJCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZShuYW1lRHluYW1pYykuY2FsbCgpOwotCQkJCWdpdC5wdXNoKCkuc2V0UmVtb3RlKHJlbW90ZSkuc2V0UmVmU3BlY3Moc3BlY3MpLmNhbGwoKTsKLQkJCQlnaXQuY2xvc2UoKTsKKwkJCQl0cnkgKEdpdCBnaXQgPSBHaXQub3BlbihkaXJPbmUpKSB7CisJCQkJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybihuYW1lRHluYW1pYykuY2FsbCgpOworCQkJCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZShuYW1lRHluYW1pYykuY2FsbCgpOworCQkJCQlnaXQucHVzaCgpLnNldFJlbW90ZShyZW1vdGUpLnNldFJlZlNwZWNzKHNwZWNzKS5jYWxsKCk7CisJCQkJfQogCiAJCQl9CiAKQEAgLTExMjQsOSArMTEyMSw5IEBAIHZvaWQgY3J5cHRvVGVzdChQcm9wZXJ0aWVzIHByb3BzKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCQlGaWxlIGZpbGVEeW5hbWljID0gbmV3IEZpbGUoZGlyVHdvLCBuYW1lRHluYW1pYyk7CiAJCQkJYXNzZXJ0RmFsc2UoIk5vdCBQcm92aWRlZCBieSBzZXR1cCIsIGZpbGVEeW5hbWljLmV4aXN0cygpKTsKIAotCQkJCUdpdCBnaXQgPSBHaXQub3BlbihkaXJUd28pOwotCQkJCWdpdC5wdWxsKCkuY2FsbCgpOwotCQkJCWdpdC5jbG9zZSgpOworCQkJCXRyeSAoR2l0IGdpdCA9IEdpdC5vcGVuKGRpclR3bykpIHsKKwkJCQkJZ2l0LnB1bGwoKS5jYWxsKCk7CisJCQkJfQogCiAJCQkJYXNzZXJ0VHJ1ZSgiUHJvdmlkZWQgYnkgcHVsbCIsIGZpbGVEeW5hbWljLmV4aXN0cygpKTsKIAkJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9DYW5vbmljYWxUcmVlUGFyc2VyVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL0Nhbm9uaWNhbFRyZWVQYXJzZXJUZXN0LmphdmEKaW5kZXggZjVlOTdjMi4uNjE5NWU2NCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL0Nhbm9uaWNhbFRyZWVQYXJzZXJUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL0Nhbm9uaWNhbFRyZWVQYXJzZXJUZXN0LmphdmEKQEAgLTkxLDkgKzkxLDkgQEAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCQloYXNoX3NvbWV0cmVlKSwgZW50cnkobTY0NCwgImZvbyIsIGhhc2hfZm9vKSk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIG1rdHJlZShmaW5hbCBieXRlW10uLi4gZGF0YSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIG1rdHJlZShieXRlW10uLi4gZGF0YSkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCWZvciAoZmluYWwgYnl0ZVtdIGUgOiBkYXRhKQorCQlmb3IgKGJ5dGVbXSBlIDogZGF0YSkKIAkJCW91dC53cml0ZShlKTsKIAkJcmV0dXJuIG91dC50b0J5dGVBcnJheSgpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9GaWxlVHJlZUl0ZXJhdG9yVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL0ZpbGVUcmVlSXRlcmF0b3JUZXN0LmphdmEKaW5kZXggZTM0Y2I5Ny4uMGUwMDliOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL0ZpbGVUcmVlSXRlcmF0b3JUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL0ZpbGVUcmVlSXRlcmF0b3JUZXN0LmphdmEKQEAgLTgyMSw3ICs4MjEsNyBAQCBwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydEVudHJ5KFN0cmluZyBzaGExc3RyaW5nLCBTdHJpbmcgcGF0aCwgVHJlZVdhbGsgdHcpCiAJCWFzc2VydEVxdWFscyhzaGExc3RyaW5nLCB0dy5nZXRPYmplY3RJZCgxKS5nZXROYW1lKCkgLyogMT1maWxldHJlZSBoZXJlICovKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgbmFtZU9mKGZpbmFsIEFic3RyYWN0VHJlZUl0ZXJhdG9yIGkpIHsKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgbmFtZU9mKEFic3RyYWN0VHJlZUl0ZXJhdG9yIGkpIHsKIAkJcmV0dXJuIFJhd1BhcnNlVXRpbHMuZGVjb2RlKENvbnN0YW50cy5DSEFSU0VULCBpLnBhdGgsIDAsIGkucGF0aExlbik7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL0ZpbGVUcmVlSXRlcmF0b3JXaXRoVGltZUNvbnRyb2wuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9GaWxlVHJlZUl0ZXJhdG9yV2l0aFRpbWVDb250cm9sLmphdmEKaW5kZXggNzE3YTJmMy4uZmM3OWQ0NSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL0ZpbGVUcmVlSXRlcmF0b3JXaXRoVGltZUNvbnRyb2wuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvRmlsZVRyZWVJdGVyYXRvcldpdGhUaW1lQ29udHJvbC5qYXZhCkBAIC05Myw3ICs5Myw3IEBAIHB1YmxpYyBGaWxlVHJlZUl0ZXJhdG9yV2l0aFRpbWVDb250cm9sKEZpbGUgZiwgRlMgZnMsCiAJfQogCiAJQE92ZXJyaWRlCi0JcHVibGljIEFic3RyYWN0VHJlZUl0ZXJhdG9yIGNyZWF0ZVN1YnRyZWVJdGVyYXRvcihmaW5hbCBPYmplY3RSZWFkZXIgcmVhZGVyKSB7CisJcHVibGljIEFic3RyYWN0VHJlZUl0ZXJhdG9yIGNyZWF0ZVN1YnRyZWVJdGVyYXRvcihPYmplY3RSZWFkZXIgcmVhZGVyKSB7CiAJCXJldHVybiBuZXcgRmlsZVRyZWVJdGVyYXRvcldpdGhUaW1lQ29udHJvbCh0aGlzLAogCQkJCSgoRmlsZUVudHJ5KSBjdXJyZW50KCkpLmdldEZpbGUoKSwgZnMsIG1vZFRpbWVzKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvUG9zdE9yZGVyVHJlZVdhbGtUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvUG9zdE9yZGVyVHJlZVdhbGtUZXN0LmphdmEKaW5kZXggNmFkNDdjMi4uMjMyNDIyZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL1Bvc3RPcmRlclRyZWVXYWxrVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9Qb3N0T3JkZXJUcmVlV2Fsa1Rlc3QuamF2YQpAQCAtNjAsMTQgKzYwLDE0IEBACiBwdWJsaWMgY2xhc3MgUG9zdE9yZGVyVHJlZVdhbGtUZXN0IGV4dGVuZHMgUmVwb3NpdG9yeVRlc3RDYXNlIHsKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RJbml0aWFsaXplX05vUG9zdE9yZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRyeSAoZmluYWwgVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CisJCXRyeSAoVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CiAJCQlhc3NlcnRGYWxzZSh0dy5pc1Bvc3RPcmRlclRyYXZlcnNhbCgpKTsKIAkJfQogCX0KIAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdEluaXRpYWxpemVfVG9nZ2xlUG9zdE9yZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRyeSAoZmluYWwgVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CisJCXRyeSAoVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CiAJCQlhc3NlcnRGYWxzZSh0dy5pc1Bvc3RPcmRlclRyYXZlcnNhbCgpKTsKIAkJCXR3LnNldFBvc3RPcmRlclRyYXZlcnNhbCh0cnVlKTsKIAkJCWFzc2VydFRydWUodHcuaXNQb3N0T3JkZXJUcmF2ZXJzYWwoKSk7CkBAIC03OCw3ICs3OCw3IEBAIHB1YmxpYyB2b2lkIHRlc3RJbml0aWFsaXplX1RvZ2dsZVBvc3RPcmRlcigpIHRocm93cyBFeGNlcHRpb24gewogCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0UmVzZXREb2VzTm90QWZmZWN0UG9zdE9yZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRyeSAoZmluYWwgVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CisJCXRyeSAoVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CiAJCQl0dy5zZXRQb3N0T3JkZXJUcmF2ZXJzYWwodHJ1ZSk7CiAJCQlhc3NlcnRUcnVlKHR3LmlzUG9zdE9yZGVyVHJhdmVyc2FsKCkpOwogCQkJdHcucmVzZXQoKTsKQEAgLTEwNCw3ICsxMDQsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0Tm9Qb3N0T3JkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJYi5maW5pc2goKTsKIAkJYXNzZXJ0RXF1YWxzKDQsIHRyZWUuZ2V0RW50cnlDb3VudCgpKTsKIAotCQl0cnkgKGZpbmFsIFRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKGRiKSkgeworCQl0cnkgKFRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKGRiKSkgewogCQkJdHcuc2V0UG9zdE9yZGVyVHJhdmVyc2FsKGZhbHNlKTsKIAkJCXR3LmFkZFRyZWUobmV3IERpckNhY2hlSXRlcmF0b3IodHJlZSkpOwogCkBAIC0xMzIsNyArMTMyLDcgQEAgcHVibGljIHZvaWQgdGVzdFdpdGhQb3N0T3JkZXJfRW50ZXJTdWJ0cmVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWIuZmluaXNoKCk7CiAJCWFzc2VydEVxdWFscyg0LCB0cmVlLmdldEVudHJ5Q291bnQoKSk7CiAKLQkJdHJ5IChmaW5hbCBUcmVlV2FsayB0dyA9IG5ldyBUcmVlV2FsayhkYikpIHsKKwkJdHJ5IChUcmVlV2FsayB0dyA9IG5ldyBUcmVlV2FsayhkYikpIHsKIAkJCXR3LnNldFBvc3RPcmRlclRyYXZlcnNhbCh0cnVlKTsKIAkJCXR3LmFkZFRyZWUobmV3IERpckNhY2hlSXRlcmF0b3IodHJlZSkpOwogCkBAIC0xNjYsNyArMTY2LDcgQEAgcHVibGljIHZvaWQgdGVzdFdpdGhQb3N0T3JkZXJfTm9FbnRlclN1YnRyZWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJYi5maW5pc2goKTsKIAkJYXNzZXJ0RXF1YWxzKDQsIHRyZWUuZ2V0RW50cnlDb3VudCgpKTsKIAotCQl0cnkgKGZpbmFsIFRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKGRiKSkgeworCQl0cnkgKFRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKGRiKSkgewogCQkJdHcuc2V0UG9zdE9yZGVyVHJhdmVyc2FsKHRydWUpOwogCQkJdHcuYWRkVHJlZShuZXcgRGlyQ2FjaGVJdGVyYXRvcih0cmVlKSk7CiAKQEAgLTE4MCw3ICsxODAsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0V2l0aFBvc3RPcmRlcl9Ob0VudGVyU3VidHJlZSgpIHRocm93cyBFeGNlcHRpb24gewogCQl9CiAJfQogCi0JcHJpdmF0ZSBEaXJDYWNoZUVudHJ5IG1ha2VGaWxlKGZpbmFsIFN0cmluZyBwYXRoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwcml2YXRlIERpckNhY2hlRW50cnkgbWFrZUZpbGUoU3RyaW5nIHBhdGgpIHRocm93cyBFeGNlcHRpb24gewogCQlyZXR1cm4gY3JlYXRlRW50cnkocGF0aCwgUkVHVUxBUl9GSUxFKTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvQWx3YXlzQ2xvbmVUcmVlRmlsdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL0Fsd2F5c0Nsb25lVHJlZUZpbHRlci5qYXZhCmluZGV4IDhlMmNjYTQuLmQ5Y2ZiNjIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvQWx3YXlzQ2xvbmVUcmVlRmlsdGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9BbHdheXNDbG9uZVRyZWVGaWx0ZXIuamF2YQpAQCAtNTIsNyArNTIsNyBAQCBwdWJsaWMgVHJlZUZpbHRlciBjbG9uZSgpIHsKIAl9CiAKIAlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKGZpbmFsIFRyZWVXYWxrIHdhbGtlcikgeworCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoVHJlZVdhbGsgd2Fsa2VyKSB7CiAJCXJldHVybiBmYWxzZTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvTm90VHJlZUZpbHRlclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvTm90VHJlZUZpbHRlclRlc3QuamF2YQppbmRleCBmN2E3ZmI4Li5jNjM4OWZiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL05vdFRyZWVGaWx0ZXJUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9Ob3RUcmVlRmlsdGVyVGVzdC5qYXZhCkBAIC01NywxMiArNTcsMTMgQEAKIHB1YmxpYyBjbGFzcyBOb3RUcmVlRmlsdGVyVGVzdCBleHRlbmRzIFJlcG9zaXRvcnlUZXN0Q2FzZSB7CiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0V3JhcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlmaW5hbCBUcmVlV2FsayB0dyA9IG5ldyBUcmVlV2FsayhkYik7Ci0JCWZpbmFsIFRyZWVGaWx0ZXIgYSA9IFRyZWVGaWx0ZXIuQUxMOwotCQlmaW5hbCBUcmVlRmlsdGVyIG4gPSBOb3RUcmVlRmlsdGVyLmNyZWF0ZShhKTsKLQkJYXNzZXJ0Tm90TnVsbChuKTsKLQkJYXNzZXJ0VHJ1ZShhLmluY2x1ZGUodHcpKTsKLQkJYXNzZXJ0RmFsc2Uobi5pbmNsdWRlKHR3KSk7CisJCXRyeSAoVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CisJCQlmaW5hbCBUcmVlRmlsdGVyIGEgPSBUcmVlRmlsdGVyLkFMTDsKKwkJCWZpbmFsIFRyZWVGaWx0ZXIgbiA9IE5vdFRyZWVGaWx0ZXIuY3JlYXRlKGEpOworCQkJYXNzZXJ0Tm90TnVsbChuKTsKKwkJCWFzc2VydFRydWUoYS5pbmNsdWRlKHR3KSk7CisJCQlhc3NlcnRGYWxzZShuLmluY2x1ZGUodHcpKTsKKwkJfQogCX0KIAogCUBUZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL1BhdGhGaWx0ZXJHcm91cFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvUGF0aEZpbHRlckdyb3VwVGVzdC5qYXZhCmluZGV4IGQ5MjFhYWIuLjcxYTJmMzIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvUGF0aEZpbHRlckdyb3VwVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvUGF0aEZpbHRlckdyb3VwVGVzdC5qYXZhCkBAIC0yNTQsNyArMjU0LDcgQEAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpbmNsdWRlcyhUcmVlRmlsdGVyIGYsIFRyZWVXYWxrIHR3KQogCQl9CiAJfQogCi0JVHJlZVdhbGsgZmFrZVdhbGsoZmluYWwgU3RyaW5nIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJVHJlZVdhbGsgZmFrZVdhbGsoU3RyaW5nIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCURpckNhY2hlIGRjID0gRGlyQ2FjaGUubmV3SW5Db3JlKCk7CiAJCURpckNhY2hlRWRpdG9yIGRjZSA9IGRjLmVkaXRvcigpOwogCQlkY2UuYWRkKG5ldyBEaXJDYWNoZUVkaXRvci5QYXRoRWRpdChwYXRoKSB7CkBAIC0yNzQsNyArMjc0LDcgQEAgcHVibGljIHZvaWQgYXBwbHkoRGlyQ2FjaGVFbnRyeSBlbnQpIHsKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlUcmVlV2FsayBmYWtlV2Fsa0F0U3VidHJlZShmaW5hbCBTdHJpbmcgcGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlUcmVlV2FsayBmYWtlV2Fsa0F0U3VidHJlZShTdHJpbmcgcGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJRGlyQ2FjaGUgZGMgPSBEaXJDYWNoZS5uZXdJbkNvcmUoKTsKIAkJRGlyQ2FjaGVFZGl0b3IgZGNlID0gZGMuZWRpdG9yKCk7CiAJCWRjZS5hZGQobmV3IERpckNhY2hlRWRpdG9yLlBhdGhFZGl0KHBhdGggKyAiL1JFQURNRSIpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvUGF0aFN1ZmZpeEZpbHRlclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvUGF0aFN1ZmZpeEZpbHRlclRlc3QuamF2YQppbmRleCAzOGFkZGEzLi4xNDhkNWFjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL1BhdGhTdWZmaXhGaWx0ZXJUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9QYXRoU3VmZml4RmlsdGVyVGVzdC5qYXZhCkBAIC0xMTMsNyArMTEzLDcgQEAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gZ2V0TWF0Y2hpbmdQYXRocyhTdHJpbmcgc3VmZml4RmlsdGVyLAogCiAJcHJpdmF0ZSBMaXN0PFN0cmluZz4gZ2V0TWF0Y2hpbmdQYXRocyhTdHJpbmcgc3VmZml4RmlsdGVyLAogCQkJZmluYWwgT2JqZWN0SWQgdHJlZUlkLCBib29sZWFuIHJlY3Vyc2l2ZVdhbGspIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXRyeSAoZmluYWwgVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CisJCXRyeSAoVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CiAJCQl0dy5zZXRGaWx0ZXIoUGF0aFN1ZmZpeEZpbHRlci5jcmVhdGUoc3VmZml4RmlsdGVyKSk7CiAJCQl0dy5zZXRSZWN1cnNpdmUocmVjdXJzaXZlV2Fsayk7CiAJCQl0dy5hZGRUcmVlKHRyZWVJZCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL1RyZWVGaWx0ZXJUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL1RyZWVGaWx0ZXJUZXN0LmphdmEKaW5kZXggYzM0MjNiNi4uODY4NmM0ZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9UcmVlRmlsdGVyVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvVHJlZUZpbHRlclRlc3QuamF2YQpAQCAtNTUsNyArNTUsNyBAQAogcHVibGljIGNsYXNzIFRyZWVGaWx0ZXJUZXN0IGV4dGVuZHMgUmVwb3NpdG9yeVRlc3RDYXNlIHsKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RBTExfSW5jbHVkZXNBbnl0aGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQl0cnkgKGZpbmFsIFRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKGRiKSkgeworCQl0cnkgKFRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKGRiKSkgewogCQkJdHcuYWRkVHJlZShuZXcgRW1wdHlUcmVlSXRlcmF0b3IoKSk7CiAJCQlhc3NlcnRUcnVlKFRyZWVGaWx0ZXIuQUxMLmluY2x1ZGUodHcpKTsKIAkJfQpAQCAtNzMsNyArNzMsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0QUxMX0lkZW50aXR5Q2xvbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdE5vdEFMTF9JbmNsdWRlc05vdGhpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdHJ5IChmaW5hbCBUcmVlV2FsayB0dyA9IG5ldyBUcmVlV2FsayhkYikpIHsKKwkJdHJ5IChUcmVlV2FsayB0dyA9IG5ldyBUcmVlV2FsayhkYikpIHsKIAkJCXR3LmFkZFRyZWUobmV3IEVtcHR5VHJlZUl0ZXJhdG9yKCkpOwogCQkJYXNzZXJ0RmFsc2UoVHJlZUZpbHRlci5BTEwubmVnYXRlKCkuaW5jbHVkZSh0dykpOwogCQl9CkBAIC04MSw3ICs4MSw3IEBAIHB1YmxpYyB2b2lkIHRlc3ROb3RBTExfSW5jbHVkZXNOb3RoaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RBTllfRElGRl9JbmNsdWRlc1NpbmdsZVRyZWVDYXNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRyeSAoZmluYWwgVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CisJCXRyeSAoVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CiAJCQl0dy5hZGRUcmVlKG5ldyBFbXB0eVRyZWVJdGVyYXRvcigpKTsKIAkJCWFzc2VydFRydWUoVHJlZUZpbHRlci5BTllfRElGRi5pbmNsdWRlKHR3KSk7CiAJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL0NoYW5nZUlkVXRpbFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL0NoYW5nZUlkVXRpbFRlc3QuamF2YQppbmRleCA2ZmVkMjMzLi44MTQ2N2MyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9DaGFuZ2VJZFV0aWxUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvQ2hhbmdlSWRVdGlsVGVzdC5qYXZhCkBAIC02ODAsMTUgKzY4MCwxNSBAQCBwdWJsaWMgdm9pZCB0ZXN0SW5kZXhPZkNoYW5nZUlkKCkgewogCQkJCSJcbiIpKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgaG9va0RvZXNOb3RNb2RpZnkoZmluYWwgU3RyaW5nIGluKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwcml2YXRlIHZvaWQgaG9va0RvZXNOb3RNb2RpZnkoU3RyaW5nIGluKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJYXNzZXJ0RXF1YWxzKGluLCBjYWxsKGluKSk7CiAJfQogCi0JcHJpdmF0ZSBTdHJpbmcgY2FsbChmaW5hbCBTdHJpbmcgYm9keSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHJpdmF0ZSBTdHJpbmcgY2FsbChTdHJpbmcgYm9keSkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXJldHVybiBjYWxsKGJvZHksIGZhbHNlKTsKIAl9CiAKLQlwcml2YXRlIFN0cmluZyBjYWxsKGZpbmFsIFN0cmluZyBib2R5LCBib29sZWFuIHJlcGxhY2VFeGlzdGluZykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHJpdmF0ZSBTdHJpbmcgY2FsbChTdHJpbmcgYm9keSwgYm9vbGVhbiByZXBsYWNlRXhpc3RpbmcpIHRocm93cyBFeGNlcHRpb24gewogCQlPYmplY3RJZCBjb21wdXRlQ2hhbmdlSWQgPSBDaGFuZ2VJZFV0aWwuY29tcHV0ZUNoYW5nZUlkKHRyZWVJZDEsCiAJCQkJcGFyZW50SWQxLCBhdXRob3IsIGNvbW1pdHRlciwgYm9keSk7CiAJCWlmIChjb21wdXRlQ2hhbmdlSWQgPT0gbnVsbCkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL0hvb2tUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9Ib29rVGVzdC5qYXZhCmluZGV4IGE2ODBlZjkuLmUzNGMzY2UgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL0hvb2tUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvSG9va1Rlc3QuamF2YQpAQCAtMjQxLDcgKzI0MSw3IEBAIHB1YmxpYyB2b2lkIHRlc3RGYWlsZWRQcmVDb21taXRIb29rQmxvY2tDb21taXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJfQogCX0KIAotCXByaXZhdGUgRmlsZSB3cml0ZUhvb2tGaWxlKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBTdHJpbmcgZGF0YSkKKwlwcml2YXRlIEZpbGUgd3JpdGVIb29rRmlsZShTdHJpbmcgbmFtZSwgU3RyaW5nIGRhdGEpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlGaWxlIHBhdGggPSBuZXcgRmlsZShkYi5nZXRXb3JrVHJlZSgpICsgIi8uZ2l0L2hvb2tzLyIsIG5hbWUpOwogCQlKR2l0VGVzdFV0aWwud3JpdGUocGF0aCwgZGF0YSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9OQlRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL05CVGVzdC5qYXZhCmluZGV4IGQyZDQ0ZmYuLjgzMGYyMGUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL05CVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL05CVGVzdC5qYXZhCkBAIC0zMzgsNyArMzM4LDcgQEAgcHVibGljIHZvaWQgdGVzdEVuY29kZUludDY0KCkgewogCQlhc3NlcnRPdXRwdXQoYigweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmKSwgb3V0LCAzKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyB2b2lkIHByZXBhcmVPdXRwdXQoZmluYWwgYnl0ZVtdIGJ1ZikgeworCXByaXZhdGUgc3RhdGljIHZvaWQgcHJlcGFyZU91dHB1dChieXRlW10gYnVmKSB7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgYnVmLmxlbmd0aDsgaSsrKQogCQkJYnVmW2ldID0gKGJ5dGUpICgweDc3ICsgaSk7CiAJfQpAQCAtMzUzLDExICszNTMsMTEgQEAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRPdXRwdXQoZmluYWwgYnl0ZVtdIGV4cGVjdCwgZmluYWwgYnl0ZVtdIGJ1ZiwKIAkJCWFzc2VydEVxdWFscygoYnl0ZSkgKDB4NzcgKyBpKSwgYnVmW2ldKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBieXRlW10gYihmaW5hbCBpbnQgYSwgZmluYWwgaW50IGIpIHsKKwlwcml2YXRlIHN0YXRpYyBieXRlW10gYihpbnQgYSwgaW50IGIpIHsKIAkJcmV0dXJuIG5ldyBieXRlW10geyAoYnl0ZSkgYSwgKGJ5dGUpIGIgfTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBieXRlW10gcGFkYihmaW5hbCBpbnQgbGVuLCBmaW5hbCBpbnQgYSwgZmluYWwgaW50IGIpIHsKKwlwcml2YXRlIHN0YXRpYyBieXRlW10gcGFkYihpbnQgbGVuLCBpbnQgYSwgaW50IGIpIHsKIAkJZmluYWwgYnl0ZVtdIHIgPSBuZXcgYnl0ZVtsZW4gKyAyXTsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykKIAkJCXJbaV0gPSAoYnl0ZSkgMHhhZjsKQEAgLTM3MCw3ICszNzAsNyBAQCBwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydE91dHB1dChmaW5hbCBieXRlW10gZXhwZWN0LCBmaW5hbCBieXRlW10gYnVmLAogCQlyZXR1cm4gbmV3IGJ5dGVbXSB7IChieXRlKSBhLCAoYnl0ZSkgYiwgKGJ5dGUpIGMgfTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBieXRlW10gYihmaW5hbCBpbnQgYSwgZmluYWwgaW50IGIsIGZpbmFsIGludCBjLCBmaW5hbCBpbnQgZCkgeworCXByaXZhdGUgc3RhdGljIGJ5dGVbXSBiKGludCBhLCBpbnQgYiwgaW50IGMsIGludCBkKSB7CiAJCXJldHVybiBuZXcgYnl0ZVtdIHsgKGJ5dGUpIGEsIChieXRlKSBiLCAoYnl0ZSkgYywgKGJ5dGUpIGQgfTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL1F1b3RlZFN0cmluZ0JvdXJuZVN0eWxlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUXVvdGVkU3RyaW5nQm91cm5lU3R5bGVUZXN0LmphdmEKaW5kZXggNjUwNzg3Ni4uNDlhZDU1ZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUXVvdGVkU3RyaW5nQm91cm5lU3R5bGVUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUXVvdGVkU3RyaW5nQm91cm5lU3R5bGVUZXN0LmphdmEKQEAgLTUyLDE0ICs1MiwxNCBAQAogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCiBwdWJsaWMgY2xhc3MgUXVvdGVkU3RyaW5nQm91cm5lU3R5bGVUZXN0IHsKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydFF1b3RlKGZpbmFsIFN0cmluZyBpbiwgZmluYWwgU3RyaW5nIGV4cCkgeworCXByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0UXVvdGUoU3RyaW5nIGluLCBTdHJpbmcgZXhwKSB7CiAJCWZpbmFsIFN0cmluZyByID0gQk9VUk5FLnF1b3RlKGluKTsKIAkJYXNzZXJ0Tm90U2FtZShpbiwgcik7CiAJCWFzc2VydEZhbHNlKGluLmVxdWFscyhyKSk7CiAJCWFzc2VydEVxdWFscygnXCcnICsgZXhwICsgJ1wnJywgcik7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnREZXF1b3RlKGZpbmFsIFN0cmluZyBleHAsIGZpbmFsIFN0cmluZyBpbikgeworCXByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0RGVxdW90ZShTdHJpbmcgZXhwLCBTdHJpbmcgaW4pIHsKIAkJZmluYWwgYnl0ZVtdIGIgPSBDb25zdGFudHMuZW5jb2RlKCdcJycgKyBpbiArICdcJycpOwogCQlmaW5hbCBTdHJpbmcgciA9IEJPVVJORS5kZXF1b3RlKGIsIDAsIGIubGVuZ3RoKTsKIAkJYXNzZXJ0RXF1YWxzKGV4cCwgcik7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9RdW90ZWRTdHJpbmdCb3VybmVVc2VyUGF0aFN0eWxlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUXVvdGVkU3RyaW5nQm91cm5lVXNlclBhdGhTdHlsZVRlc3QuamF2YQppbmRleCA3NDYzNTI4Li4xN2YxYjc3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9RdW90ZWRTdHJpbmdCb3VybmVVc2VyUGF0aFN0eWxlVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL1F1b3RlZFN0cmluZ0JvdXJuZVVzZXJQYXRoU3R5bGVUZXN0LmphdmEKQEAgLTUyLDE0ICs1MiwxNCBAQAogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCiBwdWJsaWMgY2xhc3MgUXVvdGVkU3RyaW5nQm91cm5lVXNlclBhdGhTdHlsZVRlc3QgewotCXByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0UXVvdGUoZmluYWwgU3RyaW5nIGluLCBmaW5hbCBTdHJpbmcgZXhwKSB7CisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRRdW90ZShTdHJpbmcgaW4sIFN0cmluZyBleHApIHsKIAkJZmluYWwgU3RyaW5nIHIgPSBCT1VSTkVfVVNFUl9QQVRILnF1b3RlKGluKTsKIAkJYXNzZXJ0Tm90U2FtZShpbiwgcik7CiAJCWFzc2VydEZhbHNlKGluLmVxdWFscyhyKSk7CiAJCWFzc2VydEVxdWFscygnXCcnICsgZXhwICsgJ1wnJywgcik7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnREZXF1b3RlKGZpbmFsIFN0cmluZyBleHAsIGZpbmFsIFN0cmluZyBpbikgeworCXByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0RGVxdW90ZShTdHJpbmcgZXhwLCBTdHJpbmcgaW4pIHsKIAkJZmluYWwgYnl0ZVtdIGIgPSBDb25zdGFudHMuZW5jb2RlKCdcJycgKyBpbiArICdcJycpOwogCQlmaW5hbCBTdHJpbmcgciA9IEJPVVJORV9VU0VSX1BBVEguZGVxdW90ZShiLCAwLCBiLmxlbmd0aCk7CiAJCWFzc2VydEVxdWFscyhleHAsIHIpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUXVvdGVkU3RyaW5nR2l0UGF0aFN0eWxlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUXVvdGVkU3RyaW5nR2l0UGF0aFN0eWxlVGVzdC5qYXZhCmluZGV4IGE2ZjMzNDUuLjlhMGM5NmUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL1F1b3RlZFN0cmluZ0dpdFBhdGhTdHlsZVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9RdW90ZWRTdHJpbmdHaXRQYXRoU3R5bGVUZXN0LmphdmEKQEAgLTU0LDE0ICs1NCwxNCBAQAogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCiBwdWJsaWMgY2xhc3MgUXVvdGVkU3RyaW5nR2l0UGF0aFN0eWxlVGVzdCB7Ci0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRRdW90ZShmaW5hbCBTdHJpbmcgZXhwLCBmaW5hbCBTdHJpbmcgaW4pIHsKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydFF1b3RlKFN0cmluZyBleHAsIFN0cmluZyBpbikgewogCQlmaW5hbCBTdHJpbmcgciA9IEdJVF9QQVRILnF1b3RlKGluKTsKIAkJYXNzZXJ0Tm90U2FtZShpbiwgcik7CiAJCWFzc2VydEZhbHNlKGluLmVxdWFscyhyKSk7CiAJCWFzc2VydEVxdWFscygnIicgKyBleHAgKyAnIicsIHIpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0RGVxdW90ZShmaW5hbCBTdHJpbmcgZXhwLCBmaW5hbCBTdHJpbmcgaW4pIHsKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydERlcXVvdGUoU3RyaW5nIGV4cCwgU3RyaW5nIGluKSB7CiAJCWZpbmFsIGJ5dGVbXSBiID0gKCciJyArIGluICsgJyInKS5nZXRCeXRlcyhJU09fODg1OV8xKTsKIAkJZmluYWwgU3RyaW5nIHIgPSBHSVRfUEFUSC5kZXF1b3RlKGIsIDAsIGIubGVuZ3RoKTsKIAkJYXNzZXJ0RXF1YWxzKGV4cCwgcik7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9SYXdQYXJzZVV0aWxzX0hleFBhcnNlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUmF3UGFyc2VVdGlsc19IZXhQYXJzZVRlc3QuamF2YQppbmRleCBmNWI1NmU3Li5mM2MwNDZkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9SYXdQYXJzZVV0aWxzX0hleFBhcnNlVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL1Jhd1BhcnNlVXRpbHNfSGV4UGFyc2VUZXN0LmphdmEKQEAgLTgxLDcgKzgxLDcgQEAgcHVibGljIHZvaWQgdGVzdEludDRfMSgpIHsKIAkJYXNzZXJ0Tm90SGV4KCcuJyk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnROb3RIZXgoZmluYWwgY2hhciBjKSB7CisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnROb3RIZXgoY2hhciBjKSB7CiAJCXRyeSB7CiAJCQlSYXdQYXJzZVV0aWxzLnBhcnNlSGV4SW50NCgoYnl0ZSkgYyk7CiAJCQlmYWlsKCJJbmNvcnJlY3RseSBhY2NjZXB0ZWQgIiArIGMpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUmF3UGFyc2VVdGlsc19MaW5lTWFwVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUmF3UGFyc2VVdGlsc19MaW5lTWFwVGVzdC5qYXZhCmluZGV4IDAyNDM3OTguLjc2MzBjMTEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL1Jhd1BhcnNlVXRpbHNfTGluZU1hcFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9SYXdQYXJzZVV0aWxzX0xpbmVNYXBUZXN0LmphdmEKQEAgLTQ3LDE4ICs0NywyNSBAQAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEFycmF5RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5CaW5hcnlCbG9iRXhjZXB0aW9uOworaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5FeHBlY3RlZEV4Y2VwdGlvbjsKIAogcHVibGljIGNsYXNzIFJhd1BhcnNlVXRpbHNfTGluZU1hcFRlc3QgeworCUBSdWxlCisJcHVibGljIEV4cGVjdGVkRXhjZXB0aW9uIGV4Y2VwdGlvbiA9IEV4cGVjdGVkRXhjZXB0aW9uLm5vbmUoKTsKKworCiAJQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0RW1wdHkoKSB7CisJcHVibGljIHZvaWQgdGVzdEVtcHR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWZpbmFsIEludExpc3QgbWFwID0gUmF3UGFyc2VVdGlscy5saW5lTWFwKG5ldyBieXRlW10ge30sIDAsIDApOwogCQlhc3NlcnROb3ROdWxsKG1hcCk7CiAJCWFzc2VydEFycmF5RXF1YWxzKG5ldyBpbnRbXXtJbnRlZ2VyLk1JTl9WQUxVRSwgMH0sIGFzSW50cyhtYXApKTsKIAl9CiAKIAlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RPbmVCbGFua0xpbmUoKSB7CisJcHVibGljIHZvaWQgdGVzdE9uZUJsYW5rTGluZSgpIHRocm93cyBFeGNlcHRpb24gIHsKIAkJZmluYWwgSW50TGlzdCBtYXAgPSBSYXdQYXJzZVV0aWxzLmxpbmVNYXAobmV3IGJ5dGVbXSB7ICdcbicgfSwgMCwgMSk7CiAJCWFzc2VydEFycmF5RXF1YWxzKG5ldyBpbnRbXXtJbnRlZ2VyLk1JTl9WQUxVRSwgMCwgMX0sIGFzSW50cyhtYXApKTsKIAl9CkBAIC04NSw2ICs5MiwxMyBAQCBwdWJsaWMgdm9pZCB0ZXN0QmluYXJ5KCkgewogCX0KIAogCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdExpbmVNYXBPckJpbmFyeSgpIHRocm93cyBFeGNlcHRpb24geworCQlmaW5hbCBieXRlW10gYnVmID0gInh4eGZvb1xuYlwwYXIiLmdldEJ5dGVzKElTT184ODU5XzEpOworCQlleGNlcHRpb24uZXhwZWN0KEJpbmFyeUJsb2JFeGNlcHRpb24uY2xhc3MpOworCQlSYXdQYXJzZVV0aWxzLmxpbmVNYXBPckJpbmFyeShidWYsIDMsIGJ1Zi5sZW5ndGgpOworCX0KKworCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdEZvdXJMaW5lQmxhbmtzKCkgewogCQlmaW5hbCBieXRlW10gYnVmID0gImZvb1xuXG5cbmJhclxuIi5nZXRCeXRlcyhJU09fODg1OV8xKTsKIAkJZmluYWwgSW50TGlzdCBtYXAgPSBSYXdQYXJzZVV0aWxzLmxpbmVNYXAoYnVmLCAwLCBidWYubGVuZ3RoKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL1Jhd1N1YlN0cmluZ1BhdHRlcm5UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9SYXdTdWJTdHJpbmdQYXR0ZXJuVGVzdC5qYXZhCmluZGV4IGU4NTY2ZDIuLmE3NDhiNTIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL1Jhd1N1YlN0cmluZ1BhdHRlcm5UZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUmF3U3ViU3RyaW5nUGF0dGVyblRlc3QuamF2YQpAQCAtNDIsNyArNDIsNyBAQAogICovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQudXRpbDsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwogCkBAIC05Myw3ICs5Myw3IEBAIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0TWF0Y2hSZXN1bHQoU3RyaW5nIHBhdHRlcm4sIFN0cmluZyBpbnB1dCwgaW50IHBvc2l0aW9uCiAJfQogCiAJcHJpdmF0ZSBzdGF0aWMgUmF3Q2hhclNlcXVlbmNlIHJhdyhTdHJpbmcgdGV4dCkgewotCQlieXRlW10gYnl0ZXMgPSB0ZXh0LmdldEJ5dGVzKFVURl84KTsKKwkJYnl0ZVtdIGJ5dGVzID0gdGV4dC5nZXRCeXRlcyhDSEFSU0VUKTsKIAkJcmV0dXJuIG5ldyBSYXdDaGFyU2VxdWVuY2UoYnl0ZXMsIDAsIGJ5dGVzLmxlbmd0aCk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUmVmTGlzdFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL1JlZkxpc3RUZXN0LmphdmEKaW5kZXggNWExNDY4YS4uZDEyNGQ3MyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUmVmTGlzdFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9SZWZMaXN0VGVzdC5qYXZhCkBAIC00NTYsNyArNDU2LDcgQEAgcHJpdmF0ZSBzdGF0aWMgUmVmTGlzdDxSZWY+IHRvTGlzdChSZWYuLi4gcmVmcykgewogCQlyZXR1cm4gYi50b1JlZkxpc3QoKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBSZWYgbmV3UmVmKGZpbmFsIFN0cmluZyBuYW1lKSB7CisJcHJpdmF0ZSBzdGF0aWMgUmVmIG5ld1JlZihTdHJpbmcgbmFtZSkgewogCQlyZXR1cm4gbmV3IE9iamVjdElkUmVmLlVucGVlbGVkKFJlZi5TdG9yYWdlLkxPT1NFLCBuYW1lLCBJRCk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvVGVtcG9yYXJ5QnVmZmVyVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvVGVtcG9yYXJ5QnVmZmVyVGVzdC5qYXZhCmluZGV4IGQ5Nzg4MDQuLmVkY2NlMTIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL1RlbXBvcmFyeUJ1ZmZlclRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9UZW1wb3JhcnlCdWZmZXJUZXN0LmphdmEKQEAgLTYxLDYgKzYxLDcgQEAKIHB1YmxpYyBjbGFzcyBUZW1wb3JhcnlCdWZmZXJUZXN0IHsKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RFbXB0eSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpIC8vIEJ1ZmZlciBpcyBleHBsaWNpdGx5IGRlc3Ryb3llZCBpbiBmaW5hbGx5IGJsb2NrCiAJCWZpbmFsIFRlbXBvcmFyeUJ1ZmZlciBiID0gbmV3IFRlbXBvcmFyeUJ1ZmZlci5Mb2NhbEZpbGUobnVsbCk7CiAJCXRyeSB7CiAJCQliLmNsb3NlKCk7CkBAIC03NSw2ICs3Niw3IEBAIHB1YmxpYyB2b2lkIHRlc3RFbXB0eSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RPbmVCeXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikgLy8gQnVmZmVyIGlzIGV4cGxpY2l0bHkgZGVzdHJveWVkIGluIGZpbmFsbHkgYmxvY2sKIAkJZmluYWwgVGVtcG9yYXJ5QnVmZmVyIGIgPSBuZXcgVGVtcG9yYXJ5QnVmZmVyLkxvY2FsRmlsZShudWxsKTsKIAkJZmluYWwgYnl0ZSB0ZXN0ID0gKGJ5dGUpIG5ldyBUZXN0Um5nKGdldE5hbWUoKSkubmV4dEludCgpOwogCQl0cnkgewpAQCAtODcsMTAgKzg5LDggQEAgcHVibGljIHZvaWQgdGVzdE9uZUJ5dGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJCWFzc2VydEVxdWFscygxLCByLmxlbmd0aCk7CiAJCQkJYXNzZXJ0RXF1YWxzKHRlc3QsIHJbMF0pOwogCQkJfQotCQkJewotCQkJCWZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworCQkJdHJ5IChCeXRlQXJyYXlPdXRwdXRTdHJlYW0gbyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKSkgewogCQkJCWIud3JpdGVUbyhvLCBudWxsKTsKLQkJCQlvLmNsb3NlKCk7CiAJCQkJZmluYWwgYnl0ZVtdIHIgPSBvLnRvQnl0ZUFycmF5KCk7CiAJCQkJYXNzZXJ0RXF1YWxzKDEsIHIubGVuZ3RoKTsKIAkJCQlhc3NlcnRFcXVhbHModGVzdCwgclswXSk7CkBAIC0xMDIsNiArMTAyLDcgQEAgcHVibGljIHZvaWQgdGVzdE9uZUJ5dGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0T25lQmxvY2tfQnVsa1dyaXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikgLy8gQnVmZmVyIGlzIGV4cGxpY2l0bHkgZGVzdHJveWVkIGluIGZpbmFsbHkgYmxvY2sKIAkJZmluYWwgVGVtcG9yYXJ5QnVmZmVyIGIgPSBuZXcgVGVtcG9yYXJ5QnVmZmVyLkxvY2FsRmlsZShudWxsKTsKIAkJZmluYWwgYnl0ZVtdIHRlc3QgPSBuZXcgVGVzdFJuZyhnZXROYW1lKCkpCiAJCQkJLm5leHRCeXRlcyhUZW1wb3JhcnlCdWZmZXIuQmxvY2suU1opOwpAQCAtMTE4LDEwICsxMTksOCBAQCBwdWJsaWMgdm9pZCB0ZXN0T25lQmxvY2tfQnVsa1dyaXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCQlhc3NlcnRFcXVhbHModGVzdC5sZW5ndGgsIHIubGVuZ3RoKTsKIAkJCQlhc3NlcnRBcnJheUVxdWFscyh0ZXN0LCByKTsKIAkJCX0KLQkJCXsKLQkJCQlmaW5hbCBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gbyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKwkJCXRyeSAoQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG8gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCkpIHsKIAkJCQliLndyaXRlVG8obywgbnVsbCk7Ci0JCQkJby5jbG9zZSgpOwogCQkJCWZpbmFsIGJ5dGVbXSByID0gby50b0J5dGVBcnJheSgpOwogCQkJCWFzc2VydEVxdWFscyh0ZXN0Lmxlbmd0aCwgci5sZW5ndGgpOwogCQkJCWFzc2VydEFycmF5RXF1YWxzKHRlc3QsIHIpOwpAQCAtMTMzLDYgKzEzMiw3IEBAIHB1YmxpYyB2b2lkIHRlc3RPbmVCbG9ja19CdWxrV3JpdGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0T25lQmxvY2tBbmRIYWxmX0J1bGtXcml0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpIC8vIEJ1ZmZlciBpcyBleHBsaWNpdGx5IGRlc3Ryb3llZCBpbiBmaW5hbGx5IGJsb2NrCiAJCWZpbmFsIFRlbXBvcmFyeUJ1ZmZlciBiID0gbmV3IFRlbXBvcmFyeUJ1ZmZlci5Mb2NhbEZpbGUobnVsbCk7CiAJCWZpbmFsIGJ5dGVbXSB0ZXN0ID0gbmV3IFRlc3RSbmcoZ2V0TmFtZSgpKQogCQkJCS5uZXh0Qnl0ZXMoVGVtcG9yYXJ5QnVmZmVyLkJsb2NrLlNaICogMyAvIDIpOwpAQCAtMTQ5LDEwICsxNDksOCBAQCBwdWJsaWMgdm9pZCB0ZXN0T25lQmxvY2tBbmRIYWxmX0J1bGtXcml0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQkJYXNzZXJ0RXF1YWxzKHRlc3QubGVuZ3RoLCByLmxlbmd0aCk7CiAJCQkJYXNzZXJ0QXJyYXlFcXVhbHModGVzdCwgcik7CiAJCQl9Ci0JCQl7Ci0JCQkJZmluYWwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG8gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisJCQl0cnkgKEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpKSB7CiAJCQkJYi53cml0ZVRvKG8sIG51bGwpOwotCQkJCW8uY2xvc2UoKTsKIAkJCQlmaW5hbCBieXRlW10gciA9IG8udG9CeXRlQXJyYXkoKTsKIAkJCQlhc3NlcnRFcXVhbHModGVzdC5sZW5ndGgsIHIubGVuZ3RoKTsKIAkJCQlhc3NlcnRBcnJheUVxdWFscyh0ZXN0LCByKTsKQEAgLTE2NCw2ICsxNjIsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0T25lQmxvY2tBbmRIYWxmX0J1bGtXcml0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RPbmVCbG9ja0FuZEhhbGZfU2luZ2xlV3JpdGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBCdWZmZXIgaXMgZXhwbGljaXRseSBkZXN0cm95ZWQgaW4gZmluYWxseSBibG9jawogCQlmaW5hbCBUZW1wb3JhcnlCdWZmZXIgYiA9IG5ldyBUZW1wb3JhcnlCdWZmZXIuTG9jYWxGaWxlKG51bGwpOwogCQlmaW5hbCBieXRlW10gdGVzdCA9IG5ldyBUZXN0Um5nKGdldE5hbWUoKSkKIAkJCQkubmV4dEJ5dGVzKFRlbXBvcmFyeUJ1ZmZlci5CbG9jay5TWiAqIDMgLyAyKTsKQEAgLTE3OCwxMCArMTc3LDggQEAgcHVibGljIHZvaWQgdGVzdE9uZUJsb2NrQW5kSGFsZl9TaW5nbGVXcml0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQkJYXNzZXJ0RXF1YWxzKHRlc3QubGVuZ3RoLCByLmxlbmd0aCk7CiAJCQkJYXNzZXJ0QXJyYXlFcXVhbHModGVzdCwgcik7CiAJCQl9Ci0JCQl7Ci0JCQkJZmluYWwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG8gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisJCQl0cnkgKEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpKSB7CiAJCQkJYi53cml0ZVRvKG8sIG51bGwpOwotCQkJCW8uY2xvc2UoKTsKIAkJCQlmaW5hbCBieXRlW10gciA9IG8udG9CeXRlQXJyYXkoKTsKIAkJCQlhc3NlcnRFcXVhbHModGVzdC5sZW5ndGgsIHIubGVuZ3RoKTsKIAkJCQlhc3NlcnRBcnJheUVxdWFscyh0ZXN0LCByKTsKQEAgLTE5Myw2ICsxOTAsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0T25lQmxvY2tBbmRIYWxmX1NpbmdsZVdyaXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdE9uZUJsb2NrQW5kSGFsZl9Db3B5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikgLy8gQnVmZmVyIGlzIGV4cGxpY2l0bHkgZGVzdHJveWVkIGluIGZpbmFsbHkgYmxvY2sKIAkJZmluYWwgVGVtcG9yYXJ5QnVmZmVyIGIgPSBuZXcgVGVtcG9yYXJ5QnVmZmVyLkxvY2FsRmlsZShudWxsKTsKIAkJZmluYWwgYnl0ZVtdIHRlc3QgPSBuZXcgVGVzdFJuZyhnZXROYW1lKCkpCiAJCQkJLm5leHRCeXRlcyhUZW1wb3JhcnlCdWZmZXIuQmxvY2suU1ogKiAzIC8gMik7CkBAIC0yMDgsMTAgKzIwNiw4IEBAIHB1YmxpYyB2b2lkIHRlc3RPbmVCbG9ja0FuZEhhbGZfQ29weSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQkJYXNzZXJ0RXF1YWxzKHRlc3QubGVuZ3RoLCByLmxlbmd0aCk7CiAJCQkJYXNzZXJ0QXJyYXlFcXVhbHModGVzdCwgcik7CiAJCQl9Ci0JCQl7Ci0JCQkJZmluYWwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG8gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisJCQl0cnkgKEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpKSB7CiAJCQkJYi53cml0ZVRvKG8sIG51bGwpOwotCQkJCW8uY2xvc2UoKTsKIAkJCQlmaW5hbCBieXRlW10gciA9IG8udG9CeXRlQXJyYXkoKTsKIAkJCQlhc3NlcnRFcXVhbHModGVzdC5sZW5ndGgsIHIubGVuZ3RoKTsKIAkJCQlhc3NlcnRBcnJheUVxdWFscyh0ZXN0LCByKTsKQEAgLTIyMyw2ICsyMTksNyBAQCBwdWJsaWMgdm9pZCB0ZXN0T25lQmxvY2tBbmRIYWxmX0NvcHkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0TGFyZ2VfU2luZ2xlV3JpdGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBCdWZmZXIgaXMgZXhwbGljaXRseSBkZXN0cm95ZWQgaW4gZmluYWxseSBibG9jawogCQlmaW5hbCBUZW1wb3JhcnlCdWZmZXIgYiA9IG5ldyBUZW1wb3JhcnlCdWZmZXIuTG9jYWxGaWxlKG51bGwpOwogCQlmaW5hbCBieXRlW10gdGVzdCA9IG5ldyBUZXN0Um5nKGdldE5hbWUoKSkKIAkJCQkubmV4dEJ5dGVzKFRlbXBvcmFyeUJ1ZmZlci5ERUZBVUxUX0lOX0NPUkVfTElNSVQgKiAzKTsKQEAgLTIzNiwxMCArMjMzLDggQEAgcHVibGljIHZvaWQgdGVzdExhcmdlX1NpbmdsZVdyaXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCQlhc3NlcnRFcXVhbHModGVzdC5sZW5ndGgsIHIubGVuZ3RoKTsKIAkJCQlhc3NlcnRBcnJheUVxdWFscyh0ZXN0LCByKTsKIAkJCX0KLQkJCXsKLQkJCQlmaW5hbCBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gbyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKwkJCXRyeSAoQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG8gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCkpIHsKIAkJCQliLndyaXRlVG8obywgbnVsbCk7Ci0JCQkJby5jbG9zZSgpOwogCQkJCWZpbmFsIGJ5dGVbXSByID0gby50b0J5dGVBcnJheSgpOwogCQkJCWFzc2VydEVxdWFscyh0ZXN0Lmxlbmd0aCwgci5sZW5ndGgpOwogCQkJCWFzc2VydEFycmF5RXF1YWxzKHRlc3QsIHIpOwpAQCAtMjUzLDE4ICsyNDgsMTggQEAgcHVibGljIHZvaWQgdGVzdExhcmdlX1NpbmdsZVdyaXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAlwdWJsaWMgdm9pZCB0ZXN0SW5Db3JlSW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBpbnQgY250ID0gMjU2OwogCQlmaW5hbCBieXRlW10gdGVzdCA9IG5ldyBUZXN0Um5nKGdldE5hbWUoKSkubmV4dEJ5dGVzKGNudCk7Ci0JCWZpbmFsIFRlbXBvcmFyeUJ1ZmZlci5IZWFwIGIgPSBuZXcgVGVtcG9yYXJ5QnVmZmVyLkhlYXAoY250ICsgNCk7Ci0JCWIud3JpdGUodGVzdCk7Ci0JCWIuY2xvc2UoKTsKLQotCQlJbnB1dFN0cmVhbSBpbiA9IGIub3BlbklucHV0U3RyZWFtKCk7Ci0JCWJ5dGVbXSBhY3QgPSBuZXcgYnl0ZVtjbnRdOwotCQlJTy5yZWFkRnVsbHkoaW4sIGFjdCwgMCwgY250KTsKLQkJYXNzZXJ0QXJyYXlFcXVhbHModGVzdCwgYWN0KTsKKwkJdHJ5IChUZW1wb3JhcnlCdWZmZXIuSGVhcCBiID0gbmV3IFRlbXBvcmFyeUJ1ZmZlci5IZWFwKGNudCArIDQpKSB7CisJCQliLndyaXRlKHRlc3QpOworCQkJSW5wdXRTdHJlYW0gaW4gPSBiLm9wZW5JbnB1dFN0cmVhbSgpOworCQkJYnl0ZVtdIGFjdCA9IG5ldyBieXRlW2NudF07CisJCQlJTy5yZWFkRnVsbHkoaW4sIGFjdCwgMCwgY250KTsKKwkJCWFzc2VydEFycmF5RXF1YWxzKHRlc3QsIGFjdCk7CisJCX0KIAl9CiAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RJbkNvcmVMaW1pdF9Td2l0Y2hPbkFwcGVuZEJ5dGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBCdWZmZXIgaXMgZXhwbGljaXRseSBkZXN0cm95ZWQgaW4gZmluYWxseSBibG9jawogCQlmaW5hbCBUZW1wb3JhcnlCdWZmZXIgYiA9IG5ldyBUZW1wb3JhcnlCdWZmZXIuTG9jYWxGaWxlKG51bGwpOwogCQlmaW5hbCBieXRlW10gdGVzdCA9IG5ldyBUZXN0Um5nKGdldE5hbWUoKSkKIAkJCQkubmV4dEJ5dGVzKFRlbXBvcmFyeUJ1ZmZlci5ERUZBVUxUX0lOX0NPUkVfTElNSVQgKyAxKTsKQEAgLTI3OSwxMCArMjc0LDggQEAgcHVibGljIHZvaWQgdGVzdEluQ29yZUxpbWl0X1N3aXRjaE9uQXBwZW5kQnl0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQkJYXNzZXJ0RXF1YWxzKHRlc3QubGVuZ3RoLCByLmxlbmd0aCk7CiAJCQkJYXNzZXJ0QXJyYXlFcXVhbHModGVzdCwgcik7CiAJCQl9Ci0JCQl7Ci0JCQkJZmluYWwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG8gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisJCQl0cnkgKEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpKSB7CiAJCQkJYi53cml0ZVRvKG8sIG51bGwpOwotCQkJCW8uY2xvc2UoKTsKIAkJCQlmaW5hbCBieXRlW10gciA9IG8udG9CeXRlQXJyYXkoKTsKIAkJCQlhc3NlcnRFcXVhbHModGVzdC5sZW5ndGgsIHIubGVuZ3RoKTsKIAkJCQlhc3NlcnRBcnJheUVxdWFscyh0ZXN0LCByKTsKQEAgLTI5NCw2ICsyODcsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0SW5Db3JlTGltaXRfU3dpdGNoT25BcHBlbmRCeXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdEluQ29yZUxpbWl0X1N3aXRjaEJlZm9yZUFwcGVuZEJ5dGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBCdWZmZXIgaXMgZXhwbGljaXRseSBkZXN0cm95ZWQgaW4gZmluYWxseSBibG9jawogCQlmaW5hbCBUZW1wb3JhcnlCdWZmZXIgYiA9IG5ldyBUZW1wb3JhcnlCdWZmZXIuTG9jYWxGaWxlKG51bGwpOwogCQlmaW5hbCBieXRlW10gdGVzdCA9IG5ldyBUZXN0Um5nKGdldE5hbWUoKSkKIAkJCQkubmV4dEJ5dGVzKFRlbXBvcmFyeUJ1ZmZlci5ERUZBVUxUX0lOX0NPUkVfTElNSVQgKiAzKTsKQEAgLTMwOCwxMCArMzAyLDggQEAgcHVibGljIHZvaWQgdGVzdEluQ29yZUxpbWl0X1N3aXRjaEJlZm9yZUFwcGVuZEJ5dGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJCWFzc2VydEVxdWFscyh0ZXN0Lmxlbmd0aCwgci5sZW5ndGgpOwogCQkJCWFzc2VydEFycmF5RXF1YWxzKHRlc3QsIHIpOwogCQkJfQotCQkJewotCQkJCWZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworCQkJdHJ5IChCeXRlQXJyYXlPdXRwdXRTdHJlYW0gbyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKSkgewogCQkJCWIud3JpdGVUbyhvLCBudWxsKTsKLQkJCQlvLmNsb3NlKCk7CiAJCQkJZmluYWwgYnl0ZVtdIHIgPSBvLnRvQnl0ZUFycmF5KCk7CiAJCQkJYXNzZXJ0RXF1YWxzKHRlc3QubGVuZ3RoLCByLmxlbmd0aCk7CiAJCQkJYXNzZXJ0QXJyYXlFcXVhbHModGVzdCwgcik7CkBAIC0zMjMsNiArMzE1LDcgQEAgcHVibGljIHZvaWQgdGVzdEluQ29yZUxpbWl0X1N3aXRjaEJlZm9yZUFwcGVuZEJ5dGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0SW5Db3JlTGltaXRfU3dpdGNoT25Db3B5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikgLy8gQnVmZmVyIGlzIGV4cGxpY2l0bHkgZGVzdHJveWVkIGluIGZpbmFsbHkgYmxvY2sKIAkJZmluYWwgVGVtcG9yYXJ5QnVmZmVyIGIgPSBuZXcgVGVtcG9yYXJ5QnVmZmVyLkxvY2FsRmlsZShudWxsKTsKIAkJZmluYWwgYnl0ZVtdIHRlc3QgPSBuZXcgVGVzdFJuZyhnZXROYW1lKCkpCiAJCQkJLm5leHRCeXRlcyhUZW1wb3JhcnlCdWZmZXIuREVGQVVMVF9JTl9DT1JFX0xJTUlUICogMik7CkBAIC0zNDAsMTAgKzMzMyw4IEBAIHB1YmxpYyB2b2lkIHRlc3RJbkNvcmVMaW1pdF9Td2l0Y2hPbkNvcHkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJCWFzc2VydEVxdWFscyh0ZXN0Lmxlbmd0aCwgci5sZW5ndGgpOwogCQkJCWFzc2VydEFycmF5RXF1YWxzKHRlc3QsIHIpOwogCQkJfQotCQkJewotCQkJCWZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworCQkJdHJ5IChCeXRlQXJyYXlPdXRwdXRTdHJlYW0gbyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKSkgewogCQkJCWIud3JpdGVUbyhvLCBudWxsKTsKLQkJCQlvLmNsb3NlKCk7CiAJCQkJZmluYWwgYnl0ZVtdIHIgPSBvLnRvQnl0ZUFycmF5KCk7CiAJCQkJYXNzZXJ0RXF1YWxzKHRlc3QubGVuZ3RoLCByLmxlbmd0aCk7CiAJCQkJYXNzZXJ0QXJyYXlFcXVhbHModGVzdCwgcik7CkBAIC0zNTUsNyArMzQ2LDcgQEAgcHVibGljIHZvaWQgdGVzdEluQ29yZUxpbWl0X1N3aXRjaE9uQ29weSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3REZXN0cm95V2hpbGVPcGVuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIiAvKiBqYXZhIDcgKi8pCisJCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpIC8vIEJ1ZmZlciBpcyBleHBsaWNpdGx5IGRlc3Ryb3llZCBpbiBmaW5hbGx5IGJsb2NrCiAJCWZpbmFsIFRlbXBvcmFyeUJ1ZmZlciBiID0gbmV3IFRlbXBvcmFyeUJ1ZmZlci5Mb2NhbEZpbGUobnVsbCk7CiAJCXRyeSB7CiAJCQliLndyaXRlKG5ldyBUZXN0Um5nKGdldE5hbWUoKSkKQEAgLTM2Nyw2ICszNTgsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0RGVzdHJveVdoaWxlT3BlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RSYW5kb21Xcml0ZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBCdWZmZXIgaXMgZXhwbGljaXRseSBkZXN0cm95ZWQgaW4gZmluYWxseSBibG9jawogCQlmaW5hbCBUZW1wb3JhcnlCdWZmZXIgYiA9IG5ldyBUZW1wb3JhcnlCdWZmZXIuTG9jYWxGaWxlKG51bGwpOwogCQlmaW5hbCBUZXN0Um5nIHJuZyA9IG5ldyBUZXN0Um5nKGdldE5hbWUoKSk7CiAJCWZpbmFsIGludCBtYXggPSBUZW1wb3JhcnlCdWZmZXIuREVGQVVMVF9JTl9DT1JFX0xJTUlUICogMjsKQEAgLTM5OSwxMCArMzkxLDggQEAgcHVibGljIHZvaWQgdGVzdFJhbmRvbVdyaXRlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdC5sZW5ndGgsIHIubGVuZ3RoKTsKIAkJCQlhc3NlcnRBcnJheUVxdWFscyhleHBlY3QsIHIpOwogCQkJfQotCQkJewotCQkJCWZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworCQkJdHJ5IChCeXRlQXJyYXlPdXRwdXRTdHJlYW0gbyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKSkgewogCQkJCWIud3JpdGVUbyhvLCBudWxsKTsKLQkJCQlvLmNsb3NlKCk7CiAJCQkJZmluYWwgYnl0ZVtdIHIgPSBvLnRvQnl0ZUFycmF5KCk7CiAJCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdC5sZW5ndGgsIHIubGVuZ3RoKTsKIAkJCQlhc3NlcnRBcnJheUVxdWFscyhleHBlY3QsIHIpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vQXV0b0NSTEZPdXRwdXRTdHJlYW1UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9BdXRvQ1JMRk91dHB1dFN0cmVhbVRlc3QuamF2YQppbmRleCBhNzJkMzNjLi4wNjU1ODI3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9BdXRvQ1JMRk91dHB1dFN0cmVhbVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9BdXRvQ1JMRk91dHB1dFN0cmVhbVRlc3QuamF2YQpAQCAtOTYsMzIgKzk2LDMxIEBAIHByaXZhdGUgdm9pZCBhc3NlcnROb0NyTGZIZWxwZXIoU3RyaW5nIGV4cGVjdCwgU3RyaW5nIGlucHV0KQogCQlmb3IgKGludCBpID0gLTQ7IGkgPCA1OyArK2kpIHsKIAkJCWludCBzaXplID0gTWF0aC5hYnMoaSk7CiAJCQlieXRlW10gYnVmID0gbmV3IGJ5dGVbc2l6ZV07Ci0JCQlJbnB1dFN0cmVhbSBpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShpbmJ5dGVzKTsKLQkJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEF1dG9DUkxGT3V0cHV0U3RyZWFtKGJvcyk7Ci0JCQlpZiAoaSA+IDApIHsKLQkJCQlpbnQgbjsKLQkJCQl3aGlsZSAoKG4gPSBpbi5yZWFkKGJ1ZikpID49IDApIHsKLQkJCQkJb3V0LndyaXRlKGJ1ZiwgMCwgbik7CisJCQl0cnkgKElucHV0U3RyZWFtIGluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGluYnl0ZXMpOworCQkJCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworCQkJCQlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEF1dG9DUkxGT3V0cHV0U3RyZWFtKGJvcykpIHsKKwkJCQlpZiAoaSA+IDApIHsKKwkJCQkJaW50IG47CisJCQkJCXdoaWxlICgobiA9IGluLnJlYWQoYnVmKSkgPj0gMCkgeworCQkJCQkJb3V0LndyaXRlKGJ1ZiwgMCwgbik7CisJCQkJCX0KKwkJCQl9IGVsc2UgaWYgKGkgPCAwKSB7CisJCQkJCWludCBuOworCQkJCQl3aGlsZSAoKG4gPSBpbi5yZWFkKGJ1ZikpID49IDApIHsKKwkJCQkJCWJ5dGVbXSBiID0gbmV3IGJ5dGVbbl07CisJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGJ1ZiwgMCwgYiwgMCwgbik7CisJCQkJCQlvdXQud3JpdGUoYik7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlpbnQgYzsKKwkJCQkJd2hpbGUgKChjID0gaW4ucmVhZCgpKSAhPSAtMSkKKwkJCQkJCW91dC53cml0ZShjKTsKIAkJCQl9Ci0JCQl9IGVsc2UgaWYgKGkgPCAwKSB7Ci0JCQkJaW50IG47Ci0JCQkJd2hpbGUgKChuID0gaW4ucmVhZChidWYpKSA+PSAwKSB7Ci0JCQkJCWJ5dGVbXSBiID0gbmV3IGJ5dGVbbl07Ci0JCQkJCVN5c3RlbS5hcnJheWNvcHkoYnVmLCAwLCBiLCAwLCBuKTsKLQkJCQkJb3V0LndyaXRlKGIpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaW50IGM7Ci0JCQkJd2hpbGUgKChjID0gaW4ucmVhZCgpKSAhPSAtMSkKLQkJCQkJb3V0LndyaXRlKGMpOworCQkJCW91dC5mbHVzaCgpOworCQkJCWJ5dGVbXSBhY3R1YWxCeXRlcyA9IGJvcy50b0J5dGVBcnJheSgpOworCQkJCUFzc2VydC5hc3NlcnRFcXVhbHMoImJ1ZnNpemU9IiArIHNpemUsIGVuY29kZShleHBlY3RCeXRlcyksCisJCQkJCQllbmNvZGUoYWN0dWFsQnl0ZXMpKTsKIAkJCX0KLQkJCW91dC5mbHVzaCgpOwotCQkJaW4uY2xvc2UoKTsKLQkJCW91dC5jbG9zZSgpOwotCQkJYnl0ZVtdIGFjdHVhbEJ5dGVzID0gYm9zLnRvQnl0ZUFycmF5KCk7Ci0JCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJidWZzaXplPSIgKyBzaXplLCBlbmNvZGUoZXhwZWN0Qnl0ZXMpLAotCQkJCQllbmNvZGUoYWN0dWFsQnl0ZXMpKTsKIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vQXV0b0xGSW5wdXRTdHJlYW1UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9BdXRvTEZJbnB1dFN0cmVhbVRlc3QuamF2YQppbmRleCAzODE5OWQ4Li41MDU4MTY1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9BdXRvTEZJbnB1dFN0cmVhbVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9BdXRvTEZJbnB1dFN0cmVhbVRlc3QuamF2YQpAQCAtNDQsNyArNDQsNyBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5pbzsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIAogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CkBAIC05NywzOCArOTcsNDEgQEAgcHVibGljIHZvaWQgdGVzdEJpbmFyeURvbnREZXRlY3QoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCiAJcHJpdmF0ZSBzdGF0aWMgdm9pZCB0ZXN0KGJ5dGVbXSBpbnB1dCwgYnl0ZVtdIGV4cGVjdGVkLAogCQkJYm9vbGVhbiBkZXRlY3RCaW5hcnkpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZpbmFsIElucHV0U3RyZWFtIGJpczEgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oaW5wdXQpOwotCQlmaW5hbCBJbnB1dFN0cmVhbSBjaXMxID0gbmV3IEF1dG9MRklucHV0U3RyZWFtKGJpczEsIGRldGVjdEJpbmFyeSk7Ci0JCWludCBpbmRleDEgPSAwOwotCQlmb3IgKGludCBiID0gY2lzMS5yZWFkKCk7IGIgIT0gLTE7IGIgPSBjaXMxLnJlYWQoKSkgewotCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkW2luZGV4MV0sIChieXRlKSBiKTsKLQkJCWluZGV4MSsrOwotCQl9Ci0KLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgaW5kZXgxKTsKLQotCQlmb3IgKGludCBidWZmZXJTaXplID0gMTsgYnVmZmVyU2l6ZSA8IDEwOyBidWZmZXJTaXplKyspIHsKLQkJCWZpbmFsIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVtidWZmZXJTaXplXTsKLQkJCWZpbmFsIElucHV0U3RyZWFtIGJpczIgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oaW5wdXQpOwotCQkJZmluYWwgSW5wdXRTdHJlYW0gY2lzMiA9IG5ldyBBdXRvTEZJbnB1dFN0cmVhbShiaXMyLCBkZXRlY3RCaW5hcnkpOwotCi0JCQlpbnQgcmVhZCA9IDA7Ci0JCQlmb3IgKGludCByZWFkTm93ID0gY2lzMi5yZWFkKGJ1ZmZlciwgMCwgYnVmZmVyLmxlbmd0aCk7IHJlYWROb3cgIT0gLTEKLQkJCQkJJiYgcmVhZCA8IGV4cGVjdGVkLmxlbmd0aDsgcmVhZE5vdyA9IGNpczIucmVhZChidWZmZXIsIDAsCi0JCQkJCWJ1ZmZlci5sZW5ndGgpKSB7Ci0JCQkJZm9yIChpbnQgaW5kZXgyID0gMDsgaW5kZXgyIDwgcmVhZE5vdzsgaW5kZXgyKyspIHsKLQkJCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkW3JlYWQgKyBpbmRleDJdLCBidWZmZXJbaW5kZXgyXSk7Ci0JCQkJfQotCQkJCXJlYWQgKz0gcmVhZE5vdzsKKwkJdHJ5IChJbnB1dFN0cmVhbSBiaXMxID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGlucHV0KTsKKwkJCQlJbnB1dFN0cmVhbSBjaXMxID0gbmV3IEF1dG9MRklucHV0U3RyZWFtKGJpczEsIGRldGVjdEJpbmFyeSkpIHsKKwkJCWludCBpbmRleDEgPSAwOworCQkJZm9yIChpbnQgYiA9IGNpczEucmVhZCgpOyBiICE9IC0xOyBiID0gY2lzMS5yZWFkKCkpIHsKKwkJCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRbaW5kZXgxXSwgKGJ5dGUpIGIpOworCQkJCWluZGV4MSsrOwogCQkJfQogCi0JCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCByZWFkKTsKLQkJCWNpczIuY2xvc2UoKTsKKwkJCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGluZGV4MSk7CisKKwkJCWZvciAoaW50IGJ1ZmZlclNpemUgPSAxOyBidWZmZXJTaXplIDwgMTA7IGJ1ZmZlclNpemUrKykgeworCQkJCWZpbmFsIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVtidWZmZXJTaXplXTsKKwkJCQl0cnkgKElucHV0U3RyZWFtIGJpczIgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oaW5wdXQpOworCQkJCQkJSW5wdXRTdHJlYW0gY2lzMiA9IG5ldyBBdXRvTEZJbnB1dFN0cmVhbShiaXMyLAorCQkJCQkJCQlkZXRlY3RCaW5hcnkpKSB7CisKKwkJCQkJaW50IHJlYWQgPSAwOworCQkJCQlmb3IgKGludCByZWFkTm93ID0gY2lzMi5yZWFkKGJ1ZmZlciwgMCwKKwkJCQkJCQlidWZmZXIubGVuZ3RoKTsgcmVhZE5vdyAhPSAtMQorCQkJCQkJCQkJJiYgcmVhZCA8IGV4cGVjdGVkLmxlbmd0aDsgcmVhZE5vdyA9IGNpczIKKwkJCQkJCQkJCQkJLnJlYWQoYnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoKSkgeworCQkJCQkJZm9yIChpbnQgaW5kZXgyID0gMDsgaW5kZXgyIDwgcmVhZE5vdzsgaW5kZXgyKyspIHsKKwkJCQkJCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRbcmVhZCArIGluZGV4Ml0sCisJCQkJCQkJCQlidWZmZXJbaW5kZXgyXSk7CisJCQkJCQl9CisJCQkJCQlyZWFkICs9IHJlYWROb3c7CisJCQkJCX0KKworCQkJCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCByZWFkKTsKKwkJCQl9CisJCQl9CiAJCX0KLQkJY2lzMS5jbG9zZSgpOwogCX0KIAogCXByaXZhdGUgc3RhdGljIGJ5dGVbXSBhc0J5dGVzKFN0cmluZyBpbikgewotCQlyZXR1cm4gaW4uZ2V0Qnl0ZXMoVVRGXzgpOworCQlyZXR1cm4gaW4uZ2V0Qnl0ZXMoQ0hBUlNFVCk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vVW5pb25JbnB1dFN0cmVhbVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL1VuaW9uSW5wdXRTdHJlYW1UZXN0LmphdmEKaW5kZXggNmI1ZWY3ZS4uYjgyNGZhZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vVW5pb25JbnB1dFN0cmVhbVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9VbmlvbklucHV0U3RyZWFtVGVzdC5qYXZhCkBAIC01OCwxMyArNTgsMTMgQEAKIHB1YmxpYyBjbGFzcyBVbmlvbklucHV0U3RyZWFtVGVzdCB7CiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0RW1wdHlTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmaW5hbCBVbmlvbklucHV0U3RyZWFtIHUgPSBuZXcgVW5pb25JbnB1dFN0cmVhbSgpOwotCQlhc3NlcnRUcnVlKHUuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCB1LnJlYWQoKSk7Ci0JCWFzc2VydEVxdWFscygtMSwgdS5yZWFkKG5ldyBieXRlWzFdLCAwLCAxKSk7Ci0JCWFzc2VydEVxdWFscygwLCB1LmF2YWlsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHUuc2tpcCgxKSk7Ci0JCXUuY2xvc2UoKTsKKwkJdHJ5IChVbmlvbklucHV0U3RyZWFtIHUgPSBuZXcgVW5pb25JbnB1dFN0cmVhbSgpKSB7CisJCQlhc3NlcnRUcnVlKHUuaXNFbXB0eSgpKTsKKwkJCWFzc2VydEVxdWFscygtMSwgdS5yZWFkKCkpOworCQkJYXNzZXJ0RXF1YWxzKC0xLCB1LnJlYWQobmV3IGJ5dGVbMV0sIDAsIDEpKTsKKwkJCWFzc2VydEVxdWFscygwLCB1LmF2YWlsYWJsZSgpKTsKKwkJCWFzc2VydEVxdWFscygwLCB1LnNraXAoMSkpOworCQl9CiAJfQogCiAJQFRlc3QKQEAgLTIxMSwyNSArMjExLDI0IEBAIHB1YmxpYyB2b2lkIGNsb3NlKCkgewogCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0Q2xvc2VEdXJpbmdDbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZpbmFsIFVuaW9uSW5wdXRTdHJlYW0gdSA9IG5ldyBVbmlvbklucHV0U3RyZWFtKCk7CiAJCWZpbmFsIGJvb2xlYW4gY2xvc2VkW10gPSBuZXcgYm9vbGVhblsyXTsKLQkJdS5hZGQobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG5ldyBieXRlW10geyAxIH0pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgY2xvc2UoKSB7Ci0JCQkJY2xvc2VkWzBdID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JCXUuYWRkKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVtdIHsgMiB9KSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGNsb3NlKCkgewotCQkJCWNsb3NlZFsxXSA9IHRydWU7Ci0JCQl9Ci0JCX0pOworCQl0cnkgKFVuaW9uSW5wdXRTdHJlYW0gdSA9IG5ldyBVbmlvbklucHV0U3RyZWFtKCkpIHsKKwkJCXUuYWRkKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVtdIHsgMSB9KSB7CisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIHZvaWQgY2xvc2UoKSB7CisJCQkJCWNsb3NlZFswXSA9IHRydWU7CisJCQkJfQorCQkJfSk7CisJCQl1LmFkZChuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obmV3IGJ5dGVbXSB7IDIgfSkgeworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyB2b2lkIGNsb3NlKCkgeworCQkJCQljbG9zZWRbMV0gPSB0cnVlOworCQkJCX0KKwkJCX0pOwogCi0JCWFzc2VydEZhbHNlKGNsb3NlZFswXSk7Ci0JCWFzc2VydEZhbHNlKGNsb3NlZFsxXSk7Ci0KLQkJdS5jbG9zZSgpOworCQkJYXNzZXJ0RmFsc2UoY2xvc2VkWzBdKTsKKwkJCWFzc2VydEZhbHNlKGNsb3NlZFsxXSk7CisJCX0KIAogCQlhc3NlcnRUcnVlKGNsb3NlZFswXSk7CiAJCWFzc2VydFRydWUoY2xvc2VkWzFdKTsKQEAgLTIzNyw2ICsyMzYsNyBAQCBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKIAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdEV4Y2VwdGlvbkR1cmluZ0Nsb3NlKCkgeworCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBXZSBhcmUgdGVzdGluZyB0aGUgY2xvc2UoKSBtZXRob2QKIAkJZmluYWwgVW5pb25JbnB1dFN0cmVhbSB1ID0gbmV3IFVuaW9uSW5wdXRTdHJlYW0oKTsKIAkJdS5hZGQobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG5ldyBieXRlW10geyAxIH0pIHsKIAkJCUBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvc2hhMS9TSEExVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvc2hhMS9TSEExVGVzdC5qYXZhCmluZGV4IGU2MDQ1YTkuLjNjNjEyZTEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL3NoYTEvU0hBMVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9zaGExL1NIQTFUZXN0LmphdmEKQEAgLTQzLDcgKzQzLDcgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuc2hhMTsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CkBAIC05NSwxNSArOTUsMTUgQEAgcHVibGljIHZvaWQgdGVzdDEoKSB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHsKIAkJCQkuZnJvbVN0cmluZygiYTk5OTNlMzY0NzA2ODE2YWJhM2UyNTcxNzg1MGMyNmM5Y2QwZDg5ZCIpOwogCiAJCU1lc3NhZ2VEaWdlc3QgbSA9IE1lc3NhZ2VEaWdlc3QuZ2V0SW5zdGFuY2UoIlNIQS0xIik7Ci0JCW0udXBkYXRlKFRFU1QxLmdldEJ5dGVzKFVURl84KSk7CisJCW0udXBkYXRlKFRFU1QxLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJT2JqZWN0SWQgbTEgPSBPYmplY3RJZC5mcm9tUmF3KG0uZGlnZXN0KCkpOwogCiAJCVNIQTEgcyA9IFNIQTEubmV3SW5zdGFuY2UoKTsKLQkJcy51cGRhdGUoVEVTVDEuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJcy51cGRhdGUoVEVTVDEuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQlPYmplY3RJZCBzMSA9IE9iamVjdElkLmZyb21SYXcocy5kaWdlc3QoKSk7CiAKIAkJcy5yZXNldCgpOwotCQlzLnVwZGF0ZShURVNUMS5nZXRCeXRlcyhVVEZfOCkpOworCQlzLnVwZGF0ZShURVNUMS5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCU9iamVjdElkIHMyID0gcy50b09iamVjdElkKCk7CiAKIAkJYXNzZXJ0RXF1YWxzKG0xLCBzMSk7CkBAIC0xMTcsMTUgKzExNywxNSBAQCBwdWJsaWMgdm9pZCB0ZXN0MigpIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gewogCQkJCS5mcm9tU3RyaW5nKCI4NDk4M2U0NDFjM2JkMjZlYmFhZTRhYTFmOTUxMjllNWU1NDY3MGYxIik7CiAKIAkJTWVzc2FnZURpZ2VzdCBtID0gTWVzc2FnZURpZ2VzdC5nZXRJbnN0YW5jZSgiU0hBLTEiKTsKLQkJbS51cGRhdGUoVEVTVDIuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJbS51cGRhdGUoVEVTVDIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQlPYmplY3RJZCBtMSA9IE9iamVjdElkLmZyb21SYXcobS5kaWdlc3QoKSk7CiAKIAkJU0hBMSBzID0gU0hBMS5uZXdJbnN0YW5jZSgpOwotCQlzLnVwZGF0ZShURVNUMi5nZXRCeXRlcyhVVEZfOCkpOworCQlzLnVwZGF0ZShURVNUMi5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCU9iamVjdElkIHMxID0gT2JqZWN0SWQuZnJvbVJhdyhzLmRpZ2VzdCgpKTsKIAogCQlzLnJlc2V0KCk7Ci0JCXMudXBkYXRlKFRFU1QyLmdldEJ5dGVzKFVURl84KSk7CisJCXMudXBkYXRlKFRFU1QyLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJT2JqZWN0SWQgczIgPSBzLnRvT2JqZWN0SWQoKTsKIAogCQlhc3NlcnRFcXVhbHMobTEsIHMxKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0LnVpL01FVEEtSU5GL01BTklGRVNULk1GCmluZGV4IDU0YTI2YjkuLjc2NjdhZjQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtNCwxNCArNCwxNCBAQAogQnVuZGxlLU5hbWU6ICVwbHVnaW5fbmFtZQogQXV0b21hdGljLU1vZHVsZS1OYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LnVpCiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LnVpCi1CdW5kbGUtVmVyc2lvbjogNC4xMS44LnF1YWxpZmllcgorQnVuZGxlLVZlcnNpb246IDUuMC40LnF1YWxpZmllcgogQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyX25hbWUKIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKYXZhU0UtMS44Ci1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5hd3R1aTt2ZXJzaW9uPSI0LjExLjgiCi1JbXBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5lcnJvcnM7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmxpYjt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubmxzO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5yZXZwbG90O3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIgorRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQuYXd0dWk7dmVyc2lvbj0iNS4wLjQiCitJbXBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5lcnJvcnM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5ubHM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5yZXZwbG90O3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudWkvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQudWkvcG9tLnhtbAppbmRleCBhMDcyNzc4Li43ZDEwYzA5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnVpL3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC51aS9wb20ueG1sCkBAIC01Miw3ICs1Miw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj40LjExLjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+NS4wLjQtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQudWk8L2FydGlmYWN0SWQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnVpL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2F3dHVpL0FXVFBsb3RSZW5kZXJlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC51aS9zcmMvb3JnL2VjbGlwc2UvamdpdC9hd3R1aS9BV1RQbG90UmVuZGVyZXIuamF2YQppbmRleCBiY2NmMGMwLi5iMWZmZmQ4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnVpL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2F3dHVpL0FXVFBsb3RSZW5kZXJlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudWkvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXd0dWkvQVdUUGxvdFJlbmRlcmVyLmphdmEKQEAgLTY2LDExICs2NiwxMSBAQCBmaW5hbCBjbGFzcyBBV1RQbG90UmVuZGVyZXIgZXh0ZW5kcyBBYnN0cmFjdFBsb3RSZW5kZXJlcjxTd2luZ0xhbmUsIENvbG9yPgogCiAJdHJhbnNpZW50IEdyYXBoaWNzMkQgZzsKIAotCUFXVFBsb3RSZW5kZXJlcihmaW5hbCBHcmFwaENlbGxSZW5kZXIgYykgeworCUFXVFBsb3RSZW5kZXJlcihHcmFwaENlbGxSZW5kZXIgYykgewogCQljZWxsID0gYzsKIAl9CiAKLQl2b2lkIHBhaW50KGZpbmFsIEdyYXBoaWNzIGluLCBmaW5hbCBQbG90Q29tbWl0PFN3aW5nTGFuZT4gY29tbWl0KSB7CisJdm9pZCBwYWludChHcmFwaGljcyBpbiwgUGxvdENvbW1pdDxTd2luZ0xhbmU+IGNvbW1pdCkgewogCQlnID0gKEdyYXBoaWNzMkQpIGluLmNyZWF0ZSgpOwogCQl0cnkgewogCQkJZmluYWwgaW50IGggPSBjZWxsLmdldEhlaWdodCgpOwpAQCAtMTI1LDcgKzEyNSw3IEBAIHByb3RlY3RlZCB2b2lkIGRyYXdCb3VuZGFyeURvdChmaW5hbCBpbnQgeCwgZmluYWwgaW50IHksIGZpbmFsIGludCB3LAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkcmF3VGV4dChmaW5hbCBTdHJpbmcgbXNnLCBmaW5hbCBpbnQgeCwgZmluYWwgaW50IHkpIHsKKwlwcm90ZWN0ZWQgdm9pZCBkcmF3VGV4dChTdHJpbmcgbXNnLCBpbnQgeCwgaW50IHkpIHsKIAkJZmluYWwgaW50IHRleHRoID0gZy5nZXRGb250TWV0cmljcygpLmdldEhlaWdodCgpOwogCQlmaW5hbCBpbnQgeTAgPSAoeSAtIHRleHRoKSAvIDIgKyAoY2VsbC5nZXRIZWlnaHQoKSAtIHRleHRoKSAvIDI7CiAJCWcuc2V0Q29sb3IoY2VsbC5nZXRGb3JlZ3JvdW5kKCkpOwpAQCAtMTM0LDExICsxMzQsMTEgQEAgcHJvdGVjdGVkIHZvaWQgZHJhd1RleHQoZmluYWwgU3RyaW5nIG1zZywgZmluYWwgaW50IHgsIGZpbmFsIGludCB5KSB7CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb2xvciBsYW5lQ29sb3IoZmluYWwgU3dpbmdMYW5lIG15TGFuZSkgeworCXByb3RlY3RlZCBDb2xvciBsYW5lQ29sb3IoU3dpbmdMYW5lIG15TGFuZSkgewogCQlyZXR1cm4gbXlMYW5lICE9IG51bGwgPyBteUxhbmUuY29sb3IgOiBDb2xvci5ibGFjazsKIAl9CiAKLQl2b2lkIHBhaW50VHJpYW5nbGVEb3duKGZpbmFsIGludCBjeCwgZmluYWwgaW50IHksIGZpbmFsIGludCBoKSB7CisJdm9pZCBwYWludFRyaWFuZ2xlRG93bihpbnQgY3gsIGludCB5LCBpbnQgaCkgewogCQlmaW5hbCBpbnQgdGlwWCA9IGN4OwogCQlmaW5hbCBpbnQgdGlwWSA9IHkgKyBoOwogCQlmaW5hbCBpbnQgYmFzZVgxID0gY3ggLSAxMCAvIDI7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnVpL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2F3dHVpL0NvbW1pdEdyYXBoUGFuZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC51aS9zcmMvb3JnL2VjbGlwc2UvamdpdC9hd3R1aS9Db21taXRHcmFwaFBhbmUuamF2YQppbmRleCBkMTIyYTc3Li45NDNhMzI1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnVpL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2F3dHVpL0NvbW1pdEdyYXBoUGFuZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudWkvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXd0dWkvQ29tbWl0R3JhcGhQYW5lLmphdmEKQEAgLTExNCw3ICsxMTQsNyBAQCBwdWJsaWMgUGxvdENvbW1pdExpc3QgZ2V0Q29tbWl0TGlzdCgpIHsKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0TW9kZWwoZmluYWwgVGFibGVNb2RlbCBkYXRhTW9kZWwpIHsKKwlwdWJsaWMgdm9pZCBzZXRNb2RlbChUYWJsZU1vZGVsIGRhdGFNb2RlbCkgewogCQlpZiAoZGF0YU1vZGVsICE9IG51bGwgJiYgIShkYXRhTW9kZWwgaW5zdGFuY2VvZiBDb21taXRUYWJsZU1vZGVsKSkKIAkJCXRocm93IG5ldyBDbGFzc0Nhc3RFeGNlcHRpb24oVUlUZXh0LmdldCgpLm11c3RCZVNwZWNpYWxUYWJsZU1vZGVsKTsKIAkJc3VwZXIuc2V0TW9kZWwoZGF0YU1vZGVsKTsKQEAgLTE2MSw3ICsxNjEsNyBAQCBwdWJsaWMgaW50IGdldFJvd0NvdW50KCkgewogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWVBdChmaW5hbCBpbnQgcm93SW5kZXgsIGZpbmFsIGludCBjb2x1bW5JbmRleCkgeworCQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlQXQoaW50IHJvd0luZGV4LCBpbnQgY29sdW1uSW5kZXgpIHsKIAkJCWZpbmFsIFBsb3RDb21taXQ8U3dpbmdMYW5lPiBjID0gYWxsQ29tbWl0cy5nZXQocm93SW5kZXgpOwogCQkJc3dpdGNoIChjb2x1bW5JbmRleCkgewogCQkJY2FzZSAwOgpAQCAtMTc1LDcgKzE3NSw3IEBAIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWVBdChmaW5hbCBpbnQgcm93SW5kZXgsIGZpbmFsIGludCBjb2x1bW5JbmRleCkgewogCQkJfQogCQl9CiAKLQkJUGVyc29uSWRlbnQgYXV0aG9yRm9yKGZpbmFsIFBsb3RDb21taXQ8U3dpbmdMYW5lPiBjKSB7CisJCVBlcnNvbklkZW50IGF1dGhvckZvcihQbG90Q29tbWl0PFN3aW5nTGFuZT4gYykgewogCQkJaWYgKGMgIT0gbGFzdENvbW1pdCkgewogCQkJCWxhc3RDb21taXQgPSBjOwogCQkJCWxhc3RBdXRob3IgPSBjLmdldEF1dGhvcklkZW50KCk7CkBAIC0yNDQsNyArMjQ0LDcgQEAgcHVibGljIENvbXBvbmVudCBnZXRUYWJsZUNlbGxSZW5kZXJlckNvbXBvbmVudChmaW5hbCBKVGFibGUgdGFibGUsCiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgcGFpbnRDb21wb25lbnQoZmluYWwgR3JhcGhpY3MgaW5wdXRHcmFwaGljcykgeworCQlwcm90ZWN0ZWQgdm9pZCBwYWludENvbXBvbmVudChHcmFwaGljcyBpbnB1dEdyYXBoaWNzKSB7CiAJCQlpZiAoaW5wdXRHcmFwaGljcyA9PSBudWxsKQogCQkJCXJldHVybjsKIAkJCXJlbmRlcmVyLnBhaW50KGlucHV0R3JhcGhpY3MsIGNvbW1pdCk7CkBAIC0yNTksNyArMjU5LDcgQEAgcHJvdGVjdGVkIHZvaWQgcGFpbnRDb21wb25lbnQoZmluYWwgR3JhcGhpY3MgaW5wdXRHcmFwaGljcykgewogCQkJc3Ryb2tlQ2FjaGVbaV0gPSBuZXcgQmFzaWNTdHJva2UoaSk7CiAJfQogCi0Jc3RhdGljIFN0cm9rZSBzdHJva2UoZmluYWwgaW50IHdpZHRoKSB7CisJc3RhdGljIFN0cm9rZSBzdHJva2UoaW50IHdpZHRoKSB7CiAJCWlmICh3aWR0aCA8IHN0cm9rZUNhY2hlLmxlbmd0aCkKIAkJCXJldHVybiBzdHJva2VDYWNoZVt3aWR0aF07CiAJCXJldHVybiBuZXcgQmFzaWNTdHJva2Uod2lkdGgpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC51aS9zcmMvb3JnL2VjbGlwc2UvamdpdC9hd3R1aS9Td2luZ0NvbW1pdExpc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudWkvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXd0dWkvU3dpbmdDb21taXRMaXN0LmphdmEKaW5kZXggNzQzZWI3OC4uMTA1MTljYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC51aS9zcmMvb3JnL2VjbGlwc2UvamdpdC9hd3R1aS9Td2luZ0NvbW1pdExpc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnVpL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2F3dHVpL1N3aW5nQ29tbWl0TGlzdC5qYXZhCkBAIC03OSw3ICs3OSw3IEBAIHByb3RlY3RlZCBTd2luZ0xhbmUgY3JlYXRlTGFuZSgpIHsKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcmVjeWNsZUxhbmUoZmluYWwgU3dpbmdMYW5lIGxhbmUpIHsKKwlwcm90ZWN0ZWQgdm9pZCByZWN5Y2xlTGFuZShTd2luZ0xhbmUgbGFuZSkgewogCQljb2xvcnMuYWRkKGxhbmUuY29sb3IpOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC8uc2V0dGluZ3MvLmFwaV9maWx0ZXJzIGIvb3JnLmVjbGlwc2UuamdpdC8uc2V0dGluZ3MvLmFwaV9maWx0ZXJzCmluZGV4IGNjMGQ3MGQuLmU2YTY5OGQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvLnNldHRpbmdzLy5hcGlfZmlsdGVycworKysgYi9vcmcuZWNsaXBzZS5qZ2l0Ly5zZXR0aW5ncy8uYXBpX2ZpbHRlcnMKQEAgLTMsMTcgKzMsOCBAQAogICAgIDxyZXNvdXJjZSBwYXRoPSJNRVRBLUlORi9NQU5JRkVTVC5NRiI+CiAgICAgICAgIDxmaWx0ZXIgaWQ9IjkyNDg0NDAzOSI+CiAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudHM+Ci0gICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IjQuMTEuNyIvPgotICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSI0LjExLjAiLz4KLSAgICAgICAgICAgIDwvbWVzc2FnZV9hcmd1bWVudHM+Ci0gICAgICAgIDwvZmlsdGVyPgotICAgIDwvcmVzb3VyY2U+Ci0gICAgPHJlc291cmNlIHBhdGg9InNyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db25zdGFudHMuamF2YSIgdHlwZT0ib3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzIj4KLSAgICAgICAgPGZpbHRlciBpZD0iMTE0MTg5OTI2NiI+Ci0gICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudHM+Ci0gICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IjQuNyIvPgotICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSI0LjExIi8+Ci0gICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IkxPQ0tfU1VGRklYIi8+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IjUuMC40Ii8+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IjUuMC4wIi8+CiAgICAgICAgICAgICA8L21lc3NhZ2VfYXJndW1lbnRzPgogICAgICAgICA8L2ZpbHRlcj4KICAgICA8L3Jlc291cmNlPgpAQCAtMzcsNyArMjgsNyBAQAogICAgICAgICA8ZmlsdGVyIGlkPSIxMTQxODk5MjY2Ij4KICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50cz4KICAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iNC43Ii8+Ci0gICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IjQuMTEiLz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iNS4wIi8+CiAgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9ImNyZWF0ZU5ld0ZpbGVBdG9taWMoRmlsZSkiLz4KICAgICAgICAgICAgIDwvbWVzc2FnZV9hcmd1bWVudHM+CiAgICAgICAgIDwvZmlsdGVyPgpAQCAtNTIsNyArNDMsNyBAQAogICAgICAgICA8ZmlsdGVyIGlkPSIxMTQxODk5MjY2Ij4KICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50cz4KICAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iNC43Ii8+Ci0gICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IjQuMTEiLz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iNS4wIi8+CiAgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IkxvY2tUb2tlbiIvPgogICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KICAgICAgICAgPC9maWx0ZXI+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC9NRVRBLUlORi9NQU5JRkVTVC5NRgppbmRleCAyYTU1ZDhhLi5hODExNGQ5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L01FVEEtSU5GL01BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTMsMTIgKzMsMTIgQEAKIEJ1bmRsZS1OYW1lOiAlcGx1Z2luX25hbWUKIEF1dG9tYXRpYy1Nb2R1bGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdAogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamdpdAotQnVuZGxlLVZlcnNpb246IDQuMTEuOC5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiA1LjAuNC5xdWFsaWZpZXIKIEJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgogQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyX25hbWUKIEJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5hbm5vdGF0aW9uczt2ZXJzaW9uPSI0LjExLjgiLAotIG9yZy5lY2xpcHNlLmpnaXQuYXBpO3ZlcnNpb249IjQuMTEuOCI7CitFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5hbm5vdGF0aW9uczt2ZXJzaW9uPSI1LjAuNCIsCisgb3JnLmVjbGlwc2UuamdpdC5hcGk7dmVyc2lvbj0iNS4wLjQiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLAogICAgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5maWx0ZXIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LmRpZmYsCkBAIC0yMiw1MiArMjIsNTIgQEAKICAgIG9yZy5lY2xpcHNlLmpnaXQuc3VibW9kdWxlLAogICAgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQsCiAgICBvcmcuZWNsaXBzZS5qZ2l0Lm1lcmdlIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnM7dmVyc2lvbj0iNC4xMS44Ijt1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5saWIsb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMiLAotIG9yZy5lY2xpcHNlLmpnaXQuYXR0cmlidXRlczt2ZXJzaW9uPSI0LjExLjgiLAotIG9yZy5lY2xpcHNlLmpnaXQuYmxhbWU7dmVyc2lvbj0iNC4xMS44IjsKKyBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnM7dmVyc2lvbj0iNS4wLjQiO3VzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LmxpYixvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycyIsCisgb3JnLmVjbGlwc2UuamdpdC5hdHRyaWJ1dGVzO3ZlcnNpb249IjUuMC40IiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmJsYW1lO3ZlcnNpb249IjUuMC40IjsKICAgdXNlczo9Im9yZy5lY2xpcHNlLmpnaXQubGliLAogICAgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLAogICAgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5maWx0ZXIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LmRpZmYiLAotIG9yZy5lY2xpcHNlLmpnaXQuZGlmZjt2ZXJzaW9uPSI0LjExLjgiOworIG9yZy5lY2xpcHNlLmpnaXQuZGlmZjt2ZXJzaW9uPSI1LjAuNCI7CiAgIHVzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LnBhdGNoLAogICAgb3JnLmVjbGlwc2UuamdpdC5saWIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLAogICAgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLAogICAgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5maWx0ZXIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwiLAotIG9yZy5lY2xpcHNlLmpnaXQuZGlyY2FjaGU7dmVyc2lvbj0iNC4xMS44IjsKKyBvcmcuZWNsaXBzZS5qZ2l0LmRpcmNhY2hlO3ZlcnNpb249IjUuMC40IjsKICAgdXNlczo9Im9yZy5lY2xpcHNlLmpnaXQubGliLAogICAgb3JnLmVjbGlwc2UuamdpdC50cmVld2FsaywKICAgIG9yZy5lY2xpcHNlLmpnaXQudXRpbCwKICAgIG9yZy5lY2xpcHNlLmpnaXQuZXZlbnRzLAogICAgb3JnLmVjbGlwc2UuamdpdC5hdHRyaWJ1dGVzIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmVycm9yczt2ZXJzaW9uPSI0LjExLjgiOworIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzO3ZlcnNpb249IjUuMC40IjsKICAgdXNlczo9Im9yZy5lY2xpcHNlLmpnaXQubGliLAogICAgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnBhY2ssCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydCwKICAgIG9yZy5lY2xpcHNlLmpnaXQuZGlyY2FjaGUiLAotIG9yZy5lY2xpcHNlLmpnaXQuZXZlbnRzO3ZlcnNpb249IjQuMTEuOCI7dXNlczo9Im9yZy5lY2xpcHNlLmpnaXQubGliIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmZubWF0Y2g7dmVyc2lvbj0iNC4xMS44IiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmdpdHJlcG87dmVyc2lvbj0iNC4xMS44IjsKKyBvcmcuZWNsaXBzZS5qZ2l0LmV2ZW50czt2ZXJzaW9uPSI1LjAuNCI7dXNlczo9Im9yZy5lY2xpcHNlLmpnaXQubGliIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmZubWF0Y2g7dmVyc2lvbj0iNS4wLjQiLAorIG9yZy5lY2xpcHNlLmpnaXQuZ2l0cmVwbzt2ZXJzaW9uPSI1LjAuNCI7CiAgIHVzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LmFwaSwKICAgIG9yZy5lY2xpcHNlLmpnaXQubGliLAogICAgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLAogICAgb3JnLnhtbC5zYXguaGVscGVycywKICAgIG9yZy54bWwuc2F4IiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmdpdHJlcG8uaW50ZXJuYWw7dmVyc2lvbj0iNC4xMS44Ijt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpnaXQuaG9va3M7dmVyc2lvbj0iNC4xMS44Ijt1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5saWIiLAotIG9yZy5lY2xpcHNlLmpnaXQuaWdub3JlO3ZlcnNpb249IjQuMTEuOCIsCi0gb3JnLmVjbGlwc2UuamdpdC5pZ25vcmUuaW50ZXJuYWw7dmVyc2lvbj0iNC4xMS44Ijt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0LnRlc3QiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWw7dmVyc2lvbj0iNC4xMS44Ijt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0LnRlc3Qsb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuZnNjazt2ZXJzaW9uPSI0LjExLjgiO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQudGVzdCIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5rZXRjaDt2ZXJzaW9uPSI0LjExLjgiO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQuanVuaXQsb3JnLmVjbGlwc2UuamdpdC50ZXN0LG9yZy5lY2xpcHNlLmpnaXQucGdtIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZGZzO3ZlcnNpb249IjQuMTEuOCI7Cisgb3JnLmVjbGlwc2UuamdpdC5naXRyZXBvLmludGVybmFsO3ZlcnNpb249IjUuMC40Ijt4LWludGVybmFsOj10cnVlLAorIG9yZy5lY2xpcHNlLmpnaXQuaG9va3M7dmVyc2lvbj0iNS4wLjQiO3VzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LmxpYiIsCisgb3JnLmVjbGlwc2UuamdpdC5pZ25vcmU7dmVyc2lvbj0iNS4wLjQiLAorIG9yZy5lY2xpcHNlLmpnaXQuaWdub3JlLmludGVybmFsO3ZlcnNpb249IjUuMC40Ijt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0LnRlc3QiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWw7dmVyc2lvbj0iNS4wLjQiO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQudGVzdCxvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdCIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5mc2NrO3ZlcnNpb249IjUuMC40Ijt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0LnRlc3QiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwua2V0Y2g7dmVyc2lvbj0iNS4wLjQiO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQuanVuaXQsb3JnLmVjbGlwc2UuamdpdC50ZXN0LG9yZy5lY2xpcHNlLmpnaXQucGdtIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZGZzO3ZlcnNpb249IjUuMC40IjsKICAgeC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamdpdC50ZXN0LAogICAgb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlciwKICAgIG9yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0LAogICAgb3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdCIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iNC4xMS44IjsKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSI1LjAuNCI7CiAgIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQudGVzdCwKICAgIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQsCiAgICBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Lmh0dHAsCkBAIC03NSwxMiArNzUsMTIgQEAKICAgIG9yZy5lY2xpcHNlLmpnaXQubGZzLAogICAgb3JnLmVjbGlwc2UuamdpdC5wZ20sCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0IiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuaW87dmVyc2lvbj0iNC4xMS44Ijt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LG9yZy5lY2xpcHNlLmpnaXQudGVzdCxvcmcuZWNsaXBzZS5qZ2l0LnBnbSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnBhY2s7dmVyc2lvbj0iNC4xMS44Ijt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LG9yZy5lY2xpcHNlLmpnaXQudGVzdCxvcmcuZWNsaXBzZS5qZ2l0LnBnbSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnJlZnRhYmxlO3ZlcnNpb249IjQuMTEuOCI7Cisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmlvO3ZlcnNpb249IjUuMC40Ijt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LG9yZy5lY2xpcHNlLmpnaXQudGVzdCxvcmcuZWNsaXBzZS5qZ2l0LnBnbSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnBhY2s7dmVyc2lvbj0iNS4wLjQiO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQuanVuaXQsb3JnLmVjbGlwc2UuamdpdC50ZXN0LG9yZy5lY2xpcHNlLmpnaXQucGdtIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucmVmdGFibGU7dmVyc2lvbj0iNS4wLjQiOwogICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdCxvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LG9yZy5lY2xpcHNlLmpnaXQudGVzdCxvcmcuZWNsaXBzZS5qZ2l0LnBnbSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnJlZnRyZWU7dmVyc2lvbj0iNC4xMS44Ijt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LG9yZy5lY2xpcHNlLmpnaXQudGVzdCxvcmcuZWNsaXBzZS5qZ2l0LnBnbSIsCi0gb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iNC4xMS44IjsKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucmVmdHJlZTt2ZXJzaW9uPSI1LjAuNCI7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamdpdC5qdW5pdCxvcmcuZWNsaXBzZS5qZ2l0LnRlc3Qsb3JnLmVjbGlwc2UuamdpdC5wZ20iLAorIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249IjUuMC40IjsKICAgdXNlczo9Im9yZy5lY2xpcHNlLmpnaXQucmV2d2FsaywKICAgIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyLAogICAgb3JnLmVjbGlwc2UuamdpdC51dGlsLApAQCAtOTAsMzMgKzkwLDMzIEBACiAgICBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLAogICAgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnN1Ym1vZHVsZSIsCi0gb3JnLmVjbGlwc2UuamdpdC5saWIuaW50ZXJuYWw7dmVyc2lvbj0iNC4xMS44Ijt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpnaXQubWVyZ2U7dmVyc2lvbj0iNC4xMS44IjsKKyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5pbnRlcm5hbDt2ZXJzaW9uPSI1LjAuNCI7eC1pbnRlcm5hbDo9dHJ1ZSwKKyBvcmcuZWNsaXBzZS5qZ2l0Lm1lcmdlO3ZlcnNpb249IjUuMC40IjsKICAgdXNlczo9Im9yZy5lY2xpcHNlLmpnaXQubGliLAogICAgb3JnLmVjbGlwc2UuamdpdC50cmVld2FsaywKICAgIG9yZy5lY2xpcHNlLmpnaXQucmV2d2FsaywKICAgIG9yZy5lY2xpcHNlLmpnaXQuZGlmZiwKICAgIG9yZy5lY2xpcHNlLmpnaXQuZGlyY2FjaGUsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LmFwaSIsCi0gb3JnLmVjbGlwc2UuamdpdC5ubHM7dmVyc2lvbj0iNC4xMS44IiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lm5vdGVzO3ZlcnNpb249IjQuMTEuOCI7Cisgb3JnLmVjbGlwc2UuamdpdC5ubHM7dmVyc2lvbj0iNS4wLjQiLAorIG9yZy5lY2xpcHNlLmpnaXQubm90ZXM7dmVyc2lvbj0iNS4wLjQiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5saWIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLAogICAgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLAogICAgb3JnLmVjbGlwc2UuamdpdC5tZXJnZSIsCi0gb3JnLmVjbGlwc2UuamdpdC5wYXRjaDt2ZXJzaW9uPSI0LjExLjgiO3VzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LmxpYixvcmcuZWNsaXBzZS5qZ2l0LmRpZmYiLAotIG9yZy5lY2xpcHNlLmpnaXQucmV2cGxvdDt2ZXJzaW9uPSI0LjExLjgiO3VzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LmxpYixvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsiLAotIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSI0LjExLjgiOworIG9yZy5lY2xpcHNlLmpnaXQucGF0Y2g7dmVyc2lvbj0iNS4wLjQiO3VzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LmxpYixvcmcuZWNsaXBzZS5qZ2l0LmRpZmYiLAorIG9yZy5lY2xpcHNlLmpnaXQucmV2cGxvdDt2ZXJzaW9uPSI1LjAuNCI7dXNlczo9Im9yZy5lY2xpcHNlLmpnaXQubGliLG9yZy5lY2xpcHNlLmpnaXQucmV2d2FsayIsCisgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrO3ZlcnNpb249IjUuMC40IjsKICAgdXNlczo9Im9yZy5lY2xpcHNlLmpnaXQubGliLAogICAgb3JnLmVjbGlwc2UuamdpdC50cmVld2FsaywKICAgIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyLAogICAgb3JnLmVjbGlwc2UuamdpdC5kaWZmLAogICAgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLmZpbHRlciIsCi0gb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLmZpbHRlcjt2ZXJzaW9uPSI0LjExLjgiO3VzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGssb3JnLmVjbGlwc2UuamdpdC5saWIsb3JnLmVjbGlwc2UuamdpdC51dGlsIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSI0LjExLjgiO3VzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LmxpYixvcmcuZWNsaXBzZS5qZ2l0LnV0aWwiLAotIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5wYWNrO3ZlcnNpb249IjQuMTEuOCI7dXNlczo9Im9yZy5lY2xpcHNlLmpnaXQubGliIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnN1Ym1vZHVsZTt2ZXJzaW9uPSI0LjExLjgiO3VzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LmxpYixvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLmZpbHRlcixvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDt2ZXJzaW9uPSI0LjExLjgiOworIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5maWx0ZXI7dmVyc2lvbj0iNS4wLjQiO3VzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGssb3JnLmVjbGlwc2UuamdpdC5saWIsb3JnLmVjbGlwc2UuamdpdC51dGlsIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSI1LjAuNCI7dXNlczo9Im9yZy5lY2xpcHNlLmpnaXQubGliLG9yZy5lY2xpcHNlLmpnaXQudXRpbCIsCisgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLnBhY2s7dmVyc2lvbj0iNS4wLjQiO3VzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LmxpYiIsCisgb3JnLmVjbGlwc2UuamdpdC5zdWJtb2R1bGU7dmVyc2lvbj0iNS4wLjQiO3VzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LmxpYixvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLmZpbHRlcixvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDt2ZXJzaW9uPSI1LjAuNCI7CiAgIHVzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5yZXNvbHZlciwKICAgIG9yZy5lY2xpcHNlLmpnaXQucmV2d2FsaywKICAgIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5wYWNrLApAQCAtMTI4LDI0ICsxMjgsMjQgQEAKICAgIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHAsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycywKICAgIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5wYWNrIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5odHRwO3ZlcnNpb249IjQuMTEuOCI7dXNlczo9ImphdmF4Lm5ldC5zc2wiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnJlc29sdmVyO3ZlcnNpb249IjQuMTEuOCI7dXNlczo9Im9yZy5lY2xpcHNlLmpnaXQubGliLG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0IiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrO3ZlcnNpb249IjQuMTEuOCI7Cisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cDt2ZXJzaW9uPSI1LjAuNCI7dXNlczo9ImphdmF4Lm5ldC5zc2wiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnJlc29sdmVyO3ZlcnNpb249IjUuMC40Ijt1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5saWIsb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGs7dmVyc2lvbj0iNS4wLjQiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5saWIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGssCiAgICBvcmcuZWNsaXBzZS5qZ2l0LmF0dHJpYnV0ZXMsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLmZpbHRlciwKICAgIG9yZy5lY2xpcHNlLmpnaXQudXRpbCwKICAgIG9yZy5lY2xpcHNlLmpnaXQuZGlyY2FjaGUiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyO3ZlcnNpb249IjQuMTEuOCI7dXNlczo9Im9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsiLAotIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSI0LjExLjgiOworIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyO3ZlcnNpb249IjUuMC40Ijt1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC50cmVld2FsayIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249IjUuMC40IjsKICAgdXNlczo9Im9yZy5lY2xpcHNlLmpnaXQubGliLAogICAgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cCwKICAgIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlLAogICAgb3JnLmlldGYuamdzcyIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvO3ZlcnNpb249IjQuMTEuOCIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsLnNoYTE7dmVyc2lvbj0iNC4xMS44IiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwudGltZTt2ZXJzaW9uPSI0LjExLjgiCisgb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvO3ZlcnNpb249IjUuMC40IiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuc2hhMTt2ZXJzaW9uPSI1LjAuNCIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsLnRpbWU7dmVyc2lvbj0iNS4wLjQiCiBCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSmF2YVNFLTEuOAogSW1wb3J0LVBhY2thZ2U6IGNvbS5nb29nbGVjb2RlLmphdmFld2FoO3ZlcnNpb249IlsxLjEuNiwyLjAuMCkiLAogIGNvbS5qY3JhZnQuanNjaDt2ZXJzaW9uPSJbMC4xLjM3LDAuMi4wKSIsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmpnaXQvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GCmluZGV4IDQ2YTczZjguLmIyZDY5NGEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GCkBAIC0zLDUgKzMsNSBAQAogQnVuZGxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQgLSBTb3VyY2VzCiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LnNvdXJjZQogQnVuZGxlLVZlbmRvcjogRWNsaXBzZS5vcmcgLSBKR2l0Ci1CdW5kbGUtVmVyc2lvbjogNC4xMS44LnF1YWxpZmllcgotRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IG9yZy5lY2xpcHNlLmpnaXQ7dmVyc2lvbj0iNC4xMS44LnF1YWxpZmllciI7cm9vdHM9Ii4iCitCdW5kbGUtVmVyc2lvbjogNS4wLjQucXVhbGlmaWVyCitFY2xpcHNlLVNvdXJjZUJ1bmRsZTogb3JnLmVjbGlwc2UuamdpdDt2ZXJzaW9uPSI1LjAuNC5xdWFsaWZpZXIiO3Jvb3RzPSIuIgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC9wb20ueG1sCmluZGV4IGY0NTdjMzguLjJiNTZkMGEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3BvbS54bWwKQEAgLTUzLDcgKzUzLDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjQuMTEuOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj41LjAuNC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdDwvYXJ0aWZhY3RJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvcmVzb3VyY2VzL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvSkdpdFRleHQucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLmpnaXQvcmVzb3VyY2VzL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvSkdpdFRleHQucHJvcGVydGllcwppbmRleCA4MTVjNjcyLi4wMTc2NjJkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3Jlc291cmNlcy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL0pHaXRUZXh0LnByb3BlcnRpZXMKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9yZXNvdXJjZXMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9KR2l0VGV4dC5wcm9wZXJ0aWVzCkBAIC0yMjYsNiArMjI2LDggQEAKIGNyZWRlbnRpYWxVc2VybmFtZT1Vc2VybmFtZQogZGFlbW9uQWxyZWFkeVJ1bm5pbmc9RGFlbW9uIGFscmVhZHkgcnVubmluZwogZGF5c0Fnbz17MH0gZGF5cyBhZ28KK2RlZXBlbk5vdFdpdGhEZWVwZW49Q2Fubm90IGNvbWJpbmUgZGVlcGVuIHdpdGggZGVlcGVuLW5vdAorZGVlcGVuU2luY2VXaXRoRGVlcGVuPUNhbm5vdCBjb21iaW5lIGRlZXBlbiB3aXRoIGRlZXBlbi1zaW5jZQogZGVsZXRlQnJhbmNoVW5leHBlY3RlZFJlc3VsdD1EZWxldGUgYnJhbmNoIHJldHVybmVkIHVuZXhwZWN0ZWQgcmVzdWx0IHswfQogZGVsZXRlRmlsZUZhaWxlZD1Db3VsZCBub3QgZGVsZXRlIGZpbGUgezB9CiBkZWxldGVSZXF1aXJlc1plcm9OZXdJZD1EZWxldGUgcmVxdWlyZXMgbmV3IElEIHRvIGJlIHplcm8KQEAgLTMxMSw2ICszMTMsNyBAQAogZmlsZU1vZGVOb3RTZXRGb3JQYXRoPUZpbGVNb2RlIG5vdCBzZXQgZm9yIHBhdGggezB9CiBmaWx0ZXJFeGVjdXRpb25GYWlsZWQ9RXhlY3V0aW9uIG9mIGZpbHRlciBjb21tYW5kICcnezB9Jycgb24gZmlsZSAnJ3sxfScnIGZhaWxlZAogZmlsdGVyRXhlY3V0aW9uRmFpbGVkUmM9RXhlY3V0aW9uIG9mIGZpbHRlciBjb21tYW5kICcnezB9Jycgb24gZmlsZSAnJ3sxfScnIGZhaWxlZCB3aXRoIHJldHVybiBjb2RlICcnezJ9JycsIG1lc3NhZ2Ugb24gc3RkZXJyOiAnJ3szfScnCitmaWx0ZXJSZXF1aXJlc0NhcGFiaWxpdHk9ZmlsdGVyIHJlcXVpcmVzIHNlcnZlciB0byBhZHZlcnRpc2UgdGhhdCBjYXBhYmlsaXR5CiBmaW5kaW5nR2FyYmFnZT1GaW5kaW5nIGdhcmJhZ2UKIGZsYWdJc0Rpc3Bvc2VkPXswfSBpcyBkaXNwb3NlZC4KIGZsYWdOb3RGcm9tVGhpcz17MH0gbm90IGZyb20gdGhpcy4KQEAgLTM2Miw2ICszNjUsNyBAQAogaW52YWxpZERlcHRoPUludmFsaWQgZGVwdGg6IHswfQogaW52YWxpZEVuY3J5cHRpb249SW52YWxpZCBlbmNyeXB0aW9uCiBpbnZhbGlkRXhwYW5kV2lsZGNhcmQ9RXhwYW5kRnJvbVNvdXJjZSBvbiBhIHJlZnNwZWMgdGhhdCBjYW4gaGF2ZSBtaXNtYXRjaGVkIHdpbGRjYXJkcyBkb2VzIG5vdCBtYWtlIHNlbnNlLgoraW52YWxpZEZpbHRlcj1JbnZhbGlkIGZpbHRlcjogezB9CiBpbnZhbGlkR2l0ZGlyUmVmID0gSW52YWxpZCAuZ2l0IHJlZmVyZW5jZSBpbiBmaWxlICcnezB9JycKIGludmFsaWRHaXRNb2R1bGVzPUludmFsaWQgLmdpdG1vZHVsZXMgZmlsZQogaW52YWxpZEdpdFR5cGU9aW52YWxpZCBnaXQgdHlwZTogezB9CkBAIC0zOTgsNiArNDAyLDcgQEAKIGludmFsaWRTeXN0ZW1Qcm9wZXJ0eT1JbnZhbGlkIHN5c3RlbSBwcm9wZXJ0eSAnJ3swfScnOiAnJ3sxfScnOyB1c2luZyBkZWZhdWx0IHZhbHVlIHsyfQogaW52YWxpZFRhZ09wdGlvbj1JbnZhbGlkIHRhZyBvcHRpb246IHswfQogaW52YWxpZFRpbWVvdXQ9SW52YWxpZCB0aW1lb3V0OiB7MH0KK2ludmFsaWRUaW1lc3RhbXA9SW52YWxpZCB0aW1lc3RhbXAgaW4gezB9CiBpbnZhbGlkVGltZVVuaXRWYWx1ZTI9SW52YWxpZCB0aW1lIHVuaXQgdmFsdWU6IHswfS57MX09ezJ9CiBpbnZhbGlkVGltZVVuaXRWYWx1ZTM9SW52YWxpZCB0aW1lIHVuaXQgdmFsdWU6IHswfS57MX0uezJ9PXszfQogaW52YWxpZFRyZWVaZXJvTGVuZ3RoTmFtZT1DYW5ub3QgYXBwZW5kIGEgdHJlZSBlbnRyeSB3aXRoIHplcm8tbGVuZ3RoIG5hbWUKQEAgLTYyOSw2ICs2MzQsNyBAQAogc291cmNlUmVmRG9lc250UmVzb2x2ZVRvQW55T2JqZWN0PVNvdXJjZSByZWYgezB9IGRvZXNuJyd0IHJlc29sdmUgdG8gYW55IG9iamVjdC4KIHNvdXJjZVJlZk5vdFNwZWNpZmllZEZvclJlZnNwZWM9U291cmNlIHJlZiBub3Qgc3BlY2lmaWVkIGZvciByZWZzcGVjOiB7MH0KIHNxdWFzaENvbW1pdE5vdFVwZGF0aW5nSEVBRD1TcXVhc2ggY29tbWl0IC0tIG5vdCB1cGRhdGluZyBIRUFECitzc2hDb21tYW5kRmFpbGVkPUV4ZWN1dGlvbiBvZiBzc2ggY29tbWFuZCAnJ3swfScnIGZhaWxlZCB3aXRoIGVycm9yICcnezF9JycKIHNzaFVzZXJOYW1lRXJyb3I9SnNjaCBlcnJvcjogZmFpbGVkIHRvIHNldCBTU0ggdXNlciBuYW1lIGNvcnJlY3RseSB0byAnJ3swfScnOyB1c2luZyAnJ3sxfScnIHBpY2tlZCB1cCBmcm9tIFNTSCBjb25maWcgZmlsZS4KIHNzbEZhaWx1cmVFeGNlcHRpb25NZXNzYWdlPVNlY3VyZSBjb25uZWN0aW9uIHRvIHswfSBjb3VsZCBub3QgYmUgc3RhYmxpc2hlZCBiZWNhdXNlIG9mIFNTTCBwcm9ibGVtcwogc3NsRmFpbHVyZUluZm89QSBzZWN1cmUgY29ubmVjdGlvbiB0byB7MH1cbmNvdWxkIG5vdCBiZSBlc3RhYmxpc2hlZCBiZWNhdXNlIHRoZSBzZXJ2ZXInJ3MgY2VydGlmaWNhdGUgY291bGQgbm90IGJlIHZhbGlkYXRlZC4KQEAgLTY3Myw2ICs2NzksNyBAQAogdGltZUlzVW5jZXJ0YWluPVRpbWUgaXMgdW5jZXJ0YWluCiB0aW1lckFscmVhZHlUZXJtaW5hdGVkPVRpbWVyIGFscmVhZHkgdGVybWluYXRlZAogdG9vTWFueUNvbW1hbmRzPVRvbyBtYW55IGNvbW1hbmRzCit0b29NYW55RmlsdGVycz1Ub28gbWFueSAiZmlsdGVyIiBsaW5lcyBpbiByZXF1ZXN0CiB0b29NYW55SW5jbHVkZVJlY3Vyc2lvbnM9VG9vIG1hbnkgcmVjdXJzaW9uczsgY2lyY3VsYXIgaW5jbHVkZXMgaW4gY29uZmlnIGZpbGUocyk/CiB0b3BvbG9naWNhbFNvcnRSZXF1aXJlZD1Ub3BvbG9naWNhbCBzb3J0IHJlcXVpcmVkLgogdHJhbnNhY3Rpb25BYm9ydGVkPXRyYW5zYWN0aW9uIGFib3J0ZWQKQEAgLTcxNiw2ICs3MjMsNyBAQAogdW5leHBlY3RlZEVvZkluUGFjaz1VbmV4cGVjdGVkIEVPRiBpbiBwYXJ0aWFsbHkgY3JlYXRlZCBwYWNrCiB1bmV4cGVjdGVkSHVua1RyYWlsZXI9VW5leHBlY3RlZCBodW5rIHRyYWlsZXIKIHVuZXhwZWN0ZWRPZGRSZXN1bHQ9b2RkOiB7MH0gKyB7MX0gLSB7Mn0KK3VuZXhwZWN0ZWRQYWNrZXRMaW5lPXVuZXhwZWN0ZWQgezB9CiB1bmV4cGVjdGVkUmVmUmVwb3J0PXswfTogdW5leHBlY3RlZCByZWYgcmVwb3J0OiB7MX0KIHVuZXhwZWN0ZWRSZXBvcnRMaW5lPXVuZXhwZWN0ZWQgcmVwb3J0IGxpbmU6IHswfQogdW5leHBlY3RlZFJlcG9ydExpbmUyPXswfSB1bmV4cGVjdGVkIHJlcG9ydCBsaW5lOiB7MX0KQEAgLTczMCw2ICs3MzgsNyBAQAogdW5rbm93bk9iamVjdFR5cGUyPXVua25vd24KIHVua25vd25SZXBvc2l0b3J5Rm9ybWF0PVVua25vd24gcmVwb3NpdG9yeSBmb3JtYXQKIHVua25vd25SZXBvc2l0b3J5Rm9ybWF0Mj1Vbmtub3duIHJlcG9zaXRvcnkgZm9ybWF0ICJ7MH0iOyBleHBlY3RlZCAiMCIuCit1bmtub3duVHJhbnNwb3J0Q29tbWFuZD11bmtub3duIGNvbW1hbmQgezB9CiB1bmtub3duWmxpYkVycm9yPVVua25vd24gemxpYiBlcnJvci4KIHVubG9ja0xvY2tGaWxlRmFpbGVkPVVubG9ja2luZyBMb2NrRmlsZSAnJ3swfScnIGZhaWxlZAogdW5tZXJnZWRQYXRoPVVubWVyZ2VkIHBhdGg6IHswfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvQXJjaGl2ZUNvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0FyY2hpdmVDb21tYW5kLmphdmEKaW5kZXggMTAzOTdmOC4uMjdiYjVhOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvQXJjaGl2ZUNvbW1hbmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9BcmNoaXZlQ29tbWFuZC5qYXZhCkBAIC0xNTcsMzAgKzE1Nyw2IEBAIFQgY3JlYXRlQXJjaGl2ZU91dHB1dFN0cmVhbShPdXRwdXRTdHJlYW0gcywgTWFwPFN0cmluZywgT2JqZWN0PiBvKQogCQkgKgogCQkgKiBAcGFyYW0gb3V0CiAJCSAqICAgICAgICAgICAgYXJjaGl2ZSBvYmplY3QgZnJvbSBjcmVhdGVBcmNoaXZlT3V0cHV0U3RyZWFtCi0JCSAqIEBwYXJhbSBwYXRoCi0JCSAqICAgICAgICAgICAgZnVsbCBmaWxlbmFtZSByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgYXJjaGl2ZSAod2l0aAotCQkgKiAgICAgICAgICAgIHRyYWlsaW5nICcvJyBmb3IgZGlyZWN0b3JpZXMpCi0JCSAqIEBwYXJhbSBtb2RlCi0JCSAqICAgICAgICAgICAgbW9kZSAoZm9yIGV4YW1wbGUgRmlsZU1vZGUuUkVHVUxBUl9GSUxFIG9yCi0JCSAqICAgICAgICAgICAgRmlsZU1vZGUuU1lNTElOSykKLQkJICogQHBhcmFtIGxvYWRlcgotCQkgKiAgICAgICAgICAgIGJsb2Igb2JqZWN0IHdpdGggZGF0YSBmb3IgdGhpcyBlbnRyeSAobnVsbCBmb3IKLQkJICogICAgICAgICAgICBkaXJlY3RvcmllcykKLQkJICogQHRocm93cyBJT0V4Y2VwdGlvbgotCQkgKiAgICAgICAgICAgICB0aHJvd24gYnkgdGhlIHVuZGVybHlpbmcgb3V0cHV0IHN0cmVhbSBmb3IgSS9PIGVycm9ycwotCQkgKiBAZGVwcmVjYXRlZCB1c2UKLQkJICogICAgICAgICAgICAge0BsaW5rICNwdXRFbnRyeShDbG9zZWFibGUsIE9iamVjdElkLCBTdHJpbmcsIEZpbGVNb2RlLCBPYmplY3RMb2FkZXIpfQotCQkgKiAgICAgICAgICAgICBpbnN0ZWFkCi0JCSAqLwotCQlARGVwcmVjYXRlZAotCQl2b2lkIHB1dEVudHJ5KFQgb3V0LCBTdHJpbmcgcGF0aCwgRmlsZU1vZGUgbW9kZSwKLQkJCQkJICBPYmplY3RMb2FkZXIgbG9hZGVyKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQkJLyoqCi0JCSAqIFdyaXRlIGFuIGVudHJ5IHRvIGFuIGFyY2hpdmUuCi0JCSAqCi0JCSAqIEBwYXJhbSBvdXQKLQkJICogICAgICAgICAgICBhcmNoaXZlIG9iamVjdCBmcm9tIGNyZWF0ZUFyY2hpdmVPdXRwdXRTdHJlYW0KIAkJICogQHBhcmFtIHRyZWUKIAkJICogICAgICAgICAgICB0aGUgdGFnLCBjb21taXQsIG9yIHRyZWUgb2JqZWN0IHRvIHByb2R1Y2UgYW4gYXJjaGl2ZSBmb3IKIAkJICogQHBhcmFtIHBhdGgKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0NoZXJyeVBpY2tDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9DaGVycnlQaWNrQ29tbWFuZC5qYXZhCmluZGV4IGY0NWUzOWUuLjY1YjcyZjcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0NoZXJyeVBpY2tDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvQ2hlcnJ5UGlja0NvbW1hbmQuamF2YQpAQCAtMjg4LDcgKzI4OCw3IEBAIHB1YmxpYyBDaGVycnlQaWNrQ29tbWFuZCBzZXRPdXJDb21taXROYW1lKFN0cmluZyBvdXJDb21taXROYW1lKSB7CiAJICogQHJldHVybiB7QGNvZGUgdGhpc30KIAkgKiBAc2luY2UgMy4xCiAJICovCi0JcHVibGljIENoZXJyeVBpY2tDb21tYW5kIHNldFJlZmxvZ1ByZWZpeChmaW5hbCBTdHJpbmcgcHJlZml4KSB7CisJcHVibGljIENoZXJyeVBpY2tDb21tYW5kIHNldFJlZmxvZ1ByZWZpeChTdHJpbmcgcHJlZml4KSB7CiAJCXRoaXMucmVmbG9nUHJlZml4ID0gcHJlZml4OwogCQlyZXR1cm4gdGhpczsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9DbG9uZUNvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0Nsb25lQ29tbWFuZC5qYXZhCmluZGV4IDc5YjBlZmIuLjVjMDZiYWMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0Nsb25lQ29tbWFuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0Nsb25lQ29tbWFuZC5qYXZhCkBAIC0xOTEsMTIgKzE5MSwxMiBAQCBwdWJsaWMgR2l0IGNhbGwoKSB0aHJvd3MgR2l0QVBJRXhjZXB0aW9uLCBJbnZhbGlkUmVtb3RlRXhjZXB0aW9uLAogCQkJdGhyb3cgbmV3IEludmFsaWRSZW1vdGVFeGNlcHRpb24oCiAJCQkJCU1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpHaXRUZXh0LmdldCgpLmludmFsaWRVUkwsIHVyaSkpOwogCQl9Ci0JCVJlcG9zaXRvcnkgcmVwb3NpdG9yeSA9IG51bGw7CisJCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpIC8vIENsb3NlZCBieSBjYWxsZXIKKwkJUmVwb3NpdG9yeSByZXBvc2l0b3J5ID0gaW5pdCgpOwogCQlGZXRjaFJlc3VsdCBmZXRjaFJlc3VsdCA9IG51bGw7CiAJCVRocmVhZCBjbGVhbnVwSG9vayA9IG5ldyBUaHJlYWQoKCkgLT4gY2xlYW51cCgpKTsKIAkJUnVudGltZS5nZXRSdW50aW1lKCkuYWRkU2h1dGRvd25Ib29rKGNsZWFudXBIb29rKTsKIAkJdHJ5IHsKLQkJCXJlcG9zaXRvcnkgPSBpbml0KCk7CiAJCQlmZXRjaFJlc3VsdCA9IGZldGNoKHJlcG9zaXRvcnksIHUpOwogCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKIAkJCWlmIChyZXBvc2l0b3J5ICE9IG51bGwpIHsKQEAgLTMwNiw3ICszMDYsNyBAQCBwcml2YXRlIEZldGNoUmVzdWx0IGZldGNoKFJlcG9zaXRvcnkgY2xvbmVkUmVwbywgVVJJaXNoIHUpCiAJCXJldHVybiBjb21tYW5kLmNhbGwoKTsKIAl9CiAKLQlwcml2YXRlIExpc3Q8UmVmU3BlYz4gY2FsY3VsYXRlUmVmU3BlY3MoZmluYWwgU3RyaW5nIGRzdCkgeworCXByaXZhdGUgTGlzdDxSZWZTcGVjPiBjYWxjdWxhdGVSZWZTcGVjcyhTdHJpbmcgZHN0KSB7CiAJCVJlZlNwZWMgd2NycyA9IG5ldyBSZWZTcGVjKCk7CiAJCXdjcnMgPSB3Y3JzLnNldEZvcmNlVXBkYXRlKHRydWUpOwogCQl3Y3JzID0gd2Nycy5zZXRTb3VyY2VEZXN0aW5hdGlvbihDb25zdGFudHMuUl9IRUFEUyArICIqIiwgZHN0KTsgLy8kTk9OLU5MUy0xJApAQCAtMzE1LDcgKzMxNSw3IEBAIHByaXZhdGUgTGlzdDxSZWZTcGVjPiBjYWxjdWxhdGVSZWZTcGVjcyhmaW5hbCBTdHJpbmcgZHN0KSB7CiAJCQlzcGVjcy5hZGQod2Nycyk7CiAJCWVsc2UgaWYgKGJyYW5jaGVzVG9DbG9uZSAhPSBudWxsCiAJCQkJJiYgYnJhbmNoZXNUb0Nsb25lLnNpemUoKSA+IDApIHsKLQkJCWZvciAoZmluYWwgU3RyaW5nIHNlbGVjdGVkUmVmIDogYnJhbmNoZXNUb0Nsb25lKQorCQkJZm9yIChTdHJpbmcgc2VsZWN0ZWRSZWYgOiBicmFuY2hlc1RvQ2xvbmUpCiAJCQkJaWYgKHdjcnMubWF0Y2hTb3VyY2Uoc2VsZWN0ZWRSZWYpKQogCQkJCQlzcGVjcy5hZGQod2Nycy5leHBhbmRGcm9tU291cmNlKHNlbGVjdGVkUmVmKSk7CiAJCX0KQEAgLTM4NiwxMiArMzg2LDkgQEAgcHJpdmF0ZSB2b2lkIGNsb25lU3VibW9kdWxlcyhSZXBvc2l0b3J5IGNsb25lZFJlcG8pIHRocm93cyBJT0V4Y2VwdGlvbiwKIAkJaWYgKCF1cGRhdGUuY2FsbCgpLmlzRW1wdHkoKSkgewogCQkJU3VibW9kdWxlV2FsayB3YWxrID0gU3VibW9kdWxlV2Fsay5mb3JJbmRleChjbG9uZWRSZXBvKTsKIAkJCXdoaWxlICh3YWxrLm5leHQoKSkgewotCQkJCVJlcG9zaXRvcnkgc3ViUmVwbyA9IHdhbGsuZ2V0UmVwb3NpdG9yeSgpOwotCQkJCWlmIChzdWJSZXBvICE9IG51bGwpIHsKLQkJCQkJdHJ5IHsKKwkJCQl0cnkgKFJlcG9zaXRvcnkgc3ViUmVwbyA9IHdhbGsuZ2V0UmVwb3NpdG9yeSgpKSB7CisJCQkJCWlmIChzdWJSZXBvICE9IG51bGwpIHsKIAkJCQkJCWNsb25lU3VibW9kdWxlcyhzdWJSZXBvKTsKLQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCXN1YlJlcG8uY2xvc2UoKTsKIAkJCQkJfQogCQkJCX0KIAkJCX0KQEAgLTQxMyw3ICs0MTAsNyBAQCBwcml2YXRlIFJlZiBmaW5kQnJhbmNoVG9DaGVja291dChGZXRjaFJlc3VsdCByZXN1bHQpIHsKIAkJfQogCiAJCVJlZiBmb3VuZEJyYW5jaCA9IG51bGw7Ci0JCWZvciAoZmluYWwgUmVmIHIgOiByZXN1bHQuZ2V0QWR2ZXJ0aXNlZFJlZnMoKSkgeworCQlmb3IgKFJlZiByIDogcmVzdWx0LmdldEFkdmVydGlzZWRSZWZzKCkpIHsKIAkJCWZpbmFsIFN0cmluZyBuID0gci5nZXROYW1lKCk7CiAJCQlpZiAoIW4uc3RhcnRzV2l0aChDb25zdGFudHMuUl9IRUFEUykpCiAJCQkJY29udGludWU7CkBAIC00NDMsMTEgKzQ0MCwxMSBAQCBwcml2YXRlIHZvaWQgYWRkTWVyZ2VDb25maWcoUmVwb3NpdG9yeSBjbG9uZWRSZXBvLCBSZWYgaGVhZCkKIAkJY2xvbmVkUmVwby5nZXRDb25maWcoKS5zYXZlKCk7CiAJfQogCi0JcHJpdmF0ZSBSZXZDb21taXQgcGFyc2VDb21taXQoZmluYWwgUmVwb3NpdG9yeSBjbG9uZWRSZXBvLCBmaW5hbCBSZWYgcmVmKQorCXByaXZhdGUgUmV2Q29tbWl0IHBhcnNlQ29tbWl0KFJlcG9zaXRvcnkgY2xvbmVkUmVwbywgUmVmIHJlZikKIAkJCXRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLAogCQkJSU9FeGNlcHRpb24gewogCQlmaW5hbCBSZXZDb21taXQgY29tbWl0OwotCQl0cnkgKGZpbmFsIFJldldhbGsgcncgPSBuZXcgUmV2V2FsayhjbG9uZWRSZXBvKSkgeworCQl0cnkgKFJldldhbGsgcncgPSBuZXcgUmV2V2FsayhjbG9uZWRSZXBvKSkgewogCQkJY29tbWl0ID0gcncucGFyc2VDb21taXQocmVmLmdldE9iamVjdElkKCkpOwogCQl9CiAJCXJldHVybiBjb21taXQ7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9Db21taXRDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9Db21taXRDb21tYW5kLmphdmEKaW5kZXggZjI1NzI4My4uZDA3NTMyYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvQ29tbWl0Q29tbWFuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0NvbW1pdENvbW1hbmQuamF2YQpAQCAtNTQsNyArNTQsNyBAQAogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkFib3J0ZWRCeUhvb2tFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkNvbmN1cnJlbnRSZWZVcGRhdGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkVtdHB5Q29tbWl0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5FbXB0eUNvbW1pdEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnMuR2l0QVBJRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5KR2l0SW50ZXJuYWxFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLk5vRmlsZXBhdHRlcm5FeGNlcHRpb247CkBAIC0yMzgsNyArMjM4LDcgQEAgcHVibGljIFJldkNvbW1pdCBjYWxsKCkgdGhyb3dzIEdpdEFQSUV4Y2VwdGlvbiwgTm9IZWFkRXhjZXB0aW9uLAogCQkJCQlSZXZDb21taXQgaGVhZENvbW1pdCA9IHJ3LnBhcnNlQ29tbWl0KGhlYWRJZCk7CiAJCQkJCWhlYWRDb21taXQuZ2V0VHJlZSgpOwogCQkJCQlpZiAoaW5kZXhUcmVlSWQuZXF1YWxzKGhlYWRDb21taXQuZ2V0VHJlZSgpKSkgewotCQkJCQkJdGhyb3cgbmV3IEVtdHB5Q29tbWl0RXhjZXB0aW9uKAorCQkJCQkJdGhyb3cgbmV3IEVtcHR5Q29tbWl0RXhjZXB0aW9uKAogCQkJCQkJCQlKR2l0VGV4dC5nZXQoKS5lbXB0eUNvbW1pdCk7CiAJCQkJCX0KIAkJCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9DcmVhdGVCcmFuY2hDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9DcmVhdGVCcmFuY2hDb21tYW5kLmphdmEKaW5kZXggMjliYWY0Yy4uYmE2ZjNmMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvQ3JlYXRlQnJhbmNoQ29tbWFuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0NyZWF0ZUJyYW5jaENvbW1hbmQuamF2YQpAQCAtNDMsNiArNDMsOSBAQAogICovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuYXBpOwogCitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5IRUFEOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuUl9IRUFEUzsKKwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CiAKQEAgLTc4LDcgKzgxLDcgQEAgcHVibGljIGNsYXNzIENyZWF0ZUJyYW5jaENvbW1hbmQgZXh0ZW5kcyBHaXRDb21tYW5kPFJlZj4gewogCiAJcHJpdmF0ZSBTZXR1cFVwc3RyZWFtTW9kZSB1cHN0cmVhbU1vZGU7CiAKLQlwcml2YXRlIFN0cmluZyBzdGFydFBvaW50ID0gQ29uc3RhbnRzLkhFQUQ7CisJcHJpdmF0ZSBTdHJpbmcgc3RhcnRQb2ludCA9IEhFQUQ7CiAKIAlwcml2YXRlIFJldkNvbW1pdCBzdGFydENvbW1pdDsKIApAQCAtMTIxLDcgKzEyNCw3IEBAIHB1YmxpYyBSZWYgY2FsbCgpIHRocm93cyBHaXRBUElFeGNlcHRpb24sIFJlZkFscmVhZHlFeGlzdHNFeGNlcHRpb24sCiAJCXRyeSAoUmV2V2FsayByZXZXYWxrID0gbmV3IFJldldhbGsocmVwbykpIHsKIAkJCVJlZiByZWZUb0NoZWNrID0gcmVwby5maW5kUmVmKG5hbWUpOwogCQkJYm9vbGVhbiBleGlzdHMgPSByZWZUb0NoZWNrICE9IG51bGwKLQkJCQkJJiYgcmVmVG9DaGVjay5nZXROYW1lKCkuc3RhcnRzV2l0aChDb25zdGFudHMuUl9IRUFEUyk7CisJCQkJCSYmIHJlZlRvQ2hlY2suZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoUl9IRUFEUyk7CiAJCQlpZiAoIWZvcmNlICYmIGV4aXN0cykKIAkJCQl0aHJvdyBuZXcgUmVmQWxyZWFkeUV4aXN0c0V4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKIAkJCQkJCUpHaXRUZXh0LmdldCgpLnJlZkFscmVhZHlFeGlzdHMxLCBuYW1lKSk7CkBAIC0xNTMsNyArMTU2LDcgQEAgcHVibGljIFJlZiBjYWxsKCkgdGhyb3dzIEdpdEFQSUV4Y2VwdGlvbiwgUmVmQWxyZWFkeUV4aXN0c0V4Y2VwdGlvbiwKIAkJCQllbHNlCiAJCQkJCXJlZkxvZ01lc3NhZ2UgPSAiYnJhbmNoOiBDcmVhdGVkIGZyb20gY29tbWl0ICIgKyBiYXNlQ29tbWl0OyAvLyROT04tTkxTLTEkCiAKLQkJCX0gZWxzZSBpZiAoc3RhcnRQb2ludEZ1bGxOYW1lLnN0YXJ0c1dpdGgoQ29uc3RhbnRzLlJfSEVBRFMpCisJCQl9IGVsc2UgaWYgKHN0YXJ0UG9pbnRGdWxsTmFtZS5zdGFydHNXaXRoKFJfSEVBRFMpCiAJCQkJCXx8IHN0YXJ0UG9pbnRGdWxsTmFtZS5zdGFydHNXaXRoKENvbnN0YW50cy5SX1JFTU9URVMpKSB7CiAJCQkJYmFzZUJyYW5jaCA9IHN0YXJ0UG9pbnRGdWxsTmFtZTsKIAkJCQlpZiAoZXhpc3RzKQpAQCAtMTcxLDcgKzE3NCw3IEBAIHB1YmxpYyBSZWYgY2FsbCgpIHRocm93cyBHaXRBUElFeGNlcHRpb24sIFJlZkFscmVhZHlFeGlzdHNFeGNlcHRpb24sCiAJCQkJCQkJKyBzdGFydFBvaW50RnVsbE5hbWU7CiAJCQl9CiAKLQkJCVJlZlVwZGF0ZSB1cGRhdGVSZWYgPSByZXBvLnVwZGF0ZVJlZihDb25zdGFudHMuUl9IRUFEUyArIG5hbWUpOworCQkJUmVmVXBkYXRlIHVwZGF0ZVJlZiA9IHJlcG8udXBkYXRlUmVmKFJfSEVBRFMgKyBuYW1lKTsKIAkJCXVwZGF0ZVJlZi5zZXROZXdPYmplY3RJZChzdGFydEF0KTsKIAkJCXVwZGF0ZVJlZi5zZXRSZWZMb2dNZXNzYWdlKHJlZkxvZ01lc3NhZ2UsIGZhbHNlKTsKIAkJCVJlc3VsdCB1cGRhdGVSZXN1bHQ7CkBAIC0yNzksMTcgKzI4MiwzNCBAQCBwcml2YXRlIE9iamVjdElkIGdldFN0YXJ0UG9pbnRPYmplY3RJZCgpIHRocm93cyBBbWJpZ3VvdXNPYmplY3RFeGNlcHRpb24sCiAJfQogCiAJcHJpdmF0ZSBTdHJpbmcgZ2V0U3RhcnRQb2ludE9ySGVhZCgpIHsKLQkJcmV0dXJuIHN0YXJ0UG9pbnQgIT0gbnVsbCA/IHN0YXJ0UG9pbnQgOiBDb25zdGFudHMuSEVBRDsKKwkJcmV0dXJuIHN0YXJ0UG9pbnQgIT0gbnVsbCA/IHN0YXJ0UG9pbnQgOiBIRUFEOwogCX0KIAogCXByaXZhdGUgdm9pZCBwcm9jZXNzT3B0aW9ucygpIHRocm93cyBJbnZhbGlkUmVmTmFtZUV4Y2VwdGlvbiB7CiAJCWlmIChuYW1lID09IG51bGwKLQkJCQl8fCAhUmVwb3NpdG9yeS5pc1ZhbGlkUmVmTmFtZShDb25zdGFudHMuUl9IRUFEUyArIG5hbWUpKQorCQkJCXx8ICFSZXBvc2l0b3J5LmlzVmFsaWRSZWZOYW1lKFJfSEVBRFMgKyBuYW1lKQorCQkJCXx8ICFpc1ZhbGlkQnJhbmNoTmFtZShuYW1lKSkKIAkJCXRocm93IG5ldyBJbnZhbGlkUmVmTmFtZUV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdChKR2l0VGV4dAogCQkJCQkuZ2V0KCkuYnJhbmNoTmFtZUludmFsaWQsIG5hbWUgPT0gbnVsbCA/ICI8bnVsbD4iIDogbmFtZSkpOyAvLyROT04tTkxTLTEkCiAJfQogCiAJLyoqCisJICogQ2hlY2sgaWYgdGhlIGdpdmVuIGJyYW5jaCBuYW1lIGlzIHZhbGlkCisJICoKKwkgKiBAcGFyYW0gYnJhbmNoTmFtZQorCSAqICAgICAgICAgICAgYnJhbmNoIG5hbWUgdG8gY2hlY2sKKwkgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgYnJhbmNoIG5hbWUgaXMgdmFsaWQKKwkgKgorCSAqIEBzaW5jZSA1LjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZEJyYW5jaE5hbWUoU3RyaW5nIGJyYW5jaE5hbWUpIHsKKwkJaWYgKEhFQUQuZXF1YWxzKGJyYW5jaE5hbWUpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuICFicmFuY2hOYW1lLnN0YXJ0c1dpdGgoIi0iKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qKgogCSAqIFNldCB0aGUgbmFtZSBvZiB0aGUgbmV3IGJyYW5jaAogCSAqCiAJICogQHBhcmFtIG5hbWUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0Rlc2NyaWJlQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvRGVzY3JpYmVDb21tYW5kLmphdmEKaW5kZXggNWJkOTMyZC4uYTQ4NDc0MiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvRGVzY3JpYmVDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvRGVzY3JpYmVDb21tYW5kLmphdmEKQEAgLTEwNyw2ICsxMDcsMTEgQEAgcHVibGljIGNsYXNzIERlc2NyaWJlQ29tbWFuZCBleHRlbmRzIEdpdENvbW1hbmQ8U3RyaW5nPiB7CiAJcHJpdmF0ZSBMaXN0PElNYXRjaGVyPiBtYXRjaGVycyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCiAJLyoqCisJICogV2hldGhlciB0byB1c2UgYWxsIHRhZ3MgKGluY2wuIGxpZ2h0d2VpZ2h0KSBvciBub3QKKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gdXNlVGFncyA9IGZhbHNlOworCisJLyoqCiAJICogQ29uc3RydWN0b3IgZm9yIERlc2NyaWJlQ29tbWFuZC4KIAkgKgogCSAqIEBwYXJhbSByZXBvCkBAIC0xNzYsNiArMTgxLDIyIEBAIHB1YmxpYyBEZXNjcmliZUNvbW1hbmQgc2V0TG9uZyhib29sZWFuIGxvbmdEZXNjKSB7CiAJCXJldHVybiB0aGlzOwogCX0KIAorCS8qKgorCSAqIEluc3RlYWQgb2YgdXNpbmcgb25seSB0aGUgYW5ub3RhdGVkIHRhZ3MsIHVzZSBhbnkgdGFnIGZvdW5kIGluIHJlZnMvdGFncworCSAqIG5hbWVzcGFjZS4gVGhpcyBvcHRpb24gZW5hYmxlcyBtYXRjaGluZyBsaWdodHdlaWdodCAobm9uLWFubm90YXRlZCkgdGFncworCSAqIG9yIG5vdC4KKwkgKgorCSAqIEBwYXJhbSB0YWdzCisJICogICAgICAgICAgICA8Y29kZT50cnVlPC9jb2RlPiBlbmFibGVzIG1hdGNoaW5nIGxpZ2h0d2VpZ2h0IChub24tYW5ub3RhdGVkKQorCSAqICAgICAgICAgICAgdGFncyBsaWtlIHNldHRpbmcgb3B0aW9uIC0tdGFncyBpbiBjIGdpdAorCSAqIEByZXR1cm4ge0Bjb2RlIHRoaXN9CisJICogQHNpbmNlIDUuMAorCSAqLworCXB1YmxpYyBEZXNjcmliZUNvbW1hbmQgc2V0VGFncyhib29sZWFuIHRhZ3MpIHsKKwkJdGhpcy51c2VUYWdzID0gdGFnczsKKwkJcmV0dXJuIHRoaXM7CisJfQorCiAJcHJpdmF0ZSBTdHJpbmcgbG9uZ0Rlc2NyaXB0aW9uKFJlZiB0YWcsIGludCBkZXB0aCwgT2JqZWN0SWQgdGlwKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJcmV0dXJuIFN0cmluZy5mb3JtYXQoCkBAIC0yNDMsMTIgKzI2NCwxNiBAQCBwcml2YXRlIE9wdGlvbmFsPFJlZj4gZ2V0QmVzdE1hdGNoKExpc3Q8UmVmPiB0YWdzKSB7CiAJCX0KIAl9CiAKLQlwcml2YXRlIE9iamVjdElkIGdldE9iamVjdElkRnJvbVJlZihSZWYgcikgewotCQlPYmplY3RJZCBrZXkgPSByZXBvLnBlZWwocikuZ2V0UGVlbGVkT2JqZWN0SWQoKTsKLQkJaWYgKGtleSA9PSBudWxsKSB7Ci0JCQlrZXkgPSByLmdldE9iamVjdElkKCk7CisJcHJpdmF0ZSBPYmplY3RJZCBnZXRPYmplY3RJZEZyb21SZWYoUmVmIHIpIHRocm93cyBKR2l0SW50ZXJuYWxFeGNlcHRpb24geworCQl0cnkgeworCQkJT2JqZWN0SWQga2V5ID0gcmVwby5nZXRSZWZEYXRhYmFzZSgpLnBlZWwocikuZ2V0UGVlbGVkT2JqZWN0SWQoKTsKKwkJCWlmIChrZXkgPT0gbnVsbCkgeworCQkJCWtleSA9IHIuZ2V0T2JqZWN0SWQoKTsKKwkJCX0KKwkJCXJldHVybiBrZXk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBKR2l0SW50ZXJuYWxFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOwogCQl9Ci0JCXJldHVybiBrZXk7CiAJfQogCiAJLyoqCkBAIC0yNjEsMTIgKzI4NiwxNCBAQCBwcml2YXRlIE9iamVjdElkIGdldE9iamVjdElkRnJvbVJlZihSZWYgcikgewogCXB1YmxpYyBTdHJpbmcgY2FsbCgpIHRocm93cyBHaXRBUElFeGNlcHRpb24gewogCQl0cnkgewogCQkJY2hlY2tDYWxsYWJsZSgpOwotCi0JCQlpZiAodGFyZ2V0ID09IG51bGwpCisJCQlpZiAodGFyZ2V0ID09IG51bGwpIHsKIAkJCQlzZXRUYXJnZXQoQ29uc3RhbnRzLkhFQUQpOworCQkJfQogCi0JCQlDb2xsZWN0aW9uPFJlZj4gdGFnTGlzdCA9IHJlcG8uZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzKFJfVEFHUykudmFsdWVzKCk7CisJCQlDb2xsZWN0aW9uPFJlZj4gdGFnTGlzdCA9IHJlcG8uZ2V0UmVmRGF0YWJhc2UoKQorCQkJCQkuZ2V0UmVmc0J5UHJlZml4KFJfVEFHUyk7CiAJCQlNYXA8T2JqZWN0SWQsIExpc3Q8UmVmPj4gdGFncyA9IHRhZ0xpc3Quc3RyZWFtKCkKKwkJCQkJLmZpbHRlcih0aGlzOjpmaWx0ZXJMaWdodHdlaWdodFRhZ3MpCiAJCQkJCS5jb2xsZWN0KENvbGxlY3RvcnMuZ3JvdXBpbmdCeSh0aGlzOjpnZXRPYmplY3RJZEZyb21SZWYpKTsKIAogCQkJLy8gY29tYmluZWQgZmxhZ3Mgb2YgYWxsIHRoZSBjYW5kaWRhdGUgaW5zdGFuY2VzCkBAIC0zOTAsNCArNDE3LDIyIEBAIHB1YmxpYyBpbnQgY29tcGFyZShDYW5kaWRhdGUgbzEsIENhbmRpZGF0ZSBvMikgewogCQkJdy5jbG9zZSgpOwogCQl9CiAJfQorCisJLyoqCisJICogV2hldGhlciB3ZSB1c2UgbGlnaHR3ZWlnaHQgdGFncyBvciBub3QgZm9yIGRlc2NyaWJlIENhbmRpZGF0ZXMKKwkgKgorCSAqIEBwYXJhbSByZWYKKwkgKiAgICAgICAgICAgIHJlZmVyZW5jZSB1bmRlciBpbnNwZWN0aW9uCisJICogQHJldHVybiB0cnVlIGlmIGl0IHNob3VsZCBiZSB1c2VkIGZvciBkZXNjcmliZSBvciBub3QgcmVnYXJkaW5nCisJICogICAgICAgICB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5hcGkuRGVzY3JpYmVDb21tYW5kI3VzZVRhZ3N9CisJICovCisJQFN1cHByZXNzV2FybmluZ3MoIm51bGwiKQorCXByaXZhdGUgYm9vbGVhbiBmaWx0ZXJMaWdodHdlaWdodFRhZ3MoUmVmIHJlZikgeworCQlPYmplY3RJZCBpZCA9IHJlZi5nZXRPYmplY3RJZCgpOworCQl0cnkgeworCQkJcmV0dXJuIHRoaXMudXNlVGFncyB8fCAoaWQgIT0gbnVsbCAmJiAody5wYXJzZVRhZyhpZCkgIT0gbnVsbCkpOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9GZXRjaENvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0ZldGNoQ29tbWFuZC5qYXZhCmluZGV4IDVkMTc4YmMuLjczZTkzYTEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0ZldGNoQ29tbWFuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0ZldGNoQ29tbWFuZC5qYXZhCkBAIC0xMDUsNiArMTA1LDggQEAgcHVibGljIGNsYXNzIEZldGNoQ29tbWFuZCBleHRlbmRzIFRyYW5zcG9ydENvbW1hbmQ8RmV0Y2hDb21tYW5kLCBGZXRjaFJlc3VsdD4gewogCiAJcHJpdmF0ZSBDYWxsYmFjayBjYWxsYmFjazsKIAorCXByaXZhdGUgYm9vbGVhbiBpc0ZvcmNlVXBkYXRlOworCiAJLyoqCiAJICogQ2FsbGJhY2sgZm9yIHN0YXR1cyBvZiBmZXRjaCBvcGVyYXRpb24uCiAJICoKQEAgLTE5OCw3ICsyMDAsOCBAQCBwcml2YXRlIHZvaWQgZmV0Y2hTdWJtb2R1bGVzKEZldGNoUmVzdWx0IHJlc3VsdHMpCiAJCQkJCQkJCS5zZXRUYWdPcHQodGFnT3B0aW9uKQogCQkJCQkJCQkuc2V0Q2hlY2tGZXRjaGVkT2JqZWN0cyhjaGVja0ZldGNoZWRPYmplY3RzKQogCQkJCQkJCQkuc2V0UmVtb3ZlRGVsZXRlZFJlZnMoaXNSZW1vdmVEZWxldGVkUmVmcygpKQotCQkJCQkJCQkuc2V0VGhpbih0aGluKS5zZXRSZWZTcGVjcyhyZWZTcGVjcykKKwkJCQkJCQkJLnNldFRoaW4odGhpbikKKwkJCQkJCQkJLnNldFJlZlNwZWNzKGFwcGx5T3B0aW9ucyhyZWZTcGVjcykpCiAJCQkJCQkJCS5zZXREcnlSdW4oZHJ5UnVuKQogCQkJCQkJCQkuc2V0UmVjdXJzZVN1Ym1vZHVsZXMocmVjdXJzZU1vZGUpOwogCQkJCQkJY29uZmlndXJlKGYpOwpAQCAtMjM3LDggKzI0MCw4IEBAIHB1YmxpYyBGZXRjaFJlc3VsdCBjYWxsKCkgdGhyb3dzIEdpdEFQSUV4Y2VwdGlvbiwgSW52YWxpZFJlbW90ZUV4Y2VwdGlvbiwKIAkJCQl0cmFuc3BvcnQuc2V0VGFnT3B0KHRhZ09wdGlvbik7CiAJCQl0cmFuc3BvcnQuc2V0RmV0Y2hUaGluKHRoaW4pOwogCQkJY29uZmlndXJlKHRyYW5zcG9ydCk7Ci0KLQkJCUZldGNoUmVzdWx0IHJlc3VsdCA9IHRyYW5zcG9ydC5mZXRjaChtb25pdG9yLCByZWZTcGVjcyk7CisJCQlGZXRjaFJlc3VsdCByZXN1bHQgPSB0cmFuc3BvcnQuZmV0Y2gobW9uaXRvciwKKwkJCQkJYXBwbHlPcHRpb25zKHJlZlNwZWNzKSk7CiAJCQlpZiAoIXJlcG8uaXNCYXJlKCkpIHsKIAkJCQlmZXRjaFN1Ym1vZHVsZXMocmVzdWx0KTsKIAkJCX0KQEAgLTI2MSw2ICsyNjQsMTcgQEAgcHVibGljIEZldGNoUmVzdWx0IGNhbGwoKSB0aHJvd3MgR2l0QVBJRXhjZXB0aW9uLCBJbnZhbGlkUmVtb3RlRXhjZXB0aW9uLAogCiAJfQogCisJcHJpdmF0ZSBMaXN0PFJlZlNwZWM+IGFwcGx5T3B0aW9ucyhMaXN0PFJlZlNwZWM+IHJlZlNwZWNzMikgeworCQlpZiAoIWlzRm9yY2VVcGRhdGUoKSkgeworCQkJcmV0dXJuIHJlZlNwZWNzMjsKKwkJfQorCQlMaXN0PFJlZlNwZWM+IHVwZGF0ZWQgPSBuZXcgQXJyYXlMaXN0PD4oMyk7CisJCWZvciAoUmVmU3BlYyByZWZTcGVjIDogcmVmU3BlY3MyKSB7CisJCQl1cGRhdGVkLmFkZChyZWZTcGVjLnNldEZvcmNlVXBkYXRlKHRydWUpKTsKKwkJfQorCQlyZXR1cm4gdXBkYXRlZDsKKwl9CisKIAkvKioKIAkgKiBTZXQgdGhlIG1vZGUgdG8gYmUgdXNlZCBmb3IgcmVjdXJzaW5nIGludG8gc3VibW9kdWxlcy4KIAkgKgpAQCAtNTE3LDQgKzUzMSwyNyBAQCBwdWJsaWMgRmV0Y2hDb21tYW5kIHNldENhbGxiYWNrKENhbGxiYWNrIGNhbGxiYWNrKSB7CiAJCXRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjazsKIAkJcmV0dXJuIHRoaXM7CiAJfQorCisJLyoqCisJICogV2hldGhlciBmZXRjaCAtLWZvcmNlIG9wdGlvbiBpcyBlbmFibGVkCisJICoKKwkgKiBAcmV0dXJuIHdoZXRoZXIgcmVmcyBhZmZlY3RlZCBieSB0aGUgZmV0Y2ggYXJlIHVwZGF0ZWQgZm9yY2VmdWxseQorCSAqIEBzaW5jZSA1LjAKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0ZvcmNlVXBkYXRlKCkgeworCQlyZXR1cm4gdGhpcy5pc0ZvcmNlVXBkYXRlOworCX0KKworCS8qKgorCSAqIFNldCBmZXRjaCAtLWZvcmNlIG9wdGlvbgorCSAqCisJICogQHBhcmFtIGZvcmNlCisJICogICAgICAgICAgICB3aGV0aGVyIHRvIHVwZGF0ZSByZWZzIGFmZmVjdGVkIGJ5IHRoZSBmZXRjaCBmb3JjZWZ1bGx5CisJICogQHJldHVybiB0aGlzIGNvbW1hbmQKKwkgKiBAc2luY2UgNS4wCisJICovCisJcHVibGljIEZldGNoQ29tbWFuZCBzZXRGb3JjZVVwZGF0ZShib29sZWFuIGZvcmNlKSB7CisJCXRoaXMuaXNGb3JjZVVwZGF0ZSA9IGZvcmNlOworCQlyZXR1cm4gdGhpczsKKwl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9MaXN0QnJhbmNoQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvTGlzdEJyYW5jaENvbW1hbmQuamF2YQppbmRleCBjZGFlNzgyLi4yOGEyN2E5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9MaXN0QnJhbmNoQ29tbWFuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0xpc3RCcmFuY2hDb21tYW5kLmphdmEKQEAgLTE4Nyw2ICsxODcsNiBAQCBwdWJsaWMgTGlzdEJyYW5jaENvbW1hbmQgc2V0Q29udGFpbnMoU3RyaW5nIGNvbnRhaW5zQ29tbWl0aXNoKSB7CiAJfQogCiAJcHJpdmF0ZSBDb2xsZWN0aW9uPFJlZj4gZ2V0UmVmcyhTdHJpbmcgcHJlZml4KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gcmVwby5nZXRSZWZEYXRhYmFzZSgpLmdldFJlZnMocHJlZml4KS52YWx1ZXMoKTsKKwkJcmV0dXJuIHJlcG8uZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzQnlQcmVmaXgocHJlZml4KTsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9MaXN0VGFnQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvTGlzdFRhZ0NvbW1hbmQuamF2YQppbmRleCA5MTYxMjExLi4wMWMxOTkxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9MaXN0VGFnQ29tbWFuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0xpc3RUYWdDb21tYW5kLmphdmEKQEAgLTQ3LDcgKzQ3LDYgQEAKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5HaXRBUElFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkpHaXRJbnRlcm5hbEV4Y2VwdGlvbjsKQEAgLTc4LDExICs3NywxMSBAQCBwcm90ZWN0ZWQgTGlzdFRhZ0NvbW1hbmQoUmVwb3NpdG9yeSByZXBvKSB7CiAJQE92ZXJyaWRlCiAJcHVibGljIExpc3Q8UmVmPiBjYWxsKCkgdGhyb3dzIEdpdEFQSUV4Y2VwdGlvbiB7CiAJCWNoZWNrQ2FsbGFibGUoKTsKLQkJTWFwPFN0cmluZywgUmVmPiByZWZMaXN0OwogCQlMaXN0PFJlZj4gdGFncyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCQl0cnkgKFJldldhbGsgcmV2V2FsayA9IG5ldyBSZXZXYWxrKHJlcG8pKSB7Ci0JCQlyZWZMaXN0ID0gcmVwby5nZXRSZWZEYXRhYmFzZSgpLmdldFJlZnMoQ29uc3RhbnRzLlJfVEFHUyk7Ci0JCQlmb3IgKFJlZiByZWYgOiByZWZMaXN0LnZhbHVlcygpKSB7CisJCQlMaXN0PFJlZj4gcmVmTGlzdCA9IHJlcG8uZ2V0UmVmRGF0YWJhc2UoKQorCQkJCQkuZ2V0UmVmc0J5UHJlZml4KENvbnN0YW50cy5SX1RBR1MpOworCQkJZm9yIChSZWYgcmVmIDogcmVmTGlzdCkgewogCQkJCXRhZ3MuYWRkKHJlZik7CiAJCQl9CiAJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0xvZ0NvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0xvZ0NvbW1hbmQuamF2YQppbmRleCBmZDZjMWZhLi5jZjNkMzVmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9Mb2dDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvTG9nQ29tbWFuZC5qYXZhCkBAIC00MiwxMyArNDIsMTAgQEAKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmFwaTsKIAotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWZEYXRhYmFzZS5BTEw7Ci0KIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5HaXRBUElFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkpHaXRJbnRlcm5hbEV4Y2VwdGlvbjsKQEAgLTI3NSwxMCArMjcyLDkgQEAgcHVibGljIExvZ0NvbW1hbmQgYWRkUmFuZ2UoQW55T2JqZWN0SWQgc2luY2UsIEFueU9iamVjdElkIHVudGlsKQogCSAqICAgICAgICAgICAgIHRoZSByZWZlcmVuY2VzIGNvdWxkIG5vdCBiZSBhY2Nlc3NlZAogCSAqLwogCXB1YmxpYyBMb2dDb21tYW5kIGFsbCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCU1hcDxTdHJpbmcsIFJlZj4gcmVmcyA9IGdldFJlcG9zaXRvcnkoKS5nZXRSZWZEYXRhYmFzZSgpLmdldFJlZnMoQUxMKTsKLQkJZm9yIChSZWYgcmVmIDogcmVmcy52YWx1ZXMoKSkgeworCQlmb3IgKFJlZiByZWYgOiBnZXRSZXBvc2l0b3J5KCkuZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzKCkpIHsKIAkJCWlmKCFyZWYuaXNQZWVsZWQoKSkKLQkJCQlyZWYgPSBnZXRSZXBvc2l0b3J5KCkucGVlbChyZWYpOworCQkJCXJlZiA9IGdldFJlcG9zaXRvcnkoKS5nZXRSZWZEYXRhYmFzZSgpLnBlZWwocmVmKTsKIAogCQkJT2JqZWN0SWQgb2JqZWN0SWQgPSByZWYuZ2V0UGVlbGVkT2JqZWN0SWQoKTsKIAkJCWlmIChvYmplY3RJZCA9PSBudWxsKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvTWVyZ2VDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9NZXJnZUNvbW1hbmQuamF2YQppbmRleCBjZDUwY2FlLi5iOGZhNzRkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9NZXJnZUNvbW1hbmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9NZXJnZUNvbW1hbmQuamF2YQpAQCAtMTEyLDYgKzExMiw4IEBAIHB1YmxpYyBjbGFzcyBNZXJnZUNvbW1hbmQgZXh0ZW5kcyBHaXRDb21tYW5kPE1lcmdlUmVzdWx0PiB7CiAKIAlwcml2YXRlIFN0cmluZyBtZXNzYWdlOwogCisJcHJpdmF0ZSBib29sZWFuIGluc2VydENoYW5nZUlkOworCiAJcHJpdmF0ZSBQcm9ncmVzc01vbml0b3IgbW9uaXRvciA9IE51bGxQcm9ncmVzc01vbml0b3IuSU5TVEFOQ0U7CiAKIAkvKioKQEAgLTI1Myw3ICsyNTUsNyBAQCBwdWJsaWMgTWVyZ2VSZXN1bHQgY2FsbCgpIHRocm93cyBHaXRBUElFeGNlcHRpb24sIE5vSGVhZEV4Y2VwdGlvbiwKIAkJCXJlZkxvZ01lc3NhZ2UuYXBwZW5kKHJlZi5nZXROYW1lKCkpOwogCiAJCQkvLyBoYW5kbGUgYW5ub3RhdGVkIHRhZ3MKLQkJCXJlZiA9IHJlcG8ucGVlbChyZWYpOworCQkJcmVmID0gcmVwby5nZXRSZWZEYXRhYmFzZSgpLnBlZWwocmVmKTsKIAkJCU9iamVjdElkIG9iamVjdElkID0gcmVmLmdldFBlZWxlZE9iamVjdElkKCk7CiAJCQlpZiAob2JqZWN0SWQgPT0gbnVsbCkKIAkJCQlvYmplY3RJZCA9IHJlZi5nZXRPYmplY3RJZCgpOwpAQCAtMzkyLDYgKzM5NCw3IEBAIHB1YmxpYyBNZXJnZVJlc3VsdCBjYWxsKCkgdGhyb3dzIEdpdEFQSUV4Y2VwdGlvbiwgTm9IZWFkRXhjZXB0aW9uLAogCQkJCQkJdHJ5IChHaXQgZ2l0ID0gbmV3IEdpdChnZXRSZXBvc2l0b3J5KCkpKSB7CiAJCQkJCQkJbmV3SGVhZElkID0gZ2l0LmNvbW1pdCgpCiAJCQkJCQkJCQkuc2V0UmVmbG9nQ29tbWVudChyZWZMb2dNZXNzYWdlLnRvU3RyaW5nKCkpCisJCQkJCQkJCQkuc2V0SW5zZXJ0Q2hhbmdlSWQoaW5zZXJ0Q2hhbmdlSWQpCiAJCQkJCQkJCQkuY2FsbCgpLmdldElkKCk7CiAJCQkJCQl9CiAJCQkJCQltZXJnZVN0YXR1cyA9IE1lcmdlU3RhdHVzLk1FUkdFRDsKQEAgLTYxOSw2ICs2MjIsMjMgQEAgcHVibGljIE1lcmdlQ29tbWFuZCBzZXRNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7CiAJfQogCiAJLyoqCisJICogSWYgc2V0IHRvIHRydWUgYSBjaGFuZ2UgaWQgd2lsbCBiZSBpbnNlcnRlZCBpbnRvIHRoZSBjb21taXQgbWVzc2FnZQorCSAqCisJICogQW4gZXhpc3RpbmcgY2hhbmdlIGlkIGlzIG5vdCByZXBsYWNlZC4gQW4gaW5pdGlhbCBjaGFuZ2UgaWQgKEkwMDAuLi4pCisJICogd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgY2hhbmdlIGlkLgorCSAqCisJICogQHBhcmFtIGluc2VydENoYW5nZUlkCisJICogICAgICAgICAgICB3aGV0aGVyIHRvIGluc2VydCBhIGNoYW5nZSBpZAorCSAqIEByZXR1cm4ge0Bjb2RlIHRoaXN9CisJICogQHNpbmNlIDUuMAorCSAqLworCXB1YmxpYyBNZXJnZUNvbW1hbmQgc2V0SW5zZXJ0Q2hhbmdlSWQoYm9vbGVhbiBpbnNlcnRDaGFuZ2VJZCkgeworCQljaGVja0NhbGxhYmxlKCk7CisJCXRoaXMuaW5zZXJ0Q2hhbmdlSWQgPSBpbnNlcnRDaGFuZ2VJZDsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJLyoqCiAJICogVGhlIHByb2dyZXNzIG1vbml0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBkaWZmIG9wZXJhdGlvbi4gQnkgZGVmYXVsdCwgdGhpcwogCSAqIGlzIHNldCB0byA8Y29kZT5OdWxsUHJvZ3Jlc3NNb25pdG9yPC9jb2RlPgogCSAqCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9OYW1lUmV2Q29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvTmFtZVJldkNvbW1hbmQuamF2YQppbmRleCBhOWQ5NzU5Li5hMmIyMDA3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9OYW1lUmV2Q29tbWFuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL05hbWVSZXZDb21tYW5kLmphdmEKQEAgLTI1MSw4ICsyNTEsNyBAQCBwdWJsaWMgTmFtZVJldkNvbW1hbmQgYWRkKEl0ZXJhYmxlPE9iamVjdElkPiBpZHMpCiAJICogcHJlZml4IGFkZGVkIGJ5IHtAbGluayAjYWRkUHJlZml4KFN0cmluZyl9LgogCSAqCiAJICogQHBhcmFtIHByZWZpeAotCSAqICAgICAgICAgICAgcHJlZml4IHRvIGFkZDsgc2VlCi0JICogICAgICAgICAgICB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmRGF0YWJhc2UjZ2V0UmVmcyhTdHJpbmcpfQorCSAqICAgICAgICAgICAgcHJlZml4IHRvIGFkZDsgdGhlIHByZWZpeCBtdXN0IGVuZCB3aXRoIGEgc2xhc2gKIAkgKiBAcmV0dXJuIHtAY29kZSB0aGlzfQogCSAqLwogCXB1YmxpYyBOYW1lUmV2Q29tbWFuZCBhZGRQcmVmaXgoU3RyaW5nIHByZWZpeCkgewpAQCAtMjc5LDcgKzI3OCw4IEBAIHB1YmxpYyBOYW1lUmV2Q29tbWFuZCBhZGRBbm5vdGF0ZWRUYWdzKCkgewogCQlpZiAocmVmcyA9PSBudWxsKQogCQkJcmVmcyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCQl0cnkgewotCQkJZm9yIChSZWYgcmVmIDogcmVwby5nZXRSZWZEYXRhYmFzZSgpLmdldFJlZnMoQ29uc3RhbnRzLlJfVEFHUykudmFsdWVzKCkpIHsKKwkJCWZvciAoUmVmIHJlZiA6IHJlcG8uZ2V0UmVmRGF0YWJhc2UoKQorCQkJCQkuZ2V0UmVmc0J5UHJlZml4KENvbnN0YW50cy5SX1RBR1MpKSB7CiAJCQkJT2JqZWN0SWQgaWQgPSByZWYuZ2V0T2JqZWN0SWQoKTsKIAkJCQlpZiAoaWQgIT0gbnVsbCAmJiAod2Fsay5wYXJzZUFueShpZCkgaW5zdGFuY2VvZiBSZXZUYWcpKQogCQkJCQlhZGRSZWYocmVmKTsKQEAgLTMyNSw3ICszMjUsNyBAQCBwcml2YXRlIHZvaWQgYWRkUHJlZml4ZXMoTWFwPE9iamVjdElkLCBTdHJpbmc+IG5vbkNvbW1pdHMsCiAKIAlwcml2YXRlIHZvaWQgYWRkUHJlZml4KFN0cmluZyBwcmVmaXgsIE1hcDxPYmplY3RJZCwgU3RyaW5nPiBub25Db21taXRzLAogCQkJRklGT1JldlF1ZXVlIHBlbmRpbmcpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZvciAoUmVmIHJlZiA6IHJlcG8uZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzKHByZWZpeCkudmFsdWVzKCkpCisJCWZvciAoUmVmIHJlZiA6IHJlcG8uZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzQnlQcmVmaXgocHJlZml4KSkKIAkJCWFkZFJlZihyZWYsIG5vbkNvbW1pdHMsIHBlbmRpbmcpOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvUHVzaENvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1B1c2hDb21tYW5kLmphdmEKaW5kZXggMTliZGQzNS4uNDU5NDUxZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvUHVzaENvbW1hbmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9QdXNoQ29tbWFuZC5qYXZhCkBAIC0xNTMsNyArMTUzLDggQEAgcHVibGljIEl0ZXJhYmxlPFB1c2hSZXN1bHQ+IGNhbGwoKSB0aHJvd3MgR2l0QVBJRXhjZXB0aW9uLAogCiAJCQlmaW5hbCBMaXN0PFRyYW5zcG9ydD4gdHJhbnNwb3J0czsKIAkJCXRyYW5zcG9ydHMgPSBUcmFuc3BvcnQub3BlbkFsbChyZXBvLCByZW1vdGUsIFRyYW5zcG9ydC5PcGVyYXRpb24uUFVTSCk7Ci0JCQlmb3IgKGZpbmFsIFRyYW5zcG9ydCB0cmFuc3BvcnQgOiB0cmFuc3BvcnRzKSB7CisJCQlmb3IgKEBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpIC8vIEV4cGxpY2l0bHkgY2xvc2VkIGluIGZpbmFsbHkKKwkJCQkJZmluYWwgVHJhbnNwb3J0IHRyYW5zcG9ydCA6IHRyYW5zcG9ydHMpIHsKIAkJCQl0cmFuc3BvcnQuc2V0UHVzaFRoaW4odGhpbik7CiAJCQkJdHJhbnNwb3J0LnNldFB1c2hBdG9taWMoYXRvbWljKTsKIAkJCQlpZiAocmVjZWl2ZVBhY2sgIT0gbnVsbCkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1JlYmFzZUNvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1JlYmFzZUNvbW1hbmQuamF2YQppbmRleCBkYTFmZjA2Li45OGMxNmI4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9SZWJhc2VDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvUmViYXNlQ29tbWFuZC5qYXZhCkBAIC0xNzM0LDIzICsxNzM0LDE3IEBAIHByaXZhdGUgc3RhdGljIHZvaWQgY3JlYXRlRmlsZShGaWxlIHBhcmVudERpciwgU3RyaW5nIG5hbWUsCiAJCQkJU3RyaW5nIGNvbnRlbnQpCiAJCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHBhcmVudERpciwgbmFtZSk7Ci0JCQlGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpOwotCQkJdHJ5IHsKKwkJCXRyeSAoRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlKSkgewogCQkJCWZvcy53cml0ZShjb250ZW50LmdldEJ5dGVzKENvbnN0YW50cy5DSEFSQUNURVJfRU5DT0RJTkcpKTsKIAkJCQlmb3Mud3JpdGUoJ1xuJyk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWZvcy5jbG9zZSgpOwogCQkJfQogCQl9CiAKIAkJcHJpdmF0ZSBzdGF0aWMgdm9pZCBhcHBlbmRUb0ZpbGUoRmlsZSBmaWxlLCBTdHJpbmcgY29udGVudCkKIAkJCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlLCB0cnVlKTsKLQkJCXRyeSB7CisJCQl0cnkgKEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSwgdHJ1ZSkpIHsKIAkJCQlmb3Mud3JpdGUoY29udGVudC5nZXRCeXRlcyhDb25zdGFudHMuQ0hBUkFDVEVSX0VOQ09ESU5HKSk7CiAJCQkJZm9zLndyaXRlKCdcbicpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlmb3MuY2xvc2UoKTsKIAkJCX0KIAkJfQogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1JlbW90ZUFkZENvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1JlbW90ZUFkZENvbW1hbmQuamF2YQppbmRleCBjNDNjNWM2Li5hOGZkY2QyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9SZW1vdGVBZGRDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvUmVtb3RlQWRkQ29tbWFuZC5qYXZhCkBAIC04Niw5ICs4NiwxMiBAQCBwcm90ZWN0ZWQgUmVtb3RlQWRkQ29tbWFuZChSZXBvc2l0b3J5IHJlcG8pIHsKIAkgKgogCSAqIEBwYXJhbSBuYW1lCiAJICogICAgICAgICAgICBhIHJlbW90ZSBuYW1lCisJICogQHJldHVybiB0aGlzIGluc3RhbmNlCisJICogQHNpbmNlIDUuMAogCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKwlwdWJsaWMgUmVtb3RlQWRkQ29tbWFuZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CiAJCXRoaXMubmFtZSA9IG5hbWU7CisJCXJldHVybiB0aGlzOwogCX0KIAogCS8qKgpAQCAtOTYsOSArOTksMTIgQEAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewogCSAqCiAJICogQHBhcmFtIHVyaQogCSAqICAgICAgICAgICAgYW4gVVJMIGZvciB0aGUgcmVtb3RlCisJICogQHJldHVybiB0aGlzIGluc3RhbmNlCisJICogQHNpbmNlIDUuMAogCSAqLwotCXB1YmxpYyB2b2lkIHNldFVyaShVUklpc2ggdXJpKSB7CisJcHVibGljIFJlbW90ZUFkZENvbW1hbmQgc2V0VXJpKFVSSWlzaCB1cmkpIHsKIAkJdGhpcy51cmkgPSB1cmk7CisJCXJldHVybiB0aGlzOwogCX0KIAogCS8qKgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvUmVzZXRDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9SZXNldENvbW1hbmQuamF2YQppbmRleCBiZTQ0NmY5Li4xM2NlNGU3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9SZXNldENvbW1hbmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9SZXNldENvbW1hbmQuamF2YQpAQCAtMjQ1LDcgKzI0NSw3IEBAIGVsc2UgaWYgKHJlcG8ucmVhZFNxdWFzaENvbW1pdE1zZygpICE9IG51bGwpCiAJCX0KIAl9CiAKLQlwcml2YXRlIFJldkNvbW1pdCBwYXJzZUNvbW1pdChmaW5hbCBPYmplY3RJZCBjb21taXRJZCkgeworCXByaXZhdGUgUmV2Q29tbWl0IHBhcnNlQ29tbWl0KE9iamVjdElkIGNvbW1pdElkKSB7CiAJCXRyeSAoUmV2V2FsayBydyA9IG5ldyBSZXZXYWxrKHJlcG8pKSB7CiAJCQlyZXR1cm4gcncucGFyc2VDb21taXQoY29tbWl0SWQpOwogCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CkBAIC0zNjAsNyArMzYwLDcgQEAgcHVibGljIFJlc2V0Q29tbWFuZCBzZXRQcm9ncmVzc01vbml0b3IoUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKIAogCXByaXZhdGUgdm9pZCByZXNldEluZGV4Rm9yUGF0aHMoT2JqZWN0SWQgY29tbWl0VHJlZSkgewogCQlEaXJDYWNoZSBkYyA9IG51bGw7Ci0JCXRyeSAoZmluYWwgVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsocmVwbykpIHsKKwkJdHJ5IChUcmVlV2FsayB0dyA9IG5ldyBUcmVlV2FsayhyZXBvKSkgewogCQkJZGMgPSByZXBvLmxvY2tEaXJDYWNoZSgpOwogCQkJRGlyQ2FjaGVCdWlsZGVyIGJ1aWxkZXIgPSBkYy5idWlsZGVyKCk7CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1JtQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvUm1Db21tYW5kLmphdmEKaW5kZXggMDg4YWExNS4uZDJmNGJlOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvUm1Db21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvUm1Db21tYW5kLmphdmEKQEAgLTE1NCw3ICsxNTQsNyBAQCBwdWJsaWMgRGlyQ2FjaGUgY2FsbCgpIHRocm93cyBHaXRBUElFeGNlcHRpb24sCiAJCURpckNhY2hlIGRjID0gbnVsbDsKIAogCQlMaXN0PFN0cmluZz4gYWN0dWFsbHlEZWxldGVkRmlsZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLQkJdHJ5IChmaW5hbCBUcmVlV2FsayB0dyA9IG5ldyBUcmVlV2FsayhyZXBvKSkgeworCQl0cnkgKFRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKHJlcG8pKSB7CiAJCQlkYyA9IHJlcG8ubG9ja0RpckNhY2hlKCk7CiAJCQlEaXJDYWNoZUJ1aWxkZXIgYnVpbGRlciA9IGRjLmJ1aWxkZXIoKTsKIAkJCXR3LnJlc2V0KCk7IC8vIGRyb3AgdGhlIGZpcnN0IGVtcHR5IHRyZWUsIHdoaWNoIHdlIGRvIG5vdCBuZWVkIGhlcmUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1N0YXNoQXBwbHlDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TdGFzaEFwcGx5Q29tbWFuZC5qYXZhCmluZGV4IDVmNzkyOGQuLjAxZDA3MGMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1N0YXNoQXBwbHlDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3Rhc2hBcHBseUNvbW1hbmQuamF2YQpAQCAtMTExLDcgKzExMSw3IEBAIHB1YmxpYyBjbGFzcyBTdGFzaEFwcGx5Q29tbWFuZCBleHRlbmRzIEdpdENvbW1hbmQ8T2JqZWN0SWQ+IHsKIAkgKiAgICAgICAgICAgIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeX0gdG8gYXBwbHkgdGhlIHN0YXNoCiAJICogICAgICAgICAgICB0bwogCSAqLwotCXB1YmxpYyBTdGFzaEFwcGx5Q29tbWFuZChmaW5hbCBSZXBvc2l0b3J5IHJlcG8pIHsKKwlwdWJsaWMgU3Rhc2hBcHBseUNvbW1hbmQoUmVwb3NpdG9yeSByZXBvKSB7CiAJCXN1cGVyKHJlcG8pOwogCX0KIApAQCAtMTI1LDcgKzEyNSw3IEBAIHB1YmxpYyBTdGFzaEFwcGx5Q29tbWFuZChmaW5hbCBSZXBvc2l0b3J5IHJlcG8pIHsKIAkgKiAgICAgICAgICAgIG5hbWUgb2YgdGhlIHN0YXNoIHtAY29kZSBSZWZ9IHRvIGFwcGx5CiAJICogQHJldHVybiB7QGNvZGUgdGhpc30KIAkgKi8KLQlwdWJsaWMgU3Rhc2hBcHBseUNvbW1hbmQgc2V0U3Rhc2hSZWYoZmluYWwgU3RyaW5nIHN0YXNoUmVmKSB7CisJcHVibGljIFN0YXNoQXBwbHlDb21tYW5kIHNldFN0YXNoUmVmKFN0cmluZyBzdGFzaFJlZikgewogCQl0aGlzLnN0YXNoUmVmID0gc3Rhc2hSZWY7CiAJCXJldHVybiB0aGlzOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1N0YXNoQ3JlYXRlQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3Rhc2hDcmVhdGVDb21tYW5kLmphdmEKaW5kZXggMzQ5NWZmOC4uYzMyODkwZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3Rhc2hDcmVhdGVDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3Rhc2hDcmVhdGVDb21tYW5kLmphdmEKQEAgLTE5NSw3ICsxOTUsNyBAQCBwdWJsaWMgU3Rhc2hDcmVhdGVDb21tYW5kIHNldEluY2x1ZGVVbnRyYWNrZWQoYm9vbGVhbiBpbmNsdWRlVW50cmFja2VkKSB7CiAKIAlwcml2YXRlIFJldkNvbW1pdCBwYXJzZUNvbW1pdChmaW5hbCBPYmplY3RSZWFkZXIgcmVhZGVyLAogCQkJZmluYWwgT2JqZWN0SWQgaGVhZElkKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl0cnkgKGZpbmFsIFJldldhbGsgd2FsayA9IG5ldyBSZXZXYWxrKHJlYWRlcikpIHsKKwkJdHJ5IChSZXZXYWxrIHdhbGsgPSBuZXcgUmV2V2FsayhyZWFkZXIpKSB7CiAJCQlyZXR1cm4gd2Fsay5wYXJzZUNvbW1pdChoZWFkSWQpOwogCQl9CiAJfQpAQCAtMzAzLDEyICszMDMsOSBAQCBwdWJsaWMgUmV2Q29tbWl0IGNhbGwoKSB0aHJvd3MgR2l0QVBJRXhjZXB0aW9uIHsKIAkJCQkJCWVudHJ5LnNldExhc3RNb2RpZmllZCh3dEl0ZXIuZ2V0RW50cnlMYXN0TW9kaWZpZWQoKSk7CiAJCQkJCQllbnRyeS5zZXRGaWxlTW9kZSh3dEl0ZXIuZ2V0RW50cnlGaWxlTW9kZSgpKTsKIAkJCQkJCWxvbmcgY29udGVudExlbmd0aCA9IHd0SXRlci5nZXRFbnRyeUNvbnRlbnRMZW5ndGgoKTsKLQkJCQkJCUlucHV0U3RyZWFtIGluID0gd3RJdGVyLm9wZW5FbnRyeVN0cmVhbSgpOwotCQkJCQkJdHJ5IHsKKwkJCQkJCXRyeSAoSW5wdXRTdHJlYW0gaW4gPSB3dEl0ZXIub3BlbkVudHJ5U3RyZWFtKCkpIHsKIAkJCQkJCQllbnRyeS5zZXRPYmplY3RJZChpbnNlcnRlci5pbnNlcnQoCiAJCQkJCQkJCQlDb25zdGFudHMuT0JKX0JMT0IsIGNvbnRlbnRMZW5ndGgsIGluKSk7Ci0JCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJCWluLmNsb3NlKCk7CiAJCQkJCQl9CiAKIAkJCQkJCWlmIChpbmRleEl0ZXIgPT0gbnVsbCAmJiBoZWFkSXRlciA9PSBudWxsKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3Rhc2hEcm9wQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3Rhc2hEcm9wQ29tbWFuZC5qYXZhCmluZGV4IGNkOGY4ZTYuLjdmMDJhYWIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1N0YXNoRHJvcENvbW1hbmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TdGFzaERyb3BDb21tYW5kLmphdmEKQEAgLTEwNyw3ICsxMDcsNyBAQCBwdWJsaWMgU3Rhc2hEcm9wQ29tbWFuZChSZXBvc2l0b3J5IHJlcG8pIHsKIAkgKiAgICAgICAgICAgIHRoZSAwLWJhc2VkIGluZGV4IG9mIHRoZSBzdGFzaCByZWZlcmVuY2UKIAkgKiBAcmV0dXJuIHtAY29kZSB0aGlzfQogCSAqLwotCXB1YmxpYyBTdGFzaERyb3BDb21tYW5kIHNldFN0YXNoUmVmKGZpbmFsIGludCBzdGFzaFJlZikgeworCXB1YmxpYyBTdGFzaERyb3BDb21tYW5kIHNldFN0YXNoUmVmKGludCBzdGFzaFJlZikgewogCQlpZiAoc3Rhc2hSZWYgPCAwKQogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwogCkBAIC0xMjQsNyArMTI0LDcgQEAgcHVibGljIFN0YXNoRHJvcENvbW1hbmQgc2V0U3Rhc2hSZWYoZmluYWwgaW50IHN0YXNoUmVmKSB7CiAJICogICAgICAgICAgICB7QGxpbmsgI3NldFN0YXNoUmVmKGludCl9CiAJICogQHJldHVybiB7QGNvZGUgdGhpc30KIAkgKi8KLQlwdWJsaWMgU3Rhc2hEcm9wQ29tbWFuZCBzZXRBbGwoZmluYWwgYm9vbGVhbiBhbGwpIHsKKwlwdWJsaWMgU3Rhc2hEcm9wQ29tbWFuZCBzZXRBbGwoYm9vbGVhbiBhbGwpIHsKIAkJdGhpcy5hbGwgPSBhbGw7CiAJCXJldHVybiB0aGlzOwogCX0KQEAgLTEzOCw3ICsxMzgsNyBAQCBwcml2YXRlIFJlZiBnZXRSZWYoKSB0aHJvd3MgR2l0QVBJRXhjZXB0aW9uIHsKIAkJfQogCX0KIAotCXByaXZhdGUgUmVmVXBkYXRlIGNyZWF0ZVJlZlVwZGF0ZShmaW5hbCBSZWYgc3Rhc2hSZWYpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJpdmF0ZSBSZWZVcGRhdGUgY3JlYXRlUmVmVXBkYXRlKFJlZiBzdGFzaFJlZikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJUmVmVXBkYXRlIHVwZGF0ZSA9IHJlcG8udXBkYXRlUmVmKFJfU1RBU0gpOwogCQl1cGRhdGUuZGlzYWJsZVJlZkxvZygpOwogCQl1cGRhdGUuc2V0RXhwZWN0ZWRPbGRPYmplY3RJZChzdGFzaFJlZi5nZXRPYmplY3RJZCgpKTsKQEAgLTE0Niw3ICsxNDYsNyBAQCBwcml2YXRlIFJlZlVwZGF0ZSBjcmVhdGVSZWZVcGRhdGUoZmluYWwgUmVmIHN0YXNoUmVmKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlyZXR1cm4gdXBkYXRlOwogCX0KIAotCXByaXZhdGUgdm9pZCBkZWxldGVSZWYoZmluYWwgUmVmIHN0YXNoUmVmKSB7CisJcHJpdmF0ZSB2b2lkIGRlbGV0ZVJlZihSZWYgc3Rhc2hSZWYpIHsKIAkJdHJ5IHsKIAkJCVJlc3VsdCByZXN1bHQgPSBjcmVhdGVSZWZVcGRhdGUoc3Rhc2hSZWYpLmRlbGV0ZSgpOwogCQkJaWYgKFJlc3VsdC5GT1JDRUQgIT0gcmVzdWx0KQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3Rhc2hMaXN0Q29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3Rhc2hMaXN0Q29tbWFuZC5qYXZhCmluZGV4IDY0NTFiNzAuLmYzMTZiMjMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1N0YXNoTGlzdENvbW1hbmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TdGFzaExpc3RDb21tYW5kLmphdmEKQEAgLTcyLDcgKzcyLDcgQEAgcHVibGljIGNsYXNzIFN0YXNoTGlzdENvbW1hbmQgZXh0ZW5kcyBHaXRDb21tYW5kPENvbGxlY3Rpb248UmV2Q29tbWl0Pj4gewogCSAqCiAJICogQHBhcmFtIHJlcG8gYSB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeX0gb2JqZWN0LgogCSAqLwotCXB1YmxpYyBTdGFzaExpc3RDb21tYW5kKGZpbmFsIFJlcG9zaXRvcnkgcmVwbykgeworCXB1YmxpYyBTdGFzaExpc3RDb21tYW5kKFJlcG9zaXRvcnkgcmVwbykgewogCQlzdXBlcihyZXBvKTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1N1Ym1vZHVsZUFkZENvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1N1Ym1vZHVsZUFkZENvbW1hbmQuamF2YQppbmRleCA4MWVhMzUwLi45ZDk2MjZmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TdWJtb2R1bGVBZGRDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3VibW9kdWxlQWRkQ29tbWFuZC5qYXZhCkBAIC04OSw3ICs4OSw3IEBAIHB1YmxpYyBjbGFzcyBTdWJtb2R1bGVBZGRDb21tYW5kIGV4dGVuZHMKIAkgKiBAcGFyYW0gcmVwbwogCSAqICAgICAgICAgICAgYSB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeX0gb2JqZWN0LgogCSAqLwotCXB1YmxpYyBTdWJtb2R1bGVBZGRDb21tYW5kKGZpbmFsIFJlcG9zaXRvcnkgcmVwbykgeworCXB1YmxpYyBTdWJtb2R1bGVBZGRDb21tYW5kKFJlcG9zaXRvcnkgcmVwbykgewogCQlzdXBlcihyZXBvKTsKIAl9CiAKQEAgLTEwMCw3ICsxMDAsNyBAQCBwdWJsaWMgU3VibW9kdWxlQWRkQ29tbWFuZChmaW5hbCBSZXBvc2l0b3J5IHJlcG8pIHsKIAkgKiAgICAgICAgICAgICh3aXRoIDxjb2RlPi88L2NvZGU+IGFzIHNlcGFyYXRvcikKIAkgKiBAcmV0dXJuIHRoaXMgY29tbWFuZAogCSAqLwotCXB1YmxpYyBTdWJtb2R1bGVBZGRDb21tYW5kIHNldFBhdGgoZmluYWwgU3RyaW5nIHBhdGgpIHsKKwlwdWJsaWMgU3VibW9kdWxlQWRkQ29tbWFuZCBzZXRQYXRoKFN0cmluZyBwYXRoKSB7CiAJCXRoaXMucGF0aCA9IHBhdGg7CiAJCXJldHVybiB0aGlzOwogCX0KQEAgLTExMiw3ICsxMTIsNyBAQCBwdWJsaWMgU3VibW9kdWxlQWRkQ29tbWFuZCBzZXRQYXRoKGZpbmFsIFN0cmluZyBwYXRoKSB7CiAJICogICAgICAgICAgICBhIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfSBvYmplY3QuCiAJICogQHJldHVybiB0aGlzIGNvbW1hbmQKIAkgKi8KLQlwdWJsaWMgU3VibW9kdWxlQWRkQ29tbWFuZCBzZXRVUkkoZmluYWwgU3RyaW5nIHVyaSkgeworCXB1YmxpYyBTdWJtb2R1bGVBZGRDb21tYW5kIHNldFVSSShTdHJpbmcgdXJpKSB7CiAJCXRoaXMudXJpID0gdXJpOwogCQlyZXR1cm4gdGhpczsKIAl9CkBAIC0xMjYsNyArMTI2LDcgQEAgcHVibGljIFN1Ym1vZHVsZUFkZENvbW1hbmQgc2V0VVJJKGZpbmFsIFN0cmluZyB1cmkpIHsKIAkgKiAgICAgICAgICAgIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQubGliLlByb2dyZXNzTW9uaXRvcn0gb2JqZWN0LgogCSAqIEByZXR1cm4gdGhpcyBjb21tYW5kCiAJICovCi0JcHVibGljIFN1Ym1vZHVsZUFkZENvbW1hbmQgc2V0UHJvZ3Jlc3NNb25pdG9yKGZpbmFsIFByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJcHVibGljIFN1Ym1vZHVsZUFkZENvbW1hbmQgc2V0UHJvZ3Jlc3NNb25pdG9yKFByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CiAJCXRoaXMubW9uaXRvciA9IG1vbml0b3I7CiAJCXJldHVybiB0aGlzOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1N1Ym1vZHVsZUluaXRDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TdWJtb2R1bGVJbml0Q29tbWFuZC5qYXZhCmluZGV4IDZhZjI3ZDcuLjJkYjEyYjggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1N1Ym1vZHVsZUluaXRDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3VibW9kdWxlSW5pdENvbW1hbmQuamF2YQpAQCAtNzcsNyArNzcsNyBAQCBwdWJsaWMgY2xhc3MgU3VibW9kdWxlSW5pdENvbW1hbmQgZXh0ZW5kcyBHaXRDb21tYW5kPENvbGxlY3Rpb248U3RyaW5nPj4gewogCSAqIEBwYXJhbSByZXBvCiAJICogICAgICAgICAgICBhIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5fSBvYmplY3QuCiAJICovCi0JcHVibGljIFN1Ym1vZHVsZUluaXRDb21tYW5kKGZpbmFsIFJlcG9zaXRvcnkgcmVwbykgeworCXB1YmxpYyBTdWJtb2R1bGVJbml0Q29tbWFuZChSZXBvc2l0b3J5IHJlcG8pIHsKIAkJc3VwZXIocmVwbyk7CiAJCXBhdGhzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAJfQpAQCAtODksNyArODksNyBAQCBwdWJsaWMgU3VibW9kdWxlSW5pdENvbW1hbmQoZmluYWwgUmVwb3NpdG9yeSByZXBvKSB7CiAJICogICAgICAgICAgICAod2l0aCA8Y29kZT4vPC9jb2RlPiBhcyBzZXBhcmF0b3IpCiAJICogQHJldHVybiB0aGlzIGNvbW1hbmQKIAkgKi8KLQlwdWJsaWMgU3VibW9kdWxlSW5pdENvbW1hbmQgYWRkUGF0aChmaW5hbCBTdHJpbmcgcGF0aCkgeworCXB1YmxpYyBTdWJtb2R1bGVJbml0Q29tbWFuZCBhZGRQYXRoKFN0cmluZyBwYXRoKSB7CiAJCXBhdGhzLmFkZChwYXRoKTsKIAkJcmV0dXJuIHRoaXM7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3VibW9kdWxlU3RhdHVzQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3VibW9kdWxlU3RhdHVzQ29tbWFuZC5qYXZhCmluZGV4IDk3YWU2NjguLjA2MDZjNWIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1N1Ym1vZHVsZVN0YXR1c0NvbW1hbmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TdWJtb2R1bGVTdGF0dXNDb21tYW5kLmphdmEKQEAgLTc3LDcgKzc3LDcgQEAgcHVibGljIGNsYXNzIFN1Ym1vZHVsZVN0YXR1c0NvbW1hbmQgZXh0ZW5kcwogCSAqIEBwYXJhbSByZXBvCiAJICogICAgICAgICAgICBhIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5fSBvYmplY3QuCiAJICovCi0JcHVibGljIFN1Ym1vZHVsZVN0YXR1c0NvbW1hbmQoZmluYWwgUmVwb3NpdG9yeSByZXBvKSB7CisJcHVibGljIFN1Ym1vZHVsZVN0YXR1c0NvbW1hbmQoUmVwb3NpdG9yeSByZXBvKSB7CiAJCXN1cGVyKHJlcG8pOwogCQlwYXRocyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCX0KQEAgLTg5LDcgKzg5LDcgQEAgcHVibGljIFN1Ym1vZHVsZVN0YXR1c0NvbW1hbmQoZmluYWwgUmVwb3NpdG9yeSByZXBvKSB7CiAJICogICAgICAgICAgICAod2l0aCA8Y29kZT4vPC9jb2RlPiBhcyBzZXBhcmF0b3IpCiAJICogQHJldHVybiB0aGlzIGNvbW1hbmQKIAkgKi8KLQlwdWJsaWMgU3VibW9kdWxlU3RhdHVzQ29tbWFuZCBhZGRQYXRoKGZpbmFsIFN0cmluZyBwYXRoKSB7CisJcHVibGljIFN1Ym1vZHVsZVN0YXR1c0NvbW1hbmQgYWRkUGF0aChTdHJpbmcgcGF0aCkgewogCQlwYXRocy5hZGQocGF0aCk7CiAJCXJldHVybiB0aGlzOwogCX0KQEAgLTEzMCwxNiArMTMwLDE0IEBAIHByaXZhdGUgU3VibW9kdWxlU3RhdHVzIGdldFN0YXR1cyhTdWJtb2R1bGVXYWxrIGdlbmVyYXRvcikKIAkJCQkJaWQpOwogCiAJCS8vIFJlcG9ydCB1bmluaXRpYWxpemVkIGlmIG5vIHN1Ym1vZHVsZSByZXBvc2l0b3J5Ci0JCVJlcG9zaXRvcnkgc3ViUmVwbyA9IGdlbmVyYXRvci5nZXRSZXBvc2l0b3J5KCk7Ci0JCWlmIChzdWJSZXBvID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFN1Ym1vZHVsZVN0YXR1cyhTdWJtb2R1bGVTdGF0dXNUeXBlLlVOSU5JVElBTElaRUQsIHBhdGgsCi0JCQkJCWlkKTsKKwkJT2JqZWN0SWQgaGVhZElkID0gbnVsbDsKKwkJdHJ5IChSZXBvc2l0b3J5IHN1YlJlcG8gPSBnZW5lcmF0b3IuZ2V0UmVwb3NpdG9yeSgpKSB7CisJCQlpZiAoc3ViUmVwbyA9PSBudWxsKSB7CisJCQkJcmV0dXJuIG5ldyBTdWJtb2R1bGVTdGF0dXMoU3VibW9kdWxlU3RhdHVzVHlwZS5VTklOSVRJQUxJWkVELAorCQkJCQkJcGF0aCwgaWQpOworCQkJfQogCi0JCU9iamVjdElkIGhlYWRJZDsKLQkJdHJ5IHsKIAkJCWhlYWRJZCA9IHN1YlJlcG8ucmVzb2x2ZShDb25zdGFudHMuSEVBRCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlzdWJSZXBvLmNsb3NlKCk7CiAJCX0KIAogCQkvLyBSZXBvcnQgdW5pbml0aWFsaXplZCBpZiBubyBIRUFEIGNvbW1pdCBpbiBzdWJtb2R1bGUgcmVwb3NpdG9yeQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3VibW9kdWxlU3luY0NvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1N1Ym1vZHVsZVN5bmNDb21tYW5kLmphdmEKaW5kZXggZDIyZDgyMC4uN2NmNGI3MyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3VibW9kdWxlU3luY0NvbW1hbmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TdWJtb2R1bGVTeW5jQ29tbWFuZC5qYXZhCkBAIC03OSw3ICs3OSw3IEBAIHB1YmxpYyBjbGFzcyBTdWJtb2R1bGVTeW5jQ29tbWFuZCBleHRlbmRzIEdpdENvbW1hbmQ8TWFwPFN0cmluZywgU3RyaW5nPj4gewogCSAqIEBwYXJhbSByZXBvCiAJICogICAgICAgICAgICBhIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5fSBvYmplY3QuCiAJICovCi0JcHVibGljIFN1Ym1vZHVsZVN5bmNDb21tYW5kKGZpbmFsIFJlcG9zaXRvcnkgcmVwbykgeworCXB1YmxpYyBTdWJtb2R1bGVTeW5jQ29tbWFuZChSZXBvc2l0b3J5IHJlcG8pIHsKIAkJc3VwZXIocmVwbyk7CiAJCXBhdGhzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAJfQpAQCAtOTEsNyArOTEsNyBAQCBwdWJsaWMgU3VibW9kdWxlU3luY0NvbW1hbmQoZmluYWwgUmVwb3NpdG9yeSByZXBvKSB7CiAJICogICAgICAgICAgICAod2l0aCA8Y29kZT4vPC9jb2RlPiBhcyBzZXBhcmF0b3IpCiAJICogQHJldHVybiB0aGlzIGNvbW1hbmQKIAkgKi8KLQlwdWJsaWMgU3VibW9kdWxlU3luY0NvbW1hbmQgYWRkUGF0aChmaW5hbCBTdHJpbmcgcGF0aCkgeworCXB1YmxpYyBTdWJtb2R1bGVTeW5jQ29tbWFuZCBhZGRQYXRoKFN0cmluZyBwYXRoKSB7CiAJCXBhdGhzLmFkZChwYXRoKTsKIAkJcmV0dXJuIHRoaXM7CiAJfQpAQCAtMTA0LDcgKzEwNCw3IEBAIHB1YmxpYyBTdWJtb2R1bGVTeW5jQ29tbWFuZCBhZGRQYXRoKGZpbmFsIFN0cmluZyBwYXRoKSB7CiAJICogQHJldHVybiBzaG9ydGVuZWQgYnJhbmNoIG5hbWUsIG51bGwgb24gZmFpbHVyZXMKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEhlYWRCcmFuY2goZmluYWwgUmVwb3NpdG9yeSBzdWJSZXBvKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByb3RlY3RlZCBTdHJpbmcgZ2V0SGVhZEJyYW5jaChSZXBvc2l0b3J5IHN1YlJlcG8pIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCVJlZiBoZWFkID0gc3ViUmVwby5leGFjdFJlZihDb25zdGFudHMuSEVBRCk7CiAJCWlmIChoZWFkICE9IG51bGwgJiYgaGVhZC5pc1N5bWJvbGljKCkpCiAJCQlyZXR1cm4gUmVwb3NpdG9yeS5zaG9ydGVuUmVmTmFtZShoZWFkLmdldExlYWYoKS5nZXROYW1lKCkpOwpAQCAtMTMyLDMwICsxMzIsMzEgQEAgcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gY2FsbCgpIHRocm93cyBHaXRBUElFeGNlcHRpb24gewogCQkJCQkJcGF0aCwgQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfVVJMLCByZW1vdGVVcmwpOwogCQkJCXN5bmNlZC5wdXQocGF0aCwgcmVtb3RlVXJsKTsKIAotCQkJCVJlcG9zaXRvcnkgc3ViUmVwbyA9IGdlbmVyYXRvci5nZXRSZXBvc2l0b3J5KCk7Ci0JCQkJaWYgKHN1YlJlcG8gPT0gbnVsbCkKLQkJCQkJY29udGludWU7CisJCQkJdHJ5IChSZXBvc2l0b3J5IHN1YlJlcG8gPSBnZW5lcmF0b3IuZ2V0UmVwb3NpdG9yeSgpKSB7CisJCQkJCWlmIChzdWJSZXBvID09IG51bGwpIHsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CiAKLQkJCQlTdG9yZWRDb25maWcgc3ViQ29uZmlnOwotCQkJCVN0cmluZyBicmFuY2g7Ci0JCQkJdHJ5IHsKKwkJCQkJU3RvcmVkQ29uZmlnIHN1YkNvbmZpZzsKKwkJCQkJU3RyaW5nIGJyYW5jaDsKKwogCQkJCQlzdWJDb25maWcgPSBzdWJSZXBvLmdldENvbmZpZygpOwogCQkJCQkvLyBHZXQgbmFtZSBvZiByZW1vdGUgYXNzb2NpYXRlZCB3aXRoIGN1cnJlbnQgYnJhbmNoIGFuZAogCQkJCQkvLyBmYWxsIGJhY2sgdG8gZGVmYXVsdCByZW1vdGUgbmFtZSBhcyBsYXN0IHJlc29ydAogCQkJCQlicmFuY2ggPSBnZXRIZWFkQnJhbmNoKHN1YlJlcG8pOwogCQkJCQlTdHJpbmcgcmVtb3RlID0gbnVsbDsKLQkJCQkJaWYgKGJyYW5jaCAhPSBudWxsKQorCQkJCQlpZiAoYnJhbmNoICE9IG51bGwpIHsKIAkJCQkJCXJlbW90ZSA9IHN1YkNvbmZpZy5nZXRTdHJpbmcoCiAJCQkJCQkJCUNvbmZpZ0NvbnN0YW50cy5DT05GSUdfQlJBTkNIX1NFQ1RJT04sIGJyYW5jaCwKIAkJCQkJCQkJQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfUkVNT1RFKTsKLQkJCQkJaWYgKHJlbW90ZSA9PSBudWxsKQorCQkJCQl9CisJCQkJCWlmIChyZW1vdGUgPT0gbnVsbCkgewogCQkJCQkJcmVtb3RlID0gQ29uc3RhbnRzLkRFRkFVTFRfUkVNT1RFX05BTUU7CisJCQkJCX0KIAogCQkJCQlzdWJDb25maWcuc2V0U3RyaW5nKENvbmZpZ0NvbnN0YW50cy5DT05GSUdfUkVNT1RFX1NFQ1RJT04sCiAJCQkJCQkJcmVtb3RlLCBDb25maWdDb25zdGFudHMuQ09ORklHX0tFWV9VUkwsIHJlbW90ZVVybCk7CiAJCQkJCXN1YkNvbmZpZy5zYXZlKCk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJc3ViUmVwby5jbG9zZSgpOwogCQkJCX0KIAkJCX0KIAkJCWlmICghc3luY2VkLmlzRW1wdHkoKSkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1N1Ym1vZHVsZVVwZGF0ZUNvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1N1Ym1vZHVsZVVwZGF0ZUNvbW1hbmQuamF2YQppbmRleCAzMzYyZDQ2Li4zOThmMjFlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TdWJtb2R1bGVVcGRhdGVDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3VibW9kdWxlVXBkYXRlQ29tbWFuZC5qYXZhCkBAIC0xMDMsNyArMTAzLDcgQEAgcHVibGljIGNsYXNzIFN1Ym1vZHVsZVVwZGF0ZUNvbW1hbmQgZXh0ZW5kcwogCSAqIEBwYXJhbSByZXBvCiAJICogICAgICAgICAgICBhIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5fSBvYmplY3QuCiAJICovCi0JcHVibGljIFN1Ym1vZHVsZVVwZGF0ZUNvbW1hbmQoZmluYWwgUmVwb3NpdG9yeSByZXBvKSB7CisJcHVibGljIFN1Ym1vZHVsZVVwZGF0ZUNvbW1hbmQoUmVwb3NpdG9yeSByZXBvKSB7CiAJCXN1cGVyKHJlcG8pOwogCQlwYXRocyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCX0KQEAgLTEzMiw3ICsxMzIsNyBAQCBwdWJsaWMgU3VibW9kdWxlVXBkYXRlQ29tbWFuZCBzZXRQcm9ncmVzc01vbml0b3IoCiAJICogQHJldHVybiB0aGlzIGNvbW1hbmQKIAkgKiBAc2luY2UgNC45CiAJICovCi0JcHVibGljIFN1Ym1vZHVsZVVwZGF0ZUNvbW1hbmQgc2V0RmV0Y2goZmluYWwgYm9vbGVhbiBmZXRjaCkgeworCXB1YmxpYyBTdWJtb2R1bGVVcGRhdGVDb21tYW5kIHNldEZldGNoKGJvb2xlYW4gZmV0Y2gpIHsKIAkJdGhpcy5mZXRjaCA9IGZldGNoOwogCQlyZXR1cm4gdGhpczsKIAl9CkBAIC0xNDQsMTEgKzE0NCw0MyBAQCBwdWJsaWMgU3VibW9kdWxlVXBkYXRlQ29tbWFuZCBzZXRGZXRjaChmaW5hbCBib29sZWFuIGZldGNoKSB7CiAJICogICAgICAgICAgICAod2l0aCA8Y29kZT4vPC9jb2RlPiBhcyBzZXBhcmF0b3IpCiAJICogQHJldHVybiB0aGlzIGNvbW1hbmQKIAkgKi8KLQlwdWJsaWMgU3VibW9kdWxlVXBkYXRlQ29tbWFuZCBhZGRQYXRoKGZpbmFsIFN0cmluZyBwYXRoKSB7CisJcHVibGljIFN1Ym1vZHVsZVVwZGF0ZUNvbW1hbmQgYWRkUGF0aChTdHJpbmcgcGF0aCkgewogCQlwYXRocy5hZGQocGF0aCk7CiAJCXJldHVybiB0aGlzOwogCX0KIAorCXByaXZhdGUgUmVwb3NpdG9yeSBnZXRPckNsb25lU3VibW9kdWxlKFN1Ym1vZHVsZVdhbGsgZ2VuZXJhdG9yLCBTdHJpbmcgdXJsKQorCQkJdGhyb3dzIElPRXhjZXB0aW9uLCBHaXRBUElFeGNlcHRpb24geworCQlSZXBvc2l0b3J5IHJlcG9zaXRvcnkgPSBnZW5lcmF0b3IuZ2V0UmVwb3NpdG9yeSgpOworCQlpZiAocmVwb3NpdG9yeSA9PSBudWxsKSB7CisJCQlpZiAoY2FsbGJhY2sgIT0gbnVsbCkgeworCQkJCWNhbGxiYWNrLmNsb25pbmdTdWJtb2R1bGUoZ2VuZXJhdG9yLmdldFBhdGgoKSk7CisJCQl9CisJCQlDbG9uZUNvbW1hbmQgY2xvbmUgPSBHaXQuY2xvbmVSZXBvc2l0b3J5KCk7CisJCQljb25maWd1cmUoY2xvbmUpOworCQkJY2xvbmUuc2V0VVJJKHVybCk7CisJCQljbG9uZS5zZXREaXJlY3RvcnkoZ2VuZXJhdG9yLmdldERpcmVjdG9yeSgpKTsKKwkJCWNsb25lLnNldEdpdERpcigKKwkJCQkJbmV3IEZpbGUobmV3IEZpbGUocmVwby5nZXREaXJlY3RvcnkoKSwgQ29uc3RhbnRzLk1PRFVMRVMpLAorCQkJCQkJCWdlbmVyYXRvci5nZXRQYXRoKCkpKTsKKwkJCWlmIChtb25pdG9yICE9IG51bGwpIHsKKwkJCQljbG9uZS5zZXRQcm9ncmVzc01vbml0b3IobW9uaXRvcik7CisJCQl9CisJCQlyZXBvc2l0b3J5ID0gY2xvbmUuY2FsbCgpLmdldFJlcG9zaXRvcnkoKTsKKwkJfSBlbHNlIGlmICh0aGlzLmZldGNoKSB7CisJCQlpZiAoZmV0Y2hDYWxsYmFjayAhPSBudWxsKSB7CisJCQkJZmV0Y2hDYWxsYmFjay5mZXRjaGluZ1N1Ym1vZHVsZShnZW5lcmF0b3IuZ2V0UGF0aCgpKTsKKwkJCX0KKwkJCUZldGNoQ29tbWFuZCBmZXRjaENvbW1hbmQgPSBHaXQud3JhcChyZXBvc2l0b3J5KS5mZXRjaCgpOworCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgeworCQkJCWZldGNoQ29tbWFuZC5zZXRQcm9ncmVzc01vbml0b3IobW9uaXRvcik7CisJCQl9CisJCQljb25maWd1cmUoZmV0Y2hDb21tYW5kKTsKKwkJCWZldGNoQ29tbWFuZC5jYWxsKCk7CisJCX0KKwkJcmV0dXJuIHJlcG9zaXRvcnk7CisJfQorCiAJLyoqCiAJICoge0Bpbmhlcml0RG9jfQogCSAqCkBAIC0xNzUsMzQgKzIwNyw4IEBAIHB1YmxpYyBDb2xsZWN0aW9uPFN0cmluZz4gY2FsbCgpIHRocm93cyBJbnZhbGlkQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwKIAkJCQlpZiAodXJsID09IG51bGwpCiAJCQkJCWNvbnRpbnVlOwogCi0JCQkJUmVwb3NpdG9yeSBzdWJtb2R1bGVSZXBvID0gZ2VuZXJhdG9yLmdldFJlcG9zaXRvcnkoKTsKLQkJCQkvLyBDbG9uZSByZXBvc2l0b3J5IGlmIG5vdCBwcmVzZW50Ci0JCQkJaWYgKHN1Ym1vZHVsZVJlcG8gPT0gbnVsbCkgewotCQkJCQlpZiAoY2FsbGJhY2sgIT0gbnVsbCkgewotCQkJCQkJY2FsbGJhY2suY2xvbmluZ1N1Ym1vZHVsZShnZW5lcmF0b3IuZ2V0UGF0aCgpKTsKLQkJCQkJfQotCQkJCQlDbG9uZUNvbW1hbmQgY2xvbmUgPSBHaXQuY2xvbmVSZXBvc2l0b3J5KCk7Ci0JCQkJCWNvbmZpZ3VyZShjbG9uZSk7Ci0JCQkJCWNsb25lLnNldFVSSSh1cmwpOwotCQkJCQljbG9uZS5zZXREaXJlY3RvcnkoZ2VuZXJhdG9yLmdldERpcmVjdG9yeSgpKTsKLQkJCQkJY2xvbmUuc2V0R2l0RGlyKG5ldyBGaWxlKG5ldyBGaWxlKHJlcG8uZ2V0RGlyZWN0b3J5KCksCi0JCQkJCQkJQ29uc3RhbnRzLk1PRFVMRVMpLCBnZW5lcmF0b3IuZ2V0UGF0aCgpKSk7Ci0JCQkJCWlmIChtb25pdG9yICE9IG51bGwpCi0JCQkJCQljbG9uZS5zZXRQcm9ncmVzc01vbml0b3IobW9uaXRvcik7Ci0JCQkJCXN1Ym1vZHVsZVJlcG8gPSBjbG9uZS5jYWxsKCkuZ2V0UmVwb3NpdG9yeSgpOwotCQkJCX0gZWxzZSBpZiAodGhpcy5mZXRjaCkgewotCQkJCQlpZiAoZmV0Y2hDYWxsYmFjayAhPSBudWxsKSB7Ci0JCQkJCQlmZXRjaENhbGxiYWNrLmZldGNoaW5nU3VibW9kdWxlKGdlbmVyYXRvci5nZXRQYXRoKCkpOwotCQkJCQl9Ci0JCQkJCUZldGNoQ29tbWFuZCBmZXRjaENvbW1hbmQgPSBHaXQud3JhcChzdWJtb2R1bGVSZXBvKS5mZXRjaCgpOwotCQkJCQlpZiAobW9uaXRvciAhPSBudWxsKSB7Ci0JCQkJCQlmZXRjaENvbW1hbmQuc2V0UHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IpOwotCQkJCQl9Ci0JCQkJCWNvbmZpZ3VyZShmZXRjaENvbW1hbmQpOwotCQkJCQlmZXRjaENvbW1hbmQuY2FsbCgpOwotCQkJCX0KLQotCQkJCXRyeSAoUmV2V2FsayB3YWxrID0gbmV3IFJldldhbGsoc3VibW9kdWxlUmVwbykpIHsKKwkJCQl0cnkgKFJlcG9zaXRvcnkgc3VibW9kdWxlUmVwbyA9IGdldE9yQ2xvbmVTdWJtb2R1bGUoZ2VuZXJhdG9yLAorCQkJCQkJdXJsKTsgUmV2V2FsayB3YWxrID0gbmV3IFJldldhbGsoc3VibW9kdWxlUmVwbykpIHsKIAkJCQkJUmV2Q29tbWl0IGNvbW1pdCA9IHdhbGsKIAkJCQkJCQkucGFyc2VDb21taXQoZ2VuZXJhdG9yLmdldE9iamVjdElkKCkpOwogCkBAIC0yMzcsOCArMjQzLDYgQEAgcHVibGljIENvbGxlY3Rpb248U3RyaW5nPiBjYWxsKCkgdGhyb3dzIEludmFsaWRDb25maWd1cmF0aW9uRXhjZXB0aW9uLAogCQkJCQkJCQkJZ2VuZXJhdG9yLmdldFBhdGgoKSk7CiAJCQkJCQl9CiAJCQkJCX0KLQkJCQl9IGZpbmFsbHkgewotCQkJCQlzdWJtb2R1bGVSZXBvLmNsb3NlKCk7CiAJCQkJfQogCQkJCXVwZGF0ZWQuYWRkKGdlbmVyYXRvci5nZXRQYXRoKCkpOwogCQkJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvVHJhbnNwb3J0Q29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvVHJhbnNwb3J0Q29tbWFuZC5qYXZhCmluZGV4IDljOTE1MzcuLmQzNGJiNWQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1RyYW5zcG9ydENvbW1hbmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9UcmFuc3BvcnRDb21tYW5kLmphdmEKQEAgLTgwLDcgKzgwLDcgQEAgcHVibGljIGFic3RyYWN0IGNsYXNzIFRyYW5zcG9ydENvbW1hbmQ8QyBleHRlbmRzIEdpdENvbW1hbmQsIFQ+IGV4dGVuZHMKIAkgKgogCSAqIEBwYXJhbSByZXBvIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnl9IG9iamVjdC4KIAkgKi8KLQlwcm90ZWN0ZWQgVHJhbnNwb3J0Q29tbWFuZChmaW5hbCBSZXBvc2l0b3J5IHJlcG8pIHsKKwlwcm90ZWN0ZWQgVHJhbnNwb3J0Q29tbWFuZChSZXBvc2l0b3J5IHJlcG8pIHsKIAkJc3VwZXIocmVwbyk7CiAJCXNldENyZWRlbnRpYWxzUHJvdmlkZXIoQ3JlZGVudGlhbHNQcm92aWRlci5nZXREZWZhdWx0KCkpOwogCX0KQEAgLTE0Nyw3ICsxNDcsNyBAQCBwcm90ZWN0ZWQgZmluYWwgQyBzZWxmKCkgewogCSAqICAgICAgICAgICAgYSB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuVHJhbnNwb3J0fSBvYmplY3QuCiAJICogQHJldHVybiB7QGNvZGUgdGhpc30KIAkgKi8KLQlwcm90ZWN0ZWQgQyBjb25maWd1cmUoZmluYWwgVHJhbnNwb3J0IHRyYW5zcG9ydCkgeworCXByb3RlY3RlZCBDIGNvbmZpZ3VyZShUcmFuc3BvcnQgdHJhbnNwb3J0KSB7CiAJCWlmIChjcmVkZW50aWFsc1Byb3ZpZGVyICE9IG51bGwpCiAJCQl0cmFuc3BvcnQuc2V0Q3JlZGVudGlhbHNQcm92aWRlcihjcmVkZW50aWFsc1Byb3ZpZGVyKTsKIAkJdHJhbnNwb3J0LnNldFRpbWVvdXQodGltZW91dCk7CkBAIC0xNjQsNyArMTY0LDcgQEAgcHJvdGVjdGVkIEMgY29uZmlndXJlKGZpbmFsIFRyYW5zcG9ydCB0cmFuc3BvcnQpIHsKIAkgKiAgICAgICAgICAgIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQuYXBpLlRyYW5zcG9ydENvbW1hbmR9IG9iamVjdC4KIAkgKiBAcmV0dXJuIHtAY29kZSB0aGlzfQogCSAqLwotCXByb3RlY3RlZCBDIGNvbmZpZ3VyZShmaW5hbCBUcmFuc3BvcnRDb21tYW5kIGNoaWxkQ29tbWFuZCkgeworCXByb3RlY3RlZCBDIGNvbmZpZ3VyZShUcmFuc3BvcnRDb21tYW5kIGNoaWxkQ29tbWFuZCkgewogCQljaGlsZENvbW1hbmQuc2V0Q3JlZGVudGlhbHNQcm92aWRlcihjcmVkZW50aWFsc1Byb3ZpZGVyKTsKIAkJY2hpbGRDb21tYW5kLnNldFRpbWVvdXQodGltZW91dCk7CiAJCWNoaWxkQ29tbWFuZC5zZXRUcmFuc3BvcnRDb25maWdDYWxsYmFjayh0cmFuc3BvcnRDb25maWdDYWxsYmFjayk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9lcnJvcnMvQWJvcnRlZEJ5SG9va0V4Y2VwdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvZXJyb3JzL0Fib3J0ZWRCeUhvb2tFeGNlcHRpb24uamF2YQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9lcnJvcnMvRW10cHlDb21taXRFeGNlcHRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL2Vycm9ycy9FbXB0eUNvbW1pdEV4Y2VwdGlvbi5qYXZhCnNpbWlsYXJpdHkgaW5kZXggODglCnJlbmFtZSBmcm9tIG9yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL2Vycm9ycy9FbXRweUNvbW1pdEV4Y2VwdGlvbi5qYXZhCnJlbmFtZSB0byBvcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9lcnJvcnMvRW1wdHlDb21taXRFeGNlcHRpb24uamF2YQppbmRleCBlYTBlNzE4Li44N2UxYTZhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9lcnJvcnMvRW10cHlDb21taXRFeGNlcHRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9lcnJvcnMvRW1wdHlDb21taXRFeGNlcHRpb24uamF2YQpAQCAtNDAsMzAgKzQwLDMwIEBACiAvKioKICAqIEV4Y2VwdGlvbiB0aHJvd24gd2hlbiBhIG5ld2x5IGNyZWF0ZWQgY29tbWl0IGRvZXMgbm90IGNvbnRhaW4gYW55IGNoYW5nZXMKICAqCi0gKiBAc2luY2UgNC4yCisgKiBAc2luY2UgNS4wCiAgKi8KLXB1YmxpYyBjbGFzcyBFbXRweUNvbW1pdEV4Y2VwdGlvbiBleHRlbmRzIEdpdEFQSUV4Y2VwdGlvbiB7IC8vIFRPRE86IENvcnJlY3Qgc3BlbGxpbmcgb2YgdGhpcyBjbGFzcyBuYW1lIGluIDUuMAorcHVibGljIGNsYXNzIEVtcHR5Q29tbWl0RXhjZXB0aW9uIGV4dGVuZHMgR2l0QVBJRXhjZXB0aW9uIHsKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKIAogCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBFbXRweUNvbW1pdEV4Y2VwdGlvbgorCSAqIENvbnN0cnVjdG9yIGZvciBFbXB0eUNvbW1pdEV4Y2VwdGlvbgogCSAqCiAJICogQHBhcmFtIG1lc3NhZ2UKIAkgKiAgICAgICAgICAgIGVycm9yIG1lc3NhZ2UKIAkgKiBAcGFyYW0gY2F1c2UKIAkgKiAgICAgICAgICAgIGEge0BsaW5rIGphdmEubGFuZy5UaHJvd2FibGV9CiAJICovCi0JcHVibGljIEVtdHB5Q29tbWl0RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKKwlwdWJsaWMgRW1wdHlDb21taXRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewogCQlzdXBlcihtZXNzYWdlLCBjYXVzZSk7CiAJfQogCiAJLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEVtdHB5Q29tbWl0RXhjZXB0aW9uLgorCSAqIENvbnN0cnVjdG9yIGZvciBFbXB0eUNvbW1pdEV4Y2VwdGlvbi4KIAkgKgogCSAqIEBwYXJhbSBtZXNzYWdlCiAJICogICAgICAgICAgICBlcnJvciBtZXNzYWdlCiAJICovCi0JcHVibGljIEVtdHB5Q29tbWl0RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7CisJcHVibGljIEVtcHR5Q29tbWl0RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7CiAJCXN1cGVyKG1lc3NhZ2UpOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL2Vycm9ycy9TdGFzaEFwcGx5RmFpbHVyZUV4Y2VwdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvZXJyb3JzL1N0YXNoQXBwbHlGYWlsdXJlRXhjZXB0aW9uLmphdmEKaW5kZXggNTE3YjUxMi4uYjEyYzAzMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvZXJyb3JzL1N0YXNoQXBwbHlGYWlsdXJlRXhjZXB0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvZXJyb3JzL1N0YXNoQXBwbHlGYWlsdXJlRXhjZXB0aW9uLmphdmEKQEAgLTI2LDcgKzI2LDcgQEAgcHVibGljIFN0YXNoQXBwbHlGYWlsdXJlRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKIAkgKiBAcGFyYW0gbWVzc2FnZQogCSAqICAgICAgICAgICAgZXJyb3IgbWVzc2FnZQogCSAqLwotCXB1YmxpYyBTdGFzaEFwcGx5RmFpbHVyZUV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgbWVzc2FnZSkgeworCXB1YmxpYyBTdGFzaEFwcGx5RmFpbHVyZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewogCQlzdXBlcihtZXNzYWdlKTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYmxhbWUvUmV2ZXJzZVdhbGsuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYmxhbWUvUmV2ZXJzZVdhbGsuamF2YQppbmRleCAyZWIzMTNmLi4xMDY3Mzc4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2JsYW1lL1JldmVyc2VXYWxrLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9ibGFtZS9SZXZlcnNlV2Fsay5qYXZhCkBAIC0xMDgsNyArMTA4LDcgQEAgaW50IGdldENoaWxkQ291bnQoKSB7CiAJCQlyZXR1cm4gY2hpbGRyZW4ubGVuZ3RoOwogCQl9CiAKLQkJUmV2ZXJzZUNvbW1pdCBnZXRDaGlsZChmaW5hbCBpbnQgbnRoKSB7CisJCVJldmVyc2VDb21taXQgZ2V0Q2hpbGQoaW50IG50aCkgewogCQkJcmV0dXJuIGNoaWxkcmVuW250aF07CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvRGlmZkNvbmZpZy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL0RpZmZDb25maWcuamF2YQppbmRleCAwNjNjZWZmLi4yMWRjYTZiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvRGlmZkNvbmZpZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9EaWZmQ29uZmlnLmphdmEKQEAgLTc2LDcgKzc2LDcgQEAgcHVibGljIHN0YXRpYyBlbnVtIFJlbmFtZURldGVjdGlvblR5cGUgewogCiAJcHJpdmF0ZSBmaW5hbCBpbnQgcmVuYW1lTGltaXQ7CiAKLQlwcml2YXRlIERpZmZDb25maWcoZmluYWwgQ29uZmlnIHJjKSB7CisJcHJpdmF0ZSBEaWZmQ29uZmlnKENvbmZpZyByYykgewogCQlub1ByZWZpeCA9IHJjLmdldEJvb2xlYW4oQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19ESUZGX1NFQ1RJT04sCiAJCQkJQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfTk9QUkVGSVgsIGZhbHNlKTsKIAkJcmVuYW1lRGV0ZWN0aW9uVHlwZSA9IHBhcnNlUmVuYW1lRGV0ZWN0aW9uVHlwZShyYy5nZXRTdHJpbmcoCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvRGlmZkZvcm1hdHRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL0RpZmZGb3JtYXR0ZXIuamF2YQppbmRleCAyZTI5YjgxLi43YWFhNTAwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvRGlmZkZvcm1hdHRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9EaWZmRm9ybWF0dGVyLmphdmEKQEAgLTIyMiw3ICsyMjIsNyBAQCBwcml2YXRlIHZvaWQgc2V0UmVhZGVyKE9iamVjdFJlYWRlciByZWFkZXIsIENvbmZpZyBjZmcsIGJvb2xlYW4gY2xvc2VSZWFkZXIpIHsKIAkgKiAgICAgICAgICAgIG1vZGlmaWNhdGlvbiBhbmQgYWZ0ZXIgdGhlIGxhc3QgbW9kaWZpY2F0aW9uIHdpdGhpbiBhIGh1bmsgb2YKIAkgKiAgICAgICAgICAgIHRoZSBtb2RpZmllZCBmaWxlLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRleHQoZmluYWwgaW50IGxpbmVDb3VudCkgeworCXB1YmxpYyB2b2lkIHNldENvbnRleHQoaW50IGxpbmVDb3VudCkgewogCQlpZiAobGluZUNvdW50IDwgMCkKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCiAJCQkJCUpHaXRUZXh0LmdldCgpLmNvbnRleHRNdXN0QmVOb25OZWdhdGl2ZSk7CkBAIC0yMzUsNyArMjM1LDcgQEAgcHVibGljIHZvaWQgc2V0Q29udGV4dChmaW5hbCBpbnQgbGluZUNvdW50KSB7CiAJICogQHBhcmFtIGNvdW50CiAJICogICAgICAgICAgICBudW1iZXIgb2YgZGlnaXRzIHRvIHNob3cgaW4gYW4gT2JqZWN0SWQuCiAJICovCi0JcHVibGljIHZvaWQgc2V0QWJicmV2aWF0aW9uTGVuZ3RoKGZpbmFsIGludCBjb3VudCkgeworCXB1YmxpYyB2b2lkIHNldEFiYnJldmlhdGlvbkxlbmd0aChpbnQgY291bnQpIHsKIAkJaWYgKGNvdW50IDwgMCkKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCiAJCQkJCUpHaXRUZXh0LmdldCgpLmFiYnJldmlhdGlvbkxlbmd0aE11c3RCZU5vbk5lZ2F0aXZlKTsKQEAgLTc0Miw3ICs3NDIsNyBAQCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcXVvdGVQYXRoKFN0cmluZyBuYW1lKSB7CiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgd3JpdGluZyB0byB0aGUgc3VwcGxpZWQgc3RyZWFtIGZhaWxlZC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBmb3JtYXQoZmluYWwgRmlsZUhlYWRlciBoZWFkLCBmaW5hbCBSYXdUZXh0IGEsIGZpbmFsIFJhd1RleHQgYikKKwlwdWJsaWMgdm9pZCBmb3JtYXQoRmlsZUhlYWRlciBoZWFkLCBSYXdUZXh0IGEsIFJhd1RleHQgYikKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCS8vIFJldXNlIHRoZSBleGlzdGluZyBGaWxlSGVhZGVyIGFzLWlzIGJ5IGJsaW5kbHkgY29weWluZyBpdHMKIAkJLy8gaGVhZGVyIGxpbmVzLCBidXQgYXZvaWRpbmcgaXRzIGh1bmtzLiBJbnN0ZWFkIHdlIHJlY3JlYXRlCkBAIC03NjgsNyArNzY4LDcgQEAgcHVibGljIHZvaWQgZm9ybWF0KGZpbmFsIEZpbGVIZWFkZXIgaGVhZCwgZmluYWwgUmF3VGV4dCBhLCBmaW5hbCBSYXdUZXh0IGIpCiAJICogICAgICAgICAgICB0aGUgdGV4dCBCIHdoaWNoIHdhcyBjb21wYXJlZAogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqLwotCXB1YmxpYyB2b2lkIGZvcm1hdChmaW5hbCBFZGl0TGlzdCBlZGl0cywgZmluYWwgUmF3VGV4dCBhLCBmaW5hbCBSYXdUZXh0IGIpCisJcHVibGljIHZvaWQgZm9ybWF0KEVkaXRMaXN0IGVkaXRzLCBSYXdUZXh0IGEsIFJhd1RleHQgYikKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZvciAoaW50IGN1cklkeCA9IDA7IGN1cklkeCA8IGVkaXRzLnNpemUoKTspIHsKIAkJCUVkaXQgY3VyRWRpdCA9IGVkaXRzLmdldChjdXJJZHgpOwpAQCAtODE2LDEyICs4MTYsMTIgQEAgcHVibGljIHZvaWQgZm9ybWF0KGZpbmFsIEVkaXRMaXN0IGVkaXRzLCBmaW5hbCBSYXdUZXh0IGEsIGZpbmFsIFJhd1RleHQgYikKIAkgKiAgICAgICAgICAgIHRoZSBsaW5lIG51bWJlciB3aXRoaW4gdGV4dAogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqLwotCXByb3RlY3RlZCB2b2lkIHdyaXRlQ29udGV4dExpbmUoZmluYWwgUmF3VGV4dCB0ZXh0LCBmaW5hbCBpbnQgbGluZSkKKwlwcm90ZWN0ZWQgdm9pZCB3cml0ZUNvbnRleHRMaW5lKFJhd1RleHQgdGV4dCwgaW50IGxpbmUpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQl3cml0ZUxpbmUoJyAnLCB0ZXh0LCBsaW5lKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRW5kT2ZMaW5lTWlzc2luZyhmaW5hbCBSYXdUZXh0IHRleHQsIGZpbmFsIGludCBsaW5lKSB7CisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0VuZE9mTGluZU1pc3NpbmcoUmF3VGV4dCB0ZXh0LCBpbnQgbGluZSkgewogCQlyZXR1cm4gbGluZSArIDEgPT0gdGV4dC5zaXplKCkgJiYgdGV4dC5pc01pc3NpbmdOZXdsaW5lQXRFbmQoKTsKIAl9CiAKQEAgLTgzNCw3ICs4MzQsNyBAQCBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRW5kT2ZMaW5lTWlzc2luZyhmaW5hbCBSYXdUZXh0IHRleHQsIGZpbmFsIGludCBsaW5lKSB7CiAJICogICAgICAgICAgICB0aGUgbGluZSBudW1iZXIgd2l0aGluIHRleHQKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB3cml0ZUFkZGVkTGluZShmaW5hbCBSYXdUZXh0IHRleHQsIGZpbmFsIGludCBsaW5lKQorCXByb3RlY3RlZCB2b2lkIHdyaXRlQWRkZWRMaW5lKFJhd1RleHQgdGV4dCwgaW50IGxpbmUpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQl3cml0ZUxpbmUoJysnLCB0ZXh0LCBsaW5lKTsKIAl9CkBAIC04NDgsNyArODQ4LDcgQEAgcHJvdGVjdGVkIHZvaWQgd3JpdGVBZGRlZExpbmUoZmluYWwgUmF3VGV4dCB0ZXh0LCBmaW5hbCBpbnQgbGluZSkKIAkgKiAgICAgICAgICAgIHRoZSBsaW5lIG51bWJlciB3aXRoaW4gdGV4dAogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqLwotCXByb3RlY3RlZCB2b2lkIHdyaXRlUmVtb3ZlZExpbmUoZmluYWwgUmF3VGV4dCB0ZXh0LCBmaW5hbCBpbnQgbGluZSkKKwlwcm90ZWN0ZWQgdm9pZCB3cml0ZVJlbW92ZWRMaW5lKFJhd1RleHQgdGV4dCwgaW50IGxpbmUpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQl3cml0ZUxpbmUoJy0nLCB0ZXh0LCBsaW5lKTsKIAl9CkBAIC04NzgsNyArODc4LDcgQEAgcHJvdGVjdGVkIHZvaWQgd3JpdGVIdW5rSGVhZGVyKGludCBhU3RhcnRMaW5lLCBpbnQgYUVuZExpbmUsCiAJCW91dC53cml0ZSgnXG4nKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgd3JpdGVSYW5nZShmaW5hbCBjaGFyIHByZWZpeCwgZmluYWwgaW50IGJlZ2luLCBmaW5hbCBpbnQgY250KQorCXByaXZhdGUgdm9pZCB3cml0ZVJhbmdlKGNoYXIgcHJlZml4LCBpbnQgYmVnaW4sIGludCBjbnQpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlvdXQud3JpdGUoJyAnKTsKIAkJb3V0LndyaXRlKHByZWZpeCk7CkBAIC0xMjEzLDcgKzEyMTMsNyBAQCBwcml2YXRlIHZvaWQgZm9ybWF0T2xkTmV3UGF0aHMoQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG8sIERpZmZFbnRyeSBlbnQpCiAJCW8ud3JpdGUoZW5jb2RlKCIrKysgIiArIG5ld3AgKyAiXG4iKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCX0KIAotCXByaXZhdGUgaW50IGZpbmRDb21iaW5lZEVuZChmaW5hbCBMaXN0PEVkaXQ+IGVkaXRzLCBmaW5hbCBpbnQgaSkgeworCXByaXZhdGUgaW50IGZpbmRDb21iaW5lZEVuZChMaXN0PEVkaXQ+IGVkaXRzLCBpbnQgaSkgewogCQlpbnQgZW5kID0gaSArIDE7CiAJCXdoaWxlIChlbmQgPCBlZGl0cy5zaXplKCkKIAkJCQkmJiAoY29tYmluZUEoZWRpdHMsIGVuZCkgfHwgY29tYmluZUIoZWRpdHMsIGVuZCkpKQpAQCAtMTIyMSwxNSArMTIyMSwxNSBAQCBwcml2YXRlIGludCBmaW5kQ29tYmluZWRFbmQoZmluYWwgTGlzdDxFZGl0PiBlZGl0cywgZmluYWwgaW50IGkpIHsKIAkJcmV0dXJuIGVuZCAtIDE7CiAJfQogCi0JcHJpdmF0ZSBib29sZWFuIGNvbWJpbmVBKGZpbmFsIExpc3Q8RWRpdD4gZSwgZmluYWwgaW50IGkpIHsKKwlwcml2YXRlIGJvb2xlYW4gY29tYmluZUEoTGlzdDxFZGl0PiBlLCBpbnQgaSkgewogCQlyZXR1cm4gZS5nZXQoaSkuZ2V0QmVnaW5BKCkgLSBlLmdldChpIC0gMSkuZ2V0RW5kQSgpIDw9IDIgKiBjb250ZXh0OwogCX0KIAotCXByaXZhdGUgYm9vbGVhbiBjb21iaW5lQihmaW5hbCBMaXN0PEVkaXQ+IGUsIGZpbmFsIGludCBpKSB7CisJcHJpdmF0ZSBib29sZWFuIGNvbWJpbmVCKExpc3Q8RWRpdD4gZSwgaW50IGkpIHsKIAkJcmV0dXJuIGUuZ2V0KGkpLmdldEJlZ2luQigpIC0gZS5nZXQoaSAtIDEpLmdldEVuZEIoKSA8PSAyICogY29udGV4dDsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGVuZChmaW5hbCBFZGl0IGVkaXQsIGZpbmFsIGludCBhLCBmaW5hbCBpbnQgYikgeworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZW5kKEVkaXQgZWRpdCwgaW50IGEsIGludCBiKSB7CiAJCXJldHVybiBlZGl0LmdldEVuZEEoKSA8PSBhICYmIGVkaXQuZ2V0RW5kQigpIDw9IGI7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL0VkaXQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9FZGl0LmphdmEKaW5kZXggNzc1ZDExYS4uNWM4NzZlOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL0VkaXQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvRWRpdC5qYXZhCkBAIC05NCw3ICs5NCw3IEBAIHB1YmxpYyBzdGF0aWMgZW51bSBUeXBlIHsKIAkgKiBAcGFyYW0gYnMKIAkgKiAgICAgICAgICAgIGJlZ2luQjogc3RhcnQgYW5kIGVuZCBvZiByZWdpb24gaW4gc2VxdWVuY2UgQjsgMCBiYXNlZC4KIAkgKi8KLQlwdWJsaWMgRWRpdChmaW5hbCBpbnQgYXMsIGZpbmFsIGludCBicykgeworCXB1YmxpYyBFZGl0KGludCBhcywgaW50IGJzKSB7CiAJCXRoaXMoYXMsIGFzLCBicywgYnMpOwogCX0KIApAQCAtMTEwLDcgKzExMCw3IEBAIHB1YmxpYyBFZGl0KGZpbmFsIGludCBhcywgZmluYWwgaW50IGJzKSB7CiAJICogQHBhcmFtIGJlCiAJICogICAgICAgICAgICBlbmRCOiBlbmQgb2YgcmVnaW9uIGluIHNlcXVlbmNlIEI7IG11c3QgYmUgJmd0OyA9IGJzLgogCSAqLwotCXB1YmxpYyBFZGl0KGZpbmFsIGludCBhcywgZmluYWwgaW50IGFlLCBmaW5hbCBpbnQgYnMsIGZpbmFsIGludCBiZSkgeworCXB1YmxpYyBFZGl0KGludCBhcywgaW50IGFlLCBpbnQgYnMsIGludCBiZSkgewogCQliZWdpbkEgPSBhczsKIAkJZW5kQSA9IGFlOwogCkBAIC0yNzksNyArMjc5LDcgQEAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIE9iamVjdCBvKSB7CisJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CiAJCWlmIChvIGluc3RhbmNlb2YgRWRpdCkgewogCQkJZmluYWwgRWRpdCBlID0gKEVkaXQpIG87CiAJCQlyZXR1cm4gdGhpcy5iZWdpbkEgPT0gZS5iZWdpbkEgJiYgdGhpcy5lbmRBID09IGUuZW5kQQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL0hpc3RvZ3JhbURpZmZJbmRleC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL0hpc3RvZ3JhbURpZmZJbmRleC5qYXZhCmluZGV4IDA0Yzc5ZmMuLjNmODEzZDggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9IaXN0b2dyYW1EaWZmSW5kZXguamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvSGlzdG9ncmFtRGlmZkluZGV4LmphdmEKQEAgLTIzMCw3ICsyMzAsNyBAQCBwcml2YXRlIGJvb2xlYW4gc2NhbkEoKSB7CiAJCXJldHVybiB0cnVlOwogCX0KIAotCXByaXZhdGUgaW50IHRyeUxvbmdlc3RDb21tb25TZXF1ZW5jZShmaW5hbCBpbnQgYlB0cikgeworCXByaXZhdGUgaW50IHRyeUxvbmdlc3RDb21tb25TZXF1ZW5jZShpbnQgYlB0cikgewogCQlpbnQgYk5leHQgPSBiUHRyICsgMTsKIAkJaW50IHJJZHggPSB0YWJsZVtoYXNoKGIsIGJQdHIpXTsKIAkJZm9yIChsb25nIHJlYzsgcklkeCAhPSAwOyBySWR4ID0gcmVjTmV4dChyZWMpKSB7CkBAIC0zMjgsNyArMzI4LDcgQEAgcHJpdmF0ZSBzdGF0aWMgaW50IHJlY0NudChsb25nIHJlYykgewogCQlyZXR1cm4gKChpbnQpIHJlYykgJiBSRUNfQ05UX01BU0s7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgaW50IHRhYmxlQml0cyhmaW5hbCBpbnQgc3opIHsKKwlwcml2YXRlIHN0YXRpYyBpbnQgdGFibGVCaXRzKGludCBzeikgewogCQlpbnQgYml0cyA9IDMxIC0gSW50ZWdlci5udW1iZXJPZkxlYWRpbmdaZXJvcyhzeik7CiAJCWlmIChiaXRzID09IDApCiAJCQliaXRzID0gMTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9NeWVyc0RpZmYuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9NeWVyc0RpZmYuamF2YQppbmRleCA2NDZmMjY0Li5jYWFmZmUzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvTXllcnNEaWZmLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL015ZXJzRGlmZi5qYXZhCkBAIC0zNTksNyArMzU5LDcgQEAgdm9pZCBpbml0aWFsaXplKGludCBrLCBpbnQgeCwgaW50IG1pbkssIGludCBtYXhLKSB7CiAJCQlhYnN0cmFjdCBpbnQgZ2V0TGVmdChpbnQgeCk7CiAJCQlhYnN0cmFjdCBpbnQgZ2V0UmlnaHQoaW50IHgpOwogCQkJYWJzdHJhY3QgYm9vbGVhbiBpc0JldHRlcihpbnQgbGVmdCwgaW50IHJpZ2h0KTsKLQkJCWFic3RyYWN0IHZvaWQgYWRqdXN0TWluTWF4SyhmaW5hbCBpbnQgaywgZmluYWwgaW50IHgpOworCQkJYWJzdHJhY3Qgdm9pZCBhZGp1c3RNaW5NYXhLKGludCBrLCBpbnQgeCk7CiAJCQlhYnN0cmFjdCBib29sZWFuIG1lZXRzKGludCBkLCBpbnQgaywgaW50IHgsIGxvbmcgc25ha2UpOwogCiAJCQlmaW5hbCBsb25nIG5ld1NuYWtlKGludCBrLCBpbnQgeCkgewpAQCAtNDY5LDIyICs0NjksMjIgQEAgZmluYWwgaW50IHNuYWtlKGludCBrLCBpbnQgeCkgewogCQkJfQogCiAJCQlAT3ZlcnJpZGUKLQkJCWZpbmFsIGludCBnZXRMZWZ0KGZpbmFsIGludCB4KSB7CisJCQlmaW5hbCBpbnQgZ2V0TGVmdChpbnQgeCkgewogCQkJCXJldHVybiB4OwogCQkJfQogCiAJCQlAT3ZlcnJpZGUKLQkJCWZpbmFsIGludCBnZXRSaWdodChmaW5hbCBpbnQgeCkgeworCQkJZmluYWwgaW50IGdldFJpZ2h0KGludCB4KSB7CiAJCQkJcmV0dXJuIHggKyAxOwogCQkJfQogCiAJCQlAT3ZlcnJpZGUKLQkJCWZpbmFsIGJvb2xlYW4gaXNCZXR0ZXIoZmluYWwgaW50IGxlZnQsIGZpbmFsIGludCByaWdodCkgeworCQkJZmluYWwgYm9vbGVhbiBpc0JldHRlcihpbnQgbGVmdCwgaW50IHJpZ2h0KSB7CiAJCQkJcmV0dXJuIGxlZnQgPiByaWdodDsKIAkJCX0KIAogCQkJQE92ZXJyaWRlCi0JCQlmaW5hbCB2b2lkIGFkanVzdE1pbk1heEsoZmluYWwgaW50IGssIGZpbmFsIGludCB4KSB7CisJCQlmaW5hbCB2b2lkIGFkanVzdE1pbk1heEsoaW50IGssIGludCB4KSB7CiAJCQkJaWYgKHggPj0gZW5kQSB8fCBrICsgeCA+PSBlbmRCKSB7CiAJCQkJCWlmIChrID4gYmFja3dhcmQubWlkZGxlSykKIAkJCQkJCW1heEsgPSBrOwpAQCAtNTE3LDIyICs1MTcsMjIgQEAgZmluYWwgaW50IHNuYWtlKGludCBrLCBpbnQgeCkgewogCQkJfQogCiAJCQlAT3ZlcnJpZGUKLQkJCWZpbmFsIGludCBnZXRMZWZ0KGZpbmFsIGludCB4KSB7CisJCQlmaW5hbCBpbnQgZ2V0TGVmdChpbnQgeCkgewogCQkJCXJldHVybiB4IC0gMTsKIAkJCX0KIAogCQkJQE92ZXJyaWRlCi0JCQlmaW5hbCBpbnQgZ2V0UmlnaHQoZmluYWwgaW50IHgpIHsKKwkJCWZpbmFsIGludCBnZXRSaWdodChpbnQgeCkgewogCQkJCXJldHVybiB4OwogCQkJfQogCiAJCQlAT3ZlcnJpZGUKLQkJCWZpbmFsIGJvb2xlYW4gaXNCZXR0ZXIoZmluYWwgaW50IGxlZnQsIGZpbmFsIGludCByaWdodCkgeworCQkJZmluYWwgYm9vbGVhbiBpc0JldHRlcihpbnQgbGVmdCwgaW50IHJpZ2h0KSB7CiAJCQkJcmV0dXJuIGxlZnQgPCByaWdodDsKIAkJCX0KIAogCQkJQE92ZXJyaWRlCi0JCQlmaW5hbCB2b2lkIGFkanVzdE1pbk1heEsoZmluYWwgaW50IGssIGZpbmFsIGludCB4KSB7CisJCQlmaW5hbCB2b2lkIGFkanVzdE1pbk1heEsoaW50IGssIGludCB4KSB7CiAJCQkJaWYgKHggPD0gYmVnaW5BIHx8IGsgKyB4IDw9IGJlZ2luQikgewogCQkJCQlpZiAoayA+IGZvcndhcmQubWlkZGxlSykKIAkJCQkJCW1heEsgPSBrOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL1Jhd1RleHQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9SYXdUZXh0LmphdmEKaW5kZXggZWM4OGNlNC4uYmQ0MWQ5MCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL1Jhd1RleHQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvUmF3VGV4dC5qYXZhCkBAIC04OCwxMiArODgsMjkgQEAgcHVibGljIGNsYXNzIFJhd1RleHQgZXh0ZW5kcyBTZXF1ZW5jZSB7CiAJICogVGhlIGVudGlyZSBhcnJheSAoaW5kZXhlcyAwIHRocm91Z2ggbGVuZ3RoLTEpIGlzIHVzZWQgYXMgdGhlIGNvbnRlbnQuCiAJICoKIAkgKiBAcGFyYW0gaW5wdXQKLQkgKiAgICAgICAgICAgIHRoZSBjb250ZW50IGFycmF5LiBUaGUgYXJyYXkgaXMgbmV2ZXIgbW9kaWZpZWQsIHNvIHBhc3NpbmcKLQkgKiAgICAgICAgICAgIHRocm91Z2ggY2FjaGVkIGFycmF5cyBpcyBzYWZlLgorCSAqICAgICAgICAgICAgdGhlIGNvbnRlbnQgYXJyYXkuIFRoZSBvYmplY3QgcmV0YWlucyBhIHJlZmVyZW5jZSB0byB0aGlzCisJICogICAgICAgICAgICBhcnJheSwgc28gaXQgc2hvdWxkIGJlIGltbXV0YWJsZS4KIAkgKi8KLQlwdWJsaWMgUmF3VGV4dChmaW5hbCBieXRlW10gaW5wdXQpIHsKKwlwdWJsaWMgUmF3VGV4dChieXRlW10gaW5wdXQpIHsKKwkJdGhpcyhpbnB1dCwgUmF3UGFyc2VVdGlscy5saW5lTWFwKGlucHV0LCAwLCBpbnB1dC5sZW5ndGgpKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGUgYSBuZXcgc2VxdWVuY2UgZnJvbSB0aGUgZXhpc3RpbmcgY29udGVudCBieXRlIGFycmF5IGFuZCB0aGUgbGluZQorCSAqIG1hcCBpbmRpY2F0aW5nIGxpbmUgYm91bmRhcmllcy4KKwkgKgorCSAqIEBwYXJhbSBpbnB1dAorCSAqICAgICAgICAgICAgdGhlIGNvbnRlbnQgYXJyYXkuIFRoZSBvYmplY3QgcmV0YWlucyBhIHJlZmVyZW5jZSB0byB0aGlzCisJICogICAgICAgICAgICBhcnJheSwgc28gaXQgc2hvdWxkIGJlIGltbXV0YWJsZS4KKwkgKiBAcGFyYW0gbGluZU1hcAorCSAqICAgICAgICAgICAgYW4gYXJyYXkgd2l0aCAxLWJhc2VkIG9mZnNldHMgZm9yIHRoZSBzdGFydCBvZiBlYWNoIGxpbmUuCisJICogICAgICAgICAgICBUaGUgZmlyc3QgYW5kIGxhc3QgZW50cmllcyBzaG91bGQgYmUge0BsaW5rIEludGVnZXIjTUlOX1ZBTFVFfQorCSAqICAgICAgICAgICAgYW5kIGFuIG9mZnNldCBvbmUgcGFzdCB0aGUgZW5kIG9mIHRoZSBsYXN0IGxpbmUsIHJlc3BlY3RpdmVseS4KKwkgKiBAc2luY2UgNS4wCisJICovCisJcHVibGljIFJhd1RleHQoYnl0ZVtdIGlucHV0LCBJbnRMaXN0IGxpbmVNYXApIHsKIAkJY29udGVudCA9IGlucHV0OwotCQlsaW5lcyA9IFJhd1BhcnNlVXRpbHMubGluZU1hcChjb250ZW50LCAwLCBjb250ZW50Lmxlbmd0aCk7CisJCWxpbmVzID0gbGluZU1hcDsKIAl9CiAKIAkvKioKQEAgLTE0Nyw3ICsxNjQsNyBAQCBwdWJsaWMgaW50IHNpemUoKSB7CiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgdGhlIHN0cmVhbSB3cml0ZSBvcGVyYXRpb24gZmFpbGVkLgogCSAqLwotCXB1YmxpYyB2b2lkIHdyaXRlTGluZShmaW5hbCBPdXRwdXRTdHJlYW0gb3V0LCBmaW5hbCBpbnQgaSkKKwlwdWJsaWMgdm9pZCB3cml0ZUxpbmUoT3V0cHV0U3RyZWFtIG91dCwgaW50IGkpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlpbnQgc3RhcnQgPSBnZXRTdGFydChpKTsKIAkJaW50IGVuZCA9IGdldEVuZChpKTsKQEAgLTIyMSwxMSArMjM4LDExIEBAIHByb3RlY3RlZCBTdHJpbmcgZGVjb2RlKGludCBzdGFydCwgaW50IGVuZCkgewogCQlyZXR1cm4gUmF3UGFyc2VVdGlscy5kZWNvZGUoY29udGVudCwgc3RhcnQsIGVuZCk7CiAJfQogCi0JcHJpdmF0ZSBpbnQgZ2V0U3RhcnQoZmluYWwgaW50IGkpIHsKKwlwcml2YXRlIGludCBnZXRTdGFydChpbnQgaSkgewogCQlyZXR1cm4gbGluZXMuZ2V0KGkgKyAxKTsKIAl9CiAKLQlwcml2YXRlIGludCBnZXRFbmQoZmluYWwgaW50IGkpIHsKKwlwcml2YXRlIGludCBnZXRFbmQoaW50IGkpIHsKIAkJcmV0dXJuIGxpbmVzLmdldChpICsgMik7CiAJfQogCkBAIC0zMjUsNyArMzQyLDggQEAgcHVibGljIFN0cmluZyBnZXRMaW5lRGVsaW1pdGVyKCkgewogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIGlmIHRoZSBpbnB1dCBjb3VsZCBub3QgYmUgcmVhZC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIFJhd1RleHQgbG9hZChPYmplY3RMb2FkZXIgbGRyLCBpbnQgdGhyZXNob2xkKSB0aHJvd3MgSU9FeGNlcHRpb24sIEJpbmFyeUJsb2JFeGNlcHRpb24geworCXB1YmxpYyBzdGF0aWMgUmF3VGV4dCBsb2FkKE9iamVjdExvYWRlciBsZHIsIGludCB0aHJlc2hvbGQpCisJCQl0aHJvd3MgSU9FeGNlcHRpb24sIEJpbmFyeUJsb2JFeGNlcHRpb24gewogCQlsb25nIHN6ID0gbGRyLmdldFNpemUoKTsKIAogCQlpZiAoc3ogPiB0aHJlc2hvbGQpIHsKQEAgLTM2OSw3ICszODcsNyBAQCBwdWJsaWMgc3RhdGljIFJhd1RleHQgbG9hZChPYmplY3RMb2FkZXIgbGRyLCBpbnQgdGhyZXNob2xkKSB0aHJvd3MgSU9FeGNlcHRpb24sCiAKIAkJCVN5c3RlbS5hcnJheWNvcHkoaGVhZCwgMCwgZGF0YSwgMCwgaGVhZC5sZW5ndGgpOwogCQkJSU8ucmVhZEZ1bGx5KHN0cmVhbSwgZGF0YSwgb2ZmLCAoaW50KSAoc3otb2ZmKSk7Ci0JCQlyZXR1cm4gbmV3IFJhd1RleHQoZGF0YSk7CisJCQlyZXR1cm4gbmV3IFJhd1RleHQoZGF0YSwgUmF3UGFyc2VVdGlscy5saW5lTWFwT3JCaW5hcnkoZGF0YSwgMCwgKGludCkgc3opKTsKIAkJfQogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9SYXdUZXh0Q29tcGFyYXRvci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL1Jhd1RleHRDb21wYXJhdG9yLmphdmEKaW5kZXggZWQyZWViYi4uMWU2OGMyZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL1Jhd1RleHRDb21wYXJhdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL1Jhd1RleHRDb21wYXJhdG9yLmphdmEKQEAgLTc3LDcgKzc3LDcgQEAgcHVibGljIGJvb2xlYW4gZXF1YWxzKFJhd1RleHQgYSwgaW50IGFpLCBSYXdUZXh0IGIsIGludCBiaSkgewogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBpbnQgaGFzaFJlZ2lvbihmaW5hbCBieXRlW10gcmF3LCBpbnQgcHRyLCBmaW5hbCBpbnQgZW5kKSB7CisJCXByb3RlY3RlZCBpbnQgaGFzaFJlZ2lvbihieXRlW10gcmF3LCBpbnQgcHRyLCBpbnQgZW5kKSB7CiAJCQlpbnQgaGFzaCA9IDUzODE7CiAJCQlmb3IgKDsgcHRyIDwgZW5kOyBwdHIrKykKIAkJCQloYXNoID0gKChoYXNoIDw8IDUpICsgaGFzaCkgKyAocmF3W3B0cl0gJiAweGZmKTsKQEAgLTE2NCw3ICsxNjQsNyBAQCBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoUmF3VGV4dCBhLCBpbnQgYWksIFJhd1RleHQgYiwgaW50IGJpKSB7CiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIGludCBoYXNoUmVnaW9uKGZpbmFsIGJ5dGVbXSByYXcsIGludCBwdHIsIGludCBlbmQpIHsKKwkJcHJvdGVjdGVkIGludCBoYXNoUmVnaW9uKGJ5dGVbXSByYXcsIGludCBwdHIsIGludCBlbmQpIHsKIAkJCWludCBoYXNoID0gNTM4MTsKIAkJCXB0ciA9IHRyaW1MZWFkaW5nV2hpdGVzcGFjZShyYXcsIHB0ciwgZW5kKTsKIAkJCWZvciAoOyBwdHIgPCBlbmQ7IHB0cisrKQpAQCAtMTk5LDcgKzE5OSw3IEBAIHB1YmxpYyBib29sZWFuIGVxdWFscyhSYXdUZXh0IGEsIGludCBhaSwgUmF3VGV4dCBiLCBpbnQgYmkpIHsKIAkJfQogCiAJCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgaW50IGhhc2hSZWdpb24oZmluYWwgYnl0ZVtdIHJhdywgaW50IHB0ciwgaW50IGVuZCkgeworCQlwcm90ZWN0ZWQgaW50IGhhc2hSZWdpb24oYnl0ZVtdIHJhdywgaW50IHB0ciwgaW50IGVuZCkgewogCQkJaW50IGhhc2ggPSA1MzgxOwogCQkJZW5kID0gdHJpbVRyYWlsaW5nV2hpdGVzcGFjZShyYXcsIHB0ciwgZW5kKTsKIAkJCWZvciAoOyBwdHIgPCBlbmQ7IHB0cisrKQpAQCAtMjQ0LDcgKzI0NCw3IEBAIHB1YmxpYyBib29sZWFuIGVxdWFscyhSYXdUZXh0IGEsIGludCBhaSwgUmF3VGV4dCBiLCBpbnQgYmkpIHsKIAkJfQogCiAJCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgaW50IGhhc2hSZWdpb24oZmluYWwgYnl0ZVtdIHJhdywgaW50IHB0ciwgaW50IGVuZCkgeworCQlwcm90ZWN0ZWQgaW50IGhhc2hSZWdpb24oYnl0ZVtdIHJhdywgaW50IHB0ciwgaW50IGVuZCkgewogCQkJaW50IGhhc2ggPSA1MzgxOwogCQkJZW5kID0gdHJpbVRyYWlsaW5nV2hpdGVzcGFjZShyYXcsIHB0ciwgZW5kKTsKIAkJCXdoaWxlIChwdHIgPCBlbmQpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9TaW1pbGFyaXR5SW5kZXguamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9TaW1pbGFyaXR5SW5kZXguamF2YQppbmRleCA4YjRkMmVjLi41ODk3ZmZiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvU2ltaWxhcml0eUluZGV4LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL1NpbWlsYXJpdHlJbmRleC5qYXZhCkBAIC0xNDcsMjMgKzE0NywxNyBAQCB2b2lkIGhhc2goT2JqZWN0TG9hZGVyIG9iaikgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIElPRXhjZXB0aW9uLAogCiAJcHJpdmF0ZSB2b2lkIGhhc2hMYXJnZU9iamVjdChPYmplY3RMb2FkZXIgb2JqKSB0aHJvd3MgSU9FeGNlcHRpb24sCiAJCQlUYWJsZUZ1bGxFeGNlcHRpb24gewotCQlPYmplY3RTdHJlYW0gaW4xID0gb2JqLm9wZW5TdHJlYW0oKTsKIAkJYm9vbGVhbiB0ZXh0OwotCQl0cnkgeworCQl0cnkgKE9iamVjdFN0cmVhbSBpbjEgPSBvYmoub3BlblN0cmVhbSgpKSB7CiAJCQl0ZXh0ID0gIVJhd1RleHQuaXNCaW5hcnkoaW4xKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWluMS5jbG9zZSgpOwogCQl9CiAKLQkJT2JqZWN0U3RyZWFtIGluMiA9IG9iai5vcGVuU3RyZWFtKCk7Ci0JCXRyeSB7CisJCXRyeSAoT2JqZWN0U3RyZWFtIGluMiA9IG9iai5vcGVuU3RyZWFtKCkpIHsKIAkJCWhhc2goaW4yLCBpbjIuZ2V0U2l6ZSgpLCB0ZXh0KTsKLQkJfSBmaW5hbGx5IHsKLQkJCWluMi5jbG9zZSgpOwogCQl9CiAJfQogCi0Jdm9pZCBoYXNoKGJ5dGVbXSByYXcsIGludCBwdHIsIGZpbmFsIGludCBlbmQpIHRocm93cyBUYWJsZUZ1bGxFeGNlcHRpb24geworCXZvaWQgaGFzaChieXRlW10gcmF3LCBpbnQgcHRyLCBpbnQgZW5kKSB0aHJvd3MgVGFibGVGdWxsRXhjZXB0aW9uIHsKIAkJZmluYWwgYm9vbGVhbiB0ZXh0ID0gIVJhd1RleHQuaXNCaW5hcnkocmF3KTsKIAkJaGFzaGVkQ250ID0gMDsKIAkJd2hpbGUgKHB0ciA8IGVuZCkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9CYXNlRGlyQ2FjaGVFZGl0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvQmFzZURpckNhY2hlRWRpdG9yLmphdmEKaW5kZXggMDIyOGY0ZC4uYWEyMjlmNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9CYXNlRGlyQ2FjaGVFZGl0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0Jhc2VEaXJDYWNoZUVkaXRvci5qYXZhCkBAIC04NSw3ICs4NSw3IEBAIGFic3RyYWN0IGNsYXNzIEJhc2VEaXJDYWNoZUVkaXRvciB7CiAJICogICAgICAgICAgICBlc3RpbWF0ZWQgbnVtYmVyIG9mIGVudHJpZXMgdGhlIGVkaXRvciB3aWxsIGhhdmUgdXBvbgogCSAqICAgICAgICAgICAgY29tcGxldGlvbi4gVGhpcyBzaXplcyB0aGUgaW5pdGlhbCBlbnRyeSB0YWJsZS4KIAkgKi8KLQlwcm90ZWN0ZWQgQmFzZURpckNhY2hlRWRpdG9yKGZpbmFsIERpckNhY2hlIGRjLCBmaW5hbCBpbnQgZWNudCkgeworCXByb3RlY3RlZCBCYXNlRGlyQ2FjaGVFZGl0b3IoRGlyQ2FjaGUgZGMsIGludCBlY250KSB7CiAJCWNhY2hlID0gZGM7CiAJCWVudHJpZXMgPSBuZXcgRGlyQ2FjaGVFbnRyeVtlY250XTsKIAl9CkBAIC0xMTEsNyArMTExLDcgQEAgcHVibGljIERpckNhY2hlIGdldERpckNhY2hlKCkgewogCSAqIEBwYXJhbSBuZXdFbnRyeQogCSAqICAgICAgICAgICAgdGhlIG5ldyBlbnRyeSB0byBhZGQuCiAJICovCi0JcHJvdGVjdGVkIHZvaWQgZmFzdEFkZChmaW5hbCBEaXJDYWNoZUVudHJ5IG5ld0VudHJ5KSB7CisJcHJvdGVjdGVkIHZvaWQgZmFzdEFkZChEaXJDYWNoZUVudHJ5IG5ld0VudHJ5KSB7CiAJCWlmIChlbnRyaWVzLmxlbmd0aCA9PSBlbnRyeUNudCkgewogCQkJZmluYWwgRGlyQ2FjaGVFbnRyeVtdIG4gPSBuZXcgRGlyQ2FjaGVFbnRyeVsoZW50cnlDbnQgKyAxNikgKiAzIC8gMl07CiAJCQlTeXN0ZW0uYXJyYXljb3B5KGVudHJpZXMsIDAsIG4sIDAsIGVudHJ5Q250KTsKQEAgLTE0MCw3ICsxNDAsNyBAQCBwcm90ZWN0ZWQgdm9pZCBmYXN0QWRkKGZpbmFsIERpckNhY2hlRW50cnkgbmV3RW50cnkpIHsKIAkgKiBAcGFyYW0gY250CiAJICogICAgICAgICAgICBudW1iZXIgb2YgZW50cmllcyB0byBjb3B5LgogCSAqLwotCXByb3RlY3RlZCB2b2lkIGZhc3RLZWVwKGZpbmFsIGludCBwb3MsIGludCBjbnQpIHsKKwlwcm90ZWN0ZWQgdm9pZCBmYXN0S2VlcChpbnQgcG9zLCBpbnQgY250KSB7CiAJCWlmIChlbnRyeUNudCArIGNudCA+IGVudHJpZXMubGVuZ3RoKSB7CiAJCQlmaW5hbCBpbnQgbTEgPSAoZW50cnlDbnQgKyAxNikgKiAzIC8gMjsKIAkJCWZpbmFsIGludCBtMiA9IGVudHJ5Q250ICsgY250OwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZS5qYXZhCmluZGV4IGNjNDMxZGIuLjE0NjUzZmUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlLmphdmEKQEAgLTQ1LDE2ICs0NSwxNiBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuZGlyY2FjaGU7CiAKK2ltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLklTT184ODU5XzE7CisKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkVPRkV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkRpZ2VzdE91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3Q7CiBpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CkBAIC04Nyw2ICs4Nyw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLk11dGFibGVJbnRlZ2VyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5OQjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuVGVtcG9yYXJ5QnVmZmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5pby5TaWxlbnRGaWxlSW5wdXRTdHJlYW07CiAKIC8qKgogICogU3VwcG9ydCBmb3IgdGhlIEdpdCBkaXJjYWNoZSAoYWthIGluZGV4IGZpbGUpLgpAQCAtMTEyLDcgKzExMyw3IEBAIHB1YmxpYyBjbGFzcyBEaXJDYWNoZSB7CiAKIAlzdGF0aWMgZmluYWwgQ29tcGFyYXRvcjxEaXJDYWNoZUVudHJ5PiBFTlRfQ01QID0gbmV3IENvbXBhcmF0b3I8RGlyQ2FjaGVFbnRyeT4oKSB7CiAJCUBPdmVycmlkZQotCQlwdWJsaWMgaW50IGNvbXBhcmUoZmluYWwgRGlyQ2FjaGVFbnRyeSBvMSwgZmluYWwgRGlyQ2FjaGVFbnRyeSBvMikgeworCQlwdWJsaWMgaW50IGNvbXBhcmUoRGlyQ2FjaGVFbnRyeSBvMSwgRGlyQ2FjaGVFbnRyeSBvMikgewogCQkJZmluYWwgaW50IGNyID0gY21wKG8xLCBvMik7CiAJCQlpZiAoY3IgIT0gMCkKIAkJCQlyZXR1cm4gY3I7CkBAIC0xMjAsMTEgKzEyMSwxMSBAQCBwdWJsaWMgaW50IGNvbXBhcmUoZmluYWwgRGlyQ2FjaGVFbnRyeSBvMSwgZmluYWwgRGlyQ2FjaGVFbnRyeSBvMikgewogCQl9CiAJfTsKIAotCXN0YXRpYyBpbnQgY21wKGZpbmFsIERpckNhY2hlRW50cnkgYSwgZmluYWwgRGlyQ2FjaGVFbnRyeSBiKSB7CisJc3RhdGljIGludCBjbXAoRGlyQ2FjaGVFbnRyeSBhLCBEaXJDYWNoZUVudHJ5IGIpIHsKIAkJcmV0dXJuIGNtcChhLnBhdGgsIGEucGF0aC5sZW5ndGgsIGIpOwogCX0KIAotCXN0YXRpYyBpbnQgY21wKGZpbmFsIGJ5dGVbXSBhUGF0aCwgZmluYWwgaW50IGFMZW4sIGZpbmFsIERpckNhY2hlRW50cnkgYikgeworCXN0YXRpYyBpbnQgY21wKGJ5dGVbXSBhUGF0aCwgaW50IGFMZW4sIERpckNhY2hlRW50cnkgYikgewogCQlyZXR1cm4gY21wKGFQYXRoLCBhTGVuLCBiLnBhdGgsIGIucGF0aC5sZW5ndGgpOwogCX0KIApAQCAtMTg4LDcgKzE4OSw3IEBAIHB1YmxpYyBzdGF0aWMgRGlyQ2FjaGUgcmVhZChPYmplY3RSZWFkZXIgcmVhZGVyLCBBbnlPYmplY3RJZCB0cmVlSWQpCiAJICogICAgICAgICAgICAgdGhlIGluZGV4IGZpbGUgaXMgdXNpbmcgYSBmb3JtYXQgb3IgZXh0ZW5zaW9uIHRoYXQgdGhpcwogCSAqICAgICAgICAgICAgIGxpYnJhcnkgZG9lcyBub3Qgc3VwcG9ydC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIERpckNhY2hlIHJlYWQoZmluYWwgUmVwb3NpdG9yeSByZXBvc2l0b3J5KQorCXB1YmxpYyBzdGF0aWMgRGlyQ2FjaGUgcmVhZChSZXBvc2l0b3J5IHJlcG9zaXRvcnkpCiAJCQl0aHJvd3MgQ29ycnVwdE9iamVjdEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQlmaW5hbCBEaXJDYWNoZSBjID0gcmVhZChyZXBvc2l0b3J5LmdldEluZGV4RmlsZSgpLCByZXBvc2l0b3J5LmdldEZTKCkpOwogCQljLnJlcG9zaXRvcnkgPSByZXBvc2l0b3J5OwpAQCAtMjE1LDcgKzIxNiw3IEBAIHB1YmxpYyBzdGF0aWMgRGlyQ2FjaGUgcmVhZChmaW5hbCBSZXBvc2l0b3J5IHJlcG9zaXRvcnkpCiAJICogICAgICAgICAgICAgdGhlIGluZGV4IGZpbGUgaXMgdXNpbmcgYSBmb3JtYXQgb3IgZXh0ZW5zaW9uIHRoYXQgdGhpcwogCSAqICAgICAgICAgICAgIGxpYnJhcnkgZG9lcyBub3Qgc3VwcG9ydC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIERpckNhY2hlIHJlYWQoZmluYWwgRmlsZSBpbmRleExvY2F0aW9uLCBmaW5hbCBGUyBmcykKKwlwdWJsaWMgc3RhdGljIERpckNhY2hlIHJlYWQoRmlsZSBpbmRleExvY2F0aW9uLCBGUyBmcykKIAkJCXRocm93cyBDb3JydXB0T2JqZWN0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIERpckNhY2hlIGMgPSBuZXcgRGlyQ2FjaGUoaW5kZXhMb2NhdGlvbiwgZnMpOwogCQljLnJlYWQoKTsKQEAgLTI0NCw3ICsyNDUsNyBAQCBwdWJsaWMgc3RhdGljIERpckNhY2hlIHJlYWQoZmluYWwgRmlsZSBpbmRleExvY2F0aW9uLCBmaW5hbCBGUyBmcykKIAkgKiAgICAgICAgICAgICB0aGUgaW5kZXggZmlsZSBpcyB1c2luZyBhIGZvcm1hdCBvciBleHRlbnNpb24gdGhhdCB0aGlzCiAJICogICAgICAgICAgICAgbGlicmFyeSBkb2VzIG5vdCBzdXBwb3J0LgogCSAqLwotCXB1YmxpYyBzdGF0aWMgRGlyQ2FjaGUgbG9jayhmaW5hbCBGaWxlIGluZGV4TG9jYXRpb24sIGZpbmFsIEZTIGZzKQorCXB1YmxpYyBzdGF0aWMgRGlyQ2FjaGUgbG9jayhGaWxlIGluZGV4TG9jYXRpb24sIEZTIGZzKQogCQkJdGhyb3dzIENvcnJ1cHRPYmplY3RFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgRGlyQ2FjaGUgYyA9IG5ldyBEaXJDYWNoZShpbmRleExvY2F0aW9uLCBmcyk7CiAJCWlmICghYy5sb2NrKCkpCkBAIC0zNzIsNyArMzczLDcgQEAgcHVibGljIHN0YXRpYyBEaXJDYWNoZSBsb2NrKGZpbmFsIEZpbGUgaW5kZXhMb2NhdGlvbiwgZmluYWwgRlMgZnMsCiAJICogICAgICAgICAgICB0aGUgZmlsZSBzeXN0ZW0gYWJzdHJhY3Rpb24gd2hpY2ggd2lsbCBiZSBuZWNlc3NhcnkgdG8gcGVyZm9ybQogCSAqICAgICAgICAgICAgY2VydGFpbiBmaWxlIHN5c3RlbSBvcGVyYXRpb25zLgogCSAqLwotCXB1YmxpYyBEaXJDYWNoZShmaW5hbCBGaWxlIGluZGV4TG9jYXRpb24sIGZpbmFsIEZTIGZzKSB7CisJcHVibGljIERpckNhY2hlKEZpbGUgaW5kZXhMb2NhdGlvbiwgRlMgZnMpIHsKIAkJbGl2ZUZpbGUgPSBpbmRleExvY2F0aW9uOwogCQljbGVhcigpOwogCX0KQEAgLTQwMyw3ICs0MDQsNyBAQCBwdWJsaWMgRGlyQ2FjaGVFZGl0b3IgZWRpdG9yKCkgewogCQlyZXR1cm4gbmV3IERpckNhY2hlRWRpdG9yKHRoaXMsIGVudHJ5Q250ICsgMTYpOwogCX0KIAotCXZvaWQgcmVwbGFjZShmaW5hbCBEaXJDYWNoZUVudHJ5W10gZSwgZmluYWwgaW50IGNudCkgeworCXZvaWQgcmVwbGFjZShEaXJDYWNoZUVudHJ5W10gZSwgaW50IGNudCkgewogCQlzb3J0ZWRFbnRyaWVzID0gZTsKIAkJZW50cnlDbnQgPSBjbnQ7CiAJCXRyZWUgPSBudWxsOwpAQCAtNDI5LDE4ICs0MzAsMTAgQEAgcHVibGljIHZvaWQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29ycnVwdE9iamVjdEV4Y2VwdGlvbiB7CiAJCWlmICghbGl2ZUZpbGUuZXhpc3RzKCkpCiAJCQljbGVhcigpOwogCQllbHNlIGlmIChzbmFwc2hvdCA9PSBudWxsIHx8IHNuYXBzaG90LmlzTW9kaWZpZWQobGl2ZUZpbGUpKSB7Ci0JCQl0cnkgewotCQkJCWZpbmFsIEZpbGVJbnB1dFN0cmVhbSBpblN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0obGl2ZUZpbGUpOwotCQkJCXRyeSB7Ci0JCQkJCWNsZWFyKCk7Ci0JCQkJCXJlYWRGcm9tKGluU3RyZWFtKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQl0cnkgewotCQkJCQkJaW5TdHJlYW0uY2xvc2UoKTsKLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXJyMikgewotCQkJCQkJLy8gSWdub3JlIGFueSBjbG9zZSBmYWlsdXJlcy4KLQkJCQkJfQotCQkJCX0KKwkJCXRyeSAoU2lsZW50RmlsZUlucHV0U3RyZWFtIGluU3RyZWFtID0gbmV3IFNpbGVudEZpbGVJbnB1dFN0cmVhbSgKKwkJCQkJbGl2ZUZpbGUpKSB7CisJCQkJY2xlYXIoKTsKKwkJCQlyZWFkRnJvbShpblN0cmVhbSk7CiAJCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZm5mZSkgewogCQkJCWlmIChsaXZlRmlsZS5leGlzdHMoKSkgewogCQkJCQkvLyBQYW5pYzogdGhlIGluZGV4IGZpbGUgZXhpc3RzIGJ1dCB3ZSBjYW4ndCByZWFkIGl0CkBAIC00ODAsNyArNDczLDcgQEAgcHVibGljIHZvaWQgY2xlYXIoKSB7CiAJCXJlYWRJbmRleENoZWNrc3VtID0gTk9fQ0hFQ0tTVU07CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHJlYWRGcm9tKGZpbmFsIElucHV0U3RyZWFtIGluU3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sCisJcHJpdmF0ZSB2b2lkIHJlYWRGcm9tKElucHV0U3RyZWFtIGluU3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sCiAJCQlDb3JydXB0T2JqZWN0RXhjZXB0aW9uIHsKIAkJZmluYWwgQnVmZmVyZWRJbnB1dFN0cmVhbSBpbiA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGluU3RyZWFtKTsKIAkJZmluYWwgTWVzc2FnZURpZ2VzdCBtZCA9IENvbnN0YW50cy5uZXdNZXNzYWdlRGlnZXN0KCk7CkBAIC01ODgsMTIgKzU4MSwxMSBAQCBwcml2YXRlIHZvaWQgc2tpcE9wdGlvbmFsRXh0ZW5zaW9uKGZpbmFsIElucHV0U3RyZWFtIGluLAogCQl9CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZvcm1hdEV4dGVuc2lvbk5hbWUoZmluYWwgYnl0ZVtdIGhkcikKLQkJCXRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLQkJcmV0dXJuICInIiArIG5ldyBTdHJpbmcoaGRyLCAwLCA0LCAiSVNPLTg4NTktMSIpICsgIiciOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCXByaXZhdGUgc3RhdGljIFN0cmluZyBmb3JtYXRFeHRlbnNpb25OYW1lKGJ5dGVbXSBoZHIpIHsKKwkJcmV0dXJuICInIiArIG5ldyBTdHJpbmcoaGRyLCAwLCA0LCBJU09fODg1OV8xKSArICInIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc19ESVJDKGZpbmFsIGJ5dGVbXSBoZHIpIHsKKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzX0RJUkMoYnl0ZVtdIGhkcikgewogCQlpZiAoaGRyLmxlbmd0aCA8IFNJR19ESVJDLmxlbmd0aCkKIAkJCXJldHVybiBmYWxzZTsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBTSUdfRElSQy5sZW5ndGg7IGkrKykKQEAgLTY1Niw3ICs2NDgsNyBAQCBwdWJsaWMgdm9pZCB3cml0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCX0KIAl9CiAKLQl2b2lkIHdyaXRlVG8oRmlsZSBkaXIsIGZpbmFsIE91dHB1dFN0cmVhbSBvcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwl2b2lkIHdyaXRlVG8oRmlsZSBkaXIsIE91dHB1dFN0cmVhbSBvcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgTWVzc2FnZURpZ2VzdCBmb290ID0gQ29uc3RhbnRzLm5ld01lc3NhZ2VEaWdlc3QoKTsKIAkJZmluYWwgRGlnZXN0T3V0cHV0U3RyZWFtIGRvcyA9IG5ldyBEaWdlc3RPdXRwdXRTdHJlYW0ob3MsIGZvb3QpOwogCkBAIC03MTAsNiArNzAyLDggQEAgdm9pZCB3cml0ZVRvKEZpbGUgZGlyLCBmaW5hbCBPdXRwdXRTdHJlYW0gb3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCX0KIAogCQlpZiAod3JpdGVUcmVlKSB7CisJCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBFeHBsaWNpdGx5IGNsb3NlZCBpbiB0cnkgYmxvY2ssIGFuZAorCQkJCQkJCQkJCQkvLyBkZXN0cm95ZWQgaW4gZmluYWxseQogCQkJVGVtcG9yYXJ5QnVmZmVyIGJiID0gbmV3IFRlbXBvcmFyeUJ1ZmZlci5Mb2NhbEZpbGUoZGlyLCA1IDw8IDIwKTsKIAkJCXRyeSB7CiAJCQkJdHJlZS53cml0ZSh0bXAsIGJiKTsKQEAgLTc0MywxNiArNzM3LDE4IEBAIHB1YmxpYyBib29sZWFuIGNvbW1pdCgpIHsKIAkJZmluYWwgTG9ja0ZpbGUgdG1wID0gbXlMb2NrOwogCQlyZXF1aXJlTG9ja2VkKHRtcCk7CiAJCW15TG9jayA9IG51bGw7Ci0JCWlmICghdG1wLmNvbW1pdCgpKQorCQlpZiAoIXRtcC5jb21taXQoKSkgewogCQkJcmV0dXJuIGZhbHNlOworCQl9CiAJCXNuYXBzaG90ID0gdG1wLmdldENvbW1pdFNuYXBzaG90KCk7CiAJCWlmIChpbmRleENoYW5nZWRMaXN0ZW5lciAhPSBudWxsCi0JCQkJJiYgIUFycmF5cy5lcXVhbHMocmVhZEluZGV4Q2hlY2tzdW0sIHdyaXRlSW5kZXhDaGVja3N1bSkpCi0JCQlpbmRleENoYW5nZWRMaXN0ZW5lci5vbkluZGV4Q2hhbmdlZChuZXcgSW5kZXhDaGFuZ2VkRXZlbnQoKSk7CisJCQkJJiYgIUFycmF5cy5lcXVhbHMocmVhZEluZGV4Q2hlY2tzdW0sIHdyaXRlSW5kZXhDaGVja3N1bSkpIHsKKwkJCWluZGV4Q2hhbmdlZExpc3RlbmVyLm9uSW5kZXhDaGFuZ2VkKG5ldyBJbmRleENoYW5nZWRFdmVudCh0cnVlKSk7CisJCX0KIAkJcmV0dXJuIHRydWU7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHJlcXVpcmVMb2NrZWQoZmluYWwgTG9ja0ZpbGUgdG1wKSB7CisJcHJpdmF0ZSB2b2lkIHJlcXVpcmVMb2NrZWQoTG9ja0ZpbGUgdG1wKSB7CiAJCWlmIChsaXZlRmlsZSA9PSBudWxsKQogCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihKR2l0VGV4dC5nZXQoKS5kaXJDYWNoZUlzTm90TG9ja2VkKTsKIAkJaWYgKHRtcCA9PSBudWxsKQpAQCAtNzgzLDcgKzc3OSw3IEBAIHB1YmxpYyB2b2lkIHVubG9jaygpIHsKIAkgKiAgICAgICAgIHRoZSBpbmRleDsgcGFzcyB0byB7QGxpbmsgI2dldEVudHJ5KGludCl9IHRvIG9idGFpbiB0aGUgZW50cnkKIAkgKiAgICAgICAgIGluZm9ybWF0aW9uLiBJZiAmbHQ7IDAgdGhlIGVudHJ5IGRvZXMgbm90IGV4aXN0IGluIHRoZSBpbmRleC4KIAkgKi8KLQlwdWJsaWMgaW50IGZpbmRFbnRyeShmaW5hbCBTdHJpbmcgcGF0aCkgeworCXB1YmxpYyBpbnQgZmluZEVudHJ5KFN0cmluZyBwYXRoKSB7CiAJCWZpbmFsIGJ5dGVbXSBwID0gQ29uc3RhbnRzLmVuY29kZShwYXRoKTsKIAkJcmV0dXJuIGZpbmRFbnRyeShwLCBwLmxlbmd0aCk7CiAJfQpAQCAtODM5LDcgKzgzNSw3IEBAIGVsc2UgaWYgKGNtcCA9PSAwKSB7CiAJICogICAgICAgICAgICBlbnRyeSBwb3NpdGlvbiBvZiB0aGUgcGF0aCB0aGF0IHNob3VsZCBiZSBza2lwcGVkLgogCSAqIEByZXR1cm4gcG9zaXRpb24gb2YgdGhlIG5leHQgZW50cnkgd2hvc2UgcGF0aCBpcyBhZnRlciB0aGUgaW5wdXQuCiAJICovCi0JcHVibGljIGludCBuZXh0RW50cnkoZmluYWwgaW50IHBvc2l0aW9uKSB7CisJcHVibGljIGludCBuZXh0RW50cnkoaW50IHBvc2l0aW9uKSB7CiAJCURpckNhY2hlRW50cnkgbGFzdCA9IHNvcnRlZEVudHJpZXNbcG9zaXRpb25dOwogCQlpbnQgbmV4dElkeCA9IHBvc2l0aW9uICsgMTsKIAkJd2hpbGUgKG5leHRJZHggPCBlbnRyeUNudCkgewpAQCAtODUyLDcgKzg0OCw3IEBAIHB1YmxpYyBpbnQgbmV4dEVudHJ5KGZpbmFsIGludCBwb3NpdGlvbikgewogCQlyZXR1cm4gbmV4dElkeDsKIAl9CiAKLQlpbnQgbmV4dEVudHJ5KGZpbmFsIGJ5dGVbXSBwLCBmaW5hbCBpbnQgcExlbiwgaW50IG5leHRJZHgpIHsKKwlpbnQgbmV4dEVudHJ5KGJ5dGVbXSBwLCBpbnQgcExlbiwgaW50IG5leHRJZHgpIHsKIAkJd2hpbGUgKG5leHRJZHggPCBlbnRyeUNudCkgewogCQkJZmluYWwgRGlyQ2FjaGVFbnRyeSBuZXh0ID0gc29ydGVkRW50cmllc1tuZXh0SWR4XTsKIAkJCWlmICghRGlyQ2FjaGVUcmVlLnBlcShwLCBuZXh0LnBhdGgsIHBMZW4pKQpAQCAtODg2LDcgKzg4Miw3IEBAIHB1YmxpYyBpbnQgZ2V0RW50cnlDb3VudCgpIHsKIAkgKiAgICAgICAgICAgIHBvc2l0aW9uIG9mIHRoZSBlbnRyeSB0byBnZXQuCiAJICogQHJldHVybiB0aGUgZW50cnkgYXQgcG9zaXRpb24gPGNvZGU+aTwvY29kZT4uCiAJICovCi0JcHVibGljIERpckNhY2hlRW50cnkgZ2V0RW50cnkoZmluYWwgaW50IGkpIHsKKwlwdWJsaWMgRGlyQ2FjaGVFbnRyeSBnZXRFbnRyeShpbnQgaSkgewogCQlyZXR1cm4gc29ydGVkRW50cmllc1tpXTsKIAl9CiAKQEAgLTg5Nyw3ICs4OTMsNyBAQCBwdWJsaWMgRGlyQ2FjaGVFbnRyeSBnZXRFbnRyeShmaW5hbCBpbnQgaSkgewogCSAqICAgICAgICAgICAgdGhlIHBhdGggdG8gc2VhcmNoIGZvci4KIAkgKiBAcmV0dXJuIHRoZSBlbnRyeSBmb3IgdGhlIGdpdmVuIDxjb2RlPnBhdGg8L2NvZGU+LgogCSAqLwotCXB1YmxpYyBEaXJDYWNoZUVudHJ5IGdldEVudHJ5KGZpbmFsIFN0cmluZyBwYXRoKSB7CisJcHVibGljIERpckNhY2hlRW50cnkgZ2V0RW50cnkoU3RyaW5nIHBhdGgpIHsKIAkJZmluYWwgaW50IGkgPSBmaW5kRW50cnkocGF0aCk7CiAJCXJldHVybiBpIDwgMCA/IG51bGwgOiBzb3J0ZWRFbnRyaWVzW2ldOwogCX0KQEAgLTk0Niw3ICs5NDIsNyBAQCB2b2lkIHRvQXJyYXkoZmluYWwgaW50IGksIGZpbmFsIERpckNhY2hlRW50cnlbXSBkc3QsIGZpbmFsIGludCBvZmYsCiAJICogQHJldHVybiB0aGUgY2FjaGUgdHJlZTsgbnVsbCBpZiB0aGVyZSBpcyBubyBjdXJyZW50IGNhY2hlIHRyZWUgYXZhaWxhYmxlCiAJICogICAgICAgICBhbmQgPGNvZGU+YnVpbGQ8L2NvZGU+IHdhcyBmYWxzZS4KIAkgKi8KLQlwdWJsaWMgRGlyQ2FjaGVUcmVlIGdldENhY2hlVHJlZShmaW5hbCBib29sZWFuIGJ1aWxkKSB7CisJcHVibGljIERpckNhY2hlVHJlZSBnZXRDYWNoZVRyZWUoYm9vbGVhbiBidWlsZCkgewogCQlpZiAoYnVpbGQpIHsKIAkJCWlmICh0cmVlID09IG51bGwpCiAJCQkJdHJlZSA9IG5ldyBEaXJDYWNoZVRyZWUoKTsKQEAgLTk3Miw3ICs5NjgsNyBAQCBwdWJsaWMgRGlyQ2FjaGVUcmVlIGdldENhY2hlVHJlZShmaW5hbCBib29sZWFuIGJ1aWxkKSB7CiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgYW4gdW5leHBlY3RlZCBlcnJvciBvY2N1cnJlZCB3cml0aW5nIHRvIHRoZSBvYmplY3Qgc3RvcmUuCiAJICovCi0JcHVibGljIE9iamVjdElkIHdyaXRlVHJlZShmaW5hbCBPYmplY3RJbnNlcnRlciBvdykKKwlwdWJsaWMgT2JqZWN0SWQgd3JpdGVUcmVlKE9iamVjdEluc2VydGVyIG93KQogCQkJdGhyb3dzIFVubWVyZ2VkUGF0aEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQlyZXR1cm4gZ2V0Q2FjaGVUcmVlKHRydWUpLndyaXRlVHJlZShzb3J0ZWRFbnRyaWVzLCAwLCAwLCBvdyk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZUJ1aWxkSXRlcmF0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVCdWlsZEl0ZXJhdG9yLmphdmEKaW5kZXggNmUzNjgyYS4uZTgwNTQ0ZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZUJ1aWxkSXRlcmF0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlQnVpbGRJdGVyYXRvci5qYXZhCkBAIC05Niw3ICs5Niw3IEBAIHB1YmxpYyBjbGFzcyBEaXJDYWNoZUJ1aWxkSXRlcmF0b3IgZXh0ZW5kcyBEaXJDYWNoZUl0ZXJhdG9yIHsKIAkgKiAgICAgICAgICAgIHRoZSBjYWNoZSBidWlsZGVyIGZvciB0aGUgY2FjaGUgdG8gd2Fsay4gVGhlIGNhY2hlIG11c3QgYmUKIAkgKiAgICAgICAgICAgIGFscmVhZHkgbG9hZGVkIGludG8gbWVtb3J5LgogCSAqLwotCXB1YmxpYyBEaXJDYWNoZUJ1aWxkSXRlcmF0b3IoZmluYWwgRGlyQ2FjaGVCdWlsZGVyIGRjYikgeworCXB1YmxpYyBEaXJDYWNoZUJ1aWxkSXRlcmF0b3IoRGlyQ2FjaGVCdWlsZGVyIGRjYikgewogCQlzdXBlcihkY2IuZ2V0RGlyQ2FjaGUoKSk7CiAJCWJ1aWxkZXIgPSBkY2I7CiAJfQpAQCAtMTA5LDcgKzEwOSw3IEBAIHB1YmxpYyBEaXJDYWNoZUJ1aWxkSXRlcmF0b3IoZmluYWwgRGlyQ2FjaGVCdWlsZGVyIGRjYikgewogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgQWJzdHJhY3RUcmVlSXRlcmF0b3IgY3JlYXRlU3VidHJlZUl0ZXJhdG9yKGZpbmFsIE9iamVjdFJlYWRlciByZWFkZXIpCisJcHVibGljIEFic3RyYWN0VHJlZUl0ZXJhdG9yIGNyZWF0ZVN1YnRyZWVJdGVyYXRvcihPYmplY3RSZWFkZXIgcmVhZGVyKQogCQkJdGhyb3dzIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJaWYgKGN1cnJlbnRTdWJ0cmVlID09IG51bGwpCiAJCQl0aHJvdyBuZXcgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbihnZXRFbnRyeU9iamVjdElkKCksCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlQnVpbGRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZUJ1aWxkZXIuamF2YQppbmRleCAyZmY3YmI5Li5jNWZmOWFjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlQnVpbGRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVCdWlsZGVyLmphdmEKQEAgLTgzLDcgKzgzLDcgQEAgcHVibGljIGNsYXNzIERpckNhY2hlQnVpbGRlciBleHRlbmRzIEJhc2VEaXJDYWNoZUVkaXRvciB7CiAJICogICAgICAgICAgICBlc3RpbWF0ZWQgbnVtYmVyIG9mIGVudHJpZXMgdGhlIGJ1aWxkZXIgd2lsbCBoYXZlIHVwb24KIAkgKiAgICAgICAgICAgIGNvbXBsZXRpb24uIFRoaXMgc2l6ZXMgdGhlIGluaXRpYWwgZW50cnkgdGFibGUuCiAJICovCi0JcHJvdGVjdGVkIERpckNhY2hlQnVpbGRlcihmaW5hbCBEaXJDYWNoZSBkYywgZmluYWwgaW50IGVjbnQpIHsKKwlwcm90ZWN0ZWQgRGlyQ2FjaGVCdWlsZGVyKERpckNhY2hlIGRjLCBpbnQgZWNudCkgewogCQlzdXBlcihkYywgZWNudCk7CiAJfQogCkBAIC0xMDIsNyArMTAyLDcgQEAgcHJvdGVjdGVkIERpckNhY2hlQnVpbGRlcihmaW5hbCBEaXJDYWNoZSBkYywgZmluYWwgaW50IGVjbnQpIHsKIAkgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KIAkgKiAgICAgICAgICAgICBJZiB0aGUgRmlsZU1vZGUgb2YgdGhlIGVudHJ5IHdhcyBub3Qgc2V0IGJ5IHRoZSBjYWxsZXIuCiAJICovCi0JcHVibGljIHZvaWQgYWRkKGZpbmFsIERpckNhY2hlRW50cnkgbmV3RW50cnkpIHsKKwlwdWJsaWMgdm9pZCBhZGQoRGlyQ2FjaGVFbnRyeSBuZXdFbnRyeSkgewogCQlpZiAobmV3RW50cnkuZ2V0UmF3TW9kZSgpID09IDApCiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAogCQkJCQlKR2l0VGV4dC5nZXQoKS5maWxlTW9kZU5vdFNldEZvclBhdGgsCkBAIC0xMzEsNyArMTMxLDcgQEAgcHVibGljIHZvaWQgYWRkKGZpbmFsIERpckNhY2hlRW50cnkgbmV3RW50cnkpIHsKIAkgKiBAcGFyYW0gY250CiAJICogICAgICAgICAgICBudW1iZXIgb2YgZW50cmllcyB0byBjb3B5LgogCSAqLwotCXB1YmxpYyB2b2lkIGtlZXAoZmluYWwgaW50IHBvcywgaW50IGNudCkgeworCXB1YmxpYyB2b2lkIGtlZXAoaW50IHBvcywgaW50IGNudCkgewogCQliZWZvcmVBZGQoY2FjaGUuZ2V0RW50cnkocG9zKSk7CiAJCWZhc3RLZWVwKHBvcywgY250KTsKIAl9CkBAIC0yMjcsNyArMjI3LDcgQEAgcHVibGljIHZvaWQgZmluaXNoKCkgewogCQlyZXBsYWNlKCk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGJlZm9yZUFkZChmaW5hbCBEaXJDYWNoZUVudHJ5IG5ld0VudHJ5KSB7CisJcHJpdmF0ZSB2b2lkIGJlZm9yZUFkZChEaXJDYWNoZUVudHJ5IG5ld0VudHJ5KSB7CiAJCWlmIChzb3J0ZWQgJiYgZW50cnlDbnQgPiAwKSB7CiAJCQlmaW5hbCBEaXJDYWNoZUVudHJ5IGxhc3RFbnRyeSA9IGVudHJpZXNbZW50cnlDbnQgLSAxXTsKIAkJCWZpbmFsIGludCBjciA9IERpckNhY2hlLmNtcChsYXN0RW50cnksIG5ld0VudHJ5KTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVFZGl0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVFZGl0b3IuamF2YQppbmRleCAzMGUzYTNjLi43NGJhOTdmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlRWRpdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZUVkaXRvci5qYXZhCkBAIC03Nyw3ICs3Nyw3IEBACiBwdWJsaWMgY2xhc3MgRGlyQ2FjaGVFZGl0b3IgZXh0ZW5kcyBCYXNlRGlyQ2FjaGVFZGl0b3IgewogCXByaXZhdGUgc3RhdGljIGZpbmFsIENvbXBhcmF0b3I8UGF0aEVkaXQ+IEVESVRfQ01QID0gbmV3IENvbXBhcmF0b3I8UGF0aEVkaXQ+KCkgewogCQlAT3ZlcnJpZGUKLQkJcHVibGljIGludCBjb21wYXJlKGZpbmFsIFBhdGhFZGl0IG8xLCBmaW5hbCBQYXRoRWRpdCBvMikgeworCQlwdWJsaWMgaW50IGNvbXBhcmUoUGF0aEVkaXQgbzEsIFBhdGhFZGl0IG8yKSB7CiAJCQlmaW5hbCBieXRlW10gYSA9IG8xLnBhdGg7CiAJCQlmaW5hbCBieXRlW10gYiA9IG8yLnBhdGg7CiAJCQlyZXR1cm4gY21wKGEsIGEubGVuZ3RoLCBiLCBiLmxlbmd0aCk7CkBAIC05Niw3ICs5Niw3IEBAIHB1YmxpYyBpbnQgY29tcGFyZShmaW5hbCBQYXRoRWRpdCBvMSwgZmluYWwgUGF0aEVkaXQgbzIpIHsKIAkgKiAgICAgICAgICAgIGVzdGltYXRlZCBudW1iZXIgb2YgZW50cmllcyB0aGUgZWRpdG9yIHdpbGwgaGF2ZSB1cG9uCiAJICogICAgICAgICAgICBjb21wbGV0aW9uLiBUaGlzIHNpemVzIHRoZSBpbml0aWFsIGVudHJ5IHRhYmxlLgogCSAqLwotCXByb3RlY3RlZCBEaXJDYWNoZUVkaXRvcihmaW5hbCBEaXJDYWNoZSBkYywgZmluYWwgaW50IGVjbnQpIHsKKwlwcm90ZWN0ZWQgRGlyQ2FjaGVFZGl0b3IoRGlyQ2FjaGUgZGMsIGludCBlY250KSB7CiAJCXN1cGVyKGRjLCBlY250KTsKIAkJZWRpdHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAl9CkBAIC0xMTEsNyArMTExLDcgQEAgcHJvdGVjdGVkIERpckNhY2hlRWRpdG9yKGZpbmFsIERpckNhY2hlIGRjLCBmaW5hbCBpbnQgZWNudCkgewogCSAqIEBwYXJhbSBlZGl0CiAJICogICAgICAgICAgICBhbm90aGVyIGVkaXQgY29tbWFuZC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBhZGQoZmluYWwgUGF0aEVkaXQgZWRpdCkgeworCXB1YmxpYyB2b2lkIGFkZChQYXRoRWRpdCBlZGl0KSB7CiAJCWVkaXRzLmFkZChlZGl0KTsKIAl9CiAKQEAgLTMwNCw3ICszMDQsNyBAQCBwdWJsaWMgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIFBhdGhFZGl0IHsKIAkJICogQHBhcmFtIGVudHJ5UGF0aAogCQkgKiAgICAgICAgICAgIHBhdGggb2YgdGhlIGZpbGUgd2l0aGluIHRoZSByZXBvc2l0b3J5LgogCQkgKi8KLQkJcHVibGljIFBhdGhFZGl0KGZpbmFsIFN0cmluZyBlbnRyeVBhdGgpIHsKKwkJcHVibGljIFBhdGhFZGl0KFN0cmluZyBlbnRyeVBhdGgpIHsKIAkJCXBhdGggPSBDb25zdGFudHMuZW5jb2RlKGVudHJ5UGF0aCk7CiAJCX0KIApAQCAtMzE5LDcgKzMxOSw3IEBAIHB1YmxpYyBQYXRoRWRpdChmaW5hbCBTdHJpbmcgZW50cnlQYXRoKSB7CiAJCSAqICAgICAgICAgICAgZW50cnkgaW5zdGFuY2UgdG8gbWF0Y2ggcGF0aCBvZi4gT25seSB0aGUgcGF0aCBvZiB0aGlzCiAJCSAqICAgICAgICAgICAgZW50cnkgaXMgYWN0dWFsbHkgY29uc2lkZXJlZCBkdXJpbmcgY29tbWFuZCBldmFsdWF0aW9uLgogCQkgKi8KLQkJcHVibGljIFBhdGhFZGl0KGZpbmFsIERpckNhY2hlRW50cnkgZW50KSB7CisJCXB1YmxpYyBQYXRoRWRpdChEaXJDYWNoZUVudHJ5IGVudCkgewogCQkJcGF0aCA9IGVudC5wYXRoOwogCQl9CiAKQEAgLTM3NCw3ICszNzQsNyBAQCBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIERlbGV0ZVBhdGggZXh0ZW5kcyBQYXRoRWRpdCB7CiAJCSAqIEBwYXJhbSBlbnRyeVBhdGgKIAkJICogICAgICAgICAgICBwYXRoIG9mIHRoZSBmaWxlIHdpdGhpbiB0aGUgcmVwb3NpdG9yeS4KIAkJICovCi0JCXB1YmxpYyBEZWxldGVQYXRoKGZpbmFsIFN0cmluZyBlbnRyeVBhdGgpIHsKKwkJcHVibGljIERlbGV0ZVBhdGgoU3RyaW5nIGVudHJ5UGF0aCkgewogCQkJc3VwZXIoZW50cnlQYXRoKTsKIAkJfQogCkBAIC0zODUsMTIgKzM4NSwxMiBAQCBwdWJsaWMgRGVsZXRlUGF0aChmaW5hbCBTdHJpbmcgZW50cnlQYXRoKSB7CiAJCSAqICAgICAgICAgICAgZW50cnkgaW5zdGFuY2UgdG8gcmVtb3ZlLiBPbmx5IHRoZSBwYXRoIG9mIHRoaXMgZW50cnkgaXMKIAkJICogICAgICAgICAgICBhY3R1YWxseSBjb25zaWRlcmVkIGR1cmluZyBjb21tYW5kIGV2YWx1YXRpb24uCiAJCSAqLwotCQlwdWJsaWMgRGVsZXRlUGF0aChmaW5hbCBEaXJDYWNoZUVudHJ5IGVudCkgeworCQlwdWJsaWMgRGVsZXRlUGF0aChEaXJDYWNoZUVudHJ5IGVudCkgewogCQkJc3VwZXIoZW50KTsKIAkJfQogCiAJCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBhcHBseShmaW5hbCBEaXJDYWNoZUVudHJ5IGVudCkgeworCQlwdWJsaWMgdm9pZCBhcHBseShEaXJDYWNoZUVudHJ5IGVudCkgewogCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKEpHaXRUZXh0LmdldCgpLm5vQXBwbHlJbkRlbGV0ZSk7CiAJCX0KIAl9CkBAIC00NDAsNyArNDQwLDcgQEAgcHVibGljIERlbGV0ZVRyZWUoU3RyaW5nIGVudHJ5UGF0aCkgewogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIGFwcGx5KGZpbmFsIERpckNhY2hlRW50cnkgZW50KSB7CisJCXB1YmxpYyB2b2lkIGFwcGx5KERpckNhY2hlRW50cnkgZW50KSB7CiAJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oSkdpdFRleHQuZ2V0KCkubm9BcHBseUluRGVsZXRlKTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVFbnRyeS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZUVudHJ5LmphdmEKaW5kZXggN2MwM2M2NC4uZmVlOWY1MSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZUVudHJ5LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZUVudHJ5LmphdmEKQEAgLTIyNyw3ICsyMjcsNyBAQCBwdWJsaWMgY2xhc3MgRGlyQ2FjaGVFbnRyeSB7CiAJICogICAgICAgICAgICAgIlwwIi4gVGhlc2Ugc2VxdWVuY2VzIGFyZSBub3QgcGVybWl0dGVkIGluIGEgZ2l0IHRyZWUgb2JqZWN0CiAJICogICAgICAgICAgICAgb3IgRGlyQ2FjaGUgZmlsZS4KIAkgKi8KLQlwdWJsaWMgRGlyQ2FjaGVFbnRyeShmaW5hbCBTdHJpbmcgbmV3UGF0aCkgeworCXB1YmxpYyBEaXJDYWNoZUVudHJ5KFN0cmluZyBuZXdQYXRoKSB7CiAJCXRoaXMoQ29uc3RhbnRzLmVuY29kZShuZXdQYXRoKSwgU1RBR0VfMCk7CiAJfQogCkBAIC0yNDQsNyArMjQ0LDcgQEAgcHVibGljIERpckNhY2hlRW50cnkoZmluYWwgU3RyaW5nIG5ld1BhdGgpIHsKIAkgKiAgICAgICAgICAgICBvciBEaXJDYWNoZSBmaWxlLiAgT3IgaWYge0Bjb2RlIHN0YWdlfSBpcyBvdXRzaWRlIG9mIHRoZQogCSAqICAgICAgICAgICAgIHJhbmdlIDAuLjMsIGluY2x1c2l2ZS4KIAkgKi8KLQlwdWJsaWMgRGlyQ2FjaGVFbnRyeShmaW5hbCBTdHJpbmcgbmV3UGF0aCwgZmluYWwgaW50IHN0YWdlKSB7CisJcHVibGljIERpckNhY2hlRW50cnkoU3RyaW5nIG5ld1BhdGgsIGludCBzdGFnZSkgewogCQl0aGlzKENvbnN0YW50cy5lbmNvZGUobmV3UGF0aCksIHN0YWdlKTsKIAl9CiAKQEAgLTI1OCw3ICsyNTgsNyBAQCBwdWJsaWMgRGlyQ2FjaGVFbnRyeShmaW5hbCBTdHJpbmcgbmV3UGF0aCwgZmluYWwgaW50IHN0YWdlKSB7CiAJICogICAgICAgICAgICAgIlwwIi4gVGhlc2Ugc2VxdWVuY2VzIGFyZSBub3QgcGVybWl0dGVkIGluIGEgZ2l0IHRyZWUgb2JqZWN0CiAJICogICAgICAgICAgICAgb3IgRGlyQ2FjaGUgZmlsZS4KIAkgKi8KLQlwdWJsaWMgRGlyQ2FjaGVFbnRyeShmaW5hbCBieXRlW10gbmV3UGF0aCkgeworCXB1YmxpYyBEaXJDYWNoZUVudHJ5KGJ5dGVbXSBuZXdQYXRoKSB7CiAJCXRoaXMobmV3UGF0aCwgU1RBR0VfMCk7CiAJfQogCkBAIC0yNzYsNyArMjc2LDcgQEAgcHVibGljIERpckNhY2hlRW50cnkoZmluYWwgYnl0ZVtdIG5ld1BhdGgpIHsKIAkgKiAgICAgICAgICAgICByYW5nZSAwLi4zLCBpbmNsdXNpdmUuCiAJICovCiAJQFN1cHByZXNzV2FybmluZ3MoImJveGluZyIpCi0JcHVibGljIERpckNhY2hlRW50cnkoYnl0ZVtdIHBhdGgsIGZpbmFsIGludCBzdGFnZSkgeworCXB1YmxpYyBEaXJDYWNoZUVudHJ5KGJ5dGVbXSBwYXRoLCBpbnQgc3RhZ2UpIHsKIAkJY2hlY2tQYXRoKHBhdGgpOwogCQlpZiAoc3RhZ2UgPCAwIHx8IDMgPCBzdGFnZSkKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCkBAIC0zMTIsNyArMzEyLDcgQEAgcHVibGljIERpckNhY2hlRW50cnkoRGlyQ2FjaGVFbnRyeSBzcmMpIHsKIAkJU3lzdGVtLmFycmF5Y29weShzcmMuaW5mbywgc3JjLmluZm9PZmZzZXQsIGluZm8sIDAsIElORk9fTEVOKTsKIAl9CiAKLQl2b2lkIHdyaXRlKGZpbmFsIE91dHB1dFN0cmVhbSBvcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwl2b2lkIHdyaXRlKE91dHB1dFN0cmVhbSBvcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgaW50IGxlbiA9IGlzRXh0ZW5kZWQoKSA/IElORk9fTEVOX0VYVEVOREVEIDogSU5GT19MRU47CiAJCWZpbmFsIGludCBwYXRoTGVuID0gcGF0aC5sZW5ndGg7CiAJCW9zLndyaXRlKGluZm8sIGluZm9PZmZzZXQsIGxlbik7CkBAIC0zNDMsNyArMzQzLDcgQEAgdm9pZCB3cml0ZShmaW5hbCBPdXRwdXRTdHJlYW0gb3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJICogICAgICAgICAgICBuYW5vc2Vjb25kcyBjb21wb25lbnQgb2YgdGhlIGluZGV4J3MgbGFzdCBtb2RpZmllZCB0aW1lLgogCSAqIEByZXR1cm4gdHJ1ZSBpZiBleHRyYSBjYXJlZnVsIGNoZWNrcyBzaG91bGQgYmUgdXNlZC4KIAkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBtaWdodEJlUmFjaWx5Q2xlYW4oZmluYWwgaW50IHNtdWRnZV9zLCBmaW5hbCBpbnQgc211ZGdlX25zKSB7CisJcHVibGljIGZpbmFsIGJvb2xlYW4gbWlnaHRCZVJhY2lseUNsZWFuKGludCBzbXVkZ2VfcywgaW50IHNtdWRnZV9ucykgewogCQkvLyBJZiB0aGUgaW5kZXggaGFzIGEgbW9kaWZpY2F0aW9uIHRpbWUgdGhlbiBpdCBjYW1lIGZyb20gZGlzawogCQkvLyBhbmQgd2FzIG5vdCBnZW5lcmF0ZWQgZnJvbSBzY3JhdGNoIGluIG1lbW9yeS4gSW4gc3VjaCBjYXNlcwogCQkvLyB0aGUgZW50cnkgaXMgJ3JhY2lseSBjbGVhbicgaWYgdGhlIGVudHJ5J3MgY2FjaGVkIG1vZGlmaWNhdGlvbgpAQCAtNDIwLDcgKzQyMCw3IEBAIHB1YmxpYyBib29sZWFuIGlzQXNzdW1lVmFsaWQoKSB7CiAJICogICAgICAgICAgICB0cnVlIHRvIGlnbm9yZSBhcHBhcmVudCBtb2RpZmljYXRpb25zOyBmYWxzZSB0byBsb29rIGF0IGxhc3QKIAkgKiAgICAgICAgICAgIG1vZGlmaWVkIHRvIGRldGVjdCBmaWxlIG1vZGlmaWNhdGlvbnMuCiAJICovCi0JcHVibGljIHZvaWQgc2V0QXNzdW1lVmFsaWQoZmluYWwgYm9vbGVhbiBhc3N1bWUpIHsKKwlwdWJsaWMgdm9pZCBzZXRBc3N1bWVWYWxpZChib29sZWFuIGFzc3VtZSkgewogCQlpZiAoYXNzdW1lKQogCQkJaW5mb1tpbmZvT2Zmc2V0ICsgUF9GTEFHU10gfD0gQVNTVU1FX1ZBTElEOwogCQllbHNlCkBAIC01MTgsNyArNTE4LDcgQEAgcHVibGljIEZpbGVNb2RlIGdldEZpbGVNb2RlKCkgewogCSAqICAgICAgICAgICAgIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5GaWxlTW9kZSNUUkVFfSwgb3IgYW55IG90aGVyIHR5cGUKIAkgKiAgICAgICAgICAgICBjb2RlIG5vdCBwZXJtaXR0ZWQgaW4gYSB0cmVlIG9iamVjdC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWxlTW9kZShmaW5hbCBGaWxlTW9kZSBtb2RlKSB7CisJcHVibGljIHZvaWQgc2V0RmlsZU1vZGUoRmlsZU1vZGUgbW9kZSkgewogCQlzd2l0Y2ggKG1vZGUuZ2V0Qml0cygpICYgRmlsZU1vZGUuVFlQRV9NQVNLKSB7CiAJCWNhc2UgRmlsZU1vZGUuVFlQRV9NSVNTSU5HOgogCQljYXNlIEZpbGVNb2RlLlRZUEVfVFJFRToKQEAgLTU0OCw3ICs1NDgsNyBAQCBwdWJsaWMgbG9uZyBnZXRDcmVhdGlvblRpbWUoKSB7CiAJICogQHBhcmFtIHdoZW4KIAkgKiAgICAgICAgICAgIG5ldyBjYWNoZWQgY3JlYXRpb24gdGltZSBvZiB0aGUgZmlsZSwgaW4gbWlsbGlzZWNvbmRzLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldENyZWF0aW9uVGltZShmaW5hbCBsb25nIHdoZW4pIHsKKwlwdWJsaWMgdm9pZCBzZXRDcmVhdGlvblRpbWUobG9uZyB3aGVuKSB7CiAJCWVuY29kZVRTKFBfQ1RJTUUsIHdoZW4pOwogCX0KIApAQCAtNTcyLDcgKzU3Miw3IEBAIHB1YmxpYyBsb25nIGdldExhc3RNb2RpZmllZCgpIHsKIAkgKiBAcGFyYW0gd2hlbgogCSAqICAgICAgICAgICAgbmV3IGNhY2hlZCBtb2RpZmljYXRpb24gZGF0ZSBvZiB0aGUgZmlsZSwgaW4gbWlsbGlzZWNvbmRzLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldExhc3RNb2RpZmllZChmaW5hbCBsb25nIHdoZW4pIHsKKwlwdWJsaWMgdm9pZCBzZXRMYXN0TW9kaWZpZWQobG9uZyB3aGVuKSB7CiAJCWVuY29kZVRTKFBfTVRJTUUsIHdoZW4pOwogCX0KIApAQCAtNjA0LDcgKzYwNCw3IEBAIHB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewogCSAqICAgICAgICAgICAgbmV3IGNhY2hlZCBzaXplIG9mIHRoZSBmaWxlLCBhcyBieXRlcy4gSWYgdGhlIGZpbGUgaXMgbGFyZ2VyCiAJICogICAgICAgICAgICB0aGFuIDJHLCBjYXN0IGl0IHRvIChpbnQpIGJlZm9yZSBjYWxsaW5nIHRoaXMgbWV0aG9kLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldExlbmd0aChmaW5hbCBpbnQgc3opIHsKKwlwdWJsaWMgdm9pZCBzZXRMZW5ndGgoaW50IHN6KSB7CiAJCU5CLmVuY29kZUludDMyKGluZm8sIGluZm9PZmZzZXQgKyBQX1NJWkUsIHN6KTsKIAl9CiAKQEAgLTYxNCw3ICs2MTQsNyBAQCBwdWJsaWMgdm9pZCBzZXRMZW5ndGgoZmluYWwgaW50IHN6KSB7CiAJICogQHBhcmFtIHN6CiAJICogICAgICAgICAgICBuZXcgY2FjaGVkIHNpemUgb2YgdGhlIGZpbGUsIGFzIGJ5dGVzLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldExlbmd0aChmaW5hbCBsb25nIHN6KSB7CisJcHVibGljIHZvaWQgc2V0TGVuZ3RoKGxvbmcgc3opIHsKIAkJc2V0TGVuZ3RoKChpbnQpIHN6KTsKIAl9CiAKQEAgLTYzOCw3ICs2MzgsNyBAQCBwdWJsaWMgT2JqZWN0SWQgZ2V0T2JqZWN0SWQoKSB7CiAJICogICAgICAgICAgICB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWQjemVyb0lkKCl9IHRvIHJlbW92ZSB0aGUKIAkgKiAgICAgICAgICAgIGN1cnJlbnQgaWRlbnRpZmllci4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPYmplY3RJZChmaW5hbCBBbnlPYmplY3RJZCBpZCkgeworCXB1YmxpYyB2b2lkIHNldE9iamVjdElkKEFueU9iamVjdElkIGlkKSB7CiAJCWlkLmNvcHlSYXdUbyhpZEJ1ZmZlcigpLCBpZE9mZnNldCgpKTsKIAl9CiAKQEAgLTY1MSw3ICs2NTEsNyBAQCBwdWJsaWMgdm9pZCBzZXRPYmplY3RJZChmaW5hbCBBbnlPYmplY3RJZCBpZCkgewogCSAqIEBwYXJhbSBwCiAJICogICAgICAgICAgICBwb3NpdGlvbiB0byByZWFkIHRoZSBmaXJzdCBieXRlIG9mIGRhdGEgZnJvbS4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPYmplY3RJZEZyb21SYXcoZmluYWwgYnl0ZVtdIGJzLCBmaW5hbCBpbnQgcCkgeworCXB1YmxpYyB2b2lkIHNldE9iamVjdElkRnJvbVJhdyhieXRlW10gYnMsIGludCBwKSB7CiAJCWZpbmFsIGludCBuID0gQ29uc3RhbnRzLk9CSkVDVF9JRF9MRU5HVEg7CiAJCVN5c3RlbS5hcnJheWNvcHkoYnMsIHAsIGlkQnVmZmVyKCksIGlkT2Zmc2V0KCksIG4pOwogCX0KQEAgLTcwNCw3ICs3MDQsNyBAQCBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCSAqIEBwYXJhbSBzcmMKIAkgKiAgICAgICAgICAgIHRoZSBlbnRyeSB0byBjb3B5IE9iamVjdElkIGFuZCBtZXRhIGZpZWxkcyBmcm9tLgogCSAqLwotCXB1YmxpYyB2b2lkIGNvcHlNZXRhRGF0YShmaW5hbCBEaXJDYWNoZUVudHJ5IHNyYykgeworCXB1YmxpYyB2b2lkIGNvcHlNZXRhRGF0YShEaXJDYWNoZUVudHJ5IHNyYykgewogCQljb3B5TWV0YURhdGEoc3JjLCBmYWxzZSk7CiAJfQogCkBAIC03MTksNyArNzE5LDcgQEAgcHVibGljIHZvaWQgY29weU1ldGFEYXRhKGZpbmFsIERpckNhY2hlRW50cnkgc3JjKSB7CiAJICogQHBhcmFtIGtlZXBTdGFnZQogCSAqICAgICAgICAgICAgaWYgdHJ1ZSwgdGhlIHN0YWdlIGF0dHJpYnV0ZSB3aWxsIG5vdCBiZSBjb3BpZWQKIAkgKi8KLQl2b2lkIGNvcHlNZXRhRGF0YShmaW5hbCBEaXJDYWNoZUVudHJ5IHNyYywgYm9vbGVhbiBrZWVwU3RhZ2UpIHsKKwl2b2lkIGNvcHlNZXRhRGF0YShEaXJDYWNoZUVudHJ5IHNyYywgYm9vbGVhbiBrZWVwU3RhZ2UpIHsKIAkJaW50IG9yaWdmbGFncyA9IE5CLmRlY29kZVVJbnQxNihpbmZvLCBpbmZvT2Zmc2V0ICsgUF9GTEFHUyk7CiAJCWludCBuZXdmbGFncyA9IE5CLmRlY29kZVVJbnQxNihzcmMuaW5mbywgc3JjLmluZm9PZmZzZXQgKyBQX0ZMQUdTKTsKIAkJU3lzdGVtLmFycmF5Y29weShzcmMuaW5mbywgc3JjLmluZm9PZmZzZXQsIGluZm8sIGluZm9PZmZzZXQsIElORk9fTEVOKTsKQEAgLTc0MSwxNCArNzQxLDE0IEBAIGJvb2xlYW4gaXNFeHRlbmRlZCgpIHsKIAkJcmV0dXJuIChpbmZvW2luZm9PZmZzZXQgKyBQX0ZMQUdTXSAmIEVYVEVOREVEKSAhPSAwOwogCX0KIAotCXByaXZhdGUgbG9uZyBkZWNvZGVUUyhmaW5hbCBpbnQgcElkeCkgeworCXByaXZhdGUgbG9uZyBkZWNvZGVUUyhpbnQgcElkeCkgewogCQlmaW5hbCBpbnQgYmFzZSA9IGluZm9PZmZzZXQgKyBwSWR4OwogCQlmaW5hbCBpbnQgc2VjID0gTkIuZGVjb2RlSW50MzIoaW5mbywgYmFzZSk7CiAJCWZpbmFsIGludCBtcyA9IE5CLmRlY29kZUludDMyKGluZm8sIGJhc2UgKyA0KSAvIDEwMDAwMDA7CiAJCXJldHVybiAxMDAwTCAqIHNlYyArIG1zOwogCX0KIAotCXByaXZhdGUgdm9pZCBlbmNvZGVUUyhmaW5hbCBpbnQgcElkeCwgZmluYWwgbG9uZyB3aGVuKSB7CisJcHJpdmF0ZSB2b2lkIGVuY29kZVRTKGludCBwSWR4LCBsb25nIHdoZW4pIHsKIAkJZmluYWwgaW50IGJhc2UgPSBpbmZvT2Zmc2V0ICsgcElkeDsKIAkJTkIuZW5jb2RlSW50MzIoaW5mbywgYmFzZSwgKGludCkgKHdoZW4gLyAxMDAwKSk7CiAJCU5CLmVuY29kZUludDMyKGluZm8sIGJhc2UgKyA0LCAoKGludCkgKHdoZW4gJSAxMDAwKSkgKiAxMDAwMDAwKTsKQEAgLTc3MSw3ICs3NzEsNyBAQCBwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrUGF0aChieXRlW10gcGF0aCkgewogCQl9CiAJfQogCi0Jc3RhdGljIFN0cmluZyB0b1N0cmluZyhmaW5hbCBieXRlW10gcGF0aCkgeworCXN0YXRpYyBTdHJpbmcgdG9TdHJpbmcoYnl0ZVtdIHBhdGgpIHsKIAkJcmV0dXJuIENvbnN0YW50cy5DSEFSU0VULmRlY29kZShCeXRlQnVmZmVyLndyYXAocGF0aCkpLnRvU3RyaW5nKCk7CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlSXRlcmF0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVJdGVyYXRvci5qYXZhCmluZGV4IGQ3NjgyMTYuLjE5YzkxNmYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVJdGVyYXRvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVJdGVyYXRvci5qYXZhCkBAIC0xMTQsNyArMTE0LDcgQEAgcHVibGljIGNsYXNzIERpckNhY2hlSXRlcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdFRyZWVJdGVyYXRvciB7CiAJICogQHBhcmFtIGRjCiAJICogICAgICAgICAgICB0aGUgY2FjaGUgdG8gd2Fsay4gSXQgbXVzdCBiZSBhbHJlYWR5IGxvYWRlZCBpbnRvIG1lbW9yeS4KIAkgKi8KLQlwdWJsaWMgRGlyQ2FjaGVJdGVyYXRvcihmaW5hbCBEaXJDYWNoZSBkYykgeworCXB1YmxpYyBEaXJDYWNoZUl0ZXJhdG9yKERpckNhY2hlIGRjKSB7CiAJCWNhY2hlID0gZGM7CiAJCXRyZWUgPSBkYy5nZXRDYWNoZVRyZWUodHJ1ZSk7CiAJCXRyZWVTdGFydCA9IDA7CkBAIC0xMjQsNyArMTI0LDcgQEAgcHVibGljIERpckNhY2hlSXRlcmF0b3IoZmluYWwgRGlyQ2FjaGUgZGMpIHsKIAkJCXBhcnNlRW50cnkoKTsKIAl9CiAKLQlEaXJDYWNoZUl0ZXJhdG9yKGZpbmFsIERpckNhY2hlSXRlcmF0b3IgcCwgZmluYWwgRGlyQ2FjaGVUcmVlIGRjdCkgeworCURpckNhY2hlSXRlcmF0b3IoRGlyQ2FjaGVJdGVyYXRvciBwLCBEaXJDYWNoZVRyZWUgZGN0KSB7CiAJCXN1cGVyKHAsIHAucGF0aCwgcC5wYXRoTGVuICsgMSk7CiAJCWNhY2hlID0gcC5jYWNoZTsKIAkJdHJlZSA9IGRjdDsKQEAgLTEzNyw3ICsxMzcsNyBAQCBwdWJsaWMgRGlyQ2FjaGVJdGVyYXRvcihmaW5hbCBEaXJDYWNoZSBkYykgewogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgQWJzdHJhY3RUcmVlSXRlcmF0b3IgY3JlYXRlU3VidHJlZUl0ZXJhdG9yKGZpbmFsIE9iamVjdFJlYWRlciByZWFkZXIpCisJcHVibGljIEFic3RyYWN0VHJlZUl0ZXJhdG9yIGNyZWF0ZVN1YnRyZWVJdGVyYXRvcihPYmplY3RSZWFkZXIgcmVhZGVyKQogCQkJdGhyb3dzIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJaWYgKGN1cnJlbnRTdWJ0cmVlID09IG51bGwpCiAJCQl0aHJvdyBuZXcgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbihnZXRFbnRyeU9iamVjdElkKCksCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlVHJlZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZVRyZWUuamF2YQppbmRleCBkYzgyNWQ0Li5iNjA1ZjNjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlVHJlZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVUcmVlLmphdmEKQEAgLTgyLDcgKzgyLDcgQEAgcHVibGljIGNsYXNzIERpckNhY2hlVHJlZSB7CiAKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yPERpckNhY2hlVHJlZT4gVFJFRV9DTVAgPSBuZXcgQ29tcGFyYXRvcjxEaXJDYWNoZVRyZWU+KCkgewogCQlAT3ZlcnJpZGUKLQkJcHVibGljIGludCBjb21wYXJlKGZpbmFsIERpckNhY2hlVHJlZSBvMSwgZmluYWwgRGlyQ2FjaGVUcmVlIG8yKSB7CisJCXB1YmxpYyBpbnQgY29tcGFyZShEaXJDYWNoZVRyZWUgbzEsIERpckNhY2hlVHJlZSBvMikgewogCQkJZmluYWwgYnl0ZVtdIGEgPSBvMS5lbmNvZGVkTmFtZTsKIAkJCWZpbmFsIGJ5dGVbXSBiID0gbzIuZW5jb2RlZE5hbWU7CiAJCQlmaW5hbCBpbnQgYUxlbiA9IGEubGVuZ3RoOwpAQCAtMTg1LDcgKzE4NSw3IEBAIHByaXZhdGUgRGlyQ2FjaGVUcmVlKGZpbmFsIERpckNhY2hlVHJlZSBteVBhcmVudCwgZmluYWwgYnl0ZVtdIHBhdGgsCiAJCWNoaWxkQ250ID0gc3ViY250OwogCX0KIAotCXZvaWQgd3JpdGUoZmluYWwgYnl0ZVtdIHRtcCwgZmluYWwgT3V0cHV0U3RyZWFtIG9zKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXZvaWQgd3JpdGUoYnl0ZVtdIHRtcCwgT3V0cHV0U3RyZWFtIG9zKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlpbnQgcHRyID0gdG1wLmxlbmd0aDsKIAkJdG1wWy0tcHRyXSA9ICdcbic7CiAJCXB0ciA9IFJhd1BhcnNlVXRpbHMuZm9ybWF0QmFzZTEwKHRtcCwgcHRyLCBjaGlsZENudCk7CkBAIC0yNDgsNyArMjQ4LDcgQEAgcHVibGljIGludCBnZXRDaGlsZENvdW50KCkgewogCSAqICAgICAgICAgICAgaW5kZXggb2YgdGhlIGNoaWxkIHRvIG9idGFpbi4KIAkgKiBAcmV0dXJuIHRoZSBjaGlsZCB0cmVlLgogCSAqLwotCXB1YmxpYyBEaXJDYWNoZVRyZWUgZ2V0Q2hpbGQoZmluYWwgaW50IGkpIHsKKwlwdWJsaWMgRGlyQ2FjaGVUcmVlIGdldENoaWxkKGludCBpKSB7CiAJCXJldHVybiBjaGlsZHJlbltpXTsKIAl9CiAKQEAgLTM4OSw3ICszODksNyBAQCBwcml2YXRlIGludCBjb21wdXRlU2l6ZShmaW5hbCBEaXJDYWNoZUVudHJ5W10gY2FjaGUsIGludCBjSWR4LAogCQlyZXR1cm4gc2l6ZTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgYXBwZW5kTmFtZShmaW5hbCBTdHJpbmdCdWlsZGVyIHIpIHsKKwlwcml2YXRlIHZvaWQgYXBwZW5kTmFtZShTdHJpbmdCdWlsZGVyIHIpIHsKIAkJaWYgKHBhcmVudCAhPSBudWxsKSB7CiAJCQlwYXJlbnQuYXBwZW5kTmFtZShyKTsKIAkJCXIuYXBwZW5kKGdldE5hbWVTdHJpbmcoKSk7CkBAIC00MDQsNyArNDA0LDcgQEAgZmluYWwgaW50IG5hbWVMZW5ndGgoKSB7CiAJCXJldHVybiBlbmNvZGVkTmFtZS5sZW5ndGg7CiAJfQogCi0JZmluYWwgYm9vbGVhbiBjb250YWlucyhmaW5hbCBieXRlW10gYSwgaW50IGFPZmYsIGZpbmFsIGludCBhTGVuKSB7CisJZmluYWwgYm9vbGVhbiBjb250YWlucyhieXRlW10gYSwgaW50IGFPZmYsIGludCBhTGVuKSB7CiAJCWZpbmFsIGJ5dGVbXSBlID0gZW5jb2RlZE5hbWU7CiAJCWZpbmFsIGludCBlTGVuID0gZS5sZW5ndGg7CiAJCWZvciAoaW50IGVPZmYgPSAwOyBlT2ZmIDwgZUxlbiAmJiBhT2ZmIDwgYUxlbjsgZU9mZisrLCBhT2ZmKyspCkBAIC01MDMsNyArNTAzLDcgQEAgdm9pZCB2YWxpZGF0ZShmaW5hbCBEaXJDYWNoZUVudHJ5W10gY2FjaGUsIGZpbmFsIGludCBjQ250LCBpbnQgY0lkeCwKIAkJCXJlbW92ZUNoaWxkKGNoaWxkQ250IC0gMSk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGluc2VydENoaWxkKGZpbmFsIGludCBzdElkeCwgZmluYWwgRGlyQ2FjaGVUcmVlIHN0KSB7CisJcHJpdmF0ZSB2b2lkIGluc2VydENoaWxkKGludCBzdElkeCwgRGlyQ2FjaGVUcmVlIHN0KSB7CiAJCWZpbmFsIERpckNhY2hlVHJlZVtdIGMgPSBjaGlsZHJlbjsKIAkJaWYgKGNoaWxkQ250ICsgMSA8PSBjLmxlbmd0aCkgewogCQkJaWYgKHN0SWR4IDwgY2hpbGRDbnQpCkBAIC01MjQsMTQgKzUyNCwxNCBAQCBwcml2YXRlIHZvaWQgaW5zZXJ0Q2hpbGQoZmluYWwgaW50IHN0SWR4LCBmaW5hbCBEaXJDYWNoZVRyZWUgc3QpIHsKIAkJY2hpbGRDbnQrKzsKIAl9CiAKLQlwcml2YXRlIHZvaWQgcmVtb3ZlQ2hpbGQoZmluYWwgaW50IHN0SWR4KSB7CisJcHJpdmF0ZSB2b2lkIHJlbW92ZUNoaWxkKGludCBzdElkeCkgewogCQlmaW5hbCBpbnQgbiA9IC0tY2hpbGRDbnQ7CiAJCWlmIChzdElkeCA8IG4pCiAJCQlTeXN0ZW0uYXJyYXljb3B5KGNoaWxkcmVuLCBzdElkeCArIDEsIGNoaWxkcmVuLCBzdElkeCwgbiAtIHN0SWR4KTsKIAkJY2hpbGRyZW5bbl0gPSBudWxsOwogCX0KIAotCXN0YXRpYyBib29sZWFuIHBlcShmaW5hbCBieXRlW10gYSwgZmluYWwgYnl0ZVtdIGIsIGludCBhTGVuKSB7CisJc3RhdGljIGJvb2xlYW4gcGVxKGJ5dGVbXSBhLCBieXRlW10gYiwgaW50IGFMZW4pIHsKIAkJaWYgKGIubGVuZ3RoIDwgYUxlbikKIAkJCXJldHVybiBmYWxzZTsKIAkJZm9yIChhTGVuLS07IGFMZW4gPj0gMDsgYUxlbi0tKQpAQCAtNTQwLDcgKzU0MCw3IEBAIHN0YXRpYyBib29sZWFuIHBlcShmaW5hbCBieXRlW10gYSwgZmluYWwgYnl0ZVtdIGIsIGludCBhTGVuKSB7CiAJCXJldHVybiB0cnVlOwogCX0KIAotCXByaXZhdGUgc3RhdGljIGludCBuYW1lY21wKGZpbmFsIGJ5dGVbXSBhLCBpbnQgYVBvcywgZmluYWwgRGlyQ2FjaGVUcmVlIGN0KSB7CisJcHJpdmF0ZSBzdGF0aWMgaW50IG5hbWVjbXAoYnl0ZVtdIGEsIGludCBhUG9zLCBEaXJDYWNoZVRyZWUgY3QpIHsKIAkJaWYgKGN0ID09IG51bGwpCiAJCQlyZXR1cm4gLTE7CiAJCWZpbmFsIGJ5dGVbXSBiID0gY3QuZW5jb2RlZE5hbWU7CkBAIC01NTcsNyArNTU3LDcgQEAgcHJpdmF0ZSBzdGF0aWMgaW50IG5hbWVjbXAoZmluYWwgYnl0ZVtdIGEsIGludCBhUG9zLCBmaW5hbCBEaXJDYWNoZVRyZWUgY3QpIHsKIAkJcmV0dXJuIGFMZW4gLSBiTGVuOwogCX0KIAotCXByaXZhdGUgc3RhdGljIGludCBzbGFzaChmaW5hbCBieXRlW10gYSwgaW50IGFQb3MpIHsKKwlwcml2YXRlIHN0YXRpYyBpbnQgc2xhc2goYnl0ZVtdIGEsIGludCBhUG9zKSB7CiAJCWZpbmFsIGludCBhTGVuID0gYS5sZW5ndGg7CiAJCWZvciAoOyBhUG9zIDwgYUxlbjsgYVBvcysrKQogCQkJaWYgKGFbYVBvc10gPT0gJy8nKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvQ29tcG91bmRFeGNlcHRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL0NvbXBvdW5kRXhjZXB0aW9uLmphdmEKaW5kZXggNjJmZjk5MC4uMWRmNzBlMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvQ29tcG91bmRFeGNlcHRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9Db21wb3VuZEV4Y2VwdGlvbi5qYXZhCkBAIC01NiwxMCArNTYsMTAgQEAKIHB1YmxpYyBjbGFzcyBDb21wb3VuZEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7CiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CiAKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZm9ybWF0KGZpbmFsIENvbGxlY3Rpb248VGhyb3dhYmxlPiBjYXVzZXMpIHsKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZm9ybWF0KENvbGxlY3Rpb248VGhyb3dhYmxlPiBjYXVzZXMpIHsKIAkJZmluYWwgU3RyaW5nQnVpbGRlciBtc2cgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogCQltc2cuYXBwZW5kKEpHaXRUZXh0LmdldCgpLmZhaWx1cmVEdWVUb09uZU9mVGhlRm9sbG93aW5nKTsKLQkJZm9yIChmaW5hbCBUaHJvd2FibGUgYyA6IGNhdXNlcykgeworCQlmb3IgKFRocm93YWJsZSBjIDogY2F1c2VzKSB7CiAJCQltc2cuYXBwZW5kKCIgICIpOyAvLyROT04tTkxTLTEkCiAJCQltc2cuYXBwZW5kKGMuZ2V0TWVzc2FnZSgpKTsKIAkJCW1zZy5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKQEAgLTc1LDcgKzc1LDcgQEAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZvcm1hdChmaW5hbCBDb2xsZWN0aW9uPFRocm93YWJsZT4gY2F1c2VzKSB7CiAJICogQHBhcmFtIHdoeQogCSAqICAgICAgICAgICAgVHdvIG9yIG1vcmUgZXhjZXB0aW9ucyB0aGF0IG1heSBoYXZlIGJlZW4gdGhlIHByb2JsZW0uCiAJICovCi0JcHVibGljIENvbXBvdW5kRXhjZXB0aW9uKGZpbmFsIENvbGxlY3Rpb248VGhyb3dhYmxlPiB3aHkpIHsKKwlwdWJsaWMgQ29tcG91bmRFeGNlcHRpb24oQ29sbGVjdGlvbjxUaHJvd2FibGU+IHdoeSkgewogCQlzdXBlcihmb3JtYXQod2h5KSk7CiAJCWNhdXNlTGlzdCA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QobmV3IEFycmF5TGlzdDw+KHdoeSkpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL0NvbmZpZ0ludmFsaWRFeGNlcHRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL0NvbmZpZ0ludmFsaWRFeGNlcHRpb24uamF2YQppbmRleCBhN2UxZDAyLi4yNGY0M2NmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9Db25maWdJbnZhbGlkRXhjZXB0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvQ29uZmlnSW52YWxpZEV4Y2VwdGlvbi5qYXZhCkBAIC01NSw3ICs1NSw3IEBAIHB1YmxpYyBjbGFzcyBDb25maWdJbnZhbGlkRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKIAkgKiBAcGFyYW0gbWVzc2FnZQogCSAqICAgICAgICAgICAgd2h5IHRoZSBjb25maWd1cmF0aW9uIGlzIGludmFsaWQuCiAJICovCi0JcHVibGljIENvbmZpZ0ludmFsaWRFeGNlcHRpb24oZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKKwlwdWJsaWMgQ29uZmlnSW52YWxpZEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewogCQlzdXBlcihtZXNzYWdlKTsKIAl9CiAKQEAgLTY3LDcgKzY3LDcgQEAgcHVibGljIENvbmZpZ0ludmFsaWRFeGNlcHRpb24oZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKIAkgKiBAcGFyYW0gY2F1c2UKIAkgKiAgICAgICAgICAgIHJvb3QgY2F1c2Ugb2YgdGhlIGVycm9yLgogCSAqLwotCXB1YmxpYyBDb25maWdJbnZhbGlkRXhjZXB0aW9uKGZpbmFsIFN0cmluZyBtZXNzYWdlLCBmaW5hbCBUaHJvd2FibGUgY2F1c2UpIHsKKwlwdWJsaWMgQ29uZmlnSW52YWxpZEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7CiAJCXN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9FbnRyeUV4aXN0c0V4Y2VwdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvRW50cnlFeGlzdHNFeGNlcHRpb24uamF2YQppbmRleCA4ZGQwZDUzLi5iOTdkMjM3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9FbnRyeUV4aXN0c0V4Y2VwdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL0VudHJ5RXhpc3RzRXhjZXB0aW9uLmphdmEKQEAgLTYxLDcgKzYxLDcgQEAgcHVibGljIGNsYXNzIEVudHJ5RXhpc3RzRXhjZXB0aW9uIGV4dGVuZHMgSU9FeGNlcHRpb24gewogCSAqCiAJICogQHBhcmFtIG5hbWUgd29ya2RpciByZWxhdGl2ZSBmaWxlIG5hbWUKIAkgKi8KLQlwdWJsaWMgRW50cnlFeGlzdHNFeGNlcHRpb24oZmluYWwgU3RyaW5nIG5hbWUpIHsKKwlwdWJsaWMgRW50cnlFeGlzdHNFeGNlcHRpb24oU3RyaW5nIG5hbWUpIHsKIAkJc3VwZXIoTWVzc2FnZUZvcm1hdC5mb3JtYXQoSkdpdFRleHQuZ2V0KCkudHJlZUVudHJ5QWxyZWFkeUV4aXN0cywgbmFtZSkpOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL0lsbGVnYWxUb2RvRmlsZU1vZGlmaWNhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvSWxsZWdhbFRvZG9GaWxlTW9kaWZpY2F0aW9uLmphdmEKaW5kZXggYTY0NzEyMS4uNzg1Y2I5NSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvSWxsZWdhbFRvZG9GaWxlTW9kaWZpY2F0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvSWxsZWdhbFRvZG9GaWxlTW9kaWZpY2F0aW9uLmphdmEKQEAgLTU2LDcgKzU2LDcgQEAgcHVibGljIGNsYXNzIElsbGVnYWxUb2RvRmlsZU1vZGlmaWNhdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7CiAJICogQHBhcmFtIG1zZwogCSAqICAgICAgICAgICAgZXJyb3IgbWVzc2FnZQogCSAqLwotCXB1YmxpYyBJbGxlZ2FsVG9kb0ZpbGVNb2RpZmljYXRpb24oZmluYWwgU3RyaW5nIG1zZykgeworCXB1YmxpYyBJbGxlZ2FsVG9kb0ZpbGVNb2RpZmljYXRpb24oU3RyaW5nIG1zZykgewogCQlzdXBlcihtc2cpOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL0luY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL0luY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24uamF2YQppbmRleCA3YmEzYTAwLi41YWJkMGMzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9JbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbi5qYXZhCkBAIC03MCw3ICs3MCw3IEBAIHB1YmxpYyBjbGFzcyBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uIGV4dGVuZHMgSU9FeGNlcHRpb24gewogCSAqIEBwYXJhbSBpZCBTSEEtMQogCSAqIEBwYXJhbSB0eXBlIG9iamVjdCB0eXBlCiAJICovCi0JcHVibGljIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24oZmluYWwgT2JqZWN0SWQgaWQsIGZpbmFsIFN0cmluZyB0eXBlKSB7CisJcHVibGljIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24oT2JqZWN0SWQgaWQsIFN0cmluZyB0eXBlKSB7CiAJCXN1cGVyKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpHaXRUZXh0LmdldCgpLm9iamVjdElzTm90QSwgaWQubmFtZSgpLCB0eXBlKSk7CiAJfQogCkBAIC04Miw3ICs4Miw3IEBAIHB1YmxpYyBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uKGZpbmFsIE9iamVjdElkIGlkLCBmaW5hbCBTdHJpbmcgdHlwZSkgewogCSAqIEBwYXJhbSBpZCBTSEEtMQogCSAqIEBwYXJhbSB0eXBlIG9iamVjdCB0eXBlCiAJICovCi0JcHVibGljIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24oZmluYWwgT2JqZWN0SWQgaWQsIGZpbmFsIGludCB0eXBlKSB7CisJcHVibGljIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24oT2JqZWN0SWQgaWQsIGludCB0eXBlKSB7CiAJCXRoaXMoaWQsIENvbnN0YW50cy50eXBlU3RyaW5nKHR5cGUpKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9JbmRleFJlYWRFeGNlcHRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL0luZGV4UmVhZEV4Y2VwdGlvbi5qYXZhCmluZGV4IDcwZjY1MGQuLmUwN2QzMDggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL0luZGV4UmVhZEV4Y2VwdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL0luZGV4UmVhZEV4Y2VwdGlvbi5qYXZhCkBAIC02Myw3ICs2Myw3IEBAIHB1YmxpYyBJbmRleFJlYWRFeGNlcHRpb24oKSB7CiAJICogQHBhcmFtIHMKIAkgKiAgICAgICAgICAgIG1lc3NhZ2UKIAkgKi8KLQlwdWJsaWMgSW5kZXhSZWFkRXhjZXB0aW9uKGZpbmFsIFN0cmluZyBzKSB7CisJcHVibGljIEluZGV4UmVhZEV4Y2VwdGlvbihTdHJpbmcgcykgewogCQlzdXBlcihzKTsKIAl9CiAKQEAgLTc1LDcgKzc1LDcgQEAgcHVibGljIEluZGV4UmVhZEV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgcykgewogCSAqIEBwYXJhbSBjYXVzZQogCSAqICAgICAgICAgICAgcm9vdCBjYXVzZSBleGNlcHRpb24KIAkgKi8KLQlwdWJsaWMgSW5kZXhSZWFkRXhjZXB0aW9uKGZpbmFsIFN0cmluZyBzLCBmaW5hbCBUaHJvd2FibGUgY2F1c2UpIHsKKwlwdWJsaWMgSW5kZXhSZWFkRXhjZXB0aW9uKFN0cmluZyBzLCBUaHJvd2FibGUgY2F1c2UpIHsKIAkJc3VwZXIocyk7CiAJCWluaXRDYXVzZShjYXVzZSk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvSW5kZXhXcml0ZUV4Y2VwdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvSW5kZXhXcml0ZUV4Y2VwdGlvbi5qYXZhCmluZGV4IGRlMTljMDYuLjM0ZmQ3YTggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL0luZGV4V3JpdGVFeGNlcHRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9JbmRleFdyaXRlRXhjZXB0aW9uLmphdmEKQEAgLTYwLDcgKzYwLDcgQEAgcHVibGljIEluZGV4V3JpdGVFeGNlcHRpb24oKSB7CiAJICoKIAkgKiBAcGFyYW0gcyBtZXNzYWdlCiAJICovCi0JcHVibGljIEluZGV4V3JpdGVFeGNlcHRpb24oZmluYWwgU3RyaW5nIHMpIHsKKwlwdWJsaWMgSW5kZXhXcml0ZUV4Y2VwdGlvbihTdHJpbmcgcykgewogCQlzdXBlcihzKTsKIAl9CiAKQEAgLTcwLDcgKzcwLDcgQEAgcHVibGljIEluZGV4V3JpdGVFeGNlcHRpb24oZmluYWwgU3RyaW5nIHMpIHsKIAkgKiBAcGFyYW0gcyBtZXNzYWdlCiAJICogQHBhcmFtIGNhdXNlIHJvb3QgY2F1c2UgZXhjZXB0aW9uCiAJICovCi0JcHVibGljIEluZGV4V3JpdGVFeGNlcHRpb24oZmluYWwgU3RyaW5nIHMsIGZpbmFsIFRocm93YWJsZSBjYXVzZSkgeworCXB1YmxpYyBJbmRleFdyaXRlRXhjZXB0aW9uKFN0cmluZyBzLCBUaHJvd2FibGUgY2F1c2UpIHsKIAkJc3VwZXIocyk7CiAJCWluaXRDYXVzZShjYXVzZSk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvTWlzc2luZ0J1bmRsZVByZXJlcXVpc2l0ZUV4Y2VwdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvTWlzc2luZ0J1bmRsZVByZXJlcXVpc2l0ZUV4Y2VwdGlvbi5qYXZhCmluZGV4IDA5YmI0YTkuLmIzN2QyMGQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL01pc3NpbmdCdW5kbGVQcmVyZXF1aXNpdGVFeGNlcHRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9NaXNzaW5nQnVuZGxlUHJlcmVxdWlzaXRlRXhjZXB0aW9uLmphdmEKQEAgLTU2LDEwICs1NiwxMCBAQAogcHVibGljIGNsYXNzIE1pc3NpbmdCdW5kbGVQcmVyZXF1aXNpdGVFeGNlcHRpb24gZXh0ZW5kcyBUcmFuc3BvcnRFeGNlcHRpb24gewogCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwogCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZvcm1hdChmaW5hbCBNYXA8T2JqZWN0SWQsIFN0cmluZz4gbWlzc2luZ0NvbW1pdHMpIHsKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZm9ybWF0KE1hcDxPYmplY3RJZCwgU3RyaW5nPiBtaXNzaW5nQ29tbWl0cykgewogCQlmaW5hbCBTdHJpbmdCdWlsZGVyIHIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogCQlyLmFwcGVuZChKR2l0VGV4dC5nZXQoKS5taXNzaW5nUHJlcmVxdWlzaXRlQ29tbWl0cyk7Ci0JCWZvciAoZmluYWwgTWFwLkVudHJ5PE9iamVjdElkLCBTdHJpbmc+IGUgOiBtaXNzaW5nQ29tbWl0cy5lbnRyeVNldCgpKSB7CisJCWZvciAoTWFwLkVudHJ5PE9iamVjdElkLCBTdHJpbmc+IGUgOiBtaXNzaW5nQ29tbWl0cy5lbnRyeVNldCgpKSB7CiAJCQlyLmFwcGVuZCgiXG4gICIpOyAvLyROT04tTkxTLTEkCiAJCQlyLmFwcGVuZChlLmdldEtleSgpLm5hbWUoKSk7CiAJCQlpZiAoZS5nZXRWYWx1ZSgpICE9IG51bGwpCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9NaXNzaW5nT2JqZWN0RXhjZXB0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9NaXNzaW5nT2JqZWN0RXhjZXB0aW9uLmphdmEKaW5kZXggZjZhYTA5Mi4uYzZjNDdmOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvTWlzc2luZ09iamVjdEV4Y2VwdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL01pc3NpbmdPYmplY3RFeGNlcHRpb24uamF2YQpAQCAtNjksNyArNjksNyBAQCBwdWJsaWMgY2xhc3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiBleHRlbmRzIElPRXhjZXB0aW9uIHsKIAkgKiBAcGFyYW0gaWQgU0hBLTEKIAkgKiBAcGFyYW0gdHlwZSBvYmplY3QgdHlwZQogCSAqLwotCXB1YmxpYyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uKGZpbmFsIE9iamVjdElkIGlkLCBmaW5hbCBTdHJpbmcgdHlwZSkgeworCXB1YmxpYyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uKE9iamVjdElkIGlkLCBTdHJpbmcgdHlwZSkgewogCQlzdXBlcihNZXNzYWdlRm9ybWF0LmZvcm1hdChKR2l0VGV4dC5nZXQoKS5taXNzaW5nT2JqZWN0LCB0eXBlLCBpZC5uYW1lKCkpKTsKIAkJbWlzc2luZyA9IGlkLmNvcHkoKTsKIAl9CkBAIC04MSw3ICs4MSw3IEBAIHB1YmxpYyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uKGZpbmFsIE9iamVjdElkIGlkLCBmaW5hbCBTdHJpbmcgdHlwZSkgewogCSAqIEBwYXJhbSBpZCBTSEEtMQogCSAqIEBwYXJhbSB0eXBlIG9iamVjdCB0eXBlCiAJICovCi0JcHVibGljIE1pc3NpbmdPYmplY3RFeGNlcHRpb24oZmluYWwgT2JqZWN0SWQgaWQsIGZpbmFsIGludCB0eXBlKSB7CisJcHVibGljIE1pc3NpbmdPYmplY3RFeGNlcHRpb24oT2JqZWN0SWQgaWQsIGludCB0eXBlKSB7CiAJCXRoaXMoaWQsIENvbnN0YW50cy50eXBlU3RyaW5nKHR5cGUpKTsKIAl9CiAKQEAgLTk0LDcgKzk0LDcgQEAgcHVibGljIE1pc3NpbmdPYmplY3RFeGNlcHRpb24oZmluYWwgT2JqZWN0SWQgaWQsIGZpbmFsIGludCB0eXBlKSB7CiAJICogQHBhcmFtIHR5cGUKIAkgKiAgICAgICAgICAgIG9iamVjdCB0eXBlCiAJICovCi0JcHVibGljIE1pc3NpbmdPYmplY3RFeGNlcHRpb24oZmluYWwgQWJicmV2aWF0ZWRPYmplY3RJZCBpZCwgZmluYWwgaW50IHR5cGUpIHsKKwlwdWJsaWMgTWlzc2luZ09iamVjdEV4Y2VwdGlvbihBYmJyZXZpYXRlZE9iamVjdElkIGlkLCBpbnQgdHlwZSkgewogCQlzdXBlcihNZXNzYWdlRm9ybWF0LmZvcm1hdChKR2l0VGV4dC5nZXQoKS5taXNzaW5nT2JqZWN0LCBDb25zdGFudHMKIAkJCQkudHlwZVN0cmluZyh0eXBlKSwgaWQubmFtZSgpKSk7CiAJCW1pc3NpbmcgPSBudWxsOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvTm9QYWNrU2lnbmF0dXJlRXhjZXB0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9Ob1BhY2tTaWduYXR1cmVFeGNlcHRpb24uamF2YQppbmRleCAyOGU5Nzg4Li44YzJlODcyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9Ob1BhY2tTaWduYXR1cmVFeGNlcHRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9Ob1BhY2tTaWduYXR1cmVFeGNlcHRpb24uamF2YQpAQCAtNjAsNyArNjAsNyBAQCBwdWJsaWMgY2xhc3MgTm9QYWNrU2lnbmF0dXJlRXhjZXB0aW9uIGV4dGVuZHMgSU9FeGNlcHRpb24gewogCSAqIEBwYXJhbSB3aHkKIAkgKiAgICAgICAgICAgIGRlc2NyaXB0aW9uIG9mIHRoZSB0eXBlIG9mIGVycm9yLgogCSAqLwotCXB1YmxpYyBOb1BhY2tTaWduYXR1cmVFeGNlcHRpb24oZmluYWwgU3RyaW5nIHdoeSkgeworCXB1YmxpYyBOb1BhY2tTaWduYXR1cmVFeGNlcHRpb24oU3RyaW5nIHdoeSkgewogCQlzdXBlcih3aHkpOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL05vUmVtb3RlUmVwb3NpdG9yeUV4Y2VwdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvTm9SZW1vdGVSZXBvc2l0b3J5RXhjZXB0aW9uLmphdmEKaW5kZXggZmUwNzNkNS4uNTI0OTY4ZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvTm9SZW1vdGVSZXBvc2l0b3J5RXhjZXB0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvTm9SZW1vdGVSZXBvc2l0b3J5RXhjZXB0aW9uLmphdmEKQEAgLTU5LDcgKzU5LDcgQEAgcHVibGljIGNsYXNzIE5vUmVtb3RlUmVwb3NpdG9yeUV4Y2VwdGlvbiBleHRlbmRzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAJICogQHBhcmFtIHMKIAkgKiAgICAgICAgICAgIG1lc3NhZ2UKIAkgKi8KLQlwdWJsaWMgTm9SZW1vdGVSZXBvc2l0b3J5RXhjZXB0aW9uKGZpbmFsIFVSSWlzaCB1cmksIGZpbmFsIFN0cmluZyBzKSB7CisJcHVibGljIE5vUmVtb3RlUmVwb3NpdG9yeUV4Y2VwdGlvbihVUklpc2ggdXJpLCBTdHJpbmcgcykgewogCQlzdXBlcih1cmksIHMpOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL05vdFN1cHBvcnRlZEV4Y2VwdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvTm90U3VwcG9ydGVkRXhjZXB0aW9uLmphdmEKaW5kZXggMTI0NjgwZS4uMTE0ZTY2MiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvTm90U3VwcG9ydGVkRXhjZXB0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvTm90U3VwcG9ydGVkRXhjZXB0aW9uLmphdmEKQEAgLTU4LDcgKzU4LDcgQEAgcHVibGljIGNsYXNzIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBleHRlbmRzIElPRXhjZXB0aW9uIHsKIAkgKgogCSAqIEBwYXJhbSBzIG1lc3NhZ2UgZGVzY3JpYmluZyB0aGUgaXNzdWUKIAkgKi8KLQlwdWJsaWMgTm90U3VwcG9ydGVkRXhjZXB0aW9uKGZpbmFsIFN0cmluZyBzKSB7CisJcHVibGljIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbihTdHJpbmcgcykgewogCQlzdXBlcihzKTsKIAl9CiAKQEAgLTcwLDcgKzcwLDcgQEAgcHVibGljIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgcykgewogCSAqIEBwYXJhbSB3aHkKIAkgKiAgICAgICAgICAgIGEgbG93ZXIgbGV2ZWwgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgaXNzdWUuCiAJICovCi0JcHVibGljIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgcywgZmluYWwgVGhyb3dhYmxlIHdoeSkgeworCXB1YmxpYyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oU3RyaW5nIHMsIFRocm93YWJsZSB3aHkpIHsKIAkJc3VwZXIocyk7CiAJCWluaXRDYXVzZSh3aHkpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL09iamVjdFdyaXRpbmdFeGNlcHRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL09iamVjdFdyaXRpbmdFeGNlcHRpb24uamF2YQppbmRleCA4YWYxOTkxLi5iYmVlNDJmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9PYmplY3RXcml0aW5nRXhjZXB0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvT2JqZWN0V3JpdGluZ0V4Y2VwdGlvbi5qYXZhCkBAIC01OCw3ICs1OCw3IEBAIHB1YmxpYyBjbGFzcyBPYmplY3RXcml0aW5nRXhjZXB0aW9uIGV4dGVuZHMgSU9FeGNlcHRpb24gewogCSAqCiAJICogQHBhcmFtIHMgbWVzc2FnZQogCSAqLwotCXB1YmxpYyBPYmplY3RXcml0aW5nRXhjZXB0aW9uKGZpbmFsIFN0cmluZyBzKSB7CisJcHVibGljIE9iamVjdFdyaXRpbmdFeGNlcHRpb24oU3RyaW5nIHMpIHsKIAkJc3VwZXIocyk7CiAJfQogCkBAIC02OCw3ICs2OCw3IEBAIHB1YmxpYyBPYmplY3RXcml0aW5nRXhjZXB0aW9uKGZpbmFsIFN0cmluZyBzKSB7CiAJICogQHBhcmFtIHMgbWVzc2FnZQogCSAqIEBwYXJhbSBjYXVzZSByb290IGNhdXNlIGV4Y2VwdGlvbgogCSAqLwotCXB1YmxpYyBPYmplY3RXcml0aW5nRXhjZXB0aW9uKGZpbmFsIFN0cmluZyBzLCBmaW5hbCBUaHJvd2FibGUgY2F1c2UpIHsKKwlwdWJsaWMgT2JqZWN0V3JpdGluZ0V4Y2VwdGlvbihTdHJpbmcgcywgVGhyb3dhYmxlIGNhdXNlKSB7CiAJCXN1cGVyKHMpOwogCQlpbml0Q2F1c2UoY2F1c2UpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1BhY2tJbnZhbGlkRXhjZXB0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9QYWNrSW52YWxpZEV4Y2VwdGlvbi5qYXZhCmluZGV4IDk4ODZlMTUuLmE4M2RlMDYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1BhY2tJbnZhbGlkRXhjZXB0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvUGFja0ludmFsaWRFeGNlcHRpb24uamF2YQpAQCAtNjEsNyArNjEsNyBAQCBwdWJsaWMgY2xhc3MgUGFja0ludmFsaWRFeGNlcHRpb24gZXh0ZW5kcyBJT0V4Y2VwdGlvbiB7CiAJICogQHBhcmFtIHBhdGgKIAkgKiAgICAgICAgICAgIHBhdGggb2YgdGhlIGludmFsaWQgcGFjayBmaWxlLgogCSAqLwotCXB1YmxpYyBQYWNrSW52YWxpZEV4Y2VwdGlvbihmaW5hbCBGaWxlIHBhdGgpIHsKKwlwdWJsaWMgUGFja0ludmFsaWRFeGNlcHRpb24oRmlsZSBwYXRoKSB7CiAJCXRoaXMocGF0aC5nZXRBYnNvbHV0ZVBhdGgoKSk7CiAJfQogCkBAIC03MSw3ICs3MSw3IEBAIHB1YmxpYyBQYWNrSW52YWxpZEV4Y2VwdGlvbihmaW5hbCBGaWxlIHBhdGgpIHsKIAkgKiBAcGFyYW0gcGF0aAogCSAqICAgICAgICAgICAgcGF0aCBvZiB0aGUgaW52YWxpZCBwYWNrIGZpbGUuCiAJICovCi0JcHVibGljIFBhY2tJbnZhbGlkRXhjZXB0aW9uKGZpbmFsIFN0cmluZyBwYXRoKSB7CisJcHVibGljIFBhY2tJbnZhbGlkRXhjZXB0aW9uKFN0cmluZyBwYXRoKSB7CiAJCXN1cGVyKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpHaXRUZXh0LmdldCgpLnBhY2tGaWxlSW52YWxpZCwgcGF0aCkpOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1BhY2tNaXNtYXRjaEV4Y2VwdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvUGFja01pc21hdGNoRXhjZXB0aW9uLmphdmEKaW5kZXggNWI5YTRiOS4uZWExZTY1YiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvUGFja01pc21hdGNoRXhjZXB0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvUGFja01pc21hdGNoRXhjZXB0aW9uLmphdmEKQEAgLTU3LDcgKzU3LDcgQEAgcHVibGljIGNsYXNzIFBhY2tNaXNtYXRjaEV4Y2VwdGlvbiBleHRlbmRzIElPRXhjZXB0aW9uIHsKIAkgKiBAcGFyYW0gd2h5CiAJICogICAgICAgICAgICBkZXNjcmlwdGlvbiBvZiB0aGUgdHlwZSBvZiBlcnJvci4KIAkgKi8KLQlwdWJsaWMgUGFja01pc21hdGNoRXhjZXB0aW9uKGZpbmFsIFN0cmluZyB3aHkpIHsKKwlwdWJsaWMgUGFja01pc21hdGNoRXhjZXB0aW9uKFN0cmluZyB3aHkpIHsKIAkJc3VwZXIod2h5KTsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9QYWNrUHJvdG9jb2xFeGNlcHRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1BhY2tQcm90b2NvbEV4Y2VwdGlvbi5qYXZhCmluZGV4IDQ0YmMxNjQuLmRkMTM3NDAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1BhY2tQcm90b2NvbEV4Y2VwdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1BhY2tQcm90b2NvbEV4Y2VwdGlvbi5qYXZhCkBAIC02Miw3ICs2Miw3IEBAIHB1YmxpYyBjbGFzcyBQYWNrUHJvdG9jb2xFeGNlcHRpb24gZXh0ZW5kcyBUcmFuc3BvcnRFeGNlcHRpb24gewogCSAqIEBwYXJhbSBzCiAJICogICAgICAgICAgICBtZXNzYWdlLCB3aGljaCBtYXkgYmUgc2hvd24gdG8gYW4gZW5kLXVzZXIuCiAJICovCi0JcHVibGljIFBhY2tQcm90b2NvbEV4Y2VwdGlvbihmaW5hbCBVUklpc2ggdXJpLCBmaW5hbCBTdHJpbmcgcykgeworCXB1YmxpYyBQYWNrUHJvdG9jb2xFeGNlcHRpb24oVVJJaXNoIHVyaSwgU3RyaW5nIHMpIHsKIAkJc3VwZXIodXJpICsgIjogIiArIHMpOyAvLyROT04tTkxTLTEkCiAJfQogCkBAIC04OCw3ICs4OCw3IEBAIHB1YmxpYyBQYWNrUHJvdG9jb2xFeGNlcHRpb24oZmluYWwgVVJJaXNoIHVyaSwgZmluYWwgU3RyaW5nIHMsCiAJICogQHBhcmFtIHMKIAkgKiAgICAgICAgICAgIG1lc3NhZ2UsIHdoaWNoIG1heSBiZSBzaG93biB0byBhbiBlbmQtdXNlci4KIAkgKi8KLQlwdWJsaWMgUGFja1Byb3RvY29sRXhjZXB0aW9uKGZpbmFsIFN0cmluZyBzKSB7CisJcHVibGljIFBhY2tQcm90b2NvbEV4Y2VwdGlvbihTdHJpbmcgcykgewogCQlzdXBlcihzKTsKIAl9CiAKQEAgLTEwMCw3ICsxMDAsNyBAQCBwdWJsaWMgUGFja1Byb3RvY29sRXhjZXB0aW9uKGZpbmFsIFN0cmluZyBzKSB7CiAJICogQHBhcmFtIGNhdXNlCiAJICogICAgICAgICAgICByb290IGNhdXNlIGV4Y2VwdGlvbgogCSAqLwotCXB1YmxpYyBQYWNrUHJvdG9jb2xFeGNlcHRpb24oZmluYWwgU3RyaW5nIHMsIGZpbmFsIFRocm93YWJsZSBjYXVzZSkgeworCXB1YmxpYyBQYWNrUHJvdG9jb2xFeGNlcHRpb24oU3RyaW5nIHMsIFRocm93YWJsZSBjYXVzZSkgewogCQlzdXBlcihzKTsKIAkJaW5pdENhdXNlKGNhdXNlKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9SZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1JlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbi5qYXZhCmluZGV4IGFhYmI0NmEuLjA0ZmQ4ZWEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1JlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1JlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbi5qYXZhCkBAIC02MCw3ICs2MCw3IEBAIHB1YmxpYyBjbGFzcyBSZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb24gZXh0ZW5kcyBUcmFuc3BvcnRFeGNlcHRpb24gewogCSAqIEBwYXJhbSBsb2NhdGlvbgogCSAqICAgICAgICAgICAgZGVzY3JpcHRpb24gb2YgdGhlIHJlcG9zaXRvcnkgbm90IGZvdW5kLCB1c3VhbGx5IGZpbGUgcGF0aC4KIAkgKi8KLQlwdWJsaWMgUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uKGZpbmFsIEZpbGUgbG9jYXRpb24pIHsKKwlwdWJsaWMgUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uKEZpbGUgbG9jYXRpb24pIHsKIAkJdGhpcyhsb2NhdGlvbi5nZXRQYXRoKCkpOwogCX0KIApAQCAtNzIsNyArNzIsNyBAQCBwdWJsaWMgUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uKGZpbmFsIEZpbGUgbG9jYXRpb24pIHsKIAkgKiBAcGFyYW0gd2h5CiAJICogICAgICAgICAgICB3aHkgdGhlIHJlcG9zaXRvcnkgZG9lcyBub3QgZXhpc3QuCiAJICovCi0JcHVibGljIFJlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbihmaW5hbCBGaWxlIGxvY2F0aW9uLCBUaHJvd2FibGUgd2h5KSB7CisJcHVibGljIFJlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbihGaWxlIGxvY2F0aW9uLCBUaHJvd2FibGUgd2h5KSB7CiAJCXRoaXMobG9jYXRpb24uZ2V0UGF0aCgpLCB3aHkpOwogCX0KIApAQCAtODIsNyArODIsNyBAQCBwdWJsaWMgUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uKGZpbmFsIEZpbGUgbG9jYXRpb24sIFRocm93YWJsZSB3aHkpIHsKIAkgKiBAcGFyYW0gbG9jYXRpb24KIAkgKiAgICAgICAgICAgIGRlc2NyaXB0aW9uIG9mIHRoZSByZXBvc2l0b3J5IG5vdCBmb3VuZCwgdXN1YWxseSBmaWxlIHBhdGguCiAJICovCi0JcHVibGljIFJlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgbG9jYXRpb24pIHsKKwlwdWJsaWMgUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uKFN0cmluZyBsb2NhdGlvbikgewogCQlzdXBlcihtZXNzYWdlKGxvY2F0aW9uKSk7CiAJfQogCkBAIC05OCw3ICs5OCw3IEBAIHB1YmxpYyBSZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb24oU3RyaW5nIGxvY2F0aW9uLCBUaHJvd2FibGUgd2h5KSB7CiAJCXN1cGVyKG1lc3NhZ2UobG9jYXRpb24pLCB3aHkpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBtZXNzYWdlKGZpbmFsIFN0cmluZyBsb2NhdGlvbikgeworCXByaXZhdGUgc3RhdGljIFN0cmluZyBtZXNzYWdlKFN0cmluZyBsb2NhdGlvbikgewogCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoSkdpdFRleHQuZ2V0KCkucmVwb3NpdG9yeU5vdEZvdW5kLCBsb2NhdGlvbik7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvUmV2V2Fsa0V4Y2VwdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvUmV2V2Fsa0V4Y2VwdGlvbi5qYXZhCmluZGV4IDgyNjU0ZTguLmY2ODUyYjUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1JldldhbGtFeGNlcHRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9SZXZXYWxrRXhjZXB0aW9uLmphdmEKQEAgLTY1LDcgKzY1LDcgQEAgcHVibGljIGNsYXNzIFJldldhbGtFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKIAkgKiBAcGFyYW0gY2F1c2UKIAkgKiAgICAgICAgICAgIHRoZSBjaGVja2VkIGV4Y2VwdGlvbiB0aGF0IGRlc2NyaWJlcyB3aHkgdGhlIHdhbGsgZmFpbGVkLgogCSAqLwotCXB1YmxpYyBSZXZXYWxrRXhjZXB0aW9uKGZpbmFsIFRocm93YWJsZSBjYXVzZSkgeworCXB1YmxpYyBSZXZXYWxrRXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgewogCQlzdXBlcihKR2l0VGV4dC5nZXQoKS53YWxrRmFpbHVyZSwgY2F1c2UpOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1N0b3JlZE9iamVjdFJlcHJlc2VudGF0aW9uTm90QXZhaWxhYmxlRXhjZXB0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9TdG9yZWRPYmplY3RSZXByZXNlbnRhdGlvbk5vdEF2YWlsYWJsZUV4Y2VwdGlvbi5qYXZhCmluZGV4IDhmYTE0YzcuLjYxMWZkNjYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1N0b3JlZE9iamVjdFJlcHJlc2VudGF0aW9uTm90QXZhaWxhYmxlRXhjZXB0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvU3RvcmVkT2JqZWN0UmVwcmVzZW50YXRpb25Ob3RBdmFpbGFibGVFeGNlcHRpb24uamF2YQpAQCAtNTYsMjEgKzU2LDYgQEAgcHVibGljIGNsYXNzIFN0b3JlZE9iamVjdFJlcHJlc2VudGF0aW9uTm90QXZhaWxhYmxlRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKIAkgKgogCSAqIEBwYXJhbSBvdHAKIAkgKiAgICAgICAgICAgIHRoZSBvYmplY3Qgd2hvc2UgY3VycmVudCByZXByZXNlbnRhdGlvbiBpcyBubyBsb25nZXIgcHJlc2VudC4KLQkgKiBAZGVwcmVjYXRlZCB1c2UKLQkgKiAgICAgICAgICAgICB7QGxpbmsgI1N0b3JlZE9iamVjdFJlcHJlc2VudGF0aW9uTm90QXZhaWxhYmxlRXhjZXB0aW9uKE9iamVjdFRvUGFjaywgVGhyb3dhYmxlKX0KLQkgKiAgICAgICAgICAgICBpbnN0ZWFkLgotCSAqIEBzaW5jZSAzLjAKLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyBTdG9yZWRPYmplY3RSZXByZXNlbnRhdGlvbk5vdEF2YWlsYWJsZUV4Y2VwdGlvbihPYmplY3RUb1BhY2sgb3RwKSB7Ci0JCS8vIERvIG5vdGhpbmcuCi0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGVycm9yIGZvciBhbiBvYmplY3QuCi0JICoKLQkgKiBAcGFyYW0gb3RwCi0JICogICAgICAgICAgICB0aGUgb2JqZWN0IHdob3NlIGN1cnJlbnQgcmVwcmVzZW50YXRpb24gaXMgbm8gbG9uZ2VyIHByZXNlbnQuCiAJICogQHBhcmFtIGNhdXNlCiAJICogICAgICAgICAgICBjYXVzZQogCSAqIEBzaW5jZSA0LjEwCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9TeW1saW5rc05vdFN1cHBvcnRlZEV4Y2VwdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvU3ltbGlua3NOb3RTdXBwb3J0ZWRFeGNlcHRpb24uamF2YQppbmRleCA2MGQ3YWEwLi5kYzU5YzhjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9TeW1saW5rc05vdFN1cHBvcnRlZEV4Y2VwdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1N5bWxpbmtzTm90U3VwcG9ydGVkRXhjZXB0aW9uLmphdmEKQEAgLTU4LDcgKzU4LDcgQEAgcHVibGljIGNsYXNzIFN5bWxpbmtzTm90U3VwcG9ydGVkRXhjZXB0aW9uIGV4dGVuZHMgSU9FeGNlcHRpb24gewogCSAqCiAJICogQHBhcmFtIHMgbmFtZSBvZiBsaW5rIGluIHRyZWUgb3Igd29ya2RpcgogCSAqLwotCXB1YmxpYyBTeW1saW5rc05vdFN1cHBvcnRlZEV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgcykgeworCXB1YmxpYyBTeW1saW5rc05vdFN1cHBvcnRlZEV4Y2VwdGlvbihTdHJpbmcgcykgewogCQlzdXBlcihzKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9UcmFuc3BvcnRFeGNlcHRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1RyYW5zcG9ydEV4Y2VwdGlvbi5qYXZhCmluZGV4IDg2ZGVhODIuLjVmZWNmMGUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1RyYW5zcG9ydEV4Y2VwdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1RyYW5zcG9ydEV4Y2VwdGlvbi5qYXZhCkBAIC02NCw3ICs2NCw3IEBAIHB1YmxpYyBjbGFzcyBUcmFuc3BvcnRFeGNlcHRpb24gZXh0ZW5kcyBJT0V4Y2VwdGlvbiB7CiAJICogQHBhcmFtIHMKIAkgKiAgICAgICAgICAgIG1lc3NhZ2UKIAkgKi8KLQlwdWJsaWMgVHJhbnNwb3J0RXhjZXB0aW9uKGZpbmFsIFVSSWlzaCB1cmksIGZpbmFsIFN0cmluZyBzKSB7CisJcHVibGljIFRyYW5zcG9ydEV4Y2VwdGlvbihVUklpc2ggdXJpLCBTdHJpbmcgcykgewogCQlzdXBlcih1cmkuc2V0UGFzcyhudWxsKSArICI6ICIgKyBzKTsgLy8kTk9OLU5MUy0xJAogCX0KIApAQCAtOTAsNyArOTAsNyBAQCBwdWJsaWMgVHJhbnNwb3J0RXhjZXB0aW9uKGZpbmFsIFVSSWlzaCB1cmksIGZpbmFsIFN0cmluZyBzLAogCSAqIEBwYXJhbSBzCiAJICogICAgICAgICAgICBtZXNzYWdlCiAJICovCi0JcHVibGljIFRyYW5zcG9ydEV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgcykgeworCXB1YmxpYyBUcmFuc3BvcnRFeGNlcHRpb24oU3RyaW5nIHMpIHsKIAkJc3VwZXIocyk7CiAJfQogCkBAIC0xMDIsNyArMTAyLDcgQEAgcHVibGljIFRyYW5zcG9ydEV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgcykgewogCSAqIEBwYXJhbSBjYXVzZQogCSAqICAgICAgICAgICAgcm9vdCBjYXVzZSBleGNlcHRpb24KIAkgKi8KLQlwdWJsaWMgVHJhbnNwb3J0RXhjZXB0aW9uKGZpbmFsIFN0cmluZyBzLCBmaW5hbCBUaHJvd2FibGUgY2F1c2UpIHsKKwlwdWJsaWMgVHJhbnNwb3J0RXhjZXB0aW9uKFN0cmluZyBzLCBUaHJvd2FibGUgY2F1c2UpIHsKIAkJc3VwZXIocyk7CiAJCWluaXRDYXVzZShjYXVzZSk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvVW5tZXJnZWRQYXRoRXhjZXB0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9Vbm1lcmdlZFBhdGhFeGNlcHRpb24uamF2YQppbmRleCA0ZmM1MzRiLi42ZGU5MTUzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9Vbm1lcmdlZFBhdGhFeGNlcHRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9Vbm1lcmdlZFBhdGhFeGNlcHRpb24uamF2YQpAQCAtNjMsNyArNjMsNyBAQCBwdWJsaWMgY2xhc3MgVW5tZXJnZWRQYXRoRXhjZXB0aW9uIGV4dGVuZHMgSU9FeGNlcHRpb24gewogCSAqIEBwYXJhbSBkY2UKIAkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBub24temVybyBzdGFnZSBvZiB0aGUgdW5tZXJnZWQgcGF0aC4KIAkgKi8KLQlwdWJsaWMgVW5tZXJnZWRQYXRoRXhjZXB0aW9uKGZpbmFsIERpckNhY2hlRW50cnkgZGNlKSB7CisJcHVibGljIFVubWVyZ2VkUGF0aEV4Y2VwdGlvbihEaXJDYWNoZUVudHJ5IGRjZSkgewogCQlzdXBlcihNZXNzYWdlRm9ybWF0LmZvcm1hdChKR2l0VGV4dC5nZXQoKS51bm1lcmdlZFBhdGgsIGRjZS5nZXRQYXRoU3RyaW5nKCkpKTsKIAkJZW50cnkgPSBkY2U7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvVW5zdXBwb3J0ZWRDcmVkZW50aWFsSXRlbS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvVW5zdXBwb3J0ZWRDcmVkZW50aWFsSXRlbS5qYXZhCmluZGV4IDg4YzJlZjYuLjliYWI2ODcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1Vuc3VwcG9ydGVkQ3JlZGVudGlhbEl0ZW0uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9VbnN1cHBvcnRlZENyZWRlbnRpYWxJdGVtLmphdmEKQEAgLTYyLDcgKzYyLDcgQEAgcHVibGljIGNsYXNzIFVuc3VwcG9ydGVkQ3JlZGVudGlhbEl0ZW0gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKIAkgKiBAcGFyYW0gcwogCSAqICAgICAgICAgICAgbWVzc2FnZQogCSAqLwotCXB1YmxpYyBVbnN1cHBvcnRlZENyZWRlbnRpYWxJdGVtKGZpbmFsIFVSSWlzaCB1cmksIGZpbmFsIFN0cmluZyBzKSB7CisJcHVibGljIFVuc3VwcG9ydGVkQ3JlZGVudGlhbEl0ZW0oVVJJaXNoIHVyaSwgU3RyaW5nIHMpIHsKIAkJc3VwZXIodXJpLnNldFBhc3MobnVsbCkgKyAiOiAiICsgcyk7IC8vJE5PTi1OTFMtMSQKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9VbnN1cHBvcnRlZFBhY2tJbmRleFZlcnNpb25FeGNlcHRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1Vuc3VwcG9ydGVkUGFja0luZGV4VmVyc2lvbkV4Y2VwdGlvbi5qYXZhCmluZGV4IDBiN2NjZjUuLjBhNGZlZjEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1Vuc3VwcG9ydGVkUGFja0luZGV4VmVyc2lvbkV4Y2VwdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1Vuc3VwcG9ydGVkUGFja0luZGV4VmVyc2lvbkV4Y2VwdGlvbi5qYXZhCkBAIC02Miw3ICs2Miw3IEBAIHB1YmxpYyBjbGFzcyBVbnN1cHBvcnRlZFBhY2tJbmRleFZlcnNpb25FeGNlcHRpb24gZXh0ZW5kcyBJT0V4Y2VwdGlvbiB7CiAJICogQHBhcmFtIHZlcnNpb24KIAkgKiAgICAgICAgICAgIHBhY2sgaW5kZXggdmVyc2lvbgogCSAqLwotCXB1YmxpYyBVbnN1cHBvcnRlZFBhY2tJbmRleFZlcnNpb25FeGNlcHRpb24oZmluYWwgaW50IHZlcnNpb24pIHsKKwlwdWJsaWMgVW5zdXBwb3J0ZWRQYWNrSW5kZXhWZXJzaW9uRXhjZXB0aW9uKGludCB2ZXJzaW9uKSB7CiAJCXN1cGVyKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpHaXRUZXh0LmdldCgpLnVuc3VwcG9ydGVkUGFja0luZGV4VmVyc2lvbiwKIAkJCQlJbnRlZ2VyLnZhbHVlT2YodmVyc2lvbikpKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9VbnN1cHBvcnRlZFBhY2tWZXJzaW9uRXhjZXB0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9VbnN1cHBvcnRlZFBhY2tWZXJzaW9uRXhjZXB0aW9uLmphdmEKaW5kZXggMjM2MTE4Ni4uY2JmOGYzYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvVW5zdXBwb3J0ZWRQYWNrVmVyc2lvbkV4Y2VwdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1Vuc3VwcG9ydGVkUGFja1ZlcnNpb25FeGNlcHRpb24uamF2YQpAQCAtNjIsNyArNjIsNyBAQCBwdWJsaWMgY2xhc3MgVW5zdXBwb3J0ZWRQYWNrVmVyc2lvbkV4Y2VwdGlvbiBleHRlbmRzIElPRXhjZXB0aW9uIHsKIAkgKiBAcGFyYW0gdmVyc2lvbgogCSAqICAgICAgICAgICAgcGFjayB2ZXJzaW9uCiAJICovCi0JcHVibGljIFVuc3VwcG9ydGVkUGFja1ZlcnNpb25FeGNlcHRpb24oZmluYWwgbG9uZyB2ZXJzaW9uKSB7CisJcHVibGljIFVuc3VwcG9ydGVkUGFja1ZlcnNpb25FeGNlcHRpb24obG9uZyB2ZXJzaW9uKSB7CiAJCXN1cGVyKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpHaXRUZXh0LmdldCgpLnVuc3VwcG9ydGVkUGFja1ZlcnNpb24sCiAJCQkJTG9uZy52YWx1ZU9mKHZlcnNpb24pKSk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9ldmVudHMvSW5kZXhDaGFuZ2VkRXZlbnQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXZlbnRzL0luZGV4Q2hhbmdlZEV2ZW50LmphdmEKaW5kZXggNjQ3ZWM4YS4uZGNjZTg2YSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9ldmVudHMvSW5kZXhDaGFuZ2VkRXZlbnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2V2ZW50cy9JbmRleENoYW5nZWRFdmVudC5qYXZhCkBAIC00Nyw2ICs0NywyOCBAQAogICogRGVzY3JpYmVzIGEgY2hhbmdlIHRvIG9uZSBvciBtb3JlIHBhdGhzIGluIHRoZSBpbmRleCBmaWxlLgogICovCiBwdWJsaWMgY2xhc3MgSW5kZXhDaGFuZ2VkRXZlbnQgZXh0ZW5kcyBSZXBvc2l0b3J5RXZlbnQ8SW5kZXhDaGFuZ2VkTGlzdGVuZXI+IHsKKwlwcml2YXRlIGJvb2xlYW4gaW50ZXJuYWw7CisKKwkvKioKKwkgKiBOb3RpZnkgdGhhdCB0aGUgaW5kZXggY2hhbmdlZAorCSAqCisJICogQHBhcmFtIGludGVybmFsCisJICogICAgICAgICAgICAgICAgICAgICB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGluZGV4IHdhcyBjaGFuZ2VkIGJ5IHRoZSBzYW1lCisJICogICAgICAgICAgICAgICAgICAgICBKR2l0IHByb2Nlc3MKKwkgKiBAc2luY2UgNS4wCisJICovCisJcHVibGljIEluZGV4Q2hhbmdlZEV2ZW50KGJvb2xlYW4gaW50ZXJuYWwpIHsKKwkJdGhpcy5pbnRlcm5hbCA9IGludGVybmFsOworCX0KKworCS8qKgorCSAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBpbmRleCB3YXMgY2hhbmdlZCBieSB0aGUgc2FtZSBKR2l0IHByb2Nlc3MKKwkgKiBAc2luY2UgNS4wCisJICovCisJcHVibGljIGJvb2xlYW4gaXNJbnRlcm5hbCgpIHsKKwkJcmV0dXJuIGludGVybmFsOworCX0KKwogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCiAJcHVibGljIENsYXNzPEluZGV4Q2hhbmdlZExpc3RlbmVyPiBnZXRMaXN0ZW5lclR5cGUoKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ZubWF0Y2gvQ2hhcmFjdGVySGVhZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9mbm1hdGNoL0NoYXJhY3RlckhlYWQuamF2YQppbmRleCA5OGFlZTBlLi43MDM5YzNkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ZubWF0Y2gvQ2hhcmFjdGVySGVhZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZm5tYXRjaC9DaGFyYWN0ZXJIZWFkLmphdmEKQEAgLTUzLDE0ICs1MywxNCBAQCBmaW5hbCBjbGFzcyBDaGFyYWN0ZXJIZWFkIGV4dGVuZHMgQWJzdHJhY3RIZWFkIHsKIAkgKiBAcGFyYW0gZXhwZWN0ZWRDaGFyYWN0ZXIKIAkgKiAgICAgICAgICAgIGV4cGVjdGVkIHtAY29kZSBjaGFyfQogCSAqLwotCXByb3RlY3RlZCBDaGFyYWN0ZXJIZWFkKGZpbmFsIGNoYXIgZXhwZWN0ZWRDaGFyYWN0ZXIpIHsKKwlwcm90ZWN0ZWQgQ2hhcmFjdGVySGVhZChjaGFyIGV4cGVjdGVkQ2hhcmFjdGVyKSB7CiAJCXN1cGVyKGZhbHNlKTsKIAkJdGhpcy5leHBlY3RlZENoYXJhY3RlciA9IGV4cGVjdGVkQ2hhcmFjdGVyOwogCX0KIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gbWF0Y2hlcyhmaW5hbCBjaGFyIGMpIHsKKwlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBtYXRjaGVzKGNoYXIgYykgewogCQlyZXR1cm4gYyA9PSBleHBlY3RlZENoYXJhY3RlcjsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZm5tYXRjaC9GaWxlTmFtZU1hdGNoZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZm5tYXRjaC9GaWxlTmFtZU1hdGNoZXIuamF2YQppbmRleCA1NjYzMDM5Li5iZmNjNTgwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ZubWF0Y2gvRmlsZU5hbWVNYXRjaGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9mbm1hdGNoL0ZpbGVOYW1lTWF0Y2hlci5qYXZhCkBAIC0xMDUsNyArMTA1LDcgQEAgcHVibGljIGNsYXNzIEZpbGVOYW1lTWF0Y2hlciB7CiAJICogQHBhcmFtIGhlYWRzU3RhcnRWYWx1ZQogCSAqICAgICAgICAgICAgbXVzdCBiZSBhIGxpc3Qgd2hpY2ggd2lsbCBuZXZlciBiZSBtb2RpZmllZC4KIAkgKi8KLQlwcml2YXRlIEZpbGVOYW1lTWF0Y2hlcihmaW5hbCBMaXN0PEhlYWQ+IGhlYWRzU3RhcnRWYWx1ZSkgeworCXByaXZhdGUgRmlsZU5hbWVNYXRjaGVyKExpc3Q8SGVhZD4gaGVhZHNTdGFydFZhbHVlKSB7CiAJCXRoaXMoaGVhZHNTdGFydFZhbHVlLCBoZWFkc1N0YXJ0VmFsdWUpOwogCX0KIApAQCAtMzE1LDcgKzMxNSw3IEBAIHByaXZhdGUgc3RhdGljIEFic3RyYWN0SGVhZCBjcmVhdGVXaWxkQ2FyZEhlYWQoCiAJICogQHBhcmFtIGMgbmV3IGNoYXJhY3RlciB0byBhcHBlbmQKIAkgKiBAcmV0dXJuIHRydWUgdG8gY29udGludWUsIGZhbHNlIGlmIHRoZSBtYXRjaGVyIGNhbiBzdG9wIGFwcGVuZGluZwogCSAqLwotCXByaXZhdGUgYm9vbGVhbiBleHRlbmRTdHJpbmdUb01hdGNoQnlPbmVDaGFyYWN0ZXIoZmluYWwgY2hhciBjKSB7CisJcHJpdmF0ZSBib29sZWFuIGV4dGVuZFN0cmluZ1RvTWF0Y2hCeU9uZUNoYXJhY3RlcihjaGFyIGMpIHsKIAkJZmluYWwgTGlzdDxIZWFkPiBuZXdIZWFkcyA9IGxpc3RGb3JMb2NhbFVzZWFnZTsKIAkJbmV3SGVhZHMuY2xlYXIoKTsKIAkJTGlzdDxIZWFkPiBsYXN0QWRkZWRIZWFkcyA9IG51bGw7CkBAIC0zNTcsNyArMzU3LDcgQEAgcHJpdmF0ZSBzdGF0aWMgaW50IGluZGV4T2ZVbmVzY2FwZWQoZmluYWwgU3RyaW5nIHNlYXJjaFN0cmluZywKIAkgKiAgICAgICAgICAgIGV4dGVuZHMgdGhlIHN0cmluZyB3aGljaCBpcyBtYXRjaGVkIGFnYWluc3QgdGhlIHBhdHRlcm5zIG9mCiAJICogICAgICAgICAgICB0aGlzIGNsYXNzLgogCSAqLwotCXB1YmxpYyB2b2lkIGFwcGVuZChmaW5hbCBTdHJpbmcgc3RyaW5nVG9NYXRjaCkgeworCXB1YmxpYyB2b2lkIGFwcGVuZChTdHJpbmcgc3RyaW5nVG9NYXRjaCkgewogCQlmb3IgKGludCBpID0gMDsgaSA8IHN0cmluZ1RvTWF0Y2gubGVuZ3RoKCk7IGkrKykgewogCQkJZmluYWwgY2hhciBjID0gc3RyaW5nVG9NYXRjaC5jaGFyQXQoaSk7CiAJCQlpZiAoIWV4dGVuZFN0cmluZ1RvTWF0Y2hCeU9uZUNoYXJhY3RlcihjKSkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZm5tYXRjaC9Hcm91cEhlYWQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZm5tYXRjaC9Hcm91cEhlYWQuamF2YQppbmRleCA5NjVkOTAwLi4xZGM1OTMxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ZubWF0Y2gvR3JvdXBIZWFkLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9mbm1hdGNoL0dyb3VwSGVhZC5qYXZhCkBAIC02MSw3ICs2MSw3IEBAIGZpbmFsIGNsYXNzIEdyb3VwSGVhZCBleHRlbmRzIEFic3RyYWN0SGVhZCB7CiAKIAlwcml2YXRlIGZpbmFsIGJvb2xlYW4gaW52ZXJzZTsKIAotCUdyb3VwSGVhZChTdHJpbmcgcGF0dGVybiwgZmluYWwgU3RyaW5nIHdob2xlUGF0dGVybikKKwlHcm91cEhlYWQoU3RyaW5nIHBhdHRlcm4sIFN0cmluZyB3aG9sZVBhdHRlcm4pCiAJCQl0aHJvd3MgSW52YWxpZFBhdHRlcm5FeGNlcHRpb24gewogCQlzdXBlcihmYWxzZSk7CiAJCXRoaXMuY2hhcmFjdGVyQ2xhc3NlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwpAQCAtMTMyLDcgKzEzMiw3IEBAIGZpbmFsIGNsYXNzIEdyb3VwSGVhZCBleHRlbmRzIEFic3RyYWN0SGVhZCB7CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIG1hdGNoZXMoZmluYWwgY2hhciBjKSB7CisJcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gbWF0Y2hlcyhjaGFyIGMpIHsKIAkJZm9yIChDaGFyYWN0ZXJQYXR0ZXJuIHBhdHRlcm4gOiBjaGFyYWN0ZXJDbGFzc2VzKSB7CiAJCQlpZiAocGF0dGVybi5tYXRjaGVzKGMpKSB7CiAJCQkJcmV0dXJuICFpbnZlcnNlOwpAQCAtMjE0LDcgKzIxNCw3IEBAIHB1YmxpYyBmaW5hbCBib29sZWFuIG1hdGNoZXMoY2hhciBjKSB7CiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgT25lQ2hhcmFjdGVyUGF0dGVybiBpbXBsZW1lbnRzIENoYXJhY3RlclBhdHRlcm4gewogCQlwcml2YXRlIGNoYXIgZXhwZWN0ZWRDaGFyYWN0ZXI7CiAKLQkJT25lQ2hhcmFjdGVyUGF0dGVybihmaW5hbCBjaGFyIGMpIHsKKwkJT25lQ2hhcmFjdGVyUGF0dGVybihjaGFyIGMpIHsKIAkJCXRoaXMuZXhwZWN0ZWRDaGFyYWN0ZXIgPSBjOwogCQl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZm5tYXRjaC9SZXN0cmljdGVkV2lsZENhcmRIZWFkLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ZubWF0Y2gvUmVzdHJpY3RlZFdpbGRDYXJkSGVhZC5qYXZhCmluZGV4IGMxMzJlMjguLjQ1ZTZlZDIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZm5tYXRjaC9SZXN0cmljdGVkV2lsZENhcmRIZWFkLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9mbm1hdGNoL1Jlc3RyaWN0ZWRXaWxkQ2FyZEhlYWQuamF2YQpAQCAtNDcsMTQgKzQ3LDE0IEBACiBmaW5hbCBjbGFzcyBSZXN0cmljdGVkV2lsZENhcmRIZWFkIGV4dGVuZHMgQWJzdHJhY3RIZWFkIHsKIAlwcml2YXRlIGZpbmFsIGNoYXIgZXhjbHVkZWRDaGFyYWN0ZXI7CiAKLQlSZXN0cmljdGVkV2lsZENhcmRIZWFkKGZpbmFsIGNoYXIgZXhjbHVkZWRDaGFyYWN0ZXIsIGZpbmFsIGJvb2xlYW4gc3RhcikgeworCVJlc3RyaWN0ZWRXaWxkQ2FyZEhlYWQoY2hhciBleGNsdWRlZENoYXJhY3RlciwgYm9vbGVhbiBzdGFyKSB7CiAJCXN1cGVyKHN0YXIpOwogCQl0aGlzLmV4Y2x1ZGVkQ2hhcmFjdGVyID0gZXhjbHVkZWRDaGFyYWN0ZXI7CiAJfQogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBtYXRjaGVzKGZpbmFsIGNoYXIgYykgeworCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIG1hdGNoZXMoY2hhciBjKSB7CiAJCXJldHVybiBjICE9IGV4Y2x1ZGVkQ2hhcmFjdGVyOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9mbm1hdGNoL1dpbGRDYXJkSGVhZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9mbm1hdGNoL1dpbGRDYXJkSGVhZC5qYXZhCmluZGV4IGM4MDZlMjMuLjA3MzYyYWEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZm5tYXRjaC9XaWxkQ2FyZEhlYWQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ZubWF0Y2gvV2lsZENhcmRIZWFkLmphdmEKQEAgLTUxLDcgKzUxLDcgQEAgZmluYWwgY2xhc3MgV2lsZENhcmRIZWFkIGV4dGVuZHMgQWJzdHJhY3RIZWFkIHsKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gbWF0Y2hlcyhmaW5hbCBjaGFyIGMpIHsKKwlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBtYXRjaGVzKGNoYXIgYykgewogCQlyZXR1cm4gdHJ1ZTsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2dpdHJlcG8vUmVwb0NvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZ2l0cmVwby9SZXBvQ29tbWFuZC5qYXZhCmluZGV4IDhiOGRmODcuLjgwZmQzY2YgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZ2l0cmVwby9SZXBvQ29tbWFuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZ2l0cmVwby9SZXBvQ29tbWFuZC5qYXZhCkBAIC00MTMsNyArNDEzLDcgQEAgcHVibGljIFJlcG9Db21tYW5kIHNldFJlY29tbWVuZFNoYWxsb3coYm9vbGVhbiBlbmFibGUpIHsKIAkgKiAgICAgICAgICAgIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQubGliLlByb2dyZXNzTW9uaXRvcn0KIAkgKiBAcmV0dXJuIHRoaXMgY29tbWFuZAogCSAqLwotCXB1YmxpYyBSZXBvQ29tbWFuZCBzZXRQcm9ncmVzc01vbml0b3IoZmluYWwgUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwlwdWJsaWMgUmVwb0NvbW1hbmQgc2V0UHJvZ3Jlc3NNb25pdG9yKFByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CiAJCXRoaXMubW9uaXRvciA9IG1vbml0b3I7CiAJCXJldHVybiB0aGlzOwogCX0KQEAgLTQ0OCw3ICs0NDgsNyBAQCBwdWJsaWMgUmVwb0NvbW1hbmQgc2V0SWdub3JlUmVtb3RlRmFpbHVyZXMoYm9vbGVhbiBpZ25vcmUpIHsKIAkgKiAgICAgICAgICAgIHRoZSBhdXRob3IncyB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5saWIuUGVyc29uSWRlbnR9CiAJICogQHJldHVybiB0aGlzIGNvbW1hbmQKIAkgKi8KLQlwdWJsaWMgUmVwb0NvbW1hbmQgc2V0QXV0aG9yKGZpbmFsIFBlcnNvbklkZW50IGF1dGhvcikgeworCXB1YmxpYyBSZXBvQ29tbWFuZCBzZXRBdXRob3IoUGVyc29uSWRlbnQgYXV0aG9yKSB7CiAJCXRoaXMuYXV0aG9yID0gYXV0aG9yOwogCQlyZXR1cm4gdGhpczsKIAl9CkBAIC00NjMsNyArNDYzLDcgQEAgcHVibGljIFJlcG9Db21tYW5kIHNldEF1dGhvcihmaW5hbCBQZXJzb25JZGVudCBhdXRob3IpIHsKIAkgKiAgICAgICAgICAgIG9iamVjdC4KIAkgKiBAcmV0dXJuIHRoaXMgY29tbWFuZAogCSAqLwotCXB1YmxpYyBSZXBvQ29tbWFuZCBzZXRSZW1vdGVSZWFkZXIoZmluYWwgUmVtb3RlUmVhZGVyIGNhbGxiYWNrKSB7CisJcHVibGljIFJlcG9Db21tYW5kIHNldFJlbW90ZVJlYWRlcihSZW1vdGVSZWFkZXIgY2FsbGJhY2spIHsKIAkJdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrOwogCQlyZXR1cm4gdGhpczsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2dpdHJlcG8vUmVwb1Byb2plY3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZ2l0cmVwby9SZXBvUHJvamVjdC5qYXZhCmluZGV4IGU4Mjc2MTIuLjdiYTgzYzcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZ2l0cmVwby9SZXBvUHJvamVjdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZ2l0cmVwby9SZXBvUHJvamVjdC5qYXZhCkBAIC0xMzEsMTggKzEzMSwxMCBAQCBwdWJsaWMgdm9pZCBjb3B5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCUZpbGUgc3JjRmlsZSA9IG5ldyBGaWxlKHJlcG8uZ2V0V29ya1RyZWUoKSwKIAkJCQkJcGF0aCArICIvIiArIHNyYyk7IC8vJE5PTi1OTFMtMSQKIAkJCUZpbGUgZGVzdEZpbGUgPSBuZXcgRmlsZShyZXBvLmdldFdvcmtUcmVlKCksIGRlc3QpOwotCQkJRmlsZUlucHV0U3RyZWFtIGlucHV0ID0gbmV3IEZpbGVJbnB1dFN0cmVhbShzcmNGaWxlKTsKLQkJCXRyeSB7Ci0JCQkJRmlsZU91dHB1dFN0cmVhbSBvdXRwdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShkZXN0RmlsZSk7Ci0JCQkJdHJ5IHsKLQkJCQkJRmlsZUNoYW5uZWwgY2hhbm5lbCA9IGlucHV0LmdldENoYW5uZWwoKTsKLQkJCQkJb3V0cHV0LmdldENoYW5uZWwoKS50cmFuc2ZlckZyb20oCi0JCQkJCQkJY2hhbm5lbCwgMCwgY2hhbm5lbC5zaXplKCkpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCW91dHB1dC5jbG9zZSgpOwotCQkJCX0KLQkJCX0gZmluYWxseSB7Ci0JCQkJaW5wdXQuY2xvc2UoKTsKKwkJCXRyeSAoRmlsZUlucHV0U3RyZWFtIGlucHV0ID0gbmV3IEZpbGVJbnB1dFN0cmVhbShzcmNGaWxlKTsKKwkJCQkJRmlsZU91dHB1dFN0cmVhbSBvdXRwdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShkZXN0RmlsZSkpIHsKKwkJCQlGaWxlQ2hhbm5lbCBjaGFubmVsID0gaW5wdXQuZ2V0Q2hhbm5lbCgpOworCQkJCW91dHB1dC5nZXRDaGFubmVsKCkudHJhbnNmZXJGcm9tKGNoYW5uZWwsIDAsIGNoYW5uZWwuc2l6ZSgpKTsKIAkJCX0KIAkJfQogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaG9va3MvR2l0SG9vay5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9ob29rcy9HaXRIb29rLmphdmEKaW5kZXggYWQ0M2UyYy4uOGE2MWQxYiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9ob29rcy9HaXRIb29rLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9ob29rcy9HaXRIb29rLmphdmEKQEAgLTQyLDcgKzQyLDcgQEAKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0Lmhvb2tzOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiAKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpAQCAtMTU4LDcgKzE1OCw3IEBAIHByb3RlY3RlZCB2b2lkIGRvUnVuKCkgdGhyb3dzIEFib3J0ZWRCeUhvb2tFeGNlcHRpb24gewogCQlQcmludFN0cmVhbSBob29rRXJyUmVkaXJlY3QgPSBudWxsOwogCQl0cnkgewogCQkJaG9va0VyclJlZGlyZWN0ID0gbmV3IFByaW50U3RyZWFtKGVycm9yQnl0ZUFycmF5LCBmYWxzZSwKLQkJCQkJVVRGXzgubmFtZSgpKTsKKwkJCQkJQ0hBUlNFVC5uYW1lKCkpOwogCQl9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKIAkJCS8vIFVURi04IGlzIGd1YXJhbnRlZWQgdG8gYmUgYXZhaWxhYmxlCiAJCX0KQEAgLTE2Nyw3ICsxNjcsNyBAQCBwcm90ZWN0ZWQgdm9pZCBkb1J1bigpIHRocm93cyBBYm9ydGVkQnlIb29rRXhjZXB0aW9uIHsKIAkJCQlob29rRXJyUmVkaXJlY3QsIGdldFN0ZGluQXJncygpKTsKIAkJaWYgKHJlc3VsdC5pc0V4ZWN1dGVkV2l0aEVycm9yKCkpIHsKIAkJCXRocm93IG5ldyBBYm9ydGVkQnlIb29rRXhjZXB0aW9uKAotCQkJCQluZXcgU3RyaW5nKGVycm9yQnl0ZUFycmF5LnRvQnl0ZUFycmF5KCksIFVURl84KSwKKwkJCQkJbmV3IFN0cmluZyhlcnJvckJ5dGVBcnJheS50b0J5dGVBcnJheSgpLCBDSEFSU0VUKSwKIAkJCQkJZ2V0SG9va05hbWUoKSwgcmVzdWx0LmdldEV4aXRDb2RlKCkpOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9ob29rcy9Ib29rcy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9ob29rcy9Ib29rcy5qYXZhCmluZGV4IDc5Mzk1ZWQuLmI4MDFkNjggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaG9va3MvSG9va3MuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2hvb2tzL0hvb2tzLmphdmEKQEAgLTExNSw3ICsxMTUsMTEgQEAgcHVibGljIHN0YXRpYyBQcmVQdXNoSG9vayBwcmVQdXNoKFJlcG9zaXRvcnkgcmVwbywgUHJpbnRTdHJlYW0gb3V0cHV0U3RyZWFtKSB7CiAJCQkJCW91dHB1dFN0cmVhbSk7CiAJCQlpZiAoaG9vayAhPSBudWxsKSB7CiAJCQkJaWYgKGhvb2suaXNOYXRpdmVIb29rUHJlc2VudCgpKSB7Ci0JCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oTWVzc2FnZUZvcm1hdAorCQkJCQlQcmludFN0cmVhbSBwcyA9IG91dHB1dFN0cmVhbTsKKwkJCQkJaWYgKHBzID09IG51bGwpIHsKKwkJCQkJCXBzID0gU3lzdGVtLm91dDsKKwkJCQkJfQorCQkJCQlwcy5wcmludGxuKE1lc3NhZ2VGb3JtYXQKIAkJCQkJCQkuZm9ybWF0KEpHaXRUZXh0LmdldCgpLmxmc0hvb2tDb25mbGljdCwgcmVwbykpOwogCQkJCX0KIAkJCQlyZXR1cm4gaG9vazsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaWdub3JlL0lnbm9yZU5vZGUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaWdub3JlL0lnbm9yZU5vZGUuamF2YQppbmRleCAxMjI0ZGY0Li5kNTcwZmRlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2lnbm9yZS9JZ25vcmVOb2RlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pZ25vcmUvSWdub3JlTm9kZS5qYXZhCkBAIC0xNjMsMzUgKzE2Myw2IEBAIHB1YmxpYyBNYXRjaFJlc3VsdCBpc0lnbm9yZWQoU3RyaW5nIGVudHJ5UGF0aCwgYm9vbGVhbiBpc0RpcmVjdG9yeSkgewogCSAqICAgICAgICAgICAgKHVzZXMgJy8nIGFuZCBub3QgJ1wnKS4KIAkgKiBAcGFyYW0gaXNEaXJlY3RvcnkKIAkgKiAgICAgICAgICAgIHRydWUgaWYgdGhlIHRhcmdldCBpdGVtIGlzIGEgZGlyZWN0b3J5LgotCSAqIEBwYXJhbSBuZWdhdGVGaXJzdE1hdGNoCi0JICogICAgICAgICAgICB0cnVlIGlmIHRoZSBmaXJzdCBtYXRjaCBzaG91bGQgYmUgbmVnYXRlZAotCSAqIEBkZXByZWNhdGVkIG5lZ2F0ZUZpcnN0TWF0Y2ggaXMgbm90IGhvbm9yZWQgYW55bW9yZQotCSAqIEByZXR1cm4gc3RhdHVzIG9mIHRoZSBwYXRoLgotCSAqIEBzaW5jZSAzLjYKLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyBNYXRjaFJlc3VsdCBpc0lnbm9yZWQoU3RyaW5nIGVudHJ5UGF0aCwgYm9vbGVhbiBpc0RpcmVjdG9yeSwKLQkJCWJvb2xlYW4gbmVnYXRlRmlyc3RNYXRjaCkgewotCQlmaW5hbCBCb29sZWFuIHJlc3VsdCA9IGNoZWNrSWdub3JlZChlbnRyeVBhdGgsIGlzRGlyZWN0b3J5KTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbmVnYXRlRmlyc3RNYXRjaAotCQkJCQk/IE1hdGNoUmVzdWx0LkNIRUNLX1BBUkVOVF9ORUdBVEVfRklSU1RfTUFUQ0gKLQkJCQkJOiBNYXRjaFJlc3VsdC5DSEVDS19QQVJFTlQ7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0LmJvb2xlYW5WYWx1ZSgpID8gTWF0Y2hSZXN1bHQuSUdOT1JFRAotCQkJCTogTWF0Y2hSZXN1bHQuTk9UX0lHTk9SRUQ7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lIGlmIGFuIGVudHJ5IHBhdGggbWF0Y2hlcyBhbiBpZ25vcmUgcnVsZS4KLQkgKgotCSAqIEBwYXJhbSBlbnRyeVBhdGgKLQkgKiAgICAgICAgICAgIHRoZSBwYXRoIHRvIHRlc3QuIFRoZSBwYXRoIG11c3QgYmUgcmVsYXRpdmUgdG8gdGhpcyBpZ25vcmUKLQkgKiAgICAgICAgICAgIG5vZGUncyBvd24gcmVwb3NpdG9yeSBwYXRoLCBhbmQgaW4gcmVwb3NpdG9yeSBwYXRoIGZvcm1hdAotCSAqICAgICAgICAgICAgKHVzZXMgJy8nIGFuZCBub3QgJ1wnKS4KLQkgKiBAcGFyYW0gaXNEaXJlY3RvcnkKLQkgKiAgICAgICAgICAgIHRydWUgaWYgdGhlIHRhcmdldCBpdGVtIGlzIGEgZGlyZWN0b3J5LgogCSAqIEByZXR1cm4gQm9vbGVhbi5UUlVFLCBpZiB0aGUgZW50cnkgaXMgaWdub3JlZDsgQm9vbGVhbi5GQUxTRSwgaWYgdGhlCiAJICogICAgICAgICBlbnRyeSBpcyBmb3JjZWQgdG8gYmUgbm90IGlnbm9yZWQgKG5lZ2F0ZWQgbWF0Y2gpOyBvciBudWxsLCBpZgogCSAqICAgICAgICAgdW5kZXRlcm1pbmVkCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL0pHaXRUZXh0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL0pHaXRUZXh0LmphdmEKaW5kZXggMTIwZDZhZC4uZDJmNjIzMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9KR2l0VGV4dC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvSkdpdFRleHQuamF2YQpAQCAtMjg3LDYgKzI4Nyw4IEBAIHB1YmxpYyBzdGF0aWMgSkdpdFRleHQgZ2V0KCkgewogCS8qKiovIHB1YmxpYyBTdHJpbmcgY3JlZGVudGlhbFVzZXJuYW1lOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgZGFlbW9uQWxyZWFkeVJ1bm5pbmc7CiAJLyoqKi8gcHVibGljIFN0cmluZyBkYXlzQWdvOworCS8qKiovIHB1YmxpYyBTdHJpbmcgZGVlcGVuTm90V2l0aERlZXBlbjsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIGRlZXBlblNpbmNlV2l0aERlZXBlbjsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGRlbGV0ZUJyYW5jaFVuZXhwZWN0ZWRSZXN1bHQ7CiAJLyoqKi8gcHVibGljIFN0cmluZyBkZWxldGVGaWxlRmFpbGVkOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgZGVsZXRlUmVxdWlyZXNaZXJvTmV3SWQ7CkBAIC0zNzIsNiArMzc0LDcgQEAgcHVibGljIHN0YXRpYyBKR2l0VGV4dCBnZXQoKSB7CiAJLyoqKi8gcHVibGljIFN0cmluZyBmaWxlTW9kZU5vdFNldEZvclBhdGg7CiAJLyoqKi8gcHVibGljIFN0cmluZyBmaWx0ZXJFeGVjdXRpb25GYWlsZWQ7CiAJLyoqKi8gcHVibGljIFN0cmluZyBmaWx0ZXJFeGVjdXRpb25GYWlsZWRSYzsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIGZpbHRlclJlcXVpcmVzQ2FwYWJpbGl0eTsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGZpbmRpbmdHYXJiYWdlOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgZmxhZ0lzRGlzcG9zZWQ7CiAJLyoqKi8gcHVibGljIFN0cmluZyBmbGFnTm90RnJvbVRoaXM7CkBAIC00MjMsNiArNDI2LDcgQEAgcHVibGljIHN0YXRpYyBKR2l0VGV4dCBnZXQoKSB7CiAJLyoqKi8gcHVibGljIFN0cmluZyBpbnZhbGlkRGVwdGg7CiAJLyoqKi8gcHVibGljIFN0cmluZyBpbnZhbGlkRW5jcnlwdGlvbjsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGludmFsaWRFeHBhbmRXaWxkY2FyZDsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIGludmFsaWRGaWx0ZXI7CiAJLyoqKi8gcHVibGljIFN0cmluZyBpbnZhbGlkR2l0ZGlyUmVmOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgaW52YWxpZEdpdE1vZHVsZXM7CiAJLyoqKi8gcHVibGljIFN0cmluZyBpbnZhbGlkR2l0VHlwZTsKQEAgLTQ1OCw2ICs0NjIsNyBAQCBwdWJsaWMgc3RhdGljIEpHaXRUZXh0IGdldCgpIHsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGludmFsaWRTeXN0ZW1Qcm9wZXJ0eTsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGludmFsaWRUYWdPcHRpb247CiAJLyoqKi8gcHVibGljIFN0cmluZyBpbnZhbGlkVGltZW91dDsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIGludmFsaWRUaW1lc3RhbXA7CiAJLyoqKi8gcHVibGljIFN0cmluZyBpbnZhbGlkVGltZVVuaXRWYWx1ZTI7CiAJLyoqKi8gcHVibGljIFN0cmluZyBpbnZhbGlkVGltZVVuaXRWYWx1ZTM7CiAJLyoqKi8gcHVibGljIFN0cmluZyBpbnZhbGlkVHJlZVplcm9MZW5ndGhOYW1lOwpAQCAtNjkwLDYgKzY5NSw3IEBAIHB1YmxpYyBzdGF0aWMgSkdpdFRleHQgZ2V0KCkgewogCS8qKiovIHB1YmxpYyBTdHJpbmcgc291cmNlUmVmRG9lc250UmVzb2x2ZVRvQW55T2JqZWN0OwogCS8qKiovIHB1YmxpYyBTdHJpbmcgc291cmNlUmVmTm90U3BlY2lmaWVkRm9yUmVmc3BlYzsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHNxdWFzaENvbW1pdE5vdFVwZGF0aW5nSEVBRDsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIHNzaENvbW1hbmRGYWlsZWQ7CiAJLyoqKi8gcHVibGljIFN0cmluZyBzc2hVc2VyTmFtZUVycm9yOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgc3NsRmFpbHVyZUV4Y2VwdGlvbk1lc3NhZ2U7CiAJLyoqKi8gcHVibGljIFN0cmluZyBzc2xGYWlsdXJlSW5mbzsKQEAgLTczNSw2ICs3NDEsNyBAQCBwdWJsaWMgc3RhdGljIEpHaXRUZXh0IGdldCgpIHsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHRpbWVJc1VuY2VydGFpbjsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHRpbWVyQWxyZWFkeVRlcm1pbmF0ZWQ7CiAJLyoqKi8gcHVibGljIFN0cmluZyB0b29NYW55Q29tbWFuZHM7CisJLyoqKi8gcHVibGljIFN0cmluZyB0b29NYW55RmlsdGVyczsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHRvb01hbnlJbmNsdWRlUmVjdXJzaW9uczsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHRvcG9sb2dpY2FsU29ydFJlcXVpcmVkOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgdHJhbnNwb3J0RXhjZXB0aW9uQmFkUmVmOwpAQCAtNzc3LDYgKzc4NCw3IEBAIHB1YmxpYyBzdGF0aWMgSkdpdFRleHQgZ2V0KCkgewogCS8qKiovIHB1YmxpYyBTdHJpbmcgdW5leHBlY3RlZEVvZkluUGFjazsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHVuZXhwZWN0ZWRIdW5rVHJhaWxlcjsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHVuZXhwZWN0ZWRPZGRSZXN1bHQ7CisJLyoqKi8gcHVibGljIFN0cmluZyB1bmV4cGVjdGVkUGFja2V0TGluZTsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHVuZXhwZWN0ZWRSZWZSZXBvcnQ7CiAJLyoqKi8gcHVibGljIFN0cmluZyB1bmV4cGVjdGVkUmVwb3J0TGluZTsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHVuZXhwZWN0ZWRSZXBvcnRMaW5lMjsKQEAgLTc5MSw2ICs3OTksNyBAQCBwdWJsaWMgc3RhdGljIEpHaXRUZXh0IGdldCgpIHsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHVua25vd25PYmplY3RUeXBlMjsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHVua25vd25SZXBvc2l0b3J5Rm9ybWF0OwogCS8qKiovIHB1YmxpYyBTdHJpbmcgdW5rbm93blJlcG9zaXRvcnlGb3JtYXQyOworCS8qKiovIHB1YmxpYyBTdHJpbmcgdW5rbm93blRyYW5zcG9ydENvbW1hbmQ7CiAJLyoqKi8gcHVibGljIFN0cmluZyB1bmtub3duWmxpYkVycm9yOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgdW5sb2NrTG9ja0ZpbGVGYWlsZWQ7CiAJLyoqKi8gcHVibGljIFN0cmluZyB1bm1lcmdlZFBhdGg7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL2tldGNoL0tldGNoU3lzdGVtLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL2tldGNoL0tldGNoU3lzdGVtLmphdmEKaW5kZXggMTkwOGQ2Yy4uZDFkNGY2NyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9rZXRjaC9LZXRjaFN5c3RlbS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwva2V0Y2gvS2V0Y2hTeXN0ZW0uamF2YQpAQCAtMjYwLDcgKzI2MCw3IEBAIHB1YmxpYyBTdHJpbmcgbmV3TGVhZGVyVGFnKCkgewogCSAqIEB0aHJvd3MgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uCiAJICogICAgICAgICAgICAgYSBmb2xsb3dlciBjb25maWd1cmF0aW9uIGNvbnRhaW5zIGFuIHVuc3VwcG9ydGVkIFVSSS4KIAkgKi8KLQlwdWJsaWMgS2V0Y2hMZWFkZXIgY3JlYXRlTGVhZGVyKGZpbmFsIFJlcG9zaXRvcnkgcmVwbykKKwlwdWJsaWMgS2V0Y2hMZWFkZXIgY3JlYXRlTGVhZGVyKFJlcG9zaXRvcnkgcmVwbykKIAkJCXRocm93cyBVUklTeW50YXhFeGNlcHRpb24gewogCQlLZXRjaExlYWRlciBsZWFkZXIgPSBuZXcgS2V0Y2hMZWFkZXIodGhpcykgewogCQkJQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL2tldGNoL0xvY2FsUmVwbGljYS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9rZXRjaC9Mb2NhbFJlcGxpY2EuamF2YQppbmRleCA5YzM3YTkwLi43ZGRkZTYzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL2tldGNoL0xvY2FsUmVwbGljYS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwva2V0Y2gvTG9jYWxSZXBsaWNhLmphdmEKQEAgLTEyMiw3ICsxMjIsNyBAQCB2b2lkIGluaXRpYWxpemUoUmVwb3NpdG9yeSByZXBvKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzdGFydFB1c2goZmluYWwgUmVwbGljYVB1c2hSZXF1ZXN0IHJlcSkgeworCXByb3RlY3RlZCB2b2lkIHN0YXJ0UHVzaChSZXBsaWNhUHVzaFJlcXVlc3QgcmVxKSB7CiAJCWdldFN5c3RlbSgpLmdldEV4ZWN1dG9yKCkuZXhlY3V0ZShuZXcgUnVubmFibGUoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwva2V0Y2gvUmVtb3RlR2l0UmVwbGljYS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9rZXRjaC9SZW1vdGVHaXRSZXBsaWNhLmphdmEKaW5kZXggNjc0ZGExZi4uYjYxMjc0ZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9rZXRjaC9SZW1vdGVHaXRSZXBsaWNhLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9rZXRjaC9SZW1vdGVHaXRSZXBsaWNhLmphdmEKQEAgLTEzOCw3ICsxMzgsNyBAQCBwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaWJlRm9yTG9nKCkgewogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzdGFydFB1c2goZmluYWwgUmVwbGljYVB1c2hSZXF1ZXN0IHJlcSkgeworCXByb3RlY3RlZCB2b2lkIHN0YXJ0UHVzaChSZXBsaWNhUHVzaFJlcXVlc3QgcmVxKSB7CiAJCWdldFN5c3RlbSgpLmdldEV4ZWN1dG9yKCkuZXhlY3V0ZShuZXcgUnVubmFibGUoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzQmxvY2tDYWNoZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNCbG9ja0NhY2hlLmphdmEKaW5kZXggMTRkYzgwZi4uNDY4Nzk1MiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNCbG9ja0NhY2hlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNCbG9ja0NhY2hlLmphdmEKQEAgLTE4MSw3ICsxODEsNyBAQCBwdWJsaWMgc3RhdGljIERmc0Jsb2NrQ2FjaGUgZ2V0SW5zdGFuY2UoKSB7CiAJcHJpdmF0ZSBSZWYgY2xvY2tIYW5kOwogCiAJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBEZnNCbG9ja0NhY2hlKGZpbmFsIERmc0Jsb2NrQ2FjaGVDb25maWcgY2ZnKSB7CisJcHJpdmF0ZSBEZnNCbG9ja0NhY2hlKERmc0Jsb2NrQ2FjaGVDb25maWcgY2ZnKSB7CiAJCXRhYmxlU2l6ZSA9IHRhYmxlU2l6ZShjZmcpOwogCQlpZiAodGFibGVTaXplIDwgMSkKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oSkdpdFRleHQuZ2V0KCkudFNpemVNdXN0QmVHcmVhdGVyT3JFcXVhbDEpOwpAQCAtMzMwLDcgKzMzMCw3IEBAIGludCBnZXRCbG9ja1NpemUoKSB7CiAJCXJldHVybiBibG9ja1NpemU7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgaW50IHRhYmxlU2l6ZShmaW5hbCBEZnNCbG9ja0NhY2hlQ29uZmlnIGNmZykgeworCXByaXZhdGUgc3RhdGljIGludCB0YWJsZVNpemUoRGZzQmxvY2tDYWNoZUNvbmZpZyBjZmcpIHsKIAkJZmluYWwgaW50IHdzeiA9IGNmZy5nZXRCbG9ja1NpemUoKTsKIAkJZmluYWwgbG9uZyBsaW1pdCA9IGNmZy5nZXRCbG9ja0xpbWl0KCk7CiAJCWlmICh3c3ogPD0gMCkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzQmxvY2tDYWNoZUNvbmZpZy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNCbG9ja0NhY2hlQ29uZmlnLmphdmEKaW5kZXggY2Q3OTAxYi4uZGQ3Y2I4OSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNCbG9ja0NhY2hlQ29uZmlnLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNCbG9ja0NhY2hlQ29uZmlnLmphdmEKQEAgLTEwNiw3ICsxMDYsNyBAQCBwdWJsaWMgbG9uZyBnZXRCbG9ja0xpbWl0KCkgewogCSAqICAgICAgICAgICAgcGFjayBmaWxlIGRhdGE7IG11c3QgYmUgcG9zaXRpdmUuCiAJICogQHJldHVybiB7QGNvZGUgdGhpc30KIAkgKi8KLQlwdWJsaWMgRGZzQmxvY2tDYWNoZUNvbmZpZyBzZXRCbG9ja0xpbWl0KGZpbmFsIGxvbmcgbmV3TGltaXQpIHsKKwlwdWJsaWMgRGZzQmxvY2tDYWNoZUNvbmZpZyBzZXRCbG9ja0xpbWl0KGxvbmcgbmV3TGltaXQpIHsKIAkJaWYgKG5ld0xpbWl0IDw9IDApIHsKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCiAJCQkJCUpHaXRUZXh0LmdldCgpLmJsb2NrTGltaXROb3RQb3NpdGl2ZSwKQEAgLTEzNSw3ICsxMzUsNyBAQCBwdWJsaWMgaW50IGdldEJsb2NrU2l6ZSgpIHsKIAkgKiAgICAgICAgICAgIFRoZSB2YWx1ZSBtdXN0IGJlIGEgcG93ZXIgb2YgMi4KIAkgKiBAcmV0dXJuIHtAY29kZSB0aGlzfQogCSAqLwotCXB1YmxpYyBEZnNCbG9ja0NhY2hlQ29uZmlnIHNldEJsb2NrU2l6ZShmaW5hbCBpbnQgbmV3U2l6ZSkgeworCXB1YmxpYyBEZnNCbG9ja0NhY2hlQ29uZmlnIHNldEJsb2NrU2l6ZShpbnQgbmV3U2l6ZSkgewogCQlpbnQgc2l6ZSA9IE1hdGgubWF4KDUxMiwgbmV3U2l6ZSk7CiAJCWlmICgoc2l6ZSAmIChzaXplIC0gMSkpICE9IDApIHsKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCkBAIC0yMDYsNyArMjA2LDcgQEAgcHVibGljIERmc0Jsb2NrQ2FjaGVDb25maWcgc2V0U3RyZWFtUmF0aW8oZG91YmxlIHJhdGlvKSB7CiAJICogICAgICAgICAgICBjb25maWd1cmF0aW9uIHRvIHJlYWQgcHJvcGVydGllcyBmcm9tLgogCSAqIEByZXR1cm4ge0Bjb2RlIHRoaXN9CiAJICovCi0JcHVibGljIERmc0Jsb2NrQ2FjaGVDb25maWcgZnJvbUNvbmZpZyhmaW5hbCBDb25maWcgcmMpIHsKKwlwdWJsaWMgRGZzQmxvY2tDYWNoZUNvbmZpZyBmcm9tQ29uZmlnKENvbmZpZyByYykgewogCQlsb25nIGNmZ0Jsb2NrTGltaXQgPSByYy5nZXRMb25nKAogCQkJCUNPTkZJR19DT1JFX1NFQ1RJT04sCiAJCQkJQ09ORklHX0RGU19TRUNUSU9OLApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNHYXJiYWdlQ29sbGVjdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc0dhcmJhZ2VDb2xsZWN0b3IuamF2YQppbmRleCA2OTk4OWE0Li5jYTExZmI5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc0dhcmJhZ2VDb2xsZWN0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc0dhcmJhZ2VDb2xsZWN0b3IuamF2YQpAQCAtNDAzLDcgKzQwMyw3IEBAIHB1YmxpYyBib29sZWFuIHBhY2soUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCX0KIAogCXByaXZhdGUgQ29sbGVjdGlvbjxSZWY+IGdldEFsbFJlZnMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlDb2xsZWN0aW9uPFJlZj4gcmVmcyA9IHJlZmRiLmdldFJlZnMoUmVmRGF0YWJhc2UuQUxMKS52YWx1ZXMoKTsKKwkJQ29sbGVjdGlvbjxSZWY+IHJlZnMgPSByZWZkYi5nZXRSZWZzKCk7CiAJCUxpc3Q8UmVmPiBhZGRsID0gcmVmZGIuZ2V0QWRkaXRpb25hbFJlZnMoKTsKIAkJaWYgKCFhZGRsLmlzRW1wdHkoKSkgewogCQkJTGlzdDxSZWY+IGFsbCA9IG5ldyBBcnJheUxpc3Q8PihyZWZzLnNpemUoKSArIGFkZGwuc2l6ZSgpKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzSW5zZXJ0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzSW5zZXJ0ZXIuamF2YQppbmRleCBlYjBhNTI3Li4wZDllMmMxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc0luc2VydGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNJbnNlcnRlci5qYXZhCkBAIC02OCw2ICs2OCw3IEBACiBpbXBvcnQgamF2YS51dGlsLnppcC5JbmZsYXRlcjsKIGltcG9ydCBqYXZhLnV0aWwuemlwLkluZmxhdGVySW5wdXRTdHJlYW07CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zLk51bGxhYmxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLkNvcnJ1cHRPYmplY3RFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5MYXJnZU9iamVjdEV4Y2VwdGlvbjsKQEAgLTMwOSw2ICszMTAsMTUgQEAgcHJpdmF0ZSB2b2lkIHNvcnRPYmplY3RzQnlJZCgpIHsKIAkJQ29sbGVjdGlvbnMuc29ydChvYmplY3RMaXN0KTsKIAl9CiAKKwlATnVsbGFibGUKKwlwcml2YXRlIFRlbXBvcmFyeUJ1ZmZlci5IZWFwIG1heWJlR2V0VGVtcG9yYXJ5QnVmZmVyKAorCQkJTGlzdDxQYWNrZWRPYmplY3RJbmZvPiBsaXN0KSB7CisJCWlmIChsaXN0LnNpemUoKSA8PSA1ODAwMCkgeworCQkJcmV0dXJuIG5ldyBUZW1wb3JhcnlCdWZmZXIuSGVhcCgyIDw8IDIwKTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKIAlQYWNrSW5kZXggd3JpdGVQYWNrSW5kZXgoRGZzUGFja0Rlc2NyaXB0aW9uIHBhY2ssIGJ5dGVbXSBwYWNrSGFzaCwKIAkJCUxpc3Q8UGFja2VkT2JqZWN0SW5mbz4gbGlzdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJcGFjay5zZXRJbmRleFZlcnNpb24oSU5ERVhfVkVSU0lPTik7CkBAIC0zMTcsMjcgKzMyNywyMCBAQCBQYWNrSW5kZXggd3JpdGVQYWNrSW5kZXgoRGZzUGFja0Rlc2NyaXB0aW9uIHBhY2ssIGJ5dGVbXSBwYWNrSGFzaCwKIAkJLy8gSWYgdGhlcmUgYXJlIGxlc3MgdGhhbiA1OCwwMDAgb2JqZWN0cywgdGhlIGVudGlyZSBpbmRleCBmaXRzIGluIHVuZGVyCiAJCS8vIDIgTWlCLiBDYWxsZXJzIHdpbGwgcHJvYmFibHkgbmVlZCB0aGUgaW5kZXggaW1tZWRpYXRlbHksIHNvIGJ1ZmZlcgogCQkvLyB0aGUgaW5kZXggaW4gcHJvY2VzcyBhbmQgbG9hZCBmcm9tIHRoZSBidWZmZXIuCi0JCVRlbXBvcmFyeUJ1ZmZlci5IZWFwIGJ1ZiA9IG51bGw7CiAJCVBhY2tJbmRleCBwYWNrSW5kZXggPSBudWxsOwotCQlpZiAobGlzdC5zaXplKCkgPD0gNTgwMDApIHsKLQkJCWJ1ZiA9IG5ldyBUZW1wb3JhcnlCdWZmZXIuSGVhcCgyIDw8IDIwKTsKLQkJCWluZGV4KGJ1ZiwgcGFja0hhc2gsIGxpc3QpOwotCQkJcGFja0luZGV4ID0gUGFja0luZGV4LnJlYWQoYnVmLm9wZW5JbnB1dFN0cmVhbSgpKTsKLQkJfQotCi0JCXRyeSAoRGZzT3V0cHV0U3RyZWFtIG9zID0gZGIud3JpdGVGaWxlKHBhY2ssIElOREVYKSkgewotCQkJQ291bnRpbmdPdXRwdXRTdHJlYW0gY250ID0gbmV3IENvdW50aW5nT3V0cHV0U3RyZWFtKG9zKTsKLQkJCWlmIChidWYgIT0gbnVsbCkKKwkJdHJ5IChUZW1wb3JhcnlCdWZmZXIuSGVhcCBidWYgPSBtYXliZUdldFRlbXBvcmFyeUJ1ZmZlcihsaXN0KTsKKwkJCQlEZnNPdXRwdXRTdHJlYW0gb3MgPSBkYi53cml0ZUZpbGUocGFjaywgSU5ERVgpOworCQkJCUNvdW50aW5nT3V0cHV0U3RyZWFtIGNudCA9IG5ldyBDb3VudGluZ091dHB1dFN0cmVhbShvcykpIHsKKwkJCWlmIChidWYgIT0gbnVsbCkgeworCQkJCWluZGV4KGJ1ZiwgcGFja0hhc2gsIGxpc3QpOworCQkJCXBhY2tJbmRleCA9IFBhY2tJbmRleC5yZWFkKGJ1Zi5vcGVuSW5wdXRTdHJlYW0oKSk7CiAJCQkJYnVmLndyaXRlVG8oY250LCBudWxsKTsKLQkJCWVsc2UKKwkJCX0gZWxzZSB7CiAJCQkJaW5kZXgoY250LCBwYWNrSGFzaCwgbGlzdCk7CisJCQl9CiAJCQlwYWNrLmFkZEZpbGVFeHQoSU5ERVgpOwogCQkJcGFjay5zZXRCbG9ja1NpemUoSU5ERVgsIG9zLmJsb2NrU2l6ZSgpKTsKIAkJCXBhY2suc2V0RmlsZVNpemUoSU5ERVgsIGNudC5nZXRDb3VudCgpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChidWYgIT0gbnVsbCkgewotCQkJCWJ1Zi5jbG9zZSgpOwotCQkJfQogCQl9CiAJCXJldHVybiBwYWNrSW5kZXg7CiAJfQpAQCAtNDAzLDcgKzQwNiw3IEBAIHByaXZhdGUgaW50IGVuY29kZVR5cGVTaXplKGludCB0eXBlLCBsb25nIHJhd0xlbmd0aCkgewogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHdyaXRlKGZpbmFsIGludCBiKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlwdWJsaWMgdm9pZCB3cml0ZShpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCWhkckJ1ZlswXSA9IChieXRlKSBiOwogCQkJd3JpdGUoaGRyQnVmLCAwLCAxKTsKIAkJfQpAQCAtNjY2LDYgKzY2OSw3IEBAIHByaXZhdGUgY2xhc3MgU3RyZWFtTG9hZGVyIGV4dGVuZHMgT2JqZWN0TG9hZGVyIHsKIAogCQlAT3ZlcnJpZGUKIAkJcHVibGljIE9iamVjdFN0cmVhbSBvcGVuU3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpIC8vIEV4cGxpY2l0bHkgY2xvc2VkIGJlbG93CiAJCQlmaW5hbCBEZnNSZWFkZXIgY3R4ID0gZGIubmV3UmVhZGVyKCk7CiAJCQlpZiAoc3JjUGFjayAhPSBwYWNrS2V5KSB7CiAJCQkJdHJ5IHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzT2JqRGF0YWJhc2UuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzT2JqRGF0YWJhc2UuamF2YQppbmRleCA0MmIxYTQ3Li5jYTU0ZWUyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc09iakRhdGFiYXNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNPYmpEYXRhYmFzZS5qYXZhCkBAIC00OTcsNyArNDk3LDcgQEAgdm9pZCBhZGRSZWZ0YWJsZShEZnNQYWNrRGVzY3JpcHRpb24gYWRkLCBTZXQ8RGZzUGFja0Rlc2NyaXB0aW9uPiByZW1vdmUpCiAJCX0gd2hpbGUgKCFwYWNrTGlzdC5jb21wYXJlQW5kU2V0KG8sIG4pKTsKIAl9CiAKLQlQYWNrTGlzdCBzY2FuUGFja3MoZmluYWwgUGFja0xpc3Qgb3JpZ2luYWwpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJUGFja0xpc3Qgc2NhblBhY2tzKFBhY2tMaXN0IG9yaWdpbmFsKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlQYWNrTGlzdCBvLCBuOwogCQlzeW5jaHJvbml6ZWQgKHBhY2tMaXN0KSB7CiAJCQlkbyB7CkBAIC01NDYsNyArNTQ2LDcgQEAgcHJpdmF0ZSBQYWNrTGlzdCBzY2FuUGFja3NJbXBsKFBhY2tMaXN0IG9sZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCX0KIAkJfQogCi0JCWlmIChuZXdQYWNrcy5pc0VtcHR5KCkpCisJCWlmIChuZXdQYWNrcy5pc0VtcHR5KCkgJiYgbmV3UmVmdGFibGVzLmlzRW1wdHkoKSkKIAkJCXJldHVybiBuZXcgUGFja0xpc3RJbXBsKE5PX1BBQ0tTLnBhY2tzLCBOT19QQUNLUy5yZWZ0YWJsZXMpOwogCQlpZiAoIWZvdW5kTmV3KSB7CiAJCQlvbGQuY2xlYXJEaXJ0eSgpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNPYmplY3RUb1BhY2suamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzT2JqZWN0VG9QYWNrLmphdmEKaW5kZXggM2EwNGQ3MC4uNWY0ZGVlMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNPYmplY3RUb1BhY2suamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc09iamVjdFRvUGFjay5qYXZhCkBAIC02MCw3ICs2MCw3IEBAIGNsYXNzIERmc09iamVjdFRvUGFjayBleHRlbmRzIE9iamVjdFRvUGFjayB7CiAJLyoqIExlbmd0aCBvZiB0aGUgZGF0YSBzZWN0aW9uIG9mIHRoZSBvYmplY3QuICovCiAJbG9uZyBsZW5ndGg7CiAKLQlEZnNPYmplY3RUb1BhY2soQW55T2JqZWN0SWQgc3JjLCBmaW5hbCBpbnQgdHlwZSkgeworCURmc09iamVjdFRvUGFjayhBbnlPYmplY3RJZCBzcmMsIGludCB0eXBlKSB7CiAJCXN1cGVyKHNyYywgdHlwZSk7CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc1BhY2tDb21wYWN0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzUGFja0NvbXBhY3Rvci5qYXZhCmluZGV4IGFiNzYzMzIuLmI0M2I5YjEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzUGFja0NvbXBhY3Rvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzUGFja0NvbXBhY3Rvci5qYXZhCkBAIC0yNjgsOCArMjY4LDcgQEAgcHJpdmF0ZSB2b2lkIGNvbXBhY3RQYWNrcyhEZnNSZWFkZXIgY3R4LCBQcm9ncmVzc01vbml0b3IgcG0pCiAJCXBjLnNldFJldXNlRGVsdGFzKHRydWUpOwogCQlwYy5zZXRSZXVzZU9iamVjdHModHJ1ZSk7CiAKLQkJUGFja1dyaXRlciBwdyA9IG5ldyBQYWNrV3JpdGVyKHBjLCBjdHgpOwotCQl0cnkgeworCQl0cnkgKFBhY2tXcml0ZXIgcHcgPSBuZXcgUGFja1dyaXRlcihwYywgY3R4KSkgewogCQkJcHcuc2V0RGVsdGFCYXNlQXNPZmZzZXQodHJ1ZSk7CiAJCQlwdy5zZXRSZXVzZURlbHRhQ29tbWl0cyhmYWxzZSk7CiAKQEAgLTI4NSw4ICsyODQsNiBAQCBwcml2YXRlIHZvaWQgY29tcGFjdFBhY2tzKERmc1JlYWRlciBjdHgsIFByb2dyZXNzTW9uaXRvciBwbSkKIAkJCQl3cml0ZUluZGV4KG9iamRiLCBvdXREZXNjLCBwdyk7CiAKIAkJCQlQYWNrU3RhdGlzdGljcyBzdGF0cyA9IHB3LmdldFN0YXRpc3RpY3MoKTsKLQkJCQlwdy5jbG9zZSgpOwotCQkJCXB3ID0gbnVsbDsKIAogCQkJCW91dERlc2Muc2V0UGFja1N0YXRzKHN0YXRzKTsKIAkJCQluZXdTdGF0cyA9IHN0YXRzOwpAQCAtMjk2LDEwICsyOTMsNiBAQCBwcml2YXRlIHZvaWQgY29tcGFjdFBhY2tzKERmc1JlYWRlciBjdHgsIFByb2dyZXNzTW9uaXRvciBwbSkKIAkJCQkJb2JqZGIucm9sbGJhY2tQYWNrKENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3Qob3V0RGVzYykpOwogCQkJCX0KIAkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChwdyAhPSBudWxsKSB7Ci0JCQkJcHcuY2xvc2UoKTsKLQkJCX0KIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNQYWNrRmlsZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNQYWNrRmlsZS5qYXZhCmluZGV4IDdlMzYwNDIuLjA1YjhmNjEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzUGFja0ZpbGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc1BhY2tGaWxlLmphdmEKQEAgLTIwOSw4ICsyMDksNyBAQCBwcml2YXRlIFBhY2tJbmRleCBpZHgoRGZzUmVhZGVyIGN0eCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCXRyeSB7CiAJCQkJY3R4LnN0YXRzLnJlYWRJZHgrKzsKIAkJCQlsb25nIHN0YXJ0ID0gU3lzdGVtLm5hbm9UaW1lKCk7Ci0JCQkJUmVhZGFibGVDaGFubmVsIHJjID0gY3R4LmRiLm9wZW5GaWxlKGRlc2MsIElOREVYKTsKLQkJCQl0cnkgeworCQkJCXRyeSAoUmVhZGFibGVDaGFubmVsIHJjID0gY3R4LmRiLm9wZW5GaWxlKGRlc2MsIElOREVYKSkgewogCQkJCQlJbnB1dFN0cmVhbSBpbiA9IENoYW5uZWxzLm5ld0lucHV0U3RyZWFtKHJjKTsKIAkJCQkJaW50IHdhbnRTaXplID0gODE5MjsKIAkJCQkJaW50IGJzID0gcmMuYmxvY2tTaXplKCk7CkBAIC0yMjEsNyArMjIwLDYgQEAgZWxzZSBpZiAoYnMgPD0gMCkKIAkJCQkJaWR4ID0gUGFja0luZGV4LnJlYWQobmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oaW4sIGJzKSk7CiAJCQkJCWN0eC5zdGF0cy5yZWFkSWR4Qnl0ZXMgKz0gcmMucG9zaXRpb24oKTsKIAkJCQl9IGZpbmFsbHkgewotCQkJCQlyYy5jbG9zZSgpOwogCQkJCQljdHguc3RhdHMucmVhZElkeE1pY3JvcyArPSBlbGFwc2VkTWljcm9zKHN0YXJ0KTsKIAkJCQl9CiAJCQl9IGNhdGNoIChFT0ZFeGNlcHRpb24gZSkgewpAQCAtMjc2LDEwICsyNzQsOSBAQCBQYWNrQml0bWFwSW5kZXggZ2V0Qml0bWFwSW5kZXgoRGZzUmVhZGVyIGN0eCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAogCQkJbG9uZyBzaXplOwogCQkJUGFja0JpdG1hcEluZGV4IGlkeDsKLQkJCXRyeSB7Ci0JCQkJY3R4LnN0YXRzLnJlYWRCaXRtYXArKzsKLQkJCQlsb25nIHN0YXJ0ID0gU3lzdGVtLm5hbm9UaW1lKCk7Ci0JCQkJUmVhZGFibGVDaGFubmVsIHJjID0gY3R4LmRiLm9wZW5GaWxlKGRlc2MsIEJJVE1BUF9JTkRFWCk7CisJCQljdHguc3RhdHMucmVhZEJpdG1hcCsrOworCQkJbG9uZyBzdGFydCA9IFN5c3RlbS5uYW5vVGltZSgpOworCQkJdHJ5IChSZWFkYWJsZUNoYW5uZWwgcmMgPSBjdHguZGIub3BlbkZpbGUoZGVzYywgQklUTUFQX0lOREVYKSkgewogCQkJCXRyeSB7CiAJCQkJCUlucHV0U3RyZWFtIGluID0gQ2hhbm5lbHMubmV3SW5wdXRTdHJlYW0ocmMpOwogCQkJCQlpbnQgd2FudFNpemUgPSA4MTkyOwpAQCAtMjkzLDcgKzI5MCw2IEBAIGVsc2UgaWYgKGJzIDw9IDApCiAJCQkJCQkJaW4sIGlkeChjdHgpLCBnZXRSZXZlcnNlSWR4KGN0eCkpOwogCQkJCX0gZmluYWxseSB7CiAJCQkJCXNpemUgPSByYy5wb3NpdGlvbigpOwotCQkJCQlyYy5jbG9zZSgpOwogCQkJCQljdHguc3RhdHMucmVhZElkeEJ5dGVzICs9IHNpemU7CiAJCQkJCWN0eC5zdGF0cy5yZWFkSWR4TWljcm9zICs9IGVsYXBzZWRNaWNyb3Moc3RhcnQpOwogCQkJCX0KQEAgLTQ0Myw2ICs0MzksNyBAQCB2b2lkIGNvcHlQYWNrQXNJcyhQYWNrT3V0cHV0U3RyZWFtIG91dCwgRGZzUmVhZGVyIGN0eCkKIAogCXByaXZhdGUgdm9pZCBjb3B5UGFja1Rocm91Z2hDYWNoZShQYWNrT3V0cHV0U3RyZWFtIG91dCwgRGZzUmVhZGVyIGN0eCkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpIC8vIEV4cGxpY2l0bHkgY2xvc2VkIGluIGZpbmFsbHkgYmxvY2sKIAkJUmVhZGFibGVDaGFubmVsIHJjID0gbnVsbDsKIAkJdHJ5IHsKIAkJCWxvbmcgcG9zaXRpb24gPSAxMjsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzUmVhZGVyT3B0aW9ucy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNSZWFkZXJPcHRpb25zLmphdmEKaW5kZXggYmYxNGQxOC4uMmVhNWMzOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNSZWFkZXJPcHRpb25zLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNSZWFkZXJPcHRpb25zLmphdmEKQEAgLTExNSw3ICsxMTUsNyBAQCBwdWJsaWMgaW50IGdldFN0cmVhbUZpbGVUaHJlc2hvbGQoKSB7CiAJICogICAgICAgICAgICB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0U3RyZWFtfS4KIAkgKiBAcmV0dXJuIHtAY29kZSB0aGlzfQogCSAqLwotCXB1YmxpYyBEZnNSZWFkZXJPcHRpb25zIHNldFN0cmVhbUZpbGVUaHJlc2hvbGQoZmluYWwgaW50IG5ld0xpbWl0KSB7CisJcHVibGljIERmc1JlYWRlck9wdGlvbnMgc2V0U3RyZWFtRmlsZVRocmVzaG9sZChpbnQgbmV3TGltaXQpIHsKIAkJc3RyZWFtRmlsZVRocmVzaG9sZCA9IE1hdGgubWF4KDAsIG5ld0xpbWl0KTsKIAkJcmV0dXJuIHRoaXM7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNSZXBvc2l0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc1JlcG9zaXRvcnkuamF2YQppbmRleCAxOTc2ODE2Li41MTY5ZTkyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc1JlcG9zaXRvcnkuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc1JlcG9zaXRvcnkuamF2YQpAQCAtMTMzLDcgKzEzMyw3IEBAIHB1YmxpYyB2b2lkIHNjYW5Gb3JSZXBvQ2hhbmdlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUluZGV4Q2hhbmdlZCgpIHsKKwlwdWJsaWMgdm9pZCBub3RpZnlJbmRleENoYW5nZWQoYm9vbGVhbiBpbnRlcm5hbCkgewogCQkvLyBEbyBub3Qgc2VuZCBub3RpZmljYXRpb25zLgogCQkvLyBUaGVyZSBpcyBubyBpbmRleCwgYXMgdGhlcmUgaXMgbm8gd29ya2luZyB0cmVlLgogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzU3RyZWFtS2V5LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc1N0cmVhbUtleS5qYXZhCmluZGV4IDg3OTNkODMuLmMxMWY2OTYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzU3RyZWFtS2V5LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNTdHJlYW1LZXkuamF2YQpAQCAtNDMsNyArNDMsNyBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5kZnM7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiAKQEAgLTY3LDcgKzY3LDcgQEAgcHVibGljIGFic3RyYWN0IGNsYXNzIERmc1N0cmVhbUtleSB7CiAJICovCiAJcHVibGljIHN0YXRpYyBEZnNTdHJlYW1LZXkgb2YoRGZzUmVwb3NpdG9yeURlc2NyaXB0aW9uIHJlcG8sIFN0cmluZyBuYW1lLAogCQkJQE51bGxhYmxlIFBhY2tFeHQgZXh0KSB7Ci0JCXJldHVybiBuZXcgQnl0ZUFycmF5RGZzU3RyZWFtS2V5KHJlcG8sIG5hbWUuZ2V0Qnl0ZXMoVVRGXzgpLCBleHQpOworCQlyZXR1cm4gbmV3IEJ5dGVBcnJheURmc1N0cmVhbUtleShyZXBvLCBuYW1lLmdldEJ5dGVzKENIQVJTRVQpLCBleHQpOwogCX0KIAogCWZpbmFsIGludCBoYXNoOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9MYXJnZVBhY2tlZFdob2xlT2JqZWN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0xhcmdlUGFja2VkV2hvbGVPYmplY3QuamF2YQppbmRleCBmYTJjNTI5Li4zN2Q4ZDFjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0xhcmdlUGFja2VkV2hvbGVPYmplY3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0xhcmdlUGFja2VkV2hvbGVPYmplY3QuamF2YQpAQCAtMTA0LDMxICsxMDQsMzQgQEAgcHVibGljIGJvb2xlYW4gaXNMYXJnZSgpIHsKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3RTdHJlYW0gb3BlblN0cmVhbSgpIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisJCVBhY2tJbnB1dFN0cmVhbSBwYWNrSW47CisJCS8vIGN0eCBpcyBjbG9zZWQgYnkgUGFja0lucHV0U3RyZWFtLCBvciBleHBsaWNpdGx5IGluIHRoZSBmaW5hbGx5IGJsb2NrCisJCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpCiAJCURmc1JlYWRlciBjdHggPSBkYi5uZXdSZWFkZXIoKTsKLQkJSW5wdXRTdHJlYW0gaW47CiAJCXRyeSB7Ci0JCQlpbiA9IG5ldyBQYWNrSW5wdXRTdHJlYW0ocGFjaywgb2JqZWN0T2Zmc2V0ICsgaGVhZGVyTGVuZ3RoLCBjdHgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBwYWNrR29uZSkgewotCQkJLy8gSWYgdGhlIHBhY2sgZmlsZSBjYW5ub3QgYmUgcGlubmVkIGludG8gdGhlIGN1cnNvciwgaXQKLQkJCS8vIHByb2JhYmx5IHdhcyByZXBhY2tlZCByZWNlbnRseS4gR28gZmluZCB0aGUgb2JqZWN0Ci0JCQkvLyBhZ2FpbiBhbmQgb3BlbiB0aGUgc3RyZWFtIGZyb20gdGhhdCBsb2NhdGlvbiBpbnN0ZWFkLgotCQkJLy8KIAkJCXRyeSB7CisJCQkJcGFja0luID0gbmV3IFBhY2tJbnB1dFN0cmVhbSgKKwkJCQkJCXBhY2ssIG9iamVjdE9mZnNldCArIGhlYWRlckxlbmd0aCwgY3R4KTsKKwkJCQljdHggPSBudWxsOyAvLyBvd25lZCBieSBwYWNrSW4KKwkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIHBhY2tHb25lKSB7CisJCQkJLy8gSWYgdGhlIHBhY2sgZmlsZSBjYW5ub3QgYmUgcGlubmVkIGludG8gdGhlIGN1cnNvciwgaXQKKwkJCQkvLyBwcm9iYWJseSB3YXMgcmVwYWNrZWQgcmVjZW50bHkuIEdvIGZpbmQgdGhlIG9iamVjdAorCQkJCS8vIGFnYWluIGFuZCBvcGVuIHRoZSBzdHJlYW0gZnJvbSB0aGF0IGxvY2F0aW9uIGluc3RlYWQuCiAJCQkJT2JqZWN0SWQgb2JqID0gcGFjay5nZXRSZXZlcnNlSWR4KGN0eCkuZmluZE9iamVjdChvYmplY3RPZmZzZXQpOwogCQkJCXJldHVybiBjdHgub3BlbihvYmosIHR5cGUpLm9wZW5TdHJlYW0oKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJY3R4LmNsb3NlKCk7CiAJCQl9CiAJCX0gZmluYWxseSB7Ci0JCQljdHguY2xvc2UoKTsKKwkJCWlmIChjdHggIT0gbnVsbCkgeworCQkJCWN0eC5jbG9zZSgpOworCQkJfQogCQl9CiAKIAkJLy8gQWxpZ24gYnVmZmVyIHRvIGluZmxhdGVyIHNpemUsIGF0IGEgbGFyZ2VyIHRoYW4gZGVmYXVsdCBibG9jay4KIAkJLy8gVGhpcyByZWR1Y2VzIHRoZSBudW1iZXIgb2YgY29udGV4dCBzd2l0Y2hlcyBmcm9tIHRoZQogCQkvLyBjYWxsZXIgZG93biBpbnRvIHRoZSBwYWNrIHN0cmVhbSBpbmZsYXRpb24uCiAJCWludCBidWZzeiA9IDgxOTI7Ci0JCWluID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oCi0JCQkJbmV3IEluZmxhdGVySW5wdXRTdHJlYW0oaW4sIGN0eC5pbmZsYXRlcigpLCBidWZzeiksCisJCUlucHV0U3RyZWFtIGluID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oCisJCQkJbmV3IEluZmxhdGVySW5wdXRTdHJlYW0ocGFja0luLCBwYWNrSW4uY3R4LmluZmxhdGVyKCksIGJ1ZnN6KSwKIAkJCQlidWZzeik7CiAJCXJldHVybiBuZXcgT2JqZWN0U3RyZWFtLkZpbHRlcih0eXBlLCBzaXplLCBpbik7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9QYWNrSW5wdXRTdHJlYW0uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvUGFja0lucHV0U3RyZWFtLmphdmEKaW5kZXggZDg4MDExYy4uYjg1OWQ5ZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9QYWNrSW5wdXRTdHJlYW0uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL1BhY2tJbnB1dFN0cmVhbS5qYXZhCkBAIC00Nyw3ICs0Nyw3IEBACiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIAogZmluYWwgY2xhc3MgUGFja0lucHV0U3RyZWFtIGV4dGVuZHMgSW5wdXRTdHJlYW0gewotCXByaXZhdGUgZmluYWwgRGZzUmVhZGVyIGN0eDsKKwlmaW5hbCBEZnNSZWFkZXIgY3R4OwogCiAJcHJpdmF0ZSBmaW5hbCBEZnNQYWNrRmlsZSBwYWNrOwogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9CaXRtYXBJbmRleEltcGwuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0JpdG1hcEluZGV4SW1wbC5qYXZhCmluZGV4IDZhZGU0MzguLjFkYTQzMDQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0JpdG1hcEluZGV4SW1wbC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0JpdG1hcEluZGV4SW1wbC5qYXZhCkBAIC0yMTMsMjIgKzIxMyw2IEBAIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIENvbXByZXNzZWRCaXRtYXBCdWlsZGVyIGltcGxlbWVudHMgQml0bWFwQnVpbGRlciB7CiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gYWRkKEFueU9iamVjdElkIG9iamVjdElkLCBpbnQgdHlwZSkgewotCQkJaW50IHBvc2l0aW9uID0gYml0bWFwSW5kZXguZmluZE9ySW5zZXJ0KG9iamVjdElkLCB0eXBlKTsKLQkJCWlmIChiaXRzZXQuY29udGFpbnMocG9zaXRpb24pKQotCQkJCXJldHVybiBmYWxzZTsKLQotCQkJQml0bWFwIGVudHJ5ID0gYml0bWFwSW5kZXguZ2V0Qml0bWFwKG9iamVjdElkKTsKLQkJCWlmIChlbnRyeSAhPSBudWxsKSB7Ci0JCQkJb3IoZW50cnkpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJYml0c2V0LnNldChwb3NpdGlvbik7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCUBPdmVycmlkZQogCQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhBbnlPYmplY3RJZCBvYmplY3RJZCkgewogCQkJaW50IHBvc2l0aW9uID0gYml0bWFwSW5kZXguZmluZFBvc2l0aW9uKG9iamVjdElkKTsKIAkJCXJldHVybiAwIDw9IHBvc2l0aW9uICYmIGJpdHNldC5jb250YWlucyhwb3NpdGlvbik7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9CeXRlQXJyYXlXaW5kb3cuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0J5dGVBcnJheVdpbmRvdy5qYXZhCmluZGV4IDMzOGRmNGEuLmM2ZmRlYjAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0J5dGVBcnJheVdpbmRvdy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0J5dGVBcnJheVdpbmRvdy5qYXZhCkBAIC01OCwxNCArNTgsMTQgQEAKIGZpbmFsIGNsYXNzIEJ5dGVBcnJheVdpbmRvdyBleHRlbmRzIEJ5dGVXaW5kb3cgewogCXByaXZhdGUgZmluYWwgYnl0ZVtdIGFycmF5OwogCi0JQnl0ZUFycmF5V2luZG93KGZpbmFsIFBhY2tGaWxlIHBhY2ssIGZpbmFsIGxvbmcgbywgZmluYWwgYnl0ZVtdIGIpIHsKKwlCeXRlQXJyYXlXaW5kb3coUGFja0ZpbGUgcGFjaywgbG9uZyBvLCBieXRlW10gYikgewogCQlzdXBlcihwYWNrLCBvLCBiLmxlbmd0aCk7CiAJCWFycmF5ID0gYjsKIAl9CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXByb3RlY3RlZCBpbnQgY29weShmaW5hbCBpbnQgcCwgZmluYWwgYnl0ZVtdIGIsIGZpbmFsIGludCBvLCBpbnQgbikgeworCXByb3RlY3RlZCBpbnQgY29weShpbnQgcCwgYnl0ZVtdIGIsIGludCBvLCBpbnQgbikgewogCQluID0gTWF0aC5taW4oYXJyYXkubGVuZ3RoIC0gcCwgbik7CiAJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIHAsIGIsIG8sIG4pOwogCQlyZXR1cm4gbjsKQEAgLTczLDcgKzczLDcgQEAgcHJvdGVjdGVkIGludCBjb3B5KGZpbmFsIGludCBwLCBmaW5hbCBieXRlW10gYiwgZmluYWwgaW50IG8sIGludCBuKSB7CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXByb3RlY3RlZCBpbnQgc2V0SW5wdXQoZmluYWwgaW50IHBvcywgZmluYWwgSW5mbGF0ZXIgaW5mKQorCXByb3RlY3RlZCBpbnQgc2V0SW5wdXQoaW50IHBvcywgSW5mbGF0ZXIgaW5mKQogCQkJdGhyb3dzIERhdGFGb3JtYXRFeGNlcHRpb24gewogCQlpbnQgbiA9IGFycmF5Lmxlbmd0aCAtIHBvczsKIAkJaW5mLnNldElucHV0KGFycmF5LCBwb3MsIG4pOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvQnl0ZUJ1ZmZlcldpbmRvdy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvQnl0ZUJ1ZmZlcldpbmRvdy5qYXZhCmluZGV4IDRkY2YxMzMuLjhlNzkwNGYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0J5dGVCdWZmZXJXaW5kb3cuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9CeXRlQnVmZmVyV2luZG93LmphdmEKQEAgLTYwLDE0ICs2MCwxNCBAQAogZmluYWwgY2xhc3MgQnl0ZUJ1ZmZlcldpbmRvdyBleHRlbmRzIEJ5dGVXaW5kb3cgewogCXByaXZhdGUgZmluYWwgQnl0ZUJ1ZmZlciBidWZmZXI7CiAKLQlCeXRlQnVmZmVyV2luZG93KGZpbmFsIFBhY2tGaWxlIHBhY2ssIGZpbmFsIGxvbmcgbywgZmluYWwgQnl0ZUJ1ZmZlciBiKSB7CisJQnl0ZUJ1ZmZlcldpbmRvdyhQYWNrRmlsZSBwYWNrLCBsb25nIG8sIEJ5dGVCdWZmZXIgYikgewogCQlzdXBlcihwYWNrLCBvLCBiLmNhcGFjaXR5KCkpOwogCQlidWZmZXIgPSBiOwogCX0KIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGludCBjb3B5KGZpbmFsIGludCBwLCBmaW5hbCBieXRlW10gYiwgZmluYWwgaW50IG8sIGludCBuKSB7CisJcHJvdGVjdGVkIGludCBjb3B5KGludCBwLCBieXRlW10gYiwgaW50IG8sIGludCBuKSB7CiAJCWZpbmFsIEJ5dGVCdWZmZXIgcyA9IGJ1ZmZlci5zbGljZSgpOwogCQlzLnBvc2l0aW9uKHApOwogCQluID0gTWF0aC5taW4ocy5yZW1haW5pbmcoKSwgbik7CkBAIC05Miw3ICs5Miw3IEBAIHZvaWQgd3JpdGUoUGFja091dHB1dFN0cmVhbSBvdXQsIGxvbmcgcG9zLCBpbnQgY250KQogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgaW50IHNldElucHV0KGZpbmFsIGludCBwb3MsIGZpbmFsIEluZmxhdGVyIGluZikKKwlwcm90ZWN0ZWQgaW50IHNldElucHV0KGludCBwb3MsIEluZmxhdGVyIGluZikKIAkJCXRocm93cyBEYXRhRm9ybWF0RXhjZXB0aW9uIHsKIAkJZmluYWwgQnl0ZUJ1ZmZlciBzID0gYnVmZmVyLnNsaWNlKCk7CiAJCXMucG9zaXRpb24ocG9zKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0J5dGVXaW5kb3cuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0J5dGVXaW5kb3cuamF2YQppbmRleCA3OTYzY2VhLi42MDA3M2YzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9CeXRlV2luZG93LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvQnl0ZVdpbmRvdy5qYXZhCkBAIC03Niw3ICs3Niw3IEBAIGFic3RyYWN0IGNsYXNzIEJ5dGVXaW5kb3cgewogCSAqIEBwYXJhbSBuCiAJICogICAgICAgICAgICBzaXplIG9mIHRoZSBieXRlIHdpbmRvdwogCSAqLwotCXByb3RlY3RlZCBCeXRlV2luZG93KGZpbmFsIFBhY2tGaWxlIHAsIGZpbmFsIGxvbmcgcywgZmluYWwgaW50IG4pIHsKKwlwcm90ZWN0ZWQgQnl0ZVdpbmRvdyhQYWNrRmlsZSBwLCBsb25nIHMsIGludCBuKSB7CiAJCXBhY2sgPSBwOwogCQlzdGFydCA9IHM7CiAJCWVuZCA9IHN0YXJ0ICsgbjsKQEAgLTg2LDcgKzg2LDcgQEAgZmluYWwgaW50IHNpemUoKSB7CiAJCXJldHVybiAoaW50KSAoZW5kIC0gc3RhcnQpOwogCX0KIAotCWZpbmFsIGJvb2xlYW4gY29udGFpbnMoZmluYWwgUGFja0ZpbGUgbmVlZGVkRmlsZSwgZmluYWwgbG9uZyBuZWVkZWRQb3MpIHsKKwlmaW5hbCBib29sZWFuIGNvbnRhaW5zKFBhY2tGaWxlIG5lZWRlZEZpbGUsIGxvbmcgbmVlZGVkUG9zKSB7CiAJCXJldHVybiBwYWNrID09IG5lZWRlZEZpbGUgJiYgc3RhcnQgPD0gbmVlZGVkUG9zICYmIG5lZWRlZFBvcyA8IGVuZDsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0NhY2hlZE9iamVjdERpcmVjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvQ2FjaGVkT2JqZWN0RGlyZWN0b3J5LmphdmEKaW5kZXggZTgxMGFlMC4uN2Y3ZWNjMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvQ2FjaGVkT2JqZWN0RGlyZWN0b3J5LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvQ2FjaGVkT2JqZWN0RGlyZWN0b3J5LmphdmEKQEAgLTE4MSwxMSArMTgxLDExIEBAIHZvaWQgcmVzb2x2ZShTZXQ8T2JqZWN0SWQ+IG1hdGNoZXMsIEFiYnJldmlhdGVkT2JqZWN0SWQgaWQpCiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGhhcyhmaW5hbCBBbnlPYmplY3RJZCBvYmplY3RJZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgYm9vbGVhbiBoYXMoQW55T2JqZWN0SWQgb2JqZWN0SWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXJldHVybiBoYXMob2JqZWN0SWQsIG51bGwpOwogCX0KIAotCXByaXZhdGUgYm9vbGVhbiBoYXMoZmluYWwgQW55T2JqZWN0SWQgb2JqZWN0SWQsIFNldDxBbHRlcm5hdGVIYW5kbGUuSWQ+IHNraXBzKQorCXByaXZhdGUgYm9vbGVhbiBoYXMoQW55T2JqZWN0SWQgb2JqZWN0SWQsIFNldDxBbHRlcm5hdGVIYW5kbGUuSWQ+IHNraXBzKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJaWYgKHVucGFja2VkT2JqZWN0cy5jb250YWlucyhvYmplY3RJZCkpIHsKIAkJCXJldHVybiB0cnVlOwpAQCAtMjA1LDcgKzIwNSw3IEBAIHByaXZhdGUgYm9vbGVhbiBoYXMoZmluYWwgQW55T2JqZWN0SWQgb2JqZWN0SWQsIFNldDxBbHRlcm5hdGVIYW5kbGUuSWQ+IHNraXBzKQogCX0KIAogCUBPdmVycmlkZQotCU9iamVjdExvYWRlciBvcGVuT2JqZWN0KGZpbmFsIFdpbmRvd0N1cnNvciBjdXJzLCBmaW5hbCBBbnlPYmplY3RJZCBvYmplY3RJZCkKKwlPYmplY3RMb2FkZXIgb3Blbk9iamVjdChXaW5kb3dDdXJzb3IgY3VycywgQW55T2JqZWN0SWQgb2JqZWN0SWQpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlyZXR1cm4gb3Blbk9iamVjdChjdXJzLCBvYmplY3RJZCwgbnVsbCk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvRGVsdGFCYXNlQ2FjaGUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0RlbHRhQmFzZUNhY2hlLmphdmEKaW5kZXggYjM5Nzk4OS4uZWQ3M2U3MiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvRGVsdGFCYXNlQ2FjaGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9EZWx0YUJhc2VDYWNoZS5qYXZhCkBAIC01Miw3ICs1Miw3IEBAIGNsYXNzIERlbHRhQmFzZUNhY2hlIHsKIAogCXN0YXRpYyBmaW5hbCBTb2Z0UmVmZXJlbmNlPEVudHJ5PiBERUFEOwogCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGhhc2goZmluYWwgbG9uZyBwb3NpdGlvbikgeworCXByaXZhdGUgc3RhdGljIGludCBoYXNoKGxvbmcgcG9zaXRpb24pIHsKIAkJcmV0dXJuICgoKGludCkgcG9zaXRpb24pIDw8IDIyKSA+Pj4gMjI7CiAJfQogCkBAIC04Miw3ICs4Miw3IEBAIHN0YXRpYyB2b2lkIHJlY29uZmlndXJlKFdpbmRvd0NhY2hlQ29uZmlnIGNmZykgewogCQljYWNoZSA9IG5ldyBTbG90W0NBQ0hFX1NaXTsKIAl9CiAKLQlFbnRyeSBnZXQoZmluYWwgUGFja0ZpbGUgcGFjaywgZmluYWwgbG9uZyBwb3NpdGlvbikgeworCUVudHJ5IGdldChQYWNrRmlsZSBwYWNrLCBsb25nIHBvc2l0aW9uKSB7CiAJCVNsb3QgZSA9IGNhY2hlW2hhc2gocG9zaXRpb24pXTsKIAkJaWYgKGUgPT0gbnVsbCkKIAkJCXJldHVybiBudWxsOwpAQCAtMTM2LDcgKzEzNiw3IEBAIHByaXZhdGUgdm9pZCByZWxlYXNlTWVtb3J5KCkgewogCQl9CiAJfQogCi0JcHJpdmF0ZSB2b2lkIG1vdmVUb0hlYWQoZmluYWwgU2xvdCBlKSB7CisJcHJpdmF0ZSB2b2lkIG1vdmVUb0hlYWQoU2xvdCBlKSB7CiAJCXVubGluayhlKTsKIAkJZS5scnVQcmV2ID0gbnVsbDsKIAkJZS5scnVOZXh0ID0gbHJ1SGVhZDsKQEAgLTE0Nyw3ICsxNDcsNyBAQCBwcml2YXRlIHZvaWQgbW92ZVRvSGVhZChmaW5hbCBTbG90IGUpIHsKIAkJbHJ1SGVhZCA9IGU7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHVubGluayhmaW5hbCBTbG90IGUpIHsKKwlwcml2YXRlIHZvaWQgdW5saW5rKFNsb3QgZSkgewogCQlmaW5hbCBTbG90IHByZXYgPSBlLmxydVByZXY7CiAJCWZpbmFsIFNsb3QgbmV4dCA9IGUubHJ1TmV4dDsKIAkJaWYgKHByZXYgIT0gbnVsbCkKQEAgLTE1Niw3ICsxNTYsNyBAQCBwcml2YXRlIHZvaWQgdW5saW5rKGZpbmFsIFNsb3QgZSkgewogCQkJbmV4dC5scnVQcmV2ID0gcHJldjsKIAl9CiAKLQlwcml2YXRlIHZvaWQgY2xlYXJFbnRyeShmaW5hbCBTbG90IGUpIHsKKwlwcml2YXRlIHZvaWQgY2xlYXJFbnRyeShTbG90IGUpIHsKIAkJb3BlbkJ5dGVDb3VudCAtPSBlLnN6OwogCQllLnByb3ZpZGVyID0gbnVsbDsKIAkJZS5kYXRhID0gREVBRDsKQEAgLTE2OCw3ICsxNjgsNyBAQCBzdGF0aWMgY2xhc3MgRW50cnkgewogCiAJCWZpbmFsIGludCB0eXBlOwogCi0JCUVudHJ5KGZpbmFsIGJ5dGVbXSBhRGF0YSwgZmluYWwgaW50IGFUeXBlKSB7CisJCUVudHJ5KGJ5dGVbXSBhRGF0YSwgaW50IGFUeXBlKSB7CiAJCQlkYXRhID0gYURhdGE7CiAJCQl0eXBlID0gYVR5cGU7CiAJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0ZpbGVSZXBvc2l0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9GaWxlUmVwb3NpdG9yeS5qYXZhCmluZGV4IDliODIyMTAuLmQwMjg4OGEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0ZpbGVSZXBvc2l0b3J5LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvRmlsZVJlcG9zaXRvcnkuamF2YQpAQCAtNDYsOCArNDYsNiBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlOwogCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZkRhdGFiYXNlLkFMTDsKLQogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKQEAgLTEyNSw2ICsxMjMsMTAgQEAgcHVibGljIGNsYXNzIEZpbGVSZXBvc2l0b3J5IGV4dGVuZHMgUmVwb3NpdG9yeSB7CiAJcHJpdmF0ZSBmaW5hbCBGaWxlQmFzZWRDb25maWcgcmVwb0NvbmZpZzsKIAlwcml2YXRlIGZpbmFsIFJlZkRhdGFiYXNlIHJlZnM7CiAJcHJpdmF0ZSBmaW5hbCBPYmplY3REaXJlY3Rvcnkgb2JqZWN0RGF0YWJhc2U7CisKKwlwcml2YXRlIGZpbmFsIE9iamVjdCBzbmFwc2hvdExvY2sgPSBuZXcgT2JqZWN0KCk7CisKKwkvLyBwcm90ZWN0ZWQgYnkgc25hcHNob3RMb2NrCiAJcHJpdmF0ZSBGaWxlU25hcHNob3Qgc25hcHNob3Q7CiAKIAkvKioKQEAgLTE0Nyw3ICsxNDksNyBAQCBwdWJsaWMgY2xhc3MgRmlsZVJlcG9zaXRvcnkgZXh0ZW5kcyBSZXBvc2l0b3J5IHsKIAkgKiAgICAgICAgICAgICBhY2Nlc3NlZC4KIAkgKiBAc2VlIEZpbGVSZXBvc2l0b3J5QnVpbGRlcgogCSAqLwotCXB1YmxpYyBGaWxlUmVwb3NpdG9yeShmaW5hbCBGaWxlIGdpdERpcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgRmlsZVJlcG9zaXRvcnkoRmlsZSBnaXREaXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXRoaXMobmV3IEZpbGVSZXBvc2l0b3J5QnVpbGRlcigpLnNldEdpdERpcihnaXREaXIpLnNldHVwKCkpOwogCX0KIApAQCAtMTYxLDcgKzE2Myw3IEBAIHB1YmxpYyBGaWxlUmVwb3NpdG9yeShmaW5hbCBGaWxlIGdpdERpcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkgKiAgICAgICAgICAgICBhY2Nlc3NlZC4KIAkgKiBAc2VlIEZpbGVSZXBvc2l0b3J5QnVpbGRlcgogCSAqLwotCXB1YmxpYyBGaWxlUmVwb3NpdG9yeShmaW5hbCBTdHJpbmcgZ2l0RGlyKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyBGaWxlUmVwb3NpdG9yeShTdHJpbmcgZ2l0RGlyKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl0aGlzKG5ldyBGaWxlKGdpdERpcikpOwogCX0KIApAQCAtMTc0LDcgKzE3Niw3IEBAIHB1YmxpYyBGaWxlUmVwb3NpdG9yeShmaW5hbCBTdHJpbmcgZ2l0RGlyKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCSAqICAgICAgICAgICAgIHRoZSB1c2VyIGNvbmZpZ3VyYXRpb24gZmlsZSBvciByZXBvc2l0b3J5IGNvbmZpZ3VyYXRpb24gZmlsZQogCSAqICAgICAgICAgICAgIGNhbm5vdCBiZSBhY2Nlc3NlZC4KIAkgKi8KLQlwdWJsaWMgRmlsZVJlcG9zaXRvcnkoZmluYWwgQmFzZVJlcG9zaXRvcnlCdWlsZGVyIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIEZpbGVSZXBvc2l0b3J5KEJhc2VSZXBvc2l0b3J5QnVpbGRlciBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlzdXBlcihvcHRpb25zKTsKIAogCQlpZiAoU3RyaW5nVXRpbHMuaXNFbXB0eU9yTnVsbChTeXN0ZW1SZWFkZXIuZ2V0SW5zdGFuY2UoKS5nZXRlbnYoCkBAIC0yNDAsOCArMjQyLDkgQEAgcHVibGljIHZvaWQgb25Db25maWdDaGFuZ2VkKENvbmZpZ0NoYW5nZWRFdmVudCBldmVudCkgewogCQkJCQkJTG9uZy52YWx1ZU9mKHJlcG9zaXRvcnlGb3JtYXRWZXJzaW9uKSkpOwogCQl9CiAKLQkJaWYgKCFpc0JhcmUoKSkKKwkJaWYgKCFpc0JhcmUoKSkgewogCQkJc25hcHNob3QgPSBGaWxlU25hcHNob3Quc2F2ZShnZXRJbmRleEZpbGUoKSk7CisJCX0KIAl9CiAKIAlwcml2YXRlIHZvaWQgbG9hZFN5c3RlbUNvbmZpZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC01MzEsMzQgKzUzNCw0MyBAQCBwcml2YXRlIFNldDxPYmplY3RJZD4gZ2V0QWRkaXRpb25hbEhhdmVzKFNldDxBbHRlcm5hdGVIYW5kbGUuSWQ+IHNraXBzKSB7CiAJICogICAgICAgICAgICAgaW5kZXggZmlsZSBjb3VsZCBub3QgYmUgb3BlbmVkLCByZWFkLCBvciBpcyBub3QgcmVjb2duaXplZCBhcwogCSAqICAgICAgICAgICAgIGEgR2l0IHBhY2sgZmlsZSBpbmRleC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBvcGVuUGFjayhmaW5hbCBGaWxlIHBhY2spIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIHZvaWQgb3BlblBhY2soRmlsZSBwYWNrKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlvYmplY3REYXRhYmFzZS5vcGVuUGFjayhwYWNrKTsKIAl9CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHNjYW5Gb3JSZXBvQ2hhbmdlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcyhBTEwpOyAvLyBUaGlzIHdpbGwgbG9vayBmb3IgY2hhbmdlcyB0byByZWZzCisJCWdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcygpOyAvLyBUaGlzIHdpbGwgbG9vayBmb3IgY2hhbmdlcyB0byByZWZzCiAJCWRldGVjdEluZGV4Q2hhbmdlcygpOwogCX0KIAogCS8qKiBEZXRlY3QgaW5kZXggY2hhbmdlcy4gKi8KIAlwcml2YXRlIHZvaWQgZGV0ZWN0SW5kZXhDaGFuZ2VzKCkgewotCQlpZiAoaXNCYXJlKCkpCisJCWlmIChpc0JhcmUoKSkgewogCQkJcmV0dXJuOworCQl9CiAKIAkJRmlsZSBpbmRleEZpbGUgPSBnZXRJbmRleEZpbGUoKTsKLQkJaWYgKHNuYXBzaG90ID09IG51bGwpCi0JCQlzbmFwc2hvdCA9IEZpbGVTbmFwc2hvdC5zYXZlKGluZGV4RmlsZSk7Ci0JCWVsc2UgaWYgKHNuYXBzaG90LmlzTW9kaWZpZWQoaW5kZXhGaWxlKSkKLQkJCW5vdGlmeUluZGV4Q2hhbmdlZCgpOworCQlzeW5jaHJvbml6ZWQgKHNuYXBzaG90TG9jaykgeworCQkJaWYgKHNuYXBzaG90ID09IG51bGwpIHsKKwkJCQlzbmFwc2hvdCA9IEZpbGVTbmFwc2hvdC5zYXZlKGluZGV4RmlsZSk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJaWYgKCFzbmFwc2hvdC5pc01vZGlmaWVkKGluZGV4RmlsZSkpIHsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwkJbm90aWZ5SW5kZXhDaGFuZ2VkKGZhbHNlKTsKIAl9CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUluZGV4Q2hhbmdlZCgpIHsKLQkJc25hcHNob3QgPSBGaWxlU25hcHNob3Quc2F2ZShnZXRJbmRleEZpbGUoKSk7Ci0JCWZpcmVFdmVudChuZXcgSW5kZXhDaGFuZ2VkRXZlbnQoKSk7CisJcHVibGljIHZvaWQgbm90aWZ5SW5kZXhDaGFuZ2VkKGJvb2xlYW4gaW50ZXJuYWwpIHsKKwkJc3luY2hyb25pemVkIChzbmFwc2hvdExvY2spIHsKKwkJCXNuYXBzaG90ID0gRmlsZVNuYXBzaG90LnNhdmUoZ2V0SW5kZXhGaWxlKCkpOworCQl9CisJCWZpcmVFdmVudChuZXcgSW5kZXhDaGFuZ2VkRXZlbnQoaW50ZXJuYWwpKTsKIAl9CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvRmlsZVNuYXBzaG90LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9GaWxlU25hcHNob3QuamF2YQppbmRleCBiNTQ4NWM0Li5mMjZlYmEzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9GaWxlU25hcHNob3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9GaWxlU25hcHNob3QuamF2YQpAQCAtMjY4LDcgKzI2OCw3IEBAIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCQkJKyAiLCByZWFkOiAiICsgZi5mb3JtYXQobmV3IERhdGUobGFzdFJlYWQpKSArICJdIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJfQogCi0JcHJpdmF0ZSBib29sZWFuIG5vdFJhY3lDbGVhbihmaW5hbCBsb25nIHJlYWQpIHsKKwlwcml2YXRlIGJvb2xlYW4gbm90UmFjeUNsZWFuKGxvbmcgcmVhZCkgewogCQkvLyBUaGUgbGFzdCBtb2RpZmllZCB0aW1lIGdyYW51bGFyaXR5IG9mIEZBVCBmaWxlc3lzdGVtcyBpcyAyIHNlY29uZHMuCiAJCS8vIFVzaW5nIDIuNSBzZWNvbmRzIGhlcmUgcHJvdmlkZXMgYSByZWFzb25hYmx5IGhpZ2ggYXNzdXJhbmNlIHRoYXQKIAkJLy8gYSBtb2RpZmljYXRpb24gd2FzIG5vdCBtaXNzZWQuCkBAIC0yNzYsNyArMjc2LDcgQEAgcHJpdmF0ZSBib29sZWFuIG5vdFJhY3lDbGVhbihmaW5hbCBsb25nIHJlYWQpIHsKIAkJcmV0dXJuIHJlYWQgLSBsYXN0TW9kaWZpZWQgPiAyNTAwOwogCX0KIAotCXByaXZhdGUgYm9vbGVhbiBpc01vZGlmaWVkKGZpbmFsIGxvbmcgY3Vyckxhc3RNb2RpZmllZCkgeworCXByaXZhdGUgYm9vbGVhbiBpc01vZGlmaWVkKGxvbmcgY3Vyckxhc3RNb2RpZmllZCkgewogCQkvLyBBbnkgZGlmZmVyZW5jZSBpbmRpY2F0ZXMgdGhlIHBhdGggd2FzIG1vZGlmaWVkLgogCQkvLwogCQlpZiAobGFzdE1vZGlmaWVkICE9IGN1cnJMYXN0TW9kaWZpZWQpCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9HQy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvR0MuamF2YQppbmRleCAwNTk4ZGRkLi44NTlkYjQ4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9HQy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0dDLmphdmEKQEAgLTc2OSw3ICs3NjksOCBAQCBwcml2YXRlIHN0YXRpYyBib29sZWFuIGVxdWFscyhSZWYgcjEsIFJlZiByMikgewogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqLwogCXB1YmxpYyB2b2lkIHBhY2tSZWZzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJQ29sbGVjdGlvbjxSZWY+IHJlZnMgPSByZXBvLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcyhDb25zdGFudHMuUl9SRUZTKS52YWx1ZXMoKTsKKwkJQ29sbGVjdGlvbjxSZWY+IHJlZnMgPSByZXBvLmdldFJlZkRhdGFiYXNlKCkKKwkJCQkuZ2V0UmVmc0J5UHJlZml4KENvbnN0YW50cy5SX1JFRlMpOwogCQlMaXN0PFN0cmluZz4gcmVmc1RvQmVQYWNrZWQgPSBuZXcgQXJyYXlMaXN0PD4ocmVmcy5zaXplKCkpOwogCQlwbS5iZWdpblRhc2soSkdpdFRleHQuZ2V0KCkucGFja1JlZnMsIHJlZnMuc2l6ZSgpKTsKIAkJdHJ5IHsKQEAgLTgzNSw3ICs4MzYsNyBAQCBwdWJsaWMgQ29sbGVjdGlvbjxQYWNrRmlsZT4gcmVwYWNrKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJfQogCiAJCUxpc3Q8T2JqZWN0SWRTZXQ+IGV4Y2x1ZGVkID0gbmV3IExpbmtlZExpc3Q8PigpOwotCQlmb3IgKGZpbmFsIFBhY2tGaWxlIGYgOiByZXBvLmdldE9iamVjdERhdGFiYXNlKCkuZ2V0UGFja3MoKSkgeworCQlmb3IgKFBhY2tGaWxlIGYgOiByZXBvLmdldE9iamVjdERhdGFiYXNlKCkuZ2V0UGFja3MoKSkgewogCQkJY2hlY2tDYW5jZWxsZWQoKTsKIAkJCWlmIChmLnNob3VsZEJlS2VwdCgpKQogCQkJCWV4Y2x1ZGVkLmFkZChmLmdldEluZGV4KCkpOwpAQCAtOTk4LDYgKzk5OSw5IEBAIHByaXZhdGUgdm9pZCBkZWxldGVPcnBoYW5zKCkgewogCXByaXZhdGUgdm9pZCBkZWxldGVUZW1wUGFja3NJZHgoKSB7CiAJCVBhdGggcGFja0RpciA9IHJlcG8uZ2V0T2JqZWN0RGF0YWJhc2UoKS5nZXRQYWNrRGlyZWN0b3J5KCkudG9QYXRoKCk7CiAJCUluc3RhbnQgdGhyZXNob2xkID0gSW5zdGFudC5ub3coKS5taW51cygxLCBDaHJvbm9Vbml0LkRBWVMpOworCQlpZiAoIUZpbGVzLmV4aXN0cyhwYWNrRGlyKSkgeworCQkJcmV0dXJuOworCQl9CiAJCXRyeSAoRGlyZWN0b3J5U3RyZWFtPFBhdGg+IHN0cmVhbSA9CiAJCQkJRmlsZXMubmV3RGlyZWN0b3J5U3RyZWFtKHBhY2tEaXIsICJnY18qX3RtcCIpKSB7IC8vJE5PTi1OTFMtMSQKIAkJCXN0cmVhbS5mb3JFYWNoKHQgLT4gewpAQCAtMTA1OSw3ICsxMDYzLDcgQEAgcHJpdmF0ZSBTZXQ8T2JqZWN0SWQ+IGxpc3RSZWZMb2dPYmplY3RzKFJlZiByZWYsIGxvbmcgbWluVGltZSkgdGhyb3dzIElPRXhjZXB0aW8KIAkgKi8KIAlwcml2YXRlIENvbGxlY3Rpb248UmVmPiBnZXRBbGxSZWZzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJUmVmRGF0YWJhc2UgcmVmZGIgPSByZXBvLmdldFJlZkRhdGFiYXNlKCk7Ci0JCUNvbGxlY3Rpb248UmVmPiByZWZzID0gcmVmZGIuZ2V0UmVmcyhSZWZEYXRhYmFzZS5BTEwpLnZhbHVlcygpOworCQlDb2xsZWN0aW9uPFJlZj4gcmVmcyA9IHJlZmRiLmdldFJlZnMoKTsKIAkJTGlzdDxSZWY+IGFkZGwgPSByZWZkYi5nZXRBZGRpdGlvbmFsUmVmcygpOwogCQlpZiAoIWFkZGwuaXNFbXB0eSgpKSB7CiAJCQlMaXN0PFJlZj4gYWxsID0gbmV3IEFycmF5TGlzdDw+KHJlZnMuc2l6ZSgpICsgYWRkbC5zaXplKCkpOwpAQCAtMTM2Nyw3ICsxMzcxLDcgQEAgcHVibGljIFJlcG9TdGF0aXN0aWNzIGdldFN0YXRpc3RpY3MoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl9CiAKIAkJUmVmRGF0YWJhc2UgcmVmRGIgPSByZXBvLmdldFJlZkRhdGFiYXNlKCk7Ci0JCWZvciAoUmVmIHIgOiByZWZEYi5nZXRSZWZzKFJlZkRhdGFiYXNlLkFMTCkudmFsdWVzKCkpIHsKKwkJZm9yIChSZWYgciA6IHJlZkRiLmdldFJlZnMoKSkgewogCQkJU3RvcmFnZSBzdG9yYWdlID0gci5nZXRTdG9yYWdlKCk7CiAJCQlpZiAoc3RvcmFnZSA9PSBTdG9yYWdlLkxPT1NFIHx8IHN0b3JhZ2UgPT0gU3RvcmFnZS5MT09TRV9QQUNLRUQpCiAJCQkJcmV0Lm51bWJlck9mTG9vc2VSZWZzKys7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9HY0xvZy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvR2NMb2cuamF2YQppbmRleCA4MjQ1OGMxLi4wZTU4N2NlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9HY0xvZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0djTG9nLmphdmEKQEAgLTQzLDcgKzQzLDcgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CkBAIC0xNzEsNiArMTcxLDYgQEAgdm9pZCB3cml0ZShTdHJpbmcgY29udGVudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJaWYgKGNvbnRlbnQubGVuZ3RoKCkgPiAwKSB7CiAJCQlub25FbXB0eSA9IHRydWU7CiAJCX0KLQkJbG9jay53cml0ZShjb250ZW50LmdldEJ5dGVzKFVURl84KSk7CisJCWxvY2sud3JpdGUoY29udGVudC5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvTGF6eU9iamVjdElkU2V0RmlsZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvTGF6eU9iamVjdElkU2V0RmlsZS5qYXZhCmluZGV4IDNkMGU5YzcuLmM4MmQ1MmUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0xhenlPYmplY3RJZFNldEZpbGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9MYXp5T2JqZWN0SWRTZXRGaWxlLmphdmEKQEAgLTQzLDcgKzQzLDcgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogCiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKIGltcG9ydCBqYXZhLmlvLkZpbGU7CkBAIC04Niw3ICs4Niw3IEBAIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKEFueU9iamVjdElkIG9iamVjdElkKSB7CiAJcHJpdmF0ZSBPYmplY3RJZE93bmVyTWFwPEVudHJ5PiBsb2FkKCkgewogCQlPYmplY3RJZE93bmVyTWFwPEVudHJ5PiByID0gbmV3IE9iamVjdElkT3duZXJNYXA8PigpOwogCQl0cnkgKEZpbGVJbnB1dFN0cmVhbSBmaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHNyYyk7Ci0JCQkJUmVhZGVyIHJpbiA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihmaW4sIFVURl84KTsKKwkJCQlSZWFkZXIgcmluID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGZpbiwgQ0hBUlNFVCk7CiAJCQkJQnVmZmVyZWRSZWFkZXIgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIocmluKSkgewogCQkJTXV0YWJsZU9iamVjdElkIGlkID0gbmV3IE11dGFibGVPYmplY3RJZCgpOwogCQkJZm9yIChTdHJpbmcgbGluZTsgKGxpbmUgPSBici5yZWFkTGluZSgpKSAhPSBudWxsOykgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvTG9jYWxPYmplY3RUb1BhY2suamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0xvY2FsT2JqZWN0VG9QYWNrLmphdmEKaW5kZXggNTVlZWI5NS4uZWQ1Y2JmYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvTG9jYWxPYmplY3RUb1BhY2suamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9Mb2NhbE9iamVjdFRvUGFjay5qYXZhCkBAIC01OCw3ICs1OCw3IEBAIGNsYXNzIExvY2FsT2JqZWN0VG9QYWNrIGV4dGVuZHMgT2JqZWN0VG9QYWNrIHsKIAkvKiogTGVuZ3RoIG9mIHRoZSBkYXRhIHNlY3Rpb24gb2YgdGhlIG9iamVjdC4gKi8KIAlsb25nIGxlbmd0aDsKIAotCUxvY2FsT2JqZWN0VG9QYWNrKEFueU9iamVjdElkIHNyYywgZmluYWwgaW50IHR5cGUpIHsKKwlMb2NhbE9iamVjdFRvUGFjayhBbnlPYmplY3RJZCBzcmMsIGludCB0eXBlKSB7CiAJCXN1cGVyKHNyYywgdHlwZSk7CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9Mb2NrRmlsZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvTG9ja0ZpbGUuamF2YQppbmRleCA5YmVmZTJhLi5iODBjNThjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9Mb2NrRmlsZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0xvY2tGaWxlLmphdmEKQEAgLTkzLDcgKzkzLDcgQEAgcHVibGljIGNsYXNzIExvY2tGaWxlIHsKIAkgKiAgICAgICAgICAgIGEge0BsaW5rIGphdmEuaW8uRmlsZX0gb2JqZWN0LgogCSAqIEByZXR1cm4gdHJ1ZSBpZiB1bmxvY2tlZCwgZmFsc2UgaWYgdW5sb2NraW5nIGZhaWxlZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB1bmxvY2soZmluYWwgRmlsZSBmaWxlKSB7CisJcHVibGljIHN0YXRpYyBib29sZWFuIHVubG9jayhGaWxlIGZpbGUpIHsKIAkJZmluYWwgRmlsZSBsb2NrRmlsZSA9IGdldExvY2tGaWxlKGZpbGUpOwogCQlmaW5hbCBpbnQgZmxhZ3MgPSBGaWxlVXRpbHMuUkVUUlkgfCBGaWxlVXRpbHMuU0tJUF9NSVNTSU5HOwogCQl0cnkgewpAQCAtMTQ0LDI2ICsxNDQsOCBAQCBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBkaXIsIFN0cmluZyBuYW1lKSB7CiAJICoKIAkgKiBAcGFyYW0gZgogCSAqICAgICAgICAgICAgdGhlIGZpbGUgdGhhdCB3aWxsIGJlIGxvY2tlZC4KLQkgKiBAcGFyYW0gZnMKLQkgKiAgICAgICAgICAgIHRoZSBmaWxlIHN5c3RlbSBhYnN0cmFjdGlvbiB3aGljaCB3aWxsIGJlIG5lY2Vzc2FyeSB0byBwZXJmb3JtCi0JICogICAgICAgICAgICBjZXJ0YWluIGZpbGUgc3lzdGVtIG9wZXJhdGlvbnMuCi0JICogQGRlcHJlY2F0ZWQgdXNlCi0JICogICAgICAgICAgICAge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlLkxvY2tGaWxlI0xvY2tGaWxlKEZpbGUpfQotCSAqICAgICAgICAgICAgIGluc3RlYWQKIAkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyBMb2NrRmlsZShmaW5hbCBGaWxlIGYsIGZpbmFsIEZTIGZzKSB7Ci0JCXJlZiA9IGY7Ci0JCWxjayA9IGdldExvY2tGaWxlKHJlZik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGxvY2sgZm9yIGFueSBmaWxlLgotCSAqCi0JICogQHBhcmFtIGYKLQkgKiAgICAgICAgICAgIHRoZSBmaWxlIHRoYXQgd2lsbCBiZSBsb2NrZWQuCi0JICovCi0JcHVibGljIExvY2tGaWxlKGZpbmFsIEZpbGUgZikgeworCXB1YmxpYyBMb2NrRmlsZShGaWxlIGYpIHsKIAkJcmVmID0gZjsKIAkJbGNrID0gZ2V0TG9ja0ZpbGUocmVmKTsKIAl9CkBAIC0yODIsNyArMjY0LDcgQEAgcHVibGljIHZvaWQgY29weUN1cnJlbnRDb250ZW50KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkgKiAgICAgICAgICAgICB0aGUgdGVtcG9yYXJ5IGZpbGUgY291bGQgbm90IGJlIHdyaXR0ZW4uIFRoZSBsb2NrIGlzIHJlbGVhc2VkCiAJICogICAgICAgICAgICAgYmVmb3JlIHRocm93aW5nIHRoZSB1bmRlcmx5aW5nIGV4Y2VwdGlvbiB0byB0aGUgY2FsbGVyLgogCSAqLwotCXB1YmxpYyB2b2lkIHdyaXRlKGZpbmFsIE9iamVjdElkIGlkKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyB2b2lkIHdyaXRlKE9iamVjdElkIGlkKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlieXRlW10gYnVmID0gbmV3IGJ5dGVbQ29uc3RhbnRzLk9CSkVDVF9JRF9TVFJJTkdfTEVOR1RIICsgMV07CiAJCWlkLmNvcHlUbyhidWYsIDApOwogCQlidWZbQ29uc3RhbnRzLk9CSkVDVF9JRF9TVFJJTkdfTEVOR1RIXSA9ICdcbic7CkBAIC0zMDMsNyArMjg1LDcgQEAgcHVibGljIHZvaWQgd3JpdGUoZmluYWwgT2JqZWN0SWQgaWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJICogICAgICAgICAgICAgdGhlIHRlbXBvcmFyeSBmaWxlIGNvdWxkIG5vdCBiZSB3cml0dGVuLiBUaGUgbG9jayBpcyByZWxlYXNlZAogCSAqICAgICAgICAgICAgIGJlZm9yZSB0aHJvd2luZyB0aGUgdW5kZXJseWluZyBleGNlcHRpb24gdG8gdGhlIGNhbGxlci4KIAkgKi8KLQlwdWJsaWMgdm9pZCB3cml0ZShmaW5hbCBieXRlW10gY29udGVudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gY29udGVudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJcmVxdWlyZUxvY2soKTsKIAkJdHJ5IHsKIAkJCWlmIChmc3luYykgewpAQCAtMzQ5LDE4ICszMzEsMTggQEAgcHVibGljIE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oKSB7CiAKIAkJcmV0dXJuIG5ldyBPdXRwdXRTdHJlYW0oKSB7CiAJCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdyaXRlKGZpbmFsIGJ5dGVbXSBiLCBmaW5hbCBpbnQgbywgZmluYWwgaW50IG4pCisJCQlwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYiwgaW50IG8sIGludCBuKQogCQkJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJCW91dC53cml0ZShiLCBvLCBuKTsKIAkJCX0KIAogCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3cml0ZShmaW5hbCBieXRlW10gYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJCXB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBiKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJCW91dC53cml0ZShiKTsKIAkJCX0KIAogCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3cml0ZShmaW5hbCBpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJCXB1YmxpYyB2b2lkIHdyaXRlKGludCBiKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJCW91dC53cml0ZShiKTsKIAkJCX0KIApAQCAtNDAwLDcgKzM4Miw3IEBAIHZvaWQgcmVxdWlyZUxvY2soKSB7CiAJICogQHBhcmFtIG9uCiAJICogICAgICAgICAgICB0cnVlIGlmIHRoZSBjb21taXQgbWV0aG9kIG11c3QgcmVtZW1iZXIgdGhlIG1vZGlmaWNhdGlvbiB0aW1lLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldE5lZWRTdGF0SW5mb3JtYXRpb24oZmluYWwgYm9vbGVhbiBvbikgeworCXB1YmxpYyB2b2lkIHNldE5lZWRTdGF0SW5mb3JtYXRpb24oYm9vbGVhbiBvbikgewogCQlzZXROZWVkU25hcHNob3Qob24pOwogCX0KIApAQCAtNDExLDcgKzM5Myw3IEBAIHB1YmxpYyB2b2lkIHNldE5lZWRTdGF0SW5mb3JtYXRpb24oZmluYWwgYm9vbGVhbiBvbikgewogCSAqIEBwYXJhbSBvbgogCSAqICAgICAgICAgICAgdHJ1ZSBpZiB0aGUgY29tbWl0IG1ldGhvZCBtdXN0IHJlbWVtYmVyIHRoZSBGaWxlU25hcHNob3QuCiAJICovCi0JcHVibGljIHZvaWQgc2V0TmVlZFNuYXBzaG90KGZpbmFsIGJvb2xlYW4gb24pIHsKKwlwdWJsaWMgdm9pZCBzZXROZWVkU25hcHNob3QoYm9vbGVhbiBvbikgewogCQluZWVkU25hcHNob3QgPSBvbjsKIAl9CiAKQEAgLTQyMSw3ICs0MDMsNyBAQCBwdWJsaWMgdm9pZCBzZXROZWVkU25hcHNob3QoZmluYWwgYm9vbGVhbiBvbikgewogCSAqIEBwYXJhbSBvbgogCSAqICAgICAgICAgICAgdHJ1ZSBpZiBkaXJ0eSBkYXRhIHNob3VsZCBiZSBmb3JjZWQgdG8gdGhlIGRyaXZlLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldEZTeW5jKGZpbmFsIGJvb2xlYW4gb24pIHsKKwlwdWJsaWMgdm9pZCBzZXRGU3luYyhib29sZWFuIG9uKSB7CiAJCWZzeW5jID0gb247CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9PYmplY3REaXJlY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL09iamVjdERpcmVjdG9yeS5qYXZhCmluZGV4IDg4MWUzOGYuLjJiNmQyMzAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL09iamVjdERpcmVjdG9yeS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL09iamVjdERpcmVjdG9yeS5qYXZhCkBAIC0yNTcsNyArMjU3LDcgQEAgcHVibGljIHZvaWQgY2xvc2UoKSB7CiAJCS8vIEZ1bGx5IGNsb3NlIGFsbCBsb2FkZWQgYWx0ZXJuYXRlcyBhbmQgY2xlYXIgdGhlIGFsdGVybmF0ZSBsaXN0LgogCQlBbHRlcm5hdGVIYW5kbGVbXSBhbHQgPSBhbHRlcm5hdGVzLmdldCgpOwogCQlpZiAoYWx0ICE9IG51bGwgJiYgYWx0ZXJuYXRlcy5jb21wYXJlQW5kU2V0KGFsdCwgbnVsbCkpIHsKLQkJCWZvcihmaW5hbCBBbHRlcm5hdGVIYW5kbGUgb2QgOiBhbHQpCisJCQlmb3IoQWx0ZXJuYXRlSGFuZGxlIG9kIDogYWx0KQogCQkJCW9kLmNsb3NlKCk7CiAJCX0KIAl9CkBAIC0yNzgsNyArMjc4LDcgQEAgcHVibGljIENvbGxlY3Rpb248UGFja0ZpbGU+IGdldFBhY2tzKCkgewogCSAqIEFkZCBhIHNpbmdsZSBleGlzdGluZyBwYWNrIHRvIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBwYWNrIGZpbGVzLgogCSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBQYWNrRmlsZSBvcGVuUGFjayhmaW5hbCBGaWxlIHBhY2spCisJcHVibGljIFBhY2tGaWxlIG9wZW5QYWNrKEZpbGUgcGFjaykKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIFN0cmluZyBwID0gcGFjay5nZXROYW1lKCk7CiAJCWlmIChwLmxlbmd0aCgpICE9IDUwIHx8ICFwLnN0YXJ0c1dpdGgoInBhY2stIikgfHwgIXAuZW5kc1dpdGgoIi5wYWNrIikpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJApAQCAtNjIyLDcgKzYyMiw3IEBAIHByaXZhdGUgdm9pZCBzZWxlY3RPYmplY3RSZXByZXNlbnRhdGlvbihQYWNrV3JpdGVyIHBhY2tlciwgT2JqZWN0VG9QYWNrIG90cCwKIAkJCVdpbmRvd0N1cnNvciBjdXJzLCBTZXQ8QWx0ZXJuYXRlSGFuZGxlLklkPiBza2lwcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJUGFja0xpc3QgcExpc3QgPSBwYWNrTGlzdC5nZXQoKTsKIAkJU0VBUkNIOiBmb3IgKDs7KSB7Ci0JCQlmb3IgKGZpbmFsIFBhY2tGaWxlIHAgOiBwTGlzdC5wYWNrcykgeworCQkJZm9yIChQYWNrRmlsZSBwIDogcExpc3QucGFja3MpIHsKIAkJCQl0cnkgewogCQkJCQlMb2NhbE9iamVjdFJlcHJlc2VudGF0aW9uIHJlcCA9IHAucmVwcmVzZW50YXRpb24oY3Vycywgb3RwKTsKIAkJCQkJcC5yZXNldFRyYW5zaWVudEVycm9yQ291bnQoKTsKQEAgLTgxOSw3ICs4MTksNyBAQCBTZXQ8T2JqZWN0SWQ+IGdldFNoYWxsb3dDb21taXRzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJcmV0dXJuIHNoYWxsb3dDb21taXRzSWRzOwogCX0KIAotCXByaXZhdGUgdm9pZCBpbnNlcnRQYWNrKGZpbmFsIFBhY2tGaWxlIHBmKSB7CisJcHJpdmF0ZSB2b2lkIGluc2VydFBhY2soUGFja0ZpbGUgcGYpIHsKIAkJUGFja0xpc3QgbywgbjsKIAkJZG8gewogCQkJbyA9IHBhY2tMaXN0LmdldCgpOwpAQCAtODQyLDcgKzg0Miw3IEBAIHByaXZhdGUgdm9pZCBpbnNlcnRQYWNrKGZpbmFsIFBhY2tGaWxlIHBmKSB7CiAJCX0gd2hpbGUgKCFwYWNrTGlzdC5jb21wYXJlQW5kU2V0KG8sIG4pKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgcmVtb3ZlUGFjayhmaW5hbCBQYWNrRmlsZSBkZWFkUGFjaykgeworCXByaXZhdGUgdm9pZCByZW1vdmVQYWNrKFBhY2tGaWxlIGRlYWRQYWNrKSB7CiAJCVBhY2tMaXN0IG8sIG47CiAJCWRvIHsKIAkJCW8gPSBwYWNrTGlzdC5nZXQoKTsKQEAgLTg2MCw3ICs4NjAsNyBAQCBwcml2YXRlIHZvaWQgcmVtb3ZlUGFjayhmaW5hbCBQYWNrRmlsZSBkZWFkUGFjaykgewogCQlkZWFkUGFjay5jbG9zZSgpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIGludCBpbmRleE9mKGZpbmFsIFBhY2tGaWxlW10gbGlzdCwgZmluYWwgUGFja0ZpbGUgcGFjaykgeworCXByaXZhdGUgc3RhdGljIGludCBpbmRleE9mKFBhY2tGaWxlW10gbGlzdCwgUGFja0ZpbGUgcGFjaykgewogCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKIAkJCWlmIChsaXN0W2ldID09IHBhY2spCiAJCQkJcmV0dXJuIGk7CkBAIC04NjgsNyArODY4LDcgQEAgcHJpdmF0ZSBzdGF0aWMgaW50IGluZGV4T2YoZmluYWwgUGFja0ZpbGVbXSBsaXN0LCBmaW5hbCBQYWNrRmlsZSBwYWNrKSB7CiAJCXJldHVybiAtMTsKIAl9CiAKLQlwcml2YXRlIFBhY2tMaXN0IHNjYW5QYWNrcyhmaW5hbCBQYWNrTGlzdCBvcmlnaW5hbCkgeworCXByaXZhdGUgUGFja0xpc3Qgc2NhblBhY2tzKFBhY2tMaXN0IG9yaWdpbmFsKSB7CiAJCXN5bmNocm9uaXplZCAocGFja0xpc3QpIHsKIAkJCVBhY2tMaXN0IG8sIG47CiAJCQlkbyB7CkBAIC04ODcsMTMgKzg4NywxMyBAQCBwcml2YXRlIFBhY2tMaXN0IHNjYW5QYWNrcyhmaW5hbCBQYWNrTGlzdCBvcmlnaW5hbCkgewogCQl9CiAJfQogCi0JcHJpdmF0ZSBQYWNrTGlzdCBzY2FuUGFja3NJbXBsKGZpbmFsIFBhY2tMaXN0IG9sZCkgeworCXByaXZhdGUgUGFja0xpc3Qgc2NhblBhY2tzSW1wbChQYWNrTGlzdCBvbGQpIHsKIAkJZmluYWwgTWFwPFN0cmluZywgUGFja0ZpbGU+IGZvclJldXNlID0gcmV1c2VNYXAob2xkKTsKIAkJZmluYWwgRmlsZVNuYXBzaG90IHNuYXBzaG90ID0gRmlsZVNuYXBzaG90LnNhdmUocGFja0RpcmVjdG9yeSk7CiAJCWZpbmFsIFNldDxTdHJpbmc+IG5hbWVzID0gbGlzdFBhY2tEaXJlY3RvcnkoKTsKIAkJZmluYWwgTGlzdDxQYWNrRmlsZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8PihuYW1lcy5zaXplKCkgPj4gMik7CiAJCWJvb2xlYW4gZm91bmROZXcgPSBmYWxzZTsKLQkJZm9yIChmaW5hbCBTdHJpbmcgaW5kZXhOYW1lIDogbmFtZXMpIHsKKwkJZm9yIChTdHJpbmcgaW5kZXhOYW1lIDogbmFtZXMpIHsKIAkJCS8vIE11c3QgbWF0Y2ggInBhY2stWzAtOWEtZl17NDB9LmlkeCIgdG8gYmUgYW4gaW5kZXguCiAJCQkvLwogCQkJaWYgKGluZGV4TmFtZS5sZW5ndGgoKSAhPSA0OSB8fCAhaW5kZXhOYW1lLmVuZHNXaXRoKCIuaWR4IikpIC8vJE5PTi1OTFMtMSQKQEAgLTkzNiw3ICs5MzYsNyBAQCBwcml2YXRlIFBhY2tMaXN0IHNjYW5QYWNrc0ltcGwoZmluYWwgUGFja0xpc3Qgb2xkKSB7CiAJCQlyZXR1cm4gb2xkOwogCQl9CiAKLQkJZm9yIChmaW5hbCBQYWNrRmlsZSBwIDogZm9yUmV1c2UudmFsdWVzKCkpIHsKKwkJZm9yIChQYWNrRmlsZSBwIDogZm9yUmV1c2UudmFsdWVzKCkpIHsKIAkJCXAuY2xvc2UoKTsKIAkJfQogCkBAIC05NDgsOSArOTQ4LDkgQEAgcHJpdmF0ZSBQYWNrTGlzdCBzY2FuUGFja3NJbXBsKGZpbmFsIFBhY2tMaXN0IG9sZCkgewogCQlyZXR1cm4gbmV3IFBhY2tMaXN0KHNuYXBzaG90LCByKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBQYWNrRmlsZT4gcmV1c2VNYXAoZmluYWwgUGFja0xpc3Qgb2xkKSB7CisJcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgUGFja0ZpbGU+IHJldXNlTWFwKFBhY2tMaXN0IG9sZCkgewogCQlmaW5hbCBNYXA8U3RyaW5nLCBQYWNrRmlsZT4gZm9yUmV1c2UgPSBuZXcgSGFzaE1hcDw+KCk7Ci0JCWZvciAoZmluYWwgUGFja0ZpbGUgcCA6IG9sZC5wYWNrcykgeworCQlmb3IgKFBhY2tGaWxlIHAgOiBvbGQucGFja3MpIHsKIAkJCWlmIChwLmludmFsaWQoKSkgewogCQkJCS8vIFRoZSBwYWNrIGluc3RhbmNlIGlzIGNvcnJ1cHRlZCwgYW5kIGNhbm5vdCBiZSBzYWZlbHkgdXNlZAogCQkJCS8vIGFnYWluLiBEbyBub3QgaW5jbHVkZSBpdCBpbiBvdXIgcmV1c2UgbWFwLgpAQCAtOTc5LDcgKzk3OSw3IEBAIHByaXZhdGUgU2V0PFN0cmluZz4gbGlzdFBhY2tEaXJlY3RvcnkoKSB7CiAJCWlmIChuYW1lTGlzdCA9PSBudWxsKQogCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5U2V0KCk7CiAJCWZpbmFsIFNldDxTdHJpbmc+IG5hbWVTZXQgPSBuZXcgSGFzaFNldDw+KG5hbWVMaXN0Lmxlbmd0aCA8PCAxKTsKLQkJZm9yIChmaW5hbCBTdHJpbmcgbmFtZSA6IG5hbWVMaXN0KSB7CisJCWZvciAoU3RyaW5nIG5hbWUgOiBuYW1lTGlzdCkgewogCQkJaWYgKG5hbWUuc3RhcnRzV2l0aCgicGFjay0iKSkgLy8kTk9OLU5MUy0xJAogCQkJCW5hbWVTZXQuYWRkKG5hbWUpOwogCQl9CkBAIC0xMDM4LDEyICsxMDM4LDEyIEBAIFNldDxBbHRlcm5hdGVIYW5kbGUuSWQ+IGFkZE1lKFNldDxBbHRlcm5hdGVIYW5kbGUuSWQ+IHNraXBzKSB7CiAJCXJldHVybiBsLnRvQXJyYXkobmV3IEFsdGVybmF0ZUhhbmRsZVtsLnNpemUoKV0pOwogCX0KIAotCXByaXZhdGUgc3RhdGljIEJ1ZmZlcmVkUmVhZGVyIG9wZW4oZmluYWwgRmlsZSBmKQorCXByaXZhdGUgc3RhdGljIEJ1ZmZlcmVkUmVhZGVyIG9wZW4oRmlsZSBmKQogCQkJdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CiAJCXJldHVybiBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoZikpOwogCX0KIAotCXByaXZhdGUgQWx0ZXJuYXRlSGFuZGxlIG9wZW5BbHRlcm5hdGUoZmluYWwgU3RyaW5nIGxvY2F0aW9uKQorCXByaXZhdGUgQWx0ZXJuYXRlSGFuZGxlIG9wZW5BbHRlcm5hdGUoU3RyaW5nIGxvY2F0aW9uKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgRmlsZSBvYmpkaXIgPSBmcy5yZXNvbHZlKG9iamVjdHMsIGxvY2F0aW9uKTsKIAkJcmV0dXJuIG9wZW5BbHRlcm5hdGUob2JqZGlyKTsKQEAgLTEwODEsNyArMTA4MSw3IEBAIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFBhY2tMaXN0IHsKIAkJLyoqIEFsbCBrbm93biBwYWNrcywgc29ydGVkIGJ5IHtAbGluayBQYWNrRmlsZSNTT1JUfS4gKi8KIAkJZmluYWwgUGFja0ZpbGVbXSBwYWNrczsKIAotCQlQYWNrTGlzdChmaW5hbCBGaWxlU25hcHNob3QgbW9uaXRvciwgZmluYWwgUGFja0ZpbGVbXSBwYWNrcykgeworCQlQYWNrTGlzdChGaWxlU25hcHNob3QgbW9uaXRvciwgUGFja0ZpbGVbXSBwYWNrcykgewogCQkJdGhpcy5zbmFwc2hvdCA9IG1vbml0b3I7CiAJCQl0aGlzLnBhY2tzID0gcGFja3M7CiAJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL09iamVjdERpcmVjdG9yeUluc2VydGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9PYmplY3REaXJlY3RvcnlJbnNlcnRlci5qYXZhCmluZGV4IGUwNmY3MjEuLmU1YTU0ZTMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL09iamVjdERpcmVjdG9yeUluc2VydGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvT2JqZWN0RGlyZWN0b3J5SW5zZXJ0ZXIuamF2YQpAQCAtNzgsNyArNzgsNyBAQCBjbGFzcyBPYmplY3REaXJlY3RvcnlJbnNlcnRlciBleHRlbmRzIE9iamVjdEluc2VydGVyIHsKIAogCXByaXZhdGUgRGVmbGF0ZXIgZGVmbGF0ZTsKIAotCU9iamVjdERpcmVjdG9yeUluc2VydGVyKGZpbmFsIEZpbGVPYmplY3REYXRhYmFzZSBkZXN0LCBmaW5hbCBDb25maWcgY2ZnKSB7CisJT2JqZWN0RGlyZWN0b3J5SW5zZXJ0ZXIoRmlsZU9iamVjdERhdGFiYXNlIGRlc3QsIENvbmZpZyBjZmcpIHsKIAkJZGIgPSBkZXN0OwogCQljb25maWcgPSBjZmcuZ2V0KFdyaXRlQ29uZmlnLktFWSk7CiAJfQpAQCAtMTE3LDcgKzExNyw3IEBAIHByaXZhdGUgT2JqZWN0SWQgaW5zZXJ0KAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0SWQgaW5zZXJ0KGZpbmFsIGludCB0eXBlLCBsb25nIGxlbiwgZmluYWwgSW5wdXRTdHJlYW0gaXMpCisJcHVibGljIE9iamVjdElkIGluc2VydChpbnQgdHlwZSwgbG9uZyBsZW4sIElucHV0U3RyZWFtIGlzKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJcmV0dXJuIGluc2VydCh0eXBlLCBsZW4sIGlzLCBmYWxzZSk7CiAJfQpAQCAtMjY3LDcgKzI2Nyw3IEBAIHByaXZhdGUgRmlsZSB0b1RlbXAoZmluYWwgaW50IHR5cGUsIGZpbmFsIGJ5dGVbXSBidWYsIGZpbmFsIGludCBwb3MsCiAJCX0KIAl9CiAKLQl2b2lkIHdyaXRlSGVhZGVyKE91dHB1dFN0cmVhbSBvdXQsIGZpbmFsIGludCB0eXBlLCBsb25nIGxlbikKKwl2b2lkIHdyaXRlSGVhZGVyKE91dHB1dFN0cmVhbSBvdXQsIGludCB0eXBlLCBsb25nIGxlbikKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCW91dC53cml0ZShDb25zdGFudHMuZW5jb2RlZFR5cGVTdHJpbmcodHlwZSkpOwogCQlvdXQud3JpdGUoKGJ5dGUpICcgJyk7CkBAIC0yNzksNyArMjc5LDcgQEAgRmlsZSBuZXdUZW1wRmlsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXJldHVybiBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJub3oiLCBudWxsLCBkYi5nZXREaXJlY3RvcnkoKSk7IC8vJE5PTi1OTFMtMSQKIAl9CiAKLQlEZWZsYXRlck91dHB1dFN0cmVhbSBjb21wcmVzcyhmaW5hbCBPdXRwdXRTdHJlYW0gb3V0KSB7CisJRGVmbGF0ZXJPdXRwdXRTdHJlYW0gY29tcHJlc3MoT3V0cHV0U3RyZWFtIG91dCkgewogCQlpZiAoZGVmbGF0ZSA9PSBudWxsKQogCQkJZGVmbGF0ZSA9IG5ldyBEZWZsYXRlcihjb25maWcuZ2V0Q29tcHJlc3Npb24oKSk7CiAJCWVsc2UKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL09iamVjdERpcmVjdG9yeVBhY2tQYXJzZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL09iamVjdERpcmVjdG9yeVBhY2tQYXJzZXIuamF2YQppbmRleCA1ZGNiYTYwLi4wY2VjMmQ1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9PYmplY3REaXJlY3RvcnlQYWNrUGFyc2VyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvT2JqZWN0RGlyZWN0b3J5UGFja1BhcnNlci5qYXZhCkBAIC0xNTMsNyArMTUzLDcgQEAgcHVibGljIHZvaWQgc2V0SW5kZXhWZXJzaW9uKGludCB2ZXJzaW9uKSB7CiAJICogQHBhcmFtIGVtcHR5CiAJICogICAgICAgICAgICB0cnVlIHRvIGVuYWJsZSBrZWVwaW5nIGFuIGVtcHR5IHBhY2suCiAJICovCi0JcHVibGljIHZvaWQgc2V0S2VlcEVtcHR5KGZpbmFsIGJvb2xlYW4gZW1wdHkpIHsKKwlwdWJsaWMgdm9pZCBzZXRLZWVwRW1wdHkoYm9vbGVhbiBlbXB0eSkgewogCQlrZWVwRW1wdHkgPSBlbXB0eTsKIAl9CiAKQEAgLTQyOSw4ICs0MjksNyBAQCBwcm90ZWN0ZWQgdm9pZCBvbkVuZFRoaW5QYWNrKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAogCXByaXZhdGUgdm9pZCB3cml0ZUlkeCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCUxpc3Q8UGFja2VkT2JqZWN0SW5mbz4gbGlzdCA9IGdldFNvcnRlZE9iamVjdExpc3QobnVsbCAvKiBieSBPYmplY3RJZCAqLyk7Ci0JCWZpbmFsIEZpbGVPdXRwdXRTdHJlYW0gb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0bXBJZHgpOwotCQl0cnkgeworCQl0cnkgKEZpbGVPdXRwdXRTdHJlYW0gb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0bXBJZHgpKSB7CiAJCQlmaW5hbCBQYWNrSW5kZXhXcml0ZXIgaXc7CiAJCQlpZiAoaW5kZXhWZXJzaW9uIDw9IDApCiAJCQkJaXcgPSBQYWNrSW5kZXhXcml0ZXIuY3JlYXRlT2xkZXN0UG9zc2libGUob3MsIGxpc3QpOwpAQCAtNDM4LDEyICs0MzcsMTAgQEAgcHJpdmF0ZSB2b2lkIHdyaXRlSWR4KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCQlpdyA9IFBhY2tJbmRleFdyaXRlci5jcmVhdGVWZXJzaW9uKG9zLCBpbmRleFZlcnNpb24pOwogCQkJaXcud3JpdGUobGlzdCwgcGFja0hhc2gpOwogCQkJb3MuZ2V0Q2hhbm5lbCgpLmZvcmNlKHRydWUpOwotCQl9IGZpbmFsbHkgewotCQkJb3MuY2xvc2UoKTsKIAkJfQogCX0KIAotCXByaXZhdGUgUGFja0xvY2sgcmVuYW1lQW5kT3BlblBhY2soZmluYWwgU3RyaW5nIGxvY2tNZXNzYWdlKQorCXByaXZhdGUgUGFja0xvY2sgcmVuYW1lQW5kT3BlblBhY2soU3RyaW5nIGxvY2tNZXNzYWdlKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJaWYgKCFrZWVwRW1wdHkgJiYgZ2V0T2JqZWN0Q291bnQoKSA9PSAwKSB7CiAJCQljbGVhbnVwVGVtcG9yYXJ5RmlsZXMoKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tCaXRtYXBJbmRleC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0JpdG1hcEluZGV4LmphdmEKaW5kZXggMjFhMWM3Zi4uNjc3MmUyYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0JpdG1hcEluZGV4LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0JpdG1hcEluZGV4LmphdmEKQEAgLTQ0LDcgKzQ0LDYgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGU7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwpAQCAtNTMsNiArNTIsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuSkdpdFRleHQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQW55T2JqZWN0SWQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvLlNpbGVudEZpbGVJbnB1dFN0cmVhbTsKIAogaW1wb3J0IGNvbS5nb29nbGVjb2RlLmphdmFld2FoLkVXQUhDb21wcmVzc2VkQml0bWFwOwogCkBAIC05MywxOSArOTMsMTUgQEAgcHVibGljIGFic3RyYWN0IGNsYXNzIFBhY2tCaXRtYXBJbmRleCB7CiAJcHVibGljIHN0YXRpYyBQYWNrQml0bWFwSW5kZXggb3BlbigKIAkJCUZpbGUgaWR4RmlsZSwgUGFja0luZGV4IHBhY2tJbmRleCwgUGFja1JldmVyc2VJbmRleCByZXZlcnNlSW5kZXgpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmaW5hbCBGaWxlSW5wdXRTdHJlYW0gZmQgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGlkeEZpbGUpOwotCQl0cnkgewotCQkJcmV0dXJuIHJlYWQoZmQsIHBhY2tJbmRleCwgcmV2ZXJzZUluZGV4KTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oTWVzc2FnZUZvcm1hdAotCQkJCQkuZm9ybWF0KEpHaXRUZXh0LmdldCgpLnVucmVhZGFibGVQYWNrSW5kZXgsCi0JCQkJCQkJaWR4RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSksCi0JCQkJCWlvZSk7Ci0JCX0gZmluYWxseSB7CisJCXRyeSAoU2lsZW50RmlsZUlucHV0U3RyZWFtIGZkID0gbmV3IFNpbGVudEZpbGVJbnB1dFN0cmVhbSgKKwkJCQlpZHhGaWxlKSkgewogCQkJdHJ5IHsKLQkJCQlmZC5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXJyMikgewotCQkJCS8vIGlnbm9yZQorCQkJCXJldHVybiByZWFkKGZkLCBwYWNrSW5kZXgsIHJldmVyc2VJbmRleCk7CisJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKwkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oCisJCQkJCQlNZXNzYWdlRm9ybWF0LmZvcm1hdChKR2l0VGV4dC5nZXQoKS51bnJlYWRhYmxlUGFja0luZGV4LAorCQkJCQkJCQlpZHhGaWxlLmdldEFic29sdXRlUGF0aCgpKSwKKwkJCQkJCWlvZSk7CiAJCQl9CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrRmlsZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0ZpbGUuamF2YQppbmRleCAzNDExNTdmLi5lZTNjMGE4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrRmlsZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tGaWxlLmphdmEKQEAgLTEwMyw3ICsxMDMsNyBAQCBwdWJsaWMgY2xhc3MgUGFja0ZpbGUgaW1wbGVtZW50cyBJdGVyYWJsZTxQYWNrSW5kZXguTXV0YWJsZUVudHJ5PiB7CiAJLyoqIFNvcnRzIFBhY2tGaWxlcyB0byBiZSBtb3N0IHJlY2VudGx5IGNyZWF0ZWQgdG8gbGVhc3QgcmVjZW50bHkgY3JlYXRlZC4gKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBhcmF0b3I8UGFja0ZpbGU+IFNPUlQgPSBuZXcgQ29tcGFyYXRvcjxQYWNrRmlsZT4oKSB7CiAJCUBPdmVycmlkZQotCQlwdWJsaWMgaW50IGNvbXBhcmUoZmluYWwgUGFja0ZpbGUgYSwgZmluYWwgUGFja0ZpbGUgYikgeworCQlwdWJsaWMgaW50IGNvbXBhcmUoUGFja0ZpbGUgYSwgUGFja0ZpbGUgYikgewogCQkJcmV0dXJuIGIucGFja0xhc3RNb2RpZmllZCAtIGEucGFja0xhc3RNb2RpZmllZDsKIAkJfQogCX07CkBAIC0xNjQsNyArMTY0LDcgQEAgcHVibGljIGludCBjb21wYXJlKGZpbmFsIFBhY2tGaWxlIGEsIGZpbmFsIFBhY2tGaWxlIGIpIHsKIAkgKiBAcGFyYW0gZXh0ZW5zaW9ucwogCSAqICAgICAgICAgICAgYWRkaXRpb25hbCBwYWNrIGZpbGUgZXh0ZW5zaW9ucyB3aXRoIHRoZSBzYW1lIGJhc2UgYXMgdGhlIHBhY2sKIAkgKi8KLQlwdWJsaWMgUGFja0ZpbGUoZmluYWwgRmlsZSBwYWNrRmlsZSwgaW50IGV4dGVuc2lvbnMpIHsKKwlwdWJsaWMgUGFja0ZpbGUoRmlsZSBwYWNrRmlsZSwgaW50IGV4dGVuc2lvbnMpIHsKIAkJdGhpcy5wYWNrRmlsZSA9IHBhY2tGaWxlOwogCQl0aGlzLmZpbGVTbmFwc2hvdCA9IEZpbGVTbmFwc2hvdC5zYXZlKHBhY2tGaWxlKTsKIAkJdGhpcy5wYWNrTGFzdE1vZGlmaWVkID0gKGludCkgKGZpbGVTbmFwc2hvdC5sYXN0TW9kaWZpZWQoKSA+PiAxMCk7CkBAIC0yNjUsNyArMjY1LDcgQEAgcHVibGljIFN0cmluZyBnZXRQYWNrTmFtZSgpIHsKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0aGUgaW5kZXggZmlsZSBjYW5ub3QgYmUgbG9hZGVkIGludG8gbWVtb3J5LgogCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc09iamVjdChmaW5hbCBBbnlPYmplY3RJZCBpZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgYm9vbGVhbiBoYXNPYmplY3QoQW55T2JqZWN0SWQgaWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIGxvbmcgb2Zmc2V0ID0gaWR4KCkuZmluZE9mZnNldChpZCk7CiAJCXJldHVybiAwIDwgb2Zmc2V0ICYmICFpc0NvcnJ1cHQob2Zmc2V0KTsKIAl9CkBAIC0yOTMsNyArMjkzLDcgQEAgcHVibGljIGJvb2xlYW4gc2hvdWxkQmVLZXB0KCkgewogCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0aGUgcGFjayBmaWxlIG9yIHRoZSBpbmRleCBjb3VsZCBub3QgYmUgcmVhZC4KIAkgKi8KLQlPYmplY3RMb2FkZXIgZ2V0KGZpbmFsIFdpbmRvd0N1cnNvciBjdXJzLCBmaW5hbCBBbnlPYmplY3RJZCBpZCkKKwlPYmplY3RMb2FkZXIgZ2V0KFdpbmRvd0N1cnNvciBjdXJzLCBBbnlPYmplY3RJZCBpZCkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIGxvbmcgb2Zmc2V0ID0gaWR4KCkuZmluZE9mZnNldChpZCk7CiAJCXJldHVybiAwIDwgb2Zmc2V0ICYmICFpc0NvcnJ1cHQob2Zmc2V0KSA/IGxvYWQoY3Vycywgb2Zmc2V0KSA6IG51bGw7CkBAIC0zNTgsNyArMzU4LDcgQEAgbG9uZyBnZXRPYmplY3RDb3VudCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJICogQHRocm93cyBJT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHRoZSBpbmRleCBmaWxlIGNhbm5vdCBiZSBsb2FkZWQgaW50byBtZW1vcnkuCiAJICovCi0JT2JqZWN0SWQgZmluZE9iamVjdEZvck9mZnNldChmaW5hbCBsb25nIG9mZnNldCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlPYmplY3RJZCBmaW5kT2JqZWN0Rm9yT2Zmc2V0KGxvbmcgb2Zmc2V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlyZXR1cm4gZ2V0UmV2ZXJzZUlkeCgpLmZpbmRPYmplY3Qob2Zmc2V0KTsKIAl9CiAKQEAgLTcxNyw3ICs3MTcsNyBAQCBwcml2YXRlIHZvaWQgZG9DbG9zZSgpIHsKIAkJfQogCX0KIAotCUJ5dGVBcnJheVdpbmRvdyByZWFkKGZpbmFsIGxvbmcgcG9zLCBpbnQgc2l6ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlCeXRlQXJyYXlXaW5kb3cgcmVhZChsb25nIHBvcywgaW50IHNpemUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXN5bmNocm9uaXplZCAocmVhZExvY2spIHsKIAkJCWlmIChpbnZhbGlkIHx8IGZkID09IG51bGwpIHsKIAkJCQkvLyBEdWUgdG8gY29uY3VycmVuY3kgYmV0d2VlbiBhIHJlYWQgYW5kIGFub3RoZXIgcGFja2ZpbGUgaW52YWxpZGF0aW9uIHRocmVhZApAQCAtNzM2LDcgKzczNiw3IEBAIEJ5dGVBcnJheVdpbmRvdyByZWFkKGZpbmFsIGxvbmcgcG9zLCBpbnQgc2l6ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJfQogCX0KIAotCUJ5dGVXaW5kb3cgbW1hcChmaW5hbCBsb25nIHBvcywgaW50IHNpemUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJQnl0ZVdpbmRvdyBtbWFwKGxvbmcgcG9zLCBpbnQgc2l6ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJc3luY2hyb25pemVkIChyZWFkTG9jaykgewogCQkJaWYgKGxlbmd0aCA8IHBvcyArIHNpemUpCiAJCQkJc2l6ZSA9IChpbnQpIChsZW5ndGggLSBwb3MpOwpAQCAtNzkzLDcgKzc5Myw3IEBAIHByaXZhdGUgdm9pZCBvbk9wZW5QYWNrKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJfQogCX0KIAotCU9iamVjdExvYWRlciBsb2FkKGZpbmFsIFdpbmRvd0N1cnNvciBjdXJzLCBsb25nIHBvcykKKwlPYmplY3RMb2FkZXIgbG9hZChXaW5kb3dDdXJzb3IgY3VycywgbG9uZyBwb3MpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24sIExhcmdlT2JqZWN0RXhjZXB0aW9uIHsKIAkJdHJ5IHsKIAkJCWZpbmFsIGJ5dGVbXSBpYiA9IGN1cnMudGVtcElkOwpAQCAtOTgyLDcgKzk4Miw3IEBAIHByaXZhdGUgc3RhdGljIGNsYXNzIERlbHRhIHsKIAkJcmV0dXJuIGhkcjsKIAl9CiAKLQlpbnQgZ2V0T2JqZWN0VHlwZShmaW5hbCBXaW5kb3dDdXJzb3IgY3VycywgbG9uZyBwb3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJaW50IGdldE9iamVjdFR5cGUoV2luZG93Q3Vyc29yIGN1cnMsIGxvbmcgcG9zKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBieXRlW10gaWIgPSBjdXJzLnRlbXBJZDsKIAkJZm9yICg7OykgewogCQkJcmVhZEZ1bGx5KHBvcywgaWIsIDAsIDIwLCBjdXJzKTsKQEAgLTEwMjksMTMgKzEwMjksMTMgQEAgaW50IGdldE9iamVjdFR5cGUoZmluYWwgV2luZG93Q3Vyc29yIGN1cnMsIGxvbmcgcG9zKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl9CiAJfQogCi0JbG9uZyBnZXRPYmplY3RTaXplKGZpbmFsIFdpbmRvd0N1cnNvciBjdXJzLCBmaW5hbCBBbnlPYmplY3RJZCBpZCkKKwlsb25nIGdldE9iamVjdFNpemUoV2luZG93Q3Vyc29yIGN1cnMsIEFueU9iamVjdElkIGlkKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgbG9uZyBvZmZzZXQgPSBpZHgoKS5maW5kT2Zmc2V0KGlkKTsKIAkJcmV0dXJuIDAgPCBvZmZzZXQgPyBnZXRPYmplY3RTaXplKGN1cnMsIG9mZnNldCkgOiAtMTsKIAl9CiAKLQlsb25nIGdldE9iamVjdFNpemUoZmluYWwgV2luZG93Q3Vyc29yIGN1cnMsIGZpbmFsIGxvbmcgcG9zKQorCWxvbmcgZ2V0T2JqZWN0U2l6ZShXaW5kb3dDdXJzb3IgY3VycywgbG9uZyBwb3MpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBieXRlW10gaWIgPSBjdXJzLnRlbXBJZDsKIAkJcmVhZEZ1bGx5KHBvcywgaWIsIDAsIDIwLCBjdXJzKTsKQEAgLTExMzMsNyArMTEzMyw3IEBAIExvY2FsT2JqZWN0UmVwcmVzZW50YXRpb24gcmVwcmVzZW50YXRpb24oZmluYWwgV2luZG93Q3Vyc29yIGN1cnMsCiAJCX0KIAl9CiAKLQlwcml2YXRlIGxvbmcgZmluZEVuZE9mZnNldChmaW5hbCBsb25nIHN0YXJ0T2Zmc2V0KQorCXByaXZhdGUgbG9uZyBmaW5kRW5kT2Zmc2V0KGxvbmcgc3RhcnRPZmZzZXQpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24sIENvcnJ1cHRPYmplY3RFeGNlcHRpb24gewogCQlmaW5hbCBsb25nIG1heE9mZnNldCA9IGxlbmd0aCAtIDIwOwogCQlyZXR1cm4gZ2V0UmV2ZXJzZUlkeCgpLmZpbmROZXh0T2Zmc2V0KHN0YXJ0T2Zmc2V0LCBtYXhPZmZzZXQpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0luZGV4LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrSW5kZXguamF2YQppbmRleCBhY2ZkOWM0Li43MjY5OWIwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrSW5kZXguamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrSW5kZXguamF2YQpAQCAtNDUsNyArNDUsNiBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CkBAIC02NCw2ICs2Myw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWRTZXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLklPOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5OQjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuaW8uU2lsZW50RmlsZUlucHV0U3RyZWFtOwogCiAvKioKICAqIEFjY2VzcyBwYXRoIHRvIGxvY2F0ZSBvYmplY3RzIGJ5IHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJZH0gaW4gYQpAQCAtOTQsMjEgKzk0LDE1IEBAIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQYWNrSW5kZXgKIAkgKiAgICAgICAgICAgICB0aGUgZmlsZSBleGlzdHMgYnV0IGNvdWxkIG5vdCBiZSByZWFkIGR1ZSB0byBzZWN1cml0eSBlcnJvcnMsCiAJICogICAgICAgICAgICAgdW5yZWNvZ25pemVkIGRhdGEgdmVyc2lvbiwgb3IgdW5leHBlY3RlZCBkYXRhIGNvcnJ1cHRpb24uCiAJICovCi0JcHVibGljIHN0YXRpYyBQYWNrSW5kZXggb3BlbihmaW5hbCBGaWxlIGlkeEZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZpbmFsIEZpbGVJbnB1dFN0cmVhbSBmZCA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oaWR4RmlsZSk7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gcmVhZChmZCk7CisJcHVibGljIHN0YXRpYyBQYWNrSW5kZXggb3BlbihGaWxlIGlkeEZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXRyeSAoU2lsZW50RmlsZUlucHV0U3RyZWFtIGZkID0gbmV3IFNpbGVudEZpbGVJbnB1dFN0cmVhbSgKKwkJCQlpZHhGaWxlKSkgeworCQkJCXJldHVybiByZWFkKGZkKTsKIAkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oTWVzc2FnZUZvcm1hdAotCQkJCQkuZm9ybWF0KEpHaXRUZXh0LmdldCgpLnVucmVhZGFibGVQYWNrSW5kZXgsCisJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oCisJCQkJCU1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpHaXRUZXh0LmdldCgpLnVucmVhZGFibGVQYWNrSW5kZXgsCiAJCQkJCQkJaWR4RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSksCiAJCQkJCWlvZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWZkLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlcnIyKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9CiAJCX0KIAl9CiAKQEAgLTE0NSw3ICsxMzksNyBAQCBwdWJsaWMgc3RhdGljIFBhY2tJbmRleCByZWFkKElucHV0U3RyZWFtIGZkKSB0aHJvd3MgSU9FeGNlcHRpb24sCiAJCXJldHVybiBuZXcgUGFja0luZGV4VjEoZmQsIGhkcik7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1RPQyhmaW5hbCBieXRlW10gaCkgeworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNUT0MoYnl0ZVtdIGgpIHsKIAkJZmluYWwgYnl0ZVtdIHRvYyA9IFBhY2tJbmRleFdyaXRlci5UT0M7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgdG9jLmxlbmd0aDsgaSsrKQogCQkJaWYgKGhbaV0gIT0gdG9jW2ldKQpAQCAtMTYzLDcgKzE1Nyw3IEBAIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNUT0MoZmluYWwgYnl0ZVtdIGgpIHsKIAkgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gbG9vayBmb3IuIE11c3Qgbm90IGJlIG51bGwuCiAJICogQHJldHVybiB0cnVlIGlmIHRoZSBvYmplY3QgaXMgbGlzdGVkIGluIHRoaXMgaW5kZXg7IGZhbHNlIG90aGVyd2lzZS4KIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNPYmplY3QoZmluYWwgQW55T2JqZWN0SWQgaWQpIHsKKwlwdWJsaWMgYm9vbGVhbiBoYXNPYmplY3QoQW55T2JqZWN0SWQgaWQpIHsKIAkJcmV0dXJuIGZpbmRPZmZzZXQoaWQpICE9IC0xOwogCX0KIApAQCAtMjQ3LDcgKzI0MSw3IEBAIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKEFueU9iamVjdElkIGlkKSB7CiAJICogICAgICAgICAgICBuZWdhdGl2ZSwgYnV0IHN0aWxsIHZhbGlkLgogCSAqIEByZXR1cm4gdGhlIE9iamVjdElkIGZvciB0aGUgY29ycmVzcG9uZGluZyBlbnRyeS4KIAkgKi8KLQlwdWJsaWMgZmluYWwgT2JqZWN0SWQgZ2V0T2JqZWN0SWQoZmluYWwgaW50IG50aFBvc2l0aW9uKSB7CisJcHVibGljIGZpbmFsIE9iamVjdElkIGdldE9iamVjdElkKGludCBudGhQb3NpdGlvbikgewogCQlpZiAobnRoUG9zaXRpb24gPj0gMCkKIAkJCXJldHVybiBnZXRPYmplY3RJZCgobG9uZykgbnRoUG9zaXRpb24pOwogCQlmaW5hbCBpbnQgdTMxID0gbnRoUG9zaXRpb24gPj4+IDE7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrSW5kZXhWMS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0luZGV4VjEuamF2YQppbmRleCA4ZWEzMWU0Li40NDQ0ZGQ2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrSW5kZXhWMS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tJbmRleFYxLmphdmEKQEAgLTExMywxNCArMTEzLDE0IEBAIHB1YmxpYyBsb25nIGdldE9iamVjdENvdW50KCkgewogCUBPdmVycmlkZQogCXB1YmxpYyBsb25nIGdldE9mZnNldDY0Q291bnQoKSB7CiAJCWxvbmcgbjY0ID0gMDsKLQkJZm9yIChmaW5hbCBNdXRhYmxlRW50cnkgZSA6IHRoaXMpIHsKKwkJZm9yIChNdXRhYmxlRW50cnkgZSA6IHRoaXMpIHsKIAkJCWlmIChlLmdldE9mZnNldCgpID49IEludGVnZXIuTUFYX1ZBTFVFKQogCQkJCW42NCsrOwogCQl9CiAJCXJldHVybiBuNjQ7CiAJfQogCi0JcHJpdmF0ZSBpbnQgZmluZExldmVsT25lKGZpbmFsIGxvbmcgbnRoUG9zaXRpb24pIHsKKwlwcml2YXRlIGludCBmaW5kTGV2ZWxPbmUobG9uZyBudGhQb3NpdGlvbikgewogCQlpbnQgbGV2ZWxPbmUgPSBBcnJheXMuYmluYXJ5U2VhcmNoKGlkeEhlYWRlciwgbnRoUG9zaXRpb24gKyAxKTsKIAkJaWYgKGxldmVsT25lID49IDApIHsKIAkJCS8vIElmIHdlIGhpdCB0aGUgYnVja2V0IGV4YWN0bHkgdGhlIGl0ZW0gaXMgaW4gdGhlIGJ1Y2tldCwgb3IKQEAgLTEzNywxNCArMTM3LDE0IEBAIHByaXZhdGUgaW50IGZpbmRMZXZlbE9uZShmaW5hbCBsb25nIG50aFBvc2l0aW9uKSB7CiAJCXJldHVybiBsZXZlbE9uZTsKIAl9CiAKLQlwcml2YXRlIGludCBnZXRMZXZlbFR3byhmaW5hbCBsb25nIG50aFBvc2l0aW9uLCBmaW5hbCBpbnQgbGV2ZWxPbmUpIHsKKwlwcml2YXRlIGludCBnZXRMZXZlbFR3byhsb25nIG50aFBvc2l0aW9uLCBpbnQgbGV2ZWxPbmUpIHsKIAkJZmluYWwgbG9uZyBiYXNlID0gbGV2ZWxPbmUgPiAwID8gaWR4SGVhZGVyW2xldmVsT25lIC0gMV0gOiAwOwogCQlyZXR1cm4gKGludCkgKG50aFBvc2l0aW9uIC0gYmFzZSk7CiAJfQogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0SWQgZ2V0T2JqZWN0SWQoZmluYWwgbG9uZyBudGhQb3NpdGlvbikgeworCXB1YmxpYyBPYmplY3RJZCBnZXRPYmplY3RJZChsb25nIG50aFBvc2l0aW9uKSB7CiAJCWZpbmFsIGludCBsZXZlbE9uZSA9IGZpbmRMZXZlbE9uZShudGhQb3NpdGlvbik7CiAJCWZpbmFsIGludCBwID0gZ2V0TGV2ZWxUd28obnRoUG9zaXRpb24sIGxldmVsT25lKTsKIAkJZmluYWwgaW50IGRhdGFJZHggPSBpZE9mZnNldChwKTsKQEAgLTE2MSw3ICsxNjEsNyBAQCBsb25nIGdldE9mZnNldChsb25nIG50aFBvc2l0aW9uKSB7CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBsb25nIGZpbmRPZmZzZXQoZmluYWwgQW55T2JqZWN0SWQgb2JqSWQpIHsKKwlwdWJsaWMgbG9uZyBmaW5kT2Zmc2V0KEFueU9iamVjdElkIG9iaklkKSB7CiAJCWZpbmFsIGludCBsZXZlbE9uZSA9IG9iaklkLmdldEZpcnN0Qnl0ZSgpOwogCQlieXRlW10gZGF0YSA9IGlkeGRhdGFbbGV2ZWxPbmVdOwogCQlpZiAoZGF0YSA9PSBudWxsKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0luZGV4VjIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tJbmRleFYyLmphdmEKaW5kZXggOWY2MjAxZi4uYTk2MDZjZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0luZGV4VjIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrSW5kZXhWMi5qYXZhCkBAIC0xNzYsNyArMTc2LDcgQEAgcHVibGljIGxvbmcgZ2V0T2Zmc2V0NjRDb3VudCgpIHsKIAkJcmV0dXJuIG9mZnNldDY0Lmxlbmd0aCAvIDg7CiAJfQogCi0JcHJpdmF0ZSBpbnQgZmluZExldmVsT25lKGZpbmFsIGxvbmcgbnRoUG9zaXRpb24pIHsKKwlwcml2YXRlIGludCBmaW5kTGV2ZWxPbmUobG9uZyBudGhQb3NpdGlvbikgewogCQlpbnQgbGV2ZWxPbmUgPSBBcnJheXMuYmluYXJ5U2VhcmNoKGZhbm91dFRhYmxlLCBudGhQb3NpdGlvbiArIDEpOwogCQlpZiAobGV2ZWxPbmUgPj0gMCkgewogCQkJLy8gSWYgd2UgaGl0IHRoZSBidWNrZXQgZXhhY3RseSB0aGUgaXRlbSBpcyBpbiB0aGUgYnVja2V0LCBvcgpAQCAtMTkzLDE0ICsxOTMsMTQgQEAgcHJpdmF0ZSBpbnQgZmluZExldmVsT25lKGZpbmFsIGxvbmcgbnRoUG9zaXRpb24pIHsKIAkJcmV0dXJuIGxldmVsT25lOwogCX0KIAotCXByaXZhdGUgaW50IGdldExldmVsVHdvKGZpbmFsIGxvbmcgbnRoUG9zaXRpb24sIGZpbmFsIGludCBsZXZlbE9uZSkgeworCXByaXZhdGUgaW50IGdldExldmVsVHdvKGxvbmcgbnRoUG9zaXRpb24sIGludCBsZXZlbE9uZSkgewogCQlmaW5hbCBsb25nIGJhc2UgPSBsZXZlbE9uZSA+IDAgPyBmYW5vdXRUYWJsZVtsZXZlbE9uZSAtIDFdIDogMDsKIAkJcmV0dXJuIChpbnQpIChudGhQb3NpdGlvbiAtIGJhc2UpOwogCX0KIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdElkIGdldE9iamVjdElkKGZpbmFsIGxvbmcgbnRoUG9zaXRpb24pIHsKKwlwdWJsaWMgT2JqZWN0SWQgZ2V0T2JqZWN0SWQobG9uZyBudGhQb3NpdGlvbikgewogCQlmaW5hbCBpbnQgbGV2ZWxPbmUgPSBmaW5kTGV2ZWxPbmUobnRoUG9zaXRpb24pOwogCQlmaW5hbCBpbnQgcCA9IGdldExldmVsVHdvKG50aFBvc2l0aW9uLCBsZXZlbE9uZSk7CiAJCWZpbmFsIGludCBwNCA9IHAgPDwgMjsKQEAgLTIwOSw3ICsyMDksNyBAQCBwdWJsaWMgT2JqZWN0SWQgZ2V0T2JqZWN0SWQoZmluYWwgbG9uZyBudGhQb3NpdGlvbikgewogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgbG9uZyBnZXRPZmZzZXQoZmluYWwgbG9uZyBudGhQb3NpdGlvbikgeworCXB1YmxpYyBsb25nIGdldE9mZnNldChsb25nIG50aFBvc2l0aW9uKSB7CiAJCWZpbmFsIGludCBsZXZlbE9uZSA9IGZpbmRMZXZlbE9uZShudGhQb3NpdGlvbik7CiAJCWZpbmFsIGludCBsZXZlbFR3byA9IGdldExldmVsVHdvKG50aFBvc2l0aW9uLCBsZXZlbE9uZSk7CiAJCXJldHVybiBnZXRPZmZzZXQobGV2ZWxPbmUsIGxldmVsVHdvKTsKQEAgLTIxNyw3ICsyMTcsNyBAQCBwdWJsaWMgbG9uZyBnZXRPZmZzZXQoZmluYWwgbG9uZyBudGhQb3NpdGlvbikgewogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgbG9uZyBmaW5kT2Zmc2V0KGZpbmFsIEFueU9iamVjdElkIG9iaklkKSB7CisJcHVibGljIGxvbmcgZmluZE9mZnNldChBbnlPYmplY3RJZCBvYmpJZCkgewogCQlmaW5hbCBpbnQgbGV2ZWxPbmUgPSBvYmpJZC5nZXRGaXJzdEJ5dGUoKTsKIAkJZmluYWwgaW50IGxldmVsVHdvID0gYmluYXJ5U2VhcmNoTGV2ZWxUd28ob2JqSWQsIGxldmVsT25lKTsKIAkJaWYgKGxldmVsVHdvID09IC0xKQpAQCAtMjI1LDcgKzIyNSw3IEBAIHB1YmxpYyBsb25nIGZpbmRPZmZzZXQoZmluYWwgQW55T2JqZWN0SWQgb2JqSWQpIHsKIAkJcmV0dXJuIGdldE9mZnNldChsZXZlbE9uZSwgbGV2ZWxUd28pOwogCX0KIAotCXByaXZhdGUgbG9uZyBnZXRPZmZzZXQoZmluYWwgaW50IGxldmVsT25lLCBmaW5hbCBpbnQgbGV2ZWxUd28pIHsKKwlwcml2YXRlIGxvbmcgZ2V0T2Zmc2V0KGludCBsZXZlbE9uZSwgaW50IGxldmVsVHdvKSB7CiAJCWZpbmFsIGxvbmcgcCA9IE5CLmRlY29kZVVJbnQzMihvZmZzZXQzMltsZXZlbE9uZV0sIGxldmVsVHdvIDw8IDIpOwogCQlpZiAoKHAgJiBJU19PNjQpICE9IDApCiAJCQlyZXR1cm4gTkIuZGVjb2RlVUludDY0KG9mZnNldDY0LCAoOCAqIChpbnQpIChwICYgfklTX082NCkpKTsKQEAgLTI5MCw3ICsyOTAsNyBAQCBwcml2YXRlIHN0YXRpYyBpbnQgaWRPZmZzZXQoaW50IHApIHsKIAkJcmV0dXJuIChwIDw8IDIpICsgcDsgLy8gcCAqIDUKIAl9CiAKLQlwcml2YXRlIGludCBiaW5hcnlTZWFyY2hMZXZlbFR3byhmaW5hbCBBbnlPYmplY3RJZCBvYmpJZCwgZmluYWwgaW50IGxldmVsT25lKSB7CisJcHJpdmF0ZSBpbnQgYmluYXJ5U2VhcmNoTGV2ZWxUd28oQW55T2JqZWN0SWQgb2JqSWQsIGludCBsZXZlbE9uZSkgewogCQlmaW5hbCBpbnRbXSBkYXRhID0gbmFtZXNbbGV2ZWxPbmVdOwogCQlpbnQgaGlnaCA9IG9mZnNldDMyW2xldmVsT25lXS5sZW5ndGggPj4+IDI7CiAJCWlmIChoaWdoID09IDApCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrSW5kZXhXcml0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tJbmRleFdyaXRlci5qYXZhCmluZGV4IGI5MmY3YjIuLjU1M2Y3YzkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tJbmRleFdyaXRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tJbmRleFdyaXRlci5qYXZhCkBAIC0xMjMsNyArMTIzLDcgQEAgcHVibGljIHN0YXRpYyBQYWNrSW5kZXhXcml0ZXIgY3JlYXRlT2xkZXN0UG9zc2libGUoZmluYWwgT3V0cHV0U3RyZWFtIGRzdCwKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGludCBvbGRlc3RQb3NzaWJsZUZvcm1hdCgKIAkJCWZpbmFsIExpc3Q8PyBleHRlbmRzIFBhY2tlZE9iamVjdEluZm8+IG9ianMpIHsKLQkJZm9yIChmaW5hbCBQYWNrZWRPYmplY3RJbmZvIG9lIDogb2JqcykgeworCQlmb3IgKFBhY2tlZE9iamVjdEluZm8gb2UgOiBvYmpzKSB7CiAJCQlpZiAoIVBhY2tJbmRleFdyaXRlclYxLmNhblN0b3JlKG9lKSkKIAkJCQlyZXR1cm4gMjsKIAkJfQpAQCAtMTgwLDcgKzE4MCw3IEBAIHB1YmxpYyBzdGF0aWMgUGFja0luZGV4V3JpdGVyIGNyZWF0ZVZlcnNpb24oZmluYWwgT3V0cHV0U3RyZWFtIGRzdCwKIAkgKiAgICAgICAgICAgIHRoZSBzdHJlYW0gdGhpcyBpbnN0YW5jZSBvdXRwdXRzIHRvLiBJZiBub3QgYWxyZWFkeSBidWZmZXJlZAogCSAqICAgICAgICAgICAgaXQgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHdyYXBwZWQgaW4gYSBidWZmZXJlZCBzdHJlYW0uCiAJICovCi0JcHJvdGVjdGVkIFBhY2tJbmRleFdyaXRlcihmaW5hbCBPdXRwdXRTdHJlYW0gZHN0KSB7CisJcHJvdGVjdGVkIFBhY2tJbmRleFdyaXRlcihPdXRwdXRTdHJlYW0gZHN0KSB7CiAJCW91dCA9IG5ldyBEaWdlc3RPdXRwdXRTdHJlYW0oZHN0IGluc3RhbmNlb2YgQnVmZmVyZWRPdXRwdXRTdHJlYW0gPyBkc3QKIAkJCQk6IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShkc3QpLAogCQkJCUNvbnN0YW50cy5uZXdNZXNzYWdlRGlnZXN0KCkpOwpAQCAtMjUwLDcgKzI1MCw3IEBAIHB1YmxpYyB2b2lkIHdyaXRlKGZpbmFsIExpc3Q8PyBleHRlbmRzIFBhY2tlZE9iamVjdEluZm8+IHRvU3RvcmUsCiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgd3JpdGluZyB0byB0aGUgb3V0cHV0IHN0cmVhbS4KIAkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB3cml0ZVRPQyhmaW5hbCBpbnQgdmVyc2lvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwcm90ZWN0ZWQgdm9pZCB3cml0ZVRPQyhpbnQgdmVyc2lvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJb3V0LndyaXRlKFRPQyk7CiAJCU5CLmVuY29kZUludDMyKHRtcCwgMCwgdmVyc2lvbik7CiAJCW91dC53cml0ZSh0bXAsIDAsIDQpOwpAQCAtMjY5LDExICsyNjksMTEgQEAgcHJvdGVjdGVkIHZvaWQgd3JpdGVUT0MoZmluYWwgaW50IHZlcnNpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJICovCiAJcHJvdGVjdGVkIHZvaWQgd3JpdGVGYW5PdXRUYWJsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIGludFtdIGZhbm91dCA9IG5ldyBpbnRbMjU2XTsKLQkJZm9yIChmaW5hbCBQYWNrZWRPYmplY3RJbmZvIHBvIDogZW50cmllcykKKwkJZm9yIChQYWNrZWRPYmplY3RJbmZvIHBvIDogZW50cmllcykKIAkJCWZhbm91dFtwby5nZXRGaXJzdEJ5dGUoKSAmIDB4ZmZdKys7CiAJCWZvciAoaW50IGkgPSAxOyBpIDwgMjU2OyBpKyspCiAJCQlmYW5vdXRbaV0gKz0gZmFub3V0W2kgLSAxXTsKLQkJZm9yIChmaW5hbCBpbnQgbiA6IGZhbm91dCkgeworCQlmb3IgKGludCBuIDogZmFub3V0KSB7CiAJCQlOQi5lbmNvZGVJbnQzMih0bXAsIDAsIG4pOwogCQkJb3V0LndyaXRlKHRtcCwgMCwgNCk7CiAJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tJbmRleFdyaXRlclYxLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrSW5kZXhXcml0ZXJWMS5qYXZhCmluZGV4IGYyMjBlN2EuLjg3N2Y3YzggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tJbmRleFdyaXRlclYxLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0luZGV4V3JpdGVyVjEuamF2YQpAQCAtNTgsNyArNTgsNyBAQAogICogQHNlZSBQYWNrSW5kZXhWMQogICovCiBjbGFzcyBQYWNrSW5kZXhXcml0ZXJWMSBleHRlbmRzIFBhY2tJbmRleFdyaXRlciB7Ci0Jc3RhdGljIGJvb2xlYW4gY2FuU3RvcmUoZmluYWwgUGFja2VkT2JqZWN0SW5mbyBvZSkgeworCXN0YXRpYyBib29sZWFuIGNhblN0b3JlKFBhY2tlZE9iamVjdEluZm8gb2UpIHsKIAkJLy8gV2UgYXJlIGxpbWl0ZWQgdG8gNCBHQiBwZXIgcGFjayBhcyBvZmZzZXQgaXMgMzIgYml0IHVuc2lnbmVkIGludC4KIAkJLy8KIAkJcmV0dXJuIG9lLmdldE9mZnNldCgpID4+PiAxIDwgSW50ZWdlci5NQVhfVkFMVUU7CkBAIC03Myw3ICs3Myw3IEBAIHN0YXRpYyBib29sZWFuIGNhblN0b3JlKGZpbmFsIFBhY2tlZE9iamVjdEluZm8gb2UpIHsKIAlwcm90ZWN0ZWQgdm9pZCB3cml0ZUltcGwoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl3cml0ZUZhbk91dFRhYmxlKCk7CiAKLQkJZm9yIChmaW5hbCBQYWNrZWRPYmplY3RJbmZvIG9lIDogZW50cmllcykgeworCQlmb3IgKFBhY2tlZE9iamVjdEluZm8gb2UgOiBlbnRyaWVzKSB7CiAJCQlpZiAoIWNhblN0b3JlKG9lKSkKIAkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oSkdpdFRleHQuZ2V0KCkucGFja1Rvb0xhcmdlRm9ySW5kZXhWZXJzaW9uMSk7CiAJCQlOQi5lbmNvZGVJbnQzMih0bXAsIDAsIChpbnQpIG9lLmdldE9mZnNldCgpKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tJbmRleFdyaXRlclYyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrSW5kZXhXcml0ZXJWMi5qYXZhCmluZGV4IGExOGNjYWYuLjk1MDVkMzUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tJbmRleFdyaXRlclYyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0luZGV4V3JpdGVyVjIuamF2YQpAQCAtNzYsMTIgKzc2LDEyIEBAIHByb3RlY3RlZCB2b2lkIHdyaXRlSW1wbCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJfQogCiAJcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0TmFtZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmb3IgKGZpbmFsIFBhY2tlZE9iamVjdEluZm8gb2UgOiBlbnRyaWVzKQorCQlmb3IgKFBhY2tlZE9iamVjdEluZm8gb2UgOiBlbnRyaWVzKQogCQkJb2UuY29weVJhd1RvKG91dCk7CiAJfQogCiAJcHJpdmF0ZSB2b2lkIHdyaXRlQ1JDcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZvciAoZmluYWwgUGFja2VkT2JqZWN0SW5mbyBvZSA6IGVudHJpZXMpIHsKKwkJZm9yIChQYWNrZWRPYmplY3RJbmZvIG9lIDogZW50cmllcykgewogCQkJTkIuZW5jb2RlSW50MzIodG1wLCAwLCBvZS5nZXRDUkMoKSk7CiAJCQlvdXQud3JpdGUodG1wLCAwLCA0KTsKIAkJfQpAQCAtODksNyArODksNyBAQCBwcml2YXRlIHZvaWQgd3JpdGVDUkNzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAogCXByaXZhdGUgdm9pZCB3cml0ZU9mZnNldDMyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJaW50IG82NCA9IDA7Ci0JCWZvciAoZmluYWwgUGFja2VkT2JqZWN0SW5mbyBvZSA6IGVudHJpZXMpIHsKKwkJZm9yIChQYWNrZWRPYmplY3RJbmZvIG9lIDogZW50cmllcykgewogCQkJZmluYWwgbG9uZyBvID0gb2UuZ2V0T2Zmc2V0KCk7CiAJCQlpZiAobyA8PSBNQVhfT0ZGU0VUXzMyKQogCQkJCU5CLmVuY29kZUludDMyKHRtcCwgMCwgKGludCkgbyk7CkBAIC0xMDAsNyArMTAwLDcgQEAgcHJpdmF0ZSB2b2lkIHdyaXRlT2Zmc2V0MzIoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCX0KIAogCXByaXZhdGUgdm9pZCB3cml0ZU9mZnNldDY0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZm9yIChmaW5hbCBQYWNrZWRPYmplY3RJbmZvIG9lIDogZW50cmllcykgeworCQlmb3IgKFBhY2tlZE9iamVjdEluZm8gb2UgOiBlbnRyaWVzKSB7CiAJCQlmaW5hbCBsb25nIG8gPSBvZS5nZXRPZmZzZXQoKTsKIAkJCWlmIChNQVhfT0ZGU0VUXzMyIDwgbykgewogCQkJCU5CLmVuY29kZUludDY0KHRtcCwgMCwgbyk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrSW5zZXJ0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tJbnNlcnRlci5qYXZhCmluZGV4IDdmZjI2OTYuLjBjZTNjYzkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tJbnNlcnRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tJbnNlcnRlci5qYXZhCkBAIC00MzgsNyArNDM4LDcgQEAgcHJpdmF0ZSBpbnQgZW5jb2RlVHlwZVNpemUoaW50IHR5cGUsIGxvbmcgcmF3TGVuZ3RoKSB7CiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgd3JpdGUoZmluYWwgaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXB1YmxpYyB2b2lkIHdyaXRlKGludCBiKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJaGRyQnVmWzBdID0gKGJ5dGUpIGI7CiAJCQl3cml0ZShoZHJCdWYsIDAsIDEpOwogCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrTG9jay5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0xvY2suamF2YQppbmRleCA4MmYwZGExLi4wZmI4OTExIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrTG9jay5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tMb2NrLmphdmEKQEAgLTY1LDcgKzY1LDcgQEAgcHVibGljIGNsYXNzIFBhY2tMb2NrIHsKIAkgKiBAcGFyYW0gZnMKIAkgKiAgICAgICAgICAgIHRoZSBmaWxlc3lzdGVtIGFic3RyYWN0aW9uIHVzZWQgYnkgdGhlIHJlcG9zaXRvcnkuCiAJICovCi0JcHVibGljIFBhY2tMb2NrKGZpbmFsIEZpbGUgcGFja0ZpbGUsIGZpbmFsIEZTIGZzKSB7CisJcHVibGljIFBhY2tMb2NrKEZpbGUgcGFja0ZpbGUsIEZTIGZzKSB7CiAJCWZpbmFsIEZpbGUgcCA9IHBhY2tGaWxlLmdldFBhcmVudEZpbGUoKTsKIAkJZmluYWwgU3RyaW5nIG4gPSBwYWNrRmlsZS5nZXROYW1lKCk7CiAJCWtlZXBGaWxlID0gbmV3IEZpbGUocCwgbi5zdWJzdHJpbmcoMCwgbi5sZW5ndGgoKSAtIDUpICsgIi5rZWVwIik7IC8vJE5PTi1OTFMtMSQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tSZXZlcnNlSW5kZXguamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tSZXZlcnNlSW5kZXguamF2YQppbmRleCA5NDRhZjI2Li5kZmUyM2JhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrUmV2ZXJzZUluZGV4LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja1JldmVyc2VJbmRleC5qYXZhCkBAIC04OCw3ICs4OCw3IEBAIHB1YmxpYyBjbGFzcyBQYWNrUmV2ZXJzZUluZGV4IHsKIAkgKiBAcGFyYW0gcGFja0luZGV4CiAJICogICAgICAgICAgICBmb3J3YXJkIGluZGV4IC0gZW50cmllcyB0byAocmV2ZXJzZSkgaW5kZXguCiAJICovCi0JcHVibGljIFBhY2tSZXZlcnNlSW5kZXgoZmluYWwgUGFja0luZGV4IHBhY2tJbmRleCkgeworCXB1YmxpYyBQYWNrUmV2ZXJzZUluZGV4KFBhY2tJbmRleCBwYWNrSW5kZXgpIHsKIAkJaW5kZXggPSBwYWNrSW5kZXg7CiAKIAkJZmluYWwgbG9uZyBjbnQgPSBpbmRleC5nZXRPYmplY3RDb3VudCgpOwpAQCAtMTA3LDcgKzEwNyw3IEBAIHB1YmxpYyBQYWNrUmV2ZXJzZUluZGV4KGZpbmFsIFBhY2tJbmRleCBwYWNrSW5kZXgpIHsKIAogCQlsb25nIG1heE9mZnNldCA9IDA7CiAJCWludCBpdGggPSAwOwotCQlmb3IgKGZpbmFsIE11dGFibGVFbnRyeSBtZSA6IGluZGV4KSB7CisJCWZvciAoTXV0YWJsZUVudHJ5IG1lIDogaW5kZXgpIHsKIAkJCWZpbmFsIGxvbmcgbyA9IG1lLmdldE9mZnNldCgpOwogCQkJb2Zmc2V0c0J5U2hhMVtpdGgrK10gPSBvOwogCQkJaWYgKG8gPiBtYXhPZmZzZXQpCkBAIC0xNTUsNyArMTU1LDcgQEAgcHVibGljIFBhY2tSZXZlcnNlSW5kZXgoZmluYWwgUGFja0luZGV4IHBhY2tJbmRleCkgewogCSAqICAgICAgICAgICAgc3RhcnQgb2Zmc2V0IG9mIG9iamVjdCB0byBmaW5kLgogCSAqIEByZXR1cm4gb2JqZWN0IGlkIGZvciB0aGlzIG9mZnNldCwgb3IgbnVsbCBpZiBubyBvYmplY3Qgd2FzIGZvdW5kLgogCSAqLwotCXB1YmxpYyBPYmplY3RJZCBmaW5kT2JqZWN0KGZpbmFsIGxvbmcgb2Zmc2V0KSB7CisJcHVibGljIE9iamVjdElkIGZpbmRPYmplY3QobG9uZyBvZmZzZXQpIHsKIAkJZmluYWwgaW50IGl0aCA9IGJpbmFyeVNlYXJjaChvZmZzZXQpOwogCQlpZiAoaXRoIDwgMCkKIAkJCXJldHVybiBudWxsOwpAQCAtMTc3LDcgKzE3Nyw3IEBAIHB1YmxpYyBPYmplY3RJZCBmaW5kT2JqZWN0KGZpbmFsIGxvbmcgb2Zmc2V0KSB7CiAJICogQHRocm93cyBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5Db3JydXB0T2JqZWN0RXhjZXB0aW9uCiAJICogICAgICAgICAgICAgd2hlbiB0aGVyZSBpcyBubyBvYmplY3Qgd2l0aCB0aGUgcHJvdmlkZWQgb2Zmc2V0LgogCSAqLwotCXB1YmxpYyBsb25nIGZpbmROZXh0T2Zmc2V0KGZpbmFsIGxvbmcgb2Zmc2V0LCBmaW5hbCBsb25nIG1heE9mZnNldCkKKwlwdWJsaWMgbG9uZyBmaW5kTmV4dE9mZnNldChsb25nIG9mZnNldCwgbG9uZyBtYXhPZmZzZXQpCiAJCQl0aHJvd3MgQ29ycnVwdE9iamVjdEV4Y2VwdGlvbiB7CiAJCWZpbmFsIGludCBpdGggPSBiaW5hcnlTZWFyY2gob2Zmc2V0KTsKIAkJaWYgKGl0aCA8IDApCkBAIC0xOTUsNyArMTk1LDcgQEAgaW50IGZpbmRQb3N0aW9uKGxvbmcgb2Zmc2V0KSB7CiAJCXJldHVybiBiaW5hcnlTZWFyY2gob2Zmc2V0KTsKIAl9CiAKLQlwcml2YXRlIGludCBiaW5hcnlTZWFyY2goZmluYWwgbG9uZyBvZmZzZXQpIHsKKwlwcml2YXRlIGludCBiaW5hcnlTZWFyY2gobG9uZyBvZmZzZXQpIHsKIAkJaW50IGJ1Y2tldCA9IChpbnQpIChvZmZzZXQgLyBidWNrZXRTaXplKTsKIAkJaW50IGxvdyA9IGJ1Y2tldCA9PSAwID8gMCA6IG9mZnNldEluZGV4W2J1Y2tldCAtIDFdOwogCQlpbnQgaGlnaCA9IG9mZnNldEluZGV4W2J1Y2tldF07CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9SZWZEaXJlY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1JlZkRpcmVjdG9yeS5qYXZhCmluZGV4IDEwNmM4NGIuLjZhMThkZjggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1JlZkRpcmVjdG9yeS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1JlZkRpcmVjdG9yeS5qYXZhCkBAIC0yMDksNyArMjA5LDcgQEAgcHVibGljIGNsYXNzIFJlZkRpcmVjdG9yeSBleHRlbmRzIFJlZkRhdGFiYXNlIHsKIAogCXByaXZhdGUgTGlzdDxJbnRlZ2VyPiByZXRyeVNsZWVwTXMgPSBSRVRSWV9TTEVFUF9NUzsKIAotCVJlZkRpcmVjdG9yeShmaW5hbCBGaWxlUmVwb3NpdG9yeSBkYikgeworCVJlZkRpcmVjdG9yeShGaWxlUmVwb3NpdG9yeSBkYikgewogCQlmaW5hbCBGUyBmcyA9IGRiLmdldEZTKCk7CiAJCXBhcmVudCA9IGRiOwogCQlnaXREaXIgPSBkYi5nZXREaXJlY3RvcnkoKTsKQEAgLTM0Niw3ICszNDYsNyBAQCBwdWJsaWMgUmVmIGV4YWN0UmVmKFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVmIGdldFJlZihmaW5hbCBTdHJpbmcgbmVlZGxlKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyBSZWYgZ2V0UmVmKFN0cmluZyBuZWVkbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIFJlZkxpc3Q8UmVmPiBwYWNrZWQgPSBnZXRQYWNrZWRSZWZzKCk7CiAJCVJlZiByZWYgPSBudWxsOwogCQlmb3IgKFN0cmluZyBwcmVmaXggOiBTRUFSQ0hfUEFUSCkgewpAQCAtNDM1LDcgKzQzNSw3IEBAIHByaXZhdGUgY2xhc3MgTG9vc2VTY2FubmVyIHsKIAogCQlSZWZMaXN0LkJ1aWxkZXI8TG9vc2VSZWY+IG5ld0xvb3NlOwogCi0JCUxvb3NlU2Nhbm5lcihmaW5hbCBSZWZMaXN0PExvb3NlUmVmPiBjdXJMb29zZSkgeworCQlMb29zZVNjYW5uZXIoUmVmTGlzdDxMb29zZVJlZj4gY3VyTG9vc2UpIHsKIAkJCXRoaXMuY3VyTG9vc2UgPSBjdXJMb29zZTsKIAkJfQogCkBAIC01NDYsNyArNTQ2LDcgQEAgcHJpdmF0ZSB2b2lkIHNjYW5PbmUoU3RyaW5nIG5hbWUpIHsKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIFJlZiBwZWVsKGZpbmFsIFJlZiByZWYpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIFJlZiBwZWVsKFJlZiByZWYpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIFJlZiBsZWFmID0gcmVmLmdldExlYWYoKTsKIAkJaWYgKGxlYWYuaXNQZWVsZWQoKSB8fCBsZWFmLmdldE9iamVjdElkKCkgPT0gbnVsbCkKIAkJCXJldHVybiByZWY7CkBAIC01NjgsNyArNTY4LDcgQEAgcHVibGljIFJlZiBwZWVsKGZpbmFsIFJlZiByZWYpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXJldHVybiByZWNyZWF0ZShyZWYsIG5ld0xlYWYpOwogCX0KIAotCXByaXZhdGUgT2JqZWN0SWRSZWYgZG9QZWVsKGZpbmFsIFJlZiBsZWFmKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKKwlwcml2YXRlIE9iamVjdElkUmVmIGRvUGVlbChSZWYgbGVhZikgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCiAJCQlJT0V4Y2VwdGlvbiB7CiAJCXRyeSAoUmV2V2FsayBydyA9IG5ldyBSZXZXYWxrKGdldFJlcG9zaXRvcnkoKSkpIHsKIAkJCVJldk9iamVjdCBvYmogPSBydy5wYXJzZUFueShsZWFmLmdldE9iamVjdElkKCkpOwpAQCAtNTgyLDcgKzU4Miw3IEBAIHByaXZhdGUgT2JqZWN0SWRSZWYgZG9QZWVsKGZpbmFsIFJlZiBsZWFmKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKIAkJfQogCX0KIAotCXByaXZhdGUgc3RhdGljIFJlZiByZWNyZWF0ZShmaW5hbCBSZWYgb2xkLCBmaW5hbCBPYmplY3RJZFJlZiBsZWFmKSB7CisJcHJpdmF0ZSBzdGF0aWMgUmVmIHJlY3JlYXRlKFJlZiBvbGQsIE9iamVjdElkUmVmIGxlYWYpIHsKIAkJaWYgKG9sZC5pc1N5bWJvbGljKCkpIHsKIAkJCVJlZiBkc3QgPSByZWNyZWF0ZShvbGQuZ2V0VGFyZ2V0KCksIGxlYWYpOwogCQkJcmV0dXJuIG5ldyBTeW1ib2xpY1JlZihvbGQuZ2V0TmFtZSgpLCBkc3QpOwpAQCAtOTcyLDcgKzk3Miw3IEBAIHByaXZhdGUgUGFja2VkUmVmTGlzdCByZWFkUGFja2VkUmVmcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCX0KIAl9CiAKLQlwcml2YXRlIFJlZkxpc3Q8UmVmPiBwYXJzZVBhY2tlZFJlZnMoZmluYWwgQnVmZmVyZWRSZWFkZXIgYnIpCisJcHJpdmF0ZSBSZWZMaXN0PFJlZj4gcGFyc2VQYWNrZWRSZWZzKEJ1ZmZlcmVkUmVhZGVyIGJyKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJUmVmTGlzdC5CdWlsZGVyPFJlZj4gYWxsID0gbmV3IFJlZkxpc3QuQnVpbGRlcjw+KCk7CiAJCVJlZiBsYXN0ID0gbnVsbDsKQEAgLTEwMjQsNyArMTAyNCw3IEBAIHByaXZhdGUgUmVmTGlzdDxSZWY+IHBhcnNlUGFja2VkUmVmcyhmaW5hbCBCdWZmZXJlZFJlYWRlciBicikKIAkJcmV0dXJuIGFsbC50b1JlZkxpc3QoKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgY29weShmaW5hbCBTdHJpbmcgc3JjLCBmaW5hbCBpbnQgb2ZmLCBmaW5hbCBpbnQgZW5kKSB7CisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNvcHkoU3RyaW5nIHNyYywgaW50IG9mZiwgaW50IGVuZCkgewogCQkvLyBEb24ndCB1c2Ugc3Vic3RyaW5nIHNpbmNlIGl0IGNvdWxkIGxlYXZlIGEgcmVmZXJlbmNlIHRvIHRoZSBtdWNoCiAJCS8vIGxhcmdlciBleGlzdGluZyBzdHJpbmcuIEZvcmNlIGNvbnN0cnVjdGlvbiBvZiBhIGZ1bGwgbmV3IG9iamVjdC4KIAkJcmV0dXJuIG5ldyBTdHJpbmdCdWlsZGVyKGVuZCAtIG9mZikuYXBwZW5kKHNyYywgb2ZmLCBlbmQpLnRvU3RyaW5nKCk7CkBAIC0xMTkwLDcgKzExOTAsNyBAQCBMb29zZVJlZiBzY2FuUmVmKExvb3NlUmVmIHJlZiwgU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXJldHVybiBuZXcgTG9vc2VVbnBlZWxlZChvdGhlclNuYXBzaG90LCBuYW1lLCBpZCk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1N5bVJlZihmaW5hbCBieXRlW10gYnVmLCBpbnQgbikgeworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNTeW1SZWYoYnl0ZVtdIGJ1ZiwgaW50IG4pIHsKIAkJaWYgKG4gPCA2KQogCQkJcmV0dXJuIGZhbHNlOwogCQlyZXR1cm4gLyoqL2J1ZlswXSA9PSAncicgLy8KQEAgLTEyNjMsMTggKzEyNjMsMTggQEAgRmlsZSBmaWxlRm9yKFN0cmluZyBuYW1lKSB7CiAJCXJldHVybiBuZXcgRmlsZShnaXREaXIsIG5hbWUpOwogCX0KIAotCXN0YXRpYyBpbnQgbGV2ZWxzSW4oZmluYWwgU3RyaW5nIG5hbWUpIHsKKwlzdGF0aWMgaW50IGxldmVsc0luKFN0cmluZyBuYW1lKSB7CiAJCWludCBjb3VudCA9IDA7CiAJCWZvciAoaW50IHAgPSBuYW1lLmluZGV4T2YoJy8nKTsgcCA+PSAwOyBwID0gbmFtZS5pbmRleE9mKCcvJywgcCArIDEpKQogCQkJY291bnQrKzsKIAkJcmV0dXJuIGNvdW50OwogCX0KIAotCXN0YXRpYyB2b2lkIGRlbGV0ZShmaW5hbCBGaWxlIGZpbGUsIGZpbmFsIGludCBkZXB0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlzdGF0aWMgdm9pZCBkZWxldGUoRmlsZSBmaWxlLCBpbnQgZGVwdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWRlbGV0ZShmaWxlLCBkZXB0aCwgbnVsbCk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBkZWxldGUoZmluYWwgRmlsZSBmaWxlLCBmaW5hbCBpbnQgZGVwdGgsIExvY2tGaWxlIHJMY2spCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBkZWxldGUoRmlsZSBmaWxlLCBpbnQgZGVwdGgsIExvY2tGaWxlIHJMY2spCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlpZiAoIWZpbGUuZGVsZXRlKCkgJiYgZmlsZS5pc0ZpbGUoKSkgewogCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUmVmRGlyZWN0b3J5UmVuYW1lLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9SZWZEaXJlY3RvcnlSZW5hbWUuamF2YQppbmRleCAyMDJlNTFmLi5lYzdlYzczIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9SZWZEaXJlY3RvcnlSZW5hbWUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9SZWZEaXJlY3RvcnlSZW5hbWUuamF2YQpAQCAtMTA0LDcgKzEwNCw3IEBAIHByb3RlY3RlZCBSZXN1bHQgZG9SZW5hbWUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlvYmpJZCA9IHNvdXJjZS5nZXRPbGRPYmplY3RJZCgpOwogCQl1cGRhdGVIRUFEID0gbmVlZFRvVXBkYXRlSEVBRCgpOwogCQl0bXAgPSByZWZkYi5uZXdUZW1wb3JhcnlVcGRhdGUoKTsKLQkJdHJ5IChmaW5hbCBSZXZXYWxrIHJ3ID0gbmV3IFJldldhbGsocmVmZGIuZ2V0UmVwb3NpdG9yeSgpKSkgeworCQl0cnkgKFJldldhbGsgcncgPSBuZXcgUmV2V2FsayhyZWZkYi5nZXRSZXBvc2l0b3J5KCkpKSB7CiAJCQkvLyBGaXJzdCBiYWNrdXAgdGhlIHNvdXJjZSBzbyBpdHMgbmV2ZXIgdW5yZWFjaGFibGUuCiAJCQl0bXAuc2V0TmV3T2JqZWN0SWQob2JqSWQpOwogCQkJdG1wLnNldEZvcmNlVXBkYXRlKHRydWUpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUmVmRGlyZWN0b3J5VXBkYXRlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9SZWZEaXJlY3RvcnlVcGRhdGUuamF2YQppbmRleCA0ZDZiMjQ1Li40NWNlNjM0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9SZWZEaXJlY3RvcnlVcGRhdGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9SZWZEaXJlY3RvcnlVcGRhdGUuamF2YQpAQCAtNjAsNyArNjAsNyBAQCBjbGFzcyBSZWZEaXJlY3RvcnlVcGRhdGUgZXh0ZW5kcyBSZWZVcGRhdGUgewogCXByaXZhdGUgYm9vbGVhbiBzaG91bGREZXJlZjsKIAlwcml2YXRlIExvY2tGaWxlIGxvY2s7CiAKLQlSZWZEaXJlY3RvcnlVcGRhdGUoZmluYWwgUmVmRGlyZWN0b3J5IHIsIGZpbmFsIFJlZiByZWYpIHsKKwlSZWZEaXJlY3RvcnlVcGRhdGUoUmVmRGlyZWN0b3J5IHIsIFJlZiByZWYpIHsKIAkJc3VwZXIocmVmKTsKIAkJZGF0YWJhc2UgPSByOwogCX0KQEAgLTEwNiw3ICsxMDYsNyBAQCBwcm90ZWN0ZWQgdm9pZCB1bmxvY2soKSB7CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXByb3RlY3RlZCBSZXN1bHQgZG9VcGRhdGUoZmluYWwgUmVzdWx0IHN0YXR1cykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwcm90ZWN0ZWQgUmVzdWx0IGRvVXBkYXRlKFJlc3VsdCBzdGF0dXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCVdyaXRlQ29uZmlnIHdjID0gZGF0YWJhc2UuZ2V0UmVwb3NpdG9yeSgpLmdldENvbmZpZygpCiAJCQkJLmdldChXcml0ZUNvbmZpZy5LRVkpOwogCkBAIC0xNDgsNyArMTQ4LDcgQEAgcHJpdmF0ZSBTdHJpbmcgdG9SZXN1bHRTdHJpbmcoUmVzdWx0IHN0YXR1cykgewogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUmVzdWx0IGRvRGVsZXRlKGZpbmFsIFJlc3VsdCBzdGF0dXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJvdGVjdGVkIFJlc3VsdCBkb0RlbGV0ZShSZXN1bHQgc3RhdHVzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlpZiAoZ2V0UmVmKCkuZ2V0U3RvcmFnZSgpICE9IFJlZi5TdG9yYWdlLk5FVykKIAkJCWRhdGFiYXNlLmRlbGV0ZSh0aGlzKTsKIAkJcmV0dXJuIHN0YXR1czsKQEAgLTE1Niw3ICsxNTYsNyBAQCBwcm90ZWN0ZWQgUmVzdWx0IGRvRGVsZXRlKGZpbmFsIFJlc3VsdCBzdGF0dXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXByb3RlY3RlZCBSZXN1bHQgZG9MaW5rKGZpbmFsIFN0cmluZyB0YXJnZXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJvdGVjdGVkIFJlc3VsdCBkb0xpbmsoU3RyaW5nIHRhcmdldCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJV3JpdGVDb25maWcgd2MgPSBkYXRhYmFzZS5nZXRSZXBvc2l0b3J5KCkuZ2V0Q29uZmlnKCkKIAkJCQkuZ2V0KFdyaXRlQ29uZmlnLktFWSk7CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1JlZmxvZ1dyaXRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUmVmbG9nV3JpdGVyLmphdmEKaW5kZXggZmQ2YjQyNy4uMTMxZjcxNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUmVmbG9nV3JpdGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUmVmbG9nV3JpdGVyLmphdmEKQEAgLTIyMCw2ICsyMjAsMjIgQEAgcHVibGljIFJlZmxvZ1dyaXRlciBsb2coUmVmVXBkYXRlIHVwZGF0ZSwgU3RyaW5nIG1zZywKIAkJcmV0dXJuIENvbnN0YW50cy5lbmNvZGUoci50b1N0cmluZygpKTsKIAl9CiAKKwlwcml2YXRlIEZpbGVPdXRwdXRTdHJlYW0gZ2V0RmlsZU91dHB1dFN0cmVhbShGaWxlIGxvZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCXJldHVybiBuZXcgRmlsZU91dHB1dFN0cmVhbShsb2csIHRydWUpOworCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZXJyKSB7CisJCQlGaWxlIGRpciA9IGxvZy5nZXRQYXJlbnRGaWxlKCk7CisJCQlpZiAoZGlyLmV4aXN0cygpKSB7CisJCQkJdGhyb3cgZXJyOworCQkJfQorCQkJaWYgKCFkaXIubWtkaXJzKCkgJiYgIWRpci5pc0RpcmVjdG9yeSgpKSB7CisJCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQKKwkJCQkJCS5mb3JtYXQoSkdpdFRleHQuZ2V0KCkuY2Fubm90Q3JlYXRlRGlyZWN0b3J5LCBkaXIpKTsKKwkJCX0KKwkJCXJldHVybiBuZXcgRmlsZU91dHB1dFN0cmVhbShsb2csIHRydWUpOworCQl9CisJfQorCiAJcHJpdmF0ZSBSZWZsb2dXcml0ZXIgbG9nKFN0cmluZyByZWZOYW1lLCBieXRlW10gcmVjKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlGaWxlIGxvZyA9IHJlZmRiLmxvZ0ZvcihyZWZOYW1lKTsKIAkJYm9vbGVhbiB3cml0ZSA9IGZvcmNlV3JpdGUKQEAgLTIyOSwyOSArMjQ1LDE3IEBAIHByaXZhdGUgUmVmbG9nV3JpdGVyIGxvZyhTdHJpbmcgcmVmTmFtZSwgYnl0ZVtdIHJlYykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCXJldHVybiB0aGlzOwogCiAJCVdyaXRlQ29uZmlnIHdjID0gcmVmZGIuZ2V0UmVwb3NpdG9yeSgpLmdldENvbmZpZygpLmdldChXcml0ZUNvbmZpZy5LRVkpOwotCQlGaWxlT3V0cHV0U3RyZWFtIG91dDsKLQkJdHJ5IHsKLQkJCW91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGxvZywgdHJ1ZSk7Ci0JCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlcnIpIHsKLQkJCUZpbGUgZGlyID0gbG9nLmdldFBhcmVudEZpbGUoKTsKLQkJCWlmIChkaXIuZXhpc3RzKCkpCi0JCQkJdGhyb3cgZXJyOwotCQkJaWYgKCFkaXIubWtkaXJzKCkgJiYgIWRpci5pc0RpcmVjdG9yeSgpKQotCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKLQkJCQkJCUpHaXRUZXh0LmdldCgpLmNhbm5vdENyZWF0ZURpcmVjdG9yeSwgZGlyKSk7Ci0JCQlvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShsb2csIHRydWUpOwotCQl9Ci0JCXRyeSB7CisJCXRyeSAoRmlsZU91dHB1dFN0cmVhbSBvdXQgPSBnZXRGaWxlT3V0cHV0U3RyZWFtKGxvZykpIHsKIAkJCWlmICh3Yy5nZXRGU3luY1JlZkZpbGVzKCkpIHsKIAkJCQlGaWxlQ2hhbm5lbCBmYyA9IG91dC5nZXRDaGFubmVsKCk7CiAJCQkJQnl0ZUJ1ZmZlciBidWYgPSBCeXRlQnVmZmVyLndyYXAocmVjKTsKLQkJCQl3aGlsZSAoMCA8IGJ1Zi5yZW1haW5pbmcoKSkKKwkJCQl3aGlsZSAoMCA8IGJ1Zi5yZW1haW5pbmcoKSkgewogCQkJCQlmYy53cml0ZShidWYpOworCQkJCX0KIAkJCQlmYy5mb3JjZSh0cnVlKTsKLQkJCX0gZWxzZQorCQkJfSBlbHNlIHsKIAkJCQlvdXQud3JpdGUocmVjKTsKLQkJfSBmaW5hbGx5IHsKLQkJCW91dC5jbG9zZSgpOworCQkJfQogCQl9CiAJCXJldHVybiB0aGlzOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1VucGFja2VkT2JqZWN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9VbnBhY2tlZE9iamVjdC5qYXZhCmluZGV4IGFkYjA1ZTQuLmNmNDc0YWYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1VucGFja2VkT2JqZWN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvVW5wYWNrZWRPYmplY3QuamF2YQpAQCAtMjY2LDcgKzI2Niw3IEBAIHN0YXRpYyB2b2lkIGNoZWNrVmFsaWRFbmRPZlN0cmVhbShJbnB1dFN0cmVhbSBpbiwgSW5mbGF0ZXIgaW5mLAogCQl9CiAJfQogCi0Jc3RhdGljIGJvb2xlYW4gaXNTdGFuZGFyZEZvcm1hdChmaW5hbCBieXRlW10gaGRyKSB7CisJc3RhdGljIGJvb2xlYW4gaXNTdGFuZGFyZEZvcm1hdChieXRlW10gaGRyKSB7CiAJCS8qCiAJCSAqIFdlIG11c3QgZGV0ZXJtaW5lIGlmIHRoZSBidWZmZXIgY29udGFpbnMgdGhlIHN0YW5kYXJkCiAJCSAqIHpsaWItZGVmbGF0ZWQgc3RyZWFtIG9yIHRoZSBleHBlcmltZW50YWwgZm9ybWF0IGJhc2VkCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9XaW5kb3dDYWNoZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvV2luZG93Q2FjaGUuamF2YQppbmRleCBlNzEyODRmLi44Y2YxZDRlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9XaW5kb3dDYWNoZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1dpbmRvd0NhY2hlLmphdmEKQEAgLTE1Nyw3ICsxNTcsNyBAQCBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgYml0cyhpbnQgbmV3U2l6ZSkgewogCSAqICAgICAgICAgICAgIHNldHRpbmdzLCB1c3VhbGx5IHRvbyBsb3cgb2YgYSBsaW1pdC4KIAkgKi8KIAlARGVwcmVjYXRlZAotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWNvbmZpZ3VyZShmaW5hbCBXaW5kb3dDYWNoZUNvbmZpZyBjZmcpIHsKKwlwdWJsaWMgc3RhdGljIHZvaWQgcmVjb25maWd1cmUoV2luZG93Q2FjaGVDb25maWcgY2ZnKSB7CiAJCWZpbmFsIFdpbmRvd0NhY2hlIG5jID0gbmV3IFdpbmRvd0NhY2hlKGNmZyk7CiAJCWZpbmFsIFdpbmRvd0NhY2hlIG9jID0gY2FjaGU7CiAJCWlmIChvYyAhPSBudWxsKQpAQCAtMTc4LDcgKzE3OCw3IEBAIHB1YmxpYyBzdGF0aWMgV2luZG93Q2FjaGUgZ2V0SW5zdGFuY2UoKSB7CiAJCXJldHVybiBjYWNoZTsKIAl9CiAKLQlzdGF0aWMgZmluYWwgQnl0ZVdpbmRvdyBnZXQoZmluYWwgUGFja0ZpbGUgcGFjaywgZmluYWwgbG9uZyBvZmZzZXQpCisJc3RhdGljIGZpbmFsIEJ5dGVXaW5kb3cgZ2V0KFBhY2tGaWxlIHBhY2ssIGxvbmcgb2Zmc2V0KQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgV2luZG93Q2FjaGUgYyA9IGNhY2hlOwogCQlmaW5hbCBCeXRlV2luZG93IHIgPSBjLmdldE9yTG9hZChwYWNrLCBjLnRvU3RhcnQob2Zmc2V0KSk7CkBAIC0xOTMsNyArMTkzLDcgQEAgc3RhdGljIGZpbmFsIEJ5dGVXaW5kb3cgZ2V0KGZpbmFsIFBhY2tGaWxlIHBhY2ssIGZpbmFsIGxvbmcgb2Zmc2V0KQogCQlyZXR1cm4gcjsKIAl9CiAKLQlzdGF0aWMgZmluYWwgdm9pZCBwdXJnZShmaW5hbCBQYWNrRmlsZSBwYWNrKSB7CisJc3RhdGljIGZpbmFsIHZvaWQgcHVyZ2UoUGFja0ZpbGUgcGFjaykgewogCQljYWNoZS5yZW1vdmVBbGwocGFjayk7CiAJfQogCkBAIC0yMzIsNyArMjMyLDcgQEAgc3RhdGljIGZpbmFsIHZvaWQgcHVyZ2UoZmluYWwgUGFja0ZpbGUgcGFjaykgewogCiAJcHJpdmF0ZSBmaW5hbCBBdG9taWNMb25nIG9wZW5CeXRlczsKIAotCXByaXZhdGUgV2luZG93Q2FjaGUoZmluYWwgV2luZG93Q2FjaGVDb25maWcgY2ZnKSB7CisJcHJpdmF0ZSBXaW5kb3dDYWNoZShXaW5kb3dDYWNoZUNvbmZpZyBjZmcpIHsKIAkJdGFibGVTaXplID0gdGFibGVTaXplKGNmZyk7CiAJCWZpbmFsIGludCBsb2NrQ291bnQgPSBsb2NrQ291bnQoY2ZnKTsKIAkJaWYgKHRhYmxlU2l6ZSA8IDEpCkBAIC0yODYsMTEgKzI4NiwxMSBAQCBwdWJsaWMgbG9uZyBnZXRPcGVuQnl0ZXMoKSB7CiAJCXJldHVybiBvcGVuQnl0ZXMuZ2V0KCk7CiAJfQogCi0JcHJpdmF0ZSBpbnQgaGFzaChmaW5hbCBpbnQgcGFja0hhc2gsIGZpbmFsIGxvbmcgb2ZmKSB7CisJcHJpdmF0ZSBpbnQgaGFzaChpbnQgcGFja0hhc2gsIGxvbmcgb2ZmKSB7CiAJCXJldHVybiBwYWNrSGFzaCArIChpbnQpIChvZmYgPj4+IHdpbmRvd1NpemVTaGlmdCk7CiAJfQogCi0JcHJpdmF0ZSBCeXRlV2luZG93IGxvYWQoZmluYWwgUGFja0ZpbGUgcGFjaywgZmluYWwgbG9uZyBvZmZzZXQpCisJcHJpdmF0ZSBCeXRlV2luZG93IGxvYWQoUGFja0ZpbGUgcGFjaywgbG9uZyBvZmZzZXQpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlpZiAocGFjay5iZWdpbldpbmRvd0NhY2hlKCkpCiAJCQlvcGVuRmlsZXMuaW5jcmVtZW50QW5kR2V0KCk7CkBAIC0zMTAsMTggKzMxMCwxOCBAQCBwcml2YXRlIEJ5dGVXaW5kb3cgbG9hZChmaW5hbCBQYWNrRmlsZSBwYWNrLCBmaW5hbCBsb25nIG9mZnNldCkKIAkJfQogCX0KIAotCXByaXZhdGUgUmVmIGNyZWF0ZVJlZihmaW5hbCBQYWNrRmlsZSBwLCBmaW5hbCBsb25nIG8sIGZpbmFsIEJ5dGVXaW5kb3cgdikgeworCXByaXZhdGUgUmVmIGNyZWF0ZVJlZihQYWNrRmlsZSBwLCBsb25nIG8sIEJ5dGVXaW5kb3cgdikgewogCQlmaW5hbCBSZWYgcmVmID0gbmV3IFJlZihwLCBvLCB2LCBxdWV1ZSk7CiAJCW9wZW5CeXRlcy5hZGRBbmRHZXQocmVmLnNpemUpOwogCQlyZXR1cm4gcmVmOwogCX0KIAotCXByaXZhdGUgdm9pZCBjbGVhcihmaW5hbCBSZWYgcmVmKSB7CisJcHJpdmF0ZSB2b2lkIGNsZWFyKFJlZiByZWYpIHsKIAkJb3BlbkJ5dGVzLmFkZEFuZEdldCgtcmVmLnNpemUpOwogCQljbG9zZShyZWYucGFjayk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGNsb3NlKGZpbmFsIFBhY2tGaWxlIHBhY2spIHsKKwlwcml2YXRlIHZvaWQgY2xvc2UoUGFja0ZpbGUgcGFjaykgewogCQlpZiAocGFjay5lbmRXaW5kb3dDYWNoZSgpKQogCQkJb3BlbkZpbGVzLmRlY3JlbWVudEFuZEdldCgpOwogCX0KQEAgLTMzMCwxMSArMzMwLDExIEBAIHByaXZhdGUgYm9vbGVhbiBpc0Z1bGwoKSB7CiAJCXJldHVybiBtYXhGaWxlcyA8IG9wZW5GaWxlcy5nZXQoKSB8fCBtYXhCeXRlcyA8IG9wZW5CeXRlcy5nZXQoKTsKIAl9CiAKLQlwcml2YXRlIGxvbmcgdG9TdGFydChmaW5hbCBsb25nIG9mZnNldCkgeworCXByaXZhdGUgbG9uZyB0b1N0YXJ0KGxvbmcgb2Zmc2V0KSB7CiAJCXJldHVybiAob2Zmc2V0ID4+PiB3aW5kb3dTaXplU2hpZnQpIDw8IHdpbmRvd1NpemVTaGlmdDsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBpbnQgdGFibGVTaXplKGZpbmFsIFdpbmRvd0NhY2hlQ29uZmlnIGNmZykgeworCXByaXZhdGUgc3RhdGljIGludCB0YWJsZVNpemUoV2luZG93Q2FjaGVDb25maWcgY2ZnKSB7CiAJCWZpbmFsIGludCB3c3ogPSBjZmcuZ2V0UGFja2VkR2l0V2luZG93U2l6ZSgpOwogCQlmaW5hbCBsb25nIGxpbWl0ID0gY2ZnLmdldFBhY2tlZEdpdExpbWl0KCk7CiAJCWlmICh3c3ogPD0gMCkKQEAgLTM0NCw3ICszNDQsNyBAQCBwcml2YXRlIHN0YXRpYyBpbnQgdGFibGVTaXplKGZpbmFsIFdpbmRvd0NhY2hlQ29uZmlnIGNmZykgewogCQlyZXR1cm4gKGludCkgTWF0aC5taW4oNSAqIChsaW1pdCAvIHdzeikgLyAyLCAyMDAwMDAwMDAwKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBpbnQgbG9ja0NvdW50KGZpbmFsIFdpbmRvd0NhY2hlQ29uZmlnIGNmZykgeworCXByaXZhdGUgc3RhdGljIGludCBsb2NrQ291bnQoV2luZG93Q2FjaGVDb25maWcgY2ZnKSB7CiAJCXJldHVybiBNYXRoLm1heChjZmcuZ2V0UGFja2VkR2l0T3BlbkZpbGVzKCksIDMyKTsKIAl9CiAKQEAgLTM2MCw3ICszNjAsNyBAQCBwcml2YXRlIHN0YXRpYyBpbnQgbG9ja0NvdW50KGZpbmFsIFdpbmRvd0NhY2hlQ29uZmlnIGNmZykgewogCSAqICAgICAgICAgICAgIHRoZSBvYmplY3QgcmVmZXJlbmNlIHdhcyBub3QgaW4gdGhlIGNhY2hlIGFuZCBjb3VsZCBub3QgYmUKIAkgKiAgICAgICAgICAgICBvYnRhaW5lZCBieSB7QGxpbmsgI2xvYWQoUGFja0ZpbGUsIGxvbmcpfS4KIAkgKi8KLQlwcml2YXRlIEJ5dGVXaW5kb3cgZ2V0T3JMb2FkKGZpbmFsIFBhY2tGaWxlIHBhY2ssIGZpbmFsIGxvbmcgcG9zaXRpb24pCisJcHJpdmF0ZSBCeXRlV2luZG93IGdldE9yTG9hZChQYWNrRmlsZSBwYWNrLCBsb25nIHBvc2l0aW9uKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgaW50IHNsb3QgPSBzbG90KHBhY2ssIHBvc2l0aW9uKTsKIAkJZmluYWwgRW50cnkgZTEgPSB0YWJsZS5nZXQoc2xvdCk7CkBAIC0zOTksNyArMzk5LDcgQEAgcHJpdmF0ZSBCeXRlV2luZG93IGdldE9yTG9hZChmaW5hbCBQYWNrRmlsZSBwYWNrLCBmaW5hbCBsb25nIHBvc2l0aW9uKQogCQlyZXR1cm4gdjsKIAl9CiAKLQlwcml2YXRlIEJ5dGVXaW5kb3cgc2NhbihFbnRyeSBuLCBmaW5hbCBQYWNrRmlsZSBwYWNrLCBmaW5hbCBsb25nIHBvc2l0aW9uKSB7CisJcHJpdmF0ZSBCeXRlV2luZG93IHNjYW4oRW50cnkgbiwgUGFja0ZpbGUgcGFjaywgbG9uZyBwb3NpdGlvbikgewogCQlmb3IgKDsgbiAhPSBudWxsOyBuID0gbi5uZXh0KSB7CiAJCQlmaW5hbCBSZWYgciA9IG4ucmVmOwogCQkJaWYgKHIucGFjayA9PSBwYWNrICYmIHIucG9zaXRpb24gPT0gcG9zaXRpb24pIHsKQEAgLTQxNSw3ICs0MTUsNyBAQCBwcml2YXRlIEJ5dGVXaW5kb3cgc2NhbihFbnRyeSBuLCBmaW5hbCBQYWNrRmlsZSBwYWNrLCBmaW5hbCBsb25nIHBvc2l0aW9uKSB7CiAJCXJldHVybiBudWxsOwogCX0KIAotCXByaXZhdGUgdm9pZCBoaXQoZmluYWwgUmVmIHIpIHsKKwlwcml2YXRlIHZvaWQgaGl0KFJlZiByKSB7CiAJCS8vIFdlIGRvbid0IG5lZWQgdG8gYmUgMTAwJSBhY2N1cmF0ZSBoZXJlLiBJdHMgc3VmZmljaWVudCB0aGF0IGF0IGxlYXN0CiAJCS8vIG9uZSB0aHJlYWQgcGVyZm9ybXMgdGhlIGluY3JlbWVudC4gQW55IG90aGVyIGNvbmN1cnJlbnQgYWNjZXNzIGF0CiAJCS8vIGV4YWN0bHkgdGhlIHNhbWUgdGltZSBjYW4gc2ltcGx5IHVzZSB0aGUgc2FtZSBjbG9jayB2YWx1ZS4KQEAgLTQ4Nyw3ICs0ODcsNyBAQCBwcml2YXRlIHZvaWQgcmVtb3ZlQWxsKCkgewogCSAqIEBwYXJhbSBwYWNrCiAJICogICAgICAgICAgICB0aGUgZmlsZSB0byBwdXJnZSBhbGwgZW50cmllcyBvZi4KIAkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlQWxsKGZpbmFsIFBhY2tGaWxlIHBhY2spIHsKKwlwcml2YXRlIHZvaWQgcmVtb3ZlQWxsKFBhY2tGaWxlIHBhY2spIHsKIAkJZm9yIChpbnQgcyA9IDA7IHMgPCB0YWJsZVNpemU7IHMrKykgewogCQkJZmluYWwgRW50cnkgZTEgPSB0YWJsZS5nZXQocyk7CiAJCQlib29sZWFuIGhhc0RlYWQgPSBmYWxzZTsKQEAgLTUyMSwxMSArNTIxLDExIEBAIHByaXZhdGUgdm9pZCBnYygpIHsKIAkJfQogCX0KIAotCXByaXZhdGUgaW50IHNsb3QoZmluYWwgUGFja0ZpbGUgcGFjaywgZmluYWwgbG9uZyBwb3NpdGlvbikgeworCXByaXZhdGUgaW50IHNsb3QoUGFja0ZpbGUgcGFjaywgbG9uZyBwb3NpdGlvbikgewogCQlyZXR1cm4gKGhhc2gocGFjay5oYXNoLCBwb3NpdGlvbikgPj4+IDEpICUgdGFibGVTaXplOwogCX0KIAotCXByaXZhdGUgTG9jayBsb2NrKGZpbmFsIFBhY2tGaWxlIHBhY2ssIGZpbmFsIGxvbmcgcG9zaXRpb24pIHsKKwlwcml2YXRlIExvY2sgbG9jayhQYWNrRmlsZSBwYWNrLCBsb25nIHBvc2l0aW9uKSB7CiAJCXJldHVybiBsb2Nrc1soaGFzaChwYWNrLmhhc2gsIHBvc2l0aW9uKSA+Pj4gMSkgJSBsb2Nrcy5sZW5ndGhdOwogCX0KIApAQCAtNTU2LDcgKzU1Niw3IEBAIHByaXZhdGUgc3RhdGljIGNsYXNzIEVudHJ5IHsKIAkJICovCiAJCXZvbGF0aWxlIGJvb2xlYW4gZGVhZDsKIAotCQlFbnRyeShmaW5hbCBFbnRyeSBuLCBmaW5hbCBSZWYgcikgeworCQlFbnRyeShFbnRyeSBuLCBSZWYgcikgewogCQkJbmV4dCA9IG47CiAJCQlyZWYgPSByOwogCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9XaW5kb3dDdXJzb3IuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1dpbmRvd0N1cnNvci5qYXZhCmluZGV4IDU2OWJmZTguLjAxMGMxNDIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1dpbmRvd0N1cnNvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1dpbmRvd0N1cnNvci5qYXZhCkBAIC0zNDcsNyArMzQ3LDcgQEAgcHJpdmF0ZSB2b2lkIHByZXBhcmVJbmZsYXRlcigpIHsKIAkJCWluZi5yZXNldCgpOwogCX0KIAotCXZvaWQgcGluKGZpbmFsIFBhY2tGaWxlIHBhY2ssIGZpbmFsIGxvbmcgcG9zaXRpb24pCisJdm9pZCBwaW4oUGFja0ZpbGUgcGFjaywgbG9uZyBwb3NpdGlvbikKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIEJ5dGVXaW5kb3cgdyA9IHdpbmRvdzsKIAkJaWYgKHcgPT0gbnVsbCB8fCAhdy5jb250YWlucyhwYWNrLCBwb3NpdGlvbikpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1dyaXRlQ29uZmlnLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9Xcml0ZUNvbmZpZy5qYXZhCmluZGV4IGQ5Y2JiZDguLjIzMDU1ZWUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1dyaXRlQ29uZmlnLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvV3JpdGVDb25maWcuamF2YQpAQCAtNTcsNyArNTcsNyBAQCBjbGFzcyBXcml0ZUNvbmZpZyB7CiAKIAlwcml2YXRlIGZpbmFsIGJvb2xlYW4gZnN5bmNSZWZGaWxlczsKIAotCXByaXZhdGUgV3JpdGVDb25maWcoZmluYWwgQ29uZmlnIHJjKSB7CisJcHJpdmF0ZSBXcml0ZUNvbmZpZyhDb25maWcgcmMpIHsKIAkJY29tcHJlc3Npb24gPSByYy5nZXQoQ29yZUNvbmZpZy5LRVkpLmdldENvbXByZXNzaW9uKCk7CiAJCWZzeW5jT2JqZWN0RmlsZXMgPSByYy5nZXRCb29sZWFuKCJjb3JlIiwgImZzeW5jb2JqZWN0ZmlsZXMiLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQlmc3luY1JlZkZpbGVzID0gcmMuZ2V0Qm9vbGVhbigiY29yZSIsICJmc3luY3JlZmZpbGVzIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9wYWNrL0JpbmFyeURlbHRhLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcGFjay9CaW5hcnlEZWx0YS5qYXZhCmluZGV4IDI1NjU5MzEuLmM3ZTVhZDYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9wYWNrL0JpbmFyeURlbHRhLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL3BhY2svQmluYXJ5RGVsdGEuamF2YQpAQCAtNjQsNyArNjQsNyBAQCBwdWJsaWMgY2xhc3MgQmluYXJ5RGVsdGEgewogCSAqICAgICAgICAgICAgdGhlIGRlbHRhIHN0cmVhbSwgb3IgYXQgbGVhc3QgdGhlIGhlYWRlciBvZiBpdC4KIAkgKiBAcmV0dXJuIHRoZSBiYXNlIG9iamVjdCdzIHNpemUuCiAJICovCi0JcHVibGljIHN0YXRpYyBsb25nIGdldEJhc2VTaXplKGZpbmFsIGJ5dGVbXSBkZWx0YSkgeworCXB1YmxpYyBzdGF0aWMgbG9uZyBnZXRCYXNlU2l6ZShieXRlW10gZGVsdGEpIHsKIAkJaW50IHAgPSAwOwogCQlsb25nIGJhc2VMZW4gPSAwOwogCQlpbnQgYywgc2hpZnQgPSAwOwpAQCAtODMsNyArODMsNyBAQCBwdWJsaWMgc3RhdGljIGxvbmcgZ2V0QmFzZVNpemUoZmluYWwgYnl0ZVtdIGRlbHRhKSB7CiAJICogICAgICAgICAgICB0aGUgZGVsdGEgc3RyZWFtLCBvciBhdCBsZWFzdCB0aGUgaGVhZGVyIG9mIGl0LgogCSAqIEByZXR1cm4gdGhlIHJlc3VsdGluZyBvYmplY3QncyBzaXplLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgbG9uZyBnZXRSZXN1bHRTaXplKGZpbmFsIGJ5dGVbXSBkZWx0YSkgeworCXB1YmxpYyBzdGF0aWMgbG9uZyBnZXRSZXN1bHRTaXplKGJ5dGVbXSBkZWx0YSkgewogCQlpbnQgcCA9IDA7CiAKIAkJLy8gU2tpcCBsZW5ndGggb2YgdGhlIGJhc2Ugb2JqZWN0LgpAQCAtMTE0LDcgKzExNCw3IEBAIHB1YmxpYyBzdGF0aWMgbG9uZyBnZXRSZXN1bHRTaXplKGZpbmFsIGJ5dGVbXSBkZWx0YSkgewogCSAqICAgICAgICAgICAgYW5vdGhlci4KIAkgKiBAcmV0dXJuIHBhdGNoZWQgYmFzZQogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZVtdIGFwcGx5KGZpbmFsIGJ5dGVbXSBiYXNlLCBmaW5hbCBieXRlW10gZGVsdGEpIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSBhcHBseShieXRlW10gYmFzZSwgYnl0ZVtdIGRlbHRhKSB7CiAJCXJldHVybiBhcHBseShiYXNlLCBkZWx0YSwgbnVsbCk7CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcGFjay9EZWx0YUluZGV4U2Nhbm5lci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL3BhY2svRGVsdGFJbmRleFNjYW5uZXIuamF2YQppbmRleCA5NjlkMDJiLi45NDRhOWU1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcGFjay9EZWx0YUluZGV4U2Nhbm5lci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9wYWNrL0RlbHRhSW5kZXhTY2FubmVyLmphdmEKQEAgLTg5LDcgKzg5LDcgQEAgY2xhc3MgRGVsdGFJbmRleFNjYW5uZXIgewogCQl9CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHNjYW4oYnl0ZVtdIHJhdywgZmluYWwgaW50IGVuZCkgeworCXByaXZhdGUgdm9pZCBzY2FuKGJ5dGVbXSByYXcsIGludCBlbmQpIHsKIAkJLy8gV2Ugc2NhbiB0aGUgaW5wdXQgYmFja3dhcmRzLCBhbmQgYWx3YXlzIGluc2VydCBvbnRvIHRoZQogCQkvLyBmcm9udCBvZiB0aGUgY2hhaW4uIFRoaXMgZW5zdXJlcyB0aGF0IGNoYWlucyB3aWxsIGhhdmUgbG93ZXIKIAkJLy8gb2Zmc2V0cyBhdCB0aGUgZnJvbnQgb2YgdGhlIGNoYWluLCBhbGxvd2luZyB1cyB0byBwcmVmZXIgdGhlCkBAIC0xMjAsNyArMTIwLDcgQEAgcHJpdmF0ZSB2b2lkIHNjYW4oYnl0ZVtdIHJhdywgZmluYWwgaW50IGVuZCkgewogCQl9IHdoaWxlICgwIDw9IHB0cik7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgaW50IHRhYmxlU2l6ZShmaW5hbCBpbnQgd29yc3RDYXNlQmxvY2tDbnQpIHsKKwlwcml2YXRlIHN0YXRpYyBpbnQgdGFibGVTaXplKGludCB3b3JzdENhc2VCbG9ja0NudCkgewogCQlpbnQgc2hpZnQgPSAzMiAtIEludGVnZXIubnVtYmVyT2ZMZWFkaW5nWmVyb3Mod29yc3RDYXNlQmxvY2tDbnQpOwogCQlpbnQgc3ogPSAxIDw8IChzaGlmdCAtIDEpOwogCQlpZiAoc3ogPCB3b3JzdENhc2VCbG9ja0NudCkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9wYWNrL0RlbHRhV2luZG93LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcGFjay9EZWx0YVdpbmRvdy5qYXZhCmluZGV4IDczYjI4NWEuLmEwNDc1MzQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9wYWNrL0RlbHRhV2luZG93LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL3BhY2svRGVsdGFXaW5kb3cuamF2YQpAQCAtMjY2LDcgKzI2Niw3IEBAIHByaXZhdGUgdm9pZCBzZWFyY2hJbldpbmRvdygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWRlbHRhQnVmID0gbnVsbDsKIAl9CiAKLQlwcml2YXRlIGJvb2xlYW4gZGVsdGEoZmluYWwgRGVsdGFXaW5kb3dFbnRyeSBzcmMpCisJcHJpdmF0ZSBib29sZWFuIGRlbHRhKERlbHRhV2luZG93RW50cnkgc3JjKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJLy8gSWYgdGhlIHNpemVzIGFyZSByYWRpY2FsbHkgZGlmZmVyZW50LCB0aGlzIGlzIGEgYmFkIHBhaXJpbmcuCiAJCWlmIChyZXMuc2l6ZSgpIDwgc3JjLnNpemUoKSA+Pj4gNCkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9wYWNrL09iamVjdFRvUGFjay5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL3BhY2svT2JqZWN0VG9QYWNrLmphdmEKaW5kZXggZThjNzUxMC4uYTMwYmY5OCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL3BhY2svT2JqZWN0VG9QYWNrLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL3BhY2svT2JqZWN0VG9QYWNrLmphdmEKQEAgLTEwMyw3ICsxMDMsNyBAQCBwdWJsaWMgY2xhc3MgT2JqZWN0VG9QYWNrIGV4dGVuZHMgUGFja2VkT2JqZWN0SW5mbyB7CiAJICogQHBhcmFtIHR5cGUKIAkgKiAgICAgICAgICAgIHJlYWwgdHlwZSBjb2RlIG9mIHRoZSBvYmplY3QsIG5vdCBpdHMgaW4tcGFjayB0eXBlLgogCSAqLwotCXB1YmxpYyBPYmplY3RUb1BhY2soQW55T2JqZWN0SWQgc3JjLCBmaW5hbCBpbnQgdHlwZSkgeworCXB1YmxpYyBPYmplY3RUb1BhY2soQW55T2JqZWN0SWQgc3JjLCBpbnQgdHlwZSkgewogCQlzdXBlcihzcmMpOwogCQlmbGFncyA9IHR5cGUgPDwgVFlQRV9TSElGVDsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcGFjay9QYWNrT3V0cHV0U3RyZWFtLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcGFjay9QYWNrT3V0cHV0U3RyZWFtLmphdmEKaW5kZXggZmQ5YzFhMC4uN2YzOGE3YiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL3BhY2svUGFja091dHB1dFN0cmVhbS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9wYWNrL1BhY2tPdXRwdXRTdHJlYW0uamF2YQpAQCAtMTA3LDcgKzEwNyw3IEBAIHB1YmxpYyBQYWNrT3V0cHV0U3RyZWFtKGZpbmFsIFByb2dyZXNzTW9uaXRvciB3cml0ZU1vbml0b3IsCiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlKGZpbmFsIGludCBiKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlKGludCBiKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQljb3VudCsrOwogCQlvdXQud3JpdGUoYik7CiAJCW1kLnVwZGF0ZSgoYnl0ZSkgYik7CkBAIC0xMTUsNyArMTE1LDcgQEAgcHVibGljIGZpbmFsIHZvaWQgd3JpdGUoZmluYWwgaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlKGZpbmFsIGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuKQorCXB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlKGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJd2hpbGUgKDAgPCBsZW4pIHsKIAkJCWZpbmFsIGludCBuID0gTWF0aC5taW4obGVuLCBCWVRFU19UT19XUklURV9CRUZPUkVfQ0FOQ0VMX0NIRUNLKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9wYWNrL1BhY2tXcml0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9wYWNrL1BhY2tXcml0ZXIuamF2YQppbmRleCA0MmRmMWE2Li4zNmQ2ZjBhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcGFjay9QYWNrV3JpdGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL3BhY2svUGFja1dyaXRlci5qYXZhCkBAIC0zMDMsNiArMzAzLDggQEAgcHVibGljIHN0YXRpYyBJdGVyYWJsZTxQYWNrV3JpdGVyPiBnZXRJbnN0YW5jZXMoKSB7CiAKIAlwcml2YXRlIE9iamVjdENvdW50Q2FsbGJhY2sgY2FsbGJhY2s7CiAKKwlwcml2YXRlIGxvbmcgZmlsdGVyQmxvYkxpbWl0ID0gLTE7CisKIAkvKioKIAkgKiBDcmVhdGUgd3JpdGVyIGZvciBzcGVjaWZpZWQgcmVwb3NpdG9yeS4KIAkgKiA8cD4KQEAgLTMxMiw3ICszMTQsNyBAQCBwdWJsaWMgc3RhdGljIEl0ZXJhYmxlPFBhY2tXcml0ZXI+IGdldEluc3RhbmNlcygpIHsKIAkgKiBAcGFyYW0gcmVwbwogCSAqICAgICAgICAgICAgcmVwb3NpdG9yeSB3aGVyZSBvYmplY3RzIGFyZSBzdG9yZWQuCiAJICovCi0JcHVibGljIFBhY2tXcml0ZXIoZmluYWwgUmVwb3NpdG9yeSByZXBvKSB7CisJcHVibGljIFBhY2tXcml0ZXIoUmVwb3NpdG9yeSByZXBvKSB7CiAJCXRoaXMocmVwbywgcmVwby5uZXdPYmplY3RSZWFkZXIoKSk7CiAJfQogCkBAIC0zMjUsNyArMzI3LDcgQEAgcHVibGljIFBhY2tXcml0ZXIoZmluYWwgUmVwb3NpdG9yeSByZXBvKSB7CiAJICogQHBhcmFtIHJlYWRlcgogCSAqICAgICAgICAgICAgcmVhZGVyIHRvIHJlYWQgZnJvbSB0aGUgcmVwb3NpdG9yeSB3aXRoLgogCSAqLwotCXB1YmxpYyBQYWNrV3JpdGVyKGZpbmFsIE9iamVjdFJlYWRlciByZWFkZXIpIHsKKwlwdWJsaWMgUGFja1dyaXRlcihPYmplY3RSZWFkZXIgcmVhZGVyKSB7CiAJCXRoaXMobmV3IFBhY2tDb25maWcoKSwgcmVhZGVyKTsKIAl9CiAKQEAgLTM0MCw3ICszNDIsNyBAQCBwdWJsaWMgUGFja1dyaXRlcihmaW5hbCBPYmplY3RSZWFkZXIgcmVhZGVyKSB7CiAJICogQHBhcmFtIHJlYWRlcgogCSAqICAgICAgICAgICAgcmVhZGVyIHRvIHJlYWQgZnJvbSB0aGUgcmVwb3NpdG9yeSB3aXRoLgogCSAqLwotCXB1YmxpYyBQYWNrV3JpdGVyKGZpbmFsIFJlcG9zaXRvcnkgcmVwbywgZmluYWwgT2JqZWN0UmVhZGVyIHJlYWRlcikgeworCXB1YmxpYyBQYWNrV3JpdGVyKFJlcG9zaXRvcnkgcmVwbywgT2JqZWN0UmVhZGVyIHJlYWRlcikgewogCQl0aGlzKG5ldyBQYWNrQ29uZmlnKHJlcG8pLCByZWFkZXIpOwogCX0KIApAQCAtMzU1LDcgKzM1Nyw3IEBAIHB1YmxpYyBQYWNrV3JpdGVyKGZpbmFsIFJlcG9zaXRvcnkgcmVwbywgZmluYWwgT2JqZWN0UmVhZGVyIHJlYWRlcikgewogCSAqIEBwYXJhbSByZWFkZXIKIAkgKiAgICAgICAgICAgIHJlYWRlciB0byByZWFkIGZyb20gdGhlIHJlcG9zaXRvcnkgd2l0aC4KIAkgKi8KLQlwdWJsaWMgUGFja1dyaXRlcihmaW5hbCBQYWNrQ29uZmlnIGNvbmZpZywgZmluYWwgT2JqZWN0UmVhZGVyIHJlYWRlcikgeworCXB1YmxpYyBQYWNrV3JpdGVyKFBhY2tDb25maWcgY29uZmlnLCBPYmplY3RSZWFkZXIgcmVhZGVyKSB7CiAJCXRoaXMoY29uZmlnLCByZWFkZXIsIG51bGwpOwogCX0KIApAQCAtNTEwLDcgKzUxMiw3IEBAIHB1YmxpYyBib29sZWFuIGlzVGhpbigpIHsKIAkgKiAgICAgICAgICAgIGRldGVybWluZWQgYnkgc2V0OyB0aGlzIGtpbmQgb2YgcGFjayBpcyB1c2VkIG9ubHkgZm9yCiAJICogICAgICAgICAgICB0cmFuc3BvcnQ7IHRydWUgLSB0byBwcm9kdWNlIHRoaW4gcGFjaywgZmFsc2UgLSBvdGhlcndpc2UuCiAJICovCi0JcHVibGljIHZvaWQgc2V0VGhpbihmaW5hbCBib29sZWFuIHBhY2t0aGluKSB7CisJcHVibGljIHZvaWQgc2V0VGhpbihib29sZWFuIHBhY2t0aGluKSB7CiAJCXRoaW4gPSBwYWNrdGhpbjsKIAl9CiAKQEAgLTYwMSw3ICs2MDMsNyBAQCBwdWJsaWMgYm9vbGVhbiBpc0lnbm9yZU1pc3NpbmdVbmludGVyZXN0aW5nKCkgewogCSAqICAgICAgICAgICAgcGFjazsgZmFsc2Ugb3RoZXJ3aXNlIC0gbm9uIGV4aXN0aW5nIHVuaW50ZXJlc3Rpbmcgb2JqZWN0cyBtYXkKIAkgKiAgICAgICAgICAgIGNhdXNlIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5NaXNzaW5nT2JqZWN0RXhjZXB0aW9ufQogCSAqLwotCXB1YmxpYyB2b2lkIHNldElnbm9yZU1pc3NpbmdVbmludGVyZXN0aW5nKGZpbmFsIGJvb2xlYW4gaWdub3JlKSB7CisJcHVibGljIHZvaWQgc2V0SWdub3JlTWlzc2luZ1VuaW50ZXJlc3RpbmcoYm9vbGVhbiBpZ25vcmUpIHsKIAkJaWdub3JlTWlzc2luZ1VuaW50ZXJlc3RpbmcgPSBpZ25vcmU7CiAJfQogCkBAIC02MzksNiArNjQxLDE0IEBAIHB1YmxpYyB2b2lkIHNldFNoYWxsb3dQYWNrKGludCBkZXB0aCwKIAl9CiAKIAkvKioKKwkgKiBAcGFyYW0gYnl0ZXMgZXhjbHVkZSBibG9icyBvZiBzaXplIGdyZWF0ZXIgdGhhbiB0aGlzCisJICogQHNpbmNlIDUuMAorCSAqLworCXB1YmxpYyB2b2lkIHNldEZpbHRlckJsb2JMaW1pdChsb25nIGJ5dGVzKSB7CisJCWZpbHRlckJsb2JMaW1pdCA9IGJ5dGVzOworCX0KKworCS8qKgogCSAqIFJldHVybnMgb2JqZWN0cyBudW1iZXIgaW4gYSBwYWNrIGZpbGUgdGhhdCB3YXMgY3JlYXRlZCBieSB0aGlzIHdyaXRlci4KIAkgKgogCSAqIEByZXR1cm4gbnVtYmVyIG9mIG9iamVjdHMgaW4gcGFjay4KQEAgLTkxNCw3ICs5MjQsNyBAQCBwdWJsaWMgdm9pZCBwcmVwYXJlUGFjayhQcm9ncmVzc01vbml0b3IgY291bnRpbmdNb25pdG9yLAogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIGEgY2FjaGVkIHBhY2sgY2Fubm90IGJlIGV4YW1pbmVkLgogCSAqLwotCXB1YmxpYyBib29sZWFuIHdpbGxJbmNsdWRlKGZpbmFsIEFueU9iamVjdElkIGlkKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyBib29sZWFuIHdpbGxJbmNsdWRlKEFueU9iamVjdElkIGlkKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlPYmplY3RUb1BhY2sgb2JqID0gb2JqZWN0c01hcC5nZXQoaWQpOwogCQlyZXR1cm4gb2JqICE9IG51bGwgJiYgIW9iai5pc0VkZ2UoKTsKIAl9CkBAIC05ODEsNyArOTkxLDcgQEAgcHVibGljIGludCBnZXRJbmRleFZlcnNpb24oKSB7CiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgdGhlIGluZGV4IGRhdGEgY291bGQgbm90IGJlIHdyaXR0ZW4gdG8gdGhlIHN1cHBsaWVkIHN0cmVhbS4KIAkgKi8KLQlwdWJsaWMgdm9pZCB3cml0ZUluZGV4KGZpbmFsIE91dHB1dFN0cmVhbSBpbmRleFN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgdm9pZCB3cml0ZUluZGV4KE91dHB1dFN0cmVhbSBpbmRleFN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJaWYgKGlzSW5kZXhEaXNhYmxlZCgpKQogCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKEpHaXRUZXh0LmdldCgpLmNhY2hlZFBhY2tzUHJldmVudHNJbmRleENyZWF0aW9uKTsKIApAQCAtMTAwMyw3ICsxMDEzLDcgQEAgcHVibGljIHZvaWQgd3JpdGVJbmRleChmaW5hbCBPdXRwdXRTdHJlYW0gaW5kZXhTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgdGhlIGluZGV4IGRhdGEgY291bGQgbm90IGJlIHdyaXR0ZW4gdG8gdGhlIHN1cHBsaWVkIHN0cmVhbS4KIAkgKi8KLQlwdWJsaWMgdm9pZCB3cml0ZUJpdG1hcEluZGV4KGZpbmFsIE91dHB1dFN0cmVhbSBiaXRtYXBJbmRleFN0cmVhbSkKKwlwdWJsaWMgdm9pZCB3cml0ZUJpdG1hcEluZGV4KE91dHB1dFN0cmVhbSBiaXRtYXBJbmRleFN0cmVhbSkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWlmICh3cml0ZUJpdG1hcHMgPT0gbnVsbCkKIAkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihKR2l0VGV4dC5nZXQoKS5iaXRtYXBzTXVzdEJlUHJlcGFyZWQpOwpAQCAtMTUxNiw3ICsxNTI2LDcgQEAgcHJpdmF0ZSB2b2lkIHBhcmFsbGVsRGVsdGFTZWFyY2goUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsCiAJCQkvLyBUaGUgY2FsbGVyIGdhdmUgdXMgYW4gZXhlY3V0b3IsIGJ1dCBpdCBtaWdodCBub3QgZG8KIAkJCS8vIGFzeW5jaHJvbm91cyBleGVjdXRpb24uICBXcmFwIGV2ZXJ5dGhpbmcgYW5kIGhvcGUgaXQKIAkJCS8vIGNhbiBzY2hlZHVsZSB0aGVzZSBmb3IgdXMuCi0JCQlmb3IgKGZpbmFsIERlbHRhVGFzayB0YXNrIDogdGFza0Jsb2NrLnRhc2tzKSB7CisJCQlmb3IgKERlbHRhVGFzayB0YXNrIDogdGFza0Jsb2NrLnRhc2tzKSB7CiAJCQkJZXhlY3V0b3IuZXhlY3V0ZShuZXcgUnVubmFibGUoKSB7CiAJCQkJCUBPdmVycmlkZQogCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7CkBAIC0xNzIzLDcgKzE3MzMsNyBAQCBwcml2YXRlIHZvaWQgd3JpdGVEZWx0YU9iamVjdERlZmxhdGUoUGFja091dHB1dFN0cmVhbSBvdXQsCiAJCXR5cGVTdGF0cy5kZWx0YUJ5dGVzICs9IG91dC5sZW5ndGgoKSAtIG90cC5nZXRPZmZzZXQoKTsKIAl9CiAKLQlwcml2YXRlIFRlbXBvcmFyeUJ1ZmZlci5IZWFwIGRlbHRhKGZpbmFsIE9iamVjdFRvUGFjayBvdHApCisJcHJpdmF0ZSBUZW1wb3JhcnlCdWZmZXIuSGVhcCBkZWx0YShPYmplY3RUb1BhY2sgb3RwKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJRGVsdGFJbmRleCBpbmRleCA9IG5ldyBEZWx0YUluZGV4KGJ1ZmZlcihvdHAuZ2V0RGVsdGFCYXNlSWQoKSkpOwogCQlieXRlW10gcmVzID0gYnVmZmVyKG90cCk7CkBAIC0xOTYwLDcgKzE5NzAsNyBAQCBwcml2YXRlIHZvaWQgZmluZE9iamVjdHNUb1BhY2soQE5vbk51bGwgUHJvZ3Jlc3NNb25pdG9yIGNvdW50aW5nTW9uaXRvciwKIAkJCQlieXRlW10gcGF0aEJ1ZiA9IHdhbGtlci5nZXRQYXRoQnVmZmVyKCk7CiAJCQkJaW50IHBhdGhMZW4gPSB3YWxrZXIuZ2V0UGF0aExlbmd0aCgpOwogCQkJCWJhc2VzLmFkZEJhc2Uoby5nZXRUeXBlKCksIHBhdGhCdWYsIHBhdGhMZW4sIHBhdGhIYXNoKTsKLQkJCQlhZGRPYmplY3QobywgcGF0aEhhc2gpOworCQkJCWZpbHRlckFuZEFkZE9iamVjdChvLCBvLmdldFR5cGUoKSwgcGF0aEhhc2gpOwogCQkJCWNvdW50aW5nTW9uaXRvci51cGRhdGUoMSk7CiAJCQl9CiAJCX0gZWxzZSB7CkBAIC0xOTcwLDcgKzE5ODAsNyBAQCBwcml2YXRlIHZvaWQgZmluZE9iamVjdHNUb1BhY2soQE5vbk51bGwgUHJvZ3Jlc3NNb25pdG9yIGNvdW50aW5nTW9uaXRvciwKIAkJCQkJY29udGludWU7CiAJCQkJaWYgKGV4Y2x1ZGUobykpCiAJCQkJCWNvbnRpbnVlOwotCQkJCWFkZE9iamVjdChvLCB3YWxrZXIuZ2V0UGF0aEhhc2hDb2RlKCkpOworCQkJCWZpbHRlckFuZEFkZE9iamVjdChvLCBvLmdldFR5cGUoKSwgd2Fsa2VyLmdldFBhdGhIYXNoQ29kZSgpKTsKIAkJCQljb3VudGluZ01vbml0b3IudXBkYXRlKDEpOwogCQkJfQogCQl9CkBAIC0yMDAzLDcgKzIwMTMsNyBAQCBwcml2YXRlIHZvaWQgZmluZE9iamVjdHNUb1BhY2tVc2luZ0JpdG1hcHMoCiAJCQkJbmVlZEJpdG1hcC5yZW1vdmUob2JqZWN0SWQpOwogCQkJCWNvbnRpbnVlOwogCQkJfQotCQkJYWRkT2JqZWN0KG9iamVjdElkLCBvYmouZ2V0VHlwZSgpLCAwKTsKKwkJCWZpbHRlckFuZEFkZE9iamVjdChvYmplY3RJZCwgb2JqLmdldFR5cGUoKSwgMCk7CiAJCX0KIAogCQlpZiAodGhpbikKQEAgLTIwNDAsMTMgKzIwNTAsMTMgQEAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcnVuZUVkZ2VzRnJvbU9iamVjdExpc3QoTGlzdDxPYmplY3RUb1BhY2s+IGxpc3QpIHsKIAkgKiBAdGhyb3dzIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLkluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0aGUgb2JqZWN0IGlzIGFuIHVuc3VwcG9ydGVkIHR5cGUuCiAJICovCi0JcHVibGljIHZvaWQgYWRkT2JqZWN0KGZpbmFsIFJldk9iamVjdCBvYmplY3QpCisJcHVibGljIHZvaWQgYWRkT2JqZWN0KFJldk9iamVjdCBvYmplY3QpCiAJCQl0aHJvd3MgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiB7CiAJCWlmICghZXhjbHVkZShvYmplY3QpKQogCQkJYWRkT2JqZWN0KG9iamVjdCwgMCk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGFkZE9iamVjdChmaW5hbCBSZXZPYmplY3Qgb2JqZWN0LCBmaW5hbCBpbnQgcGF0aEhhc2hDb2RlKSB7CisJcHJpdmF0ZSB2b2lkIGFkZE9iamVjdChSZXZPYmplY3Qgb2JqZWN0LCBpbnQgcGF0aEhhc2hDb2RlKSB7CiAJCWFkZE9iamVjdChvYmplY3QsIG9iamVjdC5nZXRUeXBlKCksIHBhdGhIYXNoQ29kZSk7CiAJfQogCkBAIC0yMDYyLDYgKzIwNzIsMjEgQEAgcHJpdmF0ZSB2b2lkIGFkZE9iamVjdCgKIAkJb2JqZWN0c01hcC5hZGQob3RwKTsKIAl9CiAKKwkvLyBBZGRzIHRoZSBnaXZlbiBvYmplY3QgYXMgYW4gb2JqZWN0IHRvIGJlIHBhY2tlZCwgZmlyc3QgcGVyZm9ybWluZworCS8vIGZpbHRlcmluZyBvbiBibG9icyBhdCBvciBleGNlZWRpbmcgYSBnaXZlbiBzaXplLgorCXByaXZhdGUgdm9pZCBmaWx0ZXJBbmRBZGRPYmplY3QoQE5vbk51bGwgQW55T2JqZWN0SWQgc3JjLCBpbnQgdHlwZSwKKwkJCWludCBwYXRoSGFzaENvZGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKwkJLy8gQ2hlY2sgaWYgdGhpcyBvYmplY3QgbmVlZHMgdG8gYmUgcmVqZWN0ZWQsIGRvaW5nIHRoZSBjaGVhcGVyCisJCS8vIGNoZWNrcyBmaXJzdC4KKwkJYm9vbGVhbiByZWplY3QgPSBmaWx0ZXJCbG9iTGltaXQgPj0gMCAmJgorCQkJdHlwZSA9PSBPQkpfQkxPQiAmJgorCQkJcmVhZGVyLmdldE9iamVjdFNpemUoc3JjLCBPQkpfQkxPQikgPiBmaWx0ZXJCbG9iTGltaXQ7CisJCWlmICghcmVqZWN0KSB7CisJCQlhZGRPYmplY3Qoc3JjLCB0eXBlLCBwYXRoSGFzaENvZGUpOworCQl9CisJfQorCiAJcHJpdmF0ZSBib29sZWFuIGV4Y2x1ZGUoQW55T2JqZWN0SWQgb2JqZWN0SWQpIHsKIAkJaWYgKGV4Y2x1ZGVJblBhY2tzID09IG51bGwpCiAJCQlyZXR1cm4gZmFsc2U7CkBAIC0yMjIzLDI5MCArMjI0OCw2IEBAIHByaXZhdGUgYm9vbGVhbiByZXVzZURlbHRhRm9yKE9iamVjdFRvUGFjayBvdHApIHsKIAkJcmV0dXJuIHRydWU7CiAJfQogCi0JLyoqCi0JICogU3VtbWFyeSBvZiBob3cgUGFja1dyaXRlciBjcmVhdGVkIHRoZSBwYWNrLgotCSAqCi0JICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBQYWNrU3RhdGlzdGljc30gaW5zdGVhZC4KLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyBzdGF0aWMgY2xhc3MgU3RhdGlzdGljcyB7Ci0JCS8qKiBTdGF0aXN0aWNzIGFib3V0IGEgc2luZ2xlIGNsYXNzIG9mIG9iamVjdC4gKi8KLQkJcHVibGljIHN0YXRpYyBjbGFzcyBPYmplY3RUeXBlIHsKLQkJCS8vIEFsbCByZXF1ZXN0cyBhcmUgZm9yd2FyZGVkIHRvIHRoaXMgb2JqZWN0LgotCQkJcHJpdmF0ZSBQYWNrU3RhdGlzdGljcy5PYmplY3RUeXBlIG9iamVjdFR5cGU7Ci0KLQkJCS8qKgotCQkJICogV3JhcHMgYW4KLQkJCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UucGFjay5QYWNrU3RhdGlzdGljcy5PYmplY3RUeXBlfQotCQkJICogaW5zdGFuY2UgdG8gbWFpbnRhaW4gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBleGlzdGluZyBBUEkuCi0JCQkgKgotCQkJICogQHBhcmFtIHR5cGUKLQkJCSAqICAgICAgICAgICAgdGhlIHdyYXBwZWQgaW5zdGFuY2UKLQkJCSAqLwotCQkJcHVibGljIE9iamVjdFR5cGUoUGFja1N0YXRpc3RpY3MuT2JqZWN0VHlwZSB0eXBlKSB7Ci0JCQkJb2JqZWN0VHlwZSA9IHR5cGU7Ci0JCQl9Ci0KLQkJCS8qKgotCQkJICogQHJldHVybiB0b3RhbCBudW1iZXIgb2Ygb2JqZWN0cyBvdXRwdXQuIFRoaXMgdG90YWwgaW5jbHVkZXMgdGhlCi0JCQkgKiAgICAgICAgIHZhbHVlIG9mIHtAbGluayAjZ2V0RGVsdGFzKCl9LgotCQkJICovCi0JCQlwdWJsaWMgbG9uZyBnZXRPYmplY3RzKCkgewotCQkJCXJldHVybiBvYmplY3RUeXBlLmdldE9iamVjdHMoKTsKLQkJCX0KLQotCQkJLyoqCi0JCQkgKiBAcmV0dXJuIHRvdGFsIG51bWJlciBvZiBkZWx0YXMgb3V0cHV0LiBUaGlzIG1heSBiZSBsb3dlciB0aGFuIHRoZQotCQkJICogICAgICAgICBhY3R1YWwgbnVtYmVyIG9mIGRlbHRhcyBpZiBhIGNhY2hlZCBwYWNrIHdhcyByZXVzZWQuCi0JCQkgKi8KLQkJCXB1YmxpYyBsb25nIGdldERlbHRhcygpIHsKLQkJCQlyZXR1cm4gb2JqZWN0VHlwZS5nZXREZWx0YXMoKTsKLQkJCX0KLQotCQkJLyoqCi0JCQkgKiBAcmV0dXJuIG51bWJlciBvZiBvYmplY3RzIHdob3NlIGV4aXN0aW5nIHJlcHJlc2VudGF0aW9uIHdhcwotCQkJICogICAgICAgICByZXVzZWQgaW4gdGhlIG91dHB1dC4gVGhpcyBjb3VudCBpbmNsdWRlcwotCQkJICogICAgICAgICB7QGxpbmsgI2dldFJldXNlZERlbHRhcygpfS4KLQkJCSAqLwotCQkJcHVibGljIGxvbmcgZ2V0UmV1c2VkT2JqZWN0cygpIHsKLQkJCQlyZXR1cm4gb2JqZWN0VHlwZS5nZXRSZXVzZWRPYmplY3RzKCk7Ci0JCQl9Ci0KLQkJCS8qKgotCQkJICogQHJldHVybiBudW1iZXIgb2YgZGVsdGFzIHdob3NlIGV4aXN0aW5nIHJlcHJlc2VudGF0aW9uIHdhcyByZXVzZWQKLQkJCSAqICAgICAgICAgaW4gdGhlIG91dHB1dCwgYXMgdGhlaXIgYmFzZSBvYmplY3Qgd2FzIGFsc28gb3V0cHV0IG9yCi0JCQkgKiAgICAgICAgIHdhcyBhc3N1bWVkIHByZXNlbnQgZm9yIGEgdGhpbiBwYWNrLiBUaGlzIG1heSBiZSBsb3dlcgotCQkJICogICAgICAgICB0aGFuIHRoZSBhY3R1YWwgbnVtYmVyIG9mIHJldXNlZCBkZWx0YXMgaWYgYSBjYWNoZWQgcGFjawotCQkJICogICAgICAgICB3YXMgcmV1c2VkLgotCQkJICovCi0JCQlwdWJsaWMgbG9uZyBnZXRSZXVzZWREZWx0YXMoKSB7Ci0JCQkJcmV0dXJuIG9iamVjdFR5cGUuZ2V0UmV1c2VkRGVsdGFzKCk7Ci0JCQl9Ci0KLQkJCS8qKgotCQkJICogQHJldHVybiB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbi4gVGhpcyBzaXplIGluY2x1ZGVzIHRoZQotCQkJICogICAgICAgICBvYmplY3QgaGVhZGVycyBhcyB3ZWxsIGFzIHRoZSBjb21wcmVzc2VkIGRhdGEuIFRoaXMgc2l6ZQotCQkJICogICAgICAgICBhbHNvIGluY2x1ZGVzIGFsbCBvZiB7QGxpbmsgI2dldERlbHRhQnl0ZXMoKX0uCi0JCQkgKi8KLQkJCXB1YmxpYyBsb25nIGdldEJ5dGVzKCkgewotCQkJCXJldHVybiBvYmplY3RUeXBlLmdldEJ5dGVzKCk7Ci0JCQl9Ci0KLQkJCS8qKgotCQkJICogQHJldHVybiBudW1iZXIgb2YgZGVsdGEgYnl0ZXMgd3JpdHRlbi4gVGhpcyBzaXplIGluY2x1ZGVzIHRoZQotCQkJICogICAgICAgICBvYmplY3QgaGVhZGVycyBmb3IgdGhlIGRlbHRhIG9iamVjdHMuCi0JCQkgKi8KLQkJCXB1YmxpYyBsb25nIGdldERlbHRhQnl0ZXMoKSB7Ci0JCQkJcmV0dXJuIG9iamVjdFR5cGUuZ2V0RGVsdGFCeXRlcygpOwotCQkJfQotCQl9Ci0KLQkJLy8gQWxsIHJlcXVlc3RzIGFyZSBmb3J3YXJkZWQgdG8gdGhpcyBvYmplY3QuCi0JCXByaXZhdGUgUGFja1N0YXRpc3RpY3Mgc3RhdGlzdGljczsKLQotCQkvKioKLQkJICogV3JhcHMgYSB7QGxpbmsgUGFja1N0YXRpc3RpY3N9IG9iamVjdCB0byBtYWludGFpbiBiYWNrd2FyZHMKLQkJICogY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nIEFQSS4KLQkJICoKLQkJICogQHBhcmFtIHN0YXRzCi0JCSAqICAgICAgICAgICAgdGhlIHdyYXBwZWQgUGFja1N0YXRpdGljcyBvYmplY3QKLQkJICovCi0JCXB1YmxpYyBTdGF0aXN0aWNzKFBhY2tTdGF0aXN0aWNzIHN0YXRzKSB7Ci0JCQlzdGF0aXN0aWNzID0gc3RhdHM7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiB1bm1vZGlmaWFibGUgY29sbGVjdGlvbiBvZiBvYmplY3RzIHRvIGJlIGluY2x1ZGVkIGluIHRoZQotCQkgKiAgICAgICAgIHBhY2suIE1heSBiZSBudWxsIGlmIHRoZSBwYWNrIHdhcyBoYW5kLWNyYWZ0ZWQgaW4gYSB1bml0Ci0JCSAqICAgICAgICAgdGVzdC4KLQkJICovCi0JCXB1YmxpYyBTZXQ8T2JqZWN0SWQ+IGdldEludGVyZXN0aW5nT2JqZWN0cygpIHsKLQkJCXJldHVybiBzdGF0aXN0aWNzLmdldEludGVyZXN0aW5nT2JqZWN0cygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4gdW5tb2RpZmlhYmxlIGNvbGxlY3Rpb24gb2Ygb2JqZWN0cyB0aGF0IHNob3VsZCBiZSBleGNsdWRlZAotCQkgKiAgICAgICAgIGZyb20gdGhlIHBhY2ssIGFzIHRoZSBwZWVyIHRoYXQgd2lsbCByZWNlaXZlIHRoZSBwYWNrIGFscmVhZHkKLQkJICogICAgICAgICBoYXMgdGhlc2Ugb2JqZWN0cy4KLQkJICovCi0JCXB1YmxpYyBTZXQ8T2JqZWN0SWQ+IGdldFVuaW50ZXJlc3RpbmdPYmplY3RzKCkgewotCQkJcmV0dXJuIHN0YXRpc3RpY3MuZ2V0VW5pbnRlcmVzdGluZ09iamVjdHMoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIHVubW9kaWZpYWJsZSBjb2xsZWN0aW9uIG9mIHRoZSBjYWNoZWQgcGFja3MgdGhhdCB3ZXJlIHJldXNlZAotCQkgKiAgICAgICAgIGluIHRoZSBvdXRwdXQsIGlmIGFueSB3ZXJlIHNlbGVjdGVkIGZvciByZXVzZS4KLQkJICovCi0JCXB1YmxpYyBDb2xsZWN0aW9uPENhY2hlZFBhY2s+IGdldFJldXNlZFBhY2tzKCkgewotCQkJcmV0dXJuIHN0YXRpc3RpY3MuZ2V0UmV1c2VkUGFja3MoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIG51bWJlciBvZiBvYmplY3RzIGluIHRoZSBvdXRwdXQgcGFjayB0aGF0IHdlbnQgdGhyb3VnaCB0aGUKLQkJICogICAgICAgICBkZWx0YSBzZWFyY2ggcHJvY2VzcyBpbiBvcmRlciB0byBmaW5kIGEgcG90ZW50aWFsIGRlbHRhIGJhc2UuCi0JCSAqLwotCQlwdWJsaWMgaW50IGdldERlbHRhU2VhcmNoTm9uRWRnZU9iamVjdHMoKSB7Ci0JCQlyZXR1cm4gc3RhdGlzdGljcy5nZXREZWx0YVNlYXJjaE5vbkVkZ2VPYmplY3RzKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiBudW1iZXIgb2Ygb2JqZWN0cyBpbiB0aGUgb3V0cHV0IHBhY2sgdGhhdCB3ZW50IHRocm91Z2ggZGVsdGEKLQkJICogICAgICAgICBiYXNlIHNlYXJjaCBhbmQgZm91bmQgYSBzdWl0YWJsZSBiYXNlLiBUaGlzIGlzIGEgc3Vic2V0IG9mCi0JCSAqICAgICAgICAge0BsaW5rICNnZXREZWx0YVNlYXJjaE5vbkVkZ2VPYmplY3RzKCl9LgotCQkgKi8KLQkJcHVibGljIGludCBnZXREZWx0YXNGb3VuZCgpIHsKLQkJCXJldHVybiBzdGF0aXN0aWNzLmdldERlbHRhc0ZvdW5kKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiB0b3RhbCBudW1iZXIgb2Ygb2JqZWN0cyBvdXRwdXQuIFRoaXMgdG90YWwgaW5jbHVkZXMgdGhlIHZhbHVlCi0JCSAqICAgICAgICAgb2Yge0BsaW5rICNnZXRUb3RhbERlbHRhcygpfS4KLQkJICovCi0JCXB1YmxpYyBsb25nIGdldFRvdGFsT2JqZWN0cygpIHsKLQkJCXJldHVybiBzdGF0aXN0aWNzLmdldFRvdGFsT2JqZWN0cygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4gdGhlIGNvdW50IG9mIG9iamVjdHMgdGhhdCBuZWVkZWQgdG8gYmUgZGlzY292ZXJlZCB0aHJvdWdoIGFuCi0JCSAqICAgICAgICAgb2JqZWN0IHdhbGsgYmVjYXVzZSB0aGV5IHdlcmUgbm90IGZvdW5kIGluIGJpdG1hcCBpbmRpY2VzLgotCQkgKiAgICAgICAgIFJldHVybnMgLTEgaWYgbm8gYml0bWFwIGluZGljZXMgd2VyZSBmb3VuZC4KLQkJICovCi0JCXB1YmxpYyBsb25nIGdldEJpdG1hcEluZGV4TWlzc2VzKCkgewotCQkJcmV0dXJuIHN0YXRpc3RpY3MuZ2V0Qml0bWFwSW5kZXhNaXNzZXMoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIHRvdGFsIG51bWJlciBvZiBkZWx0YXMgb3V0cHV0LiBUaGlzIG1heSBiZSBsb3dlciB0aGFuIHRoZQotCQkgKiAgICAgICAgIGFjdHVhbCBudW1iZXIgb2YgZGVsdGFzIGlmIGEgY2FjaGVkIHBhY2sgd2FzIHJldXNlZC4KLQkJICovCi0JCXB1YmxpYyBsb25nIGdldFRvdGFsRGVsdGFzKCkgewotCQkJcmV0dXJuIHN0YXRpc3RpY3MuZ2V0VG90YWxEZWx0YXMoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIG51bWJlciBvZiBvYmplY3RzIHdob3NlIGV4aXN0aW5nIHJlcHJlc2VudGF0aW9uIHdhcyByZXVzZWQgaW4KLQkJICogICAgICAgICB0aGUgb3V0cHV0LiBUaGlzIGNvdW50IGluY2x1ZGVzIHtAbGluayAjZ2V0UmV1c2VkRGVsdGFzKCl9LgotCQkgKi8KLQkJcHVibGljIGxvbmcgZ2V0UmV1c2VkT2JqZWN0cygpIHsKLQkJCXJldHVybiBzdGF0aXN0aWNzLmdldFJldXNlZE9iamVjdHMoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIG51bWJlciBvZiBkZWx0YXMgd2hvc2UgZXhpc3RpbmcgcmVwcmVzZW50YXRpb24gd2FzIHJldXNlZCBpbgotCQkgKiAgICAgICAgIHRoZSBvdXRwdXQsIGFzIHRoZWlyIGJhc2Ugb2JqZWN0IHdhcyBhbHNvIG91dHB1dCBvciB3YXMKLQkJICogICAgICAgICBhc3N1bWVkIHByZXNlbnQgZm9yIGEgdGhpbiBwYWNrLiBUaGlzIG1heSBiZSBsb3dlciB0aGFuIHRoZQotCQkgKiAgICAgICAgIGFjdHVhbCBudW1iZXIgb2YgcmV1c2VkIGRlbHRhcyBpZiBhIGNhY2hlZCBwYWNrIHdhcyByZXVzZWQuCi0JCSAqLwotCQlwdWJsaWMgbG9uZyBnZXRSZXVzZWREZWx0YXMoKSB7Ci0JCQlyZXR1cm4gc3RhdGlzdGljcy5nZXRSZXVzZWREZWx0YXMoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIHRvdGFsIG51bWJlciBvZiBieXRlcyB3cml0dGVuLiBUaGlzIHNpemUgaW5jbHVkZXMgdGhlIHBhY2sKLQkJICogICAgICAgICBoZWFkZXIsIHRyYWlsZXIsIHRoaW4gcGFjaywgYW5kIHJldXNlZCBjYWNoZWQgcGFjayhzKS4KLQkJICovCi0JCXB1YmxpYyBsb25nIGdldFRvdGFsQnl0ZXMoKSB7Ci0JCQlyZXR1cm4gc3RhdGlzdGljcy5nZXRUb3RhbEJ5dGVzKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiBzaXplIG9mIHRoZSB0aGluIHBhY2sgaW4gYnl0ZXMsIGlmIGEgdGhpbiBwYWNrIHdhcyBnZW5lcmF0ZWQuCi0JCSAqICAgICAgICAgQSB0aGluIHBhY2sgaXMgY3JlYXRlZCB3aGVuIHRoZSBjbGllbnQgYWxyZWFkeSBoYXMgb2JqZWN0cwotCQkgKiAgICAgICAgIGFuZCBzb21lIGRlbHRhcyBhcmUgY3JlYXRlZCBhZ2FpbnN0IHRob3NlIG9iamVjdHMsIG9yIGlmIGEKLQkJICogICAgICAgICBjYWNoZWQgcGFjayBpcyBiZWluZyB1c2VkIGFuZCBzb21lIGRlbHRhcyB3aWxsIHJlZmVyZW5jZQotCQkgKiAgICAgICAgIG9iamVjdHMgaW4gdGhlIGNhY2hlZCBwYWNrLiBUaGlzIHNpemUgZG9lcyBub3QgaW5jbHVkZSB0aGUKLQkJICogICAgICAgICBwYWNrIGhlYWRlciBvciB0cmFpbGVyLgotCQkgKi8KLQkJcHVibGljIGxvbmcgZ2V0VGhpblBhY2tCeXRlcygpIHsKLQkJCXJldHVybiBzdGF0aXN0aWNzLmdldFRoaW5QYWNrQnl0ZXMoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcGFyYW0gdHlwZUNvZGUKLQkJICogICAgICAgICAgICBvYmplY3QgdHlwZSBjb2RlLCBlLmcuIE9CSl9DT01NSVQgb3IgT0JKX1RSRUUuCi0JCSAqIEByZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB0eXBlIG9mIG9iamVjdCBpbiB0aGUgcGFjay4KLQkJICovCi0JCXB1YmxpYyBPYmplY3RUeXBlIGJ5T2JqZWN0VHlwZShpbnQgdHlwZUNvZGUpIHsKLQkJCXJldHVybiBuZXcgT2JqZWN0VHlwZShzdGF0aXN0aWNzLmJ5T2JqZWN0VHlwZSh0eXBlQ29kZSkpOwotCQl9Ci0KLQkJLyoqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVzdWx0aW5nIHBhY2sgZmlsZSB3YXMgYSBzaGFsbG93IHBhY2suICovCi0JCXB1YmxpYyBib29sZWFuIGlzU2hhbGxvdygpIHsKLQkJCXJldHVybiBzdGF0aXN0aWNzLmlzU2hhbGxvdygpOwotCQl9Ci0KLQkJLyoqIEByZXR1cm4gZGVwdGggKGluIGNvbW1pdHMpIHRoZSBwYWNrIGluY2x1ZGVzIGlmIHNoYWxsb3cuICovCi0JCXB1YmxpYyBpbnQgZ2V0RGVwdGgoKSB7Ci0JCQlyZXR1cm4gc3RhdGlzdGljcy5nZXREZXB0aCgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4gdGltZSBpbiBtaWxsaXNlY29uZHMgc3BlbnQgZW51bWVyYXRpbmcgdGhlIG9iamVjdHMgdGhhdCBuZWVkCi0JCSAqICAgICAgICAgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIG91dHB1dC4gVGhpcyB0aW1lIGluY2x1ZGVzIGFueSByZXN0YXJ0cwotCQkgKiAgICAgICAgIHRoYXQgb2NjdXIgd2hlbiBhIGNhY2hlZCBwYWNrIGlzIHNlbGVjdGVkIGZvciByZXVzZS4KLQkJICovCi0JCXB1YmxpYyBsb25nIGdldFRpbWVDb3VudGluZygpIHsKLQkJCXJldHVybiBzdGF0aXN0aWNzLmdldFRpbWVDb3VudGluZygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4gdGltZSBpbiBtaWxsaXNlY29uZHMgc3BlbnQgbWF0Y2hpbmcgZXhpc3RpbmcgcmVwcmVzZW50YXRpb25zCi0JCSAqICAgICAgICAgYWdhaW5zdCBvYmplY3RzIHRoYXQgd2lsbCBiZSB0cmFuc21pdHRlZCwgb3IgdGhhdCB0aGUgY2xpZW50Ci0JCSAqICAgICAgICAgY2FuIGJlIGFzc3VtZWQgdG8gYWxyZWFkeSBoYXZlLgotCQkgKi8KLQkJcHVibGljIGxvbmcgZ2V0VGltZVNlYXJjaGluZ0ZvclJldXNlKCkgewotCQkJcmV0dXJuIHN0YXRpc3RpY3MuZ2V0VGltZVNlYXJjaGluZ0ZvclJldXNlKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiB0aW1lIGluIG1pbGxpc2Vjb25kcyBzcGVudCBmaW5kaW5nIHRoZSBzaXplcyBvZiBhbGwgb2JqZWN0cwotCQkgKiAgICAgICAgIHRoYXQgd2lsbCBlbnRlciB0aGUgZGVsdGEgY29tcHJlc3Npb24gc2VhcmNoIHdpbmRvdy4gVGhlCi0JCSAqICAgICAgICAgc2l6ZXMgbmVlZCB0byBiZSBrbm93biB0byBiZXR0ZXIgbWF0Y2ggc2ltaWxhciBvYmplY3RzCi0JCSAqICAgICAgICAgdG9nZXRoZXIgYW5kIGltcHJvdmUgZGVsdGEgY29tcHJlc3Npb24gcmF0aW9zLgotCQkgKi8KLQkJcHVibGljIGxvbmcgZ2V0VGltZVNlYXJjaGluZ0ZvclNpemVzKCkgewotCQkJcmV0dXJuIHN0YXRpc3RpY3MuZ2V0VGltZVNlYXJjaGluZ0ZvclNpemVzKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiB0aW1lIGluIG1pbGxpc2Vjb25kcyBzcGVudCBvbiBkZWx0YSBjb21wcmVzc2lvbi4gVGhpcyBpcwotCQkgKiAgICAgICAgIG9ic2VydmVkIHdhbGwtY2xvY2sgdGltZSBhbmQgZG9lcyBub3QgYWNjdXJhdGVseSB0cmFjayBDUFUKLQkJICogICAgICAgICB0aW1lIHVzZWQgd2hlbiBtdWx0aXBsZSB0aHJlYWRzIHdlcmUgdXNlZCB0byBwZXJmb3JtIHRoZQotCQkgKiAgICAgICAgIGRlbHRhIGNvbXByZXNzaW9uLgotCQkgKi8KLQkJcHVibGljIGxvbmcgZ2V0VGltZUNvbXByZXNzaW5nKCkgewotCQkJcmV0dXJuIHN0YXRpc3RpY3MuZ2V0VGltZUNvbXByZXNzaW5nKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiB0aW1lIGluIG1pbGxpc2Vjb25kcyBzcGVudCB3cml0aW5nIHRoZSBwYWNrIG91dHB1dCwgZnJvbQotCQkgKiAgICAgICAgIHN0YXJ0IG9mIGhlYWRlciB1bnRpbCBlbmQgb2YgdHJhaWxlci4gVGhlIHRyYW5zZmVyIHNwZWVkIGNhbgotCQkgKiAgICAgICAgIGJlIGFwcHJveGltYXRlZCBieSBkaXZpZGluZyB7QGxpbmsgI2dldFRvdGFsQnl0ZXMoKX0gYnkgdGhpcwotCQkgKiAgICAgICAgIHZhbHVlLgotCQkgKi8KLQkJcHVibGljIGxvbmcgZ2V0VGltZVdyaXRpbmcoKSB7Ci0JCQlyZXR1cm4gc3RhdGlzdGljcy5nZXRUaW1lV3JpdGluZygpOwotCQl9Ci0KLQkJLyoqIEByZXR1cm4gdG90YWwgdGltZSBzcGVudCBwcm9jZXNzaW5nIHRoaXMgcGFjay4gKi8KLQkJcHVibGljIGxvbmcgZ2V0VGltZVRvdGFsKCkgewotCQkJcmV0dXJuIHN0YXRpc3RpY3MuZ2V0VGltZVRvdGFsKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiBnZXQgdGhlIGF2ZXJhZ2Ugb3V0cHV0IHNwZWVkIGluIHRlcm1zIG9mIGJ5dGVzLXBlci1zZWNvbmQuCi0JCSAqICAgICAgICAge0Bjb2RlIGdldFRvdGFsQnl0ZXMoKSAvIChnZXRUaW1lV3JpdGluZygpIC8gMTAwMC4wKX0uCi0JCSAqLwotCQlwdWJsaWMgZG91YmxlIGdldFRyYW5zZmVyUmF0ZSgpIHsKLQkJCXJldHVybiBzdGF0aXN0aWNzLmdldFRyYW5zZmVyUmF0ZSgpOwotCQl9Ci0KLQkJLyoqIEByZXR1cm4gZm9ybWF0dGVkIG1lc3NhZ2Ugc3RyaW5nIGZvciBkaXNwbGF5IHRvIGNsaWVudHMuICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKLQkJCXJldHVybiBzdGF0aXN0aWNzLmdldE1lc3NhZ2UoKTsKLQkJfQotCX0KLQogCXByaXZhdGUgY2xhc3MgTXV0YWJsZVN0YXRlIHsKIAkJLyoqIEVzdGltYXRlZCBzaXplIG9mIGEgc2luZ2xlIE9iamVjdFRvUGFjayBpbnN0YW5jZS4gKi8KIAkJLy8gQXNzdW1lIDY0LWJpdCBwb2ludGVycywgc2luY2UgdGhpcyBpcyBqdXN0IGFuIGVzdGltYXRlLgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL3JlZnRhYmxlL0Jsb2NrUmVhZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcmVmdGFibGUvQmxvY2tSZWFkZXIuamF2YQppbmRleCBjZTJiYTRhLi45NDJkNzJmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcmVmdGFibGUvQmxvY2tSZWFkZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcmVmdGFibGUvQmxvY2tSZWFkZXIuamF2YQpAQCAtNDMsNyArNDMsNyBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5yZWZ0YWJsZTsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucmVmdGFibGUuQmxvY2tXcml0ZXIuY29tcGFyZTsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnJlZnRhYmxlLlJlZnRhYmxlQ29uc3RhbnRzLkZJTEVfQkxPQ0tfVFlQRTsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnJlZnRhYmxlLlJlZnRhYmxlQ29uc3RhbnRzLkZJTEVfSEVBREVSX0xFTjsKQEAgLTEzOCw3ICsxMzgsNyBAQCBTdHJpbmcgbmFtZSgpIHsKIAkJaWYgKGJsb2NrVHlwZSA9PSBMT0dfQkxPQ0tfVFlQRSkgewogCQkJbGVuIC09IDk7CiAJCX0KLQkJcmV0dXJuIFJhd1BhcnNlVXRpbHMuZGVjb2RlKFVURl84LCBuYW1lQnVmLCAwLCBsZW4pOworCQlyZXR1cm4gUmF3UGFyc2VVdGlscy5kZWNvZGUoQ0hBUlNFVCwgbmFtZUJ1ZiwgMCwgbGVuKTsKIAl9CiAKIAlib29sZWFuIG1hdGNoKGJ5dGVbXSBtYXRjaCwgYm9vbGVhbiBtYXRjaElzUHJlZml4KSB7CkBAIC0xNzEsNyArMTcxLDcgQEAgbG9uZyByZWFkVXBkYXRlSW5kZXhEZWx0YSgpIHsKIAl9CiAKIAlSZWYgcmVhZFJlZigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVN0cmluZyBuYW1lID0gUmF3UGFyc2VVdGlscy5kZWNvZGUoVVRGXzgsIG5hbWVCdWYsIDAsIG5hbWVMZW4pOworCQlTdHJpbmcgbmFtZSA9IFJhd1BhcnNlVXRpbHMuZGVjb2RlKENIQVJTRVQsIG5hbWVCdWYsIDAsIG5hbWVMZW4pOwogCQlzd2l0Y2ggKHZhbHVlVHlwZSAmIFZBTFVFX1RZUEVfTUFTSykgewogCQljYXNlIFZBTFVFX05PTkU6IC8vIGRlbGV0ZQogCQkJcmV0dXJuIG5ld1JlZihuYW1lKTsKQEAgLTI2Niw3ICsyNjYsNyBAQCBwcml2YXRlIE9iamVjdElkIHJlYWRWYWx1ZUlkKCkgewogCXByaXZhdGUgU3RyaW5nIHJlYWRWYWx1ZVN0cmluZygpIHsKIAkJaW50IGxlbiA9IHJlYWRWYXJpbnQzMigpOwogCQlpbnQgZW5kID0gcHRyICsgbGVuOwotCQlTdHJpbmcgcyA9IFJhd1BhcnNlVXRpbHMuZGVjb2RlKFVURl84LCBidWYsIHB0ciwgZW5kKTsKKwkJU3RyaW5nIHMgPSBSYXdQYXJzZVV0aWxzLmRlY29kZShDSEFSU0VULCBidWYsIHB0ciwgZW5kKTsKIAkJcHRyID0gZW5kOwogCQlyZXR1cm4gczsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcmVmdGFibGUvQmxvY2tXcml0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9yZWZ0YWJsZS9CbG9ja1dyaXRlci5qYXZhCmluZGV4IGIzMTczZTguLjNkOGZiZjQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9yZWZ0YWJsZS9CbG9ja1dyaXRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9yZWZ0YWJsZS9CbG9ja1dyaXRlci5qYXZhCkBAIC00Myw3ICs0Myw3IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnJlZnRhYmxlOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5yZWZ0YWJsZS5SZWZ0YWJsZUNvbnN0YW50cy5GSUxFX0hFQURFUl9MRU47CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5yZWZ0YWJsZS5SZWZ0YWJsZUNvbnN0YW50cy5JTkRFWF9CTE9DS19UWVBFOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucmVmdGFibGUuUmVmdGFibGVDb25zdGFudHMuTE9HX0JMT0NLX1RZUEU7CkBAIC00NDAsNyArNDQwLDcgQEAgdm9pZCB3cml0ZVZhbHVlKFJlZnRhYmxlT3V0cHV0U3RyZWFtIG9zKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl9CiAKIAkJcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIG5hbWVVdGY4KFJlZiByZWYpIHsKLQkJCXJldHVybiByZWYuZ2V0TmFtZSgpLmdldEJ5dGVzKFVURl84KTsKKwkJCXJldHVybiByZWYuZ2V0TmFtZSgpLmdldEJ5dGVzKENIQVJTRVQpOwogCQl9CiAJfQogCkBAIC01NTksMTMgKzU1OSwxMyBAQCBzdGF0aWMgY2xhc3MgTG9nRW50cnkgZXh0ZW5kcyBFbnRyeSB7CiAJCQl0aGlzLm5ld0lkID0gbmV3SWQ7CiAJCQl0aGlzLnRpbWVTZWNzID0gd2hvLmdldFdoZW4oKS5nZXRUaW1lKCkgLyAxMDAwTDsKIAkJCXRoaXMudHogPSAoc2hvcnQpIHdoby5nZXRUaW1lWm9uZU9mZnNldCgpOwotCQkJdGhpcy5uYW1lID0gd2hvLmdldE5hbWUoKS5nZXRCeXRlcyhVVEZfOCk7Ci0JCQl0aGlzLmVtYWlsID0gd2hvLmdldEVtYWlsQWRkcmVzcygpLmdldEJ5dGVzKFVURl84KTsKLQkJCXRoaXMubXNnID0gbWVzc2FnZS5nZXRCeXRlcyhVVEZfOCk7CisJCQl0aGlzLm5hbWUgPSB3aG8uZ2V0TmFtZSgpLmdldEJ5dGVzKENIQVJTRVQpOworCQkJdGhpcy5lbWFpbCA9IHdoby5nZXRFbWFpbEFkZHJlc3MoKS5nZXRCeXRlcyhDSEFSU0VUKTsKKwkJCXRoaXMubXNnID0gbWVzc2FnZS5nZXRCeXRlcyhDSEFSU0VUKTsKIAkJfQogCiAJCXN0YXRpYyBieXRlW10ga2V5KFN0cmluZyByZWYsIGxvbmcgaW5kZXgpIHsKLQkJCWJ5dGVbXSBuYW1lID0gcmVmLmdldEJ5dGVzKFVURl84KTsKKwkJCWJ5dGVbXSBuYW1lID0gcmVmLmdldEJ5dGVzKENIQVJTRVQpOwogCQkJYnl0ZVtdIGtleSA9IEFycmF5cy5jb3B5T2YobmFtZSwgbmFtZS5sZW5ndGggKyAxICsgOCk7CiAJCQlOQi5lbmNvZGVJbnQ2NChrZXksIGtleS5sZW5ndGggLSA4LCByZXZlcnNlVXBkYXRlSW5kZXgoaW5kZXgpKTsKIAkJCXJldHVybiBrZXk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcmVmdGFibGUvUmVmdGFibGVPdXRwdXRTdHJlYW0uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9yZWZ0YWJsZS9SZWZ0YWJsZU91dHB1dFN0cmVhbS5qYXZhCmluZGV4IDFmYzQzYzkuLjQ0YmJiMTYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9yZWZ0YWJsZS9SZWZ0YWJsZU91dHB1dFN0cmVhbS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9yZWZ0YWJsZS9SZWZ0YWJsZU91dHB1dFN0cmVhbS5qYXZhCkBAIC00Myw3ICs0Myw3IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnJlZnRhYmxlOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5yZWZ0YWJsZS5SZWZ0YWJsZUNvbnN0YW50cy5GSUxFX0hFQURFUl9MRU47CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5yZWZ0YWJsZS5SZWZ0YWJsZUNvbnN0YW50cy5JTkRFWF9CTE9DS19UWVBFOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucmVmdGFibGUuUmVmdGFibGVDb25zdGFudHMuTE9HX0JMT0NLX1RZUEU7CkBAIC0xNjAsNyArMTYwLDcgQEAgdm9pZCB3cml0ZUlkKE9iamVjdElkIGlkKSB7CiAJfQogCiAJdm9pZCB3cml0ZVZhcmludFN0cmluZyhTdHJpbmcgcykgewotCQl3cml0ZVZhcmludFN0cmluZyhzLmdldEJ5dGVzKFVURl84KSk7CisJCXdyaXRlVmFyaW50U3RyaW5nKHMuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCX0KIAogCXZvaWQgd3JpdGVWYXJpbnRTdHJpbmcoYnl0ZVtdIG1zZykgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL3JlZnRhYmxlL1JlZnRhYmxlUmVhZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcmVmdGFibGUvUmVmdGFibGVSZWFkZXIuamF2YQppbmRleCA3NDg3NzE5Li41MzU2OTUyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcmVmdGFibGUvUmVmdGFibGVSZWFkZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcmVmdGFibGUvUmVmdGFibGVSZWFkZXIuamF2YQpAQCAtNDMsNyArNDMsNyBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5yZWZ0YWJsZTsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucmVmdGFibGUuQmxvY2tSZWFkZXIuZGVjb2RlQmxvY2tMZW47CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5yZWZ0YWJsZS5SZWZ0YWJsZUNvbnN0YW50cy5GSUxFX0JMT0NLX1RZUEU7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5yZWZ0YWJsZS5SZWZ0YWJsZUNvbnN0YW50cy5GSUxFX0ZPT1RFUl9MRU47CkBAIC0xODIsNyArMTgyLDcgQEAgcHVibGljIFJlZkN1cnNvciBhbGxSZWZzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAlwdWJsaWMgUmVmQ3Vyc29yIHNlZWtSZWYoU3RyaW5nIHJlZk5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWluaXRSZWZJbmRleCgpOwogCi0JCWJ5dGVbXSBrZXkgPSByZWZOYW1lLmdldEJ5dGVzKFVURl84KTsKKwkJYnl0ZVtdIGtleSA9IHJlZk5hbWUuZ2V0Qnl0ZXMoQ0hBUlNFVCk7CiAJCWJvb2xlYW4gcHJlZml4ID0ga2V5W2tleS5sZW5ndGggLSAxXSA9PSAnLyc7CiAKIAkJUmVmQ3Vyc29ySW1wbCBpID0gbmV3IFJlZkN1cnNvckltcGwocmVmRW5kLCBrZXksIHByZWZpeCk7CkBAIC0yMjMsNyArMjIzLDcgQEAgcHVibGljIExvZ0N1cnNvciBzZWVrTG9nKFN0cmluZyByZWZOYW1lLCBsb25nIHVwZGF0ZUluZGV4KQogCQlpbml0TG9nSW5kZXgoKTsKIAkJaWYgKGxvZ1Bvc2l0aW9uID4gMCkgewogCQkJYnl0ZVtdIGtleSA9IExvZ0VudHJ5LmtleShyZWZOYW1lLCB1cGRhdGVJbmRleCk7Ci0JCQlieXRlW10gbWF0Y2ggPSByZWZOYW1lLmdldEJ5dGVzKFVURl84KTsKKwkJCWJ5dGVbXSBtYXRjaCA9IHJlZk5hbWUuZ2V0Qnl0ZXMoQ0hBUlNFVCk7CiAJCQlMb2dDdXJzb3JJbXBsIGkgPSBuZXcgTG9nQ3Vyc29ySW1wbChsb2dFbmQsIG1hdGNoKTsKIAkJCWkuYmxvY2sgPSBzZWVrKExPR19CTE9DS19UWVBFLCBrZXksIGxvZ0luZGV4LCBsb2dQb3NpdGlvbiwgbG9nRW5kKTsKIAkJCXJldHVybiBpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL3JlZnRyZWUvUmVmVHJlZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL3JlZnRyZWUvUmVmVHJlZS5qYXZhCmluZGV4IGU5YWExMTAuLjU3NTFkZDYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9yZWZ0cmVlL1JlZlRyZWUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcmVmdHJlZS9SZWZUcmVlLmphdmEKQEAgLTI3OSw3ICsyNzksNyBAQCBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVmFsaWRSZWYoQ29tbWFuZCBjbWQpIHsKIAkJcmV0dXJuIEhFQUQuZXF1YWxzKG4pIHx8IFJlcG9zaXRvcnkuaXNWYWxpZFJlZk5hbWUobik7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGFwcGx5KERpckNhY2hlRWRpdG9yIGVkLCBmaW5hbCBDb21tYW5kIGNtZCkgeworCXByaXZhdGUgdm9pZCBhcHBseShEaXJDYWNoZUVkaXRvciBlZCwgQ29tbWFuZCBjbWQpIHsKIAkJU3RyaW5nIHBhdGggPSByZWZQYXRoKGNtZC5nZXRSZWZOYW1lKCkpOwogCQlSZWYgb2xkUmVmID0gY21kLmdldE9sZFJlZigpOwogCQlmaW5hbCBSZWYgbmV3UmVmID0gY21kLmdldE5ld1JlZigpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL3JlZnRyZWUvUmVmVHJlZURhdGFiYXNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcmVmdHJlZS9SZWZUcmVlRGF0YWJhc2UuamF2YQppbmRleCAxODM0NjhmLi4yN2RhYWYwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcmVmdHJlZS9SZWZUcmVlRGF0YWJhc2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcmVmdHJlZS9SZWZUcmVlRGF0YWJhc2UuamF2YQpAQCAtMjgyLDcgKzI4Miw3IEBAIHByaXZhdGUgc3RhdGljIE9iamVjdElkIGlkT2YoQE51bGxhYmxlIFJlZiBzcmMpIHsKIAlwdWJsaWMgTGlzdDxSZWY+IGdldEFkZGl0aW9uYWxSZWZzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJQ29sbGVjdGlvbjxSZWY+IHR4blJlZnM7CiAJCWlmICh0eG5OYW1lc3BhY2UgIT0gbnVsbCkgewotCQkJdHhuUmVmcyA9IGJvb3RzdHJhcC5nZXRSZWZzKHR4bk5hbWVzcGFjZSkudmFsdWVzKCk7CisJCQl0eG5SZWZzID0gYm9vdHN0cmFwLmdldFJlZnNCeVByZWZpeCh0eG5OYW1lc3BhY2UpOwogCQl9IGVsc2UgewogCQkJUmVmIHIgPSBib290c3RyYXAuZXhhY3RSZWYodHhuQ29tbWl0dGVkKTsKIAkJCWlmIChyICE9IG51bGwgJiYgci5nZXRPYmplY3RJZCgpICE9IG51bGwpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0FiYnJldmlhdGVkT2JqZWN0SWQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0FiYnJldmlhdGVkT2JqZWN0SWQuamF2YQppbmRleCA0MjVmN2Y2Li5kMTA1ZDBkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9BYmJyZXZpYXRlZE9iamVjdElkLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQWJicmV2aWF0ZWRPYmplY3RJZC5qYXZhCkBAIC03NCw3ICs3NCw3IEBAIHB1YmxpYyBmaW5hbCBjbGFzcyBBYmJyZXZpYXRlZE9iamVjdElkIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKIAkgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gdGVzdC4KIAkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHN0cmluZyBjYW4gY29udmVydGVkIGludG8gYW4gQWJicmV2aWF0ZWRPYmplY3RJZC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNJZChmaW5hbCBTdHJpbmcgaWQpIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNJZChTdHJpbmcgaWQpIHsKIAkJaWYgKGlkLmxlbmd0aCgpIDwgMiB8fCBDb25zdGFudHMuT0JKRUNUX0lEX1NUUklOR19MRU5HVEggPCBpZC5sZW5ndGgoKSkKIAkJCXJldHVybiBmYWxzZTsKIAkJdHJ5IHsKQEAgLTEzMSw3ICsxMzEsNyBAQCBwdWJsaWMgc3RhdGljIGZpbmFsIEFiYnJldmlhdGVkT2JqZWN0SWQgZnJvbU9iamVjdElkKEFueU9iamVjdElkIGlkKSB7CiAJICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIHJlYWQgZnJvbS4gTXVzdCBiZSAmbHQ7PSA0MCBjaGFyYWN0ZXJzLgogCSAqIEByZXR1cm4gdGhlIGNvbnZlcnRlZCBvYmplY3QgaWQuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBBYmJyZXZpYXRlZE9iamVjdElkIGZyb21TdHJpbmcoZmluYWwgU3RyaW5nIHN0cikgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgQWJicmV2aWF0ZWRPYmplY3RJZCBmcm9tU3RyaW5nKFN0cmluZyBzdHIpIHsKIAkJaWYgKHN0ci5sZW5ndGgoKSA+IENvbnN0YW50cy5PQkpFQ1RfSURfU1RSSU5HX0xFTkdUSCkKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoSkdpdFRleHQuZ2V0KCkuaW52YWxpZElkLCBzdHIpKTsKIAkJZmluYWwgYnl0ZVtdIGIgPSBDb25zdGFudHMuZW5jb2RlQVNDSUkoc3RyKTsKQEAgLTE2NSw3ICsxNjUsNyBAQCBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgaGV4VUludDMyKGZpbmFsIGJ5dGVbXSBicywgaW50IHAsIGZpbmFsIGludCBlbmQpIHsKIAkJcmV0dXJuIHIgPDwgKDggLSBuKSAqIDQ7CiAJfQogCi0Jc3RhdGljIGludCBtYXNrKGZpbmFsIGludCBuaWJibGVzLCBmaW5hbCBpbnQgd29yZCwgZmluYWwgaW50IHYpIHsKKwlzdGF0aWMgaW50IG1hc2soaW50IG5pYmJsZXMsIGludCB3b3JkLCBpbnQgdikgewogCQlmaW5hbCBpbnQgYiA9ICh3b3JkIC0gMSkgKiA4OwogCQlpZiAoYiArIDggPD0gbmliYmxlcykgewogCQkJLy8gV2UgaGF2ZSBhbGwgb2YgdGhlIGJpdHMgcmVxdWlyZWQgZm9yIHRoaXMgd29yZC4KQEAgLTI0NCw3ICsyNDQsNyBAQCBwdWJsaWMgT2JqZWN0SWQgdG9PYmplY3RJZCgpIHsKIAkgKiAgICAgICAgICZndDswIGlmIHRoaXMgYWJicmV2aWF0aW9uIG5hbWVzIGFuIG9iamVjdCB0aGF0IGlzIGFmdGVyCiAJICogICAgICAgICA8Y29kZT5vdGhlcjwvY29kZT4uCiAJICovCi0JcHVibGljIGZpbmFsIGludCBwcmVmaXhDb21wYXJlKGZpbmFsIEFueU9iamVjdElkIG90aGVyKSB7CisJcHVibGljIGZpbmFsIGludCBwcmVmaXhDb21wYXJlKEFueU9iamVjdElkIG90aGVyKSB7CiAJCWludCBjbXA7CiAKIAkJY21wID0gTkIuY29tcGFyZVVJbnQzMih3MSwgbWFzaygxLCBvdGhlci53MSkpOwpAQCAtMjgwLDcgKzI4MCw3IEBAIHB1YmxpYyBmaW5hbCBpbnQgcHJlZml4Q29tcGFyZShmaW5hbCBBbnlPYmplY3RJZCBvdGhlcikgewogCSAqICAgICAgICAgJmd0OzAgaWYgdGhpcyBhYmJyZXZpYXRpb24gbmFtZXMgYW4gb2JqZWN0IHRoYXQgaXMgYWZ0ZXIKIAkgKiAgICAgICAgIDxjb2RlPm90aGVyPC9jb2RlPi4KIAkgKi8KLQlwdWJsaWMgZmluYWwgaW50IHByZWZpeENvbXBhcmUoZmluYWwgYnl0ZVtdIGJzLCBmaW5hbCBpbnQgcCkgeworCXB1YmxpYyBmaW5hbCBpbnQgcHJlZml4Q29tcGFyZShieXRlW10gYnMsIGludCBwKSB7CiAJCWludCBjbXA7CiAKIAkJY21wID0gTkIuY29tcGFyZVVJbnQzMih3MSwgbWFzaygxLCBOQi5kZWNvZGVJbnQzMihicywgcCkpKTsKQEAgLTMxNiw3ICszMTYsNyBAQCBwdWJsaWMgZmluYWwgaW50IHByZWZpeENvbXBhcmUoZmluYWwgYnl0ZVtdIGJzLCBmaW5hbCBpbnQgcCkgewogCSAqICAgICAgICAgJmd0OzAgaWYgdGhpcyBhYmJyZXZpYXRpb24gbmFtZXMgYW4gb2JqZWN0IHRoYXQgaXMgYWZ0ZXIKIAkgKiAgICAgICAgIDxjb2RlPm90aGVyPC9jb2RlPi4KIAkgKi8KLQlwdWJsaWMgZmluYWwgaW50IHByZWZpeENvbXBhcmUoZmluYWwgaW50W10gYnMsIGZpbmFsIGludCBwKSB7CisJcHVibGljIGZpbmFsIGludCBwcmVmaXhDb21wYXJlKGludFtdIGJzLCBpbnQgcCkgewogCQlpbnQgY21wOwogCiAJCWNtcCA9IE5CLmNvbXBhcmVVSW50MzIodzEsIG1hc2soMSwgYnNbcF0pKTsKQEAgLTM0Nyw3ICszNDcsNyBAQCBwdWJsaWMgZmluYWwgaW50IGdldEZpcnN0Qnl0ZSgpIHsKIAkJcmV0dXJuIHcxID4+PiAyNDsKIAl9CiAKLQlwcml2YXRlIGludCBtYXNrKGZpbmFsIGludCB3b3JkLCBmaW5hbCBpbnQgdikgeworCXByaXZhdGUgaW50IG1hc2soaW50IHdvcmQsIGludCB2KSB7CiAJCXJldHVybiBtYXNrKG5pYmJsZXMsIHdvcmQsIHYpOwogCX0KIApAQCAtMzU5LDcgKzM1OSw3IEBAIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhmaW5hbCBPYmplY3QgbykgeworCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewogCQlpZiAobyBpbnN0YW5jZW9mIEFiYnJldmlhdGVkT2JqZWN0SWQpIHsKIAkJCWZpbmFsIEFiYnJldmlhdGVkT2JqZWN0SWQgYiA9IChBYmJyZXZpYXRlZE9iamVjdElkKSBvOwogCQkJcmV0dXJuIG5pYmJsZXMgPT0gYi5uaWJibGVzICYmIHcxID09IGIudzEgJiYgdzIgPT0gYi53MgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQW55T2JqZWN0SWQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0FueU9iamVjdElkLmphdmEKaW5kZXggNTg0Nzc2NS4uOTc4ZGQzYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQW55T2JqZWN0SWQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9BbnlPYmplY3RJZC5qYXZhCkBAIC03MywxNyArNzMsMTkgQEAgcHVibGljIHN0YXRpYyBib29sZWFuIGVxdWFscyhmaW5hbCBBbnlPYmplY3RJZCBmaXJzdE9iamVjdElkLAogCQlpZiAoZmlyc3RPYmplY3RJZCA9PSBzZWNvbmRPYmplY3RJZCkKIAkJCXJldHVybiB0cnVlOwogCi0JCS8vIFdlIHRlc3Qgd29yZCAyIGZpcnN0IGFzIG9kZHMgYXJlIHNvbWVvbmUgYWxyZWFkeSB1c2VkIG91cgotCQkvLyB3b3JkIDEgYXMgYSBoYXNoIGNvZGUsIGFuZCBhcHBseWluZyB0aGF0IGNhbWUgdXAgd2l0aCB0aGVzZQotCQkvLyB0d28gaW5zdGFuY2VzIHdlIGFyZSBjb21wYXJpbmcgZm9yIGVxdWFsaXR5LiBUaGVyZWZvcmUgdGhlCi0JCS8vIGZpcnN0IHR3byB3b3JkcyBhcmUgdmVyeSBsaWtlbHkgdG8gYmUgaWRlbnRpY2FsLiBXZSB3YW50IHRvCi0JCS8vIGJyZWFrIGF3YXkgZnJvbSBjb2xsaXNpb25zIGFzIHF1aWNrbHkgYXMgcG9zc2libGUuCisJCS8vIFdlIHRlc3Qgd29yZCAzIGZpcnN0IHNpbmNlIHRoZSBnaXQgZmlsZS1iYXNlZCBPREIKKwkJLy8gdXNlcyB0aGUgZmlyc3QgYnl0ZSBvZiB3MSwgYW5kIHdlIHVzZSB3MiBhcyB0aGUKKwkJLy8gaGFzaCBjb2RlLCBvbmUgb2YgdGhvc2UgcHJvYmFibHkgY2FtZSB1cCB3aXRoIHRoZXNlCisJCS8vIHR3byBpbnN0YW5jZXMgd2hpY2ggd2UgYXJlIGNvbXBhcmluZyBmb3IgZXF1YWxpdHkuCisJCS8vIFRoZXJlZm9yZSB0aGUgZmlyc3QgdHdvIHdvcmRzIGFyZSB2ZXJ5IGxpa2VseSB0byBiZQorCQkvLyBpZGVudGljYWwuIFdlIHdhbnQgdG8gYnJlYWsgYXdheSBmcm9tIGNvbGxpc2lvbnMgYXMKKwkJLy8gcXVpY2tseSBhcyBwb3NzaWJsZS4KIAkJLy8KLQkJcmV0dXJuIGZpcnN0T2JqZWN0SWQudzIgPT0gc2Vjb25kT2JqZWN0SWQudzIKLQkJCQkmJiBmaXJzdE9iamVjdElkLnczID09IHNlY29uZE9iamVjdElkLnczCisJCXJldHVybiBmaXJzdE9iamVjdElkLnczID09IHNlY29uZE9iamVjdElkLnczCiAJCQkJJiYgZmlyc3RPYmplY3RJZC53NCA9PSBzZWNvbmRPYmplY3RJZC53NAogCQkJCSYmIGZpcnN0T2JqZWN0SWQudzUgPT0gc2Vjb25kT2JqZWN0SWQudzUKLQkJCQkmJiBmaXJzdE9iamVjdElkLncxID09IHNlY29uZE9iamVjdElkLncxOworCQkJCSYmIGZpcnN0T2JqZWN0SWQudzEgPT0gc2Vjb25kT2JqZWN0SWQudzEKKwkJCQkmJiBmaXJzdE9iamVjdElkLncyID09IHNlY29uZE9iamVjdElkLncyOwogCX0KIAogCWludCB3MTsKQEAgLTE1OSw3ICsxNjEsNyBAQCBwdWJsaWMgZmluYWwgaW50IGdldEJ5dGUoaW50IGluZGV4KSB7CiAJICogQ29tcGFyZSB0aGlzIE9iamVjdElkIHRvIGFub3RoZXIgYW5kIG9idGFpbiBhIHNvcnQgb3JkZXJpbmcuCiAJICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGZpbmFsIGludCBjb21wYXJlVG8oZmluYWwgQW55T2JqZWN0SWQgb3RoZXIpIHsKKwlwdWJsaWMgZmluYWwgaW50IGNvbXBhcmVUbyhBbnlPYmplY3RJZCBvdGhlcikgewogCQlpZiAodGhpcyA9PSBvdGhlcikKIAkJCXJldHVybiAwOwogCkBAIC0xOTUsNyArMTk3LDcgQEAgcHVibGljIGZpbmFsIGludCBjb21wYXJlVG8oZmluYWwgQW55T2JqZWN0SWQgb3RoZXIpIHsKIAkgKiBAcmV0dXJuIGEgbmVnYXRpdmUgaW50ZWdlciwgemVybywgb3IgYSBwb3NpdGl2ZSBpbnRlZ2VyIGFzIHRoaXMgb2JqZWN0IGlzCiAJICogICAgICAgICBsZXNzIHRoYW4sIGVxdWFsIHRvLCBvciBncmVhdGVyIHRoYW4gdGhlIHNwZWNpZmllZCBvYmplY3QuCiAJICovCi0JcHVibGljIGZpbmFsIGludCBjb21wYXJlVG8oZmluYWwgYnl0ZVtdIGJzLCBmaW5hbCBpbnQgcCkgeworCXB1YmxpYyBmaW5hbCBpbnQgY29tcGFyZVRvKGJ5dGVbXSBicywgaW50IHApIHsKIAkJaW50IGNtcDsKIAogCQljbXAgPSBOQi5jb21wYXJlVUludDMyKHcxLCBOQi5kZWNvZGVJbnQzMihicywgcCkpOwpAQCAtMjI4LDcgKzIzMCw3IEBAIHB1YmxpYyBmaW5hbCBpbnQgY29tcGFyZVRvKGZpbmFsIGJ5dGVbXSBicywgZmluYWwgaW50IHApIHsKIAkgKiBAcmV0dXJuIGEgbmVnYXRpdmUgaW50ZWdlciwgemVybywgb3IgYSBwb3NpdGl2ZSBpbnRlZ2VyIGFzIHRoaXMgb2JqZWN0IGlzCiAJICogICAgICAgICBsZXNzIHRoYW4sIGVxdWFsIHRvLCBvciBncmVhdGVyIHRoYW4gdGhlIHNwZWNpZmllZCBvYmplY3QuCiAJICovCi0JcHVibGljIGZpbmFsIGludCBjb21wYXJlVG8oZmluYWwgaW50W10gYnMsIGZpbmFsIGludCBwKSB7CisJcHVibGljIGZpbmFsIGludCBjb21wYXJlVG8oaW50W10gYnMsIGludCBwKSB7CiAJCWludCBjbXA7CiAKIAkJY21wID0gTkIuY29tcGFyZVVJbnQzMih3MSwgYnNbcF0pOwpAQCAtMjU3LDcgKzI1OSw3IEBAIHB1YmxpYyBmaW5hbCBpbnQgY29tcGFyZVRvKGZpbmFsIGludFtdIGJzLCBmaW5hbCBpbnQgcCkgewogCSAqICAgICAgICAgICAgdGhlIGFiYnJldmlhdGlvbi4KIAkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBPYmplY3RJZCBiZWdpbnMgd2l0aCB0aGUgYWJicmV2aWF0aW9uOyBlbHNlIGZhbHNlLgogCSAqLwotCXB1YmxpYyBib29sZWFuIHN0YXJ0c1dpdGgoZmluYWwgQWJicmV2aWF0ZWRPYmplY3RJZCBhYmJyKSB7CisJcHVibGljIGJvb2xlYW4gc3RhcnRzV2l0aChBYmJyZXZpYXRlZE9iamVjdElkIGFiYnIpIHsKIAkJcmV0dXJuIGFiYnIucHJlZml4Q29tcGFyZSh0aGlzKSA9PSAwOwogCX0KIApAQCAtMjc0LDEzICsyNzYsMTMgQEAgcHVibGljIGZpbmFsIGludCBoYXNoQ29kZSgpIHsKIAkgKiAgICAgICAgICAgIHRoZSBvdGhlciBpZCB0byBjb21wYXJlIHRvLiBNYXkgYmUgbnVsbC4KIAkgKiBAcmV0dXJuIHRydWUgb25seSBpZiBib3RoIE9iamVjdElkcyBoYXZlIGlkZW50aWNhbCBiaXRzLgogCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGVxdWFscyhmaW5hbCBBbnlPYmplY3RJZCBvdGhlcikgeworCXB1YmxpYyBmaW5hbCBib29sZWFuIGVxdWFscyhBbnlPYmplY3RJZCBvdGhlcikgewogCQlyZXR1cm4gb3RoZXIgIT0gbnVsbCA/IGVxdWFscyh0aGlzLCBvdGhlcikgOiBmYWxzZTsKIAl9CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBmaW5hbCBib29sZWFuIGVxdWFscyhmaW5hbCBPYmplY3QgbykgeworCXB1YmxpYyBmaW5hbCBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewogCQlpZiAobyBpbnN0YW5jZW9mIEFueU9iamVjdElkKQogCQkJcmV0dXJuIGVxdWFscygoQW55T2JqZWN0SWQpIG8pOwogCQllbHNlCkBAIC0yOTMsNyArMjk1LDcgQEAgcHVibGljIGZpbmFsIGJvb2xlYW4gZXF1YWxzKGZpbmFsIE9iamVjdCBvKSB7CiAJICogQHBhcmFtIHcKIAkgKiAgICAgICAgICAgIHRoZSBidWZmZXIgdG8gY29weSB0by4gTXVzdCBiZSBpbiBiaWcgZW5kaWFuIG9yZGVyLgogCSAqLwotCXB1YmxpYyB2b2lkIGNvcHlSYXdUbyhmaW5hbCBCeXRlQnVmZmVyIHcpIHsKKwlwdWJsaWMgdm9pZCBjb3B5UmF3VG8oQnl0ZUJ1ZmZlciB3KSB7CiAJCXcucHV0SW50KHcxKTsKIAkJdy5wdXRJbnQodzIpOwogCQl3LnB1dEludCh3Myk7CkBAIC0zMDksNyArMzExLDcgQEAgcHVibGljIHZvaWQgY29weVJhd1RvKGZpbmFsIEJ5dGVCdWZmZXIgdykgewogCSAqIEBwYXJhbSBvCiAJICogICAgICAgICAgICB0aGUgb2Zmc2V0IHdpdGhpbiBiIHRvIHdyaXRlIGF0LgogCSAqLwotCXB1YmxpYyB2b2lkIGNvcHlSYXdUbyhmaW5hbCBieXRlW10gYiwgZmluYWwgaW50IG8pIHsKKwlwdWJsaWMgdm9pZCBjb3B5UmF3VG8oYnl0ZVtdIGIsIGludCBvKSB7CiAJCU5CLmVuY29kZUludDMyKGIsIG8sIHcxKTsKIAkJTkIuZW5jb2RlSW50MzIoYiwgbyArIDQsIHcyKTsKIAkJTkIuZW5jb2RlSW50MzIoYiwgbyArIDgsIHczKTsKQEAgLTMyNSw3ICszMjcsNyBAQCBwdWJsaWMgdm9pZCBjb3B5UmF3VG8oZmluYWwgYnl0ZVtdIGIsIGZpbmFsIGludCBvKSB7CiAJICogQHBhcmFtIG8KIAkgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgd2l0aGluIGIgdG8gd3JpdGUgYXQuCiAJICovCi0JcHVibGljIHZvaWQgY29weVJhd1RvKGZpbmFsIGludFtdIGIsIGZpbmFsIGludCBvKSB7CisJcHVibGljIHZvaWQgY29weVJhd1RvKGludFtdIGIsIGludCBvKSB7CiAJCWJbb10gPSB3MTsKIAkJYltvICsgMV0gPSB3MjsKIAkJYltvICsgMl0gPSB3MzsKQEAgLTM0MSw3ICszNDMsNyBAQCBwdWJsaWMgdm9pZCBjb3B5UmF3VG8oZmluYWwgaW50W10gYiwgZmluYWwgaW50IG8pIHsKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0aGUgc3RyZWFtIHdyaXRpbmcgZmFpbGVkLgogCSAqLwotCXB1YmxpYyB2b2lkIGNvcHlSYXdUbyhmaW5hbCBPdXRwdXRTdHJlYW0gdykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgdm9pZCBjb3B5UmF3VG8oT3V0cHV0U3RyZWFtIHcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXdyaXRlUmF3SW50KHcsIHcxKTsKIAkJd3JpdGVSYXdJbnQodywgdzIpOwogCQl3cml0ZVJhd0ludCh3LCB3Myk7CkBAIC0zNDksNyArMzUxLDcgQEAgcHVibGljIHZvaWQgY29weVJhd1RvKGZpbmFsIE91dHB1dFN0cmVhbSB3KSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl3cml0ZVJhd0ludCh3LCB3NSk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZVJhd0ludChmaW5hbCBPdXRwdXRTdHJlYW0gdywgaW50IHYpCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZVJhd0ludChPdXRwdXRTdHJlYW0gdywgaW50IHYpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQl3LndyaXRlKHYgPj4+IDI0KTsKIAkJdy53cml0ZSh2ID4+PiAxNik7CkBAIC0zNjUsNyArMzY3LDcgQEAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZVJhd0ludChmaW5hbCBPdXRwdXRTdHJlYW0gdywgaW50IHYpCiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgdGhlIHN0cmVhbSB3cml0aW5nIGZhaWxlZC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBjb3B5VG8oZmluYWwgT3V0cHV0U3RyZWFtIHcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIHZvaWQgY29weVRvKE91dHB1dFN0cmVhbSB3KSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl3LndyaXRlKHRvSGV4Qnl0ZUFycmF5KCkpOwogCX0KIApAQCAtNDA4LDcgKzQxMCw3IEBAIHB1YmxpYyB2b2lkIGNvcHlUbyhCeXRlQnVmZmVyIGIpIHsKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gaGV4Ynl0ZSA9IHsgJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLAogCQkJJzcnLCAnOCcsICc5JywgJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJyB9OwogCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBmb3JtYXRIZXhCeXRlKGZpbmFsIGJ5dGVbXSBkc3QsIGZpbmFsIGludCBwLCBpbnQgdykgeworCXByaXZhdGUgc3RhdGljIHZvaWQgZm9ybWF0SGV4Qnl0ZShieXRlW10gZHN0LCBpbnQgcCwgaW50IHcpIHsKIAkJaW50IG8gPSBwICsgNzsKIAkJd2hpbGUgKG8gPj0gcCAmJiB3ICE9IDApIHsKIAkJCWRzdFtvLS1dID0gaGV4Ynl0ZVt3ICYgMHhmXTsKQEAgLTQyNiw3ICs0MjgsNyBAQCBwcml2YXRlIHN0YXRpYyB2b2lkIGZvcm1hdEhleEJ5dGUoZmluYWwgYnl0ZVtdIGRzdCwgZmluYWwgaW50IHAsIGludCB3KSB7CiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgdGhlIHN0cmVhbSB3cml0aW5nIGZhaWxlZC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBjb3B5VG8oZmluYWwgV3JpdGVyIHcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIHZvaWQgY29weVRvKFdyaXRlciB3KSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl3LndyaXRlKHRvSGV4Q2hhckFycmF5KCkpOwogCX0KIApAQCAtNDQyLDcgKzQ0NCw3IEBAIHB1YmxpYyB2b2lkIGNvcHlUbyhmaW5hbCBXcml0ZXIgdykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0aGUgc3RyZWFtIHdyaXRpbmcgZmFpbGVkLgogCSAqLwotCXB1YmxpYyB2b2lkIGNvcHlUbyhmaW5hbCBjaGFyW10gdG1wLCBmaW5hbCBXcml0ZXIgdykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgdm9pZCBjb3B5VG8oY2hhcltdIHRtcCwgV3JpdGVyIHcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXRvSGV4Q2hhckFycmF5KHRtcCk7CiAJCXcud3JpdGUodG1wLCAwLCBDb25zdGFudHMuT0JKRUNUX0lEX1NUUklOR19MRU5HVEgpOwogCX0KQEAgLTQ1Nyw3ICs0NTksNyBAQCBwdWJsaWMgdm9pZCBjb3B5VG8oZmluYWwgY2hhcltdIHRtcCwgZmluYWwgV3JpdGVyIHcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJICogQHBhcmFtIHcKIAkgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gYXBwZW5kIG9udG8uCiAJICovCi0JcHVibGljIHZvaWQgY29weVRvKGZpbmFsIGNoYXJbXSB0bXAsIGZpbmFsIFN0cmluZ0J1aWxkZXIgdykgeworCXB1YmxpYyB2b2lkIGNvcHlUbyhjaGFyW10gdG1wLCBTdHJpbmdCdWlsZGVyIHcpIHsKIAkJdG9IZXhDaGFyQXJyYXkodG1wKTsKIAkJdy5hcHBlbmQodG1wLCAwLCBDb25zdGFudHMuT0JKRUNUX0lEX1NUUklOR19MRU5HVEgpOwogCX0KQEAgLTQ2OCw3ICs0NzAsNyBAQCBwdWJsaWMgdm9pZCBjb3B5VG8oZmluYWwgY2hhcltdIHRtcCwgZmluYWwgU3RyaW5nQnVpbGRlciB3KSB7CiAJCXJldHVybiBkc3Q7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHRvSGV4Q2hhckFycmF5KGZpbmFsIGNoYXJbXSBkc3QpIHsKKwlwcml2YXRlIHZvaWQgdG9IZXhDaGFyQXJyYXkoY2hhcltdIGRzdCkgewogCQlmb3JtYXRIZXhDaGFyKGRzdCwgMCwgdzEpOwogCQlmb3JtYXRIZXhDaGFyKGRzdCwgOCwgdzIpOwogCQlmb3JtYXRIZXhDaGFyKGRzdCwgMTYsIHczKTsKQEAgLTQ3OSw3ICs0ODEsNyBAQCBwcml2YXRlIHZvaWQgdG9IZXhDaGFyQXJyYXkoZmluYWwgY2hhcltdIGRzdCkgewogCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBoZXhjaGFyID0geyAnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsCiAJCQknNycsICc4JywgJzknLCAnYScsICdiJywgJ2MnLCAnZCcsICdlJywgJ2YnIH07CiAKLQlzdGF0aWMgdm9pZCBmb3JtYXRIZXhDaGFyKGZpbmFsIGNoYXJbXSBkc3QsIGZpbmFsIGludCBwLCBpbnQgdykgeworCXN0YXRpYyB2b2lkIGZvcm1hdEhleENoYXIoY2hhcltdIGRzdCwgaW50IHAsIGludCB3KSB7CiAJCWludCBvID0gcCArIDc7CiAJCXdoaWxlIChvID49IHAgJiYgdyAhPSAwKSB7CiAJCQlkc3Rbby0tXSA9IGhleGNoYXJbdyAmIDB4Zl07CkBAIC01MjcsNyArNTI5LDcgQEAgcHVibGljIGZpbmFsIFN0cmluZyBnZXROYW1lKCkgewogCSAqICAgICAgICAgICAgbGVuZ3RoIG9mIHRoZSBhYmJyZXZpYXRlZCBzdHJpbmcuCiAJICogQHJldHVybiBTSEEtMSBhYmJyZXZpYXRpb24uCiAJICovCi0JcHVibGljIEFiYnJldmlhdGVkT2JqZWN0SWQgYWJicmV2aWF0ZShmaW5hbCBpbnQgbGVuKSB7CisJcHVibGljIEFiYnJldmlhdGVkT2JqZWN0SWQgYWJicmV2aWF0ZShpbnQgbGVuKSB7CiAJCWZpbmFsIGludCBhID0gQWJicmV2aWF0ZWRPYmplY3RJZC5tYXNrKGxlbiwgMSwgdzEpOwogCQlmaW5hbCBpbnQgYiA9IEFiYnJldmlhdGVkT2JqZWN0SWQubWFzayhsZW4sIDIsIHcyKTsKIAkJZmluYWwgaW50IGMgPSBBYmJyZXZpYXRlZE9iamVjdElkLm1hc2sobGVuLCAzLCB3Myk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9CYXRjaFJlZlVwZGF0ZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQmF0Y2hSZWZVcGRhdGUuamF2YQppbmRleCA2OTE5ZjdlLi45MjViNmJlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9CYXRjaFJlZlVwZGF0ZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0JhdGNoUmVmVXBkYXRlLmphdmEKQEAgLTQ2LDYgKzQ2LDcgQEAKIAogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5SZWNlaXZlQ29tbWFuZC5SZXN1bHQuTk9UX0FUVEVNUFRFRDsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuUmVjZWl2ZUNvbW1hbmQuUmVzdWx0LlJFSkVDVEVEX09USEVSX1JFQVNPTjsKK2ltcG9ydCBzdGF0aWMgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzLnRvQ29sbGVjdGlvbjsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CkBAIC0xNzksNyArMTgwLDcgQEAgcHVibGljIFBlcnNvbklkZW50IGdldFJlZkxvZ0lkZW50KCkgewogCSAqICAgICAgICAgICAgY29uZmlndXJhdGlvbi4KIAkgKiBAcmV0dXJuIHtAY29kZSB0aGlzfS4KIAkgKi8KLQlwdWJsaWMgQmF0Y2hSZWZVcGRhdGUgc2V0UmVmTG9nSWRlbnQoZmluYWwgUGVyc29uSWRlbnQgcGkpIHsKKwlwdWJsaWMgQmF0Y2hSZWZVcGRhdGUgc2V0UmVmTG9nSWRlbnQoUGVyc29uSWRlbnQgcGkpIHsKIAkJcmVmTG9nSWRlbnQgPSBwaTsKIAkJcmV0dXJuIHRoaXM7CiAJfQpAQCAtNTI4LDggKzUyOSw5IEBAIHB1YmxpYyB2b2lkIGV4ZWN1dGUoUmV2V2FsayB3YWxrLCBQcm9ncmVzc01vbml0b3IgbW9uaXRvciwKIAkJfQogCQlpZiAoIWNvbW1hbmRzMi5pc0VtcHR5KCkpIHsKIAkJCS8vIFdoYXQgcGFydCBvZiB0aGUgbmFtZSBzcGFjZSBpcyBhbHJlYWR5IHRha2VuCi0JCQlDb2xsZWN0aW9uPFN0cmluZz4gdGFrZW5OYW1lcyA9IG5ldyBIYXNoU2V0PD4ocmVmZGIuZ2V0UmVmcygKLQkJCQkJUmVmRGF0YWJhc2UuQUxMKS5rZXlTZXQoKSk7CisJCQlDb2xsZWN0aW9uPFN0cmluZz4gdGFrZW5OYW1lcyA9IHJlZmRiLmdldFJlZnMoKS5zdHJlYW0oKQorCQkJCQkubWFwKFJlZjo6Z2V0TmFtZSkKKwkJCQkJLmNvbGxlY3QodG9Db2xsZWN0aW9uKEhhc2hTZXQ6Om5ldykpOwogCQkJQ29sbGVjdGlvbjxTdHJpbmc+IHRha2VuUHJlZml4ZXMgPSBnZXRUYWtlblByZWZpeGVzKHRha2VuTmFtZXMpOwogCiAJCQkvLyBOb3cgdG8gdGhlIHVwZGF0ZSB0aGF0IG1heSByZXF1aXJlIG1vcmUgcm9vbSBpbiB0aGUgbmFtZSBzcGFjZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQml0bWFwSW5kZXguamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0JpdG1hcEluZGV4LmphdmEKaW5kZXggZmMzNTRkYi4uOWY2NGYzNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQml0bWFwSW5kZXguamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9CaXRtYXBJbmRleC5qYXZhCkBAIC0xMjEsMTkgKzEyMSw2IEBAIHB1YmxpYyBpbnRlcmZhY2UgQml0bWFwIGV4dGVuZHMgSXRlcmFibGU8Qml0bWFwT2JqZWN0PiB7CiAJICogcmV0dXJuIGEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGJ1aWxkZXIuCiAJICovCiAJcHVibGljIGludGVyZmFjZSBCaXRtYXBCdWlsZGVyIGV4dGVuZHMgQml0bWFwIHsKLQkJLyoqCi0JCSAqIEFkZHMgdGhlIGlkIGFuZCB0aGUgZXhpc3RpbmcgYml0bWFwIGZvciB0aGUgaWQsIGlmIG9uZSBleGlzdHMsIHRvIHRoZQotCQkgKiBiaXRtYXAuCi0JCSAqCi0JCSAqIEBwYXJhbSBvYmplY3RJZAotCQkgKiAgICAgICAgICAgIHRoZSBvYmplY3QgSUQKLQkJICogQHBhcmFtIHR5cGUKLQkJICogICAgICAgICAgICB0aGUgR2l0IG9iamVjdCB0eXBlLiBTZWUge0BsaW5rIENvbnN0YW50c30uCi0JCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWUgd2FzIG5vdCBjb250YWluZWQgb3IgYWJsZSB0byBiZSBsb2FkZWQuCi0JCSAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI29yfSBvciB7QGxpbmsgI2FkZE9iamVjdH0gaW5zdGVhZC4KLQkJICovCi0JCUBEZXByZWNhdGVkCi0JCWJvb2xlYW4gYWRkKEFueU9iamVjdElkIG9iamVjdElkLCBpbnQgdHlwZSk7CiAKIAkJLyoqCiAJCSAqIFdoZXRoZXIgdGhlIGJpdG1hcCBoYXMgdGhlIGlkIHNldC4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0Jsb2JCYXNlZENvbmZpZy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQmxvYkJhc2VkQ29uZmlnLmphdmEKaW5kZXggM2ZmOTJkYy4uZTAwOGJlMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQmxvYkJhc2VkQ29uZmlnLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQmxvYkJhc2VkQ29uZmlnLmphdmEKQEAgLTQ1LDYgKzQ1LDggQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmxpYjsKIAoraW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKKwogaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CkBAIC03NiwxMyArNzgsMTIgQEAgcHVibGljIGNsYXNzIEJsb2JCYXNlZENvbmZpZyBleHRlbmRzIENvbmZpZyB7CiAJICogQHRocm93cyBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5Db25maWdJbnZhbGlkRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgdGhlIGJ5dGUgYXJyYXkgaXMgbm90IGEgdmFsaWQgY29uZmlndXJhdGlvbiBmb3JtYXQuCiAJICovCi0JcHVibGljIEJsb2JCYXNlZENvbmZpZyhDb25maWcgYmFzZSwgZmluYWwgYnl0ZVtdIGJsb2IpCisJcHVibGljIEJsb2JCYXNlZENvbmZpZyhDb25maWcgYmFzZSwgYnl0ZVtdIGJsb2IpCiAJCQl0aHJvd3MgQ29uZmlnSW52YWxpZEV4Y2VwdGlvbiB7CiAJCXN1cGVyKGJhc2UpOwogCQlmaW5hbCBTdHJpbmcgZGVjb2RlZDsKIAkJaWYgKGlzVXRmOChibG9iKSkgewotCQkJZGVjb2RlZCA9IFJhd1BhcnNlVXRpbHMuZGVjb2RlKFJhd1BhcnNlVXRpbHMuVVRGOF9DSEFSU0VULAotCQkJCQlibG9iLCAzLCBibG9iLmxlbmd0aCk7CisJCQlkZWNvZGVkID0gUmF3UGFyc2VVdGlscy5kZWNvZGUoQ0hBUlNFVCwgYmxvYiwgMywgYmxvYi5sZW5ndGgpOwogCQl9IGVsc2UgewogCQkJZGVjb2RlZCA9IFJhd1BhcnNlVXRpbHMuZGVjb2RlKGJsb2IpOwogCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9CcmFuY2hDb25maWcuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0JyYW5jaENvbmZpZy5qYXZhCmluZGV4IDU5NmRhMDMuLmJlNTNjNGIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0JyYW5jaENvbmZpZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0JyYW5jaENvbmZpZy5qYXZhCkBAIC0xMDcsNyArMTA3LDcgQEAgcHVibGljIGJvb2xlYW4gbWF0Y2hDb25maWdWYWx1ZShTdHJpbmcgcykgewogCSAqIEBwYXJhbSBicmFuY2hOYW1lCiAJICogICAgICAgICAgICB0aGUgc2hvcnQgYnJhbmNoIG5hbWUgb2YgdGhlIHNlY3Rpb24gdG8gcmVhZAogCSAqLwotCXB1YmxpYyBCcmFuY2hDb25maWcoZmluYWwgQ29uZmlnIGNvbmZpZywgU3RyaW5nIGJyYW5jaE5hbWUpIHsKKwlwdWJsaWMgQnJhbmNoQ29uZmlnKENvbmZpZyBjb25maWcsIFN0cmluZyBicmFuY2hOYW1lKSB7CiAJCXRoaXMuY29uZmlnID0gY29uZmlnOwogCQl0aGlzLmJyYW5jaE5hbWUgPSBicmFuY2hOYW1lOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0NvbW1pdEJ1aWxkZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0NvbW1pdEJ1aWxkZXIuamF2YQppbmRleCAyMjE3ZmRlLi41OWExM2Y2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db21taXRCdWlsZGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29tbWl0QnVpbGRlci5qYXZhCkBAIC0yNDMsNyArMjQzLDcgQEAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgewogCSAqIEBwYXJhbSBuZXdNZXNzYWdlCiAJICogICAgICAgICAgICB0aGUgY29tbWl0IG1lc3NhZ2UuIFNob3VsZCBub3QgYmUgbnVsbC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKGZpbmFsIFN0cmluZyBuZXdNZXNzYWdlKSB7CisJcHVibGljIHZvaWQgc2V0TWVzc2FnZShTdHJpbmcgbmV3TWVzc2FnZSkgewogCQltZXNzYWdlID0gbmV3TWVzc2FnZTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0NvbmZpZy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29uZmlnLmphdmEKaW5kZXggNGQ1NThjOS4uMGUwMWNjYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29uZmlnLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29uZmlnLmphdmEKQEAgLTUxLDYgKzUxLDggQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmxpYjsKIAoraW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKKwogaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwpAQCAtMzc0LDcgKzM3Niw3IEBAIHB1YmxpYyA8VCBleHRlbmRzIEVudW08Pz4+IFQgZ2V0RW51bShmaW5hbCBTdHJpbmcgc2VjdGlvbiwKIAl9CiAKIAlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIHN0YXRpYyA8VD4gVFtdIGFsbFZhbHVlc09mKGZpbmFsIFQgdmFsdWUpIHsKKwlwcml2YXRlIHN0YXRpYyA8VD4gVFtdIGFsbFZhbHVlc09mKFQgdmFsdWUpIHsKIAkJdHJ5IHsKIAkJCXJldHVybiAoVFtdKSB2YWx1ZS5nZXRDbGFzcygpLmdldE1ldGhvZCgidmFsdWVzIikuaW52b2tlKG51bGwpOyAvLyROT04tTkxTLTEkCiAJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlcnIpIHsKQEAgLTUxMyw3ICs1MTUsNyBAQCBwdWJsaWMgTGlzdDxSZWZTcGVjPiBnZXRSZWZTcGVjcyhTdHJpbmcgc2VjdGlvbiwgU3RyaW5nIHN1YnNlY3Rpb24sCiAJICogICAgICAgICBvcmRlciB0aGV5IGFyZSBkZWNsYXJlZCBieSB0aGUgY29uZmlndXJhdGlvbiBzdGFydGluZyBmcm9tIHRoaXMKIAkgKiAgICAgICAgIGluc3RhbmNlIGFuZCBwcm9ncmVzc2luZyB0aHJvdWdoIHRoZSBiYXNlLgogCSAqLwotCXB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRTdWJzZWN0aW9ucyhmaW5hbCBTdHJpbmcgc2VjdGlvbikgeworCXB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRTdWJzZWN0aW9ucyhTdHJpbmcgc2VjdGlvbikgewogCQlyZXR1cm4gZ2V0U3RhdGUoKS5nZXRTdWJzZWN0aW9ucyhzZWN0aW9uKTsKIAl9CiAKQEAgLTU5OSw3ICs2MDEsNyBAQCBwdWJsaWMgU2V0PFN0cmluZz4gZ2V0TmFtZXMoU3RyaW5nIHNlY3Rpb24sIFN0cmluZyBzdWJzZWN0aW9uLAogCSAqIEByZXR1cm4gdGhlIHBhcnNlZCBvYmplY3QgaW5zdGFuY2UsIHdoaWNoIGlzIGNhY2hlZCBpbnNpZGUgdGhpcyBjb25maWcuCiAJICovCiAJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIDxUPiBUIGdldChmaW5hbCBTZWN0aW9uUGFyc2VyPFQ+IHBhcnNlcikgeworCXB1YmxpYyA8VD4gVCBnZXQoU2VjdGlvblBhcnNlcjxUPiBwYXJzZXIpIHsKIAkJZmluYWwgQ29uZmlnU25hcHNob3QgbXlTdGF0ZSA9IGdldFN0YXRlKCk7CiAJCVQgb2JqID0gKFQpIG15U3RhdGUuY2FjaGUuZ2V0KHBhcnNlcik7CiAJCWlmIChvYmogPT0gbnVsbCkgewpAQCAtNjE5LDcgKzYyMSw3IEBAIHB1YmxpYyA8VD4gVCBnZXQoZmluYWwgU2VjdGlvblBhcnNlcjxUPiBwYXJzZXIpIHsKIAkgKiAgICAgICAgICAgIHBhcnNlciB1c2VkIHRvIG9idGFpbiB0aGUgY29uZmlndXJhdGlvbiBvYmplY3QuCiAJICogQHNlZSAjZ2V0KFNlY3Rpb25QYXJzZXIpCiAJICovCi0JcHVibGljIHZvaWQgdW5jYWNoZShmaW5hbCBTZWN0aW9uUGFyc2VyPD8+IHBhcnNlcikgeworCXB1YmxpYyB2b2lkIHVuY2FjaGUoU2VjdGlvblBhcnNlcjw/PiBwYXJzZXIpIHsKIAkJc3RhdGUuZ2V0KCkuY2FjaGUucmVtb3ZlKHBhcnNlcik7CiAJfQogCkBAIC0xMDA4LDcgKzEwMTAsNyBAQCBwcml2YXRlIHN0YXRpYyBpbnQgZmluZFNlY3Rpb25FbmQoZmluYWwgTGlzdDxDb25maWdMaW5lPiBlbnRyaWVzLAogCSAqLwogCXB1YmxpYyBTdHJpbmcgdG9UZXh0KCkgewogCQlmaW5hbCBTdHJpbmdCdWlsZGVyIG91dCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCWZvciAoZmluYWwgQ29uZmlnTGluZSBlIDogc3RhdGUuZ2V0KCkuZW50cnlMaXN0KSB7CisJCWZvciAoQ29uZmlnTGluZSBlIDogc3RhdGUuZ2V0KCkuZW50cnlMaXN0KSB7CiAJCQlpZiAoZS5wcmVmaXggIT0gbnVsbCkKIAkJCQlvdXQuYXBwZW5kKGUucHJlZml4KTsKIAkJCWlmIChlLnNlY3Rpb24gIT0gbnVsbCAmJiBlLm5hbWUgPT0gbnVsbCkgewpAQCAtMTA1NywxMSArMTA1OSwxMSBAQCBwdWJsaWMgU3RyaW5nIHRvVGV4dCgpIHsKIAkgKiAgICAgICAgICAgICB0aGUgdGV4dCBzdXBwbGllZCBpcyBub3QgZm9ybWF0dGVkIGNvcnJlY3RseS4gTm8gY2hhbmdlcyB3ZXJlCiAJICogICAgICAgICAgICAgbWFkZSB0byB7QGNvZGUgdGhpc30uCiAJICovCi0JcHVibGljIHZvaWQgZnJvbVRleHQoZmluYWwgU3RyaW5nIHRleHQpIHRocm93cyBDb25maWdJbnZhbGlkRXhjZXB0aW9uIHsKKwlwdWJsaWMgdm9pZCBmcm9tVGV4dChTdHJpbmcgdGV4dCkgdGhyb3dzIENvbmZpZ0ludmFsaWRFeGNlcHRpb24gewogCQlzdGF0ZS5zZXQobmV3U3RhdGUoZnJvbVRleHRSZWN1cnNlKHRleHQsIDEpKSk7CiAJfQogCi0JcHJpdmF0ZSBMaXN0PENvbmZpZ0xpbmU+IGZyb21UZXh0UmVjdXJzZShmaW5hbCBTdHJpbmcgdGV4dCwgaW50IGRlcHRoKQorCXByaXZhdGUgTGlzdDxDb25maWdMaW5lPiBmcm9tVGV4dFJlY3Vyc2UoU3RyaW5nIHRleHQsIGludCBkZXB0aCkKIAkJCXRocm93cyBDb25maWdJbnZhbGlkRXhjZXB0aW9uIHsKIAkJaWYgKGRlcHRoID4gTUFYX0RFUFRIKSB7CiAJCQl0aHJvdyBuZXcgQ29uZmlnSW52YWxpZEV4Y2VwdGlvbigKQEAgLTExNjYsOCArMTE2OCw3IEBAIHByaXZhdGUgdm9pZCBhZGRJbmNsdWRlZENvbmZpZyhmaW5hbCBMaXN0PENvbmZpZ0xpbmU+IG5ld0VudHJpZXMsCiAKIAkJU3RyaW5nIGRlY29kZWQ7CiAJCWlmIChpc1V0ZjgoYnl0ZXMpKSB7Ci0JCQlkZWNvZGVkID0gUmF3UGFyc2VVdGlscy5kZWNvZGUoUmF3UGFyc2VVdGlscy5VVEY4X0NIQVJTRVQsIGJ5dGVzLCAzLAotCQkJCQlieXRlcy5sZW5ndGgpOworCQkJZGVjb2RlZCA9IFJhd1BhcnNlVXRpbHMuZGVjb2RlKENIQVJTRVQsIGJ5dGVzLCAzLCBieXRlcy5sZW5ndGgpOwogCQl9IGVsc2UgewogCQkJZGVjb2RlZCA9IFJhd1BhcnNlVXRpbHMuZGVjb2RlKGJ5dGVzKTsKIAkJfQpAQCAtMTE4NCw3ICsxMTg1LDcgQEAgcHJpdmF0ZSBDb25maWdTbmFwc2hvdCBuZXdTdGF0ZSgpIHsKIAkJCQlnZXRCYXNlU3RhdGUoKSk7CiAJfQogCi0JcHJpdmF0ZSBDb25maWdTbmFwc2hvdCBuZXdTdGF0ZShmaW5hbCBMaXN0PENvbmZpZ0xpbmU+IGVudHJpZXMpIHsKKwlwcml2YXRlIENvbmZpZ1NuYXBzaG90IG5ld1N0YXRlKExpc3Q8Q29uZmlnTGluZT4gZW50cmllcykgewogCQlyZXR1cm4gbmV3IENvbmZpZ1NuYXBzaG90KENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoZW50cmllcyksCiAJCQkJZ2V0QmFzZVN0YXRlKCkpOwogCX0KQEAgLTEyMDksNyArMTIxMCw3IEBAIHByb3RlY3RlZCBib29sZWFuIGlzVXRmOChmaW5hbCBieXRlW10gYnl0ZXMpIHsKIAkJCQkmJiBieXRlc1sxXSA9PSAoYnl0ZSkgMHhCQiAmJiBieXRlc1syXSA9PSAoYnl0ZSkgMHhCRjsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVhZFNlY3Rpb25OYW1lKGZpbmFsIFN0cmluZ1JlYWRlciBpbikKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVhZFNlY3Rpb25OYW1lKFN0cmluZ1JlYWRlciBpbikKIAkJCXRocm93cyBDb25maWdJbnZhbGlkRXhjZXB0aW9uIHsKIAkJZmluYWwgU3RyaW5nQnVpbGRlciBuYW1lID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKIAkJZm9yICg7OykgewpAQCAtMTI0OCw3ICsxMjQ5LDcgQEAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHJlYWRTZWN0aW9uTmFtZShmaW5hbCBTdHJpbmdSZWFkZXIgaW4pCiAJCXJldHVybiBuYW1lLnRvU3RyaW5nKCk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHJlYWRLZXlOYW1lKGZpbmFsIFN0cmluZ1JlYWRlciBpbikKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVhZEtleU5hbWUoU3RyaW5nUmVhZGVyIGluKQogCQkJdGhyb3dzIENvbmZpZ0ludmFsaWRFeGNlcHRpb24gewogCQlmaW5hbCBTdHJpbmdCdWlsZGVyIG5hbWUgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogCQlmb3IgKDs7KSB7CkBAIC0xMzM1LDcgKzEzMzYsNyBAQCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVhZFN1YnNlY3Rpb25OYW1lKFN0cmluZ1JlYWRlciBpbikKIAkJcmV0dXJuIHIudG9TdHJpbmcoKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVhZFZhbHVlKGZpbmFsIFN0cmluZ1JlYWRlciBpbikKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVhZFZhbHVlKFN0cmluZ1JlYWRlciBpbikKIAkJCXRocm93cyBDb25maWdJbnZhbGlkRXhjZXB0aW9uIHsKIAkJU3RyaW5nQnVpbGRlciB2YWx1ZSA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAJCVN0cmluZ0J1aWxkZXIgdHJhaWxpbmdTcGFjZXMgPSBudWxsOwpAQCAtMTQ1MSw3ICsxNDUyLDcgQEAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU3RyaW5nUmVhZGVyIHsKIAogCQlwcml2YXRlIGludCBwb3M7CiAKLQkJU3RyaW5nUmVhZGVyKGZpbmFsIFN0cmluZyBpbikgeworCQlTdHJpbmdSZWFkZXIoU3RyaW5nIGluKSB7CiAJCQlidWYgPSBpbi50b0NoYXJBcnJheSgpOwogCQl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0NvbmZpZ0xpbmUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0NvbmZpZ0xpbmUuamF2YQppbmRleCBkNWYxZDhmLi45MzdiYTkyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db25maWdMaW5lLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29uZmlnTGluZS5qYXZhCkBAIC03Myw3ICs3Myw3IEBAIGNsYXNzIENvbmZpZ0xpbmUgewogCS8qKiBUaGUgdGV4dCBjb250ZW50IGFmdGVyIGVudHJ5LiAqLwogCVN0cmluZyBzdWZmaXg7CiAKLQlDb25maWdMaW5lIGZvclZhbHVlKGZpbmFsIFN0cmluZyBuZXdWYWx1ZSkgeworCUNvbmZpZ0xpbmUgZm9yVmFsdWUoU3RyaW5nIG5ld1ZhbHVlKSB7CiAJCWZpbmFsIENvbmZpZ0xpbmUgZSA9IG5ldyBDb25maWdMaW5lKCk7CiAJCWUucHJlZml4ID0gcHJlZml4OwogCQllLnNlY3Rpb24gPSBzZWN0aW9uOwpAQCAtOTEsMTIgKzkxLDEyIEBAICYmIGVxU2FtZUNhc2Uoc3Vic2VjdGlvbiwgYVN1YnNlY3Rpb24pCiAJCQkJJiYgZXFJZ25vcmVDYXNlKG5hbWUsIGFLZXkpOwogCX0KIAotCWJvb2xlYW4gbWF0Y2goZmluYWwgU3RyaW5nIGFTZWN0aW9uLCBmaW5hbCBTdHJpbmcgYVN1YnNlY3Rpb24pIHsKKwlib29sZWFuIG1hdGNoKFN0cmluZyBhU2VjdGlvbiwgU3RyaW5nIGFTdWJzZWN0aW9uKSB7CiAJCXJldHVybiBlcUlnbm9yZUNhc2Uoc2VjdGlvbiwgYVNlY3Rpb24pCiAJCQkJJiYgZXFTYW1lQ2FzZShzdWJzZWN0aW9uLCBhU3Vic2VjdGlvbik7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBlcUlnbm9yZUNhc2UoZmluYWwgU3RyaW5nIGEsIGZpbmFsIFN0cmluZyBiKSB7CisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBlcUlnbm9yZUNhc2UoU3RyaW5nIGEsIFN0cmluZyBiKSB7CiAJCWlmIChhID09IG51bGwgJiYgYiA9PSBudWxsKQogCQkJcmV0dXJuIHRydWU7CiAJCWlmIChhID09IG51bGwgfHwgYiA9PSBudWxsKQpAQCAtMTA0LDcgKzEwNCw3IEBAIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZXFJZ25vcmVDYXNlKGZpbmFsIFN0cmluZyBhLCBmaW5hbCBTdHJpbmcgYikgewogCQlyZXR1cm4gU3RyaW5nVXRpbHMuZXF1YWxzSWdub3JlQ2FzZShhLCBiKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGVxU2FtZUNhc2UoZmluYWwgU3RyaW5nIGEsIGZpbmFsIFN0cmluZyBiKSB7CisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBlcVNhbWVDYXNlKFN0cmluZyBhLCBTdHJpbmcgYikgewogCQlpZiAoYSA9PSBudWxsICYmIGIgPT0gbnVsbCkKIAkJCXJldHVybiB0cnVlOwogCQlpZiAoYSA9PSBudWxsIHx8IGIgPT0gbnVsbCkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0NvbnN0YW50cy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29uc3RhbnRzLmphdmEKaW5kZXggMTBhYmQ5ZS4uOTAyM2JkOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29uc3RhbnRzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29uc3RhbnRzLmphdmEKQEAgLTQ1LDYgKzQ1LDggQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmxpYjsKIAoraW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CisKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwogaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKIGltcG9ydCBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3Q7CkBAIC0yMjYsMTAgKzIyOCwxMCBAQCBwdWJsaWMgZmluYWwgY2xhc3MgQ29uc3RhbnRzIHsKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSBQQUNLX1NJR05BVFVSRSA9IHsgJ1AnLCAnQScsICdDJywgJ0snIH07CiAKIAkvKiogTmF0aXZlIGNoYXJhY3RlciBlbmNvZGluZyBmb3IgY29tbWl0IG1lc3NhZ2VzLCBmaWxlIG5hbWVzLi4uICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hBUkFDVEVSX0VOQ09ESU5HID0gIlVURi04IjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIENoYXJzZXQgQ0hBUlNFVDsKIAogCS8qKiBOYXRpdmUgY2hhcmFjdGVyIGVuY29kaW5nIGZvciBjb21taXQgbWVzc2FnZXMsIGZpbGUgbmFtZXMuLi4gKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENoYXJzZXQgQ0hBUlNFVDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSEFSQUNURVJfRU5DT0RJTkc7CiAKIAkvKiogRGVmYXVsdCBtYWluIGJyYW5jaCBuYW1lICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFTVEVSID0gIm1hc3RlciI7CkBAIC00NzUsNyArNDc3LDcgQEAgcHVibGljIHN0YXRpYyBNZXNzYWdlRGlnZXN0IG5ld01lc3NhZ2VEaWdlc3QoKSB7CiAJICogQHBhcmFtIHR5cGVDb2RlIHRoZSB0eXBlIGNvZGUsIGZyb20gYSBwYWNrIHJlcHJlc2VudGF0aW9uLgogCSAqIEByZXR1cm4gdGhlIGNhbm9uaWNhbCBzdHJpbmcgbmFtZSBvZiB0aGlzIHR5cGUuCiAJICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdHlwZVN0cmluZyhmaW5hbCBpbnQgdHlwZUNvZGUpIHsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyB0eXBlU3RyaW5nKGludCB0eXBlQ29kZSkgewogCQlzd2l0Y2ggKHR5cGVDb2RlKSB7CiAJCWNhc2UgT0JKX0NPTU1JVDoKIAkJCXJldHVybiBUWVBFX0NPTU1JVDsKQEAgLTUwMCw3ICs1MDIsNyBAQCBwdWJsaWMgc3RhdGljIFN0cmluZyB0eXBlU3RyaW5nKGZpbmFsIGludCB0eXBlQ29kZSkgewogCSAqIEBwYXJhbSB0eXBlQ29kZSB0aGUgdHlwZSBjb2RlLCBmcm9tIGEgcGFjayByZXByZXNlbnRhdGlvbi4KIAkgKiBAcmV0dXJuIHRoZSBjYW5vbmljYWwgQVNDSUkgZW5jb2RlZCBuYW1lIG9mIHRoaXMgdHlwZS4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGJ5dGVbXSBlbmNvZGVkVHlwZVN0cmluZyhmaW5hbCBpbnQgdHlwZUNvZGUpIHsKKwlwdWJsaWMgc3RhdGljIGJ5dGVbXSBlbmNvZGVkVHlwZVN0cmluZyhpbnQgdHlwZUNvZGUpIHsKIAkJc3dpdGNoICh0eXBlQ29kZSkgewogCQljYXNlIE9CSl9DT01NSVQ6CiAJCQlyZXR1cm4gRU5DT0RFRF9UWVBFX0NPTU1JVDsKQEAgLTU5OSw3ICs2MDEsNyBAQCBwdWJsaWMgc3RhdGljIGludCBkZWNvZGVUeXBlU3RyaW5nKGZpbmFsIEFueU9iamVjdElkIGlkLAogCSAqIEByZXR1cm4gYSBkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBpbnB1dCBpbnRlZ2VyLiBUaGUgcmV0dXJuZWQgYXJyYXkKIAkgKiAgICAgICAgIGlzIHRoZSBzbWFsbGVzdCBhcnJheSB0aGF0IHdpbGwgaG9sZCB0aGUgdmFsdWUuCiAJICovCi0JcHVibGljIHN0YXRpYyBieXRlW10gZW5jb2RlQVNDSUkoZmluYWwgbG9uZyBzKSB7CisJcHVibGljIHN0YXRpYyBieXRlW10gZW5jb2RlQVNDSUkobG9uZyBzKSB7CiAJCXJldHVybiBlbmNvZGVBU0NJSShMb25nLnRvU3RyaW5nKHMpKTsKIAl9CiAKQEAgLTYxNSw3ICs2MTcsNyBAQCBwdWJsaWMgc3RhdGljIGludCBkZWNvZGVUeXBlU3RyaW5nKGZpbmFsIEFueU9iamVjdElkIGlkLAogCSAqICAgICAgICAgICAgIHRoZSBpbnB1dCBzdHJpbmcgY29udGFpbnMgb25lIG9yIG1vcmUgY2hhcmFjdGVycyBvdXRzaWRlIG9mCiAJICogICAgICAgICAgICAgdGhlIDctYml0IEFTQ0lJIGNoYXJhY3RlciBzcGFjZS4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGJ5dGVbXSBlbmNvZGVBU0NJSShmaW5hbCBTdHJpbmcgcykgeworCXB1YmxpYyBzdGF0aWMgYnl0ZVtdIGVuY29kZUFTQ0lJKFN0cmluZyBzKSB7CiAJCWZpbmFsIGJ5dGVbXSByID0gbmV3IGJ5dGVbcy5sZW5ndGgoKV07CiAJCWZvciAoaW50IGsgPSByLmxlbmd0aCAtIDE7IGsgPj0gMDsgay0tKSB7CiAJCQlmaW5hbCBjaGFyIGMgPSBzLmNoYXJBdChrKTsKQEAgLTYzNSw3ICs2MzcsNyBAQCBwdWJsaWMgc3RhdGljIGludCBkZWNvZGVUeXBlU3RyaW5nKGZpbmFsIEFueU9iamVjdElkIGlkLAogCSAqICAgICAgICAgZGVmYXVsdCBjaGFyYWN0ZXIgZW5jb2RpbmcgKFVURi04KS4KIAkgKiBAc2VlICNDSEFSQUNURVJfRU5DT0RJTkcKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGJ5dGVbXSBlbmNvZGUoZmluYWwgU3RyaW5nIHN0cikgeworCXB1YmxpYyBzdGF0aWMgYnl0ZVtdIGVuY29kZShTdHJpbmcgc3RyKSB7CiAJCWZpbmFsIEJ5dGVCdWZmZXIgYmIgPSBDb25zdGFudHMuQ0hBUlNFVC5lbmNvZGUoc3RyKTsKIAkJZmluYWwgaW50IGxlbiA9IGJiLmxpbWl0KCk7CiAJCWlmIChiYi5oYXNBcnJheSgpICYmIGJiLmFycmF5T2Zmc2V0KCkgPT0gMCkgewpAQCAtNjUyLDcgKzY1NCw4IEBAIHB1YmxpYyBzdGF0aWMgaW50IGRlY29kZVR5cGVTdHJpbmcoZmluYWwgQW55T2JqZWN0SWQgaWQsCiAJc3RhdGljIHsKIAkJaWYgKE9CSkVDVF9JRF9MRU5HVEggIT0gbmV3TWVzc2FnZURpZ2VzdCgpLmdldERpZ2VzdExlbmd0aCgpKQogCQkJdGhyb3cgbmV3IExpbmthZ2VFcnJvcihKR2l0VGV4dC5nZXQoKS5pbmNvcnJlY3RPQkpFQ1RfSURfTEVOR1RIKTsKLQkJQ0hBUlNFVCA9IENoYXJzZXQuZm9yTmFtZShDSEFSQUNURVJfRU5DT0RJTkcpOworCQlDSEFSU0VUID0gVVRGXzg7CisJCUNIQVJBQ1RFUl9FTkNPRElORyA9IENIQVJTRVQubmFtZSgpOwogCX0KIAogCS8qKiBuYW1lIG9mIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGNvbW1pdCBtc2cgZm9yIGEgbWVyZ2UgY29tbWl0ICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db3JlQ29uZmlnLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db3JlQ29uZmlnLmphdmEKaW5kZXggMzJhODk0Zi4uOThkZTNhOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29yZUNvbmZpZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0NvcmVDb25maWcuamF2YQpAQCAtMTY2LDcgKzE2Niw3IEBAIHB1YmxpYyBzdGF0aWMgZW51bSBIaWRlRG90RmlsZXMgewogCQlET1RHSVRPTkxZCiAJfQogCi0JcHJpdmF0ZSBDb3JlQ29uZmlnKGZpbmFsIENvbmZpZyByYykgeworCXByaXZhdGUgQ29yZUNvbmZpZyhDb25maWcgcmMpIHsKIAkJY29tcHJlc3Npb24gPSByYy5nZXRJbnQoQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19DT1JFX1NFQ1RJT04sCiAJCQkJQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfQ09NUFJFU1NJT04sIERFRkFVTFRfQ09NUFJFU1NJT04pOwogCQlwYWNrSW5kZXhWZXJzaW9uID0gcmMuZ2V0SW50KENvbmZpZ0NvbnN0YW50cy5DT05GSUdfUEFDS19TRUNUSU9OLApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvRGVmYXVsdFR5cGVkQ29uZmlnR2V0dGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9EZWZhdWx0VHlwZWRDb25maWdHZXR0ZXIuamF2YQppbmRleCA2OGY4ODFkLi44OTFjN2YyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9EZWZhdWx0VHlwZWRDb25maWdHZXR0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9EZWZhdWx0VHlwZWRDb25maWdHZXR0ZXIuamF2YQpAQCAtMjcwLDggKzI3MCw4IEBAIHB1YmxpYyBsb25nIGdldFRpbWVVbml0KENvbmZpZyBjb25maWcsIFN0cmluZyBzZWN0aW9uLCBTdHJpbmcgc3Vic2VjdGlvbiwKIAkJfQogCX0KIAotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gbWF0Y2goZmluYWwgU3RyaW5nIGEsIGZpbmFsIFN0cmluZy4uLiBjYXNlcykgewotCQlmb3IgKGZpbmFsIFN0cmluZyBiIDogY2FzZXMpIHsKKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIG1hdGNoKFN0cmluZyBhLCBTdHJpbmcuLi4gY2FzZXMpIHsKKwkJZm9yIChTdHJpbmcgYiA6IGNhc2VzKSB7CiAJCQlpZiAoYiAhPSBudWxsICYmIGIuZXF1YWxzSWdub3JlQ2FzZShhKSkgewogCQkJCXJldHVybiB0cnVlOwogCQkJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvRmlsZU1vZGUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0ZpbGVNb2RlLmphdmEKaW5kZXggNzg1MjM3MS4uZDRjNGQ1YiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvRmlsZU1vZGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9GaWxlTW9kZS5qYXZhCkBAIC04OCw3ICs4OCw3IEBAIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBGaWxlTW9kZSB7CiAJcHVibGljIHN0YXRpYyBmaW5hbCBGaWxlTW9kZSBUUkVFID0gbmV3IEZpbGVNb2RlKFRZUEVfVFJFRSwKIAkJCUNvbnN0YW50cy5PQkpfVFJFRSkgewogCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIGludCBtb2RlQml0cykgeworCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoaW50IG1vZGVCaXRzKSB7CiAJCQlyZXR1cm4gKG1vZGVCaXRzICYgVFlQRV9NQVNLKSA9PSBUWVBFX1RSRUU7CiAJCX0KIAl9OwpAQCAtOTcsNyArOTcsNyBAQCBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoZmluYWwgaW50IG1vZGVCaXRzKSB7CiAJcHVibGljIHN0YXRpYyBmaW5hbCBGaWxlTW9kZSBTWU1MSU5LID0gbmV3IEZpbGVNb2RlKFRZUEVfU1lNTElOSywKIAkJCUNvbnN0YW50cy5PQkpfQkxPQikgewogCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIGludCBtb2RlQml0cykgeworCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoaW50IG1vZGVCaXRzKSB7CiAJCQlyZXR1cm4gKG1vZGVCaXRzICYgVFlQRV9NQVNLKSA9PSBUWVBFX1NZTUxJTks7CiAJCX0KIAl9OwpAQCAtMTA2LDcgKzEwNiw3IEBAIHB1YmxpYyBib29sZWFuIGVxdWFscyhmaW5hbCBpbnQgbW9kZUJpdHMpIHsKIAlwdWJsaWMgc3RhdGljIGZpbmFsIEZpbGVNb2RlIFJFR1VMQVJfRklMRSA9IG5ldyBGaWxlTW9kZSgwMTAwNjQ0LAogCQkJQ29uc3RhbnRzLk9CSl9CTE9CKSB7CiAJCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoZmluYWwgaW50IG1vZGVCaXRzKSB7CisJCXB1YmxpYyBib29sZWFuIGVxdWFscyhpbnQgbW9kZUJpdHMpIHsKIAkJCXJldHVybiAobW9kZUJpdHMgJiBUWVBFX01BU0spID09IFRZUEVfRklMRSAmJiAobW9kZUJpdHMgJiAwMTExKSA9PSAwOwogCQl9CiAJfTsKQEAgLTExNSw3ICsxMTUsNyBAQCBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoZmluYWwgaW50IG1vZGVCaXRzKSB7CiAJcHVibGljIHN0YXRpYyBmaW5hbCBGaWxlTW9kZSBFWEVDVVRBQkxFX0ZJTEUgPSBuZXcgRmlsZU1vZGUoMDEwMDc1NSwKIAkJCUNvbnN0YW50cy5PQkpfQkxPQikgewogCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIGludCBtb2RlQml0cykgeworCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoaW50IG1vZGVCaXRzKSB7CiAJCQlyZXR1cm4gKG1vZGVCaXRzICYgVFlQRV9NQVNLKSA9PSBUWVBFX0ZJTEUgJiYgKG1vZGVCaXRzICYgMDExMSkgIT0gMDsKIAkJfQogCX07CkBAIC0xMjQsNyArMTI0LDcgQEAgcHVibGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIGludCBtb2RlQml0cykgewogCXB1YmxpYyBzdGF0aWMgZmluYWwgRmlsZU1vZGUgR0lUTElOSyA9IG5ldyBGaWxlTW9kZShUWVBFX0dJVExJTkssCiAJCQlDb25zdGFudHMuT0JKX0NPTU1JVCkgewogCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIGludCBtb2RlQml0cykgeworCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoaW50IG1vZGVCaXRzKSB7CiAJCQlyZXR1cm4gKG1vZGVCaXRzICYgVFlQRV9NQVNLKSA9PSBUWVBFX0dJVExJTks7CiAJCX0KIAl9OwpAQCAtMTMzLDcgKzEzMyw3IEBAIHB1YmxpYyBib29sZWFuIGVxdWFscyhmaW5hbCBpbnQgbW9kZUJpdHMpIHsKIAlwdWJsaWMgc3RhdGljIGZpbmFsIEZpbGVNb2RlIE1JU1NJTkcgPSBuZXcgRmlsZU1vZGUoVFlQRV9NSVNTSU5HLAogCQkJQ29uc3RhbnRzLk9CSl9CQUQpIHsKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGVxdWFscyhmaW5hbCBpbnQgbW9kZUJpdHMpIHsKKwkJcHVibGljIGJvb2xlYW4gZXF1YWxzKGludCBtb2RlQml0cykgewogCQkJcmV0dXJuIG1vZGVCaXRzID09IDA7CiAJCX0KIAl9OwpAQCAtMTQ1LDcgKzE0NSw3IEBAIHB1YmxpYyBib29sZWFuIGVxdWFscyhmaW5hbCBpbnQgbW9kZUJpdHMpIHsKIAkgKiAgICAgICAgICAgIHRoZSBtb2RlIGJpdHMgdGhlIGNhbGxlciBoYXMgc29tZWhvdyBvYnRhaW5lZC4KIAkgKiBAcmV0dXJuIHRoZSBGaWxlTW9kZSBpbnN0YW5jZSB0aGF0IHJlcHJlc2VudHMgdGhlIGdpdmVuIGJpdHMuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBGaWxlTW9kZSBmcm9tQml0cyhmaW5hbCBpbnQgYml0cykgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgRmlsZU1vZGUgZnJvbUJpdHMoaW50IGJpdHMpIHsKIAkJc3dpdGNoIChiaXRzICYgVFlQRV9NQVNLKSB7CiAJCWNhc2UgVFlQRV9NSVNTSU5HOgogCQkJaWYgKGJpdHMgPT0gMCkKQEAgLTE2NSw3ICsxNjUsNyBAQCBwdWJsaWMgc3RhdGljIGZpbmFsIEZpbGVNb2RlIGZyb21CaXRzKGZpbmFsIGludCBiaXRzKSB7CiAKIAkJcmV0dXJuIG5ldyBGaWxlTW9kZShiaXRzLCBDb25zdGFudHMuT0JKX0JBRCkgewogCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoZmluYWwgaW50IGEpIHsKKwkJCXB1YmxpYyBib29sZWFuIGVxdWFscyhpbnQgYSkgewogCQkJCXJldHVybiBiaXRzID09IGE7CiAJCQl9CiAJCX07CkBAIC0xNzcsNyArMTc3LDcgQEAgcHVibGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIGludCBhKSB7CiAKIAlwcml2YXRlIGZpbmFsIGludCBvYmplY3RUeXBlOwogCi0JcHJpdmF0ZSBGaWxlTW9kZShpbnQgbW9kZSwgZmluYWwgaW50IGV4cFR5cGUpIHsKKwlwcml2YXRlIEZpbGVNb2RlKGludCBtb2RlLCBpbnQgZXhwVHlwZSkgewogCQltb2RlQml0cyA9IG1vZGU7CiAJCW9iamVjdFR5cGUgPSBleHBUeXBlOwogCQlpZiAobW9kZSAhPSAwKSB7CkBAIC0yMDYsNyArMjA2LDcgQEAgcHJpdmF0ZSBGaWxlTW9kZShpbnQgbW9kZSwgZmluYWwgaW50IGV4cFR5cGUpIHsKIAkgKiAgICAgICAgICAgIGEgaW50LgogCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbW9kZSBiaXRzIHJlcHJlc2VudCB0aGUgc2FtZSBtb2RlIGFzIHRoaXMgb2JqZWN0CiAJICovCi0JcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZXF1YWxzKGZpbmFsIGludCBtb2RlYml0cyk7CisJcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZXF1YWxzKGludCBtb2RlYml0cyk7CiAKIAkvKioKIAkgKiBDb3B5IHRoaXMgbW9kZSBhcyBhIHNlcXVlbmNlIG9mIG9jdGFsIFVTLUFTQ0lJIGJ5dGVzLgpAQCAtMjIyLDcgKzIyMiw3IEBAIHByaXZhdGUgRmlsZU1vZGUoaW50IG1vZGUsIGZpbmFsIGludCBleHBUeXBlKSB7CiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgdGhlIHN0cmVhbSBlbmNvdW50ZXJlZCBhbiBlcnJvciBkdXJpbmcgdGhlIGNvcHkuCiAJICovCi0JcHVibGljIHZvaWQgY29weVRvKGZpbmFsIE91dHB1dFN0cmVhbSBvcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgdm9pZCBjb3B5VG8oT3V0cHV0U3RyZWFtIG9zKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlvcy53cml0ZShvY3RhbEJ5dGVzKTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0luZGV4RGlmZi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvSW5kZXhEaWZmLmphdmEKaW5kZXggODcwODZjYi4uOTRiOWRkYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvSW5kZXhEaWZmLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvSW5kZXhEaWZmLmphdmEKQEAgLTU0MiwxMCArNTQyLDkgQEAgcHVibGljIGJvb2xlYW4gZGlmZihmaW5hbCBQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgaW50IGVzdFdvcmtUcmVlU2l6ZSwKIAkJCQkJCQlKR2l0VGV4dC5nZXQoKS5pbnZhbGlkSWdub3JlUGFyYW1TdWJtb2R1bGUsCiAJCQkJCQkJc213LmdldFBhdGgoKSksIGUpOwogCQkJCX0KLQkJCQlSZXBvc2l0b3J5IHN1YlJlcG8gPSBzbXcuZ2V0UmVwb3NpdG9yeSgpOwotCQkJCWlmIChzdWJSZXBvICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIHN1YlJlcG9QYXRoID0gc213LmdldFBhdGgoKTsKLQkJCQkJdHJ5IHsKKwkJCQl0cnkgKFJlcG9zaXRvcnkgc3ViUmVwbyA9IHNtdy5nZXRSZXBvc2l0b3J5KCkpIHsKKwkJCQkJaWYgKHN1YlJlcG8gIT0gbnVsbCkgeworCQkJCQkJU3RyaW5nIHN1YlJlcG9QYXRoID0gc213LmdldFBhdGgoKTsKIAkJCQkJCU9iamVjdElkIHN1YkhlYWQgPSBzdWJSZXBvLnJlc29sdmUoIkhFQUQiKTsgLy8kTk9OLU5MUy0xJAogCQkJCQkJaWYgKHN1YkhlYWQgIT0gbnVsbAogCQkJCQkJCQkmJiAhc3ViSGVhZC5lcXVhbHMoc213LmdldE9iamVjdElkKCkpKSB7CkBAIC01NzQsOCArNTczLDYgQEAgcHVibGljIGJvb2xlYW4gZGlmZihmaW5hbCBQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgaW50IGVzdFdvcmtUcmVlU2l6ZSwKIAkJCQkJCQkJcmVjb3JkRmlsZU1vZGUoc3ViUmVwb1BhdGgsIEZpbGVNb2RlLkdJVExJTkspOwogCQkJCQkJCX0KIAkJCQkJCX0KLQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCXN1YlJlcG8uY2xvc2UoKTsKIAkJCQkJfQogCQkJCX0KIAkJCX0KQEAgLTc0NSw3ICs3NDIsNyBAQCBwdWJsaWMgU2V0PFN0cmluZz4gZ2V0VW50cmFja2VkRm9sZGVycygpIHsKIAkgKiBAcGFyYW0gcGF0aCBhIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfSBvYmplY3QuCiAJICogQHJldHVybiBmaWxlIG1vZGUKIAkgKi8KLQlwdWJsaWMgRmlsZU1vZGUgZ2V0SW5kZXhNb2RlKGZpbmFsIFN0cmluZyBwYXRoKSB7CisJcHVibGljIEZpbGVNb2RlIGdldEluZGV4TW9kZShTdHJpbmcgcGF0aCkgewogCQlmaW5hbCBEaXJDYWNoZUVudHJ5IGVudHJ5ID0gZGlyQ2FjaGUuZ2V0RW50cnkocGF0aCk7CiAJCXJldHVybiBlbnRyeSAhPSBudWxsID8gZW50cnkuZ2V0RmlsZU1vZGUoKSA6IEZpbGVNb2RlLk1JU1NJTkc7CiAJfQpAQCAtNzU5LDcgKzc1Niw3IEBAIHB1YmxpYyBGaWxlTW9kZSBnZXRJbmRleE1vZGUoZmluYWwgU3RyaW5nIHBhdGgpIHsKIAkgKiAgICAgICAgIHRoZSBnaXZlbiBmaWxlIG1vZGUKIAkgKiBAc2luY2UgMy42CiAJICovCi0JcHVibGljIFNldDxTdHJpbmc+IGdldFBhdGhzV2l0aEluZGV4TW9kZShmaW5hbCBGaWxlTW9kZSBtb2RlKSB7CisJcHVibGljIFNldDxTdHJpbmc+IGdldFBhdGhzV2l0aEluZGV4TW9kZShGaWxlTW9kZSBtb2RlKSB7CiAJCVNldDxTdHJpbmc+IHBhdGhzID0gZmlsZU1vZGVzLmdldChtb2RlKTsKIAkJaWYgKHBhdGhzID09IG51bGwpCiAJCQlwYXRocyA9IG5ldyBIYXNoU2V0PD4oKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0luZmxhdGVyQ2FjaGUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0luZmxhdGVyQ2FjaGUuamF2YQppbmRleCBhOTc3MjFjLi5kZDBmMThlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9JbmZsYXRlckNhY2hlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvSW5mbGF0ZXJDYWNoZS5qYXZhCkBAIC04OSw3ICs4OSw3IEBAIHByaXZhdGUgc3luY2hyb25pemVkIHN0YXRpYyBJbmZsYXRlciBnZXRJbXBsKCkgewogCSAqICAgICAgICAgICAgdGhlIGluZmxhdGVyIHRvIHJldHVybi4gTWF5IGJlIG51bGwsIGluIHdoaWNoIGNhc2UgdGhpcyBtZXRob2QKIAkgKiAgICAgICAgICAgIGRvZXMgbm90aGluZy4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVsZWFzZShmaW5hbCBJbmZsYXRlciBpKSB7CisJcHVibGljIHN0YXRpYyB2b2lkIHJlbGVhc2UoSW5mbGF0ZXIgaSkgewogCQlpZiAoaSAhPSBudWxsKSB7CiAJCQlpLnJlc2V0KCk7CiAJCQlpZiAocmVsZWFzZUltcGwoaSkpCkBAIC05Nyw3ICs5Nyw3IEBAIHB1YmxpYyBzdGF0aWMgdm9pZCByZWxlYXNlKGZpbmFsIEluZmxhdGVyIGkpIHsKIAkJfQogCX0KIAotCXByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCBib29sZWFuIHJlbGVhc2VJbXBsKGZpbmFsIEluZmxhdGVyIGkpIHsKKwlwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiByZWxlYXNlSW1wbChJbmZsYXRlciBpKSB7CiAJCWlmIChvcGVuSW5mbGF0ZXJDb3VudCA8IFNaKSB7CiAJCQlpbmZsYXRlckNhY2hlW29wZW5JbmZsYXRlckNvdW50KytdID0gaTsKIAkJCXJldHVybiBmYWxzZTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL011dGFibGVPYmplY3RJZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvTXV0YWJsZU9iamVjdElkLmphdmEKaW5kZXggZTQ5MmFmOS4uOGNmMGZkMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvTXV0YWJsZU9iamVjdElkLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvTXV0YWJsZU9iamVjdElkLmphdmEKQEAgLTE2Miw3ICsxNjIsNyBAQCBwdWJsaWMgdm9pZCBmcm9tT2JqZWN0SWQoQW55T2JqZWN0SWQgc3JjKSB7CiAJICogICAgICAgICAgICB0aGUgcmF3IGJ5dGUgYnVmZmVyIHRvIHJlYWQgZnJvbS4gQXQgbGVhc3QgMjAgYnl0ZXMgbXVzdCBiZQogCSAqICAgICAgICAgICAgYXZhaWxhYmxlIHdpdGhpbiB0aGlzIGJ5dGUgYXJyYXkuCiAJICovCi0JcHVibGljIHZvaWQgZnJvbVJhdyhmaW5hbCBieXRlW10gYnMpIHsKKwlwdWJsaWMgdm9pZCBmcm9tUmF3KGJ5dGVbXSBicykgewogCQlmcm9tUmF3KGJzLCAwKTsKIAl9CiAKQEAgLTE3NSw3ICsxNzUsNyBAQCBwdWJsaWMgdm9pZCBmcm9tUmF3KGZpbmFsIGJ5dGVbXSBicykgewogCSAqIEBwYXJhbSBwCiAJICogICAgICAgICAgICBwb3NpdGlvbiB0byByZWFkIHRoZSBmaXJzdCBieXRlIG9mIGRhdGEgZnJvbS4KIAkgKi8KLQlwdWJsaWMgdm9pZCBmcm9tUmF3KGZpbmFsIGJ5dGVbXSBicywgZmluYWwgaW50IHApIHsKKwlwdWJsaWMgdm9pZCBmcm9tUmF3KGJ5dGVbXSBicywgaW50IHApIHsKIAkJdzEgPSBOQi5kZWNvZGVJbnQzMihicywgcCk7CiAJCXcyID0gTkIuZGVjb2RlSW50MzIoYnMsIHAgKyA0KTsKIAkJdzMgPSBOQi5kZWNvZGVJbnQzMihicywgcCArIDgpOwpAQCAtMTkwLDcgKzE5MCw3IEBAIHB1YmxpYyB2b2lkIGZyb21SYXcoZmluYWwgYnl0ZVtdIGJzLCBmaW5hbCBpbnQgcCkgewogCSAqICAgICAgICAgICAgdGhlIHJhdyBpbnQgYnVmZmVyIHRvIHJlYWQgZnJvbS4gQXQgbGVhc3QgNSBpbnRlZ2VycyBtdXN0IGJlCiAJICogICAgICAgICAgICBhdmFpbGFibGUgd2l0aGluIHRoaXMgaW50ZWdlcnMgYXJyYXkuCiAJICovCi0JcHVibGljIHZvaWQgZnJvbVJhdyhmaW5hbCBpbnRbXSBpbnRzKSB7CisJcHVibGljIHZvaWQgZnJvbVJhdyhpbnRbXSBpbnRzKSB7CiAJCWZyb21SYXcoaW50cywgMCk7CiAJfQogCkBAIC0yMDMsNyArMjAzLDcgQEAgcHVibGljIHZvaWQgZnJvbVJhdyhmaW5hbCBpbnRbXSBpbnRzKSB7CiAJICogQHBhcmFtIHAKIAkgKiAgICAgICAgICAgIHBvc2l0aW9uIHRvIHJlYWQgdGhlIGZpcnN0IGludGVnZXIgb2YgZGF0YSBmcm9tLgogCSAqLwotCXB1YmxpYyB2b2lkIGZyb21SYXcoZmluYWwgaW50W10gaW50cywgZmluYWwgaW50IHApIHsKKwlwdWJsaWMgdm9pZCBmcm9tUmF3KGludFtdIGludHMsIGludCBwKSB7CiAJCXcxID0gaW50c1twXTsKIAkJdzIgPSBpbnRzW3AgKyAxXTsKIAkJdzMgPSBpbnRzW3AgKyAyXTsKQEAgLTI0Myw3ICsyNDMsNyBAQCBwdWJsaWMgdm9pZCBzZXQoaW50IGEsIGludCBiLCBpbnQgYywgaW50IGQsIGludCBlKSB7CiAJICogQHBhcmFtIG9mZnNldAogCSAqICAgICAgICAgICAgcG9zaXRpb24gdG8gcmVhZCB0aGUgZmlyc3QgY2hhcmFjdGVyIGZyb20uCiAJICovCi0JcHVibGljIHZvaWQgZnJvbVN0cmluZyhmaW5hbCBieXRlW10gYnVmLCBmaW5hbCBpbnQgb2Zmc2V0KSB7CisJcHVibGljIHZvaWQgZnJvbVN0cmluZyhieXRlW10gYnVmLCBpbnQgb2Zmc2V0KSB7CiAJCWZyb21IZXhTdHJpbmcoYnVmLCBvZmZzZXQpOwogCX0KIApAQCAtMjUzLDE0ICsyNTMsMTQgQEAgcHVibGljIHZvaWQgZnJvbVN0cmluZyhmaW5hbCBieXRlW10gYnVmLCBmaW5hbCBpbnQgb2Zmc2V0KSB7CiAJICogQHBhcmFtIHN0cgogCSAqICAgICAgICAgICAgdGhlIHN0cmluZyB0byByZWFkIGZyb20uIE11c3QgYmUgNDAgY2hhcmFjdGVycyBsb25nLgogCSAqLwotCXB1YmxpYyB2b2lkIGZyb21TdHJpbmcoZmluYWwgU3RyaW5nIHN0cikgeworCXB1YmxpYyB2b2lkIGZyb21TdHJpbmcoU3RyaW5nIHN0cikgewogCQlpZiAoc3RyLmxlbmd0aCgpICE9IENvbnN0YW50cy5PQkpFQ1RfSURfU1RSSU5HX0xFTkdUSCkKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCiAJCQkJCUpHaXRUZXh0LmdldCgpLmludmFsaWRJZCwgc3RyKSk7CiAJCWZyb21IZXhTdHJpbmcoQ29uc3RhbnRzLmVuY29kZUFTQ0lJKHN0ciksIDApOwogCX0KIAotCXByaXZhdGUgdm9pZCBmcm9tSGV4U3RyaW5nKGZpbmFsIGJ5dGVbXSBicywgaW50IHApIHsKKwlwcml2YXRlIHZvaWQgZnJvbUhleFN0cmluZyhieXRlW10gYnMsIGludCBwKSB7CiAJCXRyeSB7CiAJCQl3MSA9IFJhd1BhcnNlVXRpbHMucGFyc2VIZXhJbnQzMihicywgcCk7CiAJCQl3MiA9IFJhd1BhcnNlVXRpbHMucGFyc2VIZXhJbnQzMihicywgcCArIDgpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvT2JqZWN0Q2hlY2tlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvT2JqZWN0Q2hlY2tlci5qYXZhCmluZGV4IDVjMTQ3NTQuLmQzN2ZiMjEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL09iamVjdENoZWNrZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9PYmplY3RDaGVja2VyLmphdmEKQEAgLTEyMzAsNyArMTIzMCw3IEBAIHB1YmxpYyBCbG9iT2JqZWN0Q2hlY2tlciBuZXdCbG9iT2JqZWN0Q2hlY2tlcigpIHsKIAkgKiBAdGhyb3dzIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLkNvcnJ1cHRPYmplY3RFeGNlcHRpb24KIAkgKiAgICAgICAgICAgICBpZiBhbnkgZXJyb3Igd2FzIGRldGVjdGVkLgogCSAqLwotCXB1YmxpYyB2b2lkIGNoZWNrQmxvYihmaW5hbCBieXRlW10gcmF3KSB0aHJvd3MgQ29ycnVwdE9iamVjdEV4Y2VwdGlvbiB7CisJcHVibGljIHZvaWQgY2hlY2tCbG9iKGJ5dGVbXSByYXcpIHRocm93cyBDb3JydXB0T2JqZWN0RXhjZXB0aW9uIHsKIAkJLy8gV2UgY2FuIGFsd2F5cyBhc3N1bWUgdGhlIGJsb2IgaXMgdmFsaWQuCiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9PYmplY3REYXRhYmFzZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvT2JqZWN0RGF0YWJhc2UuamF2YQppbmRleCBiYmVmNTFkLi45M2FkZDVjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9PYmplY3REYXRhYmFzZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL09iamVjdERhdGFiYXNlLmphdmEKQEAgLTEyMSw4ICsxMjEsOCBAQCBwdWJsaWMgdm9pZCBjcmVhdGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHRoZSBvYmplY3Qgc3RvcmUgY2Fubm90IGJlIGFjY2Vzc2VkLgogCSAqLwotCXB1YmxpYyBib29sZWFuIGhhcyhmaW5hbCBBbnlPYmplY3RJZCBvYmplY3RJZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJdHJ5IChmaW5hbCBPYmplY3RSZWFkZXIgb3IgPSBuZXdSZWFkZXIoKSkgeworCXB1YmxpYyBib29sZWFuIGhhcyhBbnlPYmplY3RJZCBvYmplY3RJZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJdHJ5IChPYmplY3RSZWFkZXIgb3IgPSBuZXdSZWFkZXIoKSkgewogCQkJcmV0dXJuIG9yLmhhcyhvYmplY3RJZCk7CiAJCX0KIAl9CkBAIC0xNDEsNyArMTQxLDcgQEAgcHVibGljIGJvb2xlYW4gaGFzKGZpbmFsIEFueU9iamVjdElkIG9iamVjdElkKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHRoZSBvYmplY3Qgc3RvcmUgY2Fubm90IGJlIGFjY2Vzc2VkLgogCSAqLwotCXB1YmxpYyBPYmplY3RMb2FkZXIgb3BlbihmaW5hbCBBbnlPYmplY3RJZCBvYmplY3RJZCkKKwlwdWJsaWMgT2JqZWN0TG9hZGVyIG9wZW4oQW55T2JqZWN0SWQgb2JqZWN0SWQpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlyZXR1cm4gb3BlbihvYmplY3RJZCwgT2JqZWN0UmVhZGVyLk9CSl9BTlkpOwogCX0KQEAgLTE3Miw3ICsxNzIsNyBAQCBwdWJsaWMgT2JqZWN0TG9hZGVyIG9wZW4oZmluYWwgQW55T2JqZWN0SWQgb2JqZWN0SWQpCiAJcHVibGljIE9iamVjdExvYWRlciBvcGVuKEFueU9iamVjdElkIG9iamVjdElkLCBpbnQgdHlwZUhpbnQpCiAJCQl0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwKIAkJCUlPRXhjZXB0aW9uIHsKLQkJdHJ5IChmaW5hbCBPYmplY3RSZWFkZXIgb3IgPSBuZXdSZWFkZXIoKSkgeworCQl0cnkgKE9iamVjdFJlYWRlciBvciA9IG5ld1JlYWRlcigpKSB7CiAJCQlyZXR1cm4gb3Iub3BlbihvYmplY3RJZCwgdHlwZUhpbnQpOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvT2JqZWN0SWQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL09iamVjdElkLmphdmEKaW5kZXggMGU4NTU0NS4uNzY0Zjg5MCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvT2JqZWN0SWQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9PYmplY3RJZC5qYXZhCkBAIC04Niw3ICs4Niw3IEBAIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0SWQgemVyb0lkKCkgewogCSAqICAgICAgICAgICAgdGhlIHN0cmluZyB0byB0ZXN0LgogCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3RyaW5nIGNhbiBjb252ZXJ0ZWQgaW50byBhbiBPYmplY3RJZC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNJZChmaW5hbCBTdHJpbmcgaWQpIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNJZChTdHJpbmcgaWQpIHsKIAkJaWYgKGlkLmxlbmd0aCgpICE9IENvbnN0YW50cy5PQkpFQ1RfSURfU1RSSU5HX0xFTkdUSCkKIAkJCXJldHVybiBmYWxzZTsKIAkJdHJ5IHsKQEAgLTEwNiw3ICsxMDYsNyBAQCBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNJZChmaW5hbCBTdHJpbmcgaWQpIHsKIAkgKiAgICAgICAgICAgIHRoZSBpZCB0byBjb252ZXJ0LiBNYXkgYmUgbnVsbC4KIAkgKiBAcmV0dXJuIHRoZSBoZXggc3RyaW5nIGNvbnZlcnNpb24gb2YgdGhpcyBpZCdzIGNvbnRlbnQuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgdG9TdHJpbmcoZmluYWwgT2JqZWN0SWQgaSkgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIHRvU3RyaW5nKE9iamVjdElkIGkpIHsKIAkJcmV0dXJuIGkgIT0gbnVsbCA/IGkubmFtZSgpIDogWkVST0lEX1NUUjsKIAl9CiAKQEAgLTE1Nyw3ICsxNTcsNyBAQCBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIGJ5dGVbXSBmaXJzdEJ1ZmZlciwgZmluYWwgaW50IGZpLAogCSAqICAgICAgICAgICAgYXZhaWxhYmxlIHdpdGhpbiB0aGlzIGJ5dGUgYXJyYXkuCiAJICogQHJldHVybiB0aGUgY29udmVydGVkIG9iamVjdCBpZC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdElkIGZyb21SYXcoZmluYWwgYnl0ZVtdIGJzKSB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3RJZCBmcm9tUmF3KGJ5dGVbXSBicykgewogCQlyZXR1cm4gZnJvbVJhdyhicywgMCk7CiAJfQogCkBAIC0xNzEsNyArMTcxLDcgQEAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3RJZCBmcm9tUmF3KGZpbmFsIGJ5dGVbXSBicykgewogCSAqICAgICAgICAgICAgcG9zaXRpb24gdG8gcmVhZCB0aGUgZmlyc3QgYnl0ZSBvZiBkYXRhIGZyb20uCiAJICogQHJldHVybiB0aGUgY29udmVydGVkIG9iamVjdCBpZC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdElkIGZyb21SYXcoZmluYWwgYnl0ZVtdIGJzLCBmaW5hbCBpbnQgcCkgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0SWQgZnJvbVJhdyhieXRlW10gYnMsIGludCBwKSB7CiAJCWZpbmFsIGludCBhID0gTkIuZGVjb2RlSW50MzIoYnMsIHApOwogCQlmaW5hbCBpbnQgYiA9IE5CLmRlY29kZUludDMyKGJzLCBwICsgNCk7CiAJCWZpbmFsIGludCBjID0gTkIuZGVjb2RlSW50MzIoYnMsIHAgKyA4KTsKQEAgLTE4OCw3ICsxODgsNyBAQCBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdElkIGZyb21SYXcoZmluYWwgYnl0ZVtdIGJzLCBmaW5hbCBpbnQgcCkgewogCSAqICAgICAgICAgICAgYmUgYXZhaWxhYmxlIHdpdGhpbiB0aGlzIGludCBhcnJheS4KIAkgKiBAcmV0dXJuIHRoZSBjb252ZXJ0ZWQgb2JqZWN0IGlkLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0SWQgZnJvbVJhdyhmaW5hbCBpbnRbXSBpcykgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0SWQgZnJvbVJhdyhpbnRbXSBpcykgewogCQlyZXR1cm4gZnJvbVJhdyhpcywgMCk7CiAJfQogCkBAIC0yMDIsNyArMjAyLDcgQEAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3RJZCBmcm9tUmF3KGZpbmFsIGludFtdIGlzKSB7CiAJICogICAgICAgICAgICBwb3NpdGlvbiB0byByZWFkIHRoZSBmaXJzdCBpbnRlZ2VyIG9mIGRhdGEgZnJvbS4KIAkgKiBAcmV0dXJuIHRoZSBjb252ZXJ0ZWQgb2JqZWN0IGlkLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0SWQgZnJvbVJhdyhmaW5hbCBpbnRbXSBpcywgZmluYWwgaW50IHApIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdElkIGZyb21SYXcoaW50W10gaXMsIGludCBwKSB7CiAJCXJldHVybiBuZXcgT2JqZWN0SWQoaXNbcF0sIGlzW3AgKyAxXSwgaXNbcCArIDJdLCBpc1twICsgM10sIGlzW3AgKyA0XSk7CiAJfQogCkBAIC0yMTYsNyArMjE2LDcgQEAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3RJZCBmcm9tUmF3KGZpbmFsIGludFtdIGlzLCBmaW5hbCBpbnQgcCkgewogCSAqICAgICAgICAgICAgcG9zaXRpb24gdG8gcmVhZCB0aGUgZmlyc3QgY2hhcmFjdGVyIGZyb20uCiAJICogQHJldHVybiB0aGUgY29udmVydGVkIG9iamVjdCBpZC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdElkIGZyb21TdHJpbmcoZmluYWwgYnl0ZVtdIGJ1ZiwgZmluYWwgaW50IG9mZnNldCkgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0SWQgZnJvbVN0cmluZyhieXRlW10gYnVmLCBpbnQgb2Zmc2V0KSB7CiAJCXJldHVybiBmcm9tSGV4U3RyaW5nKGJ1Ziwgb2Zmc2V0KTsKIAl9CiAKQEAgLTIyNywxNCArMjI3LDE0IEBAIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0SWQgZnJvbVN0cmluZyhmaW5hbCBieXRlW10gYnVmLCBmaW5hbCBpbnQgb2Zmc2V0KSB7CiAJICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIHJlYWQgZnJvbS4gTXVzdCBiZSA0MCBjaGFyYWN0ZXJzIGxvbmcuCiAJICogQHJldHVybiB0aGUgY29udmVydGVkIG9iamVjdCBpZC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdElkIGZyb21TdHJpbmcoZmluYWwgU3RyaW5nIHN0cikgeworCXB1YmxpYyBzdGF0aWMgT2JqZWN0SWQgZnJvbVN0cmluZyhTdHJpbmcgc3RyKSB7CiAJCWlmIChzdHIubGVuZ3RoKCkgIT0gQ29uc3RhbnRzLk9CSkVDVF9JRF9TVFJJTkdfTEVOR1RIKSB7CiAJCQl0aHJvdyBuZXcgSW52YWxpZE9iamVjdElkRXhjZXB0aW9uKHN0cik7CiAJCX0KIAkJcmV0dXJuIGZyb21IZXhTdHJpbmcoQ29uc3RhbnRzLmVuY29kZUFTQ0lJKHN0ciksIDApOwogCX0KIAotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdElkIGZyb21IZXhTdHJpbmcoZmluYWwgYnl0ZVtdIGJzLCBpbnQgcCkgeworCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdElkIGZyb21IZXhTdHJpbmcoYnl0ZVtdIGJzLCBpbnQgcCkgewogCQl0cnkgewogCQkJZmluYWwgaW50IGEgPSBSYXdQYXJzZVV0aWxzLnBhcnNlSGV4SW50MzIoYnMsIHApOwogCQkJZmluYWwgaW50IGIgPSBSYXdQYXJzZVV0aWxzLnBhcnNlSGV4SW50MzIoYnMsIHAgKyA4KTsKQEAgLTI4MSw3ICsyODEsNyBAQCBwdWJsaWMgT2JqZWN0SWQoaW50IG5ld18xLCBpbnQgbmV3XzIsIGludCBuZXdfMywgaW50IG5ld180LCBpbnQgbmV3XzUpIHsKIAkgKiBAcGFyYW0gc3JjCiAJICogICAgICAgICAgICBhbm90aGVyIGFscmVhZHkgcGFyc2VkIE9iamVjdElkIHRvIGNvcHkgdGhlIHZhbHVlIG91dCBvZi4KIAkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0SWQoZmluYWwgQW55T2JqZWN0SWQgc3JjKSB7CisJcHJvdGVjdGVkIE9iamVjdElkKEFueU9iamVjdElkIHNyYykgewogCQl3MSA9IHNyYy53MTsKIAkJdzIgPSBzcmMudzI7CiAJCXczID0gc3JjLnczOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvT2JqZWN0SWRPd25lck1hcC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvT2JqZWN0SWRPd25lck1hcC5qYXZhCmluZGV4IDAzYTQzMGMuLjlkZjU5MzMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL09iamVjdElkT3duZXJNYXAuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9PYmplY3RJZE93bmVyTWFwLmphdmEKQEAgLTEzNCw3ICsxMzQsNyBAQCBwdWJsaWMgdm9pZCBjbGVhcigpIHsKIAkgKiBAcmV0dXJuIHRoZSBpbnN0YW5jZSBtYXBwZWQgdG8gdG9GaW5kLCBvciBudWxsIGlmIG5vIG1hcHBpbmcgZXhpc3RzLgogCSAqLwogCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBWIGdldChmaW5hbCBBbnlPYmplY3RJZCB0b0ZpbmQpIHsKKwlwdWJsaWMgViBnZXQoQW55T2JqZWN0SWQgdG9GaW5kKSB7CiAJCWludCBoID0gdG9GaW5kLncxOwogCQlWIG9iaiA9IGRpcmVjdG9yeVtoICYgbWFza11baCA+Pj4gU0VHTUVOVF9TSElGVF07CiAJCWZvciAoOyBvYmogIT0gbnVsbDsgb2JqID0gKFYpIG9iai5uZXh0KQpAQCAtMTQ5LDcgKzE0OSw3IEBAIHB1YmxpYyBWIGdldChmaW5hbCBBbnlPYmplY3RJZCB0b0ZpbmQpIHsKIAkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBtYXAgY29udGFpbnMgdGhlIHNwZWNpZmllZCBvYmplY3QuCiAJICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoZmluYWwgQW55T2JqZWN0SWQgdG9GaW5kKSB7CisJcHVibGljIGJvb2xlYW4gY29udGFpbnMoQW55T2JqZWN0SWQgdG9GaW5kKSB7CiAJCXJldHVybiBnZXQodG9GaW5kKSAhPSBudWxsOwogCX0KIApAQCAtMTYzLDcgKzE2Myw3IEBAIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKGZpbmFsIEFueU9iamVjdElkIHRvRmluZCkgewogCSAqIEBwYXJhbSBuZXdWYWx1ZQogCSAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBzdG9yZS4KIAkgKi8KLQlwdWJsaWMgPFEgZXh0ZW5kcyBWPiB2b2lkIGFkZChmaW5hbCBRIG5ld1ZhbHVlKSB7CisJcHVibGljIDxRIGV4dGVuZHMgVj4gdm9pZCBhZGQoUSBuZXdWYWx1ZSkgewogCQlpZiAoKytzaXplID09IGdyb3cpCiAJCQlncm93KCk7CiAKQEAgLTE5NCw3ICsxOTQsNyBAQCBwdWJsaWMgPFEgZXh0ZW5kcyBWPiB2b2lkIGFkZChmaW5hbCBRIG5ld1ZhbHVlKSB7CiAJICogICAgICAgICB7QGNvZGUgZ2V0KG5ld1ZhbHVlKX0gZmlyc3QuCiAJICovCiAJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIDxRIGV4dGVuZHMgVj4gViBhZGRJZkFic2VudChmaW5hbCBRIG5ld1ZhbHVlKSB7CisJcHVibGljIDxRIGV4dGVuZHMgVj4gViBhZGRJZkFic2VudChRIG5ld1ZhbHVlKSB7CiAJCWludCBoID0gbmV3VmFsdWUudzE7CiAJCVZbXSB0YWJsZSA9IGRpcmVjdG9yeVtoICYgbWFza107CiAJCWggPj4+PSBTRUdNRU5UX1NISUZUOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvT2JqZWN0SWRTdWJjbGFzc01hcC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvT2JqZWN0SWRTdWJjbGFzc01hcC5qYXZhCmluZGV4IDAwMWFhOWMuLmNkNTdiZGEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL09iamVjdElkU3ViY2xhc3NNYXAuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9PYmplY3RJZFN1YmNsYXNzTWFwLmphdmEKQEAgLTk2LDcgKzk2LDcgQEAgcHVibGljIHZvaWQgY2xlYXIoKSB7CiAJICogICAgICAgICAgICB0aGUgb2JqZWN0IGlkZW50aWZpZXIgdG8gZmluZC4KIAkgKiBAcmV0dXJuIHRoZSBpbnN0YW5jZSBtYXBwZWQgdG8gdG9GaW5kLCBvciBudWxsIGlmIG5vIG1hcHBpbmcgZXhpc3RzLgogCSAqLwotCXB1YmxpYyBWIGdldChmaW5hbCBBbnlPYmplY3RJZCB0b0ZpbmQpIHsKKwlwdWJsaWMgViBnZXQoQW55T2JqZWN0SWQgdG9GaW5kKSB7CiAJCWZpbmFsIGludCBtc2sgPSBtYXNrOwogCQlpbnQgaSA9IHRvRmluZC53MSAmIG1zazsKIAkJZmluYWwgVltdIHRibCA9IHRhYmxlOwpAQCAtMTE2LDcgKzExNiw3IEBAIHB1YmxpYyBWIGdldChmaW5hbCBBbnlPYmplY3RJZCB0b0ZpbmQpIHsKIAkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBtYXAgY29udGFpbnMgdGhlIHNwZWNpZmllZCBvYmplY3QuCiAJICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoZmluYWwgQW55T2JqZWN0SWQgdG9GaW5kKSB7CisJcHVibGljIGJvb2xlYW4gY29udGFpbnMoQW55T2JqZWN0SWQgdG9GaW5kKSB7CiAJCXJldHVybiBnZXQodG9GaW5kKSAhPSBudWxsOwogCX0KIApAQCAtMTMxLDcgKzEzMSw3IEBAIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKGZpbmFsIEFueU9iamVjdElkIHRvRmluZCkgewogCSAqIEBwYXJhbSBuZXdWYWx1ZQogCSAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBzdG9yZS4KIAkgKi8KLQlwdWJsaWMgPFEgZXh0ZW5kcyBWPiB2b2lkIGFkZChmaW5hbCBRIG5ld1ZhbHVlKSB7CisJcHVibGljIDxRIGV4dGVuZHMgVj4gdm9pZCBhZGQoUSBuZXdWYWx1ZSkgewogCQlpZiAoKytzaXplID09IGdyb3cpCiAJCQlncm93KCk7CiAJCWluc2VydChuZXdWYWx1ZSk7CkBAIC0xNTUsNyArMTU1LDcgQEAgcHVibGljIDxRIGV4dGVuZHMgVj4gdm9pZCBhZGQoZmluYWwgUSBuZXdWYWx1ZSkgewogCSAqICAgICAgICAgdGhhdCB3b3VsZCBoYXZlIGJlZW4gcmV0dXJuZWQgaGFkIHRoZSBjYWxsZXIgdXNlZAogCSAqICAgICAgICAge0Bjb2RlIGdldChuZXdWYWx1ZSl9IGZpcnN0LgogCSAqLwotCXB1YmxpYyA8USBleHRlbmRzIFY+IFYgYWRkSWZBYnNlbnQoZmluYWwgUSBuZXdWYWx1ZSkgeworCXB1YmxpYyA8USBleHRlbmRzIFY+IFYgYWRkSWZBYnNlbnQoUSBuZXdWYWx1ZSkgewogCQlmaW5hbCBpbnQgbXNrID0gbWFzazsKIAkJaW50IGkgPSBuZXdWYWx1ZS53MSAmIG1zazsKIAkJZmluYWwgVltdIHRibCA9IHRhYmxlOwpAQCAtMjI2LDcgKzIyNiw3IEBAIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKIAkJfTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgaW5zZXJ0KGZpbmFsIFYgbmV3VmFsdWUpIHsKKwlwcml2YXRlIHZvaWQgaW5zZXJ0KFYgbmV3VmFsdWUpIHsKIAkJZmluYWwgaW50IG1zayA9IG1hc2s7CiAJCWludCBqID0gbmV3VmFsdWUudzEgJiBtc2s7CiAJCWZpbmFsIFZbXSB0YmwgPSB0YWJsZTsKQEAgLTI1NCw3ICsyNTQsNyBAQCBwcml2YXRlIHZvaWQgaW5pdFRhYmxlKGludCBzeikgewogCX0KIAogCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgZmluYWwgVltdIGNyZWF0ZUFycmF5KGZpbmFsIGludCBzeikgeworCXByaXZhdGUgZmluYWwgVltdIGNyZWF0ZUFycmF5KGludCBzeikgewogCQlyZXR1cm4gKFZbXSkgbmV3IE9iamVjdElkW3N6XTsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9PYmplY3RJbnNlcnRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvT2JqZWN0SW5zZXJ0ZXIuamF2YQppbmRleCA0MDUyMmJhLi43N2ZhMWIyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9PYmplY3RJbnNlcnRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL09iamVjdEluc2VydGVyLmphdmEKQEAgLTM2MSw3ICszNjEsNyBAQCBwdWJsaWMgZmluYWwgT2JqZWN0SWQgaW5zZXJ0KFRhZ0J1aWxkZXIgYnVpbGRlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0aGUgb2JqZWN0IGNvdWxkIG5vdCBiZSBzdG9yZWQuCiAJICovCi0JcHVibGljIE9iamVjdElkIGluc2VydChmaW5hbCBpbnQgdHlwZSwgZmluYWwgYnl0ZVtdIGRhdGEpCisJcHVibGljIE9iamVjdElkIGluc2VydChpbnQgdHlwZSwgYnl0ZVtdIGRhdGEpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlyZXR1cm4gaW5zZXJ0KHR5cGUsIGRhdGEsIDAsIGRhdGEubGVuZ3RoKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9PYmplY3RMb2FkZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL09iamVjdExvYWRlci5qYXZhCmluZGV4IDQzMmY1YTYuLjJlNTJmMDMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL09iamVjdExvYWRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL09iamVjdExvYWRlci5qYXZhCkBAIC0xOTQsOCArMTk0LDcgQEAgcHVibGljIGJvb2xlYW4gaXNMYXJnZSgpIHsKIAkJaWYgKCFpc0xhcmdlKCkpCiAJCQlyZXR1cm4gZ2V0Q2FjaGVkQnl0ZXMoKTsKIAotCQlPYmplY3RTdHJlYW0gaW4gPSBvcGVuU3RyZWFtKCk7Ci0JCXRyeSB7CisJCXRyeSAoT2JqZWN0U3RyZWFtIGluID0gb3BlblN0cmVhbSgpKSB7CiAJCQlsb25nIHN6ID0gaW4uZ2V0U2l6ZSgpOwogCQkJaWYgKHNpemVMaW1pdCA8IHN6KQogCQkJCXRocm93IG5ldyBMYXJnZU9iamVjdEV4Y2VwdGlvbi5FeGNlZWRzTGltaXQoc2l6ZUxpbWl0LCBzeik7CkBAIC0yMTIsOCArMjExLDYgQEAgcHVibGljIGJvb2xlYW4gaXNMYXJnZSgpIHsKIAogCQkJSU8ucmVhZEZ1bGx5KGluLCBidWYsIDAsIGJ1Zi5sZW5ndGgpOwogCQkJcmV0dXJuIGJ1ZjsKLQkJfSBmaW5hbGx5IHsKLQkJCWluLmNsb3NlKCk7CiAJCX0KIAl9CiAKQEAgLTI1NSw4ICsyNTIsNyBAQCBwdWJsaWMgYWJzdHJhY3QgT2JqZWN0U3RyZWFtIG9wZW5TdHJlYW0oKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKIAlwdWJsaWMgdm9pZCBjb3B5VG8oT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCiAJCQlJT0V4Y2VwdGlvbiB7CiAJCWlmIChpc0xhcmdlKCkpIHsKLQkJCU9iamVjdFN0cmVhbSBpbiA9IG9wZW5TdHJlYW0oKTsKLQkJCXRyeSB7CisJCQl0cnkgKE9iamVjdFN0cmVhbSBpbiA9IG9wZW5TdHJlYW0oKSkgewogCQkJCWZpbmFsIGxvbmcgc3ogPSBpbi5nZXRTaXplKCk7CiAJCQkJYnl0ZVtdIHRtcCA9IG5ldyBieXRlWzgxOTJdOwogCQkJCWxvbmcgY29waWVkID0gMDsKQEAgLTI2OSwxNSArMjY1LDEzIEBAIHB1YmxpYyB2b2lkIGNvcHlUbyhPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKIAkJCQl9CiAJCQkJaWYgKDAgPD0gaW4ucmVhZCgpKQogCQkJCQl0aHJvdyBuZXcgRU9GRXhjZXB0aW9uKCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWluLmNsb3NlKCk7CiAJCQl9CiAJCX0gZWxzZSB7CiAJCQlvdXQud3JpdGUoZ2V0Q2FjaGVkQnl0ZXMoKSk7CiAJCX0KIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBieXRlW10gY2xvbmVBcnJheShmaW5hbCBieXRlW10gZGF0YSkgeworCXByaXZhdGUgc3RhdGljIGJ5dGVbXSBjbG9uZUFycmF5KGJ5dGVbXSBkYXRhKSB7CiAJCWZpbmFsIGJ5dGVbXSBjb3B5ID0gbmV3IGJ5dGVbZGF0YS5sZW5ndGhdOwogCQlTeXN0ZW0uYXJyYXljb3B5KGRhdGEsIDAsIGNvcHksIDAsIGRhdGEubGVuZ3RoKTsKIAkJcmV0dXJuIGNvcHk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9QZXJzb25JZGVudC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvUGVyc29uSWRlbnQuamF2YQppbmRleCAxOGExMWYwLi5jMTZhMmI2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9QZXJzb25JZGVudC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1BlcnNvbklkZW50LmphdmEKQEAgLTE2Nyw3ICsxNjcsNyBAQCBwdWJsaWMgc3RhdGljIHZvaWQgYXBwZW5kU2FuaXRpemVkKFN0cmluZ0J1aWxkZXIgciwgU3RyaW5nIHN0cikgewogCSAqCiAJICogQHBhcmFtIHJlcG8gYSB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeX0gb2JqZWN0LgogCSAqLwotCXB1YmxpYyBQZXJzb25JZGVudChmaW5hbCBSZXBvc2l0b3J5IHJlcG8pIHsKKwlwdWJsaWMgUGVyc29uSWRlbnQoUmVwb3NpdG9yeSByZXBvKSB7CiAJCXRoaXMocmVwby5nZXRDb25maWcoKS5nZXQoVXNlckNvbmZpZy5LRVkpKTsKIAl9CiAKQEAgLTE3Nyw3ICsxNzcsNyBAQCBwdWJsaWMgUGVyc29uSWRlbnQoZmluYWwgUmVwb3NpdG9yeSByZXBvKSB7CiAJICogQHBhcmFtIHBpCiAJICogICAgICAgICAgICBPcmlnaW5hbCB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5saWIuUGVyc29uSWRlbnR9CiAJICovCi0JcHVibGljIFBlcnNvbklkZW50KGZpbmFsIFBlcnNvbklkZW50IHBpKSB7CisJcHVibGljIFBlcnNvbklkZW50KFBlcnNvbklkZW50IHBpKSB7CiAJCXRoaXMocGkuZ2V0TmFtZSgpLCBwaS5nZXRFbWFpbEFkZHJlc3MoKSk7CiAJfQogCkBAIC0xOTAsNyArMTkwLDcgQEAgcHVibGljIFBlcnNvbklkZW50KGZpbmFsIFBlcnNvbklkZW50IHBpKSB7CiAJICogQHBhcmFtIGFFbWFpbEFkZHJlc3MKIAkgKiAgICAgICAgICAgIGEge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9IG9iamVjdC4KIAkgKi8KLQlwdWJsaWMgUGVyc29uSWRlbnQoZmluYWwgU3RyaW5nIGFOYW1lLCBmaW5hbCBTdHJpbmcgYUVtYWlsQWRkcmVzcykgeworCXB1YmxpYyBQZXJzb25JZGVudChTdHJpbmcgYU5hbWUsIFN0cmluZyBhRW1haWxBZGRyZXNzKSB7CiAJCXRoaXMoYU5hbWUsIGFFbWFpbEFkZHJlc3MsIFN5c3RlbVJlYWRlci5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRUaW1lKCkpOwogCX0KIApAQCAtMjIxLDcgKzIyMSw3IEBAIHB1YmxpYyBQZXJzb25JZGVudChTdHJpbmcgYU5hbWUsIFN0cmluZyBhRW1haWxBZGRyZXNzLAogCSAqIEBwYXJhbSB0egogCSAqICAgICAgICAgICAgdGltZSB6b25lCiAJICovCi0JcHVibGljIFBlcnNvbklkZW50KGZpbmFsIFBlcnNvbklkZW50IHBpLCBmaW5hbCBEYXRlIHdoZW4sIGZpbmFsIFRpbWVab25lIHR6KSB7CisJcHVibGljIFBlcnNvbklkZW50KFBlcnNvbklkZW50IHBpLCBEYXRlIHdoZW4sIFRpbWVab25lIHR6KSB7CiAJCXRoaXMocGkuZ2V0TmFtZSgpLCBwaS5nZXRFbWFpbEFkZHJlc3MoKSwgd2hlbiwgdHopOwogCX0KIApAQCAtMjM0LDcgKzIzNCw3IEBAIHB1YmxpYyBQZXJzb25JZGVudChmaW5hbCBQZXJzb25JZGVudCBwaSwgZmluYWwgRGF0ZSB3aGVuLCBmaW5hbCBUaW1lWm9uZSB0eikgewogCSAqIEBwYXJhbSBhV2hlbgogCSAqICAgICAgICAgICAgbG9jYWwgdGltZQogCSAqLwotCXB1YmxpYyBQZXJzb25JZGVudChmaW5hbCBQZXJzb25JZGVudCBwaSwgZmluYWwgRGF0ZSBhV2hlbikgeworCXB1YmxpYyBQZXJzb25JZGVudChQZXJzb25JZGVudCBwaSwgRGF0ZSBhV2hlbikgewogCQl0aGlzKHBpLmdldE5hbWUoKSwgcGkuZ2V0RW1haWxBZGRyZXNzKCksIGFXaGVuLmdldFRpbWUoKSwgcGkudHpPZmZzZXQpOwogCX0KIApAQCAtMjY0LDcgKzI2NCw3IEBAIHB1YmxpYyBQZXJzb25JZGVudChmaW5hbCBTdHJpbmcgYU5hbWUsIGZpbmFsIFN0cmluZyBhRW1haWxBZGRyZXNzLAogCSAqIEBwYXJhbSBhVFoKIAkgKiAgICAgICAgICAgIHRpbWUgem9uZQogCSAqLwotCXB1YmxpYyBQZXJzb25JZGVudChmaW5hbCBQZXJzb25JZGVudCBwaSwgZmluYWwgbG9uZyBhV2hlbiwgZmluYWwgaW50IGFUWikgeworCXB1YmxpYyBQZXJzb25JZGVudChQZXJzb25JZGVudCBwaSwgbG9uZyBhV2hlbiwgaW50IGFUWikgewogCQl0aGlzKHBpLmdldE5hbWUoKSwgcGkuZ2V0RW1haWxBZGRyZXNzKCksIGFXaGVuLCBhVFopOwogCX0KIApAQCAtMjc0LDcgKzI3NCw3IEBAIHByaXZhdGUgUGVyc29uSWRlbnQoZmluYWwgU3RyaW5nIGFOYW1lLCBmaW5hbCBTdHJpbmcgYUVtYWlsQWRkcmVzcywKIAkJCQkuZ2V0VGltZXpvbmUod2hlbikpOwogCX0KIAotCXByaXZhdGUgUGVyc29uSWRlbnQoZmluYWwgVXNlckNvbmZpZyBjb25maWcpIHsKKwlwcml2YXRlIFBlcnNvbklkZW50KFVzZXJDb25maWcgY29uZmlnKSB7CiAJCXRoaXMoY29uZmlnLmdldENvbW1pdHRlck5hbWUoKSwgY29uZmlnLmdldENvbW1pdHRlckVtYWlsKCkpOwogCX0KIApAQCAtMzcwLDcgKzM3MCw3IEBAIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhmaW5hbCBPYmplY3QgbykgeworCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewogCQlpZiAobyBpbnN0YW5jZW9mIFBlcnNvbklkZW50KSB7CiAJCQlmaW5hbCBQZXJzb25JZGVudCBwID0gKFBlcnNvbklkZW50KSBvOwogCQkJcmV0dXJuIGdldE5hbWUoKS5lcXVhbHMocC5nZXROYW1lKCkpCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZWJhc2VUb2RvRmlsZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvUmViYXNlVG9kb0ZpbGUuamF2YQppbmRleCAwNmI0YjIyLi4zODcxNjA1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZWJhc2VUb2RvRmlsZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1JlYmFzZVRvZG9GaWxlLmphdmEKQEAgLTQzLDcgKzQzLDcgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmxpYjsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogCiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkZpbGU7CkBAIC0xODMsNyArMTgzLDcgQEAgcHJpdmF0ZSBzdGF0aWMgUmViYXNlVG9kb0xpbmUgcGFyc2VMaW5lKGJ5dGVbXSBidWYsIGludCB0b2tlbkJlZ2luLAogCQkJc3dpdGNoICh0b2tlbkNvdW50KSB7CiAJCQljYXNlIDA6CiAJCQkJU3RyaW5nIGFjdGlvblRva2VuID0gbmV3IFN0cmluZyhidWYsIHRva2VuQmVnaW4sCi0JCQkJCQluZXh0U3BhY2UgLSB0b2tlbkJlZ2luIC0gMSwgVVRGXzgpOworCQkJCQkJbmV4dFNwYWNlIC0gdG9rZW5CZWdpbiAtIDEsIENIQVJTRVQpOwogCQkJCXRva2VuQmVnaW4gPSBuZXh0U3BhY2U7CiAJCQkJYWN0aW9uID0gUmViYXNlVG9kb0xpbmUuQWN0aW9uLnBhcnNlKGFjdGlvblRva2VuKTsKIAkJCQlpZiAoYWN0aW9uID09IG51bGwpCkBAIC0xOTIsNyArMTkyLDcgQEAgcHJpdmF0ZSBzdGF0aWMgUmViYXNlVG9kb0xpbmUgcGFyc2VMaW5lKGJ5dGVbXSBidWYsIGludCB0b2tlbkJlZ2luLAogCQkJY2FzZSAxOgogCQkJCW5leHRTcGFjZSA9IFJhd1BhcnNlVXRpbHMubmV4dChidWYsIHRva2VuQmVnaW4sICcgJyk7CiAJCQkJU3RyaW5nIGNvbW1pdFRva2VuID0gbmV3IFN0cmluZyhidWYsIHRva2VuQmVnaW4sCi0JCQkJCQluZXh0U3BhY2UgLSB0b2tlbkJlZ2luIC0gMSwgVVRGXzgpOworCQkJCQkJbmV4dFNwYWNlIC0gdG9rZW5CZWdpbiAtIDEsIENIQVJTRVQpOwogCQkJCXRva2VuQmVnaW4gPSBuZXh0U3BhY2U7CiAJCQkJY29tbWl0ID0gQWJicmV2aWF0ZWRPYmplY3RJZC5mcm9tU3RyaW5nKGNvbW1pdFRva2VuKTsKIAkJCQlicmVhazsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1JlZi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvUmVmLmphdmEKaW5kZXggMzk1YmIzMi4uYjAwMDU1OCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvUmVmLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvUmVmLmphdmEKQEAgLTEwNSw3ICsxMDUsNyBAQCBwdWJsaWMgc3RhdGljIGVudW0gU3RvcmFnZSB7CiAKIAkJcHJpdmF0ZSBmaW5hbCBib29sZWFuIHBhY2tlZDsKIAotCQlwcml2YXRlIFN0b3JhZ2UoZmluYWwgYm9vbGVhbiBsLCBmaW5hbCBib29sZWFuIHApIHsKKwkJcHJpdmF0ZSBTdG9yYWdlKGJvb2xlYW4gbCwgYm9vbGVhbiBwKSB7CiAJCQlsb29zZSA9IGw7CiAJCQlwYWNrZWQgPSBwOwogCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZWZDb21wYXJhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZWZDb21wYXJhdG9yLmphdmEKaW5kZXggNDNkMmYzNy4uOGJjYWMwMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvUmVmQ29tcGFyYXRvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1JlZkNvbXBhcmF0b3IuamF2YQpAQCAtNjIsNyArNjIsNyBAQCBwdWJsaWMgY2xhc3MgUmVmQ29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3I8UmVmPiB7CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgY29tcGFyZShmaW5hbCBSZWYgbzEsIGZpbmFsIFJlZiBvMikgeworCXB1YmxpYyBpbnQgY29tcGFyZShSZWYgbzEsIFJlZiBvMikgewogCQlyZXR1cm4gY29tcGFyZVRvKG8xLCBvMik7CiAJfQogCkBAIC03Myw3ICs3Myw3IEBAIHB1YmxpYyBpbnQgY29tcGFyZShmaW5hbCBSZWYgbzEsIGZpbmFsIFJlZiBvMikgewogCSAqICAgICAgICAgICAgY29sbGVjdGlvbiB0byBiZSBzb3J0ZWQKIAkgKiBAcmV0dXJuIHNvcnRlZCBjb2xsZWN0aW9uIG9mIHJlZnMKIAkgKi8KLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248UmVmPiBzb3J0KGZpbmFsIENvbGxlY3Rpb248UmVmPiByZWZzKSB7CisJcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPFJlZj4gc29ydChDb2xsZWN0aW9uPFJlZj4gcmVmcykgewogCQlmaW5hbCBMaXN0PFJlZj4gciA9IG5ldyBBcnJheUxpc3Q8PihyZWZzKTsKIAkJQ29sbGVjdGlvbnMuc29ydChyLCBJTlNUQU5DRSk7CiAJCXJldHVybiByOwpAQCAtMTAxLDcgKzEwMSw3IEBAIHB1YmxpYyBzdGF0aWMgaW50IGNvbXBhcmVUbyhSZWYgbzEsIFN0cmluZyBvMikgewogCSAqICAgICAgICAgICAgdGhlIG90aGVyIHJlZmVyZW5jZSBpbnN0YW5jZS4KIAkgKiBAcmV0dXJuIHN0YW5kYXJkIENvbXBhcmF0b3IgcmVzdWx0IG9mICZsdDsgMCwgMCwgJmd0OyAwLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGNvbXBhcmVUbyhmaW5hbCBSZWYgbzEsIGZpbmFsIFJlZiBvMikgeworCXB1YmxpYyBzdGF0aWMgaW50IGNvbXBhcmVUbyhSZWYgbzEsIFJlZiBvMikgewogCQlyZXR1cm4gbzEuZ2V0TmFtZSgpLmNvbXBhcmVUbyhvMi5nZXROYW1lKCkpOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1JlZkRhdGFiYXNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZWZEYXRhYmFzZS5qYXZhCmluZGV4IDU1N2JkYjkuLjMxNzA3ODcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1JlZkRhdGFiYXNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvUmVmRGF0YWJhc2UuamF2YQpAQCAtNDMsNiArNDMsOCBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQubGliOwogCitpbXBvcnQgc3RhdGljIGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9ycy50b0xpc3Q7CisKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CkBAIC04OSw3ICs5MSwxMCBAQCBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmVmRGF0YWJhc2UgewogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWF9TWU1CT0xJQ19SRUZfREVQVEggPSA1OwogCi0JLyoqIE1hZ2ljIHZhbHVlIGZvciB7QGxpbmsgI2dldFJlZnMoU3RyaW5nKX0gdG8gcmV0dXJuIGFsbCByZWZlcmVuY2VzLiAqLworCS8qKgorCSAqIE1hZ2ljIHZhbHVlIGZvciB7QGxpbmsgI2dldFJlZnNCeVByZWZpeChTdHJpbmcpfSB0byByZXR1cm4gYWxsCisJICogcmVmZXJlbmNlcy4KKwkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTEwgPSAiIjsvLyROT04tTkxTLTEkCiAKIAkvKioKQEAgLTMzMiw2ICszMzcsMjkgQEAgcHVibGljIFJlZiBmaXJzdEV4YWN0UmVmKFN0cmluZy4uLiByZWZzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCX0KIAogCS8qKgorCSAqIFJldHVybnMgYWxsIHJlZnMuCisJICogPHA+CisJICogVGhpcyBpbmNsdWRlcyB7QGNvZGUgSEVBRH0sIGJyYW5jaGVzIHVuZGVyIHtAY29kZSByZWYvaGVhZHMvfSwgdGFncworCSAqIHVuZGVyIHtAY29kZSByZWZzL3RhZ3MvfSwgZXRjLiBJdCBkb2VzIG5vdCBpbmNsdWRlIHBzZXVkby1yZWZzIGxpa2UKKwkgKiB7QGNvZGUgRkVUQ0hfSEVBRH07IGZvciB0aG9zZSwgc2VlIHtAbGluayAjZ2V0QWRkaXRpb25hbFJlZnN9LgorCSAqIDxwPgorCSAqIFN5bWJvbGljIHJlZmVyZW5jZXMgdG8gYSBub24tZXhpc3RlbnQgcmVmIChmb3IgZXhhbXBsZSwKKwkgKiB7QGNvZGUgSEVBRH0gcG9pbnRpbmcgdG8gYSBicmFuY2ggeWV0IHRvIGJlIGJvcm4pIGFyZSBub3QgaW5jbHVkZWQuCisJICogPHA+CisJICogQ2FsbGVycyBpbnRlcmVzdGVkIGluIG9ubHkgYSBwb3J0aW9uIG9mIHRoZSByZWYgaGllcmFyY2h5IGNhbiBjYWxsCisJICoge0BsaW5rICNnZXRSZWZzQnlQcmVmaXh9IGluc3RlYWQuCisJICoKKwkgKiBAcmV0dXJuIGltbXV0YWJsZSBsaXN0IG9mIGFsbCByZWZzLgorCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgorCSAqICAgICAgICAgICAgIHRoZSByZWZlcmVuY2Ugc3BhY2UgY2Fubm90IGJlIGFjY2Vzc2VkLgorCSAqIEBzaW5jZSA1LjAKKwkgKi8KKwlATm9uTnVsbAorCXB1YmxpYyBMaXN0PFJlZj4gZ2V0UmVmcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXJldHVybiBnZXRSZWZzQnlQcmVmaXgoQUxMKTsKKwl9CisKKwkvKioKIAkgKiBHZXQgYSBzZWN0aW9uIG9mIHRoZSByZWZlcmVuY2UgbmFtZXNwYWNlLgogCSAqCiAJICogQHBhcmFtIHByZWZpeApAQCAtMzQzLDE2ICszNzEsNzMgQEAgcHVibGljIFJlZiBmaXJzdEV4YWN0UmVmKFN0cmluZy4uLiByZWZzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCSAqICAgICAgICAgb2YgZWFjaCBrZXkuIFRoZSBtYXAgY2FuIGJlIGFuIHVuc29ydGVkIG1hcC4KIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0aGUgcmVmZXJlbmNlIHNwYWNlIGNhbm5vdCBiZSBhY2Nlc3NlZC4KKwkgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNnZXRSZWZzQnlQcmVmaXh9IGluc3RlYWQKIAkgKi8KIAlATm9uTnVsbAorCUBEZXByZWNhdGVkCiAJcHVibGljIGFic3RyYWN0IE1hcDxTdHJpbmcsIFJlZj4gZ2V0UmVmcyhTdHJpbmcgcHJlZml4KSB0aHJvd3MgSU9FeGNlcHRpb247CiAKIAkvKioKKwkgKiBSZXR1cm5zIHJlZnMgd2hvc2UgbmFtZXMgc3RhcnQgd2l0aCBhIGdpdmVuIHByZWZpeC4KKwkgKiA8cD4KKwkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB1c2VzIHtAbGluayAjZ2V0UmVmcyhTdHJpbmcpfS4gSW1wbGVtZW50b3JzIG9mCisJICoge0BsaW5rIFJlZkRhdGFiYXNlfSBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgZGlyZWN0bHkgaWYgYSBiZXR0ZXIKKwkgKiBpbXBsZW1lbnRhdGlvbiBpcyBwb3NzaWJsZS4KKwkgKgorCSAqIEBwYXJhbSBwcmVmaXggc3RyaW5nIHRoYXQgbmFtZXMgb2YgcmVmcyBzaG91bGQgc3RhcnQgd2l0aDsgbWF5IGJlCisJICogICAgICAgICAgICAgZW1wdHkgKHRvIHJldHVybiBhbGwgcmVmcykuCisJICogQHJldHVybiBpbW11dGFibGUgbGlzdCBvZiByZWZzIHdob3NlIG5hbWVzIHN0YXJ0IHdpdGgge0Bjb2RlIHByZWZpeH0uCisJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCisJICogICAgICAgICAgICAgdGhlIHJlZmVyZW5jZSBzcGFjZSBjYW5ub3QgYmUgYWNjZXNzZWQuCisJICogQHNpbmNlIDUuMAorCSAqLworCUBOb25OdWxsCisJcHVibGljIExpc3Q8UmVmPiBnZXRSZWZzQnlQcmVmaXgoU3RyaW5nIHByZWZpeCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJTWFwPFN0cmluZywgUmVmPiBjb2Fyc2VSZWZzOworCQlpbnQgbGFzdFNsYXNoID0gcHJlZml4Lmxhc3RJbmRleE9mKCcvJyk7CisJCWlmIChsYXN0U2xhc2ggPT0gLTEpIHsKKwkJCWNvYXJzZVJlZnMgPSBnZXRSZWZzKEFMTCk7CisJCX0gZWxzZSB7CisJCQljb2Fyc2VSZWZzID0gZ2V0UmVmcyhwcmVmaXguc3Vic3RyaW5nKDAsIGxhc3RTbGFzaCArIDEpKTsKKwkJfQorCisJCUxpc3Q8UmVmPiByZXN1bHQ7CisJCWlmIChsYXN0U2xhc2ggKyAxID09IHByZWZpeC5sZW5ndGgoKSkgeworCQkJcmVzdWx0ID0gY29hcnNlUmVmcy52YWx1ZXMoKS5zdHJlYW0oKS5jb2xsZWN0KHRvTGlzdCgpKTsKKwkJfSBlbHNlIHsKKwkJCVN0cmluZyBwID0gcHJlZml4LnN1YnN0cmluZyhsYXN0U2xhc2ggKyAxKTsKKwkJCXJlc3VsdCA9IGNvYXJzZVJlZnMuZW50cnlTZXQoKS5zdHJlYW0oKQorCQkJCQkuZmlsdGVyKGUgLT4gZS5nZXRLZXkoKS5zdGFydHNXaXRoKHApKQorCQkJCQkubWFwKGUgLT4gZS5nZXRWYWx1ZSgpKQorCQkJCQkuY29sbGVjdCh0b0xpc3QoKSk7CisJCX0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QocmVzdWx0KTsKKwl9CisKKwkvKioKKwkgKiBDaGVjayBpZiBhbnkgcmVmcyBleGlzdCBpbiB0aGUgcmVmIGRhdGFiYXNlLgorCSAqIDxwPgorCSAqIFRoaXMgdXNlcyB0aGUgc2FtZSBkZWZpbml0aW9uIG9mIHJlZnMgYXMge0BsaW5rICNnZXRSZWZzKCl9LiBJbgorCSAqIHBhcnRpY3VsYXIsIHJldHVybnMge0Bjb2RlIGZhbHNlfSBpbiBhIG5ldyByZXBvc2l0b3J5IHdpdGggbm8gcmVmcworCSAqIHVuZGVyIHtAY29kZSByZWZzL30gYW5kIHtAY29kZSBIRUFEfSBwb2ludGluZyB0byBhIGJyYW5jaCB5ZXQgdG8gYmUKKwkgKiBib3JuLCBhbmQgcmV0dXJucyB7QGNvZGUgdHJ1ZX0gaW4gYSByZXBvc2l0b3J5IHdpdGggbm8gcmVmcyB1bmRlcgorCSAqIHtAY29kZSByZWZzL30gYW5kIGEgZGV0YWNoZWQge0Bjb2RlIEhFQUR9IHBvaW50aW5nIHRvIGhpc3RvcnkuCisJICoKKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGRhdGFiYXNlIGhhcyByZWZzLgorCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgorCSAqICAgICAgICAgICAgIHRoZSByZWZlcmVuY2Ugc3BhY2UgY2Fubm90IGJlIGFjY2Vzc2VkLgorCSAqIEBzaW5jZSA1LjAKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBoYXNSZWZzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJcmV0dXJuICFnZXRSZWZzKCkuaXNFbXB0eSgpOworCX0KKworCS8qKgogCSAqIEdldCB0aGUgYWRkaXRpb25hbCByZWZlcmVuY2UtbGlrZSBlbnRpdGllcyBmcm9tIHRoZSByZXBvc2l0b3J5LgogCSAqIDxwPgogCSAqIFRoZSByZXN1bHQgbGlzdCBpbmNsdWRlcyBub24tcmVmIGl0ZW1zIHN1Y2ggYXMgTUVSR0VfSEVBRCBhbmQKIAkgKiBGRVRDSF9SRVNVTFQgY2FzdCB0byBiZSByZWZzLiBUaGUgbmFtZXMgb2YgdGhlc2UgcmVmcyBhcmUgbm90IHJldHVybmVkIGJ5Ci0JICogPGNvZGU+Z2V0UmVmcyhBTEwpPC9jb2RlPiBidXQgYXJlIGFjY2VwdGVkIGJ5IHtAbGluayAjZ2V0UmVmKFN0cmluZyl9CisJICogPGNvZGU+Z2V0UmVmcygpPC9jb2RlPiBidXQgYXJlIGFjY2VwdGVkIGJ5IHtAbGluayAjZ2V0UmVmKFN0cmluZyl9CiAJICogYW5kIHtAbGluayAjZXhhY3RSZWYoU3RyaW5nKX0uCiAJICoKIAkgKiBAcmV0dXJuIGEgbGlzdCBvZiBhZGRpdGlvbmFsIHJlZnMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1JlZlJlbmFtZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvUmVmUmVuYW1lLmphdmEKaW5kZXggM2QyMmJiMC4uYTA1ZGFhMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvUmVmUmVuYW1lLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvUmVmUmVuYW1lLmphdmEKQEAgLTczLDcgKzczLDcgQEAgcHVibGljIGFic3RyYWN0IGNsYXNzIFJlZlJlbmFtZSB7CiAJICogQHBhcmFtIGRzdAogCSAqICAgICAgICAgICAgb3BlcmF0aW9uIHRvIGNyZWF0ZSAob3Igb3ZlcndyaXRlKSB0aGUgZGVzdGluYXRpb24uCiAJICovCi0JcHJvdGVjdGVkIFJlZlJlbmFtZShmaW5hbCBSZWZVcGRhdGUgc3JjLCBmaW5hbCBSZWZVcGRhdGUgZHN0KSB7CisJcHJvdGVjdGVkIFJlZlJlbmFtZShSZWZVcGRhdGUgc3JjLCBSZWZVcGRhdGUgZHN0KSB7CiAJCXNvdXJjZSA9IHNyYzsKIAkJZGVzdGluYXRpb24gPSBkc3Q7CiAKQEAgLTEwNyw3ICsxMDcsNyBAQCBwdWJsaWMgUGVyc29uSWRlbnQgZ2V0UmVmTG9nSWRlbnQoKSB7CiAJICogICAgICAgICAgICBhdXRvbWF0aWNhbGx5IGRldGVybWluZWQgYmFzZWQgb24gdGhlIHJlcG9zaXRvcnkKIAkgKiAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24uCiAJICovCi0JcHVibGljIHZvaWQgc2V0UmVmTG9nSWRlbnQoZmluYWwgUGVyc29uSWRlbnQgcGkpIHsKKwlwdWJsaWMgdm9pZCBzZXRSZWZMb2dJZGVudChQZXJzb25JZGVudCBwaSkgewogCQlkZXN0aW5hdGlvbi5zZXRSZWZMb2dJZGVudChwaSk7CiAJfQogCkBAIC0xMjcsNyArMTI3LDcgQEAgcHVibGljIFN0cmluZyBnZXRSZWZMb2dNZXNzYWdlKCkgewogCSAqIEBwYXJhbSBtc2cKIAkgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIGRlc2NyaWJlIHRoaXMgY2hhbmdlLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlZkxvZ01lc3NhZ2UoZmluYWwgU3RyaW5nIG1zZykgeworCXB1YmxpYyB2b2lkIHNldFJlZkxvZ01lc3NhZ2UoU3RyaW5nIG1zZykgewogCQlpZiAobXNnID09IG51bGwpCiAJCQlkaXNhYmxlUmVmTG9nKCk7CiAJCWVsc2UKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1JlZlVwZGF0ZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvUmVmVXBkYXRlLmphdmEKaW5kZXggMDZhNzU3Ni4uNWNkNTkzZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvUmVmVXBkYXRlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvUmVmVXBkYXRlLmphdmEKQEAgLTIyNyw3ICsyMjcsNyBAQCBwdWJsaWMgc3RhdGljIGVudW0gUmVzdWx0IHsKIAkgKiBAcGFyYW0gcmVmCiAJICogICAgICAgICAgICB0aGUgcmVmZXJlbmNlIHRoYXQgd2lsbCBiZSB1cGRhdGVkIGJ5IHRoaXMgb3BlcmF0aW9uLgogCSAqLwotCXByb3RlY3RlZCBSZWZVcGRhdGUoZmluYWwgUmVmIHJlZikgeworCXByb3RlY3RlZCBSZWZVcGRhdGUoUmVmIHJlZikgewogCQl0aGlzLnJlZiA9IHJlZjsKIAkJb2xkVmFsdWUgPSByZWYuZ2V0T2JqZWN0SWQoKTsKIAkJcmVmTG9nTWVzc2FnZSA9ICIiOyAvLyROT04tTkxTLTEkCkBAIC0zNTAsNyArMzUwLDcgQEAgcHVibGljIGJvb2xlYW4gaXNEZXRhY2hpbmdTeW1ib2xpY1JlZigpIHsKIAkgKiBAcGFyYW0gaWQKIAkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUuCiAJICovCi0JcHVibGljIHZvaWQgc2V0TmV3T2JqZWN0SWQoZmluYWwgQW55T2JqZWN0SWQgaWQpIHsKKwlwdWJsaWMgdm9pZCBzZXROZXdPYmplY3RJZChBbnlPYmplY3RJZCBpZCkgewogCQluZXdWYWx1ZSA9IGlkLmNvcHkoKTsKIAl9CiAKQEAgLTM3Nyw3ICszNzcsNyBAQCBwdWJsaWMgT2JqZWN0SWQgZ2V0RXhwZWN0ZWRPbGRPYmplY3RJZCgpIHsKIAkgKiAgICAgICAgICAgIFVzZSB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWQjemVyb0lkKCl9IHRvIGluZGljYXRlCiAJICogICAgICAgICAgICBleHBlY3RhdGlvbiBvZiBhIG5vbi1leGlzdGFudCByZWYuCiAJICovCi0JcHVibGljIHZvaWQgc2V0RXhwZWN0ZWRPbGRPYmplY3RJZChmaW5hbCBBbnlPYmplY3RJZCBpZCkgeworCXB1YmxpYyB2b2lkIHNldEV4cGVjdGVkT2xkT2JqZWN0SWQoQW55T2JqZWN0SWQgaWQpIHsKIAkJZXhwVmFsdWUgPSBpZCAhPSBudWxsID8gaWQudG9PYmplY3RJZCgpIDogbnVsbDsKIAl9CiAKQEAgLTM5Niw3ICszOTYsNyBAQCBwdWJsaWMgYm9vbGVhbiBpc0ZvcmNlVXBkYXRlKCkgewogCSAqIEBwYXJhbSBiCiAJICogICAgICAgICAgICB0cnVlIGlmIHRoaXMgdXBkYXRlIHNob3VsZCBpZ25vcmUgbWVyZ2UgdGVzdHMuCiAJICovCi0JcHVibGljIHZvaWQgc2V0Rm9yY2VVcGRhdGUoZmluYWwgYm9vbGVhbiBiKSB7CisJcHVibGljIHZvaWQgc2V0Rm9yY2VVcGRhdGUoYm9vbGVhbiBiKSB7CiAJCWZvcmNlID0gYjsKIAl9CiAKQEAgLTQyMSw3ICs0MjEsNyBAQCBwdWJsaWMgUGVyc29uSWRlbnQgZ2V0UmVmTG9nSWRlbnQoKSB7CiAJICogICAgICAgICAgICBhdXRvbWF0aWNhbGx5IGRldGVybWluZWQgYmFzZWQgb24gdGhlIHJlcG9zaXRvcnkKIAkgKiAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24uCiAJICovCi0JcHVibGljIHZvaWQgc2V0UmVmTG9nSWRlbnQoZmluYWwgUGVyc29uSWRlbnQgcGkpIHsKKwlwdWJsaWMgdm9pZCBzZXRSZWZMb2dJZGVudChQZXJzb25JZGVudCBwaSkgewogCQlyZWZMb2dJZGVudCA9IHBpOwogCX0KIApAQCAtNDYxLDcgKzQ2MSw3IEBAIHByb3RlY3RlZCBib29sZWFuIGlzUmVmTG9nSW5jbHVkaW5nUmVzdWx0KCkgewogCSAqICAgICAgICAgICAgZm9yY2VkLXVwZGF0ZSkgc2hvdWxkIGJlIGFwcGVuZGVkIHRvIHRoZSB1c2VyIHN1cHBsaWVkCiAJICogICAgICAgICAgICBtZXNzYWdlLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlZkxvZ01lc3NhZ2UoZmluYWwgU3RyaW5nIG1zZywgZmluYWwgYm9vbGVhbiBhcHBlbmRTdGF0dXMpIHsKKwlwdWJsaWMgdm9pZCBzZXRSZWZMb2dNZXNzYWdlKFN0cmluZyBtc2csIGJvb2xlYW4gYXBwZW5kU3RhdHVzKSB7CiAJCWlmIChtc2cgPT0gbnVsbCAmJiAhYXBwZW5kU3RhdHVzKQogCQkJZGlzYWJsZVJlZkxvZygpOwogCQllbHNlIGlmIChtc2cgPT0gbnVsbCAmJiBhcHBlbmRTdGF0dXMpIHsKQEAgLTYxNSw3ICs2MTUsNyBAQCBwdWJsaWMgUmVzdWx0IHVwZGF0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgYW4gdW5leHBlY3RlZCBJTyBlcnJvciBvY2N1cnJlZCB3aGlsZSB3cml0aW5nIGNoYW5nZXMuCiAJICovCi0JcHVibGljIFJlc3VsdCB1cGRhdGUoZmluYWwgUmV2V2FsayB3YWxrKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyBSZXN1bHQgdXBkYXRlKFJldldhbGsgd2FsaykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJcmVxdWlyZUNhbkRvVXBkYXRlKCk7CiAJCXRyeSB7CiAJCQlyZXR1cm4gcmVzdWx0ID0gdXBkYXRlSW1wbCh3YWxrLCBuZXcgU3RvcmUoKSB7CkBAIC02NTksNyArNjU5LDcgQEAgcHVibGljIFJlc3VsdCBkZWxldGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBzdGF0dXMgb2YgdGhlIGRlbGV0ZS4KIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKi8KLQlwdWJsaWMgUmVzdWx0IGRlbGV0ZShmaW5hbCBSZXZXYWxrIHdhbGspIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIFJlc3VsdCBkZWxldGUoUmV2V2FsayB3YWxrKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBTdHJpbmcgbXlOYW1lID0gZGV0YWNoaW5nU3ltYm9saWNSZWYKIAkJCQk/IGdldFJlZigpLmdldE5hbWUoKQogCQkJCTogZ2V0UmVmKCkuZ2V0TGVhZigpLmdldE5hbWUoKTsKQEAgLTczMSw3ICs3MzEsNyBAQCBwdWJsaWMgUmVzdWx0IGxpbmsoU3RyaW5nIHRhcmdldCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJfQogCX0KIAotCXByaXZhdGUgUmVzdWx0IHVwZGF0ZUltcGwoZmluYWwgUmV2V2FsayB3YWxrLCBmaW5hbCBTdG9yZSBzdG9yZSkKKwlwcml2YXRlIFJlc3VsdCB1cGRhdGVJbXBsKFJldldhbGsgd2FsaywgU3RvcmUgc3RvcmUpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlSZXZPYmplY3QgbmV3T2JqOwogCQlSZXZPYmplY3Qgb2xkT2JqOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvUmVmV3JpdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZWZXcml0ZXIuamF2YQppbmRleCA5MGEwMzUwLi43MWVlOTYzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZWZXcml0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZWZXcml0ZXIuamF2YQpAQCAtMTE2LDcgKzExNiw3IEBAIHB1YmxpYyBSZWZXcml0ZXIoUmVmTGlzdDxSZWY+IHJlZnMpIHsKIAlwdWJsaWMgdm9pZCB3cml0ZUluZm9SZWZzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgU3RyaW5nV3JpdGVyIHcgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CiAJCWZpbmFsIGNoYXJbXSB0bXAgPSBuZXcgY2hhcltDb25zdGFudHMuT0JKRUNUX0lEX1NUUklOR19MRU5HVEhdOwotCQlmb3IgKGZpbmFsIFJlZiByIDogcmVmcykgeworCQlmb3IgKFJlZiByIDogcmVmcykgewogCQkJaWYgKENvbnN0YW50cy5IRUFELmVxdWFscyhyLmdldE5hbWUoKSkpIHsKIAkJCQkvLyBIaXN0b3JpY2FsbHkgSEVBRCBoYXMgbmV2ZXIgYmVlbiBwdWJsaXNoZWQgdGhyb3VnaAogCQkJCS8vIHRoZSBJTkZPX1JFRlMgZmlsZS4gVGhpcyBpcyBhIG1pc3Rha2UsIGJ1dCBpdHMgdGhlCkBAIC0xNjEsNyArMTYxLDcgQEAgcHVibGljIHZvaWQgd3JpdGVJbmZvUmVmcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJICovCiAJcHVibGljIHZvaWQgd3JpdGVQYWNrZWRSZWZzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJYm9vbGVhbiBwZWVsZWQgPSBmYWxzZTsKLQkJZm9yIChmaW5hbCBSZWYgciA6IHJlZnMpIHsKKwkJZm9yIChSZWYgciA6IHJlZnMpIHsKIAkJCWlmIChyLmdldFN0b3JhZ2UoKS5pc1BhY2tlZCgpICYmIHIuaXNQZWVsZWQoKSkgewogCQkJCXBlZWxlZCA9IHRydWU7CiAJCQkJYnJlYWs7CkBAIC0xNzcsNyArMTc3LDcgQEAgcHVibGljIHZvaWQgd3JpdGVQYWNrZWRSZWZzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJfQogCiAJCWZpbmFsIGNoYXJbXSB0bXAgPSBuZXcgY2hhcltDb25zdGFudHMuT0JKRUNUX0lEX1NUUklOR19MRU5HVEhdOwotCQlmb3IgKGZpbmFsIFJlZiByIDogcmVmcykgeworCQlmb3IgKFJlZiByIDogcmVmcykgewogCQkJaWYgKHIuZ2V0U3RvcmFnZSgpICE9IFJlZi5TdG9yYWdlLlBBQ0tFRCkKIAkJCQljb250aW51ZTsKIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvUmVwb3NpdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvUmVwb3NpdG9yeS5qYXZhCmluZGV4IGRiNWNhZDAuLjI5Y2MxOWMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1JlcG9zaXRvcnkuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZXBvc2l0b3J5LmphdmEKQEAgLTE2NCw3ICsxNjQsNyBAQCBwdWJsaWMgc3RhdGljIExpc3RlbmVyTGlzdCBnZXRHbG9iYWxMaXN0ZW5lckxpc3QoKSB7CiAJICogQHBhcmFtIG9wdGlvbnMKIAkgKiAgICAgICAgICAgIG9wdGlvbnMgdG8gY29uZmlndXJlIHRoZSByZXBvc2l0b3J5LgogCSAqLwotCXByb3RlY3RlZCBSZXBvc2l0b3J5KGZpbmFsIEJhc2VSZXBvc2l0b3J5QnVpbGRlciBvcHRpb25zKSB7CisJcHJvdGVjdGVkIFJlcG9zaXRvcnkoQmFzZVJlcG9zaXRvcnlCdWlsZGVyIG9wdGlvbnMpIHsKIAkJZ2l0RGlyID0gb3B0aW9ucy5nZXRHaXREaXIoKTsKIAkJZnMgPSBvcHRpb25zLmdldEZTKCk7CiAJCXdvcmtUcmVlID0gb3B0aW9ucy5nZXRXb3JrVHJlZSgpOwpAQCAtMzQ0LDcgKzM0NCw3IEBAIHB1YmxpYyBib29sZWFuIGhhc09iamVjdChBbnlPYmplY3RJZCBvYmplY3RJZCkgewogCSAqICAgICAgICAgICAgIHRoZSBvYmplY3Qgc3RvcmUgY2Fubm90IGJlIGFjY2Vzc2VkLgogCSAqLwogCUBOb25OdWxsCi0JcHVibGljIE9iamVjdExvYWRlciBvcGVuKGZpbmFsIEFueU9iamVjdElkIG9iamVjdElkKQorCXB1YmxpYyBPYmplY3RMb2FkZXIgb3BlbihBbnlPYmplY3RJZCBvYmplY3RJZCkKIAkJCXRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCXJldHVybiBnZXRPYmplY3REYXRhYmFzZSgpLm9wZW4ob2JqZWN0SWQpOwogCX0KQEAgLTM5Miw3ICszOTIsNyBAQCBwdWJsaWMgT2JqZWN0TG9hZGVyIG9wZW4oQW55T2JqZWN0SWQgb2JqZWN0SWQsIGludCB0eXBlSGludCkKIAkgKiAgICAgICAgICAgICB0byB0aGUgYmFzZSByZWYsIGFzIHRoZSBzeW1ib2xpYyByZWYgY291bGQgbm90IGJlIHJlYWQuCiAJICovCiAJQE5vbk51bGwKLQlwdWJsaWMgUmVmVXBkYXRlIHVwZGF0ZVJlZihmaW5hbCBTdHJpbmcgcmVmKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyBSZWZVcGRhdGUgdXBkYXRlUmVmKFN0cmluZyByZWYpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXJldHVybiB1cGRhdGVSZWYocmVmLCBmYWxzZSk7CiAJfQogCkBAIC00MTEsNyArNDExLDcgQEAgcHVibGljIFJlZlVwZGF0ZSB1cGRhdGVSZWYoZmluYWwgU3RyaW5nIHJlZikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkgKiAgICAgICAgICAgICB0byB0aGUgYmFzZSByZWYsIGFzIHRoZSBzeW1ib2xpYyByZWYgY291bGQgbm90IGJlIHJlYWQuCiAJICovCiAJQE5vbk51bGwKLQlwdWJsaWMgUmVmVXBkYXRlIHVwZGF0ZVJlZihmaW5hbCBTdHJpbmcgcmVmLCBmaW5hbCBib29sZWFuIGRldGFjaCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgUmVmVXBkYXRlIHVwZGF0ZVJlZihTdHJpbmcgcmVmLCBib29sZWFuIGRldGFjaCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJcmV0dXJuIGdldFJlZkRhdGFiYXNlKCkubmV3VXBkYXRlKHJlZiwgZGV0YWNoKTsKIAl9CiAKQEAgLTQyNyw3ICs0MjcsNyBAQCBwdWJsaWMgUmVmVXBkYXRlIHVwZGF0ZVJlZihmaW5hbCBTdHJpbmcgcmVmLCBmaW5hbCBib29sZWFuIGRldGFjaCkgdGhyb3dzIElPRXhjZQogCSAqICAgICAgICAgICAgIHRoZSByZW5hbWUgY291bGQgbm90IGJlIHBlcmZvcm1lZC4KIAkgKi8KIAlATm9uTnVsbAotCXB1YmxpYyBSZWZSZW5hbWUgcmVuYW1lUmVmKGZpbmFsIFN0cmluZyBmcm9tUmVmLCBmaW5hbCBTdHJpbmcgdG9SZWYpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIFJlZlJlbmFtZSByZW5hbWVSZWYoU3RyaW5nIGZyb21SZWYsIFN0cmluZyB0b1JlZikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJcmV0dXJuIGdldFJlZkRhdGFiYXNlKCkubmV3UmVuYW1lKGZyb21SZWYsIHRvUmVmKTsKIAl9CiAKQEAgLTQ4MiwxMyArNDgyLDEzIEBAIHB1YmxpYyBSZWZSZW5hbWUgcmVuYW1lUmVmKGZpbmFsIFN0cmluZyBmcm9tUmVmLCBmaW5hbCBTdHJpbmcgdG9SZWYpIHRocm93cyBJT0V4CiAJICogICAgICAgICAgICAgb24gc2VyaW91cyBlcnJvcnMKIAkgKi8KIAlATnVsbGFibGUKLQlwdWJsaWMgT2JqZWN0SWQgcmVzb2x2ZShmaW5hbCBTdHJpbmcgcmV2c3RyKQorCXB1YmxpYyBPYmplY3RJZCByZXNvbHZlKFN0cmluZyByZXZzdHIpCiAJCQl0aHJvd3MgQW1iaWd1b3VzT2JqZWN0RXhjZXB0aW9uLCBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLAogCQkJUmV2aXNpb25TeW50YXhFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJdHJ5IChSZXZXYWxrIHJ3ID0gbmV3IFJldldhbGsodGhpcykpIHsKIAkJCU9iamVjdCByZXNvbHZlZCA9IHJlc29sdmUocncsIHJldnN0cik7CiAJCQlpZiAocmVzb2x2ZWQgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQlmaW5hbCBSZWYgcmVmID0gZ2V0UmVmKChTdHJpbmcpcmVzb2x2ZWQpOworCQkJCWZpbmFsIFJlZiByZWYgPSBmaW5kUmVmKChTdHJpbmcpIHJlc29sdmVkKTsKIAkJCQlyZXR1cm4gcmVmICE9IG51bGwgPyByZWYuZ2V0TGVhZigpLmdldE9iamVjdElkKCkgOiBudWxsOwogCQkJfSBlbHNlIHsKIAkJCQlyZXR1cm4gKE9iamVjdElkKSByZXNvbHZlZDsKQEAgLTUwOSw3ICs1MDksNyBAQCBwdWJsaWMgT2JqZWN0SWQgcmVzb2x2ZShmaW5hbCBTdHJpbmcgcmV2c3RyKQogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqLwogCUBOdWxsYWJsZQotCXB1YmxpYyBTdHJpbmcgc2ltcGxpZnkoZmluYWwgU3RyaW5nIHJldnN0cikKKwlwdWJsaWMgU3RyaW5nIHNpbXBsaWZ5KFN0cmluZyByZXZzdHIpCiAJCQl0aHJvd3MgQW1iaWd1b3VzT2JqZWN0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCXRyeSAoUmV2V2FsayBydyA9IG5ldyBSZXZXYWxrKHRoaXMpKSB7CiAJCQlPYmplY3QgcmVzb2x2ZWQgPSByZXNvbHZlKHJ3LCByZXZzdHIpOwpAQCAtNTIzLDcgKzUyMyw3IEBAIHB1YmxpYyBTdHJpbmcgc2ltcGxpZnkoZmluYWwgU3RyaW5nIHJldnN0cikKIAl9CiAKIAlATnVsbGFibGUKLQlwcml2YXRlIE9iamVjdCByZXNvbHZlKGZpbmFsIFJldldhbGsgcncsIGZpbmFsIFN0cmluZyByZXZzdHIpCisJcHJpdmF0ZSBPYmplY3QgcmVzb2x2ZShSZXZXYWxrIHJ3LCBTdHJpbmcgcmV2c3RyKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJY2hhcltdIHJldkNoYXJzID0gcmV2c3RyLnRvQ2hhckFycmF5KCk7CiAJCVJldk9iamVjdCByZXYgPSBudWxsOwpAQCAtNjg4LDYgKzY4OCw4IEBAIHByaXZhdGUgT2JqZWN0IHJlc29sdmUoZmluYWwgUmV2V2FsayBydywgZmluYWwgU3RyaW5nIHJldnN0cikKIAkJCWNhc2UgJ0AnOgogCQkJCWlmIChyZXYgIT0gbnVsbCkKIAkJCQkJdGhyb3cgbmV3IFJldmlzaW9uU3ludGF4RXhjZXB0aW9uKHJldnN0cik7CisJCQkJaWYgKGkgKyAxID09IHJldkNoYXJzLmxlbmd0aCkKKwkJCQkJY29udGludWU7CiAJCQkJaWYgKGkgKyAxIDwgcmV2Q2hhcnMubGVuZ3RoICYmIHJldkNoYXJzW2kgKyAxXSAhPSAneycpCiAJCQkJCWNvbnRpbnVlOwogCQkJCWludCBtOwpAQCAtNzExLDcgKzcxMyw3IEBAIHByaXZhdGUgT2JqZWN0IHJlc29sdmUoZmluYWwgUmV2V2FsayBydywgZmluYWwgU3RyaW5nIHJldnN0cikKIAkJCQkJCQkJCS5mb3JtYXQoSkdpdFRleHQuZ2V0KCkuaW52YWxpZFJlZk5hbWUsCiAJCQkJCQkJCQkJCW5hbWUpLAogCQkJCQkJCQkJcmV2c3RyKTsKLQkJCQkJCVJlZiByZWYgPSBnZXRSZWYobmFtZSk7CisJCQkJCQlSZWYgcmVmID0gZmluZFJlZihuYW1lKTsKIAkJCQkJCW5hbWUgPSBudWxsOwogCQkJCQkJaWYgKHJlZiA9PSBudWxsKQogCQkJCQkJCXJldHVybiBudWxsOwpAQCAtNzY0LDcgKzc2Niw3IEBAIHByaXZhdGUgT2JqZWN0IHJlc29sdmUoZmluYWwgUmV2V2FsayBydywgZmluYWwgU3RyaW5nIHJldnN0cikKIAkJCQkJCQkJCS5mb3JtYXQoSkdpdFRleHQuZ2V0KCkuaW52YWxpZFJlZk5hbWUsCiAJCQkJCQkJCQkJCW5hbWUpLAogCQkJCQkJCQkJcmV2c3RyKTsKLQkJCQkJCVJlZiByZWYgPSBnZXRSZWYobmFtZSk7CisJCQkJCQlSZWYgcmVmID0gZmluZFJlZihuYW1lKTsKIAkJCQkJCW5hbWUgPSBudWxsOwogCQkJCQkJaWYgKHJlZiA9PSBudWxsKQogCQkJCQkJCXJldHVybiBudWxsOwpAQCAtODE1LDcgKzgxNyw3IEBAIHByaXZhdGUgT2JqZWN0IHJlc29sdmUoZmluYWwgUmV2V2FsayBydywgZmluYWwgU3RyaW5nIHJldnN0cikKIAkJCXRocm93IG5ldyBSZXZpc2lvblN5bnRheEV4Y2VwdGlvbigKIAkJCQkJTWVzc2FnZUZvcm1hdC5mb3JtYXQoSkdpdFRleHQuZ2V0KCkuaW52YWxpZFJlZk5hbWUsIG5hbWUpLAogCQkJCQlyZXZzdHIpOwotCQlpZiAoZ2V0UmVmKG5hbWUpICE9IG51bGwpCisJCWlmIChmaW5kUmVmKG5hbWUpICE9IG51bGwpCiAJCQlyZXR1cm4gbmFtZTsKIAkJcmV0dXJuIHJlc29sdmVTaW1wbGUobmFtZSk7CiAJfQpAQCAtODQxLDcgKzg0Myw3IEBAIHByaXZhdGUgUmV2T2JqZWN0IHBhcnNlU2ltcGxlKFJldldhbGsgcncsIFN0cmluZyByZXZzdHIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJfQogCiAJQE51bGxhYmxlCi0JcHJpdmF0ZSBPYmplY3RJZCByZXNvbHZlU2ltcGxlKGZpbmFsIFN0cmluZyByZXZzdHIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJpdmF0ZSBPYmplY3RJZCByZXNvbHZlU2ltcGxlKFN0cmluZyByZXZzdHIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWlmIChPYmplY3RJZC5pc0lkKHJldnN0cikpCiAJCQlyZXR1cm4gT2JqZWN0SWQuZnJvbVN0cmluZyhyZXZzdHIpOwogCkBAIC05MTEsNyArOTEzLDcgQEAgcHJpdmF0ZSBSZXZDb21taXQgcmVzb2x2ZVJlZmxvZyhSZXZXYWxrIHJ3LCBSZWYgcmVmLCBTdHJpbmcgdGltZSkKIAl9CiAKIAlATnVsbGFibGUKLQlwcml2YXRlIE9iamVjdElkIHJlc29sdmVBYmJyZXZpYXRpb24oZmluYWwgU3RyaW5nIHJldnN0cikgdGhyb3dzIElPRXhjZXB0aW9uLAorCXByaXZhdGUgT2JqZWN0SWQgcmVzb2x2ZUFiYnJldmlhdGlvbihTdHJpbmcgcmV2c3RyKSB0aHJvd3MgSU9FeGNlcHRpb24sCiAJCQlBbWJpZ3VvdXNPYmplY3RFeGNlcHRpb24gewogCQlBYmJyZXZpYXRlZE9iamVjdElkIGlkID0gQWJicmV2aWF0ZWRPYmplY3RJZC5mcm9tU3RyaW5nKHJldnN0cik7CiAJCXRyeSAoT2JqZWN0UmVhZGVyIHJlYWRlciA9IG5ld09iamVjdFJlYWRlcigpKSB7CkBAIC0xMDU5LDI0ICsxMDYxLDYgQEAgcHVibGljIFNldDxPYmplY3RJZD4gZ2V0QWRkaXRpb25hbEhhdmVzKCkgewogCSAqIEdldCBhIHJlZiBieSBuYW1lLgogCSAqCiAJICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSByZWYgdG8gbG9va3VwLiBNYXkgYmUgYSBzaG9ydC1oYW5kIGZvcm0sIGUuZy4KLQkgKiAgICAgICAgICAgICJtYXN0ZXIiIHdoaWNoIGlzIGlzIGF1dG9tYXRpY2FsbHkgZXhwYW5kZWQgdG8KLQkgKiAgICAgICAgICAgICJyZWZzL2hlYWRzL21hc3RlciIgaWYgInJlZnMvaGVhZHMvbWFzdGVyIiBhbHJlYWR5IGV4aXN0cy4KLQkgKiBAcmV0dXJuIHRoZSBSZWYgd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgb3Ige0Bjb2RlIG51bGx9IGlmIGl0IGRvZXMgbm90IGV4aXN0Ci0JICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCi0JICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjZXhhY3RSZWYoU3RyaW5nKX0gb3Ige0BsaW5rICNmaW5kUmVmKFN0cmluZyl9Ci0JICogaW5zdGVhZC4KLQkgKi8KLQlARGVwcmVjYXRlZAotCUBOdWxsYWJsZQotCXB1YmxpYyBSZWYgZ2V0UmVmKGZpbmFsIFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gZmluZFJlZihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgYSByZWYgYnkgbmFtZS4KLQkgKgotCSAqIEBwYXJhbSBuYW1lCiAJICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcmVmIHRvIGxvb2t1cC4gTXVzdCBub3QgYmUgYSBzaG9ydC1oYW5kCiAJICogICAgICAgICAgICBmb3JtOyBlLmcuLCAibWFzdGVyIiBpcyBub3QgYXV0b21hdGljYWxseSBleHBhbmRlZCB0bwogCSAqICAgICAgICAgICAgInJlZnMvaGVhZHMvbWFzdGVyIi4KQEAgLTEwODUsNyArMTA2OSw3IEBAIHB1YmxpYyBSZWYgZ2V0UmVmKGZpbmFsIFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCSAqIEBzaW5jZSA0LjIKIAkgKi8KIAlATnVsbGFibGUKLQlwdWJsaWMgUmVmIGV4YWN0UmVmKFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyBmaW5hbCBSZWYgZXhhY3RSZWYoU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXJldHVybiBnZXRSZWZEYXRhYmFzZSgpLmV4YWN0UmVmKG5hbWUpOwogCX0KIApAQCAtMTEwMSw3ICsxMDg1LDcgQEAgcHVibGljIFJlZiBleGFjdFJlZihTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkgKiBAc2luY2UgNC4yCiAJICovCiAJQE51bGxhYmxlCi0JcHVibGljIFJlZiBmaW5kUmVmKFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyBmaW5hbCBSZWYgZmluZFJlZihTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJcmV0dXJuIGdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmKG5hbWUpOwogCX0KIApAQCAtMTEyNiw3ICsxMTEwLDkgQEAgcHVibGljIE1hcDxTdHJpbmcsIFJlZj4gZ2V0QWxsUmVmcygpIHsKIAkgKiBAcmV0dXJuIG11dGFibGUgbWFwIG9mIGFsbCB0YWdzOyBrZXkgaXMgc2hvcnQgdGFnIG5hbWUgKCJ2MS4wIikgYW5kIHZhbHVlCiAJICogICAgICAgICBvZiB0aGUgZW50cnkgY29udGFpbnMgdGhlIHJlZiB3aXRoIHRoZSBmdWxsIHRhZyBuYW1lCiAJICogICAgICAgICAoInJlZnMvdGFncy92MS4wIikuCisJICogQGRlcHJlY2F0ZWQgdXNlIHtAY29kZSBnZXRSZWZEYXRhYmFzZSgpLmdldFJlZnNCeVByZWZpeChSX1RBR1MpfSBpbnN0ZWFkCiAJICovCisJQERlcHJlY2F0ZWQKIAlATm9uTnVsbAogCXB1YmxpYyBNYXA8U3RyaW5nLCBSZWY+IGdldFRhZ3MoKSB7CiAJCXRyeSB7CkBAIC0xMTQ5LDkgKzExMzUsMTEgQEAgcHVibGljIE1hcDxTdHJpbmcsIFJlZj4gZ2V0VGFncygpIHsKIAkgKiAgICAgICAgIG5ldyBSZWYgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc2FtZSBkYXRhIGFzIFJlZiwgYnV0IGlzUGVlbGVkKCkKIAkgKiAgICAgICAgIHdpbGwgYmUgdHJ1ZSBhbmQgZ2V0UGVlbGVkT2JqZWN0SWQgd2lsbCBjb250YWluIHRoZSBwZWVsZWQgb2JqZWN0CiAJICogICAgICAgICAob3IgbnVsbCkuCisJICogQGRlcHJlY2F0ZWQgdXNlIHtAY29kZSBnZXRSZWZEYXRhYmFzZSgpLnBlZWwocmVmKX0gaW5zdGVhZC4KIAkgKi8KKwlARGVwcmVjYXRlZAogCUBOb25OdWxsCi0JcHVibGljIFJlZiBwZWVsKGZpbmFsIFJlZiByZWYpIHsKKwlwdWJsaWMgUmVmIHBlZWwoUmVmIHJlZikgewogCQl0cnkgewogCQkJcmV0dXJuIGdldFJlZkRhdGFiYXNlKCkucGVlbChyZWYpOwogCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CkBAIC0xMjg1LDcgKzEyNzMsNyBAQCBwdWJsaWMgRGlyQ2FjaGUgbG9ja0RpckNhY2hlKCkgdGhyb3dzIE5vV29ya1RyZWVFeGNlcHRpb24sCiAJCUluZGV4Q2hhbmdlZExpc3RlbmVyIGwgPSBuZXcgSW5kZXhDaGFuZ2VkTGlzdGVuZXIoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyB2b2lkIG9uSW5kZXhDaGFuZ2VkKEluZGV4Q2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJbm90aWZ5SW5kZXhDaGFuZ2VkKCk7CisJCQkJbm90aWZ5SW5kZXhDaGFuZ2VkKHRydWUpOwogCQkJfQogCQl9OwogCQlyZXR1cm4gRGlyQ2FjaGUubG9jayh0aGlzLCBsKTsKQEAgLTEzNzgsNyArMTM2Niw3IEBAIHB1YmxpYyBSZXBvc2l0b3J5U3RhdGUgZ2V0UmVwb3NpdG9yeVN0YXRlKCkgewogCSAqIEBwYXJhbSByZWZOYW1lIGEge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9IG9iamVjdC4KIAkgKiBAcmV0dXJuIHRydWUgaWYgcmVmTmFtZSBpcyBhIHZhbGlkIHJlZiBuYW1lCiAJICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRSZWZOYW1lKGZpbmFsIFN0cmluZyByZWZOYW1lKSB7CisJcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRSZWZOYW1lKFN0cmluZyByZWZOYW1lKSB7CiAJCWZpbmFsIGludCBsZW4gPSByZWZOYW1lLmxlbmd0aCgpOwogCQlpZiAobGVuID09IDApIHsKIAkJCXJldHVybiBmYWxzZTsKQEAgLTE1ODAsMTYgKzE1NjgsMjIgQEAgcHVibGljIEZpbGUgZ2V0V29ya1RyZWUoKSB0aHJvd3MgTm9Xb3JrVHJlZUV4Y2VwdGlvbiB7CiAJfQogCiAJLyoqCi0JICogRm9yY2UgYSBzY2FuIGZvciBjaGFuZ2VkIHJlZnMuCisJICogRm9yY2UgYSBzY2FuIGZvciBjaGFuZ2VkIHJlZnMuIEZpcmVzIGFuIEluZGV4Q2hhbmdlZEV2ZW50KGZhbHNlKSBpZgorCSAqIGNoYW5nZXMgYXJlIGRldGVjdGVkLgogCSAqCiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICovCiAJcHVibGljIGFic3RyYWN0IHZvaWQgc2NhbkZvclJlcG9DaGFuZ2VzKCkgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAJLyoqCi0JICogTm90aWZ5IHRoYXQgdGhlIGluZGV4IGNoYW5nZWQKKwkgKiBOb3RpZnkgdGhhdCB0aGUgaW5kZXggY2hhbmdlZCBieSBmaXJpbmcgYW4gSW5kZXhDaGFuZ2VkRXZlbnQuCisJICoKKwkgKiBAcGFyYW0gaW50ZXJuYWwKKwkgKiAgICAgICAgICAgICAgICAgICAgIHtAY29kZSB0cnVlfSBpZiB0aGUgaW5kZXggd2FzIGNoYW5nZWQgYnkgdGhlIHNhbWUKKwkgKiAgICAgICAgICAgICAgICAgICAgIEpHaXQgcHJvY2VzcworCSAqIEBzaW5jZSA1LjAKIAkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBub3RpZnlJbmRleENoYW5nZWQoKTsKKwlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBub3RpZnlJbmRleENoYW5nZWQoYm9vbGVhbiBpbnRlcm5hbCk7CiAKIAkvKioKIAkgKiBHZXQgYSBzaG9ydGVuZWQgbW9yZSB1c2VyIGZyaWVuZGx5IHJlZiBuYW1lCkBAIC0xOTY4LDExICsxOTYyLDggQEAgcHJpdmF0ZSBTdHJpbmcgcmVhZENvbW1pdE1zZ0ZpbGUoU3RyaW5nIG1zZ0ZpbGVuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCiAJcHJpdmF0ZSB2b2lkIHdyaXRlQ29tbWl0TXNnKEZpbGUgbXNnRmlsZSwgU3RyaW5nIG1zZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJaWYgKG1zZyAhPSBudWxsKSB7Ci0JCQlGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKG1zZ0ZpbGUpOwotCQkJdHJ5IHsKKwkJCXRyeSAoRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShtc2dGaWxlKSkgewogCQkJCWZvcy53cml0ZShtc2cuZ2V0Qnl0ZXMoQ29uc3RhbnRzLkNIQVJBQ1RFUl9FTkNPRElORykpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlmb3MuY2xvc2UoKTsKIAkJCX0KIAkJfSBlbHNlIHsKIAkJCUZpbGVVdGlscy5kZWxldGUobXNnRmlsZSwgRmlsZVV0aWxzLlNLSVBfTUlTU0lORyk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZXBvc2l0b3J5Q2FjaGUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1JlcG9zaXRvcnlDYWNoZS5qYXZhCmluZGV4IGNlN2NlOGMuLjQwMDM0MmIxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZXBvc2l0b3J5Q2FjaGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZXBvc2l0b3J5Q2FjaGUuamF2YQpAQCAtODgsNyArODgsNyBAQCBwdWJsaWMgY2xhc3MgUmVwb3NpdG9yeUNhY2hlIHsKIAkgKiBAdGhyb3dzIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLlJlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHRoZXJlIGlzIG5vIHJlcG9zaXRvcnkgYXQgdGhlIGdpdmVuIGxvY2F0aW9uLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVwb3NpdG9yeSBvcGVuKGZpbmFsIEtleSBsb2NhdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uLAorCXB1YmxpYyBzdGF0aWMgUmVwb3NpdG9yeSBvcGVuKEtleSBsb2NhdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uLAogCQkJUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uIHsKIAkJcmV0dXJuIG9wZW4obG9jYXRpb24sIHRydWUpOwogCX0KQEAgLTExNSw3ICsxMTUsNyBAQCBwdWJsaWMgc3RhdGljIFJlcG9zaXRvcnkgb3BlbihmaW5hbCBLZXkgbG9jYXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiwKIAkgKiAgICAgICAgICAgICBUaGVyZSBpcyBubyByZXBvc2l0b3J5IGF0IHRoZSBnaXZlbiBsb2NhdGlvbiwgb25seSB0aHJvd24gaWYKIAkgKiAgICAgICAgICAgICB7QGNvZGUgbXVzdEV4aXN0fSBpcyB0cnVlLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVwb3NpdG9yeSBvcGVuKGZpbmFsIEtleSBsb2NhdGlvbiwgZmluYWwgYm9vbGVhbiBtdXN0RXhpc3QpCisJcHVibGljIHN0YXRpYyBSZXBvc2l0b3J5IG9wZW4oS2V5IGxvY2F0aW9uLCBib29sZWFuIG11c3RFeGlzdCkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXJldHVybiBjYWNoZS5vcGVuUmVwb3NpdG9yeShsb2NhdGlvbiwgbXVzdEV4aXN0KTsKIAl9CkBAIC0xMzUsNyArMTM1LDcgQEAgcHVibGljIHN0YXRpYyBSZXBvc2l0b3J5IG9wZW4oZmluYWwgS2V5IGxvY2F0aW9uLCBmaW5hbCBib29sZWFuIG11c3RFeGlzdCkKIAkgKiBAcGFyYW0gZGIKIAkgKiAgICAgICAgICAgIHJlcG9zaXRvcnkgdG8gcmVnaXN0ZXIuCiAJICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyKGZpbmFsIFJlcG9zaXRvcnkgZGIpIHsKKwlwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXIoUmVwb3NpdG9yeSBkYikgewogCQlpZiAoZGIuZ2V0RGlyZWN0b3J5KCkgIT0gbnVsbCkgewogCQkJRmlsZUtleSBrZXkgPSBGaWxlS2V5LmV4YWN0KGRiLmdldERpcmVjdG9yeSgpLCBkYi5nZXRGUygpKTsKIAkJCWNhY2hlLnJlZ2lzdGVyUmVwb3NpdG9yeShrZXksIGRiKTsKQEAgLTE1MSw3ICsxNTEsNyBAQCBwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXIoZmluYWwgUmVwb3NpdG9yeSBkYikgewogCSAqIEBwYXJhbSBkYgogCSAqICAgICAgICAgICAgcmVwb3NpdG9yeSB0byB1bnJlZ2lzdGVyLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjbG9zZShATm9uTnVsbCBmaW5hbCBSZXBvc2l0b3J5IGRiKSB7CisJcHVibGljIHN0YXRpYyB2b2lkIGNsb3NlKEBOb25OdWxsIFJlcG9zaXRvcnkgZGIpIHsKIAkJaWYgKGRiLmdldERpcmVjdG9yeSgpICE9IG51bGwpIHsKIAkJCUZpbGVLZXkga2V5ID0gRmlsZUtleS5leGFjdChkYi5nZXREaXJlY3RvcnkoKSwgZGIuZ2V0RlMoKSk7CiAJCQljYWNoZS51bnJlZ2lzdGVyQW5kQ2xvc2VSZXBvc2l0b3J5KGtleSk7CkBAIC0xNzAsNyArMTcwLDcgQEAgcHVibGljIHN0YXRpYyB2b2lkIGNsb3NlKEBOb25OdWxsIGZpbmFsIFJlcG9zaXRvcnkgZGIpIHsKIAkgKiAgICAgICAgICAgIHJlcG9zaXRvcnkgdG8gdW5yZWdpc3Rlci4KIAkgKiBAc2luY2UgNC4zCiAJICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHVucmVnaXN0ZXIoZmluYWwgUmVwb3NpdG9yeSBkYikgeworCXB1YmxpYyBzdGF0aWMgdm9pZCB1bnJlZ2lzdGVyKFJlcG9zaXRvcnkgZGIpIHsKIAkJaWYgKGRiLmdldERpcmVjdG9yeSgpICE9IG51bGwpIHsKIAkJCXVucmVnaXN0ZXIoRmlsZUtleS5leGFjdChkYi5nZXREaXJlY3RvcnkoKSwgZGIuZ2V0RlMoKSkpOwogCQl9CkBAIC0yODcsMTMgKzI4NywxMyBAQCBwcml2YXRlIFJlcG9zaXRvcnkgb3BlblJlcG9zaXRvcnkoZmluYWwgS2V5IGxvY2F0aW9uLAogCQlyZXR1cm4gZGI7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyUmVwb3NpdG9yeShmaW5hbCBLZXkgbG9jYXRpb24sIGZpbmFsIFJlcG9zaXRvcnkgZGIpIHsKLQkJUmVwb3NpdG9yeSBvbGREYiA9IGNhY2hlTWFwLnB1dChsb2NhdGlvbiwgZGIpOwotCQlpZiAob2xkRGIgIT0gbnVsbCkKLQkJCW9sZERiLmNsb3NlKCk7CisJcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyUmVwb3NpdG9yeShLZXkgbG9jYXRpb24sIFJlcG9zaXRvcnkgZGIpIHsKKwkJdHJ5IChSZXBvc2l0b3J5IG9sZERiID0gY2FjaGVNYXAucHV0KGxvY2F0aW9uLCBkYikpIHsKKwkJCS8vIG9sZERiIGlzIGF1dG8tY2xvc2VkCisJCX0KIAl9CiAKLQlwcml2YXRlIFJlcG9zaXRvcnkgdW5yZWdpc3RlclJlcG9zaXRvcnkoZmluYWwgS2V5IGxvY2F0aW9uKSB7CisJcHJpdmF0ZSBSZXBvc2l0b3J5IHVucmVnaXN0ZXJSZXBvc2l0b3J5KEtleSBsb2NhdGlvbikgewogCQlyZXR1cm4gY2FjaGVNYXAucmVtb3ZlKGxvY2F0aW9uKTsKIAl9CiAKQEAgLTMwMiw3ICszMDIsNyBAQCBwcml2YXRlIGJvb2xlYW4gaXNFeHBpcmVkKFJlcG9zaXRvcnkgZGIpIHsKIAkJCSYmIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIGRiLmNsb3NlZEF0LmdldCgpID4gZXhwaXJlQWZ0ZXIpOwogCX0KIAotCXByaXZhdGUgdm9pZCB1bnJlZ2lzdGVyQW5kQ2xvc2VSZXBvc2l0b3J5KGZpbmFsIEtleSBsb2NhdGlvbikgeworCXByaXZhdGUgdm9pZCB1bnJlZ2lzdGVyQW5kQ2xvc2VSZXBvc2l0b3J5KEtleSBsb2NhdGlvbikgewogCQlzeW5jaHJvbml6ZWQgKGxvY2tGb3IobG9jYXRpb24pKSB7CiAJCQlSZXBvc2l0b3J5IG9sZERiID0gdW5yZWdpc3RlclJlcG9zaXRvcnkobG9jYXRpb24pOwogCQkJaWYgKG9sZERiICE9IG51bGwpIHsKQEAgLTMyOSw3ICszMjksNyBAQCBwcml2YXRlIHZvaWQgY2xlYXJBbGwoKSB7CiAJCX0KIAl9CiAKLQlwcml2YXRlIExvY2sgbG9ja0ZvcihmaW5hbCBLZXkgbG9jYXRpb24pIHsKKwlwcml2YXRlIExvY2sgbG9ja0ZvcihLZXkgbG9jYXRpb24pIHsKIAkJcmV0dXJuIG9wZW5Mb2Nrc1sobG9jYXRpb24uaGFzaENvZGUoKSA+Pj4gMSkgJSBvcGVuTG9ja3MubGVuZ3RoXTsKIAl9CiAKQEAgLTM4Myw3ICszODMsNyBAQCBwdWJsaWMgc3RhdGljIGNsYXNzIEZpbGVLZXkgaW1wbGVtZW50cyBLZXkgewogCQkgKiBAcmV0dXJuIGEga2V5IGZvciB0aGUgZ2l2ZW4gZGlyZWN0b3J5LgogCQkgKiBAc2VlICNsZW5pZW50KEZpbGUsIEZTKQogCQkgKi8KLQkJcHVibGljIHN0YXRpYyBGaWxlS2V5IGV4YWN0KGZpbmFsIEZpbGUgZGlyZWN0b3J5LCBGUyBmcykgeworCQlwdWJsaWMgc3RhdGljIEZpbGVLZXkgZXhhY3QoRmlsZSBkaXJlY3RvcnksIEZTIGZzKSB7CiAJCQlyZXR1cm4gbmV3IEZpbGVLZXkoZGlyZWN0b3J5LCBmcyk7CiAJCX0KIApAQCAtNDA2LDcgKzQwNiw3IEBAIHB1YmxpYyBzdGF0aWMgRmlsZUtleSBleGFjdChmaW5hbCBGaWxlIGRpcmVjdG9yeSwgRlMgZnMpIHsKIAkJICogQHJldHVybiBhIGtleSBmb3IgdGhlIGdpdmVuIGRpcmVjdG9yeS4KIAkJICogQHNlZSAjZXhhY3QoRmlsZSwgRlMpCiAJCSAqLwotCQlwdWJsaWMgc3RhdGljIEZpbGVLZXkgbGVuaWVudChmaW5hbCBGaWxlIGRpcmVjdG9yeSwgRlMgZnMpIHsKKwkJcHVibGljIHN0YXRpYyBGaWxlS2V5IGxlbmllbnQoRmlsZSBkaXJlY3RvcnksIEZTIGZzKSB7CiAJCQlmaW5hbCBGaWxlIGdpdGRpciA9IHJlc29sdmUoZGlyZWN0b3J5LCBmcyk7CiAJCQlyZXR1cm4gbmV3IEZpbGVLZXkoZ2l0ZGlyICE9IG51bGwgPyBnaXRkaXIgOiBkaXJlY3RvcnksIGZzKTsKIAkJfQpAQCAtNDIxLDEyICs0MjEsMTIgQEAgcHVibGljIHN0YXRpYyBGaWxlS2V5IGxlbmllbnQoZmluYWwgRmlsZSBkaXJlY3RvcnksIEZTIGZzKSB7CiAJCSAqICAgICAgICAgICAgdGhlIGZpbGUgc3lzdGVtIGFic3RyYWN0aW9uIHdoaWNoIHdpbGwgYmUgbmVjZXNzYXJ5IHRvCiAJCSAqICAgICAgICAgICAgcGVyZm9ybSBjZXJ0YWluIGZpbGUgc3lzdGVtIG9wZXJhdGlvbnMuCiAJCSAqLwotCQlwcm90ZWN0ZWQgRmlsZUtleShmaW5hbCBGaWxlIGRpcmVjdG9yeSwgRlMgZnMpIHsKKwkJcHJvdGVjdGVkIEZpbGVLZXkoRmlsZSBkaXJlY3RvcnksIEZTIGZzKSB7CiAJCQlwYXRoID0gY2Fub25pY2FsKGRpcmVjdG9yeSk7CiAJCQl0aGlzLmZzID0gZnM7CiAJCX0KIAotCQlwcml2YXRlIHN0YXRpYyBGaWxlIGNhbm9uaWNhbChmaW5hbCBGaWxlIHBhdGgpIHsKKwkJcHJpdmF0ZSBzdGF0aWMgRmlsZSBjYW5vbmljYWwoRmlsZSBwYXRoKSB7CiAJCQl0cnkgewogCQkJCXJldHVybiBwYXRoLmdldENhbm9uaWNhbEZpbGUoKTsKIAkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKQEAgLTQ0MCw3ICs0NDAsNyBAQCBwdWJsaWMgZmluYWwgRmlsZSBnZXRGaWxlKCkgewogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyBSZXBvc2l0b3J5IG9wZW4oZmluYWwgYm9vbGVhbiBtdXN0RXhpc3QpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXB1YmxpYyBSZXBvc2l0b3J5IG9wZW4oYm9vbGVhbiBtdXN0RXhpc3QpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQlpZiAobXVzdEV4aXN0ICYmICFpc0dpdFJlcG9zaXRvcnkocGF0aCwgZnMpKQogCQkJCXRocm93IG5ldyBSZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb24ocGF0aCk7CiAJCQlyZXR1cm4gbmV3IEZpbGVSZXBvc2l0b3J5KHBhdGgpOwpAQCAtNDUyLDcgKzQ1Miw3IEBAIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIE9iamVjdCBvKSB7CisJCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewogCQkJcmV0dXJuIG8gaW5zdGFuY2VvZiBGaWxlS2V5ICYmIHBhdGguZXF1YWxzKCgoRmlsZUtleSkgbykucGF0aCk7CiAJCX0KIApAQCAtNDc2LDE5ICs0NzYsMTkgQEAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJICogICAgICAgICBpdCBkb2Vzbid0IGxvb2sgZW5vdWdoIGxpa2UgYSBHaXQgZGlyZWN0b3J5IHRvIHJlYWxseSBiZSBhCiAJCSAqICAgICAgICAgR2l0IGRpcmVjdG9yeS4KIAkJICovCi0JCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0dpdFJlcG9zaXRvcnkoZmluYWwgRmlsZSBkaXIsIEZTIGZzKSB7CisJCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0dpdFJlcG9zaXRvcnkoRmlsZSBkaXIsIEZTIGZzKSB7CiAJCQlyZXR1cm4gZnMucmVzb2x2ZShkaXIsICJvYmplY3RzIikuZXhpc3RzKCkgLy8kTk9OLU5MUy0xJAogCQkJCQkmJiBmcy5yZXNvbHZlKGRpciwgInJlZnMiKS5leGlzdHMoKSAvLyROT04tTkxTLTEkCiAJCQkJCSYmIGlzVmFsaWRIZWFkKG5ldyBGaWxlKGRpciwgQ29uc3RhbnRzLkhFQUQpKTsKIAkJfQogCi0JCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNWYWxpZEhlYWQoZmluYWwgRmlsZSBoZWFkKSB7CisJCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNWYWxpZEhlYWQoRmlsZSBoZWFkKSB7CiAJCQlmaW5hbCBTdHJpbmcgcmVmID0gcmVhZEZpcnN0TGluZShoZWFkKTsKIAkJCXJldHVybiByZWYgIT0gbnVsbAogCQkJCQkmJiAocmVmLnN0YXJ0c1dpdGgoInJlZjogcmVmcy8iKSB8fCBPYmplY3RJZC5pc0lkKHJlZikpOyAvLyROT04tTkxTLTEkCiAJCX0KIAotCQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVhZEZpcnN0TGluZShmaW5hbCBGaWxlIGhlYWQpIHsKKwkJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHJlYWRGaXJzdExpbmUoRmlsZSBoZWFkKSB7CiAJCQl0cnkgewogCQkJCWZpbmFsIGJ5dGVbXSBidWYgPSBJTy5yZWFkRnVsbHkoaGVhZCwgNDA5Nik7CiAJCQkJaW50IG4gPSBidWYubGVuZ3RoOwpAQCAtNTIxLDcgKzUyMSw3IEBAIHByaXZhdGUgc3RhdGljIFN0cmluZyByZWFkRmlyc3RMaW5lKGZpbmFsIEZpbGUgaGVhZCkgewogCQkgKiBAcmV0dXJuIHRoZSBhY3R1YWwgZGlyZWN0b3J5IGxvY2F0aW9uIGlmIGEgYmV0dGVyIG1hdGNoIGlzIGZvdW5kOwogCQkgKiAgICAgICAgIG51bGwgaWYgdGhlcmUgaXMgbm8gc3VpdGFibGUgbWF0Y2guCiAJCSAqLwotCQlwdWJsaWMgc3RhdGljIEZpbGUgcmVzb2x2ZShmaW5hbCBGaWxlIGRpcmVjdG9yeSwgRlMgZnMpIHsKKwkJcHVibGljIHN0YXRpYyBGaWxlIHJlc29sdmUoRmlsZSBkaXJlY3RvcnksIEZTIGZzKSB7CiAJCQlpZiAoaXNHaXRSZXBvc2l0b3J5KGRpcmVjdG9yeSwgZnMpKQogCQkJCXJldHVybiBkaXJlY3Rvcnk7CiAJCQlpZiAoaXNHaXRSZXBvc2l0b3J5KG5ldyBGaWxlKGRpcmVjdG9yeSwgQ29uc3RhbnRzLkRPVF9HSVQpLCBmcykpCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9UYWdCdWlsZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9UYWdCdWlsZGVyLmphdmEKaW5kZXggMzJlZjUwNC4uYmQwMzE2NSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvVGFnQnVpbGRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1RhZ0J1aWxkZXIuamF2YQpAQCAtMTY4LDcgKzE2OCw3IEBAIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKIAkgKiBAcGFyYW0gbmV3TWVzc2FnZQogCSAqICAgICAgICAgICAgdGhlIHRhZydzIG1lc3NhZ2UuCiAJICovCi0JcHVibGljIHZvaWQgc2V0TWVzc2FnZShmaW5hbCBTdHJpbmcgbmV3TWVzc2FnZSkgeworCXB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoU3RyaW5nIG5ld01lc3NhZ2UpIHsKIAkJbWVzc2FnZSA9IG5ld01lc3NhZ2U7CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9UZXh0UHJvZ3Jlc3NNb25pdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9UZXh0UHJvZ3Jlc3NNb25pdG9yLmphdmEKaW5kZXggOTM2Y2UzZC4uMmY3NTllNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvVGV4dFByb2dyZXNzTW9uaXRvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1RleHRQcm9ncmVzc01vbml0b3IuamF2YQpAQCAtNDQsNyArNDQsNyBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQubGliOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwpAQCAtNjMsNyArNjMsNyBAQCBwdWJsaWMgY2xhc3MgVGV4dFByb2dyZXNzTW9uaXRvciBleHRlbmRzIEJhdGNoaW5nUHJvZ3Jlc3NNb25pdG9yIHsKIAkgKiBJbml0aWFsaXplIGEgbmV3IHByb2dyZXNzIG1vbml0b3IuCiAJICovCiAJcHVibGljIFRleHRQcm9ncmVzc01vbml0b3IoKSB7Ci0JCXRoaXMobmV3IFByaW50V3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoU3lzdGVtLmVyciwgVVRGXzgpKSk7CisJCXRoaXMobmV3IFByaW50V3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoU3lzdGVtLmVyciwgQ0hBUlNFVCkpKTsKIAl9CiAKIAkvKioKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1VzZXJDb25maWcuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1VzZXJDb25maWcuamF2YQppbmRleCAxYTNjNmY2Li5iZmI1ZTJmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Vc2VyQ29uZmlnLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvVXNlckNvbmZpZy5qYXZhCkBAIC03MSw3ICs3MSw3IEBAIHB1YmxpYyBjbGFzcyBVc2VyQ29uZmlnIHsKIAogCXByaXZhdGUgYm9vbGVhbiBpc0NvbW1pdHRlckVtYWlsSW1wbGljaXQ7CiAKLQlwcml2YXRlIFVzZXJDb25maWcoZmluYWwgQ29uZmlnIHJjKSB7CisJcHJpdmF0ZSBVc2VyQ29uZmlnKENvbmZpZyByYykgewogCQlhdXRob3JOYW1lID0gZ2V0TmFtZUludGVybmFsKHJjLCBDb25zdGFudHMuR0lUX0FVVEhPUl9OQU1FX0tFWSk7CiAJCWlmIChhdXRob3JOYW1lID09IG51bGwpIHsKIAkJCWF1dGhvck5hbWUgPSBnZXREZWZhdWx0VXNlck5hbWUoKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvTWVyZ2VTdHJhdGVneS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9NZXJnZVN0cmF0ZWd5LmphdmEKaW5kZXggNTIwZWE2ZS4uOThhNzA2YyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9NZXJnZVN0cmF0ZWd5LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9NZXJnZVN0cmF0ZWd5LmphdmEKQEAgLTEwMCw3ICsxMDAsNyBAQCBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTWVyZ2VTdHJhdGVneSB7CiAJICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCiAJICogICAgICAgICAgICAgYSBzdHJhdGVneSBieSB0aGUgc2FtZSBuYW1lIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXIoZmluYWwgTWVyZ2VTdHJhdGVneSBpbXApIHsKKwlwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXIoTWVyZ2VTdHJhdGVneSBpbXApIHsKIAkJcmVnaXN0ZXIoaW1wLmdldE5hbWUoKSwgaW1wKTsKIAl9CiAKQEAgLTEyOSw3ICsxMjksNyBAQCBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIHJlZ2lzdGVyKGZpbmFsIFN0cmluZyBuYW1lLAogCSAqICAgICAgICAgICAgbmFtZSBvZiB0aGUgc3RyYXRlZ3kgdG8gbG9jYXRlLgogCSAqIEByZXR1cm4gdGhlIHN0cmF0ZWd5IGluc3RhbmNlOyBudWxsIGlmIG5vIHN0cmF0ZWd5IG1hdGNoZXMgdGhlIG5hbWUuCiAJICovCi0JcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgTWVyZ2VTdHJhdGVneSBnZXQoZmluYWwgU3RyaW5nIG5hbWUpIHsKKwlwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBNZXJnZVN0cmF0ZWd5IGdldChTdHJpbmcgbmFtZSkgewogCQlyZXR1cm4gU1RSQVRFR0lFUy5nZXQobmFtZSk7CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL01lcmdlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9NZXJnZXIuamF2YQppbmRleCBjZDE5ZDY5Li4yNWViMWFmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL01lcmdlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvTWVyZ2VyLmphdmEKQEAgLTExMyw3ICsxMTMsNyBAQCBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTWVyZ2VyIHsKIAkgKiBAcGFyYW0gbG9jYWwKIAkgKiAgICAgICAgICAgIHRoZSByZXBvc2l0b3J5IHRoaXMgbWVyZ2VyIHdpbGwgcmVhZCBhbmQgd3JpdGUgZGF0YSBvbi4KIAkgKi8KLQlwcm90ZWN0ZWQgTWVyZ2VyKGZpbmFsIFJlcG9zaXRvcnkgbG9jYWwpIHsKKwlwcm90ZWN0ZWQgTWVyZ2VyKFJlcG9zaXRvcnkgbG9jYWwpIHsKIAkJaWYgKGxvY2FsID09IG51bGwpIHsKIAkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbihKR2l0VGV4dC5nZXQoKS5yZXBvc2l0b3J5SXNSZXF1aXJlZCk7CiAJCX0KQEAgLTIxNSw3ICsyMTUsNyBAQCBwdWJsaWMgdm9pZCBzZXRPYmplY3RJbnNlcnRlcihPYmplY3RJbnNlcnRlciBvaSkgewogCSAqICAgICAgICAgICAgIG9uZSBvciBtb3JlIHNvdXJjZXMgY291bGQgbm90IGJlIHJlYWQsIG9yIG91dHB1dHMgY291bGQgbm90CiAJICogICAgICAgICAgICAgYmUgd3JpdHRlbiB0byB0aGUgUmVwb3NpdG9yeS4KIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiBtZXJnZShmaW5hbCBBbnlPYmplY3RJZC4uLiB0aXBzKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyBib29sZWFuIG1lcmdlKEFueU9iamVjdElkLi4uIHRpcHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXJldHVybiBtZXJnZSh0cnVlLCB0aXBzKTsKIAl9CiAKQEAgLTI0Myw3ICsyNDMsNyBAQCBwdWJsaWMgYm9vbGVhbiBtZXJnZShmaW5hbCBBbnlPYmplY3RJZC4uLiB0aXBzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCSAqICAgICAgICAgICAgIG9uZSBvciBtb3JlIHNvdXJjZXMgY291bGQgbm90IGJlIHJlYWQsIG9yIG91dHB1dHMgY291bGQgbm90CiAJICogICAgICAgICAgICAgYmUgd3JpdHRlbiB0byB0aGUgUmVwb3NpdG9yeS4KIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiBtZXJnZShmaW5hbCBib29sZWFuIGZsdXNoLCBmaW5hbCBBbnlPYmplY3RJZC4uLiB0aXBzKQorCXB1YmxpYyBib29sZWFuIG1lcmdlKGJvb2xlYW4gZmx1c2gsIEFueU9iamVjdElkLi4uIHRpcHMpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlzb3VyY2VPYmplY3RzID0gbmV3IFJldk9iamVjdFt0aXBzLmxlbmd0aF07CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgdGlwcy5sZW5ndGg7IGkrKykKQEAgLTMyOCw3ICszMjgsNyBAQCBwcm90ZWN0ZWQgUmV2Q29tbWl0IGdldEJhc2VDb21taXQoUmV2Q29tbWl0IGEsIFJldkNvbW1pdCBiKQogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHRoZSB0cmVlIG9iamVjdCBpcyBub3QgZm91bmQgb3IgY2Fubm90IGJlIHJlYWQuCiAJICovCi0JcHJvdGVjdGVkIEFic3RyYWN0VHJlZUl0ZXJhdG9yIG9wZW5UcmVlKGZpbmFsIEFueU9iamVjdElkIHRyZWVJZCkKKwlwcm90ZWN0ZWQgQWJzdHJhY3RUcmVlSXRlcmF0b3Igb3BlblRyZWUoQW55T2JqZWN0SWQgdHJlZUlkKQogCQkJdGhyb3dzIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJcmV0dXJuIG5ldyBDYW5vbmljYWxUcmVlUGFyc2VyKG51bGwsIHJlYWRlciwgdHJlZUlkKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL1Jlc29sdmVNZXJnZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvUmVzb2x2ZU1lcmdlci5qYXZhCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggNmY3YTcwMi4uZGE2YTNkYQotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL1Jlc29sdmVNZXJnZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL1Jlc29sdmVNZXJnZXIuamF2YQpAQCAtNTE2LDYxICs1MTYsNiBAQCBwcml2YXRlIERpckNhY2hlRW50cnkga2VlcChEaXJDYWNoZUVudHJ5IGUpIHsKIAkgKiBAcGFyYW0gaWdub3JlQ29uZmxpY3RzCiAJICogICAgICAgICAgICBzZWUKIAkgKiAgICAgICAgICAgIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0Lm1lcmdlLlJlc29sdmVNZXJnZXIjbWVyZ2VUcmVlcyhBYnN0cmFjdFRyZWVJdGVyYXRvciwgUmV2VHJlZSwgUmV2VHJlZSwgYm9vbGVhbil9Ci0JICogQHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIG1lcmdlIHdpbGwgZmFpbCBiZWNhdXNlIHRoZSBpbmRleCBlbnRyeQotCSAqICAgICAgICAgZGlkbid0IG1hdGNoIG91cnMgb3IgdGhlIHdvcmtpbmctZGlyIGZpbGUgd2FzIGRpcnR5IGFuZCBhCi0JICogICAgICAgICBjb25mbGljdCBvY2N1cnJlZAotCSAqIEB0aHJvd3Mgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuTWlzc2luZ09iamVjdEV4Y2VwdGlvbgotCSAqIEB0aHJvd3Mgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbgotCSAqIEB0aHJvd3Mgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuQ29ycnVwdE9iamVjdEV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgotCSAqIEBzaW5jZSAzLjUKLQkgKi8KLQlARGVwcmVjYXRlZAotCXByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NFbnRyeShDYW5vbmljYWxUcmVlUGFyc2VyIGJhc2UsCi0JCQlDYW5vbmljYWxUcmVlUGFyc2VyIG91cnMsIENhbm9uaWNhbFRyZWVQYXJzZXIgdGhlaXJzLAotCQkJRGlyQ2FjaGVCdWlsZEl0ZXJhdG9yIGluZGV4LCBXb3JraW5nVHJlZUl0ZXJhdG9yIHdvcmssCi0JCQlib29sZWFuIGlnbm9yZUNvbmZsaWN0cykgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCi0JCQlJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLCBDb3JydXB0T2JqZWN0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBwcm9jZXNzRW50cnkoYmFzZSwgb3VycywgdGhlaXJzLCBpbmRleCwgd29yaywgaWdub3JlQ29uZmxpY3RzLAotCQkJCW51bGwpOwotCX0KLQotCS8qKgotCSAqIFByb2Nlc3NlcyBvbmUgcGF0aCBhbmQgdHJpZXMgdG8gbWVyZ2UgdGFraW5nIGdpdCBhdHRyaWJ1dGVzIGluIGFjY291bnQuCi0JICogVGhpcyBtZXRob2Qgd2lsbCBkbyBhbGwgdHJpdmlhbCAobm90IGNvbnRlbnQpIG1lcmdlcyBhbmQgd2lsbCBhbHNvIGRldGVjdAotCSAqIGlmIGEgbWVyZ2Ugd2lsbCBmYWlsLiBUaGUgbWVyZ2Ugd2lsbCBmYWlsIHdoZW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgaXMKLQkgKiB0cnVlCi0JICogPHVsPgotCSAqIDxsaT50aGUgaW5kZXggZW50cnkgZG9lcyBub3QgbWF0Y2ggdGhlIGVudHJ5IGluIG91cnMuIFdoZW4gbWVyZ2luZyBvbmUKLQkgKiBicmFuY2ggaW50byB0aGUgY3VycmVudCBIRUFELCBvdXJzIHdpbGwgcG9pbnQgdG8gSEVBRCBhbmQgdGhlaXJzIHdpbGwKLQkgKiBwb2ludCB0byB0aGUgb3RoZXIgYnJhbmNoLiBJdCBpcyBhc3N1bWVkIHRoYXQgdGhlIGluZGV4IG1hdGNoZXMgdGhlIEhFQUQKLQkgKiBiZWNhdXNlIGl0IHdpbGwgb25seSBub3QgbWF0Y2ggSEVBRCBpZiBpdCB3YXMgcG9wdWxhdGVkIGJlZm9yZSB0aGUgbWVyZ2UKLQkgKiBvcGVyYXRpb24uIEJ1dCB0aGUgbWVyZ2UgY29tbWl0IHNob3VsZCBub3QgYWNjaWRlbnRhbGx5IGNvbnRhaW4KLQkgKiBtb2RpZmljYXRpb25zIGRvbmUgYmVmb3JlIHRoZSBtZXJnZS4gQ2hlY2sgdGhlIDxhIGhyZWY9Ci0JICogImh0dHA6Ly93d3cua2VybmVsLm9yZy9wdWIvc29mdHdhcmUvc2NtL2dpdC9kb2NzL2dpdC1yZWFkLXRyZWUuaHRtbCNfM193YXlfbWVyZ2UiCi0JICogPmdpdCByZWFkLXRyZWU8L2E+IGRvY3VtZW50YXRpb24gZm9yIGZ1cnRoZXIgZXhwbGFuYXRpb25zLjwvbGk+Ci0JICogPGxpPkEgY29uZmxpY3Qgd2FzIGRldGVjdGVkIGFuZCB0aGUgd29ya2luZy10cmVlIGZpbGUgaXMgZGlydHkuIFdoZW4gYQotCSAqIGNvbmZsaWN0IGlzIGRldGVjdGVkIHRoZSBjb250ZW50LW1lcmdlIGFsZ29yaXRobSB3aWxsIHRyeSB0byB3cml0ZSBhCi0JICogbWVyZ2VkIHZlcnNpb24gaW50byB0aGUgd29ya2luZy10cmVlLiBJZiB0aGUgZmlsZSBpcyBkaXJ0eSB3ZSB3b3VsZAotCSAqIG92ZXJyaWRlIHVuc2F2ZWQgZGF0YS48L2xpPgotCSAqIDwvdWw+Ci0JICoKLQkgKiBAcGFyYW0gYmFzZQotCSAqICAgICAgICAgICAgdGhlIGNvbW1vbiBiYXNlIGZvciBvdXJzIGFuZCB0aGVpcnMKLQkgKiBAcGFyYW0gb3VycwotCSAqICAgICAgICAgICAgdGhlIG91cnMgc2lkZSBvZiB0aGUgbWVyZ2UuIFdoZW4gbWVyZ2luZyBhIGJyYW5jaCBpbnRvIHRoZQotCSAqICAgICAgICAgICAgSEVBRCBvdXJzIHdpbGwgcG9pbnQgdG8gSEVBRAotCSAqIEBwYXJhbSB0aGVpcnMKLQkgKiAgICAgICAgICAgIHRoZSB0aGVpcnMgc2lkZSBvZiB0aGUgbWVyZ2UuIFdoZW4gbWVyZ2luZyBhIGJyYW5jaCBpbnRvIHRoZQotCSAqICAgICAgICAgICAgY3VycmVudCBIRUFEIHRoZWlycyB3aWxsIHBvaW50IHRvIHRoZSBicmFuY2ggd2hpY2ggaXMgbWVyZ2VkCi0JICogICAgICAgICAgICBpbnRvIEhFQUQuCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICB0aGUgaW5kZXggZW50cnkKLQkgKiBAcGFyYW0gd29yawotCSAqICAgICAgICAgICAgdGhlIGZpbGUgaW4gdGhlIHdvcmtpbmcgdHJlZQotCSAqIEBwYXJhbSBpZ25vcmVDb25mbGljdHMKLQkgKiAgICAgICAgICAgIHNlZQotCSAqICAgICAgICAgICAge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQubWVyZ2UuUmVzb2x2ZU1lcmdlciNtZXJnZVRyZWVzKEFic3RyYWN0VHJlZUl0ZXJhdG9yLCBSZXZUcmVlLCBSZXZUcmVlLCBib29sZWFuKX0KIAkgKiBAcGFyYW0gYXR0cmlidXRlcwogCSAqICAgICAgICAgICAgdGhlIGF0dHJpYnV0ZXMgZGVmaW5lZCBmb3IgdGhpcyBlbnRyeQogCSAqIEByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSBtZXJnZSB3aWxsIGZhaWwgYmVjYXVzZSB0aGUgaW5kZXggZW50cnkKQEAgLTEwNTAsMTEgKzk5NSwxMSBAQCBwcml2YXRlIFJhd1RleHQgZ2V0UmF3VGV4dChPYmplY3RJZCBpZCwKIAkJcmV0dXJuIFJhd1RleHQubG9hZChsb2FkZXIsIHRocmVzaG9sZCk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBub25UcmVlKGZpbmFsIGludCBtb2RlKSB7CisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBub25UcmVlKGludCBtb2RlKSB7CiAJCXJldHVybiBtb2RlICE9IDAgJiYgIUZpbGVNb2RlLlRSRUUuZXF1YWxzKG1vZGUpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNHaXRMaW5rKGZpbmFsIGludCBtb2RlKSB7CisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0dpdExpbmsoaW50IG1vZGUpIHsKIAkJcmV0dXJuIEZpbGVNb2RlLkdJVExJTksuZXF1YWxzKG1vZGUpOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9TdHJhdGVneU9uZVNpZGVkLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL1N0cmF0ZWd5T25lU2lkZWQuamF2YQppbmRleCA5Nzk2ODVjLi42ZTJlMmFhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL1N0cmF0ZWd5T25lU2lkZWQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL1N0cmF0ZWd5T25lU2lkZWQuamF2YQpAQCAtNzEsNyArNzEsNyBAQCBwdWJsaWMgY2xhc3MgU3RyYXRlZ3lPbmVTaWRlZCBleHRlbmRzIE1lcmdlU3RyYXRlZ3kgewogCSAqIEBwYXJhbSBpbmRleAogCSAqICAgICAgICAgICAgdGhlIHBvc2l0aW9uIG9mIHRoZSBpbnB1dCB0cmVlIHRvIGFjY2VwdCBhcyB0aGUgcmVzdWx0LgogCSAqLwotCXByb3RlY3RlZCBTdHJhdGVneU9uZVNpZGVkKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBpbnQgaW5kZXgpIHsKKwlwcm90ZWN0ZWQgU3RyYXRlZ3lPbmVTaWRlZChTdHJpbmcgbmFtZSwgaW50IGluZGV4KSB7CiAJCXN0cmF0ZWd5TmFtZSA9IG5hbWU7CiAJCXRyZWVJbmRleCA9IGluZGV4OwogCX0KQEAgLTg0LDMxICs4NCwzMSBAQCBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBNZXJnZXIgbmV3TWVyZ2VyKGZpbmFsIFJlcG9zaXRvcnkgZGIpIHsKKwlwdWJsaWMgTWVyZ2VyIG5ld01lcmdlcihSZXBvc2l0b3J5IGRiKSB7CiAJCXJldHVybiBuZXcgT25lU2lkZShkYiwgdHJlZUluZGV4KTsKIAl9CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBNZXJnZXIgbmV3TWVyZ2VyKGZpbmFsIFJlcG9zaXRvcnkgZGIsIGJvb2xlYW4gaW5Db3JlKSB7CisJcHVibGljIE1lcmdlciBuZXdNZXJnZXIoUmVwb3NpdG9yeSBkYiwgYm9vbGVhbiBpbkNvcmUpIHsKIAkJcmV0dXJuIG5ldyBPbmVTaWRlKGRiLCB0cmVlSW5kZXgpOwogCX0KIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIE1lcmdlciBuZXdNZXJnZXIoZmluYWwgT2JqZWN0SW5zZXJ0ZXIgaW5zZXJ0ZXIsIGZpbmFsIENvbmZpZyBjb25maWcpIHsKKwlwdWJsaWMgTWVyZ2VyIG5ld01lcmdlcihPYmplY3RJbnNlcnRlciBpbnNlcnRlciwgQ29uZmlnIGNvbmZpZykgewogCQlyZXR1cm4gbmV3IE9uZVNpZGUoaW5zZXJ0ZXIsIHRyZWVJbmRleCk7CiAJfQogCiAJc3RhdGljIGNsYXNzIE9uZVNpZGUgZXh0ZW5kcyBNZXJnZXIgewogCQlwcml2YXRlIGZpbmFsIGludCB0cmVlSW5kZXg7CiAKLQkJcHJvdGVjdGVkIE9uZVNpZGUoZmluYWwgUmVwb3NpdG9yeSBsb2NhbCwgZmluYWwgaW50IGluZGV4KSB7CisJCXByb3RlY3RlZCBPbmVTaWRlKFJlcG9zaXRvcnkgbG9jYWwsIGludCBpbmRleCkgewogCQkJc3VwZXIobG9jYWwpOwogCQkJdHJlZUluZGV4ID0gaW5kZXg7CiAJCX0KIAotCQlwcm90ZWN0ZWQgT25lU2lkZShmaW5hbCBPYmplY3RJbnNlcnRlciBpbnNlcnRlciwgZmluYWwgaW50IGluZGV4KSB7CisJCXByb3RlY3RlZCBPbmVTaWRlKE9iamVjdEluc2VydGVyIGluc2VydGVyLCBpbnQgaW5kZXgpIHsKIAkJCXN1cGVyKGluc2VydGVyKTsKIAkJCXRyZWVJbmRleCA9IGluZGV4OwogCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL1N0cmF0ZWd5U2ltcGxlVHdvV2F5SW5Db3JlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL1N0cmF0ZWd5U2ltcGxlVHdvV2F5SW5Db3JlLmphdmEKaW5kZXggNTczOWQ1OC4uNGFlYWNmNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9TdHJhdGVneVNpbXBsZVR3b1dheUluQ29yZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvU3RyYXRlZ3lTaW1wbGVUd29XYXlJbkNvcmUuamF2YQpAQCAtODQsNyArODQsNyBAQCBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBUaHJlZVdheU1lcmdlciBuZXdNZXJnZXIoZmluYWwgUmVwb3NpdG9yeSBkYikgeworCXB1YmxpYyBUaHJlZVdheU1lcmdlciBuZXdNZXJnZXIoUmVwb3NpdG9yeSBkYikgewogCQlyZXR1cm4gbmV3IEluQ29yZU1lcmdlcihkYik7CiAJfQogCkBAIC0xMTYsMTMgKzExNiwxMyBAQCBwcml2YXRlIHN0YXRpYyBjbGFzcyBJbkNvcmVNZXJnZXIgZXh0ZW5kcyBUaHJlZVdheU1lcmdlciB7CiAKIAkJcHJpdmF0ZSBPYmplY3RJZCByZXN1bHRUcmVlOwogCi0JCUluQ29yZU1lcmdlcihmaW5hbCBSZXBvc2l0b3J5IGxvY2FsKSB7CisJCUluQ29yZU1lcmdlcihSZXBvc2l0b3J5IGxvY2FsKSB7CiAJCQlzdXBlcihsb2NhbCk7CiAJCQl0dyA9IG5ldyBOYW1lQ29uZmxpY3RUcmVlV2Fsayhsb2NhbCwgcmVhZGVyKTsKIAkJCWNhY2hlID0gRGlyQ2FjaGUubmV3SW5Db3JlKCk7CiAJCX0KIAotCQlJbkNvcmVNZXJnZXIoZmluYWwgT2JqZWN0SW5zZXJ0ZXIgaW5zZXJ0ZXIpIHsKKwkJSW5Db3JlTWVyZ2VyKE9iamVjdEluc2VydGVyIGluc2VydGVyKSB7CiAJCQlzdXBlcihpbnNlcnRlcik7CiAJCQl0dyA9IG5ldyBOYW1lQ29uZmxpY3RUcmVlV2FsayhudWxsLCByZWFkZXIpOwogCQkJY2FjaGUgPSBEaXJDYWNoZS5uZXdJbkNvcmUoKTsKQEAgLTE4MiwxMSArMTgyLDExIEBAIGVsc2UgaWYgKG1vZGVCID09IG1vZGVUICYmIHR3LmlkRXF1YWwoVF9CQVNFLCBUX1RIRUlSUykpCiAJCQl9CiAJCX0KIAotCQlwcml2YXRlIHN0YXRpYyBib29sZWFuIG5vblRyZWUoZmluYWwgaW50IG1vZGUpIHsKKwkJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBub25UcmVlKGludCBtb2RlKSB7CiAJCQlyZXR1cm4gbW9kZSAhPSAwICYmICFGaWxlTW9kZS5UUkVFLmVxdWFscyhtb2RlKTsKIAkJfQogCi0JCXByaXZhdGUgdm9pZCBhZGQoZmluYWwgaW50IHRyZWUsIGZpbmFsIGludCBzdGFnZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJcHJpdmF0ZSB2b2lkIGFkZChpbnQgdHJlZSwgaW50IHN0YWdlKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJZmluYWwgQWJzdHJhY3RUcmVlSXRlcmF0b3IgaSA9IGdldFRyZWUodHJlZSk7CiAJCQlpZiAoaSAhPSBudWxsKSB7CiAJCQkJaWYgKEZpbGVNb2RlLlRSRUUuZXF1YWxzKHR3LmdldFJhd01vZGUodHJlZSkpKSB7CkBAIC0yMDMsNyArMjAzLDcgQEAgcHJpdmF0ZSB2b2lkIGFkZChmaW5hbCBpbnQgdHJlZSwgZmluYWwgaW50IHN0YWdlKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJfQogCQl9CiAKLQkJcHJpdmF0ZSBBYnN0cmFjdFRyZWVJdGVyYXRvciBnZXRUcmVlKGZpbmFsIGludCB0cmVlKSB7CisJCXByaXZhdGUgQWJzdHJhY3RUcmVlSXRlcmF0b3IgZ2V0VHJlZShpbnQgdHJlZSkgewogCQkJcmV0dXJuIHR3LmdldFRyZWUodHJlZSwgQWJzdHJhY3RUcmVlSXRlcmF0b3IuY2xhc3MpOwogCQl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvVGhyZWVXYXlNZXJnZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvVGhyZWVXYXlNZXJnZXIuamF2YQppbmRleCAzZjI4ODIwLi4yZmMwZjRmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL1RocmVlV2F5TWVyZ2VyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9UaHJlZVdheU1lcmdlci5qYXZhCkBAIC03MSw3ICs3MSw3IEBAIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUaHJlZVdheU1lcmdlciBleHRlbmRzIE1lcmdlciB7CiAJICogQHBhcmFtIGxvY2FsCiAJICogICAgICAgICAgICB0aGUgcmVwb3NpdG9yeSB0aGlzIG1lcmdlciB3aWxsIHJlYWQgYW5kIHdyaXRlIGRhdGEgb24uCiAJICovCi0JcHJvdGVjdGVkIFRocmVlV2F5TWVyZ2VyKGZpbmFsIFJlcG9zaXRvcnkgbG9jYWwpIHsKKwlwcm90ZWN0ZWQgVGhyZWVXYXlNZXJnZXIoUmVwb3NpdG9yeSBsb2NhbCkgewogCQlzdXBlcihsb2NhbCk7CiAJfQogCkBAIC04Myw3ICs4Myw3IEBAIHByb3RlY3RlZCBUaHJlZVdheU1lcmdlcihmaW5hbCBSZXBvc2l0b3J5IGxvY2FsKSB7CiAJICogQHBhcmFtIGluQ29yZQogCSAqICAgICAgICAgICAgcGVyZm9ybSB0aGUgbWVyZ2UgaW4gY29yZSB3aXRoIG5vIHdvcmtpbmcgZm9sZGVyIGludm9sdmVkCiAJICovCi0JcHJvdGVjdGVkIFRocmVlV2F5TWVyZ2VyKGZpbmFsIFJlcG9zaXRvcnkgbG9jYWwsIGJvb2xlYW4gaW5Db3JlKSB7CisJcHJvdGVjdGVkIFRocmVlV2F5TWVyZ2VyKFJlcG9zaXRvcnkgbG9jYWwsIGJvb2xlYW4gaW5Db3JlKSB7CiAJCXRoaXMobG9jYWwpOwogCX0KIApAQCAtMTEyLDcgKzExMiw3IEBAIHByb3RlY3RlZCBUaHJlZVdheU1lcmdlcihPYmplY3RJbnNlcnRlciBpbnNlcnRlcikgewogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHRoZSBvYmplY3QgY291bGQgbm90IGJlIHJlYWQuCiAJICovCi0JcHVibGljIHZvaWQgc2V0QmFzZShmaW5hbCBBbnlPYmplY3RJZCBpZCkgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCisJcHVibGljIHZvaWQgc2V0QmFzZShBbnlPYmplY3RJZCBpZCkgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCiAJCQlJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCWlmIChpZCAhPSBudWxsKSB7CiAJCQliYXNlVHJlZSA9IHdhbGsucGFyc2VUcmVlKGlkKTsKQEAgLTEyMyw3ICsxMjMsNyBAQCBwdWJsaWMgdm9pZCBzZXRCYXNlKGZpbmFsIEFueU9iamVjdElkIGlkKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gbWVyZ2UoZmluYWwgQW55T2JqZWN0SWQuLi4gdGlwcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgYm9vbGVhbiBtZXJnZShBbnlPYmplY3RJZC4uLiB0aXBzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlpZiAodGlwcy5sZW5ndGggIT0gMikKIAkJCXJldHVybiBmYWxzZTsKIAkJcmV0dXJuIHN1cGVyLm1lcmdlKHRpcHMpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9ub3Rlcy9MZWFmQnVja2V0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L25vdGVzL0xlYWZCdWNrZXQuamF2YQppbmRleCAxYmU1MjUxLi42NzIzYjYzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L25vdGVzL0xlYWZCdWNrZXQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L25vdGVzL0xlYWZCdWNrZXQuamF2YQpAQCAtMjE4LDcgKzIxOCw3IEBAIHByaXZhdGUgVHJlZUZvcm1hdHRlciBidWlsZCgpIHsKIAkJcmV0dXJuIGZtdDsKIAl9CiAKLQlwcml2YXRlIGludCB0cmVlU2l6ZShmaW5hbCBpbnQgbmFtZUxlbikgeworCXByaXZhdGUgaW50IHRyZWVTaXplKGludCBuYW1lTGVuKSB7CiAJCWludCBzeiA9IGNudCAqIFRyZWVGb3JtYXR0ZXIuZW50cnlTaXplKFJFR1VMQVJfRklMRSwgbmFtZUxlbik7CiAJCWZvciAoTm9uTm90ZUVudHJ5IGUgPSBub25Ob3RlczsgZSAhPSBudWxsOyBlID0gZS5uZXh0KQogCQkJc3ogKz0gZS50cmVlRW50cnlTaXplKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL0JpbmFyeUh1bmsuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvQmluYXJ5SHVuay5qYXZhCmluZGV4IDA3OWQ2ZjYuLjk1MzkxZWMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvQmluYXJ5SHVuay5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvQmluYXJ5SHVuay5qYXZhCkBAIC04MCw3ICs4MCw3IEBAIHB1YmxpYyBzdGF0aWMgZW51bSBUeXBlIHsKIAkvKiogSW5mbGF0ZWQgbGVuZ3RoIG9mIHRoZSBkYXRhLiAqLwogCXByaXZhdGUgaW50IGxlbmd0aDsKIAotCUJpbmFyeUh1bmsoZmluYWwgRmlsZUhlYWRlciBmaCwgZmluYWwgaW50IG9mZnNldCkgeworCUJpbmFyeUh1bmsoRmlsZUhlYWRlciBmaCwgaW50IG9mZnNldCkgewogCQlmaWxlID0gZmg7CiAJCXN0YXJ0T2Zmc2V0ID0gb2Zmc2V0OwogCX0KQEAgLTEzOSw3ICsxMzksNyBAQCBwdWJsaWMgaW50IGdldFNpemUoKSB7CiAJCXJldHVybiBsZW5ndGg7CiAJfQogCi0JaW50IHBhcnNlSHVuayhpbnQgcHRyLCBmaW5hbCBpbnQgZW5kKSB7CisJaW50IHBhcnNlSHVuayhpbnQgcHRyLCBpbnQgZW5kKSB7CiAJCWZpbmFsIGJ5dGVbXSBidWYgPSBmaWxlLmJ1ZjsKIAogCQlpZiAobWF0Y2goYnVmLCBwdHIsIExJVEVSQUwpID49IDApIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvQ29tYmluZWRGaWxlSGVhZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL0NvbWJpbmVkRmlsZUhlYWRlci5qYXZhCmluZGV4IDFhZmI1M2QuLjM0MDc1NzggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvQ29tYmluZWRGaWxlSGVhZGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9Db21iaW5lZEZpbGVIZWFkZXIuamF2YQpAQCAtNjksNyArNjksNyBAQCBwdWJsaWMgY2xhc3MgQ29tYmluZWRGaWxlSGVhZGVyIGV4dGVuZHMgRmlsZUhlYWRlciB7CiAKIAlwcml2YXRlIEZpbGVNb2RlW10gb2xkTW9kZXM7CiAKLQlDb21iaW5lZEZpbGVIZWFkZXIoZmluYWwgYnl0ZVtdIGIsIGZpbmFsIGludCBvZmZzZXQpIHsKKwlDb21iaW5lZEZpbGVIZWFkZXIoYnl0ZVtdIGIsIGludCBvZmZzZXQpIHsKIAkJc3VwZXIoYiwgb2Zmc2V0KTsKIAl9CiAKQEAgLTEwOCw3ICsxMDgsNyBAQCBwdWJsaWMgRmlsZU1vZGUgZ2V0T2xkTW9kZSgpIHsKIAkgKiAgICAgICAgICAgIHRoZSBhbmNlc3RvciB0byBnZXQgdGhlIG1vZGUgb2YKIAkgKiBAcmV0dXJuIHRoZSBtb2RlIG9mIHRoZSByZXF1ZXN0ZWQgYW5jZXN0b3IuCiAJICovCi0JcHVibGljIEZpbGVNb2RlIGdldE9sZE1vZGUoZmluYWwgaW50IG50aFBhcmVudCkgeworCXB1YmxpYyBGaWxlTW9kZSBnZXRPbGRNb2RlKGludCBudGhQYXJlbnQpIHsKIAkJcmV0dXJuIG9sZE1vZGVzW250aFBhcmVudF07CiAJfQogCkBAIC0xMzAsMTMgKzEzMCwxMyBAQCBwdWJsaWMgQWJicmV2aWF0ZWRPYmplY3RJZCBnZXRPbGRJZCgpIHsKIAkgKiAgICAgICAgICAgIHRoZSBhbmNlc3RvciB0byBnZXQgdGhlIG9iamVjdCBpZCBvZgogCSAqIEByZXR1cm4gdGhlIGlkIG9mIHRoZSByZXF1ZXN0ZWQgYW5jZXN0b3IuCiAJICovCi0JcHVibGljIEFiYnJldmlhdGVkT2JqZWN0SWQgZ2V0T2xkSWQoZmluYWwgaW50IG50aFBhcmVudCkgeworCXB1YmxpYyBBYmJyZXZpYXRlZE9iamVjdElkIGdldE9sZElkKGludCBudGhQYXJlbnQpIHsKIAkJcmV0dXJuIG9sZElkc1tudGhQYXJlbnRdOwogCX0KIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRTY3JpcHRUZXh0KGZpbmFsIENoYXJzZXQgb2NzLCBmaW5hbCBDaGFyc2V0IG5jcykgeworCXB1YmxpYyBTdHJpbmcgZ2V0U2NyaXB0VGV4dChDaGFyc2V0IG9jcywgQ2hhcnNldCBuY3MpIHsKIAkJZmluYWwgQ2hhcnNldFtdIGNzID0gbmV3IENoYXJzZXRbZ2V0UGFyZW50Q291bnQoKSArIDFdOwogCQlBcnJheXMuZmlsbChjcywgb2NzKTsKIAkJY3NbZ2V0UGFyZW50Q291bnQoKV0gPSBuY3M7CkBAIC0xNDksMTIgKzE0OSwxMiBAQCBwdWJsaWMgU3RyaW5nIGdldFNjcmlwdFRleHQoZmluYWwgQ2hhcnNldCBvY3MsIGZpbmFsIENoYXJzZXQgbmNzKSB7CiAJICogQ29udmVydCB0aGUgcGF0Y2ggc2NyaXB0IGZvciB0aGlzIGZpbGUgaW50byBhIHN0cmluZy4KIAkgKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFNjcmlwdFRleHQoZmluYWwgQ2hhcnNldFtdIGNoYXJzZXRHdWVzcykgeworCXB1YmxpYyBTdHJpbmcgZ2V0U2NyaXB0VGV4dChDaGFyc2V0W10gY2hhcnNldEd1ZXNzKSB7CiAJCXJldHVybiBzdXBlci5nZXRTY3JpcHRUZXh0KGNoYXJzZXRHdWVzcyk7CiAJfQogCiAJQE92ZXJyaWRlCi0JaW50IHBhcnNlR2l0SGVhZGVycyhpbnQgcHRyLCBmaW5hbCBpbnQgZW5kKSB7CisJaW50IHBhcnNlR2l0SGVhZGVycyhpbnQgcHRyLCBpbnQgZW5kKSB7CiAJCXdoaWxlIChwdHIgPCBlbmQpIHsKIAkJCWZpbmFsIGludCBlb2wgPSBuZXh0TEYoYnVmLCBwdHIpOwogCQkJaWYgKGlzSHVua0hkcihidWYsIHB0ciwgZW5kKSA+PSAxKSB7CkBAIC0xOTEsNyArMTkxLDcgQEAgaW50IHBhcnNlR2l0SGVhZGVycyhpbnQgcHRyLCBmaW5hbCBpbnQgZW5kKSB7CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHBhcnNlSW5kZXhMaW5lKGludCBwdHIsIGZpbmFsIGludCBlb2wpIHsKKwlwcm90ZWN0ZWQgdm9pZCBwYXJzZUluZGV4TGluZShpbnQgcHRyLCBpbnQgZW9sKSB7CiAJCS8vICJpbmRleCAkYXNoYTEsJGJzaGExLi4kY3NoYTEiCiAJCS8vCiAJCWZpbmFsIExpc3Q8QWJicmV2aWF0ZWRPYmplY3RJZD4gaWRzID0gbmV3IEFycmF5TGlzdDw+KCk7CkBAIC0yMTMsMTggKzIxMywxOCBAQCBwcm90ZWN0ZWQgdm9pZCBwYXJzZUluZGV4TGluZShpbnQgcHRyLCBmaW5hbCBpbnQgZW9sKSB7CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHBhcnNlTmV3RmlsZU1vZGUoZmluYWwgaW50IHB0ciwgZmluYWwgaW50IGVvbCkgeworCXByb3RlY3RlZCB2b2lkIHBhcnNlTmV3RmlsZU1vZGUoaW50IHB0ciwgaW50IGVvbCkgewogCQlmb3IgKGludCBpID0gMDsgaSA8IG9sZE1vZGVzLmxlbmd0aDsgaSsrKQogCQkJb2xkTW9kZXNbaV0gPSBGaWxlTW9kZS5NSVNTSU5HOwogCQlzdXBlci5wYXJzZU5ld0ZpbGVNb2RlKHB0ciwgZW9sKTsKIAl9CiAKIAlAT3ZlcnJpZGUKLQlIdW5rSGVhZGVyIG5ld0h1bmtIZWFkZXIoZmluYWwgaW50IG9mZnNldCkgeworCUh1bmtIZWFkZXIgbmV3SHVua0hlYWRlcihpbnQgb2Zmc2V0KSB7CiAJCXJldHVybiBuZXcgQ29tYmluZWRIdW5rSGVhZGVyKHRoaXMsIG9mZnNldCk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHBhcnNlTW9kZUxpbmUoaW50IHB0ciwgZmluYWwgaW50IGVvbCkgeworCXByaXZhdGUgdm9pZCBwYXJzZU1vZGVMaW5lKGludCBwdHIsIGludCBlb2wpIHsKIAkJLy8gIm1vZGUgJGFtb2RlLCRibW9kZS4uJGNtb2RlIgogCQkvLwogCQlpbnQgbiA9IDA7CkBAIC0yNDAsNyArMjQwLDcgQEAgcHJpdmF0ZSB2b2lkIHBhcnNlTW9kZUxpbmUoaW50IHB0ciwgZmluYWwgaW50IGVvbCkgewogCQluZXdNb2RlID0gcGFyc2VGaWxlTW9kZShkb3QyICsgMSwgZW9sKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgcGFyc2VEZWxldGVkRmlsZU1vZGUoaW50IHB0ciwgZmluYWwgaW50IGVvbCkgeworCXByaXZhdGUgdm9pZCBwYXJzZURlbGV0ZWRGaWxlTW9kZShpbnQgcHRyLCBpbnQgZW9sKSB7CiAJCS8vICJkZWxldGVkIGZpbGUgbW9kZSAkYW1vZGUsJGJtb2RlIgogCQkvLwogCQljaGFuZ2VUeXBlID0gQ2hhbmdlVHlwZS5ERUxFVEU7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL0NvbWJpbmVkSHVua0hlYWRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9Db21iaW5lZEh1bmtIZWFkZXIuamF2YQppbmRleCBiYmY4MDIzLi5kMjc4MTMyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL0NvbWJpbmVkSHVua0hlYWRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvQ29tYmluZWRIdW5rSGVhZGVyLmphdmEKQEAgLTY0LDcgKzY0LDcgQEAgcHJpdmF0ZSBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQ29tYmluZWRPbGRJbWFnZSBleHRlbmRzIE9sZEltYWdlIHsKIAogCXByaXZhdGUgQ29tYmluZWRPbGRJbWFnZVtdIG9sZDsKIAotCUNvbWJpbmVkSHVua0hlYWRlcihmaW5hbCBDb21iaW5lZEZpbGVIZWFkZXIgZmgsIGZpbmFsIGludCBvZmZzZXQpIHsKKwlDb21iaW5lZEh1bmtIZWFkZXIoQ29tYmluZWRGaWxlSGVhZGVyIGZoLCBpbnQgb2Zmc2V0KSB7CiAJCXN1cGVyKGZoLCBvZmZzZXQsIG51bGwpOwogCQlvbGQgPSBuZXcgQ29tYmluZWRPbGRJbWFnZVtmaC5nZXRQYXJlbnRDb3VudCgpXTsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBvbGQubGVuZ3RoOyBpKyspIHsKQEAgLTk3LDcgKzk3LDcgQEAgcHVibGljIE9sZEltYWdlIGdldE9sZEltYWdlKCkgewogCSAqICAgICAgICAgICAgdGhlIGFuY2VzdG9yIHRvIGdldCB0aGUgb2xkIGltYWdlIGRhdGEgb2YKIAkgKiBAcmV0dXJuIGltYWdlIGRhdGEgb2YgdGhlIHJlcXVlc3RlZCBhbmNlc3Rvci4KIAkgKi8KLQlwdWJsaWMgT2xkSW1hZ2UgZ2V0T2xkSW1hZ2UoZmluYWwgaW50IG50aFBhcmVudCkgeworCXB1YmxpYyBPbGRJbWFnZSBnZXRPbGRJbWFnZShpbnQgbnRoUGFyZW50KSB7CiAJCXJldHVybiBvbGRbbnRoUGFyZW50XTsKIAl9CiAKQEAgLTEyNSwxMSArMTI1LDExIEBAIHZvaWQgcGFyc2VIZWFkZXIoKSB7CiAJfQogCiAJQE92ZXJyaWRlCi0JaW50IHBhcnNlQm9keShmaW5hbCBQYXRjaCBzY3JpcHQsIGZpbmFsIGludCBlbmQpIHsKKwlpbnQgcGFyc2VCb2R5KFBhdGNoIHNjcmlwdCwgaW50IGVuZCkgewogCQlmaW5hbCBieXRlW10gYnVmID0gZmlsZS5idWY7CiAJCWludCBjID0gbmV4dExGKGJ1Ziwgc3RhcnRPZmZzZXQpOwogCi0JCWZvciAoZmluYWwgQ29tYmluZWRPbGRJbWFnZSBvIDogb2xkKSB7CisJCWZvciAoQ29tYmluZWRPbGRJbWFnZSBvIDogb2xkKSB7CiAJCQlvLm5EZWxldGVkID0gMDsKIAkJCW8ubkFkZGVkID0gMDsKIAkJCW8ubkNvbnRleHQgPSAwOwpAQCAtMjA3LDcgKzIwNyw3IEBAIGludCBwYXJzZUJvZHkoZmluYWwgUGF0Y2ggc2NyaXB0LCBmaW5hbCBpbnQgZW5kKSB7CiAJfQogCiAJQE92ZXJyaWRlCi0Jdm9pZCBleHRyYWN0RmlsZUxpbmVzKGZpbmFsIE91dHB1dFN0cmVhbVtdIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwl2b2lkIGV4dHJhY3RGaWxlTGluZXMoT3V0cHV0U3RyZWFtW10gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBieXRlW10gYnVmID0gZmlsZS5idWY7CiAJCWludCBwdHIgPSBzdGFydE9mZnNldDsKIAkJaW50IGVvbCA9IG5leHRMRihidWYsIHB0cik7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL0ZpbGVIZWFkZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvRmlsZUhlYWRlci5qYXZhCmluZGV4IDVjZmJiYjIuLmQwYTUyMTYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvRmlsZUhlYWRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvRmlsZUhlYWRlci5qYXZhCkBAIC0xNDYsNyArMTQ2LDcgQEAgcHVibGljIHN0YXRpYyBlbnVtIFBhdGNoVHlwZSB7CiAJICogQHBhcmFtIHR5cGUKIAkgKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIHBhdGNoIHVzZWQgdG8gbW9kaWZ5IHRoaXMgZmlsZQogCSAqLwotCXB1YmxpYyBGaWxlSGVhZGVyKGZpbmFsIGJ5dGVbXSBoZWFkZXJMaW5lcywgRWRpdExpc3QgZWRpdHMsIFBhdGNoVHlwZSB0eXBlKSB7CisJcHVibGljIEZpbGVIZWFkZXIoYnl0ZVtdIGhlYWRlckxpbmVzLCBFZGl0TGlzdCBlZGl0cywgUGF0Y2hUeXBlIHR5cGUpIHsKIAkJdGhpcyhoZWFkZXJMaW5lcywgMCk7CiAJCWVuZE9mZnNldCA9IGhlYWRlckxpbmVzLmxlbmd0aDsKIAkJaW50IHB0ciA9IHBhcnNlR2l0RmlsZU5hbWUoUGF0Y2guRElGRl9HSVQubGVuZ3RoLCBoZWFkZXJMaW5lcy5sZW5ndGgpOwpAQCAtMTU1LDcgKzE1NSw3IEBAIHB1YmxpYyBGaWxlSGVhZGVyKGZpbmFsIGJ5dGVbXSBoZWFkZXJMaW5lcywgRWRpdExpc3QgZWRpdHMsIFBhdGNoVHlwZSB0eXBlKSB7CiAJCWFkZEh1bmsobmV3IEh1bmtIZWFkZXIodGhpcywgZWRpdHMpKTsKIAl9CiAKLQlGaWxlSGVhZGVyKGZpbmFsIGJ5dGVbXSBiLCBmaW5hbCBpbnQgb2Zmc2V0KSB7CisJRmlsZUhlYWRlcihieXRlW10gYiwgaW50IG9mZnNldCkgewogCQlidWYgPSBiOwogCQlzdGFydE9mZnNldCA9IG9mZnNldDsKIAkJY2hhbmdlVHlwZSA9IENoYW5nZVR5cGUuTU9ESUZZOyAvLyB1bmxlc3Mgb3RoZXJ3aXNlIGRlc2lnbmF0ZWQKQEAgLTI2NCwxMiArMjY0LDEyIEBAIFN0cmluZyBnZXRTY3JpcHRUZXh0KENoYXJzZXRbXSBjaGFyc2V0R3Vlc3MpIHsKIAogCQlmaW5hbCBTdHJpbmdbXSBmaWxlcyA9IGV4dHJhY3RGaWxlTGluZXMoY2hhcnNldEd1ZXNzKTsKIAkJZmluYWwgaW50W10gb2Zmc2V0cyA9IG5ldyBpbnRbZmlsZXMubGVuZ3RoXTsKLQkJZm9yIChmaW5hbCBIdW5rSGVhZGVyIGggOiBnZXRIdW5rcygpKQorCQlmb3IgKEh1bmtIZWFkZXIgaCA6IGdldEh1bmtzKCkpCiAJCQloLmV4dHJhY3RGaWxlTGluZXMociwgZmlsZXMsIG9mZnNldHMpOwogCQlyZXR1cm4gci50b1N0cmluZygpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gdHJ5U2ltcGxlQ29udmVyc2lvbihmaW5hbCBDaGFyc2V0W10gY2hhcnNldEd1ZXNzKSB7CisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiB0cnlTaW1wbGVDb252ZXJzaW9uKENoYXJzZXRbXSBjaGFyc2V0R3Vlc3MpIHsKIAkJaWYgKGNoYXJzZXRHdWVzcyA9PSBudWxsKQogCQkJcmV0dXJuIHRydWU7CiAJCWZvciAoaW50IGkgPSAxOyBpIDwgY2hhcnNldEd1ZXNzLmxlbmd0aDsgaSsrKSB7CkBAIC0yNzksMTIgKzI3OSwxMiBAQCBwcml2YXRlIHN0YXRpYyBib29sZWFuIHRyeVNpbXBsZUNvbnZlcnNpb24oZmluYWwgQ2hhcnNldFtdIGNoYXJzZXRHdWVzcykgewogCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKLQlwcml2YXRlIFN0cmluZ1tdIGV4dHJhY3RGaWxlTGluZXMoZmluYWwgQ2hhcnNldFtdIGNzR3Vlc3MpIHsKKwlwcml2YXRlIFN0cmluZ1tdIGV4dHJhY3RGaWxlTGluZXMoQ2hhcnNldFtdIGNzR3Vlc3MpIHsKIAkJZmluYWwgVGVtcG9yYXJ5QnVmZmVyW10gdG1wID0gbmV3IFRlbXBvcmFyeUJ1ZmZlcltnZXRQYXJlbnRDb3VudCgpICsgMV07CiAJCXRyeSB7CiAJCQlmb3IgKGludCBpID0gMDsgaSA8IHRtcC5sZW5ndGg7IGkrKykKIAkJCQl0bXBbaV0gPSBuZXcgVGVtcG9yYXJ5QnVmZmVyLkhlYXAoSW50ZWdlci5NQVhfVkFMVUUpOwotCQkJZm9yIChmaW5hbCBIdW5rSGVhZGVyIGggOiBnZXRIdW5rcygpKQorCQkJZm9yIChIdW5rSGVhZGVyIGggOiBnZXRIdW5rcygpKQogCQkJCWguZXh0cmFjdEZpbGVMaW5lcyh0bXApOwogCiAJCQlmaW5hbCBTdHJpbmdbXSByID0gbmV3IFN0cmluZ1t0bXAubGVuZ3RoXTsKQEAgLTMyOSw3ICszMjksNyBAQCBwdWJsaWMgTGlzdDw/IGV4dGVuZHMgSHVua0hlYWRlcj4gZ2V0SHVua3MoKSB7CiAJCXJldHVybiBodW5rczsKIAl9CiAKLQl2b2lkIGFkZEh1bmsoZmluYWwgSHVua0hlYWRlciBoKSB7CisJdm9pZCBhZGRIdW5rKEh1bmtIZWFkZXIgaCkgewogCQlpZiAoaC5nZXRGaWxlSGVhZGVyKCkgIT0gdGhpcykKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oSkdpdFRleHQuZ2V0KCkuaHVua0JlbG9uZ3NUb0Fub3RoZXJGaWxlKTsKIAkJaWYgKGh1bmtzID09IG51bGwpCkBAIC0zMzcsNyArMzM3LDcgQEAgdm9pZCBhZGRIdW5rKGZpbmFsIEh1bmtIZWFkZXIgaCkgewogCQlodW5rcy5hZGQoaCk7CiAJfQogCi0JSHVua0hlYWRlciBuZXdIdW5rSGVhZGVyKGZpbmFsIGludCBvZmZzZXQpIHsKKwlIdW5rSGVhZGVyIG5ld0h1bmtIZWFkZXIoaW50IG9mZnNldCkgewogCQlyZXR1cm4gbmV3IEh1bmtIZWFkZXIodGhpcywgb2Zmc2V0KTsKIAl9CiAKQEAgLTM3MCw3ICszNzAsNyBAQCBwdWJsaWMgQmluYXJ5SHVuayBnZXRSZXZlcnNlQmluYXJ5SHVuaygpIHsKIAkgKi8KIAlwdWJsaWMgRWRpdExpc3QgdG9FZGl0TGlzdCgpIHsKIAkJZmluYWwgRWRpdExpc3QgciA9IG5ldyBFZGl0TGlzdCgpOwotCQlmb3IgKGZpbmFsIEh1bmtIZWFkZXIgaHVuayA6IGh1bmtzKQorCQlmb3IgKEh1bmtIZWFkZXIgaHVuayA6IGh1bmtzKQogCQkJci5hZGRBbGwoaHVuay50b0VkaXRMaXN0KCkpOwogCQlyZXR1cm4gcjsKIAl9CkBAIC0zODQsNyArMzg0LDcgQEAgcHVibGljIEVkaXRMaXN0IHRvRWRpdExpc3QoKSB7CiAJICogICAgICAgICAgICBvbmUgcGFzdCB0aGUgbGFzdCBwb3NpdGlvbiB0byBwYXJzZS4KIAkgKiBAcmV0dXJuIGZpcnN0IGNoYXJhY3RlciBhZnRlciB0aGUgTEYgYXQgdGhlIGVuZCBvZiB0aGUgbGluZTsgLTEgb24gZXJyb3IuCiAJICovCi0JaW50IHBhcnNlR2l0RmlsZU5hbWUoaW50IHB0ciwgZmluYWwgaW50IGVuZCkgeworCWludCBwYXJzZUdpdEZpbGVOYW1lKGludCBwdHIsIGludCBlbmQpIHsKIAkJZmluYWwgaW50IGVvbCA9IG5leHRMRihidWYsIHB0cik7CiAJCWZpbmFsIGludCBib2wgPSBwdHI7CiAJCWlmIChlb2wgPj0gZW5kKSB7CkBAIC00NDQsNyArNDQ0LDcgQEAgaW50IHBhcnNlR2l0RmlsZU5hbWUoaW50IHB0ciwgZmluYWwgaW50IGVuZCkgewogCQlyZXR1cm4gZW9sOwogCX0KIAotCWludCBwYXJzZUdpdEhlYWRlcnMoaW50IHB0ciwgZmluYWwgaW50IGVuZCkgeworCWludCBwYXJzZUdpdEhlYWRlcnMoaW50IHB0ciwgaW50IGVuZCkgewogCQl3aGlsZSAocHRyIDwgZW5kKSB7CiAJCQlmaW5hbCBpbnQgZW9sID0gbmV4dExGKGJ1ZiwgcHRyKTsKIAkJCWlmIChpc0h1bmtIZHIoYnVmLCBwdHIsIGVvbCkgPj0gMSkgewpAQCAtNTE0LDI1ICs1MTQsMjUgQEAgaW50IHBhcnNlR2l0SGVhZGVycyhpbnQgcHRyLCBmaW5hbCBpbnQgZW5kKSB7CiAJCXJldHVybiBwdHI7CiAJfQogCi0Jdm9pZCBwYXJzZU9sZE5hbWUoaW50IHB0ciwgZmluYWwgaW50IGVvbCkgeworCXZvaWQgcGFyc2VPbGROYW1lKGludCBwdHIsIGludCBlb2wpIHsKIAkJb2xkUGF0aCA9IHAxKHBhcnNlTmFtZShvbGRQYXRoLCBwdHIgKyBPTERfTkFNRS5sZW5ndGgsIGVvbCkpOwogCQlpZiAob2xkUGF0aCA9PSBERVZfTlVMTCkKIAkJCWNoYW5nZVR5cGUgPSBDaGFuZ2VUeXBlLkFERDsKIAl9CiAKLQl2b2lkIHBhcnNlTmV3TmFtZShpbnQgcHRyLCBmaW5hbCBpbnQgZW9sKSB7CisJdm9pZCBwYXJzZU5ld05hbWUoaW50IHB0ciwgaW50IGVvbCkgewogCQluZXdQYXRoID0gcDEocGFyc2VOYW1lKG5ld1BhdGgsIHB0ciArIE5FV19OQU1FLmxlbmd0aCwgZW9sKSk7CiAJCWlmIChuZXdQYXRoID09IERFVl9OVUxMKQogCQkJY2hhbmdlVHlwZSA9IENoYW5nZVR5cGUuREVMRVRFOwogCX0KIAotCXZvaWQgcGFyc2VOZXdGaWxlTW9kZShpbnQgcHRyLCBmaW5hbCBpbnQgZW9sKSB7CisJdm9pZCBwYXJzZU5ld0ZpbGVNb2RlKGludCBwdHIsIGludCBlb2wpIHsKIAkJb2xkTW9kZSA9IEZpbGVNb2RlLk1JU1NJTkc7CiAJCW5ld01vZGUgPSBwYXJzZUZpbGVNb2RlKHB0ciArIE5FV19GSUxFX01PREUubGVuZ3RoLCBlb2wpOwogCQljaGFuZ2VUeXBlID0gQ2hhbmdlVHlwZS5BREQ7CiAJfQogCi0JaW50IHBhcnNlVHJhZGl0aW9uYWxIZWFkZXJzKGludCBwdHIsIGZpbmFsIGludCBlbmQpIHsKKwlpbnQgcGFyc2VUcmFkaXRpb25hbEhlYWRlcnMoaW50IHB0ciwgaW50IGVuZCkgewogCQl3aGlsZSAocHRyIDwgZW5kKSB7CiAJCQlmaW5hbCBpbnQgZW9sID0gbmV4dExGKGJ1ZiwgcHRyKTsKIAkJCWlmIChpc0h1bmtIZHIoYnVmLCBwdHIsIGVvbCkgPj0gMSkgewpAQCAtNTU1LDcgKzU1NSw3IEBAIGludCBwYXJzZVRyYWRpdGlvbmFsSGVhZGVycyhpbnQgcHRyLCBmaW5hbCBpbnQgZW5kKSB7CiAJCXJldHVybiBwdHI7CiAJfQogCi0JcHJpdmF0ZSBTdHJpbmcgcGFyc2VOYW1lKGZpbmFsIFN0cmluZyBleHBlY3QsIGludCBwdHIsIGZpbmFsIGludCBlbmQpIHsKKwlwcml2YXRlIFN0cmluZyBwYXJzZU5hbWUoU3RyaW5nIGV4cGVjdCwgaW50IHB0ciwgaW50IGVuZCkgewogCQlpZiAocHRyID09IGVuZCkKIAkJCXJldHVybiBleHBlY3Q7CiAKQEAgLTU4NSw3ICs1ODUsNyBAQCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcDEoZmluYWwgU3RyaW5nIHIpIHsKIAkJcmV0dXJuIHMgPiAwID8gci5zdWJzdHJpbmcocyArIDEpIDogcjsKIAl9CiAKLQlGaWxlTW9kZSBwYXJzZUZpbGVNb2RlKGludCBwdHIsIGZpbmFsIGludCBlbmQpIHsKKwlGaWxlTW9kZSBwYXJzZUZpbGVNb2RlKGludCBwdHIsIGludCBlbmQpIHsKIAkJaW50IHRtcCA9IDA7CiAJCXdoaWxlIChwdHIgPCBlbmQgLSAxKSB7CiAJCQl0bXAgPDw9IDM7CkBAIC01OTQsNyArNTk0LDcgQEAgRmlsZU1vZGUgcGFyc2VGaWxlTW9kZShpbnQgcHRyLCBmaW5hbCBpbnQgZW5kKSB7CiAJCXJldHVybiBGaWxlTW9kZS5mcm9tQml0cyh0bXApOwogCX0KIAotCXZvaWQgcGFyc2VJbmRleExpbmUoaW50IHB0ciwgZmluYWwgaW50IGVuZCkgeworCXZvaWQgcGFyc2VJbmRleExpbmUoaW50IHB0ciwgaW50IGVuZCkgewogCQkvLyAiaW5kZXggJGFzaGExLi4kYnNoYTFbICRtb2RlXSIgd2hlcmUgJGFzaGExIGFuZCAkYnNoYTEKIAkJLy8gY2FuIGJlIHVuaXF1ZSBhYmJyZXZpYXRpb25zCiAJCS8vCkBAIC02MzYsNyArNjM2LDcgQEAgcHJpdmF0ZSBib29sZWFuIGVxKGludCBhUHRyLCBpbnQgYUVuZCwgaW50IGJQdHIsIGludCBiRW5kKSB7CiAJICogICAgICAgICBmb3IgYSAzIHdheS1tZXJnZSByZXR1cm5zIDMuIElmIHRoaXMgaXMgbm90IGEgaHVuayBoZWFkZXIsIDAgaXMKIAkgKiAgICAgICAgIHJldHVybmVkIGluc3RlYWQuCiAJICovCi0Jc3RhdGljIGludCBpc0h1bmtIZHIoZmluYWwgYnl0ZVtdIGJ1ZiwgZmluYWwgaW50IHN0YXJ0LCBmaW5hbCBpbnQgZW5kKSB7CisJc3RhdGljIGludCBpc0h1bmtIZHIoYnl0ZVtdIGJ1ZiwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAJCWludCBwdHIgPSBzdGFydDsKIAkJd2hpbGUgKHB0ciA8IGVuZCAmJiBidWZbcHRyXSA9PSAnQCcpCiAJCQlwdHIrKzsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvSHVua0hlYWRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9IdW5rSGVhZGVyLmphdmEKaW5kZXggZDAyMmQ0Ny4uMTQ1ODk0NSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9IdW5rSGVhZGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9IdW5rSGVhZGVyLmphdmEKQEAgLTEyMCw3ICsxMjAsNyBAQCBwdWJsaWMgaW50IGdldExpbmVzQWRkZWQoKSB7CiAKIAlwcml2YXRlIEVkaXRMaXN0IGVkaXRMaXN0OwogCi0JSHVua0hlYWRlcihmaW5hbCBGaWxlSGVhZGVyIGZoLCBmaW5hbCBpbnQgb2Zmc2V0KSB7CisJSHVua0hlYWRlcihGaWxlSGVhZGVyIGZoLCBpbnQgb2Zmc2V0KSB7CiAJCXRoaXMoZmgsIG9mZnNldCwgbmV3IE9sZEltYWdlKCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgQWJicmV2aWF0ZWRPYmplY3RJZCBnZXRJZCgpIHsKQEAgLTEyOSwxMyArMTI5LDEzIEBAIHB1YmxpYyBBYmJyZXZpYXRlZE9iamVjdElkIGdldElkKCkgewogCQl9KTsKIAl9CiAKLQlIdW5rSGVhZGVyKGZpbmFsIEZpbGVIZWFkZXIgZmgsIGZpbmFsIGludCBvZmZzZXQsIGZpbmFsIE9sZEltYWdlIG9pKSB7CisJSHVua0hlYWRlcihGaWxlSGVhZGVyIGZoLCBpbnQgb2Zmc2V0LCBPbGRJbWFnZSBvaSkgewogCQlmaWxlID0gZmg7CiAJCXN0YXJ0T2Zmc2V0ID0gb2Zmc2V0OwogCQlvbGQgPSBvaTsKIAl9CiAKLQlIdW5rSGVhZGVyKGZpbmFsIEZpbGVIZWFkZXIgZmgsIGZpbmFsIEVkaXRMaXN0IGVkaXRMaXN0KSB7CisJSHVua0hlYWRlcihGaWxlSGVhZGVyIGZoLCBFZGl0TGlzdCBlZGl0TGlzdCkgewogCQl0aGlzKGZoLCBmaC5idWYubGVuZ3RoKTsKIAkJdGhpcy5lZGl0TGlzdCA9IGVkaXRMaXN0OwogCQllbmRPZmZzZXQgPSBzdGFydE9mZnNldDsKQEAgLTI5Myw3ICsyOTMsNyBAQCB2b2lkIHBhcnNlSGVhZGVyKCkgewogCQkJbmV3TGluZUNvdW50ID0gMTsKIAl9CiAKLQlpbnQgcGFyc2VCb2R5KGZpbmFsIFBhdGNoIHNjcmlwdCwgZmluYWwgaW50IGVuZCkgeworCWludCBwYXJzZUJvZHkoUGF0Y2ggc2NyaXB0LCBpbnQgZW5kKSB7CiAJCWZpbmFsIGJ5dGVbXSBidWYgPSBmaWxlLmJ1ZjsKIAkJaW50IGMgPSBuZXh0TEYoYnVmLCBzdGFydE9mZnNldCksIGxhc3QgPSBjOwogCkBAIC0zNTksNyArMzU5LDcgQEAgJiYgbWF0Y2goYnVmLCBsYXN0LCBQYXRjaC5TSUdfRk9PVEVSKSA+PSAwKSB7CiAJCXJldHVybiBjOwogCX0KIAotCXZvaWQgZXh0cmFjdEZpbGVMaW5lcyhmaW5hbCBPdXRwdXRTdHJlYW1bXSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJdm9pZCBleHRyYWN0RmlsZUxpbmVzKE91dHB1dFN0cmVhbVtdIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgYnl0ZVtdIGJ1ZiA9IGZpbGUuYnVmOwogCQlpbnQgcHRyID0gc3RhcnRPZmZzZXQ7CiAJCWludCBlb2wgPSBuZXh0TEYoYnVmLCBwdHIpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9QYXRjaC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9QYXRjaC5qYXZhCmluZGV4IGRhMTIzYTcuLjA1MmYyYTcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvUGF0Y2guamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL1BhdGNoLmphdmEKQEAgLTEwMSw3ICsxMDEsNyBAQCBwdWJsaWMgUGF0Y2goKSB7CiAJICogQHBhcmFtIGZoCiAJICogICAgICAgICAgICB0aGUgaGVhZGVyIG9mIHRoZSBmaWxlLgogCSAqLwotCXB1YmxpYyB2b2lkIGFkZEZpbGUoZmluYWwgRmlsZUhlYWRlciBmaCkgeworCXB1YmxpYyB2b2lkIGFkZEZpbGUoRmlsZUhlYWRlciBmaCkgewogCQlmaWxlcy5hZGQoZmgpOwogCX0KIApAQCAtMTIwLDcgKzEyMCw3IEBAIHB1YmxpYyBMaXN0PD8gZXh0ZW5kcyBGaWxlSGVhZGVyPiBnZXRGaWxlcygpIHsKIAkgKiBAcGFyYW0gZXJyCiAJICogICAgICAgICAgICB0aGUgZXJyb3IgZGVzY3JpcHRpb24uCiAJICovCi0JcHVibGljIHZvaWQgYWRkRXJyb3IoZmluYWwgRm9ybWF0RXJyb3IgZXJyKSB7CisJcHVibGljIHZvaWQgYWRkRXJyb3IoRm9ybWF0RXJyb3IgZXJyKSB7CiAJCWVycm9ycy5hZGQoZXJyKTsKIAl9CiAKQEAgLTE0NiwxMiArMTQ2LDEyIEBAIHB1YmxpYyBMaXN0PEZvcm1hdEVycm9yPiBnZXRFcnJvcnMoKSB7CiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgdGhlcmUgd2FzIGFuIGVycm9yIHJlYWRpbmcgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLgogCSAqLwotCXB1YmxpYyB2b2lkIHBhcnNlKGZpbmFsIElucHV0U3RyZWFtIGlzKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyB2b2lkIHBhcnNlKElucHV0U3RyZWFtIGlzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBieXRlW10gYnVmID0gcmVhZEZ1bGx5KGlzKTsKIAkJcGFyc2UoYnVmLCAwLCBidWYubGVuZ3RoKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBieXRlW10gcmVhZEZ1bGx5KGZpbmFsIElucHV0U3RyZWFtIGlzKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByaXZhdGUgc3RhdGljIGJ5dGVbXSByZWFkRnVsbHkoSW5wdXRTdHJlYW0gaXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXRyeSAoVGVtcG9yYXJ5QnVmZmVyIGIgPSBuZXcgVGVtcG9yYXJ5QnVmZmVyLkhlYXAoSW50ZWdlci5NQVhfVkFMVUUpKSB7CiAJCQliLmNvcHkoaXMpOwogCQkJcmV0dXJuIGIudG9CeXRlQXJyYXkoKTsKQEAgLTE3MywxMiArMTczLDEyIEBAIHB1YmxpYyB2b2lkIHBhcnNlKGZpbmFsIElucHV0U3RyZWFtIGlzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCSAqICAgICAgICAgICAgMSBwYXN0IHRoZSBsYXN0IHBvc2l0aW9uIHRvIGVuZCBwYXJzaW5nLiBUaGUgdG90YWwgbGVuZ3RoIHRvCiAJICogICAgICAgICAgICBiZSBwYXJzZWQgaXMgPGNvZGU+ZW5kIC0gcHRyPC9jb2RlPi4KIAkgKi8KLQlwdWJsaWMgdm9pZCBwYXJzZShmaW5hbCBieXRlW10gYnVmLCBpbnQgcHRyLCBmaW5hbCBpbnQgZW5kKSB7CisJcHVibGljIHZvaWQgcGFyc2UoYnl0ZVtdIGJ1ZiwgaW50IHB0ciwgaW50IGVuZCkgewogCQl3aGlsZSAocHRyIDwgZW5kKQogCQkJcHRyID0gcGFyc2VGaWxlKGJ1ZiwgcHRyLCBlbmQpOwogCX0KIAotCXByaXZhdGUgaW50IHBhcnNlRmlsZShmaW5hbCBieXRlW10gYnVmLCBpbnQgYywgZmluYWwgaW50IGVuZCkgeworCXByaXZhdGUgaW50IHBhcnNlRmlsZShieXRlW10gYnVmLCBpbnQgYywgaW50IGVuZCkgewogCQl3aGlsZSAoYyA8IGVuZCkgewogCQkJaWYgKGlzSHVua0hkcihidWYsIGMsIGVuZCkgPj0gMSkgewogCQkJCS8vIElmIHdlIGZpbmQgYSBkaXNjb25uZWN0ZWQgaHVuayBoZWFkZXIgd2UgbWlnaHQKQEAgLTIzNCw3ICsyMzQsNyBAQCBwcml2YXRlIGludCBwYXJzZUZpbGUoZmluYWwgYnl0ZVtdIGJ1ZiwgaW50IGMsIGZpbmFsIGludCBlbmQpIHsKIAkJcmV0dXJuIGM7CiAJfQogCi0JcHJpdmF0ZSBpbnQgcGFyc2VEaWZmR2l0KGZpbmFsIGJ5dGVbXSBidWYsIGZpbmFsIGludCBzdGFydCwgZmluYWwgaW50IGVuZCkgeworCXByaXZhdGUgaW50IHBhcnNlRGlmZkdpdChieXRlW10gYnVmLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKIAkJZmluYWwgRmlsZUhlYWRlciBmaCA9IG5ldyBGaWxlSGVhZGVyKGJ1Ziwgc3RhcnQpOwogCQlpbnQgcHRyID0gZmgucGFyc2VHaXRGaWxlTmFtZShzdGFydCArIERJRkZfR0lULmxlbmd0aCwgZW5kKTsKIAkJaWYgKHB0ciA8IDApCkBAIC0yNzEsMTQgKzI3MSwxNCBAQCBwcml2YXRlIGludCBwYXJzZVRyYWRpdGlvbmFsUGF0Y2goZmluYWwgYnl0ZVtdIGJ1ZiwgZmluYWwgaW50IHN0YXJ0LAogCQlyZXR1cm4gcHRyOwogCX0KIAotCXByaXZhdGUgc3RhdGljIGludCBza2lwRmlsZShmaW5hbCBieXRlW10gYnVmLCBpbnQgcHRyKSB7CisJcHJpdmF0ZSBzdGF0aWMgaW50IHNraXBGaWxlKGJ5dGVbXSBidWYsIGludCBwdHIpIHsKIAkJcHRyID0gbmV4dExGKGJ1ZiwgcHRyKTsKIAkJaWYgKG1hdGNoKGJ1ZiwgcHRyLCBPTERfTkFNRSkgPj0gMCkKIAkJCXB0ciA9IG5leHRMRihidWYsIHB0cik7CiAJCXJldHVybiBwdHI7CiAJfQogCi0JcHJpdmF0ZSBpbnQgcGFyc2VIdW5rcyhmaW5hbCBGaWxlSGVhZGVyIGZoLCBpbnQgYywgZmluYWwgaW50IGVuZCkgeworCXByaXZhdGUgaW50IHBhcnNlSHVua3MoRmlsZUhlYWRlciBmaCwgaW50IGMsIGludCBlbmQpIHsKIAkJZmluYWwgYnl0ZVtdIGJ1ZiA9IGZoLmJ1ZjsKIAkJd2hpbGUgKGMgPCBlbmQpIHsKIAkJCS8vIElmIHdlIHNlZSBhIGZpbGUgaGVhZGVyIGF0IHRoaXMgcG9pbnQsIHdlIGhhdmUgYWxsIG9mIHRoZQpAQCAtMzQ5LDcgKzM0OSw3IEBAICYmIG1hdGNoQW55KGJ1ZiwgYywgQklOX0hFQURFUlMpKSB7CiAJCXJldHVybiBjOwogCX0KIAotCXByaXZhdGUgaW50IHBhcnNlR2l0QmluYXJ5KGZpbmFsIEZpbGVIZWFkZXIgZmgsIGludCBjLCBmaW5hbCBpbnQgZW5kKSB7CisJcHJpdmF0ZSBpbnQgcGFyc2VHaXRCaW5hcnkoRmlsZUhlYWRlciBmaCwgaW50IGMsIGludCBlbmQpIHsKIAkJZmluYWwgQmluYXJ5SHVuayBwb3N0SW1hZ2UgPSBuZXcgQmluYXJ5SHVuayhmaCwgYyk7CiAJCWZpbmFsIGludCBuRW5kID0gcG9zdEltYWdlLnBhcnNlSHVuayhjLCBlbmQpOwogCQlpZiAobkVuZCA8IDApIHsKQEAgLTM3MywxNyArMzczLDE3IEBAIHByaXZhdGUgaW50IHBhcnNlR2l0QmluYXJ5KGZpbmFsIEZpbGVIZWFkZXIgZmgsIGludCBjLCBmaW5hbCBpbnQgZW5kKSB7CiAJCXJldHVybiBjOwogCX0KIAotCXZvaWQgd2FybihmaW5hbCBieXRlW10gYnVmLCBmaW5hbCBpbnQgcHRyLCBmaW5hbCBTdHJpbmcgbXNnKSB7CisJdm9pZCB3YXJuKGJ5dGVbXSBidWYsIGludCBwdHIsIFN0cmluZyBtc2cpIHsKIAkJYWRkRXJyb3IobmV3IEZvcm1hdEVycm9yKGJ1ZiwgcHRyLCBGb3JtYXRFcnJvci5TZXZlcml0eS5XQVJOSU5HLCBtc2cpKTsKIAl9CiAKLQl2b2lkIGVycm9yKGZpbmFsIGJ5dGVbXSBidWYsIGZpbmFsIGludCBwdHIsIGZpbmFsIFN0cmluZyBtc2cpIHsKKwl2b2lkIGVycm9yKGJ5dGVbXSBidWYsIGludCBwdHIsIFN0cmluZyBtc2cpIHsKIAkJYWRkRXJyb3IobmV3IEZvcm1hdEVycm9yKGJ1ZiwgcHRyLCBGb3JtYXRFcnJvci5TZXZlcml0eS5FUlJPUiwgbXNnKSk7CiAJfQogCiAJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBtYXRjaEFueShmaW5hbCBieXRlW10gYnVmLCBmaW5hbCBpbnQgYywKIAkJCWZpbmFsIGJ5dGVbXVtdIHNyY3MpIHsKLQkJZm9yIChmaW5hbCBieXRlW10gcyA6IHNyY3MpIHsKKwkJZm9yIChieXRlW10gcyA6IHNyY3MpIHsKIAkJCWlmIChtYXRjaChidWYsIGMsIHMpID49IDApCiAJCQkJcmV0dXJuIHRydWU7CiAJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2cGxvdC9BYnN0cmFjdFBsb3RSZW5kZXJlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZwbG90L0Fic3RyYWN0UGxvdFJlbmRlcmVyLmphdmEKaW5kZXggZjg4YjgxOS4uNThlMjEwNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZwbG90L0Fic3RyYWN0UGxvdFJlbmRlcmVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZwbG90L0Fic3RyYWN0UGxvdFJlbmRlcmVyLmphdmEKQEAgLTkyLDE0ICs5MiwxNCBAQCBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RQbG90UmVuZGVyZXI8VExhbmUgZXh0ZW5kcyBQbG90TGFuZSwgVENvbG9yPiB7CiAJICogICAgICAgICAgICB0b3RhbCBoZWlnaHQgKGluIHBpeGVscykgb2YgdGhpcyBjZWxsLgogCSAqLwogCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCB2b2lkIHBhaW50Q29tbWl0KGZpbmFsIFBsb3RDb21taXQ8VExhbmU+IGNvbW1pdCwgZmluYWwgaW50IGgpIHsKKwlwcm90ZWN0ZWQgdm9pZCBwYWludENvbW1pdChQbG90Q29tbWl0PFRMYW5lPiBjb21taXQsIGludCBoKSB7CiAJCWZpbmFsIGludCBkb3RTaXplID0gY29tcHV0ZURvdFNpemUoaCk7CiAJCWZpbmFsIFRMYW5lIG15TGFuZSA9IGNvbW1pdC5nZXRMYW5lKCk7CiAJCWZpbmFsIGludCBteUxhbmVYID0gbGFuZUMobXlMYW5lKTsKIAkJZmluYWwgVENvbG9yIG15Q29sb3IgPSBsYW5lQ29sb3IobXlMYW5lKTsKIAogCQlpbnQgbWF4Q2VudGVyID0gbXlMYW5lWDsKLQkJZm9yIChmaW5hbCBUTGFuZSBwYXNzaW5nTGFuZSA6IChUTGFuZVtdKSBjb21taXQucGFzc2luZ0xhbmVzKSB7CisJCWZvciAoVExhbmUgcGFzc2luZ0xhbmUgOiAoVExhbmVbXSkgY29tbWl0LnBhc3NpbmdMYW5lcykgewogCQkJZmluYWwgaW50IGN4ID0gbGFuZUMocGFzc2luZ0xhbmUpOwogCQkJZmluYWwgVENvbG9yIGMgPSBsYW5lQ29sb3IocGFzc2luZ0xhbmUpOwogCQkJZHJhd0xpbmUoYywgY3gsIDAsIGN4LCBoLCBMSU5FX1dJRFRIKTsKQEAgLTE5MCw3ICsxOTAsNyBAQCBwcm90ZWN0ZWQgdm9pZCBwYWludENvbW1pdChmaW5hbCBQbG90Q29tbWl0PFRMYW5lPiBjb21taXQsIGZpbmFsIGludCBoKSB7CiAJICovCiAJcHJvdGVjdGVkIGFic3RyYWN0IGludCBkcmF3TGFiZWwoaW50IHgsIGludCB5LCBSZWYgcmVmKTsKIAotCXByaXZhdGUgc3RhdGljIGludCBjb21wdXRlRG90U2l6ZShmaW5hbCBpbnQgaCkgeworCXByaXZhdGUgc3RhdGljIGludCBjb21wdXRlRG90U2l6ZShpbnQgaCkgewogCQlpbnQgZCA9IChpbnQpIChNYXRoLm1pbihoLCBMQU5FX1dJRFRIKSAqIDAuNTBmKTsKIAkJZCArPSAoZCAmIDEpOwogCQlyZXR1cm4gZDsKQEAgLTI4MiwxMiArMjgyLDEyIEBAIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGRyYXdMaW5lKFRDb2xvciBjb2xvciwgaW50IHgxLCBpbnQgeTEsIGludCB4MiwKIAkgKi8KIAlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBkcmF3VGV4dChTdHJpbmcgbXNnLCBpbnQgeCwgaW50IHkpOwogCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGxhbmVYKGZpbmFsIFBsb3RMYW5lIG15TGFuZSkgeworCXByaXZhdGUgc3RhdGljIGludCBsYW5lWChQbG90TGFuZSBteUxhbmUpIHsKIAkJZmluYWwgaW50IHAgPSBteUxhbmUgIT0gbnVsbCA/IG15TGFuZS5nZXRQb3NpdGlvbigpIDogMDsKIAkJcmV0dXJuIExFRlRfUEFEICsgTEFORV9XSURUSCAqIHA7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGxhbmVDKGZpbmFsIFBsb3RMYW5lIG15TGFuZSkgeworCXByaXZhdGUgc3RhdGljIGludCBsYW5lQyhQbG90TGFuZSBteUxhbmUpIHsKIAkJcmV0dXJuIGxhbmVYKG15TGFuZSkgKyBMQU5FX1dJRFRIIC8gMjsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldnBsb3QvUGxvdENvbW1pdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZwbG90L1Bsb3RDb21taXQuamF2YQppbmRleCAwOTFiZjY4Li45OTE0YjBjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldnBsb3QvUGxvdENvbW1pdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2cGxvdC9QbG90Q29tbWl0LmphdmEKQEAgLTc5LDcgKzc5LDcgQEAgcHVibGljIGNsYXNzIFBsb3RDb21taXQ8TCBleHRlbmRzIFBsb3RMYW5lPiBleHRlbmRzIFJldkNvbW1pdCB7CiAJICogQHBhcmFtIGlkCiAJICogICAgICAgICAgICB0aGUgaWRlbnRpdHkgb2YgdGhpcyBjb21taXQuCiAJICovCi0JcHJvdGVjdGVkIFBsb3RDb21taXQoZmluYWwgQW55T2JqZWN0SWQgaWQpIHsKKwlwcm90ZWN0ZWQgUGxvdENvbW1pdChBbnlPYmplY3RJZCBpZCkgewogCQlzdXBlcihpZCk7CiAJCWZvcmtpbmdPZmZMYW5lcyA9IE5PX0xBTkVTOwogCQlwYXNzaW5nTGFuZXMgPSBOT19MQU5FUzsKQEAgLTg4LDE5ICs4OCwxOSBAQCBwcm90ZWN0ZWQgUGxvdENvbW1pdChmaW5hbCBBbnlPYmplY3RJZCBpZCkgewogCQlyZWZzID0gTk9fUkVGUzsKIAl9CiAKLQl2b2lkIGFkZEZvcmtpbmdPZmZMYW5lKGZpbmFsIFBsb3RMYW5lIGYpIHsKKwl2b2lkIGFkZEZvcmtpbmdPZmZMYW5lKFBsb3RMYW5lIGYpIHsKIAkJZm9ya2luZ09mZkxhbmVzID0gYWRkTGFuZShmLCBmb3JraW5nT2ZmTGFuZXMpOwogCX0KIAotCXZvaWQgYWRkUGFzc2luZ0xhbmUoZmluYWwgUGxvdExhbmUgYykgeworCXZvaWQgYWRkUGFzc2luZ0xhbmUoUGxvdExhbmUgYykgewogCQlwYXNzaW5nTGFuZXMgPSBhZGRMYW5lKGMsIHBhc3NpbmdMYW5lcyk7CiAJfQogCi0Jdm9pZCBhZGRNZXJnaW5nTGFuZShmaW5hbCBQbG90TGFuZSBtKSB7CisJdm9pZCBhZGRNZXJnaW5nTGFuZShQbG90TGFuZSBtKSB7CiAJCW1lcmdpbmdMYW5lcyA9IGFkZExhbmUobSwgbWVyZ2luZ0xhbmVzKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBQbG90TGFuZVtdIGFkZExhbmUoZmluYWwgUGxvdExhbmUgbCwgUGxvdExhbmVbXSBsYW5lcykgeworCXByaXZhdGUgc3RhdGljIFBsb3RMYW5lW10gYWRkTGFuZShQbG90TGFuZSBsLCBQbG90TGFuZVtdIGxhbmVzKSB7CiAJCWZpbmFsIGludCBjbnQgPSBsYW5lcy5sZW5ndGg7CiAJCWlmIChjbnQgPT0gMCkKIAkJCWxhbmVzID0gbmV3IFBsb3RMYW5lW10geyBsIH07CkBAIC0xMTUsNyArMTE1LDcgQEAgZWxzZSBpZiAoY250ID09IDEpCiAJCXJldHVybiBsYW5lczsKIAl9CiAKLQl2b2lkIGFkZENoaWxkKGZpbmFsIFBsb3RDb21taXQgYykgeworCXZvaWQgYWRkQ2hpbGQoUGxvdENvbW1pdCBjKSB7CiAJCWZpbmFsIGludCBjbnQgPSBjaGlsZHJlbi5sZW5ndGg7CiAJCWlmIChjbnQgPT0gMCkKIAkJCWNoaWxkcmVuID0gbmV3IFBsb3RDb21taXRbXSB7IGMgfTsKQEAgLTE1Miw3ICsxNTIsNyBAQCBwdWJsaWMgZmluYWwgaW50IGdldENoaWxkQ291bnQoKSB7CiAJICogQHRocm93cyBqYXZhLmxhbmcuQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgYW4gaW52YWxpZCBjaGlsZCBpbmRleCB3YXMgc3BlY2lmaWVkLgogCSAqLwotCXB1YmxpYyBmaW5hbCBQbG90Q29tbWl0IGdldENoaWxkKGZpbmFsIGludCBudGgpIHsKKwlwdWJsaWMgZmluYWwgUGxvdENvbW1pdCBnZXRDaGlsZChpbnQgbnRoKSB7CiAJCXJldHVybiBjaGlsZHJlbltudGhdOwogCX0KIApAQCAtMTYzLDggKzE2Myw4IEBAIHB1YmxpYyBmaW5hbCBQbG90Q29tbWl0IGdldENoaWxkKGZpbmFsIGludCBudGgpIHsKIAkgKiAgICAgICAgICAgIHRoZSBjb21taXQgdG8gdGVzdC4KIAkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGNvbW1pdCBidWlsdCBvbiB0b3Agb2YgdGhpcyBjb21taXQuCiAJICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNDaGlsZChmaW5hbCBQbG90Q29tbWl0IGMpIHsKLQkJZm9yIChmaW5hbCBQbG90Q29tbWl0IGEgOiBjaGlsZHJlbikKKwlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0NoaWxkKFBsb3RDb21taXQgYykgeworCQlmb3IgKFBsb3RDb21taXQgYSA6IGNoaWxkcmVuKQogCQkJaWYgKGEgPT0gYykKIAkJCQlyZXR1cm4gdHJ1ZTsKIAkJcmV0dXJuIGZhbHNlOwpAQCAtMTg5LDcgKzE4OSw3IEBAIHB1YmxpYyBmaW5hbCBpbnQgZ2V0UmVmQ291bnQoKSB7CiAJICogQHRocm93cyBqYXZhLmxhbmcuQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgYW4gaW52YWxpZCByZWYgaW5kZXggd2FzIHNwZWNpZmllZC4KIAkgKi8KLQlwdWJsaWMgZmluYWwgUmVmIGdldFJlZihmaW5hbCBpbnQgbnRoKSB7CisJcHVibGljIGZpbmFsIFJlZiBnZXRSZWYoaW50IG50aCkgewogCQlyZXR1cm4gcmVmc1tudGhdOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZwbG90L1Bsb3RDb21taXRMaXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldnBsb3QvUGxvdENvbW1pdExpc3QuamF2YQppbmRleCA2YTBiYTY2Li41ZTE1MzE2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldnBsb3QvUGxvdENvbW1pdExpc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldnBsb3QvUGxvdENvbW1pdExpc3QuamF2YQpAQCAtOTQsNyArOTQsNyBAQCBwdWJsaWMgdm9pZCBjbGVhcigpIHsKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc291cmNlKGZpbmFsIFJldldhbGsgdykgeworCXB1YmxpYyB2b2lkIHNvdXJjZShSZXZXYWxrIHcpIHsKIAkJaWYgKCEodyBpbnN0YW5jZW9mIFBsb3RXYWxrKSkKIAkJCXRocm93IG5ldyBDbGFzc0Nhc3RFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoSkdpdFRleHQuZ2V0KCkuY2xhc3NDYXN0Tm90QSwgUGxvdFdhbGsuY2xhc3MuZ2V0TmFtZSgpKSk7CiAJCXN1cGVyLnNvdXJjZSh3KTsKQEAgLTEyMCwxMyArMTIwLDEzIEBAIHB1YmxpYyB2b2lkIHNvdXJjZShmaW5hbCBSZXZXYWxrIHcpIHsKIAlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKIAlwdWJsaWMgdm9pZCBmaW5kUGFzc2luZ1Rocm91Z2goZmluYWwgUGxvdENvbW1pdDxMPiBjdXJyQ29tbWl0LAogCQkJZmluYWwgQ29sbGVjdGlvbjxMPiByZXN1bHQpIHsKLQkJZm9yIChmaW5hbCBQbG90TGFuZSBwIDogY3VyckNvbW1pdC5wYXNzaW5nTGFuZXMpCisJCWZvciAoUGxvdExhbmUgcCA6IGN1cnJDb21taXQucGFzc2luZ0xhbmVzKQogCQkJcmVzdWx0LmFkZCgoTCkgcCk7CiAJfQogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbnRlcihmaW5hbCBpbnQgaW5kZXgsIGZpbmFsIFBsb3RDb21taXQ8TD4gY3VyckNvbW1pdCkgeworCXByb3RlY3RlZCB2b2lkIGVudGVyKGludCBpbmRleCwgUGxvdENvbW1pdDxMPiBjdXJyQ29tbWl0KSB7CiAJCXNldHVwQ2hpbGRyZW4oY3VyckNvbW1pdCk7CiAKIAkJZmluYWwgaW50IG5DaGlsZHJlbiA9IGN1cnJDb21taXQuZ2V0Q2hpbGRDb3VudCgpOwpAQCAtMjAyLDcgKzIwMiw3IEBAIHByb3RlY3RlZCB2b2lkIGVudGVyKGZpbmFsIGludCBpbmRleCwgZmluYWwgUGxvdENvbW1pdDxMPiBjdXJyQ29tbWl0KSB7CiAJCQljbG9zZUxhbmUoY3VyckNvbW1pdC5sYW5lKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgY29udGludWVBY3RpdmVMYW5lcyhmaW5hbCBQbG90Q29tbWl0IGN1cnJDb21taXQpIHsKKwlwcml2YXRlIHZvaWQgY29udGludWVBY3RpdmVMYW5lcyhQbG90Q29tbWl0IGN1cnJDb21taXQpIHsKIAkJZm9yIChQbG90TGFuZSBsYW5lIDogYWN0aXZlTGFuZXMpCiAJCQlpZiAobGFuZSAhPSBjdXJyQ29tbWl0LmxhbmUpCiAJCQkJY3VyckNvbW1pdC5hZGRQYXNzaW5nTGFuZShsYW5lKTsKQEAgLTM1Niw3ICszNTYsNyBAQCBwcml2YXRlIHZvaWQgY2xvc2VMYW5lKFBsb3RMYW5lIGxhbmUpIHsKIAkJfQogCX0KIAotCXByaXZhdGUgdm9pZCBzZXR1cENoaWxkcmVuKGZpbmFsIFBsb3RDb21taXQ8TD4gY3VyckNvbW1pdCkgeworCXByaXZhdGUgdm9pZCBzZXR1cENoaWxkcmVuKFBsb3RDb21taXQ8TD4gY3VyckNvbW1pdCkgewogCQlmaW5hbCBpbnQgblBhcmVudHMgPSBjdXJyQ29tbWl0LmdldFBhcmVudENvdW50KCk7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgblBhcmVudHM7IGkrKykKIAkJCSgoUGxvdENvbW1pdCkgY3VyckNvbW1pdC5nZXRQYXJlbnQoaSkpLmFkZENoaWxkKGN1cnJDb21taXQpOwpAQCAtNDE2LDcgKzQxNiw3IEBAIHByb3RlY3RlZCBMIGNyZWF0ZUxhbmUoKSB7CiAJICogQHBhcmFtIGxhbmUKIAkgKiAgICAgICAgICAgIGEgbGFuZQogCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlY3ljbGVMYW5lKGZpbmFsIEwgbGFuZSkgeworCXByb3RlY3RlZCB2b2lkIHJlY3ljbGVMYW5lKEwgbGFuZSkgewogCQkvLyBOb3RoaW5nLgogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2cGxvdC9QbG90V2Fsay5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZwbG90L1Bsb3RXYWxrLmphdmEKaW5kZXggOGJhOGQ2ZS4uZjI3ZjM1NiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZwbG90L1Bsb3RXYWxrLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZwbG90L1Bsb3RXYWxrLmphdmEKQEAgLTkwLDcgKzkwLDcgQEAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKIAkgKiBAcGFyYW0gcmVwbwogCSAqICAgICAgICAgICAgdGhlIHJlcG9zaXRvcnkgdGhlIHdhbGtlciB3aWxsIG9idGFpbiBkYXRhIGZyb20uCiAJICovCi0JcHVibGljIFBsb3RXYWxrKGZpbmFsIFJlcG9zaXRvcnkgcmVwbykgeworCXB1YmxpYyBQbG90V2FsayhSZXBvc2l0b3J5IHJlcG8pIHsKIAkJc3VwZXIocmVwbyk7CiAJCXN1cGVyLnNvcnQoUmV2U29ydC5UT1BPLCB0cnVlKTsKIAkJcmV2ZXJzZVJlZk1hcCA9IHJlcG8uZ2V0QWxsUmVmc0J5UGVlbGVkT2JqZWN0SWQoKTsKQEAgLTExOCw3ICsxMTgsNyBAQCBwdWJsaWMgdm9pZCBhZGRBZGRpdGlvbmFsUmVmcyhJdGVyYWJsZTxSZWY+IHJlZnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNvcnQoZmluYWwgUmV2U29ydCBzLCBmaW5hbCBib29sZWFuIHVzZSkgeworCXB1YmxpYyB2b2lkIHNvcnQoUmV2U29ydCBzLCBib29sZWFuIHVzZSkgewogCQlpZiAocyA9PSBSZXZTb3J0LlRPUE8gJiYgIXVzZSkKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oSkdpdFRleHQuZ2V0KCkudG9wb2xvZ2ljYWxTb3J0UmVxdWlyZWQpOwogCQlzdXBlci5zb3J0KHMsIHVzZSk7CkBAIC0xMjYsNyArMTI2LDcgQEAgcHVibGljIHZvaWQgc29ydChmaW5hbCBSZXZTb3J0IHMsIGZpbmFsIGJvb2xlYW4gdXNlKSB7CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXByb3RlY3RlZCBSZXZDb21taXQgY3JlYXRlQ29tbWl0KGZpbmFsIEFueU9iamVjdElkIGlkKSB7CisJcHJvdGVjdGVkIFJldkNvbW1pdCBjcmVhdGVDb21taXQoQW55T2JqZWN0SWQgaWQpIHsKIAkJcmV0dXJuIG5ldyBQbG90Q29tbWl0KGlkKTsKIAl9CiAKQEAgLTE0MCw3ICsxNDAsNyBAQCBwdWJsaWMgUmV2Q29tbWl0IG5leHQoKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKIAkJcmV0dXJuIHBjOwogCX0KIAotCXByaXZhdGUgUmVmW10gZ2V0UmVmcyhmaW5hbCBBbnlPYmplY3RJZCBjb21taXRJZCkgeworCXByaXZhdGUgUmVmW10gZ2V0UmVmcyhBbnlPYmplY3RJZCBjb21taXRJZCkgewogCQlDb2xsZWN0aW9uPFJlZj4gbGlzdCA9IHJldmVyc2VSZWZNYXAuZ2V0KGNvbW1pdElkKTsKIAkJaWYgKGxpc3QgPT0gbnVsbCkKIAkJCXJldHVybiBQbG90Q29tbWl0Lk5PX1JFRlM7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvQWJzdHJhY3RSZXZRdWV1ZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0Fic3RyYWN0UmV2UXVldWUuamF2YQppbmRleCBiOTQ4YWRiLi4yNDdhM2JkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvQWJzdHJhY3RSZXZRdWV1ZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9BYnN0cmFjdFJldlF1ZXVlLmphdmEKQEAgLTc0LDcgKzc0LDcgQEAgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSZXZRdWV1ZSBleHRlbmRzIEdlbmVyYXRvciB7CiAJICogQHBhcmFtIHF1ZXVlQ29udHJvbAogCSAqICAgICAgICAgICAgZmxhZyB0aGF0IGNvbnRyb2xzIGFkbWlzc2lvbiB0byB0aGUgcXVldWUuCiAJICovCi0JcHVibGljIGZpbmFsIHZvaWQgYWRkKGZpbmFsIFJldkNvbW1pdCBjLCBmaW5hbCBSZXZGbGFnIHF1ZXVlQ29udHJvbCkgeworCXB1YmxpYyBmaW5hbCB2b2lkIGFkZChSZXZDb21taXQgYywgUmV2RmxhZyBxdWV1ZUNvbnRyb2wpIHsKIAkJaWYgKCFjLmhhcyhxdWV1ZUNvbnRyb2wpKSB7CiAJCQljLmFkZChxdWV1ZUNvbnRyb2wpOwogCQkJYWRkKGMpOwpAQCAtOTQsNyArOTQsNyBAQCBwdWJsaWMgZmluYWwgdm9pZCBhZGQoZmluYWwgUmV2Q29tbWl0IGMsIGZpbmFsIFJldkZsYWcgcXVldWVDb250cm9sKSB7CiAJICogQHBhcmFtIHF1ZXVlQ29udHJvbAogCSAqICAgICAgICAgICAgZmxhZyB0aGF0IGNvbnRyb2xzIGFkbWlzc2lvbiB0byB0aGUgcXVldWUuCiAJICovCi0JcHVibGljIGZpbmFsIHZvaWQgYWRkUGFyZW50cyhmaW5hbCBSZXZDb21taXQgYywgZmluYWwgUmV2RmxhZyBxdWV1ZUNvbnRyb2wpIHsKKwlwdWJsaWMgZmluYWwgdm9pZCBhZGRQYXJlbnRzKFJldkNvbW1pdCBjLCBSZXZGbGFnIHF1ZXVlQ29udHJvbCkgewogCQlmaW5hbCBSZXZDb21taXRbXSBwTGlzdCA9IGMucGFyZW50czsKIAkJaWYgKHBMaXN0ID09IG51bGwpCiAJCQlyZXR1cm47CkBAIC0xMzIsNyArMTMyLDcgQEAgaW50IG91dHB1dFR5cGUoKSB7CiAJICogQHBhcmFtIGMKIAkgKiAgICAgICAgICAgIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZDb21taXR9CiAJICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGRlc2NyaWJlKGZpbmFsIFN0cmluZ0J1aWxkZXIgcywgZmluYWwgUmV2Q29tbWl0IGMpIHsKKwlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgZGVzY3JpYmUoU3RyaW5nQnVpbGRlciBzLCBSZXZDb21taXQgYykgewogCQlzLmFwcGVuZChjLnRvU3RyaW5nKCkpOwogCQlzLmFwcGVuZCgnXG4nKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvQmxvY2tPYmpRdWV1ZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0Jsb2NrT2JqUXVldWUuamF2YQppbmRleCAzNzFjZDA2Li5mY2RmNzk1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvQmxvY2tPYmpRdWV1ZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9CbG9ja09ialF1ZXVlLmphdmEKQEAgLTU1LDcgKzU1LDcgQEAgY2xhc3MgQmxvY2tPYmpRdWV1ZSB7CiAJCWZyZWUgPSBuZXcgQmxvY2tGcmVlTGlzdCgpOwogCX0KIAotCXZvaWQgYWRkKGZpbmFsIFJldk9iamVjdCBjKSB7CisJdm9pZCBhZGQoUmV2T2JqZWN0IGMpIHsKIAkJQmxvY2sgYiA9IHRhaWw7CiAJCWlmIChiID09IG51bGwpIHsKIAkJCWIgPSBmcmVlLm5ld0Jsb2NrKCk7CkBAIC05OCw3ICs5OCw3IEBAIEJsb2NrIG5ld0Jsb2NrKCkgewogCQkJcmV0dXJuIGI7CiAJCX0KIAotCQl2b2lkIGZyZWVCbG9jayhmaW5hbCBCbG9jayBiKSB7CisJCXZvaWQgZnJlZUJsb2NrKEJsb2NrIGIpIHsKIAkJCWIubmV4dCA9IG5leHQ7CiAJCQluZXh0ID0gYjsKIAkJfQpAQCAtMTI3LDcgKzEyNyw3IEBAIGJvb2xlYW4gaXNFbXB0eSgpIHsKIAkJCXJldHVybiBoZWFkSW5kZXggPT0gdGFpbEluZGV4OwogCQl9CiAKLQkJdm9pZCBhZGQoZmluYWwgUmV2T2JqZWN0IGMpIHsKKwkJdm9pZCBhZGQoUmV2T2JqZWN0IGMpIHsKIAkJCW9iamVjdHNbdGFpbEluZGV4KytdID0gYzsKIAkJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvQmxvY2tSZXZRdWV1ZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0Jsb2NrUmV2UXVldWUuamF2YQppbmRleCA3NGEzNTExLi43OTMwN2I1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvQmxvY2tSZXZRdWV1ZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9CbG9ja1JldlF1ZXVlLmphdmEKQEAgLTU4LDcgKzU4LDcgQEAgcHJvdGVjdGVkIEJsb2NrUmV2UXVldWUoKSB7CiAJCWZyZWUgPSBuZXcgQmxvY2tGcmVlTGlzdCgpOwogCX0KIAotCUJsb2NrUmV2UXVldWUoZmluYWwgR2VuZXJhdG9yIHMpIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAorCUJsb2NrUmV2UXVldWUoR2VuZXJhdG9yIHMpIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAogCQkJSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQlmcmVlID0gbmV3IEJsb2NrRnJlZUxpc3QoKTsKIAkJb3V0cHV0VHlwZSA9IHMub3V0cHV0VHlwZSgpOwpAQCAtODUsNyArODUsNyBAQCBwcm90ZWN0ZWQgQmxvY2tSZXZRdWV1ZSgpIHsKIAkgKiBzaGFyaW5nIHRoZSBzYW1lIGZyZWUgbGlzdCBhcmUgZG9pbmcgc28gZnJvbSBvbmx5IGEgc2luZ2xlIHRocmVhZC4KIAkgKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzaGFyZUZyZWVMaXN0KGZpbmFsIEJsb2NrUmV2UXVldWUgcSkgeworCXB1YmxpYyB2b2lkIHNoYXJlRnJlZUxpc3QoQmxvY2tSZXZRdWV1ZSBxKSB7CiAJCWZyZWUgPSBxLmZyZWU7CiAJfQogCkBAIC0xMDEsNyArMTAxLDcgQEAgQmxvY2sgbmV3QmxvY2soKSB7CiAJCQlyZXR1cm4gYjsKIAkJfQogCi0JCXZvaWQgZnJlZUJsb2NrKGZpbmFsIEJsb2NrIGIpIHsKKwkJdm9pZCBmcmVlQmxvY2soQmxvY2sgYikgewogCQkJYi5uZXh0ID0gbmV4dDsKIAkJCW5leHQgPSBiOwogCQl9CkBAIC0xMzgsMTEgKzEzOCwxMSBAQCBib29sZWFuIGNhblVucG9wKCkgewogCQkJcmV0dXJuIGhlYWRJbmRleCA+IDA7CiAJCX0KIAotCQl2b2lkIGFkZChmaW5hbCBSZXZDb21taXQgYykgeworCQl2b2lkIGFkZChSZXZDb21taXQgYykgewogCQkJY29tbWl0c1t0YWlsSW5kZXgrK10gPSBjOwogCQl9CiAKLQkJdm9pZCB1bnBvcChmaW5hbCBSZXZDb21taXQgYykgeworCQl2b2lkIHVucG9wKFJldkNvbW1pdCBjKSB7CiAJCQljb21taXRzWy0taGVhZEluZGV4XSA9IGM7CiAJCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0JvdW5kYXJ5R2VuZXJhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvQm91bmRhcnlHZW5lcmF0b3IuamF2YQppbmRleCA2YmUwYzg1Li4wZmQ2NjIxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvQm91bmRhcnlHZW5lcmF0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvQm91bmRhcnlHZW5lcmF0b3IuamF2YQpAQCAtNTQsNyArNTQsNyBAQCBjbGFzcyBCb3VuZGFyeUdlbmVyYXRvciBleHRlbmRzIEdlbmVyYXRvciB7CiAKIAlHZW5lcmF0b3IgZzsKIAotCUJvdW5kYXJ5R2VuZXJhdG9yKGZpbmFsIFJldldhbGsgdywgZmluYWwgR2VuZXJhdG9yIHMpIHsKKwlCb3VuZGFyeUdlbmVyYXRvcihSZXZXYWxrIHcsIEdlbmVyYXRvciBzKSB7CiAJCWcgPSBuZXcgSW5pdGlhbEdlbmVyYXRvcih3LCBzKTsKIAl9CiAKQEAgLTY0LDcgKzY0LDcgQEAgaW50IG91dHB1dFR5cGUoKSB7CiAJfQogCiAJQE92ZXJyaWRlCi0Jdm9pZCBzaGFyZUZyZWVMaXN0KGZpbmFsIEJsb2NrUmV2UXVldWUgcSkgeworCXZvaWQgc2hhcmVGcmVlTGlzdChCbG9ja1JldlF1ZXVlIHEpIHsKIAkJZy5zaGFyZUZyZWVMaXN0KHEpOwogCX0KIApAQCAtODUsNyArODUsNyBAQCBwcml2YXRlIGNsYXNzIEluaXRpYWxHZW5lcmF0b3IgZXh0ZW5kcyBHZW5lcmF0b3IgewogCiAJCXByaXZhdGUgZmluYWwgR2VuZXJhdG9yIHNvdXJjZTsKIAotCQlJbml0aWFsR2VuZXJhdG9yKGZpbmFsIFJldldhbGsgdywgZmluYWwgR2VuZXJhdG9yIHMpIHsKKwkJSW5pdGlhbEdlbmVyYXRvcihSZXZXYWxrIHcsIEdlbmVyYXRvciBzKSB7CiAJCQl3YWxrID0gdzsKIAkJCWhlbGQgPSBuZXcgRklGT1JldlF1ZXVlKCk7CiAJCQlzb3VyY2UgPSBzOwpAQCAtOTgsNyArOTgsNyBAQCBpbnQgb3V0cHV0VHlwZSgpIHsKIAkJfQogCiAJCUBPdmVycmlkZQotCQl2b2lkIHNoYXJlRnJlZUxpc3QoZmluYWwgQmxvY2tSZXZRdWV1ZSBxKSB7CisJCXZvaWQgc2hhcmVGcmVlTGlzdChCbG9ja1JldlF1ZXVlIHEpIHsKIAkJCXEuc2hhcmVGcmVlTGlzdChoZWxkKTsKIAkJfQogCkBAIC0xMDcsNyArMTA3LDcgQEAgUmV2Q29tbWl0IG5leHQoKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKIAkJCQlJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCQlSZXZDb21taXQgYyA9IHNvdXJjZS5uZXh0KCk7CiAJCQlpZiAoYyAhPSBudWxsKSB7Ci0JCQkJZm9yIChmaW5hbCBSZXZDb21taXQgcCA6IGMucGFyZW50cykKKwkJCQlmb3IgKFJldkNvbW1pdCBwIDogYy5wYXJlbnRzKQogCQkJCQlpZiAoKHAuZmxhZ3MgJiBVTklOVEVSRVNUSU5HKSAhPSAwKQogCQkJCQkJaGVsZC5hZGQocCk7CiAJCQkJcmV0dXJuIGM7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvRGF0ZVJldlF1ZXVlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvRGF0ZVJldlF1ZXVlLmphdmEKaW5kZXggYzk5M2ZlNS4uYjg2ZTg3NiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0RhdGVSZXZRdWV1ZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9EYXRlUmV2UXVldWUuamF2YQpAQCAtNzYsNyArNzYsNyBAQCBwdWJsaWMgRGF0ZVJldlF1ZXVlKCkgewogCQlzdXBlcigpOwogCX0KIAotCURhdGVSZXZRdWV1ZShmaW5hbCBHZW5lcmF0b3IgcykgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCisJRGF0ZVJldlF1ZXVlKEdlbmVyYXRvciBzKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKIAkJCUluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJZm9yICg7OykgewogCQkJZmluYWwgUmV2Q29tbWl0IGMgPSBzLm5leHQoKTsKQEAgLTg4LDcgKzg4LDcgQEAgcHVibGljIERhdGVSZXZRdWV1ZSgpIHsKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkKGZpbmFsIFJldkNvbW1pdCBjKSB7CisJcHVibGljIHZvaWQgYWRkKFJldkNvbW1pdCBjKSB7CiAJCXNpbmNlTGFzdEluZGV4Kys7CiAJCWlmICgrK2luUXVldWUgPiBSRUJVSUxEX0lOREVYX0NPVU5UCiAJCQkJJiYgc2luY2VMYXN0SW5kZXggPiBSRUJVSUxEX0lOREVYX0NPVU5UKQpAQCAtMTgxLDcgKzE4MSw3IEBAIHB1YmxpYyB2b2lkIGNsZWFyKCkgewogCX0KIAogCUBPdmVycmlkZQotCWJvb2xlYW4gZXZlcmJvZHlIYXNGbGFnKGZpbmFsIGludCBmKSB7CisJYm9vbGVhbiBldmVyYm9keUhhc0ZsYWcoaW50IGYpIHsKIAkJZm9yIChFbnRyeSBxID0gaGVhZDsgcSAhPSBudWxsOyBxID0gcS5uZXh0KSB7CiAJCQlpZiAoKHEuY29tbWl0LmZsYWdzICYgZikgPT0gMCkKIAkJCQlyZXR1cm4gZmFsc2U7CkBAIC0xOTAsNyArMTkwLDcgQEAgYm9vbGVhbiBldmVyYm9keUhhc0ZsYWcoZmluYWwgaW50IGYpIHsKIAl9CiAKIAlAT3ZlcnJpZGUKLQlib29sZWFuIGFueWJvZHlIYXNGbGFnKGZpbmFsIGludCBmKSB7CisJYm9vbGVhbiBhbnlib2R5SGFzRmxhZyhpbnQgZikgewogCQlmb3IgKEVudHJ5IHEgPSBoZWFkOyBxICE9IG51bGw7IHEgPSBxLm5leHQpIHsKIAkJCWlmICgocS5jb21taXQuZmxhZ3MgJiBmKSAhPSAwKQogCQkJCXJldHVybiB0cnVlOwpAQCAtMjEyLDcgKzIxMiw3IEBAIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCXJldHVybiBzLnRvU3RyaW5nKCk7CiAJfQogCi0JcHJpdmF0ZSBFbnRyeSBuZXdFbnRyeShmaW5hbCBSZXZDb21taXQgYykgeworCXByaXZhdGUgRW50cnkgbmV3RW50cnkoUmV2Q29tbWl0IGMpIHsKIAkJRW50cnkgciA9IGZyZWU7CiAJCWlmIChyID09IG51bGwpCiAJCQlyID0gbmV3IEVudHJ5KCk7CkBAIC0yMjIsNyArMjIyLDcgQEAgcHJpdmF0ZSBFbnRyeSBuZXdFbnRyeShmaW5hbCBSZXZDb21taXQgYykgewogCQlyZXR1cm4gcjsKIAl9CiAKLQlwcml2YXRlIHZvaWQgZnJlZUVudHJ5KGZpbmFsIEVudHJ5IGUpIHsKKwlwcml2YXRlIHZvaWQgZnJlZUVudHJ5KEVudHJ5IGUpIHsKIAkJZS5uZXh0ID0gZnJlZTsKIAkJZnJlZSA9IGU7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0RlbGF5UmV2UXVldWUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9EZWxheVJldlF1ZXVlLmphdmEKaW5kZXggNGEwZDE5ZC4uYzM5N2EwMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0RlbGF5UmV2UXVldWUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvRGVsYXlSZXZRdWV1ZS5qYXZhCkBAIC02OSw3ICs2OSw3IEBAIGZpbmFsIGNsYXNzIERlbGF5UmV2UXVldWUgZXh0ZW5kcyBHZW5lcmF0b3IgewogCiAJcHJpdmF0ZSBpbnQgc2l6ZTsKIAotCURlbGF5UmV2UXVldWUoZmluYWwgR2VuZXJhdG9yIGcpIHsKKwlEZWxheVJldlF1ZXVlKEdlbmVyYXRvciBnKSB7CiAJCXBlbmRpbmcgPSBnOwogCQlkZWxheSA9IG5ldyBGSUZPUmV2UXVldWUoKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvRGVwdGhHZW5lcmF0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9EZXB0aEdlbmVyYXRvci5qYXZhCmluZGV4IGFkMDUxODYuLmVhZWMzMDUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9EZXB0aEdlbmVyYXRvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9EZXB0aEdlbmVyYXRvci5qYXZhCkBAIC0xMTMsNyArMTEzLDcgQEAgaW50IG91dHB1dFR5cGUoKSB7CiAJfQogCiAJQE92ZXJyaWRlCi0Jdm9pZCBzaGFyZUZyZWVMaXN0KGZpbmFsIEJsb2NrUmV2UXVldWUgcSkgeworCXZvaWQgc2hhcmVGcmVlTGlzdChCbG9ja1JldlF1ZXVlIHEpIHsKIAkJcGVuZGluZy5zaGFyZUZyZWVMaXN0KHEpOwogCX0KIApAQCAtMTM0LDcgKzEzNCw3IEBAIFJldkNvbW1pdCBuZXh0KCkgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCiAKIAkJCWludCBuZXdEZXB0aCA9IGMuZGVwdGggKyAxOwogCi0JCQlmb3IgKGZpbmFsIFJldkNvbW1pdCBwIDogYy5wYXJlbnRzKSB7CisJCQlmb3IgKFJldkNvbW1pdCBwIDogYy5wYXJlbnRzKSB7CiAJCQkJRGVwdGhXYWxrLkNvbW1pdCBkcCA9IChEZXB0aFdhbGsuQ29tbWl0KSBwOwogCiAJCQkJLy8gSWYgbm8gZGVwdGggaGFzIGJlZW4gYXNzaWduZWQgdG8gdGhpcyBjb21taXQsIGFzc2lnbgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0ZJRk9SZXZRdWV1ZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0ZJRk9SZXZRdWV1ZS5qYXZhCmluZGV4IDYzYjc5OTAuLmNkYjA4NGMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9GSUZPUmV2UXVldWUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvRklGT1JldlF1ZXVlLmphdmEKQEAgLTYzLDE0ICs2MywxNCBAQCBwdWJsaWMgRklGT1JldlF1ZXVlKCkgewogCQlzdXBlcigpOwogCX0KIAotCUZJRk9SZXZRdWV1ZShmaW5hbCBHZW5lcmF0b3IgcykgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCisJRklGT1JldlF1ZXVlKEdlbmVyYXRvciBzKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKIAkJCUluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJc3VwZXIocyk7CiAJfQogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGQoZmluYWwgUmV2Q29tbWl0IGMpIHsKKwlwdWJsaWMgdm9pZCBhZGQoUmV2Q29tbWl0IGMpIHsKIAkJQmxvY2sgYiA9IHRhaWw7CiAJCWlmIChiID09IG51bGwpIHsKIAkJCWIgPSBmcmVlLm5ld0Jsb2NrKCk7CkBAIC05Miw3ICs5Miw3IEBAIHB1YmxpYyB2b2lkIGFkZChmaW5hbCBSZXZDb21taXQgYykgewogCSAqIEBwYXJhbSBjCiAJICogICAgICAgICAgICB0aGUgY29tbWl0IHRvIGluc2VydCBpbnRvIHRoZSBxdWV1ZS4KIAkgKi8KLQlwdWJsaWMgdm9pZCB1bnBvcChmaW5hbCBSZXZDb21taXQgYykgeworCXB1YmxpYyB2b2lkIHVucG9wKFJldkNvbW1pdCBjKSB7CiAJCUJsb2NrIGIgPSBoZWFkOwogCQlpZiAoYiA9PSBudWxsKSB7CiAJCQliID0gZnJlZS5uZXdCbG9jaygpOwpAQCAtMTM5LDcgKzEzOSw3IEBAIHB1YmxpYyB2b2lkIGNsZWFyKCkgewogCX0KIAogCUBPdmVycmlkZQotCWJvb2xlYW4gZXZlcmJvZHlIYXNGbGFnKGZpbmFsIGludCBmKSB7CisJYm9vbGVhbiBldmVyYm9keUhhc0ZsYWcoaW50IGYpIHsKIAkJZm9yIChCbG9jayBiID0gaGVhZDsgYiAhPSBudWxsOyBiID0gYi5uZXh0KSB7CiAJCQlmb3IgKGludCBpID0gYi5oZWFkSW5kZXg7IGkgPCBiLnRhaWxJbmRleDsgaSsrKQogCQkJCWlmICgoYi5jb21taXRzW2ldLmZsYWdzICYgZikgPT0gMCkKQEAgLTE0OSw3ICsxNDksNyBAQCBib29sZWFuIGV2ZXJib2R5SGFzRmxhZyhmaW5hbCBpbnQgZikgewogCX0KIAogCUBPdmVycmlkZQotCWJvb2xlYW4gYW55Ym9keUhhc0ZsYWcoZmluYWwgaW50IGYpIHsKKwlib29sZWFuIGFueWJvZHlIYXNGbGFnKGludCBmKSB7CiAJCWZvciAoQmxvY2sgYiA9IGhlYWQ7IGIgIT0gbnVsbDsgYiA9IGIubmV4dCkgewogCQkJZm9yIChpbnQgaSA9IGIuaGVhZEluZGV4OyBpIDwgYi50YWlsSW5kZXg7IGkrKykKIAkJCQlpZiAoKGIuY29tbWl0c1tpXS5mbGFncyAmIGYpICE9IDApCkBAIC0xNTgsNyArMTU4LDcgQEAgYm9vbGVhbiBhbnlib2R5SGFzRmxhZyhmaW5hbCBpbnQgZikgewogCQlyZXR1cm4gZmFsc2U7CiAJfQogCi0Jdm9pZCByZW1vdmVGbGFnKGZpbmFsIGludCBmKSB7CisJdm9pZCByZW1vdmVGbGFnKGludCBmKSB7CiAJCWZpbmFsIGludCBub3RfZiA9IH5mOwogCQlmb3IgKEJsb2NrIGIgPSBoZWFkOyBiICE9IG51bGw7IGIgPSBiLm5leHQpIHsKIAkJCWZvciAoaW50IGkgPSBiLmhlYWRJbmRleDsgaSA8IGIudGFpbEluZGV4OyBpKyspCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvRml4VW5pbnRlcmVzdGluZ0dlbmVyYXRvci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0ZpeFVuaW50ZXJlc3RpbmdHZW5lcmF0b3IuamF2YQppbmRleCA5ZDczNGE3Li40ZTZkN2U2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvRml4VW5pbnRlcmVzdGluZ0dlbmVyYXRvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9GaXhVbmludGVyZXN0aW5nR2VuZXJhdG9yLmphdmEKQEAgLTYxLDcgKzYxLDcgQEAKIGZpbmFsIGNsYXNzIEZpeFVuaW50ZXJlc3RpbmdHZW5lcmF0b3IgZXh0ZW5kcyBHZW5lcmF0b3IgewogCXByaXZhdGUgZmluYWwgR2VuZXJhdG9yIHBlbmRpbmc7CiAKLQlGaXhVbmludGVyZXN0aW5nR2VuZXJhdG9yKGZpbmFsIEdlbmVyYXRvciBnKSB7CisJRml4VW5pbnRlcmVzdGluZ0dlbmVyYXRvcihHZW5lcmF0b3IgZykgewogCQlwZW5kaW5nID0gZzsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9Gb2xsb3dGaWx0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9Gb2xsb3dGaWx0ZXIuamF2YQppbmRleCAyZGE5N2M4Li5kYWUzYWFjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvRm9sbG93RmlsdGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0ZvbGxvd0ZpbHRlci5qYXZhCkBAIC05NSw3ICs5NSw3IEBAIHB1YmxpYyBzdGF0aWMgRm9sbG93RmlsdGVyIGNyZWF0ZShTdHJpbmcgcGF0aCwgRGlmZkNvbmZpZyBjZmcpIHsKIAogCXByaXZhdGUgUmVuYW1lQ2FsbGJhY2sgcmVuYW1lQ2FsbGJhY2s7CiAKLQlGb2xsb3dGaWx0ZXIoZmluYWwgUGF0aEZpbHRlciBwYXRoLCBmaW5hbCBEaWZmQ29uZmlnIGNmZykgeworCUZvbGxvd0ZpbHRlcihQYXRoRmlsdGVyIHBhdGgsIERpZmZDb25maWcgY2ZnKSB7CiAJCXRoaXMucGF0aCA9IHBhdGg7CiAJCXRoaXMuY2ZnID0gY2ZnOwogCX0KQEAgLTExMiw3ICsxMTIsNyBAQCBwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoZmluYWwgVHJlZVdhbGsgd2Fsa2VyKQorCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoVHJlZVdhbGsgd2Fsa2VyKQogCQkJdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sCiAJCQlJT0V4Y2VwdGlvbiB7CiAJCXJldHVybiBwYXRoLmluY2x1ZGUod2Fsa2VyKSAmJiBBTllfRElGRi5pbmNsdWRlKHdhbGtlcik7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvRm9vdGVyS2V5LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvRm9vdGVyS2V5LmphdmEKaW5kZXggMzYwYmUyOS4uNDVkNWY4MCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0Zvb3RlcktleS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9Gb290ZXJLZXkuamF2YQpAQCAtNzAsNyArNzAsNyBAQCBwdWJsaWMgZmluYWwgY2xhc3MgRm9vdGVyS2V5IHsKIAkgKiBAcGFyYW0ga2V5TmFtZQogCSAqICAgICAgICAgICAgbmFtZSBvZiB0aGUgZm9vdGVyIGxpbmUuCiAJICovCi0JcHVibGljIEZvb3RlcktleShmaW5hbCBTdHJpbmcga2V5TmFtZSkgeworCXB1YmxpYyBGb290ZXJLZXkoU3RyaW5nIGtleU5hbWUpIHsKIAkJbmFtZSA9IGtleU5hbWU7CiAJCXJhdyA9IENvbnN0YW50cy5lbmNvZGUoa2V5TmFtZS50b0xvd2VyQ2FzZShMb2NhbGUuUk9PVCkpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9Gb290ZXJMaW5lLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvRm9vdGVyTGluZS5qYXZhCmluZGV4IDA3NGNlODIuLmQ2ZmVkNjYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9Gb290ZXJMaW5lLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0Zvb3RlckxpbmUuamF2YQpAQCAtODYsNyArODYsNyBAQCBwdWJsaWMgZmluYWwgY2xhc3MgRm9vdGVyTGluZSB7CiAJICogICAgICAgICAgICBrZXkgdG8gdGVzdCB0aGlzIGxpbmUncyBrZXkgbmFtZSBhZ2FpbnN0LgogCSAqIEByZXR1cm4gdHJ1ZSBpZiB7QGNvZGUga2V5LmdldE5hbWUoKS5lcXVhbHNJZ25vcmVjYXNlKGdldEtleSgpKX0uCiAJICovCi0JcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhmaW5hbCBGb290ZXJLZXkga2V5KSB7CisJcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhGb290ZXJLZXkga2V5KSB7CiAJCWZpbmFsIGJ5dGVbXSBrUmF3ID0ga2V5LnJhdzsKIAkJZmluYWwgaW50IGxlbiA9IGtSYXcubGVuZ3RoOwogCQlpbnQgYlB0ciA9IGtleVN0YXJ0OwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0dlbmVyYXRvci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0dlbmVyYXRvci5qYXZhCmluZGV4IGE5NTMwM2IuLmIyYzkyZWEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9HZW5lcmF0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvR2VuZXJhdG9yLmphdmEKQEAgLTgxLDcgKzgxLDcgQEAgYWJzdHJhY3QgY2xhc3MgR2VuZXJhdG9yIHsKIAkgKiBAcGFyYW0gcQogCSAqICAgICAgICAgICAgYW5vdGhlciBGSUZPIHF1ZXVlIHRoYXQgd2FudHMgdG8gc2hhcmUgb3VyIHF1ZXVlJ3MgZnJlZSBsaXN0LgogCSAqLwotCXZvaWQgc2hhcmVGcmVlTGlzdChmaW5hbCBCbG9ja1JldlF1ZXVlIHEpIHsKKwl2b2lkIHNoYXJlRnJlZUxpc3QoQmxvY2tSZXZRdWV1ZSBxKSB7CiAJCS8vIERvIG5vdGhpbmcgYnkgZGVmYXVsdC4KIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9MSUZPUmV2UXVldWUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9MSUZPUmV2UXVldWUuamF2YQppbmRleCBmNzM0YjY5Li44NDZiOGQ5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvTElGT1JldlF1ZXVlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0xJRk9SZXZRdWV1ZS5qYXZhCkBAIC02MiwxNCArNjIsMTQgQEAgcHVibGljIExJRk9SZXZRdWV1ZSgpIHsKIAkJc3VwZXIoKTsKIAl9CiAKLQlMSUZPUmV2UXVldWUoZmluYWwgR2VuZXJhdG9yIHMpIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAorCUxJRk9SZXZRdWV1ZShHZW5lcmF0b3IgcykgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCiAJCQlJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCXN1cGVyKHMpOwogCX0KIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkKGZpbmFsIFJldkNvbW1pdCBjKSB7CisJcHVibGljIHZvaWQgYWRkKFJldkNvbW1pdCBjKSB7CiAJCUJsb2NrIGIgPSBoZWFkOwogCQlpZiAoYiA9PSBudWxsIHx8ICFiLmNhblVucG9wKCkpIHsKIAkJCWIgPSBmcmVlLm5ld0Jsb2NrKCk7CkBAIC0xMDMsNyArMTAzLDcgQEAgcHVibGljIHZvaWQgY2xlYXIoKSB7CiAJfQogCiAJQE92ZXJyaWRlCi0JYm9vbGVhbiBldmVyYm9keUhhc0ZsYWcoZmluYWwgaW50IGYpIHsKKwlib29sZWFuIGV2ZXJib2R5SGFzRmxhZyhpbnQgZikgewogCQlmb3IgKEJsb2NrIGIgPSBoZWFkOyBiICE9IG51bGw7IGIgPSBiLm5leHQpIHsKIAkJCWZvciAoaW50IGkgPSBiLmhlYWRJbmRleDsgaSA8IGIudGFpbEluZGV4OyBpKyspCiAJCQkJaWYgKChiLmNvbW1pdHNbaV0uZmxhZ3MgJiBmKSA9PSAwKQpAQCAtMTEzLDcgKzExMyw3IEBAIGJvb2xlYW4gZXZlcmJvZHlIYXNGbGFnKGZpbmFsIGludCBmKSB7CiAJfQogCiAJQE92ZXJyaWRlCi0JYm9vbGVhbiBhbnlib2R5SGFzRmxhZyhmaW5hbCBpbnQgZikgeworCWJvb2xlYW4gYW55Ym9keUhhc0ZsYWcoaW50IGYpIHsKIAkJZm9yIChCbG9jayBiID0gaGVhZDsgYiAhPSBudWxsOyBiID0gYi5uZXh0KSB7CiAJCQlmb3IgKGludCBpID0gYi5oZWFkSW5kZXg7IGkgPCBiLnRhaWxJbmRleDsgaSsrKQogCQkJCWlmICgoYi5jb21taXRzW2ldLmZsYWdzICYgZikgIT0gMCkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9NZXJnZUJhc2VHZW5lcmF0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9NZXJnZUJhc2VHZW5lcmF0b3IuamF2YQppbmRleCA3M2NlOTg1Li4yZmU5NTMxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvTWVyZ2VCYXNlR2VuZXJhdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL01lcmdlQmFzZUdlbmVyYXRvci5qYXZhCkBAIC04NCwxMiArODQsMTIgQEAgY2xhc3MgTWVyZ2VCYXNlR2VuZXJhdG9yIGV4dGVuZHMgR2VuZXJhdG9yIHsKIAogCXByaXZhdGUgQ2FycnlTdGFjayBzdGFjazsKIAotCU1lcmdlQmFzZUdlbmVyYXRvcihmaW5hbCBSZXZXYWxrIHcpIHsKKwlNZXJnZUJhc2VHZW5lcmF0b3IoUmV2V2FsayB3KSB7CiAJCXdhbGtlciA9IHc7CiAJCXBlbmRpbmcgPSBuZXcgRGF0ZVJldlF1ZXVlKCk7CiAJfQogCi0Jdm9pZCBpbml0KGZpbmFsIEFic3RyYWN0UmV2UXVldWUgcCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwl2b2lkIGluaXQoQWJzdHJhY3RSZXZRdWV1ZSBwKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl0cnkgewogCQkJZm9yICg7OykgewogCQkJCWZpbmFsIFJldkNvbW1pdCBjID0gcC5uZXh0KCk7CkBAIC0xMTksNyArMTE5LDcgQEAgdm9pZCBpbml0KGZpbmFsIEFic3RyYWN0UmV2UXVldWUgcCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJfQogCX0KIAotCXByaXZhdGUgdm9pZCBhZGQoZmluYWwgUmV2Q29tbWl0IGMpIHsKKwlwcml2YXRlIHZvaWQgYWRkKFJldkNvbW1pdCBjKSB7CiAJCWZpbmFsIGludCBmbGFnID0gd2Fsa2VyLmFsbG9jRmxhZygpOwogCQlicmFuY2hNYXNrIHw9IGZsYWc7CiAJCWlmICgoYy5mbGFncyAmIGJyYW5jaE1hc2spICE9IDApIHsKQEAgLTE0Niw3ICsxNDYsNyBAQCBwcml2YXRlIFJldkNvbW1pdCBfbmV4dCgpIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAogCQkJCXJldHVybiBudWxsOwogCQkJfQogCi0JCQlmb3IgKGZpbmFsIFJldkNvbW1pdCBwIDogYy5wYXJlbnRzKSB7CisJCQlmb3IgKFJldkNvbW1pdCBwIDogYy5wYXJlbnRzKSB7CiAJCQkJaWYgKChwLmZsYWdzICYgSU5fUEVORElORykgIT0gMCkKIAkJCQkJY29udGludWU7CiAJCQkJaWYgKChwLmZsYWdzICYgUEFSU0VEKSA9PSAwKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL09iamVjdFdhbGsuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9PYmplY3RXYWxrLmphdmEKaW5kZXggMjVjM2UxMi4uZTU5MDNjOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL09iamVjdFdhbGsuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvT2JqZWN0V2Fsay5qYXZhCkBAIC0xMTksNyArMTE5LDcgQEAgcHVibGljIGNsYXNzIE9iamVjdFdhbGsgZXh0ZW5kcyBSZXZXYWxrIHsKIAkgKiBAcGFyYW0gcmVwbwogCSAqICAgICAgICAgICAgdGhlIHJlcG9zaXRvcnkgdGhlIHdhbGtlciB3aWxsIG9idGFpbiBkYXRhIGZyb20uCiAJICovCi0JcHVibGljIE9iamVjdFdhbGsoZmluYWwgUmVwb3NpdG9yeSByZXBvKSB7CisJcHVibGljIE9iamVjdFdhbGsoUmVwb3NpdG9yeSByZXBvKSB7CiAJCXRoaXMocmVwby5uZXdPYmplY3RSZWFkZXIoKSk7CiAJfQogCkBAIC02OTksNyArNjk5LDcgQEAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcmVzZXQoZmluYWwgaW50IHJldGFpbkZsYWdzKSB7CisJcHJvdGVjdGVkIHZvaWQgcmVzZXQoaW50IHJldGFpbkZsYWdzKSB7CiAJCXN1cGVyLnJlc2V0KHJldGFpbkZsYWdzKTsKIAogCQlmb3IgKFJldk9iamVjdCBvYmogOiByb290T2JqZWN0cykKQEAgLTcxMSw3ICs3MTEsNyBAQCBwcm90ZWN0ZWQgdm9pZCByZXNldChmaW5hbCBpbnQgcmV0YWluRmxhZ3MpIHsKIAkJZnJlZVZpc2l0ID0gbnVsbDsKIAl9CiAKLQlwcml2YXRlIHZvaWQgYWRkT2JqZWN0KGZpbmFsIFJldk9iamVjdCBvKSB7CisJcHJpdmF0ZSB2b2lkIGFkZE9iamVjdChSZXZPYmplY3QgbykgewogCQlpZiAoKG8uZmxhZ3MgJiBJTl9QRU5ESU5HKSA9PSAwKSB7CiAJCQlvLmZsYWdzIHw9IElOX1BFTkRJTkc7CiAJCQlyb290T2JqZWN0cy5hZGQobyk7CkBAIC03MTksNyArNzE5LDcgQEAgcHJpdmF0ZSB2b2lkIGFkZE9iamVjdChmaW5hbCBSZXZPYmplY3QgbykgewogCQl9CiAJfQogCi0JcHJpdmF0ZSB2b2lkIG1hcmtUcmVlVW5pbnRlcmVzdGluZyhmaW5hbCBSZXZUcmVlIHRyZWUpCisJcHJpdmF0ZSB2b2lkIG1hcmtUcmVlVW5pbnRlcmVzdGluZyhSZXZUcmVlIHRyZWUpCiAJCQl0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwKIAkJCUlPRXhjZXB0aW9uIHsKIAkJaWYgKCh0cmVlLmZsYWdzICYgVU5JTlRFUkVTVElORykgIT0gMCkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9QZW5kaW5nR2VuZXJhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUGVuZGluZ0dlbmVyYXRvci5qYXZhCmluZGV4IDk0YWUyYzkuLmU2MDdiN2QgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9QZW5kaW5nR2VuZXJhdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1BlbmRpbmdHZW5lcmF0b3IuamF2YQpAQCAtMTQwLDcgKzE0MCw3IEBAIFJldkNvbW1pdCBuZXh0KCkgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCiAJCQkJCXByb2R1Y2UgPSBmaWx0ZXIuaW5jbHVkZSh3YWxrZXIsIGMpOwogCQkJCX0KIAotCQkJCWZvciAoZmluYWwgUmV2Q29tbWl0IHAgOiBjLnBhcmVudHMpIHsKKwkJCQlmb3IgKFJldkNvbW1pdCBwIDogYy5wYXJlbnRzKSB7CiAJCQkJCWlmICgocC5mbGFncyAmIFNFRU4pICE9IDApCiAJCQkJCQljb250aW51ZTsKIAkJCQkJaWYgKChwLmZsYWdzICYgUEFSU0VEKSA9PSAwKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldkJsb2IuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZCbG9iLmphdmEKaW5kZXggZDM1MjkyOS4uY2M1ZTNlNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldkJsb2IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2QmxvYi5qYXZhCkBAIC02Miw3ICs2Miw3IEBAIHB1YmxpYyBjbGFzcyBSZXZCbG9iIGV4dGVuZHMgUmV2T2JqZWN0IHsKIAkgKiBAcGFyYW0gaWQKIAkgKiAgICAgICAgICAgIG9iamVjdCBuYW1lIGZvciB0aGUgYmxvYi4KIAkgKi8KLQlwcm90ZWN0ZWQgUmV2QmxvYihmaW5hbCBBbnlPYmplY3RJZCBpZCkgeworCXByb3RlY3RlZCBSZXZCbG9iKEFueU9iamVjdElkIGlkKSB7CiAJCXN1cGVyKGlkKTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZDb21taXQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZDb21taXQuamF2YQppbmRleCA5ZGIxNDY3Li5iNjdmOTM0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2Q29tbWl0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldkNvbW1pdC5qYXZhCkBAIC00NCw3ICs0NCw3IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKQEAgLTE0OCwxOCArMTQ4LDE4IEBAIHB1YmxpYyBzdGF0aWMgUmV2Q29tbWl0IHBhcnNlKFJldldhbGsgcncsIGJ5dGVbXSByYXcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJICogQHBhcmFtIGlkCiAJICogICAgICAgICAgICBvYmplY3QgbmFtZSBmb3IgdGhlIGNvbW1pdC4KIAkgKi8KLQlwcm90ZWN0ZWQgUmV2Q29tbWl0KGZpbmFsIEFueU9iamVjdElkIGlkKSB7CisJcHJvdGVjdGVkIFJldkNvbW1pdChBbnlPYmplY3RJZCBpZCkgewogCQlzdXBlcihpZCk7CiAJfQogCiAJQE92ZXJyaWRlCi0Jdm9pZCBwYXJzZUhlYWRlcnMoZmluYWwgUmV2V2FsayB3YWxrKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKKwl2b2lkIHBhcnNlSGVhZGVycyhSZXZXYWxrIHdhbGspIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAogCQkJSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQlwYXJzZUNhbm9uaWNhbCh3YWxrLCB3YWxrLmdldENhY2hlZEJ5dGVzKHRoaXMpKTsKIAl9CiAKIAlAT3ZlcnJpZGUKLQl2b2lkIHBhcnNlQm9keShmaW5hbCBSZXZXYWxrIHdhbGspIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAorCXZvaWQgcGFyc2VCb2R5KFJldldhbGsgd2FsaykgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCiAJCQlJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCWlmIChidWZmZXIgPT0gbnVsbCkgewogCQkJYnVmZmVyID0gd2Fsay5nZXRDYWNoZWRCeXRlcyh0aGlzKTsKQEAgLTE2OCw3ICsxNjgsNyBAQCB2b2lkIHBhcnNlQm9keShmaW5hbCBSZXZXYWxrIHdhbGspIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAogCQl9CiAJfQogCi0Jdm9pZCBwYXJzZUNhbm9uaWNhbChmaW5hbCBSZXZXYWxrIHdhbGssIGZpbmFsIGJ5dGVbXSByYXcpCisJdm9pZCBwYXJzZUNhbm9uaWNhbChSZXZXYWxrIHdhbGssIGJ5dGVbXSByYXcpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlpZiAoIXdhbGsuc2hhbGxvd0NvbW1pdHNJbml0aWFsaXplZCkKIAkJCXdhbGsuaW5pdGlhbGl6ZVNoYWxsb3dDb21taXRzKCk7CkBAIC0zMTAsNyArMzEwLDcgQEAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjYXJyeU9uZVN0ZXAoRklGT1JldlF1ZXVlIHEsIGludCBjYXJyeSwgUmV2Q29tbWl0IGMpIHsKIAkgKiBAcGFyYW0gZmxhZwogCSAqICAgICAgICAgICAgdGhlIHNpbmdsZSBmbGFnIHZhbHVlIHRvIGNhcnJ5IGJhY2sgb250byBwYXJlbnRzLgogCSAqLwotCXB1YmxpYyB2b2lkIGNhcnJ5KGZpbmFsIFJldkZsYWcgZmxhZykgeworCXB1YmxpYyB2b2lkIGNhcnJ5KFJldkZsYWcgZmxhZykgewogCQlmaW5hbCBpbnQgY2FycnkgPSBmbGFncyAmIGZsYWcubWFzazsKIAkJaWYgKGNhcnJ5ICE9IDApCiAJCQljYXJyeUZsYWdzKHRoaXMsIGNhcnJ5KTsKQEAgLTM1Myw3ICszNTMsNyBAQCBwdWJsaWMgZmluYWwgaW50IGdldFBhcmVudENvdW50KCkgewogCSAqIEB0aHJvd3MgamF2YS5sYW5nLkFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIGFuIGludmFsaWQgcGFyZW50IGluZGV4IHdhcyBzcGVjaWZpZWQuCiAJICovCi0JcHVibGljIGZpbmFsIFJldkNvbW1pdCBnZXRQYXJlbnQoZmluYWwgaW50IG50aCkgeworCXB1YmxpYyBmaW5hbCBSZXZDb21taXQgZ2V0UGFyZW50KGludCBudGgpIHsKIAkJcmV0dXJuIHBhcmVudHNbbnRoXTsKIAl9CiAKQEAgLTQ5MCw3ICs0OTAsNyBAQCBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFNob3J0TWVzc2FnZSgpIHsKIAkJcmV0dXJuIHN0cjsKIAl9CiAKLQlzdGF0aWMgYm9vbGVhbiBoYXNMRihmaW5hbCBieXRlW10gciwgaW50IGIsIGZpbmFsIGludCBlKSB7CisJc3RhdGljIGJvb2xlYW4gaGFzTEYoYnl0ZVtdIHIsIGludCBiLCBpbnQgZSkgewogCQl3aGlsZSAoYiA8IGUpCiAJCQlpZiAocltiKytdID09ICdcbicpCiAJCQkJcmV0dXJuIHRydWU7CkBAIC01MzksNyArNTM5LDcgQEAgcHJpdmF0ZSBDaGFyc2V0IGd1ZXNzRW5jb2RpbmcoKSB7CiAJCXRyeSB7CiAJCQlyZXR1cm4gZ2V0RW5jb2RpbmcoKTsKIAkJfSBjYXRjaCAoSWxsZWdhbENoYXJzZXROYW1lRXhjZXB0aW9uIHwgVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBVVEZfODsKKwkJCXJldHVybiBDSEFSU0VUOwogCQl9CiAJfQogCkBAIC02MTUsNyArNjE1LDcgQEAgcHVibGljIGZpbmFsIExpc3Q8Rm9vdGVyTGluZT4gZ2V0Rm9vdGVyTGluZXMoKSB7CiAJICogICAgICAgICB3aXRoIHRoZSBzcGVjaWZpZWQga2V5LCBvciB0aGVyZSBhcmUgbm8gZm9vdGVycyBhdCBhbGwuCiAJICogQHNlZSAjZ2V0Rm9vdGVyTGluZXMoKQogCSAqLwotCXB1YmxpYyBmaW5hbCBMaXN0PFN0cmluZz4gZ2V0Rm9vdGVyTGluZXMoZmluYWwgU3RyaW5nIGtleU5hbWUpIHsKKwlwdWJsaWMgZmluYWwgTGlzdDxTdHJpbmc+IGdldEZvb3RlckxpbmVzKFN0cmluZyBrZXlOYW1lKSB7CiAJCXJldHVybiBnZXRGb290ZXJMaW5lcyhuZXcgRm9vdGVyS2V5KGtleU5hbWUpKTsKIAl9CiAKQEAgLTYzMCwxMiArNjMwLDEyIEBAIHB1YmxpYyBmaW5hbCBMaXN0PFN0cmluZz4gZ2V0Rm9vdGVyTGluZXMoZmluYWwgU3RyaW5nIGtleU5hbWUpIHsKIAkgKiAgICAgICAgIHdpdGggdGhlIHNwZWNpZmllZCBrZXksIG9yIHRoZXJlIGFyZSBubyBmb290ZXJzIGF0IGFsbC4KIAkgKiBAc2VlICNnZXRGb290ZXJMaW5lcygpCiAJICovCi0JcHVibGljIGZpbmFsIExpc3Q8U3RyaW5nPiBnZXRGb290ZXJMaW5lcyhmaW5hbCBGb290ZXJLZXkga2V5TmFtZSkgeworCXB1YmxpYyBmaW5hbCBMaXN0PFN0cmluZz4gZ2V0Rm9vdGVyTGluZXMoRm9vdGVyS2V5IGtleU5hbWUpIHsKIAkJZmluYWwgTGlzdDxGb290ZXJMaW5lPiBzcmMgPSBnZXRGb290ZXJMaW5lcygpOwogCQlpZiAoc3JjLmlzRW1wdHkoKSkKIAkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKIAkJZmluYWwgQXJyYXlMaXN0PFN0cmluZz4gciA9IG5ldyBBcnJheUxpc3Q8PihzcmMuc2l6ZSgpKTsKLQkJZm9yIChmaW5hbCBGb290ZXJMaW5lIGYgOiBzcmMpIHsKKwkJZm9yIChGb290ZXJMaW5lIGYgOiBzcmMpIHsKIAkJCWlmIChmLm1hdGNoZXMoa2V5TmFtZSkpCiAJCQkJci5hZGQoZi5nZXRWYWx1ZSgpKTsKIAkJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldkNvbW1pdExpc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZDb21taXRMaXN0LmphdmEKaW5kZXggMzhjZjNmNS4uZDJmZGEyZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldkNvbW1pdExpc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2Q29tbWl0TGlzdC5qYXZhCkBAIC05MSw3ICs5MSw3IEBAIHB1YmxpYyB2b2lkIGNsZWFyKCkgewogCSAqICAgICAgICAgICAgIG9iamVjdCB0aGF0IHNob3VsZCBiZSBwcmVzZW50IHdhcyBub3QgZm91bmQuIFJlcG9zaXRvcnkKIAkgKiAgICAgICAgICAgICBjb3JydXB0aW9uIG1heSBoYXZlIG9jY3VycmVkLgogCSAqLwotCXB1YmxpYyB2b2lkIGFwcGx5RmxhZyhmaW5hbCBSZXZGaWx0ZXIgbWF0Y2hpbmcsIGZpbmFsIFJldkZsYWcgZmxhZykKKwlwdWJsaWMgdm9pZCBhcHBseUZsYWcoUmV2RmlsdGVyIG1hdGNoaW5nLCBSZXZGbGFnIGZsYWcpCiAJCQl0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwKIAkJCUlPRXhjZXB0aW9uIHsKIAkJYXBwbHlGbGFnKG1hdGNoaW5nLCBmbGFnLCAwLCBzaXplKCkpOwpAQCAtMTY1LDcgKzE2NSw3IEBAIHB1YmxpYyB2b2lkIGFwcGx5RmxhZyhmaW5hbCBSZXZGaWx0ZXIgbWF0Y2hpbmcsIGZpbmFsIFJldkZsYWcgZmxhZywKIAkgKiAgICAgICAgICAgIHRoZSBmbGFnIHRvIHJlbW92ZS4gQXBwbGljYXRpb25zIGFyZSByZXNwb25zaWJsZSBmb3IKIAkgKiAgICAgICAgICAgIGFsbG9jYXRpbmcgdGhpcyBmbGFnIGZyb20gdGhlIHNvdXJjZSBSZXZXYWxrLgogCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFyRmxhZyhmaW5hbCBSZXZGbGFnIGZsYWcpIHsKKwlwdWJsaWMgdm9pZCBjbGVhckZsYWcoUmV2RmxhZyBmbGFnKSB7CiAJCWNsZWFyRmxhZyhmbGFnLCAwLCBzaXplKCkpOwogCX0KIApAQCAtMjA3LDcgKzIwNyw3IEBAIHB1YmxpYyB2b2lkIGNsZWFyRmxhZyhmaW5hbCBSZXZGbGFnIGZsYWcsIGZpbmFsIGludCByYW5nZUJlZ2luLAogCSAqIEByZXR1cm4gaW5kZXggb2YgdGhlIGZpcnN0IGNvbW1pdCBhdCBvciBhZnRlciBpbmRleCA8Y29kZT5iZWdpbjwvY29kZT4KIAkgKiAgICAgICAgIHRoYXQgaGFzIHRoZSBzcGVjaWZpZWQgZmxhZyBzZXQgb24gaXQ7IC0xIGlmIG5vIG1hdGNoIGlzIGZvdW5kLgogCSAqLwotCXB1YmxpYyBpbnQgaW5kZXhPZihmaW5hbCBSZXZGbGFnIGZsYWcsIGludCBiZWdpbikgeworCXB1YmxpYyBpbnQgaW5kZXhPZihSZXZGbGFnIGZsYWcsIGludCBiZWdpbikgewogCQl3aGlsZSAoYmVnaW4gPCBzaXplKCkpIHsKIAkJCWludCBpbmRleCA9IGJlZ2luOwogCQkJQmxvY2sgcyA9IGNvbnRlbnRzOwpAQCAtMjM4LDcgKzIzOCw3IEBAIHB1YmxpYyBpbnQgaW5kZXhPZihmaW5hbCBSZXZGbGFnIGZsYWcsIGludCBiZWdpbikgewogCSAqIEByZXR1cm4gaW5kZXggb2YgdGhlIGZpcnN0IGNvbW1pdCBhdCBvciBiZWZvcmUgaW5kZXggPGNvZGU+YmVnaW48L2NvZGU+CiAJICogICAgICAgICB0aGF0IGhhcyB0aGUgc3BlY2lmaWVkIGZsYWcgc2V0IG9uIGl0OyAtMSBpZiBubyBtYXRjaCBpcyBmb3VuZC4KIAkgKi8KLQlwdWJsaWMgaW50IGxhc3RJbmRleE9mKGZpbmFsIFJldkZsYWcgZmxhZywgaW50IGJlZ2luKSB7CisJcHVibGljIGludCBsYXN0SW5kZXhPZihSZXZGbGFnIGZsYWcsIGludCBiZWdpbikgewogCQliZWdpbiA9IE1hdGgubWluKGJlZ2luLCBzaXplKCkgLSAxKTsKIAkJd2hpbGUgKGJlZ2luID49IDApIHsKIAkJCWludCBpbmRleCA9IGJlZ2luOwpAQCAtMjY1LDcgKzI2NSw3IEBAIHB1YmxpYyBpbnQgbGFzdEluZGV4T2YoZmluYWwgUmV2RmxhZyBmbGFnLCBpbnQgYmVnaW4pIHsKIAkgKiAgICAgICAgICAgIHRoZSB3YWxrZXIgdG8gcG9wdWxhdGUgZnJvbS4KIAkgKiBAc2VlICNmaWxsVG8oaW50KQogCSAqLwotCXB1YmxpYyB2b2lkIHNvdXJjZShmaW5hbCBSZXZXYWxrIHcpIHsKKwlwdWJsaWMgdm9pZCBzb3VyY2UoUmV2V2FsayB3KSB7CiAJCXdhbGtlciA9IHc7CiAJfQogCkBAIC0yOTksNyArMjk5LDcgQEAgcHVibGljIGJvb2xlYW4gaXNQZW5kaW5nKCkgewogCSAqICAgICAgICAgICAgIHNlZSB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldldhbGsjbmV4dCgpfQogCSAqLwogCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyB2b2lkIGZpbGxUbyhmaW5hbCBpbnQgaGlnaE1hcmspIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAorCXB1YmxpYyB2b2lkIGZpbGxUbyhpbnQgaGlnaE1hcmspIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAogCQkJSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQlpZiAod2Fsa2VyID09IG51bGwgfHwgc2l6ZSA+IGhpZ2hNYXJrKQogCQkJcmV0dXJuOwpAQCAtMzY0LDcgKzM2NCw3IEBAIHB1YmxpYyB2b2lkIGZpbGxUbyhmaW5hbCBpbnQgaGlnaE1hcmspIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAogCSAqICAgICAgICAgICAgIHNlZSB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldldhbGsjbmV4dCgpfQogCSAqLwogCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyB2b2lkIGZpbGxUbyhmaW5hbCBSZXZDb21taXQgY29tbWl0VG9Mb2FkLCBpbnQgaGlnaE1hcmspCisJcHVibGljIHZvaWQgZmlsbFRvKFJldkNvbW1pdCBjb21taXRUb0xvYWQsIGludCBoaWdoTWFyaykKIAkJCXRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLAogCQkJSU9FeGNlcHRpb24gewogCQlpZiAod2Fsa2VyID09IG51bGwgfHwgY29tbWl0VG9Mb2FkID09IG51bGwKQEAgLTQxOSw3ICs0MTksNyBAQCBwdWJsaWMgdm9pZCBmaWxsVG8oZmluYWwgUmV2Q29tbWl0IGNvbW1pdFRvTG9hZCwgaW50IGhpZ2hNYXJrKQogCSAqIEBwYXJhbSBlCiAJICogICAgICAgICAgICB0aGUgb2JqZWN0IGJlaW5nIGFkZGVkIChvciBzZXQpIGludG8gdGhlIGxpc3QuCiAJICovCi0JcHJvdGVjdGVkIHZvaWQgZW50ZXIoZmluYWwgaW50IGluZGV4LCBmaW5hbCBFIGUpIHsKKwlwcm90ZWN0ZWQgdm9pZCBlbnRlcihpbnQgaW5kZXgsIEUgZSkgewogCQkvLyBEbyBub3RoaW5nIGJ5IGRlZmF1bHQuCiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldkZsYWcuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZGbGFnLmphdmEKaW5kZXggMWU3OTg2Ny4uNDEzYTU1MiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldkZsYWcuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2RmxhZy5qYXZhCkBAIC04NSw3ICs4NSw3IEBAIHB1YmxpYyBjbGFzcyBSZXZGbGFnIHsKIAogCWZpbmFsIGludCBtYXNrOwogCi0JUmV2RmxhZyhmaW5hbCBSZXZXYWxrIHcsIGZpbmFsIFN0cmluZyBuLCBmaW5hbCBpbnQgbSkgeworCVJldkZsYWcoUmV2V2FsayB3LCBTdHJpbmcgbiwgaW50IG0pIHsKIAkJd2Fsa2VyID0gdzsKIAkJbmFtZSA9IG47CiAJCW1hc2sgPSBtOwpAQCAtMTA3LDcgKzEwNyw3IEBAIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJfQogCiAJc3RhdGljIGNsYXNzIFN0YXRpY1JldkZsYWcgZXh0ZW5kcyBSZXZGbGFnIHsKLQkJU3RhdGljUmV2RmxhZyhmaW5hbCBTdHJpbmcgbiwgZmluYWwgaW50IG0pIHsKKwkJU3RhdGljUmV2RmxhZyhTdHJpbmcgbiwgaW50IG0pIHsKIAkJCXN1cGVyKG51bGwsIG4sIG0pOwogCQl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZGbGFnU2V0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2RmxhZ1NldC5qYXZhCmluZGV4IDk3NDBkMTQuLjQ1YTczMGMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZGbGFnU2V0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldkZsYWdTZXQuamF2YQpAQCAtNzMsNyArNzMsNyBAQCBwdWJsaWMgUmV2RmxhZ1NldCgpIHsKIAkgKiBAcGFyYW0gcwogCSAqICAgICAgICAgICAgdGhlIHNldCB0byBjb3B5IGZsYWdzIGZyb20uCiAJICovCi0JcHVibGljIFJldkZsYWdTZXQoZmluYWwgUmV2RmxhZ1NldCBzKSB7CisJcHVibGljIFJldkZsYWdTZXQoUmV2RmxhZ1NldCBzKSB7CiAJCW1hc2sgPSBzLm1hc2s7CiAJCWFjdGl2ZSA9IG5ldyBBcnJheUxpc3Q8PihzLmFjdGl2ZSk7CiAJfQpAQCAtODQsMTQgKzg0LDE0IEBAIHB1YmxpYyBSZXZGbGFnU2V0KGZpbmFsIFJldkZsYWdTZXQgcykgewogCSAqIEBwYXJhbSBzCiAJICogICAgICAgICAgICB0aGUgY29sbGVjdGlvbiB0byBjb3B5IGZsYWdzIGZyb20uCiAJICovCi0JcHVibGljIFJldkZsYWdTZXQoZmluYWwgQ29sbGVjdGlvbjxSZXZGbGFnPiBzKSB7CisJcHVibGljIFJldkZsYWdTZXQoQ29sbGVjdGlvbjxSZXZGbGFnPiBzKSB7CiAJCXRoaXMoKTsKIAkJYWRkQWxsKHMpOwogCX0KIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoZmluYWwgT2JqZWN0IG8pIHsKKwlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3QgbykgewogCQlpZiAobyBpbnN0YW5jZW9mIFJldkZsYWcpCiAJCQlyZXR1cm4gKG1hc2sgJiAoKFJldkZsYWcpIG8pLm1hc2spICE9IDA7CiAJCXJldHVybiBmYWxzZTsKQEAgLTk5LDcgKzk5LDcgQEAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoZmluYWwgT2JqZWN0IG8pIHsKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNBbGwoZmluYWwgQ29sbGVjdGlvbjw/PiBjKSB7CisJcHVibGljIGJvb2xlYW4gY29udGFpbnNBbGwoQ29sbGVjdGlvbjw/PiBjKSB7CiAJCWlmIChjIGluc3RhbmNlb2YgUmV2RmxhZ1NldCkgewogCQkJZmluYWwgaW50IGNNYXNrID0gKChSZXZGbGFnU2V0KSBjKS5tYXNrOwogCQkJcmV0dXJuIChtYXNrICYgY01hc2spID09IGNNYXNrOwpAQCAtMTA5LDcgKzEwOSw3IEBAIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zQWxsKGZpbmFsIENvbGxlY3Rpb248Pz4gYykgewogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBhZGQoZmluYWwgUmV2RmxhZyBmbGFnKSB7CisJcHVibGljIGJvb2xlYW4gYWRkKFJldkZsYWcgZmxhZykgewogCQlpZiAoKG1hc2sgJiBmbGFnLm1hc2spICE9IDApCiAJCQlyZXR1cm4gZmFsc2U7CiAJCW1hc2sgfD0gZmxhZy5tYXNrOwpAQCAtMTIyLDcgKzEyMiw3IEBAIHB1YmxpYyBib29sZWFuIGFkZChmaW5hbCBSZXZGbGFnIGZsYWcpIHsKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlKGZpbmFsIE9iamVjdCBvKSB7CisJcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvKSB7CiAJCWZpbmFsIFJldkZsYWcgZmxhZyA9IChSZXZGbGFnKSBvOwogCQlpZiAoKG1hc2sgJiBmbGFnLm1hc2spID09IDApCiAJCQlyZXR1cm4gZmFsc2U7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2T2JqZWN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2T2JqZWN0LmphdmEKaW5kZXggNGE4ODEwNS4uZWVmOWJmMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1Jldk9iamVjdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZPYmplY3QuamF2YQpAQCAtNjAsNyArNjAsNyBAQCBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmV2T2JqZWN0IGV4dGVuZHMgT2JqZWN0SWRPd25lck1hcC5FbnRyeSB7CiAKIAlpbnQgZmxhZ3M7CiAKLQlSZXZPYmplY3QoZmluYWwgQW55T2JqZWN0SWQgbmFtZSkgeworCVJldk9iamVjdChBbnlPYmplY3RJZCBuYW1lKSB7CiAJCXN1cGVyKG5hbWUpOwogCX0KIApAQCAtOTMsNyArOTMsNyBAQCBwdWJsaWMgZmluYWwgT2JqZWN0SWQgZ2V0SWQoKSB7CiAJICogICAgICAgICAgICB0aGUgZmxhZyB0byB0ZXN0LgogCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZmxhZyBoYXMgYmVlbiBhZGRlZCB0byB0aGlzIG9iamVjdDsgZmFsc2UgaWYgbm90LgogCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGhhcyhmaW5hbCBSZXZGbGFnIGZsYWcpIHsKKwlwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXMoUmV2RmxhZyBmbGFnKSB7CiAJCXJldHVybiAoZmxhZ3MgJiBmbGFnLm1hc2spICE9IDA7CiAJfQogCkBAIC0xMDUsNyArMTA1LDcgQEAgcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzKGZpbmFsIFJldkZsYWcgZmxhZykgewogCSAqIEByZXR1cm4gdHJ1ZSBpZiBhbnkgZmxhZyBpbiB0aGUgc2V0IGhhcyBiZWVuIGFkZGVkIHRvIHRoaXMgb2JqZWN0OyBmYWxzZQogCSAqICAgICAgICAgaWYgbm90LgogCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGhhc0FueShmaW5hbCBSZXZGbGFnU2V0IHNldCkgeworCXB1YmxpYyBmaW5hbCBib29sZWFuIGhhc0FueShSZXZGbGFnU2V0IHNldCkgewogCQlyZXR1cm4gKGZsYWdzICYgc2V0Lm1hc2spICE9IDA7CiAJfQogCkBAIC0xMTcsNyArMTE3LDcgQEAgcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzQW55KGZpbmFsIFJldkZsYWdTZXQgc2V0KSB7CiAJICogQHJldHVybiB0cnVlIGlmIGFsbCBmbGFncyBvZiB0aGUgc2V0IGhhdmUgYmVlbiBhZGRlZCB0byB0aGlzIG9iamVjdDsKIAkgKiAgICAgICAgIGZhbHNlIGlmIHNvbWUgb3Igbm9uZSBoYXZlIGJlZW4gYWRkZWQuCiAJICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzQWxsKGZpbmFsIFJldkZsYWdTZXQgc2V0KSB7CisJcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzQWxsKFJldkZsYWdTZXQgc2V0KSB7CiAJCXJldHVybiAoZmxhZ3MgJiBzZXQubWFzaykgPT0gc2V0Lm1hc2s7CiAJfQogCkBAIC0xMjksNyArMTI5LDcgQEAgcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzQWxsKGZpbmFsIFJldkZsYWdTZXQgc2V0KSB7CiAJICogQHBhcmFtIGZsYWcKIAkgKiAgICAgICAgICAgIHRoZSBmbGFnIHRvIG1hcmsgb24gdGhpcyBvYmplY3QsIGZvciBsYXRlciB0ZXN0aW5nLgogCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGFkZChmaW5hbCBSZXZGbGFnIGZsYWcpIHsKKwlwdWJsaWMgZmluYWwgdm9pZCBhZGQoUmV2RmxhZyBmbGFnKSB7CiAJCWZsYWdzIHw9IGZsYWcubWFzazsKIAl9CiAKQEAgLTEzOSw3ICsxMzksNyBAQCBwdWJsaWMgZmluYWwgdm9pZCBhZGQoZmluYWwgUmV2RmxhZyBmbGFnKSB7CiAJICogQHBhcmFtIHNldAogCSAqICAgICAgICAgICAgdGhlIHNldCBvZiBmbGFncyB0byBtYXJrIG9uIHRoaXMgb2JqZWN0LCBmb3IgbGF0ZXIgdGVzdGluZy4KIAkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBhZGQoZmluYWwgUmV2RmxhZ1NldCBzZXQpIHsKKwlwdWJsaWMgZmluYWwgdm9pZCBhZGQoUmV2RmxhZ1NldCBzZXQpIHsKIAkJZmxhZ3MgfD0gc2V0Lm1hc2s7CiAJfQogCkBAIC0xNTEsNyArMTUxLDcgQEAgcHVibGljIGZpbmFsIHZvaWQgYWRkKGZpbmFsIFJldkZsYWdTZXQgc2V0KSB7CiAJICogQHBhcmFtIGZsYWcKIAkgKiAgICAgICAgICAgIHRoZSBmbGFnIHRvIHJlbW92ZSBmcm9tIHRoaXMgb2JqZWN0LgogCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHJlbW92ZShmaW5hbCBSZXZGbGFnIGZsYWcpIHsKKwlwdWJsaWMgZmluYWwgdm9pZCByZW1vdmUoUmV2RmxhZyBmbGFnKSB7CiAJCWZsYWdzICY9IH5mbGFnLm1hc2s7CiAJfQogCkBAIC0xNjEsNyArMTYxLDcgQEAgcHVibGljIGZpbmFsIHZvaWQgcmVtb3ZlKGZpbmFsIFJldkZsYWcgZmxhZykgewogCSAqIEBwYXJhbSBzZXQKIAkgKiAgICAgICAgICAgIHRoZSBmbGFnIHRvIHJlbW92ZSBmcm9tIHRoaXMgb2JqZWN0LgogCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHJlbW92ZShmaW5hbCBSZXZGbGFnU2V0IHNldCkgeworCXB1YmxpYyBmaW5hbCB2b2lkIHJlbW92ZShSZXZGbGFnU2V0IHNldCkgewogCQlmbGFncyAmPSB+c2V0Lm1hc2s7CiAJfQogCkBAIC0xODMsNyArMTgzLDcgQEAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkgKiBAcGFyYW0gcwogCSAqICAgICAgICAgICAgYnVmZmVyIHRvIGFwcGVuZCBhIGRlYnVnIGRlc2NyaXB0aW9uIG9mIGNvcmUgUmV2RmxhZ3Mgb250by4KIAkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhcHBlbmRDb3JlRmxhZ3MoZmluYWwgU3RyaW5nQnVpbGRlciBzKSB7CisJcHJvdGVjdGVkIHZvaWQgYXBwZW5kQ29yZUZsYWdzKFN0cmluZ0J1aWxkZXIgcykgewogCQlzLmFwcGVuZCgoZmxhZ3MgJiBSZXZXYWxrLlRPUE9fREVMQVkpICE9IDAgPyAnbycgOiAnLScpOwogCQlzLmFwcGVuZCgoZmxhZ3MgJiBSZXZXYWxrLlRFTVBfTUFSSykgIT0gMCA/ICd0JyA6ICctJyk7CiAJCXMuYXBwZW5kKChmbGFncyAmIFJldldhbGsuUkVXUklURSkgIT0gMCA/ICdyJyA6ICctJyk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2T2JqZWN0TGlzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1Jldk9iamVjdExpc3QuamF2YQppbmRleCAyYmI0NDI3Li4yZjIxZTE3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2T2JqZWN0TGlzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZPYmplY3RMaXN0LmphdmEKQEAgLTgyLDcgKzgyLDcgQEAgcHVibGljIFJldk9iamVjdExpc3QoKSB7CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZChmaW5hbCBpbnQgaW5kZXgsIGZpbmFsIEUgZWxlbWVudCkgeworCXB1YmxpYyB2b2lkIGFkZChpbnQgaW5kZXgsIEUgZWxlbWVudCkgewogCQlpZiAoaW5kZXggIT0gc2l6ZSkKIAkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKIAkJCQkJSkdpdFRleHQuZ2V0KCkudW5zdXBwb3J0ZWRPcGVyYXRpb25Ob3RBZGRBdEVuZCwKQEAgLTE0Nyw3ICsxNDcsNyBAQCBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIEJsb2NrIHsKIAogCQlmaW5hbCBpbnQgc2hpZnQ7CiAKLQkJQmxvY2soZmluYWwgaW50IHMpIHsKKwkJQmxvY2soaW50IHMpIHsKIAkJCXNoaWZ0ID0gczsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZUYWcuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZUYWcuamF2YQppbmRleCBkNzQ4MzdlLi4wMDUwYmFjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2VGFnLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldlRhZy5qYXZhCkBAIC00NSw3ICs0NSw3IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKQEAgLTEzNywxOCArMTM3LDE4IEBAIHB1YmxpYyBzdGF0aWMgUmV2VGFnIHBhcnNlKFJldldhbGsgcncsIGJ5dGVbXSByYXcpCiAJICogQHBhcmFtIGlkCiAJICogICAgICAgICAgICBvYmplY3QgbmFtZSBmb3IgdGhlIHRhZy4KIAkgKi8KLQlwcm90ZWN0ZWQgUmV2VGFnKGZpbmFsIEFueU9iamVjdElkIGlkKSB7CisJcHJvdGVjdGVkIFJldlRhZyhBbnlPYmplY3RJZCBpZCkgewogCQlzdXBlcihpZCk7CiAJfQogCiAJQE92ZXJyaWRlCi0Jdm9pZCBwYXJzZUhlYWRlcnMoZmluYWwgUmV2V2FsayB3YWxrKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKKwl2b2lkIHBhcnNlSGVhZGVycyhSZXZXYWxrIHdhbGspIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAogCQkJSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQlwYXJzZUNhbm9uaWNhbCh3YWxrLCB3YWxrLmdldENhY2hlZEJ5dGVzKHRoaXMpKTsKIAl9CiAKIAlAT3ZlcnJpZGUKLQl2b2lkIHBhcnNlQm9keShmaW5hbCBSZXZXYWxrIHdhbGspIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAorCXZvaWQgcGFyc2VCb2R5KFJldldhbGsgd2FsaykgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCiAJCQlJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCWlmIChidWZmZXIgPT0gbnVsbCkgewogCQkJYnVmZmVyID0gd2Fsay5nZXRDYWNoZWRCeXRlcyh0aGlzKTsKQEAgLTE1Nyw3ICsxNTcsNyBAQCB2b2lkIHBhcnNlQm9keShmaW5hbCBSZXZXYWxrIHdhbGspIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAogCQl9CiAJfQogCi0Jdm9pZCBwYXJzZUNhbm9uaWNhbChmaW5hbCBSZXZXYWxrIHdhbGssIGZpbmFsIGJ5dGVbXSByYXdUYWcpCisJdm9pZCBwYXJzZUNhbm9uaWNhbChSZXZXYWxrIHdhbGssIGJ5dGVbXSByYXdUYWcpCiAJCQl0aHJvd3MgQ29ycnVwdE9iamVjdEV4Y2VwdGlvbiB7CiAJCWZpbmFsIE11dGFibGVJbnRlZ2VyIHBvcyA9IG5ldyBNdXRhYmxlSW50ZWdlcigpOwogCQlmaW5hbCBpbnQgb1R5cGU7CkBAIC0xNjksNyArMTY5LDcgQEAgdm9pZCBwYXJzZUNhbm9uaWNhbChmaW5hbCBSZXZXYWxrIHdhbGssIGZpbmFsIGJ5dGVbXSByYXdUYWcpCiAKIAkJaW50IHAgPSBwb3MudmFsdWUgKz0gNDsgLy8gInRhZyAiCiAJCWZpbmFsIGludCBuYW1lRW5kID0gUmF3UGFyc2VVdGlscy5uZXh0TEYocmF3VGFnLCBwKSAtIDE7Ci0JCXRhZ05hbWUgPSBSYXdQYXJzZVV0aWxzLmRlY29kZShVVEZfOCwgcmF3VGFnLCBwLCBuYW1lRW5kKTsKKwkJdGFnTmFtZSA9IFJhd1BhcnNlVXRpbHMuZGVjb2RlKENIQVJTRVQsIHJhd1RhZywgcCwgbmFtZUVuZCk7CiAKIAkJaWYgKHdhbGsuaXNSZXRhaW5Cb2R5KCkpCiAJCQlidWZmZXIgPSByYXdUYWc7CkBAIC0yNTcsNyArMjU3LDcgQEAgcHJpdmF0ZSBDaGFyc2V0IGd1ZXNzRW5jb2RpbmcoKSB7CiAJCXRyeSB7CiAJCQlyZXR1cm4gUmF3UGFyc2VVdGlscy5wYXJzZUVuY29kaW5nKGJ1ZmZlcik7CiAJCX0gY2F0Y2ggKElsbGVnYWxDaGFyc2V0TmFtZUV4Y2VwdGlvbiB8IFVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gVVRGXzg7CisJCQlyZXR1cm4gQ0hBUlNFVDsKIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldlRyZWUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZUcmVlLmphdmEKaW5kZXggOTJiODFhMS4uZTdkZTI3MCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldlRyZWUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2VHJlZS5qYXZhCkBAIC02Miw3ICs2Miw3IEBAIHB1YmxpYyBjbGFzcyBSZXZUcmVlIGV4dGVuZHMgUmV2T2JqZWN0IHsKIAkgKiBAcGFyYW0gaWQKIAkgKiAgICAgICAgICAgIG9iamVjdCBuYW1lIGZvciB0aGUgdHJlZS4KIAkgKi8KLQlwcm90ZWN0ZWQgUmV2VHJlZShmaW5hbCBBbnlPYmplY3RJZCBpZCkgeworCXByb3RlY3RlZCBSZXZUcmVlKEFueU9iamVjdElkIGlkKSB7CiAJCXN1cGVyKGlkKTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZXYWxrLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2V2Fsay5qYXZhCmluZGV4IDkxYzE1YTEuLmE5ODZjZmQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZXYWxrLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldldhbGsuamF2YQpAQCAtMjA5LDcgKzIwOSw3IEBAIHB1YmxpYyBjbGFzcyBSZXZXYWxrIGltcGxlbWVudHMgSXRlcmFibGU8UmV2Q29tbWl0PiwgQXV0b0Nsb3NlYWJsZSB7CiAJICogICAgICAgICAgICBPYmplY3RSZWFkZXIgd2lsbCBiZSBjcmVhdGVkIGJ5IHRoZSB3YWxrZXIsIGFuZCB3aWxsIGJlIGNsb3NlZAogCSAqICAgICAgICAgICAgd2hlbiB0aGUgd2Fsa2VyIGlzIGNsb3NlZC4KIAkgKi8KLQlwdWJsaWMgUmV2V2FsayhmaW5hbCBSZXBvc2l0b3J5IHJlcG8pIHsKKwlwdWJsaWMgUmV2V2FsayhSZXBvc2l0b3J5IHJlcG8pIHsKIAkJdGhpcyhyZXBvLm5ld09iamVjdFJlYWRlcigpLCB0cnVlKTsKIAl9CiAKQEAgLTI5NCw3ICsyOTQsNyBAQCBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICBhIHBhY2sgZmlsZSBvciBsb29zZSBvYmplY3QgY291bGQgbm90IGJlIHJlYWQuCiAJICovCi0JcHVibGljIHZvaWQgbWFya1N0YXJ0KGZpbmFsIFJldkNvbW1pdCBjKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKKwlwdWJsaWMgdm9pZCBtYXJrU3RhcnQoUmV2Q29tbWl0IGMpIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAogCQkJSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQlpZiAoKGMuZmxhZ3MgJiBTRUVOKSAhPSAwKQogCQkJcmV0dXJuOwpAQCAtMzI0LDEwICszMjQsMTAgQEAgcHVibGljIHZvaWQgbWFya1N0YXJ0KGZpbmFsIFJldkNvbW1pdCBjKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICBhIHBhY2sgZmlsZSBvciBsb29zZSBvYmplY3QgY291bGQgbm90IGJlIHJlYWQuCiAJICovCi0JcHVibGljIHZvaWQgbWFya1N0YXJ0KGZpbmFsIENvbGxlY3Rpb248UmV2Q29tbWl0PiBsaXN0KQorCXB1YmxpYyB2b2lkIG1hcmtTdGFydChDb2xsZWN0aW9uPFJldkNvbW1pdD4gbGlzdCkKIAkJCXRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLAogCQkJSU9FeGNlcHRpb24gewotCQlmb3IgKGZpbmFsIFJldkNvbW1pdCBjIDogbGlzdCkKKwkJZm9yIChSZXZDb21taXQgYyA6IGxpc3QpCiAJCQltYXJrU3RhcnQoYyk7CiAJfQogCkBAIC0zNjQsNyArMzY0LDcgQEAgcHVibGljIHZvaWQgbWFya1N0YXJ0KGZpbmFsIENvbGxlY3Rpb248UmV2Q29tbWl0PiBsaXN0KQogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIGEgcGFjayBmaWxlIG9yIGxvb3NlIG9iamVjdCBjb3VsZCBub3QgYmUgcmVhZC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBtYXJrVW5pbnRlcmVzdGluZyhmaW5hbCBSZXZDb21taXQgYykKKwlwdWJsaWMgdm9pZCBtYXJrVW5pbnRlcmVzdGluZyhSZXZDb21taXQgYykKIAkJCXRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLAogCQkJSU9FeGNlcHRpb24gewogCQljLmZsYWdzIHw9IFVOSU5URVJFU1RJTkc7CkBAIC00MDIsNyArNDAyLDcgQEAgcHVibGljIHZvaWQgbWFya1VuaW50ZXJlc3RpbmcoZmluYWwgUmV2Q29tbWl0IGMpCiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgYSBwYWNrIGZpbGUgb3IgbG9vc2Ugb2JqZWN0IGNvdWxkIG5vdCBiZSByZWFkLgogCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTWVyZ2VkSW50byhmaW5hbCBSZXZDb21taXQgYmFzZSwgZmluYWwgUmV2Q29tbWl0IHRpcCkKKwlwdWJsaWMgYm9vbGVhbiBpc01lcmdlZEludG8oUmV2Q29tbWl0IGJhc2UsIFJldkNvbW1pdCB0aXApCiAJCQl0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwKIAkJCUlPRXhjZXB0aW9uIHsKIAkJZmluYWwgUmV2RmlsdGVyIG9sZFJGID0gZmlsdGVyOwpAQCAtNDc1LDcgKzQ3NSw3IEBAIHB1YmxpYyBib29sZWFuIGhhc1JldlNvcnQoUmV2U29ydCBzb3J0KSB7CiAJICogQHBhcmFtIHMKIAkgKiAgICAgICAgICAgIGEgc29ydGluZyBzdHJhdGVneSB0byBlbmFibGUuCiAJICovCi0JcHVibGljIHZvaWQgc29ydChmaW5hbCBSZXZTb3J0IHMpIHsKKwlwdWJsaWMgdm9pZCBzb3J0KFJldlNvcnQgcykgewogCQlhc3NlcnROb3RTdGFydGVkKCk7CiAJCXNvcnRpbmcuY2xlYXIoKTsKIAkJc29ydGluZy5hZGQocyk7CkBAIC00OTYsNyArNDk2LDcgQEAgcHVibGljIHZvaWQgc29ydChmaW5hbCBSZXZTb3J0IHMpIHsKIAkgKiAgICAgICAgICAgIHRydWUgaWYgdGhpcyBzdHJhdGVneSBzaG91bGQgYmUgdXNlZCwgZmFsc2UgaWYgaXQgc2hvdWxkIGJlCiAJICogICAgICAgICAgICByZW1vdmVkLgogCSAqLwotCXB1YmxpYyB2b2lkIHNvcnQoZmluYWwgUmV2U29ydCBzLCBmaW5hbCBib29sZWFuIHVzZSkgeworCXB1YmxpYyB2b2lkIHNvcnQoUmV2U29ydCBzLCBib29sZWFuIHVzZSkgewogCQlhc3NlcnROb3RTdGFydGVkKCk7CiAJCWlmICh1c2UpCiAJCQlzb3J0aW5nLmFkZChzKTsKQEAgLTU0MSw3ICs1NDEsNyBAQCBwdWJsaWMgUmV2RmlsdGVyIGdldFJldkZpbHRlcigpIHsKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5maWx0ZXIuQW5kUmV2RmlsdGVyCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuZmlsdGVyLk9yUmV2RmlsdGVyCiAJICovCi0JcHVibGljIHZvaWQgc2V0UmV2RmlsdGVyKGZpbmFsIFJldkZpbHRlciBuZXdGaWx0ZXIpIHsKKwlwdWJsaWMgdm9pZCBzZXRSZXZGaWx0ZXIoUmV2RmlsdGVyIG5ld0ZpbHRlcikgewogCQlhc3NlcnROb3RTdGFydGVkKCk7CiAJCWZpbHRlciA9IG5ld0ZpbHRlciAhPSBudWxsID8gbmV3RmlsdGVyIDogUmV2RmlsdGVyLkFMTDsKIAl9CkBAIC01ODIsNyArNTgyLDcgQEAgcHVibGljIFRyZWVGaWx0ZXIgZ2V0VHJlZUZpbHRlcigpIHsKIAkgKiAgICAgICAgICAgIHdpbGwgYmUgdXNlZCBpbnN0ZWFkLCBhcyBpdCBtYXRjaGVzIGV2ZXJ5dGhpbmcuCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLmZpbHRlci5QYXRoRmlsdGVyCiAJICovCi0JcHVibGljIHZvaWQgc2V0VHJlZUZpbHRlcihmaW5hbCBUcmVlRmlsdGVyIG5ld0ZpbHRlcikgeworCXB1YmxpYyB2b2lkIHNldFRyZWVGaWx0ZXIoVHJlZUZpbHRlciBuZXdGaWx0ZXIpIHsKIAkJYXNzZXJ0Tm90U3RhcnRlZCgpOwogCQl0cmVlRmlsdGVyID0gbmV3RmlsdGVyICE9IG51bGwgPyBuZXdGaWx0ZXIgOiBUcmVlRmlsdGVyLkFMTDsKIAl9CkBAIC02MzgsNyArNjM4LDcgQEAgcHVibGljIGJvb2xlYW4gaXNSZXRhaW5Cb2R5KCkgewogCSAqIEBwYXJhbSByZXRhaW4KIAkgKiAgICAgICAgICAgIHRydWUgdG8gcmV0YWluIGJvZGllczsgZmFsc2UgdG8gZGlzY2FyZCB0aGVtIGVhcmx5LgogCSAqLwotCXB1YmxpYyB2b2lkIHNldFJldGFpbkJvZHkoZmluYWwgYm9vbGVhbiByZXRhaW4pIHsKKwlwdWJsaWMgdm9pZCBzZXRSZXRhaW5Cb2R5KGJvb2xlYW4gcmV0YWluKSB7CiAJCXJldGFpbkJvZHkgPSByZXRhaW47CiAJfQogCkBAIC02NTMsNyArNjUzLDcgQEAgcHVibGljIHZvaWQgc2V0UmV0YWluQm9keShmaW5hbCBib29sZWFuIHJldGFpbikgewogCSAqIEByZXR1cm4gcmVmZXJlbmNlIHRvIHRoZSBibG9iIG9iamVjdC4gTmV2ZXIgbnVsbC4KIAkgKi8KIAlATm9uTnVsbAotCXB1YmxpYyBSZXZCbG9iIGxvb2t1cEJsb2IoZmluYWwgQW55T2JqZWN0SWQgaWQpIHsKKwlwdWJsaWMgUmV2QmxvYiBsb29rdXBCbG9iKEFueU9iamVjdElkIGlkKSB7CiAJCVJldkJsb2IgYyA9IChSZXZCbG9iKSBvYmplY3RzLmdldChpZCk7CiAJCWlmIChjID09IG51bGwpIHsKIAkJCWMgPSBuZXcgUmV2QmxvYihpZCk7CkBAIC02NzMsNyArNjczLDcgQEAgcHVibGljIFJldkJsb2IgbG9va3VwQmxvYihmaW5hbCBBbnlPYmplY3RJZCBpZCkgewogCSAqIEByZXR1cm4gcmVmZXJlbmNlIHRvIHRoZSB0cmVlIG9iamVjdC4gTmV2ZXIgbnVsbC4KIAkgKi8KIAlATm9uTnVsbAotCXB1YmxpYyBSZXZUcmVlIGxvb2t1cFRyZWUoZmluYWwgQW55T2JqZWN0SWQgaWQpIHsKKwlwdWJsaWMgUmV2VHJlZSBsb29rdXBUcmVlKEFueU9iamVjdElkIGlkKSB7CiAJCVJldlRyZWUgYyA9IChSZXZUcmVlKSBvYmplY3RzLmdldChpZCk7CiAJCWlmIChjID09IG51bGwpIHsKIAkJCWMgPSBuZXcgUmV2VHJlZShpZCk7CkBAIC02OTYsNyArNjk2LDcgQEAgcHVibGljIFJldlRyZWUgbG9va3VwVHJlZShmaW5hbCBBbnlPYmplY3RJZCBpZCkgewogCSAqIEByZXR1cm4gcmVmZXJlbmNlIHRvIHRoZSBjb21taXQgb2JqZWN0LiBOZXZlciBudWxsLgogCSAqLwogCUBOb25OdWxsCi0JcHVibGljIFJldkNvbW1pdCBsb29rdXBDb21taXQoZmluYWwgQW55T2JqZWN0SWQgaWQpIHsKKwlwdWJsaWMgUmV2Q29tbWl0IGxvb2t1cENvbW1pdChBbnlPYmplY3RJZCBpZCkgewogCQlSZXZDb21taXQgYyA9IChSZXZDb21taXQpIG9iamVjdHMuZ2V0KGlkKTsKIAkJaWYgKGMgPT0gbnVsbCkgewogCQkJYyA9IGNyZWF0ZUNvbW1pdChpZCk7CkBAIC03MTYsNyArNzE2LDcgQEAgcHVibGljIFJldkNvbW1pdCBsb29rdXBDb21taXQoZmluYWwgQW55T2JqZWN0SWQgaWQpIHsKIAkgKiBAcmV0dXJuIHJlZmVyZW5jZSB0byB0aGUgdGFnIG9iamVjdC4gTmV2ZXIgbnVsbC4KIAkgKi8KIAlATm9uTnVsbAotCXB1YmxpYyBSZXZUYWcgbG9va3VwVGFnKGZpbmFsIEFueU9iamVjdElkIGlkKSB7CisJcHVibGljIFJldlRhZyBsb29rdXBUYWcoQW55T2JqZWN0SWQgaWQpIHsKIAkJUmV2VGFnIGMgPSAoUmV2VGFnKSBvYmplY3RzLmdldChpZCk7CiAJCWlmIChjID09IG51bGwpIHsKIAkJCWMgPSBuZXcgUmV2VGFnKGlkKTsKQEAgLTczOCw3ICs3MzgsNyBAQCBwdWJsaWMgUmV2VGFnIGxvb2t1cFRhZyhmaW5hbCBBbnlPYmplY3RJZCBpZCkgewogCSAqIEByZXR1cm4gcmVmZXJlbmNlIHRvIHRoZSBvYmplY3QuIE5ldmVyIG51bGwuCiAJICovCiAJQE5vbk51bGwKLQlwdWJsaWMgUmV2T2JqZWN0IGxvb2t1cEFueShmaW5hbCBBbnlPYmplY3RJZCBpZCwgZmluYWwgaW50IHR5cGUpIHsKKwlwdWJsaWMgUmV2T2JqZWN0IGxvb2t1cEFueShBbnlPYmplY3RJZCBpZCwgaW50IHR5cGUpIHsKIAkJUmV2T2JqZWN0IHIgPSBvYmplY3RzLmdldChpZCk7CiAJCWlmIChyID09IG51bGwpIHsKIAkJCXN3aXRjaCAodHlwZSkgewpAQCAtNzkzLDcgKzc5Myw3IEBAIHB1YmxpYyBSZXZPYmplY3QgbG9va3VwT3JOdWxsKEFueU9iamVjdElkIGlkKSB7CiAJICogICAgICAgICAgICAgYSBwYWNrIGZpbGUgb3IgbG9vc2Ugb2JqZWN0IGNvdWxkIG5vdCBiZSByZWFkLgogCSAqLwogCUBOb25OdWxsCi0JcHVibGljIFJldkNvbW1pdCBwYXJzZUNvbW1pdChmaW5hbCBBbnlPYmplY3RJZCBpZCkKKwlwdWJsaWMgUmV2Q29tbWl0IHBhcnNlQ29tbWl0KEFueU9iamVjdElkIGlkKQogCQkJdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sCiAJCQlJT0V4Y2VwdGlvbiB7CiAJCVJldk9iamVjdCBjID0gcGVlbChwYXJzZUFueShpZCkpOwpAQCAtODIxLDcgKzgyMSw3IEBAIHB1YmxpYyBSZXZDb21taXQgcGFyc2VDb21taXQoZmluYWwgQW55T2JqZWN0SWQgaWQpCiAJICogICAgICAgICAgICAgYSBwYWNrIGZpbGUgb3IgbG9vc2Ugb2JqZWN0IGNvdWxkIG5vdCBiZSByZWFkLgogCSAqLwogCUBOb25OdWxsCi0JcHVibGljIFJldlRyZWUgcGFyc2VUcmVlKGZpbmFsIEFueU9iamVjdElkIGlkKQorCXB1YmxpYyBSZXZUcmVlIHBhcnNlVHJlZShBbnlPYmplY3RJZCBpZCkKIAkJCXRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLAogCQkJSU9FeGNlcHRpb24gewogCQlSZXZPYmplY3QgYyA9IHBlZWwocGFyc2VBbnkoaWQpKTsKQEAgLTg1Niw3ICs4NTYsNyBAQCBlbHNlIGlmICghKGMgaW5zdGFuY2VvZiBSZXZUcmVlKSkKIAkgKiAgICAgICAgICAgICBhIHBhY2sgZmlsZSBvciBsb29zZSBvYmplY3QgY291bGQgbm90IGJlIHJlYWQuCiAJICovCiAJQE5vbk51bGwKLQlwdWJsaWMgUmV2VGFnIHBhcnNlVGFnKGZpbmFsIEFueU9iamVjdElkIGlkKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKKwlwdWJsaWMgUmV2VGFnIHBhcnNlVGFnKEFueU9iamVjdElkIGlkKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKIAkJCUluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJUmV2T2JqZWN0IGMgPSBwYXJzZUFueShpZCk7CiAJCWlmICghKGMgaW5zdGFuY2VvZiBSZXZUYWcpKQpAQCAtODgyLDcgKzg4Miw3IEBAIHB1YmxpYyBSZXZUYWcgcGFyc2VUYWcoZmluYWwgQW55T2JqZWN0SWQgaWQpIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAogCSAqICAgICAgICAgICAgIGEgcGFjayBmaWxlIG9yIGxvb3NlIG9iamVjdCBjb3VsZCBub3QgYmUgcmVhZC4KIAkgKi8KIAlATm9uTnVsbAotCXB1YmxpYyBSZXZPYmplY3QgcGFyc2VBbnkoZmluYWwgQW55T2JqZWN0SWQgaWQpCisJcHVibGljIFJldk9iamVjdCBwYXJzZUFueShBbnlPYmplY3RJZCBpZCkKIAkJCXRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCVJldk9iamVjdCByID0gb2JqZWN0cy5nZXQoaWQpOwogCQlpZiAociA9PSBudWxsKQpAQCAtMTA0MCw3ICsxMDQwLDcgQEAgcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICBhIHBhY2sgZmlsZSBvciBsb29zZSBvYmplY3QgY291bGQgbm90IGJlIHJlYWQuCiAJICovCi0JcHVibGljIHZvaWQgcGFyc2VIZWFkZXJzKGZpbmFsIFJldk9iamVjdCBvYmopCisJcHVibGljIHZvaWQgcGFyc2VIZWFkZXJzKFJldk9iamVjdCBvYmopCiAJCQl0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQlpZiAoKG9iai5mbGFncyAmIFBBUlNFRCkgPT0gMCkKIAkJCW9iai5wYXJzZUhlYWRlcnModGhpcyk7CkBAIC0xMDU5LDcgKzEwNTksNyBAQCBwdWJsaWMgdm9pZCBwYXJzZUhlYWRlcnMoZmluYWwgUmV2T2JqZWN0IG9iaikKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICBhIHBhY2sgZmlsZSBvciBsb29zZSBvYmplY3QgY291bGQgbm90IGJlIHJlYWQuCiAJICovCi0JcHVibGljIHZvaWQgcGFyc2VCb2R5KGZpbmFsIFJldk9iamVjdCBvYmopCisJcHVibGljIHZvaWQgcGFyc2VCb2R5KFJldk9iamVjdCBvYmopCiAJCQl0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQlvYmoucGFyc2VCb2R5KHRoaXMpOwogCX0KQEAgLTExMDAsNyArMTEwMCw3IEBAIHB1YmxpYyBSZXZPYmplY3QgcGVlbChSZXZPYmplY3Qgb2JqKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKIAkgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0b28gbWFueSBmbGFncyBoYXZlIGJlZW4gcmVzZXJ2ZWQgb24gdGhpcyByZXZpc2lvbiB3YWxrZXIuCiAJICovCi0JcHVibGljIFJldkZsYWcgbmV3RmxhZyhmaW5hbCBTdHJpbmcgbmFtZSkgeworCXB1YmxpYyBSZXZGbGFnIG5ld0ZsYWcoU3RyaW5nIG5hbWUpIHsKIAkJZmluYWwgaW50IG0gPSBhbGxvY0ZsYWcoKTsKIAkJcmV0dXJuIG5ldyBSZXZGbGFnKHRoaXMsIG5hbWUsIG0pOwogCX0KQEAgLTExMjQsNyArMTEyNCw3IEBAIGludCBhbGxvY0ZsYWcoKSB7CiAJICogQHBhcmFtIGZsYWcKIAkgKiAgICAgICAgICAgIHRoZSBmbGFnIHRvIGNhcnJ5IG9udG8gcGFyZW50cywgaWYgc2V0IG9uIGEgZGVzY2VuZGFudC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBjYXJyeShmaW5hbCBSZXZGbGFnIGZsYWcpIHsKKwlwdWJsaWMgdm9pZCBjYXJyeShSZXZGbGFnIGZsYWcpIHsKIAkJaWYgKChmcmVlRmxhZ3MgJiBmbGFnLm1hc2spICE9IDApCiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpHaXRUZXh0LmdldCgpLmZsYWdJc0Rpc3Bvc2VkLCBmbGFnLm5hbWUpKTsKIAkJaWYgKGZsYWcud2Fsa2VyICE9IHRoaXMpCkBAIC0xMTQxLDggKzExNDEsOCBAQCBwdWJsaWMgdm9pZCBjYXJyeShmaW5hbCBSZXZGbGFnIGZsYWcpIHsKIAkgKiBAcGFyYW0gc2V0CiAJICogICAgICAgICAgICB0aGUgZmxhZ3MgdG8gY2Fycnkgb250byBwYXJlbnRzLCBpZiBzZXQgb24gYSBkZXNjZW5kYW50LgogCSAqLwotCXB1YmxpYyB2b2lkIGNhcnJ5KGZpbmFsIENvbGxlY3Rpb248UmV2RmxhZz4gc2V0KSB7Ci0JCWZvciAoZmluYWwgUmV2RmxhZyBmbGFnIDogc2V0KQorCXB1YmxpYyB2b2lkIGNhcnJ5KENvbGxlY3Rpb248UmV2RmxhZz4gc2V0KSB7CisJCWZvciAoUmV2RmxhZyBmbGFnIDogc2V0KQogCQkJY2FycnkoZmxhZyk7CiAJfQogCkBAIC0xMjAwLDExICsxMjAwLDExIEBAIHB1YmxpYyBmaW5hbCB2b2lkIHJldGFpbk9uUmVzZXQoQ29sbGVjdGlvbjxSZXZGbGFnPiBmbGFncykgewogCSAqIEBwYXJhbSBmbGFnCiAJICogICAgICAgICAgICB0aGUgdG8gcmVjeWNsZS4KIAkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlRmxhZyhmaW5hbCBSZXZGbGFnIGZsYWcpIHsKKwlwdWJsaWMgdm9pZCBkaXNwb3NlRmxhZyhSZXZGbGFnIGZsYWcpIHsKIAkJZnJlZUZsYWcoZmxhZy5tYXNrKTsKIAl9CiAKLQl2b2lkIGZyZWVGbGFnKGZpbmFsIGludCBtYXNrKSB7CisJdm9pZCBmcmVlRmxhZyhpbnQgbWFzaykgewogCQlyZXRhaW5PblJlc2V0ICY9IH5tYXNrOwogCQlpZiAoaXNOb3RTdGFydGVkKCkpIHsKIAkJCWZyZWVGbGFncyB8PSBtYXNrOwpAQCAtMTI0NCw3ICsxMjQ0LDcgQEAgcHVibGljIGZpbmFsIHZvaWQgcmVzZXQoKSB7CiAJICogICAgICAgICAgICBhcHBsaWNhdGlvbiBmbGFncyB0aGF0IHNob3VsZCA8Yj5ub3Q8L2I+IGJlIGNsZWFyZWQgZnJvbQogCSAqICAgICAgICAgICAgZXhpc3RpbmcgY29tbWl0IG9iamVjdHMuCiAJICovCi0JcHVibGljIGZpbmFsIHZvaWQgcmVzZXRSZXRhaW4oZmluYWwgUmV2RmxhZ1NldCByZXRhaW5GbGFncykgeworCXB1YmxpYyBmaW5hbCB2b2lkIHJlc2V0UmV0YWluKFJldkZsYWdTZXQgcmV0YWluRmxhZ3MpIHsKIAkJcmVzZXQocmV0YWluRmxhZ3MubWFzayk7CiAJfQogCkBAIC0xMjYyLDkgKzEyNjIsOSBAQCBwdWJsaWMgZmluYWwgdm9pZCByZXNldFJldGFpbihmaW5hbCBSZXZGbGFnU2V0IHJldGFpbkZsYWdzKSB7CiAJICogICAgICAgICAgICBhcHBsaWNhdGlvbiBmbGFncyB0aGF0IHNob3VsZCA8Yj5ub3Q8L2I+IGJlIGNsZWFyZWQgZnJvbQogCSAqICAgICAgICAgICAgZXhpc3RpbmcgY29tbWl0IG9iamVjdHMuCiAJICovCi0JcHVibGljIGZpbmFsIHZvaWQgcmVzZXRSZXRhaW4oZmluYWwgUmV2RmxhZy4uLiByZXRhaW5GbGFncykgeworCXB1YmxpYyBmaW5hbCB2b2lkIHJlc2V0UmV0YWluKFJldkZsYWcuLi4gcmV0YWluRmxhZ3MpIHsKIAkJaW50IG1hc2sgPSAwOwotCQlmb3IgKGZpbmFsIFJldkZsYWcgZmxhZyA6IHJldGFpbkZsYWdzKQorCQlmb3IgKFJldkZsYWcgZmxhZyA6IHJldGFpbkZsYWdzKQogCQkJbWFzayB8PSBmbGFnLm1hc2s7CiAJCXJlc2V0KG1hc2spOwogCX0KQEAgLTEyODYsNyArMTI4Niw3IEBAIHByb3RlY3RlZCB2b2lkIHJlc2V0KGludCByZXRhaW5GbGFncykgewogCQlmaW5hbCBpbnQgY2xlYXJGbGFncyA9IH5yZXRhaW5GbGFnczsKIAogCQlmaW5hbCBGSUZPUmV2UXVldWUgcSA9IG5ldyBGSUZPUmV2UXVldWUoKTsKLQkJZm9yIChmaW5hbCBSZXZDb21taXQgYyA6IHJvb3RzKSB7CisJCWZvciAoUmV2Q29tbWl0IGMgOiByb290cykgewogCQkJaWYgKChjLmZsYWdzICYgY2xlYXJGbGFncykgPT0gMCkKIAkJCQljb250aW51ZTsKIAkJCWMuZmxhZ3MgJj0gcmV0YWluRmxhZ3M7CkBAIC0xMzAwLDcgKzEzMDAsNyBAQCBwcm90ZWN0ZWQgdm9pZCByZXNldChpbnQgcmV0YWluRmxhZ3MpIHsKIAkJCQlicmVhazsKIAkJCWlmIChjLnBhcmVudHMgPT0gbnVsbCkKIAkJCQljb250aW51ZTsKLQkJCWZvciAoZmluYWwgUmV2Q29tbWl0IHAgOiBjLnBhcmVudHMpIHsKKwkJCWZvciAoUmV2Q29tbWl0IHAgOiBjLnBhcmVudHMpIHsKIAkJCQlpZiAoKHAuZmxhZ3MgJiBjbGVhckZsYWdzKSA9PSAwKQogCQkJCQljb250aW51ZTsKIAkJCQlwLmZsYWdzICY9IHJldGFpbkZsYWdzOwpAQCAtMTQzNSwxMSArMTQzNSwxMSBAQCBwdWJsaWMgT2JqZWN0V2FsayB0b09iamVjdFdhbGtXaXRoU2FtZU9iamVjdHMoKSB7CiAJICogICAgICAgICAgICB0aGUgb2JqZWN0IHRoaXMgd2Fsa2VyIHJlcXVpcmVzIGEgY29tbWl0IHJlZmVyZW5jZSBmb3IuCiAJICogQHJldHVybiBhIG5ldyB1bnBhcnNlZCByZWZlcmVuY2UgZm9yIHRoZSBvYmplY3QuCiAJICovCi0JcHJvdGVjdGVkIFJldkNvbW1pdCBjcmVhdGVDb21taXQoZmluYWwgQW55T2JqZWN0SWQgaWQpIHsKKwlwcm90ZWN0ZWQgUmV2Q29tbWl0IGNyZWF0ZUNvbW1pdChBbnlPYmplY3RJZCBpZCkgewogCQlyZXR1cm4gbmV3IFJldkNvbW1pdChpZCk7CiAJfQogCi0Jdm9pZCBjYXJyeUZsYWdzSW1wbChmaW5hbCBSZXZDb21taXQgYykgeworCXZvaWQgY2FycnlGbGFnc0ltcGwoUmV2Q29tbWl0IGMpIHsKIAkJZmluYWwgaW50IGNhcnJ5ID0gYy5mbGFncyAmIGNhcnJ5RmxhZ3M7CiAJCWlmIChjYXJyeSAhPSAwKQogCQkJUmV2Q29tbWl0LmNhcnJ5RmxhZ3MoYywgY2FycnkpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1Jld3JpdGVHZW5lcmF0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXdyaXRlR2VuZXJhdG9yLmphdmEKaW5kZXggZjgyMzAxYS4uMWM4NjhmZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1Jld3JpdGVHZW5lcmF0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV3cml0ZUdlbmVyYXRvci5qYXZhCkBAIC03NiwxMiArNzYsMTIgQEAgY2xhc3MgUmV3cml0ZUdlbmVyYXRvciBleHRlbmRzIEdlbmVyYXRvciB7CiAKIAlwcml2YXRlIGZpbmFsIEdlbmVyYXRvciBzb3VyY2U7CiAKLQlSZXdyaXRlR2VuZXJhdG9yKGZpbmFsIEdlbmVyYXRvciBzKSB7CisJUmV3cml0ZUdlbmVyYXRvcihHZW5lcmF0b3IgcykgewogCQlzb3VyY2UgPSBzOwogCX0KIAogCUBPdmVycmlkZQotCXZvaWQgc2hhcmVGcmVlTGlzdChmaW5hbCBCbG9ja1JldlF1ZXVlIHEpIHsKKwl2b2lkIHNoYXJlRnJlZUxpc3QoQmxvY2tSZXZRdWV1ZSBxKSB7CiAJCXNvdXJjZS5zaGFyZUZyZWVMaXN0KHEpOwogCX0KIApAQCAtMTQ4LDcgKzE0OCw3IEBAIHByaXZhdGUgUmV2Q29tbWl0IHJld3JpdGUoUmV2Q29tbWl0IHApIHsKIAkJfQogCX0KIAotCXByaXZhdGUgUmV2Q29tbWl0W10gY2xlYW51cChmaW5hbCBSZXZDb21taXRbXSBvbGRMaXN0KSB7CisJcHJpdmF0ZSBSZXZDb21taXRbXSBjbGVhbnVwKFJldkNvbW1pdFtdIG9sZExpc3QpIHsKIAkJLy8gUmVtb3ZlIGFueSBkdXBsaWNhdGUgcGFyZW50cyBjYXVzZWQgZHVlIHRvIHJld3JpdGVzIChlLmcuIGEgbWVyZ2UKIAkJLy8gd2l0aCB0d28gc2lkZXMgdGhhdCBib3RoIHNpbXBsaWZpZWQgYmFjayBpbnRvIHRoZSBtZXJnZSBiYXNlKS4KIAkJLy8gV2UgYWxzbyBtYXkgaGF2ZSBkZWxldGVkIGEgcGFyZW50IGJ5IG1hcmtpbmcgaXQgbnVsbC4KQEAgLTE2NywxNCArMTY3LDE0IEBAIHByaXZhdGUgUmV2Q29tbWl0IHJld3JpdGUoUmV2Q29tbWl0IHApIHsKIAkJfQogCiAJCWlmIChuZXdDbnQgPT0gb2xkTGlzdC5sZW5ndGgpIHsKLQkJCWZvciAoZmluYWwgUmV2Q29tbWl0IHAgOiBvbGRMaXN0KQorCQkJZm9yIChSZXZDb21taXQgcCA6IG9sZExpc3QpCiAJCQkJcC5mbGFncyAmPSB+RFVQTElDQVRFOwogCQkJcmV0dXJuIG9sZExpc3Q7CiAJCX0KIAogCQlmaW5hbCBSZXZDb21taXRbXSBuZXdMaXN0ID0gbmV3IFJldkNvbW1pdFtuZXdDbnRdOwogCQluZXdDbnQgPSAwOwotCQlmb3IgKGZpbmFsIFJldkNvbW1pdCBwIDogb2xkTGlzdCkgeworCQlmb3IgKFJldkNvbW1pdCBwIDogb2xkTGlzdCkgewogCQkJaWYgKHAgIT0gbnVsbCkgewogCQkJCW5ld0xpc3RbbmV3Q250KytdID0gcDsKIAkJCQlwLmZsYWdzICY9IH5EVVBMSUNBVEU7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvU3RhcnRHZW5lcmF0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9TdGFydEdlbmVyYXRvci5qYXZhCmluZGV4IDFlYzYyOTAuLmViMTI5YTIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9TdGFydEdlbmVyYXRvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9TdGFydEdlbmVyYXRvci5qYXZhCkBAIC02Niw3ICs2Niw3IEBACiBjbGFzcyBTdGFydEdlbmVyYXRvciBleHRlbmRzIEdlbmVyYXRvciB7CiAJcHJpdmF0ZSBmaW5hbCBSZXZXYWxrIHdhbGtlcjsKIAotCVN0YXJ0R2VuZXJhdG9yKGZpbmFsIFJldldhbGsgdykgeworCVN0YXJ0R2VuZXJhdG9yKFJldldhbGsgdykgewogCQl3YWxrZXIgPSB3OwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1RvcG9Tb3J0R2VuZXJhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvVG9wb1NvcnRHZW5lcmF0b3IuamF2YQppbmRleCA3YjExZDA0Li42NDUwMzQzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvVG9wb1NvcnRHZW5lcmF0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvVG9wb1NvcnRHZW5lcmF0b3IuamF2YQpAQCAtNjksNyArNjksNyBAQCBjbGFzcyBUb3BvU29ydEdlbmVyYXRvciBleHRlbmRzIEdlbmVyYXRvciB7CiAJICogQHRocm93cyBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uCiAJICogQHRocm93cyBJT0V4Y2VwdGlvbgogCSAqLwotCVRvcG9Tb3J0R2VuZXJhdG9yKGZpbmFsIEdlbmVyYXRvciBzKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKKwlUb3BvU29ydEdlbmVyYXRvcihHZW5lcmF0b3IgcykgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCiAJCQlJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCXBlbmRpbmcgPSBuZXcgRklGT1JldlF1ZXVlKCk7CiAJCW91dHB1dFR5cGUgPSBzLm91dHB1dFR5cGUoKSB8IFNPUlRfVE9QTzsKQEAgLTc4LDcgKzc4LDcgQEAgY2xhc3MgVG9wb1NvcnRHZW5lcmF0b3IgZXh0ZW5kcyBHZW5lcmF0b3IgewogCQkJZmluYWwgUmV2Q29tbWl0IGMgPSBzLm5leHQoKTsKIAkJCWlmIChjID09IG51bGwpCiAJCQkJYnJlYWs7Ci0JCQlmb3IgKGZpbmFsIFJldkNvbW1pdCBwIDogYy5wYXJlbnRzKQorCQkJZm9yIChSZXZDb21taXQgcCA6IGMucGFyZW50cykKIAkJCQlwLmluRGVncmVlKys7CiAJCQlwZW5kaW5nLmFkZChjKTsKIAkJfQpAQCAtOTAsNyArOTAsNyBAQCBpbnQgb3V0cHV0VHlwZSgpIHsKIAl9CiAKIAlAT3ZlcnJpZGUKLQl2b2lkIHNoYXJlRnJlZUxpc3QoZmluYWwgQmxvY2tSZXZRdWV1ZSBxKSB7CisJdm9pZCBzaGFyZUZyZWVMaXN0KEJsb2NrUmV2UXVldWUgcSkgewogCQlxLnNoYXJlRnJlZUxpc3QocGVuZGluZyk7CiAJfQogCkBAIC0xMTMsNyArMTEzLDcgQEAgUmV2Q29tbWl0IG5leHQoKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKIAkJCS8vIEFsbCBvZiBvdXIgY2hpbGRyZW4gaGF2ZSBhbHJlYWR5IHByb2R1Y2VkLAogCQkJLy8gc28gaXQgaXMgT0sgZm9yIHVzIHRvIHByb2R1Y2Ugbm93IGFzIHdlbGwuCiAJCQkvLwotCQkJZm9yIChmaW5hbCBSZXZDb21taXQgcCA6IGMucGFyZW50cykgeworCQkJZm9yIChSZXZDb21taXQgcCA6IGMucGFyZW50cykgewogCQkJCWlmICgtLXAuaW5EZWdyZWUgPT0gMCAmJiAocC5mbGFncyAmIFRPUE9fREVMQVkpICE9IDApIHsKIAkJCQkJLy8gVGhpcyBwYXJlbnQgdHJpZWQgdG8gY29tZSBiZWZvcmUgdXMsIGJ1dCB3ZSBhcmUKIAkJCQkJLy8gaGlzIGxhc3QgY2hpbGQuIHVucG9wIHRoZSBwYXJlbnQgc28gaXQgZ29lcyByaWdodApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1RyZWVSZXZGaWx0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9UcmVlUmV2RmlsdGVyLmphdmEKaW5kZXggOTljNWQ1OS4uMTEzMDE1MyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1RyZWVSZXZGaWx0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvVHJlZVJldkZpbHRlci5qYXZhCkBAIC04OSw3ICs4OSw3IEBAIHB1YmxpYyBjbGFzcyBUcmVlUmV2RmlsdGVyIGV4dGVuZHMgUmV2RmlsdGVyIHsKIAkgKiAgICAgICAgICAgIHJlcGxhY2VkIHdpdGggYSBuZXcgZmlsdGVyIGZvbGxvd2luZyBuZXcgcGF0aHMgYWZ0ZXIgYSByZW5hbWUuCiAJICogQHNpbmNlIDMuNQogCSAqLwotCXB1YmxpYyBUcmVlUmV2RmlsdGVyKGZpbmFsIFJldldhbGsgd2Fsa2VyLCBmaW5hbCBUcmVlRmlsdGVyIHQpIHsKKwlwdWJsaWMgVHJlZVJldkZpbHRlcihSZXZXYWxrIHdhbGtlciwgVHJlZUZpbHRlciB0KSB7CiAJCXRoaXMod2Fsa2VyLCB0LCAwKTsKIAl9CiAKQEAgLTEzMiw3ICsxMzIsNyBAQCBwdWJsaWMgUmV2RmlsdGVyIGNsb25lKCkgewogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKGZpbmFsIFJldldhbGsgd2Fsa2VyLCBmaW5hbCBSZXZDb21taXQgYykKKwlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKFJldldhbGsgd2Fsa2VyLCBSZXZDb21taXQgYykKIAkJCXRocm93cyBTdG9wV2Fsa0V4Y2VwdGlvbiwgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKIAkJCUluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJLy8gUmVzZXQgdGhlIHRyZWUgZmlsdGVyIHRvIHNjYW4gdGhpcyBjb21taXQgYW5kIHBhcmVudHMuCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvZmlsdGVyL0FuZFJldkZpbHRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL2ZpbHRlci9BbmRSZXZGaWx0ZXIuamF2YQppbmRleCAwMDE5ZTBjLi5kZmI4M2I0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvZmlsdGVyL0FuZFJldkZpbHRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9maWx0ZXIvQW5kUmV2RmlsdGVyLmphdmEKQEAgLTcyLDcgKzcyLDcgQEAgcHVibGljIGFic3RyYWN0IGNsYXNzIEFuZFJldkZpbHRlciBleHRlbmRzIFJldkZpbHRlciB7CiAJICogICAgICAgICAgICBzZWNvbmQgZmlsdGVyIHRvIHRlc3QuCiAJICogQHJldHVybiBhIGZpbHRlciB0aGF0IG11c3QgbWF0Y2ggYm90aCBpbnB1dCBmaWx0ZXJzLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgUmV2RmlsdGVyIGNyZWF0ZShmaW5hbCBSZXZGaWx0ZXIgYSwgZmluYWwgUmV2RmlsdGVyIGIpIHsKKwlwdWJsaWMgc3RhdGljIFJldkZpbHRlciBjcmVhdGUoUmV2RmlsdGVyIGEsIFJldkZpbHRlciBiKSB7CiAJCWlmIChhID09IEFMTCkKIAkJCXJldHVybiBiOwogCQlpZiAoYiA9PSBBTEwpCkBAIC04OCw3ICs4OCw3IEBAIHB1YmxpYyBzdGF0aWMgUmV2RmlsdGVyIGNyZWF0ZShmaW5hbCBSZXZGaWx0ZXIgYSwgZmluYWwgUmV2RmlsdGVyIGIpIHsKIAkgKiAgICAgICAgICAgIGZpbHRlcnMuCiAJICogQHJldHVybiBhIGZpbHRlciB0aGF0IG11c3QgbWF0Y2ggYWxsIGlucHV0IGZpbHRlcnMuCiAJICovCi0JcHVibGljIHN0YXRpYyBSZXZGaWx0ZXIgY3JlYXRlKGZpbmFsIFJldkZpbHRlcltdIGxpc3QpIHsKKwlwdWJsaWMgc3RhdGljIFJldkZpbHRlciBjcmVhdGUoUmV2RmlsdGVyW10gbGlzdCkgewogCQlpZiAobGlzdC5sZW5ndGggPT0gMikKIAkJCXJldHVybiBjcmVhdGUobGlzdFswXSwgbGlzdFsxXSk7CiAJCWlmIChsaXN0Lmxlbmd0aCA8IDIpCkBAIC0xMDYsNyArMTA2LDcgQEAgcHVibGljIHN0YXRpYyBSZXZGaWx0ZXIgY3JlYXRlKGZpbmFsIFJldkZpbHRlcltdIGxpc3QpIHsKIAkgKiAgICAgICAgICAgIGZpbHRlcnMuCiAJICogQHJldHVybiBhIGZpbHRlciB0aGF0IG11c3QgbWF0Y2ggYWxsIGlucHV0IGZpbHRlcnMuCiAJICovCi0JcHVibGljIHN0YXRpYyBSZXZGaWx0ZXIgY3JlYXRlKGZpbmFsIENvbGxlY3Rpb248UmV2RmlsdGVyPiBsaXN0KSB7CisJcHVibGljIHN0YXRpYyBSZXZGaWx0ZXIgY3JlYXRlKENvbGxlY3Rpb248UmV2RmlsdGVyPiBsaXN0KSB7CiAJCWlmIChsaXN0LnNpemUoKSA8IDIpCiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKEpHaXRUZXh0LmdldCgpLmF0TGVhc3RUd29GaWx0ZXJzTmVlZGVkKTsKIAkJZmluYWwgUmV2RmlsdGVyW10gc3ViZmlsdGVycyA9IG5ldyBSZXZGaWx0ZXJbbGlzdC5zaXplKCldOwpAQCAtMTIzLDcgKzEyMyw3IEBAIHByaXZhdGUgc3RhdGljIGNsYXNzIEJpbmFyeSBleHRlbmRzIEFuZFJldkZpbHRlciB7CiAKIAkJcHJpdmF0ZSBmaW5hbCBib29sZWFuIHJlcXVpcmVzQ29tbWl0Qm9keTsKIAotCQlCaW5hcnkoZmluYWwgUmV2RmlsdGVyIG9uZSwgZmluYWwgUmV2RmlsdGVyIHR3bykgeworCQlCaW5hcnkoUmV2RmlsdGVyIG9uZSwgUmV2RmlsdGVyIHR3bykgewogCQkJYSA9IG9uZTsKIAkJCWIgPSB0d287CiAJCQlyZXF1aXJlc0NvbW1pdEJvZHkgPSBhLnJlcXVpcmVzQ29tbWl0Qm9keSgpCkBAIC0xMzEsNyArMTMxLDcgQEAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQmluYXJ5IGV4dGVuZHMgQW5kUmV2RmlsdGVyIHsKIAkJfQogCiAJCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKGZpbmFsIFJldldhbGsgd2Fsa2VyLCBmaW5hbCBSZXZDb21taXQgYykKKwkJcHVibGljIGJvb2xlYW4gaW5jbHVkZShSZXZXYWxrIHdhbGtlciwgUmV2Q29tbWl0IGMpCiAJCQkJdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sCiAJCQkJSU9FeGNlcHRpb24gewogCQkJcmV0dXJuIGEuaW5jbHVkZSh3YWxrZXIsIGMpICYmIGIuaW5jbHVkZSh3YWxrZXIsIGMpOwpAQCAtMTU5LDcgKzE1OSw3IEBAIHByaXZhdGUgc3RhdGljIGNsYXNzIExpc3QgZXh0ZW5kcyBBbmRSZXZGaWx0ZXIgewogCiAJCXByaXZhdGUgZmluYWwgYm9vbGVhbiByZXF1aXJlc0NvbW1pdEJvZHk7CiAKLQkJTGlzdChmaW5hbCBSZXZGaWx0ZXJbXSBsaXN0KSB7CisJCUxpc3QoUmV2RmlsdGVyW10gbGlzdCkgewogCQkJc3ViZmlsdGVycyA9IGxpc3Q7CiAKIAkJCWJvb2xlYW4gcmNiID0gZmFsc2U7CkBAIC0xNjksMTAgKzE2OSwxMCBAQCBwcml2YXRlIHN0YXRpYyBjbGFzcyBMaXN0IGV4dGVuZHMgQW5kUmV2RmlsdGVyIHsKIAkJfQogCiAJCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKGZpbmFsIFJldldhbGsgd2Fsa2VyLCBmaW5hbCBSZXZDb21taXQgYykKKwkJcHVibGljIGJvb2xlYW4gaW5jbHVkZShSZXZXYWxrIHdhbGtlciwgUmV2Q29tbWl0IGMpCiAJCQkJdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sCiAJCQkJSU9FeGNlcHRpb24gewotCQkJZm9yIChmaW5hbCBSZXZGaWx0ZXIgZiA6IHN1YmZpbHRlcnMpIHsKKwkJCWZvciAoUmV2RmlsdGVyIGYgOiBzdWJmaWx0ZXJzKSB7CiAJCQkJaWYgKCFmLmluY2x1ZGUod2Fsa2VyLCBjKSkKIAkJCQkJcmV0dXJuIGZhbHNlOwogCQkJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL2ZpbHRlci9BdXRob3JSZXZGaWx0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9maWx0ZXIvQXV0aG9yUmV2RmlsdGVyLmphdmEKaW5kZXggZTAwZmVhZi4uMzM0ZDRmMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL2ZpbHRlci9BdXRob3JSZXZGaWx0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvZmlsdGVyL0F1dGhvclJldkZpbHRlci5qYXZhCkBAIC04MSw3ICs4MSw3IEBAIHByaXZhdGUgQXV0aG9yUmV2RmlsdGVyKCkgewogCQkvLyBEb24ndCBwZXJtaXQgdXMgdG8gYmUgY3JlYXRlZC4KIAl9CiAKLQlzdGF0aWMgUmF3Q2hhclNlcXVlbmNlIHRleHRGb3IoZmluYWwgUmV2Q29tbWl0IGNtaXQpIHsKKwlzdGF0aWMgUmF3Q2hhclNlcXVlbmNlIHRleHRGb3IoUmV2Q29tbWl0IGNtaXQpIHsKIAkJZmluYWwgYnl0ZVtdIHJhdyA9IGNtaXQuZ2V0UmF3QnVmZmVyKCk7CiAJCWZpbmFsIGludCBiID0gUmF3UGFyc2VVdGlscy5hdXRob3IocmF3LCAwKTsKIAkJaWYgKGIgPCAwKQpAQCAtOTEsMTIgKzkxLDEyIEBAIHN0YXRpYyBSYXdDaGFyU2VxdWVuY2UgdGV4dEZvcihmaW5hbCBSZXZDb21taXQgY21pdCkgewogCX0KIAogCXByaXZhdGUgc3RhdGljIGNsYXNzIFBhdHRlcm5TZWFyY2ggZXh0ZW5kcyBQYXR0ZXJuTWF0Y2hSZXZGaWx0ZXIgewotCQlQYXR0ZXJuU2VhcmNoKGZpbmFsIFN0cmluZyBwYXR0ZXJuVGV4dCkgeworCQlQYXR0ZXJuU2VhcmNoKFN0cmluZyBwYXR0ZXJuVGV4dCkgewogCQkJc3VwZXIocGF0dGVyblRleHQsIHRydWUsIHRydWUsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSk7CiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIENoYXJTZXF1ZW5jZSB0ZXh0KGZpbmFsIFJldkNvbW1pdCBjbWl0KSB7CisJCXByb3RlY3RlZCBDaGFyU2VxdWVuY2UgdGV4dChSZXZDb21taXQgY21pdCkgewogCQkJcmV0dXJuIHRleHRGb3IoY21pdCk7CiAJCX0KIApAQCAtMTA3LDEyICsxMDcsMTIgQEAgcHVibGljIFJldkZpbHRlciBjbG9uZSgpIHsKIAl9CiAKIAlwcml2YXRlIHN0YXRpYyBjbGFzcyBTdWJTdHJpbmdTZWFyY2ggZXh0ZW5kcyBTdWJTdHJpbmdSZXZGaWx0ZXIgewotCQlTdWJTdHJpbmdTZWFyY2goZmluYWwgU3RyaW5nIHBhdHRlcm5UZXh0KSB7CisJCVN1YlN0cmluZ1NlYXJjaChTdHJpbmcgcGF0dGVyblRleHQpIHsKIAkJCXN1cGVyKHBhdHRlcm5UZXh0KTsKIAkJfQogCiAJCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgUmF3Q2hhclNlcXVlbmNlIHRleHQoZmluYWwgUmV2Q29tbWl0IGNtaXQpIHsKKwkJcHJvdGVjdGVkIFJhd0NoYXJTZXF1ZW5jZSB0ZXh0KFJldkNvbW1pdCBjbWl0KSB7CiAJCQlyZXR1cm4gdGV4dEZvcihjbWl0KTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9maWx0ZXIvQ29tbWl0VGltZVJldkZpbHRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL2ZpbHRlci9Db21taXRUaW1lUmV2RmlsdGVyLmphdmEKaW5kZXggOWY0ZjEwZi4uMzg4MDUxNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL2ZpbHRlci9Db21taXRUaW1lUmV2RmlsdGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL2ZpbHRlci9Db21taXRUaW1lUmV2RmlsdGVyLmphdmEKQEAgLTY0LDcgKzY0LDcgQEAgcHVibGljIGFic3RyYWN0IGNsYXNzIENvbW1pdFRpbWVSZXZGaWx0ZXIgZXh0ZW5kcyBSZXZGaWx0ZXIgewogCSAqICAgICAgICAgICAgdGhlIHBvaW50IGluIHRpbWUgdG8gY3V0IG9uLgogCSAqIEByZXR1cm4gYSBuZXcgZmlsdGVyIHRvIHNlbGVjdCBjb21taXRzIG9uIG9yIGJlZm9yZSA8Y29kZT50czwvY29kZT4uCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBSZXZGaWx0ZXIgYmVmb3JlKGZpbmFsIERhdGUgdHMpIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFJldkZpbHRlciBiZWZvcmUoRGF0ZSB0cykgewogCQlyZXR1cm4gYmVmb3JlKHRzLmdldFRpbWUoKSk7CiAJfQogCkBAIC03NSw3ICs3NSw3IEBAIHB1YmxpYyBzdGF0aWMgZmluYWwgUmV2RmlsdGVyIGJlZm9yZShmaW5hbCBEYXRlIHRzKSB7CiAJICogICAgICAgICAgICB0aGUgcG9pbnQgaW4gdGltZSB0byBjdXQgb24sIGluIG1pbGxpc2Vjb25kcwogCSAqIEByZXR1cm4gYSBuZXcgZmlsdGVyIHRvIHNlbGVjdCBjb21taXRzIG9uIG9yIGJlZm9yZSA8Y29kZT50czwvY29kZT4uCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBSZXZGaWx0ZXIgYmVmb3JlKGZpbmFsIGxvbmcgdHMpIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFJldkZpbHRlciBiZWZvcmUobG9uZyB0cykgewogCQlyZXR1cm4gbmV3IEJlZm9yZSh0cyk7CiAJfQogCkBAIC04Niw3ICs4Niw3IEBAIHB1YmxpYyBzdGF0aWMgZmluYWwgUmV2RmlsdGVyIGJlZm9yZShmaW5hbCBsb25nIHRzKSB7CiAJICogICAgICAgICAgICB0aGUgcG9pbnQgaW4gdGltZSB0byBjdXQgb24uCiAJICogQHJldHVybiBhIG5ldyBmaWx0ZXIgdG8gc2VsZWN0IGNvbW1pdHMgb24gb3IgYWZ0ZXIgPGNvZGU+dHM8L2NvZGU+LgogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUmV2RmlsdGVyIGFmdGVyKGZpbmFsIERhdGUgdHMpIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFJldkZpbHRlciBhZnRlcihEYXRlIHRzKSB7CiAJCXJldHVybiBhZnRlcih0cy5nZXRUaW1lKCkpOwogCX0KIApAQCAtOTcsNyArOTcsNyBAQCBwdWJsaWMgc3RhdGljIGZpbmFsIFJldkZpbHRlciBhZnRlcihmaW5hbCBEYXRlIHRzKSB7CiAJICogICAgICAgICAgICB0aGUgcG9pbnQgaW4gdGltZSB0byBjdXQgb24sIGluIG1pbGxpc2Vjb25kcy4KIAkgKiBAcmV0dXJuIGEgbmV3IGZpbHRlciB0byBzZWxlY3QgY29tbWl0cyBvbiBvciBhZnRlciA8Y29kZT50czwvY29kZT4uCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBSZXZGaWx0ZXIgYWZ0ZXIoZmluYWwgbG9uZyB0cykgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgUmV2RmlsdGVyIGFmdGVyKGxvbmcgdHMpIHsKIAkJcmV0dXJuIG5ldyBBZnRlcih0cyk7CiAJfQogCkBAIC0xMDksNyArMTA5LDcgQEAgcHVibGljIHN0YXRpYyBmaW5hbCBSZXZGaWx0ZXIgYWZ0ZXIoZmluYWwgbG9uZyB0cykgewogCSAqIEBwYXJhbSB1bnRpbCB0aGUgcG9pbnQgaW4gdGltZSB0byBjdXQgb2ZmLgogCSAqIEByZXR1cm4gYSBuZXcgZmlsdGVyIHRvIHNlbGVjdCBjb21taXRzIGJldHdlZW4gdGhlIGdpdmVuIGRhdGUvdGltZXMuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBSZXZGaWx0ZXIgYmV0d2VlbihmaW5hbCBEYXRlIHNpbmNlLCBmaW5hbCBEYXRlIHVudGlsKSB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBSZXZGaWx0ZXIgYmV0d2VlbihEYXRlIHNpbmNlLCBEYXRlIHVudGlsKSB7CiAJCXJldHVybiBiZXR3ZWVuKHNpbmNlLmdldFRpbWUoKSwgdW50aWwuZ2V0VGltZSgpKTsKIAl9CiAKQEAgLTEyMSwxMyArMTIxLDEzIEBAIHB1YmxpYyBzdGF0aWMgZmluYWwgUmV2RmlsdGVyIGJldHdlZW4oZmluYWwgRGF0ZSBzaW5jZSwgZmluYWwgRGF0ZSB1bnRpbCkgewogCSAqIEBwYXJhbSB1bnRpbCB0aGUgcG9pbnQgaW4gdGltZSB0byBjdXQgb2ZmLCBpbiBtaWxsaXNjb25kcy4KIAkgKiBAcmV0dXJuIGEgbmV3IGZpbHRlciB0byBzZWxlY3QgY29tbWl0cyBiZXR3ZWVuIHRoZSBnaXZlbiBkYXRlL3RpbWVzLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUmV2RmlsdGVyIGJldHdlZW4oZmluYWwgbG9uZyBzaW5jZSwgZmluYWwgbG9uZyB1bnRpbCkgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgUmV2RmlsdGVyIGJldHdlZW4obG9uZyBzaW5jZSwgbG9uZyB1bnRpbCkgewogCQlyZXR1cm4gbmV3IEJldHdlZW4oc2luY2UsIHVudGlsKTsKIAl9CiAKIAlmaW5hbCBpbnQgd2hlbjsKIAotCUNvbW1pdFRpbWVSZXZGaWx0ZXIoZmluYWwgbG9uZyB0cykgeworCUNvbW1pdFRpbWVSZXZGaWx0ZXIobG9uZyB0cykgewogCQl3aGVuID0gKGludCkgKHRzIC8gMTAwMCk7CiAJfQogCkBAIC0xNDQsMTIgKzE0NCwxMiBAQCBwdWJsaWMgYm9vbGVhbiByZXF1aXJlc0NvbW1pdEJvZHkoKSB7CiAJfQogCiAJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQmVmb3JlIGV4dGVuZHMgQ29tbWl0VGltZVJldkZpbHRlciB7Ci0JCUJlZm9yZShmaW5hbCBsb25nIHRzKSB7CisJCUJlZm9yZShsb25nIHRzKSB7CiAJCQlzdXBlcih0cyk7CiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gaW5jbHVkZShmaW5hbCBSZXZXYWxrIHdhbGtlciwgZmluYWwgUmV2Q29tbWl0IGNtaXQpCisJCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoUmV2V2FsayB3YWxrZXIsIFJldkNvbW1pdCBjbWl0KQogCQkJCXRocm93cyBTdG9wV2Fsa0V4Y2VwdGlvbiwgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKIAkJCQlJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCQlyZXR1cm4gY21pdC5nZXRDb21taXRUaW1lKCkgPD0gd2hlbjsKQEAgLTE2MywxMiArMTYzLDEyIEBAIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJfQogCiAJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQWZ0ZXIgZXh0ZW5kcyBDb21taXRUaW1lUmV2RmlsdGVyIHsKLQkJQWZ0ZXIoZmluYWwgbG9uZyB0cykgeworCQlBZnRlcihsb25nIHRzKSB7CiAJCQlzdXBlcih0cyk7CiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gaW5jbHVkZShmaW5hbCBSZXZXYWxrIHdhbGtlciwgZmluYWwgUmV2Q29tbWl0IGNtaXQpCisJCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoUmV2V2FsayB3YWxrZXIsIFJldkNvbW1pdCBjbWl0KQogCQkJCXRocm93cyBTdG9wV2Fsa0V4Y2VwdGlvbiwgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKIAkJCQlJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCQkvLyBTaW5jZSB0aGUgd2Fsa2VyIHNvcnRzIGNvbW1pdHMgYnkgY29tbWl0IHRpbWUgd2UgY2FuIGJlCkBAIC0xOTAsMTMgKzE5MCwxMyBAQCBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCXByaXZhdGUgc3RhdGljIGNsYXNzIEJldHdlZW4gZXh0ZW5kcyBDb21taXRUaW1lUmV2RmlsdGVyIHsKIAkJcHJpdmF0ZSBmaW5hbCBpbnQgdW50aWw7CiAKLQkJQmV0d2VlbihmaW5hbCBsb25nIHNpbmNlLCBmaW5hbCBsb25nIHVudGlsKSB7CisJCUJldHdlZW4obG9uZyBzaW5jZSwgbG9uZyB1bnRpbCkgewogCQkJc3VwZXIoc2luY2UpOwogCQkJdGhpcy51bnRpbCA9IChpbnQpICh1bnRpbCAvIDEwMDApOwogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoZmluYWwgUmV2V2FsayB3YWxrZXIsIGZpbmFsIFJldkNvbW1pdCBjbWl0KQorCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKFJldldhbGsgd2Fsa2VyLCBSZXZDb21taXQgY21pdCkKIAkJCQl0aHJvd3MgU3RvcFdhbGtFeGNlcHRpb24sIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCiAJCQkJSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQkJcmV0dXJuIGNtaXQuZ2V0Q29tbWl0VGltZSgpIDw9IHVudGlsICYmIGNtaXQuZ2V0Q29tbWl0VGltZSgpID49IHdoZW47CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvZmlsdGVyL0NvbW1pdHRlclJldkZpbHRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL2ZpbHRlci9Db21taXR0ZXJSZXZGaWx0ZXIuamF2YQppbmRleCA0YTFiM2E2Li4zN2M4NDBlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvZmlsdGVyL0NvbW1pdHRlclJldkZpbHRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9maWx0ZXIvQ29tbWl0dGVyUmV2RmlsdGVyLmphdmEKQEAgLTgxLDcgKzgxLDcgQEAgcHJpdmF0ZSBDb21taXR0ZXJSZXZGaWx0ZXIoKSB7CiAJCS8vIERvbid0IHBlcm1pdCB1cyB0byBiZSBjcmVhdGVkLgogCX0KIAotCXN0YXRpYyBSYXdDaGFyU2VxdWVuY2UgdGV4dEZvcihmaW5hbCBSZXZDb21taXQgY21pdCkgeworCXN0YXRpYyBSYXdDaGFyU2VxdWVuY2UgdGV4dEZvcihSZXZDb21taXQgY21pdCkgewogCQlmaW5hbCBieXRlW10gcmF3ID0gY21pdC5nZXRSYXdCdWZmZXIoKTsKIAkJZmluYWwgaW50IGIgPSBSYXdQYXJzZVV0aWxzLmNvbW1pdHRlcihyYXcsIDApOwogCQlpZiAoYiA8IDApCkBAIC05MSwxMiArOTEsMTIgQEAgc3RhdGljIFJhd0NoYXJTZXF1ZW5jZSB0ZXh0Rm9yKGZpbmFsIFJldkNvbW1pdCBjbWl0KSB7CiAJfQogCiAJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUGF0dGVyblNlYXJjaCBleHRlbmRzIFBhdHRlcm5NYXRjaFJldkZpbHRlciB7Ci0JCVBhdHRlcm5TZWFyY2goZmluYWwgU3RyaW5nIHBhdHRlcm5UZXh0KSB7CisJCVBhdHRlcm5TZWFyY2goU3RyaW5nIHBhdHRlcm5UZXh0KSB7CiAJCQlzdXBlcihwYXR0ZXJuVGV4dCwgdHJ1ZSwgdHJ1ZSwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFKTsKIAkJfQogCiAJCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQ2hhclNlcXVlbmNlIHRleHQoZmluYWwgUmV2Q29tbWl0IGNtaXQpIHsKKwkJcHJvdGVjdGVkIENoYXJTZXF1ZW5jZSB0ZXh0KFJldkNvbW1pdCBjbWl0KSB7CiAJCQlyZXR1cm4gdGV4dEZvcihjbWl0KTsKIAkJfQogCkBAIC0xMDcsMTIgKzEwNywxMiBAQCBwdWJsaWMgUmV2RmlsdGVyIGNsb25lKCkgewogCX0KIAogCXByaXZhdGUgc3RhdGljIGNsYXNzIFN1YlN0cmluZ1NlYXJjaCBleHRlbmRzIFN1YlN0cmluZ1JldkZpbHRlciB7Ci0JCVN1YlN0cmluZ1NlYXJjaChmaW5hbCBTdHJpbmcgcGF0dGVyblRleHQpIHsKKwkJU3ViU3RyaW5nU2VhcmNoKFN0cmluZyBwYXR0ZXJuVGV4dCkgewogCQkJc3VwZXIocGF0dGVyblRleHQpOwogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBSYXdDaGFyU2VxdWVuY2UgdGV4dChmaW5hbCBSZXZDb21taXQgY21pdCkgeworCQlwcm90ZWN0ZWQgUmF3Q2hhclNlcXVlbmNlIHRleHQoUmV2Q29tbWl0IGNtaXQpIHsKIAkJCXJldHVybiB0ZXh0Rm9yKGNtaXQpOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL2ZpbHRlci9NZXNzYWdlUmV2RmlsdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvZmlsdGVyL01lc3NhZ2VSZXZGaWx0ZXIuamF2YQppbmRleCBmMWY0MDY1Li40ODBhYWEzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvZmlsdGVyL01lc3NhZ2VSZXZGaWx0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvZmlsdGVyL01lc3NhZ2VSZXZGaWx0ZXIuamF2YQpAQCAtODEsNyArODEsNyBAQCBwcml2YXRlIE1lc3NhZ2VSZXZGaWx0ZXIoKSB7CiAJCS8vIERvbid0IHBlcm1pdCB1cyB0byBiZSBjcmVhdGVkLgogCX0KIAotCXN0YXRpYyBSYXdDaGFyU2VxdWVuY2UgdGV4dEZvcihmaW5hbCBSZXZDb21taXQgY21pdCkgeworCXN0YXRpYyBSYXdDaGFyU2VxdWVuY2UgdGV4dEZvcihSZXZDb21taXQgY21pdCkgewogCQlmaW5hbCBieXRlW10gcmF3ID0gY21pdC5nZXRSYXdCdWZmZXIoKTsKIAkJZmluYWwgaW50IGIgPSBSYXdQYXJzZVV0aWxzLmNvbW1pdE1lc3NhZ2UocmF3LCAwKTsKIAkJaWYgKGIgPCAwKQpAQCAtOTAsMTMgKzkwLDEzIEBAIHN0YXRpYyBSYXdDaGFyU2VxdWVuY2UgdGV4dEZvcihmaW5hbCBSZXZDb21taXQgY21pdCkgewogCX0KIAogCXByaXZhdGUgc3RhdGljIGNsYXNzIFBhdHRlcm5TZWFyY2ggZXh0ZW5kcyBQYXR0ZXJuTWF0Y2hSZXZGaWx0ZXIgewotCQlQYXR0ZXJuU2VhcmNoKGZpbmFsIFN0cmluZyBwYXR0ZXJuVGV4dCkgeworCQlQYXR0ZXJuU2VhcmNoKFN0cmluZyBwYXR0ZXJuVGV4dCkgewogCQkJc3VwZXIocGF0dGVyblRleHQsIHRydWUsIHRydWUsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRQogCQkJCQl8IFBhdHRlcm4uRE9UQUxMKTsKIAkJfQogCiAJCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQ2hhclNlcXVlbmNlIHRleHQoZmluYWwgUmV2Q29tbWl0IGNtaXQpIHsKKwkJcHJvdGVjdGVkIENoYXJTZXF1ZW5jZSB0ZXh0KFJldkNvbW1pdCBjbWl0KSB7CiAJCQlyZXR1cm4gdGV4dEZvcihjbWl0KTsKIAkJfQogCkBAIC0xMDcsMTIgKzEwNywxMiBAQCBwdWJsaWMgUmV2RmlsdGVyIGNsb25lKCkgewogCX0KIAogCXByaXZhdGUgc3RhdGljIGNsYXNzIFN1YlN0cmluZ1NlYXJjaCBleHRlbmRzIFN1YlN0cmluZ1JldkZpbHRlciB7Ci0JCVN1YlN0cmluZ1NlYXJjaChmaW5hbCBTdHJpbmcgcGF0dGVyblRleHQpIHsKKwkJU3ViU3RyaW5nU2VhcmNoKFN0cmluZyBwYXR0ZXJuVGV4dCkgewogCQkJc3VwZXIocGF0dGVyblRleHQpOwogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBSYXdDaGFyU2VxdWVuY2UgdGV4dChmaW5hbCBSZXZDb21taXQgY21pdCkgeworCQlwcm90ZWN0ZWQgUmF3Q2hhclNlcXVlbmNlIHRleHQoUmV2Q29tbWl0IGNtaXQpIHsKIAkJCXJldHVybiB0ZXh0Rm9yKGNtaXQpOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL2ZpbHRlci9Ob3RSZXZGaWx0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9maWx0ZXIvTm90UmV2RmlsdGVyLmphdmEKaW5kZXggODRiN2Y2Yi4uNjlkZWM1NiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL2ZpbHRlci9Ob3RSZXZGaWx0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvZmlsdGVyL05vdFJldkZpbHRlci5qYXZhCkBAIC02MSwxMyArNjEsMTMgQEAgcHVibGljIGNsYXNzIE5vdFJldkZpbHRlciBleHRlbmRzIFJldkZpbHRlciB7CiAJICogICAgICAgICAgICBmaWx0ZXIgdG8gbmVnYXRlLgogCSAqIEByZXR1cm4gYSBmaWx0ZXIgdGhhdCBkb2VzIHRoZSByZXZlcnNlIG9mIDxjb2RlPmE8L2NvZGU+LgogCSAqLwotCXB1YmxpYyBzdGF0aWMgUmV2RmlsdGVyIGNyZWF0ZShmaW5hbCBSZXZGaWx0ZXIgYSkgeworCXB1YmxpYyBzdGF0aWMgUmV2RmlsdGVyIGNyZWF0ZShSZXZGaWx0ZXIgYSkgewogCQlyZXR1cm4gbmV3IE5vdFJldkZpbHRlcihhKTsKIAl9CiAKIAlwcml2YXRlIGZpbmFsIFJldkZpbHRlciBhOwogCi0JcHJpdmF0ZSBOb3RSZXZGaWx0ZXIoZmluYWwgUmV2RmlsdGVyIG9uZSkgeworCXByaXZhdGUgTm90UmV2RmlsdGVyKFJldkZpbHRlciBvbmUpIHsKIAkJYSA9IG9uZTsKIAl9CiAKQEAgLTc5LDcgKzc5LDcgQEAgcHVibGljIFJldkZpbHRlciBuZWdhdGUoKSB7CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoZmluYWwgUmV2V2FsayB3YWxrZXIsIGZpbmFsIFJldkNvbW1pdCBjKQorCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoUmV2V2FsayB3YWxrZXIsIFJldkNvbW1pdCBjKQogCQkJdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sCiAJCQlJT0V4Y2VwdGlvbiB7CiAJCXJldHVybiAhYS5pbmNsdWRlKHdhbGtlciwgYyk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvZmlsdGVyL09yUmV2RmlsdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvZmlsdGVyL09yUmV2RmlsdGVyLmphdmEKaW5kZXggYTE0NzY0YS4uMWNlZjEyZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL2ZpbHRlci9PclJldkZpbHRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9maWx0ZXIvT3JSZXZGaWx0ZXIuamF2YQpAQCAtNzIsNyArNzIsNyBAQCBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgT3JSZXZGaWx0ZXIgZXh0ZW5kcyBSZXZGaWx0ZXIgewogCSAqICAgICAgICAgICAgc2Vjb25kIGZpbHRlciB0byB0ZXN0LgogCSAqIEByZXR1cm4gYSBmaWx0ZXIgdGhhdCBtdXN0IG1hdGNoIGF0IGxlYXN0IG9uZSBpbnB1dCBmaWx0ZXIuCiAJICovCi0JcHVibGljIHN0YXRpYyBSZXZGaWx0ZXIgY3JlYXRlKGZpbmFsIFJldkZpbHRlciBhLCBmaW5hbCBSZXZGaWx0ZXIgYikgeworCXB1YmxpYyBzdGF0aWMgUmV2RmlsdGVyIGNyZWF0ZShSZXZGaWx0ZXIgYSwgUmV2RmlsdGVyIGIpIHsKIAkJaWYgKGEgPT0gQUxMIHx8IGIgPT0gQUxMKQogCQkJcmV0dXJuIEFMTDsKIAkJcmV0dXJuIG5ldyBCaW5hcnkoYSwgYik7CkBAIC04Niw3ICs4Niw3IEBAIHB1YmxpYyBzdGF0aWMgUmV2RmlsdGVyIGNyZWF0ZShmaW5hbCBSZXZGaWx0ZXIgYSwgZmluYWwgUmV2RmlsdGVyIGIpIHsKIAkgKiAgICAgICAgICAgIGZpbHRlcnMuCiAJICogQHJldHVybiBhIGZpbHRlciB0aGF0IG11c3QgbWF0Y2ggYXQgbGVhc3Qgb25lIGlucHV0IGZpbHRlci4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIFJldkZpbHRlciBjcmVhdGUoZmluYWwgUmV2RmlsdGVyW10gbGlzdCkgeworCXB1YmxpYyBzdGF0aWMgUmV2RmlsdGVyIGNyZWF0ZShSZXZGaWx0ZXJbXSBsaXN0KSB7CiAJCWlmIChsaXN0Lmxlbmd0aCA9PSAyKQogCQkJcmV0dXJuIGNyZWF0ZShsaXN0WzBdLCBsaXN0WzFdKTsKIAkJaWYgKGxpc3QubGVuZ3RoIDwgMikKQEAgLTEwNCw3ICsxMDQsNyBAQCBwdWJsaWMgc3RhdGljIFJldkZpbHRlciBjcmVhdGUoZmluYWwgUmV2RmlsdGVyW10gbGlzdCkgewogCSAqICAgICAgICAgICAgZmlsdGVycy4KIAkgKiBAcmV0dXJuIGEgZmlsdGVyIHRoYXQgbXVzdCBtYXRjaCBhdCBsZWFzdCBvbmUgaW5wdXQgZmlsdGVyLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgUmV2RmlsdGVyIGNyZWF0ZShmaW5hbCBDb2xsZWN0aW9uPFJldkZpbHRlcj4gbGlzdCkgeworCXB1YmxpYyBzdGF0aWMgUmV2RmlsdGVyIGNyZWF0ZShDb2xsZWN0aW9uPFJldkZpbHRlcj4gbGlzdCkgewogCQlpZiAobGlzdC5zaXplKCkgPCAyKQogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihKR2l0VGV4dC5nZXQoKS5hdExlYXN0VHdvRmlsdGVyc05lZWRlZCk7CiAJCWZpbmFsIFJldkZpbHRlcltdIHN1YmZpbHRlcnMgPSBuZXcgUmV2RmlsdGVyW2xpc3Quc2l6ZSgpXTsKQEAgLTEyMSw3ICsxMjEsNyBAQCBwcml2YXRlIHN0YXRpYyBjbGFzcyBCaW5hcnkgZXh0ZW5kcyBPclJldkZpbHRlciB7CiAKIAkJcHJpdmF0ZSBmaW5hbCBib29sZWFuIHJlcXVpcmVzQ29tbWl0Qm9keTsKIAotCQlCaW5hcnkoZmluYWwgUmV2RmlsdGVyIG9uZSwgZmluYWwgUmV2RmlsdGVyIHR3bykgeworCQlCaW5hcnkoUmV2RmlsdGVyIG9uZSwgUmV2RmlsdGVyIHR3bykgewogCQkJYSA9IG9uZTsKIAkJCWIgPSB0d287CiAJCQlyZXF1aXJlc0NvbW1pdEJvZHkgPSBhLnJlcXVpcmVzQ29tbWl0Qm9keSgpCkBAIC0xMjksNyArMTI5LDcgQEAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQmluYXJ5IGV4dGVuZHMgT3JSZXZGaWx0ZXIgewogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoZmluYWwgUmV2V2FsayB3YWxrZXIsIGZpbmFsIFJldkNvbW1pdCBjKQorCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKFJldldhbGsgd2Fsa2VyLCBSZXZDb21taXQgYykKIAkJCQl0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwKIAkJCQlJT0V4Y2VwdGlvbiB7CiAJCQlyZXR1cm4gYS5pbmNsdWRlKHdhbGtlciwgYykgfHwgYi5pbmNsdWRlKHdhbGtlciwgYyk7CkBAIC0xNTcsNyArMTU3LDcgQEAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTGlzdCBleHRlbmRzIE9yUmV2RmlsdGVyIHsKIAogCQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gcmVxdWlyZXNDb21taXRCb2R5OwogCi0JCUxpc3QoZmluYWwgUmV2RmlsdGVyW10gbGlzdCkgeworCQlMaXN0KFJldkZpbHRlcltdIGxpc3QpIHsKIAkJCXN1YmZpbHRlcnMgPSBsaXN0OwogCiAJCQlib29sZWFuIHJjYiA9IGZhbHNlOwpAQCAtMTY3LDEwICsxNjcsMTAgQEAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTGlzdCBleHRlbmRzIE9yUmV2RmlsdGVyIHsKIAkJfQogCiAJCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKGZpbmFsIFJldldhbGsgd2Fsa2VyLCBmaW5hbCBSZXZDb21taXQgYykKKwkJcHVibGljIGJvb2xlYW4gaW5jbHVkZShSZXZXYWxrIHdhbGtlciwgUmV2Q29tbWl0IGMpCiAJCQkJdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sCiAJCQkJSU9FeGNlcHRpb24gewotCQkJZm9yIChmaW5hbCBSZXZGaWx0ZXIgZiA6IHN1YmZpbHRlcnMpIHsKKwkJCWZvciAoUmV2RmlsdGVyIGYgOiBzdWJmaWx0ZXJzKSB7CiAJCQkJaWYgKGYuaW5jbHVkZSh3YWxrZXIsIGMpKQogCQkJCQlyZXR1cm4gdHJ1ZTsKIAkJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9maWx0ZXIvUGF0dGVybk1hdGNoUmV2RmlsdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvZmlsdGVyL1BhdHRlcm5NYXRjaFJldkZpbHRlci5qYXZhCmluZGV4IGVkY2UyMjQuLjRmNDFlZGYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9maWx0ZXIvUGF0dGVybk1hdGNoUmV2RmlsdGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL2ZpbHRlci9QYXR0ZXJuTWF0Y2hSZXZGaWx0ZXIuamF2YQpAQCAtNzIsNyArNzIsNyBAQCBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUGF0dGVybk1hdGNoUmV2RmlsdGVyIGV4dGVuZHMgUmV2RmlsdGVyIHsKIAkgKiBAcmV0dXJuIHNhbWUgcGF0dGVybiwgYnV0IHJlLWVuY29kZWQgdG8gbWF0Y2ggb3VyIGZ1bm55IHJhdyBVVEYtOAogCSAqICAgICAgICAgY2hhcmFjdGVyIHNlcXVlbmNlIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuUmF3Q2hhclNlcXVlbmNlfS4KIAkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBmb3JjZVRvUmF3KGZpbmFsIFN0cmluZyBwYXR0ZXJuVGV4dCkgeworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIGZvcmNlVG9SYXcoU3RyaW5nIHBhdHRlcm5UZXh0KSB7CiAJCWZpbmFsIGJ5dGVbXSBiID0gQ29uc3RhbnRzLmVuY29kZShwYXR0ZXJuVGV4dCk7CiAJCWZpbmFsIFN0cmluZ0J1aWxkZXIgbmVlZGxlID0gbmV3IFN0cmluZ0J1aWxkZXIoYi5sZW5ndGgpOwogCQlmb3IgKGludCBpID0gMDsgaSA8IGIubGVuZ3RoOyBpKyspCkBAIC0xMjgsNyArMTI4LDcgQEAgcHVibGljIFN0cmluZyBwYXR0ZXJuKCkgewogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKGZpbmFsIFJldldhbGsgd2Fsa2VyLCBmaW5hbCBSZXZDb21taXQgY21pdCkKKwlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKFJldldhbGsgd2Fsa2VyLCBSZXZDb21taXQgY21pdCkKIAkJCXRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLAogCQkJSU9FeGNlcHRpb24gewogCQlyZXR1cm4gY29tcGlsZWRQYXR0ZXJuLnJlc2V0KHRleHQoY21pdCkpLm1hdGNoZXMoKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9maWx0ZXIvUmV2RmlsdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvZmlsdGVyL1JldkZpbHRlci5qYXZhCmluZGV4IDkwNjhjNTcuLjM5ZjBkNjAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9maWx0ZXIvUmV2RmlsdGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL2ZpbHRlci9SZXZGaWx0ZXIuamF2YQpAQCAtMTAzLDcgKzEwMyw3IEBAIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZXZGaWx0ZXIgewogCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgQWxsRmlsdGVyIGV4dGVuZHMgUmV2RmlsdGVyIHsKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoZmluYWwgUmV2V2FsayB3YWxrZXIsIGZpbmFsIFJldkNvbW1pdCBjKSB7CisJCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoUmV2V2FsayB3YWxrZXIsIFJldkNvbW1pdCBjKSB7CiAJCQlyZXR1cm4gdHJ1ZTsKIAkJfQogCkBAIC0xMjgsNyArMTI4LDcgQEAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAogCXByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIE5vbmVGaWx0ZXIgZXh0ZW5kcyBSZXZGaWx0ZXIgewogCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gaW5jbHVkZShmaW5hbCBSZXZXYWxrIHdhbGtlciwgZmluYWwgUmV2Q29tbWl0IGMpIHsKKwkJcHVibGljIGJvb2xlYW4gaW5jbHVkZShSZXZXYWxrIHdhbGtlciwgUmV2Q29tbWl0IGMpIHsKIAkJCXJldHVybiBmYWxzZTsKIAkJfQogCkBAIC0xODQsNyArMTg0LDcgQEAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAogCXByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIE5vTWVyZ2VzRmlsdGVyIGV4dGVuZHMgUmV2RmlsdGVyIHsKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoZmluYWwgUmV2V2FsayB3YWxrZXIsIGZpbmFsIFJldkNvbW1pdCBjKSB7CisJCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoUmV2V2FsayB3YWxrZXIsIFJldkNvbW1pdCBjKSB7CiAJCQlyZXR1cm4gYy5nZXRQYXJlbnRDb3VudCgpIDwgMjsKIAkJfQogCkBAIC0yMTYsNyArMjE2LDcgQEAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAogCXByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIE1lcmdlQmFzZUZpbHRlciBleHRlbmRzIFJldkZpbHRlciB7CiAJCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKGZpbmFsIFJldldhbGsgd2Fsa2VyLCBmaW5hbCBSZXZDb21taXQgYykgeworCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKFJldldhbGsgd2Fsa2VyLCBSZXZDb21taXQgYykgewogCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKEpHaXRUZXh0LmdldCgpLmNhbm5vdEJlQ29tYmluZWQpOwogCQl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9maWx0ZXIvUmV2RmxhZ0ZpbHRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL2ZpbHRlci9SZXZGbGFnRmlsdGVyLmphdmEKaW5kZXggODIyNWU0ZC4uYzY3YzQ0YiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL2ZpbHRlci9SZXZGbGFnRmlsdGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL2ZpbHRlci9SZXZGbGFnRmlsdGVyLmphdmEKQEAgLTYzLDcgKzYzLDcgQEAgcHVibGljIGFic3RyYWN0IGNsYXNzIFJldkZsYWdGaWx0ZXIgZXh0ZW5kcyBSZXZGaWx0ZXIgewogCSAqICAgICAgICAgICAgdGhlIGZsYWcgdG8gdGVzdC4KIAkgKiBAcmV0dXJuIGZpbHRlciB0aGF0IHNlbGVjdHMgb25seSBjb21taXRzIHdpdGggZmxhZyA8Y29kZT5hPC9jb2RlPi4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIFJldkZpbHRlciBoYXMoZmluYWwgUmV2RmxhZyBhKSB7CisJcHVibGljIHN0YXRpYyBSZXZGaWx0ZXIgaGFzKFJldkZsYWcgYSkgewogCQlmaW5hbCBSZXZGbGFnU2V0IHMgPSBuZXcgUmV2RmxhZ1NldCgpOwogCQlzLmFkZChhKTsKIAkJcmV0dXJuIG5ldyBIYXNBbGwocyk7CkBAIC03Niw5ICs3Niw5IEBAIHB1YmxpYyBzdGF0aWMgUmV2RmlsdGVyIGhhcyhmaW5hbCBSZXZGbGFnIGEpIHsKIAkgKiAgICAgICAgICAgIHNldCBvZiBmbGFncyB0byB0ZXN0LgogCSAqIEByZXR1cm4gZmlsdGVyIHRoYXQgc2VsZWN0cyBvbmx5IGNvbW1pdHMgd2l0aCBhbGwgZmxhZ3MgaW4gPGNvZGU+YTwvY29kZT4uCiAJICovCi0JcHVibGljIHN0YXRpYyBSZXZGaWx0ZXIgaGFzQWxsKGZpbmFsIFJldkZsYWcuLi4gYSkgeworCXB1YmxpYyBzdGF0aWMgUmV2RmlsdGVyIGhhc0FsbChSZXZGbGFnLi4uIGEpIHsKIAkJZmluYWwgUmV2RmxhZ1NldCBzZXQgPSBuZXcgUmV2RmxhZ1NldCgpOwotCQlmb3IgKGZpbmFsIFJldkZsYWcgZmxhZyA6IGEpCisJCWZvciAoUmV2RmxhZyBmbGFnIDogYSkKIAkJCXNldC5hZGQoZmxhZyk7CiAJCXJldHVybiBuZXcgSGFzQWxsKHNldCk7CiAJfQpAQCAtOTAsNyArOTAsNyBAQCBwdWJsaWMgc3RhdGljIFJldkZpbHRlciBoYXNBbGwoZmluYWwgUmV2RmxhZy4uLiBhKSB7CiAJICogICAgICAgICAgICBzZXQgb2YgZmxhZ3MgdG8gdGVzdC4KIAkgKiBAcmV0dXJuIGZpbHRlciB0aGF0IHNlbGVjdHMgb25seSBjb21taXRzIHdpdGggYWxsIGZsYWdzIGluIDxjb2RlPmE8L2NvZGU+LgogCSAqLwotCXB1YmxpYyBzdGF0aWMgUmV2RmlsdGVyIGhhc0FsbChmaW5hbCBSZXZGbGFnU2V0IGEpIHsKKwlwdWJsaWMgc3RhdGljIFJldkZpbHRlciBoYXNBbGwoUmV2RmxhZ1NldCBhKSB7CiAJCXJldHVybiBuZXcgSGFzQWxsKG5ldyBSZXZGbGFnU2V0KGEpKTsKIAl9CiAKQEAgLTEwMSw5ICsxMDEsOSBAQCBwdWJsaWMgc3RhdGljIFJldkZpbHRlciBoYXNBbGwoZmluYWwgUmV2RmxhZ1NldCBhKSB7CiAJICogICAgICAgICAgICBzZXQgb2YgZmxhZ3MgdG8gdGVzdC4KIAkgKiBAcmV0dXJuIGZpbHRlciB0aGF0IHNlbGVjdHMgb25seSBjb21taXRzIHdpdGggYW55IGZsYWcgaW4gPGNvZGU+YTwvY29kZT4uCiAJICovCi0JcHVibGljIHN0YXRpYyBSZXZGaWx0ZXIgaGFzQW55KGZpbmFsIFJldkZsYWcuLi4gYSkgeworCXB1YmxpYyBzdGF0aWMgUmV2RmlsdGVyIGhhc0FueShSZXZGbGFnLi4uIGEpIHsKIAkJZmluYWwgUmV2RmxhZ1NldCBzZXQgPSBuZXcgUmV2RmxhZ1NldCgpOwotCQlmb3IgKGZpbmFsIFJldkZsYWcgZmxhZyA6IGEpCisJCWZvciAoUmV2RmxhZyBmbGFnIDogYSkKIAkJCXNldC5hZGQoZmxhZyk7CiAJCXJldHVybiBuZXcgSGFzQW55KHNldCk7CiAJfQpAQCAtMTE1LDEzICsxMTUsMTMgQEAgcHVibGljIHN0YXRpYyBSZXZGaWx0ZXIgaGFzQW55KGZpbmFsIFJldkZsYWcuLi4gYSkgewogCSAqICAgICAgICAgICAgc2V0IG9mIGZsYWdzIHRvIHRlc3QuCiAJICogQHJldHVybiBmaWx0ZXIgdGhhdCBzZWxlY3RzIG9ubHkgY29tbWl0cyB3aXRoIGFueSBmbGFnIGluIDxjb2RlPmE8L2NvZGU+LgogCSAqLwotCXB1YmxpYyBzdGF0aWMgUmV2RmlsdGVyIGhhc0FueShmaW5hbCBSZXZGbGFnU2V0IGEpIHsKKwlwdWJsaWMgc3RhdGljIFJldkZpbHRlciBoYXNBbnkoUmV2RmxhZ1NldCBhKSB7CiAJCXJldHVybiBuZXcgSGFzQW55KG5ldyBSZXZGbGFnU2V0KGEpKTsKIAl9CiAKIAlmaW5hbCBSZXZGbGFnU2V0IGZsYWdzOwogCi0JUmV2RmxhZ0ZpbHRlcihmaW5hbCBSZXZGbGFnU2V0IG0pIHsKKwlSZXZGbGFnRmlsdGVyKFJldkZsYWdTZXQgbSkgewogCQlmbGFncyA9IG07CiAJfQogCkBAIC0xMzgsMTIgKzEzOCwxMiBAQCBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCX0KIAogCXByaXZhdGUgc3RhdGljIGNsYXNzIEhhc0FsbCBleHRlbmRzIFJldkZsYWdGaWx0ZXIgewotCQlIYXNBbGwoZmluYWwgUmV2RmxhZ1NldCBtKSB7CisJCUhhc0FsbChSZXZGbGFnU2V0IG0pIHsKIAkJCXN1cGVyKG0pOwogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoZmluYWwgUmV2V2FsayB3YWxrZXIsIGZpbmFsIFJldkNvbW1pdCBjKQorCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKFJldldhbGsgd2Fsa2VyLCBSZXZDb21taXQgYykKIAkJCQl0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwKIAkJCQlJT0V4Y2VwdGlvbiB7CiAJCQlyZXR1cm4gYy5oYXNBbGwoZmxhZ3MpOwpAQCAtMTU2LDEyICsxNTYsMTIgQEAgcHVibGljIGJvb2xlYW4gcmVxdWlyZXNDb21taXRCb2R5KCkgewogCX0KIAogCXByaXZhdGUgc3RhdGljIGNsYXNzIEhhc0FueSBleHRlbmRzIFJldkZsYWdGaWx0ZXIgewotCQlIYXNBbnkoZmluYWwgUmV2RmxhZ1NldCBtKSB7CisJCUhhc0FueShSZXZGbGFnU2V0IG0pIHsKIAkJCXN1cGVyKG0pOwogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoZmluYWwgUmV2V2FsayB3YWxrZXIsIGZpbmFsIFJldkNvbW1pdCBjKQorCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKFJldldhbGsgd2Fsa2VyLCBSZXZDb21taXQgYykKIAkJCQl0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwKIAkJCQlJT0V4Y2VwdGlvbiB7CiAJCQlyZXR1cm4gYy5oYXNBbnkoZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL2ZpbHRlci9TdWJTdHJpbmdSZXZGaWx0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9maWx0ZXIvU3ViU3RyaW5nUmV2RmlsdGVyLmphdmEKaW5kZXggM2U2YjE0OC4uNTQ2NTBkYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL2ZpbHRlci9TdWJTdHJpbmdSZXZGaWx0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvZmlsdGVyL1N1YlN0cmluZ1JldkZpbHRlci5qYXZhCkBAIC02NSw3ICs2NSw3IEBAIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTdWJTdHJpbmdSZXZGaWx0ZXIgZXh0ZW5kcyBSZXZGaWx0ZXIgewogCSAqICAgICAgICAgaWYge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5maWx0ZXIuUGF0dGVybk1hdGNoUmV2RmlsdGVyfQogCSAqICAgICAgICAgbXVzdCBiZSB1c2VkIGluc3RlYWQuCiAJICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHNhZmUoZmluYWwgU3RyaW5nIHBhdHRlcm4pIHsKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2FmZShTdHJpbmcgcGF0dGVybikgewogCQlmb3IgKGludCBpID0gMDsgaSA8IHBhdHRlcm4ubGVuZ3RoKCk7IGkrKykgewogCQkJZmluYWwgY2hhciBjID0gcGF0dGVybi5jaGFyQXQoaSk7CiAJCQlzd2l0Y2ggKGMpIHsKQEAgLTk2LDEzICs5NiwxMyBAQCBwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2FmZShmaW5hbCBTdHJpbmcgcGF0dGVybikgewogCSAqICAgICAgICAgICAgdGhlIHtAbGluayAjc2FmZShTdHJpbmcpfSBhcyByZWd1bGFyIGV4cHJlc3Npb24gbWV0YQogCSAqICAgICAgICAgICAgY2hhcmFjdGVycyBhcmUgdHJlYXRlZCBhcyBsaXRlcmFscy4KIAkgKi8KLQlwcm90ZWN0ZWQgU3ViU3RyaW5nUmV2RmlsdGVyKGZpbmFsIFN0cmluZyBwYXR0ZXJuVGV4dCkgeworCXByb3RlY3RlZCBTdWJTdHJpbmdSZXZGaWx0ZXIoU3RyaW5nIHBhdHRlcm5UZXh0KSB7CiAJCXBhdHRlcm4gPSBuZXcgUmF3U3ViU3RyaW5nUGF0dGVybihwYXR0ZXJuVGV4dCk7CiAJfQogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKGZpbmFsIFJldldhbGsgd2Fsa2VyLCBmaW5hbCBSZXZDb21taXQgY21pdCkKKwlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKFJldldhbGsgd2Fsa2VyLCBSZXZDb21taXQgY21pdCkKIAkJCXRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLAogCQkJSU9FeGNlcHRpb24gewogCQlyZXR1cm4gcGF0dGVybi5tYXRjaCh0ZXh0KGNtaXQpKSA+PSAwOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9zdG9yYWdlL2ZpbGUvRmlsZUJhc2VkQ29uZmlnLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3N0b3JhZ2UvZmlsZS9GaWxlQmFzZWRDb25maWcuamF2YQppbmRleCAzZjA2NGUzLi40YjI3MmJhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3N0b3JhZ2UvZmlsZS9GaWxlQmFzZWRDb25maWcuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3N0b3JhZ2UvZmlsZS9GaWxlQmFzZWRDb25maWcuamF2YQpAQCAtNDksNiArNDksOCBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlOwogCitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOworCiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwpAQCAtMTY0LDggKzE2Niw4IEBAIHB1YmxpYyB2b2lkIGxvYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvbmZpZ0ludmFsaWRFeGNlcHRpb24gewogCQkJCX0gZWxzZSB7CiAJCQkJCWZpbmFsIFN0cmluZyBkZWNvZGVkOwogCQkJCQlpZiAoaXNVdGY4KGluKSkgewotCQkJCQkJZGVjb2RlZCA9IFJhd1BhcnNlVXRpbHMuZGVjb2RlKAotCQkJCQkJCQlSYXdQYXJzZVV0aWxzLlVURjhfQ0hBUlNFVCwgaW4sIDMsIGluLmxlbmd0aCk7CisJCQkJCQlkZWNvZGVkID0gUmF3UGFyc2VVdGlscy5kZWNvZGUoQ0hBUlNFVCwKKwkJCQkJCQkJaW4sIDMsIGluLmxlbmd0aCk7CiAJCQkJCQl1dGY4Qm9tID0gdHJ1ZTsKIAkJCQkJfSBlbHNlIHsKIAkJCQkJCWRlY29kZWQgPSBSYXdQYXJzZVV0aWxzLmRlY29kZShpbik7CkBAIC0yMjIsNyArMjI0LDcgQEAgcHVibGljIHZvaWQgc2F2ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQlib3Mud3JpdGUoMHhFRik7CiAJCQlib3Mud3JpdGUoMHhCQik7CiAJCQlib3Mud3JpdGUoMHhCRik7Ci0JCQlib3Mud3JpdGUodGV4dC5nZXRCeXRlcyhSYXdQYXJzZVV0aWxzLlVURjhfQ0hBUlNFVC5uYW1lKCkpKTsKKwkJCWJvcy53cml0ZSh0ZXh0LmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJCW91dCA9IGJvcy50b0J5dGVBcnJheSgpOwogCQl9IGVsc2UgewogCQkJb3V0ID0gQ29uc3RhbnRzLmVuY29kZSh0ZXh0KTsKQEAgLTI1Miw3ICsyNTQsNyBAQCBwdWJsaWMgdm9pZCBjbGVhcigpIHsKIAkJc3VwZXIuY2xlYXIoKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBPYmplY3RJZCBoYXNoKGZpbmFsIGJ5dGVbXSByYXdUZXh0KSB7CisJcHJpdmF0ZSBzdGF0aWMgT2JqZWN0SWQgaGFzaChieXRlW10gcmF3VGV4dCkgewogCQlyZXR1cm4gT2JqZWN0SWQuZnJvbVJhdyhDb25zdGFudHMubmV3TWVzc2FnZURpZ2VzdCgpLmRpZ2VzdChyYXdUZXh0KSk7CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3N0b3JhZ2UvZmlsZS9XaW5kb3dDYWNoZUNvbmZpZy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9zdG9yYWdlL2ZpbGUvV2luZG93Q2FjaGVDb25maWcuamF2YQppbmRleCAxOWZjNjNlLi5jMmU2YTQyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3N0b3JhZ2UvZmlsZS9XaW5kb3dDYWNoZUNvbmZpZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvc3RvcmFnZS9maWxlL1dpbmRvd0NhY2hlQ29uZmlnLmphdmEKQEAgLTk4LDcgKzk4LDcgQEAgcHVibGljIGludCBnZXRQYWNrZWRHaXRPcGVuRmlsZXMoKSB7CiAJICogICAgICAgICAgICBtYXhpbXVtIG51bWJlciBvZiBzdHJlYW1zIHRvIG9wZW4gYXQgYSB0aW1lLiBPcGVuIHBhY2tzIGNvdW50CiAJICogICAgICAgICAgICBhZ2FpbnN0IHRoZSBwcm9jZXNzIGxpbWl0cwogCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhY2tlZEdpdE9wZW5GaWxlcyhmaW5hbCBpbnQgZmRMaW1pdCkgeworCXB1YmxpYyB2b2lkIHNldFBhY2tlZEdpdE9wZW5GaWxlcyhpbnQgZmRMaW1pdCkgewogCQlwYWNrZWRHaXRPcGVuRmlsZXMgPSBmZExpbWl0OwogCX0KIApAQCAtMTIxLDcgKzEyMSw3IEBAIHB1YmxpYyBsb25nIGdldFBhY2tlZEdpdExpbWl0KCkgewogCSAqICAgICAgICAgICAgbWF4aW11bSBudW1iZXIgYnl0ZXMgb2YgaGVhcCBtZW1vcnkgdG8gZGVkaWNhdGUgdG8gY2FjaGluZwogCSAqICAgICAgICAgICAgcGFjayBmaWxlIGRhdGEuCiAJICovCi0JcHVibGljIHZvaWQgc2V0UGFja2VkR2l0TGltaXQoZmluYWwgbG9uZyBuZXdMaW1pdCkgeworCXB1YmxpYyB2b2lkIHNldFBhY2tlZEdpdExpbWl0KGxvbmcgbmV3TGltaXQpIHsKIAkJcGFja2VkR2l0TGltaXQgPSBuZXdMaW1pdDsKIAl9CiAKQEAgLTE0Miw3ICsxNDIsNyBAQCBwdWJsaWMgaW50IGdldFBhY2tlZEdpdFdpbmRvd1NpemUoKSB7CiAJICogQHBhcmFtIG5ld1NpemUKIAkgKiAgICAgICAgICAgIHNpemUgaW4gYnl0ZXMgb2YgYSBzaW5nbGUgd2luZG93IHJlYWQgaW4gZnJvbSB0aGUgcGFjayBmaWxlLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhY2tlZEdpdFdpbmRvd1NpemUoZmluYWwgaW50IG5ld1NpemUpIHsKKwlwdWJsaWMgdm9pZCBzZXRQYWNrZWRHaXRXaW5kb3dTaXplKGludCBuZXdTaXplKSB7CiAJCXBhY2tlZEdpdFdpbmRvd1NpemUgPSBuZXdTaXplOwogCX0KIApAQCAtMTY1LDcgKzE2NSw3IEBAIHB1YmxpYyBib29sZWFuIGlzUGFja2VkR2l0TU1BUCgpIHsKIAkgKiAgICAgICAgICAgIGZvciB3aW5kb3dzOyBmYWxzZSByZWFkcyBlbnRpcmUgd2luZG93IGludG8gYSBieXRlW10gd2l0aAogCSAqICAgICAgICAgICAgc3RhbmRhcmQgcmVhZCBjYWxscy4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYWNrZWRHaXRNTUFQKGZpbmFsIGJvb2xlYW4gdXNlbW1hcCkgeworCXB1YmxpYyB2b2lkIHNldFBhY2tlZEdpdE1NQVAoYm9vbGVhbiB1c2VtbWFwKSB7CiAJCXBhY2tlZEdpdE1NQVAgPSB1c2VtbWFwOwogCX0KIApAQCAtMTg5LDcgKzE4OSw3IEBAIHB1YmxpYyBpbnQgZ2V0RGVsdGFCYXNlQ2FjaGVMaW1pdCgpIHsKIAkgKiAgICAgICAgICAgIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIGNhY2hlIGluIGRlbHRhIGJhc2UgY2FjaGUgZm9yCiAJICogICAgICAgICAgICBpbmZsYXRlZCwgcmVjZW50bHkgYWNjZXNzZWQgb2JqZWN0cywgd2l0aG91dCBkZWx0YSBjaGFpbnMuCiAJICovCi0JcHVibGljIHZvaWQgc2V0RGVsdGFCYXNlQ2FjaGVMaW1pdChmaW5hbCBpbnQgbmV3TGltaXQpIHsKKwlwdWJsaWMgdm9pZCBzZXREZWx0YUJhc2VDYWNoZUxpbWl0KGludCBuZXdMaW1pdCkgewogCQlkZWx0YUJhc2VDYWNoZUxpbWl0ID0gbmV3TGltaXQ7CiAJfQogCkBAIC0yMTEsNyArMjExLDcgQEAgcHVibGljIGludCBnZXRTdHJlYW1GaWxlVGhyZXNob2xkKCkgewogCSAqICAgICAgICAgICAgYXJyYXksIHdoaWxlIG9iamVjdHMgYmlnZ2VyIHRoYW4gdGhpcyBzaXplIHJlcXVpcmUgdXNpbmcgYW4KIAkgKiAgICAgICAgICAgIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RTdHJlYW19LgogCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0cmVhbUZpbGVUaHJlc2hvbGQoZmluYWwgaW50IG5ld0xpbWl0KSB7CisJcHVibGljIHZvaWQgc2V0U3RyZWFtRmlsZVRocmVzaG9sZChpbnQgbmV3TGltaXQpIHsKIAkJc3RyZWFtRmlsZVRocmVzaG9sZCA9IG5ld0xpbWl0OwogCX0KIApAQCAtMjI2LDcgKzIyNiw3IEBAIHB1YmxpYyB2b2lkIHNldFN0cmVhbUZpbGVUaHJlc2hvbGQoZmluYWwgaW50IG5ld0xpbWl0KSB7CiAJICogQHJldHVybiB7QGNvZGUgdGhpc30uCiAJICogQHNpbmNlIDMuMAogCSAqLwotCXB1YmxpYyBXaW5kb3dDYWNoZUNvbmZpZyBmcm9tQ29uZmlnKGZpbmFsIENvbmZpZyByYykgeworCXB1YmxpYyBXaW5kb3dDYWNoZUNvbmZpZyBmcm9tQ29uZmlnKENvbmZpZyByYykgewogCQlzZXRQYWNrZWRHaXRPcGVuRmlsZXMocmMuZ2V0SW50KAogCQkJCSJjb3JlIiwgbnVsbCwgInBhY2tlZGdpdG9wZW5maWxlcyIsIGdldFBhY2tlZEdpdE9wZW5GaWxlcygpKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQlzZXRQYWNrZWRHaXRMaW1pdChyYy5nZXRMb25nKApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9zdG9yYWdlL3BhY2svUGFja0NvbmZpZy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9zdG9yYWdlL3BhY2svUGFja0NvbmZpZy5qYXZhCmluZGV4IDQ4NGNkZTIuLjI1NmU0MWQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvc3RvcmFnZS9wYWNrL1BhY2tDb25maWcuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3N0b3JhZ2UvcGFjay9QYWNrQ29uZmlnLmphdmEKQEAgLTEwMzksNyArMTAzOSw3IEBAIHB1YmxpYyB2b2lkIHNldEJpdG1hcEluYWN0aXZlQnJhbmNoQWdlSW5EYXlzKGludCBhZ2VJbkRheXMpIHsKIAkgKiBAcGFyYW0gcmMKIAkgKiAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gdG8gcmVhZCBwcm9wZXJ0aWVzIGZyb20uCiAJICovCi0JcHVibGljIHZvaWQgZnJvbUNvbmZpZyhmaW5hbCBDb25maWcgcmMpIHsKKwlwdWJsaWMgdm9pZCBmcm9tQ29uZmlnKENvbmZpZyByYykgewogCQlzZXRNYXhEZWx0YURlcHRoKHJjLmdldEludCgicGFjayIsICJkZXB0aCIsIGdldE1heERlbHRhRGVwdGgoKSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJc2V0RGVsdGFTZWFyY2hXaW5kb3dTaXplKHJjLmdldEludCgKIAkJCQkicGFjayIsICJ3aW5kb3ciLCBnZXREZWx0YVNlYXJjaFdpbmRvd1NpemUoKSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvc3VibW9kdWxlL1N1Ym1vZHVsZVdhbGsuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvc3VibW9kdWxlL1N1Ym1vZHVsZVdhbGsuamF2YQppbmRleCAyMzE0Y2YxLi5jZTg5OTVhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3N1Ym1vZHVsZS9TdWJtb2R1bGVXYWxrLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9zdWJtb2R1bGUvU3VibW9kdWxlV2Fsay5qYXZhCkBAIC0xMTUsMTEgKzExNSwxMyBAQCBwdWJsaWMgZW51bSBJZ25vcmVTdWJtb2R1bGVNb2RlIHsKIAkgKgogCSAqIEBwYXJhbSByZXBvc2l0b3J5CiAJICogICAgICAgICAgICBhIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5fSBvYmplY3QuCi0JICogQHJldHVybiBnZW5lcmF0b3Igb3ZlciBzdWJtb2R1bGUgaW5kZXggZW50cmllcworCSAqIEByZXR1cm4gZ2VuZXJhdG9yIG92ZXIgc3VibW9kdWxlIGluZGV4IGVudHJpZXMuIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUKKwkgKiAgICAgICAgIGZvciBjYWxsaW5nIHtAbGluayAjY2xvc2UoKX0uCiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICovCiAJcHVibGljIHN0YXRpYyBTdWJtb2R1bGVXYWxrIGZvckluZGV4KFJlcG9zaXRvcnkgcmVwb3NpdG9yeSkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpIC8vIFRoZSBjYWxsZXIgY2xvc2VzIGl0CiAJCVN1Ym1vZHVsZVdhbGsgZ2VuZXJhdG9yID0gbmV3IFN1Ym1vZHVsZVdhbGsocmVwb3NpdG9yeSk7CiAJCXRyeSB7CiAJCQlEaXJDYWNoZSBpbmRleCA9IHJlcG9zaXRvcnkucmVhZERpckNhY2hlKCk7CkBAIC0zNjksNyArMzcxLDcgQEAgZWxzZSBpZiAoc3VibW9kdWxlVXJsLnN0YXJ0c1dpdGgoIi4uLyIpKSB7IC8vJE5PTi1OTFMtMSQKIAkgKiAgICAgICAgICAgIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeX0uCiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICovCi0JcHVibGljIFN1Ym1vZHVsZVdhbGsoZmluYWwgUmVwb3NpdG9yeSByZXBvc2l0b3J5KSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyBTdWJtb2R1bGVXYWxrKFJlcG9zaXRvcnkgcmVwb3NpdG9yeSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJdGhpcy5yZXBvc2l0b3J5ID0gcmVwb3NpdG9yeTsKIAkJcmVwb0NvbmZpZyA9IHJlcG9zaXRvcnkuZ2V0Q29uZmlnKCk7CiAJCXdhbGsgPSBuZXcgVHJlZVdhbGsocmVwb3NpdG9yeSk7CkBAIC0zODYsNyArMzg4LDcgQEAgcHVibGljIFN1Ym1vZHVsZVdhbGsoZmluYWwgUmVwb3NpdG9yeSByZXBvc2l0b3J5KSB0aHJvd3MgSU9FeGNlcHRpb24gewogCSAqICAgICAgICAgICAgLmdpdG1vZHVsZXMgY29uZmlnIG9iamVjdAogCSAqIEByZXR1cm4gdGhpcyBnZW5lcmF0b3IKIAkgKi8KLQlwdWJsaWMgU3VibW9kdWxlV2FsayBzZXRNb2R1bGVzQ29uZmlnKGZpbmFsIENvbmZpZyBjb25maWcpIHsKKwlwdWJsaWMgU3VibW9kdWxlV2FsayBzZXRNb2R1bGVzQ29uZmlnKENvbmZpZyBjb25maWcpIHsKIAkJbW9kdWxlc0NvbmZpZyA9IGNvbmZpZzsKIAkJbG9hZFBhdGhOYW1lcygpOwogCQlyZXR1cm4gdGhpczsKQEAgLTQwNSw3ICs0MDcsNyBAQCBwdWJsaWMgU3VibW9kdWxlV2FsayBzZXRNb2R1bGVzQ29uZmlnKGZpbmFsIENvbmZpZyBjb25maWcpIHsKIAkgKiAgICAgICAgICAgIHRyZWUgY29udGFpbmluZyAuZ2l0bW9kdWxlcwogCSAqIEByZXR1cm4gdGhpcyBnZW5lcmF0b3IKIAkgKi8KLQlwdWJsaWMgU3VibW9kdWxlV2FsayBzZXRSb290VHJlZShmaW5hbCBBYnN0cmFjdFRyZWVJdGVyYXRvciB0cmVlKSB7CisJcHVibGljIFN1Ym1vZHVsZVdhbGsgc2V0Um9vdFRyZWUoQWJzdHJhY3RUcmVlSXRlcmF0b3IgdHJlZSkgewogCQlyb290VHJlZSA9IHRyZWU7CiAJCW1vZHVsZXNDb25maWcgPSBudWxsOwogCQlwYXRoVG9OYW1lID0gbnVsbDsKQEAgLTQyNiw3ICs0MjgsNyBAQCBwdWJsaWMgU3VibW9kdWxlV2FsayBzZXRSb290VHJlZShmaW5hbCBBYnN0cmFjdFRyZWVJdGVyYXRvciB0cmVlKSB7CiAJICogQHJldHVybiB0aGlzIGdlbmVyYXRvcgogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqLwotCXB1YmxpYyBTdWJtb2R1bGVXYWxrIHNldFJvb3RUcmVlKGZpbmFsIEFueU9iamVjdElkIGlkKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyBTdWJtb2R1bGVXYWxrIHNldFJvb3RUcmVlKEFueU9iamVjdElkIGlkKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBDYW5vbmljYWxUcmVlUGFyc2VyIHAgPSBuZXcgQ2Fub25pY2FsVHJlZVBhcnNlcigpOwogCQlwLnJlc2V0KHdhbGsuZ2V0T2JqZWN0UmVhZGVyKCksIGlkKTsKIAkJcm9vdFRyZWUgPSBwOwpAQCAtNTYwLDcgKzU2Miw3IEBAIHB1YmxpYyBTdWJtb2R1bGVXYWxrIHNldEZpbHRlcihUcmVlRmlsdGVyIGZpbHRlcikgewogCSAqIEByZXR1cm4gdGhpcyBnZW5lcmF0b3IKIAkgKiBAdGhyb3dzIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLkNvcnJ1cHRPYmplY3RFeGNlcHRpb24KIAkgKi8KLQlwdWJsaWMgU3VibW9kdWxlV2FsayBzZXRUcmVlKGZpbmFsIEFic3RyYWN0VHJlZUl0ZXJhdG9yIGl0ZXJhdG9yKQorCXB1YmxpYyBTdWJtb2R1bGVXYWxrIHNldFRyZWUoQWJzdHJhY3RUcmVlSXRlcmF0b3IgaXRlcmF0b3IpCiAJCQl0aHJvd3MgQ29ycnVwdE9iamVjdEV4Y2VwdGlvbiB7CiAJCXdhbGsuYWRkVHJlZShpdGVyYXRvcik7CiAJCXJldHVybiB0aGlzOwpAQCAtNTc4LDcgKzU4MCw3IEBAIHB1YmxpYyBTdWJtb2R1bGVXYWxrIHNldFRyZWUoZmluYWwgQWJzdHJhY3RUcmVlSXRlcmF0b3IgaXRlcmF0b3IpCiAJICogQHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uCiAJICogICAgICAgICAgICAgaWYgYW55LgogCSAqLwotCXB1YmxpYyBTdWJtb2R1bGVXYWxrIHNldFRyZWUoZmluYWwgQW55T2JqZWN0SWQgdHJlZUlkKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyBTdWJtb2R1bGVXYWxrIHNldFRyZWUoQW55T2JqZWN0SWQgdHJlZUlkKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl3YWxrLmFkZFRyZWUodHJlZUlkKTsKIAkJcmV0dXJuIHRoaXM7CiAJfQpAQCAtNzU0LDEzICs3NTYsMTEgQEAgcHVibGljIFJlcG9zaXRvcnkgZ2V0UmVwb3NpdG9yeSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICovCiAJcHVibGljIE9iamVjdElkIGdldEhlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlSZXBvc2l0b3J5IHN1YlJlcG8gPSBnZXRSZXBvc2l0b3J5KCk7Ci0JCWlmIChzdWJSZXBvID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJdHJ5IHsKKwkJdHJ5IChSZXBvc2l0b3J5IHN1YlJlcG8gPSBnZXRSZXBvc2l0b3J5KCkpIHsKKwkJCWlmIChzdWJSZXBvID09IG51bGwpIHsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KIAkJCXJldHVybiBzdWJSZXBvLnJlc29sdmUoQ29uc3RhbnRzLkhFQUQpOwotCQl9IGZpbmFsbHkgewotCQkJc3ViUmVwby5jbG9zZSgpOwogCQl9CiAJfQogCkBAIC03NzEsMTQgKzc3MSwxMiBAQCBwdWJsaWMgT2JqZWN0SWQgZ2V0SGVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICovCiAJcHVibGljIFN0cmluZyBnZXRIZWFkUmVmKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJUmVwb3NpdG9yeSBzdWJSZXBvID0gZ2V0UmVwb3NpdG9yeSgpOwotCQlpZiAoc3ViUmVwbyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXRyeSB7CisJCXRyeSAoUmVwb3NpdG9yeSBzdWJSZXBvID0gZ2V0UmVwb3NpdG9yeSgpKSB7CisJCQlpZiAoc3ViUmVwbyA9PSBudWxsKSB7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CiAJCQlSZWYgaGVhZCA9IHN1YlJlcG8uZXhhY3RSZWYoQ29uc3RhbnRzLkhFQUQpOwogCQkJcmV0dXJuIGhlYWQgIT0gbnVsbCA/IGhlYWQuZ2V0TGVhZigpLmdldE5hbWUoKSA6IG51bGw7Ci0JCX0gZmluYWxseSB7Ci0JCQlzdWJSZXBvLmNsb3NlKCk7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0FtYXpvblMzLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9BbWF6b25TMy5qYXZhCmluZGV4IGQ3YzViOWQuLmEwZmM1N2MgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0FtYXpvblMzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvQW1hem9uUzMuamF2YQpAQCAtNDMsNyArNDMsNyBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0OwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiAKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkZpbGU7CkBAIC0xMjgsMTQgKzEyOCwxNCBAQCBwdWJsaWMgY2xhc3MgQW1hem9uUzMgewogCQlTSUdORURfSEVBREVSUy5hZGQoImRhdGUiKTsgLy8kTk9OLU5MUy0xJAogCX0KIAotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNTaWduZWRIZWFkZXIoZmluYWwgU3RyaW5nIG5hbWUpIHsKKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzU2lnbmVkSGVhZGVyKFN0cmluZyBuYW1lKSB7CiAJCWZpbmFsIFN0cmluZyBuYW1lTEMgPSBTdHJpbmdVdGlscy50b0xvd2VyQ2FzZShuYW1lKTsKIAkJcmV0dXJuIFNJR05FRF9IRUFERVJTLmNvbnRhaW5zKG5hbWVMQykgfHwgbmFtZUxDLnN0YXJ0c1dpdGgoIngtYW16LSIpOyAvLyROT04tTkxTLTEkCiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRvQ2xlYW5TdHJpbmcoZmluYWwgTGlzdDxTdHJpbmc+IGxpc3QpIHsKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgdG9DbGVhblN0cmluZyhMaXN0PFN0cmluZz4gbGlzdCkgewogCQlmaW5hbCBTdHJpbmdCdWlsZGVyIHMgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlmb3IgKGZpbmFsIFN0cmluZyB2IDogbGlzdCkgeworCQlmb3IgKFN0cmluZyB2IDogbGlzdCkgewogCQkJaWYgKHMubGVuZ3RoKCkgPiAwKQogCQkJCXMuYXBwZW5kKCcsJyk7CiAJCQlzLmFwcGVuZCh2LnJlcGxhY2VBbGwoIlxuIiwgIiIpLnRyaW0oKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJApAQCAtMTQzLDcgKzE0Myw3IEBAIHByaXZhdGUgc3RhdGljIFN0cmluZyB0b0NsZWFuU3RyaW5nKGZpbmFsIExpc3Q8U3RyaW5nPiBsaXN0KSB7CiAJCXJldHVybiBzLnRvU3RyaW5nKCk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHJlbW92ZShmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IG0sIGZpbmFsIFN0cmluZyBrKSB7CisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHJlbW92ZShNYXA8U3RyaW5nLCBTdHJpbmc+IG0sIFN0cmluZyBrKSB7CiAJCWZpbmFsIFN0cmluZyByID0gbS5yZW1vdmUoayk7CiAJCXJldHVybiByICE9IG51bGwgPyByIDogIiI7IC8vJE5PTi1OTFMtMSQKIAl9CkBAIC0yODMsNyArMjgzLDcgQEAgZWxzZSBpZiAoU3RyaW5nVXRpbHMuZXF1YWxzSWdub3JlQ2FzZSgiUFVCTElDX1JFQUQiLCBwYWNsKSkgLy8kTk9OLU5MUy0xJAogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHNlbmRpbmcgdGhlIHJlcXVlc3Qgd2FzIG5vdCBwb3NzaWJsZS4KIAkgKi8KLQlwdWJsaWMgVVJMQ29ubmVjdGlvbiBnZXQoZmluYWwgU3RyaW5nIGJ1Y2tldCwgZmluYWwgU3RyaW5nIGtleSkKKwlwdWJsaWMgVVJMQ29ubmVjdGlvbiBnZXQoU3RyaW5nIGJ1Y2tldCwgU3RyaW5nIGtleSkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZvciAoaW50IGN1ckF0dGVtcHQgPSAwOyBjdXJBdHRlbXB0IDwgbWF4QXR0ZW1wdHM7IGN1ckF0dGVtcHQrKykgewogCQkJZmluYWwgSHR0cFVSTENvbm5lY3Rpb24gYyA9IG9wZW4oIkdFVCIsIGJ1Y2tldCwga2V5KTsgLy8kTk9OLU5MUy0xJApAQCAtMzEyLDcgKzMxMiw3IEBAIHB1YmxpYyBVUkxDb25uZWN0aW9uIGdldChmaW5hbCBTdHJpbmcgYnVja2V0LCBmaW5hbCBTdHJpbmcga2V5KQogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIGRlY3J5cHRpb24gY291bGQgbm90IGJlIGNvbmZpZ3VyZWQuCiAJICovCi0JcHVibGljIElucHV0U3RyZWFtIGRlY3J5cHQoZmluYWwgVVJMQ29ubmVjdGlvbiB1KSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyBJbnB1dFN0cmVhbSBkZWNyeXB0KFVSTENvbm5lY3Rpb24gdSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJcmV0dXJuIGVuY3J5cHRpb24uZGVjcnlwdCh1LmdldElucHV0U3RyZWFtKCkpOwogCX0KIApAQCAtMzM2LDcgKzMzNiw3IEBAIHB1YmxpYyBJbnB1dFN0cmVhbSBkZWNyeXB0KGZpbmFsIFVSTENvbm5lY3Rpb24gdSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkgKiAgICAgICAgICAgICBzZW5kaW5nIHRoZSByZXF1ZXN0IHdhcyBub3QgcG9zc2libGUsIG9yIHRoZSByZXNwb25zZSBYTUwKIAkgKiAgICAgICAgICAgICBkb2N1bWVudCBjb3VsZCBub3QgYmUgcGFyc2VkIHByb3Blcmx5LgogCSAqLwotCXB1YmxpYyBMaXN0PFN0cmluZz4gbGlzdChmaW5hbCBTdHJpbmcgYnVja2V0LCBTdHJpbmcgcHJlZml4KQorCXB1YmxpYyBMaXN0PFN0cmluZz4gbGlzdChTdHJpbmcgYnVja2V0LCBTdHJpbmcgcHJlZml4KQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJaWYgKHByZWZpeC5sZW5ndGgoKSA+IDAgJiYgIXByZWZpeC5lbmRzV2l0aCgiLyIpKSAvLyROT04tTkxTLTEkCiAJCQlwcmVmaXggKz0gIi8iOyAvLyROT04tTkxTLTEkCkBAIC0zNTksNyArMzU5LDcgQEAgcHVibGljIExpc3Q8U3RyaW5nPiBsaXN0KGZpbmFsIFN0cmluZyBidWNrZXQsIFN0cmluZyBwcmVmaXgpCiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgZGVsZXRpb24gZmFpbGVkIGR1ZSB0byBjb21tdW5pY2F0aW9ucyBlcnJvci4KIAkgKi8KLQlwdWJsaWMgdm9pZCBkZWxldGUoZmluYWwgU3RyaW5nIGJ1Y2tldCwgZmluYWwgU3RyaW5nIGtleSkKKwlwdWJsaWMgdm9pZCBkZWxldGUoU3RyaW5nIGJ1Y2tldCwgU3RyaW5nIGtleSkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZvciAoaW50IGN1ckF0dGVtcHQgPSAwOyBjdXJBdHRlbXB0IDwgbWF4QXR0ZW1wdHM7IGN1ckF0dGVtcHQrKykgewogCQkJZmluYWwgSHR0cFVSTENvbm5lY3Rpb24gYyA9IG9wZW4oIkRFTEVURSIsIGJ1Y2tldCwga2V5KTsgLy8kTk9OLU5MUy0xJApAQCAtMzk2LDcgKzM5Niw3IEBAIHB1YmxpYyB2b2lkIGRlbGV0ZShmaW5hbCBTdHJpbmcgYnVja2V0LCBmaW5hbCBTdHJpbmcga2V5KQogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIGNyZWF0aW9uL3VwZGF0aW5nIGZhaWxlZCBkdWUgdG8gY29tbXVuaWNhdGlvbnMgZXJyb3IuCiAJICovCi0JcHVibGljIHZvaWQgcHV0KGZpbmFsIFN0cmluZyBidWNrZXQsIGZpbmFsIFN0cmluZyBrZXksIGZpbmFsIGJ5dGVbXSBkYXRhKQorCXB1YmxpYyB2b2lkIHB1dChTdHJpbmcgYnVja2V0LCBTdHJpbmcga2V5LCBieXRlW10gZGF0YSkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWlmIChlbmNyeXB0aW9uICE9IFdhbGtFbmNyeXB0aW9uLk5PTkUpIHsKIAkJCS8vIFdlIGhhdmUgdG8gY29weSB0byBwcm9kdWNlIHRoZSBjaXBoZXIgdGV4dCBhbnl3YXkgc28gdXNlCkBAIC01MjQsMTIgKzUyNCwxMSBAQCBJT0V4Y2VwdGlvbiBlcnJvcihmaW5hbCBTdHJpbmcgYWN0aW9uLCBmaW5hbCBTdHJpbmcga2V5LAogCQkJCUpHaXRUZXh0LmdldCgpLmFtYXpvblMzQWN0aW9uRmFpbGVkLCBhY3Rpb24sIGtleSwKIAkJCQlJbnRlZ2VyLnZhbHVlT2YoSHR0cFN1cHBvcnQucmVzcG9uc2UoYykpLAogCQkJCWMuZ2V0UmVzcG9uc2VNZXNzYWdlKCkpKTsKLQkJZmluYWwgSW5wdXRTdHJlYW0gZXJyb3JTdHJlYW0gPSBjLmdldEVycm9yU3RyZWFtKCk7Ci0JCWlmIChlcnJvclN0cmVhbSA9PSBudWxsKSB7CisJCWlmIChjLmdldEVycm9yU3RyZWFtKCkgPT0gbnVsbCkgewogCQkJcmV0dXJuIGVycjsKIAkJfQogCi0JCXRyeSB7CisJCXRyeSAoSW5wdXRTdHJlYW0gZXJyb3JTdHJlYW0gPSBjLmdldEVycm9yU3RyZWFtKCkpIHsKIAkJCWZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogCQkJYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzIwNDhdOwogCQkJZm9yICg7OykgewpAQCAtNTQ1LDEzICs1NDQsMTEgQEAgSU9FeGNlcHRpb24gZXJyb3IoZmluYWwgU3RyaW5nIGFjdGlvbiwgZmluYWwgU3RyaW5nIGtleSwKIAkJCWlmIChidWYubGVuZ3RoID4gMCkgewogCQkJCWVyci5pbml0Q2F1c2UobmV3IElPRXhjZXB0aW9uKCJcbiIgKyBuZXcgU3RyaW5nKGJ1ZikpKTsgLy8kTk9OLU5MUy0xJAogCQkJfQotCQl9IGZpbmFsbHkgewotCQkJZXJyb3JTdHJlYW0uY2xvc2UoKTsKIAkJfQogCQlyZXR1cm4gZXJyOwogCX0KIAotCUlPRXhjZXB0aW9uIG1heEF0dGVtcHRzKGZpbmFsIFN0cmluZyBhY3Rpb24sIGZpbmFsIFN0cmluZyBrZXkpIHsKKwlJT0V4Y2VwdGlvbiBtYXhBdHRlbXB0cyhTdHJpbmcgYWN0aW9uLCBTdHJpbmcga2V5KSB7CiAJCXJldHVybiBuZXcgSU9FeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCiAJCQkJSkdpdFRleHQuZ2V0KCkuYW1hem9uUzNBY3Rpb25GYWlsZWRHaXZpbmdVcCwgYWN0aW9uLCBrZXksCiAJCQkJSW50ZWdlci52YWx1ZU9mKG1heEF0dGVtcHRzKSkpOwpAQCAtNjAwLDEwICs1OTcsMTAgQEAgSHR0cFVSTENvbm5lY3Rpb24gb3BlbihmaW5hbCBTdHJpbmcgbWV0aG9kLCBmaW5hbCBTdHJpbmcgYnVja2V0LAogCQlyZXR1cm4gYzsKIAl9CiAKLQl2b2lkIGF1dGhvcml6ZShmaW5hbCBIdHRwVVJMQ29ubmVjdGlvbiBjKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXZvaWQgYXV0aG9yaXplKEh0dHBVUkxDb25uZWN0aW9uIGMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gcmVxSGRyID0gYy5nZXRSZXF1ZXN0UHJvcGVydGllcygpOwogCQlmaW5hbCBTb3J0ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IHNpZ0hkciA9IG5ldyBUcmVlTWFwPD4oKTsKLQkJZm9yIChmaW5hbCBNYXAuRW50cnk8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGVudHJ5IDogcmVxSGRyLmVudHJ5U2V0KCkpIHsKKwkJZm9yIChNYXAuRW50cnk8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGVudHJ5IDogcmVxSGRyLmVudHJ5U2V0KCkpIHsKIAkJCWZpbmFsIFN0cmluZyBoZHIgPSBlbnRyeS5nZXRLZXkoKTsKIAkJCWlmIChpc1NpZ25lZEhlYWRlcihoZHIpKQogCQkJCXNpZ0hkci5wdXQoU3RyaW5nVXRpbHMudG9Mb3dlckNhc2UoaGRyKSwgdG9DbGVhblN0cmluZyhlbnRyeS5nZXRWYWx1ZSgpKSk7CkBAIC02MjIsNyArNjE5LDcgQEAgdm9pZCBhdXRob3JpemUoZmluYWwgSHR0cFVSTENvbm5lY3Rpb24gYykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJcy5hcHBlbmQocmVtb3ZlKHNpZ0hkciwgImRhdGUiKSk7IC8vJE5PTi1OTFMtMSQKIAkJcy5hcHBlbmQoJ1xuJyk7CiAKLQkJZm9yIChmaW5hbCBNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+IGUgOiBzaWdIZHIuZW50cnlTZXQoKSkgeworCQlmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gZSA6IHNpZ0hkci5lbnRyeVNldCgpKSB7CiAJCQlzLmFwcGVuZChlLmdldEtleSgpKTsKIAkJCXMuYXBwZW5kKCc6Jyk7CiAJCQlzLmFwcGVuZChlLmdldFZhbHVlKCkpOwpAQCAtNjM4LDcgKzYzNSw3IEBAIHZvaWQgYXV0aG9yaXplKGZpbmFsIEh0dHBVUkxDb25uZWN0aW9uIGMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXRyeSB7CiAJCQlmaW5hbCBNYWMgbSA9IE1hYy5nZXRJbnN0YW5jZShITUFDKTsKIAkJCW0uaW5pdChwcml2YXRlS2V5KTsKLQkJCXNlYyA9IEJhc2U2NC5lbmNvZGVCeXRlcyhtLmRvRmluYWwocy50b1N0cmluZygpLmdldEJ5dGVzKFVURl84KSkpOworCQkJc2VjID0gQmFzZTY0LmVuY29kZUJ5dGVzKG0uZG9GaW5hbChzLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoQ0hBUlNFVCkpKTsKIAkJfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUpIHsKIAkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdChKR2l0VGV4dC5nZXQoKS5ub0hNQUNzdXBwb3J0LCBITUFDLCBlLmdldE1lc3NhZ2UoKSkpOwogCQl9IGNhdGNoIChJbnZhbGlkS2V5RXhjZXB0aW9uIGUpIHsKQEAgLTY0Nyw3ICs2NDQsNyBAQCB2b2lkIGF1dGhvcml6ZShmaW5hbCBIdHRwVVJMQ29ubmVjdGlvbiBjKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQljLnNldFJlcXVlc3RQcm9wZXJ0eSgiQXV0aG9yaXphdGlvbiIsICJBV1MgIiArIHB1YmxpY0tleSArICI6IiArIHNlYyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCiAJfQogCi0Jc3RhdGljIFByb3BlcnRpZXMgcHJvcGVydGllcyhmaW5hbCBGaWxlIGF1dGhGaWxlKQorCXN0YXRpYyBQcm9wZXJ0aWVzIHByb3BlcnRpZXMoRmlsZSBhdXRoRmlsZSkKIAkJCXRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgUHJvcGVydGllcyBwID0gbmV3IFByb3BlcnRpZXMoKTsKIAkJdHJ5IChGaWxlSW5wdXRTdHJlYW0gaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGF1dGhGaWxlKSkgewpAQCAtNjY3LDcgKzY2NCw3IEBAIHByaXZhdGUgZmluYWwgY2xhc3MgTGlzdFBhcnNlciBleHRlbmRzIERlZmF1bHRIYW5kbGVyIHsKIAogCQlwcml2YXRlIFN0cmluZ0J1aWxkZXIgZGF0YTsKIAotCQlMaXN0UGFyc2VyKGZpbmFsIFN0cmluZyBibiwgZmluYWwgU3RyaW5nIHApIHsKKwkJTGlzdFBhcnNlcihTdHJpbmcgYm4sIFN0cmluZyBwKSB7CiAJCQlidWNrZXQgPSBibjsKIAkJCXByZWZpeCA9IHA7CiAJCX0KQEAgLTczMCw3ICs3MjcsNyBAQCBwdWJsaWMgdm9pZCBpZ25vcmFibGVXaGl0ZXNwYWNlKGZpbmFsIGNoYXJbXSBjaCwgZmluYWwgaW50IHMsCiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgY2hhcmFjdGVycyhmaW5hbCBjaGFyW10gY2gsIGZpbmFsIGludCBzLCBmaW5hbCBpbnQgbikKKwkJcHVibGljIHZvaWQgY2hhcmFjdGVycyhjaGFyW10gY2gsIGludCBzLCBpbnQgbikKIAkJCQl0aHJvd3MgU0FYRXhjZXB0aW9uIHsKIAkJCWlmIChkYXRhICE9IG51bGwpCiAJCQkJZGF0YS5hcHBlbmQoY2gsIHMsIG4pOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvQmFzZUNvbm5lY3Rpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0Jhc2VDb25uZWN0aW9uLmphdmEKaW5kZXggYzhkMWQyMi4uZjYwNDVmNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvQmFzZUNvbm5lY3Rpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CYXNlQ29ubmVjdGlvbi5qYXZhCkBAIC04NSw3ICs4NSw3IEBAIHB1YmxpYyBmaW5hbCBDb2xsZWN0aW9uPFJlZj4gZ2V0UmVmcygpIHsKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGZpbmFsIFJlZiBnZXRSZWYoZmluYWwgU3RyaW5nIG5hbWUpIHsKKwlwdWJsaWMgZmluYWwgUmVmIGdldFJlZihTdHJpbmcgbmFtZSkgewogCQlyZXR1cm4gYWR2ZXJ0aXNlZFJlZnMuZ2V0KG5hbWUpOwogCX0KIApAQCAtMTMyLDcgKzEzMiw3IEBAIHByb3RlY3RlZCB2b2lkIHNldFBlZXJVc2VyQWdlbnQoU3RyaW5nIGFnZW50KSB7CiAJICogICAgICAgICAgICB3aWxsIGJlIHdyYXBwZWQgaW4gYW4gdW5tb2RpZmlhYmxlIHdheSB0byBwcm90ZWN0IGl0LCBidXQgaXQKIAkgKiAgICAgICAgICAgIGRvZXMgbm90IGdldCBjb3BpZWQuCiAJICovCi0JcHJvdGVjdGVkIHZvaWQgYXZhaWxhYmxlKGZpbmFsIE1hcDxTdHJpbmcsIFJlZj4gYWxsKSB7CisJcHJvdGVjdGVkIHZvaWQgYXZhaWxhYmxlKE1hcDxTdHJpbmcsIFJlZj4gYWxsKSB7CiAJCWFkdmVydGlzZWRSZWZzID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKGFsbCk7CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CYXNlUGFja0Nvbm5lY3Rpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0Jhc2VQYWNrQ29ubmVjdGlvbi5qYXZhCmluZGV4IGU5MjI3ZTMuLjM4ZWFlMWMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0Jhc2VQYWNrQ29ubmVjdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0Jhc2VQYWNrQ29ubmVjdGlvbi5qYXZhCkBAIC0xMjIsNyArMTIyLDcgQEAgYWJzdHJhY3QgY2xhc3MgQmFzZVBhY2tDb25uZWN0aW9uIGV4dGVuZHMgQmFzZUNvbm5lY3Rpb24gewogCS8qKiBFeHRyYSBvYmplY3RzIHRoZSByZW1vdGUgaGFzLCBidXQgd2hpY2ggYXJlbid0IG9mZmVyZWQgYXMgcmVmcy4gKi8KIAlwcm90ZWN0ZWQgZmluYWwgU2V0PE9iamVjdElkPiBhZGRpdGlvbmFsSGF2ZXMgPSBuZXcgSGFzaFNldDw+KCk7CiAKLQlCYXNlUGFja0Nvbm5lY3Rpb24oZmluYWwgUGFja1RyYW5zcG9ydCBwYWNrVHJhbnNwb3J0KSB7CisJQmFzZVBhY2tDb25uZWN0aW9uKFBhY2tUcmFuc3BvcnQgcGFja1RyYW5zcG9ydCkgewogCQl0cmFuc3BvcnQgPSAoVHJhbnNwb3J0KSBwYWNrVHJhbnNwb3J0OwogCQlsb2NhbCA9IHRyYW5zcG9ydC5sb2NhbDsKIAkJdXJpID0gdHJhbnNwb3J0LnVyaTsKQEAgLTI3NCw3ICsyNzQsNyBAQCBwcm90ZWN0ZWQgVHJhbnNwb3J0RXhjZXB0aW9uIG5vUmVwb3NpdG9yeSgpIHsKIAkgKiAgICAgICAgICAgIG9wdGlvbiBzdHJpbmcKIAkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBvcHRpb24gaXMgc3VwcG9ydGVkCiAJICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNDYXBhYmxlT2YoZmluYWwgU3RyaW5nIG9wdGlvbikgeworCXByb3RlY3RlZCBib29sZWFuIGlzQ2FwYWJsZU9mKFN0cmluZyBvcHRpb24pIHsKIAkJcmV0dXJuIHJlbW90ZUNhcGFibGl0aWVzLmNvbnRhaW5zKG9wdGlvbik7CiAJfQogCkBAIC0yODcsNyArMjg3LDcgQEAgcHJvdGVjdGVkIGJvb2xlYW4gaXNDYXBhYmxlT2YoZmluYWwgU3RyaW5nIG9wdGlvbikgewogCSAqICAgICAgICAgICAgb3B0aW9uIHdlIHdhbnQKIAkgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgcmVxdWVzdGVkIG9wdGlvbiBpcyBzdXBwb3J0ZWQKIAkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB3YW50Q2FwYWJpbGl0eShmaW5hbCBTdHJpbmdCdWlsZGVyIGIsIGZpbmFsIFN0cmluZyBvcHRpb24pIHsKKwlwcm90ZWN0ZWQgYm9vbGVhbiB3YW50Q2FwYWJpbGl0eShTdHJpbmdCdWlsZGVyIGIsIFN0cmluZyBvcHRpb24pIHsKIAkJaWYgKCFpc0NhcGFibGVPZihvcHRpb24pKQogCQkJcmV0dXJuIGZhbHNlOwogCQliLmFwcGVuZCgnICcpOwpAQCAtMzE0LDcgKzMxNCw3IEBAIHB1YmxpYyBTdHJpbmcgZ2V0UGVlclVzZXJBZ2VudCgpIHsKIAkJcmV0dXJuIFVzZXJBZ2VudC5nZXRBZ2VudChyZW1vdGVDYXBhYmxpdGllcywgc3VwZXIuZ2V0UGVlclVzZXJBZ2VudCgpKTsKIAl9CiAKLQlwcml2YXRlIFBhY2tQcm90b2NvbEV4Y2VwdGlvbiBkdXBsaWNhdGVBZHZlcnRpc2VtZW50KGZpbmFsIFN0cmluZyBuYW1lKSB7CisJcHJpdmF0ZSBQYWNrUHJvdG9jb2xFeGNlcHRpb24gZHVwbGljYXRlQWR2ZXJ0aXNlbWVudChTdHJpbmcgbmFtZSkgewogCQlyZXR1cm4gbmV3IFBhY2tQcm90b2NvbEV4Y2VwdGlvbih1cmksIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpHaXRUZXh0LmdldCgpLmR1cGxpY2F0ZUFkdmVydGlzZW1lbnRzT2YsIG5hbWUpKTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0Jhc2VQYWNrRmV0Y2hDb25uZWN0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CYXNlUGFja0ZldGNoQ29ubmVjdGlvbi5qYXZhCmluZGV4IDEzODMwNDUuLjBkZmNkODcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0Jhc2VQYWNrRmV0Y2hDb25uZWN0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvQmFzZVBhY2tGZXRjaENvbm5lY3Rpb24uamF2YQpAQCAtNDUsOCArNDUsNiBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0OwogCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZkRhdGFiYXNlLkFMTDsKLQogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKQEAgLTU1LDcgKzUzLDYgQEAKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkRhdGU7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuUGFja1Byb3RvY29sRXhjZXB0aW9uOwpAQCAtMjAwLDYgKzE5NywxMyBAQCBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZVBhY2tGZXRjaENvbm5lY3Rpb24gZXh0ZW5kcyBCYXNlUGFja0Nvbm5lY3Rpb24KIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fQUxMT1dfUkVBQ0hBQkxFX1NIQTFfSU5fV0FOVCA9IEdpdFByb3RvY29sQ29uc3RhbnRzLk9QVElPTl9BTExPV19SRUFDSEFCTEVfU0hBMV9JTl9XQU5UOwogCisJLyoqCisJICogVGhlIGNsaWVudCBzcGVjaWZpZWQgYSBmaWx0ZXIgZXhwcmVzc2lvbi4KKwkgKgorCSAqIEBzaW5jZSA1LjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fRklMVEVSID0gR2l0UHJvdG9jb2xDb25zdGFudHMuT1BUSU9OX0ZJTFRFUjsKKwogCXByaXZhdGUgZmluYWwgUmV2V2FsayB3YWxrOwogCiAJLyoqIEFsbCBjb21taXRzIHRoYXQgYXJlIGltbWVkaWF0ZWx5IHJlYWNoYWJsZSBieSBhIGxvY2FsIHJlZi4gKi8KQEAgLTI0MiwxMyArMjQ2LDE2IEBAIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlUGFja0ZldGNoQ29ubmVjdGlvbiBleHRlbmRzIEJhc2VQYWNrQ29ubmVjdGlvbgogCiAJcHJpdmF0ZSBQYWNrZXRMaW5lT3V0IHBja1N0YXRlOwogCisJLyoqIElmIG5vdCAtMSwgdGhlIG1heGltdW0gYmxvYiBzaXplIHRvIGJlIHNlbnQgdG8gdGhlIHNlcnZlci4gKi8KKwlwcml2YXRlIGZpbmFsIGxvbmcgZmlsdGVyQmxvYkxpbWl0OworCiAJLyoqCiAJICogQ3JlYXRlIGEgbmV3IGNvbm5lY3Rpb24gdG8gZmV0Y2ggdXNpbmcgdGhlIG5hdGl2ZSBnaXQgdHJhbnNwb3J0LgogCSAqCiAJICogQHBhcmFtIHBhY2tUcmFuc3BvcnQKIAkgKiAgICAgICAgICAgIHRoZSB0cmFuc3BvcnQuCiAJICovCi0JcHVibGljIEJhc2VQYWNrRmV0Y2hDb25uZWN0aW9uKGZpbmFsIFBhY2tUcmFuc3BvcnQgcGFja1RyYW5zcG9ydCkgeworCXB1YmxpYyBCYXNlUGFja0ZldGNoQ29ubmVjdGlvbihQYWNrVHJhbnNwb3J0IHBhY2tUcmFuc3BvcnQpIHsKIAkJc3VwZXIocGFja1RyYW5zcG9ydCk7CiAKIAkJaWYgKGxvY2FsICE9IG51bGwpIHsKQEAgLTI2Miw2ICsyNjksNyBAQCBwdWJsaWMgQmFzZVBhY2tGZXRjaENvbm5lY3Rpb24oZmluYWwgUGFja1RyYW5zcG9ydCBwYWNrVHJhbnNwb3J0KSB7CiAJCX0KIAkJaW5jbHVkZVRhZ3MgPSB0cmFuc3BvcnQuZ2V0VGFnT3B0KCkgIT0gVGFnT3B0Lk5PX1RBR1M7CiAJCXRoaW5QYWNrID0gdHJhbnNwb3J0LmlzRmV0Y2hUaGluKCk7CisJCWZpbHRlckJsb2JMaW1pdCA9IHRyYW5zcG9ydC5nZXRGaWx0ZXJCbG9iTGltaXQoKTsKIAogCQlpZiAobG9jYWwgIT0gbnVsbCkgewogCQkJd2FsayA9IG5ldyBSZXZXYWxrKGxvY2FsKTsKQEAgLTI4OCw3ICsyOTYsNyBAQCBzdGF0aWMgY2xhc3MgRmV0Y2hDb25maWcgewogCiAJCWZpbmFsIGJvb2xlYW4gbWluaW1hbE5lZ290aWF0aW9uOwogCi0JCUZldGNoQ29uZmlnKGZpbmFsIENvbmZpZyBjKSB7CisJCUZldGNoQ29uZmlnKENvbmZpZyBjKSB7CiAJCQlhbGxvd09mc0RlbHRhID0gYy5nZXRCb29sZWFuKCJyZXBhY2siLCAidXNlZGVsdGFiYXNlb2Zmc2V0IiwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkJbWluaW1hbE5lZ290aWF0aW9uID0gYy5nZXRCb29sZWFuKCJmZXRjaCIsICJ1c2VtaW5pbWFsbmVnb3RpYXRpb24iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJCQkJZmFsc2UpOwpAQCAtMzMxLDcgKzMzOSw3IEBAIHB1YmxpYyBib29sZWFuIGRpZEZldGNoVGVzdENvbm5lY3Rpdml0eSgpIHsKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0UGFja0xvY2tNZXNzYWdlKGZpbmFsIFN0cmluZyBtZXNzYWdlKSB7CisJcHVibGljIHZvaWQgc2V0UGFja0xvY2tNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7CiAJCWxvY2tNZXNzYWdlID0gbWVzc2FnZTsKIAl9CiAKQEAgLTQxMCw5ICs0MTgsOSBAQCBGZXRjaENvbmZpZyBnZXRGZXRjaENvbmZpZygpIHsKIAkJcmV0dXJuIGxvY2FsLmdldENvbmZpZygpLmdldChGZXRjaENvbmZpZzo6bmV3KTsKIAl9CiAKLQlwcml2YXRlIGludCBtYXhUaW1lV2FudGVkKGZpbmFsIENvbGxlY3Rpb248UmVmPiB3YW50cykgeworCXByaXZhdGUgaW50IG1heFRpbWVXYW50ZWQoQ29sbGVjdGlvbjxSZWY+IHdhbnRzKSB7CiAJCWludCBtYXhUaW1lID0gMDsKLQkJZm9yIChmaW5hbCBSZWYgciA6IHdhbnRzKSB7CisJCWZvciAoUmVmIHIgOiB3YW50cykgewogCQkJdHJ5IHsKIAkJCQlmaW5hbCBSZXZPYmplY3Qgb2JqID0gd2Fsay5wYXJzZUFueShyLmdldE9iamVjdElkKCkpOwogCQkJCWlmIChvYmogaW5zdGFuY2VvZiBSZXZDb21taXQpIHsKQEAgLTQyNywxMCArNDM1LDkgQEAgcHJpdmF0ZSBpbnQgbWF4VGltZVdhbnRlZChmaW5hbCBDb2xsZWN0aW9uPFJlZj4gd2FudHMpIHsKIAkJcmV0dXJuIG1heFRpbWU7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIG1hcmtSZWFjaGFibGUoZmluYWwgU2V0PE9iamVjdElkPiBoYXZlLCBmaW5hbCBpbnQgbWF4VGltZSkKKwlwcml2YXRlIHZvaWQgbWFya1JlYWNoYWJsZShTZXQ8T2JqZWN0SWQ+IGhhdmUsIGludCBtYXhUaW1lKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJTWFwPFN0cmluZywgUmVmPiByZWZzID0gbG9jYWwuZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzKEFMTCk7Ci0JCWZvciAoZmluYWwgUmVmIHIgOiByZWZzLnZhbHVlcygpKSB7CisJCWZvciAoUmVmIHIgOiBsb2NhbC5nZXRSZWZEYXRhYmFzZSgpLmdldFJlZnMoKSkgewogCQkJT2JqZWN0SWQgaWQgPSByLmdldFBlZWxlZE9iamVjdElkKCk7CiAJCQlpZiAoaWQgPT0gbnVsbCkKIAkJCQlpZCA9IHIuZ2V0T2JqZWN0SWQoKTsKQEAgLTQ4MiwxMCArNDg5LDEwIEBAIHByaXZhdGUgdm9pZCBwYXJzZVJlYWNoYWJsZShPYmplY3RJZCBpZCkgewogCQl9CiAJfQogCi0JcHJpdmF0ZSBib29sZWFuIHNlbmRXYW50cyhmaW5hbCBDb2xsZWN0aW9uPFJlZj4gd2FudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwcml2YXRlIGJvb2xlYW4gc2VuZFdhbnRzKENvbGxlY3Rpb248UmVmPiB3YW50KSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBQYWNrZXRMaW5lT3V0IHAgPSBzdGF0ZWxlc3NSUEMgPyBwY2tTdGF0ZSA6IHBja091dDsKIAkJYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0JCWZvciAoZmluYWwgUmVmIHIgOiB3YW50KSB7CisJCWZvciAoUmVmIHIgOiB3YW50KSB7CiAJCQlPYmplY3RJZCBvYmplY3RJZCA9IHIuZ2V0T2JqZWN0SWQoKTsKIAkJCWlmIChvYmplY3RJZCA9PSBudWxsKSB7CiAJCQkJY29udGludWU7CkBAIC01MjQsNiArNTMxLDExIEBAIHByaXZhdGUgYm9vbGVhbiBzZW5kV2FudHMoZmluYWwgQ29sbGVjdGlvbjxSZWY+IHdhbnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWlmIChmaXJzdCkgewogCQkJcmV0dXJuIGZhbHNlOwogCQl9CisJCWlmIChmaWx0ZXJCbG9iTGltaXQgPT0gMCkgeworCQkJcC53cml0ZVN0cmluZyhPUFRJT05fRklMVEVSICsgIiBibG9iOm5vbmUiKTsgLy8kTk9OLU5MUy0xJAorCQl9IGVsc2UgaWYgKGZpbHRlckJsb2JMaW1pdCA+IDApIHsKKwkJCXAud3JpdGVTdHJpbmcoT1BUSU9OX0ZJTFRFUiArICIgYmxvYjpsaW1pdD0iICsgZmlsdGVyQmxvYkxpbWl0KTsgLy8kTk9OLU5MUy0xJAorCQl9CiAJCXAuZW5kKCk7CiAJCW91dE5lZWRzRW5kID0gZmFsc2U7CiAJCXJldHVybiB0cnVlOwpAQCAtNTY0LDExICs1NzYsMTYgQEAgZWxzZSBpZiAod2FudENhcGFiaWxpdHkobGluZSwgT1BUSU9OX1NJREVfQkFORCkpCiAJCQkJCU9QVElPTl9NVUxUSV9BQ0tfREVUQUlMRUQpKTsKIAkJfQogCisJCWlmIChmaWx0ZXJCbG9iTGltaXQgPj0gMCAmJiAhd2FudENhcGFiaWxpdHkobGluZSwgT1BUSU9OX0ZJTFRFUikpIHsKKwkJCXRocm93IG5ldyBQYWNrUHJvdG9jb2xFeGNlcHRpb24odXJpLAorCQkJCQlKR2l0VGV4dC5nZXQoKS5maWx0ZXJSZXF1aXJlc0NhcGFiaWxpdHkpOworCQl9CisKIAkJYWRkVXNlckFnZW50Q2FwYWJpbGl0eShsaW5lKTsKIAkJcmV0dXJuIGxpbmUudG9TdHJpbmcoKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgbmVnb3RpYXRlKGZpbmFsIFByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24sCisJcHJpdmF0ZSB2b2lkIG5lZ290aWF0ZShQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIElPRXhjZXB0aW9uLAogCQkJQ2FuY2VsbGVkRXhjZXB0aW9uIHsKIAkJZmluYWwgTXV0YWJsZU9iamVjdElkIGFja0lkID0gbmV3IE11dGFibGVPYmplY3RJZCgpOwogCQlpbnQgcmVzdWx0c1BlbmRpbmcgPSAwOwpAQCAtNzY4LDcgKzc4NSw3IEBAIHB1YmxpYyBSZXZGaWx0ZXIgY2xvbmUoKSB7CiAJCQl9CiAKIAkJCUBPdmVycmlkZQotCQkJcHVibGljIGJvb2xlYW4gaW5jbHVkZShmaW5hbCBSZXZXYWxrIHdhbGtlciwgZmluYWwgUmV2Q29tbWl0IGMpIHsKKwkJCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoUmV2V2FsayB3YWxrZXIsIFJldkNvbW1pdCBjKSB7CiAJCQkJZmluYWwgYm9vbGVhbiByZW1vdGVLbm93c0lzQ29tbW9uID0gYy5oYXMoQ09NTU9OKTsKIAkJCQlpZiAoYy5oYXMoQURWRVJUSVNFRCkpIHsKIAkJCQkJLy8gUmVtb3RlIGFkdmVydGlzZWQgdGhpcywgYW5kIHdlIGhhdmUgaXQsIGhlbmNlIGNvbW1vbi4KQEAgLTc4OSwxNCArODA2LDE0IEBAIHB1YmxpYyBib29sZWFuIHJlcXVpcmVzQ29tbWl0Qm9keSgpIHsKIAl9CiAKIAlwcml2YXRlIHZvaWQgbWFya1JlZnNBZHZlcnRpc2VkKCkgewotCQlmb3IgKGZpbmFsIFJlZiByIDogZ2V0UmVmcygpKSB7CisJCWZvciAoUmVmIHIgOiBnZXRSZWZzKCkpIHsKIAkJCW1hcmtBZHZlcnRpc2VkKHIuZ2V0T2JqZWN0SWQoKSk7CiAJCQlpZiAoci5nZXRQZWVsZWRPYmplY3RJZCgpICE9IG51bGwpCiAJCQkJbWFya0FkdmVydGlzZWQoci5nZXRQZWVsZWRPYmplY3RJZCgpKTsKIAkJfQogCX0KIAotCXByaXZhdGUgdm9pZCBtYXJrQWR2ZXJ0aXNlZChmaW5hbCBBbnlPYmplY3RJZCBpZCkgeworCXByaXZhdGUgdm9pZCBtYXJrQWR2ZXJ0aXNlZChBbnlPYmplY3RJZCBpZCkgewogCQl0cnkgewogCQkJd2Fsay5wYXJzZUFueShpZCkuYWRkKEFEVkVSVElTRUQpOwogCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiByZWFkRXJyb3IpIHsKQEAgLTgwNCw3ICs4MjEsNyBAQCBwcml2YXRlIHZvaWQgbWFya0FkdmVydGlzZWQoZmluYWwgQW55T2JqZWN0SWQgaWQpIHsKIAkJfQogCX0KIAotCXByaXZhdGUgdm9pZCBtYXJrQ29tbW9uKGZpbmFsIFJldk9iamVjdCBvYmosIGZpbmFsIEFja05hY2tSZXN1bHQgYW5yKQorCXByaXZhdGUgdm9pZCBtYXJrQ29tbW9uKFJldk9iamVjdCBvYmosIEFja05hY2tSZXN1bHQgYW5yKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJaWYgKHN0YXRlbGVzc1JQQyAmJiBhbnIgPT0gQWNrTmFja1Jlc3VsdC5BQ0tfQ09NTU9OICYmICFvYmouaGFzKFNUQVRFKSkgewogCQkJU3RyaW5nQnVpbGRlciBzOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvQmFzZVBhY2tQdXNoQ29ubmVjdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvQmFzZVBhY2tQdXNoQ29ubmVjdGlvbi5qYXZhCmluZGV4IGVlNmYyOWUuLjY5NjI0ZmYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0Jhc2VQYWNrUHVzaENvbm5lY3Rpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CYXNlUGFja1B1c2hDb25uZWN0aW9uLmphdmEKQEAgLTE0Niw3ICsxNDYsNyBAQCBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZVBhY2tQdXNoQ29ubmVjdGlvbiBleHRlbmRzIEJhc2VQYWNrQ29ubmVjdGlvbiBpbXBsZW1lbgogCSAqIEBwYXJhbSBwYWNrVHJhbnNwb3J0CiAJICogICAgICAgICAgICB0aGUgdHJhbnNwb3J0LgogCSAqLwotCXB1YmxpYyBCYXNlUGFja1B1c2hDb25uZWN0aW9uKGZpbmFsIFBhY2tUcmFuc3BvcnQgcGFja1RyYW5zcG9ydCkgeworCXB1YmxpYyBCYXNlUGFja1B1c2hDb25uZWN0aW9uKFBhY2tUcmFuc3BvcnQgcGFja1RyYW5zcG9ydCkgewogCQlzdXBlcihwYWNrVHJhbnNwb3J0KTsKIAkJdGhpblBhY2sgPSB0cmFuc3BvcnQuaXNQdXNoVGhpbigpOwogCQlhdG9taWMgPSB0cmFuc3BvcnQuaXNQdXNoQXRvbWljKCk7CkBAIC0yNTYsNyArMjU2LDcgQEAgcHJpdmF0ZSB2b2lkIHdyaXRlQ29tbWFuZHMoZmluYWwgQ29sbGVjdGlvbjxSZW1vdGVSZWZVcGRhdGU+IHJlZlVwZGF0ZXMsCiAJCQkJCQkJcHVzaE9wdGlvbnMudG9TdHJpbmcoKSkpOwogCQl9CiAKLQkJZm9yIChmaW5hbCBSZW1vdGVSZWZVcGRhdGUgcnJ1IDogcmVmVXBkYXRlcykgeworCQlmb3IgKFJlbW90ZVJlZlVwZGF0ZSBycnUgOiByZWZVcGRhdGVzKSB7CiAJCQlpZiAoIWNhcGFibGVEZWxldGVSZWZzICYmIHJydS5pc0RlbGV0ZSgpKSB7CiAJCQkJcnJ1LnNldFN0YXR1cyhTdGF0dXMuUkVKRUNURURfTk9ERUxFVEUpOwogCQkJCWNvbnRpbnVlOwpAQCAtMjk0LDcgKzI5NCw3IEBAIHByaXZhdGUgdm9pZCB3cml0ZUNvbW1hbmRzKGZpbmFsIENvbGxlY3Rpb248UmVtb3RlUmVmVXBkYXRlPiByZWZVcGRhdGVzLAogCX0KIAogCXByaXZhdGUgdm9pZCB0cmFuc21pdE9wdGlvbnMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmb3IgKGZpbmFsIFN0cmluZyBwdXNoT3B0aW9uIDogcHVzaE9wdGlvbnMpIHsKKwkJZm9yIChTdHJpbmcgcHVzaE9wdGlvbiA6IHB1c2hPcHRpb25zKSB7CiAJCQlwY2tPdXQud3JpdGVTdHJpbmcocHVzaE9wdGlvbik7CiAJCX0KIApAQCAtMzMyLDE3ICszMzIsMTcgQEAgcHJpdmF0ZSB2b2lkIHdyaXRlUGFjayhmaW5hbCBNYXA8U3RyaW5nLCBSZW1vdGVSZWZVcGRhdGU+IHJlZlVwZGF0ZXMsCiAJCVNldDxPYmplY3RJZD4gcmVtb3RlT2JqZWN0cyA9IG5ldyBIYXNoU2V0PD4oKTsKIAkJU2V0PE9iamVjdElkPiBuZXdPYmplY3RzID0gbmV3IEhhc2hTZXQ8PigpOwogCi0JCXRyeSAoZmluYWwgUGFja1dyaXRlciB3cml0ZXIgPSBuZXcgUGFja1dyaXRlcih0cmFuc3BvcnQuZ2V0UGFja0NvbmZpZygpLAorCQl0cnkgKFBhY2tXcml0ZXIgd3JpdGVyID0gbmV3IFBhY2tXcml0ZXIodHJhbnNwb3J0LmdldFBhY2tDb25maWcoKSwKIAkJCQlsb2NhbC5uZXdPYmplY3RSZWFkZXIoKSkpIHsKIAotCQkJZm9yIChmaW5hbCBSZWYgciA6IGdldFJlZnMoKSkgeworCQkJZm9yIChSZWYgciA6IGdldFJlZnMoKSkgewogCQkJCS8vIG9ubHkgYWRkIG9iamVjdHMgdGhhdCB3ZSBhY3R1YWxseSBoYXZlCiAJCQkJT2JqZWN0SWQgb2lkID0gci5nZXRPYmplY3RJZCgpOwogCQkJCWlmIChsb2NhbC5oYXNPYmplY3Qob2lkKSkKIAkJCQkJcmVtb3RlT2JqZWN0cy5hZGQob2lkKTsKIAkJCX0KIAkJCXJlbW90ZU9iamVjdHMuYWRkQWxsKGFkZGl0aW9uYWxIYXZlcyk7Ci0JCQlmb3IgKGZpbmFsIFJlbW90ZVJlZlVwZGF0ZSByIDogcmVmVXBkYXRlcy52YWx1ZXMoKSkgeworCQkJZm9yIChSZW1vdGVSZWZVcGRhdGUgciA6IHJlZlVwZGF0ZXMudmFsdWVzKCkpIHsKIAkJCQlpZiAoIU9iamVjdElkLnplcm9JZCgpLmVxdWFscyhyLmdldE5ld09iamVjdElkKCkpKQogCQkJCQluZXdPYmplY3RzLmFkZChyLmdldE5ld09iamVjdElkKCkpOwogCQkJfQpAQCAtMzY1LDcgKzM2NSw3IEBAIHByaXZhdGUgdm9pZCB3cml0ZVBhY2soZmluYWwgTWFwPFN0cmluZywgUmVtb3RlUmVmVXBkYXRlPiByZWZVcGRhdGVzLAogCQl9CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHJlYWRTdGF0dXNSZXBvcnQoZmluYWwgTWFwPFN0cmluZywgUmVtb3RlUmVmVXBkYXRlPiByZWZVcGRhdGVzKQorCXByaXZhdGUgdm9pZCByZWFkU3RhdHVzUmVwb3J0KE1hcDxTdHJpbmcsIFJlbW90ZVJlZlVwZGF0ZT4gcmVmVXBkYXRlcykKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIFN0cmluZyB1bnBhY2tMaW5lID0gcmVhZFN0cmluZ0xvbmdUaW1lb3V0KCk7CiAJCWlmICghdW5wYWNrTGluZS5zdGFydHNXaXRoKCJ1bnBhY2sgIikpIC8vJE5PTi1OTFMtMSQKQEAgLTQxMSw3ICs0MTEsNyBAQCBwcml2YXRlIHZvaWQgcmVhZFN0YXR1c1JlcG9ydChmaW5hbCBNYXA8U3RyaW5nLCBSZW1vdGVSZWZVcGRhdGU+IHJlZlVwZGF0ZXMpCiAJCQkJcnJ1LnNldE1lc3NhZ2UobWVzc2FnZSk7CiAJCQl9CiAJCX0KLQkJZm9yIChmaW5hbCBSZW1vdGVSZWZVcGRhdGUgcnJ1IDogcmVmVXBkYXRlcy52YWx1ZXMoKSkgeworCQlmb3IgKFJlbW90ZVJlZlVwZGF0ZSBycnUgOiByZWZVcGRhdGVzLnZhbHVlcygpKSB7CiAJCQlpZiAocnJ1LmdldFN0YXR1cygpID09IFN0YXR1cy5BV0FJVElOR19SRVBPUlQpCiAJCQkJdGhyb3cgbmV3IFBhY2tQcm90b2NvbEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKIAkJCQkJCUpHaXRUZXh0LmdldCgpLmV4cGVjdGVkUmVwb3J0Rm9yUmVmTm90UmVjZWl2ZWQgLCB1cmksIHJydS5nZXRSZW1vdGVOYW1lKCkpKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0Jhc2VSZWNlaXZlUGFjay5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvQmFzZVJlY2VpdmVQYWNrLmphdmEKaW5kZXggOGYzNjVmYy4uZDM0MTliYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvQmFzZVJlY2VpdmVQYWNrLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvQmFzZVJlY2VpdmVQYWNrLmphdmEKQEAgLTMxMiw3ICszMTIsNyBAQCBwdWJsaWMgdm9pZCBzZXRQdXNoQ2VydGlmaWNhdGUoUHVzaENlcnRpZmljYXRlIGNlcnQpIHsKIAkgKiBAcGFyYW0gaW50bwogCSAqICAgICAgICAgICAgdGhlIGRlc3RpbmF0aW9uIHJlcG9zaXRvcnkuCiAJICovCi0JcHJvdGVjdGVkIEJhc2VSZWNlaXZlUGFjayhmaW5hbCBSZXBvc2l0b3J5IGludG8pIHsKKwlwcm90ZWN0ZWQgQmFzZVJlY2VpdmVQYWNrKFJlcG9zaXRvcnkgaW50bykgewogCQlkYiA9IGludG87CiAJCXdhbGsgPSBuZXcgUmV2V2FsayhkYik7CiAKQEAgLTM0Niw3ICszNDYsNyBAQCBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIFJlY2VpdmVDb25maWcgewogCQlmaW5hbCBsb25nIG1heERpc2NhcmRCeXRlczsKIAkJZmluYWwgU2lnbmVkUHVzaENvbmZpZyBzaWduZWRQdXNoOwogCi0JCVJlY2VpdmVDb25maWcoZmluYWwgQ29uZmlnIGNvbmZpZykgeworCQlSZWNlaXZlQ29uZmlnKENvbmZpZyBjb25maWcpIHsKIAkJCWFsbG93Q3JlYXRlcyA9IHRydWU7CiAJCQlhbGxvd0RlbGV0ZXMgPSAhY29uZmlnLmdldEJvb2xlYW4oInJlY2VpdmUiLCAiZGVueWRlbGV0ZXMiLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkJYWxsb3dOb25GYXN0Rm9yd2FyZHMgPSAhY29uZmlnLmdldEJvb2xlYW4oInJlY2VpdmUiLCAvLyROT04tTkxTLTEkCkBAIC01NTQsNyArNTU0LDcgQEAgcHVibGljIGJvb2xlYW4gaXNCaURpcmVjdGlvbmFsUGlwZSgpIHsKIAkgKiAgICAgICAgICAgIGNvbW1hbmRzIGJlZm9yZSB3cml0aW5nIG91dHB1dCBhbmQgZG9lcyBub3QgcGVyZm9ybSB0aGUKIAkgKiAgICAgICAgICAgIGluaXRpYWwgYWR2ZXJ0aXNpbmcuCiAJICovCi0JcHVibGljIHZvaWQgc2V0QmlEaXJlY3Rpb25hbFBpcGUoZmluYWwgYm9vbGVhbiB0d29XYXkpIHsKKwlwdWJsaWMgdm9pZCBzZXRCaURpcmVjdGlvbmFsUGlwZShib29sZWFuIHR3b1dheSkgewogCQliaURpcmVjdGlvbmFsUGlwZSA9IHR3b1dheTsKIAl9CiAKQEAgLTU5OCw3ICs1OTgsNyBAQCBwdWJsaWMgYm9vbGVhbiBpc0NoZWNrUmVjZWl2ZWRPYmplY3RzKCkgewogCSAqICAgICAgICAgICAgYXNzdW1lIGFsbCByZWNlaXZlZCBvYmplY3RzIGFyZSB2YWxpZC4KIAkgKiBAc2VlICNzZXRPYmplY3RDaGVja2VyKE9iamVjdENoZWNrZXIpCiAJICovCi0JcHVibGljIHZvaWQgc2V0Q2hlY2tSZWNlaXZlZE9iamVjdHMoZmluYWwgYm9vbGVhbiBjaGVjaykgeworCXB1YmxpYyB2b2lkIHNldENoZWNrUmVjZWl2ZWRPYmplY3RzKGJvb2xlYW4gY2hlY2spIHsKIAkJaWYgKGNoZWNrICYmIG9iamVjdENoZWNrZXIgPT0gbnVsbCkKIAkJCXNldE9iamVjdENoZWNrZXIobmV3IE9iamVjdENoZWNrZXIoKSk7CiAJCWVsc2UgaWYgKCFjaGVjayAmJiBvYmplY3RDaGVja2VyICE9IG51bGwpCkBAIC02MzIsNyArNjMyLDcgQEAgcHVibGljIGJvb2xlYW4gaXNBbGxvd0NyZWF0ZXMoKSB7CiAJICogQHBhcmFtIGNhbkNyZWF0ZQogCSAqICAgICAgICAgICAge0Bjb2RlIHRydWV9IHRvIHBlcm1pdCBjcmVhdGUgcmVmIGNvbW1hbmRzIHRvIGJlIHByb2Nlc3NlZC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBbGxvd0NyZWF0ZXMoZmluYWwgYm9vbGVhbiBjYW5DcmVhdGUpIHsKKwlwdWJsaWMgdm9pZCBzZXRBbGxvd0NyZWF0ZXMoYm9vbGVhbiBjYW5DcmVhdGUpIHsKIAkJYWxsb3dDcmVhdGVzID0gY2FuQ3JlYXRlOwogCX0KIApAQCAtNjUxLDcgKzY1MSw3IEBAIHB1YmxpYyBib29sZWFuIGlzQWxsb3dEZWxldGVzKCkgewogCSAqIEBwYXJhbSBjYW5EZWxldGUKIAkgKiAgICAgICAgICAgIHtAY29kZSB0cnVlfSB0byBwZXJtaXQgZGVsZXRlIHJlZiBjb21tYW5kcyB0byBiZSBwcm9jZXNzZWQuCiAJICovCi0JcHVibGljIHZvaWQgc2V0QWxsb3dEZWxldGVzKGZpbmFsIGJvb2xlYW4gY2FuRGVsZXRlKSB7CisJcHVibGljIHZvaWQgc2V0QWxsb3dEZWxldGVzKGJvb2xlYW4gY2FuRGVsZXRlKSB7CiAJCWFsbG93QW55RGVsZXRlcyA9IGNhbkRlbGV0ZTsKIAl9CiAKQEAgLTY5Nyw3ICs2OTcsNyBAQCBwdWJsaWMgYm9vbGVhbiBpc0FsbG93Tm9uRmFzdEZvcndhcmRzKCkgewogCSAqICAgICAgICAgICAge0Bjb2RlIHRydWV9IHRvIHBlcm1pdCB0aGUgY2xpZW50IHRvIGFzayBmb3Igbm9uLWZhc3QtZm9yd2FyZAogCSAqICAgICAgICAgICAgdXBkYXRlcyBvZiBhbiBleGlzdGluZyByZWYuCiAJICovCi0JcHVibGljIHZvaWQgc2V0QWxsb3dOb25GYXN0Rm9yd2FyZHMoZmluYWwgYm9vbGVhbiBjYW5SZXdpbmQpIHsKKwlwdWJsaWMgdm9pZCBzZXRBbGxvd05vbkZhc3RGb3J3YXJkcyhib29sZWFuIGNhblJld2luZCkgewogCQlhbGxvd05vbkZhc3RGb3J3YXJkcyA9IGNhblJld2luZDsKIAl9CiAKQEAgLTc0Nyw3ICs3NDcsNyBAQCBwdWJsaWMgUGVyc29uSWRlbnQgZ2V0UmVmTG9nSWRlbnQoKSB7CiAJICogICAgICAgICAgICBhdXRvbWF0aWNhbGx5IGRldGVybWluZWQgYmFzZWQgb24gdGhlIHJlcG9zaXRvcnkKIAkgKiAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24uCiAJICovCi0JcHVibGljIHZvaWQgc2V0UmVmTG9nSWRlbnQoZmluYWwgUGVyc29uSWRlbnQgcGkpIHsKKwlwdWJsaWMgdm9pZCBzZXRSZWZMb2dJZGVudChQZXJzb25JZGVudCBwaSkgewogCQlyZWZMb2dJZGVudCA9IHBpOwogCX0KIApAQCAtNzg0LDcgKzc4NCw3IEBAIHB1YmxpYyBSZWZGaWx0ZXIgZ2V0UmVmRmlsdGVyKCkgewogCSAqIEBwYXJhbSBhZHZlcnRpc2VSZWZzSG9vawogCSAqICAgICAgICAgICAgdGhlIGhvb2s7IG1heSBiZSBudWxsIHRvIHNob3cgYWxsIHJlZnMuCiAJICovCi0JcHVibGljIHZvaWQgc2V0QWR2ZXJ0aXNlUmVmc0hvb2soZmluYWwgQWR2ZXJ0aXNlUmVmc0hvb2sgYWR2ZXJ0aXNlUmVmc0hvb2spIHsKKwlwdWJsaWMgdm9pZCBzZXRBZHZlcnRpc2VSZWZzSG9vayhBZHZlcnRpc2VSZWZzSG9vayBhZHZlcnRpc2VSZWZzSG9vaykgewogCQlpZiAoYWR2ZXJ0aXNlUmVmc0hvb2sgIT0gbnVsbCkKIAkJCXRoaXMuYWR2ZXJ0aXNlUmVmc0hvb2sgPSBhZHZlcnRpc2VSZWZzSG9vazsKIAkJZWxzZQpAQCAtODAxLDcgKzgwMSw3IEBAIHB1YmxpYyB2b2lkIHNldEFkdmVydGlzZVJlZnNIb29rKGZpbmFsIEFkdmVydGlzZVJlZnNIb29rIGFkdmVydGlzZVJlZnNIb29rKSB7CiAJICogQHBhcmFtIHJlZkZpbHRlcgogCSAqICAgICAgICAgICAgdGhlIGZpbHRlcjsgbWF5IGJlIG51bGwgdG8gc2hvdyBhbGwgcmVmcy4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWZGaWx0ZXIoZmluYWwgUmVmRmlsdGVyIHJlZkZpbHRlcikgeworCXB1YmxpYyB2b2lkIHNldFJlZkZpbHRlcihSZWZGaWx0ZXIgcmVmRmlsdGVyKSB7CiAJCXRoaXMucmVmRmlsdGVyID0gcmVmRmlsdGVyICE9IG51bGwgPyByZWZGaWx0ZXIgOiBSZWZGaWx0ZXIuREVGQVVMVDsKIAl9CiAKQEAgLTgyMiw3ICs4MjIsNyBAQCBwdWJsaWMgaW50IGdldFRpbWVvdXQoKSB7CiAJICogICAgICAgICAgICBiZWZvcmUgYWJvcnRpbmcgYW4gSU8gcmVhZCBvciB3cml0ZSBvcGVyYXRpb24gd2l0aCB0aGUKIAkgKiAgICAgICAgICAgIGNvbm5lY3RlZCBjbGllbnQuCiAJICovCi0JcHVibGljIHZvaWQgc2V0VGltZW91dChmaW5hbCBpbnQgc2Vjb25kcykgeworCXB1YmxpYyB2b2lkIHNldFRpbWVvdXQoaW50IHNlY29uZHMpIHsKIAkJdGltZW91dCA9IHNlY29uZHM7CiAJfQogCkBAIC04NjcsNyArODY3LDcgQEAgcHVibGljIHZvaWQgc2V0TWF4Q29tbWFuZERpc2NhcmRCeXRlcyhsb25nIGxpbWl0KSB7CiAJICogQHBhcmFtIGxpbWl0CiAJICogICAgICAgICAgICB0aGUgR2l0IG9iamVjdCBzaXplIGxpbWl0LiBJZiB6ZXJvIHRoZW4gdGhlcmUgaXMgbm90IGxpbWl0LgogCSAqLwotCXB1YmxpYyB2b2lkIHNldE1heE9iamVjdFNpemVMaW1pdChmaW5hbCBsb25nIGxpbWl0KSB7CisJcHVibGljIHZvaWQgc2V0TWF4T2JqZWN0U2l6ZUxpbWl0KGxvbmcgbGltaXQpIHsKIAkJbWF4T2JqZWN0U2l6ZUxpbWl0ID0gbGltaXQ7CiAJfQogCkBAIC04ODAsNyArODgwLDcgQEAgcHVibGljIHZvaWQgc2V0TWF4T2JqZWN0U2l6ZUxpbWl0KGZpbmFsIGxvbmcgbGltaXQpIHsKIAkgKiAgICAgICAgICAgIHRoZSBwYWNrIHNpemUgbGltaXQsIGluIGJ5dGVzCiAJICogQHNpbmNlIDMuMwogCSAqLwotCXB1YmxpYyB2b2lkIHNldE1heFBhY2tTaXplTGltaXQoZmluYWwgbG9uZyBsaW1pdCkgeworCXB1YmxpYyB2b2lkIHNldE1heFBhY2tTaXplTGltaXQobG9uZyBsaW1pdCkgewogCQlpZiAobGltaXQgPCAwKQogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKIAkJCQkJSkdpdFRleHQuZ2V0KCkucmVjZWl2ZVBhY2tJbnZhbGlkTGltaXQsIExvbmcudmFsdWVPZihsaW1pdCkpKTsKQEAgLTEwMzcsNyArMTAzNyw3IEBAIHB1YmxpYyBMaXN0PFJlY2VpdmVDb21tYW5kPiBnZXRBbGxDb21tYW5kcygpIHsKIAkgKiAgICAgICAgICAgIHN0cmluZyBkZXNjcmliaW5nIHRoZSBwcm9ibGVtIGlkZW50aWZpZWQgYnkgdGhlIGhvb2suIFRoZQogCSAqICAgICAgICAgICAgc3RyaW5nIG11c3Qgbm90IGVuZCB3aXRoIGFuIExGLCBhbmQgbXVzdCBub3QgY29udGFpbiBhbiBMRi4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZW5kRXJyb3IoZmluYWwgU3RyaW5nIHdoYXQpIHsKKwlwdWJsaWMgdm9pZCBzZW5kRXJyb3IoU3RyaW5nIHdoYXQpIHsKIAkJaWYgKHJlZnMgPT0gbnVsbCkgewogCQkJaWYgKGFkdmVydGlzZUVycm9yID09IG51bGwpCiAJCQkJYWR2ZXJ0aXNlRXJyb3IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwpAQCAtMTA3MCw3ICsxMDcwLDcgQEAgcHJpdmF0ZSB2b2lkIGZhdGFsRXJyb3IoU3RyaW5nIG1zZykgewogCSAqICAgICAgICAgICAgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIHByb2JsZW0gaWRlbnRpZmllZCBieSB0aGUgaG9vay4gVGhlCiAJICogICAgICAgICAgICBzdHJpbmcgbXVzdCBub3QgZW5kIHdpdGggYW4gTEYsIGFuZCBtdXN0IG5vdCBjb250YWluIGFuIExGLgogCSAqLwotCXB1YmxpYyB2b2lkIHNlbmRNZXNzYWdlKGZpbmFsIFN0cmluZyB3aGF0KSB7CisJcHVibGljIHZvaWQgc2VuZE1lc3NhZ2UoU3RyaW5nIHdoYXQpIHsKIAkJbXNnT3V0V3JhcHBlci53cml0ZShDb25zdGFudHMuZW5jb2RlKHdoYXQgKyAiXG4iKSk7IC8vJE5PTi1OTFMtMSQKIAl9CiAKQEAgLTEyMjEsNyArMTIyMSw3IEBAIHByb3RlY3RlZCB2b2lkIHVubG9ja1BhY2soKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCSAqIEB0aHJvd3Mgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuU2VydmljZU1heU5vdENvbnRpbnVlRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgdGhlIGhvb2sgZGVuaWVkIGFkdmVydGlzZW1lbnQuCiAJICovCi0JcHVibGljIHZvaWQgc2VuZEFkdmVydGlzZWRSZWZzKGZpbmFsIFJlZkFkdmVydGlzZXIgYWR2KQorCXB1YmxpYyB2b2lkIHNlbmRBZHZlcnRpc2VkUmVmcyhSZWZBZHZlcnRpc2VyIGFkdikKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmljZU1heU5vdENvbnRpbnVlRXhjZXB0aW9uIHsKIAkJaWYgKGFkdmVydGlzZUVycm9yICE9IG51bGwpIHsKIAkJCWFkdi53cml0ZU9uZSgiRVJSICIgKyBhZHZlcnRpc2VFcnJvcik7IC8vJE5PTi1OTFMtMSQKQEAgLTE0NDgsNyArMTQ0OCw3IEBAIHZvaWQgY2hlY2tSZXF1ZXN0V2FzUmVhZCgpIHsKIAkgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBhIHBhY2sgaXMgZXhwZWN0ZWQgYmFzZWQgb24gdGhlIGxpc3Qgb2YgY29tbWFuZHMuCiAJICovCiAJcHJvdGVjdGVkIGJvb2xlYW4gbmVlZFBhY2soKSB7Ci0JCWZvciAoZmluYWwgUmVjZWl2ZUNvbW1hbmQgY21kIDogY29tbWFuZHMpIHsKKwkJZm9yIChSZWNlaXZlQ29tbWFuZCBjbWQgOiBjb21tYW5kcykgewogCQkJaWYgKGNtZC5nZXRUeXBlKCkgIT0gUmVjZWl2ZUNvbW1hbmQuVHlwZS5ERUxFVEUpCiAJCQkJcmV0dXJuIHRydWU7CiAJCX0KQEAgLTE1NDksMjEgKzE1NDksMjEgQEAgcHJpdmF0ZSB2b2lkIGNoZWNrQ29ubmVjdGl2aXR5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJfQogCQlwYXJzZXIgPSBudWxsOwogCi0JCXRyeSAoZmluYWwgT2JqZWN0V2FsayBvdyA9IG5ldyBPYmplY3RXYWxrKGRiKSkgeworCQl0cnkgKE9iamVjdFdhbGsgb3cgPSBuZXcgT2JqZWN0V2FsayhkYikpIHsKIAkJCWlmIChiYXNlT2JqZWN0cyAhPSBudWxsKSB7CiAJCQkJb3cuc29ydChSZXZTb3J0LlRPUE8pOwogCQkJCWlmICghYmFzZU9iamVjdHMuaXNFbXB0eSgpKQogCQkJCQlvdy5zb3J0KFJldlNvcnQuQk9VTkRBUlksIHRydWUpOwogCQkJfQogCi0JCQlmb3IgKGZpbmFsIFJlY2VpdmVDb21tYW5kIGNtZCA6IGNvbW1hbmRzKSB7CisJCQlmb3IgKFJlY2VpdmVDb21tYW5kIGNtZCA6IGNvbW1hbmRzKSB7CiAJCQkJaWYgKGNtZC5nZXRSZXN1bHQoKSAhPSBSZXN1bHQuTk9UX0FUVEVNUFRFRCkKIAkJCQkJY29udGludWU7CiAJCQkJaWYgKGNtZC5nZXRUeXBlKCkgPT0gUmVjZWl2ZUNvbW1hbmQuVHlwZS5ERUxFVEUpCiAJCQkJCWNvbnRpbnVlOwogCQkJCW93Lm1hcmtTdGFydChvdy5wYXJzZUFueShjbWQuZ2V0TmV3SWQoKSkpOwogCQkJfQotCQkJZm9yIChmaW5hbCBPYmplY3RJZCBoYXZlIDogYWR2ZXJ0aXNlZEhhdmVzKSB7CisJCQlmb3IgKE9iamVjdElkIGhhdmUgOiBhZHZlcnRpc2VkSGF2ZXMpIHsKIAkJCQlSZXZPYmplY3QgbyA9IG93LnBhcnNlQW55KGhhdmUpOwogCQkJCW93Lm1hcmtVbmludGVyZXN0aW5nKG8pOwogCkBAIC0xNjE5LDcgKzE2MTksNyBAQCBwcml2YXRlIHZvaWQgY2hlY2tDb25uZWN0aXZpdHkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCSAqIFZhbGlkYXRlIHRoZSBjb21tYW5kIGxpc3QuCiAJICovCiAJcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVDb21tYW5kcygpIHsKLQkJZm9yIChmaW5hbCBSZWNlaXZlQ29tbWFuZCBjbWQgOiBjb21tYW5kcykgeworCQlmb3IgKFJlY2VpdmVDb21tYW5kIGNtZCA6IGNvbW1hbmRzKSB7CiAJCQlmaW5hbCBSZWYgcmVmID0gY21kLmdldFJlZigpOwogCQkJaWYgKGNtZC5nZXRSZXN1bHQoKSAhPSBSZXN1bHQuTk9UX0FUVEVNUFRFRCkKIAkJCQljb250aW51ZTsKQEAgLTE3ODQsNyArMTc4NCw3IEBAIHByb3RlY3RlZCB2b2lkIGZhaWxQZW5kaW5nQ29tbWFuZHMoKSB7CiAJICogQHJldHVybiBhIGNvcHkgb2YgdGhlIGNvbW1hbmQgbGlzdCBjb250YWluaW5nIG9ubHkgdGhvc2UgY29tbWFuZHMgd2l0aCB0aGUKIAkgKiAgICAgICAgIGRlc2lyZWQgc3RhdHVzLgogCSAqLwotCXByb3RlY3RlZCBMaXN0PFJlY2VpdmVDb21tYW5kPiBmaWx0ZXJDb21tYW5kcyhmaW5hbCBSZXN1bHQgd2FudCkgeworCXByb3RlY3RlZCBMaXN0PFJlY2VpdmVDb21tYW5kPiBmaWx0ZXJDb21tYW5kcyhSZXN1bHQgd2FudCkgewogCQlyZXR1cm4gUmVjZWl2ZUNvbW1hbmQuZmlsdGVyKGNvbW1hbmRzLCB3YW50KTsKIAl9CiAKQEAgLTE4MzgsNyArMTgzOCw3IEBAIHByb3RlY3RlZCB2b2lkIHNlbmRTdGF0dXNSZXBvcnQoZmluYWwgYm9vbGVhbiBmb3JDbGllbnQsCiAJCWlmICh1bnBhY2tFcnJvciAhPSBudWxsKSB7CiAJCQlvdXQuc2VuZFN0cmluZygidW5wYWNrIGVycm9yICIgKyB1bnBhY2tFcnJvci5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkCiAJCQlpZiAoZm9yQ2xpZW50KSB7Ci0JCQkJZm9yIChmaW5hbCBSZWNlaXZlQ29tbWFuZCBjbWQgOiBjb21tYW5kcykgeworCQkJCWZvciAoUmVjZWl2ZUNvbW1hbmQgY21kIDogY29tbWFuZHMpIHsKIAkJCQkJb3V0LnNlbmRTdHJpbmcoIm5nICIgKyBjbWQuZ2V0UmVmTmFtZSgpIC8vJE5PTi1OTFMtMSQKIAkJCQkJCQkrICIgbi9hICh1bnBhY2tlciBlcnJvcikiKTsgLy8kTk9OLU5MUy0xJAogCQkJCX0KQEAgLTE4NDgsNyArMTg0OCw3IEBAIHByb3RlY3RlZCB2b2lkIHNlbmRTdGF0dXNSZXBvcnQoZmluYWwgYm9vbGVhbiBmb3JDbGllbnQsCiAKIAkJaWYgKGZvckNsaWVudCkKIAkJCW91dC5zZW5kU3RyaW5nKCJ1bnBhY2sgb2siKTsgLy8kTk9OLU5MUy0xJAotCQlmb3IgKGZpbmFsIFJlY2VpdmVDb21tYW5kIGNtZCA6IGNvbW1hbmRzKSB7CisJCWZvciAoUmVjZWl2ZUNvbW1hbmQgY21kIDogY29tbWFuZHMpIHsKIAkJCWlmIChjbWQuZ2V0UmVzdWx0KCkgPT0gUmVzdWx0Lk9LKSB7CiAJCQkJaWYgKGZvckNsaWVudCkKIAkJCQkJb3V0LnNlbmRTdHJpbmcoIm9rICIgKyBjbWQuZ2V0UmVmTmFtZSgpKTsgLy8kTk9OLU5MUy0xJApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvQnVuZGxlRmV0Y2hDb25uZWN0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CdW5kbGVGZXRjaENvbm5lY3Rpb24uamF2YQppbmRleCAzOWVmYWJmLi40NDlmNTI5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CdW5kbGVGZXRjaENvbm5lY3Rpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CdW5kbGVGZXRjaENvbm5lY3Rpb24uamF2YQpAQCAtNDcsOCArNDcsNiBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0OwogCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZkRhdGFiYXNlLkFMTDsKLQogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CkBAIC05OCw3ICs5Niw3IEBAIGNsYXNzIEJ1bmRsZUZldGNoQ29ubmVjdGlvbiBleHRlbmRzIEJhc2VGZXRjaENvbm5lY3Rpb24gewogCiAJcHJpdmF0ZSBQYWNrTG9jayBwYWNrTG9jazsKIAotCUJ1bmRsZUZldGNoQ29ubmVjdGlvbihUcmFuc3BvcnQgdHJhbnNwb3J0QnVuZGxlLCBmaW5hbCBJbnB1dFN0cmVhbSBzcmMpIHRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24geworCUJ1bmRsZUZldGNoQ29ubmVjdGlvbihUcmFuc3BvcnQgdHJhbnNwb3J0QnVuZGxlLCBJbnB1dFN0cmVhbSBzcmMpIHRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24gewogCQl0cmFuc3BvcnQgPSB0cmFuc3BvcnRCdW5kbGU7CiAJCWJpbiA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKHNyYyk7CiAJCXRyeSB7CkBAIC0xNTUsMTIgKzE1MywxMiBAQCBwcml2YXRlIHZvaWQgcmVhZEJ1bmRsZVYyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJYXZhaWxhYmxlKGF2YWlsKTsKIAl9CiAKLQlwcml2YXRlIFBhY2tQcm90b2NvbEV4Y2VwdGlvbiBkdXBsaWNhdGVBZHZlcnRpc2VtZW50KGZpbmFsIFN0cmluZyBuYW1lKSB7CisJcHJpdmF0ZSBQYWNrUHJvdG9jb2xFeGNlcHRpb24gZHVwbGljYXRlQWR2ZXJ0aXNlbWVudChTdHJpbmcgbmFtZSkgewogCQlyZXR1cm4gbmV3IFBhY2tQcm90b2NvbEV4Y2VwdGlvbih0cmFuc3BvcnQudXJpLAogCQkJCU1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpHaXRUZXh0LmdldCgpLmR1cGxpY2F0ZUFkdmVydGlzZW1lbnRzT2YsIG5hbWUpKTsKIAl9CiAKLQlwcml2YXRlIFN0cmluZyByZWFkTGluZShmaW5hbCBieXRlW10gaGRyYnVmKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByaXZhdGUgU3RyaW5nIHJlYWRMaW5lKGJ5dGVbXSBoZHJidWYpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCVN0cmluZ0J1aWxkZXIgbGluZSA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAJCWJvb2xlYW4gZG9uZSA9IGZhbHNlOwogCQl3aGlsZSAoIWRvbmUpIHsKQEAgLTIxMiw3ICsyMTAsNyBAQCBwcm90ZWN0ZWQgdm9pZCBkb0ZldGNoKGZpbmFsIFByb2dyZXNzTW9uaXRvciBtb25pdG9yLAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRQYWNrTG9ja01lc3NhZ2UoZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKKwlwdWJsaWMgdm9pZCBzZXRQYWNrTG9ja01lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKIAkJbG9ja01lc3NhZ2UgPSBtZXNzYWdlOwogCX0KIApAQCAtMjI4LDEzICsyMjYsMTMgQEAgcHJpdmF0ZSB2b2lkIHZlcmlmeVByZXJlcXVpc2l0ZXMoKSB0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKIAkJaWYgKHByZXJlcXMuaXNFbXB0eSgpKQogCQkJcmV0dXJuOwogCi0JCXRyeSAoZmluYWwgUmV2V2FsayBydyA9IG5ldyBSZXZXYWxrKHRyYW5zcG9ydC5sb2NhbCkpIHsKKwkJdHJ5IChSZXZXYWxrIHJ3ID0gbmV3IFJldldhbGsodHJhbnNwb3J0LmxvY2FsKSkgewogCQkJZmluYWwgUmV2RmxhZyBQUkVSRVEgPSBydy5uZXdGbGFnKCJQUkVSRVEiKTsgLy8kTk9OLU5MUy0xJAogCQkJZmluYWwgUmV2RmxhZyBTRUVOID0gcncubmV3RmxhZygiU0VFTiIpOyAvLyROT04tTkxTLTEkCiAKIAkJCWZpbmFsIE1hcDxPYmplY3RJZCwgU3RyaW5nPiBtaXNzaW5nID0gbmV3IEhhc2hNYXA8PigpOwogCQkJZmluYWwgTGlzdDxSZXZPYmplY3Q+IGNvbW1pdHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLQkJCWZvciAoZmluYWwgTWFwLkVudHJ5PE9iamVjdElkLCBTdHJpbmc+IGUgOiBwcmVyZXFzLmVudHJ5U2V0KCkpIHsKKwkJCWZvciAoTWFwLkVudHJ5PE9iamVjdElkLCBTdHJpbmc+IGUgOiBwcmVyZXFzLmVudHJ5U2V0KCkpIHsKIAkJCQlPYmplY3RJZCBwID0gZS5nZXRLZXkoKTsKIAkJCQl0cnkgewogCQkJCQlmaW5hbCBSZXZDb21taXQgYyA9IHJ3LnBhcnNlQ29tbWl0KHApOwpAQCAtMjU0LDEzICsyNTIsMTMgQEAgcHJpdmF0ZSB2b2lkIHZlcmlmeVByZXJlcXVpc2l0ZXMoKSB0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKIAkJCQl0aHJvdyBuZXcgTWlzc2luZ0J1bmRsZVByZXJlcXVpc2l0ZUV4Y2VwdGlvbih0cmFuc3BvcnQudXJpLAogCQkJCQkJbWlzc2luZyk7CiAKLQkJCU1hcDxTdHJpbmcsIFJlZj4gbG9jYWxSZWZzOworCQkJTGlzdDxSZWY+IGxvY2FsUmVmczsKIAkJCXRyeSB7Ci0JCQkJbG9jYWxSZWZzID0gdHJhbnNwb3J0LmxvY2FsLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcyhBTEwpOworCQkJCWxvY2FsUmVmcyA9IHRyYW5zcG9ydC5sb2NhbC5nZXRSZWZEYXRhYmFzZSgpLmdldFJlZnMoKTsKIAkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKIAkJCQl0aHJvdyBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKHRyYW5zcG9ydC51cmksIGUuZ2V0TWVzc2FnZSgpLCBlKTsKIAkJCX0KLQkJCWZvciAoZmluYWwgUmVmIHIgOiBsb2NhbFJlZnMudmFsdWVzKCkpIHsKKwkJCWZvciAoUmVmIHIgOiBsb2NhbFJlZnMpIHsKIAkJCQl0cnkgewogCQkJCQlydy5tYXJrU3RhcnQocncucGFyc2VDb21taXQoci5nZXRPYmplY3RJZCgpKSk7CiAJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gcmVhZEVycm9yKSB7CkBAIC0yODQsNyArMjgyLDcgQEAgcHJpdmF0ZSB2b2lkIHZlcmlmeVByZXJlcXVpc2l0ZXMoKSB0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKIAkJCX0KIAogCQkJaWYgKHJlbWFpbmluZyA+IDApIHsKLQkJCQlmb3IgKGZpbmFsIFJldk9iamVjdCBvIDogY29tbWl0cykgeworCQkJCWZvciAoUmV2T2JqZWN0IG8gOiBjb21taXRzKSB7CiAJCQkJCWlmICghby5oYXMoU0VFTikpCiAJCQkJCQltaXNzaW5nLnB1dChvLCBwcmVyZXFzLmdldChvKSk7CiAJCQkJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvQnVuZGxlV3JpdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CdW5kbGVXcml0ZXIuamF2YQppbmRleCAzNWFjNzc5Li5mMmEyNjFiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CdW5kbGVXcml0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CdW5kbGVXcml0ZXIuamF2YQpAQCAtMTUxLDcgKzE1MSw3IEBAIHB1YmxpYyB2b2lkIHNldFBhY2tDb25maWcoUGFja0NvbmZpZyBwYykgewogCSAqIEBwYXJhbSBpZAogCSAqICAgICAgICAgICAgb2JqZWN0IHRvIHBhY2suIE11bHRpcGxlIHJlZnMgbWF5IHBvaW50IHRvIHRoZSBzYW1lIG9iamVjdC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBpbmNsdWRlKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBBbnlPYmplY3RJZCBpZCkgeworCXB1YmxpYyB2b2lkIGluY2x1ZGUoU3RyaW5nIG5hbWUsIEFueU9iamVjdElkIGlkKSB7CiAJCWJvb2xlYW4gdmFsaWRSZWZOYW1lID0gUmVwb3NpdG9yeS5pc1ZhbGlkUmVmTmFtZShuYW1lKSB8fCBDb25zdGFudHMuSEVBRC5lcXVhbHMobmFtZSk7CiAJCWlmICghdmFsaWRSZWZOYW1lKQogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdChKR2l0VGV4dC5nZXQoKS5pbnZhbGlkUmVmTmFtZSwgbmFtZSkpOwpAQCAtMTY5LDcgKzE2OSw3IEBAIHB1YmxpYyB2b2lkIGluY2x1ZGUoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIEFueU9iamVjdElkIGlkKSB7CiAJICogQHBhcmFtIHIKIAkgKiAgICAgICAgICAgIHRoZSByZWYgdG8gaW5jbHVkZS4KIAkgKi8KLQlwdWJsaWMgdm9pZCBpbmNsdWRlKGZpbmFsIFJlZiByKSB7CisJcHVibGljIHZvaWQgaW5jbHVkZShSZWYgcikgewogCQlpbmNsdWRlKHIuZ2V0TmFtZSgpLCByLmdldE9iamVjdElkKCkpOwogCiAJCWlmIChyLmdldFBlZWxlZE9iamVjdElkKCkgIT0gbnVsbCkKQEAgLTE5Miw3ICsxOTIsNyBAQCBlbHNlIGlmIChyLmdldE9iamVjdElkKCkgIT0gbnVsbAogCSAqICAgICAgICAgICAgcGFyc2VkIGFuZCBub3QgZGlzcG9zZWQgaW4gb3JkZXIgdG8gbWF4aW1pemUgdGhlIGFtb3VudCBvZgogCSAqICAgICAgICAgICAgZGVidWdnaW5nIGluZm9ybWF0aW9uIGF2YWlsYWJsZSBpbiB0aGUgYnVuZGxlIHN0cmVhbS4KIAkgKi8KLQlwdWJsaWMgdm9pZCBhc3N1bWUoZmluYWwgUmV2Q29tbWl0IGMpIHsKKwlwdWJsaWMgdm9pZCBhc3N1bWUoUmV2Q29tbWl0IGMpIHsKIAkJaWYgKGMgIT0gbnVsbCkKIAkJCWFzc3VtZS5hZGQoYyk7CiAJfQpAQCAtMjIxLDcgKzIyMSw3IEBAIHB1YmxpYyB2b2lkIHdyaXRlQnVuZGxlKFByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBPdXRwdXRTdHJlYW0gb3MpCiAJCQlmaW5hbCBIYXNoU2V0PE9iamVjdElkPiBpbmMgPSBuZXcgSGFzaFNldDw+KCk7CiAJCQlmaW5hbCBIYXNoU2V0PE9iamVjdElkPiBleGMgPSBuZXcgSGFzaFNldDw+KCk7CiAJCQlpbmMuYWRkQWxsKGluY2x1ZGUudmFsdWVzKCkpOwotCQkJZm9yIChmaW5hbCBSZXZDb21taXQgciA6IGFzc3VtZSkKKwkJCWZvciAoUmV2Q29tbWl0IHIgOiBhc3N1bWUpCiAJCQkJZXhjLmFkZChyLmdldElkKCkpOwogCQkJcGFja1dyaXRlci5zZXRJbmRleERpc2FibGVkKHRydWUpOwogCQkJcGFja1dyaXRlci5zZXREZWx0YUJhc2VBc09mZnNldCh0cnVlKTsKQEAgLTIzNiw3ICsyMzYsNyBAQCBwdWJsaWMgdm9pZCB3cml0ZUJ1bmRsZShQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgT3V0cHV0U3RyZWFtIG9zKQogCQkJdy53cml0ZSgnXG4nKTsKIAogCQkJZmluYWwgY2hhcltdIHRtcCA9IG5ldyBjaGFyW0NvbnN0YW50cy5PQkpFQ1RfSURfU1RSSU5HX0xFTkdUSF07Ci0JCQlmb3IgKGZpbmFsIFJldkNvbW1pdCBhIDogYXNzdW1lKSB7CisJCQlmb3IgKFJldkNvbW1pdCBhIDogYXNzdW1lKSB7CiAJCQkJdy53cml0ZSgnLScpOwogCQkJCWEuY29weVRvKHRtcCwgdyk7CiAJCQkJaWYgKGEuZ2V0UmF3QnVmZmVyKCkgIT0gbnVsbCkgewpAQCAtMjQ1LDcgKzI0NSw3IEBAIHB1YmxpYyB2b2lkIHdyaXRlQnVuZGxlKFByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBPdXRwdXRTdHJlYW0gb3MpCiAJCQkJfQogCQkJCXcud3JpdGUoJ1xuJyk7CiAJCQl9Ci0JCQlmb3IgKGZpbmFsIE1hcC5FbnRyeTxTdHJpbmcsIE9iamVjdElkPiBlIDogaW5jbHVkZS5lbnRyeVNldCgpKSB7CisJCQlmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIE9iamVjdElkPiBlIDogaW5jbHVkZS5lbnRyeVNldCgpKSB7CiAJCQkJZS5nZXRWYWx1ZSgpLmNvcHlUbyh0bXAsIHcpOwogCQkJCXcud3JpdGUoJyAnKTsKIAkJCQl3LndyaXRlKGUuZ2V0S2V5KCkpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvQ29ubmVjdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvQ29ubmVjdGlvbi5qYXZhCmluZGV4IGJjYzUxMTAuLmQ0YzUxNGUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0Nvbm5lY3Rpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9Db25uZWN0aW9uLmphdmEKQEAgLTk1LDcgKzk1LDcgQEAgcHVibGljIGludGVyZmFjZSBDb25uZWN0aW9uIGV4dGVuZHMgQXV0b0Nsb3NlYWJsZSB7CiAJICogICAgICAgICAgICBuYW1lIG9mIHRoZSByZWYgdG8gb2J0YWluLgogCSAqIEByZXR1cm4gdGhlIHJlcXVlc3RlZCByZWY7IG51bGwgaWYgdGhlIHJlbW90ZSBkaWQgbm90IGFkdmVydGlzZSB0aGlzIHJlZi4KIAkgKi8KLQlwdWJsaWMgUmVmIGdldFJlZihmaW5hbCBTdHJpbmcgbmFtZSk7CisJcHVibGljIFJlZiBnZXRSZWYoU3RyaW5nIG5hbWUpOwogCiAJLyoqCiAJICoge0Bpbmhlcml0RG9jfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvRGFlbW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9EYWVtb24uamF2YQppbmRleCAyZmM1ZWIyLi43Mjg5Y2U3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9EYWVtb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9EYWVtb24uamF2YQpAQCAtNTMsNyArNTMsOSBAQAogaW1wb3J0IGphdmEubmV0LlNvY2tldEFkZHJlc3M7CiBpbXBvcnQgamF2YS5uZXQuU29ja2V0RXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNCb29sZWFuOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hbm5vdGF0aW9ucy5OdWxsYWJsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5SZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5KR2l0VGV4dDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5QZXJzb25JZGVudDsKQEAgLTEwNyw3ICsxMDksNyBAQCBwdWJsaWMgRGFlbW9uKCkgewogCSAqICAgICAgICAgICAgcG9ydCB3aWxsIGJlIGNob3NlbiBvbiBhbGwgbmV0d29yayBpbnRlcmZhY2VzLgogCSAqLwogCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBEYWVtb24oZmluYWwgSW5ldFNvY2tldEFkZHJlc3MgYWRkcikgeworCXB1YmxpYyBEYWVtb24oSW5ldFNvY2tldEFkZHJlc3MgYWRkcikgewogCQlteUFkZHJlc3MgPSBhZGRyOwogCQlwcm9jZXNzb3JzID0gbmV3IFRocmVhZEdyb3VwKCJHaXQtRGFlbW9uIik7IC8vJE5PTi1OTFMtMSQKIApAQCAtMTUzLDEyICsxNTUsMTcgQEAgcHVibGljIFJlY2VpdmVQYWNrIGNyZWF0ZShEYWVtb25DbGllbnQgcmVxLCBSZXBvc2l0b3J5IGRiKQogCiAJCQkJCUBPdmVycmlkZQogCQkJCQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKGZpbmFsIERhZW1vbkNsaWVudCBkYywKLQkJCQkJCQlmaW5hbCBSZXBvc2l0b3J5IGRiKSB0aHJvd3MgSU9FeGNlcHRpb24sCisJCQkJCQkJZmluYWwgUmVwb3NpdG9yeSBkYiwKKwkJCQkJCQlATnVsbGFibGUgQ29sbGVjdGlvbjxTdHJpbmc+IGV4dHJhUGFyYW1ldGVycykKKwkJCQkJCQl0aHJvd3MgSU9FeGNlcHRpb24sCiAJCQkJCQkJU2VydmljZU5vdEVuYWJsZWRFeGNlcHRpb24sCiAJCQkJCQkJU2VydmljZU5vdEF1dGhvcml6ZWRFeGNlcHRpb24gewogCQkJCQkJVXBsb2FkUGFjayB1cCA9IHVwbG9hZFBhY2tGYWN0b3J5LmNyZWF0ZShkYywgZGIpOwogCQkJCQkJSW5wdXRTdHJlYW0gaW4gPSBkYy5nZXRJbnB1dFN0cmVhbSgpOwogCQkJCQkJT3V0cHV0U3RyZWFtIG91dCA9IGRjLmdldE91dHB1dFN0cmVhbSgpOworCQkJCQkJaWYgKGV4dHJhUGFyYW1ldGVycyAhPSBudWxsKSB7CisJCQkJCQkJdXAuc2V0RXh0cmFQYXJhbWV0ZXJzKGV4dHJhUGFyYW1ldGVycyk7CisJCQkJCQl9CiAJCQkJCQl1cC51cGxvYWQoaW4sIG91dCwgbnVsbCk7CiAJCQkJCX0KIAkJCQl9LCBuZXcgRGFlbW9uU2VydmljZSgicmVjZWl2ZS1wYWNrIiwgInJlY2VpdmVwYWNrIikgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKQEAgLTE2OCw3ICsxNzUsOSBAQCBwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKGZpbmFsIERhZW1vbkNsaWVudCBkYywKIAogCQkJCQlAT3ZlcnJpZGUKIAkJCQkJcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZShmaW5hbCBEYWVtb25DbGllbnQgZGMsCi0JCQkJCQkJZmluYWwgUmVwb3NpdG9yeSBkYikgdGhyb3dzIElPRXhjZXB0aW9uLAorCQkJCQkJCWZpbmFsIFJlcG9zaXRvcnkgZGIsCisJCQkJCQkJQE51bGxhYmxlIENvbGxlY3Rpb248U3RyaW5nPiBleHRyYVBhcmFtZXRlcnMpCisJCQkJCQkJdGhyb3dzIElPRXhjZXB0aW9uLAogCQkJCQkJCVNlcnZpY2VOb3RFbmFibGVkRXhjZXB0aW9uLAogCQkJCQkJCVNlcnZpY2VOb3RBdXRob3JpemVkRXhjZXB0aW9uIHsKIAkJCQkJCVJlY2VpdmVQYWNrIHJwID0gcmVjZWl2ZVBhY2tGYWN0b3J5LmNyZWF0ZShkYywgZGIpOwpAQCAtMjAwLDcgKzIwOSw3IEBAIHB1YmxpYyBzeW5jaHJvbml6ZWQgSW5ldFNvY2tldEFkZHJlc3MgZ2V0QWRkcmVzcygpIHsKIAlwdWJsaWMgc3luY2hyb25pemVkIERhZW1vblNlcnZpY2UgZ2V0U2VydmljZShTdHJpbmcgbmFtZSkgewogCQlpZiAoIW5hbWUuc3RhcnRzV2l0aCgiZ2l0LSIpKSAvLyROT04tTkxTLTEkCiAJCQluYW1lID0gImdpdC0iICsgbmFtZTsgLy8kTk9OLU5MUy0xJAotCQlmb3IgKGZpbmFsIERhZW1vblNlcnZpY2UgcyA6IHNlcnZpY2VzKSB7CisJCWZvciAoRGFlbW9uU2VydmljZSBzIDogc2VydmljZXMpIHsKIAkJCWlmIChzLmdldENvbW1hbmROYW1lKCkuZXF1YWxzKG5hbWUpKQogCQkJCXJldHVybiBzOwogCQl9CkBAIC0yMjQsNyArMjMzLDcgQEAgcHVibGljIGludCBnZXRUaW1lb3V0KCkgewogCSAqICAgICAgICAgICAgYmVmb3JlIGFib3J0aW5nIGFuIElPIHJlYWQgb3Igd3JpdGUgb3BlcmF0aW9uIHdpdGggdGhlCiAJICogICAgICAgICAgICBjb25uZWN0ZWQgY2xpZW50LgogCSAqLwotCXB1YmxpYyB2b2lkIHNldFRpbWVvdXQoZmluYWwgaW50IHNlY29uZHMpIHsKKwlwdWJsaWMgdm9pZCBzZXRUaW1lb3V0KGludCBzZWNvbmRzKSB7CiAJCXRpbWVvdXQgPSBzZWNvbmRzOwogCX0KIApAQCAtNDExLDcgKzQyMCw3IEBAIHB1YmxpYyB2b2lkIHN0b3BBbmRXYWl0KCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKIAkJfQogCX0KIAotCXZvaWQgc3RhcnRDbGllbnQoZmluYWwgU29ja2V0IHMpIHsKKwl2b2lkIHN0YXJ0Q2xpZW50KFNvY2tldCBzKSB7CiAJCWZpbmFsIERhZW1vbkNsaWVudCBkYyA9IG5ldyBEYWVtb25DbGllbnQodGhpcyk7CiAKIAkJZmluYWwgU29ja2V0QWRkcmVzcyBwZWVyID0gcy5nZXRSZW1vdGVTb2NrZXRBZGRyZXNzKCk7CkBAIC00NDUsOCArNDU0LDggQEAgcHVibGljIHZvaWQgcnVuKCkgewogCQl9LnN0YXJ0KCk7CiAJfQogCi0Jc3luY2hyb25pemVkIERhZW1vblNlcnZpY2UgbWF0Y2hTZXJ2aWNlKGZpbmFsIFN0cmluZyBjbWQpIHsKLQkJZm9yIChmaW5hbCBEYWVtb25TZXJ2aWNlIGQgOiBzZXJ2aWNlcykgeworCXN5bmNocm9uaXplZCBEYWVtb25TZXJ2aWNlIG1hdGNoU2VydmljZShTdHJpbmcgY21kKSB7CisJCWZvciAoRGFlbW9uU2VydmljZSBkIDogc2VydmljZXMpIHsKIAkJCWlmIChkLmhhbmRsZXMoY21kKSkKIAkJCQlyZXR1cm4gZDsKIAkJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvRGFlbW9uQ2xpZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9EYWVtb25DbGllbnQuamF2YQppbmRleCBhOTczMWFjLi41MWM0OTE4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9EYWVtb25DbGllbnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9EYWVtb25DbGllbnQuamF2YQpAQCAtNTAsNiArNTAsOCBAQAogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOwogaW1wb3J0IGphdmEubmV0LlNvY2tldDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQucmVzb2x2ZXIuU2VydmljZU5vdEF1dGhvcml6ZWRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQucmVzb2x2ZXIuU2VydmljZU5vdEVuYWJsZWRFeGNlcHRpb247CkBAIC02NiwxMSArNjgsMTEgQEAgcHVibGljIGNsYXNzIERhZW1vbkNsaWVudCB7CiAKIAlwcml2YXRlIE91dHB1dFN0cmVhbSByYXdPdXQ7CiAKLQlEYWVtb25DbGllbnQoZmluYWwgRGFlbW9uIGQpIHsKKwlEYWVtb25DbGllbnQoRGFlbW9uIGQpIHsKIAkJZGFlbW9uID0gZDsKIAl9CiAKLQl2b2lkIHNldFJlbW90ZUFkZHJlc3MoZmluYWwgSW5ldEFkZHJlc3MgaWEpIHsKKwl2b2lkIHNldFJlbW90ZUFkZHJlc3MoSW5ldEFkZHJlc3MgaWEpIHsKIAkJcGVlciA9IGlhOwogCX0KIApAQCAtMTEwLDcgKzExMiw3IEBAIHB1YmxpYyBPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKCkgewogCQlyZXR1cm4gcmF3T3V0OwogCX0KIAotCXZvaWQgZXhlY3V0ZShmaW5hbCBTb2NrZXQgc29jaykgdGhyb3dzIElPRXhjZXB0aW9uLAorCXZvaWQgZXhlY3V0ZShTb2NrZXQgc29jaykgdGhyb3dzIElPRXhjZXB0aW9uLAogCQkJU2VydmljZU5vdEVuYWJsZWRFeGNlcHRpb24sIFNlcnZpY2VOb3RBdXRob3JpemVkRXhjZXB0aW9uIHsKIAkJcmF3SW4gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShzb2NrLmdldElucHV0U3RyZWFtKCkpOwogCQlyYXdPdXQgPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oc29jay5nZXRPdXRwdXRTdHJlYW0oKSk7CkBAIC0xMTgsNiArMTIwLDE0IEBAIHZvaWQgZXhlY3V0ZShmaW5hbCBTb2NrZXQgc29jaykgdGhyb3dzIElPRXhjZXB0aW9uLAogCQlpZiAoMCA8IGRhZW1vbi5nZXRUaW1lb3V0KCkpCiAJCQlzb2NrLnNldFNvVGltZW91dChkYWVtb24uZ2V0VGltZW91dCgpICogMTAwMCk7CiAJCVN0cmluZyBjbWQgPSBuZXcgUGFja2V0TGluZUluKHJhd0luKS5yZWFkU3RyaW5nUmF3KCk7CisKKwkJQ29sbGVjdGlvbjxTdHJpbmc+IGV4dHJhUGFyYW1ldGVycyA9IG51bGw7CisKKwkJaW50IG51bG51bCA9IGNtZC5pbmRleE9mKCJcMFwwIik7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKG51bG51bCAhPSAtMSkgeworCQkJZXh0cmFQYXJhbWV0ZXJzID0gQXJyYXlzLmFzTGlzdChjbWQuc3Vic3RyaW5nKG51bG51bCArIDIpLnNwbGl0KCJcMCIpKTsgLy8kTk9OLU5MUy0xJAorCQl9CisKIAkJZmluYWwgaW50IG51bCA9IGNtZC5pbmRleE9mKCdcMCcpOwogCQlpZiAobnVsID49IDApIHsKIAkJCS8vIE5ld2VyIGNsaWVudHMgaGlkZSBhICJob3N0IiBoZWFkZXIgYmVoaW5kIHRoaXMgYnl0ZS4KQEAgLTEzMSw2ICsxNDEsNiBAQCB2b2lkIGV4ZWN1dGUoZmluYWwgU29ja2V0IHNvY2spIHRocm93cyBJT0V4Y2VwdGlvbiwKIAkJaWYgKHNydiA9PSBudWxsKQogCQkJcmV0dXJuOwogCQlzb2NrLnNldFNvVGltZW91dCgwKTsKLQkJc3J2LmV4ZWN1dGUodGhpcywgY21kKTsKKwkJc3J2LmV4ZWN1dGUodGhpcywgY21kLCBleHRyYVBhcmFtZXRlcnMpOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0RhZW1vblNlcnZpY2UuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0RhZW1vblNlcnZpY2UuamF2YQppbmRleCA3MTJlYjIyLi42ZDJiZWU4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9EYWVtb25TZXJ2aWNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvRGFlbW9uU2VydmljZS5qYXZhCkBAIC00NSw3ICs0NSw5IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0OwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYW5ub3RhdGlvbnMuTnVsbGFibGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZy5TZWN0aW9uUGFyc2VyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnk7CkBAIC02NSw3ICs2Nyw3IEBAIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEYWVtb25TZXJ2aWNlIHsKIAogCXByaXZhdGUgYm9vbGVhbiBvdmVycmlkYWJsZTsKIAotCURhZW1vblNlcnZpY2UoZmluYWwgU3RyaW5nIGNtZE5hbWUsIGZpbmFsIFN0cmluZyBjZmdOYW1lKSB7CisJRGFlbW9uU2VydmljZShTdHJpbmcgY21kTmFtZSwgU3RyaW5nIGNmZ05hbWUpIHsKIAkJY29tbWFuZCA9IGNtZE5hbWUuc3RhcnRzV2l0aCgiZ2l0LSIpID8gY21kTmFtZSA6ICJnaXQtIiArIGNtZE5hbWU7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQljb25maWdLZXkgPSBjZmcgLT4gbmV3IFNlcnZpY2VDb25maWcoRGFlbW9uU2VydmljZS50aGlzLCBjZmcsIGNmZ05hbWUpOwogCQlvdmVycmlkYWJsZSA9IHRydWU7CkBAIC05Niw3ICs5OCw3IEBAIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKIAkgKiAgICAgICAgICAgIHtAY29kZSB0cnVlfSB0byBhbGxvdyB0aGlzIHNlcnZpY2UgdG8gYmUgdXNlZDsge0Bjb2RlIGZhbHNlfQogCSAqICAgICAgICAgICAgdG8gZGVueSBpdC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGZpbmFsIGJvb2xlYW4gb24pIHsKKwlwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gb24pIHsKIAkJZW5hYmxlZCA9IG9uOwogCX0KIApAQCAtMTIwLDcgKzEyMiw3IEBAIHB1YmxpYyBib29sZWFuIGlzT3ZlcnJpZGFibGUoKSB7CiAJICogICAgICAgICAgICBlbmFibGVkIHN0YXRlIHdpdGggdGhlIDxjb2RlPmRhZW1vbi5zZXJ2aWNlbmFtZTwvY29kZT4gY29uZmlnCiAJICogICAgICAgICAgICBzZXR0aW5nLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldE92ZXJyaWRhYmxlKGZpbmFsIGJvb2xlYW4gb24pIHsKKwlwdWJsaWMgdm9pZCBzZXRPdmVycmlkYWJsZShib29sZWFuIG9uKSB7CiAJCW92ZXJyaWRhYmxlID0gb247CiAJfQogCkBAIC0xNDAsMTkgKzE0MiwyMCBAQCBwdWJsaWMgU3RyaW5nIGdldENvbW1hbmROYW1lKCkgewogCSAqICAgICAgICAgICAgaW5wdXQgbGluZSBmcm9tIHRoZSBjbGllbnQuCiAJICogQHJldHVybiB0cnVlIGlmIHRoaXMgY29tbWFuZCBjYW4gYWNjZXB0IHRoZSBnaXZlbiBjb21tYW5kIGxpbmUuCiAJICovCi0JcHVibGljIGJvb2xlYW4gaGFuZGxlcyhmaW5hbCBTdHJpbmcgY29tbWFuZExpbmUpIHsKKwlwdWJsaWMgYm9vbGVhbiBoYW5kbGVzKFN0cmluZyBjb21tYW5kTGluZSkgewogCQlyZXR1cm4gY29tbWFuZC5sZW5ndGgoKSArIDEgPCBjb21tYW5kTGluZS5sZW5ndGgoKQogCQkJCSYmIGNvbW1hbmRMaW5lLmNoYXJBdChjb21tYW5kLmxlbmd0aCgpKSA9PSAnICcKIAkJCQkmJiBjb21tYW5kTGluZS5zdGFydHNXaXRoKGNvbW1hbmQpOwogCX0KIAotCXZvaWQgZXhlY3V0ZShmaW5hbCBEYWVtb25DbGllbnQgY2xpZW50LCBmaW5hbCBTdHJpbmcgY29tbWFuZExpbmUpCisJdm9pZCBleGVjdXRlKERhZW1vbkNsaWVudCBjbGllbnQsIFN0cmluZyBjb21tYW5kTGluZSwKKwkJCUBOdWxsYWJsZSBDb2xsZWN0aW9uPFN0cmluZz4gZXh0cmFQYXJhbWV0ZXJzKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2aWNlTm90RW5hYmxlZEV4Y2VwdGlvbiwKIAkJCVNlcnZpY2VOb3RBdXRob3JpemVkRXhjZXB0aW9uIHsKIAkJZmluYWwgU3RyaW5nIG5hbWUgPSBjb21tYW5kTGluZS5zdWJzdHJpbmcoY29tbWFuZC5sZW5ndGgoKSArIDEpOwogCQl0cnkgKFJlcG9zaXRvcnkgZGIgPSBjbGllbnQuZ2V0RGFlbW9uKCkub3BlblJlcG9zaXRvcnkoY2xpZW50LCBuYW1lKSkgewogCQkJaWYgKGlzRW5hYmxlZEZvcihkYikpIHsKLQkJCQlleGVjdXRlKGNsaWVudCwgZGIpOworCQkJCWV4ZWN1dGUoY2xpZW50LCBkYiwgZXh0cmFQYXJhbWV0ZXJzKTsKIAkJCX0KIAkJfSBjYXRjaCAoU2VydmljZU1heU5vdENvbnRpbnVlRXhjZXB0aW9uIGUpIHsKIAkJCS8vIEFuIGVycm9yIHdoZW4gb3BlbmluZyB0aGUgcmVwbyBtZWFucyB0aGUgY2xpZW50IGlzIGV4cGVjdGluZyBhIHJlZgpAQCAtMTYyLDEzICsxNjUsMTQgQEAgdm9pZCBleGVjdXRlKGZpbmFsIERhZW1vbkNsaWVudCBjbGllbnQsIGZpbmFsIFN0cmluZyBjb21tYW5kTGluZSkKIAkJfQogCX0KIAotCXByaXZhdGUgYm9vbGVhbiBpc0VuYWJsZWRGb3IoZmluYWwgUmVwb3NpdG9yeSBkYikgeworCXByaXZhdGUgYm9vbGVhbiBpc0VuYWJsZWRGb3IoUmVwb3NpdG9yeSBkYikgewogCQlpZiAoaXNPdmVycmlkYWJsZSgpKQogCQkJcmV0dXJuIGRiLmdldENvbmZpZygpLmdldChjb25maWdLZXkpLmVuYWJsZWQ7CiAJCXJldHVybiBpc0VuYWJsZWQoKTsKIAl9CiAKLQlhYnN0cmFjdCB2b2lkIGV4ZWN1dGUoRGFlbW9uQ2xpZW50IGNsaWVudCwgUmVwb3NpdG9yeSBkYikKKwlhYnN0cmFjdCB2b2lkIGV4ZWN1dGUoRGFlbW9uQ2xpZW50IGNsaWVudCwgUmVwb3NpdG9yeSBkYiwKKwkJCUBOdWxsYWJsZSBDb2xsZWN0aW9uPFN0cmluZz4gZXh0cmFQYXJhbWV0ZXJzKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2aWNlTm90RW5hYmxlZEV4Y2VwdGlvbiwKIAkJCVNlcnZpY2VOb3RBdXRob3JpemVkRXhjZXB0aW9uOwogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvRGVmYXVsdFNzaFNlc3Npb25GYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9EZWZhdWx0U3NoU2Vzc2lvbkZhY3RvcnkuamF2YQppbmRleCBhNzQ5ZmJjLi41Zjc0ZTcyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9EZWZhdWx0U3NoU2Vzc2lvbkZhY3RvcnkuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9EZWZhdWx0U3NoU2Vzc2lvbkZhY3RvcnkuamF2YQpAQCAtNjEsNyArNjEsNyBAQAogY2xhc3MgRGVmYXVsdFNzaFNlc3Npb25GYWN0b3J5IGV4dGVuZHMgSnNjaENvbmZpZ1Nlc3Npb25GYWN0b3J5IHsKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZShmaW5hbCBPcGVuU3NoQ29uZmlnLkhvc3QgaGMsIGZpbmFsIFNlc3Npb24gc2Vzc2lvbikgeworCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZShPcGVuU3NoQ29uZmlnLkhvc3QgaGMsIFNlc3Npb24gc2Vzc2lvbikgewogCQkvLyBObyBhZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb24gcmVxdWlyZWQuCiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvRmV0Y2hIZWFkUmVjb3JkLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9GZXRjaEhlYWRSZWNvcmQuamF2YQppbmRleCA0MjFlZjIxLi4zNGFiMzYxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9GZXRjaEhlYWRSZWNvcmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9GZXRjaEhlYWRSZWNvcmQuamF2YQpAQCAtNjMsNyArNjMsNyBAQCBjbGFzcyBGZXRjaEhlYWRSZWNvcmQgewogCiAJVVJJaXNoIHNvdXJjZVVSSTsKIAotCXZvaWQgd3JpdGUoZmluYWwgV3JpdGVyIHB3KSB0aHJvd3MgSU9FeGNlcHRpb24geworCXZvaWQgd3JpdGUoV3JpdGVyIHB3KSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBTdHJpbmcgdHlwZTsKIAkJZmluYWwgU3RyaW5nIG5hbWU7CiAJCWlmIChzb3VyY2VOYW1lLnN0YXJ0c1dpdGgoUl9IRUFEUykpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0ZldGNoUHJvY2Vzcy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvRmV0Y2hQcm9jZXNzLmphdmEKaW5kZXggMTE3ZTg0NC4uYzQzYWIxOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvRmV0Y2hQcm9jZXNzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvRmV0Y2hQcm9jZXNzLmphdmEKQEAgLTEwNiwxMiArMTA2LDEyIEBAIGNsYXNzIEZldGNoUHJvY2VzcyB7CiAKIAlwcml2YXRlIE1hcDxTdHJpbmcsIFJlZj4gbG9jYWxSZWZzOwogCi0JRmV0Y2hQcm9jZXNzKGZpbmFsIFRyYW5zcG9ydCB0LCBmaW5hbCBDb2xsZWN0aW9uPFJlZlNwZWM+IGYpIHsKKwlGZXRjaFByb2Nlc3MoVHJhbnNwb3J0IHQsIENvbGxlY3Rpb248UmVmU3BlYz4gZikgewogCQl0cmFuc3BvcnQgPSB0OwogCQl0b0ZldGNoID0gZjsKIAl9CiAKLQl2b2lkIGV4ZWN1dGUoZmluYWwgUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIGZpbmFsIEZldGNoUmVzdWx0IHJlc3VsdCkKKwl2b2lkIGV4ZWN1dGUoUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIEZldGNoUmVzdWx0IHJlc3VsdCkKIAkJCXRocm93cyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24sIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAJCWFza0Zvci5jbGVhcigpOwogCQlsb2NhbFVwZGF0ZXMuY2xlYXIoKTsKQEAgLTEyMyw3ICsxMjMsNyBAQCB2b2lkIGV4ZWN1dGUoZmluYWwgUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIGZpbmFsIEZldGNoUmVzdWx0IHJlc3VsdCkKIAkJCWV4ZWN1dGVJbXAobW9uaXRvciwgcmVzdWx0KTsKIAkJfSBmaW5hbGx5IHsKIAkJCXRyeSB7Ci0JCQlmb3IgKGZpbmFsIFBhY2tMb2NrIGxvY2sgOiBwYWNrTG9ja3MpCisJCQlmb3IgKFBhY2tMb2NrIGxvY2sgOiBwYWNrTG9ja3MpCiAJCQkJbG9jay51bmxvY2soKTsKIAkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKIAkJCQl0aHJvdyBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKQEAgLTEzOSw3ICsxMzksNyBAQCBwcml2YXRlIHZvaWQgZXhlY3V0ZUltcChmaW5hbCBQcm9ncmVzc01vbml0b3IgbW9uaXRvciwKIAkJCXJlc3VsdC5zZXRBZHZlcnRpc2VkUmVmcyh0cmFuc3BvcnQuZ2V0VVJJKCksIGNvbm4uZ2V0UmVmc01hcCgpKTsKIAkJCXJlc3VsdC5wZWVyVXNlckFnZW50ID0gY29ubi5nZXRQZWVyVXNlckFnZW50KCk7CiAJCQlmaW5hbCBTZXQ8UmVmPiBtYXRjaGVkID0gbmV3IEhhc2hTZXQ8PigpOwotCQkJZm9yIChmaW5hbCBSZWZTcGVjIHNwZWMgOiB0b0ZldGNoKSB7CisJCQlmb3IgKFJlZlNwZWMgc3BlYyA6IHRvRmV0Y2gpIHsKIAkJCQlpZiAoc3BlYy5nZXRTb3VyY2UoKSA9PSBudWxsKQogCQkJCQl0aHJvdyBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAogCQkJCQkJCUpHaXRUZXh0LmdldCgpLnNvdXJjZVJlZk5vdFNwZWNpZmllZEZvclJlZnNwZWMsIHNwZWMpKTsKQEAgLTE3Niw3ICsxNzYsNyBAQCBlbHNlIGlmICh0YWdvcHQgPT0gVGFnT3B0LkZFVENIX1RBR1MpCiAJCQkJLy8KIAkJCQloYXZlLmFkZEFsbChhc2tGb3Iua2V5U2V0KCkpOwogCQkJCWFza0Zvci5jbGVhcigpOwotCQkJCWZvciAoZmluYWwgUmVmIHIgOiBhZGRpdGlvbmFsVGFncykgeworCQkJCWZvciAoUmVmIHIgOiBhZGRpdGlvbmFsVGFncykgewogCQkJCQlPYmplY3RJZCBpZCA9IHIuZ2V0UGVlbGVkT2JqZWN0SWQoKTsKIAkJCQkJaWYgKGlkID09IG51bGwpCiAJCQkJCQlpZCA9IHIuZ2V0T2JqZWN0SWQoKTsKQEAgLTE5OCw3ICsxOTgsNyBAQCBlbHNlIGlmICh0YWdvcHQgPT0gVGFnT3B0LkZFVENIX1RBR1MpCiAJCQkJLm5ld0JhdGNoVXBkYXRlKCkKIAkJCQkuc2V0QWxsb3dOb25GYXN0Rm9yd2FyZHModHJ1ZSkKIAkJCQkuc2V0UmVmTG9nTWVzc2FnZSgiZmV0Y2giLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQl0cnkgKGZpbmFsIFJldldhbGsgd2FsayA9IG5ldyBSZXZXYWxrKHRyYW5zcG9ydC5sb2NhbCkpIHsKKwkJdHJ5IChSZXZXYWxrIHdhbGsgPSBuZXcgUmV2V2Fsayh0cmFuc3BvcnQubG9jYWwpKSB7CiAJCQlpZiAobW9uaXRvciBpbnN0YW5jZW9mIEJhdGNoaW5nUHJvZ3Jlc3NNb25pdG9yKSB7CiAJCQkJKChCYXRjaGluZ1Byb2dyZXNzTW9uaXRvcikgbW9uaXRvcikuc2V0RGVsYXlTdGFydCgKIAkJCQkJCTI1MCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKQEAgLTI1Nyw3ICsyNTcsNyBAQCBwcml2YXRlIHZvaWQgYWRkVXBkYXRlQmF0Y2hDb21tYW5kcyhGZXRjaFJlc3VsdCByZXN1bHQsCiAJCX0KIAl9CiAKLQlwcml2YXRlIHZvaWQgZmV0Y2hPYmplY3RzKGZpbmFsIFByb2dyZXNzTW9uaXRvciBtb25pdG9yKQorCXByaXZhdGUgdm9pZCBmZXRjaE9iamVjdHMoUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCiAJCQl0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKIAkJdHJ5IHsKIAkJCWNvbm4uc2V0UGFja0xvY2tNZXNzYWdlKCJqZ2l0IGZldGNoICIgKyB0cmFuc3BvcnQudXJpKTsgLy8kTk9OLU5MUy0xJApAQCAtMjcxLDcgKzI3MSw3IEBAIHByaXZhdGUgdm9pZCBmZXRjaE9iamVjdHMoZmluYWwgUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCiAJCQkJCUpHaXRUZXh0LmdldCgpLnBlZXJEaWROb3RTdXBwbHlBQ29tcGxldGVPYmplY3RHcmFwaCk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGNsb3NlQ29ubmVjdGlvbihmaW5hbCBGZXRjaFJlc3VsdCByZXN1bHQpIHsKKwlwcml2YXRlIHZvaWQgY2xvc2VDb25uZWN0aW9uKEZldGNoUmVzdWx0IHJlc3VsdCkgewogCQlpZiAoY29ubiAhPSBudWxsKSB7CiAJCQljb25uLmNsb3NlKCk7CiAJCQlyZXN1bHQuYWRkTWVzc2FnZXMoY29ubi5nZXRNZXNzYWdlcygpKTsKQEAgLTI5NSwxMiArMjk1LDEyIEBAIHByaXZhdGUgdm9pZCByZW9wZW5Db25uZWN0aW9uKCkgdGhyb3dzIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiwKIAkJLy8gbmV3IGNvbm5lY3Rpb24gaGFzIG9mZmVyZWQgdG8gdXMuCiAJCS8vCiAJCWZpbmFsIEhhc2hNYXA8T2JqZWN0SWQsIFJlZj4gYXZhaWwgPSBuZXcgSGFzaE1hcDw+KCk7Ci0JCWZvciAoZmluYWwgUmVmIHIgOiBjb25uLmdldFJlZnMoKSkKKwkJZm9yIChSZWYgciA6IGNvbm4uZ2V0UmVmcygpKQogCQkJYXZhaWwucHV0KHIuZ2V0T2JqZWN0SWQoKSwgcik7CiAKIAkJZmluYWwgQ29sbGVjdGlvbjxSZWY+IHdhbnRzID0gbmV3IEFycmF5TGlzdDw+KGFza0Zvci52YWx1ZXMoKSk7CiAJCWFza0Zvci5jbGVhcigpOwotCQlmb3IgKGZpbmFsIFJlZiB3YW50IDogd2FudHMpIHsKKwkJZm9yIChSZWYgd2FudCA6IHdhbnRzKSB7CiAJCQlmaW5hbCBSZWYgbmV3UmVmID0gYXZhaWwuZ2V0KHdhbnQuZ2V0T2JqZWN0SWQoKSk7CiAJCQlpZiAobmV3UmVmICE9IG51bGwpIHsKIAkJCQlhc2tGb3IucHV0KG5ld1JlZi5nZXRPYmplY3RJZCgpLCBuZXdSZWYpOwpAQCAtMzExLDcgKzMxMSw3IEBAIHByaXZhdGUgdm9pZCByZW9wZW5Db25uZWN0aW9uKCkgdGhyb3dzIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiwKIAkJfQogCX0KIAotCXByaXZhdGUgdm9pZCByZW1vdmVUcmFja2luZ1JlZlVwZGF0ZShmaW5hbCBPYmplY3RJZCB3YW50KSB7CisJcHJpdmF0ZSB2b2lkIHJlbW92ZVRyYWNraW5nUmVmVXBkYXRlKE9iamVjdElkIHdhbnQpIHsKIAkJZmluYWwgSXRlcmF0b3I8VHJhY2tpbmdSZWZVcGRhdGU+IGkgPSBsb2NhbFVwZGF0ZXMuaXRlcmF0b3IoKTsKIAkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7CiAJCQlmaW5hbCBUcmFja2luZ1JlZlVwZGF0ZSB1ID0gaS5uZXh0KCk7CkBAIC0zMjAsNyArMzIwLDcgQEAgcHJpdmF0ZSB2b2lkIHJlbW92ZVRyYWNraW5nUmVmVXBkYXRlKGZpbmFsIE9iamVjdElkIHdhbnQpIHsKIAkJfQogCX0KIAotCXByaXZhdGUgdm9pZCByZW1vdmVGZXRjaEhlYWRSZWNvcmQoZmluYWwgT2JqZWN0SWQgd2FudCkgeworCXByaXZhdGUgdm9pZCByZW1vdmVGZXRjaEhlYWRSZWNvcmQoT2JqZWN0SWQgd2FudCkgewogCQlmaW5hbCBJdGVyYXRvcjxGZXRjaEhlYWRSZWNvcmQ+IGkgPSBmZXRjaEhlYWRVcGRhdGVzLml0ZXJhdG9yKCk7CiAJCXdoaWxlIChpLmhhc05leHQoKSkgewogCQkJZmluYWwgRmV0Y2hIZWFkUmVjb3JkIGZoID0gaS5uZXh0KCk7CkBAIC0zMjksNyArMzI5LDcgQEAgcHJpdmF0ZSB2b2lkIHJlbW92ZUZldGNoSGVhZFJlY29yZChmaW5hbCBPYmplY3RJZCB3YW50KSB7CiAJCX0KIAl9CiAKLQlwcml2YXRlIHZvaWQgdXBkYXRlRkVUQ0hfSEVBRChmaW5hbCBGZXRjaFJlc3VsdCByZXN1bHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJpdmF0ZSB2b2lkIHVwZGF0ZUZFVENIX0hFQUQoRmV0Y2hSZXN1bHQgcmVzdWx0KSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlGaWxlIG1ldGEgPSB0cmFuc3BvcnQubG9jYWwuZ2V0RGlyZWN0b3J5KCk7CiAJCWlmIChtZXRhID09IG51bGwpCiAJCQlyZXR1cm47CkBAIC0zMzgsNyArMzM4LDcgQEAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUZFVENIX0hFQUQoZmluYWwgRmV0Y2hSZXN1bHQgcmVzdWx0KSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJaWYgKGxvY2subG9jaygpKSB7CiAJCQkJdHJ5IChXcml0ZXIgdyA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoCiAJCQkJCQlsb2NrLmdldE91dHB1dFN0cmVhbSgpKSkgewotCQkJCQlmb3IgKGZpbmFsIEZldGNoSGVhZFJlY29yZCBoIDogZmV0Y2hIZWFkVXBkYXRlcykgeworCQkJCQlmb3IgKEZldGNoSGVhZFJlY29yZCBoIDogZmV0Y2hIZWFkVXBkYXRlcykgewogCQkJCQkJaC53cml0ZSh3KTsKIAkJCQkJCXJlc3VsdC5hZGQoaCk7CiAJCQkJCX0KQEAgLTM1MiwxMCArMzUyLDEwIEBAIHByaXZhdGUgdm9pZCB1cGRhdGVGRVRDSF9IRUFEKGZpbmFsIEZldGNoUmVzdWx0IHJlc3VsdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAogCXByaXZhdGUgYm9vbGVhbiBhc2tGb3JJc0NvbXBsZXRlKCkgdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAJCXRyeSB7Ci0JCQl0cnkgKGZpbmFsIE9iamVjdFdhbGsgb3cgPSBuZXcgT2JqZWN0V2Fsayh0cmFuc3BvcnQubG9jYWwpKSB7Ci0JCQkJZm9yIChmaW5hbCBPYmplY3RJZCB3YW50IDogYXNrRm9yLmtleVNldCgpKQorCQkJdHJ5IChPYmplY3RXYWxrIG93ID0gbmV3IE9iamVjdFdhbGsodHJhbnNwb3J0LmxvY2FsKSkgeworCQkJCWZvciAoT2JqZWN0SWQgd2FudCA6IGFza0Zvci5rZXlTZXQoKSkKIAkJCQkJb3cubWFya1N0YXJ0KG93LnBhcnNlQW55KHdhbnQpKTsKLQkJCQlmb3IgKGZpbmFsIFJlZiByZWYgOiBsb2NhbFJlZnMoKS52YWx1ZXMoKSkKKwkJCQlmb3IgKFJlZiByZWYgOiBsb2NhbFJlZnMoKS52YWx1ZXMoKSkKIAkJCQkJb3cubWFya1VuaW50ZXJlc3Rpbmcob3cucGFyc2VBbnkocmVmLmdldE9iamVjdElkKCkpKTsKIAkJCQlvdy5jaGVja0Nvbm5lY3Rpdml0eSgpOwogCQkJfQpAQCAtMzY3LDE1ICszNjcsMTUgQEAgcHJpdmF0ZSBib29sZWFuIGFza0ZvcklzQ29tcGxldGUoKSB0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKIAkJfQogCX0KIAotCXByaXZhdGUgdm9pZCBleHBhbmRXaWxkY2FyZChmaW5hbCBSZWZTcGVjIHNwZWMsIGZpbmFsIFNldDxSZWY+IG1hdGNoZWQpCisJcHJpdmF0ZSB2b2lkIGV4cGFuZFdpbGRjYXJkKFJlZlNwZWMgc3BlYywgU2V0PFJlZj4gbWF0Y2hlZCkKIAkJCXRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24gewotCQlmb3IgKGZpbmFsIFJlZiBzcmMgOiBjb25uLmdldFJlZnMoKSkgeworCQlmb3IgKFJlZiBzcmMgOiBjb25uLmdldFJlZnMoKSkgewogCQkJaWYgKHNwZWMubWF0Y2hTb3VyY2Uoc3JjKSAmJiBtYXRjaGVkLmFkZChzcmMpKQogCQkJCXdhbnQoc3JjLCBzcGVjLmV4cGFuZEZyb21Tb3VyY2Uoc3JjKSk7CiAJCX0KIAl9CiAKLQlwcml2YXRlIHZvaWQgZXhwYW5kU2luZ2xlKGZpbmFsIFJlZlNwZWMgc3BlYywgZmluYWwgU2V0PFJlZj4gbWF0Y2hlZCkKKwlwcml2YXRlIHZvaWQgZXhwYW5kU2luZ2xlKFJlZlNwZWMgc3BlYywgU2V0PFJlZj4gbWF0Y2hlZCkKIAkJCXRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24gewogCQlTdHJpbmcgd2FudCA9IHNwZWMuZ2V0U291cmNlKCk7CiAJCWlmIChPYmplY3RJZC5pc0lkKHdhbnQpKSB7CkBAIC0zOTUsNyArMzk1LDcgQEAgcHJpdmF0ZSB2b2lkIGV4cGFuZFNpbmdsZShmaW5hbCBSZWZTcGVjIHNwZWMsIGZpbmFsIFNldDxSZWY+IG1hdGNoZWQpCiAJcHJpdmF0ZSBDb2xsZWN0aW9uPFJlZj4gZXhwYW5kQXV0b0ZvbGxvd1RhZ3MoKSB0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKIAkJZmluYWwgQ29sbGVjdGlvbjxSZWY+IGFkZGl0aW9uYWxUYWdzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAJCWZpbmFsIE1hcDxTdHJpbmcsIFJlZj4gaGF2ZVJlZnMgPSBsb2NhbFJlZnMoKTsKLQkJZm9yIChmaW5hbCBSZWYgciA6IGNvbm4uZ2V0UmVmcygpKSB7CisJCWZvciAoUmVmIHIgOiBjb25uLmdldFJlZnMoKSkgewogCQkJaWYgKCFpc1RhZyhyKSkKIAkJCQljb250aW51ZTsKIApAQCAtNDE5LDcgKzQxOSw3IEBAIHByaXZhdGUgQ29sbGVjdGlvbjxSZWY+IGV4cGFuZEF1dG9Gb2xsb3dUYWdzKCkgdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAKIAlwcml2YXRlIHZvaWQgZXhwYW5kRmV0Y2hUYWdzKCkgdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAJCWZpbmFsIE1hcDxTdHJpbmcsIFJlZj4gaGF2ZVJlZnMgPSBsb2NhbFJlZnMoKTsKLQkJZm9yIChmaW5hbCBSZWYgciA6IGNvbm4uZ2V0UmVmcygpKSB7CisJCWZvciAoUmVmIHIgOiBjb25uLmdldFJlZnMoKSkgewogCQkJaWYgKCFpc1RhZyhyKSkgewogCQkJCWNvbnRpbnVlOwogCQkJfQpAQCAtNDM0LDEyICs0MzQsMTIgQEAgcHJpdmF0ZSB2b2lkIGV4cGFuZEZldGNoVGFncygpIHRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24gewogCQl9CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHdhbnRUYWcoZmluYWwgUmVmIHIpIHRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24geworCXByaXZhdGUgdm9pZCB3YW50VGFnKFJlZiByKSB0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKIAkJd2FudChyLCBuZXcgUmVmU3BlYygpLnNldFNvdXJjZShyLmdldE5hbWUoKSkKIAkJCQkuc2V0RGVzdGluYXRpb24oci5nZXROYW1lKCkpLnNldEZvcmNlVXBkYXRlKHRydWUpKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgd2FudChmaW5hbCBSZWYgc3JjLCBmaW5hbCBSZWZTcGVjIHNwZWMpCisJcHJpdmF0ZSB2b2lkIHdhbnQoUmVmIHNyYywgUmVmU3BlYyBzcGVjKQogCQkJdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAJCWZpbmFsIE9iamVjdElkIG5ld0lkID0gc3JjLmdldE9iamVjdElkKCk7CiAJCWlmIChuZXdJZCA9PSBudWxsKSB7CkBAIC00OTcsMTIgKzQ5NywxNSBAQCBwcml2YXRlIE1hcDxTdHJpbmcsIFJlZj4gbG9jYWxSZWZzKCkgdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAKIAlwcml2YXRlIHZvaWQgZGVsZXRlU3RhbGVUcmFja2luZ1JlZnMoRmV0Y2hSZXN1bHQgcmVzdWx0LAogCQkJQmF0Y2hSZWZVcGRhdGUgYmF0Y2gpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZpbmFsIFNldDxSZWY+IHByb2Nlc3NlZCA9IG5ldyBIYXNoU2V0PD4oKTsKLQkJZm9yIChmaW5hbCBSZWYgcmVmIDogbG9jYWxSZWZzKCkudmFsdWVzKCkpIHsKLQkJCWZpbmFsIFN0cmluZyByZWZuYW1lID0gcmVmLmdldE5hbWUoKTsKLQkJCWZvciAoZmluYWwgUmVmU3BlYyBzcGVjIDogdG9GZXRjaCkgeworCQlTZXQ8UmVmPiBwcm9jZXNzZWQgPSBuZXcgSGFzaFNldDw+KCk7CisJCWZvciAoUmVmIHJlZiA6IGxvY2FsUmVmcygpLnZhbHVlcygpKSB7CisJCQlpZiAocmVmLmlzU3ltYm9saWMoKSkgeworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJU3RyaW5nIHJlZm5hbWUgPSByZWYuZ2V0TmFtZSgpOworCQkJZm9yIChSZWZTcGVjIHNwZWMgOiB0b0ZldGNoKSB7CiAJCQkJaWYgKHNwZWMubWF0Y2hEZXN0aW5hdGlvbihyZWZuYW1lKSkgewotCQkJCQlmaW5hbCBSZWZTcGVjIHMgPSBzcGVjLmV4cGFuZEZyb21EZXN0aW5hdGlvbihyZWZuYW1lKTsKKwkJCQkJUmVmU3BlYyBzID0gc3BlYy5leHBhbmRGcm9tRGVzdGluYXRpb24ocmVmbmFtZSk7CiAJCQkJCWlmIChyZXN1bHQuZ2V0QWR2ZXJ0aXNlZFJlZihzLmdldFNvdXJjZSgpKSA9PSBudWxsCiAJCQkJCQkJJiYgcHJvY2Vzc2VkLmFkZChyZWYpKSB7CiAJCQkJCQlkZWxldGVUcmFja2luZ1JlZihyZXN1bHQsIGJhdGNoLCBzLCByZWYpOwpAQCAtNTI2LDExICs1MjksMTEgQEAgcHJpdmF0ZSB2b2lkIGRlbGV0ZVRyYWNraW5nUmVmKGZpbmFsIEZldGNoUmVzdWx0IHJlc3VsdCwKIAkJYmF0Y2guYWRkQ29tbWFuZCh1cGRhdGUuYXNSZWNlaXZlQ29tbWFuZCgpKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVGFnKGZpbmFsIFJlZiByKSB7CisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1RhZyhSZWYgcikgewogCQlyZXR1cm4gaXNUYWcoci5nZXROYW1lKCkpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNUYWcoZmluYWwgU3RyaW5nIG5hbWUpIHsKKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVGFnKFN0cmluZyBuYW1lKSB7CiAJCXJldHVybiBuYW1lLnN0YXJ0c1dpdGgoQ29uc3RhbnRzLlJfVEFHUyk7CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9GZXRjaFJlc3VsdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvRmV0Y2hSZXN1bHQuamF2YQppbmRleCAyNjY3ZWMzLi5hZDRjNWU5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9GZXRjaFJlc3VsdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0ZldGNoUmVzdWx0LmphdmEKQEAgLTY4LDcgKzY4LDcgQEAgcHVibGljIGNsYXNzIEZldGNoUmVzdWx0IGV4dGVuZHMgT3BlcmF0aW9uUmVzdWx0IHsKIAkJc3VibW9kdWxlcyA9IG5ldyBIYXNoTWFwPD4oKTsKIAl9CiAKLQl2b2lkIGFkZChmaW5hbCBGZXRjaEhlYWRSZWNvcmQgcikgeworCXZvaWQgYWRkKEZldGNoSGVhZFJlY29yZCByKSB7CiAJCWlmICghci5ub3RGb3JNZXJnZSkKIAkJCWZvck1lcmdlLmFkZChyKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9HaXRQcm90b2NvbENvbnN0YW50cy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvR2l0UHJvdG9jb2xDb25zdGFudHMuamF2YQppbmRleCAyMDMxMTQ3Li4xMGNkNzc1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9HaXRQcm90b2NvbENvbnN0YW50cy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0dpdFByb3RvY29sQ29uc3RhbnRzLmphdmEKQEAgLTEwOCw2ICsxMDgsMTQgQEAgcHVibGljIGNsYXNzIEdpdFByb3RvY29sQ29uc3RhbnRzIHsKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fU0hBTExPVyA9ICJzaGFsbG93IjsgLy8kTk9OLU5MUy0xJAogCiAJLyoqCisJICogVGhlIGNsaWVudCB3YW50cyB0aGUgImRlZXBlbiIgY29tbWFuZCB0byBiZSBpbnRlcnByZXRlZCBhcyByZWxhdGl2ZSB0bworCSAqIHRoZSBjbGllbnQncyBzaGFsbG93IGNvbW1pdHMuCisJICoKKwkgKiBAc2luY2UgNS4wCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OX0RFRVBFTl9SRUxBVElWRSA9ICJkZWVwZW4tcmVsYXRpdmUiOyAvLyROT04tTkxTLTEkCisKKwkvKioKIAkgKiBUaGUgY2xpZW50IGRvZXMgbm90IHdhbnQgcHJvZ3Jlc3MgbWVzc2FnZXMgYW5kIHdpbGwgaWdub3JlIHRoZW0uCiAJICoKIAkgKiBAc2luY2UgMy4yCkBAIC0xNTIsNiArMTYwLDEzIEBAIHB1YmxpYyBjbGFzcyBHaXRQcm90b2NvbENvbnN0YW50cyB7CiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OX1BVU0hfQ0VSVCA9ICJwdXNoLWNlcnQiOyAvLyROT04tTkxTLTEkCiAKIAkvKioKKwkgKiBUaGUgY2xpZW50IHNwZWNpZmllZCBhIGZpbHRlciBleHByZXNzaW9uLgorCSAqCisJICogQHNpbmNlIDUuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9GSUxURVIgPSAiZmlsdGVyIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCiAJICogVGhlIGNsaWVudCBzdXBwb3J0cyBhdG9taWMgcHVzaGVzLiBJZiB0aGlzIG9wdGlvbiBpcyB1c2VkLCB0aGUgc2VydmVyCiAJICogd2lsbCB1cGRhdGUgYWxsIHJlZnMgd2l0aGluIG9uZSBhdG9taWMgdHJhbnNhY3Rpb24uCiAJICoKQEAgLTIxNSw2ICsyMzAsMjAgQEAgcHVibGljIGNsYXNzIEdpdFByb3RvY29sQ29uc3RhbnRzIHsKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQVBBQklMSVRZX1BVU0hfT1BUSU9OUyA9ICJwdXNoLW9wdGlvbnMiOyAvLyROT04tTkxTLTEkCiAKKwkvKioKKwkgKiBUaGUgc2VydmVyIHN1cHBvcnRzIGxpc3RpbmcgcmVmcyB1c2luZyBwcm90b2NvbCB2Mi4KKwkgKgorCSAqIEBzaW5jZSA1LjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NQU5EX0xTX1JFRlMgPSAibHMtcmVmcyI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFRoZSBzZXJ2ZXIgc3VwcG9ydHMgZmV0Y2ggdXNpbmcgcHJvdG9jb2wgdjIuCisJICoKKwkgKiBAc2luY2UgNS4wCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFORF9GRVRDSCA9ICJmZXRjaCI7IC8vJE5PTi1OTFMtMSQKKwogCXN0YXRpYyBlbnVtIE11bHRpQWNrIHsKIAkJT0ZGLCBDT05USU5VRSwgREVUQUlMRUQ7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvSE1BQ1NIQTFOb25jZUdlbmVyYXRvci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvSE1BQ1NIQTFOb25jZUdlbmVyYXRvci5qYXZhCmluZGV4IDZjMjZiNzAuLjE0MTUzMzQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0hNQUNTSEExTm9uY2VHZW5lcmF0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9ITUFDU0hBMU5vbmNlR2VuZXJhdG9yLmphdmEKQEAgLTQzLDcgKzQzLDcgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7CiAKIGltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLklTT184ODU5XzE7Ci1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5JbnZhbGlkS2V5RXhjZXB0aW9uOwpAQCAtMTAyLDcgKzEwMiw3IEBAIHB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIGNyZWF0ZU5vbmNlKFJlcG9zaXRvcnkgcmVwbywgbG9uZyB0aW1lc3RhbXApCiAJCX0KIAogCQlTdHJpbmcgaW5wdXQgPSBwYXRoICsgIjoiICsgU3RyaW5nLnZhbHVlT2YodGltZXN0YW1wKTsgLy8kTk9OLU5MUy0xJAotCQlieXRlW10gcmF3SG1hYyA9IG1hYy5kb0ZpbmFsKGlucHV0LmdldEJ5dGVzKFVURl84KSk7CisJCWJ5dGVbXSByYXdIbWFjID0gbWFjLmRvRmluYWwoaW5wdXQuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQlyZXR1cm4gTG9uZy50b1N0cmluZyh0aW1lc3RhbXApICsgIi0iICsgdG9IZXgocmF3SG1hYyk7IC8vJE5PTi1OTFMtMSQKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0h0dHBBdXRoTWV0aG9kLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9IdHRwQXV0aE1ldGhvZC5qYXZhCmluZGV4IGM0MGQ5NjMuLmZiMDMxOTAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0h0dHBBdXRoTWV0aG9kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvSHR0cEF1dGhNZXRob2QuamF2YQpAQCAtNDMsNyArNDMsNyBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0OwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5IdHRwU3VwcG9ydC5IRFJfQVVUSE9SSVpBVElPTjsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC51dGlsLkh0dHBTdXBwb3J0LkhEUl9XV1dfQVVUSEVOVElDQVRFOwogCkBAIC01MSw2ICs1MSw3IEBACiBpbXBvcnQgamF2YS5uZXQuVVJMOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdDsKIGltcG9ydCBqYXZhLnNlY3VyaXR5Lk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbTsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CkBAIC01OSw3ICs2MCw2IEBACiBpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHAuSHR0cENvbm5lY3Rpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLkJhc2U2NDsKQEAgLTE2MCwxMCArMTYwLDEwIEBAIHN0YXRpYyBIdHRwQXV0aE1ldGhvZCBzY2FuUmVzcG9uc2UoZmluYWwgSHR0cENvbm5lY3Rpb24gY29ubiwKIAkJZmluYWwgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBoZWFkZXJzID0gY29ubi5nZXRIZWFkZXJGaWVsZHMoKTsKIAkJSHR0cEF1dGhNZXRob2QgYXV0aGVudGljYXRpb24gPSBUeXBlLk5PTkUubWV0aG9kKEVNUFRZX1NUUklORyk7CiAKLQkJZm9yIChmaW5hbCBFbnRyeTxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gZW50cnkgOiBoZWFkZXJzLmVudHJ5U2V0KCkpIHsKKwkJZm9yIChFbnRyeTxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gZW50cnkgOiBoZWFkZXJzLmVudHJ5U2V0KCkpIHsKIAkJCWlmIChIRFJfV1dXX0FVVEhFTlRJQ0FURS5lcXVhbHNJZ25vcmVDYXNlKGVudHJ5LmdldEtleSgpKSkgewogCQkJCWlmIChlbnRyeS5nZXRWYWx1ZSgpICE9IG51bGwpIHsKLQkJCQkJZm9yIChmaW5hbCBTdHJpbmcgdmFsdWUgOiBlbnRyeS5nZXRWYWx1ZSgpKSB7CisJCQkJCWZvciAoU3RyaW5nIHZhbHVlIDogZW50cnkuZ2V0VmFsdWUoKSkgewogCQkJCQkJaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUubGVuZ3RoKCkgIT0gMCkgewogCQkJCQkJCWZpbmFsIFN0cmluZ1tdIHZhbHVlUGFydCA9IHZhbHVlLnNwbGl0KAogCQkJCQkJCQkJU0NIRU1BX05BTUVfU0VQQVJBVE9SLCAyKTsKQEAgLTMwNywxNSArMzA3LDE1IEBAIHB1YmxpYyBCYXNpYygpIHsKIAkJfQogCiAJCUBPdmVycmlkZQotCQl2b2lkIGF1dGhvcml6ZShmaW5hbCBTdHJpbmcgdXNlcm5hbWUsIGZpbmFsIFN0cmluZyBwYXNzd29yZCkgeworCQl2b2lkIGF1dGhvcml6ZShTdHJpbmcgdXNlcm5hbWUsIFN0cmluZyBwYXNzd29yZCkgewogCQkJdGhpcy51c2VyID0gdXNlcm5hbWU7CiAJCQl0aGlzLnBhc3MgPSBwYXNzd29yZDsKIAkJfQogCiAJCUBPdmVycmlkZQotCQl2b2lkIGNvbmZpZ3VyZVJlcXVlc3QoZmluYWwgSHR0cENvbm5lY3Rpb24gY29ubikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJdm9pZCBjb25maWd1cmVSZXF1ZXN0KEh0dHBDb25uZWN0aW9uIGNvbm4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQlTdHJpbmcgaWRlbnQgPSB1c2VyICsgIjoiICsgcGFzczsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGVuYyA9IEJhc2U2NC5lbmNvZGVCeXRlcyhpZGVudC5nZXRCeXRlcyhVVEZfOCkpOworCQkJU3RyaW5nIGVuYyA9IEJhc2U2NC5lbmNvZGVCeXRlcyhpZGVudC5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCQljb25uLnNldFJlcXVlc3RQcm9wZXJ0eShIRFJfQVVUSE9SSVpBVElPTiwgdHlwZS5nZXRTY2hlbWVOYW1lKCkKIAkJCQkJKyAiICIgKyBlbmMpOyAvLyROT04tTkxTLTEkCiAJCX0KQEAgLTMyMyw3ICszMjMsNyBAQCB2b2lkIGNvbmZpZ3VyZVJlcXVlc3QoZmluYWwgSHR0cENvbm5lY3Rpb24gY29ubikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAogCS8qKiBQZXJmb3JtcyBIVFRQIGRpZ2VzdCBhdXRoZW50aWNhdGlvbi4gKi8KIAlwcml2YXRlIHN0YXRpYyBjbGFzcyBEaWdlc3QgZXh0ZW5kcyBIdHRwQXV0aE1ldGhvZCB7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFJhbmRvbSBQUk5HID0gbmV3IFJhbmRvbSgpOworCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTZWN1cmVSYW5kb20gUFJORyA9IG5ldyBTZWN1cmVSYW5kb20oKTsKIAogCQlwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1zOwogCkBAIC0zNDYsMTQgKzM0NiwxNCBAQCBwcml2YXRlIHN0YXRpYyBjbGFzcyBEaWdlc3QgZXh0ZW5kcyBIdHRwQXV0aE1ldGhvZCB7CiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJdm9pZCBhdXRob3JpemUoZmluYWwgU3RyaW5nIHVzZXJuYW1lLCBmaW5hbCBTdHJpbmcgcGFzc3dvcmQpIHsKKwkJdm9pZCBhdXRob3JpemUoU3RyaW5nIHVzZXJuYW1lLCBTdHJpbmcgcGFzc3dvcmQpIHsKIAkJCXRoaXMudXNlciA9IHVzZXJuYW1lOwogCQkJdGhpcy5wYXNzID0gcGFzc3dvcmQ7CiAJCX0KIAogCQlAU3VwcHJlc3NXYXJuaW5ncygiYm94aW5nIikKIAkJQE92ZXJyaWRlCi0JCXZvaWQgY29uZmlndXJlUmVxdWVzdChmaW5hbCBIdHRwQ29ubmVjdGlvbiBjb25uKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQl2b2lkIGNvbmZpZ3VyZVJlcXVlc3QoSHR0cENvbm5lY3Rpb24gY29ubikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCWZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gciA9IG5ldyBMaW5rZWRIYXNoTWFwPD4oKTsKIAogCQkJZmluYWwgU3RyaW5nIHJlYWxtID0gcGFyYW1zLmdldCgicmVhbG0iKTsgLy8kTk9OLU5MUy0xJApAQCAtNDMwLDE1ICs0MzAsMTUgQEAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHVyaShVUkwgdSkgewogCiAJCXByaXZhdGUgc3RhdGljIFN0cmluZyBIKFN0cmluZyBkYXRhKSB7CiAJCQlNZXNzYWdlRGlnZXN0IG1kID0gbmV3TUQ1KCk7Ci0JCQltZC51cGRhdGUoZGF0YS5nZXRCeXRlcyhVVEZfOCkpOworCQkJbWQudXBkYXRlKGRhdGEuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQkJcmV0dXJuIExIRVgobWQuZGlnZXN0KCkpOwogCQl9CiAKIAkJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEtEKFN0cmluZyBzZWNyZXQsIFN0cmluZyBkYXRhKSB7CiAJCQlNZXNzYWdlRGlnZXN0IG1kID0gbmV3TUQ1KCk7Ci0JCQltZC51cGRhdGUoc2VjcmV0LmdldEJ5dGVzKFVURl84KSk7CisJCQltZC51cGRhdGUoc2VjcmV0LmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJCW1kLnVwZGF0ZSgoYnl0ZSkgJzonKTsKLQkJCW1kLnVwZGF0ZShkYXRhLmdldEJ5dGVzKFVURl84KSk7CisJCQltZC51cGRhdGUoZGF0YS5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCQlyZXR1cm4gTEhFWChtZC5kaWdlc3QoKSk7CiAJCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvSW5zZWN1cmVDaXBoZXJGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9JbnNlY3VyZUNpcGhlckZhY3RvcnkuamF2YQppbmRleCA3MzM4NGExLi5kNDk0MjczIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9JbnNlY3VyZUNpcGhlckZhY3RvcnkuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9JbnNlY3VyZUNpcGhlckZhY3RvcnkuamF2YQpAQCAtNTQsNyArNTQsNyBAQAogICogVGhpcyBpcyBhIGhhY2sgZm9yIHtAbGluayBXYWxrRW5jcnlwdGlvbn0gdG8gY3JlYXRlIGFueSBjaXBoZXIgY29uZmlndXJlZCBieQogICogdGhlIGVuZC11c2VyLiBVc2luZyB0aGlzIGNsYXNzIGFsbG93cyBKR2l0IHRvIHZpb2xhdGUgRXJyb3JQcm9uZSdzIHNlY3VyaXR5CiAgKiByZWNvbW1lbmRhdGlvbnMgKDxhCi0gKiBocmVmPSJodHRwOi8vZXJyb3Jwcm9uZS5pbmZvL2J1Z3BhdHRlcm4vSW5zZWN1cmVDcnlwdG9Vc2FnZSIKKyAqIGhyZWY9Imh0dHBzOi8vZXJyb3Jwcm9uZS5pbmZvL2J1Z3BhdHRlcm4vSW5zZWN1cmVDcnlwdG9Vc2FnZSIKICAqID5JbnNlY3VyZUNyeXB0b1VzYWdlPC9hPiksIHdoaWNoIGlzIG5vdCBzZWN1cmUuCiAgKi8KIGNsYXNzIEluc2VjdXJlQ2lwaGVyRmFjdG9yeSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9Kc2NoQ29uZmlnU2Vzc2lvbkZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0pzY2hDb25maWdTZXNzaW9uRmFjdG9yeS5qYXZhCmluZGV4IDJhMjIyZmIuLmVhYjNiM2MgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0pzY2hDb25maWdTZXNzaW9uRmFjdG9yeS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0pzY2hDb25maWdTZXNzaW9uRmFjdG9yeS5qYXZhCkBAIC03MCw2ICs3MCw3IEBACiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKIGltcG9ydCBjb20uamNyYWZ0LmpzY2guQ29uZmlnUmVwb3NpdG9yeTsKK2ltcG9ydCBjb20uamNyYWZ0LmpzY2guQ29uZmlnUmVwb3NpdG9yeS5Db25maWc7CiBpbXBvcnQgY29tLmpjcmFmdC5qc2NoLkpTY2g7CiBpbXBvcnQgY29tLmpjcmFmdC5qc2NoLkpTY2hFeGNlcHRpb247CiBpbXBvcnQgY29tLmpjcmFmdC5qc2NoLlNlc3Npb247CkBAIC0yMjIsMTAgKzIyMywzMCBAQCBTZXNzaW9uIGNyZWF0ZVNlc3Npb24oQ3JlZGVudGlhbHNQcm92aWRlciBjcmVkZW50aWFsc1Byb3ZpZGVyLAogCQkJc2Vzc2lvbi5zZXRVc2VySW5mbyhuZXcgQ3JlZGVudGlhbHNQcm92aWRlclVzZXJJbmZvKHNlc3Npb24sCiAJCQkJCWNyZWRlbnRpYWxzUHJvdmlkZXIpKTsKIAkJfQorCQlzYWZlQ29uZmlnKHNlc3Npb24sIGhjLmdldENvbmZpZygpKTsKIAkJY29uZmlndXJlKGhjLCBzZXNzaW9uKTsKIAkJcmV0dXJuIHNlc3Npb247CiAJfQogCisJcHJpdmF0ZSB2b2lkIHNhZmVDb25maWcoU2Vzc2lvbiBzZXNzaW9uLCBDb25maWcgY2ZnKSB7CisJCS8vIEVuc3VyZSB0aGF0IEpzY2ggY2hlY2tzIGFsbCBjb25maWd1cmVkIGFsZ29yaXRobXMsIG5vdCBqdXN0IGl0cworCQkvLyBidWlsdC1pbiBvbmVzLiBPdGhlcndpc2UgaXQgbWF5IHByb3Bvc2UgYW4gYWxnb3JpdGhtIGZvciB3aGljaCBpdAorCQkvLyBkb2Vzbid0IGhhdmUgYW4gaW1wbGVtZW50YXRpb24sIGFuZCB0aGVuIHJ1biBpbnRvIGFuIE5QRSBpZiB0aGF0CisJCS8vIGFsZ29yaXRobSBlbmRzIHVwIGJlaW5nIGNob3Nlbi4KKwkJY29weUNvbmZpZ1ZhbHVlVG9TZXNzaW9uKHNlc3Npb24sIGNmZywgIkNpcGhlcnMiLCAiQ2hlY2tDaXBoZXJzIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQljb3B5Q29uZmlnVmFsdWVUb1Nlc3Npb24oc2Vzc2lvbiwgY2ZnLCAiS2V4QWxnb3JpdGhtcyIsICJDaGVja0tleGVzIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQljb3B5Q29uZmlnVmFsdWVUb1Nlc3Npb24oc2Vzc2lvbiwgY2ZnLCAiSG9zdEtleUFsZ29yaXRobXMiLCAvLyROT04tTkxTLTEkCisJCQkJIkNoZWNrU2lnbmF0dXJlcyIpOyAvLyROT04tTkxTLTEkCisJfQorCisJcHJpdmF0ZSB2b2lkIGNvcHlDb25maWdWYWx1ZVRvU2Vzc2lvbihTZXNzaW9uIHNlc3Npb24sIENvbmZpZyBjZmcsCisJCQlTdHJpbmcgZnJvbSwgU3RyaW5nIHRvKSB7CisJCVN0cmluZyB2YWx1ZSA9IGNmZy5nZXRWYWx1ZShmcm9tKTsKKwkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCXNlc3Npb24uc2V0Q29uZmlnKHRvLCB2YWx1ZSk7CisJCX0KKwl9CisKIAlwcml2YXRlIHZvaWQgc2V0VXNlck5hbWUoU2Vzc2lvbiBzZXNzaW9uLCBTdHJpbmcgdXNlck5hbWUpIHsKIAkJLy8gSnNjaCAwLjEuNTQgcGlja3MgdXAgdGhlIHVzZXIgbmFtZSBmcm9tIHRoZSBzc2ggY29uZmlnLCBldmVuIGlmIGFuCiAJCS8vIGV4cGxpY2l0IHVzZXIgbmFtZSB3YXMgZ2l2ZW4hIFdlIG11c3QgY29ycmVjdCB0aGF0IGlmIH4vLnNzaC9jb25maWcKQEAgLTMwOSw3ICszMzAsNyBAQCBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVKU2NoKEpTY2gganNjaCkgewogCSAqIEB0aHJvd3MgY29tLmpjcmFmdC5qc2NoLkpTY2hFeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0aGUgdXNlciBjb25maWd1cmF0aW9uIGNvdWxkIG5vdCBiZSBjcmVhdGVkLgogCSAqLwotCXByb3RlY3RlZCBKU2NoIGdldEpTY2goZmluYWwgT3BlblNzaENvbmZpZy5Ib3N0IGhjLCBGUyBmcykgdGhyb3dzIEpTY2hFeGNlcHRpb24geworCXByb3RlY3RlZCBKU2NoIGdldEpTY2goT3BlblNzaENvbmZpZy5Ib3N0IGhjLCBGUyBmcykgdGhyb3dzIEpTY2hFeGNlcHRpb24gewogCQlpZiAoZGVmYXVsdEpTY2ggPT0gbnVsbCkgewogCQkJZGVmYXVsdEpTY2ggPSBjcmVhdGVEZWZhdWx0SlNjaChmcyk7CiAJCQlpZiAoZGVmYXVsdEpTY2guZ2V0Q29uZmlnUmVwb3NpdG9yeSgpID09IG51bGwpIHsKQEAgLTM1MSwxMyArMzcyLDE1IEBAIHByb3RlY3RlZCBKU2NoIGdldEpTY2goZmluYWwgT3BlblNzaENvbmZpZy5Ib3N0IGhjLCBGUyBmcykgdGhyb3dzIEpTY2hFeGNlcHRpb24KIAkgKi8KIAlwcm90ZWN0ZWQgSlNjaCBjcmVhdGVEZWZhdWx0SlNjaChGUyBmcykgdGhyb3dzIEpTY2hFeGNlcHRpb24gewogCQlmaW5hbCBKU2NoIGpzY2ggPSBuZXcgSlNjaCgpOworCQlKU2NoLnNldENvbmZpZygic3NoLXJzYSIsIEpTY2guZ2V0Q29uZmlnKCJzaWduYXR1cmUucnNhIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJSlNjaC5zZXRDb25maWcoInNzaC1kc3MiLCBKU2NoLmdldENvbmZpZygic2lnbmF0dXJlLmRzcyIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCWNvbmZpZ3VyZUpTY2goanNjaCk7CiAJCWtub3duSG9zdHMoanNjaCwgZnMpOwogCQlpZGVudGl0aWVzKGpzY2gsIGZzKTsKIAkJcmV0dXJuIGpzY2g7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBrbm93bkhvc3RzKGZpbmFsIEpTY2ggc2NoLCBGUyBmcykgdGhyb3dzIEpTY2hFeGNlcHRpb24geworCXByaXZhdGUgc3RhdGljIHZvaWQga25vd25Ib3N0cyhKU2NoIHNjaCwgRlMgZnMpIHRocm93cyBKU2NoRXhjZXB0aW9uIHsKIAkJZmluYWwgRmlsZSBob21lID0gZnMudXNlckhvbWUoKTsKIAkJaWYgKGhvbWUgPT0gbnVsbCkKIAkJCXJldHVybjsKQEAgLTM3MSw3ICszOTQsNyBAQCBwcml2YXRlIHN0YXRpYyB2b2lkIGtub3duSG9zdHMoZmluYWwgSlNjaCBzY2gsIEZTIGZzKSB0aHJvd3MgSlNjaEV4Y2VwdGlvbiB7CiAJCX0KIAl9CiAKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGlkZW50aXRpZXMoZmluYWwgSlNjaCBzY2gsIEZTIGZzKSB7CisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBpZGVudGl0aWVzKEpTY2ggc2NoLCBGUyBmcykgewogCQlmaW5hbCBGaWxlIGhvbWUgPSBmcy51c2VySG9tZSgpOwogCQlpZiAoaG9tZSA9PSBudWxsKQogCQkJcmV0dXJuOwpAQCAtMzgzLDcgKzQwNiw3IEBAIHByaXZhdGUgc3RhdGljIHZvaWQgaWRlbnRpdGllcyhmaW5hbCBKU2NoIHNjaCwgRlMgZnMpIHsKIAkJfQogCX0KIAotCXByaXZhdGUgc3RhdGljIHZvaWQgbG9hZElkZW50aXR5KGZpbmFsIEpTY2ggc2NoLCBmaW5hbCBGaWxlIHByaXYpIHsKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGxvYWRJZGVudGl0eShKU2NoIHNjaCwgRmlsZSBwcml2KSB7CiAJCWlmIChwcml2LmlzRmlsZSgpKSB7CiAJCQl0cnkgewogCQkJCXNjaC5hZGRJZGVudGl0eShwcml2LmdldEFic29sdXRlUGF0aCgpKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0pzY2hTZXNzaW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9Kc2NoU2Vzc2lvbi5qYXZhCmluZGV4IDA4MWQwNTcuLmUzZWY4MzIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0pzY2hTZXNzaW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvSnNjaFNlc3Npb24uamF2YQpAQCAtODIsNyArODIsNyBAQCBwdWJsaWMgY2xhc3MgSnNjaFNlc3Npb24gaW1wbGVtZW50cyBSZW1vdGVTZXNzaW9uIHsKIAkgKiBAcGFyYW0gdXJpCiAJICogICAgICAgICAgICB0aGUgVVJJIGluZm9ybWF0aW9uIGZvciB0aGUgcmVtb3RlIGNvbm5lY3Rpb24KIAkgKi8KLQlwdWJsaWMgSnNjaFNlc3Npb24oZmluYWwgU2Vzc2lvbiBzZXNzaW9uLCBVUklpc2ggdXJpKSB7CisJcHVibGljIEpzY2hTZXNzaW9uKFNlc3Npb24gc2Vzc2lvbiwgVVJJaXNoIHVyaSkgewogCQlzb2NrID0gc2Vzc2lvbjsKIAkJdGhpcy51cmkgPSB1cmk7CiAJfQpAQCAtMTQ1LDcgKzE0NSw3IEBAIHByaXZhdGUgY2xhc3MgSnNjaFByb2Nlc3MgZXh0ZW5kcyBQcm9jZXNzIHsKIAkJICogQHRocm93cyBJT0V4Y2VwdGlvbgogCQkgKiAgICAgICAgICAgICBvbiBwcm9ibGVtcyBvcGVuaW5nIHN0cmVhbXMKIAkJICovCi0JCUpzY2hQcm9jZXNzKGZpbmFsIFN0cmluZyBjb21tYW5kTmFtZSwgaW50IHRtcykKKwkJSnNjaFByb2Nlc3MoU3RyaW5nIGNvbW1hbmROYW1lLCBpbnQgdG1zKQogCQkJCXRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJCXRpbWVvdXQgPSB0bXM7CiAJCQl0cnkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvTmV0UkMuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L05ldFJDLmphdmEKaW5kZXggZTNmMjg3Yi4uZTY4OGY2MyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvTmV0UkMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9OZXRSQy5qYXZhCkBAIC0yMTEsOSArMjExLDcgQEAgcHJpdmF0ZSB2b2lkIHBhcnNlKCkgewogCQl0aGlzLmhvc3RzLmNsZWFyKCk7CiAJCXRoaXMubGFzdE1vZGlmaWVkID0gdGhpcy5uZXRyYy5sYXN0TW9kaWZpZWQoKTsKIAotCQlCdWZmZXJlZFJlYWRlciByID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIobmV0cmMpKTsKKwkJdHJ5IChCdWZmZXJlZFJlYWRlciByID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKG5ldHJjKSkpIHsKIAkJCVN0cmluZyBsaW5lID0gbnVsbDsKIAogCQkJTmV0UkNFbnRyeSBlbnRyeSA9IG5ldyBOZXRSQ0VudHJ5KCk7CkBAIC0zMTUsMTMgKzMxMyw2IEBAIHByaXZhdGUgdm9pZCBwYXJzZSgpIHsKIAkJCQlob3N0cy5wdXQoZW50cnkubWFjaGluZSwgZW50cnkpOwogCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaWYgKHIgIT0gbnVsbCkKLQkJCQkJci5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotCQkJfQogCQl9CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvT3BlblNzaENvbmZpZy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvT3BlblNzaENvbmZpZy5qYXZhCmluZGV4IDQ2NjBjNDAuLmY1Y2NkYzggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L09wZW5Tc2hDb25maWcuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9PcGVuU3NoQ29uZmlnLmphdmEKQEAgLTE4Niw3ICsxODYsNyBAQCBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCS8qKiBTdGF0ZSByZWFkIGZyb20gdGhlIGNvbmZpZyBmaWxlLCBwbHVzIHtAbGluayBIb3N0fXMgY3JlYXRlZCBmcm9tIGl0LiAqLwogCXByaXZhdGUgU3RhdGUgc3RhdGU7CiAKLQlPcGVuU3NoQ29uZmlnKGZpbmFsIEZpbGUgaCwgZmluYWwgRmlsZSBjZmcpIHsKKwlPcGVuU3NoQ29uZmlnKEZpbGUgaCwgRmlsZSBjZmcpIHsKIAkJaG9tZSA9IGg7CiAJCWNvbmZpZ0ZpbGUgPSBjZmc7CiAJCXN0YXRlID0gbmV3IFN0YXRlKCk7CkBAIC0yMDEsNyArMjAxLDcgQEAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkgKiAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gZmlsZS4KIAkgKiBAcmV0dXJuIHIgY29uZmlndXJhdGlvbiBmb3IgdGhlIHJlcXVlc3RlZCBuYW1lLiBOZXZlciBudWxsLgogCSAqLwotCXB1YmxpYyBIb3N0IGxvb2t1cChmaW5hbCBTdHJpbmcgaG9zdE5hbWUpIHsKKwlwdWJsaWMgSG9zdCBsb29rdXAoU3RyaW5nIGhvc3ROYW1lKSB7CiAJCWZpbmFsIFN0YXRlIGNhY2hlID0gcmVmcmVzaCgpOwogCQlIb3N0IGggPSBjYWNoZS5ob3N0cy5nZXQoaG9zdE5hbWUpOwogCQlpZiAoaCAhPSBudWxsKSB7CkBAIC0yMTEsNyArMjExLDcgQEAgcHVibGljIEhvc3QgbG9va3VwKGZpbmFsIFN0cmluZyBob3N0TmFtZSkgewogCQkvLyBJbml0aWFsaXplIHdpdGggZGVmYXVsdCBlbnRyaWVzIGF0IHRoZSB0b3Agb2YgdGhlIGZpbGUsIGJlZm9yZSB0aGUKIAkJLy8gZmlyc3QgSG9zdCBibG9jay4KIAkJZnVsbENvbmZpZy5tZXJnZShjYWNoZS5lbnRyaWVzLmdldChIb3N0RW50cnkuREVGQVVMVF9OQU1FKSk7Ci0JCWZvciAoZmluYWwgTWFwLkVudHJ5PFN0cmluZywgSG9zdEVudHJ5PiBlIDogY2FjaGUuZW50cmllcy5lbnRyeVNldCgpKSB7CisJCWZvciAoTWFwLkVudHJ5PFN0cmluZywgSG9zdEVudHJ5PiBlIDogY2FjaGUuZW50cmllcy5lbnRyeVNldCgpKSB7CiAJCQlTdHJpbmcga2V5ID0gZS5nZXRLZXkoKTsKIAkJCWlmIChpc0hvc3RNYXRjaChrZXksIGhvc3ROYW1lKSkgewogCQkJCWZ1bGxDb25maWcubWVyZ2UoZS5nZXRWYWx1ZSgpKTsKQEAgLTIzOCw3ICsyMzgsNyBAQCBwcml2YXRlIHN5bmNocm9uaXplZCBTdGF0ZSByZWZyZXNoKCkgewogCQlyZXR1cm4gc3RhdGU7CiAJfQogCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBIb3N0RW50cnk+IHBhcnNlKGZpbmFsIElucHV0U3RyZWFtIGluKQorCXByaXZhdGUgTWFwPFN0cmluZywgSG9zdEVudHJ5PiBwYXJzZShJbnB1dFN0cmVhbSBpbikKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIE1hcDxTdHJpbmcsIEhvc3RFbnRyeT4gbSA9IG5ldyBMaW5rZWRIYXNoTWFwPD4oKTsKIAkJZmluYWwgQnVmZmVyZWRSZWFkZXIgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGluKSk7CkBAIC0zMzIsMTQgKzMzMiwxNCBAQCBwcml2YXRlIHN0YXRpYyBib29sZWFuIHBhdHRlcm5NYXRjaGVzSG9zdChmaW5hbCBTdHJpbmcgcGF0dGVybiwKIAkJfQogCX0KIAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBkZXF1b3RlKGZpbmFsIFN0cmluZyB2YWx1ZSkgeworCXByaXZhdGUgc3RhdGljIFN0cmluZyBkZXF1b3RlKFN0cmluZyB2YWx1ZSkgewogCQlpZiAodmFsdWUuc3RhcnRzV2l0aCgiXCIiKSAmJiB2YWx1ZS5lbmRzV2l0aCgiXCIiKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJCQkmJiB2YWx1ZS5sZW5ndGgoKSA+IDEpCiAJCQlyZXR1cm4gdmFsdWUuc3Vic3RyaW5nKDEsIHZhbHVlLmxlbmd0aCgpIC0gMSk7CiAJCXJldHVybiB2YWx1ZTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgbm93cyhmaW5hbCBTdHJpbmcgdmFsdWUpIHsKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgbm93cyhTdHJpbmcgdmFsdWUpIHsKIAkJZmluYWwgU3RyaW5nQnVpbGRlciBiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGgoKTsgaSsrKSB7CiAJCQlpZiAoIUNoYXJhY3Rlci5pc1NwYWNlQ2hhcih2YWx1ZS5jaGFyQXQoaSkpKQpAQCAtMzQ4LDcgKzM0OCw3IEBAIHByaXZhdGUgc3RhdGljIFN0cmluZyBub3dzKGZpbmFsIFN0cmluZyB2YWx1ZSkgewogCQlyZXR1cm4gYi50b1N0cmluZygpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIEJvb2xlYW4geWVzbm8oZmluYWwgU3RyaW5nIHZhbHVlKSB7CisJcHJpdmF0ZSBzdGF0aWMgQm9vbGVhbiB5ZXNubyhTdHJpbmcgdmFsdWUpIHsKIAkJaWYgKFN0cmluZ1V0aWxzLmVxdWFsc0lnbm9yZUNhc2UoInllcyIsIHZhbHVlKSkgLy8kTk9OLU5MUy0xJAogCQkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKIAkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CkBAIC0zNjUsNyArMzY1LDcgQEAgcHJpdmF0ZSBzdGF0aWMgRmlsZSB0b0ZpbGUoU3RyaW5nIHBhdGgsIEZpbGUgaG9tZSkgewogCQlyZXR1cm4gbmV3IEZpbGUoaG9tZSwgcGF0aCk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgaW50IHBvc2l0aXZlKGZpbmFsIFN0cmluZyB2YWx1ZSkgeworCXByaXZhdGUgc3RhdGljIGludCBwb3NpdGl2ZShTdHJpbmcgdmFsdWUpIHsKIAkJaWYgKHZhbHVlICE9IG51bGwpIHsKIAkJCXRyeSB7CiAJCQkJcmV0dXJuIEludGVnZXIucGFyc2VVbnNpZ25lZEludCh2YWx1ZSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9PcGVyYXRpb25SZXN1bHQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L09wZXJhdGlvblJlc3VsdC5qYXZhCmluZGV4IDQyMzE3OTguLjA4ZjdmMGQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L09wZXJhdGlvblJlc3VsdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L09wZXJhdGlvblJlc3VsdC5qYXZhCkBAIC0xMDcsNyArMTA3LDcgQEAgcHVibGljIENvbGxlY3Rpb248UmVmPiBnZXRBZHZlcnRpc2VkUmVmcygpIHsKIAkgKiAgICAgICAgICAgIG5hbWUgb2YgdGhlIHJlZiB0byBvYnRhaW4uCiAJICogQHJldHVybiB0aGUgcmVxdWVzdGVkIHJlZjsgbnVsbCBpZiB0aGUgcmVtb3RlIGRpZCBub3QgYWR2ZXJ0aXNlIHRoaXMgcmVmLgogCSAqLwotCXB1YmxpYyBmaW5hbCBSZWYgZ2V0QWR2ZXJ0aXNlZFJlZihmaW5hbCBTdHJpbmcgbmFtZSkgeworCXB1YmxpYyBmaW5hbCBSZWYgZ2V0QWR2ZXJ0aXNlZFJlZihTdHJpbmcgbmFtZSkgewogCQlyZXR1cm4gYWR2ZXJ0aXNlZFJlZnMuZ2V0KG5hbWUpOwogCX0KIApAQCAtMTI5LDE2ICsxMjksMTYgQEAgcHVibGljIENvbGxlY3Rpb248VHJhY2tpbmdSZWZVcGRhdGU+IGdldFRyYWNraW5nUmVmVXBkYXRlcygpIHsKIAkgKiBAcmV0dXJuIHN0YXR1cyBvZiB0aGUgbG9jYWwgcmVmOyBudWxsIGlmIHRoaXMgbG9jYWwgcmVmIHdhcyBub3QgdG91Y2hlZAogCSAqICAgICAgICAgZHVyaW5nIHRoaXMgb3BlcmF0aW9uLgogCSAqLwotCXB1YmxpYyBUcmFja2luZ1JlZlVwZGF0ZSBnZXRUcmFja2luZ1JlZlVwZGF0ZShmaW5hbCBTdHJpbmcgbG9jYWxOYW1lKSB7CisJcHVibGljIFRyYWNraW5nUmVmVXBkYXRlIGdldFRyYWNraW5nUmVmVXBkYXRlKFN0cmluZyBsb2NhbE5hbWUpIHsKIAkJcmV0dXJuIHVwZGF0ZXMuZ2V0KGxvY2FsTmFtZSk7CiAJfQogCi0Jdm9pZCBzZXRBZHZlcnRpc2VkUmVmcyhmaW5hbCBVUklpc2ggdSwgZmluYWwgTWFwPFN0cmluZywgUmVmPiBhcikgeworCXZvaWQgc2V0QWR2ZXJ0aXNlZFJlZnMoVVJJaXNoIHUsIE1hcDxTdHJpbmcsIFJlZj4gYXIpIHsKIAkJdXJpID0gdTsKIAkJYWR2ZXJ0aXNlZFJlZnMgPSBhcjsKIAl9CiAKLQl2b2lkIGFkZChmaW5hbCBUcmFja2luZ1JlZlVwZGF0ZSB1KSB7CisJdm9pZCBhZGQoVHJhY2tpbmdSZWZVcGRhdGUgdSkgewogCQl1cGRhdGVzLnB1dCh1LmdldExvY2FsTmFtZSgpLCB1KTsKIAl9CiAKQEAgLTE1OCw3ICsxNTgsNyBAQCBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VzKCkgewogCQlyZXR1cm4gbWVzc2FnZUJ1ZmZlciAhPSBudWxsID8gbWVzc2FnZUJ1ZmZlci50b1N0cmluZygpIDogIiI7IC8vJE5PTi1OTFMtMSQKIAl9CiAKLQl2b2lkIGFkZE1lc3NhZ2VzKGZpbmFsIFN0cmluZyBtc2cpIHsKKwl2b2lkIGFkZE1lc3NhZ2VzKFN0cmluZyBtc2cpIHsKIAkJaWYgKG1zZyAhPSBudWxsICYmIG1zZy5sZW5ndGgoKSA+IDApIHsKIAkJCWlmIChtZXNzYWdlQnVmZmVyID09IG51bGwpCiAJCQkJbWVzc2FnZUJ1ZmZlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QYWNrUGFyc2VyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QYWNrUGFyc2VyLmphdmEKaW5kZXggYWY1YTBiNy4uNDlhY2I0ZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUGFja1BhcnNlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1BhY2tQYXJzZXIuamF2YQpAQCAtMjAwLDcgKzIwMCw3IEBAIHB1YmxpYyBzdGF0aWMgZW51bSBTb3VyY2UgewogCSAqIEBwYXJhbSBzcmMKIAkgKiAgICAgICAgICAgIHRoZSBzdHJlYW0gdGhlIHBhcnNlciB3aWxsIHJlYWQuCiAJICovCi0JcHJvdGVjdGVkIFBhY2tQYXJzZXIoZmluYWwgT2JqZWN0RGF0YWJhc2Ugb2RiLCBmaW5hbCBJbnB1dFN0cmVhbSBzcmMpIHsKKwlwcm90ZWN0ZWQgUGFja1BhcnNlcihPYmplY3REYXRhYmFzZSBvZGIsIElucHV0U3RyZWFtIHNyYykgewogCQlvYmplY3REYXRhYmFzZSA9IG9kYi5uZXdDYWNoZWREYXRhYmFzZSgpOwogCQlpbiA9IHNyYzsKIApAQCAtMjMyLDcgKzIzMiw3IEBAIHB1YmxpYyBib29sZWFuIGlzQWxsb3dUaGluKCkgewogCSAqIEBwYXJhbSBhbGxvdwogCSAqICAgICAgICAgICAgdHJ1ZSB0byBlbmFibGUgYSB0aGluIHBhY2suCiAJICovCi0JcHVibGljIHZvaWQgc2V0QWxsb3dUaGluKGZpbmFsIGJvb2xlYW4gYWxsb3cpIHsKKwlwdWJsaWMgdm9pZCBzZXRBbGxvd1RoaW4oYm9vbGVhbiBhbGxvdykgewogCQlhbGxvd1RoaW4gPSBhbGxvdzsKIAl9CiAKQEAgLTM3OSw3ICszNzksNyBAQCBwdWJsaWMgT2JqZWN0SWRTdWJjbGFzc01hcDxPYmplY3RJZD4gZ2V0QmFzZU9iamVjdElkcygpIHsKIAkgKiBAcGFyYW0gb2MKIAkgKiAgICAgICAgICAgIHRoZSBjaGVja2VyIGluc3RhbmNlOyBudWxsIHRvIGRpc2FibGUgb2JqZWN0IGNoZWNraW5nLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldE9iamVjdENoZWNrZXIoZmluYWwgT2JqZWN0Q2hlY2tlciBvYykgeworCXB1YmxpYyB2b2lkIHNldE9iamVjdENoZWNrZXIoT2JqZWN0Q2hlY2tlciBvYykgewogCQlvYmpDaGVjayA9IG9jOwogCX0KIApAQCAtMzk5LDcgKzM5OSw3IEBAIHB1YmxpYyB2b2lkIHNldE9iamVjdENoZWNrZXIoZmluYWwgT2JqZWN0Q2hlY2tlciBvYykgewogCSAqIEBwYXJhbSBvbgogCSAqICAgICAgICAgICAgdHJ1ZSB0byBlbmFibGUgdGhlIGRlZmF1bHQgY2hlY2tlcjsgZmFsc2UgdG8gZGlzYWJsZSBpdC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPYmplY3RDaGVja2luZyhmaW5hbCBib29sZWFuIG9uKSB7CisJcHVibGljIHZvaWQgc2V0T2JqZWN0Q2hlY2tpbmcoYm9vbGVhbiBvbikgewogCQlzZXRPYmplY3RDaGVja2VyKG9uID8gbmV3IE9iamVjdENoZWNrZXIoKSA6IG51bGwpOwogCX0KIApAQCAtNjI5LDcgKzYyOSw3IEBAIHByaXZhdGUgdm9pZCBwcm9jZXNzRGVsdGFzKFByb2dyZXNzTW9uaXRvciByZXNvbHZpbmcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXJlc29sdmluZy5lbmRUYXNrKCk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHJlc29sdmVEZWx0YXMoZmluYWwgUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzKQorCXByaXZhdGUgdm9pZCByZXNvbHZlRGVsdGFzKFByb2dyZXNzTW9uaXRvciBwcm9ncmVzcykKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIGludCBsYXN0ID0gZW50cnlDb3VudDsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBsYXN0OyBpKyspIHsKQEAgLTgxOSw3ICs4MTksNyBAQCBwcm90ZWN0ZWQgT2JqZWN0VHlwZUFuZFNpemUgcmVhZE9iamVjdEhlYWRlcihPYmplY3RUeXBlQW5kU2l6ZSBpbmZvKQogCQlyZXR1cm4gaW5mbzsKIAl9CiAKLQlwcml2YXRlIFVucmVzb2x2ZWREZWx0YSByZW1vdmVCYXNlQnlJZChmaW5hbCBBbnlPYmplY3RJZCBpZCkgeworCXByaXZhdGUgVW5yZXNvbHZlZERlbHRhIHJlbW92ZUJhc2VCeUlkKEFueU9iamVjdElkIGlkKSB7CiAJCWZpbmFsIERlbHRhQ2hhaW4gZCA9IGJhc2VCeUlkLmdldChpZCk7CiAJCXJldHVybiBkICE9IG51bGwgPyBkLnJlbW92ZSgpIDogbnVsbDsKIAl9CkBAIC04NjUsNyArODY1LDcgQEAgcHJpdmF0ZSBVbnJlc29sdmVkRGVsdGEgZmlyc3RDaGlsZE9mKFBhY2tlZE9iamVjdEluZm8gb2UpIHsKIAkJcmV0dXJuIGZpcnN0OwogCX0KIAotCXByaXZhdGUgdm9pZCByZXNvbHZlRGVsdGFzV2l0aEV4dGVybmFsQmFzZXMoZmluYWwgUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzKQorCXByaXZhdGUgdm9pZCByZXNvbHZlRGVsdGFzV2l0aEV4dGVybmFsQmFzZXMoUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZ3Jvd0VudHJpZXMoYmFzZUJ5SWQuc2l6ZSgpKTsKIApAQCAtODczLDcgKzg3Myw3IEBAIHByaXZhdGUgdm9pZCByZXNvbHZlRGVsdGFzV2l0aEV4dGVybmFsQmFzZXMoZmluYWwgUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzKQogCQkJYmFzZU9iamVjdElkcyA9IG5ldyBPYmplY3RJZFN1YmNsYXNzTWFwPD4oKTsKIAogCQlmaW5hbCBMaXN0PERlbHRhQ2hhaW4+IG1pc3NpbmcgPSBuZXcgQXJyYXlMaXN0PD4oNjQpOwotCQlmb3IgKGZpbmFsIERlbHRhQ2hhaW4gYmFzZUlkIDogYmFzZUJ5SWQpIHsKKwkJZm9yIChEZWx0YUNoYWluIGJhc2VJZCA6IGJhc2VCeUlkKSB7CiAJCQlpZiAoYmFzZUlkLmhlYWQgPT0gbnVsbCkKIAkJCQljb250aW51ZTsKIApAQCAtOTA1LDcgKzkwNSw3IEBAIHByaXZhdGUgdm9pZCByZXNvbHZlRGVsdGFzV2l0aEV4dGVybmFsQmFzZXMoZmluYWwgUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzKQogCQkJCQkJSkdpdFRleHQuZ2V0KCkuZG93bmxvYWRDYW5jZWxsZWREdXJpbmdJbmRleGluZyk7CiAJCX0KIAotCQlmb3IgKGZpbmFsIERlbHRhQ2hhaW4gYmFzZSA6IG1pc3NpbmcpIHsKKwkJZm9yIChEZWx0YUNoYWluIGJhc2UgOiBtaXNzaW5nKSB7CiAJCQlpZiAoYmFzZS5oZWFkICE9IG51bGwpCiAJCQkJdGhyb3cgbmV3IE1pc3NpbmdPYmplY3RFeGNlcHRpb24oYmFzZSwgImRlbHRhIGJhc2UiKTsgLy8kTk9OLU5MUy0xJAogCQl9CkBAIC0xMDY1LDcgKzEwNjUsNyBAQCBwcml2YXRlIHZvaWQgaW5kZXhPbmVPYmplY3QoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl9CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHdob2xlKGZpbmFsIGxvbmcgcG9zLCBmaW5hbCBpbnQgdHlwZSwgZmluYWwgbG9uZyBzeikKKwlwcml2YXRlIHZvaWQgd2hvbGUobG9uZyBwb3MsIGludCB0eXBlLCBsb25nIHN6KQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJU0hBMSBvYmplY3REaWdlc3QgPSBvYmplY3RIYXNoZXIucmVzZXQoKTsKIAkJb2JqZWN0RGlnZXN0LnVwZGF0ZShDb25zdGFudHMuZW5jb2RlZFR5cGVTdHJpbmcodHlwZSkpOwpAQCAtMTA3Niw3ICsxMDc2LDYgQEAgcHJpdmF0ZSB2b2lkIHdob2xlKGZpbmFsIGxvbmcgcG9zLCBmaW5hbCBpbnQgdHlwZSwgZmluYWwgbG9uZyBzeikKIAkJZmluYWwgYnl0ZVtdIGRhdGE7CiAJCWlmICh0eXBlID09IENvbnN0YW50cy5PQkpfQkxPQikgewogCQkJYnl0ZVtdIHJlYWRCdWZmZXIgPSBidWZmZXIoKTsKLQkJCUlucHV0U3RyZWFtIGluZiA9IGluZmxhdGUoU291cmNlLklOUFVULCBzeik7CiAJCQlCbG9iT2JqZWN0Q2hlY2tlciBjaGVja2VyID0gbnVsbDsKIAkJCWlmIChvYmpDaGVjayAhPSBudWxsKSB7CiAJCQkJY2hlY2tlciA9IG9iakNoZWNrLm5ld0Jsb2JPYmplY3RDaGVja2VyKCk7CkBAIC0xMDg1LDE1ICsxMDg0LDE2IEBAIHByaXZhdGUgdm9pZCB3aG9sZShmaW5hbCBsb25nIHBvcywgZmluYWwgaW50IHR5cGUsIGZpbmFsIGxvbmcgc3opCiAJCQkJY2hlY2tlciA9IEJsb2JPYmplY3RDaGVja2VyLk5VTExfQ0hFQ0tFUjsKIAkJCX0KIAkJCWxvbmcgY250ID0gMDsKLQkJCXdoaWxlIChjbnQgPCBzeikgewotCQkJCWludCByID0gaW5mLnJlYWQocmVhZEJ1ZmZlcik7Ci0JCQkJaWYgKHIgPD0gMCkKLQkJCQkJYnJlYWs7Ci0JCQkJb2JqZWN0RGlnZXN0LnVwZGF0ZShyZWFkQnVmZmVyLCAwLCByKTsKLQkJCQljaGVja2VyLnVwZGF0ZShyZWFkQnVmZmVyLCAwLCByKTsKLQkJCQljbnQgKz0gcjsKKwkJCXRyeSAoSW5wdXRTdHJlYW0gaW5mID0gaW5mbGF0ZShTb3VyY2UuSU5QVVQsIHN6KSkgeworCQkJCXdoaWxlIChjbnQgPCBzeikgeworCQkJCQlpbnQgciA9IGluZi5yZWFkKHJlYWRCdWZmZXIpOworCQkJCQlpZiAociA8PSAwKQorCQkJCQkJYnJlYWs7CisJCQkJCW9iamVjdERpZ2VzdC51cGRhdGUocmVhZEJ1ZmZlciwgMCwgcik7CisJCQkJCWNoZWNrZXIudXBkYXRlKHJlYWRCdWZmZXIsIDAsIHIpOworCQkJCQljbnQgKz0gcjsKKwkJCQl9CiAJCQl9Ci0JCQlpbmYuY2xvc2UoKTsKIAkJCW9iamVjdERpZ2VzdC5kaWdlc3QodGVtcE9iamVjdElkKTsKIAkJCWNoZWNrZXIuZW5kQmxvYih0ZW1wT2JqZWN0SWQpOwogCQkJZGF0YSA9IG51bGw7CkBAIC0xMTYyLDMzICsxMTYyLDI5IEBAIHByaXZhdGUgdm9pZCBjaGVja09iamVjdENvbGxpc2lvbihQYWNrZWRPYmplY3RJbmZvIG9iaikKIAkJZmluYWwgYnl0ZVtdIHJlYWRCdWZmZXIgPSBidWZmZXIoKTsKIAkJZmluYWwgYnl0ZVtdIGN1ckJ1ZmZlciA9IG5ldyBieXRlW3JlYWRCdWZmZXIubGVuZ3RoXTsKIAkJbG9uZyBzeiA9IGluZm8uc2l6ZTsKLQkJSW5wdXRTdHJlYW0gcGNrID0gbnVsbDsKIAkJdHJ5IChPYmplY3RTdHJlYW0gY3VyID0gcmVhZEN1cnMub3BlbihvYmosIGluZm8udHlwZSkub3BlblN0cmVhbSgpKSB7CiAJCQlpZiAoY3VyLmdldFNpemUoKSAhPSBzeikgewogCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKIAkJCQkJCUpHaXRUZXh0LmdldCgpLmNvbGxpc2lvbk9uLCBvYmoubmFtZSgpKSk7CiAJCQl9Ci0JCQlwY2sgPSBpbmZsYXRlKFNvdXJjZS5EQVRBQkFTRSwgc3opOwotCQkJd2hpbGUgKDAgPCBzeikgewotCQkJCWludCBuID0gKGludCkgTWF0aC5taW4ocmVhZEJ1ZmZlci5sZW5ndGgsIHN6KTsKLQkJCQlJTy5yZWFkRnVsbHkoY3VyLCBjdXJCdWZmZXIsIDAsIG4pOwotCQkJCUlPLnJlYWRGdWxseShwY2ssIHJlYWRCdWZmZXIsIDAsIG4pOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCQkJCWlmIChjdXJCdWZmZXJbaV0gIT0gcmVhZEJ1ZmZlcltpXSkgewotCQkJCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpHaXRUZXh0Ci0JCQkJCQkJCS5nZXQoKS5jb2xsaXNpb25Pbiwgb2JqLm5hbWUoKSkpOworCQkJdHJ5IChJbnB1dFN0cmVhbSBwY2sgPSBpbmZsYXRlKFNvdXJjZS5EQVRBQkFTRSwgc3opKSB7CisJCQkJd2hpbGUgKDAgPCBzeikgeworCQkJCQlpbnQgbiA9IChpbnQpIE1hdGgubWluKHJlYWRCdWZmZXIubGVuZ3RoLCBzeik7CisJCQkJCUlPLnJlYWRGdWxseShjdXIsIGN1ckJ1ZmZlciwgMCwgbik7CisJCQkJCUlPLnJlYWRGdWxseShwY2ssIHJlYWRCdWZmZXIsIDAsIG4pOworCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgeworCQkJCQkJaWYgKGN1ckJ1ZmZlcltpXSAhPSByZWFkQnVmZmVyW2ldKSB7CisJCQkJCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAorCQkJCQkJCQkJSkdpdFRleHQuZ2V0KCkuY29sbGlzaW9uT24sIG9iai5uYW1lKCkpKTsKKwkJCQkJCX0KIAkJCQkJfQorCQkJCQlzeiAtPSBuOwogCQkJCX0KLQkJCQlzeiAtPSBuOwogCQkJfQogCQl9IGNhdGNoIChNaXNzaW5nT2JqZWN0RXhjZXB0aW9uIG5vdExvY2FsKSB7CiAJCQkvLyBUaGlzIGlzIE9LLCB3ZSBkb24ndCBoYXZlIGEgY29weSBvZiB0aGUgb2JqZWN0IGxvY2FsbHkKLQkJCS8vIGJ1dCB0aGUgQVBJIHRocm93cyB3aGVuIHdlIHRyeSB0byByZWFkIGl0IGFzIHVzdWFsbHkgaXRzCisJCQkvLyBidXQgdGhlIEFQSSB0aHJvd3Mgd2hlbiB3ZSB0cnkgdG8gcmVhZCBpdCBhcyB1c3VhbGx5IGl0J3MKIAkJCS8vIGFuIGVycm9yIHRvIHJlYWQgc29tZXRoaW5nIHRoYXQgZG9lc24ndCBleGlzdC4KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChwY2sgIT0gbnVsbCkgewotCQkJCXBjay5jbG9zZSgpOwotCQkJfQogCQl9CiAJfQogCkBAIC0xMjI4LDcgKzEyMjQsNyBAQCBwcml2YXRlIE9iamVjdFR5cGVBbmRTaXplIG9wZW5EYXRhYmFzZShVbnJlc29sdmVkRGVsdGEgZGVsdGEsCiAJfQogCiAJLy8gQ29uc3VtZSBleGFjdGx5IG9uZSBieXRlIGZyb20gdGhlIGJ1ZmZlciBhbmQgcmV0dXJuIGl0LgotCXByaXZhdGUgaW50IHJlYWRGcm9tKGZpbmFsIFNvdXJjZSBzcmMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJpdmF0ZSBpbnQgcmVhZEZyb20oU291cmNlIHNyYykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJaWYgKGJBdmFpbCA9PSAwKQogCQkJZmlsbChzcmMsIDEpOwogCQliQXZhaWwtLTsKQEAgLTEyMzYsMTMgKzEyMzIsMTMgQEAgcHJpdmF0ZSBpbnQgcmVhZEZyb20oZmluYWwgU291cmNlIHNyYykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAl9CiAKIAkvLyBDb25zdW1lIGNudCBieXRlcyBmcm9tIHRoZSBidWZmZXIuCi0Jdm9pZCB1c2UoZmluYWwgaW50IGNudCkgeworCXZvaWQgdXNlKGludCBjbnQpIHsKIAkJYk9mZnNldCArPSBjbnQ7CiAJCWJBdmFpbCAtPSBjbnQ7CiAJfQogCiAJLy8gRW5zdXJlIGF0IGxlYXN0IG5lZWQgYnl0ZXMgYXJlIGF2YWlsYWJsZSBpbiBpbiB7QGxpbmsgI2J1Zn0uCi0JaW50IGZpbGwoZmluYWwgU291cmNlIHNyYywgZmluYWwgaW50IG5lZWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJaW50IGZpbGwoU291cmNlIHNyYywgaW50IG5lZWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXdoaWxlIChiQXZhaWwgPCBuZWVkKSB7CiAJCQlpbnQgbmV4dCA9IGJPZmZzZXQgKyBiQXZhaWw7CiAJCQlpbnQgZnJlZSA9IGJ1Zi5sZW5ndGggLSBuZXh0OwpAQCAtMTY0MCwyMyArMTYzNiwyMyBAQCBwdWJsaWMgc3RhdGljIGNsYXNzIE9iamVjdFR5cGVBbmRTaXplIHsKIAkJcHVibGljIGxvbmcgc2l6ZTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgaW5mbGF0ZUFuZFNraXAoZmluYWwgU291cmNlIHNyYywgZmluYWwgbG9uZyBpbmZsYXRlZFNpemUpCisJcHJpdmF0ZSB2b2lkIGluZmxhdGVBbmRTa2lwKFNvdXJjZSBzcmMsIGxvbmcgaW5mbGF0ZWRTaXplKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZmluYWwgSW5wdXRTdHJlYW0gaW5mID0gaW5mbGF0ZShzcmMsIGluZmxhdGVkU2l6ZSk7Ci0JCUlPLnNraXBGdWxseShpbmYsIGluZmxhdGVkU2l6ZSk7Ci0JCWluZi5jbG9zZSgpOworCQl0cnkgKElucHV0U3RyZWFtIGluZiA9IGluZmxhdGUoc3JjLCBpbmZsYXRlZFNpemUpKSB7CisJCQlJTy5za2lwRnVsbHkoaW5mLCBpbmZsYXRlZFNpemUpOworCQl9CiAJfQogCi0JcHJpdmF0ZSBieXRlW10gaW5mbGF0ZUFuZFJldHVybihmaW5hbCBTb3VyY2Ugc3JjLCBmaW5hbCBsb25nIGluZmxhdGVkU2l6ZSkKKwlwcml2YXRlIGJ5dGVbXSBpbmZsYXRlQW5kUmV0dXJuKFNvdXJjZSBzcmMsIGxvbmcgaW5mbGF0ZWRTaXplKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgYnl0ZVtdIGRzdCA9IG5ldyBieXRlWyhpbnQpIGluZmxhdGVkU2l6ZV07Ci0JCWZpbmFsIElucHV0U3RyZWFtIGluZiA9IGluZmxhdGUoc3JjLCBpbmZsYXRlZFNpemUpOwotCQlJTy5yZWFkRnVsbHkoaW5mLCBkc3QsIDAsIGRzdC5sZW5ndGgpOwotCQlpbmYuY2xvc2UoKTsKKwkJdHJ5IChJbnB1dFN0cmVhbSBpbmYgPSBpbmZsYXRlKHNyYywgaW5mbGF0ZWRTaXplKSkgeworCQkJSU8ucmVhZEZ1bGx5KGluZiwgZHN0LCAwLCBkc3QubGVuZ3RoKTsKKwkJfQogCQlyZXR1cm4gZHN0OwogCX0KIAotCXByaXZhdGUgSW5wdXRTdHJlYW0gaW5mbGF0ZShmaW5hbCBTb3VyY2Ugc3JjLCBmaW5hbCBsb25nIGluZmxhdGVkU2l6ZSkKKwlwcml2YXRlIElucHV0U3RyZWFtIGluZmxhdGUoU291cmNlIHNyYywgbG9uZyBpbmZsYXRlZFNpemUpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlpbmZsYXRlci5vcGVuKHNyYywgaW5mbGF0ZWRTaXplKTsKIAkJcmV0dXJuIGluZmxhdGVyOwpAQCAtMTY2NSw3ICsxNjYxLDcgQEAgcHJpdmF0ZSBJbnB1dFN0cmVhbSBpbmZsYXRlKGZpbmFsIFNvdXJjZSBzcmMsIGZpbmFsIGxvbmcgaW5mbGF0ZWRTaXplKQogCXByaXZhdGUgc3RhdGljIGNsYXNzIERlbHRhQ2hhaW4gZXh0ZW5kcyBPYmplY3RJZE93bmVyTWFwLkVudHJ5IHsKIAkJVW5yZXNvbHZlZERlbHRhIGhlYWQ7CiAKLQkJRGVsdGFDaGFpbihmaW5hbCBBbnlPYmplY3RJZCBpZCkgeworCQlEZWx0YUNoYWluKEFueU9iamVjdElkIGlkKSB7CiAJCQlzdXBlcihpZCk7CiAJCX0KIApAQCAtMTY3Niw3ICsxNjcyLDcgQEAgVW5yZXNvbHZlZERlbHRhIHJlbW92ZSgpIHsKIAkJCXJldHVybiByOwogCQl9CiAKLQkJdm9pZCBhZGQoZmluYWwgVW5yZXNvbHZlZERlbHRhIGQpIHsKKwkJdm9pZCBhZGQoVW5yZXNvbHZlZERlbHRhIGQpIHsKIAkJCWQubmV4dCA9IGhlYWQ7CiAJCQloZWFkID0gZDsKIAkJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUGFja2VkT2JqZWN0SW5mby5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUGFja2VkT2JqZWN0SW5mby5qYXZhCmluZGV4IDgwZmMwYjQuLjU5ZDFiNzggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1BhY2tlZE9iamVjdEluZm8uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QYWNrZWRPYmplY3RJbmZvLmphdmEKQEAgLTc1LDcgKzc1LDcgQEAgcHVibGljIGNsYXNzIFBhY2tlZE9iamVjdEluZm8gZXh0ZW5kcyBPYmplY3RJZE93bmVyTWFwLkVudHJ5IHsKIAkgKiBAcGFyYW0gaWQKIAkgKiAgICAgICAgICAgIHRoZSBpZGVudGl0eSBvZiB0aGUgb2JqZWN0IHRoZSBuZXcgaW5zdGFuY2UgdHJhY2tzLgogCSAqLwotCXB1YmxpYyBQYWNrZWRPYmplY3RJbmZvKGZpbmFsIEFueU9iamVjdElkIGlkKSB7CisJcHVibGljIFBhY2tlZE9iamVjdEluZm8oQW55T2JqZWN0SWQgaWQpIHsKIAkJc3VwZXIoaWQpOwogCX0KIApAQCAtOTUsNyArOTUsNyBAQCBwdWJsaWMgbG9uZyBnZXRPZmZzZXQoKSB7CiAJICogQHBhcmFtIG9mZnNldAogCSAqICAgICAgICAgICAgb2Zmc2V0IHdoZXJlIHdyaXR0ZW4gb2JqZWN0IHN0YXJ0cwogCSAqLwotCXB1YmxpYyB2b2lkIHNldE9mZnNldChmaW5hbCBsb25nIG9mZnNldCkgeworCXB1YmxpYyB2b2lkIHNldE9mZnNldChsb25nIG9mZnNldCkgewogCQl0aGlzLm9mZnNldCA9IG9mZnNldDsKIAl9CiAKQEAgLTExNiw3ICsxMTYsNyBAQCBwdWJsaWMgaW50IGdldENSQygpIHsKIAkgKiAgICAgICAgICAgIGluZmxhdGVkIGxlbmd0aCBhbmQgZGVsdGEgYmFzZSByZWZlcmVuY2UpIGFzIGNvbXB1dGVkIGJ5CiAJICogICAgICAgICAgICB7QGxpbmsgamF2YS51dGlsLnppcC5DUkMzMn0uCiAJICovCi0JcHVibGljIHZvaWQgc2V0Q1JDKGZpbmFsIGludCBjcmMpIHsKKwlwdWJsaWMgdm9pZCBzZXRDUkMoaW50IGNyYykgewogCQl0aGlzLmNyYyA9IGNyYzsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1BhY2tldExpbmVJbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUGFja2V0TGluZUluLmphdmEKaW5kZXggODcwNjRlMS4uY2M1NTZmOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUGFja2V0TGluZUluLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUGFja2V0TGluZUluLmphdmEKQEAgLTc0LDYgKzc0LDEzIEBAIHB1YmxpYyBjbGFzcyBQYWNrZXRMaW5lSW4gewogCS8qKiBNYWdpYyByZXR1cm4gZnJvbSB7QGxpbmsgI3JlYWRTdHJpbmcoKX0gd2hlbiBhIGZsdXNoIHBhY2tldCBpcyBmb3VuZC4gKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTkQgPSBuZXcgU3RyaW5nQnVpbGRlcigwKS50b1N0cmluZygpOyAJLyogbXVzdCBub3Qgc3RyaW5nIHBvb2wgKi8KIAorCS8qKgorCSAqIE1hZ2ljIHJldHVybiBmcm9tIHtAbGluayAjcmVhZFN0cmluZygpfSB3aGVuIGEgZGVsaW0gcGFja2V0IGlzIGZvdW5kLgorCSAqCisJICogQHNpbmNlIDUuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFTElNID0gbmV3IFN0cmluZ0J1aWxkZXIoMCkudG9TdHJpbmcoKTsgCS8qIG11c3Qgbm90IHN0cmluZyBwb29sICovCisKIAlzdGF0aWMgZW51bSBBY2tOYWNrUmVzdWx0IHsKIAkJLyoqIE5BSyAqLwogCQlOQUssCkBAIC0xMTUsNyArMTIyLDcgQEAgcHVibGljIFBhY2tldExpbmVJbihJbnB1dFN0cmVhbSBpbiwgbG9uZyBsaW1pdCkgewogCQl0aGlzLmxpbWl0ID0gbGltaXQ7CiAJfQogCi0JQWNrTmFja1Jlc3VsdCByZWFkQUNLKGZpbmFsIE11dGFibGVPYmplY3RJZCByZXR1cm5lZElkKSB0aHJvd3MgSU9FeGNlcHRpb24geworCUFja05hY2tSZXN1bHQgcmVhZEFDSyhNdXRhYmxlT2JqZWN0SWQgcmV0dXJuZWRJZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgU3RyaW5nIGxpbmUgPSByZWFkU3RyaW5nKCk7CiAJCWlmIChsaW5lLmxlbmd0aCgpID09IDApCiAJCQl0aHJvdyBuZXcgUGFja1Byb3RvY29sRXhjZXB0aW9uKEpHaXRUZXh0LmdldCgpLmV4cGVjdGVkQUNLTkFLRm91bmRFT0YpOwpAQCAtMTQ3LDYgKzE1NCw3IEBAIGVsc2UgaWYgKGFyZy5lcXVhbHMoIiByZWFkeSIpKSAvLyROT04tTkxTLTEkCiAJICogdXNlIHtAbGluayAjcmVhZFN0cmluZ1JhdygpfSBpbnN0ZWFkLgogCSAqCiAJICogQHJldHVybiB0aGUgc3RyaW5nLiB7QGxpbmsgI0VORH0gaWYgdGhlIHN0cmluZyB3YXMgdGhlIG1hZ2ljIGZsdXNoCisJICogICAgICAgICBwYWNrZXQsIHtAbGluayAjREVMSU19IGlmIHRoZSBzdHJpbmcgd2FzIHRoZSBtYWdpYyBERUxJTQogCSAqICAgICAgICAgcGFja2V0LgogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHRoZSBzdHJlYW0gY2Fubm90IGJlIHJlYWQuCkBAIC0xNTcsNiArMTY1LDEwIEBAIHB1YmxpYyBTdHJpbmcgcmVhZFN0cmluZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQlsb2cuZGVidWcoImdpdDwgMDAwMCIpOyAvLyROT04tTkxTLTEkCiAJCQlyZXR1cm4gRU5EOwogCQl9CisJCWlmIChsZW4gPT0gMSkgeworCQkJbG9nLmRlYnVnKCJnaXQ8IDAwMDEiKTsgLy8kTk9OLU5MUy0xJAorCQkJcmV0dXJuIERFTElNOworCQl9CiAKIAkJbGVuIC09IDQ7IC8vIGxlbmd0aCBoZWFkZXIgKDQgYnl0ZXMpCiAJCWlmIChsZW4gPT0gMCkgewpAQCAtMjMyLDYgKzI0NCw4IEBAIGludCByZWFkTGVuZ3RoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAogCQlpZiAobGVuID09IDApIHsKIAkJCXJldHVybiAwOworCQl9IGVsc2UgaWYgKGxlbiA9PSAxKSB7CisJCQlyZXR1cm4gMTsKIAkJfSBlbHNlIGlmIChsZW4gPCA0KSB7CiAJCQl0aHJvdyBpbnZhbGlkSGVhZGVyKCk7CiAJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1BhY2tldExpbmVPdXQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1BhY2tldExpbmVPdXQuamF2YQppbmRleCA0OGJkZDAxLi5hMjZkMWQ3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QYWNrZXRMaW5lT3V0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUGFja2V0TGluZU91dC5qYXZhCkBAIC03OCw3ICs3OCw3IEBAIHB1YmxpYyBjbGFzcyBQYWNrZXRMaW5lT3V0IHsKIAkgKiBAcGFyYW0gb3V0cHV0U3RyZWFtCiAJICogICAgICAgICAgICBzdHJlYW0uCiAJICovCi0JcHVibGljIFBhY2tldExpbmVPdXQoZmluYWwgT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSkgeworCXB1YmxpYyBQYWNrZXRMaW5lT3V0KE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0pIHsKIAkJb3V0ID0gb3V0cHV0U3RyZWFtOwogCQlsZW5idWZmZXIgPSBuZXcgYnl0ZVs1XTsKIAkJZmx1c2hPbkVuZCA9IHRydWU7CkBAIC0xMDQsNyArMTA0LDcgQEAgcHVibGljIHZvaWQgc2V0Rmx1c2hPbkVuZChib29sZWFuIGZsdXNoT25FbmQpIHsKIAkgKiAgICAgICAgICAgICB0aGUgcGFja2V0IGNvdWxkIG5vdCBiZSB3cml0dGVuLCB0aGUgc3RyZWFtIGlzIGNvcnJ1cHRlZCBhcwogCSAqICAgICAgICAgICAgIHRoZSBwYWNrZXQgbWF5IGhhdmUgYmVlbiBvbmx5IHBhcnRpYWxseSB3cml0dGVuLgogCSAqLwotCXB1YmxpYyB2b2lkIHdyaXRlU3RyaW5nKGZpbmFsIFN0cmluZyBzKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyB2b2lkIHdyaXRlU3RyaW5nKFN0cmluZyBzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl3cml0ZVBhY2tldChDb25zdGFudHMuZW5jb2RlKHMpKTsKIAl9CiAKQEAgLTE0Nyw2ICsxNDcsMjAgQEAgcHVibGljIHZvaWQgd3JpdGVQYWNrZXQoYnl0ZVtdIGJ1ZiwgaW50IHBvcywgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAl9CiAKIAkvKioKKwkgKiBXcml0ZSBhIHBhY2tldCBkZWxpbSBtYXJrZXIgKDAwMDEpLgorCSAqCisJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCisJICogICAgICAgICAgICAgdGhlIG1hcmtlciBjb3VsZCBub3QgYmUgd3JpdHRlbiwgdGhlIHN0cmVhbSBpcyBjb3JydXB0ZWQKKwkgKiAgICAgICAgICAgICBhcyB0aGUgbWFya2VyIG1heSBoYXZlIGJlZW4gb25seSBwYXJ0aWFsbHkgd3JpdHRlbi4KKwkgKiBAc2luY2UgNS4wCisJICovCisJcHVibGljIHZvaWQgd3JpdGVEZWxpbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWZvcm1hdExlbmd0aCgxKTsKKwkJb3V0LndyaXRlKGxlbmJ1ZmZlciwgMCwgNCk7CisJCWxvZy5kZWJ1ZygiZ2l0PiAwMDAxIik7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKioKIAkgKiBXcml0ZSBhIHBhY2tldCBlbmQgbWFya2VyLCBzb21ldGltZXMgcmVmZXJyZWQgdG8gYXMgYSBmbHVzaCBjb21tYW5kLgogCSAqIDxwPgogCSAqIFRlY2huaWNhbGx5IHRoaXMgaXMgYSBtYWdpY2FsIHBhY2tldCB0eXBlIHdoaWNoIGNhbiBiZSBkZXRlY3RlZApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUHJvZ3Jlc3NTcGlubmVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9Qcm9ncmVzc1NwaW5uZXIuamF2YQppbmRleCA0MWFmODA3Li4yMzY0NDM0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9Qcm9ncmVzc1NwaW5uZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9Qcm9ncmVzc1NwaW5uZXIuamF2YQpAQCAtNDMsNyArNDMsNyBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0OwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwpAQCAtMTQxLDcgKzE0MSw3IEBAIHB1YmxpYyB2b2lkIGVuZFRhc2soU3RyaW5nIHJlc3VsdCkgewogCXByaXZhdGUgdm9pZCB3cml0ZShTdHJpbmcgcykgewogCQlpZiAod3JpdGUpIHsKIAkJCXRyeSB7Ci0JCQkJb3V0LndyaXRlKHMuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJCQlvdXQud3JpdGUocy5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCQkJb3V0LmZsdXNoKCk7CiAJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAJCQkJd3JpdGUgPSBmYWxzZTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1B1c2hDZXJ0aWZpY2F0ZUlkZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QdXNoQ2VydGlmaWNhdGVJZGVudC5qYXZhCmluZGV4IGY5ZmRkYmUuLjE3OGM4MGQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1B1c2hDZXJ0aWZpY2F0ZUlkZW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUHVzaENlcnRpZmljYXRlSWRlbnQuamF2YQpAQCAtNDMsNyArNDMsNyBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0OwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5SYXdQYXJzZVV0aWxzLmxhc3RJbmRleE9mVHJpbTsKIAogaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OwpAQCAtOTUsNyArOTUsNyBAQCBwdWJsaWMgY2xhc3MgUHVzaENlcnRpZmljYXRlSWRlbnQgewogCSAqLwogCXB1YmxpYyBzdGF0aWMgUHVzaENlcnRpZmljYXRlSWRlbnQgcGFyc2UoU3RyaW5nIHN0cikgewogCQlNdXRhYmxlSW50ZWdlciBwID0gbmV3IE11dGFibGVJbnRlZ2VyKCk7Ci0JCWJ5dGVbXSByYXcgPSBzdHIuZ2V0Qnl0ZXMoVVRGXzgpOworCQlieXRlW10gcmF3ID0gc3RyLmdldEJ5dGVzKENIQVJTRVQpOwogCQlpbnQgdHpCZWdpbiA9IHJhdy5sZW5ndGggLSAxOwogCQl0ekJlZ2luID0gbGFzdEluZGV4T2ZUcmltKHJhdywgJyAnLCB0ekJlZ2luKTsKIAkJaWYgKHR6QmVnaW4gPCAwIHx8IHJhd1t0ekJlZ2luXSAhPSAnICcpIHsKQEAgLTEyOSw3ICsxMjksNyBAQCBwdWJsaWMgc3RhdGljIFB1c2hDZXJ0aWZpY2F0ZUlkZW50IHBhcnNlKFN0cmluZyBzdHIpIHsKIAkJCQlpZEVuZCA9IHJhdy5sZW5ndGg7CiAJCQl9CiAJCX0KLQkJU3RyaW5nIGlkID0gbmV3IFN0cmluZyhyYXcsIDAsIGlkRW5kLCBVVEZfOCk7CisJCVN0cmluZyBpZCA9IG5ldyBTdHJpbmcocmF3LCAwLCBpZEVuZCwgQ0hBUlNFVCk7CiAKIAkJcmV0dXJuIG5ldyBQdXNoQ2VydGlmaWNhdGVJZGVudChzdHIsIGlkLCB3aGVuICogMTAwMEwsIHR6KTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QdXNoQ2VydGlmaWNhdGVTdG9yZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUHVzaENlcnRpZmljYXRlU3RvcmUuamF2YQppbmRleCBhYjU4YTMzLi43ZjVhMzQwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QdXNoQ2VydGlmaWNhdGVTdG9yZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1B1c2hDZXJ0aWZpY2F0ZVN0b3JlLmphdmEKQEAgLTQzLDcgKzQzLDcgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuT0JKX0JMT0I7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5PQkpfQ09NTUlUOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5GaWxlTW9kZS5UWVBFX0ZJTEU7CkBAIC0xOTIsNyArMTkyLDcgQEAgcHVibGljIFB1c2hDZXJ0aWZpY2F0ZSBnZXQoU3RyaW5nIHJlZk5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJICogQHJldHVybiBpdGVyYWJsZSBvdmVyIGNlcnRpZmljYXRlczsgbXVzdCBiZSBmdWxseSBpdGVyYXRlZCBpbiBvcmRlciB0bwogCSAqICAgICAgICAgY2xvc2UgcmVzb3VyY2VzLgogCSAqLwotCXB1YmxpYyBJdGVyYWJsZTxQdXNoQ2VydGlmaWNhdGU+IGdldEFsbChmaW5hbCBTdHJpbmcgcmVmTmFtZSkgeworCXB1YmxpYyBJdGVyYWJsZTxQdXNoQ2VydGlmaWNhdGU+IGdldEFsbChTdHJpbmcgcmVmTmFtZSkgewogCQlyZXR1cm4gbmV3IEl0ZXJhYmxlPFB1c2hDZXJ0aWZpY2F0ZT4oKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJdGVyYXRvcjxQdXNoQ2VydGlmaWNhdGU+IGl0ZXJhdG9yKCkgewpAQCAtMjkyLDcgKzI5Miw3IEBAIHN0YXRpYyBQdXNoQ2VydGlmaWNhdGUgcmVhZChUcmVlV2FsayB0dykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJT2JqZWN0TG9hZGVyIGxvYWRlciA9CiAJCQkJdHcuZ2V0T2JqZWN0UmVhZGVyKCkub3Blbih0dy5nZXRPYmplY3RJZCgwKSwgT0JKX0JMT0IpOwogCQl0cnkgKElucHV0U3RyZWFtIGluID0gbG9hZGVyLm9wZW5TdHJlYW0oKTsKLQkJCQlSZWFkZXIgciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW4sIFVURl84KSkpIHsKKwkJCQlSZWFkZXIgciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW4sIENIQVJTRVQpKSkgewogCQkJcmV0dXJuIFB1c2hDZXJ0aWZpY2F0ZVBhcnNlci5mcm9tUmVhZGVyKHIpOwogCQl9CiAJfQpAQCAtNDczLDcgKzQ3Myw3IEBAIHByaXZhdGUgT2JqZWN0SWQgc2F2ZUNlcnQoT2JqZWN0SW5zZXJ0ZXIgaW5zZXJ0ZXIsIERpckNhY2hlIGRjLAogCiAJCURpckNhY2hlRWRpdG9yIGVkaXRvciA9IGRjLmVkaXRvcigpOwogCQlTdHJpbmcgY2VydFRleHQgPSBwYy5jZXJ0LnRvVGV4dCgpICsgcGMuY2VydC5nZXRTaWduYXR1cmUoKTsKLQkJZmluYWwgT2JqZWN0SWQgY2VydElkID0gaW5zZXJ0ZXIuaW5zZXJ0KE9CSl9CTE9CLCBjZXJ0VGV4dC5nZXRCeXRlcyhVVEZfOCkpOworCQlmaW5hbCBPYmplY3RJZCBjZXJ0SWQgPSBpbnNlcnRlci5pbnNlcnQoT0JKX0JMT0IsIGNlcnRUZXh0LmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJYm9vbGVhbiBhbnkgPSBmYWxzZTsKIAkJZm9yIChSZWNlaXZlQ29tbWFuZCBjbWQgOiBwYy5jZXJ0LmdldENvbW1hbmRzKCkpIHsKIAkJCWlmIChieVJlZiAhPSBudWxsICYmICFjb21tYW5kc0VxdWFsKGNtZCwgYnlSZWYuZ2V0KGNtZC5nZXRSZWZOYW1lKCkpKSkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUHVzaFByb2Nlc3MuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1B1c2hQcm9jZXNzLmphdmEKaW5kZXggMzIwMTczMi4uNDcwYTNjMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUHVzaFByb2Nlc3MuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QdXNoUHJvY2Vzcy5qYXZhCkBAIC00OCw3ICs0OCw3IEBACiBpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKQEAgLTEyNCwxMCArMTI0LDEwIEBAIGNsYXNzIFB1c2hQcm9jZXNzIHsKIAkJCXRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24gewogCQl0aGlzLndhbGtlciA9IG5ldyBSZXZXYWxrKHRyYW5zcG9ydC5sb2NhbCk7CiAJCXRoaXMudHJhbnNwb3J0ID0gdHJhbnNwb3J0OwotCQl0aGlzLnRvUHVzaCA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJdGhpcy50b1B1c2ggPSBuZXcgTGlua2VkSGFzaE1hcDw+KCk7CiAJCXRoaXMub3V0ID0gb3V0OwogCQl0aGlzLnB1c2hPcHRpb25zID0gdHJhbnNwb3J0LmdldFB1c2hPcHRpb25zKCk7Ci0JCWZvciAoZmluYWwgUmVtb3RlUmVmVXBkYXRlIHJydSA6IHRvUHVzaCkgeworCQlmb3IgKFJlbW90ZVJlZlVwZGF0ZSBycnUgOiB0b1B1c2gpIHsKIAkJCWlmICh0aGlzLnRvUHVzaC5wdXQocnJ1LmdldFJlbW90ZU5hbWUoKSwgcnJ1KSAhPSBudWxsKQogCQkJCXRocm93IG5ldyBUcmFuc3BvcnRFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCiAJCQkJCQlKR2l0VGV4dC5nZXQoKS5kdXBsaWNhdGVSZW1vdGVSZWZVcGRhdGVJc0lsbGVnYWwsIHJydS5nZXRSZW1vdGVOYW1lKCkpKTsKQEAgLTE1MCw3ICsxNTAsNyBAQCBjbGFzcyBQdXNoUHJvY2VzcyB7CiAJICogICAgICAgICAgICAgd2hlbiBzb21lIGVycm9yIG9jY3VycmVkIGR1cmluZyBvcGVyYXRpb24sIGxpa2UgSS9PLCBwcm90b2NvbAogCSAqICAgICAgICAgICAgIGVycm9yLCBvciBsb2NhbCBkYXRhYmFzZSBjb25zaXN0ZW5jeSBlcnJvci4KIAkgKi8KLQlQdXNoUmVzdWx0IGV4ZWN1dGUoZmluYWwgUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCisJUHVzaFJlc3VsdCBleGVjdXRlKFByb2dyZXNzTW9uaXRvciBtb25pdG9yKQogCQkJdGhyb3dzIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiwgVHJhbnNwb3J0RXhjZXB0aW9uIHsKIAkJdHJ5IHsKIAkJCW1vbml0b3IuYmVnaW5UYXNrKFBST0dSRVNTX09QRU5JTkdfQ09OTkVDVElPTiwKQEAgLTE3Niw3ICsxNzYsNyBAQCBlbHNlIGlmICghcHJlcHJvY2Vzc2VkLmlzRW1wdHkoKSkKIAkJCX0KIAkJCWlmICghdHJhbnNwb3J0LmlzRHJ5UnVuKCkpCiAJCQkJdXBkYXRlVHJhY2tpbmdSZWZzKCk7Ci0JCQlmb3IgKGZpbmFsIFJlbW90ZVJlZlVwZGF0ZSBycnUgOiB0b1B1c2gudmFsdWVzKCkpIHsKKwkJCWZvciAoUmVtb3RlUmVmVXBkYXRlIHJydSA6IHRvUHVzaC52YWx1ZXMoKSkgewogCQkJCWZpbmFsIFRyYWNraW5nUmVmVXBkYXRlIHRydSA9IHJydS5nZXRUcmFja2luZ1JlZlVwZGF0ZSgpOwogCQkJCWlmICh0cnUgIT0gbnVsbCkKIAkJCQkJcmVzLmFkZCh0cnUpOwpAQCAtMTkwLDggKzE5MCw4IEBAIGVsc2UgaWYgKCFwcmVwcm9jZXNzZWQuaXNFbXB0eSgpKQogCXByaXZhdGUgTWFwPFN0cmluZywgUmVtb3RlUmVmVXBkYXRlPiBwcmVwYXJlUmVtb3RlVXBkYXRlcygpCiAJCQl0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKIAkJYm9vbGVhbiBhdG9taWMgPSB0cmFuc3BvcnQuaXNQdXNoQXRvbWljKCk7Ci0JCWZpbmFsIE1hcDxTdHJpbmcsIFJlbW90ZVJlZlVwZGF0ZT4gcmVzdWx0ID0gbmV3IEhhc2hNYXA8PigpOwotCQlmb3IgKGZpbmFsIFJlbW90ZVJlZlVwZGF0ZSBycnUgOiB0b1B1c2gudmFsdWVzKCkpIHsKKwkJZmluYWwgTWFwPFN0cmluZywgUmVtb3RlUmVmVXBkYXRlPiByZXN1bHQgPSBuZXcgTGlua2VkSGFzaE1hcDw+KCk7CisJCWZvciAoUmVtb3RlUmVmVXBkYXRlIHJydSA6IHRvUHVzaC52YWx1ZXMoKSkgewogCQkJZmluYWwgUmVmIGFkdmVydGlzZWRSZWYgPSBjb25uZWN0aW9uLmdldFJlZihycnUuZ2V0UmVtb3RlTmFtZSgpKTsKIAkJCU9iamVjdElkIGFkdmVydGlzZWRPbGQgPSBudWxsOwogCQkJaWYgKGFkdmVydGlzZWRSZWYgIT0gbnVsbCkgewpAQCAtMjc3LDEzICsyNzcsMTMgQEAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBSZW1vdGVSZWZVcGRhdGU+IHJlamVjdEFsbCgpIHsKIAl9CiAKIAlwcml2YXRlIHZvaWQgbW9kaWZ5VXBkYXRlc0ZvckRyeVJ1bigpIHsKLQkJZm9yIChmaW5hbCBSZW1vdGVSZWZVcGRhdGUgcnJ1IDogdG9QdXNoLnZhbHVlcygpKQorCQlmb3IgKFJlbW90ZVJlZlVwZGF0ZSBycnUgOiB0b1B1c2gudmFsdWVzKCkpCiAJCQlpZiAocnJ1LmdldFN0YXR1cygpID09IFN0YXR1cy5OT1RfQVRURU1QVEVEKQogCQkJCXJydS5zZXRTdGF0dXMoU3RhdHVzLk9LKTsKIAl9CiAKIAlwcml2YXRlIHZvaWQgdXBkYXRlVHJhY2tpbmdSZWZzKCkgewotCQlmb3IgKGZpbmFsIFJlbW90ZVJlZlVwZGF0ZSBycnUgOiB0b1B1c2gudmFsdWVzKCkpIHsKKwkJZm9yIChSZW1vdGVSZWZVcGRhdGUgcnJ1IDogdG9QdXNoLnZhbHVlcygpKSB7CiAJCQlmaW5hbCBTdGF0dXMgc3RhdHVzID0gcnJ1LmdldFN0YXR1cygpOwogCQkJaWYgKHJydS5oYXNUcmFja2luZ1JlZlVwZGF0ZSgpCiAJCQkJCSYmIChzdGF0dXMgPT0gU3RhdHVzLlVQX1RPX0RBVEUgfHwgc3RhdHVzID09IFN0YXR1cy5PSykpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1B1c2hSZXN1bHQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1B1c2hSZXN1bHQuamF2YQppbmRleCA4YmFlNWE1Li41NDUyNzA0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QdXNoUmVzdWx0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUHVzaFJlc3VsdC5qYXZhCkBAIC04Miw3ICs4Miw3IEBAIHB1YmxpYyBDb2xsZWN0aW9uPFJlbW90ZVJlZlVwZGF0ZT4gZ2V0UmVtb3RlVXBkYXRlcygpIHsKIAkgKiAgICAgICAgICAgIHJlbW90ZSByZWYgbmFtZQogCSAqIEByZXR1cm4gc3RhdHVzIG9mIHJlbW90ZSByZWYgdXBkYXRlCiAJICovCi0JcHVibGljIFJlbW90ZVJlZlVwZGF0ZSBnZXRSZW1vdGVVcGRhdGUoZmluYWwgU3RyaW5nIHJlZk5hbWUpIHsKKwlwdWJsaWMgUmVtb3RlUmVmVXBkYXRlIGdldFJlbW90ZVVwZGF0ZShTdHJpbmcgcmVmTmFtZSkgewogCQlyZXR1cm4gcmVtb3RlVXBkYXRlcy5nZXQocmVmTmFtZSk7CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9SZWNlaXZlQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVjZWl2ZUNvbW1hbmQuamF2YQppbmRleCBlMTRkMThmLi5kNjFhZWIwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9SZWNlaXZlQ29tbWFuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlY2VpdmVDb21tYW5kLmphdmEKQEAgLTcxMyw3ICs3MTMsNyBAQCBwdWJsaWMgQm9vbGVhbiBpc0ZvcmNlUmVmTG9nKCkgewogCSAqIEBwYXJhbSBzCiAJICogICAgICAgICAgICB0aGUgbmV3IHN0YXR1cyBjb2RlIGZvciB0aGlzIGNvbW1hbmQuCiAJICovCi0JcHVibGljIHZvaWQgc2V0UmVzdWx0KGZpbmFsIFJlc3VsdCBzKSB7CisJcHVibGljIHZvaWQgc2V0UmVzdWx0KFJlc3VsdCBzKSB7CiAJCXNldFJlc3VsdChzLCBudWxsKTsKIAl9CiAKQEAgLTcyNSw3ICs3MjUsNyBAQCBwdWJsaWMgdm9pZCBzZXRSZXN1bHQoZmluYWwgUmVzdWx0IHMpIHsKIAkgKiBAcGFyYW0gbQogCSAqICAgICAgICAgICAgb3B0aW9uYWwgbWVzc2FnZSBleHBsYWluaW5nIHRoZSBuZXcgc3RhdHVzLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlc3VsdChmaW5hbCBSZXN1bHQgcywgZmluYWwgU3RyaW5nIG0pIHsKKwlwdWJsaWMgdm9pZCBzZXRSZXN1bHQoUmVzdWx0IHMsIFN0cmluZyBtKSB7CiAJCXN0YXR1cyA9IHM7CiAJCW1lc3NhZ2UgPSBtOwogCX0KQEAgLTc3MCw3ICs3NzAsNyBAQCBwdWJsaWMgdm9pZCB1cGRhdGVUeXBlKFJldldhbGsgd2FsaykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkgKiAgICAgICAgICAgIHJlY2VpdmUtcGFjayBzZXNzaW9uLgogCSAqIEBzaW5jZSAyLjAKIAkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKGZpbmFsIEJhc2VSZWNlaXZlUGFjayBycCkgeworCXB1YmxpYyB2b2lkIGV4ZWN1dGUoQmFzZVJlY2VpdmVQYWNrIHJwKSB7CiAJCXRyeSB7CiAJCQlTdHJpbmcgZXhwVGFyZ2V0ID0gZ2V0T2xkU3ltcmVmKCk7CiAJCQlib29sZWFuIGRldGFjaCA9IGdldE5ld1N5bXJlZigpICE9IG51bGwKQEAgLTgxOCwxMSArODE4LDExIEBAIHB1YmxpYyB2b2lkIGV4ZWN1dGUoZmluYWwgQmFzZVJlY2VpdmVQYWNrIHJwKSB7CiAJCX0KIAl9CiAKLQl2b2lkIHNldFJlZihmaW5hbCBSZWYgcikgeworCXZvaWQgc2V0UmVmKFJlZiByKSB7CiAJCXJlZiA9IHI7CiAJfQogCi0Jdm9pZCBzZXRUeXBlKGZpbmFsIFR5cGUgdCkgeworCXZvaWQgc2V0VHlwZShUeXBlIHQpIHsKIAkJdHlwZSA9IHQ7CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9SZWNlaXZlUGFjay5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVjZWl2ZVBhY2suamF2YQppbmRleCA3YzVmMzJhLi4zNWZiMGIxNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVjZWl2ZVBhY2suamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9SZWNlaXZlUGFjay5qYXZhCkBAIC04OCw3ICs4OCw3IEBAIHB1YmxpYyBjbGFzcyBSZWNlaXZlUGFjayBleHRlbmRzIEJhc2VSZWNlaXZlUGFjayB7CiAJICogQHBhcmFtIGludG8KIAkgKiAgICAgICAgICAgIHRoZSBkZXN0aW5hdGlvbiByZXBvc2l0b3J5LgogCSAqLwotCXB1YmxpYyBSZWNlaXZlUGFjayhmaW5hbCBSZXBvc2l0b3J5IGludG8pIHsKKwlwdWJsaWMgUmVjZWl2ZVBhY2soUmVwb3NpdG9yeSBpbnRvKSB7CiAJCXN1cGVyKGludG8pOwogCQlwcmVSZWNlaXZlID0gUHJlUmVjZWl2ZUhvb2suTlVMTDsKIAkJcG9zdFJlY2VpdmUgPSBQb3N0UmVjZWl2ZUhvb2suTlVMTDsKQEAgLTE1NCw3ICsxNTQsNyBAQCBwdWJsaWMgUHJlUmVjZWl2ZUhvb2sgZ2V0UHJlUmVjZWl2ZUhvb2soKSB7CiAJICogQHBhcmFtIGgKIAkgKiAgICAgICAgICAgIHRoZSBob29rIGluc3RhbmNlOyBtYXkgYmUgbnVsbCB0byBkaXNhYmxlIHRoZSBob29rLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZVJlY2VpdmVIb29rKGZpbmFsIFByZVJlY2VpdmVIb29rIGgpIHsKKwlwdWJsaWMgdm9pZCBzZXRQcmVSZWNlaXZlSG9vayhQcmVSZWNlaXZlSG9vayBoKSB7CiAJCXByZVJlY2VpdmUgPSBoICE9IG51bGwgPyBoIDogUHJlUmVjZWl2ZUhvb2suTlVMTDsKIAl9CiAKQEAgLTE3OCw3ICsxNzgsNyBAQCBwdWJsaWMgUG9zdFJlY2VpdmVIb29rIGdldFBvc3RSZWNlaXZlSG9vaygpIHsKIAkgKiBAcGFyYW0gaAogCSAqICAgICAgICAgICAgdGhlIGhvb2sgaW5zdGFuY2U7IG1heSBiZSBudWxsIHRvIGRpc2FibGUgdGhlIGhvb2suCiAJICovCi0JcHVibGljIHZvaWQgc2V0UG9zdFJlY2VpdmVIb29rKGZpbmFsIFBvc3RSZWNlaXZlSG9vayBoKSB7CisJcHVibGljIHZvaWQgc2V0UG9zdFJlY2VpdmVIb29rKFBvc3RSZWNlaXZlSG9vayBoKSB7CiAJCXBvc3RSZWNlaXZlID0gaCAhPSBudWxsID8gaCA6IFBvc3RSZWNlaXZlSG9vay5OVUxMOwogCX0KIApAQCAtMjg4LDcgKzI4OCw3IEBAIHByaXZhdGUgdm9pZCBzZXJ2aWNlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCQlpZiAoZWNob0NvbW1hbmRGYWlsdXJlcyAmJiBtc2dPdXQgIT0gbnVsbCkgewogCQkJCQlzZW5kU3RhdHVzUmVwb3J0KGZhbHNlLCB1bnBhY2tFcnJvciwgbmV3IFJlcG9ydGVyKCkgewogCQkJCQkJQE92ZXJyaWRlCi0JCQkJCQl2b2lkIHNlbmRTdHJpbmcoZmluYWwgU3RyaW5nIHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCQkJCQl2b2lkIHNlbmRTdHJpbmcoU3RyaW5nIHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQkJCQkJbXNnT3V0LndyaXRlKENvbnN0YW50cy5lbmNvZGUocyArICJcbiIpKTsgLy8kTk9OLU5MUy0xJAogCQkJCQkJfQogCQkJCQl9KTsKQEAgLTMwMSw3ICszMDEsNyBAQCB2b2lkIHNlbmRTdHJpbmcoZmluYWwgU3RyaW5nIHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQkJfQogCQkJCXNlbmRTdGF0dXNSZXBvcnQodHJ1ZSwgdW5wYWNrRXJyb3IsIG5ldyBSZXBvcnRlcigpIHsKIAkJCQkJQE92ZXJyaWRlCi0JCQkJCXZvaWQgc2VuZFN0cmluZyhmaW5hbCBTdHJpbmcgcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJCQkJdm9pZCBzZW5kU3RyaW5nKFN0cmluZyBzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJCQkJcGNrT3V0LndyaXRlU3RyaW5nKHMgKyAiXG4iKTsgLy8kTk9OLU5MUy0xJAogCQkJCQl9CiAJCQkJfSk7CkBAIC0zMDksNyArMzA5LDcgQEAgdm9pZCBzZW5kU3RyaW5nKGZpbmFsIFN0cmluZyBzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJfSBlbHNlIGlmIChtc2dPdXQgIT0gbnVsbCkgewogCQkJCXNlbmRTdGF0dXNSZXBvcnQoZmFsc2UsIHVucGFja0Vycm9yLCBuZXcgUmVwb3J0ZXIoKSB7CiAJCQkJCUBPdmVycmlkZQotCQkJCQl2b2lkIHNlbmRTdHJpbmcoZmluYWwgU3RyaW5nIHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCQkJCXZvaWQgc2VuZFN0cmluZyhTdHJpbmcgcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCQkJCW1zZ091dC53cml0ZShDb25zdGFudHMuZW5jb2RlKHMgKyAiXG4iKSk7IC8vJE5PTi1OTFMtMSQKIAkJCQkJfQogCQkJCX0pOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVmQWR2ZXJ0aXNlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVmQWR2ZXJ0aXNlci5qYXZhCmluZGV4IDVlYjE2NjEuLmRjMTg3MWIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlZkFkdmVydGlzZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9SZWZBZHZlcnRpc2VyLmphdmEKQEAgLTQzLDcgKzQzLDcgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuT0JKRUNUX0lEX1NUUklOR19MRU5HVEg7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LkdpdFByb3RvY29sQ29uc3RhbnRzLk9QVElPTl9TWU1SRUY7CiAKQEAgLTUzLDExICs1MywxMiBAQAogaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcmFjdGVyQ29kaW5nRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldEVuY29kZXI7CiBpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5Db2RlclJlc3VsdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNvcnRlZE1hcDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkFueU9iamVjdElkOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50czsKQEAgLTY1LDcgKzY2LDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWY7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmQ29tcGFyYXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5SZWZNYXA7CiAKIC8qKgogICogU3VwcG9ydCBmb3IgdGhlIHN0YXJ0IG9mIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5VcGxvYWRQYWNrfSBhbmQKQEAgLTc0LDcgKzc0LDcgQEAKIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZWZBZHZlcnRpc2VyIHsKIAkvKiogQWR2ZXJ0aXNlciB3aGljaCBmcmFtZXMgbGluZXMgaW4gYSB7QGxpbmsgUGFja2V0TGluZU91dH0gZm9ybWF0LiAqLwogCXB1YmxpYyBzdGF0aWMgY2xhc3MgUGFja2V0TGluZU91dFJlZkFkdmVydGlzZXIgZXh0ZW5kcyBSZWZBZHZlcnRpc2VyIHsKLQkJcHJpdmF0ZSBmaW5hbCBDaGFyc2V0RW5jb2RlciB1dGY4ID0gVVRGXzgubmV3RW5jb2RlcigpOworCQlwcml2YXRlIGZpbmFsIENoYXJzZXRFbmNvZGVyIHV0ZjggPSBDSEFSU0VULm5ld0VuY29kZXIoKTsKIAkJcHJpdmF0ZSBmaW5hbCBQYWNrZXRMaW5lT3V0IHBja091dDsKIAogCQlwcml2YXRlIGJ5dGVbXSBiaW5BcnIgPSBuZXcgYnl0ZVsyNTZdOwpAQCAtMTUyLDcgKzE1Miw3IEBAIHByaXZhdGUgdm9pZCBncm93KCkgewogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIHdyaXRlT25lKGZpbmFsIENoYXJTZXF1ZW5jZSBsaW5lKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlwcm90ZWN0ZWQgdm9pZCB3cml0ZU9uZShDaGFyU2VxdWVuY2UgbGluZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCXBja091dC53cml0ZVN0cmluZyhsaW5lLnRvU3RyaW5nKCkpOwogCQl9CiAKQEAgLTE3Niw2ICsxNzYsMTEgQEAgcHJvdGVjdGVkIHZvaWQgZW5kKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAogCWJvb2xlYW4gZmlyc3QgPSB0cnVlOwogCisJcHJpdmF0ZSBib29sZWFuIHVzZVByb3RvY29sVjI7CisKKwkvKiBvbmx5IHVzZWQgaW4gcHJvdG9jb2wgdjIgKi8KKwlwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gc3ltcmVmcyA9IG5ldyBIYXNoTWFwPD4oKTsKKwogCS8qKgogCSAqIEluaXRpYWxpemUgdGhpcyBhZHZlcnRpc2VyIHdpdGggYSByZXBvc2l0b3J5IGZvciBwZWVsaW5nIHRhZ3MuCiAJICoKQEAgLTE4Nyw2ICsxOTIsMTYgQEAgcHVibGljIHZvaWQgaW5pdChSZXBvc2l0b3J5IHNyYykgewogCX0KIAogCS8qKgorCSAqIEBwYXJhbSBiCisJICogICAgICAgICAgICAgIHRydWUgaWYgdGhpcyBhZHZlcnRpc2VyIHNob3VsZCBhZHZlcnRpc2UgdXNpbmcgdGhlIHByb3RvY29sCisJICogICAgICAgICAgICAgIHYyIGZvcm1hdCwgZmFsc2Ugb3RoZXJ3aXNlCisJICogQHNpbmNlIDUuMAorCSAqLworCXB1YmxpYyB2b2lkIHNldFVzZVByb3RvY29sVjIoYm9vbGVhbiBiKSB7CisJCXVzZVByb3RvY29sVjIgPSBiOworCX0KKworCS8qKgogCSAqIFRvZ2dsZSB0YWcgcGVlbGluZy4KIAkgKiA8cD4KIAkgKiA8cD4KQEAgLTE5OSw3ICsyMTQsNyBAQCBwdWJsaWMgdm9pZCBpbml0KFJlcG9zaXRvcnkgc3JjKSB7CiAJICogICAgICAgICAgICB0cnVlIHRvIHNob3cgdGhlIGRlcmVmZXJlbmNlZCB2YWx1ZSBvZiBhIHRhZyBhcyB0aGUgc3BlY2lhbAogCSAqICAgICAgICAgICAgcmVmIDxjb2RlPiR0YWdee308L2NvZGU+IDsgZmFsc2UgdG8gb21pdCBpdCBmcm9tIHRoZSBvdXRwdXQuCiAJICovCi0JcHVibGljIHZvaWQgc2V0RGVyZWZUYWdzKGZpbmFsIGJvb2xlYW4gZGVyZWYpIHsKKwlwdWJsaWMgdm9pZCBzZXREZXJlZlRhZ3MoYm9vbGVhbiBkZXJlZikgewogCQlkZXJlZlRhZ3MgPSBkZXJlZjsKIAl9CiAKQEAgLTI1Myw3ICsyNjgsMTEgQEAgcHVibGljIHZvaWQgYWR2ZXJ0aXNlQ2FwYWJpbGl0eShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7CiAJICogQHNpbmNlIDMuNgogCSAqLwogCXB1YmxpYyB2b2lkIGFkZFN5bXJlZihTdHJpbmcgZnJvbSwgU3RyaW5nIHRvKSB7Ci0JCWFkdmVydGlzZUNhcGFiaWxpdHkoT1BUSU9OX1NZTVJFRiwgZnJvbSArICc6JyArIHRvKTsKKwkJaWYgKHVzZVByb3RvY29sVjIpIHsKKwkJCXN5bXJlZnMucHV0KGZyb20sIHRvKTsKKwkJfSBlbHNlIHsKKwkJCWFkdmVydGlzZUNhcGFiaWxpdHkoT1BUSU9OX1NZTVJFRiwgZnJvbSArICc6JyArIHRvKTsKKwkJfQogCX0KIAogCS8qKgpAQCAtMjY3LDEzICsyODYsNTUgQEAgcHVibGljIHZvaWQgYWRkU3ltcmVmKFN0cmluZyBmcm9tLCBTdHJpbmcgdG8pIHsKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0aGUgdW5kZXJseWluZyBvdXRwdXQgc3RyZWFtIGZhaWxlZCB0byB3cml0ZSBvdXQgYW4KIAkgKiAgICAgICAgICAgICBhZHZlcnRpc2VtZW50IHJlY29yZC4KKwkgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNzZW5kKENvbGxlY3Rpb24pfSBpbnN0ZWFkLgogCSAqLworCUBEZXByZWNhdGVkCiAJcHVibGljIFNldDxPYmplY3RJZD4gc2VuZChNYXA8U3RyaW5nLCBSZWY+IHJlZnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZvciAoUmVmIHJlZiA6IGdldFNvcnRlZFJlZnMocmVmcykpIHsKLQkJCWlmIChyZWYuZ2V0T2JqZWN0SWQoKSA9PSBudWxsKQotCQkJCWNvbnRpbnVlOworCQlyZXR1cm4gc2VuZChyZWZzLnZhbHVlcygpKTsKKwl9CiAKLQkJCWFkdmVydGlzZUFueShyZWYuZ2V0T2JqZWN0SWQoKSwgcmVmLmdldE5hbWUoKSk7CisJLyoqCisJICogRm9ybWF0IGFuIGFkdmVydGlzZW1lbnQgZm9yIHRoZSBzdXBwbGllZCByZWZzLgorCSAqCisJICogQHBhcmFtIHJlZnMKKwkgKiAgICAgICAgICAgIHplcm8gb3IgbW9yZSByZWZzIHRvIGZvcm1hdCBmb3IgdGhlIGNsaWVudC4gVGhlIGNvbGxlY3Rpb24gaXMKKwkgKiAgICAgICAgICAgIHNvcnRlZCBiZWZvcmUgZGlzcGxheSBpZiBuZWNlc3NhcnksIGFuZCB0aGVyZWZvcmUgbWF5IGFwcGVhcgorCSAqICAgICAgICAgICAgaW4gYW55IG9yZGVyLgorCSAqIEByZXR1cm4gc2V0IG9mIE9iamVjdElkcyB0aGF0IHdlcmUgYWR2ZXJ0aXNlZCB0byB0aGUgY2xpZW50LgorCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgorCSAqICAgICAgICAgICAgIHRoZSB1bmRlcmx5aW5nIG91dHB1dCBzdHJlYW0gZmFpbGVkIHRvIHdyaXRlIG91dCBhbgorCSAqICAgICAgICAgICAgIGFkdmVydGlzZW1lbnQgcmVjb3JkLgorCSAqIEBzaW5jZSA1LjAKKwkgKi8KKwlwdWJsaWMgU2V0PE9iamVjdElkPiBzZW5kKENvbGxlY3Rpb248UmVmPiByZWZzKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlmb3IgKFJlZiByZWYgOiBSZWZDb21wYXJhdG9yLnNvcnQocmVmcykpIHsKKwkJCS8vIFRPRE8oanJuKSByZXZpdmUgdGhlIFNvcnRlZE1hcCBvcHRpbWl6YXRpb24gZS5nLiBieSBpbnRyb2R1Y2luZworCQkJLy8gU29ydGVkTGlzdAorCQkJT2JqZWN0SWQgb2JqZWN0SWQgPSByZWYuZ2V0T2JqZWN0SWQoKTsKKwkJCWlmIChvYmplY3RJZCA9PSBudWxsKSB7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWlmICh1c2VQcm90b2NvbFYyKSB7CisJCQkJU3RyaW5nIHN5bXJlZlBhcnQgPSBzeW1yZWZzLmNvbnRhaW5zS2V5KHJlZi5nZXROYW1lKCkpCisJCQkJCQk/ICgiIHN5bXJlZi10YXJnZXQ6IiArIHN5bXJlZnMuZ2V0KHJlZi5nZXROYW1lKCkpKSAvLyROT04tTkxTLTEkCisJCQkJCQk6ICIiOyAvLyROT04tTkxTLTEkCisJCQkJU3RyaW5nIHBlZWxQYXJ0ID0gIiI7IC8vJE5PTi1OTFMtMSQKKwkJCQlpZiAoZGVyZWZUYWdzKSB7CisJCQkJCWlmICghcmVmLmlzUGVlbGVkKCkgJiYgcmVwb3NpdG9yeSAhPSBudWxsKSB7CisJCQkJCQlyZWYgPSByZXBvc2l0b3J5LmdldFJlZkRhdGFiYXNlKCkucGVlbChyZWYpOworCQkJCQl9CisJCQkJCU9iamVjdElkIHBlZWxlZE9iamVjdElkID0gcmVmLmdldFBlZWxlZE9iamVjdElkKCk7CisJCQkJCWlmIChwZWVsZWRPYmplY3RJZCAhPSBudWxsKSB7CisJCQkJCQlwZWVsUGFydCA9ICIgcGVlbGVkOiIgKyBwZWVsZWRPYmplY3RJZC5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJfQorCQkJCX0KKwkJCQl3cml0ZU9uZShvYmplY3RJZC5nZXROYW1lKCkgKyAiICIgKyByZWYuZ2V0TmFtZSgpICsgc3ltcmVmUGFydCAvLyROT04tTkxTLTEkCisJCQkJCQkrIHBlZWxQYXJ0ICsgIlxuIik7IC8vJE5PTi1OTFMtMSQKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJYWR2ZXJ0aXNlQW55KG9iamVjdElkLCByZWYuZ2V0TmFtZSgpKTsKIAogCQkJaWYgKCFkZXJlZlRhZ3MpCiAJCQkJY29udGludWU7CkBAIC0yODEsNyArMzQyLDcgQEAgcHVibGljIFNldDxPYmplY3RJZD4gc2VuZChNYXA8U3RyaW5nLCBSZWY+IHJlZnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQlpZiAoIXJlZi5pc1BlZWxlZCgpKSB7CiAJCQkJaWYgKHJlcG9zaXRvcnkgPT0gbnVsbCkKIAkJCQkJY29udGludWU7Ci0JCQkJcmVmID0gcmVwb3NpdG9yeS5wZWVsKHJlZik7CisJCQkJcmVmID0gcmVwb3NpdG9yeS5nZXRSZWZEYXRhYmFzZSgpLnBlZWwocmVmKTsKIAkJCX0KIAogCQkJaWYgKHJlZi5nZXRQZWVsZWRPYmplY3RJZCgpICE9IG51bGwpCkBAIC0yOTAsMTMgKzM1MSw2IEBAIHB1YmxpYyBTZXQ8T2JqZWN0SWQ+IHNlbmQoTWFwPFN0cmluZywgUmVmPiByZWZzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlyZXR1cm4gc2VudDsKIAl9CiAKLQlwcml2YXRlIEl0ZXJhYmxlPFJlZj4gZ2V0U29ydGVkUmVmcyhNYXA8U3RyaW5nLCBSZWY+IGFsbCkgewotCQlpZiAoYWxsIGluc3RhbmNlb2YgUmVmTWFwCi0JCQkJfHwgKGFsbCBpbnN0YW5jZW9mIFNvcnRlZE1hcCAmJiAoKFNvcnRlZE1hcCkgYWxsKS5jb21wYXJhdG9yKCkgPT0gbnVsbCkpCi0JCQlyZXR1cm4gYWxsLnZhbHVlcygpOwotCQlyZXR1cm4gUmVmQ29tcGFyYXRvci5zb3J0KGFsbC52YWx1ZXMoKSk7Ci0JfQotCiAJLyoqCiAJICogQWR2ZXJ0aXNlIG9uZSBvYmplY3QgaXMgYXZhaWxhYmxlIHVzaW5nIHRoZSBtYWdpYyB7QGNvZGUgLmhhdmV9LgogCSAqIDxwPgpAQCAtMzI0LDEzICszNzgsMTMgQEAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKIAkJcmV0dXJuIGZpcnN0OwogCX0KIAotCXByaXZhdGUgdm9pZCBhZHZlcnRpc2VBbnlPbmNlKEFueU9iamVjdElkIG9iaiwgZmluYWwgU3RyaW5nIHJlZk5hbWUpCisJcHJpdmF0ZSB2b2lkIGFkdmVydGlzZUFueU9uY2UoQW55T2JqZWN0SWQgb2JqLCBTdHJpbmcgcmVmTmFtZSkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWlmICghc2VudC5jb250YWlucyhvYmopKQogCQkJYWR2ZXJ0aXNlQW55KG9iaiwgcmVmTmFtZSk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGFkdmVydGlzZUFueShBbnlPYmplY3RJZCBvYmosIGZpbmFsIFN0cmluZyByZWZOYW1lKQorCXByaXZhdGUgdm9pZCBhZHZlcnRpc2VBbnkoQW55T2JqZWN0SWQgb2JqLCBTdHJpbmcgcmVmTmFtZSkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXNlbnQuYWRkKG9iai50b09iamVjdElkKCkpOwogCQlhZHZlcnRpc2VJZChvYmosIHJlZk5hbWUpOwpAQCAtMzUxLDcgKzQwNSw3IEBAIHByaXZhdGUgdm9pZCBhZHZlcnRpc2VBbnkoQW55T2JqZWN0SWQgb2JqLCBmaW5hbCBTdHJpbmcgcmVmTmFtZSkKIAkgKiAgICAgICAgICAgICB0aGUgdW5kZXJseWluZyBvdXRwdXQgc3RyZWFtIGZhaWxlZCB0byB3cml0ZSBvdXQgYW4KIAkgKiAgICAgICAgICAgICBhZHZlcnRpc2VtZW50IHJlY29yZC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBhZHZlcnRpc2VJZChmaW5hbCBBbnlPYmplY3RJZCBpZCwgZmluYWwgU3RyaW5nIHJlZk5hbWUpCisJcHVibGljIHZvaWQgYWR2ZXJ0aXNlSWQoQW55T2JqZWN0SWQgaWQsIFN0cmluZyByZWZOYW1lKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJdG1wTGluZS5zZXRMZW5ndGgoMCk7CiAJCWlkLmNvcHlUbyh0bXBJZCwgdG1wTGluZSk7CkBAIC0zNjEsNyArNDE1LDcgQEAgcHVibGljIHZvaWQgYWR2ZXJ0aXNlSWQoZmluYWwgQW55T2JqZWN0SWQgaWQsIGZpbmFsIFN0cmluZyByZWZOYW1lKQogCQkJZmlyc3QgPSBmYWxzZTsKIAkJCWlmICghY2FwYWJsaXRpZXMuaXNFbXB0eSgpKSB7CiAJCQkJdG1wTGluZS5hcHBlbmQoJ1wwJyk7Ci0JCQkJZm9yIChmaW5hbCBTdHJpbmcgY2FwTmFtZSA6IGNhcGFibGl0aWVzKSB7CisJCQkJZm9yIChTdHJpbmcgY2FwTmFtZSA6IGNhcGFibGl0aWVzKSB7CiAJCQkJCXRtcExpbmUuYXBwZW5kKCcgJyk7CiAJCQkJCXRtcExpbmUuYXBwZW5kKGNhcE5hbWUpOwogCQkJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlZkZpbHRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVmRmlsdGVyLmphdmEKaW5kZXggYmJlNGY4NC4uOTkyZGRjNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVmRmlsdGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVmRmlsdGVyLmphdmEKQEAgLTYzLDcgKzYzLDcgQEAgcHVibGljIGludGVyZmFjZSBSZWZGaWx0ZXIgewogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgUmVmRmlsdGVyIERFRkFVTFQgPSBuZXcgUmVmRmlsdGVyKCkgewogCQlAT3ZlcnJpZGUKLQkJcHVibGljIE1hcDxTdHJpbmcsIFJlZj4gZmlsdGVyIChmaW5hbCBNYXA8U3RyaW5nLCBSZWY+IHJlZnMpIHsKKwkJcHVibGljIE1hcDxTdHJpbmcsIFJlZj4gZmlsdGVyIChNYXA8U3RyaW5nLCBSZWY+IHJlZnMpIHsKIAkJCXJldHVybiByZWZzOwogCQl9CiAJfTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlZlNwZWMuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlZlNwZWMuamF2YQppbmRleCBlMWIzMDZlLi5hZmQzYWRhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9SZWZTcGVjLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVmU3BlYy5qYXZhCkBAIC03Miw3ICs3Miw3IEBAIHB1YmxpYyBjbGFzcyBSZWZTcGVjIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKIAkgKiAgICAgICAgICAgIHJlZiBzcGVjIGNvbXBvbmVudCAtIHN0cmluZyB0byB0ZXN0LiBDYW4gYmUgbnVsbC4KIAkgKiBAcmV0dXJuIHRydWUgaWYgcHJvdmlkZWQgc3RyaW5nIGlzIGEgd2lsZGNhcmQgcmVmIHNwZWMgY29tcG9uZW50LgogCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1dpbGRjYXJkKGZpbmFsIFN0cmluZyBzKSB7CisJcHVibGljIHN0YXRpYyBib29sZWFuIGlzV2lsZGNhcmQoU3RyaW5nIHMpIHsKIAkJcmV0dXJuIHMgIT0gbnVsbCAmJiBzLmNvbnRhaW5zKCIqIik7IC8vJE5PTi1OTFMtMSQKIAl9CiAKQEAgLTIyMiwxMSArMjIyLDExIEBAIHB1YmxpYyBSZWZTcGVjKFN0cmluZyBzcGVjLCBXaWxkY2FyZE1vZGUgbW9kZSkgewogCSAqIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHRoZSBzcGVjaWZpY2F0aW9uIGlzIGludmFsaWQuCiAJICovCi0JcHVibGljIFJlZlNwZWMoZmluYWwgU3RyaW5nIHNwZWMpIHsKKwlwdWJsaWMgUmVmU3BlYyhTdHJpbmcgc3BlYykgewogCQl0aGlzKHNwZWMsIFdpbGRjYXJkTW9kZS5SRVFVSVJFX01BVENIKTsKIAl9CiAKLQlwcml2YXRlIFJlZlNwZWMoZmluYWwgUmVmU3BlYyBwKSB7CisJcHJpdmF0ZSBSZWZTcGVjKFJlZlNwZWMgcCkgewogCQlmb3JjZSA9IHAuaXNGb3JjZVVwZGF0ZSgpOwogCQl3aWxkY2FyZCA9IHAuaXNXaWxkY2FyZCgpOwogCQlzcmNOYW1lID0gcC5nZXRTb3VyY2UoKTsKQEAgLTI1MCw3ICsyNTAsNyBAQCBwdWJsaWMgYm9vbGVhbiBpc0ZvcmNlVXBkYXRlKCkgewogCSAqICAgICAgICAgICAgbmV3IHZhbHVlIGZvciBmb3JjZSB1cGRhdGUgaW4gdGhlIHJldHVybmVkIGluc3RhbmNlLgogCSAqIEByZXR1cm4gYSBuZXcgUmVmU3BlYyB3aXRoIGZvcmNlIHVwZGF0ZSBhcyBzcGVjaWZpZWQuCiAJICovCi0JcHVibGljIFJlZlNwZWMgc2V0Rm9yY2VVcGRhdGUoZmluYWwgYm9vbGVhbiBmb3JjZVVwZGF0ZSkgeworCXB1YmxpYyBSZWZTcGVjIHNldEZvcmNlVXBkYXRlKGJvb2xlYW4gZm9yY2VVcGRhdGUpIHsKIAkJZmluYWwgUmVmU3BlYyByID0gbmV3IFJlZlNwZWModGhpcyk7CiAJCXIuZm9yY2UgPSBmb3JjZVVwZGF0ZTsKIAkJcmV0dXJuIHI7CkBAIC0yOTMsNyArMjkzLDcgQEAgcHVibGljIFN0cmluZyBnZXRTb3VyY2UoKSB7CiAJICogICAgICAgICAgICAgc3RhdHVzIG9mIHRoZSBleGlzdGluZyBkZXN0aW5hdGlvbiBkaXNhZ3JlZXMgd2l0aCB0aGUKIAkgKiAgICAgICAgICAgICB3aWxkY2FyZCBzdGF0dXMgb2YgdGhlIG5ldyBzb3VyY2UuCiAJICovCi0JcHVibGljIFJlZlNwZWMgc2V0U291cmNlKGZpbmFsIFN0cmluZyBzb3VyY2UpIHsKKwlwdWJsaWMgUmVmU3BlYyBzZXRTb3VyY2UoU3RyaW5nIHNvdXJjZSkgewogCQlmaW5hbCBSZWZTcGVjIHIgPSBuZXcgUmVmU3BlYyh0aGlzKTsKIAkJci5zcmNOYW1lID0gY2hlY2tWYWxpZChzb3VyY2UpOwogCQlpZiAoaXNXaWxkY2FyZChyLnNyY05hbWUpICYmIHIuZHN0TmFtZSA9PSBudWxsKQpAQCAtMzMyLDcgKzMzMiw3IEBAIHB1YmxpYyBTdHJpbmcgZ2V0RGVzdGluYXRpb24oKSB7CiAJICogICAgICAgICAgICAgb2YgdGhlIGV4aXN0aW5nIHNvdXJjZSBkaXNhZ3JlZXMgd2l0aCB0aGUgd2lsZGNhcmQgc3RhdHVzIG9mCiAJICogICAgICAgICAgICAgdGhlIG5ldyBkZXN0aW5hdGlvbi4KIAkgKi8KLQlwdWJsaWMgUmVmU3BlYyBzZXREZXN0aW5hdGlvbihmaW5hbCBTdHJpbmcgZGVzdGluYXRpb24pIHsKKwlwdWJsaWMgUmVmU3BlYyBzZXREZXN0aW5hdGlvbihTdHJpbmcgZGVzdGluYXRpb24pIHsKIAkJZmluYWwgUmVmU3BlYyByID0gbmV3IFJlZlNwZWModGhpcyk7CiAJCXIuZHN0TmFtZSA9IGNoZWNrVmFsaWQoZGVzdGluYXRpb24pOwogCQlpZiAoaXNXaWxkY2FyZChyLmRzdE5hbWUpICYmIHIuc3JjTmFtZSA9PSBudWxsKQpAQCAtMzcyLDcgKzM3Miw3IEBAIHB1YmxpYyBSZWZTcGVjIHNldFNvdXJjZURlc3RpbmF0aW9uKGZpbmFsIFN0cmluZyBzb3VyY2UsCiAJICogICAgICAgICAgICByZWYgbmFtZSB0aGF0IHNob3VsZCBiZSB0ZXN0ZWQuCiAJICogQHJldHVybiB0cnVlIGlmIHRoZSBuYW1lcyBtYXRjaDsgZmFsc2Ugb3RoZXJ3aXNlLgogCSAqLwotCXB1YmxpYyBib29sZWFuIG1hdGNoU291cmNlKGZpbmFsIFN0cmluZyByKSB7CisJcHVibGljIGJvb2xlYW4gbWF0Y2hTb3VyY2UoU3RyaW5nIHIpIHsKIAkJcmV0dXJuIG1hdGNoKHIsIGdldFNvdXJjZSgpKTsKIAl9CiAKQEAgLTM4Myw3ICszODMsNyBAQCBwdWJsaWMgYm9vbGVhbiBtYXRjaFNvdXJjZShmaW5hbCBTdHJpbmcgcikgewogCSAqICAgICAgICAgICAgcmVmIHdob3NlIG5hbWUgc2hvdWxkIGJlIHRlc3RlZC4KIAkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG5hbWVzIG1hdGNoOyBmYWxzZSBvdGhlcndpc2UuCiAJICovCi0JcHVibGljIGJvb2xlYW4gbWF0Y2hTb3VyY2UoZmluYWwgUmVmIHIpIHsKKwlwdWJsaWMgYm9vbGVhbiBtYXRjaFNvdXJjZShSZWYgcikgewogCQlyZXR1cm4gbWF0Y2goci5nZXROYW1lKCksIGdldFNvdXJjZSgpKTsKIAl9CiAKQEAgLTM5NCw3ICszOTQsNyBAQCBwdWJsaWMgYm9vbGVhbiBtYXRjaFNvdXJjZShmaW5hbCBSZWYgcikgewogCSAqICAgICAgICAgICAgcmVmIG5hbWUgdGhhdCBzaG91bGQgYmUgdGVzdGVkLgogCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbmFtZXMgbWF0Y2g7IGZhbHNlIG90aGVyd2lzZS4KIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiBtYXRjaERlc3RpbmF0aW9uKGZpbmFsIFN0cmluZyByKSB7CisJcHVibGljIGJvb2xlYW4gbWF0Y2hEZXN0aW5hdGlvbihTdHJpbmcgcikgewogCQlyZXR1cm4gbWF0Y2gociwgZ2V0RGVzdGluYXRpb24oKSk7CiAJfQogCkBAIC00MDUsNyArNDA1LDcgQEAgcHVibGljIGJvb2xlYW4gbWF0Y2hEZXN0aW5hdGlvbihmaW5hbCBTdHJpbmcgcikgewogCSAqICAgICAgICAgICAgcmVmIHdob3NlIG5hbWUgc2hvdWxkIGJlIHRlc3RlZC4KIAkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG5hbWVzIG1hdGNoOyBmYWxzZSBvdGhlcndpc2UuCiAJICovCi0JcHVibGljIGJvb2xlYW4gbWF0Y2hEZXN0aW5hdGlvbihmaW5hbCBSZWYgcikgeworCXB1YmxpYyBib29sZWFuIG1hdGNoRGVzdGluYXRpb24oUmVmIHIpIHsKIAkJcmV0dXJuIG1hdGNoKHIuZ2V0TmFtZSgpLCBnZXREZXN0aW5hdGlvbigpKTsKIAl9CiAKQEAgLTQyNSw3ICs0MjUsNyBAQCBwdWJsaWMgYm9vbGVhbiBtYXRjaERlc3RpbmF0aW9uKGZpbmFsIFJlZiByKSB7CiAJICogICAgICAgICAgICAgd2hlbiB0aGUgUmVmU3BlYyB3YXMgY29uc3RydWN0ZWQgd2l0aCB3aWxkY2FyZCBtb2RlIHRoYXQKIAkgKiAgICAgICAgICAgICBkb2Vzbid0IHJlcXVpcmUgbWF0Y2hpbmcgd2lsZGNhcmRzLgogCSAqLwotCXB1YmxpYyBSZWZTcGVjIGV4cGFuZEZyb21Tb3VyY2UoZmluYWwgU3RyaW5nIHIpIHsKKwlwdWJsaWMgUmVmU3BlYyBleHBhbmRGcm9tU291cmNlKFN0cmluZyByKSB7CiAJCWlmIChhbGxvd01pc21hdGNoZWRXaWxkY2FyZHMgIT0gV2lsZGNhcmRNb2RlLlJFUVVJUkVfTUFUQ0gpIHsKIAkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCiAJCQkJCUpHaXRUZXh0LmdldCgpLmludmFsaWRFeHBhbmRXaWxkY2FyZCk7CkBAIC00MzMsNyArNDMzLDcgQEAgcHVibGljIFJlZlNwZWMgZXhwYW5kRnJvbVNvdXJjZShmaW5hbCBTdHJpbmcgcikgewogCQlyZXR1cm4gaXNXaWxkY2FyZCgpID8gbmV3IFJlZlNwZWModGhpcykuZXhwYW5kRnJvbVNvdXJjZUltcChyKSA6IHRoaXM7CiAJfQogCi0JcHJpdmF0ZSBSZWZTcGVjIGV4cGFuZEZyb21Tb3VyY2VJbXAoZmluYWwgU3RyaW5nIG5hbWUpIHsKKwlwcml2YXRlIFJlZlNwZWMgZXhwYW5kRnJvbVNvdXJjZUltcChTdHJpbmcgbmFtZSkgewogCQlmaW5hbCBTdHJpbmcgcHNyYyA9IHNyY05hbWUsIHBkc3QgPSBkc3ROYW1lOwogCQl3aWxkY2FyZCA9IGZhbHNlOwogCQlzcmNOYW1lID0gbmFtZTsKQEAgLTQ1Nyw3ICs0NTcsNyBAQCBwcml2YXRlIFJlZlNwZWMgZXhwYW5kRnJvbVNvdXJjZUltcChmaW5hbCBTdHJpbmcgbmFtZSkgewogCSAqICAgICAgICAgICAgIHdoZW4gdGhlIFJlZlNwZWMgd2FzIGNvbnN0cnVjdGVkIHdpdGggd2lsZGNhcmQgbW9kZSB0aGF0CiAJICogICAgICAgICAgICAgZG9lc24ndCByZXF1aXJlIG1hdGNoaW5nIHdpbGRjYXJkcy4KIAkgKi8KLQlwdWJsaWMgUmVmU3BlYyBleHBhbmRGcm9tU291cmNlKGZpbmFsIFJlZiByKSB7CisJcHVibGljIFJlZlNwZWMgZXhwYW5kRnJvbVNvdXJjZShSZWYgcikgewogCQlyZXR1cm4gZXhwYW5kRnJvbVNvdXJjZShyLmdldE5hbWUoKSk7CiAJfQogCkBAIC00NzcsNyArNDc3LDcgQEAgcHVibGljIFJlZlNwZWMgZXhwYW5kRnJvbVNvdXJjZShmaW5hbCBSZWYgcikgewogCSAqICAgICAgICAgICAgIHdoZW4gdGhlIFJlZlNwZWMgd2FzIGNvbnN0cnVjdGVkIHdpdGggd2lsZGNhcmQgbW9kZSB0aGF0CiAJICogICAgICAgICAgICAgZG9lc24ndCByZXF1aXJlIG1hdGNoaW5nIHdpbGRjYXJkcy4KIAkgKi8KLQlwdWJsaWMgUmVmU3BlYyBleHBhbmRGcm9tRGVzdGluYXRpb24oZmluYWwgU3RyaW5nIHIpIHsKKwlwdWJsaWMgUmVmU3BlYyBleHBhbmRGcm9tRGVzdGluYXRpb24oU3RyaW5nIHIpIHsKIAkJaWYgKGFsbG93TWlzbWF0Y2hlZFdpbGRjYXJkcyAhPSBXaWxkY2FyZE1vZGUuUkVRVUlSRV9NQVRDSCkgewogCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKIAkJCQkJSkdpdFRleHQuZ2V0KCkuaW52YWxpZEV4cGFuZFdpbGRjYXJkKTsKQEAgLTQ4NSw3ICs0ODUsNyBAQCBwdWJsaWMgUmVmU3BlYyBleHBhbmRGcm9tRGVzdGluYXRpb24oZmluYWwgU3RyaW5nIHIpIHsKIAkJcmV0dXJuIGlzV2lsZGNhcmQoKSA/IG5ldyBSZWZTcGVjKHRoaXMpLmV4cGFuZEZyb21Ec3RJbXAocikgOiB0aGlzOwogCX0KIAotCXByaXZhdGUgUmVmU3BlYyBleHBhbmRGcm9tRHN0SW1wKGZpbmFsIFN0cmluZyBuYW1lKSB7CisJcHJpdmF0ZSBSZWZTcGVjIGV4cGFuZEZyb21Ec3RJbXAoU3RyaW5nIG5hbWUpIHsKIAkJZmluYWwgU3RyaW5nIHBzcmMgPSBzcmNOYW1lLCBwZHN0ID0gZHN0TmFtZTsKIAkJd2lsZGNhcmQgPSBmYWxzZTsKIAkJc3JjTmFtZSA9IGV4cGFuZFdpbGRjYXJkKG5hbWUsIHBkc3QsIHBzcmMpOwpAQCAtNTA4LDExICs1MDgsMTEgQEAgcHJpdmF0ZSBSZWZTcGVjIGV4cGFuZEZyb21Ec3RJbXAoZmluYWwgU3RyaW5nIG5hbWUpIHsKIAkgKiAgICAgICAgICAgICB3aGVuIHRoZSBSZWZTcGVjIHdhcyBjb25zdHJ1Y3RlZCB3aXRoIHdpbGRjYXJkIG1vZGUgdGhhdAogCSAqICAgICAgICAgICAgIGRvZXNuJ3QgcmVxdWlyZSBtYXRjaGluZyB3aWxkY2FyZHMuCiAJICovCi0JcHVibGljIFJlZlNwZWMgZXhwYW5kRnJvbURlc3RpbmF0aW9uKGZpbmFsIFJlZiByKSB7CisJcHVibGljIFJlZlNwZWMgZXhwYW5kRnJvbURlc3RpbmF0aW9uKFJlZiByKSB7CiAJCXJldHVybiBleHBhbmRGcm9tRGVzdGluYXRpb24oci5nZXROYW1lKCkpOwogCX0KIAotCXByaXZhdGUgYm9vbGVhbiBtYXRjaChmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgU3RyaW5nIHMpIHsKKwlwcml2YXRlIGJvb2xlYW4gbWF0Y2goU3RyaW5nIG5hbWUsIFN0cmluZyBzKSB7CiAJCWlmIChzID09IG51bGwpCiAJCQlyZXR1cm4gZmFsc2U7CiAJCWlmIChpc1dpbGRjYXJkKHMpKSB7CkBAIC01NDEsNyArNTQxLDcgQEAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNoZWNrVmFsaWQoU3RyaW5nIHNwZWMpIHsKIAkJcmV0dXJuIHNwZWM7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkKGZpbmFsIFN0cmluZyBzKSB7CisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkKFN0cmluZyBzKSB7CiAJCWlmIChzLnN0YXJ0c1dpdGgoIi8iKSkgLy8kTk9OLU5MUy0xJAogCQkJcmV0dXJuIGZhbHNlOwogCQlpZiAocy5jb250YWlucygiLy8iKSkgLy8kTk9OLU5MUy0xJApAQCAtNTY5LDcgKzU2OSw3IEBAIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhmaW5hbCBPYmplY3Qgb2JqKSB7CisJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKIAkJaWYgKCEob2JqIGluc3RhbmNlb2YgUmVmU3BlYykpCiAJCQlyZXR1cm4gZmFsc2U7CiAJCWZpbmFsIFJlZlNwZWMgYiA9IChSZWZTcGVjKSBvYmo7CkBAIC01ODQsNyArNTg0LDcgQEAgcHVibGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIE9iamVjdCBvYmopIHsKIAkJcmV0dXJuIHRydWU7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBlcShmaW5hbCBTdHJpbmcgYSwgZmluYWwgU3RyaW5nIGIpIHsKKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGVxKFN0cmluZyBhLCBTdHJpbmcgYikgewogCQlpZiAoYSA9PSBiKQogCQkJcmV0dXJuIHRydWU7CiAJCWlmIChhID09IG51bGwgfHwgYiA9PSBudWxsKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVtb3RlQ29uZmlnLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9SZW1vdGVDb25maWcuamF2YQppbmRleCA3Yjg4MmVjLi4wYTYyMWYxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9SZW1vdGVDb25maWcuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9SZW1vdGVDb25maWcuamF2YQpAQCAtMTEyLDcgKzExMiw3IEBAIHB1YmxpYyBjbGFzcyBSZW1vdGVDb25maWcgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewogCSAqIEB0aHJvd3MgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uCiAJICogICAgICAgICAgICAgb25lIG9mIHRoZSBVUklzIHdpdGhpbiB0aGUgcmVtb3RlJ3MgY29uZmlndXJhdGlvbiBpcyBpbnZhbGlkLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdDxSZW1vdGVDb25maWc+IGdldEFsbFJlbW90ZUNvbmZpZ3MoZmluYWwgQ29uZmlnIHJjKQorCXB1YmxpYyBzdGF0aWMgTGlzdDxSZW1vdGVDb25maWc+IGdldEFsbFJlbW90ZUNvbmZpZ3MoQ29uZmlnIHJjKQogCQkJdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7CiAJCWZpbmFsIExpc3Q8U3RyaW5nPiBuYW1lcyA9IG5ldyBBcnJheUxpc3Q8PihyYwogCQkJCS5nZXRTdWJzZWN0aW9ucyhTRUNUSU9OKSk7CkBAIC0xMjAsNyArMTIwLDcgQEAgcHVibGljIHN0YXRpYyBMaXN0PFJlbW90ZUNvbmZpZz4gZ2V0QWxsUmVtb3RlQ29uZmlncyhmaW5hbCBDb25maWcgcmMpCiAKIAkJZmluYWwgTGlzdDxSZW1vdGVDb25maWc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8PihuYW1lcwogCQkJCS5zaXplKCkpOwotCQlmb3IgKGZpbmFsIFN0cmluZyBuYW1lIDogbmFtZXMpCisJCWZvciAoU3RyaW5nIG5hbWUgOiBuYW1lcykKIAkJCXJlc3VsdC5hZGQobmV3IFJlbW90ZUNvbmZpZyhyYywgbmFtZSkpOwogCQlyZXR1cm4gcmVzdWx0OwogCX0KQEAgLTE2MCw3ICsxNjAsNyBAQCBwdWJsaWMgc3RhdGljIExpc3Q8UmVtb3RlQ29uZmlnPiBnZXRBbGxSZW1vdGVDb25maWdzKGZpbmFsIENvbmZpZyByYykKIAkgKiBAdGhyb3dzIGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIG9uZSBvZiB0aGUgVVJJcyB3aXRoaW4gdGhlIHJlbW90ZSdzIGNvbmZpZ3VyYXRpb24gaXMgaW52YWxpZC4KIAkgKi8KLQlwdWJsaWMgUmVtb3RlQ29uZmlnKGZpbmFsIENvbmZpZyByYywgZmluYWwgU3RyaW5nIHJlbW90ZU5hbWUpCisJcHVibGljIFJlbW90ZUNvbmZpZyhDb25maWcgcmMsIFN0cmluZyByZW1vdGVOYW1lKQogCQkJdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7CiAJCW5hbWUgPSByZW1vdGVOYW1lOwogCkBAIC0xNzAsMTIgKzE3MCwxMiBAQCBwdWJsaWMgUmVtb3RlQ29uZmlnKGZpbmFsIENvbmZpZyByYywgZmluYWwgU3RyaW5nIHJlbW90ZU5hbWUpCiAJCXZsc3QgPSByYy5nZXRTdHJpbmdMaXN0KFNFQ1RJT04sIG5hbWUsIEtFWV9VUkwpOwogCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGluc3RlYWRPZiA9IGdldFJlcGxhY2VtZW50cyhyYywgS0VZX0lOU1RFQURPRik7CiAJCXVyaXMgPSBuZXcgQXJyYXlMaXN0PD4odmxzdC5sZW5ndGgpOwotCQlmb3IgKGZpbmFsIFN0cmluZyBzIDogdmxzdCkgeworCQlmb3IgKFN0cmluZyBzIDogdmxzdCkgewogCQkJdXJpcy5hZGQobmV3IFVSSWlzaChyZXBsYWNlVXJpKHMsIGluc3RlYWRPZikpKTsKIAkJfQogCQlTdHJpbmdbXSBwbHN0ID0gcmMuZ2V0U3RyaW5nTGlzdChTRUNUSU9OLCBuYW1lLCBLRVlfUFVTSFVSTCk7CiAJCXB1c2hVUklzID0gbmV3IEFycmF5TGlzdDw+KHBsc3QubGVuZ3RoKTsKLQkJZm9yIChmaW5hbCBTdHJpbmcgcyA6IHBsc3QpIHsKKwkJZm9yIChTdHJpbmcgcyA6IHBsc3QpIHsKIAkJCXB1c2hVUklzLmFkZChuZXcgVVJJaXNoKHMpKTsKIAkJfQogCQlpZiAocHVzaFVSSXMuaXNFbXB0eSgpKSB7CkBAIC0yMjMsMjYgKzIyMywyNiBAQCBwdWJsaWMgUmVtb3RlQ29uZmlnKGZpbmFsIENvbmZpZyByYywgZmluYWwgU3RyaW5nIHJlbW90ZU5hbWUpCiAJICogQHBhcmFtIHJjCiAJICogICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBmaWxlIHRvIHN0b3JlIG91cnNlbHZlcyBpbnRvLgogCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZShmaW5hbCBDb25maWcgcmMpIHsKKwlwdWJsaWMgdm9pZCB1cGRhdGUoQ29uZmlnIHJjKSB7CiAJCWZpbmFsIExpc3Q8U3RyaW5nPiB2bHN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CiAKIAkJdmxzdC5jbGVhcigpOwotCQlmb3IgKGZpbmFsIFVSSWlzaCB1IDogZ2V0VVJJcygpKQorCQlmb3IgKFVSSWlzaCB1IDogZ2V0VVJJcygpKQogCQkJdmxzdC5hZGQodS50b1ByaXZhdGVTdHJpbmcoKSk7CiAJCXJjLnNldFN0cmluZ0xpc3QoU0VDVElPTiwgZ2V0TmFtZSgpLCBLRVlfVVJMLCB2bHN0KTsKIAogCQl2bHN0LmNsZWFyKCk7Ci0JCWZvciAoZmluYWwgVVJJaXNoIHUgOiBnZXRQdXNoVVJJcygpKQorCQlmb3IgKFVSSWlzaCB1IDogZ2V0UHVzaFVSSXMoKSkKIAkJCXZsc3QuYWRkKHUudG9Qcml2YXRlU3RyaW5nKCkpOwogCQlyYy5zZXRTdHJpbmdMaXN0KFNFQ1RJT04sIGdldE5hbWUoKSwgS0VZX1BVU0hVUkwsIHZsc3QpOwogCiAJCXZsc3QuY2xlYXIoKTsKLQkJZm9yIChmaW5hbCBSZWZTcGVjIHUgOiBnZXRGZXRjaFJlZlNwZWNzKCkpCisJCWZvciAoUmVmU3BlYyB1IDogZ2V0RmV0Y2hSZWZTcGVjcygpKQogCQkJdmxzdC5hZGQodS50b1N0cmluZygpKTsKIAkJcmMuc2V0U3RyaW5nTGlzdChTRUNUSU9OLCBnZXROYW1lKCksIEtFWV9GRVRDSCwgdmxzdCk7CiAKIAkJdmxzdC5jbGVhcigpOwotCQlmb3IgKGZpbmFsIFJlZlNwZWMgdSA6IGdldFB1c2hSZWZTcGVjcygpKQorCQlmb3IgKFJlZlNwZWMgdSA6IGdldFB1c2hSZWZTcGVjcygpKQogCQkJdmxzdC5hZGQodS50b1N0cmluZygpKTsKIAkJcmMuc2V0U3RyaW5nTGlzdChTRUNUSU9OLCBnZXROYW1lKCksIEtFWV9QVVNILCB2bHN0KTsKIApAQCAtMjc3LDcgKzI3Nyw3IEBAIHByaXZhdGUgdm9pZCBzZXQoZmluYWwgQ29uZmlnIHJjLCBmaW5hbCBTdHJpbmcga2V5LCBmaW5hbCBpbnQgY3VycmVudFZhbHVlLAogCQkJcmMuc2V0SW50KFNFQ1RJT04sIGdldE5hbWUoKSwga2V5LCBjdXJyZW50VmFsdWUpOwogCX0KIAotCXByaXZhdGUgdm9pZCB1bnNldChmaW5hbCBDb25maWcgcmMsIGZpbmFsIFN0cmluZyBrZXkpIHsKKwlwcml2YXRlIHZvaWQgdW5zZXQoQ29uZmlnIHJjLCBTdHJpbmcga2V5KSB7CiAJCXJjLnVuc2V0KFNFQ1RJT04sIGdldE5hbWUoKSwga2V5KTsKIAl9CiAKQEAgLTMzNSw3ICszMzUsNyBAQCBwdWJsaWMgTGlzdDxVUklpc2g+IGdldFVSSXMoKSB7CiAJICogICAgICAgICAgICB0aGUgbmV3IFVSSSB0byBhZGQgdG8gdGhpcyByZW1vdGUuCiAJICogQHJldHVybiB0cnVlIGlmIHRoZSBVUkkgd2FzIGFkZGVkOyBmYWxzZSBpZiBpdCBhbHJlYWR5IGV4aXN0cy4KIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhZGRVUkkoZmluYWwgVVJJaXNoIHRvQWRkKSB7CisJcHVibGljIGJvb2xlYW4gYWRkVVJJKFVSSWlzaCB0b0FkZCkgewogCQlpZiAodXJpcy5jb250YWlucyh0b0FkZCkpCiAJCQlyZXR1cm4gZmFsc2U7CiAJCXJldHVybiB1cmlzLmFkZCh0b0FkZCk7CkBAIC0zNDgsNyArMzQ4LDcgQEAgcHVibGljIGJvb2xlYW4gYWRkVVJJKGZpbmFsIFVSSWlzaCB0b0FkZCkgewogCSAqICAgICAgICAgICAgdGhlIFVSSSB0byByZW1vdmUgZnJvbSB0aGlzIHJlbW90ZS4KIAkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIFVSSSB3YXMgYWRkZWQ7IGZhbHNlIGlmIGl0IGFscmVhZHkgZXhpc3RzLgogCSAqLwotCXB1YmxpYyBib29sZWFuIHJlbW92ZVVSSShmaW5hbCBVUklpc2ggdG9SZW1vdmUpIHsKKwlwdWJsaWMgYm9vbGVhbiByZW1vdmVVUkkoVVJJaXNoIHRvUmVtb3ZlKSB7CiAJCXJldHVybiB1cmlzLnJlbW92ZSh0b1JlbW92ZSk7CiAJfQogCkBAIC0zNjgsNyArMzY4LDcgQEAgcHVibGljIExpc3Q8VVJJaXNoPiBnZXRQdXNoVVJJcygpIHsKIAkgKiAgICAgICAgICAgIHRoZSBuZXcgVVJJIHRvIGFkZCB0byB0aGlzIHJlbW90ZS4KIAkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIFVSSSB3YXMgYWRkZWQ7IGZhbHNlIGlmIGl0IGFscmVhZHkgZXhpc3RzLgogCSAqLwotCXB1YmxpYyBib29sZWFuIGFkZFB1c2hVUkkoZmluYWwgVVJJaXNoIHRvQWRkKSB7CisJcHVibGljIGJvb2xlYW4gYWRkUHVzaFVSSShVUklpc2ggdG9BZGQpIHsKIAkJaWYgKHB1c2hVUklzLmNvbnRhaW5zKHRvQWRkKSkKIAkJCXJldHVybiBmYWxzZTsKIAkJcmV0dXJuIHB1c2hVUklzLmFkZCh0b0FkZCk7CkBAIC0zODEsNyArMzgxLDcgQEAgcHVibGljIGJvb2xlYW4gYWRkUHVzaFVSSShmaW5hbCBVUklpc2ggdG9BZGQpIHsKIAkgKiAgICAgICAgICAgIHRoZSBVUkkgdG8gcmVtb3ZlIGZyb20gdGhpcyByZW1vdGUuCiAJICogQHJldHVybiB0cnVlIGlmIHRoZSBVUkkgd2FzIGFkZGVkOyBmYWxzZSBpZiBpdCBhbHJlYWR5IGV4aXN0cy4KIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVQdXNoVVJJKGZpbmFsIFVSSWlzaCB0b1JlbW92ZSkgeworCXB1YmxpYyBib29sZWFuIHJlbW92ZVB1c2hVUkkoVVJJaXNoIHRvUmVtb3ZlKSB7CiAJCXJldHVybiBwdXNoVVJJcy5yZW1vdmUodG9SZW1vdmUpOwogCX0KIApAQCAtNDAxLDcgKzQwMSw3IEBAIHB1YmxpYyBMaXN0PFJlZlNwZWM+IGdldEZldGNoUmVmU3BlY3MoKSB7CiAJICogICAgICAgICAgICB0aGUgbmV3IHNwZWNpZmljYXRpb24gdG8gYWRkLgogCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWNhdGlvbiB3YXMgYWRkZWQ7IGZhbHNlIGlmIGl0IGFscmVhZHkgZXhpc3RzLgogCSAqLwotCXB1YmxpYyBib29sZWFuIGFkZEZldGNoUmVmU3BlYyhmaW5hbCBSZWZTcGVjIHMpIHsKKwlwdWJsaWMgYm9vbGVhbiBhZGRGZXRjaFJlZlNwZWMoUmVmU3BlYyBzKSB7CiAJCWlmIChmZXRjaC5jb250YWlucyhzKSkKIAkJCXJldHVybiBmYWxzZTsKIAkJcmV0dXJuIGZldGNoLmFkZChzKTsKQEAgLTQxNCw3ICs0MTQsNyBAQCBwdWJsaWMgYm9vbGVhbiBhZGRGZXRjaFJlZlNwZWMoZmluYWwgUmVmU3BlYyBzKSB7CiAJICogICAgICAgICAgICBsaXN0IG9mIGZldGNoIHNwZWNpZmljYXRpb25zIHRvIHNldC4gTGlzdCBpcyBjb3BpZWQsIGl0IGNhbiBiZQogCSAqICAgICAgICAgICAgbW9kaWZpZWQgYWZ0ZXIgdGhpcyBjYWxsLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldEZldGNoUmVmU3BlY3MoZmluYWwgTGlzdDxSZWZTcGVjPiBzcGVjcykgeworCXB1YmxpYyB2b2lkIHNldEZldGNoUmVmU3BlY3MoTGlzdDxSZWZTcGVjPiBzcGVjcykgewogCQlmZXRjaC5jbGVhcigpOwogCQlmZXRjaC5hZGRBbGwoc3BlY3MpOwogCX0KQEAgLTQyNiw3ICs0MjYsNyBAQCBwdWJsaWMgdm9pZCBzZXRGZXRjaFJlZlNwZWNzKGZpbmFsIExpc3Q8UmVmU3BlYz4gc3BlY3MpIHsKIAkgKiAgICAgICAgICAgIGxpc3Qgb2YgcHVzaCBzcGVjaWZpY2F0aW9ucyB0byBzZXQuIExpc3QgaXMgY29waWVkLCBpdCBjYW4gYmUKIAkgKiAgICAgICAgICAgIG1vZGlmaWVkIGFmdGVyIHRoaXMgY2FsbC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQdXNoUmVmU3BlY3MoZmluYWwgTGlzdDxSZWZTcGVjPiBzcGVjcykgeworCXB1YmxpYyB2b2lkIHNldFB1c2hSZWZTcGVjcyhMaXN0PFJlZlNwZWM+IHNwZWNzKSB7CiAJCXB1c2guY2xlYXIoKTsKIAkJcHVzaC5hZGRBbGwoc3BlY3MpOwogCX0KQEAgLTQzOCw3ICs0MzgsNyBAQCBwdWJsaWMgdm9pZCBzZXRQdXNoUmVmU3BlY3MoZmluYWwgTGlzdDxSZWZTcGVjPiBzcGVjcykgewogCSAqICAgICAgICAgICAgdGhlIHNwZWNpZmljYXRpb24gdG8gcmVtb3ZlLgogCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWNhdGlvbiBleGlzdGVkIGFuZCB3YXMgcmVtb3ZlZC4KIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVGZXRjaFJlZlNwZWMoZmluYWwgUmVmU3BlYyBzKSB7CisJcHVibGljIGJvb2xlYW4gcmVtb3ZlRmV0Y2hSZWZTcGVjKFJlZlNwZWMgcykgewogCQlyZXR1cm4gZmV0Y2gucmVtb3ZlKHMpOwogCX0KIApAQCAtNDU4LDcgKzQ1OCw3IEBAIHB1YmxpYyBMaXN0PFJlZlNwZWM+IGdldFB1c2hSZWZTcGVjcygpIHsKIAkgKiAgICAgICAgICAgIHRoZSBuZXcgc3BlY2lmaWNhdGlvbiB0byBhZGQuCiAJICogQHJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpY2F0aW9uIHdhcyBhZGRlZDsgZmFsc2UgaWYgaXQgYWxyZWFkeSBleGlzdHMuCiAJICovCi0JcHVibGljIGJvb2xlYW4gYWRkUHVzaFJlZlNwZWMoZmluYWwgUmVmU3BlYyBzKSB7CisJcHVibGljIGJvb2xlYW4gYWRkUHVzaFJlZlNwZWMoUmVmU3BlYyBzKSB7CiAJCWlmIChwdXNoLmNvbnRhaW5zKHMpKQogCQkJcmV0dXJuIGZhbHNlOwogCQlyZXR1cm4gcHVzaC5hZGQocyk7CkBAIC00NzEsNyArNDcxLDcgQEAgcHVibGljIGJvb2xlYW4gYWRkUHVzaFJlZlNwZWMoZmluYWwgUmVmU3BlYyBzKSB7CiAJICogICAgICAgICAgICB0aGUgc3BlY2lmaWNhdGlvbiB0byByZW1vdmUuCiAJICogQHJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpY2F0aW9uIGV4aXN0ZWQgYW5kIHdhcyByZW1vdmVkLgogCSAqLwotCXB1YmxpYyBib29sZWFuIHJlbW92ZVB1c2hSZWZTcGVjKGZpbmFsIFJlZlNwZWMgcykgeworCXB1YmxpYyBib29sZWFuIHJlbW92ZVB1c2hSZWZTcGVjKFJlZlNwZWMgcykgewogCQlyZXR1cm4gcHVzaC5yZW1vdmUocyk7CiAJfQogCkBAIC01MjAsNyArNTIwLDcgQEAgcHVibGljIFRhZ09wdCBnZXRUYWdPcHQoKSB7CiAJICogQHBhcmFtIG9wdGlvbgogCSAqICAgICAgICAgICAgbWV0aG9kIHRvIHVzZSB3aGVuIGhhbmRsaW5nIGFubm90YXRlZCB0YWdzLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhZ09wdChmaW5hbCBUYWdPcHQgb3B0aW9uKSB7CisJcHVibGljIHZvaWQgc2V0VGFnT3B0KFRhZ09wdCBvcHRpb24pIHsKIAkJdGFnb3B0ID0gb3B0aW9uICE9IG51bGwgPyBvcHRpb24gOiBUYWdPcHQuQVVUT19GT0xMT1c7CiAJfQogCkBAIC01NDEsNyArNTQxLDcgQEAgcHVibGljIGJvb2xlYW4gaXNNaXJyb3IoKSB7CiAJICogQHBhcmFtIG0KIAkgKiAgICAgICAgICAgIHRydWUgdG8gYXV0b21hdGljYWxseSBkZWxldGUgcmVtb3RlIHJlZnMgZHVyaW5nIHB1c2guCiAJICovCi0JcHVibGljIHZvaWQgc2V0TWlycm9yKGZpbmFsIGJvb2xlYW4gbSkgeworCXB1YmxpYyB2b2lkIHNldE1pcnJvcihib29sZWFuIG0pIHsKIAkJbWlycm9yID0gbTsKIAl9CiAKQEAgLTU2Miw3ICs1NjIsNyBAQCBwdWJsaWMgaW50IGdldFRpbWVvdXQoKSB7CiAJICogICAgICAgICAgICBiZWZvcmUgYWJvcnRpbmcgYW4gSU8gcmVhZCBvciB3cml0ZSBvcGVyYXRpb24gd2l0aCB0aGlzCiAJICogICAgICAgICAgICByZW1vdGUuICBBIHRpbWVvdXQgb2YgMCB3aWxsIGJsb2NrIGluZGVmaW5pdGVseS4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUaW1lb3V0KGZpbmFsIGludCBzZWNvbmRzKSB7CisJcHVibGljIHZvaWQgc2V0VGltZW91dChpbnQgc2Vjb25kcykgewogCQl0aW1lb3V0ID0gc2Vjb25kczsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9SZW1vdGVSZWZVcGRhdGUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlbW90ZVJlZlVwZGF0ZS5qYXZhCmluZGV4IDNlOWIxNmUuLjkzMTY1M2YgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlbW90ZVJlZlVwZGF0ZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlbW90ZVJlZlVwZGF0ZS5qYXZhCkBAIC00ODEsNyArNDgxLDcgQEAgdm9pZCBzZXRFeHBlY3RlZE9sZE9iamVjdElkKE9iamVjdElkIGlkKSB7CiAJCWV4cGVjdGVkT2xkT2JqZWN0SWQgPSBpZDsKIAl9CiAKLQl2b2lkIHNldFN0YXR1cyhmaW5hbCBTdGF0dXMgc3RhdHVzKSB7CisJdm9pZCBzZXRTdGF0dXMoU3RhdHVzIHN0YXR1cykgewogCQl0aGlzLnN0YXR1cyA9IHN0YXR1czsKIAl9CiAKQEAgLTQ4OSw3ICs0ODksNyBAQCB2b2lkIHNldEZhc3RGb3J3YXJkKGJvb2xlYW4gZmFzdEZvcndhcmQpIHsKIAkJdGhpcy5mYXN0Rm9yd2FyZCA9IGZhc3RGb3J3YXJkOwogCX0KIAotCXZvaWQgc2V0TWVzc2FnZShmaW5hbCBTdHJpbmcgbWVzc2FnZSkgeworCXZvaWQgc2V0TWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgewogCQl0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOwogCX0KIApAQCAtNTAxLDcgKzUwMSw3IEBAIHZvaWQgc2V0TWVzc2FnZShmaW5hbCBTdHJpbmcgbWVzc2FnZSkgewogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHdoZW4gSS9PIGVycm9yIG9jY3VycmVkIGR1cmluZyB1cGRhdGUKIAkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVUcmFja2luZ1JlZihmaW5hbCBSZXZXYWxrIHdhbGspIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlVHJhY2tpbmdSZWYoUmV2V2FsayB3YWxrKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlpZiAoaXNEZWxldGUoKSkKIAkJCXRyYWNraW5nUmVmVXBkYXRlLnNldFJlc3VsdChsb2NhbFVwZGF0ZS5kZWxldGUod2FsaykpOwogCQllbHNlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9TaWRlQmFuZElucHV0U3RyZWFtLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9TaWRlQmFuZElucHV0U3RyZWFtLmphdmEKaW5kZXggMTUzMzhhMy4uMzEwMGNiNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvU2lkZUJhbmRJbnB1dFN0cmVhbS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1NpZGVCYW5kSW5wdXRTdHJlYW0uamF2YQpAQCAtMTMzLDcgKzEzMyw3IEBAIHB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgcmVhZChmaW5hbCBieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWludCByID0gMDsKIAkJd2hpbGUgKGxlbiA+IDApIHsKIAkJCW5lZWREYXRhUGFja2V0KCk7CkBAIC0yMDMsNyArMjAzLDcgQEAgZWxzZSBpZiAoMCA8PSBjcikKIAkJcHJvZ3Jlc3NCdWZmZXIgPSBwa3Q7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGRvUHJvZ3Jlc3NMaW5lKGZpbmFsIFN0cmluZyBtc2cpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJpdmF0ZSB2b2lkIGRvUHJvZ3Jlc3NMaW5lKFN0cmluZyBtc2cpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCU1hdGNoZXIgbWF0Y2hlcjsKIAogCQltYXRjaGVyID0gUF9CT1VOREVELm1hdGNoZXIobXNnKTsKQEAgLTIzOSw3ICsyMzksNyBAQCBwcml2YXRlIHZvaWQgZG9Qcm9ncmVzc0xpbmUoZmluYWwgU3RyaW5nIG1zZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCW91dC53cml0ZShtc2cuZ2V0Qnl0ZXMoKSk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGJlZ2luVGFzayhmaW5hbCBpbnQgdG90YWxXb3JrVW5pdHMpIHsKKwlwcml2YXRlIHZvaWQgYmVnaW5UYXNrKGludCB0b3RhbFdvcmtVbml0cykgewogCQltb25pdG9yLmJlZ2luVGFzayhyZW1vdGUoY3VycmVudFRhc2spLCB0b3RhbFdvcmtVbml0cyk7CiAJfQogCkBAIC0yNTQsNyArMjU0LDcgQEAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHJlbW90ZShTdHJpbmcgbXNnKSB7CiAJCXJldHVybiByLnRvU3RyaW5nKCk7CiAJfQogCi0JcHJpdmF0ZSBTdHJpbmcgcmVhZFN0cmluZyhmaW5hbCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByaXZhdGUgU3RyaW5nIHJlYWRTdHJpbmcoaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgYnl0ZVtdIHJhdyA9IG5ldyBieXRlW2xlbl07CiAJCUlPLnJlYWRGdWxseShyYXdJbiwgcmF3LCAwLCBsZW4pOwogCQlyZXR1cm4gUmF3UGFyc2VVdGlscy5kZWNvZGUoQ29uc3RhbnRzLkNIQVJTRVQsIHJhdywgMCwgbGVuKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1NpZGVCYW5kT3V0cHV0U3RyZWFtLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9TaWRlQmFuZE91dHB1dFN0cmVhbS5qYXZhCmluZGV4IGFmNjU4MjcuLmIyY2MxYjYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1NpZGVCYW5kT3V0cHV0U3RyZWFtLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvU2lkZUJhbmRPdXRwdXRTdHJlYW0uamF2YQpAQCAtMTAyLDcgKzEwMiw3IEBAIHB1YmxpYyBjbGFzcyBTaWRlQmFuZE91dHB1dFN0cmVhbSBleHRlbmRzIE91dHB1dFN0cmVhbSB7CiAJICogICAgICAgICAgICBzdHJlYW0gdGhhdCB0aGUgcGFja2V0cyBhcmUgd3JpdHRlbiBvbnRvLiBUaGlzIHN0cmVhbSBzaG91bGQKIAkgKiAgICAgICAgICAgIGJlIGF0dGFjaGVkIHRvIGEgU2lkZUJhbmRJbnB1dFN0cmVhbSBvbiB0aGUgcmVtb3RlIHNpZGUuCiAJICovCi0JcHVibGljIFNpZGVCYW5kT3V0cHV0U3RyZWFtKGZpbmFsIGludCBjaGFuLCBmaW5hbCBpbnQgc3osIGZpbmFsIE91dHB1dFN0cmVhbSBvcykgeworCXB1YmxpYyBTaWRlQmFuZE91dHB1dFN0cmVhbShpbnQgY2hhbiwgaW50IHN6LCBPdXRwdXRTdHJlYW0gb3MpIHsKIAkJaWYgKGNoYW4gPD0gMCB8fCBjaGFuID4gMjU1KQogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKIAkJCQkJSkdpdFRleHQuZ2V0KCkuY2hhbm5lbE11c3RCZUluUmFuZ2UxXzI1NSwKQEAgLTEzNiw3ICsxMzYsNyBAQCBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHdyaXRlKGZpbmFsIGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl3aGlsZSAoMCA8IGxlbikgewogCQkJaW50IGNhcGFjaXR5ID0gYnVmZmVyLmxlbmd0aCAtIGNudDsKIAkJCWlmIChjbnQgPT0gSERSX1NJWkUgJiYgY2FwYWNpdHkgPCBsZW4pIHsKQEAgLTE2Myw3ICsxNjMsNyBAQCBwdWJsaWMgdm9pZCB3cml0ZShmaW5hbCBieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgd3JpdGUoZmluYWwgaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIHZvaWQgd3JpdGUoaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWlmIChjbnQgPT0gYnVmZmVyLmxlbmd0aCkKIAkJCXdyaXRlQnVmZmVyKCk7CiAJCWJ1ZmZlcltjbnQrK10gPSAoYnl0ZSkgYjsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1NpZGVCYW5kUHJvZ3Jlc3NNb25pdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9TaWRlQmFuZFByb2dyZXNzTW9uaXRvci5qYXZhCmluZGV4IDM2NTU0NWEuLjhhM2U0ZWYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1NpZGVCYW5kUHJvZ3Jlc3NNb25pdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvU2lkZUJhbmRQcm9ncmVzc01vbml0b3IuamF2YQpAQCAtNTUsNyArNTUsNyBAQCBjbGFzcyBTaWRlQmFuZFByb2dyZXNzTW9uaXRvciBleHRlbmRzIEJhdGNoaW5nUHJvZ3Jlc3NNb25pdG9yIHsKIAogCXByaXZhdGUgYm9vbGVhbiB3cml0ZTsKIAotCVNpZGVCYW5kUHJvZ3Jlc3NNb25pdG9yKGZpbmFsIE91dHB1dFN0cmVhbSBvcykgeworCVNpZGVCYW5kUHJvZ3Jlc3NNb25pdG9yKE91dHB1dFN0cmVhbSBvcykgewogCQlvdXQgPSBvczsKIAkJd3JpdGUgPSB0cnVlOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1NzaFNlc3Npb25GYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9Tc2hTZXNzaW9uRmFjdG9yeS5qYXZhCmluZGV4IGUwMDIyMzMuLmFlMzU3ZGYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1NzaFNlc3Npb25GYWN0b3J5LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvU3NoU2Vzc2lvbkZhY3RvcnkuamF2YQpAQCAtODAsNyArODAsNyBAQCBwdWJsaWMgc3RhdGljIFNzaFNlc3Npb25GYWN0b3J5IGdldEluc3RhbmNlKCkgewogCSAqICAgICAgICAgICAgZmFjdG9yeSBmb3IgZnV0dXJlIHNlc3Npb25zIHRvIGJlIGNyZWF0ZWQgdGhyb3VnaC4gSWYgbnVsbCB0aGUKIAkgKiAgICAgICAgICAgIGRlZmF1bHQgZmFjdG9yeSB3aWxsIGJlIHJlc3RvcmVkLnMKIAkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0SW5zdGFuY2UoZmluYWwgU3NoU2Vzc2lvbkZhY3RvcnkgbmV3RmFjdG9yeSkgeworCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRJbnN0YW5jZShTc2hTZXNzaW9uRmFjdG9yeSBuZXdGYWN0b3J5KSB7CiAJCWlmIChuZXdGYWN0b3J5ICE9IG51bGwpCiAJCQlJTlNUQU5DRSA9IG5ld0ZhY3Rvcnk7CiAJCWVsc2UKQEAgLTEyMSw3ICsxMjEsNyBAQCBwdWJsaWMgYWJzdHJhY3QgUmVtb3RlU2Vzc2lvbiBnZXRTZXNzaW9uKFVSSWlzaCB1cmksCiAJICogICAgICAgICAgICB7QGxpbmsgI2dldFNlc3Npb24oVVJJaXNoLCBDcmVkZW50aWFsc1Byb3ZpZGVyLCBGUywgaW50KX0KIAkgKiAgICAgICAgICAgIG1ldGhvZC4KIAkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlU2Vzc2lvbihmaW5hbCBSZW1vdGVTZXNzaW9uIHNlc3Npb24pIHsKKwlwdWJsaWMgdm9pZCByZWxlYXNlU2Vzc2lvbihSZW1vdGVTZXNzaW9uIHNlc3Npb24pIHsKIAkJc2Vzc2lvbi5kaXNjb25uZWN0KCk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVGFnT3B0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UYWdPcHQuamF2YQppbmRleCBlMTEzNGU4Li5jZDE3OTEzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UYWdPcHQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UYWdPcHQuamF2YQpAQCAtODQsNyArODQsNyBAQCBwdWJsaWMgZW51bSBUYWdPcHQgewogCiAJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgb3B0aW9uOwogCi0JcHJpdmF0ZSBUYWdPcHQoZmluYWwgU3RyaW5nIG8pIHsKKwlwcml2YXRlIFRhZ09wdChTdHJpbmcgbykgewogCQlvcHRpb24gPSBvOwogCX0KIApAQCAtMTA0LDEwICsxMDQsMTAgQEAgcHVibGljIFN0cmluZyBvcHRpb24oKSB7CiAJICogICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBmaWxlIHRleHQgdmFsdWUuCiAJICogQHJldHVybiB0aGUgb3B0aW9uIHRoYXQgbWF0Y2hlcyB0aGUgcGFzc2VkIHBhcmFtZXRlci4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIFRhZ09wdCBmcm9tT3B0aW9uKGZpbmFsIFN0cmluZyBvKSB7CisJcHVibGljIHN0YXRpYyBUYWdPcHQgZnJvbU9wdGlvbihTdHJpbmcgbykgewogCQlpZiAobyA9PSBudWxsIHx8IG8ubGVuZ3RoKCkgPT0gMCkKIAkJCXJldHVybiBBVVRPX0ZPTExPVzsKLQkJZm9yIChmaW5hbCBUYWdPcHQgdGFnb3B0IDogdmFsdWVzKCkpIHsKKwkJZm9yIChUYWdPcHQgdGFnb3B0IDogdmFsdWVzKCkpIHsKIAkJCWlmICh0YWdvcHQub3B0aW9uKCkuZXF1YWxzKG8pKQogCQkJCXJldHVybiB0YWdvcHQ7CiAJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RyYW5zZmVyQ29uZmlnLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UcmFuc2ZlckNvbmZpZy5qYXZhCmluZGV4IDRjNzA3MjUuLjRhZTFjY2IgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RyYW5zZmVyQ29uZmlnLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVHJhbnNmZXJDb25maWcuamF2YQpAQCAtNjIsOCArNjIsOCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5TeXN0ZW1SZWFkZXI7CiAKIC8qKgotICogVGhlIHN0YW5kYXJkICJ0cmFuc2ZlciIsICJmZXRjaCIsICJyZWNlaXZlIiwgYW5kICJ1cGxvYWRwYWNrIiBjb25maWd1cmF0aW9uCi0gKiBwYXJhbWV0ZXJzLgorICogVGhlIHN0YW5kYXJkICJ0cmFuc2ZlciIsICJmZXRjaCIsICJwcm90b2NvbCIsICJyZWNlaXZlIiwgYW5kICJ1cGxvYWRwYWNrIgorICogY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzLgogICovCiBwdWJsaWMgY2xhc3MgVHJhbnNmZXJDb25maWcgewogCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGU0NLID0gImZzY2siOyAvLyROT04tTkxTLTEkCkBAIC05Miw2ICs5MiwzMyBAQCBwdWJsaWMgZW51bSBGc2NrTW9kZSB7CiAJCUlHTk9SRTsKIAl9CiAKKwkvKioKKwkgKiBBIGdpdCBjb25maWd1cmF0aW9uIHZhcmlhYmxlIGZvciB3aGljaCB2ZXJzaW9ucyBvZiB0aGUgR2l0IHByb3RvY29sIHRvIHByZWZlci4KKwkgKiBVc2VkIGluIHByb3RvY29sLnZlcnNpb24uCisJICovCisJZW51bSBQcm90b2NvbFZlcnNpb24geworCQlWMCgiMCIpLCAvLyROT04tTkxTLTEkCisJCVYyKCIyIik7IC8vJE5PTi1OTFMtMSQKKworCQlmaW5hbCBTdHJpbmcgbmFtZTsKKworCQlQcm90b2NvbFZlcnNpb24oU3RyaW5nIG5hbWUpIHsKKwkJCXRoaXMubmFtZSA9IG5hbWU7CisJCX0KKworCQlzdGF0aWMgQE51bGxhYmxlIFByb3RvY29sVmVyc2lvbiBwYXJzZShATnVsbGFibGUgU3RyaW5nIG5hbWUpIHsKKwkJCWlmIChuYW1lID09IG51bGwpIHsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJCWZvciAoUHJvdG9jb2xWZXJzaW9uIHYgOiBQcm90b2NvbFZlcnNpb24udmFsdWVzKCkpIHsKKwkJCQlpZiAodi5uYW1lLmVxdWFscyhuYW1lKSkgeworCQkJCQlyZXR1cm4gdjsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0KKwogCXByaXZhdGUgZmluYWwgYm9vbGVhbiBmZXRjaEZzY2s7CiAJcHJpdmF0ZSBmaW5hbCBib29sZWFuIHJlY2VpdmVGc2NrOwogCXByaXZhdGUgZmluYWwgU3RyaW5nIGZzY2tTa2lwTGlzdDsKQEAgLTEwMSwzMiArMTI4LDM2IEBAIHB1YmxpYyBlbnVtIEZzY2tNb2RlIHsKIAlwcml2YXRlIGZpbmFsIGJvb2xlYW4gc2FmZUZvck1hY09TOwogCXByaXZhdGUgZmluYWwgYm9vbGVhbiBhbGxvd1RpcFNoYTFJbldhbnQ7CiAJcHJpdmF0ZSBmaW5hbCBib29sZWFuIGFsbG93UmVhY2hhYmxlU2hhMUluV2FudDsKKwlwcml2YXRlIGZpbmFsIGJvb2xlYW4gYWxsb3dGaWx0ZXI7CisJZmluYWwgQE51bGxhYmxlIFByb3RvY29sVmVyc2lvbiBwcm90b2NvbFZlcnNpb247CiAJZmluYWwgU3RyaW5nW10gaGlkZVJlZnM7CiAKLQlUcmFuc2ZlckNvbmZpZyhmaW5hbCBSZXBvc2l0b3J5IGRiKSB7CisJVHJhbnNmZXJDb25maWcoUmVwb3NpdG9yeSBkYikgewogCQl0aGlzKGRiLmdldENvbmZpZygpKTsKIAl9CiAKLQlUcmFuc2ZlckNvbmZpZyhmaW5hbCBDb25maWcgcmMpIHsKLQkJYm9vbGVhbiBmc2NrID0gcmMuZ2V0Qm9vbGVhbigidHJhbnNmZXIiLCAiZnNja29iamVjdHMiLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZXRjaEZzY2sgPSByYy5nZXRCb29sZWFuKCJmZXRjaCIsICJmc2Nrb2JqZWN0cyIsIGZzY2spOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJcmVjZWl2ZUZzY2sgPSByYy5nZXRCb29sZWFuKCJyZWNlaXZlIiwgImZzY2tvYmplY3RzIiwgZnNjayk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmc2NrU2tpcExpc3QgPSByYy5nZXRTdHJpbmcoRlNDSywgbnVsbCwgInNraXBMaXN0Iik7IC8vJE5PTi1OTFMtMSQKLQkJYWxsb3dJbnZhbGlkUGVyc29uSWRlbnQgPSByYy5nZXRCb29sZWFuKEZTQ0ssICJhbGxvd0ludmFsaWRQZXJzb25JZGVudCIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQlzYWZlRm9yV2luZG93cyA9IHJjLmdldEJvb2xlYW4oRlNDSywgInNhZmVGb3JXaW5kb3dzIiwgLy8kTk9OLU5MUy0xJAorCUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQorCVRyYW5zZmVyQ29uZmlnKENvbmZpZyByYykgeworCQlib29sZWFuIGZzY2sgPSByYy5nZXRCb29sZWFuKCJ0cmFuc2ZlciIsICJmc2Nrb2JqZWN0cyIsIGZhbHNlKTsKKwkJZmV0Y2hGc2NrID0gcmMuZ2V0Qm9vbGVhbigiZmV0Y2giLCAiZnNja29iamVjdHMiLCBmc2NrKTsKKwkJcmVjZWl2ZUZzY2sgPSByYy5nZXRCb29sZWFuKCJyZWNlaXZlIiwgImZzY2tvYmplY3RzIiwgZnNjayk7CisJCWZzY2tTa2lwTGlzdCA9IHJjLmdldFN0cmluZyhGU0NLLCBudWxsLCAic2tpcExpc3QiKTsKKwkJYWxsb3dJbnZhbGlkUGVyc29uSWRlbnQgPSByYy5nZXRCb29sZWFuKEZTQ0ssICJhbGxvd0ludmFsaWRQZXJzb25JZGVudCIsCisJCQkJZmFsc2UpOworCQlzYWZlRm9yV2luZG93cyA9IHJjLmdldEJvb2xlYW4oRlNDSywgInNhZmVGb3JXaW5kb3dzIiwKIAkJCQkJCVN5c3RlbVJlYWRlci5nZXRJbnN0YW5jZSgpLmlzV2luZG93cygpKTsKLQkJc2FmZUZvck1hY09TID0gcmMuZ2V0Qm9vbGVhbihGU0NLLCAic2FmZUZvck1hY09TIiwgLy8kTk9OLU5MUy0xJAorCQlzYWZlRm9yTWFjT1MgPSByYy5nZXRCb29sZWFuKEZTQ0ssICJzYWZlRm9yTWFjT1MiLAogCQkJCQkJU3lzdGVtUmVhZGVyLmdldEluc3RhbmNlKCkuaXNNYWNPUygpKTsKIAogCQlpZ25vcmUgPSBFbnVtU2V0Lm5vbmVPZihPYmplY3RDaGVja2VyLkVycm9yVHlwZS5jbGFzcyk7CiAJCUVudW1TZXQ8T2JqZWN0Q2hlY2tlci5FcnJvclR5cGU+IHNldCA9IEVudW1TZXQKIAkJCQkubm9uZU9mKE9iamVjdENoZWNrZXIuRXJyb3JUeXBlLmNsYXNzKTsKIAkJZm9yIChTdHJpbmcga2V5IDogcmMuZ2V0TmFtZXMoRlNDSykpIHsKLQkJCWlmIChlcXVhbHNJZ25vcmVDYXNlKGtleSwgInNraXBMaXN0IikgLy8kTk9OLU5MUy0xJAotCQkJCQl8fCBlcXVhbHNJZ25vcmVDYXNlKGtleSwgImFsbG93TGVhZGluZ1plcm9GaWxlTW9kZSIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJfHwgZXF1YWxzSWdub3JlQ2FzZShrZXksICJhbGxvd0ludmFsaWRQZXJzb25JZGVudCIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJfHwgZXF1YWxzSWdub3JlQ2FzZShrZXksICJzYWZlRm9yV2luZG93cyIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJfHwgZXF1YWxzSWdub3JlQ2FzZShrZXksICJzYWZlRm9yTWFjT1MiKSkgeyAvLyROT04tTkxTLTEkCisJCQlpZiAoZXF1YWxzSWdub3JlQ2FzZShrZXksICJza2lwTGlzdCIpCisJCQkJCXx8IGVxdWFsc0lnbm9yZUNhc2Uoa2V5LCAiYWxsb3dMZWFkaW5nWmVyb0ZpbGVNb2RlIikKKwkJCQkJfHwgZXF1YWxzSWdub3JlQ2FzZShrZXksICJhbGxvd0ludmFsaWRQZXJzb25JZGVudCIpCisJCQkJCXx8IGVxdWFsc0lnbm9yZUNhc2Uoa2V5LCAic2FmZUZvcldpbmRvd3MiKQorCQkJCQl8fCBlcXVhbHNJZ25vcmVDYXNlKGtleSwgInNhZmVGb3JNYWNPUyIpKSB7CiAJCQkJY29udGludWU7CiAJCQl9CiAKQEAgLTE0NSwxNSArMTc2LDE4IEBAIHB1YmxpYyBlbnVtIEZzY2tNb2RlIHsKIAkJCX0KIAkJfQogCQlpZiAoIXNldC5jb250YWlucyhPYmplY3RDaGVja2VyLkVycm9yVHlwZS5aRVJPX1BBRERFRF9GSUxFTU9ERSkKLQkJCQkmJiByYy5nZXRCb29sZWFuKEZTQ0ssICJhbGxvd0xlYWRpbmdaZXJvRmlsZU1vZGUiLCBmYWxzZSkpIHsgLy8kTk9OLU5MUy0xJAorCQkJCSYmIHJjLmdldEJvb2xlYW4oRlNDSywgImFsbG93TGVhZGluZ1plcm9GaWxlTW9kZSIsIGZhbHNlKSkgewogCQkJaWdub3JlLmFkZChPYmplY3RDaGVja2VyLkVycm9yVHlwZS5aRVJPX1BBRERFRF9GSUxFTU9ERSk7CiAJCX0KIAogCQlhbGxvd1RpcFNoYTFJbldhbnQgPSByYy5nZXRCb29sZWFuKAotCQkJCSJ1cGxvYWRwYWNrIiwgImFsbG93dGlwc2hhMWlud2FudCIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJInVwbG9hZHBhY2siLCAiYWxsb3d0aXBzaGExaW53YW50IiwgZmFsc2UpOwogCQlhbGxvd1JlYWNoYWJsZVNoYTFJbldhbnQgPSByYy5nZXRCb29sZWFuKAotCQkJCSJ1cGxvYWRwYWNrIiwgImFsbG93cmVhY2hhYmxlc2hhMWlud2FudCIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWhpZGVSZWZzID0gcmMuZ2V0U3RyaW5nTGlzdCgidXBsb2FkcGFjayIsIG51bGwsICJoaWRlcmVmcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkidXBsb2FkcGFjayIsICJhbGxvd3JlYWNoYWJsZXNoYTFpbndhbnQiLCBmYWxzZSk7CisJCWFsbG93RmlsdGVyID0gcmMuZ2V0Qm9vbGVhbigKKwkJCQkidXBsb2FkcGFjayIsICJhbGxvd2ZpbHRlciIsIGZhbHNlKTsKKwkJcHJvdG9jb2xWZXJzaW9uID0gUHJvdG9jb2xWZXJzaW9uLnBhcnNlKHJjLmdldFN0cmluZygicHJvdG9jb2wiLCBudWxsLCAidmVyc2lvbiIpKTsKKwkJaGlkZVJlZnMgPSByYy5nZXRTdHJpbmdMaXN0KCJ1cGxvYWRwYWNrIiwgbnVsbCwgImhpZGVyZWZzIik7CiAJfQogCiAJLyoqCkBAIC0yMjAsNiArMjU0LDE0IEBAIHB1YmxpYyBib29sZWFuIGlzQWxsb3dSZWFjaGFibGVTaGExSW5XYW50KCkgewogCX0KIAogCS8qKgorCSAqIEByZXR1cm4gdHJ1ZSBpZiBjbGllbnRzIGFyZSBhbGxvd2VkIHRvIHNwZWNpZnkgYSAiZmlsdGVyIiBsaW5lCisJICogQHNpbmNlIDUuMAorCSAqLworCXB1YmxpYyBib29sZWFuIGlzQWxsb3dGaWx0ZXIoKSB7CisJCXJldHVybiBhbGxvd0ZpbHRlcjsKKwl9CisKKwkvKioKIAkgKiBHZXQge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlJlZkZpbHRlcn0gcmVzcGVjdGluZyBjb25maWd1cmVkCiAJICogaGlkZGVuIHJlZnMuCiAJICoKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RyYW5zcG9ydC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVHJhbnNwb3J0LmphdmEKaW5kZXggOGRiNzk2YS4uZDM0MmVmNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVHJhbnNwb3J0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVHJhbnNwb3J0LmphdmEKQEAgLTQ2LDExICs0NiwxMCBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0OwogCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZkRhdGFiYXNlLkFMTDsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiAKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CkBAIC02NCw3ICs2Myw3IEBACiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwpAQCAtMTQ0LDE3ICsxNDMsOCBAQCBwcml2YXRlIHN0YXRpYyBFbnVtZXJhdGlvbjxVUkw+IGNhdGFsb2dzKENsYXNzTG9hZGVyIGxkcikgewogCX0KIAogCXByaXZhdGUgc3RhdGljIHZvaWQgc2NhbihDbGFzc0xvYWRlciBsZHIsIFVSTCB1cmwpIHsKLQkJQnVmZmVyZWRSZWFkZXIgYnI7Ci0JCXRyeSB7Ci0JCQlJbnB1dFN0cmVhbSB1cmxJbiA9IHVybC5vcGVuU3RyZWFtKCk7Ci0JCQliciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIodXJsSW4sICJVVEYtOCIpKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlcnIpIHsKLQkJCS8vIElmIHdlIGNhbm5vdCByZWFkIGZyb20gdGhlIHNlcnZpY2UgbGlzdCwgZ28gdG8gdGhlIG5leHQuCi0JCQkvLwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJdHJ5IHsKKwkJdHJ5IChCdWZmZXJlZFJlYWRlciBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcigKKwkJCQluZXcgSW5wdXRTdHJlYW1SZWFkZXIodXJsLm9wZW5TdHJlYW0oKSwgQ0hBUlNFVCkpKSB7CiAJCQlTdHJpbmcgbGluZTsKIAkJCXdoaWxlICgobGluZSA9IGJyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKIAkJCQlsaW5lID0gbGluZS50cmltKCk7CkBAIC0xNjcsMTUgKzE1Nyw4IEBAIHByaXZhdGUgc3RhdGljIHZvaWQgc2NhbihDbGFzc0xvYWRlciBsZHIsIFVSTCB1cmwpIHsKIAkJCQkJbGluZSA9IGxpbmUuc3Vic3RyaW5nKDAsIGNvbW1lbnQpLnRyaW0oKTsKIAkJCQlsb2FkKGxkciwgbGluZSk7CiAJCQl9Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGVycikgewotCQkJLy8gSWYgd2UgZmFpbGVkIGR1cmluZyBhIHJlYWQsIGlnbm9yZSB0aGUgZXJyb3IuCi0JCQkvLwotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlici5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCS8vIElnbm9yZSB0aGUgY2xvc2UgZXJyb3I7IHdlIGFyZSBvbmx5IHJlYWRpbmcuCi0JCQl9CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCS8vIElnbm9yZSBlcnJvcnMKIAkJfQogCX0KIApAQCAtMjg4LDcgKzI3MSw3IEBAIHB1YmxpYyBzdGF0aWMgTGlzdDxUcmFuc3BvcnRQcm90b2NvbD4gZ2V0VHJhbnNwb3J0UHJvdG9jb2xzKCkgewogCSAqIEB0aHJvd3Mgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuVHJhbnNwb3J0RXhjZXB0aW9uCiAJICogICAgICAgICAgICAgdGhlIHRyYW5zcG9ydCBjYW5ub3Qgb3BlbiB0aGlzIFVSSS4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIFRyYW5zcG9ydCBvcGVuKGZpbmFsIFJlcG9zaXRvcnkgbG9jYWwsIGZpbmFsIFN0cmluZyByZW1vdGUpCisJcHVibGljIHN0YXRpYyBUcmFuc3BvcnQgb3BlbihSZXBvc2l0b3J5IGxvY2FsLCBTdHJpbmcgcmVtb3RlKQogCQkJdGhyb3dzIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiwgVVJJU3ludGF4RXhjZXB0aW9uLAogCQkJVHJhbnNwb3J0RXhjZXB0aW9uIHsKIAkJcmV0dXJuIG9wZW4obG9jYWwsIHJlbW90ZSwgT3BlcmF0aW9uLkZFVENIKTsKQEAgLTQxMCw3ICszOTMsNyBAQCBwdWJsaWMgc3RhdGljIExpc3Q8VHJhbnNwb3J0PiBvcGVuQWxsKGZpbmFsIFJlcG9zaXRvcnkgbG9jYWwsCiAJICogICAgICAgICAgICAgaWYgcHJvdmlkZWQgcmVtb3RlIGNvbmZpZ3VyYXRpb24gZG9lc24ndCBoYXZlIGFueSBVUkkKIAkgKiAgICAgICAgICAgICBhc3NvY2lhdGVkLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgVHJhbnNwb3J0IG9wZW4oZmluYWwgUmVwb3NpdG9yeSBsb2NhbCwgZmluYWwgUmVtb3RlQ29uZmlnIGNmZykKKwlwdWJsaWMgc3RhdGljIFRyYW5zcG9ydCBvcGVuKFJlcG9zaXRvcnkgbG9jYWwsIFJlbW90ZUNvbmZpZyBjZmcpCiAJCQl0aHJvd3MgTm90U3VwcG9ydGVkRXhjZXB0aW9uLCBUcmFuc3BvcnRFeGNlcHRpb24gewogCQlyZXR1cm4gb3Blbihsb2NhbCwgY2ZnLCBPcGVyYXRpb24uRkVUQ0gpOwogCX0KQEAgLTQ5NSw3ICs0NzgsNyBAQCBwdWJsaWMgc3RhdGljIExpc3Q8VHJhbnNwb3J0PiBvcGVuQWxsKGZpbmFsIFJlcG9zaXRvcnkgbG9jYWwsCiAJCQl0aHJvd3MgTm90U3VwcG9ydGVkRXhjZXB0aW9uLCBUcmFuc3BvcnRFeGNlcHRpb24gewogCQlmaW5hbCBMaXN0PFVSSWlzaD4gdXJpcyA9IGdldFVSSXMoY2ZnLCBvcCk7CiAJCWZpbmFsIExpc3Q8VHJhbnNwb3J0PiB0cmFuc3BvcnRzID0gbmV3IEFycmF5TGlzdDw+KHVyaXMuc2l6ZSgpKTsKLQkJZm9yIChmaW5hbCBVUklpc2ggdXJpIDogdXJpcykgeworCQlmb3IgKFVSSWlzaCB1cmkgOiB1cmlzKSB7CiAJCQlmaW5hbCBUcmFuc3BvcnQgdG4gPSBvcGVuKGxvY2FsLCB1cmksIGNmZy5nZXROYW1lKCkpOwogCQkJdG4uYXBwbHlDb25maWcoY2ZnKTsKIAkJCXRyYW5zcG9ydHMuYWRkKHRuKTsKQEAgLTUxOSw3ICs1MDIsNyBAQCBwcml2YXRlIHN0YXRpYyBMaXN0PFVSSWlzaD4gZ2V0VVJJcyhmaW5hbCBSZW1vdGVDb25maWcgY2ZnLAogCQl9CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBkb2VzTm90RXhpc3QoZmluYWwgUmVtb3RlQ29uZmlnIGNmZykgeworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZG9lc05vdEV4aXN0KFJlbW90ZUNvbmZpZyBjZmcpIHsKIAkJcmV0dXJuIGNmZy5nZXRVUklzKCkuaXNFbXB0eSgpICYmIGNmZy5nZXRQdXNoVVJJcygpLmlzRW1wdHkoKTsKIAl9CiAKQEAgLTUzNiw3ICs1MTksNyBAQCBwcml2YXRlIHN0YXRpYyBib29sZWFuIGRvZXNOb3RFeGlzdChmaW5hbCBSZW1vdGVDb25maWcgY2ZnKSB7CiAJICogQHRocm93cyBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5UcmFuc3BvcnRFeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0aGUgdHJhbnNwb3J0IGNhbm5vdCBvcGVuIHRoaXMgVVJJLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgVHJhbnNwb3J0IG9wZW4oZmluYWwgUmVwb3NpdG9yeSBsb2NhbCwgZmluYWwgVVJJaXNoIHVyaSkKKwlwdWJsaWMgc3RhdGljIFRyYW5zcG9ydCBvcGVuKFJlcG9zaXRvcnkgbG9jYWwsIFVSSWlzaCB1cmkpCiAJCQl0aHJvd3MgTm90U3VwcG9ydGVkRXhjZXB0aW9uLCBUcmFuc3BvcnRFeGNlcHRpb24gewogCQlyZXR1cm4gb3Blbihsb2NhbCwgdXJpLCBudWxsKTsKIAl9CkBAIC02MzgsNyArNjIxLDcgQEAgcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPFJlbW90ZVJlZlVwZGF0ZT4gZmluZFJlbW90ZVJlZlVwZGF0ZXNGb3IoCiAJCWZpbmFsIExpc3Q8UmVtb3RlUmVmVXBkYXRlPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDw+KCk7CiAJCWZpbmFsIENvbGxlY3Rpb248UmVmU3BlYz4gcHJvY1JlZnMgPSBleHBhbmRQdXNoV2lsZGNhcmRzRm9yKGRiLCBzcGVjcyk7CiAKLQkJZm9yIChmaW5hbCBSZWZTcGVjIHNwZWMgOiBwcm9jUmVmcykgeworCQlmb3IgKFJlZlNwZWMgc3BlYyA6IHByb2NSZWZzKSB7CiAJCQlTdHJpbmcgc3JjU3BlYyA9IHNwZWMuZ2V0U291cmNlKCk7CiAJCQlmaW5hbCBSZWYgc3JjUmVmID0gZGIuZmluZFJlZihzcmNTcGVjKTsKIAkJCWlmIChzcmNSZWYgIT0gbnVsbCkKQEAgLTcwNSwxMiArNjg4LDEyIEBAIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxSZW1vdGVSZWZVcGRhdGU+IGZpbmRSZW1vdGVSZWZVcGRhdGVzRm9yKAogCXByaXZhdGUgc3RhdGljIENvbGxlY3Rpb248UmVmU3BlYz4gZXhwYW5kUHVzaFdpbGRjYXJkc0ZvcigKIAkJCWZpbmFsIFJlcG9zaXRvcnkgZGIsIGZpbmFsIENvbGxlY3Rpb248UmVmU3BlYz4gc3BlY3MpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmaW5hbCBNYXA8U3RyaW5nLCBSZWY+IGxvY2FsUmVmcyA9IGRiLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcyhBTEwpOwotCQlmaW5hbCBDb2xsZWN0aW9uPFJlZlNwZWM+IHByb2NSZWZzID0gbmV3IEhhc2hTZXQ8PigpOworCQlmaW5hbCBMaXN0PFJlZj4gbG9jYWxSZWZzID0gZGIuZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzKCk7CisJCWZpbmFsIENvbGxlY3Rpb248UmVmU3BlYz4gcHJvY1JlZnMgPSBuZXcgTGlua2VkSGFzaFNldDw+KCk7CiAKLQkJZm9yIChmaW5hbCBSZWZTcGVjIHNwZWMgOiBzcGVjcykgeworCQlmb3IgKFJlZlNwZWMgc3BlYyA6IHNwZWNzKSB7CiAJCQlpZiAoc3BlYy5pc1dpbGRjYXJkKCkpIHsKLQkJCQlmb3IgKGZpbmFsIFJlZiBsb2NhbFJlZiA6IGxvY2FsUmVmcy52YWx1ZXMoKSkgeworCQkJCWZvciAoUmVmIGxvY2FsUmVmIDogbG9jYWxSZWZzKSB7CiAJCQkJCWlmIChzcGVjLm1hdGNoU291cmNlKGxvY2FsUmVmKSkKIAkJCQkJCXByb2NSZWZzLmFkZChzcGVjLmV4cGFuZEZyb21Tb3VyY2UobG9jYWxSZWYpKTsKIAkJCQl9CkBAIC03MjQsNyArNzA3LDcgQEAgcHJpdmF0ZSBzdGF0aWMgQ29sbGVjdGlvbjxSZWZTcGVjPiBleHBhbmRQdXNoV2lsZGNhcmRzRm9yKAogCXByaXZhdGUgc3RhdGljIFN0cmluZyBmaW5kVHJhY2tpbmdSZWZOYW1lKGZpbmFsIFN0cmluZyByZW1vdGVOYW1lLAogCQkJZmluYWwgQ29sbGVjdGlvbjxSZWZTcGVjPiBmZXRjaFNwZWNzKSB7CiAJCS8vIHRyeSB0byBmaW5kIG1hdGNoaW5nIHRyYWNraW5nIHJlZnMKLQkJZm9yIChmaW5hbCBSZWZTcGVjIGZldGNoU3BlYyA6IGZldGNoU3BlY3MpIHsKKwkJZm9yIChSZWZTcGVjIGZldGNoU3BlYyA6IGZldGNoU3BlY3MpIHsKIAkJCWlmIChmZXRjaFNwZWMubWF0Y2hTb3VyY2UocmVtb3RlTmFtZSkpIHsKIAkJCQlpZiAoZmV0Y2hTcGVjLmlzV2lsZGNhcmQoKSkKIAkJCQkJcmV0dXJuIGZldGNoU3BlYy5leHBhbmRGcm9tU291cmNlKHJlbW90ZU5hbWUpCkBAIC04MDcsNiArNzkwLDggQEAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZpbmRUcmFja2luZ1JlZk5hbWUoZmluYWwgU3RyaW5nIHJlbW90ZU5hbWUsCiAJLyoqIFNob3VsZCByZWZzIG5vIGxvbmdlciBvbiB0aGUgc291cmNlIGJlIHBydW5lZCBmcm9tIHRoZSBkZXN0aW5hdGlvbj8gKi8KIAlwcml2YXRlIGJvb2xlYW4gcmVtb3ZlRGVsZXRlZFJlZnM7CiAKKwlwcml2YXRlIGxvbmcgZmlsdGVyQmxvYkxpbWl0ID0gLTE7CisKIAkvKiogVGltZW91dCBpbiBzZWNvbmRzIHRvIHdhaXQgYmVmb3JlIGFib3J0aW5nIGFuIElPIHJlYWQgb3Igd3JpdGUuICovCiAJcHJpdmF0ZSBpbnQgdGltZW91dDsKIApAQCAtODMzLDcgKzgxOCw3IEBAIHByaXZhdGUgc3RhdGljIFN0cmluZyBmaW5kVHJhY2tpbmdSZWZOYW1lKGZpbmFsIFN0cmluZyByZW1vdGVOYW1lLAogCSAqICAgICAgICAgICAgdGhlIFVSSSB1c2VkIHRvIGFjY2VzcyB0aGUgcmVtb3RlIHJlcG9zaXRvcnkuIFRoaXMgbXVzdCBiZSB0aGUKIAkgKiAgICAgICAgICAgIFVSSSBwYXNzZWQgdG8ge0BsaW5rICNvcGVuKFJlcG9zaXRvcnksIFVSSWlzaCl9LgogCSAqLwotCXByb3RlY3RlZCBUcmFuc3BvcnQoZmluYWwgUmVwb3NpdG9yeSBsb2NhbCwgZmluYWwgVVJJaXNoIHVyaSkgeworCXByb3RlY3RlZCBUcmFuc3BvcnQoUmVwb3NpdG9yeSBsb2NhbCwgVVJJaXNoIHVyaSkgewogCQlmaW5hbCBUcmFuc2ZlckNvbmZpZyB0YyA9IGxvY2FsLmdldENvbmZpZygpLmdldChUcmFuc2ZlckNvbmZpZy5LRVkpOwogCQl0aGlzLmxvY2FsID0gbG9jYWw7CiAJCXRoaXMudXJpID0gdXJpOwpAQCAtODQ4LDcgKzgzMyw3IEBAIHByb3RlY3RlZCBUcmFuc3BvcnQoZmluYWwgUmVwb3NpdG9yeSBsb2NhbCwgZmluYWwgVVJJaXNoIHVyaSkgewogCSAqIEBwYXJhbSB1cmkKIAkgKiAgICAgICAgICAgIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlVSSWlzaH0gb2JqZWN0LgogCSAqLwotCXByb3RlY3RlZCBUcmFuc3BvcnQoZmluYWwgVVJJaXNoIHVyaSkgeworCXByb3RlY3RlZCBUcmFuc3BvcnQoVVJJaXNoIHVyaSkgewogCQl0aGlzLnVyaSA9IHVyaTsKIAkJdGhpcy5sb2NhbCA9IG51bGw7CiAJCXRoaXMub2JqZWN0Q2hlY2tlciA9IG5ldyBPYmplY3RDaGVja2VyKCk7CkBAIC04ODEsNyArODY2LDcgQEAgcHVibGljIFN0cmluZyBnZXRPcHRpb25VcGxvYWRQYWNrKCkgewogCSAqIEBwYXJhbSB3aGVyZQogCSAqICAgICAgICAgICAgbmFtZSBvZiB0aGUgZXhlY3V0YWJsZS4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPcHRpb25VcGxvYWRQYWNrKGZpbmFsIFN0cmluZyB3aGVyZSkgeworCXB1YmxpYyB2b2lkIHNldE9wdGlvblVwbG9hZFBhY2soU3RyaW5nIHdoZXJlKSB7CiAJCWlmICh3aGVyZSAhPSBudWxsICYmIHdoZXJlLmxlbmd0aCgpID4gMCkKIAkJCW9wdGlvblVwbG9hZFBhY2sgPSB3aGVyZTsKIAkJZWxzZQpAQCAtOTAzLDcgKzg4OCw3IEBAIHB1YmxpYyBUYWdPcHQgZ2V0VGFnT3B0KCkgewogCSAqIEBwYXJhbSBvcHRpb24KIAkgKiAgICAgICAgICAgIG1ldGhvZCB0byB1c2Ugd2hlbiBoYW5kbGluZyBhbm5vdGF0ZWQgdGFncy4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYWdPcHQoZmluYWwgVGFnT3B0IG9wdGlvbikgeworCXB1YmxpYyB2b2lkIHNldFRhZ09wdChUYWdPcHQgb3B0aW9uKSB7CiAJCXRhZ29wdCA9IG9wdGlvbiAhPSBudWxsID8gb3B0aW9uIDogVGFnT3B0LkFVVE9fRk9MTE9XOwogCX0KIApAQCAtOTI3LDcgKzkxMiw3IEBAIHB1YmxpYyBib29sZWFuIGlzRmV0Y2hUaGluKCkgewogCSAqICAgICAgICAgICAgd2hlbiBpdCBzaG91bGRuJ3QKIAkgKiBAc2VlIFBhY2tUcmFuc3BvcnQKIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGZXRjaFRoaW4oZmluYWwgYm9vbGVhbiBmZXRjaFRoaW4pIHsKKwlwdWJsaWMgdm9pZCBzZXRGZXRjaFRoaW4oYm9vbGVhbiBmZXRjaFRoaW4pIHsKIAkJdGhpcy5mZXRjaFRoaW4gPSBmZXRjaFRoaW47CiAJfQogCkBAIC05NTAsNyArOTM1LDcgQEAgcHVibGljIGJvb2xlYW4gaXNDaGVja0ZldGNoZWRPYmplY3RzKCkgewogCSAqICAgICAgICAgICAgcmVjZWl2ZWQgb2JqZWN0cyBhcmUgdmFsaWQuCiAJICogQHNlZSAjc2V0T2JqZWN0Q2hlY2tlcihPYmplY3RDaGVja2VyKQogCSAqLwotCXB1YmxpYyB2b2lkIHNldENoZWNrRmV0Y2hlZE9iamVjdHMoZmluYWwgYm9vbGVhbiBjaGVjaykgeworCXB1YmxpYyB2b2lkIHNldENoZWNrRmV0Y2hlZE9iamVjdHMoYm9vbGVhbiBjaGVjaykgewogCQlpZiAoY2hlY2sgJiYgb2JqZWN0Q2hlY2tlciA9PSBudWxsKQogCQkJc2V0T2JqZWN0Q2hlY2tlcihuZXcgT2JqZWN0Q2hlY2tlcigpKTsKIAkJZWxzZSBpZiAoIWNoZWNrICYmIG9iamVjdENoZWNrZXIgIT0gbnVsbCkKQEAgLTEwMjUsNyArMTAxMCw3IEBAIHB1YmxpYyBib29sZWFuIGlzUHVzaFRoaW4oKSB7CiAJICogICAgICAgICAgICBmYWxzZSB3aGVuIGl0IHNob3VsZG4ndAogCSAqIEBzZWUgUGFja1RyYW5zcG9ydAogCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1c2hUaGluKGZpbmFsIGJvb2xlYW4gcHVzaFRoaW4pIHsKKwlwdWJsaWMgdm9pZCBzZXRQdXNoVGhpbihib29sZWFuIHB1c2hUaGluKSB7CiAJCXRoaXMucHVzaFRoaW4gPSBwdXNoVGhpbjsKIAl9CiAKQEAgLTEwNTAsNyArMTAzNSw3IEBAIHB1YmxpYyBib29sZWFuIGlzUHVzaEF0b21pYygpIHsKIAkgKiBAc2VlIFBhY2tUcmFuc3BvcnQKIAkgKiBAc2luY2UgNC4yCiAJICovCi0JcHVibGljIHZvaWQgc2V0UHVzaEF0b21pYyhmaW5hbCBib29sZWFuIGF0b21pYykgeworCXB1YmxpYyB2b2lkIHNldFB1c2hBdG9taWMoYm9vbGVhbiBhdG9taWMpIHsKIAkJdGhpcy5wdXNoQXRvbWljID0gYXRvbWljOwogCX0KIApAQCAtMTA3NywxNyArMTA2MiwzNCBAQCBwdWJsaWMgYm9vbGVhbiBpc1JlbW92ZURlbGV0ZWRSZWZzKCkgewogCSAqCiAJICogQHBhcmFtIHJlbW92ZSB0cnVlIHRvIHJlbW92ZSByZWZzIHRoYXQgbm8gbG9uZ2VyIGV4aXN0LgogCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlbW92ZURlbGV0ZWRSZWZzKGZpbmFsIGJvb2xlYW4gcmVtb3ZlKSB7CisJcHVibGljIHZvaWQgc2V0UmVtb3ZlRGVsZXRlZFJlZnMoYm9vbGVhbiByZW1vdmUpIHsKIAkJcmVtb3ZlRGVsZXRlZFJlZnMgPSByZW1vdmU7CiAJfQogCiAJLyoqCisJICogQHJldHVybiB0aGUgbGFzdCB2YWx1ZSBwYXNzZWQgdG8ge0BsaW5rICNzZXRGaWx0ZXJCbG9iTGltaXR9LCBvciAtMSBpZgorCSAqICAgICAgICAgaXQgd2FzIG5ldmVyIGludm9rZWQuCisJICogQHNpbmNlIDUuMAorCSAqLworCXB1YmxpYyBsb25nIGdldEZpbHRlckJsb2JMaW1pdCgpIHsKKwkJcmV0dXJuIGZpbHRlckJsb2JMaW1pdDsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gYnl0ZXMgZXhjbHVkZSBibG9icyBvZiBzaXplIGdyZWF0ZXIgdGhhbiB0aGlzCisJICogQHNpbmNlIDUuMAorCSAqLworCXB1YmxpYyB2b2lkIHNldEZpbHRlckJsb2JMaW1pdChsb25nIGJ5dGVzKSB7CisJCWZpbHRlckJsb2JMaW1pdCA9IGJ5dGVzOworCX0KKworCS8qKgogCSAqIEFwcGx5IHByb3ZpZGVkIHJlbW90ZSBjb25maWd1cmF0aW9uIG9uIHRoaXMgdHJhbnNwb3J0LgogCSAqCiAJICogQHBhcmFtIGNmZwogCSAqICAgICAgICAgICAgY29uZmlndXJhdGlvbiB0byBhcHBseSBvbiB0aGlzIHRyYW5zcG9ydC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBhcHBseUNvbmZpZyhmaW5hbCBSZW1vdGVDb25maWcgY2ZnKSB7CisJcHVibGljIHZvaWQgYXBwbHlDb25maWcoUmVtb3RlQ29uZmlnIGNmZykgewogCQlzZXRPcHRpb25VcGxvYWRQYWNrKGNmZy5nZXRVcGxvYWRQYWNrKCkpOwogCQlzZXRPcHRpb25SZWNlaXZlUGFjayhjZmcuZ2V0UmVjZWl2ZVBhY2soKSk7CiAJCXNldFRhZ09wdChjZmcuZ2V0VGFnT3B0KCkpOwpAQCAtMTExNiw3ICsxMTE4LDcgQEAgcHVibGljIGJvb2xlYW4gaXNEcnlSdW4oKSB7CiAJICogICAgICAgICAgICBhbmQgbm90IHJlYWxseSB1cGRhdGUgcmVtb3RlIHJlZnMsIGZhbHNlIG90aGVyd2lzZSAtIHdoZW4gcHVzaAogCSAqICAgICAgICAgICAgc2hvdWxkIGFjdCBub3JtYWxseS4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXREcnlSdW4oZmluYWwgYm9vbGVhbiBkcnlSdW4pIHsKKwlwdWJsaWMgdm9pZCBzZXREcnlSdW4oYm9vbGVhbiBkcnlSdW4pIHsKIAkJdGhpcy5kcnlSdW4gPSBkcnlSdW47CiAJfQogCkBAIC0xMTM3LDcgKzExMzksNyBAQCBwdWJsaWMgaW50IGdldFRpbWVvdXQoKSB7CiAJICogICAgICAgICAgICBiZWZvcmUgYWJvcnRpbmcgYW4gSU8gcmVhZCBvciB3cml0ZSBvcGVyYXRpb24gd2l0aCB0aGlzCiAJICogICAgICAgICAgICByZW1vdGUuCiAJICovCi0JcHVibGljIHZvaWQgc2V0VGltZW91dChmaW5hbCBpbnQgc2Vjb25kcykgeworCXB1YmxpYyB2b2lkIHNldFRpbWVvdXQoaW50IHNlY29uZHMpIHsKIAkJdGltZW91dCA9IHNlY29uZHM7CiAJfQogCkBAIC0xMjA0LDcgKzEyMDYsNyBAQCBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldFB1c2hPcHRpb25zKCkgewogCSAqICAgICAgICAgICAgbnVsbCBpZiBwdXNoIG9wdGlvbnMgYXJlIHVuc3VwcG9ydGVkCiAJICogQHNpbmNlIDQuNQogCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1c2hPcHRpb25zKGZpbmFsIExpc3Q8U3RyaW5nPiBwdXNoT3B0aW9ucykgeworCXB1YmxpYyB2b2lkIHNldFB1c2hPcHRpb25zKExpc3Q8U3RyaW5nPiBwdXNoT3B0aW9ucykgewogCQl0aGlzLnB1c2hPcHRpb25zID0gcHVzaE9wdGlvbnM7CiAJfQogCkBAIC0xMjUxLDkgKzEyNTMsOSBAQCBwdWJsaWMgRmV0Y2hSZXN1bHQgZmV0Y2goZmluYWwgUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsCiAJCQkvLyBvYmplY3QgdHJhbnNmZXIgb3ZlcmhlYWRzLgogCQkJLy8KIAkJCWZpbmFsIENvbGxlY3Rpb248UmVmU3BlYz4gdG1wID0gbmV3IEFycmF5TGlzdDw+KHRvRmV0Y2gpOwotCQkJZm9yIChmaW5hbCBSZWZTcGVjIHJlcXVlc3RlZCA6IHRvRmV0Y2gpIHsKKwkJCWZvciAoUmVmU3BlYyByZXF1ZXN0ZWQgOiB0b0ZldGNoKSB7CiAJCQkJZmluYWwgU3RyaW5nIHJlcVNyYyA9IHJlcXVlc3RlZC5nZXRTb3VyY2UoKTsKLQkJCQlmb3IgKGZpbmFsIFJlZlNwZWMgY29uZmlndXJlZCA6IGZldGNoKSB7CisJCQkJZm9yIChSZWZTcGVjIGNvbmZpZ3VyZWQgOiBmZXRjaCkgewogCQkJCQlmaW5hbCBTdHJpbmcgY2ZnU3JjID0gY29uZmlndXJlZC5nZXRTb3VyY2UoKTsKIAkJCQkJZmluYWwgU3RyaW5nIGNmZ0RzdCA9IGNvbmZpZ3VyZWQuZ2V0RGVzdGluYXRpb24oKTsKIAkJCQkJaWYgKGNmZ1NyYy5lcXVhbHMocmVxU3JjKSAmJiBjZmdEc3QgIT0gbnVsbCkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVHJhbnNwb3J0QW1hem9uUzMuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RyYW5zcG9ydEFtYXpvblMzLmphdmEKaW5kZXggYzYxOTFlY2ViLi42MTE4Y2I4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UcmFuc3BvcnRBbWF6b25TMy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RyYW5zcG9ydEFtYXpvblMzLmphdmEKQEAgLTI2Nyw3ICsyNjcsNyBAQCBDb2xsZWN0aW9uPFdhbGtSZW1vdGVPYmplY3REYXRhYmFzZT4gZ2V0QWx0ZXJuYXRlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJV2Fsa1JlbW90ZU9iamVjdERhdGFiYXNlIG9wZW5BbHRlcm5hdGUoZmluYWwgU3RyaW5nIGxvY2F0aW9uKQorCQlXYWxrUmVtb3RlT2JqZWN0RGF0YWJhc2Ugb3BlbkFsdGVybmF0ZShTdHJpbmcgbG9jYXRpb24pCiAJCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCXJldHVybiBuZXcgRGF0YWJhc2VTMyhidWNrZXROYW1lLCByZXNvbHZlS2V5KGxvY2F0aW9uKSk7CiAJCX0KQEAgLTI3OCw3ICsyNzgsNyBAQCBDb2xsZWN0aW9uPFN0cmluZz4gZ2V0UGFja05hbWVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCWhhdmUuYWRkQWxsKHMzLmxpc3QoYnVja2V0LCByZXNvbHZlS2V5KCJwYWNrIikpKTsgLy8kTk9OLU5MUy0xJAogCiAJCQlmaW5hbCBDb2xsZWN0aW9uPFN0cmluZz4gcGFja3MgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLQkJCWZvciAoZmluYWwgU3RyaW5nIG4gOiBoYXZlKSB7CisJCQlmb3IgKFN0cmluZyBuIDogaGF2ZSkgewogCQkJCWlmICghbi5zdGFydHNXaXRoKCJwYWNrLSIpIHx8ICFuLmVuZHNXaXRoKCIucGFjayIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJCQkJY29udGludWU7CiAKQEAgLTI5MCw3ICsyOTAsNyBAQCBDb2xsZWN0aW9uPFN0cmluZz4gZ2V0UGFja05hbWVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJfQogCiAJCUBPdmVycmlkZQotCQlGaWxlU3RyZWFtIG9wZW4oZmluYWwgU3RyaW5nIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUZpbGVTdHJlYW0gb3BlbihTdHJpbmcgcGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCWZpbmFsIFVSTENvbm5lY3Rpb24gYyA9IHMzLmdldChidWNrZXQsIHJlc29sdmVLZXkocGF0aCkpOwogCQkJZmluYWwgSW5wdXRTdHJlYW0gcmF3ID0gYy5nZXRJbnB1dFN0cmVhbSgpOwogCQkJZmluYWwgSW5wdXRTdHJlYW0gaW4gPSBzMy5kZWNyeXB0KGMpOwpAQCAtMjk5LDcgKzI5OSw3IEBAIEZpbGVTdHJlYW0gb3BlbihmaW5hbCBTdHJpbmcgcGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJfQogCiAJCUBPdmVycmlkZQotCQl2b2lkIGRlbGV0ZUZpbGUoZmluYWwgU3RyaW5nIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXZvaWQgZGVsZXRlRmlsZShTdHJpbmcgcGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCXMzLmRlbGV0ZShidWNrZXQsIHJlc29sdmVLZXkocGF0aCkpOwogCQl9CiAKQEAgLTMxMSw3ICszMTEsNyBAQCBPdXRwdXRTdHJlYW0gd3JpdGVGaWxlKGZpbmFsIFN0cmluZyBwYXRoLAogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXZvaWQgd3JpdGVGaWxlKGZpbmFsIFN0cmluZyBwYXRoLCBmaW5hbCBieXRlW10gZGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJdm9pZCB3cml0ZUZpbGUoU3RyaW5nIHBhdGgsIGJ5dGVbXSBkYXRhKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJczMucHV0KGJ1Y2tldCwgcmVzb2x2ZUtleShwYXRoKSwgZGF0YSk7CiAJCX0KIApAQCAtMzIzLDcgKzMyMyw3IEBAIE1hcDxTdHJpbmcsIFJlZj4gcmVhZEFkdmVydGlzZWRSZWZzKCkgdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAJCQlyZXR1cm4gYXZhaWw7CiAJCX0KIAotCQlwcml2YXRlIHZvaWQgcmVhZExvb3NlUmVmcyhmaW5hbCBUcmVlTWFwPFN0cmluZywgUmVmPiBhdmFpbCkKKwkJcHJpdmF0ZSB2b2lkIHJlYWRMb29zZVJlZnMoVHJlZU1hcDxTdHJpbmcsIFJlZj4gYXZhaWwpCiAJCQkJdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAJCQl0cnkgewogCQkJCWZvciAoZmluYWwgU3RyaW5nIG4gOiBzMy5saXN0KGJ1Y2tldCwgcmVzb2x2ZUtleShST09UX0RJUgpAQCAtMzM0LDE2ICszMzQsMTMgQEAgcHJpdmF0ZSB2b2lkIHJlYWRMb29zZVJlZnMoZmluYWwgVHJlZU1hcDxTdHJpbmcsIFJlZj4gYXZhaWwpCiAJCQl9CiAJCX0KIAotCQlwcml2YXRlIFJlZiByZWFkUmVmKGZpbmFsIFRyZWVNYXA8U3RyaW5nLCBSZWY+IGF2YWlsLCBmaW5hbCBTdHJpbmcgcm4pCisJCXByaXZhdGUgUmVmIHJlYWRSZWYoVHJlZU1hcDxTdHJpbmcsIFJlZj4gYXZhaWwsIFN0cmluZyBybikKIAkJCQl0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKIAkJCWZpbmFsIFN0cmluZyBzOwogCQkJU3RyaW5nIHJlZiA9IFJPT1RfRElSICsgcm47CiAJCQl0cnkgewotCQkJCWZpbmFsIEJ1ZmZlcmVkUmVhZGVyIGJyID0gb3BlblJlYWRlcihyZWYpOwotCQkJCXRyeSB7CisJCQkJdHJ5IChCdWZmZXJlZFJlYWRlciBiciA9IG9wZW5SZWFkZXIocmVmKSkgewogCQkJCQlzID0gYnIucmVhZExpbmUoKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlici5jbG9zZSgpOwogCQkJCX0KIAkJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBub1JlZikgewogCQkJCXJldHVybiBudWxsOwpAQCAtMzc3LDcgKzM3NCw3IEBAIHByaXZhdGUgUmVmIHJlYWRSZWYoZmluYWwgVHJlZU1hcDxTdHJpbmcsIFJlZj4gYXZhaWwsIGZpbmFsIFN0cmluZyBybikKIAkJCXRocm93IG5ldyBUcmFuc3BvcnRFeGNlcHRpb24oZ2V0VVJJKCksIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpHaXRUZXh0LmdldCgpLnRyYW5zcG9ydEV4Y2VwdGlvbkJhZFJlZiwgcm4sIHMpKTsKIAkJfQogCi0JCXByaXZhdGUgU3RvcmFnZSBsb29zZShmaW5hbCBSZWYgcikgeworCQlwcml2YXRlIFN0b3JhZ2UgbG9vc2UoUmVmIHIpIHsKIAkJCWlmIChyICE9IG51bGwgJiYgci5nZXRTdG9yYWdlKCkgPT0gU3RvcmFnZS5QQUNLRUQpCiAJCQkJcmV0dXJuIFN0b3JhZ2UuTE9PU0VfUEFDS0VEOwogCQkJcmV0dXJuIFN0b3JhZ2UuTE9PU0U7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UcmFuc3BvcnRHaXRBbm9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UcmFuc3BvcnRHaXRBbm9uLmphdmEKaW5kZXggODE2MTg3ZS4uMTEzMjUwMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVHJhbnNwb3J0R2l0QW5vbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RyYW5zcG9ydEdpdEFub24uamF2YQpAQCAtMTEzLDExICsxMTMsMTEgQEAgcHVibGljIFRyYW5zcG9ydCBvcGVuKFVSSWlzaCB1cmkpIHRocm93cyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24sIFRyYW5zcG9ydEV4Y2VwdGkKIAkJfQogCX07CiAKLQlUcmFuc3BvcnRHaXRBbm9uKGZpbmFsIFJlcG9zaXRvcnkgbG9jYWwsIGZpbmFsIFVSSWlzaCB1cmkpIHsKKwlUcmFuc3BvcnRHaXRBbm9uKFJlcG9zaXRvcnkgbG9jYWwsIFVSSWlzaCB1cmkpIHsKIAkJc3VwZXIobG9jYWwsIHVyaSk7CiAJfQogCi0JVHJhbnNwb3J0R2l0QW5vbihmaW5hbCBVUklpc2ggdXJpKSB7CisJVHJhbnNwb3J0R2l0QW5vbihVUklpc2ggdXJpKSB7CiAJCXN1cGVyKHVyaSk7CiAJfQogCkBAIC0xNDIsNiArMTQyLDcgQEAgcHVibGljIHZvaWQgY2xvc2UoKSB7CiAJU29ja2V0IG9wZW5Db25uZWN0aW9uKCkgdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAJCWZpbmFsIGludCB0bXMgPSBnZXRUaW1lb3V0KCkgPiAwID8gZ2V0VGltZW91dCgpICogMTAwMCA6IDA7CiAJCWZpbmFsIGludCBwb3J0ID0gdXJpLmdldFBvcnQoKSA+IDAgPyB1cmkuZ2V0UG9ydCgpIDogR0lUX1BPUlQ7CisJCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpIC8vIENsb3NlZCBieSB0aGUgY2FsbGVyCiAJCWZpbmFsIFNvY2tldCBzID0gbmV3IFNvY2tldCgpOwogCQl0cnkgewogCQkJZmluYWwgSW5ldEFkZHJlc3MgaG9zdCA9IEluZXRBZGRyZXNzLmdldEJ5TmFtZSh1cmkuZ2V0SG9zdCgpKTsKQEAgLTE2Miw3ICsxNjMsNyBAQCBTb2NrZXQgb3BlbkNvbm5lY3Rpb24oKSB0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKIAkJcmV0dXJuIHM7CiAJfQogCi0Jdm9pZCBzZXJ2aWNlKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBQYWNrZXRMaW5lT3V0IHBja091dCkKKwl2b2lkIHNlcnZpY2UoU3RyaW5nIG5hbWUsIFBhY2tldExpbmVPdXQgcGNrT3V0KQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgU3RyaW5nQnVpbGRlciBjbWQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogCQljbWQuYXBwZW5kKG5hbWUpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVHJhbnNwb3J0R2l0U3NoLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UcmFuc3BvcnRHaXRTc2guamF2YQppbmRleCBiYzg1ZTZmLi5kNTlmZTMzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UcmFuc3BvcnRHaXRTc2guamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UcmFuc3BvcnRHaXRTc2guamF2YQpAQCAtMTQxLDEyICsxNDEsMTIgQEAgcHVibGljIFRyYW5zcG9ydCBvcGVuKFVSSWlzaCB1cmkpIHRocm93cyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24sIFRyYW5zcG9ydEV4Y2VwdGkKIAkJfQogCX07CiAKLQlUcmFuc3BvcnRHaXRTc2goZmluYWwgUmVwb3NpdG9yeSBsb2NhbCwgZmluYWwgVVJJaXNoIHVyaSkgeworCVRyYW5zcG9ydEdpdFNzaChSZXBvc2l0b3J5IGxvY2FsLCBVUklpc2ggdXJpKSB7CiAJCXN1cGVyKGxvY2FsLCB1cmkpOwogCQlpbml0U3NoU2Vzc2lvbkZhY3RvcnkoKTsKIAl9CiAKLQlUcmFuc3BvcnRHaXRTc2goZmluYWwgVVJJaXNoIHVyaSkgeworCVRyYW5zcG9ydEdpdFNzaChVUklpc2ggdXJpKSB7CiAJCXN1cGVyKHVyaSk7CiAJCWluaXRTc2hTZXNzaW9uRmFjdG9yeSgpOwogCX0KQEAgLTE3Niw3ICsxNzYsNyBAQCBwdWJsaWMgUHVzaENvbm5lY3Rpb24gb3BlblB1c2goKSB0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKIAkJcmV0dXJuIG5ldyBTc2hQdXNoQ29ubmVjdGlvbigpOwogCX0KIAotCVN0cmluZyBjb21tYW5kRm9yKGZpbmFsIFN0cmluZyBleGUpIHsKKwlTdHJpbmcgY29tbWFuZEZvcihTdHJpbmcgZXhlKSB7CiAJCVN0cmluZyBwYXRoID0gdXJpLmdldFBhdGgoKTsKIAkJaWYgKHVyaS5nZXRTY2hlbWUoKSAhPSBudWxsICYmIHVyaS5nZXRQYXRoKCkuc3RhcnRzV2l0aCgiL34iKSkgLy8kTk9OLU5MUy0xJAogCQkJcGF0aCA9ICh1cmkuZ2V0UGF0aCgpLnN1YnN0cmluZygxKSk7CkBAIC0zMTEsNiArMzExLDkgQEAgY2xhc3MgU3NoRmV0Y2hDb25uZWN0aW9uIGV4dGVuZHMgQmFzZVBhY2tGZXRjaENvbm5lY3Rpb24gewogCQlwdWJsaWMgdm9pZCBjbG9zZSgpIHsKIAkJCWVuZE91dCgpOwogCisJCQlpZiAocHJvY2VzcyAhPSBudWxsKSB7CisJCQkJcHJvY2Vzcy5kZXN0cm95KCk7CisJCQl9CiAJCQlpZiAoZXJyb3JUaHJlYWQgIT0gbnVsbCkgewogCQkJCXRyeSB7CiAJCQkJCWVycm9yVGhyZWFkLmhhbHQoKTsKQEAgLTMyMiw4ICszMjUsNiBAQCBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKIAkJCX0KIAogCQkJc3VwZXIuY2xvc2UoKTsKLQkJCWlmIChwcm9jZXNzICE9IG51bGwpCi0JCQkJcHJvY2Vzcy5kZXN0cm95KCk7CiAJCX0KIAl9CiAKQEAgLTM3Nyw2ICszNzgsOSBAQCBjbGFzcyBTc2hQdXNoQ29ubmVjdGlvbiBleHRlbmRzIEJhc2VQYWNrUHVzaENvbm5lY3Rpb24gewogCQlwdWJsaWMgdm9pZCBjbG9zZSgpIHsKIAkJCWVuZE91dCgpOwogCisJCQlpZiAocHJvY2VzcyAhPSBudWxsKSB7CisJCQkJcHJvY2Vzcy5kZXN0cm95KCk7CisJCQl9CiAJCQlpZiAoZXJyb3JUaHJlYWQgIT0gbnVsbCkgewogCQkJCXRyeSB7CiAJCQkJCWVycm9yVGhyZWFkLmhhbHQoKTsKQEAgLTM4OCw4ICszOTIsNiBAQCBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKIAkJCX0KIAogCQkJc3VwZXIuY2xvc2UoKTsKLQkJCWlmIChwcm9jZXNzICE9IG51bGwpCi0JCQkJcHJvY2Vzcy5kZXN0cm95KCk7CiAJCX0KIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UcmFuc3BvcnRIdHRwLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UcmFuc3BvcnRIdHRwLmphdmEKaW5kZXggYTE4MjYyMy4uYzA4ZjQwMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVHJhbnNwb3J0SHR0cC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RyYW5zcG9ydEh0dHAuamF2YQpAQCAtMjczLDcgKzI3Myw3IEBAIHB1YmxpYyBUcmFuc3BvcnQgb3BlbihVUklpc2ggdXJpLCBSZXBvc2l0b3J5IGxvY2FsLCBTdHJpbmcgcmVtb3RlTmFtZSkKIAogCXByaXZhdGUgYm9vbGVhbiBzc2xGYWlsdXJlID0gZmFsc2U7CiAKLQlUcmFuc3BvcnRIdHRwKGZpbmFsIFJlcG9zaXRvcnkgbG9jYWwsIGZpbmFsIFVSSWlzaCB1cmkpCisJVHJhbnNwb3J0SHR0cChSZXBvc2l0b3J5IGxvY2FsLCBVUklpc2ggdXJpKQogCQkJdGhyb3dzIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiB7CiAJCXN1cGVyKGxvY2FsLCB1cmkpOwogCQlzZXRVUkkodXJpKTsKQEAgLTI5OCw3ICsyOTgsNyBAQCBwcml2YXRlIFVSTCB0b1VSTChVUklpc2ggdXJpc2gpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewogCSAqIEB0aHJvd3Mgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuTm90U3VwcG9ydGVkRXhjZXB0aW9uCiAJICogQHNpbmNlIDQuOQogCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVSSShmaW5hbCBVUklpc2ggdXJpKSB0aHJvd3MgTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsKKwlwcm90ZWN0ZWQgdm9pZCBzZXRVUkkoVVJJaXNoIHVyaSkgdGhyb3dzIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiB7CiAJCXRyeSB7CiAJCQljdXJyZW50VXJpID0gdXJpOwogCQkJYmFzZVVybCA9IHRvVVJMKHVyaSk7CkBAIC0zMTQsNyArMzE0LDcgQEAgcHJvdGVjdGVkIHZvaWQgc2V0VVJJKGZpbmFsIFVSSWlzaCB1cmkpIHRocm93cyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24gewogCSAqIEBwYXJhbSB1cmkKIAkgKiBAdGhyb3dzIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbgogCSAqLwotCVRyYW5zcG9ydEh0dHAoZmluYWwgVVJJaXNoIHVyaSkgdGhyb3dzIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiB7CisJVHJhbnNwb3J0SHR0cChVUklpc2ggdXJpKSB0aHJvd3MgTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsKIAkJc3VwZXIodXJpKTsKIAkJc2V0VVJJKHVyaSk7CiAJCWh0dHAgPSBuZXcgSHR0cENvbmZpZyh1cmkpOwpAQCAtMzMyLDEwICszMzIsMjYgQEAgcHJvdGVjdGVkIHZvaWQgc2V0VVJJKGZpbmFsIFVSSWlzaCB1cmkpIHRocm93cyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24gewogCSAqIEBwYXJhbSBvbgogCSAqICAgICAgICAgICAgaWYge0Bjb2RlIHRydWV9IChkZWZhdWx0KSwgc21hcnQgSFRUUCBpcyBlbmFibGVkLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldFVzZVNtYXJ0SHR0cChmaW5hbCBib29sZWFuIG9uKSB7CisJcHVibGljIHZvaWQgc2V0VXNlU21hcnRIdHRwKGJvb2xlYW4gb24pIHsKIAkJdXNlU21hcnRIdHRwID0gb247CiAJfQogCisJQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikgLy8gQ2xvc2VkIGJ5IGNhbGxlcgorCXByaXZhdGUgRmV0Y2hDb25uZWN0aW9uIGdldENvbm5lY3Rpb24oSHR0cENvbm5lY3Rpb24gYywgSW5wdXRTdHJlYW0gaW4sCisJCQlTdHJpbmcgc2VydmljZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJQmFzZUNvbm5lY3Rpb24gZjsKKwkJaWYgKGlzU21hcnRIdHRwKGMsIHNlcnZpY2UpKSB7CisJCQlyZWFkU21hcnRIZWFkZXJzKGluLCBzZXJ2aWNlKTsKKwkJCWYgPSBuZXcgU21hcnRIdHRwRmV0Y2hDb25uZWN0aW9uKGluKTsKKwkJfSBlbHNlIHsKKwkJCS8vIEFzc3VtZSB0aGlzIHNlcnZlciBkb2Vzbid0IHN1cHBvcnQgc21hcnQgSFRUUCBmZXRjaAorCQkJLy8gYW5kIGZhbGwgYmFjayBvbiBkdW1iIG9iamVjdCB3YWxraW5nLgorCQkJZiA9IG5ld0R1bWJDb25uZWN0aW9uKGluKTsKKwkJfQorCQlmLnNldFBlZXJVc2VyQWdlbnQoYy5nZXRIZWFkZXJGaWVsZChIdHRwU3VwcG9ydC5IRFJfU0VSVkVSKSk7CisJCXJldHVybiAoRmV0Y2hDb25uZWN0aW9uKSBmOworCX0KKwogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCiAJcHVibGljIEZldGNoQ29ubmVjdGlvbiBvcGVuRmV0Y2goKSB0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uLApAQCAtMzQzLDIxICszNTksOCBAQCBwdWJsaWMgRmV0Y2hDb25uZWN0aW9uIG9wZW5GZXRjaCgpIHRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24sCiAJCWZpbmFsIFN0cmluZyBzZXJ2aWNlID0gU1ZDX1VQTE9BRF9QQUNLOwogCQl0cnkgewogCQkJZmluYWwgSHR0cENvbm5lY3Rpb24gYyA9IGNvbm5lY3Qoc2VydmljZSk7Ci0JCQlmaW5hbCBJbnB1dFN0cmVhbSBpbiA9IG9wZW5JbnB1dFN0cmVhbShjKTsKLQkJCXRyeSB7Ci0JCQkJQmFzZUNvbm5lY3Rpb24gZjsKLQkJCQlpZiAoaXNTbWFydEh0dHAoYywgc2VydmljZSkpIHsKLQkJCQkJcmVhZFNtYXJ0SGVhZGVycyhpbiwgc2VydmljZSk7Ci0JCQkJCWYgPSBuZXcgU21hcnRIdHRwRmV0Y2hDb25uZWN0aW9uKGluKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBBc3N1bWUgdGhpcyBzZXJ2ZXIgZG9lc24ndCBzdXBwb3J0IHNtYXJ0IEhUVFAgZmV0Y2gKLQkJCQkJLy8gYW5kIGZhbGwgYmFjayBvbiBkdW1iIG9iamVjdCB3YWxraW5nLgotCQkJCQlmID0gbmV3RHVtYkNvbm5lY3Rpb24oaW4pOwotCQkJCX0KLQkJCQlmLnNldFBlZXJVc2VyQWdlbnQoYy5nZXRIZWFkZXJGaWVsZChIdHRwU3VwcG9ydC5IRFJfU0VSVkVSKSk7Ci0JCQkJcmV0dXJuIChGZXRjaENvbm5lY3Rpb24pIGY7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWluLmNsb3NlKCk7CisJCQl0cnkgKElucHV0U3RyZWFtIGluID0gb3BlbklucHV0U3RyZWFtKGMpKSB7CisJCQkJcmV0dXJuIGdldENvbm5lY3Rpb24oYywgaW4sIHNlcnZpY2UpOwogCQkJfQogCQl9IGNhdGNoIChOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZXJyKSB7CiAJCQl0aHJvdyBlcnI7CkBAIC00ODAsNyArNDgzLDcgQEAgcHVibGljIHZvaWQgc2V0QWRkaXRpb25hbEhlYWRlcnMoTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzKSB7CiAJCXRoaXMuaGVhZGVycyA9IGhlYWRlcnM7CiAJfQogCi0JcHJpdmF0ZSBIdHRwQ29ubmVjdGlvbiBjb25uZWN0KGZpbmFsIFN0cmluZyBzZXJ2aWNlKQorCXByaXZhdGUgSHR0cENvbm5lY3Rpb24gY29ubmVjdChTdHJpbmcgc2VydmljZSkKIAkJCXRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24sIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiB7CiAJCVVSTCB1ID0gZ2V0U2VydmljZVVSTChzZXJ2aWNlKTsKIAkJaW50IGF1dGhBdHRlbXB0cyA9IDE7CkBAIC03NzIsNyArNzc1LDcgQEAgcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRSZWRpcmVjdChVUkwgY3VycmVudCwgU3RyaW5nIG5leHQsIFN0cmluZyBjaGVja0ZvcikgewogCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKLQlwcml2YXRlIFVSTCBnZXRTZXJ2aWNlVVJMKGZpbmFsIFN0cmluZyBzZXJ2aWNlKQorCXByaXZhdGUgVVJMIGdldFNlcnZpY2VVUkwoU3RyaW5nIHNlcnZpY2UpCiAJCQl0aHJvd3MgTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsKIAkJdHJ5IHsKIAkJCWZpbmFsIFN0cmluZ0J1aWxkZXIgYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CkBAIC03OTYsMjEgKzc5OSw2IEBAIHByaXZhdGUgVVJMIGdldFNlcnZpY2VVUkwoZmluYWwgU3RyaW5nIHNlcnZpY2UpCiAJfQogCiAJLyoqCi0JICogT3BlbiBhbiBIVFRQIGNvbm5lY3Rpb24sIHNldHRpbmcgdGhlIGFjY2VwdC1lbmNvZGluZyByZXF1ZXN0IGhlYWRlciB0byBnemlwLgotCSAqCi0JICogQHBhcmFtIG1ldGhvZCBIVFRQIHJlcXVlc3QgbWV0aG9kCi0JICogQHBhcmFtIHUgdXJsIG9mIHRoZSBIVFRQIGNvbm5lY3Rpb24KLQkgKiBAcmV0dXJuIHRoZSBIVFRQIGNvbm5lY3Rpb24KLQkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KLQkgKiBAc2luY2UgMy4zCi0JICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAjaHR0cE9wZW4oU3RyaW5nLCBVUkwsIEFjY2VwdEVuY29kaW5nKX0gaW5zdGVhZC4KLQkgKi8KLQlARGVwcmVjYXRlZAotCXByb3RlY3RlZCBIdHRwQ29ubmVjdGlvbiBodHRwT3BlbihTdHJpbmcgbWV0aG9kLCBVUkwgdSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGh0dHBPcGVuKG1ldGhvZCwgdSwgQWNjZXB0RW5jb2RpbmcuR1pJUCk7Ci0JfQotCi0JLyoqCiAJICogT3BlbiBhbiBIVFRQIGNvbm5lY3Rpb24uCiAJICoKIAkgKiBAcGFyYW0gbWV0aG9kIEhUVFAgcmVxdWVzdCBtZXRob2QKQEAgLTg3MywxOCArODYxLDE4IEBAIElPRXhjZXB0aW9uIHdyb25nQ29udGVudFR5cGUoU3RyaW5nIGV4cFR5cGUsIFN0cmluZyBhY3RUeXBlKSB7CiAJCXJldHVybiBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKHVyaSwgd2h5KTsKIAl9CiAKLQlwcml2YXRlIGJvb2xlYW4gaXNTbWFydEh0dHAoZmluYWwgSHR0cENvbm5lY3Rpb24gYywgZmluYWwgU3RyaW5nIHNlcnZpY2UpIHsKKwlwcml2YXRlIGJvb2xlYW4gaXNTbWFydEh0dHAoSHR0cENvbm5lY3Rpb24gYywgU3RyaW5nIHNlcnZpY2UpIHsKIAkJZmluYWwgU3RyaW5nIGV4cFR5cGUgPSAiYXBwbGljYXRpb24veC0iICsgc2VydmljZSArICItYWR2ZXJ0aXNlbWVudCI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQlmaW5hbCBTdHJpbmcgYWN0VHlwZSA9IGMuZ2V0Q29udGVudFR5cGUoKTsKIAkJcmV0dXJuIGV4cFR5cGUuZXF1YWxzKGFjdFR5cGUpOwogCX0KIAotCXByaXZhdGUgYm9vbGVhbiBpc0d6aXBDb250ZW50KGZpbmFsIEh0dHBDb25uZWN0aW9uIGMpIHsKKwlwcml2YXRlIGJvb2xlYW4gaXNHemlwQ29udGVudChIdHRwQ29ubmVjdGlvbiBjKSB7CiAJCXJldHVybiBFTkNPRElOR19HWklQLmVxdWFscyhjLmdldEhlYWRlckZpZWxkKEhEUl9DT05URU5UX0VOQ09ESU5HKSkKIAkJCQl8fCBFTkNPRElOR19YX0daSVAuZXF1YWxzKGMuZ2V0SGVhZGVyRmllbGQoSERSX0NPTlRFTlRfRU5DT0RJTkcpKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgcmVhZFNtYXJ0SGVhZGVycyhmaW5hbCBJbnB1dFN0cmVhbSBpbiwgZmluYWwgU3RyaW5nIHNlcnZpY2UpCisJcHJpdmF0ZSB2b2lkIHJlYWRTbWFydEhlYWRlcnMoSW5wdXRTdHJlYW0gaW4sIFN0cmluZyBzZXJ2aWNlKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJLy8gQSBzbWFydCByZXBseSB3aWxsIGhhdmUgYSAnIycgYWZ0ZXIgdGhlIGZpcnN0IDQgYnl0ZXMsIGJ1dAogCQkvLyBhIGR1bWIgcmVwbHkgY2Fubm90IGNvbnRhaW4gYSAnIycgdW50aWwgYWZ0ZXIgYnl0ZSA0MS4gRG8gYQpAQCAtOTE1LDcgKzkwMyw3IEBAIHByaXZhdGUgdm9pZCByZWFkU21hcnRIZWFkZXJzKGZpbmFsIElucHV0U3RyZWFtIGluLCBmaW5hbCBTdHJpbmcgc2VydmljZSkKIAljbGFzcyBIdHRwT2JqZWN0REIgZXh0ZW5kcyBXYWxrUmVtb3RlT2JqZWN0RGF0YWJhc2UgewogCQlwcml2YXRlIGZpbmFsIFVSTCBodHRwT2JqZWN0c1VybDsKIAotCQlIdHRwT2JqZWN0REIoZmluYWwgVVJMIGIpIHsKKwkJSHR0cE9iamVjdERCKFVSTCBiKSB7CiAJCQlodHRwT2JqZWN0c1VybCA9IGI7CiAJCX0KIApAQCAtOTQyLDcgKzkzMCw3IEBAIENvbGxlY3Rpb248V2Fsa1JlbW90ZU9iamVjdERhdGFiYXNlPiBnZXRBbHRlcm5hdGVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJfQogCiAJCUBPdmVycmlkZQotCQlXYWxrUmVtb3RlT2JqZWN0RGF0YWJhc2Ugb3BlbkFsdGVybmF0ZShmaW5hbCBTdHJpbmcgbG9jYXRpb24pCisJCVdhbGtSZW1vdGVPYmplY3REYXRhYmFzZSBvcGVuQWx0ZXJuYXRlKFN0cmluZyBsb2NhdGlvbikKIAkJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJcmV0dXJuIG5ldyBIdHRwT2JqZWN0REIobmV3IFVSTChodHRwT2JqZWN0c1VybCwgbG9jYXRpb24pKTsKIAkJfQpAQCAtOTc0LDcgKzk2Miw3IEBAIENvbGxlY3Rpb248U3RyaW5nPiBnZXRQYWNrTmFtZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCUZpbGVTdHJlYW0gb3BlbihmaW5hbCBTdHJpbmcgcGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJRmlsZVN0cmVhbSBvcGVuKFN0cmluZyBwYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJcmV0dXJuIG9wZW4ocGF0aCwgQWNjZXB0RW5jb2RpbmcuVU5TUEVDSUZJRUQpOwogCQl9CiAKQEAgLTEwNDIsMTUgKzEwMzAsMTUgQEAgTWFwPFN0cmluZywgUmVmPiByZWFkQWR2ZXJ0aXNlZEltcGwoZmluYWwgQnVmZmVyZWRSZWFkZXIgYnIpCiAJCQlyZXR1cm4gYXZhaWw7CiAJCX0KIAotCQlwcml2YXRlIFBhY2tQcm90b2NvbEV4Y2VwdGlvbiBvdXRPZk9yZGVyQWR2ZXJ0aXNlbWVudChmaW5hbCBTdHJpbmcgbikgeworCQlwcml2YXRlIFBhY2tQcm90b2NvbEV4Y2VwdGlvbiBvdXRPZk9yZGVyQWR2ZXJ0aXNlbWVudChTdHJpbmcgbikgewogCQkJcmV0dXJuIG5ldyBQYWNrUHJvdG9jb2xFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoSkdpdFRleHQuZ2V0KCkuYWR2ZXJ0aXNlbWVudE9mQ2FtZUJlZm9yZSwgbiwgbikpOwogCQl9CiAKLQkJcHJpdmF0ZSBQYWNrUHJvdG9jb2xFeGNlcHRpb24gaW52YWxpZEFkdmVydGlzZW1lbnQoZmluYWwgU3RyaW5nIG4pIHsKKwkJcHJpdmF0ZSBQYWNrUHJvdG9jb2xFeGNlcHRpb24gaW52YWxpZEFkdmVydGlzZW1lbnQoU3RyaW5nIG4pIHsKIAkJCXJldHVybiBuZXcgUGFja1Byb3RvY29sRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpHaXRUZXh0LmdldCgpLmludmFsaWRBZHZlcnRpc2VtZW50T2YsIG4pKTsKIAkJfQogCi0JCXByaXZhdGUgUGFja1Byb3RvY29sRXhjZXB0aW9uIGR1cGxpY2F0ZUFkdmVydGlzZW1lbnQoZmluYWwgU3RyaW5nIG4pIHsKKwkJcHJpdmF0ZSBQYWNrUHJvdG9jb2xFeGNlcHRpb24gZHVwbGljYXRlQWR2ZXJ0aXNlbWVudChTdHJpbmcgbikgewogCQkJcmV0dXJuIG5ldyBQYWNrUHJvdG9jb2xFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoSkdpdFRleHQuZ2V0KCkuZHVwbGljYXRlQWR2ZXJ0aXNlbWVudHNPZiwgbikpOwogCQl9CiAKQEAgLTEwNjMsNyArMTA1MSw3IEBAIHZvaWQgY2xvc2UoKSB7CiAJY2xhc3MgU21hcnRIdHRwRmV0Y2hDb25uZWN0aW9uIGV4dGVuZHMgQmFzZVBhY2tGZXRjaENvbm5lY3Rpb24gewogCQlwcml2YXRlIE11bHRpUmVxdWVzdFNlcnZpY2Ugc3ZjOwogCi0JCVNtYXJ0SHR0cEZldGNoQ29ubmVjdGlvbihmaW5hbCBJbnB1dFN0cmVhbSBhZHZlcnRpc2VtZW50KQorCQlTbWFydEh0dHBGZXRjaENvbm5lY3Rpb24oSW5wdXRTdHJlYW0gYWR2ZXJ0aXNlbWVudCkKIAkJCQl0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKIAkJCXN1cGVyKFRyYW5zcG9ydEh0dHAudGhpcyk7CiAJCQlzdGF0ZWxlc3NSUEMgPSB0cnVlOwpAQCAtMTA5Myw3ICsxMDgxLDcgQEAgcHJvdGVjdGVkIHZvaWQgb25SZWNlaXZlUGFjaygpIHsKIAl9CiAKIAljbGFzcyBTbWFydEh0dHBQdXNoQ29ubmVjdGlvbiBleHRlbmRzIEJhc2VQYWNrUHVzaENvbm5lY3Rpb24gewotCQlTbWFydEh0dHBQdXNoQ29ubmVjdGlvbihmaW5hbCBJbnB1dFN0cmVhbSBhZHZlcnRpc2VtZW50KQorCQlTbWFydEh0dHBQdXNoQ29ubmVjdGlvbihJbnB1dFN0cmVhbSBhZHZlcnRpc2VtZW50KQogCQkJCXRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24gewogCQkJc3VwZXIoVHJhbnNwb3J0SHR0cC50aGlzKTsKIAkJCXN0YXRlbGVzc1JQQyA9IHRydWU7CkBAIC0xMzk2LDcgKzEzODQsNyBAQCBwcm90ZWN0ZWQgT3V0cHV0U3RyZWFtIG92ZXJmbG93KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAljbGFzcyBNdWx0aVJlcXVlc3RTZXJ2aWNlIGV4dGVuZHMgU2VydmljZSB7CiAJCWJvb2xlYW4gZmluYWxSZXF1ZXN0OwogCi0JCU11bHRpUmVxdWVzdFNlcnZpY2UoZmluYWwgU3RyaW5nIHNlcnZpY2VOYW1lKSB7CisJCU11bHRpUmVxdWVzdFNlcnZpY2UoU3RyaW5nIHNlcnZpY2VOYW1lKSB7CiAJCQlzdXBlcihzZXJ2aWNlTmFtZSk7CiAJCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVHJhbnNwb3J0TG9jYWwuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RyYW5zcG9ydExvY2FsLmphdmEKaW5kZXggNGYxODgwYi4uZmJiMmM0NCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVHJhbnNwb3J0TG9jYWwuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UcmFuc3BvcnRMb2NhbC5qYXZhCkBAIC0xNjIsMTEgKzE2MiwxMSBAQCBwdWJsaWMgVHJhbnNwb3J0IG9wZW4oVVJJaXNoIHVyaSkgdGhyb3dzIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiwKIAkJcmVtb3RlR2l0RGlyID0gZ2l0RGlyOwogCX0KIAotCVVwbG9hZFBhY2sgY3JlYXRlVXBsb2FkUGFjayhmaW5hbCBSZXBvc2l0b3J5IGRzdCkgeworCVVwbG9hZFBhY2sgY3JlYXRlVXBsb2FkUGFjayhSZXBvc2l0b3J5IGRzdCkgewogCQlyZXR1cm4gbmV3IFVwbG9hZFBhY2soZHN0KTsKIAl9CiAKLQlSZWNlaXZlUGFjayBjcmVhdGVSZWNlaXZlUGFjayhmaW5hbCBSZXBvc2l0b3J5IGRzdCkgeworCVJlY2VpdmVQYWNrIGNyZWF0ZVJlY2VpdmVQYWNrKFJlcG9zaXRvcnkgZHN0KSB7CiAJCXJldHVybiBuZXcgUmVjZWl2ZVBhY2soZHN0KTsKIAl9CiAKQEAgLTIyOSw3ICsyMjksNyBAQCBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKIAkgKiBAdGhyb3dzIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLlRyYW5zcG9ydEV4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIGlmIGFueS4KIAkgKi8KLQlwcm90ZWN0ZWQgUHJvY2VzcyBzcGF3bihmaW5hbCBTdHJpbmcgY21kKQorCXByb3RlY3RlZCBQcm9jZXNzIHNwYXduKFN0cmluZyBjbWQpCiAJCQl0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKIAkJdHJ5IHsKIAkJCVN0cmluZ1tdIGFyZ3MgPSB7ICIuIiB9OyAvLyROT04tTkxTLTEkCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UcmFuc3BvcnRTZnRwLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UcmFuc3BvcnRTZnRwLmphdmEKaW5kZXggMzlmOTg5Ny4uZjEyOWJhMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVHJhbnNwb3J0U2Z0cC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RyYW5zcG9ydFNmdHAuamF2YQpAQCAtMTM2LDcgKzEzNiw3IEBAIHB1YmxpYyBUcmFuc3BvcnQgb3BlbihVUklpc2ggdXJpLCBSZXBvc2l0b3J5IGxvY2FsLCBTdHJpbmcgcmVtb3RlTmFtZSkKIAkJfQogCX07CiAKLQlUcmFuc3BvcnRTZnRwKGZpbmFsIFJlcG9zaXRvcnkgbG9jYWwsIGZpbmFsIFVSSWlzaCB1cmkpIHsKKwlUcmFuc3BvcnRTZnRwKFJlcG9zaXRvcnkgbG9jYWwsIFVSSWlzaCB1cmkpIHsKIAkJc3VwZXIobG9jYWwsIHVyaSk7CiAJfQogCkBAIC0xOTcsNyArMTk3LDcgQEAgY2xhc3MgU2Z0cE9iamVjdERCIGV4dGVuZHMgV2Fsa1JlbW90ZU9iamVjdERhdGFiYXNlIHsKIAkJCX0KIAkJfQogCi0JCVNmdHBPYmplY3REQihmaW5hbCBTZnRwT2JqZWN0REIgcGFyZW50LCBmaW5hbCBTdHJpbmcgcCkKKwkJU2Z0cE9iamVjdERCKFNmdHBPYmplY3REQiBwYXJlbnQsIFN0cmluZyBwKQogCQkJCXRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24gewogCQkJdHJ5IHsKIAkJCQlmdHAgPSBuZXdTZnRwKCk7CkBAIC0yMjksNyArMjI5LDcgQEAgQ29sbGVjdGlvbjxXYWxrUmVtb3RlT2JqZWN0RGF0YWJhc2U+IGdldEFsdGVybmF0ZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCVdhbGtSZW1vdGVPYmplY3REYXRhYmFzZSBvcGVuQWx0ZXJuYXRlKGZpbmFsIFN0cmluZyBsb2NhdGlvbikKKwkJV2Fsa1JlbW90ZU9iamVjdERhdGFiYXNlIG9wZW5BbHRlcm5hdGUoU3RyaW5nIGxvY2F0aW9uKQogCQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQlyZXR1cm4gbmV3IFNmdHBPYmplY3REQih0aGlzLCBsb2NhdGlvbik7CiAJCX0KQEAgLTI0Niw5ICsyNDYsOSBAQCBDb2xsZWN0aW9uPFN0cmluZz4gZ2V0UGFja05hbWVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCQlmaWxlcyA9IG5ldyBIYXNoTWFwPD4oKTsKIAkJCQltdGltZXMgPSBuZXcgSGFzaE1hcDw+KCk7CiAKLQkJCQlmb3IgKGZpbmFsIENoYW5uZWxTZnRwLkxzRW50cnkgZW50IDogbGlzdCkKKwkJCQlmb3IgKENoYW5uZWxTZnRwLkxzRW50cnkgZW50IDogbGlzdCkKIAkJCQkJZmlsZXMucHV0KGVudC5nZXRGaWxlbmFtZSgpLCBlbnQpOwotCQkJCWZvciAoZmluYWwgQ2hhbm5lbFNmdHAuTHNFbnRyeSBlbnQgOiBsaXN0KSB7CisJCQkJZm9yIChDaGFubmVsU2Z0cC5Mc0VudHJ5IGVudCA6IGxpc3QpIHsKIAkJCQkJZmluYWwgU3RyaW5nIG4gPSBlbnQuZ2V0RmlsZW5hbWUoKTsKIAkJCQkJaWYgKCFuLnN0YXJ0c1dpdGgoInBhY2stIikgfHwgIW4uZW5kc1dpdGgoIi5wYWNrIikpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkJCQkJY29udGludWU7CkBAIC0yNjMsNyArMjYzLDcgQEAgQ29sbGVjdGlvbjxTdHJpbmc+IGdldFBhY2tOYW1lcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAKIAkJCQlDb2xsZWN0aW9ucy5zb3J0KHBhY2tzLCBuZXcgQ29tcGFyYXRvcjxTdHJpbmc+KCkgewogCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHVibGljIGludCBjb21wYXJlKGZpbmFsIFN0cmluZyBvMSwgZmluYWwgU3RyaW5nIG8yKSB7CisJCQkJCXB1YmxpYyBpbnQgY29tcGFyZShTdHJpbmcgbzEsIFN0cmluZyBvMikgewogCQkJCQkJcmV0dXJuIG10aW1lcy5nZXQobzIpLmludFZhbHVlKCkKIAkJCQkJCQkJLSBtdGltZXMuZ2V0KG8xKS5pbnRWYWx1ZSgpOwogCQkJCQl9CkBAIC0yNzgsNyArMjc4LDcgQEAgcHVibGljIGludCBjb21wYXJlKGZpbmFsIFN0cmluZyBvMSwgZmluYWwgU3RyaW5nIG8yKSB7CiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJRmlsZVN0cmVhbSBvcGVuKGZpbmFsIFN0cmluZyBwYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlGaWxlU3RyZWFtIG9wZW4oU3RyaW5nIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQl0cnkgewogCQkJCWZpbmFsIFNmdHBBVFRSUyBhID0gZnRwLmxzdGF0KHBhdGgpOwogCQkJCXJldHVybiBuZXcgRmlsZVN0cmVhbShmdHAuZ2V0KHBhdGgpLCBhLmdldFNpemUoKSk7CkBAIC0yOTIsNyArMjkyLDcgQEAgRmlsZVN0cmVhbSBvcGVuKGZpbmFsIFN0cmluZyBwYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXZvaWQgZGVsZXRlRmlsZShmaW5hbCBTdHJpbmcgcGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJdm9pZCBkZWxldGVGaWxlKFN0cmluZyBwYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJdHJ5IHsKIAkJCQlmdHAucm0ocGF0aCk7CiAJCQl9IGNhdGNoIChTZnRwRXhjZXB0aW9uIGplKSB7CkBAIC0zNDUsNyArMzQ1LDcgQEAgT3V0cHV0U3RyZWFtIHdyaXRlRmlsZShmaW5hbCBTdHJpbmcgcGF0aCwKIAkJfQogCiAJCUBPdmVycmlkZQotCQl2b2lkIHdyaXRlRmlsZShmaW5hbCBTdHJpbmcgcGF0aCwgZmluYWwgYnl0ZVtdIGRhdGEpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXZvaWQgd3JpdGVGaWxlKFN0cmluZyBwYXRoLCBieXRlW10gZGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCWZpbmFsIFN0cmluZyBsb2NrID0gcGF0aCArIExPQ0tfU1VGRklYOwogCQkJdHJ5IHsKIAkJCQlzdXBlci53cml0ZUZpbGUobG9jaywgZGF0YSk7CkBAIC00MTMsNyArNDEzLDcgQEAgcHJpdmF0ZSB2b2lkIHJlYWRMb29zZVJlZnMoZmluYWwgVHJlZU1hcDxTdHJpbmcsIFJlZj4gYXZhaWwsCiAJCQkJCQlqZS5nZXRNZXNzYWdlKCkpLCBqZSk7CiAJCQl9CiAKLQkJCWZvciAoZmluYWwgQ2hhbm5lbFNmdHAuTHNFbnRyeSBlbnQgOiBsaXN0KSB7CisJCQlmb3IgKENoYW5uZWxTZnRwLkxzRW50cnkgZW50IDogbGlzdCkgewogCQkJCWZpbmFsIFN0cmluZyBuID0gZW50LmdldEZpbGVuYW1lKCk7CiAJCQkJaWYgKCIuIi5lcXVhbHMobikgfHwgIi4uIi5lcXVhbHMobikpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkJCQljb250aW51ZTsKQEAgLTQ2Niw3ICs0NjYsNyBAQCBwcml2YXRlIFJlZiByZWFkUmVmKGZpbmFsIFRyZWVNYXA8U3RyaW5nLCBSZWY+IGF2YWlsLAogCQkJCQlNZXNzYWdlRm9ybWF0LmZvcm1hdChKR2l0VGV4dC5nZXQoKS5iYWRSZWYsIG5hbWUsIGxpbmUpKTsKIAkJfQogCi0JCXByaXZhdGUgU3RvcmFnZSBsb29zZShmaW5hbCBSZWYgcikgeworCQlwcml2YXRlIFN0b3JhZ2UgbG9vc2UoUmVmIHIpIHsKIAkJCWlmIChyICE9IG51bGwgJiYgci5nZXRTdG9yYWdlKCkgPT0gU3RvcmFnZS5QQUNLRUQpCiAJCQkJcmV0dXJuIFN0b3JhZ2UuTE9PU0VfUEFDS0VEOwogCQkJcmV0dXJuIFN0b3JhZ2UuTE9PU0U7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9VUklpc2guamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1VSSWlzaC5qYXZhCmluZGV4IGEwNDhmZTMuLjAyNmZkODEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1VSSWlzaC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1VSSWlzaC5qYXZhCkBAIC0zODcsNyArMzg3LDcgQEAgZWxzZSBpZiAocyAhPSBudWxsICYmIHAubGVuZ3RoKCkgPj0gMiAmJiBwLmNoYXJBdCgwKSA9PSAnLycKIAkgKiBAcGFyYW0gdQogCSAqICAgICAgICAgICAgdGhlIHNvdXJjZSBVUkwgdG8gY29udmVydCBmcm9tLgogCSAqLwotCXB1YmxpYyBVUklpc2goZmluYWwgVVJMIHUpIHsKKwlwdWJsaWMgVVJJaXNoKFVSTCB1KSB7CiAJCXNjaGVtZSA9IHUuZ2V0UHJvdG9jb2woKTsKIAkJcGF0aCA9IHUuZ2V0UGF0aCgpOwogCQlwYXRoID0gY2xlYW5MZWFkaW5nU2xhc2hlcyhwYXRoLCBzY2hlbWUpOwpAQCAtNDE2LDcgKzQxNiw3IEBAIHB1YmxpYyBVUklpc2goKSB7CiAJCS8vIENvbmZpZ3VyZSBub3RoaW5nLgogCX0KIAotCXByaXZhdGUgVVJJaXNoKGZpbmFsIFVSSWlzaCB1KSB7CisJcHJpdmF0ZSBVUklpc2goVVJJaXNoIHUpIHsKIAkJdGhpcy5zY2hlbWUgPSB1LnNjaGVtZTsKIAkJdGhpcy5yYXdQYXRoID0gdS5yYXdQYXRoOwogCQl0aGlzLnBhdGggPSB1LnBhdGg7CkBAIC00NTEsNyArNDUxLDcgQEAgcHVibGljIFN0cmluZyBnZXRIb3N0KCkgewogCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBmb3IgaG9zdC4KIAkgKiBAcmV0dXJuIGEgbmV3IFVSSSB3aXRoIHRoZSB1cGRhdGVkIHZhbHVlLgogCSAqLwotCXB1YmxpYyBVUklpc2ggc2V0SG9zdChmaW5hbCBTdHJpbmcgbikgeworCXB1YmxpYyBVUklpc2ggc2V0SG9zdChTdHJpbmcgbikgewogCQlmaW5hbCBVUklpc2ggciA9IG5ldyBVUklpc2godGhpcyk7CiAJCXIuaG9zdCA9IG47CiAJCXJldHVybiByOwpAQCAtNDczLDcgKzQ3Myw3IEBAIHB1YmxpYyBTdHJpbmcgZ2V0U2NoZW1lKCkgewogCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBmb3Igc2NoZW1lLgogCSAqIEByZXR1cm4gYSBuZXcgVVJJIHdpdGggdGhlIHVwZGF0ZWQgdmFsdWUuCiAJICovCi0JcHVibGljIFVSSWlzaCBzZXRTY2hlbWUoZmluYWwgU3RyaW5nIG4pIHsKKwlwdWJsaWMgVVJJaXNoIHNldFNjaGVtZShTdHJpbmcgbikgewogCQlmaW5hbCBVUklpc2ggciA9IG5ldyBVUklpc2godGhpcyk7CiAJCXIuc2NoZW1lID0gbjsKIAkJcmV0dXJuIHI7CkBAIC01MDQsNyArNTA0LDcgQEAgcHVibGljIFN0cmluZyBnZXRSYXdQYXRoKCkgewogCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBmb3IgcGF0aC4KIAkgKiBAcmV0dXJuIGEgbmV3IFVSSSB3aXRoIHRoZSB1cGRhdGVkIHZhbHVlLgogCSAqLwotCXB1YmxpYyBVUklpc2ggc2V0UGF0aChmaW5hbCBTdHJpbmcgbikgeworCXB1YmxpYyBVUklpc2ggc2V0UGF0aChTdHJpbmcgbikgewogCQlmaW5hbCBVUklpc2ggciA9IG5ldyBVUklpc2godGhpcyk7CiAJCXIucGF0aCA9IG47CiAJCXIucmF3UGF0aCA9IG47CkBAIC01MTksNyArNTE5LDcgQEAgcHVibGljIFVSSWlzaCBzZXRQYXRoKGZpbmFsIFN0cmluZyBuKSB7CiAJICogQHJldHVybiBhIG5ldyBVUkkgd2l0aCB0aGUgdXBkYXRlZCB2YWx1ZS4KIAkgKiBAdGhyb3dzIGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbgogCSAqLwotCXB1YmxpYyBVUklpc2ggc2V0UmF3UGF0aChmaW5hbCBTdHJpbmcgbikgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7CisJcHVibGljIFVSSWlzaCBzZXRSYXdQYXRoKFN0cmluZyBuKSB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uIHsKIAkJZmluYWwgVVJJaXNoIHIgPSBuZXcgVVJJaXNoKHRoaXMpOwogCQlyLnBhdGggPSB1bmVzY2FwZShuKTsKIAkJci5yYXdQYXRoID0gbjsKQEAgLTU0Miw3ICs1NDIsNyBAQCBwdWJsaWMgU3RyaW5nIGdldFVzZXIoKSB7CiAJICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIGZvciB1c2VyLgogCSAqIEByZXR1cm4gYSBuZXcgVVJJIHdpdGggdGhlIHVwZGF0ZWQgdmFsdWUuCiAJICovCi0JcHVibGljIFVSSWlzaCBzZXRVc2VyKGZpbmFsIFN0cmluZyBuKSB7CisJcHVibGljIFVSSWlzaCBzZXRVc2VyKFN0cmluZyBuKSB7CiAJCWZpbmFsIFVSSWlzaCByID0gbmV3IFVSSWlzaCh0aGlzKTsKIAkJci51c2VyID0gbjsKIAkJcmV0dXJuIHI7CkBAIC01NjQsNyArNTY0LDcgQEAgcHVibGljIFN0cmluZyBnZXRQYXNzKCkgewogCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBmb3IgcGFzc3dvcmQuCiAJICogQHJldHVybiBhIG5ldyBVUkkgd2l0aCB0aGUgdXBkYXRlZCB2YWx1ZS4KIAkgKi8KLQlwdWJsaWMgVVJJaXNoIHNldFBhc3MoZmluYWwgU3RyaW5nIG4pIHsKKwlwdWJsaWMgVVJJaXNoIHNldFBhc3MoU3RyaW5nIG4pIHsKIAkJZmluYWwgVVJJaXNoIHIgPSBuZXcgVVJJaXNoKHRoaXMpOwogCQlyLnBhc3MgPSBuOwogCQlyZXR1cm4gcjsKQEAgLTU4Niw3ICs1ODYsNyBAQCBwdWJsaWMgaW50IGdldFBvcnQoKSB7CiAJICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIGZvciBwb3J0LgogCSAqIEByZXR1cm4gYSBuZXcgVVJJIHdpdGggdGhlIHVwZGF0ZWQgdmFsdWUuCiAJICovCi0JcHVibGljIFVSSWlzaCBzZXRQb3J0KGZpbmFsIGludCBuKSB7CisJcHVibGljIFVSSWlzaCBzZXRQb3J0KGludCBuKSB7CiAJCWZpbmFsIFVSSWlzaCByID0gbmV3IFVSSWlzaCh0aGlzKTsKIAkJci5wb3J0ID0gbiA+IDAgPyBuIDogLTE7CiAJCXJldHVybiByOwpAQCAtNjEzLDcgKzYxMyw3IEBAIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhmaW5hbCBPYmplY3Qgb2JqKSB7CisJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKIAkJaWYgKCEob2JqIGluc3RhbmNlb2YgVVJJaXNoKSkKIAkJCXJldHVybiBmYWxzZTsKIAkJZmluYWwgVVJJaXNoIGIgPSAoVVJJaXNoKSBvYmo7CkBAIC02MzIsNyArNjMyLDcgQEAgcHVibGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIE9iamVjdCBvYmopIHsKIAkJcmV0dXJuIHRydWU7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBlcShmaW5hbCBTdHJpbmcgYSwgZmluYWwgU3RyaW5nIGIpIHsKKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGVxKFN0cmluZyBhLCBTdHJpbmcgYikgewogCQlpZiAoYSA9PSBiKQogCQkJcmV0dXJuIHRydWU7CiAJCWlmIChTdHJpbmdVdGlscy5pc0VtcHR5T3JOdWxsKGEpICYmIFN0cmluZ1V0aWxzLmlzRW1wdHlPck51bGwoYikpCkBAIC02NTcsNyArNjU3LDcgQEAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJcmV0dXJuIGZvcm1hdChmYWxzZSwgZmFsc2UpOwogCX0KIAotCXByaXZhdGUgU3RyaW5nIGZvcm1hdChmaW5hbCBib29sZWFuIGluY2x1ZGVQYXNzd29yZCwgYm9vbGVhbiBlc2NhcGVOb25Bc2NpaSkgeworCXByaXZhdGUgU3RyaW5nIGZvcm1hdChib29sZWFuIGluY2x1ZGVQYXNzd29yZCwgYm9vbGVhbiBlc2NhcGVOb25Bc2NpaSkgewogCQlmaW5hbCBTdHJpbmdCdWlsZGVyIHIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogCQlpZiAoZ2V0U2NoZW1lKCkgIT0gbnVsbCkgewogCQkJci5hcHBlbmQoZ2V0U2NoZW1lKCkpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVXBsb2FkUGFjay5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVXBsb2FkUGFjay5qYXZhCmluZGV4IDhmNzViYmEuLjZhM2Q5YTEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1VwbG9hZFBhY2suamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9VcGxvYWRQYWNrLmphdmEKQEAgLTQzLDEwICs0MywxNiBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0OwogCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZkRhdGFiYXNlLkFMTDsKK2ltcG9ydCBzdGF0aWMgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uLmlkZW50aXR5OworaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnMudG9NYXA7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5SX1RBR1M7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LkdpdFByb3RvY29sQ29uc3RhbnRzLkNPTU1BTkRfRkVUQ0g7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LkdpdFByb3RvY29sQ29uc3RhbnRzLkNPTU1BTkRfTFNfUkVGUzsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuR2l0UHJvdG9jb2xDb25zdGFudHMuT1BUSU9OX0FHRU5UOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5HaXRQcm90b2NvbENvbnN0YW50cy5PUFRJT05fQUxMT1dfUkVBQ0hBQkxFX1NIQTFfSU5fV0FOVDsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuR2l0UHJvdG9jb2xDb25zdGFudHMuT1BUSU9OX0FMTE9XX1RJUF9TSEExX0lOX1dBTlQ7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LkdpdFByb3RvY29sQ29uc3RhbnRzLk9QVElPTl9ERUVQRU5fUkVMQVRJVkU7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LkdpdFByb3RvY29sQ29uc3RhbnRzLk9QVElPTl9GSUxURVI7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LkdpdFByb3RvY29sQ29uc3RhbnRzLk9QVElPTl9JTkNMVURFX1RBRzsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuR2l0UHJvdG9jb2xDb25zdGFudHMuT1BUSU9OX01VTFRJX0FDSzsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuR2l0UHJvdG9jb2xDb25zdGFudHMuT1BUSU9OX01VTFRJX0FDS19ERVRBSUxFRDsKQEAgLTY3LDEwICs3MywxMyBAQAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYW5ub3RhdGlvbnMuTnVsbGFibGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuQ29ycnVwdE9iamVjdEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5JbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLk1pc3NpbmdPYmplY3RFeGNlcHRpb247CkBAIC0xMDEsNiArMTEwLDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UucGFjay5QYWNrU3RhdGlzdGljczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5HaXRQcm90b2NvbENvbnN0YW50cy5NdWx0aUFjazsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5SZWZBZHZlcnRpc2VyLlBhY2tldExpbmVPdXRSZWZBZHZlcnRpc2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlRyYW5zZmVyQ29uZmlnLlByb3RvY29sVmVyc2lvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuaW8uSW50ZXJydXB0VGltZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvLk51bGxPdXRwdXRTdHJlYW07CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvLlRpbWVvdXRJbnB1dFN0cmVhbTsKQEAgLTIzNiw2ICsyNDYsMTIgQEAgcHVibGljIFNldDxTdHJpbmc+IGdldE9wdGlvbnMoKSB7CiAJLyoqIFRpbWVyIHRvIG1hbmFnZSB7QGxpbmsgI3RpbWVvdXR9LiAqLwogCXByaXZhdGUgSW50ZXJydXB0VGltZXIgdGltZXI7CiAKKwkvKioKKwkgKiBXaGV0aGVyIHRoZSBjbGllbnQgcmVxdWVzdGVkIHRvIHVzZSBwcm90b2NvbCBWMiB0aHJvdWdoIGEgc2lkZQorCSAqIGNoYW5uZWwgKHN1Y2ggYXMgdGhlIEdpdC1Qcm90b2NvbCBIVFRQIGhlYWRlcikuCisJICovCisJcHJpdmF0ZSBib29sZWFuIGNsaWVudFJlcXVlc3RlZFYyOworCiAJcHJpdmF0ZSBJbnB1dFN0cmVhbSByYXdJbjsKIAogCXByaXZhdGUgUmVzcG9uc2VCdWZmZXJlZE91dHB1dFN0cmVhbSByYXdPdXQ7CkBAIC0yNDYsMTIgKzI2MiwxOCBAQCBwdWJsaWMgU2V0PFN0cmluZz4gZ2V0T3B0aW9ucygpIHsKIAogCXByaXZhdGUgT3V0cHV0U3RyZWFtIG1zZ091dCA9IE51bGxPdXRwdXRTdHJlYW0uSU5TVEFOQ0U7CiAKLQkvKiogVGhlIHJlZnMgd2UgYWR2ZXJ0aXNlZCBhcyBleGlzdGluZyBhdCB0aGUgc3RhcnQgb2YgdGhlIGNvbm5lY3Rpb24uICovCisJLyoqCisJICogUmVmcyBlbGlnaWJsZSBmb3IgYWR2ZXJ0aXNpbmcgdG8gdGhlIGNsaWVudCwgc2V0IHVzaW5nCisJICoge0BsaW5rICNzZXRBZHZlcnRpc2VkUmVmc30uCisJICovCiAJcHJpdmF0ZSBNYXA8U3RyaW5nLCBSZWY+IHJlZnM7CiAKIAkvKiogSG9vayB1c2VkIHdoaWxlIGFkdmVydGlzaW5nIHRoZSByZWZzIHRvIHRoZSBjbGllbnQuICovCiAJcHJpdmF0ZSBBZHZlcnRpc2VSZWZzSG9vayBhZHZlcnRpc2VSZWZzSG9vayA9IEFkdmVydGlzZVJlZnNIb29rLkRFRkFVTFQ7CiAKKwkvKiogV2hldGhlciB0aGUge0BsaW5rICNhZHZlcnRpc2VSZWZzSG9va30gaGFzIGJlZW4gaW52b2tlZC4gKi8KKwlwcml2YXRlIGJvb2xlYW4gYWR2ZXJ0aXNlUmVmc0hvb2tDYWxsZWQ7CisKIAkvKiogRmlsdGVyIHVzZWQgd2hpbGUgYWR2ZXJ0aXNpbmcgdGhlIHJlZnMgdG8gdGhlIGNsaWVudC4gKi8KIAlwcml2YXRlIFJlZkZpbHRlciByZWZGaWx0ZXIgPSBSZWZGaWx0ZXIuREVGQVVMVDsKIApAQCAtMjc3LDEyICsyOTksMjIgQEAgcHVibGljIFNldDxTdHJpbmc+IGdldE9wdGlvbnMoKSB7CiAJLyoqIFNoYWxsb3cgY29tbWl0cyB0aGUgY2xpZW50IGFscmVhZHkgaGFzLiAqLwogCXByaXZhdGUgZmluYWwgU2V0PE9iamVjdElkPiBjbGllbnRTaGFsbG93Q29tbWl0cyA9IG5ldyBIYXNoU2V0PD4oKTsKIAotCS8qKiBTaGFsbG93IGNvbW1pdHMgb24gdGhlIGNsaWVudCB3aGljaCBhcmUgbm93IGJlY29taW5nIHVuc2hhbGxvdyAqLwotCXByaXZhdGUgZmluYWwgTGlzdDxPYmplY3RJZD4gdW5zaGFsbG93Q29tbWl0cyA9IG5ldyBBcnJheUxpc3Q8PigpOwotCiAJLyoqIERlc2lyZWQgZGVwdGggZnJvbSB0aGUgY2xpZW50IG9uIGEgc2hhbGxvdyByZXF1ZXN0LiAqLwogCXByaXZhdGUgaW50IGRlcHRoOwogCisJLyoqCisJICogQ29tbWl0IHRpbWUgb2YgdGhlIG5ld2VzdCBvYmplY3RzIHRoZSBjbGllbnQgaGFzIGFza2VkIHVzIHVzaW5nCisJICogLS1zaGFsbG93LXNpbmNlIG5vdCB0byBzZW5kLiBDYW5ub3QgYmUgbm9uemVybyBpZiBkZXB0aCBpcyBub256ZXJvLgorCSAqLworCXByaXZhdGUgaW50IHNoYWxsb3dTaW5jZTsKKworCS8qKgorCSAqIChQb3NzaWJseSBzaG9ydCkgcmVmIG5hbWVzLCBhbmNlc3RvcnMgb2Ygd2hpY2ggdGhlIGNsaWVudCBoYXMgYXNrZWQgdXMKKwkgKiBub3QgdG8gc2VuZCB1c2luZyAtLXNoYWxsb3ctZXhjbHVkZS4gQ2Fubm90IGJlIG5vbi1udWxsIGlmIGRlcHRoIGlzCisJICogbm9uemVyby4KKwkgKi8KKwlwcml2YXRlIEBOdWxsYWJsZSBMaXN0PFN0cmluZz4gc2hhbGxvd0V4Y2x1ZGVSZWZzOworCiAJLyoqIENvbW1pdCB0aW1lIG9mIHRoZSBvbGRlc3QgY29tbW9uIGNvbW1pdCwgaW4gc2Vjb25kcy4gKi8KIAlwcml2YXRlIGludCBvbGRlc3RUaW1lOwogCkBAIC0zMTYsOCArMzQ4LDcgQEAgcHVibGljIFNldDxTdHJpbmc+IGdldE9wdGlvbnMoKSB7CiAKIAlwcml2YXRlIFBhY2tTdGF0aXN0aWNzIHN0YXRpc3RpY3M7CiAKLQlAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQotCXByaXZhdGUgVXBsb2FkUGFja0xvZ2dlciBsb2dnZXIgPSBVcGxvYWRQYWNrTG9nZ2VyLk5VTEw7CisJcHJpdmF0ZSBsb25nIGZpbHRlckJsb2JMaW1pdCA9IC0xOwogCiAJLyoqCiAJICogQ3JlYXRlIGEgbmV3IHBhY2sgdXBsb2FkIGZvciBhbiBvcGVuIHJlcG9zaXRvcnkuCkBAIC0zMjUsNyArMzU2LDcgQEAgcHVibGljIFNldDxTdHJpbmc+IGdldE9wdGlvbnMoKSB7CiAJICogQHBhcmFtIGNvcHlGcm9tCiAJICogICAgICAgICAgICB0aGUgc291cmNlIHJlcG9zaXRvcnkuCiAJICovCi0JcHVibGljIFVwbG9hZFBhY2soZmluYWwgUmVwb3NpdG9yeSBjb3B5RnJvbSkgeworCXB1YmxpYyBVcGxvYWRQYWNrKFJlcG9zaXRvcnkgY29weUZyb20pIHsKIAkJZGIgPSBjb3B5RnJvbTsKIAkJd2FsayA9IG5ldyBSZXZXYWxrKGRiKTsKIAkJd2Fsay5zZXRSZXRhaW5Cb2R5KGZhbHNlKTsKQEAgLTQxNCw3ICs0NDUsNyBAQCBwdWJsaWMgaW50IGdldFRpbWVvdXQoKSB7CiAJICogICAgICAgICAgICBiZWZvcmUgYWJvcnRpbmcgYW4gSU8gcmVhZCBvciB3cml0ZSBvcGVyYXRpb24gd2l0aCB0aGUKIAkgKiAgICAgICAgICAgIGNvbm5lY3RlZCBjbGllbnQuCiAJICovCi0JcHVibGljIHZvaWQgc2V0VGltZW91dChmaW5hbCBpbnQgc2Vjb25kcykgeworCXB1YmxpYyB2b2lkIHNldFRpbWVvdXQoaW50IHNlY29uZHMpIHsKIAkJdGltZW91dCA9IHNlY29uZHM7CiAJfQogCkBAIC00NDEsNyArNDcyLDcgQEAgcHVibGljIGJvb2xlYW4gaXNCaURpcmVjdGlvbmFsUGlwZSgpIHsKIAkgKiAgICAgICAgICAgIGNvbW1hbmRzIGJlZm9yZSB3cml0aW5nIG91dHB1dCBhbmQgZG9lcyBub3QgcGVyZm9ybSB0aGUKIAkgKiAgICAgICAgICAgIGluaXRpYWwgYWR2ZXJ0aXNpbmcuCiAJICovCi0JcHVibGljIHZvaWQgc2V0QmlEaXJlY3Rpb25hbFBpcGUoZmluYWwgYm9vbGVhbiB0d29XYXkpIHsKKwlwdWJsaWMgdm9pZCBzZXRCaURpcmVjdGlvbmFsUGlwZShib29sZWFuIHR3b1dheSkgewogCQliaURpcmVjdGlvbmFsUGlwZSA9IHR3b1dheTsKIAl9CiAKQEAgLTU0NCw3ICs1NzUsNyBAQCBwdWJsaWMgUmVmRmlsdGVyIGdldFJlZkZpbHRlcigpIHsKIAkgKiBAcGFyYW0gYWR2ZXJ0aXNlUmVmc0hvb2sKIAkgKiAgICAgICAgICAgIHRoZSBob29rOyBtYXkgYmUgbnVsbCB0byBzaG93IGFsbCByZWZzLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldEFkdmVydGlzZVJlZnNIb29rKGZpbmFsIEFkdmVydGlzZVJlZnNIb29rIGFkdmVydGlzZVJlZnNIb29rKSB7CisJcHVibGljIHZvaWQgc2V0QWR2ZXJ0aXNlUmVmc0hvb2soQWR2ZXJ0aXNlUmVmc0hvb2sgYWR2ZXJ0aXNlUmVmc0hvb2spIHsKIAkJaWYgKGFkdmVydGlzZVJlZnNIb29rICE9IG51bGwpCiAJCQl0aGlzLmFkdmVydGlzZVJlZnNIb29rID0gYWR2ZXJ0aXNlUmVmc0hvb2s7CiAJCWVsc2UKQEAgLTU2Myw3ICs1OTQsNyBAQCBwdWJsaWMgdm9pZCBzZXRBZHZlcnRpc2VSZWZzSG9vayhmaW5hbCBBZHZlcnRpc2VSZWZzSG9vayBhZHZlcnRpc2VSZWZzSG9vaykgewogCSAqIEBwYXJhbSByZWZGaWx0ZXIKIAkgKiAgICAgICAgICAgIHRoZSBmaWx0ZXI7IG1heSBiZSBudWxsIHRvIHNob3cgYWxsIHJlZnMuCiAJICovCi0JcHVibGljIHZvaWQgc2V0UmVmRmlsdGVyKGZpbmFsIFJlZkZpbHRlciByZWZGaWx0ZXIpIHsKKwlwdWJsaWMgdm9pZCBzZXRSZWZGaWx0ZXIoUmVmRmlsdGVyIHJlZkZpbHRlcikgewogCQl0aGlzLnJlZkZpbHRlciA9IHJlZkZpbHRlciAhPSBudWxsID8gcmVmRmlsdGVyIDogUmVmRmlsdGVyLkRFRkFVTFQ7CiAJfQogCkBAIC02MzgsMjkgKzY2OSw2IEBAIHB1YmxpYyB2b2lkIHNldFRyYW5zZmVyQ29uZmlnKFRyYW5zZmVyQ29uZmlnIHRjKSB7CiAJfQogCiAJLyoqCi0JICogR2V0IHRoZSBjb25maWd1cmVkIGxvZ2dlci4KLQkgKgotCSAqIEByZXR1cm4gdGhlIGNvbmZpZ3VyZWQgbG9nZ2VyLgotCSAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI2dldFByZVVwbG9hZEhvb2soKX0uCi0JICovCi0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgVXBsb2FkUGFja0xvZ2dlciBnZXRMb2dnZXIoKSB7Ci0JCXJldHVybiBsb2dnZXI7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBsb2dnZXIuCi0JICoKLQkgKiBAcGFyYW0gbG9nZ2VyCi0JICogICAgICAgICAgICB0aGUgbG9nZ2VyIGluc3RhbmNlLiBJZiBudWxsLCBubyBsb2dnaW5nIG9jY3Vycy4KLQkgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNzZXRQcmVVcGxvYWRIb29rKFByZVVwbG9hZEhvb2spfS4KLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyB2b2lkIHNldExvZ2dlcihVcGxvYWRQYWNrTG9nZ2VyIGxvZ2dlcikgewotCQl0aGlzLmxvZ2dlciA9IGxvZ2dlcjsKLQl9Ci0KLQkvKioKIAkgKiBDaGVjayB3aGV0aGVyIHRoZSBjbGllbnQgZXhwZWN0cyBhIHNpZGUtYmFuZCBzdHJlYW0uCiAJICoKIAkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNsaWVudCBoYXMgYWR2ZXJ0aXNlZCBhIHNpZGUtYmFuZCBjYXBhYmlsaXR5LCBmYWxzZQpAQCAtNjc5LDggKzY4NywzNCBAQCBwdWJsaWMgYm9vbGVhbiBpc1NpZGVCYW5kKCkgdGhyb3dzIFJlcXVlc3ROb3RZZXRSZWFkRXhjZXB0aW9uIHsKIAl9CiAKIAkvKioKKwkgKiBTZXQgdGhlIEV4dHJhIFBhcmFtZXRlcnMgcHJvdmlkZWQgYnkgdGhlIGNsaWVudC4KKwkgKgorCSAqIDxwPlRoZXNlIGFyZSBwYXJhbWV0ZXJzIHBhc3NlZCBieSB0aGUgY2xpZW50IHRocm91Z2ggYSBzaWRlIGNoYW5uZWwKKwkgKiBzdWNoIGFzIHRoZSBHaXQtUHJvdG9jb2wgSFRUUCBoZWFkZXIsIHRvIGFsbG93IGEgY2xpZW50IHRvIHJlcXVlc3QKKwkgKiBhIG5ld2VyIHJlc3BvbnNlIGZvcm1hdCB3aGlsZSByZW1haW5pbmcgY29tcGF0aWJsZSB3aXRoIG9sZGVyIHNlcnZlcnMKKwkgKiB0aGF0IGRvIG5vdCB1bmRlcnN0YW5kIGRpZmZlcmVudCByZXF1ZXN0IGZvcm1hdHMuCisJICoKKwkgKiBAcGFyYW0gcGFyYW1zCisJICogICAgICAgICAgICBwYXJhbWV0ZXJzIHN1cHBsaWVkIGJ5IHRoZSBjbGllbnQsIHNwbGl0IGF0IGNvbG9ucyBvciBOVUwKKwkgKiAgICAgICAgICAgIGJ5dGVzLgorCSAqIEBzaW5jZSA1LjAKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRFeHRyYVBhcmFtZXRlcnMoQ29sbGVjdGlvbjxTdHJpbmc+IHBhcmFtcykgeworCQl0aGlzLmNsaWVudFJlcXVlc3RlZFYyID0gcGFyYW1zLmNvbnRhaW5zKCJ2ZXJzaW9uPTIiKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCXByaXZhdGUgYm9vbGVhbiB1c2VQcm90b2NvbFYyKCkgeworCQlyZXR1cm4gUHJvdG9jb2xWZXJzaW9uLlYyLmVxdWFscyh0cmFuc2ZlckNvbmZpZy5wcm90b2NvbFZlcnNpb24pCisJCQkJJiYgY2xpZW50UmVxdWVzdGVkVjI7CisJfQorCisJLyoqCiAJICogRXhlY3V0ZSB0aGUgdXBsb2FkIHRhc2sgb24gdGhlIHNvY2tldC4KIAkgKgorCSAqIDxwPklmIHRoZSBjbGllbnQgcGFzc2VkIGV4dHJhIHBhcmFtZXRlcnMgKGUuZy4sICJ2ZXJzaW9uPTIiKSB0aHJvdWdoIGEKKwkgKiBzaWRlIGNoYW5uZWwsIHRoZSBjYWxsZXIgbXVzdCBjYWxsIHNldEV4dHJhUGFyYW1ldGVycyBmaXJzdCB0byBzdXBwbHkKKwkgKiB0aGVtLgorCSAqCiAJICogQHBhcmFtIGlucHV0CiAJICogICAgICAgICAgICByYXcgaW5wdXQgdG8gcmVhZCBjbGllbnQgY29tbWFuZHMgZnJvbS4gQ2FsbGVyIG11c3QgZW5zdXJlIHRoZQogCSAqICAgICAgICAgICAgaW5wdXQgaXMgYnVmZmVyZWQsIG90aGVyd2lzZSByZWFkIHBlcmZvcm1hbmNlIG1heSBzdWZmZXIuCkBAIC03MjEsNyArNzU1LDExIEBAIHB1YmxpYyB2b2lkIHVwbG9hZChmaW5hbCBJbnB1dFN0cmVhbSBpbnB1dCwgT3V0cHV0U3RyZWFtIG91dHB1dCwKIAogCQkJcGNrSW4gPSBuZXcgUGFja2V0TGluZUluKHJhd0luKTsKIAkJCXBja091dCA9IG5ldyBQYWNrZXRMaW5lT3V0KHJhd091dCk7Ci0JCQlzZXJ2aWNlKCk7CisJCQlpZiAodXNlUHJvdG9jb2xWMigpKSB7CisJCQkJc2VydmljZVYyKCk7CisJCQl9IGVsc2UgeworCQkJCXNlcnZpY2UoKTsKKwkJCX0KIAkJfSBmaW5hbGx5IHsKIAkJCW1zZ091dCA9IE51bGxPdXRwdXRTdHJlYW0uSU5TVEFOQ0U7CiAJCQl3YWxrLmNsb3NlKCk7CkBAIC03NDEsMjEgKzc3OSw2IEBAIHB1YmxpYyB2b2lkIHVwbG9hZChmaW5hbCBJbnB1dFN0cmVhbSBpbnB1dCwgT3V0cHV0U3RyZWFtIG91dHB1dCwKIAkgKiBAcmV0dXJuIHN0YXRpc3RpY3MgYWJvdXQgcGFjayBvdXRwdXQsIGlmIGEgcGFjayB3YXMgc2VudC4gTnVsbCBpZiBubyBwYWNrCiAJICogICAgICAgICB3YXMgc2VudCwgc3VjaCBhcyBkdXJpbmcgdGhlIG5lZ290aWF0aW9uIHBoYXNlIG9mIGEgc21hcnQgSFRUUAogCSAqICAgICAgICAgY29ubmVjdGlvbiwgb3IgaWYgdGhlIGNsaWVudCB3YXMgYWxyZWFkeSB1cC10by1kYXRlLgotCSAqIEBzaW5jZSAzLjAKLQkgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNnZXRTdGF0aXN0aWNzKCl9LgotCSAqLwotCUBEZXByZWNhdGVkCi0JcHVibGljIFBhY2tXcml0ZXIuU3RhdGlzdGljcyBnZXRQYWNrU3RhdGlzdGljcygpIHsKLQkJcmV0dXJuIHN0YXRpc3RpY3MgPT0gbnVsbCA/IG51bGwKLQkJCQk6IG5ldyBQYWNrV3JpdGVyLlN0YXRpc3RpY3Moc3RhdGlzdGljcyk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBQYWNrV3JpdGVyJ3Mgc3RhdGlzdGljcyBpZiBhIHBhY2sgd2FzIHNlbnQgdG8gdGhlIGNsaWVudC4KLQkgKgotCSAqIEByZXR1cm4gc3RhdGlzdGljcyBhYm91dCBwYWNrIG91dHB1dCwgaWYgYSBwYWNrIHdhcyBzZW50LiBOdWxsIGlmIG5vIHBhY2sKLQkgKiAgICAgICAgIHdhcyBzZW50LCBzdWNoIGFzIGR1cmluZyB0aGUgbmVnb3RpYXRpb24gcGhhc2Ugb2YgYSBzbWFydCBIVFRQCi0JICogICAgICAgICBjb25uZWN0aW9uLCBvciBpZiB0aGUgY2xpZW50IHdhcyBhbHJlYWR5IHVwLXRvLWRhdGUuCiAJICogQHNpbmNlIDQuMQogCSAqLwogCXB1YmxpYyBQYWNrU3RhdGlzdGljcyBnZXRTdGF0aXN0aWNzKCkgewpAQCAtNzY3LDE4ICs3OTAsNTYgQEAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBSZWY+IGdldEFkdmVydGlzZWRPckRlZmF1bHRSZWZzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCXJldHVybiByZWZzOwogCQl9CiAKLQkJYWR2ZXJ0aXNlUmVmc0hvb2suYWR2ZXJ0aXNlUmVmcyh0aGlzKTsKKwkJaWYgKCFhZHZlcnRpc2VSZWZzSG9va0NhbGxlZCkgeworCQkJYWR2ZXJ0aXNlUmVmc0hvb2suYWR2ZXJ0aXNlUmVmcyh0aGlzKTsKKwkJCWFkdmVydGlzZVJlZnNIb29rQ2FsbGVkID0gdHJ1ZTsKKwkJfQogCQlpZiAocmVmcyA9PSBudWxsKSB7Ci0JCQlzZXRBZHZlcnRpc2VkUmVmcyhkYi5nZXRSZWZEYXRhYmFzZSgpLmdldFJlZnMoQUxMKSk7CisJCQkvLyBGYWxsIGJhY2sgdG8gYWxsIHJlZnMuCisJCQlzZXRBZHZlcnRpc2VkUmVmcygKKwkJCQkJZGIuZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzKCkuc3RyZWFtKCkKKwkJCQkJCS5jb2xsZWN0KHRvTWFwKFJlZjo6Z2V0TmFtZSwgaWRlbnRpdHkoKSkpKTsKIAkJfQogCQlyZXR1cm4gcmVmczsKIAl9CiAKKwlwcml2YXRlIE1hcDxTdHJpbmcsIFJlZj4gZ2V0RmlsdGVyZWRSZWZzKENvbGxlY3Rpb248U3RyaW5nPiByZWZQcmVmaXhlcykKKwkJCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJaWYgKHJlZlByZWZpeGVzLmlzRW1wdHkoKSkgeworCQkJcmV0dXJuIGdldEFkdmVydGlzZWRPckRlZmF1bHRSZWZzKCk7CisJCX0KKwkJaWYgKHJlZnMgPT0gbnVsbCAmJiAhYWR2ZXJ0aXNlUmVmc0hvb2tDYWxsZWQpIHsKKwkJCWFkdmVydGlzZVJlZnNIb29rLmFkdmVydGlzZVJlZnModGhpcyk7CisJCQlhZHZlcnRpc2VSZWZzSG9va0NhbGxlZCA9IHRydWU7CisJCX0KKwkJaWYgKHJlZnMgPT0gbnVsbCkgeworCQkJLy8gRmFzdCBwYXRoOiB0aGUgYWR2ZXJ0aXNlZCByZWZzIGhvb2sgZGlkIG5vdCBzZXQgYWR2ZXJ0aXNlZCByZWZzLgorCQkJTWFwPFN0cmluZywgUmVmPiBycyA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJCWZvciAoU3RyaW5nIHAgOiByZWZQcmVmaXhlcykgeworCQkJCWZvciAoUmVmIHIgOiBkYi5nZXRSZWZEYXRhYmFzZSgpLmdldFJlZnNCeVByZWZpeChwKSkgeworCQkJCQlycy5wdXQoci5nZXROYW1lKCksIHIpOworCQkJCX0KKwkJCX0KKwkJCWlmIChyZWZGaWx0ZXIgIT0gUmVmRmlsdGVyLkRFRkFVTFQpIHsKKwkJCQlyZXR1cm4gcmVmRmlsdGVyLmZpbHRlcihycyk7CisJCQl9CisJCQlyZXR1cm4gdHJhbnNmZXJDb25maWcuZ2V0UmVmRmlsdGVyKCkuZmlsdGVyKHJzKTsKKwkJfQorCisJCS8vIFNsb3cgcGF0aDogZmlsdGVyIHRoZSByZWZzIHByb3ZpZGVkIGJ5IHRoZSBhZHZlcnRpc2VkIHJlZnMgaG9vay4KKwkJLy8gcmVmRmlsdGVyIGhhcyBhbHJlYWR5IGJlZW4gYXBwbGllZCB0byByZWZzLgorCQlyZXR1cm4gcmVmcy52YWx1ZXMoKS5zdHJlYW0oKQorCQkJCS5maWx0ZXIocmVmIC0+IHJlZlByZWZpeGVzLnN0cmVhbSgpCisJCQkJCQkuYW55TWF0Y2gocmVmLmdldE5hbWUoKTo6c3RhcnRzV2l0aCkpCisJCQkJLmNvbGxlY3QodG9NYXAoUmVmOjpnZXROYW1lLCBpZGVudGl0eSgpKSk7CisJfQorCiAJcHJpdmF0ZSB2b2lkIHNlcnZpY2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlib29sZWFuIHNlbmRQYWNrID0gZmFsc2U7CiAJCS8vIElmIGl0J3MgYSBub24tYmlkaSByZXF1ZXN0LCB3ZSBuZWVkIHRvIHJlYWQgdGhlIGVudGlyZSByZXF1ZXN0IGJlZm9yZQogCQkvLyB3cml0aW5nIGEgcmVzcG9uc2UuIEJ1ZmZlciB0aGUgcmVzcG9uc2UgdW50aWwgdGhlbi4KIAkJUGFja1N0YXRpc3RpY3MuQWNjdW11bGF0b3IgYWNjdW11bGF0b3IgPSBuZXcgUGFja1N0YXRpc3RpY3MuQWNjdW11bGF0b3IoKTsKKwkJTGlzdDxPYmplY3RJZD4gdW5zaGFsbG93Q29tbWl0cyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCQl0cnkgewogCQkJaWYgKGJpRGlyZWN0aW9uYWxQaXBlKQogCQkJCXNlbmRBZHZlcnRpc2VkUmVmcyhuZXcgUGFja2V0TGluZU91dFJlZkFkdmVydGlzZXIocGNrT3V0KSk7CkBAIC04MDgsNyArODY5LDcgQEAgZWxzZSBpZiAocmVxdWVzdFZhbGlkYXRvciBpbnN0YW5jZW9mIEFueVJlcXVlc3RWYWxpZGF0b3IpCiAJCQlpZiAoIWNsaWVudFNoYWxsb3dDb21taXRzLmlzRW1wdHkoKSkKIAkJCQl2ZXJpZnlDbGllbnRTaGFsbG93KCk7CiAJCQlpZiAoZGVwdGggIT0gMCkKLQkJCQlwcm9jZXNzU2hhbGxvdygpOworCQkJCXByb2Nlc3NTaGFsbG93KG51bGwsIHVuc2hhbGxvd0NvbW1pdHMsIHRydWUpOwogCQkJaWYgKCFjbGllbnRTaGFsbG93Q29tbWl0cy5pc0VtcHR5KCkpCiAJCQkJd2Fsay5hc3N1bWVTaGFsbG93KGNsaWVudFNoYWxsb3dDb21taXRzKTsKIAkJCXNlbmRQYWNrID0gbmVnb3RpYXRlKGFjY3VtdWxhdG9yKTsKQEAgLTg2MCw4ICs5MjEsMjc4IEBAIGVsc2UgaWYgKHJlcXVlc3RWYWxpZGF0b3IgaW5zdGFuY2VvZiBBbnlSZXF1ZXN0VmFsaWRhdG9yKQogCQkJcmF3T3V0LnN0b3BCdWZmZXJpbmcoKTsKIAkJfQogCi0JCWlmIChzZW5kUGFjaykKLQkJCXNlbmRQYWNrKGFjY3VtdWxhdG9yKTsKKwkJaWYgKHNlbmRQYWNrKSB7CisJCQlzZW5kUGFjayhhY2N1bXVsYXRvciwgcmVmcyA9PSBudWxsID8gbnVsbCA6IHJlZnMudmFsdWVzKCksIHVuc2hhbGxvd0NvbW1pdHMpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIGxzUmVmc1YyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJUGFja2V0TGluZU91dFJlZkFkdmVydGlzZXIgYWR2ID0gbmV3IFBhY2tldExpbmVPdXRSZWZBZHZlcnRpc2VyKHBja091dCk7CisJCVN0cmluZyBsaW5lOworCQlBcnJheUxpc3Q8U3RyaW5nPiByZWZQcmVmaXhlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlib29sZWFuIG5lZWRUb0ZpbmRTeW1yZWZzID0gZmFsc2U7CisKKwkJYWR2LnNldFVzZVByb3RvY29sVjIodHJ1ZSk7CisKKwkJbGluZSA9IHBja0luLnJlYWRTdHJpbmcoKTsKKworCQkvLyBDdXJyZW50bHksIHdlIGRvIG5vdCBzdXBwb3J0IGFueSBjYXBhYmlsaXRpZXMsIHNvIHRoZSBuZXh0CisJCS8vIGxpbmUgaXMgREVMSU0gaWYgdGhlcmUgYXJlIGFyZ3VtZW50cyBvciBFTkQgaWYgbm90LgorCQlpZiAobGluZSA9PSBQYWNrZXRMaW5lSW4uREVMSU0pIHsKKwkJCXdoaWxlICgobGluZSA9IHBja0luLnJlYWRTdHJpbmcoKSkgIT0gUGFja2V0TGluZUluLkVORCkgeworCQkJCWlmIChsaW5lLmVxdWFscygicGVlbCIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQkJYWR2LnNldERlcmVmVGFncyh0cnVlKTsKKwkJCQl9IGVsc2UgaWYgKGxpbmUuZXF1YWxzKCJzeW1yZWZzIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCQluZWVkVG9GaW5kU3ltcmVmcyA9IHRydWU7CisJCQkJfSBlbHNlIGlmIChsaW5lLnN0YXJ0c1dpdGgoInJlZi1wcmVmaXggIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCQlyZWZQcmVmaXhlcy5hZGQobGluZS5zdWJzdHJpbmcoInJlZi1wcmVmaXggIi5sZW5ndGgoKSkpOyAvLyROT04tTkxTLTEkCisJCQkJfSBlbHNlIHsKKwkJCQkJdGhyb3cgbmV3IFBhY2tQcm90b2NvbEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0CisJCQkJCQkJLmZvcm1hdChKR2l0VGV4dC5nZXQoKS51bmV4cGVjdGVkUGFja2V0TGluZSwgbGluZSkpOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIGlmIChsaW5lICE9IFBhY2tldExpbmVJbi5FTkQpIHsKKwkJCXRocm93IG5ldyBQYWNrUHJvdG9jb2xFeGNlcHRpb24oTWVzc2FnZUZvcm1hdAorCQkJCQkuZm9ybWF0KEpHaXRUZXh0LmdldCgpLnVuZXhwZWN0ZWRQYWNrZXRMaW5lLCBsaW5lKSk7CisJCX0KKwkJcmF3T3V0LnN0b3BCdWZmZXJpbmcoKTsKKworCQlNYXA8U3RyaW5nLCBSZWY+IHJlZnNUb1NlbmQgPSBnZXRGaWx0ZXJlZFJlZnMocmVmUHJlZml4ZXMpOworCisJCWlmIChuZWVkVG9GaW5kU3ltcmVmcykgeworCQkJZmluZFN5bXJlZnMoYWR2LCByZWZzVG9TZW5kKTsKKwkJfQorCisJCWFkdi5zZW5kKHJlZnNUb1NlbmQpOworCQlhZHYuZW5kKCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGZldGNoVjIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlvcHRpb25zID0gbmV3IEhhc2hTZXQ8PigpOworCisJCS8vIFBhY2tzIGFyZSBhbHdheXMgc2VudCBtdWx0aXBsZXhlZCBhbmQgdXNpbmcgZnVsbCA2NEsKKwkJLy8gbGVuZ3Rocy4KKwkJb3B0aW9ucy5hZGQoT1BUSU9OX1NJREVfQkFORF82NEspOworCisJCS8vIERlcGVuZGluZyBvbiB0aGUgcmVxdWVzdFZhbGlkYXRvciwgI3Byb2Nlc3NIYXZlTGluZXMgbWF5CisJCS8vIHJlcXVpcmUgdGhhdCBhZHZlcnRpc2VkIGJlIHNldC4gU2V0IGl0IG9ubHkgaW4gdGhlIHJlcXVpcmVkCisJCS8vIGNpcmN1bXN0YW5jZXMgKHRvIGF2b2lkIGEgZnVsbCByZWYgbG9va3VwIGluIHRoZSBjYXNlIHRoYXQKKwkJLy8gd2UgZG9uJ3QgbmVlZCBpdCkuCisJCWlmIChyZXF1ZXN0VmFsaWRhdG9yIGluc3RhbmNlb2YgVGlwUmVxdWVzdFZhbGlkYXRvciB8fAorCQkJCXJlcXVlc3RWYWxpZGF0b3IgaW5zdGFuY2VvZiBSZWFjaGFibGVDb21taXRUaXBSZXF1ZXN0VmFsaWRhdG9yIHx8CisJCQkJcmVxdWVzdFZhbGlkYXRvciBpbnN0YW5jZW9mIEFueVJlcXVlc3RWYWxpZGF0b3IpIHsKKwkJCWFkdmVydGlzZWQgPSBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOworCQl9IGVsc2UgeworCQkJYWR2ZXJ0aXNlZCA9IHJlZklkU2V0KGdldEFkdmVydGlzZWRPckRlZmF1bHRSZWZzKCkudmFsdWVzKCkpOworCQl9CisKKwkJU3RyaW5nIGxpbmU7CisJCUxpc3Q8T2JqZWN0SWQ+IHBlZXJIYXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJYm9vbGVhbiBkb25lUmVjZWl2ZWQgPSBmYWxzZTsKKworCQkvLyBDdXJyZW50bHksIHdlIGRvIG5vdCBzdXBwb3J0IGFueSBjYXBhYmlsaXRpZXMsIHNvIHRoZSBuZXh0CisJCS8vIGxpbmUgaXMgREVMSU0uCisJCWlmICgobGluZSA9IHBja0luLnJlYWRTdHJpbmcoKSkgIT0gUGFja2V0TGluZUluLkRFTElNKSB7CisJCQl0aHJvdyBuZXcgUGFja1Byb3RvY29sRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQKKwkJCQkJLmZvcm1hdChKR2l0VGV4dC5nZXQoKS51bmV4cGVjdGVkUGFja2V0TGluZSwgbGluZSkpOworCQl9CisKKwkJYm9vbGVhbiBpbmNsdWRlVGFnID0gZmFsc2U7CisJCWJvb2xlYW4gZmlsdGVyUmVjZWl2ZWQgPSBmYWxzZTsKKwkJd2hpbGUgKChsaW5lID0gcGNrSW4ucmVhZFN0cmluZygpKSAhPSBQYWNrZXRMaW5lSW4uRU5EKSB7CisJCQlpZiAobGluZS5zdGFydHNXaXRoKCJ3YW50ICIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQl3YW50SWRzLmFkZChPYmplY3RJZC5mcm9tU3RyaW5nKGxpbmUuc3Vic3RyaW5nKDUpKSk7CisJCQl9IGVsc2UgaWYgKGxpbmUuc3RhcnRzV2l0aCgiaGF2ZSAiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJcGVlckhhcy5hZGQoT2JqZWN0SWQuZnJvbVN0cmluZyhsaW5lLnN1YnN0cmluZyg1KSkpOworCQkJfSBlbHNlIGlmIChsaW5lLmVxdWFscygiZG9uZSIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlkb25lUmVjZWl2ZWQgPSB0cnVlOworCQkJfSBlbHNlIGlmIChsaW5lLmVxdWFscyhPUFRJT05fVEhJTl9QQUNLKSkgeworCQkJCW9wdGlvbnMuYWRkKE9QVElPTl9USElOX1BBQ0spOworCQkJfSBlbHNlIGlmIChsaW5lLmVxdWFscyhPUFRJT05fTk9fUFJPR1JFU1MpKSB7CisJCQkJb3B0aW9ucy5hZGQoT1BUSU9OX05PX1BST0dSRVNTKTsKKwkJCX0gZWxzZSBpZiAobGluZS5lcXVhbHMoT1BUSU9OX0lOQ0xVREVfVEFHKSkgeworCQkJCW9wdGlvbnMuYWRkKE9QVElPTl9JTkNMVURFX1RBRyk7CisJCQkJaW5jbHVkZVRhZyA9IHRydWU7CisJCQl9IGVsc2UgaWYgKGxpbmUuZXF1YWxzKE9QVElPTl9PRlNfREVMVEEpKSB7CisJCQkJb3B0aW9ucy5hZGQoT1BUSU9OX09GU19ERUxUQSk7CisJCQl9IGVsc2UgaWYgKGxpbmUuc3RhcnRzV2l0aCgic2hhbGxvdyAiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJY2xpZW50U2hhbGxvd0NvbW1pdHMuYWRkKE9iamVjdElkLmZyb21TdHJpbmcobGluZS5zdWJzdHJpbmcoOCkpKTsKKwkJCX0gZWxzZSBpZiAobGluZS5zdGFydHNXaXRoKCJkZWVwZW4gIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCWRlcHRoID0gSW50ZWdlci5wYXJzZUludChsaW5lLnN1YnN0cmluZyg3KSk7CisJCQkJaWYgKGRlcHRoIDw9IDApIHsKKwkJCQkJdGhyb3cgbmV3IFBhY2tQcm90b2NvbEV4Y2VwdGlvbigKKwkJCQkJCQlNZXNzYWdlRm9ybWF0LmZvcm1hdChKR2l0VGV4dC5nZXQoKS5pbnZhbGlkRGVwdGgsCisJCQkJCQkJCQlJbnRlZ2VyLnZhbHVlT2YoZGVwdGgpKSk7CisJCQkJfQorCQkJCWlmIChzaGFsbG93U2luY2UgIT0gMCkgeworCQkJCQl0aHJvdyBuZXcgUGFja1Byb3RvY29sRXhjZXB0aW9uKAorCQkJCQkJCUpHaXRUZXh0LmdldCgpLmRlZXBlblNpbmNlV2l0aERlZXBlbik7CisJCQkJfQorCQkJCWlmIChzaGFsbG93RXhjbHVkZVJlZnMgIT0gbnVsbCkgeworCQkJCQl0aHJvdyBuZXcgUGFja1Byb3RvY29sRXhjZXB0aW9uKAorCQkJCQkJCUpHaXRUZXh0LmdldCgpLmRlZXBlbk5vdFdpdGhEZWVwZW4pOworCQkJCX0KKwkJCX0gZWxzZSBpZiAobGluZS5zdGFydHNXaXRoKCJkZWVwZW4tbm90ICIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlMaXN0PFN0cmluZz4gZXhjbHVkZSA9IHNoYWxsb3dFeGNsdWRlUmVmczsKKwkJCQlpZiAoZXhjbHVkZSA9PSBudWxsKSB7CisJCQkJCWV4Y2x1ZGUgPSBzaGFsbG93RXhjbHVkZVJlZnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJCQl9CisJCQkJZXhjbHVkZS5hZGQobGluZS5zdWJzdHJpbmcoMTEpKTsKKwkJCQlpZiAoZGVwdGggIT0gMCkgeworCQkJCQl0aHJvdyBuZXcgUGFja1Byb3RvY29sRXhjZXB0aW9uKAorCQkJCQkJCUpHaXRUZXh0LmdldCgpLmRlZXBlbk5vdFdpdGhEZWVwZW4pOworCQkJCX0KKwkJCX0gZWxzZSBpZiAobGluZS5lcXVhbHMoT1BUSU9OX0RFRVBFTl9SRUxBVElWRSkpIHsKKwkJCQlvcHRpb25zLmFkZChPUFRJT05fREVFUEVOX1JFTEFUSVZFKTsKKwkJCX0gZWxzZSBpZiAobGluZS5zdGFydHNXaXRoKCJkZWVwZW4tc2luY2UgIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCXNoYWxsb3dTaW5jZSA9IEludGVnZXIucGFyc2VJbnQobGluZS5zdWJzdHJpbmcoMTMpKTsKKwkJCQlpZiAoc2hhbGxvd1NpbmNlIDw9IDApIHsKKwkJCQkJdGhyb3cgbmV3IFBhY2tQcm90b2NvbEV4Y2VwdGlvbigKKwkJCQkJCQlNZXNzYWdlRm9ybWF0LmZvcm1hdCgKKwkJCQkJCQkJCUpHaXRUZXh0LmdldCgpLmludmFsaWRUaW1lc3RhbXAsIGxpbmUpKTsKKwkJCQl9CisJCQkJaWYgKGRlcHRoICE9ICAwKSB7CisJCQkJCXRocm93IG5ldyBQYWNrUHJvdG9jb2xFeGNlcHRpb24oCisJCQkJCQkJSkdpdFRleHQuZ2V0KCkuZGVlcGVuU2luY2VXaXRoRGVlcGVuKTsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKHRyYW5zZmVyQ29uZmlnLmlzQWxsb3dGaWx0ZXIoKQorCQkJCQkmJiBsaW5lLnN0YXJ0c1dpdGgoT1BUSU9OX0ZJTFRFUiArICcgJykpIHsKKwkJCQlpZiAoZmlsdGVyUmVjZWl2ZWQpIHsKKwkJCQkJdGhyb3cgbmV3IFBhY2tQcm90b2NvbEV4Y2VwdGlvbihKR2l0VGV4dC5nZXQoKS50b29NYW55RmlsdGVycyk7CisJCQkJfQorCQkJCWZpbHRlclJlY2VpdmVkID0gdHJ1ZTsKKwkJCQlwYXJzZUZpbHRlcihsaW5lLnN1YnN0cmluZyhPUFRJT05fRklMVEVSLmxlbmd0aCgpICsgMSkpOworCQkJfSBlbHNlIHsKKwkJCQl0aHJvdyBuZXcgUGFja1Byb3RvY29sRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQKKwkJCQkJCS5mb3JtYXQoSkdpdFRleHQuZ2V0KCkudW5leHBlY3RlZFBhY2tldExpbmUsIGxpbmUpKTsKKwkJCX0KKwkJfQorCQlyYXdPdXQuc3RvcEJ1ZmZlcmluZygpOworCisJCWJvb2xlYW4gc2VjdGlvblNlbnQgPSBmYWxzZTsKKwkJQE51bGxhYmxlIExpc3Q8T2JqZWN0SWQ+IHNoYWxsb3dDb21taXRzID0gbnVsbDsKKwkJTGlzdDxPYmplY3RJZD4gdW5zaGFsbG93Q29tbWl0cyA9IG5ldyBBcnJheUxpc3Q8PigpOworCisJCWlmICghY2xpZW50U2hhbGxvd0NvbW1pdHMuaXNFbXB0eSgpKSB7CisJCQl2ZXJpZnlDbGllbnRTaGFsbG93KCk7CisJCX0KKwkJaWYgKGRlcHRoICE9IDAgfHwgc2hhbGxvd1NpbmNlICE9IDAgfHwgc2hhbGxvd0V4Y2x1ZGVSZWZzICE9IG51bGwpIHsKKwkJCXNoYWxsb3dDb21taXRzID0gbmV3IEFycmF5TGlzdDxPYmplY3RJZD4oKTsKKwkJCXByb2Nlc3NTaGFsbG93KHNoYWxsb3dDb21taXRzLCB1bnNoYWxsb3dDb21taXRzLCBmYWxzZSk7CisJCX0KKwkJaWYgKCFjbGllbnRTaGFsbG93Q29tbWl0cy5pc0VtcHR5KCkpCisJCQl3YWxrLmFzc3VtZVNoYWxsb3coY2xpZW50U2hhbGxvd0NvbW1pdHMpOworCisJCWlmIChkb25lUmVjZWl2ZWQpIHsKKwkJCXByb2Nlc3NIYXZlTGluZXMocGVlckhhcywgT2JqZWN0SWQuemVyb0lkKCksIG5ldyBQYWNrZXRMaW5lT3V0KE51bGxPdXRwdXRTdHJlYW0uSU5TVEFOQ0UpKTsKKwkJfSBlbHNlIHsKKwkJCXBja091dC53cml0ZVN0cmluZygiYWNrbm93bGVkZ21lbnRzXG4iKTsgLy8kTk9OLU5MUy0xJAorCQkJZm9yIChPYmplY3RJZCBpZCA6IHBlZXJIYXMpIHsKKwkJCQlpZiAod2Fsay5nZXRPYmplY3RSZWFkZXIoKS5oYXMoaWQpKSB7CisJCQkJCXBja091dC53cml0ZVN0cmluZygiQUNLICIgKyBpZC5nZXROYW1lKCkgKyAiXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJfQorCQkJfQorCQkJcHJvY2Vzc0hhdmVMaW5lcyhwZWVySGFzLCBPYmplY3RJZC56ZXJvSWQoKSwgbmV3IFBhY2tldExpbmVPdXQoTnVsbE91dHB1dFN0cmVhbS5JTlNUQU5DRSkpOworCQkJaWYgKG9rVG9HaXZlVXAoKSkgeworCQkJCXBja091dC53cml0ZVN0cmluZygicmVhZHlcbiIpOyAvLyROT04tTkxTLTEkCisJCQl9IGVsc2UgaWYgKGNvbW1vbkJhc2UuaXNFbXB0eSgpKSB7CisJCQkJcGNrT3V0LndyaXRlU3RyaW5nKCJOQUtcbiIpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCQlzZWN0aW9uU2VudCA9IHRydWU7CisJCX0KKworCQlpZiAoZG9uZVJlY2VpdmVkIHx8IG9rVG9HaXZlVXAoKSkgeworCQkJaWYgKHNoYWxsb3dDb21taXRzICE9IG51bGwpIHsKKwkJCQlpZiAoc2VjdGlvblNlbnQpCisJCQkJCXBja091dC53cml0ZURlbGltKCk7CisJCQkJcGNrT3V0LndyaXRlU3RyaW5nKCJzaGFsbG93LWluZm9cbiIpOyAvLyROT04tTkxTLTEkCisJCQkJZm9yIChPYmplY3RJZCBvIDogc2hhbGxvd0NvbW1pdHMpIHsKKwkJCQkJcGNrT3V0LndyaXRlU3RyaW5nKCJzaGFsbG93ICIgKyBvLmdldE5hbWUoKSArICdcbicpOyAvLyROT04tTkxTLTEkCisJCQkJfQorCQkJCWZvciAoT2JqZWN0SWQgbyA6IHVuc2hhbGxvd0NvbW1pdHMpIHsKKwkJCQkJcGNrT3V0LndyaXRlU3RyaW5nKCJ1bnNoYWxsb3cgIiArIG8uZ2V0TmFtZSgpICsgJ1xuJyk7IC8vJE5PTi1OTFMtMSQKKwkJCQl9CisJCQkJc2VjdGlvblNlbnQgPSB0cnVlOworCQkJfQorCisJCQlpZiAoc2VjdGlvblNlbnQpCisJCQkJcGNrT3V0LndyaXRlRGVsaW0oKTsKKwkJCXBja091dC53cml0ZVN0cmluZygicGFja2ZpbGVcbiIpOyAvLyROT04tTkxTLTEkCisJCQlzZW5kUGFjayhuZXcgUGFja1N0YXRpc3RpY3MuQWNjdW11bGF0b3IoKSwKKwkJCQkJaW5jbHVkZVRhZworCQkJCQkJPyBkYi5nZXRSZWZEYXRhYmFzZSgpLmdldFJlZnNCeVByZWZpeChSX1RBR1MpCisJCQkJCQk6IG51bGwsCisJCQkJCXVuc2hhbGxvd0NvbW1pdHMpOworCQl9CisJCXBja091dC5lbmQoKTsKKwl9CisKKwkvKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIHRoZSBsYXN0IGNvbW1hbmQgYW5kIHdlIHNob3VsZCB0ZWFyIGRvd24gdGhlCisJICogY29ubmVjdGlvbi4KKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gc2VydmVPbmVDb21tYW5kVjIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlTdHJpbmcgY29tbWFuZDsKKwkJdHJ5IHsKKwkJCWNvbW1hbmQgPSBwY2tJbi5yZWFkU3RyaW5nKCk7CisJCX0gY2F0Y2ggKEVPRkV4Y2VwdGlvbiBlb2YpIHsKKwkJCS8qIEVPRiB3aGVuIGF3YWl0aW5nIGNvbW1hbmQgaXMgZmluZSAqLworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJaWYgKGNvbW1hbmQgPT0gUGFja2V0TGluZUluLkVORCkgeworCQkJLy8gQSBibGFuayByZXF1ZXN0IGlzIHZhbGlkIGFjY29yZGluZworCQkJLy8gdG8gdGhlIHByb3RvY29sOyBkbyBub3RoaW5nIGluIHRoaXMKKwkJCS8vIGNhc2UuCisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlpZiAoY29tbWFuZC5lcXVhbHMoImNvbW1hbmQ9IiArIENPTU1BTkRfTFNfUkVGUykpIHsgLy8kTk9OLU5MUy0xJAorCQkJbHNSZWZzVjIoKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlpZiAoY29tbWFuZC5lcXVhbHMoImNvbW1hbmQ9IiArIENPTU1BTkRfRkVUQ0gpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCWZldGNoVjIoKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQl0aHJvdyBuZXcgUGFja1Byb3RvY29sRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQKKwkJCQkuZm9ybWF0KEpHaXRUZXh0LmdldCgpLnVua25vd25UcmFuc3BvcnRDb21tYW5kLCBjb21tYW5kKSk7CisJfQorCisJcHJpdmF0ZSBMaXN0PFN0cmluZz4gZ2V0VjJDYXBhYmlsaXR5QWR2ZXJ0aXNlbWVudCgpIHsKKwkJQXJyYXlMaXN0PFN0cmluZz4gY2FwcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQljYXBzLmFkZCgidmVyc2lvbiAyIik7IC8vJE5PTi1OTFMtMSQKKwkJY2Fwcy5hZGQoQ09NTUFORF9MU19SRUZTKTsKKwkJY2Fwcy5hZGQoCisJCQkJQ09NTUFORF9GRVRDSCArICc9JyArCisJCQkJKHRyYW5zZmVyQ29uZmlnLmlzQWxsb3dGaWx0ZXIoKSA/IE9QVElPTl9GSUxURVIgKyAnICcgOiAiIikgKyAvLyROT04tTkxTLTEkCisJCQkJT1BUSU9OX1NIQUxMT1cpOworCQlyZXR1cm4gY2FwczsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2VydmljZVYyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJaWYgKGJpRGlyZWN0aW9uYWxQaXBlKSB7CisJCQkvLyBKdXN0IGxpa2UgaW4gc2VydmljZSgpLCB0aGUgY2FwYWJpbGl0eSBhZHZlcnRpc2VtZW50CisJCQkvLyBpcyBzZW50IG9ubHkgaWYgdGhpcyBpcyBhIGJpZGlyZWN0aW9uYWwgcGlwZS4gKElmCisJCQkvLyBub3QsIHRoZSBjbGllbnQgaXMgZXhwZWN0ZWQgdG8gY2FsbAorCQkJLy8gc2VuZEFkdmVydGlzZWRSZWZzKCkgb24gaXRzIG93bi4pCisJCQlmb3IgKFN0cmluZyBzIDogZ2V0VjJDYXBhYmlsaXR5QWR2ZXJ0aXNlbWVudCgpKSB7CisJCQkJcGNrT3V0LndyaXRlU3RyaW5nKHMgKyAiXG4iKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQkJcGNrT3V0LmVuZCgpOworCisJCQl3aGlsZSAoIXNlcnZlT25lQ29tbWFuZFYyKCkpIHsKKwkJCQkvLyBSZXBlYXQgdW50aWwgYW4gZW1wdHkgY29tbWFuZCBvciBFT0YuCisJCQl9CisJCQlyZXR1cm47CisJCX0KKworCQl0cnkgeworCQkJc2VydmVPbmVDb21tYW5kVjIoKTsKKwkJfSBmaW5hbGx5IHsKKwkJCXdoaWxlICgwIDwgcmF3SW4uc2tpcCgyMDQ4KSB8fCAwIDw9IHJhd0luLnJlYWQoKSkgeworCQkJCS8vIERpc2NhcmQgdW50aWwgRU9GLgorCQkJfQorCQkJcmF3T3V0LnN0b3BCdWZmZXJpbmcoKTsKKwkJfQogCX0KIAogCXByaXZhdGUgc3RhdGljIFNldDxPYmplY3RJZD4gcmVmSWRTZXQoQ29sbGVjdGlvbjxSZWY+IHJlZnMpIHsKQEAgLTg3OSw3ICsxMjEwLDIzIEBAIHByaXZhdGUgc3RhdGljIFNldDxPYmplY3RJZD4gcmVmSWRTZXQoQ29sbGVjdGlvbjxSZWY+IHJlZnMpIHsKIAkJcmV0dXJuIGlkczsKIAl9CiAKLQlwcml2YXRlIHZvaWQgcHJvY2Vzc1NoYWxsb3coKSB0aHJvd3MgSU9FeGNlcHRpb24geworCS8qCisJICogRGV0ZXJtaW5lcyB3aGF0ICJzaGFsbG93IiBhbmQgInVuc2hhbGxvdyIgbGluZXMgdG8gc2VuZCB0byB0aGUgdXNlci4KKwkgKiBUaGUgaW5mb3JtYXRpb24gaXMgd3JpdHRlbiB0byBzaGFsbG93Q29tbWl0cyAoaWYgbm90IG51bGwpIGFuZAorCSAqIHVuc2hhbGxvd0NvbW1pdHMsIGFuZCBhbHNvIHdyaXR0ZW4gdG8gI3Bja091dCAoaWYgd3JpdGVUb1Bja091dCBpcworCSAqIHRydWUpLgorCSAqLworCXByaXZhdGUgdm9pZCBwcm9jZXNzU2hhbGxvdyhATnVsbGFibGUgTGlzdDxPYmplY3RJZD4gc2hhbGxvd0NvbW1pdHMsCisJCQlMaXN0PE9iamVjdElkPiB1bnNoYWxsb3dDb21taXRzLAorCQkJYm9vbGVhbiB3cml0ZVRvUGNrT3V0KSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlpZiAob3B0aW9ucy5jb250YWlucyhPUFRJT05fREVFUEVOX1JFTEFUSVZFKSB8fAorCQkJCXNoYWxsb3dTaW5jZSAhPSAwIHx8CisJCQkJc2hhbGxvd0V4Y2x1ZGVSZWZzICE9IG51bGwpIHsKKwkJCS8vIFRPRE8oam9uYXRoYW50YW5teSk6IEltcGxlbWVudCBkZWVwZW4tcmVsYXRpdmUsIGRlZXBlbi1zaW5jZSwKKwkJCS8vIGFuZCBkZWVwZW4tbm90LgorCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJCX0KKwogCQlpbnQgd2Fsa0RlcHRoID0gZGVwdGggLSAxOwogCQl0cnkgKERlcHRoV2Fsay5SZXZXYWxrIGRlcHRoV2FsayA9IG5ldyBEZXB0aFdhbGsuUmV2V2FsaygKIAkJCQl3YWxrLmdldE9iamVjdFJlYWRlcigpLCB3YWxrRGVwdGgpKSB7CkBAIC05MDAsMTkgKzEyNDcsMjkgQEAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NTaGFsbG93KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCQkvLyBDb21taXRzIGF0IHRoZSBib3VuZGFyeSB3aGljaCBhcmVuJ3QgYWxyZWFkeSBzaGFsbG93IGluCiAJCQkJLy8gdGhlIGNsaWVudCBuZWVkIHRvIGJlIG1hcmtlZCBhcyBzdWNoCiAJCQkJaWYgKGMuZ2V0RGVwdGgoKSA9PSB3YWxrRGVwdGgKLQkJCQkJCSYmICFjbGllbnRTaGFsbG93Q29tbWl0cy5jb250YWlucyhjKSkKLQkJCQkJcGNrT3V0LndyaXRlU3RyaW5nKCJzaGFsbG93ICIgKyBvLm5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCSYmICFjbGllbnRTaGFsbG93Q29tbWl0cy5jb250YWlucyhjKSkgeworCQkJCQlpZiAoc2hhbGxvd0NvbW1pdHMgIT0gbnVsbCkgeworCQkJCQkJc2hhbGxvd0NvbW1pdHMuYWRkKGMuY29weSgpKTsKKwkJCQkJfQorCQkJCQlpZiAod3JpdGVUb1Bja091dCkgeworCQkJCQkJcGNrT3V0LndyaXRlU3RyaW5nKCJzaGFsbG93ICIgKyBvLm5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJfQorCQkJCX0KIAogCQkJCS8vIENvbW1pdHMgbm90IG9uIHRoZSBib3VuZGFyeSB3aGljaCBhcmUgc2hhbGxvdyBpbiB0aGUgY2xpZW50CiAJCQkJLy8gbmVlZCB0byBiZWNvbWUgdW5zaGFsbG93ZWQKIAkJCQlpZiAoYy5nZXREZXB0aCgpIDwgd2Fsa0RlcHRoCiAJCQkJCQkmJiBjbGllbnRTaGFsbG93Q29tbWl0cy5yZW1vdmUoYykpIHsKIAkJCQkJdW5zaGFsbG93Q29tbWl0cy5hZGQoYy5jb3B5KCkpOwotCQkJCQlwY2tPdXQud3JpdGVTdHJpbmcoInVuc2hhbGxvdyAiICsgYy5uYW1lKCkpOyAvLyROT04tTkxTLTEkCisJCQkJCWlmICh3cml0ZVRvUGNrT3V0KSB7CisJCQkJCQlwY2tPdXQud3JpdGVTdHJpbmcoInVuc2hhbGxvdyAiICsgYy5uYW1lKCkpOyAvLyROT04tTkxTLTEkCisJCQkJCX0KIAkJCQl9CiAJCQl9CiAJCX0KLQkJcGNrT3V0LmVuZCgpOworCQlpZiAod3JpdGVUb1Bja091dCkgeworCQkJcGNrT3V0LmVuZCgpOworCQl9CiAJfQogCiAJcHJpdmF0ZSB2b2lkIHZlcmlmeUNsaWVudFNoYWxsb3coKQpAQCAtOTUwLDE0ICsxMzA3LDUwIEBAIHByaXZhdGUgdm9pZCB2ZXJpZnlDbGllbnRTaGFsbG93KCkKIAkgKiBAcGFyYW0gYWR2CiAJICogICAgICAgICAgICB0aGUgYWR2ZXJ0aXNlbWVudCBmb3JtYXR0ZXIuCiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgdGhlIGZvcm1hdHRlciBmYWlsZWQgdG8gd3JpdGUgYW4gYWR2ZXJ0aXNlbWVudC4KKwkgKiAgICAgICAgICAgIHRoZSBmb3JtYXR0ZXIgZmFpbGVkIHRvIHdyaXRlIGFuIGFkdmVydGlzZW1lbnQuCiAJICogQHRocm93cyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5TZXJ2aWNlTWF5Tm90Q29udGludWVFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICB0aGUgaG9vayBkZW5pZWQgYWR2ZXJ0aXNlbWVudC4KKwkgKiAgICAgICAgICAgIHRoZSBob29rIGRlbmllZCBhZHZlcnRpc2VtZW50LgogCSAqLwotCXB1YmxpYyB2b2lkIHNlbmRBZHZlcnRpc2VkUmVmcyhmaW5hbCBSZWZBZHZlcnRpc2VyIGFkdikgdGhyb3dzIElPRXhjZXB0aW9uLAorCXB1YmxpYyB2b2lkIHNlbmRBZHZlcnRpc2VkUmVmcyhSZWZBZHZlcnRpc2VyIGFkdikgdGhyb3dzIElPRXhjZXB0aW9uLAogCQkJU2VydmljZU1heU5vdENvbnRpbnVlRXhjZXB0aW9uIHsKKwkJc2VuZEFkdmVydGlzZWRSZWZzKGFkdiwgbnVsbCk7CisJfQorCisJLyoqCisJICogR2VuZXJhdGUgYW4gYWR2ZXJ0aXNlbWVudCBvZiBhdmFpbGFibGUgcmVmcyBhbmQgY2FwYWJpbGl0aWVzLgorCSAqCisJICogQHBhcmFtIGFkdgorCSAqICAgICAgICAgICAgdGhlIGFkdmVydGlzZW1lbnQgZm9ybWF0dGVyLgorCSAqIEBwYXJhbSBzZXJ2aWNlTmFtZQorCSAqICAgICAgICAgICAgaWYgbm90IG51bGwsIGFsc28gb3V0cHV0ICIjIHNlcnZpY2U9c2VydmljZU5hbWUiIGZvbGxvd2VkIGJ5IGEKKwkgKiAgICAgICAgICAgIGZsdXNoIHBhY2tldCBiZWZvcmUgdGhlIGFkdmVydGlzZW1lbnQuIFRoaXMgaXMgcmVxdWlyZWQKKwkgKiAgICAgICAgICAgIGluIHYwIG9mIHRoZSBIVFRQIHByb3RvY29sLCBkZXNjcmliZWQgaW4gR2l0J3MKKwkgKiAgICAgICAgICAgIERvY3VtZW50YXRpb24vdGVjaG5pY2FsL2h0dHAtcHJvdG9jb2wudHh0LgorCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgorCSAqICAgICAgICAgICAgdGhlIGZvcm1hdHRlciBmYWlsZWQgdG8gd3JpdGUgYW4gYWR2ZXJ0aXNlbWVudC4KKwkgKiBAdGhyb3dzIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlNlcnZpY2VNYXlOb3RDb250aW51ZUV4Y2VwdGlvbgorCSAqICAgICAgICAgICAgdGhlIGhvb2sgZGVuaWVkIGFkdmVydGlzZW1lbnQuCisJICogQHNpbmNlIDUuMAorCSAqLworCXB1YmxpYyB2b2lkIHNlbmRBZHZlcnRpc2VkUmVmcyhSZWZBZHZlcnRpc2VyIGFkdiwKKwkJCUBOdWxsYWJsZSBTdHJpbmcgc2VydmljZU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiwKKwkJCVNlcnZpY2VNYXlOb3RDb250aW51ZUV4Y2VwdGlvbiB7CisJCWlmICh1c2VQcm90b2NvbFYyKCkpIHsKKwkJCS8vIFRoZSBlcXVpdmFsZW50IGluIHYyIGlzIG9ubHkgdGhlIGNhcGFiaWxpdGllcworCQkJLy8gYWR2ZXJ0aXNlbWVudC4KKwkJCWZvciAoU3RyaW5nIHMgOiBnZXRWMkNhcGFiaWxpdHlBZHZlcnRpc2VtZW50KCkpIHsKKwkJCQlhZHYud3JpdGVPbmUocyk7CisJCQl9CisJCQlhZHYuZW5kKCk7CisJCQlyZXR1cm47CisJCX0KKwogCQlNYXA8U3RyaW5nLCBSZWY+IGFkdmVydGlzZWRPckRlZmF1bHRSZWZzID0gZ2V0QWR2ZXJ0aXNlZE9yRGVmYXVsdFJlZnMoKTsKIAorCQlpZiAoc2VydmljZU5hbWUgIT0gbnVsbCkgeworCQkJYWR2LndyaXRlT25lKCIjIHNlcnZpY2U9IiArIHNlcnZpY2VOYW1lICsgJ1xuJyk7IC8vJE5PTi1OTFMtMSQKKwkJCWFkdi5lbmQoKTsKKwkJfQogCQlhZHYuaW5pdChkYik7CiAJCWFkdi5hZHZlcnRpc2VDYXBhYmlsaXR5KE9QVElPTl9JTkNMVURFX1RBRyk7CiAJCWFkdi5hZHZlcnRpc2VDYXBhYmlsaXR5KE9QVElPTl9NVUxUSV9BQ0tfREVUQUlMRUQpOwpAQCAtOTgwLDYgKzEzNzMsOSBAQCBwdWJsaWMgdm9pZCBzZW5kQWR2ZXJ0aXNlZFJlZnMoZmluYWwgUmVmQWR2ZXJ0aXNlciBhZHYpIHRocm93cyBJT0V4Y2VwdGlvbiwKIAkJCQl8fCBwb2xpY3kgPT0gbnVsbCkKIAkJCWFkdi5hZHZlcnRpc2VDYXBhYmlsaXR5KE9QVElPTl9BTExPV19SRUFDSEFCTEVfU0hBMV9JTl9XQU5UKTsKIAkJYWR2LmFkdmVydGlzZUNhcGFiaWxpdHkoT1BUSU9OX0FHRU5ULCBVc2VyQWdlbnQuZ2V0KCkpOworCQlpZiAodHJhbnNmZXJDb25maWcuaXNBbGxvd0ZpbHRlcigpKSB7CisJCQlhZHYuYWR2ZXJ0aXNlQ2FwYWJpbGl0eShPUFRJT05fRklMVEVSKTsKKwkJfQogCQlhZHYuc2V0RGVyZWZUYWdzKHRydWUpOwogCQlmaW5kU3ltcmVmcyhhZHYsIGFkdmVydGlzZWRPckRlZmF1bHRSZWZzKTsKIAkJYWR2ZXJ0aXNlZCA9IGFkdi5zZW5kKGFkdmVydGlzZWRPckRlZmF1bHRSZWZzKTsKQEAgLTEwMTcsOCArMTQxMywzNiBAQCBwdWJsaWMgT3V0cHV0U3RyZWFtIGdldE1lc3NhZ2VPdXRwdXRTdHJlYW0oKSB7CiAJCXJldHVybiBtc2dPdXQ7CiAJfQogCisJcHJpdmF0ZSB2b2lkIHBhcnNlRmlsdGVyKFN0cmluZyBhcmcpIHRocm93cyBQYWNrUHJvdG9jb2xFeGNlcHRpb24geworCQlpZiAoYXJnLmVxdWFscygiYmxvYjpub25lIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJZmlsdGVyQmxvYkxpbWl0ID0gMDsKKwkJfSBlbHNlIGlmIChhcmcuc3RhcnRzV2l0aCgiYmxvYjpsaW1pdD0iKSkgeyAvLyROT04tTkxTLTEkCisJCQl0cnkgeworCQkJCWZpbHRlckJsb2JMaW1pdCA9IExvbmcucGFyc2VMb25nKAorCQkJCQkJYXJnLnN1YnN0cmluZygiYmxvYjpsaW1pdD0iLmxlbmd0aCgpKSk7IC8vJE5PTi1OTFMtMSQKKwkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisJCQkJdGhyb3cgbmV3IFBhY2tQcm90b2NvbEV4Y2VwdGlvbigKKwkJCQkJCU1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpHaXRUZXh0LmdldCgpLmludmFsaWRGaWx0ZXIsCisJCQkJCQkJCWFyZykpOworCQkJfQorCQl9CisJCS8qCisJCSAqIFdlIG11c3QgaGF2ZSAoMSkgZWl0aGVyICJibG9iOm5vbmUiIG9yCisJCSAqICJibG9iOmxpbWl0PSIgc2V0IChiZWNhdXNlIHdlIG9ubHkgc3VwcG9ydAorCQkgKiBibG9iIHNpemUgbGltaXRzIGZvciBub3cpLCBhbmQgKDIpIGlmIHRoZQorCQkgKiBsYXR0ZXIsIHRoZW4gaXQgbXVzdCBiZSBub25uZWdhdGl2ZS4gVGhyb3cKKwkJICogaWYgKDEpIG9yICgyKSBpcyBub3QgbWV0LgorCQkgKi8KKwkJaWYgKGZpbHRlckJsb2JMaW1pdCA8IDApIHsKKwkJCXRocm93IG5ldyBQYWNrUHJvdG9jb2xFeGNlcHRpb24oCisJCQkJCU1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpHaXRUZXh0LmdldCgpLmludmFsaWRGaWx0ZXIsCisJCQkJCQkJYXJnKSk7CisJCX0KKwl9CisKIAlwcml2YXRlIHZvaWQgcmVjdldhbnRzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJYm9vbGVhbiBpc0ZpcnN0ID0gdHJ1ZTsKKwkJYm9vbGVhbiBmaWx0ZXJSZWNlaXZlZCA9IGZhbHNlOwogCQlmb3IgKDs7KSB7CiAJCQlTdHJpbmcgbGluZTsKIAkJCXRyeSB7CkBAIC0xMDQ3LDYgKzE0NzEsMTkgQEAgcHJpdmF0ZSB2b2lkIHJlY3ZXYW50cygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQkJY29udGludWU7CiAJCQl9CiAKKwkJCWlmICh0cmFuc2ZlckNvbmZpZy5pc0FsbG93RmlsdGVyKCkKKwkJCQkJJiYgbGluZS5zdGFydHNXaXRoKE9QVElPTl9GSUxURVIgKyAiICIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlTdHJpbmcgYXJnID0gbGluZS5zdWJzdHJpbmcoT1BUSU9OX0ZJTFRFUi5sZW5ndGgoKSArIDEpOworCisJCQkJaWYgKGZpbHRlclJlY2VpdmVkKSB7CisJCQkJCXRocm93IG5ldyBQYWNrUHJvdG9jb2xFeGNlcHRpb24oSkdpdFRleHQuZ2V0KCkudG9vTWFueUZpbHRlcnMpOworCQkJCX0KKwkJCQlmaWx0ZXJSZWNlaXZlZCA9IHRydWU7CisKKwkJCQlwYXJzZUZpbHRlcihhcmcpOworCQkJCWNvbnRpbnVlOworCQkJfQorCiAJCQlpZiAoIWxpbmUuc3RhcnRzV2l0aCgid2FudCAiKSB8fCBsaW5lLmxlbmd0aCgpIDwgNDUpIC8vJE5PTi1OTFMtMSQKIAkJCQl0aHJvdyBuZXcgUGFja1Byb3RvY29sRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpHaXRUZXh0LmdldCgpLmV4cGVjdGVkR290LCAid2FudCIsIGxpbmUpKTsgLy8kTk9OLU5MUy0xJAogCkBAIC0xMTE4LDcgKzE1NTUsNyBAQCBwcml2YXRlIGJvb2xlYW4gbmVnb3RpYXRlKFBhY2tTdGF0aXN0aWNzLkFjY3VtdWxhdG9yIGFjY3VtdWxhdG9yKQogCQkJfQogCiAJCQlpZiAobGluZSA9PSBQYWNrZXRMaW5lSW4uRU5EKSB7Ci0JCQkJbGFzdCA9IHByb2Nlc3NIYXZlTGluZXMocGVlckhhcywgbGFzdCk7CisJCQkJbGFzdCA9IHByb2Nlc3NIYXZlTGluZXMocGVlckhhcywgbGFzdCwgcGNrT3V0KTsKIAkJCQlpZiAoY29tbW9uQmFzZS5pc0VtcHR5KCkgfHwgbXVsdGlBY2sgIT0gTXVsdGlBY2suT0ZGKQogCQkJCQlwY2tPdXQud3JpdGVTdHJpbmcoIk5BS1xuIik7IC8vJE5PTi1OTFMtMSQKIAkJCQlpZiAobm9Eb25lICYmIHNlbnRSZWFkeSkgewpAQCAtMTEzMyw3ICsxNTcwLDcgQEAgcHJpdmF0ZSBib29sZWFuIG5lZ290aWF0ZShQYWNrU3RhdGlzdGljcy5BY2N1bXVsYXRvciBhY2N1bXVsYXRvcikKIAkJCQlwZWVySGFzLmFkZChPYmplY3RJZC5mcm9tU3RyaW5nKGxpbmUuc3Vic3RyaW5nKDUpKSk7CiAJCQkJYWNjdW11bGF0b3IuaGF2ZXMrKzsKIAkJCX0gZWxzZSBpZiAobGluZS5lcXVhbHMoImRvbmUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJbGFzdCA9IHByb2Nlc3NIYXZlTGluZXMocGVlckhhcywgbGFzdCk7CisJCQkJbGFzdCA9IHByb2Nlc3NIYXZlTGluZXMocGVlckhhcywgbGFzdCwgcGNrT3V0KTsKIAogCQkJCWlmIChjb21tb25CYXNlLmlzRW1wdHkoKSkKIAkJCQkJcGNrT3V0LndyaXRlU3RyaW5nKCJOQUtcbiIpOyAvLyROT04tTkxTLTEkCkBAIC0xMTQ5LDcgKzE1ODYsNyBAQCBlbHNlIGlmIChtdWx0aUFjayAhPSBNdWx0aUFjay5PRkYpCiAJCX0KIAl9CiAKLQlwcml2YXRlIE9iamVjdElkIHByb2Nlc3NIYXZlTGluZXMoTGlzdDxPYmplY3RJZD4gcGVlckhhcywgT2JqZWN0SWQgbGFzdCkKKwlwcml2YXRlIE9iamVjdElkIHByb2Nlc3NIYXZlTGluZXMoTGlzdDxPYmplY3RJZD4gcGVlckhhcywgT2JqZWN0SWQgbGFzdCwgUGFja2V0TGluZU91dCBvdXQpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlwcmVVcGxvYWRIb29rLm9uQmVnaW5OZWdvdGlhdGVSb3VuZCh0aGlzLCB3YW50SWRzLCBwZWVySGFzLnNpemUoKSk7CiAJCWlmICh3YW50QWxsLmlzRW1wdHkoKSAmJiAhd2FudElkcy5pc0VtcHR5KCkpCkBAIC0xMTk0LDEzICsxNjMxLDEzIEBAIHByaXZhdGUgT2JqZWN0SWQgcHJvY2Vzc0hhdmVMaW5lcyhMaXN0PE9iamVjdElkPiBwZWVySGFzLCBPYmplY3RJZCBsYXN0KQogCQkJCXN3aXRjaCAobXVsdGlBY2spIHsKIAkJCQljYXNlIE9GRjoKIAkJCQkJaWYgKGNvbW1vbkJhc2Uuc2l6ZSgpID09IDEpCi0JCQkJCQlwY2tPdXQud3JpdGVTdHJpbmcoIkFDSyAiICsgb2JqLm5hbWUoKSArICJcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJCW91dC53cml0ZVN0cmluZygiQUNLICIgKyBvYmoubmFtZSgpICsgIlxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkJCQlicmVhazsKIAkJCQljYXNlIENPTlRJTlVFOgotCQkJCQlwY2tPdXQud3JpdGVTdHJpbmcoIkFDSyAiICsgb2JqLm5hbWUoKSArICIgY29udGludWVcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJb3V0LndyaXRlU3RyaW5nKCJBQ0sgIiArIG9iai5uYW1lKCkgKyAiIGNvbnRpbnVlXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgREVUQUlMRUQ6Ci0JCQkJCXBja091dC53cml0ZVN0cmluZygiQUNLICIgKyBvYmoubmFtZSgpICsgIiBjb21tb25cbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJb3V0LndyaXRlU3RyaW5nKCJBQ0sgIiArIG9iai5uYW1lKCkgKyAiIGNvbW1vblxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkJCQlicmVhazsKIAkJCQl9CiAJCQl9CkBAIC0xMjI2LDEwICsxNjYzLDEwIEBAIHByaXZhdGUgT2JqZWN0SWQgcHJvY2Vzc0hhdmVMaW5lcyhMaXN0PE9iamVjdElkPiBwZWVySGFzLCBPYmplY3RJZCBsYXN0KQogCQkJCQkJY2FzZSBPRkY6CiAJCQkJCQkJYnJlYWs7CiAJCQkJCQljYXNlIENPTlRJTlVFOgotCQkJCQkJCXBja091dC53cml0ZVN0cmluZygiQUNLICIgKyBpZC5uYW1lKCkgKyAiIGNvbnRpbnVlXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJCQkJb3V0LndyaXRlU3RyaW5nKCJBQ0sgIiArIGlkLm5hbWUoKSArICIgY29udGludWVcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJCQkJCQlicmVhazsKIAkJCQkJCWNhc2UgREVUQUlMRUQ6Ci0JCQkJCQkJcGNrT3V0LndyaXRlU3RyaW5nKCJBQ0sgIiArIGlkLm5hbWUoKSArICIgcmVhZHlcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJCQlvdXQud3JpdGVTdHJpbmcoIkFDSyAiICsgaWQubmFtZSgpICsgIiByZWFkeVxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkJCQkJCXNlbnRSZWFkeSA9IHRydWU7CiAJCQkJCQkJYnJlYWs7CiAJCQkJCQl9CkBAIC0xMjQxLDcgKzE2NzgsNyBAQCBwcml2YXRlIE9iamVjdElkIHByb2Nlc3NIYXZlTGluZXMoTGlzdDxPYmplY3RJZD4gcGVlckhhcywgT2JqZWN0SWQgbGFzdCkKIAogCQlpZiAobXVsdGlBY2sgPT0gTXVsdGlBY2suREVUQUlMRUQgJiYgIWRpZE9rVG9HaXZlVXAgJiYgb2tUb0dpdmVVcCgpKSB7CiAJCQlPYmplY3RJZCBpZCA9IHBlZXJIYXMuZ2V0KHBlZXJIYXMuc2l6ZSgpIC0gMSk7Ci0JCQlwY2tPdXQud3JpdGVTdHJpbmcoIkFDSyAiICsgaWQubmFtZSgpICsgIiByZWFkeVxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJb3V0LndyaXRlU3RyaW5nKCJBQ0sgIiArIGlkLm5hbWUoKSArICIgcmVhZHlcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJCXNlbnRSZWFkeSA9IHRydWU7CiAJCX0KIApAQCAtMTMzNiw3ICsxNzczLDcgQEAgcHVibGljIHZvaWQgY2hlY2tXYW50cyhVcGxvYWRQYWNrIHVwLCBMaXN0PE9iamVjdElkPiB3YW50cykKIAkJCQluZXcgUmVhY2hhYmxlQ29tbWl0VGlwUmVxdWVzdFZhbGlkYXRvcigpLmNoZWNrV2FudHModXAsIHdhbnRzKTsKIAkJCWVsc2UgaWYgKCF3YW50cy5pc0VtcHR5KCkpIHsKIAkJCQlTZXQ8T2JqZWN0SWQ+IHJlZklkcyA9Ci0JCQkJCXJlZklkU2V0KHVwLmdldFJlcG9zaXRvcnkoKS5nZXRSZWZEYXRhYmFzZSgpLmdldFJlZnMoQUxMKS52YWx1ZXMoKSk7CisJCQkJCQlyZWZJZFNldCh1cC5nZXRSZXBvc2l0b3J5KCkuZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzKCkpOwogCQkJCWZvciAoT2JqZWN0SWQgb2JqIDogd2FudHMpIHsKIAkJCQkJaWYgKCFyZWZJZHMuY29udGFpbnMob2JqKSkKIAkJCQkJCXRocm93IG5ldyBXYW50Tm90VmFsaWRFeGNlcHRpb24ob2JqKTsKQEAgLTEzNTYsNyArMTc5Myw3IEBAIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUmVhY2hhYmxlQ29tbWl0VGlwUmVxdWVzdFZhbGlkYXRvcgogCQlwdWJsaWMgdm9pZCBjaGVja1dhbnRzKFVwbG9hZFBhY2sgdXAsIExpc3Q8T2JqZWN0SWQ+IHdhbnRzKQogCQkJCXRocm93cyBQYWNrUHJvdG9jb2xFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJCWNoZWNrTm90QWR2ZXJ0aXNlZFdhbnRzKHVwLCB3YW50cywKLQkJCQkJcmVmSWRTZXQodXAuZ2V0UmVwb3NpdG9yeSgpLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcyhBTEwpLnZhbHVlcygpKSk7CisJCQkJCXJlZklkU2V0KHVwLmdldFJlcG9zaXRvcnkoKS5nZXRSZWZEYXRhYmFzZSgpLmdldFJlZnMoKSkpOwogCQl9CiAJfQogCkBAIC0xNDM5LDcgKzE4NzYsNyBAQCBwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrTm90QWR2ZXJ0aXNlZFdhbnRzKFVwbG9hZFBhY2sgdXAsCiAJCX0KIAl9CiAKLQlwcml2YXRlIHZvaWQgYWRkQ29tbW9uQmFzZShmaW5hbCBSZXZPYmplY3QgbykgeworCXByaXZhdGUgdm9pZCBhZGRDb21tb25CYXNlKFJldk9iamVjdCBvKSB7CiAJCWlmICghby5oYXMoQ09NTU9OKSkgewogCQkJby5hZGQoQ09NTU9OKTsKIAkJCWNvbW1vbkJhc2UuYWRkKG8pOwpAQCAtMTQ2OCw3ICsxOTA1LDcgQEAgcHJpdmF0ZSBib29sZWFuIG9rVG9HaXZlVXBJbXAoKSB0aHJvd3MgUGFja1Byb3RvY29sRXhjZXB0aW9uIHsKIAkJfQogCX0KIAotCXByaXZhdGUgYm9vbGVhbiB3YW50U2F0aXNmaWVkKGZpbmFsIFJldk9iamVjdCB3YW50KSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByaXZhdGUgYm9vbGVhbiB3YW50U2F0aXNmaWVkKFJldk9iamVjdCB3YW50KSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlpZiAod2FudC5oYXMoU0FUSVNGSUVEKSkKIAkJCXJldHVybiB0cnVlOwogCkBAIC0xNDg5LDEzICsxOTI2LDI5IEBAIHByaXZhdGUgYm9vbGVhbiB3YW50U2F0aXNmaWVkKGZpbmFsIFJldk9iamVjdCB3YW50KSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlyZXR1cm4gZmFsc2U7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHNlbmRQYWNrKFBhY2tTdGF0aXN0aWNzLkFjY3VtdWxhdG9yIGFjY3VtdWxhdG9yKQotCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkvKioKKwkgKiBTZW5kIHRoZSByZXF1ZXN0ZWQgb2JqZWN0cyB0byB0aGUgY2xpZW50LgorCSAqCisJICogQHBhcmFtIGFjY3VtdWxhdG9yCisJICogICAgICAgICAgICAgICAgd2hlcmUgdG8gd3JpdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgY29udGVudCBvZiB0aGUgcGFjay4KKwkgKiBAcGFyYW0gYWxsVGFncworCSAqICAgICAgICAgICAgICAgIHJlZnMgdG8gc2VhcmNoIGZvciBhbm5vdGF0ZWQgdGFncyB0byBpbmNsdWRlIGluIHRoZSBwYWNrCisJICogICAgICAgICAgICAgICAgaWYgdGhlIHtAbGluayAjT1BUSU9OX0lOQ0xVREVfVEFHfSBjYXBhYmlsaXR5IHdhcworCSAqICAgICAgICAgICAgICAgIHJlcXVlc3RlZC4KKwkgKiBAcGFyYW0gdW5zaGFsbG93Q29tbWl0cworCSAqICAgICAgICAgICAgICAgIHNoYWxsb3cgY29tbWl0cyBvbiB0aGUgY2xpZW50IHRoYXQgYXJlIG5vdyBiZWNvbWluZworCSAqICAgICAgICAgICAgICAgIHVuc2hhbGxvdworCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKwkgKiAgICAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cmVkIHdoaWxlIGdlbmVyYXRpbmcgb3Igd3JpdGluZyB0aGUgcGFjay4KKwkgKi8KKwlwcml2YXRlIHZvaWQgc2VuZFBhY2soUGFja1N0YXRpc3RpY3MuQWNjdW11bGF0b3IgYWNjdW11bGF0b3IsCisJCQlATnVsbGFibGUgQ29sbGVjdGlvbjxSZWY+IGFsbFRhZ3MsCisJCQlMaXN0PE9iamVjdElkPiB1bnNoYWxsb3dDb21taXRzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBib29sZWFuIHNpZGViYW5kID0gb3B0aW9ucy5jb250YWlucyhPUFRJT05fU0lERV9CQU5EKQogCQkJCXx8IG9wdGlvbnMuY29udGFpbnMoT1BUSU9OX1NJREVfQkFORF82NEspOwogCQlpZiAoc2lkZWJhbmQpIHsKIAkJCXRyeSB7Ci0JCQkJc2VuZFBhY2sodHJ1ZSwgYWNjdW11bGF0b3IpOworCQkJCXNlbmRQYWNrKHRydWUsIGFjY3VtdWxhdG9yLCBhbGxUYWdzLCB1bnNoYWxsb3dDb21taXRzKTsKIAkJCX0gY2F0Y2ggKFNlcnZpY2VNYXlOb3RDb250aW51ZUV4Y2VwdGlvbiBub1BhY2spIHsKIAkJCQkvLyBUaGlzIHdhcyBhbHJlYWR5IHJlcG9ydGVkIG9uIChiZWxvdykuCiAJCQkJdGhyb3cgbm9QYWNrOwpAQCAtMTUxNiw3ICsxOTY5LDcgQEAgcHJpdmF0ZSB2b2lkIHNlbmRQYWNrKFBhY2tTdGF0aXN0aWNzLkFjY3VtdWxhdG9yIGFjY3VtdWxhdG9yKQogCQkJCQl0aHJvdyBlcnI7CiAJCQl9CiAJCX0gZWxzZSB7Ci0JCQlzZW5kUGFjayhmYWxzZSwgYWNjdW11bGF0b3IpOworCQkJc2VuZFBhY2soZmFsc2UsIGFjY3VtdWxhdG9yLCBhbGxUYWdzLCB1bnNoYWxsb3dDb21taXRzKTsKIAkJfQogCX0KIApAQCAtMTUzNiw5ICsxOTg5LDI4IEBAIHByaXZhdGUgYm9vbGVhbiByZXBvcnRJbnRlcm5hbFNlcnZlckVycm9yT3ZlclNpZGViYW5kKCkgewogCQl9CiAJfQogCi0JQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKKwkvKioKKwkgKiBTZW5kIHRoZSByZXF1ZXN0ZWQgb2JqZWN0cyB0byB0aGUgY2xpZW50LgorCSAqCisJICogQHBhcmFtIHNpZGViYW5kCisJICogICAgICAgICAgICAgICAgd2hldGhlciB0byB3cmFwIHRoZSBwYWNrIGluIHNpZGUtYmFuZCBwa3QtbGluZXMsCisJICogICAgICAgICAgICAgICAgaW50ZXJsZWF2ZWQgd2l0aCBwcm9ncmVzcyBtZXNzYWdlcyBhbmQgZXJyb3JzLgorCSAqIEBwYXJhbSBhY2N1bXVsYXRvcgorCSAqICAgICAgICAgICAgICAgIHdoZXJlIHRvIHdyaXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGNvbnRlbnQgb2YgdGhlIHBhY2suCisJICogQHBhcmFtIGFsbFRhZ3MKKwkgKiAgICAgICAgICAgICAgICByZWZzIHRvIHNlYXJjaCBmb3IgYW5ub3RhdGVkIHRhZ3MgdG8gaW5jbHVkZSBpbiB0aGUgcGFjaworCSAqICAgICAgICAgICAgICAgIGlmIHRoZSB7QGxpbmsgI09QVElPTl9JTkNMVURFX1RBR30gY2FwYWJpbGl0eSB3YXMKKwkgKiAgICAgICAgICAgICAgICByZXF1ZXN0ZWQuCisJICogQHBhcmFtIHVuc2hhbGxvd0NvbW1pdHMKKwkgKiAgICAgICAgICAgICAgICBzaGFsbG93IGNvbW1pdHMgb24gdGhlIGNsaWVudCB0aGF0IGFyZSBub3cgYmVjb21pbmcKKwkgKiAgICAgICAgICAgICAgICB1bnNoYWxsb3cKKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisJICogICAgICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJlZCB3aGlsZSBnZW5lcmF0aW5nIG9yIHdyaXRpbmcgdGhlIHBhY2suCisJICovCiAJcHJpdmF0ZSB2b2lkIHNlbmRQYWNrKGZpbmFsIGJvb2xlYW4gc2lkZWJhbmQsCi0JCQlQYWNrU3RhdGlzdGljcy5BY2N1bXVsYXRvciBhY2N1bXVsYXRvcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJCVBhY2tTdGF0aXN0aWNzLkFjY3VtdWxhdG9yIGFjY3VtdWxhdG9yLAorCQkJQE51bGxhYmxlIENvbGxlY3Rpb248UmVmPiBhbGxUYWdzLAorCQkJTGlzdDxPYmplY3RJZD4gdW5zaGFsbG93Q29tbWl0cykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJUHJvZ3Jlc3NNb25pdG9yIHBtID0gTnVsbFByb2dyZXNzTW9uaXRvci5JTlNUQU5DRTsKIAkJT3V0cHV0U3RyZWFtIHBhY2tPdXQgPSByYXdPdXQ7CiAKQEAgLTE1NzksMTEgKzIwNTEsMTggQEAgcHJpdmF0ZSB2b2lkIHNlbmRQYWNrKGZpbmFsIGJvb2xlYW4gc2lkZWJhbmQsCiAJCVBhY2tDb25maWcgY2ZnID0gcGFja0NvbmZpZzsKIAkJaWYgKGNmZyA9PSBudWxsKQogCQkJY2ZnID0gbmV3IFBhY2tDb25maWcoZGIpOworCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBQYWNrV3JpdGVyIGlzIHJlZmVyZW5jZWQgaW4gdGhlIGZpbmFsbHkKKwkJCQkJCQkJCQkvLyBibG9jaywgYW5kIGlzIGNsb3NlZCB0aGVyZQogCQlmaW5hbCBQYWNrV3JpdGVyIHB3ID0gbmV3IFBhY2tXcml0ZXIoY2ZnLCB3YWxrLmdldE9iamVjdFJlYWRlcigpLAogCQkJCWFjY3VtdWxhdG9yKTsKIAkJdHJ5IHsKIAkJCXB3LnNldEluZGV4RGlzYWJsZWQodHJ1ZSk7Ci0JCQlwdy5zZXRVc2VDYWNoZWRQYWNrcyh0cnVlKTsKKwkJCWlmIChmaWx0ZXJCbG9iTGltaXQgPj0gMCkgeworCQkJCXB3LnNldEZpbHRlckJsb2JMaW1pdChmaWx0ZXJCbG9iTGltaXQpOworCQkJCXB3LnNldFVzZUNhY2hlZFBhY2tzKGZhbHNlKTsKKwkJCX0gZWxzZSB7CisJCQkJcHcuc2V0VXNlQ2FjaGVkUGFja3ModHJ1ZSk7CisJCQl9CiAJCQlwdy5zZXRVc2VCaXRtYXBzKGRlcHRoID09IDAgJiYgY2xpZW50U2hhbGxvd0NvbW1pdHMuaXNFbXB0eSgpKTsKIAkJCXB3LnNldENsaWVudFNoYWxsb3dDb21taXRzKGNsaWVudFNoYWxsb3dDb21taXRzKTsKIAkJCXB3LnNldFJldXNlRGVsdGFDb21taXRzKHRydWUpOwpAQCAtMTU5MSw2ICsyMDcwLDggQEAgcHJpdmF0ZSB2b2lkIHNlbmRQYWNrKGZpbmFsIGJvb2xlYW4gc2lkZWJhbmQsCiAJCQlwdy5zZXRUaGluKG9wdGlvbnMuY29udGFpbnMoT1BUSU9OX1RISU5fUEFDSykpOwogCQkJcHcuc2V0UmV1c2VWYWxpZGF0aW5nT2JqZWN0cyhmYWxzZSk7CiAKKwkJCS8vIE9iamVjdHMgbmFtZWQgZGlyZWN0bHkgYnkgcmVmZXJlbmNlcyBnbyBhdCB0aGUgYmVnaW5uaW5nCisJCQkvLyBvZiB0aGUgcGFjay4KIAkJCWlmIChjb21tb25CYXNlLmlzRW1wdHkoKSAmJiByZWZzICE9IG51bGwpIHsKIAkJCQlTZXQ8T2JqZWN0SWQ+IHRhZ1RhcmdldHMgPSBuZXcgSGFzaFNldDw+KCk7CiAJCQkJZm9yIChSZWYgcmVmIDogcmVmcy52YWx1ZXMoKSkgewpAQCAtMTYyMSw4ICsyMTAyLDggQEAgZWxzZSBpZiAocmVmLmdldE5hbWUoKS5zdGFydHNXaXRoKENvbnN0YW50cy5SX0hFQURTKSkKIAkJCQlydyA9IG93OwogCQkJfQogCi0JCQlpZiAob3B0aW9ucy5jb250YWlucyhPUFRJT05fSU5DTFVERV9UQUcpICYmIHJlZnMgIT0gbnVsbCkgewotCQkJCWZvciAoUmVmIHJlZiA6IHJlZnMudmFsdWVzKCkpIHsKKwkJCWlmIChvcHRpb25zLmNvbnRhaW5zKE9QVElPTl9JTkNMVURFX1RBRykgJiYgYWxsVGFncyAhPSBudWxsKSB7CisJCQkJZm9yIChSZWYgcmVmIDogYWxsVGFncykgewogCQkJCQlPYmplY3RJZCBvYmplY3RJZCA9IHJlZi5nZXRPYmplY3RJZCgpOwogCQkJCQlpZiAob2JqZWN0SWQgPT0gbnVsbCkgewogCQkJCQkJLy8gc2tpcCB1bmJvcm4gYnJhbmNoCkBAIC0xNjQwLDcgKzIxMjEsNyBAQCBlbHNlIGlmIChyZWYuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoQ29uc3RhbnRzLlJfSEVBRFMpKQogCQkJCQl9CiAKIAkJCQkJaWYgKCFyZWYuaXNQZWVsZWQoKSkKLQkJCQkJCXJlZiA9IGRiLnBlZWwocmVmKTsKKwkJCQkJCXJlZiA9IGRiLmdldFJlZkRhdGFiYXNlKCkucGVlbChyZWYpOwogCiAJCQkJCU9iamVjdElkIHBlZWxlZElkID0gcmVmLmdldFBlZWxlZE9iamVjdElkKCk7CiAJCQkJCW9iamVjdElkID0gcmVmLmdldE9iamVjdElkKCk7CkBAIC0xNjY1LDcgKzIxNDYsNiBAQCBlbHNlIGlmIChyZWYuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoQ29uc3RhbnRzLlJfSEVBRFMpKQogCQkJc3RhdGlzdGljcyA9IHB3LmdldFN0YXRpc3RpY3MoKTsKIAkJCWlmIChzdGF0aXN0aWNzICE9IG51bGwpIHsKIAkJCQlwb3N0VXBsb2FkSG9vay5vblBvc3RVcGxvYWQoc3RhdGlzdGljcyk7Ci0JCQkJbG9nZ2VyLm9uUGFja1N0YXRpc3RpY3MobmV3IFBhY2tXcml0ZXIuU3RhdGlzdGljcyhzdGF0aXN0aWNzKSk7CiAJCQl9CiAJCQlwdy5jbG9zZSgpOwogCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9VcGxvYWRQYWNrTG9nZ2VyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9VcGxvYWRQYWNrTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxMTQxOGQuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVXBsb2FkUGFja0xvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSwgR29vZ2xlIEluYy4KLSAqIGFuZCBvdGhlciBjb3B5cmlnaHQgb3duZXJzIGFzIGRvY3VtZW50ZWQgaW4gdGhlIHByb2plY3QncyBJUCBsb2cuCi0gKgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2MS4wIHdoaWNoCi0gKiBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgaXMgcmVwcm9kdWNlZCBiZWxvdywgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwCi0gKgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCi0gKiB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKLSAqIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSAqCi0gKiAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAqICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCi0gKiAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAtIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgSW5jLiBub3IgdGhlCi0gKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gKiAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKLSAqICAgd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORAotICogQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKLSAqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUgotICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgotICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGCi0gKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnBhY2suUGFja1dyaXRlcjsKLQotLyoqCi0gKiBMb2dzIGFjdGl2aXR5IHRoYXQgb2NjdXJyZWQgd2l0aGluCi0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuVXBsb2FkUGFja30uCi0gKiA8cD4KLSAqIEltcGxlbWVudG9ycyBvZiB0aGUgaW50ZXJmYWNlIGFyZSByZXNwb25zaWJsZSBmb3IgYXNzb2NpYXRpbmcgdGhlIGN1cnJlbnQKLSAqIHRocmVhZCB0byBhIHBhcnRpY3VsYXIgY29ubmVjdGlvbiwgaWYgdGhleSBuZWVkIHRvIGFsc28gaW5jbHVkZSBjb25uZWN0aW9uCi0gKiBpbmZvcm1hdGlvbi4gT25lIG1ldGhvZCBpcyB0byB1c2UgYSB7QGxpbmsgamF2YS5sYW5nLlRocmVhZExvY2FsfSB0byByZW1lbWJlcgotICogdGhlIGNvbm5lY3Rpb24gaW5mb3JtYXRpb24gYmVmb3JlIGludm9raW5nIFVwbG9hZFBhY2suCi0gKgotICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5Qb3N0VXBsb2FkSG9va30gaW5zdGVhZAotICovCi1ARGVwcmVjYXRlZAotcHVibGljIGludGVyZmFjZSBVcGxvYWRQYWNrTG9nZ2VyIHsgLy8gVE9ETyByZW1vdmUgaW4gSkdpdCA1LjAKLQkvKiogQSBzaW1wbGUgbm8tb3AgbG9nZ2VyLiAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVXBsb2FkUGFja0xvZ2dlciBOVUxMID0gbmV3IFVwbG9hZFBhY2tMb2dnZXIoKSB7Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBvblBhY2tTdGF0aXN0aWNzKFBhY2tXcml0ZXIuU3RhdGlzdGljcyBzdGF0cykgewotCQkJLy8gRG8gbm90aGluZy4KLQkJfQotCX07Ci0KLQkvKioKLQkgKiBOb3RpY2UgdG8gdGhlIGxvZ2dlciBhZnRlciBhIHBhY2sgaGFzIGJlZW4gc2VudC4KLQkgKgotCSAqIEBwYXJhbSBzdGF0cwotCSAqICAgICAgICAgICAgdGhlIHN0YXRpc3RpY3MgYWZ0ZXIgc2VuZGluZyBhIHBhY2sgdG8gdGhlIGNsaWVudC4KLQkgKiBAc2luY2UgMy4wCi0JICovCi0JcHVibGljIHZvaWQgb25QYWNrU3RhdGlzdGljcyhQYWNrV3JpdGVyLlN0YXRpc3RpY3Mgc3RhdHMpOwotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVXBsb2FkUGFja0xvZ2dlckNoYWluLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9VcGxvYWRQYWNrTG9nZ2VyQ2hhaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWUxNDY3Mi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9VcGxvYWRQYWNrTG9nZ2VyQ2hhaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEsIEdvb2dsZSBJbmMuCi0gKiBhbmQgb3RoZXIgY29weXJpZ2h0IG93bmVycyBhcyBkb2N1bWVudGVkIGluIHRoZSBwcm9qZWN0J3MgSVAgbG9nLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlCi0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgdjEuMCB3aGljaAotICogYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGlzIHJlcHJvZHVjZWQgYmVsb3csIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocAotICoKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgotICogd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCi0gKiBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gKgotICogLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0gKiAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAotICogICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogLSBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIEluYy4gbm9yIHRoZQotICogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQotICogICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCi0gKiAgIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQKLSAqIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCi0gKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IKLSAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKLSAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRgotICogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnBhY2suUGFja1dyaXRlcjsKLQotLyoqCi0gKiBVcGxvYWRQYWNrTG9nZ2VyIHRoYXQgZGVsZWdhdGVzIHRvIGEgbGlzdCBvZiBvdGhlciBsb2dnZXJzLgotICogPHA+Ci0gKiBsb2dnZXJzIGFyZSBydW4gaW4gdGhlIG9yZGVyIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3IuCi0gKgotICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5Qb3N0VXBsb2FkSG9va0NoYWlufQotICogICAgICAgICAgICAgaW5zdGVhZC4KLSAqLwotQERlcHJlY2F0ZWQKLXB1YmxpYyBjbGFzcyBVcGxvYWRQYWNrTG9nZ2VyQ2hhaW4gaW1wbGVtZW50cyBVcGxvYWRQYWNrTG9nZ2VyIHsKLQlwcml2YXRlIGZpbmFsIFVwbG9hZFBhY2tMb2dnZXJbXSBsb2dnZXJzOwotCXByaXZhdGUgZmluYWwgaW50IGNvdW50OwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGxvZ2dlciBjaGFpbmluZyB0aGUgZ2l2ZW4gbG9nZ2VycyB0b2dldGhlci4KLQkgKgotCSAqIEBwYXJhbSBsb2dnZXJzCi0JICogICAgICAgICAgICBsb2dnZXJzIHRvIGV4ZWN1dGUsIGluIG9yZGVyLgotCSAqIEByZXR1cm4gYSBuZXcgbG9nZ2VyIGNoYWluIG9mIHRoZSBnaXZlbiBsb2dnZXJzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVXBsb2FkUGFja0xvZ2dlciBuZXdDaGFpbigKLQkJCUxpc3Q8PyBleHRlbmRzIFVwbG9hZFBhY2tMb2dnZXI+IGxvZ2dlcnMpIHsKLQkJVXBsb2FkUGFja0xvZ2dlcltdIG5ld0xvZ2dlcnMgPSBuZXcgVXBsb2FkUGFja0xvZ2dlcltsb2dnZXJzLnNpemUoKV07Ci0JCWludCBpID0gMDsKLQkJZm9yIChVcGxvYWRQYWNrTG9nZ2VyIGxvZ2dlciA6IGxvZ2dlcnMpCi0JCQlpZiAobG9nZ2VyICE9IFVwbG9hZFBhY2tMb2dnZXIuTlVMTCkKLQkJCQluZXdMb2dnZXJzW2krK10gPSBsb2dnZXI7Ci0JCWlmIChpID09IDApCi0JCQlyZXR1cm4gVXBsb2FkUGFja0xvZ2dlci5OVUxMOwotCQllbHNlIGlmIChpID09IDEpCi0JCQlyZXR1cm4gbmV3TG9nZ2Vyc1swXTsKLQkJZWxzZQotCQkJcmV0dXJuIG5ldyBVcGxvYWRQYWNrTG9nZ2VyQ2hhaW4obmV3TG9nZ2VycywgaSk7Ci0JfQotCi0JLyoqIHtAaW5oZXJpdERvY30gKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBvblBhY2tTdGF0aXN0aWNzKFBhY2tXcml0ZXIuU3RhdGlzdGljcyBzdGF0cykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCi0JCQlsb2dnZXJzW2ldLm9uUGFja1N0YXRpc3RpY3Moc3RhdHMpOwotCX0KLQotCXByaXZhdGUgVXBsb2FkUGFja0xvZ2dlckNoYWluKFVwbG9hZFBhY2tMb2dnZXJbXSBsb2dnZXJzLCBpbnQgY291bnQpIHsKLQkJdGhpcy5sb2dnZXJzID0gbG9nZ2VyczsKLQkJdGhpcy5jb3VudCA9IGNvdW50OwotCX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1dhbGtFbmNyeXB0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9XYWxrRW5jcnlwdGlvbi5qYXZhCmluZGV4IDYxNWU0NmIuLmI0MjQ4ZWUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1dhbGtFbmNyeXB0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvV2Fsa0VuY3J5cHRpb24uamF2YQpAQCAtMTI4LDcgKzEyOCw3IEBAIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlSW1wbChmaW5hbCBIdHRwVVJMQ29ubmVjdGlvbiB1LCBmaW5hbCBTdHJpbmcgcHJlZml4LAogCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpHaXRUZXh0LmdldCgpLnVuc3VwcG9ydGVkRW5jcnlwdGlvbkFsZ29yaXRobSwgdikpOwogCX0KIAotCUlPRXhjZXB0aW9uIGVycm9yKGZpbmFsIFRocm93YWJsZSB3aHkpIHsKKwlJT0V4Y2VwdGlvbiBlcnJvcihUaHJvd2FibGUgd2h5KSB7CiAJCXJldHVybiBuZXcgSU9FeGNlcHRpb24oTWVzc2FnZUZvcm1hdAogCQkJCS5mb3JtYXQoSkdpdFRleHQuZ2V0KCkuZW5jcnlwdGlvbkVycm9yLAogCQkJCXdoeS5nZXRNZXNzYWdlKCkpLCB3aHkpOwpAQCAtMTQxLDcgKzE0MSw3IEBAIHZvaWQgcmVxdWVzdChIdHRwVVJMQ29ubmVjdGlvbiB1LCBTdHJpbmcgcHJlZml4KSB7CiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJdm9pZCB2YWxpZGF0ZShmaW5hbCBIdHRwVVJMQ29ubmVjdGlvbiB1LCBmaW5hbCBTdHJpbmcgcHJlZml4KQorCQl2b2lkIHZhbGlkYXRlKEh0dHBVUkxDb25uZWN0aW9uIHUsIFN0cmluZyBwcmVmaXgpCiAJCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCXZhbGlkYXRlSW1wbCh1LCBwcmVmaXgsICIiLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQl9CkBAIC0yNDAsMTkgKzI0MCwxOSBAQCBzdGF0aWMgY2xhc3MgSmV0UzN0VjIgZXh0ZW5kcyBXYWxrRW5jcnlwdGlvbiB7CiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJdm9pZCByZXF1ZXN0KGZpbmFsIEh0dHBVUkxDb25uZWN0aW9uIHUsIGZpbmFsIFN0cmluZyBwcmVmaXgpIHsKKwkJdm9pZCByZXF1ZXN0KEh0dHBVUkxDb25uZWN0aW9uIHUsIFN0cmluZyBwcmVmaXgpIHsKIAkJCXUuc2V0UmVxdWVzdFByb3BlcnR5KHByZWZpeCArIEpFVFMzVF9DUllQVE9fVkVSLCBDUllQVE9fVkVSKTsKIAkJCXUuc2V0UmVxdWVzdFByb3BlcnR5KHByZWZpeCArIEpFVFMzVF9DUllQVE9fQUxHLCBjcnlwdG9BbGcpOwogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXZvaWQgdmFsaWRhdGUoZmluYWwgSHR0cFVSTENvbm5lY3Rpb24gdSwgZmluYWwgU3RyaW5nIHByZWZpeCkKKwkJdm9pZCB2YWxpZGF0ZShIdHRwVVJMQ29ubmVjdGlvbiB1LCBTdHJpbmcgcHJlZml4KQogCQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQl2YWxpZGF0ZUltcGwodSwgcHJlZml4LCBDUllQVE9fVkVSLCBjcnlwdG9BbGcpOwogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCU91dHB1dFN0cmVhbSBlbmNyeXB0KGZpbmFsIE91dHB1dFN0cmVhbSBvcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJT3V0cHV0U3RyZWFtIGVuY3J5cHQoT3V0cHV0U3RyZWFtIG9zKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJdHJ5IHsKIAkJCQlmaW5hbCBDaXBoZXIgY2lwaGVyID0gSW5zZWN1cmVDaXBoZXJGYWN0b3J5LmNyZWF0ZShjcnlwdG9BbGcpOwogCQkJCWNpcGhlci5pbml0KENpcGhlci5FTkNSWVBUX01PREUsIHNlY3JldEtleSwgcGFyYW1TcGVjKTsKQEAgLTI2Myw3ICsyNjMsNyBAQCBPdXRwdXRTdHJlYW0gZW5jcnlwdChmaW5hbCBPdXRwdXRTdHJlYW0gb3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJSW5wdXRTdHJlYW0gZGVjcnlwdChmaW5hbCBJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJSW5wdXRTdHJlYW0gZGVjcnlwdChJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCXRyeSB7CiAJCQkJZmluYWwgQ2lwaGVyIGNpcGhlciA9IEluc2VjdXJlQ2lwaGVyRmFjdG9yeS5jcmVhdGUoY3J5cHRvQWxnKTsKIAkJCQljaXBoZXIuaW5pdChDaXBoZXIuREVDUllQVF9NT0RFLCBzZWNyZXRLZXksIHBhcmFtU3BlYyk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9XYWxrRmV0Y2hDb25uZWN0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9XYWxrRmV0Y2hDb25uZWN0aW9uLmphdmEKaW5kZXggNjcwODk2NC4uOTMwNzkxNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvV2Fsa0ZldGNoQ29ubmVjdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1dhbGtGZXRjaENvbm5lY3Rpb24uamF2YQpAQCAtNDQsOCArNDQsNiBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0OwogCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZkRhdGFiYXNlLkFMTDsKLQogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CkBAIC01OCw3ICs1Niw2IEBACiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLkNvbXBvdW5kRXhjZXB0aW9uOwpAQCAtMTkwLDcgKzE4Nyw3IEBAIGNsYXNzIFdhbGtGZXRjaENvbm5lY3Rpb24gZXh0ZW5kcyBCYXNlRmV0Y2hDb25uZWN0aW9uIHsKIAkvKiogSW5zZXJ0ZXIgdG8gcmVhZCBvYmplY3RzIGZyb20ge0BsaW5rICNsb2NhbH0uICovCiAJcHJpdmF0ZSBmaW5hbCBPYmplY3RSZWFkZXIgcmVhZGVyOwogCi0JV2Fsa0ZldGNoQ29ubmVjdGlvbihmaW5hbCBXYWxrVHJhbnNwb3J0IHQsIGZpbmFsIFdhbGtSZW1vdGVPYmplY3REYXRhYmFzZSB3KSB7CisJV2Fsa0ZldGNoQ29ubmVjdGlvbihXYWxrVHJhbnNwb3J0IHQsIFdhbGtSZW1vdGVPYmplY3REYXRhYmFzZSB3KSB7CiAJCVRyYW5zcG9ydCB3dCA9IChUcmFuc3BvcnQpdDsKIAkJbG9jYWwgPSB3dC5sb2NhbDsKIAkJb2JqQ2hlY2sgPSB3dC5nZXRPYmplY3RDaGVja2VyKCk7CkBAIC0yNTksNyArMjU2LDcgQEAgcHVibGljIENvbGxlY3Rpb248UGFja0xvY2s+IGdldFBhY2tMb2NrcygpIHsKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0UGFja0xvY2tNZXNzYWdlKGZpbmFsIFN0cmluZyBtZXNzYWdlKSB7CisJcHVibGljIHZvaWQgc2V0UGFja0xvY2tNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7CiAJCWxvY2tNZXNzYWdlID0gbWVzc2FnZTsKIAl9CiAKQEAgLTI2OCwxOCArMjY1LDE4IEBAIHB1YmxpYyB2b2lkIHNldFBhY2tMb2NrTWVzc2FnZShmaW5hbCBTdHJpbmcgbWVzc2FnZSkgewogCXB1YmxpYyB2b2lkIGNsb3NlKCkgewogCQlpbnNlcnRlci5jbG9zZSgpOwogCQlyZWFkZXIuY2xvc2UoKTsKLQkJZm9yIChmaW5hbCBSZW1vdGVQYWNrIHAgOiB1bmZldGNoZWRQYWNrcykgeworCQlmb3IgKFJlbW90ZVBhY2sgcCA6IHVuZmV0Y2hlZFBhY2tzKSB7CiAJCQlpZiAocC50bXBJZHggIT0gbnVsbCkKIAkJCQlwLnRtcElkeC5kZWxldGUoKTsKIAkJfQotCQlmb3IgKGZpbmFsIFdhbGtSZW1vdGVPYmplY3REYXRhYmFzZSByIDogcmVtb3RlcykKKwkJZm9yIChXYWxrUmVtb3RlT2JqZWN0RGF0YWJhc2UgciA6IHJlbW90ZXMpCiAJCQlyLmNsb3NlKCk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHF1ZXVlV2FudHMoZmluYWwgQ29sbGVjdGlvbjxSZWY+IHdhbnQpCisJcHJpdmF0ZSB2b2lkIHF1ZXVlV2FudHMoQ29sbGVjdGlvbjxSZWY+IHdhbnQpCiAJCQl0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKIAkJZmluYWwgSGFzaFNldDxPYmplY3RJZD4gaW5Xb3JrUXVldWUgPSBuZXcgSGFzaFNldDw+KCk7Ci0JCWZvciAoZmluYWwgUmVmIHIgOiB3YW50KSB7CisJCWZvciAoUmVmIHIgOiB3YW50KSB7CiAJCQlmaW5hbCBPYmplY3RJZCBpZCA9IHIuZ2V0T2JqZWN0SWQoKTsKIAkJCWlmIChpZCA9PSBudWxsKSB7CiAJCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KApAQCAtMzAyLDcgKzI5OSw3IEBAIHByaXZhdGUgdm9pZCBxdWV1ZVdhbnRzKGZpbmFsIENvbGxlY3Rpb248UmVmPiB3YW50KQogCQl9CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3MoZmluYWwgT2JqZWN0SWQgaWQpIHRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24geworCXByaXZhdGUgdm9pZCBwcm9jZXNzKE9iamVjdElkIGlkKSB0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKIAkJZmluYWwgUmV2T2JqZWN0IG9iajsKIAkJdHJ5IHsKIAkJCWlmIChpZCBpbnN0YW5jZW9mIFJldk9iamVjdCkgewpAQCAtMzQyLDcgKzMzOSw3IEBAIHByaXZhdGUgdm9pZCBwcm9jZXNzKGZpbmFsIE9iamVjdElkIGlkKSB0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKIAkJZmV0Y2hFcnJvcnMucmVtb3ZlKGlkKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgcHJvY2Vzc0Jsb2IoZmluYWwgUmV2T2JqZWN0IG9iaikgdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisJcHJpdmF0ZSB2b2lkIHByb2Nlc3NCbG9iKFJldk9iamVjdCBvYmopIHRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24gewogCQl0cnkgewogCQkJaWYgKHJlYWRlci5oYXMob2JqLCBDb25zdGFudHMuT0JKX0JMT0IpKQogCQkJCW9iai5hZGQoQ09NUExFVEUpOwpAQCAtMzU2LDcgKzM1Myw3IEBAIHByaXZhdGUgdm9pZCBwcm9jZXNzQmxvYihmaW5hbCBSZXZPYmplY3Qgb2JqKSB0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKIAkJfQogCX0KIAotCXByaXZhdGUgdm9pZCBwcm9jZXNzVHJlZShmaW5hbCBSZXZPYmplY3Qgb2JqKSB0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKKwlwcml2YXRlIHZvaWQgcHJvY2Vzc1RyZWUoUmV2T2JqZWN0IG9iaikgdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAJCXRyeSB7CiAJCQl0cmVlV2Fsay5yZXNldChvYmopOwogCQkJd2hpbGUgKHRyZWVXYWxrLm5leHQoKSkgewpAQCAtMzg0LDIyICszODEsMjIgQEAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NUcmVlKGZpbmFsIFJldk9iamVjdCBvYmopIHRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24gewogCQlvYmouYWRkKENPTVBMRVRFKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgcHJvY2Vzc0NvbW1pdChmaW5hbCBSZXZPYmplY3Qgb2JqKSB0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKKwlwcml2YXRlIHZvaWQgcHJvY2Vzc0NvbW1pdChSZXZPYmplY3Qgb2JqKSB0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKIAkJZmluYWwgUmV2Q29tbWl0IGNvbW1pdCA9IChSZXZDb21taXQpIG9iajsKIAkJbWFya0xvY2FsQ29tbWl0c0NvbXBsZXRlKGNvbW1pdC5nZXRDb21taXRUaW1lKCkpOwogCQluZWVkcyhjb21taXQuZ2V0VHJlZSgpKTsKLQkJZm9yIChmaW5hbCBSZXZDb21taXQgcCA6IGNvbW1pdC5nZXRQYXJlbnRzKCkpCisJCWZvciAoUmV2Q29tbWl0IHAgOiBjb21taXQuZ2V0UGFyZW50cygpKQogCQkJbmVlZHMocCk7CiAJCW9iai5hZGQoQ09NUExFVEUpOwogCX0KIAotCXByaXZhdGUgdm9pZCBwcm9jZXNzVGFnKGZpbmFsIFJldk9iamVjdCBvYmopIHsKKwlwcml2YXRlIHZvaWQgcHJvY2Vzc1RhZyhSZXZPYmplY3Qgb2JqKSB7CiAJCWZpbmFsIFJldlRhZyB0YWcgPSAoUmV2VGFnKSBvYmo7CiAJCW5lZWRzKHRhZy5nZXRPYmplY3QoKSk7CiAJCW9iai5hZGQoQ09NUExFVEUpOwogCX0KIAotCXByaXZhdGUgdm9pZCBuZWVkcyhmaW5hbCBSZXZPYmplY3Qgb2JqKSB7CisJcHJpdmF0ZSB2b2lkIG5lZWRzKFJldk9iamVjdCBvYmopIHsKIAkJaWYgKG9iai5oYXMoQ09NUExFVEUpKQogCQkJcmV0dXJuOwogCQlpZiAoIW9iai5oYXMoSU5fV09SS19RVUVVRSkpIHsKQEAgLTQwOCw3ICs0MDUsNyBAQCBwcml2YXRlIHZvaWQgbmVlZHMoZmluYWwgUmV2T2JqZWN0IG9iaikgewogCQl9CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGRvd25sb2FkT2JqZWN0KGZpbmFsIFByb2dyZXNzTW9uaXRvciBwbSwgZmluYWwgQW55T2JqZWN0SWQgaWQpCisJcHJpdmF0ZSB2b2lkIGRvd25sb2FkT2JqZWN0KFByb2dyZXNzTW9uaXRvciBwbSwgQW55T2JqZWN0SWQgaWQpCiAJCQl0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKIAkJaWYgKGFscmVhZHlIYXZlKGlkKSkKIAkJCXJldHVybjsKQEAgLTQ2Miw3ICs0NTksNyBAQCBwcml2YXRlIHZvaWQgZG93bmxvYWRPYmplY3QoZmluYWwgUHJvZ3Jlc3NNb25pdG9yIHBtLCBmaW5hbCBBbnlPYmplY3RJZCBpZCkKIAogCQkJCWlmIChwYWNrTmFtZUxpc3QgPT0gbnVsbCB8fCBwYWNrTmFtZUxpc3QuaXNFbXB0eSgpKQogCQkJCQljb250aW51ZTsKLQkJCQlmb3IgKGZpbmFsIFN0cmluZyBwYWNrTmFtZSA6IHBhY2tOYW1lTGlzdCkgeworCQkJCWZvciAoU3RyaW5nIHBhY2tOYW1lIDogcGFja05hbWVMaXN0KSB7CiAJCQkJCWlmIChwYWNrc0NvbnNpZGVyZWQuYWRkKHBhY2tOYW1lKSkKIAkJCQkJCXVuZmV0Y2hlZFBhY2tzLmFkZChuZXcgUmVtb3RlUGFjayh3cnIsIHBhY2tOYW1lKSk7CiAJCQkJfQpAQCAtNDc0LDcgKzQ3MSw3IEBAIHByaXZhdGUgdm9pZCBkb3dubG9hZE9iamVjdChmaW5hbCBQcm9ncmVzc01vbml0b3IgcG0sIGZpbmFsIEFueU9iamVjdElkIGlkKQogCQkJLy8KIAkJCUNvbGxlY3Rpb248V2Fsa1JlbW90ZU9iamVjdERhdGFiYXNlPiBhbCA9IGV4cGFuZE9uZUFsdGVybmF0ZShpZCwgcG0pOwogCQkJaWYgKGFsICE9IG51bGwgJiYgIWFsLmlzRW1wdHkoKSkgewotCQkJCWZvciAoZmluYWwgV2Fsa1JlbW90ZU9iamVjdERhdGFiYXNlIGFsdCA6IGFsKSB7CisJCQkJZm9yIChXYWxrUmVtb3RlT2JqZWN0RGF0YWJhc2UgYWx0IDogYWwpIHsKIAkJCQkJcmVtb3Rlcy5hZGQoYWx0KTsKIAkJCQkJbm9QYWNrc1lldC5hZGQoYWx0KTsKIAkJCQkJbm9BbHRlcm5hdGVzWWV0LmFkZChhbHQpOwpAQCAtNDk4LDcgKzQ5NSw3IEBAIHByaXZhdGUgdm9pZCBkb3dubG9hZE9iamVjdChmaW5hbCBQcm9ncmVzc01vbml0b3IgcG0sIGZpbmFsIEFueU9iamVjdElkIGlkKQogCQl9CiAJfQogCi0JcHJpdmF0ZSBib29sZWFuIGFscmVhZHlIYXZlKGZpbmFsIEFueU9iamVjdElkIGlkKSB0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKKwlwcml2YXRlIGJvb2xlYW4gYWxyZWFkeUhhdmUoQW55T2JqZWN0SWQgaWQpIHRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24gewogCQl0cnkgewogCQkJcmV0dXJuIHJlYWRlci5oYXMoaWQpOwogCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlcnJvcikgewpAQCAtNjg5LDIxICs2ODYsMjEgQEAgcHJpdmF0ZSBDb2xsZWN0aW9uPFdhbGtSZW1vdGVPYmplY3REYXRhYmFzZT4gZXhwYW5kT25lQWx0ZXJuYXRlKAogCQlyZXR1cm4gbnVsbDsKIAl9CiAKLQlwcml2YXRlIHZvaWQgbWFya0xvY2FsUmVmc0NvbXBsZXRlKGZpbmFsIFNldDxPYmplY3RJZD4gaGF2ZSkgdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7Ci0JCU1hcDxTdHJpbmcsIFJlZj4gcmVmczsKKwlwcml2YXRlIHZvaWQgbWFya0xvY2FsUmVmc0NvbXBsZXRlKFNldDxPYmplY3RJZD4gaGF2ZSkgdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisJCUxpc3Q8UmVmPiByZWZzOwogCQl0cnkgewotCQkJcmVmcyA9IGxvY2FsLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcyhBTEwpOworCQkJcmVmcyA9IGxvY2FsLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcygpOwogCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAJCQl0aHJvdyBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKIAkJfQotCQlmb3IgKGZpbmFsIFJlZiByIDogcmVmcy52YWx1ZXMoKSkgeworCQlmb3IgKFJlZiByIDogcmVmcykgewogCQkJdHJ5IHsKIAkJCQltYXJrTG9jYWxPYmpDb21wbGV0ZShyZXZXYWxrLnBhcnNlQW55KHIuZ2V0T2JqZWN0SWQoKSkpOwogCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gcmVhZEVycm9yKSB7CiAJCQkJdGhyb3cgbmV3IFRyYW5zcG9ydEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdChKR2l0VGV4dC5nZXQoKS5sb2NhbFJlZklzTWlzc2luZ09iamVjdHMsIHIuZ2V0TmFtZSgpKSwgcmVhZEVycm9yKTsKIAkJCX0KIAkJfQotCQlmb3IgKGZpbmFsIE9iamVjdElkIGlkIDogaGF2ZSkgeworCQlmb3IgKE9iamVjdElkIGlkIDogaGF2ZSkgewogCQkJdHJ5IHsKIAkJCQltYXJrTG9jYWxPYmpDb21wbGV0ZShyZXZXYWxrLnBhcnNlQW55KGlkKSk7CiAJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiByZWFkRXJyb3IpIHsKQEAgLTczMiw3ICs3MjksNyBAQCBwcml2YXRlIHZvaWQgbWFya0xvY2FsT2JqQ29tcGxldGUoUmV2T2JqZWN0IG9iaikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJfQogCX0KIAotCXByaXZhdGUgdm9pZCBtYXJrTG9jYWxDb21taXRzQ29tcGxldGUoZmluYWwgaW50IHVudGlsKQorCXByaXZhdGUgdm9pZCBtYXJrTG9jYWxDb21taXRzQ29tcGxldGUoaW50IHVudGlsKQogCQkJdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAJCXRyeSB7CiAJCQlmb3IgKDs7KSB7CkBAIC03NDIsNyArNzM5LDcgQEAgcHJpdmF0ZSB2b2lkIG1hcmtMb2NhbENvbW1pdHNDb21wbGV0ZShmaW5hbCBpbnQgdW50aWwpCiAJCQkJbG9jYWxDb21taXRRdWV1ZS5uZXh0KCk7CiAKIAkJCQltYXJrVHJlZUNvbXBsZXRlKGMuZ2V0VHJlZSgpKTsKLQkJCQlmb3IgKGZpbmFsIFJldkNvbW1pdCBwIDogYy5nZXRQYXJlbnRzKCkpCisJCQkJZm9yIChSZXZDb21taXQgcCA6IGMuZ2V0UGFyZW50cygpKQogCQkJCQlwdXNoTG9jYWxDb21taXQocCk7CiAJCQl9CiAJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGVycikgewpAQCAtNzUwLDcgKzc0Nyw3IEBAIHByaXZhdGUgdm9pZCBtYXJrTG9jYWxDb21taXRzQ29tcGxldGUoZmluYWwgaW50IHVudGlsKQogCQl9CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHB1c2hMb2NhbENvbW1pdChmaW5hbCBSZXZDb21taXQgcCkKKwlwcml2YXRlIHZvaWQgcHVzaExvY2FsQ29tbWl0KFJldkNvbW1pdCBwKQogCQkJdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJaWYgKHAuaGFzKExPQ0FMTFlfU0VFTikpCiAJCQlyZXR1cm47CkBAIC03NjEsNyArNzU4LDcgQEAgcHJpdmF0ZSB2b2lkIHB1c2hMb2NhbENvbW1pdChmaW5hbCBSZXZDb21taXQgcCkKIAkJbG9jYWxDb21taXRRdWV1ZS5hZGQocCk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIG1hcmtUcmVlQ29tcGxldGUoZmluYWwgUmV2VHJlZSB0cmVlKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByaXZhdGUgdm9pZCBtYXJrVHJlZUNvbXBsZXRlKFJldlRyZWUgdHJlZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJaWYgKHRyZWUuaGFzKENPTVBMRVRFKSkKIAkJCXJldHVybjsKIAkJdHJlZS5hZGQoQ09NUExFVEUpOwpAQCAtNzk1LDcgKzc5Miw3IEBAIHByaXZhdGUgdm9pZCBtYXJrVHJlZUNvbXBsZXRlKGZpbmFsIFJldlRyZWUgdHJlZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJfQogCX0KIAotCXByaXZhdGUgdm9pZCByZWNvcmRFcnJvcihmaW5hbCBBbnlPYmplY3RJZCBpZCwgZmluYWwgVGhyb3dhYmxlIHdoYXQpIHsKKwlwcml2YXRlIHZvaWQgcmVjb3JkRXJyb3IoQW55T2JqZWN0SWQgaWQsIFRocm93YWJsZSB3aGF0KSB7CiAJCWZpbmFsIE9iamVjdElkIG9iaklkID0gaWQuY29weSgpOwogCQlMaXN0PFRocm93YWJsZT4gZXJyb3JzID0gZmV0Y2hFcnJvcnMuZ2V0KG9iaklkKTsKIAkJaWYgKGVycm9ycyA9PSBudWxsKSB7CkBAIC04MTYsNyArODEzLDcgQEAgcHJpdmF0ZSBjbGFzcyBSZW1vdGVQYWNrIHsKIAogCQlQYWNrSW5kZXggaW5kZXg7CiAKLQkJUmVtb3RlUGFjayhmaW5hbCBXYWxrUmVtb3RlT2JqZWN0RGF0YWJhc2UgYywgZmluYWwgU3RyaW5nIHBuKSB7CisJCVJlbW90ZVBhY2soV2Fsa1JlbW90ZU9iamVjdERhdGFiYXNlIGMsIFN0cmluZyBwbikgewogCQkJY29ubmVjdGlvbiA9IGM7CiAJCQlwYWNrTmFtZSA9IHBuOwogCQkJaWR4TmFtZSA9IHBhY2tOYW1lLnN1YnN0cmluZygwLCBwYWNrTmFtZS5sZW5ndGgoKSAtIDUpICsgIi5pZHgiOyAvLyROT04tTkxTLTEkCkBAIC04MzQsNyArODMxLDcgQEAgcHJpdmF0ZSBjbGFzcyBSZW1vdGVQYWNrIHsKIAkJCX0KIAkJfQogCi0JCXZvaWQgb3BlbkluZGV4KGZpbmFsIFByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJdm9pZCBvcGVuSW5kZXgoUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJaWYgKGluZGV4ICE9IG51bGwpCiAJCQkJcmV0dXJuOwogCQkJaWYgKHRtcElkeCA9PSBudWxsKQpAQCAtODUzLDE3ICs4NTAsMTIgQEAgZWxzZSBpZiAodG1wSWR4LmlzRmlsZSgpKSB7CiAJCQlwbS5iZWdpblRhc2soIkdldCAiICsgaWR4TmFtZS5zdWJzdHJpbmcoMCwgMTIpICsgIi4uaWR4IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCQkJCXMubGVuZ3RoIDwgMCA/IFByb2dyZXNzTW9uaXRvci5VTktOT1dOCiAJCQkJCQkJOiAoaW50KSAocy5sZW5ndGggLyAxMDI0KSk7Ci0JCQl0cnkgewotCQkJCWZpbmFsIEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odG1wSWR4KTsKLQkJCQl0cnkgewotCQkJCQlmaW5hbCBieXRlW10gYnVmID0gbmV3IGJ5dGVbMjA0OF07Ci0JCQkJCWludCBjbnQ7Ci0JCQkJCXdoaWxlICghcG0uaXNDYW5jZWxsZWQoKSAmJiAoY250ID0gcy5pbi5yZWFkKGJ1ZikpID49IDApIHsKLQkJCQkJCWZvcy53cml0ZShidWYsIDAsIGNudCk7Ci0JCQkJCQlwbS51cGRhdGUoY250IC8gMTAyNCk7Ci0JCQkJCX0KLQkJCQl9IGZpbmFsbHkgewotCQkJCQlmb3MuY2xvc2UoKTsKKwkJCXRyeSAoRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0bXBJZHgpKSB7CisJCQkJZmluYWwgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzIwNDhdOworCQkJCWludCBjbnQ7CisJCQkJd2hpbGUgKCFwbS5pc0NhbmNlbGxlZCgpICYmIChjbnQgPSBzLmluLnJlYWQoYnVmKSkgPj0gMCkgeworCQkJCQlmb3Mud3JpdGUoYnVmLCAwLCBjbnQpOworCQkJCQlwbS51cGRhdGUoY250IC8gMTAyNCk7CiAJCQkJfQogCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXJyKSB7CiAJCQkJRmlsZVV0aWxzLmRlbGV0ZSh0bXBJZHgpOwpAQCAtODg2LDcgKzg3OCw3IEBAIGVsc2UgaWYgKHRtcElkeC5pc0ZpbGUoKSkgewogCQkJfQogCQl9CiAKLQkJdm9pZCBkb3dubG9hZFBhY2soZmluYWwgUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXZvaWQgZG93bmxvYWRQYWNrKFByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJU3RyaW5nIG5hbWUgPSAicGFjay8iICsgcGFja05hbWU7IC8vJE5PTi1OTFMtMSQKIAkJCVdhbGtSZW1vdGVPYmplY3REYXRhYmFzZS5GaWxlU3RyZWFtIHMgPSBjb25uZWN0aW9uLm9wZW4obmFtZSk7CiAJCQl0cnkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvV2Fsa1B1c2hDb25uZWN0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9XYWxrUHVzaENvbm5lY3Rpb24uamF2YQppbmRleCBjZjUwYzUxLi40Yzc1NDI1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9XYWxrUHVzaENvbm5lY3Rpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9XYWxrUHVzaENvbm5lY3Rpb24uamF2YQpAQCAtMTU3LDcgKzE1Nyw3IEBAIHB1YmxpYyB2b2lkIHB1c2goZmluYWwgUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsCiAJCS8vIHJlZiB1c2luZyB0aGUgZGlyZWN0b3J5IG5hbWUgYmVpbmcgY3JlYXRlZC4KIAkJLy8KIAkJZmluYWwgTGlzdDxSZW1vdGVSZWZVcGRhdGU+IHVwZGF0ZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLQkJZm9yIChmaW5hbCBSZW1vdGVSZWZVcGRhdGUgdSA6IHJlZlVwZGF0ZXMudmFsdWVzKCkpIHsKKwkJZm9yIChSZW1vdGVSZWZVcGRhdGUgdSA6IHJlZlVwZGF0ZXMudmFsdWVzKCkpIHsKIAkJCWZpbmFsIFN0cmluZyBuID0gdS5nZXRSZW1vdGVOYW1lKCk7CiAJCQlpZiAoIW4uc3RhcnRzV2l0aCgicmVmcy8iKSB8fCAhUmVwb3NpdG9yeS5pc1ZhbGlkUmVmTmFtZShuKSkgeyAvLyROT04tTkxTLTEkCiAJCQkJdS5zZXRTdGF0dXMoU3RhdHVzLlJFSkVDVEVEX09USEVSX1JFQVNPTik7CkBAIC0xNzcsNyArMTc3LDcgQEAgcHVibGljIHZvaWQgcHVzaChmaW5hbCBQcm9ncmVzc01vbml0b3IgbW9uaXRvciwKIAkJLy8KIAkJaWYgKCF1cGRhdGVzLmlzRW1wdHkoKSkKIAkJCXNlbmRwYWNrKHVwZGF0ZXMsIG1vbml0b3IpOwotCQlmb3IgKGZpbmFsIFJlbW90ZVJlZlVwZGF0ZSB1IDogdXBkYXRlcykKKwkJZm9yIChSZW1vdGVSZWZVcGRhdGUgdSA6IHVwZGF0ZXMpCiAJCQl1cGRhdGVDb21tYW5kKHUpOwogCiAJCS8vIElzIHRoaXMgYSBuZXcgcmVwb3NpdG9yeT8gSWYgc28gd2Ugc2hvdWxkIGNyZWF0ZSBhZGRpdGlvbmFsCkBAIC0xOTYsMTAgKzE5NiwxMCBAQCBwcm90ZWN0ZWQgdm9pZCB3cml0ZUZpbGUoU3RyaW5nIGZpbGUsIGJ5dGVbXSBjb250ZW50KQogCQlpZiAoIXBhY2tlZFJlZlVwZGF0ZXMuaXNFbXB0eSgpKSB7CiAJCQl0cnkgewogCQkJCXJlZldyaXRlci53cml0ZVBhY2tlZFJlZnMoKTsKLQkJCQlmb3IgKGZpbmFsIFJlbW90ZVJlZlVwZGF0ZSB1IDogcGFja2VkUmVmVXBkYXRlcykKKwkJCQlmb3IgKFJlbW90ZVJlZlVwZGF0ZSB1IDogcGFja2VkUmVmVXBkYXRlcykKIAkJCQkJdS5zZXRTdGF0dXMoU3RhdHVzLk9LKTsKIAkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGVycikgewotCQkJCWZvciAoZmluYWwgUmVtb3RlUmVmVXBkYXRlIHUgOiBwYWNrZWRSZWZVcGRhdGVzKSB7CisJCQkJZm9yIChSZW1vdGVSZWZVcGRhdGUgdSA6IHBhY2tlZFJlZlVwZGF0ZXMpIHsKIAkJCQkJdS5zZXRTdGF0dXMoU3RhdHVzLlJFSkVDVEVEX09USEVSX1JFQVNPTik7CiAJCQkJCXUuc2V0TWVzc2FnZShlcnIuZ2V0TWVzc2FnZSgpKTsKIAkJCQl9CkBAIC0yMjUsMTQgKzIyNSwxNCBAQCBwcml2YXRlIHZvaWQgc2VuZHBhY2soZmluYWwgTGlzdDxSZW1vdGVSZWZVcGRhdGU+IHVwZGF0ZXMsCiAJCVN0cmluZyBwYXRoUGFjayA9IG51bGw7CiAJCVN0cmluZyBwYXRoSWR4ID0gbnVsbDsKIAotCQl0cnkgKGZpbmFsIFBhY2tXcml0ZXIgd3JpdGVyID0gbmV3IFBhY2tXcml0ZXIodHJhbnNwb3J0LmdldFBhY2tDb25maWcoKSwKKwkJdHJ5IChQYWNrV3JpdGVyIHdyaXRlciA9IG5ldyBQYWNrV3JpdGVyKHRyYW5zcG9ydC5nZXRQYWNrQ29uZmlnKCksCiAJCQkJbG9jYWwubmV3T2JqZWN0UmVhZGVyKCkpKSB7CiAKIAkJCWZpbmFsIFNldDxPYmplY3RJZD4gbmVlZCA9IG5ldyBIYXNoU2V0PD4oKTsKIAkJCWZpbmFsIFNldDxPYmplY3RJZD4gaGF2ZSA9IG5ldyBIYXNoU2V0PD4oKTsKLQkJCWZvciAoZmluYWwgUmVtb3RlUmVmVXBkYXRlIHIgOiB1cGRhdGVzKQorCQkJZm9yIChSZW1vdGVSZWZVcGRhdGUgciA6IHVwZGF0ZXMpCiAJCQkJbmVlZC5hZGQoci5nZXROZXdPYmplY3RJZCgpKTsKLQkJCWZvciAoZmluYWwgUmVmIHIgOiBnZXRSZWZzKCkpIHsKKwkJCWZvciAoUmVmIHIgOiBnZXRSZWZzKCkpIHsKIAkJCQloYXZlLmFkZChyLmdldE9iamVjdElkKCkpOwogCQkJCWlmIChyLmdldFBlZWxlZE9iamVjdElkKCkgIT0gbnVsbCkKIAkJCQkJaGF2ZS5hZGQoci5nZXRQZWVsZWRPYmplY3RJZCgpKTsKQEAgLTI0Nyw3ICsyNDcsNyBAQCBwcml2YXRlIHZvaWQgc2VuZHBhY2soZmluYWwgTGlzdDxSZW1vdGVSZWZVcGRhdGU+IHVwZGF0ZXMsCiAJCQkJcmV0dXJuOwogCiAJCQlwYWNrTmFtZXMgPSBuZXcgTGlua2VkSGFzaE1hcDw+KCk7Ci0JCQlmb3IgKGZpbmFsIFN0cmluZyBuIDogZGVzdC5nZXRQYWNrTmFtZXMoKSkKKwkJCWZvciAoU3RyaW5nIG4gOiBkZXN0LmdldFBhY2tOYW1lcygpKQogCQkJCXBhY2tOYW1lcy5wdXQobiwgbik7CiAKIAkJCWZpbmFsIFN0cmluZyBiYXNlID0gInBhY2stIiArIHdyaXRlci5jb21wdXRlTmFtZSgpLm5hbWUoKTsgLy8kTk9OLU5MUy0xJApAQCAtMjk1LDcgKzI5NSw3IEBAIHByaXZhdGUgdm9pZCBzZW5kcGFjayhmaW5hbCBMaXN0PFJlbW90ZVJlZlVwZGF0ZT4gdXBkYXRlcywKIAkJfQogCX0KIAotCXByaXZhdGUgdm9pZCBzYWZlRGVsZXRlKGZpbmFsIFN0cmluZyBwYXRoKSB7CisJcHJpdmF0ZSB2b2lkIHNhZmVEZWxldGUoU3RyaW5nIHBhdGgpIHsKIAkJaWYgKHBhdGggIT0gbnVsbCkgewogCQkJdHJ5IHsKIAkJCQlkZXN0LmRlbGV0ZUZpbGUocGF0aCk7CkBAIC0zMDcsNyArMzA3LDcgQEAgcHJpdmF0ZSB2b2lkIHNhZmVEZWxldGUoZmluYWwgU3RyaW5nIHBhdGgpIHsKIAkJfQogCX0KIAotCXByaXZhdGUgdm9pZCBkZWxldGVDb21tYW5kKGZpbmFsIFJlbW90ZVJlZlVwZGF0ZSB1KSB7CisJcHJpdmF0ZSB2b2lkIGRlbGV0ZUNvbW1hbmQoUmVtb3RlUmVmVXBkYXRlIHUpIHsKIAkJZmluYWwgUmVmIHIgPSBuZXdSZWZzLnJlbW92ZSh1LmdldFJlbW90ZU5hbWUoKSk7CiAJCWlmIChyID09IG51bGwpIHsKIAkJCS8vIEFscmVhZHkgZ29uZS4KQEAgLTMzNyw3ICszMzcsNyBAQCBwcml2YXRlIHZvaWQgZGVsZXRlQ29tbWFuZChmaW5hbCBSZW1vdGVSZWZVcGRhdGUgdSkgewogCQl9CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUNvbW1hbmQoZmluYWwgUmVtb3RlUmVmVXBkYXRlIHUpIHsKKwlwcml2YXRlIHZvaWQgdXBkYXRlQ29tbWFuZChSZW1vdGVSZWZVcGRhdGUgdSkgewogCQl0cnkgewogCQkJZGVzdC53cml0ZVJlZih1LmdldFJlbW90ZU5hbWUoKSwgdS5nZXROZXdPYmplY3RJZCgpKTsKIAkJCW5ld1JlZnMucHV0KHUuZ2V0UmVtb3RlTmFtZSgpLCBuZXcgT2JqZWN0SWRSZWYuVW5wZWVsZWQoCkBAIC0zNTQsNyArMzU0LDcgQEAgcHJpdmF0ZSBib29sZWFuIGlzTmV3UmVwb3NpdG9yeSgpIHsKIAkJCQkmJiBwYWNrTmFtZXMuaXNFbXB0eSgpOwogCX0KIAotCXByaXZhdGUgdm9pZCBjcmVhdGVOZXdSZXBvc2l0b3J5KGZpbmFsIExpc3Q8UmVtb3RlUmVmVXBkYXRlPiB1cGRhdGVzKQorCXByaXZhdGUgdm9pZCBjcmVhdGVOZXdSZXBvc2l0b3J5KExpc3Q8UmVtb3RlUmVmVXBkYXRlPiB1cGRhdGVzKQogCQkJdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAJCXRyeSB7CiAJCQlmaW5hbCBTdHJpbmcgcmVmID0gInJlZjogIiArIHBpY2tIRUFEKHVwZGF0ZXMpICsgIlxuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCkBAIC0zNzQsMTIgKzM3NCwxMiBAQCBwcml2YXRlIHZvaWQgY3JlYXRlTmV3UmVwb3NpdG9yeShmaW5hbCBMaXN0PFJlbW90ZVJlZlVwZGF0ZT4gdXBkYXRlcykKIAkJfQogCX0KIAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBwaWNrSEVBRChmaW5hbCBMaXN0PFJlbW90ZVJlZlVwZGF0ZT4gdXBkYXRlcykgeworCXByaXZhdGUgc3RhdGljIFN0cmluZyBwaWNrSEVBRChMaXN0PFJlbW90ZVJlZlVwZGF0ZT4gdXBkYXRlcykgewogCQkvLyBUcnkgdG8gdXNlIG1hc3RlciBpZiB0aGUgdXNlciBpcyBwdXNoaW5nIHRoYXQsIGl0IGlzIHRoZQogCQkvLyBkZWZhdWx0IGJyYW5jaCBhbmQgaXMgbGlrZWx5IHdoYXQgdGhleSB3YW50IHRvIHJlbWFpbiBhcwogCQkvLyB0aGUgZGVmYXVsdCBvbiB0aGUgbmV3IHJlbW90ZS4KIAkJLy8KLQkJZm9yIChmaW5hbCBSZW1vdGVSZWZVcGRhdGUgdSA6IHVwZGF0ZXMpIHsKKwkJZm9yIChSZW1vdGVSZWZVcGRhdGUgdSA6IHVwZGF0ZXMpIHsKIAkJCWZpbmFsIFN0cmluZyBuID0gdS5nZXRSZW1vdGVOYW1lKCk7CiAJCQlpZiAobi5lcXVhbHMoQ29uc3RhbnRzLlJfSEVBRFMgKyBDb25zdGFudHMuTUFTVEVSKSkKIAkJCQlyZXR1cm4gbjsKQEAgLTM4OCw3ICszODgsNyBAQCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcGlja0hFQUQoZmluYWwgTGlzdDxSZW1vdGVSZWZVcGRhdGU+IHVwZGF0ZXMpIHsKIAkJLy8gUGljayBhbnkgYnJhbmNoLCB1bmRlciB0aGUgYXNzdW1wdGlvbiB0aGUgdXNlciBwdXNoZWQgb25seQogCQkvLyBvbmUgdG8gdGhlIHJlbW90ZSBzaWRlLgogCQkvLwotCQlmb3IgKGZpbmFsIFJlbW90ZVJlZlVwZGF0ZSB1IDogdXBkYXRlcykgeworCQlmb3IgKFJlbW90ZVJlZlVwZGF0ZSB1IDogdXBkYXRlcykgewogCQkJZmluYWwgU3RyaW5nIG4gPSB1LmdldFJlbW90ZU5hbWUoKTsKIAkJCWlmIChuLnN0YXJ0c1dpdGgoQ29uc3RhbnRzLlJfSEVBRFMpKQogCQkJCXJldHVybiBuOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvV2Fsa1JlbW90ZU9iamVjdERhdGFiYXNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9XYWxrUmVtb3RlT2JqZWN0RGF0YWJhc2UuamF2YQppbmRleCA5NjViZTUwLi5hYTcxYzk0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9XYWxrUmVtb3RlT2JqZWN0RGF0YWJhc2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9XYWxrUmVtb3RlT2JqZWN0RGF0YWJhc2UuamF2YQpAQCAtMjAyLDcgKzIwMiw3IEBAIGFic3RyYWN0IFdhbGtSZW1vdGVPYmplY3REYXRhYmFzZSBvcGVuQWx0ZXJuYXRlKFN0cmluZyBsb2NhdGlvbikKIAkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgZGVsZXRpb24gaXMgbm90IHN1cHBvcnRlZCwgb3IgZGVsZXRpb24gZmFpbGVkLgogCSAqLwotCXZvaWQgZGVsZXRlRmlsZShmaW5hbCBTdHJpbmcgcGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwl2b2lkIGRlbGV0ZUZpbGUoU3RyaW5nIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdChKR2l0VGV4dC5nZXQoKS5kZWxldGluZ05vdFN1cHBvcnRlZCwgcGF0aCkpOwogCX0KIApAQCAtMjYzLDcgKzI2Myw3IEBAIE91dHB1dFN0cmVhbSB3cml0ZUZpbGUoZmluYWwgU3RyaW5nIHBhdGgsIGZpbmFsIFByb2dyZXNzTW9uaXRvciBtb25pdG9yLAogCSAqICAgICAgICAgICAgIHdyaXRpbmcgaXMgbm90IHN1cHBvcnRlZCwgb3IgYXR0ZW1wdGluZyB0byB3cml0ZSB0aGUgZmlsZQogCSAqICAgICAgICAgICAgIGZhaWxlZCwgcG9zc2libHkgZHVlIHRvIHBlcm1pc3Npb25zIG9yIHJlbW90ZSBkaXNrIGZ1bGwsIGV0Yy4KIAkgKi8KLQl2b2lkIHdyaXRlRmlsZShmaW5hbCBTdHJpbmcgcGF0aCwgZmluYWwgYnl0ZVtdIGRhdGEpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJdm9pZCB3cml0ZUZpbGUoU3RyaW5nIHBhdGgsIGJ5dGVbXSBkYXRhKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl0cnkgKE91dHB1dFN0cmVhbSBvcyA9IHdyaXRlRmlsZShwYXRoLCBudWxsLCBudWxsKSkgewogCQkJb3Mud3JpdGUoZGF0YSk7CiAJCX0KQEAgLTI3OCw3ICsyNzgsNyBAQCB2b2lkIHdyaXRlRmlsZShmaW5hbCBTdHJpbmcgcGF0aCwgZmluYWwgYnl0ZVtdIGRhdGEpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJICogQHRocm93cyBJT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIGRlbGV0aW9uIGlzIG5vdCBzdXBwb3J0ZWQsIG9yIGRlbGV0aW9uIGZhaWxlZC4KIAkgKi8KLQl2b2lkIGRlbGV0ZVJlZihmaW5hbCBTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwl2b2lkIGRlbGV0ZVJlZihTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZGVsZXRlRmlsZShST09UX0RJUiArIG5hbWUpOwogCX0KIApAQCAtMjkxLDcgKzI5MSw3IEBAIHZvaWQgZGVsZXRlUmVmKGZpbmFsIFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICBkZWxldGlvbiBpcyBub3Qgc3VwcG9ydGVkLCBvciBkZWxldGlvbiBmYWlsZWQuCiAJICovCi0Jdm9pZCBkZWxldGVSZWZMb2coZmluYWwgU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJdm9pZCBkZWxldGVSZWZMb2coU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWRlbGV0ZUZpbGUoUk9PVF9ESVIgKyBDb25zdGFudHMuTE9HUyArICIvIiArIG5hbWUpOyAvLyROT04tTkxTLTEkCiAJfQogCkBAIC0zMDksNyArMzA5LDcgQEAgdm9pZCBkZWxldGVSZWZMb2coZmluYWwgU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJICogICAgICAgICAgICAgd3JpdGluZyBpcyBub3Qgc3VwcG9ydGVkLCBvciBhdHRlbXB0aW5nIHRvIHdyaXRlIHRoZSBmaWxlCiAJICogICAgICAgICAgICAgZmFpbGVkLCBwb3NzaWJseSBkdWUgdG8gcGVybWlzc2lvbnMgb3IgcmVtb3RlIGRpc2sgZnVsbCwgZXRjLgogCSAqLwotCXZvaWQgd3JpdGVSZWYoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIE9iamVjdElkIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXZvaWQgd3JpdGVSZWYoU3RyaW5nIG5hbWUsIE9iamVjdElkIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYjsKIAogCQliID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbShDb25zdGFudHMuT0JKRUNUX0lEX1NUUklOR19MRU5HVEggKyAxKTsKQEAgLTMzMyw5ICszMzMsOSBAQCB2b2lkIHdyaXRlUmVmKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBPYmplY3RJZCB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkgKiAgICAgICAgICAgICB3cml0aW5nIGlzIG5vdCBzdXBwb3J0ZWQsIG9yIGF0dGVtcHRpbmcgdG8gd3JpdGUgdGhlIGZpbGUKIAkgKiAgICAgICAgICAgICBmYWlsZWQsIHBvc3NpYmx5IGR1ZSB0byBwZXJtaXNzaW9ucyBvciByZW1vdGUgZGlzayBmdWxsLCBldGMuCiAJICovCi0Jdm9pZCB3cml0ZUluZm9QYWNrcyhmaW5hbCBDb2xsZWN0aW9uPFN0cmluZz4gcGFja05hbWVzKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXZvaWQgd3JpdGVJbmZvUGFja3MoQ29sbGVjdGlvbjxTdHJpbmc+IHBhY2tOYW1lcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgU3RyaW5nQnVpbGRlciB3ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJZm9yIChmaW5hbCBTdHJpbmcgbiA6IHBhY2tOYW1lcykgeworCQlmb3IgKFN0cmluZyBuIDogcGFja05hbWVzKSB7CiAJCQl3LmFwcGVuZCgiUCAiKTsgLy8kTk9OLU5MUy0xJAogCQkJdy5hcHBlbmQobik7CiAJCQl3LmFwcGVuZCgnXG4nKTsKQEAgLTM2MSw3ICszNjEsNyBAQCB2b2lkIHdyaXRlSW5mb1BhY2tzKGZpbmFsIENvbGxlY3Rpb248U3RyaW5nPiBwYWNrTmFtZXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJICogICAgICAgICAgICAgZXhpc3RzLCBvciBhZnRlciBpdCB3YXMgZGV0ZXJtaW5lZCB0byBleGlzdCBidXQgYmVmb3JlIHRoZQogCSAqICAgICAgICAgICAgIHN0cmVhbSBjb3VsZCBiZSBjcmVhdGVkLgogCSAqLwotCUJ1ZmZlcmVkUmVhZGVyIG9wZW5SZWFkZXIoZmluYWwgU3RyaW5nIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJQnVmZmVyZWRSZWFkZXIgb3BlblJlYWRlcihTdHJpbmcgcGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgSW5wdXRTdHJlYW0gaXMgPSBvcGVuKHBhdGgpLmluOwogCQlyZXR1cm4gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpcywgQ29uc3RhbnRzLkNIQVJTRVQpKTsKIAl9CkBAIC00MTQsNyArNDE0LDcgQEAgQ29sbGVjdGlvbjxXYWxrUmVtb3RlT2JqZWN0RGF0YWJhc2U+IHJlYWRBbHRlcm5hdGVzKGZpbmFsIFN0cmluZyBsaXN0UGF0aCkKIAkgKiBAdGhyb3dzIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLlRyYW5zcG9ydEV4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIGFuIGVycm9yIG9jY3VycmVkIHJlYWRpbmcgZnJvbSB0aGUgcGFja2VkIHJlZnMgZmlsZS4KIAkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWFkUGFja2VkUmVmcyhmaW5hbCBNYXA8U3RyaW5nLCBSZWY+IGF2YWlsKQorCXByb3RlY3RlZCB2b2lkIHJlYWRQYWNrZWRSZWZzKE1hcDxTdHJpbmcsIFJlZj4gYXZhaWwpCiAJCQl0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKIAkJdHJ5IChCdWZmZXJlZFJlYWRlciBiciA9IG9wZW5SZWFkZXIoUk9PVF9ESVIgKyBDb25zdGFudHMuUEFDS0VEX1JFRlMpKSB7CiAJCQlyZWFkUGFja2VkUmVmc0ltcGwoYXZhaWwsIGJyKTsKQEAgLTQ3NSw3ICs0NzUsNyBAQCBzdGF0aWMgZmluYWwgY2xhc3MgRmlsZVN0cmVhbSB7CiAJCSAqICAgICAgICAgICAgc3RyZWFtIGNvbnRhaW5pbmcgdGhlIGZpbGUgZGF0YS4gVGhpcyBzdHJlYW0gd2lsbCBiZQogCQkgKiAgICAgICAgICAgIGNsb3NlZCBieSB0aGUgY2FsbGVyIHdoZW4gcmVhZGluZyBpcyBjb21wbGV0ZS4KIAkJICovCi0JCUZpbGVTdHJlYW0oZmluYWwgSW5wdXRTdHJlYW0gaSkgeworCQlGaWxlU3RyZWFtKElucHV0U3RyZWFtIGkpIHsKIAkJCWluID0gaTsKIAkJCWxlbmd0aCA9IC0xOwogCQl9CkBAIC00OTAsNyArNDkwLDcgQEAgc3RhdGljIGZpbmFsIGNsYXNzIEZpbGVTdHJlYW0gewogCQkgKiAgICAgICAgICAgIHRvdGFsIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgZm9yIHJlYWRpbmcgdGhyb3VnaAogCQkgKiAgICAgICAgICAgIDxjb2RlPmk8L2NvZGU+LgogCQkgKi8KLQkJRmlsZVN0cmVhbShmaW5hbCBJbnB1dFN0cmVhbSBpLCBmaW5hbCBsb25nIG4pIHsKKwkJRmlsZVN0cmVhbShJbnB1dFN0cmVhbSBpLCBsb25nIG4pIHsKIAkJCWluID0gaTsKIAkJCWxlbmd0aCA9IG47CiAJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L3Jlc29sdmVyL0ZpbGVSZXNvbHZlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvcmVzb2x2ZXIvRmlsZVJlc29sdmVyLmphdmEKaW5kZXggMTZhNmY0YS4uNjBhY2QyZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvcmVzb2x2ZXIvRmlsZVJlc29sdmVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvcmVzb2x2ZXIvRmlsZVJlc29sdmVyLmphdmEKQEAgLTg3LDcgKzg3LDcgQEAgcHVibGljIEZpbGVSZXNvbHZlcigpIHsKIAkgKiAgICAgICAgICAgIGlmIHRydWUsIGV4cG9ydHMgYWxsIHJlcG9zaXRvcmllcywgaWdub3JpbmcgdGhlIGNoZWNrIGZvciB0aGUKIAkgKiAgICAgICAgICAgIHtAY29kZSBnaXQtZGFlbW9uLWV4cG9ydC1va30gZmlsZXMuCiAJICovCi0JcHVibGljIEZpbGVSZXNvbHZlcihmaW5hbCBGaWxlIGJhc2VQYXRoLCBmaW5hbCBib29sZWFuIGV4cG9ydEFsbCkgeworCXB1YmxpYyBGaWxlUmVzb2x2ZXIoRmlsZSBiYXNlUGF0aCwgYm9vbGVhbiBleHBvcnRBbGwpIHsKIAkJdGhpcygpOwogCQlleHBvcnREaXJlY3RvcnkoYmFzZVBhdGgpOwogCQlzZXRFeHBvcnRBbGwoZXhwb3J0QWxsKTsKQEAgLTk1LDcgKzk1LDcgQEAgcHVibGljIEZpbGVSZXNvbHZlcihmaW5hbCBGaWxlIGJhc2VQYXRoLCBmaW5hbCBib29sZWFuIGV4cG9ydEFsbCkgewogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVwb3NpdG9yeSBvcGVuKGZpbmFsIEMgcmVxLCBmaW5hbCBTdHJpbmcgbmFtZSkKKwlwdWJsaWMgUmVwb3NpdG9yeSBvcGVuKEMgcmVxLCBTdHJpbmcgbmFtZSkKIAkJCXRocm93cyBSZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb24sIFNlcnZpY2VOb3RFbmFibGVkRXhjZXB0aW9uIHsKIAkJaWYgKGlzVW5yZWFzb25hYmxlTmFtZShuYW1lKSkKIAkJCXRocm93IG5ldyBSZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb24obmFtZSk7CkBAIC0xNzUsNyArMTc1LDcgQEAgcHVibGljIGJvb2xlYW4gaXNFeHBvcnRBbGwoKSB7CiAJICoKIAkgKiBAcGFyYW0gZXhwb3J0IGEgYm9vbGVhbi4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeHBvcnRBbGwoZmluYWwgYm9vbGVhbiBleHBvcnQpIHsKKwlwdWJsaWMgdm9pZCBzZXRFeHBvcnRBbGwoYm9vbGVhbiBleHBvcnQpIHsKIAkJZXhwb3J0QWxsID0gZXhwb3J0OwogCX0KIApAQCAtMjAyLDcgKzIwMiw3IEBAIHB1YmxpYyB2b2lkIGV4cG9ydFJlcG9zaXRvcnkoU3RyaW5nIG5hbWUsIFJlcG9zaXRvcnkgZGIpIHsKIAkgKiAgICAgICAgICAgIGdpdCByZXBvc2l0b3J5LCBidXQgYW55IGRpcmVjdG9yeSBiZWxvdyBpdCB3aGljaCBoYXMgYSBmaWxlCiAJICogICAgICAgICAgICBuYW1lZCA8Y29kZT5naXQtZGFlbW9uLWV4cG9ydC1vazwvY29kZT4gd2lsbCBiZSBwdWJsaXNoZWQuCiAJICovCi0JcHVibGljIHZvaWQgZXhwb3J0RGlyZWN0b3J5KGZpbmFsIEZpbGUgZGlyKSB7CisJcHVibGljIHZvaWQgZXhwb3J0RGlyZWN0b3J5KEZpbGUgZGlyKSB7CiAJCWV4cG9ydEJhc2UuYWRkKGRpcik7CiAJfQogCkBAIC0yNDAsNyArMjQwLDcgQEAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG5hbWVXaXRoRG90R2l0KFN0cmluZyBuYW1lKSB7CiAJCXJldHVybiBuYW1lICsgQ29uc3RhbnRzLkRPVF9HSVRfRVhUOwogCX0KIAotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNVbnJlYXNvbmFibGVOYW1lKGZpbmFsIFN0cmluZyBuYW1lKSB7CisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1VucmVhc29uYWJsZU5hbWUoU3RyaW5nIG5hbWUpIHsKIAkJaWYgKG5hbWUubGVuZ3RoKCkgPT0gMCkKIAkJCXJldHVybiB0cnVlOyAvLyBubyBlbXB0eSBwYXRocwogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL0Fic3RyYWN0VHJlZUl0ZXJhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL0Fic3RyYWN0VHJlZUl0ZXJhdG9yLmphdmEKaW5kZXggYTc5MDBmMC4uNDcwZWQwMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9BYnN0cmFjdFRyZWVJdGVyYXRvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvQWJzdHJhY3RUcmVlSXRlcmF0b3IuamF2YQpAQCAtMTc2LDcgKzE3Niw3IEBAIHByb3RlY3RlZCBBYnN0cmFjdFRyZWVJdGVyYXRvcigpIHsKIAkgKiAgICAgICAgICAgIHJvb3Qgb2YgdGhlIHJlcG9zaXRvcnkuIEEgdHJhaWxpbmcgc2xhc2ggKCcvJykgaXMKIAkgKiAgICAgICAgICAgIGF1dG9tYXRpY2FsbHkgYXBwZW5kZWQgaWYgdGhlIHByZWZpeCBkb2VzIG5vdCBlbmQgaW4gJy8nLgogCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdFRyZWVJdGVyYXRvcihmaW5hbCBTdHJpbmcgcHJlZml4KSB7CisJcHJvdGVjdGVkIEFic3RyYWN0VHJlZUl0ZXJhdG9yKFN0cmluZyBwcmVmaXgpIHsKIAkJcGFyZW50ID0gbnVsbDsKIAogCQlpZiAocHJlZml4ICE9IG51bGwgJiYgcHJlZml4Lmxlbmd0aCgpID4gMCkgewpAQCAtMjEwLDcgKzIxMCw3IEBAIHByb3RlY3RlZCBBYnN0cmFjdFRyZWVJdGVyYXRvcihmaW5hbCBTdHJpbmcgcHJlZml4KSB7CiAJICogICAgICAgICAgICByb290IG9mIHRoZSByZXBvc2l0b3J5LiBBIHRyYWlsaW5nIHNsYXNoICgnLycpIGlzCiAJICogICAgICAgICAgICBhdXRvbWF0aWNhbGx5IGFwcGVuZGVkIGlmIHRoZSBwcmVmaXggZG9lcyBub3QgZW5kIGluICcvJy4KIAkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3RUcmVlSXRlcmF0b3IoZmluYWwgYnl0ZVtdIHByZWZpeCkgeworCXByb3RlY3RlZCBBYnN0cmFjdFRyZWVJdGVyYXRvcihieXRlW10gcHJlZml4KSB7CiAJCXBhcmVudCA9IG51bGw7CiAKIAkJaWYgKHByZWZpeCAhPSBudWxsICYmIHByZWZpeC5sZW5ndGggPiAwKSB7CkBAIC0yMzIsNyArMjMyLDcgQEAgcHJvdGVjdGVkIEFic3RyYWN0VHJlZUl0ZXJhdG9yKGZpbmFsIGJ5dGVbXSBwcmVmaXgpIHsKIAkgKiBAcGFyYW0gcAogCSAqICAgICAgICAgICAgcGFyZW50IHRyZWUgaXRlcmF0b3IuCiAJICovCi0JcHJvdGVjdGVkIEFic3RyYWN0VHJlZUl0ZXJhdG9yKGZpbmFsIEFic3RyYWN0VHJlZUl0ZXJhdG9yIHApIHsKKwlwcm90ZWN0ZWQgQWJzdHJhY3RUcmVlSXRlcmF0b3IoQWJzdHJhY3RUcmVlSXRlcmF0b3IgcCkgewogCQlwYXJlbnQgPSBwOwogCQlwYXRoID0gcC5wYXRoOwogCQlwYXRoT2Zmc2V0ID0gcC5wYXRoTGVuICsgMTsKQEAgLTI3NSw3ICsyNzUsNyBAQCBwcm90ZWN0ZWQgQWJzdHJhY3RUcmVlSXRlcmF0b3IoZmluYWwgQWJzdHJhY3RUcmVlSXRlcmF0b3IgcCwKIAkgKiAgICAgICAgICAgIG51bWJlciBvZiBsaXZlIGJ5dGVzIGluIHRoZSBwYXRoIGJ1ZmZlci4gVGhpcyBtYW55IGJ5dGVzIHdpbGwKIAkgKiAgICAgICAgICAgIGJlIG1vdmVkIGludG8gdGhlIGxhcmdlciBidWZmZXIuCiAJICovCi0JcHJvdGVjdGVkIHZvaWQgZ3Jvd1BhdGgoZmluYWwgaW50IGxlbikgeworCXByb3RlY3RlZCB2b2lkIGdyb3dQYXRoKGludCBsZW4pIHsKIAkJc2V0UGF0aENhcGFjaXR5KHBhdGgubGVuZ3RoIDw8IDEsIGxlbik7CiAJfQogCkBAIC0yODcsNyArMjg3LDcgQEAgcHJvdGVjdGVkIHZvaWQgZ3Jvd1BhdGgoZmluYWwgaW50IGxlbikgewogCSAqIEBwYXJhbSBsZW4KIAkgKiAgICAgICAgICAgIHRoZSBhbW91bnQgb2YgbGl2ZSBieXRlcyBpbiBwYXRoIGJ1ZmZlcgogCSAqLwotCXByb3RlY3RlZCB2b2lkIGVuc3VyZVBhdGhDYXBhY2l0eShmaW5hbCBpbnQgY2FwYWNpdHksIGZpbmFsIGludCBsZW4pIHsKKwlwcm90ZWN0ZWQgdm9pZCBlbnN1cmVQYXRoQ2FwYWNpdHkoaW50IGNhcGFjaXR5LCBpbnQgbGVuKSB7CiAJCWlmIChwYXRoLmxlbmd0aCA+PSBjYXBhY2l0eSkKIAkJCXJldHVybjsKIAkJZmluYWwgYnl0ZVtdIG8gPSBwYXRoOwpAQCAtMzIyLDExICszMjIsMTEgQEAgcHJpdmF0ZSB2b2lkIHNldFBhdGhDYXBhY2l0eShpbnQgY2FwYWNpdHksIGludCBsZW4pIHsKIAkgKiBAcmV0dXJuIC0xIGlmIHRoaXMgZW50cnkgc29ydHMgZmlyc3Q7IDAgaWYgdGhlIGVudHJpZXMgYXJlIGVxdWFsOyAxIGlmCiAJICogICAgICAgICBwJ3MgZW50cnkgc29ydHMgZmlyc3QuCiAJICovCi0JcHVibGljIGludCBwYXRoQ29tcGFyZShmaW5hbCBBYnN0cmFjdFRyZWVJdGVyYXRvciBwKSB7CisJcHVibGljIGludCBwYXRoQ29tcGFyZShBYnN0cmFjdFRyZWVJdGVyYXRvciBwKSB7CiAJCXJldHVybiBwYXRoQ29tcGFyZShwLCBwLm1vZGUpOwogCX0KIAotCWludCBwYXRoQ29tcGFyZShmaW5hbCBBYnN0cmFjdFRyZWVJdGVyYXRvciBwLCBmaW5hbCBpbnQgcE1vZGUpIHsKKwlpbnQgcGF0aENvbXBhcmUoQWJzdHJhY3RUcmVlSXRlcmF0b3IgcCwgaW50IHBNb2RlKSB7CiAJCS8vIEl0cyBjb21tb24gd2hlbiB3ZSBhcmUgYSBzdWJ0cmVlIGZvciBib3RoIHBhcmVudHMgdG8gbWF0Y2g7CiAJCS8vIHdoZW4gdGhpcyBoYXBwZW5zIGV2ZXJ5dGhpbmcgaW4gcGF0aFswLi5jUG9zXSBpcyBrbm93biB0bwogCQkvLyBiZSBlcXVhbCBhbmQgZG9lcyBub3QgcmVxdWlyZSBldmFsdWF0aW9uIGFnYWluLgpAQCAtNDIwLDcgKzQyMCw3IEBAIHByaXZhdGUgc3RhdGljIGludCBhbHJlYWR5TWF0Y2goQWJzdHJhY3RUcmVlSXRlcmF0b3IgYSwKIAkgKiAgICAgICAgICAgIHRoZSBvdGhlciBpdGVyYXRvciB0byB0ZXN0IGFnYWluc3QuCiAJICogQHJldHVybiB0cnVlIGlmIGJvdGggaXRlcmF0b3JzIGhhdmUgdGhlIHNhbWUgb2JqZWN0IGlkOyBmYWxzZSBvdGhlcndpc2UuCiAJICovCi0JcHVibGljIGJvb2xlYW4gaWRFcXVhbChmaW5hbCBBYnN0cmFjdFRyZWVJdGVyYXRvciBvdGhlckl0ZXJhdG9yKSB7CisJcHVibGljIGJvb2xlYW4gaWRFcXVhbChBYnN0cmFjdFRyZWVJdGVyYXRvciBvdGhlckl0ZXJhdG9yKSB7CiAJCXJldHVybiBPYmplY3RJZC5lcXVhbHMoaWRCdWZmZXIoKSwgaWRPZmZzZXQoKSwKIAkJCQlvdGhlckl0ZXJhdG9yLmlkQnVmZmVyKCksIG90aGVySXRlcmF0b3IuaWRPZmZzZXQoKSk7CiAJfQpAQCAtNDQ3LDcgKzQ0Nyw3IEBAIHB1YmxpYyBPYmplY3RJZCBnZXRFbnRyeU9iamVjdElkKCkgewogCSAqIEBwYXJhbSBvdXQKIAkgKiAgICAgICAgICAgIGJ1ZmZlciB0byBjb3B5IHRoZSBvYmplY3QgaWQgaW50by4KIAkgKi8KLQlwdWJsaWMgdm9pZCBnZXRFbnRyeU9iamVjdElkKGZpbmFsIE11dGFibGVPYmplY3RJZCBvdXQpIHsKKwlwdWJsaWMgdm9pZCBnZXRFbnRyeU9iamVjdElkKE11dGFibGVPYmplY3RJZCBvdXQpIHsKIAkJb3V0LmZyb21SYXcoaWRCdWZmZXIoKSwgaWRPZmZzZXQoKSk7CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL0Nhbm9uaWNhbFRyZWVQYXJzZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvQ2Fub25pY2FsVHJlZVBhcnNlci5qYXZhCmluZGV4IDcxMTEzYTYuLjAxOTk2ODggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvQ2Fub25pY2FsVHJlZVBhcnNlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvQ2Fub25pY2FsVHJlZVBhcnNlci5qYXZhCkBAIC0xMTksNyArMTE5LDcgQEAgcHVibGljIENhbm9uaWNhbFRyZWVQYXJzZXIoZmluYWwgYnl0ZVtdIHByZWZpeCwgZmluYWwgT2JqZWN0UmVhZGVyIHJlYWRlciwKIAkJcmVzZXQocmVhZGVyLCB0cmVlSWQpOwogCX0KIAotCXByaXZhdGUgQ2Fub25pY2FsVHJlZVBhcnNlcihmaW5hbCBDYW5vbmljYWxUcmVlUGFyc2VyIHApIHsKKwlwcml2YXRlIENhbm9uaWNhbFRyZWVQYXJzZXIoQ2Fub25pY2FsVHJlZVBhcnNlciBwKSB7CiAJCXN1cGVyKHApOwogCX0KIApAQCAtMTQwLDcgKzE0MCw3IEBAIHB1YmxpYyBDYW5vbmljYWxUcmVlUGFyc2VyIGdldFBhcmVudCgpIHsKIAkgKiBAcGFyYW0gdHJlZURhdGEKIAkgKiAgICAgICAgICAgIHRoZSByYXcgdHJlZSBjb250ZW50LgogCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KGZpbmFsIGJ5dGVbXSB0cmVlRGF0YSkgeworCXB1YmxpYyB2b2lkIHJlc2V0KGJ5dGVbXSB0cmVlRGF0YSkgewogCQlhdHRyaWJ1dGVzTm9kZSA9IG51bGw7CiAJCXJhdyA9IHRyZWVEYXRhOwogCQlwcmV2UHRyID0gLTE7CkBAIC0yMTksNyArMjE5LDcgQEAgcHVibGljIENhbm9uaWNhbFRyZWVQYXJzZXIgbmV4dCgpIHsKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICBhIGxvb3NlIG9iamVjdCBvciBwYWNrIGZpbGUgY291bGQgbm90IGJlIHJlYWQuCiAJICovCi0JcHVibGljIHZvaWQgcmVzZXQoZmluYWwgT2JqZWN0UmVhZGVyIHJlYWRlciwgZmluYWwgQW55T2JqZWN0SWQgaWQpCisJcHVibGljIHZvaWQgcmVzZXQoT2JqZWN0UmVhZGVyIHJlYWRlciwgQW55T2JqZWN0SWQgaWQpCiAJCQl0aHJvd3MgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQlyZXNldChyZWFkZXIub3BlbihpZCwgT0JKX1RSRUUpLmdldENhY2hlZEJ5dGVzKCkpOwogCX0KQEAgLTI2Miw3ICsyNjIsNyBAQCBwdWJsaWMgZmluYWwgQ2Fub25pY2FsVHJlZVBhcnNlciBjcmVhdGVTdWJ0cmVlSXRlcmF0b3IwKAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgQ2Fub25pY2FsVHJlZVBhcnNlciBjcmVhdGVTdWJ0cmVlSXRlcmF0b3IoZmluYWwgT2JqZWN0UmVhZGVyIHJlYWRlcikKKwlwdWJsaWMgQ2Fub25pY2FsVHJlZVBhcnNlciBjcmVhdGVTdWJ0cmVlSXRlcmF0b3IoT2JqZWN0UmVhZGVyIHJlYWRlcikKIAkJCXRocm93cyBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCXJldHVybiBjcmVhdGVTdWJ0cmVlSXRlcmF0b3IocmVhZGVyLCBuZXcgTXV0YWJsZU9iamVjdElkKCkpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvRW1wdHlUcmVlSXRlcmF0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvRW1wdHlUcmVlSXRlcmF0b3IuamF2YQppbmRleCA1OTZkM2QwLi5mNWQ0NWM3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL0VtcHR5VHJlZUl0ZXJhdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9FbXB0eVRyZWVJdGVyYXRvci5qYXZhCkBAIC02Myw3ICs2Myw3IEBAIHB1YmxpYyBFbXB0eVRyZWVJdGVyYXRvcigpIHsKIAkJLy8gQ3JlYXRlIGEgcm9vdCBlbXB0eSB0cmVlLgogCX0KIAotCUVtcHR5VHJlZUl0ZXJhdG9yKGZpbmFsIEFic3RyYWN0VHJlZUl0ZXJhdG9yIHApIHsKKwlFbXB0eVRyZWVJdGVyYXRvcihBYnN0cmFjdFRyZWVJdGVyYXRvciBwKSB7CiAJCXN1cGVyKHApOwogCQlwYXRoTGVuID0gcGF0aE9mZnNldDsKIAl9CkBAIC05Miw3ICs5Miw3IEBAIHB1YmxpYyBFbXB0eVRyZWVJdGVyYXRvcihmaW5hbCBBYnN0cmFjdFRyZWVJdGVyYXRvciBwLAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgQWJzdHJhY3RUcmVlSXRlcmF0b3IgY3JlYXRlU3VidHJlZUl0ZXJhdG9yKGZpbmFsIE9iamVjdFJlYWRlciByZWFkZXIpCisJcHVibGljIEFic3RyYWN0VHJlZUl0ZXJhdG9yIGNyZWF0ZVN1YnRyZWVJdGVyYXRvcihPYmplY3RSZWFkZXIgcmVhZGVyKQogCQkJdGhyb3dzIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJcmV0dXJuIG5ldyBFbXB0eVRyZWVJdGVyYXRvcih0aGlzKTsKIAl9CkBAIC0xNDEsMTMgKzE0MSwxMyBAQCBwdWJsaWMgYm9vbGVhbiBlb2YoKSB7CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5leHQoZmluYWwgaW50IGRlbHRhKSB0aHJvd3MgQ29ycnVwdE9iamVjdEV4Y2VwdGlvbiB7CisJcHVibGljIHZvaWQgbmV4dChpbnQgZGVsdGEpIHRocm93cyBDb3JydXB0T2JqZWN0RXhjZXB0aW9uIHsKIAkJLy8gRG8gbm90aGluZy4KIAl9CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGJhY2soZmluYWwgaW50IGRlbHRhKSB0aHJvd3MgQ29ycnVwdE9iamVjdEV4Y2VwdGlvbiB7CisJcHVibGljIHZvaWQgYmFjayhpbnQgZGVsdGEpIHRocm93cyBDb3JydXB0T2JqZWN0RXhjZXB0aW9uIHsKIAkJLy8gRG8gbm90aGluZy4KIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvRmlsZVRyZWVJdGVyYXRvci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9GaWxlVHJlZUl0ZXJhdG9yLmphdmEKaW5kZXggOGRmNzY0ZC4uMjRiOWFjMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9GaWxlVHJlZUl0ZXJhdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9GaWxlVHJlZUl0ZXJhdG9yLmphdmEKQEAgLTUyLDYgKzUyLDcgQEAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmRpcmNhY2hlLkRpckNhY2hlSXRlcmF0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuRmlsZU1vZGU7CkBAIC02Nyw2ICs2OCw3IEBACiAgKiB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5UcmVlV2Fsa30uCiAgKi8KIHB1YmxpYyBjbGFzcyBGaWxlVHJlZUl0ZXJhdG9yIGV4dGVuZHMgV29ya2luZ1RyZWVJdGVyYXRvciB7CisKIAkvKioKIAkgKiB0aGUgc3RhcnRpbmcgZGlyZWN0b3J5IG9mIHRoaXMgSXRlcmF0b3IuIEFsbCBlbnRyaWVzIGFyZSBsb2NhdGVkIGRpcmVjdGx5CiAJICogaW4gdGhpcyBkaXJlY3RvcnkuCkBAIC0xMzAsNyArMTMyLDcgQEAgcHVibGljIEZpbGVUcmVlSXRlcmF0b3IoUmVwb3NpdG9yeSByZXBvLCBGaWxlTW9kZVN0cmF0ZWd5IGZpbGVNb2RlU3RyYXRlZ3kpIHsKIAkgKiBAcGFyYW0gb3B0aW9ucwogCSAqICAgICAgICAgICAgd29ya2luZyB0cmVlIG9wdGlvbnMgdG8gYmUgdXNlZAogCSAqLwotCXB1YmxpYyBGaWxlVHJlZUl0ZXJhdG9yKGZpbmFsIEZpbGUgcm9vdCwgRlMgZnMsIFdvcmtpbmdUcmVlT3B0aW9ucyBvcHRpb25zKSB7CisJcHVibGljIEZpbGVUcmVlSXRlcmF0b3IoRmlsZSByb290LCBGUyBmcywgV29ya2luZ1RyZWVPcHRpb25zIG9wdGlvbnMpIHsKIAkJdGhpcyhyb290LCBmcywgb3B0aW9ucywgRGVmYXVsdEZpbGVNb2RlU3RyYXRlZ3kuSU5TVEFOQ0UpOwogCX0KIApAQCAtMTcxLDI3ICsxNzMsNiBAQCBwdWJsaWMgRmlsZVRyZWVJdGVyYXRvcihmaW5hbCBGaWxlIHJvb3QsIEZTIGZzLCBXb3JraW5nVHJlZU9wdGlvbnMgb3B0aW9ucywKIAkgKiAgICAgICAgICAgIHRoZSBmaWxlIHN5c3RlbSBhYnN0cmFjdGlvbiB3aGljaCB3aWxsIGJlIG5lY2Vzc2FyeSB0byBwZXJmb3JtCiAJICogICAgICAgICAgICBjZXJ0YWluIGZpbGUgc3lzdGVtIG9wZXJhdGlvbnMuCiAJICogQHNpbmNlIDQuMwotCSAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI0ZpbGVUcmVlSXRlcmF0b3IoRmlsZVRyZWVJdGVyYXRvciwgRmlsZSwgRlMpfQotCSAqICAgICAgICAgICAgIGluc3RlYWQuCi0JICovCi0JQERlcHJlY2F0ZWQKLQlwcm90ZWN0ZWQgRmlsZVRyZWVJdGVyYXRvcihmaW5hbCBXb3JraW5nVHJlZUl0ZXJhdG9yIHAsIGZpbmFsIEZpbGUgcm9vdCwKLQkJCUZTIGZzKSB7Ci0JCXRoaXMocCwgcm9vdCwgZnMsIERlZmF1bHRGaWxlTW9kZVN0cmF0ZWd5LklOU1RBTkNFKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgaXRlcmF0b3IgdG8gdHJhdmVyc2UgYSBzdWJkaXJlY3RvcnkuCi0JICoKLQkgKiBAcGFyYW0gcAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBpdGVyYXRvciB3ZSB3ZXJlIGNyZWF0ZWQgZnJvbS4KLQkgKiBAcGFyYW0gcm9vdAotCSAqICAgICAgICAgICAgdGhlIHN1YmRpcmVjdG9yeS4gVGhpcyBzaG91bGQgYmUgYSBkaXJlY3RvcnkgY29udGFpbmVkIHdpdGhpbgotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBkaXJlY3RvcnkuCi0JICogQHBhcmFtIGZzCi0JICogICAgICAgICAgICB0aGUgZmlsZSBzeXN0ZW0gYWJzdHJhY3Rpb24gd2hpY2ggd2lsbCBiZSBuZWNlc3NhcnkgdG8gcGVyZm9ybQotCSAqICAgICAgICAgICAgY2VydGFpbiBmaWxlIHN5c3RlbSBvcGVyYXRpb25zLgotCSAqIEBzaW5jZSA0LjMKIAkgKi8KIAlwcm90ZWN0ZWQgRmlsZVRyZWVJdGVyYXRvcihmaW5hbCBGaWxlVHJlZUl0ZXJhdG9yIHAsIGZpbmFsIEZpbGUgcm9vdCwKIAkJCUZTIGZzKSB7CkBAIC0yMjYsMTkgKzIwNywzOSBAQCBwcm90ZWN0ZWQgRmlsZVRyZWVJdGVyYXRvcihmaW5hbCBXb3JraW5nVHJlZUl0ZXJhdG9yIHAsIGZpbmFsIEZpbGUgcm9vdCwKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIEFic3RyYWN0VHJlZUl0ZXJhdG9yIGNyZWF0ZVN1YnRyZWVJdGVyYXRvcihmaW5hbCBPYmplY3RSZWFkZXIgcmVhZGVyKQorCXB1YmxpYyBBYnN0cmFjdFRyZWVJdGVyYXRvciBjcmVhdGVTdWJ0cmVlSXRlcmF0b3IoT2JqZWN0UmVhZGVyIHJlYWRlcikKIAkJCXRocm93cyBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgRmlsZVRyZWVJdGVyYXRvcih0aGlzLCAoKEZpbGVFbnRyeSkgY3VycmVudCgpKS5nZXRGaWxlKCksIGZzLCBmaWxlTW9kZVN0cmF0ZWd5KTsKKwkJaWYgKCF3YWxrc0lnbm9yZWREaXJlY3RvcmllcygpICYmIGlzRW50cnlJZ25vcmVkKCkpIHsKKwkJCURpckNhY2hlSXRlcmF0b3IgaXRlcmF0b3IgPSBnZXREaXJDYWNoZUl0ZXJhdG9yKCk7CisJCQlpZiAoaXRlcmF0b3IgPT0gbnVsbCkgeworCQkJCXJldHVybiBuZXcgRW1wdHlUcmVlSXRlcmF0b3IodGhpcyk7CisJCQl9CisJCQkvLyBPbmx5IGVudGVyIGlmIHdlIGhhdmUgYW4gYXNzb2NpYXRlZCBEaXJDYWNoZUl0ZXJhdG9yIHRoYXQgaXMKKwkJCS8vIGF0IHRoZSBzYW1lIGVudHJ5ICh3aGljaCBpbmRpY2F0ZXMgdGhlcmUgaXMgc29tZSBhbHJlYWR5CisJCQkvLyB0cmFja2VkIGZpbGUgdW5kZXJuZWF0aCB0aGlzIGRpcmVjdG9yeSkuIE90aGVyd2lzZSB0aGUKKwkJCS8vIGRpcmVjdG9yeSBpcyBpbmRlZWQgaWdub3JlZCBhbmQgY2FuIGJlIHNraXBwZWQgZW50aXJlbHkuCisJCX0KKwkJcmV0dXJuIGVudGVyU3VidHJlZSgpOworCX0KKworCisJLyoqCisJICogQ3JlYXRlIGEgbmV3IGl0ZXJhdG9yIGZvciB0aGUgY3VycmVudCBlbnRyeSdzIHN1YnRyZWUuCisJICogPHA+CisJICogVGhlIHBhcmVudCByZWZlcmVuY2Ugb2YgdGhlIGl0ZXJhdG9yIG11c3QgYmUgPGNvZGU+dGhpczwvY29kZT4sIG90aGVyd2lzZQorCSAqIHRoZSBjYWxsZXIgd291bGQgbm90IGJlIGFibGUgdG8gZXhpdCBvdXQgb2YgdGhlIHN1YnRyZWUgaXRlcmF0b3IKKwkgKiBjb3JyZWN0bHkgYW5kIHJldHVybiB0byBjb250aW51ZSB3YWxraW5nIDxjb2RlPnRoaXM8L2NvZGU+LgorCSAqCisJICogQHJldHVybiBhIG5ldyBpdGVyYXRvciB0aGF0IHdhbGtzIG92ZXIgdGhlIGN1cnJlbnQgc3VidHJlZS4KKwkgKiBAc2luY2UgNS4wCisJICovCisJcHJvdGVjdGVkIEFic3RyYWN0VHJlZUl0ZXJhdG9yIGVudGVyU3VidHJlZSgpIHsKKwkJcmV0dXJuIG5ldyBGaWxlVHJlZUl0ZXJhdG9yKHRoaXMsICgoRmlsZUVudHJ5KSBjdXJyZW50KCkpLmdldEZpbGUoKSwgZnMsCisJCQkJZmlsZU1vZGVTdHJhdGVneSk7CiAJfQogCiAJcHJpdmF0ZSBFbnRyeVtdIGVudHJpZXMoKSB7Ci0JCWZpbmFsIEZpbGVbXSBhbGwgPSBkaXJlY3RvcnkubGlzdEZpbGVzKCk7Ci0JCWlmIChhbGwgPT0gbnVsbCkKLQkJCXJldHVybiBFT0Y7Ci0JCWZpbmFsIEVudHJ5W10gciA9IG5ldyBFbnRyeVthbGwubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByLmxlbmd0aDsgaSsrKQotCQkJcltpXSA9IG5ldyBGaWxlRW50cnkoYWxsW2ldLCBmcywgZmlsZU1vZGVTdHJhdGVneSk7Ci0JCXJldHVybiByOworCQlyZXR1cm4gZnMubGlzdChkaXJlY3RvcnksIGZpbGVNb2RlU3RyYXRlZ3kpOwogCX0KIAogCS8qKgpAQCAtMjY3LDcgKzI2OCw3IEBAIHB1YmxpYyBpbnRlcmZhY2UgRmlsZU1vZGVTdHJhdGVneSB7CiAJICoKIAkgKiBAc2luY2UgNC4zCiAJICovCi0Jc3RhdGljIHB1YmxpYyBjbGFzcyBEZWZhdWx0RmlsZU1vZGVTdHJhdGVneSBpbXBsZW1lbnRzIEZpbGVNb2RlU3RyYXRlZ3kgeworCXB1YmxpYyBzdGF0aWMgY2xhc3MgRGVmYXVsdEZpbGVNb2RlU3RyYXRlZ3kgaW1wbGVtZW50cyBGaWxlTW9kZVN0cmF0ZWd5IHsKIAkJLyoqCiAJCSAqIGEgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBkZWZhdWx0IEZpbGVNb2RlU3RyYXRlZ3kKIAkJICovCkBAIC0zMDAsNyArMzAxLDcgQEAgcHVibGljIEZpbGVNb2RlIGdldE1vZGUoRmlsZSBmLCBGUy5BdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKIAkgKgogCSAqIEBzaW5jZSA0LjMKIAkgKi8KLQlzdGF0aWMgcHVibGljIGNsYXNzIE5vR2l0bGlua3NTdHJhdGVneSBpbXBsZW1lbnRzIEZpbGVNb2RlU3RyYXRlZ3kgeworCXB1YmxpYyBzdGF0aWMgY2xhc3MgTm9HaXRsaW5rc1N0cmF0ZWd5IGltcGxlbWVudHMgRmlsZU1vZGVTdHJhdGVneSB7CiAKIAkJLyoqCiAJCSAqIGEgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBkZWZhdWx0IEZpbGVNb2RlU3RyYXRlZ3kKQEAgLTMyNSw3ICszMjYsNyBAQCBwdWJsaWMgRmlsZU1vZGUgZ2V0TW9kZShGaWxlIGYsIEZTLkF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewogCS8qKgogCSAqIFdyYXBwZXIgZm9yIGEgc3RhbmRhcmQgSmF2YSBJTyBmaWxlCiAJICovCi0Jc3RhdGljIHB1YmxpYyBjbGFzcyBGaWxlRW50cnkgZXh0ZW5kcyBFbnRyeSB7CisJcHVibGljIHN0YXRpYyBjbGFzcyBGaWxlRW50cnkgZXh0ZW5kcyBFbnRyeSB7CiAJCXByaXZhdGUgZmluYWwgRmlsZU1vZGUgbW9kZTsKIAogCQlwcml2YXRlIEZTLkF0dHJpYnV0ZXMgYXR0cmlidXRlczsKQEAgLTM2NCw2ICszNjUsMjkgQEAgcHVibGljIEZpbGVFbnRyeShGaWxlIGYsIEZTIGZzLCBGaWxlTW9kZVN0cmF0ZWd5IGZpbGVNb2RlU3RyYXRlZ3kpIHsKIAkJCW1vZGUgPSBmaWxlTW9kZVN0cmF0ZWd5LmdldE1vZGUoZiwgYXR0cmlidXRlcyk7CiAJCX0KIAorCQkvKioKKwkJICogQ3JlYXRlIGEgbmV3IGZpbGUgZW50cnkgZ2l2ZW4gdGhlIHNwZWNpZmllZCBGaWxlTW9kZVN0cmF0ZWd5CisJCSAqCisJCSAqIEBwYXJhbSBmCisJCSAqICAgICAgICAgICAgZmlsZQorCQkgKiBAcGFyYW0gZnMKKwkJICogICAgICAgICAgICBmaWxlIHN5c3RlbQorCQkgKiBAcGFyYW0gYXR0cmlidXRlcworCQkgKiAgICAgICAgICAgIG9mIHRoZSBmaWxlCisJCSAqIEBwYXJhbSBmaWxlTW9kZVN0cmF0ZWd5CisJCSAqICAgICAgICAgICAgdGhlIHN0cmF0ZWd5IHRvIHVzZSB3aGVuIGRldGVybWluaW5nIHRoZSBGaWxlTW9kZSBvZiBhCisJCSAqICAgICAgICAgICAgZmlsZTsgY29udHJvbHMgZ2l0bGlua3MgZXRjLgorCQkgKgorCQkgKiBAc2luY2UgNS4wCisJCSAqLworCQlwdWJsaWMgRmlsZUVudHJ5KEZpbGUgZiwgRlMgZnMsIEZTLkF0dHJpYnV0ZXMgYXR0cmlidXRlcywKKwkJCQlGaWxlTW9kZVN0cmF0ZWd5IGZpbGVNb2RlU3RyYXRlZ3kpIHsKKwkJCXRoaXMuZnMgPSBmczsKKwkJCXRoaXMuYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXM7CisJCQlmID0gZnMubm9ybWFsaXplKGYpOworCQkJbW9kZSA9IGZpbGVNb2RlU3RyYXRlZ3kuZ2V0TW9kZShmLCBhdHRyaWJ1dGVzKTsKKwkJfQorCiAJCUBPdmVycmlkZQogCQlwdWJsaWMgRmlsZU1vZGUgZ2V0TW9kZSgpIHsKIAkJCXJldHVybiBtb2RlOwpAQCAtMzg2LDEyICs0MTAsMTIgQEAgcHVibGljIGxvbmcgZ2V0TGFzdE1vZGlmaWVkKCkgewogCiAJCUBPdmVycmlkZQogCQlwdWJsaWMgSW5wdXRTdHJlYW0gb3BlbklucHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCWlmIChmcy5pc1N5bUxpbmsoZ2V0RmlsZSgpKSkKKwkJCWlmIChhdHRyaWJ1dGVzLmlzU3ltYm9saWNMaW5rKCkpIHsKIAkJCQlyZXR1cm4gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGZzLnJlYWRTeW1MaW5rKGdldEZpbGUoKSkKLQkJCQkJCS5nZXRCeXRlcygKLQkJCQkJCUNvbnN0YW50cy5DSEFSQUNURVJfRU5DT0RJTkcpKTsKLQkJCWVsc2UKKwkJCQkJCS5nZXRCeXRlcyhDb25zdGFudHMuQ0hBUkFDVEVSX0VOQ09ESU5HKSk7CisJCQl9IGVsc2UgewogCQkJCXJldHVybiBuZXcgRmlsZUlucHV0U3RyZWFtKGdldEZpbGUoKSk7CisJCQl9CiAJCX0KIAogCQkvKioKQEAgLTQyNiw3ICs0NTAsNyBAQCBwdWJsaWMgRmlsZSBnZXRFbnRyeUZpbGUoKSB7CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXByb3RlY3RlZCBieXRlW10gaWRTdWJtb2R1bGUoZmluYWwgRW50cnkgZSkgeworCXByb3RlY3RlZCBieXRlW10gaWRTdWJtb2R1bGUoRW50cnkgZSkgewogCQlyZXR1cm4gaWRTdWJtb2R1bGUoZ2V0RGlyZWN0b3J5KCksIGUpOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9OYW1lQ29uZmxpY3RUcmVlV2Fsay5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9OYW1lQ29uZmxpY3RUcmVlV2Fsay5qYXZhCmluZGV4IDU1NjBmNzcuLjYxYjEzMGYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvTmFtZUNvbmZsaWN0VHJlZVdhbGsuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL05hbWVDb25mbGljdFRyZWVXYWxrLmphdmEKQEAgLTk5LDcgKzk5LDcgQEAgcHVibGljIGNsYXNzIE5hbWVDb25mbGljdFRyZWVXYWxrIGV4dGVuZHMgVHJlZVdhbGsgewogCSAqIEBwYXJhbSByZXBvCiAJICogICAgICAgICAgICB0aGUgcmVwb3NpdG9yeSB0aGUgd2Fsa2VyIHdpbGwgb2J0YWluIGRhdGEgZnJvbS4KIAkgKi8KLQlwdWJsaWMgTmFtZUNvbmZsaWN0VHJlZVdhbGsoZmluYWwgUmVwb3NpdG9yeSByZXBvKSB7CisJcHVibGljIE5hbWVDb25mbGljdFRyZWVXYWxrKFJlcG9zaXRvcnkgcmVwbykgewogCQlzdXBlcihyZXBvKTsKIAl9CiAKQEAgLTExMiw3ICsxMTIsNyBAQCBwdWJsaWMgTmFtZUNvbmZsaWN0VHJlZVdhbGsoZmluYWwgUmVwb3NpdG9yeSByZXBvKSB7CiAJICogICAgICAgICAgICB0aGUgcmVhZGVyIHRoZSB3YWxrZXIgd2lsbCBvYnRhaW4gdHJlZSBkYXRhIGZyb20uCiAJICogQHNpbmNlIDQuMwogCSAqLwotCXB1YmxpYyBOYW1lQ29uZmxpY3RUcmVlV2FsayhATnVsbGFibGUgUmVwb3NpdG9yeSByZXBvLCBmaW5hbCBPYmplY3RSZWFkZXIgb3IpIHsKKwlwdWJsaWMgTmFtZUNvbmZsaWN0VHJlZVdhbGsoQE51bGxhYmxlIFJlcG9zaXRvcnkgcmVwbywgT2JqZWN0UmVhZGVyIG9yKSB7CiAJCXN1cGVyKHJlcG8sIG9yKTsKIAl9CiAKQEAgLTEyMiw3ICsxMjIsNyBAQCBwdWJsaWMgTmFtZUNvbmZsaWN0VHJlZVdhbGsoQE51bGxhYmxlIFJlcG9zaXRvcnkgcmVwbywgZmluYWwgT2JqZWN0UmVhZGVyIG9yKSB7CiAJICogQHBhcmFtIG9yCiAJICogICAgICAgICAgICB0aGUgcmVhZGVyIHRoZSB3YWxrZXIgd2lsbCBvYnRhaW4gdHJlZSBkYXRhIGZyb20uCiAJICovCi0JcHVibGljIE5hbWVDb25mbGljdFRyZWVXYWxrKGZpbmFsIE9iamVjdFJlYWRlciBvcikgeworCXB1YmxpYyBOYW1lQ29uZmxpY3RUcmVlV2FsayhPYmplY3RSZWFkZXIgb3IpIHsKIAkJc3VwZXIob3IpOwogCX0KIApAQCAtMTM1LDcgKzEzNSw3IEBAIEFic3RyYWN0VHJlZUl0ZXJhdG9yIG1pbigpIHRocm93cyBDb3JydXB0T2JqZWN0RXhjZXB0aW9uIHsKIAogCQkJaWYgKGlzVHJlZShtaW5SZWYpKSB7CiAJCQkJaWYgKHNraXBFbnRyeShtaW5SZWYpKSB7Ci0JCQkJCWZvciAoZmluYWwgQWJzdHJhY3RUcmVlSXRlcmF0b3IgdCA6IHRyZWVzKSB7CisJCQkJCWZvciAoQWJzdHJhY3RUcmVlSXRlcmF0b3IgdCA6IHRyZWVzKSB7CiAJCQkJCQlpZiAodC5tYXRjaGVzID09IG1pblJlZikgewogCQkJCQkJCXQubmV4dCgxKTsKIAkJCQkJCQl0Lm1hdGNoZXMgPSBudWxsOwpAQCAtMjIyLDE2ICsyMjIsMTYgQEAgcHJpdmF0ZSBib29sZWFuIGlzR2l0bGluayhBYnN0cmFjdFRyZWVJdGVyYXRvciBwKSB7CiAJCXJldHVybiBGaWxlTW9kZS5HSVRMSU5LLmVxdWFscyhwLm1vZGUpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNUcmVlKGZpbmFsIEFic3RyYWN0VHJlZUl0ZXJhdG9yIHApIHsKKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVHJlZShBYnN0cmFjdFRyZWVJdGVyYXRvciBwKSB7CiAJCXJldHVybiBGaWxlTW9kZS5UUkVFLmVxdWFscyhwLm1vZGUpOwogCX0KIAotCXByaXZhdGUgYm9vbGVhbiBza2lwRW50cnkoZmluYWwgQWJzdHJhY3RUcmVlSXRlcmF0b3IgbWluUmVmKQorCXByaXZhdGUgYm9vbGVhbiBza2lwRW50cnkoQWJzdHJhY3RUcmVlSXRlcmF0b3IgbWluUmVmKQogCQkJdGhyb3dzIENvcnJ1cHRPYmplY3RFeGNlcHRpb24gewogCQkvLyBBIHRyZWUgRC9GIG1heSBoYXZlIGJlZW4gaGFuZGxlZCBlYXJsaWVyLiBXZSBuZWVkIHRvCiAJCS8vIG5vdCByZXBvcnQgdGhpcyBwYXRoIGlmIGl0IGhhcyBhbHJlYWR5IGJlZW4gcmVwb3J0ZWQuCiAJCS8vCi0JCWZvciAoZmluYWwgQWJzdHJhY3RUcmVlSXRlcmF0b3IgdCA6IHRyZWVzKSB7CisJCWZvciAoQWJzdHJhY3RUcmVlSXRlcmF0b3IgdCA6IHRyZWVzKSB7CiAJCQlpZiAodC5tYXRjaGVzID09IG1pblJlZiB8fCB0LmZpcnN0KCkpCiAJCQkJY29udGludWU7CiAKQEAgLTI2MCwxNCArMjYwLDE0IEBAIHByaXZhdGUgYm9vbGVhbiBza2lwRW50cnkoZmluYWwgQWJzdHJhY3RUcmVlSXRlcmF0b3IgbWluUmVmKQogCQlyZXR1cm4gZmFsc2U7CiAJfQogCi0JcHJpdmF0ZSBBYnN0cmFjdFRyZWVJdGVyYXRvciBjb21iaW5lREYoZmluYWwgQWJzdHJhY3RUcmVlSXRlcmF0b3IgbWluUmVmKQorCXByaXZhdGUgQWJzdHJhY3RUcmVlSXRlcmF0b3IgY29tYmluZURGKEFic3RyYWN0VHJlZUl0ZXJhdG9yIG1pblJlZikKIAkJCXRocm93cyBDb3JydXB0T2JqZWN0RXhjZXB0aW9uIHsKIAkJLy8gTG9vayBmb3IgYSBwb3NzaWJsZSBEL0YgY29uZmxpY3QgZm9yd2FyZCBpbiB0aGUgdHJlZShzKQogCQkvLyBhcyB0aGVyZSBtYXkgYmUgYSAiJHBhdGgvIiB3aGljaCBtYXRjaGVzICIkcGF0aCIuIE1ha2UKIAkJLy8gc3VjaCBlbnRyaWVzIG1hdGNoIHRoaXMgZW50cnkuCiAJCS8vCiAJCUFic3RyYWN0VHJlZUl0ZXJhdG9yIHRyZWVNYXRjaCA9IG51bGw7Ci0JCWZvciAoZmluYWwgQWJzdHJhY3RUcmVlSXRlcmF0b3IgdCA6IHRyZWVzKSB7CisJCWZvciAoQWJzdHJhY3RUcmVlSXRlcmF0b3IgdCA6IHRyZWVzKSB7CiAJCQlpZiAodC5tYXRjaGVzID09IG1pblJlZiB8fCB0LmVvZigpKQogCQkJCWNvbnRpbnVlOwogCkBAIC0zMDYsNyArMzA2LDcgQEAgcHJpdmF0ZSBBYnN0cmFjdFRyZWVJdGVyYXRvciBjb21iaW5lREYoZmluYWwgQWJzdHJhY3RUcmVlSXRlcmF0b3IgbWluUmVmKQogCQkJLy8gbWF0Y2hpbmcgaXRlcmF0b3JzIGluc3RlYWQgb2YgdGhlIGZpbGUgaXRlcmF0b3IuCiAJCQkvLyBUaGlzIHdheSBpc1N1YnRyZWUgaXMgdHJ1ZSBhbmQgaXNSZWN1cnNpdmUgd29ya3MuCiAJCQkvLwotCQkJZm9yIChmaW5hbCBBYnN0cmFjdFRyZWVJdGVyYXRvciB0IDogdHJlZXMpCisJCQlmb3IgKEFic3RyYWN0VHJlZUl0ZXJhdG9yIHQgOiB0cmVlcykKIAkJCQlpZiAodC5tYXRjaGVzID09IG1pblJlZikKIAkJCQkJdC5tYXRjaGVzID0gdHJlZU1hdGNoOwogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL1RyZWVXYWxrLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL1RyZWVXYWxrLmphdmEKaW5kZXggODg3MjY4OS4uZDUwMGFhZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9UcmVlV2Fsay5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvVHJlZVdhbGsuamF2YQpAQCAtMzMyLDcgKzMzMiw3IEBAIHB1YmxpYyBzdGF0aWMgVHJlZVdhbGsgZm9yUGF0aChmaW5hbCBSZXBvc2l0b3J5IGRiLCBmaW5hbCBTdHJpbmcgcGF0aCwKIAkgKiAgICAgICAgICAgIE9iamVjdFJlYWRlciB3aWxsIGJlIGNyZWF0ZWQgYnkgdGhlIHdhbGtlciwgYW5kIHdpbGwgYmUgY2xvc2VkCiAJICogICAgICAgICAgICB3aGVuIHRoZSB3YWxrZXIgaXMgY2xvc2VkLgogCSAqLwotCXB1YmxpYyBUcmVlV2FsayhmaW5hbCBSZXBvc2l0b3J5IHJlcG8pIHsKKwlwdWJsaWMgVHJlZVdhbGsoUmVwb3NpdG9yeSByZXBvKSB7CiAJCXRoaXMocmVwbywgcmVwby5uZXdPYmplY3RSZWFkZXIoKSwgdHJ1ZSk7CiAJfQogCkBAIC0zNDgsNyArMzQ4LDcgQEAgcHVibGljIFRyZWVXYWxrKGZpbmFsIFJlcG9zaXRvcnkgcmVwbykgewogCSAqICAgICAgICAgICAgaXMgbm90IGNsb3NlZCB3aGVuIHRoZSB3YWxrZXIgaXMgY2xvc2VkLgogCSAqIEBzaW5jZSA0LjMKIAkgKi8KLQlwdWJsaWMgVHJlZVdhbGsoZmluYWwgQE51bGxhYmxlIFJlcG9zaXRvcnkgcmVwbywgZmluYWwgT2JqZWN0UmVhZGVyIG9yKSB7CisJcHVibGljIFRyZWVXYWxrKEBOdWxsYWJsZSBSZXBvc2l0b3J5IHJlcG8sIE9iamVjdFJlYWRlciBvcikgewogCQl0aGlzKHJlcG8sIG9yLCBmYWxzZSk7CiAJfQogCkBAIC0zNTksNyArMzU5LDcgQEAgcHVibGljIFRyZWVXYWxrKGZpbmFsIEBOdWxsYWJsZSBSZXBvc2l0b3J5IHJlcG8sIGZpbmFsIE9iamVjdFJlYWRlciBvcikgewogCSAqICAgICAgICAgICAgdGhlIHJlYWRlciB0aGUgd2Fsa2VyIHdpbGwgb2J0YWluIHRyZWUgZGF0YSBmcm9tLiBUaGUgcmVhZGVyCiAJICogICAgICAgICAgICBpcyBub3QgY2xvc2VkIHdoZW4gdGhlIHdhbGtlciBpcyBjbG9zZWQuCiAJICovCi0JcHVibGljIFRyZWVXYWxrKGZpbmFsIE9iamVjdFJlYWRlciBvcikgeworCXB1YmxpYyBUcmVlV2FsayhPYmplY3RSZWFkZXIgb3IpIHsKIAkJdGhpcyhudWxsLCBvciwgZmFsc2UpOwogCX0KIApAQCAtNDQ3LDcgKzQ0Nyw3IEBAIHB1YmxpYyBUcmVlRmlsdGVyIGdldEZpbHRlcigpIHsKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyLkFuZFRyZWVGaWx0ZXIKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyLk9yVHJlZUZpbHRlcgogCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihmaW5hbCBUcmVlRmlsdGVyIG5ld0ZpbHRlcikgeworCXB1YmxpYyB2b2lkIHNldEZpbHRlcihUcmVlRmlsdGVyIG5ld0ZpbHRlcikgewogCQlmaWx0ZXIgPSBuZXdGaWx0ZXIgIT0gbnVsbCA/IG5ld0ZpbHRlciA6IFRyZWVGaWx0ZXIuQUxMOwogCX0KIApAQCAtNDc1LDcgKzQ3NSw3IEBAIHB1YmxpYyBib29sZWFuIGlzUmVjdXJzaXZlKCkgewogCSAqIEBwYXJhbSBiCiAJICogICAgICAgICAgICB0cnVlIHRvIHNraXAgc3VidHJlZSBub2RlcyBhbmQgb25seSBvYnRhaW4gZmlsZXMgbm9kZXMuCiAJICovCi0JcHVibGljIHZvaWQgc2V0UmVjdXJzaXZlKGZpbmFsIGJvb2xlYW4gYikgeworCXB1YmxpYyB2b2lkIHNldFJlY3Vyc2l2ZShib29sZWFuIGIpIHsKIAkJcmVjdXJzaXZlID0gYjsKIAl9CiAKQEAgLTUwNSw3ICs1MDUsNyBAQCBwdWJsaWMgYm9vbGVhbiBpc1Bvc3RPcmRlclRyYXZlcnNhbCgpIHsKIAkgKiAgICAgICAgICAgIHRydWUgdG8gZ2V0IHRyZWVzIGFmdGVyIHRoZWlyIGNoaWxkcmVuLgogCSAqIEBzZWUgI2lzUG9zdE9yZGVyVHJhdmVyc2FsKCkKIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQb3N0T3JkZXJUcmF2ZXJzYWwoZmluYWwgYm9vbGVhbiBiKSB7CisJcHVibGljIHZvaWQgc2V0UG9zdE9yZGVyVHJhdmVyc2FsKGJvb2xlYW4gYikgewogCQlwb3N0T3JkZXJUcmF2ZXJzYWwgPSBiOwogCX0KIApAQCAtNjMzLDIyICs2MzMsNiBAQCBwdWJsaWMgRW9sU3RyZWFtVHlwZSBnZXRFb2xTdHJlYW1UeXBlKE9wZXJhdGlvblR5cGUgb3BUeXBlKSB7CiAJfQogCiAJLyoqCi0JICogR2V0IHRoZSBFT0wgc3RyZWFtIHR5cGUgb2YgdGhlIGN1cnJlbnQgZW50cnkgdXNpbmcgdGhlIGNvbmZpZyBhbmQKLQkgKiB7QGxpbmsgI2dldEF0dHJpYnV0ZXMoKX0uCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBFT0wgc3RyZWFtIHR5cGUgb2YgdGhlIGN1cnJlbnQgZW50cnkgdXNpbmcgdGhlIGNvbmZpZyBhbmQKLQkgKiAgICAgICAgIHtAbGluayAjZ2V0QXR0cmlidXRlcygpfS4gTm90ZSB0aGF0IHRoaXMgbWV0aG9kIG1heSByZXR1cm4gbnVsbAotCSAqICAgICAgICAgaWYgdGhlIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLlRyZWVXYWxrfSBpcyBub3QgYmFzZWQgb24KLQkgKiAgICAgICAgIGEgd29ya2luZyB0cmVlCi0JICogQHNpbmNlIDQuMwotCSAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI2dldEVvbFN0cmVhbVR5cGUoT3BlcmF0aW9uVHlwZSl9IGluc3RlYWQuCi0JICovCi0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgQE51bGxhYmxlIEVvbFN0cmVhbVR5cGUgZ2V0RW9sU3RyZWFtVHlwZSgpIHsKLQkJcmV0dXJuIChnZXRFb2xTdHJlYW1UeXBlKG9wZXJhdGlvblR5cGUpKTsKLQl9Ci0KLQkvKioKIAkgKiBSZXNldCB0aGlzIHdhbGtlciBzbyBuZXcgdHJlZSBpdGVyYXRvcnMgY2FuIGJlIGFkZGVkIHRvIGl0LgogCSAqLwogCXB1YmxpYyB2b2lkIHJlc2V0KCkgewpAQCAtNjc3LDcgKzY2MSw3IEBAIHB1YmxpYyB2b2lkIHJlc2V0KCkgewogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIGEgbG9vc2Ugb2JqZWN0IG9yIHBhY2sgZmlsZSBjb3VsZCBub3QgYmUgcmVhZC4KIAkgKi8KLQlwdWJsaWMgdm9pZCByZXNldChmaW5hbCBBbnlPYmplY3RJZCBpZCkgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCisJcHVibGljIHZvaWQgcmVzZXQoQW55T2JqZWN0SWQgaWQpIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAogCQkJSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwgQ29ycnVwdE9iamVjdEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQlpZiAodHJlZXMubGVuZ3RoID09IDEpIHsKIAkJCUFic3RyYWN0VHJlZUl0ZXJhdG9yIG8gPSB0cmVlc1swXTsKQEAgLTcxOCw3ICs3MDIsNyBAQCBwdWJsaWMgdm9pZCByZXNldChmaW5hbCBBbnlPYmplY3RJZCBpZCkgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgYSBsb29zZSBvYmplY3Qgb3IgcGFjayBmaWxlIGNvdWxkIG5vdCBiZSByZWFkLgogCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KGZpbmFsIEFueU9iamVjdElkLi4uIGlkcykgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCisJcHVibGljIHZvaWQgcmVzZXQoQW55T2JqZWN0SWQuLi4gaWRzKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKIAkJCUluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sIENvcnJ1cHRPYmplY3RFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgaW50IG9sZExlbiA9IHRyZWVzLmxlbmd0aDsKIAkJZmluYWwgaW50IG5ld0xlbiA9IGlkcy5sZW5ndGg7CkBAIC03NzMsNyArNzU3LDcgQEAgcHVibGljIHZvaWQgcmVzZXQoZmluYWwgQW55T2JqZWN0SWQuLi4gaWRzKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICBhIGxvb3NlIG9iamVjdCBvciBwYWNrIGZpbGUgY291bGQgbm90IGJlIHJlYWQuCiAJICovCi0JcHVibGljIGludCBhZGRUcmVlKGZpbmFsIEFueU9iamVjdElkIGlkKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKKwlwdWJsaWMgaW50IGFkZFRyZWUoQW55T2JqZWN0SWQgaWQpIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAogCQkJSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwgQ29ycnVwdE9iamVjdEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQlyZXR1cm4gYWRkVHJlZShwYXJzZXJGb3IoaWQpKTsKIAl9CkBAIC05MzYsNyArOTIwLDcgQEAgcHVibGljIDxUIGV4dGVuZHMgQWJzdHJhY3RUcmVlSXRlcmF0b3I+IFQgZ2V0VHJlZShmaW5hbCBpbnQgbnRoLAogCSAqIEByZXR1cm4gbW9kZSBiaXRzIGZvciB0aGUgY3VycmVudCBlbnRyeSBvZiB0aGUgbnRoIHRyZWUuCiAJICogQHNlZSBGaWxlTW9kZSNmcm9tQml0cyhpbnQpCiAJICovCi0JcHVibGljIGludCBnZXRSYXdNb2RlKGZpbmFsIGludCBudGgpIHsKKwlwdWJsaWMgaW50IGdldFJhd01vZGUoaW50IG50aCkgewogCQlmaW5hbCBBYnN0cmFjdFRyZWVJdGVyYXRvciB0ID0gdHJlZXNbbnRoXTsKIAkJcmV0dXJuIHQubWF0Y2hlcyA9PSBjdXJyZW50SGVhZCA/IHQubW9kZSA6IDA7CiAJfQpAQCAtOTUyLDcgKzkzNiw3IEBAIHB1YmxpYyBpbnQgZ2V0UmF3TW9kZShmaW5hbCBpbnQgbnRoKSB7CiAJICogICAgICAgICAgICB0cmVlIHRvIG9idGFpbiB0aGUgbW9kZSBmcm9tLgogCSAqIEByZXR1cm4gbW9kZSBmb3IgdGhlIGN1cnJlbnQgZW50cnkgb2YgdGhlIG50aCB0cmVlLgogCSAqLwotCXB1YmxpYyBGaWxlTW9kZSBnZXRGaWxlTW9kZShmaW5hbCBpbnQgbnRoKSB7CisJcHVibGljIEZpbGVNb2RlIGdldEZpbGVNb2RlKGludCBudGgpIHsKIAkJcmV0dXJuIEZpbGVNb2RlLmZyb21CaXRzKGdldFJhd01vZGUobnRoKSk7CiAJfQogCkBAIC05ODcsNyArOTcxLDcgQEAgcHVibGljIEZpbGVNb2RlIGdldEZpbGVNb2RlKCkgewogCSAqIEBzZWUgI2dldE9iamVjdElkKE11dGFibGVPYmplY3RJZCwgaW50KQogCSAqIEBzZWUgI2lkRXF1YWwoaW50LCBpbnQpCiAJICovCi0JcHVibGljIE9iamVjdElkIGdldE9iamVjdElkKGZpbmFsIGludCBudGgpIHsKKwlwdWJsaWMgT2JqZWN0SWQgZ2V0T2JqZWN0SWQoaW50IG50aCkgewogCQlmaW5hbCBBYnN0cmFjdFRyZWVJdGVyYXRvciB0ID0gdHJlZXNbbnRoXTsKIAkJcmV0dXJuIHQubWF0Y2hlcyA9PSBjdXJyZW50SGVhZCA/IHQuZ2V0RW50cnlPYmplY3RJZCgpIDogT2JqZWN0SWQKIAkJCQkuemVyb0lkKCk7CkBAIC0xMDA5LDcgKzk5Myw3IEBAIHB1YmxpYyBPYmplY3RJZCBnZXRPYmplY3RJZChmaW5hbCBpbnQgbnRoKSB7CiAJICogICAgICAgICAgICB0cmVlIHRvIG9idGFpbiB0aGUgb2JqZWN0IGlkZW50aWZpZXIgZnJvbS4KIAkgKiBAc2VlICNpZEVxdWFsKGludCwgaW50KQogCSAqLwotCXB1YmxpYyB2b2lkIGdldE9iamVjdElkKGZpbmFsIE11dGFibGVPYmplY3RJZCBvdXQsIGZpbmFsIGludCBudGgpIHsKKwlwdWJsaWMgdm9pZCBnZXRPYmplY3RJZChNdXRhYmxlT2JqZWN0SWQgb3V0LCBpbnQgbnRoKSB7CiAJCWZpbmFsIEFic3RyYWN0VHJlZUl0ZXJhdG9yIHQgPSB0cmVlc1tudGhdOwogCQlpZiAodC5tYXRjaGVzID09IGN1cnJlbnRIZWFkKQogCQkJdC5nZXRFbnRyeU9iamVjdElkKG91dCk7CkBAIC0xMDI4LDcgKzEwMTIsNyBAQCBwdWJsaWMgdm9pZCBnZXRPYmplY3RJZChmaW5hbCBNdXRhYmxlT2JqZWN0SWQgb3V0LCBmaW5hbCBpbnQgbnRoKSB7CiAJICogICAgICAgICA8Y29kZT5nZXRPYmplY3RJZChudGhBKS5lcXVhbHMoZ2V0T2JqZWN0SWQobnRoQikpPC9jb2RlPi4KIAkgKiBAc2VlICNnZXRPYmplY3RJZChpbnQpCiAJICovCi0JcHVibGljIGJvb2xlYW4gaWRFcXVhbChmaW5hbCBpbnQgbnRoQSwgZmluYWwgaW50IG50aEIpIHsKKwlwdWJsaWMgYm9vbGVhbiBpZEVxdWFsKGludCBudGhBLCBpbnQgbnRoQikgewogCQlmaW5hbCBBYnN0cmFjdFRyZWVJdGVyYXRvciBjaCA9IGN1cnJlbnRIZWFkOwogCQlmaW5hbCBBYnN0cmFjdFRyZWVJdGVyYXRvciBhID0gdHJlZXNbbnRoQV07CiAJCWZpbmFsIEFic3RyYWN0VHJlZUl0ZXJhdG9yIGIgPSB0cmVlc1tudGhCXTsKQEAgLTExMjYsNyArMTExMCw3IEBAIHB1YmxpYyBpbnQgZ2V0UGF0aExlbmd0aCgpIHsKIAkgKiAgICAgICAgIGFnYWluIG9uIHRoaXMgdHJlZSB3YWxrLgogCSAqIEBzaW5jZSA0LjcKIAkgKi8KLQlwdWJsaWMgaW50IGlzUGF0aE1hdGNoKGZpbmFsIGJ5dGVbXSBwLCBmaW5hbCBpbnQgcExlbikgeworCXB1YmxpYyBpbnQgaXNQYXRoTWF0Y2goYnl0ZVtdIHAsIGludCBwTGVuKSB7CiAJCWZpbmFsIEFic3RyYWN0VHJlZUl0ZXJhdG9yIHQgPSBjdXJyZW50SGVhZDsKIAkJZmluYWwgYnl0ZVtdIGMgPSB0LnBhdGg7CiAJCWZpbmFsIGludCBjTGVuID0gdC5wYXRoTGVuOwpAQCAtMTE3OSw3ICsxMTYzLDcgQEAgcHVibGljIGludCBpc1BhdGhNYXRjaChmaW5hbCBieXRlW10gcCwgZmluYWwgaW50IHBMZW4pIHsKIAkgKiAgICAgICAgIHBhdGg7IDEgaWYgdGhlIGN1cnJlbnQgcGF0aCBpcyBwYXN0IHAgYW5kIHAgd2lsbCBuZXZlciBtYXRjaAogCSAqICAgICAgICAgYWdhaW4gb24gdGhpcyB0cmVlIHdhbGsuCiAJICovCi0JcHVibGljIGludCBpc1BhdGhQcmVmaXgoZmluYWwgYnl0ZVtdIHAsIGZpbmFsIGludCBwTGVuKSB7CisJcHVibGljIGludCBpc1BhdGhQcmVmaXgoYnl0ZVtdIHAsIGludCBwTGVuKSB7CiAJCWZpbmFsIEFic3RyYWN0VHJlZUl0ZXJhdG9yIHQgPSBjdXJyZW50SGVhZDsKIAkJZmluYWwgYnl0ZVtdIGMgPSB0LnBhdGg7CiAJCWZpbmFsIGludCBjTGVuID0gdC5wYXRoTGVuOwpAQCAtMTIyOSw3ICsxMjEzLDcgQEAgcHVibGljIGludCBpc1BhdGhQcmVmaXgoZmluYWwgYnl0ZVtdIHAsIGZpbmFsIGludCBwTGVuKSB7CiAJICogQHJldHVybiB0cnVlIGlmIHAgaXMgc3VmZml4IG9mIHRoZSBjdXJyZW50IHBhdGg7CiAJICogICAgICAgICBmYWxzZSBpZiBvdGhlcndpc2UKIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhdGhTdWZmaXgoZmluYWwgYnl0ZVtdIHAsIGZpbmFsIGludCBwTGVuKSB7CisJcHVibGljIGJvb2xlYW4gaXNQYXRoU3VmZml4KGJ5dGVbXSBwLCBpbnQgcExlbikgewogCQlmaW5hbCBBYnN0cmFjdFRyZWVJdGVyYXRvciB0ID0gY3VycmVudEhlYWQ7CiAJCWZpbmFsIGJ5dGVbXSBjID0gdC5wYXRoOwogCQlmaW5hbCBpbnQgY0xlbiA9IHQucGF0aExlbjsKQEAgLTEzNzcsNyArMTM2MSw3IEBAIHZvaWQgZXhpdFN1YnRyZWUoKSB7CiAJCQl0cmVlc1tpXSA9IHRyZWVzW2ldLnBhcmVudDsKIAogCQlBYnN0cmFjdFRyZWVJdGVyYXRvciBtaW5SZWYgPSBudWxsOwotCQlmb3IgKGZpbmFsIEFic3RyYWN0VHJlZUl0ZXJhdG9yIHQgOiB0cmVlcykgeworCQlmb3IgKEFic3RyYWN0VHJlZUl0ZXJhdG9yIHQgOiB0cmVlcykgewogCQkJaWYgKHQubWF0Y2hlcyAhPSB0KQogCQkJCWNvbnRpbnVlOwogCQkJaWYgKG1pblJlZiA9PSBudWxsIHx8IHQucGF0aENvbXBhcmUobWluUmVmKSA8IDApCkBAIC0xMzg2LDE4ICsxMzcwLDE4IEBAIHZvaWQgZXhpdFN1YnRyZWUoKSB7CiAJCWN1cnJlbnRIZWFkID0gbWluUmVmOwogCX0KIAotCXByaXZhdGUgQ2Fub25pY2FsVHJlZVBhcnNlciBwYXJzZXJGb3IoZmluYWwgQW55T2JqZWN0SWQgaWQpCisJcHJpdmF0ZSBDYW5vbmljYWxUcmVlUGFyc2VyIHBhcnNlckZvcihBbnlPYmplY3RJZCBpZCkKIAkJCXRocm93cyBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIENhbm9uaWNhbFRyZWVQYXJzZXIgcCA9IG5ldyBDYW5vbmljYWxUcmVlUGFyc2VyKCk7CiAJCXAucmVzZXQocmVhZGVyLCBpZCk7CiAJCXJldHVybiBwOwogCX0KIAotCXN0YXRpYyBTdHJpbmcgcGF0aE9mKGZpbmFsIEFic3RyYWN0VHJlZUl0ZXJhdG9yIHQpIHsKKwlzdGF0aWMgU3RyaW5nIHBhdGhPZihBYnN0cmFjdFRyZWVJdGVyYXRvciB0KSB7CiAJCXJldHVybiBSYXdQYXJzZVV0aWxzLmRlY29kZShDb25zdGFudHMuQ0hBUlNFVCwgdC5wYXRoLCAwLCB0LnBhdGhMZW4pOwogCX0KIAotCXN0YXRpYyBTdHJpbmcgcGF0aE9mKGZpbmFsIGJ5dGVbXSBidWYsIGludCBwb3MsIGludCBlbmQpIHsKKwlzdGF0aWMgU3RyaW5nIHBhdGhPZihieXRlW10gYnVmLCBpbnQgcG9zLCBpbnQgZW5kKSB7CiAJCXJldHVybiBSYXdQYXJzZVV0aWxzLmRlY29kZShDb25zdGFudHMuQ0hBUlNFVCwgYnVmLCBwb3MsIGVuZCk7CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL1dvcmtpbmdUcmVlSXRlcmF0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvV29ya2luZ1RyZWVJdGVyYXRvci5qYXZhCmluZGV4IDY4Y2M3Y2IuLjE3OWZkNDYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvV29ya2luZ1RyZWVJdGVyYXRvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvV29ya2luZ1RyZWVJdGVyYXRvci5qYXZhCkBAIC0yMTEsNyArMjExLDcgQEAgcHJvdGVjdGVkIFdvcmtpbmdUcmVlSXRlcmF0b3IoZmluYWwgU3RyaW5nIHByZWZpeCwKIAkgKiBAcGFyYW0gcAogCSAqICAgICAgICAgICAgcGFyZW50IHRyZWUgaXRlcmF0b3IuCiAJICovCi0JcHJvdGVjdGVkIFdvcmtpbmdUcmVlSXRlcmF0b3IoZmluYWwgV29ya2luZ1RyZWVJdGVyYXRvciBwKSB7CisJcHJvdGVjdGVkIFdvcmtpbmdUcmVlSXRlcmF0b3IoV29ya2luZ1RyZWVJdGVyYXRvciBwKSB7CiAJCXN1cGVyKHApOwogCQlzdGF0ZSA9IHAuc3RhdGU7CiAJCXJlcG9zaXRvcnkgPSBwLnJlcG9zaXRvcnk7CkBAIC0yNTYsNiArMjU2LDQ1IEBAIHB1YmxpYyB2b2lkIHNldERpckNhY2hlSXRlcmF0b3IoVHJlZVdhbGsgd2FsaywgaW50IHRyZWVJZCkgewogCQlzdGF0ZS5kaXJDYWNoZVRyZWUgPSB0cmVlSWQ7CiAJfQogCisJLyoqCisJICogUmV0cmlldmVzIHRoZSB7QGxpbmsgRGlyQ2FjaGVJdGVyYXRvcn0gYXQgdGhlIGN1cnJlbnQgZW50cnkgaWYKKwkgKiB7QGxpbmsgI3NldERpckNhY2hlSXRlcmF0b3IoVHJlZVdhbGssIGludCl9IHdhcyBjYWxsZWQuCisJICoKKwkgKiBAcmV0dXJuIHRoZSBEaXJDYWNoZUl0ZXJhdG9yLCBvciB7QGNvZGUgbnVsbH0gaWYgbm90IHNldCBvciBub3QgYXQgdGhlCisJICogICAgICAgICBjdXJyZW50IGVudHJ5CisJICogQHNpbmNlIDUuMAorCSAqLworCXByb3RlY3RlZCBEaXJDYWNoZUl0ZXJhdG9yIGdldERpckNhY2hlSXRlcmF0b3IoKSB7CisJCWlmIChzdGF0ZS5kaXJDYWNoZVRyZWUgPj0gMCAmJiBzdGF0ZS53YWxrICE9IG51bGwpIHsKKwkJCXJldHVybiBzdGF0ZS53YWxrLmdldFRyZWUoc3RhdGUuZGlyQ2FjaGVUcmVlLAorCQkJCQlEaXJDYWNoZUl0ZXJhdG9yLmNsYXNzKTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBEZWZpbmVzIHdoZXRoZXIgdGhpcyB7QGxpbmsgV29ya2luZ1RyZWVJdGVyYXRvcn0gd2Fsa3MgaWdub3JlZAorCSAqIGRpcmVjdG9yaWVzLgorCSAqCisJICogQHBhcmFtIGluY2x1ZGVJZ25vcmVkCisJICogICAgICAgICAgICB7QGNvZGUgZmFsc2V9IHRvIHNraXAgaWdub3JlZCBkaXJlY3RvcmllcywgaWYgcG9zc2libGU7CisJICogICAgICAgICAgICB7QGNvZGUgdHJ1ZX0gdG8gYWx3YXlzIGluY2x1ZGUgdGhlbSBpbiB0aGUgd2FsaworCSAqIEBzaW5jZSA1LjAKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRXYWxrSWdub3JlZERpcmVjdG9yaWVzKGJvb2xlYW4gaW5jbHVkZUlnbm9yZWQpIHsKKwkJc3RhdGUud2Fsa0lnbm9yZWQgPSBpbmNsdWRlSWdub3JlZDsKKwl9CisKKwkvKioKKwkgKiBUZWxscyB3aGV0aGVyIHRoaXMge0BsaW5rIFdvcmtpbmdUcmVlSXRlcmF0b3J9IHdhbGtzIGlnbm9yZWQgZGlyZWN0b3JpZXMuCisJICoKKwkgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBpdCBkb2VzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQorCSAqIEBzaW5jZSA1LjAKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiB3YWxrc0lnbm9yZWREaXJlY3RvcmllcygpIHsKKwkJcmV0dXJuIHN0YXRlLndhbGtJZ25vcmVkOworCX0KKwogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gaGFzSWQoKSB7CkBAIC0zNDAsMzAgKzM3OSwyMiBAQCBwdWJsaWMgYm9vbGVhbiBpc1dvcmtUcmVlKCkgewogCSAqIEByZXR1cm4gbm9uLW51bGwgc3VibW9kdWxlIGlkCiAJICovCiAJcHJvdGVjdGVkIGJ5dGVbXSBpZFN1Ym1vZHVsZShGaWxlIGRpcmVjdG9yeSwgRW50cnkgZSkgewotCQlmaW5hbCBSZXBvc2l0b3J5IHN1Ym1vZHVsZVJlcG87Ci0JCXRyeSB7Ci0JCQlzdWJtb2R1bGVSZXBvID0gU3VibW9kdWxlV2Fsay5nZXRTdWJtb2R1bGVSZXBvc2l0b3J5KGRpcmVjdG9yeSwKLQkJCQkJZS5nZXROYW1lKCksCi0JCQkJCXJlcG9zaXRvcnkgIT0gbnVsbCA/IHJlcG9zaXRvcnkuZ2V0RlMoKSA6IEZTLkRFVEVDVEVEKTsKKwkJdHJ5IChSZXBvc2l0b3J5IHN1Ym1vZHVsZVJlcG8gPSBTdWJtb2R1bGVXYWxrLmdldFN1Ym1vZHVsZVJlcG9zaXRvcnkoCisJCQkJZGlyZWN0b3J5LCBlLmdldE5hbWUoKSwKKwkJCQlyZXBvc2l0b3J5ICE9IG51bGwgPyByZXBvc2l0b3J5LmdldEZTKCkgOiBGUy5ERVRFQ1RFRCkpIHsKKwkJCWlmIChzdWJtb2R1bGVSZXBvID09IG51bGwpIHsKKwkJCQlyZXR1cm4gemVyb2lkOworCQkJfQorCQkJT2JqZWN0SWQgaGVhZCA9IHN1Ym1vZHVsZVJlcG8ucmVzb2x2ZShDb25zdGFudHMuSEVBRCk7CisJCQlpZiAoaGVhZCA9PSBudWxsKSB7CisJCQkJcmV0dXJuIHplcm9pZDsKKwkJCX0KKwkJCWJ5dGVbXSBpZCA9IG5ldyBieXRlW0NvbnN0YW50cy5PQkpFQ1RfSURfTEVOR1RIXTsKKwkJCWhlYWQuY29weVJhd1RvKGlkLCAwKTsKKwkJCXJldHVybiBpZDsKIAkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXhjZXB0aW9uKSB7CiAJCQlyZXR1cm4gemVyb2lkOwogCQl9Ci0JCWlmIChzdWJtb2R1bGVSZXBvID09IG51bGwpCi0JCQlyZXR1cm4gemVyb2lkOwotCi0JCWZpbmFsIE9iamVjdElkIGhlYWQ7Ci0JCXRyeSB7Ci0JCQloZWFkID0gc3VibW9kdWxlUmVwby5yZXNvbHZlKENvbnN0YW50cy5IRUFEKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQlyZXR1cm4gemVyb2lkOwotCQl9IGZpbmFsbHkgewotCQkJc3VibW9kdWxlUmVwby5jbG9zZSgpOwotCQl9Ci0JCWlmIChoZWFkID09IG51bGwpCi0JCQlyZXR1cm4gemVyb2lkOwotCQlmaW5hbCBieXRlW10gaWQgPSBuZXcgYnl0ZVtDb25zdGFudHMuT0JKRUNUX0lEX0xFTkdUSF07Ci0JCWhlYWQuY29weVJhd1RvKGlkLCAwKTsKLQkJcmV0dXJuIGlkOwogCX0KIAogCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBkaWdpdHMgPSB7ICcwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywKQEAgLTM3Miw3ICs0MDMsNyBAQCBwdWJsaWMgYm9vbGVhbiBpc1dvcmtUcmVlKCkgewogCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBoYmxvYiA9IENvbnN0YW50cwogCQkJLmVuY29kZWRUeXBlU3RyaW5nKENvbnN0YW50cy5PQkpfQkxPQik7CiAKLQlwcml2YXRlIGJ5dGVbXSBpZEJ1ZmZlckJsb2IoZmluYWwgRW50cnkgZSkgeworCXByaXZhdGUgYnl0ZVtdIGlkQnVmZmVyQmxvYihFbnRyeSBlKSB7CiAJCXRyeSB7CiAJCQlmaW5hbCBJbnB1dFN0cmVhbSBpcyA9IGUub3BlbklucHV0U3RyZWFtKCk7CiAJCQlpZiAoaXMgPT0gbnVsbCkKQEAgLTQzMCw3ICs0NjEsNyBAQCAmJiBnZXRFb2xTdHJlYW1UeXBlKG9wVHlwZSkgPT0gRW9sU3RyZWFtVHlwZS5ESVJFQ1QpIHsKIAkJcmV0dXJuIGZpbHRlckNsZWFuKGlzLCBvcFR5cGUpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIHZvaWQgc2FmZUNsb3NlKGZpbmFsIElucHV0U3RyZWFtIGluKSB7CisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBzYWZlQ2xvc2UoSW5wdXRTdHJlYW0gaW4pIHsKIAkJdHJ5IHsKIAkJCWluLmNsb3NlKCk7CiAJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGVycjIpIHsKQEAgLTU0OCw3ICs1NzksNyBAQCBwdWJsaWMgYm9vbGVhbiBlb2YoKSB7CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5leHQoZmluYWwgaW50IGRlbHRhKSB0aHJvd3MgQ29ycnVwdE9iamVjdEV4Y2VwdGlvbiB7CisJcHVibGljIHZvaWQgbmV4dChpbnQgZGVsdGEpIHRocm93cyBDb3JydXB0T2JqZWN0RXhjZXB0aW9uIHsKIAkJcHRyICs9IGRlbHRhOwogCQlpZiAoIWVvZigpKSB7CiAJCQlwYXJzZUVudHJ5KCk7CkBAIC01NTcsNyArNTg4LDcgQEAgcHVibGljIHZvaWQgbmV4dChmaW5hbCBpbnQgZGVsdGEpIHRocm93cyBDb3JydXB0T2JqZWN0RXhjZXB0aW9uIHsKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYmFjayhmaW5hbCBpbnQgZGVsdGEpIHRocm93cyBDb3JydXB0T2JqZWN0RXhjZXB0aW9uIHsKKwlwdWJsaWMgdm9pZCBiYWNrKGludCBkZWx0YSkgdGhyb3dzIENvcnJ1cHRPYmplY3RFeGNlcHRpb24gewogCQlwdHIgLT0gZGVsdGE7CiAJCXBhcnNlRW50cnkoKTsKIAl9CkBAIC02NjIsNyArNjkzLDcgQEAgcHVibGljIGJvb2xlYW4gaXNFbnRyeUlnbm9yZWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIGEgcmVsZXZhbnQgaWdub3JlIHJ1bGUgZmlsZSBleGlzdHMgYnV0IGNhbm5vdCBiZSByZWFkLgogCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRW50cnlJZ25vcmVkKGZpbmFsIGludCBwTGVuKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByb3RlY3RlZCBib29sZWFuIGlzRW50cnlJZ25vcmVkKGludCBwTGVuKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlyZXR1cm4gaXNFbnRyeUlnbm9yZWQocExlbiwgbW9kZSk7CiAJfQogCkBAIC02NzcsNyArNzA4LDcgQEAgcHJvdGVjdGVkIGJvb2xlYW4gaXNFbnRyeUlnbm9yZWQoZmluYWwgaW50IHBMZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJICogQHRocm93cyBJT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIGEgcmVsZXZhbnQgaWdub3JlIHJ1bGUgZmlsZSBleGlzdHMgYnV0IGNhbm5vdCBiZSByZWFkLgogCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0VudHJ5SWdub3JlZChmaW5hbCBpbnQgcExlbiwgaW50IGZpbGVNb2RlKQorCXByaXZhdGUgYm9vbGVhbiBpc0VudHJ5SWdub3JlZChpbnQgcExlbiwgaW50IGZpbGVNb2RlKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJLy8gVGhlIGlnbm9yZSBjb2RlIHdhbnRzIHBhdGggdG8gc3RhcnQgd2l0aCBhICcvJyBpZiBwb3NzaWJsZS4KIAkJLy8gSWYgd2UgaGF2ZSB0aGUgJy8nIGluIG91ciBwYXRoIGJ1ZmZlciBiZWNhdXNlIHdlIGFyZSBpbnNpZGUKQEAgLTc1Niw3ICs3ODcsNyBAQCBwdWJsaWMgaW50IGNvbXBhcmUoRW50cnkgYSwgRW50cnkgYikgewogCSAqICAgICAgICAgICAgZmlsZXMgaW4gdGhlIHN1YnRyZWUgb2YgdGhlIHdvcmsgdHJlZSB0aGlzIGl0ZXJhdG9yIG9wZXJhdGVzCiAJICogICAgICAgICAgICBvbgogCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXQoZmluYWwgRW50cnlbXSBsaXN0KSB7CisJcHJvdGVjdGVkIHZvaWQgaW5pdChFbnRyeVtdIGxpc3QpIHsKIAkJLy8gRmlsdGVyIG91dCBudWxscywgLiBhbmQgLi4gYXMgdGhlc2UgYXJlIG5vdCB2YWxpZCB0cmVlIGVudHJpZXMsCiAJCS8vIGFsc28gY2FjaGUgdGhlIGVuY29kZWQgZm9ybXMgb2YgdGhlIHBhdGggbmFtZXMgZm9yIGVmZmljaWVudCB1c2UKIAkJLy8gbGF0ZXIgb24gZHVyaW5nIHNvcnRpbmcgYW5kIGl0ZXJhdGlvbi4KQEAgLTgzOCw3ICs4NjksNyBAQCBwdWJsaWMgZW51bSBNZXRhZGF0YURpZmYgewogCSAqICAgICAgICAgICAgYW4gaW50LgogCSAqIEByZXR1cm4gdHJ1ZSBpZiBkaWZmZXJlbnQsIGZhbHNlIG90aGVyd2lzZQogCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTW9kZURpZmZlcmVudChmaW5hbCBpbnQgcmF3TW9kZSkgeworCXB1YmxpYyBib29sZWFuIGlzTW9kZURpZmZlcmVudChpbnQgcmF3TW9kZSkgewogCQkvLyBEZXRlcm1pbmUgZGlmZmVyZW5jZSBpbiBtb2RlLWJpdHMgb2YgZmlsZSBhbmQgaW5kZXgtZW50cnkuIEluIHRoZQogCQkvLyBiaXR3aXNlIHByZXNlbnRhdGlvbiBvZiBtb2RlRGlmZiB3ZSdsbCBoYXZlIGEgJzEnIHdoZW4gdGhlIHR3byBtb2RlcwogCQkvLyBkaWZmZXIgYXQgdGhpcyBwb3NpdGlvbi4KQEAgLTk5Miw3ICsxMDIzLDcgQEAgcHVibGljIGJvb2xlYW4gaXNNb2RpZmllZChEaXJDYWNoZUVudHJ5IGVudHJ5LCBib29sZWFuIGZvcmNlQ29udGVudENoZWNrLAogCSAqICAgICAgICAgICAgYXZhaWxhYmxlIGF0IHRoaXMgaXRlcmF0b3IncyBjdXJyZW50IGVudHJ5CiAJICogQHJldHVybiBpbmRleCBmaWxlIG1vZGUKIAkgKi8KLQlwdWJsaWMgRmlsZU1vZGUgZ2V0SW5kZXhGaWxlTW9kZShmaW5hbCBEaXJDYWNoZUl0ZXJhdG9yIGluZGV4SXRlcikgeworCXB1YmxpYyBGaWxlTW9kZSBnZXRJbmRleEZpbGVNb2RlKERpckNhY2hlSXRlcmF0b3IgaW5kZXhJdGVyKSB7CiAJCWZpbmFsIEZpbGVNb2RlIHd0TW9kZSA9IGdldEVudHJ5RmlsZU1vZGUoKTsKIAkJaWYgKGluZGV4SXRlciA9PSBudWxsKSB7CiAJCQlyZXR1cm4gd3RNb2RlOwpAQCAtMTE3MywxMyArMTIwNCwxNyBAQCBwcml2YXRlIHN0YXRpYyBsb25nIGNvbXB1dGVMZW5ndGgoSW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXJldHVybiBjb250ZW50RGlnZXN0LmRpZ2VzdCgpOwogCX0KIAotCS8qKiBBIHNpbmdsZSBlbnRyeSB3aXRoaW4gYSB3b3JraW5nIGRpcmVjdG9yeSB0cmVlLiAqLwotCXByb3RlY3RlZCBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgRW50cnkgeworCS8qKgorCSAqIEEgc2luZ2xlIGVudHJ5IHdpdGhpbiBhIHdvcmtpbmcgZGlyZWN0b3J5IHRyZWUuCisJICoKKwkgKiBAc2luY2UgNS4wCisJICovCisJcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBFbnRyeSB7CiAJCWJ5dGVbXSBlbmNvZGVkTmFtZTsKIAogCQlpbnQgZW5jb2RlZE5hbWVMZW47CiAKLQkJdm9pZCBlbmNvZGVOYW1lKGZpbmFsIENoYXJzZXRFbmNvZGVyIGVuYykgeworCQl2b2lkIGVuY29kZU5hbWUoQ2hhcnNldEVuY29kZXIgZW5jKSB7CiAJCQlmaW5hbCBCeXRlQnVmZmVyIGI7CiAJCQl0cnkgewogCQkJCWIgPSBlbmMuZW5jb2RlKENoYXJCdWZmZXIud3JhcChnZXROYW1lKCkpKTsKQEAgLTEyODAsMTEgKzEzMTUsOCBAQCBwcml2YXRlIHN0YXRpYyBjbGFzcyBQZXJEaXJlY3RvcnlJZ25vcmVOb2RlIGV4dGVuZHMgSWdub3JlTm9kZSB7CiAKIAkJSWdub3JlTm9kZSBsb2FkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCUlnbm9yZU5vZGUgciA9IG5ldyBJZ25vcmVOb2RlKCk7Ci0JCQlJbnB1dFN0cmVhbSBpbiA9IGVudHJ5Lm9wZW5JbnB1dFN0cmVhbSgpOwotCQkJdHJ5IHsKKwkJCXRyeSAoSW5wdXRTdHJlYW0gaW4gPSBlbnRyeS5vcGVuSW5wdXRTdHJlYW0oKSkgewogCQkJCXIucGFyc2UoaW4pOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpbi5jbG9zZSgpOwogCQkJfQogCQkJcmV0dXJuIHIuZ2V0UnVsZXMoKS5pc0VtcHR5KCkgPyBudWxsIDogcjsKIAkJfQpAQCAtMTMzMiwxMSArMTM2NCw4IEBAIElnbm9yZU5vZGUgbG9hZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXByaXZhdGUgc3RhdGljIHZvaWQgbG9hZFJ1bGVzRnJvbUZpbGUoSWdub3JlTm9kZSByLCBGaWxlIGV4Y2x1ZGUpCiAJCQkJdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQkJaWYgKEZTLkRFVEVDVEVELmV4aXN0cyhleGNsdWRlKSkgewotCQkJCUZpbGVJbnB1dFN0cmVhbSBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZXhjbHVkZSk7Ci0JCQkJdHJ5IHsKKwkJCQl0cnkgKEZpbGVJbnB1dFN0cmVhbSBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZXhjbHVkZSkpIHsKIAkJCQkJci5wYXJzZShpbik7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJaW4uY2xvc2UoKTsKIAkJCQl9CiAJCQl9CiAJCX0KQEAgLTEzNTMsMTEgKzEzODIsOCBAQCBwcml2YXRlIHN0YXRpYyBjbGFzcyBQZXJEaXJlY3RvcnlBdHRyaWJ1dGVzTm9kZSBleHRlbmRzIEF0dHJpYnV0ZXNOb2RlIHsKIAogCQlBdHRyaWJ1dGVzTm9kZSBsb2FkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCUF0dHJpYnV0ZXNOb2RlIHIgPSBuZXcgQXR0cmlidXRlc05vZGUoKTsKLQkJCUlucHV0U3RyZWFtIGluID0gZW50cnkub3BlbklucHV0U3RyZWFtKCk7Ci0JCQl0cnkgeworCQkJdHJ5IChJbnB1dFN0cmVhbSBpbiA9IGVudHJ5Lm9wZW5JbnB1dFN0cmVhbSgpKSB7CiAJCQkJci5wYXJzZShpbik7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWluLmNsb3NlKCk7CiAJCQl9CiAJCQlyZXR1cm4gci5nZXRSdWxlcygpLmlzRW1wdHkoKSA/IG51bGwgOiByOwogCQl9CkBAIC0xMzc4LDcgKzE0MDQsMTAgQEAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgSXRlcmF0b3JTdGF0ZSB7CiAJCVRyZWVXYWxrIHdhbGs7CiAKIAkJLyoqIFBvc2l0aW9uIG9mIHRoZSBtYXRjaGluZyB7QGxpbmsgRGlyQ2FjaGVJdGVyYXRvcn0uICovCi0JCWludCBkaXJDYWNoZVRyZWU7CisJCWludCBkaXJDYWNoZVRyZWUgPSAtMTsKKworCQkvKiogV2hldGhlciB0aGUgaXRlcmF0b3Igc2hhbGwgd2FsayBpZ25vcmVkIGRpcmVjdG9yaWVzLiAqLworCQlib29sZWFuIHdhbGtJZ25vcmVkID0gZmFsc2U7CiAKIAkJZmluYWwgTWFwPFN0cmluZywgQm9vbGVhbj4gZGlyZWN0b3J5VG9JZ25vcmVkID0gbmV3IEhhc2hNYXA8PigpOwogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL1dvcmtpbmdUcmVlT3B0aW9ucy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9Xb3JraW5nVHJlZU9wdGlvbnMuamF2YQppbmRleCAyZGZiMjAzLi44NDZmYjZlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL1dvcmtpbmdUcmVlT3B0aW9ucy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvV29ya2luZ1RyZWVPcHRpb25zLmphdmEKQEAgLTc0LDcgKzc0LDcgQEAgcHVibGljIGNsYXNzIFdvcmtpbmdUcmVlT3B0aW9ucyB7CiAKIAlwcml2YXRlIGZpbmFsIGJvb2xlYW4gZGlyTm9HaXRMaW5rczsKIAotCXByaXZhdGUgV29ya2luZ1RyZWVPcHRpb25zKGZpbmFsIENvbmZpZyByYykgeworCXByaXZhdGUgV29ya2luZ1RyZWVPcHRpb25zKENvbmZpZyByYykgewogCQlmaWxlTW9kZSA9IHJjLmdldEJvb2xlYW4oQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19DT1JFX1NFQ1RJT04sCiAJCQkJQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfRklMRU1PREUsIHRydWUpOwogCQlhdXRvQ1JMRiA9IHJjLmdldEVudW0oQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19DT1JFX1NFQ1RJT04sIG51bGwsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9BbmRUcmVlRmlsdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9BbmRUcmVlRmlsdGVyLmphdmEKaW5kZXggNmQ0MGE0ZS4uYTk2MGJkNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvQW5kVHJlZUZpbHRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL0FuZFRyZWVGaWx0ZXIuamF2YQpAQCAtNzEsNyArNzEsNyBAQCBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQW5kVHJlZUZpbHRlciBleHRlbmRzIFRyZWVGaWx0ZXIgewogCSAqICAgICAgICAgICAgc2Vjb25kIGZpbHRlciB0byB0ZXN0LgogCSAqIEByZXR1cm4gYSBmaWx0ZXIgdGhhdCBtdXN0IG1hdGNoIGJvdGggaW5wdXQgZmlsdGVycy4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIFRyZWVGaWx0ZXIgY3JlYXRlKGZpbmFsIFRyZWVGaWx0ZXIgYSwgZmluYWwgVHJlZUZpbHRlciBiKSB7CisJcHVibGljIHN0YXRpYyBUcmVlRmlsdGVyIGNyZWF0ZShUcmVlRmlsdGVyIGEsIFRyZWVGaWx0ZXIgYikgewogCQlpZiAoYSA9PSBBTEwpCiAJCQlyZXR1cm4gYjsKIAkJaWYgKGIgPT0gQUxMKQpAQCAtODcsNyArODcsNyBAQCBwdWJsaWMgc3RhdGljIFRyZWVGaWx0ZXIgY3JlYXRlKGZpbmFsIFRyZWVGaWx0ZXIgYSwgZmluYWwgVHJlZUZpbHRlciBiKSB7CiAJICogICAgICAgICAgICBmaWx0ZXJzLgogCSAqIEByZXR1cm4gYSBmaWx0ZXIgdGhhdCBtdXN0IG1hdGNoIGFsbCBpbnB1dCBmaWx0ZXJzLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgVHJlZUZpbHRlciBjcmVhdGUoZmluYWwgVHJlZUZpbHRlcltdIGxpc3QpIHsKKwlwdWJsaWMgc3RhdGljIFRyZWVGaWx0ZXIgY3JlYXRlKFRyZWVGaWx0ZXJbXSBsaXN0KSB7CiAJCWlmIChsaXN0Lmxlbmd0aCA9PSAyKQogCQkJcmV0dXJuIGNyZWF0ZShsaXN0WzBdLCBsaXN0WzFdKTsKIAkJaWYgKGxpc3QubGVuZ3RoIDwgMikKQEAgLTEwNSw3ICsxMDUsNyBAQCBwdWJsaWMgc3RhdGljIFRyZWVGaWx0ZXIgY3JlYXRlKGZpbmFsIFRyZWVGaWx0ZXJbXSBsaXN0KSB7CiAJICogICAgICAgICAgICBmaWx0ZXJzLgogCSAqIEByZXR1cm4gYSBmaWx0ZXIgdGhhdCBtdXN0IG1hdGNoIGFsbCBpbnB1dCBmaWx0ZXJzLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgVHJlZUZpbHRlciBjcmVhdGUoZmluYWwgQ29sbGVjdGlvbjxUcmVlRmlsdGVyPiBsaXN0KSB7CisJcHVibGljIHN0YXRpYyBUcmVlRmlsdGVyIGNyZWF0ZShDb2xsZWN0aW9uPFRyZWVGaWx0ZXI+IGxpc3QpIHsKIAkJaWYgKGxpc3Quc2l6ZSgpIDwgMikKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oSkdpdFRleHQuZ2V0KCkuYXRMZWFzdFR3b0ZpbHRlcnNOZWVkZWQpOwogCQlmaW5hbCBUcmVlRmlsdGVyW10gc3ViZmlsdGVycyA9IG5ldyBUcmVlRmlsdGVyW2xpc3Quc2l6ZSgpXTsKQEAgLTEyMCwxMyArMTIwLDEzIEBAIHByaXZhdGUgc3RhdGljIGNsYXNzIEJpbmFyeSBleHRlbmRzIEFuZFRyZWVGaWx0ZXIgewogCiAJCXByaXZhdGUgZmluYWwgVHJlZUZpbHRlciBiOwogCi0JCUJpbmFyeShmaW5hbCBUcmVlRmlsdGVyIG9uZSwgZmluYWwgVHJlZUZpbHRlciB0d28pIHsKKwkJQmluYXJ5KFRyZWVGaWx0ZXIgb25lLCBUcmVlRmlsdGVyIHR3bykgewogCQkJYSA9IG9uZTsKIAkJCWIgPSB0d287CiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gaW5jbHVkZShmaW5hbCBUcmVlV2FsayB3YWxrZXIpCisJCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoVHJlZVdhbGsgd2Fsa2VyKQogCQkJCXRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLAogCQkJCUlPRXhjZXB0aW9uIHsKIAkJCXJldHVybiBtYXRjaEZpbHRlcih3YWxrZXIpIDw9IDA7CkBAIC0xNzAsMTIgKzE3MCwxMiBAQCBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCXByaXZhdGUgc3RhdGljIGNsYXNzIExpc3QgZXh0ZW5kcyBBbmRUcmVlRmlsdGVyIHsKIAkJcHJpdmF0ZSBmaW5hbCBUcmVlRmlsdGVyW10gc3ViZmlsdGVyczsKIAotCQlMaXN0KGZpbmFsIFRyZWVGaWx0ZXJbXSBsaXN0KSB7CisJCUxpc3QoVHJlZUZpbHRlcltdIGxpc3QpIHsKIAkJCXN1YmZpbHRlcnMgPSBsaXN0OwogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoZmluYWwgVHJlZVdhbGsgd2Fsa2VyKQorCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKFRyZWVXYWxrIHdhbGtlcikKIAkJCQl0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwKIAkJCQlJT0V4Y2VwdGlvbiB7CiAJCQlyZXR1cm4gbWF0Y2hGaWx0ZXIod2Fsa2VyKSA8PSAwOwpAQCAtMTg2LDcgKzE4Niw3IEBAIHB1YmxpYyBpbnQgbWF0Y2hGaWx0ZXIoVHJlZVdhbGsgd2Fsa2VyKQogCQkJCXRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLAogCQkJCUlPRXhjZXB0aW9uIHsKIAkJCWludCBtID0gMDsKLQkJCWZvciAoZmluYWwgVHJlZUZpbHRlciBmIDogc3ViZmlsdGVycykgeworCQkJZm9yIChUcmVlRmlsdGVyIGYgOiBzdWJmaWx0ZXJzKSB7CiAJCQkJaW50IHIgPSBmLm1hdGNoRmlsdGVyKHdhbGtlcik7CiAJCQkJaWYgKHIgPT0gMSkgewogCQkJCQlyZXR1cm4gMTsKQEAgLTIwMCw3ICsyMDAsNyBAQCBwdWJsaWMgaW50IG1hdGNoRmlsdGVyKFRyZWVXYWxrIHdhbGtlcikKIAogCQlAT3ZlcnJpZGUKIAkJcHVibGljIGJvb2xlYW4gc2hvdWxkQmVSZWN1cnNpdmUoKSB7Ci0JCQlmb3IgKGZpbmFsIFRyZWVGaWx0ZXIgZiA6IHN1YmZpbHRlcnMpCisJCQlmb3IgKFRyZWVGaWx0ZXIgZiA6IHN1YmZpbHRlcnMpCiAJCQkJaWYgKGYuc2hvdWxkQmVSZWN1cnNpdmUoKSkKIAkJCQkJcmV0dXJuIHRydWU7CiAJCQlyZXR1cm4gZmFsc2U7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9CeXRlQXJyYXlTZXQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL0J5dGVBcnJheVNldC5qYXZhCmluZGV4IDY1Mzc4NmIuLjk5NTU2MWUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL0J5dGVBcnJheVNldC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL0J5dGVBcnJheVNldC5qYXZhCkBAIC03Nyw3ICs3Nyw3IEBAIGNsYXNzIEJ5dGVBcnJheVNldCB7CiAJCWluaXRUYWJsZSgxIDw8IEludGVnZXIuaGlnaGVzdE9uZUJpdCgoY2FwYWNpdHkgKiAyKSAtIDEpKTsKIAl9CiAKLQlwcml2YXRlIGJ5dGVbXSBnZXQoZmluYWwgYnl0ZVtdIHRvRmluZCwgaW50IGxlbmd0aCwgaW50IGhhc2gpIHsKKwlwcml2YXRlIGJ5dGVbXSBnZXQoYnl0ZVtdIHRvRmluZCwgaW50IGxlbmd0aCwgaW50IGhhc2gpIHsKIAkJZmluYWwgaW50IG1zayA9IG1hc2s7CiAJCWludCBpID0gaGFzaCAmIG1zazsKIAkJZmluYWwgYnl0ZVtdW10gdGJsID0gdGFibGU7CkBAIC0xMTIsNyArMTEyLDcgQEAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBlcXVhbHMoYnl0ZVtdIHN0b3JlZE9iaiwgYnl0ZVtdIHRvRmluZCwgaW50IGxlbmd0aCkgewogCSAqICAgICAgICAgICAgcHJlLWNvbXB1dGVkIGhhc2ggb2YgdG9GaW5kCiAJICogQHJldHVybiB0cnVlIGlmIHRoZSBtYXBwaW5nIGV4aXN0cyBmb3IgdGhpcyBieXRlIGFycmF5OyBmYWxzZSBvdGhlcndpc2UuCiAJICovCi0JYm9vbGVhbiBjb250YWlucyhmaW5hbCBieXRlW10gdG9GaW5kLCBpbnQgbGVuZ3RoLCBpbnQgaGFzaCkgeworCWJvb2xlYW4gY29udGFpbnMoYnl0ZVtdIHRvRmluZCwgaW50IGxlbmd0aCwgaW50IGhhc2gpIHsKIAkJcmV0dXJuIGdldCh0b0ZpbmQsIGxlbmd0aCwgaGFzaCkgIT0gbnVsbDsKIAl9CiAKQEAgLTE4MCw3ICsxODAsNyBAQCBib29sZWFuIGlzRW1wdHkoKSB7CiAJCXJldHVybiBzaXplID09IDA7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGluc2VydChmaW5hbCBieXRlW10gbmV3VmFsdWUsIGludCBoYXNoKSB7CisJcHJpdmF0ZSB2b2lkIGluc2VydChieXRlW10gbmV3VmFsdWUsIGludCBoYXNoKSB7CiAJCWZpbmFsIGludCBtc2sgPSBtYXNrOwogCQlpbnQgaiA9IGhhc2ggJiBtc2s7CiAJCWZpbmFsIGJ5dGVbXVtdIHRibCA9IHRhYmxlOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvSW50ZXJJbmRleERpZmZGaWx0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL0ludGVySW5kZXhEaWZmRmlsdGVyLmphdmEKaW5kZXggODFiOGU2ZC4uMzM4ZWUyYiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvSW50ZXJJbmRleERpZmZGaWx0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9JbnRlckluZGV4RGlmZkZpbHRlci5qYXZhCkBAIC02Myw3ICs2Myw3IEBAIHB1YmxpYyBmaW5hbCBjbGFzcyBJbnRlckluZGV4RGlmZkZpbHRlciBleHRlbmRzIFRyZWVGaWx0ZXIgewogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKGZpbmFsIFRyZWVXYWxrIHdhbGtlcikgeworCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoVHJlZVdhbGsgd2Fsa2VyKSB7CiAJCWZpbmFsIGludCBuID0gd2Fsa2VyLmdldFRyZWVDb3VudCgpOwogCQlpZiAobiA9PSAxKSAvLyBBc3N1bWUgdGhleSBtZWFudCBkaWZmZXJlbmNlIHRvIGVtcHR5IHRyZWUuCiAJCQlyZXR1cm4gdHJ1ZTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL05vdElnbm9yZWRGaWx0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL05vdElnbm9yZWRGaWx0ZXIuamF2YQppbmRleCAzNDAzYzc4Li42MDkwNTA4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9Ob3RJZ25vcmVkRmlsdGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvTm90SWdub3JlZEZpbHRlci5qYXZhCkBAIC02Miw3ICs2Miw3IEBAIHB1YmxpYyBjbGFzcyBOb3RJZ25vcmVkRmlsdGVyIGV4dGVuZHMgVHJlZUZpbHRlciB7CiAJICogQHBhcmFtIHdvcmtkaXJUcmVlSW5kZXgKIAkgKiAgICAgICAgICAgIGluZGV4IG9mIHRoZSB3b3JrZGlyIHRyZWUgaW4gdGhlIHRyZWUgd2FsawogCSAqLwotCXB1YmxpYyBOb3RJZ25vcmVkRmlsdGVyKGZpbmFsIGludCB3b3JrZGlyVHJlZUluZGV4KSB7CisJcHVibGljIE5vdElnbm9yZWRGaWx0ZXIoaW50IHdvcmtkaXJUcmVlSW5kZXgpIHsKIAkJdGhpcy5pbmRleCA9IHdvcmtkaXJUcmVlSW5kZXg7CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9Ob3RUcmVlRmlsdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9Ob3RUcmVlRmlsdGVyLmphdmEKaW5kZXggMmUwMjNkMC4uZDMxNTUyNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvTm90VHJlZUZpbHRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL05vdFRyZWVGaWx0ZXIuamF2YQpAQCAtNjEsMTMgKzYxLDEzIEBAIHB1YmxpYyBjbGFzcyBOb3RUcmVlRmlsdGVyIGV4dGVuZHMgVHJlZUZpbHRlciB7CiAJICogICAgICAgICAgICBmaWx0ZXIgdG8gbmVnYXRlLgogCSAqIEByZXR1cm4gYSBmaWx0ZXIgdGhhdCBkb2VzIHRoZSByZXZlcnNlIG9mIDxjb2RlPmE8L2NvZGU+LgogCSAqLwotCXB1YmxpYyBzdGF0aWMgVHJlZUZpbHRlciBjcmVhdGUoZmluYWwgVHJlZUZpbHRlciBhKSB7CisJcHVibGljIHN0YXRpYyBUcmVlRmlsdGVyIGNyZWF0ZShUcmVlRmlsdGVyIGEpIHsKIAkJcmV0dXJuIG5ldyBOb3RUcmVlRmlsdGVyKGEpOwogCX0KIAogCXByaXZhdGUgZmluYWwgVHJlZUZpbHRlciBhOwogCi0JcHJpdmF0ZSBOb3RUcmVlRmlsdGVyKGZpbmFsIFRyZWVGaWx0ZXIgb25lKSB7CisJcHJpdmF0ZSBOb3RUcmVlRmlsdGVyKFRyZWVGaWx0ZXIgb25lKSB7CiAJCWEgPSBvbmU7CiAJfQogCkBAIC03OSw3ICs3OSw3IEBAIHB1YmxpYyBUcmVlRmlsdGVyIG5lZ2F0ZSgpIHsKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaW5jbHVkZShmaW5hbCBUcmVlV2FsayB3YWxrZXIpCisJcHVibGljIGJvb2xlYW4gaW5jbHVkZShUcmVlV2FsayB3YWxrZXIpCiAJCQl0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwKIAkJCUlPRXhjZXB0aW9uIHsKIAkJcmV0dXJuIG1hdGNoRmlsdGVyKHdhbGtlcikgPT0gMDsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL09yVHJlZUZpbHRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvT3JUcmVlRmlsdGVyLmphdmEKaW5kZXggZGJiMDYyYi4uMzA4ZmYwYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvT3JUcmVlRmlsdGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvT3JUcmVlRmlsdGVyLmphdmEKQEAgLTcxLDcgKzcxLDcgQEAgcHVibGljIGFic3RyYWN0IGNsYXNzIE9yVHJlZUZpbHRlciBleHRlbmRzIFRyZWVGaWx0ZXIgewogCSAqICAgICAgICAgICAgc2Vjb25kIGZpbHRlciB0byB0ZXN0LgogCSAqIEByZXR1cm4gYSBmaWx0ZXIgdGhhdCBtdXN0IG1hdGNoIGF0IGxlYXN0IG9uZSBpbnB1dCBmaWx0ZXIuCiAJICovCi0JcHVibGljIHN0YXRpYyBUcmVlRmlsdGVyIGNyZWF0ZShmaW5hbCBUcmVlRmlsdGVyIGEsIGZpbmFsIFRyZWVGaWx0ZXIgYikgeworCXB1YmxpYyBzdGF0aWMgVHJlZUZpbHRlciBjcmVhdGUoVHJlZUZpbHRlciBhLCBUcmVlRmlsdGVyIGIpIHsKIAkJaWYgKGEgPT0gQUxMIHx8IGIgPT0gQUxMKQogCQkJcmV0dXJuIEFMTDsKIAkJcmV0dXJuIG5ldyBCaW5hcnkoYSwgYik7CkBAIC04NSw3ICs4NSw3IEBAIHB1YmxpYyBzdGF0aWMgVHJlZUZpbHRlciBjcmVhdGUoZmluYWwgVHJlZUZpbHRlciBhLCBmaW5hbCBUcmVlRmlsdGVyIGIpIHsKIAkgKiAgICAgICAgICAgIGZpbHRlcnMuCiAJICogQHJldHVybiBhIGZpbHRlciB0aGF0IG11c3QgbWF0Y2ggYXQgbGVhc3Qgb25lIGlucHV0IGZpbHRlci4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIFRyZWVGaWx0ZXIgY3JlYXRlKGZpbmFsIFRyZWVGaWx0ZXJbXSBsaXN0KSB7CisJcHVibGljIHN0YXRpYyBUcmVlRmlsdGVyIGNyZWF0ZShUcmVlRmlsdGVyW10gbGlzdCkgewogCQlpZiAobGlzdC5sZW5ndGggPT0gMikKIAkJCXJldHVybiBjcmVhdGUobGlzdFswXSwgbGlzdFsxXSk7CiAJCWlmIChsaXN0Lmxlbmd0aCA8IDIpCkBAIC0xMDMsNyArMTAzLDcgQEAgcHVibGljIHN0YXRpYyBUcmVlRmlsdGVyIGNyZWF0ZShmaW5hbCBUcmVlRmlsdGVyW10gbGlzdCkgewogCSAqICAgICAgICAgICAgZmlsdGVycy4KIAkgKiBAcmV0dXJuIGEgZmlsdGVyIHRoYXQgbXVzdCBtYXRjaCBhdCBsZWFzdCBvbmUgaW5wdXQgZmlsdGVyLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgVHJlZUZpbHRlciBjcmVhdGUoZmluYWwgQ29sbGVjdGlvbjxUcmVlRmlsdGVyPiBsaXN0KSB7CisJcHVibGljIHN0YXRpYyBUcmVlRmlsdGVyIGNyZWF0ZShDb2xsZWN0aW9uPFRyZWVGaWx0ZXI+IGxpc3QpIHsKIAkJaWYgKGxpc3Quc2l6ZSgpIDwgMikKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oSkdpdFRleHQuZ2V0KCkuYXRMZWFzdFR3b0ZpbHRlcnNOZWVkZWQpOwogCQlmaW5hbCBUcmVlRmlsdGVyW10gc3ViZmlsdGVycyA9IG5ldyBUcmVlRmlsdGVyW2xpc3Quc2l6ZSgpXTsKQEAgLTExOCwxMyArMTE4LDEzIEBAIHByaXZhdGUgc3RhdGljIGNsYXNzIEJpbmFyeSBleHRlbmRzIE9yVHJlZUZpbHRlciB7CiAKIAkJcHJpdmF0ZSBmaW5hbCBUcmVlRmlsdGVyIGI7CiAKLQkJQmluYXJ5KGZpbmFsIFRyZWVGaWx0ZXIgb25lLCBmaW5hbCBUcmVlRmlsdGVyIHR3bykgeworCQlCaW5hcnkoVHJlZUZpbHRlciBvbmUsIFRyZWVGaWx0ZXIgdHdvKSB7CiAJCQlhID0gb25lOwogCQkJYiA9IHR3bzsKIAkJfQogCiAJCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKGZpbmFsIFRyZWVXYWxrIHdhbGtlcikKKwkJcHVibGljIGJvb2xlYW4gaW5jbHVkZShUcmVlV2FsayB3YWxrZXIpCiAJCQkJdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sCiAJCQkJSU9FeGNlcHRpb24gewogCQkJcmV0dXJuIG1hdGNoRmlsdGVyKHdhbGtlcikgPD0gMDsKQEAgLTE2OCwxMiArMTY4LDEyIEBAIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTGlzdCBleHRlbmRzIE9yVHJlZUZpbHRlciB7CiAJCXByaXZhdGUgZmluYWwgVHJlZUZpbHRlcltdIHN1YmZpbHRlcnM7CiAKLQkJTGlzdChmaW5hbCBUcmVlRmlsdGVyW10gbGlzdCkgeworCQlMaXN0KFRyZWVGaWx0ZXJbXSBsaXN0KSB7CiAJCQlzdWJmaWx0ZXJzID0gbGlzdDsKIAkJfQogCiAJCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKGZpbmFsIFRyZWVXYWxrIHdhbGtlcikKKwkJcHVibGljIGJvb2xlYW4gaW5jbHVkZShUcmVlV2FsayB3YWxrZXIpCiAJCQkJdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sCiAJCQkJSU9FeGNlcHRpb24gewogCQkJcmV0dXJuIG1hdGNoRmlsdGVyKHdhbGtlcikgPD0gMDsKQEAgLTE4NCw3ICsxODQsNyBAQCBwdWJsaWMgaW50IG1hdGNoRmlsdGVyKFRyZWVXYWxrIHdhbGtlcikKIAkJCQl0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwKIAkJCQlJT0V4Y2VwdGlvbiB7CiAJCQlpbnQgbSA9IDE7Ci0JCQlmb3IgKGZpbmFsIFRyZWVGaWx0ZXIgZiA6IHN1YmZpbHRlcnMpIHsKKwkJCWZvciAoVHJlZUZpbHRlciBmIDogc3ViZmlsdGVycykgewogCQkJCWludCByID0gZi5tYXRjaEZpbHRlcih3YWxrZXIpOwogCQkJCWlmIChyID09IDApIHsKIAkJCQkJcmV0dXJuIDA7CkBAIC0xOTgsNyArMTk4LDcgQEAgcHVibGljIGludCBtYXRjaEZpbHRlcihUcmVlV2FsayB3YWxrZXIpCiAKIAkJQE92ZXJyaWRlCiAJCXB1YmxpYyBib29sZWFuIHNob3VsZEJlUmVjdXJzaXZlKCkgewotCQkJZm9yIChmaW5hbCBUcmVlRmlsdGVyIGYgOiBzdWJmaWx0ZXJzKQorCQkJZm9yIChUcmVlRmlsdGVyIGYgOiBzdWJmaWx0ZXJzKQogCQkJCWlmIChmLnNob3VsZEJlUmVjdXJzaXZlKCkpCiAJCQkJCXJldHVybiB0cnVlOwogCQkJcmV0dXJuIGZhbHNlOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvUGF0aEZpbHRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvUGF0aEZpbHRlci5qYXZhCmluZGV4IDJmN2Y1Y2QuLjkyNjdmYjYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL1BhdGhGaWx0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9QYXRoRmlsdGVyLmphdmEKQEAgLTg2LDcgKzg2LDcgQEAgcHVibGljIHN0YXRpYyBQYXRoRmlsdGVyIGNyZWF0ZShTdHJpbmcgcGF0aCkgewogCiAJZmluYWwgYnl0ZVtdIHBhdGhSYXc7CiAKLQlwcml2YXRlIFBhdGhGaWx0ZXIoZmluYWwgU3RyaW5nIHMpIHsKKwlwcml2YXRlIFBhdGhGaWx0ZXIoU3RyaW5nIHMpIHsKIAkJcGF0aFN0ciA9IHM7CiAJCXBhdGhSYXcgPSBDb25zdGFudHMuZW5jb2RlKHBhdGhTdHIpOwogCX0KQEAgLTEwMiwyMCArMTAyLDIwIEBAIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpIHsKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaW5jbHVkZShmaW5hbCBUcmVlV2FsayB3YWxrZXIpIHsKKwlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKFRyZWVXYWxrIHdhbGtlcikgewogCQlyZXR1cm4gbWF0Y2hGaWx0ZXIod2Fsa2VyKSA8PSAwOwogCX0KIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGludCBtYXRjaEZpbHRlcihmaW5hbCBUcmVlV2FsayB3YWxrZXIpIHsKKwlwdWJsaWMgaW50IG1hdGNoRmlsdGVyKFRyZWVXYWxrIHdhbGtlcikgewogCQlyZXR1cm4gd2Fsa2VyLmlzUGF0aE1hdGNoKHBhdGhSYXcsIHBhdGhSYXcubGVuZ3RoKTsKIAl9CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIHNob3VsZEJlUmVjdXJzaXZlKCkgewotCQlmb3IgKGZpbmFsIGJ5dGUgYiA6IHBhdGhSYXcpCisJCWZvciAoYnl0ZSBiIDogcGF0aFJhdykKIAkJCWlmIChiID09ICcvJykKIAkJCQlyZXR1cm4gdHJ1ZTsKIAkJcmV0dXJuIGZhbHNlOwpAQCAtMTQzLDcgKzE0Myw3IEBAIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHBhdGggbGVuZ3RoIG9mIHRoaXMgZmlsdGVyIG1hdGNoZXMgdGhlIGxlbmd0aAogCSAqICAgICAgICAgb2YgdGhlIGN1cnJlbnQgcGF0aCBvZiB0aGUgc3VwcGxpZWQgVHJlZVdhbGsuCiAJICovCi0JcHVibGljIGJvb2xlYW4gaXNEb25lKGZpbmFsIFRyZWVXYWxrIHdhbGtlcikgeworCXB1YmxpYyBib29sZWFuIGlzRG9uZShUcmVlV2FsayB3YWxrZXIpIHsKIAkJcmV0dXJuIHBhdGhSYXcubGVuZ3RoID09IHdhbGtlci5nZXRQYXRoTGVuZ3RoKCk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvUGF0aEZpbHRlckdyb3VwLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9QYXRoRmlsdGVyR3JvdXAuamF2YQppbmRleCAwNjUyMjg4Li41Y2Y1NzUwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9QYXRoRmlsdGVyR3JvdXAuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9QYXRoRmlsdGVyR3JvdXAuamF2YQpAQCAtODIsMTMgKzgyLDEzIEBAIHB1YmxpYyBjbGFzcyBQYXRoRmlsdGVyR3JvdXAgewogCSAqICAgICAgICAgICAgdGhlIHBhdGhzIHRvIHRlc3QgYWdhaW5zdC4gTXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBlbnRyeS4KIAkgKiBAcmV0dXJuIGEgbmV3IGZpbHRlciBmb3IgdGhlIGxpc3Qgb2YgcGF0aHMgc3VwcGxpZWQuCiAJICovCi0JcHVibGljIHN0YXRpYyBUcmVlRmlsdGVyIGNyZWF0ZUZyb21TdHJpbmdzKGZpbmFsIENvbGxlY3Rpb248U3RyaW5nPiBwYXRocykgeworCXB1YmxpYyBzdGF0aWMgVHJlZUZpbHRlciBjcmVhdGVGcm9tU3RyaW5ncyhDb2xsZWN0aW9uPFN0cmluZz4gcGF0aHMpIHsKIAkJaWYgKHBhdGhzLmlzRW1wdHkoKSkKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCiAJCQkJCUpHaXRUZXh0LmdldCgpLmF0TGVhc3RPbmVQYXRoSXNSZXF1aXJlZCk7CiAJCWZpbmFsIFBhdGhGaWx0ZXJbXSBwID0gbmV3IFBhdGhGaWx0ZXJbcGF0aHMuc2l6ZSgpXTsKIAkJaW50IGkgPSAwOwotCQlmb3IgKGZpbmFsIFN0cmluZyBzIDogcGF0aHMpCisJCWZvciAoU3RyaW5nIHMgOiBwYXRocykKIAkJCXBbaSsrXSA9IFBhdGhGaWx0ZXIuY3JlYXRlKHMpOwogCQlyZXR1cm4gY3JlYXRlKHApOwogCX0KQEAgLTEwOSw3ICsxMDksNyBAQCBwdWJsaWMgc3RhdGljIFRyZWVGaWx0ZXIgY3JlYXRlRnJvbVN0cmluZ3MoZmluYWwgQ29sbGVjdGlvbjxTdHJpbmc+IHBhdGhzKSB7CiAJICogICAgICAgICAgICB0aGUgcGF0aHMgdG8gdGVzdCBhZ2FpbnN0LiBNdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGVudHJ5LgogCSAqIEByZXR1cm4gYSBuZXcgZmlsdGVyIGZvciB0aGUgcGF0aHMgc3VwcGxpZWQuCiAJICovCi0JcHVibGljIHN0YXRpYyBUcmVlRmlsdGVyIGNyZWF0ZUZyb21TdHJpbmdzKGZpbmFsIFN0cmluZy4uLiBwYXRocykgeworCXB1YmxpYyBzdGF0aWMgVHJlZUZpbHRlciBjcmVhdGVGcm9tU3RyaW5ncyhTdHJpbmcuLi4gcGF0aHMpIHsKIAkJaWYgKHBhdGhzLmxlbmd0aCA9PSAwKQogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKIAkJCQkJSkdpdFRleHQuZ2V0KCkuYXRMZWFzdE9uZVBhdGhJc1JlcXVpcmVkKTsKQEAgLTEzMSw3ICsxMzEsNyBAQCBwdWJsaWMgc3RhdGljIFRyZWVGaWx0ZXIgY3JlYXRlRnJvbVN0cmluZ3MoZmluYWwgU3RyaW5nLi4uIHBhdGhzKSB7CiAJICogICAgICAgICAgICB0aGUgcGF0aHMgdG8gdGVzdCBhZ2FpbnN0LiBNdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGVudHJ5LgogCSAqIEByZXR1cm4gYSBuZXcgZmlsdGVyIGZvciB0aGUgbGlzdCBvZiBwYXRocyBzdXBwbGllZC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIFRyZWVGaWx0ZXIgY3JlYXRlKGZpbmFsIENvbGxlY3Rpb248UGF0aEZpbHRlcj4gcGF0aHMpIHsKKwlwdWJsaWMgc3RhdGljIFRyZWVGaWx0ZXIgY3JlYXRlKENvbGxlY3Rpb248UGF0aEZpbHRlcj4gcGF0aHMpIHsKIAkJaWYgKHBhdGhzLmlzRW1wdHkoKSkKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCiAJCQkJCUpHaXRUZXh0LmdldCgpLmF0TGVhc3RPbmVQYXRoSXNSZXF1aXJlZCk7CkBAIC0xNDAsNyArMTQwLDcgQEAgcHVibGljIHN0YXRpYyBUcmVlRmlsdGVyIGNyZWF0ZShmaW5hbCBDb2xsZWN0aW9uPFBhdGhGaWx0ZXI+IHBhdGhzKSB7CiAJCXJldHVybiBjcmVhdGUocCk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgVHJlZUZpbHRlciBjcmVhdGUoZmluYWwgUGF0aEZpbHRlcltdIHApIHsKKwlwcml2YXRlIHN0YXRpYyBUcmVlRmlsdGVyIGNyZWF0ZShQYXRoRmlsdGVyW10gcCkgewogCQlpZiAocC5sZW5ndGggPT0gMSkKIAkJCXJldHVybiBuZXcgU2luZ2xlKHBbMF0pOwogCQlyZXR1cm4gbmV3IEdyb3VwKHApOwpAQCAtMTUxLDEzICsxNTEsMTMgQEAgc3RhdGljIGNsYXNzIFNpbmdsZSBleHRlbmRzIFRyZWVGaWx0ZXIgewogCiAJCXByaXZhdGUgZmluYWwgYnl0ZVtdIHJhdzsKIAotCQlwcml2YXRlIFNpbmdsZShmaW5hbCBQYXRoRmlsdGVyIHApIHsKKwkJcHJpdmF0ZSBTaW5nbGUoUGF0aEZpbHRlciBwKSB7CiAJCQlwYXRoID0gcDsKIAkJCXJhdyA9IHBhdGgucGF0aFJhdzsKIAkJfQogCiAJCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKGZpbmFsIFRyZWVXYWxrIHdhbGtlcikgeworCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKFRyZWVXYWxrIHdhbGtlcikgewogCQkJZmluYWwgaW50IGNtcCA9IHdhbGtlci5pc1BhdGhQcmVmaXgocmF3LCByYXcubGVuZ3RoKTsKIAkJCWlmIChjbXAgPiAwKQogCQkJCXRocm93IFN0b3BXYWxrRXhjZXB0aW9uLklOU1RBTkNFOwpAQCAtMTg4LDcgKzE4OCw3IEBAIHN0YXRpYyBjbGFzcyBHcm91cCBleHRlbmRzIFRyZWVGaWx0ZXIgewogCiAJCXByaXZhdGUgYnl0ZVtdIG1heDsKIAotCQlwcml2YXRlIEdyb3VwKGZpbmFsIFBhdGhGaWx0ZXJbXSBwYXRoRmlsdGVycykgeworCQlwcml2YXRlIEdyb3VwKFBhdGhGaWx0ZXJbXSBwYXRoRmlsdGVycykgewogCQkJZnVsbHBhdGhzID0gbmV3IEJ5dGVBcnJheVNldChwYXRoRmlsdGVycy5sZW5ndGgpOwogCQkJcHJlZml4ZXMgPSBuZXcgQnl0ZUFycmF5U2V0KHBhdGhGaWx0ZXJzLmxlbmd0aCAvIDUpOwogCQkJLy8gNSBpcyBhbiBlbXBpcmljYWxseSBkZXJpdmVkIHJhdGlvIG9mICNwYXRocy8jcHJlZml4ZXMgZnJvbToKQEAgLTIzOSw3ICsyMzksNyBAQCBwcml2YXRlIHN0YXRpYyBpbnQgY29tcGFyZShieXRlW10gYSwgYnl0ZVtdIGIpIHsKIAkJfQogCiAJCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKGZpbmFsIFRyZWVXYWxrIHdhbGtlcikgeworCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKFRyZWVXYWxrIHdhbGtlcikgewogCiAJCQlieXRlW10gcnAgPSB3YWxrZXIuZ2V0UmF3UGF0aCgpOwogCQkJSGFzaGVyIGhhc2hlciA9IG5ldyBIYXNoZXIocnAsIHdhbGtlci5nZXRQYXRoTGVuZ3RoKCkpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvUGF0aFN1ZmZpeEZpbHRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvUGF0aFN1ZmZpeEZpbHRlci5qYXZhCmluZGV4IDU1M2U2YmQuLjNkOWY4NzUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL1BhdGhTdWZmaXhGaWx0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9QYXRoU3VmZml4RmlsdGVyLmphdmEKQEAgLTg0LDcgKzg0LDcgQEAgcHVibGljIHN0YXRpYyBQYXRoU3VmZml4RmlsdGVyIGNyZWF0ZShTdHJpbmcgcGF0aCkgewogCWZpbmFsIFN0cmluZyBwYXRoU3RyOwogCWZpbmFsIGJ5dGVbXSBwYXRoUmF3OwogCi0JcHJpdmF0ZSBQYXRoU3VmZml4RmlsdGVyKGZpbmFsIFN0cmluZyBzKSB7CisJcHJpdmF0ZSBQYXRoU3VmZml4RmlsdGVyKFN0cmluZyBzKSB7CiAJCXBhdGhTdHIgPSBzOwogCQlwYXRoUmF3ID0gQ29uc3RhbnRzLmVuY29kZShwYXRoU3RyKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9UcmVlRmlsdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9UcmVlRmlsdGVyLmphdmEKaW5kZXggZjBhNzYzMi4uMTFhZDQ2NSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvVHJlZUZpbHRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL1RyZWVGaWx0ZXIuamF2YQpAQCAtOTEsNyArOTEsNyBAQCBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVHJlZUZpbHRlciB7CiAKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBBbGxGaWx0ZXIgZXh0ZW5kcyBUcmVlRmlsdGVyIHsKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoZmluYWwgVHJlZVdhbGsgd2Fsa2VyKSB7CisJCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoVHJlZVdhbGsgd2Fsa2VyKSB7CiAJCQlyZXR1cm4gdHJ1ZTsKIAkJfQogCkBAIC0xMzMsNyArMTMzLDcgQEAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgQW55RGlmZkZpbHRlciBleHRlbmRzIFRyZWVGaWx0ZXIgewogCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgYmFzZVRyZWUgPSAwOwogCiAJCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKGZpbmFsIFRyZWVXYWxrIHdhbGtlcikgeworCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKFRyZWVXYWxrIHdhbGtlcikgewogCQkJZmluYWwgaW50IG4gPSB3YWxrZXIuZ2V0VHJlZUNvdW50KCk7CiAJCQlpZiAobiA9PSAxKSAvLyBBc3N1bWUgdGhleSBtZWFudCBkaWZmZXJlbmNlIHRvIGVtcHR5IHRyZWUuCiAJCQkJcmV0dXJuIHRydWU7CkBAIC0yMjEsNyArMjIxLDcgQEAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaW5jbHVkZShUcmVlV2FsayB3YWxrZXIpCiAJICogICAgICAgICAgICAgYXMgdGhyb3duIGJ5IHtAbGluayAjaW5jbHVkZShUcmVlV2Fsayl9CiAJICogQHNpbmNlIDQuNwogCSAqLwotCXB1YmxpYyBpbnQgbWF0Y2hGaWx0ZXIoZmluYWwgVHJlZVdhbGsgd2Fsa2VyKQorCXB1YmxpYyBpbnQgbWF0Y2hGaWx0ZXIoVHJlZVdhbGsgd2Fsa2VyKQogCQkJdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sCiAJCQlJT0V4Y2VwdGlvbgogCXsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9CYXNlNjQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9CYXNlNjQuamF2YQppbmRleCAwYzI3Y2VkLi40NDJmMDc5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvQmFzZTY0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0Jhc2U2NC5qYXZhCkBAIC02LDkgKzYsOCBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQudXRpbDsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogCi1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOwogaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiAKQEAgLTU1LDcgKzU0LDcgQEAgcHVibGljIGNsYXNzIEJhc2U2NCB7CiAJCQkJKyAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiIC8vIC8vJE5PTi1OTFMtMSQKIAkJCQkrICIwMTIzNDU2Nzg5IiAvLyAvLyROT04tTkxTLTEkCiAJCQkJKyAiKy8iIC8vIC8vJE5PTi1OTFMtMSQKLQkJKS5nZXRCeXRlcyhVVEZfOCk7CisJCSkuZ2V0Qnl0ZXMoQ0hBUlNFVCk7CiAKIAkJREVDID0gbmV3IGJ5dGVbMTI4XTsKIAkJQXJyYXlzLmZpbGwoREVDLCBJTlZBTElEX0RFQyk7CkBAIC0xNzgsNyArMTc3LDcgQEAgcHVibGljIHN0YXRpYyBTdHJpbmcgZW5jb2RlQnl0ZXMoYnl0ZVtdIHNvdXJjZSwgaW50IG9mZiwgaW50IGxlbikgewogCQkJZSArPSA0OwogCQl9CiAKLQkJcmV0dXJuIG5ldyBTdHJpbmcob3V0QnVmZiwgMCwgZSwgU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CisJCXJldHVybiBuZXcgU3RyaW5nKG91dEJ1ZmYsIDAsIGUsIENIQVJTRVQpOwogCX0KIAogCS8qKgpAQCAtMjk0LDcgKzI5Myw3IEBAIGVsc2UgaWYgKHNvdXJjZVtzcmNPZmZzZXQgKyAzXSA9PSBFUVVBTFNfU0lHTikgewogCSAqIEByZXR1cm4gdGhlIGRlY29kZWQgZGF0YQogCSAqLwogCXB1YmxpYyBzdGF0aWMgYnl0ZVtdIGRlY29kZShTdHJpbmcgcykgewotCQlieXRlW10gYnl0ZXMgPSBzLmdldEJ5dGVzKFVURl84KTsKKwkJYnl0ZVtdIGJ5dGVzID0gcy5nZXRCeXRlcyhDSEFSU0VUKTsKIAkJcmV0dXJuIGRlY29kZShieXRlcywgMCwgYnl0ZXMubGVuZ3RoKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvQ2FjaGVkQXV0aGVudGljYXRvci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0NhY2hlZEF1dGhlbnRpY2F0b3IuamF2YQppbmRleCA5OTE1YmRmLi42YjU4NzkwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvQ2FjaGVkQXV0aGVudGljYXRvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9DYWNoZWRBdXRoZW50aWNhdG9yLmphdmEKQEAgLTYxLDcgKzYxLDcgQEAgcHVibGljIGFic3RyYWN0IGNsYXNzIENhY2hlZEF1dGhlbnRpY2F0b3IgZXh0ZW5kcyBBdXRoZW50aWNhdG9yIHsKIAkgKiBAcGFyYW0gY2EKIAkgKiAgICAgICAgICAgIHRoZSBpbmZvcm1hdGlvbiB3ZSBzaG91bGQgcmVtZW1iZXIuCiAJICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZChmaW5hbCBDYWNoZWRBdXRoZW50aWNhdGlvbiBjYSkgeworCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGQoQ2FjaGVkQXV0aGVudGljYXRpb24gY2EpIHsKIAkJY2FjaGVkLmFkZChjYSk7CiAJfQogCkBAIC03MCw3ICs3MCw3IEBAIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGQoZmluYWwgQ2FjaGVkQXV0aGVudGljYXRpb24gY2EpIHsKIAlwcm90ZWN0ZWQgZmluYWwgUGFzc3dvcmRBdXRoZW50aWNhdGlvbiBnZXRQYXNzd29yZEF1dGhlbnRpY2F0aW9uKCkgewogCQlmaW5hbCBTdHJpbmcgaG9zdCA9IGdldFJlcXVlc3RpbmdIb3N0KCk7CiAJCWZpbmFsIGludCBwb3J0ID0gZ2V0UmVxdWVzdGluZ1BvcnQoKTsKLQkJZm9yIChmaW5hbCBDYWNoZWRBdXRoZW50aWNhdGlvbiBjYSA6IGNhY2hlZCkgeworCQlmb3IgKENhY2hlZEF1dGhlbnRpY2F0aW9uIGNhIDogY2FjaGVkKSB7CiAJCQlpZiAoY2EuaG9zdC5lcXVhbHMoaG9zdCkgJiYgY2EucG9ydCA9PSBwb3J0KQogCQkJCXJldHVybiBjYS50b1Bhc3N3b3JkQXV0aGVudGljYXRpb24oKTsKIAkJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0ZTLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvRlMuamF2YQppbmRleCBjZmZjYjU1Li5kMDkzODE4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvRlMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvRlMuamF2YQpAQCAtNzYsNiArNzYsOSBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuSkdpdFRleHQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5GaWxlVHJlZUl0ZXJhdG9yLkZpbGVFbnRyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLkZpbGVUcmVlSXRlcmF0b3IuRmlsZU1vZGVTdHJhdGVneTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLldvcmtpbmdUcmVlSXRlcmF0b3IuRW50cnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLlByb2Nlc3NSZXN1bHQuU3RhdHVzOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CkBAIC04Nyw2ICs5MCwxNCBAQCBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRlMgewogCXByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihGUy5jbGFzcyk7CiAKIAkvKioKKwkgKiBBbiBlbXB0eSBhcnJheSBvZiBlbnRyaWVzLCBzdWl0YWJsZSBhcyBhIHJldHVybiB2YWx1ZSBmb3IKKwkgKiB7QGxpbmsgI2xpc3QoRmlsZSwgRmlsZU1vZGVTdHJhdGVneSl9LgorCSAqCisJICogQHNpbmNlIDUuMAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRW50cnlbXSBOT19FTlRSSUVTID0ge307CisKKwkvKioKIAkgKiBUaGlzIGNsYXNzIGNyZWF0ZXMgRlMgaW5zdGFuY2VzLiBJdCB3aWxsIGJlIG92ZXJyaWRkZW4gYnkgYSBKYXZhNyB2YXJpYW50CiAJICogaWYgc3VjaCBjYW4gYmUgZGV0ZWN0ZWQgaW4ge0BsaW5rICNkZXRlY3QoQm9vbGVhbil9LgogCSAqCkBAIC0zODQsNyArMzk1LDcgQEAgcHVibGljIHZvaWQgZGVsZXRlKEZpbGUgZikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkgKiBAcmV0dXJuIHRoZSB0cmFuc2xhdGVkIHBhdGguIDxjb2RlPm5ldyBGaWxlKGRpcixuYW1lKTwvY29kZT4gaWYgdGhpcwogCSAqICAgICAgICAgcGxhdGZvcm0gZG9lcyBub3QgcmVxdWlyZSBwYXRoIG5hbWUgdHJhbnNsYXRpb24uCiAJICovCi0JcHVibGljIEZpbGUgcmVzb2x2ZShmaW5hbCBGaWxlIGRpciwgZmluYWwgU3RyaW5nIG5hbWUpIHsKKwlwdWJsaWMgRmlsZSByZXNvbHZlKEZpbGUgZGlyLCBTdHJpbmcgbmFtZSkgewogCQlmaW5hbCBGaWxlIGFic3BuID0gbmV3IEZpbGUobmFtZSk7CiAJCWlmIChhYnNwbi5pc0Fic29sdXRlKCkpCiAJCQlyZXR1cm4gYWJzcG47CkBAIC00NzMsMTEgKzQ4NCwxMSBAQCBwdWJsaWMgU3RyaW5nIHJ1bigpIHsKIAkgKiBAcmV0dXJuIHRoZSBmaXJzdCBtYXRjaCBmb3VuZCwgb3IgbnVsbAogCSAqIEBzaW5jZSAzLjAKIAkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIEZpbGUgc2VhcmNoUGF0aChmaW5hbCBTdHJpbmcgcGF0aCwgZmluYWwgU3RyaW5nLi4uIGxvb2tGb3IpIHsKKwlwcm90ZWN0ZWQgc3RhdGljIEZpbGUgc2VhcmNoUGF0aChTdHJpbmcgcGF0aCwgU3RyaW5nLi4uIGxvb2tGb3IpIHsKIAkJaWYgKHBhdGggPT0gbnVsbCkKIAkJCXJldHVybiBudWxsOwogCi0JCWZvciAoZmluYWwgU3RyaW5nIHAgOiBwYXRoLnNwbGl0KEZpbGUucGF0aFNlcGFyYXRvcikpIHsKKwkJZm9yIChTdHJpbmcgcCA6IHBhdGguc3BsaXQoRmlsZS5wYXRoU2VwYXJhdG9yKSkgewogCQkJZm9yIChTdHJpbmcgY29tbWFuZCA6IGxvb2tGb3IpIHsKIAkJCQlmaW5hbCBGaWxlIGUgPSBuZXcgRmlsZShwLCBjb21tYW5kKTsKIAkJCQlpZiAoZS5pc0ZpbGUoKSkKQEAgLTk3NSw2ICs5ODYsMjkgQEAgcHVibGljIFN0cmluZyByZWxhdGl2aXplKFN0cmluZyBiYXNlLCBTdHJpbmcgb3RoZXIpIHsKIAl9CiAKIAkvKioKKwkgKiBFbnVtZXJhdGVzIGNoaWxkcmVuIG9mIGEgZGlyZWN0b3J5LgorCSAqCisJICogQHBhcmFtIGRpcmVjdG9yeQorCSAqICAgICAgICAgICAgdG8gZ2V0IHRoZSBjaGlsZHJlbiBvZgorCSAqIEBwYXJhbSBmaWxlTW9kZVN0cmF0ZWd5CisJICogICAgICAgICAgICB0byB1c2UgdG8gY2FsY3VsYXRlIHRoZSBnaXQgbW9kZSBvZiBhIGNoaWxkCisJICogQHJldHVybiBhbiBhcnJheSBvZiBlbnRyaWVzIGZvciB0aGUgY2hpbGRyZW4KKwkgKgorCSAqIEBzaW5jZSA1LjAKKwkgKi8KKwlwdWJsaWMgRW50cnlbXSBsaXN0KEZpbGUgZGlyZWN0b3J5LCBGaWxlTW9kZVN0cmF0ZWd5IGZpbGVNb2RlU3RyYXRlZ3kpIHsKKwkJZmluYWwgRmlsZVtdIGFsbCA9IGRpcmVjdG9yeS5saXN0RmlsZXMoKTsKKwkJaWYgKGFsbCA9PSBudWxsKSB7CisJCQlyZXR1cm4gTk9fRU5UUklFUzsKKwkJfQorCQlmaW5hbCBFbnRyeVtdIHJlc3VsdCA9IG5ldyBFbnRyeVthbGwubGVuZ3RoXTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspIHsKKwkJCXJlc3VsdFtpXSA9IG5ldyBGaWxlRW50cnkoYWxsW2ldLCB0aGlzLCBmaWxlTW9kZVN0cmF0ZWd5KTsKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgogCSAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBob29rIGlzIGRlZmluZWQgZm9yIHRoZSBnaXZlbiByZXBvc2l0b3J5LCB0aGVuCiAJICogcnVucyBpdCB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuCiAJICogPHA+CkBAIC0xMTExLDcgKzExNDUsNyBAQCBwcm90ZWN0ZWQgUHJvY2Vzc1Jlc3VsdCBpbnRlcm5hbFJ1bkhvb2tJZlByZXNlbnQoUmVwb3NpdG9yeSByZXBvc2l0b3J5LAogCSAqICAgICAgICAgZXhpc3RzIGluIHRoZSBnaXZlbiByZXBvc2l0b3J5LCA8Y29kZT5udWxsPC9jb2RlPiBvdGhlcndpc2UuCiAJICogQHNpbmNlIDQuMAogCSAqLwotCXB1YmxpYyBGaWxlIGZpbmRIb29rKFJlcG9zaXRvcnkgcmVwb3NpdG9yeSwgZmluYWwgU3RyaW5nIGhvb2tOYW1lKSB7CisJcHVibGljIEZpbGUgZmluZEhvb2soUmVwb3NpdG9yeSByZXBvc2l0b3J5LCBTdHJpbmcgaG9va05hbWUpIHsKIAkJRmlsZSBnaXREaXIgPSByZXBvc2l0b3J5LmdldERpcmVjdG9yeSgpOwogCQlpZiAoZ2l0RGlyID09IG51bGwpCiAJCQlyZXR1cm4gbnVsbDsKQEAgLTExOTYsMTkgKzEyMzAsMjMgQEAgcHVibGljIGludCBydW5Qcm9jZXNzKFByb2Nlc3NCdWlsZGVyIHByb2Nlc3NCdWlsZGVyLAogCQkJCQluZXcgU3RyZWFtR29iYmxlcihwcm9jZXNzLmdldEVycm9yU3RyZWFtKCksIGVyclJlZGlyZWN0KSk7CiAJCQlleGVjdXRvci5leGVjdXRlKAogCQkJCQluZXcgU3RyZWFtR29iYmxlcihwcm9jZXNzLmdldElucHV0U3RyZWFtKCksIG91dFJlZGlyZWN0KSk7CisJCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBDbG9zZWQgaW4gdGhlIGZpbmFsbHkgYmxvY2sKIAkJCU91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBwcm9jZXNzLmdldE91dHB1dFN0cmVhbSgpOwotCQkJaWYgKGluUmVkaXJlY3QgIT0gbnVsbCkgewotCQkJCW5ldyBTdHJlYW1Hb2JibGVyKGluUmVkaXJlY3QsIG91dHB1dFN0cmVhbSkuY29weSgpOwotCQkJfQogCQkJdHJ5IHsKLQkJCQlvdXRwdXRTdHJlYW0uY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBXaGVuIHRoZSBwcm9jZXNzIGV4aXRzIGJlZm9yZSBjb25zdW1pbmcgdGhlIGlucHV0LCB0aGUgT3V0cHV0U3RyZWFtCi0JCQkJLy8gaXMgcmVwbGFjZWQgd2l0aCB0aGUgbnVsbCBvdXRwdXQgc3RyZWFtLiBUaGlzIG51bGwgb3V0cHV0IHN0cmVhbQotCQkJCS8vIHRocm93cyBJT0V4Y2VwdGlvbiBmb3IgYWxsIHdyaXRlIGNhbGxzLiBXaGVuIFN0cmVhbUdvYmJsZXIgZmFpbHMgdG8KLQkJCQkvLyBmbHVzaCB0aGUgYnVmZmVyIGJlY2F1c2Ugb2YgdGhpcywgdGhpcyBjbG9zZSBjYWxsIHRyaWVzIHRvIGZsdXNoIGl0Ci0JCQkJLy8gYWdhaW4uIFRoaXMgY2F1c2VzIGFub3RoZXIgSU9FeGNlcHRpb24uIFNpbmNlIHdlIGlnbm9yZSB0aGUKLQkJCQkvLyBJT0V4Y2VwdGlvbiBpbiBTdHJlYW1Hb2JibGVyLCB3ZSBhbHNvIGlnbm9yZSB0aGUgZXhjZXB0aW9uIGhlcmUuCisJCQkJaWYgKGluUmVkaXJlY3QgIT0gbnVsbCkgeworCQkJCQluZXcgU3RyZWFtR29iYmxlcihpblJlZGlyZWN0LCBvdXRwdXRTdHJlYW0pLmNvcHkoKTsKKwkJCQl9CisJCQl9IGZpbmFsbHkgeworCQkJCXRyeSB7CisJCQkJCW91dHB1dFN0cmVhbS5jbG9zZSgpOworCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQkJLy8gV2hlbiB0aGUgcHJvY2VzcyBleGl0cyBiZWZvcmUgY29uc3VtaW5nIHRoZSBpbnB1dCwgdGhlIE91dHB1dFN0cmVhbQorCQkJCQkvLyBpcyByZXBsYWNlZCB3aXRoIHRoZSBudWxsIG91dHB1dCBzdHJlYW0uIFRoaXMgbnVsbCBvdXRwdXQgc3RyZWFtCisJCQkJCS8vIHRocm93cyBJT0V4Y2VwdGlvbiBmb3IgYWxsIHdyaXRlIGNhbGxzLiBXaGVuIFN0cmVhbUdvYmJsZXIgZmFpbHMgdG8KKwkJCQkJLy8gZmx1c2ggdGhlIGJ1ZmZlciBiZWNhdXNlIG9mIHRoaXMsIHRoaXMgY2xvc2UgY2FsbCB0cmllcyB0byBmbHVzaCBpdAorCQkJCQkvLyBhZ2Fpbi4gVGhpcyBjYXVzZXMgYW5vdGhlciBJT0V4Y2VwdGlvbi4gU2luY2Ugd2UgaWdub3JlIHRoZQorCQkJCQkvLyBJT0V4Y2VwdGlvbiBpbiBTdHJlYW1Hb2JibGVyLCB3ZSBhbHNvIGlnbm9yZSB0aGUgZXhjZXB0aW9uIGhlcmUuCisJCQkJfQogCQkJfQogCQkJcmV0dXJuIHByb2Nlc3Mud2FpdEZvcigpOwogCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvRlNfUE9TSVguamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9GU19QT1NJWC5qYXZhCmluZGV4IDQ1MjM3YzQuLjg3OTUzMjkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9GU19QT1NJWC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9GU19QT1NJWC5qYXZhCkBAIC0zOTksNyArMzk5LDcgQEAgcHVibGljIGJvb2xlYW4gY3JlYXRlTmV3RmlsZShGaWxlIGxvY2spIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQlJbnRlZ2VyIG5saW5rID0gKEludGVnZXIpIChGaWxlcy5nZXRBdHRyaWJ1dGUobG9ja1BhdGgsCiAJCQkJCSJ1bml4Om5saW5rIikpOyAvLyROT04tTkxTLTEkCiAJCQlpZiAobmxpbmsgPiAyKSB7Ci0JCQkJTE9HLndhcm4oIm5saW5rIG9mIGxpbmsgdG8gbG9jayBmaWxlIHswfSB3YXMgbm90IDIgYnV0IHsxfSIsIC8vJE5PTi1OTFMtMSQKKwkJCQlMT0cud2Fybigibmxpbmsgb2YgbGluayB0byBsb2NrIGZpbGUge30gd2FzIG5vdCAyIGJ1dCB7fSIsIC8vJE5PTi1OTFMtMSQKIAkJCQkJCWxvY2suZ2V0UGF0aCgpLCBubGluayk7CiAJCQkJcmV0dXJuIGZhbHNlOwogCQkJfSBlbHNlIGlmIChubGluayA8IDIpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9GU19XaW4zMi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0ZTX1dpbjMyLmphdmEKaW5kZXggMjlmZTVkYy4uOWY5OWUyOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0ZTX1dpbjMyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0ZTX1dpbjMyLmphdmEKQEAgLTQ3LDExICs0NywyMSBAQAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVWaXNpdE9wdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVWaXNpdFJlc3VsdDsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aDsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlNpbXBsZUZpbGVWaXNpdG9yOworaW1wb3J0IGphdmEubmlvLmZpbGUuYXR0cmlidXRlLkJhc2ljRmlsZUF0dHJpYnV0ZXM7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5FbnVtU2V0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuQ29tbWFuZEZhaWxlZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLkZpbGVUcmVlSXRlcmF0b3IuRmlsZUVudHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuRmlsZVRyZWVJdGVyYXRvci5GaWxlTW9kZVN0cmF0ZWd5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuV29ya2luZ1RyZWVJdGVyYXRvci5FbnRyeTsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCkBAIC05NywxMyArMTA3LDEzIEBAIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzRXhlY3V0ZSgpIHsKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZShmaW5hbCBGaWxlIGYpIHsKKwlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKEZpbGUgZikgewogCQlyZXR1cm4gZmFsc2U7CiAJfQogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBzZXRFeGVjdXRlKGZpbmFsIEZpbGUgZiwgZmluYWwgYm9vbGVhbiBjYW5FeGVjKSB7CisJcHVibGljIGJvb2xlYW4gc2V0RXhlY3V0ZShGaWxlIGYsIGJvb2xlYW4gY2FuRXhlYykgewogCQlyZXR1cm4gZmFsc2U7CiAJfQogCkBAIC0xMjEsNiArMTMxLDQ5IEBAIHB1YmxpYyBib29sZWFuIHJldHJ5RmFpbGVkTG9ja0ZpbGVDb21taXQoKSB7CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQorCXB1YmxpYyBFbnRyeVtdIGxpc3QoRmlsZSBkaXJlY3RvcnksIEZpbGVNb2RlU3RyYXRlZ3kgZmlsZU1vZGVTdHJhdGVneSkgeworCQlMaXN0PEVudHJ5PiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJRlMgZnMgPSB0aGlzOworCQlib29sZWFuIGNoZWNrRXhlY3V0YWJsZSA9IGZzLnN1cHBvcnRzRXhlY3V0ZSgpOworCQl0cnkgeworCQkJRmlsZXMud2Fsa0ZpbGVUcmVlKGRpcmVjdG9yeS50b1BhdGgoKSwKKwkJCQkJRW51bVNldC5ub25lT2YoRmlsZVZpc2l0T3B0aW9uLmNsYXNzKSwgMSwKKwkJCQkJbmV3IFNpbXBsZUZpbGVWaXNpdG9yPFBhdGg+KCkgeworCQkJCQkJQE92ZXJyaWRlCisJCQkJCQlwdWJsaWMgRmlsZVZpc2l0UmVzdWx0IHZpc2l0RmlsZShQYXRoIGZpbGUsCisJCQkJCQkJCUJhc2ljRmlsZUF0dHJpYnV0ZXMgYXR0cnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCQkJCQkJRmlsZSBmID0gZmlsZS50b0ZpbGUoKTsKKwkJCQkJCQlGUy5BdHRyaWJ1dGVzIGF0dHJpYnV0ZXMgPSBuZXcgRlMuQXR0cmlidXRlcyhmcywgZiwKKwkJCQkJCQkJCXRydWUsIGF0dHJzLmlzRGlyZWN0b3J5KCksCisJCQkJCQkJCQljaGVja0V4ZWN1dGFibGUgJiYgZi5jYW5FeGVjdXRlKCksCisJCQkJCQkJCQlhdHRycy5pc1N5bWJvbGljTGluaygpLAorCQkJCQkJCQkJYXR0cnMuaXNSZWd1bGFyRmlsZSgpLAorCQkJCQkJCQkJYXR0cnMuY3JlYXRpb25UaW1lKCkudG9NaWxsaXMoKSwKKwkJCQkJCQkJCWF0dHJzLmxhc3RNb2RpZmllZFRpbWUoKS50b01pbGxpcygpLAorCQkJCQkJCQkJYXR0cnMuc2l6ZSgpKTsKKwkJCQkJCQlyZXN1bHQuYWRkKG5ldyBGaWxlRW50cnkoZiwgZnMsIGF0dHJpYnV0ZXMsCisJCQkJCQkJCQlmaWxlTW9kZVN0cmF0ZWd5KSk7CisJCQkJCQkJcmV0dXJuIEZpbGVWaXNpdFJlc3VsdC5DT05USU5VRTsKKwkJCQkJCX0KKworCQkJCQkJQE92ZXJyaWRlCisJCQkJCQlwdWJsaWMgRmlsZVZpc2l0UmVzdWx0IHZpc2l0RmlsZUZhaWxlZChQYXRoIGZpbGUsCisJCQkJCQkJCUlPRXhjZXB0aW9uIGV4YykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJCQkJCQkvLyBKdXN0IGlnbm9yZSBpdAorCQkJCQkJCXJldHVybiBGaWxlVmlzaXRSZXN1bHQuQ09OVElOVUU7CisJCQkJCQl9CisJCQkJCX0pOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkvLyBJZ25vcmUKKwkJfQorCQlpZiAocmVzdWx0LmlzRW1wdHkoKSkgeworCQkJcmV0dXJuIE5PX0VOVFJJRVM7CisJCX0KKwkJcmV0dXJuIHJlc3VsdC50b0FycmF5KG5ldyBFbnRyeVtyZXN1bHQuc2l6ZSgpXSk7CisJfQorCisJLyoqIHtAaW5oZXJpdERvY30gKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRmlsZSBkaXNjb3ZlckdpdEV4ZSgpIHsKIAkJU3RyaW5nIHBhdGggPSBTeXN0ZW1SZWFkZXIuZ2V0SW5zdGFuY2UoKS5nZXRlbnYoIlBBVEgiKTsgLy8kTk9OLU5MUy0xJAogCQlGaWxlIGdpdEV4ZSA9IHNlYXJjaFBhdGgocGF0aCwgImdpdC5leGUiLCAiZ2l0LmNtZCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9GU19XaW4zMl9DeWd3aW4uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9GU19XaW4zMl9DeWd3aW4uamF2YQppbmRleCA2NGNkY2MzLi4zMzkzZmJmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvRlNfV2luMzJfQ3lnd2luLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0ZTX1dpbjMyX0N5Z3dpbi5qYXZhCkBAIC00Myw2ICs0Myw4IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC51dGlsOwogCitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOworCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CiBpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKQEAgLTExNywxNCArMTE5LDE0IEBAIHB1YmxpYyBGUyBuZXdJbnN0YW5jZSgpIHsKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIEZpbGUgcmVzb2x2ZShmaW5hbCBGaWxlIGRpciwgZmluYWwgU3RyaW5nIHBuKSB7CisJcHVibGljIEZpbGUgcmVzb2x2ZShGaWxlIGRpciwgU3RyaW5nIHBuKSB7CiAJCVN0cmluZyB1c2VDeWdQYXRoID0gU3lzdGVtLmdldFByb3BlcnR5KCJqZ2l0LnVzZWN5Z3BhdGgiKTsgLy8kTk9OLU5MUy0xJAogCQlpZiAodXNlQ3lnUGF0aCAhPSBudWxsICYmIHVzZUN5Z1BhdGguZXF1YWxzKCJ0cnVlIikpIHsgLy8kTk9OLU5MUy0xJAogCQkJU3RyaW5nIHc7CiAJCQl0cnkgewogCQkJCXcgPSByZWFkUGlwZShkaXIsIC8vCiAJCQkJCW5ldyBTdHJpbmdbXSB7IGN5Z3BhdGgsICItLXdpbmRvd3MiLCAiLS1hYnNvbHV0ZSIsIHBuIH0sIC8vIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkiVVRGLTgiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlDSEFSU0VULm5hbWUoKSk7CiAJCQl9IGNhdGNoIChDb21tYW5kRmFpbGVkRXhjZXB0aW9uIGUpIHsKIAkJCQlMT0cud2FybihlLmdldE1lc3NhZ2UoKSk7CiAJCQkJcmV0dXJuIG51bGw7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvRmlsZVV0aWwuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9GaWxlVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmYyMTc1Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9GaWxlVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIsIFJvYmluIFJvc2VuYmVyZyA8cm9iaW4ucm9zZW5iZXJnQGRld2lyZS5jb20+Ci0gKiBhbmQgb3RoZXIgY29weXJpZ2h0IG93bmVycyBhcyBkb2N1bWVudGVkIGluIHRoZSBwcm9qZWN0J3MgSVAgbG9nLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlCi0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgdjEuMCB3aGljaAotICogYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGlzIHJlcHJvZHVjZWQgYmVsb3csIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocAotICoKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgotICogd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCi0gKiBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gKgotICogLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0gKiAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAotICogICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogLSBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIEluYy4gbm9yIHRoZQotICogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQotICogICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCi0gKiAgIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQKLSAqIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCi0gKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IKLSAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKLSAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRgotICogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5GUy5BdHRyaWJ1dGVzOwotCi0vKioKLSAqIEZpbGUgdXRpbGl0aWVzIHVzaW5nIEphdmEgNyBOSU8yCi0gKi8KLUBEZXByZWNhdGVkCi1wdWJsaWMgY2xhc3MgRmlsZVV0aWwgewotCi0JLyoqCi0JICogUmVhZCB0YXJnZXQgcGF0aCBvZiBhIHN5bWxpbmsuCi0JICoKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYSB7QGxpbmsgamF2YS5pby5GaWxlfS4KLQkgKiBAcmV0dXJuIHRhcmdldCBwYXRoIG9mIHRoZSBzeW1saW5rLgotCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgotCSAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC51dGlsLkZpbGVVdGlscyNyZWFkU3ltTGluayhGaWxlKX0KLQkgKiAgICAgICAgICAgICBpbnN0ZWFkCi0JICovCi0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZWFkU3ltbGluayhGaWxlIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBGaWxlVXRpbHMucmVhZFN5bUxpbmsocGF0aCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgc3ltbGluawotCSAqCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIHBhdGggb2YgdGhlIHN5bWxpbmsgdG8gYmUgY3JlYXRlZAotCSAqIEBwYXJhbSB0YXJnZXQKLQkgKiAgICAgICAgICAgIHRhcmdldCBvZiB0aGUgc3ltbGluayB0byBiZSBjcmVhdGVkCi0JICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCi0JICogQGRlcHJlY2F0ZWQgdXNlCi0JICogICAgICAgICAgICAge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5GaWxlVXRpbHMjY3JlYXRlU3ltTGluayhGaWxlLCBTdHJpbmcpfQotCSAqICAgICAgICAgICAgIGluc3RlYWQKLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVTeW1MaW5rKEZpbGUgcGF0aCwgU3RyaW5nIHRhcmdldCkKLQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUZpbGVVdGlscy5jcmVhdGVTeW1MaW5rKHBhdGgsIHRhcmdldCk7Ci0JfQotCi0JLyoqCi0JICogV2hldGhlciB0aGUgcGFzc2VkIGZpbGUgaXMgYSBzeW1saW5rCi0JICoKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYSB7QGxpbmsgamF2YS5pby5GaWxlfSBvYmplY3QuCi0JICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHBhc3NlZCBwYXRoIGlzIGEgc3ltbGluawotCSAqIEBkZXByZWNhdGVkIFVzZQotCSAqICAgICAgICAgICAgIHtAbGluayBqYXZhLm5pby5maWxlLkZpbGVzI2lzU3ltYm9saWNMaW5rKGphdmEubmlvLmZpbGUuUGF0aCl9Ci0JICogICAgICAgICAgICAgaW5zdGVhZAotCSAqLwotCUBEZXByZWNhdGVkCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzU3ltbGluayhGaWxlIHBhdGgpIHsKLQkJcmV0dXJuIEZpbGVVdGlscy5pc1N5bWxpbmsocGF0aCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IGxhc3RNb2RpZmllZCBhdHRyaWJ1dGUgZm9yIGdpdmVuIHBhdGgKLQkgKgotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhIHtAbGluayBqYXZhLmlvLkZpbGV9LgotCSAqIEByZXR1cm4gbGFzdE1vZGlmaWVkIGF0dHJpYnV0ZSBmb3IgZ2l2ZW4gcGF0aAotCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgotCSAqIEBkZXByZWNhdGVkIFVzZQotCSAqICAgICAgICAgICAgIHtAbGluayBqYXZhLm5pby5maWxlLkZpbGVzI2dldExhc3RNb2RpZmllZFRpbWUoamF2YS5uaW8uZmlsZS5QYXRoLCBqYXZhLm5pby5maWxlLkxpbmtPcHRpb24uLi4pfQotCSAqICAgICAgICAgICAgIGluc3RlYWQKLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyBzdGF0aWMgbG9uZyBsYXN0TW9kaWZpZWQoRmlsZSBwYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gRmlsZVV0aWxzLmxhc3RNb2RpZmllZChwYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgbGFzdE1vZGlmaWVkIGF0dHJpYnV0ZSBmb3IgZ2l2ZW4gcGF0aAotCSAqCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGEge0BsaW5rIGphdmEuaW8uRmlsZX0uCi0JICogQHBhcmFtIHRpbWUKLQkgKiAgICAgICAgICAgIGEgbG9uZy4KLQkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KLQkgKiBAZGVwcmVjYXRlZCBVc2UKLQkgKiAgICAgICAgICAgICB7QGxpbmsgamF2YS5uaW8uZmlsZS5GaWxlcyNzZXRMYXN0TW9kaWZpZWRUaW1lKGphdmEubmlvLmZpbGUuUGF0aCwgamF2YS5uaW8uZmlsZS5hdHRyaWJ1dGUuRmlsZVRpbWUpfQotCSAqICAgICAgICAgICAgIGluc3RlYWQKLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRMYXN0TW9kaWZpZWQoRmlsZSBwYXRoLCBsb25nIHRpbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUZpbGVVdGlscy5zZXRMYXN0TW9kaWZpZWQocGF0aCwgdGltZSk7Ci0JfQotCi0JLyoqCi0JICogV2hldGhlciB0aGlzIGZpbGUgZXhpc3RzCi0JICoKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYSB7QGxpbmsgamF2YS5pby5GaWxlfS4KLQkgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgZ2l2ZW4gcGF0aCBleGlzdHMKLQkgKiBAZGVwcmVjYXRlZCBVc2UKLQkgKiAgICAgICAgICAgICB7QGxpbmsgamF2YS5uaW8uZmlsZS5GaWxlcyNleGlzdHMoamF2YS5uaW8uZmlsZS5QYXRoLCBqYXZhLm5pby5maWxlLkxpbmtPcHRpb24uLi4pfQotCSAqICAgICAgICAgICAgIGluc3RlYWQKLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBleGlzdHMoRmlsZSBwYXRoKSB7Ci0JCXJldHVybiBGaWxlVXRpbHMuZXhpc3RzKHBhdGgpOwotCX0KLQotCS8qKgotCSAqIFdoZXRoZXIgdGhpcyBmaWxlIGlzIGhpZGRlbgotCSAqCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGEge0BsaW5rIGphdmEuaW8uRmlsZX0uCi0JICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGdpdmVuIHBhdGggaXMgaGlkZGVuCi0JICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCi0JICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBqYXZhLm5pby5maWxlLkZpbGVzI2lzSGlkZGVuKGphdmEubmlvLmZpbGUuUGF0aCl9Ci0JICogICAgICAgICAgICAgaW5zdGVhZAotCSAqLwotCUBEZXByZWNhdGVkCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSGlkZGVuKEZpbGUgcGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIEZpbGVVdGlscy5pc0hpZGRlbihwYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhpcyBmaWxlIGhpZGRlbgotCSAqCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGEge0BsaW5rIGphdmEuaW8uRmlsZX0uCi0JICogQHBhcmFtIGhpZGRlbgotCSAqICAgICAgICAgICAgYSBib29sZWFuLgotCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgotCSAqIEBkZXByZWNhdGVkIFVzZQotCSAqICAgICAgICAgICAgIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuRmlsZVV0aWxzI3NldEhpZGRlbihGaWxlLGJvb2xlYW4pfQotCSAqICAgICAgICAgICAgIGluc3RlYWQKLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRIaWRkZW4oRmlsZSBwYXRoLCBib29sZWFuIGhpZGRlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRmlsZVV0aWxzLnNldEhpZGRlbihwYXRoLCBoaWRkZW4pOwotCX0KLQotCS8qKgotCSAqIEdldCBmaWxlIGxlbmd0aAotCSAqCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGEge0BsaW5rIGphdmEuaW8uRmlsZX0uCi0JICogQHJldHVybiBsZW5ndGggb2YgdGhlIGdpdmVuIGZpbGUKLQkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KLQkgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5GaWxlVXRpbHMjZ2V0TGVuZ3RoKEZpbGUpfQotCSAqICAgICAgICAgICAgIGluc3RlYWQKLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyBzdGF0aWMgbG9uZyBnZXRMZW5ndGgoRmlsZSBwYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gRmlsZVV0aWxzLmdldExlbmd0aChwYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBXaGV0aGVyIHRoZSBnaXZlbiBGaWxlIGlzIGEgZGlyZWN0b3J5Ci0JICoKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYSB7QGxpbmsgamF2YS5pby5GaWxlfSBvYmplY3QuCi0JICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGdpdmVuIGZpbGUgaXMgYSBkaXJlY3RvcnkKLQkgKiBAZGVwcmVjYXRlZCBVc2UKLQkgKiAgICAgICAgICAgICB7QGxpbmsgamF2YS5uaW8uZmlsZS5GaWxlcyNpc0RpcmVjdG9yeShqYXZhLm5pby5maWxlLlBhdGgsIGphdmEubmlvLmZpbGUuTGlua09wdGlvbi4uLil9Ci0JICogICAgICAgICAgICAgaW5zdGVhZAotCSAqLwotCUBEZXByZWNhdGVkCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRGlyZWN0b3J5KEZpbGUgcGF0aCkgewotCQlyZXR1cm4gRmlsZVV0aWxzLmlzRGlyZWN0b3J5KHBhdGgpOwotCX0KLQotCS8qKgotCSAqIFdoZXRoZXIgdGhlIGdpdmVuIEZpbGUgaXMgYSBmaWxlCi0JICoKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYSB7QGxpbmsgamF2YS5pby5GaWxlfSBvYmplY3QuCi0JICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGdpdmVuIGZpbGUgaXMgYSBmaWxlCi0JICogQGRlcHJlY2F0ZWQgVXNlCi0JICogICAgICAgICAgICAge0BsaW5rIGphdmEubmlvLmZpbGUuRmlsZXMjaXNSZWd1bGFyRmlsZShqYXZhLm5pby5maWxlLlBhdGgsIGphdmEubmlvLmZpbGUuTGlua09wdGlvbi4uLil9Ci0JICogICAgICAgICAgICAgaW5zdGVhZAotCSAqLwotCUBEZXByZWNhdGVkCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRmlsZShGaWxlIHBhdGgpIHsKLQkJcmV0dXJuIEZpbGVVdGlscy5pc0ZpbGUocGF0aCk7Ci0JfQotCi0JLyoqCi0JICogV2hldGhlciB0aGUgZ2l2ZW4gZmlsZSBjYW4gYmUgZXhlY3V0ZWQKLQkgKgotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhIHtAbGluayBqYXZhLmlvLkZpbGV9IG9iamVjdC4KLQkgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgZ2l2ZW4gZmlsZSBjYW4gYmUgZXhlY3V0ZWQKLQkgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5GaWxlVXRpbHMjY2FuRXhlY3V0ZShGaWxlKX0KLQkgKiAgICAgICAgICAgICBpbnN0ZWFkCi0JICovCi0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2FuRXhlY3V0ZShGaWxlIHBhdGgpIHsKLQkJcmV0dXJuIEZpbGVVdGlscy5jYW5FeGVjdXRlKHBhdGgpOwotCX0KLQotCS8qKgotCSAqIERlbGV0ZSB0aGUgZ2l2ZW4gZmlsZQotCSAqCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGEge0BsaW5rIGphdmEuaW8uRmlsZX0gb2JqZWN0LgotCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgotCSAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC51dGlsLkZpbGVVdGlscyNkZWxldGUoRmlsZSl9Ci0JICovCi0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRlKEZpbGUgcGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRmlsZVV0aWxzLmRlbGV0ZShwYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgZmlsZSBzeXN0ZW0gYXR0cmlidXRlcyBmb3IgdGhlIGdpdmVuIGZpbGUKLQkgKgotCSAqIEBwYXJhbSBmcwotCSAqICAgICAgICAgICAgYSB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC51dGlsLkZTfSBvYmplY3QuCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGEge0BsaW5rIGphdmEuaW8uRmlsZX0gb2JqZWN0LgotCSAqIEByZXR1cm4gZmlsZSBzeXN0ZW0gYXR0cmlidXRlcyBmb3IgdGhlIGdpdmVuIGZpbGUKLQkgKiBAZGVwcmVjYXRlZCBVc2UKLQkgKiAgICAgICAgICAgICB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC51dGlsLkZpbGVVdGlscyNnZXRGaWxlQXR0cmlidXRlc1Bvc2l4KEZTLEZpbGUpfQotCSAqICAgICAgICAgICAgIGluc3RlYWQKLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyBzdGF0aWMgQXR0cmlidXRlcyBnZXRGaWxlQXR0cmlidXRlc1Bvc2l4KEZTIGZzLCBGaWxlIHBhdGgpIHsKLQkJcmV0dXJuIEZpbGVVdGlscy5nZXRGaWxlQXR0cmlidXRlc1Bvc2l4KGZzLCBwYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBORkMgbm9ybWFsaXplIEZpbGUgKG9uIE1hYyksIG90aGVyd2lzZSBkbyBub3RoaW5nCi0JICoKLQkgKiBAcGFyYW0gZmlsZQotCSAqICAgICAgICAgICAgYSB7QGxpbmsgamF2YS5pby5GaWxlfS4KLQkgKiBAcmV0dXJuIG9uIE1hYzogTkZDIG5vcm1hbGl6ZWQge0BsaW5rIGphdmEuaW8uRmlsZX0sIG90aGVyd2lzZSB0aGUgcGFzc2VkCi0JICogICAgICAgICBmaWxlCi0JICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuRmlsZVV0aWxzI25vcm1hbGl6ZShGaWxlKX0KLQkgKiAgICAgICAgICAgICBpbnN0ZWFkCi0JICovCi0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgc3RhdGljIEZpbGUgbm9ybWFsaXplKEZpbGUgZmlsZSkgewotCQlyZXR1cm4gRmlsZVV0aWxzLm5vcm1hbGl6ZShmaWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBORkMgbm9ybWFsaXplIGZpbGUgbmFtZSAob24gTWFjKSwgb3RoZXJ3aXNlIGRvIG5vdGhpbmcKLQkgKgotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBhIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfSBvYmplY3QuCi0JICogQHJldHVybiBvbiBNYWM6IE5GQyBub3JtYWxpemVkIGZvcm0gb2YgZ2l2ZW4gbmFtZQotCSAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC51dGlsLkZpbGVVdGlscyNub3JtYWxpemUoU3RyaW5nKX0KLQkgKiAgICAgICAgICAgICBpbnN0ZWFkCi0JICovCi0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBub3JtYWxpemUoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIEZpbGVVdGlscy5ub3JtYWxpemUobmFtZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvRmlsZVV0aWxzLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvRmlsZVV0aWxzLmphdmEKaW5kZXggNzZhN2ViNi4uZjFlMDVlNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0ZpbGVVdGlscy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9GaWxlVXRpbHMuamF2YQpAQCAtMTIyLDcgKzEyMiw3IEBAIHB1YmxpYyBjbGFzcyBGaWxlVXRpbHMgewogCSAqICAgICAgICAgICAgIHtAbGluayBqYXZhLm5pby5maWxlLkludmFsaWRQYXRoRXhjZXB0aW9ufSkKIAkgKiBAc2luY2UgNC4xMAogCSAqLwotCXB1YmxpYyBzdGF0aWMgUGF0aCB0b1BhdGgoZmluYWwgRmlsZSBmKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyBzdGF0aWMgUGF0aCB0b1BhdGgoRmlsZSBmKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl0cnkgewogCQkJcmV0dXJuIGYudG9QYXRoKCk7CiAJCX0gY2F0Y2ggKEludmFsaWRQYXRoRXhjZXB0aW9uIGV4KSB7CkBAIC0xNDEsNyArMTQxLDcgQEAgcHVibGljIHN0YXRpYyBQYXRoIHRvUGF0aChmaW5hbCBGaWxlIGYpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJICogICAgICAgICAgICAgY2F1c2UgamF2YS5pby5JT0V4Y2VwdGlvbnMgZHVyaW5nIHJhY2UgY29uZGl0aW9ucyB3aGVuCiAJICogICAgICAgICAgICAgbXVsdGlwbGUgY29uY3VycmVudCB0aHJlYWRzIGFsbCB0cnkgdG8gZGVsZXRlIHRoZSBzYW1lIGZpbGUuCiAJICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZShmaW5hbCBGaWxlIGYpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZShGaWxlIGYpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWRlbGV0ZShmLCBOT05FKTsKIAl9CiAKQEAgLTE2Miw3ICsxNjIsNyBAQCBwdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRlKGZpbmFsIEZpbGUgZikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkgKiAgICAgICAgICAgICBtdWx0aXBsZSBjb25jdXJyZW50IHRocmVhZHMgYWxsIHRyeSB0byBkZWxldGUgdGhlIHNhbWUgZmlsZS4KIAkgKiAgICAgICAgICAgICBUaGlzIGV4Y2VwdGlvbiBpcyBub3QgdGhyb3duIHdoZW4gSUdOT1JFX0VSUk9SUyBpcyBzZXQuCiAJICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZShmaW5hbCBGaWxlIGYsIGludCBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGUoRmlsZSBmLCBpbnQgb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJRlMgZnMgPSBGUy5ERVRFQ1RFRDsKIAkJaWYgKChvcHRpb25zICYgU0tJUF9NSVNTSU5HKSAhPSAwICYmICFmcy5leGlzdHMoZikpCiAJCQlyZXR1cm47CkBAIC0yNDEsNyArMjQxLDcgQEAgcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZShmaW5hbCBGaWxlIGYsIGludCBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCSAqICAgICAgICAgICAgIGlmIHRoZSByZW5hbWUgaGFzIGZhaWxlZAogCSAqIEBzaW5jZSAzLjAKIAkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVuYW1lKGZpbmFsIEZpbGUgc3JjLCBmaW5hbCBGaWxlIGRzdCkKKwlwdWJsaWMgc3RhdGljIHZvaWQgcmVuYW1lKEZpbGUgc3JjLCBGaWxlIGRzdCkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXJlbmFtZShzcmMsIGRzdCwgU3RhbmRhcmRDb3B5T3B0aW9uLlJFUExBQ0VfRVhJU1RJTkcpOwogCX0KQEAgLTMyMSw3ICszMjEsNyBAQCBwdWJsaWMgc3RhdGljIHZvaWQgcmVuYW1lKGZpbmFsIEZpbGUgc3JjLCBmaW5hbCBGaWxlIGRzdCwKIAkgKiAgICAgICAgICAgICBtdWx0aXBsZSBjb25jdXJyZW50IHRocmVhZHMgYWxsIHRyeSB0byBjcmVhdGUgdGhlIHNhbWUKIAkgKiAgICAgICAgICAgICBkaXJlY3RvcnkuCiAJICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1rZGlyKGZpbmFsIEZpbGUgZCkKKwlwdWJsaWMgc3RhdGljIHZvaWQgbWtkaXIoRmlsZSBkKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJbWtkaXIoZCwgZmFsc2UpOwogCX0KQEAgLTM0MSw3ICszNDEsNyBAQCBwdWJsaWMgc3RhdGljIHZvaWQgbWtkaXIoZmluYWwgRmlsZSBkKQogCSAqICAgICAgICAgICAgIG11bHRpcGxlIGNvbmN1cnJlbnQgdGhyZWFkcyBhbGwgdHJ5IHRvIGNyZWF0ZSB0aGUgc2FtZQogCSAqICAgICAgICAgICAgIGRpcmVjdG9yeS4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWtkaXIoZmluYWwgRmlsZSBkLCBib29sZWFuIHNraXBFeGlzdGluZykKKwlwdWJsaWMgc3RhdGljIHZvaWQgbWtkaXIoRmlsZSBkLCBib29sZWFuIHNraXBFeGlzdGluZykKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWlmICghZC5ta2RpcigpKSB7CiAJCQlpZiAoc2tpcEV4aXN0aW5nICYmIGQuaXNEaXJlY3RvcnkoKSkKQEAgLTM2Niw3ICszNjYsNyBAQCBwdWJsaWMgc3RhdGljIHZvaWQgbWtkaXIoZmluYWwgRmlsZSBkLCBib29sZWFuIHNraXBFeGlzdGluZykKIAkgKiAgICAgICAgICAgICBtdWx0aXBsZSBjb25jdXJyZW50IHRocmVhZHMgYWxsIHRyeSB0byBjcmVhdGUgdGhlIHNhbWUKIAkgKiAgICAgICAgICAgICBkaXJlY3RvcnkuCiAJICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1rZGlycyhmaW5hbCBGaWxlIGQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIHN0YXRpYyB2b2lkIG1rZGlycyhGaWxlIGQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCW1rZGlycyhkLCBmYWxzZSk7CiAJfQogCkBAIC0zODgsNyArMzg4LDcgQEAgcHVibGljIHN0YXRpYyB2b2lkIG1rZGlycyhmaW5hbCBGaWxlIGQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJICogICAgICAgICAgICAgbXVsdGlwbGUgY29uY3VycmVudCB0aHJlYWRzIGFsbCB0cnkgdG8gY3JlYXRlIHRoZSBzYW1lCiAJICogICAgICAgICAgICAgZGlyZWN0b3J5LgogCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBta2RpcnMoZmluYWwgRmlsZSBkLCBib29sZWFuIHNraXBFeGlzdGluZykKKwlwdWJsaWMgc3RhdGljIHZvaWQgbWtkaXJzKEZpbGUgZCwgYm9vbGVhbiBza2lwRXhpc3RpbmcpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlpZiAoIWQubWtkaXJzKCkpIHsKIAkJCWlmIChza2lwRXhpc3RpbmcgJiYgZC5pc0RpcmVjdG9yeSgpKQpAQCAtNDk4LDMzICs0OTgsNiBAQCBwdWJsaWMgc3RhdGljIEZpbGUgY3JlYXRlVGVtcERpcihTdHJpbmcgcHJlZml4LCBTdHJpbmcgc3VmZml4LCBGaWxlIGRpcikKIAkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKEpHaXRUZXh0LmdldCgpLmNhbm5vdENyZWF0ZVRlbXBEaXIpOwogCX0KIAotCi0JLyoqCi0JICogUmVsYXRpdml6ZSBhIHBhdGgKLQkgKgotCSAqIEBkZXByZWNhdGVkIFVzZSB0aGUgbW9yZS1jbGVhcmx5LW5hbWVkCi0JICogICAgICAgICAgICAge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5GaWxlVXRpbHMjcmVsYXRpdml6ZU5hdGl2ZVBhdGgoU3RyaW5nLCBTdHJpbmcpfQotCSAqICAgICAgICAgICAgIGluc3RlYWQsIG9yIGRpcmVjdGx5IGNhbGwKLQkgKiAgICAgICAgICAgICB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC51dGlsLkZpbGVVdGlscyNyZWxhdGl2aXplUGF0aChTdHJpbmcsIFN0cmluZywgU3RyaW5nLCBib29sZWFuKX0KLQkgKgotCSAqICAgICAgICAgICAgIEV4cHJlc3NlcyA8Y29kZT5vdGhlcjwvY29kZT4gYXMgYSByZWxhdGl2ZSBmaWxlIHBhdGggZnJvbQotCSAqICAgICAgICAgICAgIDxjb2RlPmJhc2U8L2NvZGU+LiBGaWxlLXNlcGFyYXRvciBhbmQgY2FzZSBzZW5zaXRpdml0eSBhcmUKLQkgKiAgICAgICAgICAgICBiYXNlZCBvbiB0aGUgY3VycmVudCBmaWxlIHN5c3RlbS4KLQkgKgotCSAqICAgICAgICAgICAgIFNlZSBhbHNvCi0JICogICAgICAgICAgICAge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5GaWxlVXRpbHMjcmVsYXRpdml6ZVBhdGgoU3RyaW5nLCBTdHJpbmcsIFN0cmluZywgYm9vbGVhbil9LgotCSAqIEBwYXJhbSBiYXNlCi0JICogICAgICAgICAgICBCYXNlIHBhdGgKLQkgKiBAcGFyYW0gb3RoZXIKLQkgKiAgICAgICAgICAgIERlc3RpbmF0aW9uIHBhdGgKLQkgKiBAcmV0dXJuIFJlbGF0aXZlIHBhdGggZnJvbSA8Y29kZT5iYXNlPC9jb2RlPiB0byA8Y29kZT5vdGhlcjwvY29kZT4KLQkgKiBAc2luY2UgMy43Ci0JICovCi0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZWxhdGl2aXplKFN0cmluZyBiYXNlLCBTdHJpbmcgb3RoZXIpIHsKLQkJcmV0dXJuIHJlbGF0aXZpemVOYXRpdmVQYXRoKGJhc2UsIG90aGVyKTsKLQl9Ci0KIAkvKioKIAkgKiBFeHByZXNzZXMgPGNvZGU+b3RoZXI8L2NvZGU+IGFzIGEgcmVsYXRpdmUgZmlsZSBwYXRoIGZyb20KIAkgKiA8Y29kZT5iYXNlPC9jb2RlPi4gRmlsZS1zZXBhcmF0b3IgYW5kIGNhc2Ugc2Vuc2l0aXZpdHkgYXJlIGJhc2VkIG9uIHRoZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0h0dHBTdXBwb3J0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvSHR0cFN1cHBvcnQuamF2YQppbmRleCBhNWE4NThmLi42ZjkyYjM3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvSHR0cFN1cHBvcnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvSHR0cFN1cHBvcnQuamF2YQpAQCAtNDQsNiArNDQsOCBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQudXRpbDsKIAoraW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUkFDVEVSX0VOQ09ESU5HOworCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CiBpbXBvcnQgamF2YS5uZXQuQ29ubmVjdEV4Y2VwdGlvbjsKQEAgLTE3NSwxMSArMTc3LDExIEBAIHB1YmxpYyBjbGFzcyBIdHRwU3VwcG9ydCB7CiAJICogQHBhcmFtIGtleQogCSAqICAgICAgICAgICAgdmFsdWUgd2hpY2ggbXVzdCBiZSBlbmNvZGVkIHRvIHByb3RlY3RlZCBzcGVjaWFsIGNoYXJhY3RlcnMuCiAJICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGVuY29kZShmaW5hbCBTdHJpbmdCdWlsZGVyIHVybHN0ciwgZmluYWwgU3RyaW5nIGtleSkgeworCXB1YmxpYyBzdGF0aWMgdm9pZCBlbmNvZGUoU3RyaW5nQnVpbGRlciB1cmxzdHIsIFN0cmluZyBrZXkpIHsKIAkJaWYgKGtleSA9PSBudWxsIHx8IGtleS5sZW5ndGgoKSA9PSAwKQogCQkJcmV0dXJuOwogCQl0cnkgewotCQkJdXJsc3RyLmFwcGVuZChVUkxFbmNvZGVyLmVuY29kZShrZXksICJVVEYtOCIpKTsgLy8kTk9OLU5MUy0xJAorCQkJdXJsc3RyLmFwcGVuZChVUkxFbmNvZGVyLmVuY29kZShrZXksIENIQVJBQ1RFUl9FTkNPRElORykpOwogCQl9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKIAkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKEpHaXRUZXh0LmdldCgpLmNvdWxkTm90VVJMRW5jb2RlVG9VVEY4LCBlKTsKIAkJfQpAQCAtMjAwLDcgKzIwMiw3IEBAIHB1YmxpYyBzdGF0aWMgdm9pZCBlbmNvZGUoZmluYWwgU3RyaW5nQnVpbGRlciB1cmxzdHIsIGZpbmFsIFN0cmluZyBrZXkpIHsKIAkgKiAgICAgICAgICAgICBjb21tdW5pY2F0aW9ucyBlcnJvciBwcmV2ZW50ZWQgb2J0YWluaW5nIHRoZSByZXNwb25zZSBjb2RlLgogCSAqIEBzaW5jZSAzLjMKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGludCByZXNwb25zZShmaW5hbCBIdHRwQ29ubmVjdGlvbiBjKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyBzdGF0aWMgaW50IHJlc3BvbnNlKEh0dHBDb25uZWN0aW9uIGMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXRyeSB7CiAJCQlyZXR1cm4gYy5nZXRSZXNwb25zZUNvZGUoKTsKIAkJfSBjYXRjaCAoQ29ubmVjdEV4Y2VwdGlvbiBjZSkgewpAQCAtMjI4LDcgKzIzMCw3IEBAIHB1YmxpYyBzdGF0aWMgaW50IHJlc3BvbnNlKGZpbmFsIEh0dHBDb25uZWN0aW9uIGMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgY29tbXVuaWNhdGlvbnMgZXJyb3IgcHJldmVudGVkIG9idGFpbmluZyB0aGUgcmVzcG9uc2UgY29kZS4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGludCByZXNwb25zZShmaW5hbCBqYXZhLm5ldC5IdHRwVVJMQ29ubmVjdGlvbiBjKQorCXB1YmxpYyBzdGF0aWMgaW50IHJlc3BvbnNlKGphdmEubmV0Lkh0dHBVUkxDb25uZWN0aW9uIGMpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQl0cnkgewogCQkJcmV0dXJuIGMuZ2V0UmVzcG9uc2VDb2RlKCk7CkBAIC0yNzMsNyArMjc1LDcgQEAgcHVibGljIHN0YXRpYyBTdHJpbmcgcmVzcG9uc2VIZWFkZXIoZmluYWwgSHR0cENvbm5lY3Rpb24gYywKIAkgKiAgICAgICAgICAgICB0aGUgcHJveHkgY291bGQgbm90IGJlIGNvbXB1dGVkIGFzIHRoZSBzdXBwbGllZCBVUkwgY291bGQgbm90CiAJICogICAgICAgICAgICAgYmUgcmVhZC4gVGhpcyBmYWlsdXJlIHNob3VsZCBuZXZlciBvY2N1ci4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIFByb3h5IHByb3h5Rm9yKGZpbmFsIFByb3h5U2VsZWN0b3IgcHJveHlTZWxlY3RvciwgZmluYWwgVVJMIHUpCisJcHVibGljIHN0YXRpYyBQcm94eSBwcm94eUZvcihQcm94eVNlbGVjdG9yIHByb3h5U2VsZWN0b3IsIFVSTCB1KQogCQkJdGhyb3dzIENvbm5lY3RFeGNlcHRpb24gewogCQl0cnkgewogCQkJcmV0dXJuIHByb3h5U2VsZWN0b3Iuc2VsZWN0KHUudG9VUkkoKSkuZ2V0KDApOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0lPLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvSU8uamF2YQppbmRleCBmMzlkMjE3Li5lODhlN2EzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvSU8uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvSU8uamF2YQpAQCAtNDcsNyArNDcsNiBAQAogCiBpbXBvcnQgamF2YS5pby5FT0ZFeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKQEAgLTU5LDYgKzU4LDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuSkdpdFRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvLlNpbGVudEZpbGVJbnB1dFN0cmVhbTsKIAogLyoqCiAgKiBJbnB1dC9PdXRwdXQgdXRpbGl0aWVzCkBAIC03Niw3ICs3Niw3IEBAIHB1YmxpYyBjbGFzcyBJTyB7CiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgdGhlIGZpbGUgZXhpc3RzLCBidXQgaXRzIGNvbnRlbnRzIGNhbm5vdCBiZSByZWFkLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZVtdIHJlYWRGdWxseShmaW5hbCBGaWxlIHBhdGgpCisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlW10gcmVhZEZ1bGx5KEZpbGUgcGF0aCkKIAkJCXRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJcmV0dXJuIElPLnJlYWRGdWxseShwYXRoLCBJbnRlZ2VyLk1BWF9WQUxVRSk7CiAJfQpAQCAtOTYsMTAgKzk2LDkgQEAgcHVibGljIGNsYXNzIElPIHsKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0aGUgZmlsZSBleGlzdHMsIGJ1dCBpdHMgY29udGVudHMgY2Fubm90IGJlIHJlYWQuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlW10gcmVhZFNvbWUoZmluYWwgRmlsZSBwYXRoLCBmaW5hbCBpbnQgbGltaXQpCisJcHVibGljIHN0YXRpYyBmaW5hbCBieXRlW10gcmVhZFNvbWUoRmlsZSBwYXRoLCBpbnQgbGltaXQpCiAJCQl0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCUZpbGVJbnB1dFN0cmVhbSBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ocGF0aCk7Ci0JCXRyeSB7CisJCXRyeSAoU2lsZW50RmlsZUlucHV0U3RyZWFtIGluID0gbmV3IFNpbGVudEZpbGVJbnB1dFN0cmVhbShwYXRoKSkgewogCQkJYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW2xpbWl0XTsKIAkJCWludCBjbnQgPSAwOwogCQkJZm9yICg7OykgewpAQCAtMTEzLDEyICsxMTIsNiBAQCBwdWJsaWMgY2xhc3MgSU8gewogCQkJYnl0ZVtdIHJlcyA9IG5ldyBieXRlW2NudF07CiAJCQlTeXN0ZW0uYXJyYXljb3B5KGJ1ZiwgMCwgcmVzLCAwLCBjbnQpOwogCQkJcmV0dXJuIHJlczsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaW4uY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlnbm9yZWQpIHsKLQkJCQkvLyBkbyBub3RoaW5nCi0JCQl9CiAJCX0KIAl9CiAKQEAgLTEzNiwxMCArMTI5LDkgQEAgcHVibGljIGNsYXNzIElPIHsKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0aGUgZmlsZSBleGlzdHMsIGJ1dCBpdHMgY29udGVudHMgY2Fubm90IGJlIHJlYWQuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlW10gcmVhZEZ1bGx5KGZpbmFsIEZpbGUgcGF0aCwgZmluYWwgaW50IG1heCkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSByZWFkRnVsbHkoRmlsZSBwYXRoLCBpbnQgbWF4KQogCQkJdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlmaW5hbCBGaWxlSW5wdXRTdHJlYW0gaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHBhdGgpOwotCQl0cnkgeworCQl0cnkgKFNpbGVudEZpbGVJbnB1dFN0cmVhbSBpbiA9IG5ldyBTaWxlbnRGaWxlSW5wdXRTdHJlYW0ocGF0aCkpIHsKIAkJCWxvbmcgc3ogPSBNYXRoLm1heChwYXRoLmxlbmd0aCgpLCAxKTsKIAkJCWlmIChzeiA+IG1heCkKIAkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCkBAIC0xNzMsMTIgKzE2NSw2IEBAIHB1YmxpYyBjbGFzcyBJTyB7CiAJCQkJYnVmID0gbmI7CiAJCQl9CiAJCQlyZXR1cm4gYnVmOwotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlpbi5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaWdub3JlZCkgewotCQkJCS8vIGlnbm9yZSBhbnkgY2xvc2UgZXJyb3JzLCB0aGlzIHdhcyBhIHJlYWQgb25seSBzdHJlYW0KLQkJCX0KIAkJfQogCX0KIApAQCAtMzI1LDcgKzMxMSw3IEBAIHB1YmxpYyBzdGF0aWMgaW50IHJlYWRGdWxseShJbnB1dFN0cmVhbSBmZCwgYnl0ZVtdIGRzdCwgaW50IG9mZikKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0aGVyZSB3YXMgYW4gZXJyb3IgcmVhZGluZyBmcm9tIHRoZSBzdHJlYW0uCiAJICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNraXBGdWxseShmaW5hbCBJbnB1dFN0cmVhbSBmZCwgbG9uZyB0b1NraXApCisJcHVibGljIHN0YXRpYyB2b2lkIHNraXBGdWxseShJbnB1dFN0cmVhbSBmZCwgbG9uZyB0b1NraXApCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQl3aGlsZSAodG9Ta2lwID4gMCkgewogCQkJZmluYWwgbG9uZyByID0gZmQuc2tpcCh0b1NraXApOwpAQCAtMzQzLDcgKzMyOSw3IEBAIHB1YmxpYyBzdGF0aWMgdm9pZCBza2lwRnVsbHkoZmluYWwgSW5wdXRTdHJlYW0gZmQsIGxvbmcgdG9Ta2lwKQogCSAqIEByZXR1cm4gdGhlIHN0cmluZyBkaXZpZGVkIGludG8gbGluZXMKIAkgKiBAc2luY2UgMi4wCiAJICovCi0JcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gcmVhZExpbmVzKGZpbmFsIFN0cmluZyBzKSB7CisJcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gcmVhZExpbmVzKFN0cmluZyBzKSB7CiAJCUxpc3Q8U3RyaW5nPiBsID0gbmV3IEFycmF5TGlzdDw+KCk7CiAJCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogCQlmb3IgKGludCBpID0gMDsgaSA8IHMubGVuZ3RoKCk7IGkrKykgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0ludExpc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9JbnRMaXN0LmphdmEKaW5kZXggMjQwMzhmMC4uNzQ0MWQ1MCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0ludExpc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvSW50TGlzdC5qYXZhCkBAIC02NSw3ICs2NSw3IEBAIHB1YmxpYyBJbnRMaXN0KCkgewogCSAqIEBwYXJhbSBjYXBhY2l0eQogCSAqICAgICAgICAgICAgbnVtYmVyIG9mIGVudHJpZXMgdGhlIGxpc3QgY2FuIGluaXRpYWxseSBob2xkLgogCSAqLwotCXB1YmxpYyBJbnRMaXN0KGZpbmFsIGludCBjYXBhY2l0eSkgeworCXB1YmxpYyBJbnRMaXN0KGludCBjYXBhY2l0eSkgewogCQllbnRyaWVzID0gbmV3IGludFtjYXBhY2l0eV07CiAJfQogCkBAIC0xMDIsNyArMTAyLDcgQEAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoaW50IHZhbHVlKSB7CiAJICogQHRocm93cyBqYXZhLmxhbmcuQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgdGhlIGluZGV4IG91dHNpZGUgdGhlIHZhbGlkIHJhbmdlCiAJICovCi0JcHVibGljIGludCBnZXQoZmluYWwgaW50IGkpIHsKKwlwdWJsaWMgaW50IGdldChpbnQgaSkgewogCQlpZiAoY291bnQgPD0gaSkKIAkJCXRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oaSk7CiAJCXJldHVybiBlbnRyaWVzW2ldOwpAQCAtMTIxLDcgKzEyMSw3IEBAIHB1YmxpYyB2b2lkIGNsZWFyKCkgewogCSAqIEBwYXJhbSBuCiAJICogICAgICAgICAgICB0aGUgbnVtYmVyIHRvIGFkZC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBhZGQoZmluYWwgaW50IG4pIHsKKwlwdWJsaWMgdm9pZCBhZGQoaW50IG4pIHsKIAkJaWYgKGNvdW50ID09IGVudHJpZXMubGVuZ3RoKQogCQkJZ3JvdygpOwogCQllbnRyaWVzW2NvdW50KytdID0gbjsKQEAgLTEzNSw3ICsxMzUsNyBAQCBwdWJsaWMgdm9pZCBhZGQoZmluYWwgaW50IG4pIHsKIAkgKiBAcGFyYW0gbgogCSAqICAgICAgICAgICAgdmFsdWUgdG8gc3RvcmUgYXQgdGhlIHBvc2l0aW9uLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldChmaW5hbCBpbnQgaW5kZXgsIGZpbmFsIGludCBuKSB7CisJcHVibGljIHZvaWQgc2V0KGludCBpbmRleCwgaW50IG4pIHsKIAkJaWYgKGNvdW50IDwgaW5kZXgpCiAJCQl0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKGluZGV4KTsKIAkJZWxzZSBpZiAoY291bnQgPT0gaW5kZXgpCkBAIC0xNTQsNyArMTU0LDcgQEAgZWxzZSBpZiAoY291bnQgPT0gaW5kZXgpCiAJICogQHBhcmFtIHZhbAogCSAqICAgICAgICAgICAgdmFsdWUgdG8gaW5zZXJ0IGludG8gcGFkZGVkIHBvc2l0aW9ucy4KIAkgKi8KLQlwdWJsaWMgdm9pZCBmaWxsVG8oaW50IHRvSW5kZXgsIGZpbmFsIGludCB2YWwpIHsKKwlwdWJsaWMgdm9pZCBmaWxsVG8oaW50IHRvSW5kZXgsIGludCB2YWwpIHsKIAkJd2hpbGUgKGNvdW50IDwgdG9JbmRleCkKIAkJCWFkZCh2YWwpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9Mb25nTGlzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0xvbmdMaXN0LmphdmEKaW5kZXggNDA0NTk0Yy4uM2JkNmUxOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0xvbmdMaXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0xvbmdMaXN0LmphdmEKQEAgLTY3LDcgKzY3LDcgQEAgcHVibGljIExvbmdMaXN0KCkgewogCSAqIEBwYXJhbSBjYXBhY2l0eQogCSAqICAgICAgICAgICAgbnVtYmVyIG9mIGVudHJpZXMgdGhlIGxpc3QgY2FuIGluaXRpYWxseSBob2xkLgogCSAqLwotCXB1YmxpYyBMb25nTGlzdChmaW5hbCBpbnQgY2FwYWNpdHkpIHsKKwlwdWJsaWMgTG9uZ0xpc3QoaW50IGNhcGFjaXR5KSB7CiAJCWVudHJpZXMgPSBuZXcgbG9uZ1tjYXBhY2l0eV07CiAJfQogCkBAIC04OSw3ICs4OSw3IEBAIHB1YmxpYyBpbnQgc2l6ZSgpIHsKIAkgKiBAdGhyb3dzIGphdmEubGFuZy5BcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0aGUgaW5kZXggb3V0c2lkZSB0aGUgdmFsaWQgcmFuZ2UKIAkgKi8KLQlwdWJsaWMgbG9uZyBnZXQoZmluYWwgaW50IGkpIHsKKwlwdWJsaWMgbG9uZyBnZXQoaW50IGkpIHsKIAkJaWYgKGNvdW50IDw9IGkpCiAJCQl0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKGkpOwogCQlyZXR1cm4gZW50cmllc1tpXTsKQEAgLTEwMiw3ICsxMDIsNyBAQCBwdWJsaWMgbG9uZyBnZXQoZmluYWwgaW50IGkpIHsKIAkgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLgogCSAqIEByZXR1cm4gdHJ1ZSBvZiB7QGNvZGUgdmFsdWV9IGFwcGVhcnMgaW4gdGhpcyBsaXN0LgogCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKGZpbmFsIGxvbmcgdmFsdWUpIHsKKwlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhsb25nIHZhbHVlKSB7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKIAkJCWlmIChlbnRyaWVzW2ldID09IHZhbHVlKQogCQkJCXJldHVybiB0cnVlOwpAQCAtMTIyLDcgKzEyMiw3IEBAIHB1YmxpYyB2b2lkIGNsZWFyKCkgewogCSAqIEBwYXJhbSBuCiAJICogICAgICAgICAgICB0aGUgbnVtYmVyIHRvIGFkZC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBhZGQoZmluYWwgbG9uZyBuKSB7CisJcHVibGljIHZvaWQgYWRkKGxvbmcgbikgewogCQlpZiAoY291bnQgPT0gZW50cmllcy5sZW5ndGgpCiAJCQlncm93KCk7CiAJCWVudHJpZXNbY291bnQrK10gPSBuOwpAQCAtMTM2LDcgKzEzNiw3IEBAIHB1YmxpYyB2b2lkIGFkZChmaW5hbCBsb25nIG4pIHsKIAkgKiBAcGFyYW0gbgogCSAqICAgICAgICAgICAgdmFsdWUgdG8gc3RvcmUgYXQgdGhlIHBvc2l0aW9uLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldChmaW5hbCBpbnQgaW5kZXgsIGZpbmFsIGxvbmcgbikgeworCXB1YmxpYyB2b2lkIHNldChpbnQgaW5kZXgsIGxvbmcgbikgewogCQlpZiAoY291bnQgPCBpbmRleCkKIAkJCXRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oaW5kZXgpOwogCQllbHNlIGlmIChjb3VudCA9PSBpbmRleCkKQEAgLTE1NSw3ICsxNTUsNyBAQCBlbHNlIGlmIChjb3VudCA9PSBpbmRleCkKIAkgKiBAcGFyYW0gdmFsCiAJICogICAgICAgICAgICB2YWx1ZSB0byBpbnNlcnQgaW50byBwYWRkZWQgcG9zaXRpb25zLgogCSAqLwotCXB1YmxpYyB2b2lkIGZpbGxUbyhpbnQgdG9JbmRleCwgZmluYWwgbG9uZyB2YWwpIHsKKwlwdWJsaWMgdm9pZCBmaWxsVG8oaW50IHRvSW5kZXgsIGxvbmcgdmFsKSB7CiAJCXdoaWxlIChjb3VudCA8IHRvSW5kZXgpCiAJCQlhZGQodmFsKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvTG9uZ01hcC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0xvbmdNYXAuamF2YQppbmRleCAwOWVlZTQyLi44YzdmNjcyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvTG9uZ01hcC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9Mb25nTWFwLmphdmEKQEAgLTE0NCw3ICsxNDQsNyBAQCBwdWJsaWMgViBwdXQobG9uZyBrZXksIFYgdmFsdWUpIHsKIAkJcmV0dXJuIG51bGw7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGluc2VydChmaW5hbCBOb2RlPFY+IG4pIHsKKwlwcml2YXRlIHZvaWQgaW5zZXJ0KE5vZGU8Vj4gbikgewogCQlmaW5hbCBpbnQgaWR4ID0gaW5kZXgobi5rZXkpOwogCQluLm5leHQgPSB0YWJsZVtpZHhdOwogCQl0YWJsZVtpZHhdID0gbjsKQEAgLTE2NiwxNCArMTY2LDE0IEBAIHByaXZhdGUgdm9pZCBncm93KCkgewogCQl9CiAJfQogCi0JcHJpdmF0ZSBmaW5hbCBpbnQgaW5kZXgoZmluYWwgbG9uZyBrZXkpIHsKKwlwcml2YXRlIGZpbmFsIGludCBpbmRleChsb25nIGtleSkgewogCQlpbnQgaCA9ICgoaW50KSBrZXkpID4+PiAxOwogCQloIF49IChoID4+PiAyMCkgXiAoaCA+Pj4gMTIpOwogCQlyZXR1cm4gaCAmICh0YWJsZS5sZW5ndGggLSAxKTsKIAl9CiAKIAlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCA8Vj4gTm9kZTxWPltdIGNyZWF0ZUFycmF5KGZpbmFsIGludCBzeikgeworCXByaXZhdGUgc3RhdGljIGZpbmFsIDxWPiBOb2RlPFY+W10gY3JlYXRlQXJyYXkoaW50IHN6KSB7CiAJCXJldHVybiBuZXcgTm9kZVtzel07CiAJfQogCkBAIC0xODIsNyArMTgyLDcgQEAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTm9kZTxWPiB7CiAJCVYgdmFsdWU7CiAJCU5vZGU8Vj4gbmV4dDsKIAotCQlOb2RlKGZpbmFsIGxvbmcgaywgZmluYWwgViB2KSB7CisJCU5vZGUobG9uZyBrLCBWIHYpIHsKIAkJCWtleSA9IGs7CiAJCQl2YWx1ZSA9IHY7CiAJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9RdW90ZWRTdHJpbmcuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9RdW90ZWRTdHJpbmcuamF2YQppbmRleCA3N2JjMjQ5Li40ZDU4ZDA2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUXVvdGVkU3RyaW5nLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL1F1b3RlZFN0cmluZy5qYXZhCkBAIC05OSw3ICs5OSw3IEBAIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBRdW90ZWRTdHJpbmcgewogCSAqIEByZXR1cm4gdGhlIGNsZWFuZWQgc3RyaW5nLgogCSAqIEBzZWUgI2RlcXVvdGUoYnl0ZVtdLCBpbnQsIGludCkKIAkgKi8KLQlwdWJsaWMgU3RyaW5nIGRlcXVvdGUoZmluYWwgU3RyaW5nIGluKSB7CisJcHVibGljIFN0cmluZyBkZXF1b3RlKFN0cmluZyBpbikgewogCQlmaW5hbCBieXRlW10gYiA9IENvbnN0YW50cy5lbmNvZGUoaW4pOwogCQlyZXR1cm4gZGVxdW90ZShiLCAwLCBiLmxlbmd0aCk7CiAJfQpAQCAtMTM3LDcgKzEzNyw3IEBAIHB1YmxpYyBTdHJpbmcgZGVxdW90ZShmaW5hbCBTdHJpbmcgaW4pIHsKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGNsYXNzIEJvdXJuZVN0eWxlIGV4dGVuZHMgUXVvdGVkU3RyaW5nIHsKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgcXVvdGUoZmluYWwgU3RyaW5nIGluKSB7CisJCXB1YmxpYyBTdHJpbmcgcXVvdGUoU3RyaW5nIGluKSB7CiAJCQlmaW5hbCBTdHJpbmdCdWlsZGVyIHIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogCQkJci5hcHBlbmQoJ1wnJyk7CiAJCQlpbnQgc3RhcnQgPSAwLCBpID0gMDsKQEAgLTE2MCw3ICsxNjAsNyBAQCBwdWJsaWMgU3RyaW5nIHF1b3RlKGZpbmFsIFN0cmluZyBpbikgewogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgZGVxdW90ZShmaW5hbCBieXRlW10gaW4sIGludCBpcCwgZmluYWwgaW50IGllKSB7CisJCXB1YmxpYyBTdHJpbmcgZGVxdW90ZShieXRlW10gaW4sIGludCBpcCwgaW50IGllKSB7CiAJCQlib29sZWFuIGlucXVvdGUgPSBmYWxzZTsKIAkJCWZpbmFsIGJ5dGVbXSByID0gbmV3IGJ5dGVbaWUgLSBpcF07CiAJCQlpbnQgclB0ciA9IDA7CkBAIC0xODgsNyArMTg4LDcgQEAgcHVibGljIFN0cmluZyBkZXF1b3RlKGZpbmFsIGJ5dGVbXSBpbiwgaW50IGlwLCBmaW5hbCBpbnQgaWUpIHsKIAkvKiogQm91cm5lIHN0eWxlLCBidXQgcGVybWl0cyA8Y29kZT5+dXNlcjwvY29kZT4gYXQgdGhlIHN0YXJ0IG9mIHRoZSBzdHJpbmcuICovCiAJcHVibGljIHN0YXRpYyBjbGFzcyBCb3VybmVVc2VyUGF0aFN0eWxlIGV4dGVuZHMgQm91cm5lU3R5bGUgewogCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyBxdW90ZShmaW5hbCBTdHJpbmcgaW4pIHsKKwkJcHVibGljIFN0cmluZyBxdW90ZShTdHJpbmcgaW4pIHsKIAkJCWlmIChpbi5tYXRjaGVzKCJefltBLVphLXowLTlfLV0rJCIpKSB7IC8vJE5PTi1OTFMtMSQKIAkJCQkvLyBJZiB0aGUgc3RyaW5nIGlzIGp1c3QgIn51c2VyIiB3ZSBjYW4gYXNzdW1lIHRoZXkKIAkJCQkvLyBtZWFuICJ+dXNlci8iLgpAQCAtMjU1LDcgKzI1NSw3IEBAIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgR2l0UGF0aFN0eWxlIGV4dGVuZHMgUXVvdGVkU3RyaW5nIHsKIAkJfQogCiAJCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHF1b3RlKGZpbmFsIFN0cmluZyBpbnN0cikgeworCQlwdWJsaWMgU3RyaW5nIHF1b3RlKFN0cmluZyBpbnN0cikgewogCQkJaWYgKGluc3RyLmxlbmd0aCgpID09IDApCiAJCQkJcmV0dXJuICJcIlwiIjsgLy8kTk9OLU5MUy0xJAogCQkJYm9vbGVhbiByZXVzZSA9IHRydWU7CkBAIC0yOTEsMTMgKzI5MSwxMyBAQCBwdWJsaWMgU3RyaW5nIHF1b3RlKGZpbmFsIFN0cmluZyBpbnN0cikgewogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgZGVxdW90ZShmaW5hbCBieXRlW10gaW4sIGZpbmFsIGludCBpblB0ciwgZmluYWwgaW50IGluRW5kKSB7CisJCXB1YmxpYyBTdHJpbmcgZGVxdW90ZShieXRlW10gaW4sIGludCBpblB0ciwgaW50IGluRW5kKSB7CiAJCQlpZiAoMiA8PSBpbkVuZCAtIGluUHRyICYmIGluW2luUHRyXSA9PSAnIicgJiYgaW5baW5FbmQgLSAxXSA9PSAnIicpCiAJCQkJcmV0dXJuIGRxKGluLCBpblB0ciArIDEsIGluRW5kIC0gMSk7CiAJCQlyZXR1cm4gUmF3UGFyc2VVdGlscy5kZWNvZGUoQ29uc3RhbnRzLkNIQVJTRVQsIGluLCBpblB0ciwgaW5FbmQpOwogCQl9CiAKLQkJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRxKGZpbmFsIGJ5dGVbXSBpbiwgaW50IGluUHRyLCBmaW5hbCBpbnQgaW5FbmQpIHsKKwkJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRxKGJ5dGVbXSBpbiwgaW50IGluUHRyLCBpbnQgaW5FbmQpIHsKIAkJCWZpbmFsIGJ5dGVbXSByID0gbmV3IGJ5dGVbaW5FbmQgLSBpblB0cl07CiAJCQlpbnQgclB0ciA9IDA7CiAJCQl3aGlsZSAoaW5QdHIgPCBpbkVuZCkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL1Jhd0NoYXJTZXF1ZW5jZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL1Jhd0NoYXJTZXF1ZW5jZS5qYXZhCmluZGV4IDIzZWU5ZDAuLjQyMDYwYzYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9SYXdDaGFyU2VxdWVuY2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUmF3Q2hhclNlcXVlbmNlLmphdmEKQEAgLTY4LDcgKzY4LDcgQEAgcHVibGljIGZpbmFsIGNsYXNzIFJhd0NoYXJTZXF1ZW5jZSBpbXBsZW1lbnRzIENoYXJTZXF1ZW5jZSB7CiAJICogQHBhcmFtIGVuZAogCSAqICAgICAgICAgICAgZW5kaW5nIHBvc2l0aW9uIGZvciB0aGUgc2VxdWVuY2UuCiAJICovCi0JcHVibGljIFJhd0NoYXJTZXF1ZW5jZShmaW5hbCBieXRlW10gYnVmLCBmaW5hbCBpbnQgc3RhcnQsIGZpbmFsIGludCBlbmQpIHsKKwlwdWJsaWMgUmF3Q2hhclNlcXVlbmNlKGJ5dGVbXSBidWYsIGludCBzdGFydCwgaW50IGVuZCkgewogCQlidWZmZXIgPSBidWY7CiAJCXN0YXJ0UHRyID0gc3RhcnQ7CiAJCWVuZFB0ciA9IGVuZDsKQEAgLTc2LDcgKzc2LDcgQEAgcHVibGljIFJhd0NoYXJTZXF1ZW5jZShmaW5hbCBieXRlW10gYnVmLCBmaW5hbCBpbnQgc3RhcnQsIGZpbmFsIGludCBlbmQpIHsKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGNoYXIgY2hhckF0KGZpbmFsIGludCBpbmRleCkgeworCXB1YmxpYyBjaGFyIGNoYXJBdChpbnQgaW5kZXgpIHsKIAkJcmV0dXJuIChjaGFyKSAoYnVmZmVyW3N0YXJ0UHRyICsgaW5kZXhdICYgMHhmZik7CiAJfQogCkBAIC04OCw3ICs4OCw3IEBAIHB1YmxpYyBpbnQgbGVuZ3RoKCkgewogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgQ2hhclNlcXVlbmNlIHN1YlNlcXVlbmNlKGZpbmFsIGludCBzdGFydCwgZmluYWwgaW50IGVuZCkgeworCXB1YmxpYyBDaGFyU2VxdWVuY2Ugc3ViU2VxdWVuY2UoaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAJCXJldHVybiBuZXcgUmF3Q2hhclNlcXVlbmNlKGJ1ZmZlciwgc3RhcnRQdHIgKyBzdGFydCwgc3RhcnRQdHIgKyBlbmQpOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL1Jhd1BhcnNlVXRpbHMuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9SYXdQYXJzZVV0aWxzLmphdmEKaW5kZXggMDE0Yzc3Mi4uYzIyYzhkZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL1Jhd1BhcnNlVXRpbHMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUmF3UGFyc2VVdGlscy5qYXZhCkBAIC02Myw2ICs2Myw3IEBACiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYW5ub3RhdGlvbnMuTnVsbGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuQmluYXJ5QmxvYkV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUGVyc29uSWRlbnQ7CiAKQEAgLTEyNSw3ICsxMjYsNyBAQCBwdWJsaWMgZmluYWwgY2xhc3MgUmF3UGFyc2VVdGlscyB7CiAJICogICAgICAgICAgICB0aGUgYnVmZmVyIHRvIHRlc3QgZm9yIGVxdWFsaXR5IHdpdGggYi4KIAkgKiBAcmV0dXJuIHB0ciArIHNyYy5sZW5ndGggaWYgYltwdHIuLnNyYy5sZW5ndGhdID09IHNyYzsgZWxzZSAtMS4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBtYXRjaChmaW5hbCBieXRlW10gYiwgaW50IHB0ciwgZmluYWwgYnl0ZVtdIHNyYykgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG1hdGNoKGJ5dGVbXSBiLCBpbnQgcHRyLCBieXRlW10gc3JjKSB7CiAJCWlmIChwdHIgKyBzcmMubGVuZ3RoID4gYi5sZW5ndGgpCiAJCQlyZXR1cm4gLTE7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgc3JjLmxlbmd0aDsgaSsrLCBwdHIrKykKQEAgLTQ2MSw3ICs0NjIsNyBAQCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBwYXJzZUhleEludDQoZmluYWwgYnl0ZSBkaWdpdCkgewogCSAqICAgICAgICAgICAgcG9zaXRpb24gd2l0aGluIGJ1ZmZlciB0byBzdGFydCBwYXJzaW5nIGRpZ2l0cyBhdC4KIAkgKiBAcmV0dXJuIHRoZSB0aW1lem9uZSBhdCB0aGlzIGxvY2F0aW9uLCBleHByZXNzZWQgaW4gbWludXRlcy4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBwYXJzZVRpbWVab25lT2Zmc2V0KGZpbmFsIGJ5dGVbXSBiLCBpbnQgcHRyKSB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGFyc2VUaW1lWm9uZU9mZnNldChieXRlW10gYiwgaW50IHB0cikgewogCQlyZXR1cm4gcGFyc2VUaW1lWm9uZU9mZnNldChiLCBwdHIsIG51bGwpOwogCX0KIApAQCAtNTAwLDcgKzUwMSw3IEBAIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBhcnNlVGltZVpvbmVPZmZzZXQoZmluYWwgYnl0ZVtdIGIsIGludCBwdHIsCiAJICogICAgICAgICAgICBjaGFyYWN0ZXIgdG8gZmluZC4KIAkgKiBAcmV0dXJuIG5ldyBwb3NpdGlvbiBqdXN0IGFmdGVyIGNockEuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbmV4dChmaW5hbCBieXRlW10gYiwgaW50IHB0ciwgZmluYWwgY2hhciBjaHJBKSB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbmV4dChieXRlW10gYiwgaW50IHB0ciwgY2hhciBjaHJBKSB7CiAJCWZpbmFsIGludCBzeiA9IGIubGVuZ3RoOwogCQl3aGlsZSAocHRyIDwgc3opIHsKIAkJCWlmIChiW3B0cisrXSA9PSBjaHJBKQpAQCAtNTIwLDcgKzUyMSw3IEBAIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG5leHQoZmluYWwgYnl0ZVtdIGIsIGludCBwdHIsIGZpbmFsIGNoYXIgY2hyQSkgewogCSAqICAgICAgICAgICAgcG9zaXRpb24gd2l0aGluIGJ1ZmZlciB0byBzdGFydCBsb29raW5nIGZvciBMRiBhdC4KIAkgKiBAcmV0dXJuIG5ldyBwb3NpdGlvbiBqdXN0IGFmdGVyIHRoZSBmaXJzdCBMRiBmb3VuZC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBuZXh0TEYoZmluYWwgYnl0ZVtdIGIsIGludCBwdHIpIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBuZXh0TEYoYnl0ZVtdIGIsIGludCBwdHIpIHsKIAkJcmV0dXJuIG5leHQoYiwgcHRyLCAnXG4nKTsKIAl9CiAKQEAgLTUzNyw3ICs1MzgsNyBAQCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBuZXh0TEYoZmluYWwgYnl0ZVtdIGIsIGludCBwdHIpIHsKIAkgKiAgICAgICAgICAgIGNoYXJhY3RlciB0byBmaW5kLgogCSAqIEByZXR1cm4gbmV3IHBvc2l0aW9uIGp1c3QgYWZ0ZXIgdGhlIGZpcnN0IGNockEgb3IgTEYgdG8gYmUgZm91bmQuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbmV4dExGKGZpbmFsIGJ5dGVbXSBiLCBpbnQgcHRyLCBmaW5hbCBjaGFyIGNockEpIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBuZXh0TEYoYnl0ZVtdIGIsIGludCBwdHIsIGNoYXIgY2hyQSkgewogCQlmaW5hbCBpbnQgc3ogPSBiLmxlbmd0aDsKIAkJd2hpbGUgKHB0ciA8IHN6KSB7CiAJCQlmaW5hbCBieXRlIGMgPSBiW3B0cisrXTsKQEAgLTU1OCw3ICs1NTksNyBAQCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBuZXh0TEYoZmluYWwgYnl0ZVtdIGIsIGludCBwdHIsIGZpbmFsIGNoYXIgY2hyQSkgewogCSAqICAgICAgICAgICAgY2hhcmFjdGVyIHRvIGZpbmQuCiAJICogQHJldHVybiBuZXcgcG9zaXRpb24ganVzdCBiZWZvcmUgY2hyQSwgLTEgZm9yIG5vdCBmb3VuZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHByZXYoZmluYWwgYnl0ZVtdIGIsIGludCBwdHIsIGZpbmFsIGNoYXIgY2hyQSkgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHByZXYoYnl0ZVtdIGIsIGludCBwdHIsIGNoYXIgY2hyQSkgewogCQlpZiAocHRyID09IGIubGVuZ3RoKQogCQkJLS1wdHI7CiAJCXdoaWxlIChwdHIgPj0gMCkgewpAQCAtNTc5LDcgKzU4MCw3IEBAIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHByZXYoZmluYWwgYnl0ZVtdIGIsIGludCBwdHIsIGZpbmFsIGNoYXIgY2hyQSkgewogCSAqICAgICAgICAgICAgcG9zaXRpb24gd2l0aGluIGJ1ZmZlciB0byBzdGFydCBsb29raW5nIGZvciBMRiBhdC4KIAkgKiBAcmV0dXJuIG5ldyBwb3NpdGlvbiBqdXN0IGJlZm9yZSB0aGUgZmlyc3QgTEYgZm91bmQsIC0xIGZvciBub3QgZm91bmQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcmV2TEYoZmluYWwgYnl0ZVtdIGIsIGludCBwdHIpIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcmV2TEYoYnl0ZVtdIGIsIGludCBwdHIpIHsKIAkJcmV0dXJuIHByZXYoYiwgcHRyLCAnXG4nKTsKIAl9CiAKQEAgLTU5Nyw3ICs1OTgsNyBAQCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcmV2TEYoZmluYWwgYnl0ZVtdIGIsIGludCBwdHIpIHsKIAkgKiBAcmV0dXJuIG5ldyBwb3NpdGlvbiBqdXN0IGJlZm9yZSB0aGUgZmlyc3QgY2hyQSBvciBMRiB0byBiZSBmb3VuZCwgLTEgZm9yCiAJICogICAgICAgICBub3QgZm91bmQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcmV2TEYoZmluYWwgYnl0ZVtdIGIsIGludCBwdHIsIGZpbmFsIGNoYXIgY2hyQSkgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHByZXZMRihieXRlW10gYiwgaW50IHB0ciwgY2hhciBjaHJBKSB7CiAJCWlmIChwdHIgPT0gYi5sZW5ndGgpCiAJCQktLXB0cjsKIAkJd2hpbGUgKHB0ciA+PSAwKSB7CkBAIC02MzIsMTEgKzYzMyw0NyBAQCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcmV2TEYoZmluYWwgYnl0ZVtdIGIsIGludCBwdHIsIGZpbmFsIGNoYXIgY2hyQSkgewogCSAqICAgICAgICAgICAgbGluZSAxLgogCSAqIEBwYXJhbSBlbmQKIAkgKiAgICAgICAgICAgIDEgcGFzdCB0aGUgZW5kIG9mIHRoZSBjb250ZW50IHdpdGhpbiA8Y29kZT5idWY8L2NvZGU+LgotCSAqIEByZXR1cm4gYSBsaW5lIG1hcCBpbmRleGluZyB0aGUgc3RhcnQgcG9zaXRpb24gb2YgZWFjaCBsaW5lLgorCSAqIEByZXR1cm4gYSBsaW5lIG1hcCBpbmRpY2F0aW5nIHRoZSBzdGFydGluZyBwb3NpdGlvbiBvZiBlYWNoIGxpbmUsIG9yIGEKKwkgKiAgICAgICAgIG1hcCByZXByZXNlbnRpbmcgdGhlIGVudGlyZSBidWZmZXIgYXMgYSBzaW5nbGUgbGluZSBpZgorCSAqICAgICAgICAgPGNvZGU+YnVmPC9jb2RlPiBjb250YWlucyBhIE5VTCBieXRlLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW50TGlzdCBsaW5lTWFwKGZpbmFsIGJ5dGVbXSBidWYsIGludCBwdHIsIGludCBlbmQpIHsKLQkJaW50IHN0YXJ0ID0gcHRyOworCXB1YmxpYyBzdGF0aWMgZmluYWwgSW50TGlzdCBsaW5lTWFwKGJ5dGVbXSBidWYsIGludCBwdHIsIGludCBlbmQpIHsKKwkJSW50TGlzdCBtYXAgPSBsaW5lTWFwT3JOdWxsKGJ1ZiwgcHRyLCBlbmQpOworCQlpZiAobWFwID09IG51bGwpIHsKKwkJCW1hcCA9IG5ldyBJbnRMaXN0KDMpOworCQkJbWFwLmFkZChJbnRlZ2VyLk1JTl9WQUxVRSk7CisJCQltYXAuYWRkKHB0cik7CisJCQltYXAuYWRkKGVuZCk7CisJCX0KKwkJcmV0dXJuIG1hcDsKKwl9CiAKKwkvKioKKwkgKiBMaWtlIHtAbGluayAjbGluZU1hcChieXRlW10sIGludCwgaW50KX0gYnV0IHRocm93CisJICoge0BsaW5rIEJpbmFyeUJsb2JFeGNlcHRpb259IGlmIGEgTlVMIGJ5dGUgaXMgZW5jb3VudGVyZWQuCisJICoKKwkgKiBAcGFyYW0gYnVmCisJICogICAgICAgICAgICBidWZmZXIgdG8gc2Nhbi4KKwkgKiBAcGFyYW0gcHRyCisJICogICAgICAgICAgICBwb3NpdGlvbiB3aXRoaW4gdGhlIGJ1ZmZlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBmaXJzdCBieXRlIG9mCisJICogICAgICAgICAgICBsaW5lIDEuCisJICogQHBhcmFtIGVuZAorCSAqICAgICAgICAgICAgMSBwYXN0IHRoZSBlbmQgb2YgdGhlIGNvbnRlbnQgd2l0aGluIDxjb2RlPmJ1ZjwvY29kZT4uCisJICogQHJldHVybiBhIGxpbmUgbWFwIGluZGljYXRpbmcgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIG9mIGVhY2ggbGluZS4KKwkgKiBAdGhyb3dzIEJpbmFyeUJsb2JFeGNlcHRpb24KKwkgKiAgICAgICAgICAgIGlmIGEgTlVMIGJ5dGUgaXMgZm91bmQuCisJICogQHNpbmNlIDUuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgSW50TGlzdCBsaW5lTWFwT3JCaW5hcnkoYnl0ZVtdIGJ1ZiwgaW50IHB0ciwgaW50IGVuZCkKKwkJCXRocm93cyBCaW5hcnlCbG9iRXhjZXB0aW9uIHsKKwkJSW50TGlzdCBtYXAgPSBsaW5lTWFwT3JOdWxsKGJ1ZiwgcHRyLCBlbmQpOworCQlpZiAobWFwID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBCaW5hcnlCbG9iRXhjZXB0aW9uKCk7CisJCX0KKwkJcmV0dXJuIG1hcDsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBATnVsbGFibGUgSW50TGlzdCBsaW5lTWFwT3JOdWxsKGJ5dGVbXSBidWYsIGludCBwdHIsIGludCBlbmQpIHsKIAkJLy8gRXhwZXJpbWVudGFsbHkgZGVyaXZlZCBmcm9tIG11bHRpcGxlIHNvdXJjZSByZXBvc2l0b3JpZXMKIAkJLy8gdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIGJ5dGVzL2xpbmUgaXMgMzYuIEl0cyBhIHJvdWdoIGd1ZXNzCiAJCS8vIHRvIGluaXRpYWxseSBzaXplIG91ciBtYXAgY2xvc2UgdG8gdGhlIHRhcmdldC4KQEAgLTY0OSwxMSArNjg2LDcgQEAgcHVibGljIHN0YXRpYyBmaW5hbCBJbnRMaXN0IGxpbmVNYXAoZmluYWwgYnl0ZVtdIGJ1ZiwgaW50IHB0ciwgaW50IGVuZCkgewogCQkJfQogCiAJCQlpZiAoYnVmW3B0cl0gPT0gJ1wwJykgewotCQkJCS8vIGJpbmFyeSBkYXRhLgotCQkJCW1hcCA9IG5ldyBJbnRMaXN0KDMpOwotCQkJCW1hcC5hZGQoSW50ZWdlci5NSU5fVkFMVUUpOwotCQkJCW1hcC5hZGQoc3RhcnQpOwotCQkJCWJyZWFrOworCQkJCXJldHVybiBudWxsOwogCQkJfQogCiAJCQlmb3VuZExGID0gKGJ1ZltwdHJdID09ICdcbicpOwpAQCAtNjc1LDcgKzcwOCw3IEBAIHB1YmxpYyBzdGF0aWMgZmluYWwgSW50TGlzdCBsaW5lTWFwKGZpbmFsIGJ5dGVbXSBidWYsIGludCBwdHIsIGludCBlbmQpIHsKIAkgKiAgICAgICAgIGNoYXJhY3RlciBvZiB0aGUgYXV0aG9yJ3MgbmFtZS4gSWYgbm8gYXV0aG9yIGhlYWRlciBjYW4gYmUKIAkgKiAgICAgICAgIGxvY2F0ZWQgLTEgaXMgcmV0dXJuZWQuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYXV0aG9yKGZpbmFsIGJ5dGVbXSBiLCBpbnQgcHRyKSB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYXV0aG9yKGJ5dGVbXSBiLCBpbnQgcHRyKSB7CiAJCWZpbmFsIGludCBzeiA9IGIubGVuZ3RoOwogCQlpZiAocHRyID09IDApCiAJCQlwdHIgKz0gNDY7IC8vIHNraXAgdGhlICJ0cmVlIC4uLiIgbGluZS4KQEAgLTY5Nyw3ICs3MzAsNyBAQCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBhdXRob3IoZmluYWwgYnl0ZVtdIGIsIGludCBwdHIpIHsKIAkgKiAgICAgICAgIGNoYXJhY3RlciBvZiB0aGUgY29tbWl0dGVyJ3MgbmFtZS4gSWYgbm8gY29tbWl0dGVyIGhlYWRlciBjYW4gYmUKIAkgKiAgICAgICAgIGxvY2F0ZWQgLTEgaXMgcmV0dXJuZWQuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY29tbWl0dGVyKGZpbmFsIGJ5dGVbXSBiLCBpbnQgcHRyKSB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY29tbWl0dGVyKGJ5dGVbXSBiLCBpbnQgcHRyKSB7CiAJCWZpbmFsIGludCBzeiA9IGIubGVuZ3RoOwogCQlpZiAocHRyID09IDApCiAJCQlwdHIgKz0gNDY7IC8vIHNraXAgdGhlICJ0cmVlIC4uLiIgbGluZS4KQEAgLTcyMSw3ICs3NTQsNyBAQCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBjb21taXR0ZXIoZmluYWwgYnl0ZVtdIGIsIGludCBwdHIpIHsKIAkgKiAgICAgICAgIGNoYXJhY3RlciBvZiB0aGUgdGFnZ2VyJ3MgbmFtZS4gSWYgbm8gdGFnZ2VyIGhlYWRlciBjYW4gYmUKIAkgKiAgICAgICAgIGxvY2F0ZWQgLTEgaXMgcmV0dXJuZWQuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGFnZ2VyKGZpbmFsIGJ5dGVbXSBiLCBpbnQgcHRyKSB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGFnZ2VyKGJ5dGVbXSBiLCBpbnQgcHRyKSB7CiAJCWZpbmFsIGludCBzeiA9IGIubGVuZ3RoOwogCQlpZiAocHRyID09IDApCiAJCQlwdHIgKz0gNDg7IC8vIHNraXAgdGhlICJvYmplY3QgLi4uIiBsaW5lLgpAQCAtNzQ5LDcgKzc4Miw3IEBAIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRhZ2dlcihmaW5hbCBieXRlW10gYiwgaW50IHB0cikgewogCSAqICAgICAgICAgY2hhcmFjdGVyIG9mIHRoZSBlbmNvZGluZydzIG5hbWUuIElmIG5vIGVuY29kaW5nIGhlYWRlciBjYW4gYmUKIAkgKiAgICAgICAgIGxvY2F0ZWQgLTEgaXMgcmV0dXJuZWQgKGFuZCBVVEYtOCBzaG91bGQgYmUgYXNzdW1lZCkuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZW5jb2RpbmcoZmluYWwgYnl0ZVtdIGIsIGludCBwdHIpIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBlbmNvZGluZyhieXRlW10gYiwgaW50IHB0cikgewogCQlmaW5hbCBpbnQgc3ogPSBiLmxlbmd0aDsKIAkJd2hpbGUgKHB0ciA8IHN6KSB7CiAJCQlpZiAoYltwdHJdID09ICdcbicpCkBAIC03NzMsNyArODA2LDcgQEAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZW5jb2RpbmcoZmluYWwgYnl0ZVtdIGIsIGludCBwdHIpIHsKIAkgKiBAc2luY2UgNC4yCiAJICovCiAJQE51bGxhYmxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGFyc2VFbmNvZGluZ05hbWUoZmluYWwgYnl0ZVtdIGIpIHsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBwYXJzZUVuY29kaW5nTmFtZShieXRlW10gYikgewogCQlpbnQgZW5jID0gZW5jb2RpbmcoYiwgMCk7CiAJCWlmIChlbmMgPCAwKSB7CiAJCQlyZXR1cm4gbnVsbDsKQEAgLTgwMSw3ICs4MzQsNyBAQCBwdWJsaWMgc3RhdGljIFN0cmluZyBwYXJzZUVuY29kaW5nTmFtZShmaW5hbCBieXRlW10gYikgewogCSAqICAgICAgICAgICAgIGlmIHRoZSBKUkUgZG9lcyBub3Qgc3VwcG9ydCB0aGUgY2hhcmFjdGVyIHNldCByZXF1ZXN0ZWQgYnkKIAkgKiAgICAgICAgICAgICB0aGUgZW5jb2RpbmcgaGVhZGVyLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2hhcnNldCBwYXJzZUVuY29kaW5nKGZpbmFsIGJ5dGVbXSBiKSB7CisJcHVibGljIHN0YXRpYyBDaGFyc2V0IHBhcnNlRW5jb2RpbmcoYnl0ZVtdIGIpIHsKIAkJU3RyaW5nIGVuYyA9IHBhcnNlRW5jb2RpbmdOYW1lKGIpOwogCQlpZiAoZW5jID09IG51bGwpIHsKIAkJCXJldHVybiBVVEZfODsKQEAgLTgzMSw3ICs4NjQsNyBAQCBwdWJsaWMgc3RhdGljIENoYXJzZXQgcGFyc2VFbmNvZGluZyhmaW5hbCBieXRlW10gYikgewogCSAqIEByZXR1cm4gdGhlIHBhcnNlZCBpZGVudGl0eSBvciBudWxsIGluIGNhc2UgdGhlIGlkZW50aXR5IGNvdWxkIG5vdCBiZQogCSAqICAgICAgICAgcGFyc2VkLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgUGVyc29uSWRlbnQgcGFyc2VQZXJzb25JZGVudChmaW5hbCBTdHJpbmcgaW4pIHsKKwlwdWJsaWMgc3RhdGljIFBlcnNvbklkZW50IHBhcnNlUGVyc29uSWRlbnQoU3RyaW5nIGluKSB7CiAJCXJldHVybiBwYXJzZVBlcnNvbklkZW50KENvbnN0YW50cy5lbmNvZGUoaW4pLCAwKTsKIAl9CiAKQEAgLTg1Myw3ICs4ODYsNyBAQCBwdWJsaWMgc3RhdGljIFBlcnNvbklkZW50IHBhcnNlUGVyc29uSWRlbnQoZmluYWwgU3RyaW5nIGluKSB7CiAJICogQHJldHVybiB0aGUgcGFyc2VkIGlkZW50aXR5IG9yIG51bGwgaW4gY2FzZSB0aGUgaWRlbnRpdHkgY291bGQgbm90IGJlCiAJICogICAgICAgICBwYXJzZWQuCiAJICovCi0JcHVibGljIHN0YXRpYyBQZXJzb25JZGVudCBwYXJzZVBlcnNvbklkZW50KGZpbmFsIGJ5dGVbXSByYXcsIGZpbmFsIGludCBuYW1lQikgeworCXB1YmxpYyBzdGF0aWMgUGVyc29uSWRlbnQgcGFyc2VQZXJzb25JZGVudChieXRlW10gcmF3LCBpbnQgbmFtZUIpIHsKIAkJQ2hhcnNldCBjczsKIAkJdHJ5IHsKIAkJCWNzID0gcGFyc2VFbmNvZGluZyhyYXcpOwpAQCAtOTYxLDcgKzk5NCw3IEBAIHB1YmxpYyBzdGF0aWMgUGVyc29uSWRlbnQgcGFyc2VQZXJzb25JZGVudE9ubHkoZmluYWwgYnl0ZVtdIHJhdywKIAkgKiBAcmV0dXJuIHBvc2l0aW9uIG9mIHRoZSAnOicgd2hpY2ggdGVybWluYXRlcyB0aGUgZm9vdGVyIGxpbmUga2V5IGlmIHRoaXMKIAkgKiAgICAgICAgIGlzIG90aGVyd2lzZSBhIHZhbGlkIGZvb3RlciBsaW5lIGtleTsgb3RoZXJ3aXNlIC0xLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGVuZE9mRm9vdGVyTGluZUtleShmaW5hbCBieXRlW10gcmF3LCBpbnQgcHRyKSB7CisJcHVibGljIHN0YXRpYyBpbnQgZW5kT2ZGb290ZXJMaW5lS2V5KGJ5dGVbXSByYXcsIGludCBwdHIpIHsKIAkJdHJ5IHsKIAkJCWZvciAoOzspIHsKIAkJCQlmaW5hbCBieXRlIGMgPSByYXdbcHRyXTsKQEAgLTk4OCw3ICsxMDIxLDcgQEAgcHVibGljIHN0YXRpYyBpbnQgZW5kT2ZGb290ZXJMaW5lS2V5KGZpbmFsIGJ5dGVbXSByYXcsIGludCBwdHIpIHsKIAkgKiBAcmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByYW5nZSA8Y29kZT5bc3RhcnQsZW5kKTwvY29kZT4sCiAJICogICAgICAgICBhZnRlciBkZWNvZGluZyB0aGUgcmVnaW9uIHRocm91Z2ggdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgc2V0LgogCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlY29kZShmaW5hbCBieXRlW10gYnVmZmVyKSB7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgZGVjb2RlKGJ5dGVbXSBidWZmZXIpIHsKIAkJcmV0dXJuIGRlY29kZShidWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGgpOwogCX0KIApAQCAtMTAyNiw3ICsxMDU5LDcgQEAgcHVibGljIHN0YXRpYyBTdHJpbmcgZGVjb2RlKGZpbmFsIGJ5dGVbXSBidWZmZXIsIGZpbmFsIGludCBzdGFydCwKIAkgKiBAcmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByYW5nZSA8Y29kZT5bc3RhcnQsZW5kKTwvY29kZT4sCiAJICogICAgICAgICBhZnRlciBkZWNvZGluZyB0aGUgcmVnaW9uIHRocm91Z2ggdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgc2V0LgogCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlY29kZShmaW5hbCBDaGFyc2V0IGNzLCBmaW5hbCBieXRlW10gYnVmZmVyKSB7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgZGVjb2RlKENoYXJzZXQgY3MsIGJ5dGVbXSBidWZmZXIpIHsKIAkJcmV0dXJuIGRlY29kZShjcywgYnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoKTsKIAl9CiAKQEAgLTExNDMsNyArMTE3Niw3IEBAIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4dHJhY3RCaW5hcnlTdHJpbmcoZmluYWwgYnl0ZVtdIGJ1ZmZlciwKIAkJcmV0dXJuIHIudG9TdHJpbmcoKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVjb2RlKGZpbmFsIEJ5dGVCdWZmZXIgYiwgZmluYWwgQ2hhcnNldCBjaGFyc2V0KQorCXByaXZhdGUgc3RhdGljIFN0cmluZyBkZWNvZGUoQnl0ZUJ1ZmZlciBiLCBDaGFyc2V0IGNoYXJzZXQpCiAJCQl0aHJvd3MgQ2hhcmFjdGVyQ29kaW5nRXhjZXB0aW9uIHsKIAkJZmluYWwgQ2hhcnNldERlY29kZXIgZCA9IGNoYXJzZXQubmV3RGVjb2RlcigpOwogCQlkLm9uTWFsZm9ybWVkSW5wdXQoQ29kaW5nRXJyb3JBY3Rpb24uUkVQT1JUKTsKQEAgLTExNjIsNyArMTE5NSw3IEBAIHByaXZhdGUgc3RhdGljIFN0cmluZyBkZWNvZGUoZmluYWwgQnl0ZUJ1ZmZlciBiLCBmaW5hbCBDaGFyc2V0IGNoYXJzZXQpCiAJICogICAgICAgICAgICBjb21taXQgYnVmZmVyLgogCSAqIEByZXR1cm4gcG9zaXRpb24gb2YgdGhlIHVzZXIncyBtZXNzYWdlIGJ1ZmZlci4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBjb21taXRNZXNzYWdlKGZpbmFsIGJ5dGVbXSBiLCBpbnQgcHRyKSB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY29tbWl0TWVzc2FnZShieXRlW10gYiwgaW50IHB0cikgewogCQlmaW5hbCBpbnQgc3ogPSBiLmxlbmd0aDsKIAkJaWYgKHB0ciA9PSAwKQogCQkJcHRyICs9IDQ2OyAvLyBza2lwIHRoZSAidHJlZSAuLi4iIGxpbmUuCkBAIC0xMTg2LDcgKzEyMTksNyBAQCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBjb21taXRNZXNzYWdlKGZpbmFsIGJ5dGVbXSBiLCBpbnQgcHRyKSB7CiAJICogICAgICAgICAgICBidWZmZXIuCiAJICogQHJldHVybiBwb3NpdGlvbiBvZiB0aGUgdXNlcidzIG1lc3NhZ2UgYnVmZmVyLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRhZ01lc3NhZ2UoZmluYWwgYnl0ZVtdIGIsIGludCBwdHIpIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCB0YWdNZXNzYWdlKGJ5dGVbXSBiLCBpbnQgcHRyKSB7CiAJCWZpbmFsIGludCBzeiA9IGIubGVuZ3RoOwogCQlpZiAocHRyID09IDApCiAJCQlwdHIgKz0gNDg7IC8vIHNraXAgdGhlICJvYmplY3QgLi4uIiBsaW5lLgpAQCAtMTIxMSw3ICsxMjQ0LDcgQEAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGFnTWVzc2FnZShmaW5hbCBieXRlW10gYiwgaW50IHB0cikgewogCSAqIEByZXR1cm4gcG9zaXRpb24gb2YgdGhlIExGIGF0IHRoZSBlbmQgb2YgdGhlIHBhcmFncmFwaDsKIAkgKiAgICAgICAgIDxjb2RlPmIubGVuZ3RoPC9jb2RlPiBpZiBubyBwYXJhZ3JhcGggZW5kIGNvdWxkIGJlIGxvY2F0ZWQuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZW5kT2ZQYXJhZ3JhcGgoZmluYWwgYnl0ZVtdIGIsIGZpbmFsIGludCBzdGFydCkgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGVuZE9mUGFyYWdyYXBoKGJ5dGVbXSBiLCBpbnQgc3RhcnQpIHsKIAkJaW50IHB0ciA9IHN0YXJ0OwogCQlmaW5hbCBpbnQgc3ogPSBiLmxlbmd0aDsKIAkJd2hpbGUgKHB0ciA8IHN6ICYmIChiW3B0cl0gIT0gJ1xuJyAmJiBiW3B0cl0gIT0gJ1xyJykpCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUmF3U3ViU3RyaW5nUGF0dGVybi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL1Jhd1N1YlN0cmluZ1BhdHRlcm4uamF2YQppbmRleCBhOGY5YmM3Li4wNDBiNWNiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUmF3U3ViU3RyaW5nUGF0dGVybi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9SYXdTdWJTdHJpbmdQYXR0ZXJuLmphdmEKQEAgLTY2LDcgKzY2LDcgQEAgcHVibGljIGNsYXNzIFJhd1N1YlN0cmluZ1BhdHRlcm4gewogCSAqICAgICAgICAgICAgbWV0YS1jaGFyYWN0ZXJzIGFyZSBzdXBwb3J0ZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvbi4gVGhlCiAJICogICAgICAgICAgICBzdHJpbmcgbWF5IG5vdCBiZSB0aGUgZW1wdHkgc3RyaW5nLgogCSAqLwotCXB1YmxpYyBSYXdTdWJTdHJpbmdQYXR0ZXJuKGZpbmFsIFN0cmluZyBwYXR0ZXJuVGV4dCkgeworCXB1YmxpYyBSYXdTdWJTdHJpbmdQYXR0ZXJuKFN0cmluZyBwYXR0ZXJuVGV4dCkgewogCQlpZiAocGF0dGVyblRleHQubGVuZ3RoKCkgPT0gMCkKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oSkdpdFRleHQuZ2V0KCkuY2Fubm90TWF0Y2hPbkVtcHR5U3RyaW5nKTsKIAkJbmVlZGxlU3RyaW5nID0gcGF0dGVyblRleHQ7CkBAIC04Nyw3ICs4Nyw3IEBAIHB1YmxpYyBSYXdTdWJTdHJpbmdQYXR0ZXJuKGZpbmFsIFN0cmluZyBwYXR0ZXJuVGV4dCkgewogCSAqICAgICAgICAgcGF0dGVybjsgLTEgaWYgdGhpcyBwYXR0ZXJuIGRvZXMgbm90IGFwcGVhciBhdCBhbnkgcG9zaXRpb24gb2YKIAkgKiAgICAgICAgIDxjb2RlPnJjczwvY29kZT4uCiAJICovCi0JcHVibGljIGludCBtYXRjaChmaW5hbCBSYXdDaGFyU2VxdWVuY2UgcmNzKSB7CisJcHVibGljIGludCBtYXRjaChSYXdDaGFyU2VxdWVuY2UgcmNzKSB7CiAJCWZpbmFsIGludCBuZWVkbGVMZW4gPSBuZWVkbGUubGVuZ3RoOwogCQlmaW5hbCBieXRlIGZpcnN0ID0gbmVlZGxlWzBdOwogCkBAIC0xMTQsMTEgKzExNCwxMSBAQCBwdWJsaWMgaW50IG1hdGNoKGZpbmFsIFJhd0NoYXJTZXF1ZW5jZSByY3MpIHsKIAkJcmV0dXJuIC0xOwogCX0KIAotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gbmVxKGZpbmFsIGJ5dGUgYSwgZmluYWwgYnl0ZSBiKSB7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBuZXEoYnl0ZSBhLCBieXRlIGIpIHsKIAkJcmV0dXJuIGEgIT0gYiAmJiBhICE9IGxjKGIpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgbGMoZmluYWwgYnl0ZSBxKSB7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBsYyhieXRlIHEpIHsKIAkJcmV0dXJuIChieXRlKSBTdHJpbmdVdGlscy50b0xvd2VyQ2FzZSgoY2hhcikgKHEgJiAweGZmKSk7CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUmVmTWFwLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUmVmTWFwLmphdmEKaW5kZXggYzFhYWVjZi4uYTNmOTczMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL1JlZk1hcC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9SZWZNYXAuamF2YQpAQCAtMTY5LDcgKzE2OSw3IEBAIHB1YmxpYyBSZWYgZ2V0KE9iamVjdCBrZXkpIHsKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIFJlZiBwdXQoZmluYWwgU3RyaW5nIGtleU5hbWUsIFJlZiB2YWx1ZSkgeworCXB1YmxpYyBSZWYgcHV0KFN0cmluZyBrZXlOYW1lLCBSZWYgdmFsdWUpIHsKIAkJU3RyaW5nIG5hbWUgPSB0b1JlZk5hbWUoa2V5TmFtZSk7CiAKIAkJaWYgKCFuYW1lLmVxdWFscyh2YWx1ZS5nZXROYW1lKCkpKQpAQCAtMzU1LDcgKzM1NSw3IEBAIHB1YmxpYyBFbnRyeTxTdHJpbmcsIFJlZj4gcGVlaygpIHsKIAkJCXJldHVybiBudWxsOwogCQl9CiAKLQkJcHJpdmF0ZSBSZWYgcmVzb2x2ZUxvb3NlKGZpbmFsIFJlZiBsKSB7CisJCXByaXZhdGUgUmVmIHJlc29sdmVMb29zZShSZWYgbCkgewogCQkJaWYgKHJlc29sdmVkSWR4IDwgcmVzb2x2ZWQuc2l6ZSgpKSB7CiAJCQkJUmVmIHIgPSByZXNvbHZlZC5nZXQocmVzb2x2ZWRJZHgpOwogCQkJCWludCBjbXAgPSBSZWZDb21wYXJhdG9yLmNvbXBhcmVUbyhsLCByKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9Tc2hTdXBwb3J0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvU3NoU3VwcG9ydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxM2FhNzIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvU3NoU3VwcG9ydC5qYXZhCkBAIC0wLDAgKzEsMTU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4LCBNYXJrdXMgRHVmdCA8bWFya3VzLmR1ZnRAc3NpLXNjaGFlZmVyLmNvbT4KKyAqIGFuZCBvdGhlciBjb3B5cmlnaHQgb3duZXJzIGFzIGRvY3VtZW50ZWQgaW4gdGhlIHByb2plY3QncyBJUCBsb2cuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2MS4wIHdoaWNoCisgKiBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgaXMgcmVwcm9kdWNlZCBiZWxvdywgYW5kIGlzCisgKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCisgKiB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKKyAqIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCisgKiAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAtIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgSW5jLiBub3IgdGhlCisgKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgKiAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqICAgd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORAorICogQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKKyAqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGCisgKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hbm5vdGF0aW9ucy5OdWxsYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5Db21tYW5kRmFpbGVkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuSkdpdFRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuQ3JlZGVudGlhbHNQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5SZW1vdGVTZXNzaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlNzaFNlc3Npb25GYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlVSSWlzaDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuaW8uTWVzc2FnZVdyaXRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuaW8uU3RyZWFtQ29weVRocmVhZDsKKworLyoqCisgKiBFeHRyYSB1dGlsaXRpZXMgdG8gc3VwcG9ydCB1c2FnZSBvZiBTU0guCisgKgorICogQHNpbmNlIDUuMAorICovCitwdWJsaWMgY2xhc3MgU3NoU3VwcG9ydCB7CisKKwkvKioKKwkgKiBVdGlsaXR5IHRvIGV4ZWN1dGUgYSByZW1vdGUgU1NIIGNvbW1hbmQgYW5kIHJlYWQgdGhlIGZpcnN0IGxpbmUgb2YKKwkgKiBvdXRwdXQuCisJICoKKwkgKiBAcGFyYW0gc3NoVXJpCisJICogICAgICAgICAgICB0aGUgU1NIIHJlbW90ZSBVUkkKKwkgKiBAcGFyYW0gcHJvdmlkZXIKKwkgKiAgICAgICAgICAgIHRoZSB7QGxpbmsgQ3JlZGVudGlhbHNQcm92aWRlcn0gb3IgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHBhcmFtIGZzCisJICogICAgICAgICAgICB0aGUge0BsaW5rIEZTfSBpbXBsZW1lbnRhdGlvbiBwYXNzZWQgdG8KKwkgKiAgICAgICAgICAgIHtAbGluayBTc2hTZXNzaW9uRmFjdG9yeX0KKwkgKiBAcGFyYW0gY29tbWFuZAorCSAqICAgICAgICAgICAgdGhlIHJlbW90ZSBjb21tYW5kIHRvIGV4ZWN1dGUuCisJICogQHBhcmFtIHRpbWVvdXQKKwkgKiAgICAgICAgICAgIGEgdGltZW91dCBpbiBzZWNvbmRzLiBUaGUgdGltZW91dCBtYXkgYmUgZXhjZWVkZWQgaW4gY29ybmVyCisJICogICAgICAgICAgICBjYXNlcy4KKwkgKiBAcmV0dXJuIFRoZSBlbnRpcmUgb3V0cHV0IHJlYWQgZnJvbSBzdGRvdXQuCisJICogQHRocm93cyBJT0V4Y2VwdGlvbgorCSAqIEB0aHJvd3MgQ29tbWFuZEZhaWxlZEV4Y2VwdGlvbgorCSAqICAgICAgICAgICAgIGlmIHRoZSBzc2ggY29tbWFuZCBleGVjdXRpb24gZmFpbGVkLCBlcnJvciBtZXNzYWdlIGNvbnRhaW5zCisJICogICAgICAgICAgICAgdGhlIGNvbnRlbnQgb2Ygc3RkZXJyLgorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJ1blNzaENvbW1hbmQoVVJJaXNoIHNzaFVyaSwKKwkJCUBOdWxsYWJsZSBDcmVkZW50aWFsc1Byb3ZpZGVyIHByb3ZpZGVyLCBGUyBmcywgU3RyaW5nIGNvbW1hbmQsCisJCQlpbnQgdGltZW91dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb21tYW5kRmFpbGVkRXhjZXB0aW9uIHsKKwkJUmVtb3RlU2Vzc2lvbiBzZXNzaW9uID0gbnVsbDsKKwkJUHJvY2VzcyBwcm9jZXNzID0gbnVsbDsKKwkJU3RyZWFtQ29weVRocmVhZCBlcnJvclRocmVhZCA9IG51bGw7CisJCVN0cmVhbUNvcHlUaHJlYWQgb3V0VGhyZWFkID0gbnVsbDsKKwkJQ29tbWFuZEZhaWxlZEV4Y2VwdGlvbiBmYWlsdXJlID0gbnVsbDsKKwkJQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikKKwkJTWVzc2FnZVdyaXRlciBzdGRlcnIgPSBuZXcgTWVzc2FnZVdyaXRlcigpOworCQl0cnkgKE1lc3NhZ2VXcml0ZXIgc3Rkb3V0ID0gbmV3IE1lc3NhZ2VXcml0ZXIoKSkgeworCQkJc2Vzc2lvbiA9IFNzaFNlc3Npb25GYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0U2Vzc2lvbihzc2hVcmksCisJCQkJCXByb3ZpZGVyLCBmcywgMTAwMCAqIHRpbWVvdXQpOworCQkJcHJvY2VzcyA9IHNlc3Npb24uZXhlYyhjb21tYW5kLCAwKTsKKwkJCWVycm9yVGhyZWFkID0gbmV3IFN0cmVhbUNvcHlUaHJlYWQocHJvY2Vzcy5nZXRFcnJvclN0cmVhbSgpLAorCQkJCQlzdGRlcnIuZ2V0UmF3U3RyZWFtKCkpOworCQkJZXJyb3JUaHJlYWQuc3RhcnQoKTsKKwkJCW91dFRocmVhZCA9IG5ldyBTdHJlYW1Db3B5VGhyZWFkKHByb2Nlc3MuZ2V0SW5wdXRTdHJlYW0oKSwKKwkJCQkJc3Rkb3V0LmdldFJhd1N0cmVhbSgpKTsKKwkJCW91dFRocmVhZC5zdGFydCgpOworCQkJdHJ5IHsKKwkJCQkvLyB3YWl0Rm9yIHdpdGggdGltZW91dCBoYXMgYSBidWcgLSBKU2NoJyBleGl0VmFsdWUoKSB0aHJvd3MgdGhlCisJCQkJLy8gd3JvbmcgZXhjZXB0aW9uIHR5cGUgOigKKwkJCQlpZiAocHJvY2Vzcy53YWl0Rm9yKCkgPT0gMCkgeworCQkJCQlyZXR1cm4gc3Rkb3V0LnRvU3RyaW5nKCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmV0dXJuIG51bGw7IC8vIHN0aWxsIHJ1bm5pbmcgYWZ0ZXIgdGltZW91dAorCQkJCX0KKwkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKwkJCQlyZXR1cm4gbnVsbDsgLy8gZXJyb3IKKwkJCX0KKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChlcnJvclRocmVhZCAhPSBudWxsKSB7CisJCQkJdHJ5IHsKKwkJCQkJZXJyb3JUaHJlYWQuaGFsdCgpOworCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKwkJCQkJLy8gU3RvcCB3YWl0aW5nIGFuZCByZXR1cm4gYW55d2F5LgorCQkJCX0gZmluYWxseSB7CisJCQkJCWVycm9yVGhyZWFkID0gbnVsbDsKKwkJCQl9CisJCQl9CisJCQlpZiAob3V0VGhyZWFkICE9IG51bGwpIHsKKwkJCQl0cnkgeworCQkJCQlvdXRUaHJlYWQuaGFsdCgpOworCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKwkJCQkJLy8gU3RvcCB3YWl0aW5nIGFuZCByZXR1cm4gYW55d2F5LgorCQkJCX0gZmluYWxseSB7CisJCQkJCW91dFRocmVhZCA9IG51bGw7CisJCQkJfQorCQkJfQorCQkJaWYgKHByb2Nlc3MgIT0gbnVsbCkgeworCQkJCWlmIChwcm9jZXNzLmV4aXRWYWx1ZSgpICE9IDApIHsKKwkJCQkJZmFpbHVyZSA9IG5ldyBDb21tYW5kRmFpbGVkRXhjZXB0aW9uKHByb2Nlc3MuZXhpdFZhbHVlKCksCisJCQkJCQkJTWVzc2FnZUZvcm1hdC5mb3JtYXQoCisJCQkJCQkJSkdpdFRleHQuZ2V0KCkuc3NoQ29tbWFuZEZhaWxlZCwgY29tbWFuZCwKKwkJCQkJCQlzdGRlcnIudG9TdHJpbmcoKSkpOworCQkJCX0KKwkJCQlwcm9jZXNzLmRlc3Ryb3koKTsKKwkJCX0KKwkJCXN0ZGVyci5jbG9zZSgpOworCQkJaWYgKHNlc3Npb24gIT0gbnVsbCkgeworCQkJCVNzaFNlc3Npb25GYWN0b3J5LmdldEluc3RhbmNlKCkucmVsZWFzZVNlc3Npb24oc2Vzc2lvbik7CisJCQl9CisJCQlpZiAoZmFpbHVyZSAhPSBudWxsKSB7CisJCQkJdGhyb3cgZmFpbHVyZTsKKwkJCX0KKwkJfQorCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL1N0cmluZ1V0aWxzLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvU3RyaW5nVXRpbHMuamF2YQppbmRleCBiNDczNmQzLi4zODY4ZTU2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvU3RyaW5nVXRpbHMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvU3RyaW5nVXRpbHMuamF2YQpAQCAtNzQsNyArNzQsNyBAQCBwdWJsaWMgZmluYWwgY2xhc3MgU3RyaW5nVXRpbHMgewogCSAqICAgICAgICAgICAgdGhlIGlucHV0IGNoYXJhY3Rlci4KIAkgKiBAcmV0dXJuIGxvd2VyY2FzZSB2ZXJzaW9uIG9mIHRoZSBpbnB1dC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXIgdG9Mb3dlckNhc2UoZmluYWwgY2hhciBjKSB7CisJcHVibGljIHN0YXRpYyBjaGFyIHRvTG93ZXJDYXNlKGNoYXIgYykgewogCQlyZXR1cm4gYyA8PSAnWicgPyBMQ1tjXSA6IGM7CiAJfQogCkBAIC05MSw3ICs5MSw3IEBAIHB1YmxpYyBzdGF0aWMgY2hhciB0b0xvd2VyQ2FzZShmaW5hbCBjaGFyIGMpIHsKIAkgKiBAcmV0dXJuIGEgY29weSBvZiB0aGUgaW5wdXQgc3RyaW5nLCBhZnRlciBjb252ZXJ0aW5nIGNoYXJhY3RlcnMgaW4gdGhlCiAJICogICAgICAgICByYW5nZSAnQScuLidaJyB0byAnYScuLid6Jy4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b0xvd2VyQ2FzZShmaW5hbCBTdHJpbmcgaW4pIHsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyB0b0xvd2VyQ2FzZShTdHJpbmcgaW4pIHsKIAkJZmluYWwgU3RyaW5nQnVpbGRlciByID0gbmV3IFN0cmluZ0J1aWxkZXIoaW4ubGVuZ3RoKCkpOwogCQlmb3IgKGludCBpID0gMDsgaSA8IGluLmxlbmd0aCgpOyBpKyspCiAJCQlyLmFwcGVuZCh0b0xvd2VyQ2FzZShpbi5jaGFyQXQoaSkpKTsKQEAgLTEzOCw3ICsxMzgsNyBAQCBwdWJsaWMgc3RhdGljIFN0cmluZyBjYXBpdGFsaXplKFN0cmluZyBzdHIpIHsKIAkgKiAgICAgICAgICAgIHNlY29uZCBzdHJpbmcgdG8gY29tcGFyZS4KIAkgKiBAcmV0dXJuIHRydWUgaWYgYSBlcXVhbHMgYgogCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlcXVhbHNJZ25vcmVDYXNlKGZpbmFsIFN0cmluZyBhLCBmaW5hbCBTdHJpbmcgYikgeworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlcXVhbHNJZ25vcmVDYXNlKFN0cmluZyBhLCBTdHJpbmcgYikgewogCQlpZiAoYSA9PSBiKQogCQkJcmV0dXJuIHRydWU7CiAJCWlmIChhLmxlbmd0aCgpICE9IGIubGVuZ3RoKCkpCkBAIC0yMDUsNyArMjA1LDcgQEAgcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZVdpdGhDYXNlKFN0cmluZyBhLCBTdHJpbmcgYikgewogCSAqICAgICAgICAgICAgIGlmIHtAY29kZSB2YWx1ZX0gaXMgbm90IHJlY29nbml6ZWQgYXMgb25lIG9mIHRoZSBzdGFuZGFyZAogCSAqICAgICAgICAgICAgIGJvb2xlYW4gbmFtZXMuCiAJICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHRvQm9vbGVhbihmaW5hbCBTdHJpbmcgc3RyaW5nVmFsdWUpIHsKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdG9Cb29sZWFuKFN0cmluZyBzdHJpbmdWYWx1ZSkgewogCQlpZiAoc3RyaW5nVmFsdWUgPT0gbnVsbCkKIAkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbihKR2l0VGV4dC5nZXQoKS5leHBlY3RlZEJvb2xlYW5TdHJpbmdWYWx1ZSk7CiAKQEAgLTIzMiw3ICsyMzIsNyBAQCBwdWJsaWMgc3RhdGljIGJvb2xlYW4gdG9Cb29sZWFuKGZpbmFsIFN0cmluZyBzdHJpbmdWYWx1ZSkgewogCSAqIEByZXR1cm4gdGhlIGJvb2xlYW4gaW50ZXJwcmV0YXRpb24gb2Yge0Bjb2RlIHZhbHVlfSBvciBudWxsIGluIGNhc2UgdGhlCiAJICogICAgICAgICBzdHJpbmcgZG9lcyBub3QgcmVwcmVzZW50IGEgYm9vbGVhbiB2YWx1ZQogCSAqLwotCXB1YmxpYyBzdGF0aWMgQm9vbGVhbiB0b0Jvb2xlYW5Pck51bGwoZmluYWwgU3RyaW5nIHN0cmluZ1ZhbHVlKSB7CisJcHVibGljIHN0YXRpYyBCb29sZWFuIHRvQm9vbGVhbk9yTnVsbChTdHJpbmcgc3RyaW5nVmFsdWUpIHsKIAkJaWYgKHN0cmluZ1ZhbHVlID09IG51bGwpCiAJCQlyZXR1cm4gbnVsbDsKIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL1N5c3RlbVJlYWRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL1N5c3RlbVJlYWRlci5qYXZhCmluZGV4IDk2YTc5NmMuLjk1M2M5NzYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9TeXN0ZW1SZWFkZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvU3lzdGVtUmVhZGVyLmphdmEKQEAgLTIzNyw3ICsyMzcsNyBAQCBwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXRQbGF0Zm9ybUNoZWNrZXIoKSB7CiAJcHVibGljIGFic3RyYWN0IEZpbGVCYXNlZENvbmZpZyBvcGVuVXNlckNvbmZpZyhDb25maWcgcGFyZW50LCBGUyBmcyk7CiAKIAkvKioKLQkgKiBPcGVuIHRoZSBnaXRvbmZpZyBjb25maWd1cmF0aW9uIGZvdW5kIGluIHRoZSBzeXN0ZW0td2lkZSAiZXRjIiBkaXJlY3RvcnkKKwkgKiBPcGVuIHRoZSBnaXRjb25maWcgY29uZmlndXJhdGlvbiBmb3VuZCBpbiB0aGUgc3lzdGVtLXdpZGUgImV0YyIgZGlyZWN0b3J5CiAJICoKIAkgKiBAcGFyYW0gcGFyZW50CiAJICogICAgICAgICAgICBhIGNvbmZpZyB3aXRoIHZhbHVlcyBub3QgZm91bmQgZGlyZWN0bHkgaW4gdGhlIHJldHVybmVkCkBAIC0yNDUsNyArMjQ1LDcgQEAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2V0UGxhdGZvcm1DaGVja2VyKCkgewogCSAqIEBwYXJhbSBmcwogCSAqICAgICAgICAgICAgdGhlIGZpbGUgc3lzdGVtIGFic3RyYWN0aW9uIHdoaWNoIHdpbGwgYmUgbmVjZXNzYXJ5IHRvIHBlcmZvcm0KIAkgKiAgICAgICAgICAgIGNlcnRhaW4gZmlsZSBzeXN0ZW0gb3BlcmF0aW9ucy4KLQkgKiBAcmV0dXJuIHRoZSBnaXRvbmZpZyBjb25maWd1cmF0aW9uIGZvdW5kIGluIHRoZSBzeXN0ZW0td2lkZSAiZXRjIgorCSAqIEByZXR1cm4gdGhlIGdpdGNvbmZpZyBjb25maWd1cmF0aW9uIGZvdW5kIGluIHRoZSBzeXN0ZW0td2lkZSAiZXRjIgogCSAqICAgICAgICAgZGlyZWN0b3J5CiAJICovCiAJcHVibGljIGFic3RyYWN0IEZpbGVCYXNlZENvbmZpZyBvcGVuU3lzdGVtQ29uZmlnKENvbmZpZyBwYXJlbnQsIEZTIGZzKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9UZW1wb3JhcnlCdWZmZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9UZW1wb3JhcnlCdWZmZXIuamF2YQppbmRleCBkZDkzM2EwLi4zZWQ3YWViIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvVGVtcG9yYXJ5QnVmZmVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL1RlbXBvcmFyeUJ1ZmZlci5qYXZhCkBAIC05MSw3ICs5MSw3IEBAIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUZW1wb3JhcnlCdWZmZXIgZXh0ZW5kcyBPdXRwdXRTdHJlYW0gewogCSAqICAgICAgICAgICAgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gc3RvcmUgaW4gbWVtb3J5IGJlZm9yZSBlbnRlcmluZyB0aGUKIAkgKiAgICAgICAgICAgIG92ZXJmbG93IG91dHB1dCBwYXRoOyBhbHNvIHVzZWQgYXMgdGhlIGVzdGltYXRlZCBzaXplLgogCSAqLwotCXByb3RlY3RlZCBUZW1wb3JhcnlCdWZmZXIoZmluYWwgaW50IGxpbWl0KSB7CisJcHJvdGVjdGVkIFRlbXBvcmFyeUJ1ZmZlcihpbnQgbGltaXQpIHsKIAkJdGhpcyhsaW1pdCwgbGltaXQpOwogCX0KIApAQCAtMTA2LDcgKzEwNiw3IEBAIHByb3RlY3RlZCBUZW1wb3JhcnlCdWZmZXIoZmluYWwgaW50IGxpbWl0KSB7CiAJICogICAgICAgICAgICBvdmVyZmxvdyBvdXRwdXQgcGF0aC4KIAkgKiBAc2luY2UgNC4wCiAJICovCi0JcHJvdGVjdGVkIFRlbXBvcmFyeUJ1ZmZlcihmaW5hbCBpbnQgZXN0aW1hdGVkU2l6ZSwgZmluYWwgaW50IGxpbWl0KSB7CisJcHJvdGVjdGVkIFRlbXBvcmFyeUJ1ZmZlcihpbnQgZXN0aW1hdGVkU2l6ZSwgaW50IGxpbWl0KSB7CiAJCWlmIChlc3RpbWF0ZWRTaXplID4gbGltaXQpCiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CiAJCXRoaXMuaW5Db3JlTGltaXQgPSBsaW1pdDsKQEAgLTExNiw3ICsxMTYsNyBAQCBwcm90ZWN0ZWQgVGVtcG9yYXJ5QnVmZmVyKGZpbmFsIGludCBlc3RpbWF0ZWRTaXplLCBmaW5hbCBpbnQgbGltaXQpIHsKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgd3JpdGUoZmluYWwgaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIHZvaWQgd3JpdGUoaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWlmIChvdmVyZmxvdyAhPSBudWxsKSB7CiAJCQlvdmVyZmxvdy53cml0ZShiKTsKIAkJCXJldHVybjsKQEAgLTEzNyw3ICsxMzcsNyBAQCBwdWJsaWMgdm9pZCB3cml0ZShmaW5hbCBpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgd3JpdGUoZmluYWwgYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWlmIChvdmVyZmxvdyA9PSBudWxsKSB7CiAJCQl3aGlsZSAobGVuID4gMCkgewogCQkJCUJsb2NrIHMgPSBsYXN0KCk7CkBAIC0xODMsNyArMTgzLDcgQEAgcHJvdGVjdGVkIHZvaWQgZG9GbHVzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJICogICAgICAgICAgICAgYW4gZXJyb3Igb2NjdXJyZWQgcmVhZGluZyBmcm9tIHRoZSBpbnB1dCBzdHJlYW0sIG9yIHdoaWxlCiAJICogICAgICAgICAgICAgd3JpdGluZyB0byBhIGxvY2FsIHRlbXBvcmFyeSBmaWxlLgogCSAqLwotCXB1YmxpYyB2b2lkIGNvcHkoZmluYWwgSW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIHZvaWQgY29weShJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJaWYgKGJsb2NrcyAhPSBudWxsKSB7CiAJCQlmb3IgKDs7KSB7CiAJCQkJQmxvY2sgcyA9IGxhc3QoKTsKQEAgLTIzOCw3ICsyMzgsNyBAQCBwcml2YXRlIGxvbmcgaW5Db3JlTGVuZ3RoKCkgewogCQkJdGhyb3cgbmV3IE91dE9mTWVtb3J5RXJyb3IoSkdpdFRleHQuZ2V0KCkubGVuZ3RoRXhjZWVkc01heGltdW1BcnJheVNpemUpOwogCQlmaW5hbCBieXRlW10gb3V0ID0gbmV3IGJ5dGVbKGludCkgbGVuXTsKIAkJaW50IG91dFB0ciA9IDA7Ci0JCWZvciAoZmluYWwgQmxvY2sgYiA6IGJsb2NrcykgeworCQlmb3IgKEJsb2NrIGIgOiBibG9ja3MpIHsKIAkJCVN5c3RlbS5hcnJheWNvcHkoYi5idWZmZXIsIDAsIG91dCwgb3V0UHRyLCBiLmNvdW50KTsKIAkJCW91dFB0ciArPSBiLmNvdW50OwogCQl9CkBAIC0yNjUsNyArMjY1LDcgQEAgcHJpdmF0ZSBsb25nIGluQ29yZUxlbmd0aCgpIHsKIAkJCQkJSkdpdFRleHQuZ2V0KCkubGVuZ3RoRXhjZWVkc01heGltdW1BcnJheVNpemUpOwogCQlmaW5hbCBieXRlW10gb3V0ID0gbmV3IGJ5dGVbKGludCkgbGVuXTsKIAkJaW50IG91dFB0ciA9IDA7Ci0JCWZvciAoZmluYWwgQmxvY2sgYiA6IGJsb2NrcykgeworCQlmb3IgKEJsb2NrIGIgOiBibG9ja3MpIHsKIAkJCVN5c3RlbS5hcnJheWNvcHkoYi5idWZmZXIsIDAsIG91dCwgb3V0UHRyLCBiLmNvdW50KTsKIAkJCW91dFB0ciArPSBiLmNvdW50OwogCQl9CkBAIC0yODgsMTEgKzI4OCwxMSBAQCBwcml2YXRlIGxvbmcgaW5Db3JlTGVuZ3RoKCkgewogCSAqICAgICAgICAgICAgIGFuIGVycm9yIG9jY3VycmVkIHJlYWRpbmcgZnJvbSBhIHRlbXBvcmFyeSBmaWxlIG9uIHRoZSBsb2NhbAogCSAqICAgICAgICAgICAgIHN5c3RlbSwgb3Igd3JpdGluZyB0byB0aGUgb3V0cHV0IHN0cmVhbS4KIAkgKi8KLQlwdWJsaWMgdm9pZCB3cml0ZVRvKGZpbmFsIE91dHB1dFN0cmVhbSBvcywgUHJvZ3Jlc3NNb25pdG9yIHBtKQorCXB1YmxpYyB2b2lkIHdyaXRlVG8oT3V0cHV0U3RyZWFtIG9zLCBQcm9ncmVzc01vbml0b3IgcG0pCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlpZiAocG0gPT0gbnVsbCkKIAkJCXBtID0gTnVsbFByb2dyZXNzTW9uaXRvci5JTlNUQU5DRTsKLQkJZm9yIChmaW5hbCBCbG9jayBiIDogYmxvY2tzKSB7CisJCWZvciAoQmxvY2sgYiA6IGJsb2NrcykgewogCQkJb3Mud3JpdGUoYi5idWZmZXIsIDAsIGIuY291bnQpOwogCQkJcG0udXBkYXRlKGIuY291bnQgLyAxMDI0KTsKIAkJfQpAQCAtMzczLDcgKzM3Myw3IEBAIHByaXZhdGUgdm9pZCBzd2l0Y2hUb092ZXJmbG93KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJb3ZlcmZsb3cgPSBvdmVyZmxvdygpOwogCiAJCWZpbmFsIEJsb2NrIGxhc3QgPSBibG9ja3MucmVtb3ZlKGJsb2Nrcy5zaXplKCkgLSAxKTsKLQkJZm9yIChmaW5hbCBCbG9jayBiIDogYmxvY2tzKQorCQlmb3IgKEJsb2NrIGIgOiBibG9ja3MpCiAJCQlvdmVyZmxvdy53cml0ZShiLmJ1ZmZlciwgMCwgYi5jb3VudCk7CiAJCWJsb2NrcyA9IG51bGw7CiAKQEAgLTQ0Miw3ICs0NDIsNyBAQCBwdWJsaWMgc3RhdGljIGNsYXNzIExvY2FsRmlsZSBleHRlbmRzIFRlbXBvcmFyeUJ1ZmZlciB7CiAJCSAqICAgICAgICAgICAgc3lzdGVtIGRlZmF1bHQgdGVtcG9yYXJ5IGRpcmVjdG9yeSAoZm9yIGV4YW1wbGUgL3RtcCkgd2lsbAogCQkgKiAgICAgICAgICAgIGJlIHVzZWQgaW5zdGVhZC4KIAkJICovCi0JCXB1YmxpYyBMb2NhbEZpbGUoZmluYWwgRmlsZSBkaXJlY3RvcnkpIHsKKwkJcHVibGljIExvY2FsRmlsZShGaWxlIGRpcmVjdG9yeSkgewogCQkJdGhpcyhkaXJlY3RvcnksIERFRkFVTFRfSU5fQ09SRV9MSU1JVCk7CiAJCX0KIApAQCAtNDU4LDcgKzQ1OCw3IEBAIHB1YmxpYyBMb2NhbEZpbGUoZmluYWwgRmlsZSBkaXJlY3RvcnkpIHsKIAkJICogICAgICAgICAgICBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byBzdG9yZSBpbiBtZW1vcnkuIFN0b3JhZ2UgYmV5b25kCiAJCSAqICAgICAgICAgICAgdGhpcyBsaW1pdCB3aWxsIHVzZSB0aGUgbG9jYWwgZmlsZS4KIAkJICovCi0JCXB1YmxpYyBMb2NhbEZpbGUoZmluYWwgRmlsZSBkaXJlY3RvcnksIGZpbmFsIGludCBpbkNvcmVMaW1pdCkgeworCQlwdWJsaWMgTG9jYWxGaWxlKEZpbGUgZGlyZWN0b3J5LCBpbnQgaW5Db3JlTGltaXQpIHsKIAkJCXN1cGVyKGluQ29yZUxpbWl0KTsKIAkJCXRoaXMuZGlyZWN0b3J5ID0gZGlyZWN0b3J5OwogCQl9CkBAIC00ODcsMTcgKzQ4NywxNCBAQCBwdWJsaWMgbG9uZyBsZW5ndGgoKSB7CiAJCQlpZiAoSW50ZWdlci5NQVhfVkFMVUUgPCBsZW4pCiAJCQkJdGhyb3cgbmV3IE91dE9mTWVtb3J5RXJyb3IoSkdpdFRleHQuZ2V0KCkubGVuZ3RoRXhjZWVkc01heGltdW1BcnJheVNpemUpOwogCQkJZmluYWwgYnl0ZVtdIG91dCA9IG5ldyBieXRlWyhpbnQpIGxlbl07Ci0JCQlmaW5hbCBGaWxlSW5wdXRTdHJlYW0gaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKG9uRGlza0ZpbGUpOwotCQkJdHJ5IHsKKwkJCXRyeSAoRmlsZUlucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShvbkRpc2tGaWxlKSkgewogCQkJCUlPLnJlYWRGdWxseShpbiwgb3V0LCAwLCAoaW50KSBsZW4pOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpbi5jbG9zZSgpOwogCQkJfQogCQkJcmV0dXJuIG91dDsKIAkJfQogCiAJCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCB3cml0ZVRvKGZpbmFsIE91dHB1dFN0cmVhbSBvcywgUHJvZ3Jlc3NNb25pdG9yIHBtKQorCQlwdWJsaWMgdm9pZCB3cml0ZVRvKE91dHB1dFN0cmVhbSBvcywgUHJvZ3Jlc3NNb25pdG9yIHBtKQogCQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQlpZiAob25EaXNrRmlsZSA9PSBudWxsKSB7CiAJCQkJc3VwZXIud3JpdGVUbyhvcywgcG0pOwpAQCAtNTA1LDE2ICs1MDIsMTMgQEAgcHVibGljIHZvaWQgd3JpdGVUbyhmaW5hbCBPdXRwdXRTdHJlYW0gb3MsIFByb2dyZXNzTW9uaXRvciBwbSkKIAkJCX0KIAkJCWlmIChwbSA9PSBudWxsKQogCQkJCXBtID0gTnVsbFByb2dyZXNzTW9uaXRvci5JTlNUQU5DRTsKLQkJCWZpbmFsIEZpbGVJbnB1dFN0cmVhbSBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ob25EaXNrRmlsZSk7Ci0JCQl0cnkgeworCQkJdHJ5IChGaWxlSW5wdXRTdHJlYW0gaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKG9uRGlza0ZpbGUpKSB7CiAJCQkJaW50IGNudDsKIAkJCQlmaW5hbCBieXRlW10gYnVmID0gbmV3IGJ5dGVbQmxvY2suU1pdOwogCQkJCXdoaWxlICgoY250ID0gaW4ucmVhZChidWYpKSA+PSAwKSB7CiAJCQkJCW9zLndyaXRlKGJ1ZiwgMCwgY250KTsKIAkJCQkJcG0udXBkYXRlKGNudCAvIDEwMjQpOwogCQkJCX0KLQkJCX0gZmluYWxseSB7Ci0JCQkJaW4uY2xvc2UoKTsKIAkJCX0KIAkJfQogCkBAIC01NjksNyArNTYzLDcgQEAgcHVibGljIHN0YXRpYyBjbGFzcyBIZWFwIGV4dGVuZHMgVGVtcG9yYXJ5QnVmZmVyIHsKIAkJICogICAgICAgICAgICBhbHNvIHVzZWQgYXMgdGhlIGVzdGltYXRlZCBzaXplLiBTdG9yaW5nIGJleW9uZCB0aGlzIG1hbnkKIAkJICogICAgICAgICAgICB3aWxsIGNhdXNlIGFuIElPRXhjZXB0aW9uIHRvIGJlIHRocm93biBkdXJpbmcgd3JpdGUuCiAJCSAqLwotCQlwdWJsaWMgSGVhcChmaW5hbCBpbnQgbGltaXQpIHsKKwkJcHVibGljIEhlYXAoaW50IGxpbWl0KSB7CiAJCQlzdXBlcihsaW1pdCk7CiAJCX0KIApAQCAtNTg1LDcgKzU3OSw3IEBAIHB1YmxpYyBIZWFwKGZpbmFsIGludCBsaW1pdCkgewogCQkgKiAgICAgICAgICAgIHRocm93biBkdXJpbmcgd3JpdGUuCiAJCSAqIEBzaW5jZSA0LjAKIAkJICovCi0JCXB1YmxpYyBIZWFwKGZpbmFsIGludCBlc3RpbWF0ZWRTaXplLCBmaW5hbCBpbnQgbGltaXQpIHsKKwkJcHVibGljIEhlYXAoaW50IGVzdGltYXRlZFNpemUsIGludCBsaW1pdCkgewogCQkJc3VwZXIoZXN0aW1hdGVkU2l6ZSwgbGltaXQpOwogCQl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9BdXRvQ1JMRklucHV0U3RyZWFtLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vQXV0b0NSTEZJbnB1dFN0cmVhbS5qYXZhCmluZGV4IDQ1NjY4MjUuLjA4Mzc3ZTYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9BdXRvQ1JMRklucHV0U3RyZWFtLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL0F1dG9DUkxGSW5wdXRTdHJlYW0uamF2YQpAQCAtMTAwLDcgKzEwMCw3IEBAIHB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgcmVhZChieXRlW10gYnMsIGZpbmFsIGludCBvZmYsIGZpbmFsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIGludCByZWFkKGJ5dGVbXSBicywgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJaWYgKGxlbiA9PSAwKQogCQkJcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9BdXRvQ1JMRk91dHB1dFN0cmVhbS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL0F1dG9DUkxGT3V0cHV0U3RyZWFtLmphdmEKaW5kZXggZTc2NDM4OS4uZDhjZmVlNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL0F1dG9DUkxGT3V0cHV0U3RyZWFtLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL0F1dG9DUkxGT3V0cHV0U3RyZWFtLmphdmEKQEAgLTExMyw3ICsxMTMsNyBAQCBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGIsIGZpbmFsIGludCBzdGFydE9mZiwgZmluYWwgaW50IHN0YXJ0TGVuKQorCXB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBiLCBpbnQgc3RhcnRPZmYsIGludCBzdGFydExlbikKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIGludCBvdmVyZmxvdyA9IGJ1ZmZlcihiLCBzdGFydE9mZiwgc3RhcnRMZW4pOwogCQlpZiAob3ZlcmZsb3cgPCAwKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL0F1dG9MRklucHV0U3RyZWFtLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vQXV0b0xGSW5wdXRTdHJlYW0uamF2YQppbmRleCAwNmY4M2YzLi5mZjI4MTYxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vQXV0b0xGSW5wdXRTdHJlYW0uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vQXV0b0xGSW5wdXRTdHJlYW0uamF2YQpAQCAtMTM0LDcgKzEzNCw3IEBAIHB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgcmVhZChieXRlW10gYnMsIGZpbmFsIGludCBvZmYsIGZpbmFsIGludCBsZW4pCisJcHVibGljIGludCByZWFkKGJ5dGVbXSBicywgaW50IG9mZiwgaW50IGxlbikKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWlmIChsZW4gPT0gMCkKIAkJCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL0F1dG9MRk91dHB1dFN0cmVhbS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL0F1dG9MRk91dHB1dFN0cmVhbS5qYXZhCmluZGV4IDMyMjI2YzQuLjkwOGQwYTAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9BdXRvTEZPdXRwdXRTdHJlYW0uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vQXV0b0xGT3V0cHV0U3RyZWFtLmphdmEKQEAgLTEyMCw3ICsxMjAsNyBAQCBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGIsIGZpbmFsIGludCBzdGFydE9mZiwgZmluYWwgaW50IHN0YXJ0TGVuKQorCXB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBiLCBpbnQgc3RhcnRPZmYsIGludCBzdGFydExlbikKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIGludCBvdmVyZmxvdyA9IGJ1ZmZlcihiLCBzdGFydE9mZiwgc3RhcnRMZW4pOwogCQlpZiAob3ZlcmZsb3cgPCAwKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vRW9sQ2Fub25pY2FsaXppbmdJbnB1dFN0cmVhbS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL0VvbENhbm9uaWNhbGl6aW5nSW5wdXRTdHJlYW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ5YTk1My4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vRW9sQ2Fub25pY2FsaXppbmdJbnB1dFN0cmVhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAsIDIwMTMgTWFyYyBTdHJhcGV0eiA8bWFyYy5zdHJhcGV0ekBzeW50ZXZvLmNvbT4KLSAqIGFuZCBvdGhlciBjb3B5cmlnaHQgb3duZXJzIGFzIGRvY3VtZW50ZWQgaW4gdGhlIHByb2plY3QncyBJUCBsb2cuCi0gKgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2MS4wIHdoaWNoCi0gKiBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgaXMgcmVwcm9kdWNlZCBiZWxvdywgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwCi0gKgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCi0gKiB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKLSAqIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSAqCi0gKiAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAqICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCi0gKiAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAtIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgSW5jLiBub3IgdGhlCi0gKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gKiAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKLSAqICAgd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORAotICogQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKLSAqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUgotICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgotICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGCi0gKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5pbzsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotLyoqCi0gKiBBbiBpbnB1dCBzdHJlYW0gd2hpY2ggY2Fub25pY2FsaXplcyBFT0xzIGJ5dGVzIG9uIHRoZSBmbHkgdG8gJ1xuJy4KLSAqCi0gKiBPcHRpb25hbGx5LCBhIGJpbmFyeSBjaGVjayBvbiB0aGUgZmlyc3QgODAwMCBieXRlcyBpcyBwZXJmb3JtZWQgYW5kIGluIGNhc2UKLSAqIG9mIGJpbmFyeSBmaWxlcywgY2Fub25pY2FsaXphdGlvbiBpcyB0dXJuZWQgb2ZmIChmb3IgdGhlIGNvbXBsZXRlIGZpbGUpLgotICoKLSAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvLkF1dG9MRklucHV0U3RyZWFtfSBpbnN0ZWFkCi0gKi8KLUBEZXByZWNhdGVkCi1wdWJsaWMgY2xhc3MgRW9sQ2Fub25pY2FsaXppbmdJbnB1dFN0cmVhbSBleHRlbmRzIEF1dG9MRklucHV0U3RyZWFtIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgSW5wdXRTdHJlYW0sIHdyYXBwaW5nIHRoZSBzcGVjaWZpZWQgc3RyZWFtCi0JICoKLQkgKiBAcGFyYW0gaW4KLQkgKiAgICAgICAgICAgIHJhdyBpbnB1dCBzdHJlYW0KLQkgKiBAcGFyYW0gZGV0ZWN0QmluYXJ5Ci0JICogICAgICAgICAgICB3aGV0aGVyIGJpbmFyaWVzIHNob3VsZCBiZSBkZXRlY3RlZAotCSAqLwotCXB1YmxpYyBFb2xDYW5vbmljYWxpemluZ0lucHV0U3RyZWFtKElucHV0U3RyZWFtIGluLCBib29sZWFuIGRldGVjdEJpbmFyeSkgewotCQlzdXBlcihpbiwgZGV0ZWN0QmluYXJ5KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IElucHV0U3RyZWFtLCB3cmFwcGluZyB0aGUgc3BlY2lmaWVkIHN0cmVhbQotCSAqCi0JICogQHBhcmFtIGluCi0JICogICAgICAgICAgICByYXcgaW5wdXQgc3RyZWFtCi0JICogQHBhcmFtIGRldGVjdEJpbmFyeQotCSAqICAgICAgICAgICAgd2hldGhlciBiaW5hcmllcyBzaG91bGQgYmUgZGV0ZWN0ZWQKLQkgKiBAcGFyYW0gYWJvcnRJZkJpbmFyeQotCSAqICAgICAgICAgICAgdGhyb3cgYW4gSU9FeGNlcHRpb24gaWYgdGhlIGZpbGUgaXMgYmluYXJ5Ci0JICovCi0JcHVibGljIEVvbENhbm9uaWNhbGl6aW5nSW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW4sIGJvb2xlYW4gZGV0ZWN0QmluYXJ5LAotCQkJYm9vbGVhbiBhYm9ydElmQmluYXJ5KSB7Ci0JCXN1cGVyKGluLCBkZXRlY3RCaW5hcnksIGFib3J0SWZCaW5hcnkpOwotCX0KLQotCS8qKgotCSAqIEEgc3BlY2lhbCBleGNlcHRpb24gdGhyb3duIHdoZW4ge0BsaW5rIEF1dG9MRklucHV0U3RyZWFtfSBpcyB0b2xkIHRvCi0JICogdGhyb3cgYW4gZXhjZXB0aW9uIHdoZW4gYXR0ZW1wdGluZyB0byByZWFkIGEgYmluYXJ5IGZpbGUuIFRoZSBleGNlcHRpb24KLQkgKiBtYXkgYmUgdGhyb3duIGF0IGFueSBzdGFnZSBkdXJpbmcgcmVhZGluZy4KLQkgKgotCSAqIEBzaW5jZSAzLjMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIElzQmluYXJ5RXhjZXB0aW9uIGV4dGVuZHMgSU9FeGNlcHRpb24gewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQlJc0JpbmFyeUV4Y2VwdGlvbigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9JbnRlcnJ1cHRUaW1lci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL0ludGVycnVwdFRpbWVyLmphdmEKaW5kZXggZjQwMGU1MC4uYjdmZWRkZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL0ludGVycnVwdFRpbWVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL0ludGVycnVwdFRpbWVyLmphdmEKQEAgLTEwMyw3ICsxMDMsNyBAQCBwdWJsaWMgSW50ZXJydXB0VGltZXIoKSB7CiAJICogQHBhcmFtIHRocmVhZE5hbWUKIAkgKiAgICAgICAgICAgIG5hbWUgb2YgdGhlIHRpbWVyIHRocmVhZC4KIAkgKi8KLQlwdWJsaWMgSW50ZXJydXB0VGltZXIoZmluYWwgU3RyaW5nIHRocmVhZE5hbWUpIHsKKwlwdWJsaWMgSW50ZXJydXB0VGltZXIoU3RyaW5nIHRocmVhZE5hbWUpIHsKIAkJc3RhdGUgPSBuZXcgQWxhcm1TdGF0ZSgpOwogCQlhdXRvS2lsbGVyID0gbmV3IEF1dG9LaWxsZXIoc3RhdGUpOwogCQl0aHJlYWQgPSBuZXcgQWxhcm1UaHJlYWQodGhyZWFkTmFtZSwgc3RhdGUpOwpAQCAtMTE3LDcgKzExNyw3IEBAIHB1YmxpYyBJbnRlcnJ1cHRUaW1lcihmaW5hbCBTdHJpbmcgdGhyZWFkTmFtZSkgewogCSAqICAgICAgICAgICAgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBiZWZvcmUgdGhlIGludGVycnVwdCBzaG91bGQgdHJpZ2dlci4KIAkgKiAgICAgICAgICAgIE11c3QgYmUgJmd0OyAwLgogCSAqLwotCXB1YmxpYyB2b2lkIGJlZ2luKGZpbmFsIGludCB0aW1lb3V0KSB7CisJcHVibGljIHZvaWQgYmVnaW4oaW50IHRpbWVvdXQpIHsKIAkJaWYgKHRpbWVvdXQgPD0gMCkKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCiAJCQkJCUpHaXRUZXh0LmdldCgpLmludmFsaWRUaW1lb3V0LCBJbnRlZ2VyLnZhbHVlT2YodGltZW91dCkpKTsKQEAgLTE0NSw3ICsxNDUsNyBAQCBwdWJsaWMgdm9pZCB0ZXJtaW5hdGUoKSB7CiAJfQogCiAJc3RhdGljIGZpbmFsIGNsYXNzIEFsYXJtVGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKLQkJQWxhcm1UaHJlYWQoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIEFsYXJtU3RhdGUgcSkgeworCQlBbGFybVRocmVhZChTdHJpbmcgbmFtZSwgQWxhcm1TdGF0ZSBxKSB7CiAJCQlzdXBlcihxKTsKIAkJCXNldE5hbWUobmFtZSk7CiAJCQlzZXREYWVtb24odHJ1ZSk7CkBAIC0xNjEsNyArMTYxLDcgQEAgc3RhdGljIGZpbmFsIGNsYXNzIEFsYXJtVGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBBdXRvS2lsbGVyIHsKIAkJcHJpdmF0ZSBmaW5hbCBBbGFybVN0YXRlIHN0YXRlOwogCi0JCUF1dG9LaWxsZXIoZmluYWwgQWxhcm1TdGF0ZSBzKSB7CisJCUF1dG9LaWxsZXIoQWxhcm1TdGF0ZSBzKSB7CiAJCQlzdGF0ZSA9IHM7CiAJCX0KIApAQCAtMjAzLDcgKzIwMyw3IEBAIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBydW4oKSB7CiAJCQl9CiAJCX0KIAotCQlzeW5jaHJvbml6ZWQgdm9pZCBiZWdpbihmaW5hbCBpbnQgdGltZW91dCkgeworCQlzeW5jaHJvbml6ZWQgdm9pZCBiZWdpbihpbnQgdGltZW91dCkgewogCQkJaWYgKHRlcm1pbmF0ZWQpCiAJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihKR2l0VGV4dC5nZXQoKS50aW1lckFscmVhZHlUZXJtaW5hdGVkKTsKIAkJCWNhbGxpbmdUaHJlYWQgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL0lzb2xhdGVkT3V0cHV0U3RyZWFtLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vSXNvbGF0ZWRPdXRwdXRTdHJlYW0uamF2YQppbmRleCA1ZTUwOTk1Li42NTQ3MGQ0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vSXNvbGF0ZWRPdXRwdXRTdHJlYW0uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vSXNvbGF0ZWRPdXRwdXRTdHJlYW0uamF2YQpAQCAtOTksNyArOTksNyBAQCBwdWJsaWMgdm9pZCB3cml0ZShpbnQgY2gpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHdyaXRlKGZpbmFsIGJ5dGVbXSBidWYsIGZpbmFsIGludCBwb3MsIGZpbmFsIGludCBjbnQpCisJcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGJ1ZiwgaW50IHBvcywgaW50IGNudCkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWNoZWNrQ2xvc2VkKCk7CiAJCWV4ZWN1dGUobmV3IENhbGxhYmxlPFZvaWQ+KCkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL1NhZmVCdWZmZXJlZE91dHB1dFN0cmVhbS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL1NpbGVudEZpbGVJbnB1dFN0cmVhbS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggNjklCnJlbmFtZSBmcm9tIG9yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9TYWZlQnVmZmVyZWRPdXRwdXRTdHJlYW0uamF2YQpyZW5hbWUgdG8gb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL1NpbGVudEZpbGVJbnB1dFN0cmVhbS5qYXZhCmluZGV4IDY4YjQxN2UuLmU1ODgwM2IgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9TYWZlQnVmZmVyZWRPdXRwdXRTdHJlYW0uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vU2lsZW50RmlsZUlucHV0U3RyZWFtLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDExLCBSb2JpbiBSb3NlbmJlcmcKKyAqIENvcHlyaWdodCAoQykgMjAxOCwgRGF2aWQgUHVyc2Vob3VzZSA8ZGF2aWQucHVyc2Vob3VzZUBnbWFpbC5jb20+CiAgKiBhbmQgb3RoZXIgY29weXJpZ2h0IG93bmVycyBhcyBkb2N1bWVudGVkIGluIHRoZSBwcm9qZWN0J3MgSVAgbG9nLgogICoKICAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlCkBAIC00MCwzOSArNDAsMzYgQEAKICAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGCiAgKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KICAqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5pbzsKIAotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiAKIC8qKgotICogPHA+U2FmZUJ1ZmZlcmVkT3V0cHV0U3RyZWFtIGNsYXNzLjwvcD4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIEZpbGVJbnB1dFN0cmVhbSB0aGF0IGlnbm9yZXMgYW55IGV4Y2VwdGlvbnMgb24gY2xvc2UoKS4KICAqCi0gKiBAZGVwcmVjYXRlZCB1c2UgQnVmZmVyZWRPdXRwdXRTdHJlYW0gaW4gSmF2YSA4IGFuZCBsYXRlci4KKyAqIEBzaW5jZSA1LjAKICAqLwotQERlcHJlY2F0ZWQKLXB1YmxpYyBjbGFzcyBTYWZlQnVmZmVyZWRPdXRwdXRTdHJlYW0gZXh0ZW5kcyBCdWZmZXJlZE91dHB1dFN0cmVhbSB7CitwdWJsaWMgY2xhc3MgU2lsZW50RmlsZUlucHV0U3RyZWFtIGV4dGVuZHMgRmlsZUlucHV0U3RyZWFtIHsKIAkvKioKLQkgKiA8cD5Db25zdHJ1Y3RvciBmb3IgU2FmZUJ1ZmZlcmVkT3V0cHV0U3RyZWFtLjwvcD4KLQkgKgotCSAqIEBzZWUgQnVmZmVyZWRPdXRwdXRTdHJlYW0jQnVmZmVyZWRPdXRwdXRTdHJlYW0oT3V0cHV0U3RyZWFtKQotCSAqIEBwYXJhbSBvdXQKLQkgKiAgICAgICAgICAgIHVuZGVybHlpbmcgb3V0cHV0IHN0cmVhbQorCSAqIEBwYXJhbSBmaWxlCisJICogICAgICAgICAgICB0aGUgZmlsZQorCSAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uCisJICogICAgICAgICAgICAgdGhlIGZpbGUgd2FzIG5vdCBmb3VuZAogCSAqLwotCXB1YmxpYyBTYWZlQnVmZmVyZWRPdXRwdXRTdHJlYW0oT3V0cHV0U3RyZWFtIG91dCkgewotCQlzdXBlcihvdXQpOworCXB1YmxpYyBTaWxlbnRGaWxlSW5wdXRTdHJlYW0oRmlsZSBmaWxlKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKwkJc3VwZXIoZmlsZSk7CiAJfQogCi0JLyoqCi0JICogPHA+Q29uc3RydWN0b3IgZm9yIFNhZmVCdWZmZXJlZE91dHB1dFN0cmVhbS48L3A+Ci0JICoKLQkgKiBAc2VlIEJ1ZmZlcmVkT3V0cHV0U3RyZWFtI0J1ZmZlcmVkT3V0cHV0U3RyZWFtKE91dHB1dFN0cmVhbSwgaW50KQotCSAqIEBwYXJhbSBvdXQKLQkgKiAgICAgICAgICAgIHVuZGVybHlpbmcgb3V0cHV0IHN0cmVhbQotCSAqIEBwYXJhbSBzaXplCi0JICogICAgICAgICAgICBidWZmZXIgc2l6ZQotCSAqLwotCXB1YmxpYyBTYWZlQnVmZmVyZWRPdXRwdXRTdHJlYW0oT3V0cHV0U3RyZWFtIG91dCwgaW50IHNpemUpIHsKLQkJc3VwZXIob3V0LCBzaXplKTsKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKwkJdHJ5IHsKKwkJCXN1cGVyLmNsb3NlKCk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCS8vIElnbm9yZQorCQl9CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL1N0cmVhbUNvcHlUaHJlYWQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9TdHJlYW1Db3B5VGhyZWFkLmphdmEKaW5kZXggNWMxYWY5ZWYuLmE5OTg5YTEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9TdHJlYW1Db3B5VGhyZWFkLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL1N0cmVhbUNvcHlUaHJlYWQuamF2YQpAQCAtNzMsNyArNzMsNyBAQCBwdWJsaWMgY2xhc3MgU3RyZWFtQ29weVRocmVhZCBleHRlbmRzIFRocmVhZCB7CiAJICogICAgICAgICAgICBzdHJlYW0gdG8gY29weSBpbnRvLiBUaGUgZGVzdGluYXRpb24gc3RyZWFtIGlzIGF1dG9tYXRpY2FsbHkKIAkgKiAgICAgICAgICAgIGNsb3NlZCB3aGVuIHRoZSB0aHJlYWQgdGVybWluYXRlcy4KIAkgKi8KLQlwdWJsaWMgU3RyZWFtQ29weVRocmVhZChmaW5hbCBJbnB1dFN0cmVhbSBpLCBmaW5hbCBPdXRwdXRTdHJlYW0gbykgeworCXB1YmxpYyBTdHJlYW1Db3B5VGhyZWFkKElucHV0U3RyZWFtIGksIE91dHB1dFN0cmVhbSBvKSB7CiAJCXNldE5hbWUoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkgKyAiLVN0cmVhbUNvcHkiKTsgLy8kTk9OLU5MUy0xJAogCQlzcmMgPSBpOwogCQlkc3QgPSBvOwpAQCAtODEsMjAgKzgxLDYgQEAgcHVibGljIFN0cmVhbUNvcHlUaHJlYWQoZmluYWwgSW5wdXRTdHJlYW0gaSwgZmluYWwgT3V0cHV0U3RyZWFtIG8pIHsKIAl9CiAKIAkvKioKLQkgKiBSZXF1ZXN0IHRoZSB0aHJlYWQgdG8gZmx1c2ggdGhlIG91dHB1dCBzdHJlYW0gYXMgc29vbiBhcyBwb3NzaWJsZS4KLQkgKiA8cD4KLQkgKiBUaGlzIGlzIGFuIGFzeW5jaHJvbm91cyByZXF1ZXN0IHRvIHRoZSB0aHJlYWQuIFRoZSBhY3R1YWwgZmx1c2ggd2lsbAotCSAqIGhhcHBlbiBhdCBzb21lIGZ1dHVyZSBwb2ludCBpbiB0aW1lLCB3aGVuIHRoZSB0aHJlYWQgd2FrZXMgdXAgdG8gcHJvY2VzcwotCSAqIHRoZSByZXF1ZXN0LgotCSAqLwotCUBEZXByZWNhdGVkCi0JcHVibGljIHZvaWQgZmx1c2goKSB7Ci0JCXN5bmNocm9uaXplZCAod3JpdGVMb2NrKSB7Ci0JCQlpbnRlcnJ1cHQoKTsKLQkJfQotCX0KLQotCS8qKgogCSAqIFJlcXVlc3QgdGhhdCB0aGUgdGhyZWFkIHRlcm1pbmF0ZSwgYW5kIHdhaXQgZm9yIGl0LgogCSAqIDxwPgogCSAqIFRoaXMgbWV0aG9kIHNpZ25hbHMgdG8gdGhlIGNvcHkgdGhyZWFkIHRoYXQgaXQgc2hvdWxkIHN0b3AgYXMgc29vbiBhcwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL1RlZUlucHV0U3RyZWFtLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vVGVlSW5wdXRTdHJlYW0uamF2YQppbmRleCBkZWU0ZmU5Li5lNDBhNWE0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vVGVlSW5wdXRTdHJlYW0uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vVGVlSW5wdXRTdHJlYW0uamF2YQpAQCAtODksNyArODksNyBAQCBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgbG9uZyBza2lwKGZpbmFsIGxvbmcgY291bnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIGxvbmcgc2tpcChsb25nIGNvdW50KSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlsb25nIHNraXBwZWQgPSAwOwogCQlsb25nIGNudCA9IGNvdW50OwogCQlmaW5hbCBieXRlW10gYiA9IHNraXBCdWZmZXIoKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9UaW1lb3V0SW5wdXRTdHJlYW0uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9UaW1lb3V0SW5wdXRTdHJlYW0uamF2YQppbmRleCAwMWIyNTE5Li4yMzkyYjhhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vVGltZW91dElucHV0U3RyZWFtLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL1RpbWVvdXRJbnB1dFN0cmVhbS5qYXZhCkBAIC04OSw3ICs4OSw3IEBAIHB1YmxpYyBpbnQgZ2V0VGltZW91dCgpIHsKIAkgKiBAcGFyYW0gbWlsbGlzCiAJICogICAgICAgICAgICBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGJlZm9yZSBhYm9ydGluZyBhIHJlYWQuIE11c3QgYmUgJmd0OyAwLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldFRpbWVvdXQoZmluYWwgaW50IG1pbGxpcykgeworCXB1YmxpYyB2b2lkIHNldFRpbWVvdXQoaW50IG1pbGxpcykgewogCQlpZiAobWlsbGlzIDwgMCkKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCiAJCQkJCUpHaXRUZXh0LmdldCgpLmludmFsaWRUaW1lb3V0LCBJbnRlZ2VyLnZhbHVlT2YobWlsbGlzKSkpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL1RpbWVvdXRPdXRwdXRTdHJlYW0uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9UaW1lb3V0T3V0cHV0U3RyZWFtLmphdmEKaW5kZXggZWE0MDEzMy4uMjdmMTg3NCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL1RpbWVvdXRPdXRwdXRTdHJlYW0uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vVGltZW91dE91dHB1dFN0cmVhbS5qYXZhCkBAIC05MSw3ICs5MSw3IEBAIHB1YmxpYyBpbnQgZ2V0VGltZW91dCgpIHsKIAkgKiAgICAgICAgICAgIG51bWJlciBvZiBtaWxsaXNlY29uZHMgYmVmb3JlIGFib3J0aW5nIGEgd3JpdGUuIE11c3QgYmUgJmd0OwogCSAqICAgICAgICAgICAgMC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUaW1lb3V0KGZpbmFsIGludCBtaWxsaXMpIHsKKwlwdWJsaWMgdm9pZCBzZXRUaW1lb3V0KGludCBtaWxsaXMpIHsKIAkJaWYgKG1pbGxpcyA8IDApCiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAogCQkJCQlKR2l0VGV4dC5nZXQoKS5pbnZhbGlkVGltZW91dCwgSW50ZWdlci52YWx1ZU9mKG1pbGxpcykpKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9VbmlvbklucHV0U3RyZWFtLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vVW5pb25JbnB1dFN0cmVhbS5qYXZhCmluZGV4IDUxZDMxMDYuLmUxNGViMmIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9VbmlvbklucHV0U3RyZWFtLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL1VuaW9uSW5wdXRTdHJlYW0uamF2YQpAQCAtMTA3LDcgKzEwNyw3IEBAIHByaXZhdGUgdm9pZCBwb3AoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCSAqIEBwYXJhbSBpbgogCSAqICAgICAgICAgICAgdGhlIHN0cmVhbSB0byBhZGQ7IG11c3Qgbm90IGJlIG51bGwuCiAJICovCi0JcHVibGljIHZvaWQgYWRkKGZpbmFsIElucHV0U3RyZWFtIGluKSB7CisJcHVibGljIHZvaWQgYWRkKElucHV0U3RyZWFtIGluKSB7CiAJCXN0cmVhbXMuYWRkKGluKTsKIAl9CiAKQEAgLTE2NCw3ICsxNjQsNyBAQCBwdWJsaWMgaW50IGF2YWlsYWJsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBsb25nIHNraXAoZmluYWwgbG9uZyBjb3VudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgbG9uZyBza2lwKGxvbmcgY291bnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWxvbmcgc2tpcHBlZCA9IDA7CiAJCWxvbmcgY250ID0gY291bnQ7CiAJCXdoaWxlICgwIDwgY250KSB7CmRpZmYgLS1naXQgYS9wb20ueG1sIGIvcG9tLnhtbAppbmRleCAxNjJiNmQ4Li4zMzQ3ODQ3IDEwMDY0NAotLS0gYS9wb20ueG1sCisrKyBiL3BvbS54bWwKQEAgLTUxLDcgKzUxLDcgQEAKICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+CiAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0gIDx2ZXJzaW9uPjQuMTEuOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgPHZlcnNpb24+NS4wLjQtU05BUFNIT1Q8L3ZlcnNpb24+CiAKICAgPG5hbWU+SkdpdCAtIFBhcmVudDwvbmFtZT4KICAgPHVybD4ke2pnaXQtdXJsfTwvdXJsPgpAQCAtMjEzLDcgKzIxMyw3IEBACiAgICAgPGh0dHBjb3JlLXZlcnNpb24+NC40LjY8L2h0dHBjb3JlLXZlcnNpb24+CiAgICAgPHNsZjRqLXZlcnNpb24+MS43LjI8L3NsZjRqLXZlcnNpb24+CiAgICAgPGxvZzRqLXZlcnNpb24+MS4yLjE1PC9sb2c0ai12ZXJzaW9uPgotICAgIDxtYXZlbi1qYXZhZG9jLXBsdWdpbi12ZXJzaW9uPjMuMC4wPC9tYXZlbi1qYXZhZG9jLXBsdWdpbi12ZXJzaW9uPgorICAgIDxtYXZlbi1qYXZhZG9jLXBsdWdpbi12ZXJzaW9uPjMuMC4xPC9tYXZlbi1qYXZhZG9jLXBsdWdpbi12ZXJzaW9uPgogICAgIDx0eWNoby1leHRyYXMtdmVyc2lvbj4xLjEuMDwvdHljaG8tZXh0cmFzLXZlcnNpb24+CiAgICAgPGdzb24tdmVyc2lvbj4yLjguMjwvZ3Nvbi12ZXJzaW9uPgogICAgIDxzcG90YnVncy1tYXZlbi1wbHVnaW4tdmVyc2lvbj4zLjEuMjwvc3BvdGJ1Z3MtbWF2ZW4tcGx1Z2luLXZlcnNpb24+CkBAIC0yNjcsNjMgKzI2Nyw2IEBACiAgICAgICAgIDwvcGx1Z2luPgogCiAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgIDx2ZXJzaW9uPjMuNy4wPC92ZXJzaW9uPgotICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPGVuY29kaW5nPlVURi04PC9lbmNvZGluZz4KLSAgICAgICAgICAgIDxzb3VyY2U+MS44PC9zb3VyY2U+Ci0gICAgICAgICAgICA8dGFyZ2V0PjEuODwvdGFyZ2V0PgotICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgIDxpZD5kZWZhdWx0LWNvbXBpbGU8L2lkPgotICAgICAgICAgICAgICA8cGhhc2U+Y29tcGlsZTwvcGhhc2U+Ci0gICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICA8Z29hbD5jb21waWxlPC9nb2FsPgotICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICA8aW5jbHVkZT5vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9JbnNlY3VyZUNpcGhlckZhY3RvcnkuamF2YTwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgIDxpZD5jb21waWxlLXdpdGgtZXJyb3Jwcm9uZTwvaWQ+Ci0gICAgICAgICAgICAgIDxwaGFzZT5jb21waWxlPC9waGFzZT4KLSAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgIDxnb2FsPmNvbXBpbGU8L2dvYWw+Ci0gICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgIDxjb21waWxlcklkPmphdmFjLXdpdGgtZXJyb3Jwcm9uZTwvY29tcGlsZXJJZD4KLSAgICAgICAgICAgICAgICA8Zm9yY2VKYXZhY0NvbXBpbGVyVXNlPnRydWU8L2ZvcmNlSmF2YWNDb21waWxlclVzZT4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICA8ZXhjbHVkZT5vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9JbnNlY3VyZUNpcGhlckZhY3RvcnkuamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgotICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMucGxleHVzPC9ncm91cElkPgotICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5wbGV4dXMtY29tcGlsZXItamF2YWM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgIDx2ZXJzaW9uPjIuOC4yPC92ZXJzaW9uPgotICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5wbGV4dXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgIDxhcnRpZmFjdElkPnBsZXh1cy1jb21waWxlci1qYXZhYy1lcnJvcnByb25lPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICA8dmVyc2lvbj4yLjguMjwvdmVyc2lvbj4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDwhLS0gb3ZlcnJpZGUgcGxleHVzLWNvbXBpbGVyLWphdmFjLWVycm9ycHJvbmUncyBkZXBlbmRlbmN5IG9uCi0gICAgICAgICAgICAgICAgIEVycm9yIFByb25lIHdpdGggdGhlIGxhdGVzdCB2ZXJzaW9uIC0tPgotICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgIDxncm91cElkPmNvbS5nb29nbGUuZXJyb3Jwcm9uZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZXJyb3JfcHJvbmVfY29yZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgPHZlcnNpb24+Mi4yLjA8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgPC9kZXBlbmRlbmNpZXM+Ci0gICAgICAgIDwvcGx1Z2luPgotCi0gICAgICAgIDxwbHVnaW4+CiAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY2xlYW4tcGx1Z2luPC9hcnRpZmFjdElkPgogICAgICAgICAgIDx2ZXJzaW9uPjMuMC4wPC92ZXJzaW9uPgogICAgICAgICA8L3BsdWdpbj4KQEAgLTM0Myw3ICsyODYsNyBAQAogICAgICAgICA8cGx1Z2luPgogICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1kZXBlbmRlbmN5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICA8dmVyc2lvbj4zLjAuMjwvdmVyc2lvbj4KKyAgICAgICAgICA8dmVyc2lvbj4zLjEuMTwvdmVyc2lvbj4KICAgICAgICAgPC9wbHVnaW4+CiAKICAgICAgICAgPHBsdWdpbj4KQEAgLTU0MSw3ICs0ODQsNiBAQAogICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CiAgICAgICAgIDxleGVjdXRpb25zPgogICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICA8aWQ+YXR0YWNoLWphdmFkb2NzPC9pZD4KICAgICAgICAgICAgIDxnb2Fscz4KICAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPgogICAgICAgICAgICAgPC9nb2Fscz4KQEAgLTU5Niw2ICs1MzgsMjMgQEAKICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgogICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXZhZG9jLXBsdWdpbjwvYXJ0aWZhY3RJZD4KICAgICAgICAgPHZlcnNpb24+JHttYXZlbi1qYXZhZG9jLXBsdWdpbi12ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPHJlcG9ydFNldHM+CisgICAgICAgICAgPHJlcG9ydFNldD4KKyAgICAgICAgICAgIDxyZXBvcnRzPgorICAgICAgICAgICAgICA8cmVwb3J0PmphdmFkb2M8L3JlcG9ydD4KKyAgICAgICAgICAgIDwvcmVwb3J0cz4KKyAgICAgICAgICA8L3JlcG9ydFNldD4KKyAgICAgICAgICA8cmVwb3J0U2V0PgorICAgICAgICAgICAgPGlkPmFnZ3JlZ2F0ZTwvaWQ+CisgICAgICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+CisgICAgICAgICAgICA8cmVwb3J0cz4KKyAgICAgICAgICAgICAgPHJlcG9ydD5hZ2dyZWdhdGU8L3JlcG9ydD4KKyAgICAgICAgICAgIDwvcmVwb3J0cz4KKyAgICAgICAgICA8L3JlcG9ydFNldD4KKyAgICAgICAgPC9yZXBvcnRTZXRzPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8YWRkaXRpb25hbEpPcHRpb24+LVhkb2NsaW50Oi1taXNzaW5nPC9hZGRpdGlvbmFsSk9wdGlvbj4KKyAgICAgICAgPC9jb25maWd1cmF0aW9uPgogICAgICAgPC9wbHVnaW4+CiAgICAgICA8cGx1Z2luPgogICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CkBAIC02MTksNiArNTc4LDI0IEBACiAgICAgICAgICAgPC9yZXBvcnRzRGlyZWN0b3JpZXM+CiAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KICAgICAgIDwvcGx1Z2luPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wcm9qZWN0LWluZm8tcmVwb3J0cy1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuOTwvdmVyc2lvbj4KKyAgICAgICAgPHJlcG9ydFNldHM+CisgICAgICAgICAgPHJlcG9ydFNldD4KKyAgICAgICAgICAgIDxyZXBvcnRzPgorICAgICAgICAgICAgICA8cmVwb3J0PmRlcGVuZGVuY2llczwvcmVwb3J0PgorICAgICAgICAgICAgICA8cmVwb3J0PnByb2plY3QtdGVhbTwvcmVwb3J0PgorICAgICAgICAgICAgICA8cmVwb3J0Pm1haWxpbmctbGlzdDwvcmVwb3J0PgorICAgICAgICAgICAgICA8cmVwb3J0PmNpbTwvcmVwb3J0PgorICAgICAgICAgICAgICA8cmVwb3J0Pmlzc3VlLXRyYWNraW5nPC9yZXBvcnQ+CisgICAgICAgICAgICAgIDxyZXBvcnQ+bGljZW5zZTwvcmVwb3J0PgorICAgICAgICAgICAgICA8cmVwb3J0PnNjbTwvcmVwb3J0PgorICAgICAgICAgICAgPC9yZXBvcnRzPgorICAgICAgICAgIDwvcmVwb3J0U2V0PgorICAgICAgICA8L3JlcG9ydFNldHM+CisgICAgICA8L3BsdWdpbj4KICAgICA8L3BsdWdpbnM+CiAgIDwvcmVwb3J0aW5nPgogCkBAIC03NjIsNiArNzM5LDEwNyBAQAogCiAgIDxwcm9maWxlcz4KICAgICA8cHJvZmlsZT4KKyAgICAgIDxpZD5qYXZhYzwvaWQ+CisgICAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4zLjcuMDwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8ZW5jb2Rpbmc+VVRGLTg8L2VuY29kaW5nPgorICAgICAgICAgICAgICA8c291cmNlPjEuODwvc291cmNlPgorICAgICAgICAgICAgICA8dGFyZ2V0PjEuODwvdGFyZ2V0PgorICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgPGlkPmRlZmF1bHQtY29tcGlsZTwvaWQ+CisgICAgICAgICAgICAgICAgPHBoYXNlPmNvbXBpbGU8L3BoYXNlPgorICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgIDxnb2FsPmNvbXBpbGU8L2dvYWw+CisgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+b3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvSW5zZWN1cmVDaXBoZXJGYWN0b3J5LmphdmE8L2luY2x1ZGU+CisgICAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgPGlkPmNvbXBpbGUtd2l0aC1lcnJvcnByb25lPC9pZD4KKyAgICAgICAgICAgICAgICA8cGhhc2U+Y29tcGlsZTwvcGhhc2U+CisgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgPGdvYWw+Y29tcGlsZTwvZ29hbD4KKyAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgPGNvbXBpbGVySWQ+amF2YWMtd2l0aC1lcnJvcnByb25lPC9jb21waWxlcklkPgorICAgICAgICAgICAgICAgICAgPGZvcmNlSmF2YWNDb21waWxlclVzZT50cnVlPC9mb3JjZUphdmFjQ29tcGlsZXJVc2U+CisgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPm9yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0luc2VjdXJlQ2lwaGVyRmFjdG9yeS5qYXZhPC9leGNsdWRlPgorICAgICAgICAgICAgICAgICAgPC9leGNsdWRlcz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLnBsZXh1czwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5wbGV4dXMtY29tcGlsZXItamF2YWM8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi44LjI8L3ZlcnNpb24+CisgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLnBsZXh1czwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5wbGV4dXMtY29tcGlsZXItamF2YWMtZXJyb3Jwcm9uZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjguNDwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgICAgICA8IS0tIG92ZXJyaWRlIHBsZXh1cy1jb21waWxlci1qYXZhYy1lcnJvcnByb25lJ3MgZGVwZW5kZW5jeSBvbgorICAgICAgICAgICAgICAgICAgRXJyb3IgUHJvbmUgd2l0aCB0aGUgbGF0ZXN0IHZlcnNpb24gLS0+CisgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPmNvbS5nb29nbGUuZXJyb3Jwcm9uZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5lcnJvcl9wcm9uZV9jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMy4xPC92ZXJzaW9uPgorICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICA8L2RlcGVuZGVuY2llcz4KKyAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgICAgPC9idWlsZD4KKyAgICA8L3Byb2ZpbGU+CisgICAgPHByb2ZpbGU+CisgICAgICA8aWQ+ZWNqPC9pZD4KKyAgICAgIDxhY3RpdmF0aW9uPgorICAgICAgICA8YWN0aXZlQnlEZWZhdWx0PnRydWU8L2FjdGl2ZUJ5RGVmYXVsdD4KKyAgICAgIDwvYWN0aXZhdGlvbj4KKyAgICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjMuNy4wPC92ZXJzaW9uPgorICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgIDxjb21waWxlcklkPmVjbGlwc2U8L2NvbXBpbGVySWQ+CisgICAgICAgICAgICAgIDxlbmNvZGluZz5VVEYtODwvZW5jb2Rpbmc+CisgICAgICAgICAgICAgIDxzb3VyY2U+MS44PC9zb3VyY2U+CisgICAgICAgICAgICAgIDx0YXJnZXQ+MS44PC90YXJnZXQ+CisgICAgICAgICAgICAgIDwhLS0gUGFzc2luZyBhcmd1bWVudHMgaXMgYSB0cmFpbndyZWNrLCBzZWUgaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9NQ09NUElMRVItMTIzIC0tPgorICAgICAgICAgICAgICA8Y29tcGlsZXJBcmd1bWVudHM+CisgICAgICAgICAgICAgICAgPHByb3BlcnRpZXM+JHtwcm9qZWN0LmJhc2VkaXJ9Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmczwvcHJvcGVydGllcz4KKyAgICAgICAgICAgICAgPC9jb21waWxlckFyZ3VtZW50cz4KKyAgICAgICAgICAgICAgPHNob3dXYXJuaW5ncz50cnVlPC9zaG93V2FybmluZ3M+CisgICAgICAgICAgICAgIDxzaG93RGVwcmVjYXRpb24+dHJ1ZTwvc2hvd0RlcHJlY2F0aW9uPgorICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLnBsZXh1czwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5wbGV4dXMtY29tcGlsZXItZWNsaXBzZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjguNDwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZHQ8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZWNqPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjMuMTMuMTAyPC92ZXJzaW9uPgorICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICA8L2RlcGVuZGVuY2llcz4KKyAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgICAgPC9idWlsZD4KKyAgICA8L3Byb2ZpbGU+CisgICAgPHByb2ZpbGU+CiAgICAgICA8aWQ+c3RhdGljLWNoZWNrczwvaWQ+CiAgICAgICA8YnVpbGQ+CiAgICAgICAgIDxwbHVnaW5zPgo=